diff --git a/.cargo/config.toml b/.cargo/config.toml index 5afa0e94715..0015055659c 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,7 +1,3 @@ [build] # Share one `target` directory at the project root for all Cargo projects and workspaces in smithy-rs target-dir = "target" - -# TODO(https://github.com/awslabs/smithy-rs/issues/2766): The sparse registry config can be removed when upgrading to Rust 1.70 -[registries.crates-io] -protocol = "sparse" diff --git a/.github/scripts/get-or-create-release-branch.sh b/.github/scripts/get-or-create-release-branch.sh index 7dcc87676d0..a0f48b60981 100755 --- a/.github/scripts/get-or-create-release-branch.sh +++ b/.github/scripts/get-or-create-release-branch.sh @@ -14,15 +14,15 @@ set -eux # is the beginning of a new release series. if [ -z "$SEMANTIC_VERSION" ]; then - echo "'SEMANTIC_VERSION' must be populated." - exit 1 + echo "'SEMANTIC_VERSION' must be populated." + exit 1 fi if [ -z "$1" ]; then - echo "You need to specify the path of the file where you want to collect the output" - exit 1 + echo "You need to specify the path of the file where you want to collect the output" + exit 1 else - output_file="$1" + output_file="$1" fi # Split on the dots @@ -31,41 +31,50 @@ major=${version_array[0]} minor=${version_array[1]} patch=${version_array[2]} if [[ "${major}" == "" || "${minor}" == "" || "${patch}" == "" ]]; then - echo "'${SEMANTIC_VERSION}' is not a valid semver tag" - exit 1 + echo "'${SEMANTIC_VERSION}' is not a valid semver tag" + exit 1 fi if [[ $major == 0 ]]; then - branch_name="smithy-rs-release-${major}.${minor}.x" - if [[ $patch == 0 ]]; then - echo "new_release_series=true" >"${output_file}" - fi + branch_name="smithy-rs-release-${major}.${minor}.x" + if [[ $patch == 0 ]]; then + echo "new_release_series=true" >"${output_file}" + fi else - branch_name="smithy-rs-release-${major}.x.y" - if [[ $minor == 0 && $patch == 0 ]]; then - echo "new_release_series=true" >"${output_file}" - fi + branch_name="smithy-rs-release-${major}.x.y" + if [[ $minor == 0 && $patch == 0 ]]; then + echo "new_release_series=true" >"${output_file}" + fi fi if [[ "${DRY_RUN}" == "true" ]]; then - branch_name="${branch_name}-preview" + branch_name="${branch_name}-preview" fi echo "release_branch=${branch_name}" >"${output_file}" -if [[ "${DRY_RUN}" == "true" ]]; then - git push --force origin "HEAD:refs/heads/${branch_name}" -else - commit_sha=$(git rev-parse --short HEAD) - if ! git ls-remote --exit-code --heads origin "${branch_name}"; then - # The release branch does not exist. - # We need to make sure that the commit SHA that we are releasing is on `main`. - git fetch origin main - if git branch --contains "${commit_sha}" | grep main; then - # We can then create the release branch and set the current commit as its tip - git checkout -b "${branch_name}" - git push origin "${branch_name}" - else - echo "You must choose a commit from main to create a new release branch!" - exit 1 - fi +commit_sha=$(git rev-parse --short HEAD) +# the git repo is in a weird state because **main has never been checked out**! +# This prevents the `git branch --contains` from working because there is no _local_ ref for main +git checkout main +git checkout "${commit_sha}" +if ! git ls-remote --exit-code --heads origin "${branch_name}"; then + # The release branch does not exist. + # We need to make sure that the commit SHA that we are releasing is on `main`. + git fetch origin main + echo "Branches: " + git branch --contains "${commit_sha}" + git show origin/main | head -n 1 + if git branch --contains "${commit_sha}" | grep main; then + # We can then create the release branch and set the current commit as its tip + if [[ "${DRY_RUN}" == "true" ]]; then + git push --force origin "HEAD:refs/heads/${branch_name}" + else + git checkout -b "${branch_name}" + git push origin "${branch_name}" fi + else + echo "You must choose a commit from main to create a new release branch!" + exit 1 + fi +else + echo "Patch release ${branch_name} already exists" fi diff --git a/.github/workflows/ci-merge-queue.yml b/.github/workflows/ci-merge-queue.yml index cfad5aab2fa..53a754d5890 100644 --- a/.github/workflows/ci-merge-queue.yml +++ b/.github/workflows/ci-merge-queue.yml @@ -84,7 +84,7 @@ jobs: needs: - save-docker-login-token - acquire-base-image - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' || toJSON(github.event.merge_group) != '{}' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' || toJSON(github.event.merge_group) != '{}' }} uses: ./.github/workflows/ci.yml with: run_sdk_examples: true diff --git a/.github/workflows/ci-pr-forks.yml b/.github/workflows/ci-pr-forks.yml index ad1d291f9a1..719f1c9eabc 100644 --- a/.github/workflows/ci-pr-forks.yml +++ b/.github/workflows/ci-pr-forks.yml @@ -18,7 +18,7 @@ jobs: # it uploads the image as a build artifact for other jobs to download and use. acquire-base-image: name: Acquire Base Image - if: ${{ github.event.pull_request.head.repo.full_name != 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name != 'smithy-lang/smithy-rs' }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -39,7 +39,7 @@ jobs: # Run shared CI after the Docker build image has either been rebuilt or found in ECR ci: needs: acquire-base-image - if: ${{ github.event.pull_request.head.repo.full_name != 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name != 'smithy-lang/smithy-rs' }} uses: ./.github/workflows/ci.yml with: run_sdk_examples: true diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 89d8099519d..6e7b00603fd 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -21,7 +21,7 @@ jobs: # The login password is encrypted with the repo secret DOCKER_LOGIN_TOKEN_PASSPHRASE save-docker-login-token: name: Save a docker login token - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }} outputs: docker-login-password: ${{ steps.set-token.outputs.docker-login-password }} permissions: @@ -51,8 +51,8 @@ jobs: acquire-base-image: name: Acquire Base Image needs: save-docker-login-token - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} - runs-on: ubuntu-latest + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }} + runs-on: smithy_ubuntu-latest_8-core env: ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }} DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }} @@ -86,7 +86,7 @@ jobs: needs: - save-docker-login-token - acquire-base-image - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }} uses: ./.github/workflows/ci.yml with: run_sdk_examples: true @@ -97,7 +97,7 @@ jobs: # The PR bot requires a Docker build image, so make it depend on the `acquire-base-image` job. pr_bot: name: PR Bot - if: ${{ github.event.pull_request.head.repo.full_name == 'awslabs/smithy-rs' }} + if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }} needs: acquire-base-image uses: ./.github/workflows/pull-request-bot.yml with: diff --git a/.github/workflows/ci-tls.yml b/.github/workflows/ci-tls.yml new file mode 100644 index 00000000000..68a88674051 --- /dev/null +++ b/.github/workflows/ci-tls.yml @@ -0,0 +1,81 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# This workflow tests the TLS configuration of the smithy-rs client +# To run on an Ubuntu machine, run each step in this order. +# Each script can be run on your Ubuntu host. +# You will have to install Docker and rustc/cargo manually. + +env: + rust_version: 1.68.2 + +name: Verify client TLS configuration +on: + pull_request: + push: + branches: [main] + +jobs: + verify-tls-config: + name: Verify TLS configuration + runs-on: ubuntu-latest + steps: + - name: Install packages + shell: bash + run: | + sudo apt-get update + sudo apt-get -y install gcc make python3-pip nginx git ruby openjdk-17-jre pkg-config libssl-dev faketime + pip3 install certbuilder crlbuilder + - name: Stop nginx + run: sudo systemctl stop nginx + - name: Checkout smithy-rs + uses: actions/checkout@v3 + with: + path: ./smithy-rs + - name: Checkout trytls + uses: actions/checkout@v3 + with: + repository: ouspg/trytls + path: ./trytls + - name: Checkout badtls + uses: actions/checkout@v3 + with: + repository: wbond/badtls.io + path: ./badtls.io + - name: Checkout badssl + uses: actions/checkout@v3 + with: + repository: chromium/badssl.com + path: ./badssl.com + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.rust_version }} + - name: Build badssl.com + shell: bash + working-directory: badssl.com + env: + DOCKER_BUILDKIT: 1 + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badssl + - name: Build SDK + working-directory: smithy-rs + run: ./gradlew :aws:sdk:assemble -Paws.services=+sts,+sso,+ssooidc + - name: Build trytls + shell: bash + working-directory: trytls + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-trytls + - name: Build badtls.io + working-directory: badtls.io + shell: bash + run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badtls + - name: Update TLS configuration + shell: bash + run: smithy-rs/tools/ci-scripts/configure-tls/update-certs + - name: Build TLS stub + working-directory: smithy-rs/tools/ci-resources/tls-stub + shell: bash + run: cargo build + - name: Test TLS configuration + working-directory: smithy-rs/tools + shell: bash + run: trytls https target/debug/stub diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0cd2c8877b7..c56ec564cfd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ on: required: false env: - rust_version: 1.68.2 + rust_version: 1.70.0 rust_toolchain_components: clippy,rustfmt ENCRYPTED_DOCKER_PASSWORD: ${{ secrets.ENCRYPTED_DOCKER_PASSWORD }} DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }} @@ -84,9 +84,6 @@ jobs: test: - action: check-aws-sdk-adhoc-tests runner: ubuntu-latest - # TODO(enableNewSmithyRuntimeCleanup): Remove `check-aws-sdk-orchestrator-impl` when cleaning up middleware - - action: check-aws-sdk-orchestrator-impl - runner: smithy_ubuntu-latest_8-core - action: check-client-codegen-integration-tests runner: smithy_ubuntu-latest_8-core - action: check-client-codegen-unit-tests @@ -189,6 +186,9 @@ jobs: with: toolchain: ${{ env.rust_version }} components: ${{ env.rust_toolchain_components }} + # To fix OpenSSL not found on Windows: https://github.com/sfackler/rust-openssl/issues/1542 + - run: echo "VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT" | Out-File -FilePath $env:GITHUB_ENV -Append + - run: vcpkg install openssl:x64-windows-static-md - name: Run tests shell: bash run: | diff --git a/.github/workflows/claim-crate-names.yml b/.github/workflows/claim-crate-names.yml index d6e105d45fa..12b7df9fff4 100644 --- a/.github/workflows/claim-crate-names.yml +++ b/.github/workflows/claim-crate-names.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true env: - rust_version: 1.68.2 + rust_version: 1.70.0 name: Claim unpublished crate names on crates.io run-name: ${{ github.workflow }} diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index c597e186c6b..a24f3b3ce64 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -8,7 +8,7 @@ on: name: Update GitHub Pages env: - rust_version: 1.68.2 + rust_version: 1.70.0 # Allow only one doc pages build to run at a time for the entire smithy-rs repo concurrency: @@ -37,7 +37,7 @@ jobs: pushd design &>/dev/null cargo install mdbook - cargo install mdbook-mermaid + cargo install --locked mdbook-mermaid mdbook build --dest-dir ../../output popd &>/dev/null diff --git a/.github/workflows/pull-request-bot.yml b/.github/workflows/pull-request-bot.yml index 28a5c8aea67..ca679a3d2c7 100644 --- a/.github/workflows/pull-request-bot.yml +++ b/.github/workflows/pull-request-bot.yml @@ -28,13 +28,11 @@ concurrency: env: java_version: 11 - rust_version: 1.68.2 rust_toolchain_components: clippy,rustfmt apt_dependencies: libssl-dev gnuplot jq - jobs: generate-diff: - runs-on: ubuntu-latest + runs-on: smithy_ubuntu-latest_8-core name: Generate diff and upload to S3 env: AWS_REGION: us-west-2 @@ -69,7 +67,7 @@ jobs: fi generate-doc-preview: - runs-on: ubuntu-latest + runs-on: smithy_ubuntu-latest_8-core name: Generate rustdoc preview and upload to S3 env: AWS_REGION: us-west-2 @@ -100,14 +98,14 @@ jobs: java-version: ${{ env.java_version }} - uses: dtolnay/rust-toolchain@master with: - toolchain: ${{ env.rust_version }} + toolchain: nightly - name: Generate doc preview id: generate-preview # Only generate three of the smallest services since the doc build can be very large. STS and SSO must be # included since aws-config depends on them. Transcribe Streaming and DynamoDB (paginators/waiters) were chosen # below to stay small while still representing most features. Combined, they are about ~20MB at time of writing. run: | - ./gradlew -Paws.services=+sts,+sso,+transcribestreaming,+dynamodb :aws:sdk:assemble + ./gradlew -Paws.services=+sts,+sso,+ssooidc,+transcribestreaming,+dynamodb :aws:sdk:assemble # Copy the Server runtime crate(s) in cp -r rust-runtime/aws-smithy-http-server rust-runtime/aws-smithy-http-server-python rust-runtime/aws-smithy-http-server-typescript aws/sdk/build/aws-sdk/sdk @@ -120,7 +118,8 @@ jobs: # Add server runtime crates to the workspace sed -i 's/"sdk\/sts",/"sdk\/sts","sdk\/aws-smithy-http-server","sdk\/aws-smithy-http-server-python","sdk\/aws-smithy-http-server-typescript",/' Cargo.toml - cargo doc --no-deps --all-features + RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features --no-deps + popd ./tools/ci-scripts/generate-doc-preview-index.sh ${{ inputs.base_revision }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 41a85393f8e..914ed8b5449 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,36 +10,68 @@ concurrency: cancel-in-progress: true env: - rust_version: 1.68.2 + rust_version: 1.70.0 name: Release smithy-rs -run-name: ${{ github.workflow }} ${{ inputs.semantic_version }} (${{ inputs.commit_sha }}) - ${{ inputs.dry_run && 'Dry run' || 'Production run' }} +run-name: ${{ inputs.dry_run && 'Dry run' || 'Prod run' }} - ${{ github.workflow }} ${{ inputs.stable_semantic_version }}/${{ inputs.unstable_semantic_version }} (${{ inputs.commit_sha }}) on: workflow_dispatch: inputs: commit_sha: description: | - The SHA of the git commit that you want to release. + Commit SHA: The SHA of the git commit that you want to release. You must use the non-abbreviated SHA (e.g. b2318b0 won't work!). required: true type: string - semantic_version: - description: The semver tag that you want to release (e.g. 0.52.1) + stable_semantic_version: + description: | + Stable semantic version: The semver tag that you want to release for stable crates (e.g. 1.0.2) + required: true + type: string + unstable_semantic_version: + description: | + Unstable semantic version: The semver tag that you want to release for unstable crates (e.g. 0.52.1) required: true type: string dry_run: - description: Dry runs will only produce release artifacts, but they will not cut a release tag in GitHub nor publish to crates.io + description: | + Dry run: When selected, it only produces release artifacts, but will not cut a release tag in GitHub or publish to crates.io required: true type: boolean default: true jobs: + check-actor-for-prod-run: + name: Check actor for prod run + if: inputs.dry_run == false + runs-on: ubuntu-latest + env: + ACTOR: ${{ github.actor }} + steps: + - name: Check actor for prod run + run: | + set -e + + if [ "${ACTOR}" != "aws-sdk-rust-ci" ]; then + echo "Error: The current actor is '${ACTOR}' but only 'aws-sdk-rust-ci' is allowed to run a prod release workflow." + exit 1 + fi + + echo "The current actor is 'aws-sdk-rust-ci', continuing with the workflow." + # We'll need to build a base image to work against if: # - a release was kicked off before the image build step triggered by a push to the release branch/main completed # - a dry-run release was kicked off against a feature branch to test automation changes # This job will be a no-op if an image had already been built. acquire-base-image: name: Acquire Base Image + needs: + - check-actor-for-prod-run + # We need `always` here otherwise this job won't run if the previous job has been skipped + # See https://samanpavel.medium.com/github-actions-conditional-job-execution-e6aa363d2867 + if: | + always() && + (needs.check-actor-for-prod-run.result == 'success' || needs.check-actor-for-prod-run.result == 'skipped') runs-on: smithy_ubuntu-latest_16-core steps: - uses: actions/checkout@v3 @@ -92,7 +124,7 @@ jobs: id: branch-push shell: bash env: - SEMANTIC_VERSION: ${{ inputs.semantic_version }} + SEMANTIC_VERSION: ${{ inputs.stable_semantic_version }} DRY_RUN: ${{ inputs.dry_run }} run: | set -e @@ -125,7 +157,7 @@ jobs: uses: ./smithy-rs/.github/actions/docker-build with: action: upgrade-gradle-properties - action-arguments: ${{ inputs.semantic_version }} + action-arguments: ${{ inputs.stable_semantic_version }} ${{ inputs.unstable_semantic_version }} - name: Download all artifacts uses: ./smithy-rs/.github/actions/download-all-artifacts - name: Push gradle.properties changes @@ -133,7 +165,7 @@ jobs: working-directory: upgrade-gradle-properties/smithy-rs shell: bash env: - SEMANTIC_VERSION: ${{ inputs.semantic_version }} + SEMANTIC_VERSION: ${{ inputs.stable_semantic_version }} RELEASE_COMMIT_SHA: ${{ inputs.commit_sha }} RELEASE_BRANCH_NAME: ${{ needs.get-or-create-release-branch.outputs.release_branch }} DRY_RUN: ${{ inputs.dry_run }} @@ -152,7 +184,13 @@ jobs: # to retry a release action execution that failed due to a transient issue. # In that case, we expect the commit to be releasable as-is, i.e. the runtime crate version in gradle.properties # should already be the expected one. - git push origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + if [[ "${DRY_RUN}" == "true" ]]; then + # During dry-runs, "git push" without "--force" can fail if smithy-rs-release-x.y.z-preview is behind + # smithy-rs-release-x.y.z, but that does not matter much during dry-runs. + git push --force origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + else + git push origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + fi echo "commit_sha=$(git rev-parse HEAD)" > $GITHUB_OUTPUT else @@ -193,6 +231,7 @@ jobs: id: push-changelog env: RELEASE_BRANCH_NAME: ${{ needs.upgrade-gradle-properties.outputs.release_branch }} + DRY_RUN: ${{ inputs.dry_run }} run: | if ! git diff-index --quiet HEAD; then echo "Pushing release commits..." @@ -201,7 +240,13 @@ jobs: # to retry a release action execution that failed due to a transient issue. # In that case, we expect the commit to be releasable as-is, i.e. the changelog should have already # been processed. - git push origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + if [[ "${DRY_RUN}" == "true" ]]; then + # During dry-runs, "git push" without "--force" can fail if smithy-rs-release-x.y.z-preview is behind + # smithy-rs-release-x.y.z, but that does not matter much during dry-runs. + git push --force origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + else + git push origin "HEAD:refs/heads/${RELEASE_BRANCH_NAME}" + fi fi echo "commit_sha=$(git rev-parse HEAD)" > $GITHUB_OUTPUT - name: Tag release @@ -232,9 +277,9 @@ jobs: echo "Crates to publish not found!" exit 1 fi - # The following owner list command fails without a valid crates.io auth token echo "Checking cargo auth token..." - cargo owner --list aws-smithy-types + # This version has already been yanked. This command succeeds if we have a token with permission to yank the crate. + cargo yank aws-sigv4 --version 0.55.0 else publisher publish -y --location . fi diff --git a/.github/workflows/update-sdk-next.yml b/.github/workflows/update-sdk-next.yml index 47a3af62217..5de480ab41a 100644 --- a/.github/workflows/update-sdk-next.yml +++ b/.github/workflows/update-sdk-next.yml @@ -1,8 +1,21 @@ # This workflow updates the `next` branch with freshly generated # code from the latest smithy-rs and models that reside in aws-sdk-rust. + +# Allow only one release to run at a time +concurrency: + group: update-aws-sdk-next + cancel-in-progress: true + name: Update `aws-sdk-rust/next` on: workflow_dispatch: + inputs: + generate_ref: + description: | + Which branch/commit/tag of smithy-rs to use to generate aws-sdk-rust/next. Defaults to `main`. + required: true + type: string + default: main jobs: update-next: @@ -12,8 +25,8 @@ jobs: - name: Check out `smithy-rs` uses: actions/checkout@v3 with: - repository: awslabs/smithy-rs - ref: main + repository: smithy-lang/smithy-rs + ref: ${{ inputs.generate_ref }} path: smithy-rs - name: Check out `aws-sdk-rust` uses: actions/checkout@v3 @@ -32,7 +45,7 @@ jobs: - name: Set up Rust uses: dtolnay/rust-toolchain@master with: - toolchain: 1.68.2 + toolchain: 1.70.0 - name: Delete old SDK run: | - name: Generate a fresh SDK diff --git a/.gitignore b/.gitignore index 268344ecb12..aad300982ae 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ target/ # IDEs .idea/ +.vscode/ .project .settings .classpath diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cce6e263271..16924be2112 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,6 +6,16 @@ repos: - id: end-of-file-fixer exclude: ^aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/ - id: trailing-whitespace +- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks + rev: v2.11.0 + hooks: + - id: pretty-format-kotlin + args: [--autofix, --ktlint-version, 0.48.2] + - id: pretty-format-yaml + args: [--autofix, --indent, '2'] + - id: pretty-format-rust + entry: rustfmt --edition 2021 + files: ^.*\.rs$ - repo: local hooks: - id: kotlin-block-quotes @@ -13,19 +23,9 @@ repos: entry: ./.pre-commit-hooks/kotlin-block-quotes.py language: python files: ^.*\.kt$ - - id: license-header-check - name: License Header Check - entry: ./.pre-commit-hooks/license-header.sh + - id: sdk-lints-check + name: sdk-lints + entry: ./.pre-commit-hooks/sdk-lints.sh language: system files: ^.*$ pass_filenames: false -- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks - rev: v2.6.0 - hooks: - - id: pretty-format-kotlin - args: [--autofix, --ktlint-version, 0.48.2] - - id: pretty-format-yaml - args: [--autofix, --indent, '2'] - - id: pretty-format-rust - entry: rustfmt --edition 2021 - files: ^.*\.rs$ diff --git a/.pre-commit-hooks/license-header.sh b/.pre-commit-hooks/sdk-lints.sh similarity index 81% rename from .pre-commit-hooks/license-header.sh rename to .pre-commit-hooks/sdk-lints.sh index 653320a98e2..2eba2a21d56 100755 --- a/.pre-commit-hooks/license-header.sh +++ b/.pre-commit-hooks/sdk-lints.sh @@ -1,9 +1,8 @@ #!/bin/bash -set -e - # # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 # -cd "$(git rev-parse --show-toplevel)/tools/ci-build/sdk-lints" && cargo run -- check --license --changelog +set -e +cd "$(git rev-parse --show-toplevel)/tools/ci-build/sdk-lints" && cargo run -- check --all diff --git a/CHANGELOG.md b/CHANGELOG.md index 495ef2143fd..86150e6ba43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,40 +1,685 @@ +December 1st, 2023 +================== +**New this release:** +- (client, [smithy-rs#3278](https://github.com/smithy-lang/smithy-rs/issues/3278)) `RuntimeComponentsBuilder::push_identity_resolver` is now deprecated since it does not replace the existing identity resolver of a given auth scheme ID. Use `RuntimeComponentsBuilder::set_identity_resolver` instead. + + +November 27th, 2023 +=================== +**New this release:** +- (client, [aws-sdk-rust#738](https://github.com/awslabs/aws-sdk-rust/issues/738), [aws-sdk-rust#858](https://github.com/awslabs/aws-sdk-rust/issues/858)) Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream) + + +November 26th, 2023 +=================== + +November 25th, 2023 +=================== + +November 21st, 2023 +=================== +**Internal changes only with this release** + + +November 17th, 2023 +=================== +**Breaking Changes:** +- :warning::tada: (client, [smithy-rs#3202](https://github.com/smithy-lang/smithy-rs/issues/3202)) Add configurable stalled-stream protection for downloads. + + When making HTTP calls, + it's possible for a connection to 'stall out' and emit no more data due to server-side issues. + In the event this happens, it's desirable for the stream to error out as quickly as possible. + While timeouts can protect you from this issue, they aren't adaptive to the amount of data + being sent and so must be configured specifically for each use case. When enabled, stalled-stream + protection will ensure that bad streams error out quickly, regardless of the amount of data being + downloaded. + + Protection is enabled by default for all clients but can be configured or disabled. + See [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details. +- :warning: (client, [smithy-rs#3222](https://github.com/smithy-lang/smithy-rs/issues/3222)) Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations + were ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See + the [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details. +- :warning: (all, [smithy-rs#3236](https://github.com/smithy-lang/smithy-rs/issues/3236)) Conversions for HTTP request in aws-smithy-runtime-api are now feature gated behind the `http-02x` feature + +**New this release:** +- :tada: (all, [smithy-rs#3183](https://github.com/smithy-lang/smithy-rs/issues/3183), @HakanVardarr) Add `Display` impl for `DateTime`. +- :bug: (client, [smithy-rs#3229](https://github.com/smithy-lang/smithy-rs/issues/3229), [aws-sdk-rust#960](https://github.com/awslabs/aws-sdk-rust/issues/960)) Prevent multiplication overflow in backoff computation +- (client, [smithy-rs#3226](https://github.com/smithy-lang/smithy-rs/issues/3226)) Types/functions that were previously `#[doc(hidden)]` in `aws-smithy-async`, `aws-smithy-runtime-api`, `aws-smithy-runtime`, `aws-smithy-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such. + +**Contributors** +Thank you for your contributions! ❤ +- @HakanVardarr ([smithy-rs#3183](https://github.com/smithy-lang/smithy-rs/issues/3183)) + + +November 16th, 2023 +=================== +**Breaking Changes:** +- :warning: (client, [smithy-rs#3205](https://github.com/smithy-lang/smithy-rs/issues/3205)) SignableRequest::apply_to_request in aws_sigv4 has been renamed `apply_to_request_http0x` + + +November 15th, 2023 +=================== +**Breaking Changes:** +- :warning: (all, [smithy-rs#3138](https://github.com/smithy-lang/smithy-rs/issues/3138), [smithy-rs#3148](https://github.com/smithy-lang/smithy-rs/issues/3148)) [Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/smithy-rs/discussions/3154). HTTP request types moved, and a new HTTP response type was added. +- :warning: (all, [smithy-rs#3139](https://github.com/smithy-lang/smithy-rs/issues/3139)) `Message`, `Header`, `HeaderValue`, and `StrBytes` have been moved to `aws-smithy-types` from `aws-smithy-eventstream`. `Message::read_from` and `Message::write_to` remain in `aws-smithy-eventstream` but they are converted to free functions with the names `read_message_from` and `write_message_to` respectively. +- :warning: (client, [smithy-rs#3100](https://github.com/smithy-lang/smithy-rs/issues/3100), [smithy-rs#3114](https://github.com/smithy-lang/smithy-rs/issues/3114)) An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv). +- :warning: (all, [smithy-rs#3151](https://github.com/smithy-lang/smithy-rs/issues/3151)) Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client. + + ```rust + async fn example() { + // when creating a client + let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..)..build()); + } + ``` +- :warning: (client, [smithy-rs#3189](https://github.com/smithy-lang/smithy-rs/issues/3189)) Remove deprecated error kind type aliases. +- :warning: (client, [smithy-rs#3191](https://github.com/smithy-lang/smithy-rs/issues/3191)) Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you + might have: + ```rust + match service_error.err() { + GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } + GetStorageError::Unhandled(unhandled) if unhandled.code() == Some("SomeUnmodeledErrorCode") { + // unhandled error handling + } + _ => { /* ... */ } + } + ``` + It should now look as follows: + ```rust + match service_error.err() { + GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ } + err if err.code() == Some("SomeUnmodeledErrorCode") { + // unhandled error handling + } + _ => { /* ... */ } + } + ``` + The `Unhandled` variant should never be referenced directly. + +**New this release:** +- :tada: (client, [aws-sdk-rust#780](https://github.com/awslabs/aws-sdk-rust/issues/780), [smithy-rs#3189](https://github.com/smithy-lang/smithy-rs/issues/3189)) Add `ProvideErrorMetadata` impl for service `Error` type. +- :bug: (client, [smithy-rs#3182](https://github.com/smithy-lang/smithy-rs/issues/3182), @codypenta) Fix rendering of @error structs when fields have default values + +**Contributors** +Thank you for your contributions! ❤ +- @codypenta ([smithy-rs#3182](https://github.com/smithy-lang/smithy-rs/issues/3182)) + + +November 1st, 2023 +================== +**New this release:** +- (client, [smithy-rs#3112](https://github.com/smithy-lang/smithy-rs/issues/3112), [smithy-rs#3116](https://github.com/smithy-lang/smithy-rs/issues/3116)) Upgrade `ring` to 0.17.5. + + +October 31st, 2023 +================== +**Breaking Changes:** +- :warning::tada: (client, [smithy-rs#2417](https://github.com/smithy-lang/smithy-rs/issues/2417), [smithy-rs#3018](https://github.com/smithy-lang/smithy-rs/issues/3018)) Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers. + + For more information, see the [guide](https://github.com/smithy-lang/smithy-rs/discussions/3050). +- :warning: (client, [smithy-rs#3011](https://github.com/smithy-lang/smithy-rs/issues/3011)) HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3022) for details. +- :warning: (client, [smithy-rs#3038](https://github.com/smithy-lang/smithy-rs/issues/3038)) The `enableNewSmithyRuntime: middleware` opt-out flag in smithy-build.json has been removed and no longer opts out of the client orchestrator implementation. Middleware is no longer supported. If you haven't already upgraded to the orchestrator, see [the guide](https://github.com/smithy-lang/smithy-rs/discussions/2887). +- :warning: (client, [smithy-rs#2909](https://github.com/smithy-lang/smithy-rs/issues/2909)) It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method. +- :warning: (all, [smithy-rs#2948](https://github.com/smithy-lang/smithy-rs/issues/2948)) Update MSRV to Rust 1.70.0 +- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) `aws_smithy_client::hyper_ext::Adapter` was moved/renamed to `aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector`. +- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) Test connectors moved into `aws_smithy_runtime::client::connectors::test_util` behind the `test-util` feature. +- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) DVR's RecordingConnection and ReplayingConnection were renamed to RecordingConnector and ReplayingConnector respectively. +- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) TestConnection was renamed to EventConnector. +- :warning: (all, [smithy-rs#2973](https://github.com/smithy-lang/smithy-rs/issues/2973)) Remove `once_cell` from public API. +- :warning: (all, [smithy-rs#2995](https://github.com/smithy-lang/smithy-rs/issues/2995)) Structure members with the type `Option>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. This is enabled by default for clients and can be disabled by updating your smithy-build.json with the following setting: + ```json + { + "codegen": { + "flattenCollectionAccessors": false, + ... + } + } + ``` +- :warning: (client, [smithy-rs#2978](https://github.com/smithy-lang/smithy-rs/issues/2978)) The `futures_core::stream::Stream` trait has been removed from public API. `FnStream` only supports `next`, `try_next`, `collect`, and `try_collect` methods. [`TryFlatMap::flat_map`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.TryFlatMap.html#method.flat_map) returns [`PaginationStream`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.PaginationStream.html), which should be preferred to `FnStream` at an interface level. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`. +- :warning: (client, [smithy-rs#2983](https://github.com/smithy-lang/smithy-rs/issues/2983)) The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. +- :warning: (client, [smithy-rs#2997](https://github.com/smithy-lang/smithy-rs/issues/2997)) `StaticUriEndpointResolver`'s `uri` constructor now takes a `String` instead of a `Uri`. +- :warning: (server, [smithy-rs#3038](https://github.com/smithy-lang/smithy-rs/issues/3038)) `SdkError` is no longer re-exported in generated server crates. +- :warning: (client, [smithy-rs#3039](https://github.com/smithy-lang/smithy-rs/issues/3039)) The `customize()` method is now sync and infallible. Remove any `await`s and error handling from it to make things compile again. +- :bug::warning: (all, [smithy-rs#3037](https://github.com/smithy-lang/smithy-rs/issues/3037), [aws-sdk-rust#756](https://github.com/awslabs/aws-sdk-rust/issues/756)) Our algorithm for converting identifiers to `snake_case` has been updated. This may result in a small change for some identifiers, particularly acronyms ending in `s`, e.g. `ACLs`. +- :warning: (client, [smithy-rs#3055](https://github.com/smithy-lang/smithy-rs/issues/3055)) The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively. +- :warning: (client, [smithy-rs#3032](https://github.com/smithy-lang/smithy-rs/issues/3032)) [`EndpointPrefix::new`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/struct.EndpointPrefix.html#method.new) no longer returns `crate::operation::error::BuildError` for an Err variant, instead returns a more specific [`InvalidEndpointError`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/error/struct.InvalidEndpointError.html). +- :warning: (client, [smithy-rs#3061](https://github.com/smithy-lang/smithy-rs/issues/3061)) Lifetimes have been added to the `EndpointResolver` trait. +- :warning: (client, [smithy-rs#3065](https://github.com/smithy-lang/smithy-rs/issues/3065)) Several traits have been renamed from noun form to verb form to be more idiomatic: + - `AuthSchemeOptionResolver` -> `ResolveAuthSchemeOptions` + - `EndpointResolver` -> `ResolveEndpoint` + - `IdentityResolver` -> `ResolveIdentity` + - `Signer` -> `Sign` + - `RequestSerializer` -> `SerializeRequest` + - `ResponseDeserializer` -> `DeserializeResponse` + - `Interceptor` -> `Intercept` +- :warning: (client, [smithy-rs#3059](https://github.com/smithy-lang/smithy-rs/issues/3059)) **This change has [detailed upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3067)**. A summary is below.

The `HttpRequest` type alias now points to `aws-smithy-runtime-api::client::http::Request`. This is a first-party request type to allow us to gracefully support `http = 1.0` when it arrives. Most customer code using this method should be unaffected. `TryFrom`/`TryInto` conversions are provided for `http = 0.2.*`. +- :warning: (client, [smithy-rs#2917](https://github.com/smithy-lang/smithy-rs/issues/2917)) `RuntimeComponents` have been added as an argument to the `IdentityResolver::resolve_identity` trait function. +- :warning: (client, [smithy-rs#3072](https://github.com/smithy-lang/smithy-rs/issues/3072)) The `idempotency_provider` field has been removed from config as a public field. If you need access to this field, it is still available from the context of an interceptor. +- :warning: (client, [smithy-rs#3078](https://github.com/smithy-lang/smithy-rs/issues/3078)) The `config::Builder::endpoint_resolver` method no longer accepts `&'static str`. Use `config::Builder::endpoint_url` instead. +- :warning: (client, [smithy-rs#3043](https://github.com/smithy-lang/smithy-rs/issues/3043), [smithy-rs#3078](https://github.com/smithy-lang/smithy-rs/issues/3078)) **This change has [detailed upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3079).**

The endpoint interfaces from `aws-smithy-http` have been removed. Service-specific endpoint resolver traits have been added. +- :warning: (all, [smithy-rs#3054](https://github.com/smithy-lang/smithy-rs/issues/3054), [smithy-rs#3070](https://github.com/smithy-lang/smithy-rs/issues/3070)) `aws_smithy_http::operation::error::{BuildError, SerializationError}` have been moved to `aws_smithy_types::error::operation::{BuildError, SerializationError}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (all, [smithy-rs#3076](https://github.com/smithy-lang/smithy-rs/issues/3076)) `aws_smithy_http::body::{BoxBody, Error, SdkBody}` have been moved to `aws_smithy_types::body::{BoxBody, Error, SdkBody}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (all, [smithy-rs#3076](https://github.com/smithy-lang/smithy-rs/issues/3076), [smithy-rs#3091](https://github.com/smithy-lang/smithy-rs/issues/3091)) `aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated. +- :warning: (client, [smithy-rs#3077](https://github.com/smithy-lang/smithy-rs/issues/3077)) **Behavior Break!** Identities for auth are now cached by default. See the `Config` builder's `identity_cache()` method docs for an example of how to disable this caching. +- :warning: (all, [smithy-rs#3033](https://github.com/smithy-lang/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/smithy-lang/smithy-rs/issues/3088), [smithy-rs#3101](https://github.com/smithy-lang/smithy-rs/issues/3101)) Publicly exposed types from `http-body` and `hyper` crates within `aws-smithy-types` are now feature-gated. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3089) for details. +- :warning: (all, [smithy-rs#3033](https://github.com/smithy-lang/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/smithy-lang/smithy-rs/issues/3088)) `ByteStream::poll_next` is now feature-gated. You can turn on a cargo feature `byte-stream-poll-next` in `aws-smithy-types` to use it. +- :warning: (client, [smithy-rs#3092](https://github.com/smithy-lang/smithy-rs/issues/3092), [smithy-rs#3093](https://github.com/smithy-lang/smithy-rs/issues/3093)) The [`connection`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/connection/index.html) and [`result`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/result/index.html) modules in `aws-smithy-http` have been moved to `aws-smithy-runtime-api`. Type aliases for all affected pub items, except for a trait, are left in `aws-smithy-http` for backwards compatibility but are deprecated. Due to lack of trait aliases, the moved trait `CreateUnhandledError` needs to be used from `aws-smithy-runtime-api`. +- :bug::warning: (server, [smithy-rs#3095](https://github.com/smithy-lang/smithy-rs/issues/3095), [smithy-rs#3096](https://github.com/smithy-lang/smithy-rs/issues/3096)) Service builder initialization now takes in a `${serviceName}Config` object on which plugins and layers should be registered. The `builder_with_plugins` and `builder_without_plugins` methods on the service builder, as well as the `layer` method on the built service have been deprecated, and will be removed in a future release. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3096) for more details. + +**New this release:** +- :tada: (client, [smithy-rs#2916](https://github.com/smithy-lang/smithy-rs/issues/2916), [smithy-rs#1767](https://github.com/smithy-lang/smithy-rs/issues/1767)) Support for Smithy IDLv2 nullability is now enabled by default. You can maintain the old behavior by setting `nullabilityCheckMode: "CLIENT_ZERO_VALUE_V1" in your codegen config. + For upgrade guidance and more info, see [here](https://github.com/smithy-lang/smithy-rs/discussions/2929). +- :tada: (server, [smithy-rs#3005](https://github.com/smithy-lang/smithy-rs/issues/3005)) Python middleware can set URI. This can be used to route a request to a different handler. +- :tada: (client, [smithy-rs#3071](https://github.com/smithy-lang/smithy-rs/issues/3071)) Clients now have a default async sleep implementation so that one does not need to be specified if you're using Tokio. +- :bug: (client, [smithy-rs#2944](https://github.com/smithy-lang/smithy-rs/issues/2944), [smithy-rs#2951](https://github.com/smithy-lang/smithy-rs/issues/2951)) `CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again. +- :bug: (client, [smithy-rs#2960](https://github.com/smithy-lang/smithy-rs/issues/2960)) Generate a region setter when a model uses SigV4. +- :bug: (all, [smithy-rs#2969](https://github.com/smithy-lang/smithy-rs/issues/2969), [smithy-rs#1896](https://github.com/smithy-lang/smithy-rs/issues/1896)) Fix code generation for union members with the `@httpPayload` trait. +- (client, [smithy-rs#2964](https://github.com/smithy-lang/smithy-rs/issues/2964)) Required members with @contextParam are now treated as client-side required. +- :bug: (client, [smithy-rs#2926](https://github.com/smithy-lang/smithy-rs/issues/2926), [smithy-rs#2972](https://github.com/smithy-lang/smithy-rs/issues/2972)) Fix regression with redacting sensitive HTTP response bodies. +- :bug: (all, [smithy-rs#2831](https://github.com/smithy-lang/smithy-rs/issues/2831), [aws-sdk-rust#818](https://github.com/awslabs/aws-sdk-rust/issues/818)) Omit fractional seconds from `http-date` format. +- :bug: (client, [smithy-rs#2985](https://github.com/smithy-lang/smithy-rs/issues/2985)) Source defaults from the default trait instead of implicitly based on type. This has minimal changes in the generated code. +- (client, [smithy-rs#2996](https://github.com/smithy-lang/smithy-rs/issues/2996)) Produce better docs when items are marked @required +- :bug: (client, [smithy-rs#3034](https://github.com/smithy-lang/smithy-rs/issues/3034), [smithy-rs#3087](https://github.com/smithy-lang/smithy-rs/issues/3087)) Enable custom auth schemes to work by changing the code generated auth options to be set at the client level at `DEFAULTS` priority. + + +August 22nd, 2023 +================= +**Breaking Changes:** +- :bug::warning: (client, [smithy-rs#2931](https://github.com/smithy-lang/smithy-rs/issues/2931), [aws-sdk-rust#875](https://github.com/awslabs/aws-sdk-rust/issues/875)) Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError` when generating code for orchestrator mode, which caused projects to fail to compile when upgrading. + +**New this release:** +- (client, [smithy-rs#2904](https://github.com/smithy-lang/smithy-rs/issues/2904)) `RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exported in generated clients so that implementing a custom interceptor or runtime plugin doens't require directly depending on `aws-smithy-runtime-api`. +- :bug: (client, [smithy-rs#2914](https://github.com/smithy-lang/smithy-rs/issues/2914), [aws-sdk-rust#825](https://github.com/awslabs/aws-sdk-rust/issues/825)) Fix incorrect summary docs for builders +- :bug: (client, [smithy-rs#2934](https://github.com/smithy-lang/smithy-rs/issues/2934), [aws-sdk-rust#872](https://github.com/awslabs/aws-sdk-rust/issues/872)) Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level. +- :bug: (client, [smithy-rs#2935](https://github.com/smithy-lang/smithy-rs/issues/2935)) Fix `SDK::Endpoint` built-in for `@endpointRuleSet`. + + +August 1st, 2023 +================ +**Breaking Changes:** +- ⚠🎉 (server, [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/smithy-lang/smithy-rs/issues/2827), @hlbarber) The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal: + + - A `ServiceShape` trait has been added. + - The `Plugin` trait has been simplified. + - The `HttpMarker` and `ModelMarker` marker traits have been added to better distinguish when plugins run and what they have access to. + - The `Operation` structure has been removed. + - A `Scoped` `Plugin` has been added. + + The `Plugin` trait has now been simplified and the `Operation` struct has been removed. + + ## Addition of `ServiceShape` + + Since the [0.52 release](https://github.com/smithy-lang/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed. + + ```rust + /// Models the [Smithy Operation shape]. + /// + /// [Smithy Operation shape]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#operation + pub trait OperationShape { + /// The ID of the operation. + const ID: ShapeId; + + /// The operation input. + type Input; + /// The operation output. + type Output; + /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error + /// exists. + type Error; + } + ``` + + This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example. + + We continue with this approach and introduce the following trait: + + ```rust + /// Models the [Smithy Service shape]. + /// + /// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html + pub trait ServiceShape { + /// The [`ShapeId`] of the service. + const ID: ShapeId; + + /// The version of the service. + const VERSION: Option<&'static str>; + + /// The [Protocol] applied to this service. + /// + /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html + type Protocol; + + /// An enumeration of all operations contained in this service. + type Operations; + } + ``` + + With the changes to `Plugin`, described below, middleware authors now have access to this information at compile time. + + ## Simplication of the `Plugin` trait + + Previously, + + ```rust + trait Plugin { + type Service; + type Layer; + + fn map(&self, input: Operation) -> Operation; + } + ``` + + modified an `Operation`. + + Now, + + ```rust + trait Plugin { + type Output; + + fn apply(&self, input: T) -> Self::Output; + } + ``` + + maps a `tower::Service` to a `tower::Service`. This is equivalent to `tower::Layer` with two extra type parameters: `Service` and `Operation`, which implement `ServiceShape` and `OperationShape` respectively. + + Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/smithy-lang/smithy-rs/issues/2777) for more context. + + The following middleware setup + + ```rust + pub struct PrintService { + inner: S, + name: &'static str, + } + + impl Service for PrintService + where + S: Service, + { + async fn call(&mut self, req: R) -> Self::Future { + println!("Hi {}", self.name); + self.inner.call(req) + } + } + + pub struct PrintLayer { + name: &'static str, + } + + impl Layer for PrintLayer { + type Service = PrintService; + + fn layer(&self, service: S) -> Self::Service { + PrintService { + inner: service, + name: self.name, + } + } + } + + pub struct PrintPlugin; + + impl Plugin for PrintPlugin + where + Op: OperationShape, + { + type Service = S; + type Layer = Stack; + + fn map(&self, input: Operation) -> Operation { + input.layer(PrintLayer { name: Op::NAME }) + } + } + ``` + + now becomes + + ```rust + pub struct PrintService { + inner: S, + name: &'static str, + } + + impl Service for PrintService + where + S: Service, + { + async fn call(&mut self, req: R) -> Self::Future { + println!("Hi {}", self.name); + self.inner.call(req) + } + } + + pub struct PrintPlugin; + + impl Plugin for PrintPlugin + where + Op: OperationShape, + { + type Output = PrintService; + + fn apply(&self, inner: T) -> Self::Output { + PrintService { inner, name: Op::ID.name() } + } + } + + impl HttpMarker for PrintPlugin { } + ``` + + Alternatively, using the new `ServiceShape`, implemented on `Ser`: + + ```rust + impl Plugin for PrintPlugin + where + Ser: ServiceShape, + { + type Service = PrintService; + + fn apply(&self, inner: T) -> Self::Service { + PrintService { inner, name: Ser::ID.name() } + } + } + ``` + + A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://smithy-lang.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://smithy-lang.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately: + + ```rust + let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plugins */) + /* setters */ + .build() + .unwrap(); + ``` + + To better distinguish when a plugin runs and what it has access to, `Plugin`s now have to additionally implement the `HttpMarker` marker trait, the `ModelMarker` marker trait, or both: + + - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response after it is serialized. + - A model plugin acts on the modeled operation input after it is deserialized, and acts on the modeled operation output or the modeled operation error before it is serialized. + + The motivation behind this change is to simplify the job of middleware authors, separate concerns, accomodate common cases better, and to improve composition internally. + + Because `Plugin` is now closer to `tower::Layer` we have two canonical converters: + + ```rust + use aws_smithy_http_server::plugin::{PluginLayer, LayerPlugin}; + + // Convert from `Layer` to `Plugin` which applies uniformly across all operations + let layer = /* some layer */; + let plugin = PluginLayer(layer); + + // Convert from `Plugin` to `Layer` for some fixed protocol and operation + let plugin = /* some plugin */; + let layer = LayerPlugin::new::(plugin); + ``` + + ## Removal of `PluginPipeline` + + Since plugins now come in two flavors (those marked with `HttpMarker` and those marked with `ModelMarker`) that shouldn't be mixed in a collection of plugins, the primary way of concatenating plugins, `PluginPipeline` has been removed in favor of the `HttpPlugins` and `ModelPlugins` types, which eagerly check that whenever a plugin is pushed, it is of the expected type. + + This worked before, but you wouldn't be able to do apply this collection of plugins anywhere; if you tried to, the compilation error messages would not be very helpful: + + ```rust + use aws_smithy_http_server::plugin::PluginPipeline; + + let pipeline = PluginPipeline::new().push(http_plugin).push(model_plugin); + ``` + + Now collections of plugins must contain plugins of the same flavor: + + ```rust + use aws_smithy_http_server::plugin::{HttpPlugins, ModelPlugins}; + + let http_plugins = HttpPlugins::new() + .push(http_plugin) + // .push(model_plugin) // This fails to compile with a helpful error message. + .push(&http_and_model_plugin); + let model_plugins = ModelPlugins::new() + .push(model_plugin) + .push(&http_and_model_plugin); + ``` + + In the above example, `&http_and_model_plugin` implements both `HttpMarker` and `ModelMarker`, so we can add it to both collections. + + ## Removal of `Operation` + + The `aws_smithy_http_server::operation::Operation` structure has now been removed. Previously, there existed a `{operation_name}_operation` setter on the service builder, which accepted an `Operation`. This allowed users to + + ```rust + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */); + + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_operation(operation) + /* other setters */ + .build() + .unwrap(); + ``` + + to set an operation with a `tower::Service`, and + + ```rust + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */).layer(/* layer */); + let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_handler(/* closure */).layer(/* layer */); + + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_operation(operation) + /* other setters */ + .build() + .unwrap(); + ``` + + to add a `tower::Layer` (acting on HTTP requests/responses post-routing) to a single operation. + + We have seen little adoption of this API and for this reason we have opted instead to introduce a new setter, accepting a `tower::Service`, on the service builder: + + ```rust + let app = PokemonService::builder_without_plugins() + .get_pokemon_species_service(/* tower::Service */) + /* other setters */ + .build() + .unwrap(); + ``` + + Applying a `tower::Layer` to a _subset_ of operations is should now be done through the `Plugin` API via `filter_by_operation_id` + + ```rust + use aws_smithy_http_server::plugin::{PluginLayer, filter_by_operation_name, IdentityPlugin}; + + let plugin = PluginLayer(/* layer */); + let scoped_plugin = filter_by_operation_name(plugin, |id| id == GetPokemonSpecies::ID); + + let app = PokemonService::builder_with_plugins(scoped_plugin, IdentityPlugin) + .get_pokemon_species(/* handler */) + /* other setters */ + .build() + .unwrap(); + ``` + + or the new `Scoped` `Plugin` introduced below. + + # Addition of `Scoped` + + Currently, users can selectively apply a `Plugin` via the `filter_by_operation_id` function + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + // Only apply `plugin` to `CheckHealth` and `GetStorage` operation + let filtered_plugin = filter_by_operation_id(plugin, |name| name == CheckHealth::ID || name == GetStorage::ID); + ``` + + In addition to this, we now provide `Scoped`, which selectively applies a `Plugin` at _compiletime_. Users should prefer this to `filter_by_operation_id` when applicable. + + ```rust + use aws_smithy_http_server::plugin::Scoped; + use pokemon_service_server_sdk::scoped; + + scope! { + /// Includes only the `CheckHealth` and `GetStorage` operation. + struct SomeScope { + includes: [CheckHealth, GetStorage] + } + } + let scoped_plugin = Scoped::new::(plugin); + ``` + +- ⚠ (all, [smithy-rs#2675](https://github.com/smithy-lang/smithy-rs/issues/2675)) Remove native-tls and add a migration guide. +- ⚠ (client, [smithy-rs#2671](https://github.com/smithy-lang/smithy-rs/issues/2671))
+ Breaking change in how event stream signing works (click to expand more details) + + This change will only impact you if you are wiring up their own event stream signing/authentication scheme. If you're using `aws-sig-auth` to use AWS SigV4 event stream signing, then this change will **not** impact you. + + Previously, event stream signing was configured at codegen time by placing a `new_event_stream_signer` method on the `Config`. This function was called at serialization time to connect the signer to the streaming body. Now, instead, a special `DeferredSigner` is wired up at serialization time that relies on a signing implementation to be sent on a channel by the HTTP request signer. To do this, a `DeferredSignerSender` must be pulled out of the property bag, and its `send()` method called with the desired event stream signing implementation. + + See the changes in https://github.com/smithy-lang/smithy-rs/pull/2671 for an example of how this was done for SigV4. +
+- ⚠ (all, [smithy-rs#2673](https://github.com/smithy-lang/smithy-rs/issues/2673)) For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`. +- ⚠ (server, [smithy-rs#2539](https://github.com/smithy-lang/smithy-rs/issues/2539)) Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case. +- ⚠ (client, [smithy-rs#2728](https://github.com/smithy-lang/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/smithy-lang/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`. +- ⚠ (server, [smithy-rs#2676](https://github.com/smithy-lang/smithy-rs/issues/2676), [smithy-rs#2685](https://github.com/smithy-lang/smithy-rs/issues/2685)) Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration +- ⚠ (server, [smithy-rs#2457](https://github.com/smithy-lang/smithy-rs/issues/2457), @hlbarber) Remove `PollError` from an operations `Service::Error`. + + Any [`tower::Service`](https://docs.rs/tower/latest/tower/trait.Service.html) provided to + [`Operation::from_service`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Operation.html#method.from_service) + no longer requires `Service::Error = OperationError`, instead requiring just `Service::Error = Op::Error`. +- ⚠ (client, [smithy-rs#2742](https://github.com/smithy-lang/smithy-rs/issues/2742)) A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it. +- ⚠ (all, [smithy-rs#2893](https://github.com/smithy-lang/smithy-rs/issues/2893)) Update MSRV to Rust 1.69.0 +- ⚠ (server, [smithy-rs#2678](https://github.com/smithy-lang/smithy-rs/issues/2678)) `ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. + `OperationExtension`'s members are replaced by the `ShapeId` and operations' names are now replced by a `ShapeId`. + + Before you had an operation and an absolute name as its `NAME` member. You could apply a plugin only to some selected operation: + + ``` + filter_by_operation_name(plugin, |name| name != Op::ID); + ``` + + Your new filter selects on an operation's absolute name, namespace or name. + + ``` + filter_by_operation_id(plugin, |id| id.name() != Op::ID.name()); + ``` + + The above filter is applied to an operation's name, the one you use to specify the operation in the Smithy model. + + You can filter all operations in a namespace or absolute name: + + ``` + filter_by_operation_id(plugin, |id| id.namespace() != "namespace"); + filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name"); + ``` +- ⚠ (client, [smithy-rs#2758](https://github.com/smithy-lang/smithy-rs/issues/2758)) The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs. +- ⚠ (server, [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), @hlbarber) Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`. + + Previously, we provided `filter_by_operation_id` which filtered `Plugin` application via a predicate over the Shape ID. + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + use pokemon_service_server_sdk::operation_shape::CheckHealth; + + let filtered = filter_by_operation_id(plugin, |name| name != CheckHealth::NAME); + ``` + + This had the problem that the user is unable to exhaustively match over a `&'static str`. To remedy this we have switched to `filter_by_operation` which is a predicate over an enum containing all operations contained in the service. + + ```rust + use aws_smithy_http_server::plugin::filter_by_operation_id; + use pokemon_service_server_sdk::service::Operation; + + let filtered = filter_by_operation(plugin, |op: Operation| op != Operation::CheckHealth); + ``` + + Similarly, `plugin_from_operation_fn` now allows for + + ```rust + use aws_smithy_http_server::plugin::plugin_from_operation_fn; + use pokemon_service_server_sdk::service::Operation; + + fn map(op: Operation, inner: S) -> PrintService { + match op { + Operation::CheckHealth => PrintService { name: op.shape_id().name(), inner }, + Operation::GetPokemonSpecies => PrintService { name: "hello world", inner }, + _ => todo!() + } + } + + let plugin = plugin_from_operation_fn(map); + ``` +- ⚠ (client, [smithy-rs#2783](https://github.com/smithy-lang/smithy-rs/issues/2783)) The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`. +- ⚠ (client, [smithy-rs#2845](https://github.com/smithy-lang/smithy-rs/issues/2845)) `aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`. +- ⚠ (client, [smithy-rs#2848](https://github.com/smithy-lang/smithy-rs/issues/2848)) The implementation `From` for `aws_smithy_http::event_stream::RawMessage` has been removed. +- ⚠ (server, [smithy-rs#2865](https://github.com/smithy-lang/smithy-rs/issues/2865)) The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer. +- ⚠ (client, [smithy-rs#2873](https://github.com/smithy-lang/smithy-rs/issues/2873)) The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets. +- ⚠ (client) The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/smithy-lang/smithy-rs/discussions/2887) to get your code working again. + +**New this release:** +- 🎉 (all, [smithy-rs#2647](https://github.com/smithy-lang/smithy-rs/issues/2647), [smithy-rs#2645](https://github.com/smithy-lang/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/smithy-lang/smithy-rs/issues/2646), [smithy-rs#2616](https://github.com/smithy-lang/smithy-rs/issues/2616), @thomas-k-cameron) Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives +- 🎉 (client, [smithy-rs#2652](https://github.com/smithy-lang/smithy-rs/issues/2652), @thomas-k-cameron) Add a `send_with` function on `-Input` types for sending requests without fluent builders +- (client, [smithy-rs#2791](https://github.com/smithy-lang/smithy-rs/issues/2791), @davidsouther) Add accessors to Builders +- (all, [smithy-rs#2786](https://github.com/smithy-lang/smithy-rs/issues/2786), @yotamofek) Avoid intermediate vec allocations in AggregatedBytes::to_vec. +- 🐛 (server, [smithy-rs#2733](https://github.com/smithy-lang/smithy-rs/issues/2733), @thor-bjorgvinsson) Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation. +- (client, [smithy-rs#2728](https://github.com/smithy-lang/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/smithy-lang/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported. +- 🐛 (client, [smithy-rs#2767](https://github.com/smithy-lang/smithy-rs/issues/2767), @mcmasn-amzn) Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces. +- (client, [smithy-rs#2854](https://github.com/smithy-lang/smithy-rs/issues/2854)) Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible. +- (server, [smithy-rs#2866](https://github.com/smithy-lang/smithy-rs/issues/2866)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered. + Example server error response by a smithy-rs server version 0.52.0 until 0.55.4: + ``` + HTTP/1.1 400 Bad Request + content-type: application/json + x-amzn-errortype: com.example.service#InvalidRequestException + ... + ``` + Example server error response now: + ``` + HTTP/1.1 400 Bad Request + content-type: application/json + x-amzn-errortype: InvalidRequestException + ... + ``` + +**Contributors** +Thank you for your contributions! ❤ +- @davidsouther ([smithy-rs#2791](https://github.com/smithy-lang/smithy-rs/issues/2791)) +- @hlbarber ([smithy-rs#2457](https://github.com/smithy-lang/smithy-rs/issues/2457), [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/smithy-lang/smithy-rs/issues/2827)) +- @mcmasn-amzn ([smithy-rs#2767](https://github.com/smithy-lang/smithy-rs/issues/2767)) +- @thomas-k-cameron ([smithy-rs#2616](https://github.com/smithy-lang/smithy-rs/issues/2616), [smithy-rs#2645](https://github.com/smithy-lang/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/smithy-lang/smithy-rs/issues/2646), [smithy-rs#2647](https://github.com/smithy-lang/smithy-rs/issues/2647), [smithy-rs#2652](https://github.com/smithy-lang/smithy-rs/issues/2652)) +- @thor-bjorgvinsson ([smithy-rs#2733](https://github.com/smithy-lang/smithy-rs/issues/2733)) +- @yotamofek ([smithy-rs#2786](https://github.com/smithy-lang/smithy-rs/issues/2786)) + + May 23rd, 2023 ============== **New this release:** -- (all, [smithy-rs#2612](https://github.com/awslabs/smithy-rs/issues/2612)) The `Debug` implementation for `PropertyBag` now prints a list of the types it contains. This significantly improves debuggability. -- (all, [smithy-rs#2653](https://github.com/awslabs/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/awslabs/smithy-rs/issues/2656), @henriiik) Implement `Ord` and `PartialOrd` for `DateTime`. -- 🐛 (client, [smithy-rs#2696](https://github.com/awslabs/smithy-rs/issues/2696)) Fix compiler errors in generated code when naming shapes after types in the Rust standard library prelude. +- (all, [smithy-rs#2612](https://github.com/smithy-lang/smithy-rs/issues/2612)) The `Debug` implementation for `PropertyBag` now prints a list of the types it contains. This significantly improves debuggability. +- (all, [smithy-rs#2653](https://github.com/smithy-lang/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/smithy-lang/smithy-rs/issues/2656), @henriiik) Implement `Ord` and `PartialOrd` for `DateTime`. +- 🐛 (client, [smithy-rs#2696](https://github.com/smithy-lang/smithy-rs/issues/2696)) Fix compiler errors in generated code when naming shapes after types in the Rust standard library prelude. **Contributors** Thank you for your contributions! ❤ -- @henriiik ([smithy-rs#2653](https://github.com/awslabs/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/awslabs/smithy-rs/issues/2656)) +- @henriiik ([smithy-rs#2653](https://github.com/smithy-lang/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/smithy-lang/smithy-rs/issues/2656)) April 26th, 2023 ================ **Breaking Changes:** -- ⚠ (all, [smithy-rs#2611](https://github.com/awslabs/smithy-rs/issues/2611)) Update MSRV to Rust 1.67.1 +- ⚠ (all, [smithy-rs#2611](https://github.com/smithy-lang/smithy-rs/issues/2611)) Update MSRV to Rust 1.67.1 **New this release:** -- 🎉 (server, [smithy-rs#2540](https://github.com/awslabs/smithy-rs/issues/2540)) Implement layer for servers to handle [ALB health checks](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html). +- 🎉 (server, [smithy-rs#2540](https://github.com/smithy-lang/smithy-rs/issues/2540)) Implement layer for servers to handle [ALB health checks](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html). Take a look at `aws_smithy_http_server::plugin::alb_health_check` to learn about it. -- 🎉 (client, [smithy-rs#2254](https://github.com/awslabs/smithy-rs/issues/2254), @eduardomourar) Clients now compile for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it! -- (server, [smithy-rs#2540](https://github.com/awslabs/smithy-rs/issues/2540)) Implement `PluginPipeline::http_layer` which allows you to apply a `tower::Layer` to all operations. +- 🎉 (client, [smithy-rs#2254](https://github.com/smithy-lang/smithy-rs/issues/2254), @eduardomourar) Clients now compile for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it! +- (server, [smithy-rs#2540](https://github.com/smithy-lang/smithy-rs/issues/2540)) Implement `PluginPipeline::http_layer` which allows you to apply a `tower::Layer` to all operations. - (client, [aws-sdk-rust#784](https://github.com/awslabs/aws-sdk-rust/issues/784), @abusch) Implement std::error::Error#source() properly for the service meta Error enum. -- 🐛 (all, [smithy-rs#2496](https://github.com/awslabs/smithy-rs/issues/2496)) The outputs for event stream operations now implement the `Sync` auto-trait. -- 🐛 (all, [smithy-rs#2495](https://github.com/awslabs/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts. -- 🐛 (client, [smithy-rs#2495](https://github.com/awslabs/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts. -- (client, [smithy-rs#2507](https://github.com/awslabs/smithy-rs/issues/2507)) The `enableNewCrateOrganizationScheme` codegen flag has been removed. If you opted out of the new crate organization scheme, it must be adopted now in order to upgrade (see [the upgrade guidance](https://github.com/awslabs/smithy-rs/discussions/2449) from March 23rd's release). -- (client, [smithy-rs#2534](https://github.com/awslabs/smithy-rs/issues/2534)) `aws_smithy_types::date_time::Format` has been re-exported in service client crates. -- 🐛 (server, [smithy-rs#2582](https://github.com/awslabs/smithy-rs/issues/2582), [smithy-rs#2585](https://github.com/awslabs/smithy-rs/issues/2585)) Fix generation of constrained shapes reaching `@sensitive` shapes -- 🐛 (server, [smithy-rs#2583](https://github.com/awslabs/smithy-rs/issues/2583), [smithy-rs#2584](https://github.com/awslabs/smithy-rs/issues/2584)) Fix server code generation bug affecting constrained shapes bound with `@httpPayload` -- (client, [smithy-rs#2603](https://github.com/awslabs/smithy-rs/issues/2603)) Add a sensitive method to `ParseHttpResponse`. When this returns true, logging of the HTTP response body will be suppressed. +- 🐛 (all, [smithy-rs#2496](https://github.com/smithy-lang/smithy-rs/issues/2496)) The outputs for event stream operations now implement the `Sync` auto-trait. +- 🐛 (all, [smithy-rs#2495](https://github.com/smithy-lang/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts. +- 🐛 (client, [smithy-rs#2495](https://github.com/smithy-lang/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts. +- (client, [smithy-rs#2507](https://github.com/smithy-lang/smithy-rs/issues/2507)) The `enableNewCrateOrganizationScheme` codegen flag has been removed. If you opted out of the new crate organization scheme, it must be adopted now in order to upgrade (see [the upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/2449) from March 23rd's release). +- (client, [smithy-rs#2534](https://github.com/smithy-lang/smithy-rs/issues/2534)) `aws_smithy_types::date_time::Format` has been re-exported in service client crates. +- 🐛 (server, [smithy-rs#2582](https://github.com/smithy-lang/smithy-rs/issues/2582), [smithy-rs#2585](https://github.com/smithy-lang/smithy-rs/issues/2585)) Fix generation of constrained shapes reaching `@sensitive` shapes +- 🐛 (server, [smithy-rs#2583](https://github.com/smithy-lang/smithy-rs/issues/2583), [smithy-rs#2584](https://github.com/smithy-lang/smithy-rs/issues/2584)) Fix server code generation bug affecting constrained shapes bound with `@httpPayload` +- (client, [smithy-rs#2603](https://github.com/smithy-lang/smithy-rs/issues/2603)) Add a sensitive method to `ParseHttpResponse`. When this returns true, logging of the HTTP response body will be suppressed. **Contributors** Thank you for your contributions! ❤ - @abusch ([aws-sdk-rust#784](https://github.com/awslabs/aws-sdk-rust/issues/784)) -- @eduardomourar ([smithy-rs#2254](https://github.com/awslabs/smithy-rs/issues/2254)) +- @eduardomourar ([smithy-rs#2254](https://github.com/smithy-lang/smithy-rs/issues/2254)) April 11th, 2023 @@ -44,10 +689,10 @@ April 11th, 2023 March 23rd, 2023 ================ **Breaking Changes:** -- ⚠🎉 (all, [smithy-rs#2467](https://github.com/awslabs/smithy-rs/issues/2467)) Update MSRV to 1.66.1 -- ⚠ (client, [smithy-rs#76](https://github.com/awslabs/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/awslabs/smithy-rs/issues/2129)) Generic clients no longer expose a `request_id()` function on errors. To get request ID functionality, use the SDK code generator. -- ⚠ (client, [smithy-rs#76](https://github.com/awslabs/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/awslabs/smithy-rs/issues/2129)) The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these. -- ⚠ (client, [smithy-rs#76](https://github.com/awslabs/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/awslabs/smithy-rs/issues/2129), [smithy-rs#2075](https://github.com/awslabs/smithy-rs/issues/2075)) The `*Error` and `*ErrorKind` types have been combined to make error matching simpler. +- ⚠🎉 (all, [smithy-rs#2467](https://github.com/smithy-lang/smithy-rs/issues/2467)) Update MSRV to 1.66.1 +- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) Generic clients no longer expose a `request_id()` function on errors. To get request ID functionality, use the SDK code generator. +- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these. +- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129), [smithy-rs#2075](https://github.com/smithy-lang/smithy-rs/issues/2075)) The `*Error` and `*ErrorKind` types have been combined to make error matching simpler.
Example with S3 **Before:** @@ -95,11 +740,11 @@ March 23rd, 2023 } ```
-- ⚠ (client, [smithy-rs#76](https://github.com/awslabs/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/awslabs/smithy-rs/issues/2129)) `aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`. -- ⚠ (server, [smithy-rs#2436](https://github.com/awslabs/smithy-rs/issues/2436)) Remove unnecessary type parameter `B` from `Upgrade` service. -- 🐛⚠ (server, [smithy-rs#2382](https://github.com/awslabs/smithy-rs/issues/2382)) Smithy members named `send` were previously renamed to `send_value` at codegen time. These will now be called `send` in the generated code. -- ⚠ (client, [smithy-rs#2448](https://github.com/awslabs/smithy-rs/issues/2448)) The modules in generated client crates have been reorganized. See the [Client Crate Reorganization Upgrade Guidance](https://github.com/awslabs/smithy-rs/discussions/2449) to see how to fix your code after this change. -- ⚠ (server, [smithy-rs#2438](https://github.com/awslabs/smithy-rs/issues/2438)) Servers can send the `ServerRequestId` in the response headers. +- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) `aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`. +- ⚠ (server, [smithy-rs#2436](https://github.com/smithy-lang/smithy-rs/issues/2436)) Remove unnecessary type parameter `B` from `Upgrade` service. +- 🐛⚠ (server, [smithy-rs#2382](https://github.com/smithy-lang/smithy-rs/issues/2382)) Smithy members named `send` were previously renamed to `send_value` at codegen time. These will now be called `send` in the generated code. +- ⚠ (client, [smithy-rs#2448](https://github.com/smithy-lang/smithy-rs/issues/2448)) The modules in generated client crates have been reorganized. See the [Client Crate Reorganization Upgrade Guidance](https://github.com/smithy-lang/smithy-rs/discussions/2449) to see how to fix your code after this change. +- ⚠ (server, [smithy-rs#2438](https://github.com/smithy-lang/smithy-rs/issues/2438)) Servers can send the `ServerRequestId` in the response headers. Servers need to create their service using the new layer builder `ServerRequestIdProviderLayer::new_with_response_header`: ``` let app = app @@ -108,7 +753,7 @@ March 23rd, 2023 **New this release:** - 🐛🎉 (client, [aws-sdk-rust#740](https://github.com/awslabs/aws-sdk-rust/issues/740)) Fluent builder methods on the client are now marked as deprecated when the related operation is deprecated. -- 🎉 (all, [smithy-rs#2398](https://github.com/awslabs/smithy-rs/issues/2398)) Add support for the `awsQueryCompatible` trait. This allows services to continue supporting a custom error code (via the `awsQueryError` trait) when the services migrate their protocol from `awsQuery` to `awsJson1_0` annotated with `awsQueryCompatible`. +- 🎉 (all, [smithy-rs#2398](https://github.com/smithy-lang/smithy-rs/issues/2398)) Add support for the `awsQueryCompatible` trait. This allows services to continue supporting a custom error code (via the `awsQueryError` trait) when the services migrate their protocol from `awsQuery` to `awsJson1_0` annotated with `awsQueryCompatible`.
Click to expand for more details... @@ -142,31 +787,31 @@ March 23rd, 2023 }
``` -- 🎉 (client, [smithy-rs#2428](https://github.com/awslabs/smithy-rs/issues/2428), [smithy-rs#2208](https://github.com/awslabs/smithy-rs/issues/2208)) `SdkError` variants can now be constructed for easier unit testing. -- 🐛 (server, [smithy-rs#2441](https://github.com/awslabs/smithy-rs/issues/2441)) Fix `FilterByOperationName` plugin. This previous caused services with this applied to fail to compile due to mismatched bounds. -- (client, [smithy-rs#2437](https://github.com/awslabs/smithy-rs/issues/2437), [aws-sdk-rust#600](https://github.com/awslabs/aws-sdk-rust/issues/600)) Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`. -- 🐛 (all, [smithy-rs#2226](https://github.com/awslabs/smithy-rs/issues/2226)) Fix bug in timestamp format resolution. Prior to this fix, the timestamp format may have been incorrect if set on the target instead of on the member. -- (all, [smithy-rs#2226](https://github.com/awslabs/smithy-rs/issues/2226)) Add support for offsets when parsing datetimes. RFC3339 date times now support offsets like `-0200` -- (client, [aws-sdk-rust#160](https://github.com/awslabs/aws-sdk-rust/issues/160), [smithy-rs#2445](https://github.com/awslabs/smithy-rs/issues/2445)) Reconnect on transient errors. +- 🎉 (client, [smithy-rs#2428](https://github.com/smithy-lang/smithy-rs/issues/2428), [smithy-rs#2208](https://github.com/smithy-lang/smithy-rs/issues/2208)) `SdkError` variants can now be constructed for easier unit testing. +- 🐛 (server, [smithy-rs#2441](https://github.com/smithy-lang/smithy-rs/issues/2441)) Fix `FilterByOperationName` plugin. This previous caused services with this applied to fail to compile due to mismatched bounds. +- (client, [smithy-rs#2437](https://github.com/smithy-lang/smithy-rs/issues/2437), [aws-sdk-rust#600](https://github.com/awslabs/aws-sdk-rust/issues/600)) Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`. +- 🐛 (all, [smithy-rs#2226](https://github.com/smithy-lang/smithy-rs/issues/2226)) Fix bug in timestamp format resolution. Prior to this fix, the timestamp format may have been incorrect if set on the target instead of on the member. +- (all, [smithy-rs#2226](https://github.com/smithy-lang/smithy-rs/issues/2226)) Add support for offsets when parsing datetimes. RFC3339 date times now support offsets like `-0200` +- (client, [aws-sdk-rust#160](https://github.com/awslabs/aws-sdk-rust/issues/160), [smithy-rs#2445](https://github.com/smithy-lang/smithy-rs/issues/2445)) Reconnect on transient errors. Note: **this behavior is disabled by default for generic clients**. It can be enabled with `aws_smithy_client::Builder::reconnect_on_transient_errors` If a transient error (timeout, 500, 503, 503) is encountered, the connection will be evicted from the pool and will not be reused. -- (all, [smithy-rs#2474](https://github.com/awslabs/smithy-rs/issues/2474)) Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001) +- (all, [smithy-rs#2474](https://github.com/smithy-lang/smithy-rs/issues/2474)) Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001) January 25th, 2023 ================== **New this release:** -- 🐛 (server, [smithy-rs#920](https://github.com/awslabs/smithy-rs/issues/920)) Fix bug in `OperationExtensionFuture`s `Future::poll` implementation +- 🐛 (server, [smithy-rs#920](https://github.com/smithy-lang/smithy-rs/issues/920)) Fix bug in `OperationExtensionFuture`s `Future::poll` implementation January 24th, 2023 ================== **Breaking Changes:** -- ⚠ (server, [smithy-rs#2161](https://github.com/awslabs/smithy-rs/issues/2161)) Remove deprecated service builder, this includes: +- ⚠ (server, [smithy-rs#2161](https://github.com/smithy-lang/smithy-rs/issues/2161)) Remove deprecated service builder, this includes: - Remove `aws_smithy_http_server::routing::Router` and `aws_smithy_http_server::request::RequestParts`. - Move the `aws_smithy_http_server::routers::Router` trait and `aws_smithy_http_server::routing::RoutingService` into `aws_smithy_http_server::routing`. @@ -175,42 +820,42 @@ January 24th, 2023 - `operation_handler.rs` - `server_operation_handler_trait.rs` - If migration to the new service builder API has not already been completed a brief summary of required changes can be seen in [previous release notes](https://github.com/awslabs/smithy-rs/releases/tag/release-2022-12-12) and in API documentation of the root crate. + If migration to the new service builder API has not already been completed a brief summary of required changes can be seen in [previous release notes](https://github.com/smithy-lang/smithy-rs/releases/tag/release-2022-12-12) and in API documentation of the root crate. **New this release:** -- 🐛 (server, [smithy-rs#2213](https://github.com/awslabs/smithy-rs/issues/2213)) `@sparse` list shapes and map shapes with constraint traits and with constrained members are now supported -- 🐛 (server, [smithy-rs#2200](https://github.com/awslabs/smithy-rs/pull/2200)) Event streams no longer generate empty error enums when their operations don’t have modeled errors -- (all, [smithy-rs#2223](https://github.com/awslabs/smithy-rs/issues/2223)) `aws_smithy_types::date_time::DateTime`, `aws_smithy_types::Blob` now implement the `Eq` and `Hash` traits -- (server, [smithy-rs#2223](https://github.com/awslabs/smithy-rs/issues/2223)) Code-generated types for server SDKs now implement the `Eq` and `Hash` traits when possible +- 🐛 (server, [smithy-rs#2213](https://github.com/smithy-lang/smithy-rs/issues/2213)) `@sparse` list shapes and map shapes with constraint traits and with constrained members are now supported +- 🐛 (server, [smithy-rs#2200](https://github.com/smithy-lang/smithy-rs/pull/2200)) Event streams no longer generate empty error enums when their operations don’t have modeled errors +- (all, [smithy-rs#2223](https://github.com/smithy-lang/smithy-rs/issues/2223)) `aws_smithy_types::date_time::DateTime`, `aws_smithy_types::Blob` now implement the `Eq` and `Hash` traits +- (server, [smithy-rs#2223](https://github.com/smithy-lang/smithy-rs/issues/2223)) Code-generated types for server SDKs now implement the `Eq` and `Hash` traits when possible January 12th, 2023 ================== **New this release:** -- 🐛 (server, [smithy-rs#2201](https://github.com/awslabs/smithy-rs/issues/2201)) Fix severe bug where a router fails to deserialize percent-encoded query strings, reporting no operation match when there could be one. If your Smithy model uses an operation with a request URI spec containing [query string literals](https://smithy.io/2.0/spec/http-bindings.html#query-string-literals), you are affected. This fix was released in `aws-smithy-http-server` v0.53.1. +- 🐛 (server, [smithy-rs#2201](https://github.com/smithy-lang/smithy-rs/issues/2201)) Fix severe bug where a router fails to deserialize percent-encoded query strings, reporting no operation match when there could be one. If your Smithy model uses an operation with a request URI spec containing [query string literals](https://smithy.io/2.0/spec/http-bindings.html#query-string-literals), you are affected. This fix was released in `aws-smithy-http-server` v0.53.1. January 11th, 2023 ================== **Breaking Changes:** -- ⚠ (client, [smithy-rs#2099](https://github.com/awslabs/smithy-rs/issues/2099)) The Rust client codegen plugin is now called `rust-client-codegen` instead of `rust-codegen`. Be sure to update your `smithy-build.json` files to refer to the correct plugin name. -- ⚠ (client, [smithy-rs#2099](https://github.com/awslabs/smithy-rs/issues/2099)) Client codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`). -- ⚠ (server, [smithy-rs#2099](https://github.com/awslabs/smithy-rs/issues/2099)) Server codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`). +- ⚠ (client, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) The Rust client codegen plugin is now called `rust-client-codegen` instead of `rust-codegen`. Be sure to update your `smithy-build.json` files to refer to the correct plugin name. +- ⚠ (client, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) Client codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`). +- ⚠ (server, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) Server codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`). **New this release:** -- 🐛 (server, [smithy-rs#2103](https://github.com/awslabs/smithy-rs/issues/2103)) In 0.52, `@length`-constrained collection shapes whose members are not constrained made the server code generator crash. This has been fixed. -- (server, [smithy-rs#1879](https://github.com/awslabs/smithy-rs/issues/1879)) Servers support the `@default` trait: models can specify default values. Default values will be automatically supplied when not manually set. -- (server, [smithy-rs#2131](https://github.com/awslabs/smithy-rs/issues/2131)) The constraint `@length` on non-streaming blob shapes is supported. -- 🐛 (client, [smithy-rs#2150](https://github.com/awslabs/smithy-rs/issues/2150)) Fix bug where string default values were not supported for endpoint parameters -- 🐛 (all, [smithy-rs#2170](https://github.com/awslabs/smithy-rs/issues/2170), [aws-sdk-rust#706](https://github.com/awslabs/aws-sdk-rust/issues/706)) Remove the webpki-roots feature from `hyper-rustls` -- 🐛 (server, [smithy-rs#2054](https://github.com/awslabs/smithy-rs/issues/2054)) Servers can generate a unique request ID and use it in their handlers. +- 🐛 (server, [smithy-rs#2103](https://github.com/smithy-lang/smithy-rs/issues/2103)) In 0.52, `@length`-constrained collection shapes whose members are not constrained made the server code generator crash. This has been fixed. +- (server, [smithy-rs#1879](https://github.com/smithy-lang/smithy-rs/issues/1879)) Servers support the `@default` trait: models can specify default values. Default values will be automatically supplied when not manually set. +- (server, [smithy-rs#2131](https://github.com/smithy-lang/smithy-rs/issues/2131)) The constraint `@length` on non-streaming blob shapes is supported. +- 🐛 (client, [smithy-rs#2150](https://github.com/smithy-lang/smithy-rs/issues/2150)) Fix bug where string default values were not supported for endpoint parameters +- 🐛 (all, [smithy-rs#2170](https://github.com/smithy-lang/smithy-rs/issues/2170), [aws-sdk-rust#706](https://github.com/awslabs/aws-sdk-rust/issues/706)) Remove the webpki-roots feature from `hyper-rustls` +- 🐛 (server, [smithy-rs#2054](https://github.com/smithy-lang/smithy-rs/issues/2054)) Servers can generate a unique request ID and use it in their handlers. December 12th, 2022 =================== **Breaking Changes:** -- ⚠🎉 (all, [smithy-rs#1938](https://github.com/awslabs/smithy-rs/issues/1938), @jjantdev) Upgrade Rust MSRV to 1.62.1 -- ⚠🎉 (server, [smithy-rs#1199](https://github.com/awslabs/smithy-rs/issues/1199), [smithy-rs#1342](https://github.com/awslabs/smithy-rs/issues/1342), [smithy-rs#1401](https://github.com/awslabs/smithy-rs/issues/1401), [smithy-rs#1998](https://github.com/awslabs/smithy-rs/issues/1998), [smithy-rs#2005](https://github.com/awslabs/smithy-rs/issues/2005), [smithy-rs#2028](https://github.com/awslabs/smithy-rs/issues/2028), [smithy-rs#2034](https://github.com/awslabs/smithy-rs/issues/2034), [smithy-rs#2036](https://github.com/awslabs/smithy-rs/issues/2036)) [Constraint traits](https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html) in server SDKs are beginning to be supported. The following are now supported: +- ⚠🎉 (all, [smithy-rs#1938](https://github.com/smithy-lang/smithy-rs/issues/1938), @jjantdev) Upgrade Rust MSRV to 1.62.1 +- ⚠🎉 (server, [smithy-rs#1199](https://github.com/smithy-lang/smithy-rs/issues/1199), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1401](https://github.com/smithy-lang/smithy-rs/issues/1401), [smithy-rs#1998](https://github.com/smithy-lang/smithy-rs/issues/1998), [smithy-rs#2005](https://github.com/smithy-lang/smithy-rs/issues/2005), [smithy-rs#2028](https://github.com/smithy-lang/smithy-rs/issues/2028), [smithy-rs#2034](https://github.com/smithy-lang/smithy-rs/issues/2034), [smithy-rs#2036](https://github.com/smithy-lang/smithy-rs/issues/2036)) [Constraint traits](https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html) in server SDKs are beginning to be supported. The following are now supported: * The `length` trait on `string` shapes. * The `length` trait on `map` shapes. @@ -236,7 +881,7 @@ December 12th, 2022 } } ``` -- ⚠🎉 (server, [smithy-rs#1342](https://github.com/awslabs/smithy-rs/issues/1342), [smithy-rs#1119](https://github.com/awslabs/smithy-rs/issues/1119)) Server SDKs now generate "constrained types" for constrained shapes. Constrained types are [newtypes](https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html) that encapsulate the modeled constraints. They constitute a [widespread pattern to guarantee domain invariants](https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/) and promote correctness in your business logic. So, for example, the model: +- ⚠🎉 (server, [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1119](https://github.com/smithy-lang/smithy-rs/issues/1119)) Server SDKs now generate "constrained types" for constrained shapes. Constrained types are [newtypes](https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html) that encapsulate the modeled constraints. They constitute a [widespread pattern to guarantee domain invariants](https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/) and promote correctness in your business logic. So, for example, the model: ```smithy @length(min: 1, max: 69) @@ -252,7 +897,7 @@ December 12th, 2022 A failed attempt to instantiate a constrained type will yield a `ConstraintViolation` error type you may want to handle. This type's API is subject to change. - Constrained types _guarantee_, by virtue of the type system, that your service's operation outputs adhere to the modeled constraints. To learn more about the motivation for constrained types and how they work, see [the RFC](https://github.com/awslabs/smithy-rs/pull/1199). + Constrained types _guarantee_, by virtue of the type system, that your service's operation outputs adhere to the modeled constraints. To learn more about the motivation for constrained types and how they work, see [the RFC](https://github.com/smithy-lang/smithy-rs/pull/1199). If you'd like to opt-out of generating constrained types, you can set `codegen.publicConstrainedTypes` to `false`. Note that if you do, the generated server SDK will still honor your operation input's modeled constraints upon receiving a request, but will not help you in writing business logic code that adheres to the constraints, and _will not prevent you from returning responses containing operation outputs that violate said constraints_. @@ -267,7 +912,7 @@ December 12th, 2022 } } ``` -- 🐛⚠🎉 (server, [smithy-rs#1714](https://github.com/awslabs/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/awslabs/smithy-rs/issues/1342)) Structure builders in server SDKs have undergone significant changes. +- 🐛⚠🎉 (server, [smithy-rs#1714](https://github.com/smithy-lang/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342)) Structure builders in server SDKs have undergone significant changes. The API surface has been reduced. It is now simpler and closely follows what you would get when using the [`derive_builder`](https://docs.rs/derive_builder/latest/derive_builder/) crate: @@ -336,7 +981,7 @@ December 12th, 2022 // (5) Builder type can be fallibly converted to the structure using `TryFrom` or `TryInto`. let _error = Pokemon::try_from(eevee_builder).expect_err("name was not provided"); ``` -- ⚠🎉 (server, [smithy-rs#1620](https://github.com/awslabs/smithy-rs/issues/1620), [smithy-rs#1666](https://github.com/awslabs/smithy-rs/issues/1666), [smithy-rs#1731](https://github.com/awslabs/smithy-rs/issues/1731), [smithy-rs#1736](https://github.com/awslabs/smithy-rs/issues/1736), [smithy-rs#1753](https://github.com/awslabs/smithy-rs/issues/1753), [smithy-rs#1738](https://github.com/awslabs/smithy-rs/issues/1738), [smithy-rs#1782](https://github.com/awslabs/smithy-rs/issues/1782), [smithy-rs#1829](https://github.com/awslabs/smithy-rs/issues/1829), [smithy-rs#1837](https://github.com/awslabs/smithy-rs/issues/1837), [smithy-rs#1891](https://github.com/awslabs/smithy-rs/issues/1891), [smithy-rs#1840](https://github.com/awslabs/smithy-rs/issues/1840), [smithy-rs#1844](https://github.com/awslabs/smithy-rs/issues/1844), [smithy-rs#1858](https://github.com/awslabs/smithy-rs/issues/1858), [smithy-rs#1930](https://github.com/awslabs/smithy-rs/issues/1930), [smithy-rs#1999](https://github.com/awslabs/smithy-rs/issues/1999), [smithy-rs#2003](https://github.com/awslabs/smithy-rs/issues/2003), [smithy-rs#2008](https://github.com/awslabs/smithy-rs/issues/2008), [smithy-rs#2010](https://github.com/awslabs/smithy-rs/issues/2010), [smithy-rs#2019](https://github.com/awslabs/smithy-rs/issues/2019), [smithy-rs#2020](https://github.com/awslabs/smithy-rs/issues/2020), [smithy-rs#2021](https://github.com/awslabs/smithy-rs/issues/2021), [smithy-rs#2038](https://github.com/awslabs/smithy-rs/issues/2038), [smithy-rs#2039](https://github.com/awslabs/smithy-rs/issues/2039), [smithy-rs#2041](https://github.com/awslabs/smithy-rs/issues/2041)) ### Plugins/New Service Builder API +- ⚠🎉 (server, [smithy-rs#1620](https://github.com/smithy-lang/smithy-rs/issues/1620), [smithy-rs#1666](https://github.com/smithy-lang/smithy-rs/issues/1666), [smithy-rs#1731](https://github.com/smithy-lang/smithy-rs/issues/1731), [smithy-rs#1736](https://github.com/smithy-lang/smithy-rs/issues/1736), [smithy-rs#1753](https://github.com/smithy-lang/smithy-rs/issues/1753), [smithy-rs#1738](https://github.com/smithy-lang/smithy-rs/issues/1738), [smithy-rs#1782](https://github.com/smithy-lang/smithy-rs/issues/1782), [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829), [smithy-rs#1837](https://github.com/smithy-lang/smithy-rs/issues/1837), [smithy-rs#1891](https://github.com/smithy-lang/smithy-rs/issues/1891), [smithy-rs#1840](https://github.com/smithy-lang/smithy-rs/issues/1840), [smithy-rs#1844](https://github.com/smithy-lang/smithy-rs/issues/1844), [smithy-rs#1858](https://github.com/smithy-lang/smithy-rs/issues/1858), [smithy-rs#1930](https://github.com/smithy-lang/smithy-rs/issues/1930), [smithy-rs#1999](https://github.com/smithy-lang/smithy-rs/issues/1999), [smithy-rs#2003](https://github.com/smithy-lang/smithy-rs/issues/2003), [smithy-rs#2008](https://github.com/smithy-lang/smithy-rs/issues/2008), [smithy-rs#2010](https://github.com/smithy-lang/smithy-rs/issues/2010), [smithy-rs#2019](https://github.com/smithy-lang/smithy-rs/issues/2019), [smithy-rs#2020](https://github.com/smithy-lang/smithy-rs/issues/2020), [smithy-rs#2021](https://github.com/smithy-lang/smithy-rs/issues/2021), [smithy-rs#2038](https://github.com/smithy-lang/smithy-rs/issues/2038), [smithy-rs#2039](https://github.com/smithy-lang/smithy-rs/issues/2039), [smithy-rs#2041](https://github.com/smithy-lang/smithy-rs/issues/2041)) ### Plugins/New Service Builder API The `Router` struct has been replaced by a new `Service` located at the root of the generated crate. Its name coincides with the same name as the Smithy service you are generating. @@ -344,7 +989,7 @@ December 12th, 2022 use pokemon_service_server_sdk::PokemonService; ``` - The new service builder infrastructure comes with a `Plugin` system which supports middleware on `smithy-rs`. See the [mididleware documentation](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/middleware.md) and the [API documentation](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/plugin/index.html) for more details. + The new service builder infrastructure comes with a `Plugin` system which supports middleware on `smithy-rs`. See the [mididleware documentation](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/middleware.md) and the [API documentation](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/plugin/index.html) for more details. Usage of the new service builder API: @@ -392,28 +1037,28 @@ December 12th, 2022 In addition to the [`ConnectInfo`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/connect_info/struct.ConnectInfo.html) extractor, we also have added [lambda extractors](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/lambda/index.html) which are feature gated with `aws-lambda`. - [`FromParts` documentation](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/from_parts.md) has been added. + [`FromParts` documentation](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md) has been added. ### New Documentation - New sections to have been added to the [server side of the book](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/overview.md). + New sections to have been added to the [server side of the book](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/overview.md). These include: - - [Middleware](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/middleware.md) - - [Accessing Un-modelled Data](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/from_parts.md) - - [Anatomy of a Service](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/anatomy.md) + - [Middleware](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/middleware.md) + - [Accessing Un-modelled Data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md) + - [Anatomy of a Service](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/anatomy.md) This release also introduces extensive documentation at the root of the generated crate. For best results compile documentation with `cargo +nightly doc --open`. ### Deprecations The existing service builder infrastructure, `OperationRegistryBuilder`/`OperationRegistry`/`Router`, is now deprecated. Customers should migrate to the newer scheme described above. The deprecated types will be removed in a future release. -- ⚠ (client, [smithy-rs#1875](https://github.com/awslabs/smithy-rs/issues/1875)) Replace bool with enum for a function parameter of `label::fmt_string`. -- ⚠ (all, [smithy-rs#1980](https://github.com/awslabs/smithy-rs/issues/1980)) aws_smithy_types_convert::date_time::DateTimeExt::to_chrono_utc returns a Result<> -- ⚠ (client, [smithy-rs#1926](https://github.com/awslabs/smithy-rs/issues/1926), [smithy-rs#1819](https://github.com/awslabs/smithy-rs/issues/1819)) Several breaking changes have been made to errors. See [the upgrade guide](https://github.com/awslabs/smithy-rs/issues/1950) for more information. -- 🐛⚠ (server, [smithy-rs#1714](https://github.com/awslabs/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/awslabs/smithy-rs/issues/1342), [smithy-rs#1860](https://github.com/awslabs/smithy-rs/issues/1860)) Server SDKs now correctly reject operation inputs that don't set values for `required` structure members. Previously, in some scenarios, server SDKs would accept the request and set a default value for the member (e.g. `""` for a `String`), even when the member shape did not have [Smithy IDL v2's `default` trait](https://awslabs.github.io/smithy/2.0/spec/type-refinement-traits.html#smithy-api-default-trait) attached. The `default` trait is [still unsupported](https://github.com/awslabs/smithy-rs/issues/1860). -- ⚠ (client, [smithy-rs#1945](https://github.com/awslabs/smithy-rs/issues/1945)) Generate enums that guide the users to write match expressions in a forward-compatible way. +- ⚠ (client, [smithy-rs#1875](https://github.com/smithy-lang/smithy-rs/issues/1875)) Replace bool with enum for a function parameter of `label::fmt_string`. +- ⚠ (all, [smithy-rs#1980](https://github.com/smithy-lang/smithy-rs/issues/1980)) aws_smithy_types_convert::date_time::DateTimeExt::to_chrono_utc returns a Result<> +- ⚠ (client, [smithy-rs#1926](https://github.com/smithy-lang/smithy-rs/issues/1926), [smithy-rs#1819](https://github.com/smithy-lang/smithy-rs/issues/1819)) Several breaking changes have been made to errors. See [the upgrade guide](https://github.com/smithy-lang/smithy-rs/issues/1950) for more information. +- 🐛⚠ (server, [smithy-rs#1714](https://github.com/smithy-lang/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1860](https://github.com/smithy-lang/smithy-rs/issues/1860)) Server SDKs now correctly reject operation inputs that don't set values for `required` structure members. Previously, in some scenarios, server SDKs would accept the request and set a default value for the member (e.g. `""` for a `String`), even when the member shape did not have [Smithy IDL v2's `default` trait](https://awslabs.github.io/smithy/2.0/spec/type-refinement-traits.html#smithy-api-default-trait) attached. The `default` trait is [still unsupported](https://github.com/smithy-lang/smithy-rs/issues/1860). +- ⚠ (client, [smithy-rs#1945](https://github.com/smithy-lang/smithy-rs/issues/1945)) Generate enums that guide the users to write match expressions in a forward-compatible way. Before this change, users could write a match expression against an enum in a non-forward-compatible way: ```rust match some_enum { @@ -434,10 +1079,10 @@ December 12th, 2022 } ``` This is forward-compatible because the execution will hit the second last match arm regardless of whether the enum defines `SomeEnum::NewVariant` or not. -- ⚠ (client, [smithy-rs#1984](https://github.com/awslabs/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/awslabs/smithy-rs/issues/1496)) Functions on `aws_smithy_http::endpoint::Endpoint` now return a `Result` instead of panicking. -- ⚠ (client, [smithy-rs#1984](https://github.com/awslabs/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/awslabs/smithy-rs/issues/1496)) `Endpoint::mutable` now takes `impl AsRef` instead of `Uri`. For the old functionality, use `Endpoint::mutable_uri`. -- ⚠ (client, [smithy-rs#1984](https://github.com/awslabs/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/awslabs/smithy-rs/issues/1496)) `Endpoint::immutable` now takes `impl AsRef` instead of `Uri`. For the old functionality, use `Endpoint::immutable_uri`. -- ⚠ (server, [smithy-rs#1982](https://github.com/awslabs/smithy-rs/issues/1982)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize the [full shape ID](https://smithy.io/2.0/spec/model.html#shape-id) (including namespace) in operation error responses. +- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) Functions on `aws_smithy_http::endpoint::Endpoint` now return a `Result` instead of panicking. +- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) `Endpoint::mutable` now takes `impl AsRef` instead of `Uri`. For the old functionality, use `Endpoint::mutable_uri`. +- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) `Endpoint::immutable` now takes `impl AsRef` instead of `Uri`. For the old functionality, use `Endpoint::immutable_uri`. +- ⚠ (server, [smithy-rs#1982](https://github.com/smithy-lang/smithy-rs/issues/1982)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize the [full shape ID](https://smithy.io/2.0/spec/model.html#shape-id) (including namespace) in operation error responses. Example server error response before: @@ -456,90 +1101,90 @@ December 12th, 2022 x-amzn-errortype: com.example.service#InvalidRequestException ... ``` -- ⚠ (server, [smithy-rs#2035](https://github.com/awslabs/smithy-rs/issues/2035)) All types that are exclusively relevant within the context of an AWS Lambda function are now gated behind the +- ⚠ (server, [smithy-rs#2035](https://github.com/smithy-lang/smithy-rs/issues/2035)) All types that are exclusively relevant within the context of an AWS Lambda function are now gated behind the `aws-lambda` feature flag. This will reduce the number of dependencies (and improve build times) for users that are running their Smithy services in non-serverless environments (e.g. via `hyper`). -- ⚠ (all, [smithy-rs#1983](https://github.com/awslabs/smithy-rs/issues/1983), [smithy-rs#2029](https://github.com/awslabs/smithy-rs/issues/2029)) Implementation of the Debug trait for container shapes now redacts what is printed per the sensitive trait. -- ⚠ (client, [smithy-rs#2065](https://github.com/awslabs/smithy-rs/issues/2065)) `SdkBody` callbacks have been removed. If you were using these, please [file an issue](https://github.com/awslabs/smithy-rs/issues/new) so that we can better understand your use-case and provide the support you need. -- ⚠ (client, [smithy-rs#2063](https://github.com/awslabs/smithy-rs/issues/2063)) Added SmithyEndpointStage which can be used to set an endpoint for smithy-native clients -- ⚠ (all, [smithy-rs#1989](https://github.com/awslabs/smithy-rs/issues/1989)) The Unit type for a Union member is no longer rendered. The serializers and parsers generated now function accordingly in the absence of the inner data associated with the Unit type. +- ⚠ (all, [smithy-rs#1983](https://github.com/smithy-lang/smithy-rs/issues/1983), [smithy-rs#2029](https://github.com/smithy-lang/smithy-rs/issues/2029)) Implementation of the Debug trait for container shapes now redacts what is printed per the sensitive trait. +- ⚠ (client, [smithy-rs#2065](https://github.com/smithy-lang/smithy-rs/issues/2065)) `SdkBody` callbacks have been removed. If you were using these, please [file an issue](https://github.com/smithy-lang/smithy-rs/issues/new) so that we can better understand your use-case and provide the support you need. +- ⚠ (client, [smithy-rs#2063](https://github.com/smithy-lang/smithy-rs/issues/2063)) Added SmithyEndpointStage which can be used to set an endpoint for smithy-native clients +- ⚠ (all, [smithy-rs#1989](https://github.com/smithy-lang/smithy-rs/issues/1989)) The Unit type for a Union member is no longer rendered. The serializers and parsers generated now function accordingly in the absence of the inner data associated with the Unit type. **New this release:** -- 🎉 (all, [smithy-rs#1929](https://github.com/awslabs/smithy-rs/issues/1929)) Upgrade Smithy to v1.26 -- 🎉 (client, [smithy-rs#2044](https://github.com/awslabs/smithy-rs/issues/2044), [smithy-rs#371](https://github.com/awslabs/smithy-rs/issues/371)) Fixed and improved the request `tracing` span hierarchy to improve log messages, profiling, and debuggability. -- 🐛 (all, [smithy-rs#1847](https://github.com/awslabs/smithy-rs/issues/1847)) Support Sigv4 signature generation on PowerPC 32 and 64 bit. This architecture cannot compile `ring`, so the implementation has been updated to rely on `hamc` + `sha2` to achive the same result with broader platform compatibility and higher performance. We also updated the CI which is now running as many tests as possible against i686 and PowerPC 32 and 64 bit. -- 🐛 (server, [smithy-rs#1910](https://github.com/awslabs/smithy-rs/issues/1910)) `aws_smithy_http_server::routing::Router` is exported from the crate root again. This reverts unintentional breakage that was introduced in `aws-smithy-http-server` v0.51.0 only. -- 🐛 (client, [smithy-rs#1903](https://github.com/awslabs/smithy-rs/issues/1903), [smithy-rs#1902](https://github.com/awslabs/smithy-rs/issues/1902)) Fix bug that can cause panics in paginators -- (client, [smithy-rs#1919](https://github.com/awslabs/smithy-rs/issues/1919)) Operation metadata is now added to the property bag before sending requests allowing middlewares to behave +- 🎉 (all, [smithy-rs#1929](https://github.com/smithy-lang/smithy-rs/issues/1929)) Upgrade Smithy to v1.26 +- 🎉 (client, [smithy-rs#2044](https://github.com/smithy-lang/smithy-rs/issues/2044), [smithy-rs#371](https://github.com/smithy-lang/smithy-rs/issues/371)) Fixed and improved the request `tracing` span hierarchy to improve log messages, profiling, and debuggability. +- 🐛 (all, [smithy-rs#1847](https://github.com/smithy-lang/smithy-rs/issues/1847)) Support Sigv4 signature generation on PowerPC 32 and 64 bit. This architecture cannot compile `ring`, so the implementation has been updated to rely on `hamc` + `sha2` to achive the same result with broader platform compatibility and higher performance. We also updated the CI which is now running as many tests as possible against i686 and PowerPC 32 and 64 bit. +- 🐛 (server, [smithy-rs#1910](https://github.com/smithy-lang/smithy-rs/issues/1910)) `aws_smithy_http_server::routing::Router` is exported from the crate root again. This reverts unintentional breakage that was introduced in `aws-smithy-http-server` v0.51.0 only. +- 🐛 (client, [smithy-rs#1903](https://github.com/smithy-lang/smithy-rs/issues/1903), [smithy-rs#1902](https://github.com/smithy-lang/smithy-rs/issues/1902)) Fix bug that can cause panics in paginators +- (client, [smithy-rs#1919](https://github.com/smithy-lang/smithy-rs/issues/1919)) Operation metadata is now added to the property bag before sending requests allowing middlewares to behave differently depending on the operation being sent. -- (all, [smithy-rs#1907](https://github.com/awslabs/smithy-rs/issues/1907)) Fix cargo audit issue on chrono. -- 🐛 (client, [smithy-rs#1957](https://github.com/awslabs/smithy-rs/issues/1957)) It was previously possible to send requests without setting query parameters modeled as required. Doing this may cause a +- (all, [smithy-rs#1907](https://github.com/smithy-lang/smithy-rs/issues/1907)) Fix cargo audit issue on chrono. +- 🐛 (client, [smithy-rs#1957](https://github.com/smithy-lang/smithy-rs/issues/1957)) It was previously possible to send requests without setting query parameters modeled as required. Doing this may cause a service to interpret a request incorrectly instead of just sending back a 400 error. Now, when an operation has query parameters that are marked as required, the omission of those query parameters will cause a BuildError, preventing the invalid operation from being sent. -- (all, [smithy-rs#1972](https://github.com/awslabs/smithy-rs/issues/1972)) Upgrade to Smithy 1.26.2 -- (all, [smithy-rs#2011](https://github.com/awslabs/smithy-rs/issues/2011), @lsr0) Make generated enum `values()` functions callable in const contexts. -- (client, [smithy-rs#2064](https://github.com/awslabs/smithy-rs/issues/2064), [aws-sdk-rust#632](https://github.com/awslabs/aws-sdk-rust/issues/632)) Clients now default max idle connections to 70 (previously unlimited) to reduce the likelihood of hitting max file handles in AWS Lambda. -- (client, [smithy-rs#2057](https://github.com/awslabs/smithy-rs/issues/2057), [smithy-rs#371](https://github.com/awslabs/smithy-rs/issues/371)) Add more `tracing` events to signing and event streams +- (all, [smithy-rs#1972](https://github.com/smithy-lang/smithy-rs/issues/1972)) Upgrade to Smithy 1.26.2 +- (all, [smithy-rs#2011](https://github.com/smithy-lang/smithy-rs/issues/2011), @lsr0) Make generated enum `values()` functions callable in const contexts. +- (client, [smithy-rs#2064](https://github.com/smithy-lang/smithy-rs/issues/2064), [aws-sdk-rust#632](https://github.com/awslabs/aws-sdk-rust/issues/632)) Clients now default max idle connections to 70 (previously unlimited) to reduce the likelihood of hitting max file handles in AWS Lambda. +- (client, [smithy-rs#2057](https://github.com/smithy-lang/smithy-rs/issues/2057), [smithy-rs#371](https://github.com/smithy-lang/smithy-rs/issues/371)) Add more `tracing` events to signing and event streams **Contributors** Thank you for your contributions! ❤ -- @jjantdev ([smithy-rs#1938](https://github.com/awslabs/smithy-rs/issues/1938)) -- @lsr0 ([smithy-rs#2011](https://github.com/awslabs/smithy-rs/issues/2011)) +- @jjantdev ([smithy-rs#1938](https://github.com/smithy-lang/smithy-rs/issues/1938)) +- @lsr0 ([smithy-rs#2011](https://github.com/smithy-lang/smithy-rs/issues/2011)) October 24th, 2022 ================== **Breaking Changes:** -- ⚠ (all, [smithy-rs#1825](https://github.com/awslabs/smithy-rs/issues/1825)) Bump MSRV to be 1.62.0. -- ⚠ (server, [smithy-rs#1825](https://github.com/awslabs/smithy-rs/issues/1825)) Bump pyo3 and pyo3-asyncio from 0.16.x to 0.17.0 for aws-smithy-http-server-python. -- ⚠ (client, [smithy-rs#1811](https://github.com/awslabs/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets. -- ⚠ (server, [smithy-rs#1803](https://github.com/awslabs/smithy-rs/issues/1803)) Mark `operation` and `operation_handler` modules as private in the generated server crate. +- ⚠ (all, [smithy-rs#1825](https://github.com/smithy-lang/smithy-rs/issues/1825)) Bump MSRV to be 1.62.0. +- ⚠ (server, [smithy-rs#1825](https://github.com/smithy-lang/smithy-rs/issues/1825)) Bump pyo3 and pyo3-asyncio from 0.16.x to 0.17.0 for aws-smithy-http-server-python. +- ⚠ (client, [smithy-rs#1811](https://github.com/smithy-lang/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets. +- ⚠ (server, [smithy-rs#1803](https://github.com/smithy-lang/smithy-rs/issues/1803)) Mark `operation` and `operation_handler` modules as private in the generated server crate. Both modules did not contain any public types, therefore there should be no actual breakage when updating. -- ⚠ (client, [smithy-rs#1740](https://github.com/awslabs/smithy-rs/issues/1740), [smithy-rs#256](https://github.com/awslabs/smithy-rs/issues/256)) A large list of breaking changes were made to accomodate default timeouts in the AWS SDK. - See [the smithy-rs upgrade guide](https://github.com/awslabs/smithy-rs/issues/1760) for a full list +- ⚠ (client, [smithy-rs#1740](https://github.com/smithy-lang/smithy-rs/issues/1740), [smithy-rs#256](https://github.com/smithy-lang/smithy-rs/issues/256)) A large list of breaking changes were made to accomodate default timeouts in the AWS SDK. + See [the smithy-rs upgrade guide](https://github.com/smithy-lang/smithy-rs/issues/1760) for a full list of breaking changes and how to resolve them. -- ⚠ (server, [smithy-rs#1829](https://github.com/awslabs/smithy-rs/issues/1829)) Remove `Protocol` enum, removing an obstruction to extending smithy to third-party protocols. -- ⚠ (server, [smithy-rs#1829](https://github.com/awslabs/smithy-rs/issues/1829)) Convert the `protocol` argument on `PyMiddlewares::new` constructor to a type parameter. -- ⚠ (server, [smithy-rs#1753](https://github.com/awslabs/smithy-rs/issues/1753)) `aws_smithy_http_server::routing::Router` is no longer exported from the crate root. This was unintentional breakage that will be reverted in the next release. +- ⚠ (server, [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829)) Remove `Protocol` enum, removing an obstruction to extending smithy to third-party protocols. +- ⚠ (server, [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829)) Convert the `protocol` argument on `PyMiddlewares::new` constructor to a type parameter. +- ⚠ (server, [smithy-rs#1753](https://github.com/smithy-lang/smithy-rs/issues/1753)) `aws_smithy_http_server::routing::Router` is no longer exported from the crate root. This was unintentional breakage that will be reverted in the next release. **New this release:** -- (server, [smithy-rs#1811](https://github.com/awslabs/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets. -- 🐛 (all, [smithy-rs#1802](https://github.com/awslabs/smithy-rs/issues/1802)) Sensitive fields in errors now respect @sensitive trait and are properly redacted. -- (server, [smithy-rs#1727](https://github.com/awslabs/smithy-rs/issues/1727), @GeneralSwiss) Pokémon Service example code now runs clippy during build. -- (server, [smithy-rs#1734](https://github.com/awslabs/smithy-rs/issues/1734)) Implement support for pure Python request middleware. Improve idiomatic logging support over tracing. -- 🐛 (client, [aws-sdk-rust#620](https://github.com/awslabs/aws-sdk-rust/issues/620), [smithy-rs#1748](https://github.com/awslabs/smithy-rs/issues/1748)) Paginators now stop on encountering a duplicate token by default rather than panic. This behavior can be customized by toggling the `stop_on_duplicate_token` property on the paginator before calling `send`. -- 🐛 (all, [smithy-rs#1817](https://github.com/awslabs/smithy-rs/issues/1817), @ethyi) Update aws-types zeroize to flexible version to prevent downstream version conflicts. -- (all, [smithy-rs#1852](https://github.com/awslabs/smithy-rs/issues/1852), @ogudavid) Enable local maven repo dependency override. +- (server, [smithy-rs#1811](https://github.com/smithy-lang/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets. +- 🐛 (all, [smithy-rs#1802](https://github.com/smithy-lang/smithy-rs/issues/1802)) Sensitive fields in errors now respect @sensitive trait and are properly redacted. +- (server, [smithy-rs#1727](https://github.com/smithy-lang/smithy-rs/issues/1727), @GeneralSwiss) Pokémon Service example code now runs clippy during build. +- (server, [smithy-rs#1734](https://github.com/smithy-lang/smithy-rs/issues/1734)) Implement support for pure Python request middleware. Improve idiomatic logging support over tracing. +- 🐛 (client, [aws-sdk-rust#620](https://github.com/awslabs/aws-sdk-rust/issues/620), [smithy-rs#1748](https://github.com/smithy-lang/smithy-rs/issues/1748)) Paginators now stop on encountering a duplicate token by default rather than panic. This behavior can be customized by toggling the `stop_on_duplicate_token` property on the paginator before calling `send`. +- 🐛 (all, [smithy-rs#1817](https://github.com/smithy-lang/smithy-rs/issues/1817), @ethyi) Update aws-types zeroize to flexible version to prevent downstream version conflicts. +- (all, [smithy-rs#1852](https://github.com/smithy-lang/smithy-rs/issues/1852), @ogudavid) Enable local maven repo dependency override. **Contributors** Thank you for your contributions! ❤ -- @GeneralSwiss ([smithy-rs#1727](https://github.com/awslabs/smithy-rs/issues/1727)) -- @ethyi ([smithy-rs#1817](https://github.com/awslabs/smithy-rs/issues/1817)) -- @ogudavid ([smithy-rs#1852](https://github.com/awslabs/smithy-rs/issues/1852)) +- @GeneralSwiss ([smithy-rs#1727](https://github.com/smithy-lang/smithy-rs/issues/1727)) +- @ethyi ([smithy-rs#1817](https://github.com/smithy-lang/smithy-rs/issues/1817)) +- @ogudavid ([smithy-rs#1852](https://github.com/smithy-lang/smithy-rs/issues/1852)) September 20th, 2022 ==================== **Breaking Changes:** -- ⚠ (client, [smithy-rs#1603](https://github.com/awslabs/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) `aws_smithy_types::RetryConfig` no longer implements `Default`, and its `new` function has been replaced with `standard`. -- ⚠ (client, [smithy-rs#1603](https://github.com/awslabs/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) Client creation now panics if retries or timeouts are enabled without an async sleep implementation. +- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) `aws_smithy_types::RetryConfig` no longer implements `Default`, and its `new` function has been replaced with `standard`. +- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) Client creation now panics if retries or timeouts are enabled without an async sleep implementation. If you're using the Tokio runtime and have the `rt-tokio` feature enabled (which is enabled by default), then you shouldn't notice this change at all. Otherwise, if using something other than Tokio as the async runtime, the `AsyncSleep` trait must be implemented, and that implementation given to the config builder via the `sleep_impl` method. Alternatively, retry can be explicitly turned off by setting `max_attempts` to 1, which will result in successful client creation without an async sleep implementation. -- ⚠ (client, [smithy-rs#1603](https://github.com/awslabs/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) The `default_async_sleep` method on the `Client` builder has been removed. The default async sleep is +- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) The `default_async_sleep` method on the `Client` builder has been removed. The default async sleep is wired up by default if none is provided. -- ⚠ (client, [smithy-rs#976](https://github.com/awslabs/smithy-rs/issues/976), [smithy-rs#1710](https://github.com/awslabs/smithy-rs/issues/1710)) Removed the need to generate operation output and retry aliases in codegen. -- ⚠ (client, [smithy-rs#1715](https://github.com/awslabs/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/awslabs/smithy-rs/issues/1717)) `ClassifyResponse` was renamed to `ClassifyRetry` and is no longer implemented for the unit type. -- ⚠ (client, [smithy-rs#1715](https://github.com/awslabs/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/awslabs/smithy-rs/issues/1717)) The `with_retry_policy` and `retry_policy` functions on `aws_smithy_http::operation::Operation` have been +- ⚠ (client, [smithy-rs#976](https://github.com/smithy-lang/smithy-rs/issues/976), [smithy-rs#1710](https://github.com/smithy-lang/smithy-rs/issues/1710)) Removed the need to generate operation output and retry aliases in codegen. +- ⚠ (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) `ClassifyResponse` was renamed to `ClassifyRetry` and is no longer implemented for the unit type. +- ⚠ (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) The `with_retry_policy` and `retry_policy` functions on `aws_smithy_http::operation::Operation` have been renamed to `with_retry_classifier` and `retry_classifier` respectively. Public member `retry_policy` on `aws_smithy_http::operation::Parts` has been renamed to `retry_classifier`. **New this release:** -- 🎉 (client, [smithy-rs#1647](https://github.com/awslabs/smithy-rs/issues/1647), [smithy-rs#1112](https://github.com/awslabs/smithy-rs/issues/1112)) Implemented customizable operations per [RFC-0017](https://awslabs.github.io/smithy-rs/design/rfcs/rfc0017_customizable_client_operations.html). +- 🎉 (client, [smithy-rs#1647](https://github.com/smithy-lang/smithy-rs/issues/1647), [smithy-rs#1112](https://github.com/smithy-lang/smithy-rs/issues/1112)) Implemented customizable operations per [RFC-0017](https://smithy-lang.github.io/smithy-rs/design/rfcs/rfc0017_customizable_client_operations.html). Before this change, modifying operations before sending them required using lower-level APIs: @@ -580,22 +1225,22 @@ September 20th, 2022 .send() .await?; ``` -- (client, [smithy-rs#1735](https://github.com/awslabs/smithy-rs/issues/1735), @vojtechkral) Lower log level of two info-level log messages. -- (all, [smithy-rs#1710](https://github.com/awslabs/smithy-rs/issues/1710)) Added `writable` property to `RustType` and `RuntimeType` that returns them in `Writable` form -- (all, [smithy-rs#1680](https://github.com/awslabs/smithy-rs/issues/1680), @ogudavid) Smithy IDL v2 mixins are now supported -- 🐛 (client, [smithy-rs#1715](https://github.com/awslabs/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/awslabs/smithy-rs/issues/1717)) Generated clients now retry transient errors without replacing the retry policy. -- 🐛 (all, [smithy-rs#1725](https://github.com/awslabs/smithy-rs/issues/1725), @sugmanue) Correctly determine nullability of members in IDLv2 models +- (client, [smithy-rs#1735](https://github.com/smithy-lang/smithy-rs/issues/1735), @vojtechkral) Lower log level of two info-level log messages. +- (all, [smithy-rs#1710](https://github.com/smithy-lang/smithy-rs/issues/1710)) Added `writable` property to `RustType` and `RuntimeType` that returns them in `Writable` form +- (all, [smithy-rs#1680](https://github.com/smithy-lang/smithy-rs/issues/1680), @ogudavid) Smithy IDL v2 mixins are now supported +- 🐛 (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) Generated clients now retry transient errors without replacing the retry policy. +- 🐛 (all, [smithy-rs#1725](https://github.com/smithy-lang/smithy-rs/issues/1725), @sugmanue) Correctly determine nullability of members in IDLv2 models **Contributors** Thank you for your contributions! ❤ -- @ogudavid ([smithy-rs#1680](https://github.com/awslabs/smithy-rs/issues/1680)) -- @sugmanue ([smithy-rs#1725](https://github.com/awslabs/smithy-rs/issues/1725)) -- @vojtechkral ([smithy-rs#1735](https://github.com/awslabs/smithy-rs/issues/1735)) +- @ogudavid ([smithy-rs#1680](https://github.com/smithy-lang/smithy-rs/issues/1680)) +- @sugmanue ([smithy-rs#1725](https://github.com/smithy-lang/smithy-rs/issues/1725)) +- @vojtechkral ([smithy-rs#1735](https://github.com/smithy-lang/smithy-rs/issues/1735)) August 31st, 2022 ================= **Breaking Changes:** -- ⚠🎉 (client, [smithy-rs#1598](https://github.com/awslabs/smithy-rs/issues/1598)) Previously, the config customizations that added functionality related to retry configs, timeout configs, and the +- ⚠🎉 (client, [smithy-rs#1598](https://github.com/smithy-lang/smithy-rs/issues/1598)) Previously, the config customizations that added functionality related to retry configs, timeout configs, and the async sleep impl were defined in the smithy codegen module but were being loaded in the AWS codegen module. They have now been updated to be loaded during smithy codegen. The affected classes are all defined in the `software.amazon.smithy.rust.codegen.smithy.customizations` module of smithy codegen.` This change does not affect @@ -611,7 +1256,7 @@ August 31st, 2022 - `PubUseRetryConfig` is now `PubUseRetryConfigGenerator` - `SleepImplProviderConfig` is now `SleepImplProviderCustomization` - `TimeoutConfigProviderConfig` is now `TimeoutConfigProviderCustomization` -- ⚠🎉 (all, [smithy-rs#1635](https://github.com/awslabs/smithy-rs/issues/1635), [smithy-rs#1416](https://github.com/awslabs/smithy-rs/issues/1416), @weihanglo) Support granular control of specifying runtime crate versions. +- ⚠🎉 (all, [smithy-rs#1635](https://github.com/smithy-lang/smithy-rs/issues/1635), [smithy-rs#1416](https://github.com/smithy-lang/smithy-rs/issues/1416), @weihanglo) Support granular control of specifying runtime crate versions. For code generation, the field `runtimeConfig.version` in smithy-build.json has been removed. The new field `runtimeConfig.versions` is an object whose keys are runtime crate names (e.g. `aws-smithy-http`), @@ -648,12 +1293,12 @@ August 31st, 2022 ``` implies that we're using `aws-smithy-http` 0.47.1 specifically. For the rest of the crates, it will default to 0.47.0. -- ⚠ (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Remove @sensitive trait tests which applied trait to member. The ability to mark members with @sensitive was removed in Smithy 1.22. -- ⚠ (server, [smithy-rs#1544](https://github.com/awslabs/smithy-rs/issues/1544)) Servers now allow requests' ACCEPT header values to be: +- ⚠ (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Remove @sensitive trait tests which applied trait to member. The ability to mark members with @sensitive was removed in Smithy 1.22. +- ⚠ (server, [smithy-rs#1544](https://github.com/smithy-lang/smithy-rs/issues/1544)) Servers now allow requests' ACCEPT header values to be: - `*/*` - `type/*` - `type/subtype` -- 🐛⚠ (all, [smithy-rs#1274](https://github.com/awslabs/smithy-rs/issues/1274)) Lossy converters into integer types for `aws_smithy_types::Number` have been +- 🐛⚠ (all, [smithy-rs#1274](https://github.com/smithy-lang/smithy-rs/issues/1274)) Lossy converters into integer types for `aws_smithy_types::Number` have been removed. Lossy converters into floating point types for `aws_smithy_types::Number` have been suffixed with `_lossy`. If you were directly using the integer lossy converters, we recommend you use the safe @@ -676,33 +1321,33 @@ August 31st, 2022 let bar: u32 = n as u32; // Lossy conversion! } ``` -- ⚠ (all, [smithy-rs#1699](https://github.com/awslabs/smithy-rs/issues/1699)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.58.1 to 1.61.0 per our policy. +- ⚠ (all, [smithy-rs#1699](https://github.com/smithy-lang/smithy-rs/issues/1699)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.58.1 to 1.61.0 per our policy. **New this release:** -- 🎉 (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Update Smithy dependency to 1.23.1. Models using version 2.0 of the IDL are now supported. -- 🎉 (server, [smithy-rs#1551](https://github.com/awslabs/smithy-rs/issues/1551), @hugobast) There is a canonical and easier way to run smithy-rs on Lambda [see example]. - - [see example]: https://github.com/awslabs/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/examples/pokemon-service/src/lambda.rs -- 🐛 (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Fix detecting sensitive members through their target shape having the @sensitive trait applied. -- (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Fix SetShape matching needing to occur before ListShape since it is now a subclass. Sets were deprecated in Smithy 1.22. -- (all, [smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623), @ogudavid) Fix Union shape test data having an invalid empty union. Break fixed from Smithy 1.21 to Smithy 1.22. -- (all, [smithy-rs#1612](https://github.com/awslabs/smithy-rs/issues/1612), @unexge) Add codegen version to generated package metadata +- 🎉 (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Update Smithy dependency to 1.23.1. Models using version 2.0 of the IDL are now supported. +- 🎉 (server, [smithy-rs#1551](https://github.com/smithy-lang/smithy-rs/issues/1551), @hugobast) There is a canonical and easier way to run smithy-rs on Lambda [see example]. + + [see example]: https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/examples/pokemon-service/src/lambda.rs +- 🐛 (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix detecting sensitive members through their target shape having the @sensitive trait applied. +- (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix SetShape matching needing to occur before ListShape since it is now a subclass. Sets were deprecated in Smithy 1.22. +- (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix Union shape test data having an invalid empty union. Break fixed from Smithy 1.21 to Smithy 1.22. +- (all, [smithy-rs#1612](https://github.com/smithy-lang/smithy-rs/issues/1612), @unexge) Add codegen version to generated package metadata - (client, [aws-sdk-rust#609](https://github.com/awslabs/aws-sdk-rust/issues/609)) It is now possible to exempt specific operations from XML body root checking. To do this, add the `AllowInvalidXmlRoot` trait to the output struct of the operation you want to exempt. **Contributors** Thank you for your contributions! ❤ -- @hugobast ([smithy-rs#1551](https://github.com/awslabs/smithy-rs/issues/1551)) -- @ogudavid ([smithy-rs#1623](https://github.com/awslabs/smithy-rs/issues/1623)) -- @unexge ([smithy-rs#1612](https://github.com/awslabs/smithy-rs/issues/1612)) -- @weihanglo ([smithy-rs#1416](https://github.com/awslabs/smithy-rs/issues/1416), [smithy-rs#1635](https://github.com/awslabs/smithy-rs/issues/1635)) +- @hugobast ([smithy-rs#1551](https://github.com/smithy-lang/smithy-rs/issues/1551)) +- @ogudavid ([smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623)) +- @unexge ([smithy-rs#1612](https://github.com/smithy-lang/smithy-rs/issues/1612)) +- @weihanglo ([smithy-rs#1416](https://github.com/smithy-lang/smithy-rs/issues/1416), [smithy-rs#1635](https://github.com/smithy-lang/smithy-rs/issues/1635)) August 4th, 2022 ================ **Breaking Changes:** -- ⚠🎉 (all, [smithy-rs#1570](https://github.com/awslabs/smithy-rs/issues/1570), @weihanglo) Support @deprecated trait for aggregate shapes -- ⚠ (all, [smithy-rs#1157](https://github.com/awslabs/smithy-rs/issues/1157)) Rename EventStreamInput to EventStreamSender -- ⚠ (all, [smithy-rs#1157](https://github.com/awslabs/smithy-rs/issues/1157)) The type of streaming unions that contain errors is generated without those errors. +- ⚠🎉 (all, [smithy-rs#1570](https://github.com/smithy-lang/smithy-rs/issues/1570), @weihanglo) Support @deprecated trait for aggregate shapes +- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) Rename EventStreamInput to EventStreamSender +- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) The type of streaming unions that contain errors is generated without those errors. Errors in a streaming union `Union` are generated as members of the type `UnionError`. Taking Transcribe as an example, the `AudioStream` streaming union generates, in the client, both the `AudioStream` type: ```rust @@ -729,7 +1374,7 @@ August 4th, 2022 Unknown, } ``` -- ⚠ (all, [smithy-rs#1157](https://github.com/awslabs/smithy-rs/issues/1157)) `aws_smithy_http::event_stream::EventStreamSender` and `aws_smithy_http::event_stream::Receiver` are now generic over ``, +- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) `aws_smithy_http::event_stream::EventStreamSender` and `aws_smithy_http::event_stream::Receiver` are now generic over ``, where `T` is a streaming union and `E` the union's errors. This means that event stream errors are now sent as `Err` of the union's error type. With this example model: @@ -747,18 +1392,18 @@ August 4th, 2022 ```rust stream! { yield Err(EventError::ThrottlingError ...) } ``` - An example from the SDK is in [transcribe streaming](https://github.com/awslabs/smithy-rs/blob/4f51dd450ea3234a7faf481c6025597f22f03805/aws/sdk/integration-tests/transcribestreaming/tests/test.rs#L80). + An example from the SDK is in [transcribe streaming](https://github.com/smithy-lang/smithy-rs/blob/4f51dd450ea3234a7faf481c6025597f22f03805/aws/sdk/integration-tests/transcribestreaming/tests/test.rs#L80). **New this release:** -- 🎉 (all, [smithy-rs#1482](https://github.com/awslabs/smithy-rs/issues/1482)) Update codegen to generate support for flexible checksums. -- (all, [smithy-rs#1520](https://github.com/awslabs/smithy-rs/issues/1520)) Add explicit cast during JSON deserialization in case of custom Symbol providers. -- (all, [smithy-rs#1578](https://github.com/awslabs/smithy-rs/issues/1578), @lkts) Change detailed logs in CredentialsProviderChain from info to debug -- (all, [smithy-rs#1573](https://github.com/awslabs/smithy-rs/issues/1573), [smithy-rs#1569](https://github.com/awslabs/smithy-rs/issues/1569)) Non-streaming struct members are now marked `#[doc(hidden)]` since they will be removed in the future +- 🎉 (all, [smithy-rs#1482](https://github.com/smithy-lang/smithy-rs/issues/1482)) Update codegen to generate support for flexible checksums. +- (all, [smithy-rs#1520](https://github.com/smithy-lang/smithy-rs/issues/1520)) Add explicit cast during JSON deserialization in case of custom Symbol providers. +- (all, [smithy-rs#1578](https://github.com/smithy-lang/smithy-rs/issues/1578), @lkts) Change detailed logs in CredentialsProviderChain from info to debug +- (all, [smithy-rs#1573](https://github.com/smithy-lang/smithy-rs/issues/1573), [smithy-rs#1569](https://github.com/smithy-lang/smithy-rs/issues/1569)) Non-streaming struct members are now marked `#[doc(hidden)]` since they will be removed in the future **Contributors** Thank you for your contributions! ❤ -- @lkts ([smithy-rs#1578](https://github.com/awslabs/smithy-rs/issues/1578)) -- @weihanglo ([smithy-rs#1570](https://github.com/awslabs/smithy-rs/issues/1570)) +- @lkts ([smithy-rs#1578](https://github.com/smithy-lang/smithy-rs/issues/1578)) +- @weihanglo ([smithy-rs#1570](https://github.com/smithy-lang/smithy-rs/issues/1570)) July 20th, 2022 =============== @@ -766,14 +1411,14 @@ July 20th, 2022 - 🎉 (all, [aws-sdk-rust#567](https://github.com/awslabs/aws-sdk-rust/issues/567)) Updated the smithy client's retry behavior to allow for a configurable initial backoff. Previously, the initial backoff (named `r` in the code) was set to 2 seconds. This is not an ideal default for services that expect clients to quickly retry failed request attempts. Now, users can set quicker (or slower) backoffs according to their needs. -- (all, [smithy-rs#1263](https://github.com/awslabs/smithy-rs/issues/1263)) Add checksum calculation and validation wrappers for HTTP bodies. -- (all, [smithy-rs#1263](https://github.com/awslabs/smithy-rs/issues/1263)) `aws_smithy_http::header::append_merge_header_maps`, a function for merging two `HeaderMap`s, is now public. +- (all, [smithy-rs#1263](https://github.com/smithy-lang/smithy-rs/issues/1263)) Add checksum calculation and validation wrappers for HTTP bodies. +- (all, [smithy-rs#1263](https://github.com/smithy-lang/smithy-rs/issues/1263)) `aws_smithy_http::header::append_merge_header_maps`, a function for merging two `HeaderMap`s, is now public. v0.45.0 (June 28th, 2022) ========================= **Breaking Changes:** -- ⚠ ([smithy-rs#932](https://github.com/awslabs/smithy-rs/issues/932)) Replaced use of `pin-project` with equivalent `pin-project-lite`. For pinned enum tuple variants and tuple structs, this +- ⚠ ([smithy-rs#932](https://github.com/smithy-lang/smithy-rs/issues/932)) Replaced use of `pin-project` with equivalent `pin-project-lite`. For pinned enum tuple variants and tuple structs, this change requires that we switch to using enum struct variants and regular structs. Most of the structs and enums that were updated had only private fields/variants and so have the same public API. However, this change does affect the public API of `aws_smithy_http_tower::map_request::MapRequestFuture`. The `Inner` and `Ready` variants contained a @@ -781,19 +1426,19 @@ v0.45.0 (June 28th, 2022) instead of the `0` field. **New this release:** -- 🎉 ([smithy-rs#1411](https://github.com/awslabs/smithy-rs/issues/1411), [smithy-rs#1167](https://github.com/awslabs/smithy-rs/issues/1167)) Upgrade to Gradle 7. This change is not a breaking change, however, users of smithy-rs will need to switch to JDK 17 -- 🐛 ([smithy-rs#1505](https://github.com/awslabs/smithy-rs/issues/1505), @kiiadi) Fix issue with codegen on Windows where module names were incorrectly determined from filenames +- 🎉 ([smithy-rs#1411](https://github.com/smithy-lang/smithy-rs/issues/1411), [smithy-rs#1167](https://github.com/smithy-lang/smithy-rs/issues/1167)) Upgrade to Gradle 7. This change is not a breaking change, however, users of smithy-rs will need to switch to JDK 17 +- 🐛 ([smithy-rs#1505](https://github.com/smithy-lang/smithy-rs/issues/1505), @kiiadi) Fix issue with codegen on Windows where module names were incorrectly determined from filenames **Contributors** Thank you for your contributions! ❤ -- @kiiadi ([smithy-rs#1505](https://github.com/awslabs/smithy-rs/issues/1505)) +- @kiiadi ([smithy-rs#1505](https://github.com/smithy-lang/smithy-rs/issues/1505)) v0.44.0 (June 22nd, 2022) ========================= **New this release:** -- ([smithy-rs#1460](https://github.com/awslabs/smithy-rs/issues/1460)) Fix a potential bug with `ByteStream`'s implementation of `futures_core::stream::Stream` and add helpful error messages +- ([smithy-rs#1460](https://github.com/smithy-lang/smithy-rs/issues/1460)) Fix a potential bug with `ByteStream`'s implementation of `futures_core::stream::Stream` and add helpful error messages for users on 32-bit systems that try to stream HTTP bodies larger than 4.29Gb. -- 🐛 ([smithy-rs#1427](https://github.com/awslabs/smithy-rs/issues/1427), [smithy-rs#1465](https://github.com/awslabs/smithy-rs/issues/1465), [smithy-rs#1459](https://github.com/awslabs/smithy-rs/issues/1459)) Fix RustWriter bugs for `rustTemplate` and `docs` utility methods +- 🐛 ([smithy-rs#1427](https://github.com/smithy-lang/smithy-rs/issues/1427), [smithy-rs#1465](https://github.com/smithy-lang/smithy-rs/issues/1465), [smithy-rs#1459](https://github.com/smithy-lang/smithy-rs/issues/1459)) Fix RustWriter bugs for `rustTemplate` and `docs` utility methods - 🐛 ([aws-sdk-rust#554](https://github.com/awslabs/aws-sdk-rust/issues/554)) Requests to Route53 that return `ResourceId`s often come with a prefix. When passing those IDs directly into another request, the request would fail unless they manually stripped the prefix. Now, when making a request with a prefixed ID, the prefix will be stripped automatically. @@ -802,15 +1447,15 @@ v0.44.0 (June 22nd, 2022) v0.43.0 (June 9th, 2022) ======================== **New this release:** -- 🎉 ([smithy-rs#1381](https://github.com/awslabs/smithy-rs/issues/1381), @alonlud) Add ability to sign a request with all headers, or to change which headers are excluded from signing -- 🎉 ([smithy-rs#1390](https://github.com/awslabs/smithy-rs/issues/1390)) Add method `ByteStream::into_async_read`. This makes it easy to convert `ByteStream`s into a struct implementing `tokio:io::AsyncRead`. Available on **crate feature** `rt-tokio` only. -- ([smithy-rs#1404](https://github.com/awslabs/smithy-rs/issues/1404), @petrosagg) Add ability to specify a different rust crate name than the one derived from the package name -- ([smithy-rs#1404](https://github.com/awslabs/smithy-rs/issues/1404), @petrosagg) Switch to [RustCrypto](https://github.com/RustCrypto)'s implementation of MD5. +- 🎉 ([smithy-rs#1381](https://github.com/smithy-lang/smithy-rs/issues/1381), @alonlud) Add ability to sign a request with all headers, or to change which headers are excluded from signing +- 🎉 ([smithy-rs#1390](https://github.com/smithy-lang/smithy-rs/issues/1390)) Add method `ByteStream::into_async_read`. This makes it easy to convert `ByteStream`s into a struct implementing `tokio:io::AsyncRead`. Available on **crate feature** `rt-tokio` only. +- ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404), @petrosagg) Add ability to specify a different rust crate name than the one derived from the package name +- ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404), @petrosagg) Switch to [RustCrypto](https://github.com/RustCrypto)'s implementation of MD5. **Contributors** Thank you for your contributions! ❤ -- @alonlud ([smithy-rs#1381](https://github.com/awslabs/smithy-rs/issues/1381)) -- @petrosagg ([smithy-rs#1404](https://github.com/awslabs/smithy-rs/issues/1404)) +- @alonlud ([smithy-rs#1381](https://github.com/smithy-lang/smithy-rs/issues/1381)) +- @petrosagg ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404)) v0.42.0 (May 13th, 2022) ======================== @@ -857,21 +1502,21 @@ v0.42.0 (May 13th, 2022) ``` **New this release:** -- ([smithy-rs#1352](https://github.com/awslabs/smithy-rs/issues/1352)) Log a debug event when a retry is going to be peformed -- ([smithy-rs#1332](https://github.com/awslabs/smithy-rs/issues/1332), @82marbag) Update generated crates to Rust 2021 +- ([smithy-rs#1352](https://github.com/smithy-lang/smithy-rs/issues/1352)) Log a debug event when a retry is going to be peformed +- ([smithy-rs#1332](https://github.com/smithy-lang/smithy-rs/issues/1332), @82marbag) Update generated crates to Rust 2021 **Contributors** Thank you for your contributions! ❤ -- @82marbag ([smithy-rs#1332](https://github.com/awslabs/smithy-rs/issues/1332)) +- @82marbag ([smithy-rs#1332](https://github.com/smithy-lang/smithy-rs/issues/1332)) 0.41.0 (April 28th, 2022) ========================= **Breaking Changes:** -- ⚠ ([smithy-rs#1318](https://github.com/awslabs/smithy-rs/issues/1318)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.56.1 to 1.58.1 per our "two versions behind" policy. +- ⚠ ([smithy-rs#1318](https://github.com/smithy-lang/smithy-rs/issues/1318)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.56.1 to 1.58.1 per our "two versions behind" policy. **New this release:** -- ([smithy-rs#1307](https://github.com/awslabs/smithy-rs/issues/1307)) Add new trait for HTTP body callbacks. This is the first step to enabling us to implement optional checksum verification of requests and responses. -- ([smithy-rs#1330](https://github.com/awslabs/smithy-rs/issues/1330)) Upgrade to Smithy 1.21.0 +- ([smithy-rs#1307](https://github.com/smithy-lang/smithy-rs/issues/1307)) Add new trait for HTTP body callbacks. This is the first step to enabling us to implement optional checksum verification of requests and responses. +- ([smithy-rs#1330](https://github.com/smithy-lang/smithy-rs/issues/1330)) Upgrade to Smithy 1.21.0 0.40.2 (April 14th, 2022) @@ -881,13 +1526,13 @@ Thank you for your contributions! ❤ - ⚠ ([aws-sdk-rust#490](https://github.com/awslabs/aws-sdk-rust/issues/490)) Update all runtime crates to [edition 2021](https://blog.rust-lang.org/2021/10/21/Rust-1.56.0.html) **New this release:** -- ([smithy-rs#1262](https://github.com/awslabs/smithy-rs/issues/1262), @liubin) Fix link to Developer Guide in crate's README.md -- ([smithy-rs#1301](https://github.com/awslabs/smithy-rs/issues/1301), @benesch) Update urlencoding crate to v2.1.0 +- ([smithy-rs#1262](https://github.com/smithy-lang/smithy-rs/issues/1262), @liubin) Fix link to Developer Guide in crate's README.md +- ([smithy-rs#1301](https://github.com/smithy-lang/smithy-rs/issues/1301), @benesch) Update urlencoding crate to v2.1.0 **Contributors** Thank you for your contributions! ❤ -- @benesch ([smithy-rs#1301](https://github.com/awslabs/smithy-rs/issues/1301)) -- @liubin ([smithy-rs#1262](https://github.com/awslabs/smithy-rs/issues/1262)) +- @benesch ([smithy-rs#1301](https://github.com/smithy-lang/smithy-rs/issues/1301)) +- @liubin ([smithy-rs#1262](https://github.com/smithy-lang/smithy-rs/issues/1262)) 0.39.0 (March 17, 2022) ======================= @@ -920,7 +1565,7 @@ Thank you for your contributions! ❤ .await; } ``` -- ⚠ ([smithy-rs#724](https://github.com/awslabs/smithy-rs/issues/724)) Timeout configuration has been refactored a bit. If you were setting timeouts through environment variables or an AWS +- ⚠ ([smithy-rs#724](https://github.com/smithy-lang/smithy-rs/issues/724)) Timeout configuration has been refactored a bit. If you were setting timeouts through environment variables or an AWS profile, then you shouldn't need to change anything. Take note, however, that we don't currently support HTTP connect, read, write, or TLS negotiation timeouts. If you try to set any of those timeouts in your profile or environment, we'll log a warning explaining that those timeouts don't currently do anything. @@ -935,25 +1580,25 @@ Thank you for your contributions! ❤ functional in a future update. **New this release:** -- ([smithy-rs#1225](https://github.com/awslabs/smithy-rs/issues/1225)) `DynMiddleware` is now `clone`able -- ([smithy-rs#1257](https://github.com/awslabs/smithy-rs/issues/1257)) HTTP request property bag now contains list of desired HTTP versions to use when making requests. This list is not currently used but will be in an upcoming update. +- ([smithy-rs#1225](https://github.com/smithy-lang/smithy-rs/issues/1225)) `DynMiddleware` is now `clone`able +- ([smithy-rs#1257](https://github.com/smithy-lang/smithy-rs/issues/1257)) HTTP request property bag now contains list of desired HTTP versions to use when making requests. This list is not currently used but will be in an upcoming update. 0.38.0 (Februrary 24, 2022) =========================== **Breaking Changes:** -- ⚠ ([smithy-rs#1197](https://github.com/awslabs/smithy-rs/issues/1197)) `aws_smithy_types::retry::RetryKind` had its `NotRetryable` variant split into `UnretryableFailure` and `Unnecessary`. If you implement the `ClassifyResponse`, then successful responses need to return `Unnecessary`, and failures that shouldn't be retried need to return `UnretryableFailure`. -- ⚠ ([smithy-rs#1209](https://github.com/awslabs/smithy-rs/issues/1209)) `aws_smithy_types::primitive::Encoder` is now a struct rather than an enum, but its usage remains the same. -- ⚠ ([smithy-rs#1217](https://github.com/awslabs/smithy-rs/issues/1217)) `ClientBuilder` helpers `rustls()` and `native_tls()` now return `DynConnector` and use dynamic dispatch rather than returning their concrete connector type that would allow static dispatch. If static dispatch is desired, then manually construct a connector to give to the builder. For example, for rustls: `builder.connector(Adapter::builder().build(aws_smithy_client::conns::https()))` (where `Adapter` is in `aws_smithy_client::hyper_ext`). +- ⚠ ([smithy-rs#1197](https://github.com/smithy-lang/smithy-rs/issues/1197)) `aws_smithy_types::retry::RetryKind` had its `NotRetryable` variant split into `UnretryableFailure` and `Unnecessary`. If you implement the `ClassifyResponse`, then successful responses need to return `Unnecessary`, and failures that shouldn't be retried need to return `UnretryableFailure`. +- ⚠ ([smithy-rs#1209](https://github.com/smithy-lang/smithy-rs/issues/1209)) `aws_smithy_types::primitive::Encoder` is now a struct rather than an enum, but its usage remains the same. +- ⚠ ([smithy-rs#1217](https://github.com/smithy-lang/smithy-rs/issues/1217)) `ClientBuilder` helpers `rustls()` and `native_tls()` now return `DynConnector` and use dynamic dispatch rather than returning their concrete connector type that would allow static dispatch. If static dispatch is desired, then manually construct a connector to give to the builder. For example, for rustls: `builder.connector(Adapter::builder().build(aws_smithy_client::conns::https()))` (where `Adapter` is in `aws_smithy_client::hyper_ext`). **New this release:** -- 🐛 ([smithy-rs#1197](https://github.com/awslabs/smithy-rs/issues/1197)) Fixed a bug that caused clients to eventually stop retrying. The cross-request retry allowance wasn't being reimbursed upon receiving a successful response, so once this allowance reached zero, no further retries would ever be attempted. +- 🐛 ([smithy-rs#1197](https://github.com/smithy-lang/smithy-rs/issues/1197)) Fixed a bug that caused clients to eventually stop retrying. The cross-request retry allowance wasn't being reimbursed upon receiving a successful response, so once this allowance reached zero, no further retries would ever be attempted. 0.37.0 (February 18th, 2022) ============================ **Breaking Changes:** -- ⚠ ([smithy-rs#1144](https://github.com/awslabs/smithy-rs/issues/1144)) Some APIs required that timeout configuration be specified with an `aws_smithy_client::timeout::Settings` struct while +- ⚠ ([smithy-rs#1144](https://github.com/smithy-lang/smithy-rs/issues/1144)) Some APIs required that timeout configuration be specified with an `aws_smithy_client::timeout::Settings` struct while others required an `aws_smithy_types::timeout::TimeoutConfig` struct. Both were equivalent. Now `aws_smithy_types::timeout::TimeoutConfig` is used everywhere and `aws_smithy_client::timeout::Settings` has been removed. Here's how to migrate code your code that depended on `timeout::Settings`: @@ -972,34 +1617,34 @@ Thank you for your contributions! ❤ .with_connect_timeout(Some(Duration::from_secs(1))) .with_read_timeout(Some(Duration::from_secs(2))); ``` -- ⚠ ([smithy-rs#1085](https://github.com/awslabs/smithy-rs/issues/1085)) Moved the following re-exports into a `types` module for all services: +- ⚠ ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) Moved the following re-exports into a `types` module for all services: - `::AggregatedBytes` -> `::types::AggregatedBytes` - `::Blob` -> `::types::Blob` - `::ByteStream` -> `::types::ByteStream` - `::DateTime` -> `::types::DateTime` - `::SdkError` -> `::types::SdkError` -- ⚠ ([smithy-rs#1085](https://github.com/awslabs/smithy-rs/issues/1085)) `AggregatedBytes` and `ByteStream` are now only re-exported if the service has streaming operations, +- ⚠ ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) `AggregatedBytes` and `ByteStream` are now only re-exported if the service has streaming operations, and `Blob`/`DateTime` are only re-exported if the service uses them. -- ⚠ ([smithy-rs#1130](https://github.com/awslabs/smithy-rs/issues/1130)) MSRV increased from `1.54` to `1.56.1` per our 2-behind MSRV policy. +- ⚠ ([smithy-rs#1130](https://github.com/smithy-lang/smithy-rs/issues/1130)) MSRV increased from `1.54` to `1.56.1` per our 2-behind MSRV policy. **New this release:** -- ([smithy-rs#1144](https://github.com/awslabs/smithy-rs/issues/1144)) `MakeConnectorFn`, `HttpConnector`, and `HttpSettings` have been moved from `aws_config::provider_config` to +- ([smithy-rs#1144](https://github.com/smithy-lang/smithy-rs/issues/1144)) `MakeConnectorFn`, `HttpConnector`, and `HttpSettings` have been moved from `aws_config::provider_config` to `aws_smithy_client::http_connector`. This is in preparation for a later update that will change how connectors are created and configured. -- ([smithy-rs#1123](https://github.com/awslabs/smithy-rs/issues/1123)) Refactor `Document` shape parser generation -- ([smithy-rs#1085](https://github.com/awslabs/smithy-rs/issues/1085)) The `Client` and `Config` re-exports now have their documentation inlined in the service docs +- ([smithy-rs#1123](https://github.com/smithy-lang/smithy-rs/issues/1123)) Refactor `Document` shape parser generation +- ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) The `Client` and `Config` re-exports now have their documentation inlined in the service docs 0.36.0 (January 26, 2022) ========================= **New this release:** -- ([smithy-rs#1087](https://github.com/awslabs/smithy-rs/issues/1087)) Improve docs on `Endpoint::{mutable, immutable}` -- ([smithy-rs#1118](https://github.com/awslabs/smithy-rs/issues/1118)) SDK examples now come from [`awsdocs/aws-doc-sdk-examples`](https://github.com/awsdocs/aws-doc-sdk-examples) rather than from `smithy-rs` -- ([smithy-rs#1114](https://github.com/awslabs/smithy-rs/issues/1114), @mchoicpe-amazon) Provide SigningService creation via owned String +- ([smithy-rs#1087](https://github.com/smithy-lang/smithy-rs/issues/1087)) Improve docs on `Endpoint::{mutable, immutable}` +- ([smithy-rs#1118](https://github.com/smithy-lang/smithy-rs/issues/1118)) SDK examples now come from [`awsdocs/aws-doc-sdk-examples`](https://github.com/awsdocs/aws-doc-sdk-examples) rather than from `smithy-rs` +- ([smithy-rs#1114](https://github.com/smithy-lang/smithy-rs/issues/1114), @mchoicpe-amazon) Provide SigningService creation via owned String **Contributors** Thank you for your contributions! ❤ -- @mchoicpe-amazon ([smithy-rs#1114](https://github.com/awslabs/smithy-rs/issues/1114)) +- @mchoicpe-amazon ([smithy-rs#1114](https://github.com/smithy-lang/smithy-rs/issues/1114)) 0.35.2 (January 20th, 2022) @@ -1014,11 +1659,11 @@ _Changes only impact generated AWS SDK_ 0.35.0 (January 19, 2022) ========================= **New this release:** -- ([smithy-rs#1053](https://github.com/awslabs/smithy-rs/issues/1053)) Upgraded Smithy to 1.16.1 -- 🐛 ([smithy-rs#1069](https://github.com/awslabs/smithy-rs/issues/1069)) Fix broken link to `RetryMode` in client docs -- 🐛 ([smithy-rs#1069](https://github.com/awslabs/smithy-rs/issues/1069)) Fix several doc links to raw identifiers (identifiers excaped with `r#`) -- 🐛 ([smithy-rs#1069](https://github.com/awslabs/smithy-rs/issues/1069)) Reduce dependency recompilation in local dev -- 🐛 ([aws-sdk-rust#405](https://github.com/awslabs/aws-sdk-rust/issues/405), [smithy-rs#1083](https://github.com/awslabs/smithy-rs/issues/1083)) Fixed paginator bug impacting EC2 describe VPCs (and others) +- ([smithy-rs#1053](https://github.com/smithy-lang/smithy-rs/issues/1053)) Upgraded Smithy to 1.16.1 +- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Fix broken link to `RetryMode` in client docs +- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Fix several doc links to raw identifiers (identifiers excaped with `r#`) +- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Reduce dependency recompilation in local dev +- 🐛 ([aws-sdk-rust#405](https://github.com/awslabs/aws-sdk-rust/issues/405), [smithy-rs#1083](https://github.com/smithy-lang/smithy-rs/issues/1083)) Fixed paginator bug impacting EC2 describe VPCs (and others) @@ -1542,7 +2187,7 @@ v0.19 (August 3rd, 2021) IoT Data Plane is now available! If you discover it isn't functioning as expected, please let us know! This week also sees the addition of a robust async caching credentials provider. Take a look at the -[STS example](https://github.com/awslabs/smithy-rs/blob/7fa4af4a9367aeca6d55e26fc4d4ba93093b90c4/aws/sdk/examples/sts/src/bin/credentials-provider.rs) +[STS example](https://github.com/smithy-lang/smithy-rs/blob/7fa4af4a9367aeca6d55e26fc4d4ba93093b90c4/aws/sdk/examples/sts/src/bin/credentials-provider.rs) to see how to use it. **New This Week** diff --git a/CHANGELOG.next.toml b/CHANGELOG.next.toml index 35349116c0b..58811865e2b 100644 --- a/CHANGELOG.next.toml +++ b/CHANGELOG.next.toml @@ -11,578 +11,71 @@ # meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client | server | all"} # author = "rcoh" - [[aws-sdk-rust]] - message = "Automatically exclude X-Ray trace ID headers and authorization headers from SigV4 canonical request calculations." - references = ["smithy-rs#2815"] - meta = { "breaking" = false, "tada" = false, "bug" = true } - author = "relevantsam" - - [[aws-sdk-rust]] - message = "Add accessors to Builders" - references = ["smithy-rs#2791"] - meta = { "breaking" = false, "tada" = false, "bug" = false } - author = "davidsouther" - - [[smithy-rs]] - message = "Add accessors to Builders" - references = ["smithy-rs#2791"] - meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client"} - author = "davidsouther" - -[[smithy-rs]] -message = "Avoid intermediate vec allocations in AggregatedBytes::to_vec." -author = "yotamofek" -references = ["smithy-rs#2786"] -meta = { "breaking" = false, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = "Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation." -author = "thor-bjorgvinsson" -references = ["smithy-rs#2733"] -meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "server" } - -[[aws-sdk-rust]] -message = "Remove native-tls and add a migration guide." -author = "82marbag" -references = ["smithy-rs#2675"] -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = "Remove native-tls and add a migration guide." -author = "82marbag" -references = ["smithy-rs#2675"] -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[aws-sdk-rust]] -message = "Fix error message when `credentials-sso` feature is not enabled on `aws-config`. NOTE: if you use `no-default-features`, you will need to manually able `credentials-sso` after 0.55.*" -references = ["smithy-rs#2722", "aws-sdk-rust#703"] -meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "rcoh" - [[aws-sdk-rust]] -message = "`SsoCredentialsProvider`, `AssumeRoleProvider`, and `WebIdentityTokenCredentialsProvider` now use `NoCredentialsCache` internally when fetching credentials using an STS client. This avoids double-caching when these providers are wrapped by `LazyCredentialsCache` when a service client is created." -references = ["smithy-rs#2720"] +message = "Loading native TLS trusted certs for the default HTTP client now only occurs if the default HTTP client is not overridden in config." +references = ["smithy-rs#3262"] meta = { "breaking" = false, "tada" = false, "bug" = true } -author = "ysaito1001" - -[[smithy-rs]] -message = """ -
-Breaking change in how event stream signing works (click to expand more details) - -This change will only impact you if you are wiring up their own event stream signing/authentication scheme. If you're using `aws-sig-auth` to use AWS SigV4 event stream signing, then this change will **not** impact you. - -Previously, event stream signing was configured at codegen time by placing a `new_event_stream_signer` method on the `Config`. This function was called at serialization time to connect the signer to the streaming body. Now, instead, a special `DeferredSigner` is wired up at serialization time that relies on a signing implementation to be sent on a channel by the HTTP request signer. To do this, a `DeferredSignerSender` must be pulled out of the property bag, and its `send()` method called with the desired event stream signing implementation. - -See the changes in https://github.com/awslabs/smithy-rs/pull/2671 for an example of how this was done for SigV4. -
-""" -references = ["smithy-rs#2671"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "jdisanti" - -[[aws-sdk-rust]] -message = "For event stream operations such as S3 SelectObjectContent or Transcribe StartStreamTranscription, the `EventStreamSender` in the input now requires the passed in `Stream` impl to implement `Sync`." -references = ["smithy-rs#2673"] -meta = { "breaking" = true, "tada" = false, "bug" = false } author = "jdisanti" [[smithy-rs]] -message = "For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`." -references = ["smithy-rs#2673"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } +message = "Loading native TLS trusted certs for the default HTTP client now only occurs if the default HTTP client is not overridden in config." +references = ["smithy-rs#3262"] +meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "client" } author = "jdisanti" [[aws-sdk-rust]] -message = "The `SigningInstructions` in the `aws-sigv4` module are now public. This allows them to be named in a function signature." -references = ["smithy-rs#2730"] -author = "cholcombe973" -meta = { "breaking" = false, "tada" = false, "bug" = true } - -[[smithy-rs]] -message = "Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case." -references = ["smithy-rs#2539"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "david-perez" - -[[smithy-rs]] -message = "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[smithy-rs]] -message = "The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "rcoh" - -[[aws-sdk-rust]] -message = "Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported." -references = ["smithy-rs#2728", "smithy-rs#2262", "aws-sdk-rust#2087"] -meta = { "breaking" = false, "tada" = false, "bug" = false } -author = "rcoh" - -[[smithy-rs]] -message = "Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration" -author = "david-perez" -references = ["smithy-rs#2676", "smithy-rs#2685"] -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = """Remove `PollError` from an operations `Service::Error`. - -Any [`tower::Service`](https://docs.rs/tower/latest/tower/trait.Service.html) provided to -[`Operation::from_service`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Operation.html#method.from_service) -no longer requires `Service::Error = OperationError`, instead requiring just `Service::Error = Op::Error`. -""" -references = ["smithy-rs#2457"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "server" } -author = "hlbarber" - -[[aws-sdk-rust]] -message = "The SDK has added support for timestreamwrite and timestreamquery. Support for these services is considered experimental at this time. In order to use these services, you MUST call `.enable_endpoint_discovery()` on the `Client` after construction." +message = """Client creation now takes microseconds instead of milliseconds. +Previously, it would take 2-3 milliseconds for each client instantiation due to time spent compiling regexes. +For applications that used several clients, this would increase start-up time in cases where it really matters, +such as for AWS Lambda cold starts. This time was improved by both changing regex implementation and caching the +result of the compilation.""" +references = ["aws-sdk-rust#975", "smithy-rs#3269"] meta = { "breaking" = false, "tada" = true, "bug" = false } -references = ["smithy-rs#2707", "aws-sdk-rust#114"] -author = "rcoh" - -[[smithy-rs]] -message = "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it." -references = ["smithy-rs#2742"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc` that appear in public APIs have been replaced with it." -references = ["smithy-rs#2742"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "Update MSRV to Rust 1.68.2" -references = ["smithy-rs#2745"] -meta = { "breaking" = true, "tada" = false, "bug" = false } author = "jdisanti" -[[smithy-rs]] -message = "Update MSRV to Rust 1.68.2" -references = ["smithy-rs#2745"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "all" } -author = "jdisanti" - -[[smithy-rs]] -message = """`ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name. -`OperationExtension`'s members are replaced by the `ShapeId` and operations' names are now replced by a `ShapeId`. - -Before you had an operation and an absolute name as its `NAME` member. You could apply a plugin only to some selected operation: - -``` -filter_by_operation_name(plugin, |name| name != Op::ID); -``` - -Your new filter selects on an operation's absolute name, namespace or name. - -``` -filter_by_operation_id(plugin, |id| id.name() != Op::ID.name()); -``` - -The above filter is applied to an operation's name, the one you use to specify the operation in the Smithy model. - -You can filter all operations in a namespace or absolute name: - -``` -filter_by_operation_id(plugin, |id| id.namespace() != "namespace"); -filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name"); -``` -""" -author = "82marbag" -references = ["smithy-rs#2678"] -meta = { "breaking" = true, "tada" = false, "bug" = false } - -[[smithy-rs]] -message = "The occurrences of `Arc` have now been replaced with `SharedEndpointResolver` in public APIs." -references = ["smithy-rs#2758"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[smithy-rs]] -message = """The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal: - -- A `ServiceShape` trait has been added. -- The `Plugin` trait has been simplified. -- The `Operation` structure has been removed. -- A `Scoped` `Plugin` has been added. - -The `Plugin` trait has now been simplified and the `Operation` struct has been removed. - -## Addition of `ServiceShape` - -Since the [0.52 release](https://github.com/awslabs/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed. - -```rust -/// Models the [Smithy Operation shape]. -/// -/// [Smithy Operation shape]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#operation -pub trait OperationShape { - /// The ID of the operation. - const ID: ShapeId; - - /// The operation input. - type Input; - /// The operation output. - type Output; - /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error - /// exists. - type Error; -} -``` - -This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example. - -We continue with this approach and introduce the following trait: - -```rust -/// Models the [Smithy Service shape]. -/// -/// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html -pub trait ServiceShape { - /// The [`ShapeId`] of the service. - const ID: ShapeId; - - /// The version of the service. - const VERSION: Option<&'static str>; - - /// The [Protocol] applied to this service. - /// - /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html - type Protocol; - - /// An enumeration of all operations contained in this service. - type Operations; -} -``` - -With the changes to `Plugin`, described below, middleware authors now have access to this information at compile time. - -## Simplication of the `Plugin` trait - -Previously, - -```rust -trait Plugin { - type Service; - type Layer; - - fn map(&self, input: Operation) -> Operation; -} -``` - -modified an `Operation`. - -Now, - -```rust -trait Plugin { - type Output; - - fn apply(&self, input: T) -> Self::Output; -} -``` - -maps a `tower::Service` to a `tower::Service`. This is equivalent to `tower::Layer` with two extra type parameters: `Service` and `Operation`, which implement `ServiceShape` and `OperationShape` respectively. - -Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/awslabs/smithy-rs/issues/2777) for more context. - -The following middleware setup - -```rust -pub struct PrintService { - inner: S, - name: &'static str, -} - -impl Service for PrintService -where - S: Service, -{ - async fn call(&mut self, req: R) -> Self::Future { - println!("Hi {}", self.name); - self.inner.call(req) - } -} - -pub struct PrintLayer { - name: &'static str, -} - -impl Layer for PrintLayer { - type Service = PrintService; - - fn layer(&self, service: S) -> Self::Service { - PrintService { - inner: service, - name: self.name, - } - } -} - -pub struct PrintPlugin; - -impl Plugin for PrintPlugin -where - Op: OperationShape, -{ - type Service = S; - type Layer = Stack; - - fn map(&self, input: Operation) -> Operation { - input.layer(PrintLayer { name: Op::NAME }) - } -} -``` - -now becomes - -```rust -pub struct PrintService { - inner: S, - name: &'static str, -} - -impl Service for PrintService -where - S: Service, -{ - async fn call(&mut self, req: R) -> Self::Future { - println!("Hi {}", self.name); - self.inner.call(req) - } -} - -pub struct PrintPlugin; - -impl Plugin for PrintPlugin -where - Op: OperationShape, -{ - type Output = PrintService; - - fn apply(&self, inner: T) -> Self::Output { - PrintService { inner, name: Op::ID.name() } - } -} -``` - -Alternatively, using the new `ServiceShape`, implemented on `Ser`: - -```rust -impl Plugin for PrintPlugin -where - Ser: ServiceShape, -{ - type Service = PrintService; - - fn apply(&self, inner: T) -> Self::Service { - PrintService { inner, name: Ser::ID.name() } - } -} -``` - -A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://awslabs.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://awslabs.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately: - -```rust -let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plugins */) - /* setters */ - .build() - .unwrap(); -``` - -The motivation behind this change is to simplify the job of middleware authors, separate concerns, accomodate common cases better, and to improve composition internally. - -Because `Plugin` is now closer to `tower::Layer` we have two canonical converters: - -```rust -use aws_smithy_http_server::plugin::{PluginLayer, LayerPlugin}; - -// Convert from `Layer` to `Plugin` which applies uniformly across all operations -let layer = /* some layer */; -let plugin = PluginLayer(layer); - -// Convert from `Plugin` to `Layer` for some fixed protocol and operation -let plugin = /* some plugin */; -let layer = LayerPlugin::new::(plugin); -``` - -## Removal of `Operation` - -The `aws_smithy_http_server::operation::Operation` structure has now been removed. Previously, there existed a `{operation_name}_operation` setter on the service builder, which accepted an `Operation`. This allowed users to - -```rust -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */); - -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_operation(operation) - /* other setters */ - .build() - .unwrap(); -``` - -to set an operation with a `tower::Service`, and - -```rust -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */).layer(/* layer */); -let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_handler(/* closure */).layer(/* layer */); - -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_operation(operation) - /* other setters */ - .build() - .unwrap(); -``` - -to add a `tower::Layer` (acting on HTTP requests/responses post-routing) to a single operation. - -We have seen little adoption of this API and for this reason we have opted instead to introduce a new setter, accepting a `tower::Service`, on the service builder: - -```rust -let app = PokemonService::builder_without_plugins() - .get_pokemon_species_service(/* tower::Service */) - /* other setters */ - .build() - .unwrap(); -``` - -Applying a `tower::Layer` to a _subset_ of operations is should now be done through the `Plugin` API via `filter_by_operation_id` - -```rust -use aws_smithy_http_server::plugin::{PluginLayer, filter_by_operation_name, IdentityPlugin}; - -let plugin = PluginLayer(/* layer */); -let scoped_plugin = filter_by_operation_name(plugin, |id| id == GetPokemonSpecies::ID); - -let app = PokemonService::builder_with_plugins(scoped_plugin, IdentityPlugin) - .get_pokemon_species(/* handler */) - /* other setters */ - .build() - .unwrap(); -``` - -or the new `Scoped` `Plugin` introduced below. - -# Addition of `Scoped` - -Currently, users can selectively apply a `Plugin` via the `filter_by_operation_id` function - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -// Only apply `plugin` to `CheckHealth` and `GetStorage` operation -let filtered_plugin = filter_by_operation_id(plugin, |name| name == CheckHealth::ID || name == GetStorage::ID); -``` - -In addition to this, we now provide `Scoped`, which selectively applies a `Plugin` at _compiletime_. Users should prefer this to `filter_by_operation_id` when applicable. +[[aws-sdk-rust]] +message = """Add `test_credentials` to `ConfigLoader` in `aws_config`. This allows the following pattern during tests: ```rust -use aws_smithy_http_server::plugin::Scoped; -use pokemon_service_server_sdk::scoped; - -scope! { - /// Includes only the `CheckHealth` and `GetStorage` operation. - struct SomeScope { - includes: [CheckHealth, GetStorage] - } +async fn main() { + let conf = aws_config::defaults(BehaviorVersion::latest()) + .test_credentials() + .await; } -let scoped_plugin = Scoped::new::(plugin); ``` +This is designed for unit tests and using local mocks like DynamoDB Local and LocalStack with the SDK. """ -references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "hlbarber" - -[[smithy-rs]] -message = "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives" -author = "thomas-k-cameron" -meta = { "breaking" = false, "tada" = true, "bug" = false, target = "all" } -references = [ - "smithy-rs#2647", - "smithy-rs#2645", - "smithy-rs#2646", - "smithy-rs#2616", -] +meta = { "breaking" = false, "tada" = true, "bug" = false } +author = "rcoh" +references = ["smithy-rs#3279", "aws-sdk-rust#971"] [[aws-sdk-rust]] -message = "Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives" -author = "thomas-k-cameron" -meta = { "breaking" = false, "tada" = true, "bug" = false } -references = [ - "smithy-rs#2647", - "smithy-rs#2645", - "smithy-rs#2646", - "smithy-rs#2616", -] +message = "Improve the error messages for when auth fails to select an auth scheme for a request." +references = ["aws-sdk-rust#979", "smithy-rs#3277"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "jdisanti" [[smithy-rs]] -message = "Add a `send_with` function on `-Input` types for sending requests without fluent builders" -author = "thomas-k-cameron" -references = ["smithy-rs#2652"] -meta = { "breaking" = false, "tada" = true, "bug" = false, target = "client" } +message = "Improve the error messages for when auth fails to select an auth scheme for a request." +references = ["smithy-rs#3277"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" [[aws-sdk-rust]] -message = "Add a `send_with` function on `-Input` types for sending requests without fluent builders" -author = "thomas-k-cameron" -references = ["smithy-rs#2652"] -meta = { "breaking" = false, "tada" = true, "bug" = false } +message = "Fix documentation and examples on HyperConnector and HyperClientBuilder." +references = ["aws-sdk-rust#986", "smithy-rs#3282"] +meta = { "breaking" = false, "tada" = false, "bug" = false } +author = "jdisanti" [[smithy-rs]] -message = """Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`. - -Previously, we provided `filter_by_operation_id` which filtered `Plugin` application via a predicate over the Shape ID. - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -use pokemon_service_server_sdk::operation_shape::CheckHealth; - -let filtered = filter_by_operation_id(plugin, |name| name != CheckHealth::NAME); -``` - -This had the problem that the user is unable to exhaustively match over a `&'static str`. To remedy this we have switched to `filter_by_operation` which is a predicate over an enum containing all operations contained in the service. - -```rust -use aws_smithy_http_server::plugin::filter_by_operation_id; -use pokemon_service_server_sdk::service::Operation; - -let filtered = filter_by_operation(plugin, |op: Operation| op != Operation::CheckHealth); -``` - -Similarly, `plugin_from_operation_fn` now allows for - -```rust -use aws_smithy_http_server::plugin::plugin_from_operation_fn; -use pokemon_service_server_sdk::service::Operation; - -fn map(op: Operation, inner: S) -> PrintService { - match op { - Operation::CheckHealth => PrintService { name: op.shape_id().name(), inner }, - Operation::GetPokemonSpecies => PrintService { name: "hello world", inner }, - _ => todo!() - } -} - -let plugin = plugin_from_operation_fn(map); -``` -""" -references = ["smithy-rs#2740", "smithy-rs#2759", "smithy-rs#2779"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "hlbarber" +message = "Fix documentation and examples on HyperConnector and HyperClientBuilder." +references = ["smithy-rs#3282"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "jdisanti" [[smithy-rs]] -message = "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`." -references = ["smithy-rs#2783"] -meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" } -author = "ysaito1001" - -[[aws-sdk-rust]] -message = "The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`." -references = ["smithy-rs#2783"] -meta = { "breaking" = true, "tada" = false, "bug" = false } -author = "ysaito1001" +message = "Expose local socket address from ConnectionMetadata." +references = ["aws-sdk-rust#990"] +meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } +author = "declanvk" diff --git a/CODEOWNERS b/CODEOWNERS index 79b21893c0b..fb8968d43bc 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,40 +1,40 @@ -* @awslabs/rust-sdk-owners +* @smithy-lang/aws-sdk-rust # Server -/codegen-server-test/ @awslabs/smithy-rs-server -/codegen-server/ @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-http-server/ @awslabs/smithy-rs-server -/examples/ @awslabs/smithy-rs-server +/codegen-server-test/ @smithy-lang/smithy-rs-server +/codegen-server/ @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-http-server/ @smithy-lang/smithy-rs-server # Python Server -/codegen-server-test/python/ @awslabs/smithy-rs-python-server @awslabs/smithy-rs-server -/codegen-server/python/ @awslabs/smithy-rs-python-server @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-http-server-python/ @awslabs/smithy-rs-python-server @awslabs/smithy-rs-server +/codegen-server-test/python/ @smithy-lang/smithy-rs-server +/codegen-server/python/ @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-http-server-python/ @smithy-lang/smithy-rs-server # Typescript Server -/codegen-server-test/typescript/ @awslabs/smithy-rs-typescript-server @awslabs/smithy-rs-server -/codegen-server/typescript/ @awslabs/smithy-rs-typescript-server @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-http-server-typescript/ @awslabs/smithy-rs-typescript-server @awslabs/smithy-rs-server +/codegen-server-test/typescript/ @smithy-lang/smithy-rs-server +/codegen-server/typescript/ @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-http-server-typescript/ @smithy-lang/smithy-rs-server # Shared ownership -/.github/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/CHANGELOG.md @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/CHANGELOG.next.toml @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/README.md @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/build.gradle.kts @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/buildSrc/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/codegen-core/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/design/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/gradle.properties @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/tools/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-async/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-eventstream/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-http/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-json/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-protocol-test/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-types/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-types-convert/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/aws-smithy-xml/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/inlineable/ @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/build.gradle.kts @awslabs/rust-sdk-owners @awslabs/smithy-rs-server -/rust-runtime/Cargo.toml @awslabs/rust-sdk-owners @awslabs/smithy-rs-server +/.github/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/CHANGELOG.md @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/CHANGELOG.next.toml @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/README.md @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/build.gradle.kts @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/buildSrc/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/codegen-core/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/design/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/examples/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/gradle.properties @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/tools/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-async/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-eventstream/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-http/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-json/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-protocol-test/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-types/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-types-convert/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/aws-smithy-xml/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/inlineable/ @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/build.gradle.kts @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server +/rust-runtime/Cargo.toml @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server diff --git a/README.md b/README.md index 3fabab8897d..2d9f2b119f0 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -Smithy Rust [![CI on Branch `main`](https://github.com/awslabs/smithy-rs/actions/workflows/ci-main.yml/badge.svg)](https://github.com/awslabs/smithy-rs/actions/workflows/ci-main.yml) +Smithy Rust [![CI on Branch `main`](https://github.com/smithy-lang/smithy-rs/actions/workflows/ci-main.yml/badge.svg)](https://github.com/smithy-lang/smithy-rs/actions/workflows/ci-main.yml) ================================================================================== Smithy code generators for Rust that generate clients, servers, and the entire AWS SDK. The latest unreleased SDK build can be found in [aws-sdk-rust/next](https://github.com/awslabs/aws-sdk-rust/tree/next). -[Design documentation](https://awslabs.github.io/smithy-rs/design) +[Design documentation](https://smithy-lang.github.io/smithy-rs/design/) **All internal and external interfaces are considered unstable and subject to change without notice.** diff --git a/aws/SDK_CHANGELOG.next.json b/aws/SDK_CHANGELOG.next.json index 1beee31b1eb..8823e0a91ab 100644 --- a/aws/SDK_CHANGELOG.next.json +++ b/aws/SDK_CHANGELOG.next.json @@ -6,329 +6,21 @@ "smithy-rs": [], "aws-sdk-rust": [ { - "message": "Integrate Endpoints 2.0 into the Rust SDK. Endpoints 2.0 enables features like S3 virtual addressing & S3\nobject lambda. As part of this change, there are several breaking changes although efforts have been made to deprecate\nwhere possible to smooth the upgrade path.\n1. `aws_smithy_http::endpoint::Endpoint` and the `endpoint_resolver` methods have been deprecated. In general, these usages\n should be replaced with usages of `endpoint_url` instead. `endpoint_url` accepts a string so an `aws_smithy_http::Endpoint`\n does not need to be constructed. This structure and methods will be removed in a future release.\n2. The `endpoint_resolver` method on `::config::Builder` now accepts a service specific endpoint resolver instead\n of an implementation of `ResolveAwsEndpoint`. Most users will be able to replace these usages with a usage of `endpoint_url`.\n3. `ResolveAwsEndpoint` has been deprecated and will be removed in a future version of the SDK.\n4. The SDK does not support \"pseudo regions\" anymore. Specifically, regions like `iam-fips` will no longer resolve to a FIPS endpoint.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#1784", - "smithy-rs#2074" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add additional configuration parameters to `aws_sdk_s3::Config`.\n\nThe launch of endpoints 2.0 includes more configuration options for S3. The default behavior for endpoint resolution has\nbeen changed. Before, all requests hit the path-style endpoint. Going forward, all requests that can be routed to the\nvirtually hosted bucket will be routed there automatically.\n- `force_path_style`: Requests will now default to the virtually-hosted endpoint `.s3..amazonaws.com`\n- `use_arn_region`: Enables this client to use an ARN’s region when constructing an endpoint instead of the client’s configured region.\n- `accelerate`: Enables this client to use S3 Transfer Acceleration endpoints.\n\nNote: the AWS SDK for Rust does not currently support Multi Region Access Points (MRAP).\n", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#1784", - "smithy-rs#2074" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Move types for AWS SDK credentials to a separate crate.\nA new AWS runtime crate called `aws-credential-types` has been introduced. Types for AWS SDK credentials have been moved to that crate from `aws-config` and `aws-types`. The new crate is placed at the top of the dependency graph among AWS runtime crates with the aim of the downstream crates having access to the types defined in it.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2108" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add support for overriding profile name and profile file location across all providers. Prior to this change, each provider needed to be updated individually.\n\n### Before\n```rust\nuse aws_config::profile::{ProfileFileCredentialsProvider, ProfileFileRegionProvider};\nuse aws_config::profile::profile_file::{ProfileFiles, ProfileFileKind};\n\nlet profile_files = ProfileFiles::builder()\n .with_file(ProfileFileKind::Credentials, \"some/path/to/credentials-file\")\n .build();\nlet credentials_provider = ProfileFileCredentialsProvider::builder()\n .profile_files(profile_files.clone())\n .build();\nlet region_provider = ProfileFileRegionProvider::builder()\n .profile_files(profile_files)\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .region(region_provider)\n .load()\n .await;\n```\n\n### After\n```rust\nuse aws_config::profile::{ProfileFileCredentialsProvider, ProfileFileRegionProvider};\nuse aws_config::profile::profile_file::{ProfileFiles, ProfileFileKind};\n\nlet profile_files = ProfileFiles::builder()\n .with_file(ProfileFileKind::Credentials, \"some/path/to/credentials-file\")\n .build();\nlet sdk_config = aws_config::from_env()\n .profile_files(profile_files)\n .load()\n .await;\n/// ```\n", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2152" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "`aws_config::profile::retry_config` && `aws_config::environment::retry_config` have been removed. Use `aws_config::default_provider::retry_config` instead.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2162" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Add support for resolving FIPS and dual-stack endpoints.\n\nFIPS and dual-stack endpoints can each be configured in multiple ways:\n1. Automatically from the environment and AWS profile\n2. Across all clients loaded from the same `SdkConfig` via `from_env().use_dual_stack(true).load().await`\n3. At a client level when constructing the configuration for an individual client.\n\nNote: Not all services support FIPS and dual-stack.\n", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "rcoh", - "references": [ - "smithy-rs#2168" - ], - "since-commit": "40da9a32b38e198da6ca2223b86c314b26438230", - "age": 5 - }, - { - "message": "Improve SDK credentials caching through type safety. `LazyCachingCredentialsProvider` has been renamed to `LazyCredentialsCache` and is no longer treated as a credentials provider. Furthermore, you do not create a `LazyCredentialsCache` directly, and instead you interact with `CredentialsCache`. This introduces the following breaking changes.\n\nIf you previously used `LazyCachingCredentialsProvider`, you can replace it with `CredentialsCache`.\n
\nExample\n\nBefore:\n```rust\nuse aws_config::meta::credentials::lazy_caching::LazyCachingCredentialsProvider;\nuse aws_types::provider::ProvideCredentials;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet credentials_provider =\n LazyCachingCredentialsProvider::builder()\n .load(make_provider())\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_credential_types::cache::CredentialsCache;\nuse aws_types::provider::ProvideCredentials;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\n// Wrapping a result of `make_provider` in `LazyCredentialsCache` is done automatically.\nlet sdk_config = aws_config::from_env()\n .credentials_cache(CredentialsCache::lazy()) // This line can be omitted because it is on by default.\n .credentials_provider(make_provider())\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nIf you previously configured a `LazyCachingCredentialsProvider`, you can use the builder for `LazyCredentialsCache` instead.\n\nBefore:\n```rust\nuse aws_config::meta::credentials::lazy_caching::LazyCachingCredentialsProvider;\nuse aws_types::provider::ProvideCredentials;\nuse std::time::Duration;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet credentials_provider =\n LazyCachingCredentialsProvider::builder()\n .load(make_provider())\n .load_timeout(Duration::from_secs(60)) // Configures timeout.\n .build();\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_credential_types::cache::CredentialsCache;\nuse aws_types::provider::ProvideCredentials;\nuse std::time::Duration;\n\nfn make_provider() -> impl ProvideCredentials {\n // --snip--\n}\n\nlet sdk_config = aws_config::from_env()\n .credentials_cache(\n CredentialsCache::lazy_builder()\n .load_timeout(Duration::from_secs(60)) // Configures timeout.\n .into_credentials_cache(),\n )\n .credentials_provider(make_provider())\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nThe examples above only demonstrate how to use `credentials_cache` and `credentials_provider` methods on `aws_config::ConfigLoader` but the same code update can be applied when you interact with `aws_types::sdk_config::Builder` or the builder for a service-specific config, e.g. `aws_sdk_s3::config::Builder`.\n\n
\n\n\nIf you previously configured a `DefaultCredentialsChain` by calling `load_timeout`, `buffer_time`, or `default_credential_expiration` on its builder, you need to call the same set of methods on the builder for `LazyCredentialsCache` instead.\n
\nExample\n\nBefore:\n```rust\nuse aws_config::default_provider::credentials::DefaultCredentialsChain;\nuse std::time::Duration;\n\nlet credentials_provider = DefaultCredentialsChain::builder()\n .buffer_time(Duration::from_secs(30))\n .default_credential_expiration(Duration::from_secs(20 * 60))\n .build()\n .await;\n\nlet sdk_config = aws_config::from_env()\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nAfter:\n```rust\nuse aws_config::default_provider::credentials::default_provider;\nuse aws_credential_types::cache::CredentialsCache;\nuse std::time::Duration;\n\n// Previously used methods no longer exist on the builder for `DefaultCredentialsChain`.\nlet credentials_provider = default_provider().await;\n\nlet sdk_config = aws_config::from_env()\n .credentials_cache(\n CredentialsCache::lazy_builder()\n .buffer_time(Duration::from_secs(30))\n .default_credential_expiration(Duration::from_secs(20 * 60))\n .into_credentials_cache(),\n )\n .credentials_provider(credentials_provider)\n .load()\n .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\n
\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2122", - "smithy-rs#2227" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "The introduction of `CredentialsCache` comes with an accompanying type `SharedCredentialsCache`, which we will store in the property bag instead of a `SharedCredentialsProvider`. As a result, `aws_http::auth:set_provider` has been updated to `aws_http::auth::set_credentials_cache`.\n\nBefore:\n```rust\nuse aws_credential_types::Credentials;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_http::auth::set_provider;\nuse aws_smithy_http::body::SdkBody;\nuse aws_smithy_http::operation;\n\nlet mut req = operation::Request::new(http::Request::new(SdkBody::from(\"some body\")));\nlet credentials = Credentials::new(\"example\", \"example\", None, None, \"my_provider_name\");\nset_provider(\n &mut req.properties_mut(),\n SharedCredentialsProvider::new(credentials),\n);\n```\n\nAfter:\n```rust\nuse aws_credential_types::Credentials;\nuse aws_credential_types::cache::{CredentialsCache, SharedCredentialsCache};\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_http::auth::set_credentials_cache;\nuse aws_smithy_http::body::SdkBody;\nuse aws_smithy_http::operation;\n\nlet mut req = operation::Request::new(http::Request::new(SdkBody::from(\"some body\")));\nlet credentials = Credentials::new(\"example\", \"example\", None, None, \"my_provider_name\");\nlet credentials_cache = CredentialsCache::lazy_builder()\n .into_credentials_cache()\n .create_cache(SharedCredentialsProvider::new(credentials));\nset_credentials_cache(\n &mut req.properties_mut(),\n SharedCredentialsCache::new(credentials_cache),\n);\n```\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2122", - "smithy-rs#2227" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "Fix endpoint for s3.write_get_object_response(). This bug was introduced in 0.53.", + "message": "Make properties of S3Control PublicAccessBlockConfiguration optional. Previously, they defaulted to false, but this created invalid requests.", "meta": { "bug": true, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2204" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "Add `with_test_defaults()` and `set_test_defaults()` to `::Config`. These methods fill in defaults for configuration that is mandatory to successfully send a request.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2204" - ], - "since-commit": "48ce90d3a32cc87337d87d1f291b41fc64f1e5bd", - "age": 5 - }, - { - "message": "Request IDs can now be easily retrieved on successful responses. For example, with S3:\n```rust\n// Import the trait to get the `request_id` method on outputs\nuse aws_sdk_s3::types::RequestId;\nlet output = client.list_buckets().send().await?;\nprintln!(\"Request ID: {:?}\", output.request_id());\n```\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "Retrieving a request ID from errors now requires importing the `RequestId` trait. For example, with S3:\n```rust\nuse aws_sdk_s3::types::RequestId;\nprintln!(\"Request ID: {:?}\", error.request_id());\n```\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "The `*Error` and `*ErrorKind` types have been combined to make error matching simpler.\n
\nExample with S3\n**Before:**\n```rust\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError { kind, .. } => match kind {\n GetObjectErrorKind::InvalidObjectState(value) => println!(\"invalid object state: {:?}\", value),\n GetObjectErrorKind::NoSuchKey(_) => println!(\"object didn't exist\"),\n }\n err @ GetObjectError { .. } if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n**After:**\n```rust\n// Needed to access the `.code()` function on the error type:\nuse aws_sdk_s3::types::ProvideErrorMetadata;\nlet result = client\n .get_object()\n .bucket(BUCKET_NAME)\n .key(\"some-key\")\n .send()\n .await;\nmatch result {\n Ok(_output) => { /* Do something with the output */ }\n Err(err) => match err.into_service_error() {\n GetObjectError::InvalidObjectState(value) => {\n println!(\"invalid object state: {:?}\", value);\n }\n GetObjectError::NoSuchKey(_) => {\n println!(\"object didn't exist\");\n }\n err if err.code() == Some(\"SomeUnmodeledError\") => {}\n err @ _ => return Err(err.into()),\n },\n}\n```\n
\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129", - "smithy-rs#2075" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "`aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`.", - "meta": { - "bug": false, "breaking": true, "tada": false }, - "author": "jdisanti", - "references": [ - "smithy-rs#76", - "smithy-rs#2129" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "Fluent builder methods on the client are now marked as deprecated when the related operation is deprecated.", - "meta": { - "bug": true, - "breaking": false, - "tada": true - }, - "author": "Velfi", - "references": [ - "aws-sdk-rust#740" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "`SdkError` variants can now be constructed for easier unit testing.", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "jdisanti", + "author": "milesziemer", "references": [ - "smithy-rs#2428", - "smithy-rs#2208" + "smithy-rs#3246" ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2437", - "aws-sdk-rust#600" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "Enable presigning for S3's `HeadObject` operation.", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "Velfi", - "references": [ - "aws-sdk-rust#753", - "smithy-rs#2451" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "The modules in the SDK crates have been reorganized. See the [SDK Crate Reorganization Upgrade Guidance](https://github.com/awslabs/aws-sdk-rust/discussions/752) to see how to fix your code after this change.", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2433" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "Reconnect on transient errors.\n\nIf a transient error (timeout, 500, 503, 503) is encountered, the connection will be evicted from the pool and will not\nbe reused. This is enabled by default for all AWS services. It can be disabled by setting `RetryConfig::with_reconnect_mode`\n\nAlthough there is no API breakage from this change, it alters the client behavior in a way that may cause breakage for customers.\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "aws-sdk-rust#160", - "smithy-rs#2445" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "Update MSRV to 1.66.1", - "meta": { - "bug": false, - "breaking": true, - "tada": true - }, - "author": "Velfi", - "references": [ - "smithy-rs#2467" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "since-commit": "e155c3048b9989fe406ef575d461ea01dfaf294c", + "age": 5 }, { - "message": "Default connector provided by `aws-config` now respects `ConnectorSettings`.\n\nPreviously, it used the timeout settings provided by aws-config. A test from @Oliboy50 has been incorporated to verify this behavior.\n\n**Behavior Change**: Prior to this change, the Hyper client would be shared between all service clients. After this change, each service client will use its own Hyper Client.\nTo revert to the previous behavior, set `HttpConnector::Prebuilt` on `SdkConfig::http_connector`.\n", + "message": "Allow `--` to be used in bucket names for S3", "meta": { "bug": true, "breaking": false, @@ -336,30 +28,13 @@ }, "author": "rcoh", "references": [ - "smithy-rs#2471", - "smithy-rs#2333", - "smithy-rs#2151" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "Remove deprecated `ResolveAwsEndpoint` interfaces.\n[For details see the longform changelog entry](https://github.com/awslabs/aws-sdk-rust/discussions/755).\n", - "meta": { - "bug": false, - "breaking": true, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2390", - "smithy-rs#1784" + "smithy-rs#3253" ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 + "since-commit": "48e3c95a3f10eebd5a637f8e7670c4232cdabbe4", + "age": 4 }, { - "message": "Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001)", + "message": "Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)", "meta": { "bug": false, "breaking": false, @@ -367,195 +42,56 @@ }, "author": "rcoh", "references": [ - "smithy-rs#2474" - ], - "since-commit": "562e196bbfb5c57270b2855479a5c365ba3d2dff", - "age": 3 - }, - { - "message": "Implement std::error::Error#source() properly for the service meta Error enum.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "abusch", - "references": [ - "aws-sdk-rust#784" + "aws-sdk-rust#738", + "aws-sdk-rust#858" ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", + "since-commit": "88970ba88ef45266aade152c7c1da8e90b24c0d7", "age": 2 }, { - "message": "The outputs for event stream operations (for example, S3's SelectObjectContent) now implement the `Sync` auto-trait.", + "message": "Make some properties for IoT types optional. Previously, they defaulted to false, but that isn't how the service actual works.", "meta": { "bug": true, - "breaking": false, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2496" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "The AWS SDK now compiles for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it!", - "meta": { - "bug": false, - "breaking": false, - "tada": true - }, - "author": "eduardomourar", - "references": [ - "smithy-rs#2254" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "S3's `GetObject` will no longer panic when checksum validation is enabled and the target object was uploaded as a multi-part upload.\nHowever, these objects cannot be checksum validated by the SDK due to the way checksums are calculated for multipart uploads.\nFor more information, see [this page](https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums).\n", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "Velfi", - "references": [ - "aws-sdk-rust#764" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "`AppName` is now configurable from within `ConfigLoader`.", - "meta": { - "bug": true, - "breaking": false, - "tada": false - }, - "author": "ysaito1001", - "references": [ - "smithy-rs#2513" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "Add support for omitting session token in canonical requests for SigV4 signing.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "martinjlowm", - "references": [ - "smithy-rs#2473" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "Add `into_segments` method to `AggregatedBytes`, for zero-copy conversions.", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "parker-timmerman", - "references": [ - "smithy-rs#2525" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "Fix bug where an incorrect endpoint was produced for `WriteGetObjectResponse`", - "meta": { - "bug": true, - "breaking": false, + "breaking": true, "tada": false }, - "author": "rcoh", + "author": "milesziemer", "references": [ - "smithy-rs#781", - "aws-sdk-rust#781" + "smithy-rs#3256" ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", + "since-commit": "88970ba88ef45266aade152c7c1da8e90b24c0d7", "age": 2 }, { - "message": "Update the `std::fmt::Debug` implementation for `aws-sigv4::SigningParams` so that it will no longer print sensitive information.", + "message": "Fix `config::Builder::set_credentials_provider` to override a credentials provider previously set.", "meta": { "bug": true, "breaking": false, - "tada": true - }, - "author": "Velfi", - "references": [ - "smithy-rs#2562" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "`aws_smithy_types::date_time::Format` has been re-exported in SDK crates.", - "meta": { - "bug": false, - "breaking": false, "tada": false }, "author": "ysaito1001", "references": [ - "smithy-rs#2534" + "aws-sdk-rust#973", + "smithy-rs#3278" ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "Reduce several instances of credential exposure in the SDK logs:\n- IMDS now suppresses the body of the response from logs\n- `aws-sigv4` marks the `x-amz-session-token` header as sensitive\n- STS & SSO credentials have been manually marked as sensitive which suppresses logging of response bodies for relevant operations\n", - "meta": { - "bug": false, - "breaking": false, - "tada": false - }, - "author": "rcoh", - "references": [ - "smithy-rs#2603" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 + "since-commit": "529b3f03e2b945ea2e5e879183ccfd8e74b7377c", + "age": 1 }, { - "message": "Update MSRV to Rust 1.67.1", + "message": "`config::Config::credentials_provider` has been broken since `release-2023-11-15` and is now marked as `deprecated` explicitly.", "meta": { "bug": false, - "breaking": true, - "tada": false - }, - "author": "jdisanti", - "references": [ - "smithy-rs#2611" - ], - "since-commit": "9201176c9876c9f7bf6599f8a93fe69d25ee0f03", - "age": 2 - }, - { - "message": "Avoid extending IMDS credentials' expiry unconditionally, which may incorrectly extend it beyond what is originally defined; If returned credentials are not stale, use them as they are.", - "meta": { - "bug": true, "breaking": false, "tada": false }, "author": "ysaito1001", "references": [ - "smithy-rs#2687", - "smithy-rs#2694" + "smithy-rs#3251", + "smithy-rs#3278" ], - "since-commit": "3b5fc51a41700c88270145e38fa708eca72dc414", + "since-commit": "529b3f03e2b945ea2e5e879183ccfd8e74b7377c", "age": 1 } ], "aws-sdk-model": [] -} +} \ No newline at end of file diff --git a/aws/SDK_README.md.hb b/aws/SDK_README.md.hb index 7c893114e85..f9aea16f0bf 100644 --- a/aws/SDK_README.md.hb +++ b/aws/SDK_README.md.hb @@ -5,20 +5,24 @@ It gets instantiated and copied into the build artifacts by the `aws:sdk:assembl Available template arguments: - `{{sdk_version_}}` (e.g., `{{sdk_version_aws_config}}` for the `aws-config` crate): the version number of the given crate (just the number, no `v` prefix) - `{{msrv}}`: The MSRV Rust compiler version (just the number, no `v` prefix) +- `{{warning_banner}}`: Show the production warning banner --}} # The AWS SDK for Rust [![Docs](https://img.shields.io/badge/docs-blue)](https://awslabs.github.io/aws-sdk-rust/) ![MSRV](https://img.shields.io/badge/msrv-{{msrv}}-red) [![Usage Guide](https://img.shields.io/badge/Developer_Guide-blue)](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html) -This repo contains the new AWS SDK for Rust (the SDK) and its [public roadmap](https://github.com/orgs/awslabs/projects/50/views/1). +This repo contains the AWS SDK for Rust and its [public roadmap](https://github.com/orgs/awslabs/projects/50/views/1). -**Please Note: The SDK is currently released as a developer preview and is intended strictly for feedback purposes only. Do not use this SDK for production workloads.** +{{#if warning_banner}} +**Please Note**: The SDK is currently released as a developer preview, without support or assistance for use on production workloads. Any use in production is at your own risk. +{{/if}} -The SDK is code generated from [Smithy models](https://awslabs.github.io/smithy/) that represent each AWS service. The code used to generate the SDK can be found in [smithy-rs](https://github.com/awslabs/smithy-rs). +The SDK is code generated from [Smithy models](https://smithy.io/2.0/index.html) that represent each AWS service. +The code used to generate the SDK can be found in [smithy-rs](https://github.com/smithy-lang/smithy-rs). ## Getting Started with the SDK @@ -33,7 +37,7 @@ The SDK provides one crate per AWS service. You must add [Tokio](https://crates. ```toml [dependencies] - aws-config = "{{sdk_version_aws_config}}" + aws-config = { version= "{{sdk_version_aws_config}}", features = ["behavior-version-latest"] } aws-sdk-dynamodb = "{{sdk_version_aws_sdk_dynamodb}}" tokio = { version = "1", features = ["full"] } ``` @@ -67,7 +71,8 @@ In order to use the SDK, you must already have Rust and Cargo installed. If you ## Using the SDK -While we're working on the SDK, detailed usage instructions will be added to the [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html). Please suggest additional sections for the guide by opening an issue and describing what you are trying to do. +Detailed usage instructions are available in the [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html). +Suggestions for additional sections or improvements for the guide are welcome. Please open an issue describing what you are trying to do. ## Getting Help * [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html) @@ -82,7 +87,9 @@ While we're working on the SDK, detailed usage instructions will be added to the The SDK uses **GitHub Issues** to track feature requests and issues with the SDK. In addition, we use **GitHub Projects** to provide users with a high level view of our roadmap and the features we're actively working on. -You can provide feedback or report a bug by submitting a **GitHub issue**. This is the preferred mechanism to give feedback so that other users can engage in the conversation, +1 issues, etc. Issues you open will be evaluated for our roadmap in the Developer Preview launch. +You can provide feedback or report a bug by submitting a **GitHub issue**. +This is the preferred mechanism to give feedback so that other users can engage in the conversation, +1 issues, etc. +Issues you open will be evaluated for our roadmap. ### Contributing @@ -94,8 +101,8 @@ The SDK currently requires a minimum of Rust {{msrv}}, and is not guaranteed to ## Additional Resources -- Design docs - Design documentation for the SDK lives in the [design folder of smithy-rs](https://github.com/awslabs/smithy-rs/tree/main/design). -- Runtime / Handwritten code: The Rust Runtime code that underpins the SDK can be accessed [here](https://github.com/awslabs/smithy-rs/tree/main/rust-runtime) and [here](https://github.com/awslabs/smithy-rs/tree/main/aws/rust-runtime). This code is copied into this repo as part of code generation. +- Design docs - Design documentation for the SDK lives in the [design folder of smithy-rs](https://github.com/smithy-lang/smithy-rs/tree/main/design). +- Runtime / Handwritten code: The Rust Runtime code that underpins the SDK can be accessed [here](https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime) and [here](https://github.com/smithy-lang/smithy-rs/tree/main/aws/rust-runtime). This code is copied into this repo as part of code generation. - [Code Examples](./examples) - [API reference documentation (rustdoc)](https://awslabs.github.io/aws-sdk-rust/) diff --git a/aws/rust-runtime/aws-config/Cargo.toml b/aws/rust-runtime/aws-config/Cargo.toml index 54add78bb8d..b124e10dd4f 100644 --- a/aws/rust-runtime/aws-config/Cargo.toml +++ b/aws/rust-runtime/aws-config/Cargo.toml @@ -6,28 +6,32 @@ description = "AWS SDK config and credential provider implementations." edition = "2021" exclude = ["test-data/*", "integration-tests/*"] license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] -client-hyper = ["aws-smithy-client/client-hyper"] -rustls = ["aws-smithy-client/rustls", "client-hyper"] -native-tls = [] -allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI -rt-tokio = ["aws-smithy-async/rt-tokio", "tokio/rt"] -credentials-sso = ["dep:aws-sdk-sso", "dep:ring", "dep:hex", "dep:zeroize"] +behavior-version-latest = [] +client-hyper = ["aws-smithy-runtime/connector-hyper-0-14-x"] +rustls = ["aws-smithy-runtime/tls-rustls", "client-hyper"] +rt-tokio = ["aws-smithy-async/rt-tokio", "aws-smithy-runtime/rt-tokio", "tokio/rt"] +sso = ["dep:aws-sdk-sso", "dep:aws-sdk-ssooidc", "dep:ring", "dep:hex", "dep:zeroize", "aws-smithy-runtime-api/http-auth"] +credentials-process = ["tokio/process"] -default = ["client-hyper", "rustls", "rt-tokio", "credentials-sso"] +default = ["client-hyper", "rustls", "rt-tokio", "credentials-process", "sso"] + +# deprecated: this feature does nothing +allow-compilation = [] [dependencies] -aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types" } +aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../sdk/build/aws-sdk/sdk/aws-http" } aws-sdk-sts = { path = "../../sdk/build/aws-sdk/sdk/sts", default-features = false } aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async" } -aws-smithy-client = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-client", default-features = false } aws-smithy-http = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-http" } -aws-smithy-http-tower = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-http-tower" } aws-smithy-json = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-json" } +aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client"] } +aws-smithy-runtime-api = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-types" } +aws-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-runtime" } aws-types = { path = "../../sdk/build/aws-sdk/sdk/aws-types" } hyper = { version = "0.14.26", default-features = false } time = { version = "0.3.4", features = ["parsing"] } @@ -35,19 +39,23 @@ tokio = { version = "1.13.1", features = ["sync"] } tracing = { version = "0.1" } # implementation detail of IMDS credentials provider -fastrand = "1" +fastrand = "2.0.0" bytes = "1.1.0" http = "0.2.4" -tower = { version = "0.4.8" } # implementation detail of SSO credential caching aws-sdk-sso = { path = "../../sdk/build/aws-sdk/sdk/sso", default-features = false, optional = true } -ring = { version = "0.16", optional = true } +ring = { version = "0.17.5", optional = true } hex = { version = "0.4.3", optional = true } zeroize = { version = "1", optional = true } +# implementation detail of SSO OIDC `CreateToken` for SSO token providers +aws-sdk-ssooidc = { path = "../../sdk/build/aws-sdk/sdk/ssooidc", default-features = false, optional = true } + [dev-dependencies] +aws-smithy-runtime = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x", "test-util"] } +aws-smithy-runtime-api = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } futures-util = { version = "0.3.16", default-features = false } tracing-test = "0.2.1" tracing-subscriber = { version = "0.3.16", features = ["fmt", "json"] } @@ -61,14 +69,19 @@ arbitrary = "1.3" serde = { version = "1", features = ["derive"] } serde_json = "1" -aws-credential-types = { path = "../../sdk/build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-smithy-client = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-client", features = ["test-util"] } - # used for a usage example hyper-rustls = { version = "0.24", features = ["webpki-tokio", "http2", "http1"] } +aws-smithy-async = { path = "../../sdk/build/aws-sdk/sdk/aws-smithy-async", features = ["rt-tokio", "test-util"] } + [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-config", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-config/README.md b/aws/rust-runtime/aws-config/README.md index 91f68420f02..1626006dbf5 100644 --- a/aws/rust-runtime/aws-config/README.md +++ b/aws/rust-runtime/aws-config/README.md @@ -2,8 +2,6 @@ AWS SDK config and credential provider implementations. -**Please Note: The SDK is currently released as an alpha and is intended strictly for feedback purposes only. Do not use this SDK for production workloads.** - The implementations can be used either via the default chain implementation `from_env`/`ConfigLoader` or ad-hoc individual credential and region providers. A `ConfigLoader` can combine different configuration sources into an AWS shared-config `Config`. The `Config` can then be used to configure one or more AWS service clients. @@ -46,7 +44,8 @@ tokio = { version = "1", features = ["full"] } ## Using the SDK -Until the SDK is released, we will be adding information about using the SDK to the [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html). Feel free to suggest additional sections for the guide by opening an issue and describing what you are trying to do. +Detailed usage instructions are available in the [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html). +Suggestions for additional sections or improvements for the guide are welcome. Please open an issue describing what you are trying to do. ## Getting Help @@ -68,5 +67,5 @@ This project is licensed under the Apache-2.0 License. [Usage examples]: https://github.com/awslabs/aws-sdk-rust/tree/main/examples -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. diff --git a/aws/rust-runtime/aws-config/clippy.toml b/aws/rust-runtime/aws-config/clippy.toml new file mode 120000 index 00000000000..85f6167cb1c --- /dev/null +++ b/aws/rust-runtime/aws-config/clippy.toml @@ -0,0 +1 @@ +../clippy.toml \ No newline at end of file diff --git a/aws/rust-runtime/aws-config/examples/imds.rs b/aws/rust-runtime/aws-config/examples/imds.rs index 3722835e59b..b1da233363f 100644 --- a/aws/rust-runtime/aws-config/examples/imds.rs +++ b/aws/rust-runtime/aws-config/examples/imds.rs @@ -12,8 +12,8 @@ async fn main() -> Result<(), Box> { use aws_config::imds::Client; - let imds = Client::builder().build().await?; + let imds = Client::builder().build(); let instance_id = imds.get("/latest/meta-data/instance-id").await?; - println!("current instance id: {}", instance_id); + println!("current instance id: {}", instance_id.as_ref()); Ok(()) } diff --git a/aws/rust-runtime/aws-config/external-types.toml b/aws/rust-runtime/aws-config/external-types.toml index b90a84885cb..38a34bd7864 100644 --- a/aws/rust-runtime/aws-config/external-types.toml +++ b/aws/rust-runtime/aws-config/external-types.toml @@ -7,19 +7,24 @@ allowed_external_types = [ "aws_credential_types::provider::ProvideCredentials", "aws_credential_types::provider::Result", "aws_credential_types::provider::SharedCredentialsProvider", - "aws_sdk_sts::types::_policy_descriptor_type::PolicyDescriptorType", "aws_smithy_async::rt::sleep::AsyncSleep", + "aws_smithy_async::rt::sleep::SharedAsyncSleep", + "aws_smithy_async::time::SharedTimeSource", "aws_smithy_async::time::TimeSource", - "aws_smithy_client::bounds::SmithyConnector", - "aws_smithy_client::conns::default_connector::default_connector", - "aws_smithy_client::erase::DynConnector", - "aws_smithy_client::erase::boxclone::BoxCloneService", - "aws_smithy_client::http_connector::ConnectorSettings", - "aws_smithy_client::http_connector::HttpConnector", - "aws_smithy_http::body::SdkBody", - "aws_smithy_http::endpoint", - "aws_smithy_http::endpoint::error::InvalidEndpointError", - "aws_smithy_http::result::SdkError", + "aws_smithy_runtime_api::box_error::BoxError", + "aws_smithy_runtime::client::identity::cache::IdentityCache", + "aws_smithy_runtime::client::identity::cache::lazy::LazyCacheBuilder", + "aws_smithy_runtime_api::client::behavior_version::BehaviorVersion", + "aws_smithy_runtime_api::client::dns::ResolveDns", + "aws_smithy_runtime_api::client::dns::SharedDnsResolver", + "aws_smithy_runtime_api::client::http::HttpClient", + "aws_smithy_runtime_api::client::http::SharedHttpClient", + "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", + "aws_smithy_runtime_api::client::identity::ResolveIdentity", + "aws_smithy_runtime_api::client::orchestrator::HttpResponse", + "aws_smithy_runtime_api::client::result::SdkError", + "aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig", + "aws_smithy_types::body::SdkBody", "aws_smithy_types::retry", "aws_smithy_types::retry::*", "aws_smithy_types::timeout", @@ -27,12 +32,4 @@ allowed_external_types = [ "aws_smithy_types::timeout::TimeoutConfig", "aws_smithy_types::timeout::TimeoutConfigBuilder", "aws_types::*", - "http::response::Response", - "http::uri::Uri", - "tower_service::Service", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if the following should be exposed - "hyper::client::connect::Connection", - "tokio::io::async_read::AsyncRead", - "tokio::io::async_write::AsyncWrite", ] diff --git a/aws/rust-runtime/aws-config/src/connector.rs b/aws/rust-runtime/aws-config/src/connector.rs deleted file mode 100644 index c924a072bf7..00000000000 --- a/aws/rust-runtime/aws-config/src/connector.rs +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Functionality related to creating new HTTP Connectors - -use aws_smithy_client::erase::DynConnector; - -// unused when all crate features are disabled -/// Unwrap an [`Option`](aws_smithy_client::erase::DynConnector), and panic with a helpful error message if it's `None` -pub(crate) fn expect_connector(connector: Option) -> DynConnector { - connector.expect("No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this.") -} - -#[cfg(feature = "client-hyper")] -pub use aws_smithy_client::conns::default_connector; - -#[cfg(all(feature = "native-tls", not(feature = "allow-compilation")))] -compile_error!("Feature native-tls has been removed. For upgrade instructions, see: https://awslabs.github.io/smithy-rs/design/transport/connector.html"); - -/// Given `ConnectorSettings` and a [`SharedAsyncSleep`](aws_smithy_async::rt::sleep::SharedAsyncSleep), create a `DynConnector` from defaults depending on what cargo features are activated. -#[cfg(not(feature = "client-hyper"))] -pub fn default_connector( - _settings: &aws_smithy_client::http_connector::ConnectorSettings, - _sleep: Option, -) -> Option { - None -} diff --git a/aws/rust-runtime/aws-config/src/credential_process.rs b/aws/rust-runtime/aws-config/src/credential_process.rs index c91e6a7ec8c..a46c6298c6b 100644 --- a/aws/rust-runtime/aws-config/src/credential_process.rs +++ b/aws/rust-runtime/aws-config/src/credential_process.rs @@ -3,57 +3,20 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "credentials-process")] + //! Credentials Provider for external process use crate::json_credentials::{json_parse_loop, InvalidJsonCredentials, RefreshableCredentials}; +use crate::sensitive_command::CommandWithSensitiveArgs; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; use aws_credential_types::Credentials; use aws_smithy_json::deserialize::Token; -use std::fmt; use std::process::Command; use std::time::SystemTime; use time::format_description::well_known::Rfc3339; use time::OffsetDateTime; -#[derive(Clone)] -pub(crate) struct CommandWithSensitiveArgs(T); - -impl CommandWithSensitiveArgs -where - T: AsRef, -{ - pub(crate) fn new(value: T) -> Self { - Self(value) - } - - pub(crate) fn unredacted(&self) -> &str { - self.0.as_ref() - } -} - -impl fmt::Display for CommandWithSensitiveArgs -where - T: AsRef, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - // Security: The arguments for command must be redacted since they can be sensitive - let command = self.0.as_ref(); - match command.find(char::is_whitespace) { - Some(index) => write!(f, "{} ** arguments redacted **", &command[0..index]), - None => write!(f, "{}", command), - } - } -} - -impl fmt::Debug for CommandWithSensitiveArgs -where - T: AsRef, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", format!("{}", self)) - } -} - /// External process credentials provider /// /// This credentials provider runs a configured external process and parses @@ -109,11 +72,17 @@ impl CredentialProcessProvider { } } + pub(crate) fn from_command(command: &CommandWithSensitiveArgs<&str>) -> Self { + Self { + command: command.to_owned_string(), + } + } + async fn credentials(&self) -> provider::Result { // Security: command arguments must be redacted at debug level tracing::debug!(command = %self.command, "loading credentials from external process"); - let mut command = if cfg!(windows) { + let command = if cfg!(windows) { let mut command = Command::new("cmd.exe"); command.args(["/C", self.command.unredacted()]); command @@ -122,16 +91,18 @@ impl CredentialProcessProvider { command.args(["-c", self.command.unredacted()]); command }; - - let output = command.output().map_err(|e| { - CredentialsError::provider_error(format!( - "Error retrieving credentials from external process: {}", - e - )) - })?; + let output = tokio::process::Command::from(command) + .output() + .await + .map_err(|e| { + CredentialsError::provider_error(format!( + "Error retrieving credentials from external process: {}", + e + )) + })?; // Security: command arguments can be logged at trace level - tracing::trace!(command = ?command, status = ?output.status, "executed command (unredacted)"); + tracing::trace!(command = ?self.command, status = ?output.status, "executed command (unredacted)"); if !output.status.success() { let reason = @@ -261,9 +232,10 @@ pub(crate) fn parse_credential_process_json_credentials( mod test { use crate::credential_process::CredentialProcessProvider; use aws_credential_types::provider::ProvideCredentials; - use std::time::SystemTime; + use std::time::{Duration, SystemTime}; use time::format_description::well_known::Rfc3339; use time::OffsetDateTime; + use tokio::time::timeout; #[tokio::test] async fn test_credential_process() { @@ -285,4 +257,12 @@ mod test { ) ); } + + #[tokio::test] + async fn credentials_process_timeouts() { + let provider = CredentialProcessProvider::new(String::from("sleep 1000")); + let _creds = timeout(Duration::from_millis(1), provider.provide_credentials()) + .await + .expect_err("timeout forced"); + } } diff --git a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs index f6fce3d7305..4507248a41a 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/app_name.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/app_name.rs @@ -3,16 +3,33 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::environment::app_name::EnvironmentVariableAppNameProvider; -use crate::profile::app_name; use crate::provider_config::ProviderConfig; -use aws_types::app_name::AppName; +use crate::standard_property::{PropertyResolutionError, StandardProperty}; +use aws_smithy_types::error::display::DisplayErrorContext; +use aws_types::app_name::{AppName, InvalidAppName}; /// Default App Name Provider chain /// /// This provider will check the following sources in order: -/// 1. [Environment variables](EnvironmentVariableAppNameProvider) -/// 2. [Profile file](crate::profile::app_name::ProfileFileAppNameProvider) +/// 1. Environment variables: `AWS_SDK_UA_APP_ID` +/// 2. Profile files from the key `sdk_ua_app_id` +/// +#[doc = include_str!("../profile/location_of_profile_files.md")] +/// +/// # Examples +/// +/// **Loads "my-app" as the app name** +/// ```ini +/// [default] +/// sdk_ua_app_id = my-app +/// ``` +/// +/// **Loads "my-app" as the app name _if and only if_ the `AWS_PROFILE` environment variable +/// is set to `other`.** +/// ```ini +/// [profile other] +/// sdk_ua_app_id = my-app +/// ``` pub fn default_provider() -> Builder { Builder::default() } @@ -20,32 +37,50 @@ pub fn default_provider() -> Builder { /// Default provider builder for [`AppName`] #[derive(Debug, Default)] pub struct Builder { - env_provider: EnvironmentVariableAppNameProvider, - profile_file: app_name::Builder, + provider_config: ProviderConfig, } impl Builder { - #[doc(hidden)] /// Configure the default chain /// /// Exposed for overriding the environment when unit-testing providers - pub fn configure(mut self, configuration: &ProviderConfig) -> Self { - self.env_provider = EnvironmentVariableAppNameProvider::new_with_env(configuration.env()); - self.profile_file = self.profile_file.configure(configuration); - self + pub(crate) fn configure(self, configuration: &ProviderConfig) -> Self { + Self { + provider_config: configuration.clone(), + } } /// Override the profile name used by this provider pub fn profile_name(mut self, name: &str) -> Self { - self.profile_file = self.profile_file.profile_name(name); + self.provider_config = self.provider_config.with_profile_name(name.to_string()); self } + async fn fallback_app_name( + &self, + ) -> Result, PropertyResolutionError> { + StandardProperty::new() + .profile("sdk-ua-app-id") + .validate(&self.provider_config, |name| AppName::new(name.to_string())) + .await + } + /// Build an [`AppName`] from the default chain pub async fn app_name(self) -> Option { - self.env_provider - .app_name() - .or(self.profile_file.build().app_name().await) + let standard = StandardProperty::new() + .env("AWS_SDK_UA_APP_ID") + .profile("sdk_ua_app_id") + .validate(&self.provider_config, |name| AppName::new(name.to_string())) + .await; + let with_fallback = match standard { + Ok(None) => self.fallback_app_name().await, + other => other, + }; + + with_fallback.map_err( + |err| tracing::warn!(err = %DisplayErrorContext(&err), "invalid value for App Name setting"), + ) + .unwrap_or(None) } } @@ -54,7 +89,8 @@ mod tests { use super::*; use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; use crate::provider_config::ProviderConfig; - use crate::test_case::{no_traffic_connector, InstantSleep}; + use crate::test_case::{no_traffic_client, InstantSleep}; + use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; use aws_types::os_shim_internal::{Env, Fs}; #[tokio::test] @@ -69,7 +105,7 @@ mod tests { &ProviderConfig::no_configuration() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()), + .with_http_client(no_traffic_client()), ) .app_name() .await; @@ -80,14 +116,11 @@ mod tests { // test that overriding profile_name on the root level is deprecated #[tokio::test] async fn profile_name_override() { - let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk-ua-app-id = correct")]); - let conf = crate::from_env() - .configure( - ProviderConfig::empty() - .with_fs(fs) - .with_sleep(InstantSleep) - .with_http_connector(no_traffic_connector()), - ) + let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk_ua_app_id = correct")]); + let conf = crate::defaults(BehaviorVersion::latest()) + .sleep_impl(InstantSleep) + .fs(fs) + .http_client(no_traffic_client()) .profile_name("custom") .profile_files( ProfileFiles::builder() @@ -101,6 +134,23 @@ mod tests { #[tokio::test] async fn load_from_profile() { + let fs = Fs::from_slice(&[("test_config", "[default]\nsdk_ua_app_id = correct")]); + let env = Env::from_slice(&[("AWS_CONFIG_FILE", "test_config")]); + let app_name = Builder::default() + .configure( + &ProviderConfig::empty() + .with_fs(fs) + .with_env(env) + .with_http_client(no_traffic_client()), + ) + .app_name() + .await; + + assert_eq!(Some(AppName::new("correct").unwrap()), app_name); + } + + #[tokio::test] + async fn load_from_profile_old_name() { let fs = Fs::from_slice(&[("test_config", "[default]\nsdk-ua-app-id = correct")]); let env = Env::from_slice(&[("AWS_CONFIG_FILE", "test_config")]); let app_name = Builder::default() @@ -108,7 +158,7 @@ mod tests { &ProviderConfig::empty() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()), + .with_http_client(no_traffic_client()), ) .app_name() .await; diff --git a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs index 115cafcab16..7c9aaa06e71 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/credentials.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/credentials.rs @@ -199,6 +199,8 @@ impl Builder { #[cfg(test)] mod test { use aws_credential_types::provider::ProvideCredentials; + use aws_smithy_async::time::StaticTimeSource; + use std::time::UNIX_EPOCH; use crate::default_provider::credentials::DefaultCredentialsChain; @@ -224,7 +226,7 @@ mod test { /// make_test!(live: test_name) /// ``` macro_rules! make_test { - ($name: ident $(#[$m:meta])*) => { + ($name:ident $(#[$m:meta])*) => { make_test!($name, execute, $(#[$m])*); }; (update: $name:ident) => { @@ -233,13 +235,13 @@ mod test { (live: $name:ident) => { make_test!($name, execute_from_live_traffic); }; - ($name: ident, $func: ident, $(#[$m:meta])*) => { + ($name:ident, $func:ident, $(#[$m:meta])*) => { make_test!($name, $func, std::convert::identity $(, #[$m])*); }; - ($name: ident, builder: $provider_config_builder: expr) => { + ($name:ident, builder: $provider_config_builder:expr) => { make_test!($name, execute, $provider_config_builder); }; - ($name: ident, $func: ident, $provider_config_builder: expr $(, #[$m:meta])*) => { + ($name:ident, $func:ident, $provider_config_builder:expr $(, #[$m:meta])*) => { $(#[$m])* #[tokio::test] async fn $name() { @@ -279,37 +281,34 @@ mod test { make_test!(imds_no_iam_role); make_test!(imds_default_chain_error); make_test!(imds_default_chain_success, builder: |config| { - config.with_time_source(aws_credential_types::time_source::TimeSource::testing( - &aws_credential_types::time_source::TestingTimeSource::new(std::time::UNIX_EPOCH), - )) + config.with_time_source(StaticTimeSource::new(UNIX_EPOCH)) }); make_test!(imds_assume_role); make_test!(imds_config_with_no_creds, builder: |config| { - config.with_time_source(aws_credential_types::time_source::TimeSource::testing( - &aws_credential_types::time_source::TestingTimeSource::new(std::time::UNIX_EPOCH), - )) + config.with_time_source(StaticTimeSource::new(UNIX_EPOCH)) }); make_test!(imds_disabled); make_test!(imds_default_chain_retries, builder: |config| { - config.with_time_source(aws_credential_types::time_source::TimeSource::testing( - &aws_credential_types::time_source::TestingTimeSource::new(std::time::UNIX_EPOCH), - )) + config.with_time_source(StaticTimeSource::new(UNIX_EPOCH)) }); make_test!(ecs_assume_role); make_test!(ecs_credentials); make_test!(ecs_credentials_invalid_profile); - #[cfg(not(feature = "credentials-sso"))] - make_test!(sso_assume_role #[should_panic(expected = "This behavior requires following cargo feature(s) enabled: credentials-sso")]); - #[cfg(not(feature = "credentials-sso"))] - make_test!(sso_no_token_file #[should_panic(expected = "This behavior requires following cargo feature(s) enabled: credentials-sso")]); + #[cfg(not(feature = "sso"))] + make_test!(sso_assume_role #[should_panic(expected = "This behavior requires following cargo feature(s) enabled: sso")]); + #[cfg(not(feature = "sso"))] + make_test!(sso_no_token_file #[should_panic(expected = "This behavior requires following cargo feature(s) enabled: sso")]); - #[cfg(feature = "credentials-sso")] + #[cfg(feature = "sso")] make_test!(sso_assume_role); - #[cfg(feature = "credentials-sso")] + #[cfg(feature = "sso")] make_test!(sso_no_token_file); + #[cfg(feature = "credentials-sso")] + make_test!(e2e_fips_and_dual_stack_sso); + #[tokio::test] async fn profile_name_override() { let conf = @@ -335,16 +334,15 @@ mod test { async fn no_providers_configured_err() { use crate::provider_config::ProviderConfig; use aws_credential_types::provider::error::CredentialsError; - use aws_credential_types::time_source::TimeSource; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::boxclone::BoxCloneService; - use aws_smithy_client::never::NeverConnected; + use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; + use aws_smithy_runtime::client::http::test_util::NeverTcpConnector; tokio::time::pause(); let conf = ProviderConfig::no_configuration() - .with_tcp_connector(BoxCloneService::new(NeverConnected::new())) - .with_time_source(TimeSource::default()) - .with_sleep(TokioSleep::new()); + .with_http_client(HyperClientBuilder::new().build(NeverTcpConnector::new())) + .with_time_source(StaticTimeSource::new(UNIX_EPOCH)) + .with_sleep_impl(TokioSleep::new()); let provider = DefaultCredentialsChain::builder() .configure(conf) .build() diff --git a/aws/rust-runtime/aws-config/src/default_provider/region.rs b/aws/rust-runtime/aws-config/src/default_provider/region.rs index f7b882446e8..db82b720b98 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/region.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/region.rs @@ -45,11 +45,10 @@ pub struct Builder { } impl Builder { - #[doc(hidden)] /// Configure the default chain /// /// Exposed for overriding the environment when unit-testing providers - pub fn configure(mut self, configuration: &ProviderConfig) -> Self { + pub(crate) fn configure(mut self, configuration: &ProviderConfig) -> Self { self.env_provider = EnvironmentVariableRegionProvider::new_with_env(configuration.env()); self.profile_file = self.profile_file.configure(configuration); self.imds = self.imds.configure(configuration); diff --git a/aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs b/aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs index 1a173682c3d..064b80e2ebc 100644 --- a/aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs +++ b/aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs @@ -33,7 +33,7 @@ impl Builder { /// Resolve default timeout configuration pub async fn timeout_config(self) -> TimeoutConfig { - // TODO(https://github.com/awslabs/smithy-rs/issues/1732): Implement complete timeout defaults specification + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1732): Implement complete timeout defaults specification TimeoutConfig::builder() .connect_timeout(SDK_DEFAULT_CONNECT_TIMEOUT) .build() diff --git a/aws/rust-runtime/aws-config/src/ecs.rs b/aws/rust-runtime/aws-config/src/ecs.rs index 17fab949f5b..ed0125b69a2 100644 --- a/aws/rust-runtime/aws-config/src/ecs.rs +++ b/aws/rust-runtime/aws-config/src/ecs.rs @@ -46,24 +46,21 @@ //! } //! ``` -use std::error::Error; -use std::fmt::{Display, Formatter}; -use std::io; -use std::net::IpAddr; - +use crate::http_credential_provider::HttpCredentialProvider; +use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; -use aws_smithy_client::erase::boxclone::BoxCloneService; use aws_smithy_http::endpoint::apply_endpoint; +use aws_smithy_runtime_api::client::dns::{ResolveDns, ResolveDnsError, SharedDnsResolver}; +use aws_smithy_runtime_api::client::http::HttpConnectorSettings; +use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::error::display::DisplayErrorContext; -use http::uri::{InvalidUri, Scheme}; -use http::{HeaderValue, Uri}; -use tower::{Service, ServiceExt}; - -use crate::http_credential_provider::HttpCredentialProvider; -use crate::provider_config::ProviderConfig; -use aws_smithy_client::http_connector::ConnectorSettings; use aws_types::os_shim_internal::Env; use http::header::InvalidHeaderValue; +use http::uri::{InvalidUri, PathAndQuery, Scheme}; +use http::{HeaderValue, Uri}; +use std::error::Error; +use std::fmt::{Display, Formatter}; +use std::net::IpAddr; use std::time::Duration; use tokio::sync::OnceCell; @@ -143,14 +140,14 @@ enum Provider { } impl Provider { - async fn uri(env: Env, dns: Option) -> Result { + async fn uri(env: Env, dns: Option) -> Result { let relative_uri = env.get(ENV_RELATIVE_URI).ok(); let full_uri = env.get(ENV_FULL_URI).ok(); if let Some(relative_uri) = relative_uri { Self::build_full_uri(relative_uri) } else if let Some(full_uri) = full_uri { - let mut dns = dns.or_else(tokio_dns); - validate_full_uri(&full_uri, dns.as_mut()) + let dns = dns.or_else(default_dns); + validate_full_uri(&full_uri, dns) .await .map_err(|err| EcsConfigurationError::InvalidFullUri { err, uri: full_uri }) } else { @@ -166,15 +163,24 @@ impl Provider { Err(EcsConfigurationError::NotConfigured) => return Provider::NotConfigured, Err(err) => return Provider::InvalidConfiguration(err), }; + let path = uri.path().to_string(); + let endpoint = { + let mut parts = uri.into_parts(); + parts.path_and_query = Some(PathAndQuery::from_static("/")); + Uri::from_parts(parts) + } + .expect("parts will be valid") + .to_string(); + let http_provider = HttpCredentialProvider::builder() .configure(&provider_config) - .connector_settings( - ConnectorSettings::builder() + .http_connector_settings( + HttpConnectorSettings::builder() .connect_timeout(DEFAULT_CONNECT_TIMEOUT) .read_timeout(DEFAULT_READ_TIMEOUT) .build(), ) - .build("EcsContainer", uri); + .build("EcsContainer", &endpoint, path); Provider::Configured(http_provider) } @@ -252,7 +258,7 @@ impl Error for EcsConfigurationError { #[derive(Default, Debug, Clone)] pub struct Builder { provider_config: Option, - dns: Option, + dns: Option, connect_timeout: Option, read_timeout: Option, } @@ -266,10 +272,10 @@ impl Builder { /// Override the DNS resolver used to validate URIs /// - /// URIs must refer to loopback addresses. The `DnsService` is used to retrieve IP addresses for - /// a given domain. - pub fn dns(mut self, dns: DnsService) -> Self { - self.dns = Some(dns); + /// URIs must refer to loopback addresses. The [`ResolveDns`](aws_smithy_runtime_api::client::dns::ResolveDns) + /// implementation is used to retrieve IP addresses for a given domain. + pub fn dns(mut self, dns: impl ResolveDns + 'static) -> Self { + self.dns = Some(dns.into_shared()); self } @@ -310,9 +316,9 @@ enum InvalidFullUriErrorKind { #[non_exhaustive] InvalidUri(InvalidUri), - /// No Dns service was provided + /// No Dns resolver was provided #[non_exhaustive] - NoDnsService, + NoDnsResolver, /// The URI did not specify a host #[non_exhaustive] @@ -323,7 +329,7 @@ enum InvalidFullUriErrorKind { NotLoopback, /// DNS lookup failed when attempting to resolve the host to an IP Address for validation. - DnsLookupFailed(io::Error), + DnsLookupFailed(ResolveDnsError), } /// Invalid Full URI @@ -349,7 +355,7 @@ impl Display for InvalidFullUriError { "failed to perform DNS lookup while validating URI" ) } - NoDnsService => write!(f, "no DNS service was provided. Enable `rt-tokio` or provide a `dns` service to the builder.") + NoDnsResolver => write!(f, "no DNS resolver was provided. Enable `rt-tokio` or provide a `dns` resolver to the builder.") } } } @@ -359,7 +365,7 @@ impl Error for InvalidFullUriError { use InvalidFullUriErrorKind::*; match &self.kind { InvalidUri(err) => Some(err), - DnsLookupFailed(err) => Some(err), + DnsLookupFailed(err) => Some(err as _), _ => None, } } @@ -371,9 +377,6 @@ impl From for InvalidFullUriError { } } -/// Dns resolver interface -pub type DnsService = BoxCloneService, io::Error>; - /// Validate that `uri` is valid to be used as a full provider URI /// Either: /// 1. The URL is uses `https` @@ -382,7 +385,7 @@ pub type DnsService = BoxCloneService, io::Error>; /// the credentials provider will return `CredentialsError::InvalidConfiguration` async fn validate_full_uri( uri: &str, - dns: Option<&mut DnsService>, + dns: Option, ) -> Result { let uri = uri .parse::() @@ -395,12 +398,11 @@ async fn validate_full_uri( let is_loopback = match host.parse::() { Ok(addr) => addr.is_loopback(), Err(_domain_name) => { - let dns = dns.ok_or(InvalidFullUriErrorKind::NoDnsService)?; - dns.ready().await.map_err(InvalidFullUriErrorKind::DnsLookupFailed)? - .call(host.to_owned()) - .await - .map_err(InvalidFullUriErrorKind::DnsLookupFailed)? - .iter() + let dns = dns.ok_or(InvalidFullUriErrorKind::NoDnsResolver)?; + dns.resolve_dns(host) + .await + .map_err(|err| InvalidFullUriErrorKind::DnsLookupFailed(ResolveDnsError::new(err)))? + .iter() .all(|addr| { if !addr.is_loopback() { tracing::warn!( @@ -418,87 +420,49 @@ async fn validate_full_uri( } } +/// Default DNS resolver impl +/// +/// DNS resolution is required to validate that provided URIs point to the loopback interface #[cfg(any(not(feature = "rt-tokio"), target_family = "wasm"))] -fn tokio_dns() -> Option { +fn default_dns() -> Option { None } - -/// DNS resolver that uses tokio::spawn_blocking -/// -/// DNS resolution is required to validate that provided URIs point to the loopback interface #[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))] -fn tokio_dns() -> Option { - use aws_smithy_client::erase::boxclone::BoxFuture; - use std::io::ErrorKind; - use std::net::ToSocketAddrs; - use std::task::{Context, Poll}; - - #[derive(Clone)] - struct TokioDns; - impl Service for TokioDns { - type Response = Vec; - type Error = io::Error; - type Future = BoxFuture; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: String) -> Self::Future { - Box::pin(async move { - let result = tokio::task::spawn_blocking(move || (req, 0).to_socket_addrs()).await; - match result { - Err(join_failure) => Err(io::Error::new(ErrorKind::Other, join_failure)), - Ok(Ok(dns_result)) => { - Ok(dns_result.into_iter().map(|addr| addr.ip()).collect()) - } - Ok(Err(dns_failure)) => Err(dns_failure), - } - }) - } - } - Some(BoxCloneService::new(TokioDns)) +fn default_dns() -> Option { + use aws_smithy_runtime::client::dns::TokioDnsResolver; + Some(TokioDnsResolver::new().into_shared()) } #[cfg(test)] mod test { - use aws_smithy_client::erase::boxclone::BoxCloneService; - use aws_smithy_client::never::NeverService; - use futures_util::FutureExt; - use http::Uri; - use serde::Deserialize; - use tracing_test::traced_test; - - use crate::ecs::{ - tokio_dns, validate_full_uri, Builder, EcsCredentialsProvider, InvalidFullUriError, - InvalidFullUriErrorKind, Provider, - }; + use super::*; use crate::provider_config::ProviderConfig; use crate::test_case::GenericTestResult; - use aws_credential_types::provider::ProvideCredentials; use aws_credential_types::Credentials; - use aws_types::os_shim_internal::Env; - + use aws_smithy_async::future::never::Never; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::TestConnection; - use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_smithy_runtime_api::client::dns::DnsFuture; + use aws_smithy_runtime_api::client::http::HttpClient; + use aws_smithy_runtime_api::shared::IntoShared; + use aws_smithy_types::body::SdkBody; + use aws_types::os_shim_internal::Env; + use futures_util::FutureExt; use http::header::AUTHORIZATION; + use http::Uri; + use serde::Deserialize; use std::collections::HashMap; use std::error::Error; - use std::future::Ready; - use std::io; use std::net::IpAddr; - use std::task::{Context, Poll}; use std::time::{Duration, UNIX_EPOCH}; - use tower::Service; + use tracing_test::traced_test; - fn provider(env: Env, connector: DynConnector) -> EcsCredentialsProvider { + fn provider(env: Env, http_client: impl HttpClient + 'static) -> EcsCredentialsProvider { let provider_config = ProviderConfig::empty() .with_env(env) - .with_http_connector(connector) - .with_sleep(TokioSleep::new()); + .with_http_client(http_client) + .with_sleep_impl(TokioSleep::new()); Builder::default().configure(&provider_config).build() } @@ -511,7 +475,7 @@ mod test { impl EcsUriTest { async fn check(&self) { let env = Env::from(self.env.clone()); - let uri = Provider::uri(env, Some(BoxCloneService::new(TestDns::default()))) + let uri = Provider::uri(env, Some(TestDns::default().into_shared())) .await .map(|uri| uri.to_string()); self.result.assert_matches(uri); @@ -537,8 +501,7 @@ mod test { #[test] fn validate_uri_https() { // over HTTPs, any URI is fine - let never = NeverService::new(); - let mut dns = Some(BoxCloneService::new(never)); + let dns = Some(NeverDns.into_shared()); assert_eq!( validate_full_uri("https://amazon.com", None) .now_or_never() @@ -548,7 +511,7 @@ mod test { ); // over HTTP, it will try to lookup assert!( - validate_full_uri("http://amazon.com", dns.as_mut()) + validate_full_uri("http://amazon.com", dns) .now_or_never() .is_none(), "DNS lookup should occur, but it will never return" @@ -562,7 +525,7 @@ mod test { matches!( no_dns_error, InvalidFullUriError { - kind: InvalidFullUriErrorKind::NoDnsService + kind: InvalidFullUriErrorKind::NoDnsResolver } ), "expected no dns service, got: {}", @@ -594,12 +557,14 @@ mod test { #[test] fn all_addrs_local() { - let svc = TestDns::with_fallback(vec![ - "127.0.0.1".parse().unwrap(), - "127.0.0.2".parse().unwrap(), - ]); - let mut svc = Some(BoxCloneService::new(svc)); - let resp = validate_full_uri("http://localhost:8888", svc.as_mut()) + let dns = Some( + TestDns::with_fallback(vec![ + "127.0.0.1".parse().unwrap(), + "127.0.0.2".parse().unwrap(), + ]) + .into_shared(), + ); + let resp = validate_full_uri("http://localhost:8888", dns) .now_or_never() .unwrap(); assert!(resp.is_ok(), "Should be valid: {:?}", resp); @@ -607,12 +572,14 @@ mod test { #[test] fn all_addrs_not_local() { - let svc = TestDns::with_fallback(vec![ - "127.0.0.1".parse().unwrap(), - "192.168.0.1".parse().unwrap(), - ]); - let mut svc = Some(BoxCloneService::new(svc)); - let resp = validate_full_uri("http://localhost:8888", svc.as_mut()) + let dns = Some( + TestDns::with_fallback(vec![ + "127.0.0.1".parse().unwrap(), + "192.168.0.1".parse().unwrap(), + ]) + .into_shared(), + ); + let resp = validate_full_uri("http://localhost:8888", dns) .now_or_never() .unwrap(); assert!( @@ -666,37 +633,37 @@ mod test { ("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI", "/credentials"), ("AWS_CONTAINER_AUTHORIZATION_TOKEN", "Basic password"), ]); - let connector = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( creds_request("http://169.254.170.2/credentials", Some("Basic password")), ok_creds_response(), )]); - let provider = provider(env, DynConnector::new(connector.clone())); + let provider = provider(env, http_client.clone()); let creds = provider .provide_credentials() .await .expect("valid credentials"); assert_correct(creds); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn retry_5xx() { let env = Env::from_slice(&[("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI", "/credentials")]); - let connector = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( creds_request("http://169.254.170.2/credentials", None), http::Response::builder() .status(500) .body(SdkBody::empty()) .unwrap(), ), - ( + ReplayEvent::new( creds_request("http://169.254.170.2/credentials", None), ok_creds_response(), ), ]); tokio::time::pause(); - let provider = provider(env, DynConnector::new(connector.clone())); + let provider = provider(env, http_client.clone()); let creds = provider .provide_credentials() .await @@ -707,17 +674,17 @@ mod test { #[tokio::test] async fn load_valid_creds_no_auth() { let env = Env::from_slice(&[("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI", "/credentials")]); - let connector = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( creds_request("http://169.254.170.2/credentials", None), ok_creds_response(), )]); - let provider = provider(env, DynConnector::new(connector.clone())); + let provider = provider(env, http_client.clone()); let creds = provider .provide_credentials() .await .expect("valid credentials"); assert_correct(creds); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } // ignored by default because it relies on actual DNS resolution @@ -726,8 +693,12 @@ mod test { #[traced_test] #[ignore] async fn real_dns_lookup() { - let mut dns = Some(tokio_dns().expect("feature must be enabled")); - let err = validate_full_uri("http://www.amazon.com/creds", dns.as_mut()) + let dns = Some( + default_dns() + .expect("feature must be enabled") + .into_shared(), + ); + let err = validate_full_uri("http://www.amazon.com/creds", dns.clone()) .await .expect_err("not a loopback"); assert!( @@ -743,13 +714,13 @@ mod test { assert!(logs_contain( "Address does not resolve to the loopback interface" )); - validate_full_uri("http://localhost:8888/creds", dns.as_mut()) + validate_full_uri("http://localhost:8888/creds", dns) .await .expect("localhost is the loopback interface"); } - /// TestService which always returns the same IP addresses - #[derive(Clone)] + /// Always returns the same IP addresses + #[derive(Clone, Debug)] struct TestDns { addrs: HashMap>, fallback: Vec, @@ -780,17 +751,20 @@ mod test { } } - impl Service for TestDns { - type Response = Vec; - type Error = io::Error; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) + impl ResolveDns for TestDns { + fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> { + DnsFuture::ready(Ok(self.addrs.get(name).unwrap_or(&self.fallback).clone())) } + } - fn call(&mut self, _req: String) -> Self::Future { - std::future::ready(Ok(self.addrs.get(&_req).unwrap_or(&self.fallback).clone())) + #[derive(Debug)] + struct NeverDns; + impl ResolveDns for NeverDns { + fn resolve_dns<'a>(&'a self, _name: &'a str) -> DnsFuture<'a> { + DnsFuture::new(async { + Never::new().await; + unreachable!() + }) } } } diff --git a/aws/rust-runtime/aws-config/src/environment/app_name.rs b/aws/rust-runtime/aws-config/src/environment/app_name.rs deleted file mode 100644 index 79c3abb6ac3..00000000000 --- a/aws/rust-runtime/aws-config/src/environment/app_name.rs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_types::app_name::AppName; -use aws_types::os_shim_internal::Env; - -/// Load an app name from the `AWS_SDK_UA_APP_ID` environment variable. -#[derive(Debug, Default)] -pub struct EnvironmentVariableAppNameProvider { - env: Env, -} - -impl EnvironmentVariableAppNameProvider { - /// Create a new `EnvironmentVariableAppNameProvider` - pub fn new() -> Self { - Self { env: Env::real() } - } - - #[doc(hidden)] - /// Create an region provider from a given `Env` - /// - /// This method is used for tests that need to override environment variables. - pub fn new_with_env(env: Env) -> Self { - Self { env } - } - - /// Attempts to create an `AppName` from the `AWS_SDK_UA_APP_ID` environment variable. - pub fn app_name(&self) -> Option { - if let Ok(name) = self.env.get("AWS_SDK_UA_APP_ID") { - match AppName::new(name) { - Ok(name) => Some(name), - Err(err) => { - tracing::warn!(err = %DisplayErrorContext(&err), "`AWS_SDK_UA_APP_ID` environment variable value was invalid"); - None - } - } - } else { - None - } - } -} - -#[cfg(test)] -mod tests { - use crate::environment::EnvironmentVariableAppNameProvider; - use aws_types::app_name::AppName; - use aws_types::os_shim_internal::Env; - use std::collections::HashMap; - - #[test] - fn env_var_not_set() { - let provider = EnvironmentVariableAppNameProvider::new_with_env(Env::from(HashMap::new())); - assert_eq!(None, provider.app_name()); - } - - #[test] - fn env_var_set() { - let provider = EnvironmentVariableAppNameProvider::new_with_env(Env::from( - vec![("AWS_SDK_UA_APP_ID".to_string(), "something".to_string())] - .into_iter() - .collect::>(), - )); - assert_eq!( - Some(AppName::new("something").unwrap()), - provider.app_name() - ); - } -} diff --git a/aws/rust-runtime/aws-config/src/environment/credentials.rs b/aws/rust-runtime/aws-config/src/environment/credentials.rs index 2004bed40e7..f7e7c0888b4 100644 --- a/aws/rust-runtime/aws-config/src/environment/credentials.rs +++ b/aws/rust-runtime/aws-config/src/environment/credentials.rs @@ -58,11 +58,10 @@ impl EnvironmentVariableCredentialsProvider { Self::new_with_env(Env::real()) } - #[doc(hidden)] /// Create a new `EnvironmentVariableCredentialsProvider` with `Env` overridden /// /// This function is intended for tests that mock out the process environment. - pub fn new_with_env(env: Env) -> Self { + pub(crate) fn new_with_env(env: Env) -> Self { Self { env } } } @@ -245,6 +244,6 @@ mod test { fn real_environment() { let provider = EnvironmentVariableCredentialsProvider::new(); // we don't know what's in the env, just make sure it doesn't crash. - let _ = provider.provide_credentials(); + let _fut = provider.provide_credentials(); } } diff --git a/aws/rust-runtime/aws-config/src/environment/mod.rs b/aws/rust-runtime/aws-config/src/environment/mod.rs index 11919472873..8a3f658732d 100644 --- a/aws/rust-runtime/aws-config/src/environment/mod.rs +++ b/aws/rust-runtime/aws-config/src/environment/mod.rs @@ -5,10 +5,6 @@ //! Providers that load configuration from environment variables -/// Load app name from the environment -pub mod app_name; - -pub use app_name::EnvironmentVariableAppNameProvider; use std::error::Error; use std::fmt::{Display, Formatter}; diff --git a/aws/rust-runtime/aws-config/src/environment/region.rs b/aws/rust-runtime/aws-config/src/environment/region.rs index 48859cbe4c7..2f389bb479d 100644 --- a/aws/rust-runtime/aws-config/src/environment/region.rs +++ b/aws/rust-runtime/aws-config/src/environment/region.rs @@ -22,11 +22,10 @@ impl EnvironmentVariableRegionProvider { EnvironmentVariableRegionProvider { env: Env::real() } } - #[doc(hidden)] /// Create an region provider from a given `Env` /// /// This method is used for tests that need to override environment variables. - pub fn new_with_env(env: Env) -> Self { + pub(crate) fn new_with_env(env: Env) -> Self { EnvironmentVariableRegionProvider { env } } } diff --git a/aws/rust-runtime/aws-config/src/http_credential_provider.rs b/aws/rust-runtime/aws-config/src/http_credential_provider.rs index e868ffdac46..41911e16f04 100644 --- a/aws/rust-runtime/aws-config/src/http_credential_provider.rs +++ b/aws/rust-runtime/aws-config/src/http_credential_provider.rs @@ -8,35 +8,42 @@ //! //! Future work will stabilize this interface and enable it to be used directly. -use aws_credential_types::provider::{self, error::CredentialsError}; -use aws_credential_types::Credentials; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::http_connector::ConnectorSettings; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation::{Operation, Request}; -use aws_smithy_http::response::ParseStrictResponse; -use aws_smithy_http::result::{SdkError, SdkSuccess}; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_types::retry::{ErrorKind, RetryKind}; - -use crate::connector::expect_connector; use crate::json_credentials::{parse_json_credentials, JsonCredentials, RefreshableCredentials}; use crate::provider_config::ProviderConfig; - -use bytes::Bytes; +use aws_credential_types::provider::{self, error::CredentialsError}; +use aws_credential_types::Credentials; +use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime::client::retries::classifiers::{ + HttpStatusCodeClassifier, TransientErrorClassifier, +}; +use aws_smithy_runtime_api::client::http::HttpConnectorSettings; +use aws_smithy_runtime_api::client::interceptors::context::{Error, InterceptorContext}; +use aws_smithy_runtime_api::client::orchestrator::{ + HttpResponse, OrchestratorError, SensitiveOutput, +}; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry; +use aws_smithy_runtime_api::client::retries::classifiers::RetryAction; +use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::config_bag::Layer; +use aws_smithy_types::retry::RetryConfig; +use aws_smithy_types::timeout::TimeoutConfig; use http::header::{ACCEPT, AUTHORIZATION}; -use http::{HeaderValue, Response, Uri}; +use http::HeaderValue; use std::time::Duration; -use tower::layer::util::Identity; const DEFAULT_READ_TIMEOUT: Duration = Duration::from_secs(5); const DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_secs(2); +#[derive(Debug)] +struct HttpProviderAuth { + auth: Option, +} + #[derive(Debug)] pub(crate) struct HttpCredentialProvider { - uri: Uri, - client: aws_smithy_client::Client, - provider_name: &'static str, + operation: Operation, } impl HttpCredentialProvider { @@ -45,40 +52,19 @@ impl HttpCredentialProvider { } pub(crate) async fn credentials(&self, auth: Option) -> provider::Result { - let credentials = self.client.call(self.operation(auth)).await; + let credentials = self.operation.invoke(HttpProviderAuth { auth }).await; match credentials { Ok(creds) => Ok(creds), Err(SdkError::ServiceError(context)) => Err(context.into_err()), Err(other) => Err(CredentialsError::unhandled(other)), } } - - fn operation( - &self, - auth: Option, - ) -> Operation { - let mut http_req = http::Request::builder() - .uri(&self.uri) - .header(ACCEPT, "application/json"); - - if let Some(auth) = auth { - http_req = http_req.header(AUTHORIZATION, auth); - } - let http_req = http_req.body(SdkBody::empty()).expect("valid request"); - Operation::new( - Request::new(http_req), - CredentialsResponseParser { - provider_name: self.provider_name, - }, - ) - .with_retry_classifier(HttpCredentialRetryClassifier) - } } #[derive(Default)] pub(crate) struct Builder { provider_config: Option, - connector_settings: Option, + http_connector_settings: Option, } impl Builder { @@ -87,212 +73,263 @@ impl Builder { self } - pub(crate) fn connector_settings(mut self, connector_settings: ConnectorSettings) -> Self { - self.connector_settings = Some(connector_settings); + pub(crate) fn http_connector_settings( + mut self, + http_connector_settings: HttpConnectorSettings, + ) -> Self { + self.http_connector_settings = Some(http_connector_settings); self } - pub(crate) fn build(self, provider_name: &'static str, uri: Uri) -> HttpCredentialProvider { + pub(crate) fn build( + self, + provider_name: &'static str, + endpoint: &str, + path: impl Into, + ) -> HttpCredentialProvider { let provider_config = self.provider_config.unwrap_or_default(); - let connector_settings = self.connector_settings.unwrap_or_else(|| { - ConnectorSettings::builder() - .connect_timeout(DEFAULT_CONNECT_TIMEOUT) - .read_timeout(DEFAULT_READ_TIMEOUT) - .build() - }); - let connector = expect_connector(provider_config.connector(&connector_settings)); - let mut client_builder = aws_smithy_client::Client::builder() - .connector(connector) - .middleware(Identity::new()); - client_builder.set_sleep_impl(provider_config.sleep()); - let client = client_builder.build(); - HttpCredentialProvider { - uri, - client, - provider_name, + + let mut builder = Operation::builder() + .service_name("HttpCredentialProvider") + .operation_name("LoadCredentials") + .with_connection_poisoning() + .endpoint_url(endpoint) + .no_auth() + .timeout_config( + TimeoutConfig::builder() + .connect_timeout(DEFAULT_CONNECT_TIMEOUT) + .read_timeout(DEFAULT_READ_TIMEOUT) + .build(), + ) + .runtime_plugin(StaticRuntimePlugin::new().with_config({ + let mut layer = Layer::new("SensitiveOutput"); + layer.store_put(SensitiveOutput); + layer.freeze() + })); + if let Some(http_client) = provider_config.http_client() { + builder = builder.http_client(http_client); + } + if let Some(sleep_impl) = provider_config.sleep_impl() { + builder = builder + .standard_retry(&RetryConfig::standard()) + // The following errors are retryable: + // - Socket errors + // - Networking timeouts + // - 5xx errors + // - Non-parseable 200 responses. + .retry_classifier(HttpCredentialRetryClassifier) + // Socket errors and network timeouts + .retry_classifier(TransientErrorClassifier::::new()) + // 5xx errors + .retry_classifier(HttpStatusCodeClassifier::default()) + .sleep_impl(sleep_impl); + } else { + builder = builder.no_retry(); } + let path = path.into(); + let operation = builder + .serializer(move |input: HttpProviderAuth| { + let mut http_req = http::Request::builder() + .uri(path.clone()) + .header(ACCEPT, "application/json"); + if let Some(auth) = input.auth { + http_req = http_req.header(AUTHORIZATION, auth); + } + Ok(http_req + .body(SdkBody::empty()) + .expect("valid request") + .try_into() + .unwrap()) + }) + .deserializer(move |response| parse_response(provider_name, response)) + .build(); + HttpCredentialProvider { operation } } } -#[derive(Clone, Debug)] -struct CredentialsResponseParser { +fn parse_response( provider_name: &'static str, -} -impl ParseStrictResponse for CredentialsResponseParser { - type Output = provider::Result; - - fn parse(&self, response: &Response) -> Self::Output { - if !response.status().is_success() { - return Err(CredentialsError::provider_error(format!( + response: &HttpResponse, +) -> Result> { + if !response.status().is_success() { + return Err(OrchestratorError::operation( + CredentialsError::provider_error(format!( "Non-success status from HTTP credential provider: {:?}", response.status() - ))); - } - let str_resp = - std::str::from_utf8(response.body().as_ref()).map_err(CredentialsError::unhandled)?; - let json_creds = parse_json_credentials(str_resp).map_err(CredentialsError::unhandled)?; - match json_creds { - JsonCredentials::RefreshableCredentials(RefreshableCredentials { - access_key_id, - secret_access_key, - session_token, - expiration, - }) => Ok(Credentials::new( - access_key_id, - secret_access_key, - Some(session_token.to_string()), - Some(expiration), - self.provider_name, )), - JsonCredentials::Error { code, message } => Err(CredentialsError::provider_error( - format!("failed to load credentials [{}]: {}", code, message), - )), - } + )); } - - fn sensitive(&self) -> bool { - true + let resp_bytes = response.body().bytes().expect("non-streaming deserializer"); + let str_resp = std::str::from_utf8(resp_bytes) + .map_err(|err| OrchestratorError::operation(CredentialsError::unhandled(err)))?; + let json_creds = parse_json_credentials(str_resp) + .map_err(|err| OrchestratorError::operation(CredentialsError::unhandled(err)))?; + match json_creds { + JsonCredentials::RefreshableCredentials(RefreshableCredentials { + access_key_id, + secret_access_key, + session_token, + expiration, + }) => Ok(Credentials::new( + access_key_id, + secret_access_key, + Some(session_token.to_string()), + Some(expiration), + provider_name, + )), + JsonCredentials::Error { code, message } => Err(OrchestratorError::operation( + CredentialsError::provider_error(format!( + "failed to load credentials [{}]: {}", + code, message + )), + )), } } #[derive(Clone, Debug)] struct HttpCredentialRetryClassifier; -impl ClassifyRetry, SdkError> - for HttpCredentialRetryClassifier -{ - fn classify_retry( - &self, - response: Result<&SdkSuccess, &SdkError>, - ) -> RetryKind { - /* The following errors are retryable: - * - Socket errors - * - Networking timeouts - * - 5xx errors - * - Non-parseable 200 responses. - * */ - match response { - Ok(_) => RetryKind::Unnecessary, - // socket errors, networking timeouts - Err(SdkError::DispatchFailure(client_err)) - if client_err.is_timeout() || client_err.is_io() => - { - RetryKind::Error(ErrorKind::TransientError) - } - // non-parseable 200s - Err(SdkError::ServiceError(context)) - if matches!(context.err(), CredentialsError::Unhandled { .. }) - && context.raw().http().status().is_success() => - { - RetryKind::Error(ErrorKind::ServerError) - } - // 5xx errors - Err(SdkError::ResponseError(context)) - if context.raw().http().status().is_server_error() => - { - RetryKind::Error(ErrorKind::ServerError) - } - Err(SdkError::ServiceError(context)) - if context.raw().http().status().is_server_error() => - { - RetryKind::Error(ErrorKind::ServerError) +impl ClassifyRetry for HttpCredentialRetryClassifier { + fn name(&self) -> &'static str { + "HttpCredentialRetryClassifier" + } + + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + let output_or_error = ctx.output_or_error(); + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + // Retry non-parseable 200 responses + if let Some((err, status)) = error + .as_operation_error() + .and_then(|err| err.downcast_ref::()) + .zip(ctx.response().map(HttpResponse::status)) + { + if matches!(err, CredentialsError::Unhandled { .. }) && status.is_success() { + return RetryAction::server_error(); } - Err(_) => RetryKind::UnretryableFailure, } + + RetryAction::NoActionIndicated } } #[cfg(test)] mod test { - use crate::http_credential_provider::{ - CredentialsResponseParser, HttpCredentialRetryClassifier, - }; + use super::*; use aws_credential_types::provider::error::CredentialsError; - use aws_credential_types::Credentials; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation; - use aws_smithy_http::response::ParseStrictResponse; - use aws_smithy_http::result::{SdkError, SdkSuccess}; - use aws_smithy_http::retry::ClassifyRetry; - use aws_smithy_types::retry::{ErrorKind, RetryKind}; - use bytes::Bytes; + use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_smithy_types::body::SdkBody; + use http::{Request, Response, Uri}; + use std::time::SystemTime; - fn sdk_resp( - resp: http::Response<&'static str>, - ) -> Result, SdkError> { - let resp = resp.map(|data| Bytes::from_static(data.as_bytes())); - match (CredentialsResponseParser { - provider_name: "test", - }) - .parse(&resp) - { - Ok(creds) => Ok(SdkSuccess { - raw: operation::Response::new(resp.map(SdkBody::from)), - parsed: creds, - }), - Err(err) => Err(SdkError::service_error( - err, - operation::Response::new(resp.map(SdkBody::from)), - )), - } + async fn provide_creds( + http_client: StaticReplayClient, + ) -> Result { + let provider_config = ProviderConfig::default().with_http_client(http_client.clone()); + let provider = HttpCredentialProvider::builder() + .configure(&provider_config) + .build("test", "http://localhost:1234/", "/some-creds"); + provider.credentials(None).await } - #[test] - fn non_parseable_is_retriable() { - let bad_response = http::Response::builder() - .status(200) - .body("notjson") - .unwrap(); - - assert_eq!( - HttpCredentialRetryClassifier.classify_retry(sdk_resp(bad_response).as_ref()), - RetryKind::Error(ErrorKind::ServerError) - ); + fn successful_req_resp() -> ReplayEvent { + ReplayEvent::new( + Request::builder() + .uri(Uri::from_static("http://localhost:1234/some-creds")) + .body(SdkBody::empty()) + .unwrap(), + Response::builder() + .status(200) + .body(SdkBody::from( + r#"{ + "AccessKeyId" : "MUA...", + "SecretAccessKey" : "/7PC5om....", + "Token" : "AQoDY....=", + "Expiration" : "2016-02-25T06:03:31Z" + }"#, + )) + .unwrap(), + ) } - #[test] - fn ok_response_not_retriable() { - let ok_response = http::Response::builder() - .status(200) - .body( - r#" { - "AccessKeyId" : "MUA...", - "SecretAccessKey" : "/7PC5om....", - "Token" : "AQoDY....=", - "Expiration" : "2016-02-25T06:03:31Z" - }"#, - ) - .unwrap(); - let sdk_result = sdk_resp(ok_response); - + #[tokio::test] + async fn successful_response() { + let http_client = StaticReplayClient::new(vec![successful_req_resp()]); + let creds = provide_creds(http_client.clone()).await.expect("success"); + assert_eq!("MUA...", creds.access_key_id()); + assert_eq!("/7PC5om....", creds.secret_access_key()); + assert_eq!(Some("AQoDY....="), creds.session_token()); assert_eq!( - HttpCredentialRetryClassifier.classify_retry(sdk_result.as_ref()), - RetryKind::Unnecessary + Some(SystemTime::UNIX_EPOCH + Duration::from_secs(1456380211)), + creds.expiry() ); + http_client.assert_requests_match(&[]); + } - assert!(sdk_result.is_ok(), "should be ok: {:?}", sdk_result) + #[tokio::test] + async fn retry_nonparseable_response() { + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( + Request::builder() + .uri(Uri::from_static("http://localhost:1234/some-creds")) + .body(SdkBody::empty()) + .unwrap(), + Response::builder() + .status(200) + .body(SdkBody::from(r#"not json"#)) + .unwrap(), + ), + successful_req_resp(), + ]); + let creds = provide_creds(http_client.clone()).await.expect("success"); + assert_eq!("MUA...", creds.access_key_id()); + http_client.assert_requests_match(&[]); } - #[test] - fn explicit_error_not_retriable() { - let error_response = http::Response::builder() - .status(400) - .body(r#"{ "Code": "Error", "Message": "There was a problem, it was your fault" }"#) - .unwrap(); - let sdk_result = sdk_resp(error_response); - assert_eq!( - HttpCredentialRetryClassifier.classify_retry(sdk_result.as_ref()), - RetryKind::UnretryableFailure - ); - let sdk_error = sdk_result.expect_err("should be error"); + #[tokio::test] + async fn retry_error_code() { + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( + Request::builder() + .uri(Uri::from_static("http://localhost:1234/some-creds")) + .body(SdkBody::empty()) + .unwrap(), + Response::builder() + .status(500) + .body(SdkBody::from(r#"it broke"#)) + .unwrap(), + ), + successful_req_resp(), + ]); + let creds = provide_creds(http_client.clone()).await.expect("success"); + assert_eq!("MUA...", creds.access_key_id()); + http_client.assert_requests_match(&[]); + } + #[tokio::test] + async fn explicit_error_not_retryable() { + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( + Request::builder() + .uri(Uri::from_static("http://localhost:1234/some-creds")) + .body(SdkBody::empty()) + .unwrap(), + Response::builder() + .status(400) + .body(SdkBody::from( + r#"{ "Code": "Error", "Message": "There was a problem, it was your fault" }"#, + )) + .unwrap(), + )]); + let err = provide_creds(http_client.clone()) + .await + .expect_err("it should fail"); assert!( - matches!( - sdk_error, - SdkError::ServiceError(ref context) if matches!(context.err(), CredentialsError::ProviderError { .. }) - ), - "should be provider error: {}", - sdk_error + matches!(err, CredentialsError::ProviderError { .. }), + "should be CredentialsError::ProviderError: {err}", ); + http_client.assert_requests_match(&[]); } } diff --git a/aws/rust-runtime/aws-config/src/imds/client.rs b/aws/rust-runtime/aws-config/src/imds/client.rs index e73c6454ac9..154225b29e8 100644 --- a/aws/rust-runtime/aws-config/src/imds/client.rs +++ b/aws/rust-runtime/aws-config/src/imds/client.rs @@ -7,36 +7,43 @@ //! //! Client for direct access to IMDSv2. -use crate::connector::expect_connector; use crate::imds::client::error::{BuildError, ImdsError, InnerImdsError, InvalidEndpointMode}; -use crate::imds::client::token::TokenMiddleware; +use crate::imds::client::token::TokenRuntimePlugin; use crate::provider_config::ProviderConfig; use crate::PKG_VERSION; -use aws_http::user_agent::{ApiMetadata, AwsUserAgent, UserAgentStage}; -use aws_smithy_client::http_connector::ConnectorSettings; -use aws_smithy_client::{erase::DynConnector, SdkSuccess}; -use aws_smithy_client::{retry, SdkError}; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::endpoint::apply_endpoint; -use aws_smithy_http::operation; -use aws_smithy_http::operation::{Metadata, Operation}; -use aws_smithy_http::response::ParseStrictResponse; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_http_tower::map_request::{ - AsyncMapRequestLayer, AsyncMapRequestService, MapRequestLayer, MapRequestService, +use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; +use aws_runtime::user_agent::UserAgentInterceptor; +use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams; +use aws_smithy_runtime_api::client::endpoint::{ + EndpointFuture, EndpointResolverParams, ResolveEndpoint, }; -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_smithy_types::retry::{ErrorKind, RetryKind}; +use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; +use aws_smithy_runtime_api::client::orchestrator::{ + HttpRequest, OrchestratorError, SensitiveOutput, +}; +use aws_smithy_runtime_api::client::result::ConnectorError; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::client::retries::classifiers::{ + ClassifyRetry, RetryAction, SharedRetryClassifier, +}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::config_bag::{FrozenLayer, Layer}; +use aws_smithy_types::endpoint::Endpoint; +use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::os_shim_internal::Env; -use bytes::Bytes; -use http::{Response, Uri}; +use http::Uri; use std::borrow::Cow; -use std::error::Error; +use std::error::Error as _; +use std::fmt; use std::str::FromStr; use std::sync::Arc; use std::time::Duration; -use tokio::sync::OnceCell; pub mod error; mod token; @@ -81,12 +88,10 @@ fn user_agent() -> AwsUserAgent { /// 1. Explicit configuration of `Endpoint` via the [builder](Builder): /// ```no_run /// use aws_config::imds::client::Client; -/// use http::Uri; /// # async fn docs() { /// let client = Client::builder() -/// .endpoint(Uri::from_static("http://customidms:456/")) -/// .build() -/// .await; +/// .endpoint("http://customidms:456/").expect("valid URI") +/// .build(); /// # } /// ``` /// @@ -104,7 +109,7 @@ fn user_agent() -> AwsUserAgent { /// ```no_run /// use aws_config::imds::client::{Client, EndpointMode}; /// # async fn docs() { -/// let client = Client::builder().endpoint_mode(EndpointMode::IpV6).build().await; +/// let client = Client::builder().endpoint_mode(EndpointMode::IpV6).build(); /// # } /// ``` /// @@ -123,49 +128,7 @@ fn user_agent() -> AwsUserAgent { /// #[derive(Clone, Debug)] pub struct Client { - inner: Arc, -} - -#[derive(Debug)] -struct ClientInner { - endpoint: Uri, - smithy_client: aws_smithy_client::Client, -} - -/// Client where build is sync, but usage is async -/// -/// Building an imds::Client is actually an async operation, however, for credentials and region -/// providers, we want build to always be a synchronous operation. This allows building to be deferred -/// and cached until request time. -#[derive(Debug)] -pub(super) struct LazyClient { - client: OnceCell>, - builder: Builder, -} - -impl LazyClient { - pub(super) fn from_ready_client(client: Client) -> Self { - Self { - client: OnceCell::from(Ok(client)), - // the builder will never be used in this case - builder: Builder::default(), - } - } - pub(super) async fn client(&self) -> Result<&Client, &BuildError> { - let builder = &self.builder; - self.client - // the clone will only happen once when we actually construct it for the first time, - // after that, we will use the cache. - .get_or_init(|| async { - let client = builder.clone().build().await; - if let Err(err) = &client { - tracing::warn!(err = %DisplayErrorContext(err), "failed to create IMDS client") - } - client - }) - .await - .as_ref() - } + operation: Operation, } impl Client { @@ -187,18 +150,16 @@ impl Client { /// ```no_run /// use aws_config::imds::client::Client; /// # async fn docs() { - /// let client = Client::builder().build().await.expect("valid client"); + /// let client = Client::builder().build(); /// let ami_id = client /// .get("/latest/meta-data/ami-id") /// .await /// .expect("failure communicating with IMDS"); /// # } /// ``` - pub async fn get(&self, path: &str) -> Result { - let operation = self.make_operation(path)?; - self.inner - .smithy_client - .call(operation) + pub async fn get(&self, path: impl Into) -> Result { + self.operation + .invoke(path.into()) .await .map_err(|err| match err { SdkError::ConstructionFailure(_) if err.source().is_some() => { @@ -213,76 +174,105 @@ impl Client { InnerImdsError::InvalidUtf8 => { ImdsError::unexpected("IMDS returned invalid UTF-8") } - InnerImdsError::BadStatus => { - ImdsError::error_response(context.into_raw().into_parts().0) - } + InnerImdsError::BadStatus => ImdsError::error_response(context.into_raw()), }, - SdkError::TimeoutError(_) - | SdkError::DispatchFailure(_) - | SdkError::ResponseError(_) => ImdsError::io_error(err), + // If the error source is an ImdsError, then we need to directly return that source. + // That way, the IMDS token provider's errors can become the top-level ImdsError. + // There is a unit test that checks the correct error is being extracted. + err @ SdkError::DispatchFailure(_) => match err.into_source() { + Ok(source) => match source.downcast::() { + Ok(source) => match source.into_source().downcast::() { + Ok(source) => *source, + Err(err) => ImdsError::unexpected(err), + }, + Err(err) => ImdsError::unexpected(err), + }, + Err(err) => ImdsError::unexpected(err), + }, + SdkError::TimeoutError(_) | SdkError::ResponseError(_) => ImdsError::io_error(err), _ => ImdsError::unexpected(err), }) } +} - /// Creates a aws_smithy_http Operation to for `path` - /// - Convert the path to a URI - /// - Set the base endpoint on the URI - /// - Add a user agent - fn make_operation( - &self, - path: &str, - ) -> Result, ImdsError> { - let mut base_uri: Uri = path.parse().map_err(|_| { - ImdsError::unexpected("IMDS path was not a valid URI. Hint: does it begin with `/`?") - })?; - apply_endpoint(&mut base_uri, &self.inner.endpoint, None).map_err(ImdsError::unexpected)?; - let request = http::Request::builder() - .uri(base_uri) - .body(SdkBody::empty()) - .expect("valid request"); - let mut request = operation::Request::new(request); - request.properties_mut().insert(user_agent()); - Ok(Operation::new(request, ImdsGetResponseHandler) - .with_metadata(Metadata::new("get", "imds")) - .with_retry_classifier(ImdsResponseRetryClassifier)) +/// New-type around `String` that doesn't emit the string value in the `Debug` impl. +#[derive(Clone)] +pub struct SensitiveString(String); + +impl fmt::Debug for SensitiveString { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("SensitiveString") + .field(&"** redacted **") + .finish() } } -/// IMDS Middleware -/// -/// The IMDS middleware includes a token-loader & a UserAgent stage -#[derive(Clone, Debug)] -struct ImdsMiddleware { - token_loader: TokenMiddleware, +impl AsRef for SensitiveString { + fn as_ref(&self) -> &str { + &self.0 + } } -impl tower::Layer for ImdsMiddleware { - type Service = AsyncMapRequestService, TokenMiddleware>; +impl From for SensitiveString { + fn from(value: String) -> Self { + Self(value) + } +} - fn layer(&self, inner: S) -> Self::Service { - AsyncMapRequestLayer::for_mapper(self.token_loader.clone()) - .layer(MapRequestLayer::for_mapper(UserAgentStage::new()).layer(inner)) +impl From for String { + fn from(value: SensitiveString) -> Self { + value.0 } } -#[derive(Copy, Clone)] -struct ImdsGetResponseHandler; +/// Runtime plugin that is used by both the IMDS client and the inner client that resolves +/// the IMDS token and attaches it to requests. This runtime plugin marks the responses as +/// sensitive, configures user agent headers, and sets up retries and timeouts. +#[derive(Debug)] +struct ImdsCommonRuntimePlugin { + config: FrozenLayer, + components: RuntimeComponentsBuilder, +} -impl ParseStrictResponse for ImdsGetResponseHandler { - type Output = Result; +impl ImdsCommonRuntimePlugin { + fn new( + config: &ProviderConfig, + endpoint_resolver: ImdsEndpointResolver, + retry_config: RetryConfig, + timeout_config: TimeoutConfig, + ) -> Self { + let mut layer = Layer::new("ImdsCommonRuntimePlugin"); + layer.store_put(AuthSchemeOptionResolverParams::new(())); + layer.store_put(EndpointResolverParams::new(())); + layer.store_put(SensitiveOutput); + layer.store_put(retry_config); + layer.store_put(timeout_config); + layer.store_put(user_agent()); - fn parse(&self, response: &Response) -> Self::Output { - if response.status().is_success() { - std::str::from_utf8(response.body().as_ref()) - .map(|data| data.to_string()) - .map_err(|_| InnerImdsError::InvalidUtf8) - } else { - Err(InnerImdsError::BadStatus) + Self { + config: layer.freeze(), + components: RuntimeComponentsBuilder::new("ImdsCommonRuntimePlugin") + .with_http_client(config.http_client()) + .with_endpoint_resolver(Some(endpoint_resolver)) + .with_interceptor(UserAgentInterceptor::new()) + .with_retry_classifier(SharedRetryClassifier::new(ImdsResponseRetryClassifier)) + .with_retry_strategy(Some(StandardRetryStrategy::new())) + .with_time_source(Some(config.time_source())) + .with_sleep_impl(config.sleep_impl()), } } +} - fn sensitive(&self) -> bool { - true +impl RuntimePlugin for ImdsCommonRuntimePlugin { + fn config(&self) -> Option { + Some(self.config.clone()) + } + + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.components) } } @@ -368,9 +358,10 @@ impl Builder { /// By default, the client will resolve an endpoint from the environment, AWS config, and endpoint mode. /// /// See [`Client`] for more information. - pub fn endpoint(mut self, endpoint: impl Into) -> Self { - self.endpoint = Some(EndpointSource::Explicit(endpoint.into())); - self + pub fn endpoint(mut self, endpoint: impl AsRef) -> Result { + let uri: Uri = endpoint.as_ref().parse()?; + self.endpoint = Some(EndpointSource::Explicit(uri)); + Ok(self) } /// Override the endpoint mode for [`Client`] @@ -415,53 +406,57 @@ impl Builder { self }*/ - pub(super) fn build_lazy(self) -> LazyClient { - LazyClient { - client: OnceCell::new(), - builder: self, - } - } - /// Build an IMDSv2 Client - pub async fn build(self) -> Result { + pub fn build(self) -> Client { let config = self.config.unwrap_or_default(); let timeout_config = TimeoutConfig::builder() .connect_timeout(self.connect_timeout.unwrap_or(DEFAULT_CONNECT_TIMEOUT)) .read_timeout(self.read_timeout.unwrap_or(DEFAULT_READ_TIMEOUT)) .build(); - let connector_settings = ConnectorSettings::from_timeout_config(&timeout_config); - let connector = expect_connector(config.connector(&connector_settings)); let endpoint_source = self .endpoint .unwrap_or_else(|| EndpointSource::Env(config.clone())); - let endpoint = endpoint_source.endpoint(self.mode_override).await?; - let retry_config = retry::Config::default() - .with_max_attempts(self.max_attempts.unwrap_or(DEFAULT_ATTEMPTS)); - let token_loader = token::TokenMiddleware::new( - connector.clone(), - config.time_source(), - endpoint.clone(), - self.token_ttl.unwrap_or(DEFAULT_TOKEN_TTL), - retry_config.clone(), - timeout_config.clone(), - config.sleep(), - ); - let middleware = ImdsMiddleware { token_loader }; - let mut smithy_builder = aws_smithy_client::Client::builder() - .connector(connector.clone()) - .middleware(middleware) - .retry_config(retry_config) - .operation_timeout_config(timeout_config.into()); - smithy_builder.set_sleep_impl(config.sleep()); - let smithy_client = smithy_builder.build(); - - let client = Client { - inner: Arc::new(ClientInner { - endpoint, - smithy_client, - }), + let endpoint_resolver = ImdsEndpointResolver { + endpoint_source: Arc::new(endpoint_source), + mode_override: self.mode_override, }; - Ok(client) + let retry_config = RetryConfig::standard() + .with_max_attempts(self.max_attempts.unwrap_or(DEFAULT_ATTEMPTS)); + let common_plugin = SharedRuntimePlugin::new(ImdsCommonRuntimePlugin::new( + &config, + endpoint_resolver, + retry_config, + timeout_config, + )); + let operation = Operation::builder() + .service_name("imds") + .operation_name("get") + .runtime_plugin(common_plugin.clone()) + .runtime_plugin(TokenRuntimePlugin::new( + common_plugin, + self.token_ttl.unwrap_or(DEFAULT_TOKEN_TTL), + )) + .with_connection_poisoning() + .serializer(|path| { + Ok(HttpRequest::try_from( + http::Request::builder() + .uri(path) + .body(SdkBody::empty()) + .expect("valid request"), + ) + .unwrap()) + }) + .deserializer(|response| { + if response.status().is_success() { + std::str::from_utf8(response.body().bytes().expect("non-streaming response")) + .map(|data| SensitiveString::from(data.to_string())) + .map_err(|_| OrchestratorError::operation(InnerImdsError::InvalidUtf8)) + } else { + Err(OrchestratorError::operation(InnerImdsError::BadStatus)) + } + }) + .build(); + Client { operation } } } @@ -528,19 +523,21 @@ impl EndpointSource { } } -#[derive(Clone)] -struct ImdsResponseRetryClassifier; +#[derive(Clone, Debug)] +struct ImdsEndpointResolver { + endpoint_source: Arc, + mode_override: Option, +} -impl ImdsResponseRetryClassifier { - fn classify(response: &operation::Response) -> RetryKind { - let status = response.http().status(); - match status { - _ if status.is_server_error() => RetryKind::Error(ErrorKind::ServerError), - // 401 indicates that the token has expired, this is retryable - _ if status.as_u16() == 401 => RetryKind::Error(ErrorKind::ServerError), - // This catch-all includes successful responses that fail to parse. These should not be retried. - _ => RetryKind::UnretryableFailure, - } +impl ResolveEndpoint for ImdsEndpointResolver { + fn resolve_endpoint<'a>(&'a self, _: &'a EndpointResolverParams) -> EndpointFuture<'a> { + EndpointFuture::new(async move { + self.endpoint_source + .endpoint(self.mode_override.clone()) + .await + .map(|uri| Endpoint::builder().url(uri.to_string()).build()) + .map_err(|err| err.into()) + }) } } @@ -553,13 +550,29 @@ impl ImdsResponseRetryClassifier { /// - 403 (IMDS disabled): **Not Retryable** /// - 404 (Not found): **Not Retryable** /// - >=500 (server error): **Retryable** -impl ClassifyRetry, SdkError> for ImdsResponseRetryClassifier { - fn classify_retry(&self, response: Result<&SdkSuccess, &SdkError>) -> RetryKind { - match response { - Ok(_) => RetryKind::Unnecessary, - Err(SdkError::ResponseError(context)) => Self::classify(context.raw()), - Err(SdkError::ServiceError(context)) => Self::classify(context.raw()), - _ => RetryKind::UnretryableFailure, +#[derive(Clone, Debug)] +struct ImdsResponseRetryClassifier; + +impl ClassifyRetry for ImdsResponseRetryClassifier { + fn name(&self) -> &'static str { + "ImdsResponseRetryClassifier" + } + + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + if let Some(response) = ctx.response() { + let status = response.status(); + match status { + _ if status.is_server_error() => RetryAction::server_error(), + // 401 indicates that the token has expired, this is retryable + _ if status.as_u16() == 401 => RetryAction::server_error(), + // This catch-all includes successful responses that fail to parse. These should not be retried. + _ => RetryAction::NoActionIndicated, + } + } else { + // Don't retry timeouts for IMDS, or else it will take ~30 seconds for the default + // credentials provider chain to fail to provide credentials. + // Also don't retry non-responses. + RetryAction::NoActionIndicated } } } @@ -568,14 +581,22 @@ impl ClassifyRetry, SdkError> for ImdsResponseRetryClassi pub(crate) mod test { use crate::imds::client::{Client, EndpointMode, ImdsResponseRetryClassifier}; use crate::provider_config::ProviderConfig; - use aws_credential_types::time_source::{TestingTimeSource, TimeSource}; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::{capture_request, TestConnection}; - use aws_smithy_client::{SdkError, SdkSuccess}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation; - use aws_smithy_types::retry::RetryKind; + use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep}; + use aws_smithy_runtime::client::http::test_util::{ + capture_request, ReplayEvent, StaticReplayClient, + }; + use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_runtime_api::client::interceptors::context::{ + Input, InterceptorContext, Output, + }; + use aws_smithy_runtime_api::client::orchestrator::{ + HttpRequest, HttpResponse, OrchestratorError, + }; + use aws_smithy_runtime_api::client::result::ConnectorError; + use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; use http::header::USER_AGENT; use http::Uri; @@ -604,203 +625,222 @@ pub(crate) mod test { const TOKEN_A: &str = "AQAEAFTNrA4eEGx0AQgJ1arIq_Cc-t4tWt3fB0Hd8RKhXlKc5ccvhg=="; const TOKEN_B: &str = "alternatetoken=="; - pub(crate) fn token_request(base: &str, ttl: u32) -> http::Request { + pub(crate) fn token_request(base: &str, ttl: u32) -> HttpRequest { http::Request::builder() .uri(format!("{}/latest/api/token", base)) .header("x-aws-ec2-metadata-token-ttl-seconds", ttl) .method("PUT") .body(SdkBody::empty()) .unwrap() + .try_into() + .unwrap() } - pub(crate) fn token_response(ttl: u32, token: &'static str) -> http::Response<&'static str> { - http::Response::builder() - .status(200) - .header("X-aws-ec2-metadata-token-ttl-seconds", ttl) - .body(token) - .unwrap() + pub(crate) fn token_response(ttl: u32, token: &'static str) -> HttpResponse { + HttpResponse::try_from( + http::Response::builder() + .status(200) + .header("X-aws-ec2-metadata-token-ttl-seconds", ttl) + .body(SdkBody::from(token)) + .unwrap(), + ) + .unwrap() } - pub(crate) fn imds_request(path: &'static str, token: &str) -> http::Request { + pub(crate) fn imds_request(path: &'static str, token: &str) -> HttpRequest { http::Request::builder() .uri(Uri::from_static(path)) .method("GET") .header("x-aws-ec2-metadata-token", token) .body(SdkBody::empty()) .unwrap() + .try_into() + .unwrap() } - pub(crate) fn imds_response(body: &'static str) -> http::Response<&'static str> { - http::Response::builder().status(200).body(body).unwrap() + pub(crate) fn imds_response(body: &'static str) -> HttpResponse { + HttpResponse::try_from( + http::Response::builder() + .status(200) + .body(SdkBody::from(body)) + .unwrap(), + ) + .unwrap() } - pub(crate) async fn make_client(conn: &TestConnection) -> super::Client - where - SdkBody: From, - T: Send + 'static, - { + pub(crate) fn make_imds_client(http_client: &StaticReplayClient) -> super::Client { tokio::time::pause(); super::Client::builder() .configure( &ProviderConfig::no_configuration() - .with_sleep(TokioSleep::new()) - .with_http_connector(DynConnector::new(conn.clone())), + .with_sleep_impl(InstantSleep::unlogged()) + .with_http_client(http_client.clone()), ) .build() - .await - .expect("valid client") + } + + fn mock_imds_client(events: Vec) -> (Client, StaticReplayClient) { + let http_client = StaticReplayClient::new(events); + let client = make_imds_client(&http_client); + (client, http_client) } #[tokio::test] async fn client_caches_token() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), imds_response(r#"test-imds-output"#), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata2", TOKEN_A), imds_response("output2"), ), ]); - let client = make_client(&connection).await; // load once let metadata = client.get("/latest/metadata").await.expect("failed"); - assert_eq!(metadata, "test-imds-output"); + assert_eq!("test-imds-output", metadata.as_ref()); // load again: the cached token should be used let metadata = client.get("/latest/metadata2").await.expect("failed"); - assert_eq!(metadata, "output2"); - connection.assert_requests_match(&[]); + assert_eq!("output2", metadata.as_ref()); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn token_can_expire() { - let connection = TestConnection::new(vec![ - ( + let (_, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), token_response(600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_A), imds_response(r#"test-imds-output1"#), ), - ( + ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), token_response(600, TOKEN_B), ), - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_B), imds_response(r#"test-imds-output2"#), ), ]); - let mut time_source = TestingTimeSource::new(UNIX_EPOCH); - tokio::time::pause(); + let (time_source, sleep) = instant_time_and_sleep(UNIX_EPOCH); let client = super::Client::builder() .configure( &ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(connection.clone())) - .with_time_source(TimeSource::testing(&time_source)) - .with_sleep(TokioSleep::new()), + .with_http_client(http_client.clone()) + .with_time_source(time_source.clone()) + .with_sleep_impl(sleep), ) .endpoint_mode(EndpointMode::IpV6) .token_ttl(Duration::from_secs(600)) - .build() - .await - .expect("valid client"); + .build(); let resp1 = client.get("/latest/metadata").await.expect("success"); // now the cached credential has expired time_source.advance(Duration::from_secs(600)); let resp2 = client.get("/latest/metadata").await.expect("success"); - connection.assert_requests_match(&[]); - assert_eq!(resp1, "test-imds-output1"); - assert_eq!(resp2, "test-imds-output2"); + http_client.assert_requests_match(&[]); + assert_eq!("test-imds-output1", resp1.as_ref()); + assert_eq!("test-imds-output2", resp2.as_ref()); } /// Tokens are refreshed up to 120 seconds early to avoid using an expired token. #[tokio::test] async fn token_refresh_buffer() { - let connection = TestConnection::new(vec![ - ( + let _logs = capture_test_logs(); + let (_, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), token_response(600, TOKEN_A), ), // t = 0 - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_A), imds_response(r#"test-imds-output1"#), ), // t = 400 (no refresh) - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_A), imds_response(r#"test-imds-output2"#), ), // t = 550 (within buffer) - ( + ReplayEvent::new( token_request("http://[fd00:ec2::254]", 600), token_response(600, TOKEN_B), ), - ( + ReplayEvent::new( imds_request("http://[fd00:ec2::254]/latest/metadata", TOKEN_B), imds_response(r#"test-imds-output3"#), ), ]); - tokio::time::pause(); - let mut time_source = TestingTimeSource::new(UNIX_EPOCH); + let (time_source, sleep) = instant_time_and_sleep(UNIX_EPOCH); let client = super::Client::builder() .configure( &ProviderConfig::no_configuration() - .with_sleep(TokioSleep::new()) - .with_http_connector(DynConnector::new(connection.clone())) - .with_time_source(TimeSource::testing(&time_source)), + .with_sleep_impl(sleep) + .with_http_client(http_client.clone()) + .with_time_source(time_source.clone()), ) .endpoint_mode(EndpointMode::IpV6) .token_ttl(Duration::from_secs(600)) - .build() - .await - .expect("valid client"); + .build(); + tracing::info!("resp1 -----------------------------------------------------------"); let resp1 = client.get("/latest/metadata").await.expect("success"); // now the cached credential has expired time_source.advance(Duration::from_secs(400)); + tracing::info!("resp2 -----------------------------------------------------------"); let resp2 = client.get("/latest/metadata").await.expect("success"); time_source.advance(Duration::from_secs(150)); + tracing::info!("resp3 -----------------------------------------------------------"); let resp3 = client.get("/latest/metadata").await.expect("success"); - connection.assert_requests_match(&[]); - assert_eq!(resp1, "test-imds-output1"); - assert_eq!(resp2, "test-imds-output2"); - assert_eq!(resp3, "test-imds-output3"); + http_client.assert_requests_match(&[]); + assert_eq!("test-imds-output1", resp1.as_ref()); + assert_eq!("test-imds-output2", resp2.as_ref()); + assert_eq!("test-imds-output3", resp3.as_ref()); } /// 500 error during the GET should be retried #[tokio::test] #[traced_test] async fn retry_500() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), - http::Response::builder().status(500).body("").unwrap(), + http::Response::builder() + .status(500) + .body(SdkBody::empty()) + .unwrap(), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), imds_response("ok"), ), ]); - let client = make_client(&connection).await; - assert_eq!(client.get("/latest/metadata").await.expect("success"), "ok"); - connection.assert_requests_match(&[]); + assert_eq!( + "ok", + client + .get("/latest/metadata") + .await + .expect("success") + .as_ref() + ); + http_client.assert_requests_match(&[]); // all requests should have a user agent header - for request in connection.requests().iter() { - assert!(request.actual.headers().get(USER_AGENT).is_some()); + for request in http_client.actual_requests() { + assert!(request.headers().get(USER_AGENT).is_some()); } } @@ -808,116 +848,129 @@ pub(crate) mod test { #[tokio::test] #[traced_test] async fn retry_token_failure() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), - http::Response::builder().status(500).body("").unwrap(), + http::Response::builder() + .status(500) + .body(SdkBody::empty()) + .unwrap(), ), - ( + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), imds_response("ok"), ), ]); - let client = make_client(&connection).await; - assert_eq!(client.get("/latest/metadata").await.expect("success"), "ok"); - connection.assert_requests_match(&[]); + assert_eq!( + "ok", + client + .get("/latest/metadata") + .await + .expect("success") + .as_ref() + ); + http_client.assert_requests_match(&[]); } /// 401 error during metadata retrieval must be retried #[tokio::test] #[traced_test] async fn retry_metadata_401() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(0, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), - http::Response::builder().status(401).body("").unwrap(), + http::Response::builder() + .status(401) + .body(SdkBody::empty()) + .unwrap(), ), - ( + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_B), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_B), imds_response("ok"), ), ]); - let client = make_client(&connection).await; - assert_eq!(client.get("/latest/metadata").await.expect("success"), "ok"); - connection.assert_requests_match(&[]); + assert_eq!( + "ok", + client + .get("/latest/metadata") + .await + .expect("success") + .as_ref() + ); + http_client.assert_requests_match(&[]); } /// 403 responses from IMDS during token acquisition MUST NOT be retried #[tokio::test] #[traced_test] async fn no_403_retry() { - let connection = TestConnection::new(vec![( + let (client, http_client) = mock_imds_client(vec![ReplayEvent::new( token_request("http://169.254.169.254", 21600), - http::Response::builder().status(403).body("").unwrap(), + http::Response::builder() + .status(403) + .body(SdkBody::empty()) + .unwrap(), )]); - let client = make_client(&connection).await; let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "forbidden"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } - /// Successful responses should classify as `RetryKind::Unnecessary` + /// The classifier should return `None` when classifying a successful response. #[test] fn successful_response_properly_classified() { - use aws_smithy_http::retry::ClassifyRetry; - + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); + ctx.set_response(imds_response("").map(|_| SdkBody::empty())); let classifier = ImdsResponseRetryClassifier; - fn response_200() -> operation::Response { - operation::Response::new(imds_response("").map(|_| SdkBody::empty())) - } - let success = SdkSuccess { - raw: response_200(), - parsed: (), - }; assert_eq!( - RetryKind::Unnecessary, - classifier.classify_retry(Ok::<_, &SdkError<()>>(&success)) + RetryAction::NoActionIndicated, + classifier.classify_retry(&ctx) ); // Emulate a failure to parse the response body (using an io error since it's easy to construct in a test) - let failure = SdkError::<()>::response_error( - io::Error::new(io::ErrorKind::BrokenPipe, "fail to parse"), - response_200(), - ); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::connector(ConnectorError::io( + io::Error::new(io::ErrorKind::BrokenPipe, "fail to parse").into(), + )))); assert_eq!( - RetryKind::UnretryableFailure, - classifier.classify_retry(Err::<&SdkSuccess<()>, _>(&failure)) + RetryAction::NoActionIndicated, + classifier.classify_retry(&ctx) ); } // since tokens are sent as headers, the tokens need to be valid header values #[tokio::test] async fn invalid_token() { - let connection = TestConnection::new(vec![( + let (client, http_client) = mock_imds_client(vec![ReplayEvent::new( token_request("http://169.254.169.254", 21600), - token_response(21600, "replaced").map(|_| vec![1, 0]), + token_response(21600, "invalid\nheader\nvalue\0"), )]); - let client = make_client(&connection).await; let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "invalid token"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn non_utf8_response() { - let connection = TestConnection::new(vec![ - ( + let (client, http_client) = mock_imds_client(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A).map(SdkBody::from), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/metadata", TOKEN_A), http::Response::builder() .status(200) @@ -925,10 +978,9 @@ pub(crate) mod test { .unwrap(), ), ]); - let client = make_client(&connection).await; let err = client.get("/latest/metadata").await.expect_err("no token"); assert_full_error_contains!(err, "invalid UTF-8"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } /// Verify that the end-to-end real client has a 1-second connect timeout @@ -941,15 +993,22 @@ pub(crate) mod test { let client = Client::builder() // 240.* can never be resolved - .endpoint(Uri::from_static("http://240.0.0.0")) - .build() - .await - .expect("valid client"); + .endpoint("http://240.0.0.0") + .expect("valid uri") + .build(); let now = SystemTime::now(); let resp = client .get("/latest/metadata") .await .expect_err("240.0.0.0 will never resolve"); + match resp { + err @ ImdsError::FailedToLoadToken(_) + if format!("{}", DisplayErrorContext(&err)).contains("timeout") => {} // ok, + other => panic!( + "wrong error, expected construction failure with TimedOutError inside: {}", + DisplayErrorContext(&other) + ), + } let time_elapsed = now.elapsed().unwrap(); assert!( time_elapsed > Duration::from_secs(1), @@ -961,14 +1020,6 @@ pub(crate) mod test { "time_elapsed should be less than 2s but was {:?}", time_elapsed ); - match resp { - err @ ImdsError::FailedToLoadToken(_) - if format!("{}", DisplayErrorContext(&err)).contains("timeout") => {} // ok, - other => panic!( - "wrong error, expected construction failure with TimedOutError inside: {}", - other - ), - } } #[derive(Debug, Deserialize)] @@ -982,8 +1033,10 @@ pub(crate) mod test { } #[tokio::test] - async fn config_tests() -> Result<(), Box> { - let test_cases = std::fs::read_to_string("test-data/imds-config/imds-tests.json")?; + async fn endpoint_config_tests() -> Result<(), Box> { + let _logs = capture_test_logs(); + + let test_cases = std::fs::read_to_string("test-data/imds-config/imds-endpoint-tests.json")?; #[derive(Deserialize)] struct TestCases { tests: Vec, @@ -998,39 +1051,39 @@ pub(crate) mod test { } async fn check(test_case: ImdsConfigTest) { - let (server, watcher) = capture_request(None); + let (http_client, watcher) = capture_request(None); let provider_config = ProviderConfig::no_configuration() - .with_sleep(TokioSleep::new()) + .with_sleep_impl(TokioSleep::new()) .with_env(Env::from(test_case.env)) .with_fs(Fs::from_map(test_case.fs)) - .with_http_connector(DynConnector::new(server)); + .with_http_client(http_client); let mut imds_client = Client::builder().configure(&provider_config); if let Some(endpoint_override) = test_case.endpoint_override { - imds_client = imds_client.endpoint(endpoint_override.parse::().unwrap()); + imds_client = imds_client + .endpoint(endpoint_override) + .expect("invalid URI"); } if let Some(mode_override) = test_case.mode_override { imds_client = imds_client.endpoint_mode(mode_override.parse().unwrap()); } - let imds_client = imds_client.build().await; - let (uri, imds_client) = match (&test_case.result, imds_client) { - (Ok(uri), Ok(client)) => (uri, client), - (Err(test), Ok(_client)) => panic!( - "test should fail: {} but a valid client was made. {}", - test, test_case.docs - ), - (Err(substr), Err(err)) => { - assert_full_error_contains!(err, substr); - return; + let imds_client = imds_client.build(); + match &test_case.result { + Ok(uri) => { + // this request will fail, we just want to capture the endpoint configuration + let _ = imds_client.get("/hello").await; + assert_eq!(&watcher.expect_request().uri().to_string(), uri); + } + Err(expected) => { + let err = imds_client.get("/hello").await.expect_err("it should fail"); + let message = format!("{}", DisplayErrorContext(&err)); + assert!( + message.contains(expected), + "{}\nexpected error: {expected}\nactual error: {message}", + test_case.docs + ); } - (Ok(_uri), Err(e)) => panic!( - "a valid client should be made but: {}. {}", - e, test_case.docs - ), }; - // this request will fail, we just want to capture the endpoint configuration - let _ = imds_client.get("/hello").await; - assert_eq!(&watcher.expect_request().uri().to_string(), uri); } } diff --git a/aws/rust-runtime/aws-config/src/imds/client/error.rs b/aws/rust-runtime/aws-config/src/imds/client/error.rs index b9559486a6c..7e418c28f8e 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/error.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/error.rs @@ -5,16 +5,15 @@ //! Error types for [`ImdsClient`](crate::imds::client::Client) -use aws_smithy_client::SdkError; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::endpoint::error::InvalidEndpointError; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::result::SdkError; use std::error::Error; use std::fmt; /// Error context for [`ImdsError::FailedToLoadToken`] #[derive(Debug)] pub struct FailedToLoadToken { - source: SdkError, + source: SdkError, } impl FailedToLoadToken { @@ -23,7 +22,7 @@ impl FailedToLoadToken { matches!(self.source, SdkError::DispatchFailure(_)) } - pub(crate) fn into_source(self) -> SdkError { + pub(crate) fn into_source(self) -> SdkError { self.source } } @@ -31,12 +30,12 @@ impl FailedToLoadToken { /// Error context for [`ImdsError::ErrorResponse`] #[derive(Debug)] pub struct ErrorResponse { - raw: http::Response, + raw: HttpResponse, } impl ErrorResponse { /// Returns the raw response from IMDS - pub fn response(&self) -> &http::Response { + pub fn response(&self) -> &HttpResponse { &self.raw } } @@ -76,11 +75,11 @@ pub enum ImdsError { } impl ImdsError { - pub(super) fn failed_to_load_token(source: SdkError) -> Self { + pub(super) fn failed_to_load_token(source: SdkError) -> Self { Self::FailedToLoadToken(FailedToLoadToken { source }) } - pub(super) fn error_response(raw: http::Response) -> Self { + pub(super) fn error_response(raw: HttpResponse) -> Self { Self::ErrorResponse(ErrorResponse { raw }) } @@ -224,14 +223,6 @@ impl Error for BuildError { } } -impl From for BuildError { - fn from(err: InvalidEndpointError) -> Self { - Self { - kind: BuildErrorKind::InvalidEndpointUri(err.into()), - } - } -} - #[derive(Debug)] pub(super) enum TokenErrorKind { /// The token was invalid diff --git a/aws/rust-runtime/aws-config/src/imds/client/token.rs b/aws/rust-runtime/aws-config/src/imds/client/token.rs index 41e96777b45..8ec3e8914cc 100644 --- a/aws/rust-runtime/aws-config/src/imds/client/token.rs +++ b/aws/rust-runtime/aws-config/src/imds/client/token.rs @@ -14,27 +14,29 @@ //! - Retry token loading when it fails //! - Attach the token to the request in the `x-aws-ec2-metadata-token` header +use crate::identity::IdentityCache; use crate::imds::client::error::{ImdsError, TokenError, TokenErrorKind}; -use crate::imds::client::ImdsResponseRetryClassifier; -use aws_credential_types::cache::ExpiringCache; -use aws_http::user_agent::UserAgentStage; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::retry; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::endpoint::apply_endpoint; -use aws_smithy_http::middleware::AsyncMapRequest; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_http::operation::{Metadata, Request}; -use aws_smithy_http::response::ParseStrictResponse; -use aws_smithy_http_tower::map_request::MapRequestLayer; -use aws_smithy_types::timeout::TimeoutConfig; +use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime::expiring_cache::ExpiringCache; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; +use aws_smithy_runtime_api::client::auth::{ + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign, +}; +use aws_smithy_runtime_api::client::identity::{ + Identity, IdentityFuture, ResolveIdentity, SharedIdentityResolver, +}; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError}; +use aws_smithy_runtime_api::client::runtime_components::{ + GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder, +}; +use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::config_bag::ConfigBag; use http::{HeaderValue, Uri}; -use std::fmt::{Debug, Formatter}; -use std::future::Future; -use std::pin::Pin; +use std::borrow::Cow; +use std::fmt; use std::sync::Arc; use std::time::{Duration, SystemTime}; @@ -47,6 +49,13 @@ const TOKEN_REFRESH_BUFFER: Duration = Duration::from_secs(120); const X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS: &str = "x-aws-ec2-metadata-token-ttl-seconds"; const X_AWS_EC2_METADATA_TOKEN: &str = "x-aws-ec2-metadata-token"; +const IMDS_TOKEN_AUTH_SCHEME: AuthSchemeId = AuthSchemeId::new(X_AWS_EC2_METADATA_TOKEN); + +#[derive(Debug)] +struct TtlToken { + value: HeaderValue, + ttl: Duration, +} /// IMDS Token #[derive(Clone)] @@ -54,151 +63,216 @@ struct Token { value: HeaderValue, expiry: SystemTime, } +impl fmt::Debug for Token { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Token") + .field("value", &"** redacted **") + .field("expiry", &self.expiry) + .finish() + } +} -/// Token Middleware +/// Token Runtime Plugin /// -/// Token middleware will load/cache a token when required and handle caching/expiry. -/// -/// It will attach the token to the incoming request on the `x-aws-ec2-metadata-token` header. -#[derive(Clone)] -pub(super) struct TokenMiddleware { - client: Arc>>, - token_parser: GetTokenResponseHandler, - token: ExpiringCache, - time_source: SharedTimeSource, - endpoint: Uri, - token_ttl: Duration, +/// This runtime plugin wires up the necessary components to load/cache a token +/// when required and handle caching/expiry. This token will get attached to the +/// request to IMDS on the `x-aws-ec2-metadata-token` header. +#[derive(Debug)] +pub(super) struct TokenRuntimePlugin { + components: RuntimeComponentsBuilder, } -impl Debug for TokenMiddleware { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "ImdsTokenMiddleware") +impl TokenRuntimePlugin { + pub(super) fn new(common_plugin: SharedRuntimePlugin, token_ttl: Duration) -> Self { + Self { + components: RuntimeComponentsBuilder::new("TokenRuntimePlugin") + .with_auth_scheme(TokenAuthScheme::new()) + .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new(vec![ + IMDS_TOKEN_AUTH_SCHEME, + ]))) + // The TokenResolver has a cache of its own, so don't use identity caching + .with_identity_cache(Some(IdentityCache::no_cache())) + .with_identity_resolver( + IMDS_TOKEN_AUTH_SCHEME, + TokenResolver::new(common_plugin, token_ttl), + ), + } } } -impl TokenMiddleware { - pub(super) fn new( - connector: DynConnector, - time_source: SharedTimeSource, - endpoint: Uri, - token_ttl: Duration, - retry_config: retry::Config, - timeout_config: TimeoutConfig, - sleep_impl: Option, - ) -> Self { - let mut inner_builder = aws_smithy_client::Client::builder() - .connector(connector) - .middleware(MapRequestLayer::::default()) - .retry_config(retry_config) - .operation_timeout_config(timeout_config.into()); - inner_builder.set_sleep_impl(sleep_impl); - let inner_client = inner_builder.build(); - let client = Arc::new(inner_client); +impl RuntimePlugin for TokenRuntimePlugin { + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.components) + } +} + +#[derive(Debug)] +struct TokenResolverInner { + cache: ExpiringCache, + refresh: Operation<(), TtlToken, TokenError>, +} + +#[derive(Clone, Debug)] +struct TokenResolver { + inner: Arc, +} + +impl TokenResolver { + fn new(common_plugin: SharedRuntimePlugin, token_ttl: Duration) -> Self { Self { - client, - token_parser: GetTokenResponseHandler { - time: time_source.clone(), - }, - token: ExpiringCache::new(TOKEN_REFRESH_BUFFER), - time_source, - endpoint, - token_ttl, + inner: Arc::new(TokenResolverInner { + cache: ExpiringCache::new(TOKEN_REFRESH_BUFFER), + refresh: Operation::builder() + .service_name("imds") + .operation_name("get-token") + .runtime_plugin(common_plugin) + .no_auth() + .with_connection_poisoning() + .serializer(move |_| { + Ok(http::Request::builder() + .method("PUT") + .uri(Uri::from_static("/latest/api/token")) + .header(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS, token_ttl.as_secs()) + .body(SdkBody::empty()) + .expect("valid HTTP request") + .try_into() + .unwrap()) + }) + .deserializer(move |response| { + parse_token_response(response).map_err(OrchestratorError::operation) + }) + .build(), + }), } } - async fn add_token(&self, request: Request) -> Result { - let preloaded_token = self - .token - .yield_or_clear_if_expired(self.time_source.now()) - .await; - let token = match preloaded_token { - Some(token) => Ok(token), - None => { - self.token - .get_or_load(|| async move { self.get_token().await }) - .await - } - }?; - request.augment(|mut request, _| { - request - .headers_mut() - .insert(X_AWS_EC2_METADATA_TOKEN, token.value); - Ok(request) - }) + + async fn get_token( + &self, + time_source: SharedTimeSource, + ) -> Result<(Token, SystemTime), ImdsError> { + let result = self.inner.refresh.invoke(()).await; + let now = time_source.now(); + result + .map(|token| { + let token = Token { + value: token.value, + expiry: now + token.ttl, + }; + let expiry = token.expiry; + (token, expiry) + }) + .map_err(ImdsError::failed_to_load_token) } +} - async fn get_token(&self) -> Result<(Token, SystemTime), ImdsError> { - let mut uri = Uri::from_static("/latest/api/token"); - apply_endpoint(&mut uri, &self.endpoint, None).map_err(ImdsError::unexpected)?; - let request = http::Request::builder() - .header( - X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS, - self.token_ttl.as_secs(), - ) - .uri(uri) - .method("PUT") - .body(SdkBody::empty()) - .expect("valid HTTP request"); - let mut request = operation::Request::new(request); - request.properties_mut().insert(super::user_agent()); - - let operation = Operation::new(request, self.token_parser.clone()) - .with_retry_classifier(ImdsResponseRetryClassifier) - .with_metadata(Metadata::new("get-token", "imds")); - let response = self - .client - .call(operation) - .await - .map_err(ImdsError::failed_to_load_token)?; - let expiry = response.expiry; - Ok((response, expiry)) +fn parse_token_response(response: &HttpResponse) -> Result { + match response.status().as_u16() { + 400 => return Err(TokenErrorKind::InvalidParameters.into()), + 403 => return Err(TokenErrorKind::Forbidden.into()), + _ => {} } + let mut value = + HeaderValue::from_bytes(response.body().bytes().expect("non-streaming response")) + .map_err(|_| TokenErrorKind::InvalidToken)?; + value.set_sensitive(true); + + let ttl: u64 = response + .headers() + .get(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS) + .ok_or(TokenErrorKind::NoTtl)? + .parse() + .map_err(|_parse_error| TokenErrorKind::InvalidTtl)?; + Ok(TtlToken { + value, + ttl: Duration::from_secs(ttl), + }) } -impl AsyncMapRequest for TokenMiddleware { - type Error = ImdsError; - type Future = Pin> + Send + 'static>>; +impl ResolveIdentity for TokenResolver { + fn resolve_identity<'a>( + &'a self, + components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + let time_source = components + .time_source() + .expect("time source required for IMDS token caching"); + IdentityFuture::new(async { + let now = time_source.now(); + let preloaded_token = self.inner.cache.yield_or_clear_if_expired(now).await; + let token = match preloaded_token { + Some(token) => { + tracing::trace!( + buffer_time=?TOKEN_REFRESH_BUFFER, + expiration=?token.expiry, + now=?now, + "loaded IMDS token from cache"); + Ok(token) + } + None => { + tracing::debug!("IMDS token cache miss"); + self.inner + .cache + .get_or_load(|| async { self.get_token(time_source).await }) + .await + } + }?; - fn name(&self) -> &'static str { - "attach_imds_token" + let expiry = token.expiry; + Ok(Identity::new(token, Some(expiry))) + }) } +} - fn apply(&self, request: Request) -> Self::Future { - let this = self.clone(); - Box::pin(async move { this.add_token(request).await }) - } +#[derive(Debug)] +struct TokenAuthScheme { + signer: TokenSigner, } -#[derive(Clone)] -struct GetTokenResponseHandler { - time: SharedTimeSource, +impl TokenAuthScheme { + fn new() -> Self { + Self { + signer: TokenSigner, + } + } } -impl ParseStrictResponse for GetTokenResponseHandler { - type Output = Result; +impl AuthScheme for TokenAuthScheme { + fn scheme_id(&self) -> AuthSchemeId { + IMDS_TOKEN_AUTH_SCHEME + } - fn parse(&self, response: &http::Response) -> Self::Output { - match response.status().as_u16() { - 400 => return Err(TokenErrorKind::InvalidParameters.into()), - 403 => return Err(TokenErrorKind::Forbidden.into()), - _ => {} - } - let value = HeaderValue::from_maybe_shared(response.body().clone()) - .map_err(|_| TokenErrorKind::InvalidToken)?; - let ttl: u64 = response - .headers() - .get(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS) - .ok_or(TokenErrorKind::NoTtl)? - .to_str() - .map_err(|_| TokenErrorKind::InvalidTtl)? - .parse() - .map_err(|_parse_error| TokenErrorKind::InvalidTtl)?; - Ok(Token { - value, - expiry: self.time.now() + Duration::from_secs(ttl), - }) + fn identity_resolver( + &self, + identity_resolvers: &dyn GetIdentityResolver, + ) -> Option { + identity_resolvers.identity_resolver(IMDS_TOKEN_AUTH_SCHEME) } - fn sensitive(&self) -> bool { - true + fn signer(&self) -> &dyn Sign { + &self.signer + } +} + +#[derive(Debug)] +struct TokenSigner; + +impl Sign for TokenSigner { + fn sign_http_request( + &self, + request: &mut HttpRequest, + identity: &Identity, + _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, + _config_bag: &ConfigBag, + ) -> Result<(), BoxError> { + let token = identity.data::().expect("correct type"); + request + .headers_mut() + .append(X_AWS_EC2_METADATA_TOKEN, token.value.clone()); + Ok(()) } } diff --git a/aws/rust-runtime/aws-config/src/imds/credentials.rs b/aws/rust-runtime/aws-config/src/imds/credentials.rs index 9cdc47b7c97..896e66d6df2 100644 --- a/aws/rust-runtime/aws-config/src/imds/credentials.rs +++ b/aws/rust-runtime/aws-config/src/imds/credentials.rs @@ -9,8 +9,7 @@ //! This credential provider will NOT fallback to IMDSv1. Ensure that IMDSv2 is enabled on your instances. use super::client::error::ImdsError; -use crate::imds; -use crate::imds::client::LazyClient; +use crate::imds::{self, Client}; use crate::json_credentials::{parse_json_credentials, JsonCredentials, RefreshableCredentials}; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; @@ -50,7 +49,7 @@ impl StdError for ImdsCommunicationError { /// _Note: This credentials provider will NOT fallback to the IMDSv1 flow._ #[derive(Debug)] pub struct ImdsCredentialsProvider { - client: LazyClient, + client: Client, env: Env, profile: Option, time_source: SharedTimeSource, @@ -110,12 +109,7 @@ impl Builder { let env = provider_config.env(); let client = self .imds_override - .map(LazyClient::from_ready_client) - .unwrap_or_else(|| { - imds::Client::builder() - .configure(&provider_config) - .build_lazy() - }); + .unwrap_or_else(|| imds::Client::builder().configure(&provider_config).build()); ImdsCredentialsProvider { client, env, @@ -156,23 +150,14 @@ impl ImdsCredentialsProvider { } } - /// Load an inner IMDS client from the OnceCell - async fn client(&self) -> Result<&imds::Client, CredentialsError> { - self.client.client().await.map_err(|build_error| { - // need to format the build error since we don't own it and it can't be cloned - CredentialsError::invalid_configuration(format!("{}", build_error)) - }) - } - /// Retrieve the instance profile from IMDS async fn get_profile_uncached(&self) -> Result { match self - .client() - .await? + .client .get("/latest/meta-data/iam/security-credentials/") .await { - Ok(profile) => Ok(profile), + Ok(profile) => Ok(profile.as_ref().into()), Err(ImdsError::ErrorResponse(context)) if context.response().status().as_u16() == 404 => { @@ -201,7 +186,7 @@ impl ImdsCredentialsProvider { return expiration; } - let rng = fastrand::Rng::with_seed( + let mut rng = fastrand::Rng::with_seed( now.duration_since(SystemTime::UNIX_EPOCH) .expect("now should be after UNIX EPOCH") .as_secs(), @@ -223,9 +208,11 @@ impl ImdsCredentialsProvider { async fn retrieve_credentials(&self) -> provider::Result { if self.imds_disabled() { - tracing::debug!("IMDS disabled because $AWS_EC2_METADATA_DISABLED was set to `true`"); + tracing::debug!( + "IMDS disabled because AWS_EC2_METADATA_DISABLED env var was set to `true`" + ); return Err(CredentialsError::not_loaded( - "IMDS disabled by $AWS_ECS_METADATA_DISABLED", + "IMDS disabled by AWS_ECS_METADATA_DISABLED env var", )); } tracing::debug!("loading credentials from IMDS"); @@ -235,15 +222,14 @@ impl ImdsCredentialsProvider { }; tracing::debug!(profile = %profile, "loaded profile"); let credentials = self - .client() - .await? - .get(&format!( + .client + .get(format!( "/latest/meta-data/iam/security-credentials/{}", profile )) .await .map_err(CredentialsError::provider_error)?; - match parse_json_credentials(&credentials) { + match parse_json_credentials(credentials.as_ref()) { Ok(JsonCredentials::RefreshableCredentials(RefreshableCredentials { access_key_id, secret_access_key, @@ -296,71 +282,67 @@ impl ImdsCredentialsProvider { #[cfg(test)] mod test { - use std::time::{Duration, UNIX_EPOCH}; - + use super::*; use crate::imds::client::test::{ - imds_request, imds_response, make_client, token_request, token_response, - }; - use crate::imds::credentials::{ - ImdsCredentialsProvider, WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY, + imds_request, imds_response, make_imds_client, token_request, token_response, }; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::ProvideCredentials; - use aws_credential_types::time_source::{TestingTimeSource, TimeSource}; - use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::TestConnection; + use aws_smithy_async::test_util::instant_time_and_sleep; + use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_smithy_types::body::SdkBody; + use std::time::{Duration, UNIX_EPOCH}; use tracing_test::traced_test; const TOKEN_A: &str = "token_a"; #[tokio::test] async fn profile_is_not_cached() { - let connection = TestConnection::new(vec![ - ( - token_request("http://169.254.169.254", 21600), - token_response(21600, TOKEN_A), - ), - ( - imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), - imds_response(r#"profile-name"#), - ), - ( - imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), - imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), - ), - ( - imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), - imds_response(r#"different-profile"#), - ), - ( - imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/different-profile", TOKEN_A), - imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST2\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), - ), - ]); + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( + token_request("http://169.254.169.254", 21600), + token_response(21600, TOKEN_A), + ), + ReplayEvent::new( + imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), + imds_response(r#"profile-name"#), + ), + ReplayEvent::new( + imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), + imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), + ), + ReplayEvent::new( + imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), + imds_response(r#"different-profile"#), + ), + ReplayEvent::new( + imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/different-profile", TOKEN_A), + imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST2\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), + ), + ]); let client = ImdsCredentialsProvider::builder() - .imds_client(make_client(&connection).await) + .imds_client(make_imds_client(&http_client)) .build(); let creds1 = client.provide_credentials().await.expect("valid creds"); let creds2 = client.provide_credentials().await.expect("valid creds"); assert_eq!(creds1.access_key_id(), "ASIARTEST"); assert_eq!(creds2.access_key_id(), "ASIARTEST2"); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] #[traced_test] async fn credentials_not_stale_should_be_used_as_they_are() { - let connection = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), imds_response(r#"profile-name"#), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), ), @@ -369,21 +351,15 @@ mod test { // set to 2021-09-21T04:16:50Z that makes returned credentials' expiry (2021-09-21T04:16:53Z) // not stale let time_of_request_to_fetch_credentials = UNIX_EPOCH + Duration::from_secs(1632197810); - let time_source = TimeSource::testing(&TestingTimeSource::new( - time_of_request_to_fetch_credentials, - )); - - tokio::time::pause(); + let (time_source, sleep) = instant_time_and_sleep(time_of_request_to_fetch_credentials); let provider_config = ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(connection.clone())) - .with_time_source(time_source) - .with_sleep(TokioSleep::new()); + .with_http_client(http_client.clone()) + .with_sleep_impl(sleep) + .with_time_source(time_source); let client = crate::imds::Client::builder() .configure(&provider_config) - .build() - .await - .expect("valid client"); + .build(); let provider = ImdsCredentialsProvider::builder() .configure(&provider_config) .imds_client(client) @@ -394,7 +370,7 @@ mod test { creds.expiry(), UNIX_EPOCH.checked_add(Duration::from_secs(1632197813)) ); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); // There should not be logs indicating credentials are extended for stability. assert!(!logs_contain(WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY)); @@ -402,16 +378,16 @@ mod test { #[tokio::test] #[traced_test] async fn expired_credentials_should_be_extended() { - let connection = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), imds_response(r#"profile-name"#), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), ), @@ -419,28 +395,22 @@ mod test { // set to 2021-09-21T17:41:25Z that renders fetched credentials already expired (2021-09-21T04:16:53Z) let time_of_request_to_fetch_credentials = UNIX_EPOCH + Duration::from_secs(1632246085); - let time_source = TimeSource::testing(&TestingTimeSource::new( - time_of_request_to_fetch_credentials, - )); - - tokio::time::pause(); + let (time_source, sleep) = instant_time_and_sleep(time_of_request_to_fetch_credentials); let provider_config = ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(connection.clone())) - .with_time_source(time_source) - .with_sleep(TokioSleep::new()); + .with_http_client(http_client.clone()) + .with_sleep_impl(sleep) + .with_time_source(time_source); let client = crate::imds::Client::builder() .configure(&provider_config) - .build() - .await - .expect("valid client"); + .build(); let provider = ImdsCredentialsProvider::builder() .configure(&provider_config) .imds_client(client) .build(); let creds = provider.provide_credentials().await.expect("valid creds"); assert!(creds.expiry().unwrap() > time_of_request_to_fetch_credentials); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); // We should inform customers that expired credentials are being used for stability. assert!(logs_contain(WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY)); @@ -451,10 +421,9 @@ mod test { async fn read_timeout_during_credentials_refresh_should_yield_last_retrieved_credentials() { let client = crate::imds::Client::builder() // 240.* can never be resolved - .endpoint(http::Uri::from_static("http://240.0.0.0")) - .build() - .await - .expect("valid client"); + .endpoint("http://240.0.0.0") + .unwrap() + .build(); let expected = aws_credential_types::Credentials::for_tests(); let provider = ImdsCredentialsProvider::builder() .imds_client(client) @@ -471,19 +440,18 @@ mod test { ) { let client = crate::imds::Client::builder() // 240.* can never be resolved - .endpoint(http::Uri::from_static("http://240.0.0.0")) - .build() - .await - .expect("valid client"); + .endpoint("http://240.0.0.0") + .unwrap() + .build(); let provider = ImdsCredentialsProvider::builder() .imds_client(client) // no fallback credentials provided .build(); let actual = provider.provide_credentials().await; - assert!(matches!( - actual, - Err(aws_credential_types::provider::error::CredentialsError::CredentialsNotLoaded(_)) - )); + assert!( + matches!(actual, Err(CredentialsError::CredentialsNotLoaded(_))), + "\nexpected: Err(CredentialsError::CredentialsNotLoaded(_))\nactual: {actual:?}" + ); } #[tokio::test] @@ -492,10 +460,9 @@ mod test { use aws_smithy_async::rt::sleep::AsyncSleep; let client = crate::imds::Client::builder() // 240.* can never be resolved - .endpoint(http::Uri::from_static("http://240.0.0.0")) - .build() - .await - .expect("valid client"); + .endpoint("http://240.0.0.0") + .unwrap() + .build(); let expected = aws_credential_types::Credentials::for_tests(); let provider = ImdsCredentialsProvider::builder() .imds_client(client) @@ -522,36 +489,36 @@ mod test { #[tokio::test] async fn fallback_credentials_should_be_used_when_imds_returns_500_during_credentials_refresh() { - let connection = TestConnection::new(vec![ + let http_client = StaticReplayClient::new(vec![ // The next three request/response pairs will correspond to the first call to `provide_credentials`. // During the call, it populates last_retrieved_credentials. - ( + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, TOKEN_A), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), imds_response(r#"profile-name"#), ), - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name", TOKEN_A), imds_response("{\n \"Code\" : \"Success\",\n \"LastUpdated\" : \"2021-09-20T21:42:26Z\",\n \"Type\" : \"AWS-HMAC\",\n \"AccessKeyId\" : \"ASIARTEST\",\n \"SecretAccessKey\" : \"testsecret\",\n \"Token\" : \"testtoken\",\n \"Expiration\" : \"2021-09-21T04:16:53Z\"\n}"), ), // The following request/response pair corresponds to the second call to `provide_credentials`. // During the call, IMDS returns response code 500. - ( + ReplayEvent::new( imds_request("http://169.254.169.254/latest/meta-data/iam/security-credentials/", TOKEN_A), - http::Response::builder().status(500).body("").unwrap(), + http::Response::builder().status(500).body(SdkBody::empty()).unwrap(), ), ]); let provider = ImdsCredentialsProvider::builder() - .imds_client(make_client(&connection).await) + .imds_client(make_imds_client(&http_client)) .build(); let creds1 = provider.provide_credentials().await.expect("valid creds"); assert_eq!(creds1.access_key_id(), "ASIARTEST"); // `creds1` should be returned as fallback credentials and assigned to `creds2` let creds2 = provider.provide_credentials().await.expect("valid creds"); assert_eq!(creds1, creds2); - connection.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } } diff --git a/aws/rust-runtime/aws-config/src/imds/region.rs b/aws/rust-runtime/aws-config/src/imds/region.rs index bc784f8d4f1..213e4a5c36b 100644 --- a/aws/rust-runtime/aws-config/src/imds/region.rs +++ b/aws/rust-runtime/aws-config/src/imds/region.rs @@ -8,8 +8,7 @@ //! Load region from IMDS from `/latest/meta-data/placement/region` //! This provider has a 5 second timeout. -use crate::imds; -use crate::imds::client::LazyClient; +use crate::imds::{self, Client}; use crate::meta::region::{future, ProvideRegion}; use crate::provider_config::ProviderConfig; use aws_smithy_types::error::display::DisplayErrorContext; @@ -22,7 +21,7 @@ use tracing::Instrument; /// This provider is included in the default region chain, so it does not need to be used manually. #[derive(Debug)] pub struct ImdsRegionProvider { - client: LazyClient, + client: Client, env: Env, } @@ -49,11 +48,10 @@ impl ImdsRegionProvider { tracing::debug!("not using IMDS to load region, IMDS is disabled"); return None; } - let client = self.client.client().await.ok()?; - match client.get(REGION_PATH).await { + match self.client.get(REGION_PATH).await { Ok(region) => { - tracing::debug!(region = %region, "loaded region from IMDS"); - Some(Region::new(region)) + tracing::debug!(region = %region.as_ref(), "loaded region from IMDS"); + Some(Region::new(String::from(region))) } Err(err) => { tracing::warn!(err = %DisplayErrorContext(&err), "failed to load region from IMDS"); @@ -99,12 +97,7 @@ impl Builder { let provider_config = self.provider_config.unwrap_or_default(); let client = self .imds_client_override - .map(LazyClient::from_ready_client) - .unwrap_or_else(|| { - imds::Client::builder() - .configure(&provider_config) - .build_lazy() - }); + .unwrap_or_else(|| imds::Client::builder().configure(&provider_config).build()); ImdsRegionProvider { client, env: provider_config.env(), @@ -117,21 +110,20 @@ mod test { use crate::imds::client::test::{imds_request, imds_response, token_request, token_response}; use crate::imds::region::ImdsRegionProvider; use crate::provider_config::ProviderConfig; - use aws_sdk_sts::config::Region; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::TestConnection; - use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; + use aws_smithy_types::body::SdkBody; + use aws_types::region::Region; use tracing_test::traced_test; #[tokio::test] async fn load_region() { - let conn = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( token_request("http://169.254.169.254", 21600), token_response(21600, "token"), ), - ( + ReplayEvent::new( imds_request( "http://169.254.169.254/latest/meta-data/placement/region", "token", @@ -142,8 +134,8 @@ mod test { let provider = ImdsRegionProvider::builder() .configure( &ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(conn)) - .with_sleep(TokioSleep::new()), + .with_http_client(http_client) + .with_sleep_impl(TokioSleep::new()), ) .build(); assert_eq!( @@ -155,7 +147,7 @@ mod test { #[traced_test] #[tokio::test] async fn no_region_imds_disabled() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( token_request("http://169.254.169.254", 21600), http::Response::builder() .status(403) @@ -165,8 +157,8 @@ mod test { let provider = ImdsRegionProvider::builder() .configure( &ProviderConfig::no_configuration() - .with_http_connector(DynConnector::new(conn)) - .with_sleep(TokioSleep::new()), + .with_http_client(http_client) + .with_sleep_impl(TokioSleep::new()), ) .build(); assert_eq!(provider.region().await, None); diff --git a/aws/rust-runtime/aws-config/src/lib.rs b/aws/rust-runtime/aws-config/src/lib.rs index f0e4e3bdca4..3feb455382f 100644 --- a/aws/rust-runtime/aws-config/src/lib.rs +++ b/aws/rust-runtime/aws-config/src/lib.rs @@ -11,6 +11,7 @@ rustdoc::missing_crate_level_docs, unreachable_pub )] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] //! `aws-config` provides implementations of region and credential resolution. //! @@ -25,14 +26,15 @@ //! //! Load default SDK configuration: //! ```no_run -//! # mod aws_sdk_dynamodb { +//! use aws_config::BehaviorVersion; +//! mod aws_sdk_dynamodb { //! # pub struct Client; //! # impl Client { //! # pub fn new(config: &aws_types::SdkConfig) -> Self { Client } //! # } //! # } //! # async fn docs() { -//! let config = aws_config::load_from_env().await; +//! let config = aws_config::load_defaults(BehaviorVersion::v2023_11_09()).await; //! let client = aws_sdk_dynamodb::Client::new(&config); //! # } //! ``` @@ -48,6 +50,7 @@ //! # async fn docs() { //! # use aws_config::meta::region::RegionProviderChain; //! let region_provider = RegionProviderChain::default_provider().or_else("us-east-1"); +//! // Note: requires the `behavior-version-latest` feature enabled //! let config = aws_config::from_env().region(region_provider).load().await; //! let client = aws_sdk_dynamodb::Client::new(&config); //! # } @@ -84,7 +87,7 @@ //! # fn custom_provider(base: &SdkConfig) -> impl ProvideCredentials { //! # base.credentials_provider().unwrap().clone() //! # } -//! let sdk_config = aws_config::load_from_env().await; +//! let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await; //! let custom_credentials_provider = custom_provider(&sdk_config); //! let dynamo_config = aws_sdk_dynamodb::config::Builder::from(&sdk_config) //! .credentials_provider(custom_credentials_provider) @@ -93,15 +96,22 @@ //! # } //! ``` -pub use aws_smithy_http::endpoint; +pub use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; // Re-export types from aws-types pub use aws_types::{ app_name::{AppName, InvalidAppName}, + region::Region, SdkConfig, }; /// Load default sources for all configuration with override support pub use loader::ConfigLoader; +/// Types for configuring identity caching. +pub mod identity { + pub use aws_smithy_runtime::client::identity::IdentityCache; + pub use aws_smithy_runtime::client::identity::LazyCacheBuilder; +} + #[allow(dead_code)] const PKG_VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -112,7 +122,6 @@ mod fs_util; mod http_credential_provider; mod json_credentials; -pub mod connector; pub mod credential_process; pub mod default_provider; pub mod ecs; @@ -122,55 +131,103 @@ pub mod meta; pub mod profile; pub mod provider_config; pub mod retry; -#[cfg(feature = "credentials-sso")] +mod sensitive_command; +#[cfg(feature = "sso")] pub mod sso; +pub mod stalled_stream_protection; pub(crate) mod standard_property; pub mod sts; pub mod timeout; pub mod web_identity_token; -/// Create an environment loader for AWS Configuration +/// Create a config loader with the _latest_ defaults. +/// +/// This loader will always set [`BehaviorVersion::latest`]. /// /// # Examples /// ```no_run /// # async fn create_config() { -/// use aws_types::region::Region; /// let config = aws_config::from_env().region("us-east-1").load().await; /// # } /// ``` +#[cfg(feature = "behavior-version-latest")] pub fn from_env() -> ConfigLoader { - ConfigLoader::default() + ConfigLoader::default().behavior_version(BehaviorVersion::latest()) } -/// Load a default configuration from the environment +/// Load default configuration with the _latest_ defaults. /// -/// Convenience wrapper equivalent to `aws_config::from_env().load().await` -pub async fn load_from_env() -> aws_types::SdkConfig { +/// Convenience wrapper equivalent to `aws_config::load_defaults(BehaviorVersion::latest()).await` +#[cfg(feature = "behavior-version-latest")] +pub async fn load_from_env() -> SdkConfig { from_env().load().await } -mod loader { - use std::sync::Arc; +/// Create a config loader with the _latest_ defaults. +#[cfg(not(feature = "behavior-version-latest"))] +#[deprecated( + note = "Use the `aws_config::defaults` function. If you don't care about future default behavior changes, you can continue to use this function by enabling the `behavior-version-latest` feature. Doing so will make this deprecation notice go away." +)] +pub fn from_env() -> ConfigLoader { + ConfigLoader::default().behavior_version(BehaviorVersion::latest()) +} + +/// Load default configuration with the _latest_ defaults. +#[cfg(not(feature = "behavior-version-latest"))] +#[deprecated( + note = "Use the `aws_config::load_defaults` function. If you don't care about future default behavior changes, you can continue to use this function by enabling the `behavior-version-latest` feature. Doing so will make this deprecation notice go away." +)] +pub async fn load_from_env() -> SdkConfig { + load_defaults(BehaviorVersion::latest()).await +} + +/// Create a config loader with the defaults for the given behavior version. +/// +/// # Examples +/// ```no_run +/// # async fn create_config() { +/// use aws_config::BehaviorVersion; +/// let config = aws_config::defaults(BehaviorVersion::v2023_11_09()) +/// .region("us-east-1") +/// .load() +/// .await; +/// # } +/// ``` +pub fn defaults(version: BehaviorVersion) -> ConfigLoader { + ConfigLoader::default().behavior_version(version) +} - use aws_credential_types::cache::CredentialsCache; +/// Load default configuration with the given behavior version. +/// +/// Convenience wrapper equivalent to `aws_config::defaults(behavior_version).load().await` +pub async fn load_defaults(version: BehaviorVersion) -> SdkConfig { + defaults(version).load().await +} + +mod loader { + use crate::default_provider::use_dual_stack::use_dual_stack_provider; + use crate::default_provider::use_fips::use_fips_provider; + use crate::default_provider::{app_name, credentials, region, retry_config, timeout_config}; + use crate::meta::region::ProvideRegion; + use crate::profile::profile_file::ProfileFiles; + use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider}; + use aws_credential_types::Credentials; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::{SharedTimeSource, TimeSource}; - use aws_smithy_client::http_connector::HttpConnector; + use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; + use aws_smithy_runtime_api::client::http::HttpClient; + use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; + use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; + use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::app_name::AppName; use aws_types::docs_for; + use aws_types::os_shim_internal::{Env, Fs}; + use aws_types::sdk_config::SharedHttpClient; use aws_types::SdkConfig; - use crate::connector::default_connector; - use crate::default_provider::use_dual_stack::use_dual_stack_provider; - use crate::default_provider::use_fips::use_fips_provider; - use crate::default_provider::{app_name, credentials, region, retry_config, timeout_config}; - use crate::meta::region::ProvideRegion; - use crate::profile::profile_file::ProfileFiles; - use crate::provider_config::ProviderConfig; - #[derive(Default, Debug)] enum CredentialsProviderOption { /// No provider was set by the user. We can set up the default credentials provider chain. @@ -191,7 +248,7 @@ mod loader { #[derive(Default, Debug)] pub struct ConfigLoader { app_name: Option, - credentials_cache: Option, + identity_cache: Option, credentials_provider: CredentialsProviderOption, endpoint_url: Option, region: Option>, @@ -199,15 +256,25 @@ mod loader { sleep: Option, timeout_config: Option, provider_config: Option, - http_connector: Option, + http_client: Option, profile_name_override: Option, profile_files_override: Option, use_fips: Option, use_dual_stack: Option, time_source: Option, + stalled_stream_protection_config: Option, + env: Option, + fs: Option, + behavior_version: Option, } impl ConfigLoader { + /// Sets the [`BehaviorVersion`] used to build [`SdkConfig`](aws_types::SdkConfig). + pub fn behavior_version(mut self, behavior_version: BehaviorVersion) -> Self { + self.behavior_version = Some(behavior_version); + self + } + /// Override the region used to build [`SdkConfig`](aws_types::SdkConfig). /// /// # Examples @@ -243,6 +310,7 @@ mod loader { } /// Override the timeout config used to build [`SdkConfig`](aws_types::SdkConfig). + /// /// **Note: This only sets timeouts for calls to AWS services.** Timeouts for the credentials /// provider chain are configured separately. /// @@ -267,74 +335,94 @@ mod loader { self } - /// Override the sleep implementation for this [`ConfigLoader`]. The sleep implementation - /// is used to create timeout futures. + /// Override the sleep implementation for this [`ConfigLoader`]. + /// + /// The sleep implementation is used to create timeout futures. + /// You generally won't need to change this unless you're using an async runtime other + /// than Tokio. pub fn sleep_impl(mut self, sleep: impl AsyncSleep + 'static) -> Self { // it's possible that we could wrapping an `Arc in an `Arc` and that's OK - self.sleep = Some(SharedAsyncSleep::new(sleep)); + self.sleep = Some(sleep.into_shared()); self } - /// Set the time source used for tasks like signing requests + /// Set the time source used for tasks like signing requests. + /// + /// You generally won't need to change this unless you're compiling for a target + /// that can't provide a default, such as WASM, or unless you're writing a test against + /// the client that needs a fixed time. pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { - self.time_source = Some(SharedTimeSource::new(time_source)); + self.time_source = Some(time_source.into_shared()); self } - /// Override the [`HttpConnector`] for this [`ConfigLoader`]. The connector will be used when - /// sending operations. This **does not set** the HTTP connector used by config providers. - /// To change that connector, use [ConfigLoader::configure]. + /// Override the [`HttpClient`](aws_smithy_runtime_api::client::http::HttpClient) for this [`ConfigLoader`]. + /// + /// The HTTP client will be used for both AWS services and credentials providers. + /// + /// If you wish to use a separate HTTP client for credentials providers when creating clients, + /// then override the HTTP client set with this function on the client-specific `Config`s. /// /// ## Examples + /// /// ```no_run - /// # #[cfg(feature = "client-hyper")] + /// # use aws_smithy_async::rt::sleep::SharedAsyncSleep; + /// #[cfg(feature = "client-hyper")] /// # async fn create_config() { /// use std::time::Duration; - /// use aws_smithy_client::{Client, hyper_ext}; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::http_connector::ConnectorSettings; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() + /// let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() + /// // NOTE: setting `https_only()` will not allow this connector to work with IMDS. /// .https_only() /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); + /// + /// let hyper_client = HyperClientBuilder::new().build(tls_connector); /// let sdk_config = aws_config::from_env() - /// .http_connector(smithy_connector) + /// .http_client(hyper_client) /// .load() /// .await; /// # } /// ``` - pub fn http_connector(mut self, http_connector: impl Into) -> Self { - self.http_connector = Some(http_connector.into()); + pub fn http_client(mut self, http_client: impl HttpClient + 'static) -> Self { + self.http_client = Some(http_client.into_shared()); self } - /// Override the credentials cache used to build [`SdkConfig`](aws_types::SdkConfig). + /// Override the identity cache used to build [`SdkConfig`](aws_types::SdkConfig). + /// + /// The identity cache caches AWS credentials and SSO tokens. By default, a lazy cache is used + /// that will load credentials upon first request, cache them, and then reload them during + /// another request when they are close to expiring. /// /// # Examples /// - /// Override the credentials cache but load the default value for region: + /// Change a setting on the default lazy caching implementation: /// ```no_run - /// # use aws_credential_types::cache::CredentialsCache; + /// use aws_config::identity::IdentityCache; + /// use std::time::Duration; + /// /// # async fn create_config() { /// let config = aws_config::from_env() - /// .credentials_cache(CredentialsCache::lazy()) + /// .identity_cache( + /// IdentityCache::lazy() + /// // Change the load timeout to 10 seconds. + /// // Note: there are other timeouts that could trigger if the load timeout is too long. + /// .load_timeout(Duration::from_secs(10)) + /// .build() + /// ) /// .load() /// .await; /// # } /// ``` - pub fn credentials_cache(mut self, credentials_cache: CredentialsCache) -> Self { - self.credentials_cache = Some(credentials_cache); + pub fn identity_cache( + mut self, + identity_cache: impl ResolveCachedIdentity + 'static, + ) -> Self { + self.identity_cache = Some(identity_cache.into_shared()); self } @@ -365,14 +453,16 @@ mod loader { self } - // TODO(enableNewSmithyRuntimeLaunch): Remove the doc hidden from this function - #[doc(hidden)] /// Don't use credentials to sign requests. /// /// Turning off signing with credentials is necessary in some cases, such as using /// anonymous auth for S3, calling operations in STS that don't require a signature, /// or using token-based auth. /// + /// **Note**: For tests, e.g. with a service like DynamoDB Local, this is **not** what you + /// want. If credentials are disabled, requests cannot be signed. For these use cases, use + /// [`test_credentials`](Self::test_credentials). + /// /// # Examples /// /// Turn off credentials in order to call a service without signing: @@ -389,6 +479,11 @@ mod loader { self } + /// Set test credentials for use when signing requests + pub fn test_credentials(self) -> Self { + self.credentials_provider(Credentials::for_tests()) + } + /// Override the name of the app used to build [`SdkConfig`](aws_types::SdkConfig). /// /// This _optional_ name is used to identify the application in the user agent that @@ -513,27 +608,36 @@ mod loader { self } - /// Set configuration for all sub-loaders (credentials, region etc.) + /// Override the [`StalledStreamProtectionConfig`] used to build [`SdkConfig`](aws_types::SdkConfig). + /// + /// This configures stalled stream protection. When enabled, download streams + /// that stop (stream no data) for longer than a configured grace period will return an error. /// - /// Update the `ProviderConfig` used for all nested loaders. This can be used to override - /// the HTTPs connector used by providers or to stub in an in memory `Env` or `Fs` for testing. + /// By default, streams that transmit less than one byte per-second for five seconds will + /// be cancelled. + /// + /// _Note_: When an override is provided, the default implementation is replaced. /// /// # Examples /// ```no_run - /// # #[cfg(feature = "hyper-client")] /// # async fn create_config() { - /// use aws_config::provider_config::ProviderConfig; - /// let custom_https_connector = hyper_rustls::HttpsConnectorBuilder::new() - /// .with_webpki_roots() - /// .https_only() - /// .enable_http1() - /// .build(); - /// let provider_config = ProviderConfig::default().with_tcp_connector(custom_https_connector); - /// let shared_config = aws_config::from_env().configure(provider_config).load().await; + /// use aws_config::stalled_stream_protection::StalledStreamProtectionConfig; + /// use std::time::Duration; + /// let config = aws_config::from_env() + /// .stalled_stream_protection( + /// StalledStreamProtectionConfig::enabled() + /// .grace_period(Duration::from_secs(1)) + /// .build() + /// ) + /// .load() + /// .await; /// # } /// ``` - pub fn configure(mut self, provider_config: ProviderConfig) -> Self { - self.provider_config = Some(provider_config); + pub fn stalled_stream_protection( + mut self, + stalled_stream_protection_config: StalledStreamProtectionConfig, + ) -> Self { + self.stalled_stream_protection_config = Some(stalled_stream_protection_config); self } @@ -547,10 +651,52 @@ mod loader { /// This means that if you provide a region provider that does not return a region, no region will /// be set in the resulting [`SdkConfig`](aws_types::SdkConfig) pub async fn load(self) -> SdkConfig { + let time_source = self.time_source.unwrap_or_default(); + + let sleep_impl = if self.sleep.is_some() { + self.sleep + } else { + if default_async_sleep().is_none() { + tracing::warn!( + "An implementation of AsyncSleep was requested by calling default_async_sleep \ + but no default was set. + This happened when ConfigLoader::load was called during Config construction. \ + You can fix this by setting a sleep_impl on the ConfigLoader before calling \ + load or by enabling the rt-tokio feature" + ); + } + default_async_sleep() + }; + let conf = self .provider_config - .unwrap_or_default() + .unwrap_or_else(|| { + let mut config = ProviderConfig::init(time_source.clone(), sleep_impl.clone()) + .with_fs(self.fs.unwrap_or_default()) + .with_env(self.env.unwrap_or_default()); + if let Some(http_client) = self.http_client.clone() { + config = config.with_http_client(http_client); + } + config + }) .with_profile_config(self.profile_files_override, self.profile_name_override); + + let use_fips = if let Some(use_fips) = self.use_fips { + Some(use_fips) + } else { + use_fips_provider(&conf).await + }; + + let use_dual_stack = if let Some(use_dual_stack) = self.use_dual_stack { + Some(use_dual_stack) + } else { + use_dual_stack_provider(&conf).await + }; + + let conf = conf + .with_use_fips(use_fips) + .with_use_dual_stack(use_dual_stack); + let region = if let Some(provider) = self.region { provider.region().await } else { @@ -579,21 +725,6 @@ mod loader { .await }; - let sleep_impl = if self.sleep.is_some() { - self.sleep - } else { - if default_async_sleep().is_none() { - tracing::warn!( - "An implementation of AsyncSleep was requested by calling default_async_sleep \ - but no default was set. - This happened when ConfigLoader::load was called during Config construction. \ - You can fix this by setting a sleep_impl on the ConfigLoader before calling \ - load or by enabling the rt-tokio feature" - ); - } - default_async_sleep() - }; - let timeout_config = if let Some(timeout_config) = self.timeout_config { timeout_config } else { @@ -603,10 +734,6 @@ mod loader { .await }; - let http_connector = self - .http_connector - .unwrap_or_else(|| HttpConnector::ConnectorFn(Arc::new(default_connector))); - let credentials_provider = match self.credentials_provider { CredentialsProviderOption::Set(provider) => Some(provider), CredentialsProviderOption::NotSet => { @@ -618,65 +745,54 @@ mod loader { CredentialsProviderOption::ExplicitlyUnset => None, }; - let credentials_cache = if credentials_provider.is_some() { - Some(self.credentials_cache.unwrap_or_else(|| { - let mut builder = CredentialsCache::lazy_builder().time_source( - aws_credential_types::time_source::TimeSource::shared(conf.time_source()), - ); - builder.set_sleep(conf.sleep()); - builder.into_credentials_cache() - })) - } else { - None - }; - - let use_fips = if let Some(use_fips) = self.use_fips { - Some(use_fips) - } else { - use_fips_provider(&conf).await - }; - - let use_dual_stack = if let Some(use_dual_stack) = self.use_dual_stack { - Some(use_dual_stack) - } else { - use_dual_stack_provider(&conf).await - }; - - let ts = self.time_source.unwrap_or_default(); - let mut builder = SdkConfig::builder() .region(region) .retry_config(retry_config) .timeout_config(timeout_config) - .time_source(ts) - .http_connector(http_connector); + .time_source(time_source); + builder.set_behavior_version(self.behavior_version); + builder.set_http_client(self.http_client); builder.set_app_name(app_name); - builder.set_credentials_cache(credentials_cache); + builder.set_identity_cache(self.identity_cache); builder.set_credentials_provider(credentials_provider); builder.set_sleep_impl(sleep_impl); builder.set_endpoint_url(self.endpoint_url); builder.set_use_fips(use_fips); builder.set_use_dual_stack(use_dual_stack); + builder.set_stalled_stream_protection(self.stalled_stream_protection_config); builder.build() } } + #[cfg(test)] + impl ConfigLoader { + pub(crate) fn env(mut self, env: Env) -> Self { + self.env = Some(env); + self + } + + pub(crate) fn fs(mut self, fs: Fs) -> Self { + self.fs = Some(fs); + self + } + } + #[cfg(test)] mod test { + use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; + use crate::test_case::{no_traffic_client, InstantSleep}; + use crate::BehaviorVersion; + use crate::{defaults, ConfigLoader}; use aws_credential_types::provider::ProvideCredentials; use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::never::NeverConnector; + use aws_smithy_runtime::client::http::test_util::{infallible_client_fn, NeverClient}; use aws_types::app_name::AppName; use aws_types::os_shim_internal::{Env, Fs}; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::Arc; use tracing_test::traced_test; - use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; - use crate::provider_config::ProviderConfig; - use crate::test_case::{no_traffic_connector, InstantSleep}; - use crate::{from_env, ConfigLoader}; - #[tokio::test] #[traced_test] async fn provider_config_used() { @@ -688,14 +804,11 @@ mod loader { ]); let fs = Fs::from_slice(&[("test_config", "[profile custom]\nsdk-ua-app-id = correct")]); - let loader = from_env() - .configure( - ProviderConfig::empty() - .with_sleep(TokioSleep::new()) - .with_env(env) - .with_fs(fs) - .with_http_connector(DynConnector::new(NeverConnector::new())), - ) + let loader = defaults(BehaviorVersion::latest()) + .sleep_impl(TokioSleep::new()) + .env(env) + .fs(fs) + .http_client(NeverClient::new()) .profile_name("custom") .profile_files( ProfileFiles::builder() @@ -735,11 +848,9 @@ mod loader { } fn base_conf() -> ConfigLoader { - from_env().configure( - ProviderConfig::empty() - .with_sleep(InstantSleep) - .with_http_connector(no_traffic_connector()), - ) + defaults(BehaviorVersion::latest()) + .sleep_impl(InstantSleep) + .http_client(no_traffic_client()) } #[tokio::test] @@ -764,12 +875,39 @@ mod loader { assert_eq!(Some(&app_name), conf.app_name()); } - #[cfg(aws_sdk_orchestrator_mode)] + #[cfg(feature = "rustls")] #[tokio::test] async fn disable_default_credentials() { - let config = from_env().no_credentials().load().await; - assert!(config.credentials_cache().is_none()); + let config = defaults(BehaviorVersion::latest()) + .no_credentials() + .load() + .await; + assert!(config.identity_cache().is_none()); assert!(config.credentials_provider().is_none()); } + + #[tokio::test] + async fn connector_is_shared() { + let num_requests = Arc::new(AtomicUsize::new(0)); + let movable = num_requests.clone(); + let http_client = infallible_client_fn(move |_req| { + movable.fetch_add(1, Ordering::Relaxed); + http::Response::new("ok!") + }); + let config = defaults(BehaviorVersion::latest()) + .fs(Fs::from_slice(&[])) + .env(Env::from_slice(&[])) + .http_client(http_client.clone()) + .load() + .await; + config + .credentials_provider() + .unwrap() + .provide_credentials() + .await + .expect_err("did not expect credentials to be loaded—no traffic is allowed"); + let num_requests = num_requests.load(Ordering::Relaxed); + assert!(num_requests > 0, "{}", num_requests); + } } } diff --git a/aws/rust-runtime/aws-config/src/profile/app_name.rs b/aws/rust-runtime/aws-config/src/profile/app_name.rs deleted file mode 100644 index 80a5f192ca5..00000000000 --- a/aws/rust-runtime/aws-config/src/profile/app_name.rs +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Load an app name from an AWS profile - -use super::profile_file::ProfileFiles; -use crate::provider_config::ProviderConfig; -use aws_types::app_name::AppName; - -/// Loads an app name from a profile file -/// -/// This provider will attempt to shared AWS shared configuration and then read the -/// `sdk-ua-app-id` property from the active profile. -/// -#[doc = include_str!("location_of_profile_files.md")] -/// -/// # Examples -/// -/// **Loads "my-app" as the app name** -/// ```ini -/// [default] -/// sdk-ua-app-id = my-app -/// ``` -/// -/// **Loads "my-app" as the app name _if and only if_ the `AWS_PROFILE` environment variable -/// is set to `other`.** -/// ```ini -/// [profile other] -/// sdk-ua-app-id = my-app -/// ``` -/// -/// This provider is part of the [default app name provider chain](crate::default_provider::app_name). -#[derive(Debug, Default)] -pub struct ProfileFileAppNameProvider { - provider_config: ProviderConfig, -} - -impl ProfileFileAppNameProvider { - /// Create a new [ProfileFileAppNameProvider} - /// - /// To override the selected profile, set the `AWS_PROFILE` environment variable or use the [`Builder`]. - pub fn new() -> Self { - Self { - provider_config: ProviderConfig::default(), - } - } - - /// [`Builder`] to construct a [`ProfileFileAppNameProvider`] - pub fn builder() -> Builder { - Builder::default() - } - - /// Parses the profile config and attempts to find an app name. - pub async fn app_name(&self) -> Option { - let app_id = self.provider_config.profile().await?.get("sdk-ua-app-id")?; - match AppName::new(app_id.to_owned()) { - Ok(app_name) => Some(app_name), - Err(err) => { - tracing::warn!(err = %err, "`sdk-ua-app-id` property `{}` was invalid", app_id); - None - } - } - } -} - -/// Builder for [ProfileFileAppNameProvider] -#[derive(Debug, Default)] -pub struct Builder { - config: Option, - profile_override: Option, - profile_files: Option, -} - -impl Builder { - /// Override the configuration for this provider - pub fn configure(mut self, config: &ProviderConfig) -> Self { - self.config = Some(config.clone()); - self - } - - /// Override the profile name used by the [ProfileFileAppNameProvider] - pub fn profile_name(mut self, profile_name: impl Into) -> Self { - self.profile_override = Some(profile_name.into()); - self - } - - /// Build a [ProfileFileAppNameProvider] from this builder - pub fn build(self) -> ProfileFileAppNameProvider { - let conf = self - .config - .unwrap_or_default() - .with_profile_config(self.profile_files, self.profile_override); - ProfileFileAppNameProvider { - provider_config: conf, - } - } -} - -#[cfg(test)] -mod tests { - use super::ProfileFileAppNameProvider; - use crate::provider_config::ProviderConfig; - use crate::test_case::no_traffic_connector; - use aws_sdk_sts::config::AppName; - use aws_types::os_shim_internal::{Env, Fs}; - use tracing_test::traced_test; - - fn provider_config(config_contents: &str) -> ProviderConfig { - let fs = Fs::from_slice(&[("test_config", config_contents)]); - let env = Env::from_slice(&[("AWS_CONFIG_FILE", "test_config")]); - ProviderConfig::empty() - .with_fs(fs) - .with_env(env) - .with_http_connector(no_traffic_connector()) - } - - fn default_provider(config_contents: &str) -> ProfileFileAppNameProvider { - ProfileFileAppNameProvider::builder() - .configure(&provider_config(config_contents)) - .build() - } - - #[tokio::test] - async fn no_app_name() { - assert_eq!(None, default_provider("[default]\n").app_name().await); - } - - #[tokio::test] - async fn app_name_default_profile() { - assert_eq!( - Some(AppName::new("test").unwrap()), - default_provider("[default]\nsdk-ua-app-id = test") - .app_name() - .await - ); - } - - #[tokio::test] - async fn app_name_other_profiles() { - let config = "\ - [default]\n\ - sdk-ua-app-id = test\n\ - \n\ - [profile other]\n\ - sdk-ua-app-id = bar\n - "; - assert_eq!( - Some(AppName::new("bar").unwrap()), - ProfileFileAppNameProvider::builder() - .profile_name("other") - .configure(&provider_config(config)) - .build() - .app_name() - .await - ); - } - - #[traced_test] - #[tokio::test] - async fn invalid_app_name() { - assert_eq!( - None, - default_provider("[default]\nsdk-ua-app-id = definitely invalid") - .app_name() - .await - ); - assert!(logs_contain( - "`sdk-ua-app-id` property `definitely invalid` was invalid" - )); - } -} diff --git a/aws/rust-runtime/aws-config/src/profile/credentials.rs b/aws/rust-runtime/aws-config/src/profile/credentials.rs index c3d08e58d53..e050f2d9628 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials.rs @@ -22,15 +22,13 @@ //! - `exec` which contains a chain representation of providers to implement passing bootstrapped credentials //! through a series of providers. -use crate::profile::credentials::exec::named::NamedProviderFactory; -use crate::profile::credentials::exec::ProviderChain; use crate::profile::parser::ProfileFileLoadError; use crate::profile::profile_file::ProfileFiles; use crate::profile::Profile; use crate::provider_config::ProviderConfig; use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; -use aws_sdk_sts::config::Builder as StsConfigBuilder; use aws_smithy_types::error::display::DisplayErrorContext; +use aws_types::SdkConfig; use std::borrow::Cow; use std::collections::HashMap; use std::error::Error; @@ -141,8 +139,8 @@ impl ProvideCredentials for ProfileFileCredentialsProvider { #[doc = include_str!("location_of_profile_files.md")] #[derive(Debug)] pub struct ProfileFileCredentialsProvider { - factory: NamedProviderFactory, - sts_config: StsConfigBuilder, + factory: exec::named::NamedProviderFactory, + sdk_config: SdkConfig, provider_config: ProviderConfig, } @@ -182,7 +180,7 @@ impl ProfileFileCredentialsProvider { }; for provider in inner_provider.chain().iter() { let next_creds = provider - .credentials(creds, &self.sts_config) + .credentials(creds, &self.sdk_config) .instrument(tracing::debug_span!("load_assume_role", provider = ?provider)) .await; match next_creds { @@ -264,6 +262,8 @@ pub enum ProfileFileError { FeatureNotEnabled { /// The feature or comma delimited list of features that must be enabled feature: Cow<'static, str>, + /// Additional information about the missing feature + message: Option>, }, } @@ -317,10 +317,11 @@ impl Display for ProfileFileError { "profile `{}` did not contain credential information", profile ), - ProfileFileError::FeatureNotEnabled { feature: message } => { + ProfileFileError::FeatureNotEnabled { feature, message } => { + let message = message.as_deref().unwrap_or_default(); write!( f, - "This behavior requires following cargo feature(s) enabled: {message}", + "This behavior requires following cargo feature(s) enabled: {feature}. {message}", ) } } @@ -444,7 +445,7 @@ impl Builder { ProfileFileCredentialsProvider { factory, - sts_config: conf.sts_client_config(), + sdk_config: conf.client_config(), provider_config: conf, } } @@ -452,8 +453,8 @@ impl Builder { async fn build_provider_chain( provider_config: &ProviderConfig, - factory: &NamedProviderFactory, -) -> Result { + factory: &exec::named::NamedProviderFactory, +) -> Result { let profile_set = provider_config .try_profile() .await @@ -485,11 +486,15 @@ mod test { } make_test!(e2e_assume_role); + make_test!(e2e_fips_and_dual_stack_sts); make_test!(empty_config); make_test!(retry_on_error); make_test!(invalid_config); make_test!(region_override); + #[cfg(feature = "credentials-process")] make_test!(credential_process); + #[cfg(feature = "credentials-process")] make_test!(credential_process_failure); + #[cfg(feature = "credentials-process")] make_test!(credential_process_invalid); } diff --git a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs index 838007ad1e3..6a84c6d7d3d 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials/exec.rs @@ -4,17 +4,19 @@ */ use super::repr::{self, BaseProvider}; +#[cfg(feature = "credentials-process")] use crate::credential_process::CredentialProcessProvider; use crate::profile::credentials::ProfileFileError; use crate::provider_config::ProviderConfig; -#[cfg(feature = "credentials-sso")] -use crate::sso::{SsoCredentialsProvider, SsoProviderConfig}; use crate::sts; use crate::web_identity_token::{StaticConfiguration, WebIdentityTokenCredentialsProvider}; -use aws_credential_types::provider::{self, error::CredentialsError, ProvideCredentials}; -use aws_sdk_sts::config::{Builder as StsConfigBuilder, Credentials}; +use aws_credential_types::provider::{ + self, error::CredentialsError, ProvideCredentials, SharedCredentialsProvider, +}; +use aws_sdk_sts::config::Credentials; use aws_sdk_sts::Client as StsClient; use aws_smithy_async::time::SharedTimeSource; +use aws_types::SdkConfig; use std::fmt::Debug; use std::sync::Arc; @@ -30,13 +32,13 @@ impl AssumeRoleProvider { pub(super) async fn credentials( &self, input_credentials: Credentials, - sts_config: &StsConfigBuilder, + sdk_config: &SdkConfig, ) -> provider::Result { - let config = sts_config - .clone() - .credentials_provider(input_credentials) + let config = sdk_config + .to_builder() + .credentials_provider(SharedCredentialsProvider::new(input_credentials)) .build(); - let client = StsClient::from_conf(config); + let client = StsClient::new(&config); let session_name = &self.session_name.as_ref().cloned().unwrap_or_else(|| { sts::util::default_session_name("assume-role-from-profile", self.time_source.now()) }); @@ -84,9 +86,22 @@ impl ProviderChain { })? } BaseProvider::AccessKey(key) => Arc::new(key.clone()), - BaseProvider::CredentialProcess(credential_process) => Arc::new( - CredentialProcessProvider::new(credential_process.unredacted().into()), - ), + BaseProvider::CredentialProcess(_credential_process) => { + #[cfg(feature = "credentials-process")] + { + Arc::new(CredentialProcessProvider::from_command(_credential_process)) + } + #[cfg(not(feature = "credentials-process"))] + { + Err(ProfileFileError::FeatureNotEnabled { + feature: "credentials-process".into(), + message: Some( + "In order to spawn a subprocess, the `credentials-process` feature must be enabled." + .into(), + ), + })? + } + } BaseProvider::WebIdentityTokenRole { role_arn, web_identity_token_file, @@ -116,21 +131,26 @@ impl ProviderChain { sso_role_name, sso_start_url, } => { - #[cfg(feature = "credentials-sso")] + #[cfg(feature = "sso")] { + use crate::sso::{credentials::SsoProviderConfig, SsoCredentialsProvider}; use aws_types::region::Region; + let sso_config = SsoProviderConfig { account_id: sso_account_id.to_string(), role_name: sso_role_name.to_string(), start_url: sso_start_url.to_string(), region: Region::new(sso_region.to_string()), + // TODO(https://github.com/awslabs/aws-sdk-rust/issues/703): Implement sso_session_name profile property + session_name: None, }; Arc::new(SsoCredentialsProvider::new(provider_config, sso_config)) } - #[cfg(not(feature = "credentials-sso"))] + #[cfg(not(feature = "sso"))] { Err(ProfileFileError::FeatureNotEnabled { - feature: "credentials-sso".into(), + feature: "sso".into(), + message: None, })? } } @@ -143,8 +163,8 @@ impl ProviderChain { tracing::info!(role_arn = ?role_arn, "which will be used to assume a role"); AssumeRoleProvider { role_arn: role_arn.role_arn.into(), - external_id: role_arn.external_id.map(|id| id.into()), - session_name: role_arn.session_name.map(|id| id.into()), + external_id: role_arn.external_id.map(Into::into), + session_name: role_arn.session_name.map(Into::into), time_source: provider_config.time_source(), } }) @@ -195,7 +215,7 @@ mod test { use crate::profile::credentials::exec::ProviderChain; use crate::profile::credentials::repr::{BaseProvider, ProfileChain}; use crate::provider_config::ProviderConfig; - use crate::test_case::no_traffic_connector; + use crate::test_case::no_traffic_client; use aws_credential_types::Credentials; use std::collections::HashMap; @@ -219,7 +239,7 @@ mod test { fn error_on_unknown_provider() { let factory = NamedProviderFactory::new(HashMap::new()); let chain = ProviderChain::from_repr( - &ProviderConfig::empty().with_http_connector(no_traffic_connector()), + &ProviderConfig::empty().with_http_client(no_traffic_client()), ProfileChain { base: BaseProvider::NamedSource("floozle"), chain: vec![], diff --git a/aws/rust-runtime/aws-config/src/profile/credentials/repr.rs b/aws/rust-runtime/aws-config/src/profile/credentials/repr.rs index 666d74ff437..4bd044b3d35 100644 --- a/aws/rust-runtime/aws-config/src/profile/credentials/repr.rs +++ b/aws/rust-runtime/aws-config/src/profile/credentials/repr.rs @@ -12,9 +12,9 @@ //! 1-credential-per row (as opposed to a direct profile file representation which can combine //! multiple actions into the same profile). -use crate::credential_process::CommandWithSensitiveArgs; use crate::profile::credentials::ProfileFileError; use crate::profile::{Profile, ProfileSet}; +use crate::sensitive_command::CommandWithSensitiveArgs; use aws_credential_types::Credentials; /// Chain of Profile Providers @@ -408,9 +408,9 @@ fn credential_process_from_profile( #[cfg(test)] mod tests { - use crate::credential_process::CommandWithSensitiveArgs; use crate::profile::credentials::repr::{resolve_chain, BaseProvider, ProfileChain}; use crate::profile::ProfileSet; + use crate::sensitive_command::CommandWithSensitiveArgs; use serde::Deserialize; use std::collections::HashMap; use std::error::Error; diff --git a/aws/rust-runtime/aws-config/src/profile/mod.rs b/aws/rust-runtime/aws-config/src/profile/mod.rs index bae8db5ee4d..56490f33352 100644 --- a/aws/rust-runtime/aws-config/src/profile/mod.rs +++ b/aws/rust-runtime/aws-config/src/profile/mod.rs @@ -18,7 +18,6 @@ pub use parser::ProfileParseError; #[doc(inline)] pub use parser::{load, Profile, ProfileFileLoadError, ProfileSet, Property}; -pub mod app_name; pub mod credentials; pub mod profile_file; pub mod region; diff --git a/aws/rust-runtime/aws-config/src/profile/parser.rs b/aws/rust-runtime/aws-config/src/profile/parser.rs index 6d6dc204a33..ef291e264ba 100644 --- a/aws/rust-runtime/aws-config/src/profile/parser.rs +++ b/aws/rust-runtime/aws-config/src/profile/parser.rs @@ -237,7 +237,7 @@ impl From for ProfileFileLoadError { } } -#[doc(hidden)] +/// An error encountered while reading the AWS config file #[derive(Debug, Clone)] pub struct CouldNotReadProfileFile { pub(crate) path: PathBuf, diff --git a/aws/rust-runtime/aws-config/src/profile/region.rs b/aws/rust-runtime/aws-config/src/profile/region.rs index 3cdcf8f7e4f..a293733377d 100644 --- a/aws/rust-runtime/aws-config/src/profile/region.rs +++ b/aws/rust-runtime/aws-config/src/profile/region.rs @@ -157,9 +157,9 @@ impl ProvideRegion for ProfileFileRegionProvider { mod test { use crate::profile::ProfileFileRegionProvider; use crate::provider_config::ProviderConfig; - use crate::test_case::no_traffic_connector; - use aws_sdk_sts::config::Region; + use crate::test_case::no_traffic_client; use aws_types::os_shim_internal::{Env, Fs}; + use aws_types::region::Region; use futures_util::FutureExt; use tracing_test::traced_test; @@ -169,7 +169,7 @@ mod test { ProviderConfig::empty() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()) + .with_http_client(no_traffic_client()) } #[traced_test] @@ -244,7 +244,7 @@ role_arn = arn:aws:iam::123456789012:role/test let provider_config = ProviderConfig::empty() .with_fs(fs) .with_env(env) - .with_http_connector(no_traffic_connector()); + .with_http_client(no_traffic_client()); assert_eq!( Some(Region::new("us-east-1")), diff --git a/aws/rust-runtime/aws-config/src/provider_config.rs b/aws/rust-runtime/aws-config/src/provider_config.rs index afa29898111..f7865a3d7a5 100644 --- a/aws/rust-runtime/aws-config/src/provider_config.rs +++ b/aws/rust-runtime/aws-config/src/provider_config.rs @@ -5,28 +5,24 @@ //! Configuration Options for Credential Providers -use aws_credential_types::time_source::TimeSource; +use crate::profile; +use crate::profile::profile_file::ProfileFiles; +use crate::profile::{ProfileFileLoadError, ProfileSet}; use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; -use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::erase::DynConnector; +use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::client::http::HttpClient; +use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::error::display::DisplayErrorContext; +use aws_smithy_types::retry::RetryConfig; use aws_types::os_shim_internal::{Env, Fs}; -use aws_types::{ - http_connector::{ConnectorSettings, HttpConnector}, - region::Region, -}; +use aws_types::region::Region; +use aws_types::sdk_config::SharedHttpClient; +use aws_types::SdkConfig; use std::borrow::Cow; - use std::fmt::{Debug, Formatter}; use std::sync::Arc; use tokio::sync::OnceCell; -use crate::connector::default_connector; -use crate::profile; - -use crate::profile::profile_file::ProfileFiles; -use crate::profile::{ProfileFileLoadError, ProfileSet}; - /// Configuration options for Credential Providers /// /// Most credential providers builders offer a `configure` method which applies general provider configuration @@ -40,9 +36,11 @@ pub struct ProviderConfig { env: Env, fs: Fs, time_source: SharedTimeSource, - connector: HttpConnector, - sleep: Option, + http_client: Option, + sleep_impl: Option, region: Option, + use_fips: Option, + use_dual_stack: Option, /// An AWS profile created from `ProfileFiles` and a `profile_name` parsed_profile: Arc>>, /// A list of [std::path::Path]s to profile files @@ -56,27 +54,28 @@ impl Debug for ProviderConfig { f.debug_struct("ProviderConfig") .field("env", &self.env) .field("fs", &self.fs) - .field("sleep", &self.sleep) + .field("time_source", &self.time_source) + .field("http_client", &self.http_client) + .field("sleep_impl", &self.sleep_impl) .field("region", &self.region) + .field("use_fips", &self.use_fips) + .field("use_dual_stack", &self.use_dual_stack) + .field("profile_name_override", &self.profile_name_override) .finish() } } impl Default for ProviderConfig { fn default() -> Self { - let connector = HttpConnector::ConnectorFn(Arc::new( - |settings: &ConnectorSettings, sleep: Option| { - default_connector(settings, sleep) - }, - )); - Self { env: Env::default(), fs: Fs::default(), time_source: SharedTimeSource::default(), - connector, - sleep: default_async_sleep(), + http_client: None, + sleep_impl: default_async_sleep(), region: None, + use_fips: None, + use_dual_stack: None, parsed_profile: Default::default(), profile_files: ProfileFiles::default(), profile_name_override: None, @@ -91,6 +90,7 @@ impl ProviderConfig { /// Unlike [`ProviderConfig::empty`] where `env` and `fs` will use their non-mocked implementations, /// this method will use an empty mock environment and an empty mock file system. pub fn no_configuration() -> Self { + use aws_smithy_async::time::StaticTimeSource; use std::collections::HashMap; use std::time::UNIX_EPOCH; let fs = Fs::from_raw_map(HashMap::new()); @@ -100,10 +100,12 @@ impl ProviderConfig { profile_files: ProfileFiles::default(), env, fs, - time_source: SharedTimeSource::new(UNIX_EPOCH), - connector: HttpConnector::Prebuilt(None), - sleep: None, + time_source: SharedTimeSource::new(StaticTimeSource::new(UNIX_EPOCH)), + http_client: None, + sleep_impl: None, region: None, + use_fips: None, + use_dual_stack: None, profile_name_override: None, } } @@ -141,15 +143,37 @@ impl ProviderConfig { env: Env::default(), fs: Fs::default(), time_source: SharedTimeSource::default(), - connector: HttpConnector::Prebuilt(None), - sleep: None, + http_client: None, + sleep_impl: None, region: None, + use_fips: None, + use_dual_stack: None, parsed_profile: Default::default(), profile_files: ProfileFiles::default(), profile_name_override: None, } } + /// Initializer for ConfigBag to avoid possibly setting incorrect defaults. + pub(crate) fn init( + time_source: SharedTimeSource, + sleep_impl: Option, + ) -> Self { + Self { + parsed_profile: Default::default(), + profile_files: ProfileFiles::default(), + env: Env::default(), + fs: Fs::default(), + time_source, + http_client: None, + sleep_impl, + region: None, + use_fips: None, + use_dual_stack: None, + profile_name_override: None, + } + } + /// Create a default provider config with the region region automatically loaded from the default chain. /// /// # Examples @@ -166,6 +190,19 @@ impl ProviderConfig { Self::without_region().load_default_region().await } + pub(crate) fn client_config(&self) -> SdkConfig { + let mut builder = SdkConfig::builder() + .retry_config(RetryConfig::standard()) + .region(self.region()) + .time_source(self.time_source()) + .use_fips(self.use_fips().unwrap_or_default()) + .use_dual_stack(self.use_dual_stack().unwrap_or_default()) + .behavior_version(crate::BehaviorVersion::latest()); + builder.set_http_client(self.http_client.clone()); + builder.set_sleep_impl(self.sleep_impl.clone()); + builder.build() + } + // When all crate features are disabled, these accessors are unused #[allow(dead_code)] @@ -184,24 +221,28 @@ impl ProviderConfig { } #[allow(dead_code)] - pub(crate) fn default_connector(&self) -> Option { - self.connector - .connector(&Default::default(), self.sleep.clone()) + pub(crate) fn http_client(&self) -> Option { + self.http_client.clone() } #[allow(dead_code)] - pub(crate) fn connector(&self, settings: &ConnectorSettings) -> Option { - self.connector.connector(settings, self.sleep.clone()) + pub(crate) fn sleep_impl(&self) -> Option { + self.sleep_impl.clone() } #[allow(dead_code)] - pub(crate) fn sleep(&self) -> Option { - self.sleep.clone() + pub(crate) fn region(&self) -> Option { + self.region.clone() } #[allow(dead_code)] - pub(crate) fn region(&self) -> Option { - self.region.clone() + pub(crate) fn use_fips(&self) -> Option { + self.use_fips + } + + #[allow(dead_code)] + pub(crate) fn use_dual_stack(&self) -> Option { + self.use_dual_stack } pub(crate) async fn try_profile(&self) -> Result<&ProfileSet, &ProfileFileLoadError> { @@ -234,6 +275,18 @@ impl ProviderConfig { self } + /// Override the `use_fips` setting. + pub(crate) fn with_use_fips(mut self, use_fips: Option) -> Self { + self.use_fips = use_fips; + self + } + + /// Override the `use_dual_stack` setting. + pub(crate) fn with_use_dual_stack(mut self, use_dual_stack: Option) -> Self { + self.use_dual_stack = use_dual_stack; + self + } + pub(crate) fn with_profile_name(self, profile_name: String) -> Self { let profile_files = self.profile_files.clone(); self.with_profile_config(Some(profile_files), Some(profile_name)) @@ -270,10 +323,7 @@ impl ProviderConfig { self.with_region(provider_chain.region().await) } - // these setters are doc(hidden) because they only exist for tests - - #[doc(hidden)] - pub fn with_fs(self, fs: Fs) -> Self { + pub(crate) fn with_fs(self, fs: Fs) -> Self { ProviderConfig { parsed_profile: Default::default(), fs, @@ -281,8 +331,7 @@ impl ProviderConfig { } } - #[doc(hidden)] - pub fn with_env(self, env: Env) -> Self { + pub(crate) fn with_env(self, env: Env) -> Self { ProviderConfig { parsed_profile: Default::default(), env, @@ -290,66 +339,26 @@ impl ProviderConfig { } } - #[doc(hidden)] - pub fn with_time_source(self, time_source: TimeSource) -> Self { + /// Override the time source for this configuration + pub fn with_time_source(self, time_source: impl TimeSource + 'static) -> Self { ProviderConfig { - time_source: SharedTimeSource::new(time_source), + time_source: time_source.into_shared(), ..self } } - /// Override the HTTPS connector for this configuration - /// - /// **Warning**: Use of this method will prevent you from taking advantage of the HTTP connect timeouts. - /// Consider [`ProviderConfig::with_tcp_connector`]. - /// - /// # Stability - /// This method is expected to change to support HTTP configuration. - pub fn with_http_connector(self, connector: DynConnector) -> Self { - ProviderConfig { - connector: HttpConnector::Prebuilt(Some(connector)), - ..self - } - } - - /// Override the TCP connector for this configuration - /// - /// This connector MUST provide an HTTPS encrypted connection. - /// - /// # Stability - /// This method may change to support HTTP configuration. - #[cfg(feature = "client-hyper")] - pub fn with_tcp_connector(self, connector: C) -> Self - where - C: Clone + Send + Sync + 'static, - C: tower::Service, - C::Response: hyper::client::connect::Connection - + tokio::io::AsyncRead - + tokio::io::AsyncWrite - + Send - + Unpin - + 'static, - C::Future: Unpin + Send + 'static, - C::Error: Into>, - { - let connector_fn = move |settings: &ConnectorSettings, sleep: Option| { - let mut builder = aws_smithy_client::hyper_ext::Adapter::builder() - .connector_settings(settings.clone()); - if let Some(sleep) = sleep { - builder = builder.sleep_impl(sleep); - }; - Some(DynConnector::new(builder.build(connector.clone()))) - }; + /// Override the HTTP client for this configuration + pub fn with_http_client(self, http_client: impl HttpClient + 'static) -> Self { ProviderConfig { - connector: HttpConnector::ConnectorFn(Arc::new(connector_fn)), + http_client: Some(http_client.into_shared()), ..self } } /// Override the sleep implementation for this configuration - pub fn with_sleep(self, sleep: impl AsyncSleep + 'static) -> Self { + pub fn with_sleep_impl(self, sleep_impl: impl AsyncSleep + 'static) -> Self { ProviderConfig { - sleep: Some(SharedAsyncSleep::new(sleep)), + sleep_impl: Some(sleep_impl.into_shared()), ..self } } diff --git a/aws/rust-runtime/aws-config/src/sensitive_command.rs b/aws/rust-runtime/aws-config/src/sensitive_command.rs new file mode 100644 index 00000000000..84f87584a3c --- /dev/null +++ b/aws/rust-runtime/aws-config/src/sensitive_command.rs @@ -0,0 +1,51 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::fmt; + +#[derive(Clone)] +pub(crate) struct CommandWithSensitiveArgs(T); + +impl CommandWithSensitiveArgs +where + T: AsRef, +{ + pub(crate) fn new(value: T) -> Self { + Self(value) + } + + #[allow(dead_code)] + pub(crate) fn to_owned_string(&self) -> CommandWithSensitiveArgs { + CommandWithSensitiveArgs(self.0.as_ref().to_string()) + } + + #[allow(dead_code)] + pub(crate) fn unredacted(&self) -> &str { + self.0.as_ref() + } +} + +impl fmt::Display for CommandWithSensitiveArgs +where + T: AsRef, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // Security: The arguments for command must be redacted since they can be sensitive + let command = self.0.as_ref(); + match command.find(char::is_whitespace) { + Some(index) => write!(f, "{} ** arguments redacted **", &command[0..index]), + None => write!(f, "{}", command), + } + } +} + +impl fmt::Debug for CommandWithSensitiveArgs +where + T: AsRef, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", format!("{}", self)) + } +} diff --git a/aws/rust-runtime/aws-config/src/sso.rs b/aws/rust-runtime/aws-config/src/sso.rs index a4b0314b1d1..69ed37ed0fc 100644 --- a/aws/rust-runtime/aws-config/src/sso.rs +++ b/aws/rust-runtime/aws-config/src/sso.rs @@ -3,455 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! SSO Credentials Provider -//! -//! This credentials provider enables loading credentials from `~/.aws/sso/cache`. For more information, -//! see [Using AWS SSO Credentials](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/sso-credentials.html) -//! -//! This provider is included automatically when profiles are loaded. +//! SSO Credentials and Token providers -use crate::fs_util::{home_dir, Os}; -use crate::json_credentials::{json_parse_loop, InvalidJsonCredentials}; -use crate::provider_config::ProviderConfig; +pub mod credentials; -use aws_credential_types::cache::CredentialsCache; -use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; -use aws_credential_types::Credentials; -use aws_sdk_sso::types::RoleCredentials; -use aws_sdk_sso::{config::Builder as SsoConfigBuilder, Client as SsoClient, Config as SsoConfig}; -use aws_smithy_json::deserialize::Token; -use aws_smithy_types::date_time::Format; -use aws_smithy_types::DateTime; -use aws_types::os_shim_internal::{Env, Fs}; -use aws_types::region::Region; +pub use credentials::SsoCredentialsProvider; -use std::convert::TryInto; -use std::error::Error; -use std::fmt::{Display, Formatter}; -use std::io; -use std::path::PathBuf; +pub mod token; -use crate::connector::expect_connector; -use aws_smithy_types::retry::RetryConfig; -use ring::digest; -use zeroize::Zeroizing; +pub use token::SsoTokenProvider; -/// SSO Credentials Provider -/// -/// _Note: This provider is part of the default credentials chain and is integrated with the profile-file provider._ -/// -/// This credentials provider will use cached SSO tokens stored in `~/.aws/sso/cache/.json`. -/// `` is computed based on the configured [`start_url`](Builder::start_url). -#[derive(Debug)] -pub struct SsoCredentialsProvider { - fs: Fs, - env: Env, - sso_provider_config: SsoProviderConfig, - sso_config: SsoConfigBuilder, -} - -impl SsoCredentialsProvider { - /// Creates a builder for [`SsoCredentialsProvider`] - pub fn builder() -> Builder { - Builder::new() - } - - pub(crate) fn new( - provider_config: &ProviderConfig, - sso_provider_config: SsoProviderConfig, - ) -> Self { - let fs = provider_config.fs(); - let env = provider_config.env(); - - let mut sso_config = SsoConfig::builder() - .http_connector(expect_connector( - provider_config.connector(&Default::default()), - )) - .retry_config(RetryConfig::standard()); - sso_config.set_sleep_impl(provider_config.sleep()); - - SsoCredentialsProvider { - fs, - env, - sso_provider_config, - sso_config, - } - } - - async fn credentials(&self) -> provider::Result { - load_sso_credentials( - &self.sso_provider_config, - &self.sso_config, - &self.env, - &self.fs, - ) - .await - } -} - -impl ProvideCredentials for SsoCredentialsProvider { - fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - future::ProvideCredentials::new(self.credentials()) - } -} - -/// Builder for [`SsoCredentialsProvider`] -#[derive(Default, Debug, Clone)] -pub struct Builder { - provider_config: Option, - account_id: Option, - role_name: Option, - start_url: Option, - region: Option, -} - -impl Builder { - /// Create a new builder for [`SsoCredentialsProvider`] - pub fn new() -> Self { - Self::default() - } - - /// Override the configuration used for this provider - pub fn configure(mut self, provider_config: &ProviderConfig) -> Self { - self.provider_config = Some(provider_config.clone()); - self - } - - /// Set the account id used for SSO - pub fn account_id(mut self, account_id: impl Into) -> Self { - self.account_id = Some(account_id.into()); - self - } - - /// Set the role name used for SSO - pub fn role_name(mut self, role_name: impl Into) -> Self { - self.role_name = Some(role_name.into()); - self - } - - /// Set the start URL used for SSO - pub fn start_url(mut self, start_url: impl Into) -> Self { - self.start_url = Some(start_url.into()); - self - } - - /// Set the region used for SSO - pub fn region(mut self, region: Region) -> Self { - self.region = Some(region); - self - } - - /// Construct an SsoCredentialsProvider from the builder - /// - /// # Panics - /// This method will panic if the any of the following required fields are unset: - /// - [`start_url`](Self::start_url) - /// - [`role_name`](Self::role_name) - /// - [`account_id`](Self::account_id) - /// - [`region`](Self::region) - pub fn build(self) -> SsoCredentialsProvider { - let provider_config = self.provider_config.unwrap_or_default(); - let sso_config = SsoProviderConfig { - account_id: self.account_id.expect("account_id must be set"), - role_name: self.role_name.expect("role_name must be set"), - start_url: self.start_url.expect("start_url must be set"), - region: self.region.expect("region must be set"), - }; - SsoCredentialsProvider::new(&provider_config, sso_config) - } -} - -#[derive(Debug)] -pub(crate) enum LoadTokenError { - InvalidCredentials(InvalidJsonCredentials), - NoHomeDirectory, - IoError { err: io::Error, path: PathBuf }, -} - -impl Display for LoadTokenError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - match self { - LoadTokenError::InvalidCredentials(err) => { - write!(f, "SSO Token was invalid (expected JSON): {}", err) - } - LoadTokenError::NoHomeDirectory => write!(f, "Could not resolve a home directory"), - LoadTokenError::IoError { err, path } => { - write!(f, "failed to read `{}`: {}", path.display(), err) - } - } - } -} - -impl Error for LoadTokenError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - match self { - LoadTokenError::InvalidCredentials(err) => Some(err as _), - LoadTokenError::NoHomeDirectory => None, - LoadTokenError::IoError { err, .. } => Some(err as _), - } - } -} - -#[derive(Debug)] -pub(crate) struct SsoProviderConfig { - pub(crate) account_id: String, - pub(crate) role_name: String, - pub(crate) start_url: String, - pub(crate) region: Region, -} - -async fn load_sso_credentials( - sso_provider_config: &SsoProviderConfig, - sso_config: &SsoConfigBuilder, - env: &Env, - fs: &Fs, -) -> provider::Result { - let token = load_token(&sso_provider_config.start_url, env, fs) - .await - .map_err(CredentialsError::provider_error)?; - let config = sso_config - .clone() - .region(sso_provider_config.region.clone()) - .credentials_cache(CredentialsCache::no_caching()) - .build(); - // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed - let client = SsoClient::from_conf(config); - let resp = client - .get_role_credentials() - .role_name(&sso_provider_config.role_name) - .access_token(&*token.access_token) - .account_id(&sso_provider_config.account_id) - .send() - .await - .map_err(CredentialsError::provider_error)?; - let credentials: RoleCredentials = resp - .role_credentials - .ok_or_else(|| CredentialsError::unhandled("SSO did not return credentials"))?; - let akid = credentials - .access_key_id - .ok_or_else(|| CredentialsError::unhandled("no access key id in response"))?; - let secret_key = credentials - .secret_access_key - .ok_or_else(|| CredentialsError::unhandled("no secret key in response"))?; - let expiration = DateTime::from_millis(credentials.expiration) - .try_into() - .map_err(|err| { - CredentialsError::unhandled(format!( - "expiration could not be converted into a system time: {}", - err - )) - })?; - Ok(Credentials::new( - akid, - secret_key, - credentials.session_token, - Some(expiration), - "SSO", - )) -} - -/// Load the token for `start_url` from `~/.aws/sso/cache/.json` -async fn load_token(start_url: &str, env: &Env, fs: &Fs) -> Result { - let home = home_dir(env, Os::real()).ok_or(LoadTokenError::NoHomeDirectory)?; - let path = sso_token_path(start_url, &home); - let data = - Zeroizing::new( - fs.read_to_end(&path) - .await - .map_err(|err| LoadTokenError::IoError { - err, - path: path.to_path_buf(), - })?, - ); - let token = parse_token_json(&data).map_err(LoadTokenError::InvalidCredentials)?; - Ok(token) -} - -#[derive(Debug, Clone, PartialEq)] -pub(crate) struct SsoToken { - access_token: Zeroizing, - expires_at: DateTime, - region: Option, -} - -/// Parse SSO token JSON from input -fn parse_token_json(input: &[u8]) -> Result { - /* - Example: - { - "accessToken": "base64string", - "expiresAt": "2019-11-14T04:05:45Z", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }*/ - let mut acccess_token = None; - let mut expires_at = None; - let mut region = None; - let mut start_url = None; - json_parse_loop(input, |key, value| { - match (key, value) { - (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("accessToken") => { - acccess_token = Some(value.to_unescaped()?.to_string()) - } - (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("expiresAt") => { - expires_at = Some(value.to_unescaped()?) - } - (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("region") => { - region = Some(value.to_unescaped()?.to_string()) - } - (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("startUrl") => { - start_url = Some(value.to_unescaped()?.to_string()) - } - _other => {} // ignored - }; - Ok(()) - })?; - let access_token = - Zeroizing::new(acccess_token.ok_or(InvalidJsonCredentials::MissingField("accessToken"))?); - let expires_at = expires_at.ok_or(InvalidJsonCredentials::MissingField("expiresAt"))?; - let expires_at = DateTime::from_str(expires_at.as_ref(), Format::DateTime).map_err(|e| { - InvalidJsonCredentials::InvalidField { - field: "expiresAt", - err: e.into(), - } - })?; - let region = region.map(Region::new); - Ok(SsoToken { - access_token, - expires_at, - region, - }) -} - -/// Determine the SSO token path for a given start_url -fn sso_token_path(start_url: &str, home: &str) -> PathBuf { - // hex::encode returns a lowercase string - let mut out = PathBuf::with_capacity(home.len() + "/.aws/sso/cache".len() + ".json".len() + 40); - out.push(home); - out.push(".aws/sso/cache"); - out.push(&hex::encode(digest::digest( - &digest::SHA1_FOR_LEGACY_USE_ONLY, - start_url.as_bytes(), - ))); - out.set_extension("json"); - out -} - -#[cfg(test)] -mod test { - use crate::json_credentials::InvalidJsonCredentials; - use crate::sso::{load_token, parse_token_json, sso_token_path, LoadTokenError, SsoToken}; - use aws_smithy_types::DateTime; - use aws_types::os_shim_internal::{Env, Fs}; - use aws_types::region::Region; - use zeroize::Zeroizing; - - #[test] - fn deserialize_valid_tokens() { - let token = br#" - { - "accessToken": "base64string", - "expiresAt": "2009-02-13T23:31:30Z", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }"#; - assert_eq!( - parse_token_json(token).expect("valid"), - SsoToken { - access_token: Zeroizing::new("base64string".into()), - expires_at: DateTime::from_secs(1234567890), - region: Some(Region::from_static("us-west-2")) - } - ); - - let no_region = br#"{ - "accessToken": "base64string", - "expiresAt": "2009-02-13T23:31:30Z" - }"#; - assert_eq!( - parse_token_json(no_region).expect("valid"), - SsoToken { - access_token: Zeroizing::new("base64string".into()), - expires_at: DateTime::from_secs(1234567890), - region: None - } - ); - } - - #[test] - fn invalid_timestamp() { - let token = br#" - { - "accessToken": "base64string", - "expiresAt": "notatimestamp", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }"#; - let err = parse_token_json(token).expect_err("invalid timestamp"); - assert!( - format!("{}", err).contains("Invalid field in response: `expiresAt`."), - "{}", - err - ); - } - - #[test] - fn missing_fields() { - let token = br#" - { - "expiresAt": "notatimestamp", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }"#; - let err = parse_token_json(token).expect_err("missing akid"); - assert!( - matches!(err, InvalidJsonCredentials::MissingField("accessToken")), - "incorrect error: {:?}", - err - ); - - let token = br#" - { - "accessToken": "akid", - "region": "us-west-2", - "startUrl": "https://d-abc123.awsapps.com/start" - }"#; - let err = parse_token_json(token).expect_err("missing expiry"); - assert!( - matches!(err, InvalidJsonCredentials::MissingField("expiresAt")), - "incorrect error: {:?}", - err - ); - } - - #[test] - fn determine_correct_cache_filenames() { - assert_eq!( - sso_token_path("https://d-92671207e4.awsapps.com/start", "/home/me").as_os_str(), - "/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json" - ); - assert_eq!( - sso_token_path("https://d-92671207e4.awsapps.com/start", "/home/me/").as_os_str(), - "/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json" - ); - } - - #[tokio::test] - async fn gracefully_handle_missing_files() { - let err = load_token( - "asdf", - &Env::from_slice(&[("HOME", "/home")]), - &Fs::from_slice(&[]), - ) - .await - .expect_err("should fail, file is missing"); - assert!( - matches!(err, LoadTokenError::IoError { .. }), - "should be io error, got {}", - err - ); - } -} +mod cache; diff --git a/aws/rust-runtime/aws-config/src/sso/cache.rs b/aws/rust-runtime/aws-config/src/sso/cache.rs new file mode 100644 index 00000000000..5d78798f87d --- /dev/null +++ b/aws/rust-runtime/aws-config/src/sso/cache.rs @@ -0,0 +1,594 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::fs_util::{home_dir, Os}; +use aws_smithy_json::deserialize::token::skip_value; +use aws_smithy_json::deserialize::Token; +use aws_smithy_json::deserialize::{json_token_iter, EscapeError}; +use aws_smithy_json::serialize::JsonObjectWriter; +use aws_smithy_types::date_time::{DateTimeFormatError, Format}; +use aws_smithy_types::DateTime; +use aws_types::os_shim_internal::{Env, Fs}; +use ring::digest; +use std::borrow::Cow; +use std::error::Error as StdError; +use std::fmt; +use std::path::PathBuf; +use std::time::SystemTime; +use zeroize::Zeroizing; + +#[cfg_attr(test, derive(Eq, PartialEq))] +#[derive(Clone)] +pub(super) struct CachedSsoToken { + pub(super) access_token: Zeroizing, + pub(super) client_id: Option, + pub(super) client_secret: Option>, + pub(super) expires_at: SystemTime, + pub(super) refresh_token: Option>, + pub(super) region: Option, + pub(super) registration_expires_at: Option, + pub(super) start_url: Option, +} + +impl CachedSsoToken { + /// True if the information required to refresh this token is present. + /// + /// The expiration times are not considered by this function. + pub(super) fn refreshable(&self) -> bool { + self.client_id.is_some() + && self.client_secret.is_some() + && self.refresh_token.is_some() + && self.registration_expires_at.is_some() + } +} + +impl fmt::Debug for CachedSsoToken { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("CachedSsoToken") + .field("access_token", &"** redacted **") + .field("client_id", &self.client_id) + .field("client_secret", &"** redacted **") + .field("expires_at", &self.expires_at) + .field("refresh_token", &"** redacted **") + .field("region", &self.region) + .field("registration_expires_at", &self.registration_expires_at) + .field("start_url", &self.start_url) + .finish() + } +} + +#[derive(Debug)] +pub(super) enum CachedSsoTokenError { + FailedToFormatDateTime { + source: Box, + }, + InvalidField { + field: &'static str, + source: Box, + }, + IoError { + what: &'static str, + path: PathBuf, + source: std::io::Error, + }, + JsonError(Box), + MissingField(&'static str), + NoHomeDirectory, + Other(Cow<'static, str>), +} + +impl fmt::Display for CachedSsoTokenError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::FailedToFormatDateTime { .. } => write!(f, "failed to format date time"), + Self::InvalidField { field, .. } => write!( + f, + "invalid value for the `{field}` field in the cached SSO token file" + ), + Self::IoError { what, path, .. } => write!(f, "failed to {what} `{}`", path.display()), + Self::JsonError(_) => write!(f, "invalid JSON in cached SSO token file"), + Self::MissingField(field) => { + write!(f, "missing field `{field}` in cached SSO token file") + } + Self::NoHomeDirectory => write!(f, "couldn't resolve a home directory"), + Self::Other(message) => f.write_str(message), + } + } +} + +impl StdError for CachedSsoTokenError { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + match self { + Self::FailedToFormatDateTime { source } => Some(source.as_ref()), + Self::InvalidField { source, .. } => Some(source.as_ref()), + Self::IoError { source, .. } => Some(source), + Self::JsonError(source) => Some(source.as_ref()), + Self::MissingField(_) => None, + Self::NoHomeDirectory => None, + Self::Other(_) => None, + } + } +} + +impl From for CachedSsoTokenError { + fn from(err: EscapeError) -> Self { + Self::JsonError(err.into()) + } +} + +impl From for CachedSsoTokenError { + fn from(err: aws_smithy_json::deserialize::error::DeserializeError) -> Self { + Self::JsonError(err.into()) + } +} + +impl From for CachedSsoTokenError { + fn from(value: DateTimeFormatError) -> Self { + Self::FailedToFormatDateTime { + source: value.into(), + } + } +} + +/// Determine the SSO cached token path for a given identifier. +/// +/// The `identifier` is the `sso_start_url` for credentials providers, and `sso_session_name` for token providers. +fn cached_token_path(identifier: &str, home: &str) -> PathBuf { + // hex::encode returns a lowercase string + let mut out = PathBuf::with_capacity(home.len() + "/.aws/sso/cache".len() + ".json".len() + 40); + out.push(home); + out.push(".aws/sso/cache"); + out.push(&hex::encode(digest::digest( + &digest::SHA1_FOR_LEGACY_USE_ONLY, + identifier.as_bytes(), + ))); + out.set_extension("json"); + out +} + +/// Load the token for `identifier` from `~/.aws/sso/cache/.json` +/// +/// The `identifier` is the `sso_start_url` for credentials providers, and `sso_session_name` for token providers. +pub(super) async fn load_cached_token( + env: &Env, + fs: &Fs, + identifier: &str, +) -> Result { + let home = home_dir(env, Os::real()).ok_or(CachedSsoTokenError::NoHomeDirectory)?; + let path = cached_token_path(identifier, &home); + let data = Zeroizing::new(fs.read_to_end(&path).await.map_err(|source| { + CachedSsoTokenError::IoError { + what: "read", + path, + source, + } + })?); + parse_cached_token(&data) +} + +/// Parse SSO token JSON from input +fn parse_cached_token( + cached_token_file_contents: &[u8], +) -> Result { + use CachedSsoTokenError as Error; + + let mut access_token = None; + let mut expires_at = None; + let mut client_id = None; + let mut client_secret = None; + let mut refresh_token = None; + let mut region = None; + let mut registration_expires_at = None; + let mut start_url = None; + json_parse_loop(cached_token_file_contents, |key, value| { + match (key, value) { + /* + // Required fields: + "accessToken": "string", + "expiresAt": "2019-11-14T04:05:45Z", + + // Optional fields: + "refreshToken": "string", + "clientId": "ABCDEFG323242423121312312312312312", + "clientSecret": "ABCDE123", + "registrationExpiresAt": "2022-03-06T19:53:17Z", + "region": "us-west-2", + "startUrl": "https://d-abc123.awsapps.com/start" + */ + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("accessToken") => { + access_token = Some(Zeroizing::new(value.to_unescaped()?.into_owned())); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("expiresAt") => { + expires_at = Some(value.to_unescaped()?); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("clientId") => { + client_id = Some(value.to_unescaped()?); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("clientSecret") => { + client_secret = Some(Zeroizing::new(value.to_unescaped()?.into_owned())); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("refreshToken") => { + refresh_token = Some(Zeroizing::new(value.to_unescaped()?.into_owned())); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("region") => { + region = Some(value.to_unescaped()?.into_owned()); + } + (key, Token::ValueString { value, .. }) + if key.eq_ignore_ascii_case("registrationExpiresAt") => + { + registration_expires_at = Some(value.to_unescaped()?); + } + (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case("startUrl") => { + start_url = Some(value.to_unescaped()?.into_owned()); + } + _ => {} + }; + Ok(()) + })?; + + Ok(CachedSsoToken { + access_token: access_token.ok_or(Error::MissingField("accessToken"))?, + expires_at: expires_at + .ok_or(Error::MissingField("expiresAt")) + .and_then(|expires_at| { + DateTime::from_str(expires_at.as_ref(), Format::DateTime) + .map_err(|err| Error::InvalidField { field: "expiresAt", source: err.into() }) + .and_then(|date_time| { + SystemTime::try_from(date_time).map_err(|_| { + Error::Other( + "SSO token expiration time cannot be represented by a SystemTime" + .into(), + ) + }) + }) + })?, + client_id: client_id.map(Cow::into_owned), + client_secret, + refresh_token, + region, + registration_expires_at: Ok(registration_expires_at).and_then(|maybe_expires_at| { + if let Some(expires_at) = maybe_expires_at { + Some( + DateTime::from_str(expires_at.as_ref(), Format::DateTime) + .map_err(|err| Error::InvalidField { field: "registrationExpiresAt", source: err.into()}) + .and_then(|date_time| { + SystemTime::try_from(date_time).map_err(|_| { + Error::Other( + "SSO registration expiration time cannot be represented by a SystemTime" + .into(), + ) + }) + }), + ) + .transpose() + } else { + Ok(None) + } + })?, + start_url, + }) +} + +fn json_parse_loop<'a>( + input: &'a [u8], + mut f: impl FnMut(Cow<'a, str>, &Token<'a>) -> Result<(), CachedSsoTokenError>, +) -> Result<(), CachedSsoTokenError> { + use CachedSsoTokenError as Error; + let mut tokens = json_token_iter(input).peekable(); + if !matches!(tokens.next().transpose()?, Some(Token::StartObject { .. })) { + return Err(Error::Other( + "expected a JSON document starting with `{`".into(), + )); + } + loop { + match tokens.next().transpose()? { + Some(Token::EndObject { .. }) => break, + Some(Token::ObjectKey { key, .. }) => { + if let Some(Ok(token)) = tokens.peek() { + let key = key.to_unescaped()?; + f(key, token)? + } + skip_value(&mut tokens)?; + } + other => { + return Err(Error::Other( + format!("expected object key, found: {:?}", other).into(), + )); + } + } + } + if tokens.next().is_some() { + return Err(Error::Other( + "found more JSON tokens after completing parsing".into(), + )); + } + Ok(()) +} + +pub(super) async fn save_cached_token( + env: &Env, + fs: &Fs, + identifier: &str, + token: &CachedSsoToken, +) -> Result<(), CachedSsoTokenError> { + let expires_at = DateTime::from(token.expires_at).fmt(Format::DateTime)?; + let registration_expires_at = token + .registration_expires_at + .map(|time| DateTime::from(time).fmt(Format::DateTime)) + .transpose()?; + + let mut out = Zeroizing::new(String::new()); + let mut writer = JsonObjectWriter::new(&mut out); + writer.key("accessToken").string(&token.access_token); + writer.key("expiresAt").string(&expires_at); + if let Some(refresh_token) = &token.refresh_token { + writer.key("refreshToken").string(refresh_token); + } + if let Some(client_id) = &token.client_id { + writer.key("clientId").string(client_id); + } + if let Some(client_secret) = &token.client_secret { + writer.key("clientSecret").string(client_secret); + } + if let Some(registration_expires_at) = registration_expires_at { + writer + .key("registrationExpiresAt") + .string(®istration_expires_at); + } + if let Some(region) = &token.region { + writer.key("region").string(region); + } + if let Some(start_url) = &token.start_url { + writer.key("startUrl").string(start_url); + } + writer.finish(); + + let home = home_dir(env, Os::real()).ok_or(CachedSsoTokenError::NoHomeDirectory)?; + let path = cached_token_path(identifier, &home); + fs.write(&path, out.as_bytes()) + .await + .map_err(|err| CachedSsoTokenError::IoError { + what: "write", + path, + source: err, + })?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashMap; + use std::time::Duration; + + #[test] + fn redact_fields_in_token_debug() { + let token = CachedSsoToken { + access_token: Zeroizing::new("!!SENSITIVE!!".into()), + client_id: Some("clientid".into()), + client_secret: Some(Zeroizing::new("!!SENSITIVE!!".into())), + expires_at: SystemTime::now(), + refresh_token: Some(Zeroizing::new("!!SENSITIVE!!".into())), + region: Some("region".into()), + registration_expires_at: Some(SystemTime::now()), + start_url: Some("starturl".into()), + }; + let debug_str = format!("{:?}", token); + assert!(!debug_str.contains("!!SENSITIVE!!"), "The `Debug` impl for `CachedSsoToken` isn't properly redacting sensitive fields: {debug_str}"); + } + + // Valid token with all fields + #[test] + fn parse_valid_token() { + let file_contents = r#" + { + "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T21:30:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2022-12-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" + } + "#; + let cached = parse_cached_token(file_contents.as_bytes()).expect("success"); + assert_eq!("cachedtoken", cached.access_token.as_str()); + assert_eq!( + SystemTime::UNIX_EPOCH + Duration::from_secs(1640467800), + cached.expires_at + ); + assert_eq!("clientid", cached.client_id.expect("client id is present")); + assert_eq!( + "YSBzZWNyZXQ=", + cached + .client_secret + .expect("client secret is present") + .as_str() + ); + assert_eq!( + "cachedrefreshtoken", + cached + .refresh_token + .expect("refresh token is present") + .as_str() + ); + assert_eq!( + SystemTime::UNIX_EPOCH + Duration::from_secs(1671975000), + cached + .registration_expires_at + .expect("registration expiration is present") + ); + assert_eq!("us-west-2", cached.region.expect("region is present")); + assert_eq!( + "https://d-123.awsapps.com/start", + cached.start_url.expect("startUrl is present") + ); + } + + // Minimal valid cached token + #[test] + fn parse_valid_token_with_optional_fields_absent() { + let file_contents = r#" + { + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T21:30:00Z" + } + "#; + let cached = parse_cached_token(file_contents.as_bytes()).expect("success"); + assert_eq!("cachedtoken", cached.access_token.as_str()); + assert_eq!( + SystemTime::UNIX_EPOCH + Duration::from_secs(1640467800), + cached.expires_at + ); + assert!(cached.client_id.is_none()); + assert!(cached.client_secret.is_none()); + assert!(cached.refresh_token.is_none()); + assert!(cached.registration_expires_at.is_none()); + } + + #[test] + fn parse_invalid_timestamp() { + let token = br#" + { + "accessToken": "base64string", + "expiresAt": "notatimestamp", + "region": "us-west-2", + "startUrl": "https://d-abc123.awsapps.com/start" + }"#; + let err = parse_cached_token(token).expect_err("invalid timestamp"); + let expected = "invalid value for the `expiresAt` field in the cached SSO token file"; + let actual = format!("{err}"); + assert!( + actual.contains(expected), + "expected error to contain `{expected}`, but was `{actual}`", + ); + } + + #[test] + fn parse_missing_fields() { + // Token missing accessToken field + let token = br#" + { + "expiresAt": "notatimestamp", + "region": "us-west-2", + "startUrl": "https://d-abc123.awsapps.com/start" + }"#; + let err = parse_cached_token(token).expect_err("missing akid"); + assert!( + matches!(err, CachedSsoTokenError::MissingField("accessToken")), + "incorrect error: {:?}", + err + ); + + // Token missing expiresAt field + let token = br#" + { + "accessToken": "akid", + "region": "us-west-2", + "startUrl": "https://d-abc123.awsapps.com/start" + }"#; + let err = parse_cached_token(token).expect_err("missing expiry"); + assert!( + matches!(err, CachedSsoTokenError::MissingField("expiresAt")), + "incorrect error: {:?}", + err + ); + } + + #[tokio::test] + async fn gracefully_handle_missing_files() { + let err = load_cached_token( + &Env::from_slice(&[("HOME", "/home")]), + &Fs::from_slice(&[]), + "asdf", + ) + .await + .expect_err("should fail, file is missing"); + assert!( + matches!(err, CachedSsoTokenError::IoError { .. }), + "should be io error, got {}", + err + ); + } + + #[test] + fn determine_correct_cache_filenames() { + assert_eq!( + "/home/someuser/.aws/sso/cache/d033e22ae348aeb5660fc2140aec35850c4da997.json", + cached_token_path("admin", "/home/someuser").as_os_str() + ); + assert_eq!( + "/home/someuser/.aws/sso/cache/75e4d41276d8bd17f85986fc6cccef29fd725ce3.json", + cached_token_path("dev-scopes", "/home/someuser").as_os_str() + ); + assert_eq!( + "/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json", + cached_token_path("https://d-92671207e4.awsapps.com/start", "/home/me").as_os_str(), + ); + assert_eq!( + "/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json", + cached_token_path("https://d-92671207e4.awsapps.com/start", "/home/me/").as_os_str(), + ); + } + + #[tokio::test] + async fn save_cached_token() { + let expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(50_000_000); + let reg_expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(100_000_000); + let token = CachedSsoToken { + access_token: Zeroizing::new("access-token".into()), + client_id: Some("client-id".into()), + client_secret: Some(Zeroizing::new("client-secret".into())), + expires_at, + refresh_token: Some(Zeroizing::new("refresh-token".into())), + region: Some("region".into()), + registration_expires_at: Some(reg_expires_at), + start_url: Some("start-url".into()), + }; + + let env = Env::from_slice(&[("HOME", "/home/user")]); + let fs = Fs::from_map(HashMap::<_, Vec>::new()); + super::save_cached_token(&env, &fs, "test", &token) + .await + .expect("success"); + + let contents = fs + .read_to_end("/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json") + .await + .expect("correct file written"); + let contents_str = String::from_utf8(contents).expect("valid utf8"); + assert_eq!( + r#"{"accessToken":"access-token","expiresAt":"1971-08-02T16:53:20Z","refreshToken":"refresh-token","clientId":"client-id","clientSecret":"client-secret","registrationExpiresAt":"1973-03-03T09:46:40Z","region":"region","startUrl":"start-url"}"#, + contents_str, + ); + } + + #[tokio::test] + async fn round_trip_token() { + let expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(50_000_000); + let reg_expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(100_000_000); + let original = CachedSsoToken { + access_token: Zeroizing::new("access-token".into()), + client_id: Some("client-id".into()), + client_secret: Some(Zeroizing::new("client-secret".into())), + expires_at, + refresh_token: Some(Zeroizing::new("refresh-token".into())), + region: Some("region".into()), + registration_expires_at: Some(reg_expires_at), + start_url: Some("start-url".into()), + }; + + let env = Env::from_slice(&[("HOME", "/home/user")]); + let fs = Fs::from_map(HashMap::<_, Vec>::new()); + + super::save_cached_token(&env, &fs, "test", &original) + .await + .unwrap(); + + let roundtripped = load_cached_token(&env, &fs, "test").await.unwrap(); + assert_eq!(original, roundtripped) + } +} diff --git a/aws/rust-runtime/aws-config/src/sso/credentials.rs b/aws/rust-runtime/aws-config/src/sso/credentials.rs new file mode 100644 index 00000000000..fbf7ff45533 --- /dev/null +++ b/aws/rust-runtime/aws-config/src/sso/credentials.rs @@ -0,0 +1,292 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! SSO Credentials Provider +//! +//! This credentials provider enables loading credentials from `~/.aws/sso/cache`. For more information, +//! see [Using AWS SSO Credentials](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/sso-credentials.html) +//! +//! This provider is included automatically when profiles are loaded. + +use super::cache::load_cached_token; +use crate::identity::IdentityCache; +use crate::provider_config::ProviderConfig; +use crate::sso::SsoTokenProvider; +use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; +use aws_credential_types::Credentials; +use aws_sdk_sso::types::RoleCredentials; +use aws_sdk_sso::Client as SsoClient; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_types::DateTime; +use aws_types::os_shim_internal::{Env, Fs}; +use aws_types::region::Region; +use aws_types::SdkConfig; +use std::convert::TryInto; + +/// SSO Credentials Provider +/// +/// _Note: This provider is part of the default credentials chain and is integrated with the profile-file provider._ +/// +/// This credentials provider will use cached SSO tokens stored in `~/.aws/sso/cache/.json`. +/// Two different values will be tried for `` in order: +/// 1. The configured [`session_name`](Builder::session_name). +/// 2. The configured [`start_url`](Builder::start_url). +#[derive(Debug)] +pub struct SsoCredentialsProvider { + fs: Fs, + env: Env, + sso_provider_config: SsoProviderConfig, + sdk_config: SdkConfig, + token_provider: Option, + time_source: SharedTimeSource, +} + +impl SsoCredentialsProvider { + /// Creates a builder for [`SsoCredentialsProvider`] + pub fn builder() -> Builder { + Builder::new() + } + + pub(crate) fn new( + provider_config: &ProviderConfig, + sso_provider_config: SsoProviderConfig, + ) -> Self { + let fs = provider_config.fs(); + let env = provider_config.env(); + + let token_provider = if let Some(session_name) = &sso_provider_config.session_name { + Some( + SsoTokenProvider::builder() + .configure(&provider_config.client_config()) + .start_url(&sso_provider_config.start_url) + .session_name(session_name) + .region(sso_provider_config.region.clone()) + .build_sync(), + ) + } else { + None + }; + + SsoCredentialsProvider { + fs, + env, + sso_provider_config, + sdk_config: provider_config.client_config(), + token_provider, + time_source: provider_config.time_source(), + } + } + + async fn credentials(&self) -> provider::Result { + load_sso_credentials( + &self.sso_provider_config, + &self.sdk_config, + self.token_provider.as_ref(), + &self.env, + &self.fs, + self.time_source.clone(), + ) + .await + } +} + +impl ProvideCredentials for SsoCredentialsProvider { + fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> + where + Self: 'a, + { + future::ProvideCredentials::new(self.credentials()) + } +} + +/// Builder for [`SsoCredentialsProvider`] +#[derive(Default, Debug, Clone)] +pub struct Builder { + provider_config: Option, + account_id: Option, + region: Option, + role_name: Option, + start_url: Option, + session_name: Option, +} + +impl Builder { + /// Create a new builder for [`SsoCredentialsProvider`] + pub fn new() -> Self { + Self::default() + } + + /// Override the configuration used for this provider + pub fn configure(mut self, provider_config: &ProviderConfig) -> Self { + self.provider_config = Some(provider_config.clone()); + self + } + + /// Set the account id used for SSO + /// + /// This is a required field. + pub fn account_id(mut self, account_id: impl Into) -> Self { + self.account_id = Some(account_id.into()); + self + } + + /// Set the account id used for SSO + /// + /// This is a required field. + pub fn set_account_id(&mut self, account_id: Option) -> &mut Self { + self.account_id = account_id; + self + } + + /// Set the region used for SSO + /// + /// This is a required field. + pub fn region(mut self, region: Region) -> Self { + self.region = Some(region); + self + } + + /// Set the region used for SSO + /// + /// This is a required field. + pub fn set_region(&mut self, region: Option) -> &mut Self { + self.region = region; + self + } + + /// Set the role name used for SSO + /// + /// This is a required field. + pub fn role_name(mut self, role_name: impl Into) -> Self { + self.role_name = Some(role_name.into()); + self + } + + /// Set the role name used for SSO + /// + /// This is a required field. + pub fn set_role_name(&mut self, role_name: Option) -> &mut Self { + self.role_name = role_name; + self + } + + /// Set the start URL used for SSO + /// + /// This is a required field. + pub fn start_url(mut self, start_url: impl Into) -> Self { + self.start_url = Some(start_url.into()); + self + } + + /// Set the start URL used for SSO + /// + /// This is a required field. + pub fn set_start_url(&mut self, start_url: Option) -> &mut Self { + self.start_url = start_url; + self + } + + /// Set the session name used for SSO + pub fn session_name(mut self, session_name: impl Into) -> Self { + self.session_name = Some(session_name.into()); + self + } + + /// Set the session name used for SSO + pub fn set_session_name(&mut self, session_name: Option) -> &mut Self { + self.session_name = session_name; + self + } + + /// Construct an SsoCredentialsProvider from the builder + /// + /// # Panics + /// This method will panic if the any of the following required fields are unset: + /// - [`start_url`](Self::start_url) + /// - [`role_name`](Self::role_name) + /// - [`account_id`](Self::account_id) + /// - [`region`](Self::region) + pub fn build(self) -> SsoCredentialsProvider { + let provider_config = self.provider_config.unwrap_or_default(); + let sso_config = SsoProviderConfig { + account_id: self.account_id.expect("account_id must be set"), + region: self.region.expect("region must be set"), + role_name: self.role_name.expect("role_name must be set"), + start_url: self.start_url.expect("start_url must be set"), + session_name: self.session_name, + }; + SsoCredentialsProvider::new(&provider_config, sso_config) + } +} + +#[derive(Debug)] +pub(crate) struct SsoProviderConfig { + pub(crate) account_id: String, + pub(crate) role_name: String, + pub(crate) start_url: String, + pub(crate) region: Region, + pub(crate) session_name: Option, +} + +async fn load_sso_credentials( + sso_provider_config: &SsoProviderConfig, + sdk_config: &SdkConfig, + token_provider: Option<&SsoTokenProvider>, + env: &Env, + fs: &Fs, + time_source: SharedTimeSource, +) -> provider::Result { + let token = if let Some(token_provider) = token_provider { + token_provider + .resolve_token(time_source) + .await + .map_err(CredentialsError::provider_error)? + } else { + // Backwards compatible token loading that uses `start_url` instead of `session_name` + load_cached_token(env, fs, &sso_provider_config.start_url) + .await + .map_err(CredentialsError::provider_error)? + }; + + let config = sdk_config + .to_builder() + .region(sso_provider_config.region.clone()) + .identity_cache(IdentityCache::no_cache()) + .build(); + // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed + let client = SsoClient::new(&config); + let resp = client + .get_role_credentials() + .role_name(&sso_provider_config.role_name) + .access_token(&*token.access_token) + .account_id(&sso_provider_config.account_id) + .send() + .await + .map_err(CredentialsError::provider_error)?; + let credentials: RoleCredentials = resp + .role_credentials + .ok_or_else(|| CredentialsError::unhandled("SSO did not return credentials"))?; + let akid = credentials + .access_key_id + .ok_or_else(|| CredentialsError::unhandled("no access key id in response"))?; + let secret_key = credentials + .secret_access_key + .ok_or_else(|| CredentialsError::unhandled("no secret key in response"))?; + let expiration = DateTime::from_millis(credentials.expiration) + .try_into() + .map_err(|err| { + CredentialsError::unhandled(format!( + "expiration could not be converted into a system time: {}", + err + )) + })?; + Ok(Credentials::new( + akid, + secret_key, + credentials.session_token, + Some(expiration), + "SSO", + )) +} diff --git a/aws/rust-runtime/aws-config/src/sso/token.rs b/aws/rust-runtime/aws-config/src/sso/token.rs new file mode 100644 index 00000000000..a805f3f6b90 --- /dev/null +++ b/aws/rust-runtime/aws-config/src/sso/token.rs @@ -0,0 +1,867 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! SSO Token Provider +//! +//! This token provider enables loading an access token from `~/.aws/sso/cache`. For more information, +//! see [AWS Builder ID for developers](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/builder-id.html). +//! +//! This provider is included automatically when profiles are loaded. + +use crate::identity::IdentityCache; +use crate::sso::cache::{ + load_cached_token, save_cached_token, CachedSsoToken, CachedSsoTokenError, +}; +use aws_sdk_ssooidc::error::DisplayErrorContext; +use aws_sdk_ssooidc::operation::create_token::CreateTokenOutput; +use aws_sdk_ssooidc::Client as SsoOidcClient; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_runtime::expiring_cache::ExpiringCache; +use aws_smithy_runtime_api::client::identity::http::Token; +use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::ConfigBag; +use aws_types::os_shim_internal::{Env, Fs}; +use aws_types::region::Region; +use aws_types::SdkConfig; +use std::error::Error as StdError; +use std::fmt; +use std::sync::{Arc, Mutex}; +use std::time::{Duration, SystemTime}; +use zeroize::Zeroizing; + +const REFRESH_BUFFER_TIME: Duration = Duration::from_secs(5 * 60 /* 5 minutes */); +const MIN_TIME_BETWEEN_REFRESH: Duration = Duration::from_secs(30); + +/// SSO Token Provider +/// +/// This token provider will use cached SSO tokens stored in `~/.aws/sso/cache/.json`. +/// `` is computed based on the configured [`session_namej`](Builder::session_name). +/// +/// If possible, the cached token will be refreshed when it gets close to expiring. +#[derive(Debug)] +pub struct SsoTokenProvider { + inner: Arc, + token_cache: ExpiringCache, +} + +#[derive(Debug)] +struct Inner { + env: Env, + fs: Fs, + region: Region, + session_name: String, + start_url: String, + sdk_config: SdkConfig, + last_refresh_attempt: Mutex>, +} + +impl SsoTokenProvider { + /// Creates a `SsoTokenProvider` builder. + pub fn builder() -> Builder { + Default::default() + } + + async fn refresh_cached_token( + inner: &Inner, + cached_token: &CachedSsoToken, + identifier: &str, + now: SystemTime, + ) -> Result, SsoTokenProviderError> { + // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed + let config = inner + .sdk_config + .to_builder() + .region(Some(inner.region.clone())) + .identity_cache(IdentityCache::no_cache()) + .build(); + let client = SsoOidcClient::new(&config); + let resp = client + .create_token() + .grant_type("refresh_token") + .client_id( + cached_token + .client_id + .as_ref() + .expect("required for token refresh") + .clone(), + ) + .client_secret( + cached_token + .client_secret + .as_ref() + .expect("required for token refresh") + .as_str(), + ) + .refresh_token( + cached_token + .refresh_token + .as_ref() + .expect("required for token refresh") + .as_str(), + ) + .send() + .await; + match resp { + Ok(CreateTokenOutput { + access_token: Some(access_token), + refresh_token, + expires_in, + .. + }) => { + let refreshed_token = CachedSsoToken { + access_token: Zeroizing::new(access_token), + client_id: cached_token.client_id.clone(), + client_secret: cached_token.client_secret.clone(), + expires_at: now + + Duration::from_secs( + u64::try_from(expires_in) + .map_err(|_| SsoTokenProviderError::BadExpirationTimeFromSsoOidc)?, + ), + refresh_token: refresh_token + .map(Zeroizing::new) + .or_else(|| cached_token.refresh_token.clone()), + region: Some(inner.region.to_string()), + registration_expires_at: cached_token.registration_expires_at, + start_url: Some(inner.start_url.clone()), + }; + save_cached_token(&inner.env, &inner.fs, identifier, &refreshed_token).await?; + tracing::debug!("saved refreshed SSO token"); + Ok(Some(refreshed_token)) + } + Ok(_) => { + tracing::debug!("SSO OIDC CreateToken responded without an access token"); + Ok(None) + } + Err(err) => { + tracing::debug!( + "call to SSO OIDC CreateToken for SSO token refresh failed: {}", + DisplayErrorContext(&err) + ); + Ok(None) + } + } + } + + pub(super) fn resolve_token( + &self, + time_source: SharedTimeSource, + ) -> impl std::future::Future> + 'static + { + let token_cache = self.token_cache.clone(); + let inner = self.inner.clone(); + + async move { + if let Some(token) = token_cache + .yield_or_clear_if_expired(time_source.now()) + .await + { + tracing::debug!("using cached SSO token"); + return Ok(token); + } + let token = token_cache + .get_or_load(|| async move { + tracing::debug!("expiring cache asked for an updated SSO token"); + let mut token = + load_cached_token(&inner.env, &inner.fs, &inner.session_name).await?; + tracing::debug!("loaded cached SSO token"); + + let now = time_source.now(); + let expired = token.expires_at <= now; + let expires_soon = token.expires_at - REFRESH_BUFFER_TIME <= now; + let last_refresh = *inner.last_refresh_attempt.lock().unwrap(); + let min_time_passed = last_refresh + .map(|lr| { + now.duration_since(lr).expect("last_refresh is in the past") + >= MIN_TIME_BETWEEN_REFRESH + }) + .unwrap_or(true); + let registration_expired = token + .registration_expires_at + .map(|t| t <= now) + .unwrap_or(true); + let refreshable = + token.refreshable() && min_time_passed && !registration_expired; + + tracing::debug!( + expired = ?expired, + expires_soon = ?expires_soon, + min_time_passed = ?min_time_passed, + registration_expired = ?registration_expired, + refreshable = ?refreshable, + will_refresh = ?(expires_soon && refreshable), + "cached SSO token refresh decision" + ); + + // Fail fast if the token has expired and we can't refresh it + if expired && !refreshable { + tracing::debug!("cached SSO token is expired and cannot be refreshed"); + return Err(SsoTokenProviderError::ExpiredToken); + } + + // Refresh the token if it is going to expire soon + if expires_soon && refreshable { + tracing::debug!("attempting to refresh SSO token"); + if let Some(refreshed_token) = + Self::refresh_cached_token(&inner, &token, &inner.session_name, now) + .await? + { + token = refreshed_token; + } + *inner.last_refresh_attempt.lock().unwrap() = Some(now); + } + + let expires_at = token.expires_at; + Ok((token, expires_at)) + }) + .await?; + + Ok(token) + } + } +} + +impl ResolveIdentity for SsoTokenProvider { + fn resolve_identity<'a>( + &'a self, + runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + let time_source = runtime_components + .time_source() + .expect("a time source required by SsoTokenProvider"); + let token_future = self.resolve_token(time_source); + IdentityFuture::new(Box::pin(async move { + let token = token_future.await?; + Ok(Identity::new( + Token::new(token.access_token.as_str(), Some(token.expires_at)), + Some(token.expires_at), + )) + })) + } +} + +/// Builder for [`SsoTokenProvider`]. +#[derive(Debug, Default)] +pub struct Builder { + sdk_config: Option, + region: Option, + session_name: Option, + start_url: Option, +} + +impl Builder { + /// Creates a new builder for [`SsoTokenProvider`]. + pub fn new() -> Self { + Default::default() + } + + /// Override the configuration used for this provider + pub fn configure(mut self, sdk_config: &SdkConfig) -> Self { + self.sdk_config = Some(sdk_config.clone()); + self + } + + /// Sets the SSO region. + /// + /// This is a required field. + pub fn region(mut self, region: impl Into) -> Self { + self.region = Some(region.into()); + self + } + + /// Sets the SSO region. + /// + /// This is a required field. + pub fn set_region(&mut self, region: Option) -> &mut Self { + self.region = region; + self + } + + /// Sets the SSO session name. + /// + /// This is a required field. + pub fn session_name(mut self, session_name: impl Into) -> Self { + self.session_name = Some(session_name.into()); + self + } + + /// Sets the SSO session name. + /// + /// This is a required field. + pub fn set_session_name(&mut self, session_name: Option) -> &mut Self { + self.session_name = session_name; + self + } + + /// Sets the SSO start URL. + /// + /// This is a required field. + pub fn start_url(mut self, start_url: impl Into) -> Self { + self.start_url = Some(start_url.into()); + self + } + + /// Sets the SSO start URL. + /// + /// This is a required field. + pub fn set_start_url(&mut self, start_url: Option) -> &mut Self { + self.start_url = start_url; + self + } + + /// Builds the [`SsoTokenProvider`]. + /// + /// # Panics + /// + /// This will panic if any of the required fields are not given. + pub async fn build(mut self) -> SsoTokenProvider { + if self.sdk_config.is_none() { + self.sdk_config = Some(crate::load_defaults(crate::BehaviorVersion::latest()).await); + } + self.build_with(Env::real(), Fs::real()) + } + + pub(crate) fn build_sync(self) -> SsoTokenProvider { + self.build_with(Env::real(), Fs::real()) + } + + fn build_with(self, env: Env, fs: Fs) -> SsoTokenProvider { + SsoTokenProvider { + inner: Arc::new(Inner { + env, + fs, + region: self.region.expect("region is required"), + session_name: self.session_name.expect("session_name is required"), + start_url: self.start_url.expect("start_url is required"), + sdk_config: self.sdk_config.expect("sdk_config is required"), + last_refresh_attempt: Mutex::new(None), + }), + token_cache: ExpiringCache::new(REFRESH_BUFFER_TIME), + } + } +} + +#[derive(Debug)] +pub(super) enum SsoTokenProviderError { + BadExpirationTimeFromSsoOidc, + FailedToLoadToken { + source: Box, + }, + ExpiredToken, +} + +impl fmt::Display for SsoTokenProviderError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::BadExpirationTimeFromSsoOidc => { + f.write_str("SSO OIDC responded with a negative expiration duration") + } + Self::ExpiredToken => f.write_str("the SSO token has expired and cannot be refreshed"), + Self::FailedToLoadToken { .. } => f.write_str("failed to load the cached SSO token"), + } + } +} + +impl StdError for SsoTokenProviderError { + fn cause(&self) -> Option<&dyn StdError> { + match self { + Self::BadExpirationTimeFromSsoOidc => None, + Self::ExpiredToken => None, + Self::FailedToLoadToken { source } => Some(source.as_ref()), + } + } +} + +impl From for SsoTokenProviderError { + fn from(source: CachedSsoTokenError) -> Self { + Self::FailedToLoadToken { + source: source.into(), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use aws_sdk_sso::config::{AsyncSleep, SharedAsyncSleep}; + use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::test_util::instant_time_and_sleep; + use aws_smithy_async::time::{StaticTimeSource, TimeSource}; + use aws_smithy_runtime::client::http::test_util::{ + capture_request, ReplayEvent, StaticReplayClient, + }; + use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_runtime_api::client::http::HttpClient; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::date_time::Format; + use aws_smithy_types::retry::RetryConfig; + use aws_smithy_types::DateTime; + + fn time(s: &str) -> SystemTime { + SystemTime::try_from(DateTime::from_str(s, Format::DateTime).unwrap()).unwrap() + } + + struct TestHarness { + time_source: SharedTimeSource, + token_provider: SsoTokenProvider, + env: Env, + fs: Fs, + } + + impl TestHarness { + fn new( + time_source: impl TimeSource + 'static, + sleep_impl: impl AsyncSleep + 'static, + http_client: impl HttpClient + 'static, + fs: Fs, + ) -> Self { + let env = Env::from_slice(&[("HOME", "/home/user")]); + let time_source = SharedTimeSource::new(time_source); + let config = SdkConfig::builder() + .http_client(http_client) + .time_source(time_source.clone()) + .sleep_impl(SharedAsyncSleep::new(sleep_impl)) + // disable retry to simplify testing + .retry_config(RetryConfig::disabled()) + .behavior_version(crate::BehaviorVersion::latest()) + .build(); + Self { + time_source, + token_provider: SsoTokenProvider::builder() + .configure(&config) + .session_name("test") + .region(Region::new("us-west-2")) + .start_url("https://d-123.awsapps.com/start") + .build_with(env.clone(), fs.clone()), + env, + fs, + } + } + + async fn expect_sso_token(&self, value: &str, expires_at: &str) -> CachedSsoToken { + let token = self + .token_provider + .resolve_token(self.time_source.clone()) + .await + .unwrap(); + assert_eq!(value, token.access_token.as_str()); + assert_eq!(time(expires_at), token.expires_at); + token + } + + async fn expect_token(&self, value: &str, expires_at: &str) { + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(self.time_source.clone())) + .build() + .unwrap(); + let config_bag = ConfigBag::base(); + let identity = self + .token_provider + .resolve_identity(&runtime_components, &config_bag) + .await + .unwrap(); + let token = identity.data::().unwrap().clone(); + assert_eq!(value, token.token()); + assert_eq!(time(expires_at), identity.expiration().unwrap()); + } + + async fn expect_expired_token_err(&self) { + let err = self + .token_provider + .resolve_token(self.time_source.clone()) + .await + .expect_err("expected failure"); + assert!( + matches!(err, SsoTokenProviderError::ExpiredToken), + "expected {err:?} to be `ExpiredToken`" + ); + } + + fn last_refresh_attempt_time(&self) -> Option { + self.token_provider + .inner + .last_refresh_attempt + .lock() + .unwrap() + .map(|time| { + DateTime::try_from(time) + .unwrap() + .fmt(Format::DateTime) + .unwrap() + }) + } + } + + #[tokio::test] + async fn use_unexpired_cached_token() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "accessToken": "some-token", + "expiresAt": "1975-01-01T00:00:00Z" } + "#, + )]); + + let now = time("1974-12-25T00:00:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(None); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + harness + .expect_token("some-token", "1975-01-01T00:00:00Z") + .await; + // it can't refresh this token + req_rx.expect_no_request(); + } + + #[tokio::test] + async fn expired_cached_token() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "accessToken": "some-token", + "expiresAt": "1999-12-15T00:00:00Z" } + "#, + )]); + + let now = time("2023-01-01T00:00:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(None); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + harness.expect_expired_token_err().await; + // it can't refresh this token + req_rx.expect_no_request(); + } + + #[tokio::test] + async fn expired_token_and_expired_client_registration() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-10-25T13:00:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2021-11-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let now = time("2023-08-11T04:11:17Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(None); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + // the registration has expired, so the token can't be refreshed + harness.expect_expired_token_err().await; + req_rx.expect_no_request(); + } + + #[tokio::test] + async fn expired_token_refresh_with_refresh_token() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T13:00:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2022-12-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let now = time("2021-12-25T13:30:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(Some( + http::Response::builder() + .status(200) + .body(SdkBody::from( + r#" + { "tokenType": "Bearer", + "accessToken": "newtoken", + "expiresIn": 28800, + "refreshToken": "newrefreshtoken" } + "#, + )) + .unwrap(), + )); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + let returned_token = harness + .expect_sso_token("newtoken", "2021-12-25T21:30:00Z") + .await; + let cached_token = load_cached_token(&harness.env, &harness.fs, "test") + .await + .unwrap(); + assert_eq!(returned_token, cached_token); + assert_eq!( + "newrefreshtoken", + returned_token.refresh_token.unwrap().as_str() + ); + assert_eq!( + "https://d-123.awsapps.com/start", + returned_token.start_url.unwrap() + ); + assert_eq!("us-west-2", returned_token.region.unwrap().to_string()); + assert_eq!("clientid", returned_token.client_id.unwrap()); + assert_eq!( + "YSBzZWNyZXQ=", + returned_token.client_secret.unwrap().as_str() + ); + assert_eq!( + SystemTime::UNIX_EPOCH + Duration::from_secs(1_671_975_000), + returned_token.registration_expires_at.unwrap() + ); + + let refresh_req = req_rx.expect_request(); + let parsed_req: serde_json::Value = + serde_json::from_slice(refresh_req.body().bytes().unwrap()).unwrap(); + let parsed_req = parsed_req.as_object().unwrap(); + assert_eq!( + "clientid", + parsed_req.get("clientId").unwrap().as_str().unwrap() + ); + assert_eq!( + "YSBzZWNyZXQ=", + parsed_req.get("clientSecret").unwrap().as_str().unwrap() + ); + assert_eq!( + "refresh_token", + parsed_req.get("grantType").unwrap().as_str().unwrap() + ); + assert_eq!( + "cachedrefreshtoken", + parsed_req.get("refreshToken").unwrap().as_str().unwrap() + ); + } + + #[tokio::test] + async fn expired_token_refresh_fails() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T13:00:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2022-12-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let now = time("2021-12-25T13:30:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(Some( + http::Response::builder() + .status(500) + .body(SdkBody::from("")) + .unwrap(), + )); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + // it should return the previous token since refresh failed and it hasn't expired yet + let returned_token = harness + .expect_sso_token("cachedtoken", "2021-12-25T13:00:00Z") + .await; + let cached_token = load_cached_token(&harness.env, &harness.fs, "test") + .await + .unwrap(); + assert_eq!(returned_token, cached_token); + + let _ = req_rx.expect_request(); + } + + // Expired token refresh without new refresh token + #[tokio::test] + async fn expired_token_refresh_without_new_refresh_token() { + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "cachedtoken", + "expiresAt": "2021-12-25T13:00:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2022-12-25T13:30:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let now = time("2021-12-25T13:30:00Z"); + let time_source = SharedTimeSource::new(StaticTimeSource::new(now)); + + let (conn, req_rx) = capture_request(Some( + http::Response::builder() + .status(200) + .body(SdkBody::from( + r#" + { "tokenType": "Bearer", + "accessToken": "newtoken", + "expiresIn": 28800 } + "#, + )) + .unwrap(), + )); + let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs); + + let returned_token = harness + .expect_sso_token("newtoken", "2021-12-25T21:30:00Z") + .await; + let cached_token = load_cached_token(&harness.env, &harness.fs, "test") + .await + .unwrap(); + assert_eq!(returned_token, cached_token); + assert_eq!( + "cachedrefreshtoken", + returned_token.refresh_token.unwrap().as_str(), + "it should have kept the old refresh token" + ); + + let _ = req_rx.expect_request(); + } + + #[tokio::test] + async fn refresh_timings() { + let _logs = capture_test_logs(); + + let start_time = DateTime::from_str("2023-01-01T00:00:00Z", Format::DateTime).unwrap(); + let (time_source, sleep_impl) = instant_time_and_sleep(start_time.try_into().unwrap()); + let shared_time_source = SharedTimeSource::new(time_source.clone()); + + let fs = Fs::from_slice(&[( + "/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json", + r#" + { "startUrl": "https://d-123.awsapps.com/start", + "region": "us-west-2", + "accessToken": "first_token", + "_comment_expiresAt": "-------- Ten minutes after the start time: ------", + "expiresAt": "2023-01-01T00:10:00Z", + "clientId": "clientid", + "clientSecret": "YSBzZWNyZXQ=", + "registrationExpiresAt": "2023-01-02T12:00:00Z", + "refreshToken": "cachedrefreshtoken" } + "#, + )]); + + let events = vec![ + // First refresh attempt should fail + ReplayEvent::new( + http::Request::new(SdkBody::from("")), // don't really care what the request looks like + http::Response::builder() + .status(500) + .body(SdkBody::from("")) + .unwrap(), + ), + // Second refresh attempt should also fail + ReplayEvent::new( + http::Request::new(SdkBody::from("")), // don't really care what the request looks like + http::Response::builder() + .status(500) + .body(SdkBody::from("")) + .unwrap(), + ), + // Third refresh attempt will succeed + ReplayEvent::new( + http::Request::new(SdkBody::from("")), // don't really care what the request looks like + http::Response::builder() + .status(200) + .body(SdkBody::from( + r#" + { "tokenType": "Bearer", + "accessToken": "second_token", + "expiresIn": 28800 } + "#, + )) + .unwrap(), + ), + ]; + let http_client = StaticReplayClient::new(events); + let harness = TestHarness::new(shared_time_source, sleep_impl, http_client, fs); + + tracing::info!("test: first token retrieval should return the cached token"); + assert!( + harness.last_refresh_attempt_time().is_none(), + "the last attempt time should start empty" + ); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + assert!( + harness.last_refresh_attempt_time().is_none(), + "it shouldn't have tried to refresh, so the last refresh attempt time shouldn't be set" + ); + + tracing::info!("test: advance 3 minutes"); + time_source.advance(Duration::from_secs(3 * 60)); + + tracing::info!("test: the token shouldn't get refreshed since it's not in the 5 minute buffer time yet"); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + assert!( + harness.last_refresh_attempt_time().is_none(), + "it shouldn't have tried to refresh since the token isn't expiring soon" + ); + + tracing::info!("test: advance 2 minutes"); + time_source.advance(Duration::from_secs(2 * 60)); + + tracing::info!( + "test: the token will fail to refresh, and the old cached token will be returned" + ); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + assert_eq!( + Some("2023-01-01T00:05:00Z"), + harness.last_refresh_attempt_time().as_deref(), + "it should update the last refresh attempt time since the expiration time is soon" + ); + + tracing::info!("test: advance 15 seconds"); + time_source.advance(Duration::from_secs(15)); + + tracing::info!( + "test: the token will not refresh because the minimum time hasn't passed between attempts" + ); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + + tracing::info!("test: advance 15 seconds"); + time_source.advance(Duration::from_secs(15)); + + tracing::info!( + "test: the token will fail to refresh, and the old cached token will be returned" + ); + harness + .expect_token("first_token", "2023-01-01T00:10:00Z") + .await; + + tracing::info!("test: advance 30 seconds"); + time_source.advance(Duration::from_secs(30)); + + tracing::info!("test: the token will refresh successfully"); + harness + .expect_token("second_token", "2023-01-01T08:06:00Z") + .await; + } +} diff --git a/aws/rust-runtime/aws-config/src/stalled_stream_protection.rs b/aws/rust-runtime/aws-config/src/stalled_stream_protection.rs new file mode 100644 index 00000000000..1e47905305c --- /dev/null +++ b/aws/rust-runtime/aws-config/src/stalled_stream_protection.rs @@ -0,0 +1,9 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Stalled stream protection configuration + +// Re-export from aws-smithy-types +pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; diff --git a/aws/rust-runtime/aws-config/src/sts.rs b/aws/rust-runtime/aws-config/src/sts.rs index aba7a24bfc8..7c3ea29062e 100644 --- a/aws/rust-runtime/aws-config/src/sts.rs +++ b/aws/rust-runtime/aws-config/src/sts.rs @@ -5,24 +5,7 @@ //! Credential provider augmentation through the AWS Security Token Service (STS). -pub(crate) mod util; - pub use assume_role::{AssumeRoleProvider, AssumeRoleProviderBuilder}; mod assume_role; - -use crate::connector::expect_connector; -use aws_sdk_sts::config::Builder as StsConfigBuilder; -use aws_smithy_types::retry::RetryConfig; - -impl crate::provider_config::ProviderConfig { - pub(crate) fn sts_client_config(&self) -> StsConfigBuilder { - let mut builder = aws_sdk_sts::Config::builder() - .http_connector(expect_connector(self.connector(&Default::default()))) - .retry_config(RetryConfig::standard()) - .region(self.region()) - .time_source(self.time_source()); - builder.set_sleep_impl(self.sleep()); - builder - } -} +pub(crate) mod util; diff --git a/aws/rust-runtime/aws-config/src/sts/assume_role.rs b/aws/rust-runtime/aws-config/src/sts/assume_role.rs index 6ae8f0a6ad7..9605cb0e075 100644 --- a/aws/rust-runtime/aws-config/src/sts/assume_role.rs +++ b/aws/rust-runtime/aws-config/src/sts/assume_role.rs @@ -5,18 +5,18 @@ //! Assume credentials for a role through the AWS Security Token Service (STS). -use crate::connector::expect_connector; -use crate::provider_config::ProviderConfig; -use aws_credential_types::cache::CredentialsCache; -use aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials}; +use aws_credential_types::provider::{ + self, error::CredentialsError, future, ProvideCredentials, SharedCredentialsProvider, +}; use aws_sdk_sts::operation::assume_role::builders::AssumeRoleFluentBuilder; use aws_sdk_sts::operation::assume_role::AssumeRoleError; use aws_sdk_sts::types::PolicyDescriptorType; use aws_sdk_sts::Client as StsClient; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_http::result::SdkError; +use aws_smithy_runtime::client::identity::IdentityCache; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::region::Region; +use aws_types::SdkConfig; use std::time::Duration; use tracing::Instrument; @@ -28,19 +28,44 @@ use tracing::Instrument; /// the desired role. /// /// # Examples +/// Create an AssumeRoleProvider explicitly set to us-east-2 that utilizes the default credentials chain. /// ```no_run -/// use aws_credential_types::Credentials; -/// use aws_config::sts::{AssumeRoleProvider}; +/// use aws_config::sts::AssumeRoleProvider; /// use aws_types::region::Region; -/// use aws_config::environment; -/// use aws_config::environment::credentials::EnvironmentVariableCredentialsProvider; -/// use std::sync::Arc; -/// +/// # async fn docs() { /// let provider = AssumeRoleProvider::builder("arn:aws:iam::123456789012:role/demo") /// .region(Region::from_static("us-east-2")) /// .session_name("testAR") -/// .build(Arc::new(EnvironmentVariableCredentialsProvider::new()) as Arc<_>); +/// .build().await; +/// } +/// ``` +/// +/// Create an AssumeRoleProvider from an explicitly configured base configuration. +/// ```no_run +/// use aws_config::sts::AssumeRoleProvider; +/// use aws_types::region::Region; +/// # async fn docs() { +/// let conf = aws_config::from_env().use_fips(true).load().await; +/// let provider = AssumeRoleProvider::builder("arn:aws:iam::123456789012:role/demo") +/// .configure(&conf) +/// .session_name("testAR") +/// .build().await; +/// } +/// ``` +/// +/// Create an AssumeroleProvider that sources credentials from a provider credential provider: +/// ```no_run +/// use aws_config::sts::AssumeRoleProvider; +/// use aws_types::region::Region; +/// use aws_config::environment::EnvironmentVariableCredentialsProvider; +/// # async fn docs() { +/// let provider = AssumeRoleProvider::builder("arn:aws:iam::123456789012:role/demo") +/// .session_name("test-assume-role-session") +/// // only consider environment variables, explicitly. +/// .build_from_provider(EnvironmentVariableCredentialsProvider::new()).await; +/// } /// ``` +/// #[derive(Debug)] pub struct AssumeRoleProvider { inner: Inner, @@ -72,12 +97,11 @@ pub struct AssumeRoleProviderBuilder { role_arn: String, external_id: Option, session_name: Option, - region: Option, - conf: Option, session_length: Option, policy: Option, policy_arns: Option>, - credentials_cache: Option, + region_override: Option, + sdk_config: Option, } impl AssumeRoleProviderBuilder { @@ -94,11 +118,10 @@ impl AssumeRoleProviderBuilder { external_id: None, session_name: None, session_length: None, - region: None, - conf: None, policy: None, policy_arns: None, - credentials_cache: None, + sdk_config: None, + region_override: None, } } @@ -138,8 +161,13 @@ impl AssumeRoleProviderBuilder { /// This parameter is optional. /// For more information, see /// [policy_arns](aws_sdk_sts::operation::assume_role::builders::AssumeRoleInputBuilder::policy_arns) - pub fn policy_arns(mut self, policy_arns: Vec) -> Self { - self.policy_arns = Some(policy_arns); + pub fn policy_arns(mut self, policy_arns: Vec) -> Self { + self.policy_arns = Some( + policy_arns + .into_iter() + .map(|arn| PolicyDescriptorType::builder().arn(arn).build()) + .collect::>(), + ); self } @@ -162,62 +190,61 @@ impl AssumeRoleProviderBuilder { /// Set the region to assume the role in. /// - /// This dictates which STS endpoint the AssumeRole action is invoked on. + /// This dictates which STS endpoint the AssumeRole action is invoked on. This will override + /// a region set from `.configure(...)` pub fn region(mut self, region: Region) -> Self { - self.region = Some(region); - self - } - - /// If the `rustls` or `nativetls` features are enabled, this field is optional and a default - /// backing connection will be provided. - pub fn connection(mut self, conn: impl aws_smithy_client::bounds::SmithyConnector) -> Self { - let conf = match self.conf { - Some(conf) => conf.with_http_connector(DynConnector::new(conn)), - None => ProviderConfig::default().with_http_connector(DynConnector::new(conn)), - }; - self.conf = Some(conf); + self.region_override = Some(region); self } - #[deprecated( - note = "This should not be necessary as the default, no caching, is usually what you want." - )] - /// Set the [`CredentialsCache`] for credentials retrieved from STS. - /// - /// By default, an [`AssumeRoleProvider`] internally uses `NoCredentialsCache` because the - /// provider itself will be wrapped by `LazyCredentialsCache` when a service client is created. - pub fn credentials_cache(mut self, cache: CredentialsCache) -> Self { - self.credentials_cache = Some(cache); - self - } - - /// Override the configuration used for this provider + /// Sets the configuration used for this provider /// /// This enables overriding the connection used to communicate with STS in addition to other internal /// fields like the time source and sleep implementation used for caching. - pub fn configure(mut self, conf: &ProviderConfig) -> Self { - self.conf = Some(conf.clone()); + /// + /// If this field is not provided, configuration from [`aws_config::load_from_env().await`] is used. + /// + /// # Examples + /// ```rust + /// # async fn docs() { + /// use aws_types::region::Region; + /// use aws_config::sts::AssumeRoleProvider; + /// let config = aws_config::from_env().region(Region::from_static("us-west-2")).load().await; + /// let assume_role_provider = AssumeRoleProvider::builder("arn:aws:iam::123456789012:role/example") + /// .configure(&config) + /// .build(); + /// } + pub fn configure(mut self, conf: &SdkConfig) -> Self { + self.sdk_config = Some(conf.clone()); self } - /// Build a credentials provider for this role authorized by the given `provider`. - pub fn build(self, provider: impl ProvideCredentials + 'static) -> AssumeRoleProvider { - let conf = self.conf.unwrap_or_default(); + /// Build a credentials provider for this role. + /// + /// Base credentials will be used from the [`SdkConfig`] set via [`Self::configure`] or loaded + /// from [`aws_config::from_env`](crate::from_env) if `configure` was never called. + pub async fn build(self) -> AssumeRoleProvider { + let mut conf = match self.sdk_config { + Some(conf) => conf, + None => crate::load_defaults(crate::BehaviorVersion::latest()).await, + }; + // ignore a identity cache set from SdkConfig + conf = conf + .into_builder() + .identity_cache(IdentityCache::no_cache()) + .build(); + + // set a region override if one exists + if let Some(region) = self.region_override { + conf = conf.into_builder().region(region).build() + } - let credentials_cache = self - .credentials_cache - .unwrap_or_else(CredentialsCache::no_caching); + let config = aws_sdk_sts::config::Builder::from(&conf); - let mut config = aws_sdk_sts::Config::builder() - .credentials_cache(credentials_cache) - .credentials_provider(provider) - .time_source(conf.time_source()) - .region(self.region.clone()) - .http_connector(expect_connector(conf.connector(&Default::default()))); - config.set_sleep_impl(conf.sleep()); + let time_source = conf.time_source().expect("A time source must be provided."); let session_name = self.session_name.unwrap_or_else(|| { - super::util::default_session_name("assume-role-provider", conf.time_source().now()) + super::util::default_session_name("assume-role-provider", time_source.now()) }); let sts_client = StsClient::from_conf(config.build()); @@ -234,6 +261,23 @@ impl AssumeRoleProviderBuilder { inner: Inner { fluent_builder }, } } + + /// Build a credentials provider for this role authorized by the given `provider`. + pub async fn build_from_provider( + mut self, + provider: impl ProvideCredentials + 'static, + ) -> AssumeRoleProvider { + let conf = match self.sdk_config { + Some(conf) => conf, + None => crate::load_defaults(crate::BehaviorVersion::latest()).await, + }; + let conf = conf + .into_builder() + .credentials_provider(SharedCredentialsProvider::new(provider)) + .build(); + self.sdk_config = Some(conf); + self.build().await + } } impl Inner { @@ -284,62 +328,142 @@ impl ProvideCredentials for AssumeRoleProvider { #[cfg(test)] mod test { - use crate::provider_config::ProviderConfig; use crate::sts::AssumeRoleProvider; use aws_credential_types::credential_fn::provide_credentials_fn; - use aws_credential_types::provider::ProvideCredentials; - use aws_credential_types::time_source::{TestingTimeSource, TimeSource}; + use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider}; use aws_credential_types::Credentials; - use aws_smithy_async::rt::sleep::TokioSleep; - use aws_smithy_client::erase::DynConnector; - use aws_smithy_client::test_connection::{capture_request, TestConnection}; - use aws_smithy_http::body::SdkBody; + use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; + use aws_smithy_async::test_util::instant_time_and_sleep; + use aws_smithy_async::time::StaticTimeSource; + use aws_smithy_runtime::client::http::test_util::{ + capture_request, ReplayEvent, StaticReplayClient, + }; + use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; + use aws_smithy_types::body::SdkBody; + use aws_types::os_shim_internal::Env; use aws_types::region::Region; + use aws_types::SdkConfig; + use http::header::AUTHORIZATION; use std::time::{Duration, UNIX_EPOCH}; #[tokio::test] async fn configures_session_length() { - let (server, request) = capture_request(None); - let provider_conf = ProviderConfig::empty() - .with_sleep(TokioSleep::new()) - .with_time_source(TimeSource::testing(&TestingTimeSource::new( + let (http_client, request) = capture_request(None); + let sdk_config = SdkConfig::builder() + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .time_source(StaticTimeSource::new( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), - ))) - .with_http_connector(DynConnector::new(server)); + )) + .http_client(http_client) + .region(Region::from_static("this-will-be-overridden")) + .behavior_version(crate::BehaviorVersion::latest()) + .build(); let provider = AssumeRoleProvider::builder("myrole") - .configure(&provider_conf) + .configure(&sdk_config) .region(Region::new("us-east-1")) .session_length(Duration::from_secs(1234567)) - .build(provide_credentials_fn(|| async { + .build_from_provider(provide_credentials_fn(|| async { Ok(Credentials::for_tests()) - })); - let _ = provider.provide_credentials().await; + })) + .await; + let _ = dbg!(provider.provide_credentials().await); let req = request.expect_request(); let str_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap(); assert!(str_body.contains("1234567"), "{}", str_body); + assert_eq!(req.uri(), "https://sts.us-east-1.amazonaws.com/"); + } + + #[tokio::test] + async fn loads_region_from_sdk_config() { + let (http_client, request) = capture_request(None); + let sdk_config = SdkConfig::builder() + .behavior_version(crate::BehaviorVersion::latest()) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .time_source(StaticTimeSource::new( + UNIX_EPOCH + Duration::from_secs(1234567890 - 120), + )) + .http_client(http_client) + .credentials_provider(SharedCredentialsProvider::new(provide_credentials_fn( + || async { + panic!("don't call me — will be overridden"); + }, + ))) + .region(Region::from_static("us-west-2")) + .build(); + let provider = AssumeRoleProvider::builder("myrole") + .configure(&sdk_config) + .session_length(Duration::from_secs(1234567)) + .build_from_provider(provide_credentials_fn(|| async { + Ok(Credentials::for_tests()) + })) + .await; + let _ = dbg!(provider.provide_credentials().await); + let req = request.expect_request(); + assert_eq!(req.uri(), "https://sts.us-west-2.amazonaws.com/"); + } + + /// Test that `build()` where no provider is passed still works + #[tokio::test] + async fn build_method_from_sdk_config() { + let _guard = capture_test_logs(); + let (http_client, request) = capture_request(Some( + http::Response::builder() + .status(404) + .body(SdkBody::from("")) + .unwrap(), + )); + let conf = crate::defaults(BehaviorVersion::latest()) + .env(Env::from_slice(&[ + ("AWS_ACCESS_KEY_ID", "123-key"), + ("AWS_SECRET_ACCESS_KEY", "456"), + ("AWS_REGION", "us-west-17"), + ])) + .use_dual_stack(true) + .use_fips(true) + .time_source(StaticTimeSource::from_secs(1234567890)) + .http_client(http_client) + .load() + .await; + let provider = AssumeRoleProvider::builder("role") + .configure(&conf) + .build() + .await; + let _ = dbg!(provider.provide_credentials().await); + let req = request.expect_request(); + let auth_header = req.headers().get(AUTHORIZATION).unwrap().to_string(); + let expect = "Credential=123-key/20090213/us-west-17/sts/aws4_request"; + assert!( + auth_header.contains(expect), + "Expected header to contain {expect} but it was {auth_header}" + ); + // ensure that FIPS & DualStack are also respected + assert_eq!("https://sts-fips.us-west-17.api.aws/", req.uri()) } #[tokio::test] async fn provider_does_not_cache_credentials_by_default() { - let conn = TestConnection::new(vec![ - (http::Request::new(SdkBody::from("request body")), + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new(http::Request::new(SdkBody::from("request body")), http::Response::builder().status(200).body(SdkBody::from( "\n \n \n AROAR42TAWARILN3MNKUT:assume-role-from-profile-1632246085998\n arn:aws:sts::130633740322:assumed-role/assume-provider-test/assume-role-from-profile-1632246085998\n \n \n ASIARCORRECT\n secretkeycorrect\n tokencorrect\n 2009-02-13T23:31:30Z\n \n \n \n d9d47248-fd55-4686-ad7c-0fb7cd1cddd7\n \n\n" )).unwrap()), - (http::Request::new(SdkBody::from("request body")), + ReplayEvent::new(http::Request::new(SdkBody::from("request body")), http::Response::builder().status(200).body(SdkBody::from( "\n \n \n AROAR42TAWARILN3MNKUT:assume-role-from-profile-1632246085998\n arn:aws:sts::130633740322:assumed-role/assume-provider-test/assume-role-from-profile-1632246085998\n \n \n ASIARCORRECT\n TESTSECRET\n tokencorrect\n 2009-02-13T23:33:30Z\n \n \n \n c2e971c2-702d-4124-9b1f-1670febbea18\n \n\n" )).unwrap()), ]); - let mut testing_time_source = TestingTimeSource::new( + let (testing_time_source, sleep) = instant_time_and_sleep( UNIX_EPOCH + Duration::from_secs(1234567890 - 120), // 1234567890 since UNIX_EPOCH is 2009-02-13T23:31:30Z ); - let provider_conf = ProviderConfig::empty() - .with_sleep(TokioSleep::new()) - .with_time_source(TimeSource::testing(&testing_time_source)) - .with_http_connector(DynConnector::new(conn)); + let sdk_config = SdkConfig::builder() + .sleep_impl(SharedAsyncSleep::new(sleep)) + .time_source(testing_time_source.clone()) + .http_client(http_client) + .behavior_version(crate::BehaviorVersion::latest()) + .build(); let credentials_list = std::sync::Arc::new(std::sync::Mutex::new(vec![ Credentials::new( "test", @@ -358,17 +482,16 @@ mod test { ])); let credentials_list_cloned = credentials_list.clone(); let provider = AssumeRoleProvider::builder("myrole") - .configure(&provider_conf) + .configure(&sdk_config) .region(Region::new("us-east-1")) - .build(provide_credentials_fn(move || { + .build_from_provider(provide_credentials_fn(move || { let list = credentials_list.clone(); async move { let next = list.lock().unwrap().remove(0); Ok(next) } - })); - - tokio::time::pause(); + })) + .await; let creds_first = provider .provide_credentials() diff --git a/aws/rust-runtime/aws-config/src/sts/util.rs b/aws/rust-runtime/aws-config/src/sts/util.rs index c4fd630aef7..e215204f846 100644 --- a/aws/rust-runtime/aws-config/src/sts/util.rs +++ b/aws/rust-runtime/aws-config/src/sts/util.rs @@ -7,7 +7,6 @@ use aws_credential_types::provider::{self, error::CredentialsError}; use aws_credential_types::Credentials as AwsCredentials; use aws_sdk_sts::types::Credentials as StsCredentials; -use aws_smithy_async::time::TimeSource; use std::convert::TryFrom; use std::time::{SystemTime, UNIX_EPOCH}; @@ -18,24 +17,15 @@ pub(crate) fn into_credentials( ) -> provider::Result { let sts_credentials = sts_credentials .ok_or_else(|| CredentialsError::unhandled("STS credentials must be defined"))?; - let expiration = SystemTime::try_from( - sts_credentials - .expiration - .ok_or_else(|| CredentialsError::unhandled("missing expiration"))?, - ) - .map_err(|_| { + let expiration = SystemTime::try_from(sts_credentials.expiration).map_err(|_| { CredentialsError::unhandled( "credential expiration time cannot be represented by a SystemTime", ) })?; Ok(AwsCredentials::new( - sts_credentials - .access_key_id - .ok_or_else(|| CredentialsError::unhandled("access key id missing from result"))?, - sts_credentials - .secret_access_key - .ok_or_else(|| CredentialsError::unhandled("secret access token missing"))?, - sts_credentials.session_token, + sts_credentials.access_key_id, + sts_credentials.secret_access_key, + Some(sts_credentials.session_token), Some(expiration), provider_name, )) @@ -47,6 +37,6 @@ pub(crate) fn into_credentials( /// provide a name for the session, the provider will choose a name composed of a base + a timestamp, /// e.g. `profile-file-provider-123456789` pub(crate) fn default_session_name(base: &str, ts: SystemTime) -> String { - let now = ts.now().duration_since(UNIX_EPOCH).expect("post epoch"); + let now = ts.duration_since(UNIX_EPOCH).expect("post epoch"); format!("{}-{}", base, now.as_millis()) } diff --git a/aws/rust-runtime/aws-config/src/test_case.rs b/aws/rust-runtime/aws-config/src/test_case.rs index 14859d57ef2..9a8af1ad6a3 100644 --- a/aws/rust-runtime/aws-config/src/test_case.rs +++ b/aws/rust-runtime/aws-config/src/test_case.rs @@ -3,30 +3,26 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::default_provider::use_dual_stack::use_dual_stack_provider; +use crate::default_provider::use_fips::use_fips_provider; use crate::provider_config::ProviderConfig; - use aws_credential_types::provider::{self, ProvideCredentials}; use aws_smithy_async::rt::sleep::{AsyncSleep, Sleep, TokioSleep}; -use aws_smithy_client::dvr::{NetworkTraffic, RecordingConnection, ReplayingConnection}; -use aws_smithy_client::erase::DynConnector; +use aws_smithy_runtime::client::http::test_util::dvr::{ + NetworkTraffic, RecordingClient, ReplayingClient, +}; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; - +use aws_types::sdk_config::SharedHttpClient; use serde::Deserialize; - -use crate::connector::default_connector; -use aws_smithy_types::error::display::DisplayErrorContext; use std::collections::HashMap; -use std::env; use std::error::Error; use std::fmt::Debug; use std::future::Future; -use std::io::Write; use std::path::{Path, PathBuf}; -use std::sync::{Arc, Mutex}; use std::time::{Duration, UNIX_EPOCH}; -use tracing::dispatcher::DefaultGuard; -use tracing::Level; -use tracing_subscriber::fmt::TestWriter; /// Test case credentials /// @@ -68,18 +64,18 @@ impl From for Credentials { /// A credentials test environment is a directory containing: /// - an `fs` directory. This is loaded into the test as if it was mounted at `/` /// - an `env.json` file containing environment variables -/// - an `http-traffic.json` file containing an http traffic log from [`dvr`](aws_smithy_client::dvr) +/// - an `http-traffic.json` file containing an http traffic log from [`dvr`](aws_smithy_runtime::client::http::test_utils::dvr) /// - a `test-case.json` file defining the expected output of the test pub(crate) struct TestEnvironment { metadata: Metadata, base_dir: PathBuf, - connector: ReplayingConnection, + http_client: ReplayingClient, provider_config: ProviderConfig, } /// Connector which expects no traffic -pub(crate) fn no_traffic_connector() -> DynConnector { - DynConnector::new(ReplayingConnection::new(vec![])) +pub(crate) fn no_traffic_client() -> SharedHttpClient { + ReplayingClient::new(Vec::new()).into_shared() } #[derive(Debug)] @@ -136,81 +132,6 @@ pub(crate) struct Metadata { name: String, } -// TODO(enableNewSmithyRuntimeCleanup): Replace Tee, capture_test_logs, and Rx with -// the implementations added to aws_smithy_runtime::test_util::capture_test_logs -struct Tee { - buf: Arc>>, - quiet: bool, - inner: W, -} - -/// Capture logs from this test. -/// -/// The logs will be captured until the `DefaultGuard` is dropped. -/// -/// *Why use this instead of traced_test?* -/// This captures _all_ logs, not just logs produced by the current crate. -fn capture_test_logs() -> (DefaultGuard, Rx) { - // it may be helpful to upstream this at some point - let (mut writer, rx) = Tee::stdout(); - if env::var("VERBOSE_TEST_LOGS").is_ok() { - writer.loud(); - } else { - eprintln!("To see full logs from this test set VERBOSE_TEST_LOGS=true"); - } - let subscriber = tracing_subscriber::fmt() - .with_max_level(Level::TRACE) - .with_writer(Mutex::new(writer)) - .finish(); - let guard = tracing::subscriber::set_default(subscriber); - (guard, rx) -} - -struct Rx(Arc>>); -impl Rx { - pub(crate) fn contents(&self) -> String { - String::from_utf8(self.0.lock().unwrap().clone()).unwrap() - } -} - -impl Tee { - fn stdout() -> (Self, Rx) { - let buf: Arc>> = Default::default(); - ( - Tee { - buf: buf.clone(), - quiet: true, - inner: TestWriter::new(), - }, - Rx(buf), - ) - } -} - -impl Tee { - fn loud(&mut self) { - self.quiet = false; - } -} - -impl Write for Tee -where - W: Write, -{ - fn write(&mut self, buf: &[u8]) -> std::io::Result { - self.buf.lock().unwrap().extend_from_slice(buf); - if !self.quiet { - self.inner.write(buf) - } else { - Ok(buf.len()) - } - } - - fn flush(&mut self) -> std::io::Result<()> { - self.inner.flush() - } -} - impl TestEnvironment { pub(crate) async fn from_dir(dir: impl AsRef) -> Result> { let dir = dir.as_ref(); @@ -228,18 +149,25 @@ impl TestEnvironment { &std::fs::read_to_string(dir.join("test-case.json")) .map_err(|e| format!("failed to load test case: {}", e))?, )?; - let connector = ReplayingConnection::new(network_traffic.events().clone()); + let http_client = ReplayingClient::new(network_traffic.events().clone()); let provider_config = ProviderConfig::empty() .with_fs(fs.clone()) .with_env(env.clone()) - .with_http_connector(DynConnector::new(connector.clone())) - .with_sleep(TokioSleep::new()) + .with_http_client(http_client.clone()) + .with_sleep_impl(TokioSleep::new()) .load_default_region() .await; + + let use_dual_stack = use_dual_stack_provider(&provider_config).await; + let use_fips = use_fips_provider(&provider_config).await; + let provider_config = provider_config + .with_use_fips(use_fips) + .with_use_dual_stack(use_dual_stack); + Ok(TestEnvironment { base_dir: dir.into(), metadata, - connector, + http_client, provider_config, }) } @@ -257,6 +185,7 @@ impl TestEnvironment { } #[allow(unused)] + #[cfg(all(feature = "client-hyper", feature = "rustls"))] /// Record a test case from live (remote) HTTPS traffic /// /// The `default_connector()` from the crate will be used @@ -268,18 +197,21 @@ impl TestEnvironment { P: ProvideCredentials, { // swap out the connector generated from `http-traffic.json` for a real connector: - let live_connector = - default_connector(&Default::default(), self.provider_config.sleep()).unwrap(); - let live_connector = RecordingConnection::new(live_connector); + let live_connector = aws_smithy_runtime::client::http::hyper_014::default_connector( + &Default::default(), + self.provider_config.sleep_impl(), + ) + .expect("feature gate on this function makes this always return Some"); + let live_client = RecordingClient::new(live_connector); let config = self .provider_config .clone() - .with_http_connector(DynConnector::new(live_connector.clone())); + .with_http_client(live_client.clone()); let provider = make_provider(config).await; let result = provider.provide_credentials().await; std::fs::write( self.base_dir.join("http-traffic-recorded.json"), - serde_json::to_string(&live_connector.network_traffic()).unwrap(), + serde_json::to_string(&live_client.network_traffic()).unwrap(), ) .unwrap(); self.check_results(result); @@ -295,16 +227,16 @@ impl TestEnvironment { F: Future, P: ProvideCredentials, { - let recording_connector = RecordingConnection::new(self.connector.clone()); + let recording_client = RecordingClient::new(self.http_client.clone()); let config = self .provider_config .clone() - .with_http_connector(DynConnector::new(recording_connector.clone())); + .with_http_client(recording_client.clone()); let provider = make_provider(config).await; let result = provider.provide_credentials().await; std::fs::write( self.base_dir.join("http-traffic-recorded.json"), - serde_json::to_string(&recording_connector.network_traffic()).unwrap(), + serde_json::to_string(&recording_client.network_traffic()).unwrap(), ) .unwrap(); self.check_results(result); @@ -341,7 +273,7 @@ impl TestEnvironment { self.check_results(result); // todo: validate bodies match self - .connector + .http_client .clone() .validate( &["CONTENT-TYPE", "x-aws-ec2-metadata-token"], diff --git a/aws/rust-runtime/aws-config/src/web_identity_token.rs b/aws/rust-runtime/aws-config/src/web_identity_token.rs index 7ea55fdf26c..7ae4e2f8b0e 100644 --- a/aws/rust-runtime/aws-config/src/web_identity_token.rs +++ b/aws/rust-runtime/aws-config/src/web_identity_token.rs @@ -204,7 +204,7 @@ impl Builder { WebIdentityTokenCredentialsProvider { source, fs: conf.fs(), - sts_client: StsClient::from_conf(conf.sts_client_config().build()), + sts_client: StsClient::new(&conf.client_config()), time_source: conf.time_source(), } } @@ -241,24 +241,24 @@ async fn load_credentials( #[cfg(test)] mod test { use crate::provider_config::ProviderConfig; - use crate::test_case::no_traffic_connector; + use crate::test_case::no_traffic_client; use crate::web_identity_token::{ Builder, ENV_VAR_ROLE_ARN, ENV_VAR_SESSION_NAME, ENV_VAR_TOKEN_FILE, }; use aws_credential_types::provider::error::CredentialsError; - use aws_sdk_sts::config::Region; use aws_smithy_async::rt::sleep::TokioSleep; use aws_smithy_types::error::display::DisplayErrorContext; use aws_types::os_shim_internal::{Env, Fs}; + use aws_types::region::Region; use std::collections::HashMap; #[tokio::test] async fn unloaded_provider() { // empty environment let conf = ProviderConfig::empty() - .with_sleep(TokioSleep::new()) + .with_sleep_impl(TokioSleep::new()) .with_env(Env::from_slice(&[])) - .with_http_connector(no_traffic_connector()) + .with_http_client(no_traffic_client()) .with_region(Some(Region::from_static("us-east-1"))); let provider = Builder::default().configure(&conf).build(); @@ -279,10 +279,10 @@ mod test { let provider = Builder::default() .configure( &ProviderConfig::empty() - .with_sleep(TokioSleep::new()) + .with_sleep_impl(TokioSleep::new()) .with_region(region) .with_env(env) - .with_http_connector(no_traffic_connector()), + .with_http_client(no_traffic_client()), ) .build(); let err = provider @@ -311,8 +311,8 @@ mod test { let provider = Builder::default() .configure( &ProviderConfig::empty() - .with_sleep(TokioSleep::new()) - .with_http_connector(no_traffic_connector()) + .with_sleep_impl(TokioSleep::new()) + .with_http_client(no_traffic_client()) .with_region(Some(Region::new("us-east-1"))) .with_env(env) .with_fs(fs), diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/env.json b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/env.json new file mode 100644 index 00000000000..7e1f0ed5e68 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/env.json @@ -0,0 +1,7 @@ +{ + "HOME": "/home", + "AWS_REGION": "us-west-2", + "AWS_PROFILE": "sso-test", + "AWS_USE_FIPS_ENDPOINT": "true", + "AWS_USE_DUALSTACK_ENDPOINT": "true" +} diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/config b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/config new file mode 100644 index 00000000000..7967221048a --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/config @@ -0,0 +1,6 @@ +[profile sso-test] +sso_start_url = https://ssotest.awsapps.com/start +sso_region = us-east-2 +sso_account_id = 123456789 +sso_role_name = MySsoRole +region = us-east-2 diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json new file mode 100644 index 00000000000..c4cca143fbc --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json @@ -0,0 +1,5 @@ +{ + "accessToken": "a-token", + "expiresAt": "2080-10-16T03:56:45Z", + "startUrl": "https://ssotest.awsapps.com/start" +} diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/http-traffic.json b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/http-traffic.json new file mode 100644 index 00000000000..f7f80963e89 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/http-traffic.json @@ -0,0 +1,93 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://portal.sso-fips.us-east-2.api.aws/federation/credentials?account_id=123456789&role_name=MySsoRole", + "headers": { + "x-amz-sso_bearer_token": [ + "a-token" + ], + "Host": [ + "portal.sso-fips.us-east-2.api.aws" + ] + }, + "method": "GET" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "Date": [ + "Mon, 03 Jan 2022 19:13:54 GMT" + ], + "Content-Type": [ + "application/json" + ], + "Content-Length": [ + "144" + ], + "Connection": [ + "keep-alive" + ], + "Access-Control-Expose-Headers": [ + "RequestId" + ], + "Cache-Control": [ + "no-cache" + ], + "RequestId": [ + "b339b807-25d1-474c-a476-b070e9f350e4" + ], + "Server": [ + "AWS SSO" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "{\"roleCredentials\":{\"accessKeyId\":\"ASIARCORRECT\",\"secretAccessKey\":\"secretkeycorrect\",\"sessionToken\":\"tokencorrect\",\"expiration\":1234567890000}}" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "Load SSO credentials", + "version": "V0" +} diff --git a/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/test-case.json b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/test-case.json new file mode 100644 index 00000000000..91d9a21d91d --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/default-provider-chain/e2e_fips_and_dual_stack_sso/test-case.json @@ -0,0 +1,12 @@ +{ + "name": "e2e_fips_and_dual_stack_sso", + "docs": "end to end SSO test with FIPS and dual stack enabled", + "result": { + "Ok": { + "access_key_id": "ASIARCORRECT", + "secret_access_key": "secretkeycorrect", + "session_token": "tokencorrect", + "expiry": 1234567890 + } + } +} diff --git a/aws/rust-runtime/aws-config/test-data/imds-config/imds-tests.json b/aws/rust-runtime/aws-config/test-data/imds-config/imds-endpoint-tests.json similarity index 100% rename from aws/rust-runtime/aws-config/test-data/imds-config/imds-tests.json rename to aws/rust-runtime/aws-config/test-data/imds-config/imds-endpoint-tests.json diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/env.json b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/env.json new file mode 100644 index 00000000000..55fcfbeb051 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/env.json @@ -0,0 +1,3 @@ +{ + "HOME": "/home" +} diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/config b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/config new file mode 100644 index 00000000000..17d48634379 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/config @@ -0,0 +1,9 @@ +[default] +region = us-east-1 +role_arn = arn:aws:iam::123456789:role/integration-test +source_profile = base +use_fips_endpoint = true +use_dualstack_endpoint = true + +[profile base] +region = us-east-1 diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/credentials b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/credentials new file mode 100644 index 00000000000..1cab6a6ca21 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/credentials @@ -0,0 +1,3 @@ +[base] +aws_access_key_id = AKIAFAKE +aws_secret_access_key = FAKE diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/http-traffic.json b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/http-traffic.json new file mode 100644 index 00000000000..000b74b8e20 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/http-traffic.json @@ -0,0 +1,107 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://sts-fips.us-east-1.api.aws/", + "headers": { + "content-type": [ + "application/x-www-form-urlencoded" + ], + "authorization": [ + "AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e" + ], + "user-agent": [ + "aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly" + ], + "content-length": [ + "146" + ], + "x-amz-date": [ + "20210810T003833Z" + ], + "host": [ + "sts-fips.us-east-1.api.aws" + ], + "x-amz-user-agent": [ + "aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly" + ] + }, + "method": "POST" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session" + }, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "date": [ + "Thu, 05 Aug 2021 18:58:02 GMT" + ], + "content-length": [ + "1491" + ], + "content-type": [ + "text/xml" + ], + "x-amzn-requestid": [ + "c2e971c2-702d-4124-9b1f-1670febbea18" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "\n \n \n AROARABCDEFGHIJKLMNOP:assume-role-provider-session\n arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session\n \n \n ASIARTESTID\n TESTSECRETKEY\n TESTSESSIONTOKEN\n 2021-08-05T19:58:02Z\n \n \n \n c2e971c2-702d-4124-9b1f-1670febbea18\n \n\n" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "standard request / response with STS", + "version": "V0" +} diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/test-case.json b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/test-case.json new file mode 100644 index 00000000000..6d1c5079f40 --- /dev/null +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/test-case.json @@ -0,0 +1,12 @@ +{ + "name": "e2e_fips_and_dual_stack_sts", + "docs": "end to end STS role assumption test with FIPS and dual stack enabled", + "result": { + "Ok": { + "access_key_id": "ASIARTESTID", + "secret_access_key": "TESTSECRETKEY", + "session_token": "TESTSESSIONTOKEN", + "expiry": 1628193482 + } + } +} diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json b/aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json index 7e15f5fdd48..21bce59c31c 100644 --- a/aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json @@ -1,5 +1,5 @@ { - "name": "empty-config", + "name": "invalid-config", "docs": "config was invalid", "result": { "ErrorContains": "could not parse profile file" diff --git a/aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json b/aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json index 4119ccfb5e7..c92373f783b 100644 --- a/aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json +++ b/aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json @@ -1,5 +1,5 @@ { - "name": "e2e-assume-role", + "name": "retry-on-error", "docs": "end to end successful role assumption", "result": { "Ok": { diff --git a/aws/rust-runtime/aws-credential-types/Cargo.toml b/aws/rust-runtime/aws-credential-types/Cargo.toml index 9970072b9e9..865542ca0e1 100644 --- a/aws/rust-runtime/aws-credential-types/Cargo.toml +++ b/aws/rust-runtime/aws-credential-types/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team "] description = "Types for AWS SDK credentials." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] hardcoded-credentials = [] @@ -14,26 +14,18 @@ test-util = [] [dependencies] aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } -fastrand = "1.4.0" -tokio = { version = "1.23.1", features = ["sync"] } -tracing = "0.1" +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } zeroize = "1" [dev-dependencies] -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio"] } - -# used to test compatibility -async-trait = "0.1.51" -env_logger = "0.9.0" - +async-trait = "0.1.51" # used to test compatibility tokio = { version = "1.23.1", features = ["full", "test-util", "rt"] } -tracing-test = "0.2.4" -# TODO(https://github.com/awslabs/smithy-rs/issues/2619): Remove this -# workaround once the fixed is upstreamed. -regex = { version = "1.0", features = ["unicode-case", "unicode-perl"] } [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-credential-types/README.md b/aws/rust-runtime/aws-credential-types/README.md index e77385e1a01..d6480cc0c0a 100644 --- a/aws/rust-runtime/aws-credential-types/README.md +++ b/aws/rust-runtime/aws-credential-types/README.md @@ -6,5 +6,5 @@ This crate provides types concerned with AWS SDK credentials including: * Concrete implementations of credentials caching -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-credential-types/external-types.toml b/aws/rust-runtime/aws-credential-types/external-types.toml index e65c743b102..e1d82c7db46 100644 --- a/aws/rust-runtime/aws-credential-types/external-types.toml +++ b/aws/rust-runtime/aws-credential-types/external-types.toml @@ -1,5 +1,7 @@ allowed_external_types = [ + "aws_smithy_async::rt::sleep::AsyncSleep", "aws_smithy_async::rt::sleep::SharedAsyncSleep", + "aws_smithy_runtime_api::client::identity::ResolveIdentity", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_smithy_types::config_bag::storable::Storer", diff --git a/aws/rust-runtime/aws-credential-types/src/cache.rs b/aws/rust-runtime/aws-credential-types/src/cache.rs deleted file mode 100644 index a1351d0f9ca..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/cache.rs +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Types and traits for enabling caching - -mod expiring_cache; -mod lazy_caching; -mod no_caching; - -pub use expiring_cache::ExpiringCache; -pub use lazy_caching::Builder as LazyBuilder; -use no_caching::NoCredentialsCache; - -use crate::provider::{future, SharedCredentialsProvider}; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -use std::sync::Arc; - -/// Asynchronous Cached Credentials Provider -pub trait ProvideCachedCredentials: Send + Sync + std::fmt::Debug { - /// Returns a future that provides cached credentials. - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a; -} - -/// Credentials cache wrapper that may be shared -/// -/// Newtype wrapper around `ProvideCachedCredentials` that implements `Clone` using an internal -/// `Arc`. -#[derive(Clone, Debug)] -pub struct SharedCredentialsCache(Arc); - -impl SharedCredentialsCache { - /// Create a new `SharedCredentialsCache` from `ProvideCachedCredentials` - /// - /// The given `cache` will be wrapped in an internal `Arc`. If your - /// cache is already in an `Arc`, use `SharedCredentialsCache::from(cache)` instead. - pub fn new(provider: impl ProvideCachedCredentials + 'static) -> Self { - Self(Arc::new(provider)) - } -} - -impl AsRef for SharedCredentialsCache { - fn as_ref(&self) -> &(dyn ProvideCachedCredentials + 'static) { - self.0.as_ref() - } -} - -impl From> for SharedCredentialsCache { - fn from(cache: Arc) -> Self { - SharedCredentialsCache(cache) - } -} - -impl ProvideCachedCredentials for SharedCredentialsCache { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - self.0.provide_cached_credentials() - } -} - -impl Storable for SharedCredentialsCache { - type Storer = StoreReplace; -} - -#[derive(Clone, Debug)] -pub(crate) enum Inner { - Lazy(lazy_caching::Builder), - NoCaching, -} - -/// `CredentialsCache` allows for configuring and creating a credentials cache. -/// -/// # Examples -/// -/// ```no_run -/// use aws_credential_types::Credentials; -/// use aws_credential_types::cache::CredentialsCache; -/// use aws_credential_types::credential_fn::provide_credentials_fn; -/// use aws_credential_types::provider::SharedCredentialsProvider; -/// -/// let credentials_cache = CredentialsCache::lazy_builder() -/// .into_credentials_cache() -/// .create_cache(SharedCredentialsProvider::new(provide_credentials_fn(|| async { -/// // An async process to retrieve credentials would go here: -/// Ok(Credentials::new( -/// "example", -/// "example", -/// None, -/// None, -/// "my_provider_name" -/// )) -/// }))); -/// ``` -#[derive(Clone, Debug)] -pub struct CredentialsCache { - pub(crate) inner: Inner, -} - -impl CredentialsCache { - /// Creates a [`CredentialsCache`] from the default [`LazyBuilder`]. - pub fn lazy() -> Self { - Self::lazy_builder().into_credentials_cache() - } - - /// Returns the default [`LazyBuilder`]. - pub fn lazy_builder() -> LazyBuilder { - lazy_caching::Builder::new() - } - - /// Creates a [`CredentialsCache`] that offers no caching ability. - pub fn no_caching() -> Self { - Self { - inner: Inner::NoCaching, - } - } - - /// Creates a [`SharedCredentialsCache`] wrapping a concrete caching implementation. - pub fn create_cache(self, provider: SharedCredentialsProvider) -> SharedCredentialsCache { - match self.inner { - Inner::Lazy(builder) => SharedCredentialsCache::new(builder.build(provider)), - Inner::NoCaching => SharedCredentialsCache::new(NoCredentialsCache::new(provider)), - } - } -} - -impl Storable for CredentialsCache { - type Storer = StoreReplace; -} diff --git a/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs b/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs deleted file mode 100644 index ae1a6e2d36e..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs +++ /dev/null @@ -1,577 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Lazy, credentials cache implementation - -use std::time::{Duration, Instant}; - -use aws_smithy_async::future::timeout::Timeout; -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; -use tracing::{debug, info, info_span, Instrument}; - -use crate::cache::{ExpiringCache, ProvideCachedCredentials}; -use crate::provider::SharedCredentialsProvider; -use crate::provider::{error::CredentialsError, future, ProvideCredentials}; -use crate::time_source::TimeSource; - -const DEFAULT_LOAD_TIMEOUT: Duration = Duration::from_secs(5); -const DEFAULT_CREDENTIAL_EXPIRATION: Duration = Duration::from_secs(15 * 60); -const DEFAULT_BUFFER_TIME: Duration = Duration::from_secs(10); -const DEFAULT_BUFFER_TIME_JITTER_FRACTION: fn() -> f64 = fastrand::f64; - -#[derive(Debug)] -pub(crate) struct LazyCredentialsCache { - time: TimeSource, - sleeper: SharedAsyncSleep, - cache: ExpiringCache, - provider: SharedCredentialsProvider, - load_timeout: Duration, - buffer_time: Duration, - buffer_time_jitter_fraction: fn() -> f64, - default_credential_expiration: Duration, -} - -impl LazyCredentialsCache { - fn new( - time: TimeSource, - sleeper: SharedAsyncSleep, - provider: SharedCredentialsProvider, - load_timeout: Duration, - buffer_time: Duration, - buffer_time_jitter_fraction: fn() -> f64, - default_credential_expiration: Duration, - ) -> Self { - Self { - time, - sleeper, - cache: ExpiringCache::new(buffer_time), - provider, - load_timeout, - buffer_time, - buffer_time_jitter_fraction, - default_credential_expiration, - } - } -} - -impl ProvideCachedCredentials for LazyCredentialsCache { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'_> - where - Self: 'a, - { - let now = self.time.now(); - let provider = self.provider.clone(); - let timeout_future = self.sleeper.sleep(self.load_timeout); - let load_timeout = self.load_timeout; - let cache = self.cache.clone(); - let default_credential_expiration = self.default_credential_expiration; - - future::ProvideCredentials::new(async move { - // Attempt to get cached credentials, or clear the cache if they're expired - if let Some(credentials) = cache.yield_or_clear_if_expired(now).await { - debug!("loaded credentials from cache"); - Ok(credentials) - } else { - // If we didn't get credentials from the cache, then we need to try and load. - // There may be other threads also loading simultaneously, but this is OK - // since the futures are not eagerly executed, and the cache will only run one - // of them. - let future = Timeout::new(provider.provide_credentials(), timeout_future); - let start_time = Instant::now(); - let result = cache - .get_or_load(|| { - let span = info_span!("lazy_load_credentials"); - let provider = provider.clone(); - async move { - let credentials = match future.await { - Ok(creds) => creds?, - Err(_err) => match provider.fallback_on_interrupt() { - Some(creds) => creds, - None => { - return Err(CredentialsError::provider_timed_out( - load_timeout, - )) - } - }, - }; - // If the credentials don't have an expiration time, then create a default one - let expiry = credentials - .expiry() - .unwrap_or(now + default_credential_expiration); - - let jitter = self - .buffer_time - .mul_f64((self.buffer_time_jitter_fraction)()); - - // Logging for cache miss should be emitted here as opposed to after the call to - // `cache.get_or_load` above. In the case of multiple threads concurrently executing - // `cache.get_or_load`, logging inside `cache.get_or_load` ensures that it is emitted - // only once for the first thread that succeeds in populating a cache value. - info!( - "credentials cache miss occurred; added new AWS credentials (took {:?})", - start_time.elapsed() - ); - - Ok((credentials, expiry + jitter)) - } - // Only instrument the the actual load future so that no span - // is opened if the cache decides not to execute it. - .instrument(span) - }) - .await; - debug!("loaded credentials"); - result - } - }) - } -} - -use crate::Credentials; -pub use builder::Builder; - -mod builder { - use std::time::Duration; - - use crate::cache::{CredentialsCache, Inner}; - use crate::provider::SharedCredentialsProvider; - use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; - - use super::TimeSource; - use super::{ - LazyCredentialsCache, DEFAULT_BUFFER_TIME, DEFAULT_BUFFER_TIME_JITTER_FRACTION, - DEFAULT_CREDENTIAL_EXPIRATION, DEFAULT_LOAD_TIMEOUT, - }; - - /// Builder for constructing a `LazyCredentialsCache`. - /// - /// `LazyCredentialsCache` implements [`ProvideCachedCredentials`](crate::cache::ProvideCachedCredentials) by caching - /// credentials that it loads by calling a user-provided [`ProvideCredentials`](crate::provider::ProvideCredentials) implementation. - /// - /// For example, you can provide a [`ProvideCredentials`](crate::provider::ProvideCredentials) implementation that calls - /// AWS STS's AssumeRole operation to get temporary credentials, and `LazyCredentialsCache` - /// will cache those credentials until they expire. - /// - /// Callers outside of this crate cannot call `build` directly. They can instead call - /// `into_credentials_cache` to obtain a [`CredentialsCache`]. Its `create_cache` then calls - /// `build` to create a `LazyCredentialsCache`. - #[derive(Clone, Debug, Default)] - pub struct Builder { - sleep: Option, - time_source: Option, - load_timeout: Option, - buffer_time: Option, - buffer_time_jitter_fraction: Option f64>, - default_credential_expiration: Option, - } - - impl Builder { - /// Creates a new builder - pub fn new() -> Self { - Default::default() - } - - /// Implementation of [`AsyncSleep`](aws_smithy_async::rt::sleep::AsyncSleep) to use for timeouts. - /// - /// This enables use of the `LazyCredentialsCache` with other async runtimes. - /// If using Tokio as the async runtime, this should be set to an instance of - /// [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep). - pub fn sleep(mut self, sleep: SharedAsyncSleep) -> Self { - self.set_sleep(Some(sleep)); - self - } - - /// Implementation of [`AsyncSleep`](aws_smithy_async::rt::sleep::AsyncSleep) to use for timeouts. - /// - /// This enables use of the `LazyCredentialsCache` with other async runtimes. - /// If using Tokio as the async runtime, this should be set to an instance of - /// [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep). - pub fn set_sleep(&mut self, sleep: Option) -> &mut Self { - self.sleep = sleep; - self - } - - #[doc(hidden)] // because they only exist for tests - pub fn time_source(mut self, time_source: TimeSource) -> Self { - self.set_time_source(Some(time_source)); - self - } - - #[doc(hidden)] // because they only exist for tests - pub fn set_time_source(&mut self, time_source: Option) -> &mut Self { - self.time_source = time_source; - self - } - - /// Timeout for the given [`ProvideCredentials`](crate::provider::ProvideCredentials) implementation. - /// - /// Defaults to 5 seconds. - pub fn load_timeout(mut self, timeout: Duration) -> Self { - self.set_load_timeout(Some(timeout)); - self - } - - /// Timeout for the given [`ProvideCredentials`](crate::provider::ProvideCredentials) implementation. - /// - /// Defaults to 5 seconds. - pub fn set_load_timeout(&mut self, timeout: Option) -> &mut Self { - self.load_timeout = timeout; - self - } - - /// Amount of time before the actual credential expiration time - /// where credentials are considered expired. - /// - /// For example, if credentials are expiring in 15 minutes, and the buffer time is 10 seconds, - /// then any requests made after 14 minutes and 50 seconds will load new credentials. - /// - /// Defaults to 10 seconds. - pub fn buffer_time(mut self, buffer_time: Duration) -> Self { - self.set_buffer_time(Some(buffer_time)); - self - } - - /// Amount of time before the actual credential expiration time - /// where credentials are considered expired. - /// - /// For example, if credentials are expiring in 15 minutes, and the buffer time is 10 seconds, - /// then any requests made after 14 minutes and 50 seconds will load new credentials. - /// - /// Defaults to 10 seconds. - pub fn set_buffer_time(&mut self, buffer_time: Option) -> &mut Self { - self.buffer_time = buffer_time; - self - } - - /// A random percentage by which buffer time is jittered for randomization. - /// - /// For example, if credentials are expiring in 15 minutes, the buffer time is 10 seconds, - /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds. - /// Therefore, any requests made after 14 minutes and 52 seconds will load new credentials. - /// - /// Defaults to a randomly generated value between 0.0 and 1.0. This setter is for testing only. - #[cfg(feature = "test-util")] - pub fn buffer_time_jitter_fraction( - mut self, - buffer_time_jitter_fraction: fn() -> f64, - ) -> Self { - self.set_buffer_time_jitter_fraction(Some(buffer_time_jitter_fraction)); - self - } - - /// A random percentage by which buffer time is jittered for randomization. - /// - /// For example, if credentials are expiring in 15 minutes, the buffer time is 10 seconds, - /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds. - /// Therefore, any requests made after 14 minutes and 52 seconds will load new credentials. - /// - /// Defaults to a randomly generated value between 0.0 and 1.0. This setter is for testing only. - #[cfg(feature = "test-util")] - pub fn set_buffer_time_jitter_fraction( - &mut self, - buffer_time_jitter_fraction: Option f64>, - ) -> &mut Self { - self.buffer_time_jitter_fraction = buffer_time_jitter_fraction; - self - } - - /// Default expiration time to set on credentials if they don't have an expiration time. - /// - /// This is only used if the given [`ProvideCredentials`](crate::provider::ProvideCredentials) returns - /// [`Credentials`](crate::Credentials) that don't have their `expiry` set. - /// This must be at least 15 minutes. - /// - /// Defaults to 15 minutes. - pub fn default_credential_expiration(mut self, duration: Duration) -> Self { - self.set_default_credential_expiration(Some(duration)); - self - } - - /// Default expiration time to set on credentials if they don't have an expiration time. - /// - /// This is only used if the given [`ProvideCredentials`](crate::provider::ProvideCredentials) returns - /// [`Credentials`](crate::Credentials) that don't have their `expiry` set. - /// This must be at least 15 minutes. - /// - /// Defaults to 15 minutes. - pub fn set_default_credential_expiration( - &mut self, - duration: Option, - ) -> &mut Self { - self.default_credential_expiration = duration; - self - } - - /// Converts [`Builder`] into [`CredentialsCache`]. - pub fn into_credentials_cache(self) -> CredentialsCache { - CredentialsCache { - inner: Inner::Lazy(self), - } - } - - /// Creates the [`LazyCredentialsCache`] with the passed-in `provider`. - /// - /// # Panics - /// This will panic if no `sleep` implementation is given and if no default crate features - /// are used. By default, the [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep) - /// implementation will be set automatically. - pub(crate) fn build(self, provider: SharedCredentialsProvider) -> LazyCredentialsCache { - let default_credential_expiration = self - .default_credential_expiration - .unwrap_or(DEFAULT_CREDENTIAL_EXPIRATION); - assert!( - default_credential_expiration >= DEFAULT_CREDENTIAL_EXPIRATION, - "default_credential_expiration must be at least 15 minutes" - ); - LazyCredentialsCache::new( - self.time_source.unwrap_or_default(), - self.sleep.unwrap_or_else(|| { - default_async_sleep().expect("no default sleep implementation available") - }), - provider, - self.load_timeout.unwrap_or(DEFAULT_LOAD_TIMEOUT), - self.buffer_time.unwrap_or(DEFAULT_BUFFER_TIME), - self.buffer_time_jitter_fraction - .unwrap_or(DEFAULT_BUFFER_TIME_JITTER_FRACTION), - default_credential_expiration, - ) - } - } -} - -#[cfg(test)] -mod tests { - use std::sync::{Arc, Mutex}; - use std::time::{Duration, SystemTime, UNIX_EPOCH}; - - use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use tracing::info; - use tracing_test::traced_test; - - use crate::provider::SharedCredentialsProvider; - use crate::{ - cache::ProvideCachedCredentials, credential_fn::provide_credentials_fn, - provider::error::CredentialsError, time_source::TestingTimeSource, Credentials, - }; - - use super::{ - LazyCredentialsCache, TimeSource, DEFAULT_BUFFER_TIME, DEFAULT_CREDENTIAL_EXPIRATION, - DEFAULT_LOAD_TIMEOUT, - }; - - const BUFFER_TIME_NO_JITTER: fn() -> f64 = || 0_f64; - - fn test_provider( - time: TimeSource, - buffer_time_jitter_fraction: fn() -> f64, - load_list: Vec, - ) -> LazyCredentialsCache { - let load_list = Arc::new(Mutex::new(load_list)); - LazyCredentialsCache::new( - time, - SharedAsyncSleep::new(TokioSleep::new()), - SharedCredentialsProvider::new(provide_credentials_fn(move || { - let list = load_list.clone(); - async move { - let next = list.lock().unwrap().remove(0); - info!("refreshing the credentials to {:?}", next); - next - } - })), - DEFAULT_LOAD_TIMEOUT, - DEFAULT_BUFFER_TIME, - buffer_time_jitter_fraction, - DEFAULT_CREDENTIAL_EXPIRATION, - ) - } - - fn epoch_secs(secs: u64) -> SystemTime { - SystemTime::UNIX_EPOCH + Duration::from_secs(secs) - } - - fn credentials(expired_secs: u64) -> Credentials { - Credentials::new("test", "test", None, Some(epoch_secs(expired_secs)), "test") - } - - async fn expect_creds(expired_secs: u64, provider: &LazyCredentialsCache) { - let creds = provider - .provide_cached_credentials() - .await - .expect("expected credentials"); - assert_eq!(Some(epoch_secs(expired_secs)), creds.expiry()); - } - - #[traced_test] - #[tokio::test] - async fn initial_populate_credentials() { - let time = TestingTimeSource::new(UNIX_EPOCH); - let provider = SharedCredentialsProvider::new(provide_credentials_fn(|| async { - info!("refreshing the credentials"); - Ok(credentials(1000)) - })); - let credentials_cache = LazyCredentialsCache::new( - TimeSource::testing(&time), - SharedAsyncSleep::new(TokioSleep::new()), - provider, - DEFAULT_LOAD_TIMEOUT, - DEFAULT_BUFFER_TIME, - BUFFER_TIME_NO_JITTER, - DEFAULT_CREDENTIAL_EXPIRATION, - ); - assert_eq!( - epoch_secs(1000), - credentials_cache - .provide_cached_credentials() - .await - .unwrap() - .expiry() - .unwrap() - ); - } - - #[traced_test] - #[tokio::test] - async fn reload_expired_credentials() { - let mut time = TestingTimeSource::new(epoch_secs(100)); - let credentials_cache = test_provider( - TimeSource::testing(&time), - BUFFER_TIME_NO_JITTER, - vec![ - Ok(credentials(1000)), - Ok(credentials(2000)), - Ok(credentials(3000)), - ], - ); - - expect_creds(1000, &credentials_cache).await; - expect_creds(1000, &credentials_cache).await; - time.set_time(epoch_secs(1500)); - expect_creds(2000, &credentials_cache).await; - expect_creds(2000, &credentials_cache).await; - time.set_time(epoch_secs(2500)); - expect_creds(3000, &credentials_cache).await; - expect_creds(3000, &credentials_cache).await; - } - - #[traced_test] - #[tokio::test] - async fn load_failed_error() { - let mut time = TestingTimeSource::new(epoch_secs(100)); - let credentials_cache = test_provider( - TimeSource::testing(&time), - BUFFER_TIME_NO_JITTER, - vec![ - Ok(credentials(1000)), - Err(CredentialsError::not_loaded("failed")), - ], - ); - - expect_creds(1000, &credentials_cache).await; - time.set_time(epoch_secs(1500)); - assert!(credentials_cache - .provide_cached_credentials() - .await - .is_err()); - } - - #[traced_test] - #[test] - fn load_contention() { - let rt = tokio::runtime::Builder::new_multi_thread() - .enable_time() - .worker_threads(16) - .build() - .unwrap(); - - let time = TestingTimeSource::new(epoch_secs(0)); - let credentials_cache = Arc::new(test_provider( - TimeSource::testing(&time), - BUFFER_TIME_NO_JITTER, - vec![ - Ok(credentials(500)), - Ok(credentials(1500)), - Ok(credentials(2500)), - Ok(credentials(3500)), - Ok(credentials(4500)), - ], - )); - - let locked_time = Arc::new(Mutex::new(time)); - - for i in 0..4 { - let mut tasks = Vec::new(); - for j in 0..50 { - let credentials_cache = credentials_cache.clone(); - let time = locked_time.clone(); - tasks.push(rt.spawn(async move { - let now = epoch_secs(i * 1000 + (4 * j)); - time.lock().unwrap().set_time(now); - - let creds = credentials_cache - .provide_cached_credentials() - .await - .unwrap(); - assert!( - creds.expiry().unwrap() >= now, - "{:?} >= {:?}", - creds.expiry(), - now - ); - })); - } - for task in tasks { - rt.block_on(task).unwrap(); - } - } - } - - #[tokio::test] - #[traced_test] - async fn load_timeout() { - let time = TestingTimeSource::new(epoch_secs(100)); - let credentials_cache = LazyCredentialsCache::new( - TimeSource::testing(&time), - SharedAsyncSleep::new(TokioSleep::new()), - SharedCredentialsProvider::new(provide_credentials_fn(|| async { - aws_smithy_async::future::never::Never::new().await; - Ok(credentials(1000)) - })), - Duration::from_millis(5), - DEFAULT_BUFFER_TIME, - BUFFER_TIME_NO_JITTER, - DEFAULT_CREDENTIAL_EXPIRATION, - ); - - assert!(matches!( - credentials_cache.provide_cached_credentials().await, - Err(CredentialsError::ProviderTimedOut { .. }) - )); - } - - #[tokio::test] - async fn buffer_time_jitter() { - let mut time = TestingTimeSource::new(epoch_secs(100)); - let buffer_time_jitter_fraction = || 0.5_f64; - let credentials_cache = test_provider( - TimeSource::testing(&time), - buffer_time_jitter_fraction, - vec![Ok(credentials(1000)), Ok(credentials(2000))], - ); - - expect_creds(1000, &credentials_cache).await; - let buffer_time_with_jitter = - (DEFAULT_BUFFER_TIME.as_secs_f64() * buffer_time_jitter_fraction()) as u64; - assert_eq!(buffer_time_with_jitter, 5); - // Advance time to the point where the first credentials are about to expire (but haven't). - let almost_expired_secs = 1000 - buffer_time_with_jitter - 1; - time.set_time(epoch_secs(almost_expired_secs)); - // We should still use the first credentials. - expect_creds(1000, &credentials_cache).await; - // Now let the first credentials expire. - let expired_secs = almost_expired_secs + 1; - time.set_time(epoch_secs(expired_secs)); - // Now that the first credentials have been expired, the second credentials will be retrieved. - expect_creds(2000, &credentials_cache).await; - } -} diff --git a/aws/rust-runtime/aws-credential-types/src/cache/no_caching.rs b/aws/rust-runtime/aws-credential-types/src/cache/no_caching.rs deleted file mode 100644 index 5827f5cea12..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/cache/no_caching.rs +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Credentials cache that offers no caching ability - -use crate::cache::ProvideCachedCredentials; -use crate::provider::SharedCredentialsProvider; -use crate::provider::{future, ProvideCredentials}; -use tracing::debug; - -#[derive(Debug)] -pub(crate) struct NoCredentialsCache { - provider: SharedCredentialsProvider, -} - -impl NoCredentialsCache { - pub(crate) fn new(provider: SharedCredentialsProvider) -> Self { - Self { provider } - } -} - -impl ProvideCachedCredentials for NoCredentialsCache { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'_> - where - Self: 'a, - { - debug!("Delegating `provide_cached_credentials` to `provide_credentials` on the provider"); - self.provider.provide_credentials() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::credential_fn::provide_credentials_fn; - use crate::Credentials; - use std::sync::{Arc, Mutex}; - use std::time::{Duration, SystemTime}; - - fn test_provider(load_list: Vec) -> NoCredentialsCache { - let load_list = Arc::new(Mutex::new(load_list)); - NoCredentialsCache::new(SharedCredentialsProvider::new(provide_credentials_fn( - move || { - let list = load_list.clone(); - async move { - let next = list.lock().unwrap().remove(0); - next - } - }, - ))) - } - - fn epoch_secs(secs: u64) -> SystemTime { - SystemTime::UNIX_EPOCH + Duration::from_secs(secs) - } - - fn credentials(expired_secs: u64) -> Credentials { - Credentials::new("test", "test", None, Some(epoch_secs(expired_secs)), "test") - } - - async fn expect_creds(expired_secs: u64, provider: &NoCredentialsCache) { - let creds = provider - .provide_cached_credentials() - .await - .expect("expected credentials"); - assert_eq!(Some(epoch_secs(expired_secs)), creds.expiry()); - } - - #[tokio::test] - async fn no_caching() { - let credentials_cache = test_provider(vec![ - Ok(credentials(1000)), - Ok(credentials(2000)), - Ok(credentials(3000)), - ]); - - expect_creds(1000, &credentials_cache).await; - expect_creds(2000, &credentials_cache).await; - expect_creds(3000, &credentials_cache).await; - } -} diff --git a/aws/rust-runtime/aws-credential-types/src/credentials_impl.rs b/aws/rust-runtime/aws-credential-types/src/credentials_impl.rs index c310c514604..5dbc14b4d3c 100644 --- a/aws/rust-runtime/aws-credential-types/src/credentials_impl.rs +++ b/aws/rust-runtime/aws-credential-types/src/credentials_impl.rs @@ -10,6 +10,8 @@ use std::sync::Arc; use std::time::{SystemTime, UNIX_EPOCH}; use zeroize::Zeroizing; +use aws_smithy_runtime_api::client::identity::Identity; + /// AWS SDK Credentials /// /// An opaque struct representing credentials that may be used in an AWS SDK, modeled on @@ -140,18 +142,6 @@ impl Credentials { ) } - /// Creates a test `Credentials`. - #[cfg(feature = "test-util")] - pub fn for_tests() -> Self { - Self::new( - "ANOTREAL", - "notrealrnrELgWzOk3IfjzDKtFBhDby", - Some("notarealsessiontoken".to_string()), - None, - "test", - ) - } - /// Returns the access key ID. pub fn access_key_id(&self) -> &str { &self.0.access_key_id @@ -178,6 +168,38 @@ impl Credentials { } } +#[cfg(feature = "test-util")] +impl Credentials { + /// Creates a test `Credentials` with no session token. + pub fn for_tests() -> Self { + Self::new( + "ANOTREAL", + "notrealrnrELgWzOk3IfjzDKtFBhDby", + None, + None, + "test", + ) + } + + /// Creates a test `Credentials` that include a session token. + pub fn for_tests_with_session_token() -> Self { + Self::new( + "ANOTREAL", + "notrealrnrELgWzOk3IfjzDKtFBhDby", + Some("notarealsessiontoken".to_string()), + None, + "test", + ) + } +} + +impl From for Identity { + fn from(val: Credentials) -> Self { + let expiry = val.expiry(); + Identity::new(val, expiry) + } +} + #[cfg(test)] mod test { use crate::Credentials; diff --git a/aws/rust-runtime/aws-credential-types/src/lib.rs b/aws/rust-runtime/aws-credential-types/src/lib.rs index b2f8330b589..58a3148eb8e 100644 --- a/aws/rust-runtime/aws-credential-types/src/lib.rs +++ b/aws/rust-runtime/aws-credential-types/src/lib.rs @@ -17,11 +17,8 @@ unreachable_pub )] -pub mod cache; pub mod credential_fn; mod credentials_impl; pub mod provider; -#[doc(hidden)] -pub mod time_source; pub use credentials_impl::Credentials; diff --git a/aws/rust-runtime/aws-credential-types/src/provider.rs b/aws/rust-runtime/aws-credential-types/src/provider.rs index 9be88b590fd..35c6f914482 100644 --- a/aws/rust-runtime/aws-credential-types/src/provider.rs +++ b/aws/rust-runtime/aws-credential-types/src/provider.rs @@ -72,7 +72,9 @@ construct credentials from hardcoded values. //! ``` use crate::Credentials; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::sync::Arc; /// Credentials provider errors @@ -355,3 +357,17 @@ impl ProvideCredentials for SharedCredentialsProvider { impl Storable for SharedCredentialsProvider { type Storer = StoreReplace; } + +impl ResolveIdentity for SharedCredentialsProvider { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::new(async move { Ok(self.provide_credentials().await?.into()) }) + } + + fn fallback_on_interrupt(&self) -> Option { + ProvideCredentials::fallback_on_interrupt(self).map(|creds| creds.into()) + } +} diff --git a/aws/rust-runtime/aws-credential-types/src/time_source.rs b/aws/rust-runtime/aws-credential-types/src/time_source.rs deleted file mode 100644 index 212c7aa904a..00000000000 --- a/aws/rust-runtime/aws-credential-types/src/time_source.rs +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_async::time::{SharedTimeSource, TimeSource as TimeSourceTrait}; -use std::ops::Deref; -use std::sync::{Arc, Mutex}; -use std::time::{Duration, SystemTime}; - -impl TimeSourceTrait for TimeSource { - fn now(&self) -> SystemTime { - self.now() - } -} - -/// Time source abstraction -/// -/// Simple abstraction representing time either real-time or manually-specified for testing -#[derive(Debug, Clone)] -// TODO(breakingChangeWindow): Delete this struct -pub struct TimeSource(Inner); - -impl TimeSource { - /// Creates `TimeSource` from the manually specified `time_source`. - pub fn testing(time_source: &TestingTimeSource) -> Self { - TimeSource(Inner::Testing(time_source.clone())) - } - - /// Creates `TimeSource` from a shared time source - pub fn shared(time_source: SharedTimeSource) -> Self { - TimeSource(Inner::Shared(time_source)) - } - - /// Returns the current system time based on the mode. - pub fn now(&self) -> SystemTime { - match &self.0 { - Inner::Default => SystemTime::now(), - Inner::Testing(testing) => testing.now(), - Inner::Shared(ts) => ts.now(), - } - } -} - -impl Default for TimeSource { - /// Creates `TimeSource` from the current system time. - fn default() -> Self { - TimeSource(Inner::Default) - } -} - -/// Time Source that can be manually moved for tests -/// > This has been superseded by [`aws_smithy_async::time::TimeSource`] and will be removed in a -/// > future release. -/// -/// # Examples -/// -/// ```rust -/// # struct Client { -/// # // stub -/// # } -/// # -/// # impl Client { -/// # fn with_timesource(ts: TimeSource) -> Self { -/// # Client { } -/// # } -/// # } -/// use aws_credential_types::time_source::{TestingTimeSource, TimeSource}; -/// use std::time::{UNIX_EPOCH, Duration}; -/// let mut time = TestingTimeSource::new(UNIX_EPOCH); -/// let client = Client::with_timesource(TimeSource::testing(&time)); -/// time.advance(Duration::from_secs(100)); -/// ``` -#[derive(Clone, Debug)] -pub struct TestingTimeSource { - queries: Arc>>, - now: Arc>, -} - -impl TestingTimeSource { - /// Creates `TestingTimeSource` with `start_time`. - pub fn new(start_time: SystemTime) -> Self { - Self { - queries: Default::default(), - now: Arc::new(Mutex::new(start_time)), - } - } - - /// Sets time to the specified `time`. - pub fn set_time(&mut self, time: SystemTime) { - let mut now = self.now.lock().unwrap(); - *now = time; - } - - /// Advances time by `delta`. - pub fn advance(&mut self, delta: Duration) { - let mut now = self.now.lock().unwrap(); - *now += delta; - } - - /// Returns a `Vec` of queried times so far. - pub fn queries(&self) -> impl Deref> + '_ { - self.queries.lock().unwrap() - } - - /// Returns the current time understood by `TestingTimeSource`. - pub fn now(&self) -> SystemTime { - let ts = *self.now.lock().unwrap(); - self.queries.lock().unwrap().push(ts); - ts - } -} - -#[derive(Debug, Clone)] -enum Inner { - Default, - Testing(TestingTimeSource), - Shared(SharedTimeSource), -} - -#[cfg(test)] -mod test { - use super::{TestingTimeSource, TimeSource}; - - use std::time::{Duration, UNIX_EPOCH}; - - #[test] - fn default_time_source_should_not_panic_on_calling_now() { - let time_source = TimeSource::default(); - // no panics - let _ = time_source.now(); - } - - #[test] - fn testing_time_source_should_behave_as_expected() { - let mut testing = TestingTimeSource::new(UNIX_EPOCH); - let time_source = TimeSource::testing(&testing); - assert_eq!(time_source.now(), UNIX_EPOCH); - testing.advance(Duration::from_secs(10)); - assert_eq!(time_source.now(), UNIX_EPOCH + Duration::from_secs(10)); - } -} diff --git a/aws/rust-runtime/aws-endpoint/Cargo.toml b/aws/rust-runtime/aws-endpoint/Cargo.toml index 67cb4d4e6e1..9c2cc01257d 100644 --- a/aws/rust-runtime/aws-endpoint/Cargo.toml +++ b/aws/rust-runtime/aws-endpoint/Cargo.toml @@ -2,18 +2,10 @@ name = "aws-endpoint" version = "0.0.0-smithy-rs-head" authors = ["AWS Rust SDK Team ", "Russell Cohen "] -description = "AWS SDK endpoint support." +description = "This crate is no longer used by the AWS SDK and is deprecated." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" - -[dependencies] -aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types"} -aws-types = { path = "../aws-types" } -http = "0.2.3" -regex = { version = "1.5.5", default-features = false, features = ["std"] } -tracing = "0.1" +repository = "https://github.com/smithy-lang/smithy-rs" [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-endpoint/README.md b/aws/rust-runtime/aws-endpoint/README.md index d4405ac7fad..217c25e02c8 100644 --- a/aws/rust-runtime/aws-endpoint/README.md +++ b/aws/rust-runtime/aws-endpoint/README.md @@ -1,6 +1,7 @@ # aws-endpoint -This crate defines endpoint resolution logic specific to AWS services. + +This crate is no longer used by the AWS SDK and is deprecated. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-endpoint/external-types.toml b/aws/rust-runtime/aws-endpoint/external-types.toml index a121d9e1236..7fa182b39d1 100644 --- a/aws/rust-runtime/aws-endpoint/external-types.toml +++ b/aws/rust-runtime/aws-endpoint/external-types.toml @@ -1,5 +1 @@ -allowed_external_types = [ - "aws_types::*", - "aws_smithy_http::property_bag::PropertyBag", - "aws_smithy_http::middleware::MapRequest", -] +allowed_external_types = [] diff --git a/aws/rust-runtime/aws-endpoint/src/lib.rs b/aws/rust-runtime/aws-endpoint/src/lib.rs index 8003d7c4aaf..2819d851189 100644 --- a/aws/rust-runtime/aws-endpoint/src/lib.rs +++ b/aws/rust-runtime/aws-endpoint/src/lib.rs @@ -3,240 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -#![allow(clippy::derive_partial_eq_without_eq)] - -use std::error::Error; -use std::fmt; - -use aws_smithy_http::middleware::MapRequest; -use aws_smithy_http::operation::Request; -use aws_smithy_types::endpoint::Endpoint as SmithyEndpoint; -use aws_smithy_types::Document; - -use aws_types::region::{Region, SigningRegion}; -use aws_types::SigningService; - -/// Middleware Stage to add authentication information from a Smithy endpoint into the property bag -/// -/// AwsAuthStage implements [`MapRequest`](MapRequest). It will: -/// 1. Load an endpoint from the property bag -/// 2. Set the `SigningRegion` and `SigningService` in the property bag to drive downstream -/// signing middleware. -#[derive(Clone, Debug)] -pub struct AwsAuthStage; - -#[derive(Debug)] -enum AwsAuthStageErrorKind { - NoEndpointResolver, - EndpointResolutionError(Box), -} - -#[derive(Debug)] -pub struct AwsAuthStageError { - kind: AwsAuthStageErrorKind, -} - -impl fmt::Display for AwsAuthStageError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use AwsAuthStageErrorKind::*; - match &self.kind { - NoEndpointResolver => write!(f, "endpoint resolution failed: no endpoint present"), - EndpointResolutionError(_) => write!(f, "endpoint resolution failed"), - } - } -} - -impl Error for AwsAuthStageError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - use AwsAuthStageErrorKind::*; - match &self.kind { - EndpointResolutionError(source) => Some(source.as_ref() as _), - NoEndpointResolver => None, - } - } -} - -impl From for AwsAuthStageError { - fn from(kind: AwsAuthStageErrorKind) -> Self { - Self { kind } - } -} - -impl MapRequest for AwsAuthStage { - type Error = AwsAuthStageError; - - fn name(&self) -> &'static str { - "resolve_endpoint" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|http_req, props| { - let endpoint = props - .get::() - .ok_or(AwsAuthStageErrorKind::NoEndpointResolver)?; - let (signing_scope_override, signing_service_override) = smithy_to_aws(endpoint) - .map_err(|err| AwsAuthStageErrorKind::EndpointResolutionError(err))?; - - if let Some(signing_scope) = signing_scope_override { - props.insert(signing_scope); - } - if let Some(signing_service) = signing_service_override { - props.insert(signing_service); - } - Ok(http_req) - }) - } -} - -type EndpointMetadata = (Option, Option); - -fn smithy_to_aws(value: &SmithyEndpoint) -> Result> { - // look for v4 as an auth scheme - let auth_schemes = match value.properties().get("authSchemes") { - Some(Document::Array(schemes)) => schemes, - // no auth schemes: - None => return Ok((None, None)), - _other => return Err("expected an array for authSchemes".into()), - }; - let auth_schemes = auth_schemes - .iter() - .flat_map(|doc| match doc { - Document::Object(map) => Some(map), - _ => None, - }) - .map(|it| { - let name = match it.get("name") { - Some(Document::String(s)) => Some(s.as_str()), - _ => None, - }; - (name, it) - }); - let (_, v4) = auth_schemes - .clone() - .find(|(name, _doc)| name.as_deref() == Some("sigv4")) - .ok_or_else(|| { - format!( - "No auth schemes were supported. The Rust SDK only supports sigv4. \ - The authentication schemes supported by this endpoint were: {:?}", - auth_schemes.flat_map(|(name, _)| name).collect::>() - ) - })?; - - let signing_scope = match v4.get("signingRegion") { - Some(Document::String(s)) => Some(SigningRegion::from(Region::new(s.clone()))), - None => None, - _ => return Err("unexpected type".into()), - }; - let signing_service = match v4.get("signingName") { - Some(Document::String(s)) => Some(SigningService::from(s.to_string())), - None => None, - _ => return Err("unexpected type".into()), - }; - Ok((signing_scope, signing_service)) -} - -#[cfg(test)] -mod test { - use std::collections::HashMap; - - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; - use aws_smithy_types::endpoint::Endpoint; - use aws_smithy_types::Document; - use http::header::HOST; - - use aws_types::region::{Region, SigningRegion}; - use aws_types::SigningService; - - use crate::AwsAuthStage; - - #[test] - fn default_endpoint_updates_request() { - let endpoint = Endpoint::builder() - .url("kinesis.us-east-1.amazon.com") - .build(); - let req = http::Request::new(SdkBody::from("")); - let region = Region::new("us-east-1"); - let mut req = operation::Request::new(req); - { - let mut props = req.properties_mut(); - props.insert(SigningRegion::from(region.clone())); - props.insert(SigningService::from_static("kinesis")); - props.insert(endpoint); - }; - let req = AwsAuthStage.apply(req).expect("should succeed"); - assert_eq!(req.properties().get(), Some(&SigningRegion::from(region))); - assert_eq!( - req.properties().get(), - Some(&SigningService::from_static("kinesis")) - ); - - assert!(req.http().headers().get(HOST).is_none()); - assert!( - req.properties().get::().is_some(), - "Endpoint middleware MUST leave the result in the bag" - ); - } - - #[test] - fn sets_service_override_when_set() { - let endpoint = Endpoint::builder() - .url("kinesis.us-east-override.amazon.com") - .property( - "authSchemes", - vec![Document::Object({ - let mut out = HashMap::new(); - out.insert("name".to_string(), "sigv4".to_string().into()); - out.insert( - "signingName".to_string(), - "qldb-override".to_string().into(), - ); - out.insert( - "signingRegion".to_string(), - "us-east-override".to_string().into(), - ); - out - })], - ) - .build(); - let req = http::Request::new(SdkBody::from("")); - let region = Region::new("us-east-1"); - let mut req = operation::Request::new(req); - { - let mut props = req.properties_mut(); - props.insert(region); - props.insert(SigningService::from_static("qldb")); - props.insert(endpoint); - }; - let req = AwsAuthStage.apply(req).expect("should succeed"); - assert_eq!( - req.properties().get(), - Some(&SigningRegion::from(Region::new("us-east-override"))) - ); - assert_eq!( - req.properties().get(), - Some(&SigningService::from_static("qldb-override")) - ); - } - - #[test] - fn supports_fallback_when_scope_is_unset() { - let endpoint = Endpoint::builder().url("www.service.com").build(); - let req = http::Request::new(SdkBody::from("")); - let region = SigningRegion::from_static("us-east-1"); - let mut req = operation::Request::new(req); - { - let mut props = req.properties_mut(); - props.insert(region.clone()); - props.insert(SigningService::from_static("qldb")); - props.insert(endpoint); - }; - let req = AwsAuthStage.apply(req).expect("should succeed"); - assert_eq!(req.properties().get(), Some(®ion)); - assert_eq!( - req.properties().get(), - Some(&SigningService::from_static("qldb")) - ); - } -} +//! This crate is no longer used by the AWS SDK and is deprecated. diff --git a/aws/rust-runtime/aws-http/Cargo.toml b/aws/rust-runtime/aws-http/Cargo.toml index 7b010570162..a6303982f65 100644 --- a/aws/rust-runtime/aws-http/Cargo.toml +++ b/aws/rust-runtime/aws-http/Cargo.toml @@ -5,34 +5,21 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-http/external-types.toml b/aws/rust-runtime/aws-http/external-types.toml index 33a2ed14aa6..429bf1a9098 100644 --- a/aws/rust-runtime/aws-http/external-types.toml +++ b/aws/rust-runtime/aws-http/external-types.toml @@ -1,11 +1,11 @@ allowed_external_types = [ - "aws_credential_types::*", - "aws_smithy_http::*", - "aws_smithy_types::*", - "aws_types::*", + "aws_smithy_runtime_api::http::headers::Headers", + "aws_smithy_types::body::Error", + "aws_smithy_types::config_bag::storable::Storable", + "aws_smithy_types::config_bag::storable::StoreReplace", + "aws_smithy_types::error::metadata::Builder", + "aws_types::app_name::AppName", + "aws_types::os_shim_internal::Env", "bytes::bytes::Bytes", "http_body::Body", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if the following should be exposed - "http::header::value::InvalidHeaderValue", ] diff --git a/aws/rust-runtime/aws-http/src/auth.rs b/aws/rust-runtime/aws-http/src/auth.rs deleted file mode 100644 index 98e0e219bb0..00000000000 --- a/aws/rust-runtime/aws-http/src/auth.rs +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_credential_types::cache::{ProvideCachedCredentials, SharedCredentialsCache}; -use aws_credential_types::provider::error::CredentialsError; -use aws_smithy_http::middleware::AsyncMapRequest; -use aws_smithy_http::operation::Request; -use aws_smithy_http::property_bag::PropertyBag; -use std::future::Future; -use std::pin::Pin; - -/// Sets the credentials cache in the given property bag. -pub fn set_credentials_cache(bag: &mut PropertyBag, cache: SharedCredentialsCache) { - bag.insert(cache); -} - -/// Middleware stage that loads credentials from a [SharedCredentialsCache](aws_credential_types::cache::SharedCredentialsCache) -/// and places them in the property bag of the request. -/// -/// [CredentialsStage] implements [`AsyncMapRequest`](aws_smithy_http::middleware::AsyncMapRequest), and: -/// 1. Retrieves a `SharedCredentialsCache` from the property bag. -/// 2. Calls the credential cache's `provide_cached_credentials` and awaits its result. -/// 3. Places returned `Credentials` into the property bag to drive downstream signing middleware. -#[derive(Clone, Debug, Default)] -#[non_exhaustive] -pub struct CredentialsStage; - -impl CredentialsStage { - /// Creates a new credentials stage. - pub fn new() -> Self { - CredentialsStage - } - - async fn load_creds(mut request: Request) -> Result { - let credentials_cache = request - .properties() - .get::() - .cloned(); - let credentials_cache = match credentials_cache { - Some(credentials_cache) => credentials_cache, - None => { - tracing::info!("no credentials cache for request"); - return Ok(request); - } - }; - match credentials_cache.provide_cached_credentials().await { - Ok(creds) => { - request.properties_mut().insert(creds); - } - // ignore the case where there is no credentials cache wired up - Err(CredentialsError::CredentialsNotLoaded { .. }) => { - tracing::info!("credentials cache returned CredentialsNotLoaded, ignoring") - } - // if we get another error class, there is probably something actually wrong that the user will - // want to know about - Err(other) => return Err(other.into()), - } - Ok(request) - } -} - -mod error { - use aws_credential_types::provider::error::CredentialsError; - use std::error::Error as StdError; - use std::fmt; - - /// Failures that can occur in the credentials middleware. - #[derive(Debug)] - pub struct CredentialsStageError { - source: CredentialsError, - } - - impl StdError for CredentialsStageError { - fn source(&self) -> Option<&(dyn StdError + 'static)> { - Some(&self.source as _) - } - } - - impl fmt::Display for CredentialsStageError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "failed to load credentials from the credentials cache") - } - } - - impl From for CredentialsStageError { - fn from(source: CredentialsError) -> Self { - CredentialsStageError { source } - } - } -} - -pub use error::*; - -type BoxFuture = Pin + Send>>; - -impl AsyncMapRequest for CredentialsStage { - type Error = CredentialsStageError; - type Future = Pin> + Send + 'static>>; - - fn name(&self) -> &'static str { - "retrieve_credentials" - } - - fn apply(&self, request: Request) -> BoxFuture> { - Box::pin(Self::load_creds(request)) - } -} - -#[cfg(test)] -mod tests { - use super::set_credentials_cache; - use super::CredentialsStage; - use aws_credential_types::cache::{ - CredentialsCache, ProvideCachedCredentials, SharedCredentialsCache, - }; - use aws_credential_types::credential_fn::provide_credentials_fn; - use aws_credential_types::provider::SharedCredentialsProvider; - use aws_credential_types::provider::{error::CredentialsError, future}; - use aws_credential_types::Credentials; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::AsyncMapRequest; - use aws_smithy_http::operation; - - #[derive(Debug)] - struct Unhandled; - impl ProvideCachedCredentials for Unhandled { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - future::ProvideCredentials::ready(Err(CredentialsError::unhandled("whoops"))) - } - } - - #[derive(Debug)] - struct NoCreds; - impl ProvideCachedCredentials for NoCreds { - fn provide_cached_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - future::ProvideCredentials::ready(Err(CredentialsError::not_loaded("no creds"))) - } - } - - #[tokio::test] - async fn no_credential_cache_is_ok() { - let req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - CredentialsStage::new() - .apply(req) - .await - .expect("no credentials cache should not populate credentials"); - } - - #[tokio::test] - async fn credentials_cache_failure_is_failure() { - let mut req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - set_credentials_cache( - &mut req.properties_mut(), - SharedCredentialsCache::new(Unhandled), - ); - CredentialsStage::new() - .apply(req) - .await - .expect_err("no credentials cache should not populate credentials"); - } - - #[tokio::test] - async fn credentials_not_loaded_is_ok() { - let mut req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - set_credentials_cache( - &mut req.properties_mut(), - SharedCredentialsCache::new(NoCreds), - ); - CredentialsStage::new() - .apply(req) - .await - .expect("credentials not loaded is OK"); - } - - #[tokio::test] - async fn async_map_request_apply_populates_credentials() { - let mut req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - let credentials_cache = CredentialsCache::lazy_builder() - .into_credentials_cache() - .create_cache(SharedCredentialsProvider::new(provide_credentials_fn( - || async { Ok(Credentials::for_tests()) }, - ))); - set_credentials_cache(&mut req.properties_mut(), credentials_cache); - let req = CredentialsStage::new() - .apply(req) - .await - .expect("credentials cache is in the bag; should succeed"); - assert!( - req.properties().get::().is_some(), - "it should set credentials on the request config" - ); - } -} diff --git a/aws/rust-runtime/aws-http/src/content_encoding.rs b/aws/rust-runtime/aws-http/src/content_encoding.rs index 6b900ab7506..dc9c62a1c7a 100644 --- a/aws/rust-runtime/aws-http/src/content_encoding.rs +++ b/aws/rust-runtime/aws-http/src/content_encoding.rs @@ -199,10 +199,10 @@ fn total_rendered_length_of_trailers(trailer_map: Option<&HeaderMap>) -> u64 { impl Body for AwsChunkedBody where - Inner: Body, + Inner: Body, { type Data = Bytes; - type Error = aws_smithy_http::body::Error; + type Error = aws_smithy_types::body::Error; fn poll_data( self: Pin<&mut Self>, @@ -354,7 +354,7 @@ mod tests { AwsChunkedBodyOptions, CHUNK_TERMINATOR, CRLF, }; - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; use bytes::{Buf, Bytes}; use bytes_utils::SegmentedBuf; use http::{HeaderMap, HeaderValue}; @@ -382,7 +382,7 @@ mod tests { impl Body for SputteringBody { type Data = Bytes; - type Error = aws_smithy_http::body::Error; + type Error = aws_smithy_types::body::Error; fn poll_data( self: Pin<&mut Self>, diff --git a/aws/rust-runtime/aws-http/src/lib.rs b/aws/rust-runtime/aws-http/src/lib.rs index d5307bcba3d..a5a670988c4 100644 --- a/aws/rust-runtime/aws-http/src/lib.rs +++ b/aws/rust-runtime/aws-http/src/lib.rs @@ -14,20 +14,8 @@ unreachable_pub )] -/// Credentials middleware -pub mod auth; - -/// Recursion Detection middleware -pub mod recursion_detection; - -/// AWS-specific retry logic -pub mod retry; - /// User agent middleware pub mod user_agent; /// AWS-specific content-encoding tools pub mod content_encoding; - -/// AWS-specific request ID support -pub mod request_id; diff --git a/aws/rust-runtime/aws-http/src/recursion_detection.rs b/aws/rust-runtime/aws-http/src/recursion_detection.rs deleted file mode 100644 index 3cc27615d33..00000000000 --- a/aws/rust-runtime/aws-http/src/recursion_detection.rs +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::recursion_detection::env::TRACE_ID; -use aws_smithy_http::middleware::MapRequest; -use aws_smithy_http::operation::Request; -use aws_types::os_shim_internal::Env; -use http::HeaderValue; -use percent_encoding::{percent_encode, CONTROLS}; -use std::borrow::Cow; - -// TODO(enableNewSmithyRuntimeCleanup): Delete this module - -/// Recursion Detection Middleware -/// -/// This middleware inspects the value of the `AWS_LAMBDA_FUNCTION_NAME` and `_X_AMZN_TRACE_ID` environment -/// variables to detect if the request is being invoked in a lambda function. If it is, the `X-Amzn-Trace-Id` header -/// will be set. This enables downstream services to prevent accidentally infinitely recursive invocations spawned -/// from lambda. -#[non_exhaustive] -#[derive(Default, Debug, Clone)] -pub struct RecursionDetectionStage { - env: Env, -} - -impl RecursionDetectionStage { - /// Creates a new `RecursionDetectionStage` - pub fn new() -> Self { - Self::default() - } -} - -impl MapRequest for RecursionDetectionStage { - type Error = std::convert::Infallible; - - fn name(&self) -> &'static str { - "recursion_detection" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|mut req, _conf| { - augument_request(&mut req, &self.env); - Ok(req) - }) - } -} - -const TRACE_ID_HEADER: &str = "x-amzn-trace-id"; - -mod env { - pub(super) const LAMBDA_FUNCTION_NAME: &str = "AWS_LAMBDA_FUNCTION_NAME"; - pub(super) const TRACE_ID: &str = "_X_AMZN_TRACE_ID"; -} - -/// Set the trace id header from the request -fn augument_request(req: &mut http::Request, env: &Env) { - if req.headers().contains_key(TRACE_ID_HEADER) { - return; - } - if let (Ok(_function_name), Ok(trace_id)) = - (env.get(env::LAMBDA_FUNCTION_NAME), env.get(TRACE_ID)) - { - req.headers_mut() - .insert(TRACE_ID_HEADER, encode_header(trace_id.as_bytes())); - } -} - -/// Encodes a byte slice as a header. -/// -/// ASCII control characters are percent encoded which ensures that all byte sequences are valid headers -fn encode_header(value: &[u8]) -> HeaderValue { - let value: Cow<'_, str> = percent_encode(value, CONTROLS).into(); - HeaderValue::from_bytes(value.as_bytes()).expect("header is encoded, header must be valid") -} - -#[cfg(test)] -mod test { - use crate::recursion_detection::{encode_header, RecursionDetectionStage}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; - use aws_smithy_protocol_test::{assert_ok, validate_headers}; - use aws_types::os_shim_internal::Env; - use http::HeaderValue; - use proptest::{prelude::*, proptest}; - use serde::Deserialize; - use std::collections::HashMap; - - proptest! { - #[test] - fn header_encoding_never_panics(s in any::>()) { - encode_header(&s); - } - } - - #[test] - fn every_char() { - let buff = (0..=255).collect::>(); - assert_eq!( - encode_header(&buff), - HeaderValue::from_static( - r##"%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF"## - ) - ); - } - - #[test] - fn run_tests() { - let test_cases: Vec = - serde_json::from_str(include_str!("../test-data/recursion-detection.json")) - .expect("invalid test case"); - for test_case in test_cases { - check(test_case) - } - } - - #[derive(Deserialize)] - #[serde(rename_all = "camelCase")] - struct TestCase { - env: HashMap, - request_headers_before: Vec, - request_headers_after: Vec, - } - - impl TestCase { - fn env(&self) -> Env { - Env::from(self.env.clone()) - } - - /// Headers on the input request - fn request_headers_before(&self) -> impl Iterator { - Self::split_headers(&self.request_headers_before) - } - - /// Headers on the output request - fn request_headers_after(&self) -> impl Iterator { - Self::split_headers(&self.request_headers_after) - } - - /// Split text headers on `: ` - fn split_headers(headers: &[String]) -> impl Iterator { - headers - .iter() - .map(|header| header.split_once(": ").expect("header must contain :")) - } - } - - fn check(test_case: TestCase) { - let env = test_case.env(); - let mut req = http::Request::builder(); - for (k, v) in test_case.request_headers_before() { - req = req.header(k, v); - } - let req = req.body(SdkBody::empty()).expect("must be valid"); - let req = operation::Request::new(req); - let augmented_req = RecursionDetectionStage { env } - .apply(req) - .expect("stage must succeed"); - for k in augmented_req.http().headers().keys() { - assert_eq!( - augmented_req.http().headers().get_all(k).iter().count(), - 1, - "No duplicated headers" - ) - } - assert_ok(validate_headers( - augmented_req.http().headers(), - test_case.request_headers_after(), - )) - } -} diff --git a/aws/rust-runtime/aws-http/src/retry.rs b/aws/rust-runtime/aws-http/src/retry.rs deleted file mode 100644 index 8e7d0fcbb59..00000000000 --- a/aws/rust-runtime/aws-http/src/retry.rs +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ -//! AWS-specific retry logic - -use aws_smithy_http::result::SdkError; -use aws_smithy_http::retry::{ClassifyRetry, DefaultResponseRetryClassifier}; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; -use std::time::Duration; - -const TRANSIENT_ERROR_STATUS_CODES: &[u16] = &[500, 502, 503, 504]; -const THROTTLING_ERRORS: &[&str] = &[ - "Throttling", - "ThrottlingException", - "ThrottledException", - "RequestThrottledException", - "TooManyRequestsException", - "ProvisionedThroughputExceededException", - "TransactionInProgressException", - "RequestLimitExceeded", - "BandwidthLimitExceeded", - "LimitExceededException", - "RequestThrottled", - "SlowDown", - "PriorRequestNotComplete", - "EC2ThrottledException", -]; -const TRANSIENT_ERRORS: &[&str] = &["RequestTimeout", "RequestTimeoutException"]; - -/// Implementation of [`ClassifyRetry`] that classifies AWS error codes. -/// -/// In order of priority: -/// 1. The `x-amz-retry-after` header is checked -/// 2. The modeled error retry mode is checked -/// 3. The code is checked against a predetermined list of throttling errors & transient error codes -/// 4. The status code is checked against a predetermined list of status codes -#[non_exhaustive] -#[derive(Clone, Debug)] -pub struct AwsResponseRetryClassifier; - -impl AwsResponseRetryClassifier { - /// Create an `AwsResponseRetryClassifier` with the default set of known error & status codes - pub fn new() -> Self { - Self - } -} - -impl Default for AwsResponseRetryClassifier { - fn default() -> Self { - Self::new() - } -} - -impl ClassifyRetry> for AwsResponseRetryClassifier -where - E: ProvideErrorKind, -{ - fn classify_retry(&self, result: Result<&T, &SdkError>) -> RetryKind { - // Run common retry classification logic from aws-smithy-http, and if it yields - // a `RetryKind`, then return that immediately. Otherwise, continue on to run some - // AWS SDK specific classification logic. - let (err, response) = match DefaultResponseRetryClassifier::try_extract_err_response(result) - { - Ok(extracted) => extracted, - Err(retry_kind) => return retry_kind, - }; - if let Some(retry_after_delay) = response - .http() - .headers() - .get("x-amz-retry-after") - .and_then(|header| header.to_str().ok()) - .and_then(|header| header.parse::().ok()) - { - return RetryKind::Explicit(Duration::from_millis(retry_after_delay)); - } - if let Some(kind) = err.retryable_error_kind() { - return RetryKind::Error(kind); - }; - if let Some(code) = err.code() { - if THROTTLING_ERRORS.contains(&code) { - return RetryKind::Error(ErrorKind::ThrottlingError); - } - if TRANSIENT_ERRORS.contains(&code) { - return RetryKind::Error(ErrorKind::TransientError); - } - }; - if TRANSIENT_ERROR_STATUS_CODES.contains(&response.http().status().as_u16()) { - return RetryKind::Error(ErrorKind::TransientError); - }; - // TODO(https://github.com/awslabs/smithy-rs/issues/966): IDPCommuncation error needs to be retried - RetryKind::UnretryableFailure - } -} - -#[cfg(test)] -mod test { - use crate::retry::AwsResponseRetryClassifier; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation; - use aws_smithy_http::result::{SdkError, SdkSuccess}; - use aws_smithy_http::retry::ClassifyRetry; - use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; - use std::fmt; - use std::time::Duration; - - #[derive(Debug)] - struct UnmodeledError; - impl fmt::Display for UnmodeledError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "UnmodeledError") - } - } - impl std::error::Error for UnmodeledError {} - - struct CodedError { - code: &'static str, - } - - impl ProvideErrorKind for UnmodeledError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - None - } - } - - impl ProvideErrorKind for CodedError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - Some(self.code) - } - } - - fn make_err( - err: E, - raw: http::Response<&'static str>, - ) -> Result, SdkError> { - Err(SdkError::service_error( - err, - operation::Response::new(raw.map(SdkBody::from)), - )) - } - - #[test] - fn not_an_error() { - let policy = AwsResponseRetryClassifier::new(); - let test_response = http::Response::new("OK"); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_response).as_ref()), - RetryKind::UnretryableFailure - ); - } - - #[test] - fn classify_by_response_status() { - let policy = AwsResponseRetryClassifier::new(); - let test_resp = http::Response::builder() - .status(500) - .body("error!") - .unwrap(); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_resp).as_ref()), - RetryKind::Error(ErrorKind::TransientError) - ); - } - - #[test] - fn classify_by_response_status_not_retryable() { - let policy = AwsResponseRetryClassifier::new(); - let test_resp = http::Response::builder() - .status(408) - .body("error!") - .unwrap(); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_resp).as_ref()), - RetryKind::UnretryableFailure - ); - } - - #[test] - fn classify_by_error_code() { - let test_response = http::Response::new("OK"); - let policy = AwsResponseRetryClassifier::new(); - - assert_eq!( - policy.classify_retry( - make_err(CodedError { code: "Throttling" }, test_response).as_ref() - ), - RetryKind::Error(ErrorKind::ThrottlingError) - ); - - let test_response = http::Response::new("OK"); - assert_eq!( - policy.classify_retry( - make_err( - CodedError { - code: "RequestTimeout" - }, - test_response, - ) - .as_ref() - ), - RetryKind::Error(ErrorKind::TransientError) - ) - } - - #[test] - fn classify_generic() { - let err = aws_smithy_types::Error::builder().code("SlowDown").build(); - let test_response = http::Response::new("OK"); - let policy = AwsResponseRetryClassifier::new(); - assert_eq!( - policy.classify_retry(make_err(err, test_response).as_ref()), - RetryKind::Error(ErrorKind::ThrottlingError) - ); - } - - #[test] - fn classify_by_error_kind() { - struct ModeledRetries; - let test_response = http::Response::new("OK"); - impl ProvideErrorKind for ModeledRetries { - fn retryable_error_kind(&self) -> Option { - Some(ErrorKind::ClientError) - } - - fn code(&self) -> Option<&str> { - // code should not be called when `error_kind` is provided - unimplemented!() - } - } - - let policy = AwsResponseRetryClassifier::new(); - - assert_eq!( - policy.classify_retry(make_err(ModeledRetries, test_response).as_ref()), - RetryKind::Error(ErrorKind::ClientError) - ); - } - - #[test] - fn test_retry_after_header() { - let policy = AwsResponseRetryClassifier::new(); - let test_response = http::Response::builder() - .header("x-amz-retry-after", "5000") - .body("retry later") - .unwrap(); - - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_response).as_ref()), - RetryKind::Explicit(Duration::from_millis(5000)) - ); - } - - #[test] - fn classify_response_error() { - let policy = AwsResponseRetryClassifier::new(); - assert_eq!( - policy.classify_retry( - Result::, SdkError>::Err(SdkError::response_error( - UnmodeledError, - operation::Response::new(http::Response::new("OK").map(SdkBody::from)), - )) - .as_ref() - ), - RetryKind::Error(ErrorKind::TransientError) - ); - } - - #[test] - fn test_timeout_error() { - let policy = AwsResponseRetryClassifier::new(); - let err: Result<(), SdkError> = Err(SdkError::timeout_error("blah")); - assert_eq!( - policy.classify_retry(err.as_ref()), - RetryKind::Error(ErrorKind::TransientError) - ); - } -} diff --git a/aws/rust-runtime/aws-http/src/user_agent.rs b/aws/rust-runtime/aws-http/src/user_agent.rs index 59edb2a5c34..9d92723720c 100644 --- a/aws/rust-runtime/aws-http/src/user_agent.rs +++ b/aws/rust-runtime/aws-http/src/user_agent.rs @@ -3,24 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::middleware::MapRequest; -use aws_smithy_http::operation::Request; use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_types::app_name::AppName; use aws_types::build_metadata::{OsFamily, BUILD_METADATA}; use aws_types::os_shim_internal::Env; -use http::header::{HeaderName, InvalidHeaderValue, USER_AGENT}; -use http::HeaderValue; use std::borrow::Cow; -use std::convert::TryFrom; use std::error::Error; use std::fmt; /// AWS User Agent /// -/// Ths struct should be inserted into the [`PropertyBag`](aws_smithy_http::operation::Request::properties) -/// during operation construction. [`UserAgentStage`](UserAgentStage) reads `AwsUserAgent` -/// from the property bag and sets the `User-Agent` and `x-amz-user-agent` headers. +/// Ths struct should be inserted into the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) +/// during operation construction. The `UserAgentInterceptor` reads `AwsUserAgent` +/// from the config bag and sets the `User-Agent` and `x-amz-user-agent` headers. #[derive(Clone, Debug)] pub struct AwsUserAgent { sdk_metadata: SdkMetadata, @@ -32,6 +27,7 @@ pub struct AwsUserAgent { config_metadata: Vec, framework_metadata: Vec, app_name: Option, + build_env_additional_metadata: Option, } impl AwsUserAgent { @@ -54,6 +50,11 @@ impl AwsUserAgent { .get("AWS_EXECUTION_ENV") .ok() .map(|name| ExecEnvMetadata { name }); + + // Retrieve additional metadata at compile-time from the AWS_SDK_RUST_BUILD_UA_METADATA env var + let build_env_additional_metadata = option_env!("AWS_SDK_RUST_BUILD_UA_METADATA") + .and_then(|value| AdditionalMetadata::new(value).ok()); + AwsUserAgent { sdk_metadata, api_metadata, @@ -68,6 +69,7 @@ impl AwsUserAgent { config_metadata: Default::default(), framework_metadata: Default::default(), app_name: Default::default(), + build_env_additional_metadata, } } @@ -98,6 +100,7 @@ impl AwsUserAgent { config_metadata: Vec::new(), framework_metadata: Vec::new(), app_name: None, + build_env_additional_metadata: None, } } @@ -193,6 +196,9 @@ impl AwsUserAgent { if let Some(app_name) = &self.app_name { write!(ua_value, "app/{}", app_name).unwrap(); } + if let Some(additional_metadata) = &self.build_env_additional_metadata { + write!(ua_value, "{}", additional_metadata).unwrap(); + } if ua_value.ends_with(' ') { ua_value.truncate(ua_value.len() - 1); } @@ -522,109 +528,12 @@ impl fmt::Display for ExecEnvMetadata { } } -// TODO(enableNewSmithyRuntimeCleanup): Delete the user agent Tower middleware and consider moving all the remaining code into aws-runtime - -/// User agent middleware -#[non_exhaustive] -#[derive(Default, Clone, Debug)] -pub struct UserAgentStage; - -impl UserAgentStage { - /// Creates a new `UserAgentStage` - pub fn new() -> Self { - Self - } -} - -#[derive(Debug)] -enum UserAgentStageErrorKind { - /// There was no [`AwsUserAgent`] in the property bag. - UserAgentMissing, - /// The formatted user agent string is not a valid HTTP header value. This indicates a bug. - InvalidHeader(InvalidHeaderValue), -} - -/// Failures that can arise from the user agent middleware -#[derive(Debug)] -pub struct UserAgentStageError { - kind: UserAgentStageErrorKind, -} - -impl Error for UserAgentStageError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - use UserAgentStageErrorKind::*; - match &self.kind { - InvalidHeader(source) => Some(source as _), - UserAgentMissing => None, - } - } -} - -impl fmt::Display for UserAgentStageError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use UserAgentStageErrorKind::*; - match self.kind { - UserAgentMissing => write!(f, "user agent missing from property bag"), - InvalidHeader(_) => { - write!(f, "provided user agent header was invalid (this is a bug)") - } - } - } -} - -impl From for UserAgentStageError { - fn from(kind: UserAgentStageErrorKind) -> Self { - Self { kind } - } -} - -impl From for UserAgentStageError { - fn from(value: InvalidHeaderValue) -> Self { - Self { - kind: UserAgentStageErrorKind::InvalidHeader(value), - } - } -} - -#[allow(clippy::declare_interior_mutable_const)] // we will never mutate this -const X_AMZ_USER_AGENT: HeaderName = HeaderName::from_static("x-amz-user-agent"); - -impl MapRequest for UserAgentStage { - type Error = UserAgentStageError; - - fn name(&self) -> &'static str { - "generate_user_agent" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|mut req, conf| { - let ua = conf - .get::() - .ok_or(UserAgentStageErrorKind::UserAgentMissing)?; - req.headers_mut() - .append(USER_AGENT, HeaderValue::try_from(ua.ua_header())?); - req.headers_mut() - .append(X_AMZ_USER_AGENT, HeaderValue::try_from(ua.aws_ua_header())?); - - Ok(req) - }) - } -} - #[cfg(test)] mod test { - use crate::user_agent::{ - AdditionalMetadata, ApiMetadata, AwsUserAgent, ConfigMetadata, FrameworkMetadata, - UserAgentStage, - }; - use crate::user_agent::{FeatureMetadata, X_AMZ_USER_AGENT}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; + use super::*; use aws_types::app_name::AppName; use aws_types::build_metadata::OsFamily; use aws_types::os_shim_internal::Env; - use http::header::USER_AGENT; use std::borrow::Cow; fn make_deterministic(ua: &mut AwsUserAgent) { @@ -766,63 +675,53 @@ mod test { } #[test] - fn ua_stage_adds_headers() { - let stage = UserAgentStage::new(); - let req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - stage - .apply(req) - .expect_err("adding UA should fail without a UA set"); - let mut req = operation::Request::new(http::Request::new(SdkBody::from("some body"))); - req.properties_mut() - .insert(AwsUserAgent::new_from_environment( - Env::from_slice(&[]), - ApiMetadata { - service_id: "dynamodb".into(), - version: "0.123", - }, - )); - let req = stage.apply(req).expect("setting user agent should succeed"); - let (req, _) = req.into_parts(); - req.headers() - .get(USER_AGENT) - .expect("UA header should be set"); - req.headers() - .get(X_AMZ_USER_AGENT) - .expect("UA header should be set"); + fn generate_a_valid_ua_with_build_env_additional_metadata() { + let mut ua = AwsUserAgent::for_tests(); + ua.build_env_additional_metadata = Some(AdditionalMetadata::new("asdf").unwrap()); + assert_eq!( + ua.aws_ua_header(), + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 md/asdf" + ); + assert_eq!( + ua.ua_header(), + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ); } } /* Appendix: User Agent ABNF -sdk-ua-header = "x-amz-user-agent:" OWS ua-string OWS -ua-pair = ua-name ["/" ua-value] -ua-name = token -ua-value = token -version = token -name = token -service-id = token -sdk-name = java / ruby / php / dotnet / python / cli / kotlin / rust / js / cpp / go / go-v2 -os-family = windows / linux / macos / android / ios / other -config = retry-mode -additional-metadata = "md/" ua-pair -sdk-metadata = "aws-sdk-" sdk-name "/" version -api-metadata = "api/" service-id "/" version -os-metadata = "os/" os-family ["/" version] -language-metadata = "lang/" language "/" version *(RWS additional-metadata) -env-metadata = "exec-env/" name -feat-metadata = "ft/" name ["/" version] *(RWS additional-metadata) -config-metadata = "cfg/" config ["/" value] -framework-metadata = "lib/" name ["/" version] *(RWS additional-metadata) -appId = "app/" name -ua-string = sdk-metadata RWS - [api-metadata RWS] - os-metadata RWS - language-metadata RWS - [env-metadata RWS] - *(feat-metadata RWS) - *(config-metadata RWS) - *(framework-metadata RWS) - [appId] +sdk-ua-header = "x-amz-user-agent:" OWS ua-string OWS +ua-pair = ua-name ["/" ua-value] +ua-name = token +ua-value = token +version = token +name = token +service-id = token +sdk-name = java / ruby / php / dotnet / python / cli / kotlin / rust / js / cpp / go / go-v2 +os-family = windows / linux / macos / android / ios / other +config = retry-mode +additional-metadata = "md/" ua-pair +sdk-metadata = "aws-sdk-" sdk-name "/" version +api-metadata = "api/" service-id "/" version +os-metadata = "os/" os-family ["/" version] +language-metadata = "lang/" language "/" version *(RWS additional-metadata) +env-metadata = "exec-env/" name +feat-metadata = "ft/" name ["/" version] *(RWS additional-metadata) +config-metadata = "cfg/" config ["/" value] +framework-metadata = "lib/" name ["/" version] *(RWS additional-metadata) +app-id = "app/" name +build-env-additional-metadata = "md/" value +ua-string = sdk-metadata RWS + [api-metadata RWS] + os-metadata RWS + language-metadata RWS + [env-metadata RWS] + *(feat-metadata RWS) + *(config-metadata RWS) + *(framework-metadata RWS) + [app-id] + [build-env-additional-metadata] # New metadata field might be added in the future and they must follow this format prefix = token diff --git a/aws/rust-runtime/aws-hyper/Cargo.toml b/aws/rust-runtime/aws-hyper/Cargo.toml index e7eb87f3ded..3e52efb0c33 100644 --- a/aws/rust-runtime/aws-hyper/Cargo.toml +++ b/aws/rust-runtime/aws-hyper/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-hyper/src/lib.rs b/aws/rust-runtime/aws-hyper/src/lib.rs index 9a037350a70..232f28ce9f6 100644 --- a/aws/rust-runtime/aws-hyper/src/lib.rs +++ b/aws/rust-runtime/aws-hyper/src/lib.rs @@ -7,4 +7,4 @@ since = "0.3.0", note = "The functionality of this crate is included in individual AWS services." )] -//! This crate has been removed. Its functionality has be merged into aws-smithy-client and individual AWS services. +//! This crate is no longer used by the AWS SDK. Its functionality has be merged into aws-smithy-runtime and individual AWS services. diff --git a/aws/rust-runtime/aws-inlineable/Cargo.toml b/aws/rust-runtime/aws-inlineable/Cargo.toml index e061a335e66..bb684af7616 100644 --- a/aws/rust-runtime/aws-inlineable/Cargo.toml +++ b/aws/rust-runtime/aws-inlineable/Cargo.toml @@ -9,43 +9,33 @@ are to allow this crate to be compilable and testable in isolation, no client co edition = "2021" license = "Apache-2.0" publish = false -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [dependencies] aws-credential-types = { path = "../aws-credential-types" } -aws-endpoint = { path = "../aws-endpoint" } aws-http = { path = "../aws-http" } aws-runtime = { path = "../aws-runtime" } aws-sigv4 = { path = "../aws-sigv4" } -aws-sig-auth = { path = "../aws-sig-auth" } +aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["rt-tokio"] } aws-smithy-checksums = { path = "../../../rust-runtime/aws-smithy-checksums" } -aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client" } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-http-tower = { path = "../../../rust-runtime/aws-smithy-http-tower" } -aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api" } -aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime" } -aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } -aws-types = { path = "../aws-types" } +aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime", features = ["client"] } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } +aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types", features = ["http-body-0-4-x"] } bytes = "1" -bytes-utils = "0.1.1" hex = "0.4.3" http = "0.2.9" http-body = "0.4.5" -md-5 = "0.10.1" -ring = "0.16" -tokio = { version = "1.23.1", features = ["full"] } -tokio-stream = "0.1.5" -tower = { version = "0.4", default-features = false } +ring = "0.17.5" +tokio = "1.23.1" tracing = "0.1" [dev-dependencies] -aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } -aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client", features = ["test-util"] } +aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http", features = ["rt-tokio"] } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["test-util"] } tempfile = "3.6.0" -tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["test-util"] } +tokio = { version = "1.23.1", features = ["macros", "rt", "io-util"] } [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-inlineable/README.md b/aws/rust-runtime/aws-inlineable/README.md index b14c2d9bfd7..14bc80dbbdb 100644 --- a/aws/rust-runtime/aws-inlineable/README.md +++ b/aws/rust-runtime/aws-inlineable/README.md @@ -5,5 +5,5 @@ SDKs. This exists to facilitate writing complex snippets of code that can be tes without needing to create and publish an entire additional crate. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-inlineable/external-types.toml b/aws/rust-runtime/aws-inlineable/external-types.toml index a261a6c437c..62904a6e4c4 100644 --- a/aws/rust-runtime/aws-inlineable/external-types.toml +++ b/aws/rust-runtime/aws-inlineable/external-types.toml @@ -1,22 +1,12 @@ allowed_external_types = [ "aws_credential_types::provider::ProvideCredentials", - "aws_endpoint::*", - "aws_http::*", - "aws_sig_auth::*", - "aws_smithy_client::*", "aws_smithy_http::*", - "aws_smithy_http_tower::*", - "aws_smithy_types::*", - "aws_types::*", + "aws_smithy_runtime_api::*", + + "http::error::Error", "http::header::map::HeaderMap", "http::header::value::HeaderValue", + "http::method::Method", "http::request::Request", - "http::error::Error", "http::uri::Uri", - "http::method::Method", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if we want to continue exposing tower_layer - "tower_layer::Layer", - "tower_layer::identity::Identity", - "tower_layer::stack::Stack", ] diff --git a/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs index 06398a325be..c7eaad04c1a 100644 --- a/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs @@ -7,7 +7,8 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use http::header::ACCEPT; use http::HeaderValue; @@ -16,10 +17,15 @@ use http::HeaderValue; #[derive(Debug, Default)] pub(crate) struct AcceptHeaderInterceptor; -impl Interceptor for AcceptHeaderInterceptor { +impl Intercept for AcceptHeaderInterceptor { + fn name(&self) -> &'static str { + "AcceptHeaderInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { context diff --git a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs index d4ffc7d1164..68a5d161698 100644 --- a/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs +++ b/aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs @@ -5,10 +5,13 @@ //! Maintain a cache of discovered endpoints +use aws_smithy_async::future::BoxFuture; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; use aws_smithy_async::time::SharedTimeSource; -use aws_smithy_client::erase::boxclone::BoxFuture; -use aws_smithy_http::endpoint::{ResolveEndpoint, ResolveEndpointError}; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::endpoint::{ + EndpointFuture, EndpointResolverParams, ResolveEndpoint, +}; use aws_smithy_types::endpoint::Endpoint; use std::fmt::{Debug, Formatter}; use std::future::Future; @@ -20,9 +23,9 @@ use tokio::sync::oneshot::{Receiver, Sender}; /// Endpoint reloader #[must_use] pub struct ReloadEndpoint { - loader: Box BoxFuture<(Endpoint, SystemTime), ResolveEndpointError> + Send + Sync>, + loader: Box BoxFuture<'static, (Endpoint, SystemTime), BoxError> + Send + Sync>, endpoint: Arc>>, - error: Arc>>, + error: Arc>>, rx: Receiver<()>, sleep: SharedAsyncSleep, time: SharedTimeSource, @@ -39,6 +42,7 @@ impl ReloadEndpoint { pub async fn reload_once(&self) { match (self.loader)().await { Ok((endpoint, expiry)) => { + tracing::debug!("caching resolved endpoint: {:?}", (&endpoint, &expiry)); *self.endpoint.lock().unwrap() = Some(ExpiringEndpoint { endpoint, expiry }) } Err(err) => *self.error.lock().unwrap() = Some(err), @@ -76,14 +80,14 @@ impl ReloadEndpoint { #[derive(Debug, Clone)] pub(crate) struct EndpointCache { - error: Arc>>, + error: Arc>>, endpoint: Arc>>, // When the sender is dropped, this allows the reload loop to stop _drop_guard: Arc>, } -impl ResolveEndpoint for EndpointCache { - fn resolve_endpoint(&self, _params: &T) -> aws_smithy_http::endpoint::Result { +impl ResolveEndpoint for EndpointCache { + fn resolve_endpoint<'a>(&'a self, _params: &'a EndpointResolverParams) -> EndpointFuture<'a> { self.resolve_endpoint() } } @@ -108,9 +112,9 @@ pub(crate) async fn create_cache( loader_fn: impl Fn() -> F + Send + Sync + 'static, sleep: SharedAsyncSleep, time: SharedTimeSource, -) -> Result<(EndpointCache, ReloadEndpoint), ResolveEndpointError> +) -> Result<(EndpointCache, ReloadEndpoint), BoxError> where - F: Future> + Send + 'static, + F: Future> + Send + 'static, { let error_holder = Arc::new(Mutex::new(None)); let endpoint_holder = Arc::new(Mutex::new(None)); @@ -128,27 +132,28 @@ where sleep, time, }; + tracing::debug!("populating initial endpoint discovery cache"); reloader.reload_once().await; // if we didn't successfully get an endpoint, bail out so the client knows // configuration failed to work - cache.resolve_endpoint()?; + cache.resolve_endpoint().await?; Ok((cache, reloader)) } impl EndpointCache { - fn resolve_endpoint(&self) -> aws_smithy_http::endpoint::Result { - self.endpoint + fn resolve_endpoint(&self) -> EndpointFuture<'_> { + tracing::trace!("resolving endpoint from endpoint discovery cache"); + let ep = self + .endpoint .lock() .unwrap() .as_ref() .map(|e| e.endpoint.clone()) .ok_or_else(|| { - self.error - .lock() - .unwrap() - .take() - .unwrap_or_else(|| ResolveEndpointError::message("no endpoint loaded")) - }) + let error: Option = self.error.lock().unwrap().take(); + error.unwrap_or_else(|| "Failed to resolve endpoint".into()) + }); + EndpointFuture::ready(ep) } } @@ -157,11 +162,11 @@ mod test { use crate::endpoint_discovery::create_cache; use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; use aws_smithy_async::test_util::controlled_time_and_sleep; - use aws_smithy_async::time::{SharedTimeSource, SystemTimeSource}; + use aws_smithy_async::time::{SharedTimeSource, SystemTimeSource, TimeSource}; use aws_smithy_types::endpoint::Endpoint; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; - use std::time::{Duration, SystemTime, UNIX_EPOCH}; + use std::time::{Duration, UNIX_EPOCH}; use tokio::time::timeout; fn check_send_v(t: T) -> T { @@ -175,7 +180,7 @@ mod test { || async { Ok(( Endpoint::builder().url("http://foo.com").build(), - SystemTime::now(), + SystemTimeSource::new().now(), )) }, SharedAsyncSleep::new(TokioSleep::new()), @@ -210,7 +215,7 @@ mod test { .await .expect("returns an endpoint"); assert_eq!( - cache.resolve_endpoint().expect("ok").url(), + cache.resolve_endpoint().await.expect("ok").url(), "http://foo.com/1" ); // 120 second buffer @@ -218,13 +223,13 @@ mod test { .reload_increment(expiry - Duration::from_secs(240)) .await; assert_eq!( - cache.resolve_endpoint().expect("ok").url(), + cache.resolve_endpoint().await.expect("ok").url(), "http://foo.com/1" ); reloader.reload_increment(expiry).await; assert_eq!( - cache.resolve_endpoint().expect("ok").url(), + cache.resolve_endpoint().await.expect("ok").url(), "http://foo.com/2" ); } @@ -261,18 +266,27 @@ mod test { gate.expect_sleep().await.duration(), Duration::from_secs(60) ); - assert_eq!(cache.resolve_endpoint().unwrap().url(), "http://foo.com/1"); + assert_eq!( + cache.resolve_endpoint().await.unwrap().url(), + "http://foo.com/1" + ); // t = 60 let sleep = gate.expect_sleep().await; // we're still holding the drop guard, so we haven't expired yet. - assert_eq!(cache.resolve_endpoint().unwrap().url(), "http://foo.com/1"); + assert_eq!( + cache.resolve_endpoint().await.unwrap().url(), + "http://foo.com/1" + ); assert_eq!(sleep.duration(), Duration::from_secs(60)); sleep.allow_progress(); // t = 120 let sleep = gate.expect_sleep().await; - assert_eq!(cache.resolve_endpoint().unwrap().url(), "http://foo.com/2"); + assert_eq!( + cache.resolve_endpoint().await.unwrap().url(), + "http://foo.com/2" + ); sleep.allow_progress(); let sleep = gate.expect_sleep().await; diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs b/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs deleted file mode 100644 index 18f1d9219eb..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/glacier_checksums.rs +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file when cleaning up middleware - -use aws_sig_auth::signer::SignableBody; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::byte_stream::{self, ByteStream}; -use aws_smithy_http::operation::Request; - -use bytes::Buf; -use bytes_utils::SegmentedBuf; -use http::header::HeaderName; -use ring::digest::{Context, Digest, SHA256}; -use tokio_stream::StreamExt; - -const TREE_HASH_HEADER: &str = "x-amz-sha256-tree-hash"; -const X_AMZ_CONTENT_SHA256: &str = "x-amz-content-sha256"; - -/// Adds a glacier tree hash checksum to the HTTP Request -/// -/// This handles two cases: -/// 1. A body which is retryable: the body will be streamed through a digest calculator, limiting memory usage. -/// 2. A body which is not retryable: the body will be converted into `Bytes`, then streamed through a digest calculator. -/// -/// The actual checksum algorithm will first compute a SHA256 checksum for each 1MB chunk. Then, a tree -/// will be assembled, recursively pairing neighboring chunks and computing their combined checksum. The 1 leftover -/// chunk (if it exists) is paired at the end. -/// -/// See for more information. -pub async fn add_checksum_treehash(request: &mut Request) -> Result<(), byte_stream::error::Error> { - let cloneable = request.http().body().try_clone(); - let http_request = request.http_mut(); - let body_to_process = if let Some(cloned_body) = cloneable { - // we can stream the body - cloned_body - } else { - let body = std::mem::replace(http_request.body_mut(), SdkBody::taken()); - let loaded_body = ByteStream::new(body).collect().await?.into_bytes(); - *http_request.body_mut() = SdkBody::from(loaded_body.clone()); - SdkBody::from(loaded_body) - }; - let (full_body, hashes) = compute_hashes(body_to_process, MEGABYTE).await?; - let tree_hash = hex::encode(compute_hash_tree(hashes)); - let complete_hash = hex::encode(full_body); - if !http_request.headers().contains_key(TREE_HASH_HEADER) { - http_request.headers_mut().insert( - HeaderName::from_static(TREE_HASH_HEADER), - tree_hash.parse().expect("hash must be valid header"), - ); - } - if !http_request.headers().contains_key(X_AMZ_CONTENT_SHA256) { - http_request.headers_mut().insert( - HeaderName::from_static(X_AMZ_CONTENT_SHA256), - complete_hash.parse().expect("hash must be valid header"), - ); - } - // if we end up hitting the signer later, no need to recompute the checksum - request - .properties_mut() - .insert(SignableBody::Precomputed(complete_hash)); - // for convenience & protocol tests, write it in directly here as well - Ok(()) -} - -const MEGABYTE: usize = 1024 * 1024; -async fn compute_hashes( - body: SdkBody, - chunk_size: usize, -) -> Result<(Digest, Vec), byte_stream::error::Error> { - let mut hashes = vec![]; - let mut remaining_in_chunk = chunk_size; - let mut body = ByteStream::new(body); - let mut local = Context::new(&SHA256); - let mut full_body = Context::new(&SHA256); - let mut segmented = SegmentedBuf::new(); - while let Some(data) = body.try_next().await? { - segmented.push(data); - while segmented.has_remaining() { - let next = segmented.chunk(); - let len = next.len().min(remaining_in_chunk); - local.update(&next[..len]); - full_body.update(&next[..len]); - segmented.advance(len); - remaining_in_chunk -= len; - if remaining_in_chunk == 0 { - hashes.push(local.finish()); - local = Context::new(&SHA256); - remaining_in_chunk = chunk_size; - } - } - } - if remaining_in_chunk != chunk_size || hashes.is_empty() { - hashes.push(local.finish()); - } - Ok((full_body.finish(), hashes)) -} - -/// Compute the glacier tree hash for a vector of hashes. -/// -/// Adjacent hashes are combined into a single hash. This process occurs recursively until only 1 hash remains. -/// -/// See for more information. -fn compute_hash_tree(mut hashes: Vec) -> Digest { - assert!( - !hashes.is_empty(), - "even an empty file will produce a digest. this function assumes that hashes is non-empty" - ); - while hashes.len() > 1 { - let next = hashes.chunks(2).map(|chunk| match *chunk { - [left, right] => { - let mut ctx = Context::new(&SHA256); - ctx.update(left.as_ref()); - ctx.update(right.as_ref()); - ctx.finish() - } - [last] => last, - _ => unreachable!(), - }); - hashes = next.collect(); - } - hashes[0] -} - -#[cfg(test)] -mod test { - use crate::glacier_checksums::{ - add_checksum_treehash, compute_hash_tree, compute_hashes, MEGABYTE, TREE_HASH_HEADER, - }; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; - use aws_smithy_http::operation::Request; - - #[tokio::test] - async fn compute_digests() { - { - let body = SdkBody::from("1234"); - let hashes = compute_hashes(body, 1).await.expect("succeeds").1; - assert_eq!(hashes.len(), 4); - } - { - let body = SdkBody::from("1234"); - let hashes = compute_hashes(body, 2).await.expect("succeeds").1; - assert_eq!(hashes.len(), 2); - } - { - let body = SdkBody::from("12345"); - let hashes = compute_hashes(body, 3).await.expect("succeeds").1; - assert_eq!(hashes.len(), 2); - } - { - let body = SdkBody::from("11221122"); - let hashes = compute_hashes(body, 2).await.expect("succeeds").1; - assert_eq!(hashes[0].as_ref(), hashes[2].as_ref()); - } - } - - #[tokio::test] - async fn empty_body_computes_digest() { - let body = SdkBody::from(""); - let (_, hashes) = compute_hashes(body, 2).await.expect("succeeds"); - assert_eq!(hashes.len(), 1); - } - - #[tokio::test] - async fn compute_tree_digest() { - macro_rules! hash { - ($($inp:expr),*) => { - { - let mut ctx = ring::digest::Context::new(&ring::digest::SHA256); - $( - ctx.update($inp.as_ref()); - )* - ctx.finish() - } - } - } - let body = SdkBody::from("1234567891011"); - let (complete, hashes) = compute_hashes(body, 3).await.expect("succeeds"); - assert_eq!(hashes.len(), 5); - assert_eq!(complete.as_ref(), hash!("1234567891011").as_ref()); - let final_digest = compute_hash_tree(hashes); - let expected_digest = hash!( - hash!( - hash!(hash!("123"), hash!("456")), - hash!(hash!("789"), hash!("101")) - ), - hash!("1") - ); - assert_eq!(expected_digest.as_ref(), final_digest.as_ref()); - } - - #[tokio::test] - async fn integration_test() { - // the test data consists of an 11 byte sequence, repeated. Since the sequence length is - // relatively prime with 1 megabyte, we can ensure that chunks will all have different hashes. - let base_seq = b"01245678912"; - let total_size = MEGABYTE * 101 + 500; - let mut test_data = vec![]; - while test_data.len() < total_size { - test_data.extend_from_slice(base_seq) - } - let target = tempfile::NamedTempFile::new().unwrap(); - tokio::fs::write(target.path(), test_data).await.unwrap(); - let body = ByteStream::from_path(target.path()) - .await - .expect("should be valid") - .into_inner(); - - let mut http_req = Request::new( - http::Request::builder() - .uri("http://example.com/hello") - .body(body) - .unwrap(), - ); - - add_checksum_treehash(&mut http_req) - .await - .expect("should succeed"); - // hash value verified with AWS CLI - assert_eq!( - http_req.http().headers().get(TREE_HASH_HEADER).unwrap(), - "3d417484359fc9f5a3bafd576dc47b8b2de2bf2d4fdac5aa2aff768f2210d386" - ); - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs index 18bf422f49d..845b2ef21fe 100644 --- a/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs @@ -6,24 +6,24 @@ // This code is referenced in generated code, so the compiler doesn't realize it is used. #![allow(dead_code)] -use aws_runtime::auth::sigv4::SigV4OperationSigningConfig; +use std::fmt; +use std::marker::PhantomData; + +use bytes::Bytes; +use http::header::HeaderValue; +use ring::digest::{Context, Digest, SHA256}; + +use aws_runtime::auth::SigV4OperationSigningConfig; use aws_sigv4::http_request::SignableBody; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::byte_stream; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; -use aws_smithy_runtime_api::client::interceptors::Interceptor; -use aws_smithy_runtime_api::client::orchestrator::LoadedRequestBody; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, LoadedRequestBody}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::byte_stream; use aws_smithy_types::config_bag::ConfigBag; -use bytes::Bytes; -use http::header::{HeaderName, HeaderValue}; -use http::Request; -use ring::digest::{Context, Digest, SHA256}; -use std::fmt; -use std::marker::PhantomData; /// The default account ID when none is set on an input const DEFAULT_ACCOUNT_ID: &str = "-"; @@ -65,12 +65,17 @@ impl GlacierAccountIdAutofillInterceptor { } } -impl Interceptor +impl Intercept for GlacierAccountIdAutofillInterceptor { + fn name(&self) -> &'static str { + "GlacierAccountIdAutofillInterceptor" + } + fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let erased_input = context.input_mut(); @@ -95,10 +100,15 @@ impl GlacierApiVersionInterceptor { } } -impl Interceptor for GlacierApiVersionInterceptor { +impl Intercept for GlacierApiVersionInterceptor { + fn name(&self) -> &'static str { + "GlacierApiVersionInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { context.request_mut().headers_mut().insert( @@ -113,22 +123,28 @@ impl Interceptor for GlacierApiVersionInterceptor { #[derive(Debug, Default)] pub(crate) struct GlacierTreeHashHeaderInterceptor; -impl Interceptor for GlacierTreeHashHeaderInterceptor { +impl Intercept for GlacierTreeHashHeaderInterceptor { + fn name(&self) -> &'static str { + "GlacierTreeHashHeaderInterceptor" + } + fn modify_before_serialization( &self, _context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { // Request the request body to be loaded into memory immediately after serialization // so that it can be checksummed before signing and transmit cfg.interceptor_state() - .set_loaded_request_body(LoadedRequestBody::Requested); + .store_put(LoadedRequestBody::Requested); Ok(()) } fn modify_before_retry_loop( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let maybe_loaded_body = cfg.load::(); @@ -166,23 +182,19 @@ impl Interceptor for GlacierTreeHashHeaderInterceptor { /// /// See for more information. fn add_checksum_treehash( - request: &mut Request, + request: &mut HttpRequest, body: &Bytes, ) -> Result { let (full_body, hashes) = compute_hashes(body, MEGABYTE)?; let tree_hash = hex::encode(compute_hash_tree(hashes)); let complete_hash = hex::encode(full_body); if !request.headers().contains_key(TREE_HASH_HEADER) { - request.headers_mut().insert( - HeaderName::from_static(TREE_HASH_HEADER), - tree_hash.parse().expect("hash must be valid header"), - ); + request.headers_mut().insert(TREE_HASH_HEADER, tree_hash); } if !request.headers().contains_key(X_AMZ_CONTENT_SHA256) { - request.headers_mut().insert( - HeaderName::from_static(X_AMZ_CONTENT_SHA256), - complete_hash.parse().expect("hash must be valid header"), - ); + request + .headers_mut() + .insert(X_AMZ_CONTENT_SHA256, complete_hash.clone()); } Ok(complete_hash) } @@ -235,9 +247,10 @@ fn compute_hash_tree(mut hashes: Vec) -> Digest { #[cfg(test)] mod account_id_autofill_tests { + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use super::*; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_types::type_erasure::TypedBox; #[test] fn autofill_account_id() { @@ -251,13 +264,13 @@ mod account_id_autofill_tests { } } + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut cfg = ConfigBag::base(); - let mut context = - InterceptorContext::new(TypedBox::new(SomeInput { account_id: None }).erase()); + let mut context = InterceptorContext::new(Input::erase(SomeInput { account_id: None })); let mut context = BeforeSerializationInterceptorContextMut::from(&mut context); let interceptor = GlacierAccountIdAutofillInterceptor::::new(); interceptor - .modify_before_serialization(&mut context, &mut cfg) + .modify_before_serialization(&mut context, &rc, &mut cfg) .expect("success"); assert_eq!( DEFAULT_ACCOUNT_ID, @@ -274,20 +287,22 @@ mod account_id_autofill_tests { #[cfg(test)] mod api_version_tests { + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use super::*; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_types::type_erasure::TypedBox; #[test] fn api_version_interceptor() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut cfg = ConfigBag::base(); - let mut context = InterceptorContext::new(TypedBox::new("dontcare").erase()); - context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + let mut context = InterceptorContext::new(Input::doesnt_matter()); + context.set_request(HttpRequest::empty()); let mut context = BeforeTransmitInterceptorContextMut::from(&mut context); let interceptor = GlacierApiVersionInterceptor::new("some-version"); interceptor - .modify_before_signing(&mut context, &mut cfg) + .modify_before_signing(&mut context, &rc, &mut cfg) .expect("success"); assert_eq!( @@ -376,10 +391,7 @@ mod treehash_checksum_tests { } let test_data = Bytes::from(test_data); - let mut http_req = http::Request::builder() - .uri("http://example.com/hello") - .body(SdkBody::taken()) // the body isn't used by add_checksum_treehash - .unwrap(); + let mut http_req = HttpRequest::empty(); add_checksum_treehash(&mut http_req, &test_data).expect("should succeed"); // hash value verified with AWS CLI diff --git a/aws/rust-runtime/aws-inlineable/src/http_body_checksum_middleware.rs b/aws/rust-runtime/aws-inlineable/src/http_body_checksum_middleware.rs deleted file mode 100644 index f71e8708e8f..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/http_body_checksum_middleware.rs +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Functions for modifying requests and responses for the purposes of checksum validation - -use aws_smithy_http::operation::error::BuildError; - -/// Errors related to constructing checksum-validated HTTP requests -#[derive(Debug)] -#[allow(dead_code)] -pub(crate) enum Error { - /// Only request bodies with a known size can be checksum validated - UnsizedRequestBody, - ChecksumHeadersAreUnsupportedForStreamingBody, -} - -impl std::fmt::Display for Error { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::UnsizedRequestBody => write!( - f, - "Only request bodies with a known size can be checksum validated." - ), - Self::ChecksumHeadersAreUnsupportedForStreamingBody => write!( - f, - "Checksum header insertion is only supported for non-streaming HTTP bodies. \ - To checksum validate a streaming body, the checksums must be sent as trailers." - ), - } - } -} - -impl std::error::Error for Error {} - -/// Given a `&mut http::request::Request` and a `aws_smithy_checksums::ChecksumAlgorithm`, -/// calculate a checksum and modify the request to include the checksum as a header -/// (for in-memory request bodies) or a trailer (for streaming request bodies.) Streaming bodies -/// must be sized or this will return an error. -#[allow(dead_code)] -pub(crate) fn add_checksum_calculation_to_request( - request: &mut http::request::Request, - property_bag: &mut aws_smithy_http::property_bag::PropertyBag, - checksum_algorithm: aws_smithy_checksums::ChecksumAlgorithm, -) -> Result<(), BuildError> { - match request.body().bytes() { - // Body is in-memory: read it and insert the checksum as a header. - Some(data) => { - let mut checksum = checksum_algorithm.into_impl(); - checksum.update(data); - - request - .headers_mut() - .insert(checksum.header_name(), checksum.header_value()); - } - // Body is streaming: wrap the body so it will emit a checksum as a trailer. - None => { - wrap_streaming_request_body_in_checksum_calculating_body( - request, - property_bag, - checksum_algorithm, - )?; - } - } - - Ok(()) -} - -#[allow(dead_code)] -fn wrap_streaming_request_body_in_checksum_calculating_body( - request: &mut http::request::Request, - property_bag: &mut aws_smithy_http::property_bag::PropertyBag, - checksum_algorithm: aws_smithy_checksums::ChecksumAlgorithm, -) -> Result<(), BuildError> { - use aws_http::content_encoding::{AwsChunkedBody, AwsChunkedBodyOptions}; - use aws_smithy_checksums::{body::calculate, http::HttpChecksum}; - use http_body::Body; - - let original_body_size = request - .body() - .size_hint() - .exact() - .ok_or_else(|| BuildError::other(Error::UnsizedRequestBody))?; - - // Streaming request bodies with trailers require special signing - property_bag.insert(aws_sig_auth::signer::SignableBody::StreamingUnsignedPayloadTrailer); - - let mut body = { - let body = std::mem::replace(request.body_mut(), aws_smithy_http::body::SdkBody::taken()); - - body.map(move |body| { - let checksum = checksum_algorithm.into_impl(); - let trailer_len = HttpChecksum::size(checksum.as_ref()); - let body = calculate::ChecksumBody::new(body, checksum); - let aws_chunked_body_options = - AwsChunkedBodyOptions::new(original_body_size, vec![trailer_len]); - - let body = AwsChunkedBody::new(body, aws_chunked_body_options); - - aws_smithy_http::body::SdkBody::from_dyn(aws_smithy_http::body::BoxBody::new(body)) - }) - }; - - let encoded_content_length = body - .size_hint() - .exact() - .ok_or_else(|| BuildError::other(Error::UnsizedRequestBody))?; - - let headers = request.headers_mut(); - - headers.insert( - http::header::HeaderName::from_static("x-amz-trailer"), - // Convert into a `HeaderName` and then into a `HeaderValue` - http::header::HeaderName::from(checksum_algorithm).into(), - ); - - headers.insert( - http::header::CONTENT_LENGTH, - http::HeaderValue::from(encoded_content_length), - ); - headers.insert( - http::header::HeaderName::from_static("x-amz-decoded-content-length"), - http::HeaderValue::from(original_body_size), - ); - headers.insert( - http::header::CONTENT_ENCODING, - http::HeaderValue::from_str(aws_http::content_encoding::header_value::AWS_CHUNKED) - .map_err(BuildError::other) - .expect("\"aws-chunked\" will always be a valid HeaderValue"), - ); - - std::mem::swap(request.body_mut(), &mut body); - - Ok(()) -} - -/// Given an `SdkBody`, a `aws_smithy_checksums::ChecksumAlgorithm`, and a pre-calculated checksum, -/// return an `SdkBody` where the body will processed with the checksum algorithm and checked -/// against the pre-calculated checksum. -#[allow(dead_code)] -pub(crate) fn wrap_body_with_checksum_validator( - body: aws_smithy_http::body::SdkBody, - checksum_algorithm: aws_smithy_checksums::ChecksumAlgorithm, - precalculated_checksum: bytes::Bytes, -) -> aws_smithy_http::body::SdkBody { - use aws_smithy_checksums::body::validate; - use aws_smithy_http::body::{BoxBody, SdkBody}; - - body.map(move |body| { - SdkBody::from_dyn(BoxBody::new(validate::ChecksumBody::new( - body, - checksum_algorithm.into_impl(), - precalculated_checksum.clone(), - ))) - }) -} - -/// Given a `HeaderMap`, extract any checksum included in the headers as `Some(Bytes)`. -/// If no checksum header is set, return `None`. If multiple checksum headers are set, the one that -/// is fastest to compute will be chosen. -#[allow(dead_code)] -pub(crate) fn check_headers_for_precalculated_checksum( - headers: &http::HeaderMap, - response_algorithms: &[&str], -) -> Option<(aws_smithy_checksums::ChecksumAlgorithm, bytes::Bytes)> { - let checksum_algorithms_to_check = - aws_smithy_checksums::http::CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER - .into_iter() - // Process list of algorithms, from fastest to slowest, that may have been used to checksum - // the response body, ignoring any that aren't marked as supported algorithms by the model. - .flat_map(|algo| { - // For loop is necessary b/c the compiler doesn't infer the correct lifetimes for iter().find() - for res_algo in response_algorithms { - if algo.eq_ignore_ascii_case(res_algo) { - return Some(algo); - } - } - - None - }); - - for checksum_algorithm in checksum_algorithms_to_check { - let checksum_algorithm: aws_smithy_checksums::ChecksumAlgorithm = checksum_algorithm.parse().expect( - "CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER only contains valid checksum algorithm names", - ); - if let Some(precalculated_checksum) = - headers.get(http::HeaderName::from(checksum_algorithm)) - { - let base64_encoded_precalculated_checksum = precalculated_checksum - .to_str() - .expect("base64 uses ASCII characters"); - - // S3 needs special handling for checksums of objects uploaded with `MultiPartUpload`. - if is_part_level_checksum(base64_encoded_precalculated_checksum) { - tracing::warn!( - more_info = "See https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums for more information.", - "This checksum is a part-level checksum which can't be validated by the Rust SDK. Disable checksum validation for this request to fix this warning.", - ); - - return None; - } - - let precalculated_checksum = match aws_smithy_types::base64::decode( - base64_encoded_precalculated_checksum, - ) { - Ok(decoded_checksum) => decoded_checksum.into(), - Err(_) => { - tracing::error!("Checksum received from server could not be base64 decoded. No checksum validation will be performed."); - return None; - } - }; - - return Some((checksum_algorithm, precalculated_checksum)); - } - } - - None -} - -fn is_part_level_checksum(checksum: &str) -> bool { - let mut found_number = false; - let mut found_dash = false; - - for ch in checksum.chars().rev() { - // this could be bad - if ch.is_ascii_digit() { - found_number = true; - continue; - } - - // Yup, it's a part-level checksum - if ch == '-' { - if found_dash { - // Found a second dash?? This isn't a part-level checksum. - return false; - } - - found_dash = true; - continue; - } - - break; - } - - found_number && found_dash -} - -#[cfg(test)] -mod tests { - use super::{is_part_level_checksum, wrap_body_with_checksum_validator}; - use aws_smithy_checksums::ChecksumAlgorithm; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; - use aws_smithy_types::error::display::DisplayErrorContext; - use bytes::{Bytes, BytesMut}; - use http_body::Body; - use std::sync::Once; - use tempfile::NamedTempFile; - - static INIT_LOGGER: Once = Once::new(); - fn init_logger() { - INIT_LOGGER.call_once(|| { - tracing_subscriber::fmt::init(); - }); - } - - #[tokio::test] - async fn test_checksum_body_is_retryable() { - let input_text = "Hello world"; - let precalculated_checksum = Bytes::from_static(&[0x8b, 0xd6, 0x9e, 0x52]); - let body = SdkBody::retryable(move || SdkBody::from(input_text)); - - // ensure original SdkBody is retryable - assert!(body.try_clone().is_some()); - - let body = body.map(move |sdk_body| { - let checksum_algorithm: ChecksumAlgorithm = "crc32".parse().unwrap(); - wrap_body_with_checksum_validator( - sdk_body, - checksum_algorithm, - precalculated_checksum.clone(), - ) - }); - - // ensure wrapped SdkBody is retryable - let mut body = body.try_clone().expect("body is retryable"); - - let mut validated_body = BytesMut::new(); - - loop { - match body.data().await { - Some(Ok(data)) => validated_body.extend_from_slice(&data), - Some(Err(err)) => panic!("{}", err), - None => { - break; - } - } - } - - let body = std::str::from_utf8(&validated_body).unwrap(); - - // ensure that the wrapped body passes checksum validation - assert_eq!(input_text, body); - } - - #[tokio::test] - async fn test_checksum_body_from_file_is_retryable() { - use std::io::Write; - let mut file = NamedTempFile::new().unwrap(); - let checksum_algorithm: ChecksumAlgorithm = "crc32c".parse().unwrap(); - let mut crc32c_checksum = checksum_algorithm.into_impl(); - - for i in 0..10000 { - let line = format!("This is a large file created for testing purposes {}", i); - file.as_file_mut().write_all(line.as_bytes()).unwrap(); - crc32c_checksum.update(line.as_bytes()); - } - - let body = ByteStream::read_from() - .path(&file) - .buffer_size(1024) - .build() - .await - .unwrap(); - - let precalculated_checksum = crc32c_checksum.finalize(); - let expected_checksum = precalculated_checksum.clone(); - - let body = body.map(move |sdk_body| { - wrap_body_with_checksum_validator( - sdk_body, - checksum_algorithm, - precalculated_checksum.clone(), - ) - }); - - // ensure wrapped SdkBody is retryable - let mut body = body.into_inner().try_clone().expect("body is retryable"); - - let mut validated_body = BytesMut::new(); - - // If this loop completes, then it means the body's checksum was valid, but let's calculate - // a checksum again just in case. - let mut redundant_crc32c_checksum = checksum_algorithm.into_impl(); - loop { - match body.data().await { - Some(Ok(data)) => { - redundant_crc32c_checksum.update(&data); - validated_body.extend_from_slice(&data); - } - Some(Err(err)) => panic!("{}", err), - None => { - break; - } - } - } - - let actual_checksum = redundant_crc32c_checksum.finalize(); - assert_eq!(expected_checksum, actual_checksum); - - // Ensure the file's checksum isn't the same as an empty checksum. This way, we'll know that - // data was actually processed. - let unexpected_checksum = checksum_algorithm.into_impl().finalize(); - assert_ne!(unexpected_checksum, actual_checksum); - } - - #[tokio::test] - async fn test_build_checksum_validated_body_works() { - init_logger(); - - let checksum_algorithm = "crc32".parse().unwrap(); - let input_text = "Hello world"; - let precalculated_checksum = Bytes::from_static(&[0x8b, 0xd6, 0x9e, 0x52]); - let body = ByteStream::new(SdkBody::from(input_text)); - - let body = body.map(move |sdk_body| { - wrap_body_with_checksum_validator( - sdk_body, - checksum_algorithm, - precalculated_checksum.clone(), - ) - }); - - let mut validated_body = Vec::new(); - if let Err(e) = tokio::io::copy(&mut body.into_async_read(), &mut validated_body).await { - tracing::error!("{}", DisplayErrorContext(&e)); - panic!("checksum validation has failed"); - }; - let body = std::str::from_utf8(&validated_body).unwrap(); - - assert_eq!(input_text, body); - } - - #[test] - fn test_is_multipart_object_checksum() { - // These ARE NOT part-level checksums - assert!(!is_part_level_checksum("abcd")); - assert!(!is_part_level_checksum("abcd=")); - assert!(!is_part_level_checksum("abcd==")); - assert!(!is_part_level_checksum("1234")); - assert!(!is_part_level_checksum("1234=")); - assert!(!is_part_level_checksum("1234==")); - // These ARE part-level checksums - assert!(is_part_level_checksum("abcd-1")); - assert!(is_part_level_checksum("abcd=-12")); - assert!(is_part_level_checksum("abcd12-134")); - assert!(is_part_level_checksum("abcd==-10000")); - // These are gibberish and shouldn't be regarded as a part-level checksum - assert!(!is_part_level_checksum("")); - assert!(!is_part_level_checksum("Spaces? In my header values?")); - assert!(!is_part_level_checksum("abcd==-134!#{!#")); - assert!(!is_part_level_checksum("abcd==-")); - assert!(!is_part_level_checksum("abcd==--11")); - assert!(!is_part_level_checksum("abcd==-AA")); - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs index e438032bdc5..ef07f2c34bb 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs @@ -8,18 +8,20 @@ //! Interceptor for handling Smithy `@httpChecksum` request checksumming with AWS SigV4 use aws_http::content_encoding::{AwsChunkedBody, AwsChunkedBodyOptions}; -use aws_runtime::auth::sigv4::SigV4OperationSigningConfig; +use aws_runtime::auth::SigV4OperationSigningConfig; use aws_sigv4::http_request::SignableBody; use aws_smithy_checksums::ChecksumAlgorithm; use aws_smithy_checksums::{body::calculate, http::HttpChecksum}; -use aws_smithy_http::body::{BoxBody, SdkBody}; -use aws_smithy_http::operation::error::BuildError; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, Input, }; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; +use aws_smithy_types::error::operation::BuildError; use http::HeaderValue; use http_body::Body; use std::{fmt, mem}; @@ -74,13 +76,18 @@ impl RequestChecksumInterceptor { } } -impl Interceptor for RequestChecksumInterceptor +impl Intercept for RequestChecksumInterceptor where - AP: Fn(&Input) -> Result, BoxError>, + AP: Fn(&Input) -> Result, BoxError> + Send + Sync, { + fn name(&self) -> &'static str { + "RequestChecksumInterceptor" + } + fn read_before_serialization( &self, context: &BeforeSerializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let checksum_algorithm = (self.algorithm_provider)(context.input())?; @@ -98,6 +105,7 @@ where fn modify_before_retry_loop( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let state = cfg @@ -114,7 +122,7 @@ where } fn add_checksum_for_request_body( - request: &mut http::request::Request, + request: &mut HttpRequest, checksum_algorithm: ChecksumAlgorithm, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { @@ -144,7 +152,7 @@ fn add_checksum_for_request_body( } fn wrap_streaming_request_body_in_checksum_calculating_body( - request: &mut http::request::Request, + request: &mut HttpRequest, checksum_algorithm: ChecksumAlgorithm, ) -> Result<(), BuildError> { let original_body_size = request @@ -165,7 +173,7 @@ fn wrap_streaming_request_body_in_checksum_calculating_body( let body = AwsChunkedBody::new(body, aws_chunked_body_options); - SdkBody::from_dyn(BoxBody::new(body)) + SdkBody::from_body_0_4(body) }) }; @@ -178,8 +186,7 @@ fn wrap_streaming_request_body_in_checksum_calculating_body( headers.insert( http::header::HeaderName::from_static("x-amz-trailer"), - // Convert into a `HeaderName` and then into a `HeaderValue` - http::header::HeaderName::from(checksum_algorithm).into(), + checksum_algorithm.into_impl().header_name(), ); headers.insert( @@ -206,9 +213,10 @@ fn wrap_streaming_request_body_in_checksum_calculating_body( mod tests { use crate::http_request_checksum::wrap_streaming_request_body_in_checksum_calculating_body; use aws_smithy_checksums::ChecksumAlgorithm; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_types::base64; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::byte_stream::ByteStream; use bytes::BytesMut; use http_body::Body; use tempfile::NamedTempFile; @@ -217,8 +225,10 @@ mod tests { async fn test_checksum_body_is_retryable() { let input_text = "Hello world"; let chunk_len_hex = format!("{:X}", input_text.len()); - let mut request = http::Request::builder() + let mut request: HttpRequest = http::Request::builder() .body(SdkBody::retryable(move || SdkBody::from(input_text))) + .unwrap() + .try_into() .unwrap(); // ensure original SdkBody is retryable @@ -232,11 +242,8 @@ mod tests { let mut body = request.body().try_clone().expect("body is retryable"); let mut body_data = BytesMut::new(); - loop { - match body.data().await { - Some(data) => body_data.extend_from_slice(&data.unwrap()), - None => break, - } + while let Some(data) = body.data().await { + body_data.extend_from_slice(&data.unwrap()) } let body = std::str::from_utf8(&body_data).unwrap(); assert_eq!( @@ -261,17 +268,15 @@ mod tests { } let crc32c_checksum = crc32c_checksum.finalize(); - let mut request = http::Request::builder() - .body( - ByteStream::read_from() - .path(&file) - .buffer_size(1024) - .build() - .await - .unwrap() - .into_inner(), - ) - .unwrap(); + let mut request = HttpRequest::new( + ByteStream::read_from() + .path(&file) + .buffer_size(1024) + .build() + .await + .unwrap() + .into_inner(), + ); // ensure original SdkBody is retryable assert!(request.body().try_clone().is_some()); @@ -283,11 +288,8 @@ mod tests { let mut body = request.body().try_clone().expect("body is retryable"); let mut body_data = BytesMut::new(); - loop { - match body.data().await { - Some(data) => body_data.extend_from_slice(&data.unwrap()), - None => break, - } + while let Some(data) = body.data().await { + body_data.extend_from_slice(&data.unwrap()) } let body = std::str::from_utf8(&body_data).unwrap(); let expected_checksum = base64::encode(&crc32c_checksum); diff --git a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs index 4f3f9dfea5a..1236c9fe500 100644 --- a/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs +++ b/aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs @@ -8,14 +8,15 @@ //! Interceptor for handling Smithy `@httpChecksum` response checksumming use aws_smithy_checksums::ChecksumAlgorithm; -use aws_smithy_http::body::{BoxBody, SdkBody}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeDeserializationInterceptorContextMut, BeforeSerializationInterceptorContextRef, Input, }; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::http::Headers; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; -use http::HeaderValue; use std::{fmt, mem}; #[derive(Debug)] @@ -51,13 +52,18 @@ impl ResponseChecksumInterceptor { } } -impl Interceptor for ResponseChecksumInterceptor +impl Intercept for ResponseChecksumInterceptor where - VE: Fn(&Input) -> bool, + VE: Fn(&Input) -> bool + Send + Sync, { + fn name(&self) -> &'static str { + "ResponseChecksumInterceptor" + } + fn read_before_serialization( &self, context: &BeforeSerializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let validation_enabled = (self.validation_enabled)(context.input()); @@ -72,6 +78,7 @@ where fn modify_before_deserialization( &self, context: &mut BeforeDeserializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let state = cfg @@ -112,11 +119,11 @@ pub(crate) fn wrap_body_with_checksum_validator( use aws_smithy_checksums::body::validate; body.map(move |body| { - SdkBody::from_dyn(BoxBody::new(validate::ChecksumBody::new( + SdkBody::from_body_0_4(validate::ChecksumBody::new( body, checksum_algorithm.into_impl(), precalculated_checksum.clone(), - ))) + )) }) } @@ -124,7 +131,7 @@ pub(crate) fn wrap_body_with_checksum_validator( /// If no checksum header is set, return `None`. If multiple checksum headers are set, the one that /// is fastest to compute will be chosen. pub(crate) fn check_headers_for_precalculated_checksum( - headers: &http::HeaderMap, + headers: &Headers, response_algorithms: &[&str], ) -> Option<(ChecksumAlgorithm, bytes::Bytes)> { let checksum_algorithms_to_check = @@ -147,13 +154,9 @@ pub(crate) fn check_headers_for_precalculated_checksum( let checksum_algorithm: ChecksumAlgorithm = checksum_algorithm.parse().expect( "CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER only contains valid checksum algorithm names", ); - if let Some(precalculated_checksum) = - headers.get(http::HeaderName::from(checksum_algorithm)) + if let Some(base64_encoded_precalculated_checksum) = + headers.get(checksum_algorithm.into_impl().header_name()) { - let base64_encoded_precalculated_checksum = precalculated_checksum - .to_str() - .expect("base64 uses ASCII characters"); - // S3 needs special handling for checksums of objects uploaded with `MultiPartUpload`. if is_part_level_checksum(base64_encoded_precalculated_checksum) { tracing::warn!( @@ -212,8 +215,8 @@ fn is_part_level_checksum(checksum: &str) -> bool { #[cfg(test)] mod tests { use super::{is_part_level_checksum, wrap_body_with_checksum_validator}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::byte_stream::ByteStream; use aws_smithy_types::error::display::DisplayErrorContext; use bytes::Bytes; diff --git a/aws/rust-runtime/aws-inlineable/src/lib.rs b/aws/rust-runtime/aws-inlineable/src/lib.rs index 8cc771b9f6a..3ff04ff755c 100644 --- a/aws/rust-runtime/aws-inlineable/src/lib.rs +++ b/aws/rust-runtime/aws-inlineable/src/lib.rs @@ -22,43 +22,25 @@ /// Interceptors for API Gateway pub mod apigateway_interceptors; -/// Stub credentials provider for use when no credentials provider is used. -pub mod no_credentials; - /// Support types required for adding presigning to an operation in a generated service. pub mod presigning; -/// Presigning tower service -pub mod presigning_service; - /// Presigning interceptors pub mod presigning_interceptors; /// Special logic for extracting request IDs from S3's responses. +#[allow(dead_code)] pub mod s3_request_id; -/// Glacier-specific checksumming behavior -pub mod glacier_checksums; - /// Glacier-specific behavior pub mod glacier_interceptors; -/// Default middleware stack for AWS services -pub mod middleware; - -/// Strip prefixes from IDs returned by Route53 operations when those IDs are used to construct requests -pub mod route53_resource_id_preprocessor_middleware; - /// Strip prefixes from IDs returned by Route53 operations when those IDs are used to construct requests pub mod route53_resource_id_preprocessor; pub mod http_request_checksum; pub mod http_response_checksum; -// TODO(enableNewSmithyRuntimeCleanup): Delete this module -/// Convert a streaming `SdkBody` into an aws-chunked streaming body with checksum trailers -pub mod http_body_checksum_middleware; - #[allow(dead_code)] pub mod endpoint_discovery; diff --git a/aws/rust-runtime/aws-inlineable/src/middleware.rs b/aws/rust-runtime/aws-inlineable/src/middleware.rs deleted file mode 100644 index ec66bbbb447..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/middleware.rs +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Base Middleware Stack - -use aws_endpoint::AwsAuthStage; -use aws_http::auth::CredentialsStage; -use aws_http::recursion_detection::RecursionDetectionStage; -use aws_http::user_agent::UserAgentStage; -use aws_sig_auth::middleware::SigV4SigningStage; -use aws_sig_auth::signer::SigV4Signer; -use aws_smithy_http::endpoint::middleware::SmithyEndpointStage; -use aws_smithy_http_tower::map_request::{AsyncMapRequestLayer, MapRequestLayer}; -use std::fmt::Debug; -use tower::ServiceBuilder; - -/// Macro to generate the tower stack type. Arguments should be in reverse order -macro_rules! stack_type { - ($first: ty, $($rest:ty),+) => { - tower::layer::util::Stack<$first, stack_type!($($rest),+)> - }; - ($only: ty) => { - tower::layer::util::Stack<$only, tower::layer::util::Identity> - } -} - -// Note: the layers here appear in reverse order -type DefaultMiddlewareStack = stack_type!( - MapRequestLayer, - MapRequestLayer, - AsyncMapRequestLayer, - MapRequestLayer, - MapRequestLayer, - MapRequestLayer -); - -/// AWS Middleware Stack -/// -/// This implements the middleware stack for this service. It will: -/// 1. Load credentials asynchronously into the property bag -/// 2. Sign the request with SigV4 -/// 3. Resolve an Endpoint for the request -/// 4. Add a user agent to the request -#[derive(Debug, Default, Clone)] -#[non_exhaustive] -pub struct DefaultMiddleware; - -impl DefaultMiddleware { - /// Create a new `DefaultMiddleware` stack - /// - /// Note: `DefaultMiddleware` holds no state. - pub fn new() -> Self { - DefaultMiddleware::default() - } -} - -// define the middleware stack in a non-generic location to reduce code bloat. -fn base() -> ServiceBuilder { - let credential_provider = AsyncMapRequestLayer::for_mapper(CredentialsStage::new()); - let signer = MapRequestLayer::for_mapper(SigV4SigningStage::new(SigV4Signer::new())); - let endpoint_stage = MapRequestLayer::for_mapper(SmithyEndpointStage::new()); - let auth_stage = MapRequestLayer::for_mapper(AwsAuthStage); - let user_agent = MapRequestLayer::for_mapper(UserAgentStage::new()); - let recursion_detection = MapRequestLayer::for_mapper(RecursionDetectionStage::new()); - // These layers can be considered as occurring in order, that is: - // 1. Resolve an endpoint - // 2. Add a user agent - // 3. Acquire credentials - // 4. Sign with credentials - // (5. Dispatch over the wire) - ServiceBuilder::new() - .layer(endpoint_stage) - .layer(auth_stage) - .layer(user_agent) - .layer(credential_provider) - .layer(signer) - .layer(recursion_detection) -} - -impl tower::Layer for DefaultMiddleware { - type Service = >::Service; - - fn layer(&self, inner: S) -> Self::Service { - base().service(inner) - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/no_credentials.rs b/aws/rust-runtime/aws-inlineable/src/no_credentials.rs deleted file mode 100644 index d58386b31b1..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/no_credentials.rs +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_credential_types::provider::{error::CredentialsError, future, ProvideCredentials}; - -/// Stub credentials provider for use when no credentials provider is used. -#[non_exhaustive] -#[derive(Debug)] -pub struct NoCredentials; - -impl ProvideCredentials for NoCredentials { - fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> - where - Self: 'a, - { - future::ProvideCredentials::ready(Err(CredentialsError::not_loaded( - "No credentials provider was enabled for the service. \ - hint: use aws-config to provide a credentials chain.", - ))) - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/presigning.rs b/aws/rust-runtime/aws-inlineable/src/presigning.rs index 1bc9f42e6f6..7ed167e3cfa 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning.rs @@ -3,8 +3,18 @@ * SPDX-License-Identifier: Apache-2.0 */ +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2902): Code generate this documentation so that service-specific examples can be added. //! Presigned request types and configuration. - +//! +//! The [`Client`](crate::Client) is used to create presigned requests. They are made +//! by calling `.presigned()` instead of `.send()` on an operation, and require a +//! [`PresigningConfig`](crate::presigning::PresigningConfig) to provide an expiration time. +//! +//! Only operations that support presigning have the `presigned()` method on them. + +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_types::body::SdkBody; use std::fmt; use std::time::{Duration, SystemTime}; @@ -147,7 +157,11 @@ impl PresigningConfigBuilder { return Err(ErrorKind::ExpiresInDurationTooLong.into()); } Ok(PresigningConfig { - start_time: self.start_time.unwrap_or_else(SystemTime::now), + start_time: self.start_time.unwrap_or_else( + // This usage is OK—customers can easily override this. + #[allow(clippy::disallowed_methods)] + SystemTime::now, + ), expires_in, }) } @@ -157,61 +171,79 @@ impl PresigningConfigBuilder { /// /// **This struct has conversion convenience functions:** /// -/// - [`PresignedRequest::to_http_request`][Self::to_http_request] returns an [`http::Request`](https://docs.rs/http/0.2.6/http/request/struct.Request.html) +/// - [`PresignedRequest::make_http_02x_request`][Self::make_http_02x_request] returns an [`http::Request`](https://docs.rs/http/0.2.6/http/request/struct.Request.html) /// - [`PresignedRequest::into`](#impl-From) returns an [`http::request::Builder`](https://docs.rs/http/0.2.6/http/request/struct.Builder.html) #[non_exhaustive] -pub struct PresignedRequest(http::Request<()>); +pub struct PresignedRequest { + http_request: HttpRequest, +} + +impl Clone for PresignedRequest { + fn clone(&self) -> Self { + Self { + http_request: match self.http_request.try_clone() { + Some(body) => body, + None => { + unreachable!( + "during construction, we replaced the body with `SdkBody::empty()`" + ) + } + }, + } + } +} impl PresignedRequest { - pub(crate) fn new(inner: http::Request<()>) -> Self { - Self(inner) + #[allow(dead_code)] + pub(crate) fn new(inner: HttpRequest) -> Result { + // throw out the body so we're sure it's cloneable + let http_request = inner.map(|_body| SdkBody::empty()); + // this should never fail, a presigned request should always be convertible, but better to + // protect against this potential panic + let _ = http_request + .try_clone() + .expect("must be cloneable, body is empty") + .try_into_http02x()?; + Ok(Self { http_request }) } /// Returns the HTTP request method. - pub fn method(&self) -> &http::Method { - self.0.method() + pub fn method(&self) -> &str { + self.http_request.method() } /// Returns the HTTP request URI. - pub fn uri(&self) -> &http::Uri { - self.0.uri() + pub fn uri(&self) -> &str { + self.http_request.uri() } /// Returns any HTTP headers that need to go along with the request, except for `Host`, /// which should be sent based on the endpoint in the URI by the HTTP client rather than /// added directly. - pub fn headers(&self) -> &http::HeaderMap { - self.0.headers() + pub fn headers(&self) -> impl Iterator { + self.http_request.headers().iter() } - /// Given a body, convert this `PresignedRequest` into an `http::Request` - pub fn to_http_request(self, body: B) -> Result, http::Error> { - let builder: http::request::Builder = self.into(); + /// Given a body, produce an `http::Request` from this `PresignedRequest` + pub fn make_http_02x_request(&self, body: B) -> http::Request { + self.clone().into_http_02x_request(body) + } - builder.body(body) + /// Converts this `PresignedRequest` directly into an `http` request. + pub fn into_http_02x_request(self, body: B) -> http::Request { + self.http_request + .try_into_http02x() + .expect("constructor validated convertibility") + .map(|_req| body) } } impl fmt::Debug for PresignedRequest { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("PresignedRequest") - .field("method", self.method()) - .field("uri", self.uri()) - .field("headers", self.headers()) + .field("method", &self.method()) + .field("uri", &self.uri()) + .field("headers", self.http_request.headers()) .finish() } } - -impl From for http::request::Builder { - fn from(req: PresignedRequest) -> Self { - let mut builder = http::request::Builder::new() - .uri(req.uri()) - .method(req.method()); - - if let Some(headers) = builder.headers_mut() { - *headers = req.headers().clone(); - } - - builder - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs index ddc969ac23a..481a8d9cab4 100644 --- a/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs +++ b/aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs @@ -7,7 +7,7 @@ use crate::presigning::PresigningConfig; use crate::serialization_settings::HeaderSerializationSettings; -use aws_runtime::auth::sigv4::{HttpSignatureType, SigV4OperationSigningConfig}; +use aws_runtime::auth::{HttpSignatureType, SigV4OperationSigningConfig}; use aws_runtime::invocation_id::InvocationIdInterceptor; use aws_runtime::request_info::RequestInfoInterceptor; use aws_runtime::user_agent::UserAgentInterceptor; @@ -15,16 +15,19 @@ use aws_sigv4::http_request::SignableBody; use aws_smithy_async::time::{SharedTimeSource, StaticTimeSource}; use aws_smithy_runtime::client::retries::strategy::NeverRetryStrategy; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, }; use aws_smithy_runtime_api::client::interceptors::{ - disable_interceptor, Interceptor, InterceptorRegistrar, SharedInterceptor, + disable_interceptor, Intercept, SharedInterceptor, +}; +use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, }; -use aws_smithy_runtime_api::client::retries::DynRetryStrategy; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; +use std::borrow::Cow; /// Interceptor that tells the SigV4 signer to add the signature to query params, /// and sets the request expiration time from the presigning config. @@ -43,10 +46,15 @@ impl SigV4PresigningInterceptor { } } -impl Interceptor for SigV4PresigningInterceptor { +impl Intercept for SigV4PresigningInterceptor { + fn name(&self) -> &'static str { + "SigV4PresigningInterceptor" + } + fn modify_before_serialization( &self, _context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { cfg.interceptor_state() @@ -55,16 +63,13 @@ impl Interceptor for SigV4PresigningInterceptor { .omit_default_content_length() .omit_default_content_type(), ); - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(StaticTimeSource::new( - self.config.start_time(), - ))); Ok(()) } fn modify_before_signing( &self, _context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { if let Some(mut config) = cfg.load::().cloned() { @@ -86,16 +91,20 @@ impl Interceptor for SigV4PresigningInterceptor { /// Runtime plugin that registers the SigV4PresigningInterceptor. #[derive(Debug)] pub(crate) struct SigV4PresigningRuntimePlugin { - interceptor: SharedInterceptor, + runtime_components: RuntimeComponentsBuilder, } impl SigV4PresigningRuntimePlugin { pub(crate) fn new(config: PresigningConfig, payload_override: SignableBody<'static>) -> Self { + let time_source = SharedTimeSource::new(StaticTimeSource::new(config.start_time())); Self { - interceptor: SharedInterceptor::new(SigV4PresigningInterceptor::new( - config, - payload_override, - )), + runtime_components: RuntimeComponentsBuilder::new("SigV4PresigningRuntimePlugin") + .with_interceptor(SharedInterceptor::new(SigV4PresigningInterceptor::new( + config, + payload_override, + ))) + .with_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))) + .with_time_source(Some(time_source)), } } } @@ -103,14 +112,16 @@ impl SigV4PresigningRuntimePlugin { impl RuntimePlugin for SigV4PresigningRuntimePlugin { fn config(&self) -> Option { let mut layer = Layer::new("Presigning"); - layer.set_retry_strategy(DynRetryStrategy::new(NeverRetryStrategy::new())); layer.store_put(disable_interceptor::("presigning")); layer.store_put(disable_interceptor::("presigning")); layer.store_put(disable_interceptor::("presigning")); Some(layer.freeze()) } - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(self.interceptor.clone()); + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.runtime_components) } } diff --git a/aws/rust-runtime/aws-inlineable/src/presigning_service.rs b/aws/rust-runtime/aws-inlineable/src/presigning_service.rs deleted file mode 100644 index 3dc1e61768b..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/presigning_service.rs +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#![allow(dead_code)] - -//! Tower middleware service for creating presigned requests - -use crate::presigning::PresignedRequest; -use aws_smithy_http::operation; -use http::header::USER_AGENT; -use std::future::{ready, Ready}; -use std::marker::PhantomData; -use std::task::{Context, Poll}; - -/// Tower [`Service`](tower::Service) for generated a [`PresignedRequest`] from the AWS middleware. -#[derive(Default, Debug)] -#[non_exhaustive] -pub(crate) struct PresignedRequestService { - _phantom: PhantomData, -} - -// Required because of the derive Clone on MapRequestService. -// Manually implemented to avoid requiring errors to implement Clone. -impl Clone for PresignedRequestService { - fn clone(&self) -> Self { - Self { - _phantom: Default::default(), - } - } -} - -impl PresignedRequestService { - /// Creates a new `PresignedRequestService` - pub(crate) fn new() -> Self { - Self { - _phantom: Default::default(), - } - } -} - -impl tower::Service for PresignedRequestService { - type Response = PresignedRequest; - type Error = E; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: operation::Request) -> Self::Future { - let (mut req, _) = req.into_parts(); - - // Remove user agent headers since the request will not be executed by the AWS Rust SDK. - req.headers_mut().remove(USER_AGENT); - req.headers_mut().remove("X-Amz-User-Agent"); - - ready(Ok(PresignedRequest::new(req.map(|_| ())))) - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs index 0ed2a354d22..a1045139702 100644 --- a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs +++ b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs @@ -7,7 +7,8 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::fmt; use std::marker::PhantomData; @@ -66,14 +67,19 @@ where } } -impl Interceptor for Route53ResourceIdInterceptor +impl Intercept for Route53ResourceIdInterceptor where - G: for<'a> Fn(&'a mut T) -> &'a mut Option, + G: for<'a> Fn(&'a mut T) -> &'a mut Option + Send + Sync, T: fmt::Debug + Send + Sync + 'static, { + fn name(&self) -> &'static str { + "Route53ResourceIdInterceptor" + } + fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let input: &mut T = context.input_mut().downcast_mut().expect("correct type"); diff --git a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor_middleware.rs b/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor_middleware.rs deleted file mode 100644 index 545be270de1..00000000000 --- a/aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor_middleware.rs +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// TODO(enableNewSmithyRuntimeCleanup): Delete this module - -// This function is only used to strip prefixes from resource IDs at the time they're passed as -// input to a request. Resource IDs returned in responses may or may not include a prefix. -/// Strip the resource type prefix from resource ID return -pub fn trim_resource_id(resource_id: &mut Option) { - const PREFIXES: &[&str] = &[ - "/hostedzone/", - "hostedzone/", - "/change/", - "change/", - "/delegationset/", - "delegationset/", - ]; - - for prefix in PREFIXES { - if let Some(id) = resource_id - .as_deref() - .unwrap_or_default() - .strip_prefix(prefix) - { - *resource_id = Some(id.to_string()); - return; - } - } -} - -#[cfg(test)] -mod test { - use crate::route53_resource_id_preprocessor_middleware::trim_resource_id; - - #[test] - fn does_not_change_regular_zones() { - struct OperationInput { - resource: Option, - } - - let mut operation = OperationInput { - resource: Some("Z0441723226OZ66S5ZCNZ".to_string()), - }; - trim_resource_id(&mut operation.resource); - assert_eq!( - &operation.resource.unwrap_or_default(), - "Z0441723226OZ66S5ZCNZ" - ); - } - - #[test] - fn sanitizes_prefixed_zone() { - struct OperationInput { - change_id: Option, - } - - let mut operation = OperationInput { - change_id: Some("/change/Z0441723226OZ66S5ZCNZ".to_string()), - }; - trim_resource_id(&mut operation.change_id); - assert_eq!( - &operation.change_id.unwrap_or_default(), - "Z0441723226OZ66S5ZCNZ" - ); - } - - #[test] - fn allow_no_leading_slash() { - struct OperationInput { - hosted_zone: Option, - } - - let mut operation = OperationInput { - hosted_zone: Some("hostedzone/Z0441723226OZ66S5ZCNZ".to_string()), - }; - trim_resource_id(&mut operation.hosted_zone); - assert_eq!( - &operation.hosted_zone.unwrap_or_default(), - "Z0441723226OZ66S5ZCNZ" - ); - } -} diff --git a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs index f19ad434d14..26cfa745e3b 100644 --- a/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs +++ b/aws/rust-runtime/aws-inlineable/src/s3_request_id.rs @@ -3,14 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_client::SdkError; -use aws_smithy_http::http::HttpHeaders; -use aws_smithy_http::operation; -use aws_smithy_types::error::metadata::{ - Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, -}; -use aws_smithy_types::error::Unhandled; -use http::{HeaderMap, HeaderValue}; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::http::{Headers, Response}; +use aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata}; const EXTENDED_REQUEST_ID: &str = "s3_extended_request_id"; @@ -22,14 +17,11 @@ pub trait RequestIdExt { fn extended_request_id(&self) -> Option<&str>; } -impl RequestIdExt for SdkError -where - R: HttpHeaders, -{ +impl RequestIdExt for SdkError { fn extended_request_id(&self) -> Option<&str> { match self { - Self::ResponseError(err) => extract_extended_request_id(err.raw().http_headers()), - Self::ServiceError(err) => extract_extended_request_id(err.raw().http_headers()), + Self::ResponseError(err) => err.raw().headers().extended_request_id(), + Self::ServiceError(err) => err.raw().headers().extended_request_id(), _ => None, } } @@ -41,27 +33,15 @@ impl RequestIdExt for ErrorMetadata { } } -impl RequestIdExt for Unhandled { - fn extended_request_id(&self) -> Option<&str> { - self.meta().extended_request_id() - } -} - -impl RequestIdExt for operation::Response { - fn extended_request_id(&self) -> Option<&str> { - extract_extended_request_id(self.http().headers()) - } -} - -impl RequestIdExt for http::Response { +impl RequestIdExt for Response { fn extended_request_id(&self) -> Option<&str> { - extract_extended_request_id(self.headers()) + self.headers().extended_request_id() } } -impl RequestIdExt for HeaderMap { +impl RequestIdExt for Headers { fn extended_request_id(&self) -> Option<&str> { - extract_extended_request_id(self) + self.get("x-amz-id-2") } } @@ -79,51 +59,45 @@ where } /// Applies the extended request ID to a generic error builder -#[doc(hidden)] -pub fn apply_extended_request_id( +pub(crate) fn apply_extended_request_id( builder: ErrorMetadataBuilder, - headers: &HeaderMap, + headers: &Headers, ) -> ErrorMetadataBuilder { - if let Some(extended_request_id) = extract_extended_request_id(headers) { + if let Some(extended_request_id) = headers.extended_request_id() { builder.custom(EXTENDED_REQUEST_ID, extended_request_id) } else { builder } } -/// Extracts the S3 Extended Request ID from HTTP response headers -fn extract_extended_request_id(headers: &HeaderMap) -> Option<&str> { - headers - .get("x-amz-id-2") - .and_then(|value| value.to_str().ok()) -} - #[cfg(test)] mod test { use super::*; - use aws_smithy_client::SdkError; - use aws_smithy_http::body::SdkBody; - use http::Response; + use aws_smithy_runtime_api::client::result::SdkError; + use aws_smithy_types::body::SdkBody; #[test] fn handle_missing_header() { - let resp = http::Response::builder().status(400).body("").unwrap(); - let mut builder = aws_smithy_types::Error::builder().message("123"); + let resp = + Response::try_from(http::Response::builder().status(400).body("").unwrap()).unwrap(); + let mut builder = ErrorMetadata::builder().message("123"); builder = apply_extended_request_id(builder, resp.headers()); assert_eq!(builder.build().extended_request_id(), None); } #[test] fn test_extended_request_id_sdk_error() { - let without_extended_request_id = - || operation::Response::new(Response::builder().body(SdkBody::empty()).unwrap()); + let without_extended_request_id = || { + Response::try_from(http::Response::builder().body(SdkBody::empty()).unwrap()).unwrap() + }; let with_extended_request_id = || { - operation::Response::new( - Response::builder() - .header("x-amz-id-2", HeaderValue::from_static("some-request-id")) + Response::try_from( + http::Response::builder() + .header("x-amz-id-2", "some-request-id") .body(SdkBody::empty()) .unwrap(), ) + .unwrap() }; assert_eq!( None, @@ -147,25 +121,22 @@ mod test { #[test] fn test_extract_extended_request_id() { - let mut headers = HeaderMap::new(); - assert_eq!(None, extract_extended_request_id(&headers)); + let mut headers = Headers::new(); + assert_eq!(None, headers.extended_request_id()); - headers.append("x-amz-id-2", HeaderValue::from_static("some-request-id")); - assert_eq!( - Some("some-request-id"), - extract_extended_request_id(&headers) - ); + headers.append("x-amz-id-2", "some-request-id"); + assert_eq!(Some("some-request-id"), headers.extended_request_id()); } #[test] fn test_apply_extended_request_id() { - let mut headers = HeaderMap::new(); + let mut headers = Headers::new(); assert_eq!( ErrorMetadata::builder().build(), apply_extended_request_id(ErrorMetadata::builder(), &headers).build(), ); - headers.append("x-amz-id-2", HeaderValue::from_static("some-request-id")); + headers.append("x-amz-id-2", "some-request-id"); assert_eq!( ErrorMetadata::builder() .custom(EXTENDED_REQUEST_ID, "some-request-id") diff --git a/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs b/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs deleted file mode 100644 index 3a5c3258d14..00000000000 --- a/aws/rust-runtime/aws-inlineable/tests/middleware_e2e_test.rs +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use std::convert::Infallible; -use std::error::Error; -use std::fmt; -use std::fmt::{Display, Formatter}; -use std::time::{Duration, UNIX_EPOCH}; - -use aws_credential_types::cache::CredentialsCache; -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_credential_types::Credentials; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_http::response::ParseHttpResponse; -use aws_smithy_types::endpoint::Endpoint; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; -use bytes::Bytes; -use http::header::{AUTHORIZATION, USER_AGENT}; -use http::{self, Uri}; - -use aws_http::retry::AwsResponseRetryClassifier; -use aws_http::user_agent::AwsUserAgent; -use aws_inlineable::middleware::DefaultMiddleware; -use aws_sig_auth::signer::OperationSigningConfig; -use aws_smithy_async::time::SharedTimeSource; -use aws_types::region::SigningRegion; -use aws_types::SigningService; - -type Client = aws_smithy_client::Client; - -#[derive(Clone)] -struct TestOperationParser; - -#[derive(Debug)] -struct OperationError; - -impl Display for OperationError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -impl Error for OperationError {} - -impl ProvideErrorKind for OperationError { - fn retryable_error_kind(&self) -> Option { - Some(ErrorKind::ThrottlingError) - } - - fn code(&self) -> Option<&str> { - None - } -} - -impl ParseHttpResponse for TestOperationParser { - type Output = Result; - - fn parse_unloaded(&self, response: &mut operation::Response) -> Option { - if response.http().status().is_success() { - Some(Ok("Hello!".to_string())) - } else { - Some(Err(OperationError)) - } - } - - fn parse_loaded(&self, _response: &http::Response) -> Self::Output { - Ok("Hello!".to_string()) - } -} - -fn test_operation() -> Operation { - let req = operation::Request::new( - http::Request::builder() - .uri("/") - .body(SdkBody::from("request body")) - .unwrap(), - ) - .augment(|req, conf| { - conf.insert(aws_smithy_http::endpoint::Result::Ok( - Endpoint::builder() - .url("https://test-service.test-region.amazonaws.com") - .build(), - )); - aws_http::auth::set_credentials_cache( - conf, - CredentialsCache::lazy() - .create_cache(SharedCredentialsProvider::new(Credentials::for_tests())), - ); - conf.insert(SigningRegion::from_static("test-region")); - conf.insert(OperationSigningConfig::default_config()); - conf.insert(SigningService::from_static("test-service-signing")); - conf.insert(SharedTimeSource::new( - UNIX_EPOCH + Duration::from_secs(1613414417), - )); - conf.insert(AwsUserAgent::for_tests()); - Result::<_, Infallible>::Ok(req) - }) - .unwrap(); - Operation::new(req, TestOperationParser) - .with_retry_classifier(AwsResponseRetryClassifier::new()) - .with_metadata(operation::Metadata::new("test-op", "test-service")) -} - -#[cfg(feature = "rustls")] -#[test] -fn test_default_client() { - let client = Client::builder() - .dyn_https_connector(Default::default()) - .middleware_fn(|r| r) - .build(); - let _ = client.call(test_operation()); -} - -#[tokio::test] -async fn e2e_test() { - let expected_req = http::Request::builder() - .header(USER_AGENT, "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") - .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") - .header(AUTHORIZATION, "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210215/test-region/test-service-signing/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=6d477055738c4e634c2451b9fc378b6ff2f967d37657c3dd50a1b6a735576960") - .header("x-amz-date", "20210215T184017Z") - .header("x-amz-security-token", "notarealsessiontoken") - .uri(Uri::from_static("https://test-service.test-region.amazonaws.com/")) - .body(SdkBody::from("request body")).unwrap(); - let events = vec![( - expected_req, - http::Response::builder() - .status(200) - .body("response body") - .unwrap(), - )]; - let conn = TestConnection::new(events); - let client = Client::new(conn.clone()); - let resp = client.call(test_operation()).await; - let resp = resp.expect("successful operation"); - assert_eq!(resp, "Hello!"); - - conn.assert_requests_match(&[]); -} - -#[tokio::test] -async fn test_operation_metadata_is_available_to_middlewares() { - let conn = TestConnection::new(vec![( - http::Request::builder() - .header(USER_AGENT, "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") - .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") - .header(AUTHORIZATION, "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210215/test-region/test-service-signing/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=6d477055738c4e634c2451b9fc378b6ff2f967d37657c3dd50a1b6a735576960") - .header("x-amz-date", "20210215T184017Z") - .header("x-amz-security-token", "notarealsessiontoken") - .uri(Uri::from_static("https://test-service.test-region.amazonaws.com/")) - .body(SdkBody::from("request body")).unwrap(), - http::Response::builder() - .status(200) - .body("response body") - .unwrap(), - )]); - let client = aws_smithy_client::Client::builder() - .middleware_fn(|req| { - let metadata = req - .properties() - .get::() - .cloned() - .unwrap(); - - assert_eq!("test-op", metadata.name()); - assert_eq!("test-service", metadata.service()); - - req - }) - .connector(DynConnector::new(conn)) - .build(); - - let resp = client.call(test_operation()).await; - let resp = resp.expect("successful operation"); - assert_eq!(resp, "Hello!"); -} diff --git a/aws/rust-runtime/aws-runtime-api/Cargo.toml b/aws/rust-runtime/aws-runtime-api/Cargo.toml index 49353b7d081..920384f5548 100644 --- a/aws/rust-runtime/aws-runtime-api/Cargo.toml +++ b/aws/rust-runtime/aws-runtime-api/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team "] description = "Runtime support code for the AWS SDK. This isn't intended to be used directly." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [dependencies] @@ -14,3 +14,9 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-runtime-api", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-runtime-api/README.md b/aws/rust-runtime/aws-runtime-api/README.md index 3eb3bd41939..7de9a62bd4f 100644 --- a/aws/rust-runtime/aws-runtime-api/README.md +++ b/aws/rust-runtime/aws-runtime-api/README.md @@ -4,5 +4,5 @@ aws-runtime-api Runtime support code for the AWS SDK. This crate isn't intended to be used directly. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-runtime/Cargo.toml b/aws/rust-runtime/aws-runtime/Cargo.toml index aa6fdc1ddee..b255e8b8421 100644 --- a/aws/rust-runtime/aws-runtime/Cargo.toml +++ b/aws/rust-runtime/aws-runtime/Cargo.toml @@ -5,27 +5,29 @@ authors = ["AWS Rust SDK Team "] description = "Runtime support code for the AWS SDK. This crate isn't intended to be used directly." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] event-stream = ["dep:aws-smithy-eventstream", "aws-sigv4/sign-eventstream"] test-util = [] +sigv4a = ["aws-sigv4/sigv4a"] [dependencies] aws-credential-types = { path = "../aws-credential-types" } aws-http = { path = "../aws-http" } -aws-sigv4 = { path = "../aws-sigv4" } +# TODO(httpRefactor): Remove the http0-compat feature +aws-sigv4 = { path = "../aws-sigv4", features = ["http0-compat"] } aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime" } -aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api" } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } aws-types = { path = "../aws-types" } +fastrand = "2.0.0" http = "0.2.3" percent-encoding = "2.1.0" tracing = "0.1" -uuid = { version = "1", features = ["v4", "fast-rng"] } +uuid = { version = "1" } [dev-dependencies] aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } @@ -43,3 +45,6 @@ all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-runtime/README.md b/aws/rust-runtime/aws-runtime/README.md index 65b01de9e25..f1ddb369ad6 100644 --- a/aws/rust-runtime/aws-runtime/README.md +++ b/aws/rust-runtime/aws-runtime/README.md @@ -4,5 +4,5 @@ aws-runtime Runtime support code for the AWS SDK. This crate isn't intended to be used directly. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-client/additional-ci b/aws/rust-runtime/aws-runtime/additional-ci similarity index 53% rename from rust-runtime/aws-smithy-client/additional-ci rename to aws/rust-runtime/aws-runtime/additional-ci index bb21b8b01f4..b44c6c05be7 100755 --- a/rust-runtime/aws-smithy-client/additional-ci +++ b/aws/rust-runtime/aws-runtime/additional-ci @@ -8,8 +8,5 @@ set -e -echo "### Checking for duplicate dependency versions in the normal dependency graph with all features enabled" -cargo tree -d --edges normal --all-features - echo "### Testing every combination of features (excluding --all-features)" -cargo hack test --feature-powerset --exclude-all-features --exclude-features native-tls +cargo hack test --feature-powerset --exclude-all-features diff --git a/aws/rust-runtime/aws-runtime/external-types.toml b/aws/rust-runtime/aws-runtime/external-types.toml index 0449ba09bbd..941f09767bf 100644 --- a/aws/rust-runtime/aws-runtime/external-types.toml +++ b/aws/rust-runtime/aws-runtime/external-types.toml @@ -1,14 +1,6 @@ allowed_external_types = [ - "aws_credential_types::*", "aws_sigv4::*", - "aws_smithy_http::*", "aws_smithy_types::*", "aws_smithy_runtime_api::*", "aws_types::*", - # TODO(audit-external-type-usage) We should newtype these or otherwise avoid exposing them - "http::header::name::HeaderName", - "http::header::value::HeaderValue", - "http::request::Request", - "http::response::Response", - "http::uri::Uri", ] diff --git a/aws/rust-runtime/aws-runtime/src/auth.rs b/aws/rust-runtime/aws-runtime/src/auth.rs index 149466a58a0..6b1ecef2bf0 100644 --- a/aws/rust-runtime/aws-runtime/src/auth.rs +++ b/aws/rust-runtime/aws-runtime/src/auth.rs @@ -3,5 +3,219 @@ * SPDX-License-Identifier: Apache-2.0 */ +use aws_sigv4::http_request::{ + PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableBody, SignatureLocation, + SigningInstructions, SigningSettings, UriPathNormalizationMode, +}; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig; +use aws_smithy_runtime_api::client::identity::Identity; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::Document; +use aws_types::region::{Region, SigningRegion, SigningRegionSet}; +use aws_types::SigningName; +use std::error::Error as StdError; +use std::fmt; +use std::time::Duration; + /// Auth implementations for SigV4. pub mod sigv4; + +#[cfg(feature = "sigv4a")] +/// Auth implementations for SigV4a. +pub mod sigv4a; + +/// Type of SigV4 signature. +#[derive(Debug, Eq, PartialEq, Clone, Copy)] +pub enum HttpSignatureType { + /// A signature for a full http request should be computed, with header updates applied to the signing result. + HttpRequestHeaders, + + /// A signature for a full http request should be computed, with query param updates applied to the signing result. + /// + /// This is typically used for presigned URLs. + HttpRequestQueryParams, +} + +/// Signing options for SigV4. +#[derive(Clone, Debug, Eq, PartialEq)] +#[non_exhaustive] +pub struct SigningOptions { + /// Apply URI encoding twice. + pub double_uri_encode: bool, + /// Apply a SHA-256 payload checksum. + pub content_sha256_header: bool, + /// Normalize the URI path before signing. + pub normalize_uri_path: bool, + /// Omit the session token from the signature. + pub omit_session_token: bool, + /// Optional override for the payload to be used in signing. + pub payload_override: Option>, + /// Signature type. + pub signature_type: HttpSignatureType, + /// Whether or not the signature is optional. + pub signing_optional: bool, + /// Optional expiration (for presigning) + pub expires_in: Option, +} + +impl Default for SigningOptions { + fn default() -> Self { + Self { + double_uri_encode: true, + content_sha256_header: false, + normalize_uri_path: true, + omit_session_token: false, + payload_override: None, + signature_type: HttpSignatureType::HttpRequestHeaders, + signing_optional: false, + expires_in: None, + } + } +} + +/// SigV4 signing configuration for an operation +/// +/// Although these fields MAY be customized on a per request basis, they are generally static +/// for a given operation +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct SigV4OperationSigningConfig { + /// AWS region to sign for. + /// + /// For an up-to-date list of AWS regions, see + pub region: Option, + /// AWS region set to sign for. + /// + /// A comma-separated list of AWS regions. Examples include typical AWS regions as well as 'wildcard' regions + pub region_set: Option, + /// AWS service to sign for. + pub name: Option, + /// Signing options. + pub signing_options: SigningOptions, +} + +impl Storable for SigV4OperationSigningConfig { + type Storer = StoreReplace; +} + +fn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings { + let mut settings = SigningSettings::default(); + settings.percent_encoding_mode = if operation_config.signing_options.double_uri_encode { + PercentEncodingMode::Double + } else { + PercentEncodingMode::Single + }; + settings.payload_checksum_kind = if operation_config.signing_options.content_sha256_header { + PayloadChecksumKind::XAmzSha256 + } else { + PayloadChecksumKind::NoHeader + }; + settings.uri_path_normalization_mode = if operation_config.signing_options.normalize_uri_path { + UriPathNormalizationMode::Enabled + } else { + UriPathNormalizationMode::Disabled + }; + settings.session_token_mode = if operation_config.signing_options.omit_session_token { + SessionTokenMode::Exclude + } else { + SessionTokenMode::Include + }; + settings.signature_location = match operation_config.signing_options.signature_type { + HttpSignatureType::HttpRequestHeaders => SignatureLocation::Headers, + HttpSignatureType::HttpRequestQueryParams => SignatureLocation::QueryParams, + }; + settings.expires_in = operation_config.signing_options.expires_in; + settings +} + +#[derive(Debug)] +enum SigV4SigningError { + MissingOperationSigningConfig, + MissingSigningRegion, + #[cfg(feature = "sigv4a")] + MissingSigningRegionSet, + MissingSigningName, + WrongIdentityType(Identity), + BadTypeInEndpointAuthSchemeConfig(&'static str), +} + +impl fmt::Display for SigV4SigningError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + use SigV4SigningError::*; + let mut w = |s| f.write_str(s); + match self { + MissingOperationSigningConfig => w("missing operation signing config"), + MissingSigningRegion => w("missing signing region"), + #[cfg(feature = "sigv4a")] + MissingSigningRegionSet => w("missing signing region set"), + MissingSigningName => w("missing signing name"), + WrongIdentityType(identity) => { + write!(f, "wrong identity type for SigV4/sigV4a. Expected AWS credentials but got `{identity:?}`") + } + BadTypeInEndpointAuthSchemeConfig(field_name) => { + write!( + f, + "unexpected type for `{field_name}` in endpoint auth scheme config", + ) + } + } + } +} + +impl StdError for SigV4SigningError {} + +fn extract_endpoint_auth_scheme_signing_name( + endpoint_config: &AuthSchemeEndpointConfig<'_>, +) -> Result, SigV4SigningError> { + use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; + + match extract_field_from_endpoint_config("signingName", endpoint_config) { + Some(Document::String(s)) => Ok(Some(SigningName::from(s.to_string()))), + None => Ok(None), + _ => Err(UnexpectedType("signingName")), + } +} + +fn extract_endpoint_auth_scheme_signing_region( + endpoint_config: &AuthSchemeEndpointConfig<'_>, +) -> Result, SigV4SigningError> { + use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; + + match extract_field_from_endpoint_config("signingRegion", endpoint_config) { + Some(Document::String(s)) => Ok(Some(SigningRegion::from(Region::new(s.clone())))), + None => Ok(None), + _ => Err(UnexpectedType("signingRegion")), + } +} + +fn extract_field_from_endpoint_config<'a>( + field_name: &'static str, + endpoint_config: &'a AuthSchemeEndpointConfig<'_>, +) -> Option<&'a Document> { + endpoint_config + .as_document() + .and_then(Document::as_object) + .and_then(|config| config.get(field_name)) +} + +fn apply_signing_instructions( + instructions: SigningInstructions, + request: &mut HttpRequest, +) -> Result<(), BoxError> { + let (new_headers, new_query) = instructions.into_parts(); + for header in new_headers.into_iter() { + let mut value = http::HeaderValue::from_str(header.value()).unwrap(); + value.set_sensitive(header.sensitive()); + request.headers_mut().insert(header.name(), value); + } + + if !new_query.is_empty() { + let mut query = aws_smithy_http::query_writer::QueryWriter::new_from_string(request.uri())?; + for (name, value) in new_query { + query.insert(name, &value); + } + request.set_uri(query.build_uri())?; + } + Ok(()) +} diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs index 366e3ce0db0..1e3dc5ad39d 100644 --- a/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4.rs @@ -3,28 +3,28 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::auth; +use crate::auth::{ + extract_endpoint_auth_scheme_signing_name, extract_endpoint_auth_scheme_signing_region, + SigV4OperationSigningConfig, SigV4SigningError, +}; use aws_credential_types::Credentials; use aws_sigv4::http_request::{ - sign, PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableBody, - SignableRequest, SignatureLocation, SigningParams, SigningSettings, UriPathNormalizationMode, + sign, SignableBody, SignableRequest, SigningParams, SigningSettings, }; +use aws_sigv4::sign::v4; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, -}; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; -use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolvers, SharedIdentityResolver, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign, }; +use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::Document; -use aws_types::region::{Region, SigningRegion}; -use aws_types::SigningService; +use aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; +use aws_smithy_types::config_bag::ConfigBag; +use aws_types::region::SigningRegion; +use aws_types::SigningName; use std::borrow::Cow; -use std::error::Error as StdError; -use std::fmt; -use std::time::{Duration, SystemTime}; +use std::time::SystemTime; const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ `expires_in` duration because the credentials used to sign it will expire first."; @@ -32,199 +32,62 @@ const EXPIRATION_WARNING: &str = "Presigned request will expire before the given /// Auth scheme ID for SigV4. pub const SCHEME_ID: AuthSchemeId = AuthSchemeId::new("sigv4"); -struct EndpointAuthSchemeConfig { - signing_region_override: Option, - signing_service_override: Option, -} - -#[derive(Debug)] -enum SigV4SigningError { - MissingOperationSigningConfig, - MissingSigningRegion, - MissingSigningService, - WrongIdentityType(Identity), - BadTypeInEndpointAuthSchemeConfig(&'static str), -} - -impl fmt::Display for SigV4SigningError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - use SigV4SigningError::*; - let mut w = |s| f.write_str(s); - match self { - MissingOperationSigningConfig => w("missing operation signing config for SigV4"), - MissingSigningRegion => w("missing signing region for SigV4 signing"), - MissingSigningService => w("missing signing service for SigV4 signing"), - WrongIdentityType(identity) => { - write!(f, "wrong identity type for SigV4: {identity:?}") - } - BadTypeInEndpointAuthSchemeConfig(field_name) => { - write!( - f, - "unexpected type for `{field_name}` in endpoint auth scheme config", - ) - } - } - } -} - -impl StdError for SigV4SigningError { - fn source(&self) -> Option<&(dyn StdError + 'static)> { - match self { - Self::MissingOperationSigningConfig => None, - Self::MissingSigningRegion => None, - Self::MissingSigningService => None, - Self::WrongIdentityType(_) => None, - Self::BadTypeInEndpointAuthSchemeConfig(_) => None, - } - } -} - /// SigV4 auth scheme. #[derive(Debug, Default)] -pub struct SigV4HttpAuthScheme { - signer: SigV4HttpRequestSigner, +pub struct SigV4AuthScheme { + signer: SigV4Signer, } -impl SigV4HttpAuthScheme { - /// Creates a new `SigV4HttpAuthScheme`. +impl SigV4AuthScheme { + /// Creates a new `SigV4AuthScheme`. pub fn new() -> Self { Default::default() } } -impl HttpAuthScheme for SigV4HttpAuthScheme { +impl AuthScheme for SigV4AuthScheme { fn scheme_id(&self) -> AuthSchemeId { SCHEME_ID } fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Sign { &self.signer } } -/// Type of SigV4 signature. -#[derive(Debug, Eq, PartialEq, Clone, Copy)] -pub enum HttpSignatureType { - /// A signature for a full http request should be computed, with header updates applied to the signing result. - HttpRequestHeaders, - - /// A signature for a full http request should be computed, with query param updates applied to the signing result. - /// - /// This is typically used for presigned URLs. - HttpRequestQueryParams, -} - -/// Signing options for SigV4. -#[derive(Clone, Debug, Eq, PartialEq)] -#[non_exhaustive] -pub struct SigningOptions { - /// Apply URI encoding twice. - pub double_uri_encode: bool, - /// Apply a SHA-256 payload checksum. - pub content_sha256_header: bool, - /// Normalize the URI path before signing. - pub normalize_uri_path: bool, - /// Omit the session token from the signature. - pub omit_session_token: bool, - /// Optional override for the payload to be used in signing. - pub payload_override: Option>, - /// Signature type. - pub signature_type: HttpSignatureType, - /// Whether or not the signature is optional. - pub signing_optional: bool, - /// Optional expiration (for presigning) - pub expires_in: Option, -} - -impl Default for SigningOptions { - fn default() -> Self { - Self { - double_uri_encode: true, - content_sha256_header: false, - normalize_uri_path: true, - omit_session_token: false, - payload_override: None, - signature_type: HttpSignatureType::HttpRequestHeaders, - signing_optional: false, - expires_in: None, - } - } -} - -/// SigV4 signing configuration for an operation -/// -/// Although these fields MAY be customized on a per request basis, they are generally static -/// for a given operation -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct SigV4OperationSigningConfig { - /// AWS Region to sign for. - pub region: Option, - /// AWS Service to sign for. - pub service: Option, - /// Signing options. - pub signing_options: SigningOptions, -} - -impl Storable for SigV4OperationSigningConfig { - type Storer = StoreReplace; -} - -/// SigV4 HTTP request signer. +/// SigV4 signer. #[derive(Debug, Default)] -pub struct SigV4HttpRequestSigner; +pub struct SigV4Signer; -impl SigV4HttpRequestSigner { +impl SigV4Signer { /// Creates a new signer instance. pub fn new() -> Self { Self } fn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings { - let mut settings = SigningSettings::default(); - settings.percent_encoding_mode = if operation_config.signing_options.double_uri_encode { - PercentEncodingMode::Double - } else { - PercentEncodingMode::Single - }; - settings.payload_checksum_kind = if operation_config.signing_options.content_sha256_header { - PayloadChecksumKind::XAmzSha256 - } else { - PayloadChecksumKind::NoHeader - }; - settings.uri_path_normalization_mode = - if operation_config.signing_options.normalize_uri_path { - UriPathNormalizationMode::Enabled - } else { - UriPathNormalizationMode::Disabled - }; - settings.session_token_mode = if operation_config.signing_options.omit_session_token { - SessionTokenMode::Exclude - } else { - SessionTokenMode::Include - }; - settings.signature_location = match operation_config.signing_options.signature_type { - HttpSignatureType::HttpRequestHeaders => SignatureLocation::Headers, - HttpSignatureType::HttpRequestQueryParams => SignatureLocation::QueryParams, - }; - settings.expires_in = operation_config.signing_options.expires_in; - settings + super::settings(operation_config) } fn signing_params<'a>( settings: SigningSettings, - credentials: &'a Credentials, + identity: &'a Identity, operation_config: &'a SigV4OperationSigningConfig, request_timestamp: SystemTime, - ) -> Result, SigV4SigningError> { + ) -> Result, SigV4SigningError> { + let creds = identity + .data::() + .ok_or_else(|| SigV4SigningError::WrongIdentityType(identity.clone()))?; + if let Some(expires_in) = settings.expires_in { - if let Some(creds_expires_time) = credentials.expiry() { + if let Some(creds_expires_time) = creds.expiry() { let presigned_expires_time = request_timestamp + expires_in; if presigned_expires_time > creds_expires_time { tracing::warn!(EXPIRATION_WARNING); @@ -232,9 +95,8 @@ impl SigV4HttpRequestSigner { } } - let mut builder = SigningParams::builder() - .access_key(credentials.access_key_id()) - .secret_key(credentials.secret_access_key()) + Ok(v4::SigningParams::builder() + .identity(identity) .region( operation_config .region @@ -242,17 +104,17 @@ impl SigV4HttpRequestSigner { .ok_or(SigV4SigningError::MissingSigningRegion)? .as_ref(), ) - .service_name( + .name( operation_config - .service + .name .as_ref() - .ok_or(SigV4SigningError::MissingSigningService)? + .ok_or(SigV4SigningError::MissingSigningName)? .as_ref(), ) .time(request_timestamp) - .settings(settings); - builder.set_security_token(credentials.session_token()); - Ok(builder.build().expect("all required fields set")) + .settings(settings) + .build() + .expect("all required fields set")) } fn extract_operation_config<'a>( @@ -263,80 +125,44 @@ impl SigV4HttpRequestSigner { .load::() .ok_or(SigV4SigningError::MissingOperationSigningConfig)?; - let signing_region = config_bag.load::(); - let signing_service = config_bag.load::(); + let name = extract_endpoint_auth_scheme_signing_name(&auth_scheme_endpoint_config)? + .or(config_bag.load::().cloned()); - let EndpointAuthSchemeConfig { - signing_region_override, - signing_service_override, - } = Self::extract_endpoint_auth_scheme_config(auth_scheme_endpoint_config)?; + let region = extract_endpoint_auth_scheme_signing_region(&auth_scheme_endpoint_config)? + .or(config_bag.load::().cloned()); - match ( - signing_region_override.or_else(|| signing_region.cloned()), - signing_service_override.or_else(|| signing_service.cloned()), - ) { + match (region, name) { (None, None) => Ok(Cow::Borrowed(operation_config)), - (region, service) => { + (region, name) => { let mut operation_config = operation_config.clone(); - if region.is_some() { - operation_config.region = region; - } - if service.is_some() { - operation_config.service = service; - } + operation_config.region = region.or(operation_config.region); + operation_config.name = name.or(operation_config.name); Ok(Cow::Owned(operation_config)) } } } - - fn extract_endpoint_auth_scheme_config( - endpoint_config: AuthSchemeEndpointConfig<'_>, - ) -> Result { - let (mut signing_region_override, mut signing_service_override) = (None, None); - if let Some(config) = endpoint_config.config().and_then(Document::as_object) { - use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; - signing_region_override = match config.get("signingRegion") { - Some(Document::String(s)) => Some(SigningRegion::from(Region::new(s.clone()))), - None => None, - _ => return Err(UnexpectedType("signingRegion")), - }; - signing_service_override = match config.get("signingName") { - Some(Document::String(s)) => Some(SigningService::from(s.to_string())), - None => None, - _ => return Err(UnexpectedType("signingName")), - }; - } - Ok(EndpointAuthSchemeConfig { - signing_region_override, - signing_service_override, - }) - } } -impl HttpRequestSigner for SigV4HttpRequestSigner { - fn sign_request( +impl Sign for SigV4Signer { + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, config_bag: &ConfigBag, ) -> Result<(), BoxError> { let operation_config = Self::extract_operation_config(auth_scheme_endpoint_config, config_bag)?; - let request_time = config_bag.request_time().unwrap_or_default().now(); - - let credentials = if let Some(creds) = identity.data::() { - creds - } else if operation_config.signing_options.signing_optional { - tracing::debug!("skipped SigV4 signing since signing is optional for this operation and there are no credentials"); - return Ok(()); - } else { + let request_time = runtime_components.time_source().unwrap_or_default().now(); + + if identity.data::().is_none() { return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into()); }; let settings = Self::settings(&operation_config); let signing_params = - Self::signing_params(settings, credentials, &operation_config, request_time)?; + Self::signing_params(settings, identity, &operation_config, request_time)?; let (signing_instructions, _signature) = { // A body that is already in memory can be signed directly. A body that is not in memory @@ -359,10 +185,10 @@ impl HttpRequestSigner for SigV4HttpRequestSigner { let signable_request = SignableRequest::new( request.method(), request.uri(), - request.headers(), + request.headers().iter(), signable_body, - ); - sign(signable_request, &signing_params)? + )?; + sign(signable_request, &SigningParams::V4(signing_params))? } .into_parts(); @@ -373,70 +199,70 @@ impl HttpRequestSigner for SigV4HttpRequestSigner { use event_stream::SigV4MessageSigner; if let Some(signer_sender) = config_bag.load::() { - let time_source = config_bag.request_time().unwrap_or_default(); + let time_source = runtime_components.time_source().unwrap_or_default(); + let region = operation_config.region.clone().unwrap(); + let name = operation_config.name.clone().unwrap(); signer_sender .send(Box::new(SigV4MessageSigner::new( _signature, - credentials.clone(), - Region::new(signing_params.region().to_string()).into(), - signing_params.service_name().to_string().into(), + identity.clone(), + region, + name, time_source, )) as _) .expect("failed to send deferred signer"); } } - - signing_instructions.apply_to_request(request); + auth::apply_signing_instructions(signing_instructions, request)?; Ok(()) } } #[cfg(feature = "event-stream")] mod event_stream { - use aws_credential_types::Credentials; use aws_sigv4::event_stream::{sign_empty_message, sign_message}; - use aws_sigv4::SigningParams; + use aws_sigv4::sign::v4; use aws_smithy_async::time::SharedTimeSource; - use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; + use aws_smithy_eventstream::frame::{SignMessage, SignMessageError}; + use aws_smithy_runtime_api::client::identity::Identity; + use aws_smithy_types::event_stream::Message; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; /// Event Stream SigV4 signing implementation. #[derive(Debug)] pub(super) struct SigV4MessageSigner { last_signature: String, - credentials: Credentials, + identity: Identity, signing_region: SigningRegion, - signing_service: SigningService, + signing_name: SigningName, time: SharedTimeSource, } impl SigV4MessageSigner { pub(super) fn new( last_signature: String, - credentials: Credentials, + identity: Identity, signing_region: SigningRegion, - signing_service: SigningService, + signing_name: SigningName, time: SharedTimeSource, ) -> Self { Self { last_signature, - credentials, + identity, signing_region, - signing_service, + signing_name, time, } } - fn signing_params(&self) -> SigningParams<'_, ()> { - let mut builder = SigningParams::builder() - .access_key(self.credentials.access_key_id()) - .secret_key(self.credentials.secret_access_key()) + fn signing_params(&self) -> v4::SigningParams<'_, ()> { + let builder = v4::SigningParams::builder() + .identity(&self.identity) .region(self.signing_region.as_ref()) - .service_name(self.signing_service.as_ref()) + .name(self.signing_name.as_ref()) .time(self.time.now()) .settings(()); - builder.set_security_token(self.credentials.session_token()); builder.build().unwrap() } } @@ -445,7 +271,7 @@ mod event_stream { fn sign(&mut self, message: Message) -> Result { let (signed_message, signature) = { let params = self.signing_params(); - sign_message(&message, &self.last_signature, ¶ms).into_parts() + sign_message(&message, &self.last_signature, ¶ms)?.into_parts() }; self.last_signature = signature; Ok(signed_message) @@ -454,7 +280,9 @@ mod event_stream { fn sign_empty(&mut self) -> Option> { let (signed_message, signature) = { let params = self.signing_params(); - sign_empty_message(&self.last_signature, ¶ms).into_parts() + sign_empty_message(&self.last_signature, ¶ms) + .ok()? + .into_parts() }; self.last_signature = signature; Some(Ok(signed_message)) @@ -463,12 +291,15 @@ mod event_stream { #[cfg(test)] mod tests { - use super::*; + use crate::auth::sigv4::event_stream::SigV4MessageSigner; use aws_credential_types::Credentials; - use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; + use aws_smithy_async::time::SharedTimeSource; + use aws_smithy_eventstream::frame::SignMessage; + use aws_smithy_types::event_stream::{HeaderValue, Message}; + use aws_types::region::Region; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; use std::time::{Duration, UNIX_EPOCH}; fn check_send_sync(value: T) -> T { @@ -480,9 +311,9 @@ mod event_stream { let region = Region::new("us-east-1"); let mut signer = check_send_sync(SigV4MessageSigner::new( "initial-signature".into(), - Credentials::for_tests(), + Credentials::for_tests_with_session_token().into(), SigningRegion::from(region), - SigningService::from_static("transcribe"), + SigningName::from_static("transcribe"), SharedTimeSource::new(UNIX_EPOCH + Duration::new(1611160427, 0)), )); let mut signatures = Vec::new(); @@ -512,11 +343,13 @@ mod event_stream { #[cfg(test)] mod tests { use super::*; + use crate::auth::{HttpSignatureType, SigningOptions}; use aws_credential_types::Credentials; use aws_sigv4::http_request::SigningSettings; use aws_smithy_types::config_bag::Layer; + use aws_smithy_types::Document; use aws_types::region::SigningRegion; - use aws_types::SigningService; + use aws_types::SigningName; use std::collections::HashMap; use std::time::{Duration, SystemTime}; use tracing_test::traced_test; @@ -530,16 +363,17 @@ mod tests { let mut settings = SigningSettings::default(); settings.expires_in = Some(creds_expire_in - Duration::from_secs(10)); - let credentials = Credentials::new( + let identity = Credentials::new( "test-access-key", "test-secret-key", Some("test-session-token".into()), Some(now + creds_expire_in), "test", - ); + ) + .into(); let operation_config = SigV4OperationSigningConfig { region: Some(SigningRegion::from_static("test")), - service: Some(SigningService::from_static("test")), + name: Some(SigningName::from_static("test")), signing_options: SigningOptions { double_uri_encode: true, content_sha256_header: true, @@ -550,16 +384,15 @@ mod tests { expires_in: None, payload_override: None, }, + ..Default::default() }; - SigV4HttpRequestSigner::signing_params(settings, &credentials, &operation_config, now) - .unwrap(); + SigV4Signer::signing_params(settings, &identity, &operation_config, now).unwrap(); assert!(!logs_contain(EXPIRATION_WARNING)); let mut settings = SigningSettings::default(); settings.expires_in = Some(creds_expire_in + Duration::from_secs(10)); - SigV4HttpRequestSigner::signing_params(settings, &credentials, &operation_config, now) - .unwrap(); + SigV4Signer::signing_params(settings, &identity, &operation_config, now).unwrap(); assert!(logs_contain(EXPIRATION_WARNING)); } @@ -567,9 +400,9 @@ mod tests { fn endpoint_config_overrides_region_and_service() { let mut layer = Layer::new("test"); layer.store_put(SigV4OperationSigningConfig { - region: Some(SigningRegion::from(Region::new("override-this-region"))), - service: Some(SigningService::from_static("override-this-service")), - signing_options: Default::default(), + region: Some(SigningRegion::from_static("override-this-region")), + name: Some(SigningName::from_static("override-this-name")), + ..Default::default() }); let config = Document::Object({ let mut out = HashMap::new(); @@ -584,20 +417,16 @@ mod tests { ); out }); - let config = AuthSchemeEndpointConfig::new(Some(&config)); + let config = AuthSchemeEndpointConfig::from(Some(&config)); let cfg = ConfigBag::of_layers(vec![layer]); - let result = - SigV4HttpRequestSigner::extract_operation_config(config, &cfg).expect("success"); + let result = SigV4Signer::extract_operation_config(config, &cfg).expect("success"); assert_eq!( result.region, - Some(SigningRegion::from(Region::new("us-east-override"))) - ); - assert_eq!( - result.service, - Some(SigningService::from_static("qldb-override")) + Some(SigningRegion::from_static("us-east-override")) ); + assert_eq!(result.name, Some(SigningName::from_static("qldb-override"))); assert!(matches!(result, Cow::Owned(_))); } @@ -605,21 +434,17 @@ mod tests { fn endpoint_config_supports_fallback_when_region_or_service_are_unset() { let mut layer = Layer::new("test"); layer.store_put(SigV4OperationSigningConfig { - region: Some(SigningRegion::from(Region::new("us-east-1"))), - service: Some(SigningService::from_static("qldb")), - signing_options: Default::default(), + region: Some(SigningRegion::from_static("us-east-1")), + name: Some(SigningName::from_static("qldb")), + ..Default::default() }); let cfg = ConfigBag::of_layers(vec![layer]); let config = AuthSchemeEndpointConfig::empty(); - let result = - SigV4HttpRequestSigner::extract_operation_config(config, &cfg).expect("success"); + let result = SigV4Signer::extract_operation_config(config, &cfg).expect("success"); - assert_eq!( - result.region, - Some(SigningRegion::from(Region::new("us-east-1"))) - ); - assert_eq!(result.service, Some(SigningService::from_static("qldb"))); + assert_eq!(result.region, Some(SigningRegion::from_static("us-east-1"))); + assert_eq!(result.name, Some(SigningName::from_static("qldb"))); assert!(matches!(result, Cow::Borrowed(_))); } } diff --git a/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs new file mode 100644 index 00000000000..e22d913ee62 --- /dev/null +++ b/aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs @@ -0,0 +1,316 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::auth::{ + apply_signing_instructions, extract_endpoint_auth_scheme_signing_name, + SigV4OperationSigningConfig, SigV4SigningError, +}; +use aws_credential_types::Credentials; +use aws_sigv4::http_request::{sign, SignableBody, SignableRequest, SigningSettings}; +use aws_sigv4::sign::v4a; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::auth::{ + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign, +}; +use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; +use aws_smithy_types::config_bag::ConfigBag; +use aws_types::region::SigningRegionSet; +use aws_types::SigningName; +use std::borrow::Cow; +use std::time::SystemTime; + +const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ + `expires_in` duration because the credentials used to sign it will expire first."; + +/// Auth scheme ID for SigV4a. +pub const SCHEME_ID: AuthSchemeId = AuthSchemeId::new("sigv4a"); + +/// SigV4a auth scheme. +#[derive(Debug, Default)] +pub struct SigV4aAuthScheme { + signer: SigV4aSigner, +} + +impl SigV4aAuthScheme { + /// Creates a new `SigV4aHttpAuthScheme`. + pub fn new() -> Self { + Default::default() + } +} + +impl AuthScheme for SigV4aAuthScheme { + fn scheme_id(&self) -> AuthSchemeId { + SCHEME_ID + } + + fn identity_resolver( + &self, + identity_resolvers: &dyn GetIdentityResolver, + ) -> Option { + identity_resolvers.identity_resolver(self.scheme_id()) + } + + fn signer(&self) -> &dyn Sign { + &self.signer + } +} + +/// SigV4a HTTP request signer. +#[derive(Debug, Default)] +#[non_exhaustive] +pub struct SigV4aSigner; + +impl SigV4aSigner { + /// Creates a new signer instance. + pub fn new() -> Self { + Self + } + + fn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings { + super::settings(operation_config) + } + + fn signing_params<'a>( + settings: SigningSettings, + identity: &'a Identity, + operation_config: &'a SigV4OperationSigningConfig, + request_timestamp: SystemTime, + ) -> Result, SigV4SigningError> { + if let Some(expires_in) = settings.expires_in { + if let Some(identity_expiration) = identity.expiration() { + let presigned_expires_time = request_timestamp + expires_in; + if presigned_expires_time > identity_expiration { + tracing::warn!(EXPIRATION_WARNING); + } + } + } + + Ok(v4a::SigningParams::builder() + .identity(identity) + .region_set( + operation_config + .region_set + .as_ref() + .ok_or(SigV4SigningError::MissingSigningRegionSet)? + .as_ref(), + ) + .name( + operation_config + .name + .as_ref() + .ok_or(SigV4SigningError::MissingSigningName)? + .as_ref(), + ) + .time(request_timestamp) + .settings(settings) + .build() + .expect("all required fields set")) + } + + fn extract_operation_config<'a>( + auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'a>, + config_bag: &'a ConfigBag, + ) -> Result, SigV4SigningError> { + let operation_config = config_bag + .load::() + .ok_or(SigV4SigningError::MissingOperationSigningConfig)?; + + let name = extract_endpoint_auth_scheme_signing_name(&auth_scheme_endpoint_config)? + .or(config_bag.load::().cloned()); + + let region_set = + extract_endpoint_auth_scheme_signing_region_set(&auth_scheme_endpoint_config)? + .or(config_bag.load::().cloned()); + + match (region_set, name) { + (None, None) => Ok(Cow::Borrowed(operation_config)), + (region_set, name) => { + let mut operation_config = operation_config.clone(); + operation_config.region_set = region_set.or(operation_config.region_set); + operation_config.name = name.or(operation_config.name); + Ok(Cow::Owned(operation_config)) + } + } + } +} + +fn extract_endpoint_auth_scheme_signing_region_set( + endpoint_config: &AuthSchemeEndpointConfig<'_>, +) -> Result, SigV4SigningError> { + use aws_smithy_types::Document::Array; + use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType; + + match super::extract_field_from_endpoint_config("signingRegionSet", endpoint_config) { + Some(Array(docs)) => { + // The service defines the region set as a string array. Here, we convert it to a comma separated list. + let region_set: SigningRegionSet = + docs.iter().filter_map(|doc| doc.as_string()).collect(); + + Ok(Some(region_set)) + } + None => Ok(None), + _it => Err(UnexpectedType("signingRegionSet")), + } +} + +impl Sign for SigV4aSigner { + fn sign_http_request( + &self, + request: &mut HttpRequest, + identity: &Identity, + auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, + config_bag: &ConfigBag, + ) -> Result<(), BoxError> { + let operation_config = + Self::extract_operation_config(auth_scheme_endpoint_config, config_bag)?; + let request_time = runtime_components.time_source().unwrap_or_default().now(); + + if identity.data::().is_none() { + return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into()); + } + + let settings = Self::settings(&operation_config); + let signing_params = + Self::signing_params(settings, identity, &operation_config, request_time)?; + + let (signing_instructions, _signature) = { + // A body that is already in memory can be signed directly. A body that is not in memory + // (any sort of streaming body or presigned request) will be signed via UNSIGNED-PAYLOAD. + let signable_body = operation_config + .signing_options + .payload_override + .as_ref() + // the payload_override is a cheap clone because it contains either a + // reference or a short checksum (we're not cloning the entire body) + .cloned() + .unwrap_or_else(|| { + request + .body() + .bytes() + .map(SignableBody::Bytes) + .unwrap_or(SignableBody::UnsignedPayload) + }); + + let signable_request = SignableRequest::new( + request.method(), + request.uri().to_string(), + request.headers().iter(), + signable_body, + )?; + sign(signable_request, &signing_params.into())? + } + .into_parts(); + + apply_signing_instructions(signing_instructions, request)?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::{SigV4OperationSigningConfig, SigV4aSigner, EXPIRATION_WARNING}; + use crate::auth::{HttpSignatureType, SigningOptions}; + use aws_credential_types::Credentials; + use aws_sigv4::http_request::SigningSettings; + use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig; + use aws_smithy_types::config_bag::{ConfigBag, Layer}; + use aws_smithy_types::Document; + use aws_types::SigningName; + use std::borrow::Cow; + use std::collections::HashMap; + use std::time::{Duration, SystemTime}; + use tracing_test::traced_test; + + #[test] + #[traced_test] + fn expiration_warning() { + let now = SystemTime::UNIX_EPOCH + Duration::from_secs(1000); + let creds_expire_in = Duration::from_secs(100); + + let mut settings = SigningSettings::default(); + settings.expires_in = Some(creds_expire_in - Duration::from_secs(10)); + + let identity = Credentials::new( + "test-access-key", + "test-secret-key", + Some("test-session-token".into()), + Some(now + creds_expire_in), + "test", + ) + .into(); + let operation_config = SigV4OperationSigningConfig { + region_set: Some("test".into()), + name: Some(SigningName::from_static("test")), + signing_options: SigningOptions { + double_uri_encode: true, + content_sha256_header: true, + normalize_uri_path: true, + omit_session_token: true, + signature_type: HttpSignatureType::HttpRequestHeaders, + signing_optional: false, + expires_in: None, + payload_override: None, + }, + ..Default::default() + }; + SigV4aSigner::signing_params(settings, &identity, &operation_config, now).unwrap(); + assert!(!logs_contain(EXPIRATION_WARNING)); + + let mut settings = SigningSettings::default(); + settings.expires_in = Some(creds_expire_in + Duration::from_secs(10)); + + SigV4aSigner::signing_params(settings, &identity, &operation_config, now).unwrap(); + assert!(logs_contain(EXPIRATION_WARNING)); + } + + #[test] + fn endpoint_config_overrides_region_and_service() { + let mut layer = Layer::new("test"); + layer.store_put(SigV4OperationSigningConfig { + region_set: Some("test".into()), + name: Some(SigningName::from_static("override-this-service")), + ..Default::default() + }); + let config = Document::Object({ + let mut out = HashMap::new(); + out.insert("name".to_owned(), "sigv4a".to_owned().into()); + out.insert("signingName".to_owned(), "qldb-override".to_owned().into()); + out.insert( + "signingRegionSet".to_string(), + Document::Array(vec!["us-east-override".to_string().into()]), + ); + out + }); + let config = AuthSchemeEndpointConfig::from(Some(&config)); + + let cfg = ConfigBag::of_layers(vec![layer]); + let result = SigV4aSigner::extract_operation_config(config, &cfg).expect("success"); + + assert_eq!(result.region_set, Some("us-east-override".into())); + assert_eq!(result.name, Some(SigningName::from_static("qldb-override"))); + assert!(matches!(result, Cow::Owned(_))); + } + + #[test] + fn endpoint_config_supports_fallback_when_region_or_service_are_unset() { + let mut layer = Layer::new("test"); + layer.store_put(SigV4OperationSigningConfig { + region_set: Some("us-east-1".into()), + name: Some(SigningName::from_static("qldb")), + ..Default::default() + }); + let cfg = ConfigBag::of_layers(vec![layer]); + let config = AuthSchemeEndpointConfig::empty(); + + let result = SigV4aSigner::extract_operation_config(config, &cfg).expect("success"); + + assert_eq!(result.region_set, Some("us-east-1".into())); + assert_eq!(result.name, Some(SigningName::from_static("qldb"))); + assert!(matches!(result, Cow::Borrowed(_))); + } +} diff --git a/aws/rust-runtime/aws-runtime/src/identity.rs b/aws/rust-runtime/aws-runtime/src/identity.rs deleted file mode 100644 index 84e20d2afe6..00000000000 --- a/aws/rust-runtime/aws-runtime/src/identity.rs +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -/// Credentials-based identity support. -pub mod credentials { - use aws_credential_types::cache::SharedCredentialsCache; - use aws_smithy_runtime_api::box_error::BoxError; - use aws_smithy_runtime_api::client::identity::{Identity, IdentityResolver}; - use aws_smithy_runtime_api::client::orchestrator::Future; - use aws_smithy_types::config_bag::ConfigBag; - - /// Smithy identity resolver for AWS credentials. - #[derive(Debug)] - pub struct CredentialsIdentityResolver { - credentials_cache: SharedCredentialsCache, - } - - impl CredentialsIdentityResolver { - /// Creates a new `CredentialsIdentityResolver`. - pub fn new(credentials_cache: SharedCredentialsCache) -> Self { - Self { credentials_cache } - } - } - - impl IdentityResolver for CredentialsIdentityResolver { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { - let cache = self.credentials_cache.clone(); - Future::new(Box::pin(async move { - let credentials = cache.as_ref().provide_cached_credentials().await?; - let expiration = credentials.expiry(); - Result::<_, BoxError>::Ok(Identity::new(credentials, expiration)) - })) - } - } -} diff --git a/aws/rust-runtime/aws-runtime/src/invocation_id.rs b/aws/rust-runtime/aws-runtime/src/invocation_id.rs index 6a5c178757f..b64a621a15f 100644 --- a/aws/rust-runtime/aws-runtime/src/invocation_id.rs +++ b/aws/rust-runtime/aws-runtime/src/invocation_id.rs @@ -3,14 +3,17 @@ * SPDX-License-Identifier: Apache-2.0 */ +use std::fmt::Debug; +use std::sync::{Arc, Mutex}; + +use fastrand::Rng; +use http::{HeaderName, HeaderValue}; + use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use http::{HeaderName, HeaderValue}; -use std::fmt::Debug; -use uuid::Uuid; - #[cfg(feature = "test-util")] pub use test_util::{NoInvocationIdGenerator, PredefinedInvocationIdGenerator}; @@ -25,30 +28,63 @@ pub trait InvocationIdGenerator: Debug + Send + Sync { } /// Dynamic dispatch implementation of [`InvocationIdGenerator`] -#[derive(Debug)] -pub struct DynInvocationIdGenerator(Box); +#[derive(Clone, Debug)] +pub struct SharedInvocationIdGenerator(Arc); -impl DynInvocationIdGenerator { - /// Creates a new [`DynInvocationIdGenerator`]. +impl SharedInvocationIdGenerator { + /// Creates a new [`SharedInvocationIdGenerator`]. pub fn new(gen: impl InvocationIdGenerator + 'static) -> Self { - Self(Box::new(gen)) + Self(Arc::new(gen)) } } -impl InvocationIdGenerator for DynInvocationIdGenerator { +impl InvocationIdGenerator for SharedInvocationIdGenerator { fn generate(&self) -> Result, BoxError> { self.0.generate() } } -impl Storable for DynInvocationIdGenerator { +impl Storable for SharedInvocationIdGenerator { type Storer = StoreReplace; } +/// An invocation ID generator that uses random UUIDs for the invocation ID. +#[derive(Debug, Default)] +pub struct DefaultInvocationIdGenerator { + rng: Mutex, +} + +impl DefaultInvocationIdGenerator { + /// Creates a new [`DefaultInvocationIdGenerator`]. + pub fn new() -> Self { + Default::default() + } + + /// Creates a [`DefaultInvocationIdGenerator`] with the given seed. + pub fn with_seed(seed: u64) -> Self { + Self { + rng: Mutex::new(Rng::with_seed(seed)), + } + } +} + +impl InvocationIdGenerator for DefaultInvocationIdGenerator { + fn generate(&self) -> Result, BoxError> { + let mut rng = self.rng.lock().unwrap(); + let mut random_bytes = [0u8; 16]; + rng.fill(&mut random_bytes); + + let id = uuid::Builder::from_random_bytes(random_bytes).into_uuid(); + Ok(Some(InvocationId::new(id.to_string()))) + } +} + /// This interceptor generates a UUID and attaches it to all request attempts made as part of this operation. #[non_exhaustive] #[derive(Debug, Default)] -pub struct InvocationIdInterceptor {} +pub struct InvocationIdInterceptor { + default: DefaultInvocationIdGenerator, +} impl InvocationIdInterceptor { /// Creates a new `InvocationIdInterceptor` @@ -57,19 +93,24 @@ impl InvocationIdInterceptor { } } -impl Interceptor for InvocationIdInterceptor { +impl Intercept for InvocationIdInterceptor { + fn name(&self) -> &'static str { + "InvocationIdInterceptor" + } + fn modify_before_retry_loop( &self, _ctx: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let id = cfg - .load::() - .map(|gen| gen.generate()) - .transpose()? - .flatten(); - cfg.interceptor_state() - .store_put::(id.unwrap_or_default()); + let gen = cfg + .load::() + .map(|gen| gen as &dyn InvocationIdGenerator) + .unwrap_or(&self.default); + if let Some(id) = gen.generate()? { + cfg.interceptor_state().store_put::(id); + } Ok(()) } @@ -77,13 +118,13 @@ impl Interceptor for InvocationIdInterceptor { fn modify_before_transmit( &self, ctx: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let headers = ctx.request_mut().headers_mut(); - let id = cfg - .load::() - .ok_or("Expected an InvocationId in the ConfigBag but none was present")?; - headers.append(AMZ_SDK_INVOCATION_ID, id.0.clone()); + if let Some(id) = cfg.load::() { + headers.append(AMZ_SDK_INVOCATION_ID, id.0.clone()); + } Ok(()) } } @@ -93,21 +134,15 @@ impl Interceptor for InvocationIdInterceptor { pub struct InvocationId(HeaderValue); impl InvocationId { - /// Create a new, random, invocation ID. - pub fn new() -> Self { - Self::default() - } -} - -/// Defaults to a random UUID. -impl Default for InvocationId { - fn default() -> Self { - let id = Uuid::new_v4(); - let id = id - .to_string() - .parse() - .expect("UUIDs always produce a valid header value"); - Self(id) + /// Create an invocation ID with the given value. + /// + /// # Panics + /// This constructor will panic if the given invocation ID is not a valid HTTP header value. + pub fn new(invocation_id: String) -> Self { + Self( + HeaderValue::try_from(invocation_id) + .expect("invocation ID must be a valid HTTP header value"), + ) } } @@ -117,9 +152,10 @@ impl Storable for InvocationId { #[cfg(feature = "test-util")] mod test_util { - use super::*; use std::sync::{Arc, Mutex}; + use super::*; + impl InvocationId { /// Create a new invocation ID from a `&'static str`. pub fn new_from_str(uuid: &'static str) -> Self { @@ -178,28 +214,29 @@ mod test_util { #[cfg(test)] mod tests { - use crate::invocation_id::{InvocationId, InvocationIdInterceptor}; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::interceptors::context::{ - BeforeTransmitInterceptorContextMut, InterceptorContext, + BeforeTransmitInterceptorContextMut, Input, InterceptorContext, }; - use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::interceptors::Intercept; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::ConfigBag; - use aws_smithy_types::type_erasure::TypeErasedBox; - use http::HeaderValue; + + use super::*; fn expect_header<'a>( context: &'a BeforeTransmitInterceptorContextMut<'_>, header_name: &str, - ) -> &'a HeaderValue { + ) -> &'a str { context.request().headers().get(header_name).unwrap() } #[test] - fn test_id_is_generated_and_set() { - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + fn default_id_generator() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); @@ -207,10 +244,10 @@ mod tests { let interceptor = InvocationIdInterceptor::new(); let mut ctx = Into::into(&mut ctx); interceptor - .modify_before_retry_loop(&mut ctx, &mut cfg) + .modify_before_retry_loop(&mut ctx, &rc, &mut cfg) .unwrap(); interceptor - .modify_before_transmit(&mut ctx, &mut cfg) + .modify_before_transmit(&mut ctx, &rc, &mut cfg) .unwrap(); let expected = cfg.load::().expect("invocation ID was set"); @@ -219,4 +256,37 @@ mod tests { // UUID should include 32 chars and 4 dashes assert_eq!(header.len(), 36); } + + #[cfg(feature = "test-util")] + #[test] + fn custom_id_generator() { + use aws_smithy_types::config_bag::Layer; + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.enter_serialization_phase(); + ctx.set_request(HttpRequest::empty()); + let _ = ctx.take_input(); + ctx.enter_before_transmit_phase(); + + let mut cfg = ConfigBag::base(); + let mut layer = Layer::new("test"); + layer.store_put(SharedInvocationIdGenerator::new( + PredefinedInvocationIdGenerator::new(vec![InvocationId::new( + "the-best-invocation-id".into(), + )]), + )); + cfg.push_layer(layer); + + let interceptor = InvocationIdInterceptor::new(); + let mut ctx = Into::into(&mut ctx); + interceptor + .modify_before_retry_loop(&mut ctx, &rc, &mut cfg) + .unwrap(); + interceptor + .modify_before_transmit(&mut ctx, &rc, &mut cfg) + .unwrap(); + + let header = expect_header(&ctx, "amz-sdk-invocation-id"); + assert_eq!("the-best-invocation-id", header); + } } diff --git a/aws/rust-runtime/aws-runtime/src/lib.rs b/aws/rust-runtime/aws-runtime/src/lib.rs index a86f74d0563..085ec4fc975 100644 --- a/aws/rust-runtime/aws-runtime/src/lib.rs +++ b/aws/rust-runtime/aws-runtime/src/lib.rs @@ -16,9 +16,6 @@ /// Supporting code for authentication in the AWS SDK. pub mod auth; -/// Supporting code for identity in the AWS SDK. -pub mod identity; - /// Supporting code for recursion detection in the AWS SDK. pub mod recursion_detection; @@ -33,3 +30,6 @@ pub mod invocation_id; /// Supporting code for request metadata headers in the AWS SDK. pub mod request_info; + +/// Interceptor that determines the clock skew between the client and service. +pub mod service_clock_skew; diff --git a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs index c8b28b07b49..21239e9c3ba 100644 --- a/aws/rust-runtime/aws-runtime/src/recursion_detection.rs +++ b/aws/rust-runtime/aws-runtime/src/recursion_detection.rs @@ -5,7 +5,8 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_types::os_shim_internal::Env; use http::HeaderValue; @@ -38,10 +39,15 @@ impl RecursionDetectionInterceptor { } } -impl Interceptor for RecursionDetectionInterceptor { +impl Intercept for RecursionDetectionInterceptor { + fn name(&self) -> &'static str { + "RecursionDetectionInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let request = context.request_mut(); @@ -72,10 +78,10 @@ fn encode_header(value: &[u8]) -> HeaderValue { #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; use aws_smithy_protocol_test::{assert_ok, validate_headers}; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_types::type_erasure::TypeErasedBox; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::body::SdkBody; use aws_types::os_shim_internal::Env; use http::HeaderValue; use proptest::{prelude::*, proptest}; @@ -142,13 +148,18 @@ mod tests { } fn check(test_case: TestCase) { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let env = test_case.env(); let mut request = http::Request::builder(); for (name, value) in test_case.request_headers_before() { request = request.header(name, value); } - let request = request.body(SdkBody::empty()).expect("must be valid"); - let mut context = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let request = request + .body(SdkBody::empty()) + .expect("must be valid") + .try_into() + .unwrap(); + let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); context.set_request(request); let _ = context.take_input(); @@ -157,12 +168,12 @@ mod tests { let mut ctx = Into::into(&mut context); RecursionDetectionInterceptor { env } - .modify_before_signing(&mut ctx, &mut config) + .modify_before_signing(&mut ctx, &rc, &mut config) .expect("interceptor must succeed"); let mutated_request = context.request().expect("request is set"); - for name in mutated_request.headers().keys() { + for (name, _) in mutated_request.headers() { assert_eq!( - mutated_request.headers().get_all(name).iter().count(), + mutated_request.headers().get_all(name).count(), 1, "No duplicated headers" ) diff --git a/aws/rust-runtime/aws-runtime/src/request_info.rs b/aws/rust-runtime/aws-runtime/src/request_info.rs index d2ea28cc35d..b07c3479d70 100644 --- a/aws/rust-runtime/aws-runtime/src/request_info.rs +++ b/aws/rust-runtime/aws-runtime/src/request_info.rs @@ -3,11 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime::client::orchestrator::interceptors::ServiceClockSkew; +use crate::service_clock_skew::ServiceClockSkew; +use aws_smithy_async::time::TimeSource; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; -use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::retries::RequestAttempts; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::date_time::Format; use aws_smithy_types::retry::RetryConfig; @@ -15,7 +17,7 @@ use aws_smithy_types::timeout::TimeoutConfig; use aws_smithy_types::DateTime; use http::{HeaderName, HeaderValue}; use std::borrow::Cow; -use std::time::{Duration, SystemTime}; +use std::time::Duration; #[allow(clippy::declare_interior_mutable_const)] // we will never mutate this const AMZ_SDK_REQUEST: HeaderName = HeaderName::from_static("amz-sdk-request"); @@ -62,11 +64,15 @@ impl RequestInfoInterceptor { } } - fn build_ttl_pair(&self, cfg: &ConfigBag) -> Option<(Cow<'static, str>, Cow<'static, str>)> { + fn build_ttl_pair( + &self, + cfg: &ConfigBag, + timesource: impl TimeSource, + ) -> Option<(Cow<'static, str>, Cow<'static, str>)> { let timeout_config = cfg.load::()?; let socket_read = timeout_config.read_timeout()?; let estimated_skew: Duration = cfg.load::().cloned()?.into(); - let current_time = SystemTime::now(); + let current_time = timesource.now(); let ttl = current_time.checked_add(socket_read + estimated_skew)?; let mut timestamp = DateTime::from(ttl); // Set subsec_nanos to 0 so that the formatted `DateTime` won't have fractional seconds. @@ -85,14 +91,24 @@ impl RequestInfoInterceptor { } } -impl Interceptor for RequestInfoInterceptor { +impl Intercept for RequestInfoInterceptor { + fn name(&self) -> &'static str { + "RequestInfoInterceptor" + } + fn modify_before_transmit( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let mut pairs = RequestPairs::new(); - if let Some(pair) = self.build_ttl_pair(cfg) { + if let Some(pair) = self.build_ttl_pair( + cfg, + runtime_components + .time_source() + .ok_or("A timesource must be provided")?, + ) { pairs = pairs.with_pair(pair); } if let Some(pair) = self.build_attempts_pair(cfg) { @@ -113,19 +129,19 @@ impl Interceptor for RequestInfoInterceptor { /// retry information header that is sent with every request. The information conveyed by this /// header allows services to anticipate whether a client will time out or retry a request. #[derive(Default, Debug)] -pub struct RequestPairs { +struct RequestPairs { inner: Vec<(Cow<'static, str>, Cow<'static, str>)>, } impl RequestPairs { /// Creates a new `RequestPairs` builder. - pub fn new() -> Self { + fn new() -> Self { Default::default() } /// Adds a pair to the `RequestPairs` builder. /// Only strings that can be converted to header values are considered valid. - pub fn with_pair( + fn with_pair( mut self, pair: (impl Into>, impl Into>), ) -> Self { @@ -135,7 +151,7 @@ impl RequestPairs { } /// Converts the `RequestPairs` builder into a `HeaderValue`. - pub fn try_into_header_value(self) -> Result { + fn try_into_header_value(self) -> Result { self.try_into() } } @@ -163,13 +179,15 @@ impl TryFrom for HeaderValue { mod tests { use super::RequestInfoInterceptor; use crate::request_info::RequestPairs; - use aws_smithy_http::body::SdkBody; + use aws_smithy_runtime_api::client::interceptors::context::Input; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::interceptors::Intercept; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; - use aws_smithy_types::type_erasure::TypeErasedBox; + use http::HeaderValue; use std::time::Duration; @@ -180,15 +198,14 @@ mod tests { .headers() .get(header_name) .unwrap() - .to_str() - .unwrap() } #[test] fn test_request_pairs_for_initial_attempt() { - let mut context = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); - context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + context.set_request(HttpRequest::empty()); let mut layer = Layer::new("test"); layer.store_put(RetryConfig::standard()); @@ -204,7 +221,7 @@ mod tests { let interceptor = RequestInfoInterceptor::new(); let mut ctx = (&mut context).into(); interceptor - .modify_before_transmit(&mut ctx, &mut config) + .modify_before_transmit(&mut ctx, &rc, &mut config) .unwrap(); assert_eq!( diff --git a/aws/rust-runtime/aws-runtime/src/retries.rs b/aws/rust-runtime/aws-runtime/src/retries.rs index ed12aa9cde6..acefc98028f 100644 --- a/aws/rust-runtime/aws-runtime/src/retries.rs +++ b/aws/rust-runtime/aws-runtime/src/retries.rs @@ -4,4 +4,4 @@ */ /// Classifiers that can inspect a response and determine if it should be retried. -pub mod classifier; +pub mod classifiers; diff --git a/aws/rust-runtime/aws-runtime/src/retries/classifier.rs b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs similarity index 51% rename from aws/rust-runtime/aws-runtime/src/retries/classifier.rs rename to aws/rust-runtime/aws-runtime/src/retries/classifiers.rs index 5a7675dba24..9655bec82b3 100644 --- a/aws/rust-runtime/aws-runtime/src/retries/classifier.rs +++ b/aws/rust-runtime/aws-runtime/src/retries/classifiers.rs @@ -3,10 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::http::HttpHeaders; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; +use aws_smithy_runtime_api::client::retries::classifiers::{ + ClassifyRetry, RetryAction, RetryClassifierPriority, RetryReason, +}; use aws_smithy_types::error::metadata::ProvideErrorMetadata; use aws_smithy_types::retry::ErrorKind; use std::error::Error as StdError; @@ -52,88 +53,73 @@ impl ClassifyRetry for AwsErrorCodeClassifier where E: StdError + ProvideErrorMetadata + Send + Sync + 'static, { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - let error = ctx - .output_or_error()? - .err() - .and_then(OrchestratorError::as_operation_error)? - .downcast_ref::()?; - - if let Some(error_code) = error.code() { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + let retry_after = ctx + .response() + .and_then(|res| res.headers().get("x-amz-retry-after")) + .and_then(|header| header.parse::().ok()) + .map(std::time::Duration::from_millis); + + let error_code = OrchestratorError::as_operation_error(error) + .and_then(|err| err.downcast_ref::()) + .and_then(|err| err.code()); + + if let Some(error_code) = error_code { if THROTTLING_ERRORS.contains(&error_code) { - return Some(RetryReason::Error(ErrorKind::ThrottlingError)); - } else if TRANSIENT_ERRORS.contains(&error_code) { - return Some(RetryReason::Error(ErrorKind::TransientError)); + return RetryAction::RetryIndicated(RetryReason::RetryableError { + kind: ErrorKind::ThrottlingError, + retry_after, + }); + } + if TRANSIENT_ERRORS.contains(&error_code) { + return RetryAction::RetryIndicated(RetryReason::RetryableError { + kind: ErrorKind::TransientError, + retry_after, + }); } }; - None + debug_assert!( + retry_after.is_none(), + "retry_after should be None if the error wasn't an identifiable AWS error" + ); + + RetryAction::NoActionIndicated } fn name(&self) -> &'static str { "AWS Error Code" } -} - -/// A retry classifier that checks for `x-amz-retry-after` headers. If one is found, a -/// [`RetryReason::Explicit`] is returned containing the duration to wait before retrying. -#[derive(Debug, Default)] -pub struct AmzRetryAfterHeaderClassifier; - -impl AmzRetryAfterHeaderClassifier { - /// Create a new `AmzRetryAfterHeaderClassifier`. - pub fn new() -> Self { - Self - } -} -impl ClassifyRetry for AmzRetryAfterHeaderClassifier { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - ctx.response() - .and_then(|res| res.http_headers().get("x-amz-retry-after")) - .and_then(|header| header.to_str().ok()) - .and_then(|header| header.parse::().ok()) - .map(|retry_after_delay| { - RetryReason::Explicit(std::time::Duration::from_millis(retry_after_delay)) - }) - } - - fn name(&self) -> &'static str { - "'Retry After' Header" + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::with_lower_priority_than( + RetryClassifierPriority::modeled_as_retryable_classifier(), + ) } } #[cfg(test)] mod test { - use super::*; - use aws_smithy_http::body::SdkBody; + use crate::retries::classifiers::AwsErrorCodeClassifier; + use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + use aws_smithy_runtime_api::client::interceptors::context::{Error, Input}; + use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::error::metadata::ProvideErrorMetadata; use aws_smithy_types::error::ErrorMetadata; - use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; - use aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError}; + use aws_smithy_types::retry::ErrorKind; use std::fmt; use std::time::Duration; - #[derive(Debug)] - struct UnmodeledError; - - impl fmt::Display for UnmodeledError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "UnmodeledError") - } - } - - impl std::error::Error for UnmodeledError {} - - impl ProvideErrorKind for UnmodeledError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - None - } - } - #[derive(Debug)] struct CodedError { metadata: ErrorMetadata, @@ -164,59 +150,52 @@ mod test { #[test] fn classify_by_error_code() { let policy = AwsErrorCodeClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new( + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( CodedError::new("Throttling"), )))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::ThrottlingError)) - ); + assert_eq!(policy.classify_retry(&ctx), RetryAction::throttling_error()); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new( + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( CodedError::new("RequestTimeout"), )))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::TransientError)) - ) + assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error()) } #[test] fn classify_generic() { let policy = AwsErrorCodeClassifier::::new(); - let err = aws_smithy_types::Error::builder().code("SlowDown").build(); + let err = ErrorMetadata::builder().code("SlowDown").build(); let test_response = http::Response::new("OK").map(SdkBody::from); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_response(test_response); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new(err)))); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_response(test_response.try_into().unwrap()); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::ThrottlingError)) - ); + assert_eq!(policy.classify_retry(&ctx), RetryAction::throttling_error()); } #[test] fn test_retry_after_header() { - let policy = AmzRetryAfterHeaderClassifier; + let policy = AwsErrorCodeClassifier::::new(); + let err = ErrorMetadata::builder().code("SlowDown").build(); let res = http::Response::builder() .header("x-amz-retry-after", "5000") .body("retry later") .unwrap() .map(SdkBody::from); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_response(res); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new( - UnmodeledError, - )))); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_response(res.try_into().unwrap()); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); assert_eq!( policy.classify_retry(&ctx), - Some(RetryReason::Explicit(Duration::from_millis(5000))), + RetryAction::retryable_error_with_explicit_delay( + ErrorKind::ThrottlingError, + Duration::from_secs(5) + ) ); } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs similarity index 74% rename from rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs rename to aws/rust-runtime/aws-runtime/src/service_clock_skew.rs index 7a41de659ac..45a4f22e2af 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors/service_clock_skew.rs +++ b/aws/rust-runtime/aws-runtime/src/service_clock_skew.rs @@ -5,15 +5,17 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeDeserializationInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use aws_smithy_types::date_time::Format; use aws_smithy_types::DateTime; -use std::time::{Duration, SystemTime}; +use std::time::Duration; +/// Amount of clock skew between the client and the service. #[derive(Debug, Clone)] #[non_exhaustive] -pub struct ServiceClockSkew { +pub(crate) struct ServiceClockSkew { inner: Duration, } @@ -21,10 +23,6 @@ impl ServiceClockSkew { fn new(inner: Duration) -> Self { Self { inner } } - - pub fn skew(&self) -> Duration { - self.inner - } } impl Storable for ServiceClockSkew { @@ -37,11 +35,13 @@ impl From for Duration { } } +/// Interceptor that determines the clock skew between the client and service. #[derive(Debug, Default)] #[non_exhaustive] -pub struct ServiceClockSkewInterceptor {} +pub struct ServiceClockSkewInterceptor; impl ServiceClockSkewInterceptor { + /// Creates a new `ServiceClockSkewInterceptor`. pub fn new() -> Self { Self::default() } @@ -59,18 +59,27 @@ fn extract_time_sent_from_response( .response() .headers() .get("date") - .ok_or("Response from server does not include a `date` header")? - .to_str()?; + .ok_or("Response from server does not include a `date` header")?; DateTime::from_str(date_header, Format::HttpDate).map_err(Into::into) } -impl Interceptor for ServiceClockSkewInterceptor { +impl Intercept for ServiceClockSkewInterceptor { + fn name(&self) -> &'static str { + "ServiceClockSkewInterceptor" + } + fn modify_before_deserialization( &self, ctx: &mut BeforeDeserializationInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let time_received = DateTime::from(SystemTime::now()); + let time_received = DateTime::from( + runtime_components + .time_source() + .ok_or("a time source is required (service clock skew)")? + .now(), + ); let time_sent = match extract_time_sent_from_response(ctx) { Ok(time_sent) => time_sent, Err(e) => { diff --git a/aws/rust-runtime/aws-runtime/src/user_agent.rs b/aws/rust-runtime/aws-runtime/src/user_agent.rs index 3527fbe5828..bf4564acecb 100644 --- a/aws/rust-runtime/aws-runtime/src/user_agent.rs +++ b/aws/rust-runtime/aws-runtime/src/user_agent.rs @@ -6,7 +6,8 @@ use aws_http::user_agent::{ApiMetadata, AwsUserAgent}; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_types::app_name::AppName; use aws_types::os_shim_internal::Env; @@ -70,31 +71,36 @@ fn header_values( )) } -impl Interceptor for UserAgentInterceptor { +impl Intercept for UserAgentInterceptor { + fn name(&self) -> &'static str { + "UserAgentInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let api_metadata = cfg - .load::() - .ok_or(UserAgentInterceptorError::MissingApiMetadata)?; - // Allow for overriding the user agent by an earlier interceptor (so, for example, // tests can use `AwsUserAgent::for_tests()`) by attempting to grab one out of the // config bag before creating one. let ua: Cow<'_, AwsUserAgent> = cfg .load::() .map(Cow::Borrowed) + .map(Result::<_, UserAgentInterceptorError>::Ok) .unwrap_or_else(|| { + let api_metadata = cfg + .load::() + .ok_or(UserAgentInterceptorError::MissingApiMetadata)?; let mut ua = AwsUserAgent::new_from_environment(Env::real(), api_metadata.clone()); let maybe_app_name = cfg.load::(); if let Some(app_name) = maybe_app_name { ua.set_app_name(app_name.clone()); } - Cow::Owned(ua) - }); + Ok(Cow::Owned(ua)) + })?; let headers = context.request_mut().headers_mut(); let (user_agent, x_amz_user_agent) = header_values(&ua)?; @@ -107,12 +113,12 @@ impl Interceptor for UserAgentInterceptor { #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_runtime_api::client::interceptors::Interceptor; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; + use aws_smithy_runtime_api::client::interceptors::Intercept; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::{ConfigBag, Layer}; use aws_smithy_types::error::display::DisplayErrorContext; - use aws_smithy_types::type_erasure::TypeErasedBox; fn expect_header<'a>(context: &'a InterceptorContext, header_name: &str) -> &'a str { context @@ -121,14 +127,12 @@ mod tests { .headers() .get(header_name) .unwrap() - .to_str() - .unwrap() } fn context() -> InterceptorContext { - let mut context = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let mut context = InterceptorContext::new(Input::doesnt_matter()); context.enter_serialization_phase(); - context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + context.set_request(HttpRequest::empty()); let _ = context.take_input(); context.enter_before_transmit_phase(); context @@ -136,6 +140,7 @@ mod tests { #[test] fn test_overridden_ua() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = context(); let mut layer = Layer::new("test"); @@ -146,7 +151,7 @@ mod tests { let interceptor = UserAgentInterceptor::new(); let mut ctx = Into::into(&mut context); interceptor - .modify_before_signing(&mut ctx, &mut cfg) + .modify_before_signing(&mut ctx, &rc, &mut cfg) .unwrap(); let header = expect_header(&context, "user-agent"); @@ -161,6 +166,7 @@ mod tests { #[test] fn test_default_ua() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = context(); let api_metadata = ApiMetadata::new("some-service", "some-version"); @@ -171,7 +177,7 @@ mod tests { let interceptor = UserAgentInterceptor::new(); let mut ctx = Into::into(&mut context); interceptor - .modify_before_signing(&mut ctx, &mut config) + .modify_before_signing(&mut ctx, &rc, &mut config) .unwrap(); let expected_ua = AwsUserAgent::new_from_environment(Env::real(), api_metadata); @@ -191,6 +197,7 @@ mod tests { #[test] fn test_app_name() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = context(); let api_metadata = ApiMetadata::new("some-service", "some-version"); @@ -202,7 +209,7 @@ mod tests { let interceptor = UserAgentInterceptor::new(); let mut ctx = Into::into(&mut context); interceptor - .modify_before_signing(&mut ctx, &mut config) + .modify_before_signing(&mut ctx, &rc, &mut config) .unwrap(); let app_value = "app/my_awesome_app"; @@ -221,6 +228,7 @@ mod tests { #[test] fn test_api_metadata_missing() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); let mut context = context(); let mut config = ConfigBag::base(); @@ -231,7 +239,7 @@ mod tests { "{}", DisplayErrorContext( &*interceptor - .modify_before_signing(&mut ctx, &mut config) + .modify_before_signing(&mut ctx, &rc, &mut config) .expect_err("it should error") ) ); @@ -240,4 +248,30 @@ mod tests { "`{error}` should contain message `This is a bug`" ); } + + #[test] + fn test_api_metadata_missing_with_ua_override() { + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let mut context = context(); + + let mut layer = Layer::new("test"); + layer.store_put(AwsUserAgent::for_tests()); + let mut config = ConfigBag::of_layers(vec![layer]); + + let interceptor = UserAgentInterceptor::new(); + let mut ctx = Into::into(&mut context); + + interceptor + .modify_before_signing(&mut ctx, &rc, &mut config) + .expect("it should succeed"); + + let header = expect_header(&context, "user-agent"); + assert_eq!(AwsUserAgent::for_tests().ua_header(), header); + assert!(!header.contains("unused")); + + assert_eq!( + AwsUserAgent::for_tests().aws_ua_header(), + expect_header(&context, "x-amz-user-agent") + ); + } } diff --git a/aws/rust-runtime/aws-sig-auth/Cargo.toml b/aws/rust-runtime/aws-sig-auth/Cargo.toml index deece1ac304..56909a48113 100644 --- a/aws/rust-runtime/aws-sig-auth/Cargo.toml +++ b/aws/rust-runtime/aws-sig-auth/Cargo.toml @@ -2,30 +2,10 @@ name = "aws-sig-auth" version = "0.0.0-smithy-rs-head" authors = ["AWS Rust SDK Team ", "Russell Cohen "] -description = "SigV4 signing middleware for the AWS SDK." +description = "This crate is no longer used by the AWS SDK and is deprecated." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" - -[features] -sign-eventstream = ["aws-smithy-eventstream", "aws-sigv4/sign-eventstream"] - -[dependencies] -aws-credential-types = { path = "../aws-credential-types" } -aws-sigv4 = { path = "../aws-sigv4" } -aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } -aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async" } -aws-types = { path = "../aws-types" } -http = "0.2.2" -tracing = "0.1" - -[dev-dependencies] -aws-credential-types = { path = "../aws-credential-types", features = ["test-util"] } -aws-endpoint = { path = "../aws-endpoint" } -aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } -tracing-test = "0.2.4" -aws-smithy-async = { path = "../../../rust-runtime/aws-smithy-async", features = ["test-util"] } +repository = "https://github.com/smithy-lang/smithy-rs" [package.metadata.docs.rs] all-features = true diff --git a/aws/rust-runtime/aws-sig-auth/README.md b/aws/rust-runtime/aws-sig-auth/README.md index 1a579b0fe67..c05b9fca2bb 100644 --- a/aws/rust-runtime/aws-sig-auth/README.md +++ b/aws/rust-runtime/aws-sig-auth/README.md @@ -1,8 +1,7 @@ # aws-sig-auth -This crate implements a standalone request signer for AWS services. For examples, -see [docs.rs](https://docs.rs/aws-sig-auth). +This crate is no longer used by the AWS SDK and is deprecated. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-sig-auth/external-types.toml b/aws/rust-runtime/aws-sig-auth/external-types.toml index 46ed02af47e..d6bdad471f1 100644 --- a/aws/rust-runtime/aws-sig-auth/external-types.toml +++ b/aws/rust-runtime/aws-sig-auth/external-types.toml @@ -3,9 +3,11 @@ allowed_external_types = [ "aws_sigv4::http_request::sign::SignableBody", "aws_sigv4::http_request::error::SigningError", "aws_smithy_http::*", + "aws_smithy_types::body::SdkBody", "aws_types::*", "http::request::Request", + "aws_smithy_runtime_api::client::identity::Identity", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::frame::SignMessage", ] diff --git a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs b/aws/rust-runtime/aws-sig-auth/src/event_stream.rs deleted file mode 100644 index 01a1dd55fac..00000000000 --- a/aws/rust-runtime/aws-sig-auth/src/event_stream.rs +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// TODO(enableNewSmithyRuntimeCleanup): Remove this blanket allow once the old implementations are deleted -#![allow(deprecated)] - -use crate::middleware::Signature; -use aws_credential_types::Credentials; -use aws_sigv4::event_stream::{sign_empty_message, sign_message}; -use aws_sigv4::SigningParams; -use aws_smithy_eventstream::frame::{Message, SignMessage, SignMessageError}; -use aws_smithy_http::property_bag::{PropertyBag, SharedPropertyBag}; -use aws_types::region::SigningRegion; -use aws_types::SigningService; -use std::time::SystemTime; - -/// Event Stream SigV4 signing implementation. -#[derive(Debug)] -pub struct SigV4MessageSigner { - last_signature: String, - credentials: Credentials, - signing_region: SigningRegion, - signing_service: SigningService, - time: Option, -} - -impl SigV4MessageSigner { - pub fn new( - last_signature: String, - credentials: Credentials, - signing_region: SigningRegion, - signing_service: SigningService, - time: Option, - ) -> Self { - Self { - last_signature, - credentials, - signing_region, - signing_service, - time, - } - } - - fn signing_params(&self) -> SigningParams<()> { - let mut builder = SigningParams::builder() - .access_key(self.credentials.access_key_id()) - .secret_key(self.credentials.secret_access_key()) - .region(self.signing_region.as_ref()) - .service_name(self.signing_service.as_ref()) - .time(self.time.unwrap_or_else(SystemTime::now)) - .settings(()); - builder.set_security_token(self.credentials.session_token()); - builder.build().unwrap() - } -} - -impl SignMessage for SigV4MessageSigner { - fn sign(&mut self, message: Message) -> Result { - let (signed_message, signature) = { - let params = self.signing_params(); - sign_message(&message, &self.last_signature, ¶ms).into_parts() - }; - self.last_signature = signature; - Ok(signed_message) - } - - fn sign_empty(&mut self) -> Option> { - let (signed_message, signature) = { - let params = self.signing_params(); - sign_empty_message(&self.last_signature, ¶ms).into_parts() - }; - self.last_signature = signature; - Some(Ok(signed_message)) - } -} - -#[cfg(test)] -mod tests { - use crate::event_stream::SigV4MessageSigner; - use aws_credential_types::Credentials; - use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; - use aws_types::region::Region; - use aws_types::region::SigningRegion; - use aws_types::SigningService; - use std::time::{Duration, UNIX_EPOCH}; - - fn check_send_sync(value: T) -> T { - value - } - - #[test] - fn sign_message() { - let region = Region::new("us-east-1"); - let mut signer = check_send_sync(SigV4MessageSigner::new( - "initial-signature".into(), - Credentials::for_tests(), - SigningRegion::from(region), - SigningService::from_static("transcribe"), - Some(UNIX_EPOCH + Duration::new(1611160427, 0)), - )); - let mut signatures = Vec::new(); - for _ in 0..5 { - let signed = signer - .sign(Message::new(&b"identical message"[..])) - .unwrap(); - if let HeaderValue::ByteArray(signature) = signed - .headers() - .iter() - .find(|h| h.name().as_str() == ":chunk-signature") - .unwrap() - .value() - { - signatures.push(signature.clone()); - } else { - panic!("failed to get the :chunk-signature") - } - } - for i in 1..signatures.len() { - assert_ne!(signatures[i - 1], signatures[i]); - } - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete this old implementation that was kept around to support patch releases. -#[deprecated = "use aws_sig_auth::event_stream::SigV4MessageSigner instead (this may require upgrading the smithy-rs code generator)"] -#[derive(Debug)] -/// Event Stream SigV4 signing implementation. -pub struct SigV4Signer { - properties: SharedPropertyBag, - last_signature: Option, -} - -impl SigV4Signer { - pub fn new(properties: SharedPropertyBag) -> Self { - Self { - properties, - last_signature: None, - } - } - - fn signing_params(properties: &PropertyBag) -> SigningParams<()> { - // Every single one of these values would have been retrieved during the initial request, - // so we can safely assume they all exist in the property bag at this point. - let credentials = properties.get::().unwrap(); - let region = properties.get::().unwrap(); - let signing_service = properties.get::().unwrap(); - let time = properties - .get::() - .copied() - .unwrap_or_else(SystemTime::now); - let mut builder = SigningParams::builder() - .access_key(credentials.access_key_id()) - .secret_key(credentials.secret_access_key()) - .region(region.as_ref()) - .service_name(signing_service.as_ref()) - .time(time) - .settings(()); - builder.set_security_token(credentials.session_token()); - builder.build().unwrap() - } -} - -impl SignMessage for SigV4Signer { - fn sign(&mut self, message: Message) -> Result { - let properties = self.properties.acquire(); - if self.last_signature.is_none() { - // The Signature property should exist in the property bag for all Event Stream requests. - self.last_signature = Some( - properties - .get::() - .expect("property bag contains initial Signature") - .as_ref() - .into(), - ) - } - - let (signed_message, signature) = { - let params = Self::signing_params(&properties); - sign_message(&message, self.last_signature.as_ref().unwrap(), ¶ms).into_parts() - }; - self.last_signature = Some(signature); - Ok(signed_message) - } - - fn sign_empty(&mut self) -> Option> { - let properties = self.properties.acquire(); - if self.last_signature.is_none() { - // The Signature property should exist in the property bag for all Event Stream requests. - self.last_signature = Some(properties.get::().unwrap().as_ref().into()) - } - let (signed_message, signature) = { - let params = Self::signing_params(&properties); - sign_empty_message(self.last_signature.as_ref().unwrap(), ¶ms).into_parts() - }; - self.last_signature = Some(signature); - Some(Ok(signed_message)) - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete this old implementation that was kept around to support patch releases. -#[cfg(test)] -mod old_tests { - use crate::event_stream::SigV4Signer; - use crate::middleware::Signature; - use aws_credential_types::Credentials; - use aws_smithy_eventstream::frame::{HeaderValue, Message, SignMessage}; - use aws_smithy_http::property_bag::PropertyBag; - use aws_types::region::Region; - use aws_types::region::SigningRegion; - use aws_types::SigningService; - use std::time::{Duration, UNIX_EPOCH}; - - #[test] - fn sign_message() { - let region = Region::new("us-east-1"); - let mut properties = PropertyBag::new(); - properties.insert(region.clone()); - properties.insert(UNIX_EPOCH + Duration::new(1611160427, 0)); - properties.insert(SigningService::from_static("transcribe")); - properties.insert(Credentials::for_tests()); - properties.insert(SigningRegion::from(region)); - properties.insert(Signature::new("initial-signature".into())); - - let mut signer = SigV4Signer::new(properties.into()); - let mut signatures = Vec::new(); - for _ in 0..5 { - let signed = signer - .sign(Message::new(&b"identical message"[..])) - .unwrap(); - if let HeaderValue::ByteArray(signature) = signed - .headers() - .iter() - .find(|h| h.name().as_str() == ":chunk-signature") - .unwrap() - .value() - { - signatures.push(signature.clone()); - } else { - panic!("failed to get the :chunk-signature") - } - } - for i in 1..signatures.len() { - assert_ne!(signatures[i - 1], signatures[i]); - } - } -} diff --git a/aws/rust-runtime/aws-sig-auth/src/lib.rs b/aws/rust-runtime/aws-sig-auth/src/lib.rs index 643b3ff216b..2819d851189 100644 --- a/aws/rust-runtime/aws-sig-auth/src/lib.rs +++ b/aws/rust-runtime/aws-sig-auth/src/lib.rs @@ -3,114 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -#![allow(clippy::derive_partial_eq_without_eq)] - -//! AWS Signature Authentication Package -//! -//! This crate may be used to generate presigned URLs for unmodeled behavior such as `rds-iam-token` -//! or to sign requests to APIGateway-based services with IAM authorization. -//! -//! # Examples -//! -//! ## Generate RDS IAM Token -//! ```rust -//! use aws_credential_types::Credentials; -//! use aws_smithy_http::body::SdkBody; -//! use aws_types::SigningService; -//! use aws_types::region::{Region, SigningRegion}; -//! use std::time::{Duration, SystemTime, UNIX_EPOCH}; -//! use aws_sig_auth::signer::{self, SigningError, OperationSigningConfig, HttpSignatureType, RequestConfig}; -//! -//! fn generate_rds_iam_token( -//! db_hostname: &str, -//! region: Region, -//! port: u16, -//! db_username: &str, -//! credentials: &Credentials, -//! timestamp: SystemTime, -//! ) -> Result { -//! let signer = signer::SigV4Signer::new(); -//! let mut operation_config = OperationSigningConfig::default_config(); -//! operation_config.signature_type = HttpSignatureType::HttpRequestQueryParams; -//! operation_config.expires_in = Some(Duration::from_secs(15 * 60)); -//! let request_config = RequestConfig { -//! request_ts: timestamp, -//! region: &SigningRegion::from(region), -//! service: &SigningService::from_static("rds-db"), -//! payload_override: None, -//! }; -//! let mut request = http::Request::builder() -//! .uri(format!( -//! "http://{db_hostname}:{port}/?Action=connect&DBUser={db_user}", -//! db_hostname = db_hostname, -//! port = port, -//! db_user = db_username -//! )) -//! .body(SdkBody::empty()) -//! .expect("valid request"); -//! let _signature = signer.sign( -//! &operation_config, -//! &request_config, -//! &credentials, -//! &mut request, -//! )?; -//! let mut uri = request.uri().to_string(); -//! assert!(uri.starts_with("http://")); -//! let uri = uri.split_off("http://".len()); -//! Ok(uri) -//! } -//! -//! // You will need to get `credentials` from a credentials provider ahead of time -//! # let credentials = Credentials::new("AKIDEXAMPLE", "secret", None, None, "example"); -//! let token = generate_rds_iam_token( -//! "prod-instance.us-east-1.rds.amazonaws.com", -//! Region::from_static("us-east-1"), -//! 3306, -//! "dbuser", -//! &credentials, -//! // this value is hard coded to create deterministic signature for tests. Generally, -//! // `SystemTime::now()` should be used -//! UNIX_EPOCH + Duration::from_secs(1635257380) -//! ).expect("failed to generate token"); -//! # // validate against token generated by the aws CLI -//! # assert_eq!(token, "prod-instance.us-east-1.rds.amazonaws.com:3306/?Action=connect&DBUser=dbuser&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20211026%2Fus-east-1%2Frds-db%2Faws4_request&X-Amz-Date=20211026T140940Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=9632f5f4fcd2087a3c523f55f72d2fe97fad03b71a0a23b8c1edfb104e8072d1"); -//! ``` -//! -//! ## Sign a request for APIGateway execute-api -//! -//! ```no_run -//! use aws_credential_types::provider::ProvideCredentials; -//! use aws_sig_auth::signer::{OperationSigningConfig, RequestConfig, SigV4Signer}; -//! use aws_smithy_http::body::SdkBody; -//! use aws_types::region::{Region, SigningRegion}; -//! use aws_types::SigningService; -//! use std::error::Error; -//! use std::time::SystemTime; -//! async fn sign_request( -//! mut request: &mut http::Request, -//! region: Region, -//! credentials_provider: &impl ProvideCredentials, -//! ) -> Result<(), Box> { -//! let now = SystemTime::now(); -//! let signer = SigV4Signer::new(); -//! let request_config = RequestConfig { -//! request_ts: now, -//! region: &SigningRegion::from(region), -//! service: &SigningService::from_static("execute-api"), -//! payload_override: None, -//! }; -//! signer.sign( -//! &OperationSigningConfig::default_config(), -//! &request_config, -//! &credentials_provider.provide_credentials().await?, -//! &mut request, -//! )?; -//! Ok((())) -//! } -//! ``` - -#[cfg(feature = "sign-eventstream")] -pub mod event_stream; - -pub mod middleware; -pub mod signer; +//! This crate is no longer used by the AWS SDK and is deprecated. diff --git a/aws/rust-runtime/aws-sig-auth/src/middleware.rs b/aws/rust-runtime/aws-sig-auth/src/middleware.rs deleted file mode 100644 index fd0b1474a05..00000000000 --- a/aws/rust-runtime/aws-sig-auth/src/middleware.rs +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use std::error::Error; -use std::fmt::{Display, Formatter}; - -use aws_smithy_http::middleware::MapRequest; -use aws_smithy_http::operation::Request; -use aws_smithy_http::property_bag::PropertyBag; - -use aws_credential_types::Credentials; -use aws_sigv4::http_request::SignableBody; -use aws_smithy_async::time::SharedTimeSource; -use aws_types::region::SigningRegion; -use aws_types::SigningService; - -use crate::signer::{ - OperationSigningConfig, RequestConfig, SigV4Signer, SigningError, SigningRequirements, -}; - -#[cfg(feature = "sign-eventstream")] -use crate::event_stream::SigV4MessageSigner as EventStreamSigV4Signer; -#[cfg(feature = "sign-eventstream")] -use aws_smithy_eventstream::frame::DeferredSignerSender; - -// TODO(enableNewSmithyRuntimeCleanup): Delete `Signature` when switching to the orchestrator -/// Container for the request signature for use in the property bag. -#[non_exhaustive] -#[derive(Debug, Clone)] -pub struct Signature(String); - -impl Signature { - pub fn new(signature: String) -> Self { - Self(signature) - } -} - -impl AsRef for Signature { - fn as_ref(&self) -> &str { - &self.0 - } -} - -/// Middleware stage to sign requests with SigV4 -/// -/// SigV4RequestSignerStage will load configuration from the request property bag and add -/// a signature. -/// -/// Prior to signing, the following fields MUST be present in the property bag: -/// - [`SigningRegion`](SigningRegion): The region used when signing the request, e.g. `us-east-1` -/// - [`SigningService`](SigningService): The name of the service to use when signing the request, e.g. `dynamodb` -/// - [`Credentials`](Credentials): Credentials to sign with -/// - [`OperationSigningConfig`](OperationSigningConfig): Operation specific signing configuration, e.g. -/// changes to URL encoding behavior, or headers that must be omitted. -/// - [`SharedTimeSource`]: The time source to use when signing the request. -/// If any of these fields are missing, the middleware will return an error. -#[derive(Clone, Debug)] -pub struct SigV4SigningStage { - signer: SigV4Signer, -} - -impl SigV4SigningStage { - pub fn new(signer: SigV4Signer) -> Self { - Self { signer } - } -} - -#[derive(Debug)] -enum SigningStageErrorKind { - MissingCredentials, - MissingSigningRegion, - MissingSigningService, - MissingSigningConfig, - SigningFailure(SigningError), -} - -#[derive(Debug)] -pub struct SigningStageError { - kind: SigningStageErrorKind, -} - -impl Display for SigningStageError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - use SigningStageErrorKind::*; - match self.kind { - MissingCredentials => { - write!(f, "no credentials in the property bag") - } - MissingSigningRegion => { - write!(f, "no signing region in the property bag") - } - MissingSigningService => { - write!(f, "no signing service in the property bag") - } - MissingSigningConfig => { - write!(f, "no signing configuration in the property bag") - } - SigningFailure(_) => write!(f, "signing failed"), - } - } -} - -impl Error for SigningStageError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - use SigningStageErrorKind as ErrorKind; - match &self.kind { - ErrorKind::SigningFailure(err) => Some(err), - ErrorKind::MissingCredentials - | ErrorKind::MissingSigningRegion - | ErrorKind::MissingSigningService - | ErrorKind::MissingSigningConfig => None, - } - } -} - -impl From for SigningStageError { - fn from(kind: SigningStageErrorKind) -> Self { - Self { kind } - } -} - -impl From for SigningStageError { - fn from(error: SigningError) -> Self { - Self { - kind: SigningStageErrorKind::SigningFailure(error), - } - } -} - -/// Extract a signing config from a [`PropertyBag`](aws_smithy_http::property_bag::PropertyBag) -fn signing_config( - config: &PropertyBag, -) -> Result<(&OperationSigningConfig, RequestConfig, Credentials), SigningStageError> { - let operation_config = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningConfig)?; - let credentials = config - .get::() - .ok_or(SigningStageErrorKind::MissingCredentials)? - .clone(); - let region = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningRegion)?; - let signing_service = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningService)?; - let payload_override = config.get::>(); - let request_config = RequestConfig { - request_ts: config - .get::() - .map(|t| t.now()) - // TODO(enableNewSmithyRuntimeLaunch): Remove this fallback - .unwrap_or_else(|| SharedTimeSource::default().now()), - region, - payload_override, - service: signing_service, - }; - Ok((operation_config, request_config, credentials)) -} - -impl MapRequest for SigV4SigningStage { - type Error = SigningStageError; - - fn name(&self) -> &'static str { - "sigv4_sign_request" - } - - fn apply(&self, req: Request) -> Result { - req.augment(|mut req, config| { - let operation_config = config - .get::() - .ok_or(SigningStageErrorKind::MissingSigningConfig)?; - let (operation_config, request_config, creds) = - match &operation_config.signing_requirements { - SigningRequirements::Disabled => return Ok(req), - SigningRequirements::Optional => match signing_config(config) { - Ok(parts) => parts, - Err(_) => return Ok(req), - }, - SigningRequirements::Required => signing_config(config)?, - }; - - let signature = self - .signer - .sign(operation_config, &request_config, &creds, &mut req) - .map_err(SigningStageErrorKind::SigningFailure)?; - - // If this is an event stream operation, set up the event stream signer - #[cfg(feature = "sign-eventstream")] - if let Some(signer_sender) = config.get::() { - let time_override = config.get::().map(|ts| ts.now()); - signer_sender - .send(Box::new(EventStreamSigV4Signer::new( - signature.as_ref().into(), - creds, - request_config.region.clone(), - request_config.service.clone(), - time_override, - )) as _) - .expect("failed to send deferred signer"); - } - - config.insert(signature); - Ok(req) - }) - } -} - -#[cfg(test)] -mod test { - use std::convert::Infallible; - use std::time::{Duration, UNIX_EPOCH}; - - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; - use http::header::AUTHORIZATION; - - use aws_credential_types::Credentials; - use aws_endpoint::AwsAuthStage; - use aws_smithy_async::time::SharedTimeSource; - use aws_types::region::{Region, SigningRegion}; - use aws_types::SigningService; - - use crate::middleware::{ - SigV4SigningStage, Signature, SigningStageError, SigningStageErrorKind, - }; - use crate::signer::{OperationSigningConfig, SigV4Signer}; - - #[test] - fn places_signature_in_property_bag() { - let req = http::Request::builder() - .uri("https://test-service.test-region.amazonaws.com/") - .body(SdkBody::from("")) - .unwrap(); - let region = Region::new("us-east-1"); - let req = operation::Request::new(req) - .augment(|req, properties| { - properties.insert(region.clone()); - properties.insert(UNIX_EPOCH + Duration::new(1611160427, 0)); - properties.insert(SigningService::from_static("kinesis")); - properties.insert(OperationSigningConfig::default_config()); - properties.insert(Credentials::for_tests()); - properties.insert(SigningRegion::from(region)); - Result::<_, Infallible>::Ok(req) - }) - .expect("succeeds"); - - let signer = SigV4SigningStage::new(SigV4Signer::new()); - let req = signer.apply(req).unwrap(); - - let property_bag = req.properties(); - let signature = property_bag.get::(); - assert!(signature.is_some()); - } - - #[cfg(feature = "sign-eventstream")] - #[test] - fn sends_event_stream_signer_for_event_stream_operations() { - use crate::event_stream::SigV4MessageSigner as EventStreamSigV4Signer; - use aws_smithy_eventstream::frame::{DeferredSigner, SignMessage}; - - let (mut deferred_signer, deferred_signer_sender) = DeferredSigner::new(); - let req = http::Request::builder() - .uri("https://test-service.test-region.amazonaws.com/") - .body(SdkBody::from("")) - .unwrap(); - let region = Region::new("us-east-1"); - let req = operation::Request::new(req) - .augment(|req, properties| { - properties.insert(region.clone()); - properties.insert::(SharedTimeSource::new( - UNIX_EPOCH + Duration::new(1611160427, 0), - )); - properties.insert(SigningService::from_static("kinesis")); - properties.insert(OperationSigningConfig::default_config()); - properties.insert(Credentials::for_tests()); - properties.insert(SigningRegion::from(region.clone())); - properties.insert(deferred_signer_sender); - Result::<_, Infallible>::Ok(req) - }) - .expect("succeeds"); - - let signer = SigV4SigningStage::new(SigV4Signer::new()); - let _ = signer.apply(req).unwrap(); - - let mut signer_for_comparison = EventStreamSigV4Signer::new( - // This is the expected SigV4 signature for the HTTP request above - "abac477b4afabf5651079e7b9a0aa6a1a3e356a7418a81d974cdae9d4c8e5441".into(), - Credentials::for_tests(), - SigningRegion::from(region), - SigningService::from_static("kinesis"), - Some(UNIX_EPOCH + Duration::new(1611160427, 0)), - ); - - let expected_signed_empty = signer_for_comparison.sign_empty().unwrap().unwrap(); - let actual_signed_empty = deferred_signer.sign_empty().unwrap().unwrap(); - assert_eq!(expected_signed_empty, actual_signed_empty); - } - - // check that the endpoint middleware followed by signing middleware produce the expected result - #[test] - fn endpoint_plus_signer() { - use aws_smithy_types::endpoint::Endpoint; - let endpoint = Endpoint::builder() - .url("https://kinesis.us-east-1.amazonaws.com") - .build(); - let req = http::Request::builder() - .uri("https://kinesis.us-east-1.amazonaws.com") - .body(SdkBody::from("")) - .unwrap(); - let region = SigningRegion::from_static("us-east-1"); - let req = operation::Request::new(req) - .augment(|req, conf| { - conf.insert(region.clone()); - conf.insert(SharedTimeSource::new( - UNIX_EPOCH + Duration::new(1611160427, 0), - )); - conf.insert(SigningService::from_static("kinesis")); - conf.insert(endpoint); - Result::<_, Infallible>::Ok(req) - }) - .expect("succeeds"); - - let endpoint = AwsAuthStage; - let signer = SigV4SigningStage::new(SigV4Signer::new()); - let mut req = endpoint.apply(req).expect("add endpoint should succeed"); - let mut errs = vec![signer - .apply(req.try_clone().expect("can clone")) - .expect_err("no signing config")]; - let mut config = OperationSigningConfig::default_config(); - config.signing_options.content_sha256_header = true; - req.properties_mut().insert(config); - errs.push( - signer - .apply(req.try_clone().expect("can clone")) - .expect_err("no cred provider"), - ); - req.properties_mut().insert(Credentials::for_tests()); - let req = signer.apply(req).expect("signing succeeded"); - // make sure we got the correct error types in any order - assert!(errs.iter().all(|el| matches!( - el, - SigningStageError { - kind: SigningStageErrorKind::MissingCredentials - | SigningStageErrorKind::MissingSigningConfig - } - ))); - - let (req, _) = req.into_parts(); - assert_eq!( - req.headers() - .get("x-amz-date") - .expect("x-amz-date must be present"), - "20210120T163347Z" - ); - let auth_header = req - .headers() - .get(AUTHORIZATION) - .expect("auth header must be present") - .to_str() - .unwrap(); - assert_eq!(auth_header, "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210120/us-east-1/kinesis/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=228edaefb06378ac8d050252ea18a219da66117dd72759f4d1d60f02ebc3db64"); - } -} diff --git a/aws/rust-runtime/aws-sig-auth/src/signer.rs b/aws/rust-runtime/aws-sig-auth/src/signer.rs deleted file mode 100644 index d71c6ecf429..00000000000 --- a/aws/rust-runtime/aws-sig-auth/src/signer.rs +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_credential_types::Credentials; -use aws_sigv4::http_request::{ - sign, PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableRequest, - SignatureLocation, SigningParams, SigningSettings, UriPathNormalizationMode, -}; -use aws_smithy_http::body::SdkBody; -use aws_types::region::SigningRegion; -use aws_types::SigningService; -use std::fmt; -use std::time::{Duration, SystemTime}; - -use crate::middleware::Signature; -pub use aws_sigv4::http_request::SignableBody; -pub type SigningError = aws_sigv4::http_request::SigningError; - -const EXPIRATION_WARNING: &str = "Presigned request will expire before the given \ - `expires_in` duration because the credentials used to sign it will expire first."; - -#[derive(Eq, PartialEq, Clone, Copy)] -pub enum SigningAlgorithm { - SigV4, -} - -#[derive(Eq, PartialEq, Clone, Copy)] -pub enum HttpSignatureType { - /// A signature for a full http request should be computed, with header updates applied to the signing result. - HttpRequestHeaders, - - /// A signature for a full http request should be computed, with query param updates applied to the signing result. - /// - /// This is typically used for presigned URLs. - HttpRequestQueryParams, -} - -/// Signing Configuration for an Operation -/// -/// Although these fields MAY be customized on a per request basis, they are generally static -/// for a given operation -#[derive(Clone, PartialEq, Eq)] -#[non_exhaustive] -pub struct OperationSigningConfig { - pub algorithm: SigningAlgorithm, - pub signature_type: HttpSignatureType, - pub signing_options: SigningOptions, - pub signing_requirements: SigningRequirements, - pub expires_in: Option, -} - -impl OperationSigningConfig { - /// Placeholder method to provide a the signing configuration used for most operation - /// - /// In the future, we will code-generate a default configuration for each service - pub fn default_config() -> Self { - OperationSigningConfig { - algorithm: SigningAlgorithm::SigV4, - signature_type: HttpSignatureType::HttpRequestHeaders, - signing_options: SigningOptions { - double_uri_encode: true, - content_sha256_header: false, - normalize_uri_path: true, - omit_session_token: false, - }, - signing_requirements: SigningRequirements::Required, - expires_in: None, - } - } -} - -#[derive(Clone, Copy, Eq, PartialEq)] -pub enum SigningRequirements { - /// A signature MAY be added if credentials are defined - Optional, - - /// A signature MUST be added. - /// - /// If no credentials are provided, this will return an error without dispatching the operation. - Required, - - /// A signature MUST NOT be added. - Disabled, -} - -#[derive(Clone, Eq, PartialEq)] -#[non_exhaustive] -pub struct SigningOptions { - pub double_uri_encode: bool, - pub content_sha256_header: bool, - pub normalize_uri_path: bool, - pub omit_session_token: bool, -} - -/// Signing Configuration for an individual Request -/// -/// These fields may vary on a per-request basis -#[derive(Clone, PartialEq, Eq)] -pub struct RequestConfig<'a> { - pub request_ts: SystemTime, - pub region: &'a SigningRegion, - pub service: &'a SigningService, - pub payload_override: Option<&'a SignableBody<'static>>, -} - -#[derive(Clone, Default)] -pub struct SigV4Signer { - // In the future, the SigV4Signer will use the CRT signer. This will require constructing - // and holding an instance of the signer, so prevent people from constructing a SigV4Signer without - // going through the constructor. - _private: (), -} - -impl fmt::Debug for SigV4Signer { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut formatter = f.debug_struct("SigV4Signer"); - formatter.finish() - } -} - -impl SigV4Signer { - pub fn new() -> Self { - SigV4Signer { _private: () } - } - - fn settings(operation_config: &OperationSigningConfig) -> SigningSettings { - let mut settings = SigningSettings::default(); - settings.percent_encoding_mode = if operation_config.signing_options.double_uri_encode { - PercentEncodingMode::Double - } else { - PercentEncodingMode::Single - }; - settings.payload_checksum_kind = if operation_config.signing_options.content_sha256_header { - PayloadChecksumKind::XAmzSha256 - } else { - PayloadChecksumKind::NoHeader - }; - settings.uri_path_normalization_mode = - if operation_config.signing_options.normalize_uri_path { - UriPathNormalizationMode::Enabled - } else { - UriPathNormalizationMode::Disabled - }; - settings.session_token_mode = if operation_config.signing_options.omit_session_token { - SessionTokenMode::Exclude - } else { - SessionTokenMode::Include - }; - settings.signature_location = match operation_config.signature_type { - HttpSignatureType::HttpRequestHeaders => SignatureLocation::Headers, - HttpSignatureType::HttpRequestQueryParams => SignatureLocation::QueryParams, - }; - settings.expires_in = operation_config.expires_in; - settings - } - - fn signing_params<'a>( - settings: SigningSettings, - credentials: &'a Credentials, - request_config: &'a RequestConfig<'a>, - ) -> SigningParams<'a> { - if let Some(expires_in) = settings.expires_in { - if let Some(creds_expires_time) = credentials.expiry() { - let presigned_expires_time = request_config.request_ts + expires_in; - if presigned_expires_time > creds_expires_time { - tracing::warn!(EXPIRATION_WARNING); - } - } - } - - let mut builder = SigningParams::builder() - .access_key(credentials.access_key_id()) - .secret_key(credentials.secret_access_key()) - .region(request_config.region.as_ref()) - .service_name(request_config.service.as_ref()) - .time(request_config.request_ts) - .settings(settings); - builder.set_security_token(credentials.session_token()); - builder.build().expect("all required fields set") - } - - /// Sign a request using the SigV4 Protocol - /// - /// Although this function may be used, end users will not typically - /// interact with this code. It is generally used via middleware in the request pipeline. See [`SigV4SigningStage`](crate::middleware::SigV4SigningStage). - pub fn sign( - &self, - operation_config: &OperationSigningConfig, - request_config: &RequestConfig<'_>, - credentials: &Credentials, - request: &mut http::Request, - ) -> Result { - let settings = Self::settings(operation_config); - let signing_params = Self::signing_params(settings, credentials, request_config); - - let (signing_instructions, signature) = { - // A body that is already in memory can be signed directly. A body that is not in memory - // (any sort of streaming body or presigned request) will be signed via UNSIGNED-PAYLOAD. - let signable_body = request_config - .payload_override - // the payload_override is a cheap clone because it contains either a - // reference or a short checksum (we're not cloning the entire body) - .cloned() - .unwrap_or_else(|| { - request - .body() - .bytes() - .map(SignableBody::Bytes) - .unwrap_or(SignableBody::UnsignedPayload) - }); - - let signable_request = SignableRequest::new( - request.method(), - request.uri(), - request.headers(), - signable_body, - ); - sign(signable_request, &signing_params)? - } - .into_parts(); - - signing_instructions.apply_to_request(request); - - Ok(Signature::new(signature)) - } -} - -#[cfg(test)] -mod tests { - use super::{RequestConfig, SigV4Signer, EXPIRATION_WARNING}; - use aws_credential_types::Credentials; - use aws_sigv4::http_request::SigningSettings; - use aws_types::region::SigningRegion; - use aws_types::SigningService; - use std::time::{Duration, SystemTime}; - use tracing_test::traced_test; - - #[test] - #[traced_test] - fn expiration_warning() { - let now = SystemTime::UNIX_EPOCH + Duration::from_secs(1000); - let creds_expire_in = Duration::from_secs(100); - - let mut settings = SigningSettings::default(); - settings.expires_in = Some(creds_expire_in - Duration::from_secs(10)); - - let credentials = Credentials::new( - "test-access-key", - "test-secret-key", - Some("test-session-token".into()), - Some(now + creds_expire_in), - "test", - ); - let request_config = RequestConfig { - request_ts: now, - region: &SigningRegion::from_static("test"), - service: &SigningService::from_static("test"), - payload_override: None, - }; - SigV4Signer::signing_params(settings, &credentials, &request_config); - assert!(!logs_contain(EXPIRATION_WARNING)); - - let mut settings = SigningSettings::default(); - settings.expires_in = Some(creds_expire_in + Duration::from_secs(10)); - - SigV4Signer::signing_params(settings, &credentials, &request_config); - assert!(logs_contain(EXPIRATION_WARNING)); - } -} diff --git a/aws/rust-runtime/aws-sigv4/Cargo.toml b/aws/rust-runtime/aws-sigv4/Cargo.toml index ea540255527..6fe06159cab 100644 --- a/aws/rust-runtime/aws-sigv4/Cargo.toml +++ b/aws/rust-runtime/aws-sigv4/Cargo.toml @@ -6,45 +6,70 @@ description = "SigV4 signer for HTTP requests and Event Stream messages." edition = "2021" exclude = ["aws-sig-v4-test-suite/*"] license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] -sign-http = ["http", "percent-encoding", "form_urlencoded"] -sign-eventstream = ["aws-smithy-eventstream", "bytes"] default = ["sign-http"] +http0-compat = ["dep:http"] +sign-http = ["dep:http", "dep:percent-encoding", "dep:form_urlencoded"] +sign-eventstream = ["dep:aws-smithy-eventstream"] +sigv4a = ["dep:p256", "dep:crypto-bigint", "dep:subtle", "dep:zeroize", "dep:ring"] [dependencies] +aws-credential-types = { path = "../aws-credential-types" } aws-smithy-eventstream = { path = "../../../rust-runtime/aws-smithy-eventstream", optional = true } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http" } -bytes = { version = "1", optional = true } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } +aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types" } +bytes = "1" form_urlencoded = { version = "1.0", optional = true } hex = "0.4" +hmac = "0.12" http = { version = "0.2", optional = true } +num-bigint = { version = "0.4", optional = true } once_cell = "1.8" +p256 = { version = "0.11", features = ["ecdsa"], optional = true } percent-encoding = { version = "2.1", optional = true } -regex = "1.5" +ring = { version = "0.17.5", optional = true } +sha2 = "0.10" +crypto-bigint = { version = "0.5.4", optional = true } +subtle = { version = "2.5.0", optional = true } time = "0.3.5" tracing = "0.1" -hmac = "0.12" -sha2 = "0.10" +zeroize = { version = "^1", optional = true } [dev-dependencies] -criterion = "0.4" +aws-credential-types = { path = "../aws-credential-types", features = ["test-util", "hardcoded-credentials"] } +aws-smithy-runtime-api = { path = "../../../rust-runtime/aws-smithy-runtime-api", features = ["client", "test-util"] } bytes = "1" -httparse = "1.5" +criterion = "0.5" +hex-literal = "0.4.1" +httparse = "1.8" +libfuzzer-sys = "0.4.6" pretty_assertions = "1.3" proptest = "1.2" -time = { version = "0.3.4", features = ["parsing"] } +serde = "1.0.180" +serde_derive = "1.0.180" +serde_json = "1.0.104" +time = { version = "0.3.5", features = ["parsing"] } [target.'cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))'.dev-dependencies] -ring = "0.16" +ring = "0.17.5" [[bench]] name = "hmac" harness = false +[[bench]] +name = "sigv4a" +harness = false +required-features = [ "sigv4a" ] + [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata + +[package.metadata.smithy-rs-release-tooling] +stable = true diff --git a/aws/rust-runtime/aws-sigv4/README.md b/aws/rust-runtime/aws-sigv4/README.md index 6e69eb5e901..497144afcf6 100644 --- a/aws/rust-runtime/aws-sigv4/README.md +++ b/aws/rust-runtime/aws-sigv4/README.md @@ -1,9 +1,7 @@ # aws-sigv4 -Low-level SigV4 request signing implementations. Customers will not generally need to use this crate directly. If you -need to manually sign requests, [aws-sig-auth](https://crates.io/crates/aws-sig-auth) offers a higher level interface -for signing. +Low-level SigV4 request signing implementations. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.creq b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.creq index ae5db8a63aa..313af7b57d2 100644 --- a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.creq +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.creq @@ -5,4 +5,4 @@ host:tj9n5r0m12.execute-api.us-east-1.amazonaws.com x-amz-date:20210511T154045Z host;x-amz-date -e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ No newline at end of file diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.sreq b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.sreq index 860ac5966d0..2c61e69ee7f 100644 --- a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.sreq +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/double-encode-path/double-encode-path.sreq @@ -1,4 +1,4 @@ POST /test/@connections/JBDvjfGEIAMCERw%3D HTTP/1.1 X-amz-date:20150830T123600Z -Authorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=6f871eb157f326fa5f7439eb88ca200048635950ce7d6037deda56f0c95d4364 +Authorization:AWS4-HMAC-SHA256 Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=57d157672191bac40bae387e48bbe14b15303c001fdbb01f4abf295dccb09705 Host:tj9n5r0m12.execute-api.us-east-1.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.qpsreq b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.qpsreq index 3549284538b..b29c1e07554 100644 --- a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.qpsreq +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.qpsreq @@ -1,2 +1,2 @@ -GET /?Param2=value2&Param1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=35&X-Amz-SignedHeaders=host&X-Amz-Signature=f25aea20f8c722ece3b363fc5d60cc91add973f9b64c42ba36fa28d57afe9019 HTTP/1.1 +GET /?Param2=value2&Param1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=35&X-Amz-SignedHeaders=host&X-Amz-Signature=ecce208e4b4f7d7e3a4cc22ced6acc2ad1d170ee8ba87d7165f6fa4b9aff09ab HTTP/1.1 Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.sreq b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.sreq index dff74145584..e55b6b8cecb 100644 --- a/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.sreq +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/get-vanilla-query-order-key-case.sreq @@ -1,4 +1,4 @@ GET /?Param2=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z -Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500 +Authorization: AWS4-HMAC-SHA256 Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5557820e7380d585310524bd93d51a08d7757fb5efd7344ee12088f2b0860947 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/LICENSE b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/LICENSE new file mode 100755 index 00000000000..d6456956733 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/NOTICE b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/NOTICE new file mode 100755 index 00000000000..d85f69ecbf7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/NOTICE @@ -0,0 +1,2 @@ +AWS Signature Version 4a Test Suite +Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/README.md b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/README.md new file mode 100644 index 00000000000..c7166222d58 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/README.md @@ -0,0 +1,24 @@ +Where did the files in this directory come from? +================================================ + +These test files were taken from the [aws-c-auth](https://github.com/awslabs/aws-c-auth/tree/main/tests/aws-signing-test-suite/v4a) project. + +Signature Version 4A Test Suite +------------------------------ + +To assist you in the development of an AWS client that supports Signature Version 4A, you can use the +files in the test suite to ensure your code is performing each step of the signing process correctly. + +Each test group contains several files that you can use to validate most of the tasks described in +Signature Version 4A Signing Process. The following list describes the contents of each file. + +- context.json - Credentials and signer options to use when signing test requests +- request.txt - The web request to be signed. +- header-canonical-request.txt - The resulting canonical request in header-signature mode. +- header-string-to-sign.txt - The resulting string to sign in header-signature mode. +- query-canonical-request.txt - The resulting canonical request in query-signature mode. +- query-string-to-sign.txt - The resulting string to sign in header-query mode. + +Sigv4A signature generation isn't deterministic, so generated signatures can't be tested against known good ones. +Instead, tests generate a signature, derive a verification key from the signing key, and verify the signature and +the string to sign. This mirrors what AWS services do when verifying Sigv4A-signed requests. diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-canonical-request.txt new file mode 100644 index 00000000000..ccb5f437485 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-canonical-request.txt @@ -0,0 +1,10 @@ +GET +/ + +host:example.amazonaws.com +my-header1:value2,value2,value1 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-string-to-sign.txt new file mode 100644 index 00000000000..8783461a4d4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +30f1f7b639b7fd5982a0f700e6d23bf7bb24f2f1d9e1314005bf22130da61cdf diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-canonical-request.txt new file mode 100644 index 00000000000..9561297c7a2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-canonical-request.txt @@ -0,0 +1,8 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1 +host:example.amazonaws.com +my-header1:value2,value2,value1 + +host;my-header1 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-string-to-sign.txt new file mode 100644 index 00000000000..3140f6f64d2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +a6e21a0099c98cbb4ec73928a08e8b116dfd634c471a8c03c4007b5258b664ea diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/request.txt new file mode 100644 index 00000000000..40455cec6f3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-key-duplicate/request.txt @@ -0,0 +1,5 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com +My-Header1:value2 +My-Header1:value2 +My-Header1:value1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-canonical-request.txt new file mode 100644 index 00000000000..93751930e42 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-canonical-request.txt @@ -0,0 +1,10 @@ +GET +/ + +host:example.amazonaws.com +my-header1:value4,value1,value3,value2 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-string-to-sign.txt new file mode 100644 index 00000000000..6400baf52b8 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +e1c3b5d34632ffff080330b3bc31906c8988bf1683f4af689ef3f1811952df36 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-canonical-request.txt new file mode 100644 index 00000000000..ecf494a365f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-canonical-request.txt @@ -0,0 +1,8 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1 +host:example.amazonaws.com +my-header1:value4,value1,value3,value2 + +host;my-header1 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-string-to-sign.txt new file mode 100644 index 00000000000..b58417973ad --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +e2bf35ea25a1943bf52cfc8348c787db8fd8ca642dc9f2b9443939c2fb0d3c54 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/request.txt new file mode 100644 index 00000000000..2c6f49d369b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-order/request.txt @@ -0,0 +1,6 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com +My-Header1:value4 +My-Header1:value1 +My-Header1:value3 +My-Header1:value2 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-canonical-request.txt new file mode 100644 index 00000000000..e91e9524195 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-canonical-request.txt @@ -0,0 +1,11 @@ +GET +/ + +host:example.amazonaws.com +my-header1:value1 +my-header2:"a b c" +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;my-header2;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-string-to-sign.txt new file mode 100644 index 00000000000..0e407d8557c --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +18b43001be9b531ebdd8202144dbd7630ea8a35bc328a7d0e561dda03a876095 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-canonical-request.txt new file mode 100644 index 00000000000..8a3b042ca92 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1%3Bmy-header2 +host:example.amazonaws.com +my-header1:value1 +my-header2:"a b c" + +host;my-header1;my-header2 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-string-to-sign.txt new file mode 100644 index 00000000000..5eead2534dc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +4f92ebcf5f0844588e443a2243fafdb64319c6d1ad913c07686129b9991326a3 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/request.txt new file mode 100644 index 00000000000..ad1ea986773 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-header-value-trim/request.txt @@ -0,0 +1,4 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com +My-Header1: value1 +My-Header2: "a b c" diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/request.txt new file mode 100644 index 00000000000..6aa9f995bdc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-normalized/request.txt @@ -0,0 +1,2 @@ +GET /example/.. HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/request.txt new file mode 100644 index 00000000000..a856c107390 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-normalized/request.txt @@ -0,0 +1,2 @@ +GET /example1/example2/../.. HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..5e1d1cfcaaa --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/example1/example2/../.. + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..1cca6cfb389 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +7bad1fab948577ec4e860ff2bb06ce9b69f0dd60eb8a9ad7c016b584254f9b5b diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..95dc10402d7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/example1/example2/../.. +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..50edce6de3b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +504892d7f7262dd98d79ab7f3bb6f918cd59d491aacb2d76450f6e065479b31a diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/request.txt new file mode 100644 index 00000000000..a856c107390 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-relative-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET /example1/example2/../.. HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..d6a0abe36fe --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/example/.. + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..4a34e937171 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +c859b5032f2ebd5df0285ff633b495b0e6e962e5adb94731c95e8e993a9a8213 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..b1d123ed951 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/example/.. +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..a17f5abdbb4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +bbbb3668f996906ebb2c96ebdc2418af99656315adaf647989ab336c88fb516e diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/request.txt new file mode 100644 index 00000000000..6aa9f995bdc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-relative-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET /example/.. HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/request.txt new file mode 100644 index 00000000000..2c5ff3851e7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-normalized/request.txt @@ -0,0 +1,2 @@ +GET /./ HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..d05303d006e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/./ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..e1bfb399afb --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +a14dce0217a32357c623c3db790988b6b5aa1494a527158b06d3ca4444561a4b diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..f048d0fe58e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/./ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..bfcf245534b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +0d146fed00cdf50d7a87864583b7a33ca75322aab46b0a2d204f5d0c13440917 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/request.txt new file mode 100644 index 00000000000..2c5ff3851e7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-dot-slash-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET /./ HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/request.txt new file mode 100644 index 00000000000..25bc21e36f2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-normalized/request.txt @@ -0,0 +1,2 @@ +GET // HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..2e36c2065a7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/example + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..cd30e8b5c0b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +823cb165e35e124f862c99c89a46414c24e3800f149377591e35a4848317e825 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..77cf28df87d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/example +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..49d9b24a725 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +0cc67a8acfed5946b645794c649dd98d3485728119cdf17d38985ba0ff55abca diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/request.txt new file mode 100644 index 00000000000..5d919c9ba63 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-normalized/request.txt @@ -0,0 +1,2 @@ +GET /./example HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..44448421e10 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/./example + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..cc63510cad2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +407314cdff397462b2458ba1860907adefcbb73fd630ddbd3de7300d2f773804 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..ed2cb2d8b1b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/./example +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..c9f3b6ddac5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +efbe4f47c2acbb53fbfd0be6846cfa35a48c21f3f800e741278dae7b721302b4 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/request.txt new file mode 100644 index 00000000000..5d919c9ba63 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-pointless-dot-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET /./example HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..8a4d33b0ba3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +// + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..874c01c1eea --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +fc8f42c7ce50ba8830a34b16d9fb478170176d78c81339e8d7e31d4baa9ec9f4 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..81d7b0b1570 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +// +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..17e5279ee70 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +633e0570a745c18cc22e43af8be65cfed3e7173061ec403353734bdfae90e0b6 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/request.txt new file mode 100644 index 00000000000..25bc21e36f2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slash-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET // HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-canonical-request.txt new file mode 100644 index 00000000000..fdf9c48f5a9 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/example/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-string-to-sign.txt new file mode 100644 index 00000000000..8f9c95e66f4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +ea6c9c4bc1e85b94f2579cebbc85a84c3f8eaa055c006697555f074dd68509a6 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-canonical-request.txt new file mode 100644 index 00000000000..1046735a533 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/example/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-string-to-sign.txt new file mode 100644 index 00000000000..b293cc2be40 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +ab3f7b8af0ce16e0faf508160fb13d890874992d74f36214ae9eec7437361f2b diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/request.txt new file mode 100644 index 00000000000..12e0931969c --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-normalized/request.txt @@ -0,0 +1,2 @@ +GET //example// HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/context.json new file mode 100644 index 00000000000..afe367bb176 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": false, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-canonical-request.txt new file mode 100644 index 00000000000..a9c55f62153 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +//example// + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-string-to-sign.txt new file mode 100644 index 00000000000..5c4c2cd4a4f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +bf8c459a6a7f3879f55bff41e4dca65f69df4628456904e47f83013c0deb7276 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-canonical-request.txt new file mode 100644 index 00000000000..c878ab4f56e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +//example// +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-string-to-sign.txt new file mode 100644 index 00000000000..5f596452cb5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +660b4a6f0bd53b287cefb21cdf69c1574303de44d2e9f7759b5379b428b70157 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/request.txt new file mode 100644 index 00000000000..12e0931969c --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-slashes-unnormalized/request.txt @@ -0,0 +1,2 @@ +GET //example// HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-canonical-request.txt new file mode 100644 index 00000000000..b0db64880ad --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-string-to-sign.txt new file mode 100644 index 00000000000..20c7cd66a45 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +b48c0f7d7cdaa2cd05e4b789c913063becd96ccace5296a334c950040e58bcac diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-canonical-request.txt new file mode 100644 index 00000000000..f9fb7264769 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-string-to-sign.txt new file mode 100644 index 00000000000..ef06e89988b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +a967a5035e5dc574f94fb9f0de0faf9d56e889c26d9a65d7d0a15d89690280d1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/request.txt new file mode 100644 index 00000000000..a149694b9cc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-unreserved/request.txt @@ -0,0 +1,2 @@ +GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-canonical-request.txt new file mode 100644 index 00000000000..bb9d4bfa6af --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ +Param1=value1 +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-string-to-sign.txt new file mode 100644 index 00000000000..a176f1dfc76 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +894f4237e92aae973c992da1d1f39d7a5913a23e9f7cbcf085e9550685eb498a diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-canonical-request.txt new file mode 100644 index 00000000000..344384bdb78 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-string-to-sign.txt new file mode 100644 index 00000000000..b6250526be2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +07551f1d699afeb50d6811a527ab7b0270b60448ea27d8cbccb9750d68287b3f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/request.txt new file mode 100644 index 00000000000..f4a03bb0ade --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-empty-query-key/request.txt @@ -0,0 +1,2 @@ +GET /?Param1=value1 HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-canonical-request.txt new file mode 100644 index 00000000000..74f625a1451 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ +Param1=value1&Param2=value2 +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-string-to-sign.txt new file mode 100644 index 00000000000..44873b70da6 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cc07b29e0d0f0b2d6aa296621a5608fd9c2271159b9b2f737f682704ebb96482 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-canonical-request.txt new file mode 100644 index 00000000000..6d30727353d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +Param1=value1&Param2=value2&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-string-to-sign.txt new file mode 100644 index 00000000000..99d05105696 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +c688584c3dbae2868c4911c825239f2c9375e66b9962f21db60b9b2fcd75bf45 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/request.txt new file mode 100644 index 00000000000..1158ac4ebd9 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-order-key-case/request.txt @@ -0,0 +1,2 @@ +GET /?Param2=value2&Param1=value1 HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-canonical-request.txt new file mode 100644 index 00000000000..816c8623016 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ +-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-string-to-sign.txt new file mode 100644 index 00000000000..6129fc52fe9 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +377b8a3e195894659b84cd1c475dc8a3663a663360a349430c0c3b82bd82b77b diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-canonical-request.txt new file mode 100644 index 00000000000..b77ee9ffee4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-string-to-sign.txt new file mode 100644 index 00000000000..1cfed7a3cce --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +5d8923c620c699f856a35a6eb8dd786fd4c8c6ab0a35c552caeb5b648989433f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/request.txt new file mode 100644 index 00000000000..36b2fe3ea4e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query-unreserved/request.txt @@ -0,0 +1,2 @@ +GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/request.txt new file mode 100644 index 00000000000..e659c3be2c3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-query/request.txt @@ -0,0 +1,2 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/context.json new file mode 100644 index 00000000000..a457c8a6627 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/context.json @@ -0,0 +1,13 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", + "token": "6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-canonical-request.txt new file mode 100644 index 00000000000..f14defd8930 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-canonical-request.txt @@ -0,0 +1,10 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 +x-amz-security-token:6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267 + +host;x-amz-date;x-amz-region-set;x-amz-security-token +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-string-to-sign.txt new file mode 100644 index 00000000000..4edece5422a --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +79893373104239a0547df489af395ec3c1b8873a8601f07f11ffd3f1ac557e7d diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-canonical-request.txt new file mode 100644 index 00000000000..7c042af70c7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Security-Token=6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-string-to-sign.txt new file mode 100644 index 00000000000..0fd066ab751 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +496062b4c2ed2175fe08ad084158783fa8d013c694542af721d49b25d1ebd390 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/request.txt new file mode 100644 index 00000000000..e659c3be2c3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla-with-session-token/request.txt @@ -0,0 +1,2 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-canonical-request.txt new file mode 100644 index 00000000000..47e71285fd1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-canonical-request.txt @@ -0,0 +1,9 @@ +GET +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-string-to-sign.txt new file mode 100644 index 00000000000..95d7219c28e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +cf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-canonical-request.txt new file mode 100644 index 00000000000..a34ea263b03 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-canonical-request.txt @@ -0,0 +1,7 @@ +GET +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-string-to-sign.txt new file mode 100644 index 00000000000..48f855c312f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/request.txt new file mode 100644 index 00000000000..e659c3be2c3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/get-vanilla/request.txt @@ -0,0 +1,2 @@ +GET / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-canonical-request.txt new file mode 100644 index 00000000000..a6942c11715 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-string-to-sign.txt new file mode 100644 index 00000000000..d5650cb8798 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-canonical-request.txt new file mode 100644 index 00000000000..e48ce070ae3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-string-to-sign.txt new file mode 100644 index 00000000000..34e3382b43d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/request.txt new file mode 100644 index 00000000000..3f0a82a2683 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-case/request.txt @@ -0,0 +1,2 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-canonical-request.txt new file mode 100644 index 00000000000..a8e1727ba4f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-canonical-request.txt @@ -0,0 +1,10 @@ +POST +/ + +host:example.amazonaws.com +my-header1:value1 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-string-to-sign.txt new file mode 100644 index 00000000000..f6e3e9b1587 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +b92b1e85236a12f9d118f85fb6686c83b0e83fb3428f8d4da3cc9acb2851fcfa diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-canonical-request.txt new file mode 100644 index 00000000000..0ae73e130b8 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-canonical-request.txt @@ -0,0 +1,8 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1 +host:example.amazonaws.com +my-header1:value1 + +host;my-header1 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-string-to-sign.txt new file mode 100644 index 00000000000..8cb96bfd5a7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +336638ab840d4785edc7db35ab9c036bc15ffb2dc1a4e05b04f3a7cd7407593f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/request.txt new file mode 100644 index 00000000000..917720efcb3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-key-sort/request.txt @@ -0,0 +1,3 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com +My-Header1:value1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-canonical-request.txt new file mode 100644 index 00000000000..1dc3ef8e8c1 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-canonical-request.txt @@ -0,0 +1,10 @@ +POST +/ + +host:example.amazonaws.com +my-header1:VALUE1 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;my-header1;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-string-to-sign.txt new file mode 100644 index 00000000000..59c7e45e2a5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +7de5a74bc45fb5c8a90faada2ab9538e69e4a5eb7f330f62387715669cecd492 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-canonical-request.txt new file mode 100644 index 00000000000..377e6f3b6c3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-canonical-request.txt @@ -0,0 +1,8 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1 +host:example.amazonaws.com +my-header1:VALUE1 + +host;my-header1 +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-string-to-sign.txt new file mode 100644 index 00000000000..84a7afd6dc8 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +949fb555e05d3289760ff0f0566ad73a69ed865000d9843b93a15b916dbc8b6f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/request.txt new file mode 100644 index 00000000000..5f14c91595f --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-header-value-case/request.txt @@ -0,0 +1,3 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com +My-Header1:VALUE1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/context.json new file mode 100644 index 00000000000..8f1d5ced769 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/context.json @@ -0,0 +1,14 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", + "token": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z", + "omit_session_token": true +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-canonical-request.txt new file mode 100644 index 00000000000..a6942c11715 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-string-to-sign.txt new file mode 100644 index 00000000000..d5650cb8798 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-canonical-request.txt new file mode 100644 index 00000000000..e48ce070ae3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-string-to-sign.txt new file mode 100644 index 00000000000..34e3382b43d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/request.txt new file mode 100644 index 00000000000..3f0a82a2683 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-after/request.txt @@ -0,0 +1,2 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/context.json new file mode 100644 index 00000000000..5187392c0a6 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/context.json @@ -0,0 +1,14 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", + "token": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z", + "omit_session_token": false +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-canonical-request.txt new file mode 100644 index 00000000000..dd408c84e09 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-canonical-request.txt @@ -0,0 +1,10 @@ +POST +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 +x-amz-security-token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== + +host;x-amz-date;x-amz-region-set;x-amz-security-token +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-string-to-sign.txt new file mode 100644 index 00000000000..f352b5416cc --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +964c15d46a67b327b877c02d680c81cb75df04e85144142e190da565ff0d029f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-canonical-request.txt new file mode 100644 index 00000000000..832cdc05040 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Security-Token=AQoDYXdzEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI%2FqkPpKPi%2FkMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d%2Bxo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz%2BscqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR%2FoLxBA%3D%3D&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-string-to-sign.txt new file mode 100644 index 00000000000..d7f36687c42 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +c3a8ba26c461df46b5010b756fb8644fd922a2aea95d77b56295e5e4d3bb155f diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/request.txt new file mode 100644 index 00000000000..3f0a82a2683 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-sts-header-before/request.txt @@ -0,0 +1,2 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-canonical-request.txt new file mode 100644 index 00000000000..02af60fb2e7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ +Param1=value1 +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-string-to-sign.txt new file mode 100644 index 00000000000..4256b4ff1b5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +502dea2656f02eea10bd05eeec315ea1a6686ed2861176e1670b2d67e17b2f36 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-canonical-request.txt new file mode 100644 index 00000000000..fa84bbdc3d4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-string-to-sign.txt new file mode 100644 index 00000000000..de270efe06e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +b9ec8df7b378fbee58903f5c54bd50e80a4d2d5aa9532583910ce771e42574fe diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/request.txt new file mode 100644 index 00000000000..c9d6e5dfb09 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-empty-query-value/request.txt @@ -0,0 +1,2 @@ +POST /?Param1=value1 HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-canonical-request.txt new file mode 100644 index 00000000000..02af60fb2e7 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ +Param1=value1 +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-string-to-sign.txt new file mode 100644 index 00000000000..4256b4ff1b5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +502dea2656f02eea10bd05eeec315ea1a6686ed2861176e1670b2d67e17b2f36 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-canonical-request.txt new file mode 100644 index 00000000000..fa84bbdc3d4 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-string-to-sign.txt new file mode 100644 index 00000000000..de270efe06e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +b9ec8df7b378fbee58903f5c54bd50e80a4d2d5aa9532583910ce771e42574fe diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/request.txt new file mode 100644 index 00000000000..c9d6e5dfb09 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla-query/request.txt @@ -0,0 +1,2 @@ +POST /?Param1=value1 HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/context.json new file mode 100644 index 00000000000..45771c756da --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": false, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-canonical-request.txt new file mode 100644 index 00000000000..a6942c11715 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ + +host:example.amazonaws.com +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +host;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-string-to-sign.txt new file mode 100644 index 00000000000..d5650cb8798 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-canonical-request.txt new file mode 100644 index 00000000000..e48ce070ae3 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-canonical-request.txt @@ -0,0 +1,7 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host +host:example.amazonaws.com + +host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-string-to-sign.txt new file mode 100644 index 00000000000..34e3382b43d --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/request.txt new file mode 100644 index 00000000000..3f0a82a2683 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-vanilla/request.txt @@ -0,0 +1,2 @@ +POST / HTTP/1.1 +Host:example.amazonaws.com diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/context.json new file mode 100644 index 00000000000..fc4bce6dc67 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": true, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-canonical-request.txt new file mode 100644 index 00000000000..05ab787e7e5 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-canonical-request.txt @@ -0,0 +1,12 @@ +POST +/ + +content-length:13 +content-type:application/x-www-form-urlencoded; charset=utf-8 +host:example.amazonaws.com +x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt new file mode 100644 index 00000000000..b6fdecfa4a2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +03c5c4387e7c1bd3a606d1b19301d277e51d7621ced07c8c9ff2aeb151c0f4c6 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-canonical-request.txt new file mode 100644 index 00000000000..fcc454f230e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost +content-length:13 +content-type:application/x-www-form-urlencoded; charset=utf-8 +host:example.amazonaws.com + +content-length;content-type;host +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt new file mode 100644 index 00000000000..a300bea048e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +ab426c74406d082ad98929df8969624e6ed5cb7f4e8501fbbe7d8c20e9c3b417 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/request.txt new file mode 100644 index 00000000000..b711c250549 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded-parameters/request.txt @@ -0,0 +1,6 @@ +POST / HTTP/1.1 +Content-Type:application/x-www-form-urlencoded; charset=utf-8 +Host:example.amazonaws.com +Content-Length:13 + +Param1=value1 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/context.json b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/context.json new file mode 100644 index 00000000000..fc4bce6dc67 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/context.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "access_key_id": "AKIDEXAMPLE", + "secret_access_key": "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY" + }, + "expiration_in_seconds": 3600, + "normalize": true, + "region": "us-east-1", + "service": "service", + "sign_body": true, + "timestamp": "2015-08-30T12:36:00Z" +} diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-canonical-request.txt new file mode 100644 index 00000000000..69009dc7613 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-canonical-request.txt @@ -0,0 +1,12 @@ +POST +/ + +content-length:13 +content-type:application/x-www-form-urlencoded +host:example.amazonaws.com +x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +x-amz-date:20150830T123600Z +x-amz-region-set:us-east-1 + +content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-region-set +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-string-to-sign.txt new file mode 100644 index 00000000000..b6fdecfa4a2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/header-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +03c5c4387e7c1bd3a606d1b19301d277e51d7621ced07c8c9ff2aeb151c0f4c6 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-canonical-request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-canonical-request.txt new file mode 100644 index 00000000000..9ed065b9e4a --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-canonical-request.txt @@ -0,0 +1,9 @@ +POST +/ +X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost +content-length:13 +content-type:application/x-www-form-urlencoded +host:example.amazonaws.com + +content-length;content-type;host +9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-string-to-sign.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-string-to-sign.txt new file mode 100644 index 00000000000..bef3143615b --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/query-string-to-sign.txt @@ -0,0 +1,4 @@ +AWS4-ECDSA-P256-SHA256 +20150830T123600Z +20150830/service/aws4_request +4e4122984d30d13170a298ece62cc30f8da12578fb3b482616b1f11036b13934 diff --git a/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/request.txt b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/request.txt new file mode 100644 index 00000000000..00911020c0e --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/aws-sig-v4a-test-suite/post-x-www-form-urlencoded/request.txt @@ -0,0 +1,6 @@ +POST / HTTP/1.1 +Content-Type:application/x-www-form-urlencoded +Host:example.amazonaws.com +Content-Length:13 + +Param1=value1 diff --git a/aws/rust-runtime/aws-sigv4/benches/sigv4a.rs b/aws/rust-runtime/aws-sigv4/benches/sigv4a.rs new file mode 100644 index 00000000000..3d207390e25 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/benches/sigv4a.rs @@ -0,0 +1,29 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sigv4::sign::v4a; +use criterion::{criterion_group, criterion_main, Criterion}; +use std::hint::black_box; + +pub fn generate_signing_key(c: &mut Criterion) { + c.bench_function("generate_signing_key", |b| { + b.iter(|| { + let _ = v4a::generate_signing_key( + black_box("AKIAIOSFODNN7EXAMPLE"), + black_box("wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"), + ); + }) + }); +} + +criterion_group! { + name = benches; + + config = Criterion::default(); + + targets = generate_signing_key +} + +criterion_main!(benches); diff --git a/aws/rust-runtime/aws-sigv4/external-types.toml b/aws/rust-runtime/aws-sigv4/external-types.toml index 9139940c26a..94701a5285b 100644 --- a/aws/rust-runtime/aws-sigv4/external-types.toml +++ b/aws/rust-runtime/aws-sigv4/external-types.toml @@ -1,11 +1,7 @@ allowed_external_types = [ - "http::header::map::HeaderMap", - "http::header::name::HeaderName", - "http::header::value::HeaderValue", - "http::method::Method", + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `http0-compat` feature "http::request::Request", - "http::uri::Uri", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature - "aws_smithy_eventstream::frame::Message", + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + "aws_smithy_types::event_stream::Message", + "aws_smithy_runtime_api::client::identity::Identity" ] diff --git a/aws/rust-runtime/aws-sigv4/src/date_time.rs b/aws/rust-runtime/aws-sigv4/src/date_time.rs index 5ddd7056076..f27a265e0e8 100644 --- a/aws/rust-runtime/aws-sigv4/src/date_time.rs +++ b/aws/rust-runtime/aws-sigv4/src/date_time.rs @@ -95,7 +95,7 @@ mod tests { use crate::date_time::test_parsers::{parse_date, parse_date_time}; use time::format_description::well_known::Rfc3339; - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "x86")))] #[test] fn date_format() { @@ -109,7 +109,7 @@ mod tests { assert_eq!("01000102", format_date(time)); } - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "x86")))] #[test] fn date_time_format() { @@ -135,7 +135,7 @@ mod tests { assert_eq!("20150830", format_date(time)); } - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "x86")))] #[test] fn test_truncate_subsecs() { diff --git a/aws/rust-runtime/aws-sigv4/src/event_stream.rs b/aws/rust-runtime/aws-sigv4/src/event_stream.rs index a8da19ab039..03f8b367d24 100644 --- a/aws/rust-runtime/aws-sigv4/src/event_stream.rs +++ b/aws/rust-runtime/aws-sigv4/src/event_stream.rs @@ -8,9 +8,12 @@ //! # Example: Signing an event stream message //! //! ```rust -//! use aws_sigv4::event_stream::{sign_message, SigningParams}; -//! use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; +//! use aws_sigv4::event_stream::sign_message; +//! use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; //! use std::time::SystemTime; +//! use aws_credential_types::Credentials; +//! use aws_smithy_runtime_api::client::identity::Identity; +//! use aws_sigv4::sign::v4; //! //! // The `last_signature` argument is the previous message's signature, or //! // the signature of the initial HTTP request if a message hasn't been signed yet. @@ -21,31 +24,41 @@ //! HeaderValue::String("value".into()), //! )); //! -//! let params = SigningParams::builder() -//! .access_key("example access key") -//! .secret_key("example secret key") +//! let identity = Credentials::new( +//! "AKIDEXAMPLE", +//! "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", +//! None, +//! None, +//! "hardcoded-credentials" +//! ).into(); +//! let params = v4::SigningParams::builder() +//! .identity(&identity) //! .region("us-east-1") -//! .service_name("exampleservice") +//! .name("exampleservice") //! .time(SystemTime::now()) //! .settings(()) //! .build() //! .unwrap(); //! //! // Use the returned `signature` to sign the next message. -//! let (signed, signature) = -//! sign_message(&message_to_sign, &last_signature, ¶ms).into_parts(); +//! let (signed, signature) = sign_message(&message_to_sign, &last_signature, ¶ms) +//! .expect("signing should succeed") +//! .into_parts(); //! ``` use crate::date_time::{format_date, format_date_time, truncate_subsecs}; -use crate::sign::{calculate_signature, generate_signing_key, sha256_hex_string}; +use crate::http_request::SigningError; +use crate::sign::v4::{calculate_signature, generate_signing_key, sha256_hex_string}; use crate::SigningOutput; -use aws_smithy_eventstream::frame::{write_headers_to, Header, HeaderValue, Message}; +use aws_credential_types::Credentials; +use aws_smithy_eventstream::frame::{write_headers_to, write_message_to}; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use bytes::Bytes; use std::io::Write; use std::time::SystemTime; /// Event stream signing parameters -pub type SigningParams<'a> = super::SigningParams<'a, ()>; +pub type SigningParams<'a> = crate::sign::v4::SigningParams<'a, ()>; /// Creates a string to sign for an Event Stream message. fn calculate_string_to_sign( @@ -65,7 +78,7 @@ fn calculate_string_to_sign( writeln!( sts, "{}/{}/{}/aws4_request", - date_str, params.region, params.service_name + date_str, params.region, params.name ) .unwrap(); writeln!(sts, "{}", last_signature).unwrap(); @@ -87,10 +100,10 @@ pub fn sign_message<'a>( message: &'a Message, last_signature: &'a str, params: &'a SigningParams<'a>, -) -> SigningOutput { +) -> Result, SigningError> { let message_payload = { let mut payload = Vec::new(); - message.write_to(&mut payload).unwrap(); + write_message_to(message, &mut payload).unwrap(); payload }; sign_payload(Some(message_payload), last_signature, params) @@ -104,7 +117,7 @@ pub fn sign_message<'a>( pub fn sign_empty_message<'a>( last_signature: &'a str, params: &'a SigningParams<'a>, -) -> SigningOutput { +) -> Result, SigningError> { sign_payload(None, last_signature, params) } @@ -112,13 +125,17 @@ fn sign_payload<'a>( message_payload: Option>, last_signature: &'a str, params: &'a SigningParams<'a>, -) -> SigningOutput { +) -> Result, SigningError> { // Truncate the sub-seconds up front since the timestamp written to the signed message header // needs to exactly match the string formatted timestamp, which doesn't include sub-seconds. let time = truncate_subsecs(params.time); + let creds = params + .identity + .data::() + .ok_or_else(SigningError::unsupported_identity_type)?; let signing_key = - generate_signing_key(params.secret_key, time, params.region, params.service_name); + generate_signing_key(creds.secret_access_key(), time, params.region, params.name); let string_to_sign = calculate_string_to_sign( message_payload.as_ref().map(|v| &v[..]).unwrap_or(&[]), last_signature, @@ -129,7 +146,7 @@ fn sign_payload<'a>( tracing::trace!(canonical_request = ?message_payload, string_to_sign = ?string_to_sign, "calculated signing parameters"); // Generate the signed wrapper event frame - SigningOutput::new( + Ok(SigningOutput::new( Message::new(message_payload.map(Bytes::from).unwrap_or_else(Bytes::new)) .add_header(Header::new( ":chunk-signature", @@ -137,12 +154,16 @@ fn sign_payload<'a>( )) .add_header(Header::new(":date", HeaderValue::Timestamp(time.into()))), signature, - ) + )) } #[cfg(test)] mod tests { - use super::*; + use crate::event_stream::{calculate_string_to_sign, sign_message, SigningParams}; + use crate::sign::v4::sha256_hex_string; + use aws_credential_types::Credentials; + use aws_smithy_eventstream::frame::write_message_to; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use std::time::{Duration, UNIX_EPOCH}; #[test] @@ -152,14 +173,12 @@ mod tests { HeaderValue::String("value".into()), )); let mut message_payload = Vec::new(); - message_to_sign.write_to(&mut message_payload).unwrap(); + write_message_to(&message_to_sign, &mut message_payload).unwrap(); let params = SigningParams { - access_key: "fake access key", - secret_key: "fake secret key", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", - service_name: "testservice", + name: "testservice", time: (UNIX_EPOCH + Duration::new(123_456_789_u64, 1234u32)), settings: (), }; @@ -193,18 +212,17 @@ mod tests { HeaderValue::String("value".into()), )); let params = SigningParams { - access_key: "fake access key", - secret_key: "fake secret key", - security_token: None, + identity: &Credentials::for_tests().into(), region: "us-east-1", - service_name: "testservice", + name: "testservice", time: (UNIX_EPOCH + Duration::new(123_456_789_u64, 1234u32)), settings: (), }; let last_signature = sha256_hex_string(b"last message sts"); - let (signed, signature) = - sign_message(&message_to_sign, &last_signature, ¶ms).into_parts(); + let (signed, signature) = sign_message(&message_to_sign, &last_signature, ¶ms) + .unwrap() + .into_parts(); assert_eq!(":chunk-signature", signed.headers()[0].name().as_str()); if let HeaderValue::ByteArray(bytes) = signed.headers()[0].value() { assert_eq!(signature, hex::encode(bytes)); diff --git a/aws/rust-runtime/aws-sigv4/src/http_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request.rs new file mode 100644 index 00000000000..6bb6b9235c2 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/src/http_request.rs @@ -0,0 +1,206 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Utilities to sign HTTP requests. +//! +//! # Example: Signing an HTTP request +//! +//! **Note**: This requires `http0-compat` to be enabled. +//! +//! ```rust +//! # use aws_credential_types::Credentials; +//! use aws_smithy_runtime_api::client::identity::Identity; +//! # use aws_sigv4::http_request::SignableBody; +//! #[cfg(feature = "http0-compat")] +//! fn test() -> Result<(), aws_sigv4::http_request::SigningError> { +//! use aws_sigv4::http_request::{sign, SigningSettings, SigningParams, SignableRequest}; +//! use aws_sigv4::sign::v4; +//! use http; +//! use std::time::SystemTime; +//! +//! // Set up information and settings for the signing +//! let identity = Credentials::new( +//! "AKIDEXAMPLE", +//! "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", +//! None, +//! None, +//! "hardcoded-credentials" +//! ).into(); +//! let signing_settings = SigningSettings::default(); +//! let signing_params = v4::SigningParams::builder() +//! .identity(&identity) +//! .region("us-east-1") +//! .name("exampleservice") +//! .time(SystemTime::now()) +//! .settings(signing_settings) +//! .build() +//! .unwrap() +//! .into(); +//! // Convert the HTTP request into a signable request +//! let signable_request = SignableRequest::new( +//! "GET", +//! "https://some-endpoint.some-region.amazonaws.com", +//! std::iter::empty(), +//! SignableBody::Bytes(&[]) +//! ).expect("signable request"); +//! +//! let mut my_req = http::Request::new("..."); +//! // Sign and then apply the signature to the request +//! let (signing_instructions, _signature) = sign(signable_request, &signing_params)?.into_parts(); +//! signing_instructions.apply_to_request_http0x(&mut my_req); +//! # Ok(()) +//! # } +//! ``` + +mod canonical_request; +mod error; +mod settings; +mod sign; +mod uri_path_normalization; +mod url_escape; + +#[cfg(test)] +pub(crate) mod test; + +use crate::sign::v4; +#[cfg(feature = "sigv4a")] +use crate::sign::v4a; +use crate::SignatureVersion; +use aws_credential_types::Credentials; +pub use error::SigningError; +pub use settings::{ + PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignatureLocation, SigningSettings, + UriPathNormalizationMode, +}; +pub use sign::{sign, SignableBody, SignableRequest, SigningInstructions}; +use std::time::SystemTime; + +// Individual Debug impls are responsible for redacting sensitive fields. +#[derive(Debug)] +#[non_exhaustive] +/// Parameters for signing an HTTP request. +pub enum SigningParams<'a> { + /// Sign with the SigV4 algorithm + V4(v4::SigningParams<'a, SigningSettings>), + #[cfg(feature = "sigv4a")] + /// Sign with the SigV4a algorithm + V4a(v4a::SigningParams<'a, SigningSettings>), +} + +impl<'a> From> for SigningParams<'a> { + fn from(value: v4::SigningParams<'a, SigningSettings>) -> Self { + Self::V4(value) + } +} + +#[cfg(feature = "sigv4a")] +impl<'a> From> for SigningParams<'a> { + fn from(value: v4a::SigningParams<'a, SigningSettings>) -> Self { + Self::V4a(value) + } +} + +impl<'a> SigningParams<'a> { + /// Return the credentials within the signing params. + pub(crate) fn credentials(&self) -> Result<&Credentials, SigningError> { + let identity = match self { + Self::V4(v4::SigningParams { identity, .. }) => identity, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { identity, .. }) => identity, + }; + + identity + .data::() + .ok_or_else(SigningError::unsupported_identity_type) + } + + /// If the signing params are for SigV4, return the region. Otherwise, return `None`. + pub fn region(&self) -> Option<&str> { + match self { + SigningParams::V4(v4::SigningParams { region, .. }) => Some(region), + #[allow(unreachable_patterns)] + _ => None, + } + } + + #[cfg(feature = "sigv4a")] + /// If the signing params are for SigV4a, return the region set. Otherwise, return `None`. + pub fn region_set(&self) -> Option<&str> { + match self { + SigningParams::V4a(v4a::SigningParams { region_set, .. }) => Some(region_set), + _ => None, + } + } + + /// Return a reference to the settings held by the signing params. + pub fn settings(&self) -> &SigningSettings { + match self { + Self::V4(v4::SigningParams { settings, .. }) => settings, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { settings, .. }) => settings, + } + } + + /// Return a mutable reference to the settings held by the signing params. + pub fn settings_mut(&mut self) -> &mut SigningSettings { + match self { + Self::V4(v4::SigningParams { settings, .. }) => settings, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { settings, .. }) => settings, + } + } + + #[cfg(test)] + /// Set the [`PayloadChecksumKind`] for the signing params. + pub fn set_payload_checksum_kind(&mut self, kind: PayloadChecksumKind) { + let settings = self.settings_mut(); + + settings.payload_checksum_kind = kind; + } + + #[cfg(test)] + /// Set the [`SessionTokenMode`] for the signing params. + pub fn set_session_token_mode(&mut self, mode: SessionTokenMode) { + let settings = self.settings_mut(); + + settings.session_token_mode = mode; + } + + /// Return a reference to the time in the signing params. + pub fn time(&self) -> &SystemTime { + match self { + Self::V4(v4::SigningParams { time, .. }) => time, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { time, .. }) => time, + } + } + + /// Return a reference to the name in the signing params. + pub fn name(&self) -> &str { + match self { + Self::V4(v4::SigningParams { name, .. }) => name, + #[cfg(feature = "sigv4a")] + Self::V4a(v4a::SigningParams { name, .. }) => name, + } + } + + /// Return the name of the configured signing algorithm. + pub fn algorithm(&self) -> &'static str { + match self { + Self::V4(params) => params.algorithm(), + #[cfg(feature = "sigv4a")] + Self::V4a(params) => params.algorithm(), + } + } + + /// Return the name of the signing scheme + pub fn signature_version(&self) -> SignatureVersion { + match self { + Self::V4(..) => SignatureVersion::V4, + #[cfg(feature = "sigv4a")] + Self::V4a(..) => SignatureVersion::V4a, + } + } +} diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs index 221463ada23..32b6cfe4f3d 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs @@ -12,18 +12,21 @@ use crate::http_request::uri_path_normalization::normalize_uri_path; use crate::http_request::url_escape::percent_encode_path; use crate::http_request::PercentEncodingMode; use crate::http_request::{PayloadChecksumKind, SignableBody, SignatureLocation, SigningParams}; -use crate::sign::sha256_hex_string; +use crate::sign::v4::sha256_hex_string; +use crate::SignatureVersion; use aws_smithy_http::query_writer::QueryWriter; use http::header::{AsHeaderName, HeaderName, HOST}; -use http::{HeaderMap, HeaderValue, Method, Uri}; +use http::{HeaderMap, HeaderValue, Uri}; use std::borrow::Cow; use std::cmp::Ordering; use std::convert::TryFrom; use std::fmt; -use std::fmt::Formatter; use std::str::FromStr; use std::time::SystemTime; +#[cfg(feature = "sigv4a")] +pub(crate) mod sigv4a; + pub(crate) mod header { pub(crate) const X_AMZ_CONTENT_SHA_256: &str = "x-amz-content-sha256"; pub(crate) const X_AMZ_DATE: &str = "x-amz-date"; @@ -47,32 +50,36 @@ const UNSIGNED_PAYLOAD: &str = "UNSIGNED-PAYLOAD"; const STREAMING_UNSIGNED_PAYLOAD_TRAILER: &str = "STREAMING-UNSIGNED-PAYLOAD-TRAILER"; #[derive(Debug, PartialEq)] -pub(super) struct HeaderValues<'a> { - pub(super) content_sha256: Cow<'a, str>, - pub(super) date_time: String, - pub(super) security_token: Option<&'a str>, - pub(super) signed_headers: SignedHeaders, +pub(crate) struct HeaderValues<'a> { + pub(crate) content_sha256: Cow<'a, str>, + pub(crate) date_time: String, + pub(crate) security_token: Option<&'a str>, + pub(crate) signed_headers: SignedHeaders, + #[cfg(feature = "sigv4a")] + pub(crate) region_set: Option<&'a str>, } #[derive(Debug, PartialEq)] -pub(super) struct QueryParamValues<'a> { - pub(super) algorithm: &'static str, - pub(super) content_sha256: Cow<'a, str>, - pub(super) credential: String, - pub(super) date_time: String, - pub(super) expires: String, - pub(super) security_token: Option<&'a str>, - pub(super) signed_headers: SignedHeaders, +pub(crate) struct QueryParamValues<'a> { + pub(crate) algorithm: &'static str, + pub(crate) content_sha256: Cow<'a, str>, + pub(crate) credential: String, + pub(crate) date_time: String, + pub(crate) expires: String, + pub(crate) security_token: Option<&'a str>, + pub(crate) signed_headers: SignedHeaders, + #[cfg(feature = "sigv4a")] + pub(crate) region_set: Option<&'a str>, } #[derive(Debug, PartialEq)] -pub(super) enum SignatureValues<'a> { +pub(crate) enum SignatureValues<'a> { Headers(HeaderValues<'a>), QueryParams(QueryParamValues<'a>), } impl<'a> SignatureValues<'a> { - pub(super) fn signed_headers(&self) -> &SignedHeaders { + pub(crate) fn signed_headers(&self) -> &SignedHeaders { match self { SignatureValues::Headers(values) => &values.signed_headers, SignatureValues::QueryParams(values) => &values.signed_headers, @@ -86,14 +93,14 @@ impl<'a> SignatureValues<'a> { } } - pub(super) fn as_headers(&self) -> Option<&HeaderValues<'_>> { + pub(crate) fn as_headers(&self) -> Option<&HeaderValues<'_>> { match self { SignatureValues::Headers(values) => Some(values), _ => None, } } - pub(super) fn into_query_params(self) -> Result, Self> { + pub(crate) fn into_query_params(self) -> Result, Self> { match self { SignatureValues::QueryParams(values) => Ok(values), _ => Err(self), @@ -102,12 +109,12 @@ impl<'a> SignatureValues<'a> { } #[derive(Debug, PartialEq)] -pub(super) struct CanonicalRequest<'a> { - pub(super) method: &'a Method, - pub(super) path: Cow<'a, str>, - pub(super) params: Option, - pub(super) headers: HeaderMap, - pub(super) values: SignatureValues<'a>, +pub(crate) struct CanonicalRequest<'a> { + pub(crate) method: &'a str, + pub(crate) path: Cow<'a, str>, + pub(crate) params: Option, + pub(crate) headers: HeaderMap, + pub(crate) values: SignatureValues<'a>, } impl<'a> CanonicalRequest<'a> { @@ -127,61 +134,85 @@ impl<'a> CanonicalRequest<'a> { /// included before calculating the signature, add it, otherwise omit it. /// - `settings.signature_location` determines where the signature will be placed in a request, /// and also alters the kinds of signing values that go along with it in the request. - pub(super) fn from<'b>( + pub(crate) fn from<'b>( req: &'b SignableRequest<'b>, params: &'b SigningParams<'b>, ) -> Result, CanonicalRequestError> { + let creds = params + .credentials() + .map_err(|_| CanonicalRequestError::unsupported_identity_type())?; // Path encoding: if specified, re-encode % as %25 // Set method and path into CanonicalRequest let path = req.uri().path(); - let path = match params.settings.uri_path_normalization_mode { + let path = match params.settings().uri_path_normalization_mode { UriPathNormalizationMode::Enabled => normalize_uri_path(path), UriPathNormalizationMode::Disabled => Cow::Borrowed(path), }; - let path = match params.settings.percent_encoding_mode { + let path = match params.settings().percent_encoding_mode { // The string is already URI encoded, we don't need to encode everything again, just `%` PercentEncodingMode::Double => Cow::Owned(percent_encode_path(&path)), PercentEncodingMode::Single => path, }; let payload_hash = Self::payload_hash(req.body()); - let date_time = format_date_time(params.time); + let date_time = format_date_time(*params.time()); let (signed_headers, canonical_headers) = Self::headers(req, params, &payload_hash, &date_time)?; let signed_headers = SignedHeaders::new(signed_headers); - let security_token = match params.settings.session_token_mode { - SessionTokenMode::Include => params.security_token, + let security_token = match params.settings().session_token_mode { + SessionTokenMode::Include => creds.session_token(), SessionTokenMode::Exclude => None, }; - let values = match params.settings.signature_location { + let values = match params.settings().signature_location { SignatureLocation::Headers => SignatureValues::Headers(HeaderValues { content_sha256: payload_hash, date_time, security_token, signed_headers, + #[cfg(feature = "sigv4a")] + region_set: params.region_set(), }), - SignatureLocation::QueryParams => SignatureValues::QueryParams(QueryParamValues { - algorithm: "AWS4-HMAC-SHA256", - content_sha256: payload_hash, - credential: format!( - "{}/{}/{}/{}/aws4_request", - params.access_key, - format_date(params.time), - params.region, - params.service_name, - ), - date_time, - expires: params - .settings - .expires_in - .expect("presigning requires expires_in") - .as_secs() - .to_string(), - security_token, - signed_headers, - }), + SignatureLocation::QueryParams => { + let credential = match params { + SigningParams::V4(params) => { + format!( + "{}/{}/{}/{}/aws4_request", + creds.access_key_id(), + format_date(params.time), + params.region, + params.name, + ) + } + #[cfg(feature = "sigv4a")] + SigningParams::V4a(params) => { + format!( + "{}/{}/{}/aws4_request", + creds.access_key_id(), + format_date(params.time), + params.name, + ) + } + }; + + SignatureValues::QueryParams(QueryParamValues { + algorithm: params.algorithm(), + content_sha256: payload_hash, + credential, + date_time, + expires: params + .settings() + .expires_in + .expect("presigning requires expires_in") + .as_secs() + .to_string(), + security_token, + signed_headers, + #[cfg(feature = "sigv4a")] + region_set: params.region_set(), + }) + } }; let creq = CanonicalRequest { @@ -212,43 +243,52 @@ impl<'a> CanonicalRequest<'a> { // Header names and values need to be normalized according to Step 4 of https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html // Using append instead of insert means this will not clobber headers that have the same lowercased name canonical_headers.append( - HeaderName::from_str(&name.as_str().to_lowercase())?, + HeaderName::from_str(&name.to_lowercase())?, normalize_header_value(value)?, ); } Self::insert_host_header(&mut canonical_headers, req.uri()); - if params.settings.signature_location == SignatureLocation::Headers { + if params.settings().signature_location == SignatureLocation::Headers { + let creds = params + .credentials() + .map_err(|_| CanonicalRequestError::unsupported_identity_type())?; Self::insert_date_header(&mut canonical_headers, date_time); - if let Some(security_token) = params.security_token { + if let Some(security_token) = creds.session_token() { let mut sec_header = HeaderValue::from_str(security_token)?; sec_header.set_sensitive(true); canonical_headers.insert(header::X_AMZ_SECURITY_TOKEN, sec_header); } - if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { + if params.settings().payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { let header = HeaderValue::from_str(payload_hash)?; canonical_headers.insert(header::X_AMZ_CONTENT_SHA_256, header); } + + #[cfg(feature = "sigv4a")] + if let Some(region_set) = params.region_set() { + let header = HeaderValue::from_str(region_set)?; + canonical_headers.insert(sigv4a::header::X_AMZ_REGION_SET, header); + } } let mut signed_headers = Vec::with_capacity(canonical_headers.len()); for name in canonical_headers.keys() { - if let Some(excluded_headers) = params.settings.excluded_headers.as_ref() { - if excluded_headers.contains(name) { + if let Some(excluded_headers) = params.settings().excluded_headers.as_ref() { + if excluded_headers.iter().any(|it| name.as_str() == it) { continue; } } - if params.settings.session_token_mode == SessionTokenMode::Exclude + if params.settings().session_token_mode == SessionTokenMode::Exclude && name == HeaderName::from_static(header::X_AMZ_SECURITY_TOKEN) { continue; } - if params.settings.signature_location == SignatureLocation::QueryParams { + if params.settings().signature_location == SignatureLocation::QueryParams { // The X-Amz-User-Agent header should not be signed if this is for a presigned URL if name == HeaderName::from_static(header::X_AMZ_USER_AGENT) { continue; @@ -290,6 +330,12 @@ impl<'a> CanonicalRequest<'a> { if let SignatureValues::QueryParams(values) = values { add_param(&mut params, param::X_AMZ_DATE, &values.date_time); add_param(&mut params, param::X_AMZ_EXPIRES, &values.expires); + + #[cfg(feature = "sigv4a")] + if let Some(regions) = values.region_set { + add_param(&mut params, sigv4a::param::X_AMZ_REGION_SET, regions); + } + add_param(&mut params, param::X_AMZ_ALGORITHM, values.algorithm); add_param(&mut params, param::X_AMZ_CREDENTIAL, &values.credential); add_param( @@ -373,52 +419,47 @@ impl<'a> fmt::Display for CanonicalRequest<'a> { } writeln!(f)?; // write out the signed headers - write!(f, "{}", self.values.signed_headers().as_str())?; - writeln!(f)?; + writeln!(f, "{}", self.values.signed_headers().as_str())?; write!(f, "{}", self.values.content_sha256())?; Ok(()) } } -/// A regex for matching on 2 or more spaces that acts on bytes. -static MULTIPLE_SPACES: once_cell::sync::Lazy = - once_cell::sync::Lazy::new(|| regex::bytes::Regex::new(r" {2,}").unwrap()); - /// Removes excess spaces before and after a given byte string, and converts multiple sequential /// spaces to a single space e.g. " Some example text " -> "Some example text". /// /// This function ONLY affects spaces and not other kinds of whitespace. -fn trim_all(text: &[u8]) -> Cow<'_, [u8]> { - // The normal trim function will trim non-breaking spaces and other various whitespace chars. - // S3 ONLY trims spaces so we use trim_matches to trim spaces only - let text = trim_spaces_from_byte_string(text); - MULTIPLE_SPACES.replace_all(text, " ".as_bytes()) -} - -/// Removes excess spaces before and after a given byte string by returning a subset of those bytes. -/// Will return an empty slice if a string is composed entirely of whitespace. -fn trim_spaces_from_byte_string(bytes: &[u8]) -> &[u8] { - let starting_index = bytes.iter().position(|b| *b != b' ').unwrap_or(0); - let ending_offset = bytes.iter().rev().position(|b| *b != b' ').unwrap_or(0); - let ending_index = bytes.len() - ending_offset; - &bytes[starting_index..ending_index] +fn trim_all(text: &str) -> Cow<'_, str> { + let text = text.trim_matches(' '); + let requires_filter = text + .chars() + .zip(text.chars().skip(1)) + .any(|(a, b)| a == ' ' && b == ' '); + if !requires_filter { + Cow::Borrowed(text) + } else { + // The normal trim function will trim non-breaking spaces and other various whitespace chars. + // S3 ONLY trims spaces so we use trim_matches to trim spaces only + Cow::Owned( + text.chars() + // Filter out consecutive spaces + .zip(text.chars().skip(1).chain(std::iter::once('!'))) + .filter(|(a, b)| *a != ' ' || *b != ' ') + .map(|(a, _)| a) + .collect(), + ) + } } /// Works just like [trim_all] but acts on HeaderValues instead of bytes. /// Will ensure that the underlying bytes are valid UTF-8. -fn normalize_header_value( - header_value: &HeaderValue, -) -> Result { - let trimmed_value = trim_all(header_value.as_bytes()); - HeaderValue::from_str( - std::str::from_utf8(&trimmed_value) - .map_err(CanonicalRequestError::invalid_utf8_in_header_value)?, - ) - .map_err(CanonicalRequestError::from) +fn normalize_header_value(header_value: &str) -> Result { + let trimmed_value = trim_all(header_value); + HeaderValue::from_str(&trimmed_value).map_err(CanonicalRequestError::from) } #[derive(Debug, PartialEq, Default)] -pub(super) struct SignedHeaders { +pub(crate) struct SignedHeaders { headers: Vec, formatted: String, } @@ -442,7 +483,7 @@ impl SignedHeaders { value } - pub(super) fn as_str(&self) -> &str { + pub(crate) fn as_str(&self) -> &str { &self.formatted } } @@ -469,10 +510,16 @@ impl Ord for CanonicalHeaderName { } #[derive(PartialEq, Debug, Clone)] -pub(super) struct SigningScope<'a> { - pub(super) time: SystemTime, - pub(super) region: &'a str, - pub(super) service: &'a str, +pub(crate) struct SigningScope<'a> { + pub(crate) time: SystemTime, + pub(crate) region: &'a str, + pub(crate) service: &'a str, +} + +impl<'a> SigningScope<'a> { + pub(crate) fn v4a_display(&self) -> String { + format!("{}/{}/aws4_request", format_date(self.time), self.service) + } } impl<'a> fmt::Display for SigningScope<'a> { @@ -487,17 +534,19 @@ impl<'a> fmt::Display for SigningScope<'a> { } } -#[derive(PartialEq, Debug)] -pub(super) struct StringToSign<'a> { - pub(super) scope: SigningScope<'a>, - pub(super) time: SystemTime, - pub(super) region: &'a str, - pub(super) service: &'a str, - pub(super) hashed_creq: &'a str, +#[derive(PartialEq, Debug, Clone)] +pub(crate) struct StringToSign<'a> { + pub(crate) algorithm: &'static str, + pub(crate) scope: SigningScope<'a>, + pub(crate) time: SystemTime, + pub(crate) region: &'a str, + pub(crate) service: &'a str, + pub(crate) hashed_creq: &'a str, + signature_version: SignatureVersion, } impl<'a> StringToSign<'a> { - pub(crate) fn new( + pub(crate) fn new_v4( time: SystemTime, region: &'a str, service: &'a str, @@ -509,23 +558,53 @@ impl<'a> StringToSign<'a> { service, }; Self { + algorithm: HMAC_256, scope, time, region, service, hashed_creq, + signature_version: SignatureVersion::V4, + } + } + + #[cfg(feature = "sigv4a")] + pub(crate) fn new_v4a( + time: SystemTime, + region_set: &'a str, + service: &'a str, + hashed_creq: &'a str, + ) -> Self { + use crate::sign::v4a::ECDSA_256; + + let scope = SigningScope { + time, + region: region_set, + service, + }; + Self { + algorithm: ECDSA_256, + scope, + time, + region: region_set, + service, + hashed_creq, + signature_version: SignatureVersion::V4a, } } } impl<'a> fmt::Display for StringToSign<'a> { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "{}\n{}\n{}\n{}", - HMAC_256, + self.algorithm, format_date_time(self.time), - self.scope, + match self.signature_version { + SignatureVersion::V4 => self.scope.to_string(), + SignatureVersion::V4a => self.scope.v4a_display(), + }, self.hashed_creq ) } @@ -537,48 +616,53 @@ mod tests { use crate::http_request::canonical_request::{ normalize_header_value, trim_all, CanonicalRequest, SigningScope, StringToSign, }; - use crate::http_request::test::{test_canonical_request, test_request, test_sts}; + use crate::http_request::test; use crate::http_request::{ - PayloadChecksumKind, SessionTokenMode, SignableBody, SignableRequest, SigningSettings, + PayloadChecksumKind, SessionTokenMode, SignableBody, SignableRequest, SignatureLocation, + SigningParams, SigningSettings, }; - use crate::http_request::{SignatureLocation, SigningParams}; - use crate::sign::sha256_hex_string; + use crate::sign::v4; + use crate::sign::v4::sha256_hex_string; + use aws_credential_types::Credentials; use aws_smithy_http::query_writer::QueryWriter; - use http::Uri; - use http::{header::HeaderName, HeaderValue}; + use aws_smithy_runtime_api::client::identity::Identity; + use http::{HeaderValue, Uri}; use pretty_assertions::assert_eq; use proptest::{prelude::*, proptest}; + use std::borrow::Cow; use std::time::Duration; - fn signing_params(settings: SigningSettings) -> SigningParams<'static> { - SigningParams { - access_key: "test-access-key", - secret_key: "test-secret-key", - security_token: None, - region: "test-region", - service_name: "testservicename", - time: parse_date_time("20210511T154045Z").unwrap(), - settings, - } + fn signing_params(identity: &Identity, settings: SigningSettings) -> SigningParams<'_> { + v4::signing_params::Builder::default() + .identity(identity) + .region("test-region") + .name("testservicename") + .time(parse_date_time("20210511T154045Z").unwrap()) + .settings(settings) + .build() + .unwrap() + .into() } #[test] fn test_repeated_header() { - let mut req = test_request("get-vanilla-query-order-key-case"); - req.headers_mut().append( - "x-amz-object-attributes", - HeaderValue::from_static("Checksum"), - ); - req.headers_mut().append( - "x-amz-object-attributes", - HeaderValue::from_static("ObjectSize"), - ); + let mut req = test::v4::test_request("get-vanilla-query-order-key-case"); + req.headers.push(( + "x-amz-object-attributes".to_string(), + "Checksum".to_string(), + )); + req.headers.push(( + "x-amz-object-attributes".to_string(), + "ObjectSize".to_string(), + )); let req = SignableRequest::from(&req); let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, + session_token_mode: SessionTokenMode::Exclude, ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( @@ -593,13 +677,15 @@ mod tests { #[test] fn test_set_xamz_sha_256() { - let req = test_request("get-vanilla-query-order-key-case"); + let req = test::v4::test_request("get-vanilla-query-order-key-case"); let req = SignableRequest::from(&req); let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, + session_token_mode: SessionTokenMode::Exclude, ..Default::default() }; - let mut signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let mut signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( creq.values.content_sha256(), @@ -611,25 +697,23 @@ mod tests { "host;x-amz-content-sha256;x-amz-date" ); - signing_params.settings.payload_checksum_kind = PayloadChecksumKind::NoHeader; + signing_params.set_payload_checksum_kind(PayloadChecksumKind::NoHeader); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!(creq.values.signed_headers().as_str(), "host;x-amz-date"); } #[test] fn test_unsigned_payload() { - let req = test_request("get-vanilla-query-order-key-case"); - let req = SignableRequest::new( - req.method(), - req.uri(), - req.headers(), - SignableBody::UnsignedPayload, - ); + let mut req = test::v4::test_request("get-vanilla-query-order-key-case"); + req.set_body(SignableBody::UnsignedPayload); + let req: SignableRequest<'_> = SignableRequest::from(&req); + let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!(creq.values.content_sha256(), "UNSIGNED-PAYLOAD"); assert!(creq.to_string().ends_with("UNSIGNED-PAYLOAD")); @@ -638,18 +722,15 @@ mod tests { #[test] fn test_precomputed_payload() { let payload_hash = "44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072"; - let req = test_request("get-vanilla-query-order-key-case"); - let req = SignableRequest::new( - req.method(), - req.uri(), - req.headers(), - SignableBody::Precomputed(String::from(payload_hash)), - ); + let mut req = test::v4::test_request("get-vanilla-query-order-key-case"); + req.set_body(SignableBody::Precomputed(String::from(payload_hash))); + let req = SignableRequest::from(&req); let settings = SigningSettings { payload_checksum_kind: PayloadChecksumKind::XAmzSha256, ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!(creq.values.content_sha256(), payload_hash); assert!(creq.to_string().ends_with(payload_hash)); @@ -669,17 +750,17 @@ mod tests { #[test] fn test_string_to_sign() { let time = parse_date_time("20150830T123600Z").unwrap(); - let creq = test_canonical_request("get-vanilla-query-order-key-case"); - let expected_sts = test_sts("get-vanilla-query-order-key-case"); + let creq = test::v4::test_canonical_request("get-vanilla-query-order-key-case"); + let expected_sts = test::v4::test_sts("get-vanilla-query-order-key-case"); let encoded = sha256_hex_string(creq.as_bytes()); - let actual = StringToSign::new(time, "us-east-1", "service", &encoded); + let actual = StringToSign::new_v4(time, "us-east-1", "service", &encoded); assert_eq!(expected_sts, actual.to_string()); } #[test] fn test_digest_of_canonical_request() { - let creq = test_canonical_request("get-vanilla-query-order-key-case"); + let creq = test::v4::test_canonical_request("get-vanilla-query-order-key-case"); let expected = "816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0"; let actual = sha256_hex_string(creq.as_bytes()); assert_eq!(expected, actual); @@ -687,24 +768,26 @@ mod tests { #[test] fn test_double_url_encode_path() { - let req = test_request("double-encode-path"); + let req = test::v4::test_request("double-encode-path"); let req = SignableRequest::from(&req); - let signing_params = signing_params(SigningSettings::default()); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); - let expected = test_canonical_request("double-encode-path"); + let expected = test::v4::test_canonical_request("double-encode-path"); let actual = format!("{}", creq); assert_eq!(actual, expected); } #[test] fn test_double_url_encode() { - let req = test_request("double-url-encode"); + let req = test::v4::test_request("double-url-encode"); let req = SignableRequest::from(&req); - let signing_params = signing_params(SigningSettings::default()); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); - let expected = test_canonical_request("double-url-encode"); + let expected = test::v4::test_canonical_request("double-url-encode"); let actual = format!("{}", creq); assert_eq!(actual, expected); } @@ -712,9 +795,10 @@ mod tests { #[test] fn test_tilde_in_uri() { let req = http::Request::builder() - .uri("https://s3.us-east-1.amazonaws.com/my-bucket?list-type=2&prefix=~objprefix&single&k=&unreserved=-_.~").body("").unwrap(); + .uri("https://s3.us-east-1.amazonaws.com/my-bucket?list-type=2&prefix=~objprefix&single&k=&unreserved=-_.~").body("").unwrap().into(); let req = SignableRequest::from(&req); - let signing_params = signing_params(SigningSettings::default()); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( Some("k=&list-type=2&prefix=~objprefix&single=&unreserved=-_.~"), @@ -734,9 +818,11 @@ mod tests { let req = http::Request::builder() .uri(query_writer.build_uri()) .body("") - .unwrap(); + .unwrap() + .into(); let req = SignableRequest::from(&req); - let signing_params = signing_params(SigningSettings::default()); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, SigningSettings::default()); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); let expected = "list-type=2&prefix=%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~"; @@ -746,14 +832,14 @@ mod tests { #[test] fn test_omit_session_token() { - let req = test_request("get-vanilla-query-order-key-case"); + let req = test::v4::test_request("get-vanilla-query-order-key-case"); let req = SignableRequest::from(&req); let settings = SigningSettings { session_token_mode: SessionTokenMode::Include, ..Default::default() }; - let mut signing_params = signing_params(settings); - signing_params.security_token = Some("notarealsessiontoken"); + let identity = Credentials::for_tests_with_session_token().into(); + let mut signing_params = signing_params(&identity, settings); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( @@ -765,7 +851,7 @@ mod tests { "notarealsessiontoken" ); - signing_params.settings.session_token_mode = SessionTokenMode::Exclude; + signing_params.set_session_token_mode(SessionTokenMode::Exclude); let creq = CanonicalRequest::from(&req, &signing_params).unwrap(); assert_eq!( creq.headers.get("x-amz-security-token").unwrap(), @@ -786,7 +872,8 @@ mod tests { .header("x-amzn-trace-id", "test-trace-id") .header("x-amz-user-agent", "test-user-agent") .body("") - .unwrap(); + .unwrap() + .into(); let request = SignableRequest::from(&request); let settings = SigningSettings { @@ -794,7 +881,8 @@ mod tests { ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let canonical = CanonicalRequest::from(&request, &signing_params).unwrap(); let values = canonical.values.as_headers().unwrap(); @@ -816,7 +904,8 @@ mod tests { .header("x-amzn-trace-id", "test-trace-id") .header("x-amz-user-agent", "test-user-agent") .body("") - .unwrap(); + .unwrap() + .into(); let request = SignableRequest::from(&request); let settings = SigningSettings { @@ -825,7 +914,8 @@ mod tests { ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let canonical = CanonicalRequest::from(&request, &signing_params).unwrap(); let values = canonical.values.into_query_params().unwrap(); @@ -835,11 +925,25 @@ mod tests { ); } + #[allow(clippy::ptr_arg)] // The proptest macro requires this arg to be a Vec instead of a slice. + fn valid_input(input: &Vec) -> bool { + [ + "content-length".to_owned(), + "content-type".to_owned(), + "host".to_owned(), + ] + .iter() + .all(|element| !input.contains(element)) + } + proptest! { - #[test] - fn presigning_header_exclusion_with_explicit_exclusion_list_specified( - excluded_headers in prop::collection::vec("[a-z]{1,20}", 1..10), - ) { + #[test] + fn presigning_header_exclusion_with_explicit_exclusion_list_specified( + excluded_headers in prop::collection::vec("[a-z]{1,20}", 1..10).prop_filter( + "`excluded_headers` should pass the `valid_input` check", + valid_input, + ) + ) { let mut request_builder = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header("content-type", "application/xml") @@ -847,7 +951,7 @@ mod tests { for key in &excluded_headers { request_builder = request_builder.header(key, "value"); } - let request = request_builder.body("").unwrap(); + let request = request_builder.body("").unwrap().into(); let request = SignableRequest::from(&request); @@ -857,15 +961,14 @@ mod tests { excluded_headers: Some( excluded_headers .into_iter() - .map(|header_string| { - HeaderName::from_static(Box::leak(header_string.into_boxed_str())) - }) + .map(std::borrow::Cow::Owned) .collect(), ), ..Default::default() }; - let signing_params = signing_params(settings); + let identity = Credentials::for_tests().into(); + let signing_params = signing_params(&identity, settings); let canonical = CanonicalRequest::from(&request, &signing_params).unwrap(); let values = canonical.values.into_query_params().unwrap(); @@ -878,50 +981,45 @@ mod tests { #[test] fn test_trim_all_handles_spaces_correctly() { - // Can't compare a byte array to a Cow so we convert both to slices before comparing - let expected = &b"Some example text"[..]; - let actual = &trim_all(b" Some example text ")[..]; - - assert_eq!(expected, actual); + assert_eq!(Cow::Borrowed("don't touch me"), trim_all("don't touch me")); + assert_eq!("trim left", trim_all(" trim left")); + assert_eq!("trim right", trim_all("trim right ")); + assert_eq!("trim both", trim_all(" trim both ")); + assert_eq!("", trim_all(" ")); + assert_eq!("", trim_all(" ")); + assert_eq!("a b", trim_all(" a b ")); + assert_eq!("Some example text", trim_all(" Some example text ")); } #[test] fn test_trim_all_ignores_other_forms_of_whitespace() { - // Can't compare a byte array to a Cow so we convert both to slices before comparing - let expected = &b"\t\xA0Some\xA0 example \xA0text\xA0\n"[..]; // \xA0 is a non-breaking space character - let actual = &trim_all(b"\t\xA0Some\xA0 example \xA0text\xA0\n")[..]; - - assert_eq!(expected, actual); + assert_eq!( + "\t\u{A0}Some\u{A0} example \u{A0}text\u{A0}\n", + trim_all("\t\u{A0}Some\u{A0} example \u{A0}text\u{A0}\n") + ); } #[test] fn trim_spaces_works_on_single_characters() { - assert_eq!(trim_all(b"2").as_ref(), b"2"); + assert_eq!(trim_all("2").as_ref(), "2"); } proptest! { #[test] fn test_trim_all_doesnt_elongate_strings(s in ".*") { - assert!(trim_all(s.as_bytes()).len() <= s.len()) + assert!(trim_all(&s).len() <= s.len()) } #[test] fn test_normalize_header_value_works_on_valid_header_value(v in (".*")) { - if let Ok(header_value) = HeaderValue::from_maybe_shared(v) { - assert!(normalize_header_value(&header_value).is_ok()); - } + prop_assume!(HeaderValue::from_str(&v).is_ok()); + assert!(normalize_header_value(&v).is_ok()); } #[test] fn test_trim_all_does_nothing_when_there_are_no_spaces(s in "[^ ]*") { - assert_eq!(trim_all(s.as_bytes()).as_ref(), s.as_bytes()); + assert_eq!(trim_all(&s).as_ref(), s); } } - - #[test] - fn test_normalize_header_value_returns_expected_error_on_invalid_utf8() { - let header_value = HeaderValue::from_bytes(&[0xC0, 0xC1]).unwrap(); - assert!(normalize_header_value(&header_value).is_err()); - } } diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request/sigv4a.rs b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request/sigv4a.rs new file mode 100644 index 00000000000..04b094053fb --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/src/http_request/canonical_request/sigv4a.rs @@ -0,0 +1,12 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +pub(crate) mod header { + pub(crate) const X_AMZ_REGION_SET: &str = "x-amz-region-set"; +} + +pub(crate) mod param { + pub(crate) const X_AMZ_REGION_SET: &str = "X-Amz-Region-Set"; +} diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs index d67acbc3275..39f57dffa5d 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/error.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/error.rs @@ -4,13 +4,14 @@ */ use http::header::{InvalidHeaderName, InvalidHeaderValue}; +use http::uri::InvalidUri; use std::error::Error; use std::fmt; -use std::str::Utf8Error; #[derive(Debug)] enum SigningErrorKind { FailedToCreateCanonicalRequest { source: CanonicalRequestError }, + UnsupportedIdentityType, } /// Error signing request @@ -19,12 +20,23 @@ pub struct SigningError { kind: SigningErrorKind, } +impl SigningError { + pub(crate) fn unsupported_identity_type() -> Self { + Self { + kind: SigningErrorKind::UnsupportedIdentityType, + } + } +} + impl fmt::Display for SigningError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self.kind { SigningErrorKind::FailedToCreateCanonicalRequest { .. } => { write!(f, "failed to create canonical request") } + SigningErrorKind::UnsupportedIdentityType => { + write!(f, "only 'AWS credentials' are supported for signing") + } } } } @@ -33,6 +45,7 @@ impl Error for SigningError { fn source(&self) -> Option<&(dyn Error + 'static)> { match &self.kind { SigningErrorKind::FailedToCreateCanonicalRequest { source } => Some(source), + SigningErrorKind::UnsupportedIdentityType => None, } } } @@ -49,7 +62,8 @@ impl From for SigningError { enum CanonicalRequestErrorKind { InvalidHeaderName { source: InvalidHeaderName }, InvalidHeaderValue { source: InvalidHeaderValue }, - InvalidUtf8InHeaderValue { source: Utf8Error }, + InvalidUri { source: InvalidUri }, + UnsupportedIdentityType, } #[derive(Debug)] @@ -63,7 +77,10 @@ impl fmt::Display for CanonicalRequestError { match self.kind { InvalidHeaderName { .. } => write!(f, "invalid header name"), InvalidHeaderValue { .. } => write!(f, "invalid header value"), - InvalidUtf8InHeaderValue { .. } => write!(f, "invalid UTF-8 in header value"), + InvalidUri { .. } => write!(f, "the uri was invalid"), + UnsupportedIdentityType => { + write!(f, "only AWS credentials are supported for signing") + } } } } @@ -74,15 +91,16 @@ impl Error for CanonicalRequestError { match &self.kind { InvalidHeaderName { source } => Some(source), InvalidHeaderValue { source } => Some(source), - InvalidUtf8InHeaderValue { source } => Some(source), + InvalidUri { source } => Some(source), + UnsupportedIdentityType => None, } } } impl CanonicalRequestError { - pub(crate) fn invalid_utf8_in_header_value(source: Utf8Error) -> Self { + pub(crate) fn unsupported_identity_type() -> Self { Self { - kind: CanonicalRequestErrorKind::InvalidUtf8InHeaderValue { source }, + kind: CanonicalRequestErrorKind::UnsupportedIdentityType, } } } @@ -102,3 +120,11 @@ impl From for CanonicalRequestError { } } } + +impl From for CanonicalRequestError { + fn from(source: InvalidUri) -> Self { + Self { + kind: CanonicalRequestErrorKind::InvalidUri { source }, + } + } +} diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs b/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs deleted file mode 100644 index db021bbee5b..00000000000 --- a/aws/rust-runtime/aws-sigv4/src/http_request/mod.rs +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Utilities to sign HTTP requests. -//! -//! # Example: Signing an HTTP request -//! -//! ```rust -//! # fn test() -> Result<(), aws_sigv4::http_request::SigningError> { -//! use aws_sigv4::http_request::{sign, SigningSettings, SigningParams, SignableRequest}; -//! use http; -//! use std::time::SystemTime; -//! -//! // Create the request to sign -//! let mut request = http::Request::builder() -//! .uri("https://some-endpoint.some-region.amazonaws.com") -//! .body("") -//! .unwrap(); -//! -//! // Set up information and settings for the signing -//! let signing_settings = SigningSettings::default(); -//! let signing_params = SigningParams::builder() -//! .access_key("example access key") -//! .secret_key("example secret key") -//! .region("us-east-1") -//! .service_name("exampleservice") -//! .time(SystemTime::now()) -//! .settings(signing_settings) -//! .build() -//! .unwrap(); -//! // Convert the HTTP request into a signable request -//! let signable_request = SignableRequest::from(&request); -//! -//! // Sign and then apply the signature to the request -//! let (signing_instructions, _signature) = sign(signable_request, &signing_params)?.into_parts(); -//! signing_instructions.apply_to_request(&mut request); -//! # Ok(()) -//! # } -//! ``` -//! - -mod canonical_request; -mod error; -mod settings; -mod sign; -mod uri_path_normalization; -mod url_escape; - -#[cfg(test)] -pub(crate) mod test; - -pub use error::SigningError; -pub use settings::{ - PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignatureLocation, SigningParams, - SigningSettings, UriPathNormalizationMode, -}; -pub use sign::{sign, SignableBody, SignableRequest, SigningInstructions}; diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs b/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs index 501cd5c775f..3c690e6ddca 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/settings.rs @@ -3,12 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -use http::header::{HeaderName, AUTHORIZATION, USER_AGENT}; +use http::header::{AUTHORIZATION, USER_AGENT}; +use std::borrow::Cow; use std::time::Duration; -/// HTTP signing parameters -pub type SigningParams<'a> = crate::SigningParams<'a, SigningSettings>; - const HEADER_NAME_X_RAY_TRACE_ID: &str = "x-amzn-trace-id"; /// HTTP-specific signing settings @@ -30,7 +28,7 @@ pub struct SigningSettings { pub expires_in: Option, /// Headers that should be excluded from the signing process - pub excluded_headers: Option>, + pub excluded_headers: Option>>, /// Specifies whether the absolute path component of the URI should be normalized during signing. pub uri_path_normalization_mode: UriPathNormalizationMode, @@ -85,6 +83,16 @@ pub enum UriPathNormalizationMode { Disabled, } +impl From for UriPathNormalizationMode { + fn from(value: bool) -> Self { + if value { + UriPathNormalizationMode::Enabled + } else { + UriPathNormalizationMode::Disabled + } + } +} + /// Config value to specify whether X-Amz-Security-Token should be part of the canonical request. /// #[non_exhaustive] @@ -109,11 +117,11 @@ impl Default for SigningSettings { let excluded_headers = Some( [ // This header is calculated as part of the signing process, so if it's present, discard it - AUTHORIZATION, + Cow::Borrowed(AUTHORIZATION.as_str()), // Changes when sent by proxy - USER_AGENT, + Cow::Borrowed(USER_AGENT.as_str()), // Changes based on the request from the client - HeaderName::from_static(HEADER_NAME_X_RAY_TRACE_ID), + Cow::Borrowed(HEADER_NAME_X_RAY_TRACE_ID), ] .to_vec(), ); diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs index 69d646daa24..2cef0dbd3ce 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/sign.rs @@ -7,57 +7,62 @@ use super::error::SigningError; use super::{PayloadChecksumKind, SignatureLocation}; use crate::http_request::canonical_request::header; use crate::http_request::canonical_request::param; -use crate::http_request::canonical_request::{CanonicalRequest, StringToSign, HMAC_256}; +use crate::http_request::canonical_request::{CanonicalRequest, StringToSign}; +use crate::http_request::error::CanonicalRequestError; use crate::http_request::SigningParams; -use crate::sign::{calculate_signature, generate_signing_key, sha256_hex_string}; -use crate::SigningOutput; -use aws_smithy_http::query_writer::QueryWriter; -use http::header::HeaderValue; -use http::{HeaderMap, Method, Uri}; +use crate::sign::v4; +#[cfg(feature = "sigv4a")] +use crate::sign::v4a; +use crate::{SignatureVersion, SigningOutput}; +use http::Uri; use std::borrow::Cow; -use std::convert::TryFrom; +use std::fmt::{Debug, Formatter}; use std::str; /// Represents all of the information necessary to sign an HTTP request. #[derive(Debug)] #[non_exhaustive] pub struct SignableRequest<'a> { - method: &'a Method, - uri: &'a Uri, - headers: &'a HeaderMap, + method: &'a str, + uri: Uri, + headers: Vec<(&'a str, &'a str)>, body: SignableBody<'a>, } impl<'a> SignableRequest<'a> { - /// Creates a new `SignableRequest`. If you have an [`http::Request`], then - /// consider using [`SignableRequest::from`] instead of `new`. + /// Creates a new `SignableRequest`. pub fn new( - method: &'a Method, - uri: &'a Uri, - headers: &'a HeaderMap, + method: &'a str, + uri: impl Into>, + headers: impl Iterator, body: SignableBody<'a>, - ) -> Self { - Self { + ) -> Result { + let uri = uri + .into() + .parse() + .map_err(|e| SigningError::from(CanonicalRequestError::from(e)))?; + let headers = headers.collect(); + Ok(Self { method, uri, headers, body, - } + }) } /// Returns the signable URI - pub fn uri(&self) -> &Uri { - self.uri + pub(crate) fn uri(&self) -> &Uri { + &self.uri } /// Returns the signable HTTP method - pub fn method(&self) -> &Method { + pub(crate) fn method(&self) -> &str { self.method } /// Returns the request headers - pub fn headers(&self) -> &HeaderMap { - self.headers + pub(crate) fn headers(&self) -> &[(&str, &str)] { + self.headers.as_slice() } /// Returns the signable body @@ -66,21 +71,6 @@ impl<'a> SignableRequest<'a> { } } -impl<'a, B> From<&'a http::Request> for SignableRequest<'a> -where - B: 'a, - B: AsRef<[u8]>, -{ - fn from(request: &'a http::Request) -> SignableRequest<'a> { - SignableRequest::new( - request.method(), - request.uri(), - request.headers(), - SignableBody::Bytes(request.body().as_ref()), - ) - } -} - /// A signable HTTP request body #[derive(Debug, Clone, Eq, PartialEq)] #[non_exhaustive] @@ -106,48 +96,83 @@ pub enum SignableBody<'a> { /// Instructions for applying a signature to an HTTP request. #[derive(Debug)] pub struct SigningInstructions { - headers: Option>, - params: Option)>>, + headers: Vec
, + params: Vec<(&'static str, Cow<'static, str>)>, +} + +/// Header representation for use in [`SigningInstructions`] +pub struct Header { + key: &'static str, + value: String, + sensitive: bool, +} + +impl Debug for Header { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let mut fmt = f.debug_struct("Header"); + fmt.field("key", &self.key); + let value = if self.sensitive { + "** REDACTED **" + } else { + &self.value + }; + fmt.field("value", &value); + fmt.finish() + } +} + +impl Header { + /// The name of this header + pub fn name(&self) -> &'static str { + self.key + } + + /// The value of this header + pub fn value(&self) -> &str { + &self.value + } + + /// Whether this header has a sensitive value + pub fn sensitive(&self) -> bool { + self.sensitive + } } impl SigningInstructions { - fn new( - headers: Option>, - params: Option)>>, - ) -> Self { + fn new(headers: Vec
, params: Vec<(&'static str, Cow<'static, str>)>) -> Self { Self { headers, params } } - /// Returns a reference to the headers that should be added to the request. - pub fn headers(&self) -> Option<&HeaderMap> { - self.headers.as_ref() + /// Returns the headers and query params that should be applied to this request + pub fn into_parts(self) -> (Vec
, Vec<(&'static str, Cow<'static, str>)>) { + (self.headers, self.params) } - /// Returns the headers and sets the internal value to `None`. - pub fn take_headers(&mut self) -> Option> { - self.headers.take() + /// Returns a reference to the headers that should be added to the request. + pub fn headers(&self) -> impl Iterator { + self.headers + .iter() + .map(|header| (header.key, header.value.as_str())) } /// Returns a reference to the query parameters that should be added to the request. - pub fn params(&self) -> Option<&Vec<(&'static str, Cow<'static, str>)>> { - self.params.as_ref() - } - - /// Returns the query parameters and sets the internal value to `None`. - pub fn take_params(&mut self) -> Option)>> { - self.params.take() + pub fn params(&self) -> &[(&str, Cow<'static, str>)] { + self.params.as_slice() } + #[cfg(any(feature = "http0-compat", test))] /// Applies the instructions to the given `request`. - pub fn apply_to_request(mut self, request: &mut http::Request) { - if let Some(new_headers) = self.take_headers() { - for (name, value) in new_headers.into_iter() { - request.headers_mut().insert(name.unwrap(), value); - } + pub fn apply_to_request_http0x(self, request: &mut http::Request) { + let (new_headers, new_query) = self.into_parts(); + for header in new_headers.into_iter() { + let mut value = http::HeaderValue::from_str(&header.value).unwrap(); + value.set_sensitive(header.sensitive); + request.headers_mut().insert(header.key, value); } - if let Some(params) = self.take_params() { - let mut query = QueryWriter::new(request.uri()); - for (name, value) in params { + + if !new_query.is_empty() { + let mut query = aws_smithy_http::query_writer::QueryWriter::new(request.uri()); + for (name, value) in new_query { query.insert(name, &value); } *request.uri_mut() = query.build_uri(); @@ -162,19 +187,19 @@ pub fn sign<'a>( params: &'a SigningParams<'a>, ) -> Result, SigningError> { tracing::trace!(request = ?request, params = ?params, "signing request"); - match params.settings.signature_location { + match params.settings().signature_location { SignatureLocation::Headers => { let (signing_headers, signature) = calculate_signing_headers(&request, params)?.into_parts(); Ok(SigningOutput::new( - SigningInstructions::new(Some(signing_headers), None), + SigningInstructions::new(signing_headers, vec![]), signature, )) } SignatureLocation::QueryParams => { let (params, signature) = calculate_signing_params(&request, params)?; Ok(SigningOutput::new( - SigningInstructions::new(None, Some(params)), + SigningInstructions::new(vec![], params), signature, )) } @@ -187,23 +212,36 @@ fn calculate_signing_params<'a>( request: &'a SignableRequest<'a>, params: &'a SigningParams<'a>, ) -> Result<(CalculatedParams, String), SigningError> { + let creds = params.credentials()?; let creq = CanonicalRequest::from(request, params)?; - - let encoded_creq = &sha256_hex_string(creq.to_string().as_bytes()); - let string_to_sign = StringToSign::new( - params.time, - params.region, - params.service_name, - encoded_creq, - ) - .to_string(); - let signing_key = generate_signing_key( - params.secret_key, - params.time, - params.region, - params.service_name, - ); - let signature = calculate_signature(signing_key, string_to_sign.as_bytes()); + let encoded_creq = &v4::sha256_hex_string(creq.to_string().as_bytes()); + + let (signature, string_to_sign) = match params { + SigningParams::V4(params) => { + let string_to_sign = + StringToSign::new_v4(params.time, params.region, params.name, encoded_creq) + .to_string(); + let signing_key = v4::generate_signing_key( + creds.secret_access_key(), + params.time, + params.region, + params.name, + ); + let signature = v4::calculate_signature(signing_key, string_to_sign.as_bytes()); + (signature, string_to_sign) + } + #[cfg(feature = "sigv4a")] + SigningParams::V4a(params) => { + let string_to_sign = + StringToSign::new_v4a(params.time, params.region_set, params.name, encoded_creq) + .to_string(); + + let secret_key = + v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key()); + let signature = v4a::calculate_signature(&secret_key, string_to_sign.as_bytes()); + (signature, string_to_sign) + } + }; tracing::trace!(canonical_request = %creq, string_to_sign = %string_to_sign, "calculated signing parameters"); let values = creq.values.into_query_params().expect("signing with query"); @@ -219,7 +257,17 @@ fn calculate_signing_params<'a>( (param::X_AMZ_SIGNATURE, Cow::Owned(signature.clone())), ]; - if let Some(security_token) = params.security_token { + #[cfg(feature = "sigv4a")] + if let Some(region_set) = params.region_set() { + if params.signature_version() == SignatureVersion::V4a { + signing_params.push(( + crate::http_request::canonical_request::sigv4a::param::X_AMZ_REGION_SET, + Cow::Owned(region_set.to_owned()), + )); + } + } + + if let Some(security_token) = creds.session_token() { signing_params.push(( param::X_AMZ_SECURITY_TOKEN, Cow::Owned(security_token.to_string()), @@ -238,62 +286,130 @@ fn calculate_signing_params<'a>( fn calculate_signing_headers<'a>( request: &'a SignableRequest<'a>, params: &'a SigningParams<'a>, -) -> Result>, SigningError> { +) -> Result>, SigningError> { + let creds = params.credentials()?; + // Step 1: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-canonical-request.html. let creq = CanonicalRequest::from(request, params)?; + // Step 2: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-string-to-sign.html. + let encoded_creq = v4::sha256_hex_string(creq.to_string().as_bytes()); tracing::trace!(canonical_request = %creq); + let mut headers = vec![]; + + let signature = match params { + SigningParams::V4(params) => { + let sts = StringToSign::new_v4( + params.time, + params.region, + params.name, + encoded_creq.as_str(), + ); + + // Step 3: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-calculate-signature.html + let signing_key = v4::generate_signing_key( + creds.secret_access_key(), + params.time, + params.region, + params.name, + ); + let signature = v4::calculate_signature(signing_key, sts.to_string().as_bytes()); + + // Step 4: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-add-signature-to-request.html + let values = creq.values.as_headers().expect("signing with headers"); + add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false); + headers.push(Header { + key: "authorization", + value: build_authorization_header( + creds.access_key_id(), + &creq, + sts, + &signature, + SignatureVersion::V4, + ), + sensitive: false, + }); + if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { + add_header( + &mut headers, + header::X_AMZ_CONTENT_SHA_256, + &values.content_sha256, + false, + ); + } - // Step 2: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-string-to-sign.html. - let encoded_creq = &sha256_hex_string(creq.to_string().as_bytes()); - let sts = StringToSign::new( - params.time, - params.region, - params.service_name, - encoded_creq, - ); - - // Step 3: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-calculate-signature.html - let signing_key = generate_signing_key( - params.secret_key, - params.time, - params.region, - params.service_name, - ); - let signature = calculate_signature(signing_key, sts.to_string().as_bytes()); - - // Step 4: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-add-signature-to-request.html - let values = creq.values.as_headers().expect("signing with headers"); - let mut headers = HeaderMap::new(); - add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false); - headers.insert( - "authorization", - build_authorization_header(params.access_key, &creq, sts, &signature), - ); - if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { - add_header( - &mut headers, - header::X_AMZ_CONTENT_SHA_256, - &values.content_sha256, - false, - ); - } + if let Some(security_token) = creds.session_token() { + add_header( + &mut headers, + header::X_AMZ_SECURITY_TOKEN, + security_token, + true, + ); + } + signature + } + #[cfg(feature = "sigv4a")] + SigningParams::V4a(params) => { + let sts = StringToSign::new_v4a( + params.time, + params.region_set, + params.name, + encoded_creq.as_str(), + ); + + let signing_key = + v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key()); + let signature = v4a::calculate_signature(&signing_key, sts.to_string().as_bytes()); + + let values = creq.values.as_headers().expect("signing with headers"); + add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false); + add_header( + &mut headers, + crate::http_request::canonical_request::sigv4a::header::X_AMZ_REGION_SET, + params.region_set, + false, + ); + + headers.push(Header { + key: "authorization", + value: build_authorization_header( + creds.access_key_id(), + &creq, + sts, + &signature, + SignatureVersion::V4a, + ), + sensitive: false, + }); + if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 { + add_header( + &mut headers, + header::X_AMZ_CONTENT_SHA_256, + &values.content_sha256, + false, + ); + } - if let Some(security_token) = params.security_token { - add_header( - &mut headers, - header::X_AMZ_SECURITY_TOKEN, - security_token, - true, - ); - } + if let Some(security_token) = creds.session_token() { + add_header( + &mut headers, + header::X_AMZ_SECURITY_TOKEN, + security_token, + true, + ); + } + signature + } + }; Ok(SigningOutput::new(headers, signature)) } -fn add_header(map: &mut HeaderMap, key: &'static str, value: &str, sensitive: bool) { - let mut value = HeaderValue::try_from(value).expect(key); - value.set_sensitive(sensitive); - map.insert(key, value); +fn add_header(map: &mut Vec
, key: &'static str, value: &str, sensitive: bool) { + map.push(Header { + key, + value: value.to_string(), + sensitive, + }); } // add signature to authorization header @@ -303,100 +419,368 @@ fn build_authorization_header( creq: &CanonicalRequest<'_>, sts: StringToSign<'_>, signature: &str, -) -> HeaderValue { - let mut value = HeaderValue::try_from(format!( + signature_version: SignatureVersion, +) -> String { + let scope = match signature_version { + SignatureVersion::V4 => sts.scope.to_string(), + SignatureVersion::V4a => sts.scope.v4a_display(), + }; + format!( "{} Credential={}/{}, SignedHeaders={}, Signature={}", - HMAC_256, + sts.algorithm, access_key, - sts.scope, + scope, creq.values.signed_headers().as_str(), signature - )) - .unwrap(); - value.set_sensitive(true); - value + ) } - #[cfg(test)] mod tests { - use super::{sign, SigningInstructions}; use crate::date_time::test_parsers::parse_date_time; - use crate::http_request::sign::SignableRequest; - use crate::http_request::test::{ - make_headers_comparable, test_request, test_signed_request, - test_signed_request_query_params, - }; + use crate::http_request::sign::{add_header, SignableRequest}; use crate::http_request::{ - SessionTokenMode, SignatureLocation, SigningParams, SigningSettings, + sign, test, SessionTokenMode, SignableBody, SignatureLocation, SigningInstructions, + SigningSettings, }; - use http::{HeaderMap, HeaderValue}; + use crate::sign::v4; + use aws_credential_types::Credentials; + use http::{HeaderValue, Request}; use pretty_assertions::assert_eq; use proptest::proptest; use std::borrow::Cow; + use std::iter; use std::time::Duration; macro_rules! assert_req_eq { - ($a:tt, $b:tt) => { - make_headers_comparable(&mut $a); - make_headers_comparable(&mut $b); - assert_eq!(format!("{:?}", $a), format!("{:?}", $b)) + (http: $expected:expr, $actual:expr) => { + let mut expected = ($expected).map(|_b|"body"); + let mut actual = ($actual).map(|_b|"body"); + make_headers_comparable(&mut expected); + make_headers_comparable(&mut actual); + assert_eq!(format!("{:?}", expected), format!("{:?}", actual)); }; + ($expected:tt, $actual:tt) => { + assert_req_eq!(http: ($expected).as_http_request(), $actual); + }; + } + + pub(crate) fn make_headers_comparable(request: &mut Request) { + for (_name, value) in request.headers_mut() { + value.set_sensitive(false); + } } #[test] fn test_sign_vanilla_with_headers() { let settings = SigningSettings::default(); - let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); - let original = test_request("get-vanilla-query-order-key-case"); + let original = test::v4::test_request("get-vanilla-query-order-key-case"); let signable = SignableRequest::from(&original); let out = sign(signable, ¶ms).unwrap(); assert_eq!( - "b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500", + "5557820e7380d585310524bd93d51a08d7757fb5efd7344ee12088f2b0860947", out.signature ); - let mut signed = original; - out.output.apply_to_request(&mut signed); + let mut signed = original.as_http_request(); + out.output.apply_to_request_http0x(&mut signed); - let mut expected = test_signed_request("get-vanilla-query-order-key-case"); + let expected = test::v4::test_signed_request("get-vanilla-query-order-key-case"); assert_req_eq!(expected, signed); } + #[cfg(feature = "sigv4a")] + mod sigv4a_tests { + use super::*; + use crate::http_request::canonical_request::{CanonicalRequest, StringToSign}; + use crate::http_request::{sign, test, SigningParams}; + use crate::sign::v4a; + use p256::ecdsa::signature::{Signature, Verifier}; + use p256::ecdsa::{DerSignature, SigningKey}; + use pretty_assertions::assert_eq; + + fn new_v4a_signing_params_from_context( + test_context: &'_ test::v4a::TestContext, + signature_location: SignatureLocation, + ) -> SigningParams<'_> { + let mut params = v4a::SigningParams::from(test_context); + params.settings.signature_location = signature_location; + + params.into() + } + + fn run_v4a_test_suite(test_name: &str, signature_location: SignatureLocation) { + let tc = test::v4a::test_context(test_name); + let params = new_v4a_signing_params_from_context(&tc, signature_location); + + let req = test::v4a::test_request(test_name); + let expected_creq = test::v4a::test_canonical_request(test_name, signature_location); + let signable_req = SignableRequest::from(&req); + let actual_creq = CanonicalRequest::from(&signable_req, ¶ms).unwrap(); + + assert_eq!(expected_creq, actual_creq.to_string(), "creq didn't match"); + + let expected_string_to_sign = + test::v4a::test_string_to_sign(test_name, signature_location); + let hashed_creq = &v4::sha256_hex_string(actual_creq.to_string().as_bytes()); + let actual_string_to_sign = StringToSign::new_v4a( + *params.time(), + params.region_set().unwrap(), + params.name(), + hashed_creq, + ) + .to_string(); + + assert_eq!( + expected_string_to_sign, actual_string_to_sign, + "'string to sign' didn't match" + ); + + let out = sign(signable_req, ¶ms).unwrap(); + // Sigv4a signatures are non-deterministic, so we can't compare the signature directly. + out.output + .apply_to_request_http0x(&mut req.as_http_request()); + + let creds = params.credentials().unwrap(); + let signing_key = + v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key()); + let sig = DerSignature::from_bytes(&hex::decode(out.signature).unwrap()).unwrap(); + let sig = sig + .try_into() + .expect("DER-style signatures are always convertible into fixed-size signatures"); + + let signing_key = SigningKey::from_bytes(signing_key.as_ref()).unwrap(); + let peer_public_key = signing_key.verifying_key(); + let sts = actual_string_to_sign.as_bytes(); + peer_public_key.verify(sts, &sig).unwrap(); + } + + #[test] + fn test_get_header_key_duplicate() { + run_v4a_test_suite("get-header-key-duplicate", SignatureLocation::Headers); + } + + #[test] + fn test_get_header_value_order() { + run_v4a_test_suite("get-header-value-order", SignatureLocation::Headers); + } + + #[test] + fn test_get_header_value_trim() { + run_v4a_test_suite("get-header-value-trim", SignatureLocation::Headers); + } + + #[test] + fn test_get_relative_normalized() { + run_v4a_test_suite("get-relative-normalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_relative_relative_normalized() { + run_v4a_test_suite( + "get-relative-relative-normalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_relative_relative_unnormalized() { + run_v4a_test_suite( + "get-relative-relative-unnormalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_relative_unnormalized() { + run_v4a_test_suite("get-relative-unnormalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slash_dot_slash_normalized() { + run_v4a_test_suite("get-slash-dot-slash-normalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slash_dot_slash_unnormalized() { + run_v4a_test_suite( + "get-slash-dot-slash-unnormalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_slash_normalized() { + run_v4a_test_suite("get-slash-normalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slash_pointless_dot_normalized() { + run_v4a_test_suite( + "get-slash-pointless-dot-normalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_slash_pointless_dot_unnormalized() { + run_v4a_test_suite( + "get-slash-pointless-dot-unnormalized", + SignatureLocation::Headers, + ); + } + + #[test] + fn test_get_slash_unnormalized() { + run_v4a_test_suite("get-slash-unnormalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slashes_normalized() { + run_v4a_test_suite("get-slashes-normalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_slashes_unnormalized() { + run_v4a_test_suite("get-slashes-unnormalized", SignatureLocation::Headers); + } + + #[test] + fn test_get_unreserved() { + run_v4a_test_suite("get-unreserved", SignatureLocation::Headers); + } + + #[test] + fn test_get_vanilla() { + run_v4a_test_suite("get-vanilla", SignatureLocation::Headers); + } + + #[test] + fn test_get_vanilla_empty_query_key() { + run_v4a_test_suite( + "get-vanilla-empty-query-key", + SignatureLocation::QueryParams, + ); + } + + #[test] + fn test_get_vanilla_query() { + run_v4a_test_suite("get-vanilla-query", SignatureLocation::QueryParams); + } + + #[test] + fn test_get_vanilla_query_order_key_case() { + run_v4a_test_suite( + "get-vanilla-query-order-key-case", + SignatureLocation::QueryParams, + ); + } + + #[test] + fn test_get_vanilla_query_unreserved() { + run_v4a_test_suite( + "get-vanilla-query-unreserved", + SignatureLocation::QueryParams, + ); + } + + #[test] + fn test_get_vanilla_with_session_token() { + run_v4a_test_suite("get-vanilla-with-session-token", SignatureLocation::Headers); + } + + #[test] + fn test_post_header_key_case() { + run_v4a_test_suite("post-header-key-case", SignatureLocation::Headers); + } + + #[test] + fn test_post_header_key_sort() { + run_v4a_test_suite("post-header-key-sort", SignatureLocation::Headers); + } + + #[test] + fn test_post_header_value_case() { + run_v4a_test_suite("post-header-value-case", SignatureLocation::Headers); + } + + #[test] + fn test_post_sts_header_after() { + run_v4a_test_suite("post-sts-header-after", SignatureLocation::Headers); + } + + #[test] + fn test_post_sts_header_before() { + run_v4a_test_suite("post-sts-header-before", SignatureLocation::Headers); + } + + #[test] + fn test_post_vanilla() { + run_v4a_test_suite("post-vanilla", SignatureLocation::Headers); + } + + #[test] + fn test_post_vanilla_empty_query_value() { + run_v4a_test_suite( + "post-vanilla-empty-query-value", + SignatureLocation::QueryParams, + ); + } + + #[test] + fn test_post_vanilla_query() { + run_v4a_test_suite("post-vanilla-query", SignatureLocation::QueryParams); + } + + #[test] + fn test_post_x_www_form_urlencoded() { + run_v4a_test_suite("post-x-www-form-urlencoded", SignatureLocation::Headers); + } + + #[test] + fn test_post_x_www_form_urlencoded_parameters() { + run_v4a_test_suite( + "post-x-www-form-urlencoded-parameters", + SignatureLocation::QueryParams, + ); + } + } + #[test] fn test_sign_url_escape() { let test = "double-encode-path"; let settings = SigningSettings::default(); - let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); - let original = test_request(test); + let original = test::v4::test_request(test); let signable = SignableRequest::from(&original); let out = sign(signable, ¶ms).unwrap(); assert_eq!( - "6f871eb157f326fa5f7439eb88ca200048635950ce7d6037deda56f0c95d4364", + "57d157672191bac40bae387e48bbe14b15303c001fdbb01f4abf295dccb09705", out.signature ); - let mut signed = original; - out.output.apply_to_request(&mut signed); + let mut signed = original.as_http_request(); + out.output.apply_to_request_http0x(&mut signed); - let mut expected = test_signed_request(test); + let expected = test::v4::test_signed_request(test); assert_req_eq!(expected, signed); } @@ -407,60 +791,62 @@ mod tests { expires_in: Some(Duration::from_secs(35)), ..Default::default() }; - let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); - let original = test_request("get-vanilla-query-order-key-case"); + let original = test::v4::test_request("get-vanilla-query-order-key-case"); let signable = SignableRequest::from(&original); let out = sign(signable, ¶ms).unwrap(); assert_eq!( - "f25aea20f8c722ece3b363fc5d60cc91add973f9b64c42ba36fa28d57afe9019", + "ecce208e4b4f7d7e3a4cc22ced6acc2ad1d170ee8ba87d7165f6fa4b9aff09ab", out.signature ); - let mut signed = original; - out.output.apply_to_request(&mut signed); + let mut signed = original.as_http_request(); + out.output.apply_to_request_http0x(&mut signed); - let mut expected = test_signed_request_query_params("get-vanilla-query-order-key-case"); + let expected = + test::v4::test_signed_request_query_params("get-vanilla-query-order-key-case"); assert_req_eq!(expected, signed); } #[test] fn test_sign_headers_utf8() { let settings = SigningSettings::default(); - let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); let original = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header("some-header", HeaderValue::from_str("テスト").unwrap()) .body("") - .unwrap(); + .unwrap() + .into(); let signable = SignableRequest::from(&original); let out = sign(signable, ¶ms).unwrap(); assert_eq!( - "4596b207a7fc6bdf18725369bc0cd7022cf20efbd2c19730549f42d1a403648e", + "55e16b31f9bde5fd04f9d3b780dd2b5e5f11a5219001f91a8ca9ec83eaf1618f", out.signature ); - let mut signed = original; - out.output.apply_to_request(&mut signed); + let mut signed = original.as_http_request(); + out.output.apply_to_request_http0x(&mut signed); - let mut expected = http::Request::builder() + let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header("some-header", HeaderValue::from_str("テスト").unwrap()) .header( @@ -471,15 +857,15 @@ mod tests { "authorization", HeaderValue::from_str( "AWS4-HMAC-SHA256 \ - Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, \ + Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \ SignedHeaders=host;some-header;x-amz-date, \ - Signature=4596b207a7fc6bdf18725369bc0cd7022cf20efbd2c19730549f42d1a403648e", + Signature=55e16b31f9bde5fd04f9d3b780dd2b5e5f11a5219001f91a8ca9ec83eaf1618f", ) .unwrap(), ) .body("") .unwrap(); - assert_req_eq!(expected, signed); + assert_req_eq!(http: expected, signed); } #[test] @@ -488,27 +874,27 @@ mod tests { session_token_mode: SessionTokenMode::Exclude, ..Default::default() }; - let mut params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + let identity = &Credentials::for_tests_with_session_token().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); let original = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .body("") - .unwrap(); + .unwrap() + .into(); let out_without_session_token = sign(SignableRequest::from(&original), ¶ms).unwrap(); - params.security_token = Some("notarealsessiontoken"); let out_with_session_token_but_excluded = sign(SignableRequest::from(&original), ¶ms).unwrap(); assert_eq!( - "d2445d2d58e01146627c1e498dc0b4749d0cecd2cab05c5349ed132c083914e8", + "ab32de057edf094958d178b3c91f3c8d5c296d526b11da991cd5773d09cea560", out_with_session_token_but_excluded.signature ); assert_eq!( @@ -516,12 +902,12 @@ mod tests { out_without_session_token.signature ); - let mut signed = original; + let mut signed = original.as_http_request(); out_with_session_token_but_excluded .output - .apply_to_request(&mut signed); + .apply_to_request_http0x(&mut signed); - let mut expected = http::Request::builder() + let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header( "x-amz-date", @@ -531,9 +917,9 @@ mod tests { "authorization", HeaderValue::from_str( "AWS4-HMAC-SHA256 \ - Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, \ + Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \ SignedHeaders=host;x-amz-date, \ - Signature=d2445d2d58e01146627c1e498dc0b4749d0cecd2cab05c5349ed132c083914e8", + Signature=ab32de057edf094958d178b3c91f3c8d5c296d526b11da991cd5773d09cea560", ) .unwrap(), ) @@ -541,23 +927,23 @@ mod tests { "x-amz-security-token", HeaderValue::from_str("notarealsessiontoken").unwrap(), ) - .body("") + .body(b"") .unwrap(); - assert_req_eq!(expected, signed); + assert_req_eq!(http: expected, signed); } #[test] fn test_sign_headers_space_trimming() { let settings = SigningSettings::default(); - let params = SigningParams { - access_key: "AKIDEXAMPLE", - secret_key: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", - security_token: None, + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", - service_name: "service", + name: "service", time: parse_date_time("20150830T123600Z").unwrap(), settings, - }; + } + .into(); let original = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") @@ -566,18 +952,19 @@ mod tests { HeaderValue::from_str("  test test ").unwrap(), ) .body("") - .unwrap(); + .unwrap() + .into(); let signable = SignableRequest::from(&original); let out = sign(signable, ¶ms).unwrap(); assert_eq!( - "0bd74dbf6f21161f61a1a3a1c313b6a4bc67ec57bf5ea9ae956a63753ca1d7f7", + "244f2a0db34c97a528f22715fe01b2417b7750c8a95c7fc104a3c48d81d84c08", out.signature ); - let mut signed = original; - out.output.apply_to_request(&mut signed); + let mut signed = original.as_http_request(); + out.output.apply_to_request_http0x(&mut signed); - let mut expected = http::Request::builder() + let expected = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .header( "some-header", @@ -591,38 +978,15 @@ mod tests { "authorization", HeaderValue::from_str( "AWS4-HMAC-SHA256 \ - Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, \ + Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \ SignedHeaders=host;some-header;x-amz-date, \ - Signature=0bd74dbf6f21161f61a1a3a1c313b6a4bc67ec57bf5ea9ae956a63753ca1d7f7", + Signature=244f2a0db34c97a528f22715fe01b2417b7750c8a95c7fc104a3c48d81d84c08", ) .unwrap(), ) .body("") .unwrap(); - assert_req_eq!(expected, signed); - } - - #[test] - fn test_sign_headers_returning_expected_error_on_invalid_utf8() { - let settings = SigningSettings::default(); - let params = SigningParams { - access_key: "123", - secret_key: "asdf", - security_token: None, - region: "us-east-1", - service_name: "foo", - time: std::time::SystemTime::now(), - settings, - }; - - let req = http::Request::builder() - .uri("https://foo.com/") - .header("x-sign-me", HeaderValue::from_bytes(&[0xC0, 0xC1]).unwrap()) - .body(&[]) - .unwrap(); - - let creq = crate::http_request::sign(SignableRequest::from(&req), ¶ms); - assert!(creq.is_err()); + assert_req_eq!(http: expected, signed); } proptest! { @@ -630,47 +994,45 @@ mod tests { // Only byte values between 32 and 255 (inclusive) are permitted, excluding byte 127, for // [HeaderValue](https://docs.rs/http/latest/http/header/struct.HeaderValue.html#method.from_bytes). fn test_sign_headers_no_panic( - left in proptest::collection::vec(32_u8..=126, 0..100), - right in proptest::collection::vec(128_u8..=255, 0..100), + header in ".*" ) { let settings = SigningSettings::default(); - let params = SigningParams { - access_key: "123", - secret_key: "asdf", - security_token: None, + let identity = &Credentials::for_tests().into(); + let params = v4::SigningParams { + identity, region: "us-east-1", - service_name: "foo", - time: std::time::SystemTime::now(), + name: "foo", + time: std::time::SystemTime::UNIX_EPOCH, settings, - }; - - let bytes = left.iter().chain(right.iter()).cloned().collect::>(); - let req = http::Request::builder() - .uri("https://foo.com/") - .header("x-sign-me", HeaderValue::from_bytes(&bytes).unwrap()) - .body(&[]) - .unwrap(); - - // The test considered a pass if the creation of `creq` does not panic. - let _creq = crate::http_request::sign( - SignableRequest::from(&req), - ¶ms); + }.into(); + + let req = SignableRequest::new( + "GET", + "https://foo.com", + iter::once(("x-sign-me", header.as_str())), + SignableBody::Bytes(&[]) + ); + + if let Ok(req) = req { + // The test considered a pass if the creation of `creq` does not panic. + let _creq = crate::http_request::sign(req, ¶ms); + } } } #[test] fn apply_signing_instructions_headers() { - let mut headers = HeaderMap::new(); - headers.insert("some-header", HeaderValue::from_static("foo")); - headers.insert("some-other-header", HeaderValue::from_static("bar")); - let instructions = SigningInstructions::new(Some(headers), None); + let mut headers = vec![]; + add_header(&mut headers, "some-header", "foo", false); + add_header(&mut headers, "some-other-header", "bar", false); + let instructions = SigningInstructions::new(headers, vec![]); let mut request = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com") .body("") .unwrap(); - instructions.apply_to_request(&mut request); + instructions.apply_to_request_http0x(&mut request); let get_header = |n: &str| request.headers().get(n).unwrap().to_str().unwrap(); assert_eq!("foo", get_header("some-header")); @@ -683,14 +1045,14 @@ mod tests { ("some-param", Cow::Borrowed("f&o?o")), ("some-other-param?", Cow::Borrowed("bar")), ]; - let instructions = SigningInstructions::new(None, Some(params)); + let instructions = SigningInstructions::new(vec![], params); let mut request = http::Request::builder() .uri("https://some-endpoint.some-region.amazonaws.com/some/path") .body("") .unwrap(); - instructions.apply_to_request(&mut request); + instructions.apply_to_request_http0x(&mut request); assert_eq!( "/some/path?some-param=f%26o%3Fo&some-other-param%3F=bar", diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/test.rs b/aws/rust-runtime/aws-sigv4/src/http_request/test.rs index 93bef370f4f..9d5bec6d5d0 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/test.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/test.rs @@ -5,64 +5,313 @@ //! Functions shared between the tests of several modules. -use bytes::Bytes; -use http::{Method, Request, Uri, Version}; +use crate::http_request::{SignableBody, SignableRequest}; +use http::{Method, Uri}; use std::error::Error as StdError; -fn path(name: &str, ext: &str) -> String { - format!("aws-sig-v4-test-suite/{}/{}.{}", name, name, ext) +pub(crate) mod v4 { + use super::*; + + fn path(name: &str, ext: &str) -> String { + format!("aws-sig-v4-test-suite/{}/{}.{}", name, name, ext) + } + + pub(crate) fn test_canonical_request(name: &str) -> String { + // Tests fail if there's a trailing newline in the file, and pre-commit requires trailing newlines + read(&path(name, "creq")).trim().to_string() + } + + pub(crate) fn test_sts(name: &str) -> String { + read(&path(name, "sts")) + } + + pub(crate) fn test_request(name: &str) -> TestRequest { + test_parsed_request(name, "req") + } + + pub(crate) fn test_signed_request(name: &str) -> TestRequest { + test_parsed_request(name, "sreq") + } + + pub(crate) fn test_signed_request_query_params(name: &str) -> TestRequest { + test_parsed_request(name, "qpsreq") + } + + fn test_parsed_request(name: &str, ext: &str) -> TestRequest { + let path = path(name, ext); + match parse_request(read(&path).as_bytes()) { + Ok(parsed) => parsed, + Err(err) => panic!("Failed to parse {}: {}", path, err), + } + } + + #[test] + fn test_parse() { + test_request("post-header-key-case"); + } + + #[test] + fn test_read_query_params() { + test_request("get-vanilla-query-order-key-case"); + } } -fn read(path: &str) -> String { - println!("Loading `{}` for test case...", path); - match std::fs::read_to_string(path) { - // This replacement is necessary for tests to pass on Windows, as reading the - // sigv4 snapshots from the file system results in CRLF line endings being inserted. - Ok(value) => value.replace("\r\n", "\n"), - Err(err) => { - panic!("failed to load test case `{}`: {}", path, err); +#[cfg(feature = "sigv4a")] +pub(crate) mod v4a { + use super::*; + use crate::http_request::{ + PayloadChecksumKind, SessionTokenMode, SignatureLocation, SigningSettings, + }; + use aws_credential_types::Credentials; + use aws_smithy_runtime_api::client::identity::Identity; + use serde_derive::Deserialize; + use std::time::{Duration, SystemTime}; + use time::format_description::well_known::Rfc3339; + use time::OffsetDateTime; + + fn path(test_name: &str, definition_name: &str) -> String { + format!("aws-sig-v4a-test-suite/{test_name}/{definition_name}.txt") + } + + pub(crate) fn test_request(name: &str) -> TestRequest { + test_parsed_request(&path(name, "request")) + } + + pub(crate) fn test_canonical_request( + name: &str, + signature_location: SignatureLocation, + ) -> String { + match signature_location { + SignatureLocation::QueryParams => read(&path(name, "query-canonical-request")), + SignatureLocation::Headers => read(&path(name, "header-canonical-request")), + } + } + + pub(crate) fn test_string_to_sign(name: &str, signature_location: SignatureLocation) -> String { + match signature_location { + SignatureLocation::QueryParams => read(&path(name, "query-string-to-sign")), + SignatureLocation::Headers => read(&path(name, "header-string-to-sign")), + } + } + + fn test_parsed_request(path: &str) -> TestRequest { + match parse_request(read(path).as_bytes()) { + Ok(parsed) => parsed, + Err(err) => panic!("Failed to parse {}: {}", path, err), + } + } + + pub(crate) fn test_context(test_name: &str) -> TestContext { + let path = format!("aws-sig-v4a-test-suite/{test_name}/context.json"); + let context = read(&path); + let tc_builder: TestContextBuilder = serde_json::from_str(&context).unwrap(); + tc_builder.build() + } + + pub(crate) struct TestContext { + pub(crate) identity: Identity, + pub(crate) expiration_in_seconds: u64, + pub(crate) normalize: bool, + pub(crate) region: String, + pub(crate) service: String, + pub(crate) timestamp: String, + pub(crate) omit_session_token: bool, + pub(crate) sign_body: bool, + } + + impl<'a> From<&'a TestContext> for crate::sign::v4a::SigningParams<'a, SigningSettings> { + fn from(tc: &'a TestContext) -> Self { + crate::sign::v4a::SigningParams { + identity: &tc.identity, + region_set: &tc.region, + name: &tc.service, + time: OffsetDateTime::parse(&tc.timestamp, &Rfc3339) + .unwrap() + .into(), + settings: SigningSettings { + // payload_checksum_kind: PayloadChecksumKind::XAmzSha256, + expires_in: Some(Duration::from_secs(tc.expiration_in_seconds)), + uri_path_normalization_mode: tc.normalize.into(), + session_token_mode: if tc.omit_session_token { + SessionTokenMode::Exclude + } else { + SessionTokenMode::Include + }, + payload_checksum_kind: if tc.sign_body { + PayloadChecksumKind::XAmzSha256 + } else { + PayloadChecksumKind::NoHeader + }, + ..Default::default() + }, + } + } + } + + // Serde has limitations requiring this odd workaround. + // See https://github.com/serde-rs/serde/issues/368 for more info. + fn return_true() -> bool { + true + } + + #[derive(Deserialize)] + pub(crate) struct TestContextBuilder { + credentials: TestContextCreds, + expiration_in_seconds: u64, + normalize: bool, + region: String, + service: String, + timestamp: String, + #[serde(default)] + omit_session_token: bool, + #[serde(default = "return_true")] + sign_body: bool, + } + + impl TestContextBuilder { + pub(crate) fn build(self) -> TestContext { + let identity = Identity::new( + Credentials::from_keys( + &self.credentials.access_key_id, + &self.credentials.secret_access_key, + self.credentials.token.clone(), + ), + Some(SystemTime::UNIX_EPOCH + Duration::from_secs(self.expiration_in_seconds)), + ); + + TestContext { + identity, + expiration_in_seconds: self.expiration_in_seconds, + normalize: self.normalize, + region: self.region, + service: self.service, + timestamp: self.timestamp, + omit_session_token: self.omit_session_token, + sign_body: self.sign_body, + } } } + + #[derive(Deserialize)] + pub(crate) struct TestContextCreds { + access_key_id: String, + secret_access_key: String, + token: Option, + } + + #[test] + fn test_parse() { + let req = test_request("post-header-key-case"); + assert_eq!(req.method, "POST"); + assert_eq!(req.uri, "https://example.amazonaws.com/"); + assert!(req.headers.is_empty()); + } + + #[test] + fn test_read_query_params() { + let req = test_request("get-header-value-trim"); + assert_eq!(req.method, "GET"); + assert_eq!(req.uri, "https://example.amazonaws.com/"); + assert!(!req.headers.is_empty()); + } } -pub(crate) fn test_canonical_request(name: &str) -> String { - // Tests fail if there's a trailing newline in the file, and pre-commit requires trailing newlines - read(&path(name, "creq")).trim().to_string() +fn read(path: &str) -> String { + println!("Loading `{}` for test case...", path); + let v = { + match std::fs::read_to_string(path) { + // This replacement is necessary for tests to pass on Windows, as reading the + // test snapshots from the file system results in CRLF line endings being inserted. + Ok(value) => value.replace("\r\n", "\n"), + Err(err) => { + panic!("failed to load test case `{}`: {}", path, err); + } + } + }; + + v.trim().to_string() } -pub(crate) fn test_sts(name: &str) -> String { - read(&path(name, "sts")) +pub(crate) struct TestRequest { + pub(crate) uri: String, + pub(crate) method: String, + pub(crate) headers: Vec<(String, String)>, + pub(crate) body: TestSignedBody, } -pub(crate) fn test_request(name: &str) -> Request { - test_parsed_request(name, "req") +pub(crate) enum TestSignedBody { + Signable(SignableBody<'static>), + Bytes(Vec), } -pub(crate) fn test_signed_request(name: &str) -> Request { - test_parsed_request(name, "sreq") +impl TestSignedBody { + fn as_signable_body(&self) -> SignableBody<'_> { + match self { + TestSignedBody::Signable(data) => data.clone(), + TestSignedBody::Bytes(data) => SignableBody::Bytes(data.as_slice()), + } + } } -pub(crate) fn test_signed_request_query_params(name: &str) -> Request { - test_parsed_request(name, "qpsreq") +impl TestRequest { + pub(crate) fn set_body(&mut self, body: SignableBody<'static>) { + self.body = TestSignedBody::Signable(body); + } + + pub(crate) fn as_http_request(&self) -> http::Request<&'static str> { + let mut builder = http::Request::builder() + .uri(&self.uri) + .method(Method::from_bytes(self.method.as_bytes()).unwrap()); + for (k, v) in &self.headers { + builder = builder.header(k, v); + } + builder.body("body").unwrap() + } } -fn test_parsed_request(name: &str, ext: &str) -> Request { - let path = path(name, ext); - match parse_request(read(&path).as_bytes()) { - Ok(parsed) => parsed, - Err(err) => panic!("Failed to parse {}: {}", path, err), +impl> From> for TestRequest { + fn from(value: http::Request) -> Self { + let invalid = value + .headers() + .values() + .find(|h| std::str::from_utf8(h.as_bytes()).is_err()); + if let Some(invalid) = invalid { + panic!("invalid header: {:?}", invalid); + } + Self { + uri: value.uri().to_string(), + method: value.method().to_string(), + headers: value + .headers() + .iter() + .map(|(k, v)| { + ( + k.to_string(), + String::from_utf8(v.as_bytes().to_vec()).unwrap(), + ) + }) + .collect::>(), + body: TestSignedBody::Bytes(value.body().as_ref().to_vec()), + } } } -pub(crate) fn make_headers_comparable(request: &mut Request) { - for (_name, value) in request.headers_mut() { - value.set_sensitive(false); +impl<'a> From<&'a TestRequest> for SignableRequest<'a> { + fn from(request: &'a TestRequest) -> SignableRequest<'a> { + SignableRequest::new( + &request.method, + &request.uri, + request + .headers + .iter() + .map(|(k, v)| (k.as_str(), v.as_str())), + request.body.as_signable_body(), + ) + .expect("URI MUST be valid") } } -fn parse_request( - s: &[u8], -) -> Result, Box> { +fn parse_request(s: &[u8]) -> Result> { let mut headers = [httparse::EMPTY_HEADER; 64]; // httparse 1.5 requires two trailing newlines to head the header section. let mut with_newline = Vec::from(s); @@ -70,37 +319,30 @@ fn parse_request( let mut req = httparse::Request::new(&mut headers); let _ = req.parse(&with_newline).unwrap(); - let version = match req.version.unwrap() { - 1 => Version::HTTP_11, - _ => unimplemented!(), - }; - - let method = match req.method.unwrap() { - "GET" => Method::GET, - "POST" => Method::POST, - _ => unimplemented!(), - }; - - let mut builder = Request::builder(); - builder = builder.version(version); - builder = builder.method(method); - let mut uri_builder = Uri::builder().scheme("https"); if let Some(path) = req.path { uri_builder = uri_builder.path_and_query(path); } + + let mut headers = vec![]; for header in req.headers { let name = header.name.to_lowercase(); if name == "host" { uri_builder = uri_builder.authority(header.value); } else if !name.is_empty() { - builder = builder.header(&name, header.value); + headers.push(( + header.name.to_string(), + std::str::from_utf8(header.value)?.to_string(), + )); } } - builder = builder.uri(uri_builder.build()?); - let req = builder.body(bytes::Bytes::new())?; - Ok(req) + Ok(TestRequest { + uri: uri_builder.build()?.to_string(), + method: req.method.unwrap().to_string(), + headers, + body: TestSignedBody::Bytes(vec![]), + }) } #[test] @@ -124,13 +366,3 @@ fn test_parse_headers() { ))) ); } - -#[test] -fn test_parse() { - test_request("post-header-key-case"); -} - -#[test] -fn test_read_query_params() { - test_request("get-vanilla-query-order-key-case"); -} diff --git a/aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs b/aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs index 7ea834a2523..a38fc276221 100644 --- a/aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs +++ b/aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs @@ -20,7 +20,7 @@ pub(super) fn normalize_uri_path(uri_path: &str) -> Cow<'_, str> { Cow::Owned(format!("/{uri_path}")) }; - if !result.contains('.') { + if !(result.contains('.') || result.contains("//")) { return result; } @@ -37,7 +37,8 @@ fn normalize_path_segment(uri_path: &str) -> String { for segment in uri_path.split('/') { match segment { - "." => {} + // Segments that are empty or contain only a single period should not be preserved + "" | "." => {} ".." => { normalized.pop(); } @@ -232,6 +233,15 @@ mod tests { ); } + // The CRT does this so I figured we should too. - Zelda + #[test] + fn normalize_uri_path_should_merge_multiple_subsequent_slashes_into_one() { + assert_eq!( + normalize_uri_path("//foo//"), + Cow::<'_, str>::Owned("/foo/".to_owned()) + ); + } + #[test] fn normalize_uri_path_should_not_remove_dot_when_surrounded_by_percent_encoded_forward_slashes() { diff --git a/aws/rust-runtime/aws-sigv4/src/lib.rs b/aws/rust-runtime/aws-sigv4/src/lib.rs index d20df239947..5fe83a0bf51 100644 --- a/aws/rust-runtime/aws-sigv4/src/lib.rs +++ b/aws/rust-runtime/aws-sigv4/src/lib.rs @@ -16,7 +16,6 @@ )] use std::fmt; -use std::time::SystemTime; pub mod sign; @@ -28,193 +27,21 @@ pub mod event_stream; #[cfg(feature = "sign-http")] pub mod http_request; -/// Parameters to use when signing. +/// The version of the signing algorithm to use +#[derive(Debug, Eq, PartialEq, Copy, Clone)] #[non_exhaustive] -pub struct SigningParams<'a, S> { - /// Access Key ID to use. - pub(crate) access_key: &'a str, - /// Secret access key to use. - pub(crate) secret_key: &'a str, - /// (Optional) Security token to use. - pub(crate) security_token: Option<&'a str>, - - /// Region to sign for. - pub(crate) region: &'a str, - /// AWS Service Name to sign for. - pub(crate) service_name: &'a str, - /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing). - pub(crate) time: SystemTime, - - /// Additional signing settings. These differ between HTTP and Event Stream. - pub(crate) settings: S, -} - -impl<'a, S> SigningParams<'a, S> { - /// Returns the region that will be used to sign - pub fn region(&self) -> &str { - self.region - } - - /// Returns the service name that will be used to sign - pub fn service_name(&self) -> &str { - self.service_name - } +pub enum SignatureVersion { + /// The SigV4 signing algorithm. + V4, + /// The SigV4a signing algorithm. + V4a, } -impl<'a, S: fmt::Debug> fmt::Debug for SigningParams<'a, S> { +impl fmt::Display for SignatureVersion { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("SigningParams") - .field("access_key", &"** redacted **") - .field("secret_key", &"** redacted **") - .field("security_token", &"** redacted **") - .field("region", &self.region) - .field("service_name", &self.service_name) - .field("time", &self.time) - .field("settings", &self.settings) - .finish() - } -} - -impl<'a, S: Default> SigningParams<'a, S> { - /// Returns a builder that can create new `SigningParams`. - pub fn builder() -> signing_params::Builder<'a, S> { - Default::default() - } -} - -/// Builder and error for creating [`SigningParams`] -pub mod signing_params { - use super::SigningParams; - use std::error::Error; - use std::fmt; - use std::time::SystemTime; - - /// [`SigningParams`] builder error - #[derive(Debug)] - pub struct BuildError { - reason: &'static str, - } - impl BuildError { - fn new(reason: &'static str) -> Self { - Self { reason } - } - } - - impl fmt::Display for BuildError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.reason) - } - } - - impl Error for BuildError {} - - /// Builder that can create new [`SigningParams`] - #[derive(Debug, Default)] - pub struct Builder<'a, S> { - access_key: Option<&'a str>, - secret_key: Option<&'a str>, - security_token: Option<&'a str>, - region: Option<&'a str>, - service_name: Option<&'a str>, - time: Option, - settings: Option, - } - - impl<'a, S> Builder<'a, S> { - /// Sets the access key (required). - pub fn access_key(mut self, access_key: &'a str) -> Self { - self.access_key = Some(access_key); - self - } - /// Sets the access key (required) - pub fn set_access_key(&mut self, access_key: Option<&'a str>) { - self.access_key = access_key; - } - - /// Sets the secret key (required) - pub fn secret_key(mut self, secret_key: &'a str) -> Self { - self.secret_key = Some(secret_key); - self - } - /// Sets the secret key (required) - pub fn set_secret_key(&mut self, secret_key: Option<&'a str>) { - self.secret_key = secret_key; - } - - /// Sets the security token (optional) - pub fn security_token(mut self, security_token: &'a str) -> Self { - self.security_token = Some(security_token); - self - } - /// Sets the security token (optional) - pub fn set_security_token(&mut self, security_token: Option<&'a str>) { - self.security_token = security_token; - } - - /// Sets the region (required) - pub fn region(mut self, region: &'a str) -> Self { - self.region = Some(region); - self - } - /// Sets the region (required) - pub fn set_region(&mut self, region: Option<&'a str>) { - self.region = region; - } - - /// Sets the service name (required) - pub fn service_name(mut self, service_name: &'a str) -> Self { - self.service_name = Some(service_name); - self - } - /// Sets the service name (required) - pub fn set_service_name(&mut self, service_name: Option<&'a str>) { - self.service_name = service_name; - } - - /// Sets the time to be used in the signature (required) - pub fn time(mut self, time: SystemTime) -> Self { - self.time = Some(time); - self - } - /// Sets the time to be used in the signature (required) - pub fn set_time(&mut self, time: Option) { - self.time = time; - } - - /// Sets additional signing settings (required) - pub fn settings(mut self, settings: S) -> Self { - self.settings = Some(settings); - self - } - /// Sets additional signing settings (required) - pub fn set_settings(&mut self, settings: Option) { - self.settings = settings; - } - - /// Builds an instance of [`SigningParams`]. Will yield a [`BuildError`] if - /// a required argument was not given. - pub fn build(self) -> Result, BuildError> { - Ok(SigningParams { - access_key: self - .access_key - .ok_or_else(|| BuildError::new("access key is required"))?, - secret_key: self - .secret_key - .ok_or_else(|| BuildError::new("secret key is required"))?, - security_token: self.security_token, - region: self - .region - .ok_or_else(|| BuildError::new("region is required"))?, - service_name: self - .service_name - .ok_or_else(|| BuildError::new("service name is required"))?, - time: self - .time - .ok_or_else(|| BuildError::new("time is required"))?, - settings: self - .settings - .ok_or_else(|| BuildError::new("settings are required"))?, - }) + match self { + SignatureVersion::V4 => write!(f, "SigV4"), + SignatureVersion::V4a => write!(f, "SigV4a"), } } } diff --git a/aws/rust-runtime/aws-sigv4/src/sign.rs b/aws/rust-runtime/aws-sigv4/src/sign.rs index 43e9da1ac10..fa220a7f496 100644 --- a/aws/rust-runtime/aws-sigv4/src/sign.rs +++ b/aws/rust-runtime/aws-sigv4/src/sign.rs @@ -5,86 +5,30 @@ //! Functions to create signing keys and calculate signatures. -use crate::date_time::format_date; -use hmac::{digest::FixedOutput, Hmac, Mac}; -use sha2::{Digest, Sha256}; -use std::time::SystemTime; - -/// HashedPayload = Lowercase(HexEncode(Hash(requestPayload))) -#[allow(dead_code)] // Unused when compiling without certain features -pub(crate) fn sha256_hex_string(bytes: impl AsRef<[u8]>) -> String { - let mut hasher = Sha256::new(); - hasher.update(bytes); - hex::encode(hasher.finalize_fixed()) -} - -/// Calculates a Sigv4 signature -pub fn calculate_signature(signing_key: impl AsRef<[u8]>, string_to_sign: &[u8]) -> String { - let mut mac = Hmac::::new_from_slice(signing_key.as_ref()) - .expect("HMAC can take key of any size"); - mac.update(string_to_sign); - hex::encode(mac.finalize_fixed()) +// macro lifted from aws-smithy-runtime-api—eventually just inline these and delete macro. +macro_rules! builder_methods { + ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal, $($tail:tt)+) => { + builder_methods!($fn_name, $arg_name, $ty, $doc); + builder_methods!($($tail)+); + }; + ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal) => { + #[doc = $doc] + pub fn $fn_name(&mut self, $arg_name: Option<$ty>) -> &mut Self { + self.$arg_name = $arg_name; + self + } + + #[doc = $doc] + pub fn $arg_name(mut self, $arg_name: $ty) -> Self { + self.$arg_name = Some($arg_name); + self + } + }; } -/// Generates a signing key for Sigv4 -pub fn generate_signing_key( - secret: &str, - time: SystemTime, - region: &str, - service: &str, -) -> impl AsRef<[u8]> { - // kSecret = your secret access key - // kDate = HMAC("AWS4" + kSecret, Date) - // kRegion = HMAC(kDate, Region) - // kService = HMAC(kRegion, Service) - // kSigning = HMAC(kService, "aws4_request") - - let secret = format!("AWS4{}", secret); - let mut mac = - Hmac::::new_from_slice(secret.as_ref()).expect("HMAC can take key of any size"); - mac.update(format_date(time).as_bytes()); - let tag = mac.finalize_fixed(); +/// Support for Sigv4 signing +pub mod v4; - // sign region - let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); - mac.update(region.as_bytes()); - let tag = mac.finalize_fixed(); - - // sign service - let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); - mac.update(service.as_bytes()); - let tag = mac.finalize_fixed(); - - // sign request - let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); - mac.update("aws4_request".as_bytes()); - mac.finalize_fixed() -} - -#[cfg(test)] -mod tests { - use super::{calculate_signature, generate_signing_key}; - use crate::date_time::test_parsers::parse_date_time; - use crate::http_request::test::test_canonical_request; - use crate::sign::sha256_hex_string; - - #[test] - fn test_signature_calculation() { - let secret = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"; - let creq = test_canonical_request("iam"); - let time = parse_date_time("20150830T123600Z").unwrap(); - - let derived_key = generate_signing_key(secret, time, "us-east-1", "iam"); - let signature = calculate_signature(derived_key, creq.as_bytes()); - - let expected = "5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7"; - assert_eq!(expected, &signature); - } - - #[test] - fn sign_payload_empty_string() { - let expected = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - let actual = sha256_hex_string([]); - assert_eq!(expected, actual); - } -} +/// Support for Sigv4a signing +#[cfg(feature = "sigv4a")] +pub mod v4a; diff --git a/aws/rust-runtime/aws-sigv4/src/sign/v4.rs b/aws/rust-runtime/aws-sigv4/src/sign/v4.rs new file mode 100644 index 00000000000..2a1159fe185 --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/src/sign/v4.rs @@ -0,0 +1,219 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::date_time::format_date; +use aws_smithy_runtime_api::client::identity::Identity; +use hmac::{digest::FixedOutput, Hmac, Mac}; +use sha2::{Digest, Sha256}; +use std::time::SystemTime; + +/// HashedPayload = Lowercase(HexEncode(Hash(requestPayload))) +#[allow(dead_code)] // Unused when compiling without certain features +pub(crate) fn sha256_hex_string(bytes: impl AsRef<[u8]>) -> String { + let mut hasher = Sha256::new(); + hasher.update(bytes); + hex::encode(hasher.finalize_fixed()) +} + +/// Calculates a Sigv4 signature +pub fn calculate_signature(signing_key: impl AsRef<[u8]>, string_to_sign: &[u8]) -> String { + let mut mac = Hmac::::new_from_slice(signing_key.as_ref()) + .expect("HMAC can take key of any size"); + mac.update(string_to_sign); + hex::encode(mac.finalize_fixed()) +} + +/// Generates a signing key for Sigv4 +pub fn generate_signing_key( + secret: &str, + time: SystemTime, + region: &str, + service: &str, +) -> impl AsRef<[u8]> { + // kSecret = your secret access key + // kDate = HMAC("AWS4" + kSecret, Date) + // kRegion = HMAC(kDate, Region) + // kService = HMAC(kRegion, Service) + // kSigning = HMAC(kService, "aws4_request") + + let secret = format!("AWS4{}", secret); + let mut mac = + Hmac::::new_from_slice(secret.as_ref()).expect("HMAC can take key of any size"); + mac.update(format_date(time).as_bytes()); + let tag = mac.finalize_fixed(); + + // sign region + let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); + mac.update(region.as_bytes()); + let tag = mac.finalize_fixed(); + + // sign service + let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); + mac.update(service.as_bytes()); + let tag = mac.finalize_fixed(); + + // sign request + let mut mac = Hmac::::new_from_slice(&tag).expect("HMAC can take key of any size"); + mac.update("aws4_request".as_bytes()); + mac.finalize_fixed() +} + +/// Parameters to use when signing. +#[derive(Debug)] +#[non_exhaustive] +pub struct SigningParams<'a, S> { + /// The identity to use when signing a request + pub(crate) identity: &'a Identity, + + /// Region to sign for. + pub(crate) region: &'a str, + /// Service Name to sign for. + /// + /// NOTE: Endpoint resolution rules may specify a name that differs from the typical service name. + pub(crate) name: &'a str, + /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing). + pub(crate) time: SystemTime, + + /// Additional signing settings. These differ between HTTP and Event Stream. + pub(crate) settings: S, +} + +const HMAC_256: &str = "AWS4-HMAC-SHA256"; + +impl<'a, S> SigningParams<'a, S> { + /// Returns the region that will be used to sign SigV4 requests + pub fn region(&self) -> &str { + self.region + } + + /// Returns the signing name that will be used to sign requests + pub fn name(&self) -> &str { + self.name + } + + /// Return the name of the algorithm used to sign requests + pub fn algorithm(&self) -> &'static str { + HMAC_256 + } +} + +impl<'a, S: Default> SigningParams<'a, S> { + /// Returns a builder that can create new `SigningParams`. + pub fn builder() -> signing_params::Builder<'a, S> { + Default::default() + } +} + +/// Builder and error for creating [`SigningParams`] +pub mod signing_params { + use super::SigningParams; + use aws_smithy_runtime_api::client::identity::Identity; + use std::error::Error; + use std::fmt; + use std::time::SystemTime; + + /// [`SigningParams`] builder error + #[derive(Debug)] + pub struct BuildError { + reason: &'static str, + } + impl BuildError { + fn new(reason: &'static str) -> Self { + Self { reason } + } + } + + impl fmt::Display for BuildError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.reason) + } + } + + impl Error for BuildError {} + + /// Builder that can create new [`SigningParams`] + #[derive(Debug, Default)] + pub struct Builder<'a, S> { + identity: Option<&'a Identity>, + region: Option<&'a str>, + name: Option<&'a str>, + time: Option, + settings: Option, + } + + impl<'a, S> Builder<'a, S> { + builder_methods!( + set_identity, + identity, + &'a Identity, + "Sets the identity (required)", + set_region, + region, + &'a str, + "Sets the region (required)", + set_name, + name, + &'a str, + "Sets the name (required)", + set_time, + time, + SystemTime, + "Sets the time to be used in the signature (required)", + set_settings, + settings, + S, + "Sets additional signing settings (required)" + ); + + /// Builds an instance of [`SigningParams`]. Will yield a [`BuildError`] if + /// a required argument was not given. + pub fn build(self) -> Result, BuildError> { + Ok(SigningParams { + identity: self + .identity + .ok_or_else(|| BuildError::new("identity is required"))?, + region: self + .region + .ok_or_else(|| BuildError::new("region is required"))?, + name: self + .name + .ok_or_else(|| BuildError::new("name is required"))?, + time: self + .time + .ok_or_else(|| BuildError::new("time is required"))?, + settings: self + .settings + .ok_or_else(|| BuildError::new("settings are required"))?, + }) + } + } +} + +#[cfg(test)] +mod tests { + use super::{calculate_signature, generate_signing_key, sha256_hex_string}; + use crate::date_time::test_parsers::parse_date_time; + use crate::http_request::test; + + #[test] + fn test_signature_calculation() { + let secret = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"; + let creq = test::v4::test_canonical_request("iam"); + let time = parse_date_time("20150830T123600Z").unwrap(); + + let derived_key = generate_signing_key(secret, time, "us-east-1", "iam"); + let signature = calculate_signature(derived_key, creq.as_bytes()); + + let expected = "5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7"; + assert_eq!(expected, &signature); + } + + #[test] + fn sign_payload_empty_string() { + let expected = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + let actual = sha256_hex_string([]); + assert_eq!(expected, actual); + } +} diff --git a/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs b/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs new file mode 100644 index 00000000000..502190ffa1a --- /dev/null +++ b/aws/rust-runtime/aws-sigv4/src/sign/v4a.rs @@ -0,0 +1,213 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_runtime_api::client::identity::Identity; +use bytes::{BufMut, BytesMut}; +use crypto_bigint::{CheckedAdd, CheckedSub, Encoding, U256}; +use once_cell::sync::Lazy; +use p256::ecdsa::signature::Signer; +use p256::ecdsa::{Signature, SigningKey}; +use std::io::Write; +use std::time::SystemTime; +use zeroize::Zeroizing; + +const ALGORITHM: &[u8] = b"AWS4-ECDSA-P256-SHA256"; +static BIG_N_MINUS_2: Lazy = Lazy::new(|| { + // The N value from section 3.2.1.3 of https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-186.pdf + // Used as the N value for the algorithm described in section A.2.2 of https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf + // *(Basically a prime number blessed by the NSA for use in p256)* + const ORDER: U256 = + U256::from_be_hex("ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551"); + ORDER.checked_sub(&U256::from(2u32)).unwrap() +}); + +/// Calculates a Sigv4a signature +pub fn calculate_signature(signing_key: impl AsRef<[u8]>, string_to_sign: &[u8]) -> String { + let signing_key = SigningKey::from_bytes(signing_key.as_ref()).unwrap(); + let signature: Signature = signing_key.sign(string_to_sign); + // This conversion sucks but we have to do it afaict. Because we also use + // the HMAC crate, we have to use a compatible (and therefore older) version + // of the p256 crate. That older version requires us to convert between + // signature types instead of using DER-encoded signatures directly. + let signature = signature.to_der(); + hex::encode(signature.as_ref()) +} + +/// Generates a signing key for Sigv4a signing. +pub fn generate_signing_key(access_key: &str, secret_access_key: &str) -> impl AsRef<[u8]> { + // Capacity is the secret access key length plus the length of "AWS4A" + let mut input_key = Zeroizing::new(Vec::with_capacity(secret_access_key.len() + 5)); + write!(input_key, "AWS4A{secret_access_key}").unwrap(); + + // Capacity is the access key length plus the counter byte + let mut kdf_context = Zeroizing::new(Vec::with_capacity(access_key.len() + 1)); + let mut counter = Zeroizing::new(1u8); + let key = loop { + write!(kdf_context, "{access_key}").unwrap(); + kdf_context.push(*counter); + + let mut fis = ALGORITHM.to_vec(); + fis.push(0); + fis.append(&mut kdf_context); + fis.put_i32(256); + + let key = ring::hmac::Key::new(ring::hmac::HMAC_SHA256, &input_key); + + let mut buf = BytesMut::new(); + buf.put_i32(1); + buf.put_slice(&fis); + let tag = ring::hmac::sign(&key, &buf); + let tag = &tag.as_ref()[0..32]; + + let k0 = U256::from_be_bytes(tag.try_into().expect("convert to [u8; 32]")); + + // It would be more secure for this to be a constant time comparison, but because this + // is for client usage, that's not as big a deal. + if k0 <= *BIG_N_MINUS_2 { + let pk = k0 + .checked_add(&U256::ONE) + .expect("k0 is always less than U256::MAX"); + let d = Zeroizing::new(pk.to_be_bytes()); + break SigningKey::from_bytes(d.as_ref()).unwrap(); + } + + *counter = counter + .checked_add(1) + .expect("counter will never get to 255"); + }; + + key.to_bytes() +} + +/// Parameters to use when signing. +#[derive(Debug)] +#[non_exhaustive] +pub struct SigningParams<'a, S> { + /// The identity to use when signing a request + pub(crate) identity: &'a Identity, + + /// Region set to sign for. + pub(crate) region_set: &'a str, + /// Service Name to sign for. + /// + /// NOTE: Endpoint resolution rules may specify a name that differs from the typical service name. + pub(crate) name: &'a str, + /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing). + pub(crate) time: SystemTime, + + /// Additional signing settings. These differ between HTTP and Event Stream. + pub(crate) settings: S, +} + +pub(crate) const ECDSA_256: &str = "AWS4-ECDSA-P256-SHA256"; + +impl<'a, S> SigningParams<'a, S> { + /// Returns the region that will be used to sign SigV4a requests + pub fn region_set(&self) -> &str { + self.region_set + } + + /// Returns the service name that will be used to sign requests + pub fn name(&self) -> &str { + self.name + } + + /// Return the name of the algorithm used to sign requests + pub fn algorithm(&self) -> &'static str { + ECDSA_256 + } +} + +impl<'a, S: Default> SigningParams<'a, S> { + /// Returns a builder that can create new `SigningParams`. + pub fn builder() -> signing_params::Builder<'a, S> { + Default::default() + } +} + +/// Builder and error for creating [`SigningParams`] +pub mod signing_params { + use super::SigningParams; + use aws_smithy_runtime_api::client::identity::Identity; + use std::error::Error; + use std::fmt; + use std::time::SystemTime; + + /// [`SigningParams`] builder error + #[derive(Debug)] + pub struct BuildError { + reason: &'static str, + } + impl BuildError { + fn new(reason: &'static str) -> Self { + Self { reason } + } + } + + impl fmt::Display for BuildError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.reason) + } + } + + impl Error for BuildError {} + + /// Builder that can create new [`SigningParams`] + #[derive(Debug, Default)] + pub struct Builder<'a, S> { + identity: Option<&'a Identity>, + region_set: Option<&'a str>, + name: Option<&'a str>, + time: Option, + settings: Option, + } + + impl<'a, S> Builder<'a, S> { + builder_methods!( + set_identity, + identity, + &'a Identity, + "Sets the identity (required)", + set_region_set, + region_set, + &'a str, + "Sets the region set (required)", + set_name, + name, + &'a str, + "Sets the name (required)", + set_time, + time, + SystemTime, + "Sets the time to be used in the signature (required)", + set_settings, + settings, + S, + "Sets additional signing settings (required)" + ); + + /// Builds an instance of [`SigningParams`]. Will yield a [`BuildError`] if + /// a required argument was not given. + pub fn build(self) -> Result, BuildError> { + Ok(SigningParams { + identity: self + .identity + .ok_or_else(|| BuildError::new("identity is required"))?, + region_set: self + .region_set + .ok_or_else(|| BuildError::new("region_set is required"))?, + name: self + .name + .ok_or_else(|| BuildError::new("name is required"))?, + time: self + .time + .ok_or_else(|| BuildError::new("time is required"))?, + settings: self + .settings + .ok_or_else(|| BuildError::new("settings are required"))?, + }) + } + } +} diff --git a/aws/rust-runtime/aws-types/Cargo.toml b/aws/rust-runtime/aws-types/Cargo.toml index eb0b527f427..1259261cac8 100644 --- a/aws/rust-runtime/aws-types/Cargo.toml +++ b/aws/rust-runtime/aws-types/Cargo.toml @@ -5,18 +5,18 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/aws/rust-runtime/aws-types/external-types.toml b/aws/rust-runtime/aws-types/external-types.toml index e43510d69e3..1e4e0c863de 100644 --- a/aws/rust-runtime/aws-types/external-types.toml +++ b/aws/rust-runtime/aws-types/external-types.toml @@ -1,18 +1,21 @@ allowed_external_types = [ "aws_credential_types::cache::CredentialsCache", "aws_credential_types::provider::SharedCredentialsProvider", + "aws_smithy_async::rt::sleep::AsyncSleep", "aws_smithy_async::rt::sleep::SharedAsyncSleep", "aws_smithy_async::time::SharedTimeSource", "aws_smithy_async::time::TimeSource", - "aws_smithy_client::http_connector", - "aws_smithy_client::http_connector::HttpConnector", - "aws_smithy_http::endpoint::Endpoint", - "aws_smithy_http::endpoint::EndpointPrefix", - "aws_smithy_http::endpoint::error::InvalidEndpointError", + "aws_smithy_runtime_api::client::behavior_version::BehaviorVersion", + "aws_smithy_runtime_api::client::http::HttpClient", + "aws_smithy_runtime_api::client::http::SharedHttpClient", + "aws_smithy_runtime_api::client::identity::ResolveCachedIdentity", + "aws_smithy_runtime_api::client::identity::SharedIdentityCache", + "aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig", + "aws_smithy_runtime_api::http::headers::Headers", "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_smithy_types::config_bag::storable::Storer", + "aws_smithy_types::error::metadata::Builder", "aws_smithy_types::retry::RetryConfig", "aws_smithy_types::timeout::TimeoutConfig", - "http::uri::Uri", ] diff --git a/aws/rust-runtime/aws-types/src/build_metadata.rs b/aws/rust-runtime/aws-types/src/build_metadata.rs index 959f728411b..31ece276f12 100644 --- a/aws/rust-runtime/aws-types/src/build_metadata.rs +++ b/aws/rust-runtime/aws-types/src/build_metadata.rs @@ -93,7 +93,9 @@ mod test { let meta = &BUILD_METADATA; // obviously a slightly brittle test. Will be a small update for Rust 2.0 and GA :-) assert!(meta.rust_version.starts_with("1.")); - assert!(meta.core_pkg_version.starts_with("0.")); + // In our release process towards GA, the package version could either be 0. or 1. + // so we need to make this `assert!` more flexible. + assert!(meta.core_pkg_version.starts_with("0.") || meta.core_pkg_version.starts_with("1.")); // quick sanity check that we're parsing common platforms correctly if cfg!(target_os = "linux") { assert_eq!(meta.os_family, OsFamily::Linux); diff --git a/aws/rust-runtime/aws-types/src/config.rs b/aws/rust-runtime/aws-types/src/config.rs deleted file mode 100644 index f2fe3da3a2d..00000000000 --- a/aws/rust-runtime/aws-types/src/config.rs +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#![deny(missing_docs)] - -//! AWS Shared Config _(deprecated, replaced with [`sdk_config`](crate::sdk_config))_ -//! -//! This module contains an shared configuration representation that is agnostic from a specific service. - -#[deprecated(since = "0.9.0", note = "renamed to crate::SdkConfig")] -/// AWS Shared Configuration -pub type Config = super::SdkConfig; diff --git a/aws/rust-runtime/aws-types/src/lib.rs b/aws/rust-runtime/aws-types/src/lib.rs index ed4e635037e..d9f76ecd7ce 100644 --- a/aws/rust-runtime/aws-types/src/lib.rs +++ b/aws/rust-runtime/aws-types/src/lib.rs @@ -17,12 +17,10 @@ pub mod app_name; pub mod build_metadata; pub mod endpoint_config; -#[doc(hidden)] pub mod os_shim_internal; pub mod region; +pub mod request_id; pub mod sdk_config; - -pub use aws_smithy_client::http_connector; pub use sdk_config::SdkConfig; use aws_smithy_types::config_bag::{Storable, StoreReplace}; @@ -30,34 +28,34 @@ use std::borrow::Cow; /// The name of the service used to sign this request /// -/// Generally, user code should never interact with `SigningService` directly +/// Generally, user code should never interact with `SigningName` directly #[derive(Clone, Debug, PartialEq, Eq)] -pub struct SigningService(Cow<'static, str>); -impl AsRef for SigningService { +pub struct SigningName(Cow<'static, str>); +impl AsRef for SigningName { fn as_ref(&self) -> &str { &self.0 } } -impl SigningService { - /// Creates a `SigningService` from a static str. - pub fn from_static(service: &'static str) -> Self { - SigningService(Cow::Borrowed(service)) +impl SigningName { + /// Creates a `SigningName` from a static str. + pub fn from_static(name: &'static str) -> Self { + SigningName(Cow::Borrowed(name)) } } -impl From for SigningService { - fn from(service: String) -> Self { - SigningService(Cow::Owned(service)) +impl From for SigningName { + fn from(name: String) -> Self { + SigningName(Cow::Owned(name)) } } -impl From<&'static str> for SigningService { - fn from(service: &'static str) -> Self { - Self::from_static(service) +impl From<&'static str> for SigningName { + fn from(name: &'static str) -> Self { + Self::from_static(name) } } -impl Storable for SigningService { +impl Storable for SigningName { type Storer = StoreReplace; } diff --git a/aws/rust-runtime/aws-types/src/os_shim_internal.rs b/aws/rust-runtime/aws-types/src/os_shim_internal.rs index 85f67cd4c2a..ad806bd6f2c 100644 --- a/aws/rust-runtime/aws-types/src/os_shim_internal.rs +++ b/aws/rust-runtime/aws-types/src/os_shim_internal.rs @@ -12,7 +12,7 @@ use std::env::VarError; use std::ffi::OsString; use std::fmt::Debug; use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use crate::os_shim_internal::fs::Fake; @@ -45,14 +45,17 @@ impl Default for Fs { } impl Fs { + /// Create `Fs` representing a real file system. pub fn real() -> Self { Fs(fs::Inner::Real) } + /// Create `Fs` from a map of `OsString` to `Vec`. pub fn from_raw_map(fs: HashMap>) -> Self { - Fs(fs::Inner::Fake(Arc::new(Fake::MapFs(fs)))) + Fs(fs::Inner::Fake(Arc::new(Fake::MapFs(Mutex::new(fs))))) } + /// Create `Fs` from a map of `String` to `Vec`. pub fn from_map(data: HashMap>>) -> Self { let fs = data .into_iter() @@ -125,9 +128,12 @@ impl Fs { use fs::Inner; let path = path.as_ref(); match &self.0 { + // TODO(https://github.com/awslabs/aws-sdk-rust/issues/867): Use async IO below Inner::Real => std::fs::read(path), Inner::Fake(fake) => match fake.as_ref() { Fake::MapFs(fs) => fs + .lock() + .unwrap() .get(path.as_os_str()) .cloned() .ok_or_else(|| std::io::ErrorKind::NotFound.into()), @@ -143,13 +149,48 @@ impl Fs { }, } } + + /// Write a slice as the entire contents of a file. + /// + /// This is equivalent to `std::fs::write`. + pub async fn write( + &self, + path: impl AsRef, + contents: impl AsRef<[u8]>, + ) -> std::io::Result<()> { + use fs::Inner; + match &self.0 { + // TODO(https://github.com/awslabs/aws-sdk-rust/issues/867): Use async IO below + Inner::Real => { + std::fs::write(path, contents)?; + } + Inner::Fake(fake) => match fake.as_ref() { + Fake::MapFs(fs) => { + fs.lock() + .unwrap() + .insert(path.as_ref().as_os_str().into(), contents.as_ref().to_vec()); + } + Fake::NamespacedFs { + real_path, + namespaced_to, + } => { + let actual_path = path + .as_ref() + .strip_prefix(namespaced_to) + .map_err(|_| std::io::Error::from(std::io::ErrorKind::NotFound))?; + std::fs::write(real_path.join(actual_path), contents)?; + } + }, + } + Ok(()) + } } mod fs { use std::collections::HashMap; use std::ffi::OsString; use std::path::PathBuf; - use std::sync::Arc; + use std::sync::{Arc, Mutex}; #[derive(Clone, Debug)] pub(super) enum Inner { @@ -159,7 +200,7 @@ mod fs { #[derive(Debug)] pub(super) enum Fake { - MapFs(HashMap>), + MapFs(Mutex>>), NamespacedFs { real_path: PathBuf, namespaced_to: PathBuf, @@ -186,6 +227,7 @@ impl Default for Env { } impl Env { + /// Retrieve a value for the given `k` and return `VarError` is that key is not present. pub fn get(&self, k: &str) -> Result { use env::Inner; match &self.0 { @@ -242,8 +284,6 @@ mod env { mod test { use std::env::VarError; - use futures_util::FutureExt; - use crate::os_shim_internal::{Env, Fs}; #[test] @@ -256,19 +296,33 @@ mod test { ) } - #[test] - fn fs_works() { + #[tokio::test] + async fn fs_from_test_dir_works() { let fs = Fs::from_test_dir(".", "/users/test-data"); let _ = fs .read_to_end("/users/test-data/Cargo.toml") - .now_or_never() - .expect("future should not poll") + .await .expect("file exists"); let _ = fs .read_to_end("doesntexist") - .now_or_never() - .expect("future should not poll") + .await .expect_err("file doesnt exists"); } + + #[tokio::test] + async fn fs_round_trip_file_with_real() { + let temp = tempfile::tempdir().unwrap(); + let path = temp.path().join("test-file"); + + let fs = Fs::real(); + fs.read_to_end(&path) + .await + .expect_err("file doesn't exist yet"); + + fs.write(&path, b"test").await.expect("success"); + + let result = fs.read_to_end(&path).await.expect("success"); + assert_eq!(b"test", &result[..]); + } } diff --git a/aws/rust-runtime/aws-types/src/region.rs b/aws/rust-runtime/aws-types/src/region.rs index a58f809a704..1fe3ad29c28 100644 --- a/aws/rust-runtime/aws-types/src/region.rs +++ b/aws/rust-runtime/aws-types/src/region.rs @@ -86,3 +86,50 @@ impl SigningRegion { impl Storable for SigningRegion { type Storer = StoreReplace; } + +// The region set to use when signing Sigv4a requests +/// +/// Generally, user code will not need to interact with `SigningRegionSet`. See `[Region](crate::Region)`. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct SigningRegionSet(Cow<'static, str>); + +impl From for SigningRegionSet { + fn from(inp: Region) -> Self { + SigningRegionSet(inp.0) + } +} + +impl From<&'static str> for SigningRegionSet { + fn from(region: &'static str) -> Self { + SigningRegionSet(Cow::Borrowed(region)) + } +} + +impl<'a> FromIterator<&'a str> for SigningRegionSet { + fn from_iter>(iter: T) -> Self { + let mut s = String::new(); + let mut iter = iter.into_iter(); + + if let Some(region) = iter.next() { + s.push_str(region); + } + + // If more than one region is present in the iter, separate remaining regions with commas + for region in iter { + s.push(','); + s.push_str(region); + } + + SigningRegionSet(Cow::Owned(s)) + } +} + +impl Storable for SigningRegionSet { + type Storer = StoreReplace; +} + +impl AsRef for SigningRegionSet { + fn as_ref(&self) -> &str { + self.0.as_ref() + } +} diff --git a/aws/rust-runtime/aws-http/src/request_id.rs b/aws/rust-runtime/aws-types/src/request_id.rs similarity index 62% rename from aws/rust-runtime/aws-http/src/request_id.rs rename to aws/rust-runtime/aws-types/src/request_id.rs index 7713328f7cd..2d5be5a094d 100644 --- a/aws/rust-runtime/aws-http/src/request_id.rs +++ b/aws/rust-runtime/aws-types/src/request_id.rs @@ -3,14 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::http::HttpHeaders; -use aws_smithy_http::operation; -use aws_smithy_http::result::SdkError; -use aws_smithy_types::error::metadata::{ - Builder as ErrorMetadataBuilder, ErrorMetadata, ProvideErrorMetadata, -}; -use aws_smithy_types::error::Unhandled; -use http::{HeaderMap, HeaderValue}; +//! AWS-specific request ID support + +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::http::Headers; +use aws_smithy_runtime_api::http::Response; +use aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata}; /// Constant for the [`ErrorMetadata`] extra field that contains the request ID const AWS_REQUEST_ID: &str = "aws_request_id"; @@ -21,14 +19,11 @@ pub trait RequestId { fn request_id(&self) -> Option<&str>; } -impl RequestId for SdkError -where - R: HttpHeaders, -{ +impl RequestId for SdkError { fn request_id(&self) -> Option<&str> { match self { - Self::ResponseError(err) => extract_request_id(err.raw().http_headers()), - Self::ServiceError(err) => extract_request_id(err.raw().http_headers()), + Self::ResponseError(err) => err.raw().headers().request_id(), + Self::ServiceError(err) => err.raw().headers().request_id(), _ => None, } } @@ -40,27 +35,16 @@ impl RequestId for ErrorMetadata { } } -impl RequestId for Unhandled { - fn request_id(&self) -> Option<&str> { - self.meta().request_id() - } -} - -impl RequestId for operation::Response { +impl RequestId for Response { fn request_id(&self) -> Option<&str> { - extract_request_id(self.http().headers()) + self.headers().request_id() } } -impl RequestId for http::Response { +impl RequestId for Headers { fn request_id(&self) -> Option<&str> { - extract_request_id(self.headers()) - } -} - -impl RequestId for HeaderMap { - fn request_id(&self) -> Option<&str> { - extract_request_id(self) + self.get("x-amzn-requestid") + .or(self.get("x-amz-request-id")) } } @@ -78,38 +62,27 @@ where } /// Applies a request ID to a generic error builder -#[doc(hidden)] -pub fn apply_request_id( - builder: ErrorMetadataBuilder, - headers: &HeaderMap, -) -> ErrorMetadataBuilder { - if let Some(request_id) = extract_request_id(headers) { +pub fn apply_request_id(builder: ErrorMetadataBuilder, headers: &Headers) -> ErrorMetadataBuilder { + if let Some(request_id) = headers.request_id() { builder.custom(AWS_REQUEST_ID, request_id) } else { builder } } -/// Extracts a request ID from HTTP response headers -fn extract_request_id(headers: &HeaderMap) -> Option<&str> { - headers - .get("x-amzn-requestid") - .or_else(|| headers.get("x-amz-request-id")) - .and_then(|value| value.to_str().ok()) -} - #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; - use http::Response; + use aws_smithy_runtime_api::client::orchestrator::HttpResponse; + use aws_smithy_types::body::SdkBody; + use http::{HeaderValue, Response}; #[test] fn test_request_id_sdk_error() { let without_request_id = - || operation::Response::new(Response::builder().body(SdkBody::empty()).unwrap()); + || HttpResponse::try_from(Response::builder().body(SdkBody::empty()).unwrap()).unwrap(); let with_request_id = || { - operation::Response::new( + HttpResponse::try_from( Response::builder() .header( "x-amzn-requestid", @@ -118,6 +91,7 @@ mod tests { .body(SdkBody::empty()) .unwrap(), ) + .unwrap() }; assert_eq!( None, @@ -139,28 +113,28 @@ mod tests { #[test] fn test_extract_request_id() { - let mut headers = HeaderMap::new(); - assert_eq!(None, extract_request_id(&headers)); + let mut headers = Headers::new(); + assert_eq!(None, headers.request_id()); headers.append( "x-amzn-requestid", HeaderValue::from_static("some-request-id"), ); - assert_eq!(Some("some-request-id"), extract_request_id(&headers)); + assert_eq!(Some("some-request-id"), headers.request_id()); headers.append( "x-amz-request-id", HeaderValue::from_static("other-request-id"), ); - assert_eq!(Some("some-request-id"), extract_request_id(&headers)); + assert_eq!(Some("some-request-id"), headers.request_id()); headers.remove("x-amzn-requestid"); - assert_eq!(Some("other-request-id"), extract_request_id(&headers)); + assert_eq!(Some("other-request-id"), headers.request_id()); } #[test] fn test_apply_request_id() { - let mut headers = HeaderMap::new(); + let mut headers = Headers::new(); assert_eq!( ErrorMetadata::builder().build(), apply_request_id(ErrorMetadata::builder(), &headers).build(), diff --git a/aws/rust-runtime/aws-types/src/sdk_config.rs b/aws/rust-runtime/aws-types/src/sdk_config.rs index 4d0728a9858..4371f1d4a3a 100644 --- a/aws/rust-runtime/aws-types/src/sdk_config.rs +++ b/aws/rust-runtime/aws-types/src/sdk_config.rs @@ -9,21 +9,26 @@ //! //! This module contains an shared configuration representation that is agnostic from a specific service. -use aws_credential_types::cache::CredentialsCache; -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::time::{SharedTimeSource, TimeSource}; -use aws_smithy_client::http_connector::HttpConnector; -use aws_smithy_types::retry::RetryConfig; -use aws_smithy_types::timeout::TimeoutConfig; - use crate::app_name::AppName; use crate::docs_for; use crate::region::Region; -#[doc(hidden)] +pub use aws_credential_types::provider::SharedCredentialsProvider; +use aws_smithy_async::rt::sleep::AsyncSleep; +pub use aws_smithy_async::rt::sleep::SharedAsyncSleep; +pub use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; +use aws_smithy_runtime_api::client::http::HttpClient; +pub use aws_smithy_runtime_api::client::http::SharedHttpClient; +use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache}; +pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; +use aws_smithy_runtime_api::shared::IntoShared; +pub use aws_smithy_types::retry::RetryConfig; +pub use aws_smithy_types::timeout::TimeoutConfig; + /// Unified docstrings to keep crates in sync. Not intended for public use pub mod unified_docs { + /// A macro that generates docs for selected fields of `SdkConfig`. #[macro_export] macro_rules! docs_for { (use_fips) => { @@ -48,7 +53,7 @@ these services, this setting has no effect" #[derive(Debug, Clone)] pub struct SdkConfig { app_name: Option, - credentials_cache: Option, + identity_cache: Option, credentials_provider: Option, region: Option, endpoint_url: Option, @@ -56,9 +61,11 @@ pub struct SdkConfig { sleep_impl: Option, time_source: Option, timeout_config: Option, - http_connector: Option, + stalled_stream_protection_config: Option, + http_client: Option, use_fips: Option, use_dual_stack: Option, + behavior_version: Option, } /// Builder for AWS Shared Configuration @@ -69,7 +76,7 @@ pub struct SdkConfig { #[derive(Debug, Default)] pub struct Builder { app_name: Option, - credentials_cache: Option, + identity_cache: Option, credentials_provider: Option, region: Option, endpoint_url: Option, @@ -77,9 +84,11 @@ pub struct Builder { sleep_impl: Option, time_source: Option, timeout_config: Option, - http_connector: Option, + stalled_stream_protection_config: Option, + http_client: Option, use_fips: Option, use_dual_stack: Option, + behavior_version: Option, } impl Builder { @@ -117,7 +126,7 @@ impl Builder { self } - /// Set the endpoint url to use when making requests. + /// Set the endpoint URL to use when making requests. /// # Examples /// ``` /// use aws_types::SdkConfig; @@ -128,7 +137,7 @@ impl Builder { self } - /// Set the endpoint url to use when making requests. + /// Set the endpoint URL to use when making requests. pub fn set_endpoint_url(&mut self, endpoint_url: Option) -> &mut Self { self.endpoint_url = endpoint_url; self @@ -230,8 +239,9 @@ impl Builder { self } - /// Set the sleep implementation for the builder. The sleep implementation is used to create - /// timeout futures. + /// Set the sleep implementation for the builder. + /// + /// The sleep implementation is used to create timeout futures. /// /// _Note:_ If you're using the Tokio runtime, a `TokioSleep` implementation is available in /// the `aws-smithy-async` crate. @@ -254,8 +264,8 @@ impl Builder { /// let sleep_impl = SharedAsyncSleep::new(ForeverSleep); /// let config = SdkConfig::builder().sleep_impl(sleep_impl).build(); /// ``` - pub fn sleep_impl(mut self, sleep_impl: SharedAsyncSleep) -> Self { - self.set_sleep_impl(Some(sleep_impl)); + pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self { + self.set_sleep_impl(Some(sleep_impl.into_shared())); self } @@ -292,40 +302,64 @@ impl Builder { self } - /// Set the [`CredentialsCache`] for the builder + /// Set the identity cache for caching credentials and SSO tokens. + /// + /// The default identity cache will wait until the first request that requires authentication + /// to load an identity. Once the identity is loaded, it is cached until shortly before it + /// expires. /// /// # Examples + /// Disabling identity caching: /// ```rust - /// use aws_credential_types::cache::CredentialsCache; - /// use aws_types::SdkConfig; + /// # use aws_types::SdkConfig; + /// use aws_smithy_runtime::client::identity::IdentityCache; + /// let config = SdkConfig::builder() + /// .identity_cache(IdentityCache::no_cache()) + /// .build(); + /// ``` + /// Changing settings on the default cache implementation: + /// ```rust + /// # use aws_types::SdkConfig; + /// use aws_smithy_runtime::client::identity::IdentityCache; + /// use std::time::Duration; + /// /// let config = SdkConfig::builder() - /// .credentials_cache(CredentialsCache::lazy()) + /// .identity_cache( + /// IdentityCache::lazy() + /// .load_timeout(Duration::from_secs(10)) + /// .build() + /// ) /// .build(); /// ``` - pub fn credentials_cache(mut self, cache: CredentialsCache) -> Self { - self.set_credentials_cache(Some(cache)); + pub fn identity_cache(mut self, cache: impl ResolveCachedIdentity + 'static) -> Self { + self.set_identity_cache(Some(cache.into_shared())); self } - /// Set the [`CredentialsCache`] for the builder + /// Set the identity cache for caching credentials and SSO tokens. + /// + /// The default identity cache will wait until the first request that requires authentication + /// to load an identity. Once the identity is loaded, it is cached until shortly before it + /// expires. /// /// # Examples /// ```rust - /// use aws_credential_types::cache::CredentialsCache; - /// use aws_types::SdkConfig; - /// fn override_credentials_cache() -> bool { + /// # use aws_types::SdkConfig; + /// use aws_smithy_runtime::client::identity::IdentityCache; + /// + /// fn override_identity_cache() -> bool { /// // ... /// # true /// } /// /// let mut builder = SdkConfig::builder(); - /// if override_credentials_cache() { - /// builder.set_credentials_cache(Some(CredentialsCache::lazy())); + /// if override_identity_cache() { + /// builder.set_identity_cache(Some(IdentityCache::lazy().build())); /// } /// let config = builder.build(); /// ``` - pub fn set_credentials_cache(&mut self, cache: Option) -> &mut Self { - self.credentials_cache = cache; + pub fn set_identity_cache(&mut self, cache: Option) -> &mut Self { + self.identity_cache = cache; self } @@ -399,81 +433,76 @@ impl Builder { self } - /// Sets the HTTP connector to use when making requests. + /// Sets the HTTP client to use when making requests. /// /// ## Examples /// ```no_run /// # #[cfg(feature = "examples")] /// # fn example() { + /// use aws_types::sdk_config::{SdkConfig, TimeoutConfig}; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// use std::time::Duration; - /// use aws_smithy_client::{Client, hyper_ext}; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// use aws_types::SdkConfig; /// - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() + /// // Create a connector that will be used to establish TLS connections + /// let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() /// .https_only() /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() + /// // Create a HTTP client that uses the TLS connector. This client is + /// // responsible for creating and caching a HttpConnector when given HttpConnectorSettings. + /// // This hyper client will create HttpConnectors backed by hyper and the tls_connector. + /// let http_client = HyperClientBuilder::new().build(tls_connector); + /// let sdk_config = SdkConfig::builder() + /// .http_client(http_client) + /// // Connect/read timeouts are passed to the HTTP client when servicing a request + /// .timeout_config( + /// TimeoutConfig::builder() /// .connect_timeout(Duration::from_secs(5)) /// .build() /// ) - /// .build(https_connector); - /// let sdk_config = SdkConfig::builder() - /// .http_connector(smithy_connector) /// .build(); /// # } /// ``` - pub fn http_connector(mut self, http_connector: impl Into) -> Self { - self.set_http_connector(Some(http_connector)); + pub fn http_client(mut self, http_client: impl HttpClient + 'static) -> Self { + self.set_http_client(Some(http_client.into_shared())); self } - /// Sets the HTTP connector to use when making requests. + /// Sets the HTTP client to use when making requests. /// /// ## Examples /// ```no_run /// # #[cfg(feature = "examples")] /// # fn example() { + /// use aws_types::sdk_config::{Builder, SdkConfig, TimeoutConfig}; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// use std::time::Duration; - /// use aws_smithy_client::hyper_ext; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// use aws_types::sdk_config::{Builder, SdkConfig}; /// - /// fn override_http_connector(builder: &mut Builder) { - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() + /// fn override_http_client(builder: &mut Builder) { + /// // Create a connector that will be used to establish TLS connections + /// let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() /// .https_only() /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); - /// builder.set_http_connector(Some(smithy_connector)); + /// // Create a HTTP client that uses the TLS connector. This client is + /// // responsible for creating and caching a HttpConnector when given HttpConnectorSettings. + /// // This hyper client will create HttpConnectors backed by hyper and the tls_connector. + /// let http_client = HyperClientBuilder::new().build(tls_connector); + /// + /// builder.set_http_client(Some(http_client)); /// } /// /// let mut builder = SdkConfig::builder(); - /// override_http_connector(&mut builder); + /// override_http_client(&mut builder); /// let config = builder.build(); /// # } /// ``` - pub fn set_http_connector( - &mut self, - http_connector: Option>, - ) -> &mut Self { - self.http_connector = http_connector.map(|inner| inner.into()); + pub fn set_http_client(&mut self, http_client: Option) -> &mut Self { + self.http_client = http_client; self } @@ -513,25 +542,110 @@ impl Builder { self } + /// Sets the [`BehaviorVersion`] for the [`SdkConfig`] + pub fn behavior_version(mut self, behavior_version: BehaviorVersion) -> Self { + self.set_behavior_version(Some(behavior_version)); + self + } + + /// Sets the [`BehaviorVersion`] for the [`SdkConfig`] + pub fn set_behavior_version(&mut self, behavior_version: Option) -> &mut Self { + self.behavior_version = behavior_version; + self + } + /// Build a [`SdkConfig`](SdkConfig) from this builder pub fn build(self) -> SdkConfig { SdkConfig { app_name: self.app_name, - credentials_cache: self.credentials_cache, + identity_cache: self.identity_cache, credentials_provider: self.credentials_provider, region: self.region, endpoint_url: self.endpoint_url, retry_config: self.retry_config, sleep_impl: self.sleep_impl, timeout_config: self.timeout_config, - http_connector: self.http_connector, + http_client: self.http_client, use_fips: self.use_fips, use_dual_stack: self.use_dual_stack, time_source: self.time_source, + behavior_version: self.behavior_version, + stalled_stream_protection_config: self.stalled_stream_protection_config, } } } +impl Builder { + /// Set the [`StalledStreamProtectionConfig`] to configure protection for stalled streams. + /// + /// This configures stalled stream protection. When enabled, download streams + /// that stall (stream no data) for longer than a configured grace period will return an error. + /// + /// _Note:_ Stalled stream protection requires both a sleep implementation and a time source + /// in order to work. When enabling stalled stream protection, make sure to set + /// - A sleep impl with [Self::sleep_impl] or [Self::set_sleep_impl]. + /// - A time source with [Self::time_source] or [Self::set_time_source]. + /// + /// # Examples + /// ```rust + /// use std::time::Duration; + /// use aws_types::SdkConfig; + /// pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; + /// + /// let stalled_stream_protection_config = StalledStreamProtectionConfig::enabled() + /// .grace_period(Duration::from_secs(1)) + /// .build(); + /// let config = SdkConfig::builder() + /// .stalled_stream_protection(stalled_stream_protection_config) + /// .build(); + /// ``` + pub fn stalled_stream_protection( + mut self, + stalled_stream_protection_config: StalledStreamProtectionConfig, + ) -> Self { + self.set_stalled_stream_protection(Some(stalled_stream_protection_config)); + self + } + + /// Set the [`StalledStreamProtectionConfig`] to configure protection for stalled streams. + /// + /// This configures stalled stream protection. When enabled, download streams + /// that stall (stream no data) for longer than a configured grace period will return an error. + /// + /// By default, streams that transmit less than one byte per-second for five seconds will + /// be cancelled. + /// + /// _Note:_ Stalled stream protection requires both a sleep implementation and a time source + /// in order to work. When enabling stalled stream protection, make sure to set + /// - A sleep impl with [Self::sleep_impl] or [Self::set_sleep_impl]. + /// - A time source with [Self::time_source] or [Self::set_time_source]. + /// + /// # Examples + /// ```rust + /// use std::time::Duration; + /// use aws_types::sdk_config::{SdkConfig, Builder}; + /// pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; + /// + /// fn set_stalled_stream_protection(builder: &mut Builder) { + /// let stalled_stream_protection_config = StalledStreamProtectionConfig::enabled() + /// .grace_period(Duration::from_secs(1)) + /// .build(); + /// builder.set_stalled_stream_protection(Some(stalled_stream_protection_config)); + /// } + /// + /// let mut builder = SdkConfig::builder(); + /// set_stalled_stream_protection(&mut builder); + /// let config = builder.build(); + /// ``` + pub fn set_stalled_stream_protection( + &mut self, + stalled_stream_protection_config: Option, + ) -> &mut Self { + self.stalled_stream_protection_config = stalled_stream_protection_config; + self + } +} + impl SdkConfig { /// Configured region pub fn region(&self) -> Option<&Region> { @@ -553,15 +667,14 @@ impl SdkConfig { self.timeout_config.as_ref() } - #[doc(hidden)] /// Configured sleep implementation pub fn sleep_impl(&self) -> Option { self.sleep_impl.clone() } - /// Configured credentials cache - pub fn credentials_cache(&self) -> Option<&CredentialsCache> { - self.credentials_cache.as_ref() + /// Configured identity cache + pub fn identity_cache(&self) -> Option { + self.identity_cache.clone() } /// Configured credentials provider @@ -579,9 +692,9 @@ impl SdkConfig { self.app_name.as_ref() } - /// Configured HTTP Connector - pub fn http_connector(&self) -> Option<&HttpConnector> { - self.http_connector.as_ref() + /// Configured HTTP client + pub fn http_client(&self) -> Option { + self.http_client.clone() } /// Use FIPS endpoints @@ -594,6 +707,16 @@ impl SdkConfig { self.use_dual_stack } + /// Configured stalled stream protection + pub fn stalled_stream_protection(&self) -> Option { + self.stalled_stream_protection_config.clone() + } + + /// Behavior major version configured for this client + pub fn behavior_version(&self) -> Option { + self.behavior_version.clone() + } + /// Config builder /// /// _Important:_ Using the `aws-config` crate to configure the SDK is preferred to invoking this @@ -602,4 +725,29 @@ impl SdkConfig { pub fn builder() -> Builder { Builder::default() } + + /// Convert this [`SdkConfig`] into a [`Builder`] by cloning it first + pub fn to_builder(&self) -> Builder { + self.clone().into_builder() + } + + /// Convert this [`SdkConfig`] back to a builder to enable modification + pub fn into_builder(self) -> Builder { + Builder { + app_name: self.app_name, + identity_cache: self.identity_cache, + credentials_provider: self.credentials_provider, + region: self.region, + endpoint_url: self.endpoint_url, + retry_config: self.retry_config, + sleep_impl: self.sleep_impl, + time_source: self.time_source, + timeout_config: self.timeout_config, + http_client: self.http_client, + use_fips: self.use_fips, + use_dual_stack: self.use_dual_stack, + behavior_version: self.behavior_version, + stalled_stream_protection_config: self.stalled_stream_protection_config, + } + } } diff --git a/aws/rust-runtime/clippy.toml b/aws/rust-runtime/clippy.toml new file mode 120000 index 00000000000..0cbd6319b24 --- /dev/null +++ b/aws/rust-runtime/clippy.toml @@ -0,0 +1 @@ +../../clippy-root.toml \ No newline at end of file diff --git a/aws/sdk-adhoc-test/build.gradle.kts b/aws/sdk-adhoc-test/build.gradle.kts index 3a631a5bb27..53460ba9ceb 100644 --- a/aws/sdk-adhoc-test/build.gradle.kts +++ b/aws/sdk-adhoc-test/build.gradle.kts @@ -20,7 +20,7 @@ val pluginName = "rust-client-codegen" val workingDirUnderBuildDir = "smithyprojections/sdk-adhoc-test/" configure { - outputDirectory = file("$buildDir/$workingDirUnderBuildDir") + outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile } buildscript { @@ -35,56 +35,58 @@ dependencies { implementation("software.amazon.smithy:smithy-aws-protocol-tests:$smithyVersion") implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") + implementation("software.amazon.smithy:smithy-model:$smithyVersion") } -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "middleware" +fun getNullabilityCheckMode(): String = properties.get("nullability.check.mode") ?: "CLIENT_CAREFUL" -val allCodegenTests = listOf( - CodegenTest( - "com.amazonaws.apigateway#BackplaneControlService", - "apigateway", - imports = listOf("models/apigateway-rules.smithy"), +fun baseTest(service: String, module: String, imports: List = listOf()): CodegenTest { + return CodegenTest( + service = service, + module = module, + imports = imports, + extraCodegenConfig = """ + "includeFluentClient": false, + "nullabilityCheckMode": "${getNullabilityCheckMode()}" + """, extraConfig = """ - , - "codegen": { - "includeFluentClient": false, - "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}" - }, - "customizationConfig": { + , "customizationConfig": { "awsSdk": { - "generateReadme": false + "generateReadme": false, + "requireEndpointResolver": false } } """, + ) +} + +val allCodegenTests = listOf( + baseTest( + "com.amazonaws.apigateway#BackplaneControlService", + "apigateway", + imports = listOf("models/apigateway-rules.smithy"), ), - CodegenTest( + baseTest( "com.amazonaws.testservice#TestService", "endpoint-test-service", imports = listOf("models/single-static-endpoint.smithy"), - extraConfig = """ - , - "codegen": { - "includeFluentClient": false, - "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}" - }, - "customizationConfig": { - "awsSdk": { - "generateReadme": false - } - } - """, + ), + baseTest( + "com.amazonaws.testservice#RequiredValues", + "required-values", + imports = listOf("models/required-value-test.smithy"), ), ) project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) -project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) +project.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") project.registerModifyMtimeTask() -project.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) +project.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile, defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) diff --git a/aws/sdk-adhoc-test/models/apigateway-rules.smithy b/aws/sdk-adhoc-test/models/apigateway-rules.smithy index 3e5bb310d30..db13c805e32 100644 --- a/aws/sdk-adhoc-test/models/apigateway-rules.smithy +++ b/aws/sdk-adhoc-test/models/apigateway-rules.smithy @@ -19,7 +19,6 @@ apply BackplaneControlService @endpointRuleSet({ "endpoint": { "url": "https://www.example.com" } }], "parameters": { - "Bucket": { "required": false, "type": "String" }, "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, } }) diff --git a/aws/sdk-adhoc-test/models/required-value-test.smithy b/aws/sdk-adhoc-test/models/required-value-test.smithy new file mode 100644 index 00000000000..efb90d9250f --- /dev/null +++ b/aws/sdk-adhoc-test/models/required-value-test.smithy @@ -0,0 +1,28 @@ +$version: "1.0" + +namespace com.amazonaws.testservice + +use aws.api#service +use aws.protocols#restJson1 + +@restJson1 +@title("Test Service") +@service(sdkId: "Test") +@aws.auth#sigv4(name: "test-service") +service RequiredValues { + operations: [TestOperation] +} + +@http(method: "GET", uri: "/") +operation TestOperation { + errors: [Error] +} + +@error("client") +structure Error { + @required + requestId: String + + @required + message: String +} diff --git a/aws/sdk-adhoc-test/models/single-static-endpoint.smithy b/aws/sdk-adhoc-test/models/single-static-endpoint.smithy index a110cee5c87..cb98b605fd8 100644 --- a/aws/sdk-adhoc-test/models/single-static-endpoint.smithy +++ b/aws/sdk-adhoc-test/models/single-static-endpoint.smithy @@ -26,6 +26,7 @@ use smithy.rules#endpointTests "authSchemes": [{ "name": "sigv4", "signingRegion": "{Region}", + "signingName": "blah" }] } } @@ -33,6 +34,24 @@ use smithy.rules#endpointTests ] }) @endpointTests({"version": "1", "testCases": [ + { + "documentation": "region set", + "expect": { + "endpoint": { + "url": "https://prod.us-east-1.api.myservice.aws.dev", + "properties": { + "authSchemes": [{ + "name": "sigv4", + "signingRegion": "us-east-1", + "signingName": "blah" + }] + + } + } + }, + "params": { "Region": "us-east-1" } + "operationInputs": [ ] + }, { "documentation": "region should fallback to the default", "expect": { @@ -42,6 +61,7 @@ use smithy.rules#endpointTests "authSchemes": [{ "name": "sigv4", "signingRegion": "us-east-2", + "signingName": "blah" }] } diff --git a/aws/sdk-codegen/build.gradle.kts b/aws/sdk-codegen/build.gradle.kts index bb6f2925a74..f2eb5b44929 100644 --- a/aws/sdk-codegen/build.gradle.kts +++ b/aws/sdk-codegen/build.gradle.kts @@ -23,29 +23,15 @@ val smithyVersion: String by project dependencies { implementation(project(":codegen-core")) implementation(project(":codegen-client")) - implementation("org.jsoup:jsoup:1.14.3") + implementation("org.jsoup:jsoup:1.15.3") implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-rules-engine:$smithyVersion") -} - -val generateAwsRuntimeCrateVersion by tasks.registering { - // generate the version of the runtime to use as a resource. - // this keeps us from having to manually change version numbers in multiple places - val resourcesDir = "$buildDir/resources/main/software/amazon/smithy/rustsdk" - val versionFile = file("$resourcesDir/sdk-crate-version.txt") - outputs.file(versionFile) - val crateVersion = project.properties["smithy.rs.runtime.crate.version"]?.toString()!! - inputs.property("crateVersion", crateVersion) - sourceSets.main.get().output.dir(resourcesDir) - doLast { - versionFile.writeText(crateVersion) - } + implementation("software.amazon.smithy:smithy-aws-endpoints:$smithyVersion") } tasks.compileKotlin { kotlinOptions.jvmTarget = "1.8" - dependsOn(generateAwsRuntimeCrateVersion) } // Reusable license copySpec @@ -87,12 +73,11 @@ if (isTestingEnabled.toBoolean()) { tasks.test { useJUnitPlatform() testLogging { - events("passed", "skipped", "failed") + events("failed") exceptionFormat = TestExceptionFormat.FULL showCauses = true showExceptions = true showStackTraces = true - showStandardStreams = true } } @@ -101,7 +86,7 @@ if (isTestingEnabled.toBoolean()) { reports { xml.required.set(false) csv.required.set(false) - html.outputLocation.set(file("$buildDir/reports/jacoco")) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco")) } } @@ -116,5 +101,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt index c0127ae1e96..c803040f7d8 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt @@ -10,17 +10,14 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.crateLocation fun RuntimeConfig.awsRuntimeCrate(name: String, features: Set = setOf()): CargoDependency = - CargoDependency(name, awsRoot().crateLocation(null), features = features) + CargoDependency(name, awsRoot().crateLocation(name), features = features) object AwsCargoDependency { fun awsConfig(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-config") fun awsCredentialTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-credential-types") - fun awsEndpoint(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-endpoint") fun awsHttp(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-http") fun awsRuntime(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-runtime") fun awsRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-runtime-api") - fun awsSigAuth(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-sig-auth") - fun awsSigAuthEventStream(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-sig-auth", setOf("sign-eventstream")) fun awsSigv4(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-sigv4") fun awsTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate("aws-types") } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt index 952cb35e607..5e694c1cead 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt @@ -10,6 +10,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.customizations.DocsRsMe import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator import software.amazon.smithy.rustsdk.customize.DisabledAuthDecorator +import software.amazon.smithy.rustsdk.customize.RemoveDefaultsDecorator import software.amazon.smithy.rustsdk.customize.apigateway.ApiGatewayDecorator import software.amazon.smithy.rustsdk.customize.applyDecorators import software.amazon.smithy.rustsdk.customize.ec2.Ec2Decorator @@ -29,13 +30,11 @@ import software.amazon.smithy.rustsdk.endpoints.RequireEndpointRules val DECORATORS: List = listOf( // General AWS Decorators listOf( - CredentialsCacheDecorator(), CredentialsProviderDecorator(), RegionDecorator(), RequireEndpointRules(), UserAgentDecorator(), SigV4AuthDecorator(), - SigV4SigningDecorator(), HttpRequestChecksumDecorator(), HttpResponseChecksumDecorator(), RetryClassifierDecorator(), @@ -46,7 +45,6 @@ val DECORATORS: List = listOf( ServiceConfigDecorator(), AwsPresigningDecorator(), AwsCrateDocsDecorator(), - HttpConnectorDecorator(), AwsEndpointsStdLib(), *PromotedBuiltInsDecorators, GenericSmithySdkConfigSettings(), @@ -56,6 +54,7 @@ val DECORATORS: List = listOf( RecursionDetectionDecorator(), InvocationIdDecorator(), RetryInformationHeaderDecorator(), + RemoveDefaultsDecorator(), ), // Service specific decorators diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt index f167015ac23..bce5c6f0ef5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt @@ -103,12 +103,16 @@ internal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenCon else -> rawTemplate(text + "\n", *args) } - private fun docText( + internal fun docText( includeHeader: Boolean, includeLicense: Boolean, asComments: Boolean, ): Writable = writable { + val moduleVersion = codegenContext.settings.moduleVersion + check(moduleVersion.isNotEmpty() && moduleVersion[0].isDigit()) + val moduleName = codegenContext.settings.moduleName + val stableVersion = !moduleVersion.startsWith("0.") val description = normalizeDescription( codegenContext.moduleName, codegenContext.settings.getService(codegenContext.model).getTrait()?.value ?: "", @@ -119,13 +123,18 @@ internal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenCon if (includeHeader) { template(asComments, escape("# $moduleName\n")) } - template( - asComments, - """ - **Please Note: The SDK is currently in Developer Preview and is intended strictly for - feedback purposes only. Do not use this SDK for production workloads.**${"\n"} - """.trimIndent(), - ) + + // TODO(PostGA): Remove warning banner conditionals. + // NOTE: when you change this, you must also change SDK_README.md.hb + if (!stableVersion) { + template( + asComments, + """ + **Please Note: The SDK is currently released as a developer preview, without support or assistance for use + on production workloads. Any use in production is at your own risk.**${"\n"} + """.trimIndent(), + ) + } if (description.isNotBlank()) { template(asComments, escape("$description\n")) @@ -147,8 +156,8 @@ internal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenCon ```toml [dependencies] - aws-config = "$awsConfigVersion" - $moduleName = "${codegenContext.settings.moduleVersion}" + aws-config = { version = "$awsConfigVersion", features = ["behavior-version-latest"] } + $moduleName = "$moduleVersion" tokio = { version = "1", features = ["full"] } ``` @@ -313,7 +322,7 @@ internal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenCon private fun Element.normalizeList(indent: Int = 1) { // First, replace nested lists - for (child in children().filter { it.tagName() == "li" }) { + for (child in children().filter { tag -> tag.tagName() == "li" }) { for (itemChild in child.children()) { if (itemChild.isList()) { itemChild.normalizeList(indent + 1) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt deleted file mode 100644 index 29718fa3cd0..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCustomizableOperationDecorator.kt +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.CustomizableOperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.CustomizableOperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType - -class CustomizableOperationTestHelpers(runtimeConfig: RuntimeConfig) : - CustomizableOperationCustomization() { - private val codegenScope = arrayOf( - *RuntimeType.preludeScope, - "AwsUserAgent" to AwsRuntimeType.awsHttp(runtimeConfig) - .resolve("user_agent::AwsUserAgent"), - "BeforeTransmitInterceptorContextMut" to RuntimeType.beforeTransmitInterceptorContextMut(runtimeConfig), - "ConfigBag" to RuntimeType.configBag(runtimeConfig), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), - "http" to CargoDependency.Http.toType(), - "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "SharedTimeSource" to CargoDependency.smithyAsync(runtimeConfig).withFeature("test-util").toType() - .resolve("time::SharedTimeSource"), - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::interceptors::SharedInterceptor"), - "TestParamsSetterInterceptor" to CargoDependency.smithyRuntime(runtimeConfig).withFeature("test-util") - .toType().resolve("client::test_util::interceptors::TestParamsSetterInterceptor"), - ) - - override fun section(section: CustomizableOperationSection): Writable = - writable { - if (section is CustomizableOperationSection.CustomizableOperationImpl) { - if (section.isRuntimeModeOrchestrator) { - rustTemplate( - """ - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn request_time_for_tests(mut self, request_time: ::std::time::SystemTime) -> Self { - use #{ConfigBagAccessors}; - let interceptor = #{TestParamsSetterInterceptor}::new(move |_: &mut #{BeforeTransmitInterceptorContextMut}<'_>, cfg: &mut #{ConfigBag}| { - cfg.interceptor_state().set_request_time(#{SharedTimeSource}::new(request_time)); - }); - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self - } - - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn user_agent_for_tests(mut self) -> Self { - let interceptor = #{TestParamsSetterInterceptor}::new(|context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, _: &mut #{ConfigBag}| { - let headers = context.request_mut().headers_mut(); - let user_agent = #{AwsUserAgent}::for_tests(); - headers.insert( - #{http}::header::USER_AGENT, - #{http}::HeaderValue::try_from(user_agent.ua_header()).unwrap(), - ); - headers.insert( - #{http}::HeaderName::from_static("x-amz-user-agent"), - #{http}::HeaderValue::try_from(user_agent.aws_ua_header()).unwrap(), - ); - }); - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self - } - - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn remove_invocation_id_for_tests(mut self) -> Self { - let interceptor = #{TestParamsSetterInterceptor}::new(|context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, _: &mut #{ConfigBag}| { - context.request_mut().headers_mut().remove("amz-sdk-invocation-id"); - }); - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self - } - """, - *codegenScope, - ) - } else { - // TODO(enableNewSmithyRuntimeCleanup): Delete this branch when middleware is no longer used - rustTemplate( - """ - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn request_time_for_tests(mut self, request_time: ::std::time::SystemTime) -> Self { - self.operation.properties_mut().insert(#{SharedTimeSource}::new(request_time)); - self - } - - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn user_agent_for_tests(mut self) -> Self { - self.operation.properties_mut().insert(#{AwsUserAgent}::for_tests()); - self - } - - ##[doc(hidden)] - // This is a temporary method for testing. NEVER use it in production - pub fn remove_invocation_id_for_tests(self) -> Self { - self - } - """, - *codegenScope, - ) - } - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt index 7166ce11441..6263d54497d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.docsTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizationsOrElse -import software.amazon.smithy.rust.codegen.core.util.toSnakeCase object AwsDocs { /** @@ -22,12 +21,13 @@ object AwsDocs { fun canRelyOnAwsConfig(codegenContext: ClientCodegenContext): Boolean = SdkSettings.from(codegenContext.settings).awsConfigVersion != null && !setOf( - ShapeId.from("com.amazonaws.sts#AWSSecurityTokenServiceV20110615"), ShapeId.from("com.amazonaws.sso#SWBPortalService"), + ShapeId.from("com.amazonaws.ssooidc#AWSSSOOIDCService"), + ShapeId.from("com.amazonaws.sts#AWSSecurityTokenServiceV20110615"), ).contains(codegenContext.serviceShape.id) fun constructClient(codegenContext: ClientCodegenContext, indent: String): Writable { - val crateName = codegenContext.moduleName.toSnakeCase() + val crateName = codegenContext.moduleUseName() return writable { writeCustomizationsOrElse( codegenContext.rootDecorator.extraSections(codegenContext), @@ -48,7 +48,7 @@ object AwsDocs { fun clientConstructionDocs(codegenContext: ClientCodegenContext): Writable = { if (canRelyOnAwsConfig(codegenContext)) { - val crateName = codegenContext.moduleName.toSnakeCase() + val crateName = codegenContext.moduleUseName() docsTemplate( """ #### Constructing a `Client` diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt index 2a558daf031..a118823e725 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt @@ -12,8 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.client.Fluen import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientDocs import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.NoClientGenerics -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.renderCustomizableOperationSend import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.DefaultProtocolTestGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ProtocolTestGenerator import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -30,22 +28,12 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection import software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault -import software.amazon.smithy.rustsdk.AwsRuntimeType.defaultMiddleware private class Types(runtimeConfig: RuntimeConfig) { - private val smithyClient = RuntimeType.smithyClient(runtimeConfig) - private val smithyHttp = RuntimeType.smithyHttp(runtimeConfig) private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) val awsTypes = AwsRuntimeType.awsTypes(runtimeConfig) - val connectorError = smithyHttp.resolve("result::ConnectorError") - val connectorSettings = smithyClient.resolve("http_connector::ConnectorSettings") - val dynConnector = smithyClient.resolve("erase::DynConnector") - val dynMiddleware = smithyClient.resolve("erase::DynMiddleware") val retryConfig = smithyTypes.resolve("retry::RetryConfig") - val smithyClientBuilder = smithyClient.resolve("Builder") - val smithyClientRetry = smithyClient.resolve("retry") - val smithyConnector = smithyClient.resolve("bounds::SmithyConnector") val timeoutConfig = smithyTypes.resolve("timeout::TimeoutConfig") } @@ -58,25 +46,17 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { val runtimeConfig = codegenContext.runtimeConfig val types = Types(runtimeConfig) - val generics = NoClientGenerics(runtimeConfig) FluentClientGenerator( codegenContext, - reexportSmithyClientBuilder = false, - generics = generics, customizations = listOf( AwsPresignedFluentBuilderMethod(codegenContext), AwsFluentClientDocs(codegenContext), ), - retryClassifier = AwsRuntimeType.awsHttp(runtimeConfig).resolve("retry::AwsResponseRetryClassifier"), - ).render(rustCrate, listOf(CustomizableOperationTestHelpers(runtimeConfig))) - rustCrate.withModule(ClientRustModule.Client.customize) { - renderCustomizableOperationSend(codegenContext, generics, this) - } + ).render(rustCrate, emptyList()) rustCrate.withModule(ClientRustModule.client) { AwsFluentClientExtensions(codegenContext, types).render(this) } - val awsSmithyClient = "aws-smithy-client" - rustCrate.mergeFeature(Feature("rustls", default = true, listOf("$awsSmithyClient/rustls"))) + rustCrate.mergeFeature(Feature("rustls", default = true, listOf("aws-smithy-runtime/tls-rustls"))) } override fun libRsCustomizations( @@ -103,26 +83,12 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { baseGenerator.protocolSupport, baseGenerator.operationShape, renderClientCreation = { params -> - rust("let mut ${params.configBuilderName} = ${params.configBuilderName};") - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - // TODO(enableNewSmithyRuntimeLaunch): A builder field could not be accessed directly in the orchestrator - // mode when this code change was made. smithy-rs#2792 will enable us to use getters in builders. - // Make this `set_region` conditional by checking if `config_builder.region().is_none()` once the PR - // has been merged to main. - rust("""${params.configBuilderName}.set_region(Some(crate::config::Region::new("us-east-1")));""") - } else { - rust( - """ - // If the test case was missing endpoint parameters, default a region so it doesn't fail - if ${params.configBuilderName}.region.is_none() { - ${params.configBuilderName}.set_region(Some(crate::config::Region::new("us-east-1"))); - } - """, - ) - } rustTemplate( """ - let config = ${params.configBuilderName}.http_connector(${params.connectorName}).build(); + let mut ${params.configBuilderName} = ${params.configBuilderName}; + ${params.configBuilderName}.set_region(Some(crate::config::Region::new("us-east-1"))); + + let config = ${params.configBuilderName}.http_client(${params.httpClientName}).build(); let ${params.clientName} = #{Client}::from_conf(config); """, "Client" to ClientRustModule.root.toType().resolve("Client"), @@ -134,16 +100,9 @@ class AwsFluentClientDecorator : ClientCodegenDecorator { private class AwsFluentClientExtensions(private val codegenContext: ClientCodegenContext, private val types: Types) { private val codegenScope = arrayOf( "Arc" to RuntimeType.Arc, - "ConnectorError" to types.connectorError, - "ConnectorSettings" to types.connectorSettings, - "DynConnector" to types.dynConnector, - "DynMiddleware" to types.dynMiddleware, "RetryConfig" to types.retryConfig, - "SmithyConnector" to types.smithyConnector, "TimeoutConfig" to types.timeoutConfig, - "SmithyClientBuilder" to types.smithyClientBuilder, "aws_types" to types.awsTypes, - "retry" to types.smithyClientRetry, ) fun render(writer: RustWriter) { @@ -158,75 +117,14 @@ private class AwsFluentClientExtensions(private val codegenContext: ClientCodege /// the `sleep_impl` on the Config passed into this function to fix it. /// - This method will panic if the `sdk_config` is missing an HTTP connector. If you experience this panic, set the /// `http_connector` on the Config passed into this function to fix it. + /// - This method will panic if no `BehaviorVersion` is provided. If you experience this panic, set `behavior_version` on the Config or enable the `behavior-version-latest` Cargo feature. + ##[track_caller] pub fn new(sdk_config: &#{aws_types}::sdk_config::SdkConfig) -> Self { Self::from_conf(sdk_config.into()) } """, *codegenScope, ) - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - /// Creates a new client from the service [`Config`](crate::Config). - /// - /// ## Panics - /// - /// - This method will panic if the `conf` is missing an async sleep implementation. If you experience this panic, set - /// the `sleep_impl` on the Config passed into this function to fix it. - /// - This method will panic if the `conf` is missing an HTTP connector. If you experience this panic, set the - /// `http_connector` on the Config passed into this function to fix it. - pub fn from_conf(conf: crate::Config) -> Self { - let retry_config = conf.retry_config().cloned().unwrap_or_else(#{RetryConfig}::disabled); - let timeout_config = conf.timeout_config().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); - let sleep_impl = conf.sleep_impl(); - if (retry_config.has_retry() || timeout_config.has_timeouts()) && sleep_impl.is_none() { - panic!("An async sleep implementation is required for retries or timeouts to work. \ - Set the `sleep_impl` on the Config passed into this function to fix this panic."); - } - - let connector = conf.http_connector().and_then(|c| { - let timeout_config = conf - .timeout_config() - .cloned() - .unwrap_or_else(#{TimeoutConfig}::disabled); - let connector_settings = #{ConnectorSettings}::from_timeout_config( - &timeout_config, - ); - c.connector(&connector_settings, conf.sleep_impl()) - }); - - let builder = #{SmithyClientBuilder}::new(); - - let builder = match connector { - // Use provided connector - Some(c) => builder.connector(c), - None =>{ - ##[cfg(feature = "rustls")] - { - // Use default connector based on enabled features - builder.dyn_https_connector(#{ConnectorSettings}::from_timeout_config(&timeout_config)) - } - ##[cfg(not(feature = "rustls"))] - { - panic!("No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this."); - } - } - }; - let mut builder = builder - .middleware(#{DynMiddleware}::new(#{Middleware}::new())) - .reconnect_mode(retry_config.reconnect_mode()) - .retry_config(retry_config.into()) - .operation_timeout_config(timeout_config.into()); - builder.set_sleep_impl(sleep_impl); - let client = builder.build(); - - Self { handle: #{Arc}::new(Handle { client, conf }) } - } - """, - *codegenScope, - "Middleware" to codegenContext.runtimeConfig.defaultMiddleware(), - ) - } } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt index ef59287b35d..4d7e3d8bdec 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt @@ -19,29 +19,22 @@ import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.MakeOperationGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.RequestSerializerGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientHttpBoundProtocolPayloadGenerator import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.contextName import software.amazon.smithy.rust.codegen.core.util.cloneOperation import software.amazon.smithy.rust.codegen.core.util.expectTrait -import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rustsdk.AwsRuntimeType.defaultMiddleware import software.amazon.smithy.rustsdk.traits.PresignableTrait import kotlin.streams.toList @@ -99,18 +92,6 @@ class AwsPresigningDecorator internal constructor( override val name: String = "AwsPresigning" override val order: Byte = ORDER - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return if (codegenContext.smithyRuntimeMode.generateMiddleware) { - baseCustomizations + AwsInputPresignedMethod(codegenContext, operation) - } else { - baseCustomizations - } - } - /** * Adds presignable trait to known presignable operations and creates synthetic presignable shapes for codegen */ @@ -141,122 +122,6 @@ class AwsPresigningDecorator internal constructor( } } -// TODO(enableNewSmithyRuntimeCleanup): Delete this class when cleaning up middleware -class AwsInputPresignedMethod( - private val codegenContext: ClientCodegenContext, - private val operationShape: OperationShape, -) : OperationCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - private val symbolProvider = codegenContext.symbolProvider - - private val codegenScope = ( - presigningTypes + listOf( - "PresignedRequestService" to AwsRuntimeType.presigningService() - .resolve("PresignedRequestService"), - "SdkError" to RuntimeType.sdkError(runtimeConfig), - "aws_sigv4" to AwsRuntimeType.awsSigv4(runtimeConfig), - "sig_auth" to AwsRuntimeType.awsSigAuth(runtimeConfig), - "tower" to RuntimeType.Tower, - "Middleware" to runtimeConfig.defaultMiddleware(), - ) - ).toTypedArray() - - override fun section(section: OperationSection): Writable = - writable { - if (section is OperationSection.InputImpl && section.operationShape.hasTrait()) { - writeInputPresignedMethod(section) - } - } - - private fun RustWriter.writeInputPresignedMethod(section: OperationSection.InputImpl) { - val operationError = symbolProvider.symbolForOperationError(operationShape) - val presignableOp = PRESIGNABLE_OPERATIONS.getValue(operationShape.id) - - val makeOperationOp = if (presignableOp.hasModelTransforms()) { - codegenContext.model.expectShape(syntheticShapeId(operationShape.id), OperationShape::class.java) - } else { - section.operationShape - } - val makeOperationFn = "_make_presigned_operation" - - val protocol = section.protocol - MakeOperationGenerator( - codegenContext, - protocol, - ClientHttpBoundProtocolPayloadGenerator(codegenContext, protocol), - // Prefixed with underscore to avoid colliding with modeled functions - functionName = makeOperationFn, - public = false, - includeDefaultPayloadHeaders = false, - ).generateMakeOperation(this, makeOperationOp, section.customizations) - - documentPresignedMethod(hasConfigArg = true) - rustBlockTemplate( - """ - pub async fn presigned( - self, - config: &crate::config::Config, - presigning_config: #{PresigningConfig} - ) -> Result<#{PresignedRequest}, #{SdkError}<#{OpError}>> - """, - *codegenScope, - "OpError" to operationError, - ) { - rustTemplate( - """ - let (mut request, _) = self.$makeOperationFn(config) - .await - .map_err(#{SdkError}::construction_failure)? - .into_request_response(); - """, - *codegenScope, - ) - rustBlock("") { - rustTemplate( - """ - // Change signature type to query params and wire up presigning config - let mut props = request.properties_mut(); - props.insert(#{SharedTimeSource}::new(presigning_config.start_time())); - """, - "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig) - .resolve("time::SharedTimeSource"), - ) - withBlock("props.insert(", ");") { - rustTemplate( - "#{aws_sigv4}::http_request::SignableBody::" + - when (presignableOp.payloadSigningType) { - PayloadSigningType.EMPTY -> "Bytes(b\"\")" - PayloadSigningType.UNSIGNED_PAYLOAD -> "UnsignedPayload" - }, - *codegenScope, - ) - } - rustTemplate( - """ - let config = props.get_mut::<#{sig_auth}::signer::OperationSigningConfig>() - .expect("signing config added by make_operation()"); - config.signature_type = #{sig_auth}::signer::HttpSignatureType::HttpRequestQueryParams; - config.expires_in = Some(presigning_config.expires()); - """, - *codegenScope, - ) - } - rustTemplate( - """ - let middleware = #{Middleware}::default(); - let mut svc = #{tower}::builder::ServiceBuilder::new() - .layer(&middleware) - .service(#{PresignedRequestService}::new()); - - use #{tower}::{Service, ServiceExt}; - Ok(svc.ready().await?.call(request).await?) - """, - *codegenScope, - ) - } - } -} - class AwsPresignedFluentBuilderMethod( private val codegenContext: ClientCodegenContext, ) : FluentClientCustomization() { @@ -283,31 +148,14 @@ class AwsPresignedFluentBuilderMethod( """, *codegenScope, "OpError" to section.operationErrorType, - "RawResponseType" to if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - RuntimeType.smithyHttp(runtimeConfig).resolve("operation::Response") - } else { - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse") - }, + "RawResponseType" to + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::orchestrator::HttpResponse"), ) { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - renderPresignedMethodBodyMiddleware() - } else { - renderPresignedMethodBody(section) - } + renderPresignedMethodBody(section) } } } - private fun RustWriter.renderPresignedMethodBodyMiddleware() { - rustTemplate( - """ - let input = self.inner.build().map_err(#{SdkError}::construction_failure)?; - input.presigned(&self.handle.conf, presigning_config).await - """, - *codegenScope, - ) - } - private fun RustWriter.renderPresignedMethodBody(section: FluentClientSection.FluentBuilderImpl) { val presignableOp = PRESIGNABLE_OPERATIONS.getValue(section.operationShape.id) val operationShape = if (presignableOp.hasModelTransforms()) { @@ -333,48 +181,44 @@ class AwsPresignedFluentBuilderMethod( .await .map_err(|err| { err.map_service_error(|err| { - #{TypedBox}::<#{OperationError}>::assume_from(err.into()) - .expect("correct error type") - .unwrap() + err.downcast::<#{OperationError}>().expect("correct error type") }) })?; let request = context.take_request().expect("request set before transmit"); - Ok(#{PresignedRequest}::new(request.map(|_| ()))) + #{PresignedRequest}::new(request).map_err(#{SdkError}::construction_failure) """, *codegenScope, "Operation" to codegenContext.symbolProvider.toSymbol(section.operationShape), "OperationError" to section.operationErrorType, "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors") + "SharedInterceptor" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors") .resolve("SharedInterceptor"), "SigV4PresigningRuntimePlugin" to AwsRuntimeType.presigningInterceptor(runtimeConfig) .resolve("SigV4PresigningRuntimePlugin"), "StopPoint" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::StopPoint"), - "TypedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypedBox"), "USER_AGENT" to CargoDependency.Http.toType().resolve("header::USER_AGENT"), "alternate_presigning_serializer" to writable { if (presignableOp.hasModelTransforms()) { val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig) rustTemplate( """ - ##[derive(Debug)] + ##[derive(::std::fmt::Debug)] struct AlternatePresigningSerializerRuntimePlugin; impl #{RuntimePlugin} for AlternatePresigningSerializerRuntimePlugin { - fn config(&self) -> Option<#{FrozenLayer}> { - use #{ConfigBagAccessors}; + fn config(&self) -> #{Option}<#{FrozenLayer}> { let mut cfg = #{Layer}::new("presigning_serializer"); - cfg.set_request_serializer(#{SharedRequestSerializer}::new(#{AlternateSerializer})); - Some(cfg.freeze()) + cfg.store_put(#{SharedRequestSerializer}::new(#{AlternateSerializer})); + #{Some}(cfg.freeze()) } } """, + *preludeScope, "AlternateSerializer" to alternateSerializer(operationShape), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "Layer" to smithyTypes.resolve("config_bag::Layer"), "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), - "SharedRequestSerializer" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) - .resolve("client::orchestrator::SharedRequestSerializer"), + "SharedRequestSerializer" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) + .resolve("client::ser_de::SharedRequestSerializer"), ) } }, @@ -501,6 +345,9 @@ private fun RustWriter.documentPresignedMethod(hasConfigArg: Boolean) { Presigned requests can be given to other users or applications to access a resource or perform an operation without having access to the AWS security credentials. + + _Important:_ If you're using credentials that can expire, such as those from STS AssumeRole or SSO, then + the presigned request can only be valid for as long as the credentials used to create it are. """, ) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt index 0b496ce2c9b..b08e8e495e3 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt @@ -19,7 +19,7 @@ class AwsRequestIdDecorator : BaseRequestIdDecorator() { override val accessorFunctionName: String = "request_id" private fun requestIdModule(codegenContext: ClientCodegenContext): RuntimeType = - AwsRuntimeType.awsHttp(codegenContext.runtimeConfig).resolve("request_id") + AwsRuntimeType.awsTypes(codegenContext.runtimeConfig).resolve("request_id") override fun accessorTrait(codegenContext: ClientCodegenContext): RuntimeType = requestIdModule(codegenContext).resolve("RequestId") diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt index ec7e0ba3d0a..9fea90bf893 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt @@ -5,7 +5,6 @@ package software.amazon.smithy.rustsdk -import software.amazon.smithy.codegen.core.CodegenException import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.Visibility import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig @@ -14,16 +13,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import java.io.File import java.nio.file.Path -fun defaultSdkVersion(): String { - // generated as part of the build, see codegen/build.gradle.kts - try { - return object {}.javaClass.getResource("sdk-crate-version.txt")?.readText() - ?: throw CodegenException("sdk-crate-version.txt does not exist") - } catch (ex: Exception) { - throw CodegenException("failed to load sdk-crate-version.txt which sets the default client-runtime version", ex) - } -} - fun RuntimeConfig.awsRoot(): RuntimeCrateLocation { val updatedPath = runtimeCrateLocation.path?.let { cratePath -> val asPath = Path.of(cratePath) @@ -49,38 +38,16 @@ object AwsRuntimeType { "presigning_interceptors", visibility = Visibility.PUBCRATE, AwsCargoDependency.awsSigv4(runtimeConfig), - CargoDependency.smithyRuntimeApi(runtimeConfig), + CargoDependency.smithyRuntimeApiClient(runtimeConfig), ), ) - // TODO(enableNewSmithyRuntimeCleanup): Delete the `presigning_service.rs` inlineable when cleaning up middleware - fun presigningService(): RuntimeType = - RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("presigning_service", visibility = Visibility.PUBCRATE)) - - // TODO(enableNewSmithyRuntimeCleanup): Delete defaultMiddleware and middleware.rs, and remove tower dependency from inlinables, when cleaning up middleware - fun RuntimeConfig.defaultMiddleware() = RuntimeType.forInlineDependency( - InlineAwsDependency.forRustFile( - "middleware", visibility = Visibility.PUBLIC, - CargoDependency.smithyHttp(this), - CargoDependency.smithyHttpTower(this), - CargoDependency.smithyClient(this), - CargoDependency.Tower, - AwsCargoDependency.awsSigAuth(this), - AwsCargoDependency.awsHttp(this), - AwsCargoDependency.awsEndpoint(this), - ), - ).resolve("DefaultMiddleware") - fun awsCredentialTypes(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsCredentialTypes(runtimeConfig).toType() fun awsCredentialTypesTestUtil(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsCredentialTypes(runtimeConfig).toDevDependency().withFeature("test-util").toType() - fun awsEndpoint(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsEndpoint(runtimeConfig).toType() fun awsHttp(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsHttp(runtimeConfig).toType() - fun awsSigAuth(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsSigAuth(runtimeConfig).toType() - fun awsSigAuthEventStream(runtimeConfig: RuntimeConfig) = - AwsCargoDependency.awsSigAuthEventStream(runtimeConfig).toType() fun awsSigv4(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsSigv4(runtimeConfig).toType() fun awsTypes(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsTypes(runtimeConfig).toType() diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt index 9b8adeddabe..96d61b4f9f3 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt @@ -5,7 +5,9 @@ package software.amazon.smithy.rustsdk +import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator @@ -19,6 +21,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderSection @@ -26,6 +29,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCusto import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSection import software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplSection +import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait import software.amazon.smithy.rust.codegen.core.util.hasTrait @@ -72,6 +76,10 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { } } + open fun asMemberShape(container: StructureShape): MemberShape? { + return container.members().firstOrNull { member -> member.memberName.lowercase() == "requestid" } + } + private inner class RequestIdOperationCustomization(private val codegenContext: ClientCodegenContext) : OperationCustomization() { override fun section(section: OperationSection): Writable = writable { @@ -82,12 +90,14 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { "apply_to_error" to applyToError(codegenContext), ) } + is OperationSection.MutateOutput -> { rust( "output._set_$fieldName(#T::$accessorFunctionName(${section.responseHeadersName}).map(str::to_string));", accessorTrait(codegenContext), ) } + is OperationSection.BeforeParseResponse -> { rustTemplate( "#{tracing}::debug!($fieldName = ?#{trait}::$accessorFunctionName(${section.responseName}));", @@ -95,6 +105,7 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { "trait" to accessorTrait(codegenContext), ) } + else -> {} } } @@ -123,10 +134,19 @@ abstract class BaseRequestIdDecorator : ClientCodegenDecorator { rustBlock("fn $accessorFunctionName(&self) -> Option<&str>") { rustBlock("match self") { section.allErrors.forEach { error -> + val optional = asMemberShape(error)?.let { member -> + codegenContext.symbolProvider.toSymbol(member).isOptional() + } ?: true + val wrapped = writable { + when (optional) { + false -> rustTemplate("#{Some}(e.$accessorFunctionName())", *preludeScope) + true -> rustTemplate("e.$accessorFunctionName()") + } + } val sym = codegenContext.symbolProvider.toSymbol(error) - rust("Self::${sym.name}(e) => e.$accessorFunctionName(),") + rust("Self::${sym.name}(e) => #T,", wrapped) } - rust("Self::Unhandled(e) => e.$accessorFunctionName(),") + rust("Self::Unhandled(e) => e.meta.$accessorFunctionName(),") } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt deleted file mode 100644 index b31c5329ea9..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialCaches.kt +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization -import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization - -class CredentialsCacheDecorator : ClientCodegenDecorator { - override val name: String = "CredentialsCache" - override val order: Byte = 0 - override fun configCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List { - return baseCustomizations + CredentialCacheConfig(codegenContext) - } - - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations + CredentialsCacheFeature(codegenContext.runtimeConfig) - } - - override fun extraSections(codegenContext: ClientCodegenContext): List = - listOf( - adhocCustomization { section -> - rust("${section.serviceConfigBuilder}.set_credentials_cache(${section.sdkConfig}.credentials_cache().cloned());") - }, - ) -} - -/** - * Add a `.credentials_cache` field and builder to the `Config` for a given service - */ -class CredentialCacheConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode - private val codegenScope = arrayOf( - *preludeScope, - "CredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("cache::CredentialsCache"), - "DefaultProvider" to defaultProvider(), - "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), - "SharedCredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("cache::SharedCredentialsCache"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("provider::SharedCredentialsProvider"), - ) - - override fun section(section: ServiceConfig) = writable { - when (section) { - ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { - rustTemplate( - """pub(crate) credentials_cache: #{SharedCredentialsCache},""", - *codegenScope, - ) - } - } - - ServiceConfig.ConfigImpl -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Returns the credentials cache. - pub fn credentials_cache(&self) -> #{Option}<#{SharedCredentialsCache}> { - self.inner.load::<#{SharedCredentialsCache}>().cloned() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns the credentials cache. - pub fn credentials_cache(&self) -> #{SharedCredentialsCache} { - self.credentials_cache.clone() - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderStruct -> - if (runtimeMode.defaultToMiddleware) { - rustTemplate("credentials_cache: #{Option}<#{CredentialsCache}>,", *codegenScope) - } - - ServiceConfig.BuilderImpl -> { - rustTemplate( - """ - /// Sets the credentials cache for this service - pub fn credentials_cache(mut self, credentials_cache: #{CredentialsCache}) -> Self { - self.set_credentials_cache(#{Some}(credentials_cache)); - self - } - - """, - *codegenScope, - ) - - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Sets the credentials cache for this service - pub fn set_credentials_cache(&mut self, credentials_cache: #{Option}<#{CredentialsCache}>) -> &mut Self { - self.inner.store_or_unset(credentials_cache); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the credentials cache for this service - pub fn set_credentials_cache(&mut self, credentials_cache: Option<#{CredentialsCache}>) -> &mut Self { - self.credentials_cache = credentials_cache; - self - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - if let Some(credentials_provider) = layer.load::<#{SharedCredentialsProvider}>().cloned() { - let cache_config = layer.load::<#{CredentialsCache}>().cloned() - .unwrap_or_else({ - let sleep = layer.load::<#{SharedAsyncSleep}>().cloned(); - || match sleep { - Some(sleep) => { - #{CredentialsCache}::lazy_builder() - .sleep(sleep) - .into_credentials_cache() - } - None => #{CredentialsCache}::lazy(), - } - }); - let shared_credentials_cache = cache_config.create_cache(credentials_provider); - layer.store_put(shared_credentials_cache); - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - credentials_cache: self - .credentials_cache - .unwrap_or_else({ - let sleep = self.sleep_impl.clone(); - || match sleep { - Some(sleep) => { - #{CredentialsCache}::lazy_builder() - .sleep(sleep) - .into_credentials_cache() - } - None => #{CredentialsCache}::lazy(), - } - }) - .create_cache( - self.credentials_provider.unwrap_or_else(|| { - #{SharedCredentialsProvider}::new(#{DefaultProvider}) - }) - ), - """, - *codegenScope, - ) - } - } - - is ServiceConfig.OperationConfigOverride -> { - rustTemplate( - """ - match ( - layer - .load::<#{CredentialsCache}>() - .cloned(), - layer - .load::<#{SharedCredentialsProvider}>() - .cloned(), - ) { - (#{None}, #{None}) => {} - (#{None}, _) => { - panic!("also specify `.credentials_cache` when overriding credentials provider for the operation"); - } - (_, #{None}) => { - panic!("also specify `.credentials_provider` when overriding credentials cache for the operation"); - } - ( - #{Some}(credentials_cache), - #{Some}(credentials_provider), - ) => { - layer.store_put(credentials_cache.create_cache(credentials_provider)); - } - } - """, - *codegenScope, - ) - } - - else -> emptySection - } - } -} - -class CredentialsCacheFeature(private val runtimeConfig: RuntimeConfig) : OperationCustomization() { - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - rust( - """ - #T(&mut ${section.request}.properties_mut(), ${section.config}.credentials_cache.clone()); - """, - setCredentialsCache(runtimeConfig), - ) - } - - else -> emptySection - } - } -} - -fun setCredentialsCache(runtimeConfig: RuntimeConfig) = - AwsRuntimeType.awsHttp(runtimeConfig).resolve("auth::set_credentials_cache") diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt index f73d1f84831..331babe611a 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProviders.kt @@ -7,36 +7,26 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.featureGateBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization -import software.amazon.smithy.rust.codegen.core.util.letIf class CredentialsProviderDecorator : ClientCodegenDecorator { override val name: String = "CredentialsProvider" override val order: Byte = 0 - override fun serviceRuntimePluginCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(CredentialsIdentityResolverRegistration(codegenContext)) - } - override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, @@ -66,24 +56,41 @@ class CredentialsProviderDecorator : ClientCodegenDecorator { /** * Add a `.credentials_provider` field and builder to the `Config` for a given service */ -class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { - private val smithyRuntimeMode = codegenContext.smithyRuntimeMode +class CredentialProviderConfig(private val codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( *preludeScope, - "Credentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials"), - "ProvideCredentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("provider::ProvideCredentials"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("provider::SharedCredentialsProvider"), + "Credentials" to configReexport(AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials")), + "ProvideCredentials" to configReexport( + AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::ProvideCredentials"), + ), + "SharedCredentialsProvider" to configReexport( + AwsRuntimeType.awsCredentialTypes(runtimeConfig) + .resolve("provider::SharedCredentialsProvider"), + ), + "SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("auth::sigv4a::SCHEME_ID"), + "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) + .resolve("auth::sigv4::SCHEME_ID"), "TestCredentials" to AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig).resolve("Credentials"), ) override fun section(section: ServiceConfig) = writable { when (section) { - ServiceConfig.BuilderStruct -> { - if (smithyRuntimeMode.defaultToMiddleware) { - rustTemplate("credentials_provider: #{Option}<#{SharedCredentialsProvider}>,", *codegenScope) - } + ServiceConfig.ConfigImpl -> { + rustTemplate( + """ + /// This function was intended to be removed, and has been broken since release-2023-11-15 as it always returns a `None`. Do not use. + ##[deprecated(note = "This function was intended to be removed, and has been broken since release-2023-11-15 as it always returns a `None`. Do not use.")] + pub fn credentials_provider(&self) -> Option<#{SharedCredentialsProvider}> { + #{None} + } + """, + *codegenScope, + ) } + ServiceConfig.BuilderImpl -> { rustTemplate( """ @@ -96,28 +103,33 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus *codegenScope, ) - if (smithyRuntimeMode.defaultToOrchestrator) { - rustTemplate( + rustBlockTemplate( + """ + /// Sets the credentials provider for this service + pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self + """, + *codegenScope, + ) { + rustBlockTemplate( """ - /// Sets the credentials provider for this service - pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self { - self.inner.store_or_unset(credentials_provider); - self - } + if let Some(credentials_provider) = credentials_provider """, *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the credentials provider for this service - pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self { - self.credentials_provider = credentials_provider; - self + ) { + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + featureGateBlock("sigv4a") { + rustTemplate( + "self.runtime_components.set_identity_resolver(#{SIGV4A_SCHEME_ID}, credentials_provider.clone());", + *codegenScope, + ) + } } - """, - *codegenScope, - ) + rustTemplate( + "self.runtime_components.set_identity_resolver(#{SIGV4_SCHEME_ID}, credentials_provider);", + *codegenScope, + ) + } + rust("self") } } @@ -130,38 +142,3 @@ class CredentialProviderConfig(codegenContext: ClientCodegenContext) : ConfigCus } } } - -class CredentialsIdentityResolverRegistration( - codegenContext: ClientCodegenContext, -) : ServiceRuntimePluginCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - - override fun section(section: ServiceRuntimePluginSection): Writable = writable { - when (section) { - is ServiceRuntimePluginSection.AdditionalConfig -> { - rustBlockTemplate("if let Some(credentials_cache) = ${section.serviceConfigName}.credentials_cache()") { - section.registerIdentityResolver(this, runtimeConfig) { - rustTemplate( - """ - #{SIGV4_SCHEME_ID}, - #{SharedIdentityResolver}::new( - #{CredentialsIdentityResolver}::new(credentials_cache), - ), - """, - "SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("auth::sigv4::SCHEME_ID"), - "CredentialsIdentityResolver" to AwsRuntimeType.awsRuntime(runtimeConfig) - .resolve("identity::credentials::CredentialsIdentityResolver"), - "SharedIdentityResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::identity::SharedIdentityResolver"), - ) - } - } - } - else -> {} - } - } -} - -fun defaultProvider() = - RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("no_credentials")).resolve("NoCredentials") diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt index 3cc4783a176..636f1951596 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt @@ -11,8 +11,9 @@ import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.language.EndpointRuleSet -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.language.syntax.parameters.BuiltIns import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -57,7 +58,9 @@ fun ClientCodegenContext.getBuiltIn(builtIn: String): Parameter? { } private fun promotedBuiltins(parameter: Parameter) = - parameter == Builtins.FIPS || parameter == Builtins.DUALSTACK || parameter == Builtins.SDK_ENDPOINT + parameter.builtIn == AwsBuiltIns.FIPS.builtIn || + parameter.builtIn == AwsBuiltIns.DUALSTACK.builtIn || + parameter.builtIn == BuiltIns.SDK_ENDPOINT.builtIn private fun configParamNewtype(parameter: Parameter, name: String, runtimeConfig: RuntimeConfig): RuntimeType { val type = parameter.symbol().mapRustType { t -> t.stripOuter() } @@ -141,19 +144,12 @@ fun decoratorForBuiltIn( override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? = when (parameter.builtIn) { builtIn.builtIn -> writable { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - val newtype = configParamNewtype(parameter, name, codegenContext.runtimeConfig) - val symbol = parameter.symbol().mapRustType { t -> t.stripOuter() } - rustTemplate( - """$configRef.#{load_from_service_config_layer}""", - "load_from_service_config_layer" to loadFromConfigBag(symbol.name, newtype), - ) - } else { - rust("$configRef.$name") - } - if (codegenContext.smithyRuntimeMode.defaultToMiddleware && parameter.type == ParameterType.STRING) { - rust(".clone()") - } + val newtype = configParamNewtype(parameter, name, codegenContext.runtimeConfig) + val symbol = parameter.symbol().mapRustType { t -> t.stripOuter() } + rustTemplate( + """$configRef.#{load_from_service_config_layer}""", + "load_from_service_config_layer" to loadFromConfigBag(symbol.name, newtype), + ) } else -> null @@ -178,7 +174,7 @@ fun decoratorForBuiltIn( private val endpointUrlDocs = writable { rust( """ - /// Sets the endpoint url used to communicate with this service + /// Sets the endpoint URL used to communicate with this service /// Note: this is used in combination with other endpoint rules, e.g. an API that applies a host-label prefix /// will be prefixed onto this URL. To fully override the endpoint resolver, use @@ -200,10 +196,13 @@ fun Node.toWritable(): Writable { val PromotedBuiltInsDecorators = listOf( - decoratorForBuiltIn(Builtins.FIPS), - decoratorForBuiltIn(Builtins.DUALSTACK), + decoratorForBuiltIn(AwsBuiltIns.FIPS), + decoratorForBuiltIn(AwsBuiltIns.DUALSTACK), decoratorForBuiltIn( - Builtins.SDK_ENDPOINT, - ConfigParam.Builder().name("endpoint_url").type(RuntimeType.String.toSymbol()).setterDocs(endpointUrlDocs), + BuiltIns.SDK_ENDPOINT, + ConfigParam.Builder() + .name("endpoint_url") + .type(RuntimeType.String.toSymbol()) + .setterDocs(endpointUrlDocs), ), ).toTypedArray() diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt deleted file mode 100644 index 5be6feefbd3..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomization.kt +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.util.letIf - -// TODO(enableNewSmithyRuntimeCleanup): Delete this decorator since it's now in `codegen-client` -class HttpConnectorDecorator : ClientCodegenDecorator { - override val name: String = "HttpConnectorDecorator" - override val order: Byte = 0 - - override fun configCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.exclusivelyGenerateMiddleware) { - it + HttpConnectorConfigCustomization(codegenContext) - } -} - -class HttpConnectorConfigCustomization( - codegenContext: ClientCodegenContext, -) : ConfigCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode - private val moduleUseName = codegenContext.moduleUseName() - private val codegenScope = arrayOf( - *preludeScope, - "HttpConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::HttpConnector"), - ) - - override fun section(section: ServiceConfig): Writable { - return when (section) { - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) - } - } - is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.inner.load::<#{HttpConnector}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.http_connector.as_ref() - } - """, - *codegenScope, - ) - } - } - is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) - } - } - ServiceConfig.BuilderImpl -> writable { - rustTemplate( - """ - /// Sets the HTTP connector to use when making requests. - /// - /// ## Examples - /// ```no_run - /// ## ##[cfg(test)] - /// ## mod tests { - /// ## ##[test] - /// ## fn example() { - /// use std::time::Duration; - /// use aws_smithy_client::{Client, hyper_ext}; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// use $moduleUseName::config::Config; - /// - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() - /// .with_webpki_roots() - /// .https_only() - /// .enable_http1() - /// .enable_http2() - /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); - /// ## } - /// ## } - /// ``` - pub fn http_connector(mut self, http_connector: impl Into<#{HttpConnector}>) -> Self { - self.set_http_connector(#{Some}(http_connector)); - self - } - - /// Sets the HTTP connector to use when making requests. - /// - /// ## Examples - /// ```no_run - /// ## ##[cfg(test)] - /// ## mod tests { - /// ## ##[test] - /// ## fn example() { - /// use std::time::Duration; - /// use aws_smithy_client::hyper_ext; - /// use aws_smithy_client::http_connector::ConnectorSettings; - /// use crate::sdk_config::{SdkConfig, Builder}; - /// use $moduleUseName::config::{Builder, Config}; - /// - /// fn override_http_connector(builder: &mut Builder) { - /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() - /// .with_webpki_roots() - /// .https_only() - /// .enable_http1() - /// .enable_http2() - /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); - /// builder.set_http_connector(Some(smithy_connector)); - /// } - /// - /// let mut builder = $moduleUseName::Config::builder(); - /// override_http_connector(&mut builder); - /// let config = builder.build(); - /// ## } - /// ## } - /// ``` - """, - *codegenScope, - ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: #{Option}>) -> &mut Self { - http_connector.map(|c| self.inner.store_put(c.into())); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: #{Option}>) -> &mut Self { - self.http_connector = http_connector.map(|inner| inner.into()); - self - } - """, - *codegenScope, - ) - } - } - is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToMiddleware) { - rust("http_connector: self.http_connector,") - } - } - else -> emptySection - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt index 610ad1c579f..f2648ee914c 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt @@ -35,25 +35,11 @@ private fun RuntimeConfig.awsInlineableHttpRequestChecksum() = RuntimeType.forIn CargoDependency.Tracing, CargoDependency.smithyChecksums(this), CargoDependency.smithyHttp(this), - CargoDependency.smithyRuntimeApi(this), + CargoDependency.smithyRuntimeApiClient(this), CargoDependency.smithyTypes(this), ), ) -// TODO(enableNewSmithyRuntimeCleanup): Delete this method -fun RuntimeConfig.awsInlineableBodyWithChecksumMiddleware() = RuntimeType.forInlineDependency( - InlineAwsDependency.forRustFile( - "http_body_checksum_middleware", visibility = Visibility.PUBCRATE, - CargoDependency.Http, - CargoDependency.HttpBody, - CargoDependency.smithyHttp(this), - CargoDependency.smithyChecksums(this), - CargoDependency.smithyTypes(this), - CargoDependency.Bytes, - CargoDependency.Tracing, - ), -) - class HttpRequestChecksumDecorator : ClientCodegenDecorator { override val name: String = "HttpRequestChecksum" override val order: Byte = 0 @@ -80,8 +66,6 @@ private fun HttpChecksumTrait.requestAlgorithmMember( private fun HttpChecksumTrait.checksumAlgorithmToStr( codegenContext: ClientCodegenContext, operationShape: OperationShape, - // TODO(enableNewSmithyRuntimeCleanup): Remove `algorithmWasCloned` (it should always be false) - algorithmWasCloned: Boolean, ): Writable { val runtimeConfig = codegenContext.runtimeConfig val requestAlgorithmMember = this.requestAlgorithmMember(codegenContext, operationShape) @@ -89,11 +73,6 @@ private fun HttpChecksumTrait.checksumAlgorithmToStr( return { if (requestAlgorithmMember != null) { - if (algorithmWasCloned) { - // User may set checksum for requests, and we need to call as_ref before we can convert the algorithm to a &str - rust("let checksum_algorithm = $requestAlgorithmMember.as_ref();") - } - if (isRequestChecksumRequired) { // Checksums are required, fall back to MD5 rust("""let checksum_algorithm = checksum_algorithm.map(|algorithm| algorithm.as_str()).or(Some("md5"));""") @@ -126,7 +105,7 @@ private fun HttpChecksumTrait.checksumAlgorithmToStr( } // This generator was implemented based on this spec: -// https://awslabs.github.io/smithy/1.0/spec/aws/aws-core.html#http-request-checksums +// https://smithy-lang.github.io/smithy/1.0/spec/aws/aws-core.html#http-request-checksums class HttpRequestChecksumCustomization( private val codegenContext: ClientCodegenContext, private val operationShape: OperationShape, @@ -143,7 +122,7 @@ class HttpRequestChecksumCustomization( is OperationSection.AdditionalInterceptors -> { if (requestAlgorithmMember != null) { section.registerInterceptor(runtimeConfig, this) { - val runtimeApi = RuntimeType.smithyRuntimeApi(runtimeConfig) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(runtimeConfig) rustTemplate( """ #{RequestChecksumInterceptor}::new(|input: &#{Input}| { @@ -162,46 +141,11 @@ class HttpRequestChecksumCustomization( "checksum_algorithm_to_str" to checksumTrait.checksumAlgorithmToStr( codegenContext, operationShape, - algorithmWasCloned = false, ), ) } } } - // TODO(enableNewSmithyRuntimeCleanup): Delete `is OperationSection.MutateInput` - is OperationSection.MutateInput -> { - // Various other things will consume the input struct before we can get at the checksum algorithm - // field within it. This ensures that we preserve a copy of it. It's an enum so cloning is cheap. - if (requestAlgorithmMember != null) { - rust("let $requestAlgorithmMember = self.$requestAlgorithmMember().cloned();") - } - } - // TODO(enableNewSmithyRuntimeCleanup): Delete `is OperationSection.MutateRequest` - is OperationSection.MutateRequest -> { - // Return early if no request checksum can be set nor is it required - if (checksumTrait.isRequestChecksumRequired || requestAlgorithmMember != null) { - // `add_checksum_calculation_to_request` handles both streaming and in-memory request bodies. - rustTemplate( - """ - ${section.request} = ${section.request}.augment(|mut req, properties| { - #{checksum_algorithm_to_str:W} - if let Some(checksum_algorithm) = checksum_algorithm { - #{add_checksum_calculation_to_request}(&mut req, properties, checksum_algorithm)?; - } - Result::<_, #{BuildError}>::Ok(req) - })?; - """, - "checksum_algorithm_to_str" to checksumTrait.checksumAlgorithmToStr( - codegenContext, - operationShape, - algorithmWasCloned = true, - ), - "add_checksum_calculation_to_request" to runtimeConfig.awsInlineableBodyWithChecksumMiddleware() - .resolve("add_checksum_calculation_to_request"), - "BuildError" to runtimeConfig.operationBuildError(), - ) - } - } else -> { } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt index 114644daafb..e49e834ddd7 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt @@ -36,7 +36,7 @@ private fun RuntimeConfig.awsInlineableHttpResponseChecksum() = RuntimeType.forI CargoDependency.Tracing, CargoDependency.smithyChecksums(this), CargoDependency.smithyHttp(this), - CargoDependency.smithyRuntimeApi(this), + CargoDependency.smithyRuntimeApiClient(this), CargoDependency.smithyTypes(this), ), ) @@ -89,7 +89,7 @@ class HttpResponseChecksumCustomization( // CRC32, CRC32C, SHA256, SHA1 -> "crc32", "crc32c", "sha256", "sha1" val responseAlgorithms = checksumTrait.responseAlgorithms .map { algorithm -> algorithm.lowercase() }.joinToString(", ") { algorithm -> "\"$algorithm\"" } - val runtimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) rustTemplate( """ #{ResponseChecksumInterceptor}::new( @@ -113,66 +113,6 @@ class HttpResponseChecksumCustomization( ) } } - // TODO(enableNewSmithyRuntimeCleanup): Delete `is OperationSection.MutateRequest` - is OperationSection.MutateRequest -> { - // Otherwise, we need to set a property that the `MutateOutput` section handler will read to know if it - // should checksum validate the response. - rustTemplate( - """ - if let Some($validationModeName) = self.$validationModeName.as_ref() { - let $validationModeName = $validationModeName.clone(); - // Place #{ValidationModeShape} in the property bag so we can check - // it during response deserialization to see if we need to checksum validate - // the response body. - let _ = request.properties_mut().insert($validationModeName); - } - """, - "ValidationModeShape" to codegenContext.symbolProvider.toSymbol(requestValidationModeMemberInner), - ) - } - // TODO(enableNewSmithyRuntimeCleanup): Delete `is OperationSection.MutateOutput` - is OperationSection.MutateOutput -> { - if (!section.propertyBagAvailable) { - return@writable - } - - // CRC32, CRC32C, SHA256, SHA1 -> "crc32", "crc32c", "sha256", "sha1" - val responseAlgorithms = checksumTrait.responseAlgorithms - .map { algorithm -> algorithm.lowercase() }.joinToString(", ") { algorithm -> "\"$algorithm\"" } - - rustTemplate( - """ - let response_algorithms = [$responseAlgorithms].as_slice(); - let $validationModeName = properties.get::<#{ValidationModeShape}>(); - // Per [the spec](https://smithy.io/2.0/aws/aws-core.html##http-response-checksums), - // we check to see if it's the `ENABLED` variant - if matches!($validationModeName, Some(&#{ValidationModeShape}::Enabled)) { - if let Some((checksum_algorithm, precalculated_checksum)) = - #{check_headers_for_precalculated_checksum}( - response.headers(), - response_algorithms, - ) - { - let bytestream = output.body.take().map(|bytestream| { - bytestream.map(move |sdk_body| { - #{wrap_body_with_checksum_validator}( - sdk_body, - checksum_algorithm, - precalculated_checksum.clone(), - ) - }) - }); - output = output.set_body(bytestream); - } - } - """, - "ValidationModeShape" to codegenContext.symbolProvider.toSymbol(requestValidationModeMemberInner), - "wrap_body_with_checksum_validator" to codegenContext.runtimeConfig.awsInlineableBodyWithChecksumMiddleware() - .resolve("wrap_body_with_checksum_validator"), - "check_headers_for_precalculated_checksum" to codegenContext.runtimeConfig.awsInlineableBodyWithChecksumMiddleware() - .resolve("check_headers_for_precalculated_checksum"), - ) - } else -> {} } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt index 8bdfe0cdc13..ad1224546aa 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt @@ -27,14 +27,16 @@ import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Compani import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingAppender import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingSubscriber import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingTest +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyProtocolTestHelpers import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntime -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApi +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApiTestUtil import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection import software.amazon.smithy.rust.codegen.core.testutil.testDependenciesOnly +import software.amazon.smithy.rustsdk.AwsCargoDependency.awsRuntime import java.nio.file.Files import java.nio.file.Paths import kotlin.io.path.absolute @@ -80,26 +82,21 @@ class IntegrationTestDependencies( override fun section(section: LibRsSection) = when (section) { is LibRsSection.Body -> testDependenciesOnly { if (hasTests) { - val smithyClient = CargoDependency.smithyClient(codegenContext.runtimeConfig) - .copy(features = setOf("test-util"), scope = DependencyScope.Dev) val smithyAsync = CargoDependency.smithyAsync(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) val smithyTypes = CargoDependency.smithyTypes(codegenContext.runtimeConfig) .copy(features = setOf("test-util"), scope = DependencyScope.Dev) - addDependency(smithyClient) + addDependency(awsRuntime(runtimeConfig).toDevDependency().withFeature("test-util")) + addDependency(FuturesUtil) + addDependency(SerdeJson) addDependency(smithyAsync) + addDependency(smithyProtocolTestHelpers(codegenContext.runtimeConfig)) + addDependency(smithyRuntime(runtimeConfig).copy(features = setOf("test-util", "wire-mock"), scope = DependencyScope.Dev)) + addDependency(smithyRuntimeApiTestUtil(runtimeConfig)) addDependency(smithyTypes) - addDependency(CargoDependency.smithyProtocolTestHelpers(codegenContext.runtimeConfig)) - addDependency(SerdeJson) addDependency(Tokio) - addDependency(FuturesUtil) addDependency(Tracing.toDevDependency()) addDependency(TracingSubscriber) - - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - addDependency(smithyRuntime(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) - addDependency(smithyRuntimeApi(runtimeConfig).copy(features = setOf("test-util"), scope = DependencyScope.Dev)) - } } if (hasBenches) { addDependency(Criterion) @@ -142,18 +139,12 @@ class S3TestDependencies(private val codegenContext: ClientCodegenContext) : Lib addDependency(AsyncStd) addDependency(BytesUtils.toDevDependency()) addDependency(FastRand.toDevDependency()) + addDependency(FuturesUtil.toDevDependency()) addDependency(HdrHistogram) addDependency(HttpBody.toDevDependency()) addDependency(Smol) addDependency(TempFile) addDependency(TracingAppender) addDependency(TracingTest) - - // TODO(enableNewSmithyRuntimeCleanup): These additional dependencies may not be needed anymore when removing this flag - // depending on if the sra-test is kept around or not. - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - addDependency(CargoDependency.smithyRuntime(codegenContext.runtimeConfig).toDevDependency()) - addDependency(CargoDependency.smithyRuntimeApi(codegenContext.runtimeConfig).toDevDependency()) - } } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt index 71c9d9ff62f..def448bd55d 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt @@ -9,21 +9,29 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.letIf +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope class InvocationIdDecorator : ClientCodegenDecorator { override val name: String get() = "InvocationIdDecorator" override val order: Byte get() = 0 + override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(InvocationIdRuntimePluginCustomization(codegenContext)) - } + baseCustomizations + InvocationIdRuntimePluginCustomization(codegenContext) + + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List = + baseCustomizations + InvocationIdConfigCustomization(codegenContext) } private class InvocationIdRuntimePluginCustomization( @@ -36,10 +44,68 @@ private class InvocationIdRuntimePluginCustomization( ) override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { - section.registerInterceptor(codegenContext.runtimeConfig, this) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { + section.registerInterceptor(this) { rustTemplate("#{InvocationIdInterceptor}::new()", *codegenScope) } } } } + +const val GENERATOR_DOCS: String = + "The invocation ID generator generates ID values for the `amz-sdk-invocation-id` header. " + + "By default, this will be a random UUID. Overriding it may be useful in tests that " + + "examine the HTTP request and need to be deterministic." + +private class InvocationIdConfigCustomization( + codegenContext: ClientCodegenContext, +) : ConfigCustomization() { + private val awsRuntime = AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) + private val codegenScope = arrayOf( + *preludeScope, + "InvocationIdGenerator" to awsRuntime.resolve("invocation_id::InvocationIdGenerator"), + "SharedInvocationIdGenerator" to awsRuntime.resolve("invocation_id::SharedInvocationIdGenerator"), + ) + + override fun section(section: ServiceConfig): Writable = writable { + when (section) { + is ServiceConfig.BuilderImpl -> { + docs("Overrides the default invocation ID generator.\n\n$GENERATOR_DOCS") + rustTemplate( + """ + pub fn invocation_id_generator(mut self, gen: impl #{InvocationIdGenerator} + 'static) -> Self { + self.set_invocation_id_generator(#{Some}(#{SharedInvocationIdGenerator}::new(gen))); + self + } + """, + *codegenScope, + ) + + docs("Overrides the default invocation ID generator.\n\n$GENERATOR_DOCS") + rustTemplate( + """ + pub fn set_invocation_id_generator(&mut self, gen: #{Option}<#{SharedInvocationIdGenerator}>) -> &mut Self { + self.config.store_or_unset(gen); + self + } + """, + *codegenScope, + ) + } + + is ServiceConfig.ConfigImpl -> { + docs("Returns the invocation ID generator if one was given in config.\n\n$GENERATOR_DOCS") + rustTemplate( + """ + pub fn invocation_id_generator(&self) -> #{Option}<#{SharedInvocationIdGenerator}> { + self.config.load::<#{SharedInvocationIdGenerator}>().cloned() + } + """, + *codegenScope, + ) + } + + else -> {} + } + } +} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt index 509be8d2952..5809d8b4b39 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRunti import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.letIf class RecursionDetectionDecorator : ClientCodegenDecorator { override val name: String get() = "RecursionDetectionDecorator" @@ -22,17 +21,15 @@ class RecursionDetectionDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(RecursionDetectionRuntimePluginCustomization(codegenContext)) - } + baseCustomizations + RecursionDetectionRuntimePluginCustomization(codegenContext) } private class RecursionDetectionRuntimePluginCustomization( private val codegenContext: ClientCodegenContext, ) : ServiceRuntimePluginCustomization() { override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { - section.registerInterceptor(codegenContext.runtimeConfig, this) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { + section.registerInterceptor(this) { rust( "#T::new()", AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt index 494a08f8edc..4e77e1c49b6 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt @@ -5,16 +5,15 @@ package software.amazon.smithy.rustsdk +import software.amazon.smithy.aws.traits.auth.SigV4Trait +import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.node.Node -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -23,7 +22,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization import software.amazon.smithy.rust.codegen.core.util.dq @@ -82,7 +80,11 @@ class RegionDecorator : ClientCodegenDecorator { override val name: String = "Region" override val order: Byte = 0 - private fun usesRegion(codegenContext: ClientCodegenContext) = codegenContext.getBuiltIn(Builtins.REGION) != null + // Services that have an endpoint ruleset that references the SDK::Region built in, or + // that use SigV4, both need a configurable region. + private fun usesRegion(codegenContext: ClientCodegenContext) = + codegenContext.getBuiltIn(AwsBuiltIns.REGION) != null || ServiceIndex.of(codegenContext.model) + .getEffectiveAuthSchemes(codegenContext.serviceShape).containsKey(SigV4Trait.ID) override fun configCustomizations( codegenContext: ClientCodegenContext, @@ -93,14 +95,6 @@ class RegionDecorator : ClientCodegenDecorator { } } - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations.extendIf(usesRegion(codegenContext)) { RegionConfigPlugin() } - } - override fun extraSections(codegenContext: ClientCodegenContext): List { return usesRegion(codegenContext).thenSingletonListOf { adhocCustomization { section -> @@ -114,14 +108,6 @@ class RegionDecorator : ClientCodegenDecorator { } } - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - if (usesRegion(codegenContext)) { - rustCrate.withModule(ClientRustModule.config) { - rust("pub use #T::Region;", region(codegenContext.runtimeConfig)) - } - } - } - override fun endpointCustomizations(codegenContext: ClientCodegenContext): List { if (!usesRegion(codegenContext)) { return listOf() @@ -130,22 +116,19 @@ class RegionDecorator : ClientCodegenDecorator { object : EndpointCustomization { override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? { return when (parameter.builtIn) { - Builtins.REGION.builtIn -> writable { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - rustTemplate( - "$configRef.load::<#{Region}>().map(|r|r.as_ref().to_owned())", - "Region" to region(codegenContext.runtimeConfig).resolve("Region"), - ) - } else { - rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") - } + AwsBuiltIns.REGION.builtIn -> writable { + rustTemplate( + "$configRef.load::<#{Region}>().map(|r|r.as_ref().to_owned())", + "Region" to region(codegenContext.runtimeConfig).resolve("Region"), + ) } + else -> null } } override fun setBuiltInOnServiceConfig(name: String, value: Node, configBuilderRef: String): Writable? { - if (name != Builtins.REGION.builtIn.get()) { + if (name != AwsBuiltIns.REGION.builtIn.get()) { return null } return writable { @@ -163,46 +146,23 @@ class RegionDecorator : ClientCodegenDecorator { class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val region = region(codegenContext.runtimeConfig) private val moduleUseName = codegenContext.moduleUseName() - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, - "Region" to region.resolve("Region"), + "Region" to configReexport(region.resolve("Region")), ) + override fun section(section: ServiceConfig) = writable { when (section) { - ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("pub(crate) region: #{Option}<#{Region}>,", *codegenScope) - } - } ServiceConfig.ConfigImpl -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Returns the AWS region, if it was provided. - pub fn region(&self) -> #{Option}<&#{Region}> { - self.inner.load::<#{Region}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns the AWS region, if it was provided. - pub fn region(&self) -> #{Option}<&#{Region}> { - self.region.as_ref() - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderStruct -> { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("pub(crate) region: #{Option}<#{Region}>,", *codegenScope) - } + rustTemplate( + """ + /// Returns the AWS region, if it was provided. + pub fn region(&self) -> #{Option}<&#{Region}> { + self.config.load::<#{Region}>() + } + """, + *codegenScope, + ) } ServiceConfig.BuilderImpl -> { @@ -227,53 +187,15 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Sets the AWS region to use when making requests. - pub fn set_region(&mut self, region: #{Option}<#{Region}>) -> &mut Self { - self.inner.store_or_unset(region); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the AWS region to use when making requests. - pub fn set_region(&mut self, region: #{Option}<#{Region}>) -> &mut Self { - self.region = region; - self - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToMiddleware) { - rust("region: self.region,") - } - } - - else -> emptySection - } - } -} - -class RegionConfigPlugin : OperationCustomization() { - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - // Allow the region to be late-inserted via another method - rust( + rustTemplate( """ - if let Some(region) = &${section.config}.region { - ${section.request}.properties_mut().insert(region.clone()); + /// Sets the AWS region to use when making requests. + pub fn set_region(&mut self, region: #{Option}<#{Region}>) -> &mut Self { + self.config.store_or_unset(region); + self } """, + *codegenScope, ) } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt index 16f0644496d..6b3c0185e34 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt @@ -10,12 +10,8 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.letIf class RetryClassifierDecorator : ClientCodegenDecorator { override val name: String = "RetryPolicy" @@ -25,66 +21,26 @@ class RetryClassifierDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, operation: OperationShape, baseCustomizations: List, - ): List = - (baseCustomizations + RetryClassifierFeature(codegenContext.runtimeConfig)).letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + OperationRetryClassifiersFeature( - codegenContext, - operation, - ) - } -} - -class RetryClassifierFeature(private val runtimeConfig: RuntimeConfig) : OperationCustomization() { - override fun retryType(): RuntimeType = - AwsRuntimeType.awsHttp(runtimeConfig).resolve("retry::AwsResponseRetryClassifier") - - override fun section(section: OperationSection) = when (section) { - is OperationSection.FinalizeOperation -> writable { - rust( - "let ${section.operation} = ${section.operation}.with_retry_classifier(#T::new());", - retryType(), - ) - } - - else -> emptySection - } + ): List = baseCustomizations + + OperationRetryClassifiersFeature(codegenContext, operation) } class OperationRetryClassifiersFeature( codegenContext: ClientCodegenContext, - operation: OperationShape, + val operation: OperationShape, ) : OperationCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) - private val smithyRuntime = RuntimeType.smithyRuntime(runtimeConfig) - private val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(runtimeConfig) - private val codegenScope = arrayOf( - // Classifiers - "SmithyErrorClassifier" to smithyRuntime.resolve("client::retries::classifier::SmithyErrorClassifier"), - "AmzRetryAfterHeaderClassifier" to awsRuntime.resolve("retries::classifier::AmzRetryAfterHeaderClassifier"), - "ModeledAsRetryableClassifier" to smithyRuntime.resolve("client::retries::classifier::ModeledAsRetryableClassifier"), - "AwsErrorCodeClassifier" to awsRuntime.resolve("retries::classifier::AwsErrorCodeClassifier"), - "HttpStatusCodeClassifier" to smithyRuntime.resolve("client::retries::classifier::HttpStatusCodeClassifier"), - // Other Types - "ClassifyRetry" to smithyRuntimeApi.resolve("client::retries::ClassifyRetry"), - "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "OperationError" to codegenContext.symbolProvider.symbolForOperationError(operation), - "OrchestratorError" to smithyRuntimeApi.resolve("client::orchestrator::OrchestratorError"), - "RetryReason" to smithyRuntimeApi.resolve("client::retries::RetryReason"), - ) + private val symbolProvider = codegenContext.symbolProvider override fun section(section: OperationSection) = when (section) { - is OperationSection.RetryClassifier -> writable { - rustTemplate( - """ - .with_classifier(#{SmithyErrorClassifier}::<#{OperationError}>::new()) - .with_classifier(#{AmzRetryAfterHeaderClassifier}) - .with_classifier(#{ModeledAsRetryableClassifier}::<#{OperationError}>::new()) - .with_classifier(#{AwsErrorCodeClassifier}::<#{OperationError}>::new()) - .with_classifier(#{HttpStatusCodeClassifier}::default()) - """, - *codegenScope, - ) + is OperationSection.RetryClassifiers -> writable { + section.registerRetryClassifier(this) { + rustTemplate( + "#{AwsErrorCodeClassifier}::<#{OperationError}>::new()", + "AwsErrorCodeClassifier" to AwsRuntimeType.awsRuntime(runtimeConfig).resolve("retries::classifiers::AwsErrorCodeClassifier"), + "OperationError" to symbolProvider.symbolForOperationError(operation), + ) + } } else -> emptySection diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt index 77185e06675..2a354327f60 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt @@ -12,8 +12,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRunti import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.letIf class RetryInformationHeaderDecorator : ClientCodegenDecorator { override val name: String = "RetryInformationHeader" @@ -23,29 +21,26 @@ class RetryInformationHeaderDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(AddRetryInformationHeaderInterceptors(codegenContext)) - } + baseCustomizations + listOf(AddRetryInformationHeaderInterceptors(codegenContext)) } private class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val smithyRuntime = RuntimeType.smithyRuntime(runtimeConfig) private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { // Track the latency between client and server. - section.registerInterceptor(runtimeConfig, this) { + section.registerInterceptor(this) { rust( "#T::new()", - smithyRuntime.resolve("client::orchestrator::interceptors::ServiceClockSkewInterceptor"), + awsRuntime.resolve("service_clock_skew::ServiceClockSkewInterceptor"), ) } // Add request metadata to outgoing requests. Sets a header. - section.registerInterceptor(runtimeConfig, this) { + section.registerInterceptor(this) { rust("#T::new()", awsRuntime.resolve("request_info::RequestInfoInterceptor")) } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt index f3277d06d3e..69a1299d738 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt @@ -76,8 +76,17 @@ class GenericSmithySdkConfigSettings : ClientCodegenDecorator { ${section.serviceConfigBuilder}.set_timeout_config(${section.sdkConfig}.timeout_config().cloned()); ${section.serviceConfigBuilder}.set_sleep_impl(${section.sdkConfig}.sleep_impl()); - ${section.serviceConfigBuilder}.set_http_connector(${section.sdkConfig}.http_connector().cloned()); + ${section.serviceConfigBuilder}.set_http_client(${section.sdkConfig}.http_client()); ${section.serviceConfigBuilder}.set_time_source(${section.sdkConfig}.time_source()); + ${section.serviceConfigBuilder}.set_behavior_version(${section.sdkConfig}.behavior_version()); + // setting `None` here removes the default + if let Some(config) = ${section.sdkConfig}.stalled_stream_protection() { + ${section.serviceConfigBuilder}.set_stalled_stream_protection(Some(config)); + } + + if let Some(cache) = ${section.sdkConfig}.identity_cache() { + ${section.serviceConfigBuilder}.set_identity_cache(cache); + } """, ) }, @@ -105,6 +114,7 @@ class SdkConfigDecorator : ClientCodegenDecorator { val codegenScope = arrayOf( "SdkConfig" to AwsRuntimeType.awsTypes(codegenContext.runtimeConfig).resolve("sdk_config::SdkConfig"), ) + rustCrate.withModule(ClientRustModule.config) { rustTemplate( """ diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt index 7d469b4d989..a6a0bc7b80e 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt @@ -9,57 +9,144 @@ import software.amazon.smithy.aws.traits.auth.SigV4Trait import software.amazon.smithy.aws.traits.auth.UnsignedPayloadTrait import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig +import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.featureGateBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RustCrate +import software.amazon.smithy.rust.codegen.core.util.dq +import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.isInputEventStream -import software.amazon.smithy.rust.codegen.core.util.letIf +import software.amazon.smithy.rust.codegen.core.util.thenSingletonListOf class SigV4AuthDecorator : ClientCodegenDecorator { override val name: String get() = "SigV4AuthDecorator" override val order: Byte = 0 + private val sigv4a = "sigv4a" + + private fun sigv4(runtimeConfig: RuntimeConfig) = writable { + val awsRuntimeAuthModule = AwsRuntimeType.awsRuntime(runtimeConfig).resolve("auth") + rust("#T", awsRuntimeAuthModule.resolve("sigv4::SCHEME_ID")) + } + + private fun sigv4a(runtimeConfig: RuntimeConfig) = writable { + val awsRuntimeAuthModule = AwsRuntimeType.awsRuntime(runtimeConfig).resolve("auth") + featureGateBlock(sigv4a) { + rust("#T", awsRuntimeAuthModule.resolve("sigv4a::SCHEME_ID")) + } + } + override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, - baseAuthOptions: List, - ): List = baseAuthOptions.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + AuthOption.StaticAuthOption(SigV4Trait.ID) { - rustTemplate( - "#{scheme_id},", - "scheme_id" to AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig) - .resolve("auth::sigv4::SCHEME_ID"), - ) - } + baseAuthSchemeOptions: List, + ): List { + val supportsSigV4a = codegenContext.serviceShape.supportedAuthSchemes().contains(sigv4a) + .thenSingletonListOf { sigv4a(codegenContext.runtimeConfig) } + return baseAuthSchemeOptions + AuthSchemeOption.StaticAuthSchemeOption( + SigV4Trait.ID, + listOf(sigv4(codegenContext.runtimeConfig)) + supportsSigV4a, + ) } override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(AuthServiceRuntimePluginCustomization(codegenContext)) - } + baseCustomizations + listOf(AuthServiceRuntimePluginCustomization(codegenContext)) override fun operationCustomizations( codegenContext: ClientCodegenContext, operation: OperationShape, baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(AuthOperationCustomization(codegenContext)) + ): List = baseCustomizations + AuthOperationCustomization(codegenContext) + + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List = + baseCustomizations + SigV4SigningConfig(codegenContext.runtimeConfig, codegenContext.serviceShape.getTrait()) + + override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + // Add optional feature for SigV4a support + rustCrate.mergeFeature(Feature("sigv4a", true, listOf("aws-runtime/sigv4a"))) } + } +} + +private class SigV4SigningConfig( + runtimeConfig: RuntimeConfig, + private val sigV4Trait: SigV4Trait?, +) : ConfigCustomization() { + private val codegenScope = arrayOf( + "Region" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::Region"), + "SigningName" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningName"), + "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), + ) + + override fun section(section: ServiceConfig): Writable = writable { + if (sigV4Trait != null) { + when (section) { + ServiceConfig.ConfigImpl -> { + rust( + """ + /// The signature version 4 service signing name to use in the credential scope when signing requests. + /// + /// The signing service may be overridden by the `Endpoint`, or by specifying a custom + /// [`SigningName`](aws_types::SigningName) during operation construction + pub fn signing_name(&self) -> &'static str { + ${sigV4Trait.name.dq()} + } + """, + ) + } + + ServiceConfig.BuilderBuild -> { + rustTemplate( + """ + layer.store_put(#{SigningName}::from_static(${sigV4Trait.name.dq()})); + layer.load::<#{Region}>().cloned().map(|r| layer.store_put(#{SigningRegion}::from(r))); + """, + *codegenScope, + ) + } + + is ServiceConfig.OperationConfigOverride -> { + rustTemplate( + """ + resolver.config_mut() + .load::<#{Region}>() + .cloned() + .map(|r| resolver.config_mut().store_put(#{SigningRegion}::from(r))); + """, + *codegenScope, + ) + } + + else -> {} + } + } + } } private class AuthServiceRuntimePluginCustomization(private val codegenContext: ClientCodegenContext) : @@ -68,24 +155,32 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: private val codegenScope by lazy { val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) arrayOf( - "SIGV4_SCHEME_ID" to awsRuntime.resolve("auth::sigv4::SCHEME_ID"), - "SigV4HttpAuthScheme" to awsRuntime.resolve("auth::sigv4::SigV4HttpAuthScheme"), - "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), - "SigningService" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningService"), - "SharedHttpAuthScheme" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::auth::SharedHttpAuthScheme"), + "SigV4AuthScheme" to awsRuntime.resolve("auth::sigv4::SigV4AuthScheme"), + "SigV4aAuthScheme" to awsRuntime.resolve("auth::sigv4a::SigV4aAuthScheme"), + "SharedAuthScheme" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::auth::SharedAuthScheme"), ) } override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.AdditionalConfig -> { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { val serviceHasEventStream = codegenContext.serviceShape.hasEventStreamOperations(codegenContext.model) if (serviceHasEventStream) { // enable the aws-runtime `sign-eventstream` feature - addDependency(AwsCargoDependency.awsRuntime(runtimeConfig).withFeature("event-stream").toType().toSymbol()) + addDependency( + AwsCargoDependency.awsRuntime(runtimeConfig).withFeature("event-stream").toType().toSymbol(), + ) } - section.registerHttpAuthScheme(this, runtimeConfig) { - rustTemplate("#{SharedHttpAuthScheme}::new(#{SigV4HttpAuthScheme}::new())", *codegenScope) + section.registerAuthScheme(this) { + rustTemplate("#{SharedAuthScheme}::new(#{SigV4AuthScheme}::new())", *codegenScope) + } + + if (codegenContext.serviceShape.supportedAuthSchemes().contains("sigv4a")) { + featureGateBlock("sigv4a") { + section.registerAuthScheme(this) { + rustTemplate("#{SharedAuthScheme}::new(#{SigV4aAuthScheme}::new())", *codegenScope) + } + } } } @@ -94,18 +189,31 @@ private class AuthServiceRuntimePluginCustomization(private val codegenContext: } } +fun needsAmzSha256(service: ServiceShape) = when (service.id) { + ShapeId.from("com.amazonaws.s3#AmazonS3") -> true + ShapeId.from("com.amazonaws.s3control#AWSS3ControlServiceV20180820") -> true + else -> false +} + +fun disableDoubleEncode(service: ServiceShape) = when (service.id) { + ShapeId.from("com.amazonaws.s3#AmazonS3") -> true + else -> false +} + +fun disableUriPathNormalization(service: ServiceShape) = when (service.id) { + ShapeId.from("com.amazonaws.s3#AmazonS3") -> true + else -> false +} + private class AuthOperationCustomization(private val codegenContext: ClientCodegenContext) : OperationCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope by lazy { val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig) arrayOf( - "HttpSignatureType" to awsRuntime.resolve("auth::sigv4::HttpSignatureType"), - "SIGV4_SCHEME_ID" to awsRuntime.resolve("auth::sigv4::SCHEME_ID"), - "SigV4OperationSigningConfig" to awsRuntime.resolve("auth::sigv4::SigV4OperationSigningConfig"), - "SigningOptions" to awsRuntime.resolve("auth::sigv4::SigningOptions"), - "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), - "SigningService" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningService"), + "SigV4OperationSigningConfig" to awsRuntime.resolve("auth::SigV4OperationSigningConfig"), + "SigningOptions" to awsRuntime.resolve("auth::SigningOptions"), "SignableBody" to AwsRuntimeType.awsSigv4(runtimeConfig).resolve("http_request::SignableBody"), + "Default" to RuntimeType.Default, ) } private val serviceIndex = ServiceIndex.of(codegenContext.model) @@ -113,11 +221,12 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg override fun section(section: OperationSection): Writable = writable { when (section) { is OperationSection.AdditionalRuntimePluginConfig -> { - val authSchemes = serviceIndex.getEffectiveAuthSchemes(codegenContext.serviceShape, section.operationShape) + val authSchemes = + serviceIndex.getEffectiveAuthSchemes(codegenContext.serviceShape, section.operationShape) if (authSchemes.containsKey(SigV4Trait.ID)) { val unsignedPayload = section.operationShape.hasTrait() val doubleUriEncode = unsignedPayload || !disableDoubleEncode(codegenContext.serviceShape) - val contentSha256Header = needsAmzSha256(codegenContext.serviceShape) + val contentSha256Header = needsAmzSha256(codegenContext.serviceShape) || unsignedPayload val normalizeUrlPath = !disableUriPathNormalization(codegenContext.serviceShape) rustTemplate( """ @@ -128,9 +237,8 @@ private class AuthOperationCustomization(private val codegenContext: ClientCodeg signing_options.payload_override = #{payload_override}; ${section.newLayerName}.store_put(#{SigV4OperationSigningConfig} { - region: None, - service: None, signing_options, + ..#{Default}::default() }); """, *codegenScope, diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt deleted file mode 100644 index 0549ecf5255..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import software.amazon.smithy.aws.traits.auth.SigV4Trait -import software.amazon.smithy.aws.traits.auth.UnsignedPayloadTrait -import software.amazon.smithy.model.Model -import software.amazon.smithy.model.knowledge.ServiceIndex -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ServiceShape -import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.model.traits.OptionalAuthTrait -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.expectTrait -import software.amazon.smithy.rust.codegen.core.util.extendIf -import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations -import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rust.codegen.core.util.isInputEventStream - -// TODO(enableNewSmithyRuntimeCleanup): Remove this decorator (superseded by SigV4AuthDecorator) -/** - * The SigV4SigningDecorator: - * - adds a `signing_service()` method to `config` to return the default signing service - * - adds a `new_event_stream_signer()` method to `config` to create an Event Stream SigV4 signer - * - sets the `SigningService` during operation construction - * - sets a default `OperationSigningConfig` A future enhancement will customize this for specific services that need - * different behavior. - */ -class SigV4SigningDecorator : ClientCodegenDecorator { - override val name: String = "SigV4Signing" - override val order: Byte = 0 - - private fun applies(codegenContext: CodegenContext): Boolean = codegenContext.serviceShape.hasTrait() - - override fun configCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List { - return baseCustomizations.extendIf(applies(codegenContext)) { - SigV4SigningConfig( - codegenContext.runtimeConfig, - codegenContext.smithyRuntimeMode, - codegenContext.serviceShape.hasEventStreamOperations(codegenContext.model), - codegenContext.serviceShape.expectTrait(), - ) - } - } - - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations.extendIf(applies(codegenContext)) { - SigV4SigningFeature( - codegenContext.model, - operation, - codegenContext.runtimeConfig, - codegenContext.serviceShape, - ) - } - } -} - -class SigV4SigningConfig( - private val runtimeConfig: RuntimeConfig, - private val runtimeMode: SmithyRuntimeMode, - private val serviceHasEventStream: Boolean, - private val sigV4Trait: SigV4Trait, -) : ConfigCustomization() { - private val codegenScope = arrayOf( - "Region" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::Region"), - "SigningService" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("SigningService"), - "SigningRegion" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("region::SigningRegion"), - ) - - override fun section(section: ServiceConfig): Writable = writable { - when (section) { - ServiceConfig.ConfigImpl -> { - if (serviceHasEventStream) { - // enable the aws-sig-auth `sign-eventstream` feature - addDependency(AwsRuntimeType.awsSigAuthEventStream(runtimeConfig).toSymbol()) - } - rust( - """ - /// The signature version 4 service signing name to use in the credential scope when signing requests. - /// - /// The signing service may be overridden by the `Endpoint`, or by specifying a custom - /// [`SigningService`](aws_types::SigningService) during operation construction - pub fn signing_service(&self) -> &'static str { - ${sigV4Trait.name.dq()} - } - """, - ) - } - ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - layer.store_put(#{SigningService}::from_static(${sigV4Trait.name.dq()})); - layer.load::<#{Region}>().cloned().map(|r| layer.store_put(#{SigningRegion}::from(r))); - """, - *codegenScope, - ) - } - } - - else -> emptySection - } - } -} - -fun needsAmzSha256(service: ServiceShape) = when (service.id) { - ShapeId.from("com.amazonaws.s3#AmazonS3") -> true - ShapeId.from("com.amazonaws.s3control#AWSS3ControlServiceV20180820") -> true - else -> false -} - -fun disableDoubleEncode(service: ServiceShape) = when (service.id) { - ShapeId.from("com.amazonaws.s3#AmazonS3") -> true - else -> false -} - -fun disableUriPathNormalization(service: ServiceShape) = when (service.id) { - ShapeId.from("com.amazonaws.s3#AmazonS3") -> true - else -> false -} - -class SigV4SigningFeature( - private val model: Model, - private val operation: OperationShape, - runtimeConfig: RuntimeConfig, - private val service: ServiceShape, -) : - OperationCustomization() { - private val codegenScope = arrayOf( - "sig_auth" to AwsRuntimeType.awsSigAuth(runtimeConfig), - "aws_types" to AwsRuntimeType.awsTypes(runtimeConfig), - ) - - private val serviceIndex = ServiceIndex.of(model) - - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - rustTemplate( - "let mut signing_config = #{sig_auth}::signer::OperationSigningConfig::default_config();", - *codegenScope, - ) - if (needsAmzSha256(service)) { - rust("signing_config.signing_options.content_sha256_header = true;") - } - if (disableDoubleEncode(service)) { - rust("signing_config.signing_options.double_uri_encode = false;") - } - if (disableUriPathNormalization(service)) { - rust("signing_config.signing_options.normalize_uri_path = false;") - } - if (operation.hasTrait()) { - rust("signing_config.signing_options.content_sha256_header = true;") - rustTemplate( - "${section.request}.properties_mut().insert(#{sig_auth}::signer::SignableBody::UnsignedPayload);", - *codegenScope, - ) - } else if (operation.isInputEventStream(model)) { - // TODO(EventStream): Is this actually correct for all Event Stream operations? - rustTemplate( - "${section.request}.properties_mut().insert(#{sig_auth}::signer::SignableBody::Bytes(&[]));", - *codegenScope, - ) - } - // some operations are either unsigned or optionally signed: - val authSchemes = serviceIndex.getEffectiveAuthSchemes(service, operation) - if (!authSchemes.containsKey(SigV4Trait.ID)) { - rustTemplate( - "signing_config.signing_requirements = #{sig_auth}::signer::SigningRequirements::Disabled;", - *codegenScope, - ) - } else { - if (operation.hasTrait()) { - rustTemplate( - "signing_config.signing_requirements = #{sig_auth}::signer::SigningRequirements::Optional;", - *codegenScope, - ) - } - } - rustTemplate( - """ - ${section.request}.properties_mut().insert(signing_config); - ${section.request}.properties_mut().insert(#{aws_types}::SigningService::from_static(${section.config}.signing_service())); - if let Some(region) = &${section.config}.region { - ${section.request}.properties_mut().insert(#{aws_types}::region::SigningRegion::from(region.clone())); - } - """, - *codegenScope, - ) - } - - else -> emptySection - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt index 19395ebea66..058acab9cce 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt @@ -6,12 +6,9 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.aws.traits.ServiceTrait -import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization @@ -27,7 +24,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomizat import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.expectTrait -import software.amazon.smithy.rust.codegen.core.util.letIf /** * Inserts a UserAgent configuration into the operation @@ -43,21 +39,11 @@ class UserAgentDecorator : ClientCodegenDecorator { return baseCustomizations + AppNameCustomization(codegenContext) } - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations + UserAgentMutateOpRequest(codegenContext) - } - override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(AddApiMetadataIntoConfigBag(codegenContext)) - } + baseCustomizations + AddApiMetadataIntoConfigBag(codegenContext) override fun extraSections(codegenContext: ClientCodegenContext): List { return listOf( @@ -104,8 +90,8 @@ class UserAgentDecorator : ClientCodegenDecorator { override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.RegisterInterceptor -> { - section.registerInterceptor(runtimeConfig, this) { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { + section.registerInterceptor(this) { rust("#T::new()", awsRuntime.resolve("user_agent::UserAgentInterceptor")) } } @@ -114,51 +100,16 @@ class UserAgentDecorator : ClientCodegenDecorator { } } - // TODO(enableNewSmithyRuntimeCleanup): Remove this customization class - private class UserAgentMutateOpRequest( - codegenContext: ClientCodegenContext, - ) : OperationCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.MutateRequest -> writable { - rustTemplate( - """ - let mut user_agent = #{ua_module}::AwsUserAgent::new_from_environment( - #{Env}::real(), - #{meta}::API_METADATA.clone(), - ); - if let Some(app_name) = _config.app_name() { - user_agent = user_agent.with_app_name(app_name.clone()); - } - ${section.request}.properties_mut().insert(user_agent); - """, - "meta" to ClientRustModule.Meta, - "ua_module" to AwsRuntimeType.awsHttp(runtimeConfig).resolve("user_agent"), - "Env" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("os_shim_internal::Env"), - ) - } - - else -> emptySection - } - } - private class AppNameCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, "AppName" to AwsRuntimeType.awsTypes(runtimeConfig).resolve("app_name::AppName"), + "AwsUserAgent" to AwsRuntimeType.awsHttp(runtimeConfig).resolve("user_agent::AwsUserAgent"), ) override fun section(section: ServiceConfig): Writable = when (section) { - is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("app_name: #{Option}<#{AppName}>,", *codegenScope) - } - } - is ServiceConfig.BuilderImpl -> writable { rustTemplate( """ @@ -174,79 +125,47 @@ class UserAgentDecorator : ClientCodegenDecorator { *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Sets the name of the app that is using the client. - /// - /// This _optional_ name is used to identify the application in the user agent that - /// gets sent along with requests. - pub fn set_app_name(&mut self, app_name: #{Option}<#{AppName}>) -> &mut Self { - self.inner.store_or_unset(app_name); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the name of the app that is using the client. - /// - /// This _optional_ name is used to identify the application in the user agent that - /// gets sent along with requests. - pub fn set_app_name(&mut self, app_name: #{Option}<#{AppName}>) -> &mut Self { - self.app_name = app_name; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Sets the name of the app that is using the client. + /// + /// This _optional_ name is used to identify the application in the user agent that + /// gets sent along with requests. + pub fn set_app_name(&mut self, app_name: #{Option}<#{AppName}>) -> &mut Self { + self.config.store_or_unset(app_name); + self + } + """, + *codegenScope, + ) } is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToOrchestrator) { - rust("layer.store_put(#T.clone());", ClientRustModule.Meta.toType().resolve("API_METADATA")) - } else { - rust("app_name: self.app_name,") - } + rust("layer.store_put(#T.clone());", ClientRustModule.Meta.toType().resolve("API_METADATA")) } - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("app_name: #{Option}<#{AppName}>,", *codegenScope) - } + is ServiceConfig.ConfigImpl -> writable { + rustTemplate( + """ + /// Returns the name of the app that is using the client, if it was provided. + /// + /// This _optional_ name is used to identify the application in the user agent that + /// gets sent along with requests. + pub fn app_name(&self) -> #{Option}<&#{AppName}> { + self.config.load::<#{AppName}>() + } + """, + *codegenScope, + ) } - is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Returns the name of the app that is using the client, if it was provided. - /// - /// This _optional_ name is used to identify the application in the user agent that - /// gets sent along with requests. - pub fn app_name(&self) -> #{Option}<&#{AppName}> { - self.inner.load::<#{AppName}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns the name of the app that is using the client, if it was provided. - /// - /// This _optional_ name is used to identify the application in the user agent that - /// gets sent along with requests. - pub fn app_name(&self) -> #{Option}<&#{AppName}> { - self.app_name.as_ref() - } - """, - *codegenScope, - ) - } + is ServiceConfig.DefaultForTests -> writable { + rustTemplate( + """ + self.config.store_put(#{AwsUserAgent}::for_tests()); + """, + *codegenScope, + ) } else -> emptySection diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt index 6cc7345dfac..4dfc75c30be 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rustsdk.customize import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ServiceShape -import software.amazon.smithy.model.traits.AuthTrait import software.amazon.smithy.model.traits.OptionalAuthTrait import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings @@ -16,7 +15,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegen import software.amazon.smithy.rust.codegen.core.util.shapeId // / STS (and possibly other services) need to have auth manually set to [] -class DisabledAuthDecorator() : ClientCodegenDecorator { +class DisabledAuthDecorator : ClientCodegenDecorator { override val name: String = "OptionalAuth" override val order: Byte = 0 @@ -39,14 +38,7 @@ class DisabledAuthDecorator() : ClientCodegenDecorator { val optionalOperations = optionalAuth[service.id]!! return ModelTransformer.create().mapShapes(model) { if (optionalOperations.contains(it.id) && it is OperationShape) { - if (settings.codegenConfig.enableNewSmithyRuntime.defaultToOrchestrator) { - it.toBuilder().addTrait(OptionalAuthTrait()).build() - } else { - // In middleware, having an empty @auth trait completely disabled - // auth for an operation since not having credentials isn't an option - // in that implementation. - it.toBuilder().addTrait(AuthTrait(setOf())).build() - } + it.toBuilder().addTrait(OptionalAuthTrait()).build() } else { it } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt new file mode 100644 index 00000000000..45bf8bc1987 --- /dev/null +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt @@ -0,0 +1,65 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk.customize + +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.shapes.AbstractShapeBuilder +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.model.traits.DefaultTrait +import software.amazon.smithy.model.transform.ModelTransformer +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.letIf +import software.amazon.smithy.utils.ToSmithyBuilder +import java.util.logging.Logger + +/** + * Removes default values from specified root shapes, and any members that target those + * root shapes. + */ +object RemoveDefaults { + private val logger: Logger = Logger.getLogger(javaClass.name) + + fun processModel(model: Model, removeDefaultsFrom: Set): Model { + val removedRootDefaults: MutableSet = HashSet() + val removedRootDefaultsModel = ModelTransformer.create().mapShapes(model) { shape -> + shape.letIf(shouldRemoveRootDefault(shape, removeDefaultsFrom)) { + logger.info("Removing default trait from root $shape") + removedRootDefaults.add(shape.id) + removeDefault(shape) + } + } + + return ModelTransformer.create().mapShapes(removedRootDefaultsModel) { shape -> + shape.letIf(shouldRemoveMemberDefault(shape, removedRootDefaults, removeDefaultsFrom)) { + logger.info("Removing default trait from member $shape") + removeDefault(shape) + } + } + } + + private fun shouldRemoveRootDefault(shape: Shape, removeDefaultsFrom: Set): Boolean { + return shape !is MemberShape && removeDefaultsFrom.contains(shape.id) && shape.hasTrait() + } + + private fun shouldRemoveMemberDefault( + shape: Shape, + removedRootDefaults: Set, + removeDefaultsFrom: Set, + ): Boolean { + return shape is MemberShape && + // Check the original set of shapes to remove for this shape id, to remove members that were in that set. + (removedRootDefaults.contains(shape.target) || removeDefaultsFrom.contains(shape.id)) && + shape.hasTrait() + } + + private fun removeDefault(shape: Shape): Shape { + return ((shape as ToSmithyBuilder<*>).toBuilder() as AbstractShapeBuilder<*, *>) + .removeTrait(DefaultTrait.ID) + .build() + } +} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt new file mode 100644 index 00000000000..1e1e205f45e --- /dev/null +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt @@ -0,0 +1,84 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk.customize + +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.core.util.shapeId +import java.util.logging.Logger + +/** + * Removes default values from certain shapes, and any member that targets those shapes, + * for some services where the default value causes serialization issues, validation + * issues, or other unexpected behavior. + */ +class RemoveDefaultsDecorator : ClientCodegenDecorator { + override val name: String = "RemoveDefaults" + override val order: Byte = 0 + private val logger: Logger = Logger.getLogger(javaClass.name) + + // Service shape id -> Shape id of each root shape to remove the default from. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/3220): Remove this customization after model updates. + private val removeDefaults: Map> = mapOf( + "com.amazonaws.amplifyuibuilder#AmplifyUIBuilder" to setOf( + "com.amazonaws.amplifyuibuilder#ListComponentsLimit", + "com.amazonaws.amplifyuibuilder#ListFormsLimit", + "com.amazonaws.amplifyuibuilder#ListThemesLimit", + ), + "com.amazonaws.drs#ElasticDisasterRecoveryService" to setOf( + "com.amazonaws.drs#Validity", + "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceThreshold", + "com.amazonaws.drs#CostOptimizationConfiguration\$burstBalanceDeltaThreshold", + "com.amazonaws.drs.synthetic#ListStagingAccountsInput\$maxResults", + "com.amazonaws.drs#StrictlyPositiveInteger", + "com.amazonaws.drs#MaxResultsType", + "com.amazonaws.drs#MaxResultsReplicatingSourceServers", + "com.amazonaws.drs#LaunchActionOrder", + ), + "com.amazonaws.evidently#Evidently" to setOf( + "com.amazonaws.evidently#ResultsPeriod", + ), + "com.amazonaws.location#LocationService" to setOf( + "com.amazonaws.location.synthetic#ListPlaceIndexesInput\$MaxResults", + "com.amazonaws.location.synthetic#SearchPlaceIndexForSuggestionsInput\$MaxResults", + "com.amazonaws.location#PlaceIndexSearchResultLimit", + ), + "com.amazonaws.paymentcryptographydata#PaymentCryptographyDataPlane" to setOf( + "com.amazonaws.paymentcryptographydata#IntegerRangeBetween4And12", + ), + "com.amazonaws.emrserverless#AwsToledoWebService" to setOf( + "com.amazonaws.emrserverless#WorkerCounts", + ), + "com.amazonaws.s3control#AWSS3ControlServiceV20180820" to setOf( + "com.amazonaws.s3control#PublicAccessBlockConfiguration\$BlockPublicAcls", + "com.amazonaws.s3control#PublicAccessBlockConfiguration\$IgnorePublicAcls", + "com.amazonaws.s3control#PublicAccessBlockConfiguration\$BlockPublicPolicy", + "com.amazonaws.s3control#PublicAccessBlockConfiguration\$RestrictPublicBuckets", + ), + "com.amazonaws.iot#AWSIotService" to setOf( + "com.amazonaws.iot#ThingConnectivity\$connected", + "com.amazonaws.iot.synthetic#UpdateProvisioningTemplateInput\$enabled", + "com.amazonaws.iot.synthetic#CreateProvisioningTemplateInput\$enabled", + "com.amazonaws.iot.synthetic#DescribeProvisioningTemplateOutput\$enabled", + "com.amazonaws.iot.synthetic#DescribeProvisioningTemplateOutput\$enabled", + "com.amazonaws.iot#ProvisioningTemplateSummary\$enabled", + ), + ).map { (k, v) -> k.shapeId() to v.map { it.shapeId() }.toSet() }.toMap() + + private fun applies(service: ServiceShape) = + removeDefaults.containsKey(service.id) + + override fun transformModel(service: ServiceShape, model: Model, settings: ClientRustSettings): Model { + if (!applies(service)) { + return model + } + logger.info("Removing invalid defaults from ${service.id}") + return RemoveDefaults.processModel(model, removeDefaults[service.id]!!) + } +} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt index 3f8a8f6d614..4850d299efb 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt @@ -12,7 +12,7 @@ import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.ToShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientProtocolMap import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization @@ -63,9 +63,9 @@ class ServiceSpecificDecorator( override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, - baseAuthOptions: List, - ): List = baseAuthOptions.maybeApply(codegenContext.serviceShape) { - delegateTo.authOptions(codegenContext, operationShape, baseAuthOptions) + baseAuthSchemeOptions: List, + ): List = baseAuthSchemeOptions.maybeApply(codegenContext.serviceShape) { + delegateTo.authOptions(codegenContext, operationShape, baseAuthSchemeOptions) } override fun builderCustomizations( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt index 3f699f59731..4b9cc3616aa 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt @@ -5,76 +5,40 @@ package software.amazon.smithy.rustsdk.customize.apigateway -import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rustsdk.InlineAwsDependency class ApiGatewayDecorator : ClientCodegenDecorator { override val name: String = "ApiGateway" override val order: Byte = 0 - // TODO(enableNewSmithyRuntimeCleanup): Delete when cleaning up middleware - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateMiddleware) { - it + ApiGatewayAddAcceptHeader() - } - override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + ApiGatewayAcceptHeaderInterceptorCustomization(codegenContext) - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete when cleaning up middleware -private class ApiGatewayAddAcceptHeader : OperationCustomization() { - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.FinalizeOperation -> emptySection - is OperationSection.OperationImplBlock -> emptySection - is OperationSection.MutateRequest -> writable { - rust( - """${section.request} - .http_mut() - .headers_mut() - .insert("Accept", #T::HeaderValue::from_static("application/json"));""", - RuntimeType.Http, - ) - } - - else -> emptySection - } + baseCustomizations + ApiGatewayAcceptHeaderInterceptorCustomization(codegenContext) } private class ApiGatewayAcceptHeaderInterceptorCustomization(private val codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { - section.registerInterceptor(codegenContext.runtimeConfig, this) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { + section.registerInterceptor(this) { rustTemplate( "#{Interceptor}::default()", "Interceptor" to RuntimeType.forInlineDependency( InlineAwsDependency.forRustFile( "apigateway_interceptors", additionalDependency = arrayOf( - CargoDependency.smithyRuntimeApi(codegenContext.runtimeConfig), + CargoDependency.smithyRuntimeApiClient(codegenContext.runtimeConfig), ), ), ).resolve("AcceptHeaderInterceptor"), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/AccountIdAutofill.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/AccountIdAutofill.kt deleted file mode 100644 index 6b18ca91166..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/AccountIdAutofill.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk.customize.glacier - -import software.amazon.smithy.model.Model -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.inputShape - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file when cleaning up middleware. - -class AccountIdAutofill : OperationCustomization() { - override fun mutSelf(): Boolean = true - override fun consumesSelf(): Boolean = false - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateInput -> writable { - rust( - """ - if ${section.input}.account_id.as_deref().unwrap_or_default().is_empty() { - ${section.input}.account_id = Some("-".to_owned()); - } - """, - ) - } - else -> emptySection - } - } - - companion object { - fun forOperation(operation: OperationShape, model: Model): AccountIdAutofill? { - val input = operation.inputShape(model) - return if (input.memberNames.contains("accountId")) { - AccountIdAutofill() - } else { - null - } - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/ApiVersionHeader.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/ApiVersionHeader.kt deleted file mode 100644 index 093bd610610..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/ApiVersionHeader.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk.customize.glacier - -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.dq - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file when cleaning up middleware. - -class ApiVersionHeader( - /** - * ApiVersion - * This usually comes from the `version` field of the service shape and is usually a date like "2012-06-01" - * */ - private val apiVersion: String, -) : OperationCustomization() { - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.FinalizeOperation -> emptySection - is OperationSection.OperationImplBlock -> emptySection - is OperationSection.MutateRequest -> writable { - rust( - """${section.request} - .http_mut() - .headers_mut() - .insert("x-amz-glacier-version", #T::HeaderValue::from_static(${apiVersion.dq()}));""", - RuntimeType.Http, - ) - } - else -> emptySection - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt index 525acffd0a0..364faa8c6a5 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt @@ -25,7 +25,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSecti import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rustsdk.AwsCargoDependency import software.amazon.smithy.rustsdk.InlineAwsDependency @@ -49,32 +48,17 @@ class GlacierDecorator : ClientCodegenDecorator { codegenContext: ClientCodegenContext, operation: OperationShape, baseCustomizations: List, - ): List { - return if (codegenContext.smithyRuntimeMode.generateMiddleware) { - baseCustomizations + listOfNotNull( - ApiVersionHeader(codegenContext.serviceShape.version), - TreeHashHeader.forOperation(operation, codegenContext.runtimeConfig), - AccountIdAutofill.forOperation(operation, codegenContext.model), - ) - } else { - baseCustomizations + GlacierOperationInterceptorsCustomization(codegenContext) - } - } + ): List = baseCustomizations + GlacierOperationInterceptorsCustomization(codegenContext) override fun structureCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(GlacierAccountIdCustomization(codegenContext)) - } + ): List = baseCustomizations + GlacierAccountIdCustomization(codegenContext) override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(GlacierApiVersionCustomization(codegenContext)) - } + ): List = baseCustomizations + GlacierApiVersionCustomization(codegenContext) } /** Implements the `GlacierAccountId` trait for inputs that have an `account_id` field */ @@ -101,9 +85,9 @@ private class GlacierAccountIdCustomization(private val codegenContext: ClientCo private class GlacierApiVersionCustomization(private val codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (section is ServiceRuntimePluginSection.RegisterInterceptor) { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { val apiVersion = codegenContext.serviceShape.version - section.registerInterceptor(codegenContext.runtimeConfig, this) { + section.registerInterceptor(this) { rustTemplate( "#{Interceptor}::new(${apiVersion.dq()})", "Interceptor" to inlineModule(codegenContext.runtimeConfig).resolve("GlacierApiVersionInterceptor"), @@ -168,5 +152,5 @@ private fun glacierInterceptorDependencies(runtimeConfig: RuntimeConfig) = listO CargoDependency.Hex, CargoDependency.Ring, CargoDependency.smithyHttp(runtimeConfig), - CargoDependency.smithyRuntimeApi(runtimeConfig), + CargoDependency.smithyRuntimeApiClient(runtimeConfig), ) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/TreeHashHeader.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/TreeHashHeader.kt deleted file mode 100644 index ff03c29dda4..00000000000 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/TreeHashHeader.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk.customize.glacier - -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError -import software.amazon.smithy.rustsdk.InlineAwsDependency - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file when cleaning up middleware. - -val TreeHashDependencies = listOf( - CargoDependency.Ring, - CargoDependency.TokioStream, - CargoDependency.BytesUtils, - CargoDependency.Bytes, - CargoDependency.Tokio, - CargoDependency.Hex, - CargoDependency.TempFile, -) - -private val UploadArchive: ShapeId = ShapeId.from("com.amazonaws.glacier#UploadArchive") -private val UploadMultipartPart: ShapeId = ShapeId.from("com.amazonaws.glacier#UploadMultipartPart") -private val Applies = setOf(UploadArchive, UploadMultipartPart) - -class TreeHashHeader(private val runtimeConfig: RuntimeConfig) : OperationCustomization() { - private val glacierChecksums = RuntimeType.forInlineDependency( - InlineAwsDependency.forRustFile( - "glacier_checksums", - additionalDependency = TreeHashDependencies.toTypedArray(), - ), - ) - - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - rustTemplate( - """ - #{glacier_checksums}::add_checksum_treehash( - &mut ${section.request} - ).await.map_err(#{BuildError}::other)?; - """, - "glacier_checksums" to glacierChecksums, "BuildError" to runtimeConfig.operationBuildError(), - ) - } - - else -> emptySection - } - } - - companion object { - fun forOperation(operation: OperationShape, runtimeConfig: RuntimeConfig): TreeHashHeader? { - return if (Applies.contains(operation.id)) { - TreeHashHeader(runtimeConfig) - } else { - null - } - } - } -} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt index 9e0888fa396..d4aa5bf78e2 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt @@ -69,29 +69,13 @@ class TrimResourceIdCustomization( private val codegenContext: ClientCodegenContext, private val inputShape: StructureShape, private val fieldName: String, -) : - OperationCustomization() { - override fun mutSelf(): Boolean = true - override fun consumesSelf(): Boolean = true +) : OperationCustomization() { override fun section(section: OperationSection): Writable = writable { when (section) { - // TODO(enableNewSmithyRuntimeCleanup): Delete this `MutateInput` section - is OperationSection.MutateInput -> { - val trimResourceId = - RuntimeType.forInlineDependency( - InlineAwsDependency.forRustFile("route53_resource_id_preprocessor_middleware"), - ) - .resolve("trim_resource_id") - rustTemplate( - "#{trim_resource_id}(&mut ${section.input}.$fieldName);", - "trim_resource_id" to trimResourceId, - ) - } - is OperationSection.AdditionalInterceptors -> { section.registerInterceptor(codegenContext.runtimeConfig, this) { - val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + val smithyRuntimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) val interceptor = RuntimeType.forInlineDependency( InlineAwsDependency.forRustFile("route53_resource_id_preprocessor"), diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/MakeS3BoolsAndNumbersOptional.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/MakeS3BoolsAndNumbersOptional.kt new file mode 100644 index 00000000000..b8bd4056aa6 --- /dev/null +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/MakeS3BoolsAndNumbersOptional.kt @@ -0,0 +1,38 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk.customize.s3 + +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.shapes.AbstractShapeBuilder +import software.amazon.smithy.model.shapes.BooleanShape +import software.amazon.smithy.model.shapes.NumberShape +import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.traits.DefaultTrait +import software.amazon.smithy.model.transform.ModelTransformer + +/** + * The s3 model is being updated but if we consume that model update, then we'll run into an issue with examples compilation + * + * This "pre-updates" the model so we can fix examples without requiring complex coordination + */ +class MakeS3BoolsAndNumbersOptional { + fun processModel(model: Model): Model { + val updates = arrayListOf() + for (struct in model.structureShapes) { + for (member in struct.allMembers.values) { + val target = model.expectShape(member.target) + val boolTarget = target as? BooleanShape + val numberTarget = target as? NumberShape + if (boolTarget != null || numberTarget != null) { + updates.add(member.toBuilder().removeTrait(DefaultTrait.ID).build()) + val builder: AbstractShapeBuilder<*, *> = Shape.shapeToBuilder(target) + updates.add(builder.removeTrait(DefaultTrait.ID).build()) + } + } + } + return ModelTransformer.create().replaceShapes(model, updates) + } +} diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt index 72f128fb701..3a003398111 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt @@ -13,6 +13,7 @@ import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.traits.OptionalAuthTrait import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rulesengine.traits.EndpointTestCase import software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput @@ -22,7 +23,9 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientRestXmlFactory import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate @@ -34,6 +37,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctio import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestXml import software.amazon.smithy.rust.codegen.core.smithy.traits.AllowInvalidXmlRoot +import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rustsdk.getBuiltIn import software.amazon.smithy.rustsdk.toWritable @@ -82,6 +86,9 @@ class S3Decorator : ClientCodegenDecorator { }, )::transform, ) + // enable optional auth for operations commonly used with public buckets + .let(AddOptionalAuth()::transform) + .let(MakeS3BoolsAndNumbersOptional()::processModel) override fun endpointCustomizations(codegenContext: ClientCodegenContext): List { return listOf( @@ -102,6 +109,34 @@ class S3Decorator : ClientCodegenDecorator { ) } + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List { + return baseCustomizations + object : OperationCustomization() { + override fun section(section: OperationSection): Writable { + return writable { + when (section) { + is OperationSection.BeforeParseResponse -> { + section.body?.also { body -> + rustTemplate( + """ + if matches!(#{errors}::body_is_error($body), Ok(true)) { + ${section.forceError} = true; + } + """, + "errors" to RuntimeType.unwrappedXmlErrors(codegenContext.runtimeConfig), + ) + } + } + else -> {} + } + } + } + } + } + private fun isInInvalidXmlRootAllowList(shape: Shape): Boolean { return shape.isStructureShape && invalidXmlRootAllowList.contains(shape.id) } @@ -111,7 +146,7 @@ class FilterEndpointTests( private val testFilter: (EndpointTestCase) -> EndpointTestCase? = { a -> a }, private val operationInputFilter: (EndpointTestOperationInput) -> EndpointTestOperationInput? = { a -> a }, ) { - fun updateEndpointTests(endpointTests: List): List { + private fun updateEndpointTests(endpointTests: List): List { val filteredTests = endpointTests.mapNotNull { test -> testFilter(test) } return filteredTests.map { test -> val operationInputs = test.operationInputs @@ -119,7 +154,7 @@ class FilterEndpointTests( } } - fun transform(model: Model) = ModelTransformer.create().mapTraits(model) { _, trait -> + fun transform(model: Model): Model = ModelTransformer.create().mapTraits(model) { _, trait -> when (trait) { is EndpointTestsTrait -> EndpointTestsTrait.builder().testCases(updateEndpointTests(trait.testCases)) .version(trait.version).build() @@ -129,6 +164,20 @@ class FilterEndpointTests( } } +// TODO(P96049742): This model transform may need to change depending on if and how the S3 model is updated. +private class AddOptionalAuth { + fun transform(model: Model): Model = ModelTransformer.create().mapShapes(model) { shape -> + // Add @optionalAuth to all S3 operations + if (shape is OperationShape && !shape.hasTrait()) { + shape.toBuilder() + .addTrait(OptionalAuthTrait()) + .build() + } else { + shape + } + } +} + class S3ProtocolOverride(codegenContext: CodegenContext) : RestXml(codegenContext) { private val runtimeConfig = codegenContext.runtimeConfig private val errorScope = arrayOf( @@ -136,8 +185,7 @@ class S3ProtocolOverride(codegenContext: CodegenContext) : RestXml(codegenContex "Bytes" to RuntimeType.Bytes, "ErrorMetadata" to RuntimeType.errorMetadata(runtimeConfig), "ErrorBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, - "Response" to RuntimeType.HttpResponse, + "Headers" to RuntimeType.headers(runtimeConfig), "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"), "base_errors" to restXmlErrors, ) @@ -145,7 +193,7 @@ class S3ProtocolOverride(codegenContext: CodegenContext) : RestXml(codegenContex override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType { return ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustBlockTemplate( - "pub fn $fnName(response_status: u16, _response_headers: &#{HeaderMap}, response_body: &[u8]) -> #{Result}<#{ErrorBuilder}, #{XmlDecodeError}>", + "pub fn $fnName(response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorBuilder}, #{XmlDecodeError}>", *errorScope, ) { rustTemplate( diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt index 6b117b60da2..3cd223ae44b 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt @@ -5,6 +5,8 @@ package software.amazon.smithy.rustsdk.customize.s3 +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rustsdk.BaseRequestIdDecorator @@ -17,6 +19,10 @@ class S3ExtendedRequestIdDecorator : BaseRequestIdDecorator() { override val fieldName: String = "extended_request_id" override val accessorFunctionName: String = "extended_request_id" + override fun asMemberShape(container: StructureShape): MemberShape? { + return null + } + private val requestIdModule: RuntimeType = RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("s3_request_id")) diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt index 57893b1c0ae..eca18011871 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rustsdk.customize.timestream import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency @@ -14,7 +15,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Visibility import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization @@ -25,47 +25,45 @@ import software.amazon.smithy.rustsdk.InlineAwsDependency /** * This decorator does two things: * 1. Adds the `endpoint_discovery` inlineable - * 2. Adds a `enable_endpoint_discovery` method on client that returns a wrapped client with endpoint discovery enabled + * 2. Adds a `with_endpoint_discovery_enabled` method on client that returns a wrapped client with endpoint discovery enabled */ class TimestreamDecorator : ClientCodegenDecorator { override val name: String = "Timestream" override val order: Byte = -1 - override fun extraSections(codegenContext: ClientCodegenContext): List { - return listOf( - adhocCustomization { - addDependency(AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency()) - rustTemplate( - """ - let config = aws_config::load_from_env().await; - // You MUST call `enable_endpoint_discovery` to produce a working client for this service. - let ${it.clientName} = ${it.crateName}::Client::new(&config).enable_endpoint_discovery().await; - """.replaceIndent(it.indent), - ) - }, - ) - } + override fun extraSections(codegenContext: ClientCodegenContext): List = listOf( + adhocCustomization { + addDependency(AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency()) + rustTemplate( + """ + let config = aws_config::load_from_env().await; + // You MUST call `with_endpoint_discovery_enabled` to produce a working client for this service. + let ${it.clientName} = ${it.crateName}::Client::new(&config).with_endpoint_discovery_enabled().await; + """.replaceIndent(it.indent), + ) + }, + ) override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { val endpointDiscovery = InlineAwsDependency.forRustFile( "endpoint_discovery", Visibility.PUBLIC, CargoDependency.Tokio.copy(scope = DependencyScope.Compile, features = setOf("sync")), + CargoDependency.smithyAsync(codegenContext.runtimeConfig).toDevDependency().withFeature("test-util"), ) - rustCrate.lib { + rustCrate.withModule(ClientRustModule.client) { // helper function to resolve an endpoint given a base client rustTemplate( """ - async fn resolve_endpoint(client: &crate::Client) -> Result<(#{Endpoint}, #{SystemTime}), #{ResolveEndpointError}> { + async fn resolve_endpoint(client: &crate::Client) -> Result<(#{Endpoint}, #{SystemTime}), #{BoxError}> { let describe_endpoints = - client.describe_endpoints().send().await.map_err(|e| { - #{ResolveEndpointError}::from_source("failed to call describe_endpoints", e) - })?; - let endpoint = describe_endpoints.endpoints().unwrap().get(0).unwrap(); - let expiry = client.conf().time_source().now() + #{Duration}::from_secs(endpoint.cache_period_in_minutes() as u64 * 60); + client.describe_endpoints().send().await?; + let endpoint = describe_endpoints.endpoints().get(0).unwrap(); + let expiry = client.config().time_source().expect("checked when ep discovery was enabled").now() + + #{Duration}::from_secs(endpoint.cache_period_in_minutes() as u64 * 60); Ok(( #{Endpoint}::builder() - .url(format!("https://{}", endpoint.address().unwrap())) + .url(format!("https://{}", endpoint.address())) .build(), expiry, )) @@ -75,33 +73,40 @@ class TimestreamDecorator : ClientCodegenDecorator { /// Enable endpoint discovery for this client /// /// This method MUST be called to construct a working client. - pub async fn enable_endpoint_discovery(self) -> #{Result}<(Self, #{endpoint_discovery}::ReloadEndpoint), #{ResolveEndpointError}> { - let mut new_conf = self.conf().clone(); - let sleep = self.conf().sleep_impl().expect("sleep impl must be provided"); - let time = self.conf().time_source(); + pub async fn with_endpoint_discovery_enabled(self) -> #{Result}<(Self, #{endpoint_discovery}::ReloadEndpoint), #{BoxError}> { + let handle = self.handle.clone(); + + // The original client without endpoint discover gets moved into the endpoint discovery + // resolver since calls to DescribeEndpoint without discovery need to be made. + let client_without_discovery = self; let (resolver, reloader) = #{endpoint_discovery}::create_cache( move || { - let client = self.clone(); + let client = client_without_discovery.clone(); async move { resolve_endpoint(&client).await } }, - sleep, - time - ) - .await?; - new_conf.endpoint_resolver = #{SharedEndpointResolver}::new(resolver); - Ok((Self::from_conf(new_conf), reloader)) + handle.conf.sleep_impl() + .expect("endpoint discovery requires the client config to have a sleep impl"), + handle.conf.time_source() + .expect("endpoint discovery requires the client config to have a time source"), + ).await?; + + use #{IntoShared}; + let mut conf = handle.conf.to_builder(); + conf.set_endpoint_resolver(Some(resolver.into_shared())); + + let client_with_discovery = crate::Client::from_conf(conf.build()); + Ok((client_with_discovery, reloader)) } } """, - "endpoint_discovery" to endpointDiscovery.toType(), - "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), + *RuntimeType.preludeScope, + "Arc" to RuntimeType.Arc, "Duration" to RuntimeType.std.resolve("time::Duration"), - "SharedEndpointResolver" to RuntimeType.smithyHttp(codegenContext.runtimeConfig) - .resolve("endpoint::SharedEndpointResolver"), - "SystemTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig) - .resolve("time::SystemTimeSource"), + "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), + "endpoint_discovery" to endpointDiscovery.toType(), + "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), + "IntoShared" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve("shared::IntoShared"), *Types(codegenContext.runtimeConfig).toArray(), - *preludeScope, ) } } diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt index 698e732623f..b11236dfd14 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt @@ -8,7 +8,7 @@ package software.amazon.smithy.rustsdk.endpoints import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.rulesengine.language.syntax.parameters.Builtins +import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns import software.amazon.smithy.rulesengine.traits.EndpointTestCase import software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -59,9 +59,9 @@ class OperationInputTestDecorator : ClientCodegenDecorator { private val deprecatedBuiltins = setOf( // The Rust SDK DOES NOT support the S3 global endpoint because we do not support bucket redirects - Builtins.S3_USE_GLOBAL_ENDPOINT, + AwsBuiltIns.S3_USE_GLOBAL_ENDPOINT, // STS global endpoint was deprecated after STS regionalization - Builtins.STS_USE_GLOBAL_ENDPOINT, + AwsBuiltIns.STS_USE_GLOBAL_ENDPOINT, ).map { it.builtIn.get() } fun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Boolean { @@ -83,12 +83,12 @@ fun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Bool * "AWS::S3::UseArnRegion": false * } */ * /* clientParams: {} */ - * let (conn, rcvr) = aws_smithy_client::test_connection::capture_request(None); + * let (http_client, rcvr) = aws_smithy_runtime::client::http::test_util::capture_request(None); * let conf = { * #[allow(unused_mut)] * let mut builder = aws_sdk_s3::Config::builder() * .with_test_defaults() - * .http_connector(conn); + * .http_client(http_client); * let builder = builder.region(aws_types::region::Region::new("us-west-2")); * let builder = builder.use_arn_region(false); * builder.build() @@ -109,7 +109,7 @@ fun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Bool * ``` * * Eventually, we need to pull this test into generic smithy. However, this relies on generic smithy clients - * supporting middleware and being instantiable from config (https://github.com/awslabs/smithy-rs/issues/2194) + * supporting middleware and being instantiable from config (https://github.com/smithy-lang/smithy-rs/issues/2194) * * Doing this in AWS codegen allows us to actually integration test generated clients. */ @@ -122,25 +122,14 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: private val model = ctx.model private val instantiator = ClientInstantiator(ctx) - private fun EndpointTestOperationInput.operationId() = - ShapeId.fromOptionalNamespace(ctx.serviceShape.id.namespace, operationName) - - /** the Rust SDK doesn't support SigV4a — search endpoint.properties.authSchemes[].name */ - private fun EndpointTestCase.isSigV4a() = - expect.endpoint.orNull()?.properties?.get("authSchemes")?.asArrayNode()?.orNull() - ?.map { it.expectObjectNode().expectStringMember("name").value }?.contains("sigv4a") == true - fun generateInput(testOperationInput: EndpointTestOperationInput) = writable { val operationName = testOperationInput.operationName.toSnakeCase() - if (test.isSigV4a()) { - Attribute.shouldPanic("no request was received").render(this) - } tokioTest(safeName("operation_input_test_$operationName")) { rustTemplate( """ /* builtIns: ${escape(Node.prettyPrintJson(testOperationInput.builtInParams))} */ /* clientParams: ${escape(Node.prettyPrintJson(testOperationInput.clientParams))} */ - let (conn, rcvr) = #{capture_request}(None); + let (http_client, rcvr) = #{capture_request}(None); let conf = #{conf}; let client = $moduleName::Client::from_conf(conf); let _result = dbg!(#{invoke_operation}); @@ -183,7 +172,7 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: private fun operationInvocation(testOperationInput: EndpointTestOperationInput) = writable { rust("client.${testOperationInput.operationName.toSnakeCase()}()") val operationInput = - model.expectShape(testOperationInput.operationId(), OperationShape::class.java).inputShape(model) + model.expectShape(ctx.operationId(testOperationInput), OperationShape::class.java).inputShape(model) testOperationInput.operationParams.members.forEach { (key, value) -> val member = operationInput.expectMember(key.value) rustTemplate( @@ -198,7 +187,7 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: private fun config(operationInput: EndpointTestOperationInput) = writable { rustBlock("") { Attribute.AllowUnusedMut.render(this) - rust("let mut builder = $moduleName::Config::builder().with_test_defaults().http_connector(conn);") + rust("let mut builder = $moduleName::Config::builder().with_test_defaults().http_client(http_client);") operationInput.builtInParams.members.forEach { (builtIn, value) -> val setter = endpointCustomizations.firstNotNullOfOrNull { it.setBuiltInOnServiceConfig( @@ -217,3 +206,6 @@ class OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: } } } + +fun ClientCodegenContext.operationId(testOperationInput: EndpointTestOperationInput): ShapeId = + this.serviceShape.allOperations.first { it.name == testOperationInput.operationName } diff --git a/aws/sdk-codegen/src/test/kotlin/AwsCrateDocsDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/AwsCrateDocsDecoratorTest.kt index aa2485e6aec..7cd935e381d 100644 --- a/aws/sdk-codegen/src/test/kotlin/AwsCrateDocsDecoratorTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/AwsCrateDocsDecoratorTest.kt @@ -4,10 +4,18 @@ */ import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import software.amazon.smithy.model.loader.ModelAssembler +import software.amazon.smithy.model.node.ObjectNode +import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext +import software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rustsdk.AwsCrateDocGenerator +import software.amazon.smithy.rustsdk.AwsTestRuntimeConfig class AwsCrateDocsDecoratorTest { private val codegenContext = testClientCodegenContext(ModelAssembler().assemble().unwrap()) @@ -106,4 +114,49 @@ class AwsCrateDocsDecoratorTest { ), ) } + + // TODO(PostGA): Remove warning banner conditionals. + @Test + fun warningBanner() { + val context = { version: String -> + testClientCodegenContext( + model = """ + namespace test + + service Foobaz { + } + """.asSmithyModel(), + settings = testClientRustSettings( + moduleVersion = version, + service = ShapeId.from("test#Foobaz"), + runtimeConfig = AwsTestRuntimeConfig, + customizationConfig = + ObjectNode.parse( + """ + { "awsSdk": { + "awsConfigVersion": "dontcare" } } + """, + ) as ObjectNode, + ), + ) + } + + // Test unstable versions first + var codegenContext = context("0.36.0") + var result = AwsCrateDocGenerator(codegenContext).docText(includeHeader = false, includeLicense = false, asComments = true).let { writable -> + val writer = RustWriter.root() + writable(writer) + writer.toString() + } + assertTrue(result.contains("The SDK is currently released as a developer preview")) + + // And now stable versions + codegenContext = context("1.0.0") + result = AwsCrateDocGenerator(codegenContext).docText(includeHeader = false, includeLicense = false, asComments = true).let { writable -> + val writer = RustWriter.root() + writable(writer) + writer.toString() + } + assertFalse(result.contains("The SDK is currently released as a developer preview")) + } } diff --git a/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt new file mode 100644 index 00000000000..d4bd5e9ab11 --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/SdkCodegenIntegrationTest.kt @@ -0,0 +1,106 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest +import software.amazon.smithy.rustsdk.awsIntegrationTestParams +import software.amazon.smithy.rustsdk.awsSdkIntegrationTest + +class SdkCodegenIntegrationTest { + companion object { + val model = """ + namespace test + + use aws.api#service + use aws.auth#sigv4 + use aws.protocols#restJson1 + use smithy.rules#endpointRuleSet + + @service(sdkId: "dontcare") + @restJson1 + @sigv4(name: "dontcare") + @auth([sigv4]) + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": { + "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + } + }) + service TestService { + version: "2023-01-01", + operations: [SomeOperation] + } + + structure SomeOutput { + someAttribute: Long, + someVal: String + } + + @http(uri: "/SomeOperation", method: "GET") + @optionalAuth + operation SomeOperation { + output: SomeOutput + } + """.asSmithyModel() + } + + @Test + fun smokeTestSdkCodegen() { + awsSdkIntegrationTest(model) { _, _ -> /* it should compile */ } + } + + // TODO(PostGA): Remove warning banner conditionals. + @Test + fun warningBanners() { + // Unstable version + awsSdkIntegrationTest( + model, + params = awsIntegrationTestParams().copy(moduleVersion = "0.36.0"), + ) { _, rustCrate -> + rustCrate.integrationTest("banner") { + rust( + """ + ##[test] + fn banner() { + use std::process::Command; + use std::path::Path; + + // Verify we're in the right directory + assert!(Path::new("Cargo.toml").try_exists().unwrap()); + let output = Command::new("grep").arg("developer preview").arg("-i").arg("-R").arg(".").output().unwrap(); + assert_eq!(0, output.status.code().unwrap(), "it should output the banner"); + } + """, + ) + } + } + + // Stable version + awsSdkIntegrationTest( + model, + params = awsIntegrationTestParams().copy(moduleVersion = "1.0.0"), + ) { _, rustCrate -> + rustCrate.integrationTest("no_banner") { + rust( + """ + ##[test] + fn banner() { + use std::process::Command; + use std::path::Path; + + // Verify we're in the right directory + assert!(Path::new("Cargo.toml").try_exists().unwrap()); + let output = Command::new("grep").arg("developer preview").arg("-i").arg("-R").arg(".").output().unwrap(); + assert_eq!(1, output.status.code().unwrap(), "it should _not_ output the banner"); + } + """, + ) + } + } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt deleted file mode 100644 index c598c1ab0d4..00000000000 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialCacheConfigTest.kt +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.testModule -import software.amazon.smithy.rust.codegen.core.testutil.tokioTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest - -internal class CredentialCacheConfigTest { - private val model = """ - namespace com.example - use aws.protocols#awsJson1_0 - use aws.api#service - use smithy.rules#endpointRuleSet - - @service(sdkId: "Some Value") - @awsJson1_0 - @endpointRuleSet({ - "version": "1.0", - "rules": [{ - "type": "endpoint", - "conditions": [{"fn": "isSet", "argv": [{"ref": "Region"}]}], - "endpoint": { "url": "https://example.com" } - }], - "parameters": { - "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, - } - }) - service HelloService { - operations: [SayHello], - version: "1" - } - - @optionalAuth - operation SayHello { input: TestInput } - structure TestInput { - foo: String, - } - """.asSmithyModel() - - @Test - fun `config override for credentials`() { - awsSdkIntegrationTest(model, defaultToOrchestrator = true) { clientCodegenContext, rustCrate -> - val runtimeConfig = clientCodegenContext.runtimeConfig - val codegenScope = arrayOf( - *RuntimeType.preludeScope, - "Credentials" to AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig) - .resolve("Credentials"), - "CredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("cache::CredentialsCache"), - "ProvideCachedCredentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("cache::ProvideCachedCredentials"), - "RuntimePlugin" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::runtime_plugin::RuntimePlugin"), - "SharedCredentialsCache" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("cache::SharedCredentialsCache"), - "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig) - .resolve("provider::SharedCredentialsProvider"), - ) - rustCrate.testModule { - unitTest( - "test_overriding_only_credentials_provider_should_panic", - additionalAttributes = listOf(Attribute.shouldPanic("also specify `.credentials_cache` when overriding credentials provider for the operation")), - ) { - rustTemplate( - """ - use #{RuntimePlugin}; - - let client_config = crate::config::Config::builder().build(); - let config_override = - crate::config::Config::builder().credentials_provider(#{Credentials}::for_tests()); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config.config().unwrap(), - config_override, - }; - - // this should cause `panic!` - let _ = sut.config().unwrap(); - """, - *codegenScope, - ) - } - - unitTest( - "test_overriding_only_credentials_cache_should_panic", - additionalAttributes = listOf(Attribute.shouldPanic("also specify `.credentials_provider` when overriding credentials cache for the operation")), - ) { - rustTemplate( - """ - use #{RuntimePlugin}; - - let client_config = crate::config::Config::builder().build(); - let config_override = crate::config::Config::builder() - .credentials_cache(#{CredentialsCache}::no_caching()); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config.config().unwrap(), - config_override, - }; - - // this should cause `panic!` - let _ = sut.config().unwrap(); - """, - *codegenScope, - ) - } - - tokioTest("test_overriding_cache_and_provider_leads_to_shared_credentials_cache_in_layer") { - rustTemplate( - """ - use #{ProvideCachedCredentials}; - use #{RuntimePlugin}; - - let client_config = crate::config::Config::builder() - .credentials_provider(#{Credentials}::for_tests()) - .build(); - let client_config_layer = client_config.config().unwrap(); - - // make sure test credentials are set in the client config level - assert_eq!(#{Credentials}::for_tests(), - client_config_layer - .load::<#{SharedCredentialsCache}>() - .unwrap() - .provide_cached_credentials() - .await - .unwrap() - ); - - let credentials = #{Credentials}::new( - "test", - "test", - #{None}, - #{None}, - "test", - ); - let config_override = crate::config::Config::builder() - .credentials_cache(#{CredentialsCache}::lazy()) - .credentials_provider(credentials.clone()); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config_layer, - config_override, - }; - let sut_layer = sut.config().unwrap(); - - // make sure `.provide_cached_credentials` returns credentials set through `config_override` - assert_eq!(credentials, - sut_layer - .load::<#{SharedCredentialsCache}>() - .unwrap() - .provide_cached_credentials() - .await - .unwrap() - ); - """, - *codegenScope, - ) - } - - unitTest("test_not_overriding_cache_and_provider_leads_to_no_shared_credentials_cache_in_layer") { - rustTemplate( - """ - use #{RuntimePlugin}; - - let client_config = crate::config::Config::builder().build(); - let config_override = crate::config::Config::builder(); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config.config().unwrap(), - config_override, - }; - let sut_layer = sut.config().unwrap(); - assert!(sut_layer - .load::<#{SharedCredentialsCache}>() - .is_none()); - """, - *codegenScope, - ) - } - } - } - } -} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt index b4056788532..aec0806d06f 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt @@ -5,18 +5,128 @@ package software.amazon.smithy.rustsdk -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode +import SdkCodegenIntegrationTest +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest +import software.amazon.smithy.rust.codegen.core.testutil.tokioTest internal class CredentialProviderConfigTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val codegenContext = awsTestCodegenContext().withSmithyRuntimeMode(smithyRuntimeMode) - validateConfigCustomizations(codegenContext, CredentialProviderConfig(codegenContext)) + @Test + fun `configuring credentials provider at operation level should work`() { + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate -> + val rc = ctx.runtimeConfig + val codegenScope = arrayOf( + *RuntimeType.preludeScope, + "capture_request" to RuntimeType.captureRequest(rc), + "Credentials" to AwsRuntimeType.awsCredentialTypesTestUtil(rc) + .resolve("Credentials"), + "Region" to AwsRuntimeType.awsTypes(rc).resolve("region::Region"), + ) + rustCrate.integrationTest("credentials_provider") { + // per https://github.com/awslabs/aws-sdk-rust/issues/901 + tokioTest("configuring_credentials_provider_at_operation_level_should_work") { + val moduleName = ctx.moduleUseName() + rustTemplate( + """ + let (http_client, _rx) = #{capture_request}(#{None}); + let client_config = $moduleName::Config::builder() + .http_client(http_client) + .build(); + + let client = $moduleName::Client::from_conf(client_config); + + let credentials = #{Credentials}::new( + "test", + "test", + #{None}, + #{None}, + "test", + ); + let operation_config_override = $moduleName::Config::builder() + .credentials_provider(credentials.clone()) + .region(#{Region}::new("us-west-2")); + + let _ = client + .some_operation() + .customize() + .config_override(operation_config_override) + .send() + .await + .expect("success"); + """, + *codegenScope, + ) + } + } + } + } + + @Test + fun `configuring credentials provider on builder should replace what was previously set`() { + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate -> + val rc = ctx.runtimeConfig + val codegenScope = arrayOf( + *RuntimeType.preludeScope, + "capture_request" to RuntimeType.captureRequest(rc), + "Credentials" to AwsRuntimeType.awsCredentialTypesTestUtil(rc) + .resolve("Credentials"), + "Region" to AwsRuntimeType.awsTypes(rc).resolve("region::Region"), + "SdkConfig" to AwsRuntimeType.awsTypes(rc).resolve("sdk_config::SdkConfig"), + "SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(rc) + .resolve("provider::SharedCredentialsProvider"), + ) + rustCrate.integrationTest("credentials_provider") { + // per https://github.com/awslabs/aws-sdk-rust/issues/973 + tokioTest("configuring_credentials_provider_on_builder_should_replace_what_was_previously_set") { + val moduleName = ctx.moduleUseName() + rustTemplate( + """ + let (http_client, rx) = #{capture_request}(#{None}); + + let replace_me = #{Credentials}::new( + "replace_me", + "replace_me", + #{None}, + #{None}, + "replace_me", + ); + let sdk_config = #{SdkConfig}::builder() + .credentials_provider( + #{SharedCredentialsProvider}::new(replace_me), + ) + .region(#{Region}::new("us-west-2")) + .build(); + + let expected = #{Credentials}::new( + "expected_credential", + "expected_credential", + #{None}, + #{None}, + "expected_credential", + ); + let conf = $moduleName::config::Builder::from(&sdk_config) + .http_client(http_client) + .credentials_provider(expected) + .build(); + + let client = $moduleName::Client::from_conf(conf); + + let _ = client + .some_operation() + .send() + .await + .expect("success"); + + let req = rx.expect_request(); + let auth_header = req.headers().get("AUTHORIZATION").unwrap(); + assert!(auth_header.contains("expected_credential"), "{auth_header}"); + """, + *codegenScope, + ) + } + } + } } } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt new file mode 100644 index 00000000000..68bfab92fef --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt @@ -0,0 +1,119 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class EndpointBuiltInsDecoratorTest { + private val endpointUrlModel = """ + namespace test + + use aws.api#service + use aws.auth#sigv4 + use aws.protocols#restJson1 + use smithy.rules#endpointRuleSet + + @service(sdkId: "dontcare") + @restJson1 + @sigv4(name: "dontcare") + @auth([sigv4]) + @endpointRuleSet({ + "version": "1.0" + "parameters": { + "endpoint": { "required": false, "type": "string", "builtIn": "SDK::Endpoint" }, + "region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + } + "rules": [ + { + "type": "endpoint" + "conditions": [ + {"fn": "isSet", "argv": [{"ref": "endpoint"}]}, + {"fn": "isSet", "argv": [{"ref": "region"}]} + ], + "endpoint": { + "url": "{endpoint}" + "properties": { + "authSchemes": [{"name": "sigv4","signingRegion": "{region}", "signingName": "dontcare"}] + } + } + }, + { + "type": "endpoint" + "conditions": [ + {"fn": "isSet", "argv": [{"ref": "region"}]}, + ], + "endpoint": { + "url": "https://WRONG/" + "properties": { + "authSchemes": [{"name": "sigv4", "signingRegion": "{region}", "signingName": "dontcare"}] + } + } + } + ] + }) + service TestService { + version: "2023-01-01", + operations: [SomeOperation] + } + + structure SomeOutput { + someAttribute: Long, + someVal: String + } + + @http(uri: "/SomeOperation", method: "GET") + @optionalAuth + operation SomeOperation { + output: SomeOutput + } + """.asSmithyModel() + + @Test + fun endpointUrlBuiltInWorksEndToEnd() { + awsSdkIntegrationTest(endpointUrlModel) { codegenContext, rustCrate -> + rustCrate.integrationTest("endpoint_url_built_in_works") { + val module = codegenContext.moduleUseName() + rustTemplate( + """ + use $module::{Config, Client, config::Region}; + + ##[#{tokio}::test] + async fn endpoint_url_built_in_works() { + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .uri("https://RIGHT/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap() + )], + ); + let config = Config::builder() + .http_client(http_client.clone()) + .region(Region::new("us-east-1")) + .endpoint_url("https://RIGHT") + .build(); + let client = Client::from_conf(config); + dbg!(client.some_operation().send().await).expect("success"); + http_client.assert_requests_match(&[]); + } + """, + "tokio" to CargoDependency.Tokio.toDevDependency().withFeature("rt").withFeature("macros").toType(), + "StaticReplayClient" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::StaticReplayClient"), + "ReplayEvent" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::ReplayEvent"), + "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + ) + } + } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt index 89e11618a6c..21494c8d58c 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt @@ -84,16 +84,16 @@ class EndpointsCredentialsTest { tokioTest("default_auth") { rustTemplate( """ - let (conn, rcvr) = #{capture_request}(None); + let (http_client, rcvr) = #{capture_request}(None); let conf = $moduleName::Config::builder() - .http_connector(conn) + .http_client(http_client) .region(#{Region}::new("us-west-2")) .credentials_provider(#{Credentials}::for_tests()) .build(); let client = $moduleName::Client::from_conf(conf); let _ = client.default_auth().send().await; let req = rcvr.expect_request(); - let auth_header = req.headers().get("AUTHORIZATION").unwrap().to_str().unwrap(); + let auth_header = req.headers().get("AUTHORIZATION").unwrap(); assert!(auth_header.contains("/us-west-2/foobaz/aws4_request"), "{}", auth_header); """, "capture_request" to RuntimeType.captureRequest(context.runtimeConfig), @@ -107,16 +107,16 @@ class EndpointsCredentialsTest { tokioTest("custom_auth") { rustTemplate( """ - let (conn, rcvr) = #{capture_request}(None); + let (http_client, rcvr) = #{capture_request}(None); let conf = $moduleName::Config::builder() - .http_connector(conn) + .http_client(http_client) .region(#{Region}::new("us-west-2")) .credentials_provider(#{Credentials}::for_tests()) .build(); let client = $moduleName::Client::from_conf(conf); - let _ = client.custom_auth().send().await; + let _ = dbg!(client.custom_auth().send().await); let req = rcvr.expect_request(); - let auth_header = req.headers().get("AUTHORIZATION").unwrap().to_str().unwrap(); + let auth_header = req.headers().get("AUTHORIZATION").unwrap(); assert!(auth_header.contains("/region-custom-auth/name-custom-auth/aws4_request"), "{}", auth_header); """, "capture_request" to RuntimeType.captureRequest(context.runtimeConfig), diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomizationTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomizationTest.kt deleted file mode 100644 index ca5e087b967..00000000000 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/HttpConnectorConfigCustomizationTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace - -class HttpConnectorConfigCustomizationTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val project = TestWorkspace.testProject() - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val codegenContext = awsTestCodegenContext().withSmithyRuntimeMode(smithyRuntimeMode) - validateConfigCustomizations(codegenContext, HttpConnectorConfigCustomization(codegenContext), project) - } -} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt new file mode 100644 index 00000000000..be0861a045b --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt @@ -0,0 +1,61 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk + +import SdkCodegenIntegrationTest +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class InvocationIdDecoratorTest { + @Test + fun customInvocationIdGenerator() { + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { context, rustCrate -> + val rc = context.runtimeConfig + val moduleName = context.moduleUseName() + rustCrate.integrationTest("custom_invocation_id") { + rustTemplate( + """ + ##[#{tokio}::test] + async fn custom_invocation_id() { + ##[derive(::std::fmt::Debug)] + struct TestIdGen; + impl #{InvocationIdGenerator} for TestIdGen { + fn generate(&self) -> #{Result}<#{Option}<#{InvocationId}>, #{BoxError}> { + #{Ok}(#{Some}(#{InvocationId}::new("custom".into()))) + } + } + + let (http_client, rx) = #{capture_request}(None); + let config = $moduleName::Config::builder() + .http_client(http_client) + .invocation_id_generator(TestIdGen) + .build(); + assert!(config.invocation_id_generator().is_some()); + + let client = $moduleName::Client::from_conf(config); + + let _ = dbg!(client.some_operation().send().await); + let request = rx.expect_request(); + assert_eq!("custom", request.headers().get("amz-sdk-invocation-id").unwrap()); + } + """, + *preludeScope, + "tokio" to CargoDependency.Tokio.toType(), + "InvocationIdGenerator" to AwsRuntimeType.awsRuntime(rc) + .resolve("invocation_id::InvocationIdGenerator"), + "InvocationId" to AwsRuntimeType.awsRuntime(rc) + .resolve("invocation_id::InvocationId"), + "BoxError" to RuntimeType.boxError(rc), + "capture_request" to RuntimeType.captureRequest(rc), + ) + } + } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt new file mode 100644 index 00000000000..91c7f6be91a --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt @@ -0,0 +1,71 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import software.amazon.smithy.model.Model +import software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput +import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rustsdk.endpoints.operationId + +class OperationInputTestGeneratorTests { + @Test + fun `finds operation shape by name`() { + val prefix = "\$version: \"2\"" + val operationModel = """ + $prefix + namespace operations + + operation Ping {} + """.trimIndent() + val serviceModel = """ + $prefix + namespace service + + use operations#Ping + + service MyService { + operations: [Ping] + } + """.trimIndent() + + val model = Model.assembler() + .discoverModels() + .addUnparsedModel("operation.smithy", operationModel) + .addUnparsedModel("main.smithy", serviceModel) + .assemble() + .unwrap() + + val context = testClientCodegenContext(model) + val testOperationInput = EndpointTestOperationInput.builder() + .operationName("Ping") + .build() + + val operationId = context.operationId(testOperationInput) + assertEquals("operations#Ping", operationId.toString()) + } + + @Test + fun `fails for operation name not found`() { + val model = """ + namespace test + operation Ping {} + service MyService { + operations: [Ping] + } + """.trimIndent().asSmithyModel() + + val context = testClientCodegenContext(model) + val testOperationInput = EndpointTestOperationInput.builder() + .operationName("Pong") + .build() + + assertThrows { context.operationId(testOperationInput) } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionDecoratorTest.kt new file mode 100644 index 00000000000..cc003fc0864 --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionDecoratorTest.kt @@ -0,0 +1,102 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import kotlin.io.path.readText + +class RegionDecoratorTest { + private val modelWithoutRegionParamOrSigV4AuthScheme = """ + namespace test + + use aws.api#service + use aws.protocols#awsJson1_0 + use smithy.rules#endpointRuleSet + + @awsJson1_0 + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": {} + }) + @service(sdkId: "dontcare") + service TestService { version: "2023-01-01", operations: [SomeOperation] } + structure SomeOutput { something: String } + operation SomeOperation { output: SomeOutput } + """.asSmithyModel() + + private val modelWithRegionParam = """ + namespace test + + use aws.api#service + use aws.protocols#awsJson1_0 + use smithy.rules#endpointRuleSet + + @awsJson1_0 + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": { + "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + } + }) + @service(sdkId: "dontcare") + service TestService { version: "2023-01-01", operations: [SomeOperation] } + structure SomeOutput { something: String } + operation SomeOperation { output: SomeOutput } + """.asSmithyModel() + + private val modelWithSigV4AuthScheme = """ + namespace test + + use aws.auth#sigv4 + use aws.api#service + use aws.protocols#awsJson1_0 + use smithy.rules#endpointRuleSet + + @auth([sigv4]) + @sigv4(name: "dontcare") + @awsJson1_0 + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": {} + }) + @service(sdkId: "dontcare") + service TestService { version: "2023-01-01", operations: [SomeOperation] } + structure SomeOutput { something: String } + operation SomeOperation { output: SomeOutput } + """.asSmithyModel() + + @Test + fun `models without region built-in params or SigV4 should not have configurable regions`() { + val path = awsSdkIntegrationTest(modelWithoutRegionParamOrSigV4AuthScheme) { _, _ -> + // it should generate and compile successfully + } + val configContents = path.resolve("src/config.rs").readText() + assertFalse(configContents.contains("fn set_region(")) + } + + @Test + fun `models with region built-in params should have configurable regions`() { + val path = awsSdkIntegrationTest(modelWithRegionParam) { _, _ -> + // it should generate and compile successfully + } + val configContents = path.resolve("src/config.rs").readText() + assertTrue(configContents.contains("fn set_region(")) + } + + @Test + fun `models with SigV4 should have configurable regions`() { + val path = awsSdkIntegrationTest(modelWithSigV4AuthScheme) { _, _ -> + // it should generate and compile successfully + } + val configContents = path.resolve("src/config.rs").readText() + assertTrue(configContents.contains("fn set_region(")) + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt index 1160f322efc..62312b3ae01 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt @@ -5,27 +5,18 @@ package software.amazon.smithy.rustsdk -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.rustSettings +import SdkCodegenIntegrationTest +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.testutil.unitTest internal class RegionProviderConfigTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val project = TestWorkspace.testProject() - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val codegenContext = awsTestCodegenContext( - settings = testClientRustSettings( - moduleName = project.rustSettings().moduleName, - runtimeConfig = AwsTestRuntimeConfig, - ), - ).withSmithyRuntimeMode(smithyRuntimeMode) - validateConfigCustomizations(codegenContext, RegionProviderConfig(codegenContext), project) + @Test + fun `generates a valid config`() { + awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { _ctx, crate -> + crate.unitTest { + rustTemplate("let conf: Option = None; let _reg: Option = conf.and_then(|c|c.region().cloned());") + } + } } } diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecoratorTest.kt new file mode 100644 index 00000000000..64f35d197fa --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecoratorTest.kt @@ -0,0 +1,64 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel + +class SigV4AuthDecoratorTest { + private val modelWithSigV4AuthScheme = """ + namespace test + + use aws.auth#sigv4 + use aws.api#service + use aws.protocols#restJson1 + use smithy.rules#endpointRuleSet + use aws.auth#unsignedPayload + use smithy.test#httpRequestTests + + @auth([sigv4]) + @sigv4(name: "dontcare") + @restJson1 + @endpointRuleSet({ + "version": "1.0", + "rules": [{ "type": "endpoint", "conditions": [], "endpoint": { "url": "https://example.com" } }], + "parameters": { + "endpoint": { "required": true, "type": "string", "builtIn": "SDK::Endpoint" }, + } + }) + @service(sdkId: "dontcare") + service TestService { version: "2023-01-01", operations: [SomeOperation] } + structure SomeOutput { something: String } + + structure SomeInput { + @httpPayload + something: Bytestream + } + + @streaming + blob Bytestream + + @httpRequestTests([{ + id: "unsignedPayload", + protocol: restJson1, + method: "POST", + uri: "/", + params: { + something: "hello" + }, + headers: { + "x-amz-content-sha256": "UNSIGNED-PAYLOAD", + }, + }]) + @unsignedPayload + @http(uri: "/", method: "POST") + operation SomeOperation { input: SomeInput, output: SomeOutput } + """.asSmithyModel() + + @Test + fun unsignedPayloadSetsCorrectHeader() { + awsSdkIntegrationTest(modelWithSigV4AuthScheme) { _, _ -> } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt deleted file mode 100644 index fae4da0386a..00000000000 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecoratorTest.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rustsdk - -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.aws.traits.auth.SigV4Trait -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.stubConfigProject -import software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest - -internal class SigV4SigningDecoratorTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val codegenContext = awsTestCodegenContext( - settings = testClientRustSettings( - runtimeConfig = AwsTestRuntimeConfig, - ), - ).withSmithyRuntimeMode(smithyRuntimeMode) - val project = stubConfigProject( - codegenContext, - SigV4SigningConfig( - codegenContext.runtimeConfig, - codegenContext.smithyRuntimeMode, - true, - SigV4Trait.builder().name("test-service").build(), - ), - TestWorkspace.testProject(), - ) - project.lib { - unitTest( - "signing_service_override", - """ - let conf = crate::config::Config::builder().build(); - assert_eq!(conf.signing_service(), "test-service"); - """, - ) - } - project.compileAndTest() - } -} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index 0dabd0033e6..ad08e25aebf 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -7,7 +7,6 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.model.Model import software.amazon.smithy.model.node.ObjectNode -import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest @@ -18,7 +17,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.util.letIf import java.io.File // In aws-sdk-codegen, the working dir when gradle runs tests is actually `./aws`. So, to find the smithy runtime, we need @@ -37,36 +35,36 @@ fun awsTestCodegenContext(model: Model? = null, settings: ClientRustSettings? = settings = settings ?: testClientRustSettings(runtimeConfig = AwsTestRuntimeConfig), ) -// TODO(enableNewSmithyRuntimeCleanup): Remove defaultToOrchestrator once the runtime switches to the orchestrator fun awsSdkIntegrationTest( model: Model, - defaultToOrchestrator: Boolean = false, + params: IntegrationTestParams = awsIntegrationTestParams(), test: (ClientCodegenContext, RustCrate) -> Unit = { _, _ -> }, ) = clientIntegrationTest( model, - IntegrationTestParams( - runtimeConfig = AwsTestRuntimeConfig, - additionalSettings = ObjectNode.builder().withMember( - "customizationConfig", - ObjectNode.builder() - .withMember( - "awsSdk", - ObjectNode.builder() - .withMember("generateReadme", false) - .withMember("integrationTestPath", "../sdk/integration-tests") - .build(), - ).build(), - ) - .withMember( - "codegen", - ObjectNode.builder() - .withMember("includeFluentClient", false) - .letIf(defaultToOrchestrator) { - it.withMember("enableNewSmithyRuntime", StringNode.from("orchestrator")) - } - .build(), - ).build(), - ), + awsIntegrationTestParams(), test = test, ) + +fun awsIntegrationTestParams() = IntegrationTestParams( + cargoCommand = "cargo test --features test-util behavior-version-latest", + runtimeConfig = AwsTestRuntimeConfig, + additionalSettings = ObjectNode.builder().withMember( + "customizationConfig", + ObjectNode.builder() + .withMember( + "awsSdk", + ObjectNode.builder() + .withMember("generateReadme", false) + .withMember("integrationTestPath", "../sdk/integration-tests") + .build(), + ).build(), + ) + .withMember( + "codegen", + ObjectNode.builder() + .withMember("includeFluentClient", false) + .withMember("includeEndpointUrlConfig", false) + .build(), + ).build(), +) diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt new file mode 100644 index 00000000000..1ecc0e650e2 --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt @@ -0,0 +1,45 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk.customize + +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test +import software.amazon.smithy.model.shapes.IntegerShape +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.traits.DefaultTrait +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.lookup +import software.amazon.smithy.rust.codegen.core.util.shapeId + +internal class RemoveDefaultsTest { + @Test + fun `defaults should be removed`() { + val removeDefaults = setOf( + "test#Bar".shapeId(), + "test#Foo\$baz".shapeId(), + ) + val baseModel = """ + namespace test + + structure Foo { + bar: Bar = 0 + baz: Integer = 0 + } + + @default(0) + integer Bar + + """.asSmithyModel(smithyVersion = "2.0") + val model = RemoveDefaults.processModel(baseModel, removeDefaults) + val barMember = model.lookup("test#Foo\$bar") + barMember.hasTrait() shouldBe false + val bazMember = model.lookup("test#Foo\$baz") + bazMember.hasTrait() shouldBe false + val root = model.lookup("test#Bar") + root.hasTrait() shouldBe false + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt index 51eba7fa861..ae919497f0f 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt @@ -6,15 +6,22 @@ package software.amazon.smithy.rustsdk.customize.ec2 import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.util.lookup internal class EC2MakePrimitivesOptionalTest { - @Test - fun `primitive shapes are boxed`() { + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + ) + fun `primitive shapes are boxed`(nullabilityCheckMode: NullableIndex.CheckMode) { val baseModel = """ namespace test structure Primitives { @@ -36,7 +43,7 @@ internal class EC2MakePrimitivesOptionalTest { val nullableIndex = NullableIndex(model) val struct = model.lookup("test#Primitives") struct.members().forEach { - nullableIndex.isMemberNullable(it, NullableIndex.CheckMode.CLIENT_ZERO_VALUE_V1) shouldBe true + nullableIndex.isMemberNullable(it, nullabilityCheckMode) shouldBe true } } } diff --git a/aws/sdk/aws-models/bedrock-runtime.json b/aws/sdk/aws-models/bedrock-runtime.json new file mode 100644 index 00000000000..571e87e4eb4 --- /dev/null +++ b/aws/sdk/aws-models/bedrock-runtime.json @@ -0,0 +1,1166 @@ +{ + "smithy": "2.0", + "shapes": { + "com.amazonaws.bedrockruntime#AccessDeniedException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The request is denied because of missing access permissions.

", + "smithy.api#error": "client", + "smithy.api#httpError": 403 + } + }, + "com.amazonaws.bedrockruntime#AmazonBedrockFrontendService": { + "type": "service", + "version": "2023-09-30", + "resources": [ + { + "target": "com.amazonaws.bedrockruntime#InferenceResource" + } + ], + "traits": { + "aws.api#service": { + "sdkId": "Bedrock Runtime", + "endpointPrefix": "bedrock-runtime", + "cloudTrailEventSource": "bedrock.amazonaws.com" + }, + "aws.auth#sigv4": { + "name": "bedrock" + }, + "aws.protocols#restJson1": {}, + "smithy.api#documentation": "

Describes the API operations for running inference using Bedrock models.

", + "smithy.api#title": "Amazon Bedrock Runtime", + "smithy.rules#endpointRuleSet": { + "version": "1.0", + "parameters": { + "Region": { + "builtIn": "AWS::Region", + "required": false, + "documentation": "The AWS region used to dispatch the request.", + "type": "String" + }, + "UseDualStack": { + "builtIn": "AWS::UseDualStack", + "required": true, + "default": false, + "documentation": "When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.", + "type": "Boolean" + }, + "UseFIPS": { + "builtIn": "AWS::UseFIPS", + "required": true, + "default": false, + "documentation": "When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.", + "type": "Boolean" + }, + "Endpoint": { + "builtIn": "SDK::Endpoint", + "required": false, + "documentation": "Override the endpoint used to send this request", + "type": "String" + } + }, + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "Invalid Configuration: FIPS and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [], + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "PartitionResult" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "rules": [ + { + "conditions": [], + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + }, + true + ] + } + ], + "rules": [ + { + "conditions": [], + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "rules": [ + { + "conditions": [], + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [], + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://bedrock-runtime.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" + } + ], + "type": "tree" + } + ] + }, + "smithy.rules#endpointTests": { + "testCases": [ + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime-fips.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://bedrock-runtime.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For custom endpoint with region set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with region not set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips enabled and dualstack disabled", + "expect": { + "error": "Invalid Configuration: FIPS and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips disabled and dualstack enabled", + "expect": { + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "Missing region", + "expect": { + "error": "Invalid Configuration: Missing Region" + } + } + ], + "version": "1.0" + } + } + }, + "com.amazonaws.bedrockruntime#Body": { + "type": "blob", + "traits": { + "smithy.api#length": { + "max": 25000000 + }, + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#InferenceResource": { + "type": "resource", + "operations": [ + { + "target": "com.amazonaws.bedrockruntime#InvokeModel" + }, + { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStream" + } + ] + }, + "com.amazonaws.bedrockruntime#InternalServerException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

An internal server error occurred. Retry your request.

", + "smithy.api#error": "server", + "smithy.api#httpError": 500 + } + }, + "com.amazonaws.bedrockruntime#InvokeModel": { + "type": "operation", + "input": { + "target": "com.amazonaws.bedrockruntime#InvokeModelRequest" + }, + "output": { + "target": "com.amazonaws.bedrockruntime#InvokeModelResponse" + }, + "errors": [ + { + "target": "com.amazonaws.bedrockruntime#AccessDeniedException" + }, + { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelNotReadyException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + }, + { + "target": "com.amazonaws.bedrockruntime#ResourceNotFoundException" + }, + { + "target": "com.amazonaws.bedrockruntime#ServiceQuotaExceededException" + }, + { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + { + "target": "com.amazonaws.bedrockruntime#ValidationException" + } + ], + "traits": { + "smithy.api#documentation": "

Invokes the specified Bedrock model to run inference using the input provided in the request body. \n You use InvokeModel to run inference for text models, image models, and embedding models.

\n

For more information, see Run inference in the Bedrock User Guide.

\n

For example requests, see Examples (after the Errors section).

", + "smithy.api#http": { + "code": 200, + "method": "POST", + "uri": "/model/{modelId}/invoke" + } + } + }, + "com.amazonaws.bedrockruntime#InvokeModelIdentifier": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 2048 + }, + "smithy.api#pattern": "^(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:(([0-9]{12}:custom-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}/[a-z0-9]{12})|(:foundation-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.]?[a-z0-9-]{1,63}))|([0-9]{12}:provisioned-model/[a-z0-9]{12})))|([a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.]?[a-z0-9-]{1,63}))|(([0-9a-zA-Z][_-]?)+)$" + } + }, + "com.amazonaws.bedrockruntime#InvokeModelRequest": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Input data in the format specified in the content-type request header. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the input data in the request. The default value is\n application/json.

", + "smithy.api#httpHeader": "Content-Type" + } + }, + "accept": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The desired MIME type of the inference body in the response. The default value is\n application/json.

", + "smithy.api#httpHeader": "Accept" + } + }, + "modelId": { + "target": "com.amazonaws.bedrockruntime#InvokeModelIdentifier", + "traits": { + "smithy.api#documentation": "

Identifier of the model.

", + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Inference response from the model in the format specified in the content-type header field. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the inference result.

", + "smithy.api#httpHeader": "Content-Type", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStream": { + "type": "operation", + "input": { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamRequest" + }, + "output": { + "target": "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamResponse" + }, + "errors": [ + { + "target": "com.amazonaws.bedrockruntime#AccessDeniedException" + }, + { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelNotReadyException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelStreamErrorException" + }, + { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + }, + { + "target": "com.amazonaws.bedrockruntime#ResourceNotFoundException" + }, + { + "target": "com.amazonaws.bedrockruntime#ServiceQuotaExceededException" + }, + { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + { + "target": "com.amazonaws.bedrockruntime#ValidationException" + } + ], + "traits": { + "smithy.api#documentation": "

Invoke the specified Bedrock model to run inference using the input provided.\n Return the response in a stream.

\n

For more information, see Run inference in the Bedrock User Guide.

\n

For an example request and response, see Examples (after the Errors section).

", + "smithy.api#http": { + "code": 200, + "method": "POST", + "uri": "/model/{modelId}/invoke-with-response-stream" + } + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamRequest": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#Body", + "traits": { + "smithy.api#documentation": "

Inference input in the format specified by the \n content-type. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the input data in the request. The default value is\n application/json.

", + "smithy.api#httpHeader": "Content-Type" + } + }, + "accept": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The desired MIME type of the inference body in the response. The default value is\n application/json.

", + "smithy.api#httpHeader": "X-Amzn-Bedrock-Accept" + } + }, + "modelId": { + "target": "com.amazonaws.bedrockruntime#InvokeModelIdentifier", + "traits": { + "smithy.api#documentation": "

Id of the model to invoke using the streaming request.

", + "smithy.api#httpLabel": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.amazonaws.bedrockruntime#ResponseStream", + "traits": { + "smithy.api#documentation": "

Inference response from the model in the format specified by Content-Type. To see the format and content of this field for different models, refer to Inference parameters.

", + "smithy.api#httpPayload": {}, + "smithy.api#required": {} + } + }, + "contentType": { + "target": "com.amazonaws.bedrockruntime#MimeType", + "traits": { + "smithy.api#documentation": "

The MIME type of the inference result.

", + "smithy.api#httpHeader": "X-Amzn-Bedrock-Content-Type", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.bedrockruntime#MimeType": { + "type": "string" + }, + "com.amazonaws.bedrockruntime#ModelErrorException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + }, + "originalStatusCode": { + "target": "com.amazonaws.bedrockruntime#StatusCode", + "traits": { + "smithy.api#documentation": "

The original status code.

" + } + }, + "resourceName": { + "target": "com.amazonaws.bedrockruntime#NonBlankString", + "traits": { + "smithy.api#documentation": "

The resource name.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

The request failed due to an error while processing the model.

", + "smithy.api#error": "client", + "smithy.api#httpError": 424 + } + }, + "com.amazonaws.bedrockruntime#ModelNotReadyException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The model specified in the request is not ready to serve inference requests.

", + "smithy.api#error": "client", + "smithy.api#httpError": 429 + } + }, + "com.amazonaws.bedrockruntime#ModelStreamErrorException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + }, + "originalStatusCode": { + "target": "com.amazonaws.bedrockruntime#StatusCode", + "traits": { + "smithy.api#documentation": "

The original status code.

" + } + }, + "originalMessage": { + "target": "com.amazonaws.bedrockruntime#NonBlankString", + "traits": { + "smithy.api#documentation": "

The original message.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

An error occurred while streaming the response.

", + "smithy.api#error": "client", + "smithy.api#httpError": 424 + } + }, + "com.amazonaws.bedrockruntime#ModelTimeoutException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The request took too long to process. Processing time exceeded the model timeout length.

", + "smithy.api#error": "client", + "smithy.api#httpError": 408 + } + }, + "com.amazonaws.bedrockruntime#NonBlankString": { + "type": "string", + "traits": { + "smithy.api#pattern": "^[\\s\\S]*$" + } + }, + "com.amazonaws.bedrockruntime#PartBody": { + "type": "blob", + "traits": { + "smithy.api#length": { + "max": 1000000 + }, + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#PayloadPart": { + "type": "structure", + "members": { + "bytes": { + "target": "com.amazonaws.bedrockruntime#PartBody", + "traits": { + "smithy.api#documentation": "

Base64-encoded bytes of payload data.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Payload content included in the response.

", + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.bedrockruntime#ResourceNotFoundException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The specified resource ARN was not found. Check the ARN and try your request again.

", + "smithy.api#error": "client", + "smithy.api#httpError": 404 + } + }, + "com.amazonaws.bedrockruntime#ResponseStream": { + "type": "union", + "members": { + "chunk": { + "target": "com.amazonaws.bedrockruntime#PayloadPart", + "traits": { + "smithy.api#documentation": "

Content included in the response.

" + } + }, + "internalServerException": { + "target": "com.amazonaws.bedrockruntime#InternalServerException" + }, + "modelStreamErrorException": { + "target": "com.amazonaws.bedrockruntime#ModelStreamErrorException" + }, + "validationException": { + "target": "com.amazonaws.bedrockruntime#ValidationException" + }, + "throttlingException": { + "target": "com.amazonaws.bedrockruntime#ThrottlingException" + }, + "modelTimeoutException": { + "target": "com.amazonaws.bedrockruntime#ModelTimeoutException" + } + }, + "traits": { + "smithy.api#documentation": "

Definition of content in the response stream.

", + "smithy.api#streaming": {} + } + }, + "com.amazonaws.bedrockruntime#ServiceQuotaExceededException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The number of requests exceeds the service quota. Resubmit your request later.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.bedrockruntime#StatusCode": { + "type": "integer", + "traits": { + "smithy.api#range": { + "min": 100, + "max": 599 + } + } + }, + "com.amazonaws.bedrockruntime#ThrottlingException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

The number of requests exceeds the limit. Resubmit your request later.

", + "smithy.api#error": "client", + "smithy.api#httpError": 429 + } + }, + "com.amazonaws.bedrockruntime#ValidationException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.bedrockruntime#NonBlankString" + } + }, + "traits": { + "smithy.api#documentation": "

Input validation failed. Check your request parameters and retry the request.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + } + } +} diff --git a/aws/sdk/aws-models/config.json b/aws/sdk/aws-models/config.json index f96f7b6f754..386955ec097 100644 --- a/aws/sdk/aws-models/config.json +++ b/aws/sdk/aws-models/config.json @@ -675,7 +675,7 @@ "configurationItemStatus": { "target": "com.amazonaws.configservice#ConfigurationItemStatus", "traits": { - "smithy.api#documentation": "

The configuration item status. The valid values are:

\n
    \n
  • \n

    OK – The resource configuration has been updated

    \n
  • \n
  • \n

    ResourceDiscovered – The resource was newly discovered

    \n
  • \n
  • \n

    ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
  • \n

    ResourceDeleted – The resource was deleted

    \n
  • \n
  • \n

    ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
\n \n

The CIs do not incur any cost.

\n
" + "smithy.api#documentation": "

The configuration item status. The valid values are:

\n
    \n
  • \n

    OK – The resource configuration has been updated

    \n
  • \n
  • \n

    ResourceDiscovered – The resource was newly discovered

    \n
  • \n
  • \n

    ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
  • \n

    ResourceDeleted – The resource was deleted

    \n
  • \n
  • \n

    ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
" } }, "configurationStateId": { @@ -1631,7 +1631,7 @@ "configurationItemStatus": { "target": "com.amazonaws.configservice#ConfigurationItemStatus", "traits": { - "smithy.api#documentation": "

The configuration item status. The valid values are:

\n
    \n
  • \n

    OK – The resource configuration has been updated

    \n
  • \n
  • \n

    ResourceDiscovered – The resource was newly discovered

    \n
  • \n
  • \n

    ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
  • \n

    ResourceDeleted – The resource was deleted

    \n
  • \n
  • \n

    ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
\n \n

The CIs do not incur any cost.

\n
" + "smithy.api#documentation": "

The configuration item status. The valid values are:

\n
    \n
  • \n

    OK – The resource configuration has been updated

    \n
  • \n
  • \n

    ResourceDiscovered – The resource was newly discovered

    \n
  • \n
  • \n

    ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
  • \n

    ResourceDeleted – The resource was deleted

    \n
  • \n
  • \n

    ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder excludes the recording of resources of this type

    \n
  • \n
" } }, "configurationStateId": { @@ -5271,7 +5271,7 @@ } }, "traits": { - "smithy.api#documentation": "

The configuration object for Config rule evaluation mode. The Supported valid values are Detective or Proactive.

" + "smithy.api#documentation": "

The configuration object for Config rule evaluation mode. The supported valid values are Detective or Proactive.

" } }, "com.amazonaws.configservice#EvaluationModes": { @@ -5465,7 +5465,7 @@ } }, "traits": { - "smithy.api#documentation": "

Specifies whether the configuration recorder excludes resource types from being recorded.\n\t\t\tUse the resourceTypes field to enter a comma-separated list of resource types to exclude as exemptions.

" + "smithy.api#documentation": "

Specifies whether the configuration recorder excludes certain resource types from being recorded.\n\t\t\tUse the resourceTypes field to enter a comma-separated list of resource types you want to exclude from recording.

\n

By default, when Config adds support for a new resource type in the Region where you set up the configuration recorder,\n\t\t\tincluding global resource types, Config starts recording resources of that type automatically.

\n \n

\n How to use\n

\n

To use this option, you must set the useOnly\n\t\t\t\tfield of RecordingStrategy\n\t\t\t\tto EXCLUSION_BY_RESOURCE_TYPES.

\n

Config will then record configuration changes for all supported resource types, except the resource types that you specify to exclude from being recorded.

\n

\n Globally recorded resources\n

\n

Unless specifically listed as exclusions,\n\t\t\t\tAWS::RDS::GlobalCluster will be recorded automatically in all supported Config Regions were the configuration recorder is enabled.\n\t\t\t\tIAM users, groups, roles, and customer managed policies will be recorded automatically in all enabled Config Regions where Config was available before February 2022.\n\t\t\t\tThis list does not include the following Regions:

\n
    \n
  • \n

    Asia Pacific (Hyderabad)

    \n
  • \n
  • \n

    Asia Pacific (Melbourne)

    \n
  • \n
  • \n

    Europe (Spain)

    \n
  • \n
  • \n

    Europe (Zurich)

    \n
  • \n
  • \n

    Israel (Tel Aviv)

    \n
  • \n
  • \n

    Middle East (UAE)

    \n
  • \n
\n
" } }, "com.amazonaws.configservice#ExecutionControls": { @@ -6902,7 +6902,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a list of ConfigurationItems for the specified resource.\n\t\t\tThe list contains details about each state of the resource\n\t\t\tduring the specified time interval. If you specified a retention\n\t\t\tperiod to retain your ConfigurationItems between a\n\t\t\tminimum of 30 days and a maximum of 7 years (2557 days), Config\n\t\t\treturns the ConfigurationItems for the specified\n\t\t\tretention period.

\n

The response is paginated. By default, Config returns a\n\t\t\tlimit of 10 configuration items per page. You can customize this\n\t\t\tnumber with the limit parameter. The response includes\n\t\t\ta nextToken string. To get the next page of results,\n\t\t\trun the request again and specify the string for the\n\t\t\t\tnextToken parameter.

\n \n

Each call to the API is limited to span a duration of seven\n\t\t\t\tdays. It is likely that the number of records returned is\n\t\t\t\tsmaller than the specified limit. In such cases,\n\t\t\t\tyou can make another call, using the\n\t\t\t\tnextToken.

\n
", + "smithy.api#documentation": "\n

For accurate reporting on the compliance status, you must record the AWS::Config::ResourceCompliance resource type.\n\t\t\tFor more information, see Selecting Which Resources Config Records.

\n
\n

Returns a list of ConfigurationItems for the specified resource.\n\t\t\tThe list contains details about each state of the resource\n\t\t\tduring the specified time interval. If you specified a retention\n\t\t\tperiod to retain your ConfigurationItems between a\n\t\t\tminimum of 30 days and a maximum of 7 years (2557 days), Config\n\t\t\treturns the ConfigurationItems for the specified\n\t\t\tretention period.

\n

The response is paginated. By default, Config returns a\n\t\t\tlimit of 10 configuration items per page. You can customize this\n\t\t\tnumber with the limit parameter. The response includes\n\t\t\ta nextToken string. To get the next page of results,\n\t\t\trun the request again and specify the string for the\n\t\t\t\tnextToken parameter.

\n \n

Each call to the API is limited to span a duration of seven\n\t\t\t\tdays. It is likely that the number of records returned is\n\t\t\t\tsmaller than the specified limit. In such cases,\n\t\t\t\tyou can make another call, using the\n\t\t\t\tnextToken.

\n
", "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6931,13 +6931,13 @@ "laterTime": { "target": "com.amazonaws.configservice#LaterTime", "traits": { - "smithy.api#documentation": "

The time stamp that indicates a later time. If not specified,\n\t\t\tcurrent time is taken.

" + "smithy.api#documentation": "

The chronologically latest time in the time range for which the history requested. If not specified,\n\t\t\tcurrent time is taken.

" } }, "earlierTime": { "target": "com.amazonaws.configservice#EarlierTime", "traits": { - "smithy.api#documentation": "

The time stamp that indicates an earlier time. If not\n\t\t\tspecified, the action returns paginated results that contain\n\t\t\tconfiguration items that start when the first configuration item was\n\t\t\trecorded.

" + "smithy.api#documentation": "

The chronologically earliest time in the time range for which the history requested. If not\n\t\t\tspecified, the action returns paginated results that contain\n\t\t\tconfiguration items that start when the first configuration item was\n\t\t\trecorded.

" } }, "chronologicalOrder": { @@ -9153,7 +9153,7 @@ } }, "traits": { - "smithy.api#documentation": "

organization custom rule metadata such as resource type, resource ID of Amazon Web Services resource, Lambda function ARN, \n\t\t\tand organization trigger types that trigger Config to evaluate your Amazon Web Services resources against a rule. \n\t\t\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.

" + "smithy.api#documentation": "

An object that specifies organization custom rule metadata such as resource type, resource ID of Amazon Web Services resource, Lambda function ARN, \n\t\t\tand organization trigger types that trigger Config to evaluate your Amazon Web Services resources against a rule. \n\t\t\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.

" } }, "com.amazonaws.configservice#OrganizationManagedRuleMetadata": { @@ -9210,7 +9210,7 @@ } }, "traits": { - "smithy.api#documentation": "

organization managed rule metadata such as resource type and ID of Amazon Web Services resource along with the rule identifier. \n\t\t\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.

" + "smithy.api#documentation": "

An object that specifies organization managed rule metadata such as resource type and ID of Amazon Web Services resource along with the rule identifier. \n\t\t\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.

" } }, "com.amazonaws.configservice#OrganizationResourceDetailedStatus": { @@ -9802,7 +9802,7 @@ "TemplateS3Uri": { "target": "com.amazonaws.configservice#TemplateS3Uri", "traits": { - "smithy.api#documentation": "

The location of the file containing the template body (s3://bucketname/prefix). The uri must point to a conformance pack template (max size: 300 KB) that is located in an Amazon S3 bucket in the same Region as the conformance pack.

\n \n

You must have access to read Amazon S3 bucket.

\n
" + "smithy.api#documentation": "

The location of the file containing the template body (s3://bucketname/prefix). The uri must point to a conformance pack template (max size: 300 KB) that is located in an Amazon S3 bucket in the same Region as the conformance pack.

\n \n

You must have access to read Amazon S3 bucket.\n\t\t\tIn addition, in order to ensure a successful deployment, the template object must not be in an archived storage class if this parameter is passed.

\n
" } }, "TemplateBody": { @@ -9889,7 +9889,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a delivery channel object to deliver configuration\n\t\t\tinformation to an Amazon S3 bucket and Amazon SNS topic.

\n

Before you can create a delivery channel, you must create a\n\t\t\tconfiguration recorder.

\n

You can use this action to change the Amazon S3 bucket or an\n\t\t\tAmazon SNS topic of the existing delivery channel. To change the\n\t\t\tAmazon S3 bucket or an Amazon SNS topic, call this action and\n\t\t\tspecify the changed values for the S3 bucket and the SNS topic. If\n\t\t\tyou specify a different value for either the S3 bucket or the SNS\n\t\t\ttopic, this action will keep the existing value for the parameter\n\t\t\tthat is not changed.

\n \n

You can have only one delivery channel per region in your\n\t\t\t\taccount.

\n
" + "smithy.api#documentation": "

Creates a delivery channel object to deliver configuration\n\t\t\tinformation and other compliance information to an Amazon S3 bucket and Amazon SNS topic.\n\t\t\tFor more information,\n\t\t\tsee Notifications that Config Sends to an Amazon SNS topic.

\n

Before you can create a delivery channel, you must create a\n\t\t\tconfiguration recorder.

\n

You can use this action to change the Amazon S3 bucket or an\n\t\t\tAmazon SNS topic of the existing delivery channel. To change the\n\t\t\tAmazon S3 bucket or an Amazon SNS topic, call this action and\n\t\t\tspecify the changed values for the S3 bucket and the SNS topic. If\n\t\t\tyou specify a different value for either the S3 bucket or the SNS\n\t\t\ttopic, this action will keep the existing value for the parameter\n\t\t\tthat is not changed.

\n \n

You can have only one delivery channel per region in your\n\t\t\t\taccount.

\n
" } }, "com.amazonaws.configservice#PutDeliveryChannelRequest": { @@ -10166,7 +10166,7 @@ "TemplateS3Uri": { "target": "com.amazonaws.configservice#TemplateS3Uri", "traits": { - "smithy.api#documentation": "

Location of file containing the template body. The uri must point to the conformance pack template\n\t\t\t(max size: 300 KB).

\n \n

You must have access to read Amazon S3 bucket.

\n
" + "smithy.api#documentation": "

Location of file containing the template body. The uri must point to the conformance pack template\n\t\t\t(max size: 300 KB).

\n \n

You must have access to read Amazon S3 bucket.\n\t\t\tIn addition, in order to ensure a successful deployment, the template object must not be in an archived storage class if this parameter is passed.

\n
" } }, "TemplateBody": { @@ -10435,7 +10435,6 @@ "RetentionPeriodInDays": { "target": "com.amazonaws.configservice#RetentionPeriodInDays", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

Number of days Config stores your historical\n\t\t\tinformation.

\n \n

Currently, only applicable to the configuration item\n\t\t\t\thistory.

\n
", "smithy.api#required": {} } @@ -10620,14 +10619,14 @@ "target": "com.amazonaws.configservice#AllSupported", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether Config records configuration changes for all supported regional resource types.

\n

If you set this field to true, when Config\n\t\t\tadds support for a new type of regional resource, Config starts recording resources of that type automatically.

\n

If you set this field to true,\n\t\t\tyou cannot enumerate specific resource types to record in the resourceTypes field of RecordingGroup, or to exclude in the resourceTypes field of ExclusionByResourceTypes.

" + "smithy.api#documentation": "

Specifies whether Config records configuration changes for all supported regionally recorded resource types.

\n

If you set this field to true, when Config\n\t\t\tadds support for a new regionally recorded resource type, Config starts recording resources of that type automatically.

\n

If you set this field to true,\n\t\t\tyou cannot enumerate specific resource types to record in the resourceTypes field of RecordingGroup, or to exclude in the resourceTypes field of ExclusionByResourceTypes.

\n \n

\n Region Availability\n

\n

Check Resource Coverage by Region Availability\n\t\t\t\tto see if a resource type is supported in the Amazon Web Services Region where you set up Config.

\n
" } }, "includeGlobalResourceTypes": { "target": "com.amazonaws.configservice#IncludeGlobalResourceTypes", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether Config records configuration changes for all supported global resources.

\n

Before you set this field to true,\n\t\t\tset the allSupported field of RecordingGroup to\n\t\t\ttrue. Optionally, you can set the useOnly field of RecordingStrategy to ALL_SUPPORTED_RESOURCE_TYPES.

\n

If you set this field to true, when Config\n\t\t\tadds support for a new type of global resource in the Region where you set up the configuration recorder, Config starts recording\n\t\t\tresources of that type automatically.

\n \n

If you set this field to false but list global resource types in the resourceTypes field of RecordingGroup,\n\t\t\tConfig will still record configuration changes for those specified resource types regardless of if you set the includeGlobalResourceTypes field to false.

\n

If you do not want to record configuration changes to global resource types, make sure to not list them in the resourceTypes field\n\t\t\tin addition to setting the includeGlobalResourceTypes field to false.

\n
" + "smithy.api#documentation": "

A legacy field which only applies to the globally recorded IAM resource types: IAM users, groups, roles, and customer managed policies.\n\t\t\tIf you select this option, these resource types will be recorded in all enabled Config regions where Config was available before February 2022.\n\t\t\tThis list does not include the following Regions:

\n
    \n
  • \n

    Asia Pacific (Hyderabad)

    \n
  • \n
  • \n

    Asia Pacific (Melbourne)

    \n
  • \n
  • \n

    Europe (Spain)

    \n
  • \n
  • \n

    Europe (Zurich)

    \n
  • \n
  • \n

    Israel (Tel Aviv)

    \n
  • \n
  • \n

    Middle East (UAE)

    \n
  • \n
\n \n

\n Aurora global clusters are automatically globally recorded\n

\n

The AWS::RDS::GlobalCluster resource type will be recorded in all supported Config Regions where the configuration recorder is enabled, even if includeGlobalResourceTypes is not set to true.\n\t\t\t\tincludeGlobalResourceTypes is a legacy field which only applies to IAM users, groups, roles, and customer managed policies.\n\t\t\t

\n

If you do not want to record AWS::RDS::GlobalCluster in all enabled Regions, use one of the following recording strategies:

\n
    \n
  1. \n

    \n Record all current and future resource types with exclusions (EXCLUSION_BY_RESOURCE_TYPES), or

    \n
  2. \n
  3. \n

    \n Record specific resource types (INCLUSION_BY_RESOURCE_TYPES).

    \n
  4. \n
\n

For more information, see Selecting Which Resources are Recorded in the Config developer guide.

\n
\n \n

\n Required and optional fields\n

\n

Before you set this field to true,\n\t\t\tset the allSupported field of RecordingGroup to\n\t\t\ttrue. Optionally, you can set the useOnly field of RecordingStrategy to ALL_SUPPORTED_RESOURCE_TYPES.

\n
\n \n

\n Overriding fields\n

\n

If you set this field to false but list globally recorded IAM resource types in the resourceTypes field of RecordingGroup,\n\t\t\tConfig will still record configuration changes for those specified resource types regardless of if you set the includeGlobalResourceTypes field to false.

\n

If you do not want to record configuration changes to the globally recorded IAM resource types (IAM users, groups, roles, and customer managed policies), make sure to not list them in the resourceTypes field\n\t\t\tin addition to setting the includeGlobalResourceTypes field to false.

\n
" } }, "resourceTypes": { @@ -10645,12 +10644,12 @@ "recordingStrategy": { "target": "com.amazonaws.configservice#RecordingStrategy", "traits": { - "smithy.api#documentation": "

An object that specifies the recording strategy for the configuration recorder.

\n
    \n
  • \n

    If you set the useOnly field of RecordingStrategy to ALL_SUPPORTED_RESOURCE_TYPES, Config records configuration changes for all supported regional resource types. You also must set the allSupported field of RecordingGroup to true. When Config adds support for a new type of regional resource, Config automatically starts recording resources of that type.

    \n
  • \n
  • \n

    If you set the useOnly field of RecordingStrategy to INCLUSION_BY_RESOURCE_TYPES, Config records configuration changes for only the resource types you specify in the resourceTypes field of RecordingGroup.

    \n
  • \n
  • \n

    If you set the useOnly field of RecordingStrategy to EXCLUSION_BY_RESOURCE_TYPES, Config records configuration changes for all supported resource types\n\t\t\t\texcept the resource types that you specify as exemptions to exclude from being recorded in the resourceTypes field of ExclusionByResourceTypes.

    \n
  • \n
\n \n

The recordingStrategy field is optional when you set the\n\t\t\tallSupported field of RecordingGroup to true.

\n

The recordingStrategy field is optional when you list resource types in the\n\t\t\t\tresourceTypes field of RecordingGroup.

\n

The recordingStrategy field is required if you list resource types to exclude from recording in the resourceTypes field of ExclusionByResourceTypes.

\n
\n \n

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

\n

For example, even if you set includeGlobalResourceTypes to false, global resource types will still be automatically\n\t\t\trecorded in this option unless those resource types are specifically listed as exemptions in the resourceTypes field of exclusionByResourceTypes.

\n

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy,\n\t\t\t\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\n\t\t\t\tConfig starts recording resources of that type automatically.

\n
" + "smithy.api#documentation": "

An object that specifies the recording strategy for the configuration recorder.

\n
    \n
  • \n

    If you set the useOnly field of RecordingStrategy to ALL_SUPPORTED_RESOURCE_TYPES, Config records configuration changes for all supported regionally recorded resource types. You also must set the allSupported field of RecordingGroup to true. When Config adds support for a new regionally recorded resource type, Config automatically starts recording resources of that type.

    \n
  • \n
  • \n

    If you set the useOnly field of RecordingStrategy to INCLUSION_BY_RESOURCE_TYPES, Config records configuration changes for only the resource types you specify in the resourceTypes field of RecordingGroup.

    \n
  • \n
  • \n

    If you set the useOnly field of RecordingStrategy to EXCLUSION_BY_RESOURCE_TYPES, Config records configuration changes for all supported resource types\n\t\t\t\texcept the resource types that you specify to exclude from being recorded in the resourceTypes field of ExclusionByResourceTypes.

    \n
  • \n
\n \n

\n Required and optional fields\n

\n

The recordingStrategy field is optional when you set the\n\t\t\tallSupported field of RecordingGroup to true.

\n

The recordingStrategy field is optional when you list resource types in the\n\t\t\t\tresourceTypes field of RecordingGroup.

\n

The recordingStrategy field is required if you list resource types to exclude from recording in the resourceTypes field of ExclusionByResourceTypes.

\n
\n \n

\n Overriding fields\n

\n

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

\n

For example, even if you set includeGlobalResourceTypes to false, globally recorded IAM resource types will still be automatically\n\t\t\trecorded in this option unless those resource types are specifically listed as exclusions in the resourceTypes field of exclusionByResourceTypes.

\n
\n \n

\n Global resources types and the resource exclusion recording strategy\n

\n

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy,\n\t\t\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\n\t\t\tConfig starts recording resources of that type automatically.

\n

In addition, unless specifically listed as exclusions,\n\t\t\t\tAWS::RDS::GlobalCluster will be recorded automatically in all supported Config Regions were the configuration recorder is enabled.\n\t\t\t\tIAM users, groups, roles, and customer managed policies will be recorded automatically in all enabled Config Regions where Config was available before February 2022.\n\t\t\t\tThis list does not include the following Regions:

\n
    \n
  • \n

    Asia Pacific (Hyderabad)

    \n
  • \n
  • \n

    Asia Pacific (Melbourne)

    \n
  • \n
  • \n

    Europe (Spain)

    \n
  • \n
  • \n

    Europe (Zurich)

    \n
  • \n
  • \n

    Israel (Tel Aviv)

    \n
  • \n
  • \n

    Middle East (UAE)

    \n
  • \n
\n
" } } }, "traits": { - "smithy.api#documentation": "

Specifies which resource types Config\n\t\t\trecords for configuration changes.\n\t\t\tIn the recording group, you specify whether you want to record all supported resource types or to include or exclude specific types of resources.

\n

By default, Config records configuration changes for all supported types of\n\t\t\t\tRegional resources that Config discovers in the\n\t\t\t\tAmazon Web Services Region in which it is running. Regional resources are tied to a\n\t\t\tRegion and can be used only in that Region. Examples of Regional resources are Amazon EC2 instances and Amazon EBS volumes.

\n

You can also have Config record supported types of global resources.\n\t\t\t\tGlobal resources are not tied to a specific Region and can be used in all Regions. The global\n\t\t\t\tresource types that Config supports include IAM users, groups, roles, and customer managed\n\t\t\t\tpolicies.

\n \n

Global resource types onboarded to Config recording after February 2022 will\n\t\t\t\tbe recorded only in the service's home Region for the commercial partition and\n\t\t\t\tAmazon Web Services GovCloud (US-West) for the Amazon Web Services GovCloud (US) partition. You can view the\n\t\t\t\tConfiguration Items for these new global resource types only in their home Region\n\t\t\t\tand Amazon Web Services GovCloud (US-West).

\n
\n

If you don't want Config to record all resources, you can specify which types of resources Config records with the resourceTypes parameter.

\n

For a list of supported resource types, see Supported Resource Types in the Config developer guide.

\n

For more information and a table of the Home Regions for Global Resource Types Onboarded after February 2022, see Selecting Which Resources Config Records in the Config developer guide.

" + "smithy.api#documentation": "

Specifies which resource types Config\n\t\t\trecords for configuration changes. By default, Config records configuration changes for all current and future supported resource types in the Amazon Web Services Region where you have enabled Config\n\t\t\t(excluding the globally recorded IAM resource types: IAM users, groups, roles, and customer managed policies).

\n

In the recording group, you specify whether you want to record all supported current and future supported resource types or to include or exclude specific resources types.\n\t\t\tFor a list of supported resource types, see Supported Resource Types in the Config developer guide.

\n

If you don't want Config to record all current and future supported resource types, use one of the following recording strategies:

\n
    \n
  1. \n

    \n Record all current and future resource types with exclusions (EXCLUSION_BY_RESOURCE_TYPES), or

    \n
  2. \n
  3. \n

    \n Record specific resource types (INCLUSION_BY_RESOURCE_TYPES).

    \n
  4. \n
\n \n

\n Aurora global clusters are automatically globally recorded\n

\n

The AWS::RDS::GlobalCluster resource type\n\t\t\t\twill be recorded in all supported Config Regions where the configuration recorder is enabled.

\n

If you do not want to record AWS::RDS::GlobalCluster in all enabled Regions, use the EXCLUSION_BY_RESOURCE_TYPES or INCLUSION_BY_RESOURCE_TYPES recording strategy.

\n
" } }, "com.amazonaws.configservice#RecordingStrategy": { @@ -10659,7 +10658,7 @@ "useOnly": { "target": "com.amazonaws.configservice#RecordingStrategyType", "traits": { - "smithy.api#documentation": "

The recording strategy for the configuration recorder.

\n
    \n
  • \n

    If you set this option to ALL_SUPPORTED_RESOURCE_TYPES, Config records configuration changes for all supported regional resource types. You also must set the allSupported field of RecordingGroup to true.

    \n

    When Config adds support for a new type of regional resource, Config automatically starts recording resources of that type. For a list of supported resource types,\n\t\t\t\tsee Supported Resource Types in the Config developer guide.

    \n
  • \n
  • \n

    If you set this option to INCLUSION_BY_RESOURCE_TYPES, Config records\n\t\t\t\t\tconfiguration changes for only the resource types that you specify in the\n\t\t\t\t\t\tresourceTypes field of RecordingGroup.

    \n
  • \n
  • \n

    If you set this option to EXCLUSION_BY_RESOURCE_TYPES, Config records\n\t\t\t\t\tconfiguration changes for all supported resource types, except the resource\n\t\t\t\t\ttypes that you specify as exemptions to exclude from being recorded in the\n\t\t\t\t\t\tresourceTypes field of ExclusionByResourceTypes.

    \n
  • \n
\n \n

The recordingStrategy field is optional when you set the\n\t\t\tallSupported field of RecordingGroup to true.

\n

The recordingStrategy field is optional when you list resource types in the\n\t\t\t\tresourceTypes field of RecordingGroup.

\n

The recordingStrategy field is required if you list resource types to exclude from recording in the resourceTypes field of ExclusionByResourceTypes.

\n
\n \n

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

\n

For example, even if you set includeGlobalResourceTypes to false, global resource types will still be automatically\n\t\t\trecorded in this option unless those resource types are specifically listed as exemptions in the resourceTypes field of exclusionByResourceTypes.

\n

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy,\n\t\t\t\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\n\t\t\t\tConfig starts recording resources of that type automatically.

\n
" + "smithy.api#documentation": "

The recording strategy for the configuration recorder.

\n
    \n
  • \n

    If you set this option to ALL_SUPPORTED_RESOURCE_TYPES, Config records configuration changes for all supported regionally recorded resource types.\n\t\t\t\tYou also must set the allSupported field of RecordingGroup to true.\n\t\t\t\tWhen Config adds support for a new regionally recorded resource type, Config automatically starts recording resources of that type. For a list of supported resource types,\n\t\t\t\tsee Supported Resource Types in the Config developer guide.

    \n
  • \n
  • \n

    If you set this option to INCLUSION_BY_RESOURCE_TYPES, Config records\n\t\t\t\t\tconfiguration changes for only the resource types that you specify in the\n\t\t\t\t\t\tresourceTypes field of RecordingGroup.

    \n
  • \n
  • \n

    If you set this option to EXCLUSION_BY_RESOURCE_TYPES, Config records\n\t\t\t\t\tconfiguration changes for all supported resource types, except the resource\n\t\t\t\t\ttypes that you specify to exclude from being recorded in the\n\t\t\t\t\t\tresourceTypes field of ExclusionByResourceTypes.

    \n
  • \n
\n \n

\n Required and optional fields\n

\n

The recordingStrategy field is optional when you set the\n\t\t\tallSupported field of RecordingGroup to true.

\n

The recordingStrategy field is optional when you list resource types in the\n\t\t\t\tresourceTypes field of RecordingGroup.

\n

The recordingStrategy field is required if you list resource types to exclude from recording in the resourceTypes field of ExclusionByResourceTypes.

\n
\n \n

\n Overriding fields\n

\n

If you choose EXCLUSION_BY_RESOURCE_TYPES for the recording strategy, the exclusionByResourceTypes field will override other properties in the request.

\n

For example, even if you set includeGlobalResourceTypes to false, globally recorded IAM resource types will still be automatically\n\t\t\trecorded in this option unless those resource types are specifically listed as exclusions in the resourceTypes field of exclusionByResourceTypes.

\n
\n \n

\n Global resource types and the exclusion recording strategy\n

\n

By default, if you choose the EXCLUSION_BY_RESOURCE_TYPES recording strategy,\n\t\t\t\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\n\t\t\t\tConfig starts recording resources of that type automatically.

\n

In addition, unless specifically listed as exclusions,\n\t\t\t\tAWS::RDS::GlobalCluster will be recorded automatically in all supported Config Regions were the configuration recorder is enabled.\n\t\t\t\tIAM users, groups, roles, and customer managed policies will be recorded automatically in all enabled Config Regions where Config was available before February 2022.\n\t\t\t\tThis list does not include the following Regions:

\n
    \n
  • \n

    Asia Pacific (Hyderabad)

    \n
  • \n
  • \n

    Asia Pacific (Melbourne)

    \n
  • \n
  • \n

    Europe (Spain)

    \n
  • \n
  • \n

    Europe (Zurich)

    \n
  • \n
  • \n

    Israel (Tel Aviv)

    \n
  • \n
  • \n

    Middle East (UAE)

    \n
  • \n
\n
" } } }, @@ -13333,277 +13332,725 @@ "traits": { "smithy.api#enumValue": "AWS::SageMaker::Image" } - } - } - }, - "com.amazonaws.configservice#ResourceTypeList": { - "type": "list", - "member": { - "target": "com.amazonaws.configservice#ResourceType" - } - }, - "com.amazonaws.configservice#ResourceTypeString": { - "type": "string", - "traits": { - "smithy.api#length": { - "min": 1, - "max": 196 - } - } - }, - "com.amazonaws.configservice#ResourceTypes": { - "type": "list", - "member": { - "target": "com.amazonaws.configservice#StringWithCharLimit256" - }, - "traits": { - "smithy.api#length": { - "min": 0, - "max": 20 - } - } - }, - "com.amazonaws.configservice#ResourceTypesScope": { - "type": "list", - "member": { - "target": "com.amazonaws.configservice#StringWithCharLimit256" - }, - "traits": { - "smithy.api#length": { - "min": 0, - "max": 100 - } - } - }, - "com.amazonaws.configservice#ResourceValue": { - "type": "structure", - "members": { - "Value": { - "target": "com.amazonaws.configservice#ResourceValueType", + }, + "ECSTaskSet": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The value is a resource ID.

", - "smithy.api#required": {} + "smithy.api#enumValue": "AWS::ECS::TaskSet" } - } - }, - "traits": { - "smithy.api#documentation": "

The dynamic value of the resource.

" - } - }, - "com.amazonaws.configservice#ResourceValueType": { - "type": "enum", - "members": { - "RESOURCE_ID": { + }, + "CassandraKeyspace": { "target": "smithy.api#Unit", "traits": { - "smithy.api#enumValue": "RESOURCE_ID" + "smithy.api#enumValue": "AWS::Cassandra::Keyspace" } - } - } - }, - "com.amazonaws.configservice#Results": { - "type": "list", - "member": { - "target": "com.amazonaws.configservice#String" - } - }, - "com.amazonaws.configservice#RetentionConfiguration": { - "type": "structure", - "members": { - "Name": { - "target": "com.amazonaws.configservice#RetentionConfigurationName", + }, + "SignerSigningProfile": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The name of the retention configuration object.

", - "smithy.api#required": {} + "smithy.api#enumValue": "AWS::Signer::SigningProfile" } }, - "RetentionPeriodInDays": { - "target": "com.amazonaws.configservice#RetentionPeriodInDays", + "AmplifyApp": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#default": 0, - "smithy.api#documentation": "

Number of days Config stores your historical information.

\n \n

Currently, only applicable to the configuration item history.

\n
", - "smithy.api#required": {} + "smithy.api#enumValue": "AWS::Amplify::App" } - } - }, - "traits": { - "smithy.api#documentation": "

An object with the name of the retention configuration and the retention period in days. The object stores the configuration for data retention in Config.

" - } - }, - "com.amazonaws.configservice#RetentionConfigurationList": { - "type": "list", - "member": { - "target": "com.amazonaws.configservice#RetentionConfiguration" - } - }, - "com.amazonaws.configservice#RetentionConfigurationName": { - "type": "string", - "traits": { - "smithy.api#length": { - "min": 1, - "max": 256 }, - "smithy.api#pattern": "^[\\w\\-]+$" - } - }, - "com.amazonaws.configservice#RetentionConfigurationNameList": { - "type": "list", - "member": { - "target": "com.amazonaws.configservice#RetentionConfigurationName" - }, - "traits": { - "smithy.api#length": { - "min": 0, - "max": 1 - } - } - }, - "com.amazonaws.configservice#RetentionPeriodInDays": { - "type": "integer", - "traits": { - "smithy.api#default": 0, - "smithy.api#range": { - "min": 30, - "max": 2557 - } - } - }, - "com.amazonaws.configservice#RuleLimit": { - "type": "integer", - "traits": { - "smithy.api#default": 0, - "smithy.api#range": { - "min": 0, - "max": 50 - } - } - }, - "com.amazonaws.configservice#SSMDocumentName": { - "type": "string", - "traits": { - "smithy.api#pattern": "^[a-zA-Z0-9_\\-.:/]{3,200}$" - } - }, - "com.amazonaws.configservice#SSMDocumentVersion": { - "type": "string", - "traits": { - "smithy.api#pattern": "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$" - } - }, - "com.amazonaws.configservice#SchemaVersionId": { - "type": "string", - "traits": { - "smithy.api#length": { - "min": 1, - "max": 128 + "AppMeshVirtualNode": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualNode" + } }, - "smithy.api#pattern": "^[A-Za-z0-9-]+$" - } - }, - "com.amazonaws.configservice#Scope": { - "type": "structure", - "members": { - "ComplianceResourceTypes": { - "target": "com.amazonaws.configservice#ComplianceResourceTypes", + "AppMeshVirtualService": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The resource types of only those Amazon Web Services resources that you want to\n\t\t\ttrigger an evaluation for the rule. You can only specify one type if\n\t\t\tyou also specify a resource ID for\n\t\t\tComplianceResourceId.

" + "smithy.api#enumValue": "AWS::AppMesh::VirtualService" } }, - "TagKey": { - "target": "com.amazonaws.configservice#StringWithCharLimit128", + "AppRunnerVpcConnector": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The tag key that is applied to only those Amazon Web Services resources that\n\t\t\tyou want to trigger an evaluation for the rule.

" + "smithy.api#enumValue": "AWS::AppRunner::VpcConnector" } }, - "TagValue": { - "target": "com.amazonaws.configservice#StringWithCharLimit256", + "AppStreamApplication": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The tag value applied to only those Amazon Web Services resources that you want\n\t\t\tto trigger an evaluation for the rule. If you specify a value for\n\t\t\t\tTagValue, you must also specify a value for\n\t\t\t\tTagKey.

" + "smithy.api#enumValue": "AWS::AppStream::Application" } }, - "ComplianceResourceId": { - "target": "com.amazonaws.configservice#BaseResourceId", + "CodeArtifactRepository": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The ID of the only Amazon Web Services resource that you want to trigger an\n\t\t\tevaluation for the rule. If you specify a resource ID, you must\n\t\t\tspecify one resource type for\n\t\t\tComplianceResourceTypes.

" + "smithy.api#enumValue": "AWS::CodeArtifact::Repository" } - } - }, - "traits": { - "smithy.api#documentation": "

Defines which resources trigger an evaluation for an Config\n\t\t\trule. The scope can include one or more resource types, a\n\t\t\tcombination of a tag key and value, or a combination of one resource\n\t\t\ttype and one resource ID. Specify a scope to constrain which\n\t\t\tresources trigger an evaluation for a rule. Otherwise, evaluations\n\t\t\tfor the rule are triggered when any resource in your recording group\n\t\t\tchanges in configuration.

" - } - }, - "com.amazonaws.configservice#SelectAggregateResourceConfig": { - "type": "operation", - "input": { - "target": "com.amazonaws.configservice#SelectAggregateResourceConfigRequest" - }, - "output": { - "target": "com.amazonaws.configservice#SelectAggregateResourceConfigResponse" - }, - "errors": [ - { - "target": "com.amazonaws.configservice#InvalidExpressionException" }, - { - "target": "com.amazonaws.configservice#InvalidLimitException" + "EC2PrefixList": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::PrefixList" + } }, - { - "target": "com.amazonaws.configservice#InvalidNextTokenException" + "EC2SpotFleet": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::SpotFleet" + } }, - { - "target": "com.amazonaws.configservice#NoSuchConfigurationAggregatorException" - } - ], - "traits": { - "smithy.api#documentation": "

Accepts a structured query language (SQL) SELECT command and an aggregator to query configuration state of Amazon Web Services resources across multiple accounts and regions, \n\t\t\tperforms the corresponding search, and returns resource configurations matching the properties.

\n

For more information about query components, see the \n\t\t\t\n Query Components\n section in the Config Developer Guide.

\n \n

If you run an aggregation query (i.e., using GROUP BY or using aggregate functions such as COUNT; e.g., SELECT resourceId, COUNT(*) WHERE resourceType = 'AWS::IAM::Role' GROUP BY resourceId)\n\t\t\t\tand do not specify the MaxResults or the Limit query parameters, the default page size is set to 500.

\n

If you run a non-aggregation query (i.e., not using GROUP BY or aggregate function; e.g., SELECT * WHERE resourceType = 'AWS::IAM::Role')\n\t\t\t\tand do not specify the MaxResults or the Limit query parameters, the default page size is set to 25.

\n
", - "smithy.api#paginated": { - "inputToken": "NextToken", - "outputToken": "NextToken", - "items": "Results", - "pageSize": "Limit" - } - } - }, - "com.amazonaws.configservice#SelectAggregateResourceConfigRequest": { - "type": "structure", - "members": { - "Expression": { - "target": "com.amazonaws.configservice#Expression", + "EvidentlyProject": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The SQL query SELECT command.

", - "smithy.api#required": {} + "smithy.api#enumValue": "AWS::Evidently::Project" } }, - "ConfigurationAggregatorName": { - "target": "com.amazonaws.configservice#ConfigurationAggregatorName", + "ForecastDataset": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The name of the configuration aggregator.

", - "smithy.api#required": {} + "smithy.api#enumValue": "AWS::Forecast::Dataset" } }, - "Limit": { - "target": "com.amazonaws.configservice#Limit", + "IAMSAMLProvider": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#default": 0, - "smithy.api#documentation": "

The maximum number of query results returned on each page.

" + "smithy.api#enumValue": "AWS::IAM::SAMLProvider" } }, - "MaxResults": { - "target": "com.amazonaws.configservice#Limit", + "IAMServerCertificate": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#default": 0, - "smithy.api#documentation": "

The maximum number of query results returned on each page. Config also allows the Limit request parameter.

" + "smithy.api#enumValue": "AWS::IAM::ServerCertificate" } }, - "NextToken": { - "target": "com.amazonaws.configservice#NextToken", + "PinpointCampaign": { + "target": "smithy.api#Unit", "traits": { - "smithy.api#documentation": "

The nextToken string returned in a previous request that you use to request the next page of results in a paginated response.

" + "smithy.api#enumValue": "AWS::Pinpoint::Campaign" } - } - }, - "traits": { - "smithy.api#input": {} + }, + "PinpointInAppTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::InAppTemplate" + } + }, + "SageMakerDomain": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::SageMaker::Domain" + } + }, + "TransferAgreement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Transfer::Agreement" + } + }, + "TransferConnector": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Transfer::Connector" + } + }, + "KinesisFirehoseDeliveryStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::KinesisFirehose::DeliveryStream" + } + }, + "AmplifyBranch": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Amplify::Branch" + } + }, + "AppIntegrationsEventIntegration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppIntegrations::EventIntegration" + } + }, + "AppMeshRoute": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::Route" + } + }, + "AthenaPreparedStatement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Athena::PreparedStatement" + } + }, + "EC2IPAMScope": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::IPAMScope" + } + }, + "EvidentlyLaunch": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Evidently::Launch" + } + }, + "ForecastDatasetGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Forecast::DatasetGroup" + } + }, + "GreengrassV2ComponentVersion": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::GreengrassV2::ComponentVersion" + } + }, + "GroundStationMissionProfile": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::GroundStation::MissionProfile" + } + }, + "MediaConnectFlowEntitlement": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaConnect::FlowEntitlement" + } + }, + "MediaConnectFlowVpcInterface": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaConnect::FlowVpcInterface" + } + }, + "MediaTailorPlaybackConfiguration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaTailor::PlaybackConfiguration" + } + }, + "MSKConfiguration": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MSK::Configuration" + } + }, + "PersonalizeDataset": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Dataset" + } + }, + "PersonalizeSchema": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Schema" + } + }, + "PersonalizeSolution": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::Solution" + } + }, + "PinpointEmailTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EmailTemplate" + } + }, + "PinpointEventStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EventStream" + } + }, + "ResilienceHubApp": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ResilienceHub::App" + } + }, + "ACMPCACertificateAuthority": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ACMPCA::CertificateAuthority" + } + }, + "AppConfigHostedConfigurationVersion": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppConfig::HostedConfigurationVersion" + } + }, + "AppMeshVirtualGateway": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualGateway" + } + }, + "AppMeshVirtualRouter": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppMesh::VirtualRouter" + } + }, + "AppRunnerService": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppRunner::Service" + } + }, + "CustomerProfilesObjectType": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CustomerProfiles::ObjectType" + } + }, + "DMSEndpoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::DMS::Endpoint" + } + }, + "EC2CapacityReservation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::CapacityReservation" + } + }, + "EC2ClientVpnEndpoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::EC2::ClientVpnEndpoint" + } + }, + "KendraIndex": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Kendra::Index" + } + }, + "KinesisVideoStream": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::KinesisVideo::Stream" + } + }, + "LogsDestination": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Logs::Destination" + } + }, + "PinpointEmailChannel": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Pinpoint::EmailChannel" + } + }, + "S3AccessPoint": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::S3::AccessPoint" + } + }, + "NetworkManagerCustomerGatewayAssociation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::NetworkManager::CustomerGatewayAssociation" + } + }, + "NetworkManagerLinkAssociation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::NetworkManager::LinkAssociation" + } + }, + "IoTWirelessMulticastGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoTWireless::MulticastGroup" + } + }, + "PersonalizeDatasetGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Personalize::DatasetGroup" + } + }, + "IoTTwinMakerComponentType": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoTTwinMaker::ComponentType" + } + }, + "CodeBuildReportGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CodeBuild::ReportGroup" + } + }, + "SageMakerFeatureGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::SageMaker::FeatureGroup" + } + }, + "MSKBatchScramSecret": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MSK::BatchScramSecret" + } + }, + "AppStreamStack": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::AppStream::Stack" + } + }, + "IoTJobTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoT::JobTemplate" + } + }, + "IoTWirelessFuotaTask": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoTWireless::FuotaTask" + } + }, + "IoTProvisioningTemplate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::IoT::ProvisioningTemplate" + } + }, + "InspectorV2Filter": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::InspectorV2::Filter" + } + }, + "Route53ResolverResolverQueryLoggingConfigAssociation": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation" + } + }, + "ServiceDiscoveryInstance": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::ServiceDiscovery::Instance" + } + }, + "TransferCertificate": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Transfer::Certificate" + } + }, + "MediaConnectFlowSource": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::MediaConnect::FlowSource" + } + }, + "APSRuleGroupsNamespace": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::APS::RuleGroupsNamespace" + } + }, + "CodeGuruProfilerProfilingGroup": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::CodeGuruProfiler::ProfilingGroup" + } + }, + "Route53ResolverResolverQueryLoggingConfig": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Route53Resolver::ResolverQueryLoggingConfig" + } + }, + "BatchSchedulingPolicy": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AWS::Batch::SchedulingPolicy" + } + } + } + }, + "com.amazonaws.configservice#ResourceTypeList": { + "type": "list", + "member": { + "target": "com.amazonaws.configservice#ResourceType" + } + }, + "com.amazonaws.configservice#ResourceTypeString": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 196 + } + } + }, + "com.amazonaws.configservice#ResourceTypes": { + "type": "list", + "member": { + "target": "com.amazonaws.configservice#StringWithCharLimit256" + }, + "traits": { + "smithy.api#length": { + "min": 0, + "max": 20 + } + } + }, + "com.amazonaws.configservice#ResourceTypesScope": { + "type": "list", + "member": { + "target": "com.amazonaws.configservice#StringWithCharLimit256" + }, + "traits": { + "smithy.api#length": { + "min": 0, + "max": 100 + } + } + }, + "com.amazonaws.configservice#ResourceValue": { + "type": "structure", + "members": { + "Value": { + "target": "com.amazonaws.configservice#ResourceValueType", + "traits": { + "smithy.api#documentation": "

The value is a resource ID.

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#documentation": "

The dynamic value of the resource.

" + } + }, + "com.amazonaws.configservice#ResourceValueType": { + "type": "enum", + "members": { + "RESOURCE_ID": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "RESOURCE_ID" + } + } + } + }, + "com.amazonaws.configservice#Results": { + "type": "list", + "member": { + "target": "com.amazonaws.configservice#String" + } + }, + "com.amazonaws.configservice#RetentionConfiguration": { + "type": "structure", + "members": { + "Name": { + "target": "com.amazonaws.configservice#RetentionConfigurationName", + "traits": { + "smithy.api#documentation": "

The name of the retention configuration object.

", + "smithy.api#required": {} + } + }, + "RetentionPeriodInDays": { + "target": "com.amazonaws.configservice#RetentionPeriodInDays", + "traits": { + "smithy.api#documentation": "

Number of days Config stores your historical information.

\n \n

Currently, only applicable to the configuration item history.

\n
", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#documentation": "

An object with the name of the retention configuration and the retention period in days. The object stores the configuration for data retention in Config.

" + } + }, + "com.amazonaws.configservice#RetentionConfigurationList": { + "type": "list", + "member": { + "target": "com.amazonaws.configservice#RetentionConfiguration" + } + }, + "com.amazonaws.configservice#RetentionConfigurationName": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 256 + }, + "smithy.api#pattern": "^[\\w\\-]+$" + } + }, + "com.amazonaws.configservice#RetentionConfigurationNameList": { + "type": "list", + "member": { + "target": "com.amazonaws.configservice#RetentionConfigurationName" + }, + "traits": { + "smithy.api#length": { + "min": 0, + "max": 1 + } + } + }, + "com.amazonaws.configservice#RetentionPeriodInDays": { + "type": "integer", + "traits": { + "smithy.api#range": { + "min": 30, + "max": 2557 + } + } + }, + "com.amazonaws.configservice#RuleLimit": { + "type": "integer", + "traits": { + "smithy.api#default": 0, + "smithy.api#range": { + "min": 0, + "max": 50 + } + } + }, + "com.amazonaws.configservice#SSMDocumentName": { + "type": "string", + "traits": { + "smithy.api#pattern": "^[a-zA-Z0-9_\\-.:/]{3,200}$" + } + }, + "com.amazonaws.configservice#SSMDocumentVersion": { + "type": "string", + "traits": { + "smithy.api#pattern": "^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$" + } + }, + "com.amazonaws.configservice#SchemaVersionId": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 128 + }, + "smithy.api#pattern": "^[A-Za-z0-9-]+$" + } + }, + "com.amazonaws.configservice#Scope": { + "type": "structure", + "members": { + "ComplianceResourceTypes": { + "target": "com.amazonaws.configservice#ComplianceResourceTypes", + "traits": { + "smithy.api#documentation": "

The resource types of only those Amazon Web Services resources that you want to\n\t\t\ttrigger an evaluation for the rule. You can only specify one type if\n\t\t\tyou also specify a resource ID for\n\t\t\tComplianceResourceId.

" + } + }, + "TagKey": { + "target": "com.amazonaws.configservice#StringWithCharLimit128", + "traits": { + "smithy.api#documentation": "

The tag key that is applied to only those Amazon Web Services resources that\n\t\t\tyou want to trigger an evaluation for the rule.

" + } + }, + "TagValue": { + "target": "com.amazonaws.configservice#StringWithCharLimit256", + "traits": { + "smithy.api#documentation": "

The tag value applied to only those Amazon Web Services resources that you want\n\t\t\tto trigger an evaluation for the rule. If you specify a value for\n\t\t\t\tTagValue, you must also specify a value for\n\t\t\t\tTagKey.

" + } + }, + "ComplianceResourceId": { + "target": "com.amazonaws.configservice#BaseResourceId", + "traits": { + "smithy.api#documentation": "

The ID of the only Amazon Web Services resource that you want to trigger an\n\t\t\tevaluation for the rule. If you specify a resource ID, you must\n\t\t\tspecify one resource type for\n\t\t\tComplianceResourceTypes.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Defines which resources trigger an evaluation for an Config\n\t\t\trule. The scope can include one or more resource types, a\n\t\t\tcombination of a tag key and value, or a combination of one resource\n\t\t\ttype and one resource ID. Specify a scope to constrain which\n\t\t\tresources trigger an evaluation for a rule. Otherwise, evaluations\n\t\t\tfor the rule are triggered when any resource in your recording group\n\t\t\tchanges in configuration.

" + } + }, + "com.amazonaws.configservice#SelectAggregateResourceConfig": { + "type": "operation", + "input": { + "target": "com.amazonaws.configservice#SelectAggregateResourceConfigRequest" + }, + "output": { + "target": "com.amazonaws.configservice#SelectAggregateResourceConfigResponse" + }, + "errors": [ + { + "target": "com.amazonaws.configservice#InvalidExpressionException" + }, + { + "target": "com.amazonaws.configservice#InvalidLimitException" + }, + { + "target": "com.amazonaws.configservice#InvalidNextTokenException" + }, + { + "target": "com.amazonaws.configservice#NoSuchConfigurationAggregatorException" + } + ], + "traits": { + "smithy.api#documentation": "

Accepts a structured query language (SQL) SELECT command and an aggregator to query configuration state of Amazon Web Services resources across multiple accounts and regions, \n\t\t\tperforms the corresponding search, and returns resource configurations matching the properties.

\n

For more information about query components, see the \n\t\t\t\n Query Components\n section in the Config Developer Guide.

\n \n

If you run an aggregation query (i.e., using GROUP BY or using aggregate functions such as COUNT; e.g., SELECT resourceId, COUNT(*) WHERE resourceType = 'AWS::IAM::Role' GROUP BY resourceId)\n\t\t\t\tand do not specify the MaxResults or the Limit query parameters, the default page size is set to 500.

\n

If you run a non-aggregation query (i.e., not using GROUP BY or aggregate function; e.g., SELECT * WHERE resourceType = 'AWS::IAM::Role')\n\t\t\t\tand do not specify the MaxResults or the Limit query parameters, the default page size is set to 25.

\n
", + "smithy.api#paginated": { + "inputToken": "NextToken", + "outputToken": "NextToken", + "items": "Results", + "pageSize": "Limit" + } + } + }, + "com.amazonaws.configservice#SelectAggregateResourceConfigRequest": { + "type": "structure", + "members": { + "Expression": { + "target": "com.amazonaws.configservice#Expression", + "traits": { + "smithy.api#documentation": "

The SQL query SELECT command.

", + "smithy.api#required": {} + } + }, + "ConfigurationAggregatorName": { + "target": "com.amazonaws.configservice#ConfigurationAggregatorName", + "traits": { + "smithy.api#documentation": "

The name of the configuration aggregator.

", + "smithy.api#required": {} + } + }, + "Limit": { + "target": "com.amazonaws.configservice#Limit", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

The maximum number of query results returned on each page.

" + } + }, + "MaxResults": { + "target": "com.amazonaws.configservice#Limit", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

The maximum number of query results returned on each page. Config also allows the Limit request parameter.

" + } + }, + "NextToken": { + "target": "com.amazonaws.configservice#NextToken", + "traits": { + "smithy.api#documentation": "

The nextToken string returned in a previous request that you use to request the next page of results in a paginated response.

" + } + } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.configservice#SelectAggregateResourceConfigResponse": { @@ -14127,6 +14574,7 @@ "arnNamespace": "config", "cloudFormationName": "Config", "cloudTrailEventSource": "configservice.amazonaws.com", + "docId": "config-2014-11-12", "endpointPrefix": "config" }, "aws.auth#sigv4": { @@ -14180,7 +14628,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -14198,318 +14645,283 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://config-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://config-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://config.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" }, - { - "conditions": [], - "endpoint": { - "url": "https://config-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "aws-us-gov" ] } - ] + ], + "endpoint": { + "url": "https://config.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://config-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://config.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://config.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://config.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://config.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, diff --git a/aws/sdk/aws-models/dynamodb.json b/aws/sdk/aws-models/dynamodb.json index 7c5a2d76787..c47b042f527 100644 --- a/aws/sdk/aws-models/dynamodb.json +++ b/aws/sdk/aws-models/dynamodb.json @@ -790,7 +790,7 @@ "Responses": { "target": "com.amazonaws.dynamodb#PartiQLBatchResponse", "traits": { - "smithy.api#documentation": "

The response to each PartiQL statement in the batch.

" + "smithy.api#documentation": "

The response to each PartiQL statement in the batch. The values of the list are \n ordered according to the ordering of the request statements.

" } }, "ConsumedCapacity": { @@ -833,7 +833,67 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The BatchGetItem operation returns the attributes of one or more items\n from one or more tables. You identify requested items by primary key.

\n

A single operation can retrieve up to 16 MB of data, which can contain as many as 100\n items. BatchGetItem returns a partial result if the response size limit is\n exceeded, the table's provisioned throughput is exceeded, more than 1MB per partition is requested,\n or an internal processing failure occurs. If a partial result is returned, the operation returns a value for\n UnprocessedKeys. You can use this value to retry the operation starting\n with the next item to get.

\n \n

If you request more than 100 items, BatchGetItem returns a\n ValidationException with the message \"Too many items requested for\n the BatchGetItem call.\"

\n
\n

For example, if you ask to retrieve 100 items, but each individual item is 300 KB in\n size, the system returns 52 items (so as not to exceed the 16 MB limit). It also returns\n an appropriate UnprocessedKeys value so you can get the next page of\n results. If desired, your application can include its own logic to assemble the pages of\n results into one dataset.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchGetItem returns a\n ProvisionedThroughputExceededException. If at least\n one of the items is successfully processed, then\n BatchGetItem completes successfully, while returning the keys of the\n unread items in UnprocessedKeys.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

By default, BatchGetItem performs eventually consistent reads on every\n table in the request. If you want strongly consistent reads instead, you can set\n ConsistentRead to true for any or all tables.

\n

In order to minimize response latency, BatchGetItem may retrieve items in\n parallel.

\n

When designing your application, keep in mind that DynamoDB does not return items in\n any particular order. To help parse the response by item, include the primary key values\n for the items in your request in the ProjectionExpression parameter.

\n

If a requested item does not exist, it is not returned in the result. Requests for\n nonexistent items consume the minimum read capacity units according to the type of read.\n For more information, see Working with Tables in the Amazon DynamoDB Developer\n Guide.

" + "smithy.api#documentation": "

The BatchGetItem operation returns the attributes of one or more items\n from one or more tables. You identify requested items by primary key.

\n

A single operation can retrieve up to 16 MB of data, which can contain as many as 100\n items. BatchGetItem returns a partial result if the response size limit is\n exceeded, the table's provisioned throughput is exceeded, more than 1MB per partition is requested,\n or an internal processing failure occurs. If a partial result is returned, the operation returns a value for\n UnprocessedKeys. You can use this value to retry the operation starting\n with the next item to get.

\n \n

If you request more than 100 items, BatchGetItem returns a\n ValidationException with the message \"Too many items requested for\n the BatchGetItem call.\"

\n
\n

For example, if you ask to retrieve 100 items, but each individual item is 300 KB in\n size, the system returns 52 items (so as not to exceed the 16 MB limit). It also returns\n an appropriate UnprocessedKeys value so you can get the next page of\n results. If desired, your application can include its own logic to assemble the pages of\n results into one dataset.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchGetItem returns a\n ProvisionedThroughputExceededException. If at least\n one of the items is successfully processed, then\n BatchGetItem completes successfully, while returning the keys of the\n unread items in UnprocessedKeys.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

By default, BatchGetItem performs eventually consistent reads on every\n table in the request. If you want strongly consistent reads instead, you can set\n ConsistentRead to true for any or all tables.

\n

In order to minimize response latency, BatchGetItem may retrieve items in\n parallel.

\n

When designing your application, keep in mind that DynamoDB does not return items in\n any particular order. To help parse the response by item, include the primary key values\n for the items in your request in the ProjectionExpression parameter.

\n

If a requested item does not exist, it is not returned in the result. Requests for\n nonexistent items consume the minimum read capacity units according to the type of read.\n For more information, see Working with Tables in the Amazon DynamoDB Developer\n Guide.

", + "smithy.api#examples": [ + { + "title": "To retrieve multiple items from a table", + "documentation": "This example reads multiple items from the Music table using a batch of three GetItem requests. Only the AlbumTitle attribute is returned.", + "input": { + "RequestItems": { + "Music": { + "Keys": [ + { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Call Me Today" + } + }, + { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + }, + { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Scared of My Shadow" + } + } + ], + "ProjectionExpression": "AlbumTitle" + } + } + }, + "output": { + "Responses": { + "Music": [ + { + "AlbumTitle": { + "S": "Somewhat Famous" + } + }, + { + "AlbumTitle": { + "S": "Blue Sky Blues" + } + }, + { + "AlbumTitle": { + "S": "Louder Than Ever" + } + } + ] + } + } + } + ] } }, "com.amazonaws.dynamodb#BatchGetItemInput": { @@ -920,6 +980,12 @@ "traits": { "smithy.api#documentation": "

The error message associated with the PartiQL batch response.

" } + }, + "Item": { + "target": "com.amazonaws.dynamodb#AttributeMap", + "traits": { + "smithy.api#documentation": "

The item which caused the condition check to fail. This will be set if ReturnValuesOnConditionCheckFailure is specified as ALL_OLD.

" + } } }, "traits": { @@ -1018,6 +1084,12 @@ "traits": { "smithy.api#documentation": "

The read consistency of the PartiQL batch request.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PartiQL batch request\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -1082,7 +1154,65 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The BatchWriteItem operation puts or deletes multiple items in one or\n more tables. A single call to BatchWriteItem can transmit up to 16MB of\n data over the network, consisting of up to 25 item put or delete operations. While\n individual items can be up to 400 KB once stored, it's important to note that an item's\n representation might be greater than 400KB while being sent in DynamoDB's JSON format\n for the API call. For more details on this distinction, see Naming Rules and Data Types.

\n \n

\n BatchWriteItem cannot update items. If you perform a BatchWriteItem\n operation on an existing item, that item's values will be overwritten by the\n operation and it will appear like it was updated. To update items, we recommend you\n use the UpdateItem action.

\n
\n

The individual PutItem and DeleteItem operations specified\n in BatchWriteItem are atomic; however BatchWriteItem as a\n whole is not. If any requested operations fail because the table's provisioned\n throughput is exceeded or an internal processing failure occurs, the failed operations\n are returned in the UnprocessedItems response parameter. You can\n investigate and optionally resend the requests. Typically, you would call\n BatchWriteItem in a loop. Each iteration would check for unprocessed\n items and submit a new BatchWriteItem request with those unprocessed items\n until all items have been processed.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchWriteItem returns a\n ProvisionedThroughputExceededException.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

With BatchWriteItem, you can efficiently write or delete large amounts of\n data, such as from Amazon EMR, or copy data from another database into DynamoDB. In\n order to improve performance with these large-scale operations,\n BatchWriteItem does not behave in the same way as individual\n PutItem and DeleteItem calls would. For example, you\n cannot specify conditions on individual put and delete requests, and\n BatchWriteItem does not return deleted items in the response.

\n

If you use a programming language that supports concurrency, you can use threads to\n write items in parallel. Your application must include the necessary logic to manage the\n threads. With languages that don't support threading, you must update or delete the\n specified items one at a time. In both situations, BatchWriteItem performs\n the specified put and delete operations in parallel, giving you the power of the thread\n pool approach without having to introduce complexity into your application.

\n

Parallel processing reduces latency, but each specified put and delete request\n consumes the same number of write capacity units whether it is processed in parallel or\n not. Delete operations on nonexistent items consume one write capacity unit.

\n

If one or more of the following is true, DynamoDB rejects the entire batch write\n operation:

\n
    \n
  • \n

    One or more tables specified in the BatchWriteItem request does\n not exist.

    \n
  • \n
  • \n

    Primary key attributes specified on an item in the request do not match those\n in the corresponding table's primary key schema.

    \n
  • \n
  • \n

    You try to perform multiple operations on the same item in the same\n BatchWriteItem request. For example, you cannot put and delete\n the same item in the same BatchWriteItem request.

    \n
  • \n
  • \n

    Your request contains at least two items with identical hash and range keys\n (which essentially is two put operations).

    \n
  • \n
  • \n

    There are more than 25 requests in the batch.

    \n
  • \n
  • \n

    Any individual item in a batch exceeds 400 KB.

    \n
  • \n
  • \n

    The total request size exceeds 16 MB.

    \n
  • \n
" + "smithy.api#documentation": "

The BatchWriteItem operation puts or deletes multiple items in one or\n more tables. A single call to BatchWriteItem can transmit up to 16MB of\n data over the network, consisting of up to 25 item put or delete operations. While\n individual items can be up to 400 KB once stored, it's important to note that an item's\n representation might be greater than 400KB while being sent in DynamoDB's JSON format\n for the API call. For more details on this distinction, see Naming Rules and Data Types.

\n \n

\n BatchWriteItem cannot update items. If you perform a BatchWriteItem\n operation on an existing item, that item's values will be overwritten by the\n operation and it will appear like it was updated. To update items, we recommend you\n use the UpdateItem action.

\n
\n

The individual PutItem and DeleteItem operations specified\n in BatchWriteItem are atomic; however BatchWriteItem as a\n whole is not. If any requested operations fail because the table's provisioned\n throughput is exceeded or an internal processing failure occurs, the failed operations\n are returned in the UnprocessedItems response parameter. You can\n investigate and optionally resend the requests. Typically, you would call\n BatchWriteItem in a loop. Each iteration would check for unprocessed\n items and submit a new BatchWriteItem request with those unprocessed items\n until all items have been processed.

\n

If none of the items can be processed due to insufficient\n provisioned throughput on all of the tables in the request, then\n BatchWriteItem returns a\n ProvisionedThroughputExceededException.

\n \n

If DynamoDB returns any unprocessed items, you should retry the batch operation on\n those items. However, we strongly recommend that you use an exponential\n backoff algorithm. If you retry the batch operation immediately, the\n underlying read or write requests can still fail due to throttling on the individual\n tables. If you delay the batch operation using exponential backoff, the individual\n requests in the batch are much more likely to succeed.

\n

For more information, see Batch Operations and Error Handling in the Amazon DynamoDB\n Developer Guide.

\n
\n

With BatchWriteItem, you can efficiently write or delete large amounts of\n data, such as from Amazon EMR, or copy data from another database into DynamoDB. In\n order to improve performance with these large-scale operations,\n BatchWriteItem does not behave in the same way as individual\n PutItem and DeleteItem calls would. For example, you\n cannot specify conditions on individual put and delete requests, and\n BatchWriteItem does not return deleted items in the response.

\n

If you use a programming language that supports concurrency, you can use threads to\n write items in parallel. Your application must include the necessary logic to manage the\n threads. With languages that don't support threading, you must update or delete the\n specified items one at a time. In both situations, BatchWriteItem performs\n the specified put and delete operations in parallel, giving you the power of the thread\n pool approach without having to introduce complexity into your application.

\n

Parallel processing reduces latency, but each specified put and delete request\n consumes the same number of write capacity units whether it is processed in parallel or\n not. Delete operations on nonexistent items consume one write capacity unit.

\n

If one or more of the following is true, DynamoDB rejects the entire batch write\n operation:

\n
    \n
  • \n

    One or more tables specified in the BatchWriteItem request does\n not exist.

    \n
  • \n
  • \n

    Primary key attributes specified on an item in the request do not match those\n in the corresponding table's primary key schema.

    \n
  • \n
  • \n

    You try to perform multiple operations on the same item in the same\n BatchWriteItem request. For example, you cannot put and delete\n the same item in the same BatchWriteItem request.

    \n
  • \n
  • \n

    Your request contains at least two items with identical hash and range keys\n (which essentially is two put operations).

    \n
  • \n
  • \n

    There are more than 25 requests in the batch.

    \n
  • \n
  • \n

    Any individual item in a batch exceeds 400 KB.

    \n
  • \n
  • \n

    The total request size exceeds 16 MB.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To add multiple items to a table", + "documentation": "This example adds three new items to the Music table using a batch of three PutItem requests.", + "input": { + "RequestItems": { + "Music": [ + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Somewhat Famous" + }, + "SongTitle": { + "S": "Call Me Today" + }, + "Artist": { + "S": "No One You Know" + } + } + } + }, + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Songs About Life" + }, + "SongTitle": { + "S": "Happy Day" + }, + "Artist": { + "S": "Acme Band" + } + } + } + }, + { + "PutRequest": { + "Item": { + "AlbumTitle": { + "S": "Blue Sky Blues" + }, + "SongTitle": { + "S": "Scared of My Shadow" + }, + "Artist": { + "S": "No One You Know" + } + } + } + } + ] + } + }, + "output": {} + } + ] } }, "com.amazonaws.dynamodb#BatchWriteItemInput": { @@ -1465,6 +1595,12 @@ "traits": { "smithy.api#documentation": "

The conditional request failed.

" } + }, + "Item": { + "target": "com.amazonaws.dynamodb#AttributeMap", + "traits": { + "smithy.api#documentation": "

Item which caused the ConditionalCheckFailedException.

" + } } }, "traits": { @@ -2271,7 +2407,30 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Deletes a single item in a table by primary key. You can perform a conditional delete\n operation that deletes the item if it exists, or if it has an expected attribute\n value.

\n

In addition to deleting an item, you can also return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

Unless you specify conditions, the DeleteItem is an idempotent operation;\n running it multiple times on the same item or attribute does not\n result in an error response.

\n

Conditional deletes are useful for deleting items only if specific conditions are met.\n If those conditions are met, DynamoDB performs the delete. Otherwise, the item is not\n deleted.

" + "smithy.api#documentation": "

Deletes a single item in a table by primary key. You can perform a conditional delete\n operation that deletes the item if it exists, or if it has an expected attribute\n value.

\n

In addition to deleting an item, you can also return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

Unless you specify conditions, the DeleteItem is an idempotent operation;\n running it multiple times on the same item or attribute does not\n result in an error response.

\n

Conditional deletes are useful for deleting items only if specific conditions are met.\n If those conditions are met, DynamoDB performs the delete. Otherwise, the item is not\n deleted.

", + "smithy.api#examples": [ + { + "title": "To delete an item", + "documentation": "This example deletes an item from the Music table.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "No One You Know" + }, + "SongTitle": { + "S": "Scared of My Shadow" + } + } + }, + "output": { + "ConsumedCapacity": { + "CapacityUnits": 1, + "TableName": "Music" + } + } + } + ] } }, "com.amazonaws.dynamodb#DeleteItemInput": { @@ -2335,6 +2494,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a DeleteItem\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -2443,7 +2608,29 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The DeleteTable operation deletes a table and all of its items. After a\n DeleteTable request, the specified table is in the\n DELETING state until DynamoDB completes the deletion. If the table is\n in the ACTIVE state, you can delete it. If a table is in\n CREATING or UPDATING states, then DynamoDB returns a\n ResourceInUseException. If the specified table does not exist, DynamoDB\n returns a ResourceNotFoundException. If table is already in the\n DELETING state, no error is returned.

\n \n

This operation only applies to Version 2019.11.21 (Current) \n of global tables.\n

\n
\n \n

DynamoDB might continue to accept data read and write operations, such as\n GetItem and PutItem, on a table in the\n DELETING state until the table deletion is complete.

\n
\n

When you delete a table, any indexes on that table are also deleted.

\n

If you have DynamoDB Streams enabled on the table, then the corresponding stream on\n that table goes into the DISABLED state, and the stream is automatically\n deleted after 24 hours.

\n

Use the DescribeTable action to check the status of the table.

" + "smithy.api#documentation": "

The DeleteTable operation deletes a table and all of its items. After a\n DeleteTable request, the specified table is in the\n DELETING state until DynamoDB completes the deletion. If the table is\n in the ACTIVE state, you can delete it. If a table is in\n CREATING or UPDATING states, then DynamoDB returns a\n ResourceInUseException. If the specified table does not exist, DynamoDB\n returns a ResourceNotFoundException. If table is already in the\n DELETING state, no error is returned.

\n \n

This operation only applies to Version 2019.11.21 (Current) \n of global tables.\n

\n
\n \n

DynamoDB might continue to accept data read and write operations, such as\n GetItem and PutItem, on a table in the\n DELETING state until the table deletion is complete.

\n
\n

When you delete a table, any indexes on that table are also deleted.

\n

If you have DynamoDB Streams enabled on the table, then the corresponding stream on\n that table goes into the DISABLED state, and the stream is automatically\n deleted after 24 hours.

\n

Use the DescribeTable action to check the status of the table.

", + "smithy.api#examples": [ + { + "title": "To delete a table", + "documentation": "This example deletes the Music table.", + "input": { + "TableName": "Music" + }, + "output": { + "TableDescription": { + "TableStatus": "DELETING", + "TableSizeBytes": 0, + "ItemCount": 0, + "TableName": "Music", + "ProvisionedThroughput": { + "NumberOfDecreasesToday": 1, + "WriteCapacityUnits": 5, + "ReadCapacityUnits": 5 + } + } + } + } + ] } }, "com.amazonaws.dynamodb#DeleteTableInput": { @@ -2684,7 +2871,7 @@ "target": "com.amazonaws.dynamodb#DescribeEndpointsResponse" }, "traits": { - "smithy.api#documentation": "

Returns the regional endpoint information. This action must be included in your VPC \n endpoint policies, or access to the DescribeEndpoints API will be denied. For more information \n on policy permissions, please see Internetwork traffic privacy.

" + "smithy.api#documentation": "

Returns the regional endpoint information. For more information \n on policy permissions, please see Internetwork traffic privacy.

" } }, "com.amazonaws.dynamodb#DescribeEndpointsRequest": { @@ -3005,7 +3192,19 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Returns the current provisioned-capacity quotas for your Amazon Web Services account in\n a Region, both for the Region as a whole and for any one DynamoDB table that you create\n there.

\n

When you establish an Amazon Web Services account, the account has initial quotas on\n the maximum read capacity units and write capacity units that you can provision across\n all of your DynamoDB tables in a given Region. Also, there are per-table\n quotas that apply when you create a table there. For more information, see Service,\n Account, and Table Quotas page in the Amazon DynamoDB\n Developer Guide.

\n

Although you can increase these quotas by filing a case at Amazon Web Services Support Center, obtaining the\n increase is not instantaneous. The DescribeLimits action lets you write\n code to compare the capacity you are currently using to those quotas imposed by your\n account so that you have enough time to apply for an increase before you hit a\n quota.

\n

For example, you could use one of the Amazon Web Services SDKs to do the\n following:

\n
    \n
  1. \n

    Call DescribeLimits for a particular Region to obtain your\n current account quotas on provisioned capacity there.

    \n
  2. \n
  3. \n

    Create a variable to hold the aggregate read capacity units provisioned for\n all your tables in that Region, and one to hold the aggregate write capacity\n units. Zero them both.

    \n
  4. \n
  5. \n

    Call ListTables to obtain a list of all your DynamoDB\n tables.

    \n
  6. \n
  7. \n

    For each table name listed by ListTables, do the\n following:

    \n
      \n
    • \n

      Call DescribeTable with the table name.

      \n
    • \n
    • \n

      Use the data returned by DescribeTable to add the read\n capacity units and write capacity units provisioned for the table itself\n to your variables.

      \n
    • \n
    • \n

      If the table has one or more global secondary indexes (GSIs), loop\n over these GSIs and add their provisioned capacity values to your\n variables as well.

      \n
    • \n
    \n
  8. \n
  9. \n

    Report the account quotas for that Region returned by\n DescribeLimits, along with the total current provisioned\n capacity levels you have calculated.

    \n
  10. \n
\n

This will let you see whether you are getting close to your account-level\n quotas.

\n

The per-table quotas apply only when you are creating a new table. They restrict the\n sum of the provisioned capacity of the new table itself and all its global secondary\n indexes.

\n

For existing tables and their GSIs, DynamoDB doesn't let you increase provisioned\n capacity extremely rapidly, but the only quota that applies is that the aggregate\n provisioned capacity over all your tables and GSIs cannot exceed either of the\n per-account quotas.

\n \n

\n DescribeLimits should only be called periodically. You can expect\n throttling errors if you call it more than once in a minute.

\n
\n

The DescribeLimits Request element has no content.

" + "smithy.api#documentation": "

Returns the current provisioned-capacity quotas for your Amazon Web Services account in\n a Region, both for the Region as a whole and for any one DynamoDB table that you create\n there.

\n

When you establish an Amazon Web Services account, the account has initial quotas on\n the maximum read capacity units and write capacity units that you can provision across\n all of your DynamoDB tables in a given Region. Also, there are per-table\n quotas that apply when you create a table there. For more information, see Service,\n Account, and Table Quotas page in the Amazon DynamoDB\n Developer Guide.

\n

Although you can increase these quotas by filing a case at Amazon Web Services Support Center, obtaining the\n increase is not instantaneous. The DescribeLimits action lets you write\n code to compare the capacity you are currently using to those quotas imposed by your\n account so that you have enough time to apply for an increase before you hit a\n quota.

\n

For example, you could use one of the Amazon Web Services SDKs to do the\n following:

\n
    \n
  1. \n

    Call DescribeLimits for a particular Region to obtain your\n current account quotas on provisioned capacity there.

    \n
  2. \n
  3. \n

    Create a variable to hold the aggregate read capacity units provisioned for\n all your tables in that Region, and one to hold the aggregate write capacity\n units. Zero them both.

    \n
  4. \n
  5. \n

    Call ListTables to obtain a list of all your DynamoDB\n tables.

    \n
  6. \n
  7. \n

    For each table name listed by ListTables, do the\n following:

    \n
      \n
    • \n

      Call DescribeTable with the table name.

      \n
    • \n
    • \n

      Use the data returned by DescribeTable to add the read\n capacity units and write capacity units provisioned for the table itself\n to your variables.

      \n
    • \n
    • \n

      If the table has one or more global secondary indexes (GSIs), loop\n over these GSIs and add their provisioned capacity values to your\n variables as well.

      \n
    • \n
    \n
  8. \n
  9. \n

    Report the account quotas for that Region returned by\n DescribeLimits, along with the total current provisioned\n capacity levels you have calculated.

    \n
  10. \n
\n

This will let you see whether you are getting close to your account-level\n quotas.

\n

The per-table quotas apply only when you are creating a new table. They restrict the\n sum of the provisioned capacity of the new table itself and all its global secondary\n indexes.

\n

For existing tables and their GSIs, DynamoDB doesn't let you increase provisioned\n capacity extremely rapidly, but the only quota that applies is that the aggregate\n provisioned capacity over all your tables and GSIs cannot exceed either of the\n per-account quotas.

\n \n

\n DescribeLimits should only be called periodically. You can expect\n throttling errors if you call it more than once in a minute.

\n
\n

The DescribeLimits Request element has no content.

", + "smithy.api#examples": [ + { + "title": "To determine capacity limits per table and account, in the current AWS region", + "documentation": "The following example returns the maximum read and write capacity units per table, and for the AWS account, in the current AWS region.", + "output": { + "TableMaxWriteCapacityUnits": 10000, + "TableMaxReadCapacityUnits": 10000, + "AccountMaxReadCapacityUnits": 20000, + "AccountMaxWriteCapacityUnits": 20000 + } + } + ] } }, "com.amazonaws.dynamodb#DescribeLimitsInput": { @@ -3553,7 +3752,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -3571,345 +3769,310 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] }, - { - "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" - } - ] - }, - { - "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://dynamodb.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" + "ref": "PartitionResult" }, - { - "conditions": [], - "endpoint": { - "url": "https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsDualStack" + "name" ] - } + }, + "aws-us-gov" ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://dynamodb.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" + "endpoint": { + "url": "https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], - "type": "tree", - "rules": [ + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "PartitionResult" }, - "local" + "supportsDualStack" ] } - ], - "endpoint": { - "url": "http://localhost:8000", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "dynamodb", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "rules": [ { "conditions": [], "endpoint": { - "url": "https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "local" ] } - ] + ], + "endpoint": { + "url": "http://localhost:8000", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "dynamodb", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://dynamodb.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -4781,6 +4944,12 @@ "traits": { "smithy.api#documentation": "

The maximum number of items to evaluate (not necessarily the number of matching\n items). If DynamoDB processes the number of items up to the limit while processing the\n results, it stops the operation and returns the matching values up to that point, along\n with a key in LastEvaluatedKey to apply in a subsequent operation so you\n can pick up where you left off. Also, if the processed dataset size exceeds 1 MB before\n DynamoDB reaches this limit, it stops the operation and returns the matching values up\n to the limit, and a key in LastEvaluatedKey to apply in a subsequent\n operation to continue the operation.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for an\n ExecuteStatement operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -5077,6 +5246,18 @@ "traits": { "smithy.api#documentation": "

The number of items exported.

" } + }, + "ExportType": { + "target": "com.amazonaws.dynamodb#ExportType", + "traits": { + "smithy.api#documentation": "

The type of export that was performed. Valid values are FULL_EXPORT or INCREMENTAL_EXPORT.

" + } + }, + "IncrementalExportSpecification": { + "target": "com.amazonaws.dynamodb#IncrementalExportSpecification", + "traits": { + "smithy.api#documentation": "

Optional object containing the parameters specific to an incremental export.

" + } } }, "traits": { @@ -5103,6 +5284,9 @@ } } }, + "com.amazonaws.dynamodb#ExportFromTime": { + "type": "timestamp" + }, "com.amazonaws.dynamodb#ExportManifest": { "type": "string" }, @@ -5167,6 +5351,12 @@ "traits": { "smithy.api#documentation": "

Export can be in one of the following states: IN_PROGRESS, COMPLETED, or\n FAILED.

" } + }, + "ExportType": { + "target": "com.amazonaws.dynamodb#ExportType", + "traits": { + "smithy.api#documentation": "

The type of export that was performed. Valid values are FULL_EXPORT or INCREMENTAL_EXPORT.

" + } } }, "traits": { @@ -5264,6 +5454,18 @@ "traits": { "smithy.api#documentation": "

The format for the exported data. Valid values for ExportFormat are\n DYNAMODB_JSON or ION.

" } + }, + "ExportType": { + "target": "com.amazonaws.dynamodb#ExportType", + "traits": { + "smithy.api#documentation": "

Choice of whether to execute as a full export or incremental export. Valid values are FULL_EXPORT or INCREMENTAL_EXPORT. The default value is FULL_EXPORT. If INCREMENTAL_EXPORT is provided, the IncrementalExportSpecification must also be used.

" + } + }, + "IncrementalExportSpecification": { + "target": "com.amazonaws.dynamodb#IncrementalExportSpecification", + "traits": { + "smithy.api#documentation": "

Optional object containing the parameters specific to an incremental export.

" + } } }, "traits": { @@ -5287,6 +5489,43 @@ "com.amazonaws.dynamodb#ExportTime": { "type": "timestamp" }, + "com.amazonaws.dynamodb#ExportToTime": { + "type": "timestamp" + }, + "com.amazonaws.dynamodb#ExportType": { + "type": "enum", + "members": { + "FULL_EXPORT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "FULL_EXPORT" + } + }, + "INCREMENTAL_EXPORT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INCREMENTAL_EXPORT" + } + } + } + }, + "com.amazonaws.dynamodb#ExportViewType": { + "type": "enum", + "members": { + "NEW_IMAGE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "NEW_IMAGE" + } + }, + "NEW_AND_OLD_IMAGES": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "NEW_AND_OLD_IMAGES" + } + } + } + }, "com.amazonaws.dynamodb#ExpressionAttributeNameMap": { "type": "map", "key": { @@ -5409,7 +5648,37 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The GetItem operation returns a set of attributes for the item with the\n given primary key. If there is no matching item, GetItem does not return\n any data and there will be no Item element in the response.

\n

\n GetItem provides an eventually consistent read by default. If your\n application requires a strongly consistent read, set ConsistentRead to\n true. Although a strongly consistent read might take more time than an\n eventually consistent read, it always returns the last updated value.

" + "smithy.api#documentation": "

The GetItem operation returns a set of attributes for the item with the\n given primary key. If there is no matching item, GetItem does not return\n any data and there will be no Item element in the response.

\n

\n GetItem provides an eventually consistent read by default. If your\n application requires a strongly consistent read, set ConsistentRead to\n true. Although a strongly consistent read might take more time than an\n eventually consistent read, it always returns the last updated value.

", + "smithy.api#examples": [ + { + "title": "To read an item from a table", + "documentation": "This example retrieves an item from the Music table. The table has a partition key and a sort key (Artist and SongTitle), so you must specify both of these attributes.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + } + }, + "output": { + "Item": { + "AlbumTitle": { + "S": "Songs About Life" + }, + "SongTitle": { + "S": "Happy Day" + }, + "Artist": { + "S": "Acme Band" + } + } + } + } + ] } }, "com.amazonaws.dynamodb#GetItemInput": { @@ -6227,6 +6496,32 @@ } } }, + "com.amazonaws.dynamodb#IncrementalExportSpecification": { + "type": "structure", + "members": { + "ExportFromTime": { + "target": "com.amazonaws.dynamodb#ExportFromTime", + "traits": { + "smithy.api#documentation": "

Time in the past which provides the inclusive start range for the export table's data, counted in seconds from the start of the Unix epoch. The incremental export will reflect the table's state including and after this point in time.

" + } + }, + "ExportToTime": { + "target": "com.amazonaws.dynamodb#ExportToTime", + "traits": { + "smithy.api#documentation": "

Time in the past which provides the exclusive end range for the export table's data, counted in seconds from the start of the Unix epoch. The incremental export will reflect the table's state just prior to this point in time. If this is not provided, the latest time with data available will be used.

" + } + }, + "ExportViewType": { + "target": "com.amazonaws.dynamodb#ExportViewType", + "traits": { + "smithy.api#documentation": "

The view type that was chosen for the export. Valid values are NEW_AND_OLD_IMAGES and NEW_IMAGES. The default value is NEW_AND_OLD_IMAGES.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Optional object containing the parameters specific to an incremental export.

" + } + }, "com.amazonaws.dynamodb#IndexName": { "type": "string", "traits": { @@ -6762,7 +7057,7 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

List backups associated with an Amazon Web Services account. To list backups for a\n given table, specify TableName. ListBackups returns a\n paginated list of results with at most 1 MB worth of items in a page. You can also\n specify a maximum number of entries to be returned in a page.

\n

In the request, start time is inclusive, but end time is exclusive. Note that these\n boundaries are for the time at which the original backup was requested.

\n

You can call ListBackups a maximum of five times per second.

" + "smithy.api#documentation": "

List DynamoDB backups that are associated with an Amazon Web Services account and weren't made with Amazon Web Services Backup. \n To list these backups for a given table, specify TableName. ListBackups returns a\n paginated list of results with at most 1 MB worth of items in a page. You can also\n specify a maximum number of entries to be returned in a page.

\n

In the request, start time is inclusive, but end time is exclusive. Note that these\n boundaries are for the time at which the original backup was requested.

\n

You can call ListBackups a maximum of five times per second.

\n

If you want to retrieve the complete list of backups made with Amazon Web Services Backup, use the \n Amazon Web Services Backup list API.\n

" } }, "com.amazonaws.dynamodb#ListBackupsInput": { @@ -7157,6 +7452,20 @@ "required": false }, "smithy.api#documentation": "

Returns an array of table names associated with the current account and endpoint. The\n output from ListTables is paginated, with each page returning a maximum of\n 100 table names.

", + "smithy.api#examples": [ + { + "title": "To list tables", + "documentation": "This example lists all of the tables associated with the current AWS account and endpoint.", + "output": { + "TableNames": [ + "Forum", + "ProductCatalog", + "Reply", + "Thread" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartTableName", "outputToken": "LastEvaluatedTableName", @@ -7477,6 +7786,12 @@ "traits": { "smithy.api#documentation": "

The parameter values.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PartiQL\n ParameterizedStatement operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -7856,7 +8171,34 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Creates a new item, or replaces an old item with a new item. If an item that has the\n same primary key as the new item already exists in the specified table, the new item\n completely replaces the existing item. You can perform a conditional put operation (add\n a new item if one with the specified primary key doesn't exist), or replace an existing\n item if it has certain attribute values. You can return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

When you add an item, the primary key attributes are the only required attributes.\n

\n

Empty String and Binary attribute values are allowed. Attribute values of type String\n and Binary must have a length greater than zero if the attribute is used as a key\n attribute for a table or index. Set type attributes cannot be empty.

\n

Invalid Requests with empty values will be rejected with a\n ValidationException exception.

\n \n

To prevent a new item from replacing an existing item, use a conditional\n expression that contains the attribute_not_exists function with the\n name of the attribute being used as the partition key for the table. Since every\n record must contain that attribute, the attribute_not_exists function\n will only succeed if no matching item exists.

\n
\n

For more information about PutItem, see Working with\n Items in the Amazon DynamoDB Developer Guide.

" + "smithy.api#documentation": "

Creates a new item, or replaces an old item with a new item. If an item that has the\n same primary key as the new item already exists in the specified table, the new item\n completely replaces the existing item. You can perform a conditional put operation (add\n a new item if one with the specified primary key doesn't exist), or replace an existing\n item if it has certain attribute values. You can return the item's attribute values in\n the same operation, using the ReturnValues parameter.

\n

When you add an item, the primary key attributes are the only required attributes.\n

\n

Empty String and Binary attribute values are allowed. Attribute values of type String\n and Binary must have a length greater than zero if the attribute is used as a key\n attribute for a table or index. Set type attributes cannot be empty.

\n

Invalid Requests with empty values will be rejected with a\n ValidationException exception.

\n \n

To prevent a new item from replacing an existing item, use a conditional\n expression that contains the attribute_not_exists function with the\n name of the attribute being used as the partition key for the table. Since every\n record must contain that attribute, the attribute_not_exists function\n will only succeed if no matching item exists.

\n
\n

For more information about PutItem, see Working with\n Items in the Amazon DynamoDB Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To add an item to a table", + "documentation": "This example adds a new item to the Music table.", + "input": { + "TableName": "Music", + "Item": { + "AlbumTitle": { + "S": "Somewhat Famous" + }, + "SongTitle": { + "S": "Call Me Today" + }, + "Artist": { + "S": "No One You Know" + } + }, + "ReturnConsumedCapacity": "TOTAL" + }, + "output": { + "ConsumedCapacity": { + "CapacityUnits": 1, + "TableName": "Music" + } + } + } + ] } }, "com.amazonaws.dynamodb#PutItemInput": { @@ -7920,6 +8262,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for a PutItem\n operation that failed a condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { @@ -8008,6 +8356,34 @@ "required": false }, "smithy.api#documentation": "

You must provide the name of the partition key attribute and a single value for that\n attribute. Query returns all items with that partition key value.\n Optionally, you can provide a sort key attribute and use a comparison operator to refine\n the search results.

\n

Use the KeyConditionExpression parameter to provide a specific value for\n the partition key. The Query operation will return all of the items from\n the table or index with that partition key value. You can optionally narrow the scope of\n the Query operation by specifying a sort key value and a comparison\n operator in KeyConditionExpression. To further refine the\n Query results, you can optionally provide a\n FilterExpression. A FilterExpression determines which\n items within the results should be returned to you. All of the other results are\n discarded.

\n

A Query operation always returns a result set. If no matching items are\n found, the result set will be empty. Queries that do not return results consume the\n minimum number of read capacity units for that type of read operation.

\n \n

DynamoDB calculates the number of read capacity units consumed based on item\n size, not on the amount of data that is returned to an application. The number of\n capacity units consumed will be the same whether you request all of the attributes\n (the default behavior) or just some of them (using a projection expression). The\n number will also be the same whether or not you use a FilterExpression.\n

\n
\n

\n Query results are always sorted by the sort key value. If the data type of\n the sort key is Number, the results are returned in numeric order; otherwise, the\n results are returned in order of UTF-8 bytes. By default, the sort order is ascending.\n To reverse the order, set the ScanIndexForward parameter to false.

\n

A single Query operation will read up to the maximum number of items set\n (if using the Limit parameter) or a maximum of 1 MB of data and then apply\n any filtering to the results using FilterExpression. If\n LastEvaluatedKey is present in the response, you will need to paginate\n the result set. For more information, see Paginating\n the Results in the Amazon DynamoDB Developer Guide.

\n

\n FilterExpression is applied after a Query finishes, but before\n the results are returned. A FilterExpression cannot contain partition key\n or sort key attributes. You need to specify those attributes in the\n KeyConditionExpression.

\n \n

A Query operation can return an empty result set and a\n LastEvaluatedKey if all the items read for the page of results are\n filtered out.

\n
\n

You can query a table, a local secondary index, or a global secondary index. For a\n query on a table or on a local secondary index, you can set the\n ConsistentRead parameter to true and obtain a strongly\n consistent result. Global secondary indexes support eventually consistent reads only, so\n do not specify ConsistentRead when querying a global secondary\n index.

", + "smithy.api#examples": [ + { + "title": "To query an item", + "documentation": "This example queries items in the Music table. The table has a partition key and sort key (Artist and SongTitle), but this query only specifies the partition key value. It returns song titles by the artist named \"No One You Know\".", + "input": { + "TableName": "Music", + "ProjectionExpression": "SongTitle", + "KeyConditionExpression": "Artist = :v1", + "ExpressionAttributeValues": { + ":v1": { + "S": "No One You Know" + } + } + }, + "output": { + "Count": 2, + "Items": [ + { + "SongTitle": { + "S": "Call Me Today" + } + } + ], + "ScannedCount": 2, + "ConsumedCapacity": {} + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartKey", "outputToken": "LastEvaluatedKey", @@ -9444,7 +9820,50 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

The Scan operation returns one or more items and item attributes by\n accessing every item in a table or a secondary index. To have DynamoDB return fewer\n items, you can provide a FilterExpression operation.

\n

If the total number of scanned items exceeds the maximum dataset size limit of 1 MB,\n the scan stops and results are returned to the user as a LastEvaluatedKey\n value to continue the scan in a subsequent operation. The results also include the\n number of items exceeding the limit. A scan can result in no table data meeting the\n filter criteria.

\n

A single Scan operation reads up to the maximum number of items set (if\n using the Limit parameter) or a maximum of 1 MB of data and then apply any\n filtering to the results using FilterExpression. If\n LastEvaluatedKey is present in the response, you need to paginate the\n result set. For more information, see Paginating the\n Results in the Amazon DynamoDB Developer Guide.

\n

\n Scan operations proceed sequentially; however, for faster performance on\n a large table or secondary index, applications can request a parallel Scan\n operation by providing the Segment and TotalSegments\n parameters. For more information, see Parallel\n Scan in the Amazon DynamoDB Developer Guide.

\n

\n Scan uses eventually consistent reads when accessing the data in a table;\n therefore, the result set might not include the changes to data in the table immediately\n before the operation began. If you need a consistent copy of the data, as of the time\n that the Scan begins, you can set the ConsistentRead parameter\n to true.

", + "smithy.api#documentation": "

The Scan operation returns one or more items and item attributes by\n accessing every item in a table or a secondary index. To have DynamoDB return fewer\n items, you can provide a FilterExpression operation.

\n

If the total size of scanned items exceeds the maximum dataset size limit of 1 MB,\n the scan completes and results are returned to the user. The LastEvaluatedKey \n value is also returned and the requestor can use the LastEvaluatedKey to continue \n the scan in a subsequent operation. Each scan response also includes number of items that were \n scanned (ScannedCount) as part of the request. If using a FilterExpression, a scan result \n can result in no items meeting the criteria and the Count will result in zero. If \n you did not use a FilterExpression in the scan request, then Count is \n the same as ScannedCount.

\n \n

\n Count and ScannedCount only return the count of items specific to a \n single scan request and, unless the table is less than 1MB, do not represent the total number \n of items in the table.\n

\n
\n

A single Scan operation first reads up to the maximum number of items set (if\n using the Limit parameter) or a maximum of 1 MB of data and then applies any\n filtering to the results if a FilterExpression is provided. If\n LastEvaluatedKey is present in the response, pagination is required to complete the\n full table scan. For more information, see Paginating the\n Results in the Amazon DynamoDB Developer Guide.

\n

\n Scan operations proceed sequentially; however, for faster performance on\n a large table or secondary index, applications can request a parallel Scan\n operation by providing the Segment and TotalSegments\n parameters. For more information, see Parallel\n Scan in the Amazon DynamoDB Developer Guide.

\n

By default, a Scan uses eventually consistent reads when accessing the items in a table. \n Therefore, the results from an eventually consistent Scan may not include the latest item \n changes at the time the scan iterates through each item in the table. If you require a strongly consistent \n read of each item as the scan iterates through the items in the table, you can set the ConsistentRead \n parameter to true. Strong consistency only relates to the consistency of the read at the item level.

\n \n

\n DynamoDB does not provide snapshot isolation for a scan operation when the ConsistentRead \n parameter is set to true. Thus, a DynamoDB scan operation does not guarantee that all reads in a scan \n see a consistent snapshot of the table when the scan operation was requested.\n

\n
", + "smithy.api#examples": [ + { + "title": "To scan a table", + "documentation": "This example scans the entire Music table, and then narrows the results to songs by the artist \"No One You Know\". For each item, only the album title and song title are returned.", + "input": { + "TableName": "Music", + "FilterExpression": "Artist = :a", + "ProjectionExpression": "#ST, #AT", + "ExpressionAttributeNames": { + "#ST": "SongTitle", + "#AT": "AlbumTitle" + }, + "ExpressionAttributeValues": { + ":a": { + "S": "No One You Know" + } + } + }, + "output": { + "Count": 2, + "Items": [ + { + "SongTitle": { + "S": "Call Me Today" + }, + "AlbumTitle": { + "S": "Somewhat Famous" + } + }, + { + "SongTitle": { + "S": "Scared of My Shadow" + }, + "AlbumTitle": { + "S": "Blue Sky Blues" + } + } + ], + "ScannedCount": 3, + "ConsumedCapacity": {} + } + } + ], "smithy.api#paginated": { "inputToken": "ExclusiveStartKey", "outputToken": "LastEvaluatedKey", @@ -9532,7 +9951,7 @@ "FilterExpression": { "target": "com.amazonaws.dynamodb#ConditionExpression", "traits": { - "smithy.api#documentation": "

A string that contains conditions that DynamoDB applies after the Scan\n operation, but before the data is returned to you. Items that do not satisfy the\n FilterExpression criteria are not returned.

\n \n

A FilterExpression is applied after the items have already been read;\n the process of filtering does not consume any additional read capacity units.

\n
\n

For more information, see Filter Expressions in the Amazon DynamoDB Developer\n Guide.

" + "smithy.api#documentation": "

A string that contains conditions that DynamoDB applies after the Scan\n operation, but before the data is returned to you. Items that do not satisfy the\n FilterExpression criteria are not returned.

\n \n

A FilterExpression is applied after the items have already been read;\n the process of filtering does not consume any additional read capacity units.

\n
\n

For more information, see Filter Expressions in the Amazon DynamoDB Developer\n Guide.

" } }, "ExpressionAttributeNames": { @@ -10650,7 +11069,7 @@ } }, "traits": { - "smithy.api#documentation": "

The entire transaction request was canceled.

\n

DynamoDB cancels a TransactWriteItems request under the following\n circumstances:

\n
    \n
  • \n

    A condition in one of the condition expressions is not met.

    \n
  • \n
  • \n

    A table in the TransactWriteItems request is in a different\n account or region.

    \n
  • \n
  • \n

    More than one action in the TransactWriteItems operation\n targets the same item.

    \n
  • \n
  • \n

    There is insufficient provisioned capacity for the transaction to be\n completed.

    \n
  • \n
  • \n

    An item size becomes too large (larger than 400 KB), or a local secondary\n index (LSI) becomes too large, or a similar validation error occurs because of\n changes made by the transaction.

    \n
  • \n
  • \n

    There is a user error, such as an invalid data format.

    \n
  • \n
\n

DynamoDB cancels a TransactGetItems request under the\n following circumstances:

\n
    \n
  • \n

    There is an ongoing TransactGetItems operation that conflicts\n with a concurrent PutItem, UpdateItem,\n DeleteItem or TransactWriteItems request. In this\n case the TransactGetItems operation fails with a\n TransactionCanceledException.

    \n
  • \n
  • \n

    A table in the TransactGetItems request is in a different\n account or region.

    \n
  • \n
  • \n

    There is insufficient provisioned capacity for the transaction to be\n completed.

    \n
  • \n
  • \n

    There is a user error, such as an invalid data format.

    \n
  • \n
\n \n

If using Java, DynamoDB lists the cancellation reasons on the\n CancellationReasons property. This property is not set for other\n languages. Transaction cancellation reasons are ordered in the order of requested\n items, if an item has no error it will have None code and\n Null message.

\n
\n

Cancellation reason codes and possible error messages:

\n
    \n
  • \n

    No Errors:

    \n
      \n
    • \n

      Code: None\n

      \n
    • \n
    • \n

      Message: null\n

      \n
    • \n
    \n
  • \n
  • \n

    Conditional Check Failed:

    \n
      \n
    • \n

      Code: ConditionalCheckFailed\n

      \n
    • \n
    • \n

      Message: The conditional request failed.

      \n
    • \n
    \n
  • \n
  • \n

    Item Collection Size Limit Exceeded:

    \n
      \n
    • \n

      Code: ItemCollectionSizeLimitExceeded\n

      \n
    • \n
    • \n

      Message: Collection size exceeded.

      \n
    • \n
    \n
  • \n
  • \n

    Transaction Conflict:

    \n
      \n
    • \n

      Code: TransactionConflict\n

      \n
    • \n
    • \n

      Message: Transaction is ongoing for the item.

      \n
    • \n
    \n
  • \n
  • \n

    Provisioned Throughput Exceeded:

    \n
      \n
    • \n

      Code: ProvisionedThroughputExceeded\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        The level of configured provisioned throughput for the\n table was exceeded. Consider increasing your provisioning level\n with the UpdateTable API.

        \n \n

        This Message is received when provisioned throughput is\n exceeded is on a provisioned DynamoDB\n table.

        \n
        \n
      • \n
      • \n

        The level of configured provisioned throughput for one or\n more global secondary indexes of the table was exceeded.\n Consider increasing your provisioning level for the\n under-provisioned global secondary indexes with the UpdateTable\n API.

        \n \n

        This message is returned when provisioned throughput is\n exceeded is on a provisioned GSI.

        \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • \n

    Throttling Error:

    \n
      \n
    • \n

      Code: ThrottlingError\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        Throughput exceeds the current capacity of your table or\n index. DynamoDB is automatically scaling your table or\n index so please try again shortly. If exceptions persist, check\n if you have a hot key:\n https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html.

        \n \n

        This message is returned when writes get throttled on an\n On-Demand table as DynamoDB is automatically\n scaling the table.

        \n
        \n
      • \n
      • \n

        Throughput exceeds the current capacity for one or more\n global secondary indexes. DynamoDB is automatically\n scaling your index so please try again shortly.

        \n \n

        This message is returned when writes get throttled on\n an On-Demand GSI as DynamoDB is automatically\n scaling the GSI.

        \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • \n

    Validation Error:

    \n
      \n
    • \n

      Code: ValidationError\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        One or more parameter values were invalid.

        \n
      • \n
      • \n

        The update expression attempted to update the secondary\n index key beyond allowed size limits.

        \n
      • \n
      • \n

        The update expression attempted to update the secondary\n index key to unsupported type.

        \n
      • \n
      • \n

        An operand in the update expression has an incorrect data\n type.

        \n
      • \n
      • \n

        Item size to update has exceeded the maximum allowed\n size.

        \n
      • \n
      • \n

        Number overflow. Attempting to store a number with\n magnitude larger than supported range.

        \n
      • \n
      • \n

        Type mismatch for attribute to update.

        \n
      • \n
      • \n

        Nesting Levels have exceeded supported limits.

        \n
      • \n
      • \n

        The document path provided in the update expression is\n invalid for update.

        \n
      • \n
      • \n

        The provided expression refers to an attribute that does\n not exist in the item.

        \n
      • \n
      \n
    • \n
    \n
  • \n
", + "smithy.api#documentation": "

The entire transaction request was canceled.

\n

DynamoDB cancels a TransactWriteItems request under the following\n circumstances:

\n
    \n
  • \n

    A condition in one of the condition expressions is not met.

    \n
  • \n
  • \n

    A table in the TransactWriteItems request is in a different\n account or region.

    \n
  • \n
  • \n

    More than one action in the TransactWriteItems operation\n targets the same item.

    \n
  • \n
  • \n

    There is insufficient provisioned capacity for the transaction to be\n completed.

    \n
  • \n
  • \n

    An item size becomes too large (larger than 400 KB), or a local secondary\n index (LSI) becomes too large, or a similar validation error occurs because of\n changes made by the transaction.

    \n
  • \n
  • \n

    There is a user error, such as an invalid data format.

    \n
  • \n
  • \n

    \n There is an ongoing TransactWriteItems operation that conflicts with a concurrent \n TransactWriteItems request. In this case the TransactWriteItems operation \n fails with a TransactionCanceledException.\n

    \n
  • \n
\n

DynamoDB cancels a TransactGetItems request under the\n following circumstances:

\n
    \n
  • \n

    There is an ongoing TransactGetItems operation that conflicts\n with a concurrent PutItem, UpdateItem,\n DeleteItem or TransactWriteItems request. In this\n case the TransactGetItems operation fails with a\n TransactionCanceledException.

    \n
  • \n
  • \n

    A table in the TransactGetItems request is in a different\n account or region.

    \n
  • \n
  • \n

    There is insufficient provisioned capacity for the transaction to be\n completed.

    \n
  • \n
  • \n

    There is a user error, such as an invalid data format.

    \n
  • \n
\n \n

If using Java, DynamoDB lists the cancellation reasons on the\n CancellationReasons property. This property is not set for other\n languages. Transaction cancellation reasons are ordered in the order of requested\n items, if an item has no error it will have None code and\n Null message.

\n
\n

Cancellation reason codes and possible error messages:

\n
    \n
  • \n

    No Errors:

    \n
      \n
    • \n

      Code: None\n

      \n
    • \n
    • \n

      Message: null\n

      \n
    • \n
    \n
  • \n
  • \n

    Conditional Check Failed:

    \n
      \n
    • \n

      Code: ConditionalCheckFailed\n

      \n
    • \n
    • \n

      Message: The conditional request failed.

      \n
    • \n
    \n
  • \n
  • \n

    Item Collection Size Limit Exceeded:

    \n
      \n
    • \n

      Code: ItemCollectionSizeLimitExceeded\n

      \n
    • \n
    • \n

      Message: Collection size exceeded.

      \n
    • \n
    \n
  • \n
  • \n

    Transaction Conflict:

    \n
      \n
    • \n

      Code: TransactionConflict\n

      \n
    • \n
    • \n

      Message: Transaction is ongoing for the item.

      \n
    • \n
    \n
  • \n
  • \n

    Provisioned Throughput Exceeded:

    \n
      \n
    • \n

      Code: ProvisionedThroughputExceeded\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        The level of configured provisioned throughput for the\n table was exceeded. Consider increasing your provisioning level\n with the UpdateTable API.

        \n \n

        This Message is received when provisioned throughput is\n exceeded is on a provisioned DynamoDB\n table.

        \n
        \n
      • \n
      • \n

        The level of configured provisioned throughput for one or\n more global secondary indexes of the table was exceeded.\n Consider increasing your provisioning level for the\n under-provisioned global secondary indexes with the UpdateTable\n API.

        \n \n

        This message is returned when provisioned throughput is\n exceeded is on a provisioned GSI.

        \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • \n

    Throttling Error:

    \n
      \n
    • \n

      Code: ThrottlingError\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        Throughput exceeds the current capacity of your table or\n index. DynamoDB is automatically scaling your table or\n index so please try again shortly. If exceptions persist, check\n if you have a hot key:\n https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html.

        \n \n

        This message is returned when writes get throttled on an\n On-Demand table as DynamoDB is automatically\n scaling the table.

        \n
        \n
      • \n
      • \n

        Throughput exceeds the current capacity for one or more\n global secondary indexes. DynamoDB is automatically\n scaling your index so please try again shortly.

        \n \n

        This message is returned when writes get throttled on\n an On-Demand GSI as DynamoDB is automatically\n scaling the GSI.

        \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • \n

    Validation Error:

    \n
      \n
    • \n

      Code: ValidationError\n

      \n
    • \n
    • \n

      Messages:

      \n
        \n
      • \n

        One or more parameter values were invalid.

        \n
      • \n
      • \n

        The update expression attempted to update the secondary\n index key beyond allowed size limits.

        \n
      • \n
      • \n

        The update expression attempted to update the secondary\n index key to unsupported type.

        \n
      • \n
      • \n

        An operand in the update expression has an incorrect data\n type.

        \n
      • \n
      • \n

        Item size to update has exceeded the maximum allowed\n size.

        \n
      • \n
      • \n

        Number overflow. Attempting to store a number with\n magnitude larger than supported range.

        \n
      • \n
      • \n

        Type mismatch for attribute to update.

        \n
      • \n
      • \n

        Nesting Levels have exceeded supported limits.

        \n
      • \n
      • \n

        The document path provided in the update expression is\n invalid for update.

        \n
      • \n
      • \n

        The provided expression refers to an attribute that does\n not exist in the item.

        \n
      • \n
      \n
    • \n
    \n
  • \n
", "smithy.api#error": "client" } }, @@ -10777,7 +11196,7 @@ "ReturnValuesOnConditionCheckFailure": { "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", "traits": { - "smithy.api#documentation": "

Use ReturnValuesOnConditionCheckFailure to get the item attributes if the\n Update condition fails. For\n ReturnValuesOnConditionCheckFailure, the valid values are: NONE,\n ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW.

" + "smithy.api#documentation": "

Use ReturnValuesOnConditionCheckFailure to get the item attributes if the\n Update condition fails. For\n ReturnValuesOnConditionCheckFailure, the valid values are: NONE and\n ALL_OLD.

" } } }, @@ -11161,7 +11580,54 @@ "aws.api#clientDiscoveredEndpoint": { "required": false }, - "smithy.api#documentation": "

Edits an existing item's attributes, or adds a new item to the table if it does not\n already exist. You can put, delete, or add attribute values. You can also perform a\n conditional update on an existing item (insert a new attribute name-value pair if it\n doesn't exist, or replace an existing name-value pair if it has certain expected\n attribute values).

\n

You can also return the item's attribute values in the same UpdateItem\n operation using the ReturnValues parameter.

" + "smithy.api#documentation": "

Edits an existing item's attributes, or adds a new item to the table if it does not\n already exist. You can put, delete, or add attribute values. You can also perform a\n conditional update on an existing item (insert a new attribute name-value pair if it\n doesn't exist, or replace an existing name-value pair if it has certain expected\n attribute values).

\n

You can also return the item's attribute values in the same UpdateItem\n operation using the ReturnValues parameter.

", + "smithy.api#examples": [ + { + "title": "To update an item in a table", + "documentation": "This example updates an item in the Music table. It adds a new attribute (Year) and modifies the AlbumTitle attribute. All of the attributes in the item, as they appear after the update, are returned in the response.", + "input": { + "TableName": "Music", + "Key": { + "Artist": { + "S": "Acme Band" + }, + "SongTitle": { + "S": "Happy Day" + } + }, + "UpdateExpression": "SET #Y = :y, #AT = :t", + "ExpressionAttributeNames": { + "#Y": "Year", + "#AT": "AlbumTitle" + }, + "ExpressionAttributeValues": { + ":y": { + "N": "2015" + }, + ":t": { + "S": "Louder Than Ever" + } + }, + "ReturnValues": "ALL_NEW" + }, + "output": { + "Attributes": { + "AlbumTitle": { + "S": "Louder Than Ever" + }, + "Artist": { + "S": "Acme Band" + }, + "Year": { + "N": "2015" + }, + "SongTitle": { + "S": "Happy Day" + } + } + } + } + ] } }, "com.amazonaws.dynamodb#UpdateItemInput": { @@ -11237,6 +11703,12 @@ "traits": { "smithy.api#documentation": "

One or more values that can be substituted in an expression.

\n

Use the : (colon) character in an expression to\n dereference an attribute value. For example, suppose that you wanted to check whether\n the value of the ProductStatus attribute was one of the following:

\n

\n Available | Backordered | Discontinued\n

\n

You would first need to specify ExpressionAttributeValues as\n follows:

\n

\n { \":avail\":{\"S\":\"Available\"}, \":back\":{\"S\":\"Backordered\"},\n \":disc\":{\"S\":\"Discontinued\"} }\n

\n

You could then use these values in an expression, such as this:

\n

\n ProductStatus IN (:avail, :back, :disc)\n

\n

For more information on expression attribute values, see Condition Expressions in the Amazon DynamoDB Developer\n Guide.

" } + }, + "ReturnValuesOnConditionCheckFailure": { + "target": "com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure", + "traits": { + "smithy.api#documentation": "

An optional parameter that returns the item attributes for an UpdateItem operation that failed a\n condition check.

\n

There is no additional cost associated with requesting a return value aside from the\n small network and processing overhead of receiving a larger response. No read capacity\n units are consumed.

" + } } }, "traits": { diff --git a/aws/sdk/aws-models/ec2.json b/aws/sdk/aws-models/ec2.json index 4d35d56d54a..6afa836ebbf 100644 --- a/aws/sdk/aws-models/ec2.json +++ b/aws/sdk/aws-models/ec2.json @@ -36,8 +36,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of accelerators. If this parameter is not specified, there is no minimum\n limit.

", "smithy.api#xmlName": "min" } @@ -46,8 +44,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of accelerators. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -63,16 +59,12 @@ "Min": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of accelerators. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of accelerators. To specify no maximum limit, omit this\n parameter. To exclude accelerator-enabled instance types, set Max to\n 0.

" } } @@ -194,8 +186,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of accelerator memory, in MiB. If this parameter is not specified,\n there is no minimum limit.

", "smithy.api#xmlName": "min" } @@ -204,8 +194,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of accelerator memory, in MiB. If this parameter is not specified,\n there is no maximum limit.

", "smithy.api#xmlName": "max" } @@ -221,16 +209,12 @@ "Min": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of accelerator memory, in MiB. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of accelerator memory, in MiB. To specify no maximum limit, omit this\n parameter.

" } } @@ -304,8 +288,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -348,8 +330,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -428,8 +408,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -480,8 +458,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -532,8 +508,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -576,8 +550,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -638,8 +610,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -1353,7 +1323,6 @@ "com.amazonaws.ec2#AddressMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -1483,8 +1452,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -1535,7 +1502,20 @@ "target": "com.amazonaws.ec2#AllocateAddressResult" }, "traits": { - "smithy.api#documentation": "

Allocates an Elastic IP address to your Amazon Web Services account. After you allocate the Elastic IP address you can associate \n it with an instance or network interface. After you release an Elastic IP address, it is released to the IP address \n pool and can be allocated to a different Amazon Web Services account.

\n

You can allocate an Elastic IP address from an address pool owned by Amazon Web Services or from an address pool created \n from a public IPv4 address range that you have brought to Amazon Web Services for use with your Amazon Web Services resources using bring your own \n IP addresses (BYOIP). For more information, see Bring Your Own IP Addresses (BYOIP) in the Amazon Elastic Compute Cloud User Guide.

\n

If you release an Elastic IP address, you might be able to recover it. You cannot recover\n an Elastic IP address that you released after it is allocated to another Amazon Web Services account. To attempt to recover an Elastic IP address that you released, specify\n it in this operation.

\n

For more information, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

You can allocate a carrier IP address which is a public IP address from a telecommunication carrier, \n to a network interface which resides in a subnet in a Wavelength Zone (for example an EC2 instance).

" + "smithy.api#documentation": "

Allocates an Elastic IP address to your Amazon Web Services account. After you allocate the Elastic IP address you can associate \n it with an instance or network interface. After you release an Elastic IP address, it is released to the IP address \n pool and can be allocated to a different Amazon Web Services account.

\n

You can allocate an Elastic IP address from an address pool owned by Amazon Web Services or from an address pool created \n from a public IPv4 address range that you have brought to Amazon Web Services for use with your Amazon Web Services resources using bring your own \n IP addresses (BYOIP). For more information, see Bring Your Own IP Addresses (BYOIP) in the Amazon Elastic Compute Cloud User Guide.

\n

If you release an Elastic IP address, you might be able to recover it. You cannot recover\n an Elastic IP address that you released after it is allocated to another Amazon Web Services account. To attempt to recover an Elastic IP address that you released, specify\n it in this operation.

\n

For more information, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

You can allocate a carrier IP address which is a public IP address from a telecommunication carrier, \n to a network interface which resides in a subnet in a Wavelength Zone (for example an EC2 instance).

", + "smithy.api#examples": [ + { + "title": "To allocate an Elastic IP address", + "documentation": "This example allocates an Elastic IP address.", + "output": { + "PublicIp": "203.0.113.0", + "AllocationId": "eipalloc-64d5890a", + "PublicIpv4Pool": "amazon", + "NetworkBorderGroup": "us-east-1", + "Domain": "vpc" + } + } + ] } }, "com.amazonaws.ec2#AllocateAddressRequest": { @@ -1562,7 +1542,7 @@ "NetworkBorderGroup": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

A unique set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services\n advertises IP addresses. Use this parameter to limit the IP address to this location. IP\n addresses cannot move between network border groups.

\n

Use DescribeAvailabilityZones to view the network border groups.

\n

You cannot use a network border group with EC2 Classic. If you attempt this operation on EC2 Classic, \n you receive an InvalidParameterCombination error.

" + "smithy.api#documentation": "

A unique set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services\n advertises IP addresses. Use this parameter to limit the IP address to this location. IP\n addresses cannot move between network border groups.

\n

Use DescribeAvailabilityZones to view the network border groups.

" } }, "CustomerOwnedIpv4Pool": { @@ -1575,8 +1555,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -1724,10 +1702,7 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Quantity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, - "smithy.api#documentation": "

The number of Dedicated Hosts to allocate to your account with these\n parameters.

", - "smithy.api#required": {}, + "smithy.api#documentation": "

The number of Dedicated Hosts to allocate to your account with these parameters. If you are \n allocating the Dedicated Hosts on an Outpost, and you specify AssetIds, \n you can omit this parameter. In this case, Amazon EC2 allocates a Dedicated Host on each \n specified hardware asset. If you specify both AssetIds and \n Quantity, then the value that you specify for \n Quantity must be equal to the number of asset IDs specified.

", "smithy.api#xmlName": "quantity" } }, @@ -1747,7 +1722,7 @@ "OutpostArn": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the Amazon Web Services Outpost on which to allocate\n the Dedicated Host.

" + "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the Amazon Web Services Outpost on which to allocate\n the Dedicated Host. If you specify OutpostArn, you can \n optionally specify AssetIds.

\n

If you are allocating the Dedicated Host in a Region, omit this parameter.

" } }, "HostMaintenance": { @@ -1755,6 +1730,13 @@ "traits": { "smithy.api#documentation": "

Indicates whether to enable or disable host maintenance for the Dedicated Host. For\n more information, see Host\n maintenance in the Amazon EC2 User Guide.

" } + }, + "AssetIds": { + "target": "com.amazonaws.ec2#AssetIdList", + "traits": { + "smithy.api#documentation": "

The IDs of the Outpost hardware assets on which to allocate the Dedicated Hosts. Targeting \n specific hardware assets on an Outpost can help to minimize latency between your workloads. \n This parameter is supported only if you specify OutpostArn. \n If you are allocating the Dedicated Hosts in a Region, omit this parameter.

\n
    \n
  • \n

    If you specify this parameter, you can omit Quantity. \n In this case, Amazon EC2 allocates a Dedicated Host on each specified hardware \n asset.

    \n
  • \n
  • \n

    If you specify both AssetIds and \n Quantity, then the value for \n Quantity must be equal to the number of asset IDs \n specified.

    \n
  • \n
", + "smithy.api#xmlName": "AssetId" + } } }, "traits": { @@ -1796,8 +1778,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -1818,8 +1798,6 @@ "NetmaskLength": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The netmask length of the CIDR you would like to allocate from the IPAM pool. Note the following:

\n
    \n
  • \n

    If there is no DefaultNetmaskLength allocation rule set on the pool, you must specify either the NetmaskLength or the CIDR.

    \n
  • \n
  • \n

    If the DefaultNetmaskLength allocation rule is set on the pool, you can specify either the NetmaskLength or the CIDR and the DefaultNetmaskLength allocation rule will be ignored.

    \n
  • \n
\n

Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

" } }, @@ -1839,8 +1817,6 @@ "PreviewNextCidr": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A preview of the next available CIDR in a pool.

" } }, @@ -1987,7 +1963,7 @@ "min": 1, "max": 30 }, - "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*]+$" + "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*\\-]+$" } }, "com.amazonaws.ec2#AllowedInstanceTypeSet": { @@ -3235,6 +3211,12 @@ { "target": "com.amazonaws.ec2#DisableFastSnapshotRestores" }, + { + "target": "com.amazonaws.ec2#DisableImage" + }, + { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccess" + }, { "target": "com.amazonaws.ec2#DisableImageDeprecation" }, @@ -3313,6 +3295,12 @@ { "target": "com.amazonaws.ec2#EnableFastSnapshotRestores" }, + { + "target": "com.amazonaws.ec2#EnableImage" + }, + { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccess" + }, { "target": "com.amazonaws.ec2#EnableImageDeprecation" }, @@ -3391,6 +3379,9 @@ { "target": "com.amazonaws.ec2#GetHostReservationPurchasePreview" }, + { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessState" + }, { "target": "com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirements" }, @@ -3436,6 +3427,9 @@ { "target": "com.amazonaws.ec2#GetReservedInstancesExchangeQuote" }, + { + "target": "com.amazonaws.ec2#GetSecurityGroupsForVpc" + }, { "target": "com.amazonaws.ec2#GetSerialConsoleAccessStatus" }, @@ -3958,7 +3952,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -3976,318 +3969,283 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ec2-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ec2-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://ec2.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" }, - { - "conditions": [], - "endpoint": { - "url": "https://ec2-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "aws-us-gov" ] } - ] + ], + "endpoint": { + "url": "https://ec2.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ec2-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ec2.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://ec2.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ec2.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://ec2.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -5068,8 +5026,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Egress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the rule is an outbound rule.

", "smithy.api#xmlName": "egress" } @@ -5102,8 +5058,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RuleNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number.

", "smithy.api#xmlName": "ruleNumber" } @@ -5161,8 +5115,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "LoadBalancerPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port on which the load balancer is listening.

", "smithy.api#xmlName": "loadBalancerPort" } @@ -5171,8 +5123,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "InstancePort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

[Classic Load Balancers] The back-end port for the listener.

", "smithy.api#xmlName": "instancePort" } @@ -5213,8 +5163,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "Port", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port on which the target is listening.

", "smithy.api#xmlName": "port" } @@ -5531,8 +5479,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -5660,6 +5606,15 @@ } } }, + "com.amazonaws.ec2#AssetId": { + "type": "string" + }, + "com.amazonaws.ec2#AssetIdList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#AssetId" + } + }, "com.amazonaws.ec2#AssignIpv6Addresses": { "type": "operation", "input": { @@ -5679,8 +5634,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of additional IPv6 addresses to assign to the network interface. \n \t\tThe specified number of IPv6 addresses are assigned in addition to the \n \t\texisting IPv6 addresses that are already assigned to the network interface. \n \t\tAmazon EC2 automatically selects the IPv6 addresses from the subnet range. You \n \t\tcan't use this option if specifying specific IPv6 addresses.

", "smithy.api#xmlName": "ipv6AddressCount" } @@ -5696,8 +5649,6 @@ "Ipv6PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes that Amazon Web Services automatically assigns to the\n network interface. You cannot use this option if you use the Ipv6Prefixes\n option.

" } }, @@ -5764,7 +5715,19 @@ "target": "com.amazonaws.ec2#AssignPrivateIpAddressesResult" }, "traits": { - "smithy.api#documentation": "

Assigns one or more secondary private IP addresses to the specified network interface.

\n

You can specify one or more specific secondary IP addresses, or you can specify the number \n of secondary IP addresses to be automatically assigned within the subnet's CIDR block range. \n The number of secondary IP addresses that you can assign to an instance varies by instance type.\n For information about instance types, see Instance Types in the Amazon Elastic Compute Cloud User Guide. For more information about \n Elastic IP addresses, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

When you move a secondary private IP address to another network interface, any Elastic IP address \n that is associated with the IP address is also moved.

\n

Remapping an IP address is an asynchronous operation. When you move an IP address from one network\n interface to another, check network/interfaces/macs/mac/local-ipv4s in the instance\n metadata to confirm that the remapping is complete.

\n

You must specify either the IP addresses or the IP address count in the request.

\n

You can optionally use Prefix Delegation on the network interface. You must specify\n either the IPv4 Prefix Delegation prefixes, or the IPv4 Prefix Delegation count. For\n information, see \n Assigning prefixes to Amazon EC2 network interfaces in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Assigns one or more secondary private IP addresses to the specified network interface.

\n

You can specify one or more specific secondary IP addresses, or you can specify the number \n of secondary IP addresses to be automatically assigned within the subnet's CIDR block range. \n The number of secondary IP addresses that you can assign to an instance varies by instance type.\n For information about instance types, see Instance Types in the Amazon Elastic Compute Cloud User Guide. For more information about \n Elastic IP addresses, see Elastic IP Addresses in the Amazon Elastic Compute Cloud User Guide.

\n

When you move a secondary private IP address to another network interface, any Elastic IP address \n that is associated with the IP address is also moved.

\n

Remapping an IP address is an asynchronous operation. When you move an IP address from one network\n interface to another, check network/interfaces/macs/mac/local-ipv4s in the instance\n metadata to confirm that the remapping is complete.

\n

You must specify either the IP addresses or the IP address count in the request.

\n

You can optionally use Prefix Delegation on the network interface. You must specify\n either the IPv4 Prefix Delegation prefixes, or the IPv4 Prefix Delegation count. For\n information, see \n Assigning prefixes to Amazon EC2 network interfaces in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To assign a specific secondary private IP address to an interface", + "documentation": "This example assigns the specified secondary private IP address to the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + "10.0.0.82" + ] + } + } + ] } }, "com.amazonaws.ec2#AssignPrivateIpAddressesRequest": { @@ -5774,8 +5737,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowReassignment", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to allow an IP address that is already assigned to another network interface or instance to be reassigned to the specified network interface.

", "smithy.api#xmlName": "allowReassignment" } @@ -5802,8 +5763,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SecondaryPrivateIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary IP addresses to assign to the network interface. You can't specify this parameter when also specifying private IP addresses.

", "smithy.api#xmlName": "secondaryPrivateIpAddressCount" } @@ -5818,8 +5777,6 @@ "Ipv4PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 prefixes that Amazon Web Services automatically assigns to the network interface. You cannot use this option if you use the Ipv4 Prefixes option.

" } } @@ -5870,7 +5827,7 @@ "target": "com.amazonaws.ec2#AssignPrivateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Assigns one or more private IPv4 addresses to a private NAT gateway. For more information, see Work with NAT gateways in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Assigns one or more private IPv4 addresses to a private NAT gateway. For more information, see \n Work with NAT gateways in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssignPrivateNatGatewayAddressRequest": { @@ -5880,7 +5837,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -5894,16 +5851,12 @@ "PrivateIpAddressCount": { "target": "com.amazonaws.ec2#PrivateIpAddressCount", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of private IP addresses to assign to the NAT gateway. You can't specify this parameter when also specifying private IP addresses.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -5919,7 +5872,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -5970,7 +5923,20 @@ "target": "com.amazonaws.ec2#AssociateAddressResult" }, "traits": { - "smithy.api#documentation": "

Associates an Elastic IP address, or carrier IP address (for instances that are in\n subnets in Wavelength Zones) with an instance or a network interface. Before you can use an\n Elastic IP address, you must allocate it to your account.

\n

If the Elastic IP address is already\n associated with a different instance, it is disassociated from that instance and associated\n with the specified instance. If you associate an Elastic IP address with an instance that has\n an existing Elastic IP address, the existing address is disassociated from the instance, but\n remains allocated to your account.

\n

[Subnets in Wavelength Zones] You can associate an IP address from the telecommunication\n carrier to the instance or network interface.

\n

You cannot associate an Elastic IP address with an interface in a different network border group.

\n \n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2\n doesn't return an error, and you may be charged for each time the Elastic IP address is\n remapped to the same instance. For more information, see the Elastic IP\n Addresses section of Amazon EC2\n Pricing.

\n
" + "smithy.api#documentation": "

Associates an Elastic IP address, or carrier IP address (for instances that are in\n subnets in Wavelength Zones) with an instance or a network interface. Before you can use an\n Elastic IP address, you must allocate it to your account.

\n

If the Elastic IP address is already\n associated with a different instance, it is disassociated from that instance and associated\n with the specified instance. If you associate an Elastic IP address with an instance that has\n an existing Elastic IP address, the existing address is disassociated from the instance, but\n remains allocated to your account.

\n

[Subnets in Wavelength Zones] You can associate an IP address from the telecommunication\n carrier to the instance or network interface.

\n

You cannot associate an Elastic IP address with an interface in a different network border group.

\n \n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2\n doesn't return an error, and you may be charged for each time the Elastic IP address is\n remapped to the same instance. For more information, see the Elastic IP\n Addresses section of Amazon EC2\n Pricing.

\n
", + "smithy.api#examples": [ + { + "title": "To associate an Elastic IP address", + "documentation": "This example associates the specified Elastic IP address with the specified instance.", + "input": { + "AllocationId": "eipalloc-64d5890a", + "InstanceId": "i-0b263919b6498b123" + }, + "output": { + "AssociationId": "eipassoc-2bebb745" + } + } + ] } }, "com.amazonaws.ec2#AssociateAddressRequest": { @@ -5998,8 +5964,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowReassociation", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Reassociation is automatic, but you can specify false to ensure the operation fails if the Elastic IP address is already associated with another resource.

", "smithy.api#xmlName": "allowReassociation" } @@ -6008,8 +5972,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -6092,8 +6054,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -6135,7 +6095,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Associates a set of DHCP options (that you've previously created) with the specified VPC, or associates no DHCP options with the VPC.

\n

After you associate the options with the VPC, any existing instances and all new instances that you launch in that VPC use the options. You don't need to restart or relaunch the instances. They automatically pick up the changes within a few hours, depending on how frequently the instance renews its DHCP lease. You can explicitly renew the lease using the operating system on the instance.

\n

For more information, see DHCP options sets\n in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a set of DHCP options (that you've previously created) with the specified VPC, or associates no DHCP options with the VPC.

\n

After you associate the options with the VPC, any existing instances and all new instances that you launch in that VPC use the options. You don't need to restart or relaunch the instances. They automatically pick up the changes within a few hours, depending on how frequently the instance renews its DHCP lease. You can explicitly renew the lease using the operating system on the instance.

\n

For more information, see DHCP options sets\n in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To associate a DHCP options set with a VPC", + "documentation": "This example associates the specified DHCP options set with the specified VPC.", + "input": { + "DhcpOptionsId": "dopt-d9070ebb", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#AssociateDhcpOptionsRequest": { @@ -6161,8 +6131,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -6206,8 +6174,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -6257,7 +6223,30 @@ "target": "com.amazonaws.ec2#AssociateIamInstanceProfileResult" }, "traits": { - "smithy.api#documentation": "

Associates an IAM instance profile with a running or stopped instance. You cannot\n associate more than one IAM instance profile with an instance.

" + "smithy.api#documentation": "

Associates an IAM instance profile with a running or stopped instance. You cannot\n associate more than one IAM instance profile with an instance.

", + "smithy.api#examples": [ + { + "title": "To associate an IAM instance profile with an instance", + "documentation": "This example associates an IAM instance profile named admin-role with the specified instance.", + "input": { + "IamInstanceProfile": { + "Name": "admin-role" + }, + "InstanceId": "i-123456789abcde123" + }, + "output": { + "IamInstanceProfileAssociation": { + "InstanceId": "i-123456789abcde123", + "State": "associating", + "AssociationId": "iip-assoc-0e7736511a163c209", + "IamInstanceProfile": { + "Id": "AIPAJBLK7RKJKWDXVHIEC", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#AssociateIamInstanceProfileRequest": { @@ -6318,8 +6307,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -6378,8 +6365,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -6443,7 +6428,7 @@ "target": "com.amazonaws.ec2#AssociateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, see Work with NAT gateways in the Amazon Virtual Private Cloud User Guide.

\n

By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. For more information, see Elastic IP address quotas in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, \n see Work with NAT gateways in the Amazon VPC User Guide.

\n

By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. For more information, see Elastic IP address quotas in the Amazon VPC User Guide.

\n \n

When you associate an EIP or secondary EIPs with a public NAT gateway, the network border group of the EIPs must match the network border group of the Availability Zone (AZ) that the public NAT gateway is in. If it's not the same, the EIP will fail to associate. You can see the network border group for the subnet's AZ by viewing the details of the subnet. Similarly, you can view the network border group of an EIP by viewing the details of the EIP address. For more information about network border groups and EIPs, see Allocate an Elastic IP address in the Amazon VPC User Guide. \n

\n
" } }, "com.amazonaws.ec2#AssociateNatGatewayAddressRequest": { @@ -6453,7 +6438,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -6476,8 +6461,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6493,7 +6476,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -6519,7 +6502,20 @@ "target": "com.amazonaws.ec2#AssociateRouteTableResult" }, "traits": { - "smithy.api#documentation": "

Associates a subnet in your VPC or an internet gateway or virtual private gateway\n attached to your VPC with a route table in your VPC. This association causes traffic\n from the subnet or gateway to be routed according to the routes in the route table. The\n action returns an association ID, which you need in order to disassociate the route\n table later. A route table can be associated with multiple subnets.

\n

For more information, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a subnet in your VPC or an internet gateway or virtual private gateway\n attached to your VPC with a route table in your VPC. This association causes traffic\n from the subnet or gateway to be routed according to the routes in the route table. The\n action returns an association ID, which you need in order to disassociate the route\n table later. A route table can be associated with multiple subnets.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To associate a route table with a subnet", + "documentation": "This example associates the specified route table with the specified subnet.", + "input": { + "SubnetId": "subnet-9d4a7b6", + "RouteTableId": "rtb-22574640" + }, + "output": { + "AssociationId": "rtbassoc-781d0d1a" + } + } + ] } }, "com.amazonaws.ec2#AssociateRouteTableRequest": { @@ -6529,8 +6525,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -6694,8 +6688,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6754,8 +6746,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6814,8 +6804,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6874,16 +6862,12 @@ "VlanId": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ID of the VLAN. This applies to the VLAN protocol.

" } }, "GreKey": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The application key. This applies to the GRE protocol.

" } }, @@ -6897,8 +6881,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -6940,7 +6922,7 @@ "target": "com.amazonaws.ec2#AssociateVpcCidrBlockResult" }, "traits": { - "smithy.api#documentation": "

Associates a CIDR block with your VPC. You can associate a secondary IPv4 CIDR block,\n an Amazon-provided IPv6 CIDR block, or an IPv6 CIDR block from an IPv6 address pool that\n you provisioned through bring your own IP addresses (BYOIP). The IPv6 CIDR block size is fixed\n at /56.

\n

You must specify one of the following in the request: an IPv4 CIDR block, an IPv6\n pool, or an Amazon-provided IPv6 CIDR block.

\n

For more information about associating CIDR blocks with your VPC and applicable\n restrictions, see VPC and subnet sizing in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Associates a CIDR block with your VPC. You can associate a secondary IPv4 CIDR block,\n an Amazon-provided IPv6 CIDR block, or an IPv6 CIDR block from an IPv6 address pool that\n you provisioned through bring your own IP addresses (BYOIP). The IPv6 CIDR block size is fixed\n at /56.

\n

You must specify one of the following in the request: an IPv4 CIDR block, an IPv6\n pool, or an Amazon-provided IPv6 CIDR block.

\n

For more information about associating CIDR blocks with your VPC and applicable\n restrictions, see IP addressing for your VPCs and subnets \n in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#AssociateVpcCidrBlockRequest": { @@ -6950,8 +6932,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AmazonProvidedIpv6CidrBlock", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You cannot specify the range of IPv6 addresses, or the size of the CIDR block.

", "smithy.api#xmlName": "amazonProvidedIpv6CidrBlock" } @@ -7272,7 +7252,7 @@ "target": "com.amazonaws.ec2#AttachClassicLinkVpcResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Links an EC2-Classic instance to a ClassicLink-enabled VPC through one or more of the VPC's\n\t\t\tsecurity groups. You cannot link an EC2-Classic instance to more than one VPC at a time. You\n\t\t\tcan only link an instance that's in the running state. An instance is\n\t\t\tautomatically unlinked from a VPC when it's stopped - you can link it to the VPC again when\n\t\t\tyou restart it.

\n

After you've linked an instance, you cannot change the VPC security groups that are associated with it. To change the security groups, you must first unlink the instance, and then link it again.

\n

Linking your instance to a VPC is sometimes referred to as attaching your instance.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Links an EC2-Classic instance to a ClassicLink-enabled VPC through one or more of the VPC\n\t\t\tsecurity groups. You cannot link an EC2-Classic instance to more than one VPC at a time. You\n\t\t\tcan only link an instance that's in the running state. An instance is\n\t\t\tautomatically unlinked from a VPC when it's stopped - you can link it to the VPC again when\n\t\t\tyou restart it.

\n

After you've linked an instance, you cannot change the VPC security groups that are associated with it. To change the security groups, you must first unlink the instance, and then link it again.

\n

Linking your instance to a VPC is sometimes referred to as attaching your instance.

" } }, "com.amazonaws.ec2#AttachClassicLinkVpcRequest": { @@ -7282,8 +7262,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7292,7 +7270,7 @@ "target": "com.amazonaws.ec2#GroupIdStringList", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of one or more of the VPC's security groups. You cannot specify security groups from a different VPC.

", + "smithy.api#documentation": "

The IDs of the security groups. You cannot specify security groups from a different VPC.

", "smithy.api#required": {}, "smithy.api#xmlName": "SecurityGroupId" } @@ -7302,7 +7280,7 @@ "traits": { "aws.protocols#ec2QueryName": "InstanceId", "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of an EC2-Classic instance to link to the ClassicLink-enabled VPC.

", + "smithy.api#documentation": "

The ID of the EC2-Classic instance.

", "smithy.api#required": {}, "smithy.api#xmlName": "instanceId" } @@ -7312,7 +7290,7 @@ "traits": { "aws.protocols#ec2QueryName": "VpcId", "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of a ClassicLink-enabled VPC.

", + "smithy.api#documentation": "

The ID of the ClassicLink-enabled VPC.

", "smithy.api#required": {}, "smithy.api#xmlName": "vpcId" } @@ -7329,8 +7307,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -7349,7 +7325,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity between the internet and\n\t\t\tthe VPC. For more information about your VPC and internet gateway, see the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity \n\t\t between the internet and the VPC. For more information, see Internet gateways in the \n\t\t Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach an Internet gateway to a VPC", + "documentation": "This example attaches the specified Internet gateway to the specified VPC.", + "input": { + "InternetGatewayId": "igw-c0a643a9", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#AttachInternetGatewayRequest": { @@ -7359,8 +7345,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7399,7 +7383,21 @@ "target": "com.amazonaws.ec2#AttachNetworkInterfaceResult" }, "traits": { - "smithy.api#documentation": "

Attaches a network interface to an instance.

" + "smithy.api#documentation": "

Attaches a network interface to an instance.

", + "smithy.api#examples": [ + { + "title": "To attach a network interface to an instance", + "documentation": "This example attaches the specified network interface to the specified instance.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "InstanceId": "i-1234567890abcdef0", + "DeviceIndex": 1 + }, + "output": { + "AttachmentId": "eni-attach-66c4350a" + } + } + ] } }, "com.amazonaws.ec2#AttachNetworkInterfaceRequest": { @@ -7410,7 +7408,6 @@ "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the device for the network interface attachment.

", "smithy.api#required": {}, "smithy.api#xmlName": "deviceIndex" @@ -7420,8 +7417,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7449,8 +7444,6 @@ "NetworkCardIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card. Some instance types support multiple network cards. \n The primary network interface must be assigned to network card index 0. \n The default is network card index 0.

" } }, @@ -7481,8 +7474,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetworkCardIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card.

", "smithy.api#xmlName": "networkCardIndex" } @@ -7534,8 +7525,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -7577,7 +7566,25 @@ "target": "com.amazonaws.ec2#VolumeAttachment" }, "traits": { - "smithy.api#documentation": "

Attaches an EBS volume to a running or stopped instance and exposes it to the instance\n with the specified device name.

\n

Encrypted EBS volumes must be attached to instances that support Amazon EBS encryption. For\n more information, see Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

\n

After you attach an EBS volume, you must make it available. For more information, see \n Make an EBS volume available for use.

\n

If a volume has an Amazon Web Services Marketplace product code:

\n
    \n
  • \n

    The volume can be attached only to a stopped instance.

    \n
  • \n
  • \n

    Amazon Web Services Marketplace product codes are copied from the volume to the instance.

    \n
  • \n
  • \n

    You must be subscribed to the product.

    \n
  • \n
  • \n

    The instance type and operating system of the instance must support the product. For\n example, you can't detach a volume from a Windows instance and attach it to a Linux\n instance.

    \n
  • \n
\n

For more information, see Attach an Amazon EBS volume to an instance in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Attaches an EBS volume to a running or stopped instance and exposes it to the instance\n with the specified device name.

\n

Encrypted EBS volumes must be attached to instances that support Amazon EBS encryption. For\n more information, see Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

\n

After you attach an EBS volume, you must make it available. For more information, see \n Make an EBS volume available for use.

\n

If a volume has an Amazon Web Services Marketplace product code:

\n
    \n
  • \n

    The volume can be attached only to a stopped instance.

    \n
  • \n
  • \n

    Amazon Web Services Marketplace product codes are copied from the volume to the instance.

    \n
  • \n
  • \n

    You must be subscribed to the product.

    \n
  • \n
  • \n

    The instance type and operating system of the instance must support the product. For\n example, you can't detach a volume from a Windows instance and attach it to a Linux\n instance.

    \n
  • \n
\n

For more information, see Attach an Amazon EBS volume to an instance in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a volume to an instance", + "documentation": "This example attaches a volume (``vol-1234567890abcdef0``) to an instance (``i-01474ef662b89480``) as ``/dev/sdf``.", + "input": { + "VolumeId": "vol-1234567890abcdef0", + "InstanceId": "i-01474ef662b89480", + "Device": "/dev/sdf" + }, + "output": { + "AttachTime": "2016-08-29T18:52:32.724Z", + "InstanceId": "i-01474ef662b89480", + "VolumeId": "vol-1234567890abcdef0", + "State": "attaching", + "Device": "/dev/sdf" + } + } + ] } }, "com.amazonaws.ec2#AttachVolumeRequest": { @@ -7611,8 +7618,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7657,8 +7662,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -7693,8 +7696,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSrdEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether ENA Express is enabled for the network interface that's attached to the\n\t\t\tinstance.

", "smithy.api#xmlName": "enaSrdEnabled" } @@ -7719,8 +7720,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSrdUdpEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether UDP traffic to and from the instance uses ENA Express. To specify this setting, \n\t\t\tyou must first enable ENA Express.

", "smithy.api#xmlName": "enaSrdUdpEnabled" } @@ -7766,8 +7765,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Value", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The attribute value. The valid values are true or false.

", "smithy.api#xmlName": "value" } @@ -7824,8 +7821,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AccessAll", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the authorization rule grants access to all clients.

", "smithy.api#xmlName": "accessAll" } @@ -7900,8 +7895,6 @@ "AuthorizeAllGroups": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to grant access to all clients. Specify true to grant all\n clients who successfully establish a VPN connection access to the network. Must be set\n to true if AccessGroupId is not specified.

" } }, @@ -7921,8 +7914,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -7956,7 +7947,29 @@ "target": "com.amazonaws.ec2#AuthorizeSecurityGroupEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Adds the specified outbound (egress) rules to a security group for use with a VPC.

\n

An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 CIDR\n address ranges, or to the instances that are associated with the specified source\n security groups. When specifying an outbound rule for your security group in a VPC, the\n IpPermissions must include a destination for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For the TCP and UDP protocols, you must also specify the destination port or port range. \n For the ICMP protocol, you must also specify the ICMP type and code. \n You can use -1 for the type or code to mean all types or all codes.

\n

Rule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.

\n

For information about VPC security group quotas, see Amazon VPC quotas.

" + "smithy.api#documentation": "

Adds the specified outbound (egress) rules to a security group for use with a VPC.

\n

An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 CIDR\n address ranges, or to the instances that are associated with the specified source\n security groups. When specifying an outbound rule for your security group in a VPC, the\n IpPermissions must include a destination for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For the TCP and UDP protocols, you must also specify the destination port or port range. \n For the ICMP protocol, you must also specify the ICMP type and code. \n You can use -1 for the type or code to mean all types or all codes.

\n

Rule changes are propagated to affected instances as quickly as possible. However, a small delay might occur.

\n

For information about VPC security group quotas, see Amazon VPC quotas.

", + "smithy.api#examples": [ + { + "title": "To add a rule that allows outbound traffic to a specific address range", + "documentation": "This example adds a rule that grants access to the specified address ranges on TCP port 80.", + "input": { + "GroupId": "sg-1a2b3c4d", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 80, + "ToPort": 80, + "IpRanges": [ + { + "CidrIp": "10.0.0.0/16" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#AuthorizeSecurityGroupEgressRequest": { @@ -7966,8 +7979,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -8009,8 +8020,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Not supported. Use a set of IP permissions to specify the port.

", "smithy.api#xmlName": "fromPort" } @@ -8027,8 +8036,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Not supported. Use a set of IP permissions to specify the port.

", "smithy.api#xmlName": "toPort" } @@ -8061,8 +8068,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -8089,7 +8094,30 @@ "target": "com.amazonaws.ec2#AuthorizeSecurityGroupIngressResult" }, "traits": { - "smithy.api#documentation": "

Adds the specified inbound (ingress) rules to a security group.

\n

An inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 CIDR\n address range, or from the instances that are associated with the specified destination security \n groups. When specifying an inbound rule for your security group in a VPC, the\n IpPermissions must include a source for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For TCP and UDP, you must also specify the destination port or port range. \n For ICMP/ICMPv6, you must also specify the ICMP/ICMPv6 type and code. \n You can use -1 to mean all types or all codes.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

\n

For more information about VPC security group quotas, see Amazon VPC quotas.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Adds the specified inbound (ingress) rules to a security group.

\n

An inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 CIDR\n address range, or from the instances that are associated with the specified destination security \n groups. When specifying an inbound rule for your security group in a VPC, the\n IpPermissions must include a source for the traffic.

\n

You specify a protocol for each rule (for example, TCP). \n For TCP and UDP, you must also specify the destination port or port range. \n For ICMP/ICMPv6, you must also specify the ICMP/ICMPv6 type and code. \n You can use -1 to mean all types or all codes.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

\n

For more information about VPC security group quotas, see Amazon VPC quotas.

", + "smithy.api#examples": [ + { + "title": "To add a rule that allows inbound SSH traffic from an IPv4 address range", + "documentation": "This example enables inbound traffic on TCP port 22 (SSH). The rule includes a description to help you identify it later.", + "input": { + "GroupId": "sg-903004f8", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 22, + "ToPort": 22, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/24", + "Description": "SSH access from the LA office" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#AuthorizeSecurityGroupIngressRequest": { @@ -8104,8 +8132,6 @@ "FromPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP, this is the type number. A value of -1 indicates all ICMP types. \n If you specify all ICMP types, you must specify all ICMP codes.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" } }, @@ -8118,7 +8144,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -8130,26 +8156,24 @@ "IpProtocol": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp) or number\n (see Protocol Numbers). To specify icmpv6, use a set of IP permissions.

\n

[VPC only] Use -1 to specify all protocols. If you specify -1 or a \n protocol other than tcp, udp, or icmp, traffic on all ports \n is allowed, regardless of any ports you specify.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" + "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp) or number\n (see Protocol Numbers). To specify icmpv6, use a set of IP permissions.

\n

Use -1 to specify all protocols. If you specify -1 or a \n protocol other than tcp, udp, or icmp, traffic on all ports \n is allowed, regardless of any ports you specify.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" } }, "SourceSecurityGroupName": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. Creates rules that grant full ICMP, UDP, and TCP access. \n To create a rule with a specific IP protocol and port range, use a set of IP permissions instead. For \n EC2-VPC, the source security group must be in the same VPC.

" + "smithy.api#documentation": "

[Default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. Creates rules that grant full ICMP, UDP, and TCP access. \n To create a rule with a specific IP protocol and port range, use a set of IP permissions instead. \n The source security group must be in the same VPC.

" } }, "SourceSecurityGroupOwnerId": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[nondefault VPC] The Amazon Web Services account ID for the source security group, if the source security group is \n in a different account. You can't specify this parameter in combination with the following parameters: \n the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. \n Creates rules that grant full ICMP, UDP, and TCP access. To create a rule with a specific IP protocol \n and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

[Nondefault VPC] The Amazon Web Services account ID for the source security group, if the source security group is \n in a different account. You can't specify this parameter in combination with the following parameters: \n the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. \n Creates rules that grant full ICMP, UDP, and TCP access. To create a rule with a specific IP protocol \n and port range, use a set of IP permissions instead.

" } }, "ToPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP, this is the code. A value of -1 indicates all ICMP codes. \n If you specify all ICMP types, you must specify all ICMP codes.

\n

Alternatively, use a set of IP permissions to specify multiple rules and a description for the rule.

" } }, @@ -8157,8 +8181,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -8182,8 +8204,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -8351,6 +8371,9 @@ "smithy.api#documentation": "

Describes Availability Zones, Local Zones, and Wavelength Zones.

" } }, + "com.amazonaws.ec2#AvailabilityZoneId": { + "type": "string" + }, "com.amazonaws.ec2#AvailabilityZoneList": { "type": "list", "member": { @@ -8464,8 +8487,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableVCpus", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of vCPUs available for launching instances onto the Dedicated Host.

", "smithy.api#xmlName": "availableVCpus" } @@ -8510,6 +8531,9 @@ "com.amazonaws.ec2#BareMetalFlag": { "type": "boolean" }, + "com.amazonaws.ec2#BaselineBandwidthInGbps": { + "type": "double" + }, "com.amazonaws.ec2#BaselineBandwidthInMbps": { "type": "integer" }, @@ -8520,8 +8544,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum baseline bandwidth, in Mbps. If this parameter is not specified, there is no\n minimum limit.

", "smithy.api#xmlName": "min" } @@ -8530,8 +8552,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum baseline bandwidth, in Mbps. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -8547,16 +8567,12 @@ "Min": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum baseline bandwidth, in Mbps. To specify no minimum limit, omit\n this parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum baseline bandwidth, in Mbps. To specify no maximum limit, omit\n this parameter.

" } } @@ -8718,10 +8734,7 @@ } }, "com.amazonaws.ec2#Boolean": { - "type": "boolean", - "traits": { - "smithy.api#default": false - } + "type": "boolean" }, "com.amazonaws.ec2#BootModeType": { "type": "enum", @@ -8822,8 +8835,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9187,8 +9198,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9276,8 +9285,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -9333,8 +9340,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -9350,8 +9355,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -9378,8 +9381,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9429,7 +9430,7 @@ "traits": { "aws.protocols#ec2QueryName": "ExportTaskId", "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of the export task. This is the ID returned by CreateInstanceExportTask.

", + "smithy.api#documentation": "

The ID of the export task. This is the ID returned by the\n CreateInstanceExportTask and ExportImage operations.

", "smithy.api#required": {}, "smithy.api#xmlName": "exportTaskId" } @@ -9465,8 +9466,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -9482,8 +9481,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -9517,8 +9514,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -9622,7 +9617,28 @@ "target": "com.amazonaws.ec2#CancelSpotFleetRequestsResponse" }, "traits": { - "smithy.api#documentation": "

Cancels the specified Spot Fleet requests.

\n

After you cancel a Spot Fleet request, the Spot Fleet launches no new instances.

\n

You must also specify whether a canceled Spot Fleet request should terminate its instances. If you\n choose to terminate the instances, the Spot Fleet request enters the\n cancelled_terminating state. Otherwise, the Spot Fleet request enters\n the cancelled_running state and the instances continue to run until they\n are interrupted or you terminate them manually.

" + "smithy.api#documentation": "

Cancels the specified Spot Fleet requests.

\n

After you cancel a Spot Fleet request, the Spot Fleet launches no new instances.

\n

You must also specify whether a canceled Spot Fleet request should terminate its instances. If you\n choose to terminate the instances, the Spot Fleet request enters the\n cancelled_terminating state. Otherwise, the Spot Fleet request enters\n the cancelled_running state and the instances continue to run until they\n are interrupted or you terminate them manually.

", + "smithy.api#examples": [ + { + "title": "To cancel a Spot fleet request", + "documentation": "This example cancels the specified Spot fleet request and terminates its associated Spot Instances.", + "input": { + "SpotFleetRequestIds": [ + "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + ], + "TerminateInstances": true + }, + "output": { + "SuccessfulFleetRequests": [ + { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "CurrentSpotFleetRequestState": "cancelled_running", + "PreviousSpotFleetRequestState": "active" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CancelSpotFleetRequestsError": { @@ -9689,8 +9705,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9710,7 +9724,6 @@ "traits": { "aws.protocols#ec2QueryName": "TerminateInstances", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to terminate the associated instances when the Spot Fleet request is canceled. \n The default is to terminate the instances.

\n

To let the instances continue to run after the Spot Fleet request is canceled, specify\n no-terminate-instances.

", "smithy.api#required": {}, "smithy.api#xmlName": "terminateInstances" @@ -9832,7 +9845,26 @@ "target": "com.amazonaws.ec2#CancelSpotInstanceRequestsResult" }, "traits": { - "smithy.api#documentation": "

Cancels one or more Spot Instance requests.

\n \n

Canceling a Spot Instance request does not terminate running Spot Instances\n associated with the request.

\n
" + "smithy.api#documentation": "

Cancels one or more Spot Instance requests.

\n \n

Canceling a Spot Instance request does not terminate running Spot Instances\n associated with the request.

\n
", + "smithy.api#examples": [ + { + "title": "To cancel Spot Instance requests", + "documentation": "This example cancels a Spot Instance request.", + "input": { + "SpotInstanceRequestIds": [ + "sir-08b93456" + ] + }, + "output": { + "CancelledSpotInstanceRequests": [ + { + "State": "cancelled", + "SpotInstanceRequestId": "sir-08b93456" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CancelSpotInstanceRequestsRequest": { @@ -9842,8 +9874,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -9928,8 +9958,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Count", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of instance capacity associated with the usage. For example a value of \n\t\t\t4 indicates that instance capacity for 4 instances is currently in use.

", "smithy.api#xmlName": "count" } @@ -10019,8 +10047,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of instances for which the Capacity Reservation reserves capacity.

", "smithy.api#xmlName": "totalInstanceCount" } @@ -10029,8 +10055,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The remaining capacity. Indicates the number of instances that can be launched in the Capacity Reservation.

", "smithy.api#xmlName": "availableInstanceCount" } @@ -10039,8 +10063,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Capacity Reservation supports EBS-optimized instances. This optimization provides\n\t\t\tdedicated throughput to Amazon EBS and an optimized configuration stack to provide\n\t\t\toptimal I/O performance. This optimization isn't available with all instance types.\n\t\t\tAdditional usage charges apply when using an EBS- optimized instance.

", "smithy.api#xmlName": "ebsOptimized" } @@ -10049,8 +10071,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EphemeralStorage", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

\n Deprecated.\n

", "smithy.api#xmlName": "ephemeralStorage" } @@ -10179,8 +10199,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of capacity units for which the Capacity Reservation Fleet reserves capacity. \n\t\t\tFor more information, see Total target capacity \n\t\t\tin the Amazon EC2 User Guide.

", "smithy.api#xmlName": "totalTargetCapacity" } @@ -10189,8 +10207,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "TotalFulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The capacity units that have been fulfilled.

", "smithy.api#xmlName": "totalFulfilledCapacity" } @@ -10526,6 +10542,12 @@ "traits": { "smithy.api#enumValue": "RHEL with HA and SQL Server Enterprise" } + }, + "UBUNTU_PRO_LINUX": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Ubuntu Pro" + } } } }, @@ -10785,7 +10807,6 @@ "com.amazonaws.ec2#CarrierGatewayMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -10922,8 +10943,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ClassicLinkDnsSupported", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether ClassicLink DNS support is enabled for the VPC.

", "smithy.api#xmlName": "classicLinkDnsSupported" } @@ -10938,7 +10957,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes the ClassicLink DNS support status of a VPC.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes the ClassicLink DNS support status of a VPC.

" } }, "com.amazonaws.ec2#ClassicLinkDnsSupportList": { @@ -10957,7 +10976,7 @@ "target": "com.amazonaws.ec2#GroupIdentifierList", "traits": { "aws.protocols#ec2QueryName": "GroupSet", - "smithy.api#documentation": "

A list of security groups.

", + "smithy.api#documentation": "

The security groups.

", "smithy.api#xmlName": "groupSet" } }, @@ -10987,7 +11006,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes a linked EC2-Classic instance.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes a linked EC2-Classic instance.

" } }, "com.amazonaws.ec2#ClassicLinkInstanceList": { @@ -11093,8 +11112,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether client connect options are enabled. The default is false (not enabled).

" } }, @@ -11116,8 +11133,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether client connect options are enabled.

", "smithy.api#xmlName": "enabled" } @@ -11161,8 +11176,6 @@ "UploadSize": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the uploaded disk image, in GiB.

" } }, @@ -11183,8 +11196,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Enable or disable a customizable text banner that will be displayed on\n\t\t\tAmazon Web Services provided clients when a VPN session is established.

\n

Valid values: true | false\n

\n

Default value: false\n

" } }, @@ -11206,8 +11217,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Current state of text banner feature.

\n

Valid values: true | false\n

", "smithy.api#xmlName": "enabled" } @@ -11650,8 +11659,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SplitTunnel", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether split-tunnel is enabled in the Client VPN endpoint.

\n

For information about split-tunnel VPN endpoints, see Split-Tunnel Client VPN endpoint \n\t\t\tin the Client VPN Administrator Guide.

", "smithy.api#xmlName": "splitTunnel" } @@ -11676,8 +11683,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VpnPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port number for the Client VPN endpoint.

", "smithy.api#xmlName": "vpnPort" } @@ -11761,8 +11766,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SessionTimeoutHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum VPN session duration time in hours.

\n

Valid values: 8 | 10 | 12 | 24\n

\n

Default value: 24\n

", "smithy.api#xmlName": "sessionTimeoutHours" } @@ -12031,8 +12034,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "LogEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Status of VPN tunnel logging feature. Default value is False.

\n

Valid values: True | False\n

", "smithy.api#xmlName": "logEnabled" } @@ -12064,8 +12065,6 @@ "LogEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Enable or disable VPN tunnel logging feature. Default value is False.

\n

Valid values: True | False\n

" } }, @@ -12230,7 +12229,6 @@ "com.amazonaws.ec2#CoipPoolMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -12267,7 +12265,20 @@ "target": "com.amazonaws.ec2#ConfirmProductInstanceResult" }, "traits": { - "smithy.api#documentation": "

Determines whether a product code is associated with an instance. This action can only\n be used by the owner of the product code. It is useful when a product code owner must\n verify whether another user's instance is eligible for support.

" + "smithy.api#documentation": "

Determines whether a product code is associated with an instance. This action can only\n be used by the owner of the product code. It is useful when a product code owner must\n verify whether another user's instance is eligible for support.

", + "smithy.api#examples": [ + { + "title": "To confirm the product instance", + "documentation": "This example determines whether the specified product code is associated with the specified instance.", + "input": { + "ProductCode": "774F4FF8", + "InstanceId": "i-1234567890abcdef0" + }, + "output": { + "OwnerId": "123456789012" + } + } + ] } }, "com.amazonaws.ec2#ConfirmProductInstanceRequest": { @@ -12293,8 +12304,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -12319,8 +12328,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The return value of the request. Returns true if the specified product\n code is owned by the requester and associated with the specified instance.

", "smithy.api#xmlName": "return" } @@ -12336,8 +12343,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether connection logging is enabled.

" } }, @@ -12364,8 +12369,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether client connection logging is enabled for the Client VPN endpoint.

" } }, @@ -12650,8 +12653,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -12719,7 +12720,22 @@ "target": "com.amazonaws.ec2#CopyImageResult" }, "traits": { - "smithy.api#documentation": "

Initiates the copy of an AMI. You can copy an AMI from one Region to another, or from a\n Region to an Outpost. You can't copy an AMI from an Outpost to a Region, from one Outpost\n to another, or within the same Outpost. To copy an AMI to another partition, see CreateStoreImageTask.

\n

To copy an AMI from one Region to another, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tdestination Region using its endpoint. Copies of encrypted backing snapshots for\n \t\tthe AMI are encrypted. Copies of unencrypted backing snapshots remain unencrypted, \n \t\tunless you set Encrypted during the copy operation. You cannot \n \t\tcreate an unencrypted copy of an encrypted backing snapshot.

\n

To copy an AMI from a Region to an Outpost, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tARN of the destination Outpost using DestinationOutpostArn. \n \t\tBacking snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon EC2 User Guide.

\n

For more information about the prerequisites and limits when copying an AMI, see Copy an AMI in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Initiates the copy of an AMI. You can copy an AMI from one Region to another, or from a\n Region to an Outpost. You can't copy an AMI from an Outpost to a Region, from one Outpost\n to another, or within the same Outpost. To copy an AMI to another partition, see CreateStoreImageTask.

\n

To copy an AMI from one Region to another, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tdestination Region using its endpoint. Copies of encrypted backing snapshots for\n \t\tthe AMI are encrypted. Copies of unencrypted backing snapshots remain unencrypted, \n \t\tunless you set Encrypted during the copy operation. You cannot \n \t\tcreate an unencrypted copy of an encrypted backing snapshot.

\n

To copy an AMI from a Region to an Outpost, specify the source Region using the \n \t\tSourceRegion parameter, and specify the \n \t\tARN of the destination Outpost using DestinationOutpostArn. \n \t\tBacking snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon EC2 User Guide.

\n

For more information about the prerequisites and limits when copying an AMI, see Copy an AMI in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To copy an AMI to another region", + "documentation": "This example copies the specified AMI from the us-east-1 region to the current region.", + "input": { + "Description": "", + "Name": "My server", + "SourceImageId": "ami-5731123e", + "SourceRegion": "us-east-1" + }, + "output": { + "ImageId": "ami-438bea42" + } + } + ] } }, "com.amazonaws.ec2#CopyImageRequest": { @@ -12741,8 +12757,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether the destination snapshots of the copied image should be encrypted. You\n can encrypt a copy of an unencrypted snapshot, but you cannot create an unencrypted copy of an\n encrypted snapshot. The default KMS key for Amazon EBS is used unless you specify a non-default\n Key Management Service (KMS) KMS key using KmsKeyId. For more information, see Amazon EBS encryption in the\n Amazon EC2 User Guide.

", "smithy.api#xmlName": "encrypted" } @@ -12789,8 +12803,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -12798,8 +12810,6 @@ "CopyImageTags": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to include your user-defined AMI tags when copying the AMI.

\n

The following tags will not be copied:

\n
    \n
  • \n

    System tags (prefixed with aws:)

    \n
  • \n
  • \n

    For public and shared AMIs, user-defined tags that are attached by other Amazon Web Services \n accounts

    \n
  • \n
\n

Default: Your user-defined AMI tags are not copied.

" } } @@ -12835,7 +12845,22 @@ "target": "com.amazonaws.ec2#CopySnapshotResult" }, "traits": { - "smithy.api#documentation": "

Copies a point-in-time snapshot of an EBS volume and stores it in Amazon S3. You can copy a\n snapshot within the same Region, from one Region to another, or from a Region to an Outpost. \n You can't copy a snapshot from an Outpost to a Region, from one Outpost to another, or within \n the same Outpost.

\n

You can use the snapshot to create EBS volumes or Amazon Machine Images (AMIs).

\n

When copying snapshots to a Region, copies of encrypted EBS snapshots remain encrypted. \n \tCopies of unencrypted snapshots remain unencrypted, unless you enable encryption for the \n \tsnapshot copy operation. By default, encrypted snapshot copies use the default Key Management Service (KMS) \n \tKMS key; however, you can specify a different KMS key. To copy an encrypted \n \tsnapshot that has been shared from another account, you must have permissions for the KMS key \n \tused to encrypt the snapshot.

\n

Snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon Elastic Compute Cloud User Guide.

\n

Snapshots created by copying another snapshot have an arbitrary volume ID that should not\n be used for any purpose.

\n

For more information, see Copy an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Copies a point-in-time snapshot of an EBS volume and stores it in Amazon S3. You can copy a\n snapshot within the same Region, from one Region to another, or from a Region to an Outpost. \n You can't copy a snapshot from an Outpost to a Region, from one Outpost to another, or within \n the same Outpost.

\n

You can use the snapshot to create EBS volumes or Amazon Machine Images (AMIs).

\n

When copying snapshots to a Region, copies of encrypted EBS snapshots remain encrypted. \n \tCopies of unencrypted snapshots remain unencrypted, unless you enable encryption for the \n \tsnapshot copy operation. By default, encrypted snapshot copies use the default Key Management Service (KMS) \n \tKMS key; however, you can specify a different KMS key. To copy an encrypted \n \tsnapshot that has been shared from another account, you must have permissions for the KMS key \n \tused to encrypt the snapshot.

\n

Snapshots copied to an Outpost are encrypted by default using the default\n \t\tencryption key for the Region, or a different key that you specify in the request using \n \t\tKmsKeyId. Outposts do not support unencrypted \n \t\tsnapshots. For more information, \n \t\t\tAmazon EBS local snapshots on Outposts in the Amazon Elastic Compute Cloud User Guide.

\n

Snapshots created by copying another snapshot have an arbitrary volume ID that should not\n be used for any purpose.

\n

For more information, see Copy an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To copy a snapshot", + "documentation": "This example copies a snapshot with the snapshot ID of ``snap-066877671789bd71b`` from the ``us-west-2`` region to the ``us-east-1`` region and adds a short description to identify the snapshot.", + "input": { + "SourceRegion": "us-west-2", + "SourceSnapshotId": "snap-066877671789bd71b", + "Description": "This is my copied snapshot.", + "DestinationRegion": "us-east-1" + }, + "output": { + "SnapshotId": "snap-066877671789bd71b" + } + } + ] } }, "com.amazonaws.ec2#CopySnapshotRequest": { @@ -12865,8 +12890,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

To encrypt a copy of an unencrypted snapshot if encryption by default is not enabled, \n enable encryption using this parameter. Otherwise, omit this parameter. Encrypted snapshots \n are encrypted, even if you omit this parameter and encryption by default is not enabled. You \n cannot set this parameter to false. For more information, see Amazon EBS encryption in the \n Amazon Elastic Compute Cloud User Guide.

", "smithy.api#xmlName": "encrypted" } @@ -12914,8 +12937,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -13020,8 +13041,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "CoreCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of CPU cores for the instance.

", "smithy.api#xmlName": "coreCount" } @@ -13030,8 +13049,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ThreadsPerCore", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of threads per CPU core.

", "smithy.api#xmlName": "threadsPerCore" } @@ -13040,7 +13057,7 @@ "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { "aws.protocols#ec2QueryName": "AmdSevSnp", - "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP.

", + "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP. For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "amdSevSnp" } } @@ -13055,23 +13072,19 @@ "CoreCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of CPU cores for the instance.

" } }, "ThreadsPerCore": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of threads per CPU core. To disable multithreading for the instance,\n specify a value of 1. Otherwise, specify the default value of\n 2.

" } }, "AmdSevSnp": { "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { - "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only.

" + "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only. For more information, see \n AMD SEV-SNP.

" } } }, @@ -13138,7 +13151,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of capacity units to be reserved by the Capacity Reservation Fleet. This \n\t\t\tvalue, together with the instance type weights that you assign to each instance type used by \n\t\t\tthe Fleet determine the number of instances for which the Fleet reserves capacity. Both values \n\t\t\tare based on units that make sense for your workload. For more information, see \n\t\t\t\tTotal target capacity in the Amazon EC2 User Guide.

", "smithy.api#required": {} } @@ -13165,8 +13177,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -13198,8 +13208,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of capacity units for which the Capacity Reservation Fleet reserves capacity.

", "smithy.api#xmlName": "totalTargetCapacity" } @@ -13208,8 +13216,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "TotalFulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The requested capacity units that have been successfully reserved.

", "smithy.api#xmlName": "totalFulfilledCapacity" } @@ -13301,13 +13307,13 @@ } }, "AvailabilityZone": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#AvailabilityZoneName", "traits": { "smithy.api#documentation": "

The Availability Zone in which to create the Capacity Reservation.

" } }, "AvailabilityZoneId": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#AvailabilityZoneId", "traits": { "smithy.api#documentation": "

The ID of the Availability Zone in which to create the Capacity Reservation.

" } @@ -13322,7 +13328,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances for which to reserve capacity.

\n

Valid range: 1 - 1000

", "smithy.api#required": {} } @@ -13330,16 +13335,12 @@ "EbsOptimized": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Capacity Reservation supports EBS-optimized instances. This optimization provides\n\t\t\tdedicated throughput to Amazon EBS and an optimized configuration stack to provide\n\t\t\toptimal I/O performance. This optimization isn't available with all instance types.\n\t\t\tAdditional usage charges apply when using an EBS- optimized instance.

" } }, "EphemeralStorage": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

\n Deprecated.\n

" } }, @@ -13370,8 +13371,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -13441,8 +13440,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -13537,8 +13534,6 @@ "VpnPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port number to assign to the Client VPN endpoint for TCP and UDP traffic.

\n

Valid Values: 443 | 1194\n

\n

Default Value: 443\n

" } }, @@ -13551,16 +13546,12 @@ "SplitTunnel": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether split-tunnel is enabled on the Client VPN endpoint.

\n

By default, split-tunnel on a VPN endpoint is disabled.

\n

For information about split-tunnel VPN endpoints, see Split-tunnel Client VPN endpoint in the \n\t\t\tClient VPN Administrator Guide.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -13606,8 +13597,6 @@ "SessionTimeoutHours": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum VPN session duration time in hours.

\n

Valid values: 8 | 10 | 12 | 24\n

\n

Default value: 24\n

" } }, @@ -13709,8 +13698,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -13769,8 +13756,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -13828,8 +13813,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -13863,7 +13846,27 @@ "target": "com.amazonaws.ec2#CreateCustomerGatewayResult" }, "traits": { - "smithy.api#documentation": "

Provides information to Amazon Web Services about your customer gateway device. The\n customer gateway device is the appliance at your end of the VPN connection. You\n must provide the IP address of the customer gateway device’s external\n interface. The IP address must be static and can be behind a device performing network\n address translation (NAT).

\n

For devices that use Border Gateway Protocol (BGP), you can also provide the device's\n BGP Autonomous System Number (ASN). You can use an existing ASN assigned to your network.\n If you don't have an ASN already, you can use a private ASN. For more information, see \n Customer gateway \n options for your Site-to-Site VPN connection in the Amazon Web Services Site-to-Site VPN User Guide.

\n

To create more than one customer gateway with the same VPN type, IP address, and\n BGP ASN, specify a unique device name for each customer gateway. An identical request\n returns information about the existing customer gateway; it doesn't create a new customer\n gateway.

" + "smithy.api#documentation": "

Provides information to Amazon Web Services about your customer gateway device. The\n customer gateway device is the appliance at your end of the VPN connection. You\n must provide the IP address of the customer gateway device’s external\n interface. The IP address must be static and can be behind a device performing network\n address translation (NAT).

\n

For devices that use Border Gateway Protocol (BGP), you can also provide the device's\n BGP Autonomous System Number (ASN). You can use an existing ASN assigned to your network.\n If you don't have an ASN already, you can use a private ASN. For more information, see \n Customer gateway \n options for your Site-to-Site VPN connection in the Amazon Web Services Site-to-Site VPN User Guide.

\n

To create more than one customer gateway with the same VPN type, IP address, and\n BGP ASN, specify a unique device name for each customer gateway. An identical request\n returns information about the existing customer gateway; it doesn't create a new customer\n gateway.

", + "smithy.api#examples": [ + { + "title": "To create a customer gateway", + "documentation": "This example creates a customer gateway with the specified IP address for its outside interface.", + "input": { + "Type": "ipsec.1", + "PublicIp": "12.1.2.3", + "BgpAsn": 65534 + }, + "output": { + "CustomerGateway": { + "CustomerGatewayId": "cgw-0e11f167", + "IpAddress": "12.1.2.3", + "State": "available", + "Type": "ipsec.1", + "BgpAsn": "65534" + } + } + } + ] } }, "com.amazonaws.ec2#CreateCustomerGatewayRequest": { @@ -13872,8 +13875,6 @@ "BgpAsn": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

For devices that support BGP, the customer gateway's BGP ASN.

\n

Default: 65000

" } }, @@ -13920,8 +13921,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -13958,14 +13957,14 @@ "target": "com.amazonaws.ec2#CreateDefaultSubnetResult" }, "traits": { - "smithy.api#documentation": "

Creates a default subnet with a size /20 IPv4 CIDR block in the\n specified Availability Zone in your default VPC. You can have only one default subnet\n per Availability Zone. For more information, see Creating a default\n subnet in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a default subnet with a size /20 IPv4 CIDR block in the\n specified Availability Zone in your default VPC. You can have only one default subnet\n per Availability Zone. For more information, see Create a default\n subnet in the Amazon VPC User Guide.

" } }, "com.amazonaws.ec2#CreateDefaultSubnetRequest": { "type": "structure", "members": { "AvailabilityZone": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#AvailabilityZoneName", "traits": { "smithy.api#clientOptional": {}, "smithy.api#documentation": "

The Availability Zone in which to create the default subnet.

", @@ -13975,16 +13974,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "Ipv6Native": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to create an IPv6 only subnet. If you already have a default subnet\n for this Availability Zone, you must delete it before you can create an IPv6 only subnet.

" } } @@ -14018,7 +14013,7 @@ "target": "com.amazonaws.ec2#CreateDefaultVpcResult" }, "traits": { - "smithy.api#documentation": "

Creates a default VPC with a size /16 IPv4 CIDR block and a default subnet\n\t\t\tin each Availability Zone. For more information about the components of a default VPC,\n\t\t\tsee Default VPC and\n\t\t\tdefault subnets in the Amazon Virtual Private Cloud User Guide. You cannot\n\t\t\tspecify the components of the default VPC yourself.

\n

If you deleted your previous default VPC, you can create a default VPC. You cannot have\n\t\t\tmore than one default VPC per Region.

\n

If your account supports EC2-Classic, you cannot use this action to create a default VPC\n\t\t\tin a Region that supports EC2-Classic. If you want a default VPC in a Region that\n\t\t\tsupports EC2-Classic, see \"I really want a default VPC for my existing EC2 account. Is\n\t\t\tthat possible?\" in the Default VPCs\n\t\t\tFAQ.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Creates a default VPC with a size /16 IPv4 CIDR block and a default subnet\n\t\t\tin each Availability Zone. For more information about the components of a default VPC,\n\t\t\tsee Default VPCs \n\t\t in the Amazon VPC User Guide. You cannot specify the components of the \n\t\t default VPC yourself.

\n

If you deleted your previous default VPC, you can create a default VPC. You cannot have\n\t\t\tmore than one default VPC per Region.

" } }, "com.amazonaws.ec2#CreateDefaultVpcRequest": { @@ -14027,8 +14022,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -14062,7 +14055,42 @@ "target": "com.amazonaws.ec2#CreateDhcpOptionsResult" }, "traits": { - "smithy.api#documentation": "

Creates a set of DHCP options for your VPC. After creating the set, you must\n\t\t\t\tassociate it with the VPC, causing all existing and new instances that you launch in\n\t\t\t\tthe VPC to use this set of DHCP options. The following are the individual DHCP\n\t\t\t\toptions you can specify. For more information about the options, see RFC 2132.

\n
    \n
  • \n

    \n domain-name-servers - The IP addresses of up to four domain name\n servers, or AmazonProvidedDNS. The default DHCP option set specifies\n AmazonProvidedDNS. If specifying more than one domain name server, specify the\n IP addresses in a single parameter, separated by commas. To have your instance\n receive a custom DNS hostname as specified in domain-name, you must\n set domain-name-servers to a custom DNS server.

    \n
  • \n
  • \n

    \n domain-name - If you're using AmazonProvidedDNS in\n us-east-1, specify ec2.internal. If you're using\n AmazonProvidedDNS in another Region, specify\n region.compute.internal (for example,\n ap-northeast-1.compute.internal). Otherwise, specify a domain\n name (for example, ExampleCompany.com). This value is used to complete\n unqualified DNS hostnames. Important: Some\n Linux operating systems accept multiple domain names separated by spaces.\n However, Windows and other Linux operating systems treat the value as a single\n domain, which results in unexpected behavior. If your DHCP options set is\n associated with a VPC that has instances with multiple operating systems,\n specify only one domain name.

    \n
  • \n
  • \n

    \n ntp-servers - The IP addresses of up to four Network Time Protocol (NTP)\n servers.

    \n
  • \n
  • \n

    \n netbios-name-servers - The IP addresses of up to four NetBIOS name\n servers.

    \n
  • \n
  • \n

    \n netbios-node-type - The NetBIOS node type (1, 2, 4, or 8). We recommend that\n you specify 2 (broadcast and multicast are not currently supported). For more information\n about these node types, see RFC 2132.

    \n
  • \n
\n

Your VPC automatically starts out with a set of DHCP options that includes only a DNS\n\t\t\tserver that we provide (AmazonProvidedDNS). If you create a set of options, and if your\n\t\t\tVPC has an internet gateway, make sure to set the domain-name-servers\n\t\t\toption either to AmazonProvidedDNS or to a domain name server of your\n\t\t\tchoice. For more information, see DHCP options sets in the\n\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a set of DHCP options for your VPC. After creating the set, you must\n\t\t\t\tassociate it with the VPC, causing all existing and new instances that you launch in\n\t\t\t\tthe VPC to use this set of DHCP options. The following are the individual DHCP\n\t\t\t\toptions you can specify. For more information about the options, see RFC 2132.

\n
    \n
  • \n

    \n domain-name-servers - The IP addresses of up to four domain name\n servers, or AmazonProvidedDNS. The default DHCP option set specifies\n AmazonProvidedDNS. If specifying more than one domain name server, specify the\n IP addresses in a single parameter, separated by commas. To have your instance\n receive a custom DNS hostname as specified in domain-name, you must\n set domain-name-servers to a custom DNS server.

    \n
  • \n
  • \n

    \n domain-name - If you're using AmazonProvidedDNS in\n us-east-1, specify ec2.internal. If you're using\n AmazonProvidedDNS in another Region, specify\n region.compute.internal (for example,\n ap-northeast-1.compute.internal). Otherwise, specify a domain\n name (for example, ExampleCompany.com). This value is used to complete\n unqualified DNS hostnames. Important: Some\n Linux operating systems accept multiple domain names separated by spaces.\n However, Windows and other Linux operating systems treat the value as a single\n domain, which results in unexpected behavior. If your DHCP options set is\n associated with a VPC that has instances with multiple operating systems,\n specify only one domain name.

    \n
  • \n
  • \n

    \n ntp-servers - The IP addresses of up to four Network Time Protocol (NTP)\n servers.

    \n
  • \n
  • \n

    \n netbios-name-servers - The IP addresses of up to four NetBIOS name\n servers.

    \n
  • \n
  • \n

    \n netbios-node-type - The NetBIOS node type (1, 2, 4, or 8). We recommend that\n you specify 2 (broadcast and multicast are not currently supported). For more information\n about these node types, see RFC 2132.

    \n
  • \n
\n

Your VPC automatically starts out with a set of DHCP options that includes only a DNS\n\t\t\tserver that we provide (AmazonProvidedDNS). If you create a set of options, and if your\n\t\t\tVPC has an internet gateway, make sure to set the domain-name-servers\n\t\t\toption either to AmazonProvidedDNS or to a domain name server of your\n\t\t\tchoice. For more information, see DHCP options sets in the\n\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a DHCP options set", + "documentation": "This example creates a DHCP options set.", + "input": { + "DhcpConfigurations": [ + { + "Key": "domain-name-servers", + "Values": [ + "10.2.5.1", + "10.2.5.2" + ] + } + ] + }, + "output": { + "DhcpOptions": { + "DhcpConfigurations": [ + { + "Values": [ + { + "Value": "10.2.5.2" + }, + { + "Value": "10.2.5.1" + } + ], + "Key": "domain-name-servers" + } + ], + "DhcpOptionsId": "dopt-d9070ebb" + } + } + } + ] } }, "com.amazonaws.ec2#CreateDhcpOptionsRequest": { @@ -14089,8 +14117,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -14140,8 +14166,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14198,7 +14222,7 @@ "target": "com.amazonaws.ec2#CreateFleetResult" }, "traits": { - "smithy.api#documentation": "

Launches an EC2 Fleet.

\n

You can create a single EC2 Fleet that includes multiple launch specifications that vary by\n instance type, AMI, Availability Zone, or subnet.

\n

For more information, see EC2 Fleet in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Creates an EC2 Fleet that contains the configuration information for On-Demand Instances and Spot Instances.\n Instances are launched immediately if there is available capacity.

\n

A single EC2 Fleet can include multiple launch specifications that vary by instance type,\n AMI, Availability Zone, or subnet.

\n

For more information, see EC2 Fleet in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#CreateFleetError": { @@ -14313,8 +14337,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14361,8 +14383,6 @@ "TerminateInstancesWithExpiration": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether running instances should be terminated when the EC2 Fleet expires.

" } }, @@ -14387,15 +14407,13 @@ "ReplaceUnhealthyInstances": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether EC2 Fleet should replace unhealthy Spot Instances. Supported only for\n fleets of type maintain. For more information, see EC2 Fleet\n health checks in the Amazon EC2 User Guide.

" } }, "TagSpecifications": { "target": "com.amazonaws.ec2#TagSpecificationList", "traits": { - "smithy.api#documentation": "

The key-value pair for tagging the EC2 Fleet request on creation. For more information, see \n Tagging your resources.

\n

If the fleet type is instant, specify a resource type of fleet \n to tag the fleet or instance to tag the instances at launch.

\n

If the fleet type is maintain or request, specify a resource\n type of fleet to tag the fleet. You cannot specify a resource type of\n instance. To tag instances at launch, specify the tags in a launch template.

", + "smithy.api#documentation": "

The key-value pair for tagging the EC2 Fleet request on creation. For more information, see \n Tag your resources.

\n

If the fleet type is instant, specify a resource type of fleet \n to tag the fleet or instance to tag the instances at launch.

\n

If the fleet type is maintain or request, specify a resource\n type of fleet to tag the fleet. You cannot specify a resource type of\n instance. To tag instances at launch, specify the tags in a launch template.

", "smithy.api#xmlName": "TagSpecification" } }, @@ -14460,8 +14478,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14527,7 +14543,7 @@ "LogFormat": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The fields to include in the flow log record. List the fields in the order in which\n they should appear. If you omit this parameter, the flow log is created using the\n default format. If you specify this parameter, you must include at least one\n field. For more information about the available fields, see Flow log\n records in the Amazon VPC User Guide or Transit Gateway Flow Log\n records in the Amazon Web Services Transit Gateway Guide.

\n

Specify the fields using the ${field-id} format, separated by spaces. For\n the CLI, surround this parameter value with single quotes on Linux or\n double quotes on Windows.

" + "smithy.api#documentation": "

The fields to include in the flow log record. List the fields in the order in which\n they should appear. If you omit this parameter, the flow log is created using the\n default format. If you specify this parameter, you must include at least one\n field. For more information about the available fields, see Flow log\n records in the Amazon VPC User Guide or Transit Gateway Flow Log\n records in the Amazon Web Services Transit Gateway Guide.

\n

Specify the fields using the ${field-id} format, separated by spaces.

" } }, "TagSpecifications": { @@ -14540,8 +14556,6 @@ "MaxAggregationInterval": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum interval of time during which a flow of packets is captured and aggregated into a flow log record. \n The possible values are 60 seconds (1 minute) or 600 seconds (10 minutes).\n This parameter must be 60 seconds for transit gateway resource types.

\n

When a network interface is attached to a Nitro-based\n instance, the aggregation interval is always 60 seconds or less, regardless\n of the value that you specify.

\n

Default: 600

" } }, @@ -14606,8 +14620,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14688,7 +14700,7 @@ "target": "com.amazonaws.ec2#CreateImageResult" }, "traits": { - "smithy.api#documentation": "

Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance \n \tthat is either running or stopped.

\n

By default, when Amazon EC2 creates the new AMI, it reboots the instance so that it can \n\t\t\t\t\ttake snapshots of the attached volumes while data is at rest, in order to ensure a consistent \n\t\t\t\t\tstate. You can set the NoReboot parameter to true in the API request, \n\t\t\t\t\tor use the --no-reboot option in the CLI to prevent Amazon EC2 from shutting down and \n\t\t\t\t\trebooting the instance.

\n \n

If you choose to bypass the shutdown and reboot process by setting the NoReboot \n\t\t\t\t\tparameter to true in the API request, or by using the --no-reboot option \n\t\t\t\t\tin the CLI, we can't guarantee the file system integrity of the created image.

\n
\n

If you customized your instance with instance store volumes or Amazon EBS volumes in addition to the root device volume, the \n \tnew AMI contains block device mapping information for those volumes. When you launch an instance from this new AMI, \n \tthe instance automatically launches with those additional volumes.

\n

For more information, see Create an Amazon EBS-backed Linux\n AMI in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance \n \tthat is either running or stopped.

\n

If you customized your instance with instance store volumes or Amazon EBS volumes in addition to the root device volume, the \n \tnew AMI contains block device mapping information for those volumes. When you launch an instance from this new AMI, \n \tthe instance automatically launches with those additional volumes.

\n

For more information, see Create an Amazon EBS-backed Linux\n AMI in the Amazon Elastic Compute Cloud User Guide.

" } }, "com.amazonaws.ec2#CreateImageRequest": { @@ -14714,8 +14726,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -14744,9 +14754,7 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "NoReboot", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

By default, when Amazon EC2 creates the new AMI, it reboots the instance so that it can \n\t\t\t\t\ttake snapshots of the attached volumes while data is at rest, in order to ensure a consistent \n\t\t\t\t\tstate. You can set the NoReboot parameter to true in the API request, \n\t\t\t\t\tor use the --no-reboot option in the CLI to prevent Amazon EC2 from shutting down and \n\t\t\t\t\trebooting the instance.

\n \n

If you choose to bypass the shutdown and reboot process by setting the NoReboot \n\t\t\t\t\tparameter to true in the API request, or by using the --no-reboot option \n\t\t\t\t\tin the CLI, we can't guarantee the file system integrity of the created image.

\n
\n

Default: false (follow standard reboot process)

", + "smithy.api#documentation": "

Indicates whether or not the instance should be automatically rebooted before creating \n the image. Specify one of the following values:

\n
    \n
  • \n

    \n true - The instance is not rebooted before creating the image. This \n creates crash-consistent snapshots that include only the data that has been written \n to the volumes at the time the snapshots are created. Buffered data and data in \n memory that has not yet been written to the volumes is not included in the snapshots.

    \n
  • \n
  • \n

    \n false - The instance is rebooted before creating the image. This \n ensures that all buffered data and data in memory is written to the volumes before the \n snapshots are created.

    \n
  • \n
\n

Default: false\n

", "smithy.api#xmlName": "noReboot" } }, @@ -14787,7 +14795,7 @@ "target": "com.amazonaws.ec2#CreateInstanceConnectEndpointResult" }, "traits": { - "smithy.api#documentation": "

Creates an EC2 Instance Connect Endpoint.

\n

An EC2 Instance Connect Endpoint allows you to connect to a resource, without\n requiring the resource to have a public IPv4 address. For more information, see Connect to your resources without requiring a public IPv4 address using EC2\n Instance Connect Endpoint in the Amazon EC2 User\n Guide.

" + "smithy.api#documentation": "

Creates an EC2 Instance Connect Endpoint.

\n

An EC2 Instance Connect Endpoint allows you to connect to an instance, without\n requiring the instance to have a public IPv4 address. For more information, see Connect to your instances without requiring a public IPv4 address using EC2\n Instance Connect Endpoint in the Amazon EC2 User\n Guide.

" } }, "com.amazonaws.ec2#CreateInstanceConnectEndpointRequest": { @@ -14796,8 +14804,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14819,8 +14825,6 @@ "PreserveClientIp": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether your client's IP address is preserved as the source. The value is true or false.

\n
    \n
  • \n

    If true, your client's IP address is used when you connect to a resource.

    \n
  • \n
  • \n

    If false, the elastic network interface IP address is used when you connect to a resource.

    \n
  • \n
\n

Default: true\n

" } }, @@ -14885,8 +14889,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -14946,7 +14948,7 @@ "target": "com.amazonaws.ec2#CreateInstanceExportTaskResult" }, "traits": { - "smithy.api#documentation": "

Exports a running or stopped instance to an Amazon S3 bucket.

\n

For information about the supported operating systems, image formats, and known limitations\n for the types of instances you can export, see Exporting an instance as a VM Using VM Import/Export\n in the VM Import/Export User Guide.

" + "smithy.api#documentation": "

Exports a running or stopped instance to an Amazon S3 bucket.

\n

For information about the prerequisites for your Amazon S3 bucket, supported operating systems,\n image formats, and known limitations for the types of instances you can export, see Exporting an instance as a VM Using VM\n Import/Export in the VM Import/Export User Guide.

" } }, "com.amazonaws.ec2#CreateInstanceExportTaskRequest": { @@ -15027,7 +15029,20 @@ "target": "com.amazonaws.ec2#CreateInternetGatewayResult" }, "traits": { - "smithy.api#documentation": "

Creates an internet gateway for use with a VPC. After creating the internet gateway,\n\t\t\tyou attach it to a VPC using AttachInternetGateway.

\n

For more information about your VPC and internet gateway, see the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates an internet gateway for use with a VPC. After creating the internet gateway,\n\t\t\tyou attach it to a VPC using AttachInternetGateway.

\n

For more information, see Internet gateways in the \n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an Internet gateway", + "documentation": "This example creates an Internet gateway.", + "output": { + "InternetGateway": { + "Tags": [], + "InternetGatewayId": "igw-c0a643a9", + "Attachments": [] + } + } + } + ] } }, "com.amazonaws.ec2#CreateInternetGatewayRequest": { @@ -15044,8 +15059,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -15101,8 +15114,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15143,40 +15154,30 @@ "AutoImport": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If selected, IPAM will continuously look for resources within the CIDR range of this pool \n and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\n these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \n a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \n marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \n discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\n

\n

A locale must be set on the pool for this feature to work.

" } }, "PubliclyAdvertisable": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Determines if the pool is publicly advertisable. This option is not available for pools with AddressFamily set to ipv4.

" } }, "AllocationMinNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. The minimum netmask length must be \n less than the maximum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

" } }, "AllocationMaxNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. The maximum netmask length must be \n greater than the minimum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

" } }, "AllocationDefaultNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and you enter 16 here, \n new allocations will default to 10.0.0.0/16.

" } }, @@ -15240,8 +15241,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15295,8 +15294,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15382,8 +15379,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15445,7 +15440,16 @@ "target": "com.amazonaws.ec2#KeyPair" }, "traits": { - "smithy.api#documentation": "

Creates an ED25519 or 2048-bit RSA key pair with the specified name and in the\n specified PEM or PPK format. Amazon EC2 stores the public key and displays the private\n key for you to save to a file. The private key is returned as an unencrypted PEM encoded\n PKCS#1 private key or an unencrypted PPK formatted private key for use with PuTTY. If a\n key with the specified name already exists, Amazon EC2 returns an error.

\n

The key pair returned to you is available only in the Amazon Web Services Region in which you create it.\n If you prefer, you can create your own key pair using a third-party tool and upload it\n to any Region using ImportKeyPair.

\n

You can have up to 5,000 key pairs per Amazon Web Services Region.

\n

For more information, see Amazon EC2 key pairs in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an ED25519 or 2048-bit RSA key pair with the specified name and in the\n specified PEM or PPK format. Amazon EC2 stores the public key and displays the private\n key for you to save to a file. The private key is returned as an unencrypted PEM encoded\n PKCS#1 private key or an unencrypted PPK formatted private key for use with PuTTY. If a\n key with the specified name already exists, Amazon EC2 returns an error.

\n

The key pair returned to you is available only in the Amazon Web Services Region in which you create it.\n If you prefer, you can create your own key pair using a third-party tool and upload it\n to any Region using ImportKeyPair.

\n

You can have up to 5,000 key pairs per Amazon Web Services Region.

\n

For more information, see Amazon EC2 key pairs in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a key pair", + "documentation": "This example creates a key pair named my-key-pair.", + "input": { + "KeyName": "my-key-pair" + } + } + ] } }, "com.amazonaws.ec2#CreateKeyPairRequest": { @@ -15463,8 +15467,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -15502,7 +15504,50 @@ "target": "com.amazonaws.ec2#CreateLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Creates a launch template.

\n

A launch template contains the parameters to launch an instance. When you launch an\n instance using RunInstances, you can specify a launch template instead\n of providing the launch parameters in the request. For more information, see Launch\n an instance from a launch template in the\n Amazon Elastic Compute Cloud User Guide.

\n

If you want to clone an existing launch template as the basis for creating a new\n launch template, you can use the Amazon EC2 console. The API, SDKs, and CLI do not support\n cloning a template. For more information, see Create a launch template from an existing launch template in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a launch template.

\n

A launch template contains the parameters to launch an instance. When you launch an\n instance using RunInstances, you can specify a launch template instead\n of providing the launch parameters in the request. For more information, see Launch\n an instance from a launch template in the\n Amazon Elastic Compute Cloud User Guide.

\n

If you want to clone an existing launch template as the basis for creating a new\n launch template, you can use the Amazon EC2 console. The API, SDKs, and CLI do not support\n cloning a template. For more information, see Create a launch template from an existing launch template in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a launch template", + "documentation": "This example creates a launch template that specifies the subnet in which to launch the instance, assigns a public IP address and an IPv6 address to the instance, and creates a tag for the instance.", + "input": { + "LaunchTemplateName": "my-template", + "VersionDescription": "WebVersion1", + "LaunchTemplateData": { + "NetworkInterfaces": [ + { + "AssociatePublicIpAddress": true, + "DeviceIndex": 0, + "Ipv6AddressCount": 1, + "SubnetId": "subnet-7b16de0c" + } + ], + "ImageId": "ami-8c1be5f6", + "InstanceType": "t2.small", + "TagSpecifications": [ + { + "ResourceType": "instance", + "Tags": [ + { + "Key": "Name", + "Value": "webserver" + } + ] + } + ] + } + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 1, + "LaunchTemplateId": "lt-01238c059e3466abc", + "LaunchTemplateName": "my-template", + "DefaultVersionNumber": 1, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-11-27T09:13:24.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateLaunchTemplateRequest": { @@ -15511,8 +15556,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -15589,7 +15632,48 @@ "target": "com.amazonaws.ec2#CreateLaunchTemplateVersionResult" }, "traits": { - "smithy.api#documentation": "

Creates a new version of a launch template. You can specify an existing version of\n launch template from which to base the new version.

\n

Launch template versions are numbered in the order in which they are created. You\n cannot specify, change, or replace the numbering of launch template versions.

\n

Launch templates are immutable; after you create a launch template, you can't modify\n it. Instead, you can create a new version of the launch template that includes any\n changes you require.

\n

For more information, see Modify a launch template (manage launch template versions) in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a new version of a launch template. You can specify an existing version of\n launch template from which to base the new version.

\n

Launch template versions are numbered in the order in which they are created. You\n cannot specify, change, or replace the numbering of launch template versions.

\n

Launch templates are immutable; after you create a launch template, you can't modify\n it. Instead, you can create a new version of the launch template that includes any\n changes you require.

\n

For more information, see Modify a launch template (manage launch template versions) in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a launch template version", + "documentation": "This example creates a new launch template version based on version 1 of the specified launch template and specifies a different AMI ID.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "SourceVersion": "1", + "VersionDescription": "WebVersion2", + "LaunchTemplateData": { + "ImageId": "ami-c998b6b2" + } + }, + "output": { + "LaunchTemplateVersion": { + "VersionDescription": "WebVersion2", + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "my-template", + "VersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "LaunchTemplateData": { + "ImageId": "ami-c998b6b2", + "InstanceType": "t2.micro", + "NetworkInterfaces": [ + { + "Ipv6Addresses": [ + { + "Ipv6Address": "2001:db8:1234:1a00::123" + } + ], + "DeviceIndex": 0, + "SubnetId": "subnet-7b16de0c", + "AssociatePublicIpAddress": true + } + ] + }, + "DefaultVersion": false, + "CreateTime": "2017-12-01T13:35:46.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateLaunchTemplateVersionRequest": { @@ -15598,8 +15682,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -15644,8 +15726,6 @@ "ResolveAlias": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, and if a Systems Manager parameter is specified for ImageId,\n the AMI ID is displayed in the response for imageID. For more information, see Use a Systems \n Manager parameter instead of an AMI ID in the Amazon Elastic Compute Cloud User Guide.

\n

Default: false\n

" } } @@ -15716,8 +15796,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15793,8 +15871,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -15860,8 +15936,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -15927,8 +16001,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -15971,8 +16043,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -15995,7 +16065,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of entries for the prefix list.

", "smithy.api#required": {} } @@ -16052,7 +16121,31 @@ "target": "com.amazonaws.ec2#CreateNatGatewayResult" }, "traits": { - "smithy.api#documentation": "

Creates a NAT gateway in the specified subnet. This action creates a network interface\n in the specified subnet with a private IP address from the IP address range of the\n subnet. You can create either a public NAT gateway or a private NAT gateway.

\n

With a public NAT gateway, internet-bound traffic from a private subnet can be routed\n to the NAT gateway, so that instances in a private subnet can connect to the internet.

\n

With a private NAT gateway, private communication is routed across VPCs and on-premises\n networks through a transit gateway or virtual private gateway. Common use cases include\n running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\n private IPv4 addresses, and communicating between overlapping networks.

\n

For more information, see NAT gateways in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a NAT gateway in the specified subnet. This action creates a network interface\n in the specified subnet with a private IP address from the IP address range of the\n subnet. You can create either a public NAT gateway or a private NAT gateway.

\n

With a public NAT gateway, internet-bound traffic from a private subnet can be routed\n to the NAT gateway, so that instances in a private subnet can connect to the internet.

\n

With a private NAT gateway, private communication is routed across VPCs and on-premises\n networks through a transit gateway or virtual private gateway. Common use cases include\n running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\n private IPv4 addresses, and communicating between overlapping networks.

\n

For more information, see NAT gateways in the Amazon VPC User Guide.

\n \n

When you create a public NAT gateway and assign it an EIP or secondary EIPs, the network border group of the EIPs must match the network border group of the Availability Zone (AZ) that the public NAT gateway is in. If it's not the same, the NAT gateway will fail to launch. You can see the network border group for the subnet's AZ by viewing the details of the subnet. Similarly, you can view the network border group of an EIP by viewing the details of the EIP address. For more information about network border groups and EIPs, see Allocate an Elastic IP address in the Amazon VPC User Guide. \n

\n
", + "smithy.api#examples": [ + { + "title": "To create a NAT gateway", + "documentation": "This example creates a NAT gateway in subnet subnet-1a2b3c4d and associates an Elastic IP address with the allocation ID eipalloc-37fc1a52 with the NAT gateway.", + "input": { + "SubnetId": "subnet-1a2b3c4d", + "AllocationId": "eipalloc-37fc1a52" + }, + "output": { + "NatGateway": { + "NatGatewayAddresses": [ + { + "AllocationId": "eipalloc-37fc1a52" + } + ], + "VpcId": "vpc-1122aabb", + "State": "pending", + "NatGatewayId": "nat-08d48af2a8e83edfd", + "SubnetId": "subnet-1a2b3c4d", + "CreateTime": "2015-12-17T12:45:26.732Z" + } + } + } + ] } }, "com.amazonaws.ec2#CreateNatGatewayRequest": { @@ -16074,8 +16167,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -16109,23 +16200,21 @@ "SecondaryAllocationIds": { "target": "com.amazonaws.ec2#AllocationIdList", "traits": { - "smithy.api#documentation": "

Secondary EIP allocation IDs. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Secondary EIP allocation IDs. For more information, see Create a NAT gateway \n in the Amazon VPC User Guide.

", "smithy.api#xmlName": "SecondaryAllocationId" } }, "SecondaryPrivateIpAddresses": { "target": "com.amazonaws.ec2#IpList", "traits": { - "smithy.api#documentation": "

Secondary private IPv4 addresses. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Secondary private IPv4 addresses. For more information about secondary addresses, see Create a NAT gateway in the Amazon VPC User Guide.

", "smithy.api#xmlName": "SecondaryPrivateIpAddress" } }, "SecondaryPrivateIpAddressCount": { "target": "com.amazonaws.ec2#PrivateIpAddressCount", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, - "smithy.api#documentation": "

[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. For more information about secondary addresses, see Create a NAT gateway in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. \n For more information about secondary addresses, see Create a NAT gateway \n in the Amazon VPC User Guide.

" } } }, @@ -16166,7 +16255,41 @@ "target": "com.amazonaws.ec2#CreateNetworkAclResult" }, "traits": { - "smithy.api#documentation": "

Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a network ACL", + "documentation": "This example creates a network ACL for the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + }, + "output": { + "NetworkAcl": { + "Associations": [], + "NetworkAclId": "acl-5fb85d36", + "VpcId": "vpc-a01106c2", + "Tags": [], + "Entries": [ + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": true, + "RuleAction": "deny" + }, + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": false, + "RuleAction": "deny" + } + ], + "IsDefault": false + } + } + } + ] } }, "com.amazonaws.ec2#CreateNetworkAclEntry": { @@ -16178,7 +16301,25 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \n\t\t and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \n\t\t with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \n\t\t ingress rules and a separate set of egress rules.

\n

We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \n\t\t other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.

\n

After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.

\n

For more information about network ACLs, see Network ACLs in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \n\t\t and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \n\t\t with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \n\t\t ingress rules and a separate set of egress rules.

\n

We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \n\t\t other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.

\n

After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.

\n

For more information about network ACLs, see Network ACLs \n in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a network ACL entry", + "documentation": "This example creates an entry for the specified network ACL. The rule allows ingress traffic from anywhere (0.0.0.0/0) on UDP port 53 (DNS) into any associated subnet.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Protocol": "17", + "RuleAction": "allow", + "Egress": false, + "CidrBlock": "0.0.0.0/0", + "PortRange": { + "From": 53, + "To": 53 + } + } + } + ] } }, "com.amazonaws.ec2#CreateNetworkAclEntryRequest": { @@ -16196,8 +16337,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -16207,7 +16346,6 @@ "traits": { "aws.protocols#ec2QueryName": "Egress", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is an egress rule (rule is applied to traffic leaving the subnet).

", "smithy.api#required": {}, "smithy.api#xmlName": "egress" @@ -16271,7 +16409,6 @@ "traits": { "aws.protocols#ec2QueryName": "RuleNumber", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number for the entry (for example, 100). ACL entries are processed in ascending order by rule number.

\n

Constraints: Positive integer from 1 to 32766. The range 32767 to 65535 is reserved for internal use.

", "smithy.api#required": {}, "smithy.api#xmlName": "ruleNumber" @@ -16289,8 +16426,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -16381,8 +16516,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -16467,8 +16600,6 @@ "DestinationPort": { "target": "com.amazonaws.ec2#Port", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The destination port.

" } }, @@ -16482,8 +16613,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -16587,8 +16716,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is DryRunOperation. \n\t\t\tOtherwise, it is UnauthorizedOperation.

" } } @@ -16630,8 +16757,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -16647,8 +16772,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses to assign to a network interface. Amazon EC2\n automatically selects the IPv6 addresses from the subnet range.

\n

You can't specify a count of IPv6 addresses using this parameter if you've specified \n one of the following: specific IPv6 addresses, specific IPv6 prefixes, or a count of IPv6 prefixes.

\n

If your subnet has the AssignIpv6AddressOnCreation attribute set, you can\n override that setting by specifying 0 as the IPv6 address count.

", "smithy.api#xmlName": "ipv6AddressCount" } @@ -16681,8 +16804,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SecondaryPrivateIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses to assign to a network interface. When\n you specify a number of secondary IPv4 addresses, Amazon EC2 selects these IP addresses\n within the subnet's IPv4 CIDR range. You can't specify this option and specify more than\n one private IP address using privateIpAddresses.

\n

You can't specify a count of private IPv4 addresses if you've specified one of the following:\n specific private IPv4 addresses, specific IPv4 prefixes, or a count of IPv4 prefixes.

", "smithy.api#xmlName": "secondaryPrivateIpAddressCount" } @@ -16697,8 +16818,6 @@ "Ipv4PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 prefixes that Amazon Web Services automatically assigns to the network interface.

\n

You can't specify a count of IPv4 prefixes if you've specified one of the following:\n specific IPv4 prefixes, specific private IPv4 addresses, or a count of private IPv4\n addresses.

" } }, @@ -16712,8 +16831,6 @@ "Ipv6PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes that Amazon Web Services automatically assigns to the network interface.

\n

You can't specify a count of IPv6 prefixes if you've specified one of the following:\n specific IPv6 prefixes, specific IPv6 addresses, or a count of IPv6 addresses.

" } }, @@ -16746,6 +16863,12 @@ "smithy.api#documentation": "

Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see Ensuring Idempotency.

", "smithy.api#idempotencyToken": {} } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

If you’re creating a network interface in a dual-stack or IPv6-only subnet, you have\n the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\n address associated with an ENI that you have enabled to use a primary IPv6 address. Use this option if the instance that\n this ENI will be attached to relies on its IPv6 address not changing. Amazon Web Services\n will automatically assign an IPv6 address associated with the ENI attached to your\n instance to be the primary IPv6 address. Once you enable an IPv6 GUA address to be a\n primary IPv6, you cannot disable it. When you enable an IPv6 GUA address to be a primary\n IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is\n terminated or the network interface is detached. If you have multiple IPv6 addresses\n associated with an ENI attached to your instance and you enable a primary IPv6 address,\n the first IPv6 GUA address associated with the ENI becomes the primary IPv6\n address.

" + } } }, "traits": { @@ -16785,7 +16908,18 @@ "target": "com.amazonaws.ec2#CreatePlacementGroupResult" }, "traits": { - "smithy.api#documentation": "

Creates a placement group in which to launch instances. The strategy of the placement\n group determines how the instances are organized within the group.

\n

A cluster placement group is a logical grouping of instances within a\n single Availability Zone that benefit from low network latency, high network throughput.\n A spread placement group places instances on distinct hardware. A\n partition placement group places groups of instances in different\n partitions, where instances in one partition do not share the same hardware with\n instances in another partition.

\n

For more information, see Placement groups in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Creates a placement group in which to launch instances. The strategy of the placement\n group determines how the instances are organized within the group.

\n

A cluster placement group is a logical grouping of instances within a\n single Availability Zone that benefit from low network latency, high network throughput.\n A spread placement group places instances on distinct hardware. A\n partition placement group places groups of instances in different\n partitions, where instances in one partition do not share the same hardware with\n instances in another partition.

\n

For more information, see Placement groups in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a placement group", + "documentation": "This example creates a placement group with the specified name.", + "input": { + "GroupName": "my-cluster", + "Strategy": "cluster" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#CreatePlacementGroupRequest": { @@ -16795,8 +16929,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -16820,8 +16952,6 @@ "PartitionCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of partitions. Valid only when Strategy is\n set to partition.

" } }, @@ -16877,8 +17007,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -16949,8 +17077,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -16970,8 +17096,6 @@ "DeleteReplacedRootVolume": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to automatically delete the original root volume after the root volume \n replacement task completes. To delete the original root volume, specify true. \n If you choose to keep the original root volume after the replacement task completes, you must \n manually delete it when you no longer need it.

" } } @@ -17026,7 +17150,6 @@ "traits": { "aws.protocols#ec2QueryName": "InstanceCount", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances that are a part of a Reserved Instance account to be listed in the Reserved Instance Marketplace. This number should be less than or equal to the instance count associated with the Reserved Instance ID specified in this call.

", "smithy.api#required": {}, "smithy.api#xmlName": "instanceCount" @@ -17122,8 +17245,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -17157,7 +17278,18 @@ "target": "com.amazonaws.ec2#CreateRouteResult" }, "traits": { - "smithy.api#documentation": "

Creates a route in a route table within a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list.

\n

When determining how to route traffic, we use the route with the most specific match.\n For example, traffic is destined for the IPv4 address 192.0.2.3, and the\n route table includes the following two IPv4 routes:

\n
    \n
  • \n

    \n 192.0.2.0/24 (goes to some target A)

    \n
  • \n
  • \n

    \n 192.0.2.0/28 (goes to some target B)

    \n
  • \n
\n

Both routes apply to the traffic destined for 192.0.2.3. However, the second route\n\t\t\t\tin the list covers a smaller number of IP addresses and is therefore more specific,\n\t\t\t\tso we use that route to determine where to target the traffic.

\n

For more information about route tables, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a route in a route table within a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list.

\n

When determining how to route traffic, we use the route with the most specific match.\n For example, traffic is destined for the IPv4 address 192.0.2.3, and the\n route table includes the following two IPv4 routes:

\n
    \n
  • \n

    \n 192.0.2.0/24 (goes to some target A)

    \n
  • \n
  • \n

    \n 192.0.2.0/28 (goes to some target B)

    \n
  • \n
\n

Both routes apply to the traffic destined for 192.0.2.3. However, the second route\n\t\t\t\tin the list covers a smaller number of IP addresses and is therefore more specific,\n\t\t\t\tso we use that route to determine where to target the traffic.

\n

For more information about route tables, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a route", + "documentation": "This example creates a route for the specified route table. The route matches all traffic (0.0.0.0/0) and routes it to the specified Internet gateway.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": "igw-c0a643a9" + } + } + ] } }, "com.amazonaws.ec2#CreateRouteRequest": { @@ -17189,8 +17321,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17295,8 +17425,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -17315,7 +17443,32 @@ "target": "com.amazonaws.ec2#CreateRouteTableResult" }, "traits": { - "smithy.api#documentation": "

Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a route table", + "documentation": "This example creates a route table for the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + }, + "output": { + "RouteTable": { + "Associations": [], + "RouteTableId": "rtb-22574640", + "VpcId": "vpc-a01106c2", + "PropagatingVgws": [], + "Tags": [], + "Routes": [ + { + "GatewayId": "local", + "DestinationCidrBlock": "10.0.0.0/16", + "State": "active" + } + ] + } + } + } + ] } }, "com.amazonaws.ec2#CreateRouteTableRequest": { @@ -17325,8 +17478,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17378,7 +17529,21 @@ "target": "com.amazonaws.ec2#CreateSecurityGroupResult" }, "traits": { - "smithy.api#documentation": "

Creates a security group.

\n

A security group acts as a virtual firewall for your instance to control inbound and outbound traffic.\n For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n

When you create a security group, you specify a friendly name of your choice. You can have a security group for use in EC2-Classic with the same name as a security group for use in a VPC. However, you can't have two security groups for use in EC2-Classic with the same name or two security groups for use in a VPC with the same name.

\n

You have a default security group for use in EC2-Classic and a default security group for use in your VPC. If you don't specify a security group when you launch an instance, the instance is launched into the appropriate default security group. A default security group includes a default rule that grants instances unrestricted network access to each other.

\n

You can add or remove rules from your security groups using \n\t\t\t\t\tAuthorizeSecurityGroupIngress,\n\t\t\t\t\tAuthorizeSecurityGroupEgress,\n\t\t\t\t\tRevokeSecurityGroupIngress, and\n\t\t\t\t\tRevokeSecurityGroupEgress.

\n

For more information about VPC security group limits, see Amazon VPC Limits.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Creates a security group.

\n

A security group acts as a virtual firewall for your instance to control inbound and outbound traffic.\n For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n

When you create a security group, you specify a friendly name of your choice. \n You can't have two security groups for the same VPC with the same name.

\n

You have a default security group for use in your VPC. If you don't specify a security group \n when you launch an instance, the instance is launched into the appropriate default security group. \n A default security group includes a default rule that grants instances unrestricted network access \n to each other.

\n

You can add or remove rules from your security groups using \n\t\t\t\t\tAuthorizeSecurityGroupIngress,\n\t\t\t\t\tAuthorizeSecurityGroupEgress,\n\t\t\t\t\tRevokeSecurityGroupIngress, and\n\t\t\t\t\tRevokeSecurityGroupEgress.

\n

For more information about VPC security group limits, see Amazon VPC Limits.

", + "smithy.api#examples": [ + { + "title": "To create a security group for a VPC", + "documentation": "This example creates a security group for the specified VPC.", + "input": { + "Description": "My security group", + "GroupName": "my-security-group", + "VpcId": "vpc-1a2b3c4d" + }, + "output": { + "GroupId": "sg-903004f8" + } + } + ] } }, "com.amazonaws.ec2#CreateSecurityGroupRequest": { @@ -17388,7 +17553,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

A description for the security group.

\n

Constraints: Up to 255 characters in length

\n

Constraints for EC2-Classic: ASCII characters

\n

Constraints for EC2-VPC: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", + "smithy.api#documentation": "

A description for the security group.

\n

Constraints: Up to 255 characters in length

\n

Valid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", "smithy.api#required": {}, "smithy.api#xmlName": "GroupDescription" } @@ -17397,14 +17562,14 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The name of the security group.

\n

Constraints: Up to 255 characters in length. Cannot start with\n sg-.

\n

Constraints for EC2-Classic: ASCII characters

\n

Constraints for EC2-VPC: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", + "smithy.api#documentation": "

The name of the security group.

\n

Constraints: Up to 255 characters in length. Cannot start with sg-.

\n

Valid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*

", "smithy.api#required": {} } }, "VpcId": { "target": "com.amazonaws.ec2#VpcId", "traits": { - "smithy.api#documentation": "

[EC2-VPC] The ID of the VPC. Required for EC2-VPC.

" + "smithy.api#documentation": "

The ID of the VPC. Required for a nondefault VPC.

" } }, "TagSpecifications": { @@ -17418,8 +17583,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17462,7 +17625,27 @@ "target": "com.amazonaws.ec2#Snapshot" }, "traits": { - "smithy.api#documentation": "

Creates a snapshot of an EBS volume and stores it in Amazon S3. You can use snapshots for\n \tbackups, to make copies of EBS volumes, and to save data before shutting down an\n \tinstance.

\n

You can create snapshots of volumes in a Region and volumes on an Outpost. If you \n \tcreate a snapshot of a volume in a Region, the snapshot must be stored in the same \n \tRegion as the volume. If you create a snapshot of a volume on an Outpost, the snapshot \n \tcan be stored on the same Outpost as the volume, or in the Region for that Outpost.

\n

When a snapshot is created, any Amazon Web Services Marketplace product codes that are associated with the\n source volume are propagated to the snapshot.

\n

You can take a snapshot of an attached volume that is in use. However, snapshots only\n capture data that has been written to your Amazon EBS volume at the time the snapshot command is\n issued; this might exclude any data that has been cached by any applications or the operating\n system. If you can pause any file systems on the volume long enough to take a snapshot, your\n snapshot should be complete. However, if you cannot pause all file writes to the volume, you\n should unmount the volume from within the instance, issue the snapshot command, and then\n remount the volume to ensure a consistent and complete snapshot. You may remount and use your\n volume while the snapshot status is pending.

\n

When you create a snapshot for an EBS volume that serves as a root device, we recommend \n that you stop the instance before taking the snapshot.

\n

Snapshots that are taken from encrypted volumes are automatically encrypted. Volumes that\n are created from encrypted snapshots are also automatically encrypted. Your encrypted volumes\n and any associated snapshots always remain protected.

\n

You can tag your snapshots during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Amazon Elastic Block Store and Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a snapshot of an EBS volume and stores it in Amazon S3. You can use snapshots for\n \tbackups, to make copies of EBS volumes, and to save data before shutting down an\n \tinstance.

\n

You can create snapshots of volumes in a Region and volumes on an Outpost. If you \n \tcreate a snapshot of a volume in a Region, the snapshot must be stored in the same \n \tRegion as the volume. If you create a snapshot of a volume on an Outpost, the snapshot \n \tcan be stored on the same Outpost as the volume, or in the Region for that Outpost.

\n

When a snapshot is created, any Amazon Web Services Marketplace product codes that are associated with the\n source volume are propagated to the snapshot.

\n

You can take a snapshot of an attached volume that is in use. However, snapshots only\n capture data that has been written to your Amazon EBS volume at the time the snapshot command is\n issued; this might exclude any data that has been cached by any applications or the operating\n system. If you can pause any file systems on the volume long enough to take a snapshot, your\n snapshot should be complete. However, if you cannot pause all file writes to the volume, you\n should unmount the volume from within the instance, issue the snapshot command, and then\n remount the volume to ensure a consistent and complete snapshot. You may remount and use your\n volume while the snapshot status is pending.

\n

When you create a snapshot for an EBS volume that serves as a root device, we recommend \n that you stop the instance before taking the snapshot.

\n

Snapshots that are taken from encrypted volumes are automatically encrypted. Volumes that\n are created from encrypted snapshots are also automatically encrypted. Your encrypted volumes\n and any associated snapshots always remain protected.

\n

You can tag your snapshots during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Amazon Elastic Block Store and Amazon EBS encryption in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a snapshot", + "documentation": "This example creates a snapshot of the volume with a volume ID of ``vol-1234567890abcdef0`` and a short description to identify the snapshot.", + "input": { + "VolumeId": "vol-1234567890abcdef0", + "Description": "This is my root volume snapshot." + }, + "output": { + "Description": "This is my root volume snapshot.", + "Tags": [], + "VolumeId": "vol-1234567890abcdef0", + "State": "pending", + "VolumeSize": 8, + "StartTime": "2014-02-28T21:06:01.000Z", + "OwnerId": "012345678910", + "SnapshotId": "snap-066877671789bd71b" + } + } + ] } }, "com.amazonaws.ec2#CreateSnapshotRequest": { @@ -17499,8 +17682,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17555,8 +17736,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -17596,7 +17775,25 @@ "target": "com.amazonaws.ec2#CreateSpotDatafeedSubscriptionResult" }, "traits": { - "smithy.api#documentation": "

Creates a data feed for Spot Instances, enabling you to view Spot Instance usage logs.\n You can create one data feed per Amazon Web Services account. For more information, see\n Spot Instance data feed \n in the Amazon EC2 User Guide for Linux Instances.

" + "smithy.api#documentation": "

Creates a data feed for Spot Instances, enabling you to view Spot Instance usage logs.\n You can create one data feed per Amazon Web Services account. For more information, see\n Spot Instance data feed \n in the Amazon EC2 User Guide for Linux Instances.

", + "smithy.api#examples": [ + { + "title": "To create a Spot Instance datafeed", + "documentation": "This example creates a Spot Instance data feed for your AWS account.", + "input": { + "Bucket": "my-s3-bucket", + "Prefix": "spotdata" + }, + "output": { + "SpotDatafeedSubscription": { + "OwnerId": "123456789012", + "Prefix": "spotdata", + "Bucket": "my-s3-bucket", + "State": "Active" + } + } + } + ] } }, "com.amazonaws.ec2#CreateSpotDatafeedSubscriptionRequest": { @@ -17616,8 +17813,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17694,8 +17889,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -17729,7 +17922,27 @@ "target": "com.amazonaws.ec2#CreateSubnetResult" }, "traits": { - "smithy.api#documentation": "

Creates a subnet in the specified VPC. For an IPv4 only subnet, specify an IPv4 CIDR block.\n If the VPC has an IPv6 CIDR block, you can create an IPv6 only subnet or a dual stack subnet instead.\n For an IPv6 only subnet, specify an IPv6 CIDR block. For a dual stack subnet, specify both\n an IPv4 CIDR block and an IPv6 CIDR block.

\n

A subnet CIDR block must not overlap the CIDR block of an existing subnet in the VPC.\n After you create a subnet, you can't change its CIDR block.

\n

The allowed size for an IPv4 subnet is between a /28 netmask (16 IP addresses) and \n a /16 netmask (65,536 IP addresses). Amazon Web Services reserves both the first four and \n the last IPv4 address in each subnet's CIDR block. They're not available for your use.

\n

If you've associated an IPv6 CIDR block with your VPC, you can associate an IPv6 CIDR block \n with a subnet when you create it. The allowed block size for an IPv6 subnet is a /64 netmask.

\n

If you add more than one subnet to a VPC, they're set up in a star topology with a\n logical router in the middle.

\n

When you stop an instance in a subnet, it retains its private IPv4 address. It's\n therefore possible to have a subnet with no running instances (they're all stopped), but\n no remaining IP addresses available.

\n

For more information, see Subnets in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a subnet in the specified VPC. For an IPv4 only subnet, specify an IPv4 CIDR block.\n If the VPC has an IPv6 CIDR block, you can create an IPv6 only subnet or a dual stack subnet instead.\n For an IPv6 only subnet, specify an IPv6 CIDR block. For a dual stack subnet, specify both\n an IPv4 CIDR block and an IPv6 CIDR block.

\n

A subnet CIDR block must not overlap the CIDR block of an existing subnet in the VPC.\n After you create a subnet, you can't change its CIDR block.

\n

The allowed size for an IPv4 subnet is between a /28 netmask (16 IP addresses) and \n a /16 netmask (65,536 IP addresses). Amazon Web Services reserves both the first four and \n the last IPv4 address in each subnet's CIDR block. They're not available for your use.

\n

If you've associated an IPv6 CIDR block with your VPC, you can associate an IPv6 CIDR block \n with a subnet when you create it. The allowed block size for an IPv6 subnet is a /64 netmask.

\n

If you add more than one subnet to a VPC, they're set up in a star topology with a\n logical router in the middle.

\n

When you stop an instance in a subnet, it retains its private IPv4 address. It's\n therefore possible to have a subnet with no running instances (they're all stopped), but\n no remaining IP addresses available.

\n

For more information, see Subnets in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a subnet", + "documentation": "This example creates a subnet in the specified VPC with the specified CIDR block. We recommend that you let us select an Availability Zone for you.", + "input": { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24" + }, + "output": { + "Subnet": { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24", + "State": "pending", + "AvailabilityZone": "us-west-2c", + "SubnetId": "subnet-9d4a7b6c", + "AvailableIpAddressCount": 251 + } + } + } + ] } }, "com.amazonaws.ec2#CreateSubnetCidrReservation": { @@ -17741,7 +17954,7 @@ "target": "com.amazonaws.ec2#CreateSubnetCidrReservationResult" }, "traits": { - "smithy.api#documentation": "

Creates a subnet CIDR reservation. For information about subnet CIDR reservations, see Subnet CIDR reservations in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Creates a subnet CIDR reservation. For more information, see Subnet CIDR reservations \n in the Amazon Virtual Private Cloud User Guide and Assign prefixes \n to network interfaces in the Amazon Elastic Compute Cloud User Guide.

" } }, "com.amazonaws.ec2#CreateSubnetCidrReservationRequest": { @@ -17767,21 +17980,19 @@ "target": "com.amazonaws.ec2#SubnetCidrReservationType", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The type of reservation.

\n

The following are valid values:

\n
    \n
  • \n

    \n prefix: The Amazon EC2\n Prefix\n Delegation feature assigns the IP addresses to network interfaces that are\n associated with an instance. For information about Prefix\n Delegation,\n see Prefix Delegation\n for Amazon EC2 network interfaces in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n explicit: You manually assign the IP addresses to resources that\n reside in your subnet.

    \n
  • \n
", + "smithy.api#documentation": "

The type of reservation. The reservation type determines how the reserved IP addresses are \n assigned to resources.

\n
    \n
  • \n

    \n prefix - Amazon Web Services assigns the reserved IP addresses to \n network interfaces.

    \n
  • \n
  • \n

    \n explicit - You assign the reserved IP addresses to network interfaces.

    \n
  • \n
", "smithy.api#required": {} } }, "Description": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The\n description\n to assign to the subnet CIDR reservation.

" + "smithy.api#documentation": "

The description to assign to the subnet CIDR reservation.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -17826,7 +18037,7 @@ "AvailabilityZone": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The Availability Zone or Local Zone for the subnet.

\n

Default: Amazon Web Services selects one for you. If you create more than one subnet in your VPC, we \n do not necessarily select a different zone for each subnet.

\n

To create a subnet in a Local Zone, set this value to the Local Zone ID, for example\n us-west-2-lax-1a. For information about the Regions that support Local Zones, \n see Available Regions in the Amazon Elastic Compute Cloud User Guide.

\n

To create a subnet in an Outpost, set this value to the Availability Zone for the\n Outpost and specify the Outpost ARN.

" + "smithy.api#documentation": "

The Availability Zone or Local Zone for the subnet.

\n

Default: Amazon Web Services selects one for you. If you create more than one subnet in your VPC, we \n do not necessarily select a different zone for each subnet.

\n

To create a subnet in a Local Zone, set this value to the Local Zone ID, for example\n us-west-2-lax-1a. For information about the Regions that support Local Zones, \n see Local Zones locations.

\n

To create a subnet in an Outpost, set this value to the Availability Zone for the\n Outpost and specify the Outpost ARN.

" } }, "AvailabilityZoneId": { @@ -17865,8 +18076,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17874,8 +18083,6 @@ "Ipv6Native": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to create an IPv6 only subnet.

" } } @@ -17909,7 +18116,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Adds or overwrites only the specified tags for the specified Amazon EC2 resource or\n resources. When you specify an existing tag key, the value is overwritten with\n the new value. Each resource can have a maximum of 50 tags. Each tag consists of a key and\n optional value. Tag keys must be unique per resource.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide. For more information about\n creating IAM policies that control users' access to resources based on tags, see Supported\n resource-level permissions for Amazon EC2 API actions in the Amazon\n Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Adds or overwrites only the specified tags for the specified Amazon EC2 resource or\n resources. When you specify an existing tag key, the value is overwritten with\n the new value. Each resource can have a maximum of 50 tags. Each tag consists of a key and\n optional value. Tag keys must be unique per resource.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide. For more information about\n creating IAM policies that control users' access to resources based on tags, see Supported\n resource-level permissions for Amazon EC2 API actions in the Amazon\n Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag to a resource", + "documentation": "This example adds the tag Stack=production to the specified image, or overwrites an existing tag for the AMI where the tag key is Stack.", + "input": { + "Resources": [ + "ami-78a54011" + ], + "Tags": [ + { + "Key": "Stack", + "Value": "production" + } + ] + } + } + ] } }, "com.amazonaws.ec2#CreateTagsRequest": { @@ -17919,8 +18143,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -17979,8 +18201,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18055,7 +18275,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the Traffic Mirror rule. This number must be unique for each Traffic Mirror rule in a given\n direction. The rules are processed in ascending order by rule number.

", "smithy.api#required": {} } @@ -18083,8 +18302,6 @@ "Protocol": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The protocol, for example UDP, to assign to the Traffic Mirror rule.

\n

For information about the protocol value, see Protocol Numbers on the Internet Assigned Numbers Authority (IANA) website.

" } }, @@ -18113,8 +18330,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18196,16 +18411,13 @@ "PacketLength": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, - "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do\n not specify this parameter when you want to mirror the entire packet. To mirror a subset of\n the packet, set this to the length (in bytes) that you want to mirror. For example, if you\n set this value to 100, then the first 100 bytes that meet the filter criteria are copied to\n the target.

\n

If you do not want to mirror the entire packet, use the PacketLength parameter to specify the number of bytes in each packet to mirror.

" + "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do\n not specify this parameter when you want to mirror the entire packet. To mirror a subset of\n the packet, set this to the length (in bytes) that you want to mirror. For example, if you\n set this value to 100, then the first 100 bytes that meet the filter criteria are copied to\n the target.

\n

If you do not want to mirror the entire packet, use the PacketLength parameter to specify the number of bytes in each packet to mirror.

\n

For sessions with Network Load Balancer (NLB) Traffic Mirror targets the default PacketLength will be set to 8500. Valid values are 1-8500. Setting a PacketLength greater than 8500 will result in an error response.

" } }, "SessionNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.

\n

Valid values are 1-32766.

", "smithy.api#required": {} } @@ -18213,8 +18425,6 @@ "VirtualNetworkId": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The VXLAN ID for the Traffic Mirror session. For more information about the VXLAN\n protocol, see RFC 7348. If you do\n not specify a VirtualNetworkId, an account-wide unique id is chosen at\n random.

" } }, @@ -18234,8 +18444,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18318,8 +18526,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -18450,8 +18656,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -18505,8 +18709,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -18586,8 +18788,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -18701,8 +18901,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -18773,8 +18971,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -18839,16 +19035,12 @@ "Blackhole": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to drop traffic that matches this route.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -18898,8 +19090,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -18964,16 +19154,12 @@ "Blackhole": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to drop traffic that matches this route.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19051,8 +19237,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19097,8 +19281,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19177,8 +19359,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -19259,8 +19439,6 @@ "Port": { "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

" } } @@ -19281,8 +19459,6 @@ "Port": { "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

" } }, @@ -19403,10 +19579,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -19490,10 +19670,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -19554,10 +19738,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "FIPSEnabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Enable or disable support for Federal Information Processing Standards (FIPS) on the instance.

" + } } }, "traits": { @@ -19722,10 +19910,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -19757,7 +19949,29 @@ "target": "com.amazonaws.ec2#Volume" }, "traits": { - "smithy.api#documentation": "

Creates an EBS volume that can be attached to an instance in the same Availability Zone.

\n

You can create a new empty volume or restore a volume from an EBS snapshot.\n Any Amazon Web Services Marketplace product codes from the snapshot are propagated to the volume.

\n

You can create encrypted volumes. Encrypted volumes must be attached to instances that \n support Amazon EBS encryption. Volumes that are created from encrypted snapshots are also automatically \n encrypted. For more information, see Amazon EBS encryption\n in the Amazon Elastic Compute Cloud User Guide.

\n

You can tag your volumes during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Create an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates an EBS volume that can be attached to an instance in the same Availability Zone.

\n

You can create a new empty volume or restore a volume from an EBS snapshot.\n Any Amazon Web Services Marketplace product codes from the snapshot are propagated to the volume.

\n

You can create encrypted volumes. Encrypted volumes must be attached to instances that \n support Amazon EBS encryption. Volumes that are created from encrypted snapshots are also automatically \n encrypted. For more information, see Amazon EBS encryption\n in the Amazon Elastic Compute Cloud User Guide.

\n

You can tag your volumes during creation. For more information, see Tag your Amazon EC2\n resources in the Amazon Elastic Compute Cloud User Guide.

\n

For more information, see Create an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a new volume", + "documentation": "This example creates an 80 GiB General Purpose (SSD) volume in the Availability Zone ``us-east-1a``.", + "input": { + "AvailabilityZone": "us-east-1a", + "Size": 80, + "VolumeType": "gp2" + }, + "output": { + "AvailabilityZone": "us-east-1a", + "Encrypted": false, + "VolumeType": "gp2", + "VolumeId": "vol-6b60b7c7", + "State": "creating", + "Iops": 240, + "SnapshotId": "", + "CreateTime": "2016-08-29T18:52:32.724Z", + "Size": 80 + } + } + ] } }, "com.amazonaws.ec2#CreateVolumePermission": { @@ -19820,7 +20034,7 @@ "target": "com.amazonaws.ec2#AvailabilityZoneName", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The Availability Zone in which to create the volume.

", + "smithy.api#documentation": "

The ID of the Availability Zone in which to create the volume. For example, us-east-1a.

", "smithy.api#required": {} } }, @@ -19828,8 +20042,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume should be encrypted. \n The effect of setting the encryption state to true depends on \nthe volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. \n For more information, see Encryption by default\n in the Amazon Elastic Compute Cloud User Guide.

\n

Encrypted Amazon EBS volumes must be attached to instances that support Amazon EBS encryption. \n For more information, see Supported\n instance types.

", "smithy.api#xmlName": "encrypted" } @@ -19837,8 +20049,6 @@ "Iops": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS). For gp3, io1, and io2 volumes, this represents \n the number of IOPS that are provisioned for the volume. For gp2 volumes, this represents the baseline \n performance of the volume and the rate at which the volume accumulates I/O credits for bursting.

\n

The following are the supported values for each volume type:

\n
    \n
  • \n

    \n gp3: 3,000-16,000 IOPS

    \n
  • \n
  • \n

    \n io1: 100-64,000 IOPS

    \n
  • \n
  • \n

    \n io2: 100-64,000 IOPS

    \n
  • \n
\n

\n io1 and io2 volumes support up to 64,000 IOPS only on \n Instances built on the Nitro System. Other instance families support performance \n up to 32,000 IOPS.

\n

This parameter is required for io1 and io2 volumes.\n The default for gp3 volumes is 3,000 IOPS.\n This parameter is not supported for gp2, st1, sc1, or standard volumes.

" } }, @@ -19857,8 +20067,6 @@ "Size": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiBs. You must specify either a snapshot ID or a volume size.\n If you specify a snapshot, the default is the snapshot size. You can specify a volume \n size that is equal to or larger than the snapshot size.

\n

The following are the supported volumes sizes for each volume type:

\n
    \n
  • \n

    \n gp2 and gp3: 1-16,384

    \n
  • \n
  • \n

    \n io1 and io2: 4-16,384

    \n
  • \n
  • \n

    \n st1 and sc1: 125-16,384

    \n
  • \n
  • \n

    \n standard: 1-1,024

    \n
  • \n
" } }, @@ -19878,8 +20086,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -19894,16 +20100,12 @@ "MultiAttachEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to enable Amazon EBS Multi-Attach. If you enable Multi-Attach, you can attach the \n \tvolume to up to 16 Instances built on the Nitro System in the same Availability Zone. This parameter is \n \tsupported with io1 and io2 volumes only. For more information, \n \tsee \n \t\tAmazon EBS Multi-Attach in the Amazon Elastic Compute Cloud User Guide.

" } }, "Throughput": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput to provision for a volume, with a maximum of 1,000 MiB/s.

\n

This parameter is valid only for gp3 volumes.

\n

Valid Range: Minimum value of 125. Maximum value of 1000.

" } }, @@ -19928,7 +20130,25 @@ "target": "com.amazonaws.ec2#CreateVpcResult" }, "traits": { - "smithy.api#documentation": "

Creates a VPC with the specified CIDR blocks. For more information, see\n\t VPC CIDR blocks in the Amazon Virtual Private Cloud User Guide.

\n

You can optionally request an IPv6 CIDR block for the VPC. You can request an Amazon-provided \n IPv6 CIDR block from Amazon's pool of IPv6 addresses, or an IPv6 CIDR block from an IPv6 address \n pool that you provisioned through bring your own IP addresses (BYOIP).

\n

By default, each instance that you launch in the VPC has the default DHCP options, which\n\t\t\tinclude only a default DNS server that we provide (AmazonProvidedDNS). For more\n\t\t\tinformation, see DHCP option sets in the Amazon Virtual Private Cloud User Guide.

\n

You can specify the instance tenancy value for the VPC when you create it. You can't change\n this value for the VPC after you create it. For more information, see Dedicated Instances in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Creates a VPC with the specified CIDR blocks. For more information, see IP addressing for your VPCs and subnets in the \n Amazon VPC User Guide.

\n

You can optionally request an IPv6 CIDR block for the VPC. You can request an Amazon-provided \n IPv6 CIDR block from Amazon's pool of IPv6 addresses, or an IPv6 CIDR block from an IPv6 address \n pool that you provisioned through bring your own IP addresses (BYOIP).

\n

By default, each instance that you launch in the VPC has the default DHCP options, which\n\t\t\tinclude only a default DNS server that we provide (AmazonProvidedDNS). For more\n\t\t\tinformation, see DHCP option sets in the Amazon VPC User Guide.

\n

You can specify the instance tenancy value for the VPC when you create it. You can't change\n this value for the VPC after you create it. For more information, see Dedicated Instances in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To create a VPC", + "documentation": "This example creates a VPC with the specified CIDR block.", + "input": { + "CidrBlock": "10.0.0.0/16" + }, + "output": { + "Vpc": { + "InstanceTenancy": "default", + "State": "pending", + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.0.0/16", + "DhcpOptionsId": "dopt-7a8b9c2d" + } + } + } + ] } }, "com.amazonaws.ec2#CreateVpcEndpoint": { @@ -19940,7 +20160,7 @@ "target": "com.amazonaws.ec2#CreateVpcEndpointResult" }, "traits": { - "smithy.api#documentation": "

Creates a VPC endpoint for a specified service. An endpoint enables you to create a\n private connection between your VPC and the service. The service may be provided by Amazon Web Services,\n an Amazon Web Services Marketplace Partner, or another Amazon Web Services account. For more information, \n see the Amazon Web Services PrivateLink Guide.

" + "smithy.api#documentation": "

Creates a VPC endpoint. A VPC endpoint provides a private connection between the\n specified VPC and the specified endpoint service. You can use an endpoint service\n provided by Amazon Web Services, an Amazon Web Services Marketplace Partner, or another\n Amazon Web Services account. For more information, see the Amazon Web Services PrivateLink User Guide.

" } }, "com.amazonaws.ec2#CreateVpcEndpointConnectionNotification": { @@ -19961,8 +20181,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -20035,8 +20253,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -20050,7 +20266,7 @@ "target": "com.amazonaws.ec2#VpcId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The ID of the VPC for the endpoint.

", + "smithy.api#documentation": "

The ID of the VPC.

", "smithy.api#required": {} } }, @@ -20058,7 +20274,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The service name.

", + "smithy.api#documentation": "

The name of the endpoint service.

", "smithy.api#required": {} } }, @@ -20078,14 +20294,14 @@ "SubnetIds": { "target": "com.amazonaws.ec2#VpcEndpointSubnetIdList", "traits": { - "smithy.api#documentation": "

(Interface and Gateway Load Balancer endpoints) The IDs of the subnets in which to create an endpoint\n network interface. For a Gateway Load Balancer endpoint, you can specify only one subnet.

", + "smithy.api#documentation": "

(Interface and Gateway Load Balancer endpoints) The IDs of the subnets in which to create endpoint\n network interfaces. For a Gateway Load Balancer endpoint, you can specify only one subnet.

", "smithy.api#xmlName": "SubnetId" } }, "SecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the\n endpoint network interface. If this parameter is not specified, we use the default \n security group for the VPC.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the\n endpoint network interfaces. If this parameter is not specified, we use the default \n security group for the VPC.

", "smithy.api#xmlName": "SecurityGroupId" } }, @@ -20110,8 +20326,6 @@ "PrivateDnsEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Interface endpoint) Indicates whether to associate a private hosted zone with the\n specified VPC. The private hosted zone contains a record set for the default public DNS\n name for the service for the Region (for example,\n kinesis.us-east-1.amazonaws.com), which resolves to the private IP\n addresses of the endpoint network interfaces in the VPC. This enables you to make\n requests to the default public DNS name for the service instead of the public DNS names\n that are automatically generated by the VPC endpoint service.

\n

To use a private hosted zone, you must set the following VPC attributes to\n true: enableDnsHostnames and\n enableDnsSupport. Use ModifyVpcAttribute to set the VPC\n attributes.

\n

Default: true\n

" } }, @@ -20121,6 +20335,13 @@ "smithy.api#documentation": "

The tags to associate with the endpoint.

", "smithy.api#xmlName": "TagSpecification" } + }, + "SubnetConfigurations": { + "target": "com.amazonaws.ec2#SubnetConfigurationsList", + "traits": { + "smithy.api#documentation": "

The subnet configurations for the endpoint.

", + "smithy.api#xmlName": "SubnetConfiguration" + } } }, "traits": { @@ -20169,16 +20390,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "AcceptanceRequired": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether requests from service consumers to create an endpoint to your service must\n be accepted manually.

" } }, @@ -20270,8 +20487,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -20349,8 +20564,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AmazonProvidedIpv6CidrBlock", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC.\n You cannot specify the range of IP addresses, or the size of the CIDR block.

", "smithy.api#xmlName": "amazonProvidedIpv6CidrBlock" } @@ -20395,8 +20608,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -20490,8 +20701,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -20610,8 +20819,6 @@ "AmazonSideAsn": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A private Autonomous System Number (ASN) for the Amazon side of a BGP session. If\n you're using a 16-bit ASN, it must be in the 64512 to 65534 range. If you're using a\n 32-bit ASN, it must be in the 4200000000 to 4294967294 range.

\n

Default: 64512

" } }, @@ -20619,8 +20826,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -21046,8 +21251,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -21098,8 +21301,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -21164,8 +21365,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -21224,8 +21423,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -21276,8 +21473,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -21311,7 +21506,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified customer gateway. You must delete the VPN connection before you\n can delete the customer gateway.

" + "smithy.api#documentation": "

Deletes the specified customer gateway. You must delete the VPN connection before you\n can delete the customer gateway.

", + "smithy.api#examples": [ + { + "title": "To delete a customer gateway", + "documentation": "This example deletes the specified customer gateway.", + "input": { + "CustomerGatewayId": "cgw-0e11f167" + } + } + ] } }, "com.amazonaws.ec2#DeleteCustomerGatewayRequest": { @@ -21329,8 +21533,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -21350,7 +21552,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified set of DHCP options. You must disassociate the set of DHCP options before you can delete it. You can disassociate the set of DHCP options by associating either a new set of options or the default set of options with the VPC.

" + "smithy.api#documentation": "

Deletes the specified set of DHCP options. You must disassociate the set of DHCP options before you can delete it. You can disassociate the set of DHCP options by associating either a new set of options or the default set of options with the VPC.

", + "smithy.api#examples": [ + { + "title": "To delete a DHCP options set", + "documentation": "This example deletes the specified DHCP options set.", + "input": { + "DhcpOptionsId": "dopt-d9070ebb" + } + } + ] } }, "com.amazonaws.ec2#DeleteDhcpOptionsRequest": { @@ -21368,8 +21579,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -21397,8 +21606,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -21422,8 +21629,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReturnCode", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "returnCode" } @@ -21578,8 +21783,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -21596,7 +21799,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to terminate the associated instances when the EC2 Fleet is deleted. The default is to\n terminate the instances.

\n

To let the instances continue to run after the EC2 Fleet is deleted, specify\n no-terminate-instances. Supported only for fleets of type\n maintain and request.

\n

For instant fleets, you cannot specify NoTerminateInstances. A\n deleted instant fleet with running instances is not supported.

", "smithy.api#required": {} } @@ -21648,8 +21850,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -21701,8 +21901,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -21726,8 +21924,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -21755,8 +21951,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -21807,16 +22001,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "ForceDelete": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specify true to force delete the event window. Use the force delete parameter\n if the event window is currently associated with targets.

" } }, @@ -21859,7 +22049,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified internet gateway. You must detach the internet gateway from the\n\t\t\tVPC before you can delete it.

" + "smithy.api#documentation": "

Deletes the specified internet gateway. You must detach the internet gateway from the\n\t\t\tVPC before you can delete it.

", + "smithy.api#examples": [ + { + "title": "To delete an Internet gateway", + "documentation": "This example deletes the specified Internet gateway.", + "input": { + "InternetGatewayId": "igw-c0a643a9" + } + } + ] } }, "com.amazonaws.ec2#DeleteInternetGatewayRequest": { @@ -21869,8 +22068,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -21920,8 +22117,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -21960,8 +22155,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -21976,8 +22169,6 @@ "Cascade": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Enables you to quickly delete an IPAM, private scopes, pools in private scopes, and\n any allocations in the pools in private scopes. You cannot delete the IPAM with this option if there is a pool in your public scope. If you use this option, IPAM does the following:

\n
    \n
  • \n

    Deallocates any CIDRs allocated to VPC resources (such as VPCs) in pools in private scopes.

    \n \n

    No VPC resources are deleted as a result of enabling this option. The CIDR associated with the resource will no longer be allocated from an IPAM pool, but the CIDR itself will remain unchanged.

    \n
    \n
  • \n
  • \n

    Deprovisions all IPv4 CIDRs provisioned to IPAM pools in private scopes.

    \n
  • \n
  • \n

    Deletes all IPAM pools in private scopes.

    \n
  • \n
  • \n

    Deletes all non-default private scopes in the IPAM.

    \n
  • \n
  • \n

    Deletes the default public and private scopes and the IPAM.

    \n
  • \n
" } } @@ -22004,8 +22195,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22072,8 +22261,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22112,10 +22299,19 @@ "target": "com.amazonaws.ec2#DeleteKeyPairRequest" }, "output": { - "target": "smithy.api#Unit" + "target": "com.amazonaws.ec2#DeleteKeyPairResult" }, "traits": { - "smithy.api#documentation": "

Deletes the specified key pair, by removing the public key from Amazon EC2.

" + "smithy.api#documentation": "

Deletes the specified key pair, by removing the public key from Amazon EC2.

", + "smithy.api#examples": [ + { + "title": "To delete a key pair", + "documentation": "This example deletes the specified key pair.", + "input": { + "KeyName": "my-key-pair" + } + } + ] } }, "com.amazonaws.ec2#DeleteKeyPairRequest": { @@ -22137,8 +22333,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -22148,6 +22342,30 @@ "smithy.api#input": {} } }, + "com.amazonaws.ec2#DeleteKeyPairResult": { + "type": "structure", + "members": { + "Return": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "Return", + "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", + "smithy.api#xmlName": "return" + } + }, + "KeyPairId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "KeyPairId", + "smithy.api#documentation": "

The ID of the key pair.

", + "smithy.api#xmlName": "keyPairId" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#DeleteLaunchTemplate": { "type": "operation", "input": { @@ -22157,7 +22375,26 @@ "target": "com.amazonaws.ec2#DeleteLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Deletes a launch template. Deleting a launch template deletes all of its\n versions.

" + "smithy.api#documentation": "

Deletes a launch template. Deleting a launch template deletes all of its\n versions.

", + "smithy.api#examples": [ + { + "title": "To delete a launch template", + "documentation": "This example deletes the specified launch template.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123" + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 2, + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "my-template", + "DefaultVersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-11-23T16:46:25.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#DeleteLaunchTemplateRequest": { @@ -22166,8 +22403,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -22213,7 +22448,29 @@ "target": "com.amazonaws.ec2#DeleteLaunchTemplateVersionsResult" }, "traits": { - "smithy.api#documentation": "

Deletes one or more versions of a launch template. You cannot delete the default\n version of a launch template; you must first assign a different version as the default.\n If the default version is the only version for the launch template, you must delete the\n entire launch template using DeleteLaunchTemplate.

" + "smithy.api#documentation": "

Deletes one or more versions of a launch template.

\n

You can't delete the default version of a launch template; you must first assign a\n different version as the default. If the default version is the only version for the\n launch template, you must delete the entire launch template using DeleteLaunchTemplate.

\n

You can delete up to 200 launch template versions in a single request. To delete more\n than 200 versions in a single request, use DeleteLaunchTemplate, which\n deletes the launch template and all of its versions.

\n

For more information, see Delete a launch template version in the EC2 User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a launch template version", + "documentation": "This example deletes the specified launch template version.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "Versions": [ + "1" + ] + }, + "output": { + "SuccessfullyDeletedLaunchTemplateVersions": [ + { + "LaunchTemplateName": "my-template", + "VersionNumber": 1, + "LaunchTemplateId": "lt-0abcd290751193123" + } + ], + "UnsuccessfullyDeletedLaunchTemplateVersions": [] + } + } + ] } }, "com.amazonaws.ec2#DeleteLaunchTemplateVersionsRequest": { @@ -22222,8 +22479,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -22243,7 +22498,7 @@ "target": "com.amazonaws.ec2#VersionStringList", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The version numbers of one or more launch template versions to delete.

", + "smithy.api#documentation": "

The version numbers of one or more launch template versions to delete. You can specify\n up to 200 launch template version numbers.

", "smithy.api#required": {}, "smithy.api#xmlName": "LaunchTemplateVersion" } @@ -22276,8 +22531,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "VersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number of the launch template.

", "smithy.api#xmlName": "versionNumber" } @@ -22327,8 +22580,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "VersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number of the launch template.

", "smithy.api#xmlName": "versionNumber" } @@ -22403,8 +22654,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22461,8 +22710,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -22513,8 +22760,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -22565,8 +22810,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -22609,8 +22852,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22652,7 +22893,19 @@ "target": "com.amazonaws.ec2#DeleteNatGatewayResult" }, "traits": { - "smithy.api#documentation": "

Deletes the specified NAT gateway. Deleting a public NAT gateway disassociates its Elastic IP address, \n but does not release the address from your account. Deleting a NAT gateway does not delete any NAT gateway \n routes in your route tables.

" + "smithy.api#documentation": "

Deletes the specified NAT gateway. Deleting a public NAT gateway disassociates its Elastic IP address, \n but does not release the address from your account. Deleting a NAT gateway does not delete any NAT gateway \n routes in your route tables.

", + "smithy.api#examples": [ + { + "title": "To delete a NAT gateway", + "documentation": "This example deletes the specified NAT gateway.", + "input": { + "NatGatewayId": "nat-04ae55e711cec5680" + }, + "output": { + "NatGatewayId": "nat-04ae55e711cec5680" + } + } + ] } }, "com.amazonaws.ec2#DeleteNatGatewayRequest": { @@ -22661,8 +22914,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22705,7 +22956,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified network ACL. You can't delete the ACL if it's associated with any subnets. You can't delete the default network ACL.

" + "smithy.api#documentation": "

Deletes the specified network ACL. You can't delete the ACL if it's associated with any subnets. You can't delete the default network ACL.

", + "smithy.api#examples": [ + { + "title": "To delete a network ACL", + "documentation": "This example deletes the specified network ACL.", + "input": { + "NetworkAclId": "acl-5fb85d36" + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkAclEntry": { @@ -22717,7 +22977,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified ingress or egress entry (rule) from the specified network ACL.

" + "smithy.api#documentation": "

Deletes the specified ingress or egress entry (rule) from the specified network ACL.

", + "smithy.api#examples": [ + { + "title": "To delete a network ACL entry", + "documentation": "This example deletes ingress rule number 100 from the specified network ACL.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Egress": true + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkAclEntryRequest": { @@ -22727,8 +22998,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -22738,7 +23007,6 @@ "traits": { "aws.protocols#ec2QueryName": "Egress", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the rule is an egress rule.

", "smithy.api#required": {}, "smithy.api#xmlName": "egress" @@ -22759,7 +23027,6 @@ "traits": { "aws.protocols#ec2QueryName": "RuleNumber", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number of the entry to delete.

", "smithy.api#required": {}, "smithy.api#xmlName": "ruleNumber" @@ -22777,8 +23044,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -22836,8 +23101,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -22868,8 +23131,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22920,8 +23181,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -22972,8 +23231,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23015,7 +23272,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified network interface. You must detach the network interface before you can delete it.

" + "smithy.api#documentation": "

Deletes the specified network interface. You must detach the network interface before you can delete it.

", + "smithy.api#examples": [ + { + "title": "To delete a network interface", + "documentation": "This example deletes the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3" + } + } + ] } }, "com.amazonaws.ec2#DeleteNetworkInterfacePermission": { @@ -23044,16 +23310,12 @@ "Force": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specify true to remove the permission even if the network interface is\n\t\t\tattached to an instance.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is DryRunOperation. \n\t\t\tOtherwise, it is UnauthorizedOperation.

" } } @@ -23070,8 +23332,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds, otherwise returns an error.

", "smithy.api#xmlName": "return" } @@ -23089,8 +23349,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23120,7 +23378,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified placement group. You must terminate all instances in the\n placement group before you can delete the placement group. For more information, see\n Placement groups in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Deletes the specified placement group. You must terminate all instances in the\n placement group before you can delete the placement group. For more information, see\n Placement groups in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a placement group", + "documentation": "This example deletes the specified placement group.\n", + "input": { + "GroupName": "my-cluster" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeletePlacementGroupRequest": { @@ -23130,8 +23398,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23169,8 +23435,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23194,8 +23458,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReturnValue", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Information about the result of deleting the public IPv4 pool.

", "smithy.api#xmlName": "returnValue" } @@ -23285,8 +23547,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -23337,7 +23597,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified route from the specified route table.

" + "smithy.api#documentation": "

Deletes the specified route from the specified route table.

", + "smithy.api#examples": [ + { + "title": "To delete a route", + "documentation": "This example deletes the specified route from the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "0.0.0.0/0" + } + } + ] } }, "com.amazonaws.ec2#DeleteRouteRequest": { @@ -23369,8 +23639,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23399,7 +23667,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified route table. You must disassociate the route table from any subnets before you can delete it. You can't delete the main route table.

" + "smithy.api#documentation": "

Deletes the specified route table. You must disassociate the route table from any subnets before you can delete it. You can't delete the main route table.

", + "smithy.api#examples": [ + { + "title": "To delete a route table", + "documentation": "This example deletes the specified route table.", + "input": { + "RouteTableId": "rtb-22574640" + } + } + ] } }, "com.amazonaws.ec2#DeleteRouteTableRequest": { @@ -23409,8 +23686,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23439,7 +23714,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes a security group.

\n

If you attempt to delete a security group that is associated with an instance, or is\n\t\t\t referenced by another security group, the operation fails with\n\t\t\t\tInvalidGroup.InUse in EC2-Classic or\n\t\t\t\tDependencyViolation in EC2-VPC.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Deletes a security group.

\n

If you attempt to delete a security group that is associated with an instance or network interface or is\n\t\t\t referenced by another security group, the operation fails with\n\t\t\t\tDependencyViolation.

", + "smithy.api#examples": [ + { + "title": "To delete a security group", + "documentation": "This example deletes the specified security group.", + "input": { + "GroupId": "sg-903004f8" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteSecurityGroupRequest": { @@ -23448,21 +23733,19 @@ "GroupId": { "target": "com.amazonaws.ec2#SecurityGroupId", "traits": { - "smithy.api#documentation": "

The ID of the security group. Required for a nondefault VPC.

" + "smithy.api#documentation": "

The ID of the security group.

" } }, "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You can specify either the\n security group name or the security group ID. For security groups in a nondefault VPC,\n you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You can specify either the\n security group name or the security group ID. For security groups in a nondefault VPC,\n you must specify the security group ID.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23481,7 +23764,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified snapshot.

\n

When you make periodic snapshots of a volume, the snapshots are incremental, and only the\n blocks on the device that have changed since your last snapshot are saved in the new snapshot.\n When you delete a snapshot, only the data not needed for any other snapshot is removed. So\n regardless of which prior snapshots have been deleted, all active snapshots will have access\n to all the information needed to restore the volume.

\n

You cannot delete a snapshot of the root device of an EBS volume used by a registered AMI.\n You must first de-register the AMI before you can delete the snapshot.

\n

For more information, see Delete an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Deletes the specified snapshot.

\n

When you make periodic snapshots of a volume, the snapshots are incremental, and only the\n blocks on the device that have changed since your last snapshot are saved in the new snapshot.\n When you delete a snapshot, only the data not needed for any other snapshot is removed. So\n regardless of which prior snapshots have been deleted, all active snapshots will have access\n to all the information needed to restore the volume.

\n

You cannot delete a snapshot of the root device of an EBS volume used by a registered AMI.\n You must first de-register the AMI before you can delete the snapshot.

\n

For more information, see Delete an Amazon EBS snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a snapshot", + "documentation": "This example deletes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteSnapshotRequest": { @@ -23499,8 +23792,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23519,7 +23810,13 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the data feed for Spot Instances.

" + "smithy.api#documentation": "

Deletes the data feed for Spot Instances.

", + "smithy.api#examples": [ + { + "title": "To cancel a Spot Instance data feed subscription", + "documentation": "This example deletes a Spot data feed subscription for the account." + } + ] } }, "com.amazonaws.ec2#DeleteSpotDatafeedSubscriptionRequest": { @@ -23529,8 +23826,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23550,7 +23845,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified subnet. You must terminate all running instances in the subnet before you can delete the subnet.

" + "smithy.api#documentation": "

Deletes the specified subnet. You must terminate all running instances in the subnet before you can delete the subnet.

", + "smithy.api#examples": [ + { + "title": "To delete a subnet", + "documentation": "This example deletes the specified subnet.", + "input": { + "SubnetId": "subnet-9d4a7b6c" + } + } + ] } }, "com.amazonaws.ec2#DeleteSubnetCidrReservation": { @@ -23579,8 +23883,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23620,8 +23922,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23640,7 +23940,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified set of tags from the specified set of resources.

\n

To list the current tags, use DescribeTags. For more information about\n tags, see Tag\n your Amazon EC2 resources in the Amazon Elastic Compute Cloud User\n Guide.

" + "smithy.api#documentation": "

Deletes the specified set of tags from the specified set of resources.

\n

To list the current tags, use DescribeTags. For more information about\n tags, see Tag\n your Amazon EC2 resources in the Amazon Elastic Compute Cloud User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a tag from a resource", + "documentation": "This example deletes the tag Stack=test from the specified image.", + "input": { + "Resources": [ + "ami-78a54011" + ], + "Tags": [ + { + "Key": "Stack", + "Value": "test" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DeleteTagsRequest": { @@ -23650,8 +23967,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -23705,8 +24020,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23757,8 +24070,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23809,8 +24120,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23861,8 +24170,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23937,8 +24244,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -23977,8 +24282,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24029,8 +24332,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24081,8 +24382,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24133,8 +24432,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24193,8 +24490,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24233,8 +24528,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24293,8 +24586,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24357,8 +24648,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24397,8 +24686,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24449,8 +24736,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24508,8 +24793,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24567,8 +24850,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -24619,8 +24900,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -24678,8 +24957,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -24720,7 +24997,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified EBS volume. The volume must be in the available state\n (not attached to an instance).

\n

The volume can remain in the deleting state for several minutes.

\n

For more information, see Delete an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Deletes the specified EBS volume. The volume must be in the available state\n (not attached to an instance).

\n

The volume can remain in the deleting state for several minutes.

\n

For more information, see Delete an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a volume", + "documentation": "This example deletes an available volume with the volume ID of ``vol-049df61146c4d7901``. If the command succeeds, no output is returned.", + "input": { + "VolumeId": "vol-049df61146c4d7901" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#DeleteVolumeRequest": { @@ -24738,8 +25025,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24758,7 +25043,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Deletes the specified VPC. You must detach or delete all gateways and resources that are associated with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, delete all security groups associated with the VPC (except the default one), delete all route tables associated with the VPC (except the default one), and so on.

" + "smithy.api#documentation": "

Deletes the specified VPC. You must detach or delete all gateways and resources that are associated with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, delete all security groups associated with the VPC (except the default one), delete all route tables associated with the VPC (except the default one), and so on. When you delete the VPC, it deletes the VPC's default security group, network ACL, and route table.

", + "smithy.api#examples": [ + { + "title": "To delete a VPC", + "documentation": "This example deletes the specified VPC.", + "input": { + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#DeleteVpcEndpointConnectionNotifications": { @@ -24779,8 +25073,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -24832,8 +25124,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -24885,8 +25175,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -24939,8 +25227,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -24967,8 +25253,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -24993,8 +25277,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25031,8 +25313,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25107,8 +25387,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25145,8 +25423,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25189,8 +25465,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -25247,8 +25521,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -25333,8 +25605,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25363,8 +25633,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -25403,8 +25671,6 @@ "IncludeAllTagsOfInstance": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to deregister all tag keys in the current Region. Specify false \n \t\tto deregister all tag keys.

" } }, @@ -25456,8 +25722,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25518,8 +25782,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25553,7 +25815,33 @@ "target": "com.amazonaws.ec2#DescribeAccountAttributesResult" }, "traits": { - "smithy.api#documentation": "

Describes attributes of your Amazon Web Services account. The following are the supported account attributes:

\n
    \n
  • \n

    \n supported-platforms: Indicates whether your account can launch instances\n into EC2-Classic and EC2-VPC, or only into EC2-VPC.

    \n
  • \n
  • \n

    \n default-vpc: The ID of the default VPC for your account, or\n none.

    \n
  • \n
  • \n

    \n max-instances: This attribute is no longer supported. The returned\n value does not reflect your actual vCPU limit for running On-Demand Instances.\n For more information, see On-Demand Instance Limits in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n vpc-max-security-groups-per-interface: The maximum number of security groups\n that you can assign to a network interface.

    \n
  • \n
  • \n

    \n max-elastic-ips: The maximum number of Elastic IP addresses that you can\n allocate for use with EC2-Classic.

    \n
  • \n
  • \n

    \n vpc-max-elastic-ips: The maximum number of Elastic IP addresses that you can\n allocate for use with EC2-VPC.

    \n
  • \n
\n \n

We are retiring EC2-Classic on August 15, 2022. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon EC2 User Guide.

\n
" + "smithy.api#documentation": "

Describes attributes of your Amazon Web Services account. The following are the supported account attributes:

\n
    \n
  • \n

    \n default-vpc: The ID of the default VPC for your account, or none.

    \n
  • \n
  • \n

    \n max-instances: This attribute is no longer supported. The returned\n value does not reflect your actual vCPU limit for running On-Demand Instances.\n For more information, see On-Demand Instance Limits in the\n Amazon Elastic Compute Cloud User Guide.

    \n
  • \n
  • \n

    \n max-elastic-ips: The maximum number of Elastic IP addresses that you can allocate.

    \n
  • \n
  • \n

    \n supported-platforms: This attribute is deprecated.

    \n
  • \n
  • \n

    \n vpc-max-elastic-ips: The maximum number of Elastic IP addresses that you can allocate.

    \n
  • \n
  • \n

    \n vpc-max-security-groups-per-interface: The maximum number of security groups\n that you can assign to a network interface.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To describe a single attribute for your AWS account", + "documentation": "This example describes the supported-platforms attribute for your AWS account.", + "input": { + "AttributeNames": [ + "supported-platforms" + ] + }, + "output": { + "AccountAttributes": [ + { + "AttributeName": "supported-platforms", + "AttributeValues": [ + { + "AttributeValue": "EC2" + }, + { + "AttributeValue": "VPC" + } + ] + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAccountAttributesRequest": { @@ -25571,8 +25859,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25619,7 +25905,6 @@ "com.amazonaws.ec2#DescribeAddressTransfersMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -25645,16 +25930,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeAddressTransfersMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of address transfers to return in one page of results.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25696,7 +25977,32 @@ "target": "com.amazonaws.ec2#DescribeAddressesResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified Elastic IP addresses or all of your Elastic IP addresses.

" + "smithy.api#documentation": "

Describes the specified Elastic IP addresses or all of your Elastic IP addresses.

", + "smithy.api#examples": [ + { + "title": "To describe your Elastic IP addresses", + "documentation": "This example describes your Elastic IP addresses.", + "output": { + "Addresses": [ + { + "InstanceId": "i-1234567890abcdef0", + "PublicIp": "198.51.100.0", + "Domain": "standard" + }, + { + "Domain": "vpc", + "InstanceId": "i-1234567890abcdef0", + "NetworkInterfaceId": "eni-12345678", + "AssociationId": "eipassoc-12345678", + "NetworkInterfaceOwnerId": "123456789012", + "PublicIp": "203.0.113.0", + "AllocationId": "eipalloc-12345678", + "PrivateIpAddress": "10.0.1.241" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAddressesAttribute": { @@ -25742,16 +26048,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#AddressMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call. To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25812,8 +26114,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25857,8 +26157,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -25874,8 +26172,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "UseLongIdsAggregated", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether all resource types in the Region are configured to use longer IDs.\n This value is only true if all users are configured to use longer IDs for\n all resources types in the Region.

", "smithy.api#xmlName": "useLongIdsAggregated" } @@ -25902,7 +26198,41 @@ "target": "com.amazonaws.ec2#DescribeAvailabilityZonesResult" }, "traits": { - "smithy.api#documentation": "

Describes the Availability Zones, Local Zones, and Wavelength Zones that are available to\n you. If there is an event impacting a zone, you can use this request to view the state and any\n provided messages for that zone.

\n

For more information about Availability Zones, Local Zones, and Wavelength Zones, see\n Regions and zones \n in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the Availability Zones, Local Zones, and Wavelength Zones that are available to\n you. If there is an event impacting a zone, you can use this request to view the state and any\n provided messages for that zone.

\n

For more information about Availability Zones, Local Zones, and Wavelength Zones, see\n Regions and zones \n in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe your Availability Zones", + "documentation": "This example describes the Availability Zones that are available to you. The response includes Availability Zones only for the current region.", + "output": { + "AvailabilityZones": [ + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1b" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1c" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1d" + }, + { + "State": "available", + "RegionName": "us-east-1", + "Messages": [], + "ZoneName": "us-east-1e" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeAvailabilityZonesRequest": { @@ -25932,8 +26262,6 @@ "AllAvailabilityZones": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Include all Availability Zones, Local Zones, and Wavelength Zones regardless of your\n opt-in status.

\n

If you do not use this parameter, the results include only the zones for the Regions where you have chosen the option to opt in.

" } }, @@ -25941,8 +26269,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -25992,8 +26318,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#MaxResultsParam", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -26013,8 +26337,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -26107,8 +26429,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -26155,7 +26475,6 @@ "com.amazonaws.ec2#DescribeByoipCidrsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 100 @@ -26168,8 +26487,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -26177,7 +26494,6 @@ "target": "com.amazonaws.ec2#DescribeByoipCidrsMaxResults", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

", "smithy.api#required": {} } @@ -26238,7 +26554,6 @@ "com.amazonaws.ec2#DescribeCapacityReservationFleetsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 100 @@ -26264,8 +26579,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeCapacityReservationFleetsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, @@ -26279,8 +26592,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -26334,7 +26645,6 @@ "com.amazonaws.ec2#DescribeCapacityReservationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -26360,8 +26670,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeCapacityReservationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, @@ -26375,8 +26683,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -26447,8 +26753,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#CarrierGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -26461,8 +26765,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -26504,7 +26806,7 @@ "target": "com.amazonaws.ec2#DescribeClassicLinkInstancesResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your linked EC2-Classic instances. This request only returns\n\t\t\tinformation about EC2-Classic instances linked to a VPC through ClassicLink. You cannot\n\t\t\tuse this request to return information about other instances.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
", + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes one or more of your linked EC2-Classic instances. This request only returns\n\t\t\tinformation about EC2-Classic instances linked to a VPC through ClassicLink. You cannot\n\t\t\tuse this request to return information about other instances.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -26516,7 +26818,6 @@ "com.amazonaws.ec2#DescribeClassicLinkInstancesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -26529,7 +26830,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n group-id - The ID of a VPC security group that's associated with the instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC to which the instance is\n\t\t\t\t\tlinked.

    \n

    \n vpc-id - The ID of the VPC that the instance is linked to.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n group-id - The ID of a VPC security group that's associated with the instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC to which the instance is linked.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -26537,8 +26838,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -26546,7 +26845,7 @@ "InstanceIds": { "target": "com.amazonaws.ec2#InstanceIdStringList", "traits": { - "smithy.api#documentation": "

One or more instance IDs. Must be instances linked to a VPC through ClassicLink.

", + "smithy.api#documentation": "

The instance IDs. Must be instances linked to a VPC through ClassicLink.

", "smithy.api#xmlName": "InstanceId" } }, @@ -26554,8 +26853,6 @@ "target": "com.amazonaws.ec2#DescribeClassicLinkInstancesMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

\n

Constraint: If the value is greater than 1000, we return only 1000 items.

", "smithy.api#xmlName": "maxResults" } @@ -26618,7 +26915,6 @@ "com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -26639,8 +26935,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -26660,8 +26954,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } } @@ -26715,7 +27007,6 @@ "com.amazonaws.ec2#DescribeClientVpnConnectionsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -26749,16 +27040,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnConnectionsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -26794,7 +27081,6 @@ "com.amazonaws.ec2#DescribeClientVpnEndpointMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -26832,8 +27118,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnEndpointMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } }, @@ -26853,8 +27137,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -26908,7 +27190,6 @@ "com.amazonaws.ec2#DescribeClientVpnRoutesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -26936,8 +27217,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnRoutesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } }, @@ -26950,8 +27229,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -27005,7 +27282,6 @@ "com.amazonaws.ec2#DescribeClientVpnTargetNetworksMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -27032,8 +27308,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeClientVpnTargetNetworksMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.

" } }, @@ -27053,8 +27327,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -27125,8 +27397,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#CoipPoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -27139,8 +27409,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -27276,8 +27544,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -27313,6 +27579,28 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your VPN customer gateways.

\n

For more information, see Amazon Web Services Site-to-Site VPN in the Amazon Web Services Site-to-Site VPN\n User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a customer gateway", + "documentation": "This example describes the specified customer gateway.", + "input": { + "CustomerGatewayIds": [ + "cgw-0e11f167" + ] + }, + "output": { + "CustomerGateways": [ + { + "CustomerGatewayId": "cgw-0e11f167", + "IpAddress": "12.1.2.3", + "State": "available", + "Type": "ipsec.1", + "BgpAsn": "65534" + } + ] + } + } + ], "smithy.waiters#waitable": { "CustomerGatewayAvailable": { "acceptors": [ @@ -27373,8 +27661,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -27411,7 +27697,38 @@ "target": "com.amazonaws.ec2#DescribeDhcpOptionsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your DHCP options sets.

\n

For more information, see DHCP options sets in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your DHCP options sets.

\n

For more information, see DHCP options sets in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a DHCP options set", + "documentation": "This example describes the specified DHCP options set.", + "input": { + "DhcpOptionsIds": [ + "dopt-d9070ebb" + ] + }, + "output": { + "DhcpOptions": [ + { + "DhcpConfigurations": [ + { + "Values": [ + { + "Value": "10.2.5.2" + }, + { + "Value": "10.2.5.1" + } + ], + "Key": "domain-name-servers" + } + ], + "DhcpOptionsId": "dopt-d9070ebb" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -27423,7 +27740,6 @@ "com.amazonaws.ec2#DescribeDhcpOptionsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -27443,7 +27759,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n dhcp-options-id - The ID of a DHCP options set.

    \n
  • \n
  • \n

    \n key - The key for one of the options (for example, domain-name).

    \n
  • \n
  • \n

    \n value - The value for one of the options.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the DHCP options set.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n dhcp-options-id - The ID of a DHCP options set.

    \n
  • \n
  • \n

    \n key - The key for one of the options (for example, domain-name).

    \n
  • \n
  • \n

    \n value - The value for one of the options.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the DHCP options set.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -27451,8 +27767,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -27466,8 +27780,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeDhcpOptionsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -27521,7 +27833,6 @@ "com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -27534,23 +27845,19 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "EgressOnlyInternetGatewayIds": { "target": "com.amazonaws.ec2#EgressOnlyInternetGatewayIdList", "traits": { - "smithy.api#documentation": "

One or more egress-only internet gateway IDs.

", + "smithy.api#documentation": "

The IDs of the egress-only internet gateways.

", "smithy.api#xmlName": "EgressOnlyInternetGatewayId" } }, "MaxResults": { "target": "com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } }, @@ -27563,7 +27870,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } } @@ -27611,7 +27918,6 @@ "com.amazonaws.ec2#DescribeElasticGpusMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 10, "max": 1000 @@ -27631,8 +27937,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -27646,8 +27950,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeElasticGpusMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value. This value\n can be between 5 and 1000.

" } }, @@ -27677,8 +27979,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of items to return. If the total number of items available is more\n than the value specified in max-items then a Next-Token will be provided in the output\n that you can use to resume pagination.

", "smithy.api#xmlName": "maxResults" } @@ -27717,7 +28017,6 @@ "com.amazonaws.ec2#DescribeExportImageTasksMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 500 @@ -27730,8 +28029,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -27752,8 +28049,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeExportImageTasksMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call.

" } }, @@ -27925,8 +28220,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -28007,8 +28300,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxParallelLaunches", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances that Amazon EC2 can launch at the same time to create \n\t\t\tpre-provisioned snapshots for Windows faster launching.

", "smithy.api#xmlName": "maxParallelLaunches" } @@ -28216,8 +28507,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -28308,8 +28597,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -28322,8 +28609,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -28420,16 +28705,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -28581,16 +28862,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -28667,8 +28944,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -28688,8 +28963,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } }, @@ -28746,8 +29019,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -28809,7 +29080,6 @@ "com.amazonaws.ec2#DescribeFpgaImagesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -28822,8 +29092,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -28857,8 +29125,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeFpgaImagesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call.

" } } @@ -28921,24 +29187,18 @@ "MaxDuration": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

This is the maximum duration of the reservation to purchase, specified in seconds.\n Reservations are available in one-year and three-year terms. The number of seconds\n specified must be the number of seconds in a year (365x24x60x60) times one of the\n supported durations (1 or 3). For example, specify 94608000 for three years.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#DescribeHostReservationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, "MinDuration": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

This is the minimum duration of the reservation you'd like to purchase, specified in\n seconds. Reservations are available in one-year and three-year terms. The number of\n seconds specified must be the number of seconds in a year (365x24x60x60) times one of\n the supported durations (1 or 3). For example, specify 31536000 for one year.

" } }, @@ -29004,7 +29264,6 @@ "com.amazonaws.ec2#DescribeHostReservationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 500 @@ -29029,8 +29288,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, @@ -29110,8 +29367,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

\n

You cannot specify this parameter and the host IDs parameter in the same\n request.

", "smithy.api#xmlName": "maxResults" } @@ -29163,6 +29418,30 @@ }, "traits": { "smithy.api#documentation": "

Describes your IAM instance profile associations.

", + "smithy.api#examples": [ + { + "title": "To describe an IAM instance profile association", + "documentation": "This example describes the specified IAM instance profile association.", + "input": { + "AssociationIds": [ + "iip-assoc-0db249b1f25fa24b8" + ] + }, + "output": { + "IamInstanceProfileAssociations": [ + { + "InstanceId": "i-09eb09efa73ec1dee", + "State": "associated", + "AssociationId": "iip-assoc-0db249b1f25fa24b8", + "IamInstanceProfile": { + "Id": "AIPAJVQN4F5WVLGCJDRGM", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -29174,7 +29453,6 @@ "com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -29201,8 +29479,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of\n items, make another request with the token returned in the output. For more information, \n see Pagination.

" } }, @@ -29346,7 +29622,25 @@ "target": "com.amazonaws.ec2#ImageAttribute" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified AMI. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified AMI. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the launch permissions for an AMI", + "documentation": "This example describes the launch permissions for the specified AMI.", + "input": { + "Attribute": "launchPermission", + "ImageId": "ami-5731123e" + }, + "output": { + "ImageId": "ami-5731123e", + "LaunchPermissions": [ + { + "UserId": "123456789012" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeImageAttributeRequest": { @@ -29372,8 +29666,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -29394,6 +29686,48 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified images (AMIs, AKIs, and ARIs) available to you or all of the images available to you.

\n

The images available to you include public images, private images that you own, and private images owned by other \n Amazon Web Services accounts for which you have explicit launch permissions.

\n

Recently deregistered images appear in the returned results for a short interval and then\n return empty results. After all instances that reference a deregistered AMI are terminated,\n specifying the ID of the image will eventually return an error indicating that the AMI ID\n cannot be found.

", + "smithy.api#examples": [ + { + "title": "To describe an AMI", + "documentation": "This example describes the specified AMI.", + "input": { + "ImageIds": [ + "ami-5731123e" + ] + }, + "output": { + "Images": [ + { + "VirtualizationType": "paravirtual", + "Name": "My server", + "Hypervisor": "xen", + "ImageId": "ami-5731123e", + "RootDeviceType": "ebs", + "State": "available", + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sda1", + "Ebs": { + "DeleteOnTermination": true, + "SnapshotId": "snap-1234567890abcdef0", + "VolumeSize": 8, + "VolumeType": "standard" + } + } + ], + "Architecture": "x86_64", + "ImageLocation": "123456789012/My server", + "KernelId": "aki-88aa75e1", + "OwnerId": "123456789012", + "RootDeviceName": "/dev/sda1", + "Public": false, + "ImageType": "machine", + "Description": "An AMI for my server" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -29466,7 +29800,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n architecture - The image architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean value that indicates\n \twhether the Amazon EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the block device mapping (for\n example, /dev/sdh or xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.snapshot-id - The ID of the snapshot used for the Amazon EBS\n volume.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-size - The volume size of the Amazon EBS volume, in GiB.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-type - The volume type of the Amazon EBS volume\n (io1 | io2 | gp2 | gp3 | sc1\n | st1 | standard).

    \n
  • \n
  • \n

    \n block-device-mapping.encrypted - A Boolean that indicates whether the Amazon EBS volume is encrypted.

    \n
  • \n
  • \n

    \n creation-date - The time when the image was created, in the ISO 8601\n format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard (*), for\n example, 2021-09-29T*, which matches an entire day.

    \n
  • \n
  • \n

    \n description - The description of the image (provided during image\n creation).

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether enhanced networking\n with ENA is enabled.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type (ovm |\n xen).

    \n
  • \n
  • \n

    \n image-id - The ID of the image.

    \n
  • \n
  • \n

    \n image-type - The image type (machine | kernel |\n ramdisk).

    \n
  • \n
  • \n

    \n is-public - A Boolean that indicates whether the image is public.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n manifest-location - The location of the image manifest.

    \n
  • \n
  • \n

    \n name - The name of the AMI (provided during image creation).

    \n
  • \n
  • \n

    \n owner-alias - The owner alias (amazon | aws-marketplace). \n The valid aliases are defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be \n \tset using the IAM console. We recommend that you use the Owner \n \trequest parameter instead of this filter.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the \n \t\tOwner request parameter instead of this filter.

    \n
  • \n
  • \n

    \n platform - The platform. The only supported value is windows.

    \n
  • \n
  • \n

    \n product-code - The product code.

    \n
  • \n
  • \n

    \n product-code.type - The type of the product code (marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n state - The state of the image (available | pending\n | failed).

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - The message for the state change.

    \n
  • \n
  • \n

    \n sriov-net-support - A value of simple indicates\n that enhanced networking with the Intel 82599 VF interface is enabled.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type (paravirtual |\n hvm).

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n architecture - The image architecture (i386 | x86_64 | \n arm64 | x86_64_mac | arm64_mac).

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean value that indicates\n \twhether the Amazon EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the block device mapping (for\n example, /dev/sdh or xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.snapshot-id - The ID of the snapshot used for the Amazon EBS\n volume.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-size - The volume size of the Amazon EBS volume, in GiB.

    \n
  • \n
  • \n

    \n block-device-mapping.volume-type - The volume type of the Amazon EBS volume\n (io1 | io2 | gp2 | gp3 | sc1\n | st1 | standard).

    \n
  • \n
  • \n

    \n block-device-mapping.encrypted - A Boolean that indicates whether the Amazon EBS volume is encrypted.

    \n
  • \n
  • \n

    \n creation-date - The time when the image was created, in the ISO 8601\n format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard (*), for\n example, 2021-09-29T*, which matches an entire day.

    \n
  • \n
  • \n

    \n description - The description of the image (provided during image\n creation).

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether enhanced networking\n with ENA is enabled.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type (ovm |\n xen).

    \n
  • \n
  • \n

    \n image-id - The ID of the image.

    \n
  • \n
  • \n

    \n image-type - The image type (machine | kernel |\n ramdisk).

    \n
  • \n
  • \n

    \n is-public - A Boolean that indicates whether the image is public.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n manifest-location - The location of the image manifest.

    \n
  • \n
  • \n

    \n name - The name of the AMI (provided during image creation).

    \n
  • \n
  • \n

    \n owner-alias - The owner alias (amazon | aws-marketplace). \n The valid aliases are defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be \n \tset using the IAM console. We recommend that you use the Owner \n \trequest parameter instead of this filter.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the owner. We recommend that you use the \n \t\tOwner request parameter instead of this filter.

    \n
  • \n
  • \n

    \n platform - The platform. The only supported value is windows.

    \n
  • \n
  • \n

    \n product-code - The product code.

    \n
  • \n
  • \n

    \n product-code.type - The type of the product code (marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n source-instance-id - The ID of the instance that the AMI was created from\n if the AMI was created using CreateImage. This filter is applicable only if the AMI was\n created using CreateImage.

    \n
  • \n
  • \n

    \n state - The state of the image (available | pending\n | failed).

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - The message for the state change.

    \n
  • \n
  • \n

    \n sriov-net-support - A value of simple indicates\n that enhanced networking with the Intel 82599 VF interface is enabled.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type (paravirtual |\n hvm).

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -29487,17 +29821,19 @@ "IncludeDeprecated": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether to include deprecated AMIs.

\n

Default: No deprecated AMIs are included in the response.

\n \n

If you are the AMI owner, all deprecated AMIs appear in the response regardless of what\n you specify for this parameter.

\n
" } }, + "IncludeDisabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Specifies whether to include disabled AMIs.

\n

Default: No disabled AMIs are included in the response.

" + } + }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -29505,8 +29841,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -29569,8 +29903,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -29591,8 +29923,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call.

" } }, @@ -29682,8 +30012,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -29704,8 +30032,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining results, make another call\n with the returned NextToken value.

" } }, @@ -29753,7 +30079,23 @@ "target": "com.amazonaws.ec2#InstanceAttribute" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified instance. You can specify only one\n attribute at a time. Valid attribute values are: instanceType |\n kernel | ramdisk | userData |\n disableApiTermination | instanceInitiatedShutdownBehavior\n | rootDeviceName | blockDeviceMapping |\n productCodes | sourceDestCheck | groupSet |\n ebsOptimized | sriovNetSupport\n

" + "smithy.api#documentation": "

Describes the specified attribute of the specified instance. You can specify only one\n attribute at a time. Valid attribute values are: instanceType |\n kernel | ramdisk | userData |\n disableApiTermination | instanceInitiatedShutdownBehavior\n | rootDeviceName | blockDeviceMapping |\n productCodes | sourceDestCheck | groupSet |\n ebsOptimized | sriovNetSupport\n

", + "smithy.api#examples": [ + { + "title": "To describe the instance type", + "documentation": "This example describes the instance type of the specified instance.\n", + "input": { + "InstanceId": "i-1234567890abcdef0", + "Attribute": "instanceType" + }, + "output": { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": { + "Value": "t1.micro" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeInstanceAttributeRequest": { @@ -29773,8 +30115,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -29818,16 +30158,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#InstanceConnectEndpointMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -29901,7 +30237,6 @@ "com.amazonaws.ec2#DescribeInstanceCreditSpecificationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -29914,8 +30249,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -29936,8 +30269,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeInstanceCreditSpecificationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the instance IDs\n parameter in the same call.

" } }, @@ -29994,8 +30325,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -30044,8 +30373,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -30066,8 +30393,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#ResultRange", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value. This value can\n be between 20 and 500. You cannot specify this parameter and the event window IDs parameter\n in the same call.

" } }, @@ -30117,6 +30442,47 @@ }, "traits": { "smithy.api#documentation": "

Describes the status of the specified instances or all of your instances. By default,\n only running instances are described, unless you specifically indicate to return the\n status of all instances.

\n

Instance status includes the following components:

\n
    \n
  • \n

    \n Status checks - Amazon EC2 performs status\n checks on running EC2 instances to identify hardware and software issues. For\n more information, see Status checks for your instances and Troubleshoot\n instances with failed status checks in the Amazon EC2 User\n Guide.

    \n
  • \n
  • \n

    \n Scheduled events - Amazon EC2 can schedule\n events (such as reboot, stop, or terminate) for your instances related to\n hardware issues, software updates, or system maintenance. For more information,\n see Scheduled events for your instances in the Amazon EC2 User\n Guide.

    \n
  • \n
  • \n

    \n Instance state - You can manage your instances\n from the moment you launch them through their termination. For more information,\n see Instance\n lifecycle in the Amazon EC2 User Guide.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To describe the status of an instance", + "documentation": "This example describes the current status of the specified instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "InstanceStatuses": [ + { + "InstanceId": "i-1234567890abcdef0", + "InstanceState": { + "Code": 16, + "Name": "running" + }, + "AvailabilityZone": "us-east-1d", + "SystemStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "reachability" + } + ] + }, + "InstanceStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "reachability" + } + ] + } + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30186,8 +30552,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the instance IDs parameter in the same request.

" } }, @@ -30201,8 +30565,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -30211,8 +30573,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IncludeAllInstances", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

When true, includes the health status for all instances. When\n false, includes the health status for running instances only.

\n

Default: false\n

", "smithy.api#xmlName": "includeAllInstances" } @@ -30270,8 +30630,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request,\n and provides an error response. If you have the required permissions, the error response is\n DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -30353,8 +30711,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request,\n and provides an error response. If you have the required permissions, the error response is\n DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -30368,7 +30724,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters. Filter names and values are case-sensitive.

\n
    \n
  • \n

    \n auto-recovery-supported - Indicates whether Amazon CloudWatch action based recovery is supported (true | false).

    \n
  • \n
  • \n

    \n bare-metal - Indicates whether it is a bare metal instance type (true | false).

    \n
  • \n
  • \n

    \n burstable-performance-supported - Indicates whether it is a burstable\n performance instance type (true | false).

    \n
  • \n
  • \n

    \n current-generation - Indicates whether this instance type is the latest\n generation instance type of an instance family (true | false).

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-bandwidth-in-mbps - The baseline\n bandwidth performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-iops - The baseline input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-throughput-in-mbps - The baseline\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-bandwidth-in-mbps - The maximum bandwidth\n performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-iops - The maximum input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-throughput-in-mbps - The maximum\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-support - Indicates whether the instance type is\n EBS-optimized (supported | unsupported |\n default).

    \n
  • \n
  • \n

    \n ebs-info.encryption-support - Indicates whether EBS encryption is supported\n (supported | unsupported).

    \n
  • \n
  • \n

    \n ebs-info.nvme-support - Indicates whether non-volatile memory express (NVMe)\n is supported for EBS volumes (required | supported | unsupported).

    \n
  • \n
  • \n

    \n free-tier-eligible - Indicates whether the instance type is eligible to use\n in the free tier (true | false).

    \n
  • \n
  • \n

    \n hibernation-supported - Indicates whether On-Demand hibernation is supported (true | false).

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor (nitro | xen).

    \n
  • \n
  • \n

    \n instance-storage-info.disk.count - The number of local disks.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.size-in-gb - The storage size of each instance storage disk, in\n GB.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.type - The storage technology for the local\n instance storage disks (hdd | ssd).

    \n
  • \n
  • \n

    \n instance-storage-info.encryption-support - Indicates whether data is encrypted at rest \n (required | supported | unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.nvme-support - Indicates whether non-volatile memory\n express (NVMe) is supported for instance store (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.total-size-in-gb - The total amount of storage available from all local\n instance storage, in GB.

    \n
  • \n
  • \n

    \n instance-storage-supported - Indicates whether the instance type has local\n instance storage (true | false).

    \n
  • \n
  • \n

    \n instance-type - The instance type (for example c5.2xlarge or\n c5*).

    \n
  • \n
  • \n

    \n memory-info.size-in-mib - The memory size.

    \n
  • \n
  • \n

    \n network-info.efa-info.maximum-efa-interfaces - The maximum number of Elastic \n Fabric Adapters (EFAs) per instance.

    \n
  • \n
  • \n

    \n network-info.efa-supported - Indicates whether the instance type supports\n Elastic Fabric Adapter (EFA) (true | false).

    \n
  • \n
  • \n

    \n network-info.ena-support - Indicates whether Elastic Network Adapter (ENA) is\n supported or required (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n network-info.encryption-in-transit-supported - Indicates whether the instance type \n automatically encrypts in-transit traffic between instances (true | false).

    \n
  • \n
  • \n

    \n network-info.ipv4-addresses-per-interface - The maximum number of private IPv4 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-addresses-per-interface - The maximum number of private IPv6 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-supported - Indicates whether the instance type supports IPv6 (true | false).

    \n
  • \n
  • \n

    \n network-info.maximum-network-cards - The maximum number of network cards per\n instance.

    \n
  • \n
  • \n

    \n network-info.maximum-network-interfaces - The maximum number of network interfaces per instance.

    \n
  • \n
  • \n

    \n network-info.network-performance - The network performance (for example, \"25\n Gigabit\").

    \n
  • \n
  • \n

    \n processor-info.supported-architecture - The CPU architecture\n (arm64 | i386 | x86_64).

    \n
  • \n
  • \n

    \n processor-info.sustained-clock-speed-in-ghz - The CPU clock speed, in GHz.

    \n
  • \n
  • \n

    \n supported-boot-mode - The boot mode (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n supported-root-device-type - The root device type (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n supported-usage-class - The usage class (on-demand |\n spot).

    \n
  • \n
  • \n

    \n supported-virtualization-type - The virtualization type (hvm |\n paravirtual).

    \n
  • \n
  • \n

    \n vcpu-info.default-cores - The default number of cores for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.default-threads-per-core - The default number of threads per core for the instance\n type.

    \n
  • \n
  • \n

    \n vcpu-info.default-vcpus - The default number of vCPUs for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-cores - The number of cores that can be configured for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-threads-per-core - The number of threads per core that can be configured for the instance type.\n For example, \"1\" or \"1,2\".

    \n
  • \n
", + "smithy.api#documentation": "

One or more filters. Filter names and values are case-sensitive.

\n
    \n
  • \n

    \n auto-recovery-supported - Indicates whether Amazon CloudWatch action based recovery is supported (true | false).

    \n
  • \n
  • \n

    \n bare-metal - Indicates whether it is a bare metal instance type (true | false).

    \n
  • \n
  • \n

    \n burstable-performance-supported - Indicates whether the instance type is a \n burstable performance T instance type (true | false).

    \n
  • \n
  • \n

    \n current-generation - Indicates whether this instance type is the latest\n generation instance type of an instance family (true | false).

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-bandwidth-in-mbps - The baseline\n bandwidth performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-iops - The baseline input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.baseline-throughput-in-mbps - The baseline\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-bandwidth-in-mbps - The maximum bandwidth\n performance for an EBS-optimized instance type, in Mbps.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-iops - The maximum input/output storage\n operations per second for an EBS-optimized instance type.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-info.maximum-throughput-in-mbps - The maximum\n throughput performance for an EBS-optimized instance type, in MB/s.

    \n
  • \n
  • \n

    \n ebs-info.ebs-optimized-support - Indicates whether the instance type is\n EBS-optimized (supported | unsupported |\n default).

    \n
  • \n
  • \n

    \n ebs-info.encryption-support - Indicates whether EBS encryption is supported\n (supported | unsupported).

    \n
  • \n
  • \n

    \n ebs-info.nvme-support - Indicates whether non-volatile memory express (NVMe)\n is supported for EBS volumes (required | supported | unsupported).

    \n
  • \n
  • \n

    \n free-tier-eligible - Indicates whether the instance type is eligible to use\n in the free tier (true | false).

    \n
  • \n
  • \n

    \n hibernation-supported - Indicates whether On-Demand hibernation is supported (true | false).

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor (nitro | xen).

    \n
  • \n
  • \n

    \n instance-storage-info.disk.count - The number of local disks.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.size-in-gb - The storage size of each instance storage disk, in\n GB.

    \n
  • \n
  • \n

    \n instance-storage-info.disk.type - The storage technology for the local\n instance storage disks (hdd | ssd).

    \n
  • \n
  • \n

    \n instance-storage-info.encryption-support - Indicates whether data is encrypted at rest \n (required | supported | unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.nvme-support - Indicates whether non-volatile memory\n express (NVMe) is supported for instance store (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n instance-storage-info.total-size-in-gb - The total amount of storage available from all local\n instance storage, in GB.

    \n
  • \n
  • \n

    \n instance-storage-supported - Indicates whether the instance type has local\n instance storage (true | false).

    \n
  • \n
  • \n

    \n instance-type - The instance type (for example c5.2xlarge or\n c5*).

    \n
  • \n
  • \n

    \n memory-info.size-in-mib - The memory size.

    \n
  • \n
  • \n

    \n network-info.efa-info.maximum-efa-interfaces - The maximum number of Elastic \n Fabric Adapters (EFAs) per instance.

    \n
  • \n
  • \n

    \n network-info.efa-supported - Indicates whether the instance type supports\n Elastic Fabric Adapter (EFA) (true | false).

    \n
  • \n
  • \n

    \n network-info.ena-support - Indicates whether Elastic Network Adapter (ENA) is\n supported or required (required | supported |\n unsupported).

    \n
  • \n
  • \n

    \n network-info.encryption-in-transit-supported - Indicates whether the instance type \n automatically encrypts in-transit traffic between instances (true | false).

    \n
  • \n
  • \n

    \n network-info.ipv4-addresses-per-interface - The maximum number of private IPv4 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-addresses-per-interface - The maximum number of private IPv6 addresses per\n network interface.

    \n
  • \n
  • \n

    \n network-info.ipv6-supported - Indicates whether the instance type supports IPv6 (true | false).

    \n
  • \n
  • \n

    \n network-info.maximum-network-cards - The maximum number of network cards per\n instance.

    \n
  • \n
  • \n

    \n network-info.maximum-network-interfaces - The maximum number of network interfaces per instance.

    \n
  • \n
  • \n

    \n network-info.network-performance - The network performance (for example, \"25\n Gigabit\").

    \n
  • \n
  • \n

    \n nitro-enclaves-support - Indicates whether Nitro Enclaves is supported (supported |\n unsupported).

    \n
  • \n
  • \n

    \n nitro-tpm-support - Indicates whether NitroTPM is supported (supported |\n unsupported).

    \n
  • \n
  • \n

    \n nitro-tpm-info.supported-versions - The supported NitroTPM version (2.0).

    \n
  • \n
  • \n

    \n processor-info.supported-architecture - The CPU architecture\n (arm64 | i386 | x86_64).

    \n
  • \n
  • \n

    \n processor-info.sustained-clock-speed-in-ghz - The CPU clock speed, in GHz.

    \n
  • \n
  • \n

    \n processor-info.supported-features - The supported CPU features (amd-sev-snp).

    \n
  • \n
  • \n

    \n supported-boot-mode - The boot mode (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n supported-root-device-type - The root device type (ebs |\n instance-store).

    \n
  • \n
  • \n

    \n supported-usage-class - The usage class (on-demand |\n spot).

    \n
  • \n
  • \n

    \n supported-virtualization-type - The virtualization type (hvm |\n paravirtual).

    \n
  • \n
  • \n

    \n vcpu-info.default-cores - The default number of cores for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.default-threads-per-core - The default number of threads per core for the instance\n type.

    \n
  • \n
  • \n

    \n vcpu-info.default-vcpus - The default number of vCPUs for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-cores - The number of cores that can be configured for the instance type.

    \n
  • \n
  • \n

    \n vcpu-info.valid-threads-per-core - The number of threads per core that can be configured for the instance type.\n For example, \"1\" or \"1,2\".

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30423,6 +30779,18 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified instances or all instances.

\n

If you specify instance IDs, the output includes information for only the specified\n instances. If you specify filters, the output includes information for only those\n instances that meet the filter criteria. If you do not specify instance IDs or filters,\n the output includes information for all instances, which can affect performance. We\n recommend that you use pagination to ensure that the operation returns quickly and\n successfully.

\n

If you specify an instance ID that is not valid, an error is returned. If you specify\n an instance that you do not own, it is not included in the output.

\n

Recently terminated instances might appear in the returned results. This interval is\n usually less than one hour.

\n

If you describe instances in the rare case where an Availability Zone is experiencing\n a service disruption and you specify instance IDs that are in the affected zone, or do\n not specify any instance IDs at all, the call fails. If you describe instances and\n specify only instance IDs that are in an unaffected zone, the call works\n normally.

", + "smithy.api#examples": [ + { + "title": "To describe an Amazon EC2 instance", + "documentation": "This example describes the specified instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": {} + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30584,7 +30952,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n affinity - The affinity setting for an instance running on a\n Dedicated Host (default | host).

    \n
  • \n
  • \n

    \n architecture - The instance architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the instance.

    \n
  • \n
  • \n

    \n block-device-mapping.attach-time - The attach time for an EBS\n volume mapped to the instance, for example,\n 2010-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean that\n indicates whether the EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in the\n block device mapping (for example, /dev/sdh or\n xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.status - The status for the EBS volume\n (attaching | attached | detaching |\n detached).

    \n
  • \n
  • \n

    \n block-device-mapping.volume-id - The volume ID of the EBS\n volume.

    \n
  • \n
  • \n

    \n capacity-reservation-id - The ID of the Capacity Reservation into which the\n instance was launched.

    \n
  • \n
  • \n

    \n client-token - The idempotency token you provided when you launched\n the instance.

    \n
  • \n
  • \n

    \n dns-name - The public DNS name of the instance.

    \n
  • \n
  • \n

    \n hibernation-options.configured - A Boolean that indicates whether\n the instance is enabled for hibernation. A value of true means that\n the instance is enabled for hibernation.

    \n
  • \n
  • \n

    \n host-id - The ID of the Dedicated Host on which the instance is\n running, if applicable.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type of the instance\n (ovm | xen). The value xen is used\n for both Xen and Nitro hypervisors.

    \n
  • \n
  • \n

    \n iam-instance-profile.arn - The instance profile associated with\n the instance. Specified as an ARN.

    \n
  • \n
  • \n

    \n image-id - The ID of the image used to launch the\n instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n instance-lifecycle - Indicates whether this is a Spot Instance or\n a Scheduled Instance (spot | scheduled).

    \n
  • \n
  • \n

    \n instance-state-code - The state of the instance, as a 16-bit\n unsigned integer. The high byte is used for internal purposes and should be\n ignored. The low byte is set based on the state represented. The valid values\n are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\n (stopping), and 80 (stopped).

    \n
  • \n
  • \n

    \n instance-state-name - The state of the instance\n (pending | running | shutting-down |\n terminated | stopping |\n stopped).

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n t2.micro).

    \n
  • \n
  • \n

    \n instance.group-id - The ID of the security group for the\n instance.

    \n
  • \n
  • \n

    \n instance.group-name - The name of the security group for the\n instance.

    \n
  • \n
  • \n

    \n ip-address - The public IPv4 address of the instance.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n key-name - The name of the key pair used when the instance was\n launched.

    \n
  • \n
  • \n

    \n launch-index - When launching multiple instances, this is the\n index for the instance in the launch group (for example, 0, 1, 2, and so on).\n

    \n
  • \n
  • \n

    \n launch-time - The time when the instance was launched, in the ISO\n 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard\n (*), for example, 2021-09-29T*, which matches an\n entire day.

    \n
  • \n
  • \n

    \n metadata-options.http-tokens - The metadata request authorization\n state (optional | required)

    \n
  • \n
  • \n

    \n metadata-options.http-put-response-hop-limit - The HTTP metadata\n request put response hop limit (integer, possible values 1 to\n 64)

    \n
  • \n
  • \n

    \n metadata-options.http-endpoint - The status of access to the HTTP\n metadata endpoint on your instance (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.instance-metadata-tags - The status of access to\n instance tags from the instance metadata (enabled |\n disabled)

    \n
  • \n
  • \n

    \n monitoring-state - Indicates whether detailed monitoring is\n enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n network-interface.addresses.private-ip-address - The private IPv4\n address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.primary - Specifies whether the IPv4\n address of the network interface is the primary private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-ip - The ID of the\n association of an Elastic IP address (IPv4) with a network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.ip-owner-id - The owner\n ID of the private IPv4 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.public-ip - The address of the\n Elastic IP address (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.ip-owner-id - The owner of the\n Elastic IP address (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.allocation-id - The allocation ID\n returned when you allocated the Elastic IP address (IPv4) for your network\n interface.

    \n
  • \n
  • \n

    \n network-interface.association.association-id - The association ID\n returned when the network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.attachment.attachment-id - The ID of the\n interface attachment.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-id - The ID of the instance\n to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-owner-id - The owner ID of\n the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.device-index - The device index to\n which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.status - The status of the\n attachment (attaching | attached |\n detaching | detached).

    \n
  • \n
  • \n

    \n network-interface.attachment.attach-time - The time that the\n network interface was attached to an instance.

    \n
  • \n
  • \n

    \n network-interface.attachment.delete-on-termination - Specifies\n whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n network-interface.availability-zone - The Availability Zone for\n the network interface.

    \n
  • \n
  • \n

    \n network-interface.description - The description of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.group-id - The ID of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.group-name - The name of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.ipv6-address - The IPv6 address\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.mac-address - The MAC address of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.network-interface-id - The ID of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.owner-id - The ID of the owner of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.private-dns-name - The private DNS name of the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.requester-id - The requester ID for the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.requester-managed - Indicates whether the\n network interface is being managed by Amazon Web Services.

    \n
  • \n
  • \n

    \n network-interface.status - The status of the network interface\n (available) | in-use).

    \n
  • \n
  • \n

    \n network-interface.source-dest-check - Whether the network\n interface performs source/destination checking. A value of true\n means that checking is enabled, and false means that checking is\n disabled. The value must be false for the network interface to\n perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n network-interface.subnet-id - The ID of the subnet for the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.vpc-id - The ID of the VPC for the network\n interface.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the\n Outpost.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the instance\n owner.

    \n
  • \n
  • \n

    \n placement-group-name - The name of the placement group for the\n instance.

    \n
  • \n
  • \n

    \n placement-partition-number - The partition in which the instance is\n located.

    \n
  • \n
  • \n

    \n platform - The platform. To list only Windows instances, use\n windows.

    \n
  • \n
  • \n

    \n private-dns-name - The private IPv4 DNS name of the\n instance.

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address of the\n instance.

    \n
  • \n
  • \n

    \n product-code - The product code associated with the AMI used to\n launch the instance.

    \n
  • \n
  • \n

    \n product-code.type - The type of product code (devpay |\n marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n reason - The reason for the current state of the instance (for\n example, shows \"User Initiated [date]\" when you stop or terminate the instance).\n Similar to the state-reason-code filter.

    \n
  • \n
  • \n

    \n requester-id - The ID of the entity that launched the instance on\n your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\n on).

    \n
  • \n
  • \n

    \n reservation-id - The ID of the instance's reservation. A\n reservation ID is created any time you launch an instance. A reservation ID has\n a one-to-one relationship with an instance launch request, but can be associated\n with more than one instance if you launch multiple instances using the same\n launch request. For example, if you launch one instance, you get one reservation\n ID. If you launch ten instances using the same launch request, you also get one\n reservation ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for\n example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume\n (ebs | instance-store).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the instance performs\n source/destination checking. A value of true means that checking is\n enabled, and false means that checking is disabled. The value must\n be false for the instance to perform network address translation\n (NAT) in your VPC.

    \n
  • \n
  • \n

    \n spot-instance-request-id - The ID of the Spot Instance\n request.

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - A message that describes the state\n change.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n tenancy - The tenancy of an instance (dedicated |\n default | host).

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type of the instance\n (paravirtual | hvm).

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC that the instance is running in.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n affinity - The affinity setting for an instance running on a\n Dedicated Host (default | host).

    \n
  • \n
  • \n

    \n architecture - The instance architecture (i386 |\n x86_64 | arm64).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the instance.

    \n
  • \n
  • \n

    \n block-device-mapping.attach-time - The attach time for an EBS\n volume mapped to the instance, for example,\n 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n block-device-mapping.delete-on-termination - A Boolean that\n indicates whether the EBS volume is deleted on instance termination.

    \n
  • \n
  • \n

    \n block-device-mapping.device-name - The device name specified in\n the block device mapping (for example, /dev/sdh or\n xvdh).

    \n
  • \n
  • \n

    \n block-device-mapping.status - The status for the EBS volume\n (attaching | attached | detaching |\n detached).

    \n
  • \n
  • \n

    \n block-device-mapping.volume-id - The volume ID of the EBS\n volume.

    \n
  • \n
  • \n

    \n boot-mode - The boot mode that was specified by the AMI\n (legacy-bios | uefi |\n uefi-preferred).

    \n
  • \n
  • \n

    \n capacity-reservation-id - The ID of the Capacity Reservation into which the\n instance was launched.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-preference\n - The instance's Capacity Reservation preference (open | none).

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-id\n - The ID of the targeted Capacity Reservation.

    \n
  • \n
  • \n

    \n capacity-reservation-specification.capacity-reservation-target.capacity-reservation-resource-group-arn\n - The ARN of the targeted Capacity Reservation group.

    \n
  • \n
  • \n

    \n client-token - The idempotency token you provided when you\n launched the instance.

    \n
  • \n
  • \n

    \n current-instance-boot-mode - The boot mode that is used to launch\n the instance at launch or start (legacy-bios |\n uefi).

    \n
  • \n
  • \n

    \n dns-name - The public DNS name of the instance.

    \n
  • \n
  • \n

    \n ebs-optimized - A Boolean that indicates whether the instance is\n optimized for Amazon EBS I/O.

    \n
  • \n
  • \n

    \n ena-support - A Boolean that indicates whether the instance is\n enabled for enhanced networking with ENA.

    \n
  • \n
  • \n

    \n enclave-options.enabled - A Boolean that indicates whether the\n instance is enabled for Amazon Web Services Nitro Enclaves.

    \n
  • \n
  • \n

    \n hibernation-options.configured - A Boolean that indicates whether\n the instance is enabled for hibernation. A value of true means that\n the instance is enabled for hibernation.

    \n
  • \n
  • \n

    \n host-id - The ID of the Dedicated Host on which the instance is\n running, if applicable.

    \n
  • \n
  • \n

    \n hypervisor - The hypervisor type of the instance\n (ovm | xen). The value xen is used\n for both Xen and Nitro hypervisors.

    \n
  • \n
  • \n

    \n iam-instance-profile.arn - The instance profile associated with\n the instance. Specified as an ARN.

    \n
  • \n
  • \n

    \n iam-instance-profile.id - The instance profile associated with\n the instance. Specified as an ID.

    \n
  • \n
  • \n

    \n iam-instance-profile.name - The instance profile associated with\n the instance. Specified as an name.

    \n
  • \n
  • \n

    \n image-id - The ID of the image used to launch the\n instance.

    \n
  • \n
  • \n

    \n instance-id - The ID of the instance.

    \n
  • \n
  • \n

    \n instance-lifecycle - Indicates whether this is a Spot Instance or\n a Scheduled Instance (spot | scheduled).

    \n
  • \n
  • \n

    \n instance-state-code - The state of the instance, as a 16-bit\n unsigned integer. The high byte is used for internal purposes and should be\n ignored. The low byte is set based on the state represented. The valid values\n are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\n (stopping), and 80 (stopped).

    \n
  • \n
  • \n

    \n instance-state-name - The state of the instance\n (pending | running | shutting-down |\n terminated | stopping |\n stopped).

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n t2.micro).

    \n
  • \n
  • \n

    \n instance.group-id - The ID of the security group for the\n instance.

    \n
  • \n
  • \n

    \n instance.group-name - The name of the security group for the\n instance.

    \n
  • \n
  • \n

    \n ip-address - The public IPv4 address of the instance.

    \n
  • \n
  • \n

    \n ipv6-address - The IPv6 address of the instance.

    \n
  • \n
  • \n

    \n kernel-id - The kernel ID.

    \n
  • \n
  • \n

    \n key-name - The name of the key pair used when the instance was\n launched.

    \n
  • \n
  • \n

    \n launch-index - When launching multiple instances, this is the\n index for the instance in the launch group (for example, 0, 1, 2, and so on).\n

    \n
  • \n
  • \n

    \n launch-time - The time when the instance was launched, in the ISO\n 8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\n 2021-09-29T11:04:43.305Z. You can use a wildcard\n (*), for example, 2021-09-29T*, which matches an\n entire day.

    \n
  • \n
  • \n

    \n maintenance-options.auto-recovery - The current automatic\n recovery behavior of the instance (disabled | default).

    \n
  • \n
  • \n

    \n metadata-options.http-endpoint - The status of access to the HTTP\n metadata endpoint on your instance (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv4 - Indicates whether the IPv4\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-protocol-ipv6 - Indicates whether the IPv6\n endpoint is enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n metadata-options.http-put-response-hop-limit - The HTTP metadata\n request put response hop limit (integer, possible values 1 to\n 64)

    \n
  • \n
  • \n

    \n metadata-options.http-tokens - The metadata request authorization\n state (optional | required)

    \n
  • \n
  • \n

    \n metadata-options.instance-metadata-tags - The status of access to\n instance tags from the instance metadata (enabled |\n disabled)

    \n
  • \n
  • \n

    \n metadata-options.state - The state of the metadata option changes\n (pending | applied).

    \n
  • \n
  • \n

    \n monitoring-state - Indicates whether detailed monitoring is\n enabled (disabled | enabled).

    \n
  • \n
  • \n

    \n network-interface.addresses.association.allocation-id - The allocation ID.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.association-id - The association ID.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.carrier-ip - The carrier IP address.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.customer-owned-ip - The customer-owned IP address.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.ip-owner-id - The owner\n ID of the private IPv4 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-dns-name - The public DNS name.

    \n
  • \n
  • \n

    \n network-interface.addresses.association.public-ip - The ID of the\n association of an Elastic IP address (IPv4) with a network interface.

    \n
  • \n
  • \n

    \n network-interface.addresses.primary - Specifies whether the IPv4\n address of the network interface is the primary private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.addresses.private-dns-name - The private DNS name.

    \n
  • \n
  • \n

    \n network-interface.addresses.private-ip-address - The private IPv4\n address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.allocation-id - The allocation ID\n returned when you allocated the Elastic IP address (IPv4) for your network\n interface.

    \n
  • \n
  • \n

    \n network-interface.association.association-id - The association ID\n returned when the network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.association.carrier-ip - The customer-owned IP address.

    \n
  • \n
  • \n

    \n network-interface.association.customer-owned-ip - The customer-owned IP address.

    \n
  • \n
  • \n

    \n network-interface.association.ip-owner-id - The owner of the\n Elastic IP address (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.association.public-dns-name - The public DNS name.

    \n
  • \n
  • \n

    \n network-interface.association.public-ip - The address of the\n Elastic IP address (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n network-interface.attachment.attach-time - The time that the\n network interface was attached to an instance.

    \n
  • \n
  • \n

    \n network-interface.attachment.attachment-id - The ID of the\n interface attachment.

    \n
  • \n
  • \n

    \n network-interface.attachment.delete-on-termination - Specifies\n whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n network-interface.attachment.device-index - The device index to\n which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-id - The ID of the instance\n to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.instance-owner-id - The owner ID of\n the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n network-interface.attachment.network-card-index - The index of the network card.

    \n
  • \n
  • \n

    \n network-interface.attachment.status - The status of the\n attachment (attaching | attached |\n detaching | detached).

    \n
  • \n
  • \n

    \n network-interface.availability-zone - The Availability Zone for\n the network interface.

    \n
  • \n
  • \n

    \n network-interface.deny-all-igw-traffic - A Boolean that indicates whether \n a network interface with an IPv6 address is unreachable from the public internet.

    \n
  • \n
  • \n

    \n network-interface.description - The description of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.group-id - The ID of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.group-name - The name of a security group\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv4-prefixes.ipv4-prefix - The IPv4 prefixes that are assigned to the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-address - The IPv6 address associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.ipv6-address - The IPv6 address\n associated with the network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-addresses.is-primary-ipv6 - A Boolean that indicates whether this\n is the primary IPv6 address.

    \n
  • \n
  • \n

    \n network-interface.ipv6-native - A Boolean that indicates whether this is\n an IPv6 only network interface.

    \n
  • \n
  • \n

    \n network-interface.ipv6-prefixes.ipv6-prefix - The IPv6 prefix assigned to the network interface.

    \n
  • \n
  • \n

    \n network-interface.mac-address - The MAC address of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.network-interface-id - The ID of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.outpost-arn - The ARN of the Outpost.

    \n
  • \n
  • \n

    \n network-interface.owner-id - The ID of the owner of the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.private-dns-name - The private DNS name of the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.private-ip-address - The private IPv4 address.

    \n
  • \n
  • \n

    \n network-interface.public-dns-name - The public DNS name.

    \n
  • \n
  • \n

    \n network-interface.requester-id - The requester ID for the network\n interface.

    \n
  • \n
  • \n

    \n network-interface.requester-managed - Indicates whether the\n network interface is being managed by Amazon Web Services.

    \n
  • \n
  • \n

    \n network-interface.status - The status of the network interface\n (available) | in-use).

    \n
  • \n
  • \n

    \n network-interface.source-dest-check - Whether the network\n interface performs source/destination checking. A value of true\n means that checking is enabled, and false means that checking is\n disabled. The value must be false for the network interface to\n perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n network-interface.subnet-id - The ID of the subnet for the\n network interface.

    \n
  • \n
  • \n

    \n network-interface.tag-key - The key of a tag assigned to the network interface.

    \n
  • \n
  • \n

    \n network-interface.tag-value - The value of a tag assigned to the network interface.

    \n
  • \n
  • \n

    \n network-interface.vpc-id - The ID of the VPC for the network\n interface.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the\n Outpost.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the instance\n owner.

    \n
  • \n
  • \n

    \n placement-group-name - The name of the placement group for the\n instance.

    \n
  • \n
  • \n

    \n placement-partition-number - The partition in which the instance is\n located.

    \n
  • \n
  • \n

    \n platform - The platform. To list only Windows instances, use\n windows.

    \n
  • \n
  • \n

    \n platform-details - The platform (Linux/UNIX |\n Red Hat BYOL Linux | Red Hat Enterprise Linux |\n Red Hat Enterprise Linux with HA | Red Hat Enterprise\n Linux with SQL Server Standard and HA | Red Hat Enterprise\n Linux with SQL Server Enterprise and HA | Red Hat Enterprise\n Linux with SQL Server Standard | Red Hat Enterprise Linux with\n SQL Server Web | Red Hat Enterprise Linux with SQL Server\n Enterprise | SQL Server Enterprise | SQL Server\n Standard | SQL Server Web | SUSE Linux |\n Ubuntu Pro | Windows | Windows BYOL |\n Windows with SQL Server Enterprise | Windows with SQL\n Server Standard | Windows with SQL Server Web).

    \n
  • \n
  • \n

    \n private-dns-name - The private IPv4 DNS name of the\n instance.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-a-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS A records.

    \n
  • \n
  • \n

    \n private-dns-name-options.enable-resource-name-dns-aaaa-record - A\n Boolean that indicates whether to respond to DNS queries for instance hostnames\n with DNS AAAA records.

    \n
  • \n
  • \n

    \n private-dns-name-options.hostname-type - The type of hostname\n (ip-name | resource-name).

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address of the\n instance.

    \n
  • \n
  • \n

    \n product-code - The product code associated with the AMI used to\n launch the instance.

    \n
  • \n
  • \n

    \n product-code.type - The type of product code (devpay\n | marketplace).

    \n
  • \n
  • \n

    \n ramdisk-id - The RAM disk ID.

    \n
  • \n
  • \n

    \n reason - The reason for the current state of the instance (for\n example, shows \"User Initiated [date]\" when you stop or terminate the instance).\n Similar to the state-reason-code filter.

    \n
  • \n
  • \n

    \n requester-id - The ID of the entity that launched the instance on\n your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\n on).

    \n
  • \n
  • \n

    \n reservation-id - The ID of the instance's reservation. A\n reservation ID is created any time you launch an instance. A reservation ID has\n a one-to-one relationship with an instance launch request, but can be associated\n with more than one instance if you launch multiple instances using the same\n launch request. For example, if you launch one instance, you get one reservation\n ID. If you launch ten instances using the same launch request, you also get one\n reservation ID.

    \n
  • \n
  • \n

    \n root-device-name - The device name of the root device volume (for\n example, /dev/sda1).

    \n
  • \n
  • \n

    \n root-device-type - The type of the root device volume\n (ebs | instance-store).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the instance performs\n source/destination checking. A value of true means that checking is\n enabled, and false means that checking is disabled. The value must\n be false for the instance to perform network address translation\n (NAT) in your VPC.

    \n
  • \n
  • \n

    \n spot-instance-request-id - The ID of the Spot Instance\n request.

    \n
  • \n
  • \n

    \n state-reason-code - The reason code for the state change.

    \n
  • \n
  • \n

    \n state-reason-message - A message that describes the state\n change.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the instance.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n tenancy - The tenancy of an instance (dedicated |\n default | host).

    \n
  • \n
  • \n

    \n tpm-support - Indicates if the instance is configured for\n NitroTPM support (v2.0).

    \n
  • \n
  • \n

    \n usage-operation - The usage operation value for the instance\n (RunInstances | RunInstances:00g0 |\n RunInstances:0010 | RunInstances:1010 |\n RunInstances:1014 | RunInstances:1110 |\n RunInstances:0014 | RunInstances:0210 |\n RunInstances:0110 | RunInstances:0100 |\n RunInstances:0004 | RunInstances:0200 |\n RunInstances:000g | RunInstances:0g00 |\n RunInstances:0002 | RunInstances:0800 |\n RunInstances:0102 | RunInstances:0006 |\n RunInstances:0202).

    \n
  • \n
  • \n

    \n usage-operation-update-time - The time that the usage operation\n was last updated, for example, 2022-09-15T17:15:20.000Z.

    \n
  • \n
  • \n

    \n virtualization-type - The virtualization type of the instance\n (paravirtual | hvm).

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC that the instance is running in.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30599,8 +30967,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -30609,8 +30975,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the instance IDs parameter in the same request.

", "smithy.api#xmlName": "maxResults" } @@ -30662,6 +31026,36 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your internet gateways.

", + "smithy.api#examples": [ + { + "title": "To describe the Internet gateway for a VPC", + "documentation": "This example describes the Internet gateway for the specified VPC.", + "input": { + "Filters": [ + { + "Name": "attachment.vpc-id", + "Values": [ + "vpc-a01106c2" + ] + } + ] + }, + "output": { + "InternetGateways": [ + { + "Tags": [], + "InternetGatewayId": "igw-c0a643a9", + "Attachments": [ + { + "State": "attached", + "VpcId": "vpc-a01106c2" + } + ] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -30699,7 +31093,6 @@ "com.amazonaws.ec2#DescribeInternetGatewaysMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -30712,7 +31105,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n attachment.state - The current state of the attachment between the gateway\n and the VPC (available). Present only if a VPC is attached.

    \n
  • \n
  • \n

    \n attachment.vpc-id - The ID of an attached VPC.

    \n
  • \n
  • \n

    \n internet-gateway-id - The ID of the Internet gateway.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the internet gateway.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n attachment.state - The current state of the attachment between the gateway\n and the VPC (available). Present only if a VPC is attached.

    \n
  • \n
  • \n

    \n attachment.vpc-id - The ID of an attached VPC.

    \n
  • \n
  • \n

    \n internet-gateway-id - The ID of the Internet gateway.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the internet gateway.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -30720,8 +31113,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -30730,7 +31121,7 @@ "target": "com.amazonaws.ec2#InternetGatewayIdList", "traits": { "aws.protocols#ec2QueryName": "InternetGatewayId", - "smithy.api#documentation": "

One or more internet gateway IDs.

\n

Default: Describes all your internet gateways.

", + "smithy.api#documentation": "

The IDs of the internet gateways.

\n

Default: Describes all your internet gateways.

", "smithy.api#xmlName": "internetGatewayId" } }, @@ -30743,8 +31134,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeInternetGatewaysMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -30801,8 +31190,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -30816,8 +31203,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -30887,8 +31272,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -30908,8 +31291,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of resource discoveries to return in one page of results.

" } }, @@ -30973,8 +31354,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -30994,8 +31373,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of resource discovery associations to return in one page of results.

" } }, @@ -31059,8 +31436,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -31074,8 +31449,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -31145,8 +31518,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -31160,8 +31531,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -31244,16 +31613,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#Ipv6PoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -31303,6 +31668,25 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified key pairs or all of your key pairs.

\n

For more information about key pairs, see Amazon EC2 key pairs \n\t\t\t\tin the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To display a key pair", + "documentation": "This example displays the fingerprint for the specified key.", + "input": { + "KeyNames": [ + "my-key-pair" + ] + }, + "output": { + "KeyPairs": [ + { + "KeyName": "my-key-pair", + "KeyFingerprint": "1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f" + } + ] + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -31359,8 +31743,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -31368,8 +31750,6 @@ "IncludePublicKey": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, the public key material is included in the response.

\n

Default: false\n

" } } @@ -31404,6 +31784,66 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more versions of a specified launch template. You can describe all\n versions, individual versions, or a range of versions. You can also describe all the\n latest versions or all the default versions of all the launch templates in your\n account.

", + "smithy.api#examples": [ + { + "title": "To describe the versions for a launch template", + "documentation": "This example describes the versions for the specified launch template.", + "input": { + "LaunchTemplateId": "068f72b72934aff71" + }, + "output": { + "LaunchTemplateVersions": [ + { + "LaunchTemplateId": "lt-068f72b72934aff71", + "LaunchTemplateName": "Webservers", + "VersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789102:root", + "LaunchTemplateData": { + "KeyName": "kp-us-east", + "ImageId": "ami-6057e21a", + "InstanceType": "t2.medium", + "NetworkInterfaces": [ + { + "SubnetId": "subnet-1a2b3c4d", + "DeviceIndex": 0, + "Groups": [ + "sg-7c227019" + ] + } + ] + }, + "DefaultVersion": false, + "CreateTime": "2017-11-20T13:12:32.000Z" + }, + { + "LaunchTemplateId": "lt-068f72b72934aff71", + "LaunchTemplateName": "Webservers", + "VersionNumber": 1, + "CreatedBy": "arn:aws:iam::123456789102:root", + "LaunchTemplateData": { + "UserData": "", + "KeyName": "kp-us-east", + "ImageId": "ami-aabbcc11", + "InstanceType": "t2.medium", + "NetworkInterfaces": [ + { + "SubnetId": "subnet-7b16de0c", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "Groups": [ + "sg-7c227019" + ], + "AssociatePublicIpAddress": true + } + ] + }, + "DefaultVersion": true, + "CreateTime": "2017-11-20T12:52:33.000Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -31418,8 +31858,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -31463,8 +31901,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value. This value\n can be between 1 and 200.

" } }, @@ -31478,8 +31914,6 @@ "ResolveAlias": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, and if a Systems Manager parameter is specified for ImageId,\n the AMI ID is displayed in the response for imageId.

\n

If false, and if a Systems Manager parameter is specified for ImageId,\n the parameter is displayed in the response for imageId.

\n

For more information, see Use a Systems \n Manager parameter instead of an AMI ID in the Amazon Elastic Compute Cloud User Guide.

\n

Default: false\n

" } } @@ -31522,6 +31956,29 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more launch templates.

", + "smithy.api#examples": [ + { + "title": "To describe a launch template", + "documentation": "This example describes the specified launch template.", + "input": { + "LaunchTemplateIds": [ + "lt-01238c059e3466abc" + ] + }, + "output": { + "LaunchTemplates": [ + { + "LatestVersionNumber": 1, + "LaunchTemplateName": "my-template", + "LaunchTemplateId": "lt-01238c059e3466abc", + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2018-01-16T04:32:57.000Z", + "DefaultVersionNumber": 1 + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -31533,7 +31990,6 @@ "com.amazonaws.ec2#DescribeLaunchTemplatesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 200 @@ -31546,8 +32002,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -31581,8 +32035,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeLaunchTemplatesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value. This value\n can be between 1 and 200.

" } } @@ -31653,8 +32105,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -31667,8 +32117,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -31739,8 +32187,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -31753,8 +32199,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -31825,8 +32269,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -31839,8 +32281,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -31911,8 +32351,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -31925,8 +32363,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -31997,8 +32433,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -32011,8 +32445,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -32083,8 +32515,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#LocalGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -32097,8 +32527,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -32155,8 +32583,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32170,8 +32596,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#PrefixListMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -32227,6 +32651,20 @@ }, "traits": { "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes your Elastic IP addresses that are being moved from or being restored to the EC2-Classic platform. \n This request does not return information about any other Elastic IP addresses in your account.

", + "smithy.api#examples": [ + { + "title": "To describe your moving addresses", + "documentation": "This example describes all of your moving Elastic IP addresses.", + "output": { + "MovingAddressStatuses": [ + { + "PublicIp": "198.51.100.0", + "MoveStatus": "movingToVpc" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32238,7 +32676,6 @@ "com.amazonaws.ec2#DescribeMovingAddressesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -32260,8 +32697,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -32270,8 +32705,6 @@ "target": "com.amazonaws.ec2#DescribeMovingAddressesMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n results of the initial request can be seen by sending another request with the returned\n NextToken value. This value can be between 5 and 1000; if\n MaxResults is given a value outside of this range, an error is returned.

\n

Default: If no value is provided, the default is 1000.

", "smithy.api#xmlName": "maxResults" } @@ -32331,6 +32764,41 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your NAT gateways.

", + "smithy.api#examples": [ + { + "title": "To describe a NAT gateway", + "documentation": "This example describes the NAT gateway for the specified VPC.", + "input": { + "Filter": [ + { + "Name": "vpc-id", + "Values": [ + "vpc-1a2b3c4d" + ] + } + ] + }, + "output": { + "NatGateways": [ + { + "NatGatewayAddresses": [ + { + "PublicIp": "198.11.222.333", + "NetworkInterfaceId": "eni-9dec76cd", + "AllocationId": "eipalloc-89c620ec", + "PrivateIp": "10.0.0.149" + } + ], + "VpcId": "vpc-1a2b3c4d", + "State": "available", + "NatGatewayId": "nat-05dba92075d71c408", + "SubnetId": "subnet-847e4dc2", + "CreateTime": "2015-12-01T12:26:55.983Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32419,7 +32887,6 @@ "com.amazonaws.ec2#DescribeNatGatewaysMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -32432,29 +32899,25 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "Filter": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n nat-gateway-id - The ID of the NAT gateway.

    \n
  • \n
  • \n

    \n state - The state of the NAT gateway (pending |\n failed | available | deleting | deleted).

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet in which the NAT gateway resides.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC in which the NAT gateway resides.

    \n
  • \n
" + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n nat-gateway-id - The ID of the NAT gateway.

    \n
  • \n
  • \n

    \n state - The state of the NAT gateway (pending |\n failed | available | deleting | deleted).

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet in which the NAT gateway resides.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC in which the NAT gateway resides.

    \n
  • \n
" } }, "MaxResults": { "target": "com.amazonaws.ec2#DescribeNatGatewaysMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } }, "NatGatewayIds": { "target": "com.amazonaws.ec2#NatGatewayIdStringList", "traits": { - "smithy.api#documentation": "

One or more NAT gateway IDs.

", + "smithy.api#documentation": "

The IDs of the NAT gateways.

", "smithy.api#xmlName": "NatGatewayId" } }, @@ -32502,7 +32965,51 @@ "target": "com.amazonaws.ec2#DescribeNetworkAclsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your network ACLs.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your network ACLs.

\n

For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a network ACL", + "documentation": "This example describes the specified network ACL.", + "input": { + "NetworkAclIds": [ + "acl-5fb85d36" + ] + }, + "output": { + "NetworkAcls": [ + { + "Associations": [ + { + "SubnetId": "subnet-65ea5f08", + "NetworkAclId": "acl-9aeb5ef7", + "NetworkAclAssociationId": "aclassoc-66ea5f0b" + } + ], + "NetworkAclId": "acl-5fb85d36", + "VpcId": "vpc-a01106c2", + "Tags": [], + "Entries": [ + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": true, + "RuleAction": "deny" + }, + { + "CidrBlock": "0.0.0.0/0", + "RuleNumber": 32767, + "Protocol": "-1", + "Egress": false, + "RuleAction": "deny" + } + ], + "IsDefault": false + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -32514,7 +33021,6 @@ "com.amazonaws.ec2#DescribeNetworkAclsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -32527,7 +33033,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n association.association-id - The ID of an association ID for the ACL.

    \n
  • \n
  • \n

    \n association.network-acl-id - The ID of the network ACL involved in the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the association.

    \n
  • \n
  • \n

    \n default - Indicates whether the ACL is the default network ACL for the VPC.

    \n
  • \n
  • \n

    \n entry.cidr - The IPv4 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.icmp.code - The ICMP code specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.icmp.type - The ICMP type specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.ipv6-cidr - The IPv6 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.from - The start of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.to - The end of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.protocol - The protocol specified in the entry (tcp | udp | icmp or a protocol number).

    \n
  • \n
  • \n

    \n entry.rule-action - Allows or denies the matching traffic (allow | deny).

    \n
  • \n
  • \n

    \n entry.egress - A Boolean that indicates the type of rule. Specify true \n\t\t for egress rules, or false for ingress rules.

    \n
  • \n
  • \n

    \n entry.rule-number - The number of an entry (in other words, rule) in\n the set of ACL entries.

    \n
  • \n
  • \n

    \n network-acl-id - The ID of the network ACL.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the network ACL.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network ACL.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n association.association-id - The ID of an association ID for the ACL.

    \n
  • \n
  • \n

    \n association.network-acl-id - The ID of the network ACL involved in the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the association.

    \n
  • \n
  • \n

    \n default - Indicates whether the ACL is the default network ACL for the VPC.

    \n
  • \n
  • \n

    \n entry.cidr - The IPv4 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.icmp.code - The ICMP code specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.icmp.type - The ICMP type specified in the entry, if any.

    \n
  • \n
  • \n

    \n entry.ipv6-cidr - The IPv6 CIDR range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.from - The start of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.port-range.to - The end of the port range specified in the entry.

    \n
  • \n
  • \n

    \n entry.protocol - The protocol specified in the entry (tcp | udp | icmp or a protocol number).

    \n
  • \n
  • \n

    \n entry.rule-action - Allows or denies the matching traffic (allow | deny).

    \n
  • \n
  • \n

    \n entry.egress - A Boolean that indicates the type of rule. Specify true \n\t\t for egress rules, or false for ingress rules.

    \n
  • \n
  • \n

    \n entry.rule-number - The number of an entry (in other words, rule) in\n the set of ACL entries.

    \n
  • \n
  • \n

    \n network-acl-id - The ID of the network ACL.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the network ACL.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network ACL.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -32535,8 +33041,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -32544,7 +33048,7 @@ "NetworkAclIds": { "target": "com.amazonaws.ec2#NetworkAclIdStringList", "traits": { - "smithy.api#documentation": "

One or more network ACL IDs.

\n

Default: Describes all your network ACLs.

", + "smithy.api#documentation": "

The IDs of the network ACLs.

\n

Default: Describes all your network ACLs.

", "smithy.api#xmlName": "NetworkAclId" } }, @@ -32557,8 +33061,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeNetworkAclsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -32647,16 +33149,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32733,16 +33231,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32837,16 +33331,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32923,16 +33413,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -32980,7 +33466,29 @@ "target": "com.amazonaws.ec2#DescribeNetworkInterfaceAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes a network interface attribute. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes a network interface attribute. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the attachment attribute of a network interface", + "documentation": "This example describes the attachment attribute of the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-686ea200", + "Attribute": "attachment" + }, + "output": { + "NetworkInterfaceId": "eni-686ea200", + "Attachment": { + "Status": "attached", + "DeviceIndex": 0, + "AttachTime": "2015-05-21T20:02:20.000Z", + "InstanceId": "i-1234567890abcdef0", + "DeleteOnTermination": true, + "AttachmentId": "eni-attach-43348162", + "InstanceOwnerId": "123456789012" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeNetworkInterfaceAttributeRequest": { @@ -32998,8 +33506,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -33090,7 +33596,6 @@ "com.amazonaws.ec2#DescribeNetworkInterfacePermissionsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -33123,8 +33628,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeNetworkInterfacePermissionsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n\t\t\tmake another request with the token returned in the output. If this parameter is not specified, \n\t\t\tup to 50 results are returned by default. For more information, see\n\t\t\tPagination.

" } } @@ -33168,7 +33671,71 @@ "target": "com.amazonaws.ec2#DescribeNetworkInterfacesResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your network interfaces.

", + "smithy.api#documentation": "

Describes one or more of your network interfaces.

\n

If you have a large number of network interfaces, the operation fails unless \n you use pagination or one of the following filters: group-id, \n mac-address, private-dns-name, private-ip-address, \n private-dns-name, subnet-id, or vpc-id.

", + "smithy.api#examples": [ + { + "title": "To describe a network interface", + "documentation": "", + "input": { + "NetworkInterfaceIds": [ + "eni-e5aa89a3" + ] + }, + "output": { + "NetworkInterfaces": [ + { + "Status": "in-use", + "MacAddress": "02:2f:8f:b0:cf:75", + "SourceDestCheck": true, + "VpcId": "vpc-a01106c2", + "Description": "my network interface", + "Association": { + "PublicIp": "203.0.113.12", + "AssociationId": "eipassoc-0fbb766a", + "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com", + "IpOwnerId": "123456789012" + }, + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + { + "PrivateDnsName": "ip-10-0-1-17.ec2.internal", + "Association": { + "PublicIp": "203.0.113.12", + "AssociationId": "eipassoc-0fbb766a", + "PublicDnsName": "ec2-203-0-113-12.compute-1.amazonaws.com", + "IpOwnerId": "123456789012" + }, + "Primary": true, + "PrivateIpAddress": "10.0.1.17" + } + ], + "RequesterManaged": false, + "PrivateDnsName": "ip-10-0-1-17.ec2.internal", + "AvailabilityZone": "us-east-1d", + "Attachment": { + "Status": "attached", + "DeviceIndex": 1, + "AttachTime": "2013-11-30T23:36:42.000Z", + "InstanceId": "i-1234567890abcdef0", + "DeleteOnTermination": false, + "AttachmentId": "eni-attach-66c4350a", + "InstanceOwnerId": "123456789012" + }, + "Groups": [ + { + "GroupName": "default", + "GroupId": "sg-8637d3e3" + } + ], + "SubnetId": "subnet-b61f49f0", + "OwnerId": "123456789012", + "TagSet": [], + "PrivateIpAddress": "10.0.1.17" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -33206,7 +33773,6 @@ "com.amazonaws.ec2#DescribeNetworkInterfacesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -33220,7 +33786,7 @@ "target": "com.amazonaws.ec2#FilterList", "traits": { "aws.protocols#ec2QueryName": "Filter", - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n addresses.private-ip-address - The private IPv4 addresses\n associated with the network interface.

    \n
  • \n
  • \n

    \n addresses.primary - Whether the private IPv4 address is the primary\n IP address associated with the network interface.

    \n
  • \n
  • \n

    \n addresses.association.public-ip - The association ID returned when\n the network interface was associated with the Elastic IP address\n (IPv4).

    \n
  • \n
  • \n

    \n addresses.association.owner-id - The owner ID of the addresses associated with the network interface.

    \n
  • \n
  • \n

    \n association.association-id - The association ID returned when the\n network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n association.allocation-id - The allocation ID returned when you\n allocated the Elastic IP address (IPv4) for your network interface.

    \n
  • \n
  • \n

    \n association.ip-owner-id - The owner of the Elastic IP address\n (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n association.public-ip - The address of the Elastic IP address\n (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n association.public-dns-name - The public DNS name for the network\n interface (IPv4).

    \n
  • \n
  • \n

    \n attachment.attachment-id - The ID of the interface attachment.

    \n
  • \n
  • \n

    \n attachment.attach-time - The time that the network interface was attached to an instance.

    \n
  • \n
  • \n

    \n attachment.delete-on-termination - Indicates whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n attachment.device-index - The device index to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.instance-id - The ID of the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.instance-owner-id - The owner ID of the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.status - The status of the attachment (attaching | attached | detaching | detached).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the network interface.

    \n
  • \n
  • \n

    \n description - The description of the network interface.

    \n
  • \n
  • \n

    \n group-id - The ID of a security group associated with the network interface.

    \n
  • \n
  • \n

    \n group-name - The name of a security group associated with the network interface.

    \n
  • \n
  • \n

    \n ipv6-addresses.ipv6-address - An IPv6 address associated with\n the network interface.

    \n
  • \n
  • \n

    \n interface-type - The type of network interface (api_gateway_managed | \n\t\t aws_codestar_connections_managed | branch | efa | \n\t\t gateway_load_balancer | gateway_load_balancer_endpoint | global_accelerator_managed | \n\t\t interface | iot_rules_managed | lambda | load_balancer | \n\t\t nat_gateway | network_load_balancer | quicksight | \n\t\t transit_gateway | trunk | vpc_endpoint).

    \n
  • \n
  • \n

    \n mac-address - The MAC address of the network interface.

    \n
  • \n
  • \n

    \n network-interface-id - The ID of the network interface.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the network interface owner.

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address or addresses of the\n network interface.

    \n
  • \n
  • \n

    \n private-dns-name - The private DNS name of the network interface (IPv4).

    \n
  • \n
  • \n

    \n requester-id - The alias or Amazon Web Services account ID of the principal or service that created the network interface.

    \n
  • \n
  • \n

    \n requester-managed - Indicates whether the network interface is being managed by an Amazon Web Service \n\t\t (for example, Amazon Web Services Management Console, Auto Scaling, and so on).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the network interface performs source/destination checking. \n\t\t A value of true means checking is enabled, and false means checking is disabled. \n\t\t The value must be false for the network interface to perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n status - The status of the network interface. If the network interface is not attached to an instance, the status is available; \n\t\t if a network interface is attached to an instance the status is in-use.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the network interface.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network interface.

    \n
  • \n
", + "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n association.allocation-id - The allocation ID returned when you\n\t\t allocated the Elastic IP address (IPv4) for your network interface.

    \n
  • \n
  • \n

    \n association.association-id - The association ID returned when the\n\t\t network interface was associated with an IPv4 address.

    \n
  • \n
  • \n

    \n addresses.association.owner-id - The owner ID of the addresses associated with the network interface.

    \n
  • \n
  • \n

    \n addresses.association.public-ip - The association ID returned when\n\t\t the network interface was associated with the Elastic IP address\n\t\t (IPv4).

    \n
  • \n
  • \n

    \n addresses.primary - Whether the private IPv4 address is the primary\n IP address associated with the network interface.

    \n
  • \n
  • \n

    \n addresses.private-ip-address - The private IPv4 addresses\n\t\t associated with the network interface.

    \n
  • \n
  • \n

    \n association.ip-owner-id - The owner of the Elastic IP address\n (IPv4) associated with the network interface.

    \n
  • \n
  • \n

    \n association.public-ip - The address of the Elastic IP address\n (IPv4) bound to the network interface.

    \n
  • \n
  • \n

    \n association.public-dns-name - The public DNS name for the network\n interface (IPv4).

    \n
  • \n
  • \n

    \n attachment.attach-time - The time that the network interface was attached to an instance.

    \n
  • \n
  • \n

    \n attachment.attachment-id - The ID of the interface attachment.

    \n
  • \n
  • \n

    \n attachment.delete-on-termination - Indicates whether the attachment is deleted when an instance is terminated.

    \n
  • \n
  • \n

    \n attachment.device-index - The device index to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.instance-id - The ID of the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.instance-owner-id - The owner ID of the instance to which the network interface is attached.

    \n
  • \n
  • \n

    \n attachment.status - The status of the attachment (attaching | attached | detaching | detached).

    \n
  • \n
  • \n

    \n availability-zone - The Availability Zone of the network interface.

    \n
  • \n
  • \n

    \n description - The description of the network interface.

    \n
  • \n
  • \n

    \n group-id - The ID of a security group associated with the network interface.

    \n
  • \n
  • \n

    \n ipv6-addresses.ipv6-address - An IPv6 address associated with\n the network interface.

    \n
  • \n
  • \n

    \n interface-type - The type of network interface (api_gateway_managed | \n\t\t aws_codestar_connections_managed | branch | \n\t\t ec2_instance_connect_endpoint | efa | efs | \n\t\t gateway_load_balancer | gateway_load_balancer_endpoint | \n\t\t global_accelerator_managed | \n\t\t interface | iot_rules_managed | \n\t\t lambda | load_balancer | \n\t\t nat_gateway | network_load_balancer | \n\t\t quicksight | \n\t\t transit_gateway | trunk | \n\t\t vpc_endpoint).

    \n
  • \n
  • \n

    \n mac-address - The MAC address of the network interface.

    \n
  • \n
  • \n

    \n network-interface-id - The ID of the network interface.

    \n
  • \n
  • \n

    \n owner-id - The Amazon Web Services account ID of the network interface owner.

    \n
  • \n
  • \n

    \n private-dns-name - The private DNS name of the network interface (IPv4).

    \n
  • \n
  • \n

    \n private-ip-address - The private IPv4 address or addresses of the\n network interface.

    \n
  • \n
  • \n

    \n requester-id - The alias or Amazon Web Services account ID of the principal or service that created the network interface.

    \n
  • \n
  • \n

    \n requester-managed - Indicates whether the network interface is being managed by an Amazon Web Service \n\t\t (for example, Amazon Web Services Management Console, Auto Scaling, and so on).

    \n
  • \n
  • \n

    \n source-dest-check - Indicates whether the network interface performs source/destination checking. \n\t\t A value of true means checking is enabled, and false means checking is disabled. \n\t\t The value must be false for the network interface to perform network address translation (NAT) in your VPC.

    \n
  • \n
  • \n

    \n status - The status of the network interface. If the network interface is not attached to an instance, the status is available; \n\t\t if a network interface is attached to an instance the status is in-use.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet for the network interface.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the network interface.

    \n
  • \n
", "smithy.api#xmlName": "filter" } }, @@ -33228,8 +33794,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -33250,8 +33814,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeNetworkInterfacesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n\t\t make another request with the token returned in the output. You cannot specify this\n\t\t parameter and the network interface IDs parameter in the same request. For more information, \n\t\t see Pagination.

" } } @@ -33311,8 +33873,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -33377,8 +33937,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -33392,8 +33950,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33460,7 +34016,6 @@ "com.amazonaws.ec2#DescribePrincipalIdFormatMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -33473,8 +34028,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -33488,8 +34041,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribePrincipalIdFormatMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another call with the returned NextToken value.

" } }, @@ -33565,8 +34116,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#PoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -33615,7 +34164,61 @@ "target": "com.amazonaws.ec2#DescribeRegionsResult" }, "traits": { - "smithy.api#documentation": "

Describes the Regions that are enabled for your account, or all Regions.

\n

For a list of the Regions supported by Amazon EC2, see \n Amazon Elastic Compute Cloud endpoints and quotas.

\n

For information about enabling and disabling Regions for your account, see Managing Amazon Web Services Regions in the Amazon Web Services General Reference.

" + "smithy.api#documentation": "

Describes the Regions that are enabled for your account, or all Regions.

\n

For a list of the Regions supported by Amazon EC2, see \n Amazon Elastic Compute Cloud endpoints and quotas.

\n

For information about enabling and disabling Regions for your account, see Managing Amazon Web Services Regions in the Amazon Web Services General Reference.

", + "smithy.api#examples": [ + { + "title": "To describe your regions", + "documentation": "This example describes all the regions that are available to you.", + "output": { + "Regions": [ + { + "Endpoint": "ec2.ap-south-1.amazonaws.com", + "RegionName": "ap-south-1" + }, + { + "Endpoint": "ec2.eu-west-1.amazonaws.com", + "RegionName": "eu-west-1" + }, + { + "Endpoint": "ec2.ap-southeast-1.amazonaws.com", + "RegionName": "ap-southeast-1" + }, + { + "Endpoint": "ec2.ap-southeast-2.amazonaws.com", + "RegionName": "ap-southeast-2" + }, + { + "Endpoint": "ec2.eu-central-1.amazonaws.com", + "RegionName": "eu-central-1" + }, + { + "Endpoint": "ec2.ap-northeast-2.amazonaws.com", + "RegionName": "ap-northeast-2" + }, + { + "Endpoint": "ec2.ap-northeast-1.amazonaws.com", + "RegionName": "ap-northeast-1" + }, + { + "Endpoint": "ec2.us-east-1.amazonaws.com", + "RegionName": "us-east-1" + }, + { + "Endpoint": "ec2.sa-east-1.amazonaws.com", + "RegionName": "sa-east-1" + }, + { + "Endpoint": "ec2.us-west-1.amazonaws.com", + "RegionName": "us-west-1" + }, + { + "Endpoint": "ec2.us-west-2.amazonaws.com", + "RegionName": "us-west-2" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeRegionsRequest": { @@ -33639,8 +34242,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -33648,8 +34249,6 @@ "AllRegions": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to display all Regions, including Regions that are disabled for your account.

" } } @@ -33695,7 +34294,6 @@ "com.amazonaws.ec2#DescribeReplaceRootVolumeTasksMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 50 @@ -33722,8 +34320,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeReplaceRootVolumeTasksMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output. \n\tFor more information, see Pagination.

" } }, @@ -33736,8 +34332,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -33953,8 +34547,6 @@ "IncludeMarketplace": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Include Reserved Instance Marketplace offerings in the response.

" } }, @@ -33967,24 +34559,18 @@ "MaxDuration": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum duration (in seconds) to filter when searching for offerings.

\n

Default: 94608000 (3 years)

" } }, "MaxInstanceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances to filter when searching for offerings.

\n

Default: 20

" } }, "MinDuration": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum duration (in seconds) to filter when searching for offerings.

\n

Default: 2592000 (1 month)

" } }, @@ -34011,8 +34597,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -34029,8 +34613,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n\t\t\tresults of the initial request can be seen by sending another request with the returned\n\t\t\t\tNextToken value. The maximum is 100.

\n

Default: 100

", "smithy.api#xmlName": "maxResults" } @@ -34109,8 +34691,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -34155,7 +34735,42 @@ "target": "com.amazonaws.ec2#DescribeRouteTablesResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your route tables.

\n

Each subnet in your VPC must be associated with a route table. If a subnet is not explicitly associated with any route table, it is implicitly associated with the main route table. This command does not return the subnet ID for implicit associations.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your route tables.

\n

Each subnet in your VPC must be associated with a route table. If a subnet is not explicitly associated with any route table, it is implicitly associated with the main route table. This command does not return the subnet ID for implicit associations.

\n

For more information, see Route tables in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a route table", + "documentation": "This example describes the specified route table.", + "input": { + "RouteTableIds": [ + "rtb-1f382e7d" + ] + }, + "output": { + "RouteTables": [ + { + "Associations": [ + { + "RouteTableAssociationId": "rtbassoc-d8ccddba", + "Main": true, + "RouteTableId": "rtb-1f382e7d" + } + ], + "RouteTableId": "rtb-1f382e7d", + "VpcId": "vpc-a01106c2", + "PropagatingVgws": [], + "Tags": [], + "Routes": [ + { + "GatewayId": "local", + "DestinationCidrBlock": "10.0.0.0/16", + "State": "active" + } + ] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -34167,7 +34782,6 @@ "com.amazonaws.ec2#DescribeRouteTablesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 100 @@ -34180,7 +34794,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n association.route-table-association-id - The ID of an association\n ID for the route table.

    \n
  • \n
  • \n

    \n association.route-table-id - The ID of the route table involved in\n the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the\n association.

    \n
  • \n
  • \n

    \n association.main - Indicates whether the route table is the main\n route table for the VPC (true | false). Route tables\n that do not have an association ID are not returned in the response.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the route table.

    \n
  • \n
  • \n

    \n route-table-id - The ID of the route table.

    \n
  • \n
  • \n

    \n route.destination-cidr-block - The IPv4 CIDR range specified in a\n route in the table.

    \n
  • \n
  • \n

    \n route.destination-ipv6-cidr-block - The IPv6 CIDR range specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.destination-prefix-list-id - The ID (prefix) of the Amazon Web Service\n specified in a route in the table.

    \n
  • \n
  • \n

    \n route.egress-only-internet-gateway-id - The ID of an\n egress-only Internet gateway specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.gateway-id - The ID of a gateway specified in a route in the table.

    \n
  • \n
  • \n

    \n route.instance-id - The ID of an instance specified in a route in the table.

    \n
  • \n
  • \n

    \n route.nat-gateway-id - The ID of a NAT gateway.

    \n
  • \n
  • \n

    \n route.transit-gateway-id - The ID of a transit gateway.

    \n
  • \n
  • \n

    \n route.origin - Describes how the route was created. \n CreateRouteTable indicates that the route was automatically\n created when the route table was created; CreateRoute indicates\n that the route was manually added to the route table;\n EnableVgwRoutePropagation indicates that the route was\n propagated by route propagation.

    \n
  • \n
  • \n

    \n route.state - The state of a route in the route table\n (active | blackhole). The blackhole state\n indicates that the route's target isn't available (for example, the specified\n gateway isn't attached to the VPC, the specified NAT instance has been\n terminated, and so on).

    \n
  • \n
  • \n

    \n route.vpc-peering-connection-id - The ID of a VPC peering\n\t\t connection specified in a route in the table.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the route table.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n association.route-table-association-id - The ID of an association\n ID for the route table.

    \n
  • \n
  • \n

    \n association.route-table-id - The ID of the route table involved in\n the association.

    \n
  • \n
  • \n

    \n association.subnet-id - The ID of the subnet involved in the\n association.

    \n
  • \n
  • \n

    \n association.main - Indicates whether the route table is the main\n route table for the VPC (true | false). Route tables\n that do not have an association ID are not returned in the response.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the route table.

    \n
  • \n
  • \n

    \n route-table-id - The ID of the route table.

    \n
  • \n
  • \n

    \n route.destination-cidr-block - The IPv4 CIDR range specified in a\n route in the table.

    \n
  • \n
  • \n

    \n route.destination-ipv6-cidr-block - The IPv6 CIDR range specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.destination-prefix-list-id - The ID (prefix) of the Amazon Web Service\n specified in a route in the table.

    \n
  • \n
  • \n

    \n route.egress-only-internet-gateway-id - The ID of an\n egress-only Internet gateway specified in a route in the route table.

    \n
  • \n
  • \n

    \n route.gateway-id - The ID of a gateway specified in a route in the table.

    \n
  • \n
  • \n

    \n route.instance-id - The ID of an instance specified in a route in the table.

    \n
  • \n
  • \n

    \n route.nat-gateway-id - The ID of a NAT gateway.

    \n
  • \n
  • \n

    \n route.transit-gateway-id - The ID of a transit gateway.

    \n
  • \n
  • \n

    \n route.origin - Describes how the route was created. \n CreateRouteTable indicates that the route was automatically\n created when the route table was created; CreateRoute indicates\n that the route was manually added to the route table;\n EnableVgwRoutePropagation indicates that the route was\n propagated by route propagation.

    \n
  • \n
  • \n

    \n route.state - The state of a route in the route table\n (active | blackhole). The blackhole state\n indicates that the route's target isn't available (for example, the specified\n gateway isn't attached to the VPC, the specified NAT instance has been\n terminated, and so on).

    \n
  • \n
  • \n

    \n route.vpc-peering-connection-id - The ID of a VPC peering\n\t\t connection specified in a route in the table.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the route table.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -34188,8 +34802,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -34197,7 +34809,7 @@ "RouteTableIds": { "target": "com.amazonaws.ec2#RouteTableIdStringList", "traits": { - "smithy.api#documentation": "

One or more route table IDs.

\n

Default: Describes all your route tables.

", + "smithy.api#documentation": "

The IDs of the route tables.

\n

Default: Describes all your route tables.

", "smithy.api#xmlName": "RouteTableId" } }, @@ -34210,8 +34822,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeRouteTablesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -34266,7 +34876,6 @@ "com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 300 @@ -34279,8 +34888,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34302,24 +34909,18 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. \n This value can be between 5 and 300. The default value is 300.\n To retrieve the remaining results, make another call with the returned\n NextToken value.

" } }, "MaxSlotDurationInHours": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum available duration, in hours. This value must be greater than MinSlotDurationInHours\n and less than 1,720.

" } }, "MinSlotDurationInHours": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum available duration, in hours. The minimum required duration is 1,200 hours per year. For example, the minimum daily schedule is 4 hours, the minimum weekly schedule is 24 hours, and the minimum monthly schedule is 100 hours.

" } }, @@ -34392,8 +34993,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34407,8 +35006,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. \n This value can be between 5 and 300. The default value is 100.\n To retrieve the remaining results, make another call with the returned\n NextToken value.

" } }, @@ -34471,7 +35068,27 @@ "target": "com.amazonaws.ec2#DescribeSecurityGroupReferencesResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Describes the VPCs on the other side of a VPC peering connection that are referencing the security groups you've specified in this request.

" + "smithy.api#documentation": "

Describes the VPCs on the other side of a VPC peering connection that are referencing the security groups you've specified in this request.

", + "smithy.api#examples": [ + { + "title": "To describe security group references", + "documentation": "This example describes the security group references for the specified security group.", + "input": { + "GroupId": [ + "sg-903004f8" + ] + }, + "output": { + "SecurityGroupReferenceSet": [ + { + "ReferencingVpcId": "vpc-1a2b3c4d", + "GroupId": "sg-903004f8", + "VpcPeeringConnectionId": "pcx-b04deed9" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeSecurityGroupReferencesRequest": { @@ -34480,8 +35097,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34535,7 +35150,6 @@ "com.amazonaws.ec2#DescribeSecurityGroupRulesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -34562,8 +35176,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34576,8 +35188,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeSecurityGroupRulesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of \n items, make another request with the token returned in the output. This value\n can be between 5 and 1000. If this parameter is not specified, then all items are\n returned. For more information, see Pagination.

" } } @@ -34619,7 +35229,19 @@ "target": "com.amazonaws.ec2#DescribeSecurityGroupsResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified security groups or all of your security groups.

\n

A security group is for use with instances either in the EC2-Classic platform \n\t\t\t\tor in a specific VPC. For more information, see\n\t\t\t\tAmazon EC2 security groups in \n\t\t\t\tthe Amazon Elastic Compute Cloud User Guide and \n\t\t\t\tSecurity groups for your VPC in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
", + "smithy.api#documentation": "

Describes the specified security groups or all of your security groups.

", + "smithy.api#examples": [ + { + "title": "To describe a security group", + "documentation": "This example describes the specified security group.", + "input": { + "GroupIds": [ + "sg-903004f8" + ] + }, + "output": {} + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -34657,7 +35279,6 @@ "com.amazonaws.ec2#DescribeSecurityGroupsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -34684,7 +35305,7 @@ "GroupNames": { "target": "com.amazonaws.ec2#GroupNameStringList", "traits": { - "smithy.api#documentation": "

[EC2-Classic and default VPC only] The names of the security groups. You can specify either\n\t\t\tthe security group name or the security group ID. For security groups in a nondefault VPC, use\n\t\t\tthe group-name filter to describe security groups by name.

\n

Default: Describes all of your security groups.

", + "smithy.api#documentation": "

[Default VPC] The names of the security groups. You can specify either\n\t\t\tthe security group name or the security group ID.

\n

Default: Describes all of your security groups.

", "smithy.api#xmlName": "GroupName" } }, @@ -34692,8 +35313,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -34707,8 +35326,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeSecurityGroupsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n make another request with the token returned in the output. This value can be between 5 and 1000. \n If this parameter is not specified, then all items are returned. For more information, see \n Pagination.

" } } @@ -34750,7 +35367,21 @@ "target": "com.amazonaws.ec2#DescribeSnapshotAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified snapshot. You can specify only one\n attribute at a time.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified snapshot. You can specify only one\n attribute at a time.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe snapshot attributes", + "documentation": "This example describes the ``createVolumePermission`` attribute on a snapshot with the snapshot ID of ``snap-066877671789bd71b``.", + "input": { + "SnapshotId": "snap-066877671789bd71b", + "Attribute": "createVolumePermission" + }, + "output": { + "SnapshotId": "snap-066877671789bd71b", + "CreateVolumePermissions": [] + } + } + ] } }, "com.amazonaws.ec2#DescribeSnapshotAttributeRequest": { @@ -34776,8 +35407,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -34853,8 +35482,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -34909,6 +35536,32 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified EBS snapshots available to you or all of the EBS snapshots\n available to you.

\n

The snapshots available to you include public snapshots, private snapshots that you own,\n and private snapshots owned by other Amazon Web Services accounts for which you have explicit create volume\n permissions.

\n

The create volume permissions fall into the following categories:

\n
    \n
  • \n

    \n public: The owner of the snapshot granted create volume\n permissions for the snapshot to the all group. All Amazon Web Services accounts have create\n volume permissions for these snapshots.

    \n
  • \n
  • \n

    \n explicit: The owner of the snapshot granted create volume\n permissions to a specific Amazon Web Services account.

    \n
  • \n
  • \n

    \n implicit: An Amazon Web Services account has implicit create volume permissions\n for all snapshots it owns.

    \n
  • \n
\n

The list of snapshots returned can be filtered by specifying snapshot IDs, snapshot\n owners, or Amazon Web Services accounts with create volume permissions. If no options are specified, \n Amazon EC2 returns all snapshots for which you have create volume permissions.

\n

If you specify one or more snapshot IDs, only snapshots that have the specified IDs are\n returned. If you specify an invalid snapshot ID, an error is returned. If you specify a\n snapshot ID for which you do not have access, it is not included in the returned\n results.

\n

If you specify one or more snapshot owners using the OwnerIds option, only\n snapshots from the specified owners and for which you have access are returned. The results\n can include the Amazon Web Services account IDs of the specified owners, amazon for snapshots\n owned by Amazon, or self for snapshots that you own.

\n

If you specify a list of restorable users, only snapshots with create snapshot permissions\n for those users are returned. You can specify Amazon Web Services account IDs (if you own the snapshots),\n self for snapshots for which you own or have explicit permissions, or\n all for public snapshots.

\n

If you are describing a long list of snapshots, we recommend that you paginate the output to make the\n list more manageable. For more information, see Pagination.

\n

To get the state of fast snapshot restores for a snapshot, use DescribeFastSnapshotRestores.

\n

For more information about EBS snapshots, see Amazon EBS snapshots in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a snapshot", + "documentation": "This example describes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``.", + "input": { + "SnapshotIds": [ + "snap-1234567890abcdef0" + ] + }, + "output": { + "Snapshots": [ + { + "Description": "This is my snapshot.", + "VolumeId": "vol-049df61146c4d7901", + "State": "completed", + "VolumeSize": 8, + "Progress": "100%", + "StartTime": "2014-02-28T21:28:32.000Z", + "SnapshotId": "snap-1234567890abcdef0", + "OwnerId": "012345678910" + } + ], + "NextToken": "" + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -34957,8 +35610,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of snapshots to return for this request.\n This value can be between 5 and 1,000; if this value is larger than 1,000, only 1,000 results are returned. \n If this parameter is not used, then the request returns all snapshots. \n You cannot specify this parameter and the snapshot IDs parameter in the same request. For more information, \n see Pagination.

" } }, @@ -34993,8 +35644,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35037,7 +35686,21 @@ "target": "com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionResult" }, "traits": { - "smithy.api#documentation": "

Describes the data feed for Spot Instances. For more information, see Spot\n Instance data feed in the Amazon EC2 User Guide for Linux Instances.

" + "smithy.api#documentation": "

Describes the data feed for Spot Instances. For more information, see Spot\n Instance data feed in the Amazon EC2 User Guide for Linux Instances.

", + "smithy.api#examples": [ + { + "title": "To describe the datafeed for your AWS account", + "documentation": "This example describes the Spot Instance datafeed subscription for your AWS account.", + "output": { + "SpotDatafeedSubscription": { + "OwnerId": "123456789012", + "Prefix": "spotdata", + "Bucket": "my-s3-bucket", + "State": "Active" + } + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionRequest": { @@ -35047,8 +35710,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35085,13 +35746,31 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetInstancesResponse" }, "traits": { - "smithy.api#documentation": "

Describes the running instances for the specified Spot Fleet.

" + "smithy.api#documentation": "

Describes the running instances for the specified Spot Fleet.

", + "smithy.api#examples": [ + { + "title": "To describe the Spot Instances associated with a Spot fleet", + "documentation": "This example lists the Spot Instances associated with the specified Spot fleet.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + }, + "output": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "ActiveInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": "m3.medium", + "SpotInstanceRequestId": "sir-08b93456" + } + ] + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotFleetInstancesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -35105,8 +35784,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35115,8 +35792,6 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetInstancesMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -35187,13 +35862,59 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryResponse" }, "traits": { - "smithy.api#documentation": "

Describes the events for the specified Spot Fleet request during the specified\n time.

\n

Spot Fleet events are delayed by up to 30 seconds before they can be described. This\n ensures that you can query by the last evaluated time and not miss a recorded event.\n Spot Fleet events are available for 48 hours.

\n

For more information, see Monitor fleet events using Amazon\n EventBridge in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Describes the events for the specified Spot Fleet request during the specified\n time.

\n

Spot Fleet events are delayed by up to 30 seconds before they can be described. This\n ensures that you can query by the last evaluated time and not miss a recorded event.\n Spot Fleet events are available for 48 hours.

\n

For more information, see Monitor fleet events using Amazon\n EventBridge in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe Spot fleet history", + "documentation": "This example returns the history for the specified Spot fleet starting at the specified time.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "StartTime": "2015-05-26T00:00:00Z" + }, + "output": { + "HistoryRecords": [ + { + "Timestamp": "2015-05-26T23:17:20.697Z", + "EventInformation": { + "EventSubType": "submitted" + }, + "EventType": "fleetRequestChange" + }, + { + "Timestamp": "2015-05-26T23:17:20.873Z", + "EventInformation": { + "EventSubType": "active" + }, + "EventType": "fleetRequestChange" + }, + { + "Timestamp": "2015-05-26T23:21:21.712Z", + "EventInformation": { + "InstanceId": "i-1234567890abcdef0", + "EventSubType": "launched" + }, + "EventType": "instanceChange" + }, + { + "Timestamp": "2015-05-26T23:21:21.816Z", + "EventInformation": { + "InstanceId": "i-1234567890abcdef1", + "EventSubType": "launched" + }, + "EventType": "instanceChange" + } + ], + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "StartTime": "2015-05-26T00:00:00Z", + "NextToken": "CpHNsscimcV5oH7bSbub03CI2Qms5+ypNpNm+53MNlR0YcXAkp0xFlfKf91yVxSExmbtma3awYxMFzNA663ZskT0AHtJ6TCb2Z8bQC2EnZgyELbymtWPfpZ1ZbauVg+P+TfGlWxWWB/Vr5dk5d4LfdgA/DRAHUrYgxzrEXAMPLE=" + } + } + ] } }, "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -35207,8 +35928,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35225,8 +35944,6 @@ "target": "com.amazonaws.ec2#DescribeSpotFleetRequestHistoryMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -35324,6 +36041,60 @@ }, "traits": { "smithy.api#documentation": "

Describes your Spot Fleet requests.

\n

Spot Fleet requests are deleted 48 hours after they are canceled and their instances\n are terminated.

", + "smithy.api#examples": [ + { + "title": "To describe a Spot fleet request", + "documentation": "This example describes the specified Spot fleet request.", + "input": { + "SpotFleetRequestIds": [ + "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + ] + }, + "output": { + "SpotFleetRequestConfigs": [ + { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "SpotFleetRequestConfig": { + "TargetCapacity": 20, + "LaunchSpecifications": [ + { + "EbsOptimized": false, + "NetworkInterfaces": [ + { + "SubnetId": "subnet-a61dafcf", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "AssociatePublicIpAddress": true, + "SecondaryPrivateIpAddressCount": 0 + } + ], + "InstanceType": "cc2.8xlarge", + "ImageId": "ami-1a2b3c4d" + }, + { + "EbsOptimized": false, + "NetworkInterfaces": [ + { + "SubnetId": "subnet-a61dafcf", + "DeviceIndex": 0, + "DeleteOnTermination": false, + "AssociatePublicIpAddress": true, + "SecondaryPrivateIpAddressCount": 0 + } + ], + "InstanceType": "r3.8xlarge", + "ImageId": "ami-1a2b3c4d" + } + ], + "SpotPrice": "0.05", + "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role" + }, + "SpotFleetRequestState": "active" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35339,8 +36110,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35349,8 +36118,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -35412,6 +36179,58 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified Spot Instance requests.

\n

You can use DescribeSpotInstanceRequests to find a running Spot Instance by\n examining the response. If the status of the Spot Instance is fulfilled, the\n instance ID appears in the response and contains the identifier of the instance.\n Alternatively, you can use DescribeInstances\n with a filter to look for instances where the instance lifecycle is\n spot.

\n

We recommend that you set MaxResults to a value between 5 and 1000 to\n limit the number of items returned. This paginates the output, which makes the list\n more manageable and returns the items faster. If the list of items exceeds your\n MaxResults value, then that number of items is returned along with a\n NextToken value that can be passed to a subsequent\n DescribeSpotInstanceRequests request to retrieve the remaining\n items.

\n

Spot Instance requests are deleted four hours after they are canceled and their instances are\n terminated.

", + "smithy.api#examples": [ + { + "title": "To describe a Spot Instance request", + "documentation": "This example describes the specified Spot Instance request.", + "input": { + "SpotInstanceRequestIds": [ + "sir-08b93456" + ] + }, + "output": { + "SpotInstanceRequests": [ + { + "Status": { + "UpdateTime": "2014-04-30T18:16:21.000Z", + "Code": "fulfilled", + "Message": "Your Spot request is fulfilled." + }, + "ProductDescription": "Linux/UNIX", + "InstanceId": "i-1234567890abcdef0", + "SpotInstanceRequestId": "sir-08b93456", + "State": "active", + "LaunchedAvailabilityZone": "us-west-1b", + "LaunchSpecification": { + "ImageId": "ami-7aba833f", + "KeyName": "my-key-pair", + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sda1", + "Ebs": { + "DeleteOnTermination": true, + "VolumeType": "standard", + "VolumeSize": 8 + } + } + ], + "EbsOptimized": false, + "SecurityGroups": [ + { + "GroupName": "my-security-group", + "GroupId": "sg-e38f24a7" + } + ], + "InstanceType": "m1.small" + }, + "Type": "one-time", + "CreateTime": "2014-04-30T18:14:55.000Z", + "SpotPrice": "0.010000" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35510,8 +36329,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35532,8 +36349,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } } @@ -35578,6 +36393,40 @@ }, "traits": { "smithy.api#documentation": "

Describes the Spot price history. For more information, see Spot Instance pricing history in the\n Amazon EC2 User Guide for Linux Instances.

\n

When you specify a start and end time, the operation returns the prices of the\n instance types within that time range. It also returns the last price change before the\n start time, which is the effective price as of the start time.

", + "smithy.api#examples": [ + { + "title": "To describe Spot price history for Linux/UNIX (Amazon VPC)", + "documentation": "This example returns the Spot Price history for m1.xlarge, Linux/UNIX (Amazon VPC) instances for a particular day in January.", + "input": { + "StartTime": "2014-01-06T07:08:09.05Z", + "EndTime": "2014-01-06T08:09:10.05Z", + "InstanceTypes": [ + "m1.xlarge" + ], + "ProductDescriptions": [ + "Linux/UNIX (Amazon VPC)" + ] + }, + "output": { + "SpotPriceHistory": [ + { + "Timestamp": "2014-01-06T04:32:53.000Z", + "ProductDescription": "Linux/UNIX (Amazon VPC)", + "InstanceType": "m1.xlarge", + "SpotPrice": "0.080000", + "AvailabilityZone": "us-west-1a" + }, + { + "Timestamp": "2014-01-05T11:28:26.000Z", + "ProductDescription": "Linux/UNIX (Amazon VPC)", + "InstanceType": "m1.xlarge", + "SpotPrice": "0.080000", + "AvailabilityZone": "us-west-1c" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35592,7 +36441,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for which prices should\n be returned.

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n m3.medium).

    \n
  • \n
  • \n

    \n product-description - The product description for the Spot price\n (Linux/UNIX | Red Hat Enterprise Linux |\n SUSE Linux | Windows | Linux/UNIX (Amazon\n VPC) | Red Hat Enterprise Linux (Amazon VPC) |\n SUSE Linux (Amazon VPC) | Windows (Amazon\n VPC)).

    \n
  • \n
  • \n

    \n spot-price - The Spot price. The value must match exactly (or use\n wildcards; greater than or less than comparison is not supported).

    \n
  • \n
  • \n

    \n timestamp - The time stamp of the Spot price history, in UTC format\n (for example,\n YYYY-MM-DDTHH:MM:SSZ).\n You can use wildcards (* and ?). Greater than or less than comparison is not\n supported.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for which prices should\n be returned.

    \n
  • \n
  • \n

    \n instance-type - The type of instance (for example,\n m3.medium).

    \n
  • \n
  • \n

    \n product-description - The product description for the Spot price\n (Linux/UNIX | Red Hat Enterprise Linux |\n SUSE Linux | Windows | Linux/UNIX (Amazon\n VPC) | Red Hat Enterprise Linux (Amazon VPC) |\n SUSE Linux (Amazon VPC) | Windows (Amazon\n VPC)).

    \n
  • \n
  • \n

    \n spot-price - The Spot price. The value must match exactly (or use\n wildcards; greater than or less than comparison is not supported).

    \n
  • \n
  • \n

    \n timestamp - The time stamp of the Spot price history, in UTC format\n (for example, ddd MMM dd\n HH:mm:ss UTC\n YYYY). You can use wildcards (* and\n ?). Greater than or less than comparison is not\n supported.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -35608,8 +36457,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35633,8 +36480,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -35702,7 +36547,7 @@ "target": "com.amazonaws.ec2#DescribeStaleSecurityGroupsResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Describes the stale security group rules for security groups in a specified VPC. \n Rules are stale when they reference a deleted security group in the same VPC or in a peer VPC, \n or if they reference a security group in a peer VPC for which the VPC peering connection has \n been deleted.

", + "smithy.api#documentation": "

Describes the stale security group rules for security groups in a specified VPC. \n Rules are stale when they reference a deleted security group in the same VPC or in a peer VPC, \n or if they reference a security group in a peer VPC for which the VPC peering connection has \n been deleted.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35714,7 +36559,6 @@ "com.amazonaws.ec2#DescribeStaleSecurityGroupsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -35736,16 +36580,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#DescribeStaleSecurityGroupsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n make another request with the token returned in the output. For more information, \n see Pagination.

" } }, @@ -35807,6 +36647,43 @@ "outputToken": "NextToken", "items": "StoreImageTaskResults", "pageSize": "MaxResults" + }, + "smithy.waiters#waitable": { + "StoreImageTaskComplete": { + "acceptors": [ + { + "state": "success", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "Completed", + "comparator": "allStringEquals" + } + } + }, + { + "state": "failure", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "Failed", + "comparator": "anyStringEquals" + } + } + }, + { + "state": "retry", + "matcher": { + "output": { + "path": "StoreImageTaskResults[].StoreTaskState", + "expected": "InProgress", + "comparator": "anyStringEquals" + } + } + } + ], + "minDelay": 5 + } } } }, @@ -35823,15 +36700,13 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n task-state - Returns tasks in a certain state (InProgress |\n Completed | Failed)

    \n
  • \n
  • \n

    \n bucket - Returns task information for tasks that targeted a specific\n bucket. For the filter value, specify the bucket name.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n task-state - Returns tasks in a certain state (InProgress |\n Completed | Failed)

    \n
  • \n
  • \n

    \n bucket - Returns task information for tasks that targeted a specific\n bucket. For the filter value, specify the bucket name.

    \n
  • \n
\n \n

When you specify the ImageIds parameter, any filters that you specify are\n ignored. To use the filters, you must remove the ImageIds parameter.

\n
", "smithy.api#xmlName": "Filter" } }, @@ -35844,9 +36719,7 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeStoreImageTasksRequestMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, - "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the ImageIDs parameter\n in the same call.

" + "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

\n

You cannot specify this parameter and the ImageIds parameter in the same\n call.

" } } }, @@ -35857,7 +36730,6 @@ "com.amazonaws.ec2#DescribeStoreImageTasksRequestMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 200 @@ -35897,7 +36769,37 @@ "target": "com.amazonaws.ec2#DescribeSubnetsResult" }, "traits": { - "smithy.api#documentation": "

Describes one or more of your subnets.

\n

For more information, see Your VPC and subnets in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

", + "smithy.api#documentation": "

Describes one or more of your subnets.

\n

For more information, see Subnets in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe the subnets for a VPC", + "documentation": "This example describes the subnets for the specified VPC.", + "input": { + "Filters": [ + { + "Name": "vpc-id", + "Values": [ + "vpc-a01106c2" + ] + } + ] + }, + "output": { + "Subnets": [ + { + "VpcId": "vpc-a01106c2", + "CidrBlock": "10.0.1.0/24", + "MapPublicIpOnLaunch": false, + "DefaultForAz": false, + "State": "available", + "AvailabilityZone": "us-east-1c", + "SubnetId": "subnet-9d4a7b6c", + "AvailableIpAddressCount": 251 + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -35926,7 +36828,6 @@ "com.amazonaws.ec2#DescribeSubnetsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -35939,14 +36840,14 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for the subnet. You can also use\n availabilityZone as the filter name.

    \n
  • \n
  • \n

    \n availability-zone-id - The ID of the Availability Zone for the subnet.\n You can also use availabilityZoneId as the filter name.

    \n
  • \n
  • \n

    \n available-ip-address-count - The number of IPv4 addresses in the\n subnet that are available.

    \n
  • \n
  • \n

    \n cidr-block - The IPv4 CIDR block of the subnet. The CIDR block\n you specify must exactly match the subnet's CIDR block for information to be\n returned for the subnet. You can also use cidr or\n cidrBlock as the filter names.

    \n
  • \n
  • \n

    \n customer-owned-ipv4-pool - The customer-owned IPv4 address pool\n associated with the subnet.

    \n
  • \n
  • \n

    \n default-for-az - Indicates whether this is the default subnet for\n the Availability Zone (true | false). You can also use\n defaultForAz as the filter name.

    \n
  • \n
  • \n

    \n enable-dns64 - Indicates whether DNS queries made to the\n Amazon-provided DNS Resolver in this subnet should return synthetic IPv6\n addresses for IPv4-only destinations.

    \n
  • \n
  • \n

    \n enable-lni-at-device-index - Indicates the device position for\n local network interfaces in this subnet. For example, 1 indicates\n local network interfaces in this subnet are the secondary network interface\n (eth1).

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - An association ID\n for an IPv6 CIDR block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-native - Indicates whether this is an IPv6 only subnet\n (true | false).

    \n
  • \n
  • \n

    \n map-customer-owned-ip-on-launch - Indicates whether a network\n interface created in this subnet (including a network interface created by RunInstances) receives a customer-owned IPv4 address.

    \n
  • \n
  • \n

    \n map-public-ip-on-launch - Indicates whether instances launched in\n this subnet receive a public IPv4 address.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the Outpost.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the\n subnet.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.hostname-type - The type of\n hostname to assign to instances in the subnet at launch. For IPv4-only and\n dual-stack (IPv4 and IPv6) subnets, an instance DNS name can be based on the\n instance IPv4 address (ip-name) or the instance ID (resource-name). For IPv6\n only subnets, an instance DNS name must be based on the instance ID\n (resource-name).

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-a-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-aaaa-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS\n AAAA records.

    \n
  • \n
  • \n

    \n state - The state of the subnet (pending | available).

    \n
  • \n
  • \n

    \n subnet-arn - The Amazon Resource Name (ARN) of the subnet.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the subnet.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n availability-zone - The Availability Zone for the subnet. You can also use\n availabilityZone as the filter name.

    \n
  • \n
  • \n

    \n availability-zone-id - The ID of the Availability Zone for the subnet.\n You can also use availabilityZoneId as the filter name.

    \n
  • \n
  • \n

    \n available-ip-address-count - The number of IPv4 addresses in the\n subnet that are available.

    \n
  • \n
  • \n

    \n cidr-block - The IPv4 CIDR block of the subnet. The CIDR block\n you specify must exactly match the subnet's CIDR block for information to be\n returned for the subnet. You can also use cidr or\n cidrBlock as the filter names.

    \n
  • \n
  • \n

    \n customer-owned-ipv4-pool - The customer-owned IPv4 address pool\n associated with the subnet.

    \n
  • \n
  • \n

    \n default-for-az - Indicates whether this is the default subnet for\n the Availability Zone (true | false). You can also use\n defaultForAz as the filter name.

    \n
  • \n
  • \n

    \n enable-dns64 - Indicates whether DNS queries made to the\n Amazon-provided DNS Resolver in this subnet should return synthetic IPv6\n addresses for IPv4-only destinations.

    \n
  • \n
  • \n

    \n enable-lni-at-device-index - Indicates the device position for\n local network interfaces in this subnet. For example, 1 indicates\n local network interfaces in this subnet are the secondary network interface\n (eth1).

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - An association ID\n for an IPv6 CIDR block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the subnet.

    \n
  • \n
  • \n

    \n ipv6-native - Indicates whether this is an IPv6 only subnet\n (true | false).

    \n
  • \n
  • \n

    \n map-customer-owned-ip-on-launch - Indicates whether a network\n interface created in this subnet (including a network interface created by RunInstances) receives a customer-owned IPv4 address.

    \n
  • \n
  • \n

    \n map-public-ip-on-launch - Indicates whether instances launched in\n this subnet receive a public IPv4 address.

    \n
  • \n
  • \n

    \n outpost-arn - The Amazon Resource Name (ARN) of the Outpost.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the\n subnet.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.hostname-type - The type of\n hostname to assign to instances in the subnet at launch. For IPv4-only and\n dual-stack (IPv4 and IPv6) subnets, an instance DNS name can be based on the\n instance IPv4 address (ip-name) or the instance ID (resource-name). For IPv6\n only subnets, an instance DNS name must be based on the instance ID\n (resource-name).

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-a-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

    \n
  • \n
  • \n

    \n private-dns-name-options-on-launch.enable-resource-name-dns-aaaa-record\n - Indicates whether to respond to DNS queries for instance hostnames with DNS\n AAAA records.

    \n
  • \n
  • \n

    \n state - The state of the subnet (pending | available).

    \n
  • \n
  • \n

    \n subnet-arn - The Amazon Resource Name (ARN) of the subnet.

    \n
  • \n
  • \n

    \n subnet-id - The ID of the subnet.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC for the subnet.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, "SubnetIds": { "target": "com.amazonaws.ec2#SubnetIdStringList", "traits": { - "smithy.api#documentation": "

One or more subnet IDs.

\n

Default: Describes all your subnets.

", + "smithy.api#documentation": "

The IDs of the subnets.

\n

Default: Describes all your subnets.

", "smithy.api#xmlName": "SubnetId" } }, @@ -35954,8 +36855,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -35969,8 +36868,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeSubnetsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -36013,6 +36910,38 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified tags for your EC2 resources.

\n

For more information about tags, see Tag your Amazon EC2 resources in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe the tags for a single resource", + "documentation": "This example describes the tags for the specified instance.", + "input": { + "Filters": [ + { + "Name": "resource-id", + "Values": [ + "i-1234567890abcdef8" + ] + } + ] + }, + "output": { + "Tags": [ + { + "ResourceType": "instance", + "ResourceId": "i-1234567890abcdef8", + "Value": "test", + "Key": "Stack" + }, + { + "ResourceType": "instance", + "ResourceId": "i-1234567890abcdef8", + "Value": "Beta Server", + "Key": "Name" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -36028,8 +36957,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -36045,8 +36972,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. This value can be between 5 and 1000. \n To get the next page of items, make another request with the token returned in the output.\n For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -36119,8 +37044,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -36134,8 +37057,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TrafficMirroringMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36205,8 +37126,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -36220,8 +37139,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TrafficMirroringMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36291,8 +37208,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -36306,8 +37221,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TrafficMirroringMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36383,8 +37296,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36397,8 +37308,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -36468,8 +37377,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36482,8 +37389,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -36553,8 +37458,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36567,8 +37470,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -36638,8 +37539,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36652,8 +37551,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -36723,8 +37620,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36737,8 +37632,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -36808,8 +37701,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36822,8 +37713,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -36893,8 +37782,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36907,8 +37794,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -36978,8 +37863,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -36992,8 +37875,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -37063,8 +37944,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -37077,8 +37956,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -37148,8 +38025,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -37162,8 +38037,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -37217,7 +38090,6 @@ "com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -37237,8 +38109,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -37258,8 +38128,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } } @@ -37313,7 +38181,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessEndpointsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -37345,8 +38212,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessEndpointsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -37366,8 +38231,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -37403,7 +38266,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessGroupMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -37447,8 +38309,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessGroupMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -37468,8 +38328,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -37523,7 +38381,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 10 @@ -37543,8 +38400,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -37564,8 +38419,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -37619,7 +38472,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessInstancesMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 200 @@ -37639,8 +38491,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessInstancesMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -37660,8 +38510,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -37715,7 +38563,6 @@ "com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 200 @@ -37735,8 +38582,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -37756,8 +38601,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -37799,7 +38642,23 @@ "target": "com.amazonaws.ec2#DescribeVolumeAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified volume. You can specify only one\n attribute at a time.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified volume. You can specify only one\n attribute at a time.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe a volume attribute", + "documentation": "This example describes the ``autoEnableIo`` attribute of the volume with the ID ``vol-049df61146c4d7901``.", + "input": { + "VolumeId": "vol-049df61146c4d7901", + "Attribute": "autoEnableIO" + }, + "output": { + "AutoEnableIO": { + "Value": false + }, + "VolumeId": "vol-049df61146c4d7901" + } + } + ] } }, "com.amazonaws.ec2#DescribeVolumeAttributeRequest": { @@ -37825,8 +38684,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -37878,6 +38735,40 @@ }, "traits": { "smithy.api#documentation": "

Describes the status of the specified volumes. Volume status provides the result of the\n checks performed on your volumes to determine events that can impair the performance of your\n volumes. The performance of a volume can be affected if an issue occurs on the volume's\n underlying host. If the volume's underlying host experiences a power outage or system issue,\n after the system is restored, there could be data inconsistencies on the volume. Volume events\n notify you if this occurs. Volume actions notify you if any action needs to be taken in\n response to the event.

\n

The DescribeVolumeStatus operation provides the following information about\n the specified volumes:

\n

\n Status: Reflects the current status of the volume. The possible\n values are ok, impaired , warning, or\n insufficient-data. If all checks pass, the overall status of the volume is\n ok. If the check fails, the overall status is impaired. If the\n status is insufficient-data, then the checks might still be taking place on your\n volume at the time. We recommend that you retry the request. For more information about volume\n status, see Monitor the status of your volumes in the\n Amazon Elastic Compute Cloud User Guide.

\n

\n Events: Reflect the cause of a volume status and might require you to\n take action. For example, if your volume returns an impaired status, then the\n volume event might be potential-data-inconsistency. This means that your volume\n has been affected by an issue with the underlying host, has all I/O operations disabled, and\n might have inconsistent data.

\n

\n Actions: Reflect the actions you might have to take in response to an\n event. For example, if the status of the volume is impaired and the volume event\n shows potential-data-inconsistency, then the action shows\n enable-volume-io. This means that you may want to enable the I/O operations for\n the volume by calling the EnableVolumeIO action and then check the volume\n for data consistency.

\n

Volume status is based on the volume status checks, and does not reflect the volume state.\n Therefore, volume status does not indicate volumes in the error state (for\n example, when a volume is incapable of accepting I/O.)

", + "smithy.api#examples": [ + { + "title": "To describe the status of a single volume", + "documentation": "This example describes the status for the volume ``vol-1234567890abcdef0``.", + "input": { + "VolumeIds": [ + "vol-1234567890abcdef0" + ] + }, + "output": { + "VolumeStatuses": [ + { + "VolumeStatus": { + "Status": "ok", + "Details": [ + { + "Status": "passed", + "Name": "io-enabled" + }, + { + "Status": "not-applicable", + "Name": "io-performance" + } + ] + }, + "AvailabilityZone": "us-east-1a", + "VolumeId": "vol-1234567890abcdef0", + "Actions": [], + "Events": [] + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -37899,8 +38790,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. To get the next page of items,\n make another request with the token returned in the output. This value can be between 5 and 1,000;\n if the value is larger than 1,000, only 1,000 results are returned. If this parameter is not used, \n then all items are returned. You cannot specify this parameter and the volume IDs parameter in the \n same request. For more information, see Pagination.

" } }, @@ -37921,8 +38810,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -37966,6 +38853,36 @@ }, "traits": { "smithy.api#documentation": "

Describes the specified EBS volumes or all of your EBS volumes.

\n

If you are describing a long list of volumes, we recommend that you paginate the output to make the list\n more manageable. For more information, see Pagination.

\n

For more information about EBS volumes, see Amazon EBS volumes in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To describe all volumes", + "documentation": "This example describes all of your volumes in the default region.", + "output": { + "Volumes": [ + { + "AvailabilityZone": "us-east-1a", + "Attachments": [ + { + "AttachTime": "2013-12-18T22:35:00.000Z", + "InstanceId": "i-1234567890abcdef0", + "VolumeId": "vol-049df61146c4d7901", + "State": "attached", + "DeleteOnTermination": true, + "Device": "/dev/sda1" + } + ], + "VolumeType": "standard", + "VolumeId": "vol-049df61146c4d7901", + "State": "in-use", + "SnapshotId": "snap-1234567890abcdef0", + "CreateTime": "2013-12-18T22:35:00.084Z", + "Size": 8 + } + ], + "NextToken": "" + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -38074,8 +38991,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38102,8 +39017,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results (up to a limit of 500) to be returned in a paginated\n request. For more information, see Pagination.

" } } @@ -38157,8 +39070,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -38167,8 +39078,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of volumes to return for this request. \n This value can be between 5 and 500; if you specify a value larger than 500, only 500 items are returned. \n If this parameter is not used, then all items are returned. You cannot specify this parameter and the\n volume IDs parameter in the same request. For more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -38219,7 +39128,23 @@ "target": "com.amazonaws.ec2#DescribeVpcAttributeResult" }, "traits": { - "smithy.api#documentation": "

Describes the specified attribute of the specified VPC. You can specify only one attribute at a time.

" + "smithy.api#documentation": "

Describes the specified attribute of the specified VPC. You can specify only one attribute at a time.

", + "smithy.api#examples": [ + { + "title": "To describe the enableDnsSupport attribute", + "documentation": "This example describes the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for your instances to their corresponding IP addresses; otherwise, it does not.", + "input": { + "VpcId": "vpc-a01106c2", + "Attribute": "enableDnsSupport" + }, + "output": { + "VpcId": "vpc-a01106c2", + "EnableDnsSupport": { + "Value": true + } + } + } + ] } }, "com.amazonaws.ec2#DescribeVpcAttributeRequest": { @@ -38245,8 +39170,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -38305,7 +39228,7 @@ "target": "com.amazonaws.ec2#DescribeVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "

Describes the ClassicLink status of one or more VPCs.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes the ClassicLink status of the specified VPCs.

" } }, "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupport": { @@ -38317,7 +39240,7 @@ "target": "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the ClassicLink DNS support status of one or more VPCs. If enabled, the DNS\n hostname of a linked EC2-Classic instance resolves to its private IP address when\n addressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n of an instance in a VPC resolves to its private IP address when addressed from a linked\n EC2-Classic instance. For more information, see ClassicLink in the Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Describes the ClassicLink DNS support status of one or more VPCs. If enabled, the DNS\n hostname of a linked EC2-Classic instance resolves to its private IP address when\n addressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n of an instance in a VPC resolves to its private IP address when addressed from a linked\n EC2-Classic instance.

", "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -38329,7 +39252,6 @@ "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -38352,8 +39274,6 @@ "target": "com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportMaxResults", "traits": { "aws.protocols#ec2QueryName": "MaxResults", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

", "smithy.api#xmlName": "maxResults" } @@ -38369,7 +39289,7 @@ "VpcIds": { "target": "com.amazonaws.ec2#VpcClassicLinkIdList", "traits": { - "smithy.api#documentation": "

One or more VPC IDs.

", + "smithy.api#documentation": "

The IDs of the VPCs.

", "smithy.api#xmlName": "VpcIds" } } @@ -38408,7 +39328,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n is-classic-link-enabled - Whether the VPC is enabled for ClassicLink\n\t\t\t\t\t (true | false).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n is-classic-link-enabled - Whether the VPC is enabled for ClassicLink\n\t\t\t\t\t (true | false).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -38416,8 +39336,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -38425,7 +39343,7 @@ "VpcIds": { "target": "com.amazonaws.ec2#VpcClassicLinkIdList", "traits": { - "smithy.api#documentation": "

One or more VPCs for which you want to describe the ClassicLink status.

", + "smithy.api#documentation": "

The VPCs for which you want to describe the ClassicLink status.

", "smithy.api#xmlName": "VpcId" } } @@ -38441,7 +39359,7 @@ "target": "com.amazonaws.ec2#VpcClassicLinkList", "traits": { "aws.protocols#ec2QueryName": "VpcSet", - "smithy.api#documentation": "

The ClassicLink status of one or more VPCs.

", + "smithy.api#documentation": "

The ClassicLink status of the VPCs.

", "smithy.api#xmlName": "vpcSet" } } @@ -38474,8 +39392,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38495,8 +39411,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in a single call. To retrieve the remaining\n results, make another request with the returned NextToken value.

" } }, @@ -38559,8 +39473,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38574,8 +39486,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n results of the initial request can be seen by sending another request with the returned\n NextToken value. This value can be between 5 and 1,000; if\n MaxResults is given a value larger than 1,000, only 1,000 results are\n returned.

" } }, @@ -38638,8 +39548,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38660,8 +39568,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n results of the initial request can be seen by sending another request with the returned\n NextToken value. This value can be between 5 and 1,000; if\n MaxResults is given a value larger than 1,000, only 1,000 results are\n returned.

" } }, @@ -38724,8 +39630,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38747,8 +39651,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining\n results of the initial request can be seen by sending another request with the returned\n NextToken value. This value can be between 5 and 1,000; if\n MaxResults is given a value larger than 1,000, only 1,000 results are\n returned.

" } }, @@ -38805,8 +39707,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38827,8 +39727,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. The request returns a token that you can specify in a subsequent call to get the next set of results.

\n

Constraint: If the value is greater than 1,000, we return only 1,000 items.

" } }, @@ -38899,8 +39797,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -38921,8 +39817,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request. The request returns a token that you can specify in a subsequent call to get the next set of results.

\n

Constraint: If the value is greater than 1,000, we return only 1,000 items.

" } }, @@ -39025,7 +39919,6 @@ "com.amazonaws.ec2#DescribeVpcPeeringConnectionsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -39038,7 +39931,7 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n accepter-vpc-info.cidr-block - The IPv4 CIDR block of the accepter\n VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n accepter VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.vpc-id - The ID of the accepter VPC.

    \n
  • \n
  • \n

    \n expiration-time - The expiration date and time for the VPC peering\n connection.

    \n
  • \n
  • \n

    \n requester-vpc-info.cidr-block - The IPv4 CIDR block of the\n requester's VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n requester VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.vpc-id - The ID of the requester VPC.

    \n
  • \n
  • \n

    \n status-code - The status of the VPC peering connection\n (pending-acceptance | failed |\n expired | provisioning | active |\n deleting | deleted |\n rejected).

    \n
  • \n
  • \n

    \n status-message - A message that provides more information about the status\n of the VPC peering connection, if applicable.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-peering-connection-id - The ID of the VPC peering connection.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n accepter-vpc-info.cidr-block - The IPv4 CIDR block of the accepter\n VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n accepter VPC.

    \n
  • \n
  • \n

    \n accepter-vpc-info.vpc-id - The ID of the accepter VPC.

    \n
  • \n
  • \n

    \n expiration-time - The expiration date and time for the VPC peering\n connection.

    \n
  • \n
  • \n

    \n requester-vpc-info.cidr-block - The IPv4 CIDR block of the\n requester's VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.owner-id - The ID of the Amazon Web Services account that owns the\n requester VPC.

    \n
  • \n
  • \n

    \n requester-vpc-info.vpc-id - The ID of the requester VPC.

    \n
  • \n
  • \n

    \n status-code - The status of the VPC peering connection\n (pending-acceptance | failed |\n expired | provisioning | active |\n deleting | deleted |\n rejected).

    \n
  • \n
  • \n

    \n status-message - A message that provides more information about the status\n of the VPC peering connection, if applicable.

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-peering-connection-id - The ID of the VPC peering connection.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, @@ -39046,8 +39939,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39055,7 +39946,7 @@ "VpcPeeringConnectionIds": { "target": "com.amazonaws.ec2#VpcPeeringConnectionIdList", "traits": { - "smithy.api#documentation": "

One or more VPC peering connection IDs.

\n

Default: Describes all your VPC peering connections.

", + "smithy.api#documentation": "

The IDs of the VPC peering connections.

\n

Default: Describes all your VPC peering connections.

", "smithy.api#xmlName": "VpcPeeringConnectionId" } }, @@ -39068,8 +39959,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVpcPeeringConnectionsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -39112,6 +40001,35 @@ }, "traits": { "smithy.api#documentation": "

Describes one or more of your VPCs.

", + "smithy.api#examples": [ + { + "title": "To describe a VPC", + "documentation": "This example describes the specified VPC.", + "input": { + "VpcIds": [ + "vpc-a01106c2" + ] + }, + "output": { + "Vpcs": [ + { + "VpcId": "vpc-a01106c2", + "InstanceTenancy": "default", + "Tags": [ + { + "Value": "MyVPC", + "Key": "Name" + } + ], + "State": "available", + "DhcpOptionsId": "dopt-7a8b9c2d", + "CidrBlock": "10.0.0.0/16", + "IsDefault": false + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", @@ -39160,7 +40078,6 @@ "com.amazonaws.ec2#DescribeVpcsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -39173,14 +40090,14 @@ "Filters": { "target": "com.amazonaws.ec2#FilterList", "traits": { - "smithy.api#documentation": "

One or more filters.

\n
    \n
  • \n

    \n cidr - The primary IPv4 CIDR block of the VPC. The CIDR block you\n specify must exactly match the VPC's CIDR block for information to be returned\n for the VPC. Must contain the slash followed by one or two digits (for example,\n /28).

    \n
  • \n
  • \n

    \n cidr-block-association.cidr-block - An IPv4 CIDR block associated with the\n VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.association-id - The association ID for\n an IPv4 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.state - The state of an IPv4 CIDR block\n associated with the VPC.

    \n
  • \n
  • \n

    \n dhcp-options-id - The ID of a set of DHCP options.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-pool - The ID of the IPv6 address pool from which the IPv6 CIDR block is allocated.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - The association\n ID for an IPv6 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n is-default - Indicates whether the VPC is the default VPC.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the VPC.

    \n
  • \n
  • \n

    \n state - The state of the VPC (pending | available).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC.

    \n
  • \n
", + "smithy.api#documentation": "

The filters.

\n
    \n
  • \n

    \n cidr - The primary IPv4 CIDR block of the VPC. The CIDR block you\n specify must exactly match the VPC's CIDR block for information to be returned\n for the VPC. Must contain the slash followed by one or two digits (for example,\n /28).

    \n
  • \n
  • \n

    \n cidr-block-association.cidr-block - An IPv4 CIDR block associated with the\n VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.association-id - The association ID for\n an IPv4 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n cidr-block-association.state - The state of an IPv4 CIDR block\n associated with the VPC.

    \n
  • \n
  • \n

    \n dhcp-options-id - The ID of a set of DHCP options.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.ipv6-pool - The ID of the IPv6 address pool from which the IPv6 CIDR block is allocated.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.association-id - The association\n ID for an IPv6 CIDR block associated with the VPC.

    \n
  • \n
  • \n

    \n ipv6-cidr-block-association.state - The state of an IPv6 CIDR\n block associated with the VPC.

    \n
  • \n
  • \n

    \n is-default - Indicates whether the VPC is the default VPC.

    \n
  • \n
  • \n

    \n owner-id - The ID of the Amazon Web Services account that owns the VPC.

    \n
  • \n
  • \n

    \n state - The state of the VPC (pending | available).

    \n
  • \n
  • \n

    \n tag: - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\n For example, to find all resources that have a tag with the key Owner and the value TeamA, specify tag:Owner for the filter name and TeamA for the filter value.

    \n
  • \n
  • \n

    \n tag-key - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.

    \n
  • \n
  • \n

    \n vpc-id - The ID of the VPC.

    \n
  • \n
", "smithy.api#xmlName": "Filter" } }, "VpcIds": { "target": "com.amazonaws.ec2#VpcIdStringList", "traits": { - "smithy.api#documentation": "

One or more VPC IDs.

\n

Default: Describes all your VPCs.

", + "smithy.api#documentation": "

The IDs of the VPCs.

\n

Default: Describes all your VPCs.

", "smithy.api#xmlName": "VpcId" } }, @@ -39188,8 +40105,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39203,8 +40118,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#DescribeVpcsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" } } @@ -39332,8 +40245,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39394,8 +40305,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39452,16 +40361,12 @@ "HiveCompatiblePartitions": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to use Hive-compatible prefixes for flow logs stored in Amazon S3.\n The default is false.

" } }, "PerHourPartition": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to partition the flow log per hour. This reduces the cost and response \n time for queries. The default is false.

" } } @@ -39485,8 +40390,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "HiveCompatiblePartitions", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to use Hive-compatible prefixes for flow logs stored in Amazon S3.

", "smithy.api#xmlName": "hiveCompatiblePartitions" } @@ -39495,8 +40398,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PerHourPartition", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to partition the flow log per hour.

", "smithy.api#xmlName": "perHourPartition" } @@ -39515,7 +40416,7 @@ "target": "com.amazonaws.ec2#DetachClassicLinkVpcResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Unlinks (detaches) a linked EC2-Classic instance from a VPC. After the instance has been unlinked, the VPC security groups are no longer associated with it. An instance is automatically unlinked from a VPC when it's stopped.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Unlinks (detaches) a linked EC2-Classic instance from a VPC. After the instance has been unlinked, \n\t\t the VPC security groups are no longer associated with it. An instance is automatically unlinked from \n\t\t a VPC when it's stopped.

" } }, "com.amazonaws.ec2#DetachClassicLinkVpcRequest": { @@ -39525,8 +40426,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39563,8 +40462,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -39583,7 +40480,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Detaches an internet gateway from a VPC, disabling connectivity between the internet\n\t\t\tand the VPC. The VPC must not contain any running instances with Elastic IP addresses or\n\t\t\tpublic IPv4 addresses.

" + "smithy.api#documentation": "

Detaches an internet gateway from a VPC, disabling connectivity between the internet\n\t\t\tand the VPC. The VPC must not contain any running instances with Elastic IP addresses or\n\t\t\tpublic IPv4 addresses.

", + "smithy.api#examples": [ + { + "title": "To detach an Internet gateway from a VPC", + "documentation": "This example detaches the specified Internet gateway from the specified VPC.", + "input": { + "InternetGatewayId": "igw-c0a643a9", + "VpcId": "vpc-a01106c2" + } + } + ] } }, "com.amazonaws.ec2#DetachInternetGatewayRequest": { @@ -39593,8 +40500,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39633,7 +40538,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Detaches a network interface from an instance.

" + "smithy.api#documentation": "

Detaches a network interface from an instance.

", + "smithy.api#examples": [ + { + "title": "To detach a network interface from an instance", + "documentation": "This example detaches the specified network interface from its attached instance.", + "input": { + "AttachmentId": "eni-attach-66c4350a" + } + } + ] } }, "com.amazonaws.ec2#DetachNetworkInterfaceRequest": { @@ -39653,8 +40567,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39663,8 +40575,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Force", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether to force a detachment.

\n \n
    \n
  • \n

    Use the Force parameter only as a last resort to detach a network interface from a failed instance.

    \n
  • \n
  • \n

    If you use the Force parameter to detach a network interface, you might not be able to attach a different network interface to the same index on the instance without first stopping and starting the instance.

    \n
  • \n
  • \n

    If you force the detachment of a network interface, the instance metadata\n might not get updated. This means that the attributes associated\n with the detached network interface might still be visible. The\n instance metadata will get updated when you stop and start the\n instance.

    \n
  • \n
\n
", "smithy.api#xmlName": "force" } @@ -39716,8 +40626,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -39759,7 +40667,23 @@ "target": "com.amazonaws.ec2#VolumeAttachment" }, "traits": { - "smithy.api#documentation": "

Detaches an EBS volume from an instance. Make sure to unmount any file systems on the\n device within your operating system before detaching the volume. Failure to do so can result\n in the volume becoming stuck in the busy state while detaching. If this happens,\n detachment can be delayed indefinitely until you unmount the volume, force detachment, reboot\n the instance, or all three. If an EBS volume is the root device of an instance, it can't be\n detached while the instance is running. To detach the root volume, stop the instance\n first.

\n

When a volume with an Amazon Web Services Marketplace product code is detached from an instance, the\n product code is no longer associated with the instance.

\n

For more information, see Detach an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Detaches an EBS volume from an instance. Make sure to unmount any file systems on the\n device within your operating system before detaching the volume. Failure to do so can result\n in the volume becoming stuck in the busy state while detaching. If this happens,\n detachment can be delayed indefinitely until you unmount the volume, force detachment, reboot\n the instance, or all three. If an EBS volume is the root device of an instance, it can't be\n detached while the instance is running. To detach the root volume, stop the instance\n first.

\n

When a volume with an Amazon Web Services Marketplace product code is detached from an instance, the\n product code is no longer associated with the instance.

\n

For more information, see Detach an Amazon EBS volume in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To detach a volume from an instance", + "documentation": "This example detaches the volume (``vol-049df61146c4d7901``) from the instance it is attached to.", + "input": { + "VolumeId": "vol-1234567890abcdef0" + }, + "output": { + "AttachTime": "2014-02-27T19:23:06.000Z", + "InstanceId": "i-1234567890abcdef0", + "VolumeId": "vol-049df61146c4d7901", + "State": "detaching", + "Device": "/dev/sdb" + } + } + ] } }, "com.amazonaws.ec2#DetachVolumeRequest": { @@ -39774,8 +40698,6 @@ "Force": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Forces detachment if the previous detachment attempt did not occur cleanly (for example,\n logging into an instance, unmounting the volume, and detaching normally). This option can lead\n to data loss or a corrupted file system. Use this option only as a last resort to detach a\n volume from a failed instance. The instance won't have an opportunity to flush file system\n caches or file system metadata. If you use this option, you must perform file system check and\n repair procedures.

" } }, @@ -39797,8 +40719,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39843,8 +40763,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -39920,7 +40838,7 @@ "target": "com.amazonaws.ec2#DhcpConfigurationValueList", "traits": { "aws.protocols#ec2QueryName": "ValueSet", - "smithy.api#documentation": "

One or more values for the DHCP option.

", + "smithy.api#documentation": "

The values for the DHCP option.

", "smithy.api#xmlName": "valueSet" } } @@ -39954,7 +40872,7 @@ "target": "com.amazonaws.ec2#DhcpConfigurationList", "traits": { "aws.protocols#ec2QueryName": "DhcpConfigurationSet", - "smithy.api#documentation": "

One or more DHCP options in the set.

", + "smithy.api#documentation": "

The DHCP options in the set.

", "smithy.api#xmlName": "dhcpConfigurationSet" } }, @@ -39984,7 +40902,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes a set of DHCP options.

" + "smithy.api#documentation": "

The set of DHCP options.

" } }, "com.amazonaws.ec2#DhcpOptionsId": { @@ -40064,8 +40982,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -40132,8 +41048,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -40149,8 +41063,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Output", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the unsubscribe action was successful.

", "smithy.api#xmlName": "output" } @@ -40178,8 +41090,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -40195,8 +41105,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsEncryptionByDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The updated status of encryption by default.

", "smithy.api#xmlName": "ebsEncryptionByDefault" } @@ -40232,16 +41140,12 @@ "Force": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Forces the image settings to turn off faster launching for your Windows AMI. This parameter overrides \n\t\t\tany errors that are encountered while cleaning up resources in your account.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -40289,8 +41193,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxParallelLaunches", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances that Amazon EC2 can launch at the same time to \n\t\t\tcreate pre-provisioned snapshots for Windows faster launching.

", "smithy.api#xmlName": "maxParallelLaunches" } @@ -40563,8 +41465,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -40597,6 +41497,60 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#DisableImage": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#DisableImageRequest" + }, + "output": { + "target": "com.amazonaws.ec2#DisableImageResult" + }, + "traits": { + "smithy.api#documentation": "

Sets the AMI state to disabled and removes all launch permissions from the\n AMI. A disabled AMI can't be used for instance launches.

\n

A disabled AMI can't be shared. If a public or shared AMI was previously shared, it is\n made private. If an AMI was shared with an Amazon Web Services account, organization, or Organizational\n Unit, they lose access to the disabled AMI.

\n

A disabled AMI does not appear in DescribeImages API calls by\n default.

\n

Only the AMI owner can disable an AMI.

\n

You can re-enable a disabled AMI using EnableImage.

\n

For more information, see Disable an AMI in the\n Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#DisableImageBlockPublicAccess": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccessRequest" + }, + "output": { + "target": "com.amazonaws.ec2#DisableImageBlockPublicAccessResult" + }, + "traits": { + "smithy.api#documentation": "

Disables block public access for AMIs at the account level in the\n specified Amazon Web Services Region. This removes the block public access restriction\n from your account. With the restriction removed, you can publicly share your AMIs in the\n specified Amazon Web Services Region.

\n

The API can take up to 10 minutes to configure this setting. During this time, if you run\n GetImageBlockPublicAccessState, the response will be\n block-new-sharing. When the API has completed the configuration, the response\n will be unblocked.

\n

For more information, see Block public access to your AMIs in\n the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#DisableImageBlockPublicAccessRequest": { + "type": "structure", + "members": { + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#DisableImageBlockPublicAccessResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessDisabledState", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

Returns unblocked if the request succeeds; otherwise, it returns an\n error.

", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#DisableImageDeprecation": { "type": "operation", "input": { @@ -40623,8 +41577,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -40640,8 +41592,44 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", + "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", + "smithy.api#xmlName": "return" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.ec2#DisableImageRequest": { + "type": "structure", + "members": { + "ImageId": { + "target": "com.amazonaws.ec2#ImageId", + "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, + "smithy.api#documentation": "

The ID of the AMI.

", + "smithy.api#required": {} + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#DisableImageResult": { + "type": "structure", + "members": { + "Return": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "Return", "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -40669,8 +41657,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -40694,8 +41680,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Success", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The result of disabling the IPAM account.

", "smithy.api#xmlName": "success" } @@ -40723,8 +41707,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -40740,8 +41722,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SerialConsoleAccessEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, access to the EC2 serial console of all instances is enabled for\n\t\t\tyour account. If false, access to the EC2 serial console of all instances\n\t\t\tis disabled for your account.

", "smithy.api#xmlName": "serialConsoleAccessEnabled" } @@ -40783,8 +41763,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -40824,7 +41802,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disables a virtual private gateway (VGW) from propagating routes to a specified route\n table of a VPC.

" + "smithy.api#documentation": "

Disables a virtual private gateway (VGW) from propagating routes to a specified route\n table of a VPC.

", + "smithy.api#examples": [ + { + "title": "To disable route propagation", + "documentation": "This example disables the specified virtual private gateway from propagating static routes to the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#DisableVgwRoutePropagationRequest": { @@ -40849,8 +41837,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -40869,7 +41855,7 @@ "target": "com.amazonaws.ec2#DisableVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "

Disables ClassicLink for a VPC. You cannot disable ClassicLink for a VPC that has EC2-Classic instances linked to it.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Disables ClassicLink for a VPC. You cannot disable ClassicLink for a VPC that has EC2-Classic instances\n linked to it.

" } }, "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupport": { @@ -40881,7 +41867,7 @@ "target": "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "

Disables ClassicLink DNS support for a VPC. If disabled, DNS hostnames resolve to\n\t\t\tpublic IP addresses when addressed between a linked EC2-Classic instance and instances\n\t\t\tin the VPC to which it's linked. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

\n

You must specify a VPC ID in the request.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Disables ClassicLink DNS support for a VPC. If disabled, DNS hostnames resolve to\n\t\t\tpublic IP addresses when addressed between a linked EC2-Classic instance and instances\n\t\t\tin the VPC to which it's linked.

\n

You must specify a VPC ID in the request.

" } }, "com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportRequest": { @@ -40906,8 +41892,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -40924,8 +41908,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -40952,8 +41934,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -40972,7 +41952,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disassociates an Elastic IP address from the instance or network interface it's associated with.

\n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2 doesn't return an error.

" + "smithy.api#documentation": "

Disassociates an Elastic IP address from the instance or network interface it's associated with.

\n

This is an idempotent operation. If you perform the operation more than once, Amazon EC2 doesn't return an error.

", + "smithy.api#examples": [ + { + "title": "To disassociate an Elastic IP address", + "documentation": "This example disassociates an Elastic IP address from an instance.", + "input": { + "AssociationId": "eipassoc-2bebb745" + } + } + ] } }, "com.amazonaws.ec2#DisassociateAddressRequest": { @@ -40994,8 +41983,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41039,8 +42026,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -41107,8 +42092,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -41124,8 +42107,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -41144,7 +42125,27 @@ "target": "com.amazonaws.ec2#DisassociateIamInstanceProfileResult" }, "traits": { - "smithy.api#documentation": "

Disassociates an IAM instance profile from a running or stopped instance.

\n

Use DescribeIamInstanceProfileAssociations to get the association\n ID.

" + "smithy.api#documentation": "

Disassociates an IAM instance profile from a running or stopped instance.

\n

Use DescribeIamInstanceProfileAssociations to get the association\n ID.

", + "smithy.api#examples": [ + { + "title": "To disassociate an IAM instance profile", + "documentation": "This example disassociates the specified IAM instance profile from an instance.", + "input": { + "AssociationId": "iip-assoc-05020b59952902f5f" + }, + "output": { + "IamInstanceProfileAssociation": { + "InstanceId": "i-123456789abcde123", + "State": "disassociating", + "AssociationId": "iip-assoc-05020b59952902f5f", + "IamInstanceProfile": { + "Id": "AIPAI5IVIHMFFYY2DKV5Y", + "Arn": "arn:aws:iam::123456789012:instance-profile/admin-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#DisassociateIamInstanceProfileRequest": { @@ -41197,8 +42198,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -41257,8 +42256,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -41300,7 +42297,7 @@ "target": "com.amazonaws.ec2#DisassociateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Disassociates secondary Elastic IP addresses (EIPs) from a public NAT gateway. You cannot disassociate your primary EIP. For more information, see Edit secondary IP address associations in the Amazon Virtual Private Cloud User Guide.

\n

While disassociating is in progress, you cannot associate/disassociate additional EIPs while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

An EIP will only be released at the end of MaxDrainDurationSeconds. The EIPs stay\n associated and support the existing connections but do not support any new connections\n (new connections are distributed across the remaining associated EIPs). As the existing\n connections drain out, the EIPs (and the corresponding private IPs mapped to them) get\n released.

" + "smithy.api#documentation": "

Disassociates secondary Elastic IP addresses (EIPs) from a public NAT gateway. \n You cannot disassociate your primary EIP. For more information, see Edit secondary IP address associations in the Amazon VPC User Guide.

\n

While disassociating is in progress, you cannot associate/disassociate additional EIPs while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

An EIP is released only at the end of MaxDrainDurationSeconds. It stays\n associated and supports the existing connections but does not support any new connections\n (new connections are distributed across the remaining associated EIPs). As the existing\n connections drain out, the EIPs (and the corresponding private IP addresses mapped to them) \n are released.

" } }, "com.amazonaws.ec2#DisassociateNatGatewayAddressRequest": { @@ -41310,7 +42307,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -41326,16 +42323,12 @@ "MaxDrainDurationSeconds": { "target": "com.amazonaws.ec2#DrainSeconds", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of time to wait (in seconds) before forcibly releasing the IP addresses if connections are still in progress. Default value is 350 seconds.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -41351,7 +42344,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -41377,7 +42370,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Disassociates a subnet or gateway from a route table.

\n

After you perform this action, the subnet no longer uses the routes in the route table.\n\t\t\t\tInstead, it uses the routes in the VPC's main route table. For more information\n\t\t\t\tabout route tables, see Route\n\t\t\t\ttables in the Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Disassociates a subnet or gateway from a route table.

\n

After you perform this action, the subnet no longer uses the routes in the route table.\n\t\t\t\tInstead, it uses the routes in the VPC's main route table. For more information\n\t\t\t\tabout route tables, see Route\n\t\t\t\ttables in the Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To disassociate a route table", + "documentation": "This example disassociates the specified route table from its associated subnet.", + "input": { + "AssociationId": "rtbassoc-781d0d1a" + } + } + ] } }, "com.amazonaws.ec2#DisassociateRouteTableRequest": { @@ -41397,8 +42399,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -41504,8 +42504,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -41564,8 +42562,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -41624,8 +42620,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -41683,8 +42677,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -41700,8 +42692,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -41841,8 +42831,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Size", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the disk image, in GiB.

", "smithy.api#xmlName": "size" } @@ -41860,7 +42848,6 @@ "traits": { "aws.protocols#ec2QueryName": "Bytes", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the disk image, in GiB.

", "smithy.api#required": {}, "smithy.api#xmlName": "bytes" @@ -41935,8 +42922,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Size", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "size" } @@ -42078,8 +43063,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PrivateDnsOnlyForInboundResolverEndpoint", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to enable private DNS only for inbound endpoints.

", "smithy.api#xmlName": "privateDnsOnlyForInboundResolverEndpoint" } @@ -42101,8 +43084,6 @@ "PrivateDnsOnlyForInboundResolverEndpoint": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to enable private DNS only for inbound endpoints. This option is\n available only for services that support both gateway and interface endpoints. It routes\n traffic that originates from the VPC to the gateway endpoint and traffic that originates\n from on-premises to the interface endpoint.

" } } @@ -42152,8 +43133,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether DNS servers should be used. Specify False to delete the existing DNS \n\t\t\tservers.

" } } @@ -42197,10 +43176,7 @@ } }, "com.amazonaws.ec2#Double": { - "type": "double", - "traits": { - "smithy.api#default": 0 - } + "type": "double" }, "com.amazonaws.ec2#DoubleWithConstraints": { "type": "double", @@ -42214,7 +43190,6 @@ "com.amazonaws.ec2#DrainSeconds": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 4000 @@ -42245,8 +43220,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is deleted on instance termination. For more\n information, see Preserving Amazon EBS volumes on instance termination in the\n Amazon EC2 User Guide.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -42255,8 +43228,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Iops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS). For gp3, io1, and io2 volumes,\n this represents the number of IOPS that are provisioned for the volume. For gp2\n volumes, this represents the baseline performance of the volume and the rate at which\n the volume accumulates I/O credits for bursting.

\n

The following are the supported values for each volume type:

\n
    \n
  • \n

    \n gp3: 3,000-16,000 IOPS

    \n
  • \n
  • \n

    \n io1: 100-64,000 IOPS

    \n
  • \n
  • \n

    \n io2: 100-64,000 IOPS

    \n
  • \n
\n

For io1 and io2 volumes, we guarantee 64,000 IOPS only for\n Instances built on the\n Nitro System. Other instance families guarantee performance up to\n 32,000 IOPS.

\n

This parameter is required for io1 and io2 volumes. The default for gp3 volumes\n is 3,000 IOPS. This parameter is not supported for gp2, st1, sc1, or standard\n volumes.

", "smithy.api#xmlName": "iops" } @@ -42273,8 +43244,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiBs. You must specify either a snapshot ID or a volume\n size. If you specify a snapshot, the default is the snapshot size. You can specify a\n volume size that is equal to or larger than the snapshot size.

\n

The following are the supported volumes sizes for each volume type:

\n
    \n
  • \n

    \n gp2 and gp3:1-16,384

    \n
  • \n
  • \n

    \n io1 and io2: 4-16,384

    \n
  • \n
  • \n

    \n st1 and sc1: 125-16,384

    \n
  • \n
  • \n

    \n standard: 1-1,024

    \n
  • \n
", "smithy.api#xmlName": "volumeSize" } @@ -42299,8 +43268,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Throughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput that the volume supports, in MiB/s.

\n

This parameter is valid only for gp3 volumes.

\n

Valid Range: Minimum value of 125. Maximum value of 1000.

", "smithy.api#xmlName": "throughput" } @@ -42309,7 +43276,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "OutpostArn", - "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored.

\n

This parameter is only supported on BlockDeviceMapping objects called by\n \n CreateImage.

", + "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored.

\n

This parameter is not supported when using CreateImage.

", "smithy.api#xmlName": "outpostArn" } }, @@ -42317,8 +43284,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the encryption state of an EBS volume is changed while being\n restored from a backing snapshot. The effect of setting the encryption state to true depends on \nthe volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. For more information, see Amazon EBS encryption in the Amazon EC2 User Guide.

\n

In no case can you remove encryption from an encrypted volume.

\n

Encrypted volumes can only be attached to instances that support Amazon EBS encryption. For\n more information, see Supported instance types.

\n

This parameter is not returned by DescribeImageAttribute.

\n

For CreateImage and RegisterImage, whether you can \n include this parameter, and the allowed values differ depending on the type of block \n device mapping you are creating.

\n
    \n
  • \n

    If you are creating a block device mapping for a new (empty) \n volume, you can include this parameter, and specify either true \n for an encrypted volume, or false for an unencrypted volume. If you omit \n this parameter, it defaults to false (unencrypted).

    \n
  • \n
  • \n

    If you are creating a block device mapping from an existing \n encrypted or unencrypted snapshot, you must omit this parameter. If you \n include this parameter, the request will fail, regardless of the value that you \n specify.

    \n
  • \n
  • \n

    If you are creating a block device mapping from an existing \n unencrypted volume, you can include this parameter, but you must specify \n false. If you specify true, the request will fail. In this \n case, we recommend that you omit the parameter.

    \n
  • \n
  • \n

    If you are creating a block device mapping from an existing \n encrypted volume, you can include this parameter, and specify either \n true or false. However, if you specify false, \n the parameter is ignored and the block device mapping is always encrypted. In this \n case, we recommend that you omit the parameter.

    \n
  • \n
", "smithy.api#xmlName": "encrypted" } @@ -42400,8 +43365,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is deleted on instance termination.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -42434,8 +43397,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is deleted on instance termination.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -42658,8 +43619,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PreserveClientIp", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether your client's IP address is preserved as the source. The value is true or false.

\n
    \n
  • \n

    If true, your client's IP address is used when you connect to a resource.

    \n
  • \n
  • \n

    If false, the elastic network interface IP address is used when you connect to a resource.

    \n
  • \n
\n

Default: true\n

", "smithy.api#xmlName": "preserveClientIp" } @@ -43061,8 +44020,6 @@ "Count": { "target": "com.amazonaws.ec2#ElasticInferenceAcceleratorCount", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

\n The number of elastic inference accelerators to attach to the instance. \n

\n

Default: 1

" } } @@ -43123,7 +44080,6 @@ "com.amazonaws.ec2#ElasticInferenceAcceleratorCount": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1 } @@ -43147,8 +44103,6 @@ "EnaSrdEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether ENA Express is enabled for the network interface.

" } }, @@ -43172,8 +44126,6 @@ "EnaSrdUdpEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether UDP traffic uses ENA Express. To specify this setting, you must first enable ENA Express.

" } } @@ -43239,8 +44191,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43307,8 +44257,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43324,8 +44272,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Output", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the subscribe action was successful.

", "smithy.api#xmlName": "output" } @@ -43353,8 +44299,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43370,8 +44314,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsEncryptionByDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The updated status of encryption by default.

", "smithy.api#xmlName": "ebsEncryptionByDefault" } @@ -43425,16 +44367,12 @@ "MaxParallelLaunches": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances that Amazon EC2 can launch at the same time to create \n\t\t\tpre-provisioned snapshots for Windows faster launching. Value must be \n\t\t\t6 or greater.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -43482,8 +44420,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxParallelLaunches", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances that Amazon EC2 can launch at the same time to \n\t\t\tcreate pre-provisioned snapshots for Windows faster launching.

", "smithy.api#xmlName": "maxParallelLaunches" } @@ -43756,8 +44692,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43790,6 +44724,68 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#EnableImage": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#EnableImageRequest" + }, + "output": { + "target": "com.amazonaws.ec2#EnableImageResult" + }, + "traits": { + "smithy.api#documentation": "

Re-enables a disabled AMI. The re-enabled AMI is marked as available and can\n be used for instance launches, appears in describe operations, and can be shared. Amazon Web Services\n accounts, organizations, and Organizational Units that lost access to the AMI when it was\n disabled do not regain access automatically. Once the AMI is available, it can be shared with\n them again.

\n

Only the AMI owner can re-enable a disabled AMI.

\n

For more information, see Disable an AMI in the\n Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#EnableImageBlockPublicAccess": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccessRequest" + }, + "output": { + "target": "com.amazonaws.ec2#EnableImageBlockPublicAccessResult" + }, + "traits": { + "smithy.api#documentation": "

Enables block public access for AMIs at the account level in the\n specified Amazon Web Services Region. This prevents the public sharing of your AMIs. However, if you already\n have public AMIs, they will remain publicly available.

\n

The API can take up to 10 minutes to configure this setting. During this time, if you run\n GetImageBlockPublicAccessState, the response will be unblocked. When\n the API has completed the configuration, the response will be\n block-new-sharing.

\n

For more information, see Block\n public access to your AMIs in the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#EnableImageBlockPublicAccessRequest": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#documentation": "

Specify block-new-sharing to enable block public access for AMIs at the\n account level in the specified Region. This will block any attempt to publicly share your AMIs\n in the specified Region.

", + "smithy.api#required": {} + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#EnableImageBlockPublicAccessResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

Returns block-new-sharing if the request succeeds; otherwise, it returns an\n error.

", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#EnableImageDeprecation": { "type": "operation", "input": { @@ -43824,8 +44820,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -43841,8 +44835,44 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", + "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", + "smithy.api#xmlName": "return" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.ec2#EnableImageRequest": { + "type": "structure", + "members": { + "ImageId": { + "target": "com.amazonaws.ec2#ImageId", + "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, + "smithy.api#documentation": "

The ID of the AMI.

", + "smithy.api#required": {} + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#EnableImageResult": { + "type": "structure", + "members": { + "Return": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "Return", "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -43870,8 +44900,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -43895,8 +44923,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Success", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The result of enabling the IPAM account.

", "smithy.api#xmlName": "success" } @@ -43924,8 +44950,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -43941,8 +44965,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReturnValue", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "returnValue" } @@ -43970,8 +44992,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -43987,8 +45007,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SerialConsoleAccessEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, access to the EC2 serial console of all instances is enabled for\n\t\t\tyour account. If false, access to the EC2 serial console of all instances\n\t\t\tis disabled for your account.

", "smithy.api#xmlName": "serialConsoleAccessEnabled" } @@ -44030,8 +45048,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -44071,7 +45087,17 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Enables a virtual private gateway (VGW) to propagate routes to the specified route\n table of a VPC.

" + "smithy.api#documentation": "

Enables a virtual private gateway (VGW) to propagate routes to the specified route\n table of a VPC.

", + "smithy.api#examples": [ + { + "title": "To enable route propagation", + "documentation": "This example enables the specified virtual private gateway to propagate static routes to the specified route table.", + "input": { + "RouteTableId": "rtb-22574640", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#EnableVgwRoutePropagationRequest": { @@ -44096,8 +45122,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -44116,7 +45140,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Enables I/O operations for a volume that had I/O operations disabled because the data on\n the volume was potentially inconsistent.

" + "smithy.api#documentation": "

Enables I/O operations for a volume that had I/O operations disabled because the data on\n the volume was potentially inconsistent.

", + "smithy.api#examples": [ + { + "title": "To enable I/O for a volume", + "documentation": "This example enables I/O on volume ``vol-1234567890abcdef0``.", + "input": { + "VolumeId": "vol-1234567890abcdef0" + } + } + ] } }, "com.amazonaws.ec2#EnableVolumeIORequest": { @@ -44126,8 +45159,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -44156,7 +45187,7 @@ "target": "com.amazonaws.ec2#EnableVpcClassicLinkResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Enables a VPC for ClassicLink. You can then link EC2-Classic instances to your\n\t\t\tClassicLink-enabled VPC to allow communication over private IP addresses. You cannot\n\t\t\tenable your VPC for ClassicLink if any of your VPC route tables have existing routes for\n\t\t\taddress ranges within the 10.0.0.0/8 IP address range, excluding local\n\t\t\troutes for VPCs in the 10.0.0.0/16 and 10.1.0.0/16 IP address\n\t\t\tranges. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Enables a VPC for ClassicLink. You can then link EC2-Classic instances to your\n\t\t\tClassicLink-enabled VPC to allow communication over private IP addresses. You cannot\n\t\t\tenable your VPC for ClassicLink if any of your VPC route tables have existing routes for\n\t\t\taddress ranges within the 10.0.0.0/8 IP address range, excluding local\n\t\t\troutes for VPCs in the 10.0.0.0/16 and 10.1.0.0/16 IP address\n\t\t\tranges.

" } }, "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupport": { @@ -44168,7 +45199,7 @@ "target": "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Enables a VPC to support DNS hostname resolution for ClassicLink. If enabled, the DNS\n\t\t\thostname of a linked EC2-Classic instance resolves to its private IP address when\n\t\t\taddressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n\t\t\tof an instance in a VPC resolves to its private IP address when addressed from a linked\n\t\t\tEC2-Classic instance. For more information, see ClassicLink in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

\n

You must specify a VPC ID in the request.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Enables a VPC to support DNS hostname resolution for ClassicLink. If enabled, the DNS\n\t\t\thostname of a linked EC2-Classic instance resolves to its private IP address when\n\t\t\taddressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\n\t\t\tof an instance in a VPC resolves to its private IP address when addressed from a linked\n\t\t\tEC2-Classic instance.

\n

You must specify a VPC ID in the request.

" } }, "com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportRequest": { @@ -44193,8 +45224,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -44211,8 +45240,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -44239,8 +45266,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -44257,8 +45282,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If this parameter is set to true, the instance is enabled for Amazon Web Services Nitro Enclaves; otherwise, it is not enabled for Amazon Web Services Nitro\n Enclaves.

", "smithy.api#xmlName": "enabled" } @@ -44274,8 +45297,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

To enable the instance for Amazon Web Services Nitro Enclaves, set this parameter to\n true.

" } } @@ -44465,7 +45486,7 @@ "min": 1, "max": 30 }, - "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*]+$" + "smithy.api#pattern": "^[a-zA-Z0-9\\.\\*\\-]+$" } }, "com.amazonaws.ec2#ExcludedInstanceTypeSet": { @@ -44635,8 +45656,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "LoadBalancerListenerPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The listener port of the load balancer.

", "smithy.api#xmlName": "loadBalancerListenerPort" } @@ -44669,8 +45688,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "LoadBalancerTargetPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target port.

", "smithy.api#xmlName": "loadBalancerTargetPort" } @@ -44727,8 +45744,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "Port", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port.

", "smithy.api#xmlName": "port" } @@ -44965,8 +45980,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -45025,8 +46038,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -45113,8 +46124,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -45614,8 +46623,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -45795,8 +46802,6 @@ "TargetResourceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of pre-provisioned snapshots to keep on hand for a fast-launch enabled Windows AMI.

" } } @@ -45812,8 +46817,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetResourceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of pre-provisioned snapshots requested to keep on hand for a fast-launch enabled Windows AMI.

", "smithy.api#xmlName": "targetResourceCount" } @@ -45980,8 +46983,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The first port in the range.

", "smithy.api#xmlName": "fromPort" } @@ -45990,8 +46991,6 @@ "target": "com.amazonaws.ec2#Port", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The last port in the range.

", "smithy.api#xmlName": "toPort" } @@ -46159,8 +47158,6 @@ "target": "com.amazonaws.ec2#Priority", "traits": { "aws.protocols#ec2QueryName": "Priority", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule priority.

", "smithy.api#xmlName": "priority" } @@ -46246,8 +47243,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of instances for which the Capacity Reservation reserves capacity.

", "smithy.api#xmlName": "totalInstanceCount" } @@ -46256,8 +47251,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "FulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of capacity units fulfilled by the Capacity Reservation. For more information, see \n\t\t\t\n\t\t\t\tTotal target capacity in the Amazon EC2 User Guide.

", "smithy.api#xmlName": "fulfilledCapacity" } @@ -46266,8 +47259,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Capacity Reservation reserves capacity for EBS-optimized instance types.

", "smithy.api#xmlName": "ebsOptimized" } @@ -46387,8 +47378,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "FulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units fulfilled by this request compared to the set target\n capacity.

", "smithy.api#xmlName": "fulfilledCapacity" } @@ -46397,8 +47386,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "FulfilledOnDemandCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units fulfilled by this request compared to the set target On-Demand\n capacity.

", "smithy.api#xmlName": "fulfilledOnDemandCapacity" } @@ -46423,8 +47410,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "TerminateInstancesWithExpiration", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether running instances should be terminated when the EC2 Fleet expires.

", "smithy.api#xmlName": "terminateInstancesWithExpiration" } @@ -46457,8 +47442,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReplaceUnhealthyInstances", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether EC2 Fleet should replace unhealthy Spot Instances. Supported only for\n fleets of type maintain. For more information, see EC2 Fleet\n health checks in the Amazon EC2 User Guide.

", "smithy.api#xmlName": "replaceUnhealthyInstances" } @@ -46491,7 +47474,7 @@ "target": "com.amazonaws.ec2#DescribeFleetsErrorSet", "traits": { "aws.protocols#ec2QueryName": "ErrorSet", - "smithy.api#documentation": "

Information about the instances that could not be launched by the fleet. Valid only when\n Type is set to instant.

", + "smithy.api#documentation": "

Information about the instances that could not be launched by the fleet. Valid only when\n Type is set to instant.

", "smithy.api#xmlName": "errorSet" } }, @@ -46499,7 +47482,7 @@ "target": "com.amazonaws.ec2#DescribeFleetsInstancesSet", "traits": { "aws.protocols#ec2QueryName": "FleetInstanceSet", - "smithy.api#documentation": "

Information about the instances that were launched by the fleet. Valid only when\n Type is set to instant.

", + "smithy.api#documentation": "

Information about the instances that were launched by the fleet. Valid only when\n Type is set to instant.

", "smithy.api#xmlName": "fleetInstanceSet" } }, @@ -46683,8 +47666,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "WeightedCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units provided by the specified instance type.

", "smithy.api#xmlName": "weightedCapacity" } @@ -46693,8 +47674,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Priority", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The priority for the launch template override. The highest priority is launched\n first.

\n

If the On-Demand AllocationStrategy is set to prioritized,\n EC2 Fleet uses priority to determine which launch template override to use first in fulfilling\n On-Demand capacity.

\n

If the Spot AllocationStrategy is set to\n capacity-optimized-prioritized, EC2 Fleet uses priority on a best-effort basis\n to determine which launch template override to use in fulfilling Spot capacity, but\n optimizes for capacity first.

\n

Valid values are whole numbers starting at 0. The lower the number, the\n higher the priority. If no number is set, the override has the lowest priority. You can set\n the same priority for different launch template overrides.

", "smithy.api#xmlName": "priority" } @@ -46719,7 +47698,7 @@ "target": "com.amazonaws.ec2#ImageId", "traits": { "aws.protocols#ec2QueryName": "ImageId", - "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. The AMI ID must be specified here or in the launch template.

", + "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. This parameter is only\n available for fleets of type instant. For fleets of type maintain\n and request, you must specify the AMI ID in the launch template.

", "smithy.api#xmlName": "imageId" } } @@ -46776,16 +47755,12 @@ "WeightedCapacity": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units provided by the specified instance type.

" } }, "Priority": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The priority for the launch template override. The highest priority is launched\n first.

\n

If the On-Demand AllocationStrategy is set to prioritized,\n EC2 Fleet uses priority to determine which launch template override to use first in fulfilling\n On-Demand capacity.

\n

If the Spot AllocationStrategy is set to\n capacity-optimized-prioritized, EC2 Fleet uses priority on a best-effort basis\n to determine which launch template override to use in fulfilling Spot capacity, but\n optimizes for capacity first.

\n

Valid values are whole numbers starting at 0. The lower the number, the\n higher the priority. If no number is set, the launch template override has the lowest\n priority. You can set the same priority for different launch template overrides.

" } }, @@ -46804,7 +47779,7 @@ "ImageId": { "target": "com.amazonaws.ec2#ImageId", "traits": { - "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. The AMI ID must be specified here or in the launch template.

" + "smithy.api#documentation": "

The ID of the AMI. An AMI is required to launch an instance. This parameter is only\n available for fleets of type instant. For fleets of type maintain\n and request, you must specify the AMI ID in the launch template.

" } } }, @@ -46928,8 +47903,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TerminationDelay", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\n Instance after launching a new replacement Spot Instance.

\n

Required when ReplacementStrategy is set to launch-before-terminate.

\n

Not valid when ReplacementStrategy is set to launch.

\n

Valid values: Minimum value of 120 seconds. Maximum value of 7200 seconds.

", "smithy.api#xmlName": "terminationDelay" } @@ -46951,8 +47924,6 @@ "TerminationDelay": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\n Instance after launching a new replacement Spot Instance.

\n

Required when ReplacementStrategy is set to launch-before-terminate.

\n

Not valid when ReplacementStrategy is set to launch.

\n

Valid values: Minimum value of 120 seconds. Maximum value of 7200 seconds.

" } } @@ -47062,10 +48033,7 @@ } }, "com.amazonaws.ec2#Float": { - "type": "float", - "traits": { - "smithy.api#default": 0 - } + "type": "float" }, "com.amazonaws.ec2#FlowLog": { "type": "structure", @@ -47186,8 +48154,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxAggregationInterval", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum interval of time, in seconds, during which a flow of packets is captured and aggregated into a flow log record.

\n

When a network interface is attached to a Nitro-based\n instance, the aggregation interval is always 60 seconds (1 minute) or less,\n regardless of the specified value.

\n

Valid Values: 60 | 600\n

", "smithy.api#xmlName": "maxAggregationInterval" } @@ -47458,8 +48424,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Public", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the AFI is public.

", "smithy.api#xmlName": "public" } @@ -47468,8 +48432,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DataRetentionSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether data retention support is enabled for the AFI.

", "smithy.api#xmlName": "dataRetentionSupport" } @@ -47740,8 +48702,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -47804,16 +48764,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#Ipv6PoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -47889,8 +48845,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -47903,8 +48857,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -47969,16 +48921,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetCapacityReservationUsageRequestMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

\n

Valid range: Minimum value of 1. Maximum value of 1000.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -47990,7 +48938,6 @@ "com.amazonaws.ec2#GetCapacityReservationUsageRequestMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -48028,8 +48975,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances for which the Capacity Reservation reserves capacity.

", "smithy.api#xmlName": "totalInstanceCount" } @@ -48038,8 +48983,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The remaining capacity. Indicates the number of instances that can be launched in the Capacity Reservation.

", "smithy.api#xmlName": "availableInstanceCount" } @@ -48098,8 +49041,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#CoipPoolMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -48112,8 +49053,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -48163,7 +49102,21 @@ "target": "com.amazonaws.ec2#GetConsoleOutputResult" }, "traits": { - "smithy.api#documentation": "

Gets the console output for the specified instance. For Linux instances, the instance\n console output displays the exact console output that would normally be displayed on a\n physical monitor attached to a computer. For Windows instances, the instance console\n output includes the last three system event log errors.

\n

By default, the console output returns buffered information that was posted shortly\n after an instance transition state (start, stop, reboot, or terminate). This information\n is available for at least one hour after the most recent post. Only the most recent 64\n KB of console output is available.

\n

You can optionally retrieve the latest serial console output at any time during the\n instance lifecycle. This option is supported on instance types that use the Nitro\n hypervisor.

\n

For more information, see Instance\n console output in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Gets the console output for the specified instance. For Linux instances, the instance\n console output displays the exact console output that would normally be displayed on a\n physical monitor attached to a computer. For Windows instances, the instance console\n output includes the last three system event log errors.

\n

By default, the console output returns buffered information that was posted shortly\n after an instance transition state (start, stop, reboot, or terminate). This information\n is available for at least one hour after the most recent post. Only the most recent 64\n KB of console output is available.

\n

You can optionally retrieve the latest serial console output at any time during the\n instance lifecycle. This option is supported on instance types that use the Nitro\n hypervisor.

\n

For more information, see Instance\n console output in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To get the console output", + "documentation": "This example gets the console output for the specified instance.", + "input": { + "InstanceId": "i-1234567890abcdef0" + }, + "output": { + "InstanceId": "i-1234567890abcdef0", + "Output": "...", + "Timestamp": "2018-05-25T21:23:53.000Z" + } + } + ] } }, "com.amazonaws.ec2#GetConsoleOutputRequest": { @@ -48181,8 +49134,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -48190,8 +49141,6 @@ "Latest": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

When enabled, retrieves the latest console output for the instance.

\n

Default: disabled (false)

" } } @@ -48250,8 +49199,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -48266,8 +49213,6 @@ "WakeUp": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

When set to true, acts as keystroke input and wakes up an instance that's\n in standby or \"sleep\" mode.

" } } @@ -48318,8 +49263,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -48370,8 +49313,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -48414,8 +49355,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -48431,11 +49370,17 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsEncryptionByDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether encryption by default is enabled.

", "smithy.api#xmlName": "ebsEncryptionByDefault" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -48451,7 +49396,7 @@ "target": "com.amazonaws.ec2#GetFlowLogsIntegrationTemplateResult" }, "traits": { - "smithy.api#documentation": "

Generates a CloudFormation template that streamlines and automates the integration of VPC flow logs \n with Amazon Athena. This make it easier for you to query and gain insights from VPC flow logs data. \n Based on the information that you provide, we configure resources in the template to do the following:

\n
    \n
  • \n

    Create a table in Athena that maps fields to a custom log format

    \n
  • \n
  • \n

    Create a Lambda function that updates the table with new partitions on a daily, weekly, or\n monthly basis

    \n
  • \n
  • \n

    Create a table partitioned between two timestamps in the past

    \n
  • \n
  • \n

    Create a set of named queries in Athena that you can use to get started quickly

    \n
  • \n
" + "smithy.api#documentation": "

Generates a CloudFormation template that streamlines and automates the integration of VPC flow logs \n with Amazon Athena. This make it easier for you to query and gain insights from VPC flow logs data. \n Based on the information that you provide, we configure resources in the template to do the following:

\n
    \n
  • \n

    Create a table in Athena that maps fields to a custom log format

    \n
  • \n
  • \n

    Create a Lambda function that updates the table with new partitions on a daily, weekly, or\n monthly basis

    \n
  • \n
  • \n

    Create a table partitioned between two timestamps in the past

    \n
  • \n
  • \n

    Create a set of named queries in Athena that you can use to get started quickly

    \n
  • \n
\n \n

\n GetFlowLogsIntegrationTemplate does not support integration between\n Amazon Web Services Transit Gateway Flow Logs and Amazon Athena.

\n
" } }, "com.amazonaws.ec2#GetFlowLogsIntegrationTemplateRequest": { @@ -48460,8 +49405,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -48549,16 +49492,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetGroupsForCapacityReservationRequestMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned nextToken value. This value can be between 5 and 500. If maxResults is given a larger value than 500, you receive an error.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -48570,7 +49509,6 @@ "com.amazonaws.ec2#GetGroupsForCapacityReservationRequestMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -48677,6 +49615,48 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#GetImageBlockPublicAccessState": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessStateRequest" + }, + "output": { + "target": "com.amazonaws.ec2#GetImageBlockPublicAccessStateResult" + }, + "traits": { + "smithy.api#documentation": "

Gets the current state of block public access for AMIs at the account\n level in the specified Amazon Web Services Region.

\n

For more information, see Block\n public access to your AMIs in the Amazon EC2 User Guide.

" + } + }, + "com.amazonaws.ec2#GetImageBlockPublicAccessStateRequest": { + "type": "structure", + "members": { + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#GetImageBlockPublicAccessStateResult": { + "type": "structure", + "members": { + "ImageBlockPublicAccessState": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "ImageBlockPublicAccessState", + "smithy.api#documentation": "

The current state of block public access for AMIs at the account level in the specified\n Amazon Web Services Region.

\n

Possible values:

\n
    \n
  • \n

    \n block-new-sharing - Any attempt to publicly share your AMIs in the\n specified Region is blocked.

    \n
  • \n
  • \n

    \n unblocked - Your AMIs in the specified Region can be publicly\n shared.

    \n
  • \n
", + "smithy.api#xmlName": "imageBlockPublicAccessState" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirements": { "type": "operation", "input": { @@ -48701,8 +49681,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -48735,8 +49713,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -48802,8 +49778,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -48860,8 +49834,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -48902,8 +49874,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamAddressHistoryMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of historical results you would like returned per page. Defaults to 100.

" } }, @@ -48966,8 +49936,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -49003,8 +49971,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of discovered accounts to return in one page of results.

" } } @@ -49061,8 +50027,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -49098,8 +50062,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of discovered resource CIDRs to return in one page of results.

" } } @@ -49153,7 +50115,6 @@ "com.amazonaws.ec2#GetIpamPoolAllocationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1000, "max": 100000 @@ -49166,8 +50127,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -49195,8 +50154,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetIpamPoolAllocationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results you would like returned per page.

" } }, @@ -49259,8 +50216,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -49282,8 +50237,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -49346,8 +50299,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -49361,8 +50312,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#IpamMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return in the request.

" } }, @@ -49448,7 +50397,66 @@ "target": "com.amazonaws.ec2#GetLaunchTemplateDataResult" }, "traits": { - "smithy.api#documentation": "

Retrieves the configuration data of the specified instance. You can use this data to\n create a launch template.

\n

This action calls on other describe actions to get instance information. Depending on\n your instance configuration, you may need to allow the following actions in your IAM\n policy: DescribeSpotInstanceRequests,\n DescribeInstanceCreditSpecifications, DescribeVolumes,\n DescribeInstanceAttribute, and DescribeElasticGpus. Or,\n you can allow describe* depending on your instance requirements.

" + "smithy.api#documentation": "

Retrieves the configuration data of the specified instance. You can use this data to\n create a launch template.

\n

This action calls on other describe actions to get instance information. Depending on\n your instance configuration, you may need to allow the following actions in your IAM\n policy: DescribeSpotInstanceRequests,\n DescribeInstanceCreditSpecifications, DescribeVolumes,\n DescribeInstanceAttribute, and DescribeElasticGpus. Or,\n you can allow describe* depending on your instance requirements.

", + "smithy.api#examples": [ + { + "title": "To get the launch template data for an instance ", + "documentation": "This example gets the launch template data for the specified instance.", + "input": { + "InstanceId": "0123d646e8048babc" + }, + "output": { + "LaunchTemplateData": { + "NetworkInterfaces": [ + { + "DeviceIndex": 0, + "Groups": [ + "sg-d14e1bb4" + ], + "Ipv6Addresses": [], + "AssociatePublicIpAddress": false, + "NetworkInterfaceId": "eni-4338b5a9", + "DeleteOnTermination": true, + "Description": "", + "PrivateIpAddress": "10.0.3.233", + "SubnetId": "subnet-5264e837", + "PrivateIpAddresses": [ + { + "PrivateIpAddress": "10.0.3.233", + "Primary": true + } + ] + } + ], + "Placement": { + "GroupName": "", + "Tenancy": "default", + "AvailabilityZone": "us-east-2b" + }, + "InstanceType": "t2.medium", + "EbsOptimized": false, + "BlockDeviceMappings": [ + { + "Ebs": { + "VolumeType": "gp2", + "Encrypted": false, + "Iops": 100, + "VolumeSize": 8, + "SnapshotId": "snap-02594938353ef77d3", + "DeleteOnTermination": true + }, + "DeviceName": "/dev/xvda" + } + ], + "KeyName": "my-key-pair", + "ImageId": "ami-32cf7b4a", + "Monitoring": { + "Enabled": false + } + } + } + } + ] } }, "com.amazonaws.ec2#GetLaunchTemplateDataRequest": { @@ -49457,8 +50465,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -49512,7 +50518,6 @@ "com.amazonaws.ec2#GetManagedPrefixListAssociationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 255 @@ -49525,8 +50530,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -49541,8 +50544,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetManagedPrefixListAssociationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -49605,8 +50606,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -49621,16 +50620,12 @@ "TargetVersion": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version of the prefix list for which to return the entries. The default is the current version.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#PrefixListMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -49701,8 +50696,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#NetworkInsightsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n To retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -49715,8 +50708,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -49791,8 +50782,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -49861,8 +50850,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -49884,7 +50871,7 @@ } }, "PasswordData": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#PasswordData", "traits": { "aws.protocols#ec2QueryName": "PasswordData", "smithy.api#documentation": "

The password of the instance. Returns an empty string if the password is not\n available.

", @@ -49922,8 +50909,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -49964,8 +50949,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsValidExchange", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, the exchange is valid. If false, the exchange cannot be completed.

", "smithy.api#xmlName": "isValidExchange" } @@ -50032,6 +51015,98 @@ "smithy.api#output": {} } }, + "com.amazonaws.ec2#GetSecurityGroupsForVpc": { + "type": "operation", + "input": { + "target": "com.amazonaws.ec2#GetSecurityGroupsForVpcRequest" + }, + "output": { + "target": "com.amazonaws.ec2#GetSecurityGroupsForVpcResult" + }, + "traits": { + "smithy.api#documentation": "

Gets security groups that can be associated by the Amazon Web Services account making the request with network interfaces in the specified VPC.

", + "smithy.api#paginated": { + "inputToken": "NextToken", + "outputToken": "NextToken", + "items": "SecurityGroupForVpcs", + "pageSize": "MaxResults" + } + } + }, + "com.amazonaws.ec2#GetSecurityGroupsForVpcRequest": { + "type": "structure", + "members": { + "VpcId": { + "target": "com.amazonaws.ec2#VpcId", + "traits": { + "smithy.api#clientOptional": {}, + "smithy.api#documentation": "

The VPC ID where the security group can be used.

", + "smithy.api#required": {} + } + }, + "NextToken": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.

" + } + }, + "MaxResults": { + "target": "com.amazonaws.ec2#GetSecurityGroupsForVpcRequestMaxResults", + "traits": { + "smithy.api#documentation": "

The maximum number of items to return for this request.\n\tTo get the next page of items, make another request with the token returned in the output.\n\tFor more information, see Pagination.

" + } + }, + "Filters": { + "target": "com.amazonaws.ec2#FilterList", + "traits": { + "smithy.api#documentation": "

The filters. If using multiple filters, the results include security groups which match all filters.

\n
    \n
  • \n

    \n group-id: The security group ID.

    \n
  • \n
  • \n

    \n description: The security group's description.

    \n
  • \n
  • \n

    \n group-name: The security group name.

    \n
  • \n
  • \n

    \n owner-id: The security group owner ID.

    \n
  • \n
  • \n

    \n primary-vpc-id: The VPC ID in which the security group was created.

    \n
  • \n
", + "smithy.api#xmlName": "Filter" + } + }, + "DryRun": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ec2#GetSecurityGroupsForVpcRequestMaxResults": { + "type": "integer", + "traits": { + "smithy.api#range": { + "min": 5, + "max": 1000 + } + } + }, + "com.amazonaws.ec2#GetSecurityGroupsForVpcResult": { + "type": "structure", + "members": { + "NextToken": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "NextToken", + "smithy.api#documentation": "

The token to include in another request to get the next page of items. This value is null when there are no more items to return.

", + "smithy.api#xmlName": "nextToken" + } + }, + "SecurityGroupForVpcs": { + "target": "com.amazonaws.ec2#SecurityGroupForVpcList", + "traits": { + "aws.protocols#ec2QueryName": "SecurityGroupForVpcSet", + "smithy.api#documentation": "

The security group that can be used by interfaces in the VPC.

", + "smithy.api#xmlName": "securityGroupForVpcSet" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, "com.amazonaws.ec2#GetSerialConsoleAccessStatus": { "type": "operation", "input": { @@ -50050,8 +51125,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -50067,8 +51140,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SerialConsoleAccessEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, access to the EC2 serial console of all instances is enabled for\n\t\t\tyour account. If false, access to the EC2 serial console of all instances\n\t\t\tis disabled for your account.

", "smithy.api#xmlName": "serialConsoleAccessEnabled" } @@ -50110,7 +51181,6 @@ "target": "com.amazonaws.ec2#SpotPlacementScoresTargetCapacity", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target capacity.

", "smithy.api#required": {} } @@ -50124,8 +51194,6 @@ "SingleAvailabilityZone": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specify true so that the response returns a list of scored Availability Zones.\n Otherwise, the response returns a list of scored Regions.

\n

A list of scored Availability Zones is useful if you want to launch all of your Spot\n capacity into a single Availability Zone.

" } }, @@ -50145,16 +51213,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "MaxResults": { "target": "com.amazonaws.ec2#SpotPlacementScoresMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of items to return for this request.\n To get the next page of items, make another request with the token returned in the output.\n\t For more information, see Pagination.

" } }, @@ -50208,7 +51272,6 @@ "com.amazonaws.ec2#GetSubnetCidrReservationsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -50236,8 +51299,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -50250,8 +51311,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#GetSubnetCidrReservationsMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } } @@ -50331,8 +51390,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50345,8 +51402,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50418,8 +51473,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50432,8 +51485,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50505,8 +51556,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50519,8 +51568,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50586,8 +51633,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50600,8 +51645,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50665,8 +51708,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50679,8 +51720,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50752,8 +51791,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50766,8 +51803,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50839,8 +51874,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -50853,8 +51886,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50913,8 +51944,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50930,8 +51959,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PolicyEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The status of the Verified Access policy.

", "smithy.api#xmlName": "policyEnabled" } @@ -50975,8 +52002,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -50992,8 +52017,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PolicyEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The status of the Verified Access policy.

", "smithy.api#xmlName": "policyEnabled" } @@ -51051,8 +52074,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -51113,8 +52134,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -51181,8 +52200,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -51427,15 +52444,13 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Configured", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

If this parameter is set to true, your instance is enabled for\n hibernation; otherwise, it is not enabled for hibernation.

", + "smithy.api#documentation": "

If true, your instance is enabled for hibernation; otherwise, it is not\n enabled for hibernation.

", "smithy.api#xmlName": "configured" } } }, "traits": { - "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#HibernationOptionsRequest": { @@ -51444,14 +52459,12 @@ "Configured": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

If you set this parameter to true, your instance is enabled for\n hibernation.

\n

Default: false\n

" + "smithy.api#documentation": "

Set to true to enable your instance for hibernation.

\n

For Spot Instances, if you set Configured to true, either\n omit the InstanceInterruptionBehavior parameter (for \n SpotMarketOptions\n ), or set it to\n hibernate. When Configured is true:

\n
    \n
  • \n

    If you omit InstanceInterruptionBehavior, it defaults to\n hibernate.

    \n
  • \n
  • \n

    If you set InstanceInterruptionBehavior to a value other than\n hibernate, you'll get an error.

    \n
  • \n
\n

Default: false\n

" } } }, "traits": { - "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Indicates whether your instance is configured for hibernation. This parameter is valid\n only if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#HistoryRecord": { @@ -51671,8 +52684,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "MemberOfServiceLinkedResourceGroup", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Dedicated Host is in a host resource group. If memberOfServiceLinkedResourceGroup is true, the\n host is in a host resource group; otherwise, it is not.

", "smithy.api#xmlName": "memberOfServiceLinkedResourceGroup" } @@ -51692,6 +52703,14 @@ "smithy.api#documentation": "

Indicates whether host maintenance is enabled or disabled for the Dedicated\n Host.

", "smithy.api#xmlName": "hostMaintenance" } + }, + "AssetId": { + "target": "com.amazonaws.ec2#AssetId", + "traits": { + "aws.protocols#ec2QueryName": "AssetId", + "smithy.api#documentation": "

The ID of the Outpost hardware asset on which the Dedicated Host is allocated.

", + "smithy.api#xmlName": "assetId" + } } }, "traits": { @@ -51780,8 +52799,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The duration of the offering (in seconds).

", "smithy.api#xmlName": "duration" } @@ -51847,8 +52864,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Cores", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of cores on the Dedicated Host.

", "smithy.api#xmlName": "cores" } @@ -51873,8 +52888,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Sockets", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of sockets on the Dedicated Host.

", "smithy.api#xmlName": "sockets" } @@ -51883,8 +52896,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalVCpus", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of vCPUs on the Dedicated Host.

", "smithy.api#xmlName": "totalVCpus" } @@ -51918,8 +52929,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Count", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Dedicated Hosts the reservation is associated with.

", "smithy.api#xmlName": "count" } @@ -51936,8 +52945,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The length of the reservation's term, specified in seconds. Can be 31536000 (1\n year) | 94608000 (3 years).

", "smithy.api#xmlName": "duration" } @@ -52093,7 +53100,6 @@ "com.amazonaws.ec2#Hour": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 23 @@ -52326,8 +53332,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Code", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ICMP code. A value of -1 means all codes for the specified ICMP type.

", "smithy.api#xmlName": "code" } @@ -52336,8 +53340,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Type", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ICMP type. A value of -1 means all types.

", "smithy.api#xmlName": "type" } @@ -52370,8 +53372,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "UseLongIds", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether longer IDs (17-character IDs) are enabled for the resource.

", "smithy.api#xmlName": "useLongIds" } @@ -52454,8 +53454,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsPublic", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the image has public launch permissions. The value is true if\n\t\t\t\tthis image has public launch permissions or false\n\t\t\t\tif it has only implicit and explicit launch permissions.

", "smithy.api#xmlName": "isPublic" } @@ -52544,8 +53542,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether enhanced networking with ENA is enabled.

", "smithy.api#xmlName": "enaSupport" } @@ -52554,7 +53550,7 @@ "target": "com.amazonaws.ec2#HypervisorType", "traits": { "aws.protocols#ec2QueryName": "Hypervisor", - "smithy.api#documentation": "

The hypervisor type of the image.

", + "smithy.api#documentation": "

The hypervisor type of the image. Only xen is supported. ovm is\n not supported.

", "smithy.api#xmlName": "hypervisor" } }, @@ -52653,6 +53649,14 @@ "smithy.api#documentation": "

If v2.0, it indicates that IMDSv2 is specified in the AMI. Instances launched\n from this AMI will have HttpTokens automatically set to required so\n that, by default, the instance requires that IMDSv2 is used when requesting instance metadata.\n In addition, HttpPutResponseHopLimit is set to 2. For more\n information, see Configure\n the AMI in the Amazon EC2 User Guide.

", "smithy.api#xmlName": "imdsSupport" } + }, + "SourceInstanceId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "SourceInstanceId", + "smithy.api#documentation": "

The ID of the instance that the AMI was created from if the AMI was created using CreateImage. This field only appears if the AMI was created using\n CreateImage.

", + "smithy.api#xmlName": "sourceInstanceId" + } } }, "traits": { @@ -52848,6 +53852,28 @@ } } }, + "com.amazonaws.ec2#ImageBlockPublicAccessDisabledState": { + "type": "enum", + "members": { + "unblocked": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unblocked" + } + } + } + }, + "com.amazonaws.ec2#ImageBlockPublicAccessEnabledState": { + "type": "enum", + "members": { + "block_new_sharing": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "block-new-sharing" + } + } + } + }, "com.amazonaws.ec2#ImageDiskContainer": { "type": "structure", "members": { @@ -53032,6 +54058,12 @@ "traits": { "smithy.api#enumValue": "error" } + }, + "disabled": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "disabled" + } } } }, @@ -53103,8 +54135,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -53120,8 +54150,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -53228,16 +54256,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "Encrypted": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether the destination AMI of the imported image should be encrypted. The default KMS key for EBS is used\n unless you specify a non-default KMS key using KmsKeyId. For more information, see Amazon EBS Encryption in the\n Amazon Elastic Compute Cloud User Guide.

" } }, @@ -53250,7 +54274,7 @@ "KmsKeyId": { "target": "com.amazonaws.ec2#KmsKeyId", "traits": { - "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted AMI. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the AMI is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" + "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted AMI. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the AMI is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" } }, "LicenseType": { @@ -53262,7 +54286,7 @@ "Platform": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The operating system of the virtual machine.

\n

Valid values: Windows | Linux\n

" + "smithy.api#documentation": "

The operating system of the virtual machine. If you import a VM that is compatible with\n Unified Extensible Firmware Interface (UEFI) using an EBS snapshot, you must specify a value for\n the platform.

\n

Valid values: Windows | Linux\n

" } }, "RoleName": { @@ -53293,7 +54317,7 @@ "BootMode": { "target": "com.amazonaws.ec2#BootModeValues", "traits": { - "smithy.api#documentation": "

The boot mode of the virtual machine.

" + "smithy.api#documentation": "

The boot mode of the virtual machine.

\n \n

The uefi-preferred boot mode isn't supported for importing images. For more\n information, see Boot modes in\n the VM Import/Export User Guide.

\n
" } } }, @@ -53324,8 +54348,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the AMI is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -53462,8 +54484,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the image is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -53606,7 +54626,7 @@ "target": "com.amazonaws.ec2#ImportInstanceResult" }, "traits": { - "smithy.api#documentation": "

Creates an import instance task using metadata from the specified disk image.

\n

This API action supports only single-volume VMs. To import multi-volume VMs, use ImportImage\n instead.

\n

This API action is not supported by the Command Line Interface (CLI). For \n information about using the Amazon EC2 CLI, which is deprecated, see\n Importing a VM to Amazon EC2 in the Amazon EC2 CLI Reference PDF file.

\n

For information about the import manifest referenced by this API action, see VM Import Manifest.

" + "smithy.api#documentation": "\n

We recommend that you use the \n ImportImage\n \n API. For more information, see Importing a VM as an image using VM\n Import/Export in the VM Import/Export User Guide.

\n
\n

Creates an import instance task using metadata from the specified disk image.

\n

This API action is not supported by the Command Line Interface (CLI). For\n information about using the Amazon EC2 CLI, which is deprecated, see Importing\n a VM to Amazon EC2 in the Amazon EC2 CLI Reference PDF file.

\n

This API action supports only single-volume VMs. To import multi-volume VMs, use ImportImage\n instead.

\n

For information about the import manifest referenced by this API action, see VM Import Manifest.

" } }, "com.amazonaws.ec2#ImportInstanceLaunchSpecification": { @@ -53662,8 +54682,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Monitoring", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether monitoring is enabled.

", "smithy.api#xmlName": "monitoring" } @@ -53728,8 +54746,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -53828,8 +54844,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "BytesConverted", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of bytes converted so far.

", "smithy.api#xmlName": "bytesConverted" } @@ -53907,8 +54921,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -54033,23 +55045,19 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "Encrypted": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether the destination snapshot of the imported image should be encrypted. The default KMS key for EBS is\n used unless you specify a non-default KMS key using KmsKeyId. For more information, see Amazon EBS Encryption in the\n Amazon Elastic Compute Cloud User Guide.

" } }, "KmsKeyId": { "target": "com.amazonaws.ec2#KmsKeyId", "traits": { - "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted snapshot. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the snapshot is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" + "smithy.api#documentation": "

An identifier for the symmetric KMS key to use when creating the\n encrypted snapshot. This parameter is only required if you want to use a non-default KMS key; if this\n parameter is not specified, the default KMS key for EBS is used. If a KmsKeyId is\n specified, the Encrypted flag must also be set.

\n

The KMS key identifier may be provided in any of the following formats:

\n
    \n
  • \n

    Key ID

    \n
  • \n
  • \n

    Key alias

    \n
  • \n
  • \n

    ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the key namespace, and then the key ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.

    \n
  • \n
  • \n

    ARN using key alias. The alias ARN contains the arn:aws:kms namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the alias namespace, and then the key alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.

    \n
  • \n
\n

Amazon Web Services parses KmsKeyId asynchronously, meaning that the action you call may appear to complete even\n though you provided an invalid identifier. This action will eventually report failure.

\n

The specified KMS key must exist in the Region that the snapshot is being copied to.

\n

Amazon EBS does not support asymmetric KMS keys.

" } }, "RoleName": { @@ -54220,8 +55228,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -54282,8 +55288,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "BytesConverted", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of bytes converted so far.

", "smithy.api#xmlName": "bytesConverted" } @@ -54327,6 +55331,14 @@ "smithy.api#documentation": "

Describes the Inference accelerators for the instance type.

", "smithy.api#xmlName": "accelerators" } + }, + "TotalInferenceMemoryInMiB": { + "target": "com.amazonaws.ec2#totalInferenceMemory", + "traits": { + "aws.protocols#ec2QueryName": "TotalInferenceMemoryInMiB", + "smithy.api#documentation": "

The total size of the memory for the inference accelerators for the instance type, in MiB.

", + "smithy.api#xmlName": "totalInferenceMemoryInMiB" + } } }, "traits": { @@ -54362,6 +55374,14 @@ "smithy.api#documentation": "

The manufacturer of the Inference accelerator.

", "smithy.api#xmlName": "manufacturer" } + }, + "MemoryInfo": { + "target": "com.amazonaws.ec2#InferenceDeviceMemoryInfo", + "traits": { + "aws.protocols#ec2QueryName": "MemoryInfo", + "smithy.api#documentation": "

Describes the memory available to the inference accelerator.

", + "smithy.api#xmlName": "memoryInfo" + } } }, "traits": { @@ -54377,6 +55397,25 @@ "com.amazonaws.ec2#InferenceDeviceManufacturerName": { "type": "string" }, + "com.amazonaws.ec2#InferenceDeviceMemoryInfo": { + "type": "structure", + "members": { + "SizeInMiB": { + "target": "com.amazonaws.ec2#InferenceDeviceMemorySize", + "traits": { + "aws.protocols#ec2QueryName": "SizeInMiB", + "smithy.api#documentation": "

The size of the memory available to the inference accelerator, in MiB.

", + "smithy.api#xmlName": "sizeInMiB" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the memory available to the inference accelerator.

" + } + }, + "com.amazonaws.ec2#InferenceDeviceMemorySize": { + "type": "integer" + }, "com.amazonaws.ec2#InferenceDeviceName": { "type": "string" }, @@ -54396,8 +55435,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AmiLaunchIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The AMI launch index, which can be used to find this instance in the launch\n group.

", "smithy.api#xmlName": "amiLaunchIndex" } @@ -54582,8 +55619,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\n provides dedicated throughput to Amazon EBS and an optimized configuration stack to\n provide optimal I/O performance. This optimization isn't available with all instance\n types. Additional usage charges apply when using an EBS Optimized instance.

", "smithy.api#xmlName": "ebsOptimized" } @@ -54592,8 +55627,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether enhanced networking with ENA is enabled.

", "smithy.api#xmlName": "enaSupport" } @@ -54682,8 +55715,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SourceDestCheck", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether source/destination checking is enabled.

", "smithy.api#xmlName": "sourceDestCheck" } @@ -55229,8 +56260,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances that can be launched onto the Dedicated Host based on the\n host's available capacity.

", "smithy.api#xmlName": "availableCapacity" } @@ -55247,8 +56276,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of instances that can be launched onto the Dedicated Host if there\n are no instances running on it.

", "smithy.api#xmlName": "totalCapacity" } @@ -55264,7 +56291,6 @@ "com.amazonaws.ec2#InstanceConnectEndpointMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 50 @@ -55287,8 +56313,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of listed Reserved Instances in the state specified by the state.

", "smithy.api#xmlName": "instanceCount" } @@ -55628,8 +56652,6 @@ "target": "com.amazonaws.ec2#Hour", "traits": { "aws.protocols#ec2QueryName": "StartHour", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The hour when the time range begins.

", "smithy.api#xmlName": "startHour" } @@ -55646,8 +56668,6 @@ "target": "com.amazonaws.ec2#Hour", "traits": { "aws.protocols#ec2QueryName": "EndHour", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The hour when the time range ends.

", "smithy.api#xmlName": "endHour" } @@ -55678,8 +56698,6 @@ "StartHour": { "target": "com.amazonaws.ec2#Hour", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The hour when the time range begins.

" } }, @@ -55692,8 +56710,6 @@ "EndHour": { "target": "com.amazonaws.ec2#Hour", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The hour when the time range ends.

" } } @@ -55902,6 +56918,14 @@ "smithy.api#documentation": "

The IPv6 address.

", "smithy.api#xmlName": "ipv6Address" } + }, + "IsPrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IsPrimaryIpv6", + "smithy.api#documentation": "

Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. \n For more information, see RunInstances.

", + "smithy.api#xmlName": "isPrimaryIpv6" + } } }, "traits": { @@ -56104,8 +57128,6 @@ "HttpPutResponseHopLimit": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel.

\n

Default: 1

\n

Possible values: Integers from 1 to 64

" } }, @@ -56155,8 +57177,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "HttpPutResponseHopLimit", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel.

\n

Default: 1

\n

Possible values: Integers from 1 to 64

", "smithy.api#xmlName": "httpPutResponseHopLimit" } @@ -56369,8 +57389,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SourceDestCheck", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether source/destination checking is enabled.

", "smithy.api#xmlName": "sourceDestCheck" } @@ -56499,8 +57517,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is terminated.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -56509,8 +57525,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the device on the instance for the network interface attachment.

", "smithy.api#xmlName": "deviceIndex" } @@ -56527,8 +57541,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetworkCardIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card.

", "smithy.api#xmlName": "networkCardIndex" } @@ -56554,8 +57566,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AssociatePublicIpAddress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to assign a public IPv4 address to an instance you launch in a VPC. The\n public IP address can only be assigned to a network interface for eth0, and can only be\n assigned to a new network interface, not an existing one. You cannot specify more than one\n network interface in the request. If launching into a default subnet, the default value is\n true.

", "smithy.api#xmlName": "associatePublicIpAddress" } @@ -56564,8 +57574,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If set to true, the interface is deleted when the instance is terminated. You can\n specify true only if creating a new network interface when launching an\n instance.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -56582,8 +57590,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The position of the network interface in the attachment order. \n A primary network interface has a device index of 0.

\n

If you specify a network interface when launching an instance, \n you must specify the device index.

", "smithy.api#xmlName": "deviceIndex" } @@ -56599,8 +57605,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A number of IPv6 addresses to assign to the network interface. Amazon EC2 chooses\n the IPv6 addresses from the range of the subnet. You cannot specify this option and the\n option to assign specific IPv6 addresses in the same request. You can specify this\n option if you've specified a minimum number of instances to launch.

", "smithy.api#xmlName": "ipv6AddressCount" } @@ -56641,8 +57645,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SecondaryPrivateIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses. You can't specify this option and specify more than one private IP address using the private IP addresses option. You cannot specify this option if you're\n \tlaunching more than one instance in a RunInstances request.

", "smithy.api#xmlName": "secondaryPrivateIpAddressCount" } @@ -56658,8 +57660,6 @@ "AssociateCarrierIpAddress": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to assign a carrier IP address to the network interface.

\n

You can only assign a carrier IP address to a network interface that is in a subnet in\n a Wavelength Zone. For more information about carrier IP addresses, see Carrier IP address in the Amazon Web Services Wavelength Developer\n Guide.

" } }, @@ -56672,8 +57672,6 @@ "NetworkCardIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card. Some instance types support multiple network cards. \n The primary network interface must be assigned to network card index 0. \n The default is network card index 0.

\n

If you are using RequestSpotInstances to create Spot Instances, omit this parameter because\n you can’t specify the network card index when using this API. To specify the network\n card index, use RunInstances.

" } }, @@ -56687,8 +57685,6 @@ "Ipv4PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 delegated prefixes to be automatically assigned to the network interface. \n You cannot use this option if you use the Ipv4Prefix option.

" } }, @@ -56702,10 +57698,14 @@ "Ipv6PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 delegated prefixes to be automatically assigned to the network interface. \n You cannot use this option if you use the Ipv6Prefix option.

" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

" + } } }, "traits": { @@ -56736,8 +57736,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Primary", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this IPv4 address is the primary private IP address of the network interface.

", "smithy.api#xmlName": "primary" } @@ -56827,8 +57825,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SpotMaxPricePercentageOverLowestPrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price protection threshold for Spot Instances. This is the maximum you’ll pay for a Spot Instance,\n expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified\n attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance\n types priced above your threshold.

\n

The parameter accepts an integer, which Amazon EC2 interprets as a percentage.

\n

To turn off price protection, specify a high value, such as 999999.

\n

This parameter is not supported for GetSpotPlacementScores and GetInstanceTypesFromInstanceRequirements.

\n \n

If you set TargetCapacityUnitType to vcpu or\n memory-mib, the price protection threshold is applied based on the\n per-vCPU or per-memory price instead of the per-instance price.

\n
\n

Default: 100\n

", "smithy.api#xmlName": "spotMaxPricePercentageOverLowestPrice" } @@ -56837,8 +57833,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OnDemandMaxPricePercentageOverLowestPrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price protection threshold for On-Demand Instances. This is the maximum you’ll pay for an On-Demand Instance,\n expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified\n attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance\n types priced above your threshold.

\n

The parameter accepts an integer, which Amazon EC2 interprets as a percentage.

\n

To turn off price protection, specify a high value, such as 999999.

\n

This parameter is not supported for GetSpotPlacementScores and GetInstanceTypesFromInstanceRequirements.

\n \n

If you set TargetCapacityUnitType to vcpu or\n memory-mib, the price protection threshold is applied based on the\n per-vCPU or per-memory price instead of the per-instance price.

\n
\n

Default: 20\n

", "smithy.api#xmlName": "onDemandMaxPricePercentageOverLowestPrice" } @@ -56863,8 +57857,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "RequireHibernateSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether instance types must support hibernation for On-Demand\n Instances.

\n

This parameter is not supported for GetSpotPlacementScores.

\n

Default: false\n

", "smithy.api#xmlName": "requireHibernateSupport" } @@ -56967,7 +57959,7 @@ } }, "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard or with the RunInstances API, you\n can't specify InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#InstanceRequirementsRequest": { @@ -57019,16 +58011,12 @@ "SpotMaxPricePercentageOverLowestPrice": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price protection threshold for Spot Instance. This is the maximum you’ll pay for an Spot Instance,\n expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified\n attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance\n types priced above your threshold.

\n

The parameter accepts an integer, which Amazon EC2 interprets as a percentage.

\n

To turn off price protection, specify a high value, such as 999999.

\n

This parameter is not supported for GetSpotPlacementScores and GetInstanceTypesFromInstanceRequirements.

\n \n

If you set TargetCapacityUnitType to vcpu or\n memory-mib, the price protection threshold is applied based on the\n per-vCPU or per-memory price instead of the per-instance price.

\n
\n

Default: 100\n

" } }, "OnDemandMaxPricePercentageOverLowestPrice": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price protection threshold for On-Demand Instances. This is the maximum you’ll pay for an On-Demand Instance,\n expressed as a percentage above the least expensive current generation M, C, or R instance type with your specified\n attributes. When Amazon EC2 selects instance types with your attributes, it excludes instance\n types priced above your threshold.

\n

The parameter accepts an integer, which Amazon EC2 interprets as a percentage.

\n

To turn off price protection, specify a high value, such as 999999.

\n

This parameter is not supported for GetSpotPlacementScores and GetInstanceTypesFromInstanceRequirements.

\n \n

If you set TargetCapacityUnitType to vcpu or\n memory-mib, the price protection threshold is applied based on the\n per-vCPU or per-memory price instead of the per-instance price.

\n
\n

Default: 20\n

" } }, @@ -57047,8 +58035,6 @@ "RequireHibernateSupport": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether instance types must support hibernation for On-Demand Instances.

\n

This parameter is not supported for GetSpotPlacementScores.

\n

Default: false\n

" } }, @@ -57119,7 +58105,7 @@ "NetworkBandwidthGbps": { "target": "com.amazonaws.ec2#NetworkBandwidthGbpsRequest", "traits": { - "smithy.api#documentation": "

The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).

\n

Default: No minimum or maximum limits

" + "smithy.api#documentation": "

The minimum and maximum amount of baseline network bandwidth, in gigabits per second \n (Gbps). For more information, see Amazon EC2 instance network bandwidth in the Amazon EC2 User Guide.

\n

Default: No minimum or maximum limits

" } }, "AllowedInstanceTypes": { @@ -57131,7 +58117,7 @@ } }, "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard, or with the RunInstances API or\n AWS::EC2::Instance Amazon Web Services CloudFormation resource, you can't specify\n InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "com.amazonaws.ec2#InstanceRequirementsWithMetadataRequest": { @@ -57176,8 +58162,6 @@ "ExcludeBootVolume": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Excludes the root volume from being snapshotted.

" } }, @@ -57200,8 +58184,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Code", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The state of the instance as a 16-bit unsigned integer.

\n

The high byte is all of the bits between 2^8 and (2^16)-1, which equals decimal values\n between 256 and 65,535. These numerical values are used for internal purposes and should\n be ignored.

\n

The low byte is all of the bits between 2^0 and (2^8)-1, which equals decimal values\n between 0 and 255.

\n

The valid values for instance-state-code will all be in the range of the low byte and\n they are:

\n
    \n
  • \n

    \n 0 : pending\n

    \n
  • \n
  • \n

    \n 16 : running\n

    \n
  • \n
  • \n

    \n 32 : shutting-down\n

    \n
  • \n
  • \n

    \n 48 : terminated\n

    \n
  • \n
  • \n

    \n 64 : stopping\n

    \n
  • \n
  • \n

    \n 80 : stopped\n

    \n
  • \n
\n

You can ignore the high byte value by zeroing out all of the bits above 2^8 or 256 in\n decimal.

", "smithy.api#xmlName": "code" } @@ -57588,8 +58570,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IncludeAllTagsOfInstance", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates wheter all tag keys in the current Region are registered to appear in scheduled event notifications. \n \ttrue indicates that all tag keys in the current Region are registered.

", "smithy.api#xmlName": "includeAllTagsOfInstance" } @@ -61525,6 +62505,708 @@ "traits": { "smithy.api#enumValue": "i4g.16xlarge" } + }, + "hpc7g_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.4xlarge" + } + }, + "hpc7g_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.8xlarge" + } + }, + "hpc7g_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7g.16xlarge" + } + }, + "c7gn_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.medium" + } + }, + "c7gn_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.large" + } + }, + "c7gn_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.xlarge" + } + }, + "c7gn_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.2xlarge" + } + }, + "c7gn_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.4xlarge" + } + }, + "c7gn_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.8xlarge" + } + }, + "c7gn_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.12xlarge" + } + }, + "c7gn_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gn.16xlarge" + } + }, + "p5_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "p5.48xlarge" + } + }, + "m7i_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.large" + } + }, + "m7i_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.xlarge" + } + }, + "m7i_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.2xlarge" + } + }, + "m7i_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.4xlarge" + } + }, + "m7i_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.8xlarge" + } + }, + "m7i_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.12xlarge" + } + }, + "m7i_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.16xlarge" + } + }, + "m7i_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.24xlarge" + } + }, + "m7i_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i.48xlarge" + } + }, + "m7i_flex_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.large" + } + }, + "m7i_flex_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.xlarge" + } + }, + "m7i_flex_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.2xlarge" + } + }, + "m7i_flex_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.4xlarge" + } + }, + "m7i_flex_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7i-flex.8xlarge" + } + }, + "m7a_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.medium" + } + }, + "m7a_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.large" + } + }, + "m7a_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.xlarge" + } + }, + "m7a_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.2xlarge" + } + }, + "m7a_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.4xlarge" + } + }, + "m7a_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.8xlarge" + } + }, + "m7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.12xlarge" + } + }, + "m7a_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.16xlarge" + } + }, + "m7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.24xlarge" + } + }, + "m7a_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.32xlarge" + } + }, + "m7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.48xlarge" + } + }, + "m7a_metal_48xl": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7a.metal-48xl" + } + }, + "hpc7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.12xlarge" + } + }, + "hpc7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.24xlarge" + } + }, + "hpc7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.48xlarge" + } + }, + "hpc7a_96xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "hpc7a.96xlarge" + } + }, + "c7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.medium" + } + }, + "c7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.large" + } + }, + "c7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.xlarge" + } + }, + "c7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.2xlarge" + } + }, + "c7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.4xlarge" + } + }, + "c7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.8xlarge" + } + }, + "c7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.12xlarge" + } + }, + "c7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7gd.16xlarge" + } + }, + "m7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.medium" + } + }, + "m7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.large" + } + }, + "m7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.xlarge" + } + }, + "m7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.2xlarge" + } + }, + "m7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.4xlarge" + } + }, + "m7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.8xlarge" + } + }, + "m7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.12xlarge" + } + }, + "m7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "m7gd.16xlarge" + } + }, + "r7gd_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.medium" + } + }, + "r7gd_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.large" + } + }, + "r7gd_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.xlarge" + } + }, + "r7gd_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.2xlarge" + } + }, + "r7gd_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.4xlarge" + } + }, + "r7gd_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.8xlarge" + } + }, + "r7gd_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.12xlarge" + } + }, + "r7gd_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7gd.16xlarge" + } + }, + "r7a_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.medium" + } + }, + "r7a_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.large" + } + }, + "r7a_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.xlarge" + } + }, + "r7a_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.2xlarge" + } + }, + "r7a_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.4xlarge" + } + }, + "r7a_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.8xlarge" + } + }, + "r7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.12xlarge" + } + }, + "r7a_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.16xlarge" + } + }, + "r7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.24xlarge" + } + }, + "r7a_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.32xlarge" + } + }, + "r7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.48xlarge" + } + }, + "c7i_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.large" + } + }, + "c7i_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.xlarge" + } + }, + "c7i_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.2xlarge" + } + }, + "c7i_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.4xlarge" + } + }, + "c7i_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.8xlarge" + } + }, + "c7i_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.12xlarge" + } + }, + "c7i_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.16xlarge" + } + }, + "c7i_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.24xlarge" + } + }, + "c7i_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7i.48xlarge" + } + }, + "mac2_m2pro_metal": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "mac2-m2pro.metal" + } + }, + "r7iz_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.large" + } + }, + "r7iz_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.xlarge" + } + }, + "r7iz_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.2xlarge" + } + }, + "r7iz_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.4xlarge" + } + }, + "r7iz_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.8xlarge" + } + }, + "r7iz_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.12xlarge" + } + }, + "r7iz_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.16xlarge" + } + }, + "r7iz_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7iz.32xlarge" + } + }, + "c7a_medium": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.medium" + } + }, + "c7a_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.large" + } + }, + "c7a_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.xlarge" + } + }, + "c7a_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.2xlarge" + } + }, + "c7a_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.4xlarge" + } + }, + "c7a_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.8xlarge" + } + }, + "c7a_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.12xlarge" + } + }, + "c7a_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.16xlarge" + } + }, + "c7a_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.24xlarge" + } + }, + "c7a_32xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.32xlarge" + } + }, + "c7a_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.48xlarge" + } + }, + "c7a_metal_48xl": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "c7a.metal-48xl" + } + }, + "r7a_metal_48xl": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7a.metal-48xl" + } + }, + "r7i_large": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.large" + } + }, + "r7i_xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.xlarge" + } + }, + "r7i_2xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.2xlarge" + } + }, + "r7i_4xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.4xlarge" + } + }, + "r7i_8xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.8xlarge" + } + }, + "r7i_12xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.12xlarge" + } + }, + "r7i_16xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.16xlarge" + } + }, + "r7i_24xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.24xlarge" + } + }, + "r7i_48xlarge": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "r7i.48xlarge" + } } } }, @@ -61712,7 +63394,7 @@ "target": "com.amazonaws.ec2#BurstablePerformanceFlag", "traits": { "aws.protocols#ec2QueryName": "BurstablePerformanceSupported", - "smithy.api#documentation": "

Indicates whether the instance type is a burstable performance instance type.

", + "smithy.api#documentation": "

Indicates whether the instance type is a burstable performance T instance \n type. For more information, see Burstable \n performance instances.

", "smithy.api#xmlName": "burstablePerformanceSupported" } }, @@ -61739,6 +63421,30 @@ "smithy.api#documentation": "

The supported boot modes. For more information, see Boot modes in the\n Amazon EC2 User Guide.

", "smithy.api#xmlName": "supportedBootModes" } + }, + "NitroEnclavesSupport": { + "target": "com.amazonaws.ec2#NitroEnclavesSupport", + "traits": { + "aws.protocols#ec2QueryName": "NitroEnclavesSupport", + "smithy.api#documentation": "

Indicates whether Nitro Enclaves is supported.

", + "smithy.api#xmlName": "nitroEnclavesSupport" + } + }, + "NitroTpmSupport": { + "target": "com.amazonaws.ec2#NitroTpmSupport", + "traits": { + "aws.protocols#ec2QueryName": "NitroTpmSupport", + "smithy.api#documentation": "

Indicates whether NitroTPM is supported.

", + "smithy.api#xmlName": "nitroTpmSupport" + } + }, + "NitroTpmInfo": { + "target": "com.amazonaws.ec2#NitroTpmInfo", + "traits": { + "aws.protocols#ec2QueryName": "NitroTpmInfo", + "smithy.api#documentation": "

Describes the supported NitroTPM versions for the instance type.

", + "smithy.api#xmlName": "nitroTpmInfo" + } } }, "traits": { @@ -61862,8 +63568,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "UsedInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances the Amazon Web Services account currently has in the Capacity Reservation.

", "smithy.api#xmlName": "usedInstanceCount" } @@ -61883,10 +63587,7 @@ } }, "com.amazonaws.ec2#Integer": { - "type": "integer", - "traits": { - "smithy.api#default": 0 - } + "type": "integer" }, "com.amazonaws.ec2#IntegerWithConstraints": { "type": "integer", @@ -62006,7 +63707,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes the attachment of a VPC to an internet gateway or an egress-only internet\n\t\t\tgateway.

" + "smithy.api#documentation": "

Describes the attachment of a VPC to an internet gateway or an egress-only internet gateway.

" } }, "com.amazonaws.ec2#InternetGatewayAttachmentList": { @@ -62097,8 +63798,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

", "smithy.api#xmlName": "fromPort" } @@ -62107,7 +63806,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "IpProtocol", - "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp, icmpv6) \n or number (see Protocol Numbers).

\n

[VPC only] Use -1 to specify all protocols. When authorizing\n security group rules, specifying -1 or a protocol number other than\n tcp, udp, icmp, or icmpv6 allows\n traffic on all ports, regardless of any port range you specify. For tcp,\n udp, and icmp, you must specify a port range. For icmpv6,\n the port range is optional; if you omit the port range, traffic for all types and codes is allowed.

", + "smithy.api#documentation": "

The IP protocol name (tcp, udp, icmp, icmpv6) \n or number (see Protocol Numbers).

\n

Use -1 to specify all protocols. When authorizing\n security group rules, specifying -1 or a protocol number other than\n tcp, udp, icmp, or icmpv6 allows\n traffic on all ports, regardless of any port range you specify. For tcp,\n udp, and icmp, you must specify a port range. For icmpv6,\n the port range is optional; if you omit the port range, traffic for all types and codes is allowed.

", "smithy.api#xmlName": "ipProtocol" } }, @@ -62123,7 +63822,7 @@ "target": "com.amazonaws.ec2#Ipv6RangeList", "traits": { "aws.protocols#ec2QueryName": "Ipv6Ranges", - "smithy.api#documentation": "

[VPC only] The IPv6 ranges.

", + "smithy.api#documentation": "

The IPv6 ranges.

", "smithy.api#xmlName": "ipv6Ranges" } }, @@ -62131,7 +63830,7 @@ "target": "com.amazonaws.ec2#PrefixListIdList", "traits": { "aws.protocols#ec2QueryName": "PrefixListIds", - "smithy.api#documentation": "

[VPC only] The prefix list IDs.

", + "smithy.api#documentation": "

The prefix list IDs.

", "smithy.api#xmlName": "prefixListIds" } }, @@ -62139,8 +63838,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP or ICMPv6, this is the code. A value of -1 indicates all ICMP/ICMPv6 codes. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

", "smithy.api#xmlName": "toPort" } @@ -62273,8 +63970,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ScopeCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of scopes in the IPAM. The scope quota is 5. For more information on quotas, see Quotas in IPAM in the Amazon VPC IPAM User Guide.\n

", "smithy.api#xmlName": "scopeCount" } @@ -62331,8 +64026,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ResourceDiscoveryAssociationCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IPAM's resource discovery association count.

", "smithy.api#xmlName": "resourceDiscoveryAssociationCount" } @@ -62345,7 +64038,6 @@ "com.amazonaws.ec2#IpamAddressHistoryMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -62788,7 +64480,6 @@ "com.amazonaws.ec2#IpamMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -62798,7 +64489,6 @@ "com.amazonaws.ec2#IpamNetmaskLength": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 128 @@ -62932,8 +64622,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PoolDepth", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The depth of pools in your IPAM pool. The pool depth quota is 10. For more information, see Quotas in IPAM in the Amazon VPC IPAM User Guide.\n

", "smithy.api#xmlName": "poolDepth" } @@ -62966,8 +64654,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AutoImport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If selected, IPAM will continuously look for resources within the CIDR range of this pool \n and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\n these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \n a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \n marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \n discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\n

\n

A locale must be set on the pool for this feature to work.

", "smithy.api#xmlName": "autoImport" } @@ -62976,8 +64662,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PubliclyAdvertisable", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Determines if a pool is publicly advertisable. This option is not available for pools with AddressFamily set to ipv4.

", "smithy.api#xmlName": "publiclyAdvertisable" } @@ -62994,8 +64678,6 @@ "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { "aws.protocols#ec2QueryName": "AllocationMinNetmaskLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. The minimum netmask length must be less than the maximum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

", "smithy.api#xmlName": "allocationMinNetmaskLength" } @@ -63004,8 +64686,6 @@ "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { "aws.protocols#ec2QueryName": "AllocationMaxNetmaskLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. The maximum netmask length must be greater than the minimum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.

", "smithy.api#xmlName": "allocationMaxNetmaskLength" } @@ -63014,8 +64694,6 @@ "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { "aws.protocols#ec2QueryName": "AllocationDefaultNetmaskLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and \n you enter 16 here, new allocations will default to 10.0.0.0/16.

", "smithy.api#xmlName": "allocationDefaultNetmaskLength" } @@ -63221,8 +64899,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetmaskLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The netmask length of the CIDR you'd like to provision to a pool. Can be used for provisioning Amazon-provided IPv6 CIDRs to top-level pools and for provisioning CIDRs to pools with source pools. Cannot be used to provision BYOIP CIDRs to top-level pools. \"NetmaskLength\" or \"Cidr\" is required.

", "smithy.api#xmlName": "netmaskLength" } @@ -63636,8 +65312,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Defines if the resource discovery is the default. The default resource discovery is the resource discovery automatically created when you create an IPAM.

", "smithy.api#xmlName": "isDefault" } @@ -63726,8 +65400,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Defines if the resource discovery is the default. When you create an IPAM, a default resource discovery is created for your IPAM and it's associated with your IPAM.

", "smithy.api#xmlName": "isDefault" } @@ -64044,8 +65716,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Defines if the scope is the default scope or not.

", "smithy.api#xmlName": "isDefault" } @@ -64062,8 +65732,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PoolCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of pools in the scope.

", "smithy.api#xmlName": "poolCount" } @@ -64488,7 +66156,6 @@ "com.amazonaws.ec2#Ipv6PoolMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 1000 @@ -64598,7 +66265,7 @@ } }, "traits": { - "smithy.api#documentation": "

[EC2-VPC only] Describes an IPv6 range.

" + "smithy.api#documentation": "

Describes an IPv6 range.

" } }, "com.amazonaws.ec2#Ipv6RangeList": { @@ -64809,6 +66476,9 @@ } } }, + "com.amazonaws.ec2#KmsKeyArn": { + "type": "string" + }, "com.amazonaws.ec2#KmsKeyId": { "type": "string" }, @@ -64944,8 +66614,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.

\n

Default: false\n

", "smithy.api#xmlName": "ebsOptimized" } @@ -65082,8 +66750,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "DefaultVersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number of the default version of the launch template.

", "smithy.api#xmlName": "defaultVersionNumber" } @@ -65092,8 +66758,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "LatestVersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number of the latest version of the launch template.

", "smithy.api#xmlName": "latestVersionNumber" } @@ -65293,7 +66957,7 @@ "target": "com.amazonaws.ec2#FleetLaunchTemplateSpecification", "traits": { "aws.protocols#ec2QueryName": "LaunchTemplateSpecification", - "smithy.api#documentation": "

The launch template.

", + "smithy.api#documentation": "

The launch template to use. Make sure that the launch template does not contain the\n NetworkInterfaceId parameter because you can't specify a network interface\n ID in a Spot Fleet.

", "smithy.api#xmlName": "launchTemplateSpecification" } }, @@ -65326,8 +66990,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "CoreCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of CPU cores for the instance.

", "smithy.api#xmlName": "coreCount" } @@ -65336,8 +66998,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ThreadsPerCore", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of threads per CPU core.

", "smithy.api#xmlName": "threadsPerCore" } @@ -65346,7 +67006,7 @@ "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { "aws.protocols#ec2QueryName": "AmdSevSnp", - "smithy.api#documentation": "

Indicates whether the instance is enabled for \n AMD SEV-SNP.

", + "smithy.api#documentation": "

Indicates whether the instance is enabled for AMD SEV-SNP. For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "amdSevSnp" } } @@ -65361,23 +67021,19 @@ "CoreCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of CPU cores for the instance.

" } }, "ThreadsPerCore": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of threads per CPU core. To disable multithreading for the instance,\n specify a value of 1. Otherwise, specify the default value of\n 2.

" } }, "AmdSevSnp": { "target": "com.amazonaws.ec2#AmdSevSnpSpecification", "traits": { - "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only.

" + "smithy.api#documentation": "

Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \n with M6a, R6a, and C6a instance types only. For more information, see \n AMD SEV-SNP.

" } } }, @@ -65392,8 +67048,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -65402,8 +67056,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is deleted on instance termination.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -65412,8 +67064,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Iops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS) that the volume supports.

", "smithy.api#xmlName": "iops" } @@ -65438,8 +67088,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "volumeSize" } @@ -65456,8 +67104,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Throughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput that the volume supports, in MiB/s.

", "smithy.api#xmlName": "throughput" } @@ -65473,24 +67119,18 @@ "Encrypted": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is encrypted. Encrypted volumes can only be attached\n to instances that support Amazon EBS encryption. If you are creating a volume from a\n snapshot, you can't specify an encryption value.

" } }, "DeleteOnTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is deleted on instance termination.

" } }, "Iops": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS). For gp3,\n io1, and io2 volumes, this represents the number of IOPS that\n are provisioned for the volume. For gp2 volumes, this represents the\n baseline performance of the volume and the rate at which the volume accumulates I/O\n credits for bursting.

\n

The following are the supported values for each volume type:

\n
    \n
  • \n

    \n gp3: 3,000-16,000 IOPS

    \n
  • \n
  • \n

    \n io1: 100-64,000 IOPS

    \n
  • \n
  • \n

    \n io2: 100-64,000 IOPS

    \n
  • \n
\n

For io1 and io2 volumes, we guarantee\n 64,000 IOPS only for Instances built on the\n Nitro System. Other instance families guarantee performance up to\n 32,000 IOPS.

\n

This parameter is supported for io1, io2, and gp3 volumes only. This parameter\n is not supported for gp2, st1, sc1, or standard volumes.

" } }, @@ -65509,8 +67149,6 @@ "VolumeSize": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiBs. You must specify either a snapshot ID or a volume\n size. The following are the supported volumes sizes for each volume type:

\n
    \n
  • \n

    \n gp2 and gp3: 1-16,384

    \n
  • \n
  • \n

    \n io1 and io2: 4-16,384

    \n
  • \n
  • \n

    \n st1 and sc1: 125-16,384

    \n
  • \n
  • \n

    \n standard: 1-1,024

    \n
  • \n
" } }, @@ -65523,8 +67161,6 @@ "Throughput": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput to provision for a gp3 volume, with a maximum of 1,000\n MiB/s.

\n

Valid Range: Minimum value of 125. Maximum value of 1000.

" } } @@ -65547,8 +67183,6 @@ "Count": { "target": "com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorCount", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of elastic inference accelerators to attach to the instance.

\n

Default: 1

" } } @@ -65560,7 +67194,6 @@ "com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorCount": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1 } @@ -65590,8 +67223,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Count", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of elastic inference accelerators to attach to the instance.

\n

Default: 1

", "smithy.api#xmlName": "count" } @@ -65617,8 +67248,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If this parameter is set to true, the instance is enabled for Amazon Web Services Nitro\n Enclaves; otherwise, it is not enabled for Amazon Web Services Nitro Enclaves.

", "smithy.api#xmlName": "enabled" } @@ -65634,8 +67263,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

To enable the instance for Amazon Web Services Nitro Enclaves, set this parameter to\n true.

" } } @@ -65692,8 +67319,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Configured", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If this parameter is set to true, the instance is enabled for\n hibernation; otherwise, it is not enabled for hibernation.

", "smithy.api#xmlName": "configured" } @@ -65709,8 +67334,6 @@ "Configured": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you set this parameter to true, the instance is enabled for\n hibernation.

\n

Default: false\n

" } } @@ -65906,8 +67529,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "HttpPutResponseHopLimit", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel.

\n

Default: 1

\n

Possible values: Integers from 1 to 64

", "smithy.api#xmlName": "httpPutResponseHopLimit" } @@ -65953,8 +67574,6 @@ "HttpPutResponseHopLimit": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel.

\n

Default: 1\n

\n

Possible values: Integers from 1 to 64

" } }, @@ -66039,8 +67658,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AssociateCarrierIpAddress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to associate a Carrier IP address with eth0 for a new network\n interface.

\n

Use this option when you launch an instance in a Wavelength Zone and want to associate\n a Carrier IP address with the network interface. For more information about Carrier IP\n addresses, see Carrier IP addresses in the Wavelength Developer\n Guide.

", "smithy.api#xmlName": "associateCarrierIpAddress" } @@ -66049,8 +67666,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AssociatePublicIpAddress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to associate a public IPv4 address with eth0 for a new network\n interface.

", "smithy.api#xmlName": "associatePublicIpAddress" } @@ -66059,8 +67674,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is\n terminated.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -66077,8 +67690,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The device index for the network interface attachment.

", "smithy.api#xmlName": "deviceIndex" } @@ -66103,8 +67714,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses for the network interface.

", "smithy.api#xmlName": "ipv6AddressCount" } @@ -66145,8 +67754,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SecondaryPrivateIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses for the network interface.

", "smithy.api#xmlName": "secondaryPrivateIpAddressCount" } @@ -66163,8 +67770,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetworkCardIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card.

", "smithy.api#xmlName": "networkCardIndex" } @@ -66181,8 +67786,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv4PrefixCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 prefixes that Amazon Web Services automatically assigned to the network\n interface.

", "smithy.api#xmlName": "ipv4PrefixCount" } @@ -66199,11 +67802,17 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Ipv6PrefixCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes that Amazon Web Services automatically assigned to the network\n interface.

", "smithy.api#xmlName": "ipv6PrefixCount" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "PrimaryIpv6", + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

", + "smithy.api#xmlName": "primaryIpv6" + } } }, "traits": { @@ -66225,24 +67834,18 @@ "AssociateCarrierIpAddress": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Associates a Carrier IP address with eth0 for a new network interface.

\n

Use this option when you launch an instance in a Wavelength Zone and want to associate\n a Carrier IP address with the network interface. For more information about Carrier IP\n addresses, see Carrier IP addresses in the Wavelength Developer\n Guide.

" } }, "AssociatePublicIpAddress": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Associates a public IPv4 address with eth0 for a new network interface.

" } }, "DeleteOnTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is\n terminated.

" } }, @@ -66255,8 +67858,6 @@ "DeviceIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The device index for the network interface attachment.

" } }, @@ -66276,8 +67877,6 @@ "Ipv6AddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses to assign to a network interface. Amazon EC2\n automatically selects the IPv6 addresses from the subnet range. You can't use this\n option if specifying specific IPv6 addresses.

" } }, @@ -66308,8 +67907,6 @@ "SecondaryPrivateIpAddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses to assign to a network\n interface.

" } }, @@ -66322,8 +67919,6 @@ "NetworkCardIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card. Some instance types support multiple network cards. The\n primary network interface must be assigned to network card index 0. The default is\n network card index 0.

" } }, @@ -66337,8 +67932,6 @@ "Ipv4PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv4 prefixes to be automatically assigned to the network interface. You\n cannot use this option if you use the Ipv4Prefix option.

" } }, @@ -66352,10 +67945,14 @@ "Ipv6PrefixCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 prefixes to be automatically assigned to the network interface. You\n cannot use this option if you use the Ipv6Prefix option.

" } + }, + "PrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see RunInstances.

" + } } }, "traits": { @@ -66477,8 +68074,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "WeightedCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units provided by the specified instance type.

", "smithy.api#xmlName": "weightedCapacity" } @@ -66487,8 +68082,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Priority", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The priority for the launch template override. The highest priority is launched\n first.

\n

If OnDemandAllocationStrategy is set to prioritized, Spot Fleet\n uses priority to determine which launch template override to use first in fulfilling\n On-Demand capacity.

\n

If the Spot AllocationStrategy is set to\n capacityOptimizedPrioritized, Spot Fleet uses priority on a best-effort basis\n to determine which launch template override to use in fulfilling Spot capacity, but\n optimizes for capacity first.

\n

Valid values are whole numbers starting at 0. The lower the number, the\n higher the priority. If no number is set, the launch template override has the lowest\n priority. You can set the same priority for different launch template overrides.

", "smithy.api#xmlName": "priority" } @@ -66578,8 +68171,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PartitionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the partition the instance should launch in. Valid only if the placement\n group strategy is set to partition.

", "smithy.api#xmlName": "partitionNumber" } @@ -66645,8 +68236,6 @@ "PartitionNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the partition the instance should launch in. Valid only if the placement\n group strategy is set to partition.

" } }, @@ -66676,8 +68265,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

", "smithy.api#xmlName": "enableResourceNameDnsARecord" } @@ -66686,8 +68273,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsAAAARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

", "smithy.api#xmlName": "enableResourceNameDnsAAAARecord" } @@ -66709,16 +68294,12 @@ "EnableResourceNameDnsARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

" } }, "EnableResourceNameDnsAAAARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

" } } @@ -66785,8 +68366,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "BlockDurationMinutes", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The required duration for the Spot Instances (also known as Spot blocks), in minutes.\n This value must be a multiple of 60 (60, 120, 180, 240, 300, or 360).

", "smithy.api#xmlName": "blockDurationMinutes" } @@ -66830,8 +68409,6 @@ "BlockDurationMinutes": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Deprecated.

" } }, @@ -66891,7 +68468,7 @@ "ResourceType": { "target": "com.amazonaws.ec2#ResourceType", "traits": { - "smithy.api#documentation": "

The type of resource to tag.

\n

The Valid Values are all the resource types that can be tagged. However,\n when creating a launch template, you can specify tags for the following resource types\n only: instance | volume | elastic-gpu |\n network-interface | spot-instances-request\n

\n

To tag a resource after it has been created, see CreateTags.

" + "smithy.api#documentation": "

The type of resource to tag.

\n

Valid Values lists all resource types for Amazon EC2 that can be tagged. When\n you create a launch template, you can specify tags for the following resource types\n only: instance | volume | elastic-gpu |\n network-interface | spot-instances-request.\n If the instance does include the resource type that you specify, the instance \n launch fails. For example, not all instance types include an Elastic GPU.

\n

To tag a resource after it has been created, see CreateTags.

" } }, "Tags": { @@ -66938,8 +68515,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "VersionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version number.

", "smithy.api#xmlName": "versionNumber" } @@ -66972,8 +68547,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DefaultVersion", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the version is the default version.

", "smithy.api#xmlName": "defaultVersion" } @@ -67007,8 +68580,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring is\n enabled.

", "smithy.api#xmlName": "enabled" } @@ -67024,8 +68595,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specify true to enable detailed monitoring. Otherwise, basic monitoring\n is enabled.

" } } @@ -67134,8 +68703,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -67220,8 +68787,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -67484,7 +69049,6 @@ "com.amazonaws.ec2#LocalGatewayMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -67984,8 +69548,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Vlan", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ID of the VLAN.

", "smithy.api#xmlName": "vlan" } @@ -68010,8 +69572,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "LocalBgpAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Border Gateway Protocol (BGP) Autonomous System Number (ASN) of the local gateway.

", "smithy.api#xmlName": "localBgpAsn" } @@ -68020,8 +69580,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PeerBgpAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The peer BGP ASN.

", "smithy.api#xmlName": "peerBgpAsn" } @@ -68209,6 +69767,12 @@ "traits": { "smithy.api#enumValue": "availability-zone-id" } + }, + "outpost": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "outpost" + } } } }, @@ -68236,10 +69800,7 @@ } }, "com.amazonaws.ec2#Long": { - "type": "long", - "traits": { - "smithy.api#default": 0 - } + "type": "long" }, "com.amazonaws.ec2#MaintenanceDetails": { "type": "structure", @@ -68328,8 +69889,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxEntries", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of entries for the prefix list.

", "smithy.api#xmlName": "maxEntries" } @@ -68338,8 +69897,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Version", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version of the prefix list.

", "smithy.api#xmlName": "version" } @@ -68400,7 +69957,6 @@ "com.amazonaws.ec2#MaxResultsParam": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 100 @@ -68446,8 +70002,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of memory per vCPU, in GiB. If this parameter is not specified, there is\n no minimum limit.

", "smithy.api#xmlName": "min" } @@ -68456,8 +70010,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of memory per vCPU, in GiB. If this parameter is not specified, there is\n no maximum limit.

", "smithy.api#xmlName": "max" } @@ -68473,16 +70025,12 @@ "Min": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of memory per vCPU, in GiB. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of memory per vCPU, in GiB. To specify no maximum limit, omit this\n parameter.

" } } @@ -68514,8 +70062,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of memory, in MiB. If this parameter is not specified, there is no minimum\n limit.

", "smithy.api#xmlName": "min" } @@ -68524,8 +70070,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of memory, in MiB. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -68542,7 +70086,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of memory, in MiB. To specify no minimum limit, specify\n 0.

", "smithy.api#required": {} } @@ -68550,8 +70093,6 @@ "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of memory, in MiB. To specify no maximum limit, omit this\n parameter.

" } } @@ -68586,8 +70127,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "Value", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#xmlName": "value" } }, @@ -68659,8 +70198,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -68719,8 +70256,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -68736,8 +70271,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -68802,8 +70335,6 @@ "TotalTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of capacity units to be reserved by the Capacity Reservation Fleet. This value, \n\t\t\ttogether with the instance type weights that you assign to each instance type used by the Fleet \n\t\t\tdetermine the number of instances for which the Fleet reserves capacity. Both values are based on \n\t\t\tunits that make sense for your workload. For more information, see Total target capacity \n\t\t\tin the Amazon EC2 User Guide.

" } }, @@ -68816,16 +70347,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, "RemoveEndDate": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to remove the end date from the Capacity Reservation Fleet. If you remove the \n\t\t\tend date, the Capacity Reservation Fleet does not expire and it remains active until you explicitly \n\t\t\tcancel it using the CancelCapacityReservationFleet action.

\n

You can't specify RemoveEndDate and \n\t\t\tEndDate in the same request.

" } } @@ -68841,8 +70368,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -68866,8 +70391,6 @@ "InstanceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances for which to reserve capacity. The number of instances can't be increased or \n\t\t \tdecreased by more than 1000 in a single request.

" } }, @@ -68886,16 +70409,12 @@ "Accept": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Reserved. Capacity Reservations you have created are accepted by default.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -68917,8 +70436,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -68972,8 +70489,6 @@ "VpnPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The port number to assign to the Client VPN endpoint for TCP and UDP traffic.

\n

Valid Values: 443 | 1194\n

\n

Default Value: 443\n

" } }, @@ -68986,16 +70501,12 @@ "SplitTunnel": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the VPN is split-tunnel.

\n

For information about split-tunnel VPN endpoints, see Split-tunnel Client VPN endpoint in the \n \tClient VPN Administrator Guide.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } }, @@ -69027,8 +70538,6 @@ "SessionTimeoutHours": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum VPN session duration time in hours.

\n

Valid values: 8 | 10 | 12 | 24\n

\n

Default value: 24\n

" } }, @@ -69050,8 +70559,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -69079,8 +70586,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -69147,8 +70652,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -69191,8 +70694,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -69241,8 +70742,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If the request succeeds, the response returns true. If the request fails,\n no response is returned, and instead an error message is returned.

", "smithy.api#xmlName": "return" } @@ -69270,8 +70769,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -69468,7 +70965,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicate whether the resource should use longer IDs (17-character IDs).

", "smithy.api#required": {} } @@ -69518,7 +71014,6 @@ "traits": { "aws.protocols#ec2QueryName": "UseLongIds", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the resource should use longer IDs (17-character IDs)

", "smithy.api#required": {}, "smithy.api#xmlName": "useLongIds" @@ -69538,7 +71033,24 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified AMI. You can specify only one attribute at a time.

\n

To specify the attribute, you can use the Attribute parameter, or one of the following parameters: \n Description, ImdsSupport, or LaunchPermission.

\n

Images with an Amazon Web Services Marketplace product code cannot be made public.

\n

To enable the SriovNetSupport enhanced networking attribute of an image, enable SriovNetSupport on an instance \n and create an AMI from the instance.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified AMI. You can specify only one attribute at a time.

\n

To specify the attribute, you can use the Attribute parameter, or one of the following parameters: \n Description, ImdsSupport, or LaunchPermission.

\n

Images with an Amazon Web Services Marketplace product code cannot be made public.

\n

To enable the SriovNetSupport enhanced networking attribute of an image, enable SriovNetSupport on an instance \n and create an AMI from the instance.

", + "smithy.api#examples": [ + { + "title": "To make an AMI public", + "documentation": "This example makes the specified AMI public.", + "input": { + "ImageId": "ami-5731123e", + "LaunchPermission": { + "Add": [ + { + "Group": "all" + } + ] + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyImageAttributeRequest": { @@ -69607,8 +71119,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -69648,7 +71158,20 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified instance. You can specify only one\n attribute at a time.

\n

\n Note: Using this action to change the security groups\n associated with an elastic network interface (ENI) attached to an instance can\n result in an error if the instance has more than one ENI. To change the security groups\n associated with an ENI attached to an instance that has multiple ENIs, we recommend that\n you use the ModifyNetworkInterfaceAttribute action.

\n

To modify some attributes, the instance must be stopped. For more information, see\n Modify a stopped instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified instance. You can specify only one\n attribute at a time.

\n

\n Note: Using this action to change the security groups\n associated with an elastic network interface (ENI) attached to an instance can\n result in an error if the instance has more than one ENI. To change the security groups\n associated with an ENI attached to an instance that has multiple ENIs, we recommend that\n you use the ModifyNetworkInterfaceAttribute action.

\n

To modify some attributes, the instance must be stopped. For more information, see\n Modify a stopped instance in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To modify the instance type", + "documentation": "This example modifies the instance type of the specified stopped instance.", + "input": { + "InstanceId": "i-1234567890abcdef0", + "InstanceType": { + "Value": "m5.large" + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyInstanceAttributeRequest": { @@ -69688,8 +71211,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -69828,8 +71349,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -69845,8 +71364,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -69874,8 +71391,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -69941,8 +71456,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70009,8 +71522,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70094,8 +71605,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -70160,8 +71669,6 @@ "HttpPutResponseHopLimit": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The desired HTTP PUT response hop limit for instance metadata requests. The larger the\n number, the further instance metadata requests can travel. If no parameter is specified,\n the existing state is maintained.

\n

Possible values: Integers from 1 to 64

" } }, @@ -70174,15 +71681,13 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, "HttpProtocolIpv6": { "target": "com.amazonaws.ec2#InstanceMetadataProtocolState", "traits": { - "smithy.api#documentation": "

Enables or disables the IPv6 endpoint for the instance metadata service. This setting\n applies only if you have enabled the HTTP metadata endpoint.

" + "smithy.api#documentation": "

Enables or disables the IPv6 endpoint for the instance metadata service. \n Applies only if you enabled the HTTP metadata endpoint.

" } }, "InstanceMetadataTags": { @@ -70271,22 +71776,20 @@ "target": "com.amazonaws.ec2#HostTenancy", "traits": { "aws.protocols#ec2QueryName": "Tenancy", - "smithy.api#documentation": "

The tenancy for the instance.

\n \n

For T3 instances, you can't change the tenancy from dedicated to\n host, or from host to dedicated.\n Attempting to make one of these unsupported tenancy changes results in the\n InvalidTenancy error code.

\n
", + "smithy.api#documentation": "

The tenancy for the instance.

\n \n

For T3 instances, you must launch the instance on a Dedicated Host to use a\n tenancy of host. You can't change the tenancy from\n host to dedicated or default.\n Attempting to make one of these unsupported tenancy changes results in an\n InvalidRequest error code.

\n
", "smithy.api#xmlName": "tenancy" } }, "PartitionNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the partition in which to place the instance. Valid only if the\n placement group strategy is set to partition.

" } }, "HostResourceGroupArn": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The ARN of the host resource group in which to place the instance.

" + "smithy.api#documentation": "

The ARN of the host resource group in which to place the instance. The instance must\n have a tenancy of host to specify this parameter.

" } }, "GroupId": { @@ -70307,8 +71810,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -70348,8 +71849,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70370,40 +71869,30 @@ "AutoImport": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, IPAM will continuously look for resources within the CIDR range of this pool \n and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\n these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \n a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \n marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \n discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\n

\n

A locale must be set on the pool for this feature to work.

" } }, "AllocationMinNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. Possible \n netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128. The minimum netmask \n length must be less than the maximum netmask length.

" } }, "AllocationMaxNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. Possible \n netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.The maximum netmask \n length must be greater than the minimum netmask length.

" } }, "AllocationDefaultNetmaskLength": { "target": "com.amazonaws.ec2#IpamNetmaskLength", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and you enter 16 here, new allocations will default to 10.0.0.0/16.

" } }, "ClearAllocationDefaultNetmaskLength": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Clear the default netmask length allocation rule for this pool.

" } }, @@ -70448,8 +71937,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70504,8 +71991,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70551,7 +72036,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Determines if the resource is monitored by IPAM. If a resource is monitored, the resource is discovered by IPAM and you can view details about the resource’s CIDR.

", "smithy.api#required": {} } @@ -70595,8 +72079,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70683,8 +72165,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70732,7 +72212,27 @@ "target": "com.amazonaws.ec2#ModifyLaunchTemplateResult" }, "traits": { - "smithy.api#documentation": "

Modifies a launch template. You can specify which version of the launch template to\n set as the default version. When launching an instance, the default version applies when\n a launch template version is not specified.

" + "smithy.api#documentation": "

Modifies a launch template. You can specify which version of the launch template to\n set as the default version. When launching an instance, the default version applies when\n a launch template version is not specified.

", + "smithy.api#examples": [ + { + "title": "To change the default version of a launch template", + "documentation": "This example specifies version 2 as the default version of the specified launch template.", + "input": { + "LaunchTemplateId": "lt-0abcd290751193123", + "DefaultVersion": "2" + }, + "output": { + "LaunchTemplate": { + "LatestVersionNumber": 2, + "LaunchTemplateId": "lt-0abcd290751193123", + "LaunchTemplateName": "WebServers", + "DefaultVersionNumber": 2, + "CreatedBy": "arn:aws:iam::123456789012:root", + "CreateTime": "2017-12-01T13:35:46.000Z" + } + } + } + ] } }, "com.amazonaws.ec2#ModifyLaunchTemplateRequest": { @@ -70741,8 +72241,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -70836,8 +72334,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70886,8 +72382,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -70902,8 +72396,6 @@ "CurrentVersion": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The current version of the prefix list.

" } }, @@ -70930,8 +72422,6 @@ "MaxEntries": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of entries for the prefix list. You cannot modify the entries \n of a prefix list and modify the size of a prefix list at the same time.

\n

If any of the resources that reference the prefix list cannot support the new\n maximum size, the modify operation fails. Check the state message for the IDs of \n the first ten resources that do not support the new maximum size.

" } } @@ -70965,7 +72455,20 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified network interface attribute. You can specify only one\n attribute at a time. You can use this action to attach and detach security groups from\n an existing EC2 instance.

" + "smithy.api#documentation": "

Modifies the specified network interface attribute. You can specify only one\n attribute at a time. You can use this action to attach and detach security groups from\n an existing EC2 instance.

", + "smithy.api#examples": [ + { + "title": "To modify the attachment attribute of a network interface", + "documentation": "This example modifies the attachment attribute of the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-686ea200", + "Attachment": { + "AttachmentId": "eni-attach-43348162", + "DeleteOnTermination": false + } + } + } + ] } }, "com.amazonaws.ec2#ModifyNetworkInterfaceAttributeRequest": { @@ -70991,8 +72494,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -71027,6 +72528,12 @@ "traits": { "smithy.api#documentation": "

Updates the ENA Express configuration for the network interface that’s attached to the\n\t\t\tinstance.

" } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

If you’re modifying a network interface in a dual-stack or IPv6-only subnet, you have\n the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\n address associated with an ENI that you have enabled to use a primary IPv6 address. Use\n this option if the instance that this ENI will be attached to relies on its IPv6 address\n not changing. Amazon Web Services will automatically assign an IPv6 address associated\n with the ENI attached to your instance to be the primary IPv6 address. Once you enable\n an IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\n GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\n address until the instance is terminated or the network interface is detached. If you\n have multiple IPv6 addresses associated with an ENI attached to your instance and you\n enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\n becomes the primary IPv6 address.

" + } } }, "traits": { @@ -71052,8 +72559,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, @@ -71074,16 +72579,12 @@ "EnableResourceNameDnsARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

" } }, "EnableResourceNameDnsAAAARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

" } } @@ -71099,8 +72600,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an\n error.

", "smithy.api#xmlName": "return" } @@ -71209,8 +72708,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -71226,8 +72723,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -71246,7 +72741,22 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Adds or removes permission settings for the specified snapshot. You may add or remove\n specified Amazon Web Services account IDs from a snapshot's list of create volume permissions, but you cannot\n do both in a single operation. If you need to both add and remove account IDs for a snapshot,\n you must use multiple operations. You can make up to 500 modifications to a snapshot in a single operation.

\n

Encrypted snapshots and snapshots with Amazon Web Services Marketplace product codes cannot be made\n public. Snapshots encrypted with your default KMS key cannot be shared with other accounts.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Adds or removes permission settings for the specified snapshot. You may add or remove\n specified Amazon Web Services account IDs from a snapshot's list of create volume permissions, but you cannot\n do both in a single operation. If you need to both add and remove account IDs for a snapshot,\n you must use multiple operations. You can make up to 500 modifications to a snapshot in a single operation.

\n

Encrypted snapshots and snapshots with Amazon Web Services Marketplace product codes cannot be made\n public. Snapshots encrypted with your default KMS key cannot be shared with other accounts.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To modify a snapshot attribute", + "documentation": "This example modifies snapshot ``snap-1234567890abcdef0`` to remove the create volume permission for a user with the account ID ``123456789012``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0", + "Attribute": "createVolumePermission", + "OperationType": "remove", + "UserIds": [ + "123456789012" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifySnapshotAttributeRequest": { @@ -71296,8 +72806,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -71339,8 +72847,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -71382,7 +72888,20 @@ "target": "com.amazonaws.ec2#ModifySpotFleetRequestResponse" }, "traits": { - "smithy.api#documentation": "

Modifies the specified Spot Fleet request.

\n

You can only modify a Spot Fleet request of type maintain.

\n

While the Spot Fleet request is being modified, it is in the modifying\n state.

\n

To scale up your Spot Fleet, increase its target capacity. The Spot Fleet launches the\n additional Spot Instances according to the allocation strategy for the Spot Fleet\n request. If the allocation strategy is lowestPrice, the Spot Fleet launches\n instances using the Spot Instance pool with the lowest price. If the allocation strategy\n is diversified, the Spot Fleet distributes the instances across the Spot\n Instance pools. If the allocation strategy is capacityOptimized, Spot Fleet\n launches instances from Spot Instance pools with optimal capacity for the number of instances\n that are launching.

\n

To scale down your Spot Fleet, decrease its target capacity. First, the Spot Fleet\n cancels any open requests that exceed the new target capacity. You can request that the\n Spot Fleet terminate Spot Instances until the size of the fleet no longer exceeds the\n new target capacity. If the allocation strategy is lowestPrice, the Spot\n Fleet terminates the instances with the highest price per unit. If the allocation\n strategy is capacityOptimized, the Spot Fleet terminates the instances in\n the Spot Instance pools that have the least available Spot Instance capacity. If the allocation\n strategy is diversified, the Spot Fleet terminates instances across the\n Spot Instance pools. Alternatively, you can request that the Spot Fleet keep the fleet\n at its current size, but not replace any Spot Instances that are interrupted or that you\n terminate manually.

\n

If you are finished with your Spot Fleet for now, but will use it again later, you can\n set the target capacity to 0.

" + "smithy.api#documentation": "

Modifies the specified Spot Fleet request.

\n

You can only modify a Spot Fleet request of type maintain.

\n

While the Spot Fleet request is being modified, it is in the modifying\n state.

\n

To scale up your Spot Fleet, increase its target capacity. The Spot Fleet launches the\n additional Spot Instances according to the allocation strategy for the Spot Fleet\n request. If the allocation strategy is lowestPrice, the Spot Fleet launches\n instances using the Spot Instance pool with the lowest price. If the allocation strategy\n is diversified, the Spot Fleet distributes the instances across the Spot\n Instance pools. If the allocation strategy is capacityOptimized, Spot Fleet\n launches instances from Spot Instance pools with optimal capacity for the number of instances\n that are launching.

\n

To scale down your Spot Fleet, decrease its target capacity. First, the Spot Fleet\n cancels any open requests that exceed the new target capacity. You can request that the\n Spot Fleet terminate Spot Instances until the size of the fleet no longer exceeds the\n new target capacity. If the allocation strategy is lowestPrice, the Spot\n Fleet terminates the instances with the highest price per unit. If the allocation\n strategy is capacityOptimized, the Spot Fleet terminates the instances in\n the Spot Instance pools that have the least available Spot Instance capacity. If the allocation\n strategy is diversified, the Spot Fleet terminates instances across the\n Spot Instance pools. Alternatively, you can request that the Spot Fleet keep the fleet\n at its current size, but not replace any Spot Instances that are interrupted or that you\n terminate manually.

\n

If you are finished with your Spot Fleet for now, but will use it again later, you can\n set the target capacity to 0.

", + "smithy.api#examples": [ + { + "title": "To increase the target capacity of a Spot fleet request", + "documentation": "This example increases the target capacity of the specified Spot fleet request.", + "input": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", + "TargetCapacity": 20 + }, + "output": { + "Return": true + } + } + ] } }, "com.amazonaws.ec2#ModifySpotFleetRequestRequest": { @@ -71417,8 +72936,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the fleet.

", "smithy.api#xmlName": "targetCapacity" } @@ -71426,8 +72943,6 @@ "OnDemandTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand Instances in the fleet.

" } }, @@ -71450,8 +72965,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If the request succeeds, the response returns true. If the request fails,\n no response is returned, and instead an error message is returned.

", "smithy.api#xmlName": "return" } @@ -71471,7 +72984,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies a subnet attribute. You can only modify one attribute at a time.

\n

Use this action to modify subnets on Amazon Web Services Outposts.

\n
    \n
  • \n

    To modify a subnet on an Outpost rack, set both\n MapCustomerOwnedIpOnLaunch and\n CustomerOwnedIpv4Pool. These two parameters act as a single\n attribute.

    \n
  • \n
  • \n

    To modify a subnet on an Outpost server, set either\n EnableLniAtDeviceIndex or\n DisableLniAtDeviceIndex.

    \n
  • \n
\n

For more information about Amazon Web Services Outposts, see the following:

\n " + "smithy.api#documentation": "

Modifies a subnet attribute. You can only modify one attribute at a time.

\n

Use this action to modify subnets on Amazon Web Services Outposts.

\n
    \n
  • \n

    To modify a subnet on an Outpost rack, set both\n MapCustomerOwnedIpOnLaunch and\n CustomerOwnedIpv4Pool. These two parameters act as a single\n attribute.

    \n
  • \n
  • \n

    To modify a subnet on an Outpost server, set either\n EnableLniAtDeviceIndex or\n DisableLniAtDeviceIndex.

    \n
  • \n
\n

For more information about Amazon Web Services Outposts, see the following:

\n ", + "smithy.api#examples": [ + { + "title": "To change a subnet's public IP addressing behavior", + "documentation": "This example modifies the specified subnet so that all instances launched into this subnet are assigned a public IP address.", + "input": { + "SubnetId": "subnet-1a2b3c4d", + "MapPublicIpOnLaunch": { + "Value": true + } + } + } + ] } }, "com.amazonaws.ec2#ModifySubnetAttributeRequest": { @@ -71538,8 +73063,6 @@ "EnableLniAtDeviceIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

\n Indicates the device position for local network interfaces in this subnet. For example, \n 1 indicates local network interfaces in this subnet are the secondary \n network interface (eth1). A local network interface cannot be the primary network\n interface (eth0).\n

" } }, @@ -71594,8 +73117,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -71652,8 +73173,6 @@ "RuleNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the Traffic Mirror rule. This number must be unique for each Traffic Mirror rule in a given\n direction. The rules are processed in ascending order by rule number.

" } }, @@ -71678,8 +73197,6 @@ "Protocol": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The protocol, for example TCP, to assign to the Traffic Mirror rule.

" } }, @@ -71711,8 +73228,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -71775,24 +73290,18 @@ "PacketLength": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, - "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet.

" + "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet.

\n

For sessions with Network Load Balancer (NLB) traffic mirror targets, the default PacketLength will be set to 8500. Valid values are 1-8500. Setting a PacketLength greater than 8500 will result in an error response.

" } }, "SessionNumber": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.

\n

Valid values are 1-32766.

" } }, "VirtualNetworkId": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The virtual network ID of the Traffic Mirror session.

" } }, @@ -71812,8 +73321,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -71910,8 +73417,6 @@ "AmazonSideAsn": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \n The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs.

\n

The modify ASN operation is not allowed on a transit gateway with active BGP sessions. You must first delete all transit gateway attachments that have BGP configured prior to modifying the ASN on the transit gateway.

" } } @@ -71960,16 +73465,12 @@ "Blackhole": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to drop traffic that matches this route.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -72020,8 +73521,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -72090,8 +73589,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -72166,8 +73663,6 @@ "Port": { "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

" } } @@ -72195,8 +73690,6 @@ "Port": { "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

" } } @@ -72231,10 +73724,7 @@ "PolicyEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

The status of the Verified Access policy.

", - "smithy.api#required": {} + "smithy.api#documentation": "

The status of the Verified Access policy.

" } }, "PolicyDocument": { @@ -72253,10 +73743,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -72270,8 +73764,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PolicyEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The status of the Verified Access policy.

", "smithy.api#xmlName": "policyEnabled" } @@ -72283,6 +73775,14 @@ "smithy.api#documentation": "

The Verified Access policy document.

", "smithy.api#xmlName": "policyDocument" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -72334,8 +73834,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -72407,10 +73905,7 @@ "PolicyEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

The status of the Verified Access policy.

", - "smithy.api#required": {} + "smithy.api#documentation": "

The status of the Verified Access policy.

" } }, "PolicyDocument": { @@ -72429,10 +73924,14 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -72446,8 +73945,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PolicyEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The status of the Verified Access policy.

", "smithy.api#xmlName": "policyEnabled" } @@ -72459,6 +73956,14 @@ "smithy.api#documentation": "

The Verified Access policy document.

", "smithy.api#xmlName": "policyDocument" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -72498,8 +74003,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -72570,8 +74073,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -72623,8 +74124,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -72744,8 +74243,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -72755,6 +74252,12 @@ "smithy.api#documentation": "

A unique, case-sensitive token that you provide to ensure idempotency of your\n modification request. For more information, see Ensuring Idempotency.

", "smithy.api#idempotencyToken": {} } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest", + "traits": { + "smithy.api#documentation": "

\n Options for server side encryption.\n

" + } } }, "traits": { @@ -72798,7 +74301,21 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies a volume attribute.

\n

By default, all I/O operations for the volume are suspended when the data on the volume is\n determined to be potentially inconsistent, to prevent undetectable, latent data corruption.\n The I/O access to the volume can be resumed by first enabling I/O access and then checking the\n data consistency on your volume.

\n

You can change the default behavior to resume I/O operations. We recommend that you change\n this only for boot volumes or for volumes that are stateless or disposable.

" + "smithy.api#documentation": "

Modifies a volume attribute.

\n

By default, all I/O operations for the volume are suspended when the data on the volume is\n determined to be potentially inconsistent, to prevent undetectable, latent data corruption.\n The I/O access to the volume can be resumed by first enabling I/O access and then checking the\n data consistency on your volume.

\n

You can change the default behavior to resume I/O operations. We recommend that you change\n this only for boot volumes or for volumes that are stateless or disposable.

", + "smithy.api#examples": [ + { + "title": "To modify a volume attribute", + "documentation": "This example sets the ``autoEnableIo`` attribute of the volume with the ID ``vol-1234567890abcdef0`` to ``true``. If the command succeeds, no output is returned.", + "input": { + "DryRun": true, + "VolumeId": "vol-1234567890abcdef0", + "AutoEnableIO": { + "Value": true + } + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ModifyVolumeAttributeRequest": { @@ -72822,8 +74339,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -72839,8 +74354,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -72855,8 +74368,6 @@ "Size": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target size of the volume, in GiB. The target volume size must be greater than or\n equal to the existing size of the volume.

\n

The following are the supported volumes sizes for each volume type:

\n
    \n
  • \n

    \n gp2 and gp3: 1-16,384

    \n
  • \n
  • \n

    \n io1 and io2: 4-16,384

    \n
  • \n
  • \n

    \n st1 and sc1: 125-16,384

    \n
  • \n
  • \n

    \n standard: 1-1,024

    \n
  • \n
\n

Default: The existing size is retained.

" } }, @@ -72869,24 +74380,18 @@ "Iops": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target IOPS rate of the volume. This parameter is valid only for gp3, io1, and io2 volumes.

\n

The following are the supported values for each volume type:

\n
    \n
  • \n

    \n gp3: 3,000-16,000 IOPS

    \n
  • \n
  • \n

    \n io1: 100-64,000 IOPS

    \n
  • \n
  • \n

    \n io2: 100-64,000 IOPS

    \n
  • \n
\n

Default: The existing value is retained if you keep the same volume type. If you change\n the volume type to io1, io2, or gp3, the default is 3,000.

" } }, "Throughput": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target throughput of the volume, in MiB/s. This parameter is valid only for gp3 volumes. \n The maximum value is 1,000.

\n

Default: The existing value is retained if the source and target volume type is gp3.\n Otherwise, the default value is 125.

\n

Valid Range: Minimum value of 125. Maximum value of 1000.

" } }, "MultiAttachEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether to enable Amazon EBS Multi-Attach. If you enable Multi-Attach, you can attach the \n\t\tvolume to up to 16 \n\t\t\tNitro-based instances in the same Availability Zone. This parameter is \n\t\tsupported with io1 and io2 volumes only. For more information, see \n\t\t\n\t\t\tAmazon EBS Multi-Attach in the Amazon Elastic Compute Cloud User Guide.

" } } @@ -72920,7 +74425,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Modifies the specified attribute of the specified VPC.

" + "smithy.api#documentation": "

Modifies the specified attribute of the specified VPC.

", + "smithy.api#examples": [ + { + "title": "To modify the enableDnsSupport attribute", + "documentation": "This example modifies the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for instances in the VPC to their corresponding IP addresses; otherwise, it does not.", + "input": { + "VpcId": "vpc-a01106c2", + "EnableDnsSupport": { + "Value": false + } + } + } + ] } }, "com.amazonaws.ec2#ModifyVpcAttributeRequest": { @@ -72989,8 +74506,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73026,8 +74541,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -73043,8 +74556,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73059,8 +74570,6 @@ "ResetPolicy": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Gateway endpoint) Specify true to reset the policy document to the\n default policy. The default policy allows full access to the service.

" } }, @@ -73101,14 +74610,14 @@ "AddSecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the network interface.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to associate with the endpoint network interfaces.

", "smithy.api#xmlName": "AddSecurityGroupId" } }, "RemoveSecurityGroupIds": { "target": "com.amazonaws.ec2#VpcEndpointSecurityGroupIdList", "traits": { - "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to disassociate from the network interface.

", + "smithy.api#documentation": "

(Interface endpoint) The IDs of the security groups to disassociate from the endpoint network interfaces.

", "smithy.api#xmlName": "RemoveSecurityGroupId" } }, @@ -73127,9 +74636,14 @@ "PrivateDnsEnabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

(Interface endpoint) Indicates whether a private hosted zone is associated with the\n VPC.

" + "smithy.api#documentation": "

(Interface endpoint) Indicates whether a private hosted zone is associated with the VPC.

" + } + }, + "SubnetConfigurations": { + "target": "com.amazonaws.ec2#SubnetConfigurationsList", + "traits": { + "smithy.api#documentation": "

The subnet configurations for the endpoint.

", + "smithy.api#xmlName": "SubnetConfiguration" } } }, @@ -73144,8 +74658,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -73173,8 +74685,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73195,16 +74705,12 @@ "RemovePrivateDnsName": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Interface endpoint configuration) Removes the private DNS name of the endpoint service.

" } }, "AcceptanceRequired": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether requests to create an endpoint to your service must be accepted.

" } }, @@ -73262,8 +74768,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -73291,8 +74795,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73324,8 +74826,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -73353,8 +74853,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73398,8 +74896,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -73418,7 +74914,7 @@ "target": "com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsResult" }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Modifies the VPC peering connection options on one side of a VPC peering connection. You can do the following:

\n
    \n
  • \n

    Enable/disable communication over the peering connection between an EC2-Classic instance that's linked to your VPC (using ClassicLink) and instances in the peer VPC.

    \n
  • \n
  • \n

    Enable/disable communication over the peering connection between instances in your VPC and an EC2-Classic instance that's linked to the peer VPC.

    \n
  • \n
  • \n

    Enable/disable the ability to resolve public DNS hostnames to private IP\n addresses when queried from instances in the peer VPC.

    \n
  • \n
\n

If the peered VPCs are in the same Amazon Web Services account, you can enable DNS\n resolution for queries from the local VPC. This ensures that queries from the local VPC\n resolve to private IP addresses in the peer VPC. This option is not available if the\n peered VPCs are in different Amazon Web Services accounts or different Regions. For\n peered VPCs in different Amazon Web Services accounts, each Amazon Web Services account\n owner must initiate a separate request to modify the peering connection options. For\n inter-region peering connections, you must use the Region for the requester VPC to\n modify the requester VPC peering options and the Region for the accepter VPC to modify\n the accepter VPC peering options. To verify which VPCs are the accepter and the\n requester for a VPC peering connection, use the DescribeVpcPeeringConnections command.

" + "smithy.api#documentation": "

Modifies the VPC peering connection options on one side of a VPC peering connection.

\n

If the peered VPCs are in the same Amazon Web Services account, you can enable DNS\n resolution for queries from the local VPC. This ensures that queries from the local VPC\n resolve to private IP addresses in the peer VPC. This option is not available if the\n peered VPCs are in different Amazon Web Services accounts or different Regions. For\n peered VPCs in different Amazon Web Services accounts, each Amazon Web Services account\n owner must initiate a separate request to modify the peering connection options. For\n inter-region peering connections, you must use the Region for the requester VPC to\n modify the requester VPC peering options and the Region for the accepter VPC to modify\n the accepter VPC peering options. To verify which VPCs are the accepter and the\n requester for a VPC peering connection, use the DescribeVpcPeeringConnections command.

" } }, "com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsRequest": { @@ -73433,8 +74929,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -73490,7 +74984,7 @@ "target": "com.amazonaws.ec2#ModifyVpcTenancyResult" }, "traits": { - "smithy.api#documentation": "

Modifies the instance tenancy attribute of the specified VPC. You can change the\n instance tenancy attribute of a VPC to default only. You cannot change the\n instance tenancy attribute to dedicated.

\n

After you modify the tenancy of the VPC, any new instances that you launch into the\n VPC have a tenancy of default, unless you specify otherwise during launch.\n The tenancy of any existing instances in the VPC is not affected.

\n

For more information, see Dedicated Instances in the\n\t\t\t\tAmazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Modifies the instance tenancy attribute of the specified VPC. You can change the\n instance tenancy attribute of a VPC to default only. You cannot change the\n instance tenancy attribute to dedicated.

\n

After you modify the tenancy of the VPC, any new instances that you launch into the\n VPC have a tenancy of default, unless you specify otherwise during launch.\n The tenancy of any existing instances in the VPC is not affected.

\n

For more information, see Dedicated Instances in the\n\t\t\t\tAmazon EC2 User Guide.

" } }, "com.amazonaws.ec2#ModifyVpcTenancyRequest": { @@ -73515,8 +75009,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -73532,8 +75024,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an\n error.

", "smithy.api#xmlName": "return" } @@ -73605,8 +75095,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -73663,8 +75151,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -73723,8 +75209,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } } @@ -73791,16 +75275,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

" } }, "SkipTunnelReplacement": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Choose whether or not to trigger immediate tunnel replacement.

\n

Valid values: True | False\n

" } } @@ -73841,7 +75321,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and the customer gateway.

\n

Constraints: Allowed characters are alphanumeric characters, periods (.), and\n underscores (_). Must be between 8 and 64 characters in length and cannot start with\n zero (0).

" } @@ -73849,48 +75329,36 @@ "Phase1LifetimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 1 of the IKE negotiation, in seconds.

\n

Constraints: A value between 900 and 28,800.

\n

Default: 28800\n

" } }, "Phase2LifetimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 2 of the IKE negotiation, in seconds.

\n

Constraints: A value between 900 and 3,600. The value must be less than the value for\n Phase1LifetimeSeconds.

\n

Default: 3600\n

" } }, "RekeyMarginTimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The margin time, in seconds, before the phase 2 lifetime expires, during which the\n Amazon Web Services side of the VPN connection performs an IKE rekey. The exact time\n of the rekey is randomly selected based on the value for\n RekeyFuzzPercentage.

\n

Constraints: A value between 60 and half of Phase2LifetimeSeconds.

\n

Default: 540\n

" } }, "RekeyFuzzPercentage": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The percentage of the rekey window (determined by RekeyMarginTimeSeconds)\n during which the rekey time is randomly selected.

\n

Constraints: A value between 0 and 100.

\n

Default: 100\n

" } }, "ReplayWindowSize": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of packets in an IKE replay window.

\n

Constraints: A value between 64 and 2048.

\n

Default: 1024\n

" } }, "DPDTimeoutSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of seconds after which a DPD timeout occurs.

\n

Constraints: A value greater than or equal to 30.

\n

Default: 30\n

" } }, @@ -73964,14 +75432,13 @@ "EnableTunnelLifecycleControl": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Turn on or off tunnel endpoint lifecycle control feature.

" } } }, "traits": { - "smithy.api#documentation": "

The Amazon Web Services Site-to-Site VPN tunnel options to modify.

" + "smithy.api#documentation": "

The Amazon Web Services Site-to-Site VPN tunnel options to modify.

", + "smithy.api#sensitive": {} } }, "com.amazonaws.ec2#MonitorInstances": { @@ -74002,8 +75469,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -74083,7 +75548,19 @@ "target": "com.amazonaws.ec2#MoveAddressToVpcResult" }, "traits": { - "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Moves an Elastic IP address from the EC2-Classic platform to the EC2-VPC platform. The\n Elastic IP address must be allocated to your account for more than 24 hours, and it must not\n be associated with an instance. After the Elastic IP address is moved, it is no longer\n available for use in the EC2-Classic platform, unless you move it back using the\n RestoreAddressToClassic request. You cannot move an Elastic IP address that was\n originally allocated for use in the EC2-VPC platform to the EC2-Classic platform.

" + "smithy.api#documentation": "\n

This action is deprecated.

\n
\n

Moves an Elastic IP address from the EC2-Classic platform to the EC2-VPC platform. The\n Elastic IP address must be allocated to your account for more than 24 hours, and it must not\n be associated with an instance. After the Elastic IP address is moved, it is no longer\n available for use in the EC2-Classic platform, unless you move it back using the\n RestoreAddressToClassic request. You cannot move an Elastic IP address that was\n originally allocated for use in the EC2-VPC platform to the EC2-Classic platform.

", + "smithy.api#examples": [ + { + "title": "To move an address to EC2-VPC", + "documentation": "This example moves the specified Elastic IP address to the EC2-VPC platform.", + "input": { + "PublicIp": "54.123.4.56" + }, + "output": { + "Status": "MoveInProgress" + } + } + ] } }, "com.amazonaws.ec2#MoveAddressToVpcRequest": { @@ -74093,8 +75570,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -74156,8 +75631,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -74424,8 +75897,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsPrimary", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Defines if the IP address is the primary address.

", "smithy.api#xmlName": "isPrimary" } @@ -74575,7 +76046,7 @@ "target": "com.amazonaws.ec2#NetworkAclEntryList", "traits": { "aws.protocols#ec2QueryName": "EntrySet", - "smithy.api#documentation": "

One or more entries (rules) in the network ACL.

", + "smithy.api#documentation": "

The entries (rules) in the network ACL.

", "smithy.api#xmlName": "entrySet" } }, @@ -74583,8 +76054,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Default", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the default network ACL for the VPC.

", "smithy.api#xmlName": "default" } @@ -74685,8 +76154,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Egress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the rule is an egress rule (applied to traffic leaving the subnet).

", "smithy.api#xmlName": "egress" } @@ -74735,8 +76202,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RuleNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number for the entry. ACL entries are processed in ascending order by rule number.

", "smithy.api#xmlName": "ruleNumber" } @@ -74783,8 +76248,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of network bandwidth, in Gbps. If this parameter is not specified, there is no minimum\n limit.

", "smithy.api#xmlName": "min" } @@ -74793,8 +76256,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of network bandwidth, in Gbps. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -74810,16 +76271,12 @@ "Min": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of network bandwidth, in Gbps. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of network bandwidth, in Gbps. To specify no maximum limit, omit this\n parameter.

" } } @@ -74857,6 +76314,22 @@ "smithy.api#documentation": "

The maximum number of network interfaces for the network card.

", "smithy.api#xmlName": "maximumNetworkInterfaces" } + }, + "BaselineBandwidthInGbps": { + "target": "com.amazonaws.ec2#BaselineBandwidthInGbps", + "traits": { + "aws.protocols#ec2QueryName": "BaselineBandwidthInGbps", + "smithy.api#documentation": "

The baseline network performance of the network card, in Gbps.

", + "smithy.api#xmlName": "baselineBandwidthInGbps" + } + }, + "PeakBandwidthInGbps": { + "target": "com.amazonaws.ec2#PeakBandwidthInGbps", + "traits": { + "aws.protocols#ec2QueryName": "PeakBandwidthInGbps", + "smithy.api#documentation": "

The peak (burst) network performance of the network card, in Gbps.

", + "smithy.api#xmlName": "peakBandwidthInGbps" + } } }, "traits": { @@ -75111,8 +76584,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AnalyzedEniCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of network interfaces analyzed.

", "smithy.api#xmlName": "analyzedEniCount" } @@ -75283,8 +76754,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "NetworkPathFound", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the destination is reachable from the source.

", "smithy.api#xmlName": "networkPathFound" } @@ -75366,7 +76835,6 @@ "com.amazonaws.ec2#NetworkInsightsMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 100 @@ -75460,8 +76928,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DestinationPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The destination port.

", "smithy.api#xmlName": "destinationPort" } @@ -75662,8 +77128,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "RequesterManaged", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is being managed by Amazon Web Services.

", "smithy.api#xmlName": "requesterManaged" } @@ -75672,8 +77136,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SourceDestCheck", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether source/destination checking is enabled.

", "smithy.api#xmlName": "sourceDestCheck" } @@ -75714,8 +77176,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DenyAllIgwTraffic", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether a network interface with an IPv6 address is unreachable from the \n public internet. If the value is true, inbound traffic from the internet \n is dropped and you cannot assign an elastic IP address to the network interface. The \n network interface is reachable from peered VPCs and resources connected through a \n transit gateway, including on-premises networks.

", "smithy.api#xmlName": "denyAllIgwTraffic" } @@ -75724,8 +77184,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Ipv6Native", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is an IPv6 only network interface.

", "smithy.api#xmlName": "ipv6Native" } @@ -75830,8 +77288,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is terminated.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -75840,8 +77296,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The device index of the network interface attachment on the instance.

", "smithy.api#xmlName": "deviceIndex" } @@ -75850,8 +77304,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "NetworkCardIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the network card.

", "smithy.api#xmlName": "networkCardIndex" } @@ -75908,8 +77360,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the network interface is deleted when the instance is terminated.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -75958,8 +77408,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of network interfaces. If this parameter is not specified, there is no\n minimum limit.

", "smithy.api#xmlName": "min" } @@ -75968,8 +77416,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of network interfaces. If this parameter is not specified, there is no\n maximum limit.

", "smithy.api#xmlName": "max" } @@ -75985,16 +77431,12 @@ "Min": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of network interfaces. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of network interfaces. To specify no maximum limit, omit this\n parameter.

" } } @@ -76057,6 +77499,14 @@ "smithy.api#documentation": "

The IPv6 address.

", "smithy.api#xmlName": "ipv6Address" } + }, + "IsPrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IsPrimaryIpv6", + "smithy.api#documentation": "

Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information, see ModifyNetworkInterfaceAttribute.

", + "smithy.api#xmlName": "isPrimaryIpv6" + } } }, "traits": { @@ -76223,8 +77673,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Primary", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this IPv4 address is the primary private IPv4 address of the network interface.

", "smithy.api#xmlName": "primary" } @@ -76418,7 +77866,7 @@ "Values": { "target": "com.amazonaws.ec2#ValueStringList", "traits": { - "smithy.api#documentation": "

One or more values for the DHCP option.

", + "smithy.api#documentation": "

The values for the DHCP option.

", "smithy.api#xmlName": "Value" } } @@ -76439,6 +77887,68 @@ "com.amazonaws.ec2#NextToken": { "type": "string" }, + "com.amazonaws.ec2#NitroEnclavesSupport": { + "type": "enum", + "members": { + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "SUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "supported" + } + } + } + }, + "com.amazonaws.ec2#NitroTpmInfo": { + "type": "structure", + "members": { + "SupportedVersions": { + "target": "com.amazonaws.ec2#NitroTpmSupportedVersionsList", + "traits": { + "aws.protocols#ec2QueryName": "SupportedVersions", + "smithy.api#documentation": "

Indicates the supported NitroTPM versions.

", + "smithy.api#xmlName": "supportedVersions" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the supported NitroTPM versions for the instance type.

" + } + }, + "com.amazonaws.ec2#NitroTpmSupport": { + "type": "enum", + "members": { + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "SUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "supported" + } + } + } + }, + "com.amazonaws.ec2#NitroTpmSupportedVersionType": { + "type": "string" + }, + "com.amazonaws.ec2#NitroTpmSupportedVersionsList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#NitroTpmSupportedVersionType", + "traits": { + "smithy.api#xmlName": "item" + } + } + }, "com.amazonaws.ec2#OccurrenceDayRequestSet": { "type": "list", "member": { @@ -76622,8 +78132,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SingleInstanceType", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet uses a single instance type to launch all On-Demand Instances in the\n fleet.

\n

Supported only for fleets of type instant.

", "smithy.api#xmlName": "singleInstanceType" } @@ -76632,8 +78140,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SingleAvailabilityZone", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet launches all On-Demand Instances into a single Availability Zone.

\n

Supported only for fleets of type instant.

", "smithy.api#xmlName": "singleAvailabilityZone" } @@ -76642,8 +78148,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MinTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum target capacity for On-Demand Instances in the fleet. If the minimum target capacity is\n not reached, the fleet launches no instances.

\n

Supported only for fleets of type instant.

\n

At least one of the following must be specified: SingleAvailabilityZone |\n SingleInstanceType\n

", "smithy.api#xmlName": "minTargetCapacity" } @@ -76652,7 +78156,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "MaxTotalPrice", - "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay.

", + "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay.

\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The maxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for maxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
", "smithy.api#xmlName": "maxTotalPrice" } } @@ -76679,31 +78183,25 @@ "SingleInstanceType": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet uses a single instance type to launch all On-Demand Instances in the\n fleet.

\n

Supported only for fleets of type instant.

" } }, "SingleAvailabilityZone": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet launches all On-Demand Instances into a single Availability Zone.

\n

Supported only for fleets of type instant.

" } }, "MinTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum target capacity for On-Demand Instances in the fleet. If the minimum target capacity is\n not reached, the fleet launches no instances.

\n

Supported only for fleets of type instant.

\n

At least one of the following must be specified: SingleAvailabilityZone |\n SingleInstanceType\n

" } }, "MaxTotalPrice": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay.

" + "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay.

\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The MaxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for MaxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
" } } }, @@ -76911,6 +78409,12 @@ } } }, + "com.amazonaws.ec2#PasswordData": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, "com.amazonaws.ec2#PathComponent": { "type": "structure", "members": { @@ -76918,8 +78422,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SequenceNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The sequence number.

", "smithy.api#xmlName": "sequenceNumber" } @@ -77272,6 +78774,9 @@ "smithy.api#documentation": "

Describes the data that identifies an Amazon FPGA image (AFI) on the PCI bus.

" } }, + "com.amazonaws.ec2#PeakBandwidthInGbps": { + "type": "double" + }, "com.amazonaws.ec2#PeeringAttachmentStatus": { "type": "structure", "members": { @@ -77303,8 +78808,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowDnsResolutionFromRemoteVpc", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If true, the public DNS hostnames of instances in the specified VPC resolve to private\n IP addresses when queried from instances in the peer VPC.

", "smithy.api#xmlName": "allowDnsResolutionFromRemoteVpc" } @@ -77313,9 +78816,7 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowEgressFromLocalClassicLinkToRemoteVpc", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from an EC2-Classic instance that's linked to\n a local VPC using ClassicLink to instances in a peer VPC.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalClassicLinkToRemoteVpc" } }, @@ -77323,15 +78824,13 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowEgressFromLocalVpcToRemoteClassicLink", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from instances in a local VPC to an\n EC2-Classic instance that's linked to a peer VPC using ClassicLink.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalVpcToRemoteClassicLink" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the VPC peering connection options.

" + "smithy.api#documentation": "

Describes the VPC peering connection options.

" } }, "com.amazonaws.ec2#PeeringConnectionOptionsRequest": { @@ -77340,30 +78839,24 @@ "AllowDnsResolutionFromRemoteVpc": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables a local VPC to resolve public DNS hostnames to private IP addresses when queried from instances in the peer VPC.

" + "smithy.api#documentation": "

If true, enables a local VPC to resolve public DNS hostnames to private IP addresses \n when queried from instances in the peer VPC.

" } }, "AllowEgressFromLocalClassicLinkToRemoteVpc": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from an EC2-Classic instance that's linked to\n a local VPC using ClassicLink to instances in a peer VPC.

" + "smithy.api#documentation": "

Deprecated.

" } }, "AllowEgressFromLocalVpcToRemoteClassicLink": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

If true, enables outbound communication from instances in a local VPC to an\n EC2-Classic instance that's linked to a peer VPC using ClassicLink.

" + "smithy.api#documentation": "

Deprecated.

" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

The VPC peering connection options.

" + "smithy.api#documentation": "

The VPC peering connection options.

" } }, "com.amazonaws.ec2#PeeringTgwInfo": { @@ -77474,8 +78967,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Value", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Diffie-Hellmann group number.

", "smithy.api#xmlName": "value" } @@ -77500,8 +78991,6 @@ "Value": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Diffie-Hellmann group number.

" } } @@ -77622,8 +79111,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Value", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Diffie-Hellmann group number.

", "smithy.api#xmlName": "value" } @@ -77648,8 +79135,6 @@ "Value": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The Diffie-Hellmann group number.

" } } @@ -77785,8 +79270,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PartitionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of the partition that the instance is in. Valid only if the placement group\n strategy is set to partition.

\n

This parameter is not supported for CreateFleet.

", "smithy.api#xmlName": "partitionNumber" } @@ -77867,8 +79350,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PartitionCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of partitions. Valid only if strategy is\n set to partition.

", "smithy.api#xmlName": "partitionCount" } @@ -77913,7 +79394,7 @@ "com.amazonaws.ec2#PlacementGroupArn": { "type": "string", "traits": { - "smithy.api#pattern": "^arn:aws([a-z-]+)?:ec2:[a-z\\d-]+:\\d{12}:placement-group/([^\\s].+[^\\s]){1,255}$" + "smithy.api#pattern": "^arn:aws([a-z-]+)?:ec2:[a-z\\d-]+:\\d{12}:placement-group/^.{1,255}$" } }, "com.amazonaws.ec2#PlacementGroupId": { @@ -78101,7 +79582,6 @@ "com.amazonaws.ec2#PoolMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 10 @@ -78111,7 +79591,6 @@ "com.amazonaws.ec2#Port": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 65535 @@ -78125,8 +79604,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "From", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The first port in the range.

", "smithy.api#xmlName": "from" } @@ -78135,8 +79612,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "To", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The last port in the range.

", "smithy.api#xmlName": "to" } @@ -78298,7 +79773,6 @@ "com.amazonaws.ec2#PrefixListMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 100 @@ -78410,8 +79884,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Active", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The current price schedule, as determined by the term remaining for the Reserved Instance in the listing.

\n

A specific price schedule is always in effect, but only one price schedule can be active at any time. Take, for example, a Reserved Instance listing that has five months remaining in its term. When you specify price schedules for five months and two months, this means that schedule 1, covering the first three months of the remaining term, will be active during months 5, 4, and 3. Then schedule 2, covering the last two months of the term, will be active for months 2 and 1.

", "smithy.api#xmlName": "active" } @@ -78428,8 +79900,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Price", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The fixed price for the term.

", "smithy.api#xmlName": "price" } @@ -78438,8 +79908,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Term", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of months remaining in the reservation. For example, 2 is the second to the last month before the capacity reservation expires.

", "smithy.api#xmlName": "term" } @@ -78473,8 +79941,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Price", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The fixed price for the term.

", "smithy.api#xmlName": "price" } @@ -78483,8 +79949,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Term", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of months remaining in the reservation. For example, 2 is the second to the last month before the capacity reservation expires.

", "smithy.api#xmlName": "term" } @@ -78510,8 +79974,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Count", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of reservations available for the price.

", "smithy.api#xmlName": "count" } @@ -78520,8 +79982,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Price", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The price per instance.

", "smithy.api#xmlName": "price" } @@ -78617,7 +80077,6 @@ "com.amazonaws.ec2#Priority": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": -1, "max": 65535 @@ -78704,8 +80163,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

", "smithy.api#xmlName": "enableResourceNameDnsARecord" } @@ -78714,8 +80171,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsAAAARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostname with DNS AAAA\n records.

", "smithy.api#xmlName": "enableResourceNameDnsAAAARecord" } @@ -78737,16 +80192,12 @@ "EnableResourceNameDnsARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

" } }, "EnableResourceNameDnsAAAARecord": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

" } } @@ -78770,8 +80221,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS A\n records.

", "smithy.api#xmlName": "enableResourceNameDnsARecord" } @@ -78780,8 +80229,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableResourceNameDnsAAAARecord", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\n records.

", "smithy.api#xmlName": "enableResourceNameDnsAAAARecord" } @@ -78803,7 +80250,6 @@ "com.amazonaws.ec2#PrivateIpAddressCount": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 31 @@ -78817,8 +80263,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Primary", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the private IPv4 address is the primary private IPv4 address. Only\n one IPv4 address can be designated as primary.

", "smithy.api#xmlName": "primary" } @@ -78877,7 +80321,7 @@ "target": "com.amazonaws.ec2#SupportedAdditionalProcessorFeatureList", "traits": { "aws.protocols#ec2QueryName": "SupportedFeatures", - "smithy.api#documentation": "

Indicates whether the instance type supports AMD SEV-SNP. If the request returns \n amd-sev-snp, AMD SEV-SNP is supported. Otherwise, it is not supported.

", + "smithy.api#documentation": "

Indicates whether the instance type supports AMD SEV-SNP. If the request returns \n amd-sev-snp, AMD SEV-SNP is supported. Otherwise, it is not supported. \n For more information, see \n AMD SEV-SNP.

", "smithy.api#xmlName": "supportedFeatures" } } @@ -78999,7 +80443,6 @@ "com.amazonaws.ec2#ProtocolInt": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0, "max": 255 @@ -79067,8 +80510,6 @@ "PubliclyAdvertisable": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(IPv6 only) Indicate whether the address range will be publicly advertised to the\n internet.

\n

Default: true

" } }, @@ -79081,8 +80522,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -79096,8 +80535,6 @@ "MultiRegion": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Reserved.

" } } @@ -79140,8 +80577,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -79168,8 +80603,6 @@ "NetmaskLength": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The netmask length of the CIDR you'd like to provision to a pool. Can be used for provisioning Amazon-provided IPv6 CIDRs to top-level pools and for provisioning CIDRs to pools with source pools. Cannot be used to provision BYOIP CIDRs to top-level pools. Either \"NetmaskLength\" or \"Cidr\" is required.

" } }, @@ -79219,8 +80652,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -79244,7 +80675,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The netmask length of the CIDR you would like to allocate to the public IPv4 pool.

", "smithy.api#required": {} } @@ -79401,8 +80831,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of addresses.

", "smithy.api#xmlName": "totalAddressCount" } @@ -79411,8 +80839,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalAvailableAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of available addresses.

", "smithy.api#xmlName": "totalAvailableAddressCount" } @@ -79470,8 +80896,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of addresses in the range.

", "smithy.api#xmlName": "addressCount" } @@ -79480,8 +80904,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of available addresses in the range.

", "smithy.api#xmlName": "availableAddressCount" } @@ -79524,8 +80946,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The duration of the reservation's term in seconds.

", "smithy.api#xmlName": "duration" } @@ -79699,7 +81119,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances.

", "smithy.api#required": {} } @@ -79750,7 +81169,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Reserved Instances to purchase.

", "smithy.api#required": {} } @@ -79767,8 +81185,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -79835,8 +81251,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -79940,7 +81354,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Requests a reboot of the specified instances. This operation is asynchronous; it only\n queues a request to reboot the specified instances. The operation succeeds if the\n instances are valid and belong to you. Requests to reboot terminated instances are\n ignored.

\n

If an instance does not cleanly shut down within a few minutes, Amazon EC2 performs a\n hard reboot.

\n

For more information about troubleshooting, see Troubleshoot an unreachable\n instance in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Requests a reboot of the specified instances. This operation is asynchronous; it only\n queues a request to reboot the specified instances. The operation succeeds if the\n instances are valid and belong to you. Requests to reboot terminated instances are\n ignored.

\n

If an instance does not cleanly shut down within a few minutes, Amazon EC2 performs a\n hard reboot.

\n

For more information about troubleshooting, see Troubleshoot an unreachable\n instance in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To reboot an EC2 instance", + "documentation": "This example reboots the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef5" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#RebootInstancesRequest": { @@ -79959,8 +81385,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -79977,8 +81401,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Amount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of the recurring charge.

", "smithy.api#xmlName": "amount" } @@ -80174,8 +81596,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -80184,8 +81604,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnaSupport", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Set to true to enable enhanced networking with ENA for the AMI and any instances that you launch from the AMI.

\n

This option is supported only for HVM AMIs. Specifying this option with a PV AMI can make instances launched from the AMI unreachable.

", "smithy.api#xmlName": "enaSupport" } @@ -80312,8 +81730,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -80352,8 +81768,6 @@ "IncludeAllTagsOfInstance": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to register all tag keys in the current Region. Specify true \n \tto register all tag keys.

" } }, @@ -80409,8 +81823,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -80475,8 +81887,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -80537,8 +81947,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -80589,8 +81997,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -80641,8 +82047,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -80685,8 +82089,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -80747,8 +82149,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -80775,8 +82175,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -80795,7 +82193,16 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Releases the specified Elastic IP address.

\n

[Default VPC] Releasing an Elastic IP address automatically disassociates it\n\t\t\t\tfrom any instance that it's associated with. To disassociate an Elastic IP address without\n\t\t\t\treleasing it, use DisassociateAddress.

\n

[Nondefault VPC] You must use DisassociateAddress to disassociate the Elastic IP address\n\t\t\t before you can release it. Otherwise, Amazon EC2 returns an error (InvalidIPAddress.InUse).

\n

After releasing an Elastic IP address, it is released to the IP address pool. \n Be sure to update your DNS records and any servers or devices that communicate with the address. \n If you attempt to release an Elastic IP address that you already released, you'll get an\n AuthFailure error if the address is already allocated to another Amazon Web Services account.

\n

After you release an Elastic IP address, you might be able to recover it.\n For more information, see AllocateAddress.

" + "smithy.api#documentation": "

Releases the specified Elastic IP address.

\n

[Default VPC] Releasing an Elastic IP address automatically disassociates it\n\t\t\t\tfrom any instance that it's associated with. To disassociate an Elastic IP address without\n\t\t\t\treleasing it, use DisassociateAddress.

\n

[Nondefault VPC] You must use DisassociateAddress to disassociate the Elastic IP address\n\t\t\t before you can release it. Otherwise, Amazon EC2 returns an error (InvalidIPAddress.InUse).

\n

After releasing an Elastic IP address, it is released to the IP address pool. \n Be sure to update your DNS records and any servers or devices that communicate with the address. \n If you attempt to release an Elastic IP address that you already released, you'll get an\n AuthFailure error if the address is already allocated to another Amazon Web Services account.

\n

After you release an Elastic IP address, you might be able to recover it.\n For more information, see AllocateAddress.

", + "smithy.api#examples": [ + { + "title": "To release an Elastic IP address", + "documentation": "This example releases the specified Elastic IP address.", + "input": { + "AllocationId": "eipalloc-64d5890a" + } + } + ] } }, "com.amazonaws.ec2#ReleaseAddressRequest": { @@ -80816,15 +82223,13 @@ "NetworkBorderGroup": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services advertises\n IP addresses.

\n

If you provide an incorrect network border group, you receive an InvalidAddress.NotFound error.

\n

You cannot use a network border group with EC2 Classic. If you attempt this operation on EC2 classic, you \n receive an InvalidParameterCombination error.

" + "smithy.api#documentation": "

The set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services advertises\n IP addresses.

\n

If you provide an incorrect network border group, you receive an InvalidAddress.NotFound error.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -80897,7 +82302,7 @@ "target": "com.amazonaws.ec2#ReleaseIpamPoolAllocationResult" }, "traits": { - "smithy.api#documentation": "

Release an allocation within an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations. You can only use this action to release manual allocations. To remove an allocation for a resource without deleting the resource, set its monitored state to false using ModifyIpamResourceCidr. For more information, see Release an allocation in the Amazon VPC IPAM User Guide.\n

\n \n

All EC2 API actions follow an eventual consistency model.

\n
" + "smithy.api#documentation": "

Release an allocation within an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations. You can only use this action to release manual allocations. To remove an allocation for a resource without deleting the resource, set its monitored state to false using ModifyIpamResourceCidr. For more information, see Release an allocation in the Amazon VPC IPAM User Guide.\n

\n \n

All EC2 API actions follow an eventual consistency model.

\n
" } }, "com.amazonaws.ec2#ReleaseIpamPoolAllocationRequest": { @@ -80906,8 +82311,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

A check for whether you have the required permissions for the action without actually making the request \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -80947,8 +82350,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Success", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates if the release was successful.

", "smithy.api#xmlName": "success" } @@ -81073,7 +82474,20 @@ "target": "com.amazonaws.ec2#ReplaceNetworkAclAssociationResult" }, "traits": { - "smithy.api#documentation": "

Changes which network ACL a subnet is associated with. By default when you create a\n\t\t\tsubnet, it's automatically associated with the default network ACL. For more\n\t\t\tinformation, see Network\n\t\t\tACLs in the Amazon Virtual Private Cloud User Guide.

\n

This is an idempotent operation.

" + "smithy.api#documentation": "

Changes which network ACL a subnet is associated with. By default when you create a\n\t\t\tsubnet, it's automatically associated with the default network ACL. For more\n\t\t\tinformation, see Network ACLs in the Amazon VPC User Guide.

\n

This is an idempotent operation.

", + "smithy.api#examples": [ + { + "title": "To replace the network ACL associated with a subnet", + "documentation": "This example associates the specified network ACL with the subnet for the specified network ACL association.", + "input": { + "AssociationId": "aclassoc-e5b95c8c", + "NetworkAclId": "acl-5fb85d36" + }, + "output": { + "NewAssociationId": "aclassoc-3999875b" + } + } + ] } }, "com.amazonaws.ec2#ReplaceNetworkAclAssociationRequest": { @@ -81093,8 +82507,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -81139,7 +82551,25 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Replaces an entry (rule) in a network ACL. For more information, see Network ACLs in the\n\t\t\t\tAmazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Replaces an entry (rule) in a network ACL. For more information, see Network ACLs in the\n\t\t\t\tAmazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To replace a network ACL entry", + "documentation": "This example replaces an entry for the specified network ACL. The new rule 100 allows ingress traffic from 203.0.113.12/24 on UDP port 53 (DNS) into any associated subnet.", + "input": { + "NetworkAclId": "acl-5fb85d36", + "RuleNumber": 100, + "Protocol": "17", + "RuleAction": "allow", + "Egress": false, + "CidrBlock": "203.0.113.12/24", + "PortRange": { + "From": 53, + "To": 53 + } + } + } + ] } }, "com.amazonaws.ec2#ReplaceNetworkAclEntryRequest": { @@ -81157,8 +82587,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -81168,7 +82596,6 @@ "traits": { "aws.protocols#ec2QueryName": "Egress", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to replace the egress rule.

\n

Default: If no value is specified, we replace the ingress rule.

", "smithy.api#required": {}, "smithy.api#xmlName": "egress" @@ -81232,7 +82659,6 @@ "traits": { "aws.protocols#ec2QueryName": "RuleNumber", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number of the entry to replace.

", "smithy.api#required": {}, "smithy.api#xmlName": "ruleNumber" @@ -81314,8 +82740,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteReplacedRootVolume", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the original root volume is to be deleted after the root volume \n replacement task completes.

", "smithy.api#xmlName": "deleteReplacedRootVolume" } @@ -81396,7 +82820,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Replaces an existing route within a route table in a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list, or reset the local route to its default \n target.

\n

For more information, see Route tables in the\n Amazon Virtual Private Cloud User Guide.

" + "smithy.api#documentation": "

Replaces an existing route within a route table in a VPC.

\n

You must specify either a destination CIDR block or a prefix list ID. You must also specify \n exactly one of the resources from the parameter list, or reset the local route to its default \n target.

\n

For more information, see Route tables in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To replace a route", + "documentation": "This example replaces the specified route in the specified table table. The new route matches the specified CIDR and sends the traffic to the specified virtual private gateway.", + "input": { + "RouteTableId": "rtb-22574640", + "DestinationCidrBlock": "10.0.0.0/16", + "GatewayId": "vgw-9a4cacf3" + } + } + ] } }, "com.amazonaws.ec2#ReplaceRouteRequest": { @@ -81428,8 +82863,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -81467,8 +82900,6 @@ "LocalTarget": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Specifies whether to reset the local route to its default target (local).

" } }, @@ -81544,7 +82975,20 @@ "target": "com.amazonaws.ec2#ReplaceRouteTableAssociationResult" }, "traits": { - "smithy.api#documentation": "

Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\n completes, the subnet or gateway uses the routes in the new route table. For more\n information about route tables, see Route\n tables in the Amazon Virtual Private Cloud User Guide.

\n

You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.

" + "smithy.api#documentation": "

Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\n completes, the subnet or gateway uses the routes in the new route table. For more\n information about route tables, see Route\n tables in the Amazon VPC User Guide.

\n

You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.

", + "smithy.api#examples": [ + { + "title": "To replace the route table associated with a subnet", + "documentation": "This example associates the specified route table with the subnet for the specified route table association.", + "input": { + "AssociationId": "rtbassoc-781d0d1a", + "RouteTableId": "rtb-22574640" + }, + "output": { + "NewAssociationId": "rtbassoc-3a1f0f58" + } + } + ] } }, "com.amazonaws.ec2#ReplaceRouteTableAssociationRequest": { @@ -81564,8 +83008,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -81649,16 +83091,12 @@ "Blackhole": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether traffic matching this route is to be dropped.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -81717,16 +83155,12 @@ "ApplyPendingMaintenance": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Trigger pending tunnel endpoint maintenance.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -81742,8 +83176,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Confirmation of replace tunnel operation.

", "smithy.api#xmlName": "return" } @@ -81856,8 +83288,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -81936,16 +83366,12 @@ "FromPort": { "target": "com.amazonaws.ec2#Port", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The first port in the range.

" } }, "ToPort": { "target": "com.amazonaws.ec2#Port", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The last port in the range.

" } } @@ -82025,8 +83451,6 @@ "EbsOptimized": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\n provides dedicated throughput to Amazon EBS and an optimized configuration stack to\n provide optimal Amazon EBS I/O performance. This optimization isn't available with all\n instance types. Additional usage charges apply when using an EBS-optimized\n instance.

" } }, @@ -82089,8 +83513,6 @@ "DisableApiTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you set this parameter to true, you can't terminate the instance using\n the Amazon EC2 console, CLI, or API; otherwise, you can. To change this attribute after\n launch, use ModifyInstanceAttribute. Alternatively, if you set\n InstanceInitiatedShutdownBehavior to terminate, you can\n terminate the instance by running the shutdown command from the instance.

" } }, @@ -82123,7 +83545,7 @@ "ElasticInferenceAccelerators": { "target": "com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorList", "traits": { - "smithy.api#documentation": "

The elastic inference accelerator for the instance.

", + "smithy.api#documentation": "

An elastic inference accelerator to associate with the instance. Elastic inference\n accelerators are a resource you can attach to your Amazon EC2 instances to accelerate\n your Deep Learning (DL) inference workloads.

\n

You cannot specify accelerators from different generations in the same request.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon\n Elastic Inference (EI), and will help current customers migrate their workloads to\n options that offer better price and performance. After April 15, 2023, new customers\n will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker,\n Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during\n the past 30-day period are considered current customers and will be able to continue\n using the service.

\n
", "smithy.api#xmlName": "ElasticInferenceAccelerator" } }, @@ -82193,7 +83615,7 @@ "InstanceRequirements": { "target": "com.amazonaws.ec2#InstanceRequirementsRequest", "traits": { - "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

If you specify InstanceRequirements, you can't specify\n InstanceType.

" + "smithy.api#documentation": "

The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\n identify instance types with these attributes.

\n

You must specify VCpuCount and MemoryMiB. All other attributes\n are optional. Any unspecified optional attribute is set to its default.

\n

When you specify multiple attributes, you get instance types that satisfy all of the\n specified attributes. If you specify multiple values for an attribute, you get instance\n types that satisfy any of the specified values.

\n

To limit the list of instance types from which Amazon EC2 can identify matching instance types, \n you can use one of the following parameters, but not both in the same request:

\n
    \n
  • \n

    \n AllowedInstanceTypes - The instance types to include in the list. All \n other instance types are ignored, even if they match your specified attributes.

    \n
  • \n
  • \n

    \n ExcludedInstanceTypes - The instance types to exclude from the list, \n even if they match your specified attributes.

    \n
  • \n
\n \n

If you specify InstanceRequirements, you can't specify\n InstanceType.

\n

Attribute-based instance type selection is only supported when using Auto Scaling\n groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\n the launch instance\n wizard, or with the RunInstances API or\n AWS::EC2::Instance Amazon Web Services CloudFormation resource, you can't specify InstanceRequirements.

\n
\n

For more information, see Attribute-based instance type selection for EC2 Fleet, Attribute-based instance type selection for Spot Fleet, and Spot\n placement score in the Amazon EC2 User Guide.

" } }, "PrivateDnsNameOptions": { @@ -82211,8 +83633,6 @@ "DisableApiStop": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to enable the instance for stop protection. For more information,\n see Stop\n protection in the Amazon Elastic Compute Cloud User Guide.

" } } @@ -82230,7 +83650,39 @@ "target": "com.amazonaws.ec2#RequestSpotFleetResponse" }, "traits": { - "smithy.api#documentation": "

Creates a Spot Fleet request.

\n

The Spot Fleet request specifies the total target capacity and the On-Demand target\n capacity. Amazon EC2 calculates the difference between the total capacity and On-Demand\n capacity, and launches the difference as Spot capacity.

\n

You can submit a single request that includes multiple launch specifications that vary\n by instance type, AMI, Availability Zone, or subnet.

\n

By default, the Spot Fleet requests Spot Instances in the Spot Instance pool where the\n price per unit is the lowest. Each launch specification can include its own instance\n weighting that reflects the value of the instance type to your application\n workload.

\n

Alternatively, you can specify that the Spot Fleet distribute the target capacity\n across the Spot pools included in its launch specifications. By ensuring that the Spot\n Instances in your Spot Fleet are in different Spot pools, you can improve the\n availability of your fleet.

\n

You can specify tags for the Spot Fleet request and instances launched by the fleet.\n You cannot tag other resource types in a Spot Fleet request because only the\n spot-fleet-request and instance resource types are\n supported.

\n

For more information, see Spot Fleet requests\n in the Amazon EC2 User Guide.

\n \n

We strongly discourage using the RequestSpotFleet API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide.

\n
" + "smithy.api#documentation": "

Creates a Spot Fleet request.

\n

The Spot Fleet request specifies the total target capacity and the On-Demand target\n capacity. Amazon EC2 calculates the difference between the total capacity and On-Demand\n capacity, and launches the difference as Spot capacity.

\n

You can submit a single request that includes multiple launch specifications that vary\n by instance type, AMI, Availability Zone, or subnet.

\n

By default, the Spot Fleet requests Spot Instances in the Spot Instance pool where the\n price per unit is the lowest. Each launch specification can include its own instance\n weighting that reflects the value of the instance type to your application\n workload.

\n

Alternatively, you can specify that the Spot Fleet distribute the target capacity\n across the Spot pools included in its launch specifications. By ensuring that the Spot\n Instances in your Spot Fleet are in different Spot pools, you can improve the\n availability of your fleet.

\n

You can specify tags for the Spot Fleet request and instances launched by the fleet.\n You cannot tag other resource types in a Spot Fleet request because only the\n spot-fleet-request and instance resource types are\n supported.

\n

For more information, see Spot Fleet requests\n in the Amazon EC2 User Guide.

\n \n

We strongly discourage using the RequestSpotFleet API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To request a Spot fleet in the subnet with the lowest price", + "documentation": "This example creates a Spot fleet request with two launch specifications that differ only by subnet. The Spot fleet launches the instances in the specified subnet with the lowest price. If the instances are launched in a default VPC, they receive a public IP address by default. If the instances are launched in a nondefault VPC, they do not receive a public IP address by default. Note that you can't specify different subnets from the same Availability Zone in a Spot fleet request.", + "input": { + "SpotFleetRequestConfig": { + "SpotPrice": "0.04", + "TargetCapacity": 2, + "IamFleetRole": "arn:aws:iam::123456789012:role/my-spot-fleet-role", + "LaunchSpecifications": [ + { + "ImageId": "ami-1a2b3c4d", + "KeyName": "my-key-pair", + "SecurityGroups": [ + { + "GroupId": "sg-1a2b3c4d" + } + ], + "InstanceType": "m3.medium", + "SubnetId": "subnet-1a2b3c4d, subnet-3c4d5e6f", + "IamInstanceProfile": { + "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role" + } + } + ] + } + }, + "output": { + "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" + } + } + ] } }, "com.amazonaws.ec2#RequestSpotFleetRequest": { @@ -82240,8 +83692,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -82288,7 +83738,32 @@ "target": "com.amazonaws.ec2#RequestSpotInstancesResult" }, "traits": { - "smithy.api#documentation": "

Creates a Spot Instance request.

\n

For more information, see Spot Instance requests in\n the Amazon EC2 User Guide for Linux Instances.

\n \n

We strongly discourage using the RequestSpotInstances API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide for Linux Instances.

\n
" + "smithy.api#documentation": "

Creates a Spot Instance request.

\n

For more information, see Spot Instance requests in\n the Amazon EC2 User Guide for Linux Instances.

\n \n

We strongly discourage using the RequestSpotInstances API because it is a legacy\n API with no planned investment. For options for requesting Spot Instances, see\n Which\n is the best Spot request method to use? in the\n Amazon EC2 User Guide for Linux Instances.

\n
", + "smithy.api#examples": [ + { + "title": "To create a one-time Spot Instance request", + "documentation": "This example creates a one-time Spot Instance request for five instances in the specified Availability Zone. If your account supports EC2-VPC only, Amazon EC2 launches the instances in the default subnet of the specified Availability Zone.", + "input": { + "SpotPrice": "0.03", + "InstanceCount": 5, + "Type": "one-time", + "LaunchSpecification": { + "ImageId": "ami-1a2b3c4d", + "KeyName": "my-key-pair", + "SecurityGroupIds": [ + "sg-1a2b3c4d" + ], + "InstanceType": "m3.medium", + "Placement": { + "AvailabilityZone": "us-west-2a" + }, + "IamInstanceProfile": { + "Arn": "arn:aws:iam::123456789012:instance-profile/my-iam-role" + } + } + } + } + ] } }, "com.amazonaws.ec2#RequestSpotInstancesRequest": { @@ -82306,8 +83781,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "BlockDurationMinutes", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "blockDurationMinutes" } @@ -82324,8 +83797,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually\n making the request, and provides an error response. If you have the required\n permissions, the error response is DryRunOperation. Otherwise, it is\n UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -82334,8 +83805,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of Spot Instances to launch.

\n

Default: 1

", "smithy.api#xmlName": "instanceCount" } @@ -82459,8 +83928,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.

\n

Default: false\n

", "smithy.api#xmlName": "ebsOptimized" } @@ -82659,8 +84126,6 @@ "EbsOptimized": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the Capacity Reservation Fleet supports EBS-optimized instances types. This \n\t\t\toptimization provides dedicated throughput to Amazon EBS and an optimized configuration stack \n\t\t\tto provide optimal I/O performance. This optimization isn't available with all instance types. Additional \n\t\t\tusage charges apply when using EBS-optimized instance types.

" } }, @@ -82770,8 +84235,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Amount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Used for Reserved Instance Marketplace offerings. Specifies the limit price on the total order (instanceCount * price).

", "smithy.api#xmlName": "amount" } @@ -82878,8 +84341,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The duration of the Reserved Instance, in seconds.

", "smithy.api#xmlName": "duration" } @@ -82896,8 +84357,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "FixedPrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The purchase price of the Reserved Instance.

", "smithy.api#xmlName": "fixedPrice" } @@ -82906,8 +84365,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of reservations purchased.

", "smithy.api#xmlName": "instanceCount" } @@ -82956,8 +84413,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "UsagePrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The usage price of the Reserved Instance, per hour.

", "smithy.api#xmlName": "usagePrice" } @@ -83038,8 +84493,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of modified Reserved Instances.

\n \n

This is a required field for a request.

\n
", "smithy.api#xmlName": "instanceCount" } @@ -83365,8 +84818,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Duration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The duration of the Reserved Instance, in seconds.

", "smithy.api#xmlName": "duration" } @@ -83375,8 +84826,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "FixedPrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The purchase price of the Reserved Instance.

", "smithy.api#xmlName": "fixedPrice" } @@ -83409,8 +84858,6 @@ "target": "com.amazonaws.ec2#Float", "traits": { "aws.protocols#ec2QueryName": "UsagePrice", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The usage price of the Reserved Instance, per hour.

", "smithy.api#xmlName": "usagePrice" } @@ -83435,8 +84882,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Marketplace", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the offering is available through the Reserved Instance Marketplace (resale) or Amazon Web Services. \n If it's a Reserved Instance Marketplace offering, this is true.

", "smithy.api#xmlName": "marketplace" } @@ -83547,8 +84992,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -83591,8 +85034,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -83646,8 +85087,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -83677,8 +85116,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Is true if the request succeeds, and an error otherwise.

", "smithy.api#xmlName": "return" } @@ -83697,7 +85134,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets an attribute of an AMI to its default value.

" + "smithy.api#documentation": "

Resets an attribute of an AMI to its default value.

", + "smithy.api#examples": [ + { + "title": "To reset the launchPermission attribute", + "documentation": "This example resets the launchPermission attribute for the specified AMI. By default, AMIs are private.", + "input": { + "Attribute": "launchPermission", + "ImageId": "ami-5731123e" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetImageAttributeName": { @@ -83734,8 +85182,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -83755,7 +85201,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets an attribute of an instance to its default value. To reset the\n kernel or ramdisk, the instance must be in a stopped\n state. To reset the sourceDestCheck, the instance can be either running or\n stopped.

\n

The sourceDestCheck attribute controls whether source/destination\n checking is enabled. The default value is true, which means checking is\n enabled. This value must be false for a NAT instance to perform NAT. For\n more information, see NAT Instances in the\n Amazon VPC User Guide.

" + "smithy.api#documentation": "

Resets an attribute of an instance to its default value. To reset the\n kernel or ramdisk, the instance must be in a stopped\n state. To reset the sourceDestCheck, the instance can be either running or\n stopped.

\n

The sourceDestCheck attribute controls whether source/destination\n checking is enabled. The default value is true, which means checking is\n enabled. This value must be false for a NAT instance to perform NAT. For\n more information, see NAT Instances in the\n Amazon VPC User Guide.

", + "smithy.api#examples": [ + { + "title": "To reset the sourceDestCheck attribute", + "documentation": "This example resets the sourceDestCheck attribute for the specified instance.", + "input": { + "Attribute": "sourceDestCheck", + "InstanceId": "i-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetInstanceAttributeRequest": { @@ -83775,8 +85232,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -83815,8 +85270,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -83854,7 +85307,18 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Resets permission settings for the specified snapshot.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

" + "smithy.api#documentation": "

Resets permission settings for the specified snapshot.

\n

For more information about modifying snapshot permissions, see Share a snapshot in the\n Amazon Elastic Compute Cloud User Guide.

", + "smithy.api#examples": [ + { + "title": "To reset a snapshot attribute", + "documentation": "This example resets the create volume permissions for snapshot ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.", + "input": { + "SnapshotId": "snap-1234567890abcdef0", + "Attribute": "createVolumePermission" + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#ResetSnapshotAttributeRequest": { @@ -83880,8 +85344,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -84539,8 +86001,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for Amazon EBS I/O.

", "smithy.api#xmlName": "ebsOptimized" } @@ -84621,8 +86081,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DisableApiTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If set to true, indicates that the instance cannot be terminated using\n the Amazon EC2 console, command line tool, or API.

", "smithy.api#xmlName": "disableApiTermination" } @@ -84663,7 +86121,7 @@ "target": "com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorResponseList", "traits": { "aws.protocols#ec2QueryName": "ElasticInferenceAcceleratorSet", - "smithy.api#documentation": "

The elastic inference accelerator for the instance.

", + "smithy.api#documentation": "

An elastic inference accelerator to associate with the instance. Elastic inference\n accelerators are a resource you can attach to your Amazon EC2 instances to accelerate\n your Deep Learning (DL) inference workloads.

\n

You cannot specify accelerators from different generations in the same request.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon\n Elastic Inference (EI), and will help current customers migrate their workloads to\n options that offer better price and performance. After April 15, 2023, new customers\n will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker,\n Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during\n the past 30-day period are considered current customers and will be able to continue\n using the service.

\n
", "smithy.api#xmlName": "elasticInferenceAcceleratorSet" } }, @@ -84775,8 +86233,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DisableApiStop", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is enabled for stop protection. For more information,\n see Stop\n protection in the Amazon Elastic Compute Cloud User Guide.

", "smithy.api#xmlName": "disableApiStop" } @@ -84811,8 +86267,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -84882,8 +86336,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n\t\t\tand provides an error response. If you have the required permissions, the error response is \n\t\t\tDryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -84899,8 +86351,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -84928,8 +86378,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -84945,7 +86393,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The version to restore.

", "smithy.api#required": {} } @@ -84954,7 +86401,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The current version number for the prefix list.

", "smithy.api#required": {} } @@ -85006,8 +86452,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -85047,8 +86491,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -85097,11 +86539,17 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "volumeSize" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -85140,16 +86588,12 @@ "PermanentRestore": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to permanently restore an archived snapshot. To permanently restore \n an archived snapshot, specify true and omit the \n RestoreSnapshotTierRequest$TemporaryRestoreDays parameter.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -85184,8 +86628,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RestoreDuration", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

For temporary restores only. The number of days for which the archived snapshot \n is temporarily restored.

", "smithy.api#xmlName": "restoreDuration" } @@ -85194,8 +86636,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsPermanentRestore", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is permanently restored. true indicates a permanent \n restore. false indicates a temporary restore.

", "smithy.api#xmlName": "isPermanentRestore" } @@ -85208,7 +86648,6 @@ "com.amazonaws.ec2#ResultRange": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 20, "max": 500 @@ -85255,16 +86694,12 @@ "RevokeAllGroups": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether access should be revoked for all clients.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -85298,7 +86733,7 @@ "target": "com.amazonaws.ec2#RevokeSecurityGroupEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Removes the specified outbound (egress) rules from a security group for EC2-VPC.\n This action does not apply to security groups for use in EC2-Classic.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and destination (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

[Default VPC] If the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, \n a small delay might occur.

" + "smithy.api#documentation": "

Removes the specified outbound (egress) rules from the specified security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and destination (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

For a default VPC, if the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, \n a small delay might occur.

" } }, "com.amazonaws.ec2#RevokeSecurityGroupEgressRequest": { @@ -85308,8 +86743,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -85351,8 +86784,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Not supported. Use a set of IP permissions to specify the port.

", "smithy.api#xmlName": "fromPort" } @@ -85369,8 +86800,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Not supported. Use a set of IP permissions to specify the port.

", "smithy.api#xmlName": "toPort" } @@ -85403,8 +86832,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -85431,7 +86858,7 @@ "target": "com.amazonaws.ec2#RevokeSecurityGroupIngressResult" }, "traits": { - "smithy.api#documentation": "

Removes the specified inbound (ingress) rules from a security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

[EC2-Classic, default VPC] If the values you specify do not match the existing rule's values, no error is\n returned, and the output describes the security group rules that were not revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. However, a small delay might occur.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Removes the specified inbound (ingress) rules from a security group.

\n

You can specify rules using either rule IDs or security group rule properties. If you use\n rule properties, the values that you specify (for example, ports) must match the existing rule's \n values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \n security group, or prefix list). For the TCP and UDP protocols, you must also specify the \n destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \n and code. If the security group rule has a description, you do not need to specify the description \n to revoke the rule.

\n

For a default VPC, if the values you specify do not match the existing rule's values,\n no error is returned, and the output describes the security group rules that were not\n revoked.

\n

For a non-default VPC, if the values you specify do not match the existing rule's\n values, an InvalidPermission.NotFound client error is returned, and no\n rules are revoked.

\n

Amazon Web Services recommends that you describe the security group to verify that the rules were removed.

\n

Rule changes are propagated to instances within the security group as quickly as possible. \n However, a small delay might occur.

" } }, "com.amazonaws.ec2#RevokeSecurityGroupIngressRequest": { @@ -85446,21 +86873,19 @@ "FromPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP, this is the type number. A value of -1 indicates all ICMP types.

" } }, "GroupId": { "target": "com.amazonaws.ec2#SecurityGroupId", "traits": { - "smithy.api#documentation": "

The ID of the security group. You must specify either the security group ID or the\n security group name in the request. For security groups in a nondefault VPC, you must\n specify the security group ID.

" + "smithy.api#documentation": "

The ID of the security group.

" } }, "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -85478,20 +86903,18 @@ "SourceSecurityGroupName": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the source security group. You can't specify this parameter in combination with the following parameters: the CIDR IP address range, the start of the port range, the IP protocol, and the end of the port range. For EC2-VPC, the source security group must be in the same VPC. To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

[Default VPC] The name of the source security group. You can't specify this parameter \n in combination with the following parameters: the CIDR IP address range, the start of the port range, \n the IP protocol, and the end of the port range. The source security group must be in the same VPC. \n To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" } }, "SourceSecurityGroupOwnerId": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

[EC2-Classic] The Amazon Web Services account ID of the source security group, if the source security group is in a different account. You can't specify this parameter in combination with the following parameters: the CIDR IP address range, the IP protocol, the start of the port range, and the end of the port range. To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.

" + "smithy.api#documentation": "

Not supported.

" } }, "ToPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP, this is the code. A value of -1 indicates all ICMP codes.

" } }, @@ -85499,8 +86922,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -85524,8 +86945,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -85831,8 +87250,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Main", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the main route table.

", "smithy.api#xmlName": "main" } @@ -86099,7 +87516,44 @@ "target": "com.amazonaws.ec2#Reservation" }, "traits": { - "smithy.api#documentation": "

Launches the specified number of instances using an AMI for which you have\n permissions.

\n

You can specify a number of options, or leave the default options. The following rules\n apply:

\n
    \n
  • \n

    If you don't specify a subnet ID, we choose a default subnet from\n your default VPC for you. If you don't have a default VPC, you must specify a\n subnet ID in the request.

    \n
  • \n
  • \n

    All instances have a network interface with a primary private IPv4\n address. If you don't specify this address, we choose one from the IPv4 range of\n your subnet.

    \n
  • \n
  • \n

    Not all instance types support IPv6 addresses. For more information, see\n Instance\n types.

    \n
  • \n
  • \n

    If you don't specify a security group ID, we use the default security group.\n For more information, see Security\n groups.

    \n
  • \n
  • \n

    If any of the AMIs have a product code attached for which the user has not\n subscribed, the request fails.

    \n
  • \n
\n

You can create a launch template,\n which is a resource that contains the parameters to launch an instance. When you launch\n an instance using RunInstances, you can specify the launch template\n instead of specifying the launch parameters.

\n

To ensure faster instance launches, break up large requests into smaller batches. For\n example, create five separate launch requests for 100 instances each instead of one\n launch request for 500 instances.

\n

An instance is ready for you to use when it's in the running state. You\n can check the state of your instance using DescribeInstances. You can\n tag instances and EBS volumes during launch, after launch, or both. For more\n information, see CreateTags and Tagging your Amazon EC2\n resources.

\n

Linux instances have access to the public key of the key pair at boot. You can use\n this key to provide secure access to the instance. Amazon EC2 public images use this\n feature to provide secure access without passwords. For more information, see Key\n pairs.

\n

For troubleshooting, see What to do if\n an instance immediately terminates, and Troubleshooting connecting to your instance.

" + "smithy.api#documentation": "

Launches the specified number of instances using an AMI for which you have\n permissions.

\n

You can specify a number of options, or leave the default options. The following rules\n apply:

\n
    \n
  • \n

    If you don't specify a subnet ID, we choose a default subnet from\n your default VPC for you. If you don't have a default VPC, you must specify a\n subnet ID in the request.

    \n
  • \n
  • \n

    All instances have a network interface with a primary private IPv4\n address. If you don't specify this address, we choose one from the IPv4 range of\n your subnet.

    \n
  • \n
  • \n

    Not all instance types support IPv6 addresses. For more information, see\n Instance\n types.

    \n
  • \n
  • \n

    If you don't specify a security group ID, we use the default security group.\n For more information, see Security\n groups.

    \n
  • \n
  • \n

    If any of the AMIs have a product code attached for which the user has not\n subscribed, the request fails.

    \n
  • \n
\n

You can create a launch template,\n which is a resource that contains the parameters to launch an instance. When you launch\n an instance using RunInstances, you can specify the launch template\n instead of specifying the launch parameters.

\n

To ensure faster instance launches, break up large requests into smaller batches. For\n example, create five separate launch requests for 100 instances each instead of one\n launch request for 500 instances.

\n

An instance is ready for you to use when it's in the running state. You\n can check the state of your instance using DescribeInstances. You can\n tag instances and EBS volumes during launch, after launch, or both. For more\n information, see CreateTags and Tagging your Amazon EC2\n resources.

\n

Linux instances have access to the public key of the key pair at boot. You can use\n this key to provide secure access to the instance. Amazon EC2 public images use this\n feature to provide secure access without passwords. For more information, see Key\n pairs.

\n

For troubleshooting, see What to do if\n an instance immediately terminates, and Troubleshooting connecting to your instance.

", + "smithy.api#examples": [ + { + "title": "To launch an instance", + "documentation": "This example launches an instance using the specified AMI, instance type, security group, subnet, block device mapping, and tags.", + "input": { + "BlockDeviceMappings": [ + { + "DeviceName": "/dev/sdh", + "Ebs": { + "VolumeSize": 100 + } + } + ], + "ImageId": "ami-abc12345", + "InstanceType": "t2.micro", + "KeyName": "my-key-pair", + "MaxCount": 1, + "MinCount": 1, + "SecurityGroupIds": [ + "sg-1a2b3c4d" + ], + "SubnetId": "subnet-6e7f829e", + "TagSpecifications": [ + { + "ResourceType": "instance", + "Tags": [ + { + "Key": "Purpose", + "Value": "test" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#RunInstancesMonitoringEnabled": { @@ -86110,7 +87564,6 @@ "traits": { "aws.protocols#ec2QueryName": "Enabled", "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring is\n enabled.

", "smithy.api#required": {}, "smithy.api#xmlName": "enabled" @@ -86140,14 +87593,12 @@ "InstanceType": { "target": "com.amazonaws.ec2#InstanceType", "traits": { - "smithy.api#documentation": "

The instance type. For more information, see Instance types in the\n Amazon EC2 User Guide.

\n

Default: m1.small\n

" + "smithy.api#documentation": "

The instance type. For more information, see Instance types in the\n Amazon EC2 User Guide.

" } }, "Ipv6AddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses to associate with the primary network\n interface. Amazon EC2 chooses the IPv6 addresses from the range of your subnet. You\n cannot specify this option and the option to assign specific IPv6 addresses in the same\n request. You can specify this option if you've specified a minimum number of instances\n to launch.

\n

You cannot specify this option and the network interfaces option in the same\n request.

" } }, @@ -86174,7 +87625,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of instances to launch. If you specify more instances than Amazon\n EC2 can launch in the target Availability Zone, Amazon EC2 launches the largest possible\n number of instances above MinCount.

\n

Constraints: Between 1 and the maximum number you're allowed for the specified\n instance type. For more information about the default limits, and how to request an\n increase, see How many instances can I\n run in Amazon EC2 in the Amazon EC2 FAQ.

", "smithy.api#required": {} } @@ -86183,7 +87633,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of instances to launch. If you specify a minimum that is more\n instances than Amazon EC2 can launch in the target Availability Zone, Amazon EC2\n launches no instances.

\n

Constraints: Between 1 and the maximum number you're allowed for the specified\n instance type. For more information about the default limits, and how to request an\n increase, see How many instances can I\n run in Amazon EC2 in the Amazon EC2 General FAQ.

", "smithy.api#required": {} } @@ -86253,8 +87702,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DisableApiTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

If you set this parameter to true, you can't terminate the instance using\n the Amazon EC2 console, CLI, or API; otherwise, you can. To change this attribute after\n launch, use ModifyInstanceAttribute. Alternatively, if you set\n InstanceInitiatedShutdownBehavior to terminate, you can\n terminate the instance by running the shutdown command from the instance.

\n

Default: false\n

", "smithy.api#xmlName": "disableApiTermination" } @@ -86263,8 +87710,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -86273,8 +87718,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\n provides dedicated throughput to Amazon EBS and an optimized configuration stack to\n provide optimal Amazon EBS I/O performance. This optimization isn't available with all\n instance types. Additional usage charges apply when using an EBS-optimized\n instance.

\n

Default: false\n

", "smithy.api#xmlName": "ebsOptimized" } @@ -86364,7 +87807,7 @@ "HibernationOptions": { "target": "com.amazonaws.ec2#HibernationOptionsRequest", "traits": { - "smithy.api#documentation": "

Indicates whether an instance is enabled for hibernation. For more information, see\n Hibernate\n your instance in the Amazon EC2 User Guide.

\n

You can't enable hibernation and Amazon Web Services Nitro Enclaves on the same\n instance.

" + "smithy.api#documentation": "

Indicates whether an instance is enabled for hibernation. This parameter is valid only\n if the instance meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

You can't enable hibernation and Amazon Web Services Nitro Enclaves on the same\n instance.

" } }, "LicenseSpecifications": { @@ -86383,13 +87826,13 @@ "EnclaveOptions": { "target": "com.amazonaws.ec2#EnclaveOptionsRequest", "traits": { - "smithy.api#documentation": "

Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For\n more information, see What is Amazon Web Services Nitro\n Enclaves? in the Amazon Web Services Nitro Enclaves User\n Guide.

\n

You can't enable Amazon Web Services Nitro Enclaves and hibernation on the same\n instance.

" + "smithy.api#documentation": "

Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For\n more information, see What is Amazon Web Services Nitro\n Enclaves? in the Amazon Web Services Nitro Enclaves User\n Guide.

\n

You can't enable Amazon Web Services Nitro Enclaves and hibernation on the same\n instance.

" } }, "PrivateDnsNameOptions": { "target": "com.amazonaws.ec2#PrivateDnsNameOptionsRequest", "traits": { - "smithy.api#documentation": "

The options for the instance hostname. The default values are inherited from the\n subnet.

" + "smithy.api#documentation": "

The options for the instance hostname. \n The default values are inherited from the subnet.\n Applies only if creating a network interface, not attaching an existing one.

" } }, "MaintenanceOptions": { @@ -86401,10 +87844,14 @@ "DisableApiStop": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether an instance is enabled for stop protection. For more information,\n see Stop\n protection.

" } + }, + "EnablePrimaryIpv6": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

If you’re launching an instance into a dual-stack or IPv6-only subnet, you can enable\n assigning a primary IPv6 address. A primary IPv6 address is an IPv6 GUA address\n associated with an ENI that you have enabled to use a primary IPv6 address. Use this\n option if an instance relies on its IPv6 address not changing. When you launch the\n instance, Amazon Web Services will automatically assign an IPv6 address associated with\n the ENI attached to your instance to be the primary IPv6 address. Once you enable an\n IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\n GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\n address until the instance is terminated or the network interface is detached. If you\n have multiple IPv6 addresses associated with an ENI attached to your instance and you\n enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\n becomes the primary IPv6 address.

" + } } }, "traits": { @@ -86442,16 +87889,12 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, "InstanceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances.

\n

Default: 1

" } }, @@ -86557,7 +88000,7 @@ } }, "UploadPolicySignature": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#S3StorageUploadPolicySignature", "traits": { "aws.protocols#ec2QueryName": "UploadPolicySignature", "smithy.api#documentation": "

The signature of the JSON document.

", @@ -86569,6 +88012,35 @@ "smithy.api#documentation": "

Describes the storage parameters for Amazon S3 and Amazon S3 buckets for an instance store-backed AMI.

" } }, + "com.amazonaws.ec2#S3StorageUploadPolicySignature": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.ec2#SSEType": { + "type": "enum", + "members": { + "sse_ebs": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sse-ebs" + } + }, + "sse_kms": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sse-kms" + } + }, + "none": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "none" + } + } + } + }, "com.amazonaws.ec2#ScheduledInstance": { "type": "structure", "members": { @@ -86600,8 +88072,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances.

", "smithy.api#xmlName": "instanceCount" } @@ -86666,8 +88136,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SlotDurationInHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of hours in the schedule.

", "smithy.api#xmlName": "slotDurationInHours" } @@ -86692,8 +88160,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalScheduledInstanceHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of hours for a single instance for the entire term.

", "smithy.api#xmlName": "totalScheduledInstanceHours" } @@ -86718,8 +88184,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableInstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of available instances.

", "smithy.api#xmlName": "availableInstanceCount" } @@ -86752,8 +88216,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MaxTermDurationInDays", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum term. The only possible value is 365 days.

", "smithy.api#xmlName": "maxTermDurationInDays" } @@ -86762,8 +88224,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MinTermDurationInDays", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum term. The only possible value is 365 days.

", "smithy.api#xmlName": "minTermDurationInDays" } @@ -86804,8 +88264,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SlotDurationInHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of hours in the schedule.

", "smithy.api#xmlName": "slotDurationInHours" } @@ -86814,8 +88272,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalScheduledInstanceHours", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The total number of hours for a single instance for the entire term.

", "smithy.api#xmlName": "totalScheduledInstanceHours" } @@ -86861,8 +88317,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Interval", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The interval quantity. The interval unit depends on the value of frequency. For example, every 2\n weeks or every 2 months.

", "smithy.api#xmlName": "interval" } @@ -86879,8 +88333,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "OccurrenceRelativeToEnd", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the occurrence is relative to the end of the specified week or month.

", "smithy.api#xmlName": "occurrenceRelativeToEnd" } @@ -86910,8 +88362,6 @@ "Interval": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The interval quantity. The interval unit depends on the value of Frequency. For example, every 2 \n weeks or every 2 months.

" } }, @@ -86925,8 +88375,6 @@ "OccurrenceRelativeToEnd": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the occurrence is relative to the end of the specified week or month. You can't specify this value with a daily schedule.

" } }, @@ -86997,24 +88445,18 @@ "DeleteOnTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is deleted on instance termination.

" } }, "Encrypted": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is encrypted. You can attached encrypted volumes only to instances that support them.

" } }, "Iops": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS) to provision for an io1 or io2 volume, with a maximum\n \t\tratio of 50 IOPS/GiB for io1, and 500 IOPS/GiB for io2. Range is 100 to 64,000 IOPS for\n \t\tvolumes in most Regions. Maximum IOPS of 64,000 is guaranteed only on\n \t\tinstances built on the Nitro System. Other instance families guarantee performance up to\n \t\t32,000 IOPS. For more information, see Amazon EBS volume types in the\n \t\tAmazon EC2 User Guide.

\n

This parameter is valid only for Provisioned IOPS SSD (io1 and io2) volumes.

" } }, @@ -87027,8 +88469,6 @@ "VolumeSize": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

\n

Default: If you're creating the volume from a snapshot and don't specify a volume size, the default is the snapshot size.

" } }, @@ -87099,8 +88539,6 @@ "EbsOptimized": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instances are optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS-optimized instance.

\n

Default: false\n

" } }, @@ -87192,8 +88630,6 @@ "Enabled": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether monitoring is enabled.

" } } @@ -87208,16 +88644,12 @@ "AssociatePublicIpAddress": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to assign a public IPv4 address to instances launched in a VPC. The\n public IPv4 address can only be assigned to a network interface for eth0, and can only be\n assigned to a new network interface, not an existing one. You cannot specify more than one\n network interface in the request. If launching into a default subnet, the default value is\n true.

" } }, "DeleteOnTermination": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether to delete the interface when the instance is terminated.

" } }, @@ -87230,8 +88662,6 @@ "DeviceIndex": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The index of the device for the network interface attachment.

" } }, @@ -87245,8 +88675,6 @@ "Ipv6AddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of IPv6 addresses to assign to the network interface. The IPv6 addresses are automatically selected from the subnet range.

" } }, @@ -87279,8 +88707,6 @@ "SecondaryPrivateIpAddressCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of secondary private IPv4 addresses.

" } }, @@ -87330,8 +88756,6 @@ "Primary": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is a primary IPv4 address. Otherwise, this is a secondary IPv4 address.

" } }, @@ -87406,8 +88830,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -87479,8 +88901,6 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of results to return with a single call.\n\tTo retrieve the remaining results, make another call with the returned nextToken value.

" } }, @@ -87493,8 +88913,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -87562,16 +88980,12 @@ "MaxResults": { "target": "com.amazonaws.ec2#TransitGatewayMaxResults", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of routes to return.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -87595,8 +89009,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AdditionalRoutesAvailable", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether there are additional routes available.

", "smithy.api#xmlName": "additionalRoutesAvailable" } @@ -87653,7 +89065,7 @@ "target": "com.amazonaws.ec2#IpPermissionList", "traits": { "aws.protocols#ec2QueryName": "IpPermissionsEgress", - "smithy.api#documentation": "

[VPC only] The outbound rules associated with the security group.

", + "smithy.api#documentation": "

The outbound rules associated with the security group.

", "smithy.api#xmlName": "ipPermissionsEgress" } }, @@ -87669,7 +89081,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "VpcId", - "smithy.api#documentation": "

[VPC only] The ID of the VPC for the security group.

", + "smithy.api#documentation": "

The ID of the VPC for the security group.

", "smithy.api#xmlName": "vpcId" } } @@ -87678,6 +89090,71 @@ "smithy.api#documentation": "

Describes a security group.

" } }, + "com.amazonaws.ec2#SecurityGroupForVpc": { + "type": "structure", + "members": { + "Description": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "Description", + "smithy.api#documentation": "

The security group's description.

", + "smithy.api#xmlName": "description" + } + }, + "GroupName": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "GroupName", + "smithy.api#documentation": "

The security group name.

", + "smithy.api#xmlName": "groupName" + } + }, + "OwnerId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "OwnerId", + "smithy.api#documentation": "

The security group owner ID.

", + "smithy.api#xmlName": "ownerId" + } + }, + "GroupId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "GroupId", + "smithy.api#documentation": "

The security group ID.

", + "smithy.api#xmlName": "groupId" + } + }, + "Tags": { + "target": "com.amazonaws.ec2#TagList", + "traits": { + "aws.protocols#ec2QueryName": "TagSet", + "smithy.api#documentation": "

The security group tags.

", + "smithy.api#xmlName": "tagSet" + } + }, + "PrimaryVpcId": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "PrimaryVpcId", + "smithy.api#documentation": "

The VPC ID in which the security group was created.

", + "smithy.api#xmlName": "primaryVpcId" + } + } + }, + "traits": { + "smithy.api#documentation": "

A security group that can be used by interfaces in the VPC.

" + } + }, + "com.amazonaws.ec2#SecurityGroupForVpcList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#SecurityGroupForVpc", + "traits": { + "smithy.api#xmlName": "item" + } + } + }, "com.amazonaws.ec2#SecurityGroupId": { "type": "string" }, @@ -87831,8 +89308,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsEgress", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the security group rule is an outbound rule.

", "smithy.api#xmlName": "isEgress" } @@ -87849,8 +89324,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

", "smithy.api#xmlName": "fromPort" } @@ -87859,8 +89332,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 codes. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

", "smithy.api#xmlName": "toPort" } @@ -87980,16 +89451,12 @@ "FromPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the start of the port range.\n If the protocol is ICMP or ICMPv6, this is the type number. A value of -1 indicates all ICMP/ICMPv6 types. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

" } }, "ToPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

If the protocol is TCP or UDP, this is the end of the port range.\n If the protocol is ICMP or ICMPv6, this is the code. A value of -1 indicates all ICMP/ICMPv6 codes. \n If you specify all ICMP/ICMPv6 types, you must specify all ICMP/ICMPv6 codes.

" } }, @@ -88111,8 +89578,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -88180,8 +89645,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AcceptanceRequired", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether requests from other Amazon Web Services accounts to create an endpoint to the service must first be accepted.

", "smithy.api#xmlName": "acceptanceRequired" } @@ -88190,8 +89653,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ManagesVpcEndpoints", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the service manages its VPC endpoints. Management of the service VPC\n endpoints using the VPC endpoint API is restricted.

", "smithy.api#xmlName": "managesVpcEndpoints" } @@ -88362,8 +89823,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "VpcEndpointPolicySupported", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the service supports endpoint policies.

", "smithy.api#xmlName": "vpcEndpointPolicySupported" } @@ -88372,8 +89831,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AcceptanceRequired", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether VPC endpoint connection requests to the service must be accepted by the service owner.

", "smithy.api#xmlName": "acceptanceRequired" } @@ -88382,8 +89839,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ManagesVpcEndpoints", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the service manages its VPC endpoints. Management of the service VPC\n endpoints using the VPC endpoint API is restricted.

", "smithy.api#xmlName": "managesVpcEndpoints" } @@ -88601,8 +90056,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -88675,8 +90128,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#xmlName": "volumeSize" } @@ -88720,6 +90171,14 @@ "smithy.api#documentation": "

Only for archived snapshots that are temporarily restored. Indicates the date and \n time when a temporarily restored snapshot will be automatically re-archived.

", "smithy.api#xmlName": "restoreExpiryTime" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -88766,8 +90225,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "DiskImageSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the disk in the snapshot, in GiB.

", "smithy.api#xmlName": "diskImageSize" } @@ -88909,8 +90366,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -88935,8 +90390,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VolumeSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Size of the volume from which this snapshot was created.

", "smithy.api#xmlName": "volumeSize" } @@ -88980,6 +90433,14 @@ "smithy.api#documentation": "

The ARN of the Outpost on which the snapshot is stored. For more information, see Amazon EBS local snapshots on Outposts in the \n \t\tAmazon Elastic Compute Cloud User Guide.

", "smithy.api#xmlName": "outpostArn" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -89111,8 +90572,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "DiskImageSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the disk in the snapshot, in GiB.

", "smithy.api#xmlName": "diskImageSize" } @@ -89121,8 +90580,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the snapshot is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -89259,8 +90716,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "LastTieringProgress", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The progress of the last archive or restore process, as a percentage.

", "smithy.api#xmlName": "lastTieringProgress" } @@ -89352,8 +90807,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TerminationDelay", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\n Instance after launching a new replacement Spot Instance.

\n

Required when ReplacementStrategy is set to launch-before-terminate.

\n

Not valid when ReplacementStrategy is set to launch.

\n

Valid values: Minimum value of 120 seconds. Maximum value of 7200 seconds.

", "smithy.api#xmlName": "terminationDelay" } @@ -89442,8 +90895,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EbsOptimized", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the instances are optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.

\n

Default: false\n

", "smithy.api#xmlName": "ebsOptimized" } @@ -89548,8 +90999,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "WeightedCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units provided by the specified instance type. These are the same units that you chose to set the target capacity in terms of instances, or a performance characteristic such as vCPUs, memory, or I/O.

\n

If the target capacity divided by this value is not a whole number, Amazon EC2 rounds the number of instances to the next whole number. If this value is not specified, the default is 1.

", "smithy.api#xmlName": "weightedCapacity" } @@ -89582,8 +91031,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Enables monitoring for the instance.

\n

Default: false\n

", "smithy.api#xmlName": "enabled" } @@ -89696,8 +91143,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "FulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units fulfilled by this request compared to the set target capacity. You\n cannot set this value.

", "smithy.api#xmlName": "fulfilledCapacity" } @@ -89706,8 +91151,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "OnDemandFulfilledCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand units fulfilled by this request compared to the set target\n On-Demand capacity.

", "smithy.api#xmlName": "onDemandFulfilledCapacity" } @@ -89751,7 +91194,6 @@ "traits": { "aws.protocols#ec2QueryName": "TargetCapacity", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units to request for the Spot Fleet. You can choose to set the target\n capacity in terms of instances or a performance characteristic that is important to your\n application workload, such as vCPUs, memory, or I/O. If the request type is\n maintain, you can specify a target capacity of 0 and add capacity\n later.

", "smithy.api#required": {}, "smithy.api#xmlName": "targetCapacity" @@ -89761,8 +91203,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OnDemandTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand units to request. You can choose to set the target capacity in\n terms of instances or a performance characteristic that is important to your application\n workload, such as vCPUs, memory, or I/O. If the request type is maintain,\n you can specify a target capacity of 0 and add capacity later.

", "smithy.api#xmlName": "onDemandTargetCapacity" } @@ -89771,7 +91211,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "OnDemandMaxTotalPrice", - "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay. You\n can use the onDemandMaxTotalPrice parameter, the\n spotMaxTotalPrice parameter, or both parameters to ensure that your\n fleet cost does not exceed your budget. If you set a maximum price per hour for the\n On-Demand Instances and Spot Instances in your request, Spot Fleet will launch instances until it reaches the\n maximum amount you're willing to pay. When the maximum amount you're willing to pay is\n reached, the fleet stops launching instances even if it hasn’t met the target\n capacity.

", + "smithy.api#documentation": "

The maximum amount per hour for On-Demand Instances that you're willing to pay. You\n can use the onDemandMaxTotalPrice parameter, the\n spotMaxTotalPrice parameter, or both parameters to ensure that your\n fleet cost does not exceed your budget. If you set a maximum price per hour for the\n On-Demand Instances and Spot Instances in your request, Spot Fleet will launch instances until it reaches the\n maximum amount you're willing to pay. When the maximum amount you're willing to pay is\n reached, the fleet stops launching instances even if it hasn’t met the target\n capacity.

\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The onDemandMaxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for onDemandMaxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
", "smithy.api#xmlName": "onDemandMaxTotalPrice" } }, @@ -89779,7 +91219,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "SpotMaxTotalPrice", - "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. You can use\n the spotdMaxTotalPrice parameter, the onDemandMaxTotalPrice\n parameter, or both parameters to ensure that your fleet cost does not exceed your\n budget. If you set a maximum price per hour for the On-Demand Instances and Spot Instances in your request,\n Spot Fleet will launch instances until it reaches the maximum amount you're willing to pay.\n When the maximum amount you're willing to pay is reached, the fleet stops launching\n instances even if it hasn’t met the target capacity.

", + "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. You can use\n the spotMaxTotalPrice parameter, the onDemandMaxTotalPrice\n parameter, or both parameters to ensure that your fleet cost does not exceed your budget.\n If you set a maximum price per hour for the On-Demand Instances and Spot Instances in your request, Spot Fleet will\n launch instances until it reaches the maximum amount you're willing to pay. When the\n maximum amount you're willing to pay is reached, the fleet stops launching instances even\n if it hasn’t met the target capacity.

\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The spotMaxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for spotMaxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
", "smithy.api#xmlName": "spotMaxTotalPrice" } }, @@ -89787,8 +91227,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "TerminateInstancesWithExpiration", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether running Spot Instances are terminated when the Spot Fleet request\n expires.

", "smithy.api#xmlName": "terminateInstancesWithExpiration" } @@ -89821,8 +91259,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ReplaceUnhealthyInstances", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether Spot Fleet should replace unhealthy instances.

", "smithy.api#xmlName": "replaceUnhealthyInstances" } @@ -89847,8 +91283,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstancePoolsToUseCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Spot pools across which to allocate your target Spot capacity. Valid\n only when Spot AllocationStrategy is set to\n lowest-price. Spot Fleet selects the cheapest Spot pools and evenly\n allocates your target Spot capacity across the number of Spot pools that you\n specify.

\n

Note that Spot Fleet attempts to draw Spot Instances from the number of pools that you specify on a\n best effort basis. If a pool runs out of Spot capacity before fulfilling your target\n capacity, Spot Fleet will continue to fulfill your request by drawing from the next cheapest\n pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\n the number of pools that you specified. Similarly, if most of the pools have no Spot\n capacity, you might receive your full target capacity from fewer than the number of\n pools that you specified.

", "smithy.api#xmlName": "instancePoolsToUseCount" } @@ -89872,7 +91306,7 @@ "TagSpecifications": { "target": "com.amazonaws.ec2#TagSpecificationList", "traits": { - "smithy.api#documentation": "

The key-value pair for tagging the Spot Fleet request on creation. The value for\n ResourceType must be spot-fleet-request, otherwise the\n Spot Fleet request fails. To tag instances at launch, specify the tags in the launch\n template (valid only if you use LaunchTemplateConfigs) or in\n the \n SpotFleetTagSpecification\n (valid only if you use\n LaunchSpecifications). For information about tagging after launch, see\n Tagging Your Resources.

", + "smithy.api#documentation": "

The key-value pair for tagging the Spot Fleet request on creation. The value for\n ResourceType must be spot-fleet-request, otherwise the\n Spot Fleet request fails. To tag instances at launch, specify the tags in the launch\n template (valid only if you use LaunchTemplateConfigs) or in\n the \n SpotFleetTagSpecification\n (valid only if you use\n LaunchSpecifications). For information about tagging after launch, see\n Tag your resources.

", "smithy.api#xmlName": "TagSpecification" } } @@ -89981,8 +91415,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "BlockDurationMinutes", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "blockDurationMinutes" } @@ -90173,6 +91605,12 @@ "traits": { "smithy.api#enumValue": "failed" } + }, + "disabled": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "disabled" + } } } }, @@ -90283,8 +91721,6 @@ "BlockDurationMinutes": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

Deprecated.

" } }, @@ -90297,7 +91733,7 @@ "InstanceInterruptionBehavior": { "target": "com.amazonaws.ec2#InstanceInterruptionBehavior", "traits": { - "smithy.api#documentation": "

The behavior when a Spot Instance is interrupted. The default is\n terminate.

" + "smithy.api#documentation": "

The behavior when a Spot Instance is interrupted.

\n

If Configured (for \n HibernationOptions\n ) is set to true, the\n InstanceInterruptionBehavior parameter is automatically set to\n hibernate. If you set it to stop or\n terminate, you'll get an error.

\n

If Configured (for \n HibernationOptions\n ) is set to false or\n null, the InstanceInterruptionBehavior parameter is\n automatically set to terminate. You can also set it to stop or\n hibernate.

\n

For more information, see Interruption\n behavior in the Amazon EC2 User Guide.

" } } }, @@ -90336,8 +91772,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstancePoolsToUseCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Spot pools across which to allocate your target Spot capacity. Supported\n only when AllocationStrategy is set to lowest-price. EC2 Fleet selects\n the cheapest Spot pools and evenly allocates your target Spot capacity across the number of\n Spot pools that you specify.

\n

Note that EC2 Fleet attempts to draw Spot Instances from the number of pools that you specify on a\n best effort basis. If a pool runs out of Spot capacity before fulfilling your target\n capacity, EC2 Fleet will continue to fulfill your request by drawing from the next cheapest\n pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\n the number of pools that you specified. Similarly, if most of the pools have no Spot\n capacity, you might receive your full target capacity from fewer than the number of pools\n that you specified.

", "smithy.api#xmlName": "instancePoolsToUseCount" } @@ -90346,8 +91780,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SingleInstanceType", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet uses a single instance type to launch all Spot Instances in the\n fleet.

\n

Supported only for fleets of type instant.

", "smithy.api#xmlName": "singleInstanceType" } @@ -90356,8 +91788,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "SingleAvailabilityZone", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet launches all Spot Instances into a single Availability Zone.

\n

Supported only for fleets of type instant.

", "smithy.api#xmlName": "singleAvailabilityZone" } @@ -90366,8 +91796,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "MinTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum target capacity for Spot Instances in the fleet. If the minimum target capacity is\n not reached, the fleet launches no instances.

\n

Supported only for fleets of type instant.

\n

At least one of the following must be specified: SingleAvailabilityZone |\n SingleInstanceType\n

", "smithy.api#xmlName": "minTargetCapacity" } @@ -90376,7 +91804,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "MaxTotalPrice", - "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\n using this parameter because it can lead to increased interruptions. If you do not specify\n this parameter, you will pay the current Spot price.

\n \n

If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.

\n
", + "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\n using this parameter because it can lead to increased interruptions. If you do not specify\n this parameter, you will pay the current Spot price.

\n \n

If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.

\n
\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The maxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for maxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
", "smithy.api#xmlName": "maxTotalPrice" } } @@ -90409,39 +91837,31 @@ "InstancePoolsToUseCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Spot pools across which to allocate your target Spot capacity. Supported\n only when Spot AllocationStrategy is set to lowest-price. EC2 Fleet\n selects the cheapest Spot pools and evenly allocates your target Spot capacity across the\n number of Spot pools that you specify.

\n

Note that EC2 Fleet attempts to draw Spot Instances from the number of pools that you specify on a\n best effort basis. If a pool runs out of Spot capacity before fulfilling your target\n capacity, EC2 Fleet will continue to fulfill your request by drawing from the next cheapest\n pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\n the number of pools that you specified. Similarly, if most of the pools have no Spot\n capacity, you might receive your full target capacity from fewer than the number of pools\n that you specified.

" } }, "SingleInstanceType": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet uses a single instance type to launch all Spot Instances in the\n fleet.

\n

Supported only for fleets of type instant.

" } }, "SingleAvailabilityZone": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the fleet launches all Spot Instances into a single Availability Zone.

\n

Supported only for fleets of type instant.

" } }, "MinTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum target capacity for Spot Instances in the fleet. If the minimum target capacity is\n not reached, the fleet launches no instances.

\n

Supported only for fleets of type instant.

\n

At least one of the following must be specified: SingleAvailabilityZone |\n SingleInstanceType\n

" } }, "MaxTotalPrice": { "target": "com.amazonaws.ec2#String", "traits": { - "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\n using this parameter because it can lead to increased interruptions. If you do not specify\n this parameter, you will pay the current Spot price.

\n \n

If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.

\n
" + "smithy.api#documentation": "

The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\n using this parameter because it can lead to increased interruptions. If you do not specify\n this parameter, you will pay the current Spot price.

\n \n

If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.

\n
\n \n

If your fleet includes T instances that are configured as unlimited,\n and if their average CPU usage exceeds the baseline utilization, you will incur a charge\n for surplus credits. The MaxTotalPrice does not account for surplus\n credits, and, if you use surplus credits, your final cost might be higher than what you\n specified for MaxTotalPrice. For more information, see Surplus credits can incur charges in the EC2 User\n Guide.

\n
" } } }, @@ -90504,8 +91924,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Score", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The placement score, on a scale from 1 to 10. A score of\n 10 indicates that your Spot request is highly likely to succeed in this\n Region or Availability Zone. A score of 1 indicates that your Spot request is\n not likely to succeed.

", "smithy.api#xmlName": "score" } @@ -90527,7 +91945,6 @@ "com.amazonaws.ec2#SpotPlacementScoresMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 10, "max": 1000 @@ -90537,7 +91954,6 @@ "com.amazonaws.ec2#SpotPlacementScoresTargetCapacity": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 2000000000 @@ -90625,8 +92041,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The start of the port range for the TCP and UDP protocols, or an ICMP type number. A value of\n -1 indicates all ICMP types.

", "smithy.api#xmlName": "fromPort" } @@ -90659,8 +92073,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The end of the port range for the TCP and UDP protocols, or an ICMP type number. A value of\n -1 indicates all ICMP types.

", "smithy.api#xmlName": "toPort" } @@ -90761,7 +92173,33 @@ "target": "com.amazonaws.ec2#StartInstancesResult" }, "traits": { - "smithy.api#documentation": "

Starts an Amazon EBS-backed instance that you've previously stopped.

\n

Instances that use Amazon EBS volumes as their root devices can be quickly stopped and\n started. When an instance is stopped, the compute resources are released and you are not\n billed for instance usage. However, your root partition Amazon EBS volume remains and\n continues to persist your data, and you are charged for Amazon EBS volume usage. You can\n restart your instance at any time. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

Before stopping an instance, make sure it is in a state from which it can be\n restarted. Stopping an instance does not preserve data stored in RAM.

\n

Performing this operation on an instance that uses an instance store as its root\n device returns an error.

\n

If you attempt to start a T3 instance with host tenancy and the\n unlimted CPU credit option, the request fails. The\n unlimited CPU credit option is not supported on Dedicated Hosts. Before\n you start the instance, either change its CPU credit option to standard, or\n change its tenancy to default or dedicated.

\n

For more information, see Stop and start your instance\n in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Starts an Amazon EBS-backed instance that you've previously stopped.

\n

Instances that use Amazon EBS volumes as their root devices can be quickly stopped and\n started. When an instance is stopped, the compute resources are released and you are not\n billed for instance usage. However, your root partition Amazon EBS volume remains and\n continues to persist your data, and you are charged for Amazon EBS volume usage. You can\n restart your instance at any time. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

Before stopping an instance, make sure it is in a state from which it can be\n restarted. Stopping an instance does not preserve data stored in RAM.

\n

Performing this operation on an instance that uses an instance store as its root\n device returns an error.

\n

If you attempt to start a T3 instance with host tenancy and the\n unlimted CPU credit option, the request fails. The\n unlimited CPU credit option is not supported on Dedicated Hosts. Before\n you start the instance, either change its CPU credit option to standard, or\n change its tenancy to default or dedicated.

\n

For more information, see Stop and start your instance\n in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To start a stopped EC2 instance", + "documentation": "This example starts the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "StartingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 0, + "Name": "pending" + }, + "PreviousState": { + "Code": 80, + "Name": "stopped" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#StartInstancesRequest": { @@ -90788,8 +92226,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -90841,8 +92277,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -90923,8 +92357,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -90983,8 +92415,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -91008,8 +92438,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, it returns an error.

", "smithy.api#xmlName": "return" } @@ -91196,7 +92624,33 @@ "target": "com.amazonaws.ec2#StopInstancesResult" }, "traits": { - "smithy.api#documentation": "

Stops an Amazon EBS-backed instance. For more information, see Stop and start\n your instance in the Amazon EC2 User Guide.

\n

You can use the Stop action to hibernate an instance if the instance is enabled for\n hibernation and it meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

We don't charge usage for a stopped instance, or data transfer fees; however, your\n root partition Amazon EBS volume remains and continues to persist your data, and you are\n charged for Amazon EBS volume usage. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

You can't stop or hibernate instance store-backed instances. You can't use the Stop\n action to hibernate Spot Instances, but you can specify that Amazon EC2 should hibernate\n Spot Instances when they are interrupted. For more information, see Hibernating interrupted Spot Instances in the\n Amazon EC2 User Guide.

\n

When you stop or hibernate an instance, we shut it down. You can restart your instance\n at any time. Before stopping or hibernating an instance, make sure it is in a state from\n which it can be restarted. Stopping an instance does not preserve data stored in RAM,\n but hibernating an instance does preserve data stored in RAM. If an instance cannot\n hibernate successfully, a normal shutdown occurs.

\n

Stopping and hibernating an instance is different to rebooting or terminating it. For\n example, when you stop or hibernate an instance, the root device and any other devices\n attached to the instance persist. When you terminate an instance, the root device and\n any other devices attached during the instance launch are automatically deleted. For\n more information about the differences between rebooting, stopping, hibernating, and\n terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

When you stop an instance, we attempt to shut it down forcibly after a short while. If\n your instance appears stuck in the stopping state after a period of time, there may be\n an issue with the underlying host computer. For more information, see Troubleshoot\n stopping your instance in the Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Stops an Amazon EBS-backed instance. For more information, see Stop and start\n your instance in the Amazon EC2 User Guide.

\n

You can use the Stop action to hibernate an instance if the instance is enabled for\n hibernation and it meets the hibernation\n prerequisites. For more information, see Hibernate your instance in the\n Amazon EC2 User Guide.

\n

We don't charge usage for a stopped instance, or data transfer fees; however, your\n root partition Amazon EBS volume remains and continues to persist your data, and you are\n charged for Amazon EBS volume usage. Every time you start your instance, Amazon EC2\n charges a one-minute minimum for instance usage, and thereafter charges per second for\n instance usage.

\n

You can't stop or hibernate instance store-backed instances. You can't use the Stop\n action to hibernate Spot Instances, but you can specify that Amazon EC2 should hibernate\n Spot Instances when they are interrupted. For more information, see Hibernating interrupted Spot Instances in the\n Amazon EC2 User Guide.

\n

When you stop or hibernate an instance, we shut it down. You can restart your instance\n at any time. Before stopping or hibernating an instance, make sure it is in a state from\n which it can be restarted. Stopping an instance does not preserve data stored in RAM,\n but hibernating an instance does preserve data stored in RAM. If an instance cannot\n hibernate successfully, a normal shutdown occurs.

\n

Stopping and hibernating an instance is different to rebooting or terminating it. For\n example, when you stop or hibernate an instance, the root device and any other devices\n attached to the instance persist. When you terminate an instance, the root device and\n any other devices attached during the instance launch are automatically deleted. For\n more information about the differences between rebooting, stopping, hibernating, and\n terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

When you stop an instance, we attempt to shut it down forcibly after a short while. If\n your instance appears stuck in the stopping state after a period of time, there may be\n an issue with the underlying host computer. For more information, see Troubleshoot\n stopping your instance in the Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To stop a running EC2 instance", + "documentation": "This example stops the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "StoppingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 64, + "Name": "stopping" + }, + "PreviousState": { + "Code": 16, + "Name": "running" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#StopInstancesRequest": { @@ -91214,8 +92668,6 @@ "Hibernate": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Hibernates the instance if the instance was enabled for hibernation at launch. If the\n instance cannot hibernate successfully, a normal shutdown occurs. For more information,\n see Hibernate\n your instance in the Amazon EC2 User Guide.

\n

Default: false\n

" } }, @@ -91223,8 +92675,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -91233,8 +92683,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Force", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Forces the instances to stop. The instances do not have an opportunity to flush file\n system caches or file system metadata. If you use this option, you must perform file\n system check and repair procedures. This option is not recommended for Windows\n instances.

\n

Default: false\n

", "smithy.api#xmlName": "force" } @@ -91351,8 +92799,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ProgressPercentage", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The progress of the task as a percentage.

", "smithy.api#xmlName": "progressPercentage" } @@ -91431,8 +92877,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AvailableIpAddressCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of unused private IPv4 addresses in the subnet. The IPv4 addresses for any\n\t\t\tstopped instances are considered unavailable.

", "smithy.api#xmlName": "availableIpAddressCount" } @@ -91449,8 +92893,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DefaultForAz", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the default subnet for the Availability Zone.

", "smithy.api#xmlName": "defaultForAz" } @@ -91459,8 +92901,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "EnableLniAtDeviceIndex", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

\n Indicates the device position for local network interfaces in this subnet. For example, \n 1 indicates local network interfaces in this subnet are the secondary \n network interface (eth1). \n

", "smithy.api#xmlName": "enableLniAtDeviceIndex" } @@ -91469,8 +92909,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "MapPublicIpOnLaunch", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether instances launched in this subnet receive a public IPv4 address.

", "smithy.api#xmlName": "mapPublicIpOnLaunch" } @@ -91479,8 +92917,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "MapCustomerOwnedIpOnLaunch", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether a network interface created in this subnet (including a network\n interface created by RunInstances) receives a customer-owned IPv4 address.

", "smithy.api#xmlName": "mapCustomerOwnedIpOnLaunch" } @@ -91529,8 +92965,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AssignIpv6AddressOnCreation", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether a network interface created in this subnet (including a network\n interface created by RunInstances) receives an IPv6 address.

", "smithy.api#xmlName": "assignIpv6AddressOnCreation" } @@ -91571,8 +93005,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableDns64", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether DNS queries made to the Amazon-provided DNS Resolver in this subnet \n should return synthetic IPv6 addresses for IPv4-only destinations.

", "smithy.api#xmlName": "enableDns64" } @@ -91581,8 +93013,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Ipv6Native", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is an IPv6 only subnet.

", "smithy.api#xmlName": "ipv6Native" } @@ -91748,7 +93178,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "Description", - "smithy.api#documentation": "

The\n description\n assigned to the subnet CIDR\n reservation.

", + "smithy.api#documentation": "

The description assigned to the subnet CIDR reservation.

", "smithy.api#xmlName": "description" } }, @@ -91794,6 +93224,41 @@ } } }, + "com.amazonaws.ec2#SubnetConfiguration": { + "type": "structure", + "members": { + "SubnetId": { + "target": "com.amazonaws.ec2#SubnetId", + "traits": { + "smithy.api#documentation": "

The ID of the subnet.

" + } + }, + "Ipv4": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

The IPv4 address to assign to the endpoint network interface in the subnet. You must provide \n an IPv4 address if the VPC endpoint supports IPv4.

\n

If you specify an IPv4 address when modifying a VPC endpoint, we replace the existing \n endpoint network interface with a new endpoint network interface with this IP address. \n This process temporarily disconnects the subnet and the VPC endpoint.

" + } + }, + "Ipv6": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

The IPv6 address to assign to the endpoint network interface in the subnet. You must provide \n an IPv6 address if the VPC endpoint supports IPv6.

\n

If you specify an IPv6 address when modifying a VPC endpoint, we replace the existing \n endpoint network interface with a new endpoint network interface with this IP address. \n This process temporarily disconnects the subnet and the VPC endpoint.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the configuration of a subnet for a VPC endpoint.

" + } + }, + "com.amazonaws.ec2#SubnetConfigurationsList": { + "type": "list", + "member": { + "target": "com.amazonaws.ec2#SubnetConfiguration", + "traits": { + "smithy.api#xmlName": "item" + } + } + }, "com.amazonaws.ec2#SubnetId": { "type": "string" }, @@ -92174,8 +93639,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TotalTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units to request, filled using\n DefaultTargetCapacityType.

", "smithy.api#xmlName": "totalTargetCapacity" } @@ -92184,8 +93647,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OnDemandTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand units to request. If you specify a target capacity for Spot units, you cannot specify a target capacity for On-Demand units.

", "smithy.api#xmlName": "onDemandTargetCapacity" } @@ -92194,8 +93655,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SpotTargetCapacity", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of Spot units to launch. If you specify a target capacity for On-Demand units, you cannot specify a target capacity for Spot units.

", "smithy.api#xmlName": "spotTargetCapacity" } @@ -92228,7 +93687,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of units to request, filled using\n DefaultTargetCapacityType.

", "smithy.api#required": {} } @@ -92236,16 +93694,12 @@ "OnDemandTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of On-Demand units to request.

" } }, "SpotTargetCapacity": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of Spot units to request.

" } }, @@ -92296,8 +93750,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "InstanceCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances the Convertible Reserved Instance offering can be applied to. This parameter is \n reserved and cannot be specified in a request

", "smithy.api#xmlName": "instanceCount" } @@ -92321,8 +93773,6 @@ "InstanceCount": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of instances the Convertible Reserved Instance offering can be applied to. This parameter is reserved and cannot \n be specified in a request

" } }, @@ -92568,7 +94018,7 @@ } }, "ConnectionId": { - "target": "com.amazonaws.ec2#VpnConnectionId", + "target": "com.amazonaws.ec2#String", "traits": { "smithy.api#documentation": "

The ID of the client connection to be terminated.

" } @@ -92582,8 +94032,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is DryRunOperation. Otherwise, it is UnauthorizedOperation.

" } } @@ -92674,7 +94122,33 @@ "target": "com.amazonaws.ec2#TerminateInstancesResult" }, "traits": { - "smithy.api#documentation": "

Shuts down the specified instances. This operation is idempotent; if you terminate an\n instance more than once, each call succeeds.

\n

If you specify multiple instances and the request fails (for example, because of a\n single incorrect instance ID), none of the instances are terminated.

\n

If you terminate multiple instances across multiple Availability Zones, and one or\n more of the specified instances are enabled for termination protection, the request\n fails with the following results:

\n
    \n
  • \n

    The specified instances that are in the same Availability Zone as the\n protected instance are not terminated.

    \n
  • \n
  • \n

    The specified instances that are in different Availability Zones, where no\n other specified instances are protected, are successfully terminated.

    \n
  • \n
\n

For example, say you have the following instances:

\n
    \n
  • \n

    Instance A: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance B: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance C: us-east-1b; Protected

    \n
  • \n
  • \n

    Instance D: us-east-1b; not protected

    \n
  • \n
\n

If you attempt to terminate all of these instances in the same request, the request\n reports failure with the following results:

\n
    \n
  • \n

    Instance A and Instance B are successfully terminated because none of the\n specified instances in us-east-1a are enabled for termination\n protection.

    \n
  • \n
  • \n

    Instance C and Instance D fail to terminate because at least one of the\n specified instances in us-east-1b (Instance C) is enabled for\n termination protection.

    \n
  • \n
\n

Terminated instances remain visible after termination (for approximately one\n hour).

\n

By default, Amazon EC2 deletes all EBS volumes that were attached when the instance\n launched. Volumes attached after instance launch continue running.

\n

You can stop, start, and terminate EBS-backed instances. You can only terminate\n instance store-backed instances. What happens to an instance differs if you stop it or\n terminate it. For example, when you stop an instance, the root device and any other\n devices attached to the instance persist. When you terminate an instance, any attached\n EBS volumes with the DeleteOnTermination block device mapping parameter set\n to true are automatically deleted. For more information about the\n differences between stopping and terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

For more information about troubleshooting, see Troubleshooting terminating your instance in the\n Amazon EC2 User Guide.

" + "smithy.api#documentation": "

Shuts down the specified instances. This operation is idempotent; if you terminate an\n instance more than once, each call succeeds.

\n

If you specify multiple instances and the request fails (for example, because of a\n single incorrect instance ID), none of the instances are terminated.

\n

If you terminate multiple instances across multiple Availability Zones, and one or\n more of the specified instances are enabled for termination protection, the request\n fails with the following results:

\n
    \n
  • \n

    The specified instances that are in the same Availability Zone as the\n protected instance are not terminated.

    \n
  • \n
  • \n

    The specified instances that are in different Availability Zones, where no\n other specified instances are protected, are successfully terminated.

    \n
  • \n
\n

For example, say you have the following instances:

\n
    \n
  • \n

    Instance A: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance B: us-east-1a; Not protected

    \n
  • \n
  • \n

    Instance C: us-east-1b; Protected

    \n
  • \n
  • \n

    Instance D: us-east-1b; not protected

    \n
  • \n
\n

If you attempt to terminate all of these instances in the same request, the request\n reports failure with the following results:

\n
    \n
  • \n

    Instance A and Instance B are successfully terminated because none of the\n specified instances in us-east-1a are enabled for termination\n protection.

    \n
  • \n
  • \n

    Instance C and Instance D fail to terminate because at least one of the\n specified instances in us-east-1b (Instance C) is enabled for\n termination protection.

    \n
  • \n
\n

Terminated instances remain visible after termination (for approximately one\n hour).

\n

By default, Amazon EC2 deletes all EBS volumes that were attached when the instance\n launched. Volumes attached after instance launch continue running.

\n

You can stop, start, and terminate EBS-backed instances. You can only terminate\n instance store-backed instances. What happens to an instance differs if you stop it or\n terminate it. For example, when you stop an instance, the root device and any other\n devices attached to the instance persist. When you terminate an instance, any attached\n EBS volumes with the DeleteOnTermination block device mapping parameter set\n to true are automatically deleted. For more information about the\n differences between stopping and terminating instances, see Instance lifecycle\n in the Amazon EC2 User Guide.

\n

For more information about troubleshooting, see Troubleshooting terminating your instance in the\n Amazon EC2 User Guide.

", + "smithy.api#examples": [ + { + "title": "To terminate an EC2 instance", + "documentation": "This example terminates the specified EC2 instance.", + "input": { + "InstanceIds": [ + "i-1234567890abcdef0" + ] + }, + "output": { + "TerminatingInstances": [ + { + "InstanceId": "i-1234567890abcdef0", + "CurrentState": { + "Code": 32, + "Name": "shutting-down" + }, + "PreviousState": { + "Code": 16, + "Name": "running" + } + } + ] + } + } + ] } }, "com.amazonaws.ec2#TerminateInstancesRequest": { @@ -92693,8 +94167,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -92846,8 +94318,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of total local storage, in GB. If this parameter is not specified, there is\n no minimum limit.

", "smithy.api#xmlName": "min" } @@ -92856,8 +94326,6 @@ "target": "com.amazonaws.ec2#Double", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of total local storage, in GB. If this parameter is not specified, there is\n no maximum limit.

", "smithy.api#xmlName": "max" } @@ -92873,16 +94341,12 @@ "Min": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum amount of total local storage, in GB. To specify no minimum limit, omit this\n parameter.

" } }, "Max": { "target": "com.amazonaws.ec2#Double", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of total local storage, in GB. To specify no maximum limit, omit this\n parameter.

" } } @@ -93018,8 +94482,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RuleNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The rule number of the Traffic Mirror rule.

", "smithy.api#xmlName": "ruleNumber" } @@ -93036,8 +94498,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Protocol", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The protocol assigned to the Traffic Mirror rule.

", "smithy.api#xmlName": "protocol" } @@ -93170,8 +94630,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "FromPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The start of the Traffic Mirror port range. This applies to the TCP and UDP protocols.

", "smithy.api#xmlName": "fromPort" } @@ -93180,8 +94638,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ToPort", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The end of the Traffic Mirror port range. This applies to the TCP and UDP protocols.

", "smithy.api#xmlName": "toPort" } @@ -93197,16 +94653,12 @@ "FromPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The first port in the Traffic Mirror port range. This applies to the TCP and UDP protocols.

" } }, "ToPort": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The last port in the Traffic Mirror port range. This applies to the TCP and UDP protocols.

" } } @@ -93279,8 +94731,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "PacketLength", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of bytes in each packet to mirror. These are the bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet

", "smithy.api#xmlName": "packetLength" } @@ -93289,8 +94739,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "SessionNumber", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.

\n

Valid values are 1-32766.

", "smithy.api#xmlName": "sessionNumber" } @@ -93299,8 +94747,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VirtualNetworkId", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The virtual network ID associated with the Traffic Mirror session.

", "smithy.api#xmlName": "virtualNetworkId" } @@ -93495,7 +94941,6 @@ "com.amazonaws.ec2#TrafficMirroringMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -93796,8 +95241,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "TransitGatewayAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The transit gateway Autonomous System Number (ASN).

", "smithy.api#xmlName": "transitGatewayAsn" } @@ -93806,8 +95249,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "PeerAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The peer Autonomous System Number (ASN).

", "smithy.api#xmlName": "peerAsn" } @@ -94283,8 +95724,6 @@ "PeerAsn": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The peer Autonomous System Number (ASN).

" } } @@ -94317,7 +95756,6 @@ "com.amazonaws.ec2#TransitGatewayMaxResults": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 5, "max": 1000 @@ -94765,8 +96203,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "GroupMember", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the resource is a transit gateway multicast group member.

", "smithy.api#xmlName": "groupMember" } @@ -94775,8 +96211,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "GroupSource", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates that the resource is a transit gateway multicast group member.

", "smithy.api#xmlName": "groupSource" } @@ -94891,8 +96325,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "AmazonSideAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \n The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs.

", "smithy.api#xmlName": "amazonSideAsn" } @@ -95426,8 +96858,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Blackhole", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether traffic that matches this route is dropped.

", "smithy.api#xmlName": "blackhole" } @@ -95574,8 +97004,6 @@ "AmazonSideAsn": { "target": "com.amazonaws.ec2#Long", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \n The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs. The default is 64512.

" } }, @@ -95798,8 +97226,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DefaultAssociationRouteTable", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the default association route table for the transit gateway.

", "smithy.api#xmlName": "defaultAssociationRouteTable" } @@ -95808,8 +97234,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DefaultPropagationRouteTable", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether this is the default propagation route table for the transit gateway.

", "smithy.api#xmlName": "defaultPropagationRouteTable" } @@ -96468,8 +97892,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "VlanId", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The ID of the VLAN when you use the VLAN protocol.

", "smithy.api#xmlName": "vlanId" } @@ -96478,8 +97900,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "GreKey", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The application key when you use the GRE protocol.

", "smithy.api#xmlName": "greKey" } @@ -96580,7 +98000,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "aws.protocols#ec2QueryName": "PreSharedKey", "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and the customer gateway.

", @@ -96591,8 +98011,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Phase1LifetimeSeconds", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 1 of the IKE negotiation, in seconds.

", "smithy.api#xmlName": "phase1LifetimeSeconds" } @@ -96601,8 +98019,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Phase2LifetimeSeconds", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 2 of the IKE negotiation, in seconds.

", "smithy.api#xmlName": "phase2LifetimeSeconds" } @@ -96611,8 +98027,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RekeyMarginTimeSeconds", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The margin time, in seconds, before the phase 2 lifetime expires, during which the\n Amazon Web Services side of the VPN connection performs an IKE rekey.

", "smithy.api#xmlName": "rekeyMarginTimeSeconds" } @@ -96621,8 +98035,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "RekeyFuzzPercentage", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The percentage of the rekey window determined by RekeyMarginTimeSeconds\n during which the rekey time is randomly selected.

", "smithy.api#xmlName": "rekeyFuzzPercentage" } @@ -96631,8 +98043,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "ReplayWindowSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of packets in an IKE replay window.

", "smithy.api#xmlName": "replayWindowSize" } @@ -96641,8 +98051,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "DpdTimeoutSeconds", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of seconds after which a DPD timeout occurs.

", "smithy.api#xmlName": "dpdTimeoutSeconds" } @@ -96731,8 +98139,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableTunnelLifecycleControl", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Status of tunnel endpoint lifecycle control feature.

", "smithy.api#xmlName": "enableTunnelLifecycleControl" } @@ -96837,7 +98243,19 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Unassigns one or more secondary private IP addresses, or IPv4 Prefix Delegation prefixes from a \n \tnetwork interface.

" + "smithy.api#documentation": "

Unassigns one or more secondary private IP addresses, or IPv4 Prefix Delegation prefixes from a \n \tnetwork interface.

", + "smithy.api#examples": [ + { + "title": "To unassign a secondary private IP address from a network interface", + "documentation": "This example unassigns the specified private IP address from the specified network interface.", + "input": { + "NetworkInterfaceId": "eni-e5aa89a3", + "PrivateIpAddresses": [ + "10.0.0.82" + ] + } + } + ] } }, "com.amazonaws.ec2#UnassignPrivateIpAddressesRequest": { @@ -96883,7 +98301,7 @@ "target": "com.amazonaws.ec2#UnassignPrivateNatGatewayAddressResult" }, "traits": { - "smithy.api#documentation": "

Unassigns secondary private IPv4 addresses from a private NAT gateway. You cannot unassign your primary private IP. For more information, see Edit secondary IP address associations in the Amazon Virtual Private Cloud User Guide.

\n

While unassigning is in progress, you cannot assign/unassign additional IP addresses while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

A private IP address will only be released at the end of MaxDrainDurationSeconds. The\n private IP addresses stay associated and support the existing connections but do not\n support any new connections (new connections are distributed across the remaining\n assigned private IP address). After the existing connections drain out, the private IP\n addresses get released.

\n

\n

" + "smithy.api#documentation": "

Unassigns secondary private IPv4 addresses from a private NAT gateway. You cannot unassign your primary private IP. For more information, see Edit secondary IP address associations in the Amazon VPC User Guide.

\n

While unassigning is in progress, you cannot assign/unassign additional IP addresses while the connections are being drained. You are, however, allowed to delete the NAT gateway.

\n

A private IP address will only be released at the end of MaxDrainDurationSeconds. The\n private IP addresses stay associated and support the existing connections, but do not\n support any new connections (new connections are distributed across the remaining\n assigned private IP address). After the existing connections drain out, the private IP\n addresses are released.

\n

\n

" } }, "com.amazonaws.ec2#UnassignPrivateNatGatewayAddressRequest": { @@ -96893,7 +98311,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#required": {} } }, @@ -96909,16 +98327,12 @@ "MaxDrainDurationSeconds": { "target": "com.amazonaws.ec2#DrainSeconds", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum amount of time to wait (in seconds) before forcibly releasing the IP addresses if connections are still in progress. Default value is 350 seconds.

" } }, "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -96934,7 +98348,7 @@ "target": "com.amazonaws.ec2#NatGatewayId", "traits": { "aws.protocols#ec2QueryName": "NatGatewayId", - "smithy.api#documentation": "

The NAT gateway ID.

", + "smithy.api#documentation": "

The ID of the NAT gateway.

", "smithy.api#xmlName": "natGatewayId" } }, @@ -97008,8 +98422,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DryRun", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

", "smithy.api#xmlName": "dryRun" } @@ -97196,7 +98608,30 @@ "target": "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressResult" }, "traits": { - "smithy.api#documentation": "

[VPC only] Updates the description of an egress (outbound) security group rule. You\n\t\t\tcan replace an existing description, or add a description to a rule that did not have one\n\t\t\tpreviously. You can remove a description for a security group rule by omitting the \n\t\t\tdescription parameter in the request.

" + "smithy.api#documentation": "

Updates the description of an egress (outbound) security group rule. You\n\t\t\tcan replace an existing description, or add a description to a rule that did not have one\n\t\t\tpreviously. You can remove a description for a security group rule by omitting the \n\t\t\tdescription parameter in the request.

", + "smithy.api#examples": [ + { + "title": "To update an outbound security group rule description", + "documentation": "This example updates the description for the specified security group rule.", + "input": { + "GroupId": "sg-123abc12", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 80, + "ToPort": 80, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/24", + "Description": "Outbound HTTP access to server 2" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressRequest": { @@ -97205,8 +98640,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -97219,7 +98652,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the security group\n\t\t\tID or the security group name in the request.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the security group\n\t\t\tID or the security group name.

" } }, "IpPermissions": { @@ -97247,8 +98680,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -97267,7 +98698,30 @@ "target": "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressResult" }, "traits": { - "smithy.api#documentation": "

Updates the description of an ingress (inbound) security group rule. You can replace an\n\t\t\texisting description, or add a description to a rule that did not have one previously.\n\t\t You can remove a description for a security group rule by omitting the description \n\t\t parameter in the request.

" + "smithy.api#documentation": "

Updates the description of an ingress (inbound) security group rule. You can replace an\n\t\t\texisting description, or add a description to a rule that did not have one previously.\n\t\t You can remove a description for a security group rule by omitting the description \n\t\t parameter in the request.

", + "smithy.api#examples": [ + { + "title": "To update an inbound security group rule description", + "documentation": "This example updates the description for the specified security group rule.", + "input": { + "GroupId": "sg-123abc12", + "IpPermissions": [ + { + "IpProtocol": "tcp", + "FromPort": 22, + "ToPort": 22, + "IpRanges": [ + { + "CidrIp": "203.0.113.0/16", + "Description": "SSH access from the LA office" + } + ] + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressRequest": { @@ -97276,8 +98730,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } }, @@ -97290,7 +98742,7 @@ "GroupName": { "target": "com.amazonaws.ec2#SecurityGroupName", "traits": { - "smithy.api#documentation": "

[EC2-Classic, default VPC] The name of the security group. You must specify either the\n security group ID or the security group name in the request. For security groups in a\n nondefault VPC, you must specify the security group ID.

" + "smithy.api#documentation": "

[Default VPC] The name of the security group. You must specify either the\n security group ID or the security group name. For security groups in a\n nondefault VPC, you must specify the security group ID.

" } }, "IpPermissions": { @@ -97302,7 +98754,7 @@ "SecurityGroupRuleDescriptions": { "target": "com.amazonaws.ec2#SecurityGroupRuleDescriptionList", "traits": { - "smithy.api#documentation": "

[VPC only] The description for the ingress security group rules. You must specify either\n a description or IP permissions.

", + "smithy.api#documentation": "

The description for the ingress security group rules. You must specify either\n a description or IP permissions.

", "smithy.api#xmlName": "SecurityGroupRuleDescription" } } @@ -97318,8 +98770,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Return", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Returns true if the request succeeds; otherwise, returns an error.

", "smithy.api#xmlName": "return" } @@ -97448,7 +98898,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "GroupName", - "smithy.api#documentation": "

The name of the security group. In a request, use this parameter for a security group\n in EC2-Classic or a default VPC only. For a security group in a nondefault VPC, use the\n security group ID.

\n

For a referenced security group in another VPC, this value is not returned if the\n referenced security group is deleted.

", + "smithy.api#documentation": "

[Default VPC] The name of the security group. For a security group in a nondefault VPC, \n use the security group ID.

\n

For a referenced security group in another VPC, this value is not returned if the\n referenced security group is deleted.

", "smithy.api#xmlName": "groupName" } }, @@ -97464,7 +98914,7 @@ "target": "com.amazonaws.ec2#String", "traits": { "aws.protocols#ec2QueryName": "UserId", - "smithy.api#documentation": "

The ID of an Amazon Web Services account.

\n

For a referenced security group in another VPC, the account ID of the referenced\n security group is returned in the response. If the referenced security group is deleted,\n this value is not returned.

\n

[EC2-Classic] Required when adding or removing rules that reference a security group\n in another Amazon Web Services account.

", + "smithy.api#documentation": "

The ID of an Amazon Web Services account.

\n

For a referenced security group in another VPC, the account ID of the referenced\n security group is returned in the response. If the referenced security group is deleted,\n this value is not returned.

", "smithy.api#xmlName": "userId" } }, @@ -97486,7 +98936,7 @@ } }, "traits": { - "smithy.api#documentation": "

Describes a security group and Amazon Web Services account ID pair.

\n \n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
" + "smithy.api#documentation": "

Describes a security group and Amazon Web Services account ID pair.

" } }, "com.amazonaws.ec2#UserIdGroupPairList": { @@ -97543,8 +98993,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Min", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of vCPUs. If the value is 0, there is no minimum\n limit.

", "smithy.api#xmlName": "min" } @@ -97553,8 +99001,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Max", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of vCPUs. If this parameter is not specified, there is no maximum\n limit.

", "smithy.api#xmlName": "max" } @@ -97571,7 +99017,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of vCPUs. To specify no minimum limit, specify 0.

", "smithy.api#required": {} } @@ -97579,8 +99024,6 @@ "Max": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The maximum number of vCPUs. To specify no maximum limit, omit this parameter.

" } } @@ -97832,6 +99275,14 @@ "smithy.api#documentation": "

The tags.

", "smithy.api#xmlName": "tagSet" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -97872,8 +99323,6 @@ "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { "aws.protocols#ec2QueryName": "Port", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

", "smithy.api#xmlName": "port" } @@ -97919,8 +99368,6 @@ "target": "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber", "traits": { "aws.protocols#ec2QueryName": "Port", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The IP port number.

", "smithy.api#xmlName": "port" } @@ -97949,7 +99396,6 @@ "com.amazonaws.ec2#VerifiedAccessEndpointPortNumber": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 65535 @@ -98132,6 +99578,14 @@ "smithy.api#documentation": "

The tags.

", "smithy.api#xmlName": "tagSet" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -98209,6 +99663,14 @@ "smithy.api#documentation": "

The tags.

", "smithy.api#xmlName": "tagSet" } + }, + "FipsEnabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "FipsEnabled", + "smithy.api#documentation": "

Describes whether support for Federal Information Processing Standards (FIPS) is enabled on the instance.

", + "smithy.api#xmlName": "fipsEnabled" + } } }, "traits": { @@ -98276,8 +99738,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#xmlName": "enabled" } @@ -98310,7 +99770,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#required": {} } @@ -98374,8 +99833,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#xmlName": "enabled" } @@ -98408,7 +99865,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#required": {} } @@ -98444,10 +99900,22 @@ "traits": { "smithy.api#documentation": "

Sends Verified Access logs to Kinesis.

" } + }, + "LogVersion": { + "target": "com.amazonaws.ec2#String", + "traits": { + "smithy.api#documentation": "

\n\t\t The logging version to use.\n\t

\n

Valid values: ocsf-0.1 | ocsf-1.0.0-rc.2\n

" + } + }, + "IncludeTrustContext": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

\n\t\t Include trust data sent by trust providers into the logs. \n\t

" + } } }, "traits": { - "smithy.api#documentation": "

Describes the destinations for Verified Access logs.

" + "smithy.api#documentation": "

Options for Verified Access logs.

" } }, "com.amazonaws.ec2#VerifiedAccessLogS3Destination": { @@ -98457,8 +99925,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Enabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#xmlName": "enabled" } @@ -98507,7 +99973,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether logging is enabled.

", "smithy.api#required": {} } @@ -98561,10 +100026,70 @@ "smithy.api#documentation": "

Kinesis logging destination.

", "smithy.api#xmlName": "kinesisDataFirehose" } + }, + "LogVersion": { + "target": "com.amazonaws.ec2#String", + "traits": { + "aws.protocols#ec2QueryName": "LogVersion", + "smithy.api#documentation": "

\n Describes current setting for the logging version.\n

", + "smithy.api#xmlName": "logVersion" + } + }, + "IncludeTrustContext": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "IncludeTrustContext", + "smithy.api#documentation": "

\n\t\t Describes current setting for including trust data into the logs.\n\t

", + "smithy.api#xmlName": "includeTrustContext" + } + } + }, + "traits": { + "smithy.api#documentation": "

Describes the options for Verified Access logs.

" + } + }, + "com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest": { + "type": "structure", + "members": { + "CustomerManagedKeyEnabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "smithy.api#documentation": "

\n Enable or disable the use of customer managed KMS keys for server side encryption.\n

\n

Valid values: True | False\n

" + } + }, + "KmsKeyArn": { + "target": "com.amazonaws.ec2#KmsKeyArn", + "traits": { + "smithy.api#documentation": "

\n The ARN of the KMS key.\n

" + } + } + }, + "traits": { + "smithy.api#documentation": "

\n Verified Access provides server side encryption by default to data at rest using Amazon Web Services-owned KMS keys. You also have the option of using customer managed KMS keys, which can be specified using the options below. \n

" + } + }, + "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse": { + "type": "structure", + "members": { + "CustomerManagedKeyEnabled": { + "target": "com.amazonaws.ec2#Boolean", + "traits": { + "aws.protocols#ec2QueryName": "CustomerManagedKeyEnabled", + "smithy.api#documentation": "

\n Describes the use of customer managed KMS keys for server side encryption.\n

\n

Valid values: True | False\n

", + "smithy.api#xmlName": "customerManagedKeyEnabled" + } + }, + "KmsKeyArn": { + "target": "com.amazonaws.ec2#KmsKeyArn", + "traits": { + "aws.protocols#ec2QueryName": "KmsKeyArn", + "smithy.api#documentation": "

\n Describes the ARN of the KMS key.\n

", + "smithy.api#xmlName": "kmsKeyArn" + } } }, "traits": { - "smithy.api#documentation": "

Describes the destinations for Verified Access logs.

" + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

" } }, "com.amazonaws.ec2#VerifiedAccessTrustProvider": { @@ -98657,6 +100182,14 @@ "smithy.api#documentation": "

The tags.

", "smithy.api#xmlName": "tagSet" } + }, + "SseSpecification": { + "target": "com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse", + "traits": { + "aws.protocols#ec2QueryName": "SseSpecification", + "smithy.api#documentation": "

\n Describes the options in use for server side encryption.\n

", + "smithy.api#xmlName": "sseSpecification" + } } }, "traits": { @@ -98766,8 +100299,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "AcceptedRouteCount", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of accepted routes.

", "smithy.api#xmlName": "acceptedRouteCount" } @@ -98898,8 +100429,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "Encrypted", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume is encrypted.

", "smithy.api#xmlName": "encrypted" } @@ -98924,8 +100453,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Size", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiBs.

", "smithy.api#xmlName": "size" } @@ -98958,8 +100485,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Iops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of I/O operations per second (IOPS). For gp3, io1, and io2 volumes, this represents \n the number of IOPS that are provisioned for the volume. For gp2 volumes, this represents the baseline \n performance of the volume and the rate at which the volume accumulates I/O credits for bursting.

", "smithy.api#xmlName": "iops" } @@ -98984,8 +100509,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "FastRestored", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the volume was created using fast snapshot restore.

", "smithy.api#xmlName": "fastRestored" } @@ -98994,8 +100517,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "MultiAttachEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether Amazon EBS Multi-Attach is enabled.

", "smithy.api#xmlName": "multiAttachEnabled" } @@ -99004,11 +100525,17 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "Throughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The throughput that the volume supports, in MiB/s.

", "smithy.api#xmlName": "throughput" } + }, + "SseType": { + "target": "com.amazonaws.ec2#SSEType", + "traits": { + "aws.protocols#ec2QueryName": "SseType", + "smithy.api#documentation": "

Reserved for future use.

", + "smithy.api#xmlName": "sseType" + } } }, "traits": { @@ -99062,8 +100589,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "DeleteOnTermination", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the EBS volume is deleted on instance termination.

", "smithy.api#xmlName": "deleteOnTermination" } @@ -99142,7 +100667,6 @@ "traits": { "aws.protocols#ec2QueryName": "Size", "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The size of the volume, in GiB.

", "smithy.api#required": {}, "smithy.api#xmlName": "size" @@ -99208,8 +100732,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target size of the volume, in GiB.

", "smithy.api#xmlName": "targetSize" } @@ -99218,8 +100740,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetIops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target IOPS rate of the volume.

", "smithy.api#xmlName": "targetIops" } @@ -99236,8 +100756,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "TargetThroughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The target throughput of the volume, in MiB/s.

", "smithy.api#xmlName": "targetThroughput" } @@ -99246,8 +100764,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "TargetMultiAttachEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The target setting for Amazon EBS Multi-Attach.

", "smithy.api#xmlName": "targetMultiAttachEnabled" } @@ -99256,8 +100772,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OriginalSize", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The original size of the volume, in GiB.

", "smithy.api#xmlName": "originalSize" } @@ -99266,8 +100780,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OriginalIops", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The original IOPS rate of the volume.

", "smithy.api#xmlName": "originalIops" } @@ -99284,8 +100796,6 @@ "target": "com.amazonaws.ec2#Integer", "traits": { "aws.protocols#ec2QueryName": "OriginalThroughput", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The original throughput of the volume, in MiB/s.

", "smithy.api#xmlName": "originalThroughput" } @@ -99294,8 +100804,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "OriginalMultiAttachEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

The original setting for Amazon EBS Multi-Attach.

", "smithy.api#xmlName": "originalMultiAttachEnabled" } @@ -99304,8 +100812,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "Progress", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The modification progress, from 0 to 100 percent complete.

", "smithy.api#xmlName": "progress" } @@ -99845,8 +101351,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "IsDefault", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the VPC is the default VPC.

", "smithy.api#xmlName": "isDefault" } @@ -100036,8 +101540,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "ClassicLinkEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the VPC is enabled for ClassicLink.

", "smithy.api#xmlName": "classicLinkEnabled" } @@ -100060,7 +101562,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes whether a VPC is enabled for ClassicLink.

" + "smithy.api#documentation": "\n

Deprecated.

\n
\n

Describes whether a VPC is enabled for ClassicLink.

" } }, "com.amazonaws.ec2#VpcClassicLinkIdList": { @@ -100176,8 +101678,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "PrivateDnsEnabled", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

(Interface endpoint) Indicates whether the VPC is associated with a private hosted zone.

", "smithy.api#xmlName": "privateDnsEnabled" } @@ -100186,8 +101686,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "RequesterManaged", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the endpoint is being managed by its service.

", "smithy.api#xmlName": "requesterManaged" } @@ -100601,9 +102099,7 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowDnsResolutionFromRemoteVpc", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local VPC can resolve public DNS hostnames to private IP addresses when queried from instances in a peer VPC.

", + "smithy.api#documentation": "

Indicates whether a local VPC can resolve public DNS hostnames to private IP addresses \n when queried from instances in a peer VPC.

", "smithy.api#xmlName": "allowDnsResolutionFromRemoteVpc" } }, @@ -100611,9 +102107,7 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowEgressFromLocalClassicLinkToRemoteVpc", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local ClassicLink connection can communicate with the peer VPC over the VPC peering connection.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalClassicLinkToRemoteVpc" } }, @@ -100621,15 +102115,13 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "AllowEgressFromLocalVpcToRemoteClassicLink", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, - "smithy.api#documentation": "

Indicates whether a local VPC can communicate with a ClassicLink connection in the peer VPC over the VPC peering connection.

", + "smithy.api#documentation": "

Deprecated.

", "smithy.api#xmlName": "allowEgressFromLocalVpcToRemoteClassicLink" } } }, "traits": { - "smithy.api#documentation": "\n

We are retiring EC2-Classic. We recommend that you migrate from EC2-Classic to a VPC. For more information, see Migrate from EC2-Classic to a VPC in the Amazon Elastic Compute Cloud User Guide.

\n
\n

Describes the VPC peering connection options.

" + "smithy.api#documentation": "

Describes the VPC peering connection options.

" } }, "com.amazonaws.ec2#VpcPeeringConnectionStateReason": { @@ -100811,7 +102303,7 @@ "type": "structure", "members": { "CustomerGatewayConfiguration": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#customerGatewayConfiguration", "traits": { "aws.protocols#ec2QueryName": "CustomerGatewayConfiguration", "smithy.api#documentation": "

The configuration information for the VPN connection's customer gateway (in the native\n XML format). This element is always present in the CreateVpnConnection\n response; however, it's present in the DescribeVpnConnections response\n only if the VPN connection is in the pending or available\n state.

", @@ -101021,8 +102513,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "EnableAcceleration", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether acceleration is enabled for the VPN connection.

", "smithy.api#xmlName": "enableAcceleration" } @@ -101031,8 +102521,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "StaticRoutesOnly", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicates whether the VPN connection uses static routes only. Static routes must be\n used for devices that don't support BGP.

", "smithy.api#xmlName": "staticRoutesOnly" } @@ -101112,8 +102600,6 @@ "EnableAcceleration": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicate whether to enable acceleration for the VPN connection.

\n

Default: false\n

" } }, @@ -101121,8 +102607,6 @@ "target": "com.amazonaws.ec2#Boolean", "traits": { "aws.protocols#ec2QueryName": "StaticRoutesOnly", - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Indicate whether the VPN connection uses static routes only. If you are creating a VPN\n connection for a device that does not support BGP, you must specify true.\n Use CreateVpnConnectionRoute to create a static route.

\n

Default: false\n

", "smithy.api#xmlName": "staticRoutesOnly" } @@ -101244,8 +102728,6 @@ "target": "com.amazonaws.ec2#Long", "traits": { "aws.protocols#ec2QueryName": "AmazonSideAsn", - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The private Autonomous System Number (ASN) for the Amazon side of a BGP\n session.

", "smithy.api#xmlName": "amazonSideAsn" } @@ -101422,7 +102904,7 @@ } }, "PreSharedKey": { - "target": "com.amazonaws.ec2#String", + "target": "com.amazonaws.ec2#preSharedKey", "traits": { "smithy.api#documentation": "

The pre-shared key (PSK) to establish initial authentication between the virtual\n private gateway and customer gateway.

\n

Constraints: Allowed characters are alphanumeric characters, periods (.), and\n underscores (_). Must be between 8 and 64 characters in length and cannot start with\n zero (0).

" } @@ -101430,48 +102912,36 @@ "Phase1LifetimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 1 of the IKE negotiation, in seconds.

\n

Constraints: A value between 900 and 28,800.

\n

Default: 28800\n

" } }, "Phase2LifetimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The lifetime for phase 2 of the IKE negotiation, in seconds.

\n

Constraints: A value between 900 and 3,600. The value must be less than the value for\n Phase1LifetimeSeconds.

\n

Default: 3600\n

" } }, "RekeyMarginTimeSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The margin time, in seconds, before the phase 2 lifetime expires, during which the\n Amazon Web Services side of the VPN connection performs an IKE rekey. The exact time\n of the rekey is randomly selected based on the value for\n RekeyFuzzPercentage.

\n

Constraints: A value between 60 and half of Phase2LifetimeSeconds.

\n

Default: 540\n

" } }, "RekeyFuzzPercentage": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The percentage of the rekey window (determined by RekeyMarginTimeSeconds)\n during which the rekey time is randomly selected.

\n

Constraints: A value between 0 and 100.

\n

Default: 100\n

" } }, "ReplayWindowSize": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of packets in an IKE replay window.

\n

Constraints: A value between 64 and 2048.

\n

Default: 1024\n

" } }, "DPDTimeoutSeconds": { "target": "com.amazonaws.ec2#Integer", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": 0, "smithy.api#documentation": "

The number of seconds after which a DPD timeout occurs.

\n

Constraints: A value greater than or equal to 30.

\n

Default: 30\n

" } }, @@ -101545,8 +103015,6 @@ "EnableTunnelLifecycleControl": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Turn on or off tunnel endpoint lifecycle control feature.

" } } @@ -101634,8 +103102,6 @@ "DryRun": { "target": "com.amazonaws.ec2#Boolean", "traits": { - "smithy.api#clientOptional": {}, - "smithy.api#default": false, "smithy.api#documentation": "

Checks whether you have the required permissions for the action, without actually making the request, \n and provides an error response. If you have the required permissions, the error response is DryRunOperation. \n Otherwise, it is UnauthorizedOperation.

" } } @@ -101678,6 +103144,18 @@ } } }, + "com.amazonaws.ec2#customerGatewayConfiguration": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, + "com.amazonaws.ec2#preSharedKey": { + "type": "string", + "traits": { + "smithy.api#sensitive": {} + } + }, "com.amazonaws.ec2#scope": { "type": "enum", "members": { @@ -101709,6 +103187,9 @@ }, "com.amazonaws.ec2#totalGpuMemory": { "type": "integer" + }, + "com.amazonaws.ec2#totalInferenceMemory": { + "type": "integer" } } } diff --git a/aws/sdk/aws-models/ecs.json b/aws/sdk/aws-models/ecs.json index 51c17eda2f4..37cb034e6c8 100644 --- a/aws/sdk/aws-models/ecs.json +++ b/aws/sdk/aws-models/ecs.json @@ -314,7 +314,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -332,293 +331,258 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://ecs-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ecs-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://ecs-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ecs-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ecs.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://ecs.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ecs.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://ecs.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1471,7 +1435,7 @@ "autoScalingGroupArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The Amazon Resource Name (ARN) that identifies the Auto Scaling group.

", + "smithy.api#documentation": "

The Amazon Resource Name (ARN) that identifies the Auto Scaling group, or the Auto Scaling group name.

", "smithy.api#required": {} } }, @@ -2009,7 +1973,7 @@ "namespace": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The namespace name or full Amazon Resource Name (ARN) of the Cloud Map namespace that's used when you create a service and don't specify\n\t\t\ta Service Connect configuration. The namespace name can include up to 1024 characters.\n\t\t\tThe name is case-sensitive. The name can't include hyphens (-), tilde (~), greater than\n\t\t\t(>), less than (<), or slash (/).

\n

If you enter an existing namespace name or ARN, then that namespace will be used.\n\t\t\tAny namespace type is supported. The namespace must be in this account and this Amazon Web Services\n\t\t\tRegion.

\n

If you enter a new name, a Cloud Map namespace will be created. Amazon ECS creates a\n\t\t\tCloud Map namespace with the \"API calls\" method of instance discovery only. This instance\n\t\t\tdiscovery method is the \"HTTP\" namespace type in the Command Line Interface. Other types of instance\n\t\t\tdiscovery aren't used by Service Connect.

\n

If you update the service with an empty string \"\" for the namespace name,\n\t\t\tthe cluster configuration for Service Connect is removed. Note that the namespace will\n\t\t\tremain in Cloud Map and must be deleted separately.

\n

For more information about Cloud Map, see Working\n\t\t\t\twith Services in the Cloud Map Developer Guide.

", + "smithy.api#documentation": "

The namespace name or full Amazon Resource Name (ARN) of the Cloud Map namespace that's used when you create a service and don't specify\n\t\t\ta Service Connect configuration. The namespace name can include up to 1024 characters.\n\t\t\tThe name is case-sensitive. The name can't include hyphens (-), tilde (~), greater than\n\t\t\t(>), less than (<), or slash (/).

\n

If you enter an existing namespace name or ARN, then that namespace will be used.\n\t\t\tAny namespace type is supported. The namespace must be in this account and this Amazon Web Services\n\t\t\tRegion.

\n

If you enter a new name, a Cloud Map namespace will be created. Amazon ECS creates a\n\t\t\tCloud Map namespace with the \"API calls\" method of instance discovery only. This instance\n\t\t\tdiscovery method is the \"HTTP\" namespace type in the Command Line Interface. Other types of instance\n\t\t\tdiscovery aren't used by Service Connect.

\n

If you update the cluster with an empty string \"\" for the namespace name,\n\t\t\tthe cluster configuration for Service Connect is removed. Note that the namespace will\n\t\t\tremain in Cloud Map and must be deleted separately.

\n

For more information about Cloud Map, see Working\n\t\t\t\twith Services in the Cloud Map Developer Guide.

", "smithy.api#required": {} } } @@ -2361,13 +2325,13 @@ "startTimeout": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

Time duration (in seconds) to wait before giving up on resolving dependencies for a\n\t\t\tcontainer. For example, you specify two containers in a task definition with containerA\n\t\t\thaving a dependency on containerB reaching a COMPLETE,\n\t\t\tSUCCESS, or HEALTHY status. If a startTimeout\n\t\t\tvalue is specified for containerB and it doesn't reach the desired status within that\n\t\t\ttime then containerA gives up and not start. This results in the task transitioning to a\n\t\t\t\tSTOPPED state.

\n \n

When the ECS_CONTAINER_START_TIMEOUT container agent configuration\n\t\t\t\tvariable is used, it's enforced independently from this start timeout value.

\n
\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

For tasks using the EC2 launch type, your container instances require at\n\t\t\tleast version 1.26.0 of the container agent to use a container start\n\t\t\ttimeout value. However, we recommend using the latest container agent version. For\n\t\t\tinformation about checking your agent version and updating to the latest version, see\n\t\t\t\tUpdating the Amazon ECS\n\t\t\t\tContainer Agent in the Amazon Elastic Container Service Developer Guide. If you're using an Amazon ECS-optimized Linux AMI,\n\t\t\tyour instance needs at least version 1.26.0-1 of the ecs-init\n\t\t\tpackage. If your container instances are launched from version 20190301 or\n\t\t\tlater, then they contain the required versions of the container agent and\n\t\t\t\tecs-init. For more information, see Amazon ECS-optimized Linux AMI\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Time duration (in seconds) to wait before giving up on resolving dependencies for a\n\t\t\tcontainer. For example, you specify two containers in a task definition with containerA\n\t\t\thaving a dependency on containerB reaching a COMPLETE,\n\t\t\tSUCCESS, or HEALTHY status. If a startTimeout\n\t\t\tvalue is specified for containerB and it doesn't reach the desired status within that\n\t\t\ttime then containerA gives up and not start. This results in the task transitioning to a\n\t\t\t\tSTOPPED state.

\n \n

When the ECS_CONTAINER_START_TIMEOUT container agent configuration\n\t\t\t\tvariable is used, it's enforced independently from this start timeout value.

\n
\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

For tasks using the EC2 launch type, your container instances require at\n\t\t\tleast version 1.26.0 of the container agent to use a container start\n\t\t\ttimeout value. However, we recommend using the latest container agent version. For\n\t\t\tinformation about checking your agent version and updating to the latest version, see\n\t\t\t\tUpdating the Amazon ECS\n\t\t\t\tContainer Agent in the Amazon Elastic Container Service Developer Guide. If you're using an Amazon ECS-optimized Linux AMI,\n\t\t\tyour instance needs at least version 1.26.0-1 of the ecs-init\n\t\t\tpackage. If your container instances are launched from version 20190301 or\n\t\t\tlater, then they contain the required versions of the container agent and\n\t\t\t\tecs-init. For more information, see Amazon ECS-optimized Linux AMI\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

\n

The valid values are 2-120 seconds.

" } }, "stopTimeout": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

Time duration (in seconds) to wait before the container is forcefully killed if it\n\t\t\tdoesn't exit normally on its own.

\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

The max stop timeout value is 120 seconds and if the parameter is not specified, the\n\t\t\tdefault value of 30 seconds is used.

\n

For tasks that use the EC2 launch type, if the stopTimeout\n\t\t\tparameter isn't specified, the value set for the Amazon ECS container agent configuration\n\t\t\tvariable ECS_CONTAINER_STOP_TIMEOUT is used. If neither the\n\t\t\t\tstopTimeout parameter or the ECS_CONTAINER_STOP_TIMEOUT\n\t\t\tagent configuration variable are set, then the default values of 30 seconds for Linux\n\t\t\tcontainers and 30 seconds on Windows containers are used. Your container instances\n\t\t\trequire at least version 1.26.0 of the container agent to use a container stop timeout\n\t\t\tvalue. However, we recommend using the latest container agent version. For information\n\t\t\tabout checking your agent version and updating to the latest version, see Updating the Amazon ECS Container Agent in the Amazon Elastic Container Service Developer Guide. If you're using\n\t\t\tan Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the\n\t\t\t\tecs-init package. If your container instances are launched from version\n\t\t\t\t20190301 or later, then they contain the required versions of the\n\t\t\tcontainer agent and ecs-init. For more information, see Amazon ECS-optimized Linux AMI in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Time duration (in seconds) to wait before the container is forcefully killed if it\n\t\t\tdoesn't exit normally on its own.

\n

For tasks using the Fargate launch type, the task or service requires\n\t\t\tthe following platforms:

\n
    \n
  • \n

    Linux platform version 1.3.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

The max stop timeout value is 120 seconds and if the parameter is not specified, the\n\t\t\tdefault value of 30 seconds is used.

\n

For tasks that use the EC2 launch type, if the stopTimeout\n\t\t\tparameter isn't specified, the value set for the Amazon ECS container agent configuration\n\t\t\tvariable ECS_CONTAINER_STOP_TIMEOUT is used. If neither the\n\t\t\t\tstopTimeout parameter or the ECS_CONTAINER_STOP_TIMEOUT\n\t\t\tagent configuration variable are set, then the default values of 30 seconds for Linux\n\t\t\tcontainers and 30 seconds on Windows containers are used. Your container instances\n\t\t\trequire at least version 1.26.0 of the container agent to use a container stop timeout\n\t\t\tvalue. However, we recommend using the latest container agent version. For information\n\t\t\tabout checking your agent version and updating to the latest version, see Updating the Amazon ECS Container Agent in the Amazon Elastic Container Service Developer Guide. If you're using\n\t\t\tan Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the\n\t\t\t\tecs-init package. If your container instances are launched from version\n\t\t\t\t20190301 or later, then they contain the required versions of the\n\t\t\tcontainer agent and ecs-init. For more information, see Amazon ECS-optimized Linux AMI in the Amazon Elastic Container Service Developer Guide.

\n

The valid values are 2-120 seconds.

" } }, "hostname": { @@ -2469,7 +2433,7 @@ "systemControls": { "target": "com.amazonaws.ecs#SystemControls", "traits": { - "smithy.api#documentation": "

A list of namespaced kernel parameters to set in the container. This parameter maps to\n\t\t\t\tSysctls in the Create a container section of the\n\t\t\tDocker Remote API and the --sysctl option to docker run.

\n \n

We don't recommended that you specify network-related systemControls\n\t\t\t\tparameters for multiple containers in a single task that also uses either the\n\t\t\t\t\tawsvpc or host network modes. For tasks that use the\n\t\t\t\t\tawsvpc network mode, the container that's started last determines\n\t\t\t\twhich systemControls parameters take effect. For tasks that use the\n\t\t\t\t\thost network mode, it changes the container instance's namespaced\n\t\t\t\tkernel parameters as well as the containers.

\n
" + "smithy.api#documentation": "

A list of namespaced kernel parameters to set in the container. This parameter maps to\n\t\t\t\tSysctls in the Create a container section of the\n\t\t\tDocker Remote API and the --sysctl option to docker run. For example, you can\n\t\t\tconfigure net.ipv4.tcp_keepalive_time setting to maintain\n\t\t\tlonger lived connections.

\n \n

We don't recommended that you specify network-related systemControls\n\t\t\t\tparameters for multiple containers in a single task that also uses either the\n\t\t\t\t\tawsvpc or host network modes. For tasks that use the\n\t\t\t\t\tawsvpc network mode, the container that's started last determines\n\t\t\t\twhich systemControls parameters take effect. For tasks that use the\n\t\t\t\t\thost network mode, it changes the container instance's namespaced\n\t\t\t\tkernel parameters as well as the containers.

\n
\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "resourceRequirements": { @@ -2483,6 +2447,12 @@ "traits": { "smithy.api#documentation": "

The FireLens configuration for the container. This is used to specify and configure a\n\t\t\tlog router for container logs. For more information, see Custom Log Routing\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" } + }, + "credentialSpecs": { + "target": "com.amazonaws.ecs#StringList", + "traits": { + "smithy.api#documentation": "

A list of ARNs in SSM or Amazon S3 to a credential spec\n\t\t\t\t(CredSpec) file that configures the container for Active Directory\n\t\t\tauthentication. We recommend that you use this parameter instead of the\n\t\t\t\tdockerSecurityOptions. The maximum number of ARNs is\n\t\t\t1.

\n

There are two formats for each ARN.

\n
\n
credentialspecdomainless:MyARN
\n
\n

You use credentialspecdomainless:MyARN to provide a\n\t\t\t\t\t\t\tCredSpec with an additional section for a secret in Secrets Manager.\n\t\t\t\t\t\tYou provide the login credentials to the domain in the secret.

\n

Each task that runs on any container instance can join different\n\t\t\t\t\t\tdomains.

\n

You can use this format without joining the container instance to a\n\t\t\t\t\t\tdomain.

\n
\n
credentialspec:MyARN
\n
\n

You use credentialspec:MyARN to provide a\n\t\t\t\t\t\t\tCredSpec for a single domain.

\n

You must join the container instance to the domain before you start any\n\t\t\t\t\t\ttasks that use this task definition.

\n
\n
\n

In both formats, replace MyARN with the ARN in\n\t\t\tSSM or Amazon S3.

\n

If you provide a credentialspecdomainless:MyARN, the\n\t\t\t\tcredspec must provide a ARN in Secrets Manager for a secret containing the\n\t\t\tusername, password, and the domain to connect to. For better security, the instance\n\t\t\tisn't joined to the domain for domainless authentication. Other applications on the\n\t\t\tinstance can't use the domainless credentials. You can use this parameter to run tasks\n\t\t\ton the same instance, even it the tasks need to join different domains. For more\n\t\t\tinformation, see Using gMSAs for Windows\n\t\t\t\tContainers and Using gMSAs for Linux\n\t\t\t\tContainers.

" + } } }, "traits": { @@ -2592,7 +2562,7 @@ "target": "com.amazonaws.ecs#Integer", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

The number of tasks on the container instance that are in the RUNNING\n\t\t\tstatus.

" + "smithy.api#documentation": "

The number of tasks on the container instance that have a desired status (desiredStatus) of RUNNING.

" } }, "pendingTasksCount": { @@ -2780,7 +2750,7 @@ } }, "traits": { - "smithy.api#documentation": "

The overrides that are sent to a container. An empty container override can be passed\n\t\t\tin. An example of an empty container override is {\"containerOverrides\": [ ]\n\t\t\t\t}. If a non-empty container override is specified, the name\n\t\t\tparameter must be included.

" + "smithy.api#documentation": "

The overrides that are sent to a container. An empty container override can be passed\n\t\t\tin. An example of an empty container override is {\"containerOverrides\": [ ]\n\t\t\t\t}. If a non-empty container override is specified, the name\n\t\t\tparameter must be included.

\n

You can use Secrets Manager or Amazon Web Services Systems Manager Parameter Store to store the sensitive\n\t\t\tdata. For more information, see Retrieve secrets through environment variables in the Amazon ECS Developer Guide.

" } }, "com.amazonaws.ecs#ContainerOverrides": { @@ -2945,7 +2915,27 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new Amazon ECS cluster. By default, your account receives a default\n\t\t\tcluster when you launch your first container instance. However, you can create your own\n\t\t\tcluster with a unique name with the CreateCluster action.

\n \n

When you call the CreateCluster API operation, Amazon ECS attempts to\n\t\t\t\tcreate the Amazon ECS service-linked role for your account. This is so that it can manage\n\t\t\t\trequired resources in other Amazon Web Services services on your behalf. However, if the user\n\t\t\t\tthat makes the call doesn't have permissions to create the service-linked role, it\n\t\t\t\tisn't created. For more information, see Using\n\t\t\t\t\tservice-linked roles for Amazon ECS in the Amazon Elastic Container Service Developer Guide.

\n
" + "smithy.api#documentation": "

Creates a new Amazon ECS cluster. By default, your account receives a default\n\t\t\tcluster when you launch your first container instance. However, you can create your own\n\t\t\tcluster with a unique name with the CreateCluster action.

\n \n

When you call the CreateCluster API operation, Amazon ECS attempts to\n\t\t\t\tcreate the Amazon ECS service-linked role for your account. This is so that it can manage\n\t\t\t\trequired resources in other Amazon Web Services services on your behalf. However, if the user\n\t\t\t\tthat makes the call doesn't have permissions to create the service-linked role, it\n\t\t\t\tisn't created. For more information, see Using\n\t\t\t\t\tservice-linked roles for Amazon ECS in the Amazon Elastic Container Service Developer Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To create a new cluster", + "documentation": "This example creates a cluster in your default region.", + "input": { + "clusterName": "my_cluster" + }, + "output": { + "cluster": { + "status": "ACTIVE", + "clusterName": "my_cluster", + "registeredContainerInstancesCount": 0, + "pendingTasksCount": 0, + "runningTasksCount": 0, + "activeServicesCount": 0, + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster" + } + } + } + ] } }, "com.amazonaws.ecs#CreateClusterRequest": { @@ -3050,7 +3040,59 @@ } ], "traits": { - "smithy.api#documentation": "

Runs and maintains your desired number of tasks from a specified task definition. If\n\t\t\tthe number of tasks running in a service drops below the desiredCount,\n\t\t\tAmazon ECS runs another copy of the task in the specified cluster. To update an existing\n\t\t\tservice, see the UpdateService action.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

In addition to maintaining the desired count of tasks in your service, you can\n\t\t\toptionally run your service behind one or more load balancers. The load balancers\n\t\t\tdistribute traffic across the tasks that are associated with the service. For more\n\t\t\tinformation, see Service load balancing in the Amazon Elastic Container Service Developer Guide.

\n

Tasks for services that don't use a load balancer are considered healthy if they're in\n\t\t\tthe RUNNING state. Tasks for services that use a load balancer are\n\t\t\tconsidered healthy if they're in the RUNNING state and are reported as\n\t\t\thealthy by the load balancer.

\n

There are two service scheduler strategies available:

\n
    \n
  • \n

    \n REPLICA - The replica scheduling strategy places and\n\t\t\t\t\tmaintains your desired number of tasks across your cluster. By default, the\n\t\t\t\t\tservice scheduler spreads tasks across Availability Zones. You can use task\n\t\t\t\t\tplacement strategies and constraints to customize task placement decisions. For\n\t\t\t\t\tmore information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    \n DAEMON - The daemon scheduling strategy deploys exactly one\n\t\t\t\t\ttask on each active container instance that meets all of the task placement\n\t\t\t\t\tconstraints that you specify in your cluster. The service scheduler also\n\t\t\t\t\tevaluates the task placement constraints for running tasks. It also stops tasks\n\t\t\t\t\tthat don't meet the placement constraints. When using this strategy, you don't\n\t\t\t\t\tneed to specify a desired number of tasks, a task placement strategy, or use\n\t\t\t\t\tService Auto Scaling policies. For more information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
\n

You can optionally specify a deployment configuration for your service. The deployment\n\t\t\tis initiated by changing properties. For example, the deployment might be initiated by\n\t\t\tthe task definition or by your desired count of a service. This is done with an UpdateService operation. The default value for a replica service for\n\t\t\t\tminimumHealthyPercent is 100%. The default value for a daemon service\n\t\t\tfor minimumHealthyPercent is 0%.

\n

If a service uses the ECS deployment controller, the minimum healthy\n\t\t\tpercent represents a lower limit on the number of tasks in a service that must remain in\n\t\t\tthe RUNNING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of your desired number of tasks (rounded up to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can deploy without using additional cluster capacity. For example, if you\n\t\t\tset your service to have desired number of four tasks and a minimum healthy percent of\n\t\t\t50%, the scheduler might stop two existing tasks to free up cluster capacity before\n\t\t\tstarting two new tasks. If they're in the RUNNING state, tasks for services\n\t\t\tthat don't use a load balancer are considered healthy . If they're in the\n\t\t\t\tRUNNING state and reported as healthy by the load balancer, tasks for\n\t\t\tservices that do use a load balancer are considered healthy . The\n\t\t\tdefault value for minimum healthy percent is 100%.

\n

If a service uses the ECS deployment controller, the maximum percent parameter represents an upper limit on the\n\t\t\tnumber of tasks in a service that are allowed in the RUNNING or\n\t\t\t\tPENDING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of the desired number of tasks (rounded down to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can define the deployment batch size. For example, if your service has a\n\t\t\tdesired number of four tasks and a maximum percent value of 200%, the scheduler may\n\t\t\tstart four new tasks before stopping the four older tasks (provided that the cluster\n\t\t\tresources required to do this are available). The default value for maximum percent is\n\t\t\t200%.

\n

If a service uses either the CODE_DEPLOY or EXTERNAL\n\t\t\tdeployment controller types and tasks that use the EC2 launch type, the\n\t\t\t\tminimum healthy percent and maximum percent values are used only to define the lower and upper limit\n\t\t\ton the number of the tasks in the service that remain in the RUNNING state.\n\t\t\tThis is while the container instances are in the DRAINING state. If the\n\t\t\ttasks in the service use the Fargate launch type, the minimum healthy\n\t\t\tpercent and maximum percent values aren't used. This is the case even if they're\n\t\t\tcurrently visible when describing your service.

\n

When creating a service that uses the EXTERNAL deployment controller, you\n\t\t\tcan specify only parameters that aren't controlled at the task set level. The only\n\t\t\trequired parameter is the service name. You control your services using the CreateTaskSet operation. For more information, see Amazon ECS deployment types in the Amazon Elastic Container Service Developer Guide.

\n

When the service scheduler launches new tasks, it determines task placement. For\n\t\t\tinformation about task placement and task placement strategies, see Amazon ECS\n\t\t\t\ttask placement in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Runs and maintains your desired number of tasks from a specified task definition. If\n\t\t\tthe number of tasks running in a service drops below the desiredCount,\n\t\t\tAmazon ECS runs another copy of the task in the specified cluster. To update an existing\n\t\t\tservice, see the UpdateService action.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

In addition to maintaining the desired count of tasks in your service, you can\n\t\t\toptionally run your service behind one or more load balancers. The load balancers\n\t\t\tdistribute traffic across the tasks that are associated with the service. For more\n\t\t\tinformation, see Service load balancing in the Amazon Elastic Container Service Developer Guide.

\n

Tasks for services that don't use a load balancer are considered healthy if they're in\n\t\t\tthe RUNNING state. Tasks for services that use a load balancer are\n\t\t\tconsidered healthy if they're in the RUNNING state and are reported as\n\t\t\thealthy by the load balancer.

\n

There are two service scheduler strategies available:

\n
    \n
  • \n

    \n REPLICA - The replica scheduling strategy places and\n\t\t\t\t\tmaintains your desired number of tasks across your cluster. By default, the\n\t\t\t\t\tservice scheduler spreads tasks across Availability Zones. You can use task\n\t\t\t\t\tplacement strategies and constraints to customize task placement decisions. For\n\t\t\t\t\tmore information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    \n DAEMON - The daemon scheduling strategy deploys exactly one\n\t\t\t\t\ttask on each active container instance that meets all of the task placement\n\t\t\t\t\tconstraints that you specify in your cluster. The service scheduler also\n\t\t\t\t\tevaluates the task placement constraints for running tasks. It also stops tasks\n\t\t\t\t\tthat don't meet the placement constraints. When using this strategy, you don't\n\t\t\t\t\tneed to specify a desired number of tasks, a task placement strategy, or use\n\t\t\t\t\tService Auto Scaling policies. For more information, see Service scheduler concepts in the Amazon Elastic Container Service Developer Guide.

    \n
  • \n
\n

You can optionally specify a deployment configuration for your service. The deployment\n\t\t\tis initiated by changing properties. For example, the deployment might be initiated by\n\t\t\tthe task definition or by your desired count of a service. This is done with an UpdateService operation. The default value for a replica service for\n\t\t\t\tminimumHealthyPercent is 100%. The default value for a daemon service\n\t\t\tfor minimumHealthyPercent is 0%.

\n

If a service uses the ECS deployment controller, the minimum healthy\n\t\t\tpercent represents a lower limit on the number of tasks in a service that must remain in\n\t\t\tthe RUNNING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of your desired number of tasks (rounded up to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can deploy without using additional cluster capacity. For example, if you\n\t\t\tset your service to have desired number of four tasks and a minimum healthy percent of\n\t\t\t50%, the scheduler might stop two existing tasks to free up cluster capacity before\n\t\t\tstarting two new tasks. If they're in the RUNNING state, tasks for services\n\t\t\tthat don't use a load balancer are considered healthy . If they're in the\n\t\t\t\tRUNNING state and reported as healthy by the load balancer, tasks for\n\t\t\tservices that do use a load balancer are considered healthy . The\n\t\t\tdefault value for minimum healthy percent is 100%.

\n

If a service uses the ECS deployment controller, the maximum percent parameter represents an upper limit on the\n\t\t\tnumber of tasks in a service that are allowed in the RUNNING or\n\t\t\t\tPENDING state during a deployment. Specifically, it represents it as a\n\t\t\tpercentage of the desired number of tasks (rounded down to the nearest integer). This\n\t\t\thappens when any of your container instances are in the DRAINING state if\n\t\t\tthe service contains tasks using the EC2 launch type. Using this\n\t\t\tparameter, you can define the deployment batch size. For example, if your service has a\n\t\t\tdesired number of four tasks and a maximum percent value of 200%, the scheduler may\n\t\t\tstart four new tasks before stopping the four older tasks (provided that the cluster\n\t\t\tresources required to do this are available). The default value for maximum percent is\n\t\t\t200%.

\n

If a service uses either the CODE_DEPLOY or EXTERNAL\n\t\t\tdeployment controller types and tasks that use the EC2 launch type, the\n\t\t\t\tminimum healthy percent and maximum percent values are used only to define the lower and upper limit\n\t\t\ton the number of the tasks in the service that remain in the RUNNING state.\n\t\t\tThis is while the container instances are in the DRAINING state. If the\n\t\t\ttasks in the service use the Fargate launch type, the minimum healthy\n\t\t\tpercent and maximum percent values aren't used. This is the case even if they're\n\t\t\tcurrently visible when describing your service.

\n

When creating a service that uses the EXTERNAL deployment controller, you\n\t\t\tcan specify only parameters that aren't controlled at the task set level. The only\n\t\t\trequired parameter is the service name. You control your services using the CreateTaskSet operation. For more information, see Amazon ECS deployment types in the Amazon Elastic Container Service Developer Guide.

\n

When the service scheduler launches new tasks, it determines task placement. For\n\t\t\tinformation about task placement and task placement strategies, see Amazon ECS\n\t\t\t\ttask placement in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To create a new service", + "documentation": "This example creates a service in your default region called ``ecs-simple-service``. The service uses the ``hello_world`` task definition and it maintains 10 copies of that task.", + "input": { + "serviceName": "ecs-simple-service", + "taskDefinition": "hello_world", + "desiredCount": 10 + }, + "output": { + "service": { + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default", + "createdAt": "2016-08-29T16:13:47.298Z", + "deploymentConfiguration": { + "maximumPercent": 200, + "minimumHealthyPercent": 100 + }, + "deployments": [ + { + "createdAt": "2016-08-29T16:13:47.298Z", + "desiredCount": 10, + "id": "ecs-svc/9223370564342348388", + "pendingCount": 0, + "runningCount": 0, + "status": "PRIMARY", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:13:47.298Z" + }, + { + "createdAt": "2016-08-29T15:52:44.481Z", + "desiredCount": 0, + "id": "ecs-svc/9223370564343611322", + "pendingCount": 0, + "runningCount": 0, + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:11:38.941Z" + } + ], + "desiredCount": 10, + "events": [], + "loadBalancers": [], + "pendingCount": 0, + "runningCount": 0, + "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/default/ecs-simple-service", + "serviceName": "ecs-simple-service", + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/default/hello_world:6" + } + } + } + ] } }, "com.amazonaws.ecs#CreateServiceRequest": { @@ -3175,13 +3217,13 @@ "target": "com.amazonaws.ecs#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether to turn on Amazon ECS managed tags for the tasks within the service. For\n\t\t\tmore information, see Tagging your Amazon ECS\n\t\t\t\tresources in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Specifies whether to turn on Amazon ECS managed tags for the tasks within the service. For\n\t\t\tmore information, see Tagging your Amazon ECS\n\t\t\t\tresources in the Amazon Elastic Container Service Developer Guide.

\n

When you use Amazon ECS managed tags, you need to set the propagateTags\n\t\t\trequest parameter.

" } }, "propagateTags": { "target": "com.amazonaws.ecs#PropagateTags", "traits": { - "smithy.api#documentation": "

Specifies whether to propagate the tags from the task definition to the task. If no\n\t\t\tvalue is specified, the tags aren't propagated. Tags can only be propagated to the task\n\t\t\tduring task creation. To add tags to a task after task creation, use the TagResource API action.

" + "smithy.api#documentation": "

Specifies whether to propagate the tags from the task definition to the task. If no\n\t\t\tvalue is specified, the tags aren't propagated. Tags can only be propagated to the task\n\t\t\tduring task creation. To add tags to a task after task creation, use the TagResource API action.

\n

The default is NONE.

" } }, "enableExecuteCommand": { @@ -3289,7 +3331,7 @@ "taskDefinition": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The task definition for the tasks in the task set to use.

", + "smithy.api#documentation": "

The task definition for the tasks in the task set to use. If a revision isn't specified, the\n\t\t\tlatest ACTIVE revision is used.

", "smithy.api#required": {} } }, @@ -3386,7 +3428,23 @@ } ], "traits": { - "smithy.api#documentation": "

Disables an account setting for a specified user, role, or the root user for\n\t\t\tan account.

" + "smithy.api#documentation": "

Disables an account setting for a specified user, role, or the root user for\n\t\t\tan account.

", + "smithy.api#examples": [ + { + "title": "To delete your account setting", + "documentation": "This example deletes the account setting for your user for the specified resource type.", + "input": { + "name": "serviceLongArnFormat" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + } + } + ] } }, "com.amazonaws.ecs#DeleteAccountSettingRequest": { @@ -3569,7 +3627,27 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified cluster. The cluster transitions to the INACTIVE\n\t\t\tstate. Clusters with an INACTIVE status might remain discoverable in your\n\t\t\taccount for a period of time. However, this behavior is subject to change in the future.\n\t\t\tWe don't recommend that you rely on INACTIVE clusters persisting.

\n

You must deregister all container instances from this cluster before you may delete\n\t\t\tit. You can list the container instances in a cluster with ListContainerInstances and deregister them with DeregisterContainerInstance.

" + "smithy.api#documentation": "

Deletes the specified cluster. The cluster transitions to the INACTIVE\n\t\t\tstate. Clusters with an INACTIVE status might remain discoverable in your\n\t\t\taccount for a period of time. However, this behavior is subject to change in the future.\n\t\t\tWe don't recommend that you rely on INACTIVE clusters persisting.

\n

You must deregister all container instances from this cluster before you may delete\n\t\t\tit. You can list the container instances in a cluster with ListContainerInstances and deregister them with DeregisterContainerInstance.

", + "smithy.api#examples": [ + { + "title": "To delete an empty cluster", + "documentation": "This example deletes an empty cluster in your default region.", + "input": { + "cluster": "my_cluster" + }, + "output": { + "cluster": { + "activeServicesCount": 0, + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster", + "clusterName": "my_cluster", + "pendingTasksCount": 0, + "registeredContainerInstancesCount": 0, + "runningTasksCount": 0, + "status": "INACTIVE" + } + } + } + ] } }, "com.amazonaws.ecs#DeleteClusterRequest": { @@ -3627,7 +3705,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a specified service within a cluster. You can delete a service if you have no\n\t\t\trunning tasks in it and the desired task count is zero. If the service is actively\n\t\t\tmaintaining tasks, you can't delete it, and you must update the service to a desired\n\t\t\ttask count of zero. For more information, see UpdateService.

\n \n

When you delete a service, if there are still running tasks that require cleanup,\n\t\t\t\tthe service status moves from ACTIVE to DRAINING, and the\n\t\t\t\tservice is no longer visible in the console or in the ListServices\n\t\t\t\tAPI operation. After all tasks have transitioned to either STOPPING or\n\t\t\t\t\tSTOPPED status, the service status moves from DRAINING\n\t\t\t\tto INACTIVE. Services in the DRAINING or\n\t\t\t\t\tINACTIVE status can still be viewed with the DescribeServices API operation. However, in the future,\n\t\t\t\t\tINACTIVE services may be cleaned up and purged from Amazon ECS record\n\t\t\t\tkeeping, and DescribeServices calls on those services return a\n\t\t\t\t\tServiceNotFoundException error.

\n
\n \n

If you attempt to create a new service with the same name as an existing service\n\t\t\t\tin either ACTIVE or DRAINING status, you receive an\n\t\t\t\terror.

\n
" + "smithy.api#documentation": "

Deletes a specified service within a cluster. You can delete a service if you have no\n\t\t\trunning tasks in it and the desired task count is zero. If the service is actively\n\t\t\tmaintaining tasks, you can't delete it, and you must update the service to a desired\n\t\t\ttask count of zero. For more information, see UpdateService.

\n \n

When you delete a service, if there are still running tasks that require cleanup,\n\t\t\t\tthe service status moves from ACTIVE to DRAINING, and the\n\t\t\t\tservice is no longer visible in the console or in the ListServices\n\t\t\t\tAPI operation. After all tasks have transitioned to either STOPPING or\n\t\t\t\t\tSTOPPED status, the service status moves from DRAINING\n\t\t\t\tto INACTIVE. Services in the DRAINING or\n\t\t\t\t\tINACTIVE status can still be viewed with the DescribeServices API operation. However, in the future,\n\t\t\t\t\tINACTIVE services may be cleaned up and purged from Amazon ECS record\n\t\t\t\tkeeping, and DescribeServices calls on those services return a\n\t\t\t\t\tServiceNotFoundException error.

\n
\n \n

If you attempt to create a new service with the same name as an existing service\n\t\t\t\tin either ACTIVE or DRAINING status, you receive an\n\t\t\t\terror.

\n
", + "smithy.api#examples": [ + { + "title": "To delete a service", + "documentation": "This example deletes the my-http-service service. The service must have a desired count and running count of 0 before you can delete it.", + "input": { + "service": "my-http-service" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#DeleteServiceRequest": { @@ -3694,7 +3782,7 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes one or more task definitions.

\n

You must deregister a task definition revision before you delete it. For more information,\n\t\t\tsee DeregisterTaskDefinition.

\n

When you delete a task definition revision, it is immediately transitions from the\n\t\tINACTIVE to DELETE_IN_PROGRESS. Existing tasks and services\n\t\tthat reference a DELETE_IN_PROGRESS task definition revision continue to run\n\t\twithout disruption. Existing services that reference a DELETE_IN_PROGRESS task\n\t\tdefinition revision can still scale up or down by modifying the service's desired\n\t\tcount.

\n

You can't use a DELETE_IN_PROGRESS task definition revision to run new tasks\n\t\t\tor create new services. You also can't update an existing service to reference a\n\t\t\tDELETE_IN_PROGRESS task definition revision.

\n

A task definition revision will stay in DELETE_IN_PROGRESS status until\n\t\t\tall the associated tasks and services have been terminated.

" + "smithy.api#documentation": "

Deletes one or more task definitions.

\n

You must deregister a task definition revision before you delete it. For more information,\n\t\t\tsee DeregisterTaskDefinition.

\n

When you delete a task definition revision, it is immediately transitions from the\n\t\tINACTIVE to DELETE_IN_PROGRESS. Existing tasks and services\n\t\tthat reference a DELETE_IN_PROGRESS task definition revision continue to run\n\t\twithout disruption. Existing services that reference a DELETE_IN_PROGRESS task\n\t\tdefinition revision can still scale up or down by modifying the service's desired\n\t\tcount.

\n

You can't use a DELETE_IN_PROGRESS task definition revision to run new tasks\n\t\t\tor create new services. You also can't update an existing service to reference a\n\t\t\tDELETE_IN_PROGRESS task definition revision.

\n

A task definition revision will stay in DELETE_IN_PROGRESS status until\n\t\t\tall the associated tasks and services have been terminated.

\n

When you delete all INACTIVE task definition revisions, the task definition name is not displayed in the console and not returned in the API. If a task definition revisions are in the DELETE_IN_PROGRESS state, the task definition name is displayed in the console and returned in the API. The task definition name is retained by Amazon ECS and the revision is incremented the next time you create a task definition with that name.

" } }, "com.amazonaws.ecs#DeleteTaskDefinitionsRequest": { @@ -3994,7 +4082,7 @@ } }, "traits": { - "smithy.api#documentation": "\n

The deployment circuit breaker can only be used for services using the rolling\n\t\t\t\tupdate (ECS) deployment type.

\n
\n

The deployment circuit breaker determines whether a\n\t\t\tservice deployment will fail if the service can't reach a steady state. If it is turned on, a\n\t\t\tservice deployment will transition to a failed state and stop launching new tasks. You\n\t\t\tcan also configure Amazon ECS to roll back your service to the last completed deployment\n\t\t\tafter a failure. For more information, see Rolling\n\t\t\t\tupdate in the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "\n

The deployment circuit breaker can only be used for services using the rolling\n\t\t\t\tupdate (ECS) deployment type.

\n
\n

The deployment circuit breaker determines whether a\n\t\t\tservice deployment will fail if the service can't reach a steady state. If it is turned on, a\n\t\t\tservice deployment will transition to a failed state and stop launching new tasks. You\n\t\t\tcan also configure Amazon ECS to roll back your service to the last completed deployment\n\t\t\tafter a failure. For more information, see Rolling\n\t\t\t\tupdate in the Amazon Elastic Container Service Developer Guide.

\n

For more information about API failure reasons, see API failure reasons in the Amazon Elastic Container Service Developer Guide.

" } }, "com.amazonaws.ecs#DeploymentConfiguration": { @@ -4119,7 +4207,19 @@ } ], "traits": { - "smithy.api#documentation": "

Deregisters an Amazon ECS container instance from the specified cluster. This instance is\n\t\t\tno longer available to run tasks.

\n

If you intend to use the container instance for some other purpose after\n\t\t\tderegistration, we recommend that you stop all of the tasks running on the container\n\t\t\tinstance before deregistration. That prevents any orphaned tasks from consuming\n\t\t\tresources.

\n

Deregistering a container instance removes the instance from a cluster, but it doesn't\n\t\t\tterminate the EC2 instance. If you are finished using the instance, be sure to terminate\n\t\t\tit in the Amazon EC2 console to stop billing.

\n \n

If you terminate a running container instance, Amazon ECS automatically deregisters the\n\t\t\t\tinstance from your cluster (stopped container instances or instances with\n\t\t\t\tdisconnected agents aren't automatically deregistered when terminated).

\n
" + "smithy.api#documentation": "

Deregisters an Amazon ECS container instance from the specified cluster. This instance is\n\t\t\tno longer available to run tasks.

\n

If you intend to use the container instance for some other purpose after\n\t\t\tderegistration, we recommend that you stop all of the tasks running on the container\n\t\t\tinstance before deregistration. That prevents any orphaned tasks from consuming\n\t\t\tresources.

\n

Deregistering a container instance removes the instance from a cluster, but it doesn't\n\t\t\tterminate the EC2 instance. If you are finished using the instance, be sure to terminate\n\t\t\tit in the Amazon EC2 console to stop billing.

\n \n

If you terminate a running container instance, Amazon ECS automatically deregisters the\n\t\t\t\tinstance from your cluster (stopped container instances or instances with\n\t\t\t\tdisconnected agents aren't automatically deregistered when terminated).

\n
", + "smithy.api#examples": [ + { + "title": "To deregister a container instance from a cluster", + "documentation": "This example deregisters a container instance from the specified cluster in your default region. If there are still tasks running on the container instance, you must either stop those tasks before deregistering, or use the force option.", + "input": { + "cluster": "default", + "force": true, + "containerInstance": "container_instance_UUID" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#DeregisterContainerInstanceRequest": { @@ -4316,7 +4416,28 @@ } ], "traits": { - "smithy.api#documentation": "

Describes one or more of your clusters.

" + "smithy.api#documentation": "

Describes one or more of your clusters.

", + "smithy.api#examples": [ + { + "title": "To describe a cluster", + "documentation": "This example provides a description of the specified cluster in your default region.", + "input": { + "clusters": [ + "default" + ] + }, + "output": { + "clusters": [ + { + "clusterName": "default", + "status": "ACTIVE", + "clusterArn": "arn:aws:ecs:us-east-1:aws_account_id:cluster/default" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#DescribeClustersRequest": { @@ -4382,7 +4503,91 @@ } ], "traits": { - "smithy.api#documentation": "

Describes one or more container instances. Returns metadata about each container\n\t\t\tinstance requested.

" + "smithy.api#documentation": "

Describes one or more container instances. Returns metadata about each container\n\t\t\tinstance requested.

", + "smithy.api#examples": [ + { + "title": "To describe container instance", + "documentation": "This example provides a description of the specified container instance in your default region, using the container instance UUID as an identifier.", + "input": { + "cluster": "default", + "containerInstances": [ + "f2756532-8f13-4d53-87c9-aed50dc94cd7" + ] + }, + "output": { + "failures": [], + "containerInstances": [ + { + "status": "ACTIVE", + "registeredResources": [ + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 2048, + "name": "CPU" + }, + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 3768, + "name": "MEMORY" + }, + { + "name": "PORTS", + "longValue": 0, + "doubleValue": 0.0, + "stringSetValue": [ + "2376", + "22", + "51678", + "2375" + ], + "type": "STRINGSET", + "integerValue": 0 + } + ], + "ec2InstanceId": "i-807f3249", + "agentConnected": true, + "containerInstanceArn": "arn:aws:ecs:us-east-1:012345678910:container-instance/default/f2756532-8f13-4d53-87c9-aed50dc94cd7", + "pendingTasksCount": 0, + "remainingResources": [ + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 1948, + "name": "CPU" + }, + { + "doubleValue": 0.0, + "type": "INTEGER", + "longValue": 0, + "integerValue": 3668, + "name": "MEMORY" + }, + { + "name": "PORTS", + "longValue": 0, + "doubleValue": 0.0, + "stringSetValue": [ + "2376", + "22", + "80", + "51678", + "2375" + ], + "type": "STRINGSET", + "integerValue": 0 + } + ], + "runningTasksCount": 1 + } + ] + } + } + ] } }, "com.amazonaws.ecs#DescribeContainerInstancesRequest": { @@ -4456,6 +4661,57 @@ ], "traits": { "smithy.api#documentation": "

Describes the specified services running in your cluster.

", + "smithy.api#examples": [ + { + "title": "To describe a service", + "documentation": "This example provides descriptive information about the service named ``ecs-simple-service``.", + "input": { + "services": [ + "ecs-simple-service" + ] + }, + "output": { + "failures": [], + "services": [ + { + "clusterArn": "arn:aws:ecs:us-east-1:012345678910:cluster/default", + "createdAt": "2016-08-29T16:25:52.130Z", + "deploymentConfiguration": { + "maximumPercent": 200, + "minimumHealthyPercent": 100 + }, + "deployments": [ + { + "createdAt": "2016-08-29T16:25:52.130Z", + "desiredCount": 1, + "id": "ecs-svc/9223370564341623665", + "pendingCount": 0, + "runningCount": 0, + "status": "PRIMARY", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6", + "updatedAt": "2016-08-29T16:25:52.130Z" + } + ], + "desiredCount": 1, + "events": [ + { + "createdAt": "2016-08-29T16:25:58.520Z", + "id": "38c285e5-d335-4b68-8b15-e46dedc8e88d", + "message": "(service ecs-simple-service) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 3f4de1c5-ffdd-4954-af7e-75b4be0c8841) is already using a port required by your task. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide." + } + ], + "loadBalancers": [], + "pendingCount": 0, + "runningCount": 0, + "serviceArn": "arn:aws:ecs:us-east-1:012345678910:service/default/ecs-simple-service", + "serviceName": "ecs-simple-service", + "status": "ACTIVE", + "taskDefinition": "arn:aws:ecs:us-east-1:012345678910:task-definition/default/hello_world:6" + } + ] + } + } + ], "smithy.waiters#waitable": { "ServicesInactive": { "acceptors": [ @@ -4597,7 +4853,61 @@ } ], "traits": { - "smithy.api#documentation": "

Describes a task definition. You can specify a family and\n\t\t\t\trevision to find information about a specific task definition, or you\n\t\t\tcan simply specify the family to find the latest ACTIVE revision in that\n\t\t\tfamily.

\n \n

You can only describe INACTIVE task definitions while an active task\n\t\t\t\tor service references them.

\n
" + "smithy.api#documentation": "

Describes a task definition. You can specify a family and\n\t\t\t\trevision to find information about a specific task definition, or you\n\t\t\tcan simply specify the family to find the latest ACTIVE revision in that\n\t\t\tfamily.

\n \n

You can only describe INACTIVE task definitions while an active task\n\t\t\t\tor service references them.

\n
", + "smithy.api#examples": [ + { + "title": "To describe a task definition", + "documentation": "This example provides a description of the specified task definition.", + "input": { + "taskDefinition": "hello_world:8" + }, + "output": { + "taskDefinition": { + "family": "hello_world", + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/hello_world:8", + "containerDefinitions": [ + { + "mountPoints": [], + "name": "wordpress", + "links": [ + "mysql" + ], + "image": "wordpress", + "cpu": 10, + "environment": [], + "memory": 500, + "portMappings": [ + { + "containerPort": 80, + "hostPort": 80 + } + ], + "essential": true, + "volumesFrom": [] + }, + { + "mountPoints": [], + "name": "mysql", + "image": "mysql", + "cpu": 10, + "environment": [ + { + "name": "MYSQL_ROOT_PASSWORD", + "value": "password" + } + ], + "memory": 500, + "portMappings": [], + "volumesFrom": [], + "essential": true + } + ], + "volumes": [], + "revision": 8 + } + } + } + ] } }, "com.amazonaws.ecs#DescribeTaskDefinitionRequest": { @@ -4756,7 +5066,54 @@ } ], "traits": { - "smithy.api#documentation": "

Describes a specified task or tasks.

\n

Currently, stopped tasks appear in the returned results for at least one hour.

", + "smithy.api#documentation": "

Describes a specified task or tasks.

\n

Currently, stopped tasks appear in the returned results for at least one hour.

\n

If you have tasks with tags, and then delete the cluster, the tagged tasks are\n\t\t\treturned in the response. If you create a new cluster with the same name as the deleted\n\t\t\tcluster, the tagged tasks are not included in the response.

", + "smithy.api#examples": [ + { + "title": "To describe a task", + "documentation": "This example provides a description of the specified task, using the task UUID as an identifier.", + "input": { + "tasks": [ + "c5cba4eb-5dad-405e-96db-71ef8eefe6a8" + ] + }, + "output": { + "failures": [], + "tasks": [ + { + "taskArn": "arn:aws:ecs:::task/default/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", + "overrides": { + "containerOverrides": [ + { + "name": "ecs-demo" + } + ] + }, + "lastStatus": "RUNNING", + "containerInstanceArn": "arn:aws:ecs:::container-instance/default/18f9eda5-27d7-4c19-b133-45adc516e8fb", + "clusterArn": "arn:aws:ecs:::cluster/default", + "desiredStatus": "RUNNING", + "taskDefinitionArn": "arn:aws:ecs:::task-definition/amazon-ecs-sample:1", + "startedBy": "ecs-svc/9223370608528463088", + "containers": [ + { + "containerArn": "arn:aws:ecs:::container/7c01765b-c588-45b3-8290-4ba38bd6c5a6", + "taskArn": "arn:aws:ecs:::task/default/c5cba4eb-5dad-405e-96db-71ef8eefe6a8", + "lastStatus": "RUNNING", + "name": "ecs-demo", + "networkBindings": [ + { + "bindIP": "0.0.0.0", + "containerPort": 80, + "hostPort": 80 + } + ] + } + ] + } + ] + } + } + ], "smithy.waiters#waitable": { "TasksRunning": { "acceptors": [ @@ -5174,7 +5531,7 @@ } }, "traits": { - "smithy.api#documentation": "

A list of files containing the environment variables to pass to a container. You can\n\t\t\tspecify up to ten environment files. The file must have a .env file\n\t\t\textension. Each line in an environment file should contain an environment variable in\n\t\t\t\tVARIABLE=VALUE format. Lines beginning with # are treated\n\t\t\tas comments and are ignored. For more information about the environment variable file\n\t\t\tsyntax, see Declare default\n\t\t\t\tenvironment variables in file.

\n

If there are environment variables specified using the environment\n\t\t\tparameter in a container definition, they take precedence over the variables contained\n\t\t\twithin an environment file. If multiple environment files are specified that contain the\n\t\t\tsame variable, they're processed from the top down. We recommend that you use unique\n\t\t\tvariable names. For more information, see Specifying environment\n\t\t\t\tvariables in the Amazon Elastic Container Service Developer Guide.

\n

This parameter is only supported for tasks hosted on Fargate using the\n\t\t\tfollowing platform versions:

\n
    \n
  • \n

    Linux platform version 1.4.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
" + "smithy.api#documentation": "

A list of files containing the environment variables to pass to a container. You can specify\n\t\t\tup to ten environment files. The file must have a .env file extension. Each\n\t\t\tline in an environment file should contain an environment variable in\n\t\t\t\tVARIABLE=VALUE format. Lines beginning with # are treated\n\t\t\tas comments and are ignored.

\n

If there are environment variables specified using the environment\n\t\t\tparameter in a container definition, they take precedence over the variables contained\n\t\t\twithin an environment file. If multiple environment files are specified that contain the\n\t\t\tsame variable, they're processed from the top down. We recommend that you use unique\n\t\t\tvariable names. For more information, see Specifying environment\n\t\t\t\tvariables in the Amazon Elastic Container Service Developer Guide.

\n

You must use the following platforms for the Fargate launch type:

\n
    \n
  • \n

    Linux platform version 1.4.0 or later.

    \n
  • \n
  • \n

    Windows platform version 1.0.0 or later.

    \n
  • \n
\n

Consider the following when using the Fargate launch type:

\n
    \n
  • \n

    The file is handled like a native Docker env-file.

    \n
  • \n
  • \n

    There is no support for shell escape handling.

    \n
  • \n
  • \n

    The container entry point interperts the VARIABLE values.

    \n
  • \n
" } }, "com.amazonaws.ecs#EnvironmentFileType": { @@ -5586,7 +5943,29 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the protection status of tasks in an Amazon ECS service.

" + "smithy.api#documentation": "

Retrieves the protection status of tasks in an Amazon ECS service.

", + "smithy.api#examples": [ + { + "title": "To get the protection status of a task", + "documentation": "In this example, we get the protection status for a single task.", + "input": { + "cluster": "test-task-protection", + "tasks": [ + "b8b1cf532d0e46ba8d44a40d1de16772" + ] + }, + "output": { + "protectedTasks": [ + { + "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/default/b8b1cf532d0e46ba8d44a40d1de16772", + "protectionEnabled": true, + "expirationDate": "2022-11-02T06:56:32.553Z" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#GetTaskProtectionRequest": { @@ -5672,7 +6051,7 @@ } }, "traits": { - "smithy.api#documentation": "

An object representing a container health check. Health check parameters that are\n\t\t\tspecified in a container definition override any Docker health checks that exist in the\n\t\t\tcontainer image (such as those specified in a parent image or from the image's\n\t\t\tDockerfile). This configuration maps to the HEALTHCHECK parameter of docker run.

\n \n

The Amazon ECS container agent only monitors and reports on the health checks specified\n\t\t\t\tin the task definition. Amazon ECS does not monitor Docker health checks that are\n\t\t\t\tembedded in a container image and not specified in the container definition. Health\n\t\t\t\tcheck parameters that are specified in a container definition override any Docker\n\t\t\t\thealth checks that exist in the container image.

\n
\n

You can view the health status of both individual containers and a task with the\n\t\t\tDescribeTasks API operation or when viewing the task details in the console.

\n

The following describes the possible healthStatus values for a\n\t\t\tcontainer:

\n
    \n
  • \n

    \n HEALTHY-The container health check has passed\n\t\t\t\t\tsuccessfully.

    \n
  • \n
  • \n

    \n UNHEALTHY-The container health check has failed.

    \n
  • \n
  • \n

    \n UNKNOWN-The container health check is being evaluated or\n\t\t\t\t\tthere's no container health check defined.

    \n
  • \n
\n

The following describes the possible healthStatus values for a task. The\n\t\t\tcontainer health check status of\n\t\t\tnon-essential containers don't have an effect on the health status of a task.

\n
    \n
  • \n

    \n HEALTHY-All essential containers within the task have\n\t\t\t\t\tpassed their health checks.

    \n
  • \n
  • \n

    \n UNHEALTHY-One or more essential containers have failed\n\t\t\t\t\ttheir health check.

    \n
  • \n
  • \n

    \n UNKNOWN-The essential containers within the task are still\n\t\t\t\t\thaving their health checks evaluated, there are only nonessential containers\n\t\t\t\t\twith health checks defined, or there are no container health checks\n\t\t\t\t\tdefined.

    \n
  • \n
\n

If a task is run manually, and not as part of a service, the task will continue its\n\t\t\tlifecycle regardless of its health status. For tasks that are part of a service, if the\n\t\t\ttask reports as unhealthy then the task will be stopped and the service scheduler will\n\t\t\treplace it.

\n

The following are notes about container health check support:

\n
    \n
  • \n

    Container health checks require version 1.17.0 or greater of the Amazon ECS\n\t\t\t\t\tcontainer agent. For more information, see Updating the\n\t\t\t\t\t\tAmazon ECS container agent.

    \n
  • \n
  • \n

    Container health checks are supported for Fargate tasks if\n\t\t\t\t\tyou're using platform version 1.1.0 or greater. For more\n\t\t\t\t\tinformation, see Fargate\n\t\t\t\t\t\tplatform versions.

    \n
  • \n
  • \n

    Container health checks aren't supported for tasks that are part of a service\n\t\t\t\t\tthat's configured to use a Classic Load Balancer.

    \n
  • \n
" + "smithy.api#documentation": "

An object representing a container health check. Health check parameters that are\n\t\t\tspecified in a container definition override any Docker health checks that exist in the\n\t\t\tcontainer image (such as those specified in a parent image or from the image's\n\t\t\tDockerfile). This configuration maps to the HEALTHCHECK parameter of docker run.

\n \n

The Amazon ECS container agent only monitors and reports on the health checks specified\n\t\t\t\tin the task definition. Amazon ECS does not monitor Docker health checks that are\n\t\t\t\tembedded in a container image and not specified in the container definition. Health\n\t\t\t\tcheck parameters that are specified in a container definition override any Docker\n\t\t\t\thealth checks that exist in the container image.

\n
\n

You can view the health status of both individual containers and a task with the\n\t\t\tDescribeTasks API operation or when viewing the task details in the console.

\n

The health check is designed to make sure that your containers survive agent restarts,\n\t\t\tupgrades, or temporary unavailability.

\n

The following describes the possible healthStatus values for a\n\t\t\tcontainer:

\n
    \n
  • \n

    \n HEALTHY-The container health check has passed\n\t\t\t\t\tsuccessfully.

    \n
  • \n
  • \n

    \n UNHEALTHY-The container health check has failed.

    \n
  • \n
  • \n

    \n UNKNOWN-The container health check is being evaluated,\n\t\t\t\t\tthere's no container health check defined, or Amazon ECS doesn't have the health\n\t\t\t\t\tstatus of the container.

    \n
  • \n
\n

The following describes the possible healthStatus values based on the\n\t\t\tcontainer health checker status of essential containers in the task with the following\n\t\t\tpriority order (high to low):

\n
    \n
  • \n

    \n UNHEALTHY-One or more essential containers have failed\n\t\t\t\t\ttheir health check.

    \n
  • \n
  • \n

    \n UNKNOWN-Any essential container running within the task is\n\t\t\t\t\tin an UNKNOWN state and no other essential containers have an\n\t\t\t\t\t\tUNHEALTHY state.

    \n
  • \n
  • \n

    \n HEALTHY-All essential containers within the task have\n\t\t\t\t\tpassed their health checks.

    \n
  • \n
\n

Consider the following task health example with 2 containers.

\n
    \n
  • \n

    If Container1 is UNHEALTHY and Container2 is\n\t\t\t\t\tUNKNOWN, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is UNHEALTHY and Container2 is\n\t\t\t\t\tHEALTHY, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is UNKNOWN,\n\t\t\t\t\tthe task health is UNKNOWN.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is HEALTHY,\n\t\t\t\t\tthe task health is HEALTHY.

    \n
  • \n
\n

Consider the following task health example with 3 containers.

\n
    \n
  • \n

    If Container1 is UNHEALTHY and Container2 is UNKNOWN, and Container3\n\t\t\t\t\tis UNKNOWN, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is UNHEALTHY and Container2 is UNKNOWN, and Container3\n\t\t\t\t\tis HEALTHY, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is UNHEALTHY and Container2 is HEALTHY, and Container3\n\t\t\t\t\tis HEALTHY, the task health is UNHEALTHY.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is UNKNOWN, and Container3\n\t\t\t\t\tis HEALTHY, the task health is UNKNOWN.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is UNKNOWN,\n\t\t\t\t\tand Container3 is UNKNOWN, the task health is\n\t\t\t\t\tUNKNOWN.

    \n
  • \n
  • \n

    If Container1 is HEALTHY and Container2 is HEALTHY,\n\t\t\t\t\tand Container3 is HEALTHY, the task health is\n\t\t\t\t\tHEALTHY.

    \n
  • \n
\n

If a task is run manually, and not as part of a service, the task will continue its\n\t\t\tlifecycle regardless of its health status. For tasks that are part of a service, if the\n\t\t\ttask reports as unhealthy then the task will be stopped and the service scheduler will\n\t\t\treplace it.

\n

The following are notes about container health check support:

\n
    \n
  • \n

    When the Amazon ECS agent cannot connect to the Amazon ECS service, the service reports\n\t\t\t\t\tthe container as UNHEALTHY.

    \n
  • \n
  • \n

    The health check statuses are the \"last heard from\" response from the Amazon ECS\n\t\t\t\t\tagent. There are no assumptions made about the status of the container health\n\t\t\t\t\tchecks.

    \n
  • \n
  • \n

    Container health checks require version 1.17.0 or greater of the Amazon ECS\n\t\t\t\t\tcontainer agent. For more information, see Updating the\n\t\t\t\t\t\tAmazon ECS container agent.

    \n
  • \n
  • \n

    Container health checks are supported for Fargate tasks if\n\t\t\t\t\tyou're using platform version 1.1.0 or greater. For more\n\t\t\t\t\tinformation, see Fargate\n\t\t\t\t\t\tplatform versions.

    \n
  • \n
  • \n

    Container health checks aren't supported for tasks that are part of a service\n\t\t\t\t\tthat's configured to use a Classic Load Balancer.

    \n
  • \n
" } }, "com.amazonaws.ecs#HealthStatus": { @@ -6059,6 +6438,34 @@ ], "traits": { "smithy.api#documentation": "

Lists the account settings for a specified principal.

", + "smithy.api#examples": [ + { + "title": "To view your effective account settings", + "documentation": "This example displays the effective account settings for your account.", + "input": { + "effectiveSettings": true + }, + "output": { + "settings": [ + { + "name": "containerInstanceLongArnFormat", + "value": "disabled", + "principalArn": "arn:aws:iam:::user/principalName" + }, + { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + }, + { + "name": "taskLongArnFormat", + "value": "disabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6245,6 +6652,18 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of existing clusters.

", + "smithy.api#examples": [ + { + "title": "To list your available clusters", + "documentation": "This example lists all of your available clusters in your default region.", + "output": { + "clusterArns": [ + "arn:aws:ecs:us-east-1::cluster/test", + "arn:aws:ecs:us-east-1::cluster/default" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6317,6 +6736,21 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of container instances in a specified cluster. You can filter the\n\t\t\tresults of a ListContainerInstances operation with cluster query language\n\t\t\tstatements inside the filter parameter. For more information, see Cluster Query Language in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To list your available container instances in a cluster", + "documentation": "This example lists all of your available container instances in the specified cluster in your default region.", + "input": { + "cluster": "default" + }, + "output": { + "containerInstanceArns": [ + "arn:aws:ecs:us-east-1::container-instance/default/f6bbb147-5370-4ace-8c73-c7181ded911f", + "arn:aws:ecs:us-east-1::container-instance/default/ffe3d344-77e2-476c-a4d0-bf560ad50acb" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6407,6 +6841,17 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of services. You can filter the results by cluster, launch type, and\n\t\t\tscheduling strategy.

", + "smithy.api#examples": [ + { + "title": "To list the services in a cluster", + "documentation": "This example lists the services running in the default cluster for an account.", + "output": { + "serviceArns": [ + "arn:aws:ecs:us-east-1:012345678910:service/default/my-http-service" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6575,7 +7020,24 @@ } ], "traits": { - "smithy.api#documentation": "

List the tags for an Amazon ECS resource.

" + "smithy.api#documentation": "

List the tags for an Amazon ECS resource.

", + "smithy.api#examples": [ + { + "title": "To list the tags for a cluster.", + "documentation": "This example lists the tags for the 'dev' cluster.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev" + }, + "output": { + "tags": [ + { + "key": "team", + "value": "dev" + } + ] + } + } + ] } }, "com.amazonaws.ecs#ListTagsForResourceRequest": { @@ -6628,6 +7090,20 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of task definition families that are registered to your account. This\n\t\t\tlist includes task definition families that no longer have any ACTIVE task\n\t\t\tdefinition revisions.

\n

You can filter out task definition families that don't contain any ACTIVE\n\t\t\ttask definition revisions by setting the status parameter to\n\t\t\t\tACTIVE. You can also filter the results with the\n\t\t\t\tfamilyPrefix parameter.

", + "smithy.api#examples": [ + { + "title": "To list your registered task definition families", + "documentation": "This example lists all of your registered task definition families.", + "output": { + "families": [ + "node-js-app", + "web-timer", + "hpcc", + "hpcc-c4-8xlarge" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6709,6 +7185,22 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of task definitions that are registered to your account. You can filter\n\t\t\tthe results by family name with the familyPrefix parameter or by status\n\t\t\twith the status parameter.

", + "smithy.api#examples": [ + { + "title": "To list your registered task definitions", + "documentation": "This example lists all of your registered task definitions.", + "output": { + "taskDefinitionArns": [ + "arn:aws:ecs:us-east-1::task-definition/sleep300:2", + "arn:aws:ecs:us-east-1::task-definition/sleep360:1", + "arn:aws:ecs:us-east-1::task-definition/wordpress:3", + "arn:aws:ecs:us-east-1::task-definition/wordpress:4", + "arn:aws:ecs:us-east-1::task-definition/wordpress:5", + "arn:aws:ecs:us-east-1::task-definition/wordpress:6" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6801,7 +7293,22 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a list of tasks. You can filter the results by cluster, task definition\n\t\t\tfamily, container instance, launch type, what IAM principal started the task, or by the\n\t\t\tdesired status of the task.

\n

Recently stopped tasks might appear in the returned results. Currently, stopped tasks\n\t\t\tappear in the returned results for at least one hour.

", + "smithy.api#documentation": "

Returns a list of tasks. You can filter the results by cluster, task definition\n\t\t\tfamily, container instance, launch type, what IAM principal started the task, or by the\n\t\t\tdesired status of the task.

\n

Recently stopped tasks might appear in the returned results.

", + "smithy.api#examples": [ + { + "title": "To list the tasks in a cluster", + "documentation": "This example lists all of the tasks in a cluster.", + "input": { + "cluster": "default" + }, + "output": { + "taskArns": [ + "arn:aws:ecs:us-east-1:012345678910:task/default/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84", + "arn:aws:ecs:us-east-1:012345678910:task/default/6b809ef6-c67e-4467-921f-ee261c15a0a1" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "nextToken", "outputToken": "nextToken", @@ -6898,13 +7405,13 @@ "targetGroupArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or\n\t\t\ttask set.

\n

A target group ARN is only specified when using an Application Load Balancer or Network Load Balancer. If you're using a\n\t\t\tClassic Load Balancer, omit the target group ARN.

\n

For services using the ECS deployment controller, you can specify one or\n\t\t\tmultiple target groups. For more information, see Registering multiple target groups with a service in\n\t\t\tthe Amazon Elastic Container Service Developer Guide.

\n

For services using the CODE_DEPLOY deployment controller, you're required\n\t\t\tto define two target groups for the load balancer. For more information, see Blue/green deployment with CodeDeploy in the\n\t\t\tAmazon Elastic Container Service Developer Guide.

\n \n

If your service's task definition uses the awsvpc network mode, you\n\t\t\t\tmust choose ip as the target type, not instance. Do this\n\t\t\t\twhen creating your target groups because tasks that use the awsvpc\n\t\t\t\tnetwork mode are associated with an elastic network interface, not an Amazon EC2\n\t\t\t\tinstance. This network mode is required for the Fargate launch\n\t\t\t\ttype.

\n
" + "smithy.api#documentation": "

The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or\n\t\t\ttask set.

\n

A target group ARN is only specified when using an Application Load Balancer or Network Load Balancer.

\n

For services using the ECS deployment controller, you can specify one or\n\t\t\tmultiple target groups. For more information, see Registering multiple target groups with a service in\n\t\t\tthe Amazon Elastic Container Service Developer Guide.

\n

For services using the CODE_DEPLOY deployment controller, you're required\n\t\t\tto define two target groups for the load balancer. For more information, see Blue/green deployment with CodeDeploy in the\n\t\t\tAmazon Elastic Container Service Developer Guide.

\n \n

If your service's task definition uses the awsvpc network mode, you\n\t\t\t\tmust choose ip as the target type, not instance. Do this\n\t\t\t\twhen creating your target groups because tasks that use the awsvpc\n\t\t\t\tnetwork mode are associated with an elastic network interface, not an Amazon EC2\n\t\t\t\tinstance. This network mode is required for the Fargate launch\n\t\t\t\ttype.

\n
" } }, "loadBalancerName": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The name of the load balancer to associate with the Amazon ECS service or task set.

\n

A load balancer name is only specified when using a Classic Load Balancer. If you are using an Application Load Balancer\n\t\t\tor a Network Load Balancer the load balancer name parameter should be omitted.

" + "smithy.api#documentation": "

The name of the load balancer to associate with the Amazon ECS service or task set.

\n

If you are using an Application Load Balancer or a Network Load Balancer the load balancer name parameter should be\n\t\t\tomitted.

" } }, "containerName": { @@ -6954,7 +7461,7 @@ } }, "traits": { - "smithy.api#documentation": "

The log configuration for the container. This parameter maps to LogConfig\n\t\t\tin the Create a container section of the Docker Remote API and the\n\t\t\t\t--log-driver option to \n docker\n\t\t\t\t\trun\n .

\n

By default, containers use the same logging driver that the Docker daemon uses.\n\t\t\tHowever, the container might use a different logging driver than the Docker daemon by\n\t\t\tspecifying a log driver configuration in the container definition. For more information\n\t\t\tabout the options for different supported log drivers, see Configure logging\n\t\t\t\tdrivers in the Docker documentation.

\n

Understand the following when specifying a log configuration for your\n\t\t\tcontainers.

\n
    \n
  • \n

    Amazon ECS currently supports a subset of the logging drivers available to the\n\t\t\t\t\tDocker daemon (shown in the valid values below). Additional log drivers may be\n\t\t\t\t\tavailable in future releases of the Amazon ECS container agent.

    \n
  • \n
  • \n

    This parameter requires version 1.18 of the Docker Remote API or greater on\n\t\t\t\t\tyour container instance.

    \n
  • \n
  • \n

    For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must\n\t\t\t\t\tregister the available logging drivers with the\n\t\t\t\t\t\tECS_AVAILABLE_LOGGING_DRIVERS environment variable before\n\t\t\t\t\tcontainers placed on that instance can use these log configuration options. For\n\t\t\t\t\tmore information, see Amazon ECS container agent configuration in the\n\t\t\t\t\tAmazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    For tasks that are on Fargate, because you don't have access to the\n\t\t\t\t\tunderlying infrastructure your tasks are hosted on, any additional software\n\t\t\t\t\tneeded must be installed outside of the task. For example, the Fluentd output\n\t\t\t\t\taggregators or a remote host running Logstash to send Gelf logs to.

    \n
  • \n
" + "smithy.api#documentation": "

The log configuration for the container. This parameter maps to LogConfig\n\t\t\tin the Create a container section of the Docker Remote API and the\n\t\t\t\t--log-driver option to \n docker\n\t\t\t\t\trun\n .

\n

By default, containers use the same logging driver that the Docker daemon uses.\n\t\t\tHowever, the container might use a different logging driver than the Docker daemon by\n\t\t\tspecifying a log driver configuration in the container definition. For more information\n\t\t\tabout the options for different supported log drivers, see Configure logging\n\t\t\t\tdrivers in the Docker documentation.

\n

Understand the following when specifying a log configuration for your\n\t\t\tcontainers.

\n
    \n
  • \n

    Amazon ECS currently supports a subset of the logging drivers available to the Docker daemon.\n\t\t\t\t\tAdditional log drivers may be available in future releases of the Amazon ECS\n\t\t\t\t\tcontainer agent.

    \n

    For tasks on Fargate, the supported log drivers are awslogs,\n\t\t\t\t\t\tsplunk, and awsfirelens.

    \n

    For tasks hosted on Amazon EC2 instances, the supported log drivers are\n\t\t\t\t\t\tawslogs, fluentd, gelf,\n\t\t\t\t\t\tjson-file, journald,\n\t\t\t\t\t\tlogentries,syslog, splunk, and\n\t\t\t\t\t\tawsfirelens.

    \n
  • \n
  • \n

    This parameter requires version 1.18 of the Docker Remote API or greater on\n\t\t\t\t\tyour container instance.

    \n
  • \n
  • \n

    For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must\n\t\t\t\t\tregister the available logging drivers with the\n\t\t\t\t\t\tECS_AVAILABLE_LOGGING_DRIVERS environment variable before\n\t\t\t\t\tcontainers placed on that instance can use these log configuration options. For\n\t\t\t\t\tmore information, see Amazon ECS container agent configuration in the\n\t\t\t\t\tAmazon Elastic Container Service Developer Guide.

    \n
  • \n
  • \n

    For tasks that are on Fargate, because you don't have access to the\n\t\t\t\t\tunderlying infrastructure your tasks are hosted on, any additional software\n\t\t\t\t\tneeded must be installed outside of the task. For example, the Fluentd output\n\t\t\t\t\taggregators or a remote host running Logstash to send Gelf logs to.

    \n
  • \n
" } }, "com.amazonaws.ecs#LogConfigurationOptionsMap": { @@ -7139,7 +7646,7 @@ "maximumScalingStepSize": { "target": "com.amazonaws.ecs#ManagedScalingStepSize", "traits": { - "smithy.api#documentation": "

The maximum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale\n\t\t\tin process is not affected by this parameter. If this parameter is omitted, the default\n\t\t\tvalue of 1 is used.

" + "smithy.api#documentation": "

The maximum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale in\n\t\t\tprocess is not affected by this parameter. If this parameter is omitted, the default\n\t\t\tvalue of 10000 is used.

" } }, "instanceWarmupPeriod": { @@ -7300,7 +7807,7 @@ "containerPortRange": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The port number range on the container that's bound to the dynamically mapped host port\n\t\t\trange.

\n

The following rules apply when you specify a containerPortRange:

\n
    \n
  • \n

    You must use either the bridge network mode or the awsvpc\n\t\t\t\t\tnetwork mode.

    \n
  • \n
  • \n

    This parameter is available for both the EC2 and Fargate launch types.

    \n
  • \n
  • \n

    This parameter is available for both the Linux and Windows operating systems.

    \n
  • \n
  • \n

    The container instance must have at least version 1.67.0 of the container agent\n\t\t\t\t\tand at least version 1.67.0-1 of the ecs-init package

    \n
  • \n
  • \n

    You can specify a maximum of 100 port ranges per container.

    \n
  • \n
  • \n

    You do not specify a hostPortRange. The value of the hostPortRange is set\n\t\t\t\t\tas follows:

    \n
      \n
    • \n

      For containers in a task with the awsvpc network mode,\n\t\t\t\t\t\t\tthe hostPort is set to the same value as the\n\t\t\t\t\t\t\t\tcontainerPort. This is a static mapping\n\t\t\t\t\t\t\tstrategy.

      \n
    • \n
    • \n

      For containers in a task with the bridge network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.

      \n
    • \n
    \n
  • \n
  • \n

    The containerPortRange valid values are between 1 and\n\t\t\t\t\t65535.

    \n
  • \n
  • \n

    A port can only be included in one port mapping per container.

    \n
  • \n
  • \n

    You cannot specify overlapping port ranges.

    \n
  • \n
  • \n

    The first port in the range must be less than last port in the range.

    \n
  • \n
  • \n

    Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.

    \n

    For more information, see Issue #11185 on the Github website.

    \n

    For information about how to turn off the docker-proxy in the Docker daemon config file, see Docker daemon in the Amazon ECS Developer Guide.

    \n
  • \n
\n

You can call \n DescribeTasks\n to view the hostPortRange which\n\t\t\tare the host ports that are bound to the container ports.

" + "smithy.api#documentation": "

The port number range on the container that's bound to the dynamically mapped host port\n\t\t\trange.

\n

The following rules apply when you specify a containerPortRange:

\n
    \n
  • \n

    You must use either the bridge network mode or the awsvpc\n\t\t\t\t\tnetwork mode.

    \n
  • \n
  • \n

    This parameter is available for both the EC2 and Fargate launch types.

    \n
  • \n
  • \n

    This parameter is available for both the Linux and Windows operating systems.

    \n
  • \n
  • \n

    The container instance must have at least version 1.67.0 of the container agent\n\t\t\t\t\tand at least version 1.67.0-1 of the ecs-init package

    \n
  • \n
  • \n

    You can specify a maximum of 100 port ranges per container.

    \n
  • \n
  • \n

    You do not specify a hostPortRange. The value of the hostPortRange is set\n\t\t\t\t\tas follows:

    \n
      \n
    • \n

      For containers in a task with the awsvpc network mode,\n\t\t\t\t\t\t\tthe hostPortRange is set to the same value as the\n\t\t\t\t\t\t\t\tcontainerPortRange. This is a static mapping\n\t\t\t\t\t\t\tstrategy.

      \n
    • \n
    • \n

      For containers in a task with the bridge network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.

      \n
    • \n
    \n
  • \n
  • \n

    The containerPortRange valid values are between 1 and\n\t\t\t\t\t65535.

    \n
  • \n
  • \n

    A port can only be included in one port mapping per container.

    \n
  • \n
  • \n

    You cannot specify overlapping port ranges.

    \n
  • \n
  • \n

    The first port in the range must be less than last port in the range.

    \n
  • \n
  • \n

    Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.

    \n

    For more information, see Issue #11185 on the Github website.

    \n

    For information about how to turn off the docker-proxy in the Docker daemon config file, see Docker daemon in the Amazon ECS Developer Guide.

    \n
  • \n
\n

You can call \n DescribeTasks\n to view the hostPortRange which\n\t\t\tare the host ports that are bound to the container ports.

" } }, "hostPortRange": { @@ -7644,7 +8151,7 @@ "hostPort": { "target": "com.amazonaws.ecs#BoxedInteger", "traits": { - "smithy.api#documentation": "

The port number on the container instance to reserve for your container.

\n

If you specify a containerPortRange, leave this field empty and the value of\n\t\t\tthe hostPort is set as follows:

\n
    \n
  • \n

    For containers in a task with the awsvpc network mode, the\n\t\t\t\t\t\thostPort is set to the same value as the\n\t\t\t\t\t\tcontainerPort. This is a static mapping strategy.

    \n
  • \n
  • \n

    For containers in a task with the bridge network mode, the Amazon ECS agent finds\n\t\t\t\t\topen ports on the host and automatically binds them to the container ports. This\n\t\t\t\t\tis a dynamic mapping strategy.

    \n
  • \n
\n

If you use containers in a task with the awsvpc or host\n\t\t\tnetwork mode, the hostPort can either be left blank or set to the same\n\t\t\tvalue as the containerPort.

\n

If you use containers in a task with the bridge network mode, you can\n\t\t\tspecify a non-reserved host port for your container port mapping, or you can omit the\n\t\t\t\thostPort (or set it to 0) while specifying a\n\t\t\t\tcontainerPort and your container automatically receives a port in the\n\t\t\tephemeral port range for your container instance operating system and Docker\n\t\t\tversion.

\n

The default ephemeral port range for Docker version 1.6.0 and later is listed on the\n\t\t\tinstance under /proc/sys/net/ipv4/ip_local_port_range. If this kernel\n\t\t\tparameter is unavailable, the default ephemeral port range from 49153 through 65535 is\n\t\t\tused. Do not attempt to specify a host port in the ephemeral port range as these are\n\t\t\treserved for automatic assignment. In general, ports below 32768 are outside of the\n\t\t\tephemeral port range.

\n

The default reserved ports are 22 for SSH, the Docker ports 2375 and 2376, and the\n\t\t\tAmazon ECS container agent ports 51678-51680. Any host port that was previously specified in\n\t\t\ta running task is also reserved while the task is running. That is, after a task stops,\n\t\t\tthe host port is released. The current reserved ports are displayed in the\n\t\t\tremainingResources of DescribeContainerInstances\n\t\t\toutput. A container instance can have up to 100 reserved ports at a time. This number\n\t\t\tincludes the default reserved ports. Automatically assigned ports aren't included in the\n\t\t\t100 reserved ports quota.

" + "smithy.api#documentation": "

The port number on the container instance to reserve for your container.

\n

If you specify a containerPortRange, leave this field empty and the value of\n\t\t\tthe hostPort is set as follows:

\n
    \n
  • \n

    For containers in a task with the awsvpc network mode, the\n\t\t\t\t\t\thostPort is set to the same value as the\n\t\t\t\t\t\tcontainerPort. This is a static mapping strategy.

    \n
  • \n
  • \n

    For containers in a task with the bridge network mode, the Amazon ECS agent finds\n\t\t\t\t\topen ports on the host and automatically binds them to the container ports. This\n\t\t\t\t\tis a dynamic mapping strategy.

    \n
  • \n
\n

If you use containers in a task with the awsvpc or host\n\t\t\tnetwork mode, the hostPort can either be left blank or set to the same\n\t\t\tvalue as the containerPort.

\n

If you use containers in a task with the bridge network mode, you can\n\t\t\tspecify a non-reserved host port for your container port mapping, or you can omit the\n\t\t\t\thostPort (or set it to 0) while specifying a\n\t\t\t\tcontainerPort and your container automatically receives a port in the\n\t\t\tephemeral port range for your container instance operating system and Docker\n\t\t\tversion.

\n

The default ephemeral port range for Docker version 1.6.0 and later is listed on the\n\t\t\tinstance under /proc/sys/net/ipv4/ip_local_port_range. If this kernel\n\t\t\tparameter is unavailable, the default ephemeral port range from 49153 through 65535\n\t\t\t(Linux) or 49152 through 65535 (Windows) is used. Do not attempt to specify a host port\n\t\t\tin the ephemeral port range as these are reserved for automatic assignment. In general,\n\t\t\tports below 32768 are outside of the ephemeral port range.

\n

The default reserved ports are 22 for SSH, the Docker ports 2375 and 2376, and the\n\t\t\tAmazon ECS container agent ports 51678-51680. Any host port that was previously specified in\n\t\t\ta running task is also reserved while the task is running. That is, after a task stops,\n\t\t\tthe host port is released. The current reserved ports are displayed in the\n\t\t\tremainingResources of DescribeContainerInstances\n\t\t\toutput. A container instance can have up to 100 reserved ports at a time. This number\n\t\t\tincludes the default reserved ports. Automatically assigned ports aren't included in the\n\t\t\t100 reserved ports quota.

" } }, "protocol": { @@ -7668,7 +8175,7 @@ "containerPortRange": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The port number range on the container that's bound to the dynamically mapped host port\n\t\t\trange.

\n

The following rules apply when you specify a containerPortRange:

\n
    \n
  • \n

    You must use either the bridge network mode or the awsvpc\n\t\t\t\t\tnetwork mode.

    \n
  • \n
  • \n

    This parameter is available for both the EC2 and Fargate launch types.

    \n
  • \n
  • \n

    This parameter is available for both the Linux and Windows operating systems.

    \n
  • \n
  • \n

    The container instance must have at least version 1.67.0 of the container agent\n\t\t\t\t\tand at least version 1.67.0-1 of the ecs-init package

    \n
  • \n
  • \n

    You can specify a maximum of 100 port ranges per container.

    \n
  • \n
  • \n

    You do not specify a hostPortRange. The value of the hostPortRange is set\n\t\t\t\t\tas follows:

    \n
      \n
    • \n

      For containers in a task with the awsvpc network mode,\n\t\t\t\t\t\t\tthe hostPort is set to the same value as the\n\t\t\t\t\t\t\t\tcontainerPort. This is a static mapping\n\t\t\t\t\t\t\tstrategy.

      \n
    • \n
    • \n

      For containers in a task with the bridge network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.

      \n
    • \n
    \n
  • \n
  • \n

    The containerPortRange valid values are between 1 and\n\t\t\t\t\t65535.

    \n
  • \n
  • \n

    A port can only be included in one port mapping per container.

    \n
  • \n
  • \n

    You cannot specify overlapping port ranges.

    \n
  • \n
  • \n

    The first port in the range must be less than last port in the range.

    \n
  • \n
  • \n

    Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.

    \n

    For more information, see Issue #11185 on the Github website.

    \n

    For information about how to turn off the docker-proxy in the Docker daemon config file, see Docker daemon in the Amazon ECS Developer Guide.

    \n
  • \n
\n

You can call \n DescribeTasks\n to view the hostPortRange which\n\t\t\tare the host ports that are bound to the container ports.

" + "smithy.api#documentation": "

The port number range on the container that's bound to the dynamically mapped host port\n\t\t\trange.

\n

The following rules apply when you specify a containerPortRange:

\n
    \n
  • \n

    You must use either the bridge network mode or the awsvpc\n\t\t\t\t\tnetwork mode.

    \n
  • \n
  • \n

    This parameter is available for both the EC2 and Fargate launch types.

    \n
  • \n
  • \n

    This parameter is available for both the Linux and Windows operating systems.

    \n
  • \n
  • \n

    The container instance must have at least version 1.67.0 of the container agent\n\t\t\t\t\tand at least version 1.67.0-1 of the ecs-init package

    \n
  • \n
  • \n

    You can specify a maximum of 100 port ranges per container.

    \n
  • \n
  • \n

    You do not specify a hostPortRange. The value of the hostPortRange is set\n\t\t\t\t\tas follows:

    \n
      \n
    • \n

      For containers in a task with the awsvpc network mode,\n\t\t\t\t\t\t\tthe hostPortRange is set to the same value as the\n\t\t\t\t\t\t\t\tcontainerPortRange. This is a static mapping\n\t\t\t\t\t\t\tstrategy.

      \n
    • \n
    • \n

      For containers in a task with the bridge network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.

      \n
    • \n
    \n
  • \n
  • \n

    The containerPortRange valid values are between 1 and\n\t\t\t\t\t65535.

    \n
  • \n
  • \n

    A port can only be included in one port mapping per container.

    \n
  • \n
  • \n

    You cannot specify overlapping port ranges.

    \n
  • \n
  • \n

    The first port in the range must be less than last port in the range.

    \n
  • \n
  • \n

    Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.

    \n

    For more information, see Issue #11185 on the Github website.

    \n

    For information about how to turn off the docker-proxy in the Docker daemon config file, see Docker daemon in the Amazon ECS Developer Guide.

    \n
  • \n
\n

You can call \n DescribeTasks\n to view the hostPortRange which\n\t\t\tare the host ports that are bound to the container ports.

" } } }, @@ -7811,7 +8318,24 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies an account setting. Account settings are set on a per-Region basis.

\n

If you change the root user account setting, the default settings are reset for users\n\t\t\tand roles that do not have specified individual account settings. For more information,\n\t\t\tsee Account\n\t\t\t\tSettings in the Amazon Elastic Container Service Developer Guide.

\n

When serviceLongArnFormat, taskLongArnFormat, or\n\t\t\t\tcontainerInstanceLongArnFormat are specified, the Amazon Resource Name\n\t\t\t(ARN) and resource ID format of the resource type for a specified user, role, or\n\t\t\tthe root user for an account is affected. The opt-in and opt-out account setting must be\n\t\t\tset for each Amazon ECS resource separately. The ARN and resource ID format of a resource\n\t\t\tis defined by the opt-in status of the user or role that created the resource. You\n\t\t\tmust turn on this setting to use Amazon ECS features such as resource tagging.

\n

When awsvpcTrunking is specified, the elastic network interface (ENI)\n\t\t\tlimit for any new container instances that support the feature is changed. If\n\t\t\t\tawsvpcTrunking is turned on, any new container instances that support the\n\t\t\tfeature are launched have the increased ENI limits available to them. For more\n\t\t\tinformation, see Elastic Network\n\t\t\t\tInterface Trunking in the Amazon Elastic Container Service Developer Guide.

\n

When containerInsights is specified, the default setting indicating whether\n\t\t\tAmazon Web Services CloudWatch Container Insights is turned on for your clusters is changed. If\n\t\t\t\tcontainerInsights is turned on, any new clusters that are created will\n\t\t\thave Container Insights turned on unless you disable it during cluster creation. For\n\t\t\tmore information, see CloudWatch\n\t\t\t\tContainer Insights in the Amazon Elastic Container Service Developer Guide.

\n

Amazon ECS is introducing tagging authorization for resource creation. Users must have\n\t\t\tpermissions for actions that create the resource, such as ecsCreateCluster.\n\t\t\tIf tags are specified when you create a resource, Amazon Web Services performs additional\n\t\t\tauthorization to verify if users or roles have permissions to create tags. Therefore,\n\t\t\tyou must grant explicit permissions to use the ecs:TagResource action. For\n\t\t\tmore information, see Grant\n\t\t\t\tpermission to tag resources on creation in the Amazon ECS Developer\n\t\t\t\t\tGuide.

" + "smithy.api#documentation": "

Modifies an account setting. Account settings are set on a per-Region basis.

\n

If you change the root user account setting, the default settings are reset for users\n\t\t\tand roles that do not have specified individual account settings. For more information,\n\t\t\tsee Account\n\t\t\t\tSettings in the Amazon Elastic Container Service Developer Guide.

\n

When you specify serviceLongArnFormat, taskLongArnFormat, or\n\t\t\t\tcontainerInstanceLongArnFormat, the Amazon Resource Name (ARN) and\n\t\t\tresource ID format of the resource type for a specified user, role, or the root user for an\n\t\t\taccount is affected. The opt-in and opt-out account setting must be set for each Amazon ECS\n\t\t\tresource separately. The ARN and resource ID format of a resource is defined by the\n\t\t\topt-in status of the user or role that created the resource. You must turn on this\n\t\t\tsetting to use Amazon ECS features such as resource tagging.

\n

When you specify awsvpcTrunking, the elastic network interface (ENI) limit for\n\t\t\tany new container instances that support the feature is changed. If\n\t\t\t\tawsvpcTrunking is turned on, any new container instances that support\n\t\t\tthe feature are launched have the increased ENI limits available to them. For more\n\t\t\tinformation, see Elastic Network\n\t\t\t\tInterface Trunking in the Amazon Elastic Container Service Developer Guide.

\n

When you specify containerInsights, the default setting indicating whether\n\t\t\tAmazon Web Services CloudWatch Container Insights is turned on for your clusters is changed. If\n\t\t\t\tcontainerInsights is turned on, any new clusters that are created will\n\t\t\thave Container Insights turned on unless you disable it during cluster creation. For\n\t\t\tmore information, see CloudWatch\n\t\t\t\tContainer Insights in the Amazon Elastic Container Service Developer Guide.

\n

Amazon ECS is introducing tagging authorization for resource creation. Users must have\n\t\t\tpermissions for actions that create the resource, such as ecsCreateCluster.\n\t\t\tIf tags are specified when you create a resource, Amazon Web Services performs additional\n\t\t\tauthorization to verify if users or roles have permissions to create tags. Therefore,\n\t\t\tyou must grant explicit permissions to use the ecs:TagResource action. For\n\t\t\tmore information, see Grant\n\t\t\t\tpermission to tag resources on creation in the Amazon ECS Developer\n\t\t\t\t\tGuide.

\n

When Amazon Web Services determines that a security or infrastructure update is needed for an Amazon ECS\n\t\t\ttask hosted on Fargate, the tasks need to be stopped and new tasks launched to replace\n\t\t\tthem. Use fargateTaskRetirementWaitPeriod to configure the wait time to\n\t\t\tretire a Fargate task. For information about the Fargate tasks maintenance, see Amazon Web Services Fargate task maintenance in the Amazon ECS Developer\n\t\t\t\t\tGuide.

", + "smithy.api#examples": [ + { + "title": "To modify your account settings", + "documentation": "This example modifies your account settings to opt in to the new ARN and resource ID format for Amazon ECS services. If you’re using this command as the root user, then changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.", + "input": { + "name": "serviceLongArnFormat", + "value": "enabled" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::user/principalName" + } + } + } + ] } }, "com.amazonaws.ecs#PutAccountSettingDefault": { @@ -7834,7 +8358,24 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies an account setting for all users on an account for whom no individual\n\t\t\taccount setting has been specified. Account settings are set on a per-Region\n\t\t\tbasis.

" + "smithy.api#documentation": "

Modifies an account setting for all users on an account for whom no individual\n\t\t\taccount setting has been specified. Account settings are set on a per-Region\n\t\t\tbasis.

", + "smithy.api#examples": [ + { + "title": "To modify the default account settings for all IAM users or roles on an account", + "documentation": "This example modifies the default account setting for the specified resource for all IAM users or roles on an account. These changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.", + "input": { + "name": "serviceLongArnFormat", + "value": "enabled" + }, + "output": { + "setting": { + "name": "serviceLongArnFormat", + "value": "enabled", + "principalArn": "arn:aws:iam:::root" + } + } + } + ] } }, "com.amazonaws.ecs#PutAccountSettingDefaultRequest": { @@ -7843,14 +8384,14 @@ "name": { "target": "com.amazonaws.ecs#SettingName", "traits": { - "smithy.api#documentation": "

The resource name for which to modify the account setting. If\n\t\t\t\tserviceLongArnFormat is specified, the ARN for your Amazon ECS services is\n\t\t\taffected. If taskLongArnFormat is specified, the ARN and resource ID for\n\t\t\tyour Amazon ECS tasks is affected. If containerInstanceLongArnFormat is\n\t\t\tspecified, the ARN and resource ID for your Amazon ECS container instances is affected. If\n\t\t\t\tawsvpcTrunking is specified, the ENI limit for your Amazon ECS container\n\t\t\tinstances is affected. If containerInsights is specified, the default\n\t\t\tsetting for Amazon Web Services CloudWatch Container Insights for your clusters is affected. If\n\t\t\t\ttagResourceAuthorization is specified, the opt-in option for tagging\n\t\t\tresources on creation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide.

\n

When you specify fargateFIPSMode for the name and\n\t\t\tenabled for the value, Fargate uses FIPS-140 compliant\n\t\t\tcryptographic algorithms on your tasks. For more information about FIPS-140 compliance\n\t\t\twith Fargate, see Amazon Web Services Fargate Federal Information Processing Standard (FIPS) 140-2\n\t\t\t\tcompliance in the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#documentation": "

The resource name for which to modify the account setting. If you specify\n\t\t\t\tserviceLongArnFormat, the ARN for your Amazon ECS services is affected. If\n\t\t\tyou specify taskLongArnFormat, the ARN and resource ID for your Amazon ECS\n\t\t\ttasks is affected. If you specify containerInstanceLongArnFormat, the ARN\n\t\t\tand resource ID for your Amazon ECS container instances is affected. If you specify\n\t\t\t\tawsvpcTrunking, the ENI limit for your Amazon ECS container instances is\n\t\t\taffected. If you specify containerInsights, the default setting for Amazon Web Services\n\t\t\tCloudWatch Container Insights for your clusters is affected. If you specify\n\t\t\t\ttagResourceAuthorization, the opt-in option for tagging resources on\n\t\t\tcreation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide. If you specify fargateTaskRetirementWaitPeriod, the\n\t\t\tdefault wait time to retire a Fargate task due to required maintenance is\n\t\t\taffected.

\n

When you specify fargateFIPSMode for the name and\n\t\t\tenabled for the value, Fargate uses FIPS-140 compliant\n\t\t\tcryptographic algorithms on your tasks. For more information about FIPS-140 compliance\n\t\t\twith Fargate, see Amazon Web Services Fargate Federal Information Processing Standard (FIPS) 140-2\n\t\t\t\tcompliance in the Amazon Elastic Container Service Developer Guide.

\n

When Amazon Web Services determines that a security or infrastructure update is needed for an Amazon ECS task\n\t\t\thosted on Fargate, the tasks need to be stopped and new tasks launched to replace\n\t\t\tthem. Use fargateTaskRetirementWaitPeriod to set the wait time to retire a\n\t\t\tFargate task to the default. For information about the Fargate tasks maintenance,\n\t\t\tsee Amazon Web Services Fargate task\n\t\t\t\tmaintenance in the Amazon ECS Developer Guide.

", "smithy.api#required": {} } }, "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

", + "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

\n

When you specify fargateTaskRetirementWaitPeriod for the\n\t\t\t\tname, the following are the valid values:

\n
    \n
  • \n

    \n 0 - Amazon Web Services sends the notification, and immediately retires the affected tasks.

    \n
  • \n
  • \n

    \n 7 - Amazon Web Services sends the notification, and waits 7 calendar days to retire the tasks.

    \n
  • \n
  • \n

    \n 14 - Amazon Web Services sends the notification, and waits 14 calendar days to retire the tasks.

    \n
  • \n
", "smithy.api#required": {} } } @@ -7879,21 +8420,21 @@ "name": { "target": "com.amazonaws.ecs#SettingName", "traits": { - "smithy.api#documentation": "

The Amazon ECS resource name for which to modify the account setting. If\n\t\t\t\tserviceLongArnFormat is specified, the ARN for your Amazon ECS services is\n\t\t\taffected. If taskLongArnFormat is specified, the ARN and resource ID for\n\t\t\tyour Amazon ECS tasks is affected. If containerInstanceLongArnFormat is\n\t\t\tspecified, the ARN and resource ID for your Amazon ECS container instances is affected. If\n\t\t\t\tawsvpcTrunking is specified, the elastic network interface (ENI) limit\n\t\t\tfor your Amazon ECS container instances is affected. If containerInsights is\n\t\t\tspecified, the default setting for Amazon Web Services CloudWatch Container Insights for your clusters is\n\t\t\taffected. If fargateFIPSMode is specified, Fargate FIPS 140 compliance is\n\t\t\taffected. If tagResourceAuthorization is specified, the opt-in option for\n\t\t\ttagging resources on creation is affected. For information about the opt-in timeline,\n\t\t\tsee Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\t\tGuide.

", + "smithy.api#documentation": "

The Amazon ECS resource name for which to modify the account setting. If you specify\n\t\t\t\tserviceLongArnFormat, the ARN for your Amazon ECS services is affected. If\n\t\t\tyou specify taskLongArnFormat, the ARN and resource ID for your Amazon ECS\n\t\t\ttasks is affected. If you specify containerInstanceLongArnFormat, the ARN\n\t\t\tand resource ID for your Amazon ECS container instances is affected. If you specify\n\t\t\t\tawsvpcTrunking, the elastic network interface (ENI) limit for your\n\t\t\tAmazon ECS container instances is affected. If you specify containerInsights,\n\t\t\tthe default setting for Amazon Web Services CloudWatch Container Insights for your clusters is affected. If\n\t\t\tyou specify fargateFIPSMode, Fargate FIPS 140 compliance is affected. If\n\t\t\tyou specify tagResourceAuthorization, the opt-in option for tagging\n\t\t\tresources on creation is affected. For information about the opt-in timeline, see Tagging authorization timeline in the Amazon ECS Developer\n\t\t\t\tGuide. If you specify fargateTaskRetirementWaitPeriod, the\n\t\t\twait time to retire a Fargate task is affected.

", "smithy.api#required": {} } }, "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

", + "smithy.api#documentation": "

The account setting value for the specified principal ARN. Accepted values are\n\t\t\t\tenabled, disabled, on, and\n\t\t\toff.

\n

When you specify fargateTaskRetirementWaitPeriod for the name, the\n\t\t\tfollowing are the valid values:

\n
    \n
  • \n

    \n 0 - Amazon Web Services sends the notification, and immediately retires the affected tasks.

    \n
  • \n
  • \n

    \n 7 - Amazon Web Services sends the notification, and waits 7 calendar days to retire the tasks.

    \n
  • \n
  • \n

    \n 14 - Amazon Web Services sends the notification, and waits 14 calendar days to retire the tasks.

    \n
  • \n
", "smithy.api#required": {} } }, "principalArn": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The ARN of the principal, which can be a user, role, or the root user. If\n\t\t\tyou specify the root user, it modifies the account setting for all users, roles,\n\t\t\tand the root user of the account unless a user or role explicitly overrides these\n\t\t\tsettings. If this field is omitted, the setting is changed only for the authenticated\n\t\t\tuser.

\n \n

Federated users assume the account setting of the root user and can't have\n\t\t\t\texplicit account settings set for them.

\n
" + "smithy.api#documentation": "

The ARN of the principal, which can be a user, role, or the root user. If\n\t\t\tyou specify the root user, it modifies the account setting for all users, roles,\n\t\t\tand the root user of the account unless a user or role explicitly overrides these\n\t\t\tsettings. If this field is omitted, the setting is changed only for the authenticated\n\t\t\tuser.

\n \n

You must use the root user when you set the Fargate wait time\n\t\t\t\t\t(fargateTaskRetirementWaitPeriod).

\n

Federated users assume the account setting of the root user and can't have\n\t\t\t\texplicit account settings set for them.

\n
" } } }, @@ -8170,7 +8711,56 @@ } ], "traits": { - "smithy.api#documentation": "

Registers a new task definition from the supplied family and\n\t\t\t\tcontainerDefinitions. Optionally, you can add data volumes to your\n\t\t\tcontainers with the volumes parameter. For more information about task\n\t\t\tdefinition parameters and defaults, see Amazon ECS Task\n\t\t\t\tDefinitions in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a role for your task with the taskRoleArn parameter.\n\t\t\tWhen you specify a role for a task, its containers can then use the latest versions\n\t\t\tof the CLI or SDKs to make API requests to the Amazon Web Services services that are specified in\n\t\t\tthe policy that's associated with the role. For more information, see IAM\n\t\t\t\tRoles for Tasks in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a Docker networking mode for the containers in your task definition\n\t\t\twith the networkMode parameter. The available network modes correspond to\n\t\t\tthose described in Network\n\t\t\t\tsettings in the Docker run reference. If you specify the awsvpc\n\t\t\tnetwork mode, the task is allocated an elastic network interface, and you must specify a\n\t\t\t\tNetworkConfiguration when you create a service or run a task with\n\t\t\tthe task definition. For more information, see Task Networking\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

Registers a new task definition from the supplied family and\n\t\t\t\tcontainerDefinitions. Optionally, you can add data volumes to your\n\t\t\tcontainers with the volumes parameter. For more information about task\n\t\t\tdefinition parameters and defaults, see Amazon ECS Task\n\t\t\t\tDefinitions in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a role for your task with the taskRoleArn parameter.\n\t\t\tWhen you specify a role for a task, its containers can then use the latest versions\n\t\t\tof the CLI or SDKs to make API requests to the Amazon Web Services services that are specified in\n\t\t\tthe policy that's associated with the role. For more information, see IAM\n\t\t\t\tRoles for Tasks in the Amazon Elastic Container Service Developer Guide.

\n

You can specify a Docker networking mode for the containers in your task definition\n\t\t\twith the networkMode parameter. The available network modes correspond to\n\t\t\tthose described in Network\n\t\t\t\tsettings in the Docker run reference. If you specify the awsvpc\n\t\t\tnetwork mode, the task is allocated an elastic network interface, and you must specify a\n\t\t\t\tNetworkConfiguration when you create a service or run a task with\n\t\t\tthe task definition. For more information, see Task Networking\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To register a task definition", + "documentation": "This example registers a task definition to the specified family.", + "input": { + "family": "sleep360", + "taskRoleArn": "", + "containerDefinitions": [ + { + "name": "sleep", + "image": "busybox", + "cpu": 10, + "command": [ + "sleep", + "360" + ], + "memory": 10, + "essential": true + } + ], + "volumes": [] + }, + "output": { + "taskDefinition": { + "volumes": [], + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/sleep360:19", + "containerDefinitions": [ + { + "environment": [], + "name": "sleep", + "mountPoints": [], + "image": "busybox", + "cpu": 10, + "portMappings": [], + "command": [ + "sleep", + "360" + ], + "memory": 10, + "essential": true, + "volumesFrom": [] + } + ], + "family": "sleep360", + "revision": 1 + } + } + } + ] } }, "com.amazonaws.ecs#RegisterTaskDefinitionRequest": { @@ -8247,7 +8837,7 @@ "pidMode": { "target": "com.amazonaws.ecs#PidMode", "traits": { - "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. If host\n is specified, then all containers within the tasks that specified the\n host PID mode on the same container instance share the\n same process namespace with the host Amazon EC2 instance. If task is\n specified, all containers within the specified task share the same\n process namespace. If no value is specified, the default is a private\n namespace. For more information, see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, be aware that there is a\n heightened risk of undesired process namespace expose. For more\n information, see Docker\n security.

\n \n

This parameter is not supported for Windows containers or tasks run on Fargate.

\n
" + "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. On Fargate for\n Linux containers, the only valid value is task. For\n example, monitoring sidecars might need pidMode to access\n information about other containers running in the same task.

\n

If host is specified, all containers within the tasks\n that specified the host PID mode on the same container\n instance share the same process namespace with the host Amazon EC2\n instance.

\n

If task is specified, all containers within the specified\n task share the same process namespace.

\n

If no value is specified, the\n default is a private namespace for each container. For more information,\n see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, there's a heightened risk\n of undesired process namespace exposure. For more information, see\n Docker security.

\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "ipcMode": { @@ -8486,7 +9076,43 @@ } ], "traits": { - "smithy.api#documentation": "

Starts a new task using the specified task definition.

\n

You can allow Amazon ECS to place tasks for you, or you can customize how Amazon ECS places\n\t\t\ttasks using placement constraints and placement strategies. For more information, see\n\t\t\t\tScheduling Tasks in the Amazon Elastic Container Service Developer Guide.

\n

Alternatively, you can use StartTask to use your own scheduler or\n\t\t\tplace tasks manually on specific container instances.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

The Amazon ECS API follows an eventual consistency model. This is because of the\n\t\t\tdistributed nature of the system supporting the API. This means that the result of an\n\t\t\tAPI command you run that affects your Amazon ECS resources might not be immediately visible\n\t\t\tto all subsequent commands you run. Keep this in mind when you carry out an API command\n\t\t\tthat immediately follows a previous API command.

\n

To manage eventual consistency, you can do the following:

\n
    \n
  • \n

    Confirm the state of the resource before you run a command to modify it. Run\n\t\t\t\t\tthe DescribeTasks command using an exponential backoff algorithm to ensure that\n\t\t\t\t\tyou allow enough time for the previous command to propagate through the system.\n\t\t\t\t\tTo do this, run the DescribeTasks command repeatedly, starting with a couple of\n\t\t\t\t\tseconds of wait time and increasing gradually up to five minutes of wait\n\t\t\t\t\ttime.

    \n
  • \n
  • \n

    Add wait time between subsequent commands, even if the DescribeTasks command\n\t\t\t\t\treturns an accurate response. Apply an exponential backoff algorithm starting\n\t\t\t\t\twith a couple of seconds of wait time, and increase gradually up to about five\n\t\t\t\t\tminutes of wait time.

    \n
  • \n
" + "smithy.api#documentation": "

Starts a new task using the specified task definition.

\n

You can allow Amazon ECS to place tasks for you, or you can customize how Amazon ECS places\n\t\t\ttasks using placement constraints and placement strategies. For more information, see\n\t\t\t\tScheduling Tasks in the Amazon Elastic Container Service Developer Guide.

\n

Alternatively, you can use StartTask to use your own scheduler or\n\t\t\tplace tasks manually on specific container instances.

\n \n

Starting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon Elastic Inference (EI), and will help current customers migrate their workloads to options that offer better price and performance. After April 15, 2023, new customers will not be able to launch instances with Amazon EI accelerators in Amazon SageMaker, Amazon ECS, or Amazon EC2. However, customers who have used Amazon EI at least once during the past 30-day period are considered current customers and will be able to continue using the service.

\n
\n

The Amazon ECS API follows an eventual consistency model. This is because of the\n\t\t\tdistributed nature of the system supporting the API. This means that the result of an\n\t\t\tAPI command you run that affects your Amazon ECS resources might not be immediately visible\n\t\t\tto all subsequent commands you run. Keep this in mind when you carry out an API command\n\t\t\tthat immediately follows a previous API command.

\n

To manage eventual consistency, you can do the following:

\n
    \n
  • \n

    Confirm the state of the resource before you run a command to modify it. Run\n\t\t\t\t\tthe DescribeTasks command using an exponential backoff algorithm to ensure that\n\t\t\t\t\tyou allow enough time for the previous command to propagate through the system.\n\t\t\t\t\tTo do this, run the DescribeTasks command repeatedly, starting with a couple of\n\t\t\t\t\tseconds of wait time and increasing gradually up to five minutes of wait\n\t\t\t\t\ttime.

    \n
  • \n
  • \n

    Add wait time between subsequent commands, even if the DescribeTasks command\n\t\t\t\t\treturns an accurate response. Apply an exponential backoff algorithm starting\n\t\t\t\t\twith a couple of seconds of wait time, and increase gradually up to about five\n\t\t\t\t\tminutes of wait time.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To run a task on your default cluster", + "documentation": "This example runs the specified task definition on your default cluster.", + "input": { + "cluster": "default", + "taskDefinition": "sleep360:1" + }, + "output": { + "tasks": [ + { + "taskArn": "arn:aws:ecs:us-east-1::task/default/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", + "overrides": { + "containerOverrides": [ + { + "name": "sleep" + } + ] + }, + "lastStatus": "PENDING", + "containerInstanceArn": "arn:aws:ecs:us-east-1::container-instance/default/ffe3d344-77e2-476c-a4d0-bf560ad50acb", + "desiredStatus": "RUNNING", + "taskDefinitionArn": "arn:aws:ecs:us-east-1::task-definition/sleep360:1", + "containers": [ + { + "containerArn": "arn:aws:ecs:us-east-1::container/default/58591c8e-be29-4ddf-95aa-ee459d4c59fd", + "taskArn": "arn:aws:ecs:us-east-1::task/default/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0", + "lastStatus": "PENDING", + "name": "sleep" + } + ] + } + ] + } + } + ] } }, "com.amazonaws.ecs#RunTaskRequest": { @@ -9289,6 +9915,12 @@ "traits": { "smithy.api#enumValue": "tagResourceAuthorization" } + }, + "FARGATE_TASK_RETIREMENT_WAIT_PERIOD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "fargateTaskRetirementWaitPeriod" + } } } }, @@ -9827,7 +10459,7 @@ "value": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The value for the namespaced kernel parameter that's specified in\n\t\t\t\tnamespace.

" + "smithy.api#documentation": "

The namespaced kernel parameter to set a\n\t\t\tvalue for.

\n

Valid IPC namespace values: \"kernel.msgmax\" | \"kernel.msgmnb\" | \"kernel.msgmni\"\n\t\t\t| \"kernel.sem\" | \"kernel.shmall\" | \"kernel.shmmax\" |\n\t\t\t\"kernel.shmmni\" | \"kernel.shm_rmid_forced\", and\n\t\t\tSysctls that start with\n\t\t\t\"fs.mqueue.*\"\n

\n

Valid network namespace values: Sysctls that start with\n\t\t\t\"net.*\"\n

\n

All of these values are supported by Fargate.

" } } }, @@ -9903,7 +10535,23 @@ } ], "traits": { - "smithy.api#documentation": "

Associates the specified tags to a resource with the specified\n\t\t\t\tresourceArn. If existing tags on a resource aren't specified in the\n\t\t\trequest parameters, they aren't changed. When a resource is deleted, the tags that are\n\t\t\tassociated with that resource are deleted as well.

" + "smithy.api#documentation": "

Associates the specified tags to a resource with the specified\n\t\t\t\tresourceArn. If existing tags on a resource aren't specified in the\n\t\t\trequest parameters, they aren't changed. When a resource is deleted, the tags that are\n\t\t\tassociated with that resource are deleted as well.

", + "smithy.api#examples": [ + { + "title": "To tag a cluster.", + "documentation": "This example tags the 'dev' cluster with key 'team' and value 'dev'.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev", + "tags": [ + { + "key": "team", + "value": "dev" + } + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#TagResourceRequest": { @@ -10161,7 +10809,7 @@ "stopCode": { "target": "com.amazonaws.ecs#TaskStopCode", "traits": { - "smithy.api#documentation": "

The stop code indicating why a task was stopped. The stoppedReason might\n\t\t\tcontain additional details.

\n

The following are valid values:

\n
    \n
  • \n

    \n TaskFailedToStart\n

    \n
  • \n
  • \n

    \n EssentialContainerExited\n

    \n
  • \n
  • \n

    \n UserInitiated\n

    \n
  • \n
  • \n

    \n TerminationNotice\n

    \n
  • \n
  • \n

    \n ServiceSchedulerInitiated\n

    \n
  • \n
  • \n

    \n SpotInterruption\n

    \n
  • \n
" + "smithy.api#documentation": "

The stop code indicating why a task was stopped. The stoppedReason might\n\t\t\tcontain additional details.

\n

For more information about stop code, see Stopped tasks error codes in the Amazon ECS User Guide.

\n

The following are valid values:

\n
    \n
  • \n

    \n TaskFailedToStart\n

    \n
  • \n
  • \n

    \n EssentialContainerExited\n

    \n
  • \n
  • \n

    \n UserInitiated\n

    \n
  • \n
  • \n

    \n TerminationNotice\n

    \n
  • \n
  • \n

    \n ServiceSchedulerInitiated\n

    \n
  • \n
  • \n

    \n SpotInterruption\n

    \n
  • \n
" } }, "stoppedAt": { @@ -10179,7 +10827,7 @@ "stoppingAt": { "target": "com.amazonaws.ecs#Timestamp", "traits": { - "smithy.api#documentation": "

The Unix timestamp for the time when the task stops. More specifically, it's for the\n\t\t\ttime when the task transitions from the RUNNING state to\n\t\t\t\tSTOPPED.

" + "smithy.api#documentation": "

The Unix timestamp for the time when the task stops. More specifically, it's for the\n\t\t\ttime when the task transitions from the RUNNING state to\n\t\t\t\tSTOPPING.

" } }, "tags": { @@ -10303,7 +10951,7 @@ "requiresCompatibilities": { "target": "com.amazonaws.ecs#CompatibilityList", "traits": { - "smithy.api#documentation": "

The task launch types the task definition was validated against. For more information, see Amazon ECS launch types\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" + "smithy.api#documentation": "

The task launch types the task definition was validated against. The valid values are\n\t\t\t\tEC2, FARGATE, and EXTERNAL. For more\n\t\t\tinformation, see Amazon ECS launch types\n\t\t\tin the Amazon Elastic Container Service Developer Guide.

" } }, "cpu": { @@ -10327,7 +10975,7 @@ "pidMode": { "target": "com.amazonaws.ecs#PidMode", "traits": { - "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. If host\n is specified, then all containers within the tasks that specified the\n host PID mode on the same container instance share the\n same process namespace with the host Amazon EC2 instance. If task is\n specified, all containers within the specified task share the same\n process namespace. If no value is specified, the default is a private\n namespace. For more information, see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, be aware that there is a\n heightened risk of undesired process namespace expose. For more\n information, see Docker\n security.

\n \n

This parameter is not supported for Windows containers or tasks run on Fargate.

\n
" + "smithy.api#documentation": "

The process namespace to use for the containers in the task. The valid\n values are host or task. On Fargate for\n Linux containers, the only valid value is task. For\n example, monitoring sidecars might need pidMode to access\n information about other containers running in the same task.

\n

If host is specified, all containers within the tasks\n that specified the host PID mode on the same container\n instance share the same process namespace with the host Amazon EC2\n instance.

\n

If task is specified, all containers within the specified\n task share the same process namespace.

\n

If no value is specified, the\n default is a private namespace for each container. For more information,\n see PID settings in the Docker run\n reference.

\n

If the host PID mode is used, there's a heightened risk\n of undesired process namespace exposure. For more information, see\n Docker security.

\n \n

This parameter is not supported for Windows containers.

\n
\n \n

This parameter is only supported for tasks that are hosted on\n Fargate if the tasks are using platform version 1.4.0 or later\n (Linux). This isn't supported for Windows containers on\n Fargate.

\n
" } }, "ipcMode": { @@ -11006,7 +11654,20 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes specified tags from a resource.

" + "smithy.api#documentation": "

Deletes specified tags from a resource.

", + "smithy.api#examples": [ + { + "title": "To untag a cluster.", + "documentation": "This example deletes the 'team' tag from the 'dev' cluster.", + "input": { + "resourceArn": "arn:aws:ecs:region:aws_account_id:cluster/dev", + "tagKeys": [ + "team" + ] + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#UntagResourceRequest": { @@ -11432,7 +12093,18 @@ } ], "traits": { - "smithy.api#documentation": "

Modifies the parameters of a service.

\n

For services using the rolling update (ECS) you can update the desired\n\t\t\tcount, deployment configuration, network configuration, load balancers, service\n\t\t\tregistries, enable ECS managed tags option, propagate tags option, task placement\n\t\t\tconstraints and strategies, and task definition. When you update any of these\n\t\t\tparameters, Amazon ECS starts new tasks with the new configuration.

\n

For services using the blue/green (CODE_DEPLOY) deployment controller,\n\t\t\tonly the desired count, deployment configuration, health check grace period, task\n\t\t\tplacement constraints and strategies, enable ECS managed tags option, and propagate tags\n\t\t\tcan be updated using this API. If the network configuration, platform version, task\n\t\t\tdefinition, or load balancer need to be updated, create a new CodeDeploy deployment. For more\n\t\t\tinformation, see CreateDeployment in the CodeDeploy API Reference.

\n

For services using an external deployment controller, you can update only the desired\n\t\t\tcount, task placement constraints and strategies, health check grace period, enable ECS\n\t\t\tmanaged tags option, and propagate tags option, using this API. If the launch type, load\n\t\t\tbalancer, network configuration, platform version, or task definition need to be\n\t\t\tupdated, create a new task set For more information, see CreateTaskSet.

\n

You can add to or subtract from the number of instantiations of a task definition in a\n\t\t\tservice by specifying the cluster that the service is running in and a new\n\t\t\t\tdesiredCount parameter.

\n

If you have updated the Docker image of your application, you can create a new task\n\t\t\tdefinition with that image and deploy it to your service. The service scheduler uses the\n\t\t\tminimum healthy percent and maximum percent parameters (in the service's deployment\n\t\t\tconfiguration) to determine the deployment strategy.

\n \n

If your updated Docker image uses the same tag as what is in the existing task\n\t\t\t\tdefinition for your service (for example, my_image:latest), you don't\n\t\t\t\tneed to create a new revision of your task definition. You can update the service\n\t\t\t\tusing the forceNewDeployment option. The new tasks launched by the\n\t\t\t\tdeployment pull the current image/tag combination from your repository when they\n\t\t\t\tstart.

\n
\n

You can also update the deployment configuration of a service. When a deployment is\n\t\t\ttriggered by updating the task definition of a service, the service scheduler uses the\n\t\t\tdeployment configuration parameters, minimumHealthyPercent and\n\t\t\t\tmaximumPercent, to determine the deployment strategy.

\n
    \n
  • \n

    If minimumHealthyPercent is below 100%, the scheduler can ignore\n\t\t\t\t\t\tdesiredCount temporarily during a deployment. For example, if\n\t\t\t\t\t\tdesiredCount is four tasks, a minimum of 50% allows the\n\t\t\t\t\tscheduler to stop two existing tasks before starting two new tasks. Tasks for\n\t\t\t\t\tservices that don't use a load balancer are considered healthy if they're in the\n\t\t\t\t\t\tRUNNING state. Tasks for services that use a load balancer are\n\t\t\t\t\tconsidered healthy if they're in the RUNNING state and are reported\n\t\t\t\t\tas healthy by the load balancer.

    \n
  • \n
  • \n

    The maximumPercent parameter represents an upper limit on the\n\t\t\t\t\tnumber of running tasks during a deployment. You can use it to define the\n\t\t\t\t\tdeployment batch size. For example, if desiredCount is four tasks,\n\t\t\t\t\ta maximum of 200% starts four new tasks before stopping the four older tasks\n\t\t\t\t\t(provided that the cluster resources required to do this are available).

    \n
  • \n
\n

When UpdateService stops a task during a deployment, the equivalent\n\t\t\tof docker stop is issued to the containers running in the task. This\n\t\t\tresults in a SIGTERM and a 30-second timeout. After this,\n\t\t\t\tSIGKILL is sent and the containers are forcibly stopped. If the\n\t\t\tcontainer handles the SIGTERM gracefully and exits within 30 seconds from\n\t\t\treceiving it, no SIGKILL is sent.

\n

When the service scheduler launches new tasks, it determines task placement in your\n\t\t\tcluster with the following logic.

\n
    \n
  • \n

    Determine which of the container instances in your cluster can support your\n\t\t\t\t\tservice's task definition. For example, they have the required CPU, memory,\n\t\t\t\t\tports, and container instance attributes.

    \n
  • \n
  • \n

    By default, the service scheduler attempts to balance tasks across\n\t\t\t\t\tAvailability Zones in this manner even though you can choose a different\n\t\t\t\t\tplacement strategy.

    \n
      \n
    • \n

      Sort the valid container instances by the fewest number of running\n\t\t\t\t\t\t\ttasks for this service in the same Availability Zone as the instance.\n\t\t\t\t\t\t\tFor example, if zone A has one running service task and zones B and C\n\t\t\t\t\t\t\teach have zero, valid container instances in either zone B or C are\n\t\t\t\t\t\t\tconsidered optimal for placement.

      \n
    • \n
    • \n

      Place the new service task on a valid container instance in an optimal\n\t\t\t\t\t\t\tAvailability Zone (based on the previous steps), favoring container\n\t\t\t\t\t\t\tinstances with the fewest number of running tasks for this\n\t\t\t\t\t\t\tservice.

      \n
    • \n
    \n
  • \n
\n

When the service scheduler stops running tasks, it attempts to maintain balance across\n\t\t\tthe Availability Zones in your cluster using the following logic:

\n
    \n
  • \n

    Sort the container instances by the largest number of running tasks for this\n\t\t\t\t\tservice in the same Availability Zone as the instance. For example, if zone A\n\t\t\t\t\thas one running service task and zones B and C each have two, container\n\t\t\t\t\tinstances in either zone B or C are considered optimal for termination.

    \n
  • \n
  • \n

    Stop the task on a container instance in an optimal Availability Zone (based\n\t\t\t\t\ton the previous steps), favoring container instances with the largest number of\n\t\t\t\t\trunning tasks for this service.

    \n
  • \n
\n \n

You must have a service-linked role when you update any of the following service\n\t\t\t\tproperties. If you specified a custom role when you created the service, Amazon ECS\n\t\t\t\tautomatically replaces the roleARN associated with the service with the ARN of your\n\t\t\t\tservice-linked role. For more information, see Service-linked roles in the Amazon Elastic Container Service Developer Guide.

\n
    \n
  • \n

    \n loadBalancers,\n

    \n
  • \n
  • \n

    \n serviceRegistries\n

    \n
  • \n
\n
" + "smithy.api#documentation": "

Modifies the parameters of a service.

\n

For services using the rolling update (ECS) you can update the desired\n\t\t\tcount, deployment configuration, network configuration, load balancers, service\n\t\t\tregistries, enable ECS managed tags option, propagate tags option, task placement\n\t\t\tconstraints and strategies, and task definition. When you update any of these\n\t\t\tparameters, Amazon ECS starts new tasks with the new configuration.

\n

For services using the blue/green (CODE_DEPLOY) deployment controller,\n\t\t\tonly the desired count, deployment configuration, health check grace period, task\n\t\t\tplacement constraints and strategies, enable ECS managed tags option, and propagate tags\n\t\t\tcan be updated using this API. If the network configuration, platform version, task\n\t\t\tdefinition, or load balancer need to be updated, create a new CodeDeploy deployment. For more\n\t\t\tinformation, see CreateDeployment in the CodeDeploy API Reference.

\n

For services using an external deployment controller, you can update only the desired\n\t\t\tcount, task placement constraints and strategies, health check grace period, enable ECS\n\t\t\tmanaged tags option, and propagate tags option, using this API. If the launch type, load\n\t\t\tbalancer, network configuration, platform version, or task definition need to be\n\t\t\tupdated, create a new task set For more information, see CreateTaskSet.

\n

You can add to or subtract from the number of instantiations of a task definition in a\n\t\t\tservice by specifying the cluster that the service is running in and a new\n\t\t\t\tdesiredCount parameter.

\n

If you have updated the Docker image of your application, you can create a new task\n\t\t\tdefinition with that image and deploy it to your service. The service scheduler uses the\n\t\t\tminimum healthy percent and maximum percent parameters (in the service's deployment\n\t\t\tconfiguration) to determine the deployment strategy.

\n \n

If your updated Docker image uses the same tag as what is in the existing task\n\t\t\t\tdefinition for your service (for example, my_image:latest), you don't\n\t\t\t\tneed to create a new revision of your task definition. You can update the service\n\t\t\t\tusing the forceNewDeployment option. The new tasks launched by the\n\t\t\t\tdeployment pull the current image/tag combination from your repository when they\n\t\t\t\tstart.

\n
\n

You can also update the deployment configuration of a service. When a deployment is\n\t\t\ttriggered by updating the task definition of a service, the service scheduler uses the\n\t\t\tdeployment configuration parameters, minimumHealthyPercent and\n\t\t\t\tmaximumPercent, to determine the deployment strategy.

\n
    \n
  • \n

    If minimumHealthyPercent is below 100%, the scheduler can ignore\n\t\t\t\t\t\tdesiredCount temporarily during a deployment. For example, if\n\t\t\t\t\t\tdesiredCount is four tasks, a minimum of 50% allows the\n\t\t\t\t\tscheduler to stop two existing tasks before starting two new tasks. Tasks for\n\t\t\t\t\tservices that don't use a load balancer are considered healthy if they're in the\n\t\t\t\t\t\tRUNNING state. Tasks for services that use a load balancer are\n\t\t\t\t\tconsidered healthy if they're in the RUNNING state and are reported\n\t\t\t\t\tas healthy by the load balancer.

    \n
  • \n
  • \n

    The maximumPercent parameter represents an upper limit on the\n\t\t\t\t\tnumber of running tasks during a deployment. You can use it to define the\n\t\t\t\t\tdeployment batch size. For example, if desiredCount is four tasks,\n\t\t\t\t\ta maximum of 200% starts four new tasks before stopping the four older tasks\n\t\t\t\t\t(provided that the cluster resources required to do this are available).

    \n
  • \n
\n

When UpdateService stops a task during a deployment, the equivalent\n\t\t\tof docker stop is issued to the containers running in the task. This\n\t\t\tresults in a SIGTERM and a 30-second timeout. After this,\n\t\t\t\tSIGKILL is sent and the containers are forcibly stopped. If the\n\t\t\tcontainer handles the SIGTERM gracefully and exits within 30 seconds from\n\t\t\treceiving it, no SIGKILL is sent.

\n

When the service scheduler launches new tasks, it determines task placement in your\n\t\t\tcluster with the following logic.

\n
    \n
  • \n

    Determine which of the container instances in your cluster can support your\n\t\t\t\t\tservice's task definition. For example, they have the required CPU, memory,\n\t\t\t\t\tports, and container instance attributes.

    \n
  • \n
  • \n

    By default, the service scheduler attempts to balance tasks across\n\t\t\t\t\tAvailability Zones in this manner even though you can choose a different\n\t\t\t\t\tplacement strategy.

    \n
      \n
    • \n

      Sort the valid container instances by the fewest number of running\n\t\t\t\t\t\t\ttasks for this service in the same Availability Zone as the instance.\n\t\t\t\t\t\t\tFor example, if zone A has one running service task and zones B and C\n\t\t\t\t\t\t\teach have zero, valid container instances in either zone B or C are\n\t\t\t\t\t\t\tconsidered optimal for placement.

      \n
    • \n
    • \n

      Place the new service task on a valid container instance in an optimal\n\t\t\t\t\t\t\tAvailability Zone (based on the previous steps), favoring container\n\t\t\t\t\t\t\tinstances with the fewest number of running tasks for this\n\t\t\t\t\t\t\tservice.

      \n
    • \n
    \n
  • \n
\n

When the service scheduler stops running tasks, it attempts to maintain balance across\n\t\t\tthe Availability Zones in your cluster using the following logic:

\n
    \n
  • \n

    Sort the container instances by the largest number of running tasks for this\n\t\t\t\t\tservice in the same Availability Zone as the instance. For example, if zone A\n\t\t\t\t\thas one running service task and zones B and C each have two, container\n\t\t\t\t\tinstances in either zone B or C are considered optimal for termination.

    \n
  • \n
  • \n

    Stop the task on a container instance in an optimal Availability Zone (based\n\t\t\t\t\ton the previous steps), favoring container instances with the largest number of\n\t\t\t\t\trunning tasks for this service.

    \n
  • \n
\n \n

You must have a service-linked role when you update any of the following service\n\t\t\t\tproperties:

\n
    \n
  • \n

    \n loadBalancers,

    \n
  • \n
  • \n

    \n serviceRegistries\n

    \n
  • \n
\n

For more information about the role see the CreateService request parameter\n\t\t\t\t\n role\n .

\n
", + "smithy.api#examples": [ + { + "title": "To change the task definition used in a service", + "documentation": "This example updates the my-http-service service to use the amazon-ecs-sample task definition.", + "input": { + "service": "my-http-service", + "taskDefinition": "amazon-ecs-sample" + }, + "output": {} + } + ] } }, "com.amazonaws.ecs#UpdateServicePrimaryTaskSet": { @@ -11683,7 +12355,31 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the protection status of a task. You can set protectionEnabled to\n\t\t\t\ttrue to protect your task from termination during scale-in events from\n\t\t\t\tService\n\t\t\t\tAutoscaling or deployments.

\n

Task-protection, by default, expires after 2 hours at which point Amazon ECS clears the\n\t\t\t\tprotectionEnabled property making the task eligible for termination by\n\t\t\ta subsequent scale-in event.

\n

You can specify a custom expiration period for task protection from 1 minute to up to\n\t\t\t2,880 minutes (48 hours). To specify the custom expiration period, set the\n\t\t\t\texpiresInMinutes property. The expiresInMinutes property\n\t\t\tis always reset when you invoke this operation for a task that already has\n\t\t\t\tprotectionEnabled set to true. You can keep extending the\n\t\t\tprotection expiration period of a task by invoking this operation repeatedly.

\n

To learn more about Amazon ECS task protection, see Task scale-in\n\t\t\t\tprotection in the \n Amazon Elastic Container Service Developer Guide\n .

\n \n

This operation is only supported for tasks belonging to an Amazon ECS service. Invoking\n\t\t\t\tthis operation for a standalone task will result in an TASK_NOT_VALID\n\t\t\t\tfailure. For more information, see API failure\n\t\t\t\t\treasons.

\n
\n \n

If you prefer to set task protection from within the container, we recommend using\n\t\t\t\tthe Task scale-in protection endpoint.

\n
" + "smithy.api#documentation": "

Updates the protection status of a task. You can set protectionEnabled to\n\t\t\t\ttrue to protect your task from termination during scale-in events from\n\t\t\t\tService\n\t\t\t\tAutoscaling or deployments.

\n

Task-protection, by default, expires after 2 hours at which point Amazon ECS clears the\n\t\t\t\tprotectionEnabled property making the task eligible for termination by\n\t\t\ta subsequent scale-in event.

\n

You can specify a custom expiration period for task protection from 1 minute to up to\n\t\t\t2,880 minutes (48 hours). To specify the custom expiration period, set the\n\t\t\t\texpiresInMinutes property. The expiresInMinutes property\n\t\t\tis always reset when you invoke this operation for a task that already has\n\t\t\t\tprotectionEnabled set to true. You can keep extending the\n\t\t\tprotection expiration period of a task by invoking this operation repeatedly.

\n

To learn more about Amazon ECS task protection, see Task scale-in\n\t\t\t\tprotection in the \n Amazon Elastic Container Service Developer Guide\n .

\n \n

This operation is only supported for tasks belonging to an Amazon ECS service. Invoking\n\t\t\t\tthis operation for a standalone task will result in an TASK_NOT_VALID\n\t\t\t\tfailure. For more information, see API failure\n\t\t\t\t\treasons.

\n
\n \n

If you prefer to set task protection from within the container, we recommend using\n\t\t\t\tthe Task scale-in protection endpoint.

\n
", + "smithy.api#examples": [ + { + "title": "To set task scale-in protection for a task for 60 minutes", + "documentation": "This example enables scale-in protection for a task for 60 minutes.", + "input": { + "cluster": "test-task-protection", + "tasks": [ + "b8b1cf532d0e46ba8d44a40d1de16772" + ], + "protectionEnabled": true, + "expiresInMinutes": 60 + }, + "output": { + "protectedTasks": [ + { + "taskArn": "arn:aws:ecs:us-west-2:012345678910:task/default/b8b1cf532d0e46ba8d44a40d1de16772", + "protectionEnabled": true, + "expirationDate": "2022-11-02T06:56:32.553Z" + } + ], + "failures": [] + } + } + ] } }, "com.amazonaws.ecs#UpdateTaskProtectionRequest": { @@ -11865,7 +12561,7 @@ "name": { "target": "com.amazonaws.ecs#String", "traits": { - "smithy.api#documentation": "

The name of the volume. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This name is referenced in the\n\t\t\t\tsourceVolume parameter of container definition\n\t\t\tmountPoints.

" + "smithy.api#documentation": "

The name of the volume. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This name is referenced in the\n\t\t\t\tsourceVolume parameter of container definition\n\t\t\tmountPoints.

\n

This is required wwhen you use an Amazon EFS volume.

" } }, "host": { diff --git a/aws/sdk/aws-models/glacier.json b/aws/sdk/aws-models/glacier.json index 32cb84212f4..c98fd0342eb 100644 --- a/aws/sdk/aws-models/glacier.json +++ b/aws/sdk/aws-models/glacier.json @@ -53,6 +53,17 @@ ], "traits": { "smithy.api#documentation": "

This operation aborts a multipart upload identified by the upload ID.

\n\n\n

After the Abort Multipart Upload request succeeds, you cannot upload any more parts\n to the multipart upload or complete the multipart upload. Aborting a completed upload\n fails. However, aborting an already-aborted upload will succeed, for a short time. For more\n information about uploading a part and completing a multipart upload, see UploadMultipartPart and CompleteMultipartUpload.

\n\n

This operation is idempotent.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Working with Archives in\n Amazon S3 Glacier and Abort Multipart\n Upload in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To abort a multipart upload identified by the upload ID", + "documentation": "The example deletes an in-progress multipart upload to a vault named my-vault:", + "input": { + "accountId": "-", + "vaultName": "my-vault", + "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}", @@ -117,6 +128,16 @@ ], "traits": { "smithy.api#documentation": "

This operation aborts the vault locking process if the vault lock is not in the\n Locked state. If the vault lock is in the Locked state when\n this operation is requested, the operation returns an AccessDeniedException\n error. Aborting the vault locking process removes the vault lock policy from the specified\n vault.

\n

A vault lock is put into the InProgress state by calling InitiateVaultLock. A vault lock is put into the Locked state by\n calling CompleteVaultLock. You can get the state of a vault lock by\n calling GetVaultLock. For more information about the vault locking\n process, see Amazon Glacier Vault Lock. For more information about vault lock policies, see\n Amazon\n Glacier Access Control with Vault Lock Policies.

\n

This operation is idempotent. You can successfully invoke this operation multiple\n times, if the vault lock is in the InProgress state or if there is no policy\n associated with the vault.

", + "smithy.api#examples": [ + { + "title": "To abort a vault lock", + "documentation": "The example aborts the vault locking process if the vault lock is not in the Locked state for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/lock-policy", @@ -205,6 +226,20 @@ ], "traits": { "smithy.api#documentation": "

This operation adds the specified tags to a vault. Each tag is composed of a key and\n a value. Each vault can have up to 10 tags. If your request would cause the tag limit for\n the vault to be exceeded, the operation throws the LimitExceededException\n error. If a tag already exists on the vault under a specified key, the existing key value\n will be overwritten. For more information about tags, see Tagging Amazon S3 Glacier Resources.\n

", + "smithy.api#examples": [ + { + "title": "To add tags to a vault", + "documentation": "The example adds two tags to a my-vault.", + "input": { + "accountId": "-", + "vaultName": "my-vault", + "Tags": { + "examplekey1": "examplevalue1", + "examplekey2": "examplevalue2" + } + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/tags?operation=add", @@ -425,6 +460,24 @@ ], "traits": { "smithy.api#documentation": "

You call this operation to inform Amazon S3 Glacier (Glacier) that all the archive parts have been\n uploaded and that Glacier can now assemble the archive from the uploaded parts.\n After assembling and saving the archive to the vault, Glacier returns the URI path\n of the newly created archive resource. Using the URI path, you can then access the archive.\n After you upload an archive, you should save the archive ID returned to retrieve the\n archive at a later point. You can also get the vault inventory to obtain a list of archive\n IDs in a vault. For more information, see InitiateJob.

\n\n

In the request, you must include the computed SHA256 tree hash of the entire archive\n you have uploaded. For information about computing a SHA256 tree hash, see Computing\n Checksums. On the server side, Glacier also constructs the SHA256 tree\n hash of the assembled archive. If the values match, Glacier saves the archive to the\n vault; otherwise, it returns an error, and the operation fails. The ListParts operation returns a list of parts uploaded for a specific\n multipart upload. It includes checksum information for each uploaded part that can be used\n to debug a bad checksum issue.

\n\n

Additionally, Glacier also checks for any missing content ranges when\n assembling the archive, if missing content ranges are found, Glacier returns an\n error and the operation fails.

\n\n

Complete Multipart Upload is an idempotent operation. After your first successful\n complete multipart upload, if you call the operation again within a short period, the\n operation will succeed and return the same archive ID. This is useful in the event you\n experience a network issue that causes an aborted connection or receive a 500 server error,\n in which case you can repeat your Complete Multipart Upload request and get the same\n archive ID without creating duplicate archives. Note, however, that after the multipart\n upload completes, you cannot call the List Parts operation and the multipart upload will\n not appear in List Multipart Uploads response, even if idempotent complete is\n possible.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Uploading Large Archives in\n Parts (Multipart Upload) and Complete Multipart\n Upload in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To complete a multipart upload", + "documentation": "The example completes a multipart upload for a 3 MiB archive.", + "input": { + "checksum": "9628195fcdbcbbe76cdde456d4646fa7de5f219fb39823836d81f0cc0e18aa67", + "vaultName": "my-vault", + "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ", + "archiveSize": "3145728", + "accountId": "-" + }, + "output": { + "location": "/111122223333/vaults/my-vault/archives/NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId", + "checksum": "9628195fcdbcbbe76cdde456d4646fa7de5f219fb39823836d81f0cc0e18aa67", + "archiveId": "NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}", @@ -503,6 +556,17 @@ ], "traits": { "smithy.api#documentation": "

This operation completes the vault locking process by transitioning the vault lock\n from the InProgress state to the Locked state, which causes the\n vault lock policy to become unchangeable. A vault lock is put into the\n InProgress state by calling InitiateVaultLock. You can\n obtain the state of the vault lock by calling GetVaultLock. For more\n information about the vault locking process, Amazon Glacier Vault Lock.

\n

This operation is idempotent. This request is always successful if the vault lock is\n in the Locked state and the provided lock ID matches the lock ID originally\n used to lock the vault.

\n

If an invalid lock ID is passed in the request when the vault lock is in the\n Locked state, the operation returns an AccessDeniedException\n error. If an invalid lock ID is passed in the request when the vault lock is in the\n InProgress state, the operation throws an InvalidParameter\n error.

", + "smithy.api#examples": [ + { + "title": "To complete a vault lock", + "documentation": "The example completes the vault locking process by transitioning the vault lock from the InProgress state to the Locked state.", + "input": { + "accountId": "-", + "vaultName": "example-vault", + "lockId": "AE863rKkWZU53SLW5be4DUcW" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/lock-policy/{lockId}", @@ -567,6 +631,19 @@ ], "traits": { "smithy.api#documentation": "

This operation creates a new vault with the specified name. The name of the vault\n must be unique within a region for an AWS account. You can create up to 1,000 vaults per\n account. If you need to create more vaults, contact Amazon S3 Glacier.

\n

You must use the following guidelines when naming a vault.

\n
    \n
  • \n

    Names can be between 1 and 255 characters long.

    \n
  • \n
  • \n

    Allowed characters are a-z, A-Z, 0-9, '_' (underscore), '-' (hyphen), and '.'\n (period).

    \n
  • \n
\n\n

This operation is idempotent.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Creating a Vault in Amazon\n Glacier and Create Vault in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To create a new vault", + "documentation": "The following example creates a new vault named my-vault.", + "input": { + "vaultName": "my-vault", + "accountId": "-" + }, + "output": { + "location": "/111122223333/vaults/my-vault" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/vaults/{vaultName}", @@ -682,6 +759,17 @@ ], "traits": { "smithy.api#documentation": "

This operation deletes an archive from a vault. Subsequent requests to initiate a\n retrieval of this archive will fail. Archive retrievals that are in progress for this\n archive ID may or may not succeed according to the following scenarios:

\n
    \n
  • \n

    If the archive retrieval job is actively preparing the data for download when\n Amazon S3 Glacier receives the delete archive request, the archival retrieval operation\n might fail.

    \n
  • \n
  • \n

    If the archive retrieval job has successfully prepared the archive for download\n when Amazon S3 Glacier receives the delete archive request, you will be able to download\n the output.

    \n
  • \n
\n\n

This operation is idempotent. Attempting to delete an already-deleted archive does\n not result in an error.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Deleting an Archive in Amazon\n Glacier and Delete Archive in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To delete an archive", + "documentation": "The example deletes the archive specified by the archive ID.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "archiveId": "NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/archives/{archiveId}", @@ -746,6 +834,16 @@ ], "traits": { "smithy.api#documentation": "

This operation deletes a vault. Amazon S3 Glacier will delete a vault only if there are\n no archives in the vault as of the last inventory and there have been no writes to the\n vault since the last inventory. If either of these conditions is not satisfied, the vault\n deletion fails (that is, the vault is not removed) and Amazon S3 Glacier returns an error. You\n can use DescribeVault to return the number of archives in a vault, and\n you can use Initiate a Job (POST\n jobs) to initiate a new inventory retrieval for a vault. The inventory contains\n the archive IDs you use to delete archives using Delete Archive (DELETE\n archive).

\n\n

This operation is idempotent.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Deleting a Vault in Amazon\n Glacier and Delete Vault in the\n Amazon S3 Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a vault", + "documentation": "The example deletes a vault named my-vault:", + "input": { + "vaultName": "my-vault", + "accountId": "-" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}", @@ -777,6 +875,16 @@ ], "traits": { "smithy.api#documentation": "

This operation deletes the access policy associated with the specified vault. The\n operation is eventually consistent; that is, it might take some time for Amazon S3 Glacier to\n completely remove the access policy, and you might still see the effect of the policy for a\n short time after you send the delete request.

\n

This operation is idempotent. You can invoke delete multiple times, even if there is\n no policy associated with the vault. For more information about vault access policies, see\n Amazon Glacier Access Control with Vault Access Policies.

", + "smithy.api#examples": [ + { + "title": "To delete the vault access policy", + "documentation": "The example deletes the access policy associated with the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/access-policy", @@ -858,6 +966,16 @@ ], "traits": { "smithy.api#documentation": "

This operation deletes the notification configuration set for a vault. The operation\n is eventually consistent; that is, it might take some time for Amazon S3 Glacier to completely\n disable the notifications and you might still receive some notifications for a short time\n after you send the delete request.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access\n Control Using AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Configuring Vault\n Notifications in Amazon S3 Glacier and Delete Vault\n Notification Configuration in the Amazon S3 Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To delete the notification configuration set for a vault", + "documentation": "The example deletes the notification configuration set for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + } + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/{accountId}/vaults/{vaultName}/notification-configuration", @@ -914,6 +1032,28 @@ ], "traits": { "smithy.api#documentation": "

This operation returns information about a job you previously initiated, including\n the job initiation date, the user who initiated the job, the job status code/message and\n the Amazon SNS topic to notify after Amazon S3 Glacier (Glacier) completes the job. For more information\n about initiating a job, see InitiateJob.

\n\n \n

This operation enables you to check the status of your job. However, it is\n strongly recommended that you set up an Amazon SNS topic and specify it in your initiate\n job request so that Glacier can notify the topic after it completes the\n job.

\n
\n\n

A job ID will not expire for at least 24 hours after Glacier completes the\n job.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n\n

For more information about using this operation, \n see the documentation for the underlying REST API Describe Job \n in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To get information about a previously initiated job", + "documentation": "The example returns information about the previously initiated job specified by the job ID.", + "input": { + "accountId": "-", + "vaultName": "my-vault", + "jobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4Cn" + }, + "output": { + "InventoryRetrievalParameters": { + "Format": "JSON" + }, + "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault", + "Completed": false, + "JobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW", + "Action": "InventoryRetrieval", + "CreationDate": "2015-07-17T20:23:41.616Z", + "StatusCode": "InProgress" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/jobs/{jobId}", @@ -978,6 +1118,23 @@ ], "traits": { "smithy.api#documentation": "

This operation returns information about a vault, including the vault's Amazon\n Resource Name (ARN), the date the vault was created, the number of archives it contains,\n and the total size of all the archives in the vault. The number of archives and their total\n size are as of the last inventory generation. This means that if you add or remove an\n archive from a vault, and then immediately use Describe Vault, the change in contents will\n not be immediately reflected. If you want to retrieve the latest inventory of the vault,\n use InitiateJob. Amazon S3 Glacier generates vault inventories approximately\n daily. For more information, see Downloading a Vault Inventory in\n Amazon S3 Glacier.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Retrieving Vault Metadata in\n Amazon S3 Glacier and Describe Vault in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To retrieve information about a vault", + "documentation": "The example retrieves data about a vault named my-vault.", + "input": { + "vaultName": "my-vault", + "accountId": "-" + }, + "output": { + "SizeInBytes": 0, + "VaultARN": "arn:aws:glacier:us-west-2:111122223333:vaults/my-vault", + "NumberOfArchives": 0, + "CreationDate": "2016-09-23T19:27:18.665Z", + "VaultName": "my-vault" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}", @@ -1190,6 +1347,25 @@ ], "traits": { "smithy.api#documentation": "

This operation returns the current data retrieval policy for the account and region\n specified in the GET request. For more information about data retrieval policies, see\n Amazon Glacier Data Retrieval Policies.

", + "smithy.api#examples": [ + { + "title": "To get the current data retrieval policy for an account", + "documentation": "The example returns the current data retrieval policy for the account.", + "input": { + "accountId": "-" + }, + "output": { + "Policy": { + "Rules": [ + { + "BytesPerHour": 10737418240, + "Strategy": "BytesPerHour" + } + ] + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/policies/data-retrieval", @@ -1253,6 +1429,24 @@ ], "traits": { "smithy.api#documentation": "

This operation downloads the output of the job you initiated using InitiateJob. Depending on the job type you specified when you initiated the\n job, the output will be either the content of an archive or a vault inventory.

\n\n

You can download all the job output or download a portion of the output by specifying\n a byte range. In the case of an archive retrieval job, depending on the byte range you\n specify, Amazon S3 Glacier (Glacier) returns the checksum for the portion of the data. You can compute the\n checksum on the client and verify that the values match to ensure the portion you downloaded\n is the correct data.

\n

A job ID will not expire for at least 24 hours after Glacier completes the job. That\n a byte range. For both archive and inventory retrieval jobs, you should verify the downloaded \n size against the size returned in the headers from the \n Get Job Output response.

\n

For archive retrieval jobs, you should also verify that the size is what you expected. If\n you download a portion of the output, the expected size is based on the range of bytes\n you specified. For example, if you specify a range of bytes=0-1048575, you should\n verify your download size is 1,048,576 bytes. If you download an entire archive, the\n expected size is the size of the archive when you uploaded it to Amazon S3 Glacier\n The expected size is also returned in the headers from the \n Get Job Output response.

\n

In the case of an archive retrieval job, depending on the byte range you\n specify, Glacier returns the checksum for the portion of the data. To ensure the portion you downloaded \n is the correct data, compute the checksum on the client, verify that the values match, \n and verify that the size is what you expected.

\n \n

A job ID does not expire for at least 24 hours after Glacier completes the\n job. That is, you can download the job output within the 24 hours period after Amazon\n Glacier completes the job.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and the underlying REST API, see Downloading a\n Vault Inventory, Downloading an\n Archive, and Get Job Output \n

", + "smithy.api#examples": [ + { + "title": "To get the output of a previously initiated job", + "documentation": "The example downloads the output of a previously initiated inventory retrieval job that is identified by the job ID.", + "input": { + "accountId": "-", + "vaultName": "my-vaul", + "jobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW", + "range": "" + }, + "output": { + "status": 200, + "acceptRanges": "bytes", + "contentType": "application/json", + "body": "inventory-data" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/jobs/{jobId}/output", @@ -1384,6 +1578,21 @@ ], "traits": { "smithy.api#documentation": "

This operation retrieves the access-policy subresource set on the vault;\n for more information on setting this subresource, see Set Vault Access Policy\n (PUT access-policy). If there is no access policy set on the vault, the\n operation returns a 404 Not found error. For more information about vault\n access policies, see Amazon Glacier Access Control\n with Vault Access Policies.

", + "smithy.api#examples": [ + { + "title": "To get the access-policy set on the vault", + "documentation": "The example retrieves the access-policy set on the vault named example-vault.", + "input": { + "accountId": "-", + "vaultName": "example-vault" + }, + "output": { + "policy": { + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-owner-access-rights\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\"}]}" + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/access-policy", @@ -1456,6 +1665,22 @@ ], "traits": { "smithy.api#documentation": "

This operation retrieves the following attributes from the lock-policy\n subresource set on the specified vault:

\n
    \n
  • \n

    The vault lock policy set on the vault.

    \n
  • \n
  • \n

    The state of the vault lock, which is either InProgess or\n Locked.

    \n
  • \n
  • \n

    When the lock ID expires. The lock ID is used to complete the vault locking\n process.

    \n
  • \n
  • \n

    When the vault lock was initiated and put into the InProgress\n state.

    \n
  • \n
\n\n

A vault lock is put into the InProgress state by calling InitiateVaultLock. A vault lock is put into the Locked state by\n calling CompleteVaultLock. You can abort the vault locking process by\n calling AbortVaultLock. For more information about the vault locking\n process, Amazon\n Glacier Vault Lock.

\n

If there is no vault lock policy set on the vault, the operation returns a 404\n Not found error. For more information about vault lock policies, Amazon\n Glacier Access Control with Vault Lock Policies.

", + "smithy.api#examples": [ + { + "title": "To retrieve vault lock-policy related attributes that are set on a vault", + "documentation": "The example retrieves the attributes from the lock-policy subresource set on the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + }, + "output": { + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-vault-lock\",\"Effect\":\"Deny\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\",\"Condition\":{\"NumericLessThanEquals\":{\"glacier:ArchiveAgeinDays\":\"365\"}}}]}", + "State": "InProgress", + "ExpirationDate": "exampledate", + "CreationDate": "exampledate" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/lock-policy", @@ -1545,6 +1770,25 @@ ], "traits": { "smithy.api#documentation": "

This operation retrieves the notification-configuration subresource of\n the specified vault.

\n\n

For information about setting a notification configuration on a vault, see SetVaultNotifications. If a notification configuration for a vault is not\n set, the operation returns a 404 Not Found error. For more information about\n vault notifications, see Configuring Vault\n Notifications in Amazon S3 Glacier.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Configuring Vault\n Notifications in Amazon S3 Glacier and Get Vault Notification\n Configuration in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To get the notification-configuration for the specified vault", + "documentation": "The example retrieves the notification-configuration for the vault named my-vault.", + "input": { + "accountId": "-", + "vaultName": "my-vault" + }, + "output": { + "vaultNotificationConfig": { + "Events": [ + "InventoryRetrievalCompleted", + "ArchiveRetrievalCompleted" + ], + "SNSTopic": "arn:aws:sns:us-west-2:0123456789012:my-vault" + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/notification-configuration", @@ -1756,7 +2000,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1774,318 +2017,283 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://glacier-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://glacier-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://glacier.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" }, - { - "conditions": [], - "endpoint": { - "url": "https://glacier-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "aws-us-gov" ] } - ] + ], + "endpoint": { + "url": "https://glacier.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://glacier-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://glacier.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://glacier.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://glacier.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://glacier.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -3006,6 +3214,26 @@ ], "traits": { "smithy.api#documentation": "

This operation initiates a job of the specified type, which can be a select, an archival retrieval,\n or a vault retrieval. For more information about using this operation, \n see the documentation for the underlying REST API Initiate\n a Job.\n

", + "smithy.api#examples": [ + { + "title": "To initiate an inventory-retrieval job", + "documentation": "The example initiates an inventory-retrieval job for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "jobParameters": { + "Type": "inventory-retrieval", + "Description": "My inventory job", + "Format": "CSV", + "SNSTopic": "arn:aws:sns:us-west-2:111111111111:Glacier-InventoryRetrieval-topic-Example" + } + }, + "output": { + "location": "/111122223333/vaults/examplevault/jobs/HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP54ZShjoQzQVVh7vEXAMPLEjobID", + "jobId": " HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP54ZShjoQzQVVh7vEXAMPLEjobID" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/jobs", @@ -3099,6 +3327,21 @@ ], "traits": { "smithy.api#documentation": "

This operation initiates a multipart upload. Amazon S3 Glacier creates a multipart\n upload resource and returns its ID in the response. The multipart upload ID is used in\n subsequent requests to upload parts of an archive (see UploadMultipartPart).

\n\n

When you initiate a multipart upload, you specify the part size in number of bytes.\n The part size must be a megabyte (1024 KB) multiplied by a power of 2-for example, 1048576\n (1 MB), 2097152 (2 MB), 4194304 (4 MB), 8388608 (8 MB), and so on. The minimum allowable\n part size is 1 MB, and the maximum is 4 GB.

\n\n

Every part you upload to this resource (see UploadMultipartPart),\n except the last one, must have the same size. The last one can be the same size or smaller.\n For example, suppose you want to upload a 16.2 MB file. If you initiate the multipart\n upload with a part size of 4 MB, you will upload four parts of 4 MB each and one part of\n 0.2 MB.

\n\n \n

You don't need to know the size of the archive when you start a multipart upload\n because Amazon S3 Glacier does not require you to specify the overall archive\n size.

\n
\n\n

After you complete the multipart upload, Amazon S3 Glacier (Glacier) removes the multipart upload\n resource referenced by the ID. Glacier also removes the multipart upload resource if\n you cancel the multipart upload or it may be removed if there is no activity for a period\n of 24 hours.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Uploading Large Archives in\n Parts (Multipart Upload) and Initiate Multipart\n Upload in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To initiate a multipart upload", + "documentation": "The example initiates a multipart upload to a vault named my-vault with a part size of 1 MiB (1024 x 1024 bytes) per file.", + "input": { + "accountId": "-", + "partSize": "1048576", + "vaultName": "my-vault" + }, + "output": { + "location": "/111122223333/vaults/my-vault/multipart-uploads/19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ", + "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads", @@ -3192,6 +3435,22 @@ ], "traits": { "smithy.api#documentation": "

This operation initiates the vault locking process by doing the following:

\n
    \n
  • \n

    Installing a vault lock policy on the specified vault.

    \n
  • \n
  • \n

    Setting the lock state of vault lock to InProgress.

    \n
  • \n
  • \n

    Returning a lock ID, which is used to complete the vault locking\n process.

    \n
  • \n
\n\n

You can set one vault lock policy for each vault and this policy can be up to 20 KB\n in size. For more information about vault lock policies, see Amazon Glacier Access Control with\n Vault Lock Policies.

\n

You must complete the vault locking process within 24 hours after the vault lock\n enters the InProgress state. After the 24 hour window ends, the lock ID\n expires, the vault automatically exits the InProgress state, and the vault\n lock policy is removed from the vault. You call CompleteVaultLock to\n complete the vault locking process by setting the state of the vault lock to\n Locked.

\n

After a vault lock is in the Locked state, you cannot initiate a new\n vault lock for the vault.

\n\n

You can abort the vault locking process by calling AbortVaultLock.\n You can get the state of the vault lock by calling GetVaultLock. For more\n information about the vault locking process, Amazon Glacier Vault\n Lock.

\n\n

If this operation is called when the vault lock is in the InProgress\n state, the operation returns an AccessDeniedException error. When the vault\n lock is in the InProgress state you must call AbortVaultLock\n before you can initiate a new vault lock policy.

", + "smithy.api#examples": [ + { + "title": "To initiate the vault locking process", + "documentation": "The example initiates the vault locking process for the vault named my-vault.", + "input": { + "accountId": "-", + "vaultName": "my-vault", + "policy": { + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-vault-lock\",\"Effect\":\"Deny\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\",\"Condition\":{\"NumericLessThanEquals\":{\"glacier:ArchiveAgeinDays\":\"365\"}}}]}" + } + }, + "output": { + "lockId": "AE863rKkWZU53SLW5be4DUcW" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/lock-policy", @@ -3504,6 +3763,46 @@ ], "traits": { "smithy.api#documentation": "

This operation lists jobs for a vault, including jobs that are in-progress and jobs\n that have recently finished. The List Job operation returns a list of these jobs sorted by job initiation\n time.

\n\n \n

Amazon Glacier retains recently completed jobs for a period before deleting them;\n however, it eventually removes completed jobs. The output of completed jobs can be\n retrieved. Retaining completed jobs for a period of time after they have completed\n enables you to get a job output in the event you miss the job completion notification or\n your first attempt to download it fails. For example, suppose you start an archive\n retrieval job to download an archive. After the job completes, you start to download the\n archive but encounter a network error. In this scenario, you can retry and download the\n archive while the job exists.

\n
\n\n

The List Jobs operation supports pagination. You should always check the response Marker field. \n If there are no more jobs to list, the Marker field is set to null. If there are more jobs to list, \n the Marker field is set to a non-null value, which you can use to continue the pagination of the list. \n To return a list of jobs that begins at a specific job, \n set the marker request parameter to the Marker value for that job that you obtained from a previous List Jobs request.

\n \n

You can set a maximum limit for the number of jobs returned in the response by\n specifying the limit parameter in the request. The default limit is 50. The\n number of jobs returned might be fewer than the limit, but the number of returned jobs\n never exceeds the limit.

\n\n

Additionally, you can filter the jobs list returned by specifying the optional\n statuscode parameter or completed parameter, or both. Using\n the statuscode parameter, you can specify to return only jobs that match\n either the InProgress, Succeeded, or Failed status.\n Using the completed parameter, you can specify to return only jobs that were\n completed (true) or jobs that were not completed\n (false).

\n\n

For more information about using this operation, \n see the documentation for the underlying REST API List Jobs.

", + "smithy.api#examples": [ + { + "title": "To list jobs for a vault", + "documentation": "The example lists jobs for the vault named my-vault.", + "input": { + "accountId": "-", + "vaultName": "my-vault" + }, + "output": { + "JobList": [ + { + "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault", + "RetrievalByteRange": "0-3145727", + "SNSTopic": "arn:aws:sns:us-west-2:0123456789012:my-vault", + "Completed": false, + "SHA256TreeHash": "9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67", + "JobId": "l7IL5-EkXyEY9Ws95fClzIbk2O5uLYaFdAYOi-azsX_Z8V6NH4yERHzars8wTKYQMX6nBDI9cMNHzyZJO59-8N9aHWav", + "ArchiveId": "kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw", + "JobDescription": "Retrieve archive on 2015-07-17", + "ArchiveSizeInBytes": 3145728, + "Action": "ArchiveRetrieval", + "ArchiveSHA256TreeHash": "9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67", + "CreationDate": "2015-07-17T21:16:13.840Z", + "StatusCode": "InProgress" + }, + { + "InventoryRetrievalParameters": { + "Format": "JSON" + }, + "VaultARN": "arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault", + "Completed": false, + "JobId": "zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW", + "Action": "InventoryRetrieval", + "CreationDate": "2015-07-17T20:23:41.616Z", + "StatusCode": "InProgress" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/jobs", @@ -3615,6 +3914,42 @@ ], "traits": { "smithy.api#documentation": "

This operation lists in-progress multipart uploads for the specified vault. An\n in-progress multipart upload is a multipart upload that has been initiated by an InitiateMultipartUpload request, but has not yet been completed or aborted.\n The list returned in the List Multipart Upload response has no guaranteed order.

\n\n

The List Multipart Uploads operation supports pagination. By default, this operation\n returns up to 50 multipart uploads in the response. You should always check the response\n for a marker at which to continue the list; if there are no more items the\n marker is null. To return a list of multipart uploads that\n begins at a specific upload, set the marker request parameter to the value you\n obtained from a previous List Multipart Upload request. You can also limit the number of\n uploads returned in the response by specifying the limit parameter in the\n request.

\n\n

Note the difference between this operation and listing parts (ListParts). The List Multipart Uploads operation lists all multipart uploads\n for a vault and does not require a multipart upload ID. The List Parts operation requires a\n multipart upload ID since parts are associated with a single upload.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n\n

For conceptual information and the underlying REST API, see Working\n with Archives in Amazon S3 Glacier and List Multipart Uploads\n in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To list all the in-progress multipart uploads for a vault", + "documentation": "The example lists all the in-progress multipart uploads for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + }, + "output": { + "Marker": "null", + "UploadsList": [ + { + "ArchiveDescription": "archive 1", + "CreationDate": "2012-03-19T23:20:59.130Z", + "MultipartUploadId": "xsQdFIRsfJr20CW2AbZBKpRZAFTZSJIMtL2hYf8mvp8dM0m4RUzlaqoEye6g3h3ecqB_zqwB7zLDMeSWhwo65re4C4Ev", + "PartSizeInBytes": 4194304, + "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault" + }, + { + "ArchiveDescription": "archive 2", + "CreationDate": "2012-04-01T15:00:00.000Z", + "MultipartUploadId": "nPyGOnyFcx67qqX7E-0tSGiRi88hHMOwOxR-_jNyM6RjVMFfV29lFqZ3rNsSaWBugg6OP92pRtufeHdQH7ClIpSF6uJc", + "PartSizeInBytes": 4194304, + "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault" + }, + { + "ArchiveDescription": "archive 3", + "CreationDate": "2012-03-20T17:03:43.221Z", + "MultipartUploadId": "qt-RBst_7yO8gVIonIBsAxr2t-db0pE4s8MNeGjKjGdNpuU-cdSAcqG62guwV9r5jh5mLyFPzFEitTpNE7iQfHiu1XoV", + "PartSizeInBytes": 4194304, + "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/examplevault" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads", @@ -3712,6 +4047,35 @@ ], "traits": { "smithy.api#documentation": "

This operation lists the parts of an archive that have been uploaded in a specific\n multipart upload. You can make this request at any time during an in-progress multipart\n upload before you complete the upload (see CompleteMultipartUpload. List\n Parts returns an error for completed uploads. The list returned in the List Parts response\n is sorted by part range.

\n\n

The List Parts operation supports pagination. By default, this operation returns up\n to 50 uploaded parts in the response. You should always check the response for a\n marker at which to continue the list; if there are no more items the\n marker is null. To return a list of parts that begins at a\n specific part, set the marker request parameter to the value you obtained from\n a previous List Parts request. You can also limit the number of parts returned in the\n response by specifying the limit parameter in the request.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and the underlying REST API, see Working\n with Archives in Amazon S3 Glacier and List Parts in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To list the parts of an archive that have been uploaded in a multipart upload", + "documentation": "The example lists all the parts of a multipart upload.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "uploadId": "OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE" + }, + "output": { + "ArchiveDescription": "archive description", + "CreationDate": "2012-03-20T17:03:43.221Z", + "Marker": "null", + "MultipartUploadId": "OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE", + "PartSizeInBytes": 4194304, + "Parts": [ + { + "RangeInBytes": "0-4194303", + "SHA256TreeHash": "01d34dabf7be316472c93b1ef80721f5d4" + }, + { + "RangeInBytes": "4194304-8388607", + "SHA256TreeHash": "0195875365afda349fc21c84c099987164" + } + ], + "VaultARN": "arn:aws:glacier:us-west-2:012345678901:vaults/demo1-vault" + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}", @@ -3845,6 +4209,29 @@ ], "traits": { "smithy.api#documentation": "

This operation lists the provisioned capacity units for the specified AWS\n account.

", + "smithy.api#examples": [ + { + "title": "To list the provisioned capacity units for an account", + "documentation": "The example lists the provisioned capacity units for an account.", + "input": { + "accountId": "-" + }, + "output": { + "ProvisionedCapacityList": [ + { + "CapacityId": "zSaq7NzHFQDANTfQkDen4V7z", + "StartDate": "2016-11-11T20:11:51.095Z", + "ExpirationDate": "2016-12-12T00:00:00.000Z" + }, + { + "CapacityId": "yXaq7NzHFQNADTfQkDen4V7z", + "StartDate": "2016-12-13T20:11:51.095Z", + "ExpirationDate": "2017-01-15T00:00:00.000Z" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/provisioned-capacity", @@ -3906,6 +4293,22 @@ ], "traits": { "smithy.api#documentation": "

This operation lists all the tags attached to a vault. The operation returns an empty\n map if there are no tags. For more information about tags, see Tagging Amazon S3 Glacier\n Resources.

", + "smithy.api#examples": [ + { + "title": "To list the tags for a vault", + "documentation": "The example lists all the tags attached to the vault examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault" + }, + "output": { + "Tags": { + "date": "july2015", + "id": "1234" + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{accountId}/vaults/{vaultName}/tags", @@ -4252,6 +4655,18 @@ ], "traits": { "smithy.api#documentation": "

This operation purchases a provisioned capacity unit for an AWS account.

", + "smithy.api#examples": [ + { + "title": "To purchases a provisioned capacity unit for an AWS account", + "documentation": "The example purchases provisioned capacity unit for an AWS account.", + "input": { + "accountId": "-" + }, + "output": { + "capacityId": "zSaq7NzHFQDANTfQkDen4V7z" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/provisioned-capacity", @@ -4331,6 +4746,20 @@ ], "traits": { "smithy.api#documentation": "

This operation removes one or more tags from the set of tags attached to a vault. For\n more information about tags, see Tagging Amazon S3 Glacier Resources.\n This operation is idempotent. The operation will be successful, even if there are no tags\n attached to the vault.

", + "smithy.api#examples": [ + { + "title": "To remove tags from a vault", + "documentation": "The example removes two tags from the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "TagKeys": [ + "examplekey1", + "examplekey2" + ] + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/tags?operation=remove", @@ -4562,6 +4991,23 @@ ], "traits": { "smithy.api#documentation": "

This operation sets and then enacts a data retrieval policy in the region specified\n in the PUT request. You can set one policy per region for an AWS account. The policy is\n enacted within a few minutes of a successful PUT operation.

\n

The set policy operation does not affect retrieval jobs that were in progress before\n the policy was enacted. For more information about data retrieval policies, see Amazon\n Glacier Data Retrieval Policies.

", + "smithy.api#examples": [ + { + "title": "To set and then enact a data retrieval policy ", + "documentation": "The example sets and then enacts a data retrieval policy.", + "input": { + "accountId": "-", + "Policy": { + "Rules": [ + { + "Strategy": "BytesPerHour", + "BytesPerHour": 10737418240 + } + ] + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/policies/data-retrieval", @@ -4616,6 +5062,19 @@ ], "traits": { "smithy.api#documentation": "

This operation configures an access policy for a vault and will overwrite an existing\n policy. To configure a vault access policy, send a PUT request to the\n access-policy subresource of the vault. An access policy is specific to a\n vault and is also called a vault subresource. You can set one access policy per vault and\n the policy can be up to 20 KB in size. For more information about vault access policies,\n see Amazon Glacier Access Control with Vault Access Policies.

", + "smithy.api#examples": [ + { + "title": "To set the access-policy on a vault", + "documentation": "The example configures an access policy for the vault named examplevault.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "policy": { + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Define-owner-access-rights\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::999999999999:root\"},\"Action\":\"glacier:DeleteArchive\",\"Resource\":\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\"}]}" + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/vaults/{vaultName}/access-policy", @@ -4679,6 +5138,23 @@ ], "traits": { "smithy.api#documentation": "

This operation configures notifications that will be sent when specific events happen\n to a vault. By default, you don't get any notifications.

\n\n

To configure vault notifications, send a PUT request to the\n notification-configuration subresource of the vault. The request should\n include a JSON document that provides an Amazon SNS topic and specific events for which you\n want Amazon S3 Glacier to send notifications to the topic.

\n\n

Amazon SNS topics must grant permission to the vault to be allowed to publish\n notifications to the topic. You can configure a vault to publish a notification for the\n following vault events:

\n\n
    \n
  • \n

    \n ArchiveRetrievalCompleted This event occurs when a\n job that was initiated for an archive retrieval is completed (InitiateJob). The status of the completed job can be \"Succeeded\" or\n \"Failed\". The notification sent to the SNS topic is the same output as returned from\n DescribeJob.

    \n
  • \n
  • \n\n

    \n InventoryRetrievalCompleted This event occurs when a\n job that was initiated for an inventory retrieval is completed (InitiateJob). The status of the completed job can be \"Succeeded\" or\n \"Failed\". The notification sent to the SNS topic is the same output as returned from\n DescribeJob.

    \n
  • \n
\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Configuring Vault\n Notifications in Amazon S3 Glacier and Set Vault Notification\n Configuration in the Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To configure a vault to post a message to an Amazon SNS topic when jobs complete", + "documentation": "The example sets the examplevault notification configuration.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "vaultNotificationConfig": { + "Events": [ + "ArchiveRetrievalCompleted", + "InventoryRetrievalCompleted" + ], + "SNSTopic": "arn:aws:sns:us-west-2:012345678901:mytopic" + } + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/vaults/{vaultName}/notification-configuration", @@ -4844,6 +5320,24 @@ ], "traits": { "smithy.api#documentation": "

This operation adds an archive to a vault. This is a synchronous operation, and for a\n successful upload, your data is durably persisted. Amazon S3 Glacier returns the archive ID in\n the x-amz-archive-id header of the response.

\n\n

You must use the archive ID to access your data in Amazon S3 Glacier. After you upload\n an archive, you should save the archive ID returned so that you can retrieve or delete the\n archive later. Besides saving the archive ID, you can also index it and give it a friendly\n name to allow for better searching. You can also use the optional archive description field\n to specify how the archive is referred to in an external index of archives, such as you\n might create in Amazon DynamoDB. You can also get the vault inventory to obtain a list of\n archive IDs in a vault. For more information, see InitiateJob.

\n\n

You must provide a SHA256 tree hash of the data you are uploading. For information\n about computing a SHA256 tree hash, see Computing Checksums.

\n\n

You can optionally specify an archive description of up to 1,024 printable ASCII\n characters. You can get the archive description when you either retrieve the archive or get\n the vault inventory. For more information, see InitiateJob. Amazon\n Glacier does not interpret the description in any way. An archive description does not need\n to be unique. You cannot use the description to retrieve or sort the archive list.

\n\n

Archives are immutable. After you upload an archive, you cannot edit the archive or\n its description.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Uploading an Archive in Amazon\n Glacier and Upload Archive in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To upload an archive", + "documentation": "The example adds an archive to a vault.", + "input": { + "vaultName": "my-vault", + "accountId": "-", + "archiveDescription": "", + "checksum": "", + "body": "example-data-to-upload" + }, + "output": { + "archiveId": "kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw", + "checksum": "969fb39823836d81f0cc028195fcdbcbbe76cdde932d4646fa7de5f21e18aa67", + "location": "/0123456789012/vaults/my-vault/archives/kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw" + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{accountId}/vaults/{vaultName}/archives", @@ -4964,6 +5458,23 @@ ], "traits": { "smithy.api#documentation": "

This operation uploads a part of an archive. You can upload archive parts in any\n order. You can also upload them in parallel. You can upload up to 10,000 parts for a\n multipart upload.

\n\n

Amazon Glacier rejects your upload part request if any of the following conditions is\n true:

\n\n
    \n
  • \n

    \n SHA256 tree hash does not matchTo ensure that part\n data is not corrupted in transmission, you compute a SHA256 tree hash of the part and\n include it in your request. Upon receiving the part data, Amazon S3 Glacier also\n computes a SHA256 tree hash. If these hash values don't match, the operation fails.\n For information about computing a SHA256 tree hash, see Computing\n Checksums.

    \n
  • \n
  • \n

    \n Part size does not matchThe size of each part except\n the last must match the size specified in the corresponding InitiateMultipartUpload request. The size of the last part must be the\n same size as, or smaller than, the specified size.

    \n \n

    If you upload a part whose size is smaller than the part size you specified\n in your initiate multipart upload request and that part is not the last part, then\n the upload part request will succeed. However, the subsequent Complete Multipart\n Upload request will fail.

    \n
    \n
  • \n
  • \n

    \n Range does not alignThe byte range value in the\n request does not align with the part size specified in the corresponding initiate\n request. For example, if you specify a part size of 4194304 bytes (4 MB), then 0 to\n 4194303 bytes (4 MB - 1) and 4194304 (4 MB) to 8388607 (8 MB - 1) are valid part\n ranges. However, if you set a range value of 2 MB to 6 MB, the range does not align\n with the part size and the upload will fail.

    \n
  • \n
\n\n

This operation is idempotent. If you upload the same part multiple times, the data\n included in the most recent request overwrites the previously uploaded data.

\n\n

An AWS account has full permission to perform all operations (actions). However, AWS\n Identity and Access Management (IAM) users don't have any permissions by default. You must\n grant them explicit permission to perform specific actions. For more information, see\n Access Control Using\n AWS Identity and Access Management (IAM).

\n

For conceptual information and underlying REST API, see Uploading Large Archives in\n Parts (Multipart Upload) and Upload Part in the\n Amazon Glacier Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To upload the first part of an archive", + "documentation": "The example uploads the first 1 MiB (1024 x 1024 bytes) part of an archive.", + "input": { + "accountId": "-", + "vaultName": "examplevault", + "uploadId": "19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ", + "checksum": "c06f7cd4baacb087002a99a5f48bf953", + "range": "bytes 0-1048575/*", + "body": "part1" + }, + "output": { + "checksum": "c06f7cd4baacb087002a99a5f48bf953" + } + } + ], "smithy.api#http": { "method": "PUT", "uri": "/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}", diff --git a/aws/sdk/aws-models/iam.json b/aws/sdk/aws-models/iam.json index 3f222206c62..21fb32cfd9b 100644 --- a/aws/sdk/aws-models/iam.json +++ b/aws/sdk/aws-models/iam.json @@ -222,6 +222,9 @@ { "target": "com.amazonaws.iam#GetLoginProfile" }, + { + "target": "com.amazonaws.iam#GetMFADevice" + }, { "target": "com.amazonaws.iam#GetOpenIDConnectProvider" }, @@ -567,7 +570,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -585,650 +587,666 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://iam-fips.amazonaws.com", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-east-1" } - ], - "endpoint": { - "url": "https://iam-fips.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-cn" + "name" ] }, + "aws-cn" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.cn-north-1.amazonaws.com.cn", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "cn-north-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.cn-north-1.amazonaws.com.cn", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "cn-north-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-gov-west-1" } - ], - "endpoint": { - "url": "https://iam.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-gov-west-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso" + "name" ] }, + "aws-iso" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-iso-east-1.c2s.ic.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-iso-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-iso-east-1.c2s.ic.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-iso-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso-b" + "name" ] }, + "aws-iso-b" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://iam.us-isob-east-1.sc2s.sgov.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "iam", - "signingRegion": "us-isob-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-isob-east-1.sc2s.sgov.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-isob-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseFIPS" + "ref": "PartitionResult" }, - true + "name" ] }, + "aws-iso-f" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://iam-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://iam.us-isof-south-1.csp.hci.ic.gov", + "properties": { + "authSchemes": [ { - "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "name": "sigv4", + "signingName": "iam", + "signingRegion": "us-isof-south-1" } ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } - ], - "type": "tree", - "rules": [ + ] + }, + { + "fn": "booleanEquals", + "argv": [ + true, { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "getAttr", + "argv": [ { - "conditions": [], - "endpoint": { - "url": "https://iam-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://iam-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" - } + "ref": "UseFIPS" + }, + true ] - }, + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { - "conditions": [ + "conditions": [], + "endpoint": { + "url": "https://iam-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://iam.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://iam.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://iam.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://iam.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1975,7 +1993,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds a new client ID (also known as audience) to the list of client IDs already\n registered for the specified IAM OpenID Connect (OIDC) provider resource.

\n

This operation is idempotent; it does not fail or return an error if you add an\n existing client ID to the provider.

" + "smithy.api#documentation": "

Adds a new client ID (also known as audience) to the list of client IDs already\n registered for the specified IAM OpenID Connect (OIDC) provider resource.

\n

This operation is idempotent; it does not fail or return an error if you add an\n existing client ID to the provider.

", + "smithy.api#examples": [ + { + "title": "To add a client ID (audience) to an Open-ID Connect (OIDC) provider", + "documentation": "The following add-client-id-to-open-id-connect-provider command adds the client ID my-application-ID to the OIDC provider named server.example.com:", + "input": { + "ClientID": "my-application-ID", + "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/server.example.com" + } + } + ] } }, "com.amazonaws.iam#AddClientIDToOpenIDConnectProviderRequest": { @@ -2026,7 +2054,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds the specified IAM role to the specified instance profile. An instance profile\n can contain only one role, and this quota cannot be increased. You can remove the\n existing role and then add a different role to an instance profile. You must then wait\n for the change to appear across all of Amazon Web Services because of eventual\n consistency. To force the change, you must disassociate the instance profile and then associate the\n instance profile, or you can stop your instance and then restart it.

\n \n

The caller of this operation must be granted the PassRole permission\n on the IAM role by a permissions policy.

\n
\n

For more information about roles, see Working with roles. For more\n information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Adds the specified IAM role to the specified instance profile. An instance profile\n can contain only one role, and this quota cannot be increased. You can remove the\n existing role and then add a different role to an instance profile. You must then wait\n for the change to appear across all of Amazon Web Services because of eventual\n consistency. To force the change, you must disassociate the instance profile and then associate the\n instance profile, or you can stop your instance and then restart it.

\n \n

The caller of this operation must be granted the PassRole permission\n on the IAM role by a permissions policy.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a role to an instance profile", + "documentation": "The following command adds the role named S3Access to the instance profile named Webserver:", + "input": { + "RoleName": "S3Access", + "InstanceProfileName": "Webserver" + } + } + ] } }, "com.amazonaws.iam#AddRoleToInstanceProfileRequest": { @@ -2071,7 +2109,17 @@ } ], "traits": { - "smithy.api#documentation": "

Adds the specified user to the specified group.

" + "smithy.api#documentation": "

Adds the specified user to the specified group.

", + "smithy.api#examples": [ + { + "title": "To add a user to an IAM group", + "documentation": "The following command adds an IAM user named Bob to the IAM group named Admins:", + "input": { + "UserName": "Bob", + "GroupName": "Admins" + } + } + ] } }, "com.amazonaws.iam#AddUserToGroupRequest": { @@ -2128,7 +2176,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM group.

\n

You use this operation to attach a managed policy to a group. To embed an inline\n policy in a group, use PutGroupPolicy.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM group.

\n

You use this operation to attach a managed policy to a group. To embed an inline\n policy in a group, use \n PutGroupPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM group", + "documentation": "The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM group named Finance.", + "input": { + "GroupName": "Finance", + "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess" + } + } + ] } }, "com.amazonaws.iam#AttachGroupPolicyRequest": { @@ -2182,7 +2240,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM role. When you attach a\n managed policy to a role, the managed policy becomes part of the role's permission\n (access) policy.

\n \n

You cannot use a managed policy as the role's trust policy. The role's trust\n policy is created at the same time as the role, using CreateRole.\n You can update a role's trust policy using UpdateAssumeRolePolicy.

\n
\n

Use this operation to attach a managed policy to a role. To embed\n an inline policy in a role, use PutRolePolicy. For more information\n about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified IAM role. When you attach a\n managed policy to a role, the managed policy becomes part of the role's permission\n (access) policy.

\n \n

You cannot use a managed policy as the role's trust policy. The role's trust\n policy is created at the same time as the role, using \n CreateRole\n . You can update a role's trust policy using\n \n UpdateAssumerolePolicy\n .

\n
\n

Use this operation to attach a managed policy to a role. To embed\n an inline policy in a role, use \n PutRolePolicy\n . For more information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM role", + "documentation": "The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM role named ReadOnlyRole.", + "input": { + "RoleName": "ReadOnlyRole", + "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess" + } + } + ] } }, "com.amazonaws.iam#AttachRolePolicyRequest": { @@ -2233,7 +2301,17 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches the specified managed policy to the specified user.

\n

You use this operation to attach a managed policy to a user. To\n embed an inline policy in a user, use PutUserPolicy.

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Attaches the specified managed policy to the specified user.

\n

You use this operation to attach a managed policy to a user. To\n embed an inline policy in a user, use \n PutUserPolicy\n .

\n

As a best practice, you can validate your IAM policies. \n To learn more, see Validating IAM policies \n in the IAM User Guide.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To attach a managed policy to an IAM user", + "documentation": "The following command attaches the AWS managed policy named AdministratorAccess to the IAM user named Alice.", + "input": { + "UserName": "Alice", + "PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess" + } + } + ] } }, "com.amazonaws.iam#AttachUserPolicyRequest": { @@ -2301,6 +2379,35 @@ "smithy.api#sensitive": {} } }, + "com.amazonaws.iam#CertificationKeyType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 128 + }, + "smithy.api#pattern": "^[\\u0020-\\u00FF]+$" + } + }, + "com.amazonaws.iam#CertificationMapType": { + "type": "map", + "key": { + "target": "com.amazonaws.iam#CertificationKeyType" + }, + "value": { + "target": "com.amazonaws.iam#CertificationValueType" + } + }, + "com.amazonaws.iam#CertificationValueType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1, + "max": 32 + }, + "smithy.api#pattern": "^[\\u0020-\\u00FF]+$" + } + }, "com.amazonaws.iam#ChangePassword": { "type": "operation", "input": { @@ -2330,7 +2437,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the password of the IAM user who is calling this operation. This operation\n can be performed using the CLI, the Amazon Web Services API, or the My\n Security Credentials page in the Amazon Web Services Management Console. The Amazon Web Services account root user password is\n not affected by this operation.

\n

Use UpdateLoginProfile to use the CLI, the Amazon Web Services API, or the\n Users page in the IAM console to change the\n password for any IAM user. For more information about modifying passwords, see Managing\n passwords in the IAM User Guide.

" + "smithy.api#documentation": "

Changes the password of the IAM user who is calling this operation. This operation\n can be performed using the CLI, the Amazon Web Services API, or the My\n Security Credentials page in the Amazon Web Services Management Console. The Amazon Web Services account root user password is\n not affected by this operation.

\n

Use UpdateLoginProfile to use the CLI, the Amazon Web Services API, or the\n Users page in the IAM console to change the\n password for any IAM user. For more information about modifying passwords, see Managing\n passwords in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To change the password for your IAM user", + "documentation": "The following command changes the password for the current IAM user.", + "input": { + "NewPassword": "]35d/{pB9Fo9wJ", + "OldPassword": "3s0K_;xh4~8XXI" + } + } + ] } }, "com.amazonaws.iam#ChangePasswordRequest": { @@ -2534,7 +2651,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new Amazon Web Services secret access key and corresponding Amazon Web Services access key ID for the\n specified user. The default status for new keys is Active.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials. This is true even if the Amazon Web Services account has no associated users.

\n

For information about quotas on the number of keys you can create, see IAM and STS\n quotas in the IAM User Guide.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation. You must save the key (for example, in a text\n file) if you want to be able to access it again. If a secret key is lost, you can\n delete the access keys for the associated user and then create new keys.

\n
" + "smithy.api#documentation": "

Creates a new Amazon Web Services secret access key and corresponding Amazon Web Services access key ID for the\n specified user. The default status for new keys is Active.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials. This is true even if the Amazon Web Services account has no associated users.

\n

For information about quotas on the number of keys you can create, see IAM and STS\n quotas in the IAM User Guide.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation. You must save the key (for example, in a text\n file) if you want to be able to access it again. If a secret key is lost, you can\n delete the access keys for the associated user and then create new keys.

\n
", + "smithy.api#examples": [ + { + "title": "To create an access key for an IAM user", + "documentation": "The following command creates an access key (access key ID and secret access key) for the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "AccessKey": { + "UserName": "Bob", + "Status": "Active", + "CreateDate": "2015-03-09T18:39:23.411Z", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + } + ] } }, "com.amazonaws.iam#CreateAccessKeyRequest": { @@ -2590,7 +2725,16 @@ } ], "traits": { - "smithy.api#documentation": "

Creates an alias for your Amazon Web Services account. For information about using an Amazon Web Services account\n alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

" + "smithy.api#documentation": "

Creates an alias for your Amazon Web Services account. For information about using an Amazon Web Services account\n alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To create an account alias", + "documentation": "The following command associates the alias examplecorp to your AWS account.", + "input": { + "AccountAlias": "examplecorp" + } + } + ] } }, "com.amazonaws.iam#CreateAccountAliasRequest": { @@ -2631,7 +2775,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new group.

\n

For information about the number of groups you can create, see IAM and STS\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new group.

\n

For information about the number of groups you can create, see IAM and STS\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM group", + "documentation": "The following command creates an IAM group named Admins.", + "input": { + "GroupName": "Admins" + }, + "output": { + "Group": { + "Path": "/", + "CreateDate": "2015-03-09T20:30:24.940Z", + "GroupId": "AIDGPMS9RO4H3FEXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/Admins", + "GroupName": "Admins" + } + } + } + ] } }, "com.amazonaws.iam#CreateGroupRequest": { @@ -2697,7 +2859,26 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new instance profile. For information about instance profiles, see Using\n roles for applications on Amazon EC2 in the\n IAM User Guide, and Instance profiles in the Amazon EC2 User Guide.

\n

For information about the number of instance profiles you can create, see IAM object\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new instance profile. For information about instance profiles, see Using\n roles for applications on Amazon EC2 in the\n IAM User Guide, and Instance profiles in the Amazon EC2 User Guide.

\n

For information about the number of instance profiles you can create, see IAM object\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following command creates an instance profile named Webserver that is ready to have a role attached and then be associated with an EC2 instance.", + "input": { + "InstanceProfileName": "Webserver" + }, + "output": { + "InstanceProfile": { + "InstanceProfileId": "AIPAJMBYC7DLSPEXAMPLE", + "Roles": [], + "CreateDate": "2015-03-09T20:33:19.626Z", + "InstanceProfileName": "Webserver", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:instance-profile/Webserver" + } + } + } + ] } }, "com.amazonaws.iam#CreateInstanceProfileRequest": { @@ -2769,7 +2950,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a password for the specified IAM user. A password allows an IAM user to\n access Amazon Web Services services through the Amazon Web Services Management Console.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to create a password for any IAM user. Use ChangePassword to update your own existing password in the My Security Credentials page in the Amazon Web Services Management Console.

\n

For more information about managing passwords, see Managing passwords in the\n IAM User Guide.

" + "smithy.api#documentation": "

Creates a password for the specified IAM user. A password allows an IAM user to\n access Amazon Web Services services through the Amazon Web Services Management Console.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to create a password for any IAM user. Use ChangePassword to update your own existing password in the My Security Credentials page in the Amazon Web Services Management Console.

\n

For more information about managing passwords, see Managing passwords in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following command changes IAM user Bob's password and sets the flag that required Bob to change the password the next time he signs in.", + "input": { + "UserName": "Bob", + "Password": "h]6EszR}vJ*m", + "PasswordResetRequired": true + }, + "output": { + "LoginProfile": { + "UserName": "Bob", + "CreateDate": "2015-03-10T20:55:40.274Z", + "PasswordResetRequired": true + } + } + } + ] } }, "com.amazonaws.iam#CreateLoginProfileRequest": { @@ -2843,7 +3042,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates an IAM entity to describe an identity provider (IdP) that supports OpenID Connect (OIDC).

\n

The OIDC provider that you create with this operation can be used as a principal in a\n role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\n the OIDC provider.

\n

If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\n need to create a separate IAM identity provider. These OIDC identity providers are\n already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\n to creating new roles using your identity provider. To learn more, see Creating\n a role for web identity or OpenID connect federation in the IAM\n User Guide.

\n

When you create the IAM OIDC provider, you specify the following:

\n
    \n
  • \n

    The URL of the OIDC identity provider (IdP) to trust

    \n
  • \n
  • \n

    A list of client IDs (also known as audiences) that identify the application\n or applications allowed to authenticate using the OIDC provider

    \n
  • \n
  • \n

    A list of tags that are attached to the specified IAM OIDC provider

    \n
  • \n
  • \n

    A list of thumbprints of one or more server certificates that the IdP\n uses

    \n
  • \n
\n

You get all of this information from the OIDC IdP you want to use to access\n Amazon Web Services.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Google, Auth0,\n and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In these\n cases, your legacy thumbprint remains in your configuration, but is no longer used for\n validation.

\n
\n \n

The trust for the OIDC provider is derived from the IAM provider that this\n operation creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider operation to highly privileged\n users.

\n
" + "smithy.api#documentation": "

Creates an IAM entity to describe an identity provider (IdP) that supports OpenID Connect (OIDC).

\n

The OIDC provider that you create with this operation can be used as a principal in a\n role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\n the OIDC provider.

\n

If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\n need to create a separate IAM identity provider. These OIDC identity providers are\n already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\n to creating new roles using your identity provider. To learn more, see Creating\n a role for web identity or OpenID connect federation in the IAM\n User Guide.

\n

When you create the IAM OIDC provider, you specify the following:

\n
    \n
  • \n

    The URL of the OIDC identity provider (IdP) to trust

    \n
  • \n
  • \n

    A list of client IDs (also known as audiences) that identify the application\n or applications allowed to authenticate using the OIDC provider

    \n
  • \n
  • \n

    A list of tags that are attached to the specified IAM OIDC provider

    \n
  • \n
  • \n

    A list of thumbprints of one or more server certificates that the IdP\n uses

    \n
  • \n
\n

You get all of this information from the OIDC IdP you want to use to access\n Amazon Web Services.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted root certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Auth0, GitHub,\n Google, and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In\n these cases, your legacy thumbprint remains in your configuration, but is no longer used\n for validation.

\n
\n \n

The trust for the OIDC provider is derived from the IAM provider that this\n operation creates. Therefore, it is best to limit access to the CreateOpenIDConnectProvider operation to highly privileged\n users.

\n
", + "smithy.api#examples": [ + { + "title": "To create an instance profile", + "documentation": "The following example defines a new OIDC provider in IAM with a client ID of my-application-id and pointing at the server with a URL of https://server.example.com.", + "input": { + "ClientIDList": [ + "my-application-id" + ], + "ThumbprintList": [ + "3768084dfb3d2b68b7897bf5f565da8efEXAMPLE" + ], + "Url": "https://server.example.com" + }, + "output": { + "OpenIDConnectProviderArn": "arn:aws:iam::123456789012:oidc-provider/server.example.com" + } + } + ] } }, "com.amazonaws.iam#CreateOpenIDConnectProviderRequest": { @@ -3090,7 +3307,28 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new role for your Amazon Web Services account. For more information about roles, see\n IAM\n roles. For information about quotas for role names and the number of roles\n you can create, see IAM and STS quotas in the\n IAM User Guide.

" + "smithy.api#documentation": "

Creates a new role for your Amazon Web Services account.

\n

For more information about roles, see IAM roles in the\n IAM User Guide. For information about quotas for role names\n and the number of roles you can create, see IAM and STS quotas in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM role", + "documentation": "The following command creates a role named Test-Role and attaches a trust policy that you must convert from JSON to a string. Upon success, the response includes the same policy as a URL-encoded JSON string.", + "input": { + "AssumeRolePolicyDocument": "", + "Path": "/", + "RoleName": "Test-Role" + }, + "output": { + "Role": { + "Arn": "arn:aws:iam::123456789012:role/Test-Role", + "AssumeRolePolicyDocument": "", + "CreateDate": "2013-06-07T20:43:32.821Z", + "Path": "/", + "RoleId": "AKIAIOSFODNN7EXAMPLE", + "RoleName": "Test-Role" + } + } + } + ] } }, "com.amazonaws.iam#CreateRoleRequest": { @@ -3394,7 +3632,25 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new IAM user for your Amazon Web Services account.

\n

For information about quotas for the number of IAM users you can create, see IAM and STS\n quotas in the IAM User Guide.

" + "smithy.api#documentation": "

Creates a new IAM user for your Amazon Web Services account.

\n

For information about quotas for the number of IAM users you can create, see IAM and STS\n quotas in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To create an IAM user", + "documentation": "The following create-user command creates an IAM user named Bob in the current account.", + "input": { + "UserName": "Bob" + }, + "output": { + "User": { + "UserName": "Bob", + "Path": "/", + "CreateDate": "2013-06-08T03:20:41.270Z", + "UserId": "AKIAIOSFODNN7EXAMPLE", + "Arn": "arn:aws:iam::123456789012:user/Bob" + } + } + } + ] } }, "com.amazonaws.iam#CreateUserRequest": { @@ -3639,7 +3895,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the access key pair associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated users.

" + "smithy.api#documentation": "

Deletes the access key pair associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated users.

", + "smithy.api#examples": [ + { + "title": "To delete an access key for an IAM user", + "documentation": "The following command deletes one access key (access key ID and secret access key) assigned to the IAM user named Bob.", + "input": { + "UserName": "Bob", + "AccessKeyId": "AKIDPMS9RO4H3FEXAMPLE" + } + } + ] } }, "com.amazonaws.iam#DeleteAccessKeyRequest": { @@ -3686,7 +3952,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified Amazon Web Services account alias. For information about using an Amazon Web Services\n account alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

" + "smithy.api#documentation": "

Deletes the specified Amazon Web Services account alias. For information about using an Amazon Web Services\n account alias, see Creating, deleting, and\n listing an Amazon Web Services account alias in the Amazon Web Services Sign-In User\n Guide.

", + "smithy.api#examples": [ + { + "title": "To delete an account alias", + "documentation": "The following command removes the alias mycompany from the current AWS account:", + "input": { + "AccountAlias": "mycompany" + } + } + ] } }, "com.amazonaws.iam#DeleteAccountAliasRequest": { @@ -3724,7 +3999,13 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the password policy for the Amazon Web Services account. There are no parameters.

" + "smithy.api#documentation": "

Deletes the password policy for the Amazon Web Services account. There are no parameters.

", + "smithy.api#examples": [ + { + "title": "To delete the current account password policy", + "documentation": "The following command removes the password policy from the current AWS account:" + } + ] } }, "com.amazonaws.iam#DeleteConflictException": { @@ -3790,7 +4071,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n group.

\n

A group can also have managed policies attached to it. To detach a managed policy from\n a group, use DetachGroupPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n group.

\n

A group can also have managed policies attached to it. To detach a managed policy from\n a group, use DetachGroupPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete a policy from an IAM group", + "documentation": "The following command deletes the policy named ExamplePolicy from the group named Admins:", + "input": { + "GroupName": "Admins", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteGroupPolicyRequest": { @@ -3853,7 +4144,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified instance profile. The instance profile must not have an\n associated role.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the instance\n profile you are about to delete. Deleting a role or instance profile that is\n associated with a running instance will break any applications running on the\n instance.

\n
\n

For more information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Deletes the specified instance profile. The instance profile must not have an\n associated role.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the instance\n profile you are about to delete. Deleting a role or instance profile that is\n associated with a running instance will break any applications running on the\n instance.

\n
\n

For more information about instance profiles, see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To delete an instance profile", + "documentation": "The following command deletes the instance profile named ExampleInstanceProfile", + "input": { + "InstanceProfileName": "ExampleInstanceProfile" + } + } + ] } }, "com.amazonaws.iam#DeleteInstanceProfileRequest": { @@ -3894,7 +4194,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the password for the specified IAM user, For more information, see Managing\n passwords for IAM users.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to delete a password for any IAM user. You can use ChangePassword to update, but not delete, your own password in the\n My Security Credentials page in the\n Amazon Web Services Management Console.

\n \n

Deleting a user's password does not prevent a user from accessing Amazon Web Services through\n the command line interface or the API. To prevent all user access, you must also\n either make any access keys inactive or delete them. For more information about\n making keys inactive or deleting them, see UpdateAccessKey and\n DeleteAccessKey.

\n
" + "smithy.api#documentation": "

Deletes the password for the specified IAM user, For more information, see Managing\n passwords for IAM users.

\n

You can use the CLI, the Amazon Web Services API, or the Users\n page in the IAM console to delete a password for any IAM user. You can use ChangePassword to update, but not delete, your own password in the\n My Security Credentials page in the\n Amazon Web Services Management Console.

\n \n

Deleting a user's password does not prevent a user from accessing Amazon Web Services through\n the command line interface or the API. To prevent all user access, you must also\n either make any access keys inactive or delete them. For more information about\n making keys inactive or deleting them, see UpdateAccessKey and\n DeleteAccessKey.

\n
", + "smithy.api#examples": [ + { + "title": "To delete a password for an IAM user", + "documentation": "The following command deletes the password for the IAM user named Bob.", + "input": { + "UserName": "Bob" + } + } + ] } }, "com.amazonaws.iam#DeleteLoginProfileRequest": { @@ -4074,7 +4383,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified role. Unlike the Amazon Web Services Management Console, when you delete a role\n programmatically, you must delete the items attached to the role manually, or the\n deletion fails. For more information, see Deleting an IAM role. Before attempting to delete a role, remove the\n following attached items:

\n \n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to delete. Deleting a role or instance profile that is associated with a\n running instance will break any applications running on the instance.

\n
" + "smithy.api#documentation": "

Deletes the specified role. Unlike the Amazon Web Services Management Console, when you delete a role\n programmatically, you must delete the items attached to the role manually, or the\n deletion fails. For more information, see Deleting an IAM role. Before attempting to delete a role, remove the\n following attached items:

\n \n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to delete. Deleting a role or instance profile that is associated with a\n running instance will break any applications running on the instance.

\n
", + "smithy.api#examples": [ + { + "title": "To delete an IAM role", + "documentation": "The following command removes the role named Test-Role.", + "input": { + "RoleName": "Test-Role" + } + } + ] } }, "com.amazonaws.iam#DeleteRolePermissionsBoundary": { @@ -4138,7 +4456,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n role.

\n

A role can also have managed policies attached to it. To detach a managed policy from\n a role, use DetachRolePolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n role.

\n

A role can also have managed policies attached to it. To detach a managed policy from\n a role, use DetachRolePolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a policy from an IAM role", + "documentation": "The following command removes the policy named ExamplePolicy from the role named Test-Role.", + "input": { + "RoleName": "Test-Role", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteRolePolicyRequest": { @@ -4413,7 +4741,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a signing certificate associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated IAM users.

" + "smithy.api#documentation": "

Deletes a signing certificate associated with the specified IAM user.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID signing the request. This operation works for access keys under\n the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\n user credentials even if the Amazon Web Services account has no associated IAM users.

", + "smithy.api#examples": [ + { + "title": "To delete a signing certificate for an IAM user", + "documentation": "The following command deletes the specified signing certificate for the IAM user named Anika.", + "input": { + "UserName": "Anika", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE" + } + } + ] } }, "com.amazonaws.iam#DeleteSigningCertificateRequest": { @@ -4463,7 +4801,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified IAM user. Unlike the Amazon Web Services Management Console, when you delete a user\n programmatically, you must delete the items attached to the user manually, or the\n deletion fails. For more information, see Deleting an IAM\n user. Before attempting to delete a user, remove the following items:

\n " + "smithy.api#documentation": "

Deletes the specified IAM user. Unlike the Amazon Web Services Management Console, when you delete a user\n programmatically, you must delete the items attached to the user manually, or the\n deletion fails. For more information, see Deleting an IAM\n user. Before attempting to delete a user, remove the following items:

\n ", + "smithy.api#examples": [ + { + "title": "To delete an IAM user", + "documentation": "The following command removes the IAM user named Bob from the current account.", + "input": { + "UserName": "Bob" + } + } + ] } }, "com.amazonaws.iam#DeleteUserPermissionsBoundary": { @@ -4521,7 +4868,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n user.

\n

A user can also have managed policies attached to it. To detach a managed policy from\n a user, use DetachUserPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

" + "smithy.api#documentation": "

Deletes the specified inline policy that is embedded in the specified IAM\n user.

\n

A user can also have managed policies attached to it. To detach a managed policy from\n a user, use DetachUserPolicy. For more information about policies,\n refer to Managed policies and inline\n policies in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a policy from an IAM user", + "documentation": "The following delete-user-policy command removes the specified policy from the IAM user named Juan:", + "input": { + "UserName": "Juan", + "PolicyName": "ExamplePolicy" + } + } + ] } }, "com.amazonaws.iam#DeleteUserPolicyRequest": { @@ -4587,7 +4944,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a virtual MFA device.

\n \n

You must deactivate a user's virtual MFA device before you can delete it. For\n information about deactivating MFA devices, see DeactivateMFADevice.

\n
" + "smithy.api#documentation": "

Deletes a virtual MFA device.

\n \n

You must deactivate a user's virtual MFA device before you can delete it. For\n information about deactivating MFA devices, see DeactivateMFADevice.

\n
", + "smithy.api#examples": [ + { + "title": "To remove a virtual MFA device", + "documentation": "The following delete-virtual-mfa-device command removes the specified MFA device from the current AWS account.", + "input": { + "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleName" + } + } + ] } }, "com.amazonaws.iam#DeleteVirtualMFADeviceRequest": { @@ -5211,7 +5577,19 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a report for service last accessed data for Organizations. You can generate a\n report for any entities (organization root, organizational unit, or account) or policies\n in your organization.

\n

To call this operation, you must be signed in using your Organizations management account\n credentials. You can use your long-term IAM user or root user credentials, or temporary\n credentials from assuming an IAM role. SCPs must be enabled for your organization\n root. You must have the required IAM and Organizations permissions. For more information, see\n Refining permissions using service last accessed data in the\n IAM User Guide.

\n

You can generate a service last accessed data report for entities by specifying only\n the entity's path. This data includes a list of services that are allowed by any service\n control policies (SCPs) that apply to the entity.

\n

You can generate a service last accessed data report for a policy by specifying an\n entity's path and an optional Organizations policy ID. This data includes a list of services that\n are allowed by the specified SCP.

\n

For each service in both report types, the data includes the most recent account\n activity that the policy allows to account principals in the entity or the entity's\n children. For important information about the data, reporting period, permissions\n required, troubleshooting, and supported Regions see Reducing permissions using\n service last accessed data in the\n IAM User Guide.

\n \n

The data includes all attempts to access Amazon Web Services, not just the successful ones. This\n includes all attempts that were made using the Amazon Web Services Management Console, the Amazon Web Services API through any\n of the SDKs, or any of the command line tools. An unexpected entry in the service\n last accessed data does not mean that an account has been compromised, because the\n request might have been denied. Refer to your CloudTrail logs as the authoritative\n source for information about all API calls and whether they were successful or\n denied access. For more information, see Logging IAM events with\n CloudTrail in the IAM User Guide.

\n
\n

This operation returns a JobId. Use this parameter in the \n GetOrganizationsAccessReport\n operation to check the status of\n the report generation. To check the status of this request, use the JobId\n parameter in the \n GetOrganizationsAccessReport\n operation\n and test the JobStatus response parameter. When the job is complete, you\n can retrieve the report.

\n

To generate a service last accessed data report for entities, specify an entity path\n without specifying the optional Organizations policy ID. The type of entity that you specify\n determines the data returned in the report.

\n
    \n
  • \n

    \n Root – When you specify the\n organizations root as the entity, the resulting report lists all of the services\n allowed by SCPs that are attached to your root. For each service, the report\n includes data for all accounts in your organization except the\n management account, because the management account is not limited by SCPs.

    \n
  • \n
  • \n

    \n OU – When you specify an\n organizational unit (OU) as the entity, the resulting report lists all of the\n services allowed by SCPs that are attached to the OU and its parents. For each\n service, the report includes data for all accounts in the OU or its children.\n This data excludes the management account, because the management account is not\n limited by SCPs.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. For each service, the report includes\n data for only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account as the entity, the resulting report lists all of the services allowed by\n SCPs that are attached to the account and its parents. For each service, the\n report includes data for only the specified account.

    \n
  • \n
\n

To generate a service last accessed data report for policies, specify an entity path\n and the optional Organizations policy ID. The type of entity that you specify determines the data\n returned for each service.

\n
    \n
  • \n

    \n Root – When you specify the root\n entity and a policy ID, the resulting report lists all of the services that are\n allowed by the specified SCP. For each service, the report includes data for all\n accounts in your organization to which the SCP applies. This data excludes the\n management account, because the management account is not limited by SCPs. If the\n SCP is not attached to any entities in the organization, then the report will\n return a list of services with no data.

    \n
  • \n
  • \n

    \n OU – When you specify an OU entity and\n a policy ID, the resulting report lists all of the services that are allowed by\n the specified SCP. For each service, the report includes data for all accounts\n in the OU or its children to which the SCP applies. This means that other\n accounts outside the OU that are affected by the SCP might not be included in\n the data. This data excludes the management account, because the\n management account is not limited by SCPs. If the SCP is not attached to the OU\n or one of its children, the report will return a list of services with no\n data.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. If you specify a policy ID in the CLI\n or API, the policy is ignored. For each service, the report includes data for\n only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account entity and a policy ID, the resulting report lists all of the services\n that are allowed by the specified SCP. For each service, the report includes\n data for only the specified account. This means that other accounts in the\n organization that are affected by the SCP might not be included in the data. If\n the SCP is not attached to the account, the report will return a list of\n services with no data.

    \n
  • \n
\n \n

Service last accessed data does not use other policy types when determining\n whether a principal could access a service. These other policy types include\n identity-based policies, resource-based policies, access control lists, IAM\n permissions boundaries, and STS assume role policies. It only applies SCP logic.\n For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service last accessed data, see Reducing policy scope by\n viewing user activity in the IAM User Guide.

" + "smithy.api#documentation": "

Generates a report for service last accessed data for Organizations. You can generate a\n report for any entities (organization root, organizational unit, or account) or policies\n in your organization.

\n

To call this operation, you must be signed in using your Organizations management account\n credentials. You can use your long-term IAM user or root user credentials, or temporary\n credentials from assuming an IAM role. SCPs must be enabled for your organization\n root. You must have the required IAM and Organizations permissions. For more information, see\n Refining permissions using service last accessed data in the\n IAM User Guide.

\n

You can generate a service last accessed data report for entities by specifying only\n the entity's path. This data includes a list of services that are allowed by any service\n control policies (SCPs) that apply to the entity.

\n

You can generate a service last accessed data report for a policy by specifying an\n entity's path and an optional Organizations policy ID. This data includes a list of services that\n are allowed by the specified SCP.

\n

For each service in both report types, the data includes the most recent account\n activity that the policy allows to account principals in the entity or the entity's\n children. For important information about the data, reporting period, permissions\n required, troubleshooting, and supported Regions see Reducing permissions using\n service last accessed data in the\n IAM User Guide.

\n \n

The data includes all attempts to access Amazon Web Services, not just the successful ones. This\n includes all attempts that were made using the Amazon Web Services Management Console, the Amazon Web Services API through any\n of the SDKs, or any of the command line tools. An unexpected entry in the service\n last accessed data does not mean that an account has been compromised, because the\n request might have been denied. Refer to your CloudTrail logs as the authoritative\n source for information about all API calls and whether they were successful or\n denied access. For more information, see Logging IAM events with\n CloudTrail in the IAM User Guide.

\n
\n

This operation returns a JobId. Use this parameter in the \n GetOrganizationsAccessReport\n operation to check the status of\n the report generation. To check the status of this request, use the JobId\n parameter in the \n GetOrganizationsAccessReport\n operation\n and test the JobStatus response parameter. When the job is complete, you\n can retrieve the report.

\n

To generate a service last accessed data report for entities, specify an entity path\n without specifying the optional Organizations policy ID. The type of entity that you specify\n determines the data returned in the report.

\n
    \n
  • \n

    \n Root – When you specify the\n organizations root as the entity, the resulting report lists all of the services\n allowed by SCPs that are attached to your root. For each service, the report\n includes data for all accounts in your organization except the\n management account, because the management account is not limited by SCPs.

    \n
  • \n
  • \n

    \n OU – When you specify an\n organizational unit (OU) as the entity, the resulting report lists all of the\n services allowed by SCPs that are attached to the OU and its parents. For each\n service, the report includes data for all accounts in the OU or its children.\n This data excludes the management account, because the management account is not\n limited by SCPs.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. For each service, the report includes\n data for only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account as the entity, the resulting report lists all of the services allowed by\n SCPs that are attached to the account and its parents. For each service, the\n report includes data for only the specified account.

    \n
  • \n
\n

To generate a service last accessed data report for policies, specify an entity path\n and the optional Organizations policy ID. The type of entity that you specify determines the data\n returned for each service.

\n
    \n
  • \n

    \n Root – When you specify the root\n entity and a policy ID, the resulting report lists all of the services that are\n allowed by the specified SCP. For each service, the report includes data for all\n accounts in your organization to which the SCP applies. This data excludes the\n management account, because the management account is not limited by SCPs. If the\n SCP is not attached to any entities in the organization, then the report will\n return a list of services with no data.

    \n
  • \n
  • \n

    \n OU – When you specify an OU entity and\n a policy ID, the resulting report lists all of the services that are allowed by\n the specified SCP. For each service, the report includes data for all accounts\n in the OU or its children to which the SCP applies. This means that other\n accounts outside the OU that are affected by the SCP might not be included in\n the data. This data excludes the management account, because the\n management account is not limited by SCPs. If the SCP is not attached to the OU\n or one of its children, the report will return a list of services with no\n data.

    \n
  • \n
  • \n

    \n management account – When you specify the\n management account, the resulting report lists all Amazon Web Services services, because the\n management account is not limited by SCPs. If you specify a policy ID in the CLI\n or API, the policy is ignored. For each service, the report includes data for\n only the management account.

    \n
  • \n
  • \n

    \n Account – When you specify another\n account entity and a policy ID, the resulting report lists all of the services\n that are allowed by the specified SCP. For each service, the report includes\n data for only the specified account. This means that other accounts in the\n organization that are affected by the SCP might not be included in the data. If\n the SCP is not attached to the account, the report will return a list of\n services with no data.

    \n
  • \n
\n \n

Service last accessed data does not use other policy types when determining\n whether a principal could access a service. These other policy types include\n identity-based policies, resource-based policies, access control lists, IAM\n permissions boundaries, and STS assume role policies. It only applies SCP logic.\n For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service last accessed data, see Reducing policy scope by\n viewing user activity in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To generate a service last accessed data report for an organizational unit", + "documentation": "The following operation generates a report for the organizational unit ou-rge0-awexample", + "input": { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example" + }, + "output": { + "JobId": "examplea-1234-b567-cde8-90fg123abcd4" + } + } + ] } }, "com.amazonaws.iam#GenerateOrganizationsAccessReportRequest": { @@ -5266,7 +5644,19 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a report that includes details about when an IAM resource (user, group,\n role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\n usually appears within four hours. IAM reports activity for at least the last 400\n days, or less if your Region began supporting this feature within the last year. For\n more information, see Regions where data is tracked.

\n \n

The service last accessed data includes all attempts to access an Amazon Web Services API, not\n just the successful ones. This includes all attempts that were made using the\n Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\n An unexpected entry in the service last accessed data does not mean that your\n account has been compromised, because the request might have been denied. Refer to\n your CloudTrail logs as the authoritative source for information about all API calls\n and whether they were successful or denied access. For more information, see Logging\n IAM events with CloudTrail in the\n IAM User Guide.

\n
\n

The GenerateServiceLastAccessedDetails operation returns a\n JobId. Use this parameter in the following operations to retrieve the\n following details from your report:

\n
    \n
  • \n

    \n GetServiceLastAccessedDetails – Use this operation\n for users, groups, roles, or policies to list every Amazon Web Services service that the\n resource could access using permissions policies. For each service, the response\n includes information about the most recent access attempt.

    \n

    The JobId returned by\n GenerateServiceLastAccessedDetail must be used by the same role\n within a session, or by the same user when used to call\n GetServiceLastAccessedDetail.

    \n
  • \n
  • \n

    \n GetServiceLastAccessedDetailsWithEntities – Use this\n operation for groups and policies to list information about the associated\n entities (users or roles) that attempted to access a specific Amazon Web Services service.\n

    \n
  • \n
\n

To check the status of the GenerateServiceLastAccessedDetails request,\n use the JobId parameter in the same operations and test the\n JobStatus response parameter.

\n

For additional information about the permissions policies that allow an identity\n (user, group, or role) to access specific services, use the ListPoliciesGrantingServiceAccess operation.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

" + "smithy.api#documentation": "

Generates a report that includes details about when an IAM resource (user, group,\n role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\n usually appears within four hours. IAM reports activity for at least the last 400\n days, or less if your Region began supporting this feature within the last year. For\n more information, see Regions where data is tracked. For more information about services and\n actions for which action last accessed information is displayed, see IAM\n action last accessed information services and actions.

\n \n

The service last accessed data includes all attempts to access an Amazon Web Services API, not\n just the successful ones. This includes all attempts that were made using the\n Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\n An unexpected entry in the service last accessed data does not mean that your\n account has been compromised, because the request might have been denied. Refer to\n your CloudTrail logs as the authoritative source for information about all API calls\n and whether they were successful or denied access. For more information, see Logging\n IAM events with CloudTrail in the\n IAM User Guide.

\n
\n

The GenerateServiceLastAccessedDetails operation returns a\n JobId. Use this parameter in the following operations to retrieve the\n following details from your report:

\n
    \n
  • \n

    \n GetServiceLastAccessedDetails – Use this operation\n for users, groups, roles, or policies to list every Amazon Web Services service that the\n resource could access using permissions policies. For each service, the response\n includes information about the most recent access attempt.

    \n

    The JobId returned by\n GenerateServiceLastAccessedDetail must be used by the same role\n within a session, or by the same user when used to call\n GetServiceLastAccessedDetail.

    \n
  • \n
  • \n

    \n GetServiceLastAccessedDetailsWithEntities – Use this\n operation for groups and policies to list information about the associated\n entities (users or roles) that attempted to access a specific Amazon Web Services service.\n

    \n
  • \n
\n

To check the status of the GenerateServiceLastAccessedDetails request,\n use the JobId parameter in the same operations and test the\n JobStatus response parameter.

\n

For additional information about the permissions policies that allow an identity\n (user, group, or role) to access specific services, use the ListPoliciesGrantingServiceAccess operation.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To generate a service last accessed data report for a policy", + "documentation": "The following operation generates a report for the policy: ExamplePolicy1", + "input": { + "Arn": "arn:aws:iam::123456789012:policy/ExamplePolicy1" + }, + "output": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7" + } + } + ] } }, "com.amazonaws.iam#GenerateServiceLastAccessedDetailsRequest": { @@ -5312,11 +5702,6 @@ "output": { "target": "com.amazonaws.iam#GetAccessKeyLastUsedResponse" }, - "errors": [ - { - "target": "com.amazonaws.iam#NoSuchEntityException" - } - ], "traits": { "smithy.api#documentation": "

Retrieves information about when the specified access key was last used. The\n information includes the date and time of last use, along with the Amazon Web Services service and\n Region that were specified in the last request made with that key.

" } @@ -5468,7 +5853,27 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the password policy for the Amazon Web Services account. This tells you the complexity\n requirements and mandatory rotation periods for the IAM user passwords in your account.\n For more information about using a password policy, see Managing an IAM password\n policy.

" + "smithy.api#documentation": "

Retrieves the password policy for the Amazon Web Services account. This tells you the complexity\n requirements and mandatory rotation periods for the IAM user passwords in your account.\n For more information about using a password policy, see Managing an IAM password\n policy.

", + "smithy.api#examples": [ + { + "title": "To see the current account password policy", + "documentation": "The following command displays details about the password policy for the current AWS account.", + "output": { + "PasswordPolicy": { + "AllowUsersToChangePassword": false, + "RequireNumbers": true, + "RequireLowercaseCharacters": false, + "RequireUppercaseCharacters": false, + "MinimumPasswordLength": 8, + "RequireSymbols": true, + "ExpirePasswords": false, + "PasswordReusePrevention": 12, + "MaxPasswordAge": 90, + "HardExpiry": false + } + } + } + ] } }, "com.amazonaws.iam#GetAccountPasswordPolicyResponse": { @@ -5501,7 +5906,43 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about IAM entity usage and IAM quotas in the Amazon Web Services\n account.

\n

For information about IAM quotas, see IAM and STS quotas in the\n IAM User Guide.

" + "smithy.api#documentation": "

Retrieves information about IAM entity usage and IAM quotas in the Amazon Web Services\n account.

\n

For information about IAM quotas, see IAM and STS quotas in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get information about IAM entity quotas and usage in the current account", + "documentation": "The following command returns information about the IAM entity quotas and usage in the current AWS account.", + "output": { + "SummaryMap": { + "Users": 27, + "UsersQuota": 5000, + "Groups": 15, + "GroupsQuota": 100, + "Policies": 8, + "PoliciesQuota": 1000, + "PolicySizeQuota": 5120, + "PolicyVersionsInUse": 22, + "PolicyVersionsInUseQuota": 10000, + "VersionsPerPolicyQuota": 5, + "ServerCertificates": 1, + "ServerCertificatesQuota": 20, + "UserPolicySizeQuota": 2048, + "GroupPolicySizeQuota": 5120, + "GroupsPerUserQuota": 10, + "GlobalEndpointTokenVersion": 2, + "SigningCertificatesPerUserQuota": 2, + "AccessKeysPerUserQuota": 2, + "MFADevices": 6, + "MFADevicesInUse": 3, + "AccountMFAEnabled": 0, + "AccountAccessKeysPresent": 1, + "AccountSigningCertificatesPresent": 0, + "AttachedPoliciesPerGroupQuota": 10, + "AttachedPoliciesPerRoleQuota": 10, + "AttachedPoliciesPerUserQuota": 10 + } + } + } + ] } }, "com.amazonaws.iam#GetAccountSummaryResponse": { @@ -5837,7 +6278,35 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about the specified instance profile, including the instance\n profile's path, GUID, ARN, and role. For more information about instance profiles, see\n About\n instance profiles in the IAM User Guide.

", + "smithy.api#documentation": "

Retrieves information about the specified instance profile, including the instance\n profile's path, GUID, ARN, and role. For more information about instance profiles, see\n Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get information about an instance profile", + "documentation": "The following command gets information about the instance profile named ExampleInstanceProfile.", + "input": { + "InstanceProfileName": "ExampleInstanceProfile" + }, + "output": { + "InstanceProfile": { + "InstanceProfileId": "AID2MAB8DPLSRHEXAMPLE", + "Roles": [ + { + "AssumeRolePolicyDocument": "", + "RoleId": "AIDGPMS9RO4H3FEXAMPLE", + "CreateDate": "2013-01-09T06:33:26Z", + "Path": "/", + "RoleName": "Test-Role", + "Arn": "arn:aws:iam::336924118301:role/Test-Role" + } + ], + "CreateDate": "2013-06-12T23:52:02Z", + "InstanceProfileName": "ExampleInstanceProfile", + "Path": "/", + "Arn": "arn:aws:iam::336924118301:instance-profile/ExampleInstanceProfile" + } + } + } + ], "smithy.waiters#waitable": { "InstanceProfileExists": { "acceptors": [ @@ -5907,7 +6376,22 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the user name for the specified IAM user. A login profile is created when\n you create a password for the user to access the Amazon Web Services Management Console. If the user does not exist\n or does not have a password, the operation returns a 404 (NoSuchEntity)\n error.

\n

If you create an IAM user with access to the console, the CreateDate\n reflects the date you created the initial password for the user.

\n

If you create an IAM user with programmatic access, and then later add a password\n for the user to access the Amazon Web Services Management Console, the CreateDate reflects the initial\n password creation date. A user with programmatic access does not have a login profile\n unless you create a password for the user to access the Amazon Web Services Management Console.

" + "smithy.api#documentation": "

Retrieves the user name for the specified IAM user. A login profile is created when\n you create a password for the user to access the Amazon Web Services Management Console. If the user does not exist\n or does not have a password, the operation returns a 404 (NoSuchEntity)\n error.

\n

If you create an IAM user with access to the console, the CreateDate\n reflects the date you created the initial password for the user.

\n

If you create an IAM user with programmatic access, and then later add a password\n for the user to access the Amazon Web Services Management Console, the CreateDate reflects the initial\n password creation date. A user with programmatic access does not have a login profile\n unless you create a password for the user to access the Amazon Web Services Management Console.

", + "smithy.api#examples": [ + { + "title": "To get password information for an IAM user", + "documentation": "The following command gets information about the password for the IAM user named Anika.", + "input": { + "UserName": "Anika" + }, + "output": { + "LoginProfile": { + "UserName": "Anika", + "CreateDate": "2012-09-21T23:03:39Z" + } + } + } + ] } }, "com.amazonaws.iam#GetLoginProfileRequest": { @@ -5916,8 +6400,65 @@ "UserName": { "target": "com.amazonaws.iam#userNameType", "traits": { - "smithy.api#documentation": "

The name of the user whose login profile you want to retrieve.

\n

This parameter allows (through its regex pattern) a string of characters consisting of upper and lowercase alphanumeric \n characters with no spaces. You can also include any of the following characters: _+=,.@-

", - "smithy.api#required": {} + "smithy.api#documentation": "

The name of the user whose login profile you want to retrieve.

\n

This parameter allows (through its regex pattern) a string of characters consisting of upper and lowercase alphanumeric \n characters with no spaces. You can also include any of the following characters: _+=,.@-

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.iam#GetLoginProfileResponse": { + "type": "structure", + "members": { + "LoginProfile": { + "target": "com.amazonaws.iam#LoginProfile", + "traits": { + "smithy.api#documentation": "

A structure containing the user name and the profile creation date for the\n user.

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#documentation": "

Contains the response to a successful GetLoginProfile request.\n

", + "smithy.api#output": {} + } + }, + "com.amazonaws.iam#GetMFADevice": { + "type": "operation", + "input": { + "target": "com.amazonaws.iam#GetMFADeviceRequest" + }, + "output": { + "target": "com.amazonaws.iam#GetMFADeviceResponse" + }, + "errors": [ + { + "target": "com.amazonaws.iam#NoSuchEntityException" + }, + { + "target": "com.amazonaws.iam#ServiceFailureException" + } + ], + "traits": { + "smithy.api#documentation": "

Retrieves information about an MFA device for a specified user.

" + } + }, + "com.amazonaws.iam#GetMFADeviceRequest": { + "type": "structure", + "members": { + "SerialNumber": { + "target": "com.amazonaws.iam#serialNumberType", + "traits": { + "smithy.api#documentation": "

Serial number that uniquely identifies the MFA device. For this API, we only accept\n FIDO security key ARNs.

", + "smithy.api#required": {} + } + }, + "UserName": { + "target": "com.amazonaws.iam#userNameType", + "traits": { + "smithy.api#documentation": "

The friendly name identifying the user.

" } } }, @@ -5925,19 +6466,36 @@ "smithy.api#input": {} } }, - "com.amazonaws.iam#GetLoginProfileResponse": { + "com.amazonaws.iam#GetMFADeviceResponse": { "type": "structure", "members": { - "LoginProfile": { - "target": "com.amazonaws.iam#LoginProfile", + "UserName": { + "target": "com.amazonaws.iam#userNameType", "traits": { - "smithy.api#documentation": "

A structure containing the user name and the profile creation date for the\n user.

", + "smithy.api#documentation": "

The friendly name identifying the user.

" + } + }, + "SerialNumber": { + "target": "com.amazonaws.iam#serialNumberType", + "traits": { + "smithy.api#documentation": "

Serial number that uniquely identifies the MFA device. For this API, we only accept\n FIDO security key ARNs.

", "smithy.api#required": {} } + }, + "EnableDate": { + "target": "com.amazonaws.iam#dateType", + "traits": { + "smithy.api#documentation": "

The date that a specified user's MFA device was first enabled.

" + } + }, + "Certifications": { + "target": "com.amazonaws.iam#CertificationMapType", + "traits": { + "smithy.api#documentation": "

The certifications of a specified user's MFA device. We currently provide FIPS-140-2,\n FIPS-140-3, and FIDO certification levels obtained from FIDO Alliance Metadata Service\n (MDS).

" + } } }, "traits": { - "smithy.api#documentation": "

Contains the response to a successful GetLoginProfile request.\n

", "smithy.api#output": {} } }, @@ -6032,7 +6590,47 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the service last accessed data report for Organizations that was previously\n generated using the \n GenerateOrganizationsAccessReport\n \n operation. This operation retrieves the status of your report job and the report\n contents.

\n

Depending on the parameters that you passed when you generated the report, the data\n returned could include different information. For details, see GenerateOrganizationsAccessReport.

\n

To call this operation, you must be signed in to the management account in your\n organization. SCPs must be enabled for your organization root. You must have permissions\n to perform this operation. For more information, see Refining permissions using\n service last accessed data in the\n IAM User Guide.

\n

For each service that principals in an account (root user, IAM users, or IAM roles)\n could access using SCPs, the operation returns details about the most recent access\n attempt. If there was no attempt, the service is listed without details about the most\n recent attempt to access the service. If the operation fails, it returns the reason that\n it failed.

\n

By default, the list is sorted by service namespace.

" + "smithy.api#documentation": "

Retrieves the service last accessed data report for Organizations that was previously\n generated using the \n GenerateOrganizationsAccessReport\n \n operation. This operation retrieves the status of your report job and the report\n contents.

\n

Depending on the parameters that you passed when you generated the report, the data\n returned could include different information. For details, see GenerateOrganizationsAccessReport.

\n

To call this operation, you must be signed in to the management account in your\n organization. SCPs must be enabled for your organization root. You must have permissions\n to perform this operation. For more information, see Refining permissions using\n service last accessed data in the\n IAM User Guide.

\n

For each service that principals in an account (root user, IAM users, or IAM roles)\n could access using SCPs, the operation returns details about the most recent access\n attempt. If there was no attempt, the service is listed without details about the most\n recent attempt to access the service. If the operation fails, it returns the reason that\n it failed.

\n

By default, the list is sorted by service namespace.

", + "smithy.api#examples": [ + { + "title": "To get details from a previously generated organizational unit report", + "documentation": "The following operation gets details about the report with the job ID: examplea-1234-b567-cde8-90fg123abcd4", + "input": { + "JobId": "examplea-1234-b567-cde8-90fg123abcd4" + }, + "output": { + "IsTruncated": false, + "JobCompletionDate": "2019-06-18T19:47:35.241Z", + "JobCreationDate": "2019-06-18T19:47:31.466Z", + "JobStatus": "COMPLETED", + "NumberOfServicesAccessible": 3, + "NumberOfServicesNotAccessed": 1, + "AccessDetails": [ + { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/111122223333", + "LastAuthenticatedTime": "2019-05-25T16:29:52Z", + "Region": "us-east-1", + "ServiceName": "Amazon DynamoDB", + "ServiceNamespace": "dynamodb", + "TotalAuthenticatedEntities": 2 + }, + { + "EntityPath": "o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/123456789012", + "LastAuthenticatedTime": "2019-06-15T13:12:06Z", + "Region": "us-east-1", + "ServiceName": "AWS Identity and Access Management", + "ServiceNamespace": "iam", + "TotalAuthenticatedEntities": 4 + }, + { + "ServiceName": "Amazon Simple Storage Service", + "ServiceNamespace": "s3", + "TotalAuthenticatedEntities": 0 + } + ] + } + } + ] } }, "com.amazonaws.iam#GetOrganizationsAccessReportRequest": { @@ -6282,7 +6880,31 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves information about the specified role, including the role's path, GUID, ARN,\n and the role's trust policy that grants permission to assume the role. For more\n information about roles, see Working with roles.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
", + "smithy.api#documentation": "

Retrieves information about the specified role, including the role's path, GUID, ARN,\n and the role's trust policy that grants permission to assume the role. For more\n information about roles, see IAM roles in the\n IAM User Guide.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
", + "smithy.api#examples": [ + { + "title": "To get information about an IAM role", + "documentation": "The following command gets information about the role named Test-Role.", + "input": { + "RoleName": "Test-Role" + }, + "output": { + "Role": { + "Arn": "arn:aws:iam::123456789012:role/Test-Role", + "AssumeRolePolicyDocument": "", + "CreateDate": "2013-04-18T05:01:58Z", + "MaxSessionDuration": 3600, + "Path": "/", + "RoleId": "AROADBQP57FF2AEXAMPLE", + "RoleLastUsed": { + "LastUsedDate": "2019-11-18T05:01:58Z", + "Region": "us-east-1" + }, + "RoleName": "Test-Role" + } + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -6324,7 +6946,7 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves the specified inline policy document that is embedded with the specified\n IAM role.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
\n

An IAM role can also have managed policies attached to it. To retrieve a managed\n policy document that is attached to a role, use GetPolicy to determine\n the policy's default version, then use GetPolicyVersion to retrieve\n the policy document.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

For more information about roles, see Using roles to delegate permissions and\n federate identities.

" + "smithy.api#documentation": "

Retrieves the specified inline policy document that is embedded with the specified\n IAM role.

\n \n

Policies returned by this operation are URL-encoded compliant \n with RFC 3986. You can use a URL \n decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \n can use the decode method of the java.net.URLDecoder utility class in \n the Java SDK. Other languages and SDKs provide similar functionality.

\n
\n

An IAM role can also have managed policies attached to it. To retrieve a managed\n policy document that is attached to a role, use GetPolicy to determine\n the policy's default version, then use GetPolicyVersion to retrieve\n the policy document.

\n

For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

For more information about roles, see IAM roles in the\n IAM User Guide.

" } }, "com.amazonaws.iam#GetRolePolicyRequest": { @@ -6613,7 +7235,36 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves a service last accessed report that was created using the\n GenerateServiceLastAccessedDetails operation. You can use the\n JobId parameter in GetServiceLastAccessedDetails to\n retrieve the status of your report job. When the report is complete, you can retrieve\n the generated report. The report includes a list of Amazon Web Services services that the resource\n (user, group, role, or managed policy) can access.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For each service that the resource could access using permissions policies, the\n operation returns details about the most recent access attempt. If there was no attempt,\n the service is listed without details about the most recent attempt to access the\n service. If the operation fails, the GetServiceLastAccessedDetails\n operation returns the reason that it failed.

\n

The GetServiceLastAccessedDetails operation returns a list of services.\n This list includes the number of entities that have attempted to access the service and\n the date and time of the last attempt. It also returns the ARN of the following entity,\n depending on the resource ARN that you used to generate the report:

\n
    \n
  • \n

    \n User – Returns the user ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Group – Returns the ARN of the group\n member (user) that last attempted to access the service

    \n
  • \n
  • \n

    \n Role – Returns the role ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Policy – Returns the ARN of the user\n or role that last used the policy to attempt to access the service

    \n
  • \n
\n

By default, the list is sorted by service namespace.

\n

If you specified ACTION_LEVEL granularity when you generated the report,\n this operation returns service and action last accessed data. This includes the most\n recent access attempt for each tracked action within a service. Otherwise, this\n operation returns only service data.

\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

" + "smithy.api#documentation": "

Retrieves a service last accessed report that was created using the\n GenerateServiceLastAccessedDetails operation. You can use the\n JobId parameter in GetServiceLastAccessedDetails to\n retrieve the status of your report job. When the report is complete, you can retrieve\n the generated report. The report includes a list of Amazon Web Services services that the resource\n (user, group, role, or managed policy) can access.

\n \n

Service last accessed data does not use other policy types when determining\n whether a resource could access a service. These other policy types include\n resource-based policies, access control lists, Organizations policies, IAM permissions\n boundaries, and STS assume role policies. It only applies permissions policy\n logic. For more about the evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

For each service that the resource could access using permissions policies, the\n operation returns details about the most recent access attempt. If there was no attempt,\n the service is listed without details about the most recent attempt to access the\n service. If the operation fails, the GetServiceLastAccessedDetails\n operation returns the reason that it failed.

\n

The GetServiceLastAccessedDetails operation returns a list of services.\n This list includes the number of entities that have attempted to access the service and\n the date and time of the last attempt. It also returns the ARN of the following entity,\n depending on the resource ARN that you used to generate the report:

\n
    \n
  • \n

    \n User – Returns the user ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Group – Returns the ARN of the group\n member (user) that last attempted to access the service

    \n
  • \n
  • \n

    \n Role – Returns the role ARN that you\n used to generate the report

    \n
  • \n
  • \n

    \n Policy – Returns the ARN of the user\n or role that last used the policy to attempt to access the service

    \n
  • \n
\n

By default, the list is sorted by service namespace.

\n

If you specified ACTION_LEVEL granularity when you generated the report,\n this operation returns service and action last accessed data. This includes the most\n recent access attempt for each tracked action within a service. Otherwise, this\n operation returns only service data.

\n

For more information about service and action last accessed data, see Reducing permissions using service last accessed data in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get details from a previously-generated report", + "documentation": "The following operation gets details about the report with the job ID: examplef-1305-c245-eba4-71fe298bcda7", + "input": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7" + }, + "output": { + "JobStatus": "COMPLETED", + "JobCreationDate": "2018-10-24T19:47:31.466Z", + "ServicesLastAccessed": [ + { + "TotalAuthenticatedEntities": 2, + "LastAuthenticated": "2018-10-24T19:11:00Z", + "ServiceNamespace": "iam", + "LastAuthenticatedEntity": "arn:aws:iam::123456789012:user/AWSExampleUser01", + "ServiceName": "AWS Identity and Access Management" + }, + { + "TotalAuthenticatedEntities": 0, + "ServiceNamespace": "s3", + "ServiceName": "Amazon Simple Storage Service" + } + ], + "JobCompletionDate": "2018-10-24T19:47:35.241Z", + "IsTruncated": false + } + } + ] } }, "com.amazonaws.iam#GetServiceLastAccessedDetailsRequest": { @@ -6721,7 +7372,44 @@ } ], "traits": { - "smithy.api#documentation": "

After you generate a group or policy report using the\n GenerateServiceLastAccessedDetails operation, you can use the\n JobId parameter in\n GetServiceLastAccessedDetailsWithEntities. This operation retrieves the\n status of your report job and a list of entities that could have used group or policy\n permissions to access the specified service.

\n
    \n
  • \n

    \n Group – For a group report, this\n operation returns a list of users in the group that could have used the group’s\n policies in an attempt to access the service.

    \n
  • \n
  • \n

    \n Policy – For a policy report, this\n operation returns a list of entities (users or roles) that could have used the\n policy in an attempt to access the service.

    \n
  • \n
\n

You can also use this operation for user or role reports to retrieve details about\n those entities.

\n

If the operation fails, the GetServiceLastAccessedDetailsWithEntities\n operation returns the reason that it failed.

\n

By default, the list of associated entities is sorted by date, with the most recent\n access listed first.

" + "smithy.api#documentation": "

After you generate a group or policy report using the\n GenerateServiceLastAccessedDetails operation, you can use the\n JobId parameter in\n GetServiceLastAccessedDetailsWithEntities. This operation retrieves the\n status of your report job and a list of entities that could have used group or policy\n permissions to access the specified service.

\n
    \n
  • \n

    \n Group – For a group report, this\n operation returns a list of users in the group that could have used the group’s\n policies in an attempt to access the service.

    \n
  • \n
  • \n

    \n Policy – For a policy report, this\n operation returns a list of entities (users or roles) that could have used the\n policy in an attempt to access the service.

    \n
  • \n
\n

You can also use this operation for user or role reports to retrieve details about\n those entities.

\n

If the operation fails, the GetServiceLastAccessedDetailsWithEntities\n operation returns the reason that it failed.

\n

By default, the list of associated entities is sorted by date, with the most recent\n access listed first.

", + "smithy.api#examples": [ + { + "title": "To get sntity details from a previously-generated report", + "documentation": "The following operation returns details about the entities that attempted to access the IAM service.", + "input": { + "JobId": "examplef-1305-c245-eba4-71fe298bcda7", + "ServiceNamespace": "iam" + }, + "output": { + "JobStatus": "COMPLETED", + "JobCreationDate": "2018-10-24T19:47:31.466Z", + "JobCompletionDate": "2018-10-24T19:47:35.241Z", + "EntityDetailsList": [ + { + "EntityInfo": { + "Id": "AIDAEX2EXAMPLEB6IGCDC", + "Name": "AWSExampleUser01", + "Type": "USER", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:user/AWSExampleUser01" + }, + "LastAuthenticated": "2018-10-24T19:10:00Z" + }, + { + "EntityInfo": { + "Id": "AROAEAEXAMPLEIANXSIU4", + "Name": "AWSExampleRole01", + "Type": "ROLE", + "Path": "/", + "Arn": "arn:aws:iam::123456789012:role/AWSExampleRole01" + } + } + ], + "IsTruncated": false + } + } + ] } }, "com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntitiesRequest": { @@ -6890,6 +7578,24 @@ ], "traits": { "smithy.api#documentation": "

Retrieves information about the specified IAM user, including the user's creation\n date, path, unique ID, and ARN.

\n

If you do not specify a user name, IAM determines the user name implicitly based on\n the Amazon Web Services access key ID used to sign the request to this operation.

", + "smithy.api#examples": [ + { + "title": "To get information about an IAM user", + "documentation": "The following command gets information about the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "User": { + "UserName": "Bob", + "Path": "/", + "CreateDate": "2012-09-21T23:03:13Z", + "UserId": "AKIAIOSFODNN7EXAMPLE", + "Arn": "arn:aws:iam::123456789012:user/Bob" + } + } + } + ], "smithy.api#suppress": [ "WaitableTraitInvalidErrorType" ], @@ -7304,7 +8010,32 @@ } ], "traits": { - "smithy.api#documentation": "

Returns information about the access key IDs associated with the specified IAM user.\n If there is none, the operation returns an empty list.

\n

Although each user is limited to a small number of keys, you can still paginate the\n results using the MaxItems and Marker parameters.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation.

\n
", + "smithy.api#documentation": "

Returns information about the access key IDs associated with the specified IAM user.\n If there is none, the operation returns an empty list.

\n

Although each user is limited to a small number of keys, you can still paginate the\n results using the MaxItems and Marker parameters.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required.

\n

This operation works for access keys under the Amazon Web Services account. If the Amazon Web Services account has\n no associated users, the root user returns it's own access key IDs by running this\n command.

\n \n

To ensure the security of your Amazon Web Services account, the secret access key is accessible\n only during key and user creation.

\n
", + "smithy.api#examples": [ + { + "title": "To list the access key IDs for an IAM user", + "documentation": "The following command lists the access keys IDs for the IAM user named Alice.", + "input": { + "UserName": "Alice" + }, + "output": { + "AccessKeyMetadata": [ + { + "UserName": "Alice", + "Status": "Active", + "CreateDate": "2016-12-01T22:19:58Z", + "AccessKeyId": "AKIA111111111EXAMPLE" + }, + { + "UserName": "Alice", + "Status": "Active", + "CreateDate": "2016-12-01T22:20:01Z", + "AccessKeyId": "AKIA222222222EXAMPLE" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7383,6 +8114,17 @@ ], "traits": { "smithy.api#documentation": "

Lists the account alias associated with the Amazon Web Services account (Note: you can have only\n one). For information about using an Amazon Web Services account alias, see Creating,\n deleting, and listing an Amazon Web Services account alias in the Amazon Web Services Sign-In\n User Guide.

", + "smithy.api#examples": [ + { + "title": "To list account aliases", + "documentation": "The following command lists the aliases for the current account.", + "output": { + "AccountAliases": [ + "exmaple-corporation" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7841,6 +8583,21 @@ ], "traits": { "smithy.api#documentation": "

Lists the names of the inline policies that are embedded in the specified IAM\n group.

\n

An IAM group can also have managed policies attached to it. To list the managed\n policies that are attached to a group, use ListAttachedGroupPolicies.\n For more information about policies, see Managed policies and inline\n policies in the IAM User Guide.

\n

You can paginate the results using the MaxItems and Marker\n parameters. If there are no inline policies embedded with the specified group, the\n operation returns an empty list.

", + "smithy.api#examples": [ + { + "title": "To list the in-line policies for an IAM group", + "documentation": "The following command lists the names of in-line policies that are embedded in the IAM group named Admins.", + "input": { + "GroupName": "Admins" + }, + "output": { + "PolicyNames": [ + "AdminRoot", + "KeyPolicy" + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7920,6 +8677,37 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM groups that have the specified path prefix.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list the IAM groups for the current account", + "documentation": "The following command lists the IAM groups in the current account:", + "output": { + "Groups": [ + { + "Path": "/division_abc/subdivision_xyz/", + "GroupName": "Admins", + "CreateDate": "2016-12-15T21:40:08.121Z", + "GroupId": "AGPA1111111111EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/Admins" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/engineering/", + "GroupName": "Test", + "CreateDate": "2016-11-30T14:10:01.156Z", + "GroupId": "AGP22222222222EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/", + "GroupName": "Managers", + "CreateDate": "2016-06-12T20:14:52.032Z", + "GroupId": "AGPI3333333333EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -7946,6 +8734,33 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM groups that the specified IAM user belongs to.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list the groups that an IAM user belongs to", + "documentation": "The following command displays the groups that the IAM user named Bob belongs to.", + "input": { + "UserName": "Bob" + }, + "output": { + "Groups": [ + { + "Path": "/division_abc/subdivision_xyz/product_1234/engineering/", + "GroupName": "Test", + "CreateDate": "2016-11-30T14:10:01.156Z", + "GroupId": "AGP2111111111EXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test" + }, + { + "Path": "/division_abc/subdivision_xyz/product_1234/", + "GroupName": "Managers", + "CreateDate": "2016-06-12T20:14:52.032Z", + "GroupId": "AGPI222222222SEXAMPLE", + "Arn": "arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8082,7 +8897,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM instance profile. The returned list of tags is sorted by tag key.\n For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM instance profile. The returned list of tags is sorted by tag key.\n For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListInstanceProfileTagsRequest": { @@ -8154,7 +8975,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the instance profiles that have the specified path prefix. If there are none,\n the operation returns an empty list. For more information about instance profiles, see\n About\n instance profiles.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for an instance profile, see GetInstanceProfile.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the instance profiles that have the specified path prefix. If there are none,\n the operation returns an empty list. For more information about instance profiles, see\n Using\n instance profiles in the IAM User Guide.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for an instance profile, see GetInstanceProfile.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8180,7 +9001,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the instance profiles that have the specified associated IAM role. If there\n are none, the operation returns an empty list. For more information about instance\n profiles, go to About instance\n profiles.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the instance profiles that have the specified associated IAM role. If there\n are none, the operation returns an empty list. For more information about instance\n profiles, go to Using\n instance profiles in the IAM User Guide.

\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -8320,7 +9141,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM virtual multi-factor authentication (MFA) device. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM virtual multi-factor authentication (MFA) device. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListMFADeviceTagsRequest": { @@ -8479,7 +9306,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified OpenID Connect (OIDC)-compatible\n identity provider. The returned list of tags is sorted by tag key. For more information, see About web identity\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified OpenID Connect (OIDC)-compatible\n identity provider. The returned list of tags is sorted by tag key. For more information, see About web identity\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListOpenIDConnectProviderTagsRequest": { @@ -8616,7 +9449,51 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves a list of policies that the IAM identity (user, group, or role) can use to\n access each specified service.

\n \n

This operation does not use other policy types when determining whether a resource\n could access a service. These other policy types include resource-based policies,\n access control lists, Organizations policies, IAM permissions boundaries, and STS\n assume role policies. It only applies permissions policy logic. For more about the\n evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

The list of policies returned by the operation depends on the ARN of the identity that\n you provide.

\n
    \n
  • \n

    \n User – The list of policies includes\n the managed and inline policies that are attached to the user directly. The list\n also includes any additional managed and inline policies that are attached to\n the group to which the user belongs.

    \n
  • \n
  • \n

    \n Group – The list of policies includes\n only the managed and inline policies that are attached to the group directly.\n Policies that are attached to the group’s user are not included.

    \n
  • \n
  • \n

    \n Role – The list of policies includes\n only the managed and inline policies that are attached to the role.

    \n
  • \n
\n

For each managed policy, this operation returns the ARN and policy name. For each\n inline policy, it returns the policy name and the entity to which it is attached. Inline\n policies do not have an ARN. For more information about these policy types, see Managed policies and inline policies in the\n IAM User Guide.

\n

Policies that are attached to users and roles as permissions boundaries are not\n returned. To view which managed policy is currently used to set the permissions boundary\n for a user or role, use the GetUser or GetRole\n operations.

" + "smithy.api#documentation": "

Retrieves a list of policies that the IAM identity (user, group, or role) can use to\n access each specified service.

\n \n

This operation does not use other policy types when determining whether a resource\n could access a service. These other policy types include resource-based policies,\n access control lists, Organizations policies, IAM permissions boundaries, and STS\n assume role policies. It only applies permissions policy logic. For more about the\n evaluation of policy types, see Evaluating policies in the\n IAM User Guide.

\n
\n

The list of policies returned by the operation depends on the ARN of the identity that\n you provide.

\n
    \n
  • \n

    \n User – The list of policies includes\n the managed and inline policies that are attached to the user directly. The list\n also includes any additional managed and inline policies that are attached to\n the group to which the user belongs.

    \n
  • \n
  • \n

    \n Group – The list of policies includes\n only the managed and inline policies that are attached to the group directly.\n Policies that are attached to the group’s user are not included.

    \n
  • \n
  • \n

    \n Role – The list of policies includes\n only the managed and inline policies that are attached to the role.

    \n
  • \n
\n

For each managed policy, this operation returns the ARN and policy name. For each\n inline policy, it returns the policy name and the entity to which it is attached. Inline\n policies do not have an ARN. For more information about these policy types, see Managed policies and inline policies in the\n IAM User Guide.

\n

Policies that are attached to users and roles as permissions boundaries are not\n returned. To view which managed policy is currently used to set the permissions boundary\n for a user or role, use the GetUser or GetRole\n operations.

", + "smithy.api#examples": [ + { + "title": "To list policies that allow access to a service", + "documentation": "The following operation lists policies that allow ExampleUser01 to access IAM or EC2.", + "input": { + "Arn": "arn:aws:iam::123456789012:user/ExampleUser01", + "ServiceNamespaces": [ + "iam", + "ec2" + ] + }, + "output": { + "IsTruncated": false, + "PoliciesGrantingServiceAccess": [ + { + "Policies": [ + { + "PolicyArn": "arn:aws:iam::123456789012:policy/ExampleIamPolicy", + "PolicyType": "MANAGED", + "PolicyName": "ExampleIamPolicy" + }, + { + "EntityName": "AWSExampleGroup1", + "EntityType": "GROUP", + "PolicyType": "INLINE", + "PolicyName": "ExampleGroup1Policy" + } + ], + "ServiceNamespace": "iam" + }, + { + "Policies": [ + { + "PolicyArn": "arn:aws:iam::123456789012:policy/ExampleEc2Policy", + "PolicyType": "MANAGED", + "PolicyName": "ExampleEc2Policy" + } + ], + "ServiceNamespace": "ec2" + } + ] + } + } + ] } }, "com.amazonaws.iam#ListPoliciesGrantingServiceAccessEntry": { @@ -8788,7 +9665,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM customer managed policy.\n The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM customer managed policy.\n The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListPolicyTagsRequest": { @@ -9029,7 +9912,35 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified role. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified role. The returned list of tags is\n sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To list the tags attached to an IAM role", + "documentation": "The following example shows how to list the tags attached to a role.", + "input": { + "RoleName": "taggedrole1" + }, + "output": { + "Tags": [ + { + "Key": "Dept", + "Value": "12345" + }, + { + "Key": "Team", + "Value": "Accounting" + } + ], + "IsTruncated": false + } + } + ], + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListRoleTagsRequest": { @@ -9101,7 +10012,7 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the IAM roles that have the specified path prefix. If there are none, the\n operation returns an empty list. For more information about roles, see Working with\n roles.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    RoleLastUsed

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a role, see GetRole.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#documentation": "

Lists the IAM roles that have the specified path prefix. If there are none, the\n operation returns an empty list. For more information about roles, see IAM roles in the\n IAM User Guide.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    RoleLastUsed

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a role, see GetRole.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9185,7 +10096,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified Security Assertion Markup Language\n (SAML) identity provider. The returned list of tags is sorted by tag key. For more information, see About SAML 2.0-based\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Lists the tags that are attached to the specified Security Assertion Markup Language\n (SAML) identity provider. The returned list of tags is sorted by tag key. For more information, see About SAML 2.0-based\n federation.

\n

For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListSAMLProviderTagsRequest": { @@ -9376,7 +10293,13 @@ } ], "traits": { - "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM server certificate. The\n returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

\n \n

For certificates in a Region supported by Certificate Manager (ACM), we\n recommend that you don't use IAM server certificates. Instead, use ACM to provision,\n manage, and deploy your server certificates. For more information about IAM server\n certificates, Working with server\n certificates in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM server certificate. The\n returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

\n \n

For certificates in a Region supported by Certificate Manager (ACM), we\n recommend that you don't use IAM server certificates. Instead, use ACM to provision,\n manage, and deploy your server certificates. For more information about IAM server\n certificates, Working with server\n certificates in the IAM User Guide.

\n
", + "smithy.api#paginated": { + "inputToken": "Marker", + "outputToken": "Marker", + "items": "Tags", + "pageSize": "MaxItems" + } } }, "com.amazonaws.iam#ListServerCertificateTagsRequest": { @@ -9584,6 +10507,26 @@ ], "traits": { "smithy.api#documentation": "

Returns information about the signing certificates associated with the specified IAM\n user. If none exists, the operation returns an empty list.

\n

Although each user is limited to a small number of signing certificates, you can still\n paginate the results using the MaxItems and Marker\n parameters.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request for this operation.\n This operation works for access keys under the Amazon Web Services account. Consequently, you can use\n this operation to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no\n associated users.

", + "smithy.api#examples": [ + { + "title": "To list the signing certificates for an IAM user", + "documentation": "The following command lists the signing certificates for the IAM user named Bob.", + "input": { + "UserName": "Bob" + }, + "output": { + "Certificates": [ + { + "UserName": "Bob", + "Status": "Active", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE", + "UploadDate": "2013-06-06T21:40:08Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9747,6 +10690,28 @@ ], "traits": { "smithy.api#documentation": "

Lists the tags that are attached to the specified IAM user. The returned list of tags is sorted by tag key. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To list the tags attached to an IAM user", + "documentation": "The following example shows how to list the tags attached to a user.", + "input": { + "UserName": "anika" + }, + "output": { + "Tags": [ + { + "Key": "Dept", + "Value": "12345" + }, + { + "Key": "Team", + "Value": "Accounting" + } + ], + "IsTruncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9825,6 +10790,32 @@ ], "traits": { "smithy.api#documentation": "

Lists the IAM users that have the specified path prefix. If no path prefix is\n specified, the operation returns all users in the Amazon Web Services account. If there are none, the\n operation returns an empty list.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:

\n
    \n
  • \n

    PermissionsBoundary

    \n
  • \n
  • \n

    Tags

    \n
  • \n
\n

To view all of the information for a user, see GetUser.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list IAM users", + "documentation": "The following command lists the IAM users in the current account.", + "output": { + "Users": [ + { + "UserId": "AID2MAB8DPLSRHEXAMPLE", + "Path": "/division_abc/subdivision_xyz/engineering/", + "UserName": "Juan", + "Arn": "arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Juan", + "CreateDate": "2012-09-05T19:38:48Z", + "PasswordLastUsed": "2016-09-08T21:47:36Z" + }, + { + "UserId": "AIDIODR4TAW7CSEXAMPLE", + "Path": "/division_abc/subdivision_xyz/engineering/", + "UserName": "Anika", + "Arn": "arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Anika", + "CreateDate": "2014-04-09T15:43:45Z", + "PasswordLastUsed": "2016-09-24T16:18:07Z" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -9898,6 +10889,22 @@ }, "traits": { "smithy.api#documentation": "

Lists the virtual MFA devices defined in the Amazon Web Services account by assignment status. If\n you do not specify an assignment status, the operation returns a list of all virtual MFA\n devices. Assignment status can be Assigned, Unassigned, or\n Any.

\n \n

IAM resource-listing operations return a subset of the available \n attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view tag information for a virtual MFA device, see ListMFADeviceTags.

\n
\n

You can paginate the results using the MaxItems and Marker\n parameters.

", + "smithy.api#examples": [ + { + "title": "To list virtual MFA devices", + "documentation": "The following command lists the virtual MFA devices that have been configured for the current account.", + "output": { + "VirtualMFADevices": [ + { + "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleMFADevice" + }, + { + "SerialNumber": "arn:aws:iam::123456789012:mfa/Juan" + } + ] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "Marker", @@ -10734,7 +11741,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n group.

\n

A user can also have managed policies attached to it. To attach a managed policy to a\n group, use AttachGroupPolicy. To create a new managed policy, use\n CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n group, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutGroupPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n group.

\n

A user can also have managed policies attached to it. To attach a managed policy to a\n group, use \n AttachGroupPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n group, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutGroupPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To add a policy to a group", + "documentation": "The following command adds a policy named AllPerms to the IAM group named Admins.", + "input": { + "GroupName": "Admins", + "PolicyName": "AllPerms", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutGroupPolicyRequest": { @@ -10757,7 +11775,7 @@ "PolicyDocument": { "target": "com.amazonaws.iam#policyDocumentType", "traits": { - "smithy.api#documentation": "

The policy document.

\n

You must provide policies in JSON format in IAM. However, for CloudFormation templates\n formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always\n converts a YAML policy to JSON format before submitting it to = IAM.

\n

The regex pattern \n used to validate this parameter is a string of characters consisting of the following:

\n
    \n
  • \n

    Any printable ASCII \n character ranging from the space character (\\u0020) through the end of the ASCII character range

    \n
  • \n
  • \n

    The printable characters in the Basic Latin and Latin-1 Supplement character set \n (through \\u00FF)

    \n
  • \n
  • \n

    The special characters tab (\\u0009), line feed (\\u000A), and \n carriage return (\\u000D)

    \n
  • \n
", + "smithy.api#documentation": "

The policy document.

\n

You must provide policies in JSON format in IAM. However, for CloudFormation templates\n formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always\n converts a YAML policy to JSON format before submitting it to IAM.

\n

The regex pattern \n used to validate this parameter is a string of characters consisting of the following:

\n
    \n
  • \n

    Any printable ASCII \n character ranging from the space character (\\u0020) through the end of the ASCII character range

    \n
  • \n
  • \n

    The printable characters in the Basic Latin and Latin-1 Supplement character set \n (through \\u00FF)

    \n
  • \n
  • \n

    The special characters tab (\\u0009), line feed (\\u000A), and \n carriage return (\\u000D)

    \n
  • \n
", "smithy.api#required": {} } } @@ -10843,7 +11861,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n role.

\n

When you embed an inline policy in a role, the inline policy is used as part of the\n role's access (permissions) policy. The role's trust policy is created at the same time\n as the role, using CreateRole. You can update a role's trust policy\n using UpdateAssumeRolePolicy. For more information about IAM roles,\n see Using roles to\n delegate permissions and federate identities.

\n

A role can also have a managed policy attached to it. To attach a managed policy to a\n role, use AttachRolePolicy. To create a new managed policy, use CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed with a\n role, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutRolePolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n role.

\n

When you embed an inline policy in a role, the inline policy is used as part of the\n role's access (permissions) policy. The role's trust policy is created at the same time\n as the role, using \n CreateRole\n .\n You can update a role's trust policy using \n UpdateAssumeRolePolicy\n . For more information about roles,\n see IAM\n roles in the IAM User Guide.

\n

A role can also have a managed policy attached to it. To attach a managed policy to a\n role, use \n AttachRolePolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed with a\n role, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutRolePolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To attach a permissions policy to an IAM role", + "documentation": "The following command adds a permissions policy to the role named Test-Role.", + "input": { + "RoleName": "S3Access", + "PolicyName": "S3AccessPolicy", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"s3:*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutRolePolicyRequest": { @@ -10946,7 +11975,18 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n user.

\n

An IAM user can also have a managed policy attached to it. To attach a managed\n policy to a user, use AttachUserPolicy. To create a new managed\n policy, use CreatePolicy. For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n user, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutUserPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Adds or updates an inline policy document that is embedded in the specified IAM\n user.

\n

An IAM user can also have a managed policy attached to it. To attach a managed\n policy to a user, use \n AttachUserPolicy\n . To create a new managed policy, use\n \n CreatePolicy\n . For information about policies, see Managed\n policies and inline policies in the\n IAM User Guide.

\n

For information about the maximum number of inline policies that you can embed in a\n user, see IAM and STS quotas in the IAM User Guide.

\n \n

Because policy documents can be large, you should use POST rather than GET when\n calling PutUserPolicy. For general information about using the Query\n API with IAM, see Making query requests in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To attach a policy to an IAM user", + "documentation": "The following command attaches a policy to the IAM user named Bob.", + "input": { + "UserName": "Bob", + "PolicyName": "AllAccessPolicy", + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Action\":\"*\",\"Resource\":\"*\"}}" + } + } + ] } }, "com.amazonaws.iam#PutUserPolicyRequest": { @@ -11064,7 +12104,17 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified IAM role from the specified EC2 instance profile.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to remove from the instance profile. Removing a role from an instance\n profile that is associated with a running instance might break any applications\n running on the instance.

\n
\n

For more information about IAM roles, see Working with roles. For more\n information about instance profiles, see About instance\n profiles.

" + "smithy.api#documentation": "

Removes the specified IAM role from the specified EC2 instance profile.

\n \n

Make sure that you do not have any Amazon EC2 instances running with the role you\n are about to remove from the instance profile. Removing a role from an instance\n profile that is associated with a running instance might break any applications\n running on the instance.

\n
\n

For more information about roles, see IAM roles in the\n IAM User Guide. For more information about instance profiles,\n see Using\n instance profiles in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a role from an instance profile", + "documentation": "The following command removes the role named Test-Role from the instance profile named ExampleInstanceProfile.", + "input": { + "RoleName": "Test-Role", + "InstanceProfileName": "ExampleInstanceProfile" + } + } + ] } }, "com.amazonaws.iam#RemoveRoleFromInstanceProfileRequest": { @@ -11109,7 +12159,17 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified user from the specified group.

" + "smithy.api#documentation": "

Removes the specified user from the specified group.

", + "smithy.api#examples": [ + { + "title": "To remove a user from an IAM group", + "documentation": "The following command removes the user named Bob from the IAM group named Admins.", + "input": { + "UserName": "Bob", + "GroupName": "Admins" + } + } + ] } }, "com.amazonaws.iam#RemoveUserFromGroupRequest": { @@ -12077,7 +13137,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the specified version of the global endpoint token as the token version used for\n the Amazon Web Services account.

\n

By default, Security Token Service (STS) is available as a global service, and all STS requests\n go to a single endpoint at https://sts.amazonaws.com. Amazon Web Services recommends\n using Regional STS endpoints to reduce latency, build in redundancy, and increase\n session token availability. For information about Regional endpoints for STS, see\n Security Token Service\n endpoints and quotas in the Amazon Web Services General Reference.

\n

If you make an STS call to the global endpoint, the resulting session tokens might\n be valid in some Regions but not others. It depends on the version that is set in this\n operation. Version 1 tokens are valid only in Amazon Web Services Regions that are\n available by default. These tokens do not work in manually enabled Regions, such as Asia\n Pacific (Hong Kong). Version 2 tokens are valid in all Regions. However, version 2\n tokens are longer and might affect systems where you temporarily store tokens. For\n information, see Activating and\n deactivating STS in an Amazon Web Services Region in the\n IAM User Guide.

\n

To view the current session token version, see the\n GlobalEndpointTokenVersion entry in the response of the GetAccountSummary operation.

" + "smithy.api#documentation": "

Sets the specified version of the global endpoint token as the token version used for\n the Amazon Web Services account.

\n

By default, Security Token Service (STS) is available as a global service, and all STS requests\n go to a single endpoint at https://sts.amazonaws.com. Amazon Web Services recommends\n using Regional STS endpoints to reduce latency, build in redundancy, and increase\n session token availability. For information about Regional endpoints for STS, see\n Security Token Service\n endpoints and quotas in the Amazon Web Services General Reference.

\n

If you make an STS call to the global endpoint, the resulting session tokens might\n be valid in some Regions but not others. It depends on the version that is set in this\n operation. Version 1 tokens are valid only in Amazon Web Services Regions that are\n available by default. These tokens do not work in manually enabled Regions, such as Asia\n Pacific (Hong Kong). Version 2 tokens are valid in all Regions. However, version 2\n tokens are longer and might affect systems where you temporarily store tokens. For\n information, see Activating and\n deactivating STS in an Amazon Web Services Region in the\n IAM User Guide.

\n

To view the current session token version, see the\n GlobalEndpointTokenVersion entry in the response of the GetAccountSummary operation.

", + "smithy.api#examples": [ + { + "title": "To delete an access key for an IAM user", + "documentation": "The following command sets the STS global endpoint token to version 2. Version 2 tokens are valid in all Regions.", + "input": { + "GlobalEndpointTokenVersion": "v2Token" + } + } + ] } }, "com.amazonaws.iam#SetSecurityTokenServicePreferencesRequest": { @@ -12673,7 +13742,26 @@ } ], "traits": { - "smithy.api#documentation": "

Adds one or more tags to an IAM role. The role can be a regular role or a\n service-linked role. If a tag with the same key name already exists, then that tag is\n overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM user-based\n and resource-based policies. You can use tags to restrict access to only an IAM role\n that has a specified tag attached. You can also restrict access to only those resources\n that have a certain tag attached. For examples of policies that show how to use tags to\n control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

" + "smithy.api#documentation": "

Adds one or more tags to an IAM role. The role can be a regular role or a\n service-linked role. If a tag with the same key name already exists, then that tag is\n overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM user-based\n and resource-based policies. You can use tags to restrict access to only an IAM role\n that has a specified tag attached. You can also restrict access to only those resources\n that have a certain tag attached. For examples of policies that show how to use tags to\n control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag key and value to an IAM role", + "documentation": "The following example shows how to add tags to an existing role.", + "input": { + "RoleName": "taggedrole", + "Tags": [ + { + "Key": "Dept", + "Value": "Accounting" + }, + { + "Key": "CostCenter", + "Value": "12345" + } + ] + } + } + ] } }, "com.amazonaws.iam#TagRoleRequest": { @@ -12826,7 +13914,26 @@ } ], "traits": { - "smithy.api#documentation": "

Adds one or more tags to an IAM user. If a tag with the same key name already exists,\n then that tag is overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM identity-based\n and resource-based policies. You can use tags to restrict access to only an IAM\n requesting user that has a specified tag attached. You can also restrict access to only\n those resources that have a certain tag attached. For examples of policies that show how\n to use tags to control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

" + "smithy.api#documentation": "

Adds one or more tags to an IAM user. If a tag with the same key name already exists,\n then that tag is overwritten with the new value.

\n

A tag consists of a key name and an associated value. By assigning tags to your\n resources, you can do the following:

\n
    \n
  • \n

    \n Administrative grouping and discovery - Attach\n tags to resources to aid in organization and search. For example, you could search for all\n resources with the key name Project and the value\n MyImportantProject. Or search for all resources with the key name\n Cost Center and the value 41200.

    \n
  • \n
  • \n

    \n Access control - Include tags in IAM identity-based\n and resource-based policies. You can use tags to restrict access to only an IAM\n requesting user that has a specified tag attached. You can also restrict access to only\n those resources that have a certain tag attached. For examples of policies that show how\n to use tags to control access, see Control access using IAM tags in the\n IAM User Guide.

    \n
  • \n
  • \n

    \n Cost allocation - Use tags to help track which\n individuals and teams are using which Amazon Web Services resources.

    \n
  • \n
\n \n
    \n
  • \n

    If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \n fails and the resource is not created. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

    \n
  • \n
  • \n

    Amazon Web Services always interprets the tag Value as a single string. If you\n need to store an array, you can store comma-separated values in the string. However, you\n must interpret the value in your code.

    \n
  • \n
\n
\n

For more information about tagging, see Tagging IAM identities in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To add a tag key and value to an IAM user", + "documentation": "The following example shows how to add tags to an existing user.", + "input": { + "UserName": "anika", + "Tags": [ + { + "Key": "Dept", + "Value": "Accounting" + }, + { + "Key": "CostCenter", + "Value": "12345" + } + ] + } + } + ] } }, "com.amazonaws.iam#TagUserRequest": { @@ -13132,7 +14239,19 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified tags from the role. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Removes the specified tags from the role. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a tag from an IAM role", + "documentation": "The following example shows how to remove a tag with the key 'Dept' from a role named 'taggedrole'.", + "input": { + "RoleName": "taggedrole", + "TagKeys": [ + "Dept" + ] + } + } + ] } }, "com.amazonaws.iam#UntagRoleRequest": { @@ -13273,7 +14392,19 @@ } ], "traits": { - "smithy.api#documentation": "

Removes the specified tags from the user. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

" + "smithy.api#documentation": "

Removes the specified tags from the user. For more information about tagging, see Tagging IAM resources in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To remove a tag from an IAM user", + "documentation": "The following example shows how to remove tags that are attached to a user named 'anika'.", + "input": { + "UserName": "anika", + "TagKeys": [ + "Dept" + ] + } + } + ] } }, "com.amazonaws.iam#UntagUserRequest": { @@ -13318,7 +14449,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the status of the specified access key from Active to Inactive, or vice versa.\n This operation can be used to disable a user's key as part of a key rotation\n workflow.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n

For information about rotating keys, see Managing keys and certificates\n in the IAM User Guide.

" + "smithy.api#documentation": "

Changes the status of the specified access key from Active to Inactive, or vice versa.\n This operation can be used to disable a user's key as part of a key rotation\n workflow.

\n

If the UserName is not specified, the user name is determined implicitly\n based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\n used, then UserName is required. If a long-term key is assigned to the\n user, then UserName is not required. This operation works for access keys\n under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\n credentials even if the Amazon Web Services account has no associated users.

\n

For information about rotating keys, see Managing keys and certificates\n in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To activate or deactivate an access key for an IAM user", + "documentation": "The following command deactivates the specified access key (access key ID and secret access key) for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "Status": "Inactive", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + ] } }, "com.amazonaws.iam#UpdateAccessKeyRequest": { @@ -13372,7 +14514,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the password policy settings for the Amazon Web Services account.

\n \n

This operation does not support partial updates. No parameters are required, but\n if you do not specify a parameter, that parameter's value reverts to its default\n value. See the Request Parameters section for each\n parameter's default value. Also note that some parameters do not allow the default\n parameter to be explicitly set. Instead, to invoke the default value, do not include\n that parameter when you invoke the operation.

\n
\n

For more information about using a password policy, see Managing an IAM password\n policy in the IAM User Guide.

" + "smithy.api#documentation": "

Updates the password policy settings for the Amazon Web Services account.

\n \n

This operation does not support partial updates. No parameters are required, but\n if you do not specify a parameter, that parameter's value reverts to its default\n value. See the Request Parameters section for each\n parameter's default value. Also note that some parameters do not allow the default\n parameter to be explicitly set. Instead, to invoke the default value, do not include\n that parameter when you invoke the operation.

\n
\n

For more information about using a password policy, see Managing an IAM password\n policy in the IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To set or change the current account password policy", + "documentation": "The following command sets the password policy to require a minimum length of eight characters and to require one or more numbers in the password:", + "input": { + "MinimumPasswordLength": 8, + "RequireNumbers": true + } + } + ] } }, "com.amazonaws.iam#UpdateAccountPasswordPolicyRequest": { @@ -13468,7 +14620,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the policy that grants an IAM entity permission to assume a role. This is\n typically referred to as the \"role trust policy\". For more information about roles, see\n Using roles to\n delegate permissions and federate identities.

" + "smithy.api#documentation": "

Updates the policy that grants an IAM entity permission to assume a role. This is\n typically referred to as the \"role trust policy\". For more information about roles, see\n Using roles to\n delegate permissions and federate identities.

", + "smithy.api#examples": [ + { + "title": "To update the trust policy for an IAM role", + "documentation": "The following command updates the role trust policy for the role named Test-Role:", + "input": { + "PolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"ec2.amazonaws.com\"]},\"Action\":[\"sts:AssumeRole\"]}]}", + "RoleName": "S3AccessForEC2Instances" + } + } + ] } }, "com.amazonaws.iam#UpdateAssumeRolePolicyRequest": { @@ -13516,7 +14678,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM group.

\n \n

You should understand the implications of changing a group's path or name. For\n more information, see Renaming users and\n groups in the IAM User Guide.

\n
\n \n

The person making the request (the principal), must have permission to change the\n role group with the old name and the new name. For example, to change the group\n named Managers to MGRs, the principal must have a policy\n that allows them to update both groups. If the principal has permission to update\n the Managers group, but not the MGRs group, then the\n update fails. For more information about permissions, see Access management.\n

\n
" + "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM group.

\n \n

You should understand the implications of changing a group's path or name. For\n more information, see Renaming users and\n groups in the IAM User Guide.

\n
\n \n

The person making the request (the principal), must have permission to change the\n role group with the old name and the new name. For example, to change the group\n named Managers to MGRs, the principal must have a policy\n that allows them to update both groups. If the principal has permission to update\n the Managers group, but not the MGRs group, then the\n update fails. For more information about permissions, see Access management.\n

\n
", + "smithy.api#examples": [ + { + "title": "To rename an IAM group", + "documentation": "The following command changes the name of the IAM group Test to Test-1.", + "input": { + "GroupName": "Test", + "NewGroupName": "Test-1" + } + } + ] } }, "com.amazonaws.iam#UpdateGroupRequest": { @@ -13572,7 +14744,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the password for the specified IAM user. You can use the CLI, the Amazon Web Services\n API, or the Users page in the IAM console to change\n the password for any IAM user. Use ChangePassword to change your own\n password in the My Security Credentials page in the\n Amazon Web Services Management Console.

\n

For more information about modifying passwords, see Managing passwords in the\n IAM User Guide.

" + "smithy.api#documentation": "

Changes the password for the specified IAM user. You can use the CLI, the Amazon Web Services\n API, or the Users page in the IAM console to change\n the password for any IAM user. Use ChangePassword to change your own\n password in the My Security Credentials page in the\n Amazon Web Services Management Console.

\n

For more information about modifying passwords, see Managing passwords in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To change the password for an IAM user", + "documentation": "The following command creates or changes the password for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "Password": "SomeKindOfPassword123!@#" + } + } + ] } }, "com.amazonaws.iam#UpdateLoginProfileRequest": { @@ -13622,7 +14804,7 @@ } ], "traits": { - "smithy.api#documentation": "

Replaces the existing list of server certificate thumbprints associated with an OpenID\n Connect (OIDC) provider resource object with a new list of thumbprints.

\n

The list that you pass with this operation completely replaces the existing list of\n thumbprints. (The lists are not merged.)

\n

Typically, you need to update a thumbprint only when the identity provider certificate\n changes, which occurs rarely. However, if the provider's certificate\n does change, any attempt to assume an IAM role that specifies\n the OIDC provider as a principal fails until the certificate thumbprint is\n updated.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Google, Auth0,\n and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In these\n cases, your legacy thumbprint remains in your configuration, but is no longer used for\n validation.

\n
\n \n

Trust for the OIDC provider is derived from the provider certificate and is\n validated by the thumbprint. Therefore, it is best to limit access to the\n UpdateOpenIDConnectProviderThumbprint operation to highly\n privileged users.

\n
" + "smithy.api#documentation": "

Replaces the existing list of server certificate thumbprints associated with an OpenID\n Connect (OIDC) provider resource object with a new list of thumbprints.

\n

The list that you pass with this operation completely replaces the existing list of\n thumbprints. (The lists are not merged.)

\n

Typically, you need to update a thumbprint only when the identity provider certificate\n changes, which occurs rarely. However, if the provider's certificate\n does change, any attempt to assume an IAM role that specifies\n the OIDC provider as a principal fails until the certificate thumbprint is\n updated.

\n \n

Amazon Web Services secures communication with some OIDC identity providers (IdPs) through our\n library of trusted root certificate authorities (CAs) instead of using a certificate\n thumbprint to verify your IdP server certificate. These OIDC IdPs include Auth0, GitHub,\n Google, and those that use an Amazon S3 bucket to host a JSON Web Key Set (JWKS) endpoint. In\n these cases, your legacy thumbprint remains in your configuration, but is no longer used\n for validation.

\n
\n \n

Trust for the OIDC provider is derived from the provider certificate and is\n validated by the thumbprint. Therefore, it is best to limit access to the\n UpdateOpenIDConnectProviderThumbprint operation to highly\n privileged users.

\n
" } }, "com.amazonaws.iam#UpdateOpenIDConnectProviderThumbprintRequest": { @@ -13990,7 +15172,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the status of the specified user signing certificate from active to disabled,\n or vice versa. This operation can be used to disable an IAM user's signing\n certificate as part of a certificate rotation work flow.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

" + "smithy.api#documentation": "

Changes the status of the specified user signing certificate from active to disabled,\n or vice versa. This operation can be used to disable an IAM user's signing\n certificate as part of a certificate rotation work flow.

\n

If the UserName field is not specified, the user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

", + "smithy.api#examples": [ + { + "title": "To change the active status of a signing certificate for an IAM user", + "documentation": "The following command changes the status of a signing certificate for a user named Bob to Inactive.", + "input": { + "UserName": "Bob", + "CertificateId": "TA7SMP42TDN5Z26OBPJE7EXAMPLE", + "Status": "Inactive" + } + } + ] } }, "com.amazonaws.iam#UpdateSigningCertificateRequest": { @@ -14050,7 +15243,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM user.

\n \n

You should understand the implications of changing an IAM user's path or\n name. For more information, see Renaming an IAM\n user and Renaming an IAM\n group in the IAM User Guide.

\n
\n \n

To change a user name, the requester must have appropriate permissions on both\n the source object and the target object. For example, to change Bob to Robert, the\n entity making the request must have permission on Bob and Robert, or must have\n permission on all (*). For more information about permissions, see Permissions and policies.

\n
" + "smithy.api#documentation": "

Updates the name and/or the path of the specified IAM user.

\n \n

You should understand the implications of changing an IAM user's path or\n name. For more information, see Renaming an IAM\n user and Renaming an IAM\n group in the IAM User Guide.

\n
\n \n

To change a user name, the requester must have appropriate permissions on both\n the source object and the target object. For example, to change Bob to Robert, the\n entity making the request must have permission on Bob and Robert, or must have\n permission on all (*). For more information about permissions, see Permissions and policies.

\n
", + "smithy.api#examples": [ + { + "title": "To change an IAM user's name", + "documentation": "The following command changes the name of the IAM user Bob to Robert. It does not change the user's path.", + "input": { + "UserName": "Bob", + "NewUserName": "Robert" + } + } + ] } }, "com.amazonaws.iam#UpdateUserRequest": { @@ -14178,7 +15381,29 @@ } ], "traits": { - "smithy.api#documentation": "

Uploads a server certificate entity for the Amazon Web Services account. The server certificate\n entity includes a public key certificate, a private key, and an optional certificate\n chain, which should all be PEM-encoded.

\n

We recommend that you use Certificate Manager to\n provision, manage, and deploy your server certificates. With ACM you can request a\n certificate, deploy it to Amazon Web Services resources, and let ACM handle certificate renewals for\n you. Certificates provided by ACM are free. For more information about using ACM,\n see the Certificate Manager User\n Guide.

\n

For more information about working with server certificates, see Working\n with server certificates in the IAM User Guide. This\n topic includes a list of Amazon Web Services services that can use the server certificates that you\n manage with IAM.

\n

For information about the number of server certificates you can upload, see IAM and STS\n quotas in the IAM User Guide.

\n \n

Because the body of the public key certificate, private key, and the certificate\n chain can be large, you should use POST rather than GET when calling\n UploadServerCertificate. For information about setting up\n signatures and authorization through the API, see Signing Amazon Web Services API\n requests in the Amazon Web Services General Reference. For general\n information about using the Query API with IAM, see Calling the API by making HTTP query\n requests in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Uploads a server certificate entity for the Amazon Web Services account. The server certificate\n entity includes a public key certificate, a private key, and an optional certificate\n chain, which should all be PEM-encoded.

\n

We recommend that you use Certificate Manager to\n provision, manage, and deploy your server certificates. With ACM you can request a\n certificate, deploy it to Amazon Web Services resources, and let ACM handle certificate renewals for\n you. Certificates provided by ACM are free. For more information about using ACM,\n see the Certificate Manager User\n Guide.

\n

For more information about working with server certificates, see Working\n with server certificates in the IAM User Guide. This\n topic includes a list of Amazon Web Services services that can use the server certificates that you\n manage with IAM.

\n

For information about the number of server certificates you can upload, see IAM and STS\n quotas in the IAM User Guide.

\n \n

Because the body of the public key certificate, private key, and the certificate\n chain can be large, you should use POST rather than GET when calling\n UploadServerCertificate. For information about setting up\n signatures and authorization through the API, see Signing Amazon Web Services API\n requests in the Amazon Web Services General Reference. For general\n information about using the Query API with IAM, see Calling the API by making HTTP query\n requests in the IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To upload a server certificate to your AWS account", + "documentation": "The following upload-server-certificate command uploads a server certificate to your AWS account:", + "input": { + "ServerCertificateName": "ProdServerCert", + "Path": "/company/servercerts/", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "PrivateKey": "-----BEGIN DSA PRIVATE KEY----------END DSA PRIVATE KEY-----" + }, + "output": { + "ServerCertificateMetadata": { + "ServerCertificateName": "ProdServerCert", + "Path": "/company/servercerts/", + "Arn": "arn:aws:iam::123456789012:server-certificate/company/servercerts/ProdServerCert", + "UploadDate": "2010-05-08T01:02:03.004Z", + "ServerCertificateId": "ASCA1111111111EXAMPLE", + "Expiration": "2012-05-08T01:02:03.004Z" + } + } + } + ] } }, "com.amazonaws.iam#UploadServerCertificateRequest": { @@ -14284,7 +15509,26 @@ } ], "traits": { - "smithy.api#documentation": "

Uploads an X.509 signing certificate and associates it with the specified IAM user.\n Some Amazon Web Services services require you to use certificates to validate requests that are signed\n with a corresponding private key. When you upload the certificate, its default status is\n Active.

\n

For information about when you would use an X.509 signing certificate, see Managing\n server certificates in IAM in the\n IAM User Guide.

\n

If the UserName is not specified, the IAM user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

\n \n

Because the body of an X.509 certificate can be large, you should use POST rather\n than GET when calling UploadSigningCertificate. For information about\n setting up signatures and authorization through the API, see Signing\n Amazon Web Services API requests in the Amazon Web Services General Reference. For\n general information about using the Query API with IAM, see Making query\n requests in the IAM User Guide.

\n
" + "smithy.api#documentation": "

Uploads an X.509 signing certificate and associates it with the specified IAM user.\n Some Amazon Web Services services require you to use certificates to validate requests that are signed\n with a corresponding private key. When you upload the certificate, its default status is\n Active.

\n

For information about when you would use an X.509 signing certificate, see Managing\n server certificates in IAM in the\n IAM User Guide.

\n

If the UserName is not specified, the IAM user name is determined\n implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\n works for access keys under the Amazon Web Services account. Consequently, you can use this operation\n to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\n users.

\n \n

Because the body of an X.509 certificate can be large, you should use POST rather\n than GET when calling UploadSigningCertificate. For information about\n setting up signatures and authorization through the API, see Signing\n Amazon Web Services API requests in the Amazon Web Services General Reference. For\n general information about using the Query API with IAM, see Making query\n requests in the IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To upload a signing certificate for an IAM user", + "documentation": "The following command uploads a signing certificate for the IAM user named Bob.", + "input": { + "UserName": "Bob", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----" + }, + "output": { + "Certificate": { + "CertificateId": "ID123456789012345EXAMPLE", + "UserName": "Bob", + "Status": "Active", + "CertificateBody": "-----BEGIN CERTIFICATE----------END CERTIFICATE-----", + "UploadDate": "2015-06-06T21:40:08.121Z" + } + } + } + ] } }, "com.amazonaws.iam#UploadSigningCertificateRequest": { diff --git a/aws/sdk/aws-models/kms.json b/aws/sdk/aws-models/kms.json index e161d678534..638331470fe 100644 --- a/aws/sdk/aws-models/kms.json +++ b/aws/sdk/aws-models/kms.json @@ -188,7 +188,19 @@ } ], "traits": { - "smithy.api#documentation": "

Cancels the deletion of a KMS key. When this operation succeeds, the key state of the KMS\n key is Disabled. To enable the KMS key, use EnableKey.

\n

For more information about scheduling and canceling deletion of a KMS key, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CancelKeyDeletion (key policy)

\n

\n Related operations: ScheduleKeyDeletion\n

" + "smithy.api#documentation": "

Cancels the deletion of a KMS key. When this operation succeeds, the key state of the KMS\n key is Disabled. To enable the KMS key, use EnableKey.

\n

For more information about scheduling and canceling deletion of a KMS key, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CancelKeyDeletion (key policy)

\n

\n Related operations: ScheduleKeyDeletion\n

", + "smithy.api#examples": [ + { + "title": "To cancel deletion of a KMS key", + "documentation": "The following example cancels deletion of the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#CancelKeyDeletionRequest": { @@ -350,7 +362,17 @@ } ], "traits": { - "smithy.api#documentation": "

Connects or reconnects a custom key store to its backing key store. For an CloudHSM key\n store, ConnectCustomKeyStore connects the key store to its associated CloudHSM\n cluster. For an external key store, ConnectCustomKeyStore connects the key store\n to the external key store proxy that communicates with your external key manager.

\n

The custom key store must be connected before you can create KMS keys in the key store or\n use the KMS keys it contains. You can disconnect and reconnect a custom key store at any\n time.

\n

The connection process for a custom key store can take an extended amount of time to\n complete. This operation starts the connection process, but it does not wait for it to\n complete. When it succeeds, this operation quickly returns an HTTP 200 response and a JSON\n object with no properties. However, this response does not indicate that the custom key store\n is connected. To get the connection state of the custom key store, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The ConnectCustomKeyStore operation might fail for various reasons. To find\n the reason, use the DescribeCustomKeyStores operation and see the\n ConnectionErrorCode in the response. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

To fix the failure, use the DisconnectCustomKeyStore operation to\n disconnect the custom key store, correct the error, use the UpdateCustomKeyStore operation if necessary, and then use\n ConnectCustomKeyStore again.

\n

\n CloudHSM key store\n

\n

During the connection process for an CloudHSM key store, KMS finds the CloudHSM cluster that\n is associated with the custom key store, creates the connection infrastructure, connects to\n the cluster, logs into the CloudHSM client as the kmsuser CU, and rotates its\n password.

\n

To connect an CloudHSM key store, its associated CloudHSM cluster must have at least one active\n HSM. To get the number of active HSMs in a cluster, use the DescribeClusters operation. To add HSMs\n to the cluster, use the CreateHsm operation. Also, the \n kmsuser crypto\n user (CU) must not be logged into the cluster. This prevents KMS from using this\n account to log in.

\n

If you are having trouble connecting or disconnecting a CloudHSM key store, see Troubleshooting an CloudHSM key\n store in the Key Management Service Developer Guide.

\n

\n External key store\n

\n

When you connect an external key store that uses public endpoint connectivity, KMS tests\n its ability to communicate with your external key manager by sending a request via the\n external key store proxy.

\n

When you connect to an external key store that uses VPC endpoint service connectivity,\n KMS establishes the networking elements that it needs to communicate with your external key\n manager via the external key store proxy. This includes creating an interface endpoint to the\n VPC endpoint service and a private hosted zone for traffic between KMS and the VPC endpoint\n service.

\n

To connect an external key store, KMS must be able to connect to the external key store\n proxy, the external key store proxy must be able to communicate with your external key\n manager, and the external key manager must be available for cryptographic operations.

\n

If you are having trouble connecting or disconnecting an external key store, see Troubleshooting an external\n key store in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:ConnectCustomKeyStore (IAM policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Connects or reconnects a custom key store to its backing key store. For an CloudHSM key\n store, ConnectCustomKeyStore connects the key store to its associated CloudHSM\n cluster. For an external key store, ConnectCustomKeyStore connects the key store\n to the external key store proxy that communicates with your external key manager.

\n

The custom key store must be connected before you can create KMS keys in the key store or\n use the KMS keys it contains. You can disconnect and reconnect a custom key store at any\n time.

\n

The connection process for a custom key store can take an extended amount of time to\n complete. This operation starts the connection process, but it does not wait for it to\n complete. When it succeeds, this operation quickly returns an HTTP 200 response and a JSON\n object with no properties. However, this response does not indicate that the custom key store\n is connected. To get the connection state of the custom key store, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The ConnectCustomKeyStore operation might fail for various reasons. To find\n the reason, use the DescribeCustomKeyStores operation and see the\n ConnectionErrorCode in the response. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

To fix the failure, use the DisconnectCustomKeyStore operation to\n disconnect the custom key store, correct the error, use the UpdateCustomKeyStore operation if necessary, and then use\n ConnectCustomKeyStore again.

\n

\n CloudHSM key store\n

\n

During the connection process for an CloudHSM key store, KMS finds the CloudHSM cluster that\n is associated with the custom key store, creates the connection infrastructure, connects to\n the cluster, logs into the CloudHSM client as the kmsuser CU, and rotates its\n password.

\n

To connect an CloudHSM key store, its associated CloudHSM cluster must have at least one active\n HSM. To get the number of active HSMs in a cluster, use the DescribeClusters operation. To add HSMs\n to the cluster, use the CreateHsm operation. Also, the \n kmsuser crypto\n user (CU) must not be logged into the cluster. This prevents KMS from using this\n account to log in.

\n

If you are having trouble connecting or disconnecting a CloudHSM key store, see Troubleshooting an CloudHSM key\n store in the Key Management Service Developer Guide.

\n

\n External key store\n

\n

When you connect an external key store that uses public endpoint connectivity, KMS tests\n its ability to communicate with your external key manager by sending a request via the\n external key store proxy.

\n

When you connect to an external key store that uses VPC endpoint service connectivity,\n KMS establishes the networking elements that it needs to communicate with your external key\n manager via the external key store proxy. This includes creating an interface endpoint to the\n VPC endpoint service and a private hosted zone for traffic between KMS and the VPC endpoint\n service.

\n

To connect an external key store, KMS must be able to connect to the external key store\n proxy, the external key store proxy must be able to communicate with your external key\n manager, and the external key manager must be available for cryptographic operations.

\n

If you are having trouble connecting or disconnecting an external key store, see Troubleshooting an external\n key store in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:ConnectCustomKeyStore (IAM policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To connect a custom key store", + "documentation": "This example connects an AWS KMS custom key store to its backing key store. For an AWS CloudHSM key store, it connects the key store to its AWS CloudHSM cluster. For an external key store, it connects the key store to the external key store proxy that communicates with your external key manager. This operation does not return any data. To verify that the custom key store is connected, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#ConnectCustomKeyStoreRequest": { @@ -555,7 +577,17 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a friendly name for a KMS key.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

You can use an alias to identify a KMS key in the KMS console, in the DescribeKey operation and in cryptographic operations, such as Encrypt and\n GenerateDataKey. You can also change the KMS key that's associated with\n the alias (UpdateAlias) or delete the alias (DeleteAlias)\n at any time. These operations don't affect the underlying KMS key.

\n

You can associate the alias with any customer managed key in the same Amazon Web Services Region. Each\n alias is associated with only one KMS key at a time, but a KMS key can have multiple aliases.\n A valid KMS key is required. You can't create an alias without a KMS key.

\n

The alias must be unique in the account and Region, but you can have aliases with the same\n name in different Regions. For detailed information about aliases, see Using aliases in the\n Key Management Service Developer Guide.

\n

This operation does not return a response. To get the alias that you created, use the\n ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a friendly name for a KMS key.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

You can use an alias to identify a KMS key in the KMS console, in the DescribeKey operation and in cryptographic operations, such as Encrypt and\n GenerateDataKey. You can also change the KMS key that's associated with\n the alias (UpdateAlias) or delete the alias (DeleteAlias)\n at any time. These operations don't affect the underlying KMS key.

\n

You can associate the alias with any customer managed key in the same Amazon Web Services Region. Each\n alias is associated with only one KMS key at a time, but a KMS key can have multiple aliases.\n A valid KMS key is required. You can't create an alias without a KMS key.

\n

The alias must be unique in the account and Region, but you can have aliases with the same\n name in different Regions. For detailed information about aliases, see Using aliases in the\n Key Management Service Developer Guide.

\n

This operation does not return a response. To get the alias that you created, use the\n ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create an alias", + "documentation": "The following example creates an alias for the specified KMS key.", + "input": { + "AliasName": "alias/ExampleAlias", + "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#CreateAliasRequest": { @@ -642,7 +674,22 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a custom key store backed by a key store that you own and manage. When you use a\n KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\n actually performed in your key store using your keys. KMS supports CloudHSM key stores\n backed by an CloudHSM cluster\n and external key stores backed by an external key store proxy and\n external key manager outside of Amazon Web Services.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

Before you create the custom key store, the required elements must be in place and\n operational. We recommend that you use the test tools that KMS provides to verify the\n configuration your external key store proxy. For details about the required elements and\n verification tests, see Assemble the prerequisites (for\n CloudHSM key stores) or Assemble the prerequisites (for\n external key stores) in the Key Management Service Developer Guide.

\n

To create a custom key store, use the following parameters.

\n
    \n
  • \n

    To create an CloudHSM key store, specify the CustomKeyStoreName,\n CloudHsmClusterId, KeyStorePassword, and\n TrustAnchorCertificate. The CustomKeyStoreType parameter is\n optional for CloudHSM key stores. If you include it, set it to the default value,\n AWS_CLOUDHSM. For help with failures, see Troubleshooting an CloudHSM key store in the\n Key Management Service Developer Guide.

    \n
  • \n
  • \n

    To create an external key store, specify the CustomKeyStoreName and a\n CustomKeyStoreType of EXTERNAL_KEY_STORE. Also, specify values\n for XksProxyConnectivity, XksProxyAuthenticationCredential,\n XksProxyUriEndpoint, and XksProxyUriPath. If your\n XksProxyConnectivity value is VPC_ENDPOINT_SERVICE, specify\n the XksProxyVpcEndpointServiceName parameter. For help with failures, see\n Troubleshooting\n an external key store in the Key Management Service Developer Guide.

    \n
  • \n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for creating an external key store.\n For details, see your external key manager documentation.

\n

When creating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot use a proxy configuration\n with the CreateCustomKeyStore operation. However, you can use the values in\n the file to help you determine the correct values for the CreateCustomKeyStore\n parameters.

\n
\n

When the operation completes successfully, it returns the ID of the new custom key store.\n Before you can use your new custom key store, you need to use the ConnectCustomKeyStore operation to connect a new CloudHSM key store to its CloudHSM\n cluster, or to connect a new external key store to the external key store proxy for your\n external key manager. Even if you are not going to use your custom key store immediately, you\n might want to connect it to verify that all settings are correct and then disconnect it until\n you are ready to use it.

\n

For help with failures, see Troubleshooting a custom key store in the\n Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateCustomKeyStore (IAM policy).

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a custom key store backed by a key store that you own and manage. When you use a\n KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\n actually performed in your key store using your keys. KMS supports CloudHSM key stores\n backed by an CloudHSM cluster\n and external key\n stores backed by an external key store proxy and external key manager outside of\n Amazon Web Services.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

Before you create the custom key store, the required elements must be in place and\n operational. We recommend that you use the test tools that KMS provides to verify the\n configuration your external key store proxy. For details about the required elements and\n verification tests, see Assemble the prerequisites (for\n CloudHSM key stores) or Assemble the prerequisites (for\n external key stores) in the Key Management Service Developer Guide.

\n

To create a custom key store, use the following parameters.

\n
    \n
  • \n

    To create an CloudHSM key store, specify the CustomKeyStoreName,\n CloudHsmClusterId, KeyStorePassword, and\n TrustAnchorCertificate. The CustomKeyStoreType parameter is\n optional for CloudHSM key stores. If you include it, set it to the default value,\n AWS_CLOUDHSM. For help with failures, see Troubleshooting an CloudHSM key store in the\n Key Management Service Developer Guide.

    \n
  • \n
  • \n

    To create an external key store, specify the CustomKeyStoreName and a\n CustomKeyStoreType of EXTERNAL_KEY_STORE. Also, specify values\n for XksProxyConnectivity, XksProxyAuthenticationCredential,\n XksProxyUriEndpoint, and XksProxyUriPath. If your\n XksProxyConnectivity value is VPC_ENDPOINT_SERVICE, specify\n the XksProxyVpcEndpointServiceName parameter. For help with failures, see\n Troubleshooting\n an external key store in the Key Management Service Developer Guide.

    \n
  • \n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for creating an external key store.\n For details, see your external key manager documentation.

\n

When creating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot use a proxy configuration with\n the CreateCustomKeyStore operation. However, you can use the values in the file\n to help you determine the correct values for the CreateCustomKeyStore\n parameters.

\n
\n

When the operation completes successfully, it returns the ID of the new custom key store.\n Before you can use your new custom key store, you need to use the ConnectCustomKeyStore operation to connect a new CloudHSM key store to its CloudHSM\n cluster, or to connect a new external key store to the external key store proxy for your\n external key manager. Even if you are not going to use your custom key store immediately, you\n might want to connect it to verify that all settings are correct and then disconnect it until\n you are ready to use it.

\n

For help with failures, see Troubleshooting a custom key store in the\n Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateCustomKeyStore (IAM policy).

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create an AWS CloudHSM key store", + "documentation": "This example creates a custom key store that is associated with an AWS CloudHSM cluster.", + "input": { + "CustomKeyStoreName": "ExampleKeyStore", + "CloudHsmClusterId": "cluster-234abcdefABC", + "TrustAnchorCertificate": "", + "KeyStorePassword": "kmsPswd" + }, + "output": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + } + } + ] } }, "com.amazonaws.kms#CreateCustomKeyStoreRequest": { @@ -694,7 +741,7 @@ "XksProxyVpcEndpointServiceName": { "target": "com.amazonaws.kms#XksProxyVpcEndpointServiceNameType", "traits": { - "smithy.api#documentation": "

Specifies the name of the Amazon VPC endpoint service for interface endpoints that is used to\n communicate with your external key store proxy (XKS proxy). This parameter is required when\n the value of CustomKeyStoreType is EXTERNAL_KEY_STORE and the value\n of XksProxyConnectivity is VPC_ENDPOINT_SERVICE.

\n

The Amazon VPC endpoint service must fulfill all requirements for use with an external key\n store.

\n

\n Uniqueness requirements:\n

\n
    \n
  • \n

    External key stores with VPC_ENDPOINT_SERVICE connectivity can share an\n Amazon VPC, but each external key store must have its own VPC endpoint service and private DNS\n name.

    \n
  • \n
" + "smithy.api#documentation": "

Specifies the name of the Amazon VPC endpoint service for interface endpoints that is used to\n communicate with your external key store proxy (XKS proxy). This parameter is required when\n the value of CustomKeyStoreType is EXTERNAL_KEY_STORE and the value\n of XksProxyConnectivity is VPC_ENDPOINT_SERVICE.

\n

The Amazon VPC endpoint service must fulfill all\n requirements for use with an external key store.

\n

\n Uniqueness requirements:\n

\n
    \n
  • \n

    External key stores with VPC_ENDPOINT_SERVICE connectivity can share an\n Amazon VPC, but each external key store must have its own VPC endpoint service and private DNS\n name.

    \n
  • \n
" } }, "XksProxyAuthenticationCredential": { @@ -706,7 +753,7 @@ "XksProxyConnectivity": { "target": "com.amazonaws.kms#XksProxyConnectivityType", "traits": { - "smithy.api#documentation": "

Indicates how KMS communicates with the external key store proxy. This parameter is\n required for custom key stores with a CustomKeyStoreType of\n EXTERNAL_KEY_STORE.

\n

If the external key store proxy uses a public endpoint, specify\n PUBLIC_ENDPOINT. If the external key store proxy uses a Amazon VPC\n endpoint service for communication with KMS, specify VPC_ENDPOINT_SERVICE. For\n help making this choice, see Choosing a connectivity option in the Key Management Service Developer Guide.

\n

An Amazon VPC endpoint service keeps your communication with KMS in a private address space\n entirely within Amazon Web Services, but it requires more configuration, including establishing a Amazon VPC with multiple subnets, a VPC endpoint service, a network load balancer, and a\n verified private DNS name. A public endpoint is simpler to set up, but it might be slower and\n might not fulfill your security requirements. You might consider testing with a public\n endpoint, and then establishing a VPC endpoint service for production tasks. Note that this\n choice does not determine the location of the external key store proxy. Even if you choose a\n VPC endpoint service, the proxy can be hosted within the VPC or outside of Amazon Web Services such as in\n your corporate data center.

" + "smithy.api#documentation": "

Indicates how KMS communicates with the external key store proxy. This parameter is\n required for custom key stores with a CustomKeyStoreType of\n EXTERNAL_KEY_STORE.

\n

If the external key store proxy uses a public endpoint, specify\n PUBLIC_ENDPOINT. If the external key store proxy uses a Amazon VPC\n endpoint service for communication with KMS, specify VPC_ENDPOINT_SERVICE. For\n help making this choice, see Choosing a connectivity\n option in the Key Management Service Developer Guide.

\n

An Amazon VPC endpoint service keeps your communication with KMS in a private address space\n entirely within Amazon Web Services, but it requires more configuration, including establishing a Amazon VPC with multiple subnets, a VPC endpoint service, a network load balancer, and a\n verified private DNS name. A public endpoint is simpler to set up, but it might be slower and\n might not fulfill your security requirements. You might consider testing with a public\n endpoint, and then establishing a VPC endpoint service for production tasks. Note that this\n choice does not determine the location of the external key store proxy. Even if you choose a\n VPC endpoint service, the proxy can be hosted within the VPC or outside of Amazon Web Services such as in\n your corporate data center.

" } } }, @@ -743,6 +790,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -763,7 +813,25 @@ } ], "traits": { - "smithy.api#documentation": "

Adds a grant to a KMS key.

\n

A grant is a policy instrument that allows Amazon Web Services principals to use\n KMS keys in cryptographic operations. It also can allow them to view a KMS key (DescribeKey) and create and manage grants. When authorizing access to a KMS key,\n grants are considered along with key policies and IAM policies. Grants are often used for\n temporary permissions because you can create one, use its permissions, and delete it without\n changing your key policies or IAM policies.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

The CreateGrant operation returns a GrantToken and a\n GrantId.

\n
    \n
  • \n

    When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. Once the grant has achieved eventual consistency, the grantee\n principal can use the permissions in the grant without identifying the grant.

    \n

    However, to use the permissions in the grant immediately, use the\n GrantToken that CreateGrant returns. For details, see Using a\n grant token in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    The CreateGrant operation also returns a GrantId. You can\n use the GrantId and a key identifier to identify the grant in the RetireGrant and RevokeGrant operations. To find the grant\n ID, use the ListGrants or ListRetirableGrants\n operations.

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:CreateGrant (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Adds a grant to a KMS key.

\n

A grant is a policy instrument that allows Amazon Web Services principals to use\n KMS keys in cryptographic operations. It also can allow them to view a KMS key (DescribeKey) and create and manage grants. When authorizing access to a KMS key,\n grants are considered along with key policies and IAM policies. Grants are often used for\n temporary permissions because you can create one, use its permissions, and delete it without\n changing your key policies or IAM policies.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

The CreateGrant operation returns a GrantToken and a\n GrantId.

\n
    \n
  • \n

    When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. Once the grant has achieved eventual consistency, the grantee\n principal can use the permissions in the grant without identifying the grant.

    \n

    However, to use the permissions in the grant immediately, use the\n GrantToken that CreateGrant returns. For details, see Using a\n grant token in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    The CreateGrant operation also returns a GrantId. You can\n use the GrantId and a key identifier to identify the grant in the RetireGrant and RevokeGrant operations. To find the grant\n ID, use the ListGrants or ListRetirableGrants\n operations.

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:CreateGrant (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To create a grant", + "documentation": "The following example creates a grant that allows the specified IAM role to encrypt data with the specified KMS key.", + "input": { + "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "GranteePrincipal": "arn:aws:iam::111122223333:role/ExampleRole", + "Operations": [ + "Encrypt", + "Decrypt" + ] + }, + "output": { + "GrantToken": "AQpAM2RhZTk1MGMyNTk2ZmZmMzEyYWVhOWViN2I1MWM4Mzc0MWFiYjc0ZDE1ODkyNGFlNTIzODZhMzgyZjBlNGY3NiKIAgEBAgB4Pa6VDCWW__MSrqnre1HIN0Grt00ViSSuUjhqOC8OT3YAAADfMIHcBgkqhkiG9w0BBwaggc4wgcsCAQAwgcUGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqLyBTAegIn9XlK5AgEQgIGXZQjkBcl1dykDdqZBUQ6L1OfUivQy7JVYO2-ZJP7m6f1g8GzV47HX5phdtONAP7K_HQIflcgpkoCqd_fUnE114mSmiagWkbQ5sqAVV3ov-VeqgrvMe5ZFEWLMSluvBAqdjHEdMIkHMlhlj4ENZbzBfo9Wxk8b8SnwP4kc4gGivedzFXo-dwN8fxjjq_ZZ9JFOj2ijIbj5FyogDCN0drOfi8RORSEuCEmPvjFRMFAwcmwFkN2NPp89amA", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#CreateGrantRequest": { @@ -779,7 +847,7 @@ "GranteePrincipal": { "target": "com.amazonaws.kms#PrincipalIdType", "traits": { - "smithy.api#documentation": "

The identity that gets the permissions specified in the grant.

\n

To specify the grantee principal, use the Amazon Resource Name (ARN) of an\n Amazon Web Services principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\n federated users, and assumed role users. For help with the ARN syntax for a principal, see\n IAM ARNs in the \n Identity and Access Management User Guide\n .

", + "smithy.api#documentation": "

The identity that gets the permissions specified in the grant.

\n

To specify the grantee principal, use the Amazon Resource Name (ARN) of an Amazon Web Services\n principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\n federated users, and assumed role users. For help with the ARN syntax for a principal, see\n IAM ARNs in the \n Identity and Access Management User Guide\n .

", "smithy.api#required": {} } }, @@ -813,6 +881,12 @@ "traits": { "smithy.api#documentation": "

A friendly name for the grant. Use this value to prevent the unintended creation of\n duplicate grants when retrying this request.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

When this value is absent, all CreateGrant requests result in a new grant\n with a unique GrantId even if all the supplied parameters are identical. This can\n result in unintended duplicates when you retry the CreateGrant request.

\n

When this value is present, you can retry a CreateGrant request with\n identical parameters; if the grant already exists, the original GrantId is\n returned without creating a new grant. Note that the returned grant token is unique with every\n CreateGrant request, even when a duplicate GrantId is returned.\n All grant tokens for the same grant ID can be used interchangeably.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -889,7 +963,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a unique customer managed KMS key in your Amazon Web Services account and Region.\n You can use a KMS key in cryptographic operations, such as encryption and signing. Some Amazon Web Services\n services let you use KMS keys that you create and manage to protect your service\n resources.

\n

A KMS key is a logical representation of a cryptographic key. In addition to the key\n material used in cryptographic operations, a KMS key includes metadata, such as the key ID,\n key policy, creation date, description, and key state. For details, see Managing keys in the\n Key Management Service Developer Guide\n

\n

Use the parameters of CreateKey to specify the type of KMS key, the source of\n its key material, its key policy, description, tags, and other properties.

\n \n

KMS has replaced the term customer master key (CMK) with KMS key and KMS key. The concept has not changed. To prevent breaking changes, KMS is keeping some variations of this term.

\n
\n

To create different types of KMS keys, use the following guidance:

\n
\n
Symmetric encryption KMS key
\n
\n

By default, CreateKey creates a symmetric encryption KMS key with key\n material that KMS generates. This is the basic and most widely used type of KMS key, and\n provides the best performance.

\n

To create a symmetric encryption KMS key, you don't need to specify any parameters.\n The default value for KeySpec, SYMMETRIC_DEFAULT, the default\n value for KeyUsage, ENCRYPT_DECRYPT, and the default value for\n Origin, AWS_KMS, create a symmetric encryption KMS key with\n KMS key material.

\n

If you need a key for basic encryption and decryption or you are creating a KMS key\n to protect your resources in an Amazon Web Services service, create a symmetric encryption KMS key.\n The key material in a symmetric encryption key never leaves KMS unencrypted. You can\n use a symmetric encryption KMS key to encrypt and decrypt data up to 4,096 bytes, but\n they are typically used to generate data keys and data keys pairs. For details, see\n GenerateDataKey and GenerateDataKeyPair.

\n

\n
\n
Asymmetric KMS keys
\n
\n

To create an asymmetric KMS key, use the KeySpec parameter to specify\n the type of key material in the KMS key. Then, use the KeyUsage parameter\n to determine whether the KMS key will be used to encrypt and decrypt or sign and verify.\n You can't change these properties after the KMS key is created.

\n

Asymmetric KMS keys contain an RSA key pair, Elliptic Curve (ECC) key pair, or an SM2 key pair (China Regions only). The private key in an asymmetric \n KMS key never leaves KMS unencrypted. However, you can use the GetPublicKey operation to download the public key\n so it can be used outside of KMS. KMS keys with RSA or SM2 key pairs can be used to encrypt or decrypt data or sign and verify messages (but not both). \n KMS keys with ECC key pairs can be used only to sign and verify messages. \n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

\n
\n
HMAC KMS key
\n
\n

To create an HMAC KMS key, set the KeySpec parameter to a key spec\n value for HMAC KMS keys. Then set the KeyUsage parameter to\n GENERATE_VERIFY_MAC. You must set the key usage even though\n GENERATE_VERIFY_MAC is the only valid key usage value for HMAC KMS keys.\n You can't change these properties after the KMS key is created.

\n

HMAC KMS keys are symmetric keys that never leave KMS unencrypted. You can use\n HMAC keys to generate (GenerateMac) and verify (VerifyMac) HMAC codes for messages up to 4096 bytes.

\n

\n
\n
Multi-Region primary keys
\n
Imported key material
\n
\n

To create a multi-Region primary key in the local Amazon Web Services Region,\n use the MultiRegion parameter with a value of True. To create\n a multi-Region replica key, that is, a KMS key with the same key ID\n and key material as a primary key, but in a different Amazon Web Services Region, use the ReplicateKey operation. To change a replica key to a primary key, and its\n primary key to a replica key, use the UpdatePrimaryRegion\n operation.

\n

You can create multi-Region KMS keys for all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't create multi-Region keys in a custom key store.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
\n

To import your own key material into a KMS key, begin by creating a KMS key with no\n key material. To do this, use the Origin parameter of\n CreateKey with a value of EXTERNAL. Next, use GetParametersForImport operation to get a public key and import token. Use\n the wrapping public key to encrypt your key material. Then, use ImportKeyMaterial with your import token to import the key material. For step-by-step instructions, see\n Importing Key Material in the \n Key Management Service Developer Guide\n .

\n

You can import key material into KMS keys of all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't import key material into a KMS key in a custom key store.

\n

To create a multi-Region primary key with imported key material, use the\n Origin parameter of CreateKey with a value of\n EXTERNAL and the MultiRegion parameter with a value of\n True. To create replicas of the multi-Region primary key, use the ReplicateKey operation. For instructions, see Importing key material into\n multi-Region keys. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
Custom key store
\n
\n

A custom key store lets you protect your Amazon Web Services resources using keys in a backing key\n store that you own and manage. When you request a cryptographic operation with a KMS key\n in a custom key store, the operation is performed in the backing key store using its\n cryptographic keys.

\n

KMS supports CloudHSM key stores backed by an CloudHSM cluster and external key stores backed by an\n external key manager outside of Amazon Web Services. When you create a KMS key in an CloudHSM key store,\n KMS generates an encryption key in the CloudHSM cluster and associates it with the KMS\n key. When you create a KMS key in an external key store, you specify an existing\n encryption key in the external key manager.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n

Before you create a KMS key in a custom key store, the ConnectionState\n of the key store must be CONNECTED. To connect the custom key store, use\n the ConnectCustomKeyStore operation. To find the\n ConnectionState, use the DescribeCustomKeyStores\n operation.

\n

To create a KMS key in a custom key store, use the CustomKeyStoreId.\n Use the default KeySpec value, SYMMETRIC_DEFAULT, and the\n default KeyUsage value, ENCRYPT_DECRYPT to create a symmetric\n encryption key. No other key type is supported in a custom key store.

\n

To create a KMS key in an CloudHSM key store, use the\n Origin parameter with a value of AWS_CLOUDHSM. The CloudHSM\n cluster that is associated with the custom key store must have at least two active HSMs\n in different Availability Zones in the Amazon Web Services Region.

\n

To create a KMS key in an external key store, use the Origin parameter\n with a value of EXTERNAL_KEY_STORE and an XksKeyId parameter\n that identifies an existing external key.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n
\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateKey (IAM policy). To use the\n Tags parameter, kms:TagResource (IAM policy). For examples and information about related\n permissions, see Allow a user to create\n KMS keys in the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Creates a unique customer managed KMS key in your Amazon Web Services account and Region.\n You can use a KMS key in cryptographic operations, such as encryption and signing. Some Amazon Web Services\n services let you use KMS keys that you create and manage to protect your service\n resources.

\n

A KMS key is a logical representation of a cryptographic key. In addition to the key\n material used in cryptographic operations, a KMS key includes metadata, such as the key ID,\n key policy, creation date, description, and key state. For details, see Managing keys in the\n Key Management Service Developer Guide\n

\n

Use the parameters of CreateKey to specify the type of KMS key, the source of\n its key material, its key policy, description, tags, and other properties.

\n \n

KMS has replaced the term customer master key (CMK) with KMS key and KMS key. The concept has not changed. To prevent breaking changes, KMS is keeping some variations of this term.

\n
\n

To create different types of KMS keys, use the following guidance:

\n
\n
Symmetric encryption KMS key
\n
\n

By default, CreateKey creates a symmetric encryption KMS key with key\n material that KMS generates. This is the basic and most widely used type of KMS key, and\n provides the best performance.

\n

To create a symmetric encryption KMS key, you don't need to specify any parameters.\n The default value for KeySpec, SYMMETRIC_DEFAULT, the default\n value for KeyUsage, ENCRYPT_DECRYPT, and the default value for\n Origin, AWS_KMS, create a symmetric encryption KMS key with\n KMS key material.

\n

If you need a key for basic encryption and decryption or you are creating a KMS key\n to protect your resources in an Amazon Web Services service, create a symmetric encryption KMS key.\n The key material in a symmetric encryption key never leaves KMS unencrypted. You can\n use a symmetric encryption KMS key to encrypt and decrypt data up to 4,096 bytes, but\n they are typically used to generate data keys and data keys pairs. For details, see\n GenerateDataKey and GenerateDataKeyPair.

\n

\n
\n
Asymmetric KMS keys
\n
\n

To create an asymmetric KMS key, use the KeySpec parameter to specify\n the type of key material in the KMS key. Then, use the KeyUsage parameter\n to determine whether the KMS key will be used to encrypt and decrypt or sign and verify.\n You can't change these properties after the KMS key is created.

\n

Asymmetric KMS keys contain an RSA key pair, Elliptic Curve (ECC) key pair, or an\n SM2 key pair (China Regions only). The private key in an asymmetric KMS key never leaves\n KMS unencrypted. However, you can use the GetPublicKey operation to\n download the public key so it can be used outside of KMS. KMS keys with RSA or SM2 key\n pairs can be used to encrypt or decrypt data or sign and verify messages (but not both).\n KMS keys with ECC key pairs can be used only to sign and verify messages. For\n information about asymmetric KMS keys, see Asymmetric KMS keys in the\n Key Management Service Developer Guide.

\n

\n
\n
HMAC KMS key
\n
\n

To create an HMAC KMS key, set the KeySpec parameter to a key spec\n value for HMAC KMS keys. Then set the KeyUsage parameter to\n GENERATE_VERIFY_MAC. You must set the key usage even though\n GENERATE_VERIFY_MAC is the only valid key usage value for HMAC KMS keys.\n You can't change these properties after the KMS key is created.

\n

HMAC KMS keys are symmetric keys that never leave KMS unencrypted. You can use\n HMAC keys to generate (GenerateMac) and verify (VerifyMac) HMAC codes for messages up to 4096 bytes.

\n

\n
\n
Multi-Region primary keys
\n
Imported key material
\n
\n

To create a multi-Region primary key in the local Amazon Web Services Region,\n use the MultiRegion parameter with a value of True. To create\n a multi-Region replica key, that is, a KMS key with the same key ID\n and key material as a primary key, but in a different Amazon Web Services Region, use the ReplicateKey operation. To change a replica key to a primary key, and its\n primary key to a replica key, use the UpdatePrimaryRegion\n operation.

\n

You can create multi-Region KMS keys for all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't create multi-Region keys in a custom key store.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
\n

To import your own key material into a KMS key, begin by creating a KMS key with no\n key material. To do this, use the Origin parameter of\n CreateKey with a value of EXTERNAL. Next, use GetParametersForImport operation to get a public key and import token. Use\n the wrapping public key to encrypt your key material. Then, use ImportKeyMaterial with your import token to import the key material. For\n step-by-step instructions, see Importing Key Material in the \n Key Management Service Developer Guide\n .

\n

You can import key material into KMS keys of all supported KMS key types: symmetric\n encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\n signing KMS keys. You can also create multi-Region keys with imported key material.\n However, you can't import key material into a KMS key in a custom key store.

\n

To create a multi-Region primary key with imported key material, use the\n Origin parameter of CreateKey with a value of\n EXTERNAL and the MultiRegion parameter with a value of\n True. To create replicas of the multi-Region primary key, use the ReplicateKey operation. For instructions, see Importing key material into\n multi-Region keys. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

\n
\n
Custom key store
\n
\n

A custom key store lets you protect your Amazon Web Services resources using keys in a backing key\n store that you own and manage. When you request a cryptographic operation with a KMS key\n in a custom key store, the operation is performed in the backing key store using its\n cryptographic keys.

\n

KMS supports CloudHSM key stores backed by an CloudHSM cluster and external key stores backed by an\n external key manager outside of Amazon Web Services. When you create a KMS key in an CloudHSM key store,\n KMS generates an encryption key in the CloudHSM cluster and associates it with the KMS\n key. When you create a KMS key in an external key store, you specify an existing\n encryption key in the external key manager.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n

Before you create a KMS key in a custom key store, the ConnectionState\n of the key store must be CONNECTED. To connect the custom key store, use\n the ConnectCustomKeyStore operation. To find the\n ConnectionState, use the DescribeCustomKeyStores\n operation.

\n

To create a KMS key in a custom key store, use the CustomKeyStoreId.\n Use the default KeySpec value, SYMMETRIC_DEFAULT, and the\n default KeyUsage value, ENCRYPT_DECRYPT to create a symmetric\n encryption key. No other key type is supported in a custom key store.

\n

To create a KMS key in an CloudHSM key store, use the\n Origin parameter with a value of AWS_CLOUDHSM. The CloudHSM\n cluster that is associated with the custom key store must have at least two active HSMs\n in different Availability Zones in the Amazon Web Services Region.

\n

To create a KMS key in an external key store, use the\n Origin parameter with a value of EXTERNAL_KEY_STORE and an\n XksKeyId parameter that identifies an existing external key.

\n \n

Some external key managers provide a simpler method for creating a KMS key in an\n external key store. For details, see your external key manager documentation.

\n
\n
\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:CreateKey (IAM policy). To use the\n Tags parameter, kms:TagResource (IAM policy). For examples and information about related\n permissions, see Allow a user to create\n KMS keys in the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#CreateKeyRequest": { @@ -904,13 +978,13 @@ "Description": { "target": "com.amazonaws.kms#DescriptionType", "traits": { - "smithy.api#documentation": "

A description of the KMS key. Use a description that helps you decide whether the KMS key is appropriate for a task. The\n default value is an empty string (no description).

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

To set or change the description after the key is created, use UpdateKeyDescription.

" + "smithy.api#documentation": "

A description of the KMS key. Use a description that helps you decide whether the KMS key\n is appropriate for a task. The default value is an empty string (no description).

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

To set or change the description after the key is created, use UpdateKeyDescription.

" } }, "KeyUsage": { "target": "com.amazonaws.kms#KeyUsageType", "traits": { - "smithy.api#documentation": "

Determines the cryptographic operations for which you can use the KMS key. The default value is\n ENCRYPT_DECRYPT. This parameter is optional when you are creating a symmetric\n encryption KMS key; otherwise, it is required. You can't change the KeyUsage\n value after the KMS key is created.

\n

Select only one valid value.

\n
    \n
  • \n

    For symmetric encryption KMS keys, omit the parameter or specify\n ENCRYPT_DECRYPT.

    \n
  • \n
  • \n

    For HMAC KMS keys (symmetric), specify GENERATE_VERIFY_MAC.

    \n
  • \n
  • \n

    For asymmetric KMS keys with RSA key material, specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with ECC key material, specify\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with SM2 key material (China Regions only), specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
" + "smithy.api#documentation": "

Determines the cryptographic operations for which you can use the KMS key. The default value is\n ENCRYPT_DECRYPT. This parameter is optional when you are creating a symmetric\n encryption KMS key; otherwise, it is required. You can't change the KeyUsage\n value after the KMS key is created.

\n

Select only one valid value.

\n
    \n
  • \n

    For symmetric encryption KMS keys, omit the parameter or specify\n ENCRYPT_DECRYPT.

    \n
  • \n
  • \n

    For HMAC KMS keys (symmetric), specify GENERATE_VERIFY_MAC.

    \n
  • \n
  • \n

    For asymmetric KMS keys with RSA key material, specify ENCRYPT_DECRYPT or\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with ECC key material, specify\n SIGN_VERIFY.

    \n
  • \n
  • \n

    For asymmetric KMS keys with SM2 key material (China Regions only), specify\n ENCRYPT_DECRYPT or SIGN_VERIFY.

    \n
  • \n
" } }, "CustomerMasterKeySpec": { @@ -925,19 +999,19 @@ "KeySpec": { "target": "com.amazonaws.kms#KeySpec", "traits": { - "smithy.api#documentation": "

Specifies the type of KMS key to create. The default value,\n SYMMETRIC_DEFAULT, creates a KMS key with a 256-bit AES-GCM key that is used for encryption and decryption, except in China Regions, \n where it creates a 128-bit symmetric key that uses SM4 encryption. For help choosing a key spec for your KMS key, see Choosing a KMS key type in the \n Key Management Service Developer Guide\n .

\n

The KeySpec determines whether the KMS key contains a symmetric key or an\n asymmetric key pair. It also determines the algorithms that the KMS key supports. You can't\n change the KeySpec after the KMS key is created. To further restrict the\n algorithms that can be used with the KMS key, use a condition key in its key policy or IAM\n policy. For more information, see kms:EncryptionAlgorithm, kms:MacAlgorithm or kms:Signing Algorithm in the \n Key Management Service Developer Guide\n .

\n \n

\n Amazon Web Services services that\n are integrated with KMS use symmetric encryption KMS keys to protect your data.\n These services do not support asymmetric KMS keys or HMAC KMS keys.

\n
\n

KMS supports the following key specs for KMS keys:

\n
    \n
  • \n

    Symmetric encryption key (default)

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT\n

      \n
    • \n
    \n
  • \n
  • \n

    HMAC keys (symmetric)

    \n
      \n
    • \n

      \n HMAC_224\n

      \n
    • \n
    • \n

      \n HMAC_256\n

      \n
    • \n
    • \n

      \n HMAC_384\n

      \n
    • \n
    • \n

      \n HMAC_512\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric RSA key pairs

    \n
      \n
    • \n

      \n RSA_2048\n

      \n
    • \n
    • \n

      \n RSA_3072\n

      \n
    • \n
    • \n

      \n RSA_4096\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric NIST-recommended elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_NIST_P256 (secp256r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P384 (secp384r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P521 (secp521r1)

      \n
    • \n
    \n
  • \n
  • \n

    Other asymmetric elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_SECG_P256K1 (secp256k1), commonly used for\n cryptocurrencies.

      \n
    • \n
    \n
  • \n
  • \n

    SM2 key pairs (China Regions only)

    \n
      \n
    • \n

      \n SM2\n

      \n
    • \n
    \n
  • \n
" + "smithy.api#documentation": "

Specifies the type of KMS key to create. The default value,\n SYMMETRIC_DEFAULT, creates a KMS key with a 256-bit AES-GCM key that is used for\n encryption and decryption, except in China Regions, where it creates a 128-bit symmetric key\n that uses SM4 encryption. For help choosing a key spec for your KMS key, see Choosing a KMS key type in the \n Key Management Service Developer Guide\n .

\n

The KeySpec determines whether the KMS key contains a symmetric key or an\n asymmetric key pair. It also determines the algorithms that the KMS key supports. You can't\n change the KeySpec after the KMS key is created. To further restrict the\n algorithms that can be used with the KMS key, use a condition key in its key policy or IAM\n policy. For more information, see kms:EncryptionAlgorithm, kms:MacAlgorithm or kms:Signing Algorithm in the \n Key Management Service Developer Guide\n .

\n \n

\n Amazon Web Services services that\n are integrated with KMS use symmetric encryption KMS keys to protect your data.\n These services do not support asymmetric KMS keys or HMAC KMS keys.

\n
\n

KMS supports the following key specs for KMS keys:

\n
    \n
  • \n

    Symmetric encryption key (default)

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT\n

      \n
    • \n
    \n
  • \n
  • \n

    HMAC keys (symmetric)

    \n
      \n
    • \n

      \n HMAC_224\n

      \n
    • \n
    • \n

      \n HMAC_256\n

      \n
    • \n
    • \n

      \n HMAC_384\n

      \n
    • \n
    • \n

      \n HMAC_512\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric RSA key pairs

    \n
      \n
    • \n

      \n RSA_2048\n

      \n
    • \n
    • \n

      \n RSA_3072\n

      \n
    • \n
    • \n

      \n RSA_4096\n

      \n
    • \n
    \n
  • \n
  • \n

    Asymmetric NIST-recommended elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_NIST_P256 (secp256r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P384 (secp384r1)

      \n
    • \n
    • \n

      \n ECC_NIST_P521 (secp521r1)

      \n
    • \n
    \n
  • \n
  • \n

    Other asymmetric elliptic curve key pairs

    \n
      \n
    • \n

      \n ECC_SECG_P256K1 (secp256k1), commonly used for\n cryptocurrencies.

      \n
    • \n
    \n
  • \n
  • \n

    SM2 key pairs (China Regions only)

    \n
      \n
    • \n

      \n SM2\n

      \n
    • \n
    \n
  • \n
" } }, "Origin": { "target": "com.amazonaws.kms#OriginType", "traits": { - "smithy.api#documentation": "

The source of the key material for the KMS key. You cannot change the origin after you\n create the KMS key. The default is AWS_KMS, which means that KMS creates the\n key material.

\n

To create a\n KMS key with no key material (for imported key material), set this value to\n EXTERNAL. For more information about importing key material into KMS, see\n Importing Key\n Material in the Key Management Service Developer Guide. The EXTERNAL origin value is valid\n only for symmetric KMS keys.

\n

To create a KMS key in an CloudHSM key store and create its key\n material in the associated CloudHSM cluster, set this value to AWS_CLOUDHSM. You\n must also use the CustomKeyStoreId parameter to identify the CloudHSM key store. The\n KeySpec value must be SYMMETRIC_DEFAULT.

\n

To create a KMS key in\n an external key store, set this value to EXTERNAL_KEY_STORE. You must\n also use the CustomKeyStoreId parameter to identify the external key store and\n the XksKeyId parameter to identify the associated external key. The\n KeySpec value must be SYMMETRIC_DEFAULT.

" + "smithy.api#documentation": "

The source of the key material for the KMS key. You cannot change the origin after you\n create the KMS key. The default is AWS_KMS, which means that KMS creates the\n key material.

\n

To create a\n KMS key with no key material (for imported key material), set this value to\n EXTERNAL. For more information about importing key material into KMS, see\n Importing Key\n Material in the Key Management Service Developer Guide. The EXTERNAL origin value is valid\n only for symmetric KMS keys.

\n

To create a KMS\n key in an CloudHSM key store and create its key material in the associated CloudHSM\n cluster, set this value to AWS_CLOUDHSM. You must also use the\n CustomKeyStoreId parameter to identify the CloudHSM key store. The\n KeySpec value must be SYMMETRIC_DEFAULT.

\n

To create a KMS key in\n an external key store, set this value to EXTERNAL_KEY_STORE. You must\n also use the CustomKeyStoreId parameter to identify the external key store and\n the XksKeyId parameter to identify the associated external key. The\n KeySpec value must be SYMMETRIC_DEFAULT.

" } }, "CustomKeyStoreId": { "target": "com.amazonaws.kms#CustomKeyStoreIdType", "traits": { - "smithy.api#documentation": "

Creates the KMS key in the specified custom key store. The ConnectionState of\n the custom key store must be CONNECTED. To find the CustomKeyStoreID and\n ConnectionState use the DescribeCustomKeyStores operation.

\n

This parameter is valid only for symmetric encryption KMS keys in a single Region. You\n cannot create any other type of KMS key in a custom key store.

\n

When you create a KMS key in an CloudHSM key store, KMS generates a non-exportable 256-bit\n symmetric key in its associated CloudHSM cluster and associates it with the KMS key. When you\n create a KMS key in an external key store, you must use the XksKeyId parameter to specify an\n external key that serves as key material for the KMS key.

" + "smithy.api#documentation": "

Creates the KMS key in the specified custom key store. The ConnectionState of\n the custom key store must be CONNECTED. To find the CustomKeyStoreID and\n ConnectionState use the DescribeCustomKeyStores operation.

\n

This parameter is valid only for symmetric encryption KMS keys in a single Region. You\n cannot create any other type of KMS key in a custom key store.

\n

When you create a KMS key in an CloudHSM key store, KMS generates a non-exportable 256-bit\n symmetric key in its associated CloudHSM cluster and associates it with the KMS key. When you\n create a KMS key in an external key store, you must use the XksKeyId parameter to\n specify an external key that serves as key material for the KMS key.

" } }, "BypassPolicyLockoutSafetyCheck": { @@ -1129,7 +1203,7 @@ "ConnectionErrorCode": { "target": "com.amazonaws.kms#ConnectionErrorCodeType", "traits": { - "smithy.api#documentation": "

Describes the connection error. This field appears in the response only when the\n ConnectionState is FAILED.

\n

Many failures can be resolved by updating the properties of the custom key store. To\n update a custom key store, disconnect it (DisconnectCustomKeyStore), correct\n the errors (UpdateCustomKeyStore), and try to connect again (ConnectCustomKeyStore). For additional help resolving these errors, see How to Fix a\n Connection Failure in Key Management Service Developer Guide.

\n

\n All custom key stores:\n

\n
    \n
  • \n

    \n INTERNAL_ERROR — KMS could not complete the request due to an\n internal error. Retry the request. For ConnectCustomKeyStore requests,\n disconnect the custom key store before trying to connect again.

    \n
  • \n
  • \n

    \n NETWORK_ERRORS — Network errors are preventing KMS from\n connecting the custom key store to its backing key store.

    \n
  • \n
\n

\n CloudHSM key stores:\n

\n
    \n
  • \n

    \n CLUSTER_NOT_FOUND — KMS cannot find the CloudHSM cluster with the\n specified cluster ID.

    \n
  • \n
  • \n

    \n INSUFFICIENT_CLOUDHSM_HSMS — The associated CloudHSM cluster does not\n contain any active HSMs. To connect a custom key store to its CloudHSM cluster, the cluster\n must contain at least one active HSM.

    \n
  • \n
  • \n

    \n INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET — At least one private subnet\n associated with the CloudHSM cluster doesn't have any available IP addresses. A CloudHSM key\n store connection requires one free IP address in each of the associated private subnets,\n although two are preferable. For details, see How to Fix a Connection\n Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n INVALID_CREDENTIALS — The KeyStorePassword for the\n custom key store doesn't match the current password of the kmsuser crypto\n user in the CloudHSM cluster. Before you can connect your custom key store to its CloudHSM\n cluster, you must change the kmsuser account password and update the\n KeyStorePassword value for the custom key store.

    \n
  • \n
  • \n

    \n SUBNET_NOT_FOUND — A subnet in the CloudHSM cluster configuration was\n deleted. If KMS cannot find all of the subnets in the cluster configuration, attempts to\n connect the custom key store to the CloudHSM cluster fail. To fix this error, create a\n cluster from a recent backup and associate it with your custom key store. (This process\n creates a new cluster configuration with a VPC and private subnets.) For details, see\n How\n to Fix a Connection Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_LOCKED_OUT — The kmsuser CU account is locked\n out of the associated CloudHSM cluster due to too many failed password attempts. Before you\n can connect your custom key store to its CloudHSM cluster, you must change the\n kmsuser account password and update the key store password value for the\n custom key store.

    \n
  • \n
  • \n

    \n USER_LOGGED_IN — The kmsuser CU account is logged\n into the associated CloudHSM cluster. This prevents KMS from rotating the\n kmsuser account password and logging into the cluster. Before you can\n connect your custom key store to its CloudHSM cluster, you must log the kmsuser\n CU out of the cluster. If you changed the kmsuser password to log into the\n cluster, you must also and update the key store password value for the custom key store.\n For help, see How to Log Out and\n Reconnect in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_NOT_FOUND — KMS cannot find a kmsuser CU\n account in the associated CloudHSM cluster. Before you can connect your custom key store to\n its CloudHSM cluster, you must create a kmsuser CU account in the cluster, and\n then update the key store password value for the custom key store.

    \n
  • \n
\n

\n External key stores:\n

\n
    \n
  • \n

    \n INVALID_CREDENTIALS — One or both of the\n XksProxyAuthenticationCredential values is not valid on the specified\n external key store proxy.

    \n
  • \n
  • \n

    \n XKS_PROXY_ACCESS_DENIED — KMS requests are denied access to the\n external key store proxy. If the external key store proxy has authorization rules, verify\n that they permit KMS to communicate with the proxy on your behalf.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_CONFIGURATION — A configuration error is\n preventing the external key store from connecting to its proxy. Verify the value of the\n XksProxyUriPath.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_RESPONSE — KMS cannot interpret the response\n from the external key store proxy. If you see this connection error code repeatedly,\n notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_TLS_CONFIGURATION — KMS cannot connect to the\n external key store proxy because the TLS configuration is invalid. Verify that the XKS\n proxy supports TLS 1.2 or 1.3. Also, verify that the TLS certificate is not expired, and\n that it matches the hostname in the XksProxyUriEndpoint value, and that it is\n signed by a certificate authority included in the Trusted Certificate Authorities\n list.

    \n
  • \n
  • \n

    \n XKS_PROXY_NOT_REACHABLE — KMS can't communicate with your\n external key store proxy. Verify that the XksProxyUriEndpoint and\n XksProxyUriPath are correct. Use the tools for your external key store\n proxy to verify that the proxy is active and available on its network. Also, verify that\n your external key manager instances are operating properly. Connection attempts fail with\n this connection error code if the proxy reports that all external key manager instances\n are unavailable.

    \n
  • \n
  • \n

    \n XKS_PROXY_TIMED_OUT — KMS can connect to the external key store\n proxy, but the proxy does not respond to KMS in the time allotted. If you see this\n connection error code repeatedly, notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION — The Amazon VPC\n endpoint service configuration doesn't conform to the requirements for an KMS external\n key store.

    \n
      \n
    • \n

      The VPC endpoint service must be an endpoint service for interface endpoints in the caller's Amazon Web Services account.

      \n
    • \n
    • \n

      It must have a network load balancer (NLB) connected to at least two subnets, each in a different Availability Zone.

      \n
    • \n
    • \n

      The Allow principals list must include \n\t the KMS service principal for the Region, cks.kms..amazonaws.com, \n\t such as cks.kms.us-east-1.amazonaws.com.

      \n
    • \n
    • \n

      It must not require acceptance of connection requests.

      \n
    • \n
    • \n

      It must have a private DNS name. The private DNS name for an external key store with VPC_ENDPOINT_SERVICE connectivity\n\t must be unique in its Amazon Web Services Region.

      \n
    • \n
    • \n

      The domain of the private DNS name must have a verification status of\n\t verified.

      \n
    • \n
    • \n

      The TLS certificate specifies the private DNS hostname at which the endpoint is reachable.

      \n
    • \n
    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND — KMS can't find the VPC\n endpoint service that it uses to communicate with the external key store proxy. Verify\n that the XksProxyVpcEndpointServiceName is correct and the KMS service\n principal has service consumer permissions on the Amazon VPC endpoint service.

    \n
  • \n
" + "smithy.api#documentation": "

Describes the connection error. This field appears in the response only when the\n ConnectionState is FAILED.

\n

Many failures can be resolved by updating the properties of the custom key store. To\n update a custom key store, disconnect it (DisconnectCustomKeyStore), correct\n the errors (UpdateCustomKeyStore), and try to connect again (ConnectCustomKeyStore). For additional help resolving these errors, see How to Fix a\n Connection Failure in Key Management Service Developer Guide.

\n

\n All custom key stores:\n

\n
    \n
  • \n

    \n INTERNAL_ERROR — KMS could not complete the request due to an\n internal error. Retry the request. For ConnectCustomKeyStore requests,\n disconnect the custom key store before trying to connect again.

    \n
  • \n
  • \n

    \n NETWORK_ERRORS — Network errors are preventing KMS from\n connecting the custom key store to its backing key store.

    \n
  • \n
\n

\n CloudHSM key stores:\n

\n
    \n
  • \n

    \n CLUSTER_NOT_FOUND — KMS cannot find the CloudHSM cluster with the\n specified cluster ID.

    \n
  • \n
  • \n

    \n INSUFFICIENT_CLOUDHSM_HSMS — The associated CloudHSM cluster does not\n contain any active HSMs. To connect a custom key store to its CloudHSM cluster, the cluster\n must contain at least one active HSM.

    \n
  • \n
  • \n

    \n INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET — At least one private\n subnet associated with the CloudHSM cluster doesn't have any available IP addresses. A CloudHSM\n key store connection requires one free IP address in each of the associated private\n subnets, although two are preferable. For details, see How to Fix a Connection\n Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n INVALID_CREDENTIALS — The KeyStorePassword for the\n custom key store doesn't match the current password of the kmsuser crypto\n user in the CloudHSM cluster. Before you can connect your custom key store to its CloudHSM\n cluster, you must change the kmsuser account password and update the\n KeyStorePassword value for the custom key store.

    \n
  • \n
  • \n

    \n SUBNET_NOT_FOUND — A subnet in the CloudHSM cluster configuration was\n deleted. If KMS cannot find all of the subnets in the cluster configuration, attempts to\n connect the custom key store to the CloudHSM cluster fail. To fix this error, create a\n cluster from a recent backup and associate it with your custom key store. (This process\n creates a new cluster configuration with a VPC and private subnets.) For details, see\n How\n to Fix a Connection Failure in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_LOCKED_OUT — The kmsuser CU account is locked\n out of the associated CloudHSM cluster due to too many failed password attempts. Before you\n can connect your custom key store to its CloudHSM cluster, you must change the\n kmsuser account password and update the key store password value for the\n custom key store.

    \n
  • \n
  • \n

    \n USER_LOGGED_IN — The kmsuser CU account is logged\n into the associated CloudHSM cluster. This prevents KMS from rotating the\n kmsuser account password and logging into the cluster. Before you can\n connect your custom key store to its CloudHSM cluster, you must log the kmsuser\n CU out of the cluster. If you changed the kmsuser password to log into the\n cluster, you must also and update the key store password value for the custom key store.\n For help, see How to Log Out and\n Reconnect in the Key Management Service Developer Guide.

    \n
  • \n
  • \n

    \n USER_NOT_FOUND — KMS cannot find a kmsuser CU\n account in the associated CloudHSM cluster. Before you can connect your custom key store to\n its CloudHSM cluster, you must create a kmsuser CU account in the cluster, and\n then update the key store password value for the custom key store.

    \n
  • \n
\n

\n External key stores:\n

\n
    \n
  • \n

    \n INVALID_CREDENTIALS — One or both of the\n XksProxyAuthenticationCredential values is not valid on the specified\n external key store proxy.

    \n
  • \n
  • \n

    \n XKS_PROXY_ACCESS_DENIED — KMS requests are denied access to the\n external key store proxy. If the external key store proxy has authorization rules, verify\n that they permit KMS to communicate with the proxy on your behalf.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_CONFIGURATION — A configuration error is\n preventing the external key store from connecting to its proxy. Verify the value of the\n XksProxyUriPath.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_RESPONSE — KMS cannot interpret the response\n from the external key store proxy. If you see this connection error code repeatedly,\n notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_PROXY_INVALID_TLS_CONFIGURATION — KMS cannot connect to the\n external key store proxy because the TLS configuration is invalid. Verify that the XKS\n proxy supports TLS 1.2 or 1.3. Also, verify that the TLS certificate is not expired, and\n that it matches the hostname in the XksProxyUriEndpoint value, and that it is\n signed by a certificate authority included in the Trusted Certificate Authorities list.

    \n
  • \n
  • \n

    \n XKS_PROXY_NOT_REACHABLE — KMS can't communicate with your\n external key store proxy. Verify that the XksProxyUriEndpoint and\n XksProxyUriPath are correct. Use the tools for your external key store\n proxy to verify that the proxy is active and available on its network. Also, verify that\n your external key manager instances are operating properly. Connection attempts fail with\n this connection error code if the proxy reports that all external key manager instances\n are unavailable.

    \n
  • \n
  • \n

    \n XKS_PROXY_TIMED_OUT — KMS can connect to the external key store\n proxy, but the proxy does not respond to KMS in the time allotted. If you see this\n connection error code repeatedly, notify your external key store proxy vendor.

    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION — The Amazon VPC\n endpoint service configuration doesn't conform to the requirements for an KMS external\n key store.

    \n
      \n
    • \n

      The VPC endpoint service must be an endpoint service for interface endpoints in the caller's Amazon Web Services account.

      \n
    • \n
    • \n

      It must have a network load balancer (NLB) connected to at least two subnets, each in a different Availability Zone.

      \n
    • \n
    • \n

      The Allow principals list must include \n\t the KMS service principal for the Region, cks.kms..amazonaws.com, \n\t such as cks.kms.us-east-1.amazonaws.com.

      \n
    • \n
    • \n

      It must not require acceptance of connection requests.

      \n
    • \n
    • \n

      It must have a private DNS name. The private DNS name for an external key store with VPC_ENDPOINT_SERVICE connectivity\n\t must be unique in its Amazon Web Services Region.

      \n
    • \n
    • \n

      The domain of the private DNS name must have a verification status of\n\t verified.

      \n
    • \n
    • \n

      The TLS certificate specifies the private DNS hostname at which the endpoint is reachable.

      \n
    • \n
    \n
  • \n
  • \n

    \n XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND — KMS can't find the VPC\n endpoint service that it uses to communicate with the external key store proxy. Verify\n that the XksProxyVpcEndpointServiceName is correct and the KMS service\n principal has service consumer permissions on the Amazon VPC endpoint service.

    \n
  • \n
" } }, "CreationDate": { @@ -1331,6 +1405,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#IncorrectKeyException" }, @@ -1357,7 +1434,22 @@ } ], "traits": { - "smithy.api#documentation": "

Decrypts ciphertext that was encrypted by a KMS key using any of the following\n operations:

\n \n

You can use this operation to decrypt ciphertext that was encrypted under a symmetric\n encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\n must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

The Decrypt operation also decrypts ciphertext that was encrypted outside of\n KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\n ciphertext produced by other libraries, such as the Amazon Web Services Encryption SDK or Amazon S3 client-side encryption.\n These libraries return a ciphertext format that is incompatible with KMS.

\n

If the ciphertext was encrypted under a symmetric encryption KMS key, the\n KeyId parameter is optional. KMS can get this information from metadata that\n it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\n by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\n if they've lost track of the key ID. However, specifying the KMS key is always recommended as\n a best practice. When you use the KeyId parameter to specify a KMS key, KMS\n only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\n the Decrypt operation fails. This practice ensures that you use the KMS key that\n you intend.

\n

Whenever possible, use key policies to give users permission to call the\n Decrypt operation on a particular KMS key, instead of using &IAM; policies.\n Otherwise, you might create an &IAM; policy that gives the user Decrypt\n permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\n in other accounts if the key policy for the cross-account KMS key permits it. If you must use\n an IAM policy for Decrypt permissions, limit the user to particular KMS keys or\n particular trusted accounts. For details, see Best practices for IAM\n policies in the Key Management Service Developer Guide.

\n

\n Decrypt also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call Decrypt for a Nitro enclave, use\n the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter to provide the\n attestation document for the enclave. Instead of the plaintext data, the response includes the\n plaintext data encrypted with the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. If you use the KeyId\n parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\n ARN of the KMS key.

\n

\n Required permissions: kms:Decrypt (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Decrypts ciphertext that was encrypted by a KMS key using any of the following\n operations:

\n \n

You can use this operation to decrypt ciphertext that was encrypted under a symmetric\n encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\n must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

The Decrypt operation also decrypts ciphertext that was encrypted outside of\n KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\n ciphertext produced by other libraries, such as the Amazon Web Services Encryption SDK or Amazon S3 client-side encryption.\n These libraries return a ciphertext format that is incompatible with KMS.

\n

If the ciphertext was encrypted under a symmetric encryption KMS key, the\n KeyId parameter is optional. KMS can get this information from metadata that\n it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\n by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\n if they've lost track of the key ID. However, specifying the KMS key is always recommended as\n a best practice. When you use the KeyId parameter to specify a KMS key, KMS\n only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\n the Decrypt operation fails. This practice ensures that you use the KMS key that\n you intend.

\n

Whenever possible, use key policies to give users permission to call the\n Decrypt operation on a particular KMS key, instead of using &IAM; policies.\n Otherwise, you might create an &IAM; policy that gives the user Decrypt\n permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\n in other accounts if the key policy for the cross-account KMS key permits it. If you must use\n an IAM policy for Decrypt permissions, limit the user to particular KMS keys or\n particular trusted accounts. For details, see Best practices for IAM\n policies in the Key Management Service Developer Guide.

\n

\n Decrypt also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call Decrypt for a Nitro enclave, use\n the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter to provide the\n attestation document for the enclave. Instead of the plaintext data, the response includes the\n plaintext data encrypted with the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. If you use the KeyId\n parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\n ARN of the KMS key.

\n

\n Required permissions: kms:Decrypt (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To decrypt data with a symmetric encryption KMS key", + "documentation": "The following example decrypts data that was encrypted with a symmetric encryption KMS key. The KeyId is not required when decrypting with a symmetric encryption key, but it is a best practice.", + "input": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "Plaintext": "", + "EncryptionAlgorithm": "SYMMETRIC_DEFAULT" + } + } + ] } }, "com.amazonaws.kms#DecryptRequest": { @@ -1397,7 +1489,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data, KMS encrypts the\n plaintext data with the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data, KMS encrypts the\n plaintext data with the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -1417,7 +1515,7 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Decrypted plaintext data. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

Decrypted plaintext data. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "EncryptionAlgorithm": { @@ -1460,7 +1558,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified alias.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Because an alias is not a property of a KMS key, you can delete and change the aliases of\n a KMS key without affecting the KMS key. Also, aliases do not appear in the response from the\n DescribeKey operation. To get the aliases of all KMS keys, use the ListAliases operation.

\n

Each KMS key can have multiple aliases. To change the alias of a KMS key, use DeleteAlias to delete the current alias and CreateAlias to\n create a new alias. To associate an existing alias with a different KMS key, call UpdateAlias.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes the specified alias.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Because an alias is not a property of a KMS key, you can delete and change the aliases of\n a KMS key without affecting the KMS key. Also, aliases do not appear in the response from the\n DescribeKey operation. To get the aliases of all KMS keys, use the ListAliases operation.

\n

Each KMS key can have multiple aliases. To change the alias of a KMS key, use DeleteAlias to delete the current alias and CreateAlias to\n create a new alias. To associate an existing alias with a different KMS key, call UpdateAlias.

\n

\n Cross-account use: No. You cannot perform this operation on an alias in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete an alias", + "documentation": "The following example deletes the specified alias.", + "input": { + "AliasName": "alias/ExampleAlias" + } + } + ] } }, "com.amazonaws.kms#DeleteAliasRequest": { @@ -1501,7 +1608,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a custom key store. This operation does not affect any backing elements of the\n custom key store. It does not delete the CloudHSM cluster that is associated with an CloudHSM key\n store, or affect any users or keys in the cluster. For an external key store, it does not\n affect the external key store proxy, external key manager, or any external keys.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The custom key store that you delete cannot contain any KMS keys. Before deleting the key store,\n verify that you will never need to use any of the KMS keys in the key store for any\n cryptographic operations. Then, use ScheduleKeyDeletion to delete the KMS keys from the\n key store. After the required waiting period expires and all KMS keys are deleted from the\n custom key store, use DisconnectCustomKeyStore to disconnect the key store\n from KMS. Then, you can delete the custom key store.

\n

For keys in an CloudHSM key store, the ScheduleKeyDeletion operation makes a\n best effort to delete the key material from the associated cluster. However, you might need to\n manually delete the orphaned key\n material from the cluster and its backups. KMS never creates, manages, or deletes\n cryptographic keys in the external key manager associated with an external key store. You must\n manage them using your external key manager tools.

\n

Instead of deleting the custom key store, consider using the DisconnectCustomKeyStore operation to disconnect the custom key store from its\n backing key store. While the key store is disconnected, you cannot create or use the KMS keys\n in the key store. But, you do not need to delete KMS keys and you can reconnect a disconnected\n custom key store at any time.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes a custom key store. This operation does not affect any backing elements of the\n custom key store. It does not delete the CloudHSM cluster that is associated with an CloudHSM key\n store, or affect any users or keys in the cluster. For an external key store, it does not\n affect the external key store proxy, external key manager, or any external keys.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

The custom key store that you delete cannot contain any KMS keys. Before deleting the key store,\n verify that you will never need to use any of the KMS keys in the key store for any\n cryptographic operations. Then, use ScheduleKeyDeletion to delete the KMS keys from the\n key store. After the required waiting period expires and all KMS keys are deleted from the\n custom key store, use DisconnectCustomKeyStore to disconnect the key store\n from KMS. Then, you can delete the custom key store.

\n

For keys in an CloudHSM key store, the ScheduleKeyDeletion operation makes a\n best effort to delete the key material from the associated cluster. However, you might need to\n manually delete the orphaned key\n material from the cluster and its backups. KMS never creates, manages, or deletes\n cryptographic keys in the external key manager associated with an external key store. You must\n manage them using your external key manager tools.

\n

Instead of deleting the custom key store, consider using the DisconnectCustomKeyStore operation to disconnect the custom key store from its\n backing key store. While the key store is disconnected, you cannot create or use the KMS keys\n in the key store. But, you do not need to delete KMS keys and you can reconnect a disconnected\n custom key store at any time.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete a custom key store from AWS KMS", + "documentation": "This example deletes a custom key store from AWS KMS. This operation does not affect the backing key store, such as a CloudHSM cluster, external key store proxy, or your external key manager. This operation doesn't return any data. To verify that the operation was successful, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#DeleteCustomKeyStoreRequest": { @@ -1555,7 +1672,16 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes key material that was previously imported. This operation makes the specified KMS\n key temporarily unusable. To restore the usability of the KMS key, reimport the same key\n material. For more information about importing key material into KMS, see Importing Key Material\n in the Key Management Service Developer Guide.

\n

When the specified KMS key is in the PendingDeletion state, this operation\n does not change the KMS key's state. Otherwise, it changes the KMS key's state to\n PendingImport.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteImportedKeyMaterial (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes key material that was previously imported. This operation makes the specified KMS\n key temporarily unusable. To restore the usability of the KMS key, reimport the same key\n material. For more information about importing key material into KMS, see Importing Key Material\n in the Key Management Service Developer Guide.

\n

When the specified KMS key is in the PendingDeletion state, this operation\n does not change the KMS key's state. Otherwise, it changes the KMS key's state to\n PendingImport.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DeleteImportedKeyMaterial (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To delete imported key material", + "documentation": "The following example deletes the imported key material from the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DeleteImportedKeyMaterialRequest": { @@ -1610,7 +1736,16 @@ } ], "traits": { - "smithy.api#documentation": "

Gets information about custom key stores in the account and Region.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

By default, this operation returns information about all custom key stores in the account\n and Region. To get only information about a particular custom key store, use either the\n CustomKeyStoreName or CustomKeyStoreId parameter (but not\n both).

\n

To determine whether the custom key store is connected to its CloudHSM cluster or external\n key store proxy, use the ConnectionState element in the response. If an attempt\n to connect the custom key store failed, the ConnectionState value is\n FAILED and the ConnectionErrorCode element in the response\n indicates the cause of the failure. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

Custom key stores have a DISCONNECTED connection state if the key store has\n never been connected or you used the DisconnectCustomKeyStore operation to\n disconnect it. Otherwise, the connection state is CONNECTED. If your custom key store\n connection state is CONNECTED but you are having trouble using it, verify that\n the backing store is active and available. For an CloudHSM key store, verify that the associated\n CloudHSM cluster is active and contains the minimum number of HSMs required for the operation, if\n any. For an external key store, verify that the external key store proxy and its associated\n external key manager are reachable and enabled.

\n

For help repairing your CloudHSM key store, see the Troubleshooting CloudHSM key stores. For help\n repairing your external key store, see the Troubleshooting external key stores. Both\n topics are in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DescribeCustomKeyStores (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#documentation": "

Gets information about custom key stores in the account and Region.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

By default, this operation returns information about all custom key stores in the account\n and Region. To get only information about a particular custom key store, use either the\n CustomKeyStoreName or CustomKeyStoreId parameter (but not\n both).

\n

To determine whether the custom key store is connected to its CloudHSM cluster or external\n key store proxy, use the ConnectionState element in the response. If an attempt\n to connect the custom key store failed, the ConnectionState value is\n FAILED and the ConnectionErrorCode element in the response\n indicates the cause of the failure. For help interpreting the\n ConnectionErrorCode, see CustomKeyStoresListEntry.

\n

Custom key stores have a DISCONNECTED connection state if the key store has\n never been connected or you used the DisconnectCustomKeyStore operation to\n disconnect it. Otherwise, the connection state is CONNECTED. If your custom key store\n connection state is CONNECTED but you are having trouble using it, verify that\n the backing store is active and available. For an CloudHSM key store, verify that the associated\n CloudHSM cluster is active and contains the minimum number of HSMs required for the operation, if\n any. For an external key store, verify that the external key store proxy and its associated\n external key manager are reachable and enabled.

\n

For help repairing your CloudHSM key store, see the Troubleshooting CloudHSM key stores. For help\n repairing your external key store, see the Troubleshooting external key stores.\n Both topics are in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DescribeCustomKeyStores (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To get detailed information about custom key stores in the account and Region", + "documentation": "This example gets detailed information about all AWS KMS custom key stores in an AWS account and Region. To get all key stores, do not enter a custom key store name or ID.", + "output": { + "CustomKeyStores": [] + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -1774,7 +1909,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the state of a KMS key to disabled. This change temporarily prevents use of the KMS\n key for cryptographic operations.

\n

For more information about how key state affects the use of a KMS key, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKey (key policy)

\n

\n Related operations: EnableKey\n

" + "smithy.api#documentation": "

Sets the state of a KMS key to disabled. This change temporarily prevents use of the KMS\n key for cryptographic operations.

\n

For more information about how key state affects the use of a KMS key, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKey (key policy)

\n

\n Related operations: EnableKey\n

", + "smithy.api#examples": [ + { + "title": "To disable a KMS key", + "documentation": "The following example disables the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DisableKeyRequest": { @@ -1824,7 +1968,16 @@ } ], "traits": { - "smithy.api#documentation": "

Disables automatic\n rotation of the key material of the specified symmetric encryption KMS key.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You can enable (EnableKeyRotation) and disable automatic rotation of the\n key material in customer managed KMS keys. Key material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material for every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKeyRotation (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Disables automatic\n rotation of the key material of the specified symmetric encryption KMS key.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You can enable (EnableKeyRotation) and disable automatic rotation of the\n key material in customer managed KMS keys. Key material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material for every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisableKeyRotation (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To disable automatic rotation of key material", + "documentation": "The following example disables automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#DisableKeyRotationRequest": { @@ -1879,7 +2032,17 @@ } ], "traits": { - "smithy.api#documentation": "

Disconnects the custom key store from its backing key store. This operation disconnects an\n CloudHSM key store from its associated CloudHSM cluster or disconnects an external key store from\n the external key store proxy that communicates with your external key manager.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

While a custom key store is disconnected, you can manage the custom key store and its KMS\n keys, but you cannot create or use its KMS keys. You can reconnect the custom key store at any\n time.

\n \n

While a custom key store is disconnected, all attempts to create KMS keys in the custom key store or to use existing KMS keys in cryptographic operations will\n fail. This action can prevent users from storing and accessing sensitive data.

\n
\n

When you disconnect a custom key store, its ConnectionState changes to\n Disconnected. To find the connection state of a custom key store, use the DescribeCustomKeyStores operation. To reconnect a custom key store, use the\n ConnectCustomKeyStore operation.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisconnectCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Disconnects the custom key store from its backing key store. This operation disconnects an\n CloudHSM key store from its associated CloudHSM cluster or disconnects an external key store from\n the external key store proxy that communicates with your external key manager.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n

While a custom key store is disconnected, you can manage the custom key store and its KMS\n keys, but you cannot create or use its KMS keys. You can reconnect the custom key store at any\n time.

\n \n

While a custom key store is disconnected, all attempts to create KMS keys in the custom key store or to use existing KMS keys in cryptographic operations will\n fail. This action can prevent users from storing and accessing sensitive data.

\n
\n

When you disconnect a custom key store, its ConnectionState changes to\n Disconnected. To find the connection state of a custom key store, use the DescribeCustomKeyStores operation. To reconnect a custom key store, use the\n ConnectCustomKeyStore operation.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:DisconnectCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To disconnect a custom key store from its CloudHSM cluster", + "documentation": "This example disconnects an AWS KMS custom key store from its backing key store. For an AWS CloudHSM key store, it disconnects the key store from its AWS CloudHSM cluster. For an external key store, it disconnects the key store from the external key store proxy that communicates with your external key manager. This operation doesn't return any data. To verify that the custom key store is disconnected, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#DisconnectCustomKeyStoreRequest": { @@ -1904,6 +2067,23 @@ "smithy.api#output": {} } }, + "com.amazonaws.kms#DryRunOperationException": { + "type": "structure", + "members": { + "message": { + "target": "com.amazonaws.kms#ErrorMessageType" + } + }, + "traits": { + "aws.protocols#awsQueryError": { + "code": "DryRunOperation", + "httpResponseCode": 412 + }, + "smithy.api#documentation": "

\n The request was rejected because the DryRun parameter was specified.\n

", + "smithy.api#error": "client", + "smithy.api#httpError": 412 + } + }, "com.amazonaws.kms#EnableKey": { "type": "operation", "input": { @@ -1933,7 +2113,16 @@ } ], "traits": { - "smithy.api#documentation": "

Sets the key state of a KMS key to enabled. This allows you to use the KMS key for\n cryptographic operations.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKey (key policy)

\n

\n Related operations: DisableKey\n

" + "smithy.api#documentation": "

Sets the key state of a KMS key to enabled. This allows you to use the KMS key for\n cryptographic operations.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKey (key policy)

\n

\n Related operations: DisableKey\n

", + "smithy.api#examples": [ + { + "title": "To enable a KMS key", + "documentation": "The following example enables the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#EnableKeyRequest": { @@ -1983,7 +2172,16 @@ } ], "traits": { - "smithy.api#documentation": "

Enables automatic rotation\n of the key material of the specified symmetric encryption KMS key.

\n

When you enable automatic rotation of acustomer managed KMS key, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch. To disable rotation of the key material in a customer\n managed KMS key, use the DisableKeyRotation operation.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You cannot enable or disable automatic rotation Amazon Web Services managed KMS keys. KMS\n always rotates the key material of Amazon Web Services managed keys every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years (approximately 1,095 days) to every year (approximately 365 days).

\n

New Amazon Web Services managed keys are automatically rotated one year after they are created, and\n approximately every year thereafter.

\n

Existing Amazon Web Services managed keys are automatically rotated one year after their most recent\n rotation, and every year thereafter.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKeyRotation (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Enables automatic rotation\n of the key material of the specified symmetric encryption KMS key.

\n

When you enable automatic rotation of acustomer managed KMS key, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch. To disable rotation of the key material in a customer\n managed KMS key, use the DisableKeyRotation operation.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key.

\n

You cannot enable or disable automatic rotation Amazon Web Services managed KMS keys. KMS\n always rotates the key material of Amazon Web Services managed keys every year. Rotation of Amazon Web Services owned KMS\n keys varies.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years (approximately 1,095 days) to every year (approximately 365 days).

\n

New Amazon Web Services managed keys are automatically rotated one year after they are created, and\n approximately every year thereafter.

\n

Existing Amazon Web Services managed keys are automatically rotated one year after their most recent\n rotation, and every year thereafter.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:EnableKeyRotation (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To enable automatic rotation of key material", + "documentation": "The following example enables automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#EnableKeyRotationRequest": { @@ -2016,6 +2214,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2036,7 +2237,22 @@ } ], "traits": { - "smithy.api#documentation": "

Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\n asymmetric KMS key with a KeyUsage of ENCRYPT_DECRYPT.

\n

You can use this operation to encrypt small amounts of arbitrary data, such as a personal\n identifier or database password, or other sensitive information. You don't need to use the\n Encrypt operation to encrypt a data key. The GenerateDataKey\n and GenerateDataKeyPair operations return a plaintext data key and an\n encrypted copy of that data key.

\n

If you use a symmetric encryption KMS key, you can use an encryption context to add\n additional security to your encryption operation. If you specify an\n EncryptionContext when encrypting data, you must specify the same encryption\n context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\n decrypt fails with an InvalidCiphertextException. For more information, see\n Encryption\n Context in the Key Management Service Developer Guide.

\n

If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\n algorithm must be compatible with the KMS key spec.

\n \n

When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

\n

You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

\n
\n

The maximum size of the data that you can encrypt varies with the type of KMS key and the\n encryption algorithm that you choose.

\n
    \n
  • \n

    Symmetric encryption KMS keys

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT: 4096 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_2048\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 214 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 190 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_3072\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 342 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 318 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_4096\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 470 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 446 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n SM2PKE: 1024 bytes (China Regions only)

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes.\n To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Encrypt (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\n asymmetric KMS key with a KeyUsage of ENCRYPT_DECRYPT.

\n

You can use this operation to encrypt small amounts of arbitrary data, such as a personal\n identifier or database password, or other sensitive information. You don't need to use the\n Encrypt operation to encrypt a data key. The GenerateDataKey\n and GenerateDataKeyPair operations return a plaintext data key and an\n encrypted copy of that data key.

\n

If you use a symmetric encryption KMS key, you can use an encryption context to add\n additional security to your encryption operation. If you specify an\n EncryptionContext when encrypting data, you must specify the same encryption\n context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\n decrypt fails with an InvalidCiphertextException. For more information, see\n Encryption\n Context in the Key Management Service Developer Guide.

\n

If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\n algorithm must be compatible with the KMS key spec.

\n \n

When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

\n

You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

\n
\n

The maximum size of the data that you can encrypt varies with the type of KMS key and the\n encryption algorithm that you choose.

\n
    \n
  • \n

    Symmetric encryption KMS keys

    \n
      \n
    • \n

      \n SYMMETRIC_DEFAULT: 4096 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_2048\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 214 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 190 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_3072\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 342 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 318 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n RSA_4096\n

    \n
      \n
    • \n

      \n RSAES_OAEP_SHA_1: 470 bytes

      \n
    • \n
    • \n

      \n RSAES_OAEP_SHA_256: 446 bytes

      \n
    • \n
    \n
  • \n
  • \n

    \n SM2PKE: 1024 bytes (China Regions only)

    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Encrypt (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To encrypt data with a symmetric encryption KMS key", + "documentation": "The following example encrypts data with the specified symmetric encryption KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Plaintext": "" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "EncryptionAlgorithm": "SYMMETRIC_DEFAULT" + } + } + ] } }, "com.amazonaws.kms#EncryptRequest": { @@ -2071,7 +2287,13 @@ "EncryptionAlgorithm": { "target": "com.amazonaws.kms#EncryptionAlgorithmSpec", "traits": { - "smithy.api#documentation": "

Specifies the encryption algorithm that KMS will use to encrypt the plaintext message.\n The algorithm must be compatible with the KMS key that you specify.

\n

This parameter is required only for asymmetric KMS keys. The default value,\n SYMMETRIC_DEFAULT, is the algorithm used for symmetric encryption KMS keys. If you are\n using an asymmetric KMS key, we recommend RSAES_OAEP_SHA_256.

\n

The SM2PKE algorithm is only available in China Regions.

" + "smithy.api#documentation": "

Specifies the encryption algorithm that KMS will use to encrypt the plaintext message.\n The algorithm must be compatible with the KMS key that you specify.

\n

This parameter is required only for asymmetric KMS keys. The default value,\n SYMMETRIC_DEFAULT, is the algorithm used for symmetric encryption KMS keys. If\n you are using an asymmetric KMS key, we recommend RSAES_OAEP_SHA_256.

\n

The SM2PKE algorithm is only available in China Regions.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2207,6 +2429,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2227,7 +2452,22 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\n key that you specify. The bytes in the plaintext key are random; they are not related \n to the caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS \n and store the encrypted data key with the encrypted data.

\n

To generate a data key, specify the symmetric encryption KMS key that will be used to\n encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or \n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use \n the KeySpec parameter.

\n

To generate a 128-bit SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or a NumberOfBytes value of 16. The symmetric \n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. To generate an asymmetric data key pair, use\n the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext operation. To get a cryptographically secure\n random byte string, use GenerateRandom.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

\n GenerateDataKey also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKey for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKey returns a\n copy of the data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the data key, the response includes a copy of the data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n How to use your data key\n

\n

We recommend that you use the following pattern to encrypt data locally in your\n application. You can write your own code or use a client-side encryption library, such as the\n Amazon Web Services Encryption SDK, the\n Amazon DynamoDB Encryption Client,\n or Amazon S3\n client-side encryption to do these tasks for you.

\n

To encrypt data outside of KMS:

\n
    \n
  1. \n

    Use the GenerateDataKey operation to get a data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key (in the Plaintext field of the response) to\n encrypt your data outside of KMS. Then erase the plaintext data key from memory.

    \n
  4. \n
  5. \n

    Store the encrypted data key (in the CiphertextBlob field of the\n response) with the encrypted data.

    \n
  6. \n
\n

To decrypt data outside of KMS:

\n
    \n
  1. \n

    Use the Decrypt operation to decrypt the encrypted data key. The\n operation returns a plaintext copy of the data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\n data key from memory.

    \n
  4. \n
\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKey (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\n key that you specify. The bytes in the plaintext key are random; they are not related to the\n caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS and\n store the encrypted data key with the encrypted data.

\n

To generate a data key, specify the symmetric encryption KMS key that will be used to\n encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate a 128-bit SM4 data key (China Regions only), specify a KeySpec\n value of AES_128 or a NumberOfBytes value of 16. The\n symmetric encryption key used in China Regions to encrypt your data key is an SM4 encryption\n key.

\n

To get only an encrypted copy of the data key, use GenerateDataKeyWithoutPlaintext. To generate an asymmetric data key pair, use\n the GenerateDataKeyPair or GenerateDataKeyPairWithoutPlaintext operation. To get a cryptographically secure\n random byte string, use GenerateRandom.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

\n GenerateDataKey also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKey for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKey returns a\n copy of the data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the data key, the response includes a copy of the data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n How to use your data key\n

\n

We recommend that you use the following pattern to encrypt data locally in your\n application. You can write your own code or use a client-side encryption library, such as the\n Amazon Web Services Encryption SDK, the\n Amazon DynamoDB Encryption Client,\n or Amazon S3\n client-side encryption to do these tasks for you.

\n

To encrypt data outside of KMS:

\n
    \n
  1. \n

    Use the GenerateDataKey operation to get a data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key (in the Plaintext field of the response) to\n encrypt your data outside of KMS. Then erase the plaintext data key from memory.

    \n
  4. \n
  5. \n

    Store the encrypted data key (in the CiphertextBlob field of the\n response) with the encrypted data.

    \n
  6. \n
\n

To decrypt data outside of KMS:

\n
    \n
  1. \n

    Use the Decrypt operation to decrypt the encrypted data key. The\n operation returns a plaintext copy of the data key.

    \n
  2. \n
  3. \n

    Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\n data key from memory.

    \n
  4. \n
\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKey (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate a data key", + "documentation": "The following example generates a 256-bit symmetric data encryption key (data key) in two formats. One is the unencrypted (plainext) data key, and the other is the data key encrypted with the specified KMS key.", + "input": { + "KeyId": "alias/ExampleAlias", + "KeySpec": "AES_256" + }, + "output": { + "CiphertextBlob": "", + "Plaintext": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPair": { @@ -2245,6 +2485,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2268,7 +2511,24 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key, a plaintext private key, and a copy of the private key that is\n encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\n perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\n in the keys are random; they not related to the caller or to the KMS key that is used to\n encrypt the private key.

\n

You can use the public key that GenerateDataKeyPair returns to encrypt data\n or verify a signature outside of KMS. Then, store the encrypted private key with the data.\n When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that you use\n ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or signing, but not both.\n However, KMS cannot enforce any restrictions on the use of data key pairs outside of KMS.

\n

If you are using the data key pair to encrypt data, or for any operation where you don't\n immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext operation.\n GenerateDataKeyPairWithoutPlaintext returns a plaintext public key and an\n encrypted private key, but omits the plaintext private key that you need only to decrypt\n ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\n the Decrypt operation to decrypt the encrypted private key in the data key\n pair.

\n

\n GenerateDataKeyPair returns a unique data key pair for each request. The\n bytes in the keys are random; they are not related to the caller or the KMS key that is used\n to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\n specified in RFC 5280. The private\n key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in RFC 5958.

\n

\n GenerateDataKeyPair also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKeyPair for an Amazon Web Services Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. GenerateDataKeyPair returns the public data key and a\n copy of the private data key encrypted under the specified KMS key, as usual. But instead of a\n plaintext copy of the private data key (PrivateKeyPlaintext), the response includes a copy of the private data key encrypted under\n the public key from the attestation document (CiphertextForRecipient).\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPair (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key, a plaintext private key, and a copy of the private key that is\n encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\n perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\n in the keys are random; they not related to the caller or to the KMS key that is used to\n encrypt the private key.

\n

You can use the public key that GenerateDataKeyPair returns to encrypt data\n or verify a signature outside of KMS. Then, store the encrypted private key with the data.\n When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

If you are using the data key pair to encrypt data, or for any operation where you don't\n immediately need a private key, consider using the GenerateDataKeyPairWithoutPlaintext operation.\n GenerateDataKeyPairWithoutPlaintext returns a plaintext public key and an\n encrypted private key, but omits the plaintext private key that you need only to decrypt\n ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\n the Decrypt operation to decrypt the encrypted private key in the data key\n pair.

\n

\n GenerateDataKeyPair returns a unique data key pair for each request. The\n bytes in the keys are random; they are not related to the caller or the KMS key that is used\n to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\n specified in RFC 5280. The private\n key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in RFC 5958.

\n

\n GenerateDataKeyPair also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateDataKeyPair for an Amazon Web Services\n Nitro enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient\n parameter to provide the attestation document for the enclave.\n GenerateDataKeyPair returns the public data key and a copy of the private data\n key encrypted under the specified KMS key, as usual. But instead of a plaintext copy of the\n private data key (PrivateKeyPlaintext), the response includes a copy of the\n private data key encrypted under the public key from the attestation document\n (CiphertextForRecipient). For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide..

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPair (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an RSA key pair for encryption and decryption", + "documentation": "This example generates an RSA data key pair for encryption and decryption. The operation returns a plaintext public key and private key, and a copy of the private key that is encrypted under a symmetric encryption KMS key that you specify.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "RSA_3072" + }, + "output": { + "PrivateKeyCiphertextBlob": "", + "PrivateKeyPlaintext": "", + "PublicKey": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "RSA_3072" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPairRequest": { @@ -2303,7 +2563,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning a plaintext copy of the private data key, KMS encrypts\n the plaintext private data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the private data key encrypted\n under the KMS key specified by the KeyId parameter. The PrivateKeyPlaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning a plaintext copy of the private data\n key, KMS encrypts the plaintext private data key under the public key in the attestation\n document, and returns the resulting ciphertext in the CiphertextForRecipient\n field in the response. This ciphertext can be decrypted only with the private key in the\n enclave. The CiphertextBlob field in the response contains a copy of the private\n data key encrypted under the KMS key specified by the KeyId parameter. The\n PrivateKeyPlaintext field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2323,7 +2589,7 @@ "PrivateKeyPlaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The plaintext copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n PrivateKeyPlaintext field is null or empty.

" + "smithy.api#documentation": "

The plaintext copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n PrivateKeyPlaintext field is null or empty.

" } }, "PublicKey": { @@ -2347,7 +2613,7 @@ "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext private data key encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext private data key encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2370,6 +2636,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2393,7 +2662,23 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key and a copy of the private key that is encrypted under the symmetric\n encryption KMS key you specify. Unlike GenerateDataKeyPair, this operation\n does not return a plaintext private key. The bytes in the keys are random; they are not\n related to the caller or to the KMS key that is used to encrypt the private key.

\n

You can use the public key that GenerateDataKeyPairWithoutPlaintext returns\n to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\n with the data. When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that you \n use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or signing, but not\n both. However, KMS cannot enforce any restrictions on the use of data key pairs outside of KMS.

\n

\n GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each\n request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\n the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\n RFC 5280.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPairWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\n a plaintext public key and a copy of the private key that is encrypted under the symmetric\n encryption KMS key you specify. Unlike GenerateDataKeyPair, this operation\n does not return a plaintext private key. The bytes in the keys are random; they are not\n related to the caller or to the KMS key that is used to encrypt the private key.

\n

You can use the public key that GenerateDataKeyPairWithoutPlaintext returns\n to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\n with the data. When you are ready to decrypt data or sign a message, you can use the Decrypt operation to decrypt the encrypted private key.

\n

To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\n the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\n custom key store. To get the type and origin of your KMS key, use the DescribeKey operation.

\n

Use the KeyPairSpec parameter to choose an RSA or Elliptic Curve (ECC) data\n key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\n you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\n signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\n pairs outside of KMS.

\n

\n GenerateDataKeyPairWithoutPlaintext returns a unique data key pair for each\n request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\n the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\n RFC 5280.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyPairWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an asymmetric data key pair without a plaintext key", + "documentation": "This example returns an asymmetric elliptic curve (ECC) data key pair. The private key is encrypted under the symmetric encryption KMS key that you specify. This operation doesn't return a plaintext (unencrypted) private key.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "ECC_NIST_P521" + }, + "output": { + "PrivateKeyCiphertextBlob": "", + "PublicKey": "", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "KeyPairSpec": "ECC_NIST_P521" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintextRequest": { @@ -2424,6 +2709,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2499,7 +2790,13 @@ "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data key, KMS encrypts\n the plaintext data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the data key encrypted\n under the KMS key specified by the KeyId parameter. The Plaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning the plaintext data key, KMS encrypts\n the plaintext data key under the public key in the attestation document, and returns the\n resulting ciphertext in the CiphertextForRecipient field in the response. This\n ciphertext can be decrypted only with the private key in the enclave. The\n CiphertextBlob field in the response contains a copy of the data key encrypted\n under the KMS key specified by the KeyId parameter. The Plaintext\n field in the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" } } }, @@ -2519,7 +2816,7 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The plaintext data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded. Use this data key to encrypt your data outside of\n KMS. Then, remove it from memory as soon as possible.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

The plaintext data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded. Use this data key to encrypt your data outside of\n KMS. Then, remove it from memory as soon as possible.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "KeyId": { @@ -2531,7 +2828,7 @@ "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext data key encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext data key encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2554,6 +2851,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2574,7 +2874,21 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\n the key are random; they are not related to the caller or to the KMS key.

\n

\n GenerateDataKeyWithoutPlaintext is identical to the GenerateDataKey operation except that it does not return a plaintext copy of the\n data key.

\n

This operation is useful for systems that need to encrypt data at some point, but not\n immediately. When you need to encrypt the data, you call the Decrypt\n operation on the encrypted copy of the key.

\n

It's also useful in distributed systems with different levels of trust. For example, you\n might store encrypted data in containers. One component of your system creates new containers\n and stores an encrypted data key with each container. Then, a different component puts the\n data into the containers. That component first decrypts the data key, uses the plaintext data\n key to encrypt data, puts the encrypted data into the container, and then destroys the\n plaintext data key. In this system, the component that creates the containers never sees the\n plaintext data key.

\n

To request an asymmetric data key pair, use the GenerateDataKeyPair or\n GenerateDataKeyPairWithoutPlaintext operations.

\n

To generate a data key, you must specify the symmetric encryption KMS key that is used to\n encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to generate a data key. To get the\n type of your KMS key, use the DescribeKey operation.

\n

You must also specify the length of the data key. Use either the KeySpec or \n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use \n the KeySpec parameter.

\n

To generate an SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or NumberOfBytes value of 16. The symmetric\n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

If the operation succeeds, you will find the encrypted copy of the data key in the\n CiphertextBlob field.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns a unique symmetric data key for use outside of KMS. This operation returns a\n data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\n the key are random; they are not related to the caller or to the KMS key.

\n

\n GenerateDataKeyWithoutPlaintext is identical to the GenerateDataKey operation except that it does not return a plaintext copy of the\n data key.

\n

This operation is useful for systems that need to encrypt data at some point, but not\n immediately. When you need to encrypt the data, you call the Decrypt\n operation on the encrypted copy of the key.

\n

It's also useful in distributed systems with different levels of trust. For example, you\n might store encrypted data in containers. One component of your system creates new containers\n and stores an encrypted data key with each container. Then, a different component puts the\n data into the containers. That component first decrypts the data key, uses the plaintext data\n key to encrypt data, puts the encrypted data into the container, and then destroys the\n plaintext data key. In this system, the component that creates the containers never sees the\n plaintext data key.

\n

To request an asymmetric data key pair, use the GenerateDataKeyPair or\n GenerateDataKeyPairWithoutPlaintext operations.

\n

To generate a data key, you must specify the symmetric encryption KMS key that is used to\n encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to\n generate a data key. To get the type of your KMS key, use the DescribeKey\n operation.

\n

You must also specify the length of the data key. Use either the KeySpec or\n NumberOfBytes parameters (but not both). For 128-bit and 256-bit data keys, use\n the KeySpec parameter.

\n

To generate an SM4 data key (China Regions only), specify a KeySpec value of\n AES_128 or NumberOfBytes value of 16. The symmetric\n encryption key used in China Regions to encrypt your data key is an SM4 encryption key.

\n

If the operation succeeds, you will find the encrypted copy of the data key in the\n CiphertextBlob field.

\n

You can use an optional encryption context to add additional security to the encryption\n operation. If you specify an EncryptionContext, you must specify the same\n encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\n Otherwise, the request to decrypt fails with an InvalidCiphertextException. For more information, see Encryption Context in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateDataKeyWithoutPlaintext (key\n policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To generate an encrypted data key", + "documentation": "The following example generates an encrypted copy of a 256-bit symmetric data encryption key (data key). The data key is encrypted with the specified KMS key.", + "input": { + "KeyId": "alias/ExampleAlias", + "KeySpec": "AES_256" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateDataKeyWithoutPlaintextRequest": { @@ -2610,6 +2924,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2648,6 +2968,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -2668,7 +2991,23 @@ } ], "traits": { - "smithy.api#documentation": "

Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS key and a MAC algorithm that the key supports.\n HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards defined in RFC 2104.

\n

You can use value that GenerateMac returns in the VerifyMac operation to\n demonstrate that the original message has not changed. Also, because a secret key is used to\n create the hash, you can verify that the party that generated the hash has the required secret\n key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\n functions. This operation is part of KMS support for HMAC KMS keys. For\n details, see HMAC keys in\n KMS in the \n Key Management Service Developer Guide\n .

\n \n

Best practices recommend that you limit the time during which any signing mechanism,\n including an HMAC, is effective. This deters an attack where the actor uses a signed message\n to establish validity repeatedly or long after the message is superseded. HMAC tags do not\n include a timestamp, but you can include a timestamp in the token or message to help you\n detect when its time to refresh the HMAC.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateMac (key policy)

\n

\n Related operations: VerifyMac\n

" + "smithy.api#documentation": "

Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS\n key and a MAC algorithm that the key supports. HMAC KMS keys and the HMAC algorithms that\n KMS uses conform to industry standards defined in RFC 2104.

\n

You can use value that GenerateMac returns in the VerifyMac operation to\n demonstrate that the original message has not changed. Also, because a secret key is used to\n create the hash, you can verify that the party that generated the hash has the required secret\n key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\n functions. This operation is part of KMS support for HMAC KMS keys. For\n details, see HMAC keys in\n KMS in the \n Key Management Service Developer Guide\n .

\n \n

Best practices recommend that you limit the time during which any signing mechanism,\n including an HMAC, is effective. This deters an attack where the actor uses a signed message\n to establish validity repeatedly or long after the message is superseded. HMAC tags do not\n include a timestamp, but you can include a timestamp in the token or message to help you\n detect when its time to refresh the HMAC.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GenerateMac (key policy)

\n

\n Related operations: VerifyMac\n

", + "smithy.api#examples": [ + { + "title": "To generate an HMAC for a message", + "documentation": "This example generates an HMAC for a message, an HMAC KMS key, and a MAC algorithm. The algorithm must be supported by the specified HMAC KMS key.", + "input": { + "Message": "Hello World", + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "MacAlgorithm": "HMAC_SHA_384" + }, + "output": { + "Mac": "", + "MacAlgorithm": "HMAC_SHA_384", + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#GenerateMacRequest": { @@ -2700,6 +3039,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -2712,7 +3057,7 @@ "Mac": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The hash-based message authentication code (HMAC) that was generated for the\n specified message, HMAC KMS key, and MAC algorithm.

\n

This is the standard, raw HMAC defined in RFC 2104.

" + "smithy.api#documentation": "

The hash-based message authentication code (HMAC) that was generated for the specified\n message, HMAC KMS key, and MAC algorithm.

\n

This is the standard, raw HMAC defined in RFC 2104.

" } }, "MacAlgorithm": { @@ -2758,7 +3103,19 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a random byte string that is cryptographically secure.

\n

You must use the NumberOfBytes parameter to specify the length of the random\n byte string. There is no default value for string length.

\n

By default, the random byte string is generated in KMS. To generate the byte string in\n the CloudHSM cluster associated with an CloudHSM key store, use the CustomKeyStoreId\n parameter.

\n

\n GenerateRandom also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateRandom for a Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. Instead of plaintext bytes, the response\n includes the plaintext bytes encrypted under the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

\n

For more information about entropy and random number generation, see\n Key Management Service Cryptographic Details.

\n

\n Cross-account use: Not applicable.\n GenerateRandom does not use any account-specific resources, such as KMS\n keys.

\n

\n Required permissions: kms:GenerateRandom (IAM policy)

" + "smithy.api#documentation": "

Returns a random byte string that is cryptographically secure.

\n

You must use the NumberOfBytes parameter to specify the length of the random\n byte string. There is no default value for string length.

\n

By default, the random byte string is generated in KMS. To generate the byte string in\n the CloudHSM cluster associated with an CloudHSM key store, use the CustomKeyStoreId\n parameter.

\n

\n GenerateRandom also supports Amazon Web Services Nitro Enclaves, which provide an\n isolated compute environment in Amazon EC2. To call GenerateRandom for a Nitro\n enclave, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK. Use the Recipient parameter\n to provide the attestation document for the enclave. Instead of plaintext bytes, the response\n includes the plaintext bytes encrypted under the public key from the attestation document\n (CiphertextForRecipient).For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

\n

For more information about entropy and random number generation, see\n Key Management Service Cryptographic Details.

\n

\n Cross-account use: Not applicable.\n GenerateRandom does not use any account-specific resources, such as KMS\n keys.

\n

\n Required permissions: kms:GenerateRandom (IAM policy)

", + "smithy.api#examples": [ + { + "title": "To generate random data", + "documentation": "The following example generates 32 bytes of random data.", + "input": { + "NumberOfBytes": 32 + }, + "output": { + "Plaintext": "" + } + } + ] } }, "com.amazonaws.kms#GenerateRandomRequest": { @@ -2773,13 +3130,13 @@ "CustomKeyStoreId": { "target": "com.amazonaws.kms#CustomKeyStoreIdType", "traits": { - "smithy.api#documentation": "

Generates the random byte string in the CloudHSM cluster that is associated with the\n specified CloudHSM key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.

\n

External key store IDs are not valid for this parameter. If you specify the ID of an\n external key store, GenerateRandom throws an\n UnsupportedOperationException.

" + "smithy.api#documentation": "

Generates the random byte string in the CloudHSM cluster that is associated with the\n specified CloudHSM key store. To find the ID of a custom key store, use the DescribeCustomKeyStores operation.

\n

External key store IDs are not valid for this parameter. If you specify the ID of an\n external key store, GenerateRandom throws an\n UnsupportedOperationException.

" } }, "Recipient": { "target": "com.amazonaws.kms#RecipientInfo", "traits": { - "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key.\n The only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning plaintext bytes, KMS encrypts the\n plaintext bytes under the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

A signed attestation document from\n an Amazon Web Services Nitro enclave and the encryption algorithm to use with the enclave's public key. The\n only valid encryption algorithm is RSAES_OAEP_SHA_256.

\n

This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves. To include this\n parameter, use the Amazon Web Services Nitro Enclaves SDK or any Amazon Web Services SDK.

\n

When you use this parameter, instead of returning plaintext bytes, KMS encrypts the\n plaintext bytes under the public key in the attestation document, and returns the resulting\n ciphertext in the CiphertextForRecipient field in the response. This ciphertext\n can be decrypted only with the private key in the enclave. The Plaintext field in\n the response is null or empty.

\n

For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2793,13 +3150,13 @@ "Plaintext": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

The random byte string. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" + "smithy.api#documentation": "

The random byte string. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.

\n

If the response includes the CiphertextForRecipient field, the\n Plaintext field is null or empty.

" } }, "CiphertextForRecipient": { "target": "com.amazonaws.kms#CiphertextType", "traits": { - "smithy.api#documentation": "

The plaintext random bytes encrypted with the public key from the Nitro enclave. This ciphertext can\n be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

The plaintext random bytes encrypted with the public key from the Nitro enclave. This\n ciphertext can be decrypted only by using a private key in the Nitro enclave.

\n

This field is included in the response only when the Recipient parameter in\n the request includes a valid attestation document from an Amazon Web Services Nitro enclave.\n For information about the interaction between KMS and Amazon Web Services Nitro Enclaves, see How Amazon Web Services Nitro Enclaves uses KMS in the Key Management Service Developer Guide.

" } } }, @@ -2833,7 +3190,20 @@ } ], "traits": { - "smithy.api#documentation": "

Gets a key policy attached to the specified KMS key.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetKeyPolicy (key policy)

\n

\n Related operations: PutKeyPolicy\n

" + "smithy.api#documentation": "

Gets a key policy attached to the specified KMS key.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetKeyPolicy (key policy)

\n

\n Related operations: PutKeyPolicy\n

", + "smithy.api#examples": [ + { + "title": "To retrieve a key policy", + "documentation": "The following example retrieves the key policy for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "PolicyName": "default" + }, + "output": { + "Policy": "{\n \"Version\" : \"2012-10-17\",\n \"Id\" : \"key-default-1\",\n \"Statement\" : [ {\n \"Sid\" : \"Enable IAM User Permissions\",\n \"Effect\" : \"Allow\",\n \"Principal\" : {\n \"AWS\" : \"arn:aws:iam::111122223333:root\"\n },\n \"Action\" : \"kms:*\",\n \"Resource\" : \"*\"\n } ]\n}" + } + } + ] } }, "com.amazonaws.kms#GetKeyPolicyRequest": { @@ -2901,7 +3271,19 @@ } ], "traits": { - "smithy.api#documentation": "

Gets a Boolean value that indicates whether automatic rotation of the key material is\n enabled for the specified KMS key.

\n

When you enable automatic rotation for customer managed KMS keys, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key..

\n

You can enable (EnableKeyRotation) and disable automatic rotation (DisableKeyRotation) of the key material in customer managed KMS keys. Key\n material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material in Amazon Web Services managed KMS keys every year. The\n key rotation status for Amazon Web Services managed KMS keys is always true.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n
    \n
  • \n

    Disabled: The key rotation status does not change when you disable a KMS key. However,\n while the KMS key is disabled, KMS does not rotate the key material. When you re-enable\n the KMS key, rotation resumes. If the key material in the re-enabled KMS key hasn't been\n rotated in one year, KMS rotates it immediately, and every year thereafter. If it's been\n less than a year since the key material in the re-enabled KMS key was rotated, the KMS key\n resumes its prior rotation schedule.

    \n
  • \n
  • \n

    Pending deletion: While a KMS key is pending deletion, its key rotation status is\n false and KMS does not rotate the key material. If you cancel the\n deletion, the original key rotation status returns to true.

    \n
  • \n
\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetKeyRotationStatus (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Gets a Boolean value that indicates whether automatic rotation of the key material is\n enabled for the specified KMS key.

\n

When you enable automatic rotation for customer managed KMS keys, KMS\n rotates the key material of the KMS key one year (approximately 365 days) from the enable date\n and every year thereafter. You can monitor rotation of the key material for your KMS keys in\n CloudTrail and Amazon CloudWatch.

\n

Automatic key rotation is supported only on symmetric encryption KMS keys.\n You cannot enable automatic rotation of asymmetric KMS keys, HMAC KMS keys, KMS keys with imported key material, or KMS keys in a custom key store. To enable or disable automatic rotation of a set of related multi-Region keys, set the property on the primary key..

\n

You can enable (EnableKeyRotation) and disable automatic rotation (DisableKeyRotation) of the key material in customer managed KMS keys. Key\n material rotation of Amazon Web Services managed KMS keys is not\n configurable. KMS always rotates the key material in Amazon Web Services managed KMS keys every year. The\n key rotation status for Amazon Web Services managed KMS keys is always true.

\n \n

In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\n years to every year. For details, see EnableKeyRotation.

\n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n
    \n
  • \n

    Disabled: The key rotation status does not change when you disable a KMS key. However,\n while the KMS key is disabled, KMS does not rotate the key material. When you re-enable\n the KMS key, rotation resumes. If the key material in the re-enabled KMS key hasn't been\n rotated in one year, KMS rotates it immediately, and every year thereafter. If it's been\n less than a year since the key material in the re-enabled KMS key was rotated, the KMS key\n resumes its prior rotation schedule.

    \n
  • \n
  • \n

    Pending deletion: While a KMS key is pending deletion, its key rotation status is\n false and KMS does not rotate the key material. If you cancel the\n deletion, the original key rotation status returns to true.

    \n
  • \n
\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetKeyRotationStatus (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To retrieve the rotation status for a KMS key", + "documentation": "The following example retrieves the status of automatic annual rotation of the key material for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "KeyRotationEnabled": true + } + } + ] } }, "com.amazonaws.kms#GetKeyRotationStatusRequest": { @@ -2963,7 +3345,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the public key and an import token you need to import or reimport key material for\n a KMS key.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

Before calling GetParametersForImport, use the CreateKey\n operation with an Origin value of EXTERNAL to create a KMS key with\n no key material. You can import key material for a symmetric encryption KMS key, HMAC KMS key,\n asymmetric encryption KMS key, or asymmetric signing KMS key. You can also import key material\n into a multi-Region key of\n any supported type. However, you can't import key material into a KMS key in a custom key store. You can also use\n GetParametersForImport to get a public key and import token to reimport the original key material into a KMS key whose key material expired or was\n deleted.

\n

\n GetParametersForImport returns the items that you need to import your key\n material.

\n
    \n
  • \n

    The public key (or \"wrapping key\") of an RSA key pair that KMS generates.

    \n

    You will use this public key to encrypt (\"wrap\") your key material while it's in\n transit to KMS.

    \n
  • \n
  • \n

    A import token that ensures that KMS can decrypt your key material and associate it with the correct KMS key.

    \n
  • \n
\n

The public key and its import token are permanently linked and must be used together. Each\n public key and import token set is valid for 24 hours. The expiration date and time appear in\n the ParametersValidTo field in the GetParametersForImport response.\n You cannot use an expired public key or import token in an ImportKeyMaterial\n request. If your key and token expire, send another GetParametersForImport\n request.

\n

\n GetParametersForImport requires the following information:

\n
    \n
  • \n

    The key ID of the KMS key for which you are importing the key material.

    \n
  • \n
  • \n

    The key spec of the public key (\"wrapping key\") that you will use to encrypt your key\n material during import.

    \n
  • \n
  • \n

    The wrapping algorithm that you will use with the public key to encrypt your key\n material.

    \n
  • \n
\n

You can use the same or a different public key spec and wrapping algorithm each time you\n import or reimport the same key material.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetParametersForImport (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Returns the public key and an import token you need to import or reimport key material for\n a KMS key.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

Before calling GetParametersForImport, use the CreateKey\n operation with an Origin value of EXTERNAL to create a KMS key with\n no key material. You can import key material for a symmetric encryption KMS key, HMAC KMS key,\n asymmetric encryption KMS key, or asymmetric signing KMS key. You can also import key material\n into a multi-Region key of\n any supported type. However, you can't import key material into a KMS key in a custom key store. You can also use\n GetParametersForImport to get a public key and import token to reimport the original key\n material into a KMS key whose key material expired or was deleted.

\n

\n GetParametersForImport returns the items that you need to import your key\n material.

\n
    \n
  • \n

    The public key (or \"wrapping key\") of an RSA key pair that KMS generates.

    \n

    You will use this public key to encrypt (\"wrap\") your key material while it's in\n transit to KMS.

    \n
  • \n
  • \n

    A import token that ensures that KMS can decrypt your key material and associate it\n with the correct KMS key.

    \n
  • \n
\n

The public key and its import token are permanently linked and must be used together. Each\n public key and import token set is valid for 24 hours. The expiration date and time appear in\n the ParametersValidTo field in the GetParametersForImport response.\n You cannot use an expired public key or import token in an ImportKeyMaterial\n request. If your key and token expire, send another GetParametersForImport\n request.

\n

\n GetParametersForImport requires the following information:

\n
    \n
  • \n

    The key ID of the KMS key for which you are importing the key material.

    \n
  • \n
  • \n

    The key spec of the public key (\"wrapping key\") that you will use to encrypt your key\n material during import.

    \n
  • \n
  • \n

    The wrapping algorithm that you will use with the public key to encrypt your key\n material.

    \n
  • \n
\n

You can use the same or a different public key spec and wrapping algorithm each time you\n import or reimport the same key material.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:GetParametersForImport (key policy)

\n

\n Related operations:\n

\n " } }, "com.amazonaws.kms#GetParametersForImportRequest": { @@ -2979,7 +3361,7 @@ "WrappingAlgorithm": { "target": "com.amazonaws.kms#AlgorithmSpec", "traits": { - "smithy.api#documentation": "

The algorithm you will use with the RSA public key (PublicKey) in the\n response to protect your key material during import. For more information, see Select a wrapping algorithm in the Key Management Service Developer Guide.

\n

For RSA_AES wrapping algorithms, you encrypt your key material with an AES key that you\n generate, then encrypt your AES key with the RSA public key from KMS. For RSAES wrapping\n algorithms, you encrypt your key material directly with the RSA public key from KMS.

\n

The wrapping algorithms that you can use depend on the type of key material that you are\n importing. To import an RSA private key, you must use an RSA_AES wrapping algorithm.

\n
    \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_256 — Supported for wrapping RSA and ECC key\n material.

    \n
  • \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_1 — Supported for wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_256 — Supported for all types of key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_256 wrapping algorithm with the RSA_2048 wrapping key spec to wrap \n ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_1 — Supported for all types of key material, except RSA key material (private\n key).

    \n

    You cannot use the RSAES_OAEP_SHA_1 wrapping algorithm with the RSA_2048 wrapping key spec to wrap \n ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_PKCS1_V1_5 (Deprecated) — Supported only for symmetric encryption key\n material (and only in legacy mode).

    \n
  • \n
", + "smithy.api#documentation": "

The algorithm you will use with the RSA public key (PublicKey) in the\n response to protect your key material during import. For more information, see Select a wrapping algorithm in the Key Management Service Developer Guide.

\n

For RSA_AES wrapping algorithms, you encrypt your key material with an AES key that you\n generate, then encrypt your AES key with the RSA public key from KMS. For RSAES wrapping\n algorithms, you encrypt your key material directly with the RSA public key from KMS.

\n

The wrapping algorithms that you can use depend on the type of key material that you are\n importing. To import an RSA private key, you must use an RSA_AES wrapping algorithm.

\n
    \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_256 — Supported for\n wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSA_AES_KEY_WRAP_SHA_1 — Supported for\n wrapping RSA and ECC key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_256 — Supported for all types\n of key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_256 wrapping algorithm with the RSA_2048 wrapping\n key spec to wrap ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_OAEP_SHA_1 — Supported for all types of\n key material, except RSA key material (private key).

    \n

    You cannot use the RSAES_OAEP_SHA_1 wrapping algorithm with the RSA_2048 wrapping key\n spec to wrap ECC_NIST_P521 key material.

    \n
  • \n
  • \n

    \n RSAES_PKCS1_V1_5 (Deprecated) — Supported only\n for symmetric encryption key material (and only in legacy mode).

    \n
  • \n
", "smithy.api#required": {} } }, @@ -3068,7 +3450,26 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\n KMS key, which never leaves KMS unencrypted, callers with kms:GetPublicKey\n permission can download the public key of an asymmetric KMS key. You can share the public key\n to allow others to encrypt messages and verify signatures outside of KMS.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

You do not need to download the public key. Instead, you can use the public key within\n KMS by calling the Encrypt, ReEncrypt, or Verify operations with the identifier of an asymmetric KMS key. When you use the\n public key within KMS, you benefit from the authentication, authorization, and logging that\n are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\n decrypted. These features are not effective outside of KMS.

\n

To help you use the public key safely outside of KMS, GetPublicKey returns\n important information about the public key in the response, including:

\n
    \n
  • \n

    \n KeySpec: The type of key material in the public key, such as\n RSA_4096 or ECC_NIST_P521.

    \n
  • \n
  • \n

    \n KeyUsage: Whether the key is used for encryption or signing.

    \n
  • \n
  • \n

    \n EncryptionAlgorithms or SigningAlgorithms: A list of the encryption algorithms or the signing\n algorithms for the key.

    \n
  • \n
\n

Although KMS cannot enforce these restrictions on external operations, it is crucial\n that you use this information to prevent the public key from being used improperly. For\n example, you can prevent a public signing key from being used encrypt data, or prevent a\n public key from being used with an encryption algorithm that is not supported by KMS. You\n can also avoid errors, such as using the wrong signing algorithm in a verification\n operation.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you must \n specify the distinguishing ID. By default, KMS uses 1234567812345678 as the \n distinguishing ID. For more information, see Offline verification\n with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use:\n Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetPublicKey (key policy)

\n

\n Related operations: CreateKey\n

" + "smithy.api#documentation": "

Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\n KMS key, which never leaves KMS unencrypted, callers with kms:GetPublicKey\n permission can download the public key of an asymmetric KMS key. You can share the public key\n to allow others to encrypt messages and verify signatures outside of KMS.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

You do not need to download the public key. Instead, you can use the public key within\n KMS by calling the Encrypt, ReEncrypt, or Verify operations with the identifier of an asymmetric KMS key. When you use the\n public key within KMS, you benefit from the authentication, authorization, and logging that\n are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\n decrypted. These features are not effective outside of KMS.

\n

To help you use the public key safely outside of KMS, GetPublicKey returns\n important information about the public key in the response, including:

\n
    \n
  • \n

    \n KeySpec: The type of key material in the public key, such as\n RSA_4096 or ECC_NIST_P521.

    \n
  • \n
  • \n

    \n KeyUsage: Whether the key is used for encryption or signing.

    \n
  • \n
  • \n

    \n EncryptionAlgorithms or SigningAlgorithms: A list of the encryption algorithms or the signing\n algorithms for the key.

    \n
  • \n
\n

Although KMS cannot enforce these restrictions on external operations, it is crucial\n that you use this information to prevent the public key from being used improperly. For\n example, you can prevent a public signing key from being used encrypt data, or prevent a\n public key from being used with an encryption algorithm that is not supported by KMS. You\n can also avoid errors, such as using the wrong signing algorithm in a verification\n operation.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:GetPublicKey (key policy)

\n

\n Related operations: CreateKey\n

", + "smithy.api#examples": [ + { + "title": "To download the public key of an asymmetric KMS key", + "documentation": "This example gets the public key of an asymmetric RSA KMS key used for encryption and decryption. The operation returns the key spec, key usage, and encryption or signing algorithms to help you use the public key correctly outside of AWS KMS.", + "input": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", + "PublicKey": "", + "CustomerMasterKeySpec": "RSA_4096", + "KeyUsage": "ENCRYPT_DECRYPT", + "EncryptionAlgorithms": [ + "RSAES_OAEP_SHA_1", + "RSAES_OAEP_SHA_256" + ] + } + } + ] } }, "com.amazonaws.kms#GetPublicKeyRequest": { @@ -3421,7 +3822,19 @@ } ], "traits": { - "smithy.api#documentation": "

Imports or reimports key material into an existing KMS key that was created without key\n material. ImportKeyMaterial also sets the expiration model and expiration date of\n the imported key material.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

After you successfully import key material into a KMS key, you can reimport\n the same key material into that KMS key, but you cannot import different key\n material. You might reimport key material to replace key material that expired or key material\n that you deleted. You might also reimport key material to change the expiration model or\n expiration date of the key material. Before reimporting key material, if necessary, call DeleteImportedKeyMaterial to delete the current imported key material.

\n

Each time you import key material into KMS, you can determine whether\n (ExpirationModel) and when (ValidTo) the key material expires. To\n change the expiration of your key material, you must import it again, either by calling\n ImportKeyMaterial or using the import features of the\n KMS console.

\n

Before calling ImportKeyMaterial:

\n
    \n
  • \n

    Create or identify a KMS key with no key material. The KMS key must have an\n Origin value of EXTERNAL, which indicates that the KMS key is\n designed for imported key material.

    \n

    To create an new KMS key for imported key material, call the CreateKey operation with an Origin value of EXTERNAL. You can create a\n symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, or asymmetric\n signing KMS key. You can also import key material into a multi-Region key of any\n supported type. However, you can't import key material into a KMS key in a custom key store.

    \n
  • \n
  • \n

    Use the DescribeKey operation to verify that the\n KeyState of the KMS key is PendingImport, which indicates that\n the KMS key has no key material.

    \n

    If you are reimporting the same key material into an existing KMS key, you might need\n to call the DeleteImportedKeyMaterial to delete its existing key\n material.

    \n
  • \n
  • \n

    Call the GetParametersForImport operation to get a public key and\n import token set for importing key material.

    \n
  • \n
  • \n

    Use the public key in the GetParametersForImport response to encrypt\n your key material.

    \n
  • \n
\n

Then, in an ImportKeyMaterial request, you submit your encrypted key\n material and import token. When calling this operation, you must specify the following\n values:

\n
    \n
  • \n

    The key ID or key ARN of the KMS key to associate with the imported key material. Its\n Origin must be EXTERNAL and its KeyState must be\n PendingImport. You cannot perform this operation on a KMS key in a custom key store, or on a KMS\n key in a different Amazon Web Services account. To get the Origin and KeyState\n of a KMS key, call DescribeKey.

    \n
  • \n
  • \n

    The encrypted key material.

    \n
  • \n
  • \n

    The import token that GetParametersForImport returned. You must use\n a public key and token from the same GetParametersForImport response.

    \n
  • \n
  • \n

    Whether the key material expires (ExpirationModel) and, if so, when\n (ValidTo). For help with this choice, see Setting an expiration time in the Key Management Service Developer Guide.

    \n

    If you set an expiration date, KMS deletes the key material from the KMS key on the\n specified date, making the KMS key unusable. To use the KMS key in cryptographic\n operations again, you must reimport the same key material. However, you can delete and\n reimport the key material at any time, including before the key material expires. Each\n time you reimport, you can eliminate or reset the expiration time.

    \n
  • \n
\n

When this operation is successful, the key state of the KMS key changes from\n PendingImport to Enabled, and you can use the KMS key in\n cryptographic operations.

\n

If this operation fails, use the exception to help determine the problem. If the error is\n related to the key material, the import token, or wrapping key, use GetParametersForImport to get a new public key and import token for the KMS key\n and repeat the import procedure. For help, see How To Import Key\n Material in the Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ImportKeyMaterial (key policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Imports or reimports key material into an existing KMS key that was created without key\n material. ImportKeyMaterial also sets the expiration model and expiration date of\n the imported key material.

\n

By default, KMS keys are created with key material that KMS generates. This operation\n supports Importing key\n material, an advanced feature that lets you generate and import the cryptographic\n key material for a KMS key. For more information about importing key material into KMS, see\n Importing key\n material in the Key Management Service Developer Guide.

\n

After you successfully import key material into a KMS key, you can reimport\n the same key material into that KMS key, but you cannot import different key\n material. You might reimport key material to replace key material that expired or key material\n that you deleted. You might also reimport key material to change the expiration model or\n expiration date of the key material. Before reimporting key material, if necessary, call DeleteImportedKeyMaterial to delete the current imported key material.

\n

Each time you import key material into KMS, you can determine whether\n (ExpirationModel) and when (ValidTo) the key material expires. To\n change the expiration of your key material, you must import it again, either by calling\n ImportKeyMaterial or using the import features of the KMS console.

\n

Before calling ImportKeyMaterial:

\n
    \n
  • \n

    Create or identify a KMS key with no key material. The KMS key must have an\n Origin value of EXTERNAL, which indicates that the KMS key is\n designed for imported key material.

    \n

    To create an new KMS key for imported key material, call the CreateKey operation with an Origin value of EXTERNAL. You can create a\n symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, or asymmetric\n signing KMS key. You can also import key material into a multi-Region key of any\n supported type. However, you can't import key material into a KMS key in a custom key store.

    \n
  • \n
  • \n

    Use the DescribeKey operation to verify that the\n KeyState of the KMS key is PendingImport, which indicates that\n the KMS key has no key material.

    \n

    If you are reimporting the same key material into an existing KMS key, you might need\n to call the DeleteImportedKeyMaterial to delete its existing key\n material.

    \n
  • \n
  • \n

    Call the GetParametersForImport operation to get a public key and\n import token set for importing key material.

    \n
  • \n
  • \n

    Use the public key in the GetParametersForImport response to encrypt\n your key material.

    \n
  • \n
\n

Then, in an ImportKeyMaterial request, you submit your encrypted key\n material and import token. When calling this operation, you must specify the following\n values:

\n
    \n
  • \n

    The key ID or key ARN of the KMS key to associate with the imported key material. Its\n Origin must be EXTERNAL and its KeyState must be\n PendingImport. You cannot perform this operation on a KMS key in a custom key store, or on a KMS\n key in a different Amazon Web Services account. To get the Origin and KeyState\n of a KMS key, call DescribeKey.

    \n
  • \n
  • \n

    The encrypted key material.

    \n
  • \n
  • \n

    The import token that GetParametersForImport returned. You must use\n a public key and token from the same GetParametersForImport response.

    \n
  • \n
  • \n

    Whether the key material expires (ExpirationModel) and, if so, when\n (ValidTo). For help with this choice, see Setting an expiration time in the Key Management Service Developer Guide.

    \n

    If you set an expiration date, KMS deletes the key material from the KMS key on the\n specified date, making the KMS key unusable. To use the KMS key in cryptographic\n operations again, you must reimport the same key material. However, you can delete and\n reimport the key material at any time, including before the key material expires. Each\n time you reimport, you can eliminate or reset the expiration time.

    \n
  • \n
\n

When this operation is successful, the key state of the KMS key changes from\n PendingImport to Enabled, and you can use the KMS key in\n cryptographic operations.

\n

If this operation fails, use the exception to help determine the problem. If the error is\n related to the key material, the import token, or wrapping key, use GetParametersForImport to get a new public key and import token for the KMS key\n and repeat the import procedure. For help, see How To Import Key\n Material in the Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ImportKeyMaterial (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To import key material into a KMS key", + "documentation": "The following example imports key material into the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "ImportToken": "", + "EncryptedKeyMaterial": "", + "ExpirationModel": "KEY_MATERIAL_DOES_NOT_EXPIRE" + } + } + ] } }, "com.amazonaws.kms#ImportKeyMaterialRequest": { @@ -3722,7 +4135,7 @@ "code": "KMSInvalidStateException", "httpResponseCode": 409 }, - "smithy.api#documentation": "

The request was rejected because the state of the specified resource is not valid for this\n request.

\n

This exceptions means one of the following:

\n
    \n
  • \n

    The key state of the KMS key is not compatible with the operation.

    \n

    To find the key state, use the DescribeKey operation. For more\n information about which key states are compatible with each KMS operation, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    For cryptographic operations on KMS keys in custom key stores, this exception represents a general failure with many possible causes. To identify the cause, see the error message that accompanies the exception.

    \n
  • \n
", + "smithy.api#documentation": "

The request was rejected because the state of the specified resource is not valid for this\n request.

\n

This exceptions means one of the following:

\n
    \n
  • \n

    The key state of the KMS key is not compatible with the operation.

    \n

    To find the key state, use the DescribeKey operation. For more\n information about which key states are compatible with each KMS operation, see\n Key states of KMS keys in the \n Key Management Service Developer Guide\n .

    \n
  • \n
  • \n

    For cryptographic operations on KMS keys in custom key stores, this exception\n represents a general failure with many possible causes. To identify the cause, see the\n error message that accompanies the exception.

    \n
  • \n
", "smithy.api#error": "client", "smithy.api#httpError": 409 } @@ -3939,7 +4352,7 @@ "XksKeyConfiguration": { "target": "com.amazonaws.kms#XksKeyConfigurationType", "traits": { - "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an\n external key store.

\n

For more information, see \n External key in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an external key\n store.

\n

For more information, see External key in the\n Key Management Service Developer Guide.

" } } }, @@ -4186,6 +4599,57 @@ ], "traits": { "smithy.api#documentation": "

Gets a list of aliases in the caller's Amazon Web Services account and region. For more information\n about aliases, see CreateAlias.

\n

By default, the ListAliases operation returns all aliases in the account and\n region. To get only the aliases associated with a particular KMS key, use the\n KeyId parameter.

\n

The ListAliases response can include aliases that you created and associated\n with your customer managed keys, and aliases that Amazon Web Services created and associated with Amazon Web Services\n managed keys in your account. You can recognize Amazon Web Services aliases because their names have the\n format aws/, such as aws/dynamodb.

\n

The response might also include aliases that have no TargetKeyId field. These\n are predefined aliases that Amazon Web Services has created but has not yet associated with a KMS key.\n Aliases that Amazon Web Services creates in your account, including predefined aliases, do not count against\n your KMS aliases\n quota.

\n

\n Cross-account use: No. ListAliases does not\n return aliases in other Amazon Web Services accounts.

\n

\n Required permissions: kms:ListAliases (IAM policy)

\n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list aliases", + "documentation": "The following example lists aliases.", + "output": { + "Aliases": [ + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/acm", + "AliasName": "alias/aws/acm", + "TargetKeyId": "da03f6f7-d279-427a-9cae-de48d07e5b66" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/ebs", + "AliasName": "alias/aws/ebs", + "TargetKeyId": "25a217e7-7170-4b8c-8bf6-045ea5f70e5b" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/rds", + "AliasName": "alias/aws/rds", + "TargetKeyId": "7ec3104e-c3f2-4b5c-bf42-bfc4772c6685" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/redshift", + "AliasName": "alias/aws/redshift", + "TargetKeyId": "08f7a25a-69e2-4fb5-8f10-393db27326fa" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/aws/s3", + "AliasName": "alias/aws/s3", + "TargetKeyId": "d2b0f1a3-580d-4f79-b836-bc983be8cfa5" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example1", + "AliasName": "alias/example1", + "TargetKeyId": "4da1e216-62d0-46c5-a7c0-5f3a3d2f8046" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example2", + "AliasName": "alias/example2", + "TargetKeyId": "f32fef59-2cc2-445b-8573-2d73328acbee" + }, + { + "AliasArn": "arn:aws:kms:us-east-2:111122223333:alias/example3", + "AliasName": "alias/example3", + "TargetKeyId": "1374ef38-d34e-4d5f-b2c9-4e0daee38855" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4378,6 +4842,21 @@ ], "traits": { "smithy.api#documentation": "

Gets the names of the key policies that are attached to a KMS key. This operation is\n designed to get policy names that you can use in a GetKeyPolicy operation.\n However, the only valid policy name is default.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListKeyPolicies (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list key policies for a KMS key", + "documentation": "The following example lists key policies for the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "PolicyNames": [ + "default" + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4461,6 +4940,45 @@ ], "traits": { "smithy.api#documentation": "

Gets a list of all KMS keys in the caller's Amazon Web Services account and Region.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListKeys (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list KMS keys", + "documentation": "The following example lists KMS keys.", + "output": { + "Keys": [ + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/0d990263-018e-4e65-a703-eff731de951e", + "KeyId": "0d990263-018e-4e65-a703-eff731de951e" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/144be297-0ae1-44ac-9c8f-93cd8c82f841", + "KeyId": "144be297-0ae1-44ac-9c8f-93cd8c82f841" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/21184251-b765-428e-b852-2c7353e72571", + "KeyId": "21184251-b765-428e-b852-2c7353e72571" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/214fe92f-5b03-4ae1-b350-db2a45dbe10c", + "KeyId": "214fe92f-5b03-4ae1-b350-db2a45dbe10c" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/339963f2-e523-49d3-af24-a0fe752aa458", + "KeyId": "339963f2-e523-49d3-af24-a0fe752aa458" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/b776a44b-df37-4438-9be4-a27494e4271a", + "KeyId": "b776a44b-df37-4438-9be4-a27494e4271a" + }, + { + "KeyArn": "arn:aws:kms:us-east-2:111122223333:key/deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb", + "KeyId": "deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4540,6 +5058,32 @@ ], "traits": { "smithy.api#documentation": "

Returns all tags on the specified KMS key.

\n

For general information about tags, including the format and syntax, see Tagging Amazon Web Services resources in\n the Amazon Web Services General Reference. For information about using\n tags in KMS, see Tagging\n keys.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ListResourceTags (key policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To list tags for a KMS key", + "documentation": "The following example lists tags for a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + }, + "output": { + "Tags": [ + { + "TagKey": "CostCenter", + "TagValue": "87654" + }, + { + "TagKey": "CreatedBy", + "TagValue": "ExampleUser" + }, + { + "TagKey": "Purpose", + "TagValue": "Test" + } + ], + "Truncated": false + } + } + ], "smithy.api#paginated": { "inputToken": "Marker", "outputToken": "NextMarker", @@ -4969,7 +5513,18 @@ } ], "traits": { - "smithy.api#documentation": "

Attaches a key policy to the specified KMS key.

\n

For more information about key policies, see Key Policies in the Key Management Service Developer Guide.\n For help writing and formatting a JSON policy document, see the IAM JSON Policy Reference in the \n Identity and Access Management User Guide\n . For examples of adding a key policy in multiple programming languages,\n see Setting a key policy in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:PutKeyPolicy (key policy)

\n

\n Related operations: GetKeyPolicy\n

" + "smithy.api#documentation": "

Attaches a key policy to the specified KMS key.

\n

For more information about key policies, see Key Policies in the Key Management Service Developer Guide.\n For help writing and formatting a JSON policy document, see the IAM JSON Policy Reference in the \n Identity and Access Management User Guide\n . For examples of adding a key policy in multiple programming languages,\n see Setting a key policy in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:PutKeyPolicy (key policy)

\n

\n Related operations: GetKeyPolicy\n

", + "smithy.api#examples": [ + { + "title": "To attach a key policy to a KMS key", + "documentation": "The following example attaches a key policy to the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "PolicyName": "default", + "Policy": "{\n \"Version\": \"2012-10-17\",\n \"Id\": \"custom-policy-2016-12-07\",\n \"Statement\": [\n {\n \"Sid\": \"Enable IAM User Permissions\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:root\"\n },\n \"Action\": \"kms:*\",\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow access for Key Administrators\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": [\n \"arn:aws:iam::111122223333:user/ExampleAdminUser\",\n \"arn:aws:iam::111122223333:role/ExampleAdminRole\"\n ]\n },\n \"Action\": [\n \"kms:Create*\",\n \"kms:Describe*\",\n \"kms:Enable*\",\n \"kms:List*\",\n \"kms:Put*\",\n \"kms:Update*\",\n \"kms:Revoke*\",\n \"kms:Disable*\",\n \"kms:Get*\",\n \"kms:Delete*\",\n \"kms:ScheduleKeyDeletion\",\n \"kms:CancelKeyDeletion\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow use of the key\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:role/ExamplePowerUserRole\"\n },\n \"Action\": [\n \"kms:Encrypt\",\n \"kms:Decrypt\",\n \"kms:ReEncrypt*\",\n \"kms:GenerateDataKey*\",\n \"kms:DescribeKey\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"Allow attachment of persistent resources\",\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:role/ExamplePowerUserRole\"\n },\n \"Action\": [\n \"kms:CreateGrant\",\n \"kms:ListGrants\",\n \"kms:RevokeGrant\"\n ],\n \"Resource\": \"*\",\n \"Condition\": {\n \"Bool\": {\n \"kms:GrantIsForAWSResource\": \"true\"\n }\n }\n }\n ]\n}\n" + } + } + ] } }, "com.amazonaws.kms#PutKeyPolicyRequest": { @@ -5023,6 +5578,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#IncorrectKeyException" }, @@ -5049,7 +5607,22 @@ } ], "traits": { - "smithy.api#documentation": "

Decrypts ciphertext and then reencrypts it entirely within KMS. You can use this\n operation to change the KMS key under which data is encrypted, such as when you manually\n rotate a KMS key or change the KMS key that protects a ciphertext. You can also use\n it to reencrypt ciphertext under the same KMS key, such as to change the encryption\n context of a ciphertext.

\n

The ReEncrypt operation can decrypt ciphertext that was encrypted by using a\n KMS key in an KMS operation, such as Encrypt or GenerateDataKey. It can also decrypt ciphertext that was encrypted by using the\n public key of an asymmetric KMS key\n outside of KMS. However, it cannot decrypt ciphertext produced by other libraries, such as\n the Amazon Web Services Encryption SDK or\n Amazon S3\n client-side encryption. These libraries return a ciphertext format that is\n incompatible with KMS.

\n

When you use the ReEncrypt operation, you need to provide information for the\n decrypt operation and the subsequent encrypt operation.

\n
    \n
  • \n

    If your ciphertext was encrypted under an asymmetric KMS key, you must use the\n SourceKeyId parameter to identify the KMS key that encrypted the\n ciphertext. You must also supply the encryption algorithm that was used. This information\n is required to decrypt the data.

    \n
  • \n
  • \n

    If your ciphertext was encrypted under a symmetric encryption KMS key, the\n SourceKeyId parameter is optional. KMS can get this information from\n metadata that it adds to the symmetric ciphertext blob. This feature adds durability to\n your implementation by ensuring that authorized users can decrypt ciphertext decades after\n it was encrypted, even if they've lost track of the key ID. However, specifying the source\n KMS key is always recommended as a best practice. When you use the\n SourceKeyId parameter to specify a KMS key, KMS uses only the KMS key you\n specify. If the ciphertext was encrypted under a different KMS key, the\n ReEncrypt operation fails. This practice ensures that you use the KMS key\n that you intend.

    \n
  • \n
  • \n

    To reencrypt the data, you must use the DestinationKeyId parameter to\n specify the KMS key that re-encrypts the data after it is decrypted. If the destination\n KMS key is an asymmetric KMS key, you must also provide the encryption algorithm. The\n algorithm that you choose must be compatible with the KMS key.

    \n \n

    When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

    \n

    You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

    \n
    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. The source KMS key and\n destination KMS key can be in different Amazon Web Services accounts. Either or both KMS keys can be in a\n different account than the caller. To specify a KMS key in a different account, you must use\n its key ARN or alias ARN.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReEncryptFrom\n permission on the source KMS key (key policy)

    \n
  • \n
  • \n

    \n kms:ReEncryptTo\n permission on the destination KMS key (key policy)

    \n
  • \n
\n

To permit reencryption from or to a KMS key, include the \"kms:ReEncrypt*\"\n permission in your key policy. This permission is\n automatically included in the key policy when you use the console to create a KMS key. But you\n must include it manually when you create a KMS key programmatically or when you use the PutKeyPolicy operation to set a key policy.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Decrypts ciphertext and then reencrypts it entirely within KMS. You can use this\n operation to change the KMS key under which data is encrypted, such as when you manually\n rotate a KMS key or change the KMS key that protects a ciphertext. You can also use\n it to reencrypt ciphertext under the same KMS key, such as to change the encryption\n context of a ciphertext.

\n

The ReEncrypt operation can decrypt ciphertext that was encrypted by using a\n KMS key in an KMS operation, such as Encrypt or GenerateDataKey. It can also decrypt ciphertext that was encrypted by using the\n public key of an asymmetric KMS key\n outside of KMS. However, it cannot decrypt ciphertext produced by other libraries, such as\n the Amazon Web Services Encryption SDK or\n Amazon S3\n client-side encryption. These libraries return a ciphertext format that is\n incompatible with KMS.

\n

When you use the ReEncrypt operation, you need to provide information for the\n decrypt operation and the subsequent encrypt operation.

\n
    \n
  • \n

    If your ciphertext was encrypted under an asymmetric KMS key, you must use the\n SourceKeyId parameter to identify the KMS key that encrypted the\n ciphertext. You must also supply the encryption algorithm that was used. This information\n is required to decrypt the data.

    \n
  • \n
  • \n

    If your ciphertext was encrypted under a symmetric encryption KMS key, the\n SourceKeyId parameter is optional. KMS can get this information from\n metadata that it adds to the symmetric ciphertext blob. This feature adds durability to\n your implementation by ensuring that authorized users can decrypt ciphertext decades after\n it was encrypted, even if they've lost track of the key ID. However, specifying the source\n KMS key is always recommended as a best practice. When you use the\n SourceKeyId parameter to specify a KMS key, KMS uses only the KMS key you\n specify. If the ciphertext was encrypted under a different KMS key, the\n ReEncrypt operation fails. This practice ensures that you use the KMS key\n that you intend.

    \n
  • \n
  • \n

    To reencrypt the data, you must use the DestinationKeyId parameter to\n specify the KMS key that re-encrypts the data after it is decrypted. If the destination\n KMS key is an asymmetric KMS key, you must also provide the encryption algorithm. The\n algorithm that you choose must be compatible with the KMS key.

    \n \n

    When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.

    \n

    You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.

    \n
    \n
  • \n
\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. The source KMS key and\n destination KMS key can be in different Amazon Web Services accounts. Either or both KMS keys can be in a\n different account than the caller. To specify a KMS key in a different account, you must use\n its key ARN or alias ARN.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReEncryptFrom\n permission on the source KMS key (key policy)

    \n
  • \n
  • \n

    \n kms:ReEncryptTo\n permission on the destination KMS key (key policy)

    \n
  • \n
\n

To permit reencryption from or to a KMS key, include the \"kms:ReEncrypt*\"\n permission in your key policy. This permission is\n automatically included in the key policy when you use the console to create a KMS key. But you\n must include it manually when you create a KMS key programmatically or when you use the PutKeyPolicy operation to set a key policy.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To reencrypt data", + "documentation": "The following example reencrypts data with the specified KMS key.", + "input": { + "CiphertextBlob": "", + "DestinationKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321" + }, + "output": { + "CiphertextBlob": "", + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321", + "SourceKeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#ReEncryptRequest": { @@ -5104,6 +5677,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5154,13 +5733,13 @@ "KeyEncryptionAlgorithm": { "target": "com.amazonaws.kms#KeyEncryptionMechanism", "traits": { - "smithy.api#documentation": "

The encryption algorithm that KMS should use with the public key for an Amazon Web Services Nitro Enclave to encrypt plaintext \n values for the response. The only valid value is RSAES_OAEP_SHA_256.

" + "smithy.api#documentation": "

The encryption algorithm that KMS should use with the public key for an Amazon Web Services Nitro\n Enclave to encrypt plaintext values for the response. The only valid value is\n RSAES_OAEP_SHA_256.

" } }, "AttestationDocument": { "target": "com.amazonaws.kms#AttestationDocumentType", "traits": { - "smithy.api#documentation": "

The attestation document for an Amazon Web Services Nitro Enclave. This document includes the enclave's public\n key.

" + "smithy.api#documentation": "

The attestation document for an Amazon Web Services Nitro Enclave. This document includes the enclave's\n public key.

" } } }, @@ -5219,7 +5798,51 @@ } ], "traits": { - "smithy.api#documentation": "

Replicates a multi-Region key into the specified Region. This operation creates a\n multi-Region replica key based on a multi-Region primary key in a different Region of the same\n Amazon Web Services partition. You can create multiple replicas of a primary key, but each must be in a\n different Region. To create a multi-Region primary key, use the CreateKey\n operation.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

A replica key is a fully-functional KMS key that can be used\n independently of its primary and peer replica keys. A primary key and its replica keys share\n properties that make them interoperable. They have the same key ID and key material. They also\n have the same key\n spec, key\n usage, key\n material origin, and automatic key rotation status. KMS automatically synchronizes these shared\n properties among related multi-Region keys. All other properties of a replica key can differ,\n including its key\n policy, tags, aliases, and Key states of KMS keys. KMS pricing and quotas for KMS keys apply to each\n primary key and replica key.

\n

When this operation completes, the new replica key has a transient key state of\n Creating. This key state changes to Enabled (or\n PendingImport) after a few seconds when the process of creating the new replica\n key is complete. While the key state is Creating, you can manage key, but you\n cannot yet use it in cryptographic operations. If you are creating and using the replica key\n programmatically, retry on KMSInvalidStateException or call\n DescribeKey to check its KeyState value before using it. For\n details about the Creating key state, see Key states of KMS keys in the\n Key Management Service Developer Guide.

\n

You cannot create more than one replica of a primary key in any Region. If the Region\n already includes a replica of the key you're trying to replicate, ReplicateKey\n returns an AlreadyExistsException error. If the key state of the existing replica\n is PendingDeletion, you can cancel the scheduled key deletion (CancelKeyDeletion) or wait for the key to be deleted. The new replica key you\n create will have the same shared\n properties as the original replica key.

\n

The CloudTrail log of a ReplicateKey operation records a\n ReplicateKey operation in the primary key's Region and a CreateKey operation in the replica key's Region.

\n

If you replicate a multi-Region primary key with imported key material, the replica key is\n created with no key material. You must import the same key material that you imported into the\n primary key. For details, see Importing key material into multi-Region keys in the Key Management Service Developer Guide.

\n

To convert a replica key to a primary key, use the UpdatePrimaryRegion\n operation.

\n \n

\n ReplicateKey uses different default values for the KeyPolicy\n and Tags parameters than those used in the KMS console. For details, see the\n parameter descriptions.

\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a replica key in a different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReplicateKey on the primary key (in the primary key's Region).\n Include this permission in the primary key's key policy.

    \n
  • \n
  • \n

    \n kms:CreateKey in an IAM policy in the replica Region.

    \n
  • \n
  • \n

    To use the Tags parameter, kms:TagResource in an IAM policy\n in the replica Region.

    \n
  • \n
\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Replicates a multi-Region key into the specified Region. This operation creates a\n multi-Region replica key based on a multi-Region primary key in a different Region of the same\n Amazon Web Services partition. You can create multiple replicas of a primary key, but each must be in a\n different Region. To create a multi-Region primary key, use the CreateKey\n operation.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

A replica key is a fully-functional KMS key that can be used\n independently of its primary and peer replica keys. A primary key and its replica keys share\n properties that make them interoperable. They have the same key ID and key material. They also\n have the same key\n spec, key\n usage, key\n material origin, and automatic key rotation status. KMS automatically synchronizes these shared\n properties among related multi-Region keys. All other properties of a replica key can differ,\n including its key\n policy, tags, aliases, and Key states of KMS keys. KMS pricing and quotas for KMS keys apply to each\n primary key and replica key.

\n

When this operation completes, the new replica key has a transient key state of\n Creating. This key state changes to Enabled (or\n PendingImport) after a few seconds when the process of creating the new replica\n key is complete. While the key state is Creating, you can manage key, but you\n cannot yet use it in cryptographic operations. If you are creating and using the replica key\n programmatically, retry on KMSInvalidStateException or call\n DescribeKey to check its KeyState value before using it. For\n details about the Creating key state, see Key states of KMS keys in the\n Key Management Service Developer Guide.

\n

You cannot create more than one replica of a primary key in any Region. If the Region\n already includes a replica of the key you're trying to replicate, ReplicateKey\n returns an AlreadyExistsException error. If the key state of the existing replica\n is PendingDeletion, you can cancel the scheduled key deletion (CancelKeyDeletion) or wait for the key to be deleted. The new replica key you\n create will have the same shared\n properties as the original replica key.

\n

The CloudTrail log of a ReplicateKey operation records a\n ReplicateKey operation in the primary key's Region and a CreateKey operation in the replica key's Region.

\n

If you replicate a multi-Region primary key with imported key material, the replica key is\n created with no key material. You must import the same key material that you imported into the\n primary key. For details, see Importing key material into multi-Region keys in the Key Management Service Developer Guide.

\n

To convert a replica key to a primary key, use the UpdatePrimaryRegion\n operation.

\n \n

\n ReplicateKey uses different default values for the KeyPolicy\n and Tags parameters than those used in the KMS console. For details, see the\n parameter descriptions.

\n
\n

\n Cross-account use: No. You cannot use this operation to\n create a replica key in a different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:ReplicateKey on the primary key (in the primary key's Region).\n Include this permission in the primary key's key policy.

    \n
  • \n
  • \n

    \n kms:CreateKey in an IAM policy in the replica Region.

    \n
  • \n
  • \n

    To use the Tags parameter, kms:TagResource in an IAM policy\n in the replica Region.

    \n
  • \n
\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To replicate a multi-Region key in a different AWS Region", + "documentation": "This example creates a multi-Region replica key in us-west-2 of a multi-Region primary key in us-east-1.", + "input": { + "KeyId": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "ReplicaRegion": "us-west-2" + }, + "output": { + "ReplicaKeyMetadata": { + "MultiRegion": true, + "MultiRegionConfiguration": { + "MultiRegionKeyType": "REPLICA", + "PrimaryKey": { + "Arn": "arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "Region": "us-east-1" + }, + "ReplicaKeys": [ + { + "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "Region": "us-west-2" + } + ] + }, + "AWSAccountId": "111122223333", + "Arn": "arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "CreationDate": 1.607472987918E9, + "Description": "", + "Enabled": true, + "KeyId": "mrk-1234abcd12ab34cd56ef1234567890ab", + "KeyManager": "CUSTOMER", + "KeyState": "Enabled", + "KeyUsage": "ENCRYPT_DECRYPT", + "Origin": "AWS_KMS", + "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", + "EncryptionAlgorithms": [ + "SYMMETRIC_DEFAULT" + ] + }, + "ReplicaPolicy": "{\n \"Version\" : \"2012-10-17\",\n \"Id\" : \"key-default-1\",...}", + "ReplicaTags": [] + } + } + ] } }, "com.amazonaws.kms#ReplicateKeyRequest": { @@ -5307,6 +5930,9 @@ { "target": "com.amazonaws.kms#DependencyTimeoutException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -5327,7 +5953,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a grant. Typically, you retire a grant when you no longer need its permissions. To\n identify the grant to retire, use a grant token, or both the grant ID and a\n key identifier (key ID or key ARN) of the KMS key. The CreateGrant operation\n returns both values.

\n

This operation can be called by the retiring principal for a grant,\n by the grantee principal if the grant allows the RetireGrant\n operation, and by the Amazon Web Services account in which the grant is created. It can also be called by\n principals to whom permission for retiring a grant is delegated. For details, see Retiring and revoking\n grants in the Key Management Service Developer Guide.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. You can retire a grant on a KMS\n key in a different Amazon Web Services account.

\n

\n Required permissions::Permission to retire a grant is\n determined primarily by the grant. For details, see Retiring and revoking grants in\n the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes a grant. Typically, you retire a grant when you no longer need its permissions. To\n identify the grant to retire, use a grant token, or both the grant ID and a\n key identifier (key ID or key ARN) of the KMS key. The CreateGrant operation\n returns both values.

\n

This operation can be called by the retiring principal for a grant,\n by the grantee principal if the grant allows the RetireGrant\n operation, and by the Amazon Web Services account in which the grant is created. It can also be called by\n principals to whom permission for retiring a grant is delegated. For details, see Retiring and revoking\n grants in the Key Management Service Developer Guide.

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. You can retire a grant on a KMS\n key in a different Amazon Web Services account.

\n

\n Required permissions::Permission to retire a grant is\n determined primarily by the grant. For details, see Retiring and revoking grants in\n the Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To retire a grant", + "documentation": "The following example retires a grant.", + "input": { + "KeyId": "arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#RetireGrantRequest": { @@ -5350,6 +5986,12 @@ "traits": { "smithy.api#documentation": "

Identifies the grant to retire. To get the grant ID, use CreateGrant,\n ListGrants, or ListRetirableGrants.

\n
    \n
  • \n

    Grant ID Example -\n 0123456789012345678901234567890123456789012345678901234567890123

    \n
  • \n
" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5368,6 +6010,9 @@ { "target": "com.amazonaws.kms#DependencyTimeoutException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidArnException" }, @@ -5385,7 +6030,17 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes the specified grant. You revoke a grant to terminate the permissions that the\n grant allows. For more information, see Retiring and revoking grants in\n the \n Key Management Service Developer Guide\n .

\n

When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. For details, see Eventual consistency in\n the \n Key Management Service Developer Guide\n .

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:RevokeGrant (key policy).

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Deletes the specified grant. You revoke a grant to terminate the permissions that the\n grant allows. For more information, see Retiring and revoking grants in\n the \n Key Management Service Developer Guide\n .

\n

When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as eventual consistency. For details, see Eventual consistency in\n the \n Key Management Service Developer Guide\n .

\n

For detailed information about grants, including grant terminology, see Grants in KMS in the\n \n Key Management Service Developer Guide\n . For examples of working with grants in several\n programming languages, see Programming grants.

\n

\n Cross-account use: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\n ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:RevokeGrant (key policy).

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To revoke a grant", + "documentation": "The following example revokes a grant.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "GrantId": "0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60" + } + } + ] } }, "com.amazonaws.kms#RevokeGrantRequest": { @@ -5404,6 +6059,12 @@ "smithy.api#documentation": "

Identifies the grant to revoke. To get the grant ID, use CreateGrant,\n ListGrants, or ListRetirableGrants.

", "smithy.api#required": {} } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5436,7 +6097,7 @@ } ], "traits": { - "smithy.api#documentation": "

Schedules the deletion of a KMS key. By default, KMS applies a waiting period of 30\n days, but you can specify a waiting period of 7-30 days. When this operation is successful,\n the key state of the KMS key changes to PendingDeletion and the key can't be used\n in any cryptographic operations. It remains in this state for the duration of the waiting\n period. Before the waiting period ends, you can use CancelKeyDeletion to\n cancel the deletion of the KMS key. After the waiting period ends, KMS deletes the KMS key,\n its key material, and all KMS data associated with it, including all aliases that refer to\n it.

\n \n

Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key\n is deleted, all data that was encrypted under the KMS key is unrecoverable. (The only\n exception is a multi-Region replica\n key, or an asymmetric or HMAC KMS key with imported key material[BUGBUG-link to\n importing-keys-managing.html#import-delete-key.) To prevent the use of a KMS key without\n deleting it, use DisableKey.

\n
\n

You can schedule the deletion of a multi-Region primary key and its replica keys at any\n time. However, KMS will not delete a multi-Region primary key with existing replica keys. If\n you schedule the deletion of a primary key with replicas, its key state changes to\n PendingReplicaDeletion and it cannot be replicated or used in cryptographic\n operations. This status can continue indefinitely. When the last of its replicas keys is\n deleted (not just scheduled), the key state of the primary key changes to\n PendingDeletion and its waiting period (PendingWindowInDays)\n begins. For details, see Deleting multi-Region keys in the\n Key Management Service Developer Guide.

\n

When KMS deletes\n a KMS key from an CloudHSM key store, it makes a best effort to delete the associated\n key material from the associated CloudHSM cluster. However, you might need to manually delete\n the orphaned key material from the cluster and its backups. Deleting a KMS key from an\n external key store has no effect on the associated external key. However, for both\n types of custom key stores, deleting a KMS key is destructive and irreversible. You cannot\n decrypt ciphertext encrypted under the KMS key by using only its associated external key or\n CloudHSM key. Also, you cannot recreate a KMS key in an external key store by creating a new KMS\n key with the same key material.

\n

For more information about scheduling a KMS key for deletion, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ScheduleKeyDeletion (key\n policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Schedules the deletion of a KMS key. By default, KMS applies a waiting period of 30\n days, but you can specify a waiting period of 7-30 days. When this operation is successful,\n the key state of the KMS key changes to PendingDeletion and the key can't be used\n in any cryptographic operations. It remains in this state for the duration of the waiting\n period. Before the waiting period ends, you can use CancelKeyDeletion to\n cancel the deletion of the KMS key. After the waiting period ends, KMS deletes the KMS key,\n its key material, and all KMS data associated with it, including all aliases that refer to\n it.

\n \n

Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key\n is deleted, all data that was encrypted under the KMS key is unrecoverable. (The only\n exception is a multi-Region replica\n key, or an asymmetric or HMAC KMS\n key with imported key material.) To prevent the use of a KMS key without deleting\n it, use DisableKey.

\n
\n

You can schedule the deletion of a multi-Region primary key and its replica keys at any\n time. However, KMS will not delete a multi-Region primary key with existing replica keys. If\n you schedule the deletion of a primary key with replicas, its key state changes to\n PendingReplicaDeletion and it cannot be replicated or used in cryptographic\n operations. This status can continue indefinitely. When the last of its replicas keys is\n deleted (not just scheduled), the key state of the primary key changes to\n PendingDeletion and its waiting period (PendingWindowInDays)\n begins. For details, see Deleting multi-Region keys in the\n Key Management Service Developer Guide.

\n

When KMS deletes\n a KMS key from an CloudHSM key store, it makes a best effort to delete the associated\n key material from the associated CloudHSM cluster. However, you might need to manually delete\n the orphaned key material from the cluster and its backups. Deleting a KMS key from an\n external key store has no effect on the associated external key. However, for both\n types of custom key stores, deleting a KMS key is destructive and irreversible. You cannot\n decrypt ciphertext encrypted under the KMS key by using only its associated external key or\n CloudHSM key. Also, you cannot recreate a KMS key in an external key store by creating a new KMS\n key with the same key material.

\n

For more information about scheduling a KMS key for deletion, see Deleting KMS keys in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:ScheduleKeyDeletion (key\n policy)

\n

\n Related operations\n

\n " } }, "com.amazonaws.kms#ScheduleKeyDeletionRequest": { @@ -5452,7 +6113,7 @@ "PendingWindowInDays": { "target": "com.amazonaws.kms#PendingWindowInDaysType", "traits": { - "smithy.api#documentation": "

The waiting period, specified in number of days. After the waiting period ends, KMS\n deletes the KMS key.

\n

If the KMS key is a multi-Region primary key with replica keys, the waiting period begins\n when the last of its replica keys is deleted. Otherwise, the waiting period begins\n immediately.

\n

This value is optional. If you include a value, it must be between 7 and 30, inclusive. If\n you do not include a value, it defaults to 30. You can use the \n kms:ScheduleKeyDeletionPendingWindowInDays\n \n condition key to further constrain the values that principals can specify in the \n PendingWindowInDays parameter.

" + "smithy.api#documentation": "

The waiting period, specified in number of days. After the waiting period ends, KMS\n deletes the KMS key.

\n

If the KMS key is a multi-Region primary key with replica keys, the waiting period begins\n when the last of its replica keys is deleted. Otherwise, the waiting period begins\n immediately.

\n

This value is optional. If you include a value, it must be between 7 and 30, inclusive. If\n you do not include a value, it defaults to 30. You can use the \n kms:ScheduleKeyDeletionPendingWindowInDays\n condition key to further\n constrain the values that principals can specify in the PendingWindowInDays\n parameter.

" } } }, @@ -5507,6 +6168,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -5527,7 +6191,24 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a digital\n signature for a message or message digest by using the private key in an asymmetric\n signing KMS key. To verify the signature, use the Verify operation, or use\n the public key in the same asymmetric KMS key outside of KMS. For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

Digital signatures are generated and verified by using asymmetric key pair, such as an RSA\n or ECC pair that is represented by an asymmetric KMS key. The key owner (or an authorized\n user) uses their private key to sign a message. Anyone with the public key can verify that the\n message was signed with that particular private key and that the message hasn't changed since\n it was signed.

\n

To use the Sign operation, provide the following information:

\n
    \n
  • \n

    Use the KeyId parameter to identify an asymmetric KMS key with a\n KeyUsage value of SIGN_VERIFY. To get the\n KeyUsage value of a KMS key, use the DescribeKey\n operation. The caller must have kms:Sign permission on the KMS key.

    \n
  • \n
  • \n

    Use the Message parameter to specify the message or message digest to\n sign. You can submit messages of up to 4096 bytes. To sign a larger message, generate a\n hash digest of the message, and then provide the hash digest in the Message\n parameter. To indicate whether the message is a full message or a digest, use the\n MessageType parameter.

    \n
  • \n
  • \n

    Choose a signing algorithm that is compatible with the KMS key.

    \n
  • \n
\n \n

When signing a message, be sure to record the KMS key and the signing algorithm. This\n information is required to verify the signature.

\n
\n \n

Best practices recommend that you limit the time during which any signature is\n effective. This deters an attack where the actor uses a signed message to establish validity\n repeatedly or long after the message is superseded. Signatures do not include a timestamp,\n but you can include a timestamp in the signed message to help you detect when its time to\n refresh the signature.

\n
\n

To verify the signature that this operation generates, use the Verify\n operation. Or use the GetPublicKey operation to download the public key and\n then use the public key to verify the signature outside of KMS.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Sign (key policy)

\n

\n Related operations: Verify\n

" + "smithy.api#documentation": "

Creates a digital\n signature for a message or message digest by using the private key in an asymmetric\n signing KMS key. To verify the signature, use the Verify operation, or use\n the public key in the same asymmetric KMS key outside of KMS. For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

Digital signatures are generated and verified by using asymmetric key pair, such as an RSA\n or ECC pair that is represented by an asymmetric KMS key. The key owner (or an authorized\n user) uses their private key to sign a message. Anyone with the public key can verify that the\n message was signed with that particular private key and that the message hasn't changed since\n it was signed.

\n

To use the Sign operation, provide the following information:

\n
    \n
  • \n

    Use the KeyId parameter to identify an asymmetric KMS key with a\n KeyUsage value of SIGN_VERIFY. To get the\n KeyUsage value of a KMS key, use the DescribeKey\n operation. The caller must have kms:Sign permission on the KMS key.

    \n
  • \n
  • \n

    Use the Message parameter to specify the message or message digest to\n sign. You can submit messages of up to 4096 bytes. To sign a larger message, generate a\n hash digest of the message, and then provide the hash digest in the Message\n parameter. To indicate whether the message is a full message or a digest, use the\n MessageType parameter.

    \n
  • \n
  • \n

    Choose a signing algorithm that is compatible with the KMS key.

    \n
  • \n
\n \n

When signing a message, be sure to record the KMS key and the signing algorithm. This\n information is required to verify the signature.

\n
\n \n

Best practices recommend that you limit the time during which any signature is\n effective. This deters an attack where the actor uses a signed message to establish validity\n repeatedly or long after the message is superseded. Signatures do not include a timestamp,\n but you can include a timestamp in the signed message to help you detect when its time to\n refresh the signature.

\n
\n

To verify the signature that this operation generates, use the Verify\n operation. Or use the GetPublicKey operation to download the public key and\n then use the public key to verify the signature outside of KMS.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Sign (key policy)

\n

\n Related operations: Verify\n

", + "smithy.api#examples": [ + { + "title": "To digitally sign a message with an asymmetric KMS key.", + "documentation": "This operation uses the private key in an asymmetric elliptic curve (ECC) KMS key to generate a digital signature for a given message.", + "input": { + "KeyId": "alias/ECC_signing_key", + "Message": "", + "MessageType": "RAW", + "SigningAlgorithm": "ECDSA_SHA_384" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "Signature": "", + "SigningAlgorithm": "ECDSA_SHA_384" + } + } + ] } }, "com.amazonaws.kms#SignRequest": { @@ -5543,14 +6224,14 @@ "Message": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Specifies the message or message digest to sign. Messages can be 0-4096 bytes. To sign a\n larger message, provide a message digest.

\n

If you provide a message digest, use the DIGEST value of MessageType to\n prevent the digest from being hashed again while signing.

", + "smithy.api#documentation": "

Specifies the message or message digest to sign. Messages can be 0-4096 bytes. To sign a\n larger message, provide a message digest.

\n

If you provide a message digest, use the DIGEST value of\n MessageType to prevent the digest from being hashed again while signing.

", "smithy.api#required": {} } }, "MessageType": { "target": "com.amazonaws.kms#MessageType", "traits": { - "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed\n as part of the signing algorithm. Use RAW for unhashed messages; use DIGEST\n for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST, KMS skips\n the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed message,\n the security of the signing operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length\n of the Message value must match the length of hashed messages for the specified signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, this can cause verification failures when \n verifying with a system that assumes a single hash.

\n

The hashing algorithm in that Sign uses is based on the SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline verification with SM2 key pairs.

    \n
  • \n
" + "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed as\n part of the signing algorithm. Use RAW for unhashed messages; use\n DIGEST for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST,\n KMS skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed\n message, the security of the signing operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length of the\n Message value must match the length of hashed messages for the specified\n signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, this can cause\n verification failures when verifying with a system that assumes a single hash.

\n

The hashing algorithm in that Sign uses is based on the\n SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline\n verification with SM2 key pairs.

    \n
  • \n
" } }, "GrantTokens": { @@ -5562,9 +6243,15 @@ "SigningAlgorithm": { "target": "com.amazonaws.kms#SigningAlgorithmSpec", "traits": { - "smithy.api#documentation": "

Specifies the signing algorithm to use when signing the message.

\n

Choose an algorithm that is compatible with the type and size of the specified asymmetric\n KMS key. When signing with RSA key pairs, RSASSA-PSS algorithms are preferred. We include\n RSASSA-PKCS1-v1_5 algorithms for compatibility with existing applications.

", + "smithy.api#documentation": "

Specifies the signing algorithm to use when signing the message.

\n

Choose an algorithm that is compatible with the type and size of the specified asymmetric\n KMS key. When signing with RSA key pairs, RSASSA-PSS algorithms are preferred. We include\n RSASSA-PKCS1-v1_5 algorithms for compatibility with existing applications.

", "smithy.api#required": {} } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -5757,7 +6444,22 @@ } ], "traits": { - "smithy.api#documentation": "

Adds or edits tags on a customer managed key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Each tag consists of a tag key and a tag value, both of which are case-sensitive strings.\n The tag value can be an empty (null) string. To add a tag, specify a new tag key and a tag\n value. To edit a tag, specify an existing tag key and a new tag value.

\n

You can use this operation to tag a customer managed key, but you cannot\n tag an Amazon Web Services\n managed key, an Amazon Web Services owned key, a custom key\n store, or an alias.

\n

You can also add tags to a KMS key while creating it (CreateKey) or\n replicating it (ReplicateKey).

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:TagResource (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Adds or edits tags on a customer managed key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

Each tag consists of a tag key and a tag value, both of which are case-sensitive strings.\n The tag value can be an empty (null) string. To add a tag, specify a new tag key and a tag\n value. To edit a tag, specify an existing tag key and a new tag value.

\n

You can use this operation to tag a customer managed key, but you cannot\n tag an Amazon Web Services\n managed key, an Amazon Web Services owned key, a custom key\n store, or an alias.

\n

You can also add tags to a KMS key while creating it (CreateKey) or\n replicating it (ReplicateKey).

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:TagResource (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To tag a KMS key", + "documentation": "The following example tags a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Tags": [ + { + "TagKey": "Purpose", + "TagValue": "Test" + } + ] + } + } + ] } }, "com.amazonaws.kms#TagResourceRequest": { @@ -5773,7 +6475,7 @@ "Tags": { "target": "com.amazonaws.kms#TagList", "traits": { - "smithy.api#documentation": "

One or more tags. Each tag consists of a tag key and a tag value. The tag value can be an empty (null)\n string.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

You cannot have more than one tag on a KMS key with the same tag key. If you specify an\n existing tag key with a different tag value, KMS replaces the current tag value with the\n specified one.

", + "smithy.api#documentation": "

One or more tags. Each tag consists of a tag key and a tag value. The tag value can be an\n empty (null) string.

\n \n

Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.

\n
\n

You cannot have more than one tag on a KMS key with the same tag key. If you specify an\n existing tag key with a different tag value, KMS replaces the current tag value with the\n specified one.

", "smithy.api#required": {} } } @@ -6005,7 +6707,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -6023,293 +6724,258 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://kms-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://kms-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://kms-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://kms-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://kms.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://kms.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://kms.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://kms.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -7292,7 +7958,20 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes tags from a customer managed key. To delete a tag,\n specify the tag key and the KMS key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

When it succeeds, the UntagResource operation doesn't return any output.\n Also, if the specified tag key isn't found on the KMS key, it doesn't throw an exception or\n return a response. To confirm that the operation worked, use the ListResourceTags operation.

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UntagResource (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Deletes tags from a customer managed key. To delete a tag,\n specify the tag key and the KMS key.

\n \n

Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

When it succeeds, the UntagResource operation doesn't return any output.\n Also, if the specified tag key isn't found on the KMS key, it doesn't throw an exception or\n return a response. To confirm that the operation worked, use the ListResourceTags operation.

\n

For information about using tags in KMS, see Tagging keys. For general information about\n tags, including the format and syntax, see Tagging Amazon Web Services resources in the Amazon\n Web Services General Reference.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UntagResource (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To remove tags from a KMS key", + "documentation": "The following example removes tags from a KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "TagKeys": [ + "Purpose", + "CostCenter" + ] + } + } + ] } }, "com.amazonaws.kms#UntagResourceRequest": { @@ -7343,7 +8022,17 @@ } ], "traits": { - "smithy.api#documentation": "

Associates an existing KMS alias with a different KMS key. Each alias is associated with\n only one KMS key at a time, although a KMS key can have multiple aliases. The alias and the\n KMS key must be in the same Amazon Web Services account and Region.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

The current and new KMS key must be the same type (both symmetric or both asymmetric or\n both HMAC), and they must have the same key usage. This restriction prevents errors in code\n that uses aliases. If you must assign an alias to a different type of KMS key, use DeleteAlias to delete the old alias and CreateAlias to create\n a new alias.

\n

You cannot use UpdateAlias to change an alias name. To change an alias name,\n use DeleteAlias to delete the old alias and CreateAlias to\n create a new alias.

\n

Because an alias is not a property of a KMS key, you can create, update, and delete the\n aliases of a KMS key without affecting the KMS key. Also, aliases do not appear in the\n response from the DescribeKey operation. To get the aliases of all KMS keys\n in the account, use the ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Associates an existing KMS alias with a different KMS key. Each alias is associated with\n only one KMS key at a time, although a KMS key can have multiple aliases. The alias and the\n KMS key must be in the same Amazon Web Services account and Region.

\n \n

Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see ABAC for KMS in the Key Management Service Developer Guide.

\n
\n

The current and new KMS key must be the same type (both symmetric or both asymmetric or\n both HMAC), and they must have the same key usage. This restriction prevents errors in code\n that uses aliases. If you must assign an alias to a different type of KMS key, use DeleteAlias to delete the old alias and CreateAlias to create\n a new alias.

\n

You cannot use UpdateAlias to change an alias name. To change an alias name,\n use DeleteAlias to delete the old alias and CreateAlias to\n create a new alias.

\n

Because an alias is not a property of a KMS key, you can create, update, and delete the\n aliases of a KMS key without affecting the KMS key. Also, aliases do not appear in the\n response from the DescribeKey operation. To get the aliases of all KMS keys\n in the account, use the ListAliases operation.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions\n

\n \n

For details, see Controlling access to aliases in the\n Key Management Service Developer Guide.

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To update an alias", + "documentation": "The following example updates the specified alias to refer to the specified KMS key.", + "input": { + "AliasName": "alias/ExampleAlias", + "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab" + } + } + ] } }, "com.amazonaws.kms#UpdateAliasRequest": { @@ -7430,7 +8119,18 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the properties of a custom key store. You can use this operation to change the\n properties of an CloudHSM key store or an external key store.

\n

Use the required CustomKeyStoreId parameter to identify the custom key store.\n Use the remaining optional parameters to change its properties. This operation does not return\n any property values. To verify the updated property values, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n \n

When updating the properties of an external key store, verify that the updated settings\n connect your key store, via the external key store proxy, to the same external key manager\n as the previous settings, or to a backup or snapshot of the external key manager with the\n same cryptographic keys. If the updated connection settings fail, you can fix them and\n retry, although an extended delay might disrupt Amazon Web Services services. However, if KMS\n permanently loses its access to cryptographic keys, ciphertext encrypted under those keys is\n unrecoverable.

\n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for updating an external key store.\n For details, see your external key manager documentation.

\n

When updating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot upload the proxy configuration\n file to the UpdateCustomKeyStore operation. However, you can use the file to\n help you determine the correct values for the UpdateCustomKeyStore\n parameters.

\n
\n

For an CloudHSM key store, you can use this operation to change the custom key store friendly\n name (NewCustomKeyStoreName), to tell KMS about a change to the\n kmsuser crypto user password (KeyStorePassword), or to associate\n the custom key store with a different, but related, CloudHSM cluster\n (CloudHsmClusterId). To update any property of an CloudHSM key store, the\n ConnectionState of the CloudHSM key store must be DISCONNECTED.

\n

For an external key store, you can use this operation to change the custom key store\n friendly name (NewCustomKeyStoreName), or to tell KMS about a change to the\n external key store proxy authentication credentials\n (XksProxyAuthenticationCredential), connection method\n (XksProxyConnectivity), external proxy endpoint\n (XksProxyUriEndpoint) and path (XksProxyUriPath). For external key\n stores with an XksProxyConnectivity of VPC_ENDPOINT_SERVICE, you can\n also update the Amazon VPC endpoint service name (XksProxyVpcEndpointServiceName). To\n update most properties of an external key store, the ConnectionState of the\n external key store must be DISCONNECTED. However, you can update the\n CustomKeyStoreName, XksProxyAuthenticationCredential, and\n XksProxyUriPath of an external key store when it is in the CONNECTED or\n DISCONNECTED state.

\n

If your update requires a DISCONNECTED state, before using\n UpdateCustomKeyStore, use the DisconnectCustomKeyStore\n operation to disconnect the custom key store. After the UpdateCustomKeyStore\n operation completes, use the ConnectCustomKeyStore to reconnect the custom\n key store. To find the ConnectionState of the custom key store, use the DescribeCustomKeyStores operation.

\n

\n

\n

Before updating the custom key store, verify that the new values allow KMS to connect\n the custom key store to its backing key store. For example, before you change the\n XksProxyUriPath value, verify that the external key store proxy is reachable at\n the new path.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n " + "smithy.api#documentation": "

Changes the properties of a custom key store. You can use this operation to change the\n properties of an CloudHSM key store or an external key store.

\n

Use the required CustomKeyStoreId parameter to identify the custom key store.\n Use the remaining optional parameters to change its properties. This operation does not return\n any property values. To verify the updated property values, use the DescribeCustomKeyStores operation.

\n

This operation is part of the custom key stores feature in KMS, which\ncombines the convenience and extensive integration of KMS with the isolation and control of a\nkey store that you own and manage.

\n \n

When updating the properties of an external key store, verify that the updated settings\n connect your key store, via the external key store proxy, to the same external key manager\n as the previous settings, or to a backup or snapshot of the external key manager with the\n same cryptographic keys. If the updated connection settings fail, you can fix them and\n retry, although an extended delay might disrupt Amazon Web Services services. However, if KMS\n permanently loses its access to cryptographic keys, ciphertext encrypted under those keys is\n unrecoverable.

\n
\n \n

For external key stores:

\n

Some external key managers provide a simpler method for updating an external key store.\n For details, see your external key manager documentation.

\n

When updating an external key store in the KMS console, you can upload a JSON-based\n proxy configuration file with the desired values. You cannot upload the proxy configuration\n file to the UpdateCustomKeyStore operation. However, you can use the file to\n help you determine the correct values for the UpdateCustomKeyStore\n parameters.

\n
\n

For an CloudHSM key store, you can use this operation to change the custom key store friendly\n name (NewCustomKeyStoreName), to tell KMS about a change to the\n kmsuser crypto user password (KeyStorePassword), or to associate\n the custom key store with a different, but related, CloudHSM cluster\n (CloudHsmClusterId). To update any property of an CloudHSM key store, the\n ConnectionState of the CloudHSM key store must be DISCONNECTED.

\n

For an external key store, you can use this operation to change the custom key store\n friendly name (NewCustomKeyStoreName), or to tell KMS about a change to the\n external key store proxy authentication credentials\n (XksProxyAuthenticationCredential), connection method\n (XksProxyConnectivity), external proxy endpoint\n (XksProxyUriEndpoint) and path (XksProxyUriPath). For external key\n stores with an XksProxyConnectivity of VPC_ENDPOINT_SERVICE, you can\n also update the Amazon VPC endpoint service name (XksProxyVpcEndpointServiceName). To\n update most properties of an external key store, the ConnectionState of the\n external key store must be DISCONNECTED. However, you can update the\n CustomKeyStoreName, XksProxyAuthenticationCredential, and\n XksProxyUriPath of an external key store when it is in the CONNECTED or\n DISCONNECTED state.

\n

If your update requires a DISCONNECTED state, before using\n UpdateCustomKeyStore, use the DisconnectCustomKeyStore\n operation to disconnect the custom key store. After the UpdateCustomKeyStore\n operation completes, use the ConnectCustomKeyStore to reconnect the custom\n key store. To find the ConnectionState of the custom key store, use the DescribeCustomKeyStores operation.

\n

\n

\n

Before updating the custom key store, verify that the new values allow KMS to connect\n the custom key store to its backing key store. For example, before you change the\n XksProxyUriPath value, verify that the external key store proxy is reachable at\n the new path.

\n

If the operation succeeds, it returns a JSON object with no\nproperties.

\n

\n Cross-account use: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateCustomKeyStore (IAM policy)

\n

\n Related operations:\n

\n ", + "smithy.api#examples": [ + { + "title": "To edit the friendly name of a custom key store", + "documentation": "This example changes the friendly name of the AWS KMS custom key store to the name that you specify. This operation does not return any data. To verify that the operation worked, use the DescribeCustomKeyStores operation.", + "input": { + "CustomKeyStoreId": "cks-1234567890abcdef0", + "NewCustomKeyStoreName": "DevelopmentKeys" + }, + "output": {} + } + ] } }, "com.amazonaws.kms#UpdateCustomKeyStoreRequest": { @@ -7529,7 +8229,17 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the description of a KMS key. To see the description of a KMS key, use DescribeKey.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateKeyDescription (key policy)

\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Updates the description of a KMS key. To see the description of a KMS key, use DescribeKey.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.

\n

\n Required permissions: kms:UpdateKeyDescription (key policy)

\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To update the description of a KMS key", + "documentation": "The following example updates the description of the specified KMS key.", + "input": { + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "Description": "Example description that indicates the intended use of this KMS key." + } + } + ] } }, "com.amazonaws.kms#UpdateKeyDescriptionRequest": { @@ -7583,7 +8293,17 @@ } ], "traits": { - "smithy.api#documentation": "

Changes the primary key of a multi-Region key.

\n

This operation changes the replica key in the specified Region to a primary key and\n changes the former primary key to a replica key. For example, suppose you have a primary key\n in us-east-1 and a replica key in eu-west-2. If you run\n UpdatePrimaryRegion with a PrimaryRegion value of\n eu-west-2, the primary key is now the key in eu-west-2, and the\n key in us-east-1 becomes a replica key. For details, see Updating the primary Region in the Key Management Service Developer Guide.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

The primary key of a multi-Region key is the source for properties\n that are always shared by primary and replica keys, including the key material, key ID, key spec, key usage, key material\n origin, and automatic\n key rotation. It's the only key that can be replicated. You cannot delete the primary\n key until all replica keys are deleted.

\n

The key ID and primary Region that you specify uniquely identify the replica key that will\n become the primary key. The primary Region must already have a replica key. This operation\n does not create a KMS key in the specified Region. To find the replica keys, use the DescribeKey operation on the primary key or any replica key. To create a replica\n key, use the ReplicateKey operation.

\n

You can run this operation while using the affected multi-Region keys in cryptographic\n operations. This operation should not delay, interrupt, or cause failures in cryptographic\n operations.

\n

Even after this operation completes, the process of updating the primary Region might\n still be in progress for a few more seconds. Operations such as DescribeKey might\n display both the old and new primary keys as replicas. The old and new primary keys have a\n transient key state of Updating. The original key state is restored when the\n update is complete. While the key state is Updating, you can use the keys in\n cryptographic operations, but you cannot replicate the new primary key or perform certain\n management operations, such as enabling or disabling these keys. For details about the\n Updating key state, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

This operation does not return any output. To verify that primary key is changed, use the\n DescribeKey operation.

\n

\n Cross-account use: No. You cannot use this operation in a\n different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:UpdatePrimaryRegion on the current primary key (in the primary key's\n Region). Include this permission primary key's key policy.

    \n
  • \n
  • \n

    \n kms:UpdatePrimaryRegion on the current replica key (in the replica key's\n Region). Include this permission in the replica key's key policy.

    \n
  • \n
\n

\n Related operations\n

\n " + "smithy.api#documentation": "

Changes the primary key of a multi-Region key.

\n

This operation changes the replica key in the specified Region to a primary key and\n changes the former primary key to a replica key. For example, suppose you have a primary key\n in us-east-1 and a replica key in eu-west-2. If you run\n UpdatePrimaryRegion with a PrimaryRegion value of\n eu-west-2, the primary key is now the key in eu-west-2, and the\n key in us-east-1 becomes a replica key. For details, see Updating the primary Region in the Key Management Service Developer Guide.

\n

This operation supports multi-Region keys, an KMS feature that lets you create multiple\n interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\n material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\n it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see Multi-Region keys in KMS in the Key Management Service Developer Guide.

\n

The primary key of a multi-Region key is the source for properties\n that are always shared by primary and replica keys, including the key material, key ID, key spec, key usage, key material\n origin, and automatic\n key rotation. It's the only key that can be replicated. You cannot delete the primary\n key until all replica keys are deleted.

\n

The key ID and primary Region that you specify uniquely identify the replica key that will\n become the primary key. The primary Region must already have a replica key. This operation\n does not create a KMS key in the specified Region. To find the replica keys, use the DescribeKey operation on the primary key or any replica key. To create a replica\n key, use the ReplicateKey operation.

\n

You can run this operation while using the affected multi-Region keys in cryptographic\n operations. This operation should not delay, interrupt, or cause failures in cryptographic\n operations.

\n

Even after this operation completes, the process of updating the primary Region might\n still be in progress for a few more seconds. Operations such as DescribeKey might\n display both the old and new primary keys as replicas. The old and new primary keys have a\n transient key state of Updating. The original key state is restored when the\n update is complete. While the key state is Updating, you can use the keys in\n cryptographic operations, but you cannot replicate the new primary key or perform certain\n management operations, such as enabling or disabling these keys. For details about the\n Updating key state, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

This operation does not return any output. To verify that primary key is changed, use the\n DescribeKey operation.

\n

\n Cross-account use: No. You cannot use this operation in a\n different Amazon Web Services account.

\n

\n Required permissions:

\n
    \n
  • \n

    \n kms:UpdatePrimaryRegion on the current primary key (in the primary key's\n Region). Include this permission primary key's key policy.

    \n
  • \n
  • \n

    \n kms:UpdatePrimaryRegion on the current replica key (in the replica key's\n Region). Include this permission in the replica key's key policy.

    \n
  • \n
\n

\n Related operations\n

\n ", + "smithy.api#examples": [ + { + "title": "To update the primary Region of a multi-Region KMS key", + "documentation": "The following UpdatePrimaryRegion example changes the multi-Region replica key in the eu-central-1 Region to the primary key. The current primary key in the us-west-1 Region becomes a replica key. \n\nThe KeyId parameter identifies the current primary key in the us-west-1 Region. The PrimaryRegion parameter indicates the Region of the replica key that will become the new primary key.\n\nThis operation does not return any output. To verify that primary key is changed, use the DescribeKey operation.", + "input": { + "KeyId": "arn:aws:kms:us-west-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab", + "PrimaryRegion": "eu-central-1" + } + } + ] } }, "com.amazonaws.kms#UpdatePrimaryRegionRequest": { @@ -7623,6 +8343,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -7646,7 +8369,25 @@ } ], "traits": { - "smithy.api#documentation": "

Verifies a digital signature that was generated by the Sign operation.

\n

\n

Verification confirms that an authorized user signed the message with the specified KMS\n key and signing algorithm, and the message hasn't changed since it was signed. If the\n signature is verified, the value of the SignatureValid field in the response is\n True. If the signature verification fails, the Verify operation\n fails with an KMSInvalidSignatureException exception.

\n

A digital signature is generated by using the private key in an asymmetric KMS key. The\n signature is verified by using the public key in the same asymmetric KMS key.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

To use the Verify operation, specify the\n same asymmetric KMS key, message, and signing algorithm that were used to produce the\n signature. The message type does not need to be the same as the one used for signing, but it must \n indicate whether the value of the Message parameter should be\n hashed as part of the verification process.

\n

You can also verify the digital signature by using the public key of the KMS key outside\n of KMS. Use the GetPublicKey operation to download the public key in the\n asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\n advantage of using the Verify operation is that it is performed within KMS. As\n a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\n in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\n the KMS key to verify signatures.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you must \n specify the distinguishing ID. By default, KMS uses 1234567812345678 as the \n distinguishing ID. For more information, see Offline verification\n with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Verify (key policy)

\n

\n Related operations: Sign\n

" + "smithy.api#documentation": "

Verifies a digital signature that was generated by the Sign operation.

\n

\n

Verification confirms that an authorized user signed the message with the specified KMS\n key and signing algorithm, and the message hasn't changed since it was signed. If the\n signature is verified, the value of the SignatureValid field in the response is\n True. If the signature verification fails, the Verify operation\n fails with an KMSInvalidSignatureException exception.

\n

A digital signature is generated by using the private key in an asymmetric KMS key. The\n signature is verified by using the public key in the same asymmetric KMS key.\n For information about asymmetric KMS keys, see Asymmetric KMS keys in the Key Management Service Developer Guide.

\n

To use the Verify operation, specify the same asymmetric KMS key, message,\n and signing algorithm that were used to produce the signature. The message type does not need\n to be the same as the one used for signing, but it must indicate whether the value of the\n Message parameter should be hashed as part of the verification process.

\n

You can also verify the digital signature by using the public key of the KMS key outside\n of KMS. Use the GetPublicKey operation to download the public key in the\n asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\n advantage of using the Verify operation is that it is performed within KMS. As\n a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\n in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\n the KMS key to verify signatures.

\n

To verify a signature outside of KMS with an SM2 public key (China Regions only), you\n must specify the distinguishing ID. By default, KMS uses 1234567812345678 as\n the distinguishing ID. For more information, see Offline\n verification with SM2 key pairs.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:Verify (key policy)

\n

\n Related operations: Sign\n

", + "smithy.api#examples": [ + { + "title": "To use an asymmetric KMS key to verify a digital signature", + "documentation": "This operation uses the public key in an elliptic curve (ECC) asymmetric key to verify a digital signature within AWS KMS.", + "input": { + "KeyId": "alias/ECC_signing_key", + "Message": "", + "MessageType": "RAW", + "Signature": "", + "SigningAlgorithm": "ECDSA_SHA_384" + }, + "output": { + "KeyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "SignatureValid": true, + "SigningAlgorithm": "ECDSA_SHA_384" + } + } + ] } }, "com.amazonaws.kms#VerifyMac": { @@ -7661,6 +8402,9 @@ { "target": "com.amazonaws.kms#DisabledException" }, + { + "target": "com.amazonaws.kms#DryRunOperationException" + }, { "target": "com.amazonaws.kms#InvalidGrantTokenException" }, @@ -7684,7 +8428,24 @@ } ], "traits": { - "smithy.api#documentation": "

Verifies the hash-based message authentication code (HMAC) for a specified message, HMAC\n KMS key, and MAC algorithm. To verify the HMAC, VerifyMac computes an HMAC using\n the message, HMAC KMS key, and MAC algorithm that you specify, and compares the computed HMAC\n to the HMAC that you specify. If the HMACs are identical, the verification succeeds;\n otherwise, it fails. Verification indicates that the message hasn't changed since the HMAC was\n calculated, and the specified key was used to generate and verify the HMAC.

\n

HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards\n defined in RFC 2104.

\n

This operation is part of KMS support for HMAC KMS keys. For details, see\n HMAC keys in KMS in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:VerifyMac (key policy)

\n

\n Related operations: GenerateMac\n

" + "smithy.api#documentation": "

Verifies the hash-based message authentication code (HMAC) for a specified message, HMAC\n KMS key, and MAC algorithm. To verify the HMAC, VerifyMac computes an HMAC using\n the message, HMAC KMS key, and MAC algorithm that you specify, and compares the computed HMAC\n to the HMAC that you specify. If the HMACs are identical, the verification succeeds;\n otherwise, it fails. Verification indicates that the message hasn't changed since the HMAC was\n calculated, and the specified key was used to generate and verify the HMAC.

\n

HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards\n defined in RFC 2104.

\n

This operation is part of KMS support for HMAC KMS keys. For details, see\n HMAC keys in KMS in the\n Key Management Service Developer Guide.

\n

The KMS key that you use for this operation must be in a compatible key state. For\ndetails, see Key states of KMS keys in the Key Management Service Developer Guide.

\n

\n Cross-account use: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\n the key ARN or alias ARN in the value of the KeyId parameter.

\n

\n Required permissions: kms:VerifyMac (key policy)

\n

\n Related operations: GenerateMac\n

", + "smithy.api#examples": [ + { + "title": "To verify an HMAC", + "documentation": "This example verifies an HMAC for a particular message, HMAC KMS keys, and MAC algorithm. A value of 'true' in the MacValid value in the response indicates that the HMAC is valid.", + "input": { + "Message": "Hello World", + "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", + "MacAlgorithm": "HMAC_SHA_384", + "Mac": "" + }, + "output": { + "KeyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", + "MacValid": true, + "MacAlgorithm": "HMAC_SHA_384" + } + } + ] } }, "com.amazonaws.kms#VerifyMacRequest": { @@ -7723,6 +8484,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -7769,14 +8536,14 @@ "Message": { "target": "com.amazonaws.kms#PlaintextType", "traits": { - "smithy.api#documentation": "

Specifies the message that was signed. You can submit a raw message of up to 4096 bytes,\n or a hash digest of the message. If you submit a digest, use the MessageType parameter\n with a value of DIGEST.

\n

If the message specified here is different from the message that was signed, the signature\n verification fails. A message and its hash digest are considered to be the same\n message.

", + "smithy.api#documentation": "

Specifies the message that was signed. You can submit a raw message of up to 4096 bytes,\n or a hash digest of the message. If you submit a digest, use the MessageType\n parameter with a value of DIGEST.

\n

If the message specified here is different from the message that was signed, the signature\n verification fails. A message and its hash digest are considered to be the same\n message.

", "smithy.api#required": {} } }, "MessageType": { "target": "com.amazonaws.kms#MessageType", "traits": { - "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed\n as part of the signing algorithm. Use RAW for unhashed messages; use DIGEST\n for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST, KMS \n skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed message,\n the security of the verification operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length\n of the Message value must match the length of hashed messages for the specified signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, if the signed message is hashed once\n while signing, but twice while verifying, verification fails, even when the message hasn't changed.

\n

The hashing algorithm in that Verify uses is based on the SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline verification with SM2 key pairs.

    \n
  • \n
" + "smithy.api#documentation": "

Tells KMS whether the value of the Message parameter should be hashed as\n part of the signing algorithm. Use RAW for unhashed messages; use\n DIGEST for message digests, which are already hashed.

\n

When the value of MessageType is RAW, KMS uses the standard\n signing algorithm, which begins with a hash function. When the value is DIGEST,\n KMS skips the hashing step in the signing algorithm.

\n \n

Use the DIGEST value only when the value of the Message\n parameter is a message digest. If you use the DIGEST value with an unhashed\n message, the security of the verification operation can be compromised.

\n
\n

When the value of MessageTypeis DIGEST, the length of the\n Message value must match the length of hashed messages for the specified\n signing algorithm.

\n

You can submit a message digest and omit the MessageType or specify\n RAW so the digest is hashed again while signing. However, if the signed message\n is hashed once while signing, but twice while verifying, verification fails, even when the\n message hasn't changed.

\n

The hashing algorithm in that Verify uses is based on the\n SigningAlgorithm value.

\n
    \n
  • \n

    Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.

    \n
  • \n
  • \n

    Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.

    \n
  • \n
  • \n

    SM2DSA uses the SM3 hashing algorithm. For details, see Offline\n verification with SM2 key pairs.

    \n
  • \n
" } }, "Signature": { @@ -7798,6 +8565,12 @@ "traits": { "smithy.api#documentation": "

A list of grant tokens.

\n

Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved eventual consistency. For more information, see Grant token and Using a grant token in the\n Key Management Service Developer Guide.

" } + }, + "DryRun": { + "target": "com.amazonaws.kms#NullableBooleanType", + "traits": { + "smithy.api#documentation": "

Checks if your request will succeed. DryRun is an optional parameter.

\n

To learn more about how to use this parameter, see Testing your KMS API calls in the Key Management Service Developer Guide.

" + } } }, "traits": { @@ -7877,12 +8650,12 @@ "Id": { "target": "com.amazonaws.kms#XksKeyIdType", "traits": { - "smithy.api#documentation": "

The ID of the external key in its external key manager. This is the ID that the external key store proxy uses to identify the external key.

" + "smithy.api#documentation": "

The ID of the external key in its external key manager. This is the ID that the external\n key store proxy uses to identify the external key.

" } } }, "traits": { - "smithy.api#documentation": "

Information about the external key that is associated with a KMS key in an\n external key store.

\n

This element appears in a CreateKey or DescribeKey\n response only for a KMS key in an external key store.

\n

The external key is a symmetric encryption key that is hosted by\n an external key manager outside of Amazon Web Services. When you use the KMS key in an external key store\n in a cryptographic operation, the cryptographic operation is performed in the\n external key manager using the specified external key. For more information, see External key in the Key Management Service Developer Guide.

" + "smithy.api#documentation": "

Information about the external key that is\n associated with a KMS key in an external key store.

\n

This element appears in a CreateKey or DescribeKey\n response only for a KMS key in an external key store.

\n

The external key is a symmetric encryption key that is hosted by an\n external key manager outside of Amazon Web Services. When you use the KMS key in an external key store in a\n cryptographic operation, the cryptographic operation is performed in the external key manager\n using the specified external key. For more information, see External key in the\n Key Management Service Developer Guide.

" } }, "com.amazonaws.kms#XksKeyIdType": { @@ -7924,7 +8697,7 @@ "code": "XksKeyNotFoundException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

The request was rejected because the external key store proxy could not find the external key. This\n exception is thrown when the value of the XksKeyId parameter doesn't identify a\n key in the external key manager associated with the external key proxy.

\n

Verify that the XksKeyId represents an existing key in the external key\n manager. Use the key identifier that the external key store proxy uses to identify the key.\n For details, see the documentation provided with your external key store proxy or key\n manager.

", + "smithy.api#documentation": "

The request was rejected because the external key store proxy could not find the external\n key. This exception is thrown when the value of the XksKeyId parameter doesn't\n identify a key in the external key manager associated with the external key proxy.

\n

Verify that the XksKeyId represents an existing key in the external key\n manager. Use the key identifier that the external key store proxy uses to identify the key.\n For details, see the documentation provided with your external key store proxy or key\n manager.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } @@ -7985,7 +8758,7 @@ "AccessKeyId": { "target": "com.amazonaws.kms#XksProxyAuthenticationAccessKeyIdType", "traits": { - "smithy.api#documentation": "

The part of the external key store proxy authentication credential\n that uniquely identifies the secret access key.

" + "smithy.api#documentation": "

The part of the external key store proxy authentication credential that uniquely identifies the secret access\n key.

" } }, "UriEndpoint": { @@ -8145,7 +8918,7 @@ "code": "XksProxyUriUnreachableException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

KMS was unable to reach the specified XksProxyUriPath. The path must be\n reachable before you create the external key store or update its settings.

\n

This exception is also thrown when the external key store proxy response to a GetHealthStatus\n request indicates that all external key manager instances are unavailable.

", + "smithy.api#documentation": "

KMS was unable to reach the specified XksProxyUriPath. The path must be\n reachable before you create the external key store or update its settings.

\n

This exception is also thrown when the external key store proxy response to a\n GetHealthStatus request indicates that all external key manager instances are\n unavailable.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } @@ -8179,7 +8952,7 @@ "code": "XksProxyVpcEndpointServiceInvalidConfigurationException", "httpResponseCode": 400 }, - "smithy.api#documentation": "

The request was rejected because the Amazon VPC endpoint service configuration does not fulfill\n the requirements for an external key store proxy. For details, see the exception message and\n review the requirements for Amazon VPC endpoint service connectivity for an external key\n store.

", + "smithy.api#documentation": "

The request was rejected because the Amazon VPC endpoint service configuration does not fulfill\n the requirements for an external key store proxy. For details, see the exception message and\n review the\n requirements for Amazon VPC endpoint service connectivity for an external key\n store.

", "smithy.api#error": "client", "smithy.api#httpError": 400 } diff --git a/aws/sdk/aws-models/lambda.json b/aws/sdk/aws-models/lambda.json index df1e4216396..794f4079a77 100644 --- a/aws/sdk/aws-models/lambda.json +++ b/aws/sdk/aws-models/lambda.json @@ -288,7 +288,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -306,293 +305,258 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://lambda-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://lambda-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://lambda-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://lambda-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://lambda.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://lambda.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://lambda.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://lambda.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1686,7 +1650,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -2567,13 +2531,13 @@ "StartingPosition": { "target": "com.amazonaws.lambda#EventSourcePosition", "traits": { - "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis, Amazon\n DynamoDB, and Amazon MSK Streams sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams and Amazon DocumentDB.

" + "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis and\n Amazon DynamoDB Stream event sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams, Amazon DocumentDB, Amazon MSK, and self-managed Apache Kafka.

" } }, "StartingPositionTimestamp": { "target": "com.amazonaws.lambda#Date", "traits": { - "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading.

" + "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading. StartingPositionTimestamp cannot be in the future.

" } }, "DestinationConfig": { @@ -3133,6 +3097,9 @@ { "target": "com.amazonaws.lambda#InvalidParameterValueException" }, + { + "target": "com.amazonaws.lambda#ResourceConflictException" + }, { "target": "com.amazonaws.lambda#ResourceInUseException" }, @@ -3197,7 +3164,7 @@ } ], "traits": { - "smithy.api#documentation": "

Deletes a Lambda function. To delete a specific function version, use the Qualifier parameter.\n Otherwise, all versions and aliases are deleted.

\n

To delete Lambda event source mappings that invoke a function, use DeleteEventSourceMapping. For Amazon Web Services and resources that invoke your function\n directly, delete the trigger in the service where you originally configured it.

", + "smithy.api#documentation": "

Deletes a Lambda function. To delete a specific function version, use the Qualifier parameter.\n Otherwise, all versions and aliases are deleted. This doesn't require the user to have explicit\n permissions for DeleteAlias.

\n

To delete Lambda event source mappings that invoke a function, use DeleteEventSourceMapping. For Amazon Web Services and resources that invoke your function\n directly, delete the trigger in the service where you originally configured it.

", "smithy.api#http": { "method": "DELETE", "uri": "/2015-03-31/functions/{FunctionName}", @@ -3481,7 +3448,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -3912,13 +3879,13 @@ "StartingPosition": { "target": "com.amazonaws.lambda#EventSourcePosition", "traits": { - "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis, Amazon DynamoDB, and Amazon MSK stream sources. AT_TIMESTAMP is supported only for Amazon Kinesis\n streams and Amazon DocumentDB.

" + "smithy.api#documentation": "

The position in a stream from which to start reading. Required for Amazon Kinesis and\n Amazon DynamoDB Stream event sources. AT_TIMESTAMP is supported only for\n Amazon Kinesis streams, Amazon DocumentDB, Amazon MSK, and self-managed Apache Kafka.

" } }, "StartingPositionTimestamp": { "target": "com.amazonaws.lambda#Date", "traits": { - "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading.

" + "smithy.api#documentation": "

With StartingPosition set to AT_TIMESTAMP, the time from which to start\n reading. StartingPositionTimestamp cannot be in the future.

" } }, "BatchSize": { @@ -5663,7 +5630,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -5708,7 +5675,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -6450,6 +6417,9 @@ { "target": "com.amazonaws.lambda#KMSNotFoundException" }, + { + "target": "com.amazonaws.lambda#RecursiveInvocationException" + }, { "target": "com.amazonaws.lambda#RequestTooLargeException" }, @@ -6666,6 +6636,9 @@ { "target": "com.amazonaws.lambda#KMSNotFoundException" }, + { + "target": "com.amazonaws.lambda#RecursiveInvocationException" + }, { "target": "com.amazonaws.lambda#RequestTooLargeException" }, @@ -8573,6 +8546,9 @@ } } }, + "com.amazonaws.lambda#NullableBoolean": { + "type": "boolean" + }, "com.amazonaws.lambda#OnFailure": { "type": "structure", "members": { @@ -9485,6 +9461,28 @@ } } }, + "com.amazonaws.lambda#RecursiveInvocationException": { + "type": "structure", + "members": { + "Type": { + "target": "com.amazonaws.lambda#String", + "traits": { + "smithy.api#documentation": "

The exception type.

" + } + }, + "Message": { + "target": "com.amazonaws.lambda#String", + "traits": { + "smithy.api#documentation": "

The exception message.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Lambda has detected your function being invoked in a recursive loop with other Amazon Web Services resources and stopped your function's invocation.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, "com.amazonaws.lambda#RemoveLayerVersionPermission": { "type": "operation", "input": { @@ -9533,7 +9531,7 @@ "VersionNumber": { "target": "com.amazonaws.lambda#LayerVersionNumber", "traits": { - "smithy.api#default": 0, + "smithy.api#default": null, "smithy.api#documentation": "

The version number.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} @@ -9948,6 +9946,12 @@ "traits": { "smithy.api#enumValue": "ruby3.2" } + }, + "python311": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "python3.11" + } } } }, @@ -10131,7 +10135,7 @@ } }, "traits": { - "smithy.api#documentation": "

The function's Lambda SnapStart setting. Set ApplyOn to PublishedVersions to create a\n snapshot of the initialized execution environment when you publish a function version.

\n

SnapStart is supported with the java11 runtime. For more information, see\n Improving startup performance with Lambda\n SnapStart.

" + "smithy.api#documentation": "

The function's Lambda SnapStart setting. Set ApplyOn to PublishedVersions to create a\n snapshot of the initialized execution environment when you publish a function version.

" } }, "com.amazonaws.lambda#SnapStartApplyOn": { @@ -11734,6 +11738,12 @@ "traits": { "smithy.api#documentation": "

A list of VPC security group IDs.

" } + }, + "Ipv6AllowedForDualStack": { + "target": "com.amazonaws.lambda#NullableBoolean", + "traits": { + "smithy.api#documentation": "

Allows outbound IPv6 traffic on VPC functions that are connected to dual-stack subnets.

" + } } }, "traits": { @@ -11760,6 +11770,12 @@ "traits": { "smithy.api#documentation": "

The ID of the VPC.

" } + }, + "Ipv6AllowedForDualStack": { + "target": "com.amazonaws.lambda#NullableBoolean", + "traits": { + "smithy.api#documentation": "

Allows outbound IPv6 traffic on VPC functions that are connected to dual-stack subnets.

" + } } }, "traits": { diff --git a/aws/sdk/aws-models/polly.json b/aws/sdk/aws-models/polly.json index 219c1a0a927..0f702c1fdee 100644 --- a/aws/sdk/aws-models/polly.json +++ b/aws/sdk/aws-models/polly.json @@ -62,6 +62,16 @@ ], "traits": { "smithy.api#documentation": "

Deletes the specified pronunciation lexicon stored in an Amazon Web Services Region. A lexicon which has been deleted is not available for\n speech synthesis, nor is it possible to retrieve it using either the\n GetLexicon or ListLexicon APIs.

\n

For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To delete a lexicon", + "documentation": "Deletes a specified pronunciation lexicon stored in an AWS Region.", + "input": { + "Name": "example" + }, + "output": {} + } + ], "smithy.api#http": { "method": "DELETE", "uri": "/v1/lexicons/{Name}", @@ -110,6 +120,40 @@ ], "traits": { "smithy.api#documentation": "

Returns the list of voices that are available for use when\n requesting speech synthesis. Each voice speaks a specified language, is\n either male or female, and is identified by an ID, which is the ASCII\n version of the voice name.

\n

When synthesizing speech ( SynthesizeSpeech ), you\n provide the voice ID for the voice you want from the list of voices\n returned by DescribeVoices.

\n

For example, you want your news reader application to read news in\n a specific language, but giving a user the option to choose the voice.\n Using the DescribeVoices operation you can provide the user\n with a list of available voices to select from.

\n

You can optionally specify a language code to filter the available\n voices. For example, if you specify en-US, the operation\n returns a list of all available US English voices.

\n

This operation requires permissions to perform the\n polly:DescribeVoices action.

", + "smithy.api#examples": [ + { + "title": "To describe available voices", + "documentation": "Returns the list of voices that are available for use when requesting speech synthesis. Displayed languages are those within the specified language code. If no language code is specified, voices for all available languages are displayed.", + "input": { + "LanguageCode": "en-GB" + }, + "output": { + "Voices": [ + { + "Gender": "Female", + "Name": "Emma", + "LanguageName": "British English", + "Id": "Emma", + "LanguageCode": "en-GB" + }, + { + "Gender": "Male", + "Name": "Brian", + "LanguageName": "British English", + "Id": "Brian", + "LanguageCode": "en-GB" + }, + { + "Gender": "Female", + "Name": "Amy", + "LanguageName": "British English", + "Id": "Amy", + "LanguageCode": "en-GB" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/v1/voices", @@ -683,6 +727,18 @@ "traits": { "smithy.api#enumValue": "en-IE" } + }, + "nl_BE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "nl-BE" + } + }, + "fr_BE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "fr-BE" + } } } }, @@ -880,6 +936,27 @@ ], "traits": { "smithy.api#documentation": "

Returns a list of pronunciation lexicons stored in an Amazon Web Services Region. For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To list all lexicons in a region", + "documentation": "Returns a list of pronunciation lexicons stored in an AWS Region.", + "output": { + "Lexicons": [ + { + "Attributes": { + "LanguageCode": "en-US", + "LastModified": 1.478542980117E9, + "Alphabet": "ipa", + "LexemesCount": 1, + "LexiconArn": "arn:aws:polly:us-east-1:123456789012:lexicon/example", + "Size": 503 + }, + "Name": "example" + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/v1/lexicons", @@ -1193,7 +1270,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -1211,293 +1287,258 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://polly-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://polly-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://polly-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://polly-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://polly.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://polly.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://polly.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://polly.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -2162,6 +2203,17 @@ ], "traits": { "smithy.api#documentation": "

Stores a pronunciation lexicon in an Amazon Web Services Region. If\n a lexicon with the same name already exists in the region, it is\n overwritten by the new lexicon. Lexicon operations have eventual\n consistency, therefore, it might take some time before the lexicon is\n available to the SynthesizeSpeech operation.

\n

For more information, see Managing Lexicons.

", + "smithy.api#examples": [ + { + "title": "To save a lexicon", + "documentation": "Stores a pronunciation lexicon in an AWS Region.", + "input": { + "Name": "W3C", + "Content": "file://example.pls" + }, + "output": {} + } + ], "smithy.api#http": { "method": "PUT", "uri": "/v1/lexicons/{Name}", @@ -2597,6 +2649,27 @@ ], "traits": { "smithy.api#documentation": "

Synthesizes UTF-8 input, plain text or SSML, to a stream of bytes.\n SSML input must be valid, well-formed SSML. Some alphabets might not be\n available with all the voices (for example, Cyrillic might not be read at\n all by English voices) unless phoneme mapping is used. For more\n information, see How it Works.

", + "smithy.api#examples": [ + { + "title": "To synthesize speech", + "documentation": "Synthesizes plain text or SSML into a file of human-like speech.", + "input": { + "LexiconNames": [ + "example" + ], + "OutputFormat": "mp3", + "SampleRate": "8000", + "Text": "All Gaul is divided into three parts", + "TextType": "text", + "VoiceId": "Joanna" + }, + "output": { + "AudioStream": "TEXT", + "ContentType": "audio/mpeg", + "RequestCharacters": 37 + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/v1/speech", @@ -3389,6 +3462,24 @@ "traits": { "smithy.api#enumValue": "Sofie" } + }, + "Lisa": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Lisa" + } + }, + "Isabelle": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Isabelle" + } + }, + "Zayd": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "Zayd" + } } } }, diff --git a/aws/sdk/aws-models/qldb-session.json b/aws/sdk/aws-models/qldb-session.json index b12ca953200..ce7bbdaedba 100644 --- a/aws/sdk/aws-models/qldb-session.json +++ b/aws/sdk/aws-models/qldb-session.json @@ -326,7 +326,7 @@ "min": 1, "max": 32 }, - "smithy.api#pattern": "(?!^.*--)(?!^[0-9]+$)(?!^-)(?!.*-$)^[A-Za-z0-9-]+$" + "smithy.api#pattern": "^(?!^.*--)(?!^[0-9]+$)(?!^-)(?!.*-$)^[A-Za-z0-9-]+$" } }, "com.amazonaws.qldbsession#LimitExceededException": { @@ -453,7 +453,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -471,293 +470,258 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://session.qldb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://session.qldb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://session.qldb-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://session.qldb-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://session.qldb.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://session.qldb.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://session.qldb.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://session.qldb.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1334,6 +1298,9 @@ "smithy.api#documentation": "

Command to fetch a page.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.qldbsession#SendCommandResult": { @@ -1381,6 +1348,9 @@ "smithy.api#documentation": "

Contains the details of the fetched page.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.qldbsession#SessionToken": { diff --git a/aws/sdk/aws-models/route53.json b/aws/sdk/aws-models/route53.json index 72d97074e35..85d222c1b78 100644 --- a/aws/sdk/aws-models/route53.json +++ b/aws/sdk/aws-models/route53.json @@ -263,6 +263,7 @@ "arnNamespace": "route53", "cloudFormationName": "Route53", "cloudTrailEventSource": "route53.amazonaws.com", + "docId": "route53-2013-04-01", "endpointPrefix": "route53" }, "aws.auth#sigv4": { @@ -316,7 +317,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -334,650 +334,615 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws" + "name" ] }, + "aws" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53-fips.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53-fips.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-cn" + "name" ] }, + "aws-cn" + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://route53.amazonaws.com.cn", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "route53", + "signingRegion": "cn-northwest-1" } - ], - "endpoint": { - "url": "https://route53.amazonaws.com.cn", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "cn-northwest-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-us-gov" + "name" ] }, + "aws-us-gov" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] + "ref": "UseFIPS" }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.us-gov.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-gov-west-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.us-gov.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-gov-west-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso" + "name" ] }, + "aws-iso" + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseFIPS" }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://route53.c2s.ic.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-iso-east-1" - } - ] + "ref": "UseDualStack" }, - "headers": {} - }, - "type": "endpoint" + false + ] + } + ], + "endpoint": { + "url": "https://route53.c2s.ic.gov", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-iso-east-1" + } + ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] + "ref": "PartitionResult" }, - "aws-iso-b" + "name" ] }, + "aws-iso-b" + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] + "ref": "UseDualStack" }, + false + ] + } + ], + "endpoint": { + "url": "https://route53.sc2s.sgov.gov", + "properties": { + "authSchemes": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] + "name": "sigv4", + "signingName": "route53", + "signingRegion": "us-isob-east-1" } - ], - "endpoint": { - "url": "https://route53.sc2s.sgov.gov", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "route53", - "signingRegion": "us-isob-east-1" - } - ] + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" }, - "headers": {} - }, - "type": "endpoint" + true + ] }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://route53-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://route53-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://route53-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://route53-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://route53.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://route53.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://route53.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://route53.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1527,7 +1492,6 @@ "Value": { "target": "com.amazonaws.route53#LimitValue", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The current value for the limit that is specified by Type.

", "smithy.api#required": {} } @@ -1628,6 +1592,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ActivateKeySigningKeyResponse": { @@ -1639,6 +1606,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#AlarmIdentifier": { @@ -1747,6 +1717,28 @@ ], "traits": { "smithy.api#documentation": "

Associates an Amazon VPC with a private hosted zone.

\n \n

To perform the association, the VPC and the private hosted zone must already\n\t\t\t\texist. You can't convert a public hosted zone into a private hosted zone.

\n
\n \n

If you want to associate a VPC that was created by using one Amazon Web Services account with a private hosted zone that was created by using a\n\t\t\t\tdifferent account, the Amazon Web Services account that created the private hosted\n\t\t\t\tzone must first submit a CreateVPCAssociationAuthorization request.\n\t\t\t\tThen the account that created the VPC must submit an\n\t\t\t\t\tAssociateVPCWithHostedZone request.

\n
\n \n

When granting access, the hosted zone and the Amazon VPC must belong to\n\t\t\t\tthe same partition. A partition is a group of Amazon Web Services Regions. Each\n\t\t\t\t\tAmazon Web Services account is scoped to one partition.

\n

The following are the supported partitions:

\n
    \n
  • \n

    \n aws - Amazon Web Services Regions

    \n
  • \n
  • \n

    \n aws-cn - China Regions

    \n
  • \n
  • \n

    \n aws-us-gov - Amazon Web Services GovCloud (US) Region

    \n
  • \n
\n

For more information, see Access Management\n\t\t\t\tin the Amazon Web Services General Reference.

\n
", + "smithy.api#examples": [ + { + "title": "To associate a VPC with a hosted zone", + "documentation": "The following example associates the VPC with ID vpc-1a2b3c4d with the hosted zone with ID Z3M3LMPEXAMPLE.", + "input": { + "HostedZoneId": "Z3M3LMPEXAMPLE", + "VPC": { + "VPCId": "vpc-1a2b3c4d", + "VPCRegion": "us-east-2" + }, + "Comment": "" + }, + "output": { + "ChangeInfo": { + "Status": "INSYNC", + "Comment": "", + "SubmittedAt": "2017-01-31T01:36:41.958Z", + "Id": "/change/C3HC6WDB2UANE2" + } + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/hostedzone/{HostedZoneId}/associatevpc", @@ -1780,7 +1772,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to associate a VPC with a\n\t\t\tprivate hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to associate a VPC with a\n\t\t\tprivate hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#AssociateVPCWithHostedZoneResponse": { @@ -1795,7 +1788,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tAssociateVPCWithHostedZone request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tAssociateVPCWithHostedZone request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Change": { @@ -1925,6 +1919,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeCidrCollectionResponse": { @@ -1937,6 +1934,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ChangeId": { @@ -2009,7 +2009,42 @@ } ], "traits": { - "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set exists Route 53 updates it with the\n\t\t\t\t\tvalues in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates\n\t\t\tyour changes to all of the Route 53 authoritative DNS servers. While your changes are\n\t\t\tpropagating, GetChange returns a status of PENDING. When\n\t\t\tpropagation is complete, GetChange returns a status of INSYNC.\n\t\t\tChanges generally propagate to all Route 53 name servers within 60 seconds. For more\n\t\t\tinformation, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", + "smithy.api#documentation": "

Creates, changes, or deletes a resource record set, which contains authoritative DNS\n\t\t\tinformation for a specified domain name or subdomain name. For example, you can use\n\t\t\t\tChangeResourceRecordSets to create a resource record set that routes\n\t\t\ttraffic for test.example.com to a web server that has an IP address of\n\t\t\t192.0.2.44.

\n

\n Deleting Resource Record Sets\n

\n

To delete a resource record set, you must specify all the same values that you\n\t\t\tspecified when you created it.

\n

\n Change Batches and Transactional Changes\n

\n

The request body must include a document with a\n\t\t\t\tChangeResourceRecordSetsRequest element. The request body contains a\n\t\t\tlist of change items, known as a change batch. Change batches are considered\n\t\t\ttransactional changes. Route 53 validates the changes in the request and then either\n\t\t\tmakes all or none of the changes in the change batch request. This ensures that DNS\n\t\t\trouting isn't adversely affected by partial changes to the resource record sets in a\n\t\t\thosted zone.

\n

For example, suppose a change batch request contains two changes: it deletes the\n\t\t\t\tCNAME resource record set for www.example.com and creates an alias\n\t\t\tresource record set for www.example.com. If validation for both records succeeds, Route\n\t\t\t53 deletes the first resource record set and creates the second resource record set in a\n\t\t\tsingle operation. If validation for either the DELETE or the\n\t\t\t\tCREATE action fails, then the request is canceled, and the original\n\t\t\t\tCNAME record continues to exist.

\n \n

If you try to delete the same resource record set more than once in a single\n\t\t\t\tchange batch, Route 53 returns an InvalidChangeBatch error.

\n
\n

\n Traffic Flow\n

\n

To create resource record sets for complex routing configurations, use either the\n\t\t\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\n\t\t\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\n\t\t\tassociate the traffic policy with one or more domain names (such as example.com) or\n\t\t\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\n\t\t\tzones. You can roll back the updates if the new configuration isn't performing as\n\t\t\texpected. For more information, see Using Traffic Flow to Route\n\t\t\t\tDNS Traffic in the Amazon Route 53 Developer\n\t\t\tGuide.

\n

\n Create, Delete, and Upsert\n

\n

Use ChangeResourceRecordsSetsRequest to perform the following\n\t\t\tactions:

\n
    \n
  • \n

    \n CREATE: Creates a resource record set that has the specified\n\t\t\t\t\tvalues.

    \n
  • \n
  • \n

    \n DELETE: Deletes an existing resource record set that has the\n\t\t\t\t\tspecified values.

    \n
  • \n
  • \n

    \n UPSERT: If a resource set doesn't exist, Route 53 creates it. If a resource\n\t\t\t\t\tset exists Route 53 updates it with the values in the request.

    \n
  • \n
\n

\n Syntaxes for Creating, Updating, and Deleting Resource Record\n\t\t\t\tSets\n

\n

The syntax for a request depends on the type of resource record set that you want to\n\t\t\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\n\t\t\tyour request must appear in the order listed in the syntax.

\n

For an example for each type of resource record set, see \"Examples.\"

\n

Don't refer to the syntax in the \"Parameter Syntax\" section, which includes\n\t\t\tall of the elements for every kind of resource record set that you can create, delete,\n\t\t\tor update by using ChangeResourceRecordSets.

\n

\n Change Propagation to Route 53 DNS Servers\n

\n

When you submit a ChangeResourceRecordSets request, Route 53 propagates your\n\t\t\tchanges to all of the Route 53 authoritative DNS servers managing the hosted zone. While\n\t\t\tyour changes are propagating, GetChange returns a status of\n\t\t\t\tPENDING. When propagation is complete, GetChange returns a\n\t\t\tstatus of INSYNC. Changes generally propagate to all Route 53 name servers\n\t\t\tmanaging the hosted zone within 60 seconds. For more information, see GetChange.

\n

\n Limits on ChangeResourceRecordSets Requests\n

\n

For information about the limits on a ChangeResourceRecordSets request,\n\t\t\tsee Limits in the Amazon Route 53 Developer Guide.

", + "smithy.api#examples": [ + { + "title": "To create a basic resource record set", + "documentation": "The following example creates a resource record set that routes Internet traffic to a resource with an IP address of 192.0.2.44.", + "input": { + "HostedZoneId": "Z3M3LMPEXAMPLE", + "ChangeBatch": { + "Comment": "Web server for example.com", + "Changes": [ + { + "Action": "CREATE", + "ResourceRecordSet": { + "Name": "example.com", + "Type": "A", + "TTL": 60, + "ResourceRecords": [ + { + "Value": "192.0.2.44" + } + ] + } + } + ] + } + }, + "output": { + "ChangeInfo": { + "Comment": "Web server for example.com", + "Id": "/change/C2682N5HXP0BZ4", + "Status": "PENDING", + "SubmittedAt": "2017-02-10T01:36:41.958Z" + } + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/hostedzone/{HostedZoneId}/rrset", @@ -2037,7 +2072,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains change information for the resource record set.

" + "smithy.api#documentation": "

A complex type that contains change information for the resource record set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeResourceRecordSetsResponse": { @@ -2052,7 +2088,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response for the request.

" + "smithy.api#documentation": "

A complex type containing the response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ChangeStatus": { @@ -2099,6 +2136,30 @@ ], "traits": { "smithy.api#documentation": "

Adds, edits, or deletes tags for a health check or a hosted zone.

\n

For information about using tags for cost allocation, see Using Cost Allocation\n\t\t\t\tTags in the Billing and Cost Management User Guide.

", + "smithy.api#examples": [ + { + "title": "To add or remove tags from a hosted zone or health check", + "documentation": "The following example adds two tags and removes one tag from the hosted zone with ID Z3M3LMPEXAMPLE.", + "input": { + "ResourceType": "hostedzone", + "ResourceId": "Z3M3LMPEXAMPLE", + "AddTags": [ + { + "Key": "apex", + "Value": "3874" + }, + { + "Key": "acme", + "Value": "4938" + } + ], + "RemoveTagKeys": [ + "Nadir" + ] + }, + "output": {} + } + ], "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/tags/{ResourceType}/{ResourceId}", @@ -2139,14 +2200,16 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the tags that you want to add, edit, or\n\t\t\tdelete.

" + "smithy.api#documentation": "

A complex type that contains information about the tags that you want to add, edit, or\n\t\t\tdelete.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ChangeTagsForResourceResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty response for the request.

" + "smithy.api#documentation": "

Empty response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Changes": { @@ -2700,6 +2763,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { @@ -2886,6 +2955,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateCidrCollectionResponse": { @@ -2904,6 +2976,9 @@ "smithy.api#httpHeader": "Location" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateHealthCheck": { @@ -2940,7 +3015,7 @@ "CallerReference": { "target": "com.amazonaws.route53#HealthCheckNonce", "traits": { - "smithy.api#documentation": "

A unique string that identifies the request and that allows you to retry a failed\n\t\t\t\tCreateHealthCheck request without the risk of creating two identical\n\t\t\thealth checks:

\n
    \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference and settings as a previous request, and if the\n\t\t\t\t\thealth check doesn't exist, Amazon Route 53 creates the health check. If the\n\t\t\t\t\thealth check does exist, Route 53 returns the settings for the existing health\n\t\t\t\t\tcheck.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference as a deleted health check, regardless of the\n\t\t\t\t\tsettings, Route 53 returns a HealthCheckAlreadyExists error.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference as an existing health check but with different\n\t\t\t\t\tsettings, Route 53 returns a HealthCheckAlreadyExists error.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with a unique\n\t\t\t\t\t\tCallerReference but settings identical to an existing health\n\t\t\t\t\tcheck, Route 53 creates the health check.

    \n
  • \n
", + "smithy.api#documentation": "

A unique string that identifies the request and that allows you to retry a failed\n\t\t\t\tCreateHealthCheck request without the risk of creating two identical\n\t\t\thealth checks:

\n
    \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference and settings as a previous request, and if the\n\t\t\t\t\thealth check doesn't exist, Amazon Route 53 creates the health check. If the\n\t\t\t\t\thealth check does exist, Route 53 returns the settings for the existing health\n\t\t\t\t\tcheck.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference as a deleted health check, regardless of the\n\t\t\t\t\tsettings, Route 53 returns a HealthCheckAlreadyExists error.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with the same\n\t\t\t\t\t\tCallerReference as an existing health check but with different\n\t\t\t\t\tsettings, Route 53 returns a HealthCheckAlreadyExists error.

    \n
  • \n
  • \n

    If you send a CreateHealthCheck request with a unique\n\t\t\t\t\t\tCallerReference but settings identical to an existing health\n\t\t\t\t\tcheck, Route 53 creates the health check.

    \n
  • \n
\n

Route 53 does not store the CallerReference for a deleted health check indefinitely. \n\t\t\tThe CallerReference for a deleted health check will be deleted after a number of days.

", "smithy.api#required": {} } }, @@ -2953,7 +3028,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the health check request information.

" + "smithy.api#documentation": "

A complex type that contains the health check request information.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateHealthCheckResponse": { @@ -2976,7 +3052,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the new health check.

" + "smithy.api#documentation": "

A complex type containing the response information for the new health check.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateHostedZone": { @@ -3057,12 +3134,13 @@ "DelegationSetId": { "target": "com.amazonaws.route53#ResourceId", "traits": { - "smithy.api#documentation": "

If you want to associate a reusable delegation set with this hosted zone, the ID that\n\t\t\t\tAmazon Route 53 assigned to the reusable delegation set when you created it.\n\t\t\tFor more information about reusable delegation sets, see CreateReusableDelegationSet.

" + "smithy.api#documentation": "

If you want to associate a reusable delegation set with this hosted zone, the ID that\n\t\t\t\tAmazon Route 53 assigned to the reusable delegation set when you created it.\n\t\t\tFor more information about reusable delegation sets, see CreateReusableDelegationSet.

\n

If you are using a reusable delegation set to create a public hosted zone for a subdomain,\n\t\t\tmake sure that the parent hosted zone doesn't use one or more of the same name servers.\n\t\t\tIf you have overlapping nameservers, the operation will cause a\n\t\t\t\tConflictingDomainsExist error.

" } } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a public or\n\t\t\tprivate hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a public or\n\t\t\tprivate hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateHostedZoneResponse": { @@ -3105,7 +3183,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the hosted zone.

" + "smithy.api#documentation": "

A complex type containing the response information for the hosted zone.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateKeySigningKey": { @@ -3195,6 +3274,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateKeySigningKeyResponse": { @@ -3221,6 +3303,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateQueryLoggingConfig": { @@ -3277,6 +3362,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateQueryLoggingConfigResponse": { @@ -3297,6 +3385,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateReusableDelegationSet": { @@ -3355,6 +3446,9 @@ "smithy.api#documentation": "

If you want to mark the delegation set for an existing hosted zone as reusable, the ID\n\t\t\tfor that hosted zone.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateReusableDelegationSetResponse": { @@ -3375,6 +3469,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicy": { @@ -3434,7 +3531,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates resource record sets in a specified hosted zone based on the settings in a\n\t\t\tspecified traffic policy version. In addition, CreateTrafficPolicyInstance\n\t\t\tassociates the resource record sets with a specified domain name (such as example.com)\n\t\t\tor subdomain name (such as www.example.com). Amazon Route 53 responds to DNS queries for\n\t\t\tthe domain or subdomain name by using the resource record sets that\n\t\t\t\tCreateTrafficPolicyInstance created.

", + "smithy.api#documentation": "

Creates resource record sets in a specified hosted zone based on the settings in a\n\t\t\tspecified traffic policy version. In addition, CreateTrafficPolicyInstance\n\t\t\tassociates the resource record sets with a specified domain name (such as example.com)\n\t\t\tor subdomain name (such as www.example.com). Amazon Route 53 responds to DNS queries for\n\t\t\tthe domain or subdomain name by using the resource record sets that\n\t\t\t\tCreateTrafficPolicyInstance created.

\n \n

After you submit an CreateTrafficPolicyInstance request, there's a\n\t\t\t\tbrief delay while Amazon Route 53 creates the resource record sets that are\n\t\t\t\tspecified in the traffic policy definition. \n\t\t\t\tUse GetTrafficPolicyInstance with the id of new traffic policy instance to confirm that the CreateTrafficPolicyInstance\n\t\t\t\trequest completed successfully. For more information, see the\n\t\t\t\tState response element.

\n
", "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/trafficpolicyinstance", @@ -3482,7 +3579,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto create based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto create based on a specified traffic policy.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyInstanceResponse": { @@ -3505,7 +3603,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyInstance request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyInstance request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicyRequest": { @@ -3533,7 +3632,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyResponse": { @@ -3556,7 +3656,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicy request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicy request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateTrafficPolicyVersion": { @@ -3619,7 +3720,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate a new version for.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tcreate a new version for.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateTrafficPolicyVersionResponse": { @@ -3642,7 +3744,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyVersion request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the\n\t\t\t\tCreateTrafficPolicyVersion request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#CreateVPCAssociationAuthorization": { @@ -3699,7 +3802,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to authorize associating a\n\t\t\tVPC with your private hosted zone. Authorization is only required when a private hosted\n\t\t\tzone and a VPC were created by using different accounts.

" + "smithy.api#documentation": "

A complex type that contains information about the request to authorize associating a\n\t\t\tVPC with your private hosted zone. Authorization is only required when a private hosted\n\t\t\tzone and a VPC were created by using different accounts.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#CreateVPCAssociationAuthorizationResponse": { @@ -3721,7 +3825,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information from a\n\t\t\t\tCreateVPCAssociationAuthorization request.

" + "smithy.api#documentation": "

A complex type that contains the response information from a\n\t\t\t\tCreateVPCAssociationAuthorization request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DNSName": { @@ -3828,6 +3933,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeactivateKeySigningKeyResponse": { @@ -3839,6 +3947,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#DelegationSet": { @@ -4008,11 +4119,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteCidrCollectionResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.route53#DeleteHealthCheck": { "type": "operation", @@ -4055,14 +4172,16 @@ } }, "traits": { - "smithy.api#documentation": "

This action deletes a health check.

" + "smithy.api#documentation": "

This action deletes a health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteHealthCheckResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteHostedZone": { @@ -4112,7 +4231,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a hosted zone.

" + "smithy.api#documentation": "

A request to delete a hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteHostedZoneResponse": { @@ -4127,7 +4247,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a DeleteHostedZone\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a DeleteHostedZone\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteKeySigningKey": { @@ -4186,6 +4307,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteKeySigningKeyResponse": { @@ -4197,6 +4321,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteQueryLoggingConfig": { @@ -4238,11 +4365,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteQueryLoggingConfigResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.route53#DeleteReusableDelegationSet": { "type": "operation", @@ -4288,14 +4421,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a reusable delegation set.

" + "smithy.api#documentation": "

A request to delete a reusable delegation set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteReusableDelegationSetResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteTrafficPolicy": { @@ -4370,14 +4505,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a specified traffic policy instance.

" + "smithy.api#documentation": "

A request to delete a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyInstanceResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyRequest": { @@ -4401,14 +4538,16 @@ } }, "traits": { - "smithy.api#documentation": "

A request to delete a specified traffic policy version.

" + "smithy.api#documentation": "

A request to delete a specified traffic policy version.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteTrafficPolicyResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

An empty element.

" + "smithy.api#documentation": "

An empty element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#DeleteVPCAssociationAuthorization": { @@ -4465,14 +4604,16 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to remove authorization to\n\t\t\tassociate a VPC that was created by one Amazon Web Services account with a hosted zone\n\t\t\tthat was created with a different Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains information about the request to remove authorization to\n\t\t\tassociate a VPC that was created by one Amazon Web Services account with a hosted zone\n\t\t\tthat was created with a different Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DeleteVPCAssociationAuthorizationResponse": { "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty response for the request.

" + "smithy.api#documentation": "

Empty response for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Dimension": { @@ -4575,6 +4716,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#DisableHostedZoneDNSSECResponse": { @@ -4586,6 +4730,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#Disabled": { @@ -4654,7 +4801,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the VPC that you want to disassociate\n\t\t\tfrom a specified private hosted zone.

" + "smithy.api#documentation": "

A complex type that contains information about the VPC that you want to disassociate\n\t\t\tfrom a specified private hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#DisassociateVPCFromHostedZoneResponse": { @@ -4669,7 +4817,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the disassociate\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response information for the disassociate\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#EnableHostedZoneDNSSEC": { @@ -4729,6 +4878,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#EnableHostedZoneDNSSECResponse": { @@ -4740,6 +4892,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#EnableSNI": { @@ -4795,7 +4950,7 @@ "CountryCode": { "target": "com.amazonaws.route53#GeoLocationCountryCode", "traits": { - "smithy.api#documentation": "

For geolocation resource record sets, the two-letter code for a country.

\n

Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1\n\t\t\t\talpha-2.

" + "smithy.api#documentation": "

For geolocation resource record sets, the two-letter code for a country.

\n

Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1\n\t\t\t\talpha-2.

\n

Route 53 also supports the contry code UA forr Ukraine.

" } }, "SubdivisionCode": { @@ -4951,7 +5106,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetAccountLimitResponse": { @@ -4974,7 +5130,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetChange": { @@ -4994,7 +5151,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns the current status of a change batch request. The status is one of the\n\t\t\tfollowing values:

\n
    \n
  • \n

    \n PENDING indicates that the changes in this request have not\n\t\t\t\t\tpropagated to all Amazon Route 53 DNS servers. This is the initial status of all\n\t\t\t\t\tchange batch requests.

    \n
  • \n
  • \n

    \n INSYNC indicates that the changes have propagated to all Route 53\n\t\t\t\t\tDNS servers.

    \n
  • \n
", + "smithy.api#documentation": "

Returns the current status of a change batch request. The status is one of the\n\t\t\tfollowing values:

\n
    \n
  • \n

    \n PENDING indicates that the changes in this request have not\n\t\t\t\t\tpropagated to all Amazon Route 53 DNS servers managing the hosted zone. This is the initial status of all\n\t\t\t\t\tchange batch requests.

    \n
  • \n
  • \n

    \n INSYNC indicates that the changes have propagated to all Route 53\n\t\t\t\t\tDNS servers managing the hosted zone.

    \n
  • \n
", "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/change/{Id}", @@ -5032,7 +5189,8 @@ } }, "traits": { - "smithy.api#documentation": "

The input for a GetChange request.

" + "smithy.api#documentation": "

The input for a GetChange request.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetChangeResponse": { @@ -5047,7 +5205,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the ChangeInfo element.

" + "smithy.api#documentation": "

A complex type that contains the ChangeInfo element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetCheckerIpRanges": { @@ -5071,7 +5230,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Empty request.

" + "smithy.api#documentation": "

Empty request.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetCheckerIpRangesResponse": { @@ -5086,7 +5246,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the CheckerIpRanges element.

" + "smithy.api#documentation": "

A complex type that contains the CheckerIpRanges element.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetDNSSEC": { @@ -5128,6 +5289,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#GetDNSSECResponse": { @@ -5147,6 +5311,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#GetGeoLocation": { @@ -5187,7 +5354,7 @@ "CountryCode": { "target": "com.amazonaws.route53#GeoLocationCountryCode", "traits": { - "smithy.api#documentation": "

Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1\n\t\t\t\talpha-2.

", + "smithy.api#documentation": "

Amazon Route 53 uses the two-letter country codes that are specified in ISO standard 3166-1\n\t\t\t\talpha-2.

\n

Route 53 also supports the contry code UA forr Ukraine.

", "smithy.api#httpQuery": "countrycode" } }, @@ -5200,7 +5367,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for information about whether a specified geographic location is supported\n\t\t\tfor Amazon Route 53 geolocation resource record sets.

" + "smithy.api#documentation": "

A request for information about whether a specified geographic location is supported\n\t\t\tfor Amazon Route 53 geolocation resource record sets.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetGeoLocationResponse": { @@ -5215,7 +5383,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the specified geolocation\n\t\t\tcode.

" + "smithy.api#documentation": "

A complex type that contains the response information for the specified geolocation\n\t\t\tcode.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheck": { @@ -5267,7 +5436,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

A request for the number of health checks that are associated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request for the number of health checks that are associated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckCountResponse": { @@ -5282,7 +5452,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheckCount\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheckCount\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckLastFailureReason": { @@ -5323,7 +5494,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the reason that a health check failed most recently.

" + "smithy.api#documentation": "

A request for the reason that a health check failed most recently.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckLastFailureReasonResponse": { @@ -5338,7 +5510,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a\n\t\t\t\tGetHealthCheckLastFailureReason request.

" + "smithy.api#documentation": "

A complex type that contains the response to a\n\t\t\t\tGetHealthCheckLastFailureReason request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckRequest": { @@ -5354,7 +5527,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified health check.

" + "smithy.api#documentation": "

A request to get information about a specified health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckResponse": { @@ -5369,7 +5543,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHealthCheckStatus": { @@ -5410,7 +5585,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get the status for a health check.

" + "smithy.api#documentation": "

A request to get the status for a health check.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHealthCheckStatusResponse": { @@ -5425,7 +5601,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZone": { @@ -5446,6 +5623,34 @@ ], "traits": { "smithy.api#documentation": "

Gets information about a specified hosted zone including the four name servers\n\t\t\tassigned to the hosted zone.

", + "smithy.api#examples": [ + { + "title": "To get information about a hosted zone", + "documentation": "The following example gets information about the Z3M3LMPEXAMPLE hosted zone.", + "input": { + "Id": "Z3M3LMPEXAMPLE" + }, + "output": { + "HostedZone": { + "ResourceRecordSetCount": 8, + "CallerReference": "C741617D-04E4-F8DE-B9D7-0D150FC61C2E", + "Config": { + "PrivateZone": false + }, + "Id": "/hostedzone/Z3M3LMPEXAMPLE", + "Name": "myawsbucket.com." + }, + "DelegationSet": { + "NameServers": [ + "ns-2048.awsdns-64.com", + "ns-2049.awsdns-65.net", + "ns-2050.awsdns-66.org", + "ns-2051.awsdns-67.co.uk" + ] + } + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/hostedzone/{Id}", @@ -5479,7 +5684,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

A request to retrieve a count of all the hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a count of all the hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneCountResponse": { @@ -5494,7 +5700,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a GetHostedZoneCount\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a GetHostedZoneCount\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZoneLimit": { @@ -5546,7 +5753,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneLimitResponse": { @@ -5569,7 +5777,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetHostedZoneRequest": { @@ -5585,7 +5794,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified hosted zone.

" + "smithy.api#documentation": "

A request to get information about a specified hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetHostedZoneResponse": { @@ -5612,7 +5822,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contain the response to a GetHostedZone\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contain the response to a GetHostedZone\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetQueryLoggingConfig": { @@ -5651,6 +5862,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#GetQueryLoggingConfigResponse": { @@ -5663,6 +5877,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#GetReusableDelegationSet": { @@ -5739,7 +5956,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about the request to create a hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetReusableDelegationSetLimitResponse": { @@ -5762,7 +5980,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the requested limit.

" + "smithy.api#documentation": "

A complex type that contains the requested limit.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetReusableDelegationSetRequest": { @@ -5778,7 +5997,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about a specified reusable delegation set.

" + "smithy.api#documentation": "

A request to get information about a specified reusable delegation set.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetReusableDelegationSetResponse": { @@ -5793,7 +6013,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the GetReusableDelegationSet\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the GetReusableDelegationSet\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicy": { @@ -5838,7 +6059,7 @@ } ], "traits": { - "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

\n \n

After you submit a CreateTrafficPolicyInstance or an\n\t\t\t\t\tUpdateTrafficPolicyInstance request, there's a brief delay while\n\t\t\t\tAmazon Route 53 creates the resource record sets that are specified in the traffic\n\t\t\t\tpolicy definition. For more information, see the State response\n\t\t\t\telement.

\n
\n \n

In the Route 53 console, traffic policy instances are known as policy\n\t\t\t\trecords.

\n
", + "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

\n \n

\n\t\t\t\tUse GetTrafficPolicyInstance with the id of new traffic policy instance to confirm that the \n\t\t\t\tCreateTrafficPolicyInstance or an UpdateTrafficPolicyInstance request completed successfully. \n\t\t\t\tFor more information, see the State response\n\t\t\t\telement.

\n
\n \n

In the Route 53 console, traffic policy instances are known as policy\n\t\t\t\trecords.

\n
", "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/trafficpolicyinstance/{Id}", @@ -5867,7 +6088,8 @@ "type": "structure", "members": {}, "traits": { - "smithy.api#documentation": "

Request to get the number of traffic policy instances that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

Request to get the number of traffic policy instances that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceCountResponse": { @@ -5882,7 +6104,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceRequest": { @@ -5898,7 +6121,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

" + "smithy.api#documentation": "

Gets information about a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyInstanceResponse": { @@ -5913,7 +6137,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#GetTrafficPolicyRequest": { @@ -5937,7 +6162,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets information about a specific traffic policy version.

" + "smithy.api#documentation": "

Gets information about a specific traffic policy version.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#GetTrafficPolicyResponse": { @@ -5952,7 +6178,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#HealthCheck": { @@ -6475,7 +6702,6 @@ "Value": { "target": "com.amazonaws.route53#LimitValue", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The current value for the limit that is specified by Type.

", "smithy.api#required": {} } @@ -6630,6 +6856,17 @@ "smithy.api#documentation": "

In the response to a ListHostedZonesByVPC request, the\n\t\t\t\tHostedZoneSummaries element contains one HostedZoneSummary\n\t\t\telement for each hosted zone that the specified Amazon VPC is associated with. Each\n\t\t\t\tHostedZoneSummary element contains the hosted zone name and ID, and\n\t\t\tinformation about who owns the hosted zone.

" } }, + "com.amazonaws.route53#HostedZoneType": { + "type": "enum", + "members": { + "PRIVATE_HOSTED_ZONE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "PrivateHostedZone" + } + } + } + }, "com.amazonaws.route53#HostedZones": { "type": "list", "member": { @@ -7053,7 +7290,6 @@ "com.amazonaws.route53#LimitValue": { "type": "long", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1 } @@ -7160,6 +7396,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrBlocksResponse": { @@ -7177,6 +7416,9 @@ "smithy.api#documentation": "

A complex type that contains information about the CIDR blocks.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListCidrCollections": { @@ -7224,6 +7466,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrCollectionsResponse": { @@ -7241,6 +7486,9 @@ "smithy.api#documentation": "

A complex type with information about the CIDR collection.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListCidrLocations": { @@ -7299,6 +7547,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListCidrLocationsResponse": { @@ -7316,6 +7567,9 @@ "smithy.api#documentation": "

A complex type that contains information about the list of CIDR locations.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListGeoLocations": { @@ -7373,7 +7627,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get a list of geographic locations that Amazon Route 53 supports for\n\t\t\tgeolocation resource record sets.

" + "smithy.api#documentation": "

A request to get a list of geographic locations that Amazon Route 53 supports for\n\t\t\tgeolocation resource record sets.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListGeoLocationsResponse": { @@ -7421,7 +7676,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing the response information for the request.

" + "smithy.api#documentation": "

A complex type containing the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHealthChecks": { @@ -7468,13 +7724,14 @@ "MaxItems": { "target": "smithy.api#Integer", "traits": { - "smithy.api#documentation": "

The maximum number of health checks that you want ListHealthChecks to\n\t\t\treturn in response to the current request. Amazon Route 53 returns a maximum of 100\n\t\t\titems. If you set MaxItems to a value greater than 100, Route 53 returns\n\t\t\tonly the first 100 health checks.

", + "smithy.api#documentation": "

The maximum number of health checks that you want ListHealthChecks to\n\t\t\treturn in response to the current request. Amazon Route 53 returns a maximum of 1000\n\t\t\titems. If you set MaxItems to a value greater than 1000, Route 53 returns\n\t\t\tonly the first 1000 health checks.

", "smithy.api#httpQuery": "maxitems" } } }, "traits": { - "smithy.api#documentation": "

A request to retrieve a list of the health checks that are associated with the current\n\t\t\t\tAmazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a list of the health checks that are associated with the current\n\t\t\t\tAmazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHealthChecksResponse": { @@ -7517,7 +7774,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a ListHealthChecks\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to a ListHealthChecks\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZones": { @@ -7605,7 +7863,8 @@ } }, "traits": { - "smithy.api#documentation": "

Retrieves a list of the public and private hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account in ASCII order by domain name.

" + "smithy.api#documentation": "

Retrieves a list of the public and private hosted zones that are associated with the\n\t\t\tcurrent Amazon Web Services account in ASCII order by domain name.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesByNameResponse": { @@ -7659,7 +7918,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZonesByVPC": { @@ -7722,7 +7982,8 @@ } }, "traits": { - "smithy.api#documentation": "

Lists all the private hosted zones that a specified VPC is associated with, regardless\n\t\t\tof which Amazon Web Services account created the hosted zones.

" + "smithy.api#documentation": "

Lists all the private hosted zones that a specified VPC is associated with, regardless\n\t\t\tof which Amazon Web Services account created the hosted zones.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesByVPCResponse": { @@ -7748,6 +8009,9 @@ "smithy.api#documentation": "

The value that you will use for NextToken in the next\n\t\t\t\tListHostedZonesByVPC request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListHostedZonesRequest": { @@ -7773,10 +8037,18 @@ "smithy.api#documentation": "

If you're using reusable delegation sets and you want to list all of the hosted zones\n\t\t\tthat are associated with a reusable delegation set, specify the ID of that reusable\n\t\t\tdelegation set.

", "smithy.api#httpQuery": "delegationsetid" } + }, + "HostedZoneType": { + "target": "com.amazonaws.route53#HostedZoneType", + "traits": { + "smithy.api#documentation": "

\n\t\t\t(Optional) Specifies if the hosted zone is private.\n\t\t

", + "smithy.api#httpQuery": "hostedzonetype" + } } }, "traits": { - "smithy.api#documentation": "

A request to retrieve a list of the public and private hosted zones that are\n\t\t\tassociated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request to retrieve a list of the public and private hosted zones that are\n\t\t\tassociated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListHostedZonesResponse": { @@ -7817,6 +8089,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListQueryLoggingConfigs": { @@ -7877,6 +8152,9 @@ "smithy.api#httpQuery": "maxresults" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.route53#ListQueryLoggingConfigsResponse": { @@ -7895,6 +8173,9 @@ "smithy.api#documentation": "

If a response includes the last of the query logging configurations that are\n\t\t\tassociated with the current Amazon Web Services account, NextToken doesn't\n\t\t\tappear in the response.

\n

If a response doesn't include the last of the configurations, you can get more\n\t\t\tconfigurations by submitting another ListQueryLoggingConfigs request. Get the value of NextToken\n\t\t\tthat Amazon Route 53 returned in the previous response and include it in\n\t\t\t\tNextToken in the next request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.route53#ListResourceRecordSets": { @@ -7963,7 +8244,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the resource record sets that are associated with a specified hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A request for the resource record sets that are associated with a specified hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListResourceRecordSetsResponse": { @@ -8011,7 +8293,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains list information for the resource record set.

" + "smithy.api#documentation": "

A complex type that contains list information for the resource record set.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListReusableDelegationSets": { @@ -8055,7 +8338,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get a list of the reusable delegation sets that are associated with the\n\t\t\tcurrent Amazon Web Services account.

" + "smithy.api#documentation": "

A request to get a list of the reusable delegation sets that are associated with the\n\t\t\tcurrent Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListReusableDelegationSetsResponse": { @@ -8098,7 +8382,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the reusable delegation sets that are\n\t\t\tassociated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains information about the reusable delegation sets that are\n\t\t\tassociated with the current Amazon Web Services account.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTagsForResource": { @@ -8156,7 +8441,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing information about a request for a list of the tags that are\n\t\t\tassociated with an individual resource.

" + "smithy.api#documentation": "

A complex type containing information about a request for a list of the tags that are\n\t\t\tassociated with an individual resource.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTagsForResourceResponse": { @@ -8171,7 +8457,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

" + "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTagsForResources": { @@ -8228,7 +8515,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

" + "smithy.api#documentation": "

A complex type that contains information about the health checks or hosted zones for\n\t\t\twhich you want to list tags.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTagsForResourcesResponse": { @@ -8243,7 +8531,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type containing tags for the specified resources.

" + "smithy.api#documentation": "

A complex type containing tags for the specified resources.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicies": { @@ -8287,7 +8576,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list the traffic\n\t\t\tpolicies that are associated with the current Amazon Web Services account.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list the traffic\n\t\t\tpolicies that are associated with the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPoliciesResponse": { @@ -8324,7 +8614,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstances": { @@ -8414,7 +8705,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request for the traffic policy instances that you created in a specified hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A request for the traffic policy instances that you created in a specified hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZoneResponse": { @@ -8456,7 +8748,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByPolicy": { @@ -8536,7 +8829,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicy instances.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicy instances.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesByPolicyResponse": { @@ -8584,7 +8878,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesRequest": { @@ -8620,7 +8915,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to get information about the traffic policy instances that you created by\n\t\t\tusing the current Amazon Web Services account.

" + "smithy.api#documentation": "

A request to get information about the traffic policy instances that you created by\n\t\t\tusing the current Amazon Web Services account.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyInstancesResponse": { @@ -8668,7 +8964,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListTrafficPolicyVersions": { @@ -8723,7 +9020,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicies.

" + "smithy.api#documentation": "

A complex type that contains the information about the request to list your traffic\n\t\t\tpolicies.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListTrafficPolicyVersionsResponse": { @@ -8760,7 +9058,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#ListVPCAssociationAuthorizations": { @@ -8818,7 +9117,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about that can be associated with your hosted\n\t\t\tzone.

" + "smithy.api#documentation": "

A complex type that contains information about that can be associated with your hosted\n\t\t\tzone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#ListVPCAssociationAuthorizationsResponse": { @@ -8846,7 +9146,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the request.

" + "smithy.api#documentation": "

A complex type that contains the response information for the request.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#LocationSummaries": { @@ -9744,6 +10045,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { @@ -9842,7 +10149,6 @@ "Value": { "target": "com.amazonaws.route53#LimitValue", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The current value for the MAX_ZONES_BY_REUSABLE_DELEGATION_SET\n\t\t\tlimit.

", "smithy.api#required": {} } @@ -10147,7 +10453,7 @@ } ], "traits": { - "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

\n

This call only supports querying public hosted zones.

", + "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

\n

This call only supports querying public hosted zones.

\n \n

The TestDnsAnswer returns information similar to what you would expect from the answer\n\t\t\tsection of the dig command. Therefore, if you query for the name\n\t\t\tservers of a subdomain that point to the parent name servers, those will not be\n\t\t\treturned.

\n
", "smithy.api#http": { "method": "GET", "uri": "/2013-04-01/testdnsanswer", @@ -10205,7 +10511,8 @@ } }, "traits": { - "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

" + "smithy.api#documentation": "

Gets the value that Amazon Route 53 returns in response to a DNS request for a\n\t\t\tspecified record name and type. You can optionally specify the IP address of a DNS\n\t\t\tresolver, an EDNS0 client subnet IP address, and a subnet mask.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#TestDNSAnswerResponse": { @@ -10255,7 +10562,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to a TestDNSAnswer request.\n\t\t

" + "smithy.api#documentation": "

A complex type that contains the response to a TestDNSAnswer request.\n\t\t

", + "smithy.api#output": {} } }, "com.amazonaws.route53#Threshold": { @@ -10834,7 +11142,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about a request to update a health\n\t\t\tcheck.

" + "smithy.api#documentation": "

A complex type that contains information about a request to update a health\n\t\t\tcheck.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateHealthCheckResponse": { @@ -10849,7 +11158,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the UpdateHealthCheck\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the UpdateHealthCheck\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateHostedZoneComment": { @@ -10899,7 +11209,8 @@ } }, "traits": { - "smithy.api#documentation": "

A request to update the comment for a hosted zone.

" + "smithy.api#documentation": "

A request to update the comment for a hosted zone.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateHostedZoneCommentResponse": { @@ -10914,7 +11225,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response to the UpdateHostedZoneComment\n\t\t\trequest.

" + "smithy.api#documentation": "

A complex type that contains the response to the UpdateHostedZoneComment\n\t\t\trequest.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyComment": { @@ -10973,7 +11285,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tupdate the comment for.

" + "smithy.api#documentation": "

A complex type that contains information about the traffic policy that you want to\n\t\t\tupdate the comment for.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyCommentResponse": { @@ -10988,7 +11301,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains the response information for the traffic policy.

" + "smithy.api#documentation": "

A complex type that contains the response information for the traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyInstance": { @@ -11017,7 +11331,7 @@ } ], "traits": { - "smithy.api#documentation": "

Updates the resource record sets in a specified hosted zone that were created based on\n\t\t\tthe settings in a specified traffic policy version.

\n

When you update a traffic policy instance, Amazon Route 53 continues to respond to DNS\n\t\t\tqueries for the root resource record set name (such as example.com) while it replaces\n\t\t\tone group of resource record sets with another. Route 53 performs the following\n\t\t\toperations:

\n
    \n
  1. \n

    Route 53 creates a new group of resource record sets based on the specified\n\t\t\t\t\ttraffic policy. This is true regardless of how significant the differences are\n\t\t\t\t\tbetween the existing resource record sets and the new resource record sets.\n\t\t\t\t

    \n
  2. \n
  3. \n

    When all of the new resource record sets have been created, Route 53 starts to\n\t\t\t\t\trespond to DNS queries for the root resource record set name (such as\n\t\t\t\t\texample.com) by using the new resource record sets.

    \n
  4. \n
  5. \n

    Route 53 deletes the old group of resource record sets that are associated\n\t\t\t\t\twith the root resource record set name.

    \n
  6. \n
", + "smithy.api#documentation": "\n

After you submit a UpdateTrafficPolicyInstance request, there's a brief delay while Route 53 creates the resource record sets \n\t\t\tthat are specified in the traffic policy definition. Use GetTrafficPolicyInstance with the id of updated traffic policy instance confirm \n\t\t\tthat the \n\t\t\tUpdateTrafficPolicyInstance request completed successfully. For more information, see the State response element.

\n
\n

Updates the resource record sets in a specified hosted zone that were created based on\n\t\t\tthe settings in a specified traffic policy version.

\n

When you update a traffic policy instance, Amazon Route 53 continues to respond to DNS\n\t\t\tqueries for the root resource record set name (such as example.com) while it replaces\n\t\t\tone group of resource record sets with another. Route 53 performs the following\n\t\t\toperations:

\n
    \n
  1. \n

    Route 53 creates a new group of resource record sets based on the specified\n\t\t\t\t\ttraffic policy. This is true regardless of how significant the differences are\n\t\t\t\t\tbetween the existing resource record sets and the new resource record sets.\n\t\t\t\t

    \n
  2. \n
  3. \n

    When all of the new resource record sets have been created, Route 53 starts to\n\t\t\t\t\trespond to DNS queries for the root resource record set name (such as\n\t\t\t\t\texample.com) by using the new resource record sets.

    \n
  4. \n
  5. \n

    Route 53 deletes the old group of resource record sets that are associated\n\t\t\t\t\twith the root resource record set name.

    \n
  6. \n
", "smithy.api#http": { "method": "POST", "uri": "/2013-04-01/trafficpolicyinstance/{Id}", @@ -11059,7 +11373,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto update based on a specified traffic policy instance.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that you want\n\t\t\tto update based on a specified traffic policy instance.

", + "smithy.api#input": {} } }, "com.amazonaws.route53#UpdateTrafficPolicyInstanceResponse": { @@ -11074,7 +11389,8 @@ } }, "traits": { - "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

" + "smithy.api#documentation": "

A complex type that contains information about the resource record sets that Amazon\n\t\t\tRoute 53 created based on a specified traffic policy.

", + "smithy.api#output": {} } }, "com.amazonaws.route53#UsageCount": { @@ -11345,6 +11661,12 @@ "traits": { "smithy.api#enumValue": "ap-southeast-4" } + }, + "il_central_1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "il-central-1" + } } }, "traits": { diff --git a/aws/sdk/aws-models/s3-tests.smithy b/aws/sdk/aws-models/s3-tests.smithy index 6e934ecfda4..5a1bfaccca7 100644 --- a/aws/sdk/aws-models/s3-tests.smithy +++ b/aws/sdk/aws-models/s3-tests.smithy @@ -8,7 +8,7 @@ use smithy.test#httpRequestTests apply NotFound @httpResponseTests([ { id: "HeadObjectEmptyBody", - documentation: "This test case validates https://github.com/awslabs/smithy-rs/issues/456", + documentation: "This test case validates https://github.com/smithy-lang/smithy-rs/issues/456", params: { }, bodyMediaType: "application/xml", @@ -235,3 +235,27 @@ apply HeadObject @httpRequestTests([ } } ]) + +apply GetObject @httpRequestTests([ + { + id: "GetObjectIfModifiedSince", + documentation: "https://github.com/awslabs/aws-sdk-rust/issues/818", + + method: "GET", + protocol: "aws.protocols#restXml", + uri: "/object.txt", + headers: { "if-modified-since": "Fri, 16 Jul 2021 16:20:53 GMT" } + params: { + Bucket: "test-bucket", + Key: "object.txt" + IfModifiedSince: 1626452453.123, + }, + vendorParams: { + "endpointParams": { + "builtInParams": { + "AWS::Region": "us-east-1" + } + } + } + } +]) diff --git a/aws/sdk/aws-models/s3.json b/aws/sdk/aws-models/s3.json index f0227a4af82..f119125dd9e 100644 --- a/aws/sdk/aws-models/s3.json +++ b/aws/sdk/aws-models/s3.json @@ -44,7 +44,7 @@ } }, "traits": { - "smithy.api#documentation": "

Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 will\n wait before permanently removing all parts of the upload. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration in the\n Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 will\n wait before permanently removing all parts of the upload. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration in\n the Amazon S3 User Guide.

" } }, "com.amazonaws.s3#AbortMultipartUpload": { @@ -101,7 +101,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name to which the upload was taking place.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name to which the upload was taking place.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -595,7 +595,8 @@ }, "ForcePathStyle": { "builtIn": "AWS::S3::ForcePathStyle", - "required": false, + "required": true, + "default": false, "documentation": "When true, force a path-style endpoint to be used where the bucket name is part of the path.", "type": "Boolean" }, @@ -639,100 +640,357 @@ }, "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "type": "tree", "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "Accelerate cannot be used with FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ], + "error": "Cannot set dual-stack in combination with a custom endpoint.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "A custom endpoint cannot be combined with FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "A custom endpoint cannot be combined with S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, { "conditions": [ { "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 49, + 50, + true + ], + "assign": "hardwareType" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 8, + 12, + true + ], + "assign": "regionPrefix" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 0, + 7, + true + ], + "assign": "bucketAliasSuffix" + }, + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 32, + 49, + true + ], + "assign": "outpostId" + }, + { + "fn": "aws.partition", "argv": [ { "ref": "Region" } + ], + "assign": "regionPartition" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "bucketAliasSuffix" + }, + "--op-s3" ] } ], "type": "tree", "rules": [ { - "conditions": [], + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "outpostId" + }, + false + ] + } + ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "Bucket" - } + "ref": "hardwareType" + }, + "e" ] - }, + } + ], + "type": "tree", + "rules": [ { - "fn": "substring", - "argv": [ + "conditions": [ { - "ref": "Bucket" - }, - 49, - 50, - true + "fn": "stringEquals", + "argv": [ + { + "ref": "regionPrefix" + }, + "beta" + ] + } ], - "assign": "hardwareType" - }, - { - "fn": "substring", - "argv": [ + "type": "tree", + "rules": [ { - "ref": "Bucket" + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + } + ], + "error": "Expected a endpoint to be specified but no endpoint was found", + "type": "error" }, - 8, - 12, - true - ], - "assign": "regionPrefix" - }, - { - "fn": "substring", - "argv": [ { - "ref": "Bucket" - }, - 0, - 7, - true - ], - "assign": "abbaSuffix" + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "https://{Bucket}.ec2.{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] }, { - "fn": "substring", - "argv": [ - { - "ref": "Bucket" + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.ec2.s3-outposts.{Region}.{regionPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] }, - 32, - 49, - true - ], - "assign": "outpostId" - }, - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "regionPartition" - }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ { "fn": "stringEquals", "argv": [ { - "ref": "abbaSuffix" + "ref": "hardwareType" }, - "--op-s3" + "o" ] } ], @@ -741,11085 +999,3187 @@ { "conditions": [ { - "fn": "isValidHostLabel", + "fn": "stringEquals", "argv": [ { - "ref": "outpostId" + "ref": "regionPrefix" }, - false + "beta" ] } ], "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "stringEquals", + "fn": "isSet", "argv": [ { - "ref": "hardwareType" - }, - "e" + "ref": "Endpoint" + } ] } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "regionPrefix" - }, - "beta" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } - ], - "error": "Expected a endpoint to be specified but no endpoint was found", - "type": "error" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{Bucket}.ec2.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, + ] + } + ], + "error": "Expected a endpoint to be specified but no endpoint was found", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.ec2.s3-outposts.{Region}.{regionPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "Endpoint" } ] }, { - "conditions": [ + "fn": "parseURL", + "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "hardwareType" - }, - "o" - ] + "ref": "Endpoint" } ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "regionPrefix" - }, - "beta" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } - ], - "error": "Expected a endpoint to be specified but no endpoint was found", - "type": "error" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{Bucket}.op-{outpostId}.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, + "assign": "url" + } + ], + "endpoint": { + "url": "https://{Bucket}.op-{outpostId}.{url#authority}", + "properties": { + "authSchemes": [ { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.op-{outpostId}.s3-outposts.{Region}.{regionPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" } ] }, - { - "conditions": [], - "error": "Unrecognized hardware type: \"Expected hardware type o or e but got {hardwareType}\"", - "type": "error" - } - ] + "headers": {} + }, + "type": "endpoint" } ] }, { "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" + "endpoint": { + "url": "https://{Bucket}.op-{outpostId}.s3-outposts.{Region}.{regionPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } ] }, { - "conditions": [ + "conditions": [], + "error": "Unrecognized hardware type: \"Expected hardware type o or e but got {hardwareType}\"", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "not", + "argv": [ { "fn": "isSet", "argv": [ { - "ref": "Bucket" + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ] } ] } + ] + } + ], + "error": "Custom endpoint `{Endpoint}` was not a valid URI", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "aws.isVirtualHostableS3Bucket", + "argv": [ + { + "ref": "Bucket" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } ], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "not", + "fn": "isValidHostLabel", "argv": [ { - "fn": "isSet", - "argv": [ - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - } + "ref": "Region" + }, + false ] } ], - "error": "Custom endpoint `{Endpoint}` was not a valid URI", - "type": "error" - }, - { - "conditions": [], "type": "tree", "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "booleanEquals", "argv": [ { - "ref": "ForcePathStyle" - } + "ref": "Accelerate" + }, + true ] }, { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ { - "ref": "ForcePathStyle" + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] }, - true + "aws-cn" ] } ], - "type": "tree", - "rules": [ + "error": "S3 Accelerate cannot be used in this region", + "type": "error" + }, + { + "conditions": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ] + "ref": "Endpoint" } - ], - "error": "Path-style addressing cannot be used with ARN buckets", - "type": "error" + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [ + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ { - "fn": "uriEncode", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "uri_encoded_bucket" + "ref": "Endpoint" } - ], - "type": "tree", - "rules": [ + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "Cannot set dual-stack in combination with a custom endpoint.", - "type": "error" + "ref": "Region" }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Path-style addressing cannot be used with S3 Accelerate", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [ - { - "fn": "aws.isVirtualHostableS3Bucket", - "argv": [ - { - "ref": "Bucket" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "Accelerate cannot be used with FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "S3 Accelerate cannot be used in this region", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "isIp" - ] - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "url" - }, - "scheme" - ] - }, - "http" - ] - }, - { - "fn": "aws.isVirtualHostableS3Bucket", - "argv": [ - { - "ref": "Bucket" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "bucketArn" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[0]" - ], - "assign": "arnType" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3-object-lambda" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "accessPointName" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "accessPointName" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "DisableAccessPoints" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableAccessPoints" - }, - true - ] - } - ], - "error": "Access points are not supported for this operation", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ] - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - "" - ] - } - ], - "error": "Invalid ARN: Missing account id", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: bucket ARN is missing a region", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "accessPointName" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "accessPointName" - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "DisableAccessPoints" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableAccessPoints" - }, - true - ] - } - ], - "error": "Access points are not supported for this operation", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ] - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "{partitionResult#name}" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "Access Points do not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "DualStack cannot be combined with a Host override (PrivateLink)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: bucket ARN is missing a region", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "accessPointName" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 MRAP does not support dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 MRAP does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 MRAP does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "DisableMultiRegionAccessPoints" - }, - true - ] - } - ], - "error": "Invalid configuration: Multi-Region Access Point ARNs are disabled.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "mrapPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "mrapPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "partition" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}.accesspoint.s3-global.{mrapPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4a", - "signingName": "s3", - "signingRegionSet": [ - "*" - ] - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{mrapPartition#name}` but bucket referred to partition `{bucketArn#partition}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "{Region} was not a valid region", - "type": "error" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid Access Point Name", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] - }, - "s3-outposts" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Outposts does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 Outposts does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Outposts does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[4]" - ] - } - ] - } - ], - "error": "Invalid Arn: Outpost Access Point ARN contains sub resources", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[1]" - ], - "assign": "outpostId" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "outpostId" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseArnRegion" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseArnRegion" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - "{Region}" - ] - } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - } - ], - "assign": "bucketPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[3]" - ], - "assign": "accessPointName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.s3-outposts.{bucketArn#region}.{bucketPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Expected an outpost type `accesspoint`, found {outpostType}", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected an access point name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Could not load partition for ARN region {bucketArn#region}", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: No ARN type specified", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "substring", - "argv": [ - { - "ref": "Bucket" - }, - 0, - 4, - false - ], - "assign": "arnPrefix" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnPrefix" - }, - "arn:" - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "fn": "aws.parseArn", - "argv": [ - { - "ref": "Bucket" - } - ] - } - ] - } - ] - } - ], - "error": "Invalid ARN: `{Bucket}` was not a valid ARN", - "type": "error" - }, - { - "conditions": [ - { - "fn": "uriEncode", - "argv": [ - { - "ref": "Bucket" - } - ], - "assign": "uri_encoded_bucket" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ], - "error": "Cannot set dual-stack in combination with a custom endpoint.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Path-style addressing cannot be used with S3 Accelerate", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "UseObjectLambdaEndpoint" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseObjectLambdaEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support Dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "Accelerate" - }, - true - ] - } - ], - "error": "S3 Object Lambda does not support S3 Accelerate", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-object-lambda-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-object-lambda.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-object-lambda", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" - } - ] - }, - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Bucket" - } - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "scheme" + ] + }, + "http" + ] + }, + { + "fn": "aws.isVirtualHostableS3Bucket", + "argv": [ + { + "ref": "Bucket" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{Bucket}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + false + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "bucketArn" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[0]" + ], + "assign": "arnType" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-object-lambda" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "accessPointName" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "accessPointName" }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "UseDualStack" }, + true + ] + } + ], + "error": "S3 Object Lambda does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "Accelerate" }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, + true + ] + } + ], + "error": "S3 Object Lambda does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseGlobalEndpoint" + "ref": "bucketArn" }, - true + "region" ] - } - ], - "type": "tree", - "rules": [ + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ { - "conditions": [], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "ref": "DisableAccessPoints" } ] }, { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, + "fn": "booleanEquals", + "argv": [ { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] + "ref": "DisableAccessPoints" }, + true + ] + } + ], + "error": "Access points are not supported for this operation", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "fn": "not", + "fn": "isSet", "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "bucketArn" }, - "aws-global" + "resourceId[2]" ] } ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] } - ], - "endpoint": { - "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, { "fn": "isSet", "argv": [ { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" + "ref": "UseArnRegion" } ] }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "ref": "UseArnRegion" }, false ] }, { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", + "fn": "not", "argv": [ { - "ref": "Endpoint" + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" + ] } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" ] } ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" }, { "conditions": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { - "ref": "Endpoint" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] } - ] - }, + ], + "assign": "bucketPartition" + } + ], + "type": "tree", + "rules": [ { - "fn": "parseURL", - "argv": [ + "conditions": [ { - "ref": "Endpoint" + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" } ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ + "type": "tree", + "rules": [ { - "fn": "stringEquals", - "argv": [ + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + } + ] + } + ], + "type": "tree", + "rules": [ { - "ref": "Region" + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + "" + ] + } + ], + "error": "Invalid ARN: Missing account id", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" + } + ] }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" + "conditions": [], + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" } ] }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ { - "ref": "Endpoint" + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] - }, + } + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: bucket ARN is missing a region", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "accessPointName" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "accessPointName" + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" + "ref": "bucketArn" }, + "region" + ] + }, + "" + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "fn": "not", + "fn": "stringEquals", "argv": [ { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "bucketArn" }, - "aws-global" + "region" ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" }, - false + "" ] } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "type": "tree", + "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "isSet", "argv": [ { - "ref": "UseFIPS" - }, - false + "ref": "DisableAccessPoints" + } ] }, { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "ref": "DisableAccessPoints" }, true ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Access points are not supported for this operation", + "type": "error" }, { "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, { "fn": "not", "argv": [ @@ -11827,801 +4187,1020 @@ "fn": "isSet", "argv": [ { - "ref": "Endpoint" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[2]" + ] } ] } ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } ], - "endpoint": { - "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, + "type": "tree", + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { "fn": "isSet", "argv": [ { - "ref": "Endpoint" + "ref": "UseArnRegion" } ] - } - ] - }, - { - "fn": "not", - "argv": [ + }, { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" + "ref": "UseArnRegion" }, - "aws-global" + false ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ + { + "fn": "not", + "argv": [ { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" + ] } ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] + } + ], + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" }, { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { - "ref": "Endpoint" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + } + ], + "assign": "bucketPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketPartition" + }, + "name" + ] + }, + "{partitionResult#name}" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "Access Points do not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] } ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] + "conditions": [], + "error": "Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.", + "type": "error" + } + ] + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "accessPointName" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" }, + true + ] + } + ], + "error": "S3 MRAP does not support dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 MRAP does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 MRAP does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "DisableMultiRegionAccessPoints" + }, + true + ] + } + ], + "error": "Invalid configuration: Multi-Region Access Point ARNs are disabled.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "mrapPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "mrapPartition" }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } + "name" ] }, { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseGlobalEndpoint" + "ref": "bucketArn" }, - false + "partition" ] } - ], + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", + "url": "https://{accessPointName}.accesspoint.s3-global.{mrapPartition#dnsSuffix}", "properties": { "authSchemes": [ { "disableDoubleEncoding": true, - "name": "sigv4", + "name": "sigv4a", "signingName": "s3", - "signingRegion": "{Region}" + "signingRegionSet": [ + "*" + ] } ] }, "headers": {} }, "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Client was configured for partition `{mrapPartition#name}` but bucket referred to partition `{bucketArn#partition}`", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [], + "error": "Invalid Access Point Name", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-outposts" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Outposts does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 Outposts does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 Outposts does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[4]" + ] + } + ] + } + ], + "error": "Invalid Arn: Outpost Access Point ARN contains sub resources", + "type": "error" + }, + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "outpostId" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseArnRegion" }, + false + ] + }, + { + "fn": "not", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, + "fn": "stringEquals", + "argv": [ { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ { - "ref": "UseDualStack" + "ref": "bucketArn" }, - false + "region" ] }, + "{Region}" + ] + } + ] + } + ], + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", + "type": "error" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "fn": "getAttr", + "argv": [ { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] + "ref": "bucketArn" }, + "region" + ] + } + ], + "assign": "bucketPartition" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] + "ref": "Region" } ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ { "conditions": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ { - "ref": "UseDualStack" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketPartition" + }, + "name" + ] }, - false - ] - }, - { - "fn": "not", - "argv": [ { - "fn": "isSet", + "fn": "getAttr", "argv": [ { - "ref": "Endpoint" - } + "ref": "partitionResult" + }, + "name" ] } ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] } ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, + "type": "tree", + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "isSet", + "fn": "isValidHostLabel", "argv": [ { - "ref": "Endpoint" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[2]" + ], + "assign": "outpostType" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[3]" + ], + "assign": "accessPointName" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "outpostType" + }, + "accesspoint" + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{accessPointName}-{bucketArn#accountId}.{outpostId}.s3-outposts.{bucketArn#region}.{bucketPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Expected an outpost type `accesspoint`, found {outpostType}", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: expected an access point name", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Expected a 4-component resource", + "type": "error" } ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "us-east-1" - ] + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" } - ], - "endpoint": { - "url": "https://s3.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + ] }, { "conditions": [], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", + "type": "error" } ] }, { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "Region" - }, - "aws-global" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseGlobalEndpoint" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`", + "type": "error" } ] } @@ -12630,31 +5209,2638 @@ ] }, { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" + "conditions": [], + "error": "Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId}`", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: The Outpost Id was not set", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})", + "type": "error" + } + ] + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ] + }, + { + "conditions": [ + { + "fn": "substring", + "argv": [ + { + "ref": "Bucket" + }, + 0, + 4, + false + ], + "assign": "arnPrefix" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "arnPrefix" + }, + "arn:" + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ] + } + ] + } + ], + "error": "Invalid ARN: `{Bucket}` was not a valid ARN", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "ForcePathStyle" + }, + true + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ], + "error": "Path-style addressing cannot be used with ARN buckets", + "type": "error" + }, + { + "conditions": [ + { + "fn": "uriEncode", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "uri_encoded_bucket" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + false + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Path-style addressing cannot be used with S3 Accelerate", + "type": "error" + } + ] + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseObjectLambdaEndpoint" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseObjectLambdaEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Object Lambda does not support Dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "Accelerate" + }, + true + ] + } + ], + "error": "S3 Object Lambda does not support S3 Accelerate", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-object-lambda-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-object-lambda.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-object-lambda", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ] + } + ] + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + } + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3-fips.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + true + ] + } + ], + "type": "tree", + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "us-east-1" + ] + } + ], + "endpoint": { + "url": "https://s3.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ] + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseGlobalEndpoint" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } ] - } - ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" + }, + "headers": {} + }, + "type": "endpoint" } ] + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" } ] } ] - }, - { - "conditions": [], - "error": "A region must be set when sending requests to S3.", - "type": "error" } ] + }, + { + "conditions": [], + "error": "A region must be set when sending requests to S3.", + "type": "error" } ] }, @@ -12941,7 +8127,7 @@ { "documentation": "SDK::Host + access point + Dualstack is an error", "expect": { - "error": "DualStack cannot be combined with a Host override (PrivateLink)" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -12963,7 +8149,6 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": true, "UseFIPS": false } @@ -13600,10 +8785,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13640,10 +8823,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-east-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -13682,10 +8863,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-east-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -15289,21 +10468,9 @@ } }, { - "documentation": "non-bucket endpoint with FIPS: TODO(descriptive)", + "documentation": "non-bucket endpoint override with FIPS = error", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-west-2", @@ -15313,21 +10480,9 @@ } }, { - "documentation": "FIPS + dualstack + custom endpoint TODO(descriptive)", + "documentation": "FIPS + dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-west-2", @@ -15337,21 +10492,9 @@ } }, { - "documentation": "dualstack + custom endpoint TODO(descriptive)", + "documentation": "dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-west-2", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://beta.example.com:1234/path" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-west-2", @@ -15616,19 +10759,7 @@ { "documentation": "endpoint override + FIPS + dualstack (BUG)", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15642,19 +10773,7 @@ { "documentation": "endpoint override + non-dns bucket + FIPS (BUG)", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15744,19 +10863,7 @@ { "documentation": "URI encoded bucket + use global endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "https://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15875,19 +10982,7 @@ { "documentation": "endpoint override + non-uri safe endpoint + force path style", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -15927,21 +11022,9 @@ } }, { - "documentation": "endpoint override + FIPS + dualstack (this is wrong—it's a bug in the UseGlobalEndpoint branch)", + "documentation": "endpoint override + FIPS + dualstack", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-east-1", @@ -15954,19 +11037,7 @@ { "documentation": "non-bucket endpoint override + dualstack + global endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "us-east-1", @@ -15979,19 +11050,7 @@ { "documentation": "Endpoint override + UseGlobalEndpoint + us-east-1", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true, - "signingRegion": "us-east-1" - } - ] - }, - "url": "http://foo.com" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "us-east-1", @@ -16010,8 +11069,7 @@ "Region": "cn-north-1", "UseFIPS": true, "UseDualStack": false, - "UseGlobalEndpoint": true, - "Endpoint": "http://foo.com" + "UseGlobalEndpoint": true } }, { @@ -16113,21 +11171,9 @@ } }, { - "documentation": "aws-global + fips + custom endpoint (TODO: should be an error)", + "documentation": "aws-global + fips + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16165,21 +11211,9 @@ } }, { - "documentation": "aws-global + dualstack + custom endpoint (TODO: should be an error)", + "documentation": "aws-global + dualstack + custom endpoint", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "aws-global", @@ -16215,7 +11249,7 @@ } }, { - "documentation": "FIPS + aws-global + path only bucket. TODO: this should be an error", + "documentation": "FIPS + aws-global + path only bucket. This is not supported by S3 but we allow garbage in garbage out", "expect": { "endpoint": { "properties": { @@ -16241,21 +11275,9 @@ } }, { - "documentation": "aws-global + FIPS + endpoint override. TODO: should this be an error?", + "documentation": "aws-global + FIPS + endpoint override.", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16264,21 +11286,9 @@ } }, { - "documentation": "force path style, aws-global & endpoint override", + "documentation": "force path style, FIPS, aws-global & endpoint override", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com/bucket%21" - } + "error": "A custom endpoint cannot be combined with FIPS" }, "params": { "Region": "aws-global", @@ -16314,19 +11324,7 @@ { "documentation": "endpoint override with aws-global region", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingRegion": "us-east-1", - "name": "sigv4", - "signingName": "s3", - "disableDoubleEncoding": true - } - ] - }, - "url": "http://foo.com" - } + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "params": { "Region": "aws-global", @@ -16683,8 +11681,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16723,8 +11720,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16764,8 +11760,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16804,8 +11799,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16844,8 +11838,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -16885,8 +11878,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -16914,8 +11906,7 @@ "ForcePathStyle": false, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -16953,8 +11944,7 @@ "ForcePathStyle": false, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -16993,8 +11983,7 @@ "ForcePathStyle": false, "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17060,8 +12049,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17100,8 +12088,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17141,8 +12128,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17181,8 +12167,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17221,8 +12206,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -17262,8 +12246,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -17291,8 +12274,7 @@ "ForcePathStyle": false, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -17331,8 +12313,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17399,8 +12380,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17440,8 +12420,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17467,10 +12446,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17509,8 +12486,7 @@ "ForcePathStyle": true, "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17547,8 +12523,7 @@ "Bucket": "99a_b", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17587,26 +12562,13 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "path style + fips@cn-north-1", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "signingName": "s3", - "signingRegion": "cn-north-1", - "disableDoubleEncoding": true, - "name": "sigv4" - } - ] - }, - "url": "https://s3-fips.cn-north-1.amazonaws.com.cn/bucket-name" - } + "error": "Partition does not support FIPS" }, "operationInputs": [ { @@ -17656,8 +12618,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17697,8 +12658,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17724,10 +12684,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17766,8 +12724,7 @@ "ForcePathStyle": true, "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17804,8 +12761,7 @@ "Bucket": "99a_b", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17844,8 +12800,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17913,8 +12868,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17954,8 +12908,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -17981,10 +12934,8 @@ "Bucket": "arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket", "ForcePathStyle": true, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18023,8 +12974,7 @@ "ForcePathStyle": true, "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18061,8 +13011,7 @@ "Bucket": "99a_b", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18102,8 +13051,7 @@ "Endpoint": "http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18144,14 +13092,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::Host + FIPS@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with FIPS" }, "operationInputs": [ { @@ -18174,14 +13121,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { "documentation": "SDK::Host + DualStack@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18204,14 +13150,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::HOST + accelerate@us-west-2", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "operationInputs": [ { @@ -18234,8 +13179,7 @@ "Endpoint": "http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "us-west-2", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18274,10 +13218,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18317,8 +13259,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18359,12 +13300,11 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { - "documentation": "SDK::Host + FIPS@cn-north-1", + "documentation": "FIPS@cn-north-1", "expect": { "error": "Partition does not support FIPS" }, @@ -18372,7 +13312,6 @@ "Accelerate": false, "Bucket": "bucket-name", "ForcePathStyle": false, - "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": false, "UseFIPS": true @@ -18381,7 +13320,7 @@ { "documentation": "SDK::Host + DualStack@cn-north-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18404,14 +13343,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "cn-north-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::HOST + accelerate@cn-north-1", "expect": { - "error": "S3 Accelerate cannot be used in this region" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "params": { "Accelerate": true, @@ -18459,10 +13397,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18502,8 +13438,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18544,14 +13479,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::Host + FIPS@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with FIPS" }, "operationInputs": [ { @@ -18574,14 +13508,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { "documentation": "SDK::Host + DualStack@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "Cannot set dual-stack in combination with a custom endpoint." }, "operationInputs": [ { @@ -18604,14 +13537,13 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": true, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { "documentation": "SDK::HOST + accelerate@af-south-1", "expect": { - "error": "Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate" + "error": "A custom endpoint cannot be combined with S3 Accelerate" }, "operationInputs": [ { @@ -18634,8 +13566,7 @@ "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", "Region": "af-south-1", "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18674,10 +13605,8 @@ "ForcePathStyle": false, "Endpoint": "https://beta.example.com", "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18714,10 +13643,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18755,10 +13682,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -18784,10 +13709,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18826,10 +13749,8 @@ "Bucket": "arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -18866,10 +13787,8 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18882,7 +13801,6 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, "UseFIPS": true } @@ -18910,10 +13828,8 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -18926,7 +13842,6 @@ "Bucket": "arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "cn-north-1", - "RequiresAccountId": true, "UseDualStack": true, "UseFIPS": true } @@ -18965,10 +13880,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19006,10 +13919,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -19035,10 +13946,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19077,10 +13986,8 @@ "Bucket": "arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint", "ForcePathStyle": false, "Region": "af-south-1", - "RequiresAccountId": true, "UseDualStack": true, - "UseFIPS": true, - "___key": "key" + "UseFIPS": true } }, { @@ -19183,10 +14090,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19215,10 +14120,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19257,10 +14160,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19297,10 +14198,8 @@ "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "ForcePathStyle": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -19327,10 +14226,8 @@ "ForcePathStyle": false, "UseArnRegion": true, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -20078,10 +14975,8 @@ "ForcePathStyle": false, "UseArnRegion": false, "Region": "us-west-2", - "RequiresAccountId": true, "UseDualStack": false, - "UseFIPS": false, - "___key": "key" + "UseFIPS": false } }, { @@ -20326,7 +15221,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Prod us-west-1", + "documentation": "S3 Outposts bucketAlias Real Outpost Prod us-west-1", "expect": { "endpoint": { "properties": { @@ -20351,7 +15246,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Prod ap-east-1", + "documentation": "S3 Outposts bucketAlias Real Outpost Prod ap-east-1", "expect": { "endpoint": { "properties": { @@ -20376,7 +15271,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Prod us-east-1", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Prod us-east-1", "expect": { "endpoint": { "properties": { @@ -20401,7 +15296,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Prod me-south-1", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Prod me-south-1", "expect": { "endpoint": { "properties": { @@ -20426,7 +15321,7 @@ } }, { - "documentation": "S3 Outposts Abba Real Outpost Beta", + "documentation": "S3 Outposts bucketAlias Real Outpost Beta", "expect": { "endpoint": { "properties": { @@ -20452,7 +15347,7 @@ } }, { - "documentation": "S3 Outposts Abba Ec2 Outpost Beta", + "documentation": "S3 Outposts bucketAlias Ec2 Outpost Beta", "expect": { "endpoint": { "properties": { @@ -20478,7 +15373,7 @@ } }, { - "documentation": "S3 Outposts Abba - No endpoint set for beta", + "documentation": "S3 Outposts bucketAlias - No endpoint set for beta", "expect": { "error": "Expected a endpoint to be specified but no endpoint was found" }, @@ -20491,7 +15386,7 @@ } }, { - "documentation": "S3 Outposts Abba Invalid hardware type", + "documentation": "S3 Outposts bucketAlias Invalid hardware type", "expect": { "error": "Unrecognized hardware type: \"Expected hardware type o or e but got h\"" }, @@ -20504,7 +15399,7 @@ } }, { - "documentation": "S3 Outposts Abba Special character in Outpost Arn", + "documentation": "S3 Outposts bucketAlias Special character in Outpost Arn", "expect": { "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`." }, @@ -20517,7 +15412,7 @@ } }, { - "documentation": "S3 Outposts Abba - No endpoint set for beta", + "documentation": "S3 Outposts bucketAlias - No endpoint set for beta", "expect": { "error": "Expected a endpoint to be specified but no endpoint was found" }, @@ -21065,6 +15960,18 @@ "traits": { "smithy.api#enumValue": "us-west-2" } + }, + "ap_south_2": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ap-south-2" + } + }, + "eu_south_2": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "eu-south-2" + } } } }, @@ -21450,7 +16357,7 @@ "target": "com.amazonaws.s3#CompleteMultipartUploadOutput" }, "traits": { - "smithy.api#documentation": "

Completes a multipart upload by assembling previously uploaded parts.

\n

You first initiate the multipart upload and then upload all parts using the UploadPart\n operation. After successfully uploading all relevant parts of an upload, you call this\n action to complete the upload. Upon receiving this request, Amazon S3 concatenates all the\n parts in ascending order by part number to create a new object. In the Complete Multipart\n Upload request, you must provide the parts list. You must ensure that the parts list is\n complete. This action concatenates the parts that you provide in the list. For each part in\n the list, you must provide the part number and the ETag value, returned after\n that part was uploaded.

\n

Processing of a Complete Multipart Upload request could take several minutes to\n complete. After Amazon S3 begins processing the request, it sends an HTTP response header that\n specifies a 200 OK response. While processing is in progress, Amazon S3 periodically sends white\n space characters to keep the connection from timing out. A request could fail after the\n initial 200 OK response has been sent. This means that a 200 OK response can\n contain either a success or an error. If you call the S3 API directly, make sure to design\n your application to parse the contents of the response and handle it appropriately. If you\n use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the embedded error and apply\n error handling per your configuration settings (including automatically retrying the\n request as appropriate). If the condition persists, the SDKs throws an exception (or, for\n the SDKs that don't use exceptions, they return the error).

\n

Note that if CompleteMultipartUpload fails, applications should be prepared\n to retry the failed requests. For more information, see Amazon S3 Error Best\n Practices.

\n \n

You cannot use Content-Type: application/x-www-form-urlencoded with\n Complete Multipart Upload requests. Also, if you do not provide a\n Content-Type header, CompleteMultipartUpload returns a 200\n OK response.

\n
\n

For more information about multipart uploads, see Uploading Objects Using Multipart\n Upload.

\n

For information about permissions required to use the multipart upload API, see Multipart Upload\n and Permissions.

\n

\n CompleteMultipartUpload has the following special errors:

\n
    \n
  • \n

    Error code: EntityTooSmall\n

    \n
      \n
    • \n

      Description: Your proposed upload is smaller than the minimum allowed object\n size. Each part must be at least 5 MB in size, except the last part.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPart\n

    \n
      \n
    • \n

      Description: One or more of the specified parts could not be found. The part\n might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPartOrder\n

    \n
      \n
    • \n

      Description: The list of parts was not in ascending order. The parts list\n must be specified in order by part number.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: NoSuchUpload\n

    \n
      \n
    • \n

      Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or\n completed.

      \n
    • \n
    • \n

      404 Not Found

      \n
    • \n
    \n
  • \n
\n

The following operations are related to CompleteMultipartUpload:

\n ", + "smithy.api#documentation": "

Completes a multipart upload by assembling previously uploaded parts.

\n

You first initiate the multipart upload and then upload all parts using the UploadPart\n operation. After successfully uploading all relevant parts of an upload, you call this\n action to complete the upload. Upon receiving this request, Amazon S3 concatenates all the parts\n in ascending order by part number to create a new object. In the Complete Multipart Upload\n request, you must provide the parts list. You must ensure that the parts list is complete.\n This action concatenates the parts that you provide in the list. For each part in the list,\n you must provide the part number and the ETag value, returned after that part\n was uploaded.

\n

Processing of a Complete Multipart Upload request could take several minutes to\n complete. After Amazon S3 begins processing the request, it sends an HTTP response header that\n specifies a 200 OK response. While processing is in progress, Amazon S3 periodically sends white\n space characters to keep the connection from timing out. A request could fail after the\n initial 200 OK response has been sent. This means that a 200 OK response can\n contain either a success or an error. If you call the S3 API directly, make sure to design\n your application to parse the contents of the response and handle it appropriately. If you\n use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the embedded error and apply\n error handling per your configuration settings (including automatically retrying the\n request as appropriate). If the condition persists, the SDKs throws an exception (or, for\n the SDKs that don't use exceptions, they return the error).

\n

Note that if CompleteMultipartUpload fails, applications should be prepared\n to retry the failed requests. For more information, see Amazon S3 Error Best\n Practices.

\n \n

You cannot use Content-Type: application/x-www-form-urlencoded with\n Complete Multipart Upload requests. Also, if you do not provide a\n Content-Type header, CompleteMultipartUpload returns a 200\n OK response.

\n
\n

For more information about multipart uploads, see Uploading Objects Using Multipart\n Upload.

\n

For information about permissions required to use the multipart upload API, see Multipart Upload\n and Permissions.

\n

\n CompleteMultipartUpload has the following special errors:

\n
    \n
  • \n

    Error code: EntityTooSmall\n

    \n
      \n
    • \n

      Description: Your proposed upload is smaller than the minimum allowed object\n size. Each part must be at least 5 MB in size, except the last part.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPart\n

    \n
      \n
    • \n

      Description: One or more of the specified parts could not be found. The part\n might not have been uploaded, or the specified entity tag might not have\n matched the part's entity tag.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InvalidPartOrder\n

    \n
      \n
    • \n

      Description: The list of parts was not in ascending order. The parts list\n must be specified in order by part number.

      \n
    • \n
    • \n

      400 Bad Request

      \n
    • \n
    \n
  • \n
  • \n

    Error code: NoSuchUpload\n

    \n
      \n
    • \n

      Description: The specified multipart upload does not exist. The upload ID\n might be invalid, or the multipart upload might have been aborted or\n completed.

      \n
    • \n
    • \n

      404 Not Found

      \n
    • \n
    \n
  • \n
\n

The following operations are related to CompleteMultipartUpload:

\n ", "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?x-id=CompleteMultipartUpload", @@ -21470,7 +16377,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket that contains the newly created object. Does not return the access point\n ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

The name of the bucket that contains the newly created object. Does not return the access point\n ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

" } }, "Key": { @@ -21563,7 +16470,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

Name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -21823,7 +16730,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. For pricing information, see Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify new metadata.\n However, the access control list (ACL) is not preserved and is set to private for the user making the request. To\n override the default ACL setting, specify a new ACL when generating a copy request. For\n more information, see Using ACLs.

\n

To specify whether you want the object metadata copied from the source object or\n replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you can use\n the s3:x-amz-metadata-directive condition key to enforce certain metadata\n behavior when objects are uploaded. For more information, see Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list of\n Amazon S3-specific condition keys, see Actions, Resources, and Condition Keys for\n Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and must be\n specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the Etag\n matches or whether the object was modified before or after a specified date, use the\n following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the request\n and evaluate as follows, Amazon S3 returns 200 OK and copies the data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the request and\n evaluate as follows, Amazon S3 returns the 412 Precondition Failed response\n code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket. When\n copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a different type\n of encryption setting for the target object, you can use other appropriate\n encryption-related headers to encrypt the target object with a KMS key, an Amazon S3 managed\n key, or a customer-provided key. With server-side encryption, Amazon S3 encrypts your data as it\n writes your data to disks in its data centers and decrypts the data when you access it. If the\n encryption setting in your request is different from the default encryption configuration\n of the destination bucket, the encryption setting in your request takes precedence. If the\n source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\n encryption information in your request so that Amazon S3 can decrypt the object for copying. For\n more information about server-side encryption, see Using Server-Side\n Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request\n Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based permissions.\n By default, all objects are private. Only the owner has full access control. When adding a\n new object, you can grant permissions to individual Amazon Web Services accounts or to predefined groups\n that are defined by Amazon S3. These permissions are then added to the ACL on the object. For more\n information, see Access Control List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced setting for\n S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that use\n this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to the new\n object by default. When you copy the object over, you can optionally specify a different\n checksum algorithm to use with the x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of an object\n that is already stored in Amazon S3 by using the StorageClass parameter. For more\n information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER, you must restore a copy of\n this object before you can use it as a source object for the copy operation. For\n more information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current version of an object\n to copy. If the current version is a delete marker, Amazon S3 behaves as if the object was\n deleted. To copy a different version, use the versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version ID for\n the object being copied. This version ID is different from the version ID of the source\n object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version ID that\n Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", + "smithy.api#documentation": "

Creates a copy of an object that is already stored in Amazon S3.

\n \n

You can store individual objects of up to 5 TB in Amazon S3. You create a copy of your\n object up to 5 GB in size in a single atomic action using this API. However, to copy an\n object greater than 5 GB, you must use the multipart upload Upload Part - Copy\n (UploadPartCopy) API. For more information, see Copy Object Using the\n REST Multipart Upload API.

\n
\n

All copy requests must be authenticated. Additionally, you must have\n read access to the source object and write\n access to the destination bucket. For more information, see REST Authentication. Both the\n Region that you want to copy the object from and the Region that you want to copy the\n object to must be enabled for your account.

\n

A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3\n is copying the files. If the error occurs before the copy action starts, you receive a\n standard Amazon S3 error. If the error occurs during the copy operation, the error response is\n embedded in the 200 OK response. This means that a 200 OK\n response can contain either a success or an error. If you call the S3 API directly, make\n sure to design your application to parse the contents of the response and handle it\n appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the\n embedded error and apply error handling per your configuration settings (including\n automatically retrying the request as appropriate). If the condition persists, the SDKs\n throws an exception (or, for the SDKs that don't use exceptions, they return the\n error).

\n

If the copy is successful, you receive a response with information about the copied\n object.

\n \n

If the request is an HTTP 1.1 request, the response is chunk encoded. If it were not,\n it would not contain the content-length, and you would need to read the entire\n body.

\n
\n

The copy request charge is based on the storage class and Region that you specify for\n the destination object. The request can also result in a data retrieval charge for the\n source if the source storage class bills for data retrieval. For pricing information, see\n Amazon S3 pricing.

\n \n

Amazon S3 transfer acceleration does not support cross-Region copies. If you request a\n cross-Region copy using a transfer acceleration endpoint, you get a 400 Bad\n Request error. For more information, see Transfer\n Acceleration.

\n
\n
\n
Metadata
\n
\n

When copying an object, you can preserve all metadata (the default) or specify\n new metadata. However, the access control list (ACL) is not preserved and is set\n to private for the user making the request. To override the default ACL setting,\n specify a new ACL when generating a copy request. For more information, see Using\n ACLs.

\n

To specify whether you want the object metadata copied from the source object\n or replaced with metadata provided in the request, you can optionally add the\n x-amz-metadata-directive header. When you grant permissions, you\n can use the s3:x-amz-metadata-directive condition key to enforce\n certain metadata behavior when objects are uploaded. For more information, see\n Specifying Conditions in a\n Policy in the Amazon S3 User Guide. For a complete list\n of Amazon S3-specific condition keys, see Actions, Resources, and Condition\n Keys for Amazon S3.

\n \n

\n x-amz-website-redirect-location is unique to each object and\n must be specified in the request headers to copy the value.

\n
\n
\n
x-amz-copy-source-if Headers
\n
\n

To only copy an object under certain conditions, such as whether the\n Etag matches or whether the object was modified before or after a\n specified date, use the following request parameters:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-none-match\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since\n

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since\n

    \n
  • \n
\n

If both the x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request and evaluate as follows, Amazon S3 returns 200 OK and copies the\n data:

\n
    \n
  • \n

    \n x-amz-copy-source-if-match condition evaluates to\n true

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false

    \n
  • \n
\n

If both the x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request and evaluate as follows, Amazon S3 returns the 412 Precondition\n Failed response code:

\n
    \n
  • \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false

    \n
  • \n
  • \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true

    \n
  • \n
\n \n

All headers with the x-amz- prefix, including\n x-amz-copy-source, must be signed.

\n
\n
\n
Server-side encryption
\n
\n

Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket.\n When copying an object, if you don't specify encryption information in your copy\n request, the encryption setting of the target object is set to the default\n encryption configuration of the destination bucket. By default, all buckets have a\n base level of encryption configuration that uses server-side encryption with Amazon S3\n managed keys (SSE-S3). If the destination bucket has a default encryption\n configuration that uses server-side encryption with Key Management Service (KMS) keys\n (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with customer-provided encryption keys (SSE-C), Amazon S3 uses\n the corresponding KMS key, or a customer-provided key to encrypt the target\n object copy.

\n

When you perform a CopyObject operation, if you want to use a\n different type of encryption setting for the target object, you can use other\n appropriate encryption-related headers to encrypt the target object with a\n KMS key, an Amazon S3 managed key, or a customer-provided key. With server-side\n encryption, Amazon S3 encrypts your data as it writes your data to disks in its data\n centers and decrypts the data when you access it. If the encryption setting in\n your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If\n the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the\n necessary encryption information in your request so that Amazon S3 can decrypt the\n object for copying. For more information about server-side encryption, see Using\n Server-Side Encryption.

\n

If a target object uses SSE-KMS, you can enable an S3 Bucket Key for the\n object. For more information, see Amazon S3 Bucket Keys in the\n Amazon S3 User Guide.

\n
\n
Access Control List (ACL)-Specific Request Headers
\n
\n

When copying an object, you can optionally use headers to grant ACL-based\n permissions. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups that are defined by Amazon S3. These permissions\n are then added to the ACL on the object. For more information, see Access Control\n List (ACL) Overview and Managing ACLs Using the REST\n API.

\n

If the bucket that you're copying objects to uses the bucket owner enforced\n setting for S3 Object Ownership, ACLs are disabled and no longer affect\n permissions. Buckets that use this setting only accept PUT requests\n that don't specify an ACL or PUT requests that specify bucket owner\n full control ACLs, such as the bucket-owner-full-control canned ACL\n or an equivalent form of this ACL expressed in the XML format.

\n

For more information, see Controlling\n ownership of objects and disabling ACLs in the\n Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership,\n all objects written to the bucket by any account will be owned by the bucket\n owner.

\n
\n
\n
Checksums
\n
\n

When copying an object, if it has a checksum, that checksum will be copied to\n the new object by default. When you copy the object over, you can optionally\n specify a different checksum algorithm to use with the\n x-amz-checksum-algorithm header.

\n
\n
Storage Class Options
\n
\n

You can use the CopyObject action to change the storage class of\n an object that is already stored in Amazon S3 by using the StorageClass\n parameter. For more information, see Storage Classes in\n the Amazon S3 User Guide.

\n

If the source object's storage class is GLACIER or\n DEEP_ARCHIVE, or the object's storage class is\n INTELLIGENT_TIERING and it's S3 Intelligent-Tiering access tier is\n Archive Access or Deep Archive Access, you must restore a copy of this object\n before you can use it as a source object for the copy operation. For more\n information, see RestoreObject. For\n more information, see Copying\n Objects.

\n
\n
Versioning
\n
\n

By default, x-amz-copy-source header identifies the current\n version of an object to copy. If the current version is a delete marker, Amazon S3\n behaves as if the object was deleted. To copy a different version, use the\n versionId subresource.

\n

If you enable versioning on the target bucket, Amazon S3 generates a unique version\n ID for the object being copied. This version ID is different from the version ID\n of the source object. Amazon S3 returns the version ID of the copied object in the\n x-amz-version-id response header in the response.

\n

If you do not enable versioning or suspend it on the target bucket, the version\n ID that Amazon S3 generates is always null.

\n
\n
\n

The following operations are related to CopyObject:

\n ", "smithy.api#examples": [ { "title": "To copy an object", @@ -21946,7 +16853,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the destination bucket.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the destination bucket.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -22106,7 +17013,7 @@ "StorageClass": { "target": "com.amazonaws.s3#StorageClass", "traits": { - "smithy.api#documentation": "

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

", + "smithy.api#documentation": "

If the x-amz-storage-class header is not used, the copied object will be stored in the\n STANDARD Storage Class by default. The STANDARD storage class provides high durability and\n high availability. Depending on performance needs, you can specify a different Storage\n Class. Amazon S3 on Outposts only uses the OUTPOSTS Storage Class. For more information, see\n Storage\n Classes in the Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-storage-class" } }, @@ -22141,7 +17048,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Specifies the KMS key ID to use for object encryption. All GET and PUT requests for an\n object protected by KMS will fail if they're not made via SSL or using SigV4. For\n information about configuring any of the officially supported Amazon Web Services SDKs and Amazon Web Services CLI, see\n Specifying the\n Signature Version in Request Authentication in the\n Amazon S3 User Guide.

", + "smithy.api#documentation": "

Specifies the KMS ID (Key ID, Key ARN, or Key Alias) to use for object encryption. All GET and PUT requests for an\n object protected by KMS will fail if they're not made via SSL or using SigV4. For\n information about configuring any of the officially supported Amazon Web Services SDKs and Amazon Web Services CLI, see\n Specifying the\n Signature Version in Request Authentication in the\n Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, @@ -22375,7 +17282,7 @@ } ], "traits": { - "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. You might choose a Region to optimize\n latency, minimize costs, or address regulatory requirements. For example, if you reside in\n Europe, you will probably find it advantageous to create buckets in the Europe (Ireland)\n Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature calculations in\n Signature Version 4 must use us-east-1 as the Region, even if the location constraint in\n the request specifies another Region where the bucket is to be created. If you create a\n bucket in a Region other than US East (N. Virginia), your application must be able to\n handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are required when\n your CreateBucket request includes specific headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your CreateBucket request\n specifies access control list (ACL) permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through any other\n ACL, both s3:CreateBucket and s3:PutBucketAcl permissions\n are needed. If the ACL for the CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.

    \n
  • \n
  • \n

    \n Object Lock - If ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your CreateBucket request includes the x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By default, ObjectOwnership is set to BucketOWnerEnforced and ACLs are disabled. We recommend keeping\n ACLs disabled, except in uncommon use cases where you must control access for each object individually. If you want to change the ObjectOwnership setting, you can use the \n x-amz-object-ownership header in your CreateBucket request to set the ObjectOwnership setting of your choice.\n For more information about S3 Object Ownership, see Controlling object\n ownership in the Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your specific use case requires granting public access to your S3 resources, you can disable Block Public Access. You can create a new bucket with Block Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all Block\n Public Access settings are enabled for new buckets. To avoid inadvertent exposure of\n your resources, we recommend keeping the S3 Block Public Access settings enabled. For more information about S3 Block Public Access, see Blocking public\n access to your Amazon S3 storage in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for Amazon S3 Object Ownership\n and specifies a bucket ACL that provides access to an external Amazon Web Services account, your request fails with a 400 error and returns the InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.

\n
\n

The following operations are related to CreateBucket:

\n ", + "smithy.api#documentation": "

Creates a new S3 bucket. To create a bucket, you must register with Amazon S3 and have a\n valid Amazon Web Services Access Key ID to authenticate requests. Anonymous requests are never allowed to\n create buckets. By creating the bucket, you become the bucket owner.

\n

Not every string is an acceptable bucket name. For information about bucket naming\n restrictions, see Bucket naming\n rules.

\n

If you want to create an Amazon S3 on Outposts bucket, see Create Bucket.

\n

By default, the bucket is created in the US East (N. Virginia) Region. You can\n optionally specify a Region in the request body. To constrain the bucket creation to a\n specific Region, you can use \n LocationConstraint\n condition key. You might choose a Region to\n optimize latency, minimize costs, or address regulatory requirements. For example, if you\n reside in Europe, you will probably find it advantageous to create buckets in the Europe\n (Ireland) Region. For more information, see Accessing a\n bucket.

\n \n

If you send your create bucket request to the s3.amazonaws.com endpoint,\n the request goes to the us-east-1 Region. Accordingly, the signature\n calculations in Signature Version 4 must use us-east-1 as the Region, even\n if the location constraint in the request specifies another Region where the bucket is\n to be created. If you create a bucket in a Region other than US East (N. Virginia), your\n application must be able to handle 307 redirect. For more information, see Virtual hosting of\n buckets.

\n
\n
\n
Permissions
\n
\n

In addition to s3:CreateBucket, the following permissions are\n required when your CreateBucket request includes specific\n headers:

\n
    \n
  • \n

    \n Access control lists (ACLs) - If your\n CreateBucket request specifies access control list (ACL)\n permissions and the ACL is public-read, public-read-write,\n authenticated-read, or if you specify access permissions explicitly through\n any other ACL, both s3:CreateBucket and\n s3:PutBucketAcl permissions are needed. If the ACL for the\n CreateBucket request is private or if the request doesn't\n specify any ACLs, only s3:CreateBucket permission is needed.\n

    \n
  • \n
  • \n

    \n Object Lock - If\n ObjectLockEnabledForBucket is set to true in your\n CreateBucket request,\n s3:PutBucketObjectLockConfiguration and\n s3:PutBucketVersioning permissions are required.

    \n
  • \n
  • \n

    \n S3 Object Ownership - If your\n CreateBucket request includes the\n x-amz-object-ownership header, then the\n s3:PutBucketOwnershipControls permission is required. By\n default, ObjectOwnership is set to\n BucketOWnerEnforced and ACLs are disabled. We recommend\n keeping ACLs disabled, except in uncommon use cases where you must control\n access for each object individually. If you want to change the\n ObjectOwnership setting, you can use the\n x-amz-object-ownership header in your\n CreateBucket request to set the ObjectOwnership\n setting of your choice. For more information about S3 Object Ownership, see\n Controlling\n object ownership in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    \n S3 Block Public Access - If your\n specific use case requires granting public access to your S3 resources, you\n can disable Block Public Access. You can create a new bucket with Block\n Public Access enabled, then separately call the \n DeletePublicAccessBlock\n API. To use this operation, you must have the\n s3:PutBucketPublicAccessBlock permission. By default, all\n Block Public Access settings are enabled for new buckets. To avoid\n inadvertent exposure of your resources, we recommend keeping the S3 Block\n Public Access settings enabled. For more information about S3 Block Public\n Access, see Blocking\n public access to your Amazon S3 storage in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
\n \n

If your CreateBucket request sets BucketOwnerEnforced for\n Amazon S3 Object Ownership and specifies a bucket ACL that provides access to an external\n Amazon Web Services account, your request fails with a 400 error and returns the\n InvalidBucketAcLWithObjectOwnership error code. For more information,\n see Setting Object\n Ownership on an existing bucket in the Amazon S3 User Guide.\n

\n
\n

The following operations are related to CreateBucket:

\n ", "smithy.api#examples": [ { "title": "To create a bucket ", @@ -22521,7 +17428,7 @@ "target": "com.amazonaws.s3#CreateMultipartUploadOutput" }, "traits": { - "smithy.api#documentation": "

This action initiates a multipart upload and returns an upload ID. This upload ID is\n used to associate all of the parts in the specific multipart upload. You specify this\n upload ID in each of your subsequent upload part requests (see UploadPart). You also include this\n upload ID in the final request to either complete or abort the multipart upload\n request.

\n

For more information about multipart uploads, see Multipart Upload Overview.

\n

If you have configured a lifecycle rule to abort incomplete multipart uploads, the\n upload must complete within the number of days specified in the bucket lifecycle\n configuration. Otherwise, the incomplete multipart upload becomes eligible for an abort\n action and Amazon S3 aborts the multipart upload. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

For information about the permissions required to use the multipart upload API, see\n Multipart\n Upload and Permissions.

\n

For request signing, multipart upload is just a series of regular requests. You initiate\n a multipart upload, send one or more requests to upload parts, and then complete the\n multipart upload process. You sign each request individually. There is nothing special\n about signing multipart upload requests. For more information about signing, see Authenticating Requests (Amazon Web Services Signature Version 4).

\n \n

After you initiate a multipart upload and upload one or more parts, to stop being\n charged for storing the uploaded parts, you must either complete or abort the multipart\n upload. Amazon S3 frees up the space used to store the parts and stop charging you for\n storing them only after you either complete or abort a multipart upload.

\n
\n

Server-side encryption is for data encryption at rest. Amazon S3 encrypts your data as it\n writes it to disks in its data centers and decrypts it when you access it. Amazon S3\n automatically encrypts all new objects that are uploaded to an S3 bucket. When doing a\n multipart upload, if you don't specify encryption information in your request, the\n encryption setting of the uploaded parts is set to the default encryption configuration of\n the destination bucket. By default, all buckets have a base level of encryption\n configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the\n destination bucket has a default encryption configuration that uses server-side encryption\n with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key (SSE-C),\n Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the uploaded\n parts. When you perform a CreateMultipartUpload operation, if you want to use a different\n type of encryption setting for the uploaded parts, you can request that Amazon S3 encrypts the\n object with a KMS key, an Amazon S3 managed key, or a customer-provided key. If the encryption\n setting in your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If you choose\n to provide your own encryption key, the request headers you provide in UploadPart\n and UploadPartCopy requests must match the headers you used in the request to\n initiate the upload by using CreateMultipartUpload. You can request that Amazon S3\n save the uploaded parts encrypted with server-side encryption with an Amazon S3 managed key\n (SSE-S3), an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key\n (SSE-C).

\n

To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the requester\n must have permission to the kms:Decrypt and kms:GenerateDataKey*\n actions on the key. These permissions are required because Amazon S3 must decrypt and read data\n from the encrypted file parts before it completes the multipart upload. For more\n information, see Multipart upload API\n and permissions and Protecting data using\n server-side encryption with Amazon Web Services KMS in the\n Amazon S3 User Guide.

\n

If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the KMS key,\n then you must have these permissions on the key policy. If your IAM user or role belongs\n to a different account than the key, then you must have the permissions on both the key\n policy and your IAM user or role.

\n

For more information, see Protecting Data Using Server-Side\n Encryption.

\n
\n
Access Permissions
\n
\n

When copying an object, you can optionally specify the accounts or groups that\n should be granted specific permissions on the new object. There are two ways to\n grant the permissions using the request headers:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. For\n more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. These parameters map to\n the set of permissions that Amazon S3 supports in an ACL. For more information,\n see Access Control List (ACL) Overview.

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Server-Side- Encryption-Specific Request Headers
\n
\n

Amazon S3 encrypts data\n by using server-side encryption with an Amazon S3 managed key (SSE-S3) by default. Server-side encryption is for data encryption at rest. Amazon S3 encrypts\n your data as it writes it to disks in its data centers and decrypts it when you\n access it. You can request that Amazon S3 encrypts\n data at rest by using server-side encryption with other key options. The option you use depends on\n whether you want to use KMS keys (SSE-KMS) or provide your own encryption keys\n (SSE-C).

\n
    \n
  • \n

    Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key\n (aws/s3) and KMS customer managed keys stored in Key Management Service (KMS) – If you\n want Amazon Web Services to manage the keys used to encrypt data, specify the following\n headers in the request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-aws-kms-key-id\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-context\n

      \n
    • \n
    \n \n

    If you specify x-amz-server-side-encryption:aws:kms, but\n don't provide x-amz-server-side-encryption-aws-kms-key-id,\n Amazon S3 uses the Amazon Web Services managed key (aws/s3 key) in KMS to\n protect the data.

    \n
    \n \n

    All GET and PUT requests for an object protected\n by KMS fail if you don't make them by using Secure Sockets Layer (SSL),\n Transport Layer Security (TLS), or Signature Version 4.

    \n
    \n

    For more information about server-side encryption with KMS keys\n (SSE-KMS), see Protecting Data\n Using Server-Side Encryption with KMS keys.

    \n
  • \n
  • \n

    Use customer-provided encryption keys (SSE-C) – If you want to manage\n your own encryption keys, provide all the following headers in the\n request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption-customer-algorithm\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key-MD5\n

      \n
    • \n
    \n

    For more information about server-side encryption with customer-provided\n encryption keys (SSE-C), see \n Protecting data using server-side encryption with customer-provided\n encryption keys (SSE-C).

    \n
  • \n
\n
\n
Access-Control-List (ACL)-Specific Request Headers
\n
\n

You also can use the following access control–related headers with this\n operation. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then\n added to the access control list (ACL) on the object. For more information, see\n Using ACLs. With this operation, you can grant access permissions\n using one of the following two methods:

\n
    \n
  • \n

    Specify a canned ACL (x-amz-acl) — Amazon S3 supports a set of\n predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly — To explicitly grant access\n permissions to specific Amazon Web Services accounts or groups, use the following headers.\n Each header maps to specific permissions that Amazon S3 supports in an ACL. For\n more information, see Access Control List (ACL)\n Overview. In the header, you specify a list of grantees who get\n the specific permission. To grant permissions explicitly, use:

    \n
      \n
    • \n

      \n x-amz-grant-read\n

      \n
    • \n
    • \n

      \n x-amz-grant-write\n

      \n
    • \n
    • \n

      \n x-amz-grant-read-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-write-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-full-control\n

      \n
    • \n
    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:

    \n

    \n x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" \n

    \n
  • \n
\n
\n
\n

The following operations are related to CreateMultipartUpload:

\n ", + "smithy.api#documentation": "

This action initiates a multipart upload and returns an upload ID. This upload ID is\n used to associate all of the parts in the specific multipart upload. You specify this\n upload ID in each of your subsequent upload part requests (see UploadPart). You also include this\n upload ID in the final request to either complete or abort the multipart upload\n request.

\n

For more information about multipart uploads, see Multipart Upload Overview.

\n

If you have configured a lifecycle rule to abort incomplete multipart uploads, the\n upload must complete within the number of days specified in the bucket lifecycle\n configuration. Otherwise, the incomplete multipart upload becomes eligible for an abort\n action and Amazon S3 aborts the multipart upload. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

For information about the permissions required to use the multipart upload API, see\n Multipart\n Upload and Permissions.

\n

For request signing, multipart upload is just a series of regular requests. You initiate\n a multipart upload, send one or more requests to upload parts, and then complete the\n multipart upload process. You sign each request individually. There is nothing special\n about signing multipart upload requests. For more information about signing, see Authenticating Requests (Amazon Web Services Signature Version 4).

\n \n

After you initiate a multipart upload and upload one or more parts, to stop being\n charged for storing the uploaded parts, you must either complete or abort the multipart\n upload. Amazon S3 frees up the space used to store the parts and stop charging you for\n storing them only after you either complete or abort a multipart upload.

\n
\n

Server-side encryption is for data encryption at rest. Amazon S3 encrypts your data as it\n writes it to disks in its data centers and decrypts it when you access it. Amazon S3\n automatically encrypts all new objects that are uploaded to an S3 bucket. When doing a\n multipart upload, if you don't specify encryption information in your request, the\n encryption setting of the uploaded parts is set to the default encryption configuration of\n the destination bucket. By default, all buckets have a base level of encryption\n configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the\n destination bucket has a default encryption configuration that uses server-side encryption\n with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key (SSE-C),\n Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the uploaded\n parts. When you perform a CreateMultipartUpload operation, if you want to use a different\n type of encryption setting for the uploaded parts, you can request that Amazon S3 encrypts the\n object with a KMS key, an Amazon S3 managed key, or a customer-provided key. If the encryption\n setting in your request is different from the default encryption configuration of the\n destination bucket, the encryption setting in your request takes precedence. If you choose\n to provide your own encryption key, the request headers you provide in UploadPart\n and UploadPartCopy requests must match the headers you used in the request to\n initiate the upload by using CreateMultipartUpload. You can request that Amazon S3\n save the uploaded parts encrypted with server-side encryption with an Amazon S3 managed key\n (SSE-S3), an Key Management Service (KMS) key (SSE-KMS), or a customer-provided encryption key\n (SSE-C).

\n

To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the requester\n must have permission to the kms:Decrypt and kms:GenerateDataKey*\n actions on the key. These permissions are required because Amazon S3 must decrypt and read data\n from the encrypted file parts before it completes the multipart upload. For more\n information, see Multipart upload API\n and permissions and Protecting data using\n server-side encryption with Amazon Web Services KMS in the\n Amazon S3 User Guide.

\n

If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the KMS key,\n then you must have these permissions on the key policy. If your IAM user or role belongs\n to a different account than the key, then you must have the permissions on both the key\n policy and your IAM user or role.

\n

For more information, see Protecting Data Using Server-Side\n Encryption.

\n
\n
Access Permissions
\n
\n

When copying an object, you can optionally specify the accounts or groups that\n should be granted specific permissions on the new object. There are two ways to\n grant the permissions using the request headers:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. For\n more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. These parameters map to\n the set of permissions that Amazon S3 supports in an ACL. For more information,\n see Access Control List (ACL) Overview.

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Server-Side- Encryption-Specific Request Headers
\n
\n

Amazon S3 encrypts data by using server-side encryption with an Amazon S3 managed key\n (SSE-S3) by default. Server-side encryption is for data encryption at rest. Amazon S3\n encrypts your data as it writes it to disks in its data centers and decrypts it\n when you access it. You can request that Amazon S3 encrypts data at rest by using\n server-side encryption with other key options. The option you use depends on\n whether you want to use KMS keys (SSE-KMS) or provide your own encryption keys\n (SSE-C).

\n
    \n
  • \n

    Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key\n (aws/s3) and KMS customer managed keys stored in Key Management Service (KMS) –\n If you want Amazon Web Services to manage the keys used to encrypt data, specify the\n following headers in the request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-aws-kms-key-id\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-context\n

      \n
    • \n
    \n \n

    If you specify x-amz-server-side-encryption:aws:kms, but\n don't provide x-amz-server-side-encryption-aws-kms-key-id,\n Amazon S3 uses the Amazon Web Services managed key (aws/s3 key) in KMS to\n protect the data.

    \n
    \n \n

    All GET and PUT requests for an object\n protected by KMS fail if you don't make them by using Secure Sockets\n Layer (SSL), Transport Layer Security (TLS), or Signature Version\n 4.

    \n
    \n

    For more information about server-side encryption with KMS keys\n (SSE-KMS), see Protecting Data\n Using Server-Side Encryption with KMS keys.

    \n
  • \n
  • \n

    Use customer-provided encryption keys (SSE-C) – If you want to manage\n your own encryption keys, provide all the following headers in the\n request.

    \n
      \n
    • \n

      \n x-amz-server-side-encryption-customer-algorithm\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key\n

      \n
    • \n
    • \n

      \n x-amz-server-side-encryption-customer-key-MD5\n

      \n
    • \n
    \n

    For more information about server-side encryption with customer-provided\n encryption keys (SSE-C), see \n Protecting data using server-side encryption with customer-provided\n encryption keys (SSE-C).

    \n
  • \n
\n
\n
Access-Control-List (ACL)-Specific Request Headers
\n
\n

You also can use the following access control–related headers with this\n operation. By default, all objects are private. Only the owner has full access\n control. When adding a new object, you can grant permissions to individual\n Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then\n added to the access control list (ACL) on the object. For more information, see\n Using ACLs. With this operation, you can grant access permissions\n using one of the following two methods:

\n
    \n
  • \n

    Specify a canned ACL (x-amz-acl) — Amazon S3 supports a set of\n predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly — To explicitly grant access\n permissions to specific Amazon Web Services accounts or groups, use the following headers.\n Each header maps to specific permissions that Amazon S3 supports in an ACL. For\n more information, see Access Control List (ACL)\n Overview. In the header, you specify a list of grantees who get\n the specific permission. To grant permissions explicitly, use:

    \n
      \n
    • \n

      \n x-amz-grant-read\n

      \n
    • \n
    • \n

      \n x-amz-grant-write\n

      \n
    • \n
    • \n

      \n x-amz-grant-read-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-write-acp\n

      \n
    • \n
    • \n

      \n x-amz-grant-full-control\n

      \n
    • \n
    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:

    \n

    \n x-amz-grant-read: id=\"11112222333\", id=\"444455556666\" \n

    \n
  • \n
\n
\n
\n

The following operations are related to CreateMultipartUpload:

\n ", "smithy.api#examples": [ { "title": "To initiate a multipart upload", @@ -22550,7 +17457,7 @@ "AbortDate": { "target": "com.amazonaws.s3#AbortDate", "traits": { - "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, the response includes this header. The header indicates when the initiated\n multipart upload becomes eligible for an abort operation. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

The response also includes the x-amz-abort-rule-id header that provides the\n ID of the lifecycle configuration rule that defines this action.

", + "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, the response includes this header. The header indicates when the initiated\n multipart upload becomes eligible for an abort operation. For more information, see \n Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

The response also includes the x-amz-abort-rule-id header that provides the\n ID of the lifecycle configuration rule that defines this action.

", "smithy.api#httpHeader": "x-amz-abort-date" } }, @@ -22564,7 +17471,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated. Does not return the\n access point ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated. Does not return the\n access point ARN or access point alias if used.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#xmlName": "Bucket" } }, @@ -22655,7 +17562,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which to initiate the upload

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which to initiate the upload

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -22793,7 +17700,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Specifies the ID of the symmetric encryption customer managed key to use for object encryption.\n All GET and PUT requests for an object protected by KMS will fail if they're not made via\n SSL or using SigV4. For information about configuring any of the officially supported Amazon Web Services\n SDKs and Amazon Web Services CLI, see Specifying the Signature Version in Request Authentication\n in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Specifies the ID (Key ID, Key ARN, or Key Alias) of the symmetric encryption customer managed key to use for object encryption.\n All GET and PUT requests for an object protected by KMS will fail if they're not made via\n SSL or using SigV4. For information about configuring any of the officially supported Amazon Web Services\n SDKs and Amazon Web Services CLI, see Specifying the Signature Version in Request Authentication\n in the Amazon S3 User Guide.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, @@ -23076,7 +17983,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the DELETE action resets the default encryption for the\n bucket as server-side encryption with Amazon S3 managed keys (SSE-S3). For information about the\n bucket default encryption feature, see Amazon S3 Bucket Default Encryption\n in the Amazon S3 User Guide.

\n

To use this operation, you must have permissions to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to DeleteBucketEncryption:

\n ", + "smithy.api#documentation": "

This implementation of the DELETE action resets the default encryption for the bucket as\n server-side encryption with Amazon S3 managed keys (SSE-S3). For information about the bucket\n default encryption feature, see Amazon S3 Bucket Default Encryption\n in the Amazon S3 User Guide.

\n

To use this operation, you must have permissions to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to DeleteBucketEncryption:

\n ", "smithy.api#http": { "method": "DELETE", "uri": "/{Bucket}?encryption", @@ -23360,7 +18267,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the DELETE action uses the policy subresource to delete the\n policy of a specified bucket. If you are using an identity other than the root user of the\n Amazon Web Services account that owns the bucket, the calling identity must have the\n DeleteBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account to use this operation.

\n

If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information about bucket policies, see Using Bucket Policies and\n UserPolicies.

\n

The following operations are related to DeleteBucketPolicy\n

\n ", + "smithy.api#documentation": "

This implementation of the DELETE action uses the policy subresource to delete the\n policy of a specified bucket. If you are using an identity other than the root user of the\n Amazon Web Services account that owns the bucket, the calling identity must have the\n DeleteBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account to use this operation.

\n

If you don't have DeleteBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

For more information about bucket policies, see Using Bucket Policies and\n UserPolicies.

\n

The following operations are related to DeleteBucketPolicy\n

\n ", "smithy.api#examples": [ { "title": "To delete bucket policy", @@ -23682,13 +18589,12 @@ "smithy.api#documentation": "

Removes the null version (if there is one) of an object and inserts a delete marker,\n which becomes the latest version of the object. If there isn't a null version, Amazon S3 does\n not remove any objects but will still respond that the command was successful.

\n

To remove a specific version, you must use the version Id subresource. Using this\n subresource permanently deletes the version. If the object deleted is a delete marker, Amazon S3\n sets the response header, x-amz-delete-marker, to true.

\n

If the object you want to delete is in a bucket where the bucket versioning\n configuration is MFA Delete enabled, you must include the x-amz-mfa request\n header in the DELETE versionId request. Requests that include\n x-amz-mfa must use HTTPS.

\n

For more information about MFA Delete, see Using MFA Delete. To see sample\n requests that use versioning, see Sample\n Request.

\n

You can delete objects by explicitly calling DELETE Object or configure its lifecycle\n (PutBucketLifecycle) to enable Amazon S3 to remove them for you. If you want to block\n users or accounts from removing or deleting objects from your bucket, you must deny them\n the s3:DeleteObject, s3:DeleteObjectVersion, and\n s3:PutLifeCycleConfiguration actions.

\n

The following action is related to DeleteObject:

\n ", "smithy.api#examples": [ { - "title": "To delete an object", - "documentation": "The following example deletes an object from an S3 bucket.", + "title": "To delete an object (from a non-versioned bucket)", + "documentation": "The following example deletes an object from a non-versioned bucket.", "input": { - "Bucket": "examplebucket", - "Key": "objectkey.jpg" - }, - "output": {} + "Bucket": "ExampleBucket", + "Key": "HappyFace.jpg" + } } ], "smithy.api#http": { @@ -23705,7 +18611,7 @@ "target": "com.amazonaws.s3#DeleteMarker", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether the versioned object that was permanently deleted was (true) or was\n not (false) a delete marker.

", + "smithy.api#documentation": "

Indicates whether the specified object version that was permanently deleted was (true) or was\n not (false) a delete marker before deletion. In a simple DELETE, this header indicates whether (true) or\n not (false) the current version of the object is a delete marker.

", "smithy.api#httpHeader": "x-amz-delete-marker" } }, @@ -23733,7 +18639,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -23841,7 +18747,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the objects from which to remove the tags.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the objects from which to remove the tags.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -23889,7 +18795,41 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

This action enables you to delete multiple objects from a bucket using a single HTTP\n request. If you know the object keys that you want to delete, then this action provides a\n suitable alternative to sending individual delete requests, reducing per-request\n overhead.

\n

The request contains a list of up to 1000 keys that you want to delete. In the XML, you\n provide the object key names, and optionally, version IDs if you want to delete a specific\n version of the object from a versioning-enabled bucket. For each key, Amazon S3 performs a\n delete action and returns the result of that delete, success, or failure, in the response.\n Note that if the object specified in the request is not found, Amazon S3 returns the result as\n deleted.

\n

The action supports two modes for the response: verbose and quiet. By default, the\n action uses verbose mode in which the response includes the result of deletion of each key\n in your request. In quiet mode the response includes only keys where the delete action\n encountered an error. For a successful deletion, the action does not return any information\n about the delete in the response body.

\n

When performing this action on an MFA Delete enabled bucket, that attempts to delete any\n versioned objects, you must include an MFA token. If you do not provide one, the entire\n request will fail, even if there are non-versioned objects you are trying to delete. If you\n provide an invalid token, whether there are versioned keys in the request or not, the\n entire Multi-Object Delete request will fail. For information about MFA Delete, see MFA\n Delete.

\n

Finally, the Content-MD5 header is required for all Multi-Object Delete requests. Amazon S3 uses the header value to ensure that your request body has not been altered in\n transit.

\n

The following operations are related to DeleteObjects:

\n ", + "smithy.api#documentation": "

This action enables you to delete multiple objects from a bucket using a single HTTP\n request. If you know the object keys that you want to delete, then this action provides a\n suitable alternative to sending individual delete requests, reducing per-request\n overhead.

\n

The request contains a list of up to 1000 keys that you want to delete. In the XML, you\n provide the object key names, and optionally, version IDs if you want to delete a specific\n version of the object from a versioning-enabled bucket. For each key, Amazon S3 performs a\n delete action and returns the result of that delete, success, or failure, in the response.\n Note that if the object specified in the request is not found, Amazon S3 returns the result as\n deleted.

\n

The action supports two modes for the response: verbose and quiet. By default, the\n action uses verbose mode in which the response includes the result of deletion of each key\n in your request. In quiet mode the response includes only keys where the delete action\n encountered an error. For a successful deletion, the action does not return any information\n about the delete in the response body.

\n

When performing this action on an MFA Delete enabled bucket, that attempts to delete any\n versioned objects, you must include an MFA token. If you do not provide one, the entire\n request will fail, even if there are non-versioned objects you are trying to delete. If you\n provide an invalid token, whether there are versioned keys in the request or not, the\n entire Multi-Object Delete request will fail. For information about MFA Delete, see MFA\n Delete.

\n

Finally, the Content-MD5 header is required for all Multi-Object Delete requests. Amazon S3\n uses the header value to ensure that your request body has not been altered in\n transit.

\n

The following operations are related to DeleteObjects:

\n ", + "smithy.api#examples": [ + { + "title": "To delete multiple object versions from a versioned bucket", + "documentation": "The following example deletes objects from a bucket. The request specifies object versions. S3 deletes specific object versions and returns the key and versions of deleted objects in the response.", + "input": { + "Bucket": "examplebucket", + "Delete": { + "Objects": [ + { + "Key": "HappyFace.jpg", + "VersionId": "2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b" + }, + { + "Key": "HappyFace.jpg", + "VersionId": "yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd" + } + ], + "Quiet": false + } + }, + "output": { + "Deleted": [ + { + "VersionId": "yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd", + "Key": "HappyFace.jpg" + }, + { + "VersionId": "2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b", + "Key": "HappyFace.jpg" + } + ] + } + } + ], "smithy.api#http": { "method": "POST", "uri": "/{Bucket}?delete&x-id=DeleteObjects", @@ -23933,7 +18873,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the objects to delete.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the objects to delete.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -24052,7 +18992,7 @@ "target": "com.amazonaws.s3#DeleteMarker", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Specifies whether the versioned object that was permanently deleted was (true) or was\n not (false) a delete marker. In a simple DELETE, this header indicates whether (true) or\n not (false) a delete marker was created.

" + "smithy.api#documentation": "

Indicates whether the specified object version that was permanently deleted was (true) or was\n not (false) a delete marker before deletion. In a simple DELETE, this header indicates whether (true) or\n not (false) the current version of the object is a delete marker.

" } }, "DeleteMarkerVersionId": { @@ -24155,7 +19095,7 @@ } }, "traits": { - "smithy.api#documentation": "

Requests Amazon S3 to encode the object keys in the response and specifies the encoding\n method to use. An object key may contain any Unicode character; however, XML 1.0 parser\n cannot parse some characters, such as characters with an ASCII value from 0 to 10. For\n characters that are not supported in XML 1.0, you can add this parameter to request that\n Amazon S3 encode the keys in the response.

" + "smithy.api#documentation": "

Requests Amazon S3 to encode the object keys in the response and specifies the encoding\n method to use. An object key can contain any Unicode character; however, the XML 1.0 parser\n cannot parse some characters, such as characters with an ASCII value from 0 to 10. For\n characters that are not supported in XML 1.0, you can add this parameter to request that\n Amazon S3 encode the keys in the response.

" } }, "com.amazonaws.s3#Encryption": { @@ -24628,7 +19568,7 @@ "target": "com.amazonaws.s3#GetBucketAccelerateConfigurationOutput" }, "traits": { - "smithy.api#documentation": "

This implementation of the GET action uses the accelerate subresource to\n return the Transfer Acceleration state of a bucket, which is either Enabled or\n Suspended. Amazon S3 Transfer Acceleration is a bucket-level feature that\n enables you to perform faster data transfers to and from Amazon S3.

\n

To use this operation, you must have permission to perform the\n s3:GetAccelerateConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

You set the Transfer Acceleration state of an existing bucket to Enabled or\n Suspended by using the PutBucketAccelerateConfiguration operation.

\n

A GET accelerate request does not return a state value for a bucket that\n has no transfer acceleration state. A bucket has no Transfer Acceleration state if a state\n has never been set on the bucket.

\n

For more information about transfer acceleration, see Transfer Acceleration in\n the Amazon S3 User Guide.

\n

The following operations are related to GetBucketAccelerateConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the GET action uses the accelerate subresource to\n return the Transfer Acceleration state of a bucket, which is either Enabled or\n Suspended. Amazon S3 Transfer Acceleration is a bucket-level feature that\n enables you to perform faster data transfers to and from Amazon S3.

\n

To use this operation, you must have permission to perform the\n s3:GetAccelerateConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

You set the Transfer Acceleration state of an existing bucket to Enabled or\n Suspended by using the PutBucketAccelerateConfiguration operation.

\n

A GET accelerate request does not return a state value for a bucket that\n has no transfer acceleration state. A bucket has no Transfer Acceleration state if a state\n has never been set on the bucket.

\n

For more information about transfer acceleration, see Transfer Acceleration in\n the Amazon S3 User Guide.

\n

The following operations are related to\n GetBucketAccelerateConfiguration:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?accelerate", @@ -24763,7 +19703,7 @@ "target": "com.amazonaws.s3#GetBucketAnalyticsConfigurationOutput" }, "traits": { - "smithy.api#documentation": "

This implementation of the GET action returns an analytics configuration (identified by\n the analytics configuration ID) from the bucket.

\n

To use this operation, you must have permissions to perform the\n s3:GetAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

For information about Amazon S3 analytics feature, see Amazon S3 Analytics – Storage Class\n Analysis in the Amazon S3 User Guide.

\n

The following operations are related to GetBucketAnalyticsConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the GET action returns an analytics configuration (identified by\n the analytics configuration ID) from the bucket.

\n

To use this operation, you must have permissions to perform the\n s3:GetAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

For information about Amazon S3 analytics feature, see Amazon S3 Analytics – Storage Class\n Analysis in the Amazon S3 User Guide.

\n

The following operations are related to\n GetBucketAnalyticsConfiguration:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?analytics&x-id=GetBucketAnalyticsConfiguration", @@ -25473,7 +20413,7 @@ "target": "com.amazonaws.s3#GetBucketPolicyOutput" }, "traits": { - "smithy.api#documentation": "

Returns the policy of a specified bucket. If you are using an identity other than the\n root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n GetBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about bucket policies, see Using Bucket Policies and User\n Policies.

\n

The following action is related to GetBucketPolicy:

\n ", + "smithy.api#documentation": "

Returns the policy of a specified bucket. If you are using an identity other than the\n root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n GetBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have GetBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

To use this API operation against an access point, provide the alias of the access point in place of the bucket name.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

For more information about bucket policies, see Using Bucket Policies and User\n Policies.

\n

The following action is related to GetBucketPolicy:

\n ", "smithy.api#examples": [ { "title": "To get bucket policy", @@ -26020,7 +20960,7 @@ "SHA1" ] }, - "smithy.api#documentation": "

Retrieves objects from Amazon S3. To use GET, you must have READ\n access to the object. If you grant READ access to the anonymous user, you can\n return the object without using an authorization header.

\n

An Amazon S3 bucket has no directory hierarchy such as you would find in a typical computer\n file system. You can, however, create a logical hierarchy by using object key names that\n imply a folder structure. For example, instead of naming an object sample.jpg,\n you can name it photos/2006/February/sample.jpg.

\n

To get an object from such a logical hierarchy, specify the full key name for the object\n in the GET operation. For a virtual hosted-style request example, if you have\n the object photos/2006/February/sample.jpg, specify the resource as\n /photos/2006/February/sample.jpg. For a path-style request example, if you\n have the object photos/2006/February/sample.jpg in the bucket named\n examplebucket, specify the resource as\n /examplebucket/photos/2006/February/sample.jpg. For more information about\n request types, see HTTP Host\n Header Bucket Specification.

\n

For more information about returning the ACL of an object, see GetObjectAcl.

\n

If the object you are retrieving is stored in the S3 Glacier Flexible Retrieval or\n S3 Glacier Deep Archive storage class, or S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, before you can retrieve the object you must first restore a\n copy using RestoreObject. Otherwise, this action returns an\n InvalidObjectState error. For information about restoring archived objects,\n see Restoring\n Archived Objects.

\n

Encryption request headers, like x-amz-server-side-encryption, should not\n be sent for GET requests if your object uses server-side encryption with Key Management Service (KMS)\n keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with Amazon S3 managed encryption keys (SSE-S3). If your object does use\n these types of keys, you’ll get an HTTP 400 Bad Request error.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you GET the object,\n you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n

Assuming you have the relevant permission to read object tags, the response also returns\n the x-amz-tagging-count header that provides the count of number of tags\n associated with the object. You can use GetObjectTagging to retrieve\n the tag set associated with an object.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation. For more\n information, see Specifying Permissions in a\n Policy. If the object that you request doesn’t exist, the error that Amazon S3 returns depends\n on whether you also have the s3:ListBucket permission.

\n

If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 (Not Found) error.

\n

If you don’t have the s3:ListBucket permission, Amazon S3 returns an\n HTTP status code 403 (\"access denied\") error.

\n
\n
Versioning
\n
\n

By default, the GET action returns the current version of an object. To return a\n different version, use the versionId subresource.

\n \n
    \n
  • \n

    If you supply a versionId, you need the\n s3:GetObjectVersion permission to access a specific version of an\n object. If you request a specific version, you do not need to have the\n s3:GetObject permission. If you request the current version\n without a specific version ID, only s3:GetObject permission is\n required. s3:GetObjectVersion permission won't be required.

    \n
  • \n
  • \n

    If the current version of the object is a delete marker, Amazon S3 behaves as if the\n object was deleted and includes x-amz-delete-marker: true in the\n response.

    \n
  • \n
\n
\n

For more information about versioning, see PutBucketVersioning.

\n
\n
Overriding Response Header Values
\n
\n

There are times when you want to override certain response header values in a GET\n response. For example, you might override the Content-Disposition response\n header value in your GET request.

\n

You can override values for a set of response headers using the following query\n parameters. These response header values are sent only on a successful request, that is,\n when status code 200 OK is returned. The set of headers you can override using these\n parameters is a subset of the headers that Amazon S3 accepts when you create an object. The\n response headers that you can override for the GET response are Content-Type,\n Content-Language, Expires, Cache-Control,\n Content-Disposition, and Content-Encoding. To override these\n header values in the GET response, you use the following request parameters.

\n \n

You must sign the request, either using an Authorization header or a presigned URL,\n when using these parameters. They cannot be used with an unsigned (anonymous)\n request.

\n
\n
    \n
  • \n

    \n response-content-type\n

    \n
  • \n
  • \n

    \n response-content-language\n

    \n
  • \n
  • \n

    \n response-expires\n

    \n
  • \n
  • \n

    \n response-cache-control\n

    \n
  • \n
  • \n

    \n response-content-disposition\n

    \n
  • \n
  • \n

    \n response-content-encoding\n

    \n
  • \n
\n
\n
Overriding Response Header Values
\n
\n

If both of the If-Match and If-Unmodified-Since headers are\n present in the request as follows: If-Match condition evaluates to\n true, and; If-Unmodified-Since condition evaluates to\n false; then, S3 returns 200 OK and the data requested.

\n

If both of the If-None-Match and If-Modified-Since headers are\n present in the request as follows: If-None-Match condition evaluates to\n false, and; If-Modified-Since condition evaluates to\n true; then, S3 returns 304 Not Modified response code.

\n

For more information about conditional requests, see RFC 7232.

\n
\n
\n

The following operations are related to GetObject:

\n ", + "smithy.api#documentation": "

Retrieves objects from Amazon S3. To use GET, you must have READ\n access to the object. If you grant READ access to the anonymous user, you can\n return the object without using an authorization header.

\n

An Amazon S3 bucket has no directory hierarchy such as you would find in a typical computer\n file system. You can, however, create a logical hierarchy by using object key names that\n imply a folder structure. For example, instead of naming an object sample.jpg,\n you can name it photos/2006/February/sample.jpg.

\n

To get an object from such a logical hierarchy, specify the full key name for the object\n in the GET operation. For a virtual hosted-style request example, if you have\n the object photos/2006/February/sample.jpg, specify the resource as\n /photos/2006/February/sample.jpg. For a path-style request example, if you\n have the object photos/2006/February/sample.jpg in the bucket named\n examplebucket, specify the resource as\n /examplebucket/photos/2006/February/sample.jpg. For more information about\n request types, see HTTP Host\n Header Bucket Specification.

\n

For more information about returning the ACL of an object, see GetObjectAcl.

\n

If the object you are retrieving is stored in the S3 Glacier Flexible Retrieval or\n S3 Glacier Deep Archive storage class, or S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, before you can retrieve the object you must first restore a\n copy using RestoreObject. Otherwise, this action returns an\n InvalidObjectState error. For information about restoring archived objects,\n see Restoring\n Archived Objects.

\n

Encryption request headers, like x-amz-server-side-encryption, should not\n be sent for GET requests if your object uses server-side encryption with Key Management Service (KMS)\n keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\n server-side encryption with Amazon S3 managed encryption keys (SSE-S3). If your object does use\n these types of keys, you’ll get an HTTP 400 Bad Request error.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you GET the object,\n you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n

Assuming you have the relevant permission to read object tags, the response also returns\n the x-amz-tagging-count header that provides the count of number of tags\n associated with the object. You can use GetObjectTagging to retrieve\n the tag set associated with an object.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation.\n For more information, see Specifying Permissions in\n a Policy. If the object that you request doesn’t exist, the error that\n Amazon S3 returns depends on whether you also have the s3:ListBucket\n permission.

\n

If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 (Not Found) error.

\n

If you don’t have the s3:ListBucket permission, Amazon S3 returns an\n HTTP status code 403 (\"access denied\") error.

\n
\n
Versioning
\n
\n

By default, the GET action returns the current version of an\n object. To return a different version, use the versionId\n subresource.

\n \n
    \n
  • \n

    If you supply a versionId, you need the\n s3:GetObjectVersion permission to access a specific\n version of an object. If you request a specific version, you do not need\n to have the s3:GetObject permission. If you request the\n current version without a specific version ID, only\n s3:GetObject permission is required.\n s3:GetObjectVersion permission won't be required.

    \n
  • \n
  • \n

    If the current version of the object is a delete marker, Amazon S3 behaves\n as if the object was deleted and includes x-amz-delete-marker:\n true in the response.

    \n
  • \n
\n
\n

For more information about versioning, see PutBucketVersioning.

\n
\n
Overriding Response Header Values
\n
\n

There are times when you want to override certain response header values in a\n GET response. For example, you might override the\n Content-Disposition response header value in your GET\n request.

\n

You can override values for a set of response headers using the following query\n parameters. These response header values are sent only on a successful request,\n that is, when status code 200 OK is returned. The set of headers you can override\n using these parameters is a subset of the headers that Amazon S3 accepts when you\n create an object. The response headers that you can override for the\n GET response are Content-Type,\n Content-Language, Expires,\n Cache-Control, Content-Disposition, and\n Content-Encoding. To override these header values in the\n GET response, you use the following request parameters.

\n \n

You must sign the request, either using an Authorization header or a\n presigned URL, when using these parameters. They cannot be used with an\n unsigned (anonymous) request.

\n
\n
    \n
  • \n

    \n response-content-type\n

    \n
  • \n
  • \n

    \n response-content-language\n

    \n
  • \n
  • \n

    \n response-expires\n

    \n
  • \n
  • \n

    \n response-cache-control\n

    \n
  • \n
  • \n

    \n response-content-disposition\n

    \n
  • \n
  • \n

    \n response-content-encoding\n

    \n
  • \n
\n
\n
Overriding Response Header Values
\n
\n

If both of the If-Match and If-Unmodified-Since\n headers are present in the request as follows: If-Match condition\n evaluates to true, and; If-Unmodified-Since condition\n evaluates to false; then, S3 returns 200 OK and the data requested.

\n

If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows: If-None-Match\n condition evaluates to false, and; If-Modified-Since\n condition evaluates to true; then, S3 returns 304 Not Modified\n response code.

\n

For more information about conditional requests, see RFC 7232.

\n
\n
\n

The following operations are related to GetObject:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?x-id=GetObject", @@ -26189,7 +21129,7 @@ } ], "traits": { - "smithy.api#documentation": "

Retrieves all the metadata from an object without returning the object itself. This\n action is useful if you're interested only in an object's metadata. To use\n GetObjectAttributes, you must have READ access to the object.

\n

\n GetObjectAttributes combines the functionality of HeadObject\n and ListParts. All of the data returned with each of those individual calls\n can be returned with a single call to GetObjectAttributes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

\n \n
    \n
  • \n

    Encryption request headers, such as x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side encryption\n with Amazon Web Services KMS keys stored in Amazon Web Services Key Management Service (SSE-KMS) or\n server-side encryption with Amazon S3 managed keys (SSE-S3). If your object does use\n these types of keys, you'll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Consider the following when using request headers:

\n
    \n
  • \n

    If both of the If-Match and If-Unmodified-Since headers\n are present in the request as follows, then Amazon S3 returns the HTTP status code\n 200 OK and the data requested:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true.

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false.

      \n
    • \n
    \n
  • \n
  • \n

    If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows, then Amazon S3 returns the HTTP status code\n 304 Not Modified:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false.

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true.

      \n
    • \n
    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

The permissions that you need to use this operation depend on whether the bucket is\n versioned. If the bucket is versioned, you need both the s3:GetObjectVersion\n and s3:GetObjectVersionAttributes permissions for this operation. If the\n bucket is not versioned, you need the s3:GetObject and\n s3:GetObjectAttributes permissions. For more information, see Specifying\n Permissions in a Policy in the Amazon S3 User Guide. If the\n object that you request does not exist, the error Amazon S3 returns depends on whether you also\n have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3 returns\n an HTTP status code 404 Not Found (\"no such key\") error.

    \n
  • \n
  • \n

    If you don't have the s3:ListBucket permission, Amazon S3 returns an HTTP\n status code 403 Forbidden (\"access denied\") error.

    \n
  • \n
\n
\n
\n

The following actions are related to GetObjectAttributes:

\n ", + "smithy.api#documentation": "

Retrieves all the metadata from an object without returning the object itself. This\n action is useful if you're interested only in an object's metadata. To use\n GetObjectAttributes, you must have READ access to the object.

\n

\n GetObjectAttributes combines the functionality of HeadObject\n and ListParts. All of the data returned with each of those individual calls\n can be returned with a single call to GetObjectAttributes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

\n \n
    \n
  • \n

    Encryption request headers, such as x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side encryption\n with Amazon Web Services KMS keys stored in Amazon Web Services Key Management Service (SSE-KMS) or\n server-side encryption with Amazon S3 managed keys (SSE-S3). If your object does use\n these types of keys, you'll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Consider the following when using request headers:

\n
    \n
  • \n

    If both of the If-Match and If-Unmodified-Since headers\n are present in the request as follows, then Amazon S3 returns the HTTP status code\n 200 OK and the data requested:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true.

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false.

      \n
    • \n
    \n
  • \n
  • \n

    If both of the If-None-Match and If-Modified-Since\n headers are present in the request as follows, then Amazon S3 returns the HTTP status code\n 304 Not Modified:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false.

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true.

      \n
    • \n
    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

The permissions that you need to use this operation depend on whether the\n bucket is versioned. If the bucket is versioned, you need both the\n s3:GetObjectVersion and s3:GetObjectVersionAttributes\n permissions for this operation. If the bucket is not versioned, you need the\n s3:GetObject and s3:GetObjectAttributes permissions.\n For more information, see Specifying Permissions in\n a Policy in the Amazon S3 User Guide. If the object\n that you request does not exist, the error Amazon S3 returns depends on whether you\n also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 Not Found (\"no such key\")\n error.

    \n
  • \n
  • \n

    If you don't have the s3:ListBucket permission, Amazon S3 returns\n an HTTP status code 403 Forbidden (\"access denied\")\n error.

    \n
  • \n
\n
\n
\n

The following actions are related to GetObjectAttributes:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}/{Key+}?attributes", @@ -26320,7 +21260,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket that contains the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket that contains the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -26395,7 +21335,7 @@ "ObjectAttributes": { "target": "com.amazonaws.s3#ObjectAttributesList", "traits": { - "smithy.api#documentation": "

An XML header that specifies the fields at the root level that you want returned in the\n response. Fields that you do not specify are not returned.

", + "smithy.api#documentation": "

Specifies the fields at the root level that you want returned in the response. Fields\n that you do not specify are not returned.

", "smithy.api#httpHeader": "x-amz-object-attributes", "smithy.api#required": {} } @@ -26814,7 +21754,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When using an Object Lambda access point the hostname takes the form AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When using an Object Lambda access point the hostname takes the form AccessPointName-AccountId.s3-object-lambda.Region.amazonaws.com.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27122,7 +22062,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object for which to get the tagging information.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object for which to get the tagging information.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27429,7 +22369,7 @@ } ], "traits": { - "smithy.api#documentation": "

This action is useful to determine if a bucket exists and you have permission to access\n it. The action returns a 200 OK if the bucket exists and you have permission\n to access it.

\n

If the bucket does not exist or you do not have permission to access it, the\n HEAD request returns a generic 400 Bad Request, 403\n Forbidden or 404 Not Found code. A message body is not included, so\n you cannot determine the exception beyond these error codes.

\n

To use this operation, you must have permissions to perform the\n s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

To use this API operation against an access point, you must provide the alias of the access point in place of the\n bucket name or specify the access point ARN. When using the access point ARN, you must direct requests to\n the access point hostname. The access point hostname takes the form\n AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.\n When using the Amazon Web Services SDKs, you provide the ARN in place of the bucket name. For more\n information, see Using access points.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

", + "smithy.api#documentation": "

This action is useful to determine if a bucket exists and you have permission to access\n it. The action returns a 200 OK if the bucket exists and you have permission\n to access it.

\n

If the bucket does not exist or you do not have permission to access it, the\n HEAD request returns a generic 400 Bad Request, 403\n Forbidden or 404 Not Found code. A message body is not included, so\n you cannot determine the exception beyond these error codes.

\n

To use this operation, you must have permissions to perform the\n s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

To use this API operation against an access point, you must provide the alias of the access point in\n place of the bucket name or specify the access point ARN. When using the access point ARN, you must direct\n requests to the access point hostname. The access point hostname takes the form\n AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.\n When using the Amazon Web Services SDKs, you provide the ARN in place of the bucket name. For more\n information, see Using access points.

\n

To use this API operation against an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \nIf the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \nFor more information about InvalidAccessPointAliasError, see List of\n Error Codes.

", "smithy.api#examples": [ { "title": "To determine if bucket exists", @@ -27482,7 +22422,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \n If the Object Lambda access point alias in a request is not valid, the error code InvalidAccessPointAliasError is returned. \n For more information about InvalidAccessPointAliasError, see List of\n Error Codes.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the\n bucket name. If the Object Lambda access point alias in a request is not valid, the error code\n InvalidAccessPointAliasError is returned. For more information about\n InvalidAccessPointAliasError, see List of Error\n Codes.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -27516,7 +22456,7 @@ } ], "traits": { - "smithy.api#documentation": "

The HEAD action retrieves metadata from an object without returning the object itself.\n This action is useful if you're only interested in an object's metadata. To use HEAD, you\n must have READ access to the object.

\n

A HEAD request has the same options as a GET action on an\n object. The response is identical to the GET response except that there is no\n response body. Because of this, if the HEAD request generates an error, it\n returns a generic 400 Bad Request, 403 Forbidden or 404 Not\n Found code. It is not possible to retrieve the exact exception beyond these error\n codes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n \n
    \n
  • \n

    Encryption request headers, like x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side\n encryption with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side\n encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side encryption with Amazon S3\n managed encryption keys (SSE-S3). If your object does use these types of keys,\n you’ll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Request headers are limited to 8 KB in size. For more information, see Common\n Request Headers.

\n

Consider the following when using request headers:

\n
    \n
  • \n

    Consideration 1 – If both of the If-Match and\n If-Unmodified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true, and;

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false;

      \n
    • \n
    \n

    Then Amazon S3 returns 200 OK and the data requested.

    \n
  • \n
  • \n

    Consideration 2 – If both of the If-None-Match and\n If-Modified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false,\n and;

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true;

      \n
    • \n
    \n

    Then Amazon S3 returns the 304 Not Modified response code.

    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation. For more\n information, see Actions, resources, and condition keys for Amazon S3. \n If the object you request doesn't exist, the error that Amazon S3 returns depends\n on whether you also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3 returns\n an HTTP status code 404 error.

    \n
  • \n
  • \n

    If you don’t have the s3:ListBucket permission, Amazon S3 returns an HTTP\n status code 403 error.

    \n
  • \n
\n
\n
\n

The following actions are related to HeadObject:

\n ", + "smithy.api#documentation": "

The HEAD action retrieves metadata from an object without returning the\n object itself. This action is useful if you're only interested in an object's metadata. To\n use HEAD, you must have READ access to the object.

\n

A HEAD request has the same options as a GET action on an\n object. The response is identical to the GET response except that there is no\n response body. Because of this, if the HEAD request generates an error, it\n returns a generic 400 Bad Request, 403 Forbidden or 404 Not\n Found code. It is not possible to retrieve the exact exception beyond these error\n codes.

\n

If you encrypt an object by using server-side encryption with customer-provided\n encryption keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the\n metadata from the object, you must use the following headers:

\n
    \n
  • \n

    \n x-amz-server-side-encryption-customer-algorithm\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key\n

    \n
  • \n
  • \n

    \n x-amz-server-side-encryption-customer-key-MD5\n

    \n
  • \n
\n

For more information about SSE-C, see Server-Side Encryption\n (Using Customer-Provided Encryption Keys).

\n \n
    \n
  • \n

    Encryption request headers, like x-amz-server-side-encryption,\n should not be sent for GET requests if your object uses server-side\n encryption with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side\n encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side encryption with Amazon S3\n managed encryption keys (SSE-S3). If your object does use these types of keys,\n you’ll get an HTTP 400 Bad Request error.

    \n
  • \n
  • \n

    The last modified property in this case is the creation date of the\n object.

    \n
  • \n
\n
\n

Request headers are limited to 8 KB in size. For more information, see Common\n Request Headers.

\n

Consider the following when using request headers:

\n
    \n
  • \n

    Consideration 1 – If both of the If-Match and\n If-Unmodified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-Match condition evaluates to true, and;

      \n
    • \n
    • \n

      \n If-Unmodified-Since condition evaluates to\n false;

      \n
    • \n
    \n

    Then Amazon S3 returns 200 OK and the data requested.

    \n
  • \n
  • \n

    Consideration 2 – If both of the If-None-Match and\n If-Modified-Since headers are present in the request as\n follows:

    \n
      \n
    • \n

      \n If-None-Match condition evaluates to false,\n and;

      \n
    • \n
    • \n

      \n If-Modified-Since condition evaluates to\n true;

      \n
    • \n
    \n

    Then Amazon S3 returns the 304 Not Modified response code.

    \n
  • \n
\n

For more information about conditional requests, see RFC 7232.

\n
\n
Permissions
\n
\n

You need the relevant read object (or version) permission for this operation.\n For more information, see Actions, resources, and condition\n keys for Amazon S3. If the object you request doesn't exist, the error that\n Amazon S3 returns depends on whether you also have the s3:ListBucket permission.

\n
    \n
  • \n

    If you have the s3:ListBucket permission on the bucket, Amazon S3\n returns an HTTP status code 404 error.

    \n
  • \n
  • \n

    If you don’t have the s3:ListBucket permission, Amazon S3 returns\n an HTTP status code 403 error.

    \n
  • \n
\n
\n
\n

The following actions are related to HeadObject:

\n ", "smithy.api#http": { "method": "HEAD", "uri": "/{Bucket}/{Key+}", @@ -27810,7 +22750,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -28416,6 +23356,18 @@ "traits": { "smithy.api#enumValue": "ChecksumAlgorithm" } + }, + "ObjectAccessControlList": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ObjectAccessControlList" + } + }, + "ObjectOwner": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ObjectOwner" + } } } }, @@ -28501,6 +23453,12 @@ "smithy.api#default": false } }, + "com.amazonaws.s3#IsRestoreInProgress": { + "type": "boolean", + "traits": { + "smithy.api#default": false + } + }, "com.amazonaws.s3#IsTruncated": { "type": "boolean", "traits": { @@ -28616,7 +23574,7 @@ "Date": { "target": "com.amazonaws.s3#Date", "traits": { - "smithy.api#documentation": "

Indicates at what date the object is to be moved or deleted. The date value must conform to the ISO 8601 format. \n The time is always midnight UTC.

" + "smithy.api#documentation": "

Indicates at what date the object is to be moved or deleted. The date value must conform\n to the ISO 8601 format. The time is always midnight UTC.

" } }, "Days": { @@ -28847,7 +23805,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The ContinuationToken that represents a placeholder from where this request should\n begin.

", + "smithy.api#documentation": "

The ContinuationToken that represents a placeholder from where this request\n should begin.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29011,7 +23969,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The marker used to continue an inventory configuration listing that has been truncated.\n Use the NextContinuationToken from a previously truncated list response to continue the\n listing. The continuation token is an opaque value that Amazon S3 understands.

", + "smithy.api#documentation": "

The marker used to continue an inventory configuration listing that has been truncated.\n Use the NextContinuationToken from a previously truncated list response to\n continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29097,7 +24055,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

The marker that is used to continue a metrics configuration listing that has been\n truncated. Use the NextContinuationToken from a previously truncated list response to\n continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", + "smithy.api#documentation": "

The marker that is used to continue a metrics configuration listing that has been\n truncated. Use the NextContinuationToken from a previously truncated list\n response to continue the listing. The continuation token is an opaque value that Amazon S3\n understands.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29187,6 +24145,47 @@ }, "traits": { "smithy.api#documentation": "

This action lists in-progress multipart uploads. An in-progress multipart upload is a\n multipart upload that has been initiated using the Initiate Multipart Upload request, but\n has not yet been completed or aborted.

\n

This action returns at most 1,000 multipart uploads in the response. 1,000 multipart\n uploads is the maximum number of uploads a response can include, which is also the default\n value. You can further limit the number of uploads in a response by specifying the\n max-uploads parameter in the response. If additional multipart uploads\n satisfy the list criteria, the response will contain an IsTruncated element\n with the value true. To list the additional multipart uploads, use the\n key-marker and upload-id-marker request parameters.

\n

In the response, the uploads are sorted by key. If your application has initiated more\n than one multipart upload using the same object key, then uploads in the response are first\n sorted by key. Additionally, uploads are sorted in ascending order within each key by the\n upload initiation time.

\n

For more information on multipart uploads, see Uploading Objects Using Multipart\n Upload.

\n

For information on permissions required to use the multipart upload API, see Multipart Upload\n and Permissions.

\n

The following operations are related to ListMultipartUploads:

\n ", + "smithy.api#examples": [ + { + "title": "To list in-progress multipart uploads on a bucket", + "documentation": "The following example lists in-progress multipart uploads on a specific bucket.", + "input": { + "Bucket": "examplebucket" + }, + "output": { + "Uploads": [ + { + "Initiator": { + "DisplayName": "display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Initiated": "2014-05-01T05:40:58.000Z", + "UploadId": "examplelUa.CInXklLQtSMJITdUnoZ1Y5GACB5UckOtspm5zbDMCkPF_qkfZzMiFZ6dksmcnqxJyIBvQMG9X9Q--", + "StorageClass": "STANDARD", + "Key": "JavaFile", + "Owner": { + "DisplayName": "display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + } + }, + { + "Initiator": { + "DisplayName": "display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + }, + "Initiated": "2014-05-01T05:41:27.000Z", + "UploadId": "examplelo91lv1iwvWpvCiJWugw2xXLPAD7Z8cJyX9.WiIRgNrdG6Ldsn.9FtS63TCl1Uf5faTB.1U5Ckcbmdw--", + "StorageClass": "STANDARD", + "Key": "JavaFile", + "Owner": { + "DisplayName": "display-name", + "ID": "examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc" + } + } + ] + } + } + ], "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?uploads", @@ -29271,7 +24270,7 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object keys in the response.

\n

If you specify encoding-type request parameter, Amazon S3 includes this element\n in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, KeyMarker, Prefix,\n NextKeyMarker, Key.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object keys in the response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, KeyMarker, Prefix,\n NextKeyMarker, Key.

" } }, "RequestCharged": { @@ -29292,7 +24291,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29316,7 +24315,7 @@ "KeyMarker": { "target": "com.amazonaws.s3#KeyMarker", "traits": { - "smithy.api#documentation": "

Together with upload-id-marker, this parameter specifies the multipart upload after\n which listing should begin.

\n

If upload-id-marker is not specified, only the keys lexicographically\n greater than the specified key-marker will be included in the list.

\n

If upload-id-marker is specified, any multipart uploads for a key equal to\n the key-marker might also be included, provided those multipart uploads have\n upload IDs lexicographically greater than the specified\n upload-id-marker.

", + "smithy.api#documentation": "

Together with upload-id-marker, this parameter specifies the multipart\n upload after which listing should begin.

\n

If upload-id-marker is not specified, only the keys lexicographically\n greater than the specified key-marker will be included in the list.

\n

If upload-id-marker is specified, any multipart uploads for a key equal to\n the key-marker might also be included, provided those multipart uploads have\n upload IDs lexicographically greater than the specified\n upload-id-marker.

", "smithy.api#httpQuery": "key-marker" } }, @@ -29331,7 +24330,7 @@ "Prefix": { "target": "com.amazonaws.s3#Prefix", "traits": { - "smithy.api#documentation": "

Lists in-progress uploads only for those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different grouping of keys. (You can think of\n using prefix to make groups in the same way you'd use a folder in a file system.)

", + "smithy.api#documentation": "

Lists in-progress uploads only for those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different grouping of keys. (You can think of\n using prefix to make groups in the same way that you'd use a folder in a file\n system.)

", "smithy.api#httpQuery": "prefix" } }, @@ -29369,7 +24368,7 @@ "target": "com.amazonaws.s3#ListObjectVersionsOutput" }, "traits": { - "smithy.api#documentation": "

Returns metadata about all versions of the objects in a bucket. You can also use request\n parameters as selection criteria to return metadata about a subset of all the object\n versions.

\n \n

To use this operation, you must have permissions to perform the\n s3:ListBucketVersions action. Be aware of the name difference.

\n
\n \n

A 200 OK response can contain valid or invalid XML. Make sure to design your\n application to parse the contents of the response and handle it appropriately.

\n
\n

To use this operation, you must have READ access to the bucket.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following operations are related to ListObjectVersions:

\n ", + "smithy.api#documentation": "

Returns metadata about all versions of the objects in a bucket. You can also use request\n parameters as selection criteria to return metadata about a subset of all the object\n versions.

\n \n

To use this operation, you must have permission to perform the\n s3:ListBucketVersions action. Be aware of the name difference.

\n
\n \n

A 200 OK response can contain valid or invalid XML. Make sure to design\n your application to parse the contents of the response and handle it\n appropriately.

\n
\n

To use this operation, you must have READ access to the bucket.

\n

This action is not supported by Amazon S3 on Outposts.

\n

The following operations are related to ListObjectVersions:

\n ", "smithy.api#examples": [ { "title": "To list object versions", @@ -29424,7 +24423,7 @@ "target": "com.amazonaws.s3#IsTruncated", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

A flag that indicates whether Amazon S3 returned all of the results that satisfied the search\n criteria. If your results were truncated, you can make a follow-up paginated request using\n the NextKeyMarker and NextVersionIdMarker response parameters as a starting place in\n another request to return the rest of the results.

" + "smithy.api#documentation": "

A flag that indicates whether Amazon S3 returned all of the results that satisfied the search\n criteria. If your results were truncated, you can make a follow-up paginated request by\n using the NextKeyMarker and NextVersionIdMarker response\n parameters as a starting place in another request to return the rest of the results.

" } }, "KeyMarker": { @@ -29448,7 +24447,7 @@ "NextVersionIdMarker": { "target": "com.amazonaws.s3#NextVersionIdMarker", "traits": { - "smithy.api#documentation": "

When the number of responses exceeds the value of MaxKeys,\n NextVersionIdMarker specifies the first object version not returned that\n satisfies the search criteria. Use this value for the version-id-marker request parameter\n in a subsequent request.

" + "smithy.api#documentation": "

When the number of responses exceeds the value of MaxKeys,\n NextVersionIdMarker specifies the first object version not returned that\n satisfies the search criteria. Use this value for the version-id-marker\n request parameter in a subsequent request.

" } }, "Versions": { @@ -29482,7 +24481,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

The delimiter grouping the included keys. A delimiter is a character that you specify to\n group keys. All keys that contain the same string between the prefix and the first\n occurrence of the delimiter are grouped under a single result element in\n CommonPrefixes. These groups are counted as one result against the max-keys\n limitation. These keys are not returned elsewhere in the response.

" + "smithy.api#documentation": "

The delimiter grouping the included keys. A delimiter is a character that you specify to\n group keys. All keys that contain the same string between the prefix and the first\n occurrence of the delimiter are grouped under a single result element in\n CommonPrefixes. These groups are counted as one result against the\n max-keys limitation. These keys are not returned elsewhere in the\n response.

" } }, "MaxKeys": { @@ -29502,7 +24501,7 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify encoding-type request parameter, Amazon S3 includes this element in the\n response, and returns encoded key name values in the following response elements:

\n

\n KeyMarker, NextKeyMarker, Prefix, Key, and Delimiter.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n KeyMarker, NextKeyMarker, Prefix, Key, and Delimiter.

" } }, "RequestCharged": { @@ -29534,7 +24533,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character that you specify to group keys. All keys that contain the\n same string between the prefix and the first occurrence of the delimiter are\n grouped under a single result element in CommonPrefixes. These groups are counted as one\n result against the max-keys limitation. These keys are not returned elsewhere in the\n response.

", + "smithy.api#documentation": "

A delimiter is a character that you specify to group keys. All keys that contain the\n same string between the prefix and the first occurrence of the delimiter are\n grouped under a single result element in CommonPrefixes. These groups are\n counted as one result against the max-keys limitation. These keys are not\n returned elsewhere in the response.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29555,14 +24554,14 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n If additional keys satisfy the search criteria, but were not returned because max-keys was\n exceeded, the response contains true. To return the\n additional keys, see key-marker and version-id-marker.

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n If additional keys satisfy the search criteria, but were not returned because\n max-keys was exceeded, the response contains\n true. To return the additional keys,\n see key-marker and version-id-marker.

", "smithy.api#httpQuery": "max-keys" } }, "Prefix": { "target": "com.amazonaws.s3#Prefix", "traits": { - "smithy.api#documentation": "

Use this parameter to select only those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different groupings of keys. (You can think of\n using prefix to make groups in the same way you'd use a folder in a file system.) You can\n use prefix with delimiter to roll up numerous objects into a single result under\n CommonPrefixes.

", + "smithy.api#documentation": "

Use this parameter to select only those keys that begin with the specified prefix. You\n can use prefixes to separate a bucket into different groupings of keys. (You can think of\n using prefix to make groups in the same way that you'd use a folder in a file\n system.) You can use prefix with delimiter to roll up numerous\n objects into a single result under CommonPrefixes.

", "smithy.api#httpQuery": "prefix" } }, @@ -29585,6 +24584,13 @@ "traits": { "smithy.api#httpHeader": "x-amz-request-payer" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -29632,7 +24638,7 @@ "NextMarker": { "target": "com.amazonaws.s3#NextMarker", "traits": { - "smithy.api#documentation": "

When response is truncated (the IsTruncated element value in the response is true), you\n can use the key name in this field as marker in the subsequent request to get next set of\n objects. Amazon S3 lists objects in alphabetical order Note: This element is returned only if\n you have delimiter request parameter specified. If response does not include the NextMarker\n and it is truncated, you can use the value of the last Key in the response as the marker in\n the subsequent request to get the next set of object keys.

" + "smithy.api#documentation": "

When the response is truncated (the IsTruncated element value in the\n response is true), you can use the key name in this field as the\n marker parameter in the subsequent request to get the next set of objects.\n Amazon S3 lists objects in alphabetical order.

\n \n

This element is returned only if you have the delimiter request\n parameter specified. If the response does not include the NextMarker\n element and it is truncated, you can use the value of the last Key element\n in the response as the marker parameter in the subsequent request to get\n the next set of object keys.

\n
" } }, "Contents": { @@ -29670,7 +24676,7 @@ "CommonPrefixes": { "target": "com.amazonaws.s3#CommonPrefixList", "traits": { - "smithy.api#documentation": "

All of the keys (up to 1,000) rolled up in a common prefix count as a single return when\n calculating the number of returns.

\n

A response can contain CommonPrefixes only if you specify a delimiter.

\n

CommonPrefixes contains all (if there are any) keys between Prefix and the next\n occurrence of the string specified by the delimiter.

\n

CommonPrefixes lists keys that act like subdirectories in the directory specified by\n Prefix.

\n

For example, if the prefix is notes/ and the delimiter is a slash (/) as in\n notes/summer/july, the common prefix is notes/summer/. All of the keys that roll up into a\n common prefix count as a single return when calculating the number of returns.

", + "smithy.api#documentation": "

All of the keys (up to 1,000) rolled up in a common prefix count as a single return when\n calculating the number of returns.

\n

A response can contain CommonPrefixes only if you specify a\n delimiter.

\n

\n CommonPrefixes contains all (if there are any) keys between\n Prefix and the next occurrence of the string specified by the\n delimiter.

\n

\n CommonPrefixes lists keys that act like subdirectories in the directory\n specified by Prefix.

\n

For example, if the prefix is notes/ and the delimiter is a slash\n (/), as in notes/summer/july, the common prefix is\n notes/summer/. All of the keys that roll up into a common prefix count as a\n single return when calculating the number of returns.

", "smithy.api#xmlFlattened": {} } }, @@ -29698,7 +24704,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket containing the objects.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket containing the objects.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29709,7 +24715,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character you use to group keys.

", + "smithy.api#documentation": "

A delimiter is a character that you use to group keys.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29722,7 +24728,7 @@ "Marker": { "target": "com.amazonaws.s3#Marker", "traits": { - "smithy.api#documentation": "

Marker is where you want Amazon S3 to start listing from. Amazon S3 starts listing after\n this specified key. Marker can be any key in the bucket.

", + "smithy.api#documentation": "

Marker is where you want Amazon S3 to start listing from. Amazon S3 starts listing after this\n specified key. Marker can be any key in the bucket.

", "smithy.api#httpQuery": "marker" } }, @@ -29730,7 +24736,7 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain more.\n

", "smithy.api#httpQuery": "max-keys" } }, @@ -29754,6 +24760,13 @@ "smithy.api#documentation": "

The account ID of the expected bucket owner. If the bucket is owned by a different account, the request fails with the HTTP status code 403 Forbidden (access denied).

", "smithy.api#httpHeader": "x-amz-expected-bucket-owner" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -29774,7 +24787,7 @@ } ], "traits": { - "smithy.api#documentation": "

Returns some or all (up to 1,000) of the objects in a bucket with each request. You can\n use the request parameters as selection criteria to return a subset of the objects in a\n bucket. A 200 OK response can contain valid or invalid XML. Make sure to\n design your application to parse the contents of the response and handle it appropriately.\n Objects are returned sorted in an ascending order of the respective key names in the list.\n For more information about listing objects, see Listing object keys\n programmatically\n

\n

To use this operation, you must have READ access to the bucket.

\n

To use this action in an Identity and Access Management (IAM) policy, you must have permissions to perform\n the s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n \n

This section describes the latest revision of this action. We recommend that you use\n this revised API for application development. For backward compatibility, Amazon S3 continues\n to support the prior version of this API, ListObjects.

\n
\n

To get a list of your buckets, see ListBuckets.

\n

The following operations are related to ListObjectsV2:

\n ", + "smithy.api#documentation": "

Returns some or all (up to 1,000) of the objects in a bucket with each request. You can\n use the request parameters as selection criteria to return a subset of the objects in a\n bucket. A 200 OK response can contain valid or invalid XML. Make sure to\n design your application to parse the contents of the response and handle it appropriately.\n Objects are returned sorted in an ascending order of the respective key names in the list.\n For more information about listing objects, see Listing object keys\n programmatically in the Amazon S3 User Guide.

\n

To use this operation, you must have READ access to the bucket.

\n

To use this action in an Identity and Access Management (IAM) policy, you must have permission to perform\n the s3:ListBucket action. The bucket owner has this permission by default and\n can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n \n

This section describes the latest revision of this action. We recommend that you use\n this revised API operation for application development. For backward compatibility, Amazon S3\n continues to support the prior version of this API operation, ListObjects.

\n
\n

To get a list of your buckets, see ListBuckets.

\n

The following operations are related to ListObjectsV2:

\n ", "smithy.api#http": { "method": "GET", "uri": "/{Bucket}?list-type=2", @@ -29794,7 +24807,7 @@ "target": "com.amazonaws.s3#IsTruncated", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Set to false if all of the results were returned. Set to true if more keys are available\n to return. If the number of results exceeds that specified by MaxKeys, all of the results\n might not be returned.

" + "smithy.api#documentation": "

Set to false if all of the results were returned. Set to true\n if more keys are available to return. If the number of results exceeds that specified by\n MaxKeys, all of the results might not be returned.

" } }, "Contents": { @@ -29807,7 +24820,7 @@ "Name": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

" } }, "Prefix": { @@ -29819,14 +24832,14 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

Causes keys that contain the same string between the prefix and the first occurrence of\n the delimiter to be rolled up into a single result element in the CommonPrefixes\n collection. These rolled-up keys are not returned elsewhere in the response. Each rolled-up\n result counts as only one return against the MaxKeys value.

" + "smithy.api#documentation": "

Causes keys that contain the same string between the prefix and the first\n occurrence of the delimiter to be rolled up into a single result element in the\n CommonPrefixes collection. These rolled-up keys are not returned elsewhere\n in the response. Each rolled-up result counts as only one return against the\n MaxKeys value.

" } }, "MaxKeys": { "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

" + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

" } }, "CommonPrefixes": { @@ -29839,20 +24852,20 @@ "EncodingType": { "target": "com.amazonaws.s3#EncodingType", "traits": { - "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this element in the\n response, and returns encoded key name values in the following response elements:

\n

\n Delimiter, Prefix, Key, and StartAfter.

" + "smithy.api#documentation": "

Encoding type used by Amazon S3 to encode object key names in the XML response.

\n

If you specify the encoding-type request parameter, Amazon S3 includes this\n element in the response, and returns encoded key name values in the following response\n elements:

\n

\n Delimiter, Prefix, Key, and StartAfter.

" } }, "KeyCount": { "target": "com.amazonaws.s3#KeyCount", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

KeyCount is the number of keys returned with this request. KeyCount will always be less\n than or equal to the MaxKeys field. Say you ask for 50 keys, your result will\n include 50 keys or fewer.

" + "smithy.api#documentation": "

\n KeyCount is the number of keys returned with this request.\n KeyCount will always be less than or equal to the MaxKeys\n field. For example, if you ask for 50 keys, your result will include 50 keys or\n fewer.

" } }, "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

If ContinuationToken was sent with the request, it is included in the response.

" + "smithy.api#documentation": "

If ContinuationToken was sent with the request, it is included in the\n response.

" } }, "NextContinuationToken": { @@ -29885,7 +24898,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

Bucket name to list.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Bucket name to list.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -29896,7 +24909,7 @@ "Delimiter": { "target": "com.amazonaws.s3#Delimiter", "traits": { - "smithy.api#documentation": "

A delimiter is a character you use to group keys.

", + "smithy.api#documentation": "

A delimiter is a character that you use to group keys.

", "smithy.api#httpQuery": "delimiter" } }, @@ -29911,7 +24924,7 @@ "target": "com.amazonaws.s3#MaxKeys", "traits": { "smithy.api#default": 0, - "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

", + "smithy.api#documentation": "

Sets the maximum number of keys returned in the response. By default, the action returns\n up to 1,000 key names. The response might contain fewer keys but will never contain\n more.

", "smithy.api#httpQuery": "max-keys" } }, @@ -29925,7 +24938,7 @@ "ContinuationToken": { "target": "com.amazonaws.s3#Token", "traits": { - "smithy.api#documentation": "

ContinuationToken indicates Amazon S3 that the list is being continued on this bucket with a\n token. ContinuationToken is obfuscated and is not a real key.

", + "smithy.api#documentation": "

\n ContinuationToken indicates to Amazon S3 that the list is being continued on\n this bucket with a token. ContinuationToken is obfuscated and is not a real\n key.

", "smithy.api#httpQuery": "continuation-token" } }, @@ -29933,7 +24946,7 @@ "target": "com.amazonaws.s3#FetchOwner", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

The owner field is not present in listV2 by default, if you want to return owner field\n with each key in the result then set the fetch owner field to true.

", + "smithy.api#documentation": "

The owner field is not present in ListObjectsV2 by default. If you want to\n return the owner field with each key in the result, then set the FetchOwner\n field to true.

", "smithy.api#httpQuery": "fetch-owner" } }, @@ -29957,6 +24970,13 @@ "smithy.api#documentation": "

The account ID of the expected bucket owner. If the bucket is owned by a different account, the request fails with the HTTP status code 403 Forbidden (access denied).

", "smithy.api#httpHeader": "x-amz-expected-bucket-owner" } + }, + "OptionalObjectAttributes": { + "target": "com.amazonaws.s3#OptionalObjectAttributesList", + "traits": { + "smithy.api#documentation": "

Specifies the optional fields that you want returned in the response. Fields that you do\n not specify are not returned.

", + "smithy.api#httpHeader": "x-amz-optional-object-attributes" + } } }, "traits": { @@ -29992,7 +25012,7 @@ "AbortDate": { "target": "com.amazonaws.s3#AbortDate", "traits": { - "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, then the response includes this header indicating when the initiated multipart\n upload will become eligible for abort operation. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration.

\n

The response will also include the x-amz-abort-rule-id header that will\n provide the ID of the lifecycle configuration rule that defines this action.

", + "smithy.api#documentation": "

If the bucket has a lifecycle rule configured with an action to abort incomplete\n multipart uploads and the prefix in the lifecycle rule matches the object name in the\n request, then the response includes this header indicating when the initiated multipart\n upload will become eligible for abort operation. For more information, see Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle\n Configuration.

\n

The response will also include the x-amz-abort-rule-id header that will\n provide the ID of the lifecycle configuration rule that defines this action.

", "smithy.api#httpHeader": "x-amz-abort-date" } }, @@ -30030,7 +25050,7 @@ "NextPartNumberMarker": { "target": "com.amazonaws.s3#NextPartNumberMarker", "traits": { - "smithy.api#documentation": "

When a list is truncated, this element specifies the last part in the list, as well as\n the value to use for the part-number-marker request parameter in a subsequent\n request.

" + "smithy.api#documentation": "

When a list is truncated, this element specifies the last part in the list, as well as\n the value to use for the part-number-marker request parameter in a subsequent\n request.

" } }, "MaxParts": { @@ -30097,7 +25117,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the parts are being uploaded.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the parts are being uploaded.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -30308,13 +25328,13 @@ "Name": { "target": "com.amazonaws.s3#MetadataKey", "traits": { - "smithy.api#documentation": "

Name of the Object.

" + "smithy.api#documentation": "

Name of the object.

" } }, "Value": { "target": "com.amazonaws.s3#MetadataValue", "traits": { - "smithy.api#documentation": "

Value of the Object.

" + "smithy.api#documentation": "

Value of the object.

" } } }, @@ -30682,7 +25702,7 @@ } }, "traits": { - "smithy.api#documentation": "

Specifies object key name filtering rules. For information about key name filtering, see\n Configuring event notifications using object key name filtering in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Specifies object key name filtering rules. For information about key name filtering, see\n Configuring event\n notifications using object key name filtering in the\n Amazon S3 User Guide.

" } }, "com.amazonaws.s3#NotificationId": { @@ -30737,6 +25757,12 @@ "traits": { "smithy.api#documentation": "

The owner of the object

" } + }, + "RestoreStatus": { + "target": "com.amazonaws.s3#RestoreStatus", + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" + } } }, "traits": { @@ -31247,6 +26273,12 @@ "traits": { "smithy.api#documentation": "

Specifies the owner of the object.

" } + }, + "RestoreStatus": { + "target": "com.amazonaws.s3#RestoreStatus", + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" + } } }, "traits": { @@ -31273,6 +26305,23 @@ } } }, + "com.amazonaws.s3#OptionalObjectAttributes": { + "type": "enum", + "members": { + "RESTORE_STATUS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "RestoreStatus" + } + } + } + }, + "com.amazonaws.s3#OptionalObjectAttributesList": { + "type": "list", + "member": { + "target": "com.amazonaws.s3#OptionalObjectAttributes" + } + }, "com.amazonaws.s3#OutputLocation": { "type": "structure", "members": { @@ -31723,7 +26772,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the permissions on an existing bucket using access control lists (ACL). For more\n information, see Using ACLs. To set the ACL of a\n bucket, you must have WRITE_ACP permission.

\n

You can use one of the following two ways to set a bucket's permissions:

\n
    \n
  • \n

    Specify the ACL in the request body

    \n
  • \n
  • \n

    Specify permissions using request headers

    \n
  • \n
\n \n

You cannot specify access permission using both the body and the request\n headers.

\n
\n

Depending on your application needs, you may choose to set the ACL on a bucket using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, then you can continue to use that\n approach.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions by using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL\n has a predefined set of grantees and permissions. Specify the canned ACL name as the\n value of x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n the x-amz-acl header to set a canned ACL. These parameters map to the\n set of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-write header grants create,\n overwrite, and delete objects permission to LogDelivery group predefined by Amazon S3 and\n two Amazon Web Services accounts identified by their email addresses.

    \n

    \n x-amz-grant-write: uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\",\n id=\"111122223333\", id=\"555566667777\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>&\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
\n

The following operations are related to PutBucketAcl:

\n ", + "smithy.api#documentation": "

Sets the permissions on an existing bucket using access control lists (ACL). For more\n information, see Using ACLs. To set the ACL of a\n bucket, you must have WRITE_ACP permission.

\n

You can use one of the following two ways to set a bucket's permissions:

\n
    \n
  • \n

    Specify the ACL in the request body

    \n
  • \n
  • \n

    Specify permissions using request headers

    \n
  • \n
\n \n

You cannot specify access permission using both the body and the request\n headers.

\n
\n

Depending on your application needs, you may choose to set the ACL on a bucket using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, then you can continue to use that\n approach.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions by using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3\n supports a set of predefined ACLs, known as canned\n ACLs. Each canned ACL has a predefined set of grantees and\n permissions. Specify the canned ACL name as the value of\n x-amz-acl. If you use this header, you cannot use other\n access control-specific headers in your request. For more information, see\n Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers,\n you specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3\n groups) who will receive the permission. If you use these ACL-specific\n headers, you cannot use the x-amz-acl header to set a canned\n ACL. These parameters map to the set of permissions that Amazon S3 supports in an\n ACL. For more information, see Access Control List (ACL)\n Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-write header grants\n create, overwrite, and delete objects permission to LogDelivery group\n predefined by Amazon S3 and two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-write:\n uri=\"http://acs.amazonaws.com/groups/s3/LogDelivery\", id=\"111122223333\",\n id=\"555566667777\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights\n (using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>&\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET\n Object acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
\n

The following operations are related to PutBucketAcl:

\n ", "smithy.api#examples": [ { "title": "Put bucket acl", @@ -31841,7 +26890,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Sets an analytics configuration for the bucket (specified by the analytics configuration\n ID). You can have up to 1,000 analytics configurations per bucket.

\n

You can choose to have storage class analysis export analysis reports sent to a\n comma-separated values (CSV) flat file. See the DataExport request element.\n Reports are updated daily and are based on the object filters that you configure. When\n selecting data export, you specify a destination bucket and an optional destination prefix\n where the file is written. You can export the data to a destination bucket in a different\n account. However, the destination bucket must be in the same Region as the bucket that you\n are making the PUT analytics configuration to. For more information, see Amazon S3\n Analytics – Storage Class Analysis.

\n \n

You must create a bucket policy on the destination bucket where the exported file is\n written to grant permissions to Amazon S3 to write objects to the bucket. For an example\n policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketAnalyticsConfiguration has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: InvalidArgument\n

      \n
    • \n
    • \n

      \n Cause: Invalid argument.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: TooManyConfigurations\n

      \n
    • \n
    • \n

      \n Cause: You are attempting to create a new configuration but have\n already reached the 1,000-configuration limit.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 403 Forbidden\n

      \n
    • \n
    • \n

      \n Code: AccessDenied\n

      \n
    • \n
    • \n

      \n Cause: You are not the owner of the specified bucket, or you do\n not have the s3:PutAnalyticsConfiguration bucket permission to set the\n configuration on the bucket.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutBucketAnalyticsConfiguration:

\n ", + "smithy.api#documentation": "

Sets an analytics configuration for the bucket (specified by the analytics configuration\n ID). You can have up to 1,000 analytics configurations per bucket.

\n

You can choose to have storage class analysis export analysis reports sent to a\n comma-separated values (CSV) flat file. See the DataExport request element.\n Reports are updated daily and are based on the object filters that you configure. When\n selecting data export, you specify a destination bucket and an optional destination prefix\n where the file is written. You can export the data to a destination bucket in a different\n account. However, the destination bucket must be in the same Region as the bucket that you\n are making the PUT analytics configuration to. For more information, see Amazon S3\n Analytics – Storage Class Analysis.

\n \n

You must create a bucket policy on the destination bucket where the exported file is\n written to grant permissions to Amazon S3 to write objects to the bucket. For an example\n policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutAnalyticsConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketAnalyticsConfiguration has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: InvalidArgument\n

      \n
    • \n
    • \n

      \n Cause: Invalid argument.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 400 Bad Request\n

      \n
    • \n
    • \n

      \n Code: TooManyConfigurations\n

      \n
    • \n
    • \n

      \n Cause: You are attempting to create a new configuration but have\n already reached the 1,000-configuration limit.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n HTTP Error: HTTP 403 Forbidden\n

      \n
    • \n
    • \n

      \n Code: AccessDenied\n

      \n
    • \n
    • \n

      \n Cause: You are not the owner of the specified bucket, or you do\n not have the s3:PutAnalyticsConfiguration bucket permission to set the\n configuration on the bucket.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to\n PutBucketAnalyticsConfiguration:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?analytics", @@ -32018,7 +27067,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

This action uses the encryption subresource to configure default encryption\n and Amazon S3 Bucket Keys for an existing bucket.

\n

By default, all buckets have a default encryption configuration that uses server-side\n encryption with Amazon S3 managed keys (SSE-S3). You can optionally configure default encryption\n for a bucket by using server-side encryption with Key Management Service (KMS) keys (SSE-KMS),\n dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or server-side\n encryption with customer-provided keys (SSE-C). If you specify default encryption by using\n SSE-KMS, you can also configure Amazon S3 Bucket Keys. For information about bucket default\n encryption, see Amazon S3 bucket default encryption\n in the Amazon S3 User Guide. For more information about S3 Bucket Keys, see\n Amazon S3 Bucket\n Keys in the Amazon S3 User Guide.

\n \n

This action requires Amazon Web Services Signature Version 4. For more information, see \n Authenticating Requests (Amazon Web Services Signature Version 4).

\n
\n

To use this operation, you must have permission to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to PutBucketEncryption:

\n ", + "smithy.api#documentation": "

This action uses the encryption subresource to configure default encryption\n and Amazon S3 Bucket Keys for an existing bucket.

\n

By default, all buckets have a default encryption configuration that uses server-side\n encryption with Amazon S3 managed keys (SSE-S3). You can optionally configure default encryption\n for a bucket by using server-side encryption with Key Management Service (KMS) keys (SSE-KMS) or\n dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS). If you specify default encryption by using\n SSE-KMS, you can also configure Amazon S3 Bucket\n Keys. If you use PutBucketEncryption to set your default bucket encryption to SSE-KMS, you should verify that your KMS key ID is correct. Amazon S3 does not validate the KMS key ID provided in PutBucketEncryption requests.

\n \n

This action requires Amazon Web Services Signature Version 4. For more information, see \n Authenticating Requests (Amazon Web Services Signature Version 4).

\n
\n

To use this operation, you must have permission to perform the\n s3:PutEncryptionConfiguration action. The bucket owner has this permission\n by default. The bucket owner can grant this permission to others. For more information\n about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n

The following operations are related to PutBucketEncryption:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?encryption", @@ -32083,7 +27132,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can have up to\n 1,000 S3 Intelligent-Tiering configurations per bucket.

\n

The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.

\n

The S3 Intelligent-Tiering storage class is the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.

\n

For more information, see Storage class for automatically optimizing frequently and infrequently accessed objects.

\n

Operations related to PutBucketIntelligentTieringConfiguration include:

\n \n \n

You only need S3 Intelligent-Tiering enabled on a bucket if you want to automatically\n move objects stored in the S3 Intelligent-Tiering storage class to the Archive Access\n or Deep Archive Access tier.

\n
\n

\n PutBucketIntelligentTieringConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket,\n or you do not have the s3:PutIntelligentTieringConfiguration\n bucket permission to set the configuration on the bucket.

\n
\n
", + "smithy.api#documentation": "

Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can have up to\n 1,000 S3 Intelligent-Tiering configurations per bucket.

\n

The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.

\n

The S3 Intelligent-Tiering storage class is the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.

\n

For more information, see Storage class for automatically optimizing frequently and infrequently accessed objects.

\n

Operations related to PutBucketIntelligentTieringConfiguration include:

\n \n \n

You only need S3 Intelligent-Tiering enabled on a bucket if you want to automatically\n move objects stored in the S3 Intelligent-Tiering storage class to the Archive Access\n or Deep Archive Access tier.

\n
\n

\n PutBucketIntelligentTieringConfiguration has the following special\n errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket, or\n you do not have the s3:PutIntelligentTieringConfiguration bucket\n permission to set the configuration on the bucket.

\n
\n
", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?intelligent-tiering", @@ -32136,7 +27185,7 @@ "target": "smithy.api#Unit" }, "traits": { - "smithy.api#documentation": "

This implementation of the PUT action adds an inventory configuration\n (identified by the inventory ID) to the bucket. You can have up to 1,000 inventory\n configurations per bucket.

\n

Amazon S3 inventory generates inventories of the objects in the bucket on a daily or weekly\n basis, and the results are published to a flat file. The bucket that is inventoried is\n called the source bucket, and the bucket where the inventory flat file\n is stored is called the destination bucket. The\n destination bucket must be in the same Amazon Web Services Region as the\n source bucket.

\n

When you configure an inventory for a source bucket, you specify\n the destination bucket where you want the inventory to be stored, and\n whether to generate the inventory daily or weekly. You can also configure what object\n metadata to include and whether to inventory all object versions or only current versions.\n For more information, see Amazon S3 Inventory in the\n Amazon S3 User Guide.

\n \n

You must create a bucket policy on the destination bucket to\n grant permissions to Amazon S3 to write objects to the bucket in the defined location. For an\n example policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n
\n
Permissions
\n
\n

To use this operation, you must have permission to perform the\n s3:PutInventoryConfiguration action. The bucket owner has this permission\n by default and can grant this permission to others.

\n

The s3:PutInventoryConfiguration permission allows a user to create an\n S3\n Inventory report that includes all object metadata fields available and to\n specify the destination bucket to store the inventory. A user with read access to objects\n in the destination bucket can also access all object metadata fields that are available in\n the inventory report.

\n

To restrict access to an inventory report, see Restricting access to an Amazon S3 Inventory report in the\n Amazon S3 User Guide. For more information about the metadata fields\n available in S3 Inventory, see Amazon S3\n Inventory lists in the Amazon S3 User Guide. For more\n information about permissions, see Permissions related to bucket subresource operations and Identity and\n access management in Amazon S3 in the Amazon S3 User Guide.

\n
\n
\n

\n PutBucketInventoryConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket,\n or you do not have the s3:PutInventoryConfiguration bucket\n permission to set the configuration on the bucket.

\n
\n
\n

The following operations are related to PutBucketInventoryConfiguration:

\n ", + "smithy.api#documentation": "

This implementation of the PUT action adds an inventory configuration\n (identified by the inventory ID) to the bucket. You can have up to 1,000 inventory\n configurations per bucket.

\n

Amazon S3 inventory generates inventories of the objects in the bucket on a daily or weekly\n basis, and the results are published to a flat file. The bucket that is inventoried is\n called the source bucket, and the bucket where the inventory flat file\n is stored is called the destination bucket. The\n destination bucket must be in the same Amazon Web Services Region as the\n source bucket.

\n

When you configure an inventory for a source bucket, you specify\n the destination bucket where you want the inventory to be stored, and\n whether to generate the inventory daily or weekly. You can also configure what object\n metadata to include and whether to inventory all object versions or only current versions.\n For more information, see Amazon S3 Inventory in the\n Amazon S3 User Guide.

\n \n

You must create a bucket policy on the destination bucket to\n grant permissions to Amazon S3 to write objects to the bucket in the defined location. For an\n example policy, see Granting Permissions for Amazon S3 Inventory and Storage Class Analysis.

\n
\n
\n
Permissions
\n
\n

To use this operation, you must have permission to perform the\n s3:PutInventoryConfiguration action. The bucket owner has this\n permission by default and can grant this permission to others.

\n

The s3:PutInventoryConfiguration permission allows a user to\n create an S3 Inventory\n report that includes all object metadata fields available and to specify the\n destination bucket to store the inventory. A user with read access to objects in\n the destination bucket can also access all object metadata fields that are\n available in the inventory report.

\n

To restrict access to an inventory report, see Restricting access to an Amazon S3 Inventory report in the\n Amazon S3 User Guide. For more information about the metadata\n fields available in S3 Inventory, see Amazon S3 Inventory lists in the Amazon S3 User Guide. For\n more information about permissions, see Permissions related to bucket subresource operations and Identity and access management in Amazon S3 in the\n Amazon S3 User Guide.

\n
\n
\n

\n PutBucketInventoryConfiguration has the following special errors:

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: InvalidArgument

\n

\n Cause: Invalid Argument

\n
\n
HTTP 400 Bad Request Error
\n
\n

\n Code: TooManyConfigurations

\n

\n Cause: You are attempting to create a new configuration\n but have already reached the 1,000-configuration limit.

\n
\n
HTTP 403 Forbidden Error
\n
\n

\n Cause: You are not the owner of the specified bucket, or\n you do not have the s3:PutInventoryConfiguration bucket permission to\n set the configuration on the bucket.

\n
\n
\n

The following operations are related to\n PutBucketInventoryConfiguration:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?inventory", @@ -32200,7 +27249,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\n configuration. Keep in mind that this will overwrite an existing lifecycle configuration,\n so if you want to retain any configuration details, they must be included in the new\n lifecycle configuration. For information about lifecycle configuration, see Managing\n your storage lifecycle.

\n \n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The previous version of the API supported\n filtering based only on an object key name prefix, which is supported for backward\n compatibility. For the related API description, see PutBucketLifecycle.

\n
\n
\n
Rules
\n
\n

You specify the lifecycle configuration in your request body. The lifecycle\n configuration is specified as XML consisting of one or more rules. An Amazon S3 Lifecycle\n configuration can have up to 1,000 rules. This limit is not adjustable. Each rule consists\n of the following:

\n
    \n
  • \n

    A filter identifying a subset of objects to which the rule applies. The filter can\n be based on a key name prefix, object tags, or a combination of both.

    \n
  • \n
  • \n

    A status indicating whether the rule is in effect.

    \n
  • \n
  • \n

    One or more lifecycle transition and expiration actions that you want Amazon S3 to\n perform on the objects identified by the filter. If the state of your bucket is\n versioning-enabled or versioning-suspended, you can have many versions of the same\n object (one current version and zero or more noncurrent versions). Amazon S3 provides\n predefined actions that you can specify for current and noncurrent object\n versions.

    \n
  • \n
\n

For more information, see Object Lifecycle Management\n and Lifecycle Configuration Elements.

\n
\n
Permissions
\n
\n

By default, all Amazon S3 resources are private, including buckets, objects, and related\n subresources (for example, lifecycle configuration and website configuration). Only the\n resource owner (that is, the Amazon Web Services account that created it) can access the resource. The\n resource owner can optionally grant access permissions to others by writing an access\n policy. For this operation, a user must get the s3:PutLifecycleConfiguration\n permission.

\n

You can also explicitly deny permissions. An explicit deny also supersedes any other\n permissions. If you want to block users or accounts from removing or deleting objects from\n your bucket, you must deny them permissions for the following actions:

\n
    \n
  • \n

    \n s3:DeleteObject\n

    \n
  • \n
  • \n

    \n s3:DeleteObjectVersion\n

    \n
  • \n
  • \n

    \n s3:PutLifecycleConfiguration\n

    \n
  • \n
\n

For more information about permissions, see Managing Access Permissions to\n Your Amazon S3 Resources.

\n
\n
\n

The following operations are related to PutBucketLifecycleConfiguration:

\n ", + "smithy.api#documentation": "

Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\n configuration. Keep in mind that this will overwrite an existing lifecycle configuration,\n so if you want to retain any configuration details, they must be included in the new\n lifecycle configuration. For information about lifecycle configuration, see Managing\n your storage lifecycle.

\n \n

Bucket lifecycle configuration now supports specifying a lifecycle rule using an\n object key name prefix, one or more object tags, or a combination of both. Accordingly,\n this section describes the latest API. The previous version of the API supported\n filtering based only on an object key name prefix, which is supported for backward\n compatibility. For the related API description, see PutBucketLifecycle.

\n
\n
\n
Rules
\n
\n

You specify the lifecycle configuration in your request body. The lifecycle\n configuration is specified as XML consisting of one or more rules. An Amazon S3\n Lifecycle configuration can have up to 1,000 rules. This limit is not adjustable.\n Each rule consists of the following:

\n
    \n
  • \n

    A filter identifying a subset of objects to which the rule applies. The\n filter can be based on a key name prefix, object tags, or a combination of\n both.

    \n
  • \n
  • \n

    A status indicating whether the rule is in effect.

    \n
  • \n
  • \n

    One or more lifecycle transition and expiration actions that you want\n Amazon S3 to perform on the objects identified by the filter. If the state of\n your bucket is versioning-enabled or versioning-suspended, you can have many\n versions of the same object (one current version and zero or more noncurrent\n versions). Amazon S3 provides predefined actions that you can specify for current\n and noncurrent object versions.

    \n
  • \n
\n

For more information, see Object Lifecycle\n Management and Lifecycle Configuration\n Elements.

\n
\n
Permissions
\n
\n

By default, all Amazon S3 resources are private, including buckets, objects, and\n related subresources (for example, lifecycle configuration and website\n configuration). Only the resource owner (that is, the Amazon Web Services account that created\n it) can access the resource. The resource owner can optionally grant access\n permissions to others by writing an access policy. For this operation, a user must\n get the s3:PutLifecycleConfiguration permission.

\n

You can also explicitly deny permissions. An explicit deny also supersedes any\n other permissions. If you want to block users or accounts from removing or\n deleting objects from your bucket, you must deny them permissions for the\n following actions:

\n
    \n
  • \n

    \n s3:DeleteObject\n

    \n
  • \n
  • \n

    \n s3:DeleteObjectVersion\n

    \n
  • \n
  • \n

    \n s3:PutLifecycleConfiguration\n

    \n
  • \n
\n

For more information about permissions, see Managing Access\n Permissions to Your Amazon S3 Resources.

\n
\n
\n

The following operations are related to\n PutBucketLifecycleConfiguration:

\n ", "smithy.api#examples": [ { "title": "Put bucket lifecycle", @@ -32291,7 +27340,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Set the logging parameters for a bucket and to specify permissions for who can view and\n modify the logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as\n the source bucket. To set the logging status of a bucket, you must be the bucket\n owner.

\n

The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n Grantee request element to grant access to other people. The\n Permissions request element specifies the kind of access the grantee has to\n the logs.

\n \n

If the target bucket for log delivery uses the bucket owner enforced setting for S3\n Object Ownership, you can't use the Grantee request element to grant access\n to others. Permissions can only be granted using policies. For more information, see\n Permissions for server access log delivery in the\n Amazon S3 User Guide.

\n
\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (by using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    \n DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GETObjectAcl\n request, appears as the CanonicalUser.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
\n
\n
\n

To enable logging, you use LoggingEnabled and its children request elements. To disable\n logging, you use an empty BucketLoggingStatus request element:

\n

\n \n

\n

For more information about server access logging, see Server Access Logging in the\n Amazon S3 User Guide.

\n

For more information about creating a bucket, see CreateBucket. For more\n information about returning the logging status of a bucket, see GetBucketLogging.

\n

The following operations are related to PutBucketLogging:

\n ", + "smithy.api#documentation": "

Set the logging parameters for a bucket and to specify permissions for who can view and\n modify the logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as\n the source bucket. To set the logging status of a bucket, you must be the bucket\n owner.

\n

The bucket owner is automatically granted FULL_CONTROL to all logs. You use the\n Grantee request element to grant access to other people. The\n Permissions request element specifies the kind of access the grantee has to\n the logs.

\n \n

If the target bucket for log delivery uses the bucket owner enforced setting for S3\n Object Ownership, you can't use the Grantee request element to grant access\n to others. Permissions can only be granted using policies. For more information, see\n Permissions for server access log delivery in the\n Amazon S3 User Guide.

\n
\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (by\n using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    \n DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a\n response to a GETObjectAcl request, appears as the\n CanonicalUser.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
\n
\n
\n

To enable logging, you use LoggingEnabled and its children request\n elements. To disable logging, you use an empty BucketLoggingStatus request\n element:

\n

\n \n

\n

For more information about server access logging, see Server Access Logging in the\n Amazon S3 User Guide.

\n

For more information about creating a bucket, see CreateBucket. For more\n information about returning the logging status of a bucket, see GetBucketLogging.

\n

The following operations are related to PutBucketLogging:

\n ", "smithy.api#examples": [ { "title": "Set logging configuration for a bucket", @@ -32585,7 +27634,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than\n the root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n PutBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked from performing \n these API actions by VPC endpoint policies and Amazon Web Services Organizations policies.

\n
\n

For more information, see Bucket policy\n examples.

\n

The following operations are related to PutBucketPolicy:

\n ", + "smithy.api#documentation": "

Applies an Amazon S3 bucket policy to an Amazon S3 bucket. If you are using an identity other than\n the root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\n PutBucketPolicy permissions on the specified bucket and belong to the\n bucket owner's account in order to use this operation.

\n

If you don't have PutBucketPolicy permissions, Amazon S3 returns a 403\n Access Denied error. If you have the correct permissions, but you're not using an\n identity that belongs to the bucket owner's account, Amazon S3 returns a 405 Method Not\n Allowed error.

\n \n

To ensure that bucket owners don't inadvertently lock themselves out of their own\n buckets, the root principal in a bucket owner's Amazon Web Services account can perform the\n GetBucketPolicy, PutBucketPolicy, and\n DeleteBucketPolicy API actions, even if their bucket policy explicitly\n denies the root principal's access. Bucket owner root principals can only be blocked\n from performing these API actions by VPC endpoint policies and Amazon Web Services Organizations\n policies.

\n
\n

For more information, see Bucket policy\n examples.

\n

The following operations are related to PutBucketPolicy:

\n ", "smithy.api#examples": [ { "title": "Set bucket policy", @@ -32672,7 +27721,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates a replication configuration or replaces an existing one. For more information,\n see Replication in the Amazon S3 User Guide.

\n

Specify the replication configuration in the request body. In the replication\n configuration, you provide the name of the destination bucket or buckets where you want\n Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume to replicate objects on your\n behalf, and other relevant information.

\n

A replication configuration must include at least one rule, and can contain a maximum of\n 1,000. Each rule identifies a subset of objects to replicate by filtering the objects in\n the source bucket. To choose additional subsets of objects to replicate, add a rule for\n each subset.

\n

To specify a subset of the objects in the source bucket to apply a replication rule to,\n add the Filter element as a child of the Rule element. You can filter objects based on an\n object key prefix, one or more object tags, or both. When you add the Filter element in the\n configuration, you must also add the following elements:\n DeleteMarkerReplication, Status, and\n Priority.

\n \n

If you are using an earlier version of the replication configuration, Amazon S3 handles\n replication of delete markers differently. For more information, see Backward Compatibility.

\n
\n

For information about enabling versioning on a bucket, see Using Versioning.

\n
\n
Handling Replication of Encrypted Objects
\n
\n

By default, Amazon S3 doesn't replicate objects that are stored at rest using server-side\n encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects, add the following:\n SourceSelectionCriteria, SseKmsEncryptedObjects,\n Status, EncryptionConfiguration, and\n ReplicaKmsKeyID. For information about replication configuration, see\n Replicating Objects\n Created with SSE Using KMS keys.

\n

For information on PutBucketReplication errors, see List of\n replication-related error codes\n

\n
\n
Permissions
\n
\n

To create a PutBucketReplication request, you must have\n s3:PutReplicationConfiguration permissions for the bucket.\n \n

\n

By default, a resource owner, in this case the Amazon Web Services account that created the bucket,\n can perform this operation. The resource owner can also grant others permissions to perform\n the operation. For more information about permissions, see Specifying Permissions in a\n Policy and Managing Access Permissions to\n Your Amazon S3 Resources.

\n \n

To perform this operation, the user or role performing the action must have the\n iam:PassRole permission.

\n
\n
\n
\n

The following operations are related to PutBucketReplication:

\n ", + "smithy.api#documentation": "

Creates a replication configuration or replaces an existing one. For more information,\n see Replication in the Amazon S3 User Guide.

\n

Specify the replication configuration in the request body. In the replication\n configuration, you provide the name of the destination bucket or buckets where you want\n Amazon S3 to replicate objects, the IAM role that Amazon S3 can assume to replicate objects on your\n behalf, and other relevant information. You can invoke this request for a specific\n Amazon Web Services Region by using the \n \n aws:RequestedRegion\n condition key.

\n

A replication configuration must include at least one rule, and can contain a maximum of\n 1,000. Each rule identifies a subset of objects to replicate by filtering the objects in\n the source bucket. To choose additional subsets of objects to replicate, add a rule for\n each subset.

\n

To specify a subset of the objects in the source bucket to apply a replication rule to,\n add the Filter element as a child of the Rule element. You can filter objects based on an\n object key prefix, one or more object tags, or both. When you add the Filter element in the\n configuration, you must also add the following elements:\n DeleteMarkerReplication, Status, and\n Priority.

\n \n

If you are using an earlier version of the replication configuration, Amazon S3 handles\n replication of delete markers differently. For more information, see Backward Compatibility.

\n
\n

For information about enabling versioning on a bucket, see Using Versioning.

\n
\n
Handling Replication of Encrypted Objects
\n
\n

By default, Amazon S3 doesn't replicate objects that are stored at rest using\n server-side encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects,\n add the following: SourceSelectionCriteria,\n SseKmsEncryptedObjects, Status,\n EncryptionConfiguration, and ReplicaKmsKeyID. For\n information about replication configuration, see Replicating\n Objects Created with SSE Using KMS keys.

\n

For information on PutBucketReplication errors, see List of\n replication-related error codes\n

\n
\n
Permissions
\n
\n

To create a PutBucketReplication request, you must have\n s3:PutReplicationConfiguration permissions for the bucket.\n \n

\n

By default, a resource owner, in this case the Amazon Web Services account that created the\n bucket, can perform this operation. The resource owner can also grant others\n permissions to perform the operation. For more information about permissions, see\n Specifying Permissions in\n a Policy and Managing Access\n Permissions to Your Amazon S3 Resources.

\n \n

To perform this operation, the user or role performing the action must have\n the iam:PassRole\n permission.

\n
\n
\n
\n

The following operations are related to PutBucketReplication:

\n ", "smithy.api#examples": [ { "title": "Set replication configuration on a bucket", @@ -32852,7 +27901,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the tags for a bucket.

\n

Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\n sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\n of combined resources, organize your billing information according to resources with the\n same tag key values. For example, you can tag several resources with a specific application\n name, and then organize your billing information to see the total cost of that application\n across several services. For more information, see Cost Allocation and\n Tagging and Using Cost Allocation in Amazon S3 Bucket\n Tags.

\n \n

When this operation sets the tags for a bucket, it will overwrite any current tags\n the bucket already has. You cannot use this operation to add tags to an existing list of\n tags.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutBucketTagging action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketTagging has the following special errors:

\n
    \n
  • \n

    Error code: InvalidTagError\n

    \n \n
  • \n
  • \n

    Error code: MalformedXMLError\n

    \n
      \n
    • \n

      Description: The XML provided does not match the schema.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: OperationAbortedError \n

    \n
      \n
    • \n

      Description: A conflicting conditional action is currently in progress\n against this resource. Please try again.

      \n
    • \n
    \n
  • \n
  • \n

    Error code: InternalError\n

    \n
      \n
    • \n

      Description: The service was unable to apply the provided tag to the\n bucket.

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutBucketTagging:

\n ", + "smithy.api#documentation": "

Sets the tags for a bucket.

\n

Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\n sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\n of combined resources, organize your billing information according to resources with the\n same tag key values. For example, you can tag several resources with a specific application\n name, and then organize your billing information to see the total cost of that application\n across several services. For more information, see Cost Allocation and\n Tagging and Using Cost Allocation in Amazon S3\n Bucket Tags.

\n \n

When this operation sets the tags for a bucket, it will overwrite any current tags\n the bucket already has. You cannot use this operation to add tags to an existing list of\n tags.

\n
\n

To use this operation, you must have permissions to perform the\n s3:PutBucketTagging action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources.

\n

\n PutBucketTagging has the following special errors. For more Amazon S3 errors\n see, Error\n Responses.

\n
    \n
  • \n

    \n InvalidTag - The tag provided was not a valid tag. This error\n can occur if the tag did not pass input validation. For more information, see Using\n Cost Allocation in Amazon S3 Bucket Tags.

    \n
  • \n
  • \n

    \n MalformedXML - The XML provided does not match the\n schema.

    \n
  • \n
  • \n

    \n OperationAborted - A conflicting conditional action is\n currently in progress against this resource. Please try again.

    \n
  • \n
  • \n

    \n InternalError - The service was unable to apply the provided\n tag to the bucket.

    \n
  • \n
\n

The following operations are related to PutBucketTagging:

\n ", "smithy.api#examples": [ { "title": "Set tags on a bucket", @@ -32943,7 +27992,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the versioning state of an existing bucket.

\n

You can set the versioning state with one of the following values:

\n

\n Enabled—Enables versioning for the objects in the\n bucket. All objects added to the bucket receive a unique version ID.

\n

\n Suspended—Disables versioning for the objects in the\n bucket. All objects added to the bucket receive the version ID null.

\n

If the versioning state has never been set on a bucket, it has no versioning state; a\n GetBucketVersioning request does not return a versioning state value.

\n

In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner\n and want to enable MFA Delete in the bucket versioning configuration, you must include the\n x-amz-mfa request header and the Status and the\n MfaDelete request elements in a request to set the versioning state of the\n bucket.

\n \n

If you have an object expiration lifecycle configuration in your non-versioned bucket and\n you want to maintain the same permanent delete behavior when you enable versioning, you\n must add a noncurrent expiration policy. The noncurrent expiration lifecycle configuration will\n manage the deletes of the noncurrent object versions in the version-enabled bucket. (A\n version-enabled bucket maintains one current and zero or more noncurrent object\n versions.) For more information, see Lifecycle and Versioning.

\n
\n

The following operations are related to PutBucketVersioning:

\n ", + "smithy.api#documentation": "

Sets the versioning state of an existing bucket.

\n

You can set the versioning state with one of the following values:

\n

\n Enabled—Enables versioning for the objects in the\n bucket. All objects added to the bucket receive a unique version ID.

\n

\n Suspended—Disables versioning for the objects in the\n bucket. All objects added to the bucket receive the version ID null.

\n

If the versioning state has never been set on a bucket, it has no versioning state; a\n GetBucketVersioning request does not return a versioning state value.

\n

In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner\n and want to enable MFA Delete in the bucket versioning configuration, you must include the\n x-amz-mfa request header and the Status and the\n MfaDelete request elements in a request to set the versioning state of the\n bucket.

\n \n

If you have an object expiration lifecycle configuration in your non-versioned bucket\n and you want to maintain the same permanent delete behavior when you enable versioning,\n you must add a noncurrent expiration policy. The noncurrent expiration lifecycle\n configuration will manage the deletes of the noncurrent object versions in the\n version-enabled bucket. (A version-enabled bucket maintains one current and zero or more\n noncurrent object versions.) For more information, see Lifecycle and Versioning.

\n
\n

The following operations are related to PutBucketVersioning:

\n ", "smithy.api#examples": [ { "title": "Set versioning configuration on a bucket", @@ -33033,7 +28082,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the configuration of the website that is specified in the website\n subresource. To configure a bucket as a website, you can add this subresource on the bucket\n with website configuration information such as the file name of the index document and any\n redirect rules. For more information, see Hosting Websites on Amazon S3.

\n

This PUT action requires the S3:PutBucketWebsite permission. By default,\n only the bucket owner can configure the website attached to a bucket; however, bucket\n owners can allow other users to set the website configuration by writing a bucket policy\n that grants them the S3:PutBucketWebsite permission.

\n

To redirect all website requests sent to the bucket's website endpoint, you add a\n website configuration with the following elements. Because all requests are sent to another\n website, you don't need to provide index document name for the bucket.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n RedirectAllRequestsTo\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
\n

If you want granular control over redirects, you can use the following elements to add\n routing rules that describe conditions for redirecting requests and information about the\n redirect destination. In this case, the website configuration must provide an index\n document for the bucket, because some requests might not be redirected.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n IndexDocument\n

    \n
  • \n
  • \n

    \n Suffix\n

    \n
  • \n
  • \n

    \n ErrorDocument\n

    \n
  • \n
  • \n

    \n Key\n

    \n
  • \n
  • \n

    \n RoutingRules\n

    \n
  • \n
  • \n

    \n RoutingRule\n

    \n
  • \n
  • \n

    \n Condition\n

    \n
  • \n
  • \n

    \n HttpErrorCodeReturnedEquals\n

    \n
  • \n
  • \n

    \n KeyPrefixEquals\n

    \n
  • \n
  • \n

    \n Redirect\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n ReplaceKeyPrefixWith\n

    \n
  • \n
  • \n

    \n ReplaceKeyWith\n

    \n
  • \n
  • \n

    \n HttpRedirectCode\n

    \n
  • \n
\n

Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more\n than 50 routing rules, you can use object redirect. For more information, see Configuring an\n Object Redirect in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Sets the configuration of the website that is specified in the website\n subresource. To configure a bucket as a website, you can add this subresource on the bucket\n with website configuration information such as the file name of the index document and any\n redirect rules. For more information, see Hosting Websites on Amazon S3.

\n

This PUT action requires the S3:PutBucketWebsite permission. By default,\n only the bucket owner can configure the website attached to a bucket; however, bucket\n owners can allow other users to set the website configuration by writing a bucket policy\n that grants them the S3:PutBucketWebsite permission.

\n

To redirect all website requests sent to the bucket's website endpoint, you add a\n website configuration with the following elements. Because all requests are sent to another\n website, you don't need to provide index document name for the bucket.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n RedirectAllRequestsTo\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
\n

If you want granular control over redirects, you can use the following elements to add\n routing rules that describe conditions for redirecting requests and information about the\n redirect destination. In this case, the website configuration must provide an index\n document for the bucket, because some requests might not be redirected.

\n
    \n
  • \n

    \n WebsiteConfiguration\n

    \n
  • \n
  • \n

    \n IndexDocument\n

    \n
  • \n
  • \n

    \n Suffix\n

    \n
  • \n
  • \n

    \n ErrorDocument\n

    \n
  • \n
  • \n

    \n Key\n

    \n
  • \n
  • \n

    \n RoutingRules\n

    \n
  • \n
  • \n

    \n RoutingRule\n

    \n
  • \n
  • \n

    \n Condition\n

    \n
  • \n
  • \n

    \n HttpErrorCodeReturnedEquals\n

    \n
  • \n
  • \n

    \n KeyPrefixEquals\n

    \n
  • \n
  • \n

    \n Redirect\n

    \n
  • \n
  • \n

    \n Protocol\n

    \n
  • \n
  • \n

    \n HostName\n

    \n
  • \n
  • \n

    \n ReplaceKeyPrefixWith\n

    \n
  • \n
  • \n

    \n ReplaceKeyWith\n

    \n
  • \n
  • \n

    \n HttpRedirectCode\n

    \n
  • \n
\n

Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more\n than 50 routing rules, you can use object redirect. For more information, see Configuring an\n Object Redirect in the Amazon S3 User Guide.

\n

The maximum request length is limited to 128 KB.

", "smithy.api#examples": [ { "title": "Set website configuration on a bucket", @@ -33123,17 +28172,19 @@ "smithy.api#documentation": "

Adds an object to a bucket. You must have WRITE permissions on a bucket to add an object\n to it.

\n \n

Amazon S3 never adds partial objects; if you receive a success response, Amazon S3 added the\n entire object to the bucket. You cannot use PutObject to only update a\n single piece of metadata for an existing object. You must put the entire object with\n updated metadata if you want to update some values.

\n
\n

Amazon S3 is a distributed system. If it receives multiple write requests for the same object\n simultaneously, it overwrites all but the last object written. To prevent objects from\n being deleted or overwritten, you can use Amazon S3 Object\n Lock.

\n

To ensure that data is not corrupted traversing the network, use the\n Content-MD5 header. When you use this header, Amazon S3 checks the object\n against the provided MD5 value and, if they do not match, returns an error. Additionally,\n you can calculate the MD5 while putting an object to Amazon S3 and compare the returned ETag to\n the calculated MD5 value.

\n \n
    \n
  • \n

    To successfully complete the PutObject request, you must have the\n s3:PutObject in your IAM permissions.

    \n
  • \n
  • \n

    To successfully change the objects acl of your PutObject request,\n you must have the s3:PutObjectAcl in your IAM permissions.

    \n
  • \n
  • \n

    To successfully set the tag-set with your PutObject request, you\n must have the s3:PutObjectTagging in your IAM permissions.

    \n
  • \n
  • \n

    The Content-MD5 header is required for any request to upload an\n object with a retention period configured using Amazon S3 Object Lock. For more\n information about Amazon S3 Object Lock, see Amazon S3 Object Lock\n Overview in the Amazon S3 User Guide.

    \n
  • \n
\n
\n

You have four mutually exclusive options to protect data using server-side encryption in\n Amazon S3, depending on how you choose to manage the encryption keys. Specifically, the\n encryption key options are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys (SSE-KMS or\n DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with server-side\n encryption by using Amazon S3 managed keys (SSE-S3) by default. You can optionally tell Amazon S3 to\n encrypt data at rest by using server-side encryption with other key options. For more\n information, see Using Server-Side\n Encryption.

\n

When adding a new object, you can use headers to grant ACL-based permissions to\n individual Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are\n then added to the ACL on the object. By default, all objects are private. Only the owner\n has full access control. For more information, see Access Control List (ACL) Overview\n and Managing\n ACLs Using the REST API.

\n

If the bucket that you're uploading objects to uses the bucket owner enforced setting\n for S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that\n use this setting only accept PUT requests that don't specify an ACL or PUT requests that\n specify bucket owner full control ACLs, such as the bucket-owner-full-control\n canned ACL or an equivalent form of this ACL expressed in the XML format. PUT requests that\n contain other ACLs (for example, custom grants to certain Amazon Web Services accounts) fail and return a\n 400 error with the error code AccessControlListNotSupported.\n For more information, see Controlling ownership of\n objects and disabling ACLs in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for Object Ownership, all\n objects written to the bucket by any account will be owned by the bucket owner.

\n
\n

By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The\n STANDARD storage class provides high durability and high availability. Depending on\n performance needs, you can specify a different Storage Class. Amazon S3 on Outposts only uses\n the OUTPOSTS Storage Class. For more information, see Storage Classes in the\n Amazon S3 User Guide.

\n

If you enable versioning for a bucket, Amazon S3 automatically generates a unique version ID\n for the object being stored. Amazon S3 returns this ID in the response. When you enable\n versioning for a bucket, if Amazon S3 receives multiple write requests for the same object\n simultaneously, it stores all of the objects. For more information about versioning, see\n Adding Objects to\n Versioning-Enabled Buckets. For information about returning the versioning state\n of a bucket, see GetBucketVersioning.

\n

For more information about related Amazon S3 APIs, see the following:

\n ", "smithy.api#examples": [ { - "title": "To upload an object and specify optional tags", - "documentation": "The following example uploads an object. The request specifies optional object tags. The bucket is versioned, therefore S3 returns version ID of the newly created object.", + "title": "To upload an object and specify server-side encryption and object tags", + "documentation": "The following example uploads an object. The request specifies the optional server-side encryption option. The request also specifies optional object tags. If the bucket is versioning enabled, S3 returns version ID in response.", "input": { - "Body": "c:\\HappyFace.jpg", + "Body": "filetoupload", "Bucket": "examplebucket", - "Key": "HappyFace.jpg", + "Key": "exampleobject", + "ServerSideEncryption": "AES256", "Tagging": "key1=value1&key2=value2" }, "output": { - "VersionId": "psM2sYY4.o1501dSx8wMvnkOzSBB.V4a", - "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"" + "VersionId": "Ri.vC6qVlA4dEnjgRV4ZHsHoFIjqEMNt", + "ETag": "\"6805f2cfc46c0f04559748bb039d69ae\"", + "ServerSideEncryption": "AES256" } } ], @@ -33162,7 +28213,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Uses the acl subresource to set the access control list (ACL) permissions\n for a new or existing object in an S3 bucket. You must have WRITE_ACP\n permission to set the ACL of an object. For more information, see What\n permissions can I grant? in the Amazon S3 User Guide.

\n

This action is not supported by Amazon S3 on Outposts.

\n

Depending on your application needs, you can choose to set the ACL on an object using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, you can continue to use that approach.\n For more information, see Access Control List (ACL) Overview\n in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3 supports\n a set of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined set\n of grantees and permissions. Specify the canned ACL name as the value of\n x-amz-acl. If you use this header, you cannot use other access\n control-specific headers in your request. For more information, see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the x-amz-grant-read,\n x-amz-grant-read-acp, x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers, you\n specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who\n will receive the permission. If you use these ACL-specific headers, you cannot use\n x-amz-acl header to set a canned ACL. These parameters map to the set\n of permissions that Amazon S3 supports in an ACL. For more information, see Access Control\n List (ACL) Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of the\n following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID of an\n Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email address of\n an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants list\n objects permission to the two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-read: emailAddress=\"xyz@amazon.com\",\n emailAddress=\"abc@amazon.com\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You cannot do\n both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights (using\n request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>lt;/Grantee>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET Object\n acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
Versioning
\n
\n

The ACL of an object is set at the object version level. By default, PUT sets the ACL of\n the current version of an object. To set the ACL of a different version, use the\n versionId subresource.

\n
\n
\n

The following operations are related to PutObjectAcl:

\n ", + "smithy.api#documentation": "

Uses the acl subresource to set the access control list (ACL) permissions\n for a new or existing object in an S3 bucket. You must have WRITE_ACP\n permission to set the ACL of an object. For more information, see What\n permissions can I grant? in the Amazon S3 User Guide.

\n

This action is not supported by Amazon S3 on Outposts.

\n

Depending on your application needs, you can choose to set the ACL on an object using\n either the request body or the headers. For example, if you have an existing application\n that updates a bucket ACL using the request body, you can continue to use that approach.\n For more information, see Access Control List (ACL) Overview\n in the Amazon S3 User Guide.

\n \n

If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs\n are disabled and no longer affect permissions. You must use policies to grant access to\n your bucket and the objects in it. Requests to set ACLs or update ACLs fail and return\n the AccessControlListNotSupported error code. Requests to read ACLs are\n still supported. For more information, see Controlling object\n ownership in the Amazon S3 User Guide.

\n
\n
\n
Permissions
\n
\n

You can set access permissions using one of the following methods:

\n
    \n
  • \n

    Specify a canned ACL with the x-amz-acl request header. Amazon S3\n supports a set of predefined ACLs, known as canned ACLs. Each canned ACL has\n a predefined set of grantees and permissions. Specify the canned ACL name as\n the value of x-amz-acl. If you use this header, you cannot use\n other access control-specific headers in your request. For more information,\n see Canned\n ACL.

    \n
  • \n
  • \n

    Specify access permissions explicitly with the\n x-amz-grant-read, x-amz-grant-read-acp,\n x-amz-grant-write-acp, and\n x-amz-grant-full-control headers. When using these headers,\n you specify explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3\n groups) who will receive the permission. If you use these ACL-specific\n headers, you cannot use x-amz-acl header to set a canned ACL.\n These parameters map to the set of permissions that Amazon S3 supports in an ACL.\n For more information, see Access Control List (ACL)\n Overview.

    \n

    You specify each grantee as a type=value pair, where the type is one of\n the following:

    \n
      \n
    • \n

      \n id – if the value specified is the canonical user ID\n of an Amazon Web Services account

      \n
    • \n
    • \n

      \n uri – if you are granting permissions to a predefined\n group

      \n
    • \n
    • \n

      \n emailAddress – if the value specified is the email\n address of an Amazon Web Services account

      \n \n

      Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

      \n
        \n
      • \n

        US East (N. Virginia)

        \n
      • \n
      • \n

        US West (N. California)

        \n
      • \n
      • \n

        US West (Oregon)

        \n
      • \n
      • \n

        Asia Pacific (Singapore)

        \n
      • \n
      • \n

        Asia Pacific (Sydney)

        \n
      • \n
      • \n

        Asia Pacific (Tokyo)

        \n
      • \n
      • \n

        Europe (Ireland)

        \n
      • \n
      • \n

        South America (São Paulo)

        \n
      • \n
      \n

      For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

      \n
      \n
    • \n
    \n

    For example, the following x-amz-grant-read header grants\n list objects permission to the two Amazon Web Services accounts identified by their email\n addresses.

    \n

    \n x-amz-grant-read: emailAddress=\"xyz@amazon.com\",\n emailAddress=\"abc@amazon.com\" \n

    \n
  • \n
\n

You can use either a canned ACL or specify access permissions explicitly. You\n cannot do both.

\n
\n
Grantee Values
\n
\n

You can specify the person (grantee) to whom you're assigning access rights\n (using request elements) in the following ways:

\n
    \n
  • \n

    By the person's ID:

    \n

    \n <>ID<><>GranteesEmail<>\n \n

    \n

    DisplayName is optional and ignored in the request.

    \n
  • \n
  • \n

    By URI:

    \n

    \n <>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<>\n

    \n
  • \n
  • \n

    By Email address:

    \n

    \n <>Grantees@email.com<>lt;/Grantee>\n

    \n

    The grantee is resolved to the CanonicalUser and, in a response to a GET\n Object acl request, appears as the CanonicalUser.

    \n \n

    Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions:

    \n
      \n
    • \n

      US East (N. Virginia)

      \n
    • \n
    • \n

      US West (N. California)

      \n
    • \n
    • \n

      US West (Oregon)

      \n
    • \n
    • \n

      Asia Pacific (Singapore)

      \n
    • \n
    • \n

      Asia Pacific (Sydney)

      \n
    • \n
    • \n

      Asia Pacific (Tokyo)

      \n
    • \n
    • \n

      Europe (Ireland)

      \n
    • \n
    • \n

      South America (São Paulo)

      \n
    • \n
    \n

    For a list of all the Amazon S3 supported Regions and endpoints, see Regions and Endpoints in the Amazon Web Services General Reference.

    \n
    \n
  • \n
\n
\n
Versioning
\n
\n

The ACL of an object is set at the object version level. By default, PUT sets\n the ACL of the current version of an object. To set the ACL of a different\n version, use the versionId subresource.

\n
\n
\n

The following operations are related to PutObjectAcl:

\n ", "smithy.api#examples": [ { "title": "To grant permissions using object ACL", @@ -33279,7 +28330,7 @@ "Key": { "target": "com.amazonaws.s3#ObjectKey", "traits": { - "smithy.api#documentation": "

Key for which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

Key for which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {} } @@ -33592,7 +28643,7 @@ "SSEKMSEncryptionContext": { "target": "com.amazonaws.s3#SSEKMSEncryptionContext", "traits": { - "smithy.api#documentation": "

If present, specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The\n value of this header is a base64-encoded UTF-8 string holding JSON with the encryption\n context key-value pairs. This value is stored as object metadata and automatically gets passed\n on to Amazon Web Services KMS for future GetObject or CopyObject operations on\n this object.

", + "smithy.api#documentation": "

If present, specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The\n value of this header is a base64-encoded UTF-8 string holding JSON with the encryption\n context key-value pairs. This value is stored as object metadata and automatically gets\n passed on to Amazon Web Services KMS for future GetObject or CopyObject\n operations on this object.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-context" } }, @@ -33636,7 +28687,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name to which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name to which the PUT action was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -33824,14 +28875,14 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

If x-amz-server-side-encryption has a valid value of aws:kms\n or aws:kms:dsse, this header specifies the ID of the Key Management Service (KMS)\n symmetric encryption customer managed key that was used for the object. If you specify\n x-amz-server-side-encryption:aws:kms or\n x-amz-server-side-encryption:aws:kms:dsse, but do not provide\n x-amz-server-side-encryption-aws-kms-key-id, Amazon S3 uses the Amazon Web Services managed key\n (aws/s3) to protect the data. If the KMS key does not exist in the same\n account that's issuing the command, you must use the full ARN and not just the ID.

", + "smithy.api#documentation": "

If x-amz-server-side-encryption has a valid value of aws:kms\n or aws:kms:dsse, this header specifies the ID (Key ID, Key ARN, or Key Alias) of the Key Management Service (KMS)\n symmetric encryption customer managed key that was used for the object. If you specify\n x-amz-server-side-encryption:aws:kms or\n x-amz-server-side-encryption:aws:kms:dsse, but do not provide\n x-amz-server-side-encryption-aws-kms-key-id, Amazon S3 uses the Amazon Web Services managed key\n (aws/s3) to protect the data. If the KMS key does not exist in the same\n account that's issuing the command, you must use the full ARN and not just the ID.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-aws-kms-key-id" } }, "SSEKMSEncryptionContext": { "target": "com.amazonaws.s3#SSEKMSEncryptionContext", "traits": { - "smithy.api#documentation": "

Specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\n this header is a base64-encoded UTF-8 string holding JSON with the encryption context\n key-value pairs. This value is stored as object metadata and automatically gets passed on to\n Amazon Web Services KMS for future GetObject or CopyObject operations on this\n object.

", + "smithy.api#documentation": "

Specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\n this header is a base64-encoded UTF-8 string holding JSON with the encryption context\n key-value pairs. This value is stored as object metadata and automatically gets passed on\n to Amazon Web Services KMS for future GetObject or CopyObject operations on\n this object.

", "smithy.api#httpHeader": "x-amz-server-side-encryption-context" } }, @@ -34014,7 +29065,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Sets the supplied tag-set to an object that already exists in a bucket.

\n

A tag is a key-value pair. You can associate tags with an object by sending a PUT\n request against the tagging subresource that is associated with the object. You can\n retrieve tags by sending a GET request. For more information, see GetObjectTagging.

\n

For tagging-related restrictions related to characters and encodings, see Tag\n Restrictions. Note that Amazon S3 limits the maximum number of tags to 10 tags per\n object.

\n

To use this operation, you must have permission to perform the\n s3:PutObjectTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

To put tags of any other version, use the versionId query parameter. You\n also need permission for the s3:PutObjectVersionTagging action.

\n

For information about the Amazon S3 object tagging feature, see Object Tagging.

\n

\n PutObjectTagging has the following special errors:

\n
    \n
  • \n
      \n
    • \n

      \n Code: InvalidTagError \n

      \n
    • \n
    • \n

      \n Cause: The tag provided was not a valid tag. This error can occur\n if the tag did not pass input validation. For more information, see Object\n Tagging.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: MalformedXMLError \n

      \n
    • \n
    • \n

      \n Cause: The XML provided does not match the schema.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: OperationAbortedError \n

      \n
    • \n
    • \n

      \n Cause: A conflicting conditional action is currently in progress\n against this resource. Please try again.\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InternalError\n

      \n
    • \n
    • \n

      \n Cause: The service was unable to apply the provided tag to the\n object.\n

      \n
    • \n
    \n
  • \n
\n

The following operations are related to PutObjectTagging:

\n ", + "smithy.api#documentation": "

Sets the supplied tag-set to an object that already exists in a bucket. A tag is a\n key-value pair. For more information, see Object Tagging.

\n

You can associate tags with an object by sending a PUT request against the tagging\n subresource that is associated with the object. You can retrieve tags by sending a GET\n request. For more information, see GetObjectTagging.

\n

For tagging-related restrictions related to characters and encodings, see Tag\n Restrictions. Note that Amazon S3 limits the maximum number of tags to 10 tags per\n object.

\n

To use this operation, you must have permission to perform the\n s3:PutObjectTagging action. By default, the bucket owner has this\n permission and can grant this permission to others.

\n

To put tags of any other version, use the versionId query parameter. You\n also need permission for the s3:PutObjectVersionTagging action.

\n

\n PutObjectTagging has the following special errors. For more Amazon S3 errors\n see, Error\n Responses.

\n
    \n
  • \n

    \n InvalidTag - The tag provided was not a valid tag. This error\n can occur if the tag did not pass input validation. For more information, see Object\n Tagging.

    \n
  • \n
  • \n

    \n MalformedXML - The XML provided does not match the\n schema.

    \n
  • \n
  • \n

    \n OperationAborted - A conflicting conditional action is\n currently in progress against this resource. Please try again.

    \n
  • \n
  • \n

    \n InternalError - The service was unable to apply the provided\n tag to the object.

    \n
  • \n
\n

The following operations are related to PutObjectTagging:

\n ", "smithy.api#examples": [ { "title": "To add tags to an existing object", @@ -34068,7 +29119,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -34145,7 +29196,7 @@ "requestAlgorithmMember": "ChecksumAlgorithm", "requestChecksumRequired": true }, - "smithy.api#documentation": "

Creates or modifies the PublicAccessBlock configuration for an Amazon S3 bucket.\n To use this operation, you must have the s3:PutBucketPublicAccessBlock\n permission. For more information about Amazon S3 permissions, see Specifying Permissions in a\n Policy.

\n \n

When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or\n an object, it checks the PublicAccessBlock configuration for both the\n bucket (or the bucket that contains the object) and the bucket owner's account. If the\n PublicAccessBlock configurations are different between the bucket and\n the account, Amazon S3 uses the most restrictive combination of the bucket-level and\n account-level settings.

\n
\n

For more information about when Amazon S3 considers a bucket or an object public, see The Meaning of \"Public\".

\n

The following operations are related to PutPublicAccessBlock:

\n ", + "smithy.api#documentation": "

Creates or modifies the PublicAccessBlock configuration for an Amazon S3 bucket.\n To use this operation, you must have the s3:PutBucketPublicAccessBlock\n permission. For more information about Amazon S3 permissions, see Specifying Permissions in a\n Policy.

\n \n

When Amazon S3 evaluates the PublicAccessBlock configuration for a bucket or\n an object, it checks the PublicAccessBlock configuration for both the\n bucket (or the bucket that contains the object) and the bucket owner's account. If the\n PublicAccessBlock configurations are different between the bucket and\n the account, S3 uses the most restrictive combination of the bucket-level and\n account-level settings.

\n
\n

For more information about when Amazon S3 considers a bucket or an object public, see The Meaning of \"Public\".

\n

The following operations are related to PutPublicAccessBlock:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}?publicAccessBlock", @@ -34573,6 +29624,12 @@ "traits": { "smithy.api#enumValue": "REPLICA" } + }, + "COMPLETED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "COMPLETED" + } } } }, @@ -34655,7 +29712,7 @@ } }, "traits": { - "smithy.api#documentation": "

Confirms that the requester knows that they will be charged for the request. Bucket\n owners need not specify this parameter in their requests. For information about downloading\n objects from Requester Pays buckets, see Downloading Objects in\n Requester Pays Buckets in the Amazon S3 User Guide.

" + "smithy.api#documentation": "

Confirms that the requester knows that they will be charged for the request. Bucket\n owners need not specify this parameter in their requests. If either the source or\n destination Amazon S3 bucket has Requester Pays enabled, the requester will pay for\n corresponding charges to copy the object. For information about downloading objects from\n Requester Pays buckets, see Downloading Objects in\n Requester Pays Buckets in the Amazon S3 User Guide.

" } }, "com.amazonaws.s3#RequestPaymentConfiguration": { @@ -34718,6 +29775,9 @@ "com.amazonaws.s3#Restore": { "type": "string" }, + "com.amazonaws.s3#RestoreExpiryDate": { + "type": "timestamp" + }, "com.amazonaws.s3#RestoreObject": { "type": "operation", "input": { @@ -34735,7 +29795,7 @@ "aws.protocols#httpChecksum": { "requestAlgorithmMember": "ChecksumAlgorithm" }, - "smithy.api#documentation": "

Restores an archived copy of an object back into Amazon S3

\n

This action is not supported by Amazon S3 on Outposts.

\n

This action performs the following types of requests:

\n
    \n
  • \n

    \n select - Perform a select query on an archived object

    \n
  • \n
  • \n

    \n restore an archive - Restore an archived object

    \n
  • \n
\n

For more information about the S3 structure in the request body, see the\n following:

\n \n

Define the SQL expression for the SELECT type of restoration for your\n query in the request body's SelectParameters structure. You can use\n expressions like the following examples.

\n
    \n
  • \n

    The following expression returns all records from the specified\n object.

    \n

    \n SELECT * FROM Object\n

    \n
  • \n
  • \n

    Assuming that you are not using any headers for data stored in the object,\n you can specify columns with positional headers.

    \n

    \n SELECT s._1, s._2 FROM Object s WHERE s._3 > 100\n

    \n
  • \n
  • \n

    If you have headers and you set the fileHeaderInfo in the\n CSV structure in the request body to USE, you can\n specify headers in the query. (If you set the fileHeaderInfo field\n to IGNORE, the first row is skipped for the query.) You cannot mix\n ordinal positions with header column names.

    \n

    \n SELECT s.Id, s.FirstName, s.SSN FROM S3Object s\n

    \n
  • \n
\n

When making a select request, you can also do the following:

\n
    \n
  • \n

    To expedite your queries, specify the Expedited tier. For more\n information about tiers, see \"Restoring Archives,\" later in this topic.

    \n
  • \n
  • \n

    Specify details about the data serialization format of both the input object that\n is being queried and the serialization of the CSV-encoded query results.

    \n
  • \n
\n

The following are additional important facts about the select feature:

\n
    \n
  • \n

    The output results are new Amazon S3 objects. Unlike archive retrievals, they are\n stored until explicitly deleted-manually or through a lifecycle configuration.

    \n
  • \n
  • \n

    You can issue more than one select request on the same Amazon S3 object. Amazon S3 doesn't\n duplicate requests, so avoid issuing duplicate requests.

    \n
  • \n
  • \n

    Amazon S3 accepts a select request even if the object has already been restored. A\n select request doesn’t return error response 409.

    \n
  • \n
\n
\n
Permissions
\n
\n

To use this operation, you must have permissions to perform the\n s3:RestoreObject action. The bucket owner has this permission by default\n and can grant this permission to others. For more information about permissions, see Permissions Related to Bucket Subresource Operations and Managing\n Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n
\n
Restoring objects
\n
\n

Objects that you archive to the S3 Glacier Flexible Retrieval Flexible Retrieval or\n S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For objects in the\n S3 Glacier Flexible Retrieval Flexible Retrieval or S3 Glacier Deep Archive storage\n classes, you must first initiate a restore request, and then wait until a temporary copy of\n the object is available. If you want a permanent copy of the object, create a copy of it in\n the Amazon S3 Standard storage class in your S3 bucket. To access an archived object, you must\n restore the object for the duration (number of days) that you specify. For objects in the\n Archive Access or Deep Archive Access tiers of S3 Intelligent-Tiering, you must first\n initiate a restore request, and then wait until the object is moved into the Frequent\n Access tier.

\n

To restore a specific object version, you can provide a version ID. If you don't provide\n a version ID, Amazon S3 restores the current version.

\n

When restoring an archived object, you can specify one of the following data access tier\n options in the Tier element of the request body:

\n
    \n
  • \n

    \n Expedited - Expedited retrievals allow you to quickly access your\n data stored in the S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier when occasional urgent requests for restoring archives\n are required. For all but the largest archived objects (250 MB+), data accessed using\n Expedited retrievals is typically made available within 1–5 minutes. Provisioned\n capacity ensures that retrieval capacity for Expedited retrievals is available when\n you need it. Expedited retrievals and provisioned capacity are not available for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
  • \n

    \n Standard - Standard retrievals allow you to access any of your\n archived objects within several hours. This is the default option for retrieval\n requests that do not specify the retrieval option. Standard retrievals typically\n finish within 3–5 hours for objects stored in the S3 Glacier Flexible Retrieval Flexible\n Retrieval storage class or S3 Intelligent-Tiering Archive tier. They typically finish within\n 12 hours for objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects stored in\n S3 Intelligent-Tiering.

    \n
  • \n
  • \n

    \n Bulk - Bulk retrievals free for objects stored in the S3 Glacier\n Flexible Retrieval and S3 Intelligent-Tiering storage classes, enabling you to\n retrieve large amounts, even petabytes, of data at no cost. Bulk retrievals typically\n finish within 5–12 hours for objects stored in the S3 Glacier Flexible Retrieval\n Flexible Retrieval storage class or S3 Intelligent-Tiering Archive tier. Bulk retrievals are\n also the lowest-cost retrieval option when restoring objects from\n S3 Glacier Deep Archive. They typically finish within 48 hours for objects\n stored in the S3 Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive\n tier.

    \n
  • \n
\n

For more information about archive retrieval options and provisioned capacity for\n Expedited data access, see Restoring Archived Objects in\n the Amazon S3 User Guide.

\n

You can use Amazon S3 restore speed upgrade to change the restore speed to a faster speed\n while it is in progress. For more information, see Upgrading the speed of an in-progress restore in the\n Amazon S3 User Guide.

\n

To get the status of object restoration, you can send a HEAD request.\n Operations return the x-amz-restore header, which provides information about\n the restoration status, in the response. You can use Amazon S3 event notifications to notify you\n when a restore is initiated or completed. For more information, see Configuring Amazon S3\n Event Notifications in the Amazon S3 User Guide.

\n

After restoring an archived object, you can update the restoration period by reissuing\n the request with a new period. Amazon S3 updates the restoration period relative to the current\n time and charges only for the request-there are no data transfer charges. You cannot\n update the restoration period when Amazon S3 is actively processing your current restore request\n for the object.

\n

If your bucket has a lifecycle configuration with a rule that includes an expiration\n action, the object expiration overrides the life span that you specify in a restore\n request. For example, if you restore an object copy for 10 days, but the object is\n scheduled to expire in 3 days, Amazon S3 deletes the object in 3 days. For more information\n about lifecycle configuration, see PutBucketLifecycleConfiguration and Object Lifecycle Management\n in Amazon S3 User Guide.

\n
\n
Responses
\n
\n

A successful action returns either the 200 OK or 202 Accepted\n status code.

\n
    \n
  • \n

    If the object is not previously restored, then Amazon S3 returns 202\n Accepted in the response.

    \n
  • \n
  • \n

    If the object is previously restored, Amazon S3 returns 200 OK in the\n response.

    \n
  • \n
\n
    \n
  • \n

    Special errors:

    \n
      \n
    • \n

      \n Code: RestoreAlreadyInProgress\n

      \n
    • \n
    • \n

      \n Cause: Object restore is already in progress. (This error does not\n apply to SELECT type requests.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 409 Conflict\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: Client\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: GlacierExpeditedRetrievalNotAvailable\n

      \n
    • \n
    • \n

      \n Cause: expedited retrievals are currently not available. Try again\n later. (Returned if there is insufficient capacity to process the Expedited\n request. This error applies only to Expedited retrievals and not to\n S3 Standard or Bulk retrievals.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 503\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: N/A\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to RestoreObject:

\n ", + "smithy.api#documentation": "

Restores an archived copy of an object back into Amazon S3

\n

This action is not supported by Amazon S3 on Outposts.

\n

This action performs the following types of requests:

\n
    \n
  • \n

    \n select - Perform a select query on an archived object

    \n
  • \n
  • \n

    \n restore an archive - Restore an archived object

    \n
  • \n
\n

For more information about the S3 structure in the request body, see the\n following:

\n \n

Define the SQL expression for the SELECT type of restoration for your query\n in the request body's SelectParameters structure. You can use expressions like\n the following examples.

\n
    \n
  • \n

    The following expression returns all records from the specified object.

    \n

    \n SELECT * FROM Object\n

    \n
  • \n
  • \n

    Assuming that you are not using any headers for data stored in the object, you can\n specify columns with positional headers.

    \n

    \n SELECT s._1, s._2 FROM Object s WHERE s._3 > 100\n

    \n
  • \n
  • \n

    If you have headers and you set the fileHeaderInfo in the\n CSV structure in the request body to USE, you can\n specify headers in the query. (If you set the fileHeaderInfo field to\n IGNORE, the first row is skipped for the query.) You cannot mix\n ordinal positions with header column names.

    \n

    \n SELECT s.Id, s.FirstName, s.SSN FROM S3Object s\n

    \n
  • \n
\n

When making a select request, you can also do the following:

\n
    \n
  • \n

    To expedite your queries, specify the Expedited tier. For more\n information about tiers, see \"Restoring Archives,\" later in this topic.

    \n
  • \n
  • \n

    Specify details about the data serialization format of both the input object that\n is being queried and the serialization of the CSV-encoded query results.

    \n
  • \n
\n

The following are additional important facts about the select feature:

\n
    \n
  • \n

    The output results are new Amazon S3 objects. Unlike archive retrievals, they are\n stored until explicitly deleted-manually or through a lifecycle configuration.

    \n
  • \n
  • \n

    You can issue more than one select request on the same Amazon S3 object. Amazon S3 doesn't\n duplicate requests, so avoid issuing duplicate requests.

    \n
  • \n
  • \n

    Amazon S3 accepts a select request even if the object has already been restored. A\n select request doesn’t return error response 409.

    \n
  • \n
\n
\n
Permissions
\n
\n

To use this operation, you must have permissions to perform the\n s3:RestoreObject action. The bucket owner has this permission by\n default and can grant this permission to others. For more information about\n permissions, see Permissions Related to Bucket Subresource Operations and Managing Access Permissions to Your Amazon S3 Resources in the\n Amazon S3 User Guide.

\n
\n
Restoring objects
\n
\n

Objects that you archive to the S3 Glacier Flexible Retrieval Flexible Retrieval\n or S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or\n S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For objects in the\n S3 Glacier Flexible Retrieval Flexible Retrieval or S3 Glacier Deep Archive\n storage classes, you must first initiate a restore request, and then wait until a\n temporary copy of the object is available. If you want a permanent copy of the\n object, create a copy of it in the Amazon S3 Standard storage class in your S3 bucket.\n To access an archived object, you must restore the object for the duration (number\n of days) that you specify. For objects in the Archive Access or Deep Archive\n Access tiers of S3 Intelligent-Tiering, you must first initiate a restore request,\n and then wait until the object is moved into the Frequent Access tier.

\n

To restore a specific object version, you can provide a version ID. If you\n don't provide a version ID, Amazon S3 restores the current version.

\n

When restoring an archived object, you can specify one of the following data\n access tier options in the Tier element of the request body:

\n
    \n
  • \n

    \n Expedited - Expedited retrievals allow you to quickly access\n your data stored in the S3 Glacier Flexible Retrieval Flexible Retrieval\n storage class or S3 Intelligent-Tiering Archive tier when occasional urgent requests\n for restoring archives are required. For all but the largest archived\n objects (250 MB+), data accessed using Expedited retrievals is typically\n made available within 1–5 minutes. Provisioned capacity ensures that\n retrieval capacity for Expedited retrievals is available when you need it.\n Expedited retrievals and provisioned capacity are not available for objects\n stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
  • \n

    \n Standard - Standard retrievals allow you to access any of\n your archived objects within several hours. This is the default option for\n retrieval requests that do not specify the retrieval option. Standard\n retrievals typically finish within 3–5 hours for objects stored in the\n S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier. They typically finish within 12 hours for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects stored\n in S3 Intelligent-Tiering.

    \n
  • \n
  • \n

    \n Bulk - Bulk retrievals free for objects stored in the\n S3 Glacier Flexible Retrieval and S3 Intelligent-Tiering storage classes,\n enabling you to retrieve large amounts, even petabytes, of data at no cost.\n Bulk retrievals typically finish within 5–12 hours for objects stored in the\n S3 Glacier Flexible Retrieval Flexible Retrieval storage class or\n S3 Intelligent-Tiering Archive tier. Bulk retrievals are also the lowest-cost\n retrieval option when restoring objects from\n S3 Glacier Deep Archive. They typically finish within 48 hours for\n objects stored in the S3 Glacier Deep Archive storage class or\n S3 Intelligent-Tiering Deep Archive tier.

    \n
  • \n
\n

For more information about archive retrieval options and provisioned capacity\n for Expedited data access, see Restoring Archived\n Objects in the Amazon S3 User Guide.

\n

You can use Amazon S3 restore speed upgrade to change the restore speed to a faster\n speed while it is in progress. For more information, see Upgrading the speed of an in-progress restore in the\n Amazon S3 User Guide.

\n

To get the status of object restoration, you can send a HEAD\n request. Operations return the x-amz-restore header, which provides\n information about the restoration status, in the response. You can use Amazon S3 event\n notifications to notify you when a restore is initiated or completed. For more\n information, see Configuring Amazon S3 Event\n Notifications in the Amazon S3 User Guide.

\n

After restoring an archived object, you can update the restoration period by\n reissuing the request with a new period. Amazon S3 updates the restoration period\n relative to the current time and charges only for the request-there are no\n data transfer charges. You cannot update the restoration period when Amazon S3 is\n actively processing your current restore request for the object.

\n

If your bucket has a lifecycle configuration with a rule that includes an\n expiration action, the object expiration overrides the life span that you specify\n in a restore request. For example, if you restore an object copy for 10 days, but\n the object is scheduled to expire in 3 days, Amazon S3 deletes the object in 3 days.\n For more information about lifecycle configuration, see PutBucketLifecycleConfiguration and Object Lifecycle\n Management in Amazon S3 User Guide.

\n
\n
Responses
\n
\n

A successful action returns either the 200 OK or 202\n Accepted status code.

\n
    \n
  • \n

    If the object is not previously restored, then Amazon S3 returns 202\n Accepted in the response.

    \n
  • \n
  • \n

    If the object is previously restored, Amazon S3 returns 200 OK in\n the response.

    \n
  • \n
\n
    \n
  • \n

    Special errors:

    \n
      \n
    • \n

      \n Code: RestoreAlreadyInProgress\n

      \n
    • \n
    • \n

      \n Cause: Object restore is already in progress. (This error\n does not apply to SELECT type requests.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 409 Conflict\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: Client\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: GlacierExpeditedRetrievalNotAvailable\n

      \n
    • \n
    • \n

      \n Cause: expedited retrievals are currently not available.\n Try again later. (Returned if there is insufficient capacity to\n process the Expedited request. This error applies only to Expedited\n retrievals and not to S3 Standard or Bulk retrievals.)\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 503\n

      \n
    • \n
    • \n

      \n SOAP Fault Code Prefix: N/A\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to RestoreObject:

\n ", "smithy.api#examples": [ { "title": "To restore an archived object", @@ -34787,7 +29847,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name containing the object to restore.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name containing the object to restore.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -34907,6 +29967,27 @@ } } }, + "com.amazonaws.s3#RestoreStatus": { + "type": "structure", + "members": { + "IsRestoreInProgress": { + "target": "com.amazonaws.s3#IsRestoreInProgress", + "traits": { + "smithy.api#default": false, + "smithy.api#documentation": "

Specifies whether the object is currently being restored. If the object restoration is\n in progress, the header returns the value TRUE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"true\"\n

\n

If the object restoration has completed, the header returns the value\n FALSE. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\",\n RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

\n

If the object hasn't been restored, there is no header response.

" + } + }, + "RestoreExpiryDate": { + "target": "com.amazonaws.s3#RestoreExpiryDate", + "traits": { + "smithy.api#documentation": "

Indicates when the restored copy will expire. This value is populated only if the object\n has already been restored. For example:

\n

\n x-amz-optional-object-attributes: IsRestoreInProgress=\"false\",\n RestoreExpiryDate=\"2012-12-21T00:00:00.000Z\"\n

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Specifies the restoration status of an object. Objects in certain storage classes must\n be restored before they can be retrieved. For more information about these storage classes\n and how to work with archived objects, see Working with archived\n objects in the Amazon S3 User Guide.

" + } + }, "com.amazonaws.s3#Role": { "type": "string" }, @@ -35089,7 +30170,7 @@ "target": "com.amazonaws.s3#SelectObjectContentOutput" }, "traits": { - "smithy.api#documentation": "

This action filters the contents of an Amazon S3 object based on a simple structured query\n language (SQL) statement. In the request, along with the SQL expression, you must also\n specify a data serialization format (JSON, CSV, or Apache Parquet) of the object. Amazon S3 uses\n this format to parse object data into records, and returns only records that match the\n specified SQL expression. You must also specify the data serialization format for the\n response.

\n

This action is not supported by Amazon S3 on Outposts.

\n

For more information about Amazon S3 Select, see Selecting Content from\n Objects and SELECT\n Command in the Amazon S3 User Guide.

\n

\n
\n
Permissions
\n
\n

You must have s3:GetObject permission for this operation. Amazon S3 Select does\n not support anonymous access. For more information about permissions, see Specifying\n Permissions in a Policy in the Amazon S3 User Guide.

\n
\n
Object Data Formats
\n
\n

You can use Amazon S3 Select to query objects that have the following format\n properties:

\n
    \n
  • \n

    \n CSV, JSON, and Parquet - Objects must be in CSV, JSON, or\n Parquet format.

    \n
  • \n
  • \n

    \n UTF-8 - UTF-8 is the only encoding type Amazon S3 Select\n supports.

    \n
  • \n
  • \n

    \n GZIP or BZIP2 - CSV and JSON files can be compressed using\n GZIP or BZIP2. GZIP and BZIP2 are the only compression formats that Amazon S3 Select\n supports for CSV and JSON files. Amazon S3 Select supports columnar compression for\n Parquet using GZIP or Snappy. Amazon S3 Select does not support whole-object compression\n for Parquet objects.

    \n
  • \n
  • \n

    \n Server-side encryption - Amazon S3 Select supports querying\n objects that are protected with server-side encryption.

    \n

    For objects that are encrypted with customer-provided encryption keys (SSE-C), you\n must use HTTPS, and you must use the headers that are documented in the GetObject. For more information about SSE-C, see Server-Side\n Encryption (Using Customer-Provided Encryption Keys) in the\n Amazon S3 User Guide.

    \n

    For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and Amazon Web Services KMS keys\n (SSE-KMS), server-side encryption is handled transparently, so you don't need to\n specify anything. For more information about server-side encryption, including SSE-S3\n and SSE-KMS, see Protecting Data Using\n Server-Side Encryption in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
Working with the Response Body
\n
\n

Given the response size is unknown, Amazon S3 Select streams the response as a series of\n messages and includes a Transfer-Encoding header with chunked as\n its value in the response. For more information, see Appendix: SelectObjectContent\n Response.

\n
\n
GetObject Support
\n
\n

The SelectObjectContent action does not support the following\n GetObject functionality. For more information, see GetObject.

\n
    \n
  • \n

    \n Range: Although you can specify a scan range for an Amazon S3 Select request\n (see SelectObjectContentRequest - ScanRange in the request parameters),\n you cannot specify the range of bytes of an object to return.

    \n
  • \n
  • \n

    The GLACIER, DEEP_ARCHIVE, and REDUCED_REDUNDANCY storage classes, or the ARCHIVE_ACCESS and \n DEEP_ARCHIVE_ACCESS access tiers of \n the INTELLIGENT_TIERING storage class: You cannot query objects in \n the GLACIER, DEEP_ARCHIVE, or REDUCED_REDUNDANCY storage classes, nor objects in the \n ARCHIVE_ACCESS or \n DEEP_ARCHIVE_ACCESS access tiers of \n the INTELLIGENT_TIERING storage class. For\n more information about storage classes, see Using Amazon S3 storage\n classes in the Amazon S3 User Guide.

    \n
  • \n
\n
\n
Special Errors
\n
\n

For a list of special errors for this operation, see List of\n SELECT Object Content Error Codes\n

\n
\n
\n

The following operations are related to SelectObjectContent:

\n ", + "smithy.api#documentation": "

This action filters the contents of an Amazon S3 object based on a simple structured query\n language (SQL) statement. In the request, along with the SQL expression, you must also\n specify a data serialization format (JSON, CSV, or Apache Parquet) of the object. Amazon S3 uses\n this format to parse object data into records, and returns only records that match the\n specified SQL expression. You must also specify the data serialization format for the\n response.

\n

This action is not supported by Amazon S3 on Outposts.

\n

For more information about Amazon S3 Select, see Selecting Content from\n Objects and SELECT\n Command in the Amazon S3 User Guide.

\n

\n
\n
Permissions
\n
\n

You must have s3:GetObject permission for this operation. Amazon S3\n Select does not support anonymous access. For more information about permissions,\n see Specifying Permissions in\n a Policy in the Amazon S3 User Guide.

\n
\n
Object Data Formats
\n
\n

You can use Amazon S3 Select to query objects that have the following format\n properties:

\n
    \n
  • \n

    \n CSV, JSON, and Parquet - Objects must be in CSV,\n JSON, or Parquet format.

    \n
  • \n
  • \n

    \n UTF-8 - UTF-8 is the only encoding type Amazon S3 Select\n supports.

    \n
  • \n
  • \n

    \n GZIP or BZIP2 - CSV and JSON files can be compressed\n using GZIP or BZIP2. GZIP and BZIP2 are the only compression formats that\n Amazon S3 Select supports for CSV and JSON files. Amazon S3 Select supports columnar\n compression for Parquet using GZIP or Snappy. Amazon S3 Select does not support\n whole-object compression for Parquet objects.

    \n
  • \n
  • \n

    \n Server-side encryption - Amazon S3 Select supports\n querying objects that are protected with server-side encryption.

    \n

    For objects that are encrypted with customer-provided encryption keys\n (SSE-C), you must use HTTPS, and you must use the headers that are\n documented in the GetObject. For more\n information about SSE-C, see Server-Side Encryption (Using Customer-Provided Encryption Keys)\n in the Amazon S3 User Guide.

    \n

    For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and\n Amazon Web Services KMS keys (SSE-KMS), server-side encryption is handled transparently,\n so you don't need to specify anything. For more information about\n server-side encryption, including SSE-S3 and SSE-KMS, see Protecting Data Using Server-Side Encryption in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
Working with the Response Body
\n
\n

Given the response size is unknown, Amazon S3 Select streams the response as a\n series of messages and includes a Transfer-Encoding header with\n chunked as its value in the response. For more information, see\n Appendix:\n SelectObjectContent\n Response.

\n
\n
GetObject Support
\n
\n

The SelectObjectContent action does not support the following\n GetObject functionality. For more information, see GetObject.

\n
    \n
  • \n

    \n Range: Although you can specify a scan range for an Amazon S3 Select\n request (see SelectObjectContentRequest - ScanRange in the request\n parameters), you cannot specify the range of bytes of an object to return.\n

    \n
  • \n
  • \n

    The GLACIER, DEEP_ARCHIVE, and\n REDUCED_REDUNDANCY storage classes, or the\n ARCHIVE_ACCESS and DEEP_ARCHIVE_ACCESS access\n tiers of the INTELLIGENT_TIERING storage class: You cannot\n query objects in the GLACIER, DEEP_ARCHIVE, or\n REDUCED_REDUNDANCY storage classes, nor objects in the\n ARCHIVE_ACCESS or DEEP_ARCHIVE_ACCESS access\n tiers of the INTELLIGENT_TIERING storage class. For more\n information about storage classes, see Using Amazon S3\n storage classes in the\n Amazon S3 User Guide.

    \n
  • \n
\n
\n
Special Errors
\n
\n

For a list of special errors for this operation, see List of SELECT Object Content Error Codes\n

\n
\n
\n

The following operations are related to SelectObjectContent:

\n ", "smithy.api#http": { "method": "POST", "uri": "/{Bucket}/{Key+}?select&select-type=2&x-id=SelectObjectContent", @@ -35319,7 +30400,7 @@ "KMSMasterKeyID": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

Amazon Web Services Key Management Service (KMS) customer Amazon Web Services KMS key ID to use for the default\n encryption. This parameter is allowed if and only if SSEAlgorithm is set to\n aws:kms.

\n

You can specify the key ID or the Amazon Resource Name (ARN) of the KMS key. If you use\n a key ID, you can run into a LogDestination undeliverable error when creating a VPC flow\n log.

\n

If you are using encryption with cross-account or Amazon Web Services service operations you must use\n a fully qualified KMS key ARN. For more information, see Using encryption for cross-account operations.

\n
    \n
  • \n

    Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key ARN:\n arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
\n \n

Amazon S3 only supports symmetric encryption KMS keys. For more information, see Asymmetric keys in Amazon Web Services KMS in the Amazon Web Services Key Management Service\n Developer Guide.

\n
" + "smithy.api#documentation": "

Amazon Web Services Key Management Service (KMS) customer Amazon Web Services KMS key ID to use for the default\n encryption. This parameter is allowed if and only if SSEAlgorithm is set to\n aws:kms.

\n

You can specify the key ID, key alias, or the Amazon Resource Name (ARN) of the KMS\n key.

\n
    \n
  • \n

    Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\n

    \n
  • \n
  • \n

    Key Alias: alias/alias-name\n

    \n
  • \n
\n

If you use a key ID, you can run into a LogDestination undeliverable error when creating\n a VPC flow log.

\n

If you are using encryption with cross-account or Amazon Web Services service operations you must use\n a fully qualified KMS key ARN. For more information, see Using encryption for cross-account operations.

\n \n

Amazon S3 only supports symmetric encryption KMS keys. For more information, see Asymmetric keys in Amazon Web Services KMS in the Amazon Web Services Key Management Service\n Developer Guide.

\n
" } } }, @@ -35953,7 +31034,7 @@ "target": "com.amazonaws.s3#UploadPartCopyOutput" }, "traits": { - "smithy.api#documentation": "

Uploads a part by copying data from an existing object as data source. You specify the\n data source by adding the request header x-amz-copy-source in your request and\n a byte range by adding the request header x-amz-copy-source-range in your\n request.

\n

For information about maximum and minimum part sizes and other multipart upload\n specifications, see Multipart upload limits in the Amazon S3 User Guide.

\n \n

Instead of using an existing object as part data, you might use the UploadPart\n action and provide data in your request.

\n
\n

You must initiate a multipart upload before you can upload any part. In response to your\n initiate request. Amazon S3 returns a unique identifier, the upload ID, that you must include in\n your upload part request.

\n

For more information about using the UploadPartCopy operation, see the\n following:

\n
    \n
  • \n

    For conceptual information about multipart uploads, see Uploading\n Objects Using Multipart Upload in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about permissions required to use the multipart upload API, see\n Multipart Upload and Permissions in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about copying objects using a single atomic action vs. a multipart\n upload, see Operations on Objects in\n the Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about using server-side encryption with customer-provided\n encryption keys with the UploadPartCopy operation, see CopyObject and UploadPart.

    \n
  • \n
\n

Note the following additional considerations about the request headers\n x-amz-copy-source-if-match, x-amz-copy-source-if-none-match,\n x-amz-copy-source-if-unmodified-since, and\n x-amz-copy-source-if-modified-since:

\n

\n
    \n
  • \n

    \n Consideration 1 - If both of the\n x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-match condition evaluates to true,\n and;

    \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false;

    \n

    Amazon S3 returns 200 OK and copies the data.\n

    \n
  • \n
  • \n

    \n Consideration 2 - If both of the\n x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false, and;

    \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true;

    \n

    Amazon S3 returns 412 Precondition Failed response code.\n

    \n
  • \n
\n
\n
Versioning
\n
\n

If your bucket has versioning enabled, you could have multiple versions of the same\n object. By default, x-amz-copy-source identifies the current version of the\n object to copy. If the current version is a delete marker and you don't specify a versionId\n in the x-amz-copy-source, Amazon S3 returns a 404 error, because the object does\n not exist. If you specify versionId in the x-amz-copy-source and the versionId\n is a delete marker, Amazon S3 returns an HTTP 400 error, because you are not allowed to specify\n a delete marker as a version for the x-amz-copy-source.

\n

You can optionally specify a specific version of the source object to copy by adding the\n versionId subresource as shown in the following example:

\n

\n x-amz-copy-source: /bucket/object?versionId=version id\n

\n
\n
Special errors
\n
\n
    \n
  • \n
      \n
    • \n

      \n Code: NoSuchUpload\n

      \n
    • \n
    • \n

      \n Cause: The specified multipart upload does not exist. The upload\n ID might be invalid, or the multipart upload might have been aborted or\n completed.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 404 Not Found\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InvalidRequest\n

      \n
    • \n
    • \n

      \n Cause: The specified copy source is not supported as a byte-range\n copy source.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 400 Bad Request\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to UploadPartCopy:

\n ", + "smithy.api#documentation": "

Uploads a part by copying data from an existing object as data source. You specify the\n data source by adding the request header x-amz-copy-source in your request and\n a byte range by adding the request header x-amz-copy-source-range in your\n request.

\n

For information about maximum and minimum part sizes and other multipart upload\n specifications, see Multipart upload limits in the Amazon S3 User Guide.

\n \n

Instead of using an existing object as part data, you might use the UploadPart\n action and provide data in your request.

\n
\n

You must initiate a multipart upload before you can upload any part. In response to your\n initiate request. Amazon S3 returns a unique identifier, the upload ID, that you must include in\n your upload part request.

\n

For more information about using the UploadPartCopy operation, see the\n following:

\n
    \n
  • \n

    For conceptual information about multipart uploads, see Uploading\n Objects Using Multipart Upload in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about permissions required to use the multipart upload API, see\n Multipart Upload and Permissions in the\n Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about copying objects using a single atomic action vs. a multipart\n upload, see Operations on Objects in\n the Amazon S3 User Guide.

    \n
  • \n
  • \n

    For information about using server-side encryption with customer-provided\n encryption keys with the UploadPartCopy operation, see CopyObject and UploadPart.

    \n
  • \n
\n

Note the following additional considerations about the request headers\n x-amz-copy-source-if-match, x-amz-copy-source-if-none-match,\n x-amz-copy-source-if-unmodified-since, and\n x-amz-copy-source-if-modified-since:

\n

\n
    \n
  • \n

    \n Consideration 1 - If both of the\n x-amz-copy-source-if-match and\n x-amz-copy-source-if-unmodified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-match condition evaluates to true,\n and;

    \n

    \n x-amz-copy-source-if-unmodified-since condition evaluates to\n false;

    \n

    Amazon S3 returns 200 OK and copies the data.\n

    \n
  • \n
  • \n

    \n Consideration 2 - If both of the\n x-amz-copy-source-if-none-match and\n x-amz-copy-source-if-modified-since headers are present in the\n request as follows:

    \n

    \n x-amz-copy-source-if-none-match condition evaluates to\n false, and;

    \n

    \n x-amz-copy-source-if-modified-since condition evaluates to\n true;

    \n

    Amazon S3 returns 412 Precondition Failed response code.\n

    \n
  • \n
\n
\n
Versioning
\n
\n

If your bucket has versioning enabled, you could have multiple versions of the\n same object. By default, x-amz-copy-source identifies the current\n version of the object to copy. If the current version is a delete marker and you\n don't specify a versionId in the x-amz-copy-source, Amazon S3 returns a\n 404 error, because the object does not exist. If you specify versionId in the\n x-amz-copy-source and the versionId is a delete marker, Amazon S3\n returns an HTTP 400 error, because you are not allowed to specify a delete marker\n as a version for the x-amz-copy-source.

\n

You can optionally specify a specific version of the source object to copy by\n adding the versionId subresource as shown in the following\n example:

\n

\n x-amz-copy-source: /bucket/object?versionId=version id\n

\n
\n
Special errors
\n
\n
    \n
  • \n
      \n
    • \n

      \n Code: NoSuchUpload\n

      \n
    • \n
    • \n

      \n Cause: The specified multipart upload does not exist. The\n upload ID might be invalid, or the multipart upload might have been\n aborted or completed.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 404 Not Found\n

      \n
    • \n
    \n
  • \n
  • \n
      \n
    • \n

      \n Code: InvalidRequest\n

      \n
    • \n
    • \n

      \n Cause: The specified copy source is not supported as a\n byte-range copy source.\n

      \n
    • \n
    • \n

      \n HTTP Status Code: 400 Bad Request\n

      \n
    • \n
    \n
  • \n
\n
\n
\n

The following operations are related to UploadPartCopy:

\n ", "smithy.api#http": { "method": "PUT", "uri": "/{Bucket}/{Key+}?x-id=UploadPartCopy", @@ -36031,7 +31112,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The bucket name.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -36273,7 +31354,7 @@ "Bucket": { "target": "com.amazonaws.s3#BucketName", "traits": { - "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts in the Amazon S3 User Guide.

", + "smithy.api#documentation": "

The name of the bucket to which the multipart upload was initiated.

\n

When using this action with an access point, you must direct requests to the access point hostname. The access point hostname takes the form AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see Using access points in the Amazon S3 User Guide.

\n

When you use this action with Amazon S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the form \n AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. When you use this action with S3 on Outposts through the Amazon Web Services SDKs, you provide the Outposts access point ARN in place of the bucket name. For more information about S3 on Outposts ARNs, see What is S3 on Outposts? in the Amazon S3 User Guide.

", "smithy.api#httpLabel": {}, "smithy.api#required": {}, "smithy.rules#contextParam": { @@ -36753,7 +31834,7 @@ "SSEKMSKeyId": { "target": "com.amazonaws.s3#SSEKMSKeyId", "traits": { - "smithy.api#documentation": "

If present, specifies the ID of the Amazon Web Services Key Management Service (Amazon Web Services KMS) symmetric\n encryption customer managed key that was used for stored in Amazon S3 object.

", + "smithy.api#documentation": "

If present, specifies the ID (Key ID, Key ARN, or Key Alias) of the Amazon Web Services Key Management Service (Amazon Web Services KMS) symmetric\n encryption customer managed key that was used for stored in Amazon S3 object.

", "smithy.api#httpHeader": "x-amz-fwd-header-x-amz-server-side-encryption-aws-kms-key-id" } }, diff --git a/aws/sdk/aws-models/s3control.json b/aws/sdk/aws-models/s3control.json index 2944356a967..44b0018d490 100644 --- a/aws/sdk/aws-models/s3control.json +++ b/aws/sdk/aws-models/s3control.json @@ -232,6 +232,7 @@ "arnNamespace": "s3", "cloudFormationName": "S3Control", "cloudTrailEventSource": "s3control.amazonaws.com", + "docId": "s3control-2018-08-20", "endpointPrefix": "s3-control" }, "aws.auth#sigv4": { @@ -312,1190 +313,1126 @@ }, "rules": [ { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { "ref": "Region" + }, + "snow" + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" } ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" } ], - "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], "rules": [ { "conditions": [ { - "fn": "stringEquals", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "S3 Snow does not support DualStack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "S3 Snow does not support FIPS", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "OutpostId" + } + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" }, - "snow" + true ] }, + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, + { + "conditions": [ { "fn": "isSet", "argv": [ { - "ref": "Endpoint" + "ref": "RequiresAccountId" } ] }, { - "fn": "parseURL", + "fn": "booleanEquals", "argv": [ { - "ref": "Endpoint" + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] } - ], - "assign": "url" + ] } ], - "type": "tree", - "rules": [ + "error": "AccountId is required but not set", + "type": "error" + }, + { + "conditions": [ { - "conditions": [ + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ { - "fn": "aws.partition", + "fn": "isValidHostLabel", "argv": [ { - "ref": "Region" - } - ], - "assign": "partitionResult" + "ref": "AccountId" + }, + false + ] } - ], - "type": "tree", - "rules": [ + ] + } + ], + "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "not", + "argv": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "isValidHostLabel", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "S3 Snow does not support Dual-stack", - "type": "error" + "ref": "OutpostId" }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "error": "S3 Snow does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } + false ] } ] - }, - { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" } - ] + ], + "error": "OutpostId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" }, { "conditions": [ { - "fn": "isSet", + "fn": "isValidHostLabel", "argv": [ { - "ref": "OutpostId" - } + "ref": "Region" + }, + true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid configuration: Outposts do not support dual-stack", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", "argv": [ { - "ref": "Region" + "ref": "Endpoint" } ], - "assign": "partitionResult" + "assign": "url" } ], - "type": "tree", - "rules": [ + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "booleanEquals", + "argv": [ { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" + "ref": "UseFIPS" }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-outposts-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ] - } - ], - "error": "AccountId is required but not set", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "AccountId" - }, - false - ] - } - ] - } - ], - "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "OutpostId" - }, - false - ] - } - ] - } - ], - "error": "OutpostId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid configuration: Outposts do not support dual-stack", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" - } - ] - } - ] - } - ] - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" } ] - } - ] + }, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" + "endpoint": { + "url": "https://s3-outposts.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [ + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" + } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccessPointName" + } + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "AccessPointName" + } + ], + "assign": "accessPointArn" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ { - "fn": "isSet", + "ref": "accessPointArn" + }, + "resourceId[0]" + ], + "assign": "arnType" + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", "argv": [ { - "ref": "AccessPointName" - } + "ref": "arnType" + }, + "" ] - }, + } + ] + } + ], + "rules": [ + { + "conditions": [ { - "fn": "aws.parseArn", + "fn": "stringEquals", "argv": [ { - "ref": "AccessPointName" - } - ], - "assign": "accessPointArn" + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "service" + ] + }, + "s3-outposts" + ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "getAttr", + "fn": "booleanEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "UseDualStack" }, - "resourceId[0]" - ], - "assign": "arnType" - }, + true + ] + } + ], + "error": "Invalid configuration: Outpost Access Points do not support dual-stack", + "type": "error" + }, + { + "conditions": [ { - "fn": "not", + "fn": "getAttr", "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] - } - ] + "ref": "accessPointArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "stringEquals", + "fn": "isValidHostLabel", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "service" - ] + "ref": "outpostId" }, - "s3-outposts" + false ] } ], - "type": "tree", "rules": [ { "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "ref": "UseArnRegion" }, - true + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "region" + ] + }, + "{Region}" + ] + } ] } ], - "error": "Invalid configuration: Outpost Access Points do not support dual-stack", + "error": "Invalid configuration: region from ARN `{accessPointArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", "type": "error" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], "rules": [ { "conditions": [ { - "fn": "getAttr", + "fn": "aws.partition", "argv": [ { - "ref": "accessPointArn" - }, - "resourceId[1]" + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "region" + ] + } ], - "assign": "outpostId" + "assign": "arnPartition" } ], - "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "arnPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + } + ] + } + ], + "rules": [ + { + "conditions": [ { "fn": "isValidHostLabel", "argv": [ { - "ref": "outpostId" + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "region" + ] }, - false + true ] } ], - "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "UseArnRegion" - } + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "accountId" + ] + }, + "" ] - }, + } + ] + } + ], + "rules": [ + { + "conditions": [ { - "fn": "booleanEquals", + "fn": "isValidHostLabel", "argv": [ { - "ref": "UseArnRegion" + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "accountId" + ] }, false ] - }, + } + ], + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "stringEquals", + "fn": "isSet", "argv": [ { - "fn": "getAttr", + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "AccountId" }, - "region" + "{accessPointArn#accountId}" ] - }, - "{Region}" + } ] } - ] - } - ], - "error": "Invalid configuration: region from ARN `{accessPointArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ + ], + "error": "Invalid ARN: the accountId specified in the ARN (`{accessPointArn#accountId}`) does not match the parameter (`{AccountId}`)", + "type": "error" + }, { "conditions": [ { - "fn": "aws.partition", + "fn": "getAttr", "argv": [ { - "ref": "Region" - } + "ref": "accessPointArn" + }, + "resourceId[2]" ], - "assign": "partitionResult" + "assign": "outpostType" } ], - "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "accessPointArn" + }, + "resourceId[3]" + ], + "assign": "accessPointName" + } + ], "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "fn": "getAttr", + "ref": "outpostType" + }, + "accesspoint" + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", "argv": [ { - "ref": "accessPointArn" + "ref": "UseFIPS" }, - "region" + true ] } ], - "assign": "arnPartition" - } - ], - "type": "tree", - "rules": [ + "endpoint": { + "url": "https://s3-outposts-fips.{accessPointArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, { - "conditions": [ + "fn": "parseURL", + "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "arnPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] + "ref": "Endpoint" } ], - "type": "tree", - "rules": [ + "assign": "url" + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "accountId" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "AccountId" - }, - "{accessPointArn#accountId}" - ] - } - ] - } - ], - "error": "Invalid ARN: the accountId specified in the ARN (`{accessPointArn#accountId}`) does not match the parameter (`{AccountId}`)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "accessPointArn" - }, - "resourceId[3]" - ], - "assign": "accessPointName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "accesspoint" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{accessPointArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{accessPointArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{accessPointArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{accessPointArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Expected an outpost type `accesspoint`, found `{outpostType}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected an access point name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: missing account ID", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{accessPointArn#region}` (invalid DNS name)", - "type": "error" - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" } ] }, - { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", - "type": "error" + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] } - ] + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-outposts.{accessPointArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{accessPointArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{accessPointArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], - "error": "Could not load partition for ARN region `{accessPointArn#region}`", + "error": "Expected an outpost type `accesspoint`, found `{outpostType}`", "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: expected an access point name", + "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], - "error": "A valid partition could not be determined", + "error": "Invalid ARN: Expected a 4-component resource", "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointArn#accountId}`", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: missing account ID", + "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "error": "Invalid region in ARN: `{accessPointArn#region}` (invalid DNS name)", "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", + "type": "error" } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], - "error": "Invalid ARN: No ARN type specified", + "error": "Invalid ARN: The Outpost Id was not set", "type": "error" } - ] + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "aws.parseArn", + "argv": [ + { + "ref": "Bucket" + } + ], + "assign": "bucketArn" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[0]" + ], + "assign": "arnType" }, { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "Bucket" - } + "ref": "arnType" + }, + "" ] - }, + } + ] + } + ], + "rules": [ + { + "conditions": [ { - "fn": "aws.parseArn", + "fn": "stringEquals", "argv": [ { - "ref": "Bucket" - } - ], - "assign": "bucketArn" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "service" + ] + }, + "s3-outposts" + ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "getAttr", + "fn": "booleanEquals", "argv": [ { - "ref": "bucketArn" + "ref": "UseDualStack" }, - "resourceId[0]" - ], - "assign": "arnType" - }, + true + ] + } + ], + "error": "Invalid configuration: Outpost buckets do not support dual-stack", + "type": "error" + }, + { + "conditions": [ { - "fn": "not", + "fn": "getAttr", "argv": [ { - "fn": "stringEquals", - "argv": [ - { - "ref": "arnType" - }, - "" - ] - } - ] + "ref": "bucketArn" + }, + "resourceId[1]" + ], + "assign": "outpostId" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "stringEquals", + "fn": "isValidHostLabel", "argv": [ { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "service" - ] + "ref": "outpostId" }, - "s3-outposts" + false ] } ], - "type": "tree", "rules": [ { "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "UseArnRegion" + } + ] + }, { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "ref": "UseArnRegion" }, - true + false + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] + }, + "{Region}" + ] + } ] } ], - "error": "Invalid configuration: Outpost buckets do not support dual-stack", + "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "aws.partition", + "argv": [ { "fn": "getAttr", "argv": [ { "ref": "bucketArn" }, - "resourceId[1]" + "region" + ] + } + ], + "assign": "arnPartition" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } ], - "assign": "outpostId" + "assign": "partitionResult" } ], - "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "arnPartition" + }, + "name" + ] + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "partitionResult" + }, + "name" + ] + } + ] + } + ], "rules": [ { "conditions": [ @@ -1503,1214 +1440,961 @@ "fn": "isValidHostLabel", "argv": [ { - "ref": "outpostId" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "region" + ] }, - false + true ] } ], - "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "not", + "argv": [ { - "fn": "isSet", + "fn": "stringEquals", "argv": [ { - "ref": "UseArnRegion" - } + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] + }, + "" ] - }, + } + ] + } + ], + "rules": [ + { + "conditions": [ { - "fn": "booleanEquals", + "fn": "isValidHostLabel", "argv": [ { - "ref": "UseArnRegion" + "fn": "getAttr", + "argv": [ + { + "ref": "bucketArn" + }, + "accountId" + ] }, false ] - }, + } + ], + "rules": [ { - "fn": "not", - "argv": [ + "conditions": [ { - "fn": "stringEquals", + "fn": "isSet", "argv": [ { - "fn": "getAttr", + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "stringEquals", "argv": [ { - "ref": "bucketArn" + "ref": "AccountId" }, - "region" + "{bucketArn#accountId}" ] - }, - "{Region}" + } ] } - ] - } - ], - "error": "Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ + ], + "error": "Invalid ARN: the accountId specified in the ARN (`{bucketArn#accountId}`) does not match the parameter (`{AccountId}`)", + "type": "error" + }, { "conditions": [ { - "fn": "aws.partition", + "fn": "getAttr", "argv": [ + { + "ref": "bucketArn" + }, + "resourceId[2]" + ], + "assign": "outpostType" + } + ], + "rules": [ + { + "conditions": [ { "fn": "getAttr", "argv": [ { "ref": "bucketArn" }, - "region" - ] + "resourceId[3]" + ], + "assign": "bucketName" } ], - "assign": "arnPartition" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "stringEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "partitionResult" + "ref": "outpostType" + }, + "bucket" + ] } ], - "type": "tree", "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-outposts-fips.{bucketArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "arnPartition" - }, - "name" - ] - }, - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - } - ] + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" } + ] + }, + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" ], - "type": "tree", - "rules": [ + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "region" - ] - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - "" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "accountId" - ] - }, - false - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "AccountId" - }, - "{bucketArn#accountId}" - ] - } - ] - } - ], - "error": "Invalid ARN: the accountId specified in the ARN (`{bucketArn#accountId}`) does not match the parameter (`{AccountId}`)", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[2]" - ], - "assign": "outpostType" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "bucketArn" - }, - "resourceId[3]" - ], - "assign": "bucketName" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - { - "ref": "outpostType" - }, - "bucket" - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-outposts-fips.{bucketArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "https://s3-outposts.{bucketArn#region}.{arnPartition#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3-outposts", - "signingRegion": "{bucketArn#region}" - } - ] - }, - "headers": { - "x-amz-account-id": [ - "{bucketArn#accountId}" - ], - "x-amz-outpost-id": [ - "{outpostId}" - ] - } - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected an outpost type `bucket`, found `{outpostType}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: expected a bucket name", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: Expected a 4-component resource", - "type": "error" - } - ] - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: missing account ID", - "type": "error" - } - ] - } - ] - }, - { - "conditions": [], - "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", - "type": "error" - } - ] + "ref": "Endpoint" } ] }, { - "conditions": [], - "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", - "type": "error" + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" } - ] + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://s3-outposts.{bucketArn#region}.{arnPartition#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3-outposts", + "signingRegion": "{bucketArn#region}" + } + ] + }, + "headers": { + "x-amz-account-id": [ + "{bucketArn#accountId}" + ], + "x-amz-outpost-id": [ + "{outpostId}" + ] + } + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], - "error": "A valid partition could not be determined", + "error": "Invalid ARN: Expected an outpost type `bucket`, found `{outpostType}`", "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: expected a bucket name", + "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], - "error": "Could not load partition for ARN region `{bucketArn#region}`", + "error": "Invalid ARN: Expected a 4-component resource", "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: missing account ID", + "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], - "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "error": "Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)", "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`", + "type": "error" } - ] - }, - { - "conditions": [], - "error": "Invalid ARN: The Outpost Id was not set", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`", + "type": "error" } - ] + ], + "type": "tree" }, { "conditions": [], - "error": "Invalid ARN: No ARN type specified", + "error": "Invalid ARN: The Outpost Id was not set", "type": "error" } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid ARN: No ARN type specified", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "partitionResult" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true ] - }, + } + ], + "rules": [ { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "aws.partition", - "argv": [ - { - "ref": "Region" - } - ], - "assign": "partitionResult" - } - ], - "type": "tree", - "rules": [ + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "stringEquals", + "argv": [ { - "conditions": [], - "type": "tree", - "rules": [ + "fn": "getAttr", + "argv": [ { - "conditions": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "Region" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "stringEquals", - "argv": [ - { - "fn": "getAttr", - "argv": [ - { - "ref": "partitionResult" - }, - "name" - ] - }, - "aws-cn" - ] - } - ], - "error": "Partition does not support FIPS", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ] - } - ], - "error": "AccountId is required but not set", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - }, - { - "fn": "not", - "argv": [ - { - "fn": "isValidHostLabel", - "argv": [ - { - "ref": "AccountId" - }, - false - ] - } - ] - } - ], - "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "Endpoint" - } - ] - }, - { - "fn": "parseURL", - "argv": [ - { - "ref": "Endpoint" - } - ], - "assign": "url" - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "{url#scheme}://{AccountId}.{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [], - "endpoint": { - "url": "{url#scheme}://{url#authority}{url#path}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-control-fips.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "endpoint": { - "url": "https://s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "RequiresAccountId" - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "RequiresAccountId" - }, - true - ] - }, - { - "fn": "isSet", - "argv": [ - { - "ref": "AccountId" - } - ] - } - ], - "endpoint": { - "url": "https://{AccountId}.s3-control.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseFIPS" - }, - false - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - false - ] - } - ], - "endpoint": { - "url": "https://s3-control.{Region}.{partitionResult#dnsSuffix}", - "properties": { - "authSchemes": [ - { - "disableDoubleEncoding": true, - "name": "sigv4", - "signingName": "s3", - "signingRegion": "{Region}" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - } - ] - } - ] - } - ] - } - ] + "ref": "partitionResult" + }, + "name" + ] + }, + "aws-cn" + ] + } + ], + "error": "Partition does not support FIPS", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ] + } + ], + "error": "AccountId is required but not set", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + }, + { + "fn": "not", + "argv": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "AccountId" + }, + false + ] + } + ] + } + ], + "error": "AccountId must only contain a-z, A-Z, 0-9 and `-`.", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + { + "ref": "Endpoint" + } + ], + "assign": "url" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" }, + true + ] + } + ], + "error": "Invalid Configuration: DualStack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ { - "conditions": [], - "error": "Invalid region: region was not a valid DNS name.", - "type": "error" + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{AccountId}.{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#path}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } ] + }, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "https://{AccountId}.s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "https://{AccountId}.s3-control-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + } + ], + "endpoint": { + "url": "https://s3-control-fips.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "https://{AccountId}.s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "endpoint": { + "url": "https://s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "RequiresAccountId" + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "RequiresAccountId" + }, + true + ] + }, + { + "fn": "isSet", + "argv": [ + { + "ref": "AccountId" + } + ] + } + ], + "endpoint": { + "url": "https://{AccountId}.s3-control.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" } ] }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + false + ] + }, { - "conditions": [], - "error": "A valid partition could not be determined", - "type": "error" + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + false + ] } - ] + ], + "endpoint": { + "url": "https://s3-control.{Region}.{partitionResult#dnsSuffix}", + "properties": { + "authSchemes": [ + { + "disableDoubleEncoding": true, + "name": "sigv4", + "signingName": "s3", + "signingRegion": "{Region}" + } + ] + }, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid region: region was not a valid DNS name.", + "type": "error" } - ] - }, - { - "conditions": [], - "error": "Region must be set", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Region must be set", + "type": "error" } ] }, @@ -3487,7 +3171,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -3527,7 +3210,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -3565,7 +3247,6 @@ ], "params": { "Bucket": "blah", - "Operation": "CreateBucket", "Region": "us-east-2", "RequiresAccountId": false, "UseDualStack": false, @@ -3596,14 +3277,13 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", - "Operation": "ListRegionalBuckets", + "AccountId": "123456789012", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -3625,7 +3305,7 @@ } ] }, - "url": "https://123.s3-control.us-east-2.amazonaws.com" + "url": "https://123456789012.s3-control.us-east-2.amazonaws.com" } }, "operationInputs": [ @@ -3635,13 +3315,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "123", - "Operation": "ListRegionalBuckets", + "AccountId": "123456789012", "Region": "us-east-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3673,14 +3352,13 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", - "Operation": "CreateBucket", + "AccountId": "123456789012", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -3847,7 +3525,7 @@ { "documentation": "Account ID set inline and in ARN and they do not match@us-west-2", "expect": { - "error": "Invalid ARN: the accountId specified in the ARN (`123456789012`) does not match the parameter (`9999999`)" + "error": "Invalid ARN: the accountId specified in the ARN (`123456789012`) does not match the parameter (`999999999999`)" }, "operationInputs": [ { @@ -3857,14 +3535,14 @@ }, "operationName": "GetAccessPoint", "operationParams": { - "AccountId": "9999999", + "AccountId": "999999999999", "Name": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint" } } ], "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", - "AccountId": "9999999", + "AccountId": "999999999999", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": false, @@ -3906,7 +3584,6 @@ "AccessPointName": "apname", "AccountId": "123456789012", "Endpoint": "https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3955,7 +3632,6 @@ "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3970,7 +3646,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -3985,7 +3660,6 @@ "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -4012,7 +3686,6 @@ "params": { "Bucket": "bucketname", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-west-2", "RequiresAccountId": false, @@ -4053,14 +3726,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -4092,15 +3765,14 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", + "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -4134,15 +3806,14 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "123", + "AccountId": "123456789012", "OutpostId": "op-123" } } ], "params": { - "AccountId": "123", + "AccountId": "123456789012", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -4184,7 +3855,6 @@ "params": { "Bucket": "blah", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "123", "Region": "us-east-2", "RequiresAccountId": false, @@ -4200,7 +3870,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -4215,7 +3884,6 @@ "params": { "Bucket": "bucketname", "Endpoint": "https://beta.example.com", - "Operation": "CreateBucket", "OutpostId": "op-123", "Region": "us-west-2", "RequiresAccountId": false, @@ -4256,7 +3924,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4300,7 +3969,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4344,7 +4014,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4389,7 +4060,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4434,7 +4106,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4492,7 +4165,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4536,7 +4210,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4580,7 +4255,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4625,7 +4301,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4670,7 +4347,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4728,7 +4406,8 @@ "operationName": "CreateAccessPoint", "operationParams": { "Bucket": "arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Name": "apname" + "Name": "apname", + "AccountId": "123456789012" } } ], @@ -4772,7 +4451,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4816,7 +4496,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4861,7 +4542,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -4906,7 +4588,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -5072,11 +4755,11 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.us-east-1.amazonaws.com" } }, "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5217,7 +4900,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5227,12 +4910,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5277,7 +4960,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5288,12 +4971,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": false, @@ -5314,7 +4997,7 @@ } ] }, - "url": "https://1234567890-aBC.s3-control-fips.dualstack.us-east-1.amazonaws.com" + "url": "https://123456789012.s3-control-fips.dualstack.us-east-1.amazonaws.com" } }, "operationInputs": [ @@ -5326,12 +5009,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "UseDualStack": true, @@ -5352,7 +5035,7 @@ } ] }, - "url": "https://1234567890-aBC.example.com" + "url": "https://123456789012.example.com" } }, "operationInputs": [ @@ -5363,12 +5046,12 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "Endpoint": "https://example.com" @@ -5420,7 +5103,7 @@ } }, { - "documentation": "account id with custom endpoint, fips and dualstack", + "documentation": "account id with custom endpoint, fips", "expect": { "endpoint": { "properties": { @@ -5433,7 +5116,7 @@ } ] }, - "url": "https://1234567890-aBC.example.com" + "url": "https://123456789012.example.com" } }, "operationInputs": [ @@ -5445,21 +5128,20 @@ }, "operationName": "ListRegionalBuckets", "operationParams": { - "AccountId": "1234567890-aBC" + "AccountId": "123456789012" } } ], "params": { - "AccountId": "1234567890-aBC", + "AccountId": "123456789012", "Region": "us-east-1", "RequiresAccountId": true, "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": true + "UseFIPS": true } }, { - "documentation": "custom endpoint, fips and dualstack", + "documentation": "custom endpoint, fips", "expect": { "endpoint": { "properties": { @@ -5478,8 +5160,7 @@ "params": { "Region": "us-east-1", "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": true + "UseFIPS": true } }, { @@ -5502,32 +5183,19 @@ "params": { "Region": "us-east-1", "Endpoint": "https://example.com", - "UseFIPS": true, - "UseDualstack": false + "UseFIPS": true } }, { - "documentation": "custom endpoint, dualstack", + "documentation": "custom endpoint, DualStack", "expect": { - "endpoint": { - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "s3", - "signingRegion": "us-east-1", - "disableDoubleEncoding": true - } - ] - }, - "url": "https://example.com" - } + "error": "Invalid Configuration: DualStack and custom endpoint are not supported" }, "params": { "Region": "us-east-1", "Endpoint": "https://example.com", "UseFIPS": false, - "UseDualstack": true + "UseDualStack": true } }, { @@ -5551,7 +5219,6 @@ "error": "AccountId is required but not set" }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -5578,7 +5245,6 @@ ], "params": { "AccountId": "/?invalid¬-host*label", - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-east-2", "RequiresAccountId": true, @@ -5659,7 +5325,6 @@ "AccessPointName": "apname", "Endpoint": "https://beta.example.com", "AccountId": "123456789012", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -5694,7 +5359,6 @@ "params": { "AccessPointName": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint", "Endpoint": "https://beta.example.com", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": false, @@ -5702,9 +5366,9 @@ } }, { - "documentation": "Dualstack + Custom endpoint is not supported(non-arn)", + "documentation": "DualStack + Custom endpoint is not supported(non-arn)", "expect": { - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" + "error": "Invalid Configuration: DualStack and custom endpoint are not supported" }, "operationInputs": [ { @@ -5724,7 +5388,6 @@ "AccessPointName": "apname", "Endpoint": "https://beta.example.com", "AccountId": "123456789012", - "Operation": "GetAccessPoint", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -5745,14 +5408,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseDualStack": true, @@ -5779,7 +5442,6 @@ ], "params": { "AccountId": "0123456789012", - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "cn-north-1", "RequiresAccountId": true, @@ -5806,7 +5468,6 @@ ], "params": { "AccountId": "0123456789012", - "Operation": "ListRegionalBuckets", "OutpostId": "?outpost/invalid+", "Region": "us-west-1", "RequiresAccountId": true, @@ -5834,7 +5495,6 @@ "error": "Invalid region: region was not a valid DNS name." }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "invalid-region 42", "AccountId": "0123456", @@ -5861,7 +5521,6 @@ } }, "params": { - "Operation": "ListRegionalBuckets", "OutpostId": "op-123", "Region": "us-west-2", "UseDualStack": false, @@ -5921,14 +5580,14 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", "Endpoint": "https://beta.example.com", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": false, @@ -6024,7 +5683,8 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], @@ -6049,13 +5709,13 @@ }, "operationName": "GetBucket", "operationParams": { - "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket" + "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", + "AccountId": "123456789012" } } ], "params": { "Bucket": "arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket", - "Operation": "GetBucket", "Region": "us-west-2", "RequiresAccountId": true, "UseArnRegion": true, @@ -6284,22 +5944,20 @@ "Bucket": "bucketName", "Endpoint": "https://10.0.1.12:433", "UseFIPS": true, - "UseDualStack": false, - "Accelerate": false + "UseDualStack": false } }, { - "documentation": "S3 Snow Control with Dual-stack enabled", + "documentation": "S3 Snow Control with Dualstack enabled", "expect": { - "error": "S3 Snow does not support Dual-stack" + "error": "S3 Snow does not support DualStack" }, "params": { "Region": "snow", "Bucket": "bucketName", "Endpoint": "https://10.0.1.12:433", "UseFIPS": false, - "UseDualStack": true, - "Accelerate": false + "UseDualStack": true } } ], @@ -7058,6 +6716,9 @@ "smithy.api#documentation": "

The alias of the Object Lambda Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateAccessPointRequest": { @@ -7131,6 +6792,9 @@ "smithy.api#documentation": "

The name or alias of the access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateBucket": { @@ -7276,6 +6940,9 @@ "smithy.api#documentation": "

The Amazon Resource Name (ARN) of the bucket.

\n

For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.

\n

For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must specify the ARN of the bucket accessed in the format arn:aws:s3-outposts:::outpost//bucket/. For example, to access the bucket reports through Outpost my-outpost owned by account 123456789012 in Region us-west-2, use the URL encoding of arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports. The value must be URL encoded.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateJob": { @@ -7414,6 +7081,9 @@ "smithy.api#documentation": "

The ID for this job. Amazon S3 generates this ID automatically and returns it after a\n successful Create Job request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreateMultiRegionAccessPoint": { @@ -7511,6 +7181,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#CreationDate": { @@ -8098,7 +7771,10 @@ }, "com.amazonaws.s3control#DeleteJobTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#DeleteMarkerReplication": { "type": "structure", @@ -8217,6 +7893,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#DeletePublicAccessBlock": { @@ -8372,7 +8051,10 @@ }, "com.amazonaws.s3control#DeleteStorageLensConfigurationTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#DescribeJob": { "type": "operation", @@ -8450,6 +8132,9 @@ "smithy.api#documentation": "

Contains the configuration parameters and status for the job specified in the\n Describe Job request.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#DescribeMultiRegionAccessPointOperation": { @@ -8515,6 +8200,9 @@ "smithy.api#documentation": "

A container element containing the details of the asynchronous operation.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#Destination": { @@ -8851,6 +8539,9 @@ "smithy.api#documentation": "

Object Lambda Access Point configuration document.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointForObjectLambda": { @@ -8933,6 +8624,9 @@ "smithy.api#documentation": "

The alias of the Object Lambda Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicy": { @@ -9022,6 +8716,9 @@ "smithy.api#documentation": "

Object Lambda Access Point resource policy document.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyRequest": { @@ -9064,6 +8761,9 @@ "smithy.api#documentation": "

The access point policy associated with the specified access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyStatus": { @@ -9150,6 +8850,9 @@ "PolicyStatus": { "target": "com.amazonaws.s3control#PolicyStatus" } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointPolicyStatusRequest": { @@ -9192,6 +8895,9 @@ "smithy.api#documentation": "

Indicates the current policy status of the specified access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetAccessPointRequest": { @@ -9285,6 +8991,9 @@ "smithy.api#documentation": "

The Amazon Web Services account ID associated with the S3 bucket associated with this access point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucket": { @@ -9377,6 +9086,9 @@ "smithy.api#documentation": "

Container for the lifecycle rule of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketPolicy": { @@ -9444,6 +9156,9 @@ "smithy.api#documentation": "

The policy of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketReplication": { @@ -9511,6 +9226,9 @@ "smithy.api#documentation": "

A container for one or more replication rules. A replication configuration must have at least one rule and you can add up to 100 rules. The maximum size of a\n replication configuration is 128 KB.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketRequest": { @@ -9566,6 +9284,9 @@ "smithy.api#documentation": "

The creation date of the Outposts bucket.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketTagging": { @@ -9634,6 +9355,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetBucketVersioning": { @@ -9708,6 +9432,9 @@ "smithy.api#xmlName": "MfaDelete" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetJobTagging": { @@ -9783,6 +9510,9 @@ "smithy.api#documentation": "

The set of tags associated with the S3 Batch Operations job.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPoint": { @@ -9874,6 +9604,9 @@ "smithy.api#documentation": "

The policy associated with the specified Multi-Region Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatus": { @@ -9936,6 +9669,9 @@ "Established": { "target": "com.amazonaws.s3control#PolicyStatus" } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointRequest": { @@ -9975,6 +9711,9 @@ "smithy.api#documentation": "

A container element containing the details of the requested Multi-Region Access Point.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetMultiRegionAccessPointRoutes": { @@ -10046,6 +9785,9 @@ "smithy.api#documentation": "

The different routes that make up the route configuration. Active routes return a value\n of 100, and passive routes return a value of 0.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetPublicAccessBlock": { @@ -10176,6 +9918,9 @@ "smithy.api#httpPayload": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GetStorageLensConfigurationTagging": { @@ -10240,6 +9985,9 @@ "smithy.api#documentation": "

The tags of S3 Storage Lens configuration requested.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#GrantFullControl": { @@ -11420,6 +11168,9 @@ "smithy.api#documentation": "

If the list has more access points than can be returned in one call to this API, this field\n contains a continuation token that you can provide in subsequent calls to this API to\n retrieve additional access points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListAccessPointsRequest": { @@ -11482,6 +11233,9 @@ "smithy.api#documentation": "

If the specified bucket has more access points than can be returned in one call to this API,\n this field contains a continuation token that you can provide in subsequent calls to this\n API to retrieve additional access points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListJobs": { @@ -11582,6 +11336,9 @@ "smithy.api#documentation": "

The list of current jobs and jobs that have ended within the last 30 days.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListMultiRegionAccessPoints": { @@ -11665,6 +11422,9 @@ "smithy.api#documentation": "

If the specified bucket has more Multi-Region Access Points than can be returned in one call to this\n action, this field contains a continuation token. You can use this token tin subsequent\n calls to this action to retrieve additional Multi-Region Access Points.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListRegionalBuckets": { @@ -11757,6 +11517,9 @@ "smithy.api#documentation": "

\n NextToken is sent when isTruncated is true, which means there\n are more buckets that can be listed. The next list requests to Amazon S3 can be continued with\n this NextToken. NextToken is obfuscated and is not a real\n key.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#ListStorageLensConfigurationEntry": { @@ -11867,6 +11630,9 @@ "smithy.api#xmlFlattened": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#Location": { @@ -11978,7 +11744,6 @@ "com.amazonaws.s3control#MinStorageBytesPercentage": { "type": "double", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 0.1, "max": 100 @@ -13453,7 +13218,10 @@ }, "com.amazonaws.s3control#PutJobTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#PutMultiRegionAccessPointPolicy": { "type": "operation", @@ -13547,6 +13315,9 @@ "smithy.api#documentation": "

The request token associated with the request. You can use this token with DescribeMultiRegionAccessPointOperation to determine the status of asynchronous\n requests.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#PutPublicAccessBlock": { @@ -13731,7 +13502,10 @@ }, "com.amazonaws.s3control#PutStorageLensConfigurationTaggingResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#Region": { "type": "structure", @@ -15306,14 +15080,12 @@ "MaxDepth": { "target": "com.amazonaws.s3control#StorageLensPrefixLevelMaxDepth", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The max depth of the selection criteria

" } }, "MinStorageBytesPercentage": { "target": "com.amazonaws.s3control#MinStorageBytesPercentage", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The minimum number of storage bytes percentage whose metrics will be selected.

\n \n

You must choose a value greater than or equal to 1.0.

\n
" } } @@ -15528,7 +15300,6 @@ "com.amazonaws.s3control#StorageLensPrefixLevelMaxDepth": { "type": "integer", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 10 @@ -15639,7 +15410,10 @@ }, "com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutesResult": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.s3control#SuspendedCause": { "type": "string", @@ -15889,6 +15663,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#UpdateJobStatus": { @@ -15997,6 +15774,9 @@ "smithy.api#documentation": "

The reason that the specified job's status was updated.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.s3control#VersioningConfiguration": { diff --git a/aws/sdk/aws-models/sdk-endpoints.json b/aws/sdk/aws-models/sdk-endpoints.json index b74e1ac35da..0ab97122237 100644 --- a/aws/sdk/aws-models/sdk-endpoints.json +++ b/aws/sdk/aws-models/sdk-endpoints.json @@ -21,7 +21,7 @@ "dnsSuffix" : "amazonaws.com", "partition" : "aws", "partitionName" : "AWS Standard", - "regionRegex" : "^(us|eu|ap|sa|ca|me|af)\\-\\w+\\-\\d+$", + "regionRegex" : "^(us|eu|ap|sa|ca|me|af|il)\\-\\w+\\-\\d+$", "regions" : { "af-south-1" : { "description" : "Africa (Cape Town)" @@ -83,6 +83,9 @@ "eu-west-3" : { "description" : "Europe (Paris)" }, + "il-central-1" : { + "description" : "Israel (Tel Aviv)" + }, "me-central-1" : { "description" : "Middle East (UAE)" }, @@ -173,6 +176,7 @@ "deprecated" : true, "hostname" : "access-analyzer-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -248,6 +252,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -370,6 +375,7 @@ "deprecated" : true, "hostname" : "acm-pca-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -796,6 +802,12 @@ "deprecated" : true, "hostname" : "ecr-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "credentialScope" : { + "region" : "il-central-1" + }, + "hostname" : "api.ecr.il-central-1.amazonaws.com" + }, "me-central-1" : { "credentialScope" : { "region" : "me-central-1" @@ -1055,6 +1067,7 @@ }, "endpoints" : { "ap-south-1" : { }, + "eu-central-1" : { }, "us-east-1" : { } } }, @@ -1086,6 +1099,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1294,6 +1308,7 @@ "deprecated" : true, "hostname" : "apigateway-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1359,6 +1374,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1390,6 +1406,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1444,6 +1461,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1461,16 +1479,20 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, "ca-central-1" : { }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { }, @@ -1855,6 +1877,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -1902,6 +1925,12 @@ "tags" : [ "dualstack" ] } ] }, + "ap-south-2" : { + "variants" : [ { + "hostname" : "athena.ap-south-2.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "ap-southeast-1" : { "variants" : [ { "hostname" : "athena.ap-southeast-1.api.aws", @@ -1920,6 +1949,12 @@ "tags" : [ "dualstack" ] } ] }, + "ap-southeast-4" : { + "variants" : [ { + "hostname" : "athena.ap-southeast-4.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "ca-central-1" : { "variants" : [ { "hostname" : "athena.ca-central-1.api.aws", @@ -1932,6 +1967,12 @@ "tags" : [ "dualstack" ] } ] }, + "eu-central-2" : { + "variants" : [ { + "hostname" : "athena.eu-central-2.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "eu-north-1" : { "variants" : [ { "hostname" : "athena.eu-north-1.api.aws", @@ -1944,6 +1985,12 @@ "tags" : [ "dualstack" ] } ] }, + "eu-south-2" : { + "variants" : [ { + "hostname" : "athena.eu-south-2.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "eu-west-1" : { "variants" : [ { "hostname" : "athena.eu-west-1.api.aws", @@ -1990,6 +2037,12 @@ "deprecated" : true, "hostname" : "athena-fips.us-west-2.amazonaws.com" }, + "me-central-1" : { + "variants" : [ { + "hostname" : "athena.me-central-1.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "me-south-1" : { "variants" : [ { "hostname" : "athena.me-south-1.api.aws", @@ -2093,6 +2146,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2189,9 +2243,32 @@ }, "backupstorage" : { "endpoints" : { + "af-south-1" : { }, + "ap-east-1" : { }, + "ap-northeast-1" : { }, + "ap-northeast-2" : { }, + "ap-northeast-3" : { }, + "ap-south-1" : { }, + "ap-south-2" : { }, + "ap-southeast-1" : { }, + "ap-southeast-2" : { }, + "ap-southeast-3" : { }, + "ap-southeast-4" : { }, + "ca-central-1" : { }, + "eu-central-1" : { }, + "eu-central-2" : { }, + "eu-north-1" : { }, + "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, + "eu-west-2" : { }, + "eu-west-3" : { }, + "me-central-1" : { }, + "me-south-1" : { }, + "sa-east-1" : { }, "us-east-1" : { }, "us-east-2" : { }, + "us-west-1" : { }, "us-west-2" : { } } }, @@ -2518,6 +2595,7 @@ "deprecated" : true, "hostname" : "cloudcontrolapi-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2582,6 +2660,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2681,6 +2760,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2754,6 +2834,7 @@ "deprecated" : true, "hostname" : "cloudtrail-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -2848,6 +2929,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -3031,6 +3113,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -3684,6 +3767,7 @@ "deprecated" : true, "hostname" : "config-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -3788,6 +3872,8 @@ "endpoints" : { "ap-northeast-1" : { }, "ap-northeast-2" : { }, + "ap-south-1" : { }, + "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ca-central-1" : { }, "eu-central-1" : { }, @@ -4500,6 +4586,7 @@ "deprecated" : true, "hostname" : "directconnect-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -4548,6 +4635,7 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, @@ -4609,6 +4697,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -4762,16 +4851,21 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { }, @@ -4842,6 +4936,7 @@ "deprecated" : true, "hostname" : "ds-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -4908,6 +5003,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "local" : { "credentialScope" : { "region" : "us-east-1" @@ -5034,6 +5130,7 @@ "deprecated" : true, "hostname" : "ebs-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -5138,6 +5235,7 @@ "deprecated" : true, "hostname" : "ec2-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { @@ -5231,6 +5329,7 @@ "deprecated" : true, "hostname" : "ecs-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -5327,6 +5426,7 @@ "deprecated" : true, "hostname" : "fips.eks.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -5385,6 +5485,7 @@ "deprecated" : true, "hostname" : "elasticache-fips.us-west-1.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -5488,6 +5589,7 @@ "deprecated" : true, "hostname" : "elasticbeanstalk-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { @@ -5778,6 +5880,13 @@ "deprecated" : true, "hostname" : "elasticfilesystem-fips.eu-west-3.amazonaws.com" }, + "fips-il-central-1" : { + "credentialScope" : { + "region" : "il-central-1" + }, + "deprecated" : true, + "hostname" : "elasticfilesystem-fips.il-central-1.amazonaws.com" + }, "fips-me-central-1" : { "credentialScope" : { "region" : "me-central-1" @@ -5827,6 +5936,12 @@ "deprecated" : true, "hostname" : "elasticfilesystem-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "variants" : [ { + "hostname" : "elasticfilesystem-fips.il-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "me-central-1" : { "variants" : [ { "hostname" : "elasticfilesystem-fips.me-central-1.amazonaws.com", @@ -5924,6 +6039,7 @@ "deprecated" : true, "hostname" : "elasticloadbalancing-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -6021,6 +6137,7 @@ "deprecated" : true, "hostname" : "elasticmapreduce-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -6114,6 +6231,7 @@ }, "emr-containers" : { "endpoints" : { + "af-south-1" : { }, "ap-east-1" : { }, "ap-northeast-1" : { }, "ap-northeast-2" : { }, @@ -6128,6 +6246,7 @@ }, "eu-central-1" : { }, "eu-north-1" : { }, + "eu-south-1" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, @@ -6315,6 +6434,7 @@ "deprecated" : true, "hostname" : "es-fips.us-west-1.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -6422,6 +6542,7 @@ "deprecated" : true, "hostname" : "events-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -6550,6 +6671,7 @@ "deprecated" : true, "hostname" : "firehose-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -7272,9 +7394,11 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { }, "eu-central-1" : { }, "eu-central-2" : { }, @@ -7312,6 +7436,7 @@ "deprecated" : true, "hostname" : "glue-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -7718,6 +7843,7 @@ "identitystore" : { "endpoints" : { "af-south-1" : { }, + "ap-east-1" : { }, "ap-northeast-1" : { }, "ap-northeast-2" : { }, "ap-northeast-3" : { }, @@ -7732,9 +7858,11 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { }, "us-east-2" : { }, + "us-west-1" : { }, "us-west-2" : { } } }, @@ -7893,12 +8021,60 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "fips-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-east-1.amazonaws.com" + }, + "fips-us-east-2" : { + "credentialScope" : { + "region" : "us-east-2" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-east-2.amazonaws.com" + }, + "fips-us-west-1" : { + "credentialScope" : { + "region" : "us-west-1" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-west-1.amazonaws.com" + }, + "fips-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-west-2.amazonaws.com" + }, "me-south-1" : { }, "sa-east-1" : { }, - "us-east-1" : { }, - "us-east-2" : { }, - "us-west-1" : { }, - "us-west-2" : { } + "us-east-1" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-east-2" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-east-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-1" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-2" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-west-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + } } }, "internetmonitor" : { @@ -7923,27 +8099,49 @@ "ap-northeast-2" : { "hostname" : "internetmonitor.ap-northeast-2.api.aws" }, + "ap-northeast-3" : { + "hostname" : "internetmonitor.ap-northeast-3.api.aws" + }, "ap-south-1" : { "hostname" : "internetmonitor.ap-south-1.api.aws" }, + "ap-south-2" : { + "hostname" : "internetmonitor.ap-south-2.api.aws" + }, "ap-southeast-1" : { "hostname" : "internetmonitor.ap-southeast-1.api.aws" }, "ap-southeast-2" : { "hostname" : "internetmonitor.ap-southeast-2.api.aws" }, + "ap-southeast-3" : { + "hostname" : "internetmonitor.ap-southeast-3.api.aws" + }, + "ap-southeast-4" : { + "hostname" : "internetmonitor.ap-southeast-4.api.aws" + }, "ca-central-1" : { - "hostname" : "internetmonitor.ca-central-1.api.aws" + "hostname" : "internetmonitor.ca-central-1.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.ca-central-1.api.aws", + "tags" : [ "fips" ] + } ] }, "eu-central-1" : { "hostname" : "internetmonitor.eu-central-1.api.aws" }, + "eu-central-2" : { + "hostname" : "internetmonitor.eu-central-2.api.aws" + }, "eu-north-1" : { "hostname" : "internetmonitor.eu-north-1.api.aws" }, "eu-south-1" : { "hostname" : "internetmonitor.eu-south-1.api.aws" }, + "eu-south-2" : { + "hostname" : "internetmonitor.eu-south-2.api.aws" + }, "eu-west-1" : { "hostname" : "internetmonitor.eu-west-1.api.aws" }, @@ -7953,6 +8151,12 @@ "eu-west-3" : { "hostname" : "internetmonitor.eu-west-3.api.aws" }, + "il-central-1" : { + "hostname" : "internetmonitor.il-central-1.api.aws" + }, + "me-central-1" : { + "hostname" : "internetmonitor.me-central-1.api.aws" + }, "me-south-1" : { "hostname" : "internetmonitor.me-south-1.api.aws" }, @@ -7960,16 +8164,32 @@ "hostname" : "internetmonitor.sa-east-1.api.aws" }, "us-east-1" : { - "hostname" : "internetmonitor.us-east-1.api.aws" + "hostname" : "internetmonitor.us-east-1.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.us-east-1.api.aws", + "tags" : [ "fips" ] + } ] }, "us-east-2" : { - "hostname" : "internetmonitor.us-east-2.api.aws" + "hostname" : "internetmonitor.us-east-2.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.us-east-2.api.aws", + "tags" : [ "fips" ] + } ] }, "us-west-1" : { - "hostname" : "internetmonitor.us-west-1.api.aws" + "hostname" : "internetmonitor.us-west-1.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.us-west-1.api.aws", + "tags" : [ "fips" ] + } ] }, "us-west-2" : { - "hostname" : "internetmonitor.us-west-2.api.aws" + "hostname" : "internetmonitor.us-west-2.api.aws", + "variants" : [ { + "hostname" : "internetmonitor-fips.us-west-2.api.aws", + "tags" : [ "fips" ] + } ] } } }, @@ -8419,8 +8639,104 @@ "endpoints" : { "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "api-ap-southeast-1" : { + "credentialScope" : { + "region" : "ap-southeast-1" + }, + "hostname" : "api.iottwinmaker.ap-southeast-1.amazonaws.com" + }, + "api-ap-southeast-2" : { + "credentialScope" : { + "region" : "ap-southeast-2" + }, + "hostname" : "api.iottwinmaker.ap-southeast-2.amazonaws.com" + }, + "api-eu-central-1" : { + "credentialScope" : { + "region" : "eu-central-1" + }, + "hostname" : "api.iottwinmaker.eu-central-1.amazonaws.com" + }, + "api-eu-west-1" : { + "credentialScope" : { + "region" : "eu-west-1" + }, + "hostname" : "api.iottwinmaker.eu-west-1.amazonaws.com" + }, + "api-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "hostname" : "api.iottwinmaker.us-east-1.amazonaws.com" + }, + "api-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "hostname" : "api.iottwinmaker.us-west-2.amazonaws.com" + }, + "data-ap-southeast-1" : { + "credentialScope" : { + "region" : "ap-southeast-1" + }, + "hostname" : "data.iottwinmaker.ap-southeast-1.amazonaws.com" + }, + "data-ap-southeast-2" : { + "credentialScope" : { + "region" : "ap-southeast-2" + }, + "hostname" : "data.iottwinmaker.ap-southeast-2.amazonaws.com" + }, + "data-eu-central-1" : { + "credentialScope" : { + "region" : "eu-central-1" + }, + "hostname" : "data.iottwinmaker.eu-central-1.amazonaws.com" + }, + "data-eu-west-1" : { + "credentialScope" : { + "region" : "eu-west-1" + }, + "hostname" : "data.iottwinmaker.eu-west-1.amazonaws.com" + }, + "data-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "hostname" : "data.iottwinmaker.us-east-1.amazonaws.com" + }, + "data-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "hostname" : "data.iottwinmaker.us-west-2.amazonaws.com" + }, "eu-central-1" : { }, "eu-west-1" : { }, + "fips-api-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "hostname" : "api.iottwinmaker-fips.us-east-1.amazonaws.com" + }, + "fips-api-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "hostname" : "api.iottwinmaker-fips.us-west-2.amazonaws.com" + }, + "fips-data-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "hostname" : "data.iottwinmaker-fips.us-east-1.amazonaws.com" + }, + "fips-data-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "hostname" : "data.iottwinmaker-fips.us-west-2.amazonaws.com" + }, "fips-us-east-1" : { "credentialScope" : { "region" : "us-east-1" @@ -8745,6 +9061,9 @@ "eu-west-3" : { "hostname" : "kendra-ranking.eu-west-3.api.aws" }, + "il-central-1" : { + "hostname" : "kendra-ranking.il-central-1.api.aws" + }, "me-central-1" : { "hostname" : "kendra-ranking.me-central-1.api.aws" }, @@ -8830,6 +9149,7 @@ "deprecated" : true, "hostname" : "kinesis-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -8881,6 +9201,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -9179,10 +9500,17 @@ "deprecated" : true, "hostname" : "kms-fips.eu-west-3.amazonaws.com" }, + "il-central-1" : { + "variants" : [ { + "hostname" : "kms-fips.il-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "il-central-1-fips" : { "credentialScope" : { "region" : "il-central-1" }, + "deprecated" : true, "hostname" : "kms-fips.il-central-1.amazonaws.com" }, "me-central-1" : { @@ -9286,9 +9614,11 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { }, "eu-central-1" : { }, "eu-central-2" : { }, @@ -9326,6 +9656,7 @@ "deprecated" : true, "hostname" : "lakeformation-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -9505,6 +9836,12 @@ "deprecated" : true, "hostname" : "lambda-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "variants" : [ { + "hostname" : "lambda.il-central-1.api.aws", + "tags" : [ "dualstack" ] + } ] + }, "me-central-1" : { "variants" : [ { "hostname" : "lambda.me-central-1.api.aws", @@ -9685,6 +10022,7 @@ "deprecated" : true, "hostname" : "license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -9855,6 +10193,7 @@ "deprecated" : true, "hostname" : "logs-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -10127,12 +10466,15 @@ }, "mediaconnect" : { "endpoints" : { + "af-south-1" : { }, "ap-east-1" : { }, "ap-northeast-1" : { }, "ap-northeast-2" : { }, + "ap-northeast-3" : { }, "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, "eu-central-1" : { }, "eu-north-1" : { }, "eu-west-1" : { }, @@ -10287,6 +10629,7 @@ "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, "eu-central-1" : { }, "eu-north-1" : { }, "eu-west-1" : { }, @@ -10306,6 +10649,7 @@ "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, "eu-central-1" : { }, "eu-north-1" : { }, "eu-west-1" : { }, @@ -10325,6 +10669,7 @@ "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, "eu-central-1" : { }, "eu-north-1" : { }, "eu-west-1" : { }, @@ -10455,6 +10800,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -10486,6 +10832,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -10725,6 +11072,7 @@ "deprecated" : true, "hostname" : "monitoring-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -10962,9 +11310,11 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { "variants" : [ { "hostname" : "network-firewall-fips.ca-central-1.amazonaws.com", @@ -10972,8 +11322,10 @@ } ] }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, @@ -11047,7 +11399,18 @@ "credentialScope" : { "region" : "us-west-2" }, - "hostname" : "networkmanager.us-west-2.amazonaws.com" + "hostname" : "networkmanager.us-west-2.amazonaws.com", + "variants" : [ { + "hostname" : "networkmanager-fips.us-west-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "fips-aws-global" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "deprecated" : true, + "hostname" : "networkmanager-fips.us-west-2.amazonaws.com" } }, "isRegionalized" : false, @@ -11056,10 +11419,15 @@ "nimble" : { "endpoints" : { "ap-northeast-1" : { }, + "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ca-central-1" : { }, + "eu-central-1" : { }, + "eu-north-1" : { }, + "eu-west-1" : { }, "eu-west-2" : { }, "us-east-1" : { }, + "us-east-2" : { }, "us-west-2" : { } } }, @@ -11085,6 +11453,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -11522,6 +11891,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12071,6 +12441,7 @@ "deprecated" : true, "hostname" : "ram-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12162,6 +12533,7 @@ "deprecated" : true, "hostname" : "rbin-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12225,6 +12597,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "rds-fips.ca-central-1" : { @@ -12496,6 +12869,7 @@ "deprecated" : true, "hostname" : "redshift-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12785,6 +13159,9 @@ "eu-west-3" : { "hostname" : "resource-explorer-2.eu-west-3.api.aws" }, + "il-central-1" : { + "hostname" : "resource-explorer-2.il-central-1.api.aws" + }, "sa-east-1" : { "hostname" : "resource-explorer-2.sa-east-1.api.aws" }, @@ -12852,6 +13229,7 @@ "deprecated" : true, "hostname" : "resource-groups-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -12981,6 +13359,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -13092,6 +13471,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -13340,6 +13720,12 @@ "deprecated" : true, "hostname" : "s3-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "variants" : [ { + "hostname" : "s3.dualstack.il-central-1.amazonaws.com", + "tags" : [ "dualstack" ] + } ] + }, "me-central-1" : { "variants" : [ { "hostname" : "s3.dualstack.me-central-1.amazonaws.com", @@ -13810,18 +14196,26 @@ }, "schemas" : { "endpoints" : { + "af-south-1" : { }, "ap-east-1" : { }, "ap-northeast-1" : { }, "ap-northeast-2" : { }, + "ap-northeast-3" : { }, "ap-south-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ap-southeast-3" : { }, "ca-central-1" : { }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, + "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "me-central-1" : { }, + "me-south-1" : { }, "sa-east-1" : { }, "us-east-1" : { }, "us-east-2" : { }, @@ -13881,6 +14275,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -13988,6 +14383,7 @@ "deprecated" : true, "hostname" : "securityhub-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -14117,6 +14513,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -14182,9 +14579,11 @@ "ap-northeast-2" : { }, "ap-northeast-3" : { }, "ap-south-1" : { }, + "ap-south-2" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { "variants" : [ { "hostname" : "servicecatalog-appregistry-fips.ca-central-1.amazonaws.com", @@ -14192,8 +14591,10 @@ } ] }, "eu-central-1" : { }, + "eu-central-2" : { }, "eu-north-1" : { }, "eu-south-1" : { }, + "eu-south-2" : { }, "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, @@ -14265,67 +14666,67 @@ "endpoints" : { "af-south-1" : { "variants" : [ { - "hostname" : "servicediscovery.af-south-1.amazonaws.com", + "hostname" : "servicediscovery.af-south-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-east-1" : { "variants" : [ { - "hostname" : "servicediscovery.ap-east-1.amazonaws.com", + "hostname" : "servicediscovery.ap-east-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-northeast-1" : { "variants" : [ { - "hostname" : "servicediscovery.ap-northeast-1.amazonaws.com", + "hostname" : "servicediscovery.ap-northeast-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-northeast-2" : { "variants" : [ { - "hostname" : "servicediscovery.ap-northeast-2.amazonaws.com", + "hostname" : "servicediscovery.ap-northeast-2.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-northeast-3" : { "variants" : [ { - "hostname" : "servicediscovery.ap-northeast-3.amazonaws.com", + "hostname" : "servicediscovery.ap-northeast-3.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-south-1" : { "variants" : [ { - "hostname" : "servicediscovery.ap-south-1.amazonaws.com", + "hostname" : "servicediscovery.ap-south-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-south-2" : { "variants" : [ { - "hostname" : "servicediscovery.ap-south-2.amazonaws.com", + "hostname" : "servicediscovery.ap-south-2.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-southeast-1" : { "variants" : [ { - "hostname" : "servicediscovery.ap-southeast-1.amazonaws.com", + "hostname" : "servicediscovery.ap-southeast-1.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-southeast-2" : { "variants" : [ { - "hostname" : "servicediscovery.ap-southeast-2.amazonaws.com", + "hostname" : "servicediscovery.ap-southeast-2.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-southeast-3" : { "variants" : [ { - "hostname" : "servicediscovery.ap-southeast-3.amazonaws.com", + "hostname" : "servicediscovery.ap-southeast-3.api.aws", "tags" : [ "dualstack" ] } ] }, "ap-southeast-4" : { "variants" : [ { - "hostname" : "servicediscovery.ap-southeast-4.amazonaws.com", + "hostname" : "servicediscovery.ap-southeast-4.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14334,7 +14735,10 @@ "hostname" : "servicediscovery-fips.ca-central-1.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.ca-central-1.amazonaws.com", + "hostname" : "servicediscovery-fips.ca-central-1.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.ca-central-1.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14347,93 +14751,85 @@ }, "eu-central-1" : { "variants" : [ { - "hostname" : "servicediscovery.eu-central-1.amazonaws.com", + "hostname" : "servicediscovery.eu-central-1.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-central-2" : { "variants" : [ { - "hostname" : "servicediscovery.eu-central-2.amazonaws.com", + "hostname" : "servicediscovery.eu-central-2.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-north-1" : { "variants" : [ { - "hostname" : "servicediscovery.eu-north-1.amazonaws.com", + "hostname" : "servicediscovery.eu-north-1.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-south-1" : { "variants" : [ { - "hostname" : "servicediscovery.eu-south-1.amazonaws.com", + "hostname" : "servicediscovery.eu-south-1.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-south-2" : { "variants" : [ { - "hostname" : "servicediscovery.eu-south-2.amazonaws.com", + "hostname" : "servicediscovery.eu-south-2.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-west-1" : { "variants" : [ { - "hostname" : "servicediscovery.eu-west-1.amazonaws.com", + "hostname" : "servicediscovery.eu-west-1.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-west-2" : { "variants" : [ { - "hostname" : "servicediscovery.eu-west-2.amazonaws.com", + "hostname" : "servicediscovery.eu-west-2.api.aws", "tags" : [ "dualstack" ] } ] }, "eu-west-3" : { "variants" : [ { - "hostname" : "servicediscovery.eu-west-3.amazonaws.com", + "hostname" : "servicediscovery.eu-west-3.api.aws", "tags" : [ "dualstack" ] } ] }, - "me-central-1" : { + "il-central-1" : { "variants" : [ { - "hostname" : "servicediscovery.me-central-1.amazonaws.com", + "hostname" : "servicediscovery.il-central-1.api.aws", "tags" : [ "dualstack" ] } ] }, - "me-south-1" : { + "me-central-1" : { "variants" : [ { - "hostname" : "servicediscovery.me-south-1.amazonaws.com", + "hostname" : "servicediscovery.me-central-1.api.aws", "tags" : [ "dualstack" ] } ] }, - "sa-east-1" : { + "me-south-1" : { "variants" : [ { - "hostname" : "servicediscovery.sa-east-1.amazonaws.com", + "hostname" : "servicediscovery.me-south-1.api.aws", "tags" : [ "dualstack" ] } ] }, - "servicediscovery" : { - "credentialScope" : { - "region" : "ca-central-1" - }, - "deprecated" : true, + "sa-east-1" : { "variants" : [ { - "hostname" : "servicediscovery-fips.ca-central-1.amazonaws.com", - "tags" : [ "fips" ] + "hostname" : "servicediscovery.sa-east-1.api.aws", + "tags" : [ "dualstack" ] } ] }, - "servicediscovery-fips" : { - "credentialScope" : { - "region" : "ca-central-1" - }, - "deprecated" : true, - "hostname" : "servicediscovery-fips.ca-central-1.amazonaws.com" - }, "us-east-1" : { "variants" : [ { "hostname" : "servicediscovery-fips.us-east-1.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.us-east-1.amazonaws.com", + "hostname" : "servicediscovery-fips.us-east-1.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.us-east-1.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14449,7 +14845,10 @@ "hostname" : "servicediscovery-fips.us-east-2.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.us-east-2.amazonaws.com", + "hostname" : "servicediscovery-fips.us-east-2.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.us-east-2.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14465,7 +14864,10 @@ "hostname" : "servicediscovery-fips.us-west-1.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.us-west-1.amazonaws.com", + "hostname" : "servicediscovery-fips.us-west-1.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.us-west-1.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14481,7 +14883,10 @@ "hostname" : "servicediscovery-fips.us-west-2.amazonaws.com", "tags" : [ "fips" ] }, { - "hostname" : "servicediscovery.us-west-2.amazonaws.com", + "hostname" : "servicediscovery-fips.us-west-2.api.aws", + "tags" : [ "dualstack", "fips" ] + }, { + "hostname" : "servicediscovery.us-west-2.api.aws", "tags" : [ "dualstack" ] } ] }, @@ -14692,41 +15097,6 @@ }, "sms" : { "endpoints" : { - "af-south-1" : { }, - "ap-east-1" : { }, - "ap-northeast-1" : { }, - "ap-northeast-2" : { }, - "ap-south-1" : { }, - "ap-southeast-1" : { }, - "ap-southeast-2" : { }, - "ca-central-1" : { }, - "eu-central-1" : { }, - "eu-north-1" : { }, - "eu-south-1" : { }, - "eu-west-1" : { }, - "eu-west-2" : { }, - "eu-west-3" : { }, - "fips-us-east-1" : { - "credentialScope" : { - "region" : "us-east-1" - }, - "deprecated" : true, - "hostname" : "sms-fips.us-east-1.amazonaws.com" - }, - "fips-us-east-2" : { - "credentialScope" : { - "region" : "us-east-2" - }, - "deprecated" : true, - "hostname" : "sms-fips.us-east-2.amazonaws.com" - }, - "fips-us-west-1" : { - "credentialScope" : { - "region" : "us-west-1" - }, - "deprecated" : true, - "hostname" : "sms-fips.us-west-1.amazonaws.com" - }, "fips-us-west-2" : { "credentialScope" : { "region" : "us-west-2" @@ -14734,26 +15104,6 @@ "deprecated" : true, "hostname" : "sms-fips.us-west-2.amazonaws.com" }, - "me-south-1" : { }, - "sa-east-1" : { }, - "us-east-1" : { - "variants" : [ { - "hostname" : "sms-fips.us-east-1.amazonaws.com", - "tags" : [ "fips" ] - } ] - }, - "us-east-2" : { - "variants" : [ { - "hostname" : "sms-fips.us-east-2.amazonaws.com", - "tags" : [ "fips" ] - } ] - }, - "us-west-1" : { - "variants" : [ { - "hostname" : "sms-fips.us-west-1.amazonaws.com", - "tags" : [ "fips" ] - } ] - }, "us-west-2" : { "variants" : [ { "hostname" : "sms-fips.us-west-2.amazonaws.com", @@ -15083,6 +15433,7 @@ "deprecated" : true, "hostname" : "sns-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15166,6 +15517,7 @@ "deprecated" : true, "hostname" : "sqs-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15258,6 +15610,7 @@ "deprecated" : true, "hostname" : "ssm-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15287,7 +15640,7 @@ } } }, - "ssm-incidents" : { + "ssm-contacts" : { "endpoints" : { "ap-northeast-1" : { }, "ap-northeast-2" : { }, @@ -15300,11 +15653,139 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "fips-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "deprecated" : true, + "hostname" : "ssm-contacts-fips.us-east-1.amazonaws.com" + }, + "fips-us-east-2" : { + "credentialScope" : { + "region" : "us-east-2" + }, + "deprecated" : true, + "hostname" : "ssm-contacts-fips.us-east-2.amazonaws.com" + }, + "fips-us-west-1" : { + "credentialScope" : { + "region" : "us-west-1" + }, + "deprecated" : true, + "hostname" : "ssm-contacts-fips.us-west-1.amazonaws.com" + }, + "fips-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "deprecated" : true, + "hostname" : "ssm-contacts-fips.us-west-2.amazonaws.com" + }, "sa-east-1" : { }, - "us-east-1" : { }, - "us-east-2" : { }, - "us-west-1" : { }, - "us-west-2" : { } + "us-east-1" : { + "variants" : [ { + "hostname" : "ssm-contacts-fips.us-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-east-2" : { + "variants" : [ { + "hostname" : "ssm-contacts-fips.us-east-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-1" : { + "variants" : [ { + "hostname" : "ssm-contacts-fips.us-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-2" : { + "variants" : [ { + "hostname" : "ssm-contacts-fips.us-west-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + } + } + }, + "ssm-incidents" : { + "endpoints" : { + "ap-northeast-1" : { }, + "ap-northeast-2" : { }, + "ap-south-1" : { }, + "ap-southeast-1" : { }, + "ap-southeast-2" : { }, + "ca-central-1" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.ca-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "eu-central-1" : { }, + "eu-north-1" : { }, + "eu-west-1" : { }, + "eu-west-2" : { }, + "eu-west-3" : { }, + "fips-ca-central-1" : { + "credentialScope" : { + "region" : "ca-central-1" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.ca-central-1.amazonaws.com" + }, + "fips-us-east-1" : { + "credentialScope" : { + "region" : "us-east-1" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.us-east-1.amazonaws.com" + }, + "fips-us-east-2" : { + "credentialScope" : { + "region" : "us-east-2" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.us-east-2.amazonaws.com" + }, + "fips-us-west-1" : { + "credentialScope" : { + "region" : "us-west-1" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.us-west-1.amazonaws.com" + }, + "fips-us-west-2" : { + "credentialScope" : { + "region" : "us-west-2" + }, + "deprecated" : true, + "hostname" : "ssm-incidents-fips.us-west-2.amazonaws.com" + }, + "sa-east-1" : { }, + "us-east-1" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.us-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-east-2" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.us-east-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-1" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.us-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-west-2" : { + "variants" : [ { + "hostname" : "ssm-incidents-fips.us-west-2.amazonaws.com", + "tags" : [ "fips" ] + } ] + } } }, "ssm-sap" : { @@ -15469,6 +15950,7 @@ "deprecated" : true, "hostname" : "states-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15532,13 +16014,6 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, - "fips" : { - "credentialScope" : { - "region" : "ca-central-1" - }, - "deprecated" : true, - "hostname" : "storagegateway-fips.ca-central-1.amazonaws.com" - }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15624,6 +16099,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "local" : { "credentialScope" : { "region" : "us-east-1" @@ -15668,6 +16144,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15794,6 +16271,7 @@ "deprecated" : true, "hostname" : "swf-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15873,6 +16351,7 @@ "deprecated" : true, "hostname" : "synthetics-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -15924,6 +16403,7 @@ "eu-west-1" : { }, "eu-west-2" : { }, "eu-west-3" : { }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -16010,6 +16490,15 @@ } } }, + "tnb" : { + "endpoints" : { + "ap-southeast-2" : { }, + "eu-central-1" : { }, + "eu-west-3" : { }, + "us-east-1" : { }, + "us-west-2" : { } + } + }, "transcribe" : { "defaults" : { "protocols" : [ "https" ], @@ -16198,6 +16687,7 @@ "ap-southeast-1" : { }, "ap-southeast-2" : { }, "ap-southeast-3" : { }, + "ap-southeast-4" : { }, "ca-central-1" : { "variants" : [ { "hostname" : "transfer-fips.ca-central-1.amazonaws.com", @@ -16468,7 +16958,11 @@ "ap-northeast-1" : { }, "ap-southeast-1" : { }, "ap-southeast-2" : { }, + "ca-central-1" : { }, + "eu-central-1" : { }, + "eu-north-1" : { }, "eu-west-1" : { }, + "eu-west-2" : { }, "us-east-1" : { }, "us-east-2" : { }, "us-west-2" : { } @@ -16860,6 +17354,7 @@ "credentialScope" : { "region" : "il-central-1" }, + "deprecated" : true, "hostname" : "waf-regional-fips.il-central-1.amazonaws.com" }, "fips-me-central-1" : { @@ -16911,6 +17406,16 @@ "deprecated" : true, "hostname" : "waf-regional-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "credentialScope" : { + "region" : "il-central-1" + }, + "hostname" : "waf-regional.il-central-1.amazonaws.com", + "variants" : [ { + "hostname" : "waf-regional-fips.il-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "me-central-1" : { "credentialScope" : { "region" : "me-central-1" @@ -17329,6 +17834,7 @@ "credentialScope" : { "region" : "il-central-1" }, + "deprecated" : true, "hostname" : "wafv2-fips.il-central-1.amazonaws.com" }, "fips-me-central-1" : { @@ -17380,6 +17886,16 @@ "deprecated" : true, "hostname" : "wafv2-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { + "credentialScope" : { + "region" : "il-central-1" + }, + "hostname" : "wafv2.il-central-1.amazonaws.com", + "variants" : [ { + "hostname" : "wafv2-fips.il-central-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "me-central-1" : { "credentialScope" : { "region" : "me-central-1" @@ -17653,6 +18169,7 @@ "deprecated" : true, "hostname" : "xray-fips.us-west-2.amazonaws.com" }, + "il-central-1" : { }, "me-central-1" : { }, "me-south-1" : { }, "sa-east-1" : { }, @@ -17828,6 +18345,12 @@ "cn-northwest-1" : { } } }, + "arc-zonal-shift" : { + "endpoints" : { + "cn-north-1" : { }, + "cn-northwest-1" : { } + } + }, "athena" : { "endpoints" : { "cn-north-1" : { @@ -17868,6 +18391,12 @@ "cn-northwest-1" : { } } }, + "backupstorage" : { + "endpoints" : { + "cn-north-1" : { }, + "cn-northwest-1" : { } + } + }, "batch" : { "endpoints" : { "cn-north-1" : { }, @@ -18668,6 +19197,29 @@ } } }, + "savingsplans" : { + "endpoints" : { + "cn-north-1" : { + "credentialScope" : { + "region" : "cn-north-1" + }, + "hostname" : "savingsplans.cn-north-1.amazonaws.com.cn" + }, + "cn-northwest-1" : { + "credentialScope" : { + "region" : "cn-northwest-1" + }, + "hostname" : "savingsplans.cn-northwest-1.amazonaws.com.cn" + } + }, + "isRegionalized" : true + }, + "schemas" : { + "endpoints" : { + "cn-north-1" : { }, + "cn-northwest-1" : { } + } + }, "secretsmanager" : { "endpoints" : { "cn-north-1" : { }, @@ -18703,13 +19255,13 @@ "endpoints" : { "cn-north-1" : { "variants" : [ { - "hostname" : "servicediscovery.cn-north-1.amazonaws.com.cn", + "hostname" : "servicediscovery.cn-north-1.api.amazonwebservices.com.cn", "tags" : [ "dualstack" ] } ] }, "cn-northwest-1" : { "variants" : [ { - "hostname" : "servicediscovery.cn-northwest-1.amazonaws.com.cn", + "hostname" : "servicediscovery.cn-northwest-1.api.amazonwebservices.com.cn", "tags" : [ "dualstack" ] } ] } @@ -18732,8 +19284,7 @@ }, "sms" : { "endpoints" : { - "cn-north-1" : { }, - "cn-northwest-1" : { } + "cn-north-1" : { } } }, "snowball" : { @@ -19503,6 +20054,12 @@ "us-gov-west-1" : { } } }, + "backupstorage" : { + "endpoints" : { + "us-gov-east-1" : { }, + "us-gov-west-1" : { } + } + }, "batch" : { "defaults" : { "variants" : [ { @@ -19813,6 +20370,13 @@ }, "codepipeline" : { "endpoints" : { + "fips-us-gov-east-1" : { + "credentialScope" : { + "region" : "us-gov-east-1" + }, + "deprecated" : true, + "hostname" : "codepipeline-fips.us-gov-east-1.amazonaws.com" + }, "fips-us-gov-west-1" : { "credentialScope" : { "region" : "us-gov-west-1" @@ -19820,7 +20384,12 @@ "deprecated" : true, "hostname" : "codepipeline-fips.us-gov-west-1.amazonaws.com" }, - "us-gov-east-1" : { }, + "us-gov-east-1" : { + "variants" : [ { + "hostname" : "codepipeline-fips.us-gov-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, "us-gov-west-1" : { "variants" : [ { "hostname" : "codepipeline-fips.us-gov-west-1.amazonaws.com", @@ -21083,8 +21652,32 @@ }, "inspector2" : { "endpoints" : { - "us-gov-east-1" : { }, - "us-gov-west-1" : { } + "fips-us-gov-east-1" : { + "credentialScope" : { + "region" : "us-gov-east-1" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-gov-east-1.amazonaws.com" + }, + "fips-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "deprecated" : true, + "hostname" : "inspector2-fips.us-gov-west-1.amazonaws.com" + }, + "us-gov-east-1" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-gov-east-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "us-gov-west-1" : { + "variants" : [ { + "hostname" : "inspector2-fips.us-gov-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + } } }, "internetmonitor" : { @@ -21222,6 +21815,30 @@ }, "iottwinmaker" : { "endpoints" : { + "api-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "hostname" : "api.iottwinmaker.us-gov-west-1.amazonaws.com" + }, + "data-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "hostname" : "data.iottwinmaker.us-gov-west-1.amazonaws.com" + }, + "fips-api-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "hostname" : "api.iottwinmaker-fips.us-gov-west-1.amazonaws.com" + }, + "fips-data-us-gov-west-1" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "hostname" : "data.iottwinmaker-fips.us-gov-west-1.amazonaws.com" + }, "fips-us-gov-west-1" : { "credentialScope" : { "region" : "us-gov-west-1" @@ -21487,6 +22104,12 @@ } } }, + "license-manager-linux-subscriptions" : { + "endpoints" : { + "us-gov-east-1" : { }, + "us-gov-west-1" : { } + } + }, "logs" : { "endpoints" : { "fips-us-gov-east-1" : { @@ -21760,6 +22383,17 @@ "credentialScope" : { "region" : "us-gov-west-1" }, + "hostname" : "networkmanager.us-gov-west-1.amazonaws.com", + "variants" : [ { + "hostname" : "networkmanager.us-gov-west-1.amazonaws.com", + "tags" : [ "fips" ] + } ] + }, + "fips-aws-us-gov-global" : { + "credentialScope" : { + "region" : "us-gov-west-1" + }, + "deprecated" : true, "hostname" : "networkmanager.us-gov-west-1.amazonaws.com" } }, @@ -22544,6 +23178,9 @@ }, "us-gov-east-1" : { "variants" : [ { + "hostname" : "servicediscovery-fips.us-gov-east-1.amazonaws.com", + "tags" : [ "dualstack", "fips" ] + }, { "hostname" : "servicediscovery-fips.us-gov-east-1.amazonaws.com", "tags" : [ "fips" ] }, { @@ -22560,6 +23197,9 @@ }, "us-gov-west-1" : { "variants" : [ { + "hostname" : "servicediscovery-fips.us-gov-west-1.amazonaws.com", + "tags" : [ "dualstack", "fips" ] + }, { "hostname" : "servicediscovery-fips.us-gov-west-1.amazonaws.com", "tags" : [ "fips" ] }, { @@ -22621,13 +23261,6 @@ }, "sms" : { "endpoints" : { - "fips-us-gov-east-1" : { - "credentialScope" : { - "region" : "us-gov-east-1" - }, - "deprecated" : true, - "hostname" : "sms-fips.us-gov-east-1.amazonaws.com" - }, "fips-us-gov-west-1" : { "credentialScope" : { "region" : "us-gov-west-1" @@ -22635,12 +23268,6 @@ "deprecated" : true, "hostname" : "sms-fips.us-gov-west-1.amazonaws.com" }, - "us-gov-east-1" : { - "variants" : [ { - "hostname" : "sms-fips.us-gov-east-1.amazonaws.com", - "tags" : [ "fips" ] - } ] - }, "us-gov-west-1" : { "variants" : [ { "hostname" : "sms-fips.us-gov-west-1.amazonaws.com", @@ -23746,11 +24373,24 @@ "deprecated" : true, "hostname" : "rbin-fips.us-iso-east-1.c2s.ic.gov" }, + "fips-us-iso-west-1" : { + "credentialScope" : { + "region" : "us-iso-west-1" + }, + "deprecated" : true, + "hostname" : "rbin-fips.us-iso-west-1.c2s.ic.gov" + }, "us-iso-east-1" : { "variants" : [ { "hostname" : "rbin-fips.us-iso-east-1.c2s.ic.gov", "tags" : [ "fips" ] } ] + }, + "us-iso-west-1" : { + "variants" : [ { + "hostname" : "rbin-fips.us-iso-west-1.c2s.ic.gov", + "tags" : [ "fips" ] + } ] } } }, diff --git a/aws/sdk/aws-models/sso-oidc.json b/aws/sdk/aws-models/sso-oidc.json new file mode 100644 index 00000000000..83a497aca3b --- /dev/null +++ b/aws/sdk/aws-models/sso-oidc.json @@ -0,0 +1,1597 @@ +{ + "smithy": "2.0", + "metadata": { + "suppressions": [ + { + "id": "HttpMethodSemantics", + "namespace": "*" + }, + { + "id": "HttpResponseCodeSemantics", + "namespace": "*" + }, + { + "id": "PaginatedTrait", + "namespace": "*" + }, + { + "id": "HttpHeaderTrait", + "namespace": "*" + }, + { + "id": "HttpUriConflict", + "namespace": "*" + }, + { + "id": "Service", + "namespace": "*" + } + ] + }, + "shapes": { + "com.amazonaws.ssooidc#AWSSSOOIDCService": { + "type": "service", + "version": "2019-06-10", + "operations": [ + { + "target": "com.amazonaws.ssooidc#CreateToken" + }, + { + "target": "com.amazonaws.ssooidc#RegisterClient" + }, + { + "target": "com.amazonaws.ssooidc#StartDeviceAuthorization" + } + ], + "traits": { + "aws.api#service": { + "sdkId": "SSO OIDC", + "arnNamespace": "awsssooidc", + "cloudFormationName": "SSOOIDC", + "cloudTrailEventSource": "ssooidc.amazonaws.com", + "endpointPrefix": "oidc" + }, + "aws.auth#sigv4": { + "name": "awsssooidc" + }, + "aws.protocols#restJson1": {}, + "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) OpenID Connect (OIDC) is a web service that enables a client (such as AWS CLI\n or a native application) to register with IAM Identity Center. The service also enables the client to\n fetch the user’s access token upon successful authentication and authorization with\n IAM Identity Center.

\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n

\n Considerations for Using This Guide\n

\n

Before you begin using this guide, we recommend that you first review the following\n important information about how the IAM Identity Center OIDC service works.

\n
    \n
  • \n

    The IAM Identity Center OIDC service currently implements only the portions of the OAuth 2.0\n Device Authorization Grant standard (https://tools.ietf.org/html/rfc8628) that are necessary to enable single\n sign-on authentication with the AWS CLI. Support for other OIDC flows frequently needed\n for native applications, such as Authorization Code Flow (+ PKCE), will be addressed in\n future releases.

    \n
  • \n
  • \n

    The service emits only OIDC access tokens, such that obtaining a new token (For\n example, token refresh) requires explicit user re-authentication.

    \n
  • \n
  • \n

    The access tokens provided by this service grant access to all AWS account\n entitlements assigned to an IAM Identity Center user, not just a particular application.

    \n
  • \n
  • \n

    The documentation in this guide does not describe the mechanism to convert the access\n token into AWS Auth (“sigv4”) credentials for use with IAM-protected AWS service\n endpoints. For more information, see GetRoleCredentials in the IAM Identity Center Portal API Reference\n Guide.

    \n
  • \n
\n

For general information about IAM Identity Center, see What is\n IAM Identity Center? in the IAM Identity Center User Guide.

", + "smithy.api#title": "AWS SSO OIDC", + "smithy.rules#endpointRuleSet": { + "version": "1.0", + "parameters": { + "Region": { + "builtIn": "AWS::Region", + "required": false, + "documentation": "The AWS region used to dispatch the request.", + "type": "String" + }, + "UseDualStack": { + "builtIn": "AWS::UseDualStack", + "required": true, + "default": false, + "documentation": "When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.", + "type": "Boolean" + }, + "UseFIPS": { + "builtIn": "AWS::UseFIPS", + "required": true, + "default": false, + "documentation": "When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.", + "type": "Boolean" + }, + "Endpoint": { + "builtIn": "SDK::Endpoint", + "required": false, + "documentation": "Override the endpoint used to send this request", + "type": "String" + } + }, + "rules": [ + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "error": "Invalid Configuration: FIPS and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "aws.partition", + "argv": [ + { + "ref": "Region" + } + ], + "assign": "PartitionResult" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } + ] + }, + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://oidc-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "name" + ] + }, + "aws-us-gov" + ] + } + ], + "endpoint": { + "url": "https://oidc.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://oidc-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, + { + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsDualStack" + ] + } + ] + } + ], + "rules": [ + { + "conditions": [], + "endpoint": { + "url": "https://oidc.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://oidc.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ], + "type": "tree" + } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" + } + ] + }, + "smithy.rules#endpointTests": { + "testCases": [ + { + "documentation": "For region ap-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-east-1.amazonaws.com" + } + }, + "params": { + "Region": "ap-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-northeast-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-northeast-1.amazonaws.com" + } + }, + "params": { + "Region": "ap-northeast-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-northeast-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-northeast-2.amazonaws.com" + } + }, + "params": { + "Region": "ap-northeast-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-northeast-3 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-northeast-3.amazonaws.com" + } + }, + "params": { + "Region": "ap-northeast-3", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-south-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-south-1.amazonaws.com" + } + }, + "params": { + "Region": "ap-south-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-southeast-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-southeast-1.amazonaws.com" + } + }, + "params": { + "Region": "ap-southeast-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ap-southeast-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ap-southeast-2.amazonaws.com" + } + }, + "params": { + "Region": "ap-southeast-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region ca-central-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.ca-central-1.amazonaws.com" + } + }, + "params": { + "Region": "ca-central-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-central-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-central-1.amazonaws.com" + } + }, + "params": { + "Region": "eu-central-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-north-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-north-1.amazonaws.com" + } + }, + "params": { + "Region": "eu-north-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-south-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-south-1.amazonaws.com" + } + }, + "params": { + "Region": "eu-south-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-west-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-west-1.amazonaws.com" + } + }, + "params": { + "Region": "eu-west-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-west-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-west-2.amazonaws.com" + } + }, + "params": { + "Region": "eu-west-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region eu-west-3 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.eu-west-3.amazonaws.com" + } + }, + "params": { + "Region": "eu-west-3", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region me-south-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.me-south-1.amazonaws.com" + } + }, + "params": { + "Region": "me-south-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region sa-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.sa-east-1.amazonaws.com" + } + }, + "params": { + "Region": "sa-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-east-2.amazonaws.com" + } + }, + "params": { + "Region": "us-east-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-west-2 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-west-2.amazonaws.com" + } + }, + "params": { + "Region": "us-west-2", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-east-1.api.aws" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc.cn-north-1.api.amazonwebservices.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region cn-north-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.cn-north-1.amazonaws.com.cn" + } + }, + "params": { + "Region": "cn-north-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-west-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-gov-west-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-west-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-gov-east-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-gov-east-1.api.aws" + } + }, + "params": { + "Region": "us-gov-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-iso-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-iso-east-1.c2s.ic.gov" + } + }, + "params": { + "Region": "us-iso-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack enabled", + "expect": { + "error": "FIPS and DualStack are enabled, but this partition does not support one or both" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc-fips.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": true, + "UseDualStack": false + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack enabled", + "expect": { + "error": "DualStack is enabled but this partition does not support DualStack" + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": true + } + }, + { + "documentation": "For region us-isob-east-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://oidc.us-isob-east-1.sc2s.sgov.gov" + } + }, + "params": { + "Region": "us-isob-east-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For custom endpoint with region set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with region not set and fips disabled and dualstack disabled", + "expect": { + "endpoint": { + "url": "https://example.com" + } + }, + "params": { + "UseFIPS": false, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips enabled and dualstack disabled", + "expect": { + "error": "Invalid Configuration: FIPS and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": true, + "UseDualStack": false, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "For custom endpoint with fips disabled and dualstack enabled", + "expect": { + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported" + }, + "params": { + "Region": "us-east-1", + "UseFIPS": false, + "UseDualStack": true, + "Endpoint": "https://example.com" + } + }, + { + "documentation": "Missing region", + "expect": { + "error": "Invalid Configuration: Missing Region" + } + } + ], + "version": "1.0" + } + } + }, + "com.amazonaws.ssooidc#AccessDeniedException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

You do not have sufficient access to perform this action.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#AccessToken": { + "type": "string" + }, + "com.amazonaws.ssooidc#AuthCode": { + "type": "string" + }, + "com.amazonaws.ssooidc#AuthorizationPendingException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that a request to authorize a client with an access user session token is\n pending.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#ClientId": { + "type": "string" + }, + "com.amazonaws.ssooidc#ClientName": { + "type": "string" + }, + "com.amazonaws.ssooidc#ClientSecret": { + "type": "string" + }, + "com.amazonaws.ssooidc#ClientType": { + "type": "string" + }, + "com.amazonaws.ssooidc#CreateToken": { + "type": "operation", + "input": { + "target": "com.amazonaws.ssooidc#CreateTokenRequest" + }, + "output": { + "target": "com.amazonaws.ssooidc#CreateTokenResponse" + }, + "errors": [ + { + "target": "com.amazonaws.ssooidc#AccessDeniedException" + }, + { + "target": "com.amazonaws.ssooidc#AuthorizationPendingException" + }, + { + "target": "com.amazonaws.ssooidc#ExpiredTokenException" + }, + { + "target": "com.amazonaws.ssooidc#InternalServerException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidClientException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidGrantException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidRequestException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidScopeException" + }, + { + "target": "com.amazonaws.ssooidc#SlowDownException" + }, + { + "target": "com.amazonaws.ssooidc#UnauthorizedClientException" + }, + { + "target": "com.amazonaws.ssooidc#UnsupportedGrantTypeException" + } + ], + "traits": { + "smithy.api#auth": [], + "smithy.api#documentation": "

Creates and returns an access token for the authorized client. The access token issued\n will be used to fetch short-term credentials for the assigned roles in the AWS\n account.

", + "smithy.api#http": { + "method": "POST", + "uri": "/token", + "code": 200 + }, + "smithy.api#optionalAuth": {} + } + }, + "com.amazonaws.ssooidc#CreateTokenRequest": { + "type": "structure", + "members": { + "clientId": { + "target": "com.amazonaws.ssooidc#ClientId", + "traits": { + "smithy.api#documentation": "

The unique identifier string for each client. This value should come from the persisted\n result of the RegisterClient API.

", + "smithy.api#required": {} + } + }, + "clientSecret": { + "target": "com.amazonaws.ssooidc#ClientSecret", + "traits": { + "smithy.api#documentation": "

A secret string generated for the client. This value should come from the persisted result\n of the RegisterClient API.

", + "smithy.api#required": {} + } + }, + "grantType": { + "target": "com.amazonaws.ssooidc#GrantType", + "traits": { + "smithy.api#documentation": "

Supports grant types for the authorization code, refresh token, and device code request.\n For device code requests, specify the following value:

\n

\n urn:ietf:params:oauth:grant-type:device_code\n \n

\n

For information about how to obtain the device code, see the StartDeviceAuthorization topic.

", + "smithy.api#required": {} + } + }, + "deviceCode": { + "target": "com.amazonaws.ssooidc#DeviceCode", + "traits": { + "smithy.api#documentation": "

Used only when calling this API for the device code grant type. This short-term code is\n used to identify this authentication attempt. This should come from an in-memory reference to\n the result of the StartDeviceAuthorization API.

" + } + }, + "code": { + "target": "com.amazonaws.ssooidc#AuthCode", + "traits": { + "smithy.api#documentation": "

The authorization code received from the authorization service. This parameter is required\n to perform an authorization grant request to get access to a token.

" + } + }, + "refreshToken": { + "target": "com.amazonaws.ssooidc#RefreshToken", + "traits": { + "smithy.api#documentation": "

Currently, refreshToken is not yet implemented and is not supported. For more\n information about the features and limitations of the current IAM Identity Center OIDC implementation,\n see Considerations for Using this Guide in the IAM Identity Center\n OIDC API Reference.

\n

The token used to obtain an access token in the event that the access token is invalid or\n expired.

" + } + }, + "scope": { + "target": "com.amazonaws.ssooidc#Scopes", + "traits": { + "smithy.api#documentation": "

The list of scopes that is defined by the client. Upon authorization, this list is used to\n restrict permissions when granting an access token.

" + } + }, + "redirectUri": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The location of the application that will receive the authorization code. Users authorize\n the service to send the request to this location.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ssooidc#CreateTokenResponse": { + "type": "structure", + "members": { + "accessToken": { + "target": "com.amazonaws.ssooidc#AccessToken", + "traits": { + "smithy.api#documentation": "

An opaque token to access IAM Identity Center resources assigned to a user.

" + } + }, + "tokenType": { + "target": "com.amazonaws.ssooidc#TokenType", + "traits": { + "smithy.api#documentation": "

Used to notify the client that the returned token is an access token. The supported type\n is BearerToken.

" + } + }, + "expiresIn": { + "target": "com.amazonaws.ssooidc#ExpirationInSeconds", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the time in seconds when an access token will expire.

" + } + }, + "refreshToken": { + "target": "com.amazonaws.ssooidc#RefreshToken", + "traits": { + "smithy.api#documentation": "

Currently, refreshToken is not yet implemented and is not supported. For more\n information about the features and limitations of the current IAM Identity Center OIDC implementation,\n see Considerations for Using this Guide in the IAM Identity Center\n OIDC API Reference.

\n

A token that, if present, can be used to refresh a previously issued access token that\n might have expired.

" + } + }, + "idToken": { + "target": "com.amazonaws.ssooidc#IdToken", + "traits": { + "smithy.api#documentation": "

Currently, idToken is not yet implemented and is not supported. For more\n information about the features and limitations of the current IAM Identity Center OIDC implementation,\n see Considerations for Using this Guide in the IAM Identity Center\n OIDC API Reference.

\n

The identifier of the user that associated with the access token, if present.

" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.ssooidc#DeviceCode": { + "type": "string" + }, + "com.amazonaws.ssooidc#Error": { + "type": "string" + }, + "com.amazonaws.ssooidc#ErrorDescription": { + "type": "string" + }, + "com.amazonaws.ssooidc#ExpirationInSeconds": { + "type": "integer", + "traits": { + "smithy.api#default": 0 + } + }, + "com.amazonaws.ssooidc#ExpiredTokenException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the token issued by the service is expired and is no longer valid.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#GrantType": { + "type": "string" + }, + "com.amazonaws.ssooidc#IdToken": { + "type": "string" + }, + "com.amazonaws.ssooidc#InternalServerException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that an error from the service occurred while trying to process a\n request.

", + "smithy.api#error": "server", + "smithy.api#httpError": 500 + } + }, + "com.amazonaws.ssooidc#IntervalInSeconds": { + "type": "integer", + "traits": { + "smithy.api#default": 0 + } + }, + "com.amazonaws.ssooidc#InvalidClientException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the clientId or clientSecret in the request is\n invalid. For example, this can occur when a client sends an incorrect clientId or\n an expired clientSecret.

", + "smithy.api#error": "client", + "smithy.api#httpError": 401 + } + }, + "com.amazonaws.ssooidc#InvalidClientMetadataException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the client information sent in the request during registration is\n invalid.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#InvalidGrantException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that a request contains an invalid grant. This can occur if a client makes a\n CreateToken request with an invalid grant type.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#InvalidRequestException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that something is wrong with the input to the request. For example, a required\n parameter might be missing or out of range.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#InvalidScopeException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the scope provided in the request is invalid.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#LongTimeStampType": { + "type": "long", + "traits": { + "smithy.api#default": 0 + } + }, + "com.amazonaws.ssooidc#RefreshToken": { + "type": "string" + }, + "com.amazonaws.ssooidc#RegisterClient": { + "type": "operation", + "input": { + "target": "com.amazonaws.ssooidc#RegisterClientRequest" + }, + "output": { + "target": "com.amazonaws.ssooidc#RegisterClientResponse" + }, + "errors": [ + { + "target": "com.amazonaws.ssooidc#InternalServerException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidClientMetadataException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidRequestException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidScopeException" + } + ], + "traits": { + "smithy.api#auth": [], + "smithy.api#documentation": "

Registers a client with IAM Identity Center. This allows clients to initiate device authorization.\n The output should be persisted for reuse through many authentication requests.

", + "smithy.api#http": { + "method": "POST", + "uri": "/client/register", + "code": 200 + }, + "smithy.api#optionalAuth": {} + } + }, + "com.amazonaws.ssooidc#RegisterClientRequest": { + "type": "structure", + "members": { + "clientName": { + "target": "com.amazonaws.ssooidc#ClientName", + "traits": { + "smithy.api#documentation": "

The friendly name of the client.

", + "smithy.api#required": {} + } + }, + "clientType": { + "target": "com.amazonaws.ssooidc#ClientType", + "traits": { + "smithy.api#documentation": "

The type of client. The service supports only public as a client type.\n Anything other than public will be rejected by the service.

", + "smithy.api#required": {} + } + }, + "scopes": { + "target": "com.amazonaws.ssooidc#Scopes", + "traits": { + "smithy.api#documentation": "

The list of scopes that are defined by the client. Upon authorization, this list is used\n to restrict permissions when granting an access token.

" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ssooidc#RegisterClientResponse": { + "type": "structure", + "members": { + "clientId": { + "target": "com.amazonaws.ssooidc#ClientId", + "traits": { + "smithy.api#documentation": "

The unique identifier string for each client. This client uses this identifier to get\n authenticated by the service in subsequent calls.

" + } + }, + "clientSecret": { + "target": "com.amazonaws.ssooidc#ClientSecret", + "traits": { + "smithy.api#documentation": "

A secret string generated for the client. The client will use this string to get\n authenticated by the service in subsequent calls.

" + } + }, + "clientIdIssuedAt": { + "target": "com.amazonaws.ssooidc#LongTimeStampType", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the time at which the clientId and clientSecret were\n issued.

" + } + }, + "clientSecretExpiresAt": { + "target": "com.amazonaws.ssooidc#LongTimeStampType", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the time at which the clientId and clientSecret will\n become invalid.

" + } + }, + "authorizationEndpoint": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The endpoint where the client can request authorization.

" + } + }, + "tokenEndpoint": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The endpoint where the client can get an access token.

" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.ssooidc#Scope": { + "type": "string" + }, + "com.amazonaws.ssooidc#Scopes": { + "type": "list", + "member": { + "target": "com.amazonaws.ssooidc#Scope" + } + }, + "com.amazonaws.ssooidc#SlowDownException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the client is making the request too frequently and is more than the\n service can handle.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#StartDeviceAuthorization": { + "type": "operation", + "input": { + "target": "com.amazonaws.ssooidc#StartDeviceAuthorizationRequest" + }, + "output": { + "target": "com.amazonaws.ssooidc#StartDeviceAuthorizationResponse" + }, + "errors": [ + { + "target": "com.amazonaws.ssooidc#InternalServerException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidClientException" + }, + { + "target": "com.amazonaws.ssooidc#InvalidRequestException" + }, + { + "target": "com.amazonaws.ssooidc#SlowDownException" + }, + { + "target": "com.amazonaws.ssooidc#UnauthorizedClientException" + } + ], + "traits": { + "smithy.api#auth": [], + "smithy.api#documentation": "

Initiates device authorization by requesting a pair of verification codes from the\n authorization service.

", + "smithy.api#http": { + "method": "POST", + "uri": "/device_authorization", + "code": 200 + }, + "smithy.api#optionalAuth": {} + } + }, + "com.amazonaws.ssooidc#StartDeviceAuthorizationRequest": { + "type": "structure", + "members": { + "clientId": { + "target": "com.amazonaws.ssooidc#ClientId", + "traits": { + "smithy.api#documentation": "

The unique identifier string for the client that is registered with IAM Identity Center. This value\n should come from the persisted result of the RegisterClient API\n operation.

", + "smithy.api#required": {} + } + }, + "clientSecret": { + "target": "com.amazonaws.ssooidc#ClientSecret", + "traits": { + "smithy.api#documentation": "

A secret string that is generated for the client. This value should come from the\n persisted result of the RegisterClient API operation.

", + "smithy.api#required": {} + } + }, + "startUrl": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The URL for the AWS access portal. For more information, see Using\n the AWS access portal in the IAM Identity Center User Guide.

", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.amazonaws.ssooidc#StartDeviceAuthorizationResponse": { + "type": "structure", + "members": { + "deviceCode": { + "target": "com.amazonaws.ssooidc#DeviceCode", + "traits": { + "smithy.api#documentation": "

The short-lived code that is used by the device when polling for a session token.

" + } + }, + "userCode": { + "target": "com.amazonaws.ssooidc#UserCode", + "traits": { + "smithy.api#documentation": "

A one-time user verification code. This is needed to authorize an in-use device.

" + } + }, + "verificationUri": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

The URI of the verification page that takes the userCode to authorize the\n device.

" + } + }, + "verificationUriComplete": { + "target": "com.amazonaws.ssooidc#URI", + "traits": { + "smithy.api#documentation": "

An alternate URL that the client can use to automatically launch a browser. This process\n skips the manual step in which the user visits the verification page and enters their\n code.

" + } + }, + "expiresIn": { + "target": "com.amazonaws.ssooidc#ExpirationInSeconds", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the number of seconds in which the verification code will become invalid.

" + } + }, + "interval": { + "target": "com.amazonaws.ssooidc#IntervalInSeconds", + "traits": { + "smithy.api#default": 0, + "smithy.api#documentation": "

Indicates the number of seconds the client must wait between attempts when polling for a\n session.

" + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.amazonaws.ssooidc#TokenType": { + "type": "string" + }, + "com.amazonaws.ssooidc#URI": { + "type": "string" + }, + "com.amazonaws.ssooidc#UnauthorizedClientException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the client is not currently authorized to make the request. This can happen\n when a clientId is not issued for a public client.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#UnsupportedGrantTypeException": { + "type": "structure", + "members": { + "error": { + "target": "com.amazonaws.ssooidc#Error" + }, + "error_description": { + "target": "com.amazonaws.ssooidc#ErrorDescription" + } + }, + "traits": { + "smithy.api#documentation": "

Indicates that the grant type in the request is not supported by the service.

", + "smithy.api#error": "client", + "smithy.api#httpError": 400 + } + }, + "com.amazonaws.ssooidc#UserCode": { + "type": "string" + } + } +} diff --git a/aws/sdk/aws-models/sso.json b/aws/sdk/aws-models/sso.json index 4f48553e765..ab26fa26700 100644 --- a/aws/sdk/aws-models/sso.json +++ b/aws/sdk/aws-models/sso.json @@ -154,6 +154,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#GetRoleCredentialsResponse": { @@ -165,6 +168,9 @@ "smithy.api#documentation": "

The credentials for the role that is assigned to the user.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#InvalidRequestException": { @@ -252,6 +258,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#ListAccountRolesResponse": { @@ -269,6 +278,9 @@ "smithy.api#documentation": "

A paginated response with the list of roles and the next token if more results are\n available.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#ListAccounts": { @@ -335,6 +347,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#ListAccountsResponse": { @@ -352,6 +367,9 @@ "smithy.api#documentation": "

A paginated response with the list of account information and the next token if more\n results are available.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.sso#Logout": { @@ -375,7 +393,7 @@ ], "traits": { "smithy.api#auth": [], - "smithy.api#documentation": "

Removes the locally stored SSO tokens from the client-side cache and sends an API call to\n the IAM Identity Center service to invalidate the corresponding server-side IAM Identity Center sign in\n session.

\n\n \n

If a user uses IAM Identity Center to access the AWS CLI, the user’s IAM Identity Center sign in session is\n used to obtain an IAM session, as specified in the corresponding IAM Identity Center permission set.\n More specifically, IAM Identity Center assumes an IAM role in the target account on behalf of the user,\n and the corresponding temporary AWS credentials are returned to the client.

\n\n

After user logout, any existing IAM role sessions that were created by using IAM Identity Center\n permission sets continue based on the duration configured in the permission set.\n For more information, see User\n authentications in the IAM Identity Center User\n Guide.

\n
", + "smithy.api#documentation": "

Removes the locally stored SSO tokens from the client-side cache and sends an API call to\n the IAM Identity Center service to invalidate the corresponding server-side IAM Identity Center sign in\n session.

\n \n

If a user uses IAM Identity Center to access the AWS CLI, the user’s IAM Identity Center sign in session is\n used to obtain an IAM session, as specified in the corresponding IAM Identity Center permission set.\n More specifically, IAM Identity Center assumes an IAM role in the target account on behalf of the user,\n and the corresponding temporary AWS credentials are returned to the client.

\n

After user logout, any existing IAM role sessions that were created by using IAM Identity Center\n permission sets continue based on the duration configured in the permission set.\n For more information, see User\n authentications in the IAM Identity Center User\n Guide.

\n
", "smithy.api#http": { "method": "POST", "uri": "/logout", @@ -395,6 +413,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.sso#MaxResultType": { @@ -513,7 +534,7 @@ "name": "awsssoportal" }, "aws.protocols#restJson1": {}, - "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) Portal is a web service that makes it easy for you to assign user access to\n IAM Identity Center resources such as the AWS access portal. Users can get AWS account applications and roles\n assigned to them and get federated into the application.

\n\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n\n

This reference guide describes the IAM Identity Center Portal operations that you can call\n programatically and includes detailed information on data types and errors.

\n\n \n

AWS provides SDKs that consist of libraries and sample code for various programming\n languages and platforms, such as Java, Ruby, .Net, iOS, or Android. The SDKs provide a\n convenient way to create programmatic access to IAM Identity Center and other AWS services. For more\n information about the AWS SDKs, including how to download and install them, see Tools for Amazon Web Services.

\n
", + "smithy.api#documentation": "

AWS IAM Identity Center (successor to AWS Single Sign-On) Portal is a web service that makes it easy for you to assign user access to\n IAM Identity Center resources such as the AWS access portal. Users can get AWS account applications and roles\n assigned to them and get federated into the application.

\n \n

Although AWS Single Sign-On was renamed, the sso and\n identitystore API namespaces will continue to retain their original name for\n backward compatibility purposes. For more information, see IAM Identity Center rename.

\n
\n

This reference guide describes the IAM Identity Center Portal operations that you can call\n programatically and includes detailed information on data types and errors.

\n \n

AWS provides SDKs that consist of libraries and sample code for various programming\n languages and platforms, such as Java, Ruby, .Net, iOS, or Android. The SDKs provide a\n convenient way to create programmatic access to IAM Identity Center and other AWS services. For more\n information about the AWS SDKs, including how to download and install them, see Tools for Amazon Web Services.

\n
", "smithy.api#title": "AWS Single Sign-On", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -557,7 +578,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -575,293 +595,283 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] - } + }, + "aws-us-gov" ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://portal.sso.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://portal.sso.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://portal.sso.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1248,7 +1258,7 @@ "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", "expect": { "endpoint": { - "url": "https://portal.sso-fips.us-gov-east-1.amazonaws.com" + "url": "https://portal.sso.us-gov-east-1.amazonaws.com" } }, "params": { diff --git a/aws/sdk/aws-models/sts.json b/aws/sdk/aws-models/sts.json index ddc251e8fad..c9648e8cb23 100644 --- a/aws/sdk/aws-models/sts.json +++ b/aws/sdk/aws-models/sts.json @@ -173,7 +173,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -624,7 +623,8 @@ }, "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [ @@ -637,7 +637,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -655,345 +654,310 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - }, - { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsFIPS" ] } ] }, - { - "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" - } - ] - }, - { - "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "stringEquals", - "argv": [ - "aws-us-gov", - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "name" - ] - } - ] - } - ], - "endpoint": { - "url": "https://sts.{Region}.amazonaws.com", - "properties": {}, - "headers": {} - }, - "type": "endpoint" + "ref": "PartitionResult" }, - { - "conditions": [], - "endpoint": { - "url": "https://sts-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseDualStack" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsDualStack" + "name" ] - } + }, + "aws-us-gov" ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://sts.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" + "endpoint": { + "url": "https://sts-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { "conditions": [], - "type": "tree", - "rules": [ + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ { - "conditions": [ + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + true, { - "fn": "stringEquals", + "fn": "getAttr", "argv": [ { - "ref": "Region" + "ref": "PartitionResult" }, - "aws-global" + "supportsDualStack" ] } - ], - "endpoint": { - "url": "https://sts.amazonaws.com", - "properties": { - "authSchemes": [ - { - "name": "sigv4", - "signingName": "sts", - "signingRegion": "us-east-1" - } - ] - }, - "headers": {} - }, - "type": "endpoint" - }, + ] + } + ], + "rules": [ { "conditions": [], "endpoint": { - "url": "https://sts.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + { + "ref": "Region" + }, + "aws-global" ] } - ] + ], + "endpoint": { + "url": "https://sts.amazonaws.com", + "properties": { + "authSchemes": [ + { + "name": "sigv4", + "signingName": "sts", + "signingRegion": "us-east-1" + } + ] + }, + "headers": {} + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://sts.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -1701,9 +1665,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1720,10 +1684,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "ap-northeast-1", "UseFIPS": false, - "Region": "ap-northeast-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1733,9 +1697,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1752,10 +1716,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "ap-south-1", "UseFIPS": false, - "Region": "ap-south-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1765,9 +1729,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1784,10 +1748,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "ap-southeast-1", "UseFIPS": false, - "Region": "ap-southeast-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1797,9 +1761,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1816,10 +1780,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "ap-southeast-2", "UseFIPS": false, - "Region": "ap-southeast-2" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1829,9 +1793,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1848,10 +1812,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "aws-global", "UseFIPS": false, - "Region": "aws-global" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1861,9 +1825,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1880,10 +1844,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "ca-central-1", "UseFIPS": false, - "Region": "ca-central-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1893,9 +1857,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1912,10 +1876,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "eu-central-1", "UseFIPS": false, - "Region": "eu-central-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1925,9 +1889,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1944,10 +1908,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "eu-north-1", "UseFIPS": false, - "Region": "eu-north-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1957,9 +1921,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -1976,10 +1940,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "eu-west-1", "UseFIPS": false, - "Region": "eu-west-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -1989,9 +1953,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -2008,10 +1972,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "eu-west-2", "UseFIPS": false, - "Region": "eu-west-2" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -2021,9 +1985,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -2040,10 +2004,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "eu-west-3", "UseFIPS": false, - "Region": "eu-west-3" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -2053,9 +2017,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -2072,10 +2036,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "sa-east-1", "UseFIPS": false, - "Region": "sa-east-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -2085,9 +2049,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -2104,10 +2068,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "us-east-1", "UseFIPS": false, - "Region": "us-east-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -2117,9 +2081,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -2136,10 +2100,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "us-east-2", "UseFIPS": false, - "Region": "us-east-2" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -2149,9 +2113,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -2168,10 +2132,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "us-west-1", "UseFIPS": false, - "Region": "us-west-1" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -2181,9 +2145,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-1", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-1" } ] }, @@ -2200,10 +2164,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "us-west-2", "UseFIPS": false, - "Region": "us-west-2" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -2213,9 +2177,9 @@ "properties": { "authSchemes": [ { - "signingRegion": "us-east-3", + "name": "sigv4", "signingName": "sts", - "name": "sigv4" + "signingRegion": "us-east-3" } ] }, @@ -2232,10 +2196,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, + "Region": "us-east-3", "UseFIPS": false, - "Region": "us-east-3" + "UseDualStack": false, + "UseGlobalEndpoint": true } }, { @@ -2256,10 +2220,10 @@ } ], "params": { - "UseGlobalEndpoint": true, - "UseDualStack": false, - "UseFIPS": false, "Region": "us-west-1", + "UseFIPS": false, + "UseDualStack": false, + "UseGlobalEndpoint": true, "Endpoint": "https://example.com" } }, @@ -2271,10 +2235,10 @@ } }, "params": { - "Endpoint": "https://example.com", - "UseGlobalEndpoint": false, + "UseFIPS": false, "UseDualStack": false, - "UseFIPS": false + "UseGlobalEndpoint": false, + "Endpoint": "https://example.com" } } ], @@ -2305,7 +2269,50 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials that you can use to access Amazon Web Services\n resources. These temporary credentials consist of an access key ID, a secret access key,\n and a security token. Typically, you use AssumeRole within your account or for\n cross-account access. For a comparison of AssumeRole with other API operations\n that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRole can be used to\n make API calls to any Amazon Web Services service with the following exception: You cannot call the\n Amazon Web Services STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

When you create a role, you create two policies: a role trust policy that specifies\n who can assume the role, and a permissions policy that specifies\n what can be done with the role. You specify the trusted principal\n that is allowed to assume the role in the role trust policy.

\n

To assume a role from a different account, your Amazon Web Services account must be trusted by the\n role. The trust relationship is defined in the role's trust policy when the role is\n created. That trust policy states which accounts are allowed to delegate that access to\n users in the account.

\n

A user who wants to access a role in a different account must also have permissions that\n are delegated from the account administrator. The administrator must attach a policy\n that allows the user to call AssumeRole for the ARN of the role in the other\n account.

\n

To allow a user to assume a role in the same account, you can do either of the\n following:

\n
    \n
  • \n

    Attach a policy to the user that allows the user to call AssumeRole\n (as long as the role's trust policy trusts the account).

    \n
  • \n
  • \n

    Add the user as a principal directly in the role's trust policy.

    \n
  • \n
\n

You can do either because the role’s trust policy acts as an IAM resource-based\n policy. When a resource-based policy grants access to a principal in the same account, no\n additional identity-based policy is required. For more information about trust policies and\n resource-based policies, see IAM Policies in the\n IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These tags are called\n session tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Using MFA with AssumeRole\n

\n

(Optional) You can include multi-factor authentication (MFA) information when you call\n AssumeRole. This is useful for cross-account scenarios to ensure that the\n user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\n scenario, the trust policy of the role being assumed includes a condition that tests for\n MFA authentication. If the caller does not include valid MFA information, the request to\n assume the role is denied. The condition in a trust policy that tests for MFA\n authentication might look like the following example.

\n

\n \"Condition\": {\"Bool\": {\"aws:MultiFactorAuthPresent\": true}}\n

\n

For more information, see Configuring MFA-Protected API Access\n in the IAM User Guide guide.

\n

To use MFA with AssumeRole, you pass values for the\n SerialNumber and TokenCode parameters. The\n SerialNumber value identifies the user's hardware or virtual MFA device.\n The TokenCode is the time-based one-time password (TOTP) that the MFA device\n produces.

" + "smithy.api#documentation": "

Returns a set of temporary security credentials that you can use to access Amazon Web Services\n resources. These temporary credentials consist of an access key ID, a secret access key,\n and a security token. Typically, you use AssumeRole within your account or for\n cross-account access. For a comparison of AssumeRole with other API operations\n that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRole can be used to\n make API calls to any Amazon Web Services service with the following exception: You cannot call the\n Amazon Web Services STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

When you create a role, you create two policies: a role trust policy that specifies\n who can assume the role, and a permissions policy that specifies\n what can be done with the role. You specify the trusted principal\n that is allowed to assume the role in the role trust policy.

\n

To assume a role from a different account, your Amazon Web Services account must be trusted by the\n role. The trust relationship is defined in the role's trust policy when the role is\n created. That trust policy states which accounts are allowed to delegate that access to\n users in the account.

\n

A user who wants to access a role in a different account must also have permissions that\n are delegated from the account administrator. The administrator must attach a policy that\n allows the user to call AssumeRole for the ARN of the role in the other\n account.

\n

To allow a user to assume a role in the same account, you can do either of the\n following:

\n
    \n
  • \n

    Attach a policy to the user that allows the user to call AssumeRole\n (as long as the role's trust policy trusts the account).

    \n
  • \n
  • \n

    Add the user as a principal directly in the role's trust policy.

    \n
  • \n
\n

You can do either because the role’s trust policy acts as an IAM resource-based\n policy. When a resource-based policy grants access to a principal in the same account, no\n additional identity-based policy is required. For more information about trust policies and\n resource-based policies, see IAM Policies in the\n IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These tags are called\n session tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Using MFA with AssumeRole\n

\n

(Optional) You can include multi-factor authentication (MFA) information when you call\n AssumeRole. This is useful for cross-account scenarios to ensure that the\n user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\n scenario, the trust policy of the role being assumed includes a condition that tests for\n MFA authentication. If the caller does not include valid MFA information, the request to\n assume the role is denied. The condition in a trust policy that tests for MFA\n authentication might look like the following example.

\n

\n \"Condition\": {\"Bool\": {\"aws:MultiFactorAuthPresent\": true}}\n

\n

For more information, see Configuring MFA-Protected API Access\n in the IAM User Guide guide.

\n

To use MFA with AssumeRole, you pass values for the\n SerialNumber and TokenCode parameters. The\n SerialNumber value identifies the user's hardware or virtual MFA device.\n The TokenCode is the time-based one-time password (TOTP) that the MFA device\n produces.

", + "smithy.api#examples": [ + { + "title": "To assume a role", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/demo", + "RoleSessionName": "testAssumeRoleSession", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "Tags": [ + { + "Key": "Project", + "Value": "Unicorn" + }, + { + "Key": "Team", + "Value": "Automation" + }, + { + "Key": "Cost-Center", + "Value": "12345" + } + ], + "TransitiveTagKeys": [ + "Project", + "Cost-Center" + ], + "ExternalId": "123ABC" + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-15T23:28:33.359Z" + }, + "AssumedRoleUser": { + "Arn": "arn:aws:sts::123456789012:assumed-role/demo/Bob", + "AssumedRoleId": "ARO123EXAMPLE123:Bob" + }, + "PackedPolicySize": 8 + } + } + ] } }, "com.amazonaws.sts#AssumeRoleRequest": { @@ -2332,7 +2339,7 @@ } }, "Policy": { - "target": "com.amazonaws.sts#sessionPolicyDocumentType", + "target": "com.amazonaws.sts#unrestrictedSessionPolicyDocumentType", "traits": { "smithy.api#documentation": "

An IAM policy in JSON format that you want to use as an inline session policy.

\n

This parameter is optional. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

The plaintext that you use for both inline and managed session policies can't exceed\n 2,048 characters. The JSON policy characters can be any ASCII character from the space\n character to the end of the valid character list (\\u0020 through \\u00FF). It can also\n include the tab (\\u0009), linefeed (\\u000A), and carriage return (\\u000D)\n characters.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" } @@ -2378,6 +2385,12 @@ "traits": { "smithy.api#documentation": "

The source identity specified by the principal that is calling the\n AssumeRole operation.

\n

You can require users to specify a source identity when they assume a role. You do this\n by using the sts:SourceIdentity condition key in a role trust policy. You can\n use source identity information in CloudTrail logs to determine who took actions with a role.\n You can use the aws:SourceIdentity condition key to further control access to\n Amazon Web Services resources based on the value of source identity. For more information about using\n source identity, see Monitor and control\n actions taken with assumed roles in the\n IAM User Guide.

\n

The regex used to validate this parameter is a string of characters consisting of upper-\n and lower-case alphanumeric characters with no spaces. You can also include underscores or\n any of the following characters: =,.@-. You cannot use a value that begins with the text\n aws:. This prefix is reserved for Amazon Web Services internal use.

" } + }, + "ProvidedContexts": { + "target": "com.amazonaws.sts#ProvidedContextsListType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } } }, "traits": { @@ -2446,7 +2459,37 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated\n via a SAML authentication response. This operation provides a mechanism for tying an\n enterprise identity store or directory to role-based Amazon Web Services access without user-specific\n credentials or configuration. For a comparison of AssumeRoleWithSAML with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this operation consist of an access key\n ID, a secret access key, and a security token. Applications can use these temporary\n security credentials to sign calls to Amazon Web Services services.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithSAML last for one hour. However, you can use the optional\n DurationSeconds parameter to specify the duration of your session. Your\n role session lasts for the duration that you specify, or until the time specified in the\n SAML authentication response's SessionNotOnOrAfter value, whichever is\n shorter. You can provide a DurationSeconds value from 900 seconds (15 minutes)\n up to the maximum session duration setting for the role. This setting can have a value from\n 1 hour to 12 hours. To learn how to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n \n

\n Role chaining limits your CLI or Amazon Web Services API role\n session to a maximum of one hour. When you use the AssumeRole API operation\n to assume a role, you can specify the duration of your role session with the\n DurationSeconds parameter. You can specify a parameter value of up to\n 43200 seconds (12 hours), depending on the maximum session duration setting for your\n role. However, if you assume a role using role chaining and provide a\n DurationSeconds parameter value greater than one hour, the operation\n fails.

\n
\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithSAML can be\n used to make API calls to any Amazon Web Services service with the following exception: you cannot call\n the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

Calling AssumeRoleWithSAML does not require the use of Amazon Web Services security\n credentials. The identity of the caller is validated by using keys in the metadata document\n that is uploaded for the SAML provider entity for your identity provider.

\n \n

Calling AssumeRoleWithSAML can result in an entry in your CloudTrail logs.\n The entry includes the value in the NameID element of the SAML assertion.\n We recommend that you use a NameIDType that is not associated with any\n personally identifiable information (PII). For example, you could instead use the\n persistent identifier\n (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent).

\n
\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your SAML assertion as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, session tags override the role's tags with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n SAML Configuration\n

\n

Before your application can call AssumeRoleWithSAML, you must configure\n your SAML identity provider (IdP) to issue the claims required by Amazon Web Services. Additionally, you\n must use Identity and Access Management (IAM) to create a SAML provider entity in your Amazon Web Services account that\n represents your identity provider. You must also create an IAM role that specifies this\n SAML provider in its trust policy.

\n

For more information, see the following resources:

\n " + "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated\n via a SAML authentication response. This operation provides a mechanism for tying an\n enterprise identity store or directory to role-based Amazon Web Services access without user-specific\n credentials or configuration. For a comparison of AssumeRoleWithSAML with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this operation consist of an access key\n ID, a secret access key, and a security token. Applications can use these temporary\n security credentials to sign calls to Amazon Web Services services.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithSAML last for one hour. However, you can use the optional\n DurationSeconds parameter to specify the duration of your session. Your\n role session lasts for the duration that you specify, or until the time specified in the\n SAML authentication response's SessionNotOnOrAfter value, whichever is\n shorter. You can provide a DurationSeconds value from 900 seconds (15 minutes)\n up to the maximum session duration setting for the role. This setting can have a value from\n 1 hour to 12 hours. To learn how to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n \n

\n Role chaining limits your CLI or Amazon Web Services API role\n session to a maximum of one hour. When you use the AssumeRole API operation\n to assume a role, you can specify the duration of your role session with the\n DurationSeconds parameter. You can specify a parameter value of up to\n 43200 seconds (12 hours), depending on the maximum session duration setting for your\n role. However, if you assume a role using role chaining and provide a\n DurationSeconds parameter value greater than one hour, the operation\n fails.

\n
\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithSAML can be\n used to make API calls to any Amazon Web Services service with the following exception: you cannot call\n the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

Calling AssumeRoleWithSAML does not require the use of Amazon Web Services security\n credentials. The identity of the caller is validated by using keys in the metadata document\n that is uploaded for the SAML provider entity for your identity provider.

\n \n

Calling AssumeRoleWithSAML can result in an entry in your CloudTrail logs.\n The entry includes the value in the NameID element of the SAML assertion.\n We recommend that you use a NameIDType that is not associated with any\n personally identifiable information (PII). For example, you could instead use the\n persistent identifier\n (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent).

\n
\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your SAML assertion as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, session tags override the role's tags with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n SAML Configuration\n

\n

Before your application can call AssumeRoleWithSAML, you must configure\n your SAML identity provider (IdP) to issue the claims required by Amazon Web Services. Additionally, you\n must use Identity and Access Management (IAM) to create a SAML provider entity in your Amazon Web Services account that\n represents your identity provider. You must also create an IAM role that specifies this\n SAML provider in its trust policy.

\n

For more information, see the following resources:

\n ", + "smithy.api#examples": [ + { + "title": "To assume a role using a SAML assertion", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/TestSaml", + "PrincipalArn": "arn:aws:iam::123456789012:saml-provider/SAML-test", + "SAMLAssertion": "VERYLONGENCODEDASSERTIONEXAMPLExzYW1sOkF1ZGllbmNlPmJsYW5rPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOlN1YmplY3Q+PHNhbWw6TmFtZUlEIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6dHJhbnNpZW50Ij5TYW1sRXhhbXBsZTwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxOS0xMS0wMVQyMDoyNTowNS4xNDVaIiBSZWNpcGllbnQ9Imh0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRoPD94bWwgdmpSZXNwb25zZT4=", + "DurationSeconds": 3600 + }, + "output": { + "Issuer": "https://integ.example.com/idp/shibboleth", + "AssumedRoleUser": { + "AssumedRoleId": "ARO456EXAMPLE789:TestSaml", + "Arn": "arn:aws:sts::123456789012:assumed-role/TestSaml" + }, + "Credentials": { + "SecretAccessKey": "8P+SQvWIuLnKhh8d++jpw0nNmQRBZvNEXAMPLEKEY", + "AccessKeyId": "ASIAV3ZUEFP6EXAMPLE", + "SessionToken": "IQoJb3JpZ2luX2VjEOz////////////////////wEXAMPLEtMSJHMEUCIDoKK3JH9uGQE1z0sINr5M4jk+Na8KHDcCYRVjJCZEvOAiEA3OvJGtw1EcViOleS2vhs8VdCKFJQWPQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "Expiration": "2019-11-01T20:26:47Z" + }, + "Audience": "https://signin.aws.amazon.com/saml", + "SubjectType": "transient", + "PackedPolicySize": 6, + "NameQualifier": "SbdGOnUkh1i4+EXAMPLExL/jEvs=", + "Subject": "SamlExample" + } + } + ] } }, "com.amazonaws.sts#AssumeRoleWithSAMLRequest": { @@ -2591,7 +2634,37 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated in\n a mobile or web application with a web identity provider. Example providers include the\n OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\n identity provider such as Google or Amazon Cognito federated identities.

\n \n

For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\n Amazon Web Services SDK for iOS Developer Guide and the Amazon Web Services SDK for Android Developer Guide to uniquely\n identify a user. You can also supply the user with a consistent identity throughout the\n lifetime of an application.

\n

To learn more about Amazon Cognito, see Amazon Cognito identity pools in\n Amazon Cognito Developer Guide.

\n
\n

Calling AssumeRoleWithWebIdentity does not require the use of Amazon Web Services\n security credentials. Therefore, you can distribute an application (for example, on mobile\n devices) that requests temporary security credentials without including long-term Amazon Web Services\n credentials in the application. You also don't need to deploy server-based proxy services\n that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\n using a token from the web identity provider. For a comparison of\n AssumeRoleWithWebIdentity with the other API operations that produce\n temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this API consist of an access key ID, a\n secret access key, and a security token. Applications can use these temporary security\n credentials to sign calls to Amazon Web Services service API operations.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithWebIdentity last for one hour. However, you can use the\n optional DurationSeconds parameter to specify the duration of your session.\n You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\n setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\n to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithWebIdentity can\n be used to make API calls to any Amazon Web Services service with the following exception: you cannot\n call the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your web identity token as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, the session tag overrides the role tag with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Identities\n

\n

Before your application can call AssumeRoleWithWebIdentity, you must have\n an identity token from a supported identity provider and create a role that the application\n can assume. The role that your application assumes must trust the identity provider that is\n associated with the identity token. In other words, the identity provider must be specified\n in the role's trust policy.

\n \n

Calling AssumeRoleWithWebIdentity can result in an entry in your\n CloudTrail logs. The entry includes the Subject of\n the provided web identity token. We recommend that you avoid using any personally\n identifiable information (PII) in this field. For example, you could instead use a GUID\n or a pairwise identifier, as suggested\n in the OIDC specification.

\n
\n

For more information about how to use web identity federation and the\n AssumeRoleWithWebIdentity API, see the following resources:

\n " + "smithy.api#documentation": "

Returns a set of temporary security credentials for users who have been authenticated in\n a mobile or web application with a web identity provider. Example providers include the\n OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\n identity provider such as Google or Amazon Cognito federated identities.

\n \n

For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\n Amazon Web Services SDK for iOS Developer Guide and the Amazon Web Services SDK for Android Developer Guide to uniquely\n identify a user. You can also supply the user with a consistent identity throughout the\n lifetime of an application.

\n

To learn more about Amazon Cognito, see Amazon Cognito identity\n pools in Amazon Cognito Developer Guide.

\n
\n

Calling AssumeRoleWithWebIdentity does not require the use of Amazon Web Services\n security credentials. Therefore, you can distribute an application (for example, on mobile\n devices) that requests temporary security credentials without including long-term Amazon Web Services\n credentials in the application. You also don't need to deploy server-based proxy services\n that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\n using a token from the web identity provider. For a comparison of\n AssumeRoleWithWebIdentity with the other API operations that produce\n temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

The temporary security credentials returned by this API consist of an access key ID, a\n secret access key, and a security token. Applications can use these temporary security\n credentials to sign calls to Amazon Web Services service API operations.

\n

\n Session Duration\n

\n

By default, the temporary security credentials created by\n AssumeRoleWithWebIdentity last for one hour. However, you can use the\n optional DurationSeconds parameter to specify the duration of your session.\n You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\n setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\n to view the maximum value for your role, see View the\n Maximum Session Duration Setting for a Role in the\n IAM User Guide. The maximum session duration limit applies when\n you use the AssumeRole* API operations or the assume-role* CLI\n commands. However the limit does not apply when you use those operations to create a\n console URL. For more information, see Using IAM Roles in the\n IAM User Guide.

\n

\n Permissions\n

\n

The temporary security credentials created by AssumeRoleWithWebIdentity can\n be used to make API calls to any Amazon Web Services service with the following exception: you cannot\n call the STS GetFederationToken or GetSessionToken API\n operations.

\n

(Optional) You can pass inline or managed session policies to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. Passing policies to this operation returns new \n temporary credentials. The resulting session's permissions are the intersection of the \n role's identity-based policy and the session policies. You can use the role's temporary \n credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \n the role. You cannot use session policies to grant more permissions than those allowed \n by the identity-based policy of the role that is being assumed. For more information, see\n Session\n Policies in the IAM User Guide.

\n

\n Tags\n

\n

(Optional) You can configure your IdP to pass attributes into your web identity token as\n session tags. Each session tag consists of a key name and an associated value. For more\n information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n

You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\n characters and the values can’t exceed 256 characters. For these and additional limits, see\n IAM\n and STS Character Limits in the IAM User Guide.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
\n

You can pass a session tag with the same key as a tag that is attached to the role. When\n you do, the session tag overrides the role tag with the same key.

\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

You can set the session tags as transitive. Transitive tags persist during role\n chaining. For more information, see Chaining Roles\n with Session Tags in the IAM User Guide.

\n

\n Identities\n

\n

Before your application can call AssumeRoleWithWebIdentity, you must have\n an identity token from a supported identity provider and create a role that the application\n can assume. The role that your application assumes must trust the identity provider that is\n associated with the identity token. In other words, the identity provider must be specified\n in the role's trust policy.

\n \n

Calling AssumeRoleWithWebIdentity can result in an entry in your\n CloudTrail logs. The entry includes the Subject of\n the provided web identity token. We recommend that you avoid using any personally\n identifiable information (PII) in this field. For example, you could instead use a GUID\n or a pairwise identifier, as suggested\n in the OIDC specification.

\n
\n

For more information about how to use web identity federation and the\n AssumeRoleWithWebIdentity API, see the following resources:

\n ", + "smithy.api#examples": [ + { + "title": "To assume a role as an OpenID Connect-federated user", + "documentation": "", + "input": { + "RoleArn": "arn:aws:iam::123456789012:role/FederatedWebIdentityRole", + "RoleSessionName": "app1", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "WebIdentityToken": "Atza%7CIQEBLjAsAhRFiXuWpUXuRvQ9PZL3GMFcYevydwIUFAHZwXZXXXXXXXXJnrulxKDHwy87oGKPznh0D6bEQZTSCzyoCtL_8S07pLpr0zMbn6w1lfVZKNTBdDansFBmtGnIsIapjI6xKR02Yc_2bQ8LZbUXSGm6Ry6_BG7PrtLZtj_dfCTj92xNGed-CrKqjG7nPBjNIL016GGvuS5gSvPRUxWES3VYfm1wl7WTI7jn-Pcb6M-buCgHhFOzTQxod27L9CqnOLio7N3gZAGpsp6n1-AJBOCJckcyXe2c6uD0srOJeZlKUm2eTDVMf8IehDVI0r1QOnTV6KzzAI3OY87Vd_cVMQ", + "ProviderId": "www.amazon.com", + "DurationSeconds": 3600 + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEE0a8ANXXXXXXXXNO1ewxE5TijQyp+IEXAMPLE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2014-10-24T23:00:23Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + }, + "SubjectFromWebIdentityToken": "amzn1.account.AF6RHO7KZU5XRVQJGXK6HEXAMPLE", + "AssumedRoleUser": { + "Arn": "arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/app1", + "AssumedRoleId": "AROACLKWSDQRAOEXAMPLE:app1" + }, + "PackedPolicySize": 123, + "Provider": "www.amazon.com", + "Audience": "client.5498841531868486423.1548@apps.example.com" + } + } + ] } }, "com.amazonaws.sts#AssumeRoleWithWebIdentityRequest": { @@ -2614,7 +2687,7 @@ "WebIdentityToken": { "target": "com.amazonaws.sts#clientTokenType", "traits": { - "smithy.api#documentation": "

The OAuth 2.0 access token or OpenID Connect ID token that is provided by the identity\n provider. Your application must get this token by authenticating the user who is using your\n application with a web identity provider before the application makes an\n AssumeRoleWithWebIdentity call.

", + "smithy.api#documentation": "

The OAuth 2.0 access token or OpenID Connect ID token that is provided by the identity\n provider. Your application must get this token by authenticating the user who is using your\n application with a web identity provider before the application makes an\n AssumeRoleWithWebIdentity call. Only tokens with RSA algorithms (RS256) are\n supported.

", "smithy.api#required": {} } }, @@ -2773,7 +2846,19 @@ } ], "traits": { - "smithy.api#documentation": "

Decodes additional information about the authorization status of a request from an\n encoded message returned in response to an Amazon Web Services request.

\n

For example, if a user is not authorized to perform an operation that he or she has\n requested, the request returns a Client.UnauthorizedOperation response (an\n HTTP 403 response). Some Amazon Web Services operations additionally return an encoded message that can\n provide details about this authorization failure.

\n \n

Only certain Amazon Web Services operations return an encoded authorization message. The\n documentation for an individual operation indicates whether that operation returns an\n encoded message in addition to returning an HTTP code.

\n
\n

The message is encoded because the details of the authorization status can contain\n privileged information that the user who requested the operation should not see. To decode\n an authorization status message, a user must be granted permissions through an IAM policy to\n request the DecodeAuthorizationMessage\n (sts:DecodeAuthorizationMessage) action.

\n

The decoded message includes the following type of information:

\n
    \n
  • \n

    Whether the request was denied due to an explicit deny or due to the absence of an\n explicit allow. For more information, see Determining Whether a Request is Allowed or Denied in the\n IAM User Guide.

    \n
  • \n
  • \n

    The principal who made the request.

    \n
  • \n
  • \n

    The requested action.

    \n
  • \n
  • \n

    The requested resource.

    \n
  • \n
  • \n

    The values of condition keys in the context of the user's request.

    \n
  • \n
" + "smithy.api#documentation": "

Decodes additional information about the authorization status of a request from an\n encoded message returned in response to an Amazon Web Services request.

\n

For example, if a user is not authorized to perform an operation that he or she has\n requested, the request returns a Client.UnauthorizedOperation response (an\n HTTP 403 response). Some Amazon Web Services operations additionally return an encoded message that can\n provide details about this authorization failure.

\n \n

Only certain Amazon Web Services operations return an encoded authorization message. The\n documentation for an individual operation indicates whether that operation returns an\n encoded message in addition to returning an HTTP code.

\n
\n

The message is encoded because the details of the authorization status can contain\n privileged information that the user who requested the operation should not see. To decode\n an authorization status message, a user must be granted permissions through an IAM policy to\n request the DecodeAuthorizationMessage\n (sts:DecodeAuthorizationMessage) action.

\n

The decoded message includes the following type of information:

\n
    \n
  • \n

    Whether the request was denied due to an explicit deny or due to the absence of an\n explicit allow. For more information, see Determining Whether a Request is Allowed or Denied in the\n IAM User Guide.

    \n
  • \n
  • \n

    The principal who made the request.

    \n
  • \n
  • \n

    The requested action.

    \n
  • \n
  • \n

    The requested resource.

    \n
  • \n
  • \n

    The values of condition keys in the context of the user's request.

    \n
  • \n
", + "smithy.api#examples": [ + { + "title": "To decode information about an authorization status of a request", + "documentation": "", + "input": { + "EncodedMessage": "" + }, + "output": { + "DecodedMessage": "{\"allowed\": \"false\",\"explicitDeny\": \"false\",\"matchedStatements\": \"\",\"failures\": \"\",\"context\": {\"principal\": {\"id\": \"AIDACKCEVSQ6C2EXAMPLE\",\"name\": \"Bob\",\"arn\": \"arn:aws:iam::123456789012:user/Bob\"},\"action\": \"ec2:StopInstances\",\"resource\": \"arn:aws:ec2:us-east-1:123456789012:instance/i-dd01c9bd\",\"conditions\": [{\"item\": {\"key\": \"ec2:Tenancy\",\"values\": [\"default\"]},{\"item\": {\"key\": \"ec2:ResourceTag/elasticbeanstalk:environment-name\",\"values\": [\"Default-Environment\"]}},(Additional items ...)]}}" + } + } + ] } }, "com.amazonaws.sts#DecodeAuthorizationMessageRequest": { @@ -2854,7 +2939,7 @@ "target": "com.amazonaws.sts#GetAccessKeyInfoResponse" }, "traits": { - "smithy.api#documentation": "

Returns the account identifier for the specified access key ID.

\n

Access keys consist of two parts: an access key ID (for example,\n AKIAIOSFODNN7EXAMPLE) and a secret access key (for example,\n wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). For more information about\n access keys, see Managing Access Keys for IAM\n Users in the IAM User Guide.

\n

When you pass an access key ID to this operation, it returns the ID of the Amazon Web Services account\n to which the keys belong. Access key IDs beginning with AKIA are long-term\n credentials for an IAM user or the Amazon Web Services account root user. Access key IDs beginning with\n ASIA are temporary credentials that are created using STS operations. If\n the account in the response belongs to you, you can sign in as the root user and review\n your root user access keys. Then, you can pull a credentials report to\n learn which IAM user owns the keys. To learn who requested the temporary credentials for\n an ASIA access key, view the STS events in your CloudTrail logs in the\n IAM User Guide.

\n

This operation does not indicate the state of the access key. The key might be active,\n inactive, or deleted. Active keys might not have permissions to perform an operation.\n Providing a deleted access key might return an error that the key doesn't exist.

" + "smithy.api#documentation": "

Returns the account identifier for the specified access key ID.

\n

Access keys consist of two parts: an access key ID (for example,\n AKIAIOSFODNN7EXAMPLE) and a secret access key (for example,\n wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). For more information about\n access keys, see Managing Access Keys for IAM\n Users in the IAM User Guide.

\n

When you pass an access key ID to this operation, it returns the ID of the Amazon Web Services account\n to which the keys belong. Access key IDs beginning with AKIA are long-term\n credentials for an IAM user or the Amazon Web Services account root user. Access key IDs\n beginning with ASIA are temporary credentials that are created using STS\n operations. If the account in the response belongs to you, you can sign in as the root user and review your root user access keys. Then, you can pull a credentials\n report to learn which IAM user owns the keys. To learn who\n requested the temporary credentials for an ASIA access key, view the STS\n events in your CloudTrail logs in the IAM User Guide.

\n

This operation does not indicate the state of the access key. The key might be active,\n inactive, or deleted. Active keys might not have permissions to perform an operation.\n Providing a deleted access key might return an error that the key doesn't exist.

" } }, "com.amazonaws.sts#GetAccessKeyInfoRequest": { @@ -2895,7 +2980,18 @@ "target": "com.amazonaws.sts#GetCallerIdentityResponse" }, "traits": { - "smithy.api#documentation": "

Returns details about the IAM user or role whose credentials are used to call the operation.

\n \n

No permissions are required to perform this operation. If an administrator\n attaches a policy to your identity that explicitly denies access to the\n sts:GetCallerIdentity action, you can still perform this operation.\n Permissions are not required because the same information is returned when access is denied. To view an example response, see I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice in the\n IAM User Guide.

\n
" + "smithy.api#documentation": "

Returns details about the IAM user or role whose credentials are used to\n call the operation.

\n \n

No permissions are required to perform this operation. If an administrator attaches a\n policy to your identity that explicitly denies access to the\n sts:GetCallerIdentity action, you can still perform this operation.\n Permissions are not required because the same information is returned when access is\n denied. To view an example response, see I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice in the\n IAM User Guide.

\n
", + "smithy.api#examples": [ + { + "title": "To get details about a calling IAM user", + "documentation": "This example shows a request and response made with the credentials for a user named Alice in the AWS account 123456789012.", + "output": { + "UserId": "AKIAI44QH8DHBEXAMPLE", + "Account": "123456789012", + "Arn": "arn:aws:iam::123456789012:user/Alice" + } + } + ] } }, "com.amazonaws.sts#GetCallerIdentityRequest": { @@ -2952,7 +3048,41 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary security credentials (consisting of an access key ID, a\n secret access key, and a security token) for a user. A typical use is in a proxy\n application that gets temporary security credentials on behalf of distributed applications\n inside a corporate network.

\n

You must call the GetFederationToken operation\n using the long-term security credentials of an IAM user. As a result, this call is\n appropriate in contexts where those credentials can be safeguarded, usually in a\n server-based application. For a comparison of GetFederationToken with the\n other API operations that produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

Although it is possible to call GetFederationToken using the security credentials of an\n Amazon Web Services account root user rather than an IAM user that you create for the purpose of a proxy application, we do not recommend it. For more information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

\n Session duration\n

\n

The temporary credentials are valid for the specified duration, from 900 seconds (15\n minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\n 43,200 seconds (12 hours). Temporary credentials obtained by using the root user credentials have a maximum duration of 3,600 seconds (1 hour).

\n

\n Permissions\n

\n

You can use the temporary credentials created by GetFederationToken in any\n Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM operations using the CLI or the Amazon Web Services API. This limitation does not apply to console sessions.

    \n
  • \n
  • \n

    You cannot call any STS operations except GetCallerIdentity.

    \n
  • \n
\n

You can use temporary credentials for single sign-on (SSO) to the console.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters.

\n

Though the session policy parameters are optional, if you do not pass a policy, then the\n resulting federated user session has no permissions. When you pass session policies, the\n session permissions are the intersection of the IAM user policies and the session\n policies that you pass. This gives you a way to further restrict the permissions for a\n federated user. You cannot use session policies to grant more permissions than those that\n are defined in the permissions policy of the IAM user. For more information, see Session\n Policies in the IAM User Guide. For information about\n using GetFederationToken to create temporary security credentials, see GetFederationToken—Federation Through a Custom Identity Broker.

\n

You can use the credentials to access a resource that has a resource-based policy. If\n that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions granted by the\n session policies.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These are called session\n tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

Tag key–value pairs are not case sensitive, but case is preserved. This means that you\n cannot have separate Department and department tag keys. Assume\n that the user that you are federating has the\n Department=Marketing tag and you pass the\n department=engineering session tag. Department\n and department are not saved as separate tags, and the session tag passed in\n the request takes precedence over the user tag.

" + "smithy.api#documentation": "

Returns a set of temporary security credentials (consisting of an access key ID, a\n secret access key, and a security token) for a user. A typical use is in a proxy\n application that gets temporary security credentials on behalf of distributed applications\n inside a corporate network.

\n

You must call the GetFederationToken operation using the long-term security\n credentials of an IAM user. As a result, this call is appropriate in\n contexts where those credentials can be safeguarded, usually in a server-based application.\n For a comparison of GetFederationToken with the other API operations that\n produce temporary credentials, see Requesting Temporary Security\n Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n

Although it is possible to call GetFederationToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user that you\n create for the purpose of a proxy application, we do not recommend it. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

\n Session duration\n

\n

The temporary credentials are valid for the specified duration, from 900 seconds (15\n minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\n 43,200 seconds (12 hours). Temporary credentials obtained by using the root user\n credentials have a maximum duration of 3,600 seconds (1 hour).

\n

\n Permissions\n

\n

You can use the temporary credentials created by GetFederationToken in any\n Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM operations using the CLI or the Amazon Web Services API. This\n limitation does not apply to console sessions.

    \n
  • \n
  • \n

    You cannot call any STS operations except GetCallerIdentity.

    \n
  • \n
\n

You can use temporary credentials for single sign-on (SSO) to the console.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters.

\n

Though the session policy parameters are optional, if you do not pass a policy, then the\n resulting federated user session has no permissions. When you pass session policies, the\n session permissions are the intersection of the IAM user policies and the\n session policies that you pass. This gives you a way to further restrict the permissions\n for a federated user. You cannot use session policies to grant more permissions than those\n that are defined in the permissions policy of the IAM user. For more\n information, see Session Policies in\n the IAM User Guide. For information about using\n GetFederationToken to create temporary security credentials, see GetFederationToken—Federation Through a Custom Identity Broker.

\n

You can use the credentials to access a resource that has a resource-based policy. If\n that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions granted by the\n session policies.

\n

\n Tags\n

\n

(Optional) You can pass tag key-value pairs to your session. These are called session\n tags. For more information about session tags, see Passing Session Tags in STS in the\n IAM User Guide.

\n \n

You can create a mobile-based or browser-based app that can authenticate users using\n a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\n Connect-compatible identity provider. In this case, we recommend that you use Amazon Cognito or\n AssumeRoleWithWebIdentity. For more information, see Federation Through a Web-based Identity Provider in the\n IAM User Guide.

\n
\n

An administrator must grant you the permissions necessary to pass session tags. The\n administrator can also create granular permissions to allow you to pass only specific\n session tags. For more information, see Tutorial: Using Tags\n for Attribute-Based Access Control in the\n IAM User Guide.

\n

Tag key–value pairs are not case sensitive, but case is preserved. This means that you\n cannot have separate Department and department tag keys. Assume\n that the user that you are federating has the\n Department=Marketing tag and you pass the\n department=engineering session tag. Department\n and department are not saved as separate tags, and the session tag passed in\n the request takes precedence over the user tag.

", + "smithy.api#examples": [ + { + "title": "To get temporary credentials for a role by using GetFederationToken", + "documentation": "", + "input": { + "Name": "testFedUserSession", + "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"Stmt1\",\"Effect\":\"Allow\",\"Action\":\"s3:ListAllMyBuckets\",\"Resource\":\"*\"}]}", + "DurationSeconds": 3600, + "Tags": [ + { + "Key": "Project", + "Value": "Pegasus" + }, + { + "Key": "Cost-Center", + "Value": "98765" + } + ] + }, + "output": { + "Credentials": { + "SessionToken": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-15T23:28:33.359Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + }, + "FederatedUser": { + "Arn": "arn:aws:sts::123456789012:federated-user/Bob", + "FederatedUserId": "123456789012:Bob" + }, + "PackedPolicySize": 8 + } + } + ] } }, "com.amazonaws.sts#GetFederationTokenRequest": { @@ -2968,19 +3098,19 @@ "Policy": { "target": "com.amazonaws.sts#sessionPolicyDocumentType", "traits": { - "smithy.api#documentation": "

An IAM policy in JSON format that you want to use as an inline session policy.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you a way to further\n restrict the permissions for a federated user. You cannot use session policies to grant\n more permissions than those that are defined in the permissions policy of the IAM user.\n For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n

The plaintext that you use for both inline and managed session policies can't exceed\n 2,048 characters. The JSON policy characters can be any ASCII character from the space\n character to the end of the valid character list (\\u0020 through \\u00FF). It can also\n include the tab (\\u0009), linefeed (\\u000A), and carriage return (\\u000D)\n characters.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" + "smithy.api#documentation": "

An IAM policy in JSON format that you want to use as an inline session policy.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you\n a way to further restrict the permissions for a federated user. You cannot use session\n policies to grant more permissions than those that are defined in the permissions policy of\n the IAM user. For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n

The plaintext that you use for both inline and managed session policies can't exceed\n 2,048 characters. The JSON policy characters can be any ASCII character from the space\n character to the end of the valid character list (\\u0020 through \\u00FF). It can also\n include the tab (\\u0009), linefeed (\\u000A), and carriage return (\\u000D)\n characters.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" } }, "PolicyArns": { "target": "com.amazonaws.sts#policyDescriptorListType", "traits": { - "smithy.api#documentation": "

The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as a\n managed session policy. The policies must exist in the same account as the IAM user that\n is requesting federated access.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. You can provide up to 10 managed policy ARNs. For\n more information about ARNs, see Amazon Resource Names (ARNs) and Amazon Web Services\n Service Namespaces in the Amazon Web Services General Reference.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you a way to further\n restrict the permissions for a federated user. You cannot use session policies to grant\n more permissions than those that are defined in the permissions policy of the IAM user.\n For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" + "smithy.api#documentation": "

The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as a\n managed session policy. The policies must exist in the same account as the IAM user that is requesting federated access.

\n

You must pass an inline or managed session policy to\n this operation. You can pass a single JSON policy document to use as an inline session\n policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\n managed session policies. The plaintext that you use for both inline and managed session\n policies can't exceed 2,048 characters. You can provide up to 10 managed policy ARNs. For\n more information about ARNs, see Amazon Resource Names (ARNs) and Amazon Web Services\n Service Namespaces in the Amazon Web Services General Reference.

\n

This parameter is optional. However, if you do not pass any session policies, then the\n resulting federated user session has no permissions.

\n

When you pass session policies, the session permissions are the intersection of the\n IAM user policies and the session policies that you pass. This gives you\n a way to further restrict the permissions for a federated user. You cannot use session\n policies to grant more permissions than those that are defined in the permissions policy of\n the IAM user. For more information, see Session Policies in\n the IAM User Guide.

\n

The resulting credentials can be used to access a resource that has a resource-based\n policy. If that policy specifically references the federated user session in the\n Principal element of the policy, the session has the permissions allowed by\n the policy. These permissions are granted in addition to the permissions that are granted\n by the session policies.

\n \n

An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\n and session tags into a packed binary format that has a separate limit. Your request can\n fail for this limit even if your plaintext meets the other requirements. The\n PackedPolicySize response element indicates by percentage how close the\n policies and tags for your request are to the upper size limit.

\n
" } }, "DurationSeconds": { "target": "com.amazonaws.sts#durationSecondsType", "traits": { - "smithy.api#documentation": "

The duration, in seconds, that the session should last. Acceptable durations for\n federation sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours), with\n 43,200 seconds (12 hours) as the default. Sessions obtained using root user\n credentials are restricted to a maximum of 3,600 seconds (one hour). If the specified\n duration is longer than one hour, the session obtained by using root user credentials\n defaults to one hour.

" + "smithy.api#documentation": "

The duration, in seconds, that the session should last. Acceptable durations for\n federation sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours), with\n 43,200 seconds (12 hours) as the default. Sessions obtained using root user\n credentials are restricted to a maximum of 3,600 seconds (one hour). If the specified\n duration is longer than one hour, the session obtained by using root user\n credentials defaults to one hour.

" } }, "Tags": { @@ -3035,7 +3165,26 @@ } ], "traits": { - "smithy.api#documentation": "

Returns a set of temporary credentials for an Amazon Web Services account or IAM user. The\n credentials consist of an access key ID, a secret access key, and a security token.\n Typically, you use GetSessionToken if you want to use MFA to protect\n programmatic calls to specific Amazon Web Services API operations like Amazon EC2 StopInstances.

\n

MFA-enabled IAM users must call GetSessionToken and submit an MFA\n code that is associated with their MFA device. Using the temporary security credentials\n that the call returns, IAM users can then make programmatic calls to API\n operations that require MFA authentication. An incorrect MFA code causes the API to return an access denied error. For a comparison of GetSessionToken\n with the other API operations that produce temporary credentials, see Requesting\n Temporary Security Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n \n

No permissions are required for users to perform this operation. The purpose of the\n sts:GetSessionToken operation is to authenticate the user using MFA. You\n cannot use policies to control authentication operations. For more information, see\n Permissions for GetSessionToken in the\n IAM User Guide.

\n
\n

\n Session Duration\n

\n

The GetSessionToken operation must be called by using the long-term Amazon Web Services\n security credentials of an IAM user. Credentials that are\n created by IAM users are valid for the duration that you specify. This duration can range\n from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\n of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\n seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour.

\n

\n Permissions\n

\n

The temporary security credentials created by GetSessionToken can be used\n to make API calls to any Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM API operations unless MFA authentication information is\n included in the request.

    \n
  • \n
  • \n

    You cannot call any STS API except\n AssumeRole or GetCallerIdentity.

    \n
  • \n
\n

The credentials that GetSessionToken returns are based on\n permissions associated with the IAM user whose credentials were used to call the operation. The\n temporary credentials have the same permissions as the IAM user.

\n \n

Although it is possible to call GetSessionToken using the security credentials of an\n Amazon Web Services account root user rather than an IAM user, we do not recommend it. If\n GetSessionToken is called using root user credentials, the\n temporary credentials have root user permissions. For more information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide\n

\n
\n

For more information about using GetSessionToken to create temporary\n credentials, see Temporary\n Credentials for Users in Untrusted Environments in the\n IAM User Guide.

" + "smithy.api#documentation": "

Returns a set of temporary credentials for an Amazon Web Services account or IAM user.\n The credentials consist of an access key ID, a secret access key, and a security token.\n Typically, you use GetSessionToken if you want to use MFA to protect\n programmatic calls to specific Amazon Web Services API operations like Amazon EC2\n StopInstances.

\n

MFA-enabled IAM users must call GetSessionToken and submit\n an MFA code that is associated with their MFA device. Using the temporary security\n credentials that the call returns, IAM users can then make programmatic\n calls to API operations that require MFA authentication. An incorrect MFA code causes the\n API to return an access denied error. For a comparison of GetSessionToken with\n the other API operations that produce temporary credentials, see Requesting\n Temporary Security Credentials and Comparing the\n Amazon Web Services STS API operations in the IAM User Guide.

\n \n

No permissions are required for users to perform this operation. The purpose of the\n sts:GetSessionToken operation is to authenticate the user using MFA. You\n cannot use policies to control authentication operations. For more information, see\n Permissions for GetSessionToken in the\n IAM User Guide.

\n
\n

\n Session Duration\n

\n

The GetSessionToken operation must be called by using the long-term Amazon Web Services\n security credentials of an IAM user. Credentials that are created by IAM users are valid for the duration that you specify. This duration can range\n from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\n of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\n seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour.

\n

\n Permissions\n

\n

The temporary security credentials created by GetSessionToken can be used\n to make API calls to any Amazon Web Services service with the following exceptions:

\n
    \n
  • \n

    You cannot call any IAM API operations unless MFA authentication information is\n included in the request.

    \n
  • \n
  • \n

    You cannot call any STS API except\n AssumeRole or GetCallerIdentity.

    \n
  • \n
\n

The credentials that GetSessionToken returns are based on permissions\n associated with the IAM user whose credentials were used to call the\n operation. The temporary credentials have the same permissions as the IAM user.

\n \n

Although it is possible to call GetSessionToken using the security\n credentials of an Amazon Web Services account root user rather than an IAM user, we do\n not recommend it. If GetSessionToken is called using root user\n credentials, the temporary credentials have root user permissions. For more\n information, see Safeguard your root user credentials and don't use them for everyday tasks in the\n IAM User Guide\n

\n
\n

For more information about using GetSessionToken to create temporary\n credentials, see Temporary\n Credentials for Users in Untrusted Environments in the\n IAM User Guide.

", + "smithy.api#examples": [ + { + "title": "To get temporary credentials for an IAM user or an AWS account", + "documentation": "", + "input": { + "DurationSeconds": 3600, + "SerialNumber": "YourMFASerialNumber", + "TokenCode": "123456" + }, + "output": { + "Credentials": { + "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE", + "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY", + "Expiration": "2011-07-11T19:55:29.611Z", + "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" + } + } + } + ] } }, "com.amazonaws.sts#GetSessionTokenRequest": { @@ -3044,19 +3193,19 @@ "DurationSeconds": { "target": "com.amazonaws.sts#durationSecondsType", "traits": { - "smithy.api#documentation": "

The duration, in seconds, that the credentials should remain valid. Acceptable durations\n for IAM user sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours),\n with 43,200 seconds (12 hours) as the default. Sessions for Amazon Web Services account owners are\n restricted to a maximum of 3,600 seconds (one hour). If the duration is longer than one\n hour, the session for Amazon Web Services account owners defaults to one hour.

" + "smithy.api#documentation": "

The duration, in seconds, that the credentials should remain valid. Acceptable durations\n for IAM user sessions range from 900 seconds (15 minutes) to 129,600 seconds\n (36 hours), with 43,200 seconds (12 hours) as the default. Sessions for Amazon Web Services account\n owners are restricted to a maximum of 3,600 seconds (one hour). If the duration is longer\n than one hour, the session for Amazon Web Services account owners defaults to one hour.

" } }, "SerialNumber": { "target": "com.amazonaws.sts#serialNumberType", "traits": { - "smithy.api#documentation": "

The identification number of the MFA device that is associated with the IAM user who\n is making the GetSessionToken call. Specify this value if the IAM user has a\n policy that requires MFA authentication. The value is either the serial number for a\n hardware device (such as GAHT12345678) or an Amazon Resource Name (ARN) for a\n virtual device (such as arn:aws:iam::123456789012:mfa/user). You can find the\n device for an IAM user by going to the Amazon Web Services Management Console and viewing the user's security\n credentials.

\n

The regex used to validate this parameter is a string of \n characters consisting of upper- and lower-case alphanumeric characters with no spaces. \n You can also include underscores or any of the following characters: =,.@:/-

" + "smithy.api#documentation": "

The identification number of the MFA device that is associated with the IAM user who is making the GetSessionToken call. Specify this value\n if the IAM user has a policy that requires MFA authentication. The value is\n either the serial number for a hardware device (such as GAHT12345678) or an\n Amazon Resource Name (ARN) for a virtual device (such as\n arn:aws:iam::123456789012:mfa/user). You can find the device for an IAM user by going to the Amazon Web Services Management Console and viewing the user's security credentials.

\n

The regex used to validate this parameter is a string of \n characters consisting of upper- and lower-case alphanumeric characters with no spaces. \n You can also include underscores or any of the following characters: =,.@:/-

" } }, "TokenCode": { "target": "com.amazonaws.sts#tokenCodeType", "traits": { - "smithy.api#documentation": "

The value provided by the MFA device, if MFA is required. If any policy requires the\n IAM user to submit an MFA code, specify this value. If MFA authentication is required,\n the user must provide a code when requesting a set of temporary security credentials. A\n user who fails to provide the code receives an \"access denied\" response when requesting\n resources that require MFA authentication.

\n

The format for this parameter, as described by its regex pattern, is a sequence of six\n numeric digits.

" + "smithy.api#documentation": "

The value provided by the MFA device, if MFA is required. If any policy requires the\n IAM user to submit an MFA code, specify this value. If MFA authentication\n is required, the user must provide a code when requesting a set of temporary security\n credentials. A user who fails to provide the code receives an \"access denied\" response when\n requesting resources that require MFA authentication.

\n

The format for this parameter, as described by its regex pattern, is a sequence of six\n numeric digits.

" } } }, @@ -3201,6 +3350,38 @@ "smithy.api#documentation": "

A reference to the IAM managed policy that is passed as a session policy for a role\n session or a federated user session.

" } }, + "com.amazonaws.sts#ProvidedContext": { + "type": "structure", + "members": { + "ProviderArn": { + "target": "com.amazonaws.sts#arnType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + }, + "ContextAssertion": { + "target": "com.amazonaws.sts#contextAssertionType", + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + } + }, + "traits": { + "smithy.api#documentation": "

Reserved for future use.

" + } + }, + "com.amazonaws.sts#ProvidedContextsListType": { + "type": "list", + "member": { + "target": "com.amazonaws.sts#ProvidedContext" + }, + "traits": { + "smithy.api#length": { + "min": 0, + "max": 5 + } + } + }, "com.amazonaws.sts#RegionDisabledException": { "type": "structure", "members": { @@ -3305,6 +3486,15 @@ "smithy.api#sensitive": {} } }, + "com.amazonaws.sts#contextAssertionType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 4, + "max": 2048 + } + } + }, "com.amazonaws.sts#dateType": { "type": "timestamp" }, @@ -3493,6 +3683,15 @@ "com.amazonaws.sts#tokenType": { "type": "string" }, + "com.amazonaws.sts#unrestrictedSessionPolicyDocumentType": { + "type": "string", + "traits": { + "smithy.api#length": { + "min": 1 + }, + "smithy.api#pattern": "^[\\u0009\\u000A\\u000D\\u0020-\\u00FF]+$" + } + }, "com.amazonaws.sts#urlType": { "type": "string", "traits": { diff --git a/aws/sdk/aws-models/timestream-query.json b/aws/sdk/aws-models/timestream-query.json index 29edeadd2a3..b7ed9535506 100644 --- a/aws/sdk/aws-models/timestream-query.json +++ b/aws/sdk/aws-models/timestream-query.json @@ -98,6 +98,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#CancelQueryResponse": { @@ -109,6 +112,9 @@ "smithy.api#documentation": "

A CancellationMessage is returned when a CancelQuery\n request for the query specified by QueryId has already been issued.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#ClientRequestToken": { @@ -223,7 +229,7 @@ "QueryString": { "target": "com.amazonaws.timestreamquery#QueryString", "traits": { - "smithy.api#documentation": "

The query string to run. Parameter\n names can be specified in the query string @ character followed by an\n identifier. The named Parameter @scheduled_runtime is reserved and can be used in the query to get the time at which the query is scheduled to run.

\n

The timestamp calculated according to the ScheduleConfiguration parameter, will be the value of @scheduled_runtime paramater for each query run. \n For example, consider an instance of a scheduled query executing on 2021-12-01 00:00:00. For this instance, the @scheduled_runtime parameter is \n initialized to the timestamp 2021-12-01 00:00:00 when invoking the query.

", + "smithy.api#documentation": "

The query string to run. Parameter\n names can be specified in the query string @ character followed by an\n identifier. The named Parameter @scheduled_runtime is reserved and can be used in the query to get the time at which the query is scheduled to run.

\n

The timestamp calculated according to the ScheduleConfiguration parameter, will be the value of @scheduled_runtime paramater for each query run. \n For example, consider an instance of a scheduled query executing on 2021-12-01 00:00:00. For this instance, the @scheduled_runtime parameter is \n initialized to the timestamp 2021-12-01 00:00:00 when invoking the query.

", "smithy.api#required": {} } }, @@ -250,7 +256,7 @@ "ClientToken": { "target": "com.amazonaws.timestreamquery#ClientToken", "traits": { - "smithy.api#documentation": "

Using a ClientToken makes the call to CreateScheduledQuery idempotent, in other words, making the same request repeatedly will produce the same result. Making \n multiple identical CreateScheduledQuery requests has the same effect as making a single request.\n\n

\n
    \n
  • \n

    If CreateScheduledQuery is called without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    After 8 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", + "smithy.api#documentation": "

Using a ClientToken makes the call to CreateScheduledQuery idempotent, in other words, making the same request repeatedly will produce the same result. Making \n multiple identical CreateScheduledQuery requests has the same effect as making a single request.\n\n

\n
    \n
  • \n

    If CreateScheduledQuery is called without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    After 8 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", "smithy.api#idempotencyToken": {} } }, @@ -270,7 +276,7 @@ "KmsKeyId": { "target": "com.amazonaws.timestreamquery#StringValue2048", "traits": { - "smithy.api#documentation": "

The Amazon KMS key used to encrypt the scheduled query resource, at-rest. If the Amazon KMS\n key is not specified, the scheduled query resource will be encrypted with a Timestream\n owned Amazon KMS key. To specify a KMS key, use the key ID, key ARN, alias name, or alias\n ARN. When using an alias name, prefix the name with alias/\n

\n

If ErrorReportConfiguration uses SSE_KMS as encryption type, the same KmsKeyId is used to encrypt the error report at rest.

" + "smithy.api#documentation": "

The Amazon KMS key used to encrypt the scheduled query resource, at-rest. If the Amazon KMS\n key is not specified, the scheduled query resource will be encrypted with a Timestream\n owned Amazon KMS key. To specify a KMS key, use the key ID, key ARN, alias name, or alias\n ARN. When using an alias name, prefix the name with alias/\n

\n

If ErrorReportConfiguration uses SSE_KMS as encryption type, the same KmsKeyId is used to encrypt the error report at rest.

" } }, "ErrorReportConfiguration": { @@ -280,6 +286,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#CreateScheduledQueryResponse": { @@ -292,6 +301,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Datum": { @@ -384,6 +396,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#DescribeEndpoints": { @@ -406,12 +421,15 @@ } ], "traits": { - "smithy.api#documentation": "

DescribeEndpoints returns a list of available endpoints to make Timestream\n API calls against. This API is available through both Write and Query.

\n

Because the Timestream SDKs are designed to transparently work with the\n service’s architecture, including the management and mapping of the service endpoints,\n it is not recommended that you use this API unless:

\n \n

For detailed information on how and when to use and implement DescribeEndpoints, see\n The Endpoint Discovery Pattern.

" + "smithy.api#documentation": "

DescribeEndpoints returns a list of available endpoints to make Timestream\n API calls against. This API is available through both Write and Query.

\n

Because the Timestream SDKs are designed to transparently work with the\n service’s architecture, including the management and mapping of the service endpoints,\n it is not recommended that you use this API unless:

\n \n

For detailed information on how and when to use and implement DescribeEndpoints, see\n The Endpoint Discovery Pattern.

" } }, "com.amazonaws.timestreamquery#DescribeEndpointsRequest": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#input": {} + } }, "com.amazonaws.timestreamquery#DescribeEndpointsResponse": { "type": "structure", @@ -423,6 +441,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#DescribeScheduledQuery": { @@ -470,6 +491,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#DescribeScheduledQueryResponse": { @@ -482,6 +506,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#DimensionMapping": { @@ -513,14 +540,14 @@ } }, "com.amazonaws.timestreamquery#DimensionValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "VARCHAR", - "name": "VARCHAR" + "type": "enum", + "members": { + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" } - ] + } } }, "com.amazonaws.timestreamquery#Double": { @@ -650,6 +677,9 @@ "smithy.api#idempotencyToken": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ExecutionStats": { @@ -754,6 +784,7 @@ "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", + "items": "ScheduledQueries", "pageSize": "MaxResults" } } @@ -773,6 +804,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ListScheduledQueriesResponse": { @@ -791,6 +825,9 @@ "smithy.api#documentation": "

A token to specify where to start paginating. This is the NextToken from a previously\n truncated response.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#ListTagsForResource": { @@ -823,6 +860,7 @@ "smithy.api#paginated": { "inputToken": "NextToken", "outputToken": "NextToken", + "items": "Tags", "pageSize": "MaxResults" } } @@ -849,6 +887,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ListTagsForResourceResponse": { @@ -867,6 +908,9 @@ "smithy.api#documentation": "

A pagination token to resume pagination with a subsequent call to\n ListTagsForResourceResponse.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Long": { @@ -903,30 +947,38 @@ } }, "com.amazonaws.timestreamquery#MeasureValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "MULTI", - "name": "MULTI" + "type": "enum", + "members": { + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" + } + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" + } + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" } - ] + }, + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" + } + }, + "MULTI": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MULTI" + } + } } }, "com.amazonaws.timestreamquery#MixedMeasureMapping": { @@ -1148,6 +1200,9 @@ "smithy.api#documentation": "

By setting this value to true, Timestream will only validate that the\n query string is a valid Timestream query, and not store the prepared query for later\n use.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#PrepareQueryResponse": { @@ -1174,6 +1229,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#Query": { @@ -1211,7 +1269,7 @@ "aws.api#clientDiscoveredEndpoint": { "required": true }, - "smithy.api#documentation": "

\n Query is a synchronous operation that enables you to run a query against\n your Amazon Timestream data. Query will time out after 60 seconds.\n You must update the default timeout in the SDK to support a timeout of 60 seconds. See\n the code\n sample for details.

\n

Your query request will fail in the following cases:

\n
    \n
  • \n

    If you submit a Query request with the same client token outside\n of the 5-minute idempotency window.

    \n
  • \n
  • \n

    If you submit a Query request with the same client token, but\n change other parameters, within the 5-minute idempotency window.

    \n
  • \n
  • \n

    If the size of the row (including the query metadata) exceeds 1 MB, then the\n query will fail with the following error message:

    \n

    \n Query aborted as max page response size has been exceeded by the output\n result row\n

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
", + "smithy.api#documentation": "

\n Query is a synchronous operation that enables you to run a query against\n your Amazon Timestream data. Query will time out after 60 seconds.\n You must update the default timeout in the SDK to support a timeout of 60 seconds. See\n the code\n sample for details.

\n

Your query request will fail in the following cases:

\n
    \n
  • \n

    If you submit a Query request with the same client token outside\n of the 5-minute idempotency window.

    \n
  • \n
  • \n

    If you submit a Query request with the same client token, but\n change other parameters, within the 5-minute idempotency window.

    \n
  • \n
  • \n

    If the size of the row (including the query metadata) exceeds 1 MB, then the\n query will fail with the following error message:

    \n

    \n Query aborted as max page response size has been exceeded by the output\n result row\n

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
", "smithy.api#idempotent": {}, "smithy.api#paginated": { "inputToken": "NextToken", @@ -1257,22 +1315,25 @@ "ClientToken": { "target": "com.amazonaws.timestreamquery#ClientRequestToken", "traits": { - "smithy.api#documentation": "

Unique, case-sensitive string of up to 64 ASCII characters specified when a\n Query request is made. Providing a ClientToken makes the\n call to Query\n idempotent. This means that running the same query repeatedly will\n produce the same result. In other words, making multiple identical Query\n requests has the same effect as making a single request. When using\n ClientToken in a query, note the following:

\n
    \n
  • \n

    If the Query API is instantiated without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    If the Query invocation only contains the\n ClientToken but does not include a NextToken, that\n invocation of Query is assumed to be a new query run.

    \n
  • \n
  • \n

    If the invocation contains NextToken, that particular invocation\n is assumed to be a subsequent invocation of a prior call to the Query API, and a\n result set is returned.

    \n
  • \n
  • \n

    After 4 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", + "smithy.api#documentation": "

Unique, case-sensitive string of up to 64 ASCII characters specified when a\n Query request is made. Providing a ClientToken makes the\n call to Query\n idempotent. This means that running the same query repeatedly will\n produce the same result. In other words, making multiple identical Query\n requests has the same effect as making a single request. When using\n ClientToken in a query, note the following:

\n
    \n
  • \n

    If the Query API is instantiated without a ClientToken, the\n Query SDK generates a ClientToken on your behalf.

    \n
  • \n
  • \n

    If the Query invocation only contains the\n ClientToken but does not include a NextToken, that\n invocation of Query is assumed to be a new query run.

    \n
  • \n
  • \n

    If the invocation contains NextToken, that particular invocation\n is assumed to be a subsequent invocation of a prior call to the Query API, and a\n result set is returned.

    \n
  • \n
  • \n

    After 4 hours, any request with the same ClientToken is treated\n as a new request.

    \n
  • \n
", "smithy.api#idempotencyToken": {} } }, "NextToken": { "target": "com.amazonaws.timestreamquery#PaginationToken", "traits": { - "smithy.api#documentation": "

A pagination token used to return a set of results. When the Query API\n is invoked using NextToken, that particular invocation is assumed to be a\n subsequent invocation of a prior call to Query, and a result set is\n returned. However, if the Query invocation only contains the\n ClientToken, that invocation of Query is assumed to be a\n new query run.

\n

Note the following when using NextToken in a query:

\n
    \n
  • \n

    A pagination token can be used for up to five Query invocations,\n OR for a duration of up to 1 hour – whichever comes first.

    \n
  • \n
  • \n

    Using the same NextToken will return the same set of records. To\n keep paginating through the result set, you must to use the most recent\n nextToken.

    \n
  • \n
  • \n

    Suppose a Query invocation returns two NextToken\n values, TokenA and TokenB. If TokenB is\n used in a subsequent Query invocation, then TokenA is\n invalidated and cannot be reused.

    \n
  • \n
  • \n

    To request a previous result set from a query after pagination has begun, you\n must re-invoke the Query API.

    \n
  • \n
  • \n

    The latest NextToken should be used to paginate until\n null is returned, at which point a new NextToken\n should be used.

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
" + "smithy.api#documentation": "

A pagination token used to return a set of results. When the Query API\n is invoked using NextToken, that particular invocation is assumed to be a\n subsequent invocation of a prior call to Query, and a result set is\n returned. However, if the Query invocation only contains the\n ClientToken, that invocation of Query is assumed to be a\n new query run.

\n

Note the following when using NextToken in a query:

\n
    \n
  • \n

    A pagination token can be used for up to five Query invocations,\n OR for a duration of up to 1 hour – whichever comes first.

    \n
  • \n
  • \n

    Using the same NextToken will return the same set of records. To\n keep paginating through the result set, you must to use the most recent\n nextToken.

    \n
  • \n
  • \n

    Suppose a Query invocation returns two NextToken\n values, TokenA and TokenB. If TokenB is\n used in a subsequent Query invocation, then TokenA is\n invalidated and cannot be reused.

    \n
  • \n
  • \n

    To request a previous result set from a query after pagination has begun, you\n must re-invoke the Query API.

    \n
  • \n
  • \n

    The latest NextToken should be used to paginate until\n null is returned, at which point a new NextToken\n should be used.

    \n
  • \n
  • \n

    If the IAM principal of the query initiator and the result reader are not the\n same and/or the query initiator and the result reader do not have the same query\n string in the query requests, the query will fail with an Invalid\n pagination token error.

    \n
  • \n
" } }, "MaxRows": { "target": "com.amazonaws.timestreamquery#MaxQueryResults", "traits": { - "smithy.api#documentation": "

The total number of rows to be returned in the Query output. The initial\n run of Query with a MaxRows value specified will return the\n result set of the query in two cases:

\n
    \n
  • \n

    The size of the result is less than 1MB.

    \n
  • \n
  • \n

    The number of rows in the result set is less than the value of\n maxRows.

    \n
  • \n
\n

Otherwise, the initial invocation of Query only returns a\n NextToken, which can then be used in subsequent calls to fetch the\n result set. To resume pagination, provide the NextToken value in the\n subsequent command.

\n

If the row size is large (e.g. a row has many columns), Timestream may return\n fewer rows to keep the response size from exceeding the 1 MB limit. If\n MaxRows is not provided, Timestream will send the necessary\n number of rows to meet the 1 MB limit.

" + "smithy.api#documentation": "

The total number of rows to be returned in the Query output. The initial\n run of Query with a MaxRows value specified will return the\n result set of the query in two cases:

\n
    \n
  • \n

    The size of the result is less than 1MB.

    \n
  • \n
  • \n

    The number of rows in the result set is less than the value of\n maxRows.

    \n
  • \n
\n

Otherwise, the initial invocation of Query only returns a\n NextToken, which can then be used in subsequent calls to fetch the\n result set. To resume pagination, provide the NextToken value in the\n subsequent command.

\n

If the row size is large (e.g. a row has many columns), Timestream may return\n fewer rows to keep the response size from exceeding the 1 MB limit. If\n MaxRows is not provided, Timestream will send the necessary\n number of rows to meet the 1 MB limit.

" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#QueryResponse": { @@ -1311,6 +1372,9 @@ "smithy.api#documentation": "

Information about the status of the query, including progress and bytes\n scanned.

" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.timestreamquery#QueryStatus": { @@ -1433,18 +1497,20 @@ } }, "com.amazonaws.timestreamquery#S3EncryptionOption": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "SSE_S3", - "name": "SSE_S3" - }, - { - "value": "SSE_KMS", - "name": "SSE_KMS" + "type": "enum", + "members": { + "SSE_S3": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "SSE_S3" + } + }, + "SSE_KMS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "SSE_KMS" } - ] + } } }, "com.amazonaws.timestreamquery#S3ObjectKey": { @@ -1481,81 +1547,109 @@ } }, "com.amazonaws.timestreamquery#ScalarMeasureValueType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "TIMESTAMP", - "name": "TIMESTAMP" + "type": "enum", + "members": { + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" + } + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" } - ] + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" + } + }, + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" + } + }, + "TIMESTAMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIMESTAMP" + } + } } }, "com.amazonaws.timestreamquery#ScalarType": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "VARCHAR", - "name": "VARCHAR" - }, - { - "value": "BOOLEAN", - "name": "BOOLEAN" - }, - { - "value": "BIGINT", - "name": "BIGINT" - }, - { - "value": "DOUBLE", - "name": "DOUBLE" - }, - { - "value": "TIMESTAMP", - "name": "TIMESTAMP" - }, - { - "value": "DATE", - "name": "DATE" - }, - { - "value": "TIME", - "name": "TIME" - }, - { - "value": "INTERVAL_DAY_TO_SECOND", - "name": "INTERVAL_DAY_TO_SECOND" - }, - { - "value": "INTERVAL_YEAR_TO_MONTH", - "name": "INTERVAL_YEAR_TO_MONTH" - }, - { - "value": "UNKNOWN", - "name": "UNKNOWN" - }, - { - "value": "INTEGER", - "name": "INTEGER" + "type": "enum", + "members": { + "VARCHAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "VARCHAR" + } + }, + "BOOLEAN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BOOLEAN" + } + }, + "BIGINT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "BIGINT" + } + }, + "DOUBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DOUBLE" + } + }, + "TIMESTAMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIMESTAMP" + } + }, + "DATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DATE" + } + }, + "TIME": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "TIME" + } + }, + "INTERVAL_DAY_TO_SECOND": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTERVAL_DAY_TO_SECOND" } - ] + }, + "INTERVAL_YEAR_TO_MONTH": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTERVAL_YEAR_TO_MONTH" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "UNKNOWN" + } + }, + "INTEGER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "INTEGER" + } + } } }, "com.amazonaws.timestreamquery#ScalarValue": { @@ -1771,26 +1865,32 @@ } }, "com.amazonaws.timestreamquery#ScheduledQueryRunStatus": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "AUTO_TRIGGER_SUCCESS", - "name": "AUTO_TRIGGER_SUCCESS" - }, - { - "value": "AUTO_TRIGGER_FAILURE", - "name": "AUTO_TRIGGER_FAILURE" - }, - { - "value": "MANUAL_TRIGGER_SUCCESS", - "name": "MANUAL_TRIGGER_SUCCESS" - }, - { - "value": "MANUAL_TRIGGER_FAILURE", - "name": "MANUAL_TRIGGER_FAILURE" + "type": "enum", + "members": { + "AUTO_TRIGGER_SUCCESS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AUTO_TRIGGER_SUCCESS" + } + }, + "AUTO_TRIGGER_FAILURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "AUTO_TRIGGER_FAILURE" + } + }, + "MANUAL_TRIGGER_SUCCESS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MANUAL_TRIGGER_SUCCESS" } - ] + }, + "MANUAL_TRIGGER_FAILURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "MANUAL_TRIGGER_FAILURE" + } + } } }, "com.amazonaws.timestreamquery#ScheduledQueryRunSummary": { @@ -1844,18 +1944,20 @@ } }, "com.amazonaws.timestreamquery#ScheduledQueryState": { - "type": "string", - "traits": { - "smithy.api#enum": [ - { - "value": "ENABLED", - "name": "ENABLED" - }, - { - "value": "DISABLED", - "name": "DISABLED" + "type": "enum", + "members": { + "ENABLED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ENABLED" + } + }, + "DISABLED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "DISABLED" } - ] + } } }, "com.amazonaws.timestreamquery#SchemaName": { @@ -2049,11 +2151,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#TagResourceResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.timestreamquery#TagValue": { "type": "string", @@ -2274,7 +2382,7 @@ "name": "timestream" }, "aws.protocols#awsJson1_0": {}, - "smithy.api#documentation": "Amazon Timestream Query\n \n

", + "smithy.api#documentation": "Amazon Timestream Query\n \n

", "smithy.api#title": "Amazon Timestream Query", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -2318,7 +2426,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2336,293 +2443,258 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://query.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://query.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://query.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://query.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://query.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://query.timestream.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://query.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://query.timestream.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -3020,11 +3092,17 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#UntagResourceResponse": { "type": "structure", - "members": {} + "members": {}, + "traits": { + "smithy.api#output": {} + } }, "com.amazonaws.timestreamquery#UpdateScheduledQuery": { "type": "operation", @@ -3078,6 +3156,9 @@ "smithy.api#required": {} } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.timestreamquery#ValidationException": { diff --git a/aws/sdk/aws-models/timestream-write.json b/aws/sdk/aws-models/timestream-write.json index a3378d042b1..72221496311 100644 --- a/aws/sdk/aws-models/timestream-write.json +++ b/aws/sdk/aws-models/timestream-write.json @@ -1674,7 +1674,6 @@ "com.amazonaws.timestreamwrite#MagneticStoreRetentionPeriodInDays": { "type": "long", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 73000 @@ -1781,7 +1780,6 @@ "com.amazonaws.timestreamwrite#MemoryStoreRetentionPeriodInHours": { "type": "long", "traits": { - "smithy.api#default": 0, "smithy.api#range": { "min": 1, "max": 8766 @@ -2282,7 +2280,6 @@ "MemoryStoreRetentionPeriodInHours": { "target": "com.amazonaws.timestreamwrite#MemoryStoreRetentionPeriodInHours", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The duration for which data must be stored in the memory store.

", "smithy.api#required": {} } @@ -2290,7 +2287,6 @@ "MagneticStoreRetentionPeriodInDays": { "target": "com.amazonaws.timestreamwrite#MagneticStoreRetentionPeriodInDays", "traits": { - "smithy.api#default": 0, "smithy.api#documentation": "

The duration for which data must be stored in the magnetic store.

", "smithy.api#required": {} } @@ -2865,7 +2861,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2883,293 +2878,283 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "booleanEquals", + "fn": "stringEquals", "argv": [ - true, { "fn": "getAttr", "argv": [ { "ref": "PartitionResult" }, - "supportsFIPS" + "name" ] - } + }, + "aws-us-gov" ] } ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] + "endpoint": { + "url": "https://ingest.timestream.{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://ingest.timestream-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ { - "conditions": [], - "endpoint": { - "url": "https://ingest.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://ingest.timestream.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://ingest.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://ingest.timestream.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, @@ -3279,6 +3264,32 @@ "UseDualStack": false } }, + { + "documentation": "For region us-gov-west-1 with FIPS disabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://ingest.timestream.us-gov-west-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-west-1", + "UseFIPS": false, + "UseDualStack": false + } + }, + { + "documentation": "For region us-gov-west-1 with FIPS enabled and DualStack disabled", + "expect": { + "endpoint": { + "url": "https://ingest.timestream.us-gov-west-1.amazonaws.com" + } + }, + "params": { + "Region": "us-gov-west-1", + "UseFIPS": true, + "UseDualStack": false + } + }, { "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack enabled", "expect": { @@ -3296,7 +3307,7 @@ "documentation": "For region us-gov-east-1 with FIPS enabled and DualStack disabled", "expect": { "endpoint": { - "url": "https://ingest.timestream-fips.us-gov-east-1.amazonaws.com" + "url": "https://ingest.timestream.us-gov-east-1.amazonaws.com" } }, "params": { diff --git a/aws/sdk/aws-models/transcribe-streaming.json b/aws/sdk/aws-models/transcribe-streaming.json index a1464b0462e..d8b9be6cf8c 100644 --- a/aws/sdk/aws-models/transcribe-streaming.json +++ b/aws/sdk/aws-models/transcribe-streaming.json @@ -96,7 +96,7 @@ } }, "traits": { - "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", + "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", "smithy.api#streaming": {} } }, @@ -915,7 +915,7 @@ "Confidence": { "target": "com.amazonaws.transcribestreaming#Confidence", "traits": { - "smithy.api#documentation": "

The confidence score associated with the identified PHI entity in your audio.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified entity correctly matches the entity spoken in your\n media.

" + "smithy.api#documentation": "

The confidence score associated with the identified PHI entity in your audio.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified entity correctly matches the entity spoken in your\n media.

" } } }, @@ -961,7 +961,7 @@ "Confidence": { "target": "com.amazonaws.transcribestreaming#Confidence", "traits": { - "smithy.api#documentation": "

The confidence score associated with a word or phrase in your transcript.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified item correctly matches the item spoken in your\n media.

" + "smithy.api#documentation": "

The confidence score associated with a word or phrase in your transcript.

\n

Confidence scores are values between 0 and 1. A larger value indicates a higher\n probability that the identified item correctly matches the item spoken in your\n media.

" } }, "Speaker": { @@ -1008,7 +1008,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Indicates if the segment is complete.

\n

If IsPartial is true, the segment is not complete. If\n IsPartial is false, the segment is complete.

" + "smithy.api#documentation": "

Indicates if the segment is complete.

\n

If IsPartial is true, the segment is not complete. If\n IsPartial is false, the segment is complete.

" } }, "Alternatives": { @@ -1025,7 +1025,7 @@ } }, "traits": { - "smithy.api#documentation": "

The Result associated with a \n .

\n

Contains a set of transcription results from one or more audio segments, along with\n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" + "smithy.api#documentation": "

The Result associated with a \n .

\n

Contains a set of transcription results from one or more audio segments, along with\n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" } }, "com.amazonaws.transcribestreaming#MedicalResultList": { @@ -1045,7 +1045,7 @@ } }, "traits": { - "smithy.api#documentation": "

The MedicalTranscript associated with a \n .

\n

\n MedicalTranscript contains Results, which contains a set of \n transcription results from one or more audio segments, along with additional information per your \n request parameters.

" + "smithy.api#documentation": "

The MedicalTranscript associated with a \n .

\n

\n MedicalTranscript contains Results, which contains a set of \n transcription results from one or more audio segments, along with additional information per your \n request parameters.

" } }, "com.amazonaws.transcribestreaming#MedicalTranscriptEvent": { @@ -1059,7 +1059,7 @@ } }, "traits": { - "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with additional \n information per your request parameters.

" + "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with additional \n information per your request parameters.

" } }, "com.amazonaws.transcribestreaming#MedicalTranscriptResultStream": { @@ -1068,7 +1068,7 @@ "TranscriptEvent": { "target": "com.amazonaws.transcribestreaming#MedicalTranscriptEvent", "traits": { - "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with \n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" + "smithy.api#documentation": "

The MedicalTranscriptEvent associated with a \n MedicalTranscriptResultStream.

\n

Contains a set of transcription results from one or more audio segments, along with \n additional information per your request parameters. This can include information relating to\n alternative transcriptions, channel identification, partial result stabilization, language \n identification, and other transcription-related data.

" } }, "BadRequestException": { @@ -1457,7 +1457,7 @@ "VocabularyFilterName": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-name" } }, @@ -1471,7 +1471,7 @@ "LanguageModelName": { "target": "com.amazonaws.transcribestreaming#ModelName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", + "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", "smithy.api#httpHeader": "x-amzn-transcribe-language-model-name" } }, @@ -1486,21 +1486,21 @@ "PartialResultsStability": { "target": "com.amazonaws.transcribestreaming#PartialResultsStability", "traits": { - "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", + "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", "smithy.api#httpHeader": "x-amzn-transcribe-partial-results-stability" } }, "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#ContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } }, "ContentRedactionType": { "target": "com.amazonaws.transcribestreaming#ContentRedactionType", "traits": { - "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-redaction-type" } }, @@ -1511,6 +1511,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-pii-entity-types" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscriptionResponse": { @@ -1622,6 +1625,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-pii-entity-types" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#StartMedicalStreamTranscription": { @@ -1650,7 +1656,7 @@ } ], "traits": { - "smithy.api#documentation": "

Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \n Amazon Transcribe Medical and the transcription results are streamed to your\n application.

\n

The following parameters are required:

\n
    \n
  • \n

    \n language-code\n

    \n
  • \n
  • \n

    \n media-encoding\n

    \n
  • \n
  • \n

    \n sample-rate\n

    \n
  • \n
\n

For more information on streaming with Amazon Transcribe Medical, see \n Transcribing\n streaming audio.

", + "smithy.api#documentation": "

Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \n Amazon Transcribe Medical and the transcription results are streamed to your\n application.

\n

The following parameters are required:

\n
    \n
  • \n

    \n language-code\n

    \n
  • \n
  • \n

    \n media-encoding\n

    \n
  • \n
  • \n

    \n sample-rate\n

    \n
  • \n
\n

For more information on streaming with Amazon Transcribe Medical, see \n Transcribing\n streaming audio.

", "smithy.api#http": { "method": "POST", "uri": "/medical-stream-transcription", @@ -1664,7 +1670,7 @@ "LanguageCode": { "target": "com.amazonaws.transcribestreaming#LanguageCode", "traits": { - "smithy.api#documentation": "

Specify the language code that represents the language spoken in your audio.

\n \n

Amazon Transcribe Medical only supports US English (en-US).

\n
", + "smithy.api#documentation": "

Specify the language code that represents the language spoken in your audio.

\n \n

Amazon Transcribe Medical only supports US English (en-US).

\n
", "smithy.api#httpHeader": "x-amzn-transcribe-language-code", "smithy.api#required": {} } @@ -1680,7 +1686,7 @@ "MediaEncoding": { "target": "com.amazonaws.transcribestreaming#MediaEncoding", "traits": { - "smithy.api#documentation": "

Specify the encoding used for the input audio. Supported formats are:

\n
    \n
  • \n

    FLAC

    \n
  • \n
  • \n

    OPUS-encoded audio in an Ogg container

    \n
  • \n
  • \n

    PCM (only signed 16-bit little-endian audio formats, which does not include\n WAV)

    \n
  • \n
\n

For more information, see Media formats.

", + "smithy.api#documentation": "

Specify the encoding used for the input audio. Supported formats are:

\n
    \n
  • \n

    FLAC

    \n
  • \n
  • \n

    OPUS-encoded audio in an Ogg container

    \n
  • \n
  • \n

    PCM (only signed 16-bit little-endian audio formats, which does not include\n WAV)

    \n
  • \n
\n

For more information, see Media formats.

", "smithy.api#httpHeader": "x-amzn-transcribe-media-encoding", "smithy.api#required": {} } @@ -1712,14 +1718,14 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker\n partitioning labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", + "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker\n partitioning labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", "smithy.api#httpHeader": "x-amzn-transcribe-show-speaker-label" } }, "SessionId": { "target": "com.amazonaws.transcribestreaming#SessionId", "traits": { - "smithy.api#documentation": "

Specify a name for your transcription session. If you don't include this parameter in \n your request, Amazon Transcribe Medical generates an ID and returns it in the\n response.

\n

You can use a session ID to retry a streaming session.

", + "smithy.api#documentation": "

Specify a name for your transcription session. If you don't include this parameter in \n your request, Amazon Transcribe Medical generates an ID and returns it in the\n response.

\n

You can use a session ID to retry a streaming session.

", "smithy.api#httpHeader": "x-amzn-transcribe-session-id" } }, @@ -1734,7 +1740,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends\n the output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", + "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends\n the output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", "smithy.api#httpHeader": "x-amzn-transcribe-enable-channel-identification" } }, @@ -1748,10 +1754,13 @@ "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#MedicalContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personal health information (PHI) identified in your transcript.

\n

Content identification is performed at the segment level; PHI is flagged upon complete\n transcription of an audio segment.

\n

For more information, see Identifying personal health information (PHI) in a\n transcription.

", + "smithy.api#documentation": "

Labels all personal health information (PHI) identified in your transcript.

\n

Content identification is performed at the segment level; PHI is flagged upon complete\n transcription of an audio segment.

\n

For more information, see Identifying personal health information (PHI) in a\n transcription.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartMedicalStreamTranscriptionResponse": { @@ -1850,6 +1859,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#StartStreamTranscription": { @@ -1929,7 +1941,7 @@ "AudioStream": { "target": "com.amazonaws.transcribestreaming#AudioStream", "traits": { - "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", + "smithy.api#documentation": "

An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \n data frames.

\n

For more information, see Transcribing streaming audio.

", "smithy.api#httpPayload": {}, "smithy.api#required": {} } @@ -1937,7 +1949,7 @@ "VocabularyFilterName": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n \n

This parameter is not intended for use with the\n IdentifyLanguage parameter. If you're including IdentifyLanguage\n in your request and want to use one or more vocabulary filters with your transcription, use\n the VocabularyFilterNames parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the name of the custom vocabulary filter that you want to use when processing your\n transcription. Note that vocabulary filter names are case sensitive.

\n

If the language of the specified custom vocabulary filter doesn't match the language identified in\n your media, the vocabulary filter is not applied to your transcription.

\n \n

This parameter is not intended for use with the\n IdentifyLanguage parameter. If you're including IdentifyLanguage\n in your request and want to use one or more vocabulary filters with your transcription, use\n the VocabularyFilterNames parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-name" } }, @@ -1952,7 +1964,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker partitioning \n labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", + "smithy.api#documentation": "

Enables speaker partitioning (diarization) in your transcription output. Speaker partitioning \n labels the speech from individual speakers in your media file.

\n

For more information, see Partitioning speakers (diarization).

", "smithy.api#httpHeader": "x-amzn-transcribe-show-speaker-label" } }, @@ -1960,7 +1972,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends the \n output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", + "smithy.api#documentation": "

Enables channel identification in multi-channel audio.

\n

Channel identification transcribes the audio on each channel independently, then appends the \n output for each channel into one transcript.

\n

If you have multi-channel audio and do not enable channel identification, your audio is \n transcribed in a continuous manner and your transcript is not separated by channel.

\n

For more information, see Transcribing multi-channel audio.

", "smithy.api#httpHeader": "x-amzn-transcribe-enable-channel-identification" } }, @@ -1982,21 +1994,21 @@ "PartialResultsStability": { "target": "com.amazonaws.transcribestreaming#PartialResultsStability", "traits": { - "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", + "smithy.api#documentation": "

Specify the level of stability to use when you enable partial results stabilization \n (EnablePartialResultsStabilization).

\n

Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\n lower accuracy.

\n

For more information, see Partial-result \n stabilization.

", "smithy.api#httpHeader": "x-amzn-transcribe-partial-results-stability" } }, "ContentIdentificationType": { "target": "com.amazonaws.transcribestreaming#ContentIdentificationType", "traits": { - "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Labels all personally identifiable information (PII) identified in your transcript.

\n

Content identification is performed at the segment level; PII specified in \n PiiEntityTypes is flagged upon complete transcription of an audio segment.

\n

You can’t set ContentIdentificationType and ContentRedactionType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-identification-type" } }, "ContentRedactionType": { "target": "com.amazonaws.transcribestreaming#ContentRedactionType", "traits": { - "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", + "smithy.api#documentation": "

Redacts all personally identifiable information (PII) identified in your transcript.

\n

Content redaction is performed at the segment level; PII specified in \n PiiEntityTypes is redacted upon complete transcription of an audio segment.

\n

You can’t set ContentRedactionType and ContentIdentificationType\n in the same request. If you set both, your request returns a\n BadRequestException.

\n

For more information, see Redacting or identifying personally identifiable\n information.

", "smithy.api#httpHeader": "x-amzn-transcribe-content-redaction-type" } }, @@ -2010,7 +2022,7 @@ "LanguageModelName": { "target": "com.amazonaws.transcribestreaming#ModelName", "traits": { - "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", + "smithy.api#documentation": "

Specify the name of the custom language model that you want to use when processing your\n transcription. Note that language model names are case sensitive.

\n

The language of the specified language model must match the language code you specify\n in your transcription request. If the languages don't match, the custom language model isn't applied. \n There are no errors or warnings associated with a language mismatch.

\n

For more information, see Custom language models.

", "smithy.api#httpHeader": "x-amzn-transcribe-language-model-name" } }, @@ -2018,7 +2030,7 @@ "target": "com.amazonaws.transcribestreaming#Boolean", "traits": { "smithy.api#default": false, - "smithy.api#documentation": "

Enables automatic language identification for your transcription.

\n

If you include IdentifyLanguage, you can optionally include a list of \n language codes, using LanguageOptions, that you think may be present in \n your audio stream. Including language options can improve transcription accuracy.

\n

You can also include a preferred language using PreferredLanguage. Adding a \n preferred language can help Amazon Transcribe identify the language faster than if you omit this \n parameter.

\n

If you have multi-channel audio that contains different languages on each channel, and you've \n enabled channel identification, automatic language identification identifies the dominant language on \n each audio channel.

\n

Note that you must include either LanguageCode or \n IdentifyLanguage in your request. If you include both parameters, your request\n fails.

\n

Streaming language identification can't be combined with custom language models or \n redaction.

", + "smithy.api#documentation": "

Enables automatic language identification for your transcription.

\n

If you include IdentifyLanguage, you can optionally include a list of \n language codes, using LanguageOptions, that you think may be present in \n your audio stream. Including language options can improve transcription accuracy.

\n

You can also include a preferred language using PreferredLanguage. Adding a \n preferred language can help Amazon Transcribe identify the language faster than if you omit this \n parameter.

\n

If you have multi-channel audio that contains different languages on each channel, and you've \n enabled channel identification, automatic language identification identifies the dominant language on \n each audio channel.

\n

Note that you must include either LanguageCode or \n IdentifyLanguage in your request. If you include both parameters, your request\n fails.

\n

Streaming language identification can't be combined with custom language models or \n redaction.

", "smithy.api#httpHeader": "x-amzn-transcribe-identify-language" } }, @@ -2039,17 +2051,20 @@ "VocabularyNames": { "target": "com.amazonaws.transcribestreaming#VocabularyNames", "traits": { - "smithy.api#documentation": "

Specify the names of the custom vocabularies that you want to use when processing your\n transcription. Note that vocabulary names are case sensitive.

\n

If none of the languages of the specified custom vocabularies match the language identified in \n your media, your job fails.

\n \n

This parameter is only intended for use with the\n IdentifyLanguage parameter. If you're not\n including IdentifyLanguage in your request and want to use a custom vocabulary\n with your transcription, use the VocabularyName parameter instead.

\n
\n

For more information, see Custom vocabularies.

", + "smithy.api#documentation": "

Specify the names of the custom vocabularies that you want to use when processing your\n transcription. Note that vocabulary names are case sensitive.

\n

If none of the languages of the specified custom vocabularies match the language identified in \n your media, your job fails.

\n \n

This parameter is only intended for use with the\n IdentifyLanguage parameter. If you're not\n including IdentifyLanguage in your request and want to use a custom vocabulary\n with your transcription, use the VocabularyName parameter instead.

\n
\n

For more information, see Custom vocabularies.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-names" } }, "VocabularyFilterNames": { "target": "com.amazonaws.transcribestreaming#VocabularyFilterNames", "traits": { - "smithy.api#documentation": "

Specify the names of the custom vocabulary filters that you want to use when processing\n your transcription. Note that vocabulary filter names are case sensitive.

\n

If none of the languages of the specified custom vocabulary filters match the language identified\n in your media, your job fails.

\n \n

This parameter is only intended for use with \n the IdentifyLanguage parameter. If you're not \n including IdentifyLanguage in your request and want to use a custom vocabulary filter \n with your transcription, use the VocabularyFilterName parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", + "smithy.api#documentation": "

Specify the names of the custom vocabulary filters that you want to use when processing\n your transcription. Note that vocabulary filter names are case sensitive.

\n

If none of the languages of the specified custom vocabulary filters match the language identified\n in your media, your job fails.

\n \n

This parameter is only intended for use with \n the IdentifyLanguage parameter. If you're not \n including IdentifyLanguage in your request and want to use a custom vocabulary filter \n with your transcription, use the VocabularyFilterName parameter instead.

\n
\n

For more information, see Using vocabulary filtering with unwanted \n words.

", "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-names" } } + }, + "traits": { + "smithy.api#input": {} } }, "com.amazonaws.transcribestreaming#StartStreamTranscriptionResponse": { @@ -2220,6 +2235,9 @@ "smithy.api#httpHeader": "x-amzn-transcribe-vocabulary-filter-names" } } + }, + "traits": { + "smithy.api#output": {} } }, "com.amazonaws.transcribestreaming#String": { @@ -2291,7 +2309,7 @@ "h2" ] }, - "smithy.api#documentation": "

Amazon Transcribe streaming offers three main types of real-time transcription: \n Standard, Medical, and \n Call Analytics.

\n
    \n
  • \n

    \n Standard transcriptions are the most common option. Refer\n to for details.

    \n
  • \n
  • \n

    \n Medical transcriptions are tailored to medical professionals \n and incorporate medical terms. A common use case for this service is transcribing doctor-patient \n dialogue in real time, so doctors can focus on their patient instead of taking notes. Refer to\n for details.

    \n
  • \n
  • \n

    \n Call Analytics transcriptions are designed for use with call\n center audio on two different channels; if you're looking for insight into customer service calls, use this \n option. Refer to for details.

    \n
  • \n
", + "smithy.api#documentation": "

Amazon Transcribe streaming offers three main types of real-time transcription: \n Standard, Medical, and \n Call Analytics.

\n
    \n
  • \n

    \n Standard transcriptions are the most common option. Refer\n to for details.

    \n
  • \n
  • \n

    \n Medical transcriptions are tailored to medical professionals \n and incorporate medical terms. A common use case for this service is transcribing doctor-patient \n dialogue in real time, so doctors can focus on their patient instead of taking notes. Refer to\n for details.

    \n
  • \n
  • \n

    \n Call Analytics transcriptions are designed for use with call\n center audio on two different channels; if you're looking for insight into customer service calls, use this \n option. Refer to for details.

    \n
  • \n
", "smithy.api#title": "Amazon Transcribe Streaming Service", "smithy.rules#endpointRuleSet": { "version": "1.0", @@ -2335,7 +2353,6 @@ ] } ], - "type": "tree", "rules": [ { "conditions": [ @@ -2353,293 +2370,258 @@ "type": "error" }, { - "conditions": [], - "type": "tree", - "rules": [ + "conditions": [ { - "conditions": [ + "fn": "booleanEquals", + "argv": [ { - "fn": "booleanEquals", - "argv": [ - { - "ref": "UseDualStack" - }, - true - ] - } - ], - "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", - "type": "error" - }, - { - "conditions": [], - "endpoint": { - "url": { - "ref": "Endpoint" + "ref": "UseDualStack" }, - "properties": {}, - "headers": {} - }, - "type": "endpoint" + true + ] } - ] + ], + "error": "Invalid Configuration: Dualstack and custom endpoint are not supported", + "type": "error" + }, + { + "conditions": [], + "endpoint": { + "url": { + "ref": "Endpoint" + }, + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, { - "conditions": [], - "type": "tree", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], "rules": [ { "conditions": [ { - "fn": "isSet", + "fn": "aws.partition", "argv": [ { "ref": "Region" } - ] + ], + "assign": "PartitionResult" } ], - "type": "tree", "rules": [ { "conditions": [ { - "fn": "aws.partition", + "fn": "booleanEquals", "argv": [ { - "ref": "Region" - } - ], - "assign": "PartitionResult" + "ref": "UseFIPS" + }, + true + ] + }, + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] } ], - "type": "tree", "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseFIPS" - }, - true + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] + } ] }, { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - }, - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, + } + ], + "rules": [ { "conditions": [], - "error": "FIPS and DualStack are enabled, but this partition does not support one or both", - "type": "error" + "endpoint": { + "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dualStackDnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS and DualStack are enabled, but this partition does not support one or both", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseFIPS" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { - "ref": "UseFIPS" + "fn": "getAttr", + "argv": [ + { + "ref": "PartitionResult" + }, + "supportsFIPS" + ] }, true ] } ], - "type": "tree", "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", - "argv": [ - true, - { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsFIPS" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } - ] - } - ] - }, { "conditions": [], - "error": "FIPS is enabled but this partition does not support FIPS", - "type": "error" + "endpoint": { + "url": "https://transcribestreaming-fips.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] + ], + "type": "tree" }, + { + "conditions": [], + "error": "FIPS is enabled but this partition does not support FIPS", + "type": "error" + } + ], + "type": "tree" + }, + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "ref": "UseDualStack" + }, + true + ] + } + ], + "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ + true, { - "ref": "UseDualStack" - }, - true - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [ - { - "fn": "booleanEquals", + "fn": "getAttr", "argv": [ - true, { - "fn": "getAttr", - "argv": [ - { - "ref": "PartitionResult" - }, - "supportsDualStack" - ] - } - ] - } - ], - "type": "tree", - "rules": [ - { - "conditions": [], - "type": "tree", - "rules": [ - { - "conditions": [], - "endpoint": { - "url": "https://transcribestreaming.{Region}.{PartitionResult#dualStackDnsSuffix}", - "properties": {}, - "headers": {} - }, - "type": "endpoint" - } + "ref": "PartitionResult" + }, + "supportsDualStack" ] } ] - }, - { - "conditions": [], - "error": "DualStack is enabled but this partition does not support DualStack", - "type": "error" } - ] - }, - { - "conditions": [], - "type": "tree", + ], "rules": [ { "conditions": [], "endpoint": { - "url": "https://transcribestreaming.{Region}.{PartitionResult#dnsSuffix}", + "url": "https://transcribestreaming.{Region}.{PartitionResult#dualStackDnsSuffix}", "properties": {}, "headers": {} }, "type": "endpoint" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "DualStack is enabled but this partition does not support DualStack", + "type": "error" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "endpoint": { + "url": "https://transcribestreaming.{Region}.{PartitionResult#dnsSuffix}", + "properties": {}, + "headers": {} + }, + "type": "endpoint" } - ] - }, - { - "conditions": [], - "error": "Invalid Configuration: Missing Region", - "type": "error" + ], + "type": "tree" } - ] + ], + "type": "tree" + }, + { + "conditions": [], + "error": "Invalid Configuration: Missing Region", + "type": "error" } ] }, diff --git a/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock b/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock new file mode 100644 index 00000000000..d606888f0d6 --- /dev/null +++ b/aws/sdk/benchmarks/previous-release-comparison/Cargo.lock @@ -0,0 +1,2687 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "assert-json-diff" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4259cbe96513d2f1073027a259fc2ca917feb3026a5a8d984e3628e490255cc0" +dependencies = [ + "extend", + "serde", + "serde_json", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "aws-config" +version = "1.0.1" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-sdk-sso", + "aws-sdk-ssooidc", + "aws-sdk-sts", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", + "bytes", + "fastrand", + "hex", + "http", + "hyper", + "ring", + "time", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "1.0.1" +dependencies = [ + "aws-smithy-async 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "zeroize", +] + +[[package]] +name = "aws-credential-types" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1317e1a3514b103cf7d5828bbab3b4d30f56bd22d684f8568bc51b6cfbbb1c" +dependencies = [ + "aws-smithy-async 1.0.2", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "zeroize", +] + +[[package]] +name = "aws-http" +version = "0.60.0" +dependencies = [ + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", + "bytes", + "http", + "http-body", + "pin-project-lite", + "tracing", +] + +[[package]] +name = "aws-http" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361c4310fdce94328cc2d1ca0c8a48c13f43009c61d3367585685a50ca8c66b6" +dependencies = [ + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "aws-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "http", + "http-body", + "pin-project-lite", + "tracing", +] + +[[package]] +name = "aws-runtime" +version = "1.0.1" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-sigv4 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-eventstream 0.60.0", + "aws-smithy-http 0.60.0", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", + "fastrand", + "http", + "percent-encoding", + "tracing", + "uuid", +] + +[[package]] +name = "aws-runtime" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ed7ef604a15fd0d4d9e43701295161ea6b504b63c44990ead352afea2bc15e9" +dependencies = [ + "aws-credential-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-sigv4 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-eventstream 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "aws-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fastrand", + "http", + "percent-encoding", + "tracing", + "uuid", +] + +[[package]] +name = "aws-sdk-s3" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-sigv4 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-checksums 0.60.0", + "aws-smithy-eventstream 0.60.0", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-smithy-xml 0.60.0", + "aws-types 1.0.1", + "bytes", + "http", + "http-body", + "once_cell", + "percent-encoding", + "regex-lite", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-s3" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dcafc2fe52cc30b2d56685e2fa6a879ba50d79704594852112337a472ddbd24" +dependencies = [ + "aws-credential-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-runtime 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-sigv4 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-checksums 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-eventstream 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-json 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime 1.0.2", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "aws-smithy-xml 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "http", + "http-body", + "once_cell", + "percent-encoding", + "regex", + "tracing", + "url", +] + +[[package]] +name = "aws-sdk-sso" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", + "bytes", + "http", + "once_cell", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-ssooidc" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-types 1.0.1", + "bytes", + "http", + "once_cell", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-sts" +version = "0.0.0-local" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-http 0.60.0", + "aws-runtime 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-json 0.60.0", + "aws-smithy-query", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "aws-smithy-xml 0.60.0", + "aws-types 1.0.1", + "http", + "once_cell", + "regex-lite", + "tracing", +] + +[[package]] +name = "aws-sigv4" +version = "1.0.1" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-smithy-eventstream 0.60.0", + "aws-smithy-http 0.60.0", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "bytes", + "crypto-bigint 0.5.5", + "form_urlencoded", + "hex", + "hmac", + "http", + "once_cell", + "p256", + "percent-encoding", + "ring", + "sha2", + "subtle", + "time", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-sigv4" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380adcc8134ad8bbdfeb2ace7626a869914ee266322965276cbc54066186d236" +dependencies = [ + "aws-credential-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-eventstream 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "bytes", + "crypto-bigint 0.5.5", + "form_urlencoded", + "hex", + "hmac", + "http", + "once_cell", + "p256", + "percent-encoding", + "regex", + "ring", + "sha2", + "subtle", + "time", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-async" +version = "1.0.1" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "aws-smithy-async" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e37ca17d25fe1e210b6d4bdf59b81caebfe99f986201a1228cb5061233b4b13" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.60.0" +dependencies = [ + "aws-smithy-http 0.60.0", + "aws-smithy-types 1.0.1", + "bytes", + "crc32c", + "crc32fast", + "hex", + "http", + "http-body", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a373ec01aede3dd066ec018c1bc4e8f5dd11b2c11c59c8eef1a5c68101f397" +dependencies = [ + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-types 1.0.2", + "bytes", + "crc32c", + "crc32fast", + "hex", + "http", + "http-body", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.60.0" +dependencies = [ + "aws-smithy-types 1.0.1", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c669e1e5fc0d79561bf7a122b118bd50c898758354fe2c53eb8f2d31507cbc3" +dependencies = [ + "aws-smithy-types 1.0.2", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-http" +version = "0.60.0" +dependencies = [ + "aws-smithy-eventstream 0.60.0", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "once_cell", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-http" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b1de8aee22f67de467b2e3d0dd0fb30859dc53f579a63bd5381766b987db644" +dependencies = [ + "aws-smithy-eventstream 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "once_cell", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.60.0" +dependencies = [ + "aws-smithy-types 1.0.1", +] + +[[package]] +name = "aws-smithy-json" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a46dd338dc9576d6a6a5b5a19bd678dcad018ececee11cf28ecd7588bd1a55c" +dependencies = [ + "aws-smithy-types 1.0.2", +] + +[[package]] +name = "aws-smithy-protocol-test" +version = "0.60.0" +dependencies = [ + "assert-json-diff", + "aws-smithy-runtime-api 1.0.1", + "http", + "pretty_assertions", + "regex-lite", + "roxmltree", + "serde_json", + "thiserror", +] + +[[package]] +name = "aws-smithy-protocol-test" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ad76ca454230a5540a47e44ba903a910ae09f2c39a86cd249f2f8c87da83eb" +dependencies = [ + "assert-json-diff", + "aws-smithy-runtime-api 1.0.2", + "http", + "pretty_assertions", + "regex", + "roxmltree", + "serde_json", + "thiserror", +] + +[[package]] +name = "aws-smithy-query" +version = "0.60.0" +dependencies = [ + "aws-smithy-types 1.0.1", + "urlencoding", +] + +[[package]] +name = "aws-smithy-runtime" +version = "1.0.1" +dependencies = [ + "aws-smithy-async 1.0.1", + "aws-smithy-http 0.60.0", + "aws-smithy-protocol-test 0.60.0", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "bytes", + "fastrand", + "http", + "http-body", + "hyper", + "hyper-rustls", + "once_cell", + "pin-project-lite", + "pin-utils", + "rustls", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "aws-smithy-runtime" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "273479291efc55e7b0bce985b139d86b6031adb8e50f65c1f712f20ba38f6388" +dependencies = [ + "aws-smithy-async 1.0.2", + "aws-smithy-http 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-protocol-test 0.60.0 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "bytes", + "fastrand", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "once_cell", + "pin-project-lite", + "pin-utils", + "rustls", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "1.0.1" +dependencies = [ + "aws-smithy-async 1.0.1", + "aws-smithy-types 1.0.1", + "bytes", + "http", + "pin-project-lite", + "tokio", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6cebff0d977b6b6feed2fd07db52aac58ba3ccaf26cdd49f1af4add5061bef9" +dependencies = [ + "aws-smithy-async 1.0.2", + "aws-smithy-types 1.0.2", + "bytes", + "http", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-types" +version = "1.0.1" +dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "itoa", + "num-integer", + "pin-project-lite", + "pin-utils", + "ryu", + "serde", + "time", + "tokio", + "tokio-util", +] + +[[package]] +name = "aws-smithy-types" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7f48b3f27ddb40ab19892a5abda331f403e3cb877965e4e51171447807104af" +dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "itoa", + "num-integer", + "pin-project-lite", + "pin-utils", + "ryu", + "serde", + "time", + "tokio", + "tokio-util", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.60.0" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec40d74a67fd395bc3f6b4ccbdf1543672622d905ef3f979689aea5b730cb95" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-types" +version = "1.0.1" +dependencies = [ + "aws-credential-types 1.0.1", + "aws-smithy-async 1.0.1", + "aws-smithy-runtime-api 1.0.1", + "aws-smithy-types 1.0.1", + "http", + "rustc_version", + "tracing", +] + +[[package]] +name = "aws-types" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8403fc56b1f3761e8efe45771ddc1165e47ec3417c68e68a4519b5cb030159ca" +dependencies = [ + "aws-credential-types 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aws-smithy-async 1.0.2", + "aws-smithy-runtime-api 1.0.2", + "aws-smithy-types 1.0.2", + "http", + "rustc_version", + "tracing", +] + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "bytes-utils" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" +dependencies = [ + "bytes", + "either", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "const-oid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "cpufeatures" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32c" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "futures", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "tokio", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct", + "crypto-bigint 0.4.9", + "der", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "extend" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47da3a72ec598d9c8937a7ebca8962a5c7a1f28444e38c2b33c771ba3f55f05" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "is-terminal" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "linux-raw-sys" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "outref" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "p256" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" +dependencies = [ + "ecdsa", + "elliptic-curve", + "sha2", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "pretty_assertions" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +dependencies = [ + "diff", + "yansi", +] + +[[package]] +name = "previous-release-comparison" +version = "0.1.0" +dependencies = [ + "aws-config", + "aws-credential-types 1.0.1", + "aws-sdk-s3 0.0.0-local", + "aws-sdk-s3 1.4.0", + "aws-smithy-runtime 1.0.1", + "aws-smithy-runtime 1.0.2", + "criterion", + "http", + "tokio", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-lite" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + +[[package]] +name = "ring" +version = "0.17.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684d5e6e18f669ccebf64a92236bb7db9a34f07be010e3627368182027180866" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.48.0", +] + +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls" +version = "0.21.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.5.5", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "nu-ansi-term", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml b/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml new file mode 100644 index 00000000000..b8edbb891f2 --- /dev/null +++ b/aws/sdk/benchmarks/previous-release-comparison/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "previous-release-comparison" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } +aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } +aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } +criterion = { version = "0.5", features = ["async_tokio"] } +http = "0.2.3" +previous-s3 = { version = "1", package = "aws-sdk-s3", features = ["test-util"] } +previous-runtime = { version = "1", package = "aws-smithy-runtime", features = ["test-util"] } +tokio = { version = "1.23.1", features = ["macros", "test-util", "rt-multi-thread"] } + +[profile.release] +debug = 1 + +[[bench]] +name = "previous_release_comparison" +harness = false diff --git a/aws/sdk/benchmarks/previous-release-comparison/benches/README.md b/aws/sdk/benchmarks/previous-release-comparison/benches/README.md new file mode 100644 index 00000000000..8dd8c49e5a9 --- /dev/null +++ b/aws/sdk/benchmarks/previous-release-comparison/benches/README.md @@ -0,0 +1,6 @@ +### Middleware vs. Orchestrator Benchmark + +To run the benchmark: +```bash +./gradlew :aws:sdk:assemble && (cd aws/sdk/benchmarks/previous-release-comparison && cargo bench) +``` diff --git a/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs b/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs new file mode 100644 index 00000000000..d0e6c338507 --- /dev/null +++ b/aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs @@ -0,0 +1,101 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#[macro_use] +extern crate criterion; +use criterion::{BenchmarkId, Criterion}; + +macro_rules! test_client { + (previous) => { + test_client!(@internal previous_runtime) + }; + (main) => { + test_client!(@internal aws_smithy_runtime) + }; + (@internal $runtime_crate:ident) => { + $runtime_crate::client::http::test_util::infallible_client_fn(|req| { + assert_eq!( + "https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~", + req.uri().to_string() + ); + http::Response::builder() + .status(200) + .body( + r#" + + test-bucket + prefix~ + 1 + 1000 + false + + some-file.file + 2009-10-12T17:50:30.000Z + 434234 + STANDARD + + + "#, + ) + .unwrap() + }) + }; +} + +macro_rules! test { + (previous, $client:ident) => { + test!(@internal, $client) + }; + (main, $client:ident) => { + test!(@internal, $client) + }; + (@internal, $client:ident) => { + $client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .send() + .await + .expect("successful execution") + }; +} + +fn bench(c: &mut Criterion) { + let main_client = { + let http_client = test_client!(main); + let config = aws_sdk_s3::Config::builder() + .behavior_version(aws_sdk_s3::config::BehaviorVersion::latest()) + .credentials_provider(aws_sdk_s3::config::Credentials::for_tests()) + .region(aws_sdk_s3::config::Region::new("us-east-1")) + .http_client(http_client) + .build(); + aws_sdk_s3::Client::from_conf(config) + }; + let previous_client = { + let http_client = test_client!(previous); + let config = previous_s3::Config::builder() + .behavior_version(previous_s3::config::BehaviorVersion::latest()) + .credentials_provider(previous_s3::config::Credentials::for_tests()) + .region(previous_s3::config::Region::new("us-east-1")) + .http_client(http_client) + .build(); + previous_s3::Client::from_conf(config) + }; + + let mut group = c.benchmark_group("compare"); + let param = "S3 ListObjectsV2"; + group.bench_with_input(BenchmarkId::new("previous", param), param, |b, _| { + b.to_async(tokio::runtime::Runtime::new().unwrap()) + .iter(|| async { test!(previous, previous_client) }) + }); + group.bench_with_input(BenchmarkId::new("main", param), param, |b, _| { + b.to_async(tokio::runtime::Runtime::new().unwrap()) + .iter(|| async { test!(main, main_client) }) + }); + group.finish(); +} + +criterion_group!(benches, bench); +criterion_main!(benches); diff --git a/aws/sdk/s3-benchmark/README.md b/aws/sdk/benchmarks/s3-throughput/README.md similarity index 100% rename from aws/sdk/s3-benchmark/README.md rename to aws/sdk/benchmarks/s3-throughput/README.md diff --git a/aws/sdk/s3-benchmark/benchmark/Cargo.lock b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock similarity index 81% rename from aws/sdk/s3-benchmark/benchmark/Cargo.lock rename to aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock index d53f4b830a4..4479f622048 100644 --- a/aws/sdk/s3-benchmark/benchmark/Cargo.lock +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.lock @@ -3,19 +3,45 @@ version = 3 [[package]] -name = "aho-corasick" +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" dependencies = [ "memchr", ] [[package]] name = "anstyle" -version = "1.0.0" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" + +[[package]] +name = "async-trait" +version = "0.1.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "autocfg" @@ -384,11 +410,26 @@ dependencies = [ "tracing", ] +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "base64-simd" @@ -404,11 +445,15 @@ dependencies = [ name = "benchmark" version = "0.1.0" dependencies = [ + "async-trait", "aws-config", "aws-sdk-s3", + "aws-smithy-client", "aws-smithy-http", "clap", + "hyper", "tokio", + "tracing", "tracing-subscriber", ] @@ -451,9 +496,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -463,31 +511,29 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.3.2" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.1" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" dependencies = [ "anstyle", - "bitflags", "clap_lex", ] [[package]] name = "clap_derive" -version = "4.3.2" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" dependencies = [ "heck", "proc-macro2", @@ -497,9 +543,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" [[package]] name = "core-foundation" @@ -519,18 +565,18 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] [[package]] name = "crc32c" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfea2db42e9927a3845fb268a10a72faed6d416065f77873f05e411457c363e" +checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" dependencies = [ "rustc_version", ] @@ -554,6 +600,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "deranged" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" + [[package]] name = "digest" version = "0.10.7" @@ -567,9 +619,9 @@ dependencies = [ [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "fastrand" @@ -644,11 +696,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + [[package]] name = "h2" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -677,12 +735,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -729,15 +784,15 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -750,7 +805,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -803,15 +858,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.63" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -824,9 +879,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.145" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "lock_api" @@ -840,9 +895,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "matchers" @@ -850,7 +905,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -864,9 +919,18 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] [[package]] name = "mio" @@ -876,7 +940,7 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -901,23 +965,32 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -973,18 +1046,18 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", @@ -993,9 +1066,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1005,18 +1078,18 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "proc-macro2" -version = "1.0.59" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.28" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1032,13 +1105,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.2", + "regex-automata 0.3.8", + "regex-syntax 0.7.5", ] [[package]] @@ -1050,6 +1124,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -1058,9 +1143,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "ring" @@ -1077,6 +1162,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1088,9 +1179,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" dependencies = [ "log", "ring", @@ -1100,9 +1191,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", "rustls-pemfile", @@ -1112,33 +1203,33 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ "base64", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" @@ -1152,9 +1243,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags", "core-foundation", @@ -1165,9 +1256,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -1175,15 +1266,29 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.188" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "sha1" @@ -1198,9 +1303,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -1227,18 +1332,18 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" @@ -1250,6 +1355,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "spin" version = "0.5.2" @@ -1264,9 +1379,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.18" +version = "2.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" dependencies = [ "proc-macro2", "quote", @@ -1285,10 +1400,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" +checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" dependencies = [ + "deranged", "serde", "time-core", "time-macros", @@ -1302,9 +1418,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" dependencies = [ "time-core", ] @@ -1326,11 +1442,11 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -1338,9 +1454,9 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.3", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -1433,9 +1549,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", @@ -1501,9 +1617,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1522,9 +1638,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -1533,9 +1649,9 @@ dependencies = [ [[package]] name = "urlencoding" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "valuable" @@ -1557,11 +1673,10 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1573,9 +1688,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1583,9 +1698,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", @@ -1598,9 +1713,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1608,9 +1723,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", @@ -1621,15 +1736,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.63" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1637,9 +1752,9 @@ dependencies = [ [[package]] name = "webpki" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e" dependencies = [ "ring", "untrusted", @@ -1667,21 +1782,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -1693,102 +1793,60 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "xmlparser" diff --git a/aws/sdk/s3-benchmark/benchmark/Cargo.toml b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml similarity index 70% rename from aws/sdk/s3-benchmark/benchmark/Cargo.toml rename to aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml index 2fe087c0c20..eeee431cec4 100644 --- a/aws/sdk/s3-benchmark/benchmark/Cargo.toml +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml @@ -5,13 +5,17 @@ authors = ["AWS Rust SDK Team ", "John DiSanti Self::Setup; + async fn do_get( + &self, + state: Self::Setup, + target_path: &Path, + args: &Args, + ) -> Result; + async fn do_bench( + &self, + state: Self::Setup, + args: &Args, + expected_path: &Path, + ) -> Result { + let target_path = expected_path.with_extension("downloaded"); + let downloaded_path = self.do_get(state, &target_path, args).await?; + Ok(GetTestResult { + expected: expected_path.to_path_buf(), + actual: downloaded_path, + }) + } + + async fn verify( + &self, + _client: &Client, + _args: &Args, + result: GetTestResult, + ) -> Result<(), BoxError> { + verify::diff(&result.actual, &result.expected).await + } +} diff --git a/aws/sdk/s3-benchmark/benchmark/src/latencies.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/latencies.rs similarity index 98% rename from aws/sdk/s3-benchmark/benchmark/src/latencies.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/latencies.rs index 8ff3879b41e..50b54a273d8 100644 --- a/aws/sdk/s3-benchmark/benchmark/src/latencies.rs +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/src/latencies.rs @@ -6,7 +6,7 @@ use std::fmt; use std::time; -const ONE_GIGABYTE: u64 = 1024 * 1024 * 1024; +const ONE_GIGABYTE: u64 = 1000 * 1000 * 1000; #[derive(Debug)] pub struct Latencies { diff --git a/aws/sdk/s3-benchmark/benchmark/src/main.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/main.rs similarity index 52% rename from aws/sdk/s3-benchmark/benchmark/src/main.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/main.rs index 91a6214a7ba..ad9e6aefb1e 100644 --- a/aws/sdk/s3-benchmark/benchmark/src/main.rs +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/src/main.rs @@ -4,9 +4,11 @@ */ use crate::latencies::Latencies; -use crate::multipart_get::get_object_multipart; -use crate::multipart_put::put_object_multipart; +use crate::multipart_put::{put_object_multipart, PutObjectMultipart}; +use async_trait::async_trait; +use aws_config::SdkConfig; use aws_sdk_s3 as s3; +use aws_sdk_s3::Client; use clap::Parser as _; use s3::error::DisplayErrorContext; use s3::primitives::ByteStream; @@ -14,16 +16,24 @@ use std::error::Error as StdError; use std::path::Path; use std::path::PathBuf; use std::process; +use std::process::{Command, Stdio}; use std::time; +mod get_test; mod latencies; mod multipart_get; mod multipart_put; +mod put_test; +mod verify; pub type BoxError = Box; pub const BENCH_KEY: &str = "s3_bench_file"; +use crate::get_test::GetBenchmark; +use crate::put_test::PutBenchmark; +use tracing::Instrument; + #[derive(Copy, Clone, Debug, clap::ValueEnum)] pub enum Fs { #[cfg(target_os = "linux")] @@ -41,7 +51,7 @@ pub enum Bench { GetObjectMultipart, } -#[derive(Debug, clap::Parser)] +#[derive(Debug, Clone, clap::Parser)] #[command()] pub struct Args { /// Which benchmark to run. @@ -79,6 +89,9 @@ pub struct Args { /// Number of concurrent uploads/downloads to perform. #[arg(long, default_value_t = 4)] concurrency: usize, + + #[arg(long, default_value_t = 1000)] + part_upload_timeout_millis: u64, } #[tokio::main] @@ -94,13 +107,12 @@ async fn main() { } loader.load().await }; - let client = s3::Client::new(&config); let result = match args.bench { - Bench::PutObject => benchmark_put_object(&client, &args).await, - Bench::GetObject => benchmark_get_object(&client, &args).await, - Bench::PutObjectMultipart => benchmark_put_object_multipart(&client, &args).await, - Bench::GetObjectMultipart => benchmark_get_object_multipart(&client, &args).await, + Bench::PutObject => benchmark_put_object(&config, &args).await, + Bench::GetObject => benchmark_get_object(&config, &args).await, + Bench::PutObjectMultipart => benchmark_put_object_multipart(&config, &args).await, + Bench::GetObjectMultipart => benchmark_get_object_multipart(&config, &args).await, }; match result { Ok(latencies) => { @@ -117,15 +129,31 @@ async fn main() { } macro_rules! benchmark { - ($client:ident, $args:ident, setup => $setup:expr, operation => $operation:expr) => {{ + ($sdk_config:ident, $args:ident, setup => $setup:expr, operation => $operation:expr) => {{ + #[allow(unused)] + use crate::get_test::GetBenchmark; + #[allow(unused)] + use crate::put_test::PutBenchmark; + println!("setting up..."); let test_file_path = generate_test_file($args)?; - $setup($client, $args, &test_file_path).await?; + let setup_client = aws_sdk_s3::Client::new(&$sdk_config); + $setup(&setup_client, $args, &test_file_path).await?; + println!("setup complete"); let mut latencies = Latencies::new($args.size_bytes); for i in 0..$args.iterations { + let span = tracing::info_span!("run operation"); + let bench = $operation; + let client = bench.prepare($sdk_config).await; let start = time::Instant::now(); - $operation($client, $args, &test_file_path).await?; + let result = bench + .do_bench(client, $args, &test_file_path) + .instrument(span) + .await?; let latency = start.elapsed(); + if let Err(e) = bench.verify(&setup_client, $args, result).await { + println!("benchmark did not finish correctly: {}", e); + } latencies.push(latency); println!( "finished iteration {i} in {} seconds", @@ -137,38 +165,79 @@ macro_rules! benchmark { }}; } -async fn benchmark_put_object(client: &s3::Client, args: &Args) -> Result { - benchmark!(client, args, setup => no_setup, operation => put_object) +async fn benchmark_put_object(conf: &SdkConfig, args: &Args) -> Result { + struct PutObject; + #[async_trait] + impl PutBenchmark for PutObject { + type Setup = Client; + + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup { + Client::new(conf) + } + + async fn do_put( + &self, + state: Self::Setup, + target_key: &str, + local_file: &Path, + args: &Args, + ) -> Result<(), BoxError> { + state + .put_object() + .bucket(&args.bucket) + .key(target_key) + .body(ByteStream::from_path(local_file).await?) + .send() + .await?; + Ok(()) + } + } + benchmark!(conf, args, setup => no_setup, operation => PutObject) } -async fn benchmark_get_object(client: &s3::Client, args: &Args) -> Result { - async fn operation(client: &s3::Client, args: &Args, path: &Path) -> Result<(), BoxError> { - let output = client - .get_object() - .bucket(&args.bucket) - .key(BENCH_KEY) - .send() - .await?; - let mut body = output.body.into_async_read(); - let mut file = tokio::fs::File::create(path).await?; - tokio::io::copy(&mut body, &mut file).await?; - Ok(()) +async fn benchmark_get_object(client: &SdkConfig, args: &Args) -> Result { + struct GetObject; + #[async_trait] + impl GetBenchmark for GetObject { + type Setup = Client; + + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup { + Client::new(&conf) + } + + async fn do_get( + &self, + state: Self::Setup, + target_path: &Path, + args: &Args, + ) -> Result { + let output = state + .get_object() + .bucket(&args.bucket) + .key(BENCH_KEY) + .send() + .await?; + let mut body = output.body.into_async_read(); + let mut file = tokio::fs::File::create(target_path).await?; + tokio::io::copy(&mut body, &mut file).await?; + Ok(target_path.to_path_buf()) + } } - benchmark!(client, args, setup => put_object_intelligent, operation => operation) + benchmark!(client, args, setup => put_object_intelligent, operation => GetObject) } async fn benchmark_put_object_multipart( - client: &s3::Client, + conf: &SdkConfig, args: &Args, ) -> Result { - benchmark!(client, args, setup => no_setup, operation => put_object_multipart) + benchmark!(conf, args, setup => no_setup, operation => PutObjectMultipart) } async fn benchmark_get_object_multipart( - client: &s3::Client, + config: &SdkConfig, args: &Args, ) -> Result { - benchmark!(client, args, setup => put_object_intelligent, operation => get_object_multipart) + benchmark!(config, args, setup => put_object_intelligent, operation => multipart_get::GetObjectMultipart::new()) } fn generate_test_file(args: &Args) -> Result { @@ -183,11 +252,27 @@ fn generate_test_file(args: &Args) -> Result { } }; - process::Command::new("truncate") - .arg("-s") + let mut yes_process = Command::new("yes") + .arg("01234567890abcdefghijklmnopqrstuvwxyz") + .stdout(Stdio::piped()) + .spawn()?; + + let mut head_process = Command::new("head") + .arg("-c") .arg(format!("{}", args.size_bytes)) - .arg(&path) - .output()?; + .stdin(yes_process.stdout.take().unwrap()) + .stdout(Stdio::piped()) + .spawn()?; + + let mut file = std::fs::File::create(&path)?; + head_process.stdout.as_mut().unwrap(); + std::io::copy(&mut head_process.stdout.take().unwrap(), &mut file)?; + + let exit_status = head_process.wait()?; + + if !exit_status.success() { + Err("failed to generate temp file")? + } Ok(path) } @@ -202,7 +287,7 @@ async fn put_object_intelligent( path: &Path, ) -> Result<(), BoxError> { if args.size_bytes > args.part_size_bytes { - put_object_multipart(client, args, path).await + put_object_multipart(&[client.clone()], args, BENCH_KEY, path).await } else { put_object(client, args, path).await } diff --git a/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs new file mode 100644 index 00000000000..10e209776e0 --- /dev/null +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs @@ -0,0 +1,183 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::{Args, BoxError, BENCH_KEY}; +use async_trait::async_trait; +use aws_config::SdkConfig; +use aws_sdk_s3 as s3; +use aws_sdk_s3::Client; +use aws_smithy_types::byte_stream::AggregatedBytes; +use std::fmt; +use std::fs::File; +use std::os::unix::fs::FileExt; +use std::path::{Path, PathBuf}; +use std::sync::Arc; +use std::time::{Duration, SystemTime}; + +use crate::get_test::GetBenchmark; +use tokio::sync::Semaphore; +use tokio::task::spawn_blocking; +use tokio::time::timeout; +use tracing::{info_span, Instrument}; + +pub(crate) struct GetObjectMultipart {} +impl GetObjectMultipart { + pub(crate) fn new() -> Self { + Self {} + } +} + +#[async_trait] +impl GetBenchmark for GetObjectMultipart { + type Setup = Vec; + + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup { + let clients = (0..32).map(|_| Client::new(&conf)).collect::>(); + for client in &clients { + let _ = client.list_buckets().send().await; + } + clients + } + + async fn do_get( + &self, + state: Self::Setup, + target_path: &Path, + args: &Args, + ) -> Result { + get_object_multipart(&state, args, target_path, &args.bucket, BENCH_KEY).await?; + Ok(target_path.to_path_buf()) + } +} + +pub async fn get_object_multipart( + clients: &[s3::Client], + args: &Args, + target_path: &Path, + bucket: &str, + key: &str, +) -> Result<(), BoxError> { + let mut part_count = (args.size_bytes / args.part_size_bytes + 1) as u64; + let mut size_of_last_part = (args.size_bytes % args.part_size_bytes) as u64; + if size_of_last_part == 0 { + size_of_last_part = args.part_size_bytes as u64; + part_count -= 1; + } + + let ranges = (0..part_count).map(|i| { + if i == part_count - 1 { + let start = i * args.part_size_bytes as u64; + ContentRange::new(start, start + size_of_last_part - 1) + } else { + ContentRange::new( + i * args.part_size_bytes as u64, + (i + 1) * args.part_size_bytes as u64 - 1, + ) + } + }); + + let semaphore = Arc::new(Semaphore::new(args.concurrency)); + let mut tasks = Vec::new(); + let file = Arc::new(File::create(target_path)?); + for (id, range) in ranges.enumerate() { + let semaphore = semaphore.clone(); + let client = clients[id % clients.len()].clone(); + let file = file.clone(); + let bucket = bucket.to_string(); + let key = key.to_string(); + tasks.push(tokio::spawn( + async move { + let _permit = semaphore.acquire_owned().await?; + + let start = SystemTime::now(); + tracing::debug!(range = ?range); + + let body = + download_part_retry_on_timeout(id, &range, &client, &bucket, &key).await?; + tracing::debug!(id =? id, load_duration = ?start.elapsed().unwrap()); + let mut offset = range.start; + let write_duration = SystemTime::now(); + spawn_blocking(move || { + for part in body.into_segments() { + file.write_all_at(&part, offset)?; + offset += part.len() as u64; + } + Ok::<_, BoxError>(()) + }) + .await??; + tracing::debug!(id =? id, write_duration = ?write_duration.elapsed().unwrap()); + Result::<_, BoxError>::Ok(()) + } + .instrument(info_span!("run-collect-part", id = id)), + )); + } + for task in tasks { + task.await??; + } + + Ok(()) +} + +async fn download_part_retry_on_timeout( + id: usize, + range: &ContentRange, + client: &Client, + bucket: &str, + key: &str, +) -> Result { + loop { + match timeout( + Duration::from_millis(1000), + download_part(id, range, client, bucket, key), + ) + .await + { + Ok(result) => return result, + Err(_) => tracing::warn!("get part timeout"), + } + } +} + +async fn download_part( + id: usize, + range: &ContentRange, + client: &Client, + bucket: &str, + key: &str, +) -> Result { + let part = client + .get_object() + .bucket(bucket) + .key(key) + .range(range.to_string()) + .send() + .instrument(info_span!("get_object", id = id)) + .await?; + + let body = part + .body + .collect() + .instrument(info_span!("collect-body", id = id)) + .await?; + Ok(body) +} + +#[derive(Debug)] +struct ContentRange { + start: u64, + end: u64, +} + +impl ContentRange { + fn new(start: u64, end: u64) -> Self { + Self { start, end } + } +} + +impl fmt::Display for ContentRange { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "bytes={}-{}", self.start, self.end) + } +} diff --git a/aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs similarity index 50% rename from aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs rename to aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs index 4c8213b0c67..d5bc8c8a974 100644 --- a/aws/sdk/s3-benchmark/benchmark/src/multipart_put.rs +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs @@ -3,26 +3,60 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::put_test::PutBenchmark; use crate::{Args, BoxError, BENCH_KEY}; +use async_trait::async_trait; +use aws_config::SdkConfig; use aws_sdk_s3 as s3; -use aws_smithy_http::byte_stream::ByteStream; -use aws_smithy_http::byte_stream::Length; +use aws_sdk_s3::Client; +use aws_smithy_types::byte_stream::ByteStream; use s3::types::CompletedMultipartUpload; use s3::types::CompletedPart; +use std::io::SeekFrom; use std::path::Path; use std::path::PathBuf; use std::sync::Arc; -use tokio::sync::Semaphore; +use std::time::{Duration, SystemTime}; +use tokio::fs::File; +use tokio::io::{AsyncReadExt, AsyncSeekExt}; +use tokio::sync::{OwnedSemaphorePermit, Semaphore}; +use tokio::time::timeout; + +pub(crate) struct PutObjectMultipart; + +#[async_trait] +impl PutBenchmark for PutObjectMultipart { + type Setup = Vec; + + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup { + let clients = (0..32).map(|_| Client::new(&conf)).collect::>(); + for client in &clients { + let _ = client.list_buckets().send().await; + } + clients + } + + async fn do_put( + &self, + state: Self::Setup, + target_key: &str, + local_file: &Path, + args: &Args, + ) -> Result<(), BoxError> { + put_object_multipart(&state, args, target_key, local_file).await + } +} pub async fn put_object_multipart( - client: &s3::Client, + client: &[s3::Client], args: &Args, + target_key: &str, path: &Path, ) -> Result<(), BoxError> { - let upload_id = client + let upload_id = client[0] .create_multipart_upload() .bucket(&args.bucket) - .key(BENCH_KEY) + .key(target_key) .send() .await? .upload_id @@ -44,15 +78,17 @@ pub async fn put_object_multipart( } else { args.part_size_bytes }; - tasks.push(tokio::spawn(upload_part( - semaphore.clone(), - client.clone(), + let permit = semaphore.clone().acquire_owned().await?; + tasks.push(tokio::spawn(upload_part_retry_on_timeout( + permit, + client[part as usize % client.len()].clone(), args.bucket.clone(), upload_id.clone(), path.to_path_buf(), offset, length, part, + Duration::from_millis(args.part_upload_timeout_millis), ))); } let mut parts = Vec::new(); @@ -60,7 +96,7 @@ pub async fn put_object_multipart( parts.push(task.await??); } - client + client[0] .complete_multipart_upload() .bucket(&args.bucket) .key(BENCH_KEY) @@ -76,9 +112,8 @@ pub async fn put_object_multipart( Ok(()) } -#[allow(clippy::too_many_arguments)] -async fn upload_part( - semaphore: Arc, +async fn upload_part_retry_on_timeout( + permit: OwnedSemaphorePermit, client: s3::Client, bucket: String, upload_id: String, @@ -86,15 +121,40 @@ async fn upload_part( offset: u64, length: u64, part: u64, + timeout_dur: Duration, ) -> Result { - let _permit = semaphore.acquire().await?; + loop { + match timeout( + timeout_dur, + upload_part(&client, &bucket, &upload_id, &path, offset, length, part), + ) + .await + { + Ok(res) => { + drop(permit); + return res; + } + Err(_) => tracing::warn!(id = ?part, "timeout!"), + } + } +} - let stream = ByteStream::read_from() - .path(path) - .offset(offset) - .length(Length::Exact(length)) - .build() - .await?; +#[allow(clippy::too_many_arguments)] +async fn upload_part( + client: &s3::Client, + bucket: &str, + upload_id: &str, + path: &Path, + offset: u64, + length: u64, + part: u64, +) -> Result { + let start = SystemTime::now(); + let mut file = File::open(path).await?; + file.seek(SeekFrom::Start(offset)).await?; + let mut buf = vec![0; length as usize]; + file.read_exact(&mut buf).await?; + let stream = ByteStream::from(buf); let part_output = client .upload_part() .key(BENCH_KEY) @@ -104,6 +164,7 @@ async fn upload_part( .part_number(part as i32 + 1) // S3 takes a 1-based index .send() .await?; + tracing::debug!(part = ?part, upload_duration = ?start.elapsed().unwrap(), "upload-part"); Ok(CompletedPart::builder() .part_number(part as i32 + 1) .e_tag(part_output.e_tag.expect("must have an e-tag")) diff --git a/aws/sdk/benchmarks/s3-throughput/benchmark/src/put_test.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/put_test.rs new file mode 100644 index 00000000000..606778a2160 --- /dev/null +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/src/put_test.rs @@ -0,0 +1,63 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::multipart_get::get_object_multipart; +use crate::{verify, Args, BoxError, BENCH_KEY}; +use async_trait::async_trait; +use aws_config::SdkConfig; +use aws_sdk_s3::Client; +use std::env::temp_dir; +use std::path::{Path, PathBuf}; + +pub(crate) struct PutTestResult { + local_file: PathBuf, + bucket: String, + key: String, +} + +#[async_trait] +pub(crate) trait PutBenchmark { + type Setup: Send; + async fn prepare(&self, conf: &SdkConfig) -> Self::Setup; + async fn do_put( + &self, + state: Self::Setup, + target_key: &str, + local_file: &Path, + args: &Args, + ) -> Result<(), BoxError>; + async fn do_bench( + &self, + state: Self::Setup, + args: &Args, + file: &Path, + ) -> Result { + self.do_put(state, BENCH_KEY, file, args).await?; + Ok(PutTestResult { + local_file: file.to_path_buf(), + bucket: args.bucket.clone(), + key: BENCH_KEY.to_string(), + }) + } + + async fn verify( + &self, + client: &Client, + args: &Args, + result: PutTestResult, + ) -> Result<(), BoxError> { + let dir = temp_dir(); + let downloaded_path = dir.join("downloaded_file"); + get_object_multipart( + &[client.clone()][..], + args, + &downloaded_path, + &result.bucket, + &result.key, + ) + .await?; + verify::diff(&result.local_file, &downloaded_path).await + } +} diff --git a/aws/sdk/benchmarks/s3-throughput/benchmark/src/verify.rs b/aws/sdk/benchmarks/s3-throughput/benchmark/src/verify.rs new file mode 100644 index 00000000000..6b6c50904f3 --- /dev/null +++ b/aws/sdk/benchmarks/s3-throughput/benchmark/src/verify.rs @@ -0,0 +1,28 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::BoxError; +use std::path::Path; +use std::time::SystemTime; +use tokio::process::Command; + +pub(crate) async fn diff(a: &Path, b: &Path) -> Result<(), BoxError> { + let start_diff = SystemTime::now(); + let diff_ok = Command::new("diff") + .arg(a) + .arg(b) + .arg("-q") + .spawn() + .unwrap() + .wait() + .await + .unwrap(); + tracing::info!(diff_duration = ?start_diff.elapsed().unwrap()); + if !diff_ok.success() { + Err("files differ")? + } else { + Ok(()) + } +} diff --git a/aws/sdk/s3-benchmark/infrastructure/.eslintrc.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/.eslintrc.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/.eslintrc.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/.eslintrc.json diff --git a/aws/sdk/s3-benchmark/infrastructure/.gitignore b/aws/sdk/benchmarks/s3-throughput/infrastructure/.gitignore similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/.gitignore rename to aws/sdk/benchmarks/s3-throughput/infrastructure/.gitignore diff --git a/aws/sdk/s3-benchmark/infrastructure/.npmignore b/aws/sdk/benchmarks/s3-throughput/infrastructure/.npmignore similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/.npmignore rename to aws/sdk/benchmarks/s3-throughput/infrastructure/.npmignore diff --git a/aws/sdk/s3-benchmark/infrastructure/.prettierrc b/aws/sdk/benchmarks/s3-throughput/infrastructure/.prettierrc similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/.prettierrc rename to aws/sdk/benchmarks/s3-throughput/infrastructure/.prettierrc diff --git a/aws/sdk/s3-benchmark/infrastructure/assets/init_instance.sh b/aws/sdk/benchmarks/s3-throughput/infrastructure/assets/init_instance.sh similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/assets/init_instance.sh rename to aws/sdk/benchmarks/s3-throughput/infrastructure/assets/init_instance.sh diff --git a/aws/sdk/s3-benchmark/infrastructure/assets/run_benchmark.sh b/aws/sdk/benchmarks/s3-throughput/infrastructure/assets/run_benchmark.sh similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/assets/run_benchmark.sh rename to aws/sdk/benchmarks/s3-throughput/infrastructure/assets/run_benchmark.sh diff --git a/aws/sdk/s3-benchmark/infrastructure/bin/infrastructure.ts b/aws/sdk/benchmarks/s3-throughput/infrastructure/bin/infrastructure.ts similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/bin/infrastructure.ts rename to aws/sdk/benchmarks/s3-throughput/infrastructure/bin/infrastructure.ts diff --git a/aws/sdk/s3-benchmark/infrastructure/cdk.context.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.context.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/cdk.context.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.context.json diff --git a/aws/sdk/s3-benchmark/infrastructure/cdk.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/cdk.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.json diff --git a/aws/sdk/s3-benchmark/infrastructure/lib/infrastructure-stack.ts b/aws/sdk/benchmarks/s3-throughput/infrastructure/lib/infrastructure-stack.ts similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/lib/infrastructure-stack.ts rename to aws/sdk/benchmarks/s3-throughput/infrastructure/lib/infrastructure-stack.ts diff --git a/aws/sdk/s3-benchmark/infrastructure/package-lock.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/package-lock.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/package-lock.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/package-lock.json diff --git a/aws/sdk/s3-benchmark/infrastructure/package.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/package.json similarity index 82% rename from aws/sdk/s3-benchmark/infrastructure/package.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/package.json index 46e0b34ee2e..daa61e77cc5 100644 --- a/aws/sdk/s3-benchmark/infrastructure/package.json +++ b/aws/sdk/benchmarks/s3-throughput/infrastructure/package.json @@ -12,14 +12,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/awslabs/smithy-rs.git" + "url": "git+https://github.com/smithy-lang/smithy-rs.git" }, "author": "AWS Rust SDK Team", "license": "Apache-2.0", "bugs": { - "url": "https://github.com/awslabs/smithy-rs/issues" + "url": "https://github.com/smithy-lang/smithy-rs/issues" }, - "homepage": "https://github.com/awslabs/smithy-rs#readme", + "homepage": "https://github.com/smithy-lang/smithy-rs#readme", "publish": false, "devDependencies": { "@types/node": "20.1.7", diff --git a/aws/sdk/s3-benchmark/infrastructure/tsconfig.json b/aws/sdk/benchmarks/s3-throughput/infrastructure/tsconfig.json similarity index 100% rename from aws/sdk/s3-benchmark/infrastructure/tsconfig.json rename to aws/sdk/benchmarks/s3-throughput/infrastructure/tsconfig.json diff --git a/aws/sdk/build.gradle.kts b/aws/sdk/build.gradle.kts index d5225d66a9d..e4eee8fd524 100644 --- a/aws/sdk/build.gradle.kts +++ b/aws/sdk/build.gradle.kts @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -import aws.sdk.AwsExamplesLayout import aws.sdk.AwsServices import aws.sdk.Membership import aws.sdk.discoverServices @@ -20,7 +19,7 @@ plugins { } configure { - smithyBuildConfigs = files(buildDir.resolve("smithy-build.json")) + smithyBuildConfigs = files(layout.buildDirectory.file("smithy-build.json")) allowUnknownTraits = true } @@ -31,9 +30,9 @@ val properties = PropertyRetriever(rootProject, project) val crateHasherToolPath = rootProject.projectDir.resolve("tools/ci-build/crate-hasher") val publisherToolPath = rootProject.projectDir.resolve("tools/ci-build/publisher") val sdkVersionerToolPath = rootProject.projectDir.resolve("tools/ci-build/sdk-versioner") -val outputDir = buildDir.resolve("aws-sdk") -val sdkOutputDir = outputDir.resolve("sdk") -val examplesOutputDir = outputDir.resolve("examples") +val outputDir = layout.buildDirectory.dir("aws-sdk").get() +val sdkOutputDir = outputDir.dir("sdk") +val examplesOutputDir = outputDir.dir("examples") buildscript { val smithyVersion: String by project @@ -61,7 +60,7 @@ val crateVersioner by lazy { aws.sdk.CrateVersioner.defaultFor(rootProject, prop fun getRustMSRV(): String = properties.get("rust.msrv") ?: throw Exception("Rust MSRV missing") fun getPreviousReleaseVersionManifestPath(): String? = properties.get("aws.sdk.previous.release.versions.manifest") -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "middleware" +fun getNullabilityCheckMode(): String = properties.get("nullability.check.mode") ?: "CLIENT_CAREFUL" fun loadServiceMembership(): Membership { val membershipOverride = properties.get("aws.services")?.let { parseMembership(it) } @@ -77,8 +76,8 @@ fun eventStreamAllowList(): Set { } fun generateSmithyBuild(services: AwsServices): String { - val awsConfigVersion = properties.get("smithy.rs.runtime.crate.version") - ?: throw IllegalStateException("missing smithy.rs.runtime.crate.version for aws-config version") + val awsConfigVersion = properties.get(CrateSet.STABLE_VERSION_PROP_NAME) + ?: throw IllegalStateException("missing ${CrateSet.STABLE_VERSION_PROP_NAME} for aws-config version") val debugMode = properties.get("debugMode").toBoolean() val serviceProjections = services.services.map { service -> val files = service.modelFiles().map { extraFile -> @@ -101,10 +100,12 @@ fun generateSmithyBuild(services: AwsServices): String { }, "codegen": { "includeFluentClient": false, + "includeEndpointUrlConfig": false, "renameErrors": false, "debugMode": $debugMode, "eventStreamAllowList": [$eventStreamAllowListMembers], - "enableNewSmithyRuntime": "${getSmithyRuntimeMode()}" + "enableUserConfigurableRuntimePlugins": false, + "nullabilityCheckMode": "${getNullabilityCheckMode()}" }, "service": "${service.service}", "module": "$moduleName", @@ -143,10 +144,10 @@ tasks.register("generateSmithyBuild") { inputs.property("servicelist", awsServices.services.toString()) inputs.property("eventStreamAllowList", eventStreamAllowList) inputs.dir(projectDir.resolve("aws-models")) - outputs.file(buildDir.resolve("smithy-build.json")) + outputs.file(layout.buildDirectory.file("smithy-build.json")) doFirst { - buildDir.resolve("smithy-build.json").writeText(generateSmithyBuild(awsServices)) + layout.buildDirectory.file("smithy-build.json").get().asFile.writeText(generateSmithyBuild(awsServices)) } outputs.upToDateWhen { false } } @@ -155,7 +156,7 @@ tasks.register("generateIndexMd") { dependsOn("smithyBuildJar") inputs.property("servicelist", awsServices.services.toString()) - val indexMd = outputDir.resolve("index.md") + val indexMd = outputDir.file("index.md").asFile outputs.file(indexMd) doLast { project.docsLandingPage(awsServices, indexMd) @@ -170,22 +171,22 @@ tasks.register("relocateServices") { awsServices.services.forEach { logger.info("Relocating ${it.module}...") copy { - from("$buildDir/smithyprojections/sdk/${it.module}/rust-client-codegen") - into(sdkOutputDir.resolve(it.module)) + from(layout.buildDirectory.dir("smithyprojections/sdk/${it.module}/rust-client-codegen")) + into(sdkOutputDir.dir(it.module)) } copy { from(projectDir.resolve("integration-tests/${it.module}/tests")) - into(sdkOutputDir.resolve(it.module).resolve("tests")) + into(sdkOutputDir.dir(it.module).dir("tests")) } copy { from(projectDir.resolve("integration-tests/${it.module}/benches")) - into(sdkOutputDir.resolve(it.module).resolve("benches")) + into(sdkOutputDir.dir(it.module).dir("benches")) } } } - inputs.dir("$buildDir/smithyprojections/sdk/") + inputs.dir(layout.buildDirectory.dir("smithyprojections/sdk")) outputs.dir(sdkOutputDir) } @@ -225,7 +226,7 @@ tasks.register("relocateTests") { awsServices.rootTests.forEach { test -> include(test.path.toRelativeString(testDir) + "/**") } - into(outputDir.resolve("tests")) + into(outputDir.dir("tests")) exclude("**/target") filter { line -> line.replace("build/aws-sdk/sdk/", "sdk/") } } @@ -244,22 +245,12 @@ tasks.register("fixExampleManifests") { toolPath = sdkVersionerToolPath binaryName = "sdk-versioner" - arguments = when (AwsExamplesLayout.detect(project)) { - AwsExamplesLayout.Flat -> listOf( - "use-path-and-version-dependencies", - "--isolate-crates", - "--sdk-path", "../../sdk", - "--versions-toml", outputDir.resolve("versions.toml").absolutePath, - outputDir.resolve("examples").absolutePath, - ) - AwsExamplesLayout.Workspaces -> listOf( - "use-path-and-version-dependencies", - "--isolate-crates", - "--sdk-path", sdkOutputDir.absolutePath, - "--versions-toml", outputDir.resolve("versions.toml").absolutePath, - outputDir.resolve("examples").absolutePath, - ) - } + arguments = listOf( + "use-path-and-version-dependencies", + "--sdk-path", sdkOutputDir.asFile.absolutePath, + "--versions-toml", outputDir.file("versions.toml").asFile.absolutePath, + outputDir.dir("examples").asFile.absolutePath, + ) outputs.dir(outputDir) dependsOn("relocateExamples", "generateVersionManifest") @@ -279,10 +270,10 @@ fun rewritePathDependency(line: String): String { tasks.register("copyAllRuntimes") { dependsOn("smithyBuildJar") from("$rootDir/aws/rust-runtime") { - CrateSet.AWS_SDK_RUNTIME.forEach { include("$it/**") } + CrateSet.AWS_SDK_RUNTIME.forEach { include("${it.name}/**") } } from("$rootDir/rust-runtime") { - CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { include("$it/**") } + CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { include("${it.name}/**") } } exclude("**/target") exclude("**/Cargo.lock") @@ -294,9 +285,9 @@ tasks.register("relocateAwsRuntime") { dependsOn("copyAllRuntimes") doLast { // Patch the Cargo.toml files - CrateSet.AWS_SDK_RUNTIME.forEach { moduleName -> - patchFile(sdkOutputDir.resolve("$moduleName/Cargo.toml")) { line -> - rewriteRuntimeCrateVersion(properties, line.let(::rewritePathDependency)) + CrateSet.AWS_SDK_RUNTIME.forEach { module -> + patchFile(sdkOutputDir.file("${module.name}/Cargo.toml").asFile) { line -> + rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line.let(::rewritePathDependency)) } } } @@ -305,9 +296,9 @@ tasks.register("relocateRuntime") { dependsOn("copyAllRuntimes") doLast { // Patch the Cargo.toml files - CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { moduleName -> - patchFile(sdkOutputDir.resolve("$moduleName/Cargo.toml")) { line -> - rewriteRuntimeCrateVersion(properties, line) + CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { module -> + patchFile(sdkOutputDir.file("${module.name}/Cargo.toml").asFile) { line -> + rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line) } } } @@ -334,8 +325,9 @@ fun generateCargoWorkspace(services: AwsServices): String { tasks.register("generateCargoWorkspace") { description = "generate Cargo.toml workspace file" doFirst { - outputDir.mkdirs() - outputDir.resolve("Cargo.toml").writeText(generateCargoWorkspace(awsServices)) + outputDir.asFile.mkdirs() + outputDir.file("Cargo.toml").asFile.writeText(generateCargoWorkspace(awsServices)) + rootProject.rootDir.resolve("clippy-root.toml").copyTo(outputDir.file("clippy.toml").asFile, overwrite = true) } inputs.property("servicelist", awsServices.moduleNames.toString()) if (awsServices.examples.isNotEmpty()) { @@ -344,7 +336,8 @@ tasks.register("generateCargoWorkspace") { for (test in awsServices.rootTests) { inputs.dir(test.path) } - outputs.file(outputDir.resolve("Cargo.toml")) + outputs.file(outputDir.file("Cargo.toml")) + outputs.file(outputDir.file("clippy.toml")) outputs.upToDateWhen { false } } @@ -361,7 +354,7 @@ tasks.register("fixManifests") { toolPath = publisherToolPath binaryName = "publisher" - arguments = mutableListOf("fix-manifests", "--location", outputDir.absolutePath).apply { + arguments = mutableListOf("fix-manifests", "--location", outputDir.asFile.absolutePath).apply { if (crateVersioner.independentVersioningEnabled()) { add("--disable-version-number-validation") } @@ -374,16 +367,16 @@ tasks.register("hydrateReadme") { inputs.dir(publisherToolPath) inputs.file(rootProject.projectDir.resolve("aws/SDK_README.md.hb")) - outputs.file(outputDir.resolve("README.md").absolutePath) + outputs.file(outputDir.file("README.md").asFile.absolutePath) toolPath = publisherToolPath binaryName = "publisher" arguments = listOf( "hydrate-readme", - "--versions-manifest", outputDir.resolve("versions.toml").toString(), + "--versions-manifest", outputDir.file("versions.toml").toString(), "--msrv", getRustMSRV(), "--input", rootProject.projectDir.resolve("aws/SDK_README.md.hb").toString(), - "--output", outputDir.resolve("README.md").absolutePath, + "--output", outputDir.file("README.md").asFile.absolutePath, ) } @@ -405,15 +398,15 @@ tasks.register("generateVersionManifest") { arguments = mutableListOf( "generate-version-manifest", "--input-location", - sdkOutputDir.absolutePath, + sdkOutputDir.asFile.absolutePath, "--output-location", - outputDir.absolutePath, + outputDir.asFile.absolutePath, "--smithy-build", - buildDir.resolve("smithy-build.json").normalize().absolutePath, + layout.buildDirectory.file("smithy-build.json").get().asFile.normalize().absolutePath, "--examples-revision", properties.get("aws.sdk.examples.revision") ?: "missing", ).apply { - val previousReleaseManifestPath = getPreviousReleaseVersionManifestPath()?.let { manifestPath -> + getPreviousReleaseVersionManifestPath()?.let { manifestPath -> add("--previous-release-versions") add(manifestPath) } @@ -421,7 +414,7 @@ tasks.register("generateVersionManifest") { } tasks["smithyBuildJar"].apply { - inputs.file(buildDir.resolve("smithy-build.json")) + inputs.file(layout.buildDirectory.file("smithy-build.json")) inputs.dir(projectDir.resolve("aws-models")) dependsOn("generateSmithyBuild") dependsOn("generateCargoWorkspace") @@ -446,16 +439,21 @@ tasks["assemble"].apply { outputs.upToDateWhen { false } } -project.registerCargoCommandsTasks(outputDir, defaultRustDocFlags) -project.registerGenerateCargoConfigTomlTask(outputDir) +project.registerCargoCommandsTasks(outputDir.asFile, defaultRustDocFlags) +project.registerGenerateCargoConfigTomlTask(outputDir.asFile) tasks["test"].dependsOn("assemble") tasks["test"].finalizedBy(Cargo.CLIPPY.toString, Cargo.TEST.toString, Cargo.DOCS.toString) tasks.register("deleteSdk") { - delete = setOf(outputDir) + delete( + fileTree(outputDir) { + // Delete files but keep directories so that terminals don't get messed up in local development + include("**/*.*") + }, + ) } tasks["clean"].dependsOn("deleteSdk") tasks["clean"].doFirst { - delete(buildDir.resolve("smithy-build.json")) + delete(layout.buildDirectory.file("smithy-build.json")) } diff --git a/aws/sdk/gradle.properties b/aws/sdk/gradle.properties index 3bd30286069..42754f181dd 100644 --- a/aws/sdk/gradle.properties +++ b/aws/sdk/gradle.properties @@ -8,4 +8,5 @@ aws.services= # List of services to generate Event Stream operations for: aws.services.eventstream.allowlist=\ aws-sdk-transcribestreaming,\ - aws-sdk-s3 + aws-sdk-s3,\ + aws-sdk-bedrockruntime diff --git a/aws/sdk/integration-tests/Cargo.toml b/aws/sdk/integration-tests/Cargo.toml index 284bc1bcb1c..f18a4438398 100644 --- a/aws/sdk/integration-tests/Cargo.toml +++ b/aws/sdk/integration-tests/Cargo.toml @@ -14,7 +14,7 @@ members = [ "s3", "s3control", "sts", - "transcribestreaming", "timestreamquery", + "transcribestreaming", "webassembly", ] diff --git a/aws/sdk/integration-tests/Makefile b/aws/sdk/integration-tests/Makefile new file mode 100644 index 00000000000..6a4673485b8 --- /dev/null +++ b/aws/sdk/integration-tests/Makefile @@ -0,0 +1,6 @@ +all: test + +test: + ./test.sh + +.PHONY: all test diff --git a/aws/sdk/integration-tests/dynamodb/Cargo.toml b/aws/sdk/integration-tests/dynamodb/Cargo.toml index 3cd3a98b492..3283676a42c 100644 --- a/aws/sdk/integration-tests/dynamodb/Cargo.toml +++ b/aws/sdk/integration-tests/dynamodb/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["AWS Rust SDK Team ", "Russell Cohen "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -15,9 +15,8 @@ approx = "0.5.1" aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-dynamodb = { path = "../../build/aws-sdk/sdk/dynamodb" } -aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-sdk-dynamodb = { path = "../../build/aws-sdk/sdk/dynamodb", features = ["behavior-version-latest"] } +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"]} @@ -25,7 +24,7 @@ aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-ap aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types", features = ["test-util"]} aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1.0.0" -criterion = { version = "0.4.0" } +criterion = { version = "0.5.0" } futures-util = { version = "0.3.16", default-features = false } http = "0.2.0" serde_json = "1.0.0" diff --git a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs index a29f74d72ff..1928a49ecb5 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs @@ -3,16 +3,18 @@ * SPDX-License-Identifier: Apache-2.0 */ +use aws_sdk_dynamodb::operation::query::QueryOutput; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; +use aws_smithy_runtime_api::client::ser_de::{DeserializeResponse, SharedResponseDeserializer}; +use aws_smithy_types::body::SdkBody; use criterion::{criterion_group, criterion_main, Criterion}; fn do_bench() { - #[cfg(not(aws_sdk_orchestrator_mode))] - { - use aws_sdk_dynamodb::operation::query::Query; - use aws_smithy_http::response::ParseHttpResponse; - use bytes::Bytes; + use aws_sdk_dynamodb::operation::query::Query; + use bytes::Bytes; - let response = http::Response::builder() + let response = HttpResponse::try_from(http::Response::builder() .header("server", "Server") .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") .header("content-type", "application/x-amz-json-1.0") @@ -21,13 +23,20 @@ fn do_bench() { .header("x-amzn-requestid", "A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG") .header("x-amz-crc32", "624725176") .status(http::StatusCode::from_u16(200).unwrap()) - .body(Bytes::copy_from_slice(br#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#)) - .unwrap(); + .body(SdkBody::from(Bytes::copy_from_slice(br#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#))) + .unwrap()).unwrap(); - let parser = Query::new(); - let output = ::parse_loaded(&parser, &response).unwrap(); - assert_eq!(2, output.count); - } + let operation = Query::new(); + let config = operation.config().expect("operation should have config"); + let deserializer = config + .load::() + .expect("operation should set a deserializer"); + + let output = deserializer + .deserialize_nonstreaming(&response) + .expect("success"); + let output = output.downcast::().expect("correct type"); + assert_eq!(2, output.count); } fn bench_group(c: &mut Criterion) { diff --git a/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs b/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs index 909ed85a515..bd510b4aa55 100644 --- a/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs +++ b/aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs @@ -3,9 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_sdk_dynamodb::operation::put_item::PutItemInput; +use aws_sdk_dynamodb::operation::put_item::{PutItem, PutItemInput}; use aws_sdk_dynamodb::types::AttributeValue; -use aws_sdk_dynamodb::Config; +use aws_smithy_runtime_api::client::interceptors::context::Input; +use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; +use aws_smithy_runtime_api::client::ser_de::{SerializeRequest, SharedRequestSerializer}; +use aws_smithy_types::config_bag::ConfigBag; use criterion::{criterion_group, criterion_main, Criterion}; macro_rules! attr_s { @@ -33,25 +36,24 @@ macro_rules! attr_obj { }; } -fn do_bench(_config: &Config, _input: &PutItemInput) { - #[cfg(not(aws_sdk_orchestrator_mode))] - { - use futures_util::FutureExt; +fn do_bench(input: &PutItemInput) { + let operation = PutItem::new(); + let config = operation.config().expect("operation should have config"); + let serializer = config + .load::() + .expect("operation should set a serializer"); + let mut config_bag = ConfigBag::base(); + let input = Input::erase(input.clone()); - let operation = _input - .make_operation(&_config) - .now_or_never() - .unwrap() - .expect("operation failed to build"); - let (http_request, _parts) = operation.into_request_response().0.into_parts(); - let body = http_request.body().bytes().unwrap(); - assert_eq!(body[0], b'{'); - } + let request = serializer + .serialize_input(input, &mut config_bag) + .expect("success"); + let body = request.body().bytes().unwrap(); + assert_eq!(body[0], b'{'); } fn bench_group(c: &mut Criterion) { c.bench_function("serialization_bench", |b| { - let config = Config::builder().build(); let input = PutItemInput::builder() .table_name("Movies-5") .set_item(Some( @@ -73,7 +75,7 @@ fn bench_group(c: &mut Criterion) { )) .build() .expect("valid input"); - b.iter(|| do_bench(&config, &input)) + b.iter(|| do_bench(&input)) }); } diff --git a/aws/sdk/integration-tests/dynamodb/tests/auth_scheme_error.rs b/aws/sdk/integration-tests/dynamodb/tests/auth_scheme_error.rs new file mode 100644 index 00000000000..702a3fd933d --- /dev/null +++ b/aws/sdk/integration-tests/dynamodb/tests/auth_scheme_error.rs @@ -0,0 +1,32 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_dynamodb::config::Region; +use aws_sdk_dynamodb::error::DisplayErrorContext; +use aws_sdk_dynamodb::{Client, Config}; +use aws_smithy_runtime::assert_str_contains; +use aws_smithy_runtime::client::http::test_util::capture_request; + +#[tokio::test] +async fn auth_scheme_error() { + let (http_client, _) = capture_request(None); + let config = Config::builder() + .behavior_version_latest() + .http_client(http_client) + .region(Region::new("us-west-2")) + // intentionally omitting credentials_provider + .build(); + let client = Client::from_conf(config); + + let err = client + .list_tables() + .send() + .await + .expect_err("there is no credential provider, so this must fail"); + assert_str_contains!( + DisplayErrorContext(&err).to_string(), + "\"sigv4\" wasn't a valid option because there was no identity resolver for it. Be sure to set an identity" + ); +} diff --git a/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs b/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs new file mode 100644 index 00000000000..00fc07e7162 --- /dev/null +++ b/aws/sdk/integration-tests/dynamodb/tests/build-errors.rs @@ -0,0 +1,41 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_dynamodb::error::SdkError; +use aws_sdk_dynamodb::operation::create_table::CreateTableError; +use aws_sdk_dynamodb::types::{KeySchemaElement, KeyType}; +use aws_sdk_dynamodb::Client; + +#[allow(dead_code)] +async fn create_table_test(client: &Client) -> Result<(), SdkError> { + let _just_checking_compilation = client + .create_table() + .table_name("test") + .key_schema( + KeySchemaElement::builder() + .attribute_name("year") + .key_type(KeyType::Hash) + .build()?, + ) + .send() + .await; + Ok(()) +} + +#[allow(dead_code)] +async fn create_table_test_super_error(client: &Client) -> Result<(), aws_sdk_dynamodb::Error> { + let _just_checking_compilation = client + .create_table() + .table_name("test") + .key_schema( + KeySchemaElement::builder() + .attribute_name("year") + .key_type(KeyType::Hash) + .build()?, + ) + .send() + .await; + Ok(()) +} diff --git a/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs b/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs index 25d65bb94ca..e430d60d437 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/endpoints.rs @@ -4,6 +4,7 @@ */ use aws_sdk_dynamodb::config::{self, Credentials, Region}; +use aws_smithy_runtime::client::http::test_util::capture_request; use aws_types::SdkConfig; use http::Uri; @@ -12,11 +13,14 @@ async fn expect_uri( uri: &'static str, customize: fn(config::Builder) -> config::Builder, ) { - let (conn, request) = aws_smithy_client::test_connection::capture_request(None); + let (http_client, request) = capture_request(None); let conf = customize( aws_sdk_dynamodb::config::Builder::from(&conf) .credentials_provider(Credentials::for_tests()) - .http_connector(conn), + .stalled_stream_protection( + aws_sdk_dynamodb::config::StalledStreamProtectionConfig::disabled(), + ) + .http_client(http_client), ) .build(); let svc = aws_sdk_dynamodb::Client::from_conf(conf); diff --git a/aws/sdk/integration-tests/dynamodb/tests/movies.rs b/aws/sdk/integration-tests/dynamodb/tests/movies.rs index a3eaa244ad8..6254dd6ece4 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/movies.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/movies.rs @@ -4,8 +4,9 @@ */ use aws_sdk_dynamodb as dynamodb; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_http::body::SdkBody; +use aws_smithy_async::assert_elapsed; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; use dynamodb::config::{Credentials, Region}; use dynamodb::operation::query::QueryOutput; use dynamodb::types::{ @@ -13,12 +14,11 @@ use dynamodb::types::{ ScalarAttributeType, TableStatus, }; use dynamodb::Client; -use http::header::{HeaderName, AUTHORIZATION}; +use http::header::AUTHORIZATION; use http::Uri; use serde_json::Value; use std::collections::HashMap; use std::time::Duration; -use tokio::time::Instant; async fn create_table(client: &Client, table_name: &str) { client @@ -28,31 +28,36 @@ async fn create_table(client: &Client, table_name: &str) { KeySchemaElement::builder() .attribute_name("year") .key_type(KeyType::Hash) - .build(), + .build() + .unwrap(), ) .key_schema( KeySchemaElement::builder() .attribute_name("title") .key_type(KeyType::Range) - .build(), + .build() + .unwrap(), ) .attribute_definitions( AttributeDefinition::builder() .attribute_name("year") .attribute_type(ScalarAttributeType::N) - .build(), + .build() + .unwrap(), ) .attribute_definitions( AttributeDefinition::builder() .attribute_name("title") .attribute_type(ScalarAttributeType::S) - .build(), + .build() + .unwrap(), ) .provisioned_throughput( ProvisionedThroughput::builder() .read_capacity_units(10) .write_capacity_units(10) - .build(), + .build() + .unwrap(), ) .send() .await @@ -123,17 +128,6 @@ async fn wait_for_ready_table(client: &Client, table_name: &str) { } } -/// Validate that time has passed with a 5ms tolerance -/// -/// This is to account for some non-determinism in the Tokio timer -fn assert_time_passed(initial: Instant, passed: Duration) { - let now = tokio::time::Instant::now(); - let delta = now - initial; - if (delta.as_millis() as i128 - passed.as_millis() as i128).abs() > 5 { - assert_eq!(delta, passed) - } -} - /// A partial reimplementation of https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/GettingStarted.Ruby.html /// in Rust /// @@ -146,10 +140,10 @@ async fn movies_it() { let table_name = "Movies-5"; // The waiter will retry 5 times tokio::time::pause(); - let conn = movies_it_test_connection(); // RecordingConnection::https(); + let http_client = movies_it_test_connection(); // RecordingConnection::https(); let conf = dynamodb::Config::builder() .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(Credentials::for_tests()) .build(); let client = Client::from_conf(conf); @@ -159,7 +153,11 @@ async fn movies_it() { let waiter_start = tokio::time::Instant::now(); wait_for_ready_table(&client, table_name).await; - assert_time_passed(waiter_start, Duration::from_secs(4)); + assert_elapsed!( + waiter_start, + Duration::from_secs(4), + Duration::from_millis(10) + ); // data.json contains 2 movies from 2013 let data = match serde_json::from_str(include_str!("data.json")).expect("should be valid JSON") { @@ -189,192 +187,193 @@ async fn movies_it() { ] ); - conn.assert_requests_match(&[AUTHORIZATION, HeaderName::from_static("x-amz-date")]); + http_client.assert_requests_match(&[AUTHORIZATION.as_str(), "x-amz-date"]); } /// Test connection for the movies IT /// headers are signed with actual creds, at some point we could replace them with verifiable test /// credentials, but there are plenty of other tests that target signing -fn movies_it_test_connection() -> TestConnection<&'static str> { - TestConnection::new(vec![( - http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.CreateTable") - .header("content-length", "313") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=4a832eba37651836b524b587986be607607b077ad133c57b4bf7300d2e02f476") - .header("x-amz-date", "20210308T155118Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"AttributeDefinitions":[{"AttributeName":"year","AttributeType":"N"},{"AttributeName":"title","AttributeType":"S"}],"TableName":"Movies-5","KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"ReadCapacityUnits":10,"WriteCapacityUnits":10}}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:18 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "572") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "RCII0AALE00UALC7LJ9AD600B7VV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "3715137447") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"TableDescription":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=01b0129a2a4fb3af14559fde8163d59de9c43907152a12479002b3a7c75fa0df") - .header("x-amz-date", "20210308T155119Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:18 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "561") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "O1C6QKCG8GT7D2K922T4QRL9N3VV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "46742265") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=7f3a743bb460f26296640ae775d282f0153eda750855ec00ace1815becfd2de5") - .header("x-amz-date", "20210308T155120Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")).body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:20 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "561") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "EN5N26BO1FAOEMUUSD7B7SUPPVVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "46742265") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=46a148c560139bc0da171bd915ea8c0b96a7012629f5db7b6bf70fcd1a66fd24") - .header("x-amz-date", "20210308T155121Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:21 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "561") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "PHCMGEVI6JLN9JNMKSSA3M76H3VV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "46742265") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=15bb7c9b2350747d62349091b3ea59d9e1800d1dca04029943329259bba85cb4") - .header("x-amz-date", "20210308T155122Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:22 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "561") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "1Q22O983HD3511TN6Q5RRTP0MFVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "46742265") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.DescribeTable") - .header("content-length", "24") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=6d0a78087bc112c68a91b4b2d457efd8c09149b85b8f998f8c4b3f9916c8a743") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "559") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "ONJBNV2A9GBNUT34KH73JLL23BVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "24113616") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"ACTIVE"}}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.PutItem") - .header("content-length", "619") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=85fc7d2064a0e6d9c38d64751d39d311ad415ae4079ef21ef254b23ecf093519") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5","Item":{"info":{"M":{"rating":{"N":"6.2"},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"release_date":{"S":"2013-01-18T00:00:00Z"},"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"running_time_secs":{"N":"5215"},"rank":{"N":"11"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]}}},"title":{"S":"Turn It Down, Or Else!"},"year":{"N":"2013"}}}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "2") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "E6TGS5HKHHV08HSQA31IO1IDMFVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "2745614147") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.PutItem") - .header("content-length", "636") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=e4b1658c9f5129b3656381f6592a30e0061b1566263fbf27d982817ea79483f6") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r#"{"TableName":"Movies-5","Item":{"info":{"M":{"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"rating":{"N":"8.3"},"rank":{"N":"2"},"release_date":{"S":"2013-09-02T00:00:00Z"},"directors":{"L":[{"S":"Ron Howard"}]},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"running_time_secs":{"N":"7380"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]}}},"title":{"S":"Rush"},"year":{"N":"2013"}}}"#)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "2") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "B63D54LP2FOGQK9JE5KLJT49HJVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "2745614147") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.Query") - .header("content-length", "156") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=c9a0fdd0c7c3a792faddabca1fc154c8fbb54ddee7b06a8082e1c587615198b5") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r##"{"TableName":"Movies-5","KeyConditionExpression":"#yr = :yyyy","ExpressionAttributeNames":{"#yr":"year"},"ExpressionAttributeValues":{":yyyy":{"N":"2222"}}}"##)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "39") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "AUAS9KJ0TK9BSR986TRPC2RGTRVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "3413411624") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Count":0,"Items":[],"ScannedCount":0}"#).unwrap()), - (http::Request::builder() - .header("content-type", "application/x-amz-json-1.0") - .header("x-amz-target", "DynamoDB_20120810.Query") - .header("content-length", "156") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=504d6b4de7093b20255b55057085937ec515f62f3c61da68c03bff3f0ce8a160") - .header("x-amz-date", "20210308T155123Z") - .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) - .body(SdkBody::from(r##"{"TableName":"Movies-5","KeyConditionExpression":"#yr = :yyyy","ExpressionAttributeNames":{"#yr":"year"},"ExpressionAttributeValues":{":yyyy":{"N":"2013"}}}"##)).unwrap(), - http::Response::builder() - .header("server", "Server") - .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "1231") - .header("connection", "keep-alive") - .header("x-amzn-requestid", "A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG") - .header("x-amz-crc32", "624725176") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#).unwrap()) +fn movies_it_test_connection() -> StaticReplayClient { + StaticReplayClient::new(vec![ + ReplayEvent::new( + http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.CreateTable") + .header("content-length", "313") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=4a832eba37651836b524b587986be607607b077ad133c57b4bf7300d2e02f476") + .header("x-amz-date", "20210308T155118Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"AttributeDefinitions":[{"AttributeName":"year","AttributeType":"N"},{"AttributeName":"title","AttributeType":"S"}],"TableName":"Movies-5","KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"ReadCapacityUnits":10,"WriteCapacityUnits":10}}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:18 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "572") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "RCII0AALE00UALC7LJ9AD600B7VV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "3715137447") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"TableDescription":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=01b0129a2a4fb3af14559fde8163d59de9c43907152a12479002b3a7c75fa0df") + .header("x-amz-date", "20210308T155119Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:18 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "561") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "O1C6QKCG8GT7D2K922T4QRL9N3VV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "46742265") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=7f3a743bb460f26296640ae775d282f0153eda750855ec00ace1815becfd2de5") + .header("x-amz-date", "20210308T155120Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")).body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:20 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "561") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "EN5N26BO1FAOEMUUSD7B7SUPPVVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "46742265") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=46a148c560139bc0da171bd915ea8c0b96a7012629f5db7b6bf70fcd1a66fd24") + .header("x-amz-date", "20210308T155121Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:21 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "561") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "PHCMGEVI6JLN9JNMKSSA3M76H3VV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "46742265") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=15bb7c9b2350747d62349091b3ea59d9e1800d1dca04029943329259bba85cb4") + .header("x-amz-date", "20210308T155122Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:22 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "561") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "1Q22O983HD3511TN6Q5RRTP0MFVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "46742265") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"CREATING"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.DescribeTable") + .header("content-length", "24") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=6d0a78087bc112c68a91b4b2d457efd8c09149b85b8f998f8c4b3f9916c8a743") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5"}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "559") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "ONJBNV2A9GBNUT34KH73JLL23BVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "24113616") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Table":{"AttributeDefinitions":[{"AttributeName":"title","AttributeType":"S"},{"AttributeName":"year","AttributeType":"N"}],"CreationDateTime":1.615218678973E9,"ItemCount":0,"KeySchema":[{"AttributeName":"year","KeyType":"HASH"},{"AttributeName":"title","KeyType":"RANGE"}],"ProvisionedThroughput":{"NumberOfDecreasesToday":0,"ReadCapacityUnits":10,"WriteCapacityUnits":10},"TableArn":"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5","TableId":"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd","TableName":"Movies-5","TableSizeBytes":0,"TableStatus":"ACTIVE"}}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.PutItem") + .header("content-length", "619") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=85fc7d2064a0e6d9c38d64751d39d311ad415ae4079ef21ef254b23ecf093519") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5","Item":{"info":{"M":{"rating":{"N":"6.2"},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"release_date":{"S":"2013-01-18T00:00:00Z"},"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"running_time_secs":{"N":"5215"},"rank":{"N":"11"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]}}},"title":{"S":"Turn It Down, Or Else!"},"year":{"N":"2013"}}}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "2") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "E6TGS5HKHHV08HSQA31IO1IDMFVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "2745614147") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.PutItem") + .header("content-length", "636") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=e4b1658c9f5129b3656381f6592a30e0061b1566263fbf27d982817ea79483f6") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r#"{"TableName":"Movies-5","Item":{"info":{"M":{"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"rating":{"N":"8.3"},"rank":{"N":"2"},"release_date":{"S":"2013-09-02T00:00:00Z"},"directors":{"L":[{"S":"Ron Howard"}]},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"running_time_secs":{"N":"7380"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]}}},"title":{"S":"Rush"},"year":{"N":"2013"}}}"#)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "2") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "B63D54LP2FOGQK9JE5KLJT49HJVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "2745614147") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.Query") + .header("content-length", "156") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=c9a0fdd0c7c3a792faddabca1fc154c8fbb54ddee7b06a8082e1c587615198b5") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r##"{"TableName":"Movies-5","KeyConditionExpression":"#yr = :yyyy","ExpressionAttributeNames":{"#yr":"year"},"ExpressionAttributeValues":{":yyyy":{"N":"2222"}}}"##)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "39") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "AUAS9KJ0TK9BSR986TRPC2RGTRVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "3413411624") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Count":0,"Items":[],"ScannedCount":0}"#)).unwrap()), + ReplayEvent::new(http::Request::builder() + .header("content-type", "application/x-amz-json-1.0") + .header("x-amz-target", "DynamoDB_20120810.Query") + .header("content-length", "156") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=504d6b4de7093b20255b55057085937ec515f62f3c61da68c03bff3f0ce8a160") + .header("x-amz-date", "20210308T155123Z") + .uri(Uri::from_static("https://dynamodb.us-east-1.amazonaws.com/")) + .body(SdkBody::from(r##"{"TableName":"Movies-5","KeyConditionExpression":"#yr = :yyyy","ExpressionAttributeNames":{"#yr":"year"},"ExpressionAttributeValues":{":yyyy":{"N":"2013"}}}"##)).unwrap(), + http::Response::builder() + .header("server", "Server") + .header("date", "Mon, 08 Mar 2021 15:51:23 GMT") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "1231") + .header("connection", "keep-alive") + .header("x-amzn-requestid", "A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG") + .header("x-amz-crc32", "624725176") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"{"Count":2,"Items":[{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"Daniel Bruhl"},{"S":"Chris Hemsworth"},{"S":"Olivia Wilde"}]},"plot":{"S":"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda."},"release_date":{"S":"2013-09-02T00:00:00Z"},"image_url":{"S":"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg"},"genres":{"L":[{"S":"Action"},{"S":"Biography"},{"S":"Drama"},{"S":"Sport"}]},"directors":{"L":[{"S":"Ron Howard"}]},"rating":{"N":"8.3"},"rank":{"N":"2"},"running_time_secs":{"N":"7380"}}},"title":{"S":"Rush"}},{"year":{"N":"2013"},"info":{"M":{"actors":{"L":[{"S":"David Matthewman"},{"S":"Ann Thomas"},{"S":"Jonathan G. Neff"}]},"release_date":{"S":"2013-01-18T00:00:00Z"},"plot":{"S":"A rock band plays their music at high volumes, annoying the neighbors."},"genres":{"L":[{"S":"Comedy"},{"S":"Drama"}]},"image_url":{"S":"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg"},"directors":{"L":[{"S":"Alice Smith"},{"S":"Bob Jones"}]},"rating":{"N":"6.2"},"rank":{"N":"11"},"running_time_secs":{"N":"5215"}}},"title":{"S":"Turn It Down, Or Else!"}}],"ScannedCount":2}"#)).unwrap()) ]) } diff --git a/aws/sdk/integration-tests/dynamodb/tests/paginators.rs b/aws/sdk/integration-tests/dynamodb/tests/paginators.rs index 807a11890de..7cb07f07672 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/paginators.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/paginators.rs @@ -6,30 +6,30 @@ use std::collections::HashMap; use std::iter::FromIterator; -use tokio_stream::StreamExt; - use aws_credential_types::Credentials; use aws_sdk_dynamodb::types::AttributeValue; use aws_sdk_dynamodb::{Client, Config}; -use aws_smithy_client::http_connector::HttpConnector; -use aws_smithy_client::test_connection::{capture_request, TestConnection}; -use aws_smithy_http::body::SdkBody; use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; +use aws_smithy_runtime::client::http::test_util::{ + capture_request, ReplayEvent, StaticReplayClient, +}; +use aws_smithy_runtime_api::client::http::HttpClient; +use aws_smithy_types::body::SdkBody; use aws_types::region::Region; -fn stub_config(conn: impl Into) -> Config { +fn stub_config(http_client: impl HttpClient + 'static) -> Config { Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build() } /// Validate that arguments are passed on to the paginator #[tokio::test] async fn paginators_pass_args() { - let (conn, request) = capture_request(None); - let client = Client::from_conf(stub_config(conn)); + let (http_client, request) = capture_request(None); + let client = Client::from_conf(stub_config(http_client)); let mut paginator = client .scan() .table_name("test-table") @@ -59,8 +59,8 @@ fn mk_response(body: &'static str) -> http::Response { #[tokio::test(flavor = "current_thread")] async fn paginators_loop_until_completion() { - let conn = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( mk_request(r#"{"TableName":"test-table","Limit":32}"#), mk_response( r#"{ @@ -76,7 +76,7 @@ async fn paginators_loop_until_completion() { }"#, ), ), - ( + ReplayEvent::new( mk_request( r#"{"TableName":"test-table","Limit":32,"ExclusiveStartKey":{"PostedBy":{"S":"joe@example.com"}}}"#, ), @@ -92,14 +92,14 @@ async fn paginators_loop_until_completion() { ), ), ]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let mut paginator = client .scan() .table_name("test-table") .into_paginator() .page_size(32) .send(); - assert_eq!(conn.requests().len(), 0); + assert_eq!(http_client.actual_requests().count(), 0); let first_page = paginator .try_next() .await @@ -112,7 +112,7 @@ async fn paginators_loop_until_completion() { AttributeValue::S("joe@example.com".to_string()) )])] ); - assert_eq!(conn.requests().len(), 1); + assert_eq!(http_client.actual_requests().count(), 1); let second_page = paginator .try_next() .await @@ -125,36 +125,36 @@ async fn paginators_loop_until_completion() { AttributeValue::S("jack@example.com".to_string()) )])] ); - assert_eq!(conn.requests().len(), 2); + assert_eq!(http_client.actual_requests().count(), 2); assert!( paginator.next().await.is_none(), "no more pages should exist" ); // we shouldn't make another request, we know we're at the end - assert_eq!(conn.requests().len(), 2); - conn.assert_requests_match(&[]); + assert_eq!(http_client.actual_requests().count(), 2); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn paginators_handle_errors() { // LastEvaluatedKey is set but there is only one response in the test connection - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( mk_request(r#"{"TableName":"test-table","Limit":32}"#), mk_response( r#"{ - "Count": 1, - "Items": [{ - "PostedBy": { - "S": "joe@example.com" - } - }], - "LastEvaluatedKey": { - "PostedBy": { "S": "joe@example.com" } - } - }"#, + "Count": 1, + "Items": [{ + "PostedBy": { + "S": "joe@example.com" + } + }], + "LastEvaluatedKey": { + "PostedBy": { "S": "joe@example.com" } + } + }"#, ), )]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let mut rows = client .scan() .table_name("test-table") @@ -188,19 +188,19 @@ async fn paginators_stop_on_duplicate_token_by_default() { } }"#; // send the same response twice with the same pagination token - let conn = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( mk_request(r#"{"TableName":"test-table","Limit":32}"#), mk_response(response), ), - ( + ReplayEvent::new( mk_request( r#"{"TableName":"test-table","Limit":32,"ExclusiveStartKey":{"PostedBy":{"S":"joe@example.com"}}}"#, ), mk_response(response), ), ]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let mut rows = client .scan() .table_name("test-table") @@ -241,25 +241,25 @@ async fn paginators_can_continue_on_duplicate_token() { } }"#; // send the same response twice with the same pagination token - let conn = TestConnection::new(vec![ - ( + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new( mk_request(r#"{"TableName":"test-table","Limit":32}"#), mk_response(response), ), - ( + ReplayEvent::new( mk_request( r#"{"TableName":"test-table","Limit":32,"ExclusiveStartKey":{"PostedBy":{"S":"joe@example.com"}}}"#, ), mk_response(response), ), - ( + ReplayEvent::new( mk_request( r#"{"TableName":"test-table","Limit":32,"ExclusiveStartKey":{"PostedBy":{"S":"joe@example.com"}}}"#, ), mk_response(response), ), ]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let mut rows = client .scan() .table_name("test-table") diff --git a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs index 21ad0470bc8..834ec850f2d 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs @@ -3,156 +3,156 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(aws_sdk_orchestrator_mode)] -mod test { - use aws_sdk_dynamodb::config::{Credentials, Region, SharedAsyncSleep}; - use aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata}; - use aws_smithy_async::test_util::instant_time_and_sleep; - use aws_smithy_async::time::SharedTimeSource; - use aws_smithy_client::test_connection::TestConnection; - use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime::client::retries::RetryPartition; - use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; - use std::time::{Duration, SystemTime}; - - fn req() -> HttpRequest { - http::Request::builder() - .body(SdkBody::from("request body")) - .unwrap() - } - - fn ok() -> HttpResponse { - http::Response::builder() - .status(200) - .header("server", "Server") - .header("content-type", "application/x-amz-json-1.0") - .header("content-length", "23") - .header("connection", "keep-alive") - .header("x-amz-crc32", "2335643545") - .body(SdkBody::from("{ \"TableNames\": [ \"Test\" ] }")) - .unwrap() - } - - fn err() -> HttpResponse { - http::Response::builder() - .status(500) - .body(SdkBody::from("{ \"message\": \"The request has failed because of an unknown error, exception or failure.\", \"code\": \"InternalServerError\" }")) - .unwrap() - } - - fn throttling_err() -> HttpResponse { - http::Response::builder() - .status(400) - .body(SdkBody::from("{ \"message\": \"The request was denied due to request throttling.\", \"code\": \"ThrottlingException\" }")) - .unwrap() - } - - #[tokio::test] - async fn test_adaptive_retries_with_no_throttling_errors() { - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - - let events = vec![ - // First operation - (req(), err()), - (req(), err()), - (req(), ok()), - // Second operation - (req(), err()), - (req(), ok()), - // Third operation will fail, only errors - (req(), err()), - (req(), err()), - (req(), err()), - (req(), err()), - ]; - - let conn = TestConnection::new(events); - let config = aws_sdk_dynamodb::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .retry_config( - RetryConfig::adaptive() - .with_max_attempts(4) - .with_use_static_exponential_base(true), - ) - .time_source(SharedTimeSource::new(time_source)) - .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone())) - .retry_partition(RetryPartition::new( - "test_adaptive_retries_with_no_throttling_errors", - )) - .http_connector(conn.clone()) - .build(); - let expected_table_names = vec!["Test".to_owned()]; - - // We create a new client each time to ensure that the cross-client retry state is working. - let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); - let res = client.list_tables().send().await.unwrap(); - assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); - // Three requests should have been made, two failing & one success - assert_eq!(conn.requests().len(), 3); - - let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); - let res = client.list_tables().send().await.unwrap(); - assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); - // Two requests should have been made, one failing & one success (plus previous requests) - assert_eq!(conn.requests().len(), 5); - - let client = aws_sdk_dynamodb::Client::from_conf(config); - let err = client.list_tables().send().await.unwrap_err(); - assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1 + 7),); - assert_eq!(err.code(), Some("InternalServerError")); - // four requests should have been made, all failing (plus previous requests) - assert_eq!(conn.requests().len(), 9); - } - - #[tokio::test] - async fn test_adaptive_retries_with_throttling_errors() { - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - - let events = vec![ - // First operation - (req(), throttling_err()), - (req(), throttling_err()), - (req(), ok()), - // Second operation - (req(), err()), - (req(), ok()), - ]; - - let conn = TestConnection::new(events); - let config = aws_sdk_dynamodb::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .retry_config( - RetryConfig::adaptive() - .with_max_attempts(4) - .with_use_static_exponential_base(true), - ) - .time_source(SharedTimeSource::new(time_source)) - .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone())) - .retry_partition(RetryPartition::new( - "test_adaptive_retries_with_throttling_errors", - )) - .http_connector(conn.clone()) - .build(); - let expected_table_names = vec!["Test".to_owned()]; - - // We create a new client each time to ensure that the cross-client retry state is working. - let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); - let res = client.list_tables().send().await.unwrap(); - assert_eq!(sleep_impl.total_duration(), Duration::from_secs(40)); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); - // Three requests should have been made, two failing & one success - assert_eq!(conn.requests().len(), 3); - - let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); - let res = client.list_tables().send().await.unwrap(); - assert!(Duration::from_secs(48) < sleep_impl.total_duration()); - assert!(Duration::from_secs(49) > sleep_impl.total_duration()); - assert_eq!(res.table_names(), Some(expected_table_names.as_slice())); - // Two requests should have been made, one failing & one success (plus previous requests) - assert_eq!(conn.requests().len(), 5); - } +use aws_sdk_dynamodb::config::{ + Credentials, Region, SharedAsyncSleep, StalledStreamProtectionConfig, +}; +use aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata}; +use aws_smithy_async::test_util::instant_time_and_sleep; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_runtime::client::retries::RetryPartition; +use aws_smithy_types::body::SdkBody; +use std::time::{Duration, SystemTime}; + +fn req() -> http::Request { + http::Request::builder() + .body(SdkBody::from("request body")) + .unwrap() +} + +fn ok() -> http::Response { + http::Response::builder() + .status(200) + .header("server", "Server") + .header("content-type", "application/x-amz-json-1.0") + .header("content-length", "23") + .header("connection", "keep-alive") + .header("x-amz-crc32", "2335643545") + .body(SdkBody::from("{ \"TableNames\": [ \"Test\" ] }")) + .unwrap() +} + +fn err() -> http::Response { + http::Response::builder() + .status(500) + .body(SdkBody::from("{ \"message\": \"The request has failed because of an unknown error, exception or failure.\", \"code\": \"InternalServerError\" }")) + .unwrap() +} + +fn throttling_err() -> http::Response { + http::Response::builder() + .status(400) + .body(SdkBody::from("{ \"message\": \"The request was denied due to request throttling.\", \"code\": \"ThrottlingException\" }")) + .unwrap() +} + +#[tokio::test] +async fn test_adaptive_retries_with_no_throttling_errors() { + let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); + + let events = vec![ + // First operation + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), + // Second operation + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), + // Third operation will fail, only errors + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), err()), + ]; + + let http_client = StaticReplayClient::new(events); + let config = aws_sdk_dynamodb::Config::builder() + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .retry_config( + RetryConfig::adaptive() + .with_max_attempts(4) + .with_use_static_exponential_base(true), + ) + .time_source(SharedTimeSource::new(time_source)) + .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone())) + .retry_partition(RetryPartition::new( + "test_adaptive_retries_with_no_throttling_errors", + )) + .http_client(http_client.clone()) + .build(); + let expected_table_names = vec!["Test".to_owned()]; + + // We create a new client each time to ensure that the cross-client retry state is working. + let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); + let res = client.list_tables().send().await.unwrap(); + assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3)); + assert_eq!(res.table_names(), expected_table_names.as_slice()); + // Three requests should have been made, two failing & one success + assert_eq!(http_client.actual_requests().count(), 3); + + let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); + let res = client.list_tables().send().await.unwrap(); + assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1)); + assert_eq!(res.table_names(), expected_table_names.as_slice()); + // Two requests should have been made, one failing & one success (plus previous requests) + assert_eq!(http_client.actual_requests().count(), 5); + + let client = aws_sdk_dynamodb::Client::from_conf(config); + let err = client.list_tables().send().await.unwrap_err(); + assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1 + 7),); + assert_eq!(err.code(), Some("InternalServerError")); + // four requests should have been made, all failing (plus previous requests) + assert_eq!(http_client.actual_requests().count(), 9); +} + +#[tokio::test] +async fn test_adaptive_retries_with_throttling_errors() { + let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); + + let events = vec![ + // First operation + ReplayEvent::new(req(), throttling_err()), + ReplayEvent::new(req(), throttling_err()), + ReplayEvent::new(req(), ok()), + // Second operation + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), + ]; + + let http_client = StaticReplayClient::new(events); + let config = aws_sdk_dynamodb::Config::builder() + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .retry_config( + RetryConfig::adaptive() + .with_max_attempts(4) + .with_use_static_exponential_base(true), + ) + .time_source(SharedTimeSource::new(time_source)) + .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone())) + .retry_partition(RetryPartition::new( + "test_adaptive_retries_with_throttling_errors", + )) + .http_client(http_client.clone()) + .build(); + let expected_table_names = vec!["Test".to_owned()]; + + // We create a new client each time to ensure that the cross-client retry state is working. + let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); + let res = client.list_tables().send().await.unwrap(); + assert_eq!(sleep_impl.total_duration(), Duration::from_secs(40)); + assert_eq!(res.table_names(), expected_table_names.as_slice()); + // Three requests should have been made, two failing & one success + assert_eq!(http_client.actual_requests().count(), 3); + + let client = aws_sdk_dynamodb::Client::from_conf(config.clone()); + let res = client.list_tables().send().await.unwrap(); + assert!(Duration::from_secs(48) < sleep_impl.total_duration()); + assert!(Duration::from_secs(49) > sleep_impl.total_duration()); + assert_eq!(res.table_names(), expected_table_names.as_slice()); + // Two requests should have been made, one failing & one success (plus previous requests) + assert_eq!(http_client.actual_requests().count(), 5); } diff --git a/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs b/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs index 3d5edf8cb22..02786fe0afb 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/shared-config.rs @@ -3,7 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_sdk_dynamodb::config::{Credentials, Region}; +use aws_sdk_dynamodb::config::{Credentials, Region, StalledStreamProtectionConfig}; +use aws_smithy_runtime::client::http::test_util::capture_request; use http::Uri; /// Iterative test of loading clients from shared configuration @@ -11,11 +12,12 @@ use http::Uri; async fn shared_config_testbed() { let shared_config = aws_types::SdkConfig::builder() .region(Region::new("us-east-4")) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .build(); - let (conn, request) = aws_smithy_client::test_connection::capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_dynamodb::config::Builder::from(&shared_config) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .endpoint_url("http://localhost:8000") .build(); let svc = aws_sdk_dynamodb::Client::from_conf(conf); diff --git a/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs b/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs index d1a9b9369e4..d7a41750dc8 100644 --- a/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs +++ b/aws/sdk/integration-tests/dynamodb/tests/timeouts.rs @@ -6,13 +6,12 @@ use std::time::Duration; use aws_credential_types::provider::SharedCredentialsProvider; -use aws_credential_types::Credentials; +use aws_sdk_dynamodb::config::{Credentials, Region, StalledStreamProtectionConfig}; use aws_sdk_dynamodb::error::SdkError; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_client::never::NeverConnector; +use aws_smithy_runtime::client::http::test_util::NeverClient; use aws_smithy_types::retry::RetryConfig; use aws_smithy_types::timeout::TimeoutConfig; -use aws_types::region::Region; use aws_types::SdkConfig; #[derive(Debug, Clone)] @@ -25,10 +24,10 @@ impl AsyncSleep for InstantSleep { #[tokio::test] async fn api_call_timeout_retries() { - let conn = NeverConnector::new(); + let http_client = NeverClient::new(); let conf = SdkConfig::builder() .region(Region::new("us-east-2")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .timeout_config( TimeoutConfig::builder() @@ -36,16 +35,17 @@ async fn api_call_timeout_retries() { .build(), ) .retry_config(RetryConfig::standard()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .sleep_impl(SharedAsyncSleep::new(InstantSleep)) .build(); - let client = aws_sdk_dynamodb::Client::from_conf(aws_sdk_dynamodb::Config::new(&conf)); + let client = aws_sdk_dynamodb::Client::new(&conf); let resp = client .list_tables() .send() .await .expect_err("call should fail"); assert_eq!( - conn.num_calls(), + http_client.num_calls(), 3, "client level timeouts should be retried" ); @@ -58,16 +58,17 @@ async fn api_call_timeout_retries() { #[tokio::test] async fn no_retries_on_operation_timeout() { - let conn = NeverConnector::new(); + let http_client = NeverClient::new(); let conf = SdkConfig::builder() .region(Region::new("us-east-2")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .timeout_config( TimeoutConfig::builder() .operation_timeout(Duration::new(123, 0)) .build(), ) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .retry_config(RetryConfig::standard()) .sleep_impl(SharedAsyncSleep::new(InstantSleep)) .build(); @@ -78,7 +79,7 @@ async fn no_retries_on_operation_timeout() { .await .expect_err("call should fail"); assert_eq!( - conn.num_calls(), + http_client.num_calls(), 1, "operation level timeouts should not be retried" ); diff --git a/aws/sdk/integration-tests/ec2/Cargo.toml b/aws/sdk/integration-tests/ec2/Cargo.toml index 853b1b594f4..b019cd50147 100644 --- a/aws/sdk/integration-tests/ec2/Cargo.toml +++ b/aws/sdk/integration-tests/ec2/Cargo.toml @@ -3,13 +3,16 @@ name = "ec2-tests" version = "0.1.0" edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-sdk-ec2 = { path = "../../build/aws-sdk/sdk/ec2" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util"]} +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client", "http-02x"] } +aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } +aws-sdk-ec2 = { path = "../../build/aws-sdk/sdk/ec2", features = ["behavior-version-latest"] } tokio = { version = "1.23.1", features = ["full"]} http = "0.2.0" tokio-stream = "0.1.5" diff --git a/aws/sdk/integration-tests/ec2/tests/paginators.rs b/aws/sdk/integration-tests/ec2/tests/paginators.rs index 83528f2075e..0ab3be626cb 100644 --- a/aws/sdk/integration-tests/ec2/tests/paginators.rs +++ b/aws/sdk/integration-tests/ec2/tests/paginators.rs @@ -3,17 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -use tokio_stream::StreamExt; - use aws_sdk_ec2::{config::Credentials, config::Region, types::InstanceType, Client, Config}; -use aws_smithy_client::http_connector::HttpConnector; -use aws_smithy_client::test_connection::TestConnection; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_runtime_api::client::http::HttpClient; +use aws_smithy_types::body::SdkBody; -fn stub_config(conn: impl Into) -> Config { +fn stub_config(http_client: impl HttpClient + 'static) -> Config { Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build() } @@ -29,17 +28,17 @@ async fn paginators_handle_empty_tokens() { "#; - let conn = TestConnection::<&str>::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .uri("https://ec2.us-east-1.amazonaws.com/") .body(request.into()) .unwrap(), http::Response::builder() .status(200) - .body(response) + .body(SdkBody::from(response)) .unwrap(), )]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let instance_type = InstanceType::from("g5.48xlarge"); let mut paginator = client .describe_spot_price_history() @@ -51,7 +50,7 @@ async fn paginators_handle_empty_tokens() { .send(); let first_item = paginator.try_next().await.expect("success"); assert_eq!(first_item, None); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } /// See https://github.com/awslabs/aws-sdk-rust/issues/405 @@ -65,17 +64,17 @@ async fn paginators_handle_unset_tokens() { edf3e86c-4baf-47c1-9228-9a5ea09542e8 "#; - let conn = TestConnection::<&str>::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .uri("https://ec2.us-east-1.amazonaws.com/") .body(request.into()) .unwrap(), http::Response::builder() .status(200) - .body(response) + .body(SdkBody::from(response)) .unwrap(), )]); - let client = Client::from_conf(stub_config(conn.clone())); + let client = Client::from_conf(stub_config(http_client.clone())); let instance_type = InstanceType::from("g5.48xlarge"); let mut paginator = client .describe_spot_price_history() @@ -87,5 +86,5 @@ async fn paginators_handle_unset_tokens() { .send(); let first_item = paginator.try_next().await.expect("success"); assert_eq!(first_item, None); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } diff --git a/aws/sdk/integration-tests/glacier/Cargo.toml b/aws/sdk/integration-tests/glacier/Cargo.toml index 4c4ce34887d..418cbb6bae8 100644 --- a/aws/sdk/integration-tests/glacier/Cargo.toml +++ b/aws/sdk/integration-tests/glacier/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["AWS Rust SDK Team "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -13,9 +13,9 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} -aws-sdk-glacier = { path = "../../build/aws-sdk/sdk/glacier" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-sdk-glacier = { path = "../../build/aws-sdk/sdk/glacier", features = ["behavior-version-latest"] } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test"} +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } bytes = "1.0.0" http = "0.2.0" tokio = { version = "1.23.1", features = ["full", "test-util"]} diff --git a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs index 941ed0a999a..52194567cc5 100644 --- a/aws/sdk/integration-tests/glacier/tests/custom-headers.rs +++ b/aws/sdk/integration-tests/glacier/tests/custom-headers.rs @@ -5,16 +5,16 @@ use aws_sdk_glacier::config::{Credentials, Region}; use aws_sdk_glacier::primitives::ByteStream; -use aws_smithy_client::test_connection::capture_request; use aws_smithy_protocol_test::{assert_ok, validate_headers}; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn set_correct_headers() { - let (conn, handler) = capture_request(None); + let (http_client, handler) = capture_request(None); let conf = aws_sdk_glacier::Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build(); let client = aws_sdk_glacier::Client::from_conf(conf); @@ -42,11 +42,11 @@ async fn set_correct_headers() { #[tokio::test] async fn autofill_account_id() { - let (conn, handler) = capture_request(None); + let (http_client, handler) = capture_request(None); let conf = aws_sdk_glacier::Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build(); let client = aws_sdk_glacier::Client::from_conf(conf); @@ -58,18 +58,18 @@ async fn autofill_account_id() { .await; let req = handler.expect_request(); assert_eq!( - "/-/vaults/vault/multipart-uploads/some%2Fupload%2Fid", - req.uri().path() + "https://glacier.us-east-1.amazonaws.com/-/vaults/vault/multipart-uploads/some%2Fupload%2Fid", + req.uri() ); } #[tokio::test] async fn api_version_set() { - let (conn, handler) = capture_request(None); + let (http_client, handler) = capture_request(None); let conf = aws_sdk_glacier::Config::builder() .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .http_client(http_client) .build(); let client = aws_sdk_glacier::Client::from_conf(conf); diff --git a/aws/sdk/integration-tests/iam/Cargo.toml b/aws/sdk/integration-tests/iam/Cargo.toml index 9c7b6b74642..45235fa71aa 100644 --- a/aws/sdk/integration-tests/iam/Cargo.toml +++ b/aws/sdk/integration-tests/iam/Cargo.toml @@ -5,17 +5,16 @@ version = "0.1.0" authors = ["AWS Rust SDK Team "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-endpoint = { path = "../../build/aws-sdk/sdk/aws-endpoint"} aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} -aws-sdk-iam = { path = "../../build/aws-sdk/sdk/iam" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-sdk-iam = { path = "../../build/aws-sdk/sdk/iam", features = ["behavior-version-latest"] } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } bytes = "1.0.0" http = "0.2.0" diff --git a/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs b/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs index 923bf568f69..70932827b8b 100644 --- a/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs +++ b/aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs @@ -4,21 +4,19 @@ */ use aws_sdk_iam::config::{Credentials, Region}; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; -// this test is ignored because pseudoregions have been removed. This test should be re-enabled -// once FIPS support is added in aws-config #[tokio::test] -#[ignore] async fn correct_endpoint_resolver() { - let (conn, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_iam::Config::builder() - .region(Region::from_static("iam-fips")) .credentials_provider(Credentials::for_tests()) - .http_connector(conn) + .use_fips(true) + .region(Region::new("us-east-1")) + .http_client(http_client) .build(); let client = aws_sdk_iam::Client::from_conf(conf); - let _ = client.list_roles().send().await; + let _ = dbg!(client.list_roles().send().await); let req = request.expect_request(); assert_eq!(&req.uri().to_string(), "https://iam-fips.amazonaws.com/"); } diff --git a/aws/sdk/integration-tests/kms/Cargo.toml b/aws/sdk/integration-tests/kms/Cargo.toml index 188a2d42dd2..d29e5b2158e 100644 --- a/aws/sdk/integration-tests/kms/Cargo.toml +++ b/aws/sdk/integration-tests/kms/Cargo.toml @@ -5,21 +5,25 @@ version = "0.1.0" authors = ["Russell Cohen "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["test-util"] +test-util = [] + [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime" } -aws-sdk-kms = { path = "../../build/aws-sdk/sdk/kms" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-sdk-kms = { path = "../../build/aws-sdk/sdk/kms", features = ["test-util", "behavior-version-latest"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } -aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } bytes = "1.0.0" http = "0.2.0" tokio = { version = "1.23.1", features = ["full", "test-util"] } diff --git a/aws/sdk/integration-tests/kms/tests/integration.rs b/aws/sdk/integration-tests/kms/tests/integration.rs index ba2744f1f37..ed534f61bdd 100644 --- a/aws/sdk/integration-tests/kms/tests/integration.rs +++ b/aws/sdk/integration-tests/kms/tests/integration.rs @@ -5,13 +5,12 @@ use aws_sdk_kms as kms; use aws_sdk_kms::operation::RequestId; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_client::SdkError; -use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_types::body::SdkBody; use http::header::AUTHORIZATION; use http::Uri; use kms::config::{Config, Credentials, Region}; -use std::time::{Duration, UNIX_EPOCH}; // TODO(DVR): having the full HTTP requests right in the code is a bit gross, consider something // like https://github.com/davidbarsky/sigv4/blob/master/aws-sigv4/src/lib.rs#L283-L315 to store @@ -20,16 +19,16 @@ use std::time::{Duration, UNIX_EPOCH}; /// Validate that for CN regions we set the URI correctly #[tokio::test] async fn generate_random_cn() { - let conn = TestConnection::new(vec![( + let http_client= StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .uri(Uri::from_static("https://kms.cn-north-1.amazonaws.com.cn/")) .body(SdkBody::from(r#"{"NumberOfBytes":64}"#)).unwrap(), http::Response::builder() .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA=="}"#).unwrap()) + .body(SdkBody::from(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA=="}"#)).unwrap()) ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("cn-north-1")) .credentials_provider(Credentials::for_tests()) .build(); @@ -41,46 +40,43 @@ async fn generate_random_cn() { .await .expect("success"); - assert_eq!(conn.requests().len(), 1); - conn.assert_requests_match(&[]); + assert_eq!(http_client.actual_requests().count(), 1); + http_client.assert_requests_match(&[]); } +#[cfg(feature = "test-util")] #[tokio::test] async fn generate_random() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") .header("content-length", "20") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210305/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=2e0dd7259fba92523d553173c452eba8a6ee7990fb5b1f8e2eccdeb75309e9e1") - .header("x-amz-date", "20210305T134922Z") - .header("x-amz-security-token", "notarealsessiontoken") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=53dcf70f6f852cb576185dcabef5aaa3d068704cf1b7ea7dc644efeaa46674d7") + .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") .uri(Uri::from_static("https://kms.us-east-1.amazonaws.com/")) .body(SdkBody::from(r#"{"NumberOfBytes":64}"#)).unwrap(), http::Response::builder() .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA=="}"#).unwrap()) + .body(SdkBody::from(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA=="}"#)).unwrap()) ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) + .with_test_defaults() .build(); let client = kms::Client::from_conf(conf); let resp = client .generate_random() .number_of_bytes(64) .customize() - .await - .expect("customizable") .mutate_request(|req| { // Remove the invocation ID since the signed request above doesn't have it req.headers_mut().remove("amz-sdk-invocation-id"); }) - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1614952162)) - .user_agent_for_tests() .send() .await .expect("request should succeed"); @@ -94,20 +90,20 @@ async fn generate_random() { .sum::(), 8562 ); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } #[tokio::test] async fn generate_random_malformed_response() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder().body(SdkBody::from(r#"{"NumberOfBytes":64}"#)).unwrap(), http::Response::builder() .status(http::StatusCode::from_u16(200).unwrap()) // last `}` replaced with a space, invalid JSON - .body(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA==" "#).unwrap()) + .body(SdkBody::from(r#"{"Plaintext":"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA==" "#)).unwrap()) ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) .credentials_provider(Credentials::for_tests()) .build(); @@ -120,16 +116,16 @@ async fn generate_random_malformed_response() { .expect_err("response was malformed"); } +#[cfg(feature = "test-util")] #[tokio::test] async fn generate_random_keystore_not_found() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() .header("content-type", "application/x-amz-json-1.1") .header("x-amz-target", "TrentService.GenerateRandom") .header("content-length", "56") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210305/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=4ca5cde61676c0ee49fde9ba3c886967e8af16461b6aafdfaee18033eb4ac7a5") - .header("x-amz-date", "20210305T144724Z") - .header("x-amz-security-token", "notarealsessiontoken") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=ffef92c6b75d66cc511daa896eb4a085ec053a2592e17d1f22ecaf167f2fa4bb") + .header("x-amz-date", "20090213T233130Z") .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") .uri(Uri::from_static("https://kms.us-east-1.amazonaws.com/")) @@ -143,12 +139,13 @@ async fn generate_random_keystore_not_found() { .header("date", "Fri, 05 Mar 2021 15:01:40 GMT") .header("content-type", "application/x-amz-json-1.1") .header("content-length", "44") - .body(r#"{"__type":"CustomKeyStoreNotFoundException"}"#).unwrap()) + .body(SdkBody::from(r#"{"__type":"CustomKeyStoreNotFoundException"}"#)).unwrap()) ]); let conf = Config::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) + .with_test_defaults() .build(); let client = kms::Client::from_conf(conf); @@ -156,11 +153,6 @@ async fn generate_random_keystore_not_found() { .generate_random() .number_of_bytes(64) .custom_key_store_id("does not exist") - .customize() - .await - .expect("customizable") - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1614955644)) - .user_agent_for_tests() .send() .await .expect_err("key store doesn't exist"); @@ -174,5 +166,5 @@ async fn generate_random_keystore_not_found() { inner.request_id(), Some("bfe81a0a-9a08-4e71-9910-cdb5ab6ea3b6") ); - conn.assert_requests_match(&[AUTHORIZATION]); + http_client.assert_requests_match(&[AUTHORIZATION.as_str()]); } diff --git a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs index e052dc28f2c..dc1a633a84f 100644 --- a/aws/sdk/integration-tests/kms/tests/retryable_errors.rs +++ b/aws/sdk/integration-tests/kms/tests/retryable_errors.rs @@ -3,145 +3,71 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(not(aws_sdk_orchestrator_mode))] -mod middleware_mode_tests { - use aws_http::retry::AwsResponseRetryClassifier; - use aws_sdk_kms as kms; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation::{self, Parts}; - use aws_smithy_http::response::ParseStrictResponse; - use aws_smithy_http::result::SdkError; - use aws_smithy_http::retry::ClassifyRetry; - use aws_smithy_types::retry::{ErrorKind, RetryKind}; - use bytes::Bytes; - use kms::operation::create_alias::{CreateAlias, CreateAliasInput}; +use aws_credential_types::Credentials; +use aws_runtime::retries::classifiers::AwsErrorCodeClassifier; +use aws_sdk_kms as kms; +use aws_smithy_runtime::client::http::test_util::infallible_client_fn; +use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; +use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; +use bytes::Bytes; +use kms::operation::create_alias::CreateAliasError; - async fn create_alias_op() -> Parts { - let conf = kms::Config::builder().build(); - let (_, parts) = CreateAliasInput::builder() - .build() - .unwrap() - .make_operation(&conf) - .await - .expect("valid request") - .into_request_response(); - parts - } +async fn make_err( + response: impl Fn() -> http::Response + Send + Sync + 'static, +) -> SdkError { + let http_client = infallible_client_fn(move |_| response()); + let conf = kms::Config::builder() + .http_client(http_client) + .credentials_provider(Credentials::for_tests()) + .region(kms::config::Region::from_static("us-east-1")) + .build(); + let client = kms::Client::from_conf(conf); + client + .create_alias() + .send() + .await + .expect_err("response was a failure") +} - /// Parse a semi-real response body and assert that the correct retry status is returned - #[tokio::test] - async fn errors_are_retryable() { - let op = create_alias_op().await; - let http_response = http::Response::builder() +/// Parse a semi-real response body and assert that the correct retry status is returned +#[tokio::test] +async fn errors_are_retryable() { + let err = make_err(|| { + http::Response::builder() .status(400) .body(Bytes::from_static( br#"{ "code": "LimitExceededException" }"#, )) - .unwrap(); - let err = op.response_handler.parse(&http_response).map_err(|e| { - SdkError::service_error( - e, - operation::Response::new(http_response.map(SdkBody::from)), - ) - }); - let retry_kind = op.retry_classifier.classify_retry(err.as_ref()); - assert_eq!(retry_kind, RetryKind::Error(ErrorKind::ThrottlingError)); - } + .unwrap() + }) + .await; - #[tokio::test] - async fn unmodeled_errors_are_retryable() { - let op = create_alias_op().await; - let http_response = http::Response::builder() - .status(400) - .body(Bytes::from_static(br#"{ "code": "ThrottlingException" }"#)) - .unwrap(); - let err = op.response_handler.parse(&http_response).map_err(|e| { - SdkError::service_error( - e, - operation::Response::new(http_response.map(SdkBody::from)), - ) - }); - let retry_kind = op.retry_classifier.classify_retry(err.as_ref()); - assert_eq!(retry_kind, RetryKind::Error(ErrorKind::ThrottlingError)); - } + dbg!(&err); + let classifier = AwsErrorCodeClassifier::::new(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + let err = err.into_service_error(); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); + let retry_action = classifier.classify_retry(&ctx); + assert_eq!(RetryAction::throttling_error(), retry_action); } -#[cfg(aws_sdk_orchestrator_mode)] -mod orchestrator_mode_tests { - use aws_credential_types::Credentials; - use aws_runtime::retries::classifier::AwsErrorCodeClassifier; - use aws_sdk_kms as kms; - use aws_smithy_client::test_connection::infallible_connection_fn; - use aws_smithy_http::result::SdkError; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; - use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; - use aws_smithy_types::retry::ErrorKind; - use aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError}; - use bytes::Bytes; - use kms::operation::create_alias::CreateAliasError; - - async fn make_err( - response: impl Fn() -> http::Response + Send + Sync + 'static, - ) -> SdkError { - let conn = infallible_connection_fn(move |_| response()); - let conf = kms::Config::builder() - .http_connector(conn) - .credentials_provider(Credentials::for_tests()) - .region(kms::config::Region::from_static("us-east-1")) - .build(); - let client = kms::Client::from_conf(conf); - client - .create_alias() - .send() - .await - .expect_err("response was a failure") - } - - /// Parse a semi-real response body and assert that the correct retry status is returned - #[tokio::test] - async fn errors_are_retryable() { - let err = make_err(|| { - http::Response::builder() - .status(400) - .body(Bytes::from_static( - br#"{ "code": "LimitExceededException" }"#, - )) - .unwrap() - }) - .await; - - dbg!(&err); - let classifier = AwsErrorCodeClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - let err = err.into_service_error(); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new(err)))); - let retry_kind = classifier.classify_retry(&ctx); - assert_eq!( - Some(RetryReason::Error(ErrorKind::ThrottlingError)), - retry_kind - ); - } - - #[tokio::test] - async fn unmodeled_errors_are_retryable() { - let err = make_err(|| { - http::Response::builder() - .status(400) - .body(Bytes::from_static(br#"{ "code": "ThrottlingException" }"#)) - .unwrap() - }) - .await; +#[tokio::test] +async fn unmodeled_errors_are_retryable() { + let err = make_err(|| { + http::Response::builder() + .status(400) + .body(Bytes::from_static(br#"{ "code": "ThrottlingException" }"#)) + .unwrap() + }) + .await; - dbg!(&err); - let classifier = AwsErrorCodeClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - let err = err.into_service_error(); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new(err)))); - let retry_kind = classifier.classify_retry(&ctx); - assert_eq!( - Some(RetryReason::Error(ErrorKind::ThrottlingError)), - retry_kind - ); - } + dbg!(&err); + let classifier = AwsErrorCodeClassifier::::new(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + let err = err.into_service_error(); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err)))); + let retry_action = classifier.classify_retry(&ctx); + assert_eq!(RetryAction::throttling_error(), retry_action); } diff --git a/aws/sdk/integration-tests/lambda/Cargo.toml b/aws/sdk/integration-tests/lambda/Cargo.toml index 6e51d089f53..7e53411d4c9 100644 --- a/aws/sdk/integration-tests/lambda/Cargo.toml +++ b/aws/sdk/integration-tests/lambda/Cargo.toml @@ -4,17 +4,17 @@ version = "0.1.0" authors = ["AWS Rust SDK Team ", "Zelda Hessler "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false [dev-dependencies] async-stream = "0.3.0" -aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-sdk-lambda = { path = "../../build/aws-sdk/sdk/lambda" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } +aws-sdk-lambda = { path = "../../build/aws-sdk/sdk/lambda", features = ["behavior-version-latest"] } aws-smithy-eventstream = { path = "../../build/aws-sdk/sdk/aws-smithy-eventstream" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } base64 = "0.13.0" bytes = "1.0.0" futures-core = "0.3.14" diff --git a/aws/sdk/integration-tests/lambda/tests/request_id.rs b/aws/sdk/integration-tests/lambda/tests/request_id.rs index 0e071945aa4..4517f05bc9e 100644 --- a/aws/sdk/integration-tests/lambda/tests/request_id.rs +++ b/aws/sdk/integration-tests/lambda/tests/request_id.rs @@ -7,22 +7,23 @@ use aws_sdk_lambda::config::{Credentials, Region}; use aws_sdk_lambda::operation::list_functions::ListFunctionsError; use aws_sdk_lambda::operation::RequestId; use aws_sdk_lambda::{Client, Config}; -use aws_smithy_client::test_connection::infallible_connection_fn; +use aws_smithy_runtime::client::http::test_util::infallible_client_fn; +#[allow(deprecated)] async fn run_test( response: impl Fn() -> http::Response<&'static str> + Send + Sync + 'static, expect_error: bool, ) { - let conn = infallible_connection_fn(move |_| response()); + let http_client = infallible_client_fn(move |_| response()); let conf = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::from_static("us-east-1")) .build(); let client = Client::from_conf(conf); let resp = client.list_functions().send().await; if expect_error { - let err = resp.err().expect("should be an error").into_service_error(); + let err = resp.expect_err("should be an error").into_service_error(); assert!(matches!(err, ListFunctionsError::Unhandled(_))); assert_eq!(Some("correct-request-id"), err.request_id()); assert_eq!(Some("correct-request-id"), err.meta().request_id()); diff --git a/aws/sdk/integration-tests/no-default-features/Cargo.toml b/aws/sdk/integration-tests/no-default-features/Cargo.toml index 545837f66ce..9ed56d6c09a 100644 --- a/aws/sdk/integration-tests/no-default-features/Cargo.toml +++ b/aws/sdk/integration-tests/no-default-features/Cargo.toml @@ -8,7 +8,7 @@ when default features are disabled for all SDK and runtime crates. """ edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -17,6 +17,9 @@ publish = false aws-config = { path = "../../build/aws-sdk/sdk/aws-config", default-features = false } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", default-features = false } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } +aws-smithy-runtime= { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } +aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } futures = "0.3.25" tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } +http = "0.2.9" diff --git a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs index 0ee5c7a5c30..c5c3c842c25 100644 --- a/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs +++ b/aws/sdk/integration-tests/no-default-features/tests/client-construction.rs @@ -3,34 +3,204 @@ * SPDX-License-Identifier: Apache-2.0 */ +use aws_sdk_s3::config::IdentityCache; + +use aws_sdk_s3::config::{ + retry::RetryConfig, timeout::TimeoutConfig, BehaviorVersion, Config, Credentials, Region, + SharedAsyncSleep, Sleep, StalledStreamProtectionConfig, +}; +use aws_sdk_s3::primitives::SdkBody; +use aws_smithy_runtime::client::http::test_util::infallible_client_fn; + +use aws_sdk_s3::error::DisplayErrorContext; +use aws_smithy_async::rt::sleep::AsyncSleep; +use aws_smithy_runtime::client::http::test_util::capture_request; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use std::time::Duration; + // This will fail due to lack of a connector when constructing the SDK Config +// If this test doesn't panic, you may have accidentally unified features, resulting in +// the connector being enabled transitively #[tokio::test] #[should_panic( - expected = "No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this." + expected = "Enable the `rustls` crate feature or configure a HTTP client to fix this." )] async fn test_clients_from_sdk_config() { - aws_config::load_from_env().await; + aws_config::load_defaults(BehaviorVersion::latest()).await; } // This will fail due to lack of a connector when constructing the service client #[tokio::test] -#[should_panic( - expected = "No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this." -)] async fn test_clients_from_service_config() { + use aws_sdk_s3::config::Region; + #[derive(Clone, Debug)] struct StubSleep; - impl aws_smithy_async::rt::sleep::AsyncSleep for StubSleep { - fn sleep(&self, _duration: std::time::Duration) -> aws_sdk_s3::config::Sleep { - todo!() + impl AsyncSleep for StubSleep { + fn sleep(&self, _duration: Duration) -> Sleep { + Sleep::new(Box::pin(async { /* no-op */ })) } } - let config = aws_sdk_s3::Config::builder() - .sleep_impl(aws_smithy_async::rt::sleep::SharedAsyncSleep::new( - StubSleep {}, - )) + let config = Config::builder() + .region(Region::new("us-east-1")) + .credentials_provider(Credentials::for_tests()) + .sleep_impl(SharedAsyncSleep::new(StubSleep)) + .behavior_version(BehaviorVersion::latest()) + .build(); + // Creating the client shouldn't panic or error since presigning doesn't require a connector + let client = aws_sdk_s3::Client::from_conf(config); + + let err = client + .list_buckets() + .send() + .await + .expect_err("it should fail to send a request because there is no HTTP client"); + let msg = format!("{}", DisplayErrorContext(err)); + assert!( + msg.contains("No HTTP client was available to send this request. Enable the `rustls` crate feature or configure a HTTP client to fix this."), + "expected '{msg}' to contain 'No HTTP client was available to send this request. Enable the `rustls` crate feature or set a HTTP client to fix this.'" + ); +} + +#[tokio::test] +#[should_panic(expected = "Invalid client configuration: A behavior major version must be set")] +async fn test_missing_behavior_version() { + use aws_sdk_s3::config::Region; + let http_client = + infallible_client_fn(|_req| http::Response::builder().body(SdkBody::empty()).unwrap()); + + let config = Config::builder() + .region(Region::new("us-east-1")) + .identity_cache(IdentityCache::no_cache()) + .credentials_provider(Credentials::for_tests()) + .http_client(http_client) + .build(); + // This line panics + let _client = aws_sdk_s3::Client::from_conf(config); +} + +#[tokio::test] +#[should_panic( + expected = "Invalid client configuration: An async sleep implementation is required for retry to work." +)] +async fn test_missing_async_sleep_time_source_retries() { + let _logs = capture_test_logs(); + let (http_client, _) = capture_request(None); + + // Configure retry and timeouts without providing a sleep impl + let config = Config::builder() + .http_client(http_client) + .region(Region::new("us-east-1")) + .credentials_provider(Credentials::for_tests()) + .retry_config(RetryConfig::standard()) + .timeout_config(TimeoutConfig::disabled()) + .behavior_version(BehaviorVersion::latest()) + .build(); + + // should panic with a validation error + let _client = aws_sdk_s3::Client::from_conf(config); +} + +#[tokio::test] +#[should_panic( + expected = "Invalid client configuration: An async sleep implementation is required for timeouts to work." +)] +async fn test_missing_async_sleep_time_source_timeouts() { + let _logs = capture_test_logs(); + let (http_client, _) = capture_request(None); + + // Configure retry and timeouts without providing a sleep impl + let config = Config::builder() + .http_client(http_client) + .region(Region::new("us-east-1")) + .credentials_provider(Credentials::for_tests()) + .retry_config(RetryConfig::disabled()) + .behavior_version(BehaviorVersion::latest()) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_secs(5)) + .build(), + ) + .build(); + + // should panic with a validation error + let _client = aws_sdk_s3::Client::from_conf(config); +} + +#[tokio::test] +#[should_panic( + expected = "Invalid client configuration: Lazy identity caching requires an async sleep implementation to be configured." +)] +async fn test_time_source_for_identity_cache() { + let _logs = capture_test_logs(); + let (http_client, _) = capture_request(None); + + // Configure an identity cache without providing a sleep impl or time source + let config = Config::builder() + .http_client(http_client) + .region(Region::new("us-east-1")) + .identity_cache(IdentityCache::lazy().build()) + .credentials_provider(Credentials::for_tests()) + .retry_config(RetryConfig::disabled()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) + .timeout_config(TimeoutConfig::disabled()) + .behavior_version(BehaviorVersion::latest()) + .build(); + + // should panic with a validation error + let _client = aws_sdk_s3::Client::from_conf(config); +} + +#[tokio::test] +async fn behavior_mv_from_aws_config() { + let (http_client, req) = capture_request(None); + let cfg = aws_config::defaults(BehaviorVersion::v2023_11_09()) + .http_client(http_client) + .retry_config(RetryConfig::disabled()) + .credentials_provider(Credentials::for_tests()) + .identity_cache(IdentityCache::no_cache()) + .timeout_config(TimeoutConfig::disabled()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) + .region(Region::new("us-west-2")) + .load() + .await; + let s3_client = aws_sdk_s3::Client::new(&cfg); + let _err = s3_client + .list_buckets() + .send() + .await + .expect_err("it should fail to send a request because there is no HTTP client"); + assert!(req + .expect_request() + .uri() + .starts_with("https://s3.us-west-2.amazonaws.com/")); +} + +#[tokio::test] +async fn behavior_mv_from_client_construction() { + let (http_client, req) = capture_request(None); + let cfg = aws_config::SdkConfig::builder() + .http_client(http_client) + .retry_config(RetryConfig::disabled()) + .identity_cache(IdentityCache::no_cache()) + .timeout_config(TimeoutConfig::disabled()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) + .region(Region::new("us-west-2")) .build(); - // This will panic due to the lack of an HTTP connector - aws_sdk_s3::Client::from_conf(config); + let s3_client = aws_sdk_s3::Client::from_conf( + aws_sdk_s3::config::Builder::from(&cfg) + .credentials_provider(Credentials::for_tests()) + .behavior_version(aws_sdk_s3::config::BehaviorVersion::v2023_11_09()) + .build(), + ); + let _err = dbg!(s3_client + .list_buckets() + .send() + .await + .expect_err("it should fail to send a request because there is no HTTP client")); + assert!(req + .expect_request() + .uri() + .starts_with("https://s3.us-west-2.amazonaws.com/")); } diff --git a/aws/sdk/integration-tests/polly/Cargo.toml b/aws/sdk/integration-tests/polly/Cargo.toml index 5412a3dcaf1..9e7e83a51ce 100644 --- a/aws/sdk/integration-tests/polly/Cargo.toml +++ b/aws/sdk/integration-tests/polly/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" authors = ["John DiSanti "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -13,8 +13,7 @@ publish = false [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http"} -aws-sdk-polly = { path = "../../build/aws-sdk/sdk/polly" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-sdk-polly = { path = "../../build/aws-sdk/sdk/polly", features = ["behavior-version-latest"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } bytes = "1.0.0" http = "0.2.0" diff --git a/aws/sdk/integration-tests/polly/tests/presigning.rs b/aws/sdk/integration-tests/polly/tests/presigning.rs index eaf525d7fb7..f6841b932ae 100644 --- a/aws/sdk/integration-tests/polly/tests/presigning.rs +++ b/aws/sdk/integration-tests/polly/tests/presigning.rs @@ -12,7 +12,7 @@ use std::time::{Duration, SystemTime}; #[tokio::test] async fn test_presigning() { let config = Config::builder() - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) .region(Region::new("us-east-1")) .build(); let client = polly::Client::from_conf(config); @@ -32,13 +32,14 @@ async fn test_presigning() { .await .expect("success"); - let pq = presigned.uri().path_and_query().unwrap(); + let uri = presigned.uri().parse::().unwrap(); + let pq = uri.path_and_query().unwrap(); let path = pq.path(); let query = pq.query().unwrap(); let mut query_params: Vec<&str> = query.split('&').collect(); query_params.sort(); - assert_eq!("GET", presigned.method().as_str()); + assert_eq!("GET", presigned.method()); assert_eq!("/v1/speech", path); assert_eq!( &[ @@ -55,5 +56,5 @@ async fn test_presigning() { ][..], &query_params ); - assert!(presigned.headers().is_empty()); + assert_eq!(presigned.headers().count(), 0); } diff --git a/aws/sdk/integration-tests/qldbsession/Cargo.toml b/aws/sdk/integration-tests/qldbsession/Cargo.toml index ef09721a845..06673d84338 100644 --- a/aws/sdk/integration-tests/qldbsession/Cargo.toml +++ b/aws/sdk/integration-tests/qldbsession/Cargo.toml @@ -5,17 +5,22 @@ version = "0.1.0" authors = ["Russell Cohen ", "Shing Lyu "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["test-util"] +test-util = [] + [dev-dependencies] async-std = "1.12.0" -aws-config = { path = "../../build/aws-sdk/sdk/aws-config" } +aws-config = { path = "../../build/aws-sdk/sdk/aws-config", features = ["behavior-version-latest"] } aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3" } -aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } -aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["rt-tokio"] } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-runtime = { path = "../../build/aws-sdk/sdk/aws-runtime", features = ["test-util"] } +aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", features = ["test-util", "behavior-version-latest"] } +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util", "rt-tokio"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } aws-smithy-protocol-test = { path = "../../build/aws-sdk/sdk/aws-smithy-protocol-test" } -aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util", "wire-mock"] } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1" bytes-utils = "0.1.2" -fastrand = "1.8.0" -futures-util = { version = "0.3.16", default-features = false } +fastrand = "2.0.1" +futures-util = { version = "0.3.16", default-features = false, features = ["alloc"] } hdrhistogram = "7.5.2" http = "0.2.3" http-body = "0.4.5" -hyper = "0.14.26" +hyper = { version = "0.14.26", features = ["stream"] } +once_cell = "1.18.0" pretty_assertions = "1.3" serde_json = "1" smol = "1.2" diff --git a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs index 8d1a604d95d..2c8c4f4b0a9 100644 --- a/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs +++ b/aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs @@ -5,7 +5,7 @@ use aws_config::retry::RetryConfig; use aws_credential_types::provider::SharedCredentialsProvider; -use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::config::{Credentials, Region, StalledStreamProtectionConfig}; use aws_sdk_s3::types::{ CompressionType, CsvInput, CsvOutput, ExpressionType, FileHeaderInfo, InputSerialization, OutputSerialization, @@ -13,16 +13,14 @@ use aws_sdk_s3::types::{ use aws_sdk_s3::{Client, Config}; use aws_smithy_async::assert_elapsed; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_client::never::NeverConnector; -use aws_smithy_http::result::SdkError; +use aws_smithy_runtime::client::http::test_util::NeverClient; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use aws_smithy_runtime_api::client::result::SdkError; use aws_smithy_types::error::display::DisplayErrorContext; use aws_smithy_types::timeout::TimeoutConfig; use std::fmt::Debug; use std::time::{Duration, Instant}; -#[cfg(aws_sdk_orchestrator_mode)] -use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; - #[derive(Debug)] struct SmolSleep; @@ -36,7 +34,6 @@ impl AsyncSleep for SmolSleep { #[test] fn test_smol_runtime_timeouts() { - #[cfg(aws_sdk_orchestrator_mode)] let _guard = capture_test_logs(); if let Err(err) = smol::block_on(async { timeout_test(SharedAsyncSleep::new(SmolSleep)).await }) @@ -48,7 +45,6 @@ fn test_smol_runtime_timeouts() { #[test] fn test_smol_runtime_retry() { - #[cfg(aws_sdk_orchestrator_mode)] let _guard = capture_test_logs(); if let Err(err) = smol::block_on(async { retry_test(SharedAsyncSleep::new(SmolSleep)).await }) { @@ -68,7 +64,6 @@ impl AsyncSleep for AsyncStdSleep { #[test] fn test_async_std_runtime_timeouts() { - #[cfg(aws_sdk_orchestrator_mode)] let _guard = capture_test_logs(); if let Err(err) = async_std::task::block_on(async { @@ -81,7 +76,6 @@ fn test_async_std_runtime_timeouts() { #[test] fn test_async_std_runtime_retry() { - #[cfg(aws_sdk_orchestrator_mode)] let _guard = capture_test_logs(); if let Err(err) = @@ -93,14 +87,14 @@ fn test_async_std_runtime_retry() { } async fn timeout_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box> { - let conn = NeverConnector::new(); + let http_client = NeverClient::new(); let region = Region::from_static("us-east-2"); let timeout_config = TimeoutConfig::builder() .operation_timeout(Duration::from_secs_f32(0.5)) .build(); let config = Config::builder() .region(region) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(Credentials::for_tests()) .timeout_config(timeout_config) .sleep_impl(sleep_impl) @@ -147,12 +141,13 @@ async fn timeout_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box Result<(), Box> { - let conn = NeverConnector::new(); + let http_client = NeverClient::new(); let conf = aws_types::SdkConfig::builder() .region(Region::new("us-east-2")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .retry_config(RetryConfig::standard().with_max_attempts(3)) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .timeout_config( TimeoutConfig::builder() .operation_attempt_timeout(Duration::from_secs_f64(0.1)) @@ -173,7 +168,7 @@ async fn retry_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box TestConnection<&'static str> { - TestConnection::new(vec![ - (http::Request::builder() - .header("x-amz-checksum-mode", "ENABLED") - .header("user-agent", "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0") - .header("x-amz-date", "20210618T170728Z") - .header("x-amz-content-sha256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") - .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-checksum-mode;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=eb9e58fa4fb04c8e6f160705017fdbb497ccff0efee4227b3a56f900006c3882") - .uri(Uri::from_static("https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?x-id=GetObject")).body(SdkBody::empty()).unwrap(), - http::Response::builder() - .header("x-amz-request-id", "4B4NGF0EAWN0GE63") - .header("content-length", "11") - .header("etag", "\"3e25960a79dbc69b674cd4ec67a72c62\"") - .header(checksum_header_name, checksum_header_value) - .header("content-type", "application/octet-stream") - .header("server", "AmazonS3") - .header("content-encoding", "") - .header("last-modified", "Tue, 21 Jun 2022 16:29:14 GMT") - .header("date", "Tue, 21 Jun 2022 16:29:23 GMT") - .header("x-amz-id-2", "kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM=") - .header("accept-ranges", "bytes") - .status(http::StatusCode::from_u16(200).unwrap()) - .body(r#"Hello world"#).unwrap()), - ]) +) -> StaticReplayClient { + StaticReplayClient::new(vec![ReplayEvent::new( + http::Request::builder() + .header("x-amz-checksum-mode", "ENABLED") + .header( + "user-agent", + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0", + ) + .header("x-amz-date", "20090213T233130Z") + .header( + "x-amz-content-sha256", + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ) + .header( + "x-amz-user-agent", + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0", + ) + .header("authorization", "not-relevant") + .uri(Uri::from_static( + "https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?x-id=GetObject", + )) + .body(SdkBody::empty()) + .unwrap(), + http::Response::builder() + .header("x-amz-request-id", "4B4NGF0EAWN0GE63") + .header("content-length", "11") + .header("etag", "\"3e25960a79dbc69b674cd4ec67a72c62\"") + .header(checksum_header_name, checksum_header_value) + .header("content-type", "application/octet-stream") + .header("server", "AmazonS3") + .header("content-encoding", "") + .header("last-modified", "Tue, 21 Jun 2022 16:29:14 GMT") + .header("date", "Tue, 21 Jun 2022 16:29:23 GMT") + .header( + "x-amz-id-2", + "kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM=", + ) + .header("accept-ranges", "bytes") + .status(http::StatusCode::from_u16(200).unwrap()) + .body(SdkBody::from(r#"Hello world"#)) + .unwrap(), + )]) } async fn test_checksum_on_streaming_response( checksum_header_name: &'static str, checksum_header_value: &'static str, ) -> GetObjectOutput { - let conn = new_checksum_validated_response_test_connection( + let http_client = new_checksum_validated_response_test_connection( checksum_header_name, checksum_header_value, ); - let sdk_config = SdkConfig::builder() + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .time_source(UNIX_EPOCH + Duration::from_secs(1624036048)) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) + .with_test_defaults() .build(); - - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let res = client .get_object() .bucket("some-test-bucket") .key("test.txt") .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled) - .customize() - .await - .unwrap() - .user_agent_for_tests() .send() .await .unwrap(); - conn.assert_requests_match(&[ - http::header::HeaderName::from_static("x-amz-checksum-mode"), - AUTHORIZATION, - ]); + http_client.assert_requests_match(&["x-amz-checksum-mode", AUTHORIZATION.as_str()]); res } @@ -149,14 +163,14 @@ async fn test_checksum_on_streaming_request<'a>( expected_encoded_content_length: &'a str, expected_aws_chunked_encoded_body: &'a str, ) { - let (conn, rcvr) = capture_request(None); - let sdk_config = SdkConfig::builder() + let (http_client, rcvr) = capture_request(None); + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) + .with_test_defaults() .build(); - - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); // ByteStreams created from a file are streaming and have a known size let mut file = tempfile::NamedTempFile::new().unwrap(); @@ -178,16 +192,11 @@ async fn test_checksum_on_streaming_request<'a>( .key("test.txt") .body(body) .checksum_algorithm(checksum_algorithm) - .customize() - .await - .unwrap() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await .unwrap(); - let req = rcvr.expect_request(); + let mut req = rcvr.expect_request(); let headers = req.headers(); let x_amz_content_sha256 = headers @@ -234,10 +243,10 @@ async fn test_checksum_on_streaming_request<'a>( content_length, "content-length was expected to be {} but was {} instead", expected_encoded_content_length, - content_length.to_str().unwrap() + content_length ); - let body = collect_body_into_string(req.into_body()).await; + let body = collect_body_into_string(req.take_body()).await; // When sending a streaming body with a checksum, the trailers are included as part of the body content assert_eq!(body.as_str(), expected_aws_chunked_encoded_body,); } @@ -306,7 +315,7 @@ async fn test_sha256_checksum_on_streaming_request() { .await } -async fn collect_body_into_string(mut body: aws_smithy_http::body::SdkBody) -> String { +async fn collect_body_into_string(mut body: aws_smithy_types::body::SdkBody) -> String { use bytes::Buf; use bytes_utils::SegmentedBuf; use http_body::Body; @@ -330,7 +339,7 @@ async fn collect_body_into_string(mut body: aws_smithy_http::body::SdkBody) -> S #[traced_test] async fn test_get_multipart_upload_part_checksum_validation() { let expected_checksum = "cpjwid==-12"; - let (conn, rcvr) = capture_request(Some( + let (http_client, rcvr) = capture_request(Some( http::Response::builder() .header("etag", "\"3e25960a79dbc69b674cd4ec67a72c62\"") .header("x-amz-checksum-crc32", expected_checksum) @@ -340,7 +349,8 @@ async fn test_get_multipart_upload_part_checksum_validation() { let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .build(); let client = Client::new(&sdk_config); @@ -376,7 +386,7 @@ async fn test_get_multipart_upload_part_checksum_validation() { #[traced_test] async fn test_response_checksum_ignores_invalid_base64() { let expected_checksum = "{}{!!#{})!{)@$(}"; - let (conn, rcvr) = capture_request(Some( + let (http_client, rcvr) = capture_request(Some( http::Response::builder() .header("etag", "\"3e25960a79dbc69b674cd4ec67a72c62\"") .header("x-amz-checksum-crc32", expected_checksum) @@ -385,8 +395,9 @@ async fn test_response_checksum_ignores_invalid_base64() { )); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); diff --git a/aws/sdk/integration-tests/s3/tests/client_construction.rs b/aws/sdk/integration-tests/s3/tests/client_construction.rs new file mode 100644 index 00000000000..6b20cca1c39 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/client_construction.rs @@ -0,0 +1,50 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +mod with_sdk_config { + use aws_config::SdkConfig; + use aws_sdk_s3 as s3; + use s3::config::StalledStreamProtectionConfig; + + #[tokio::test] + async fn using_config_loader() { + // When using `aws_config::load_from_env`, things should just work + let config = aws_config::load_from_env().await; + assert!(config.timeout_config().unwrap().has_timeouts()); + assert!(config.retry_config().unwrap().has_retry()); + let _s3 = s3::Client::new(&config); + } + + #[test] + fn manual_config_construction_all_defaults() { + // When manually constructing `SdkConfig` with everything unset, + // it should work since there will be no timeouts or retries enabled, + // and thus, no sleep impl is required. + let config = SdkConfig::builder() + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) + .build(); + assert!(config.timeout_config().is_none()); + assert!(config.retry_config().is_none()); + let _s3 = s3::Client::new(&config); + } + + #[test] + fn bytestream_from_path_exists() { + let _ = aws_sdk_s3::primitives::ByteStream::from_path("a/b.txt"); + } +} + +mod with_service_config { + use aws_sdk_s3 as s3; + + #[test] + fn manual_config_construction_all_defaults() { + // When manually constructing `Config` with everything unset, + // it should work since there will be no timeouts or retries enabled, + // and thus, no sleep impl is required. + let config = s3::Config::builder().build(); + let _s3 = s3::Client::from_conf(config); + } +} diff --git a/aws/sdk/integration-tests/s3/tests/concurrency.rs b/aws/sdk/integration-tests/s3/tests/concurrency.rs index c54d303d4bf..ab4a7f8dd1c 100644 --- a/aws/sdk/integration-tests/s3/tests/concurrency.rs +++ b/aws/sdk/integration-tests/s3/tests/concurrency.rs @@ -3,11 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -use std::future::Future; -use std::iter::repeat_with; -use std::net::SocketAddr; -use std::sync::Arc; - use aws_credential_types::provider::SharedCredentialsProvider; use aws_credential_types::Credentials; use aws_sdk_s3::Client; @@ -15,9 +10,12 @@ use aws_smithy_types::timeout::TimeoutConfig; use aws_types::region::Region; use aws_types::SdkConfig; use bytes::BytesMut; -use futures_util::future; use hdrhistogram::sync::SyncHistogram; use hdrhistogram::Histogram; +use std::future::Future; +use std::iter::repeat_with; +use std::net::SocketAddr; +use std::sync::Arc; use tokio::sync::Semaphore; use tokio::time::{Duration, Instant}; use tracing::debug; @@ -218,7 +216,7 @@ async fn test_concurrency(sdk_config: SdkConfig) { }); debug!("joining futures"); - let res: Vec<_> = future::join_all(futures).await; + let res: Vec<_> = ::futures_util::future::join_all(futures).await; // Assert we ran all the tasks assert_eq!(TASK_COUNT, res.len()); diff --git a/aws/sdk/integration-tests/s3/tests/config-override.rs b/aws/sdk/integration-tests/s3/tests/config-override.rs index b3d93be8676..653313e2387 100644 --- a/aws/sdk/integration-tests/s3/tests/config-override.rs +++ b/aws/sdk/integration-tests/s3/tests/config-override.rs @@ -6,24 +6,20 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::{capture_request, CaptureRequestReceiver}; +use aws_smithy_runtime::client::http::test_util::{capture_request, CaptureRequestReceiver}; use aws_types::SdkConfig; -// TODO(enableNewSmithyRuntimeCleanup): Remove this attribute once #[cfg(aws_sdk_orchestrator_mode)] -// has been removed -#[allow(dead_code)] fn test_client() -> (CaptureRequestReceiver, Client) { - let (conn, captured_request) = capture_request(None); + let (http_client, captured_request) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-west-2")) - .http_connector(conn) + .http_client(http_client) .build(); let client = Client::new(&sdk_config); (captured_request, client) } -#[cfg(aws_sdk_orchestrator_mode)] #[tokio::test] async fn operation_overrides_force_path_style() { let (captured_request, client) = test_client(); @@ -31,8 +27,6 @@ async fn operation_overrides_force_path_style() { .list_objects_v2() .bucket("test-bucket") .customize() - .await - .unwrap() .config_override(aws_sdk_s3::config::Config::builder().force_path_style(true)) .send() .await; @@ -42,7 +36,6 @@ async fn operation_overrides_force_path_style() { ); } -#[cfg(aws_sdk_orchestrator_mode)] #[tokio::test] async fn operation_overrides_fips() { let (captured_request, client) = test_client(); @@ -50,8 +43,6 @@ async fn operation_overrides_fips() { .list_objects_v2() .bucket("test-bucket") .customize() - .await - .unwrap() .config_override(aws_sdk_s3::config::Config::builder().use_fips(true)) .send() .await; @@ -61,7 +52,6 @@ async fn operation_overrides_fips() { ); } -#[cfg(aws_sdk_orchestrator_mode)] #[tokio::test] async fn operation_overrides_dual_stack() { let (captured_request, client) = test_client(); @@ -69,8 +59,6 @@ async fn operation_overrides_dual_stack() { .list_objects_v2() .bucket("test-bucket") .customize() - .await - .unwrap() .config_override(aws_sdk_s3::config::Config::builder().use_dual_stack(true)) .send() .await; @@ -79,43 +67,3 @@ async fn operation_overrides_dual_stack() { "https://test-bucket.s3.dualstack.us-west-2.amazonaws.com/?list-type=2" ); } - -// TODO(enableNewSmithyRuntimeCleanup): Comment in the following test once Handle is no longer -// accessed in ServiceRuntimePlugin::config. Currently, a credentials cache created for a single -// operation invocation is not picked up by an identity resolver. -/* -#[cfg(aws_sdk_orchestrator_mode)] -#[tokio::test] -async fn operation_overrides_credentials_provider() { - let (captured_request, client) = test_client(); - let _ = client - .list_objects_v2() - .bucket("test-bucket") - .customize() - .await - .unwrap() - .config_override(aws_sdk_s3::config::Config::builder().credentials_provider(Credentials::new( - "test", - "test", - Some("test".into()), - Some(std::time::UNIX_EPOCH + std::time::Duration::from_secs(1669257290 + 3600)), - "test", - ))) - .request_time_for_tests(std::time::UNIX_EPOCH + std::time::Duration::from_secs(1669257290)) - .send() - .await; - - let request = captured_request.expect_request(); - let actual_auth = - std::str::from_utf8(request.headers().get("authorization").unwrap().as_bytes()).unwrap(); - // signature would be f98cc3911dfba0daabf4343152f456bff9ecd3888a3068a1346d26949cb8f9e5 - // if we used `Credentials::for_tests()` - let expected_sig = "Signature=d7e7be63efc37c5bab5eda121999cd1c9a95efdde0cc1ce7c1b8761051cc3cbd"; - assert!( - actual_auth.contains(expected_sig), - "authorization header signature did not match expected signature: expected {} but not found in {}", - expected_sig, - actual_auth, - ); -} -*/ diff --git a/aws/sdk/integration-tests/s3/tests/config_to_builder.rs b/aws/sdk/integration-tests/s3/tests/config_to_builder.rs new file mode 100644 index 00000000000..fb33ffe130c --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/config_to_builder.rs @@ -0,0 +1,17 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#[tokio::test] +async fn test_config_to_builder() { + use aws_sdk_s3::config::AppName; + + let config = aws_config::load_from_env().await; + let config = aws_sdk_s3::Config::new(&config); + // should not panic + let _ = config + .to_builder() + .app_name(AppName::new("SomeAppName").unwrap()) + .build(); +} diff --git a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs index 09dd42fb8f1..0c19fbf9038 100644 --- a/aws/sdk/integration-tests/s3/tests/customizable-operation.rs +++ b/aws/sdk/integration-tests/s3/tests/customizable-operation.rs @@ -3,57 +3,44 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; - -use std::time::{Duration, UNIX_EPOCH}; +use aws_sdk_s3::{Client, Config}; +use aws_smithy_runtime::client::http::test_util::capture_request; +use http::HeaderValue; #[tokio::test] async fn test_s3_ops_are_customizable() { - let (conn, rcvr) = capture_request(None); - let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + let (http_client, rcvr) = capture_request(None); + let config = Config::builder() + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); - let client = Client::new(&sdk_config); - - let op = client - .list_buckets() - .customize() - .await - .expect("list_buckets is customizable") - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests(); + let client = Client::from_conf(config); // The response from the fake connection won't return the expected XML but we don't care about // that error in this test - let _ = op + let _ = client + .list_buckets() + .customize() + .mutate_request(|req| { + req.headers_mut() + .append("test-header", HeaderValue::from_static("test-value")); + }) .send() .await .expect_err("this will fail due to not receiving a proper XML response."); let expected_req = rcvr.expect_request(); - let auth_header = expected_req + let test_header = expected_req .headers() - .get("Authorization") + .get("test-header") .unwrap() .to_owned(); - // This is a snapshot test taken from a known working test result - let snapshot_signature = - "Signature=c2028dc806248952fc533ab4b1d9f1bafcdc9b3380ed00482f9935541ae11671"; - assert!( - auth_header - .to_str() - .unwrap() - .contains(snapshot_signature), - "authorization header signature did not match expected signature: got {}, expected it to contain {}", - auth_header.to_str().unwrap(), - snapshot_signature - ); + assert_eq!("test-value", test_header); } diff --git a/aws/sdk/integration-tests/s3/tests/data/no_auth/get-object.json b/aws/sdk/integration-tests/s3/tests/data/no_auth/get-object.json new file mode 100644 index 00000000000..4cc94177a3e --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/data/no_auth/get-object.json @@ -0,0 +1,85 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz?x-id=GetObject", + "headers": { + "amz-sdk-request": [ + "attempt=1; max=3" + ], + "user-agent": [ + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ], + "x-amz-user-agent": [ + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" + ] + }, + "method": "GET" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "content-type": [ + "binary/octet-stream" + ], + "x-amz-id-2": [ + "mO5q2ZSztYdEU923Zi5sHNctHwRRzOyngQEWsZWHwOJEgxrj9dw0KH0IVovTxu2Y8V0ps5z4KMQ=" + ], + "content-length": [ + "386910" + ], + "accept-ranges": [ + "bytes" + ], + "x-amz-server-side-encryption": [ + "AES256" + ], + "x-amz-request-id": [ + "EGGB3A7GXR9YWDYM" + ], + "last-modified": [ + "Mon, 27 Jan 2020 20:56:51 GMT" + ], + "date": [ + "Mon, 07 Aug 2023 20:44:42 GMT" + ], + "x-amz-meta-description": [ + "{\"url\": \"s3://cleversafe.service.consul/stage-submission-5/ORGANOID-PANCREATIC/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\", \"node_id\": \"0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\"}" + ], + "server": [ + "AmazonS3" + ], + "etag": [ + "\"446fc665f99183cd0540d7656a79d3ed\"" + ] + } + } + } + } + } + } + ], + "docs": "traffic recording of optional auth (no Authorization header is included)", + "version": "V0" +} diff --git a/aws/sdk/integration-tests/s3/tests/data/no_auth/head-object.json b/aws/sdk/integration-tests/s3/tests/data/no_auth/head-object.json new file mode 100644 index 00000000000..c0ab633b57b --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/data/no_auth/head-object.json @@ -0,0 +1,94 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz", + "headers": { + "user-agent": [ + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ], + "amz-sdk-request": [ + "attempt=1; max=3" + ], + "x-amz-user-agent": [ + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" + ] + }, + "method": "HEAD" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "last-modified": [ + "Mon, 27 Jan 2020 20:56:51 GMT" + ], + "content-type": [ + "binary/octet-stream" + ], + "date": [ + "Mon, 07 Aug 2023 20:44:42 GMT" + ], + "server": [ + "AmazonS3" + ], + "content-length": [ + "386910" + ], + "accept-ranges": [ + "bytes" + ], + "x-amz-server-side-encryption": [ + "AES256" + ], + "x-amz-id-2": [ + "+d6tSM3krTTrvY+y6PFHnkw9OhAtJhQy8RzFrPO6vnUOIuvqViB9gFZvfJCcVMj7gX+dpIvZ3HI=" + ], + "x-amz-request-id": [ + "EGGF3G9KFMFHZ3E0" + ], + "etag": [ + "\"446fc665f99183cd0540d7656a79d3ed\"" + ], + "x-amz-meta-description": [ + "{\"url\": \"s3://cleversafe.service.consul/stage-submission-5/ORGANOID-PANCREATIC/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\", \"node_id\": \"0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\"}" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "traffic recording of optional auth (no Authorization header is included)", + "version": "V0" +} diff --git a/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects-v2.json b/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects-v2.json new file mode 100644 index 00000000000..952e22dc516 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects-v2.json @@ -0,0 +1,93 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/?list-type=2&max-keys=3", + "headers": { + "amz-sdk-request": [ + "attempt=1; max=3" + ], + "x-amz-user-agent": [ + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" + ], + "user-agent": [ + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ] + }, + "method": "GET" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "x-amz-id-2": [ + "InRlbSiDTNSjIiYuGbkpnrz0TIgFVsDu8bnzVwF2UvZiOuiwhvdA3oltBT1ILZqNyFzSIkShTKk=" + ], + "x-amz-request-id": [ + "H8T96AN5TTDT3SSQ" + ], + "server": [ + "AmazonS3" + ], + "x-amz-bucket-region": [ + "us-east-1" + ], + "date": [ + "Mon, 07 Aug 2023 20:44:41 GMT" + ], + "content-type": [ + "application/xml" + ], + "transfer-encoding": [ + "chunked" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "\ngdc-organoid-pancreatic-phs001611-2-open1SL9nYFaimMAwnR9dJnF4M5NMfm3Em6/ClPUVLEH3GOSw5yjeI+wCBLj3THB8DuJSUFhKNy5cGK5QBb/SvE+MKMZurarr0ZhOhQae2SQ8B4QQPkqQHKp9MeJXsYe4UH8/okpqJUZNS2AQt7gXrz7mFdIJXPuSckj02e06tvxZAOkHu7ER4xTJ+odI774K2xB+pcD3H0pqTUt+TebzB83BzA==33true0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz2020-01-27T20:56:51.000Z"446fc665f99183cd0540d7656a79d3ed"386910STANDARD04a0a508-459a-4758-ac40-c3e8cb966683/30520ecd-c6bd-4039-9b1a-d3f999235598.FPKM-UQ.txt.gz2020-01-27T20:56:50.000Z"a2c6997aa0c6a9fd697af3e0517d96be"388349STANDARD0541851c-ac0c-496e-93d2-3c03921fa6bd/c92f3dc4-24ea-457b-b90a-d6d599b14a73.rna_seq.star_gene_counts.tsv.gz2020-01-27T20:56:51.000Z"f2c4e159c9b2f4233c4c0c27f4c25472"396626STANDARD" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "traffic recording of optional auth (no Authorization header is included)", + "version": "V0" +} diff --git a/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects.json b/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects.json new file mode 100644 index 00000000000..9b9b01c5a54 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects.json @@ -0,0 +1,93 @@ +{ + "events": [ + { + "connection_id": 0, + "action": { + "Request": { + "request": { + "uri": "https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/?max-keys=3", + "headers": { + "x-amz-user-agent": [ + "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" + ], + "amz-sdk-request": [ + "attempt=1; max=3" + ], + "user-agent": [ + "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" + ] + }, + "method": "GET" + } + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Request" + } + } + }, + { + "connection_id": 0, + "action": { + "Response": { + "response": { + "Ok": { + "status": 200, + "version": "HTTP/1.1", + "headers": { + "transfer-encoding": [ + "chunked" + ], + "server": [ + "AmazonS3" + ], + "x-amz-id-2": [ + "9/ufVv0fY5POrsdgAV2QMGmmpa78fx0YlL5KkQHzg46B0/NAWr/l0YsmR/F2HPn8ByFIwO5NdFs=" + ], + "x-amz-bucket-region": [ + "us-east-1" + ], + "date": [ + "Mon, 07 Aug 2023 20:44:40 GMT" + ], + "x-amz-request-id": [ + "QJE4M4NA5KFKN6YA" + ], + "content-type": [ + "application/xml" + ] + } + } + } + } + } + }, + { + "connection_id": 0, + "action": { + "Data": { + "data": { + "Utf8": "\ngdc-organoid-pancreatic-phs001611-2-open3true0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz2020-01-27T20:56:51.000Z"446fc665f99183cd0540d7656a79d3ed"386910118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08dcfopen-bucketsSTANDARD04a0a508-459a-4758-ac40-c3e8cb966683/30520ecd-c6bd-4039-9b1a-d3f999235598.FPKM-UQ.txt.gz2020-01-27T20:56:50.000Z"a2c6997aa0c6a9fd697af3e0517d96be"388349118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08dcfopen-bucketsSTANDARD0541851c-ac0c-496e-93d2-3c03921fa6bd/c92f3dc4-24ea-457b-b90a-d6d599b14a73.rna_seq.star_gene_counts.tsv.gz2020-01-27T20:56:51.000Z"f2c4e159c9b2f4233c4c0c27f4c25472"396626118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08dcfopen-bucketsSTANDARD" + }, + "direction": "Response" + } + } + }, + { + "connection_id": 0, + "action": { + "Eof": { + "ok": true, + "direction": "Response" + } + } + } + ], + "docs": "traffic recording of optional auth (no Authorization header is included)", + "version": "V0" +} diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/slow-network-and-late-client-clock.json b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/slow-network-and-late-client-clock.json similarity index 100% rename from aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/slow-network-and-late-client-clock.json rename to aws/sdk/integration-tests/s3/tests/data/request-information-headers/slow-network-and-late-client-clock.json diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-retries_and-then-success.json b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json similarity index 82% rename from aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-retries_and-then-success.json rename to aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json index b0aee248616..141ded94ec3 100644 --- a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-retries_and-then-success.json +++ b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json @@ -11,7 +11,7 @@ "notarealsessiontoken" ], "authorization": [ - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82" + "AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=43970cfd0324cb28a86459789b7a1c7684cf54b0b3c9842a84f3b24343fa038a" ], "x-amz-user-agent": [ "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" @@ -55,9 +55,6 @@ "status": 500, "version": "HTTP/1.1", "headers": { - "server": [ - "AmazonS3" - ], "x-amz-request-id": [ "foo-id" ], @@ -87,7 +84,7 @@ "action": { "Data": { "data": { - "Utf8": "\n \"\n Server\n InternalError\n We encountered an internal error. Please try again.\n foo-id\n\"" + "Utf8": "\n \n Server\n InternalError\n We encountered an internal error. Please try again.\n foo-id\n" }, "direction": "Response" } @@ -103,7 +100,7 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Request": { "request": { @@ -113,7 +110,7 @@ "notarealsessiontoken" ], "authorization": [ - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82" + "AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=6d0f0da831a7d3ad1bde4e98580177bc0ef0acc21064dd26394006006392cb14" ], "x-amz-user-agent": [ "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" @@ -140,7 +137,7 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Eof": { "ok": true, @@ -149,7 +146,7 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Response": { "response": { @@ -157,9 +154,6 @@ "status": 500, "version": "HTTP/1.1", "headers": { - "server": [ - "AmazonS3" - ], "x-amz-request-id": [ "foo-id" ], @@ -185,18 +179,18 @@ } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Data": { "data": { - "Utf8": "\n \"\n Server\n InternalError\n We encountered an internal error. Please try again.\n foo-id\n\"" + "Utf8": "\n \n Server\n InternalError\n We encountered an internal error. Please try again.\n foo-id\n" }, "direction": "Response" } } }, { - "connection_id": 0, + "connection_id": 1, "action": { "Eof": { "ok": true, @@ -205,7 +199,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Request": { "request": { @@ -215,7 +209,7 @@ "notarealsessiontoken" ], "authorization": [ - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82" + "AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=8160b1d1200c10cde681ac6f4490c98023af9c4b3b8fd8a82e7560f87c126a53" ], "x-amz-user-agent": [ "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" @@ -242,7 +236,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Eof": { "ok": true, @@ -251,7 +245,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Response": { "response": { @@ -287,7 +281,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Data": { "data": { @@ -298,7 +292,7 @@ } }, { - "connection_id": 0, + "connection_id": 2, "action": { "Eof": { "ok": true, diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-successful-attempts.json b/aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-successful-attempts.json similarity index 100% rename from aws/sra-test/integration-tests/aws-sdk-s3/test-data/request-information-headers/three-successful-attempts.json rename to aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-successful-attempts.json diff --git a/aws/sdk/integration-tests/s3/tests/endpoints.rs b/aws/sdk/integration-tests/s3/tests/endpoints.rs index ec87eac2a39..3bd3e27fe4d 100644 --- a/aws/sdk/integration-tests/s3/tests/endpoints.rs +++ b/aws/sdk/integration-tests/s3/tests/endpoints.rs @@ -3,22 +3,23 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::Builder; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::{capture_request, CaptureRequestReceiver}; -use std::time::{Duration, UNIX_EPOCH}; +use aws_sdk_s3::{Client, Config}; +use aws_smithy_runtime::client::http::test_util::{capture_request, CaptureRequestReceiver}; fn test_client(update_builder: fn(Builder) -> Builder) -> (CaptureRequestReceiver, Client) { - let (conn, captured_request) = capture_request(None); - let sdk_config = SdkConfig::builder() + let (http_client, captured_request) = capture_request(None); + let config = Config::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-west-4")) - .http_connector(conn) - .build(); - let client = Client::from_conf(update_builder(Builder::from(&sdk_config)).build()); + .http_client(http_client) + .behavior_version(aws_sdk_s3::config::BehaviorVersion::latest()) + .with_test_defaults(); + let client = Client::from_conf(update_builder(config).build()); (captured_request, client) } @@ -62,43 +63,30 @@ async fn dual_stack() { ); } -#[cfg(aws_sdk_orchestrator_mode)] #[tokio::test] async fn multi_region_access_points() { - let (_captured_request, client) = test_client(|b| b); - let response = client + let (captured_request, client) = test_client(|b| b); + let _ = client .get_object() .bucket("arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap") .key("blah") .send() .await; - let error = response.expect_err("should fail—sigv4a is not supported"); - assert!( - dbg!(format!( - "{}", - aws_smithy_types::error::display::DisplayErrorContext(&error) - )) - .contains("selected auth scheme / endpoint config mismatch"), - "message should contain the correct error, found: {:?}", - error + let captured_request = captured_request.expect_request(); + assert_eq!( + captured_request.uri().to_string(), + "https://mfzwi23gnjvgw.mrap.accesspoint.s3-global.amazonaws.com/blah?x-id=GetObject" ); -} + let auth_header = captured_request.headers().get("AUTHORIZATION").unwrap(); + // Verifies that the sigv4a signing algorithm was used, that the signing scope doesn't include a region, and that the x-amz-region-set header was signed. + let expected_start = + "AWS4-ECDSA-P256-SHA256 Credential=ANOTREAL/20090213/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-region-set;x-amz-user-agent, Signature="; -#[cfg(not(aws_sdk_orchestrator_mode))] -#[tokio::test] -async fn multi_region_access_points() { - let (_captured_request, client) = test_client(|b| b); - let response = client - .get_object() - .bucket("arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap") - .key("blah") - .send() - .await; - let error = response.expect_err("should fail—sigv4a is not supported"); assert!( - dbg!(format!("{:?}", error)).contains("No auth schemes were supported"), - "message should contain the correct error, found: {:?}", - error + auth_header.starts_with(expected_start), + "expected auth header to start with {} but it was {}", + expected_start, + auth_header ); } @@ -109,17 +97,12 @@ async fn s3_object_lambda() { .get_object() .bucket("arn:aws:s3-object-lambda:us-east-100:123412341234:accesspoint/myolap") .key("s3.txt") - .customize() - .await - .unwrap() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1234567890)) .send() .await .unwrap(); let captured_request = captured_request.expect_request(); assert_eq!(captured_request.uri().to_string(), "https://myolap-123412341234.s3-object-lambda.us-east-100.amazonaws.com/s3.txt?x-id=GetObject"); let auth_header = captured_request.headers().get("AUTHORIZATION").unwrap(); - let auth_header = auth_header.to_str().unwrap(); // verifies that both the signing scope (s3-object-lambda) has been set as well as the ARN region // us-east-100 let expected_start = @@ -156,14 +139,16 @@ async fn s3_object_lambda_no_cross_region() { #[tokio::test] async fn write_get_object_response() { let (req, client) = test_client(|b| b); - let _write = client - .write_get_object_response() - .request_route("req-route") - .request_token("token") - .status_code(200) - .body(vec![1, 2, 3].into()) - .send() - .await; + let _write = dbg!( + client + .write_get_object_response() + .request_route("req-route") + .request_token("token") + .status_code(200) + .body(vec![1, 2, 3].into()) + .send() + .await + ); let captured_request = req.expect_request(); assert_eq!( diff --git a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs index 3e55ffe9c3c..89b15ba58c6 100644 --- a/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs +++ b/aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs @@ -3,26 +3,26 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; +use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, types::ObjectAttributes, Client}; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_http::body::SdkBody; -use aws_types::SdkConfig; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; use http::header::AUTHORIZATION; -use std::time::{Duration, UNIX_EPOCH}; const RESPONSE_BODY_XML: &[u8] = b"\ne1AsOh9IyGCa4hLN+2Od7jlnP14="; #[tokio::test] async fn ignore_invalid_xml_body_root() { - let conn = TestConnection::new(vec![ - (http::Request::builder() + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new(http::Request::builder() .header("x-amz-object-attributes", "Checksum") .header("x-amz-user-agent", "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0") - .header("x-amz-date", "20210618T170728Z") + .header("x-amz-date", "20090213T233130Z") .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-object-attributes;x-amz-security-token;x-amz-user-agent, Signature=0e6ec749db5a0af07890a83f553319eda95be0e498d058c64880471a474c5378") .header("x-amz-content-sha256", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") - .header("x-amz-security-token", "notarealsessiontoken") .uri(http::Uri::from_static("https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?attributes")) .body(SdkBody::empty()) .unwrap(), @@ -37,30 +37,28 @@ async fn ignore_invalid_xml_body_root() { .header("server", "AmazonS3") .header("content-length", "224") .status(200) - .body(RESPONSE_BODY_XML) + .body(SdkBody::from(RESPONSE_BODY_XML)) .unwrap()) ]); - let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + let config = Config::builder() + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) + .with_test_defaults() .build(); - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let _ = client .get_object_attributes() .bucket("some-test-bucket") .key("test.txt") .object_attributes(ObjectAttributes::Checksum) - .customize() - .await - .unwrap() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await .unwrap(); - conn.assert_requests_match(&[AUTHORIZATION]); + http_client.assert_requests_match(&[AUTHORIZATION.as_str()]); } diff --git a/aws/sdk/integration-tests/s3/tests/interceptors.rs b/aws/sdk/integration-tests/s3/tests/interceptors.rs new file mode 100644 index 00000000000..b8e1e07c499 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/interceptors.rs @@ -0,0 +1,117 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_s3::config::interceptors::BeforeTransmitInterceptorContextMut; +use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::Client; +use aws_smithy_runtime::client::http::test_util::capture_request; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; +use http::header::USER_AGENT; +use http::HeaderValue; + +#[tokio::test] +async fn interceptor_priority() { + #[derive(Debug, Eq, PartialEq)] + struct TestValue(&'static str); + impl Storable for TestValue { + type Storer = StoreReplace; + } + + #[derive(Debug)] + struct TestInterceptor(&'static str); + impl Intercept for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + + fn modify_before_signing( + &self, + _context: &mut BeforeTransmitInterceptorContextMut<'_>, + _components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let mut layer = Layer::new("test"); + layer.store_put(TestValue(self.0)); + cfg.push_layer(layer); + Ok(()) + } + + fn modify_before_transmit( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let value = cfg.load::().unwrap(); + context + .request_mut() + .headers_mut() + .insert("test-header", HeaderValue::from_static(value.0)); + Ok(()) + } + } + + let (http_client, rx) = capture_request(None); + + // The first `TestInterceptor` will put `value1` into config + let config = aws_sdk_s3::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .http_client(http_client) + .interceptor(TestInterceptor("value1")) + .build(); + let client = Client::from_conf(config); + + // The second `TestInterceptor` will replace `value1` with `value2` in config + dbg!( + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .customize() + .interceptor(TestInterceptor("value2")) + .send() + .await + ) + .expect_err("no fake response set"); + + let request = rx.expect_request(); + assert_eq!("value2", request.headers().get("test-header").unwrap()); +} + +#[tokio::test] +async fn set_test_user_agent_through_request_mutation() { + let (http_client, rx) = capture_request(None); + + let config = aws_sdk_s3::Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .http_client(http_client.clone()) + .build(); + let client = Client::from_conf(config); + + dbg!( + client + .list_objects_v2() + .bucket("test-bucket") + .prefix("prefix~") + .customize() + .mutate_request(|request| { + let headers = request.headers_mut(); + headers.insert(USER_AGENT, HeaderValue::try_from("test").unwrap()); + headers.insert("x-amz-user-agent", HeaderValue::try_from("test").unwrap()); + }) + .send() + .await + ) + .expect_err("no fake response set"); + + let request = rx.expect_request(); + assert_eq!("test", request.headers().get(USER_AGENT).unwrap()); + assert_eq!("test", request.headers().get("x-amz-user-agent").unwrap()); +} diff --git a/aws/sdk/integration-tests/s3/tests/make-connector-override.rs b/aws/sdk/integration-tests/s3/tests/make-connector-override.rs deleted file mode 100644 index 90eb79d70c8..00000000000 --- a/aws/sdk/integration-tests/s3/tests/make-connector-override.rs +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_credential_types::Credentials; -use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - -use aws_smithy_client::http_connector::{ConnectorSettings, HttpConnector}; -use aws_smithy_client::test_connection; - -use aws_smithy_http::result::SdkError; -use aws_smithy_types::timeout::TimeoutConfig; -use aws_types::region::Region; -use aws_types::SdkConfig; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; -use std::time::Duration; -use tokio::time::Instant; - -/// Verify that `make_connector_fn` isn't called per request -#[tokio::test] -async fn make_connector_fn_test() { - let sentinel = Arc::new(AtomicUsize::new(0)); - let connector_sentinel = sentinel.clone(); - let connector_with_counter = HttpConnector::ConnectorFn(Arc::new( - move |_settings: &ConnectorSettings, _sleep: Option| { - connector_sentinel.fetch_add(1, Ordering::Relaxed); - Some(test_connection::infallible_connection_fn(|_req| { - http::Response::builder().status(200).body("ok!").unwrap() - })) - }, - )); - let sdk_config = SdkConfig::builder() - .http_connector(connector_with_counter) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) - .region(Region::from_static("us-east-1")) - .build(); - let client = aws_sdk_s3::Client::new(&sdk_config); - assert_eq!(sentinel.load(Ordering::Relaxed), 1); - for _ in 0..10 { - let _ = client - .get_object() - .bucket("foo") - .key("bar") - .send() - .await - .expect("test connector replies with 200"); - } - assert_eq!(sentinel.load(Ordering::Relaxed), 1); - // but creating another client creates another connector - let _client_2 = aws_sdk_s3::Client::new(&sdk_config); - assert_eq!(sentinel.load(Ordering::Relaxed), 2); -} - -/// Use a 5 second operation timeout on SdkConfig and a 0ms connect timeout on the service config -#[tokio::test] -async fn timeouts_can_be_set_by_service() { - let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) - .region(Region::from_static("us-east-1")) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_secs(5)) - .build(), - ) - // ip that - .endpoint_url( - // Emulate a connect timeout error by hitting an unroutable IP - "http://172.255.255.0:18104", - ) - .build(); - let config = aws_sdk_s3::config::Builder::from(&sdk_config) - .timeout_config( - TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(0)) - .build(), - ) - .build(); - let client = aws_sdk_s3::Client::from_conf(config); - let start = Instant::now(); - let err = client - .get_object() - .key("foo") - .bucket("bar") - .send() - .await - .expect_err("unroutable IP should timeout"); - match err { - SdkError::DispatchFailure(err) => assert!(err.is_timeout()), - // if the connect timeout is not respected, this times out after 1 second because of the operation timeout with `SdkError::Timeout` - _other => panic!("unexpected error: {:?}", _other), - } - // there should be a 0ms timeout, we gotta set some stuff up. Just want to make sure - // it's shorter than the 5 second timeout if the test is broken - assert!(start.elapsed() < Duration::from_millis(500)); -} diff --git a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs index 96142f2b43d..3b6bd970029 100644 --- a/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs +++ b/aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs @@ -3,12 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; +use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, primitives::ByteStream, Client}; -use aws_smithy_client::test_connection::capture_request; -use aws_types::SdkConfig; +use aws_smithy_runtime::client::http::test_util::capture_request; use http::HeaderValue; -use std::time::{Duration, UNIX_EPOCH}; const NAUGHTY_STRINGS: &str = include_str!("blns/blns.txt"); @@ -48,13 +49,14 @@ const NAUGHTY_STRINGS: &str = include_str!("blns/blns.txt"); #[tokio::test] async fn test_s3_signer_with_naughty_string_metadata() { - let (conn, rcvr) = capture_request(None); - let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + let (http_client, rcvr) = capture_request(None); + let config = Config::builder() + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) - .build(); - let config = aws_sdk_s3::config::Builder::from(&sdk_config) + .http_client(http_client.clone()) + .with_test_defaults() .force_path_style(true) .build(); @@ -75,15 +77,7 @@ async fn test_s3_signer_with_naughty_string_metadata() { } } - let _ = builder - .customize() - .await - .unwrap() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() - .send() - .await - .unwrap(); + let _ = builder.send().await.unwrap(); let expected_req = rcvr.expect_request(); let auth_header = expected_req @@ -94,14 +88,11 @@ async fn test_s3_signer_with_naughty_string_metadata() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=8dfa41f2db599a9fba53393b0ae5da646e5e452fa3685f7a1487d6eade5ec5c8"; + "Signature=a5115604df66219874a9e5a8eab4c9f7a28c992ab2d918037a285756c019f3b2"; assert!( - auth_header - .to_str() - .unwrap() - .contains(snapshot_signature), + auth_header .contains(snapshot_signature), "authorization header signature did not match expected signature: got {}, expected it to contain {}", - auth_header.to_str().unwrap(), + auth_header, snapshot_signature ); } diff --git a/aws/sdk/integration-tests/s3/tests/no_auth.rs b/aws/sdk/integration-tests/s3/tests/no_auth.rs new file mode 100644 index 00000000000..170332d00d6 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/no_auth.rs @@ -0,0 +1,133 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_s3::{Client, Config}; +use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; + +#[tokio::test] +async fn list_objects() { + let _logs = capture_test_logs(); + + let http_client = ReplayingClient::from_file("tests/data/no_auth/list-objects.json").unwrap(); + let config = aws_config::from_env() + .http_client(http_client.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let config = Config::from(&config) + .to_builder() + .with_test_defaults() + .build(); + let client = aws_sdk_s3::Client::from_conf(config); + + let result = client + .list_objects() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .max_keys(3) + .send() + .await; + dbg!(result).expect("success"); + + http_client + .validate_body_and_headers(None, "application/xml") + .await + .unwrap(); +} + +#[tokio::test] +async fn list_objects_v2() { + let _logs = capture_test_logs(); + + let http_client = + ReplayingClient::from_file("tests/data/no_auth/list-objects-v2.json").unwrap(); + let config = aws_config::from_env() + .http_client(http_client.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let config = Config::from(&config) + .to_builder() + .with_test_defaults() + .build(); + let client = Client::from_conf(config); + + let result = client + .list_objects_v2() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .max_keys(3) + .send() + .await; + dbg!(result).expect("success"); + + http_client + .validate_body_and_headers(None, "application/xml") + .await + .unwrap(); +} + +#[tokio::test] +async fn head_object() { + let _logs = capture_test_logs(); + + let http_client = ReplayingClient::from_file("tests/data/no_auth/head-object.json").unwrap(); + let config = aws_config::from_env() + .http_client(http_client.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let config = Config::from(&config) + .to_builder() + .with_test_defaults() + .build(); + let client = Client::from_conf(config); + + let result = client + .head_object() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") + .send() + .await; + dbg!(result).expect("success"); + + http_client + .validate_body_and_headers(None, "application/xml") + .await + .unwrap(); +} + +#[tokio::test] +async fn get_object() { + let _logs = capture_test_logs(); + + let http_client = ReplayingClient::from_file("tests/data/no_auth/get-object.json").unwrap(); + let config = aws_config::from_env() + .http_client(http_client.clone()) + .no_credentials() + .region("us-east-1") + .load() + .await; + let config = Config::from(&config) + .to_builder() + .with_test_defaults() + .build(); + let client = Client::from_conf(config); + + let result = client + .get_object() + .bucket("gdc-organoid-pancreatic-phs001611-2-open") + .key("0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz") + .send() + .await; + dbg!(result).expect("success"); + + http_client + .validate_body_and_headers(None, "application/xml") + .await + .unwrap(); +} diff --git a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs index a50867ccd0f..11ee0f7b092 100644 --- a/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs +++ b/aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs @@ -3,23 +3,24 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::primitives::ByteStream; +use aws_sdk_s3::Config; use aws_sdk_s3::{config::Credentials, config::Region, Client}; -use aws_smithy_client::test_connection::capture_request; -use std::time::{Duration, UNIX_EPOCH}; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn test_operation_should_not_normalize_uri_path() { - let (conn, rx) = capture_request(None); - let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + let (http_client, rx) = capture_request(None); + let config = Config::builder() + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) + .with_test_defaults() .build(); - - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let bucket_name = "test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1"; @@ -28,11 +29,6 @@ async fn test_operation_should_not_normalize_uri_path() { .bucket(bucket_name) .key("a/.././b.txt") // object key with dot segments .body(ByteStream::from_static("Hello, world".as_bytes())) - .customize() - .await - .unwrap() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1669257290)) - .user_agent_for_tests() .send() .await .unwrap(); @@ -41,11 +37,11 @@ async fn test_operation_should_not_normalize_uri_path() { let actual_auth = std::str::from_utf8(request.headers().get("authorization").unwrap().as_bytes()).unwrap(); - let actual_uri = request.uri().path(); - let expected_uri = "/a/.././b.txt"; + let actual_uri = request.uri(); + let expected_uri = "https://test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1.s3.us-east-1.amazonaws.com/a/.././b.txt?x-id=PutObject"; assert_eq!(actual_uri, expected_uri); - let expected_sig = "Signature=4803b8b8c794b5ecc055933befd7c5547f8bf6585bb18e4ae33ff65220d5cdd7"; + let expected_sig = "Signature=2ac540538c84dc2616d92fb51d4fc6146ccd9ccc1ee85f518a1a686c5ef97b86"; assert!( actual_auth.contains(expected_sig), "authorization header signature did not match expected signature: expected {} but not found in {}", diff --git a/aws/sdk/integration-tests/s3/tests/presigning.rs b/aws/sdk/integration-tests/s3/tests/presigning.rs index 05625d3405b..768dd563bb5 100644 --- a/aws/sdk/integration-tests/s3/tests/presigning.rs +++ b/aws/sdk/integration-tests/s3/tests/presigning.rs @@ -4,10 +4,12 @@ */ use aws_sdk_s3 as s3; +use std::collections::HashMap; + use futures_util::future::FutureExt; use futures_util::Future; use http::header::{CONTENT_LENGTH, CONTENT_TYPE}; -use http::{HeaderMap, HeaderValue}; +use http::Uri; use s3::config::{Credentials, Region}; use s3::operation::get_object::builders::GetObjectFluentBuilder; use s3::operation::head_object::builders::HeadObjectFluentBuilder; @@ -49,7 +51,7 @@ where O: FnOnce(s3::Client) -> F, F: TestOperation, { - let creds = Credentials::for_tests(); + let creds = Credentials::for_tests_with_session_token(); let config = s3::Config::builder() .credentials_provider(creds) .region(Region::new("us-east-1")) @@ -71,8 +73,9 @@ where async fn test_presigning() { let presigned = presign(|client| client.get_object().bucket("test-bucket").key("test-key")).await; + let uri = presigned.uri().parse::().unwrap(); - let pq = presigned.uri().path_and_query().unwrap(); + let pq = uri.path_and_query().unwrap(); let path = pq.path(); let query = pq.query().unwrap(); let mut query_params: Vec<&str> = query.split('&').collect(); @@ -80,9 +83,9 @@ async fn test_presigning() { pretty_assertions::assert_eq!( "test-bucket.s3.us-east-1.amazonaws.com", - presigned.uri().authority().unwrap() + uri.authority().unwrap() ); - assert_eq!("GET", presigned.method().as_str()); + assert_eq!("GET", presigned.method()); assert_eq!("/test-key", path); pretty_assertions::assert_eq!( &[ @@ -97,7 +100,7 @@ async fn test_presigning() { ][..], &query_params ); - assert!(presigned.headers().is_empty()); + assert_eq!(presigned.headers().count(), 0); } #[tokio::test] @@ -111,8 +114,9 @@ async fn test_presigning_with_payload_headers() { .content_type("application/x-test") }) .await; + let uri = presigned.uri().parse::().unwrap(); - let pq = presigned.uri().path_and_query().unwrap(); + let pq = uri.path_and_query().unwrap(); let path = pq.path(); let query = pq.query().unwrap(); let mut query_params: Vec<&str> = query.split('&').collect(); @@ -120,9 +124,9 @@ async fn test_presigning_with_payload_headers() { pretty_assertions::assert_eq!( "test-bucket.s3.us-east-1.amazonaws.com", - presigned.uri().authority().unwrap() + uri.authority().unwrap() ); - assert_eq!("PUT", presigned.method().as_str()); + assert_eq!("PUT", presigned.method()); assert_eq!("/test-key", path); pretty_assertions::assert_eq!( &[ @@ -137,11 +141,14 @@ async fn test_presigning_with_payload_headers() { ][..], &query_params ); + let headers = presigned.headers().collect::>(); - let mut expected_headers = HeaderMap::new(); - expected_headers.insert(CONTENT_LENGTH, HeaderValue::from_static("12345")); - expected_headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/x-test")); - assert_eq!(&expected_headers, presigned.headers()); + assert_eq!( + headers.get(CONTENT_TYPE.as_str()), + Some(&"application/x-test") + ); + assert_eq!(headers.get(CONTENT_LENGTH.as_str()), Some(&"12345")); + assert_eq!(headers.len(), 2); } #[tokio::test] @@ -182,7 +189,7 @@ async fn test_presigning_object_lambda() { async fn test_presigned_head_object() { let presigned = presign(|client| client.head_object().bucket("bucket").key("key")).await; - assert_eq!("HEAD", presigned.method().as_str()); + assert_eq!("HEAD", presigned.method()); pretty_assertions::assert_eq!( "https://bucket.s3.us-east-1.amazonaws.com/key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20090213T233131Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host&X-Amz-Signature=6b97012e70d5ee3528b5591e0e90c0f45e0fa303506f854eff50ff922751a193&X-Amz-Security-Token=notarealsessiontoken", presigned.uri().to_string(), diff --git a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs index 7d7880fa81a..53560e3bebc 100644 --- a/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs +++ b/aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs @@ -3,23 +3,26 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; -use std::time::{Duration, UNIX_EPOCH}; +use aws_sdk_s3::operation::list_objects_v2::ListObjectsV2Error; +use aws_sdk_s3::{Client, Config}; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn test_s3_signer_query_string_with_all_valid_chars() { - let (conn, rcvr) = capture_request(None); - let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + let (http_client, rcvr) = capture_request(None); + let config = Config::builder() + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) + .with_test_defaults() .build(); - - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); // Generate a string containing all printable ASCII chars let prefix: String = (32u8..127).map(char::from).collect(); @@ -30,11 +33,6 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { .list_objects_v2() .bucket("test-bucket") .prefix(&prefix) - .customize() - .await - .unwrap() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await; @@ -47,14 +45,12 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { // This is a snapshot test taken from a known working test result let snapshot_signature = - "Signature=647aa91c7f91f1f1c498ef376fea370b48d0cd8c80a53c8e2cd64e3fc527a5e0"; + "Signature=9a931d20606f93fa4e5553602866a9b5ccac2cd42b54ae5a4b17e4614fb443ce"; assert!( auth_header - .to_str() - .unwrap() .contains(snapshot_signature), "authorization header signature did not match expected signature: got {}, expected it to contain {}", - auth_header.to_str().unwrap(), + auth_header, snapshot_signature ); } @@ -63,9 +59,9 @@ async fn test_s3_signer_query_string_with_all_valid_chars() { // test must be run against an actual bucket so we `ignore` it unless the runner specifically requests it #[tokio::test] #[ignore] +#[allow(deprecated)] async fn test_query_strings_are_correctly_encoded() { - use aws_sdk_s3::operation::list_objects_v2::ListObjectsV2Error; - use aws_smithy_http::result::SdkError; + use aws_smithy_runtime_api::client::result::SdkError; tracing_subscriber::fmt::init(); let config = aws_config::load_from_env().await; @@ -85,22 +81,19 @@ async fn test_query_strings_are_correctly_encoded() { .send() .await; if let Err(SdkError::ServiceError(context)) = res { - match context.err() { - ListObjectsV2Error::Unhandled(e) - if e.to_string().contains("SignatureDoesNotMatch") => - { - chars_that_break_signing.push(byte); - } - ListObjectsV2Error::Unhandled(e) if e.to_string().contains("InvalidUri") => { - chars_that_break_uri_parsing.push(byte); - } - ListObjectsV2Error::Unhandled(e) if e.to_string().contains("InvalidArgument") => { - chars_that_are_invalid_arguments.push(byte); - } - ListObjectsV2Error::Unhandled(e) if e.to_string().contains("InvalidToken") => { - panic!("refresh your credentials and run this test again"); - } - e => todo!("unexpected error: {:?}", e), + let err = context.err(); + let msg = err.to_string(); + let unhandled = matches!(err, ListObjectsV2Error::Unhandled(_)); + if unhandled && msg.contains("SignatureDoesNotMatch") { + chars_that_break_signing.push(byte); + } else if unhandled && msg.to_string().contains("InvalidUri") { + chars_that_break_uri_parsing.push(byte); + } else if unhandled && msg.to_string().contains("InvalidArgument") { + chars_that_are_invalid_arguments.push(byte); + } else if unhandled && msg.to_string().contains("InvalidToken") { + panic!("refresh your credentials and run this test again"); + } else { + todo!("unexpected error: {:?}", err); } } } diff --git a/aws/sdk/integration-tests/s3/tests/reconnects.rs b/aws/sdk/integration-tests/s3/tests/reconnects.rs index cb29bb2a66b..5390cb2850c 100644 --- a/aws/sdk/integration-tests/s3/tests/reconnects.rs +++ b/aws/sdk/integration-tests/s3/tests/reconnects.rs @@ -6,14 +6,12 @@ use aws_sdk_s3::config::retry::{ReconnectMode, RetryConfig}; use aws_sdk_s3::config::{Credentials, Region, SharedAsyncSleep}; use aws_smithy_async::rt::sleep::TokioSleep; -use aws_smithy_client::test_connection::wire_mock::{ - check_matches, ReplayedEvent, WireLevelTestConnection, -}; -use aws_smithy_client::{ev, match_events}; +use aws_smithy_runtime::client::http::test_util::wire::{ReplayedEvent, WireMockServer}; +use aws_smithy_runtime::{ev, match_events}; #[tokio::test] async fn test_disable_reconnect_on_503() { - let mock = WireLevelTestConnection::spinup(vec![ + let mock = WireMockServer::start(vec![ ReplayedEvent::status(503), ReplayedEvent::status(503), ReplayedEvent::with_body("here-is-your-object"), @@ -25,7 +23,7 @@ async fn test_disable_reconnect_on_503() { .credentials_provider(Credentials::for_tests()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .endpoint_url(mock.endpoint_url()) - .http_connector(mock.http_connector()) + .http_client(mock.http_client()) .retry_config( RetryConfig::standard().with_reconnect_mode(ReconnectMode::ReuseAllConnections), ) @@ -53,7 +51,7 @@ async fn test_disable_reconnect_on_503() { #[tokio::test] async fn test_enabling_reconnect_on_503() { - let mock = WireLevelTestConnection::spinup(vec![ + let mock = WireMockServer::start(vec![ ReplayedEvent::status(503), ReplayedEvent::status(503), ReplayedEvent::with_body("here-is-your-object"), @@ -65,7 +63,7 @@ async fn test_enabling_reconnect_on_503() { .credentials_provider(Credentials::for_tests()) .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .endpoint_url(mock.endpoint_url()) - .http_connector(mock.http_connector()) + .http_client(mock.http_client()) .retry_config( RetryConfig::standard().with_reconnect_mode(ReconnectMode::ReconnectOnTransientError), ) diff --git a/aws/sdk/integration-tests/s3/tests/recursion-detection.rs b/aws/sdk/integration-tests/s3/tests/recursion-detection.rs index f0aa974d8e1..adcd13a20c3 100644 --- a/aws/sdk/integration-tests/s3/tests/recursion-detection.rs +++ b/aws/sdk/integration-tests/s3/tests/recursion-detection.rs @@ -7,18 +7,17 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; -use http::HeaderValue; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn recursion_detection_applied() { std::env::set_var("AWS_LAMBDA_FUNCTION_NAME", "some-function"); std::env::set_var("_X_AMZN_TRACE_ID", "traceid"); - let (conn, captured_request) = capture_request(None); + let (http_client, captured_request) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .build(); let client = Client::new(&sdk_config); let _ = client.list_objects_v2().bucket("test-bucket").send().await; @@ -27,6 +26,6 @@ async fn recursion_detection_applied() { .expect_request() .headers() .get("x-amzn-trace-id"), - Some(&HeaderValue::from_static("traceid")) + Some("traceid") ); } diff --git a/aws/sdk/integration-tests/s3/tests/request_id.rs b/aws/sdk/integration-tests/s3/tests/request_id.rs index d81da66b42b..886b2d5bafb 100644 --- a/aws/sdk/integration-tests/s3/tests/request_id.rs +++ b/aws/sdk/integration-tests/s3/tests/request_id.rs @@ -6,12 +6,12 @@ use aws_sdk_s3::operation::get_object::GetObjectError; use aws_sdk_s3::operation::{RequestId, RequestIdExt}; use aws_sdk_s3::{config::Credentials, config::Region, Client, Config}; -use aws_smithy_client::test_connection::capture_request; -use aws_smithy_http::body::SdkBody; +use aws_smithy_runtime::client::http::test_util::capture_request; +use aws_smithy_types::body::SdkBody; #[tokio::test] async fn get_request_id_from_modeled_error() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -28,7 +28,7 @@ async fn get_request_id_from_modeled_error() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -36,6 +36,7 @@ async fn get_request_id_from_modeled_error() { let err = client .get_object() .key("dontcare") + .bucket("dontcare") .send() .await .expect_err("status was 404, this is an error") @@ -58,8 +59,9 @@ async fn get_request_id_from_modeled_error() { } #[tokio::test] +#[allow(deprecated)] async fn get_request_id_from_unmodeled_error() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -76,13 +78,14 @@ async fn get_request_id_from_unmodeled_error() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); let client = Client::from_conf(config); let err = client .get_object() + .bucket("dontcare") .key("dontcare") .send() .await @@ -104,7 +107,7 @@ async fn get_request_id_from_unmodeled_error() { #[tokio::test] async fn get_request_id_from_successful_nonstreaming_response() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -119,7 +122,7 @@ async fn get_request_id_from_successful_nonstreaming_response() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -139,7 +142,7 @@ async fn get_request_id_from_successful_nonstreaming_response() { #[tokio::test] async fn get_request_id_from_successful_streaming_response() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -148,7 +151,7 @@ async fn get_request_id_from_successful_streaming_response() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -156,6 +159,7 @@ async fn get_request_id_from_successful_streaming_response() { let output = client .get_object() .key("dontcare") + .bucket("dontcare") .send() .await .expect("valid successful response"); @@ -170,7 +174,7 @@ async fn get_request_id_from_successful_streaming_response() { // Verify that the conversion from operation error to the top-level service error maintains the request ID #[tokio::test] async fn conversion_to_service_error_maintains_request_id() { - let (conn, request) = capture_request(Some( + let (http_client, request) = capture_request(Some( http::Response::builder() .header("x-amz-request-id", "correct-request-id") .header("x-amz-id-2", "correct-extended-request-id") @@ -187,13 +191,14 @@ async fn conversion_to_service_error_maintains_request_id() { .unwrap(), )); let config = Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); let client = Client::from_conf(config); let err = client .get_object() + .bucket("dontcare") .key("dontcare") .send() .await diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/tests/request_information_headers.rs b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs similarity index 70% rename from aws/sra-test/integration-tests/aws-sdk-s3/tests/request_information_headers.rs rename to aws/sdk/integration-tests/s3/tests/request_information_headers.rs index 28a8df6c04e..e12a4317a95 100644 --- a/aws/sra-test/integration-tests/aws-sdk-s3/tests/request_information_headers.rs +++ b/aws/sdk/integration-tests/s3/tests/request_information_headers.rs @@ -4,26 +4,24 @@ */ use aws_http::user_agent::AwsUserAgent; -use aws_runtime::invocation_id::InvocationId; +use aws_runtime::invocation_id::{InvocationId, PredefinedInvocationIdGenerator}; +use aws_sdk_s3::config::interceptors::BeforeSerializationInterceptorContextMut; +use aws_sdk_s3::config::interceptors::FinalizerInterceptorContextRef; +use aws_sdk_s3::config::retry::RetryConfig; +use aws_sdk_s3::config::timeout::TimeoutConfig; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::endpoint::Params; +use aws_sdk_s3::config::{Intercept, SharedAsyncSleep}; use aws_sdk_s3::Client; -use aws_smithy_client::dvr; -use aws_smithy_client::dvr::MediaType; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_runtime::client::retries::strategy::FixedDelayRetryStrategy; -use aws_smithy_runtime_api::client::interceptors::InterceptorRegistrar; -use aws_smithy_runtime_api::client::orchestrator::ConfigBagAccessors; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::client::orchestrator::ConfigBagAccessors; -use aws_smithy_types::config_bag::ConfigBag; +use aws_smithy_async::test_util::InstantSleep; +use aws_smithy_async::test_util::ManualTimeSource; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Layer}; use std::time::{Duration, UNIX_EPOCH}; -#[derive(Debug)] -struct FixupPlugin { - client: Client, -} - // # One SDK operation invocation. // # Client retries 3 times, successful response on 3rd attempt. // # Fast network, latency + server time is less than one second. @@ -31,55 +29,83 @@ struct FixupPlugin { // # Client waits 1 second between retry attempts. #[tokio::test] async fn three_retries_and_then_success() { - tracing_subscriber::fmt::init(); + let _logs = capture_test_logs(); + + #[derive(Debug)] + struct TimeInterceptor { + time_source: ManualTimeSource, + } + impl Intercept for TimeInterceptor { + fn name(&self) -> &'static str { + "TimeInterceptor" + } - impl RuntimePlugin for FixupPlugin { - fn configure( + fn modify_before_serialization( &self, + _context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, - _interceptors: &mut InterceptorRegistrar, - ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { - let params_builder = Params::builder() - .set_region(self.client.conf().region().map(|c| c.as_ref().to_string())) - .bucket("test-bucket"); + ) -> Result<(), BoxError> { + let mut layer = Layer::new("test"); + layer.store_put(AwsUserAgent::for_tests()); + cfg.push_layer(layer); + Ok(()) + } - cfg.put(params_builder); - cfg.put(AwsUserAgent::for_tests()); - cfg.put(InvocationId::for_tests()); - cfg.set_retry_strategy(FixedDelayRetryStrategy::one_second_delay()); + fn read_after_attempt( + &self, + _context: &FinalizerInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.time_source.advance(Duration::from_secs(1)); + tracing::info!( + "################ ADVANCED TIME BY 1 SECOND, {:?}", + &self.time_source + ); Ok(()) } } - let path = "test-data/request-information-headers/three-retries_and-then-success.json"; - let conn = dvr::ReplayingConnection::from_file(path).unwrap(); + let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1559347200)); + + let path = "tests/data/request-information-headers/three-retries_and-then-success.json"; + let http_client = ReplayingClient::from_file(path).unwrap(); let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) + .credentials_provider(Credentials::for_tests_with_session_token()) .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .time_source(UNIX_EPOCH + Duration::from_secs(1624036048)) + .http_client(http_client.clone()) + .time_source(SharedTimeSource::new(time_source.clone())) + .sleep_impl(SharedAsyncSleep::new(InstantSleep::new(Default::default()))) + .retry_config(RetryConfig::standard()) + .timeout_config( + TimeoutConfig::builder() + .connect_timeout(Duration::from_secs(10)) + .read_timeout(Duration::from_secs(10)) + .build(), + ) + .invocation_id_generator(PredefinedInvocationIdGenerator::new(vec![ + InvocationId::new_from_str("00000000-0000-4000-8000-000000000000"), + ])) + .interceptor(TimeInterceptor { time_source }) .build(); let client = Client::from_conf(config); - let fixup = FixupPlugin { - client: client.clone(), - }; let resp = dbg!( client .list_objects_v2() .bucket("test-bucket") .prefix("prefix~") - .customize() - .await - .unwrap() - .config_override(aws_sdk_s3::Config::builder().force_path_style(false)) - .send_orchestrator_with_plugin(Some(fixup)) + .send() .await ); let resp = resp.expect("valid e2e test"); assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("failed") + http_client + .full_validate("application/xml") + .await + .expect("failed") } // // // # Client makes 3 separate SDK operation invocations @@ -143,7 +169,7 @@ async fn three_retries_and_then_success() { // let config = aws_sdk_s3::Config::builder() // .credentials_provider(Credentials::for_tests()) // .region(Region::new("us-east-1")) -// .http_connector(DynConnector::new(conn.clone())) +// .http_client(DynConnector::new(conn.clone())) // .build(); // let client = Client::from_conf(config); // let fixup = FixupPlugin { @@ -234,7 +260,7 @@ async fn three_retries_and_then_success() { // let config = aws_sdk_s3::Config::builder() // .credentials_provider(Credentials::for_tests()) // .region(Region::new("us-east-1")) -// .http_connector(DynConnector::new(conn.clone())) +// .http_client(DynConnector::new(conn.clone())) // .build(); // let client = Client::from_conf(config); // let fixup = FixupPlugin { diff --git a/aws/sdk/integration-tests/s3/tests/required-query-params.rs b/aws/sdk/integration-tests/s3/tests/required-query-params.rs index b5fede83a09..d9604260ea2 100644 --- a/aws/sdk/integration-tests/s3/tests/required-query-params.rs +++ b/aws/sdk/integration-tests/s3/tests/required-query-params.rs @@ -6,14 +6,14 @@ use aws_sdk_s3::config::{Credentials, Region}; use aws_sdk_s3::error::DisplayErrorContext; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; -use aws_smithy_http::operation::error::BuildError; +use aws_smithy_runtime::client::http::test_util::capture_request; +use aws_smithy_types::error::operation::BuildError; #[tokio::test] async fn test_error_when_required_query_param_is_unset() { - let (conn, _request) = capture_request(None); + let (http_client, _request) = capture_request(None); let config = aws_sdk_s3::Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); @@ -36,9 +36,9 @@ async fn test_error_when_required_query_param_is_unset() { #[tokio::test] async fn test_error_when_required_query_param_is_set_but_empty() { - let (conn, _request) = capture_request(None); + let (http_client, _request) = capture_request(None); let config = aws_sdk_s3::Config::builder() - .http_connector(conn) + .http_client(http_client) .credentials_provider(Credentials::for_tests()) .region(Region::new("us-east-1")) .build(); diff --git a/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs b/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs new file mode 100644 index 00000000000..3035c7091ea --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs @@ -0,0 +1,135 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_sdk_s3::config::interceptors::InterceptorContext; +use aws_sdk_s3::config::retry::{ClassifyRetry, RetryAction, RetryConfig}; +use aws_sdk_s3::config::SharedAsyncSleep; +use aws_smithy_async::rt::sleep::TokioSleep; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; +use std::sync::{Arc, Mutex}; + +#[derive(Debug, Clone)] +struct CustomizationTestClassifier { + counter: Arc>, +} + +impl CustomizationTestClassifier { + pub fn new() -> Self { + Self { + counter: Arc::new(Mutex::new(0u8)), + } + } + + pub fn counter(&self) -> u8 { + *self.counter.lock().unwrap() + } +} + +impl ClassifyRetry for CustomizationTestClassifier { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + *self.counter.lock().unwrap() += 1; + + // Interceptors may call this classifier before a response is received. If a response was received, + // ensure that it has the expected status code. + if let Some(res) = ctx.response() { + assert_eq!( + 500, + res.status().as_u16(), + "expected a 500 response from test connection" + ); + } + + RetryAction::RetryForbidden + } + + fn name(&self) -> &'static str { + "Custom Retry Classifier" + } +} + +fn req() -> http::Request { + http::Request::builder() + .body(SdkBody::from("request body")) + .unwrap() +} + +fn ok() -> http::Response { + http::Response::builder() + .status(200) + .body(SdkBody::from("Hello!")) + .unwrap() +} + +fn err() -> http::Response { + http::Response::builder() + .status(500) + .body(SdkBody::from("This was an error")) + .unwrap() +} + +#[tokio::test] +async fn test_retry_classifier_customization_for_service() { + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), + ]); + + let customization_test_classifier = CustomizationTestClassifier::new(); + + let config = aws_sdk_s3::Config::builder() + .with_test_defaults() + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .http_client(http_client) + .retry_config(RetryConfig::standard()) + .retry_classifier(customization_test_classifier.clone()) + .build(); + + let client = aws_sdk_s3::Client::from_conf(config); + let _ = client + .get_object() + .bucket("bucket") + .key("key") + .send() + .await + .expect_err("fails without attempting a retry"); + + // ensure our custom retry classifier was called at least once. + assert_ne!(customization_test_classifier.counter(), 0); +} + +#[tokio::test] +async fn test_retry_classifier_customization_for_operation() { + let http_client = StaticReplayClient::new(vec![ + ReplayEvent::new(req(), err()), + ReplayEvent::new(req(), ok()), + ]); + + let customization_test_classifier = CustomizationTestClassifier::new(); + + let config = aws_sdk_s3::Config::builder() + .with_test_defaults() + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .http_client(http_client) + .retry_config(RetryConfig::standard()) + .build(); + + let client = aws_sdk_s3::Client::from_conf(config); + let _ = client + .get_object() + .bucket("bucket") + .key("key") + .customize() + .config_override( + aws_sdk_s3::config::Config::builder() + .retry_classifier(customization_test_classifier.clone()), + ) + .send() + .await + .expect_err("fails without attempting a retry"); + + // ensure our custom retry classifier was called at least once. + assert_ne!(customization_test_classifier.counter(), 0); +} diff --git a/aws/sdk/integration-tests/s3/tests/select-object-content.rs b/aws/sdk/integration-tests/s3/tests/select-object-content.rs index eb4d7a055ca..d9eb6d6df4c 100644 --- a/aws/sdk/integration-tests/s3/tests/select-object-content.rs +++ b/aws/sdk/integration-tests/s3/tests/select-object-content.rs @@ -11,19 +11,19 @@ use aws_sdk_s3::types::{ OutputSerialization, SelectObjectContentEventStream, }; use aws_sdk_s3::Client; -use aws_smithy_client::dvr::{Event, ReplayingConnection}; use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; +use aws_smithy_runtime::client::http::test_util::dvr::{Event, ReplayingClient}; use std::error::Error; #[tokio::test] async fn test_success() { let events: Vec = serde_json::from_str(include_str!("select-object-content.json")).unwrap(); - let replayer = ReplayingConnection::new(events); + let replayer = ReplayingClient::new(events); let sdk_config = SdkConfig::builder() .region(Region::from_static("us-east-2")) .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) - .http_connector(replayer.clone()) + .http_client(replayer.clone()) .build(); let client = Client::new(&sdk_config); @@ -67,7 +67,9 @@ async fn test_success() { let stats = stats.details.unwrap(); received.push(format!( "scanned:{},processed:{},returned:{}", - stats.bytes_scanned, stats.bytes_processed, stats.bytes_returned + stats.bytes_scanned.unwrap(), + stats.bytes_processed.unwrap(), + stats.bytes_returned.unwrap() )) } SelectObjectContentEventStream::End(_) => {} diff --git a/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs b/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs new file mode 100644 index 00000000000..40a4fb0578c --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs @@ -0,0 +1,62 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_credential_types::provider::SharedCredentialsProvider; +use aws_credential_types::Credentials; +use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; +use aws_smithy_runtime::client::http::test_util::NeverClient; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_types::timeout::TimeoutConfig; +use aws_types::region::Region; +use aws_types::SdkConfig; +use std::time::Duration; +use tokio::time::Instant; + +/// Use a 5 second operation timeout on SdkConfig and a 0ms operation timeout on the service config +#[tokio::test] +async fn timeouts_can_be_set_by_service() { + let (_guard, _) = capture_test_logs(); + let sdk_config = SdkConfig::builder() + .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .region(Region::from_static("us-east-1")) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_secs(5)) + .build(), + ) + .http_client(NeverClient::new()) + // ip that + .endpoint_url( + // Emulate a connect timeout error by hitting an unroutable IP + "http://172.255.255.0:18104", + ) + .build(); + let config = aws_sdk_s3::config::Builder::from(&sdk_config) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_secs(0)) + .build(), + ) + .build(); + let client = aws_sdk_s3::Client::from_conf(config); + let start = Instant::now(); + let err = client + .get_object() + .key("foo") + .bucket("bar") + .send() + .await + .expect_err("unroutable IP should timeout"); + match err { + SdkError::TimeoutError(_err) => { /* ok */ } + // if the connect timeout is not respected, this times out after 5 seconds because of the operation timeout with `SdkError::Timeout` + _other => panic!("unexpected error: {:?}", _other), + } + // there should be a 0ms timeout, we gotta set some stuff up. Just want to make sure + // it's shorter than the 5 second timeout if the test is broken + assert!(start.elapsed() < Duration::from_millis(500)); +} diff --git a/aws/sdk/integration-tests/s3/tests/signing-it.rs b/aws/sdk/integration-tests/s3/tests/signing-it.rs index a02b6b670be..450f4ba43ff 100644 --- a/aws/sdk/integration-tests/s3/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3/tests/signing-it.rs @@ -3,41 +3,39 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; +#![cfg(feature = "test-util")] + use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_http::body::SdkBody; -use std::time::{Duration, UNIX_EPOCH}; +use aws_sdk_s3::{Client, Config}; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; #[tokio::test] async fn test_signer() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() - .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=ae78f74d26b6b0c3a403d9e8cc7ec3829d6264a2b33db672bf2b151bbb901786") + .header("authorization", "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=27e3f59ec3cffaa10e4f1c92112e8fb62d468a04cd32be39e68215f830404dbb") .uri("https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~") .body(SdkBody::empty()) .unwrap(), - http::Response::builder().status(200).body("").unwrap(), + http::Response::builder().status(200).body(SdkBody::empty()).unwrap(), )]); - let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + let config = Config::builder() + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) + .with_test_defaults() .build(); - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let _ = client .list_objects_v2() .bucket("test-bucket") .prefix("prefix~") - .customize() - .await - .unwrap() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1624036048)) - .user_agent_for_tests() .send() .await; - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } diff --git a/aws/sdk/integration-tests/s3/tests/size-type.rs b/aws/sdk/integration-tests/s3/tests/size-type.rs index d790b0a6229..5179fb0387b 100644 --- a/aws/sdk/integration-tests/s3/tests/size-type.rs +++ b/aws/sdk/integration-tests/s3/tests/size-type.rs @@ -12,5 +12,5 @@ fn size_type() { // Should only compile if the type is correctly customized let object = Object::builder().size(size).build(); - assert_eq!(size, object.size); + assert_eq!(Some(size), object.size); } diff --git a/aws/sdk/integration-tests/s3/tests/sleep_impl_use_cases.rs b/aws/sdk/integration-tests/s3/tests/sleep_impl_use_cases.rs deleted file mode 100644 index dfa82e96600..00000000000 --- a/aws/sdk/integration-tests/s3/tests/sleep_impl_use_cases.rs +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod with_sdk_config { - use aws_config::retry::RetryConfig; - use aws_config::timeout::TimeoutConfig; - use aws_config::SdkConfig; - use aws_sdk_s3 as s3; - use aws_smithy_async::rt::sleep::SharedAsyncSleep; - use std::time::Duration; - - #[tokio::test] - async fn using_config_loader() { - // When using `aws_config::load_from_env`, things should just work - let config = aws_config::load_from_env().await; - assert!(config.timeout_config().unwrap().has_timeouts()); - assert!(config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - fn manual_config_construction_all_defaults() { - // When manually constructing `SdkConfig` with everything unset, - // it should work since there will be no timeouts or retries enabled, - // and thus, no sleep impl is required. - let config = SdkConfig::builder().build(); - assert!(config.timeout_config().is_none()); - assert!(config.retry_config().is_none()); - let _s3 = s3::Client::new(&config); - } - - #[test] - fn no_sleep_no_timeouts_no_retries() { - // When explicitly setting timeouts and retries to their disabled - // states, it should work since no sleep impl is required. - let config = SdkConfig::builder() - .timeout_config(TimeoutConfig::disabled()) - .retry_config(RetryConfig::disabled()) - .build(); - assert!(!config.timeout_config().unwrap().has_timeouts()); - assert!(!config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - #[should_panic] - fn no_sleep_no_timeouts_yes_retries() { - // When retries are enabled and a sleep impl isn't given, it should panic - let config = SdkConfig::builder() - .timeout_config(TimeoutConfig::disabled()) - .retry_config(RetryConfig::standard()) - .build(); - assert!(!config.timeout_config().unwrap().has_timeouts()); - assert!(config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - #[should_panic] - fn no_sleep_yes_timeouts_no_retries() { - // When timeouts are enabled and a sleep impl isn't given, it should panic - let config = SdkConfig::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::disabled()) - .build(); - assert!(config.timeout_config().unwrap().has_timeouts()); - assert!(!config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - #[should_panic] - fn no_sleep_yes_timeouts_yes_retries() { - // When timeouts and retries are enabled but a sleep impl isn't given, it should panic - let config = SdkConfig::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::standard().with_max_attempts(2)) - .build(); - assert!(config.timeout_config().unwrap().has_timeouts()); - assert!(config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } - - #[test] - fn yes_sleep_yes_timeouts_yes_retries() { - // When a sleep impl is given, enabling timeouts/retries should work - let config = SdkConfig::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::standard().with_max_attempts(2)) - .sleep_impl(SharedAsyncSleep::new( - aws_smithy_async::rt::sleep::TokioSleep::new(), - )) - .build(); - assert!(config.timeout_config().unwrap().has_timeouts()); - assert!(config.retry_config().unwrap().has_retry()); - let _s3 = s3::Client::new(&config); - } -} - -mod with_service_config { - use aws_config::retry::RetryConfig; - use aws_config::timeout::TimeoutConfig; - use aws_config::SdkConfig; - use aws_sdk_s3 as s3; - use aws_smithy_async::rt::sleep::SharedAsyncSleep; - use std::time::Duration; - - #[test] - fn manual_config_construction_all_defaults() { - // When manually constructing `Config` with everything unset, - // it should work since there will be no timeouts or retries enabled, - // and thus, no sleep impl is required. - let config = s3::Config::builder().build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - fn no_sleep_no_timeouts_no_retries() { - // When explicitly setting timeouts and retries to their disabled - // states, it should work since no sleep impl is required. - let config = s3::Config::builder() - .timeout_config(TimeoutConfig::disabled()) - .retry_config(RetryConfig::disabled()) - .build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - #[should_panic] - fn no_sleep_no_timeouts_yes_retries() { - // When retries are enabled and a sleep impl isn't given, it should panic - let config = s3::Config::builder() - .timeout_config(TimeoutConfig::disabled()) - .retry_config(RetryConfig::standard()) - .build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - #[should_panic] - fn no_sleep_yes_timeouts_no_retries() { - // When timeouts are enabled and a sleep impl isn't given, it should panic - let config = s3::Config::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::disabled()) - .build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - #[should_panic] - fn no_sleep_yes_timeouts_yes_retries() { - // When retries and timeouts are enabled and a sleep impl isn't given, it should panic - let config = s3::Config::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::standard().with_max_attempts(2)) - .build(); - let _s3 = s3::Client::from_conf(config); - } - - #[test] - fn yes_sleep_yes_timeouts_yes_retries() { - // When a sleep impl is given, enabling timeouts/retries should work - let config = SdkConfig::builder() - .timeout_config( - TimeoutConfig::builder() - .operation_timeout(Duration::from_millis(100)) - .build(), - ) - .retry_config(RetryConfig::standard().with_max_attempts(2)) - .sleep_impl(SharedAsyncSleep::new( - aws_smithy_async::rt::sleep::TokioSleep::new(), - )) - .build(); - let _s3 = s3::Client::new(&config); - } -} diff --git a/aws/sdk/integration-tests/s3/tests/stalled-stream-protection.rs b/aws/sdk/integration-tests/s3/tests/stalled-stream-protection.rs new file mode 100644 index 00000000000..25008a415e9 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/stalled-stream-protection.rs @@ -0,0 +1,318 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_credential_types::Credentials; +use aws_sdk_s3::config::{Region, StalledStreamProtectionConfig}; +use aws_sdk_s3::primitives::ByteStream; +use aws_sdk_s3::{Client, Config}; +use bytes::BytesMut; +use std::error::Error; +use std::future::Future; +use std::net::SocketAddr; +use std::time::Duration; +use tracing::debug; + +// This test doesn't work because we can't count on `hyper` to poll the body, +// regardless of whether we schedule a wake. To make this functionality work, +// we'd have to integrate more closely with the orchestrator. +// +// I'll leave this test here because we do eventually want to support stalled +// stream protection for uploads. +#[ignore] +#[tokio::test] +async fn test_stalled_stream_protection_defaults_for_upload() { + // We spawn a faulty server that will close the connection after + // writing half of the response body. + let (server, server_addr) = start_faulty_upload_server().await; + let _ = tokio::spawn(server); + + let conf = Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .endpoint_url(format!("http://{server_addr}")) + // .stalled_stream_protection(StalledStreamProtectionConfig::enabled().build()) + .build(); + let client = Client::from_conf(conf); + + let err = client + .put_object() + .bucket("a-test-bucket") + .key("stalled-stream-test.txt") + .body(ByteStream::from_static(b"Hello")) + .send() + .await + .expect_err("upload stream stalled out"); + + let err = err.source().expect("inner error exists"); + assert_eq!( + err.to_string(), + "minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed" + ); +} + +async fn start_faulty_upload_server() -> (impl Future, SocketAddr) { + use tokio::net::{TcpListener, TcpStream}; + use tokio::time::sleep; + + let listener = TcpListener::bind("0.0.0.0:0") + .await + .expect("socket is free"); + let bind_addr = listener.local_addr().unwrap(); + + async fn process_socket(socket: TcpStream) { + let mut buf = BytesMut::new(); + let mut time_to_stall = false; + + loop { + if time_to_stall { + debug!("faulty server has read partial request, now getting stuck"); + break; + } + + match socket.try_read_buf(&mut buf) { + Ok(0) => { + unreachable!( + "The connection will be closed before this branch is ever reached" + ); + } + Ok(n) => { + debug!("read {n} bytes from the socket"); + + // Check to see if we've received some headers + if buf.len() >= 128 { + let s = String::from_utf8_lossy(&buf); + debug!("{s}"); + + time_to_stall = true; + } + } + Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => { + debug!("reading would block, sleeping for 1ms and then trying again"); + sleep(Duration::from_millis(1)).await; + } + Err(e) => { + panic!("{e}") + } + } + } + + loop { + tokio::task::yield_now().await + } + } + + let fut = async move { + loop { + let (socket, addr) = listener + .accept() + .await + .expect("listener can accept new connections"); + debug!("server received new connection from {addr:?}"); + let start = std::time::Instant::now(); + process_socket(socket).await; + debug!( + "connection to {addr:?} closed after {:.02?}", + start.elapsed() + ); + } + }; + + (fut, bind_addr) +} + +#[tokio::test] +async fn test_explicitly_configured_stalled_stream_protection_for_downloads() { + // We spawn a faulty server that will close the connection after + // writing half of the response body. + let (server, server_addr) = start_faulty_download_server().await; + let _ = tokio::spawn(server); + + let conf = Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .endpoint_url(format!("http://{server_addr}")) + .stalled_stream_protection( + StalledStreamProtectionConfig::enabled() + // Fail stalled streams immediately + .grace_period(Duration::from_secs(0)) + .build(), + ) + .build(); + let client = Client::from_conf(conf); + + let res = client + .get_object() + .bucket("a-test-bucket") + .key("stalled-stream-test.txt") + .send() + .await + .unwrap(); + + let err = res + .body + .collect() + .await + .expect_err("download stream stalled out"); + let err = err.source().expect("inner error exists"); + assert_eq!( + err.to_string(), + "minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed" + ); +} + +#[tokio::test] +async fn test_stalled_stream_protection_for_downloads_can_be_disabled() { + // We spawn a faulty server that will close the connection after + // writing half of the response body. + let (server, server_addr) = start_faulty_download_server().await; + let _ = tokio::spawn(server); + + let conf = Config::builder() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .endpoint_url(format!("http://{server_addr}")) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) + .build(); + let client = Client::from_conf(conf); + + let res = client + .get_object() + .bucket("a-test-bucket") + .key("stalled-stream-test.txt") + .send() + .await + .unwrap(); + + let timeout_duration = Duration::from_secs(2); + match tokio::time::timeout(timeout_duration, res.body.collect()).await { + Ok(_) => panic!("stalled stream protection kicked in but it shouldn't have"), + // If timeout elapses, then stalled stream protection didn't end the stream early. + Err(elapsed) => assert_eq!("deadline has elapsed".to_owned(), elapsed.to_string()), + } +} + +// This test will always take as long as whatever grace period is set by default. +#[tokio::test] +async fn test_stalled_stream_protection_for_downloads_is_enabled_by_default() { + // We spawn a faulty server that will close the connection after + // writing half of the response body. + let (server, server_addr) = start_faulty_download_server().await; + let _ = tokio::spawn(server); + + // Stalled stream protection should be enabled by default. + let sdk_config = aws_config::from_env() + .credentials_provider(Credentials::for_tests()) + .region(Region::new("us-east-1")) + .endpoint_url(format!("http://{server_addr}")) + .load() + .await; + let client = Client::new(&sdk_config); + + let res = client + .get_object() + .bucket("a-test-bucket") + .key("stalled-stream-test.txt") + .send() + .await + .unwrap(); + + let start = std::time::Instant::now(); + let err = res + .body + .collect() + .await + .expect_err("download stream stalled out"); + let err = err.source().expect("inner error exists"); + assert_eq!( + err.to_string(), + "minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed" + ); + // 1s check interval + 5s grace period + assert_eq!(start.elapsed().as_secs(), 6); +} + +async fn start_faulty_download_server() -> (impl Future, SocketAddr) { + use tokio::net::{TcpListener, TcpStream}; + use tokio::time::sleep; + + let listener = TcpListener::bind("0.0.0.0:0") + .await + .expect("socket is free"); + let bind_addr = listener.local_addr().unwrap(); + + async fn process_socket(socket: TcpStream) { + let mut buf = BytesMut::new(); + let response: &[u8] = br#"HTTP/1.1 200 OK +x-amz-request-id: 4B4NGF0EAWN0GE63 +content-length: 12 +etag: 3e25960a79dbc69b674cd4ec67a72c62 +content-type: application/octet-stream +server: AmazonS3 +content-encoding: +last-modified: Tue, 21 Jun 2022 16:29:14 GMT +date: Tue, 21 Jun 2022 16:29:23 GMT +x-amz-id-2: kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM= +accept-ranges: bytes + +"#; + let mut time_to_respond = false; + + loop { + match socket.try_read_buf(&mut buf) { + Ok(0) => { + unreachable!( + "The connection will be closed before this branch is ever reached" + ); + } + Ok(n) => { + debug!("read {n} bytes from the socket"); + + // Check for CRLF to see if we've received the entire HTTP request. + if buf.ends_with(b"\r\n\r\n") { + time_to_respond = true; + } + } + Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => { + debug!("reading would block, sleeping for 1ms and then trying again"); + sleep(Duration::from_millis(1)).await; + } + Err(e) => { + panic!("{e}") + } + } + + if socket.writable().await.is_ok() && time_to_respond { + // The content length is 12 but we'll only write 5 bytes + socket.try_write(response).unwrap(); + // We break from the R/W loop after sending a partial response in order to + // close the connection early. + debug!("faulty server has written partial response, now getting stuck"); + break; + } + } + + loop { + tokio::task::yield_now().await + } + } + + let fut = async move { + loop { + let (socket, addr) = listener + .accept() + .await + .expect("listener can accept new connections"); + debug!("server received new connection from {addr:?}"); + let start = std::time::Instant::now(); + process_socket(socket).await; + debug!( + "connection to {addr:?} closed after {:.02?}", + start.elapsed() + ); + } + }; + + (fut, bind_addr) +} diff --git a/aws/sdk/integration-tests/s3/tests/status-200-errors.rs b/aws/sdk/integration-tests/s3/tests/status-200-errors.rs new file mode 100644 index 00000000000..20217b2db20 --- /dev/null +++ b/aws/sdk/integration-tests/s3/tests/status-200-errors.rs @@ -0,0 +1,41 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_credential_types::provider::SharedCredentialsProvider; +use aws_credential_types::Credentials; +use aws_sdk_s3::Client; +use aws_smithy_runtime::client::http::test_util::infallible_client_fn; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::error::metadata::ProvideErrorMetadata; +use aws_types::region::Region; +use aws_types::SdkConfig; + +const ERROR_RESPONSE: &str = r#" + + SlowDown + Please reduce your request rate. + K2H6N7ZGQT6WHCEG + WWoZlnK4pTjKCYn6eNV7GgOurabfqLkjbSyqTvDMGBaI9uwzyNhSaDhOCPs8paFGye7S6b/AB3A= + +"#; + +#[tokio::test] +async fn status_200_errors() { + let http_client = + infallible_client_fn(|_req| http::Response::new(SdkBody::from(ERROR_RESPONSE))); + let sdk_config = SdkConfig::builder() + .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .region(Region::new("us-west-4")) + .http_client(http_client) + .build(); + let client = Client::new(&sdk_config); + let error = client + .delete_objects() + .bucket("bucket") + .send() + .await + .expect_err("should fail"); + assert_eq!(error.into_service_error().code(), Some("SlowDown")); +} diff --git a/aws/sdk/integration-tests/s3/tests/timeouts.rs b/aws/sdk/integration-tests/s3/tests/timeouts.rs index 59359ad20bd..7f0f509f00d 100644 --- a/aws/sdk/integration-tests/s3/tests/timeouts.rs +++ b/aws/sdk/integration-tests/s3/tests/timeouts.rs @@ -3,19 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_config::SdkConfig; -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_sdk_s3::config::{Credentials, Region}; +use aws_sdk_s3::config::{timeout::TimeoutConfig, Region}; +use aws_sdk_s3::error::DisplayErrorContext; +use aws_sdk_s3::primitives::ByteStream; use aws_sdk_s3::types::{ CompressionType, CsvInput, CsvOutput, ExpressionType, FileHeaderInfo, InputSerialization, OutputSerialization, }; -use aws_sdk_s3::Client; +use aws_sdk_s3::{Client, Config}; use aws_smithy_async::assert_elapsed; -use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep, TokioSleep}; -use aws_smithy_client::never::NeverConnector; -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_smithy_types::timeout::TimeoutConfig; +use aws_smithy_runtime::client::http::test_util::NeverClient; use std::future::Future; use std::net::SocketAddr; use std::time::Duration; @@ -23,19 +20,18 @@ use tokio::net::TcpListener; use tokio::time::timeout; #[tokio::test(start_paused = true)] -async fn test_timeout_service_ends_request_that_never_completes() { - let sdk_config = SdkConfig::builder() - .region(Region::from_static("us-east-2")) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) - .http_connector(NeverConnector::new()) +async fn test_event_stream_request_times_out_if_server_is_unresponsive() { + let config = Config::builder() + .with_test_defaults() + .region(Region::new("us-east-2")) + .http_client(NeverClient::new()) .timeout_config( TimeoutConfig::builder() - .operation_timeout(Duration::from_secs_f32(0.5)) + .operation_timeout(Duration::from_millis(500)) .build(), ) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) .build(); - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let now = tokio::time::Instant::now(); @@ -64,6 +60,40 @@ async fn test_timeout_service_ends_request_that_never_completes() { .await .unwrap_err(); + let expected = "operation timeout (all attempts including retries) occurred after 500ms"; + let message = format!("{}", DisplayErrorContext(err)); + assert!( + message.contains(expected), + "expected '{message}' to contain '{expected}'" + ); + assert_elapsed!(now, Duration::from_millis(500)); +} + +#[tokio::test(start_paused = true)] +async fn test_upload_request_times_out_if_server_is_unresponsive() { + let config = Config::builder() + .with_test_defaults() + .region(Region::new("us-east-2")) + .http_client(NeverClient::new()) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_millis(500)) + .build(), + ) + .build(); + let client = Client::from_conf(config); + + let now = tokio::time::Instant::now(); + + let err = client + .put_object() + .bucket("aws-rust-sdk") + .key("sample_data.csv") + .body(ByteStream::from_static(b"Hello world!")) + .send() + .await + .unwrap_err(); + let expected = "operation timeout (all attempts including retries) occurred after 500ms"; let message = format!("{}", DisplayErrorContext(err)); assert!( @@ -99,18 +129,17 @@ async fn test_read_timeout() { let server_handle = tokio::spawn(server_fut); tokio::time::sleep(Duration::from_millis(100)).await; - let config = SdkConfig::builder() - .sleep_impl(default_async_sleep().unwrap()) + let config = Config::builder() + .with_test_defaults() + .region(Region::new("us-east-1")) .timeout_config( TimeoutConfig::builder() .read_timeout(Duration::from_millis(300)) .build(), ) .endpoint_url(format!("http://{server_addr}")) - .region(Some(Region::from_static("us-east-1"))) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .build(); - let client = Client::new(&config); + let client = Client::from_conf(config); if let Ok(result) = timeout( Duration::from_millis(1000), @@ -139,8 +168,9 @@ async fn test_read_timeout() { #[tokio::test] async fn test_connect_timeout() { - let config = SdkConfig::builder() - .sleep_impl(default_async_sleep().unwrap()) + let config = Config::builder() + .with_test_defaults() + .region(Region::new("us-east-1")) .timeout_config( TimeoutConfig::builder() .connect_timeout(Duration::from_millis(300)) @@ -150,10 +180,8 @@ async fn test_connect_timeout() { // Emulate a connect timeout error by hitting an unroutable IP "http://172.255.255.0:18104", ) - .region(Some(Region::from_static("us-east-1"))) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .build(); - let client = Client::new(&config); + let client = Client::from_conf(config); if let Ok(result) = timeout( Duration::from_millis(1000), diff --git a/aws/sdk/integration-tests/s3/tests/user-agent-app-name.rs b/aws/sdk/integration-tests/s3/tests/user-agent-app-name.rs index 2dfea8d37b7..c9cb041bbdc 100644 --- a/aws/sdk/integration-tests/s3/tests/user-agent-app-name.rs +++ b/aws/sdk/integration-tests/s3/tests/user-agent-app-name.rs @@ -7,15 +7,15 @@ use aws_config::SdkConfig; use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3::config::{AppName, Credentials, Region}; use aws_sdk_s3::Client; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn user_agent_app_name() { - let (conn, rcvr) = capture_request(None); + let (http_client, rcvr) = capture_request(None); let sdk_config = SdkConfig::builder() .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) .region(Region::new("us-east-1")) - .http_connector(conn.clone()) + .http_client(http_client.clone()) .app_name(AppName::new("test-app-name").expect("valid app name")) // set app name in config .build(); let client = Client::new(&sdk_config); diff --git a/aws/sdk/integration-tests/s3control/Cargo.toml b/aws/sdk/integration-tests/s3control/Cargo.toml index beeb8e91777..9cad807f122 100644 --- a/aws/sdk/integration-tests/s3control/Cargo.toml +++ b/aws/sdk/integration-tests/s3control/Cargo.toml @@ -5,20 +5,29 @@ version = "0.1.0" authors = ["AWS Rust SDK Team "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["test-util"] +test-util = [] + [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-s3control = { path = "../../build/aws-sdk/sdk/s3control" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } -aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-sdk-s3control = { path = "../../build/aws-sdk/sdk/s3control", features = ["test-util", "behavior-version-latest"] } +aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } +aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } bytes = "1.0.0" http = "0.2.0" serde_json = "1.0.0" tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } + +[[test]] +name = "signing-it" +required-features = ["test-util"] diff --git a/aws/sdk/integration-tests/s3control/tests/signing-it.rs b/aws/sdk/integration-tests/s3control/tests/signing-it.rs index c868491a429..6d258496b1f 100644 --- a/aws/sdk/integration-tests/s3control/tests/signing-it.rs +++ b/aws/sdk/integration-tests/s3control/tests/signing-it.rs @@ -5,44 +5,39 @@ use aws_credential_types::provider::SharedCredentialsProvider; use aws_sdk_s3control::config::{Credentials, Region}; -use aws_sdk_s3control::Client; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_http::body::SdkBody; -use aws_types::SdkConfig; -use std::time::{Duration, UNIX_EPOCH}; +use aws_sdk_s3control::{Client, Config}; +use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +use aws_smithy_types::body::SdkBody; #[tokio::test] async fn test_signer() { - let conn = TestConnection::new(vec![( + let http_client = StaticReplayClient::new(vec![ReplayEvent::new( http::Request::builder() - .header("authorization", - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20211112/us-east-1/s3/aws4_request, \ - SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, \ - Signature=ac58c2246428af711ab7bca30c704a2b6a5fd7451cf83f3bceff177f1636e277") + .header("authorization", + "AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, \ + SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-user-agent, \ + Signature=0102a74cb220f8445c4efada17660572ff813e07b524032ec831e8c2514be903") .uri("https://test-bucket.s3-control.us-east-1.amazonaws.com/v20180820/accesspoint") .body(SdkBody::empty()) .unwrap(), - http::Response::builder().status(200).body("").unwrap(), + http::Response::builder().status(200).body(SdkBody::empty()).unwrap(), )]); - let sdk_config = SdkConfig::builder() - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) - .http_connector(conn.clone()) + let config = Config::builder() + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) + .http_client(http_client.clone()) .region(Region::new("us-east-1")) + .with_test_defaults() .build(); - let client = Client::new(&sdk_config); + let client = Client::from_conf(config); let _ = client .list_access_points() .account_id("test-bucket") - .customize() - .await - .unwrap() - .request_time_for_tests(UNIX_EPOCH + Duration::from_secs(1636751225)) - .user_agent_for_tests() - .remove_invocation_id_for_tests() .send() .await .expect_err("empty response"); - conn.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } diff --git a/aws/sdk/integration-tests/sts/Cargo.toml b/aws/sdk/integration-tests/sts/Cargo.toml index a5e50b83cfa..c629b2d3168 100644 --- a/aws/sdk/integration-tests/sts/Cargo.toml +++ b/aws/sdk/integration-tests/sts/Cargo.toml @@ -5,16 +5,16 @@ version = "0.1.0" authors = ["Russell Cohen "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-sdk-sts = { path = "../../build/aws-sdk/sdk/sts", features = ["behavior-version-latest"] } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } diff --git a/aws/sdk/integration-tests/sts/tests/signing-it.rs b/aws/sdk/integration-tests/sts/tests/signing-it.rs index 01727a53c91..1b0a4e918ed 100644 --- a/aws/sdk/integration-tests/sts/tests/signing-it.rs +++ b/aws/sdk/integration-tests/sts/tests/signing-it.rs @@ -4,16 +4,16 @@ */ use aws_sdk_sts::config::{Credentials, Region}; -use aws_smithy_client::test_connection::capture_request; +use aws_smithy_runtime::client::http::test_util::capture_request; #[tokio::test] async fn assume_role_signed() { let creds = Credentials::for_tests(); - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_sts::Config::builder() .credentials_provider(creds) .region(Region::new("us-east-1")) - .http_connector(server) + .http_client(http_client) .build(); let client = aws_sdk_sts::Client::from_conf(conf); let _ = client.assume_role().send().await; @@ -24,33 +24,12 @@ async fn assume_role_signed() { ); } -// TODO(enableNewSmithyRuntimeCleanup): Delete the middleware version of this test -#[cfg(not(aws_sdk_orchestrator_mode))] #[tokio::test] async fn web_identity_unsigned() { - let creds = Credentials::for_tests(); - let (server, request) = capture_request(None); - let conf = aws_sdk_sts::Config::builder() - .credentials_provider(creds) - .region(Region::new("us-east-1")) - .http_connector(server) - .build(); - let client = aws_sdk_sts::Client::from_conf(conf); - let _ = client.assume_role_with_web_identity().send().await; - // web identity should be unsigned - assert_eq!( - request.expect_request().headers().get("AUTHORIZATION"), - None - ); -} - -#[cfg(aws_sdk_orchestrator_mode)] -#[tokio::test] -async fn web_identity_unsigned() { - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_sts::Config::builder() .region(Region::new("us-east-1")) - .http_connector(server) + .http_client(http_client) .build(); let client = aws_sdk_sts::Client::from_conf(conf); let _ = client.assume_role_with_web_identity().send().await; @@ -63,10 +42,10 @@ async fn web_identity_unsigned() { #[tokio::test] async fn assume_role_saml_unsigned() { - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_sts::Config::builder() .region(Region::new("us-east-1")) - .http_connector(server) + .http_client(http_client) .build(); let client = aws_sdk_sts::Client::from_conf(conf); let _ = client.assume_role_with_saml().send().await; @@ -79,10 +58,10 @@ async fn assume_role_saml_unsigned() { #[tokio::test] async fn web_identity_no_creds() { - let (server, request) = capture_request(None); + let (http_client, request) = capture_request(None); let conf = aws_sdk_sts::Config::builder() .region(Region::new("us-east-1")) - .http_connector(server) + .http_client(http_client) .build(); let client = aws_sdk_sts::Client::from_conf(conf); let _ = client.assume_role_with_web_identity().send().await; diff --git a/aws/sdk/integration-tests/test.sh b/aws/sdk/integration-tests/test.sh new file mode 100755 index 00000000000..d26a34a1168 --- /dev/null +++ b/aws/sdk/integration-tests/test.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -eu -o pipefail + +for f in *; do + if [[ -f "${f}/Cargo.toml" ]]; then + echo + echo "Testing ${f}..." + echo "###############" + cargo test --manifest-path "${f}/Cargo.toml" --all-features + fi +done diff --git a/aws/sdk/integration-tests/timestreamquery/Cargo.toml b/aws/sdk/integration-tests/timestreamquery/Cargo.toml index b81b618c883..ea94cf9bc92 100644 --- a/aws/sdk/integration-tests/timestreamquery/Cargo.toml +++ b/aws/sdk/integration-tests/timestreamquery/Cargo.toml @@ -5,16 +5,16 @@ version = "0.1.0" authors = ["Russell Cohen "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dev-dependencies] aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } -aws-sdk-timestreamquery = { path = "../../build/aws-sdk/sdk/timestreamquery" } -tokio = { version = "1.23.1", features = ["full", "test-util"] } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util"] } +aws-sdk-timestreamquery = { path = "../../build/aws-sdk/sdk/timestreamquery", features = ["behavior-version-latest"] } aws-smithy-async = { path = "../../build/aws-sdk/sdk/aws-smithy-async", features = ["test-util"] } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["test-util"] } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } +tokio = { version = "1.23.1", features = ["full", "test-util"] } tracing-subscriber = "0.3.17" diff --git a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs index d15244825ff..d78ca76266f 100644 --- a/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs +++ b/aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs @@ -3,36 +3,42 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_credential_types::provider::SharedCredentialsProvider; -use aws_sdk_timestreamquery as query; -use aws_sdk_timestreamquery::config::Credentials; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::test_util::controlled_time_and_sleep; -use aws_smithy_async::time::{SharedTimeSource, TimeSource}; -use aws_smithy_client::dvr::{MediaType, ReplayingConnection}; -use aws_types::region::Region; -use aws_types::SdkConfig; -use std::time::{Duration, UNIX_EPOCH}; +use aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient; #[tokio::test] async fn do_endpoint_discovery() { - tracing_subscriber::fmt::init(); - let conn = ReplayingConnection::from_file("tests/traffic.json").unwrap(); - //let conn = aws_smithy_client::dvr::RecordingConnection::new(conn); + use aws_credential_types::provider::SharedCredentialsProvider; + use aws_sdk_timestreamquery as query; + use aws_sdk_timestreamquery::config::{Credentials, StalledStreamProtectionConfig}; + use aws_smithy_async::rt::sleep::SharedAsyncSleep; + use aws_smithy_async::test_util::controlled_time_and_sleep; + use aws_smithy_async::time::{SharedTimeSource, TimeSource}; + use aws_types::region::Region; + use aws_types::SdkConfig; + use std::time::{Duration, UNIX_EPOCH}; + + let _logs = aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs(); + + // For recording, switch to: + // let http_client = aws_smithy_runtime::client::http::test_util::dvr::RecordingClient::new(client); + let http_client = ReplayingClient::from_file("tests/traffic.json").unwrap(); let start = UNIX_EPOCH + Duration::from_secs(1234567890); let (ts, sleep, mut gate) = controlled_time_and_sleep(start); let config = SdkConfig::builder() - .http_connector(conn.clone()) + .http_client(http_client.clone()) .region(Region::from_static("us-west-2")) .sleep_impl(SharedAsyncSleep::new(sleep)) - .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests())) + .credentials_provider(SharedCredentialsProvider::new( + Credentials::for_tests_with_session_token(), + )) + .stalled_stream_protection(StalledStreamProtectionConfig::disabled()) .time_source(SharedTimeSource::new(ts.clone())) .build(); let conf = query::config::Builder::from(&config) .idempotency_token_provider("0000-0000-0000") .build(); let (client, reloader) = query::Client::from_conf(conf) - .enable_endpoint_discovery() + .with_endpoint_discovery_enabled() .await .expect("initial setup of endpoint discovery failed"); @@ -62,15 +68,16 @@ async fn do_endpoint_discovery() { .unwrap(); // if you want to update this test: // conn.dump_to_file("tests/traffic.json").unwrap(); - conn.validate_body_and_headers( - Some(&[ - "x-amz-security-token", - "x-amz-date", - "content-type", - "x-amz-target", - ]), - MediaType::Json, - ) - .await - .unwrap(); + http_client + .validate_body_and_headers( + Some(&[ + "x-amz-security-token", + "x-amz-date", + "content-type", + "x-amz-target", + ]), + "application/json", + ) + .await + .unwrap(); } diff --git a/aws/sdk/integration-tests/transcribestreaming/Cargo.toml b/aws/sdk/integration-tests/transcribestreaming/Cargo.toml index 181ba493cbc..54138bf894f 100644 --- a/aws/sdk/integration-tests/transcribestreaming/Cargo.toml +++ b/aws/sdk/integration-tests/transcribestreaming/Cargo.toml @@ -5,17 +5,17 @@ version = "0.1.0" authors = ["AWS Rust SDK Team ", "John DiSanti "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false [dev-dependencies] async-stream = "0.3.0" aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["test-util"] } aws-http = { path = "../../build/aws-sdk/sdk/aws-http" } -aws-sdk-transcribestreaming = { path = "../../build/aws-sdk/sdk/transcribestreaming" } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", features = ["test-util", "rustls"] } +aws-sdk-transcribestreaming = { path = "../../build/aws-sdk/sdk/transcribestreaming", features = ["behavior-version-latest"] } aws-smithy-eventstream = { path = "../../build/aws-sdk/sdk/aws-smithy-eventstream" } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "test-util"] } bytes = "1.0.0" futures-core = "0.3.14" hound = "3.4.0" diff --git a/aws/sdk/integration-tests/transcribestreaming/tests/test.rs b/aws/sdk/integration-tests/transcribestreaming/tests/test.rs index 62654ebd82f..5178bd2ae95 100644 --- a/aws/sdk/integration-tests/transcribestreaming/tests/test.rs +++ b/aws/sdk/integration-tests/transcribestreaming/tests/test.rs @@ -7,14 +7,15 @@ use async_stream::stream; use aws_sdk_transcribestreaming::config::{Credentials, Region}; use aws_sdk_transcribestreaming::error::SdkError; use aws_sdk_transcribestreaming::operation::start_stream_transcription::StartStreamTranscriptionOutput; +use aws_sdk_transcribestreaming::primitives::event_stream::{HeaderValue, Message}; use aws_sdk_transcribestreaming::primitives::Blob; use aws_sdk_transcribestreaming::types::error::{AudioStreamError, TranscriptResultStreamError}; use aws_sdk_transcribestreaming::types::{ AudioEvent, AudioStream, LanguageCode, MediaEncoding, TranscriptResultStream, }; use aws_sdk_transcribestreaming::{Client, Config}; -use aws_smithy_client::dvr::{Event, ReplayingConnection}; -use aws_smithy_eventstream::frame::{DecodedFrame, HeaderValue, Message, MessageFrameDecoder}; +use aws_smithy_eventstream::frame::{read_message_from, DecodedFrame, MessageFrameDecoder}; +use aws_smithy_runtime::client::http::test_util::dvr::{Event, ReplayingClient}; use bytes::BufMut; use futures_core::Stream; use std::collections::{BTreeMap, BTreeSet}; @@ -98,14 +99,14 @@ async fn start_request( region: &'static str, events_json: &str, input_stream: impl Stream> + Send + Sync + 'static, -) -> (ReplayingConnection, StartStreamTranscriptionOutput) { +) -> (ReplayingClient, StartStreamTranscriptionOutput) { let events: Vec = serde_json::from_str(events_json).unwrap(); - let replayer = ReplayingConnection::new(events); + let replayer = ReplayingClient::new(events); let region = Region::from_static(region); let config = Config::builder() .region(region) - .http_connector(replayer.clone()) + .http_client(replayer.clone()) .credentials_provider(Credentials::for_tests()) .build(); let client = Client::from_conf(config); @@ -132,7 +133,7 @@ fn decode_frames(mut body: &[u8]) -> Vec<(Message, Option)> { let inner_msg = if msg.payload().is_empty() { None } else { - Some(Message::read_from(msg.payload().as_ref()).unwrap()) + Some(read_message_from(msg.payload().as_ref()).unwrap()) }; result.push((msg, inner_msg)); } diff --git a/aws/sdk/integration-tests/webassembly/.cargo/config.toml b/aws/sdk/integration-tests/webassembly/.cargo/config.toml index e6e321b297c..031dad7377b 100644 --- a/aws/sdk/integration-tests/webassembly/.cargo/config.toml +++ b/aws/sdk/integration-tests/webassembly/.cargo/config.toml @@ -3,7 +3,3 @@ target = "wasm32-wasi" [target.wasm32-wasi] rustflags = ["-C", "opt-level=1"] - -# TODO(Rust 1.70): The sparse registry config can be removed when upgrading to Rust 1.70 -[registries.crates-io] -protocol = "sparse" diff --git a/aws/sdk/integration-tests/webassembly/Cargo.toml b/aws/sdk/integration-tests/webassembly/Cargo.toml index b66406e6f5f..379f3d8e7d5 100644 --- a/aws/sdk/integration-tests/webassembly/Cargo.toml +++ b/aws/sdk/integration-tests/webassembly/Cargo.toml @@ -9,7 +9,7 @@ when target is set to wasm32-wasi for all SDK and runtime crates. """ edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" publish = false [lib] @@ -18,11 +18,12 @@ crate-type = ["cdylib"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -aws-config = { path = "../../build/aws-sdk/sdk/aws-config", default-features = false, features = ["rt-tokio"]} +aws-config = { path = "../../build/aws-sdk/sdk/aws-config", default-features = false, features = ["rt-tokio", "behavior-version-latest"]} aws-credential-types = { path = "../../build/aws-sdk/sdk/aws-credential-types", features = ["hardcoded-credentials"] } aws-sdk-s3 = { path = "../../build/aws-sdk/sdk/s3", default-features = false } -aws-smithy-client = { path = "../../build/aws-sdk/sdk/aws-smithy-client", default-features = false } aws-smithy-http = { path = "../../build/aws-sdk/sdk/aws-smithy-http" } +aws-smithy-runtime = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime", features = ["client"] } +aws-smithy-runtime-api = { path = "../../build/aws-sdk/sdk/aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../../build/aws-sdk/sdk/aws-smithy-types" } aws-types = { path = "../../build/aws-sdk/sdk/aws-types" } http = "0.2.8" diff --git a/aws/sdk/integration-tests/webassembly/src/adapter/http_client.rs b/aws/sdk/integration-tests/webassembly/src/adapter/http_client.rs deleted file mode 100644 index 5ca84838c9f..00000000000 --- a/aws/sdk/integration-tests/webassembly/src/adapter/http_client.rs +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_http::body::SdkBody; - -pub(crate) fn make_request(_req: http::Request) -> Result, ()> { - // Consumers here would pass the HTTP request to - // the Wasm host in order to get the response back - let body = " - - - - 2023-01-23T11:59:03.575496Z - doc-example-bucket - - - 2023-01-23T23:32:13.125238Z - doc-example-bucket2 - - - - account-name - a3a42310-42d0-46d1-9745-0cee9f4fb851 - - "; - Ok(http::Response::new(SdkBody::from(body))) -} diff --git a/aws/sdk/integration-tests/webassembly/src/adapter/mod.rs b/aws/sdk/integration-tests/webassembly/src/adapter/mod.rs deleted file mode 100644 index b563eb097a8..00000000000 --- a/aws/sdk/integration-tests/webassembly/src/adapter/mod.rs +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod http_client; - -use aws_smithy_client::erase::DynConnector; -use aws_smithy_client::http_connector::HttpConnector; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use std::task::{Context, Poll}; -use tower::Service; - -#[derive(Default, Debug, Clone)] -pub(crate) struct Adapter {} - -impl Adapter { - pub fn to_http_connector() -> impl Into { - DynConnector::new(Adapter::default()) - } -} - -impl Service> for Adapter { - type Response = http::Response; - - type Error = ConnectorError; - - #[allow(clippy::type_complexity)] - type Future = std::pin::Pin< - Box> + Send + 'static>, - >; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: http::Request) -> Self::Future { - println!("Adapter: sending request..."); - let res = http_client::make_request(req).unwrap(); - println!("{:?}", res); - Box::pin(async move { Ok(res) }) - } -} diff --git a/aws/sdk/integration-tests/webassembly/src/default_config.rs b/aws/sdk/integration-tests/webassembly/src/default_config.rs index fd8899cbe0f..c87a364b5ed 100644 --- a/aws/sdk/integration-tests/webassembly/src/default_config.rs +++ b/aws/sdk/integration-tests/webassembly/src/default_config.rs @@ -3,14 +3,13 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::http::WasmHttpConnector; use aws_config::retry::RetryConfig; use aws_credential_types::Credentials; use aws_smithy_types::timeout::TimeoutConfig; use aws_types::region::Region; use std::future::Future; -use crate::adapter::Adapter; - pub(crate) fn get_default_config() -> impl Future { aws_config::from_env() .region(Region::from_static("us-west-2")) @@ -21,7 +20,7 @@ pub(crate) fn get_default_config() -> impl Future impl Future Result { + // Consumers here would pass the HTTP request to + // the Wasm host in order to get the response back + let body = " + + + + 2023-01-23T11:59:03.575496Z + doc-example-bucket + + + 2023-01-23T23:32:13.125238Z + doc-example-bucket2 + + + + account-name + a3a42310-42d0-46d1-9745-0cee9f4fb851 + + "; + Ok(HttpResponse::try_from(http::Response::new(SdkBody::from(body))).unwrap()) +} + +#[derive(Default, Debug, Clone)] +pub(crate) struct WasmHttpConnector; +impl WasmHttpConnector { + pub fn new() -> Self { + Self + } +} + +impl HttpConnector for WasmHttpConnector { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + println!("Adapter: sending request..."); + let res = make_request(request).unwrap(); + println!("{:?}", res); + HttpConnectorFuture::new(async move { Ok(res) }) + } +} + +impl HttpClient for WasmHttpConnector { + fn http_connector( + &self, + _settings: &HttpConnectorSettings, + _components: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} diff --git a/aws/sdk/integration-tests/webassembly/src/lib.rs b/aws/sdk/integration-tests/webassembly/src/lib.rs index bc9c1a112bf..1c4932afbb9 100644 --- a/aws/sdk/integration-tests/webassembly/src/lib.rs +++ b/aws/sdk/integration-tests/webassembly/src/lib.rs @@ -3,8 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -mod adapter; mod default_config; +mod http; mod list_buckets; #[tokio::main(flavor = "current_thread")] diff --git a/aws/sdk/integration-tests/webassembly/src/list_buckets.rs b/aws/sdk/integration-tests/webassembly/src/list_buckets.rs index 53504e66440..692be0e071c 100644 --- a/aws/sdk/integration-tests/webassembly/src/list_buckets.rs +++ b/aws/sdk/integration-tests/webassembly/src/list_buckets.rs @@ -11,7 +11,7 @@ pub async fn s3_list_buckets() { let shared_config = get_default_config().await; let client = Client::new(&shared_config); let result = client.list_buckets().send().await.unwrap(); - assert_eq!(result.buckets().unwrap().len(), 2) + assert_eq!(result.buckets().len(), 2) } #[tokio::test] diff --git a/aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs b/aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs deleted file mode 100644 index 08e0f3a9c25..00000000000 --- a/aws/sdk/s3-benchmark/benchmark/src/multipart_get.rs +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::{Args, BoxError, BENCH_KEY}; -use aws_sdk_s3 as s3; -use std::fmt; -use std::path::Path; -use std::sync::Arc; -use tokio::sync::watch::channel; -use tokio::sync::Semaphore; - -pub async fn get_object_multipart( - client: &s3::Client, - args: &Args, - path: &Path, -) -> Result<(), BoxError> { - let mut part_count = (args.size_bytes / args.part_size_bytes + 1) as i64; - let mut size_of_last_part = (args.size_bytes % args.part_size_bytes) as i64; - if size_of_last_part == 0 { - size_of_last_part = args.part_size_bytes as i64; - part_count -= 1; - } - - let mut ranges = (0..part_count).map(|i| { - if i == part_count - 1 { - let start = i * args.part_size_bytes as i64; - ContentRange::new(start, start + size_of_last_part - 1) - } else { - ContentRange::new( - i * args.part_size_bytes as i64, - (i + 1) * args.part_size_bytes as i64 - 1, - ) - } - }); - let (tx, rx) = channel(ranges.next().unwrap()); - for range in ranges { - tx.send(range)?; - } - - let semaphore = Arc::new(Semaphore::new(args.concurrency)); - let mut tasks = Vec::new(); - for _ in 0..part_count { - let semaphore = semaphore.clone(); - let client = client.clone(); - let bucket = args.bucket.clone(); - let mut rx = rx.clone(); - tasks.push(tokio::spawn(async move { - let _permit = semaphore.acquire().await?; - let range = rx.borrow_and_update().to_string(); - - let part = client - .get_object() - .bucket(bucket) - .key(BENCH_KEY) - .range(range) - .send() - .await?; - - Result::<_, BoxError>::Ok(part.body) - })); - } - for task in tasks { - let mut body = task.await??.into_async_read(); - let mut file = tokio::fs::File::create(path).await?; - tokio::io::copy(&mut body, &mut file).await?; - } - - Ok(()) -} - -#[derive(Debug)] -struct ContentRange { - start: i64, - end: i64, -} - -impl ContentRange { - fn new(start: i64, end: i64) -> Self { - Self { start, end } - } -} - -impl fmt::Display for ContentRange { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "bytes={}-{}", self.start, self.end) - } -} diff --git a/aws/sdk/sdk-external-types.toml b/aws/sdk/sdk-external-types.toml index d2ab675425e..2de1ff7c41a 100644 --- a/aws/sdk/sdk-external-types.toml +++ b/aws/sdk/sdk-external-types.toml @@ -1,30 +1,24 @@ # These are the allowed external types in the `aws-sdk-*` generated crates, checked by CI. allowed_external_types = [ - "aws_credential_types::*", - "aws_endpoint::*", - "aws_http::*", - "aws_sig_auth::*", - "aws_smithy_async::*", - "aws_smithy_client::*", - "aws_smithy_http::*", - "aws_smithy_http_tower::*", "aws_smithy_types::*", + "aws_credential_types::*", "aws_types::*", - "http::header::map::HeaderMap", - "http::header::value::HeaderValue", + "aws_smithy_runtime_api::*", + "aws_smithy_async::rt::sleep::*", + "aws_smithy_async::time::*", + "aws_smithy_async::future::pagination_stream::PaginationStream", + # only allowed in from impl for presigned request "http::request::Request", - "http::error::Error", - "http::uri::Uri", - "http::method::Method", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Switch to AsyncIterator once standardized - "futures_core::stream::Stream", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if we want to continue exposing tower_layer - "tower_layer::Layer", - "tower_layer::identity::Identity", - "tower_layer::stack::Stack", + "aws_smithy_runtime::client::identity::cache::IdentityCache", + "aws_smithy_runtime::client::retries::RetryPartition", + + "aws_runtime::invocation_id::SharedInvocationIdGenerator", + "aws_runtime::invocation_id::InvocationIdGenerator", + + # Only exposed in transcribestreaming. This crate will be major version bumped if we MV aws_smithy_http + "aws_smithy_http::event_stream::sender::EventStreamSender", ] diff --git a/aws/sra-test/.gitignore b/aws/sra-test/.gitignore deleted file mode 100644 index 388d181b4d3..00000000000 --- a/aws/sra-test/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/smithy-build.json diff --git a/aws/sra-test/build.gradle.kts b/aws/sra-test/build.gradle.kts deleted file mode 100644 index 669f231741c..00000000000 --- a/aws/sra-test/build.gradle.kts +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -extra["displayName"] = "Smithy :: Rust :: AWS-SDK :: SRA Test" -extra["moduleName"] = "software.amazon.smithy.rust.awssdk.sra.test" - -tasks["jar"].enabled = false - -plugins { - id("software.amazon.smithy") -} - -val smithyVersion: String by project -val defaultRustDocFlags: String by project -val properties = PropertyRetriever(rootProject, project) - -val pluginName = "rust-client-codegen" -val workingDirUnderBuildDir = "smithyprojections/sdk-sra-test/" - -val publisherToolPath = rootProject.projectDir.resolve("tools/ci-build/publisher") -val outputDir = buildDir.resolve("sdk") - -configure { - outputDirectory = file("$buildDir/$workingDirUnderBuildDir") -} - -buildscript { - val smithyVersion: String by project - dependencies { - classpath("software.amazon.smithy:smithy-cli:$smithyVersion") - } -} - -dependencies { - implementation(project(":aws:sdk-codegen")) - implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") - implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") -} - -data class Service( - val serviceId: String, - val moduleName: String, - val imports: List, -) -val servicesToGenerate = listOf( - Service( - "com.amazonaws.dynamodb#DynamoDB_20120810", - "aws-sdk-dynamodb", - listOf("../sdk/aws-models/dynamodb.json"), - ), - Service( - "com.amazonaws.s3#AmazonS3", - "aws-sdk-s3", - listOf("../sdk/aws-models/s3.json", "../sdk/aws-models/s3-tests.smithy"), - ), -) -val allCodegenTests = servicesToGenerate.map { - CodegenTest( - it.serviceId, - it.moduleName, - imports = it.imports, - extraConfig = """ - , - "codegen": { - "includeFluentClient": false, - ${ ""/* "enableNewSmithyRuntime": "both_default_middleware" */ } - "enableNewSmithyRuntime": "orchestrator" - }, - "customizationConfig": { - "awsSdk": { - "generateReadme": false - } - } - """, - ) -} - -project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) -project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) -project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) - -tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") -tasks["assemble"].finalizedBy("generateCargoWorkspace") - -project.registerModifyMtimeTask() -project.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) - -tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) - -tasks["clean"].doFirst { delete("smithy-build.json") } - -/** - * The aws/rust-runtime crates depend on local versions of the Smithy core runtime enabling local compilation. However, - * those paths need to be replaced in the final build. We should probably fix this with some symlinking. - */ -fun rewritePathDependency(line: String): String { - // some runtime crates are actually dependent on the generated bindings: - return line.replace("../sdk/build/aws-sdk/sdk/", "") - // others use relative dependencies:: - .replace("../../rust-runtime/", "") -} - -tasks.register("relocateServices") { - description = "relocate AWS services to their final destination" - doLast { - servicesToGenerate.forEach { service -> - logger.info("Relocating ${service.moduleName}...") - copy { - from("$buildDir/smithyprojections/sdk-sra-test/${service.moduleName}/rust-client-codegen") - into(outputDir.resolve(service.moduleName)) - } - copy { - from(projectDir.resolve("integration-tests/${service.moduleName}/tests")) - into(outputDir.resolve(service.moduleName).resolve("tests")) - } - } - } - dependsOn("smithyBuildJar") - inputs.dir("$buildDir/smithyprojections/sdk-sra-test/") - outputs.dir(outputDir) -} -tasks["assemble"].apply { - dependsOn("relocateServices") -} diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/.gitignore b/aws/sra-test/integration-tests/aws-sdk-s3/.gitignore deleted file mode 100644 index 5a44eef09a5..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/Cargo.lock diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml b/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml deleted file mode 100644 index d8057c6de7d..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "aws-smithy-runtime-test" -version = "0.1.0" -edition = "2021" -publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -aws-http = { path = "../../../rust-runtime/aws-http" } -aws-runtime = { path = "../../../rust-runtime/aws-runtime" } -aws-sdk-s3 = { path = "../../build/sdk/aws-sdk-s3", features = ["test-util"] } -aws-smithy-async = { path = "../../../../rust-runtime/aws-smithy-async", features = ["test-util"]} -aws-smithy-client = { path = "../../../../rust-runtime/aws-smithy-client", features = ["test-util", "rustls"] } -aws-smithy-runtime = { path = "../../../../rust-runtime/aws-smithy-runtime" } -aws-smithy-runtime-api = { path = "../../../../rust-runtime/aws-smithy-runtime-api" } -aws-smithy-types = { path = "../../../../rust-runtime/aws-smithy-types" } -aws-types = { path = "../../../rust-runtime/aws-types" } -criterion = { version = "0.4", features = ["async_tokio"] } -http = "0.2.3" -http-body = "0.4.5" -last-release-smithy-client = { version = "0.55", package = "aws-smithy-client", features = ["test-util", "rustls"] } -last-release-s3 = { version = "0.26", package = "aws-sdk-s3", features = ["test-util"] } -tokio = { version = "1.23.1", features = ["macros", "test-util", "rt-multi-thread"] } -tracing = "0.1.37" -tracing-subscriber = { version = "0.3.15", features = ["env-filter", "json"] } - -[profile.release] -debug = 1 - -[[bench]] -name = "middleware_vs_orchestrator" -harness = false diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs b/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs deleted file mode 100644 index 23af022b79c..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/benches/middleware_vs_orchestrator.rs +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#[macro_use] -extern crate criterion; -use aws_sdk_s3 as s3; -use aws_smithy_runtime_api::client::interceptors::InterceptorRegistrar; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::config_bag::ConfigBag; -use criterion::{BenchmarkId, Criterion}; - -macro_rules! test_connection { - (head) => { - test_connection!(aws_smithy_client) - }; - (last_release) => { - test_connection!(last_release_smithy_client) - }; - ($package:ident) => { - $package::test_connection::infallible_connection_fn(|req| { - assert_eq!( - "https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~", - req.uri().to_string() - ); - assert!(req.headers().contains_key("authorization")); - http::Response::builder() - .status(200) - .body( - r#" - - test-bucket - prefix~ - 1 - 1000 - false - - some-file.file - 2009-10-12T17:50:30.000Z - 434234 - STANDARD - - -"#, - ) - .unwrap() - }) - }; -} - -macro_rules! create_client { - (head) => { - create_client!(head, aws_sdk_s3) - }; - (last_release) => { - create_client!(last_release, last_release_s3) - }; - ($original:ident, $package:ident) => {{ - let conn = test_connection!($original); - let config = $package::Config::builder() - .credentials_provider($package::config::Credentials::for_tests()) - .region($package::config::Region::new("us-east-1")) - .http_connector(conn.clone()) - .build(); - $package::Client::from_conf(config) - }}; -} - -macro_rules! middleware_bench_fn { - ($fn_name:ident, head) => { - middleware_bench_fn!($fn_name, aws_sdk_s3) - }; - ($fn_name:ident, last_release) => { - middleware_bench_fn!($fn_name, last_release_s3) - }; - ($fn_name:ident, $package:ident) => { - async fn $fn_name(client: &$package::Client) { - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .send() - .await - .expect("successful execution"); - } - }; -} - -async fn orchestrator(client: &s3::Client) { - #[derive(Debug)] - struct FixupPlugin { - region: String, - } - impl RuntimePlugin for FixupPlugin { - fn configure( - &self, - cfg: &mut ConfigBag, - _interceptors: &mut InterceptorRegistrar, - ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { - let params_builder = s3::endpoint::Params::builder() - .set_region(Some(self.region.clone())) - .bucket("test-bucket"); - - cfg.put(params_builder); - Ok(()) - } - } - let _output = client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .send_orchestrator_with_plugin(Some(FixupPlugin { - region: client - .conf() - .region() - .map(|c| c.as_ref().to_string()) - .unwrap(), - })) - .await - .expect("successful execution"); -} - -fn bench(c: &mut Criterion) { - let head_client = create_client!(head); - middleware_bench_fn!(middleware_head, head); - - let last_release_client = create_client!(last_release); - middleware_bench_fn!(middleware_last_release, last_release); - - let mut group = c.benchmark_group("compare"); - let param = "S3 ListObjectsV2"; - group.bench_with_input( - BenchmarkId::new("middleware (HEAD)", param), - param, - |b, _| { - b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { middleware_head(&head_client).await }) - }, - ); - group.bench_with_input( - BenchmarkId::new("middleware (last_release)", param), - param, - |b, _| { - b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { middleware_last_release(&last_release_client).await }) - }, - ); - group.bench_with_input(BenchmarkId::new("orchestrator", param), param, |b, _| { - b.to_async(tokio::runtime::Runtime::new().unwrap()) - .iter(|| async { orchestrator(&head_client).await }) - }); - group.finish(); -} - -criterion_group!(benches, bench); -criterion_main!(benches); diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/list-objects-v2.json b/aws/sra-test/integration-tests/aws-sdk-s3/test-data/list-objects-v2.json deleted file mode 100644 index 366e1fab1b9..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/test-data/list-objects-v2.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "events": [ - { - "connection_id": 0, - "action": { - "Request": { - "request": { - "uri": "https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~", - "headers": { - "x-amz-security-token": [ - "notarealsessiontoken" - ], - "authorization": [ - "AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82" - ], - "x-amz-user-agent": [ - "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0" - ], - "x-amz-date": [ - "20210618T170728Z" - ], - "x-amz-content-sha256": [ - "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - ], - "amz-sdk-invocation-id": [ - "00000000-0000-4000-8000-000000000000" - ], - "user-agent": [ - "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0" - ] - }, - "method": "GET" - } - } - } - }, - { - "connection_id": 0, - "action": { - "Eof": { - "ok": true, - "direction": "Request" - } - } - }, - { - "connection_id": 0, - "action": { - "Response": { - "response": { - "Ok": { - "status": 200, - "version": "HTTP/1.1", - "headers": { - "x-amz-request-id": [ - "9X5E7C9EAB6AQEP2" - ], - "x-amz-id-2": [ - "gZsrBxajPyo1Q0DE2plGf7T6kAnxd4Xx7/S+8lq18GegL6kFbnVXLLh1LnBzpEpFiHN9XoNHkeA=" - ], - "content-type": [ - "application/xml" - ], - "transfer-encoding": [ - "chunked" - ], - "server": [ - "AmazonS3" - ], - "date": [ - "Wed, 26 Apr 2023 14:00:24 GMT" - ], - "x-amz-bucket-region": [ - "us-east-1" - ] - } - } - } - } - } - }, - { - "connection_id": 0, - "action": { - "Data": { - "data": { - "Utf8": "\n\n test-bucket\n prefix~\n 1\n 1000\n false\n \n some-file.file\n 2009-10-12T17:50:30.000Z\n 434234\n STANDARD\n \n" - }, - "direction": "Response" - } - } - }, - { - "connection_id": 0, - "action": { - "Eof": { - "ok": true, - "direction": "Response" - } - } - } - ], - "docs": "Test sending an S3 ListObjectsV2 operation with a successful response.", - "version": "V0" -} diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/tests/interceptors.rs b/aws/sra-test/integration-tests/aws-sdk-s3/tests/interceptors.rs deleted file mode 100644 index c65605c8eb3..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/tests/interceptors.rs +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod util; - -use aws_http::user_agent::AwsUserAgent; -use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; -use aws_smithy_async::test_util::StaticTimeSource; -use aws_smithy_client::dvr; -use aws_smithy_client::dvr::MediaType; -use aws_smithy_client::erase::DynConnector; -use aws_smithy_runtime_api::client::interceptors::{ - BeforeTransmitInterceptorContextMut, Interceptor, -}; -use aws_smithy_runtime_api::client::orchestrator::ConfigBagAccessors; -use aws_smithy_types::config_bag::ConfigBag; -use http::header::USER_AGENT; -use http::HeaderValue; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; - -const LIST_BUCKETS_PATH: &str = "test-data/list-objects-v2.json"; - -#[tokio::test] -async fn operation_interceptor_test() { - tracing_subscriber::fmt::init(); - - let conn = dvr::ReplayingConnection::from_file(LIST_BUCKETS_PATH).unwrap(); - - // Not setting `TestUserAgentInterceptor` here, expecting it to be set later by the - // operation-level config. - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .build(); - let client = Client::from_conf(config); - let fixup = util::FixupPlugin { - timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), - }; - - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .interceptor(util::TestUserAgentInterceptor) - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("success") -} - -#[derive(Debug)] -struct RequestTimeResetInterceptor; -impl Interceptor for RequestTimeResetInterceptor { - fn modify_before_signing( - &self, - _context: &mut BeforeTransmitInterceptorContextMut<'_>, - cfg: &mut ConfigBag, - ) -> Result<(), aws_smithy_runtime_api::client::interceptors::BoxError> { - cfg.set_request_time(StaticTimeSource::new(UNIX_EPOCH)); - - Ok(()) - } -} - -#[derive(Debug)] -struct RequestTimeAdvanceInterceptor(Duration); -impl Interceptor for RequestTimeAdvanceInterceptor { - fn modify_before_signing( - &self, - _context: &mut BeforeTransmitInterceptorContextMut<'_>, - cfg: &mut ConfigBag, - ) -> Result<(), aws_smithy_runtime_api::client::interceptors::BoxError> { - let request_time = cfg.request_time().unwrap(); - let request_time = StaticTimeSource::new(request_time.now() + self.0); - cfg.set_request_time(request_time); - - Ok(()) - } -} - -#[tokio::test] -async fn interceptor_priority() { - let conn = dvr::ReplayingConnection::from_file(LIST_BUCKETS_PATH).unwrap(); - - // `RequestTimeResetInterceptor` will reset a `RequestTime` to `UNIX_EPOCH`, whose previous - // value should be `SystemTime::now()` set by `FixupPlugin`. - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .interceptor(util::TestUserAgentInterceptor) - .interceptor(RequestTimeResetInterceptor) - .build(); - let client = Client::from_conf(config); - let fixup = util::FixupPlugin { - timestamp: SystemTime::now(), - }; - - // `RequestTimeAdvanceInterceptor` configured at the operation level should run after, - // expecting the `RequestTime` to move forward by the specified amount since `UNIX_EPOCH`. - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .interceptor(RequestTimeAdvanceInterceptor(Duration::from_secs( - 1624036048 - ))) - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("success") -} - -#[tokio::test] -async fn set_test_user_agent_through_request_mutation() { - let conn = dvr::ReplayingConnection::from_file(LIST_BUCKETS_PATH).unwrap(); - - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .build(); - let client = Client::from_conf(config); - let fixup = util::FixupPlugin { - timestamp: UNIX_EPOCH + Duration::from_secs(1624036048), - }; - - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .customize() - .await - .unwrap() - .mutate_request(|request| { - let headers = request.headers_mut(); - let user_agent = AwsUserAgent::for_tests(); - headers.insert( - USER_AGENT, - HeaderValue::try_from(user_agent.ua_header()).unwrap(), - ); - headers.insert( - util::X_AMZ_USER_AGENT, - HeaderValue::try_from(user_agent.aws_ua_header()).unwrap(), - ); - }) - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("success") -} diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/tests/sra_test.rs b/aws/sra-test/integration-tests/aws-sdk-s3/tests/sra_test.rs deleted file mode 100644 index 3e6c64be5d0..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/tests/sra_test.rs +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod util; - -use aws_sdk_s3::config::{Credentials, Region}; -use aws_sdk_s3::Client; -use aws_smithy_client::dvr; -use aws_smithy_client::dvr::MediaType; -use aws_smithy_client::erase::DynConnector; -use std::time::{Duration, UNIX_EPOCH}; - -const LIST_BUCKETS_PATH: &str = "test-data/list-objects-v2.json"; - -#[tokio::test] -async fn sra_test() { - tracing_subscriber::fmt::init(); - - let conn = dvr::ReplayingConnection::from_file(LIST_BUCKETS_PATH).unwrap(); - - let config = aws_sdk_s3::Config::builder() - .credentials_provider(Credentials::for_tests()) - .region(Region::new("us-east-1")) - .http_connector(DynConnector::new(conn.clone())) - .interceptor(util::TestUserAgentInterceptor) - .build(); - let client = Client::from_conf(config); - let fixup = util::FixupPlugin; - - let resp = dbg!( - client - .list_objects_v2() - .bucket("test-bucket") - .prefix("prefix~") - .send_orchestrator_with_plugin(Some(fixup)) - .await - ); - // To regenerate the test: - // conn.dump_to_file("test-data/list-objects-v2.json").unwrap(); - let resp = resp.expect("valid e2e test"); - assert_eq!(resp.name(), Some("test-bucket")); - conn.full_validate(MediaType::Xml).await.expect("success") -} diff --git a/aws/sra-test/integration-tests/aws-sdk-s3/tests/util.rs b/aws/sra-test/integration-tests/aws-sdk-s3/tests/util.rs deleted file mode 100644 index 992f9a748e8..00000000000 --- a/aws/sra-test/integration-tests/aws-sdk-s3/tests/util.rs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_http::user_agent::AwsUserAgent; -use aws_runtime::invocation_id::InvocationId; -use aws_smithy_async::test_util::StaticTimeSource; -use aws_smithy_runtime_api::client::interceptors::{ - BeforeTransmitInterceptorContextMut, Interceptor, InterceptorRegistrar, -}; -use aws_smithy_runtime_api::client::orchestrator::ConfigBagAccessors; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::config_bag::ConfigBag; -use http::header::USER_AGENT; -use http::{HeaderName, HeaderValue}; -use std::time::SystemTime; - -pub const X_AMZ_USER_AGENT: HeaderName = HeaderName::from_static("x-amz-user-agent"); - -#[derive(Debug)] -pub struct FixupPlugin; -impl RuntimePlugin for FixupPlugin { - fn configure( - &self, - cfg: &mut ConfigBag, - _interceptors: &mut InterceptorRegistrar, - ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> { - cfg.put(InvocationId::for_tests()); - Ok(()) - } -} - -#[derive(Debug)] -pub struct TestUserAgentInterceptor; -impl Interceptor for TestUserAgentInterceptor { - fn modify_before_signing( - &self, - context: &mut BeforeTransmitInterceptorContextMut<'_>, - _cfg: &mut ConfigBag, - ) -> Result<(), aws_smithy_runtime_api::client::interceptors::BoxError> { - let headers = context.request_mut().headers_mut(); - let user_agent = AwsUserAgent::for_tests(); - // Overwrite user agent header values provided by `UserAgentInterceptor` - headers.insert(USER_AGENT, HeaderValue::try_from(user_agent.ua_header())?); - headers.insert( - X_AMZ_USER_AGENT, - HeaderValue::try_from(user_agent.aws_ua_header())?, - ); - - Ok(()) - } -} diff --git a/build.gradle.kts b/build.gradle.kts index a2d6385db4e..7439d73b146 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,7 +18,7 @@ plugins { } allprojects { repositories { - mavenLocal() + /* mavenLocal() */ mavenCentral() google() } @@ -29,7 +29,7 @@ allprojects.forEach { it.the().apply { toolVersion = "0.8.8" - reportsDirectory.set(file("$buildDir/jacoco-reports")) + reportsDirectory.set(layout.buildDirectory.dir("jacoco-reports")) } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index c4b8cf2d35f..956afdc1a10 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -13,6 +13,7 @@ plugins { repositories { mavenCentral() google() + /* mavenLocal() */ } // Load properties manually to avoid hard coding smithy version @@ -32,6 +33,12 @@ dependencies { implementation(gradleApi()) implementation("com.moandjiezana.toml:toml4j:0.7.2") testImplementation("org.junit.jupiter:junit-jupiter:5.6.1") + + constraints { + implementation("com.google.code.gson:gson:2.8.9") { + because("transitive dependency of toml4j has vulnerabilities; this upgrades it to the patched version") + } + } } tasks.test { @@ -51,7 +58,7 @@ tasks.jacocoTestReport { reports { xml.required.set(false) csv.required.set(false) - html.outputLocation.set(file("$buildDir/reports/jacoco")) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco")) } } diff --git a/buildSrc/src/main/kotlin/CodegenTestCommon.kt b/buildSrc/src/main/kotlin/CodegenTestCommon.kt index cc996eae82d..3a7008f8970 100644 --- a/buildSrc/src/main/kotlin/CodegenTestCommon.kt +++ b/buildSrc/src/main/kotlin/CodegenTestCommon.kt @@ -90,9 +90,11 @@ private fun codegenTests(properties: PropertyRetriever, allTests: List { AllCargoCommands } require(ret.isNotEmpty()) { - "None of the provided cargo commands (`$cargoCommandsOverride`) are valid cargo commands (`${AllCargoCommands.map { - it.toString - }}`)" + "None of the provided cargo commands (`$cargoCommandsOverride`) are valid cargo commands (`${ + AllCargoCommands.map { + it.toString + } + }`)" } return ret } @@ -137,6 +141,7 @@ fun Project.registerGenerateSmithyBuildTask( this.tasks.register("generateSmithyBuild") { description = "generate smithy-build.json" outputs.file(project.projectDir.resolve("smithy-build.json")) + // NOTE: This is not working. allCodegenTests.flatMap { it.imports }.forEach { inputs.file(project.projectDir.resolve(it)) } doFirst { @@ -204,7 +209,7 @@ fun Project.registerModifyMtimeTask() { // hashes coincide. // Debugging tip: it is useful to run with `CARGO_LOG=cargo::core::compiler::fingerprint=trace` to learn why Cargo // determines a compilation unit needs a rebuild. - // For more information see https://github.com/awslabs/smithy-rs/issues/1412. + // For more information see https://github.com/smithy-lang/smithy-rs/issues/1412. this.tasks.register("modifyMtime") { description = "modify Rust files' `mtime` if the contents did not change" dependsOn("generateSmithyBuild") diff --git a/buildSrc/src/main/kotlin/CrateSet.kt b/buildSrc/src/main/kotlin/CrateSet.kt index 132246cf39e..765503e5a16 100644 --- a/buildSrc/src/main/kotlin/CrateSet.kt +++ b/buildSrc/src/main/kotlin/CrateSet.kt @@ -3,7 +3,42 @@ * SPDX-License-Identifier: Apache-2.0 */ +data class Crate(val name: String, val versionPropertyName: String) + object CrateSet { + const val STABLE_VERSION_PROP_NAME = "smithy.rs.runtime.crate.stable.version" + const val UNSTABLE_VERSION_PROP_NAME = "smithy.rs.runtime.crate.unstable.version" + + /* + * Crates marked as `STABLE_VERSION_PROP_NAME` should have the following package metadata in their `Cargo.toml` + * + * [package.metadata.smithy-rs-release-tooling] + * stable = true + */ + + val StableCrates = setOf( + // AWS crates + "aws-config", + "aws-credential-types", + "aws-runtime", + "aws-runtime-api", + "aws-sigv4", + "aws-types", + + // smithy crates + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-runtime", + "aws-smithy-types", + ) + + val version = { name: String -> + when { + StableCrates.contains(name) -> STABLE_VERSION_PROP_NAME + else -> UNSTABLE_VERSION_PROP_NAME + } + } + val AWS_SDK_RUNTIME = listOf( "aws-config", "aws-credential-types", @@ -15,9 +50,9 @@ object CrateSet { "aws-sig-auth", "aws-sigv4", "aws-types", - ) + ).map { Crate(it, version(it)) } - private val SMITHY_RUNTIME_COMMON = listOf( + val SMITHY_RUNTIME_COMMON = listOf( "aws-smithy-async", "aws-smithy-checksums", "aws-smithy-client", @@ -33,15 +68,17 @@ object CrateSet { "aws-smithy-types", "aws-smithy-types-convert", "aws-smithy-xml", - ) + ).map { Crate(it, version(it)) } val AWS_SDK_SMITHY_RUNTIME = SMITHY_RUNTIME_COMMON val SERVER_SMITHY_RUNTIME = SMITHY_RUNTIME_COMMON + listOf( - "aws-smithy-http-server", - "aws-smithy-http-server-python", - "aws-smithy-http-server-typescript", + Crate("aws-smithy-http-server", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-http-server-python", UNSTABLE_VERSION_PROP_NAME), + Crate("aws-smithy-http-server-typescript", UNSTABLE_VERSION_PROP_NAME), ) - val ENTIRE_SMITHY_RUNTIME = (AWS_SDK_SMITHY_RUNTIME + SERVER_SMITHY_RUNTIME).toSortedSet() + val ENTIRE_SMITHY_RUNTIME = (AWS_SDK_SMITHY_RUNTIME + SERVER_SMITHY_RUNTIME).toSortedSet(compareBy { it.name }) + + val ALL_CRATES = AWS_SDK_RUNTIME + ENTIRE_SMITHY_RUNTIME } diff --git a/buildSrc/src/main/kotlin/ManifestPatcher.kt b/buildSrc/src/main/kotlin/ManifestPatcher.kt index 9a9d6fbff54..aabe25a3db8 100644 --- a/buildSrc/src/main/kotlin/ManifestPatcher.kt +++ b/buildSrc/src/main/kotlin/ManifestPatcher.kt @@ -14,8 +14,8 @@ fun rewriteCrateVersion(line: String, version: String): String = line.replace( * Smithy runtime crate versions in smithy-rs are all `0.0.0-smithy-rs-head`. When copying over to the AWS SDK, * these should be changed to the smithy-rs version. */ -fun rewriteRuntimeCrateVersion(properties: PropertyRetriever, line: String): String = - rewriteCrateVersion(line, properties.get("smithy.rs.runtime.crate.version")!!) +fun rewriteRuntimeCrateVersion(version: String, line: String): String = + rewriteCrateVersion(line, version) /** Patches a file with the result of the given `operation` being run on each line */ fun patchFile(path: File, operation: (String) -> String) { diff --git a/buildSrc/src/main/kotlin/RustBuildTool.kt b/buildSrc/src/main/kotlin/RustBuildTool.kt index b8a1a15fb15..1e679956487 100644 --- a/buildSrc/src/main/kotlin/RustBuildTool.kt +++ b/buildSrc/src/main/kotlin/RustBuildTool.kt @@ -28,7 +28,6 @@ private fun runCli( } } .copyTo(action) - action.environment("RUSTFLAGS", "--cfg aws_sdk_unstable") action.execute() } } diff --git a/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt b/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt index 927a4244e26..08145202032 100644 --- a/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt +++ b/buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt @@ -24,7 +24,7 @@ object CrateVersioner { IndependentCrateVersioner( VersionsManifest.fromFile(versionsManifestPath), ModelMetadata.fromFile(modelMetadataPath), - devPreview = true, + devPreview = false, smithyRsVersion = getSmithyRsVersion(rootProject), ) } @@ -39,7 +39,7 @@ interface VersionCrate { class SynchronizedCrateVersioner( properties: PropertyRetriever, - private val sdkVersion: String = properties.get("smithy.rs.runtime.crate.version") + private val sdkVersion: String = properties.get(CrateSet.STABLE_VERSION_PROP_NAME) ?: throw Exception("SDK runtime crate version missing"), ) : VersionCrate { init { diff --git a/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt b/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt index 189bce6a67c..f31211f4db0 100644 --- a/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt +++ b/buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt @@ -19,38 +19,6 @@ data class RootTest( val manifestName: String, ) -// TODO(https://github.com/awslabs/smithy-rs/issues/2810): We can remove the `Flat` layout after the switch -// to `Workspaces` has been released. This can be checked by looking at the `examples/` directory in aws-sdk-rust's -// main branch. -// -// The `Flat` layout is retained for backwards compatibility so that the next release process can succeed. -enum class AwsExamplesLayout { - /** - * Directory layout for examples used prior to June 26, 2023, - * where each example was in the `rust_dev_preview/` root directory and - * was considered to be its own workspace. - * - * This layout had issues with CI in terms of time to compile and disk space required - * since the dependencies would get recompiled for every example. - */ - Flat, - - /** - * Current directory layout where there are a small number of workspaces - * rooted in `rust_dev_preview/`. - */ - Workspaces, - ; - - companion object { - fun detect(project: Project): AwsExamplesLayout = if (project.projectDir.resolve("examples/Cargo.toml").exists()) { - AwsExamplesLayout.Flat - } else { - AwsExamplesLayout.Workspaces - } - } -} - class AwsServices( private val project: Project, services: List, @@ -67,8 +35,8 @@ class AwsServices( val allModules: Set by lazy { ( services.map(AwsService::module).map { "sdk/$it" } + - CrateSet.AWS_SDK_SMITHY_RUNTIME.map { "sdk/$it" } + - CrateSet.AWS_SDK_RUNTIME.map { "sdk/$it" } + CrateSet.AWS_SDK_SMITHY_RUNTIME.map { "sdk/${it.name}" } + + CrateSet.AWS_SDK_RUNTIME.map { "sdk/${it.name}" } // Root tests should not be included since they can't be part of the root Cargo workspace // in order to test differences in Cargo features. Examples should not be included either // because each example itself is a workspace. @@ -77,15 +45,9 @@ class AwsServices( val examples: List by lazy { val examplesRoot = project.projectDir.resolve("examples") - if (AwsExamplesLayout.detect(project) == AwsExamplesLayout.Flat) { - examplesRoot.listFiles { file -> !file.name.startsWith(".") }.orEmpty().toList() - .filter { file -> manifestCompatibleWithGeneratedServices(file) } - .map { "examples/${it.name}" } - } else { - examplesRoot.listFiles { file -> - !file.name.startsWith(".") && file.isDirectory() && file.resolve("Cargo.toml").exists() - }.orEmpty().toList().map { "examples/${it.name}" } - } + examplesRoot.listFiles { file -> + !file.name.startsWith(".") && file.isDirectory() && file.resolve("Cargo.toml").exists() + }.orEmpty().toList().map { "examples/${it.name}" } } /** diff --git a/buildSrc/src/test/kotlin/CrateSetTest.kt b/buildSrc/src/test/kotlin/CrateSetTest.kt new file mode 100644 index 00000000000..dacc75cc329 --- /dev/null +++ b/buildSrc/src/test/kotlin/CrateSetTest.kt @@ -0,0 +1,68 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import CrateSet.AWS_SDK_RUNTIME +import CrateSet.SERVER_SMITHY_RUNTIME +import CrateSet.SMITHY_RUNTIME_COMMON +import CrateSet.STABLE_VERSION_PROP_NAME +import CrateSet.UNSTABLE_VERSION_PROP_NAME +import com.moandjiezana.toml.Toml +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import java.io.File +import java.util.logging.Logger + +class CrateSetTest { + private val logger: Logger = Logger.getLogger("CrateSetTest") + + /* + * Checks whether `versionPropertyName` for a system under test, i.e. `Crate` in `CrateSet.kt`, + * matches what `package.metadata.smithy-rs-release-tooling` says in the `Cargo.toml` + * for the corresponding crate. + */ + private fun sutStabilityMatchesManifestStability(versionPropertyName: String, stabilityInManifest: Boolean, crate: String) { + when (stabilityInManifest) { + true -> assertEquals(STABLE_VERSION_PROP_NAME, versionPropertyName, "Crate: $crate") + false -> assertEquals(UNSTABLE_VERSION_PROP_NAME, versionPropertyName, "Crate: $crate") + } + } + + /* + * Checks whether each element in `crateSet` specifies the correct `versionPropertyName` according to + * what `package.metadata.smithy-rs-release-tooling` says in the `Cargo.toml` for the corresponding crate, + * located at `relativePathToRustRuntime`. + * + * If `package.metadata.smithy-rs-release-tooling` does not exist in a `Cargo.toml`, the implementation + * will treat that crate as unstable. + */ + private fun crateSetStabilitiesMatchManifestStabilities(crateSet: List, relativePathToRustRuntime: String) { + crateSet.forEach { + val path = "$relativePathToRustRuntime/${it.name}/Cargo.toml" + val contents = File(path).readText() + val isStable = try { + Toml().read(contents).getTable("package.metadata.smithy-rs-release-tooling")?.getBoolean("stable") ?: false + } catch (e: java.lang.IllegalStateException) { + // sigv4 doesn't parse but it's stable now, hax hax hax + contents.trim().endsWith("[package.metadata.smithy-rs-release-tooling]\nstable = true") + } + sutStabilityMatchesManifestStability(it.versionPropertyName, isStable, it.name) + } + } + + @Test + fun `aws runtime stabilities should match those in manifest files`() { + crateSetStabilitiesMatchManifestStabilities(AWS_SDK_RUNTIME, "../aws/rust-runtime") + } + + @Test + fun `common smithy runtime stabilities should match those in manifest files`() { + crateSetStabilitiesMatchManifestStabilities(SMITHY_RUNTIME_COMMON, "../rust-runtime") + } + + @Test + fun `server smithy runtime stabilities should match those in manifest files`() { + crateSetStabilitiesMatchManifestStabilities(SERVER_SMITHY_RUNTIME, "../rust-runtime") + } +} diff --git a/ci.mk b/ci.mk index a7022355e6d..ddbe1013f7c 100644 --- a/ci.mk +++ b/ci.mk @@ -131,3 +131,7 @@ check-semver: .PHONY: generate-smithy-rs-release generate-smithy-rs-release: $(CI_ACTION) $@ $(ARGS) + +.PHONY: verify-tls-config +verify-tls-config: + $(CI_ACTION) $@ $(ARGS) diff --git a/clippy-root.toml b/clippy-root.toml new file mode 100644 index 00000000000..87318f3163e --- /dev/null +++ b/clippy-root.toml @@ -0,0 +1,9 @@ +# this file is named `clippy-root.toml` so it isn't picked up automagically. Clippy +# will search up the filesystem for a clippy.toml and this causes problems with tools. +disallowed-methods = [ + # fully qualified function/method name: + "std::time::SystemTime::now", + "std::time::SystemTime::elapsed", + "std::time::Instant::now", + "std::time::Instant::elapsed" +] diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index bb906e99683..56d7a49763a 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -15,7 +15,7 @@ plugins { val smithyVersion: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) -fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "middleware" +fun getSmithyRuntimeMode(): String = properties.get("smithy.runtime.mode") ?: "orchestrator" val pluginName = "rust-client-codegen" val workingDirUnderBuildDir = "smithyprojections/codegen-client-test/" @@ -73,7 +73,11 @@ val allCodegenTests = listOf( ClientTest("aws.protocoltests.restxml#RestXml", "rest_xml", addMessageToErrors = false), ClientTest("aws.protocoltests.query#AwsQuery", "aws_query", addMessageToErrors = false), ClientTest("aws.protocoltests.ec2#AwsEc2", "ec2_query", addMessageToErrors = false), - ClientTest("aws.protocoltests.restxml.xmlns#RestXmlWithNamespace", "rest_xml_namespace", addMessageToErrors = false), + ClientTest( + "aws.protocoltests.restxml.xmlns#RestXmlWithNamespace", + "rest_xml_namespace", + addMessageToErrors = false, + ), ClientTest("aws.protocoltests.restxml#RestXmlExtras", "rest_xml_extras", addMessageToErrors = false), ClientTest( "aws.protocoltests.restxmlunwrapped#RestXmlExtrasUnwrappedErrors", @@ -108,17 +112,22 @@ val allCodegenTests = listOf( "pokemon-service-awsjson-client", dependsOn = listOf("pokemon-awsjson.smithy", "pokemon-common.smithy"), ), + ClientTest("aws.protocoltests.misc#QueryCompatService", "query-compat-test", dependsOn = listOf("aws-json-query-compat.smithy")), ).map(ClientTest::toCodegenTest) +// use this line to run just one test +// .filter { it.module == "query-compat-test" } project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) -project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) +project.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile) + +tasks["generateSmithyBuild"].inputs.property("smithy.runtime.mode", getSmithyRuntimeMode()) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace") project.registerModifyMtimeTask() -project.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) +project.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile, defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) diff --git a/codegen-client-test/model/endpoint-rules.smithy b/codegen-client-test/model/endpoint-rules.smithy index 7b681a3013f..cbd4c903a64 100644 --- a/codegen-client-test/model/endpoint-rules.smithy +++ b/codegen-client-test/model/endpoint-rules.smithy @@ -20,7 +20,6 @@ use aws.protocols#awsJson1_1 }], "parameters": { "Bucket": { "required": false, "type": "String" }, - "Region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, } }) service TestService { diff --git a/codegen-client-test/model/error-correction-nullability-test.smithy b/codegen-client-test/model/error-correction-nullability-test.smithy new file mode 100644 index 00000000000..8a125d30047 --- /dev/null +++ b/codegen-client-test/model/error-correction-nullability-test.smithy @@ -0,0 +1,128 @@ +$version: "2.0" + + +namespace aws.protocoltests.json + +use aws.protocols#awsJson1_0 +use aws.protocols#restXml +use smithy.test#httpResponseTests + +@awsJson1_0 +service RequiredValueJson { + operations: [SayHello], + version: "1" +} + + +@restXml +service RequiredValueXml { + operations: [SayHelloXml], + version: "1" +} + +@error("client") +structure Error { + @required + requestId: String + + @required + message: String +} + +@http(method: "POST", uri: "/") +operation SayHello { output: TestOutputDocument, errors: [Error] } + +@http(method: "POST", uri: "/") +operation SayHelloXml { output: TestOutput, errors: [Error] } + +structure TestOutputDocument with [TestStruct] { innerField: Nested, @required document: Document } +structure TestOutput with [TestStruct] { innerField: Nested } + +@mixin +structure TestStruct { + @required + foo: String, + @required + byteValue: Byte, + @required + listValue: StringList, + @required + mapValue: ListMap, + @required + doubleListValue: DoubleList + @required + nested: Nested + @required + blob: Blob + @required + enum: Enum + @required + union: U + notRequired: String +} + +enum Enum { + A, + B, + C +} +union U { + A: Integer, + B: String, + C: Unit +} + +structure Nested { + @required + a: String +} + +list StringList { + member: String +} + +list DoubleList { + member: StringList +} + +map ListMap { + key: String, + value: StringList +} + +apply SayHello @httpResponseTests([{ + id: "error_recovery_json", + protocol: awsJson1_0, + params: { + union: { A: 5 }, + enum: "A", + foo: "", + byteValue: 0, + blob: "", + listValue: [], + mapValue: {}, + doubleListValue: [] + document: null + nested: { a: "" } + }, + code: 200, + body: "{\"union\": { \"A\": 5 }, \"enum\": \"A\" }" + }]) + +apply SayHelloXml @httpResponseTests([{ + id: "error_recovery_xml", + protocol: restXml, + params: { + union: { A: 5 }, + enum: "A", + foo: "", + byteValue: 0, + blob: "", + listValue: [], + mapValue: {}, + doubleListValue: [] + nested: { a: "" } + }, + code: 200, + body: "5A" + }]) diff --git a/codegen-client-test/model/rest-xml-extras.smithy b/codegen-client-test/model/rest-xml-extras.smithy index 76a6bbd9fa8..b518ad09c69 100644 --- a/codegen-client-test/model/rest-xml-extras.smithy +++ b/codegen-client-test/model/rest-xml-extras.smithy @@ -74,9 +74,6 @@ structure PrimitiveIntDocument { defaultedValue: PrimitiveInt } -@enum([{"value": "enumvalue", "name": "V"}]) -string StringEnum - integer PrimitiveInt structure AttributePartyInputOutput { diff --git a/codegen-client/build.gradle.kts b/codegen-client/build.gradle.kts index 62d543beb4d..baed9a9b914 100644 --- a/codegen-client/build.gradle.kts +++ b/codegen-client/build.gradle.kts @@ -77,12 +77,11 @@ if (isTestingEnabled.toBoolean()) { tasks.test { useJUnitPlatform() testLogging { - events("passed", "skipped", "failed") + events("failed") exceptionFormat = TestExceptionFormat.FULL showCauses = true showExceptions = true showStackTraces = true - showStandardStreams = true } } @@ -91,7 +90,7 @@ if (isTestingEnabled.toBoolean()) { reports { xml.required.set(false) csv.required.set(false) - html.outputLocation.set(file("$buildDir/reports/jacoco")) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco")) } } @@ -106,5 +105,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt index 18db6198232..64b3a2b2b36 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt @@ -9,10 +9,12 @@ import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.ClientBuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol /** @@ -35,5 +37,8 @@ data class ClientCodegenContext( ) : CodegenContext( model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.CLIENT, ) { - val smithyRuntimeMode: SmithyRuntimeMode get() = settings.codegenConfig.enableNewSmithyRuntime + val enableUserConfigurableRuntimePlugins: Boolean get() = settings.codegenConfig.enableUserConfigurableRuntimePlugins + override fun builderInstantiator(): BuilderInstantiator { + return ClientBuilderInstantiator(this) + } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt index 9ddbbd4dc8d..ab26c7ae9ec 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt @@ -7,7 +7,6 @@ package software.amazon.smithy.rust.codegen.client.smithy import software.amazon.smithy.build.PluginContext import software.amazon.smithy.model.Model -import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.Shape @@ -45,10 +44,9 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGenerat import software.amazon.smithy.rust.codegen.core.smithy.transformers.EventStreamNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rust.codegen.core.util.inputShape import software.amazon.smithy.rust.codegen.core.util.isEventStream import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.runCommand @@ -78,10 +76,11 @@ class ClientCodegenVisitor( val rustSymbolProviderConfig = RustSymbolProviderConfig( runtimeConfig = settings.runtimeConfig, renameExceptions = settings.codegenConfig.renameExceptions, - nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_ZERO_VALUE_V1, + nullabilityCheckMode = settings.codegenConfig.nullabilityCheckMode, moduleProvider = ClientModuleProvider, nameBuilderFor = { symbol -> "${symbol.name}Builder" }, ) + val baseModel = baselineTransform(context.model) val untransformedService = settings.getService(baseModel) val (protocol, generator) = ClientProtocolLoader( @@ -170,8 +169,9 @@ class ClientCodegenVisitor( ), ) try { - "cargo fmt".runCommand(fileManifest.baseDir, timeout = settings.codegenConfig.formatTimeoutSeconds.toLong()) - } catch (err: CommandFailed) { + // use an increased max_width to make rustfmt fail less frequently + "cargo fmt -- --config max_width=150".runCommand(fileManifest.baseDir, timeout = settings.codegenConfig.formatTimeoutSeconds.toLong()) + } catch (err: CommandError) { logger.warning("Failed to run cargo fmt: [${service.id}]\n${err.output}") } @@ -223,6 +223,7 @@ class ClientCodegenVisitor( this, shape, codegenDecorator.structureCustomizations(codegenContext, emptyList()), + structSettings = codegenContext.structSettings(), ).render() implBlock(symbolProvider.toSymbol(shape)) { @@ -246,6 +247,7 @@ class ClientCodegenVisitor( shape, errorTrait, codegenDecorator.errorImplCustomizations(codegenContext, emptyList()), + codegenContext.structSettings(), ) errorGenerator::renderStruct to errorGenerator::renderBuilder } @@ -302,25 +304,22 @@ class ClientCodegenVisitor( */ override fun operationShape(operationShape: OperationShape) { rustCrate.useShapeWriter(operationShape) operationWriter@{ - rustCrate.useShapeWriter(operationShape.inputShape(codegenContext.model)) inputWriter@{ - // Render the operation shape & serializers input `input.rs` - operationGenerator.renderOperation( - this@operationWriter, - this@inputWriter, - operationShape, - codegenDecorator, - ) + // Render the operation shape + operationGenerator.renderOperation( + this@operationWriter, + operationShape, + codegenDecorator, + ) - // render protocol tests into `operation.rs` (note operationWriter vs. inputWriter) - codegenDecorator.protocolTestGenerator( + // render protocol tests into `operation.rs` (note operationWriter vs. inputWriter) + codegenDecorator.protocolTestGenerator( + codegenContext, + DefaultProtocolTestGenerator( codegenContext, - DefaultProtocolTestGenerator( - codegenContext, - protocolGeneratorFactory.support(), - operationShape, - ), - ).render(this@operationWriter) - } + protocolGeneratorFactory.support(), + operationShape, + ), + ).render(this@operationWriter) rustCrate.withModule(symbolProvider.moduleForOperationError(operationShape)) { OperationErrorGenerator( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt new file mode 100644 index 00000000000..6aaf638680c --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt @@ -0,0 +1,17 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy + +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType + +/** Returns a symbol for a type re-exported into crate::config + * Although it is not always possible to use this, this is the preferred method for using types in config customizations + * and ensures that your type will be re-exported if it is used. + */ +fun configReexport(type: RuntimeType): RuntimeType = RuntimeType.forInlineFun(type.name, module = ClientRustModule.config) { + rustTemplate("pub use #{type};", "type" to type) +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt index 93a0c2de162..0216b2618cc 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt @@ -73,23 +73,21 @@ object ClientRustModule { val interceptors = RustModule.public("interceptors", parent = self) } - // TODO(enableNewSmithyRuntimeCleanup): Delete this root endpoint module - @Deprecated(message = "use the endpoint() method to get the endpoint module for now") - val Endpoint = RustModule.public("endpoint") - - // TODO(enableNewSmithyRuntimeCleanup): Just use Config.endpoint directly and delete this function - fun endpoint(codegenContext: ClientCodegenContext): RustModule.LeafModule = if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - Endpoint - } else { - Config.endpoint - } - val Error = RustModule.public("error") val Operation = RustModule.public("operation") val Meta = RustModule.public("meta") val Input = RustModule.public("input") val Output = RustModule.public("output") - val Primitives = RustModule.public("primitives") + + /** crate::primitives */ + val primitives = Primitives.self + object Primitives { + /** crate::primitives */ + val self = RustModule.public("primitives") + + /** crate::primitives::event_stream */ + val EventStream = RustModule.public("event_stream", parent = self) + } /** crate::types */ val types = Types.self @@ -115,14 +113,14 @@ class ClientModuleDocProvider( ClientRustModule.Config.endpoint -> strDoc("Types needed to configure endpoint resolution.") ClientRustModule.Config.retry -> strDoc("Retry configuration.") ClientRustModule.Config.timeout -> strDoc("Timeout configuration.") - ClientRustModule.Config.interceptors -> strDoc("Types needed to implement [`Interceptor`](crate::config::Interceptor).") + ClientRustModule.Config.interceptors -> strDoc("Types needed to implement [`Intercept`](crate::config::Intercept).") ClientRustModule.Error -> strDoc("Common errors and error handling utilities.") - ClientRustModule.Endpoint -> strDoc("Endpoint resolution functionality.") ClientRustModule.Operation -> strDoc("All operations that this crate can perform.") ClientRustModule.Meta -> strDoc("Information about this crate.") ClientRustModule.Input -> PANIC("this module shouldn't exist in the new scheme") ClientRustModule.Output -> PANIC("this module shouldn't exist in the new scheme") - ClientRustModule.Primitives -> strDoc("Primitives such as `Blob` or `DateTime` used by other types.") + ClientRustModule.primitives -> strDoc("Primitives such as `Blob` or `DateTime` used by other types.") + ClientRustModule.Primitives.EventStream -> strDoc("Event stream related primitives such as `Message` or `Header`.") ClientRustModule.types -> strDoc("Data structures used by operation inputs/outputs.") ClientRustModule.Types.Error -> strDoc("Error types that $serviceName can respond with.") else -> TODO("Document this module: $module") @@ -161,7 +159,6 @@ class ClientModuleDocProvider( let result = client.$opFnName() .customize() - .await? .mutate_request(|req| { // Add `x-example-header` with value req.headers_mut() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt index f4d2fdeedec..67b76f0862b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.client.smithy import software.amazon.smithy.model.Model +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.node.ObjectNode import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.core.smithy.CODEGEN_SETTINGS @@ -72,43 +73,6 @@ data class ClientRustSettings( } } -// TODO(enableNewSmithyRuntimeCleanup): Remove this mode after switching to the orchestrator -enum class SmithyRuntimeMode { - Middleware, - BothDefaultMiddleware, - BothDefaultOrchestrator, - Orchestrator, - ; - - val exclusivelyGenerateMiddleware: Boolean get() = generateMiddleware && !generateOrchestrator - - val generateMiddleware: Boolean get() = when (this) { - Middleware, BothDefaultMiddleware, BothDefaultOrchestrator -> true - else -> false - } - - val generateOrchestrator: Boolean get() = when (this) { - Orchestrator, BothDefaultMiddleware, BothDefaultOrchestrator -> true - else -> false - } - - val defaultToMiddleware: Boolean get() = when (this) { - Middleware, BothDefaultMiddleware -> true - else -> false - } - val defaultToOrchestrator: Boolean get() = !defaultToMiddleware - - companion object { - fun fromString(value: String): SmithyRuntimeMode = when (value) { - "middleware" -> Middleware - "orchestrator" -> Orchestrator - "both_default_middleware" -> BothDefaultMiddleware - "both_default_orchestrator" -> BothDefaultOrchestrator - else -> throw IllegalArgumentException("unknown runtime mode: $value") - } - } -} - /** * [renameExceptions]: Rename `Exception` to `Error` in the generated SDK * [includeFluentClient]: Generate a `client` module in the generated SDK (currently the AWS SDK sets this to `false` @@ -118,42 +82,54 @@ enum class SmithyRuntimeMode { data class ClientCodegenConfig( override val formatTimeoutSeconds: Int = defaultFormatTimeoutSeconds, override val debugMode: Boolean = defaultDebugMode, + override val flattenCollectionAccessors: Boolean = defaultFlattenAccessors, + val nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT, val renameExceptions: Boolean = defaultRenameExceptions, val includeFluentClient: Boolean = defaultIncludeFluentClient, val addMessageToErrors: Boolean = defaultAddMessageToErrors, // TODO(EventStream): [CLEANUP] Remove this property when turning on Event Stream for all services val eventStreamAllowList: Set = defaultEventStreamAllowList, - // TODO(SmithyRuntime): Remove this once we commit to switch to aws-smithy-runtime and aws-smithy-runtime-api - val enableNewSmithyRuntime: SmithyRuntimeMode = defaultEnableNewSmithyRuntime, + /** If true, adds `endpoint_url`/`set_endpoint_url` methods to the service config */ + val includeEndpointUrlConfig: Boolean = defaultIncludeEndpointUrlConfig, + val enableUserConfigurableRuntimePlugins: Boolean = defaultEnableUserConfigurableRuntimePlugins, ) : CoreCodegenConfig( - formatTimeoutSeconds, debugMode, + formatTimeoutSeconds, debugMode, defaultFlattenAccessors, ) { companion object { private const val defaultRenameExceptions = true private const val defaultIncludeFluentClient = true private const val defaultAddMessageToErrors = true private val defaultEventStreamAllowList: Set = emptySet() - private val defaultEnableNewSmithyRuntime = SmithyRuntimeMode.Middleware + private const val defaultIncludeEndpointUrlConfig = true + private const val defaultEnableUserConfigurableRuntimePlugins = true + private const val defaultNullabilityCheckMode = "CLIENT" + + // Note: only clients default to true, servers default to false + private const val defaultFlattenAccessors = true fun fromCodegenConfigAndNode(coreCodegenConfig: CoreCodegenConfig, node: Optional) = if (node.isPresent) { ClientCodegenConfig( formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds, + flattenCollectionAccessors = node.get().getBooleanMemberOrDefault("flattenCollectionAccessors", defaultFlattenAccessors), debugMode = coreCodegenConfig.debugMode, - eventStreamAllowList = node.get().getArrayMember("eventStreamAllowList") - .map { array -> array.toList().mapNotNull { node -> node.asStringNode().orNull()?.value } } - .orNull()?.toSet() ?: defaultEventStreamAllowList, + eventStreamAllowList = node.get().getArrayMember("eventStreamAllowList").map { array -> + array.toList().mapNotNull { node -> + node.asStringNode().orNull()?.value + } + }.orNull()?.toSet() ?: defaultEventStreamAllowList, renameExceptions = node.get().getBooleanMemberOrDefault("renameErrors", defaultRenameExceptions), includeFluentClient = node.get().getBooleanMemberOrDefault("includeFluentClient", defaultIncludeFluentClient), addMessageToErrors = node.get().getBooleanMemberOrDefault("addMessageToErrors", defaultAddMessageToErrors), - enableNewSmithyRuntime = SmithyRuntimeMode.fromString( - node.get().getStringMemberOrDefault("enableNewSmithyRuntime", "middleware"), - ), + includeEndpointUrlConfig = node.get().getBooleanMemberOrDefault("includeEndpointUrlConfig", defaultIncludeEndpointUrlConfig), + enableUserConfigurableRuntimePlugins = node.get().getBooleanMemberOrDefault("enableUserConfigurableRuntimePlugins", defaultEnableUserConfigurableRuntimePlugins), + nullabilityCheckMode = NullableIndex.CheckMode.valueOf(node.get().getStringMemberOrDefault("nullabilityCheckMode", defaultNullabilityCheckMode)), ) } else { ClientCodegenConfig( formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds, debugMode = coreCodegenConfig.debugMode, + nullabilityCheckMode = NullableIndex.CheckMode.valueOf(defaultNullabilityCheckMode), ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt index 7b05e664e80..9f75a10ddcd 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt @@ -9,17 +9,19 @@ import software.amazon.smithy.build.PluginContext import software.amazon.smithy.codegen.core.ReservedWordSymbolProvider import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.ServiceShape -import software.amazon.smithy.rust.codegen.client.smithy.customizations.ApiKeyAuthDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.ClientCustomizations import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpAuthDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpConnectorConfigDecorator +import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdempotencyTokenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthDecorator +import software.amazon.smithy.rust.codegen.client.smithy.customizations.SensitiveOutputDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.RequiredCustomizations import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointParamsDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.StalledStreamProtectionDecorator import software.amazon.smithy.rust.codegen.client.testutil.ClientDecoratableBuildPlugin import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.NonExhaustive import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider @@ -63,9 +65,11 @@ class RustClientCodegenPlugin : ClientDecoratableBuildPlugin() { EndpointsDecorator(), EndpointParamsDecorator(), NoAuthDecorator(), - ApiKeyAuthDecorator(), HttpAuthDecorator(), HttpConnectorConfigDecorator(), + SensitiveOutputDecorator(), + IdempotencyTokenDecorator(), + StalledStreamProtectionDecorator(), *decorator, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt deleted file mode 100644 index 4cf45a49ef3..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecorator.kt +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import software.amazon.smithy.model.knowledge.ServiceIndex -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.model.traits.HttpApiKeyAuthTrait -import software.amazon.smithy.model.traits.OptionalAuthTrait -import software.amazon.smithy.model.traits.Trait -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate -import software.amazon.smithy.rust.codegen.core.util.letIf - -// TODO(enableNewSmithyRuntimeCleanup): Delete this decorator when switching to the orchestrator - -/** - * Inserts a ApiKeyAuth configuration into the operation - */ -class ApiKeyAuthDecorator : ClientCodegenDecorator { - override val name: String = "ApiKeyAuth" - override val order: Byte = 10 - - private fun applies(codegenContext: ClientCodegenContext) = - codegenContext.smithyRuntimeMode.generateMiddleware && - isSupportedApiKeyAuth(codegenContext) - - override fun configCustomizations( - codegenContext: ClientCodegenContext, - baseCustomizations: List, - ): List { - return baseCustomizations.letIf(applies(codegenContext)) { customizations -> - customizations + ApiKeyConfigCustomization(codegenContext) - } - } - - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - if (applies(codegenContext) && hasApiKeyAuthScheme(codegenContext, operation)) { - val service = codegenContext.serviceShape - val authDefinition: HttpApiKeyAuthTrait = service.expectTrait(HttpApiKeyAuthTrait::class.java) - return baseCustomizations + ApiKeyOperationCustomization(codegenContext.runtimeConfig, authDefinition) - } - return baseCustomizations - } - - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - if (applies(codegenContext)) { - rustCrate.withModule(ClientRustModule.config) { - rust("pub use #T;", apiKey(codegenContext.runtimeConfig)) - } - } - } -} - -/** - * Returns if the service supports the httpApiKeyAuth trait. - * - * @param codegenContext Codegen context that includes the model and service shape - * @return if the httpApiKeyAuth trait is used by the service - */ -private fun isSupportedApiKeyAuth(codegenContext: ClientCodegenContext): Boolean { - return ServiceIndex.of(codegenContext.model).getAuthSchemes(codegenContext.serviceShape).containsKey(HttpApiKeyAuthTrait.ID) -} - -/** - * Returns if the service and operation have the httpApiKeyAuthTrait. - * - * @param codegenContext codegen context that includes the model and service shape - * @param operation operation shape - * @return if the service and operation have the httpApiKeyAuthTrait - */ -private fun hasApiKeyAuthScheme(codegenContext: ClientCodegenContext, operation: OperationShape): Boolean { - val auth: Map = ServiceIndex.of(codegenContext.model).getEffectiveAuthSchemes(codegenContext.serviceShape.getId(), operation.getId()) - return auth.containsKey(HttpApiKeyAuthTrait.ID) && !operation.hasTrait(OptionalAuthTrait.ID) -} - -private class ApiKeyOperationCustomization(private val runtimeConfig: RuntimeConfig, private val authDefinition: HttpApiKeyAuthTrait) : OperationCustomization() { - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.MutateRequest -> writable { - rustBlock("if let Some(api_key_config) = ${section.config}.api_key()") { - rust( - """ - ${section.request}.properties_mut().insert(api_key_config.clone()); - let api_key = api_key_config.api_key(); - """, - ) - val definitionName = authDefinition.getName() - if (authDefinition.getIn() == HttpApiKeyAuthTrait.Location.QUERY) { - rustTemplate( - """ - let auth_definition = #{http_auth_definition}::query( - "$definitionName".to_owned(), - ); - let name = auth_definition.name(); - let mut query = #{query_writer}::new(${section.request}.http().uri()); - query.insert(name, api_key); - *${section.request}.http_mut().uri_mut() = query.build_uri(); - """, - "http_auth_definition" to - RuntimeType.smithyHttpAuth(runtimeConfig).resolve("definition::HttpAuthDefinition"), - "query_writer" to RuntimeType.smithyHttp(runtimeConfig).resolve("query_writer::QueryWriter"), - ) - } else { - val definitionScheme: String = authDefinition.getScheme() - .map { scheme -> - "Some(\"" + scheme + "\".to_owned())" - } - .orElse("None") - rustTemplate( - """ - let auth_definition = #{http_auth_definition}::header( - "$definitionName".to_owned(), - $definitionScheme, - ); - let name = auth_definition.name(); - let value = match auth_definition.scheme() { - Some(value) => format!("{value} {api_key}"), - None => api_key.to_owned(), - }; - ${section.request} - .http_mut() - .headers_mut() - .insert( - #{http_header}::HeaderName::from_bytes(name.as_bytes()).expect("valid header name for api key auth"), - #{http_header}::HeaderValue::from_bytes(value.as_bytes()).expect("valid header value for api key auth") - ); - """, - "http_auth_definition" to - RuntimeType.smithyHttpAuth(runtimeConfig).resolve("definition::HttpAuthDefinition"), - "http_header" to RuntimeType.Http.resolve("header"), - ) - } - } - } - else -> emptySection - } -} - -private class ApiKeyConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { - val runtimeMode = codegenContext.smithyRuntimeMode - val runtimeConfig = codegenContext.runtimeConfig - private val codegenScope = arrayOf( - *preludeScope, - "ApiKey" to apiKey(runtimeConfig), - ) - - override fun section(section: ServiceConfig): Writable = - when (section) { - is ServiceConfig.BuilderStruct -> writable { - rustTemplate("api_key: #{Option}<#{ApiKey}>,", *codegenScope) - } - is ServiceConfig.BuilderImpl -> writable { - rustTemplate( - """ - /// Sets the API key that will be used by the client. - pub fn api_key(mut self, api_key: #{ApiKey}) -> Self { - self.set_api_key(Some(api_key)); - self - } - - /// Sets the API key that will be used by the client. - pub fn set_api_key(&mut self, api_key: #{Option}<#{ApiKey}>) -> &mut Self { - self.api_key = api_key; - self - } - """, - *codegenScope, - ) - } - is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToOrchestrator) { - rust("layer.store_or_unset(self.api_key);") - } else { - rust("api_key: self.api_key,") - } - } - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("api_key: #{Option}<#{ApiKey}>,", *codegenScope) - } - } - is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Returns API key used by the client, if it was provided. - pub fn api_key(&self) -> #{Option}<&#{ApiKey}> { - self.inner.load::<#{ApiKey}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns API key used by the client, if it was provided. - pub fn api_key(&self) -> #{Option}<&#{ApiKey}> { - self.api_key.as_ref() - } - """, - *codegenScope, - ) - } - } - else -> emptySection - } -} - -private fun apiKey(runtimeConfig: RuntimeConfig) = RuntimeType.smithyHttpAuth(runtimeConfig).resolve("api_key::AuthApiKey") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt index 22dd4e9919c..6c55a4e682d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt @@ -29,7 +29,7 @@ class ClientDocsGenerator(private val codegenContext: ClientCodegenContext) : Li private fun crateLayout(): Writable = writable { - val serviceName = codegenContext.serviceShape?.getTrait()?.value ?: "the service" + val serviceName = codegenContext.serviceShape.getTrait()?.value ?: "the service" containerDocs( """ The entry point for most customers will be [`Client`], which exposes one method for each API diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt index eaed687aebe..5f1688037e2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt @@ -20,13 +20,13 @@ class ConnectionPoisoningRuntimePluginCustomization( override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.RegisterInterceptor -> { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { // This interceptor assumes that a compatible Connector is set. Otherwise, connection poisoning // won't work and an error message will be logged. - section.registerInterceptor(runtimeConfig, this) { + section.registerInterceptor(this) { rust( "#T::new()", - smithyRuntime(runtimeConfig).resolve("client::connectors::connection_poisoning::ConnectionPoisoningInterceptor"), + smithyRuntime(runtimeConfig).resolve("client::http::connection_poisoning::ConnectionPoisoningInterceptor"), ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/EndpointPrefixGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/EndpointPrefixGenerator.kt deleted file mode 100644 index 60ac6c631a4..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/EndpointPrefixGenerator.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.traits.EndpointTrait -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.EndpointTraitBindings -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.withBlock -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.orNull - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file - -class EndpointPrefixGenerator(private val codegenContext: ClientCodegenContext, private val shape: OperationShape) : - OperationCustomization() { - companion object { - fun endpointTraitBindings(codegenContext: ClientCodegenContext, shape: OperationShape): EndpointTraitBindings? = - shape.getTrait(EndpointTrait::class.java).map { epTrait -> - EndpointTraitBindings( - codegenContext.model, - codegenContext.symbolProvider, - codegenContext.runtimeConfig, - shape, - epTrait, - ) - }.orNull() - } - - override fun section(section: OperationSection): Writable = when (section) { - is OperationSection.MutateRequest -> writable { - endpointTraitBindings(codegenContext, shape)?.also { endpointTraitBindings -> - withBlock("let endpoint_prefix = ", "?;") { - endpointTraitBindings.render(this, "self", codegenContext.smithyRuntimeMode) - } - rust("request.properties_mut().insert(endpoint_prefix);") - } - } - - else -> emptySection - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt index 4a8f6057f50..1f11f991643 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt @@ -13,9 +13,9 @@ import software.amazon.smithy.model.traits.HttpBasicAuthTrait import software.amazon.smithy.model.traits.HttpBearerAuthTrait import software.amazon.smithy.model.traits.HttpDigestAuthTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption.StaticAuthOption +import software.amazon.smithy.rust.codegen.client.smithy.configReexport +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption.StaticAuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection @@ -26,23 +26,24 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.letIf -fun codegenScope(runtimeConfig: RuntimeConfig): Array> { +private fun codegenScope(runtimeConfig: RuntimeConfig): Array> { val smithyRuntime = CargoDependency.smithyRuntime(runtimeConfig).withFeature("http-auth").toType() - val smithyRuntimeApi = CargoDependency.smithyRuntimeApi(runtimeConfig).withFeature("http-auth").toType() + val smithyRuntimeApi = CargoDependency.smithyRuntimeApiClient(runtimeConfig).withFeature("http-auth").toType() val authHttp = smithyRuntime.resolve("client::auth::http") val authHttpApi = smithyRuntimeApi.resolve("client::auth::http") return arrayOf( + "Token" to configReexport(smithyRuntimeApi.resolve("client::identity::http::Token")), + "Login" to configReexport(smithyRuntimeApi.resolve("client::identity::http::Login")), + "ResolveIdentity" to configReexport(smithyRuntimeApi.resolve("client::identity::ResolveIdentity")), + "AuthSchemeId" to smithyRuntimeApi.resolve("client::auth::AuthSchemeId"), "ApiKeyAuthScheme" to authHttp.resolve("ApiKeyAuthScheme"), "ApiKeyLocation" to authHttp.resolve("ApiKeyLocation"), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "BasicAuthScheme" to authHttp.resolve("BasicAuthScheme"), "BearerAuthScheme" to authHttp.resolve("BearerAuthScheme"), "DigestAuthScheme" to authHttp.resolve("DigestAuthScheme"), @@ -50,12 +51,8 @@ fun codegenScope(runtimeConfig: RuntimeConfig): Array> { "HTTP_BASIC_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_BASIC_AUTH_SCHEME_ID"), "HTTP_BEARER_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_BEARER_AUTH_SCHEME_ID"), "HTTP_DIGEST_AUTH_SCHEME_ID" to authHttpApi.resolve("HTTP_DIGEST_AUTH_SCHEME_ID"), - "IdentityResolver" to smithyRuntimeApi.resolve("client::identity::IdentityResolver"), - "Login" to smithyRuntimeApi.resolve("client::identity::http::Login"), - "PropertyBag" to RuntimeType.smithyHttp(runtimeConfig).resolve("property_bag::PropertyBag"), - "SharedHttpAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedHttpAuthScheme"), + "SharedAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedAuthScheme"), "SharedIdentityResolver" to smithyRuntimeApi.resolve("client::identity::SharedIdentityResolver"), - "Token" to smithyRuntimeApi.resolve("client::identity::http::Token"), ) } @@ -68,12 +65,11 @@ private data class HttpAuthSchemes( companion object { fun from(codegenContext: ClientCodegenContext): HttpAuthSchemes { val authSchemes = ServiceIndex.of(codegenContext.model).getAuthSchemes(codegenContext.serviceShape).keys - val generateOrchestrator = codegenContext.smithyRuntimeMode.generateOrchestrator return HttpAuthSchemes( - apiKey = generateOrchestrator && authSchemes.contains(HttpApiKeyAuthTrait.ID), - basic = generateOrchestrator && authSchemes.contains(HttpBasicAuthTrait.ID), - bearer = generateOrchestrator && authSchemes.contains(HttpBearerAuthTrait.ID), - digest = generateOrchestrator && authSchemes.contains(HttpDigestAuthTrait.ID), + apiKey = authSchemes.contains(HttpApiKeyAuthTrait.ID), + basic = authSchemes.contains(HttpBasicAuthTrait.ID), + bearer = authSchemes.contains(HttpBearerAuthTrait.ID), + digest = authSchemes.contains(HttpDigestAuthTrait.ID), ) } } @@ -90,20 +86,22 @@ class HttpAuthDecorator : ClientCodegenDecorator { override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, - baseAuthOptions: List, - ): List { + baseAuthSchemeOptions: List, + ): List { val serviceIndex = ServiceIndex.of(codegenContext.model) val authSchemes = serviceIndex.getEffectiveAuthSchemes(codegenContext.serviceShape, operationShape) val codegenScope = codegenScope(codegenContext.runtimeConfig) - val options = ArrayList() + val options = ArrayList() for (authScheme in authSchemes.keys) { fun addOption(schemeShapeId: ShapeId, name: String) { options.add( - StaticAuthOption( + StaticAuthSchemeOption( schemeShapeId, - writable { - rustTemplate("$name,", *codegenScope) - }, + listOf( + writable { + rustTemplate(name, *codegenScope) + }, + ), ), ) } @@ -115,7 +113,7 @@ class HttpAuthDecorator : ClientCodegenDecorator { else -> {} } } - return baseAuthOptions + options + return baseAuthSchemeOptions + options } override fun configCustomizations( @@ -137,25 +135,10 @@ class HttpAuthDecorator : ClientCodegenDecorator { it + HttpAuthServiceRuntimePluginCustomization(codegenContext, authSchemes) } } - - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - val authSchemes = HttpAuthSchemes.from(codegenContext) - if (authSchemes.anyEnabled()) { - rustCrate.withModule(ClientRustModule.config) { - val codegenScope = codegenScope(codegenContext.runtimeConfig) - if (authSchemes.isTokenBased()) { - rustTemplate("pub use #{Token};", *codegenScope) - } - if (authSchemes.isLoginBased()) { - rustTemplate("pub use #{Login};", *codegenScope) - } - } - } - } } private class HttpAuthServiceRuntimePluginCustomization( - private val codegenContext: ClientCodegenContext, + codegenContext: ClientCodegenContext, private val authSchemes: HttpAuthSchemes, ) : ServiceRuntimePluginCustomization() { private val serviceShape = codegenContext.serviceShape @@ -163,12 +146,13 @@ private class HttpAuthServiceRuntimePluginCustomization( override fun section(section: ServiceRuntimePluginSection): Writable = writable { when (section) { - is ServiceRuntimePluginSection.AdditionalConfig -> { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { fun registerAuthScheme(scheme: Writable) { - section.registerHttpAuthScheme(this, codegenContext.runtimeConfig) { - rustTemplate("#{SharedHttpAuthScheme}::new(#{Scheme})", *codegenScope, "Scheme" to scheme) + section.registerAuthScheme(this) { + rustTemplate("#{SharedAuthScheme}::new(#{Scheme})", *codegenScope, "Scheme" to scheme) } } + fun registerNamedAuthScheme(name: String) { registerAuthScheme { rustTemplate("#{$name}::new()", *codegenScope) @@ -235,9 +219,8 @@ private class HttpAuthConfigCustomization( } /// Sets an API key resolver will be used for authentication. - pub fn api_key_resolver(mut self, api_key_resolver: impl #{IdentityResolver} + 'static) -> Self { - #{ConfigBagAccessors}::push_identity_resolver( - &mut self.inner, + pub fn api_key_resolver(mut self, api_key_resolver: impl #{ResolveIdentity} + 'static) -> Self { + self.runtime_components.set_identity_resolver( #{HTTP_API_KEY_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(api_key_resolver) ); @@ -256,9 +239,8 @@ private class HttpAuthConfigCustomization( } /// Sets a bearer token provider that will be used for HTTP bearer auth. - pub fn bearer_token_resolver(mut self, bearer_token_resolver: impl #{IdentityResolver} + 'static) -> Self { - #{ConfigBagAccessors}::push_identity_resolver( - &mut self.inner, + pub fn bearer_token_resolver(mut self, bearer_token_resolver: impl #{ResolveIdentity} + 'static) -> Self { + self.runtime_components.set_identity_resolver( #{HTTP_BEARER_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(bearer_token_resolver) ); @@ -277,9 +259,8 @@ private class HttpAuthConfigCustomization( } /// Sets a login resolver that will be used for HTTP basic auth. - pub fn basic_auth_login_resolver(mut self, basic_auth_resolver: impl #{IdentityResolver} + 'static) -> Self { - #{ConfigBagAccessors}::push_identity_resolver( - &mut self.inner, + pub fn basic_auth_login_resolver(mut self, basic_auth_resolver: impl #{ResolveIdentity} + 'static) -> Self { + self.runtime_components.set_identity_resolver( #{HTTP_BASIC_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(basic_auth_resolver) ); @@ -298,9 +279,8 @@ private class HttpAuthConfigCustomization( } /// Sets a login resolver that will be used for HTTP digest auth. - pub fn digest_auth_login_resolver(mut self, digest_auth_resolver: impl #{IdentityResolver} + 'static) -> Self { - #{ConfigBagAccessors}::push_identity_resolver( - &mut self.inner, + pub fn digest_auth_login_resolver(mut self, digest_auth_resolver: impl #{ResolveIdentity} + 'static) -> Self { + self.runtime_components.set_identity_resolver( #{HTTP_DIGEST_AUTH_SCHEME_ID}, #{SharedIdentityResolver}::new(digest_auth_resolver) ); diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt index fc5c1d6298d..aba470973da 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt @@ -19,8 +19,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -40,12 +38,12 @@ class HttpChecksumRequiredGenerator( is OperationSection.AdditionalRuntimePlugins -> writable { section.addOperationRuntimePlugin(this) { rustTemplate( - "#{HttpChecksumRequiredRuntimePlugin}", + "#{HttpChecksumRequiredRuntimePlugin}::new()", "HttpChecksumRequiredRuntimePlugin" to InlineDependency.forRustFile( RustModule.pubCrate("client_http_checksum_required", parent = ClientRustModule.root), "/inlineable/src/client_http_checksum_required.rs", - CargoDependency.smithyRuntimeApi(codegenContext.runtimeConfig), + CargoDependency.smithyRuntimeApiClient(codegenContext.runtimeConfig), CargoDependency.smithyTypes(codegenContext.runtimeConfig), CargoDependency.Http, CargoDependency.Md5, @@ -53,28 +51,6 @@ class HttpChecksumRequiredGenerator( ) } } - is OperationSection.MutateRequest -> writable { - rustTemplate( - """ - ${section.request} = ${section.request}.augment(|mut req, _| { - let data = req - .body() - .bytes() - .expect("checksum can only be computed for non-streaming operations"); - let checksum = <#{md5}::Md5 as #{md5}::Digest>::digest(data); - req.headers_mut().insert( - #{http}::header::HeaderName::from_static("content-md5"), - #{base64_encode}(&checksum[..]).parse().expect("checksum is valid header value") - ); - Result::<_, #{BuildError}>::Ok(req) - })?; - """, - "md5" to RuntimeType.Md5, - "http" to RuntimeType.Http, - "base64_encode" to RuntimeType.base64Encode(codegenContext.runtimeConfig), - "BuildError" to codegenContext.runtimeConfig.operationBuildError(), - ) - } else -> emptySection } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt index 1153c277705..343292055f3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt @@ -6,16 +6,15 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.util.letIf class HttpConnectorConfigDecorator : ClientCodegenDecorator { override val name: String = "HttpConnectorConfigDecorator" @@ -24,71 +23,43 @@ class HttpConnectorConfigDecorator : ClientCodegenDecorator { override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + HttpConnectorConfigCustomization(codegenContext) - } + ): List = baseCustomizations + HttpConnectorConfigCustomization(codegenContext) } private class HttpConnectorConfigCustomization( codegenContext: ClientCodegenContext, ) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "Connection" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::Connection"), - "ConnectorSettings" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::ConnectorSettings"), - "DynConnector" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::connectors::DynConnector"), - "DynConnectorAdapter" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::connectors::adapter::DynConnectorAdapter"), - "HttpConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("http_connector::HttpConnector"), - "SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"), - "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), + "HttpClient" to configReexport( + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::http::HttpClient"), + ), + "IntoShared" to configReexport(RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared")), + "SharedHttpClient" to configReexport( + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::http::SharedHttpClient"), + ), ) override fun section(section: ServiceConfig): Writable { return when (section) { - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) - } - } - is ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.inner.load::<#{HttpConnector}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Return an [`HttpConnector`](#{HttpConnector}) to use when making requests, if any. - pub fn http_connector(&self) -> Option<&#{HttpConnector}> { - self.http_connector.as_ref() - } - """, - *codegenScope, - ) - } - } - - is ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("http_connector: Option<#{HttpConnector}>,", *codegenScope) - } + rustTemplate( + """ + /// Return the [`SharedHttpClient`](#{SharedHttpClient}) to use when making requests, if any. + pub fn http_client(&self) -> Option<#{SharedHttpClient}> { + self.runtime_components.http_client() + } + """, + *codegenScope, + ) } ServiceConfig.BuilderImpl -> writable { rustTemplate( """ - /// Sets the HTTP connector to use when making requests. + /// Sets the HTTP client to use when making requests. /// /// ## Examples /// ```no_run @@ -97,10 +68,8 @@ private class HttpConnectorConfigCustomization( /// ## ##[test] /// ## fn example() { /// use std::time::Duration; - /// use aws_smithy_client::{Client, hyper_ext}; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::http_connector::ConnectorSettings; /// use $moduleUseName::config::Config; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() @@ -108,23 +77,23 @@ private class HttpConnectorConfigCustomization( /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); + /// let hyper_client = HyperClientBuilder::new().build(https_connector); + /// + /// // This connector can then be given to a generated service Config + /// let config = my_service_client::Config::builder() + /// .endpoint_url("https://example.com") + /// .http_client(hyper_client) + /// .build(); + /// let client = my_service_client::Client::from_conf(config); /// ## } /// ## } /// ``` - pub fn http_connector(mut self, http_connector: impl Into<#{HttpConnector}>) -> Self { - self.set_http_connector(#{Some}(http_connector)); + pub fn http_client(mut self, http_client: impl #{HttpClient} + 'static) -> Self { + self.set_http_client(#{Some}(#{IntoShared}::into_shared(http_client))); self } - /// Sets the HTTP connector to use when making requests. + /// Sets the HTTP client to use when making requests. /// /// ## Examples /// ```no_run @@ -133,127 +102,33 @@ private class HttpConnectorConfigCustomization( /// ## ##[test] /// ## fn example() { /// use std::time::Duration; - /// use aws_smithy_client::hyper_ext; - /// use aws_smithy_client::http_connector::ConnectorSettings; /// use $moduleUseName::config::{Builder, Config}; + /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; /// - /// fn override_http_connector(builder: &mut Builder) { + /// fn override_http_client(builder: &mut Builder) { /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() /// .with_webpki_roots() /// .https_only() /// .enable_http1() /// .enable_http2() /// .build(); - /// let smithy_connector = hyper_ext::Adapter::builder() - /// // Optionally set things like timeouts as well - /// .connector_settings( - /// ConnectorSettings::builder() - /// .connect_timeout(Duration::from_secs(5)) - /// .build() - /// ) - /// .build(https_connector); - /// builder.set_http_connector(Some(smithy_connector)); + /// let hyper_client = HyperClientBuilder::new().build(https_connector); + /// builder.set_http_client(Some(hyper_client)); /// } /// /// let mut builder = $moduleUseName::Config::builder(); - /// override_http_connector(&mut builder); + /// override_http_client(&mut builder); /// let config = builder.build(); /// ## } /// ## } /// ``` + pub fn set_http_client(&mut self, http_client: Option<#{SharedHttpClient}>) -> &mut Self { + self.runtime_components.set_http_client(http_client); + self + } """, *codegenScope, ) - - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: Option>) -> &mut Self { - http_connector.map(|c| self.inner.store_put(c.into())); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_http_connector(&mut self, http_connector: Option>) -> &mut Self { - self.http_connector = http_connector.map(|inner| inner.into()); - self - } - """, - *codegenScope, - ) - } - } - - is ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - let sleep_impl = layer.load::<#{SharedAsyncSleep}>().cloned(); - let timeout_config = layer.load::<#{TimeoutConfig}>().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); - - let connector_settings = #{ConnectorSettings}::from_timeout_config(&timeout_config); - - if let Some(connector) = layer.load::<#{HttpConnector}>() - .and_then(|c| c.connector(&connector_settings, sleep_impl.clone())) - .or_else(|| #{default_connector}(&connector_settings, sleep_impl)) { - let connector: #{DynConnector} = #{DynConnector}::new(#{DynConnectorAdapter}::new( - // TODO(enableNewSmithyRuntimeCleanup): Replace the tower-based DynConnector and remove DynConnectorAdapter when deleting the middleware implementation - connector - )); - #{ConfigBagAccessors}::set_connector(&mut layer, connector); - } - - """, - *codegenScope, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), - "default_connector" to RuntimeType.smithyClient(runtimeConfig).resolve("conns::default_connector"), - ) - } else { - rust("http_connector: self.http_connector,") - } - } - - is ServiceConfig.OperationConfigOverride -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - if let #{Some}(http_connector) = - layer.load::<#{HttpConnector}>() - { - let sleep_impl = layer - .load::<#{SharedAsyncSleep}>() - .or_else(|| { - self.client_config - .load::<#{SharedAsyncSleep}>() - }) - .cloned(); - let timeout_config = layer - .load::<#{TimeoutConfig}>() - .or_else(|| { - self.client_config - .load::<#{TimeoutConfig}>() - }) - .expect("timeout config should be set either in `config_override` or in the client config"); - let connector_settings = - #{ConnectorSettings}::from_timeout_config( - timeout_config, - ); - if let #{Some}(conn) = http_connector.connector(&connector_settings, sleep_impl) { - let connection: #{DynConnector} = #{DynConnector}::new(#{DynConnectorAdapter}::new( - // TODO(enableNewSmithyRuntimeCleanup): Replace the tower-based DynConnector and remove DynConnectorAdapter when deleting the middleware implementation - conn - )); - layer.set_connector(connection); - } - } - """, - *codegenScope, - ) - } } else -> emptySection diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListCustomization.kt deleted file mode 100644 index 43dab5ba8c1..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListCustomization.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import software.amazon.smithy.aws.traits.protocols.AwsProtocolTrait -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.util.getTrait -import software.amazon.smithy.rust.codegen.core.util.isEventStream - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file - -class HttpVersionListCustomization( - private val codegenContext: CodegenContext, - private val operationShape: OperationShape, -) : OperationCustomization() { - override fun section(section: OperationSection): Writable { - val runtimeConfig = codegenContext.runtimeConfig - val awsProtocolTrait = codegenContext.serviceShape.getTrait() - val supportedHttpProtocolVersions = if (awsProtocolTrait == null) { - // No protocol trait was defined, use default http versions - "#{defaultHttpVersions}.clone()" - } else { - // Figure out whether we're dealing with an EventStream operation and fetch the corresponding list of desired HTTP versions - val versionList = if (operationShape.isEventStream(codegenContext.model)) awsProtocolTrait.eventStreamHttp else awsProtocolTrait.http - if (versionList.isEmpty()) { - // If no desired versions are specified, go with the default - "#{defaultHttpVersions}.clone()" - } else { - // otherwise, use the specified versions - "vec![${versionList.joinToString(",") { version -> mapHttpVersion(version) }}]" - } - } - - return when (section) { - is OperationSection.MutateRequest -> writable { - rustTemplate( - """ - ${section.request}.properties_mut().insert($supportedHttpProtocolVersions); - """, - "defaultHttpVersions" to RuntimeType.smithyHttp(runtimeConfig).resolve("http_versions::DEFAULT_HTTP_VERSION_LIST"), - ) - } - else -> emptySection - } - } -} - -// Map an ALPN protocol ID to a version from the `http` Rust crate -private fun mapHttpVersion(httpVersion: String): String { - return when (httpVersion) { - "http/1.1" -> "http::Version::HTTP_11" - "h2" -> "http::Version::HTTP_2" - else -> TODO("Unsupported HTTP version '$httpVersion', please check your model") - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenDecorator.kt new file mode 100644 index 00000000000..b33ee8fbbc2 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenDecorator.kt @@ -0,0 +1,60 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.IdempotencyTokenProviderCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.needsIdempotencyToken +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.util.extendIf + +class IdempotencyTokenDecorator : ClientCodegenDecorator { + override val name: String = "IdempotencyToken" + override val order: Byte = 0 + + private fun enabled(ctx: ClientCodegenContext) = ctx.serviceShape.needsIdempotencyToken(ctx.model) + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List = baseCustomizations.extendIf(enabled(codegenContext)) { + IdempotencyTokenProviderCustomization(codegenContext) + } + + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List { + return baseCustomizations + IdempotencyTokenGenerator(codegenContext, operation) + } + + override fun serviceRuntimePluginCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List { + return baseCustomizations.extendIf(enabled(codegenContext)) { + object : ServiceRuntimePluginCustomization() { + override fun section(section: ServiceRuntimePluginSection) = writable { + if (section is ServiceRuntimePluginSection.AdditionalConfig) { + section.putConfigValue(this, defaultTokenProvider((codegenContext.runtimeConfig))) + } + } + } + } + } +} + +private fun defaultTokenProvider(runtimeConfig: RuntimeConfig) = + writable { rust("#T()", RuntimeType.idempotencyToken(runtimeConfig).resolve("default_provider")) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt index 3ee06bcea54..af2e21294ca 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt @@ -19,12 +19,14 @@ import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.smithy.isOptional +import software.amazon.smithy.rust.codegen.core.util.UNREACHABLE import software.amazon.smithy.rust.codegen.core.util.findMemberWithTrait import software.amazon.smithy.rust.codegen.core.util.inputShape class IdempotencyTokenGenerator( codegenContext: CodegenContext, - operationShape: OperationShape, + private val operationShape: OperationShape, ) : OperationCustomization() { private val model = codegenContext.model private val runtimeConfig = codegenContext.runtimeConfig @@ -37,9 +39,27 @@ class IdempotencyTokenGenerator( return emptySection } val memberName = symbolProvider.toMemberName(idempotencyTokenMember) + val codegenScope = arrayOf( + *preludeScope, + "Input" to symbolProvider.toSymbol(inputShape), + "IdempotencyTokenRuntimePlugin" to + InlineDependency.forRustFile( + RustModule.pubCrate("client_idempotency_token", parent = ClientRustModule.root), + "/inlineable/src/client_idempotency_token.rs", + CargoDependency.smithyRuntimeApiClient(runtimeConfig), + CargoDependency.smithyTypes(runtimeConfig), + InlineDependency.idempotencyToken(runtimeConfig), + ).toType().resolve("IdempotencyTokenRuntimePlugin"), + ) + return when (section) { is OperationSection.AdditionalRuntimePlugins -> writable { section.addOperationRuntimePlugin(this) { + if (!symbolProvider.toSymbol(idempotencyTokenMember).isOptional()) { + UNREACHABLE("top level input members are always optional. $operationShape") + } + // An idempotency token is optional. If the user didn't specify a token + // then we'll generate one and set it. rustTemplate( """ #{IdempotencyTokenRuntimePlugin}::new(|token_provider, input| { @@ -49,32 +69,12 @@ class IdempotencyTokenGenerator( } }) """, - *preludeScope, - "Input" to symbolProvider.toSymbol(inputShape), - "IdempotencyTokenRuntimePlugin" to - InlineDependency.forRustFile( - RustModule.pubCrate("client_idempotency_token", parent = ClientRustModule.root), - "/inlineable/src/client_idempotency_token.rs", - CargoDependency.smithyRuntimeApi(runtimeConfig), - CargoDependency.smithyTypes(runtimeConfig), - ).toType().resolve("IdempotencyTokenRuntimePlugin"), + *codegenScope, ) } } - is OperationSection.MutateInput -> writable { - rustTemplate( - """ - if ${section.input}.$memberName.is_none() { - ${section.input}.$memberName = #{Some}(${section.config}.idempotency_token_provider.make_idempotency_token()); - } - """, - *preludeScope, - ) - } + else -> emptySection } } - - override fun consumesSelf(): Boolean = idempotencyTokenMember != null - override fun mutSelf(): Boolean = idempotencyTokenMember != null } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt new file mode 100644 index 00000000000..bdd3e267f6a --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt @@ -0,0 +1,108 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope + +class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { + private val moduleUseName = codegenContext.moduleUseName() + + private val codegenScope = codegenContext.runtimeConfig.let { rc -> + val api = RuntimeType.smithyRuntimeApiClient(rc) + arrayOf( + *preludeScope, + "ResolveCachedIdentity" to configReexport(api.resolve("client::identity::ResolveCachedIdentity")), + "SharedIdentityCache" to configReexport(api.resolve("client::identity::SharedIdentityCache")), + ) + } + + override fun section(section: ServiceConfig): Writable = writable { + when (section) { + is ServiceConfig.BuilderImpl -> { + val docs = """ + /// Set the identity cache for auth. + /// + /// The identity cache defaults to a lazy caching implementation that will resolve + /// an identity when it is requested, and place it in the cache thereafter. Subsequent + /// requests will take the value from the cache while it is still valid. Once it expires, + /// the next request will result in refreshing the identity. + /// + /// This configuration allows you to disable or change the default caching mechanism. + /// To use a custom caching mechanism, implement the [`ResolveCachedIdentity`](#{ResolveCachedIdentity}) + /// trait and pass that implementation into this function. + /// + /// ## Examples + /// + /// Disabling identity caching: + /// ```no_run + /// use $moduleUseName::config::IdentityCache; + /// + /// let config = $moduleUseName::Config::builder() + /// .identity_cache(IdentityCache::no_cache()) + /// // ... + /// .build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + /// + /// Customizing lazy caching: + /// ```no_run + /// use $moduleUseName::config::IdentityCache; + /// use std::time::Duration; + /// + /// let config = $moduleUseName::Config::builder() + /// .identity_cache( + /// IdentityCache::lazy() + /// // change the load timeout to 10 seconds + /// .load_timeout(Duration::from_secs(10)) + /// .build() + /// ) + /// // ... + /// .build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + """ + rustTemplate( + """ + $docs + pub fn identity_cache(mut self, identity_cache: impl #{ResolveCachedIdentity} + 'static) -> Self { + self.set_identity_cache(identity_cache); + self + } + + $docs + pub fn set_identity_cache(&mut self, identity_cache: impl #{ResolveCachedIdentity} + 'static) -> &mut Self { + self.runtime_components.set_identity_cache(#{Some}(identity_cache)); + self + } + """, + *codegenScope, + ) + } + + is ServiceConfig.ConfigImpl -> { + rustTemplate( + """ + /// Returns the configured identity cache for auth. + pub fn identity_cache(&self) -> #{Option}<#{SharedIdentityCache}> { + self.runtime_components.identity_cache() + } + """, + *codegenScope, + ) + } + + else -> {} + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityConfigCustomization.kt deleted file mode 100644 index d08afe493b0..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityConfigCustomization.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType - -class IdentityConfigCustomization(private val codegenContext: ClientCodegenContext) : ConfigCustomization() { - override fun section(section: ServiceConfig): Writable = writable { - if (section is ServiceConfig.ConfigImpl) { - rustTemplate( - """ - /// Returns the identity resolvers. - pub fn identity_resolvers(&self) -> #{IdentityResolvers} { - #{ConfigBagAccessors}::identity_resolvers(&self.inner) - } - """, - "IdentityResolvers" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) - .resolve("client::identity::IdentityResolvers"), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(codegenContext.runtimeConfig), - ) - } - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt index 692b874517a..eecd7bb4a6b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt @@ -6,9 +6,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -17,38 +17,19 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con private val moduleUseName = codegenContext.moduleUseName() private val runtimeConfig = codegenContext.runtimeConfig - // TODO(enableNewSmithyRuntimeCleanup): Remove the writable below - private val maybeHideOrchestratorCode = writable { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rust("##[doc(hidden)]") - } - } private val codegenScope = arrayOf( - "Interceptor" to RuntimeType.interceptor(runtimeConfig), - "SharedInterceptor" to RuntimeType.sharedInterceptor(runtimeConfig), - "maybe_hide_orchestrator_code" to maybeHideOrchestratorCode, + "Intercept" to configReexport(RuntimeType.intercept(runtimeConfig)), + "SharedInterceptor" to configReexport(RuntimeType.sharedInterceptor(runtimeConfig)), ) override fun section(section: ServiceConfig) = writable { when (section) { - ServiceConfig.ConfigStruct -> rustTemplate( - "pub(crate) interceptors: Vec<#{SharedInterceptor}>,", - *codegenScope, - ) - - ServiceConfig.BuilderStruct -> - rustTemplate( - "interceptors: Vec<#{SharedInterceptor}>,", - *codegenScope, - ) - ServiceConfig.ConfigImpl -> rustTemplate( """ - #{maybe_hide_orchestrator_code} /// Returns interceptors currently registered by the user. - pub fn interceptors(&self) -> impl Iterator + '_ { - self.interceptors.iter() + pub fn interceptors(&self) -> impl Iterator + '_ { + self.runtime_components.interceptors() } """, *codegenScope, @@ -57,8 +38,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con ServiceConfig.BuilderImpl -> rustTemplate( """ - #{maybe_hide_orchestrator_code} - /// Add an [`Interceptor`](#{Interceptor}) that runs at specific stages of the request execution pipeline. + /// Add an [interceptor](#{Intercept}) that runs at specific stages of the request execution pipeline. /// /// Interceptors targeted at a certain stage are executed according to the pre-defined priority. /// The SDK provides a default set of interceptors. An interceptor configured by this method @@ -82,7 +62,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// /// ##[derive(Debug)] /// pub struct UriModifierInterceptor; - /// impl Interceptor for UriModifierInterceptor { + /// impl Intercept for UriModifierInterceptor { /// fn modify_before_signing( /// &self, /// context: &mut InterceptorContext, @@ -102,12 +82,11 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// ## } /// ## } /// ``` - pub fn interceptor(mut self, interceptor: impl #{Interceptor} + Send + Sync + 'static) -> Self { - self.add_interceptor(#{SharedInterceptor}::new(interceptor)); + pub fn interceptor(mut self, interceptor: impl #{Intercept} + 'static) -> Self { + self.push_interceptor(#{SharedInterceptor}::new(interceptor)); self } - #{maybe_hide_orchestrator_code} /// Add a [`SharedInterceptor`](#{SharedInterceptor}) that runs at specific stages of the request execution pipeline. /// /// Interceptors targeted at a certain stage are executed according to the pre-defined priority. @@ -133,7 +112,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// fn modify_request_uri(builder: &mut Builder) { /// ##[derive(Debug)] /// pub struct UriModifierInterceptor; - /// impl Interceptor for UriModifierInterceptor { + /// impl Intercept for UriModifierInterceptor { /// fn modify_before_signing( /// &self, /// context: &mut InterceptorContext, @@ -146,7 +125,7 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// Ok(()) /// } /// } - /// builder.add_interceptor(SharedInterceptor::new(UriModifierInterceptor)); + /// builder.push_interceptor(SharedInterceptor::new(UriModifierInterceptor)); /// } /// /// let mut builder = Config::builder(); @@ -155,29 +134,20 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con /// ## } /// ## } /// ``` - pub fn add_interceptor(&mut self, interceptor: #{SharedInterceptor}) -> &mut Self { - self.interceptors.push(interceptor); + pub fn push_interceptor(&mut self, interceptor: #{SharedInterceptor}) -> &mut Self { + self.runtime_components.push_interceptor(interceptor); self } - #{maybe_hide_orchestrator_code} /// Set [`SharedInterceptor`](#{SharedInterceptor})s for the builder. pub fn set_interceptors(&mut self, interceptors: impl IntoIterator) -> &mut Self { - self.interceptors = interceptors.into_iter().collect(); + self.runtime_components.set_interceptors(interceptors.into_iter()); self } """, *codegenScope, ) - is ServiceConfig.RuntimePluginInterceptors -> rust( - """ - ${section.interceptors}.extend(${section.interceptorsField}.interceptors.iter().cloned()); - """, - ) - - is ServiceConfig.BuilderBuildExtras -> rust("interceptors: self.interceptors,") - else -> emptySection } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomization.kt new file mode 100644 index 00000000000..03c62fb0493 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomization.kt @@ -0,0 +1,48 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.util.dq +import software.amazon.smithy.rust.codegen.core.util.sdkId + +class MetadataCustomization( + private val codegenContext: ClientCodegenContext, + operation: OperationShape, +) : OperationCustomization() { + private val operationName = codegenContext.symbolProvider.toSymbol(operation).name + private val runtimeConfig = codegenContext.runtimeConfig + private val codegenScope by lazy { + arrayOf( + "Metadata" to RuntimeType.operationModule(runtimeConfig).resolve("Metadata"), + ) + } + + override fun section(section: OperationSection): Writable = writable { + when (section) { + is OperationSection.AdditionalRuntimePluginConfig -> { + rustTemplate( + """ + ${section.newLayerName}.store_put(#{Metadata}::new( + ${operationName.dq()}, + ${codegenContext.serviceShape.sdkId().dq()}, + )); + """, + *codegenScope, + ) + } + + else -> {} + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt index 9cdcae78c54..bc68c958c88 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt @@ -8,10 +8,11 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType val noAuthSchemeShapeId: ShapeId = ShapeId.from("aws.smithy.rs#NoAuth") @@ -28,12 +29,17 @@ class NoAuthDecorator : ClientCodegenDecorator { override fun authOptions( codegenContext: ClientCodegenContext, operationShape: OperationShape, - baseAuthOptions: List, - ): List = baseAuthOptions + - AuthOption.StaticAuthOption(noAuthSchemeShapeId) { - rustTemplate( - "#{NO_AUTH_SCHEME_ID},", - "NO_AUTH_SCHEME_ID" to noAuthModule(codegenContext).resolve("NO_AUTH_SCHEME_ID"), - ) - } + baseAuthSchemeOptions: List, + ): List = baseAuthSchemeOptions + + AuthSchemeOption.StaticAuthSchemeOption( + noAuthSchemeShapeId, + listOf( + writable { + rustTemplate( + "#{NO_AUTH_SCHEME_ID}", + "NO_AUTH_SCHEME_ID" to noAuthModule(codegenContext).resolve("NO_AUTH_SCHEME_ID"), + ) + }, + ), + ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt index dc20049c46f..0f64fa0ccf7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt @@ -7,22 +7,17 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate -import software.amazon.smithy.rust.codegen.core.util.sdkId -class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenContext) : ConfigCustomization() { +class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val retryConfig = RuntimeType.smithyTypes(runtimeConfig).resolve("retry") private val sleepModule = RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep") private val timeoutModule = RuntimeType.smithyTypes(runtimeConfig).resolve("timeout") @@ -30,103 +25,55 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = arrayOf( *preludeScope, - "DynRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::retries::DynRetryStrategy"), - "RetryConfig" to retryConfig.resolve("RetryConfig"), - "SharedAsyncSleep" to sleepModule.resolve("SharedAsyncSleep"), - "Sleep" to sleepModule.resolve("Sleep"), - "StandardRetryStrategy" to retries.resolve("strategy::StandardRetryStrategy"), - "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), - "TimeoutConfig" to timeoutModule.resolve("TimeoutConfig"), - "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), - "TokenBucket" to retries.resolve("TokenBucket"), + "AsyncSleep" to configReexport(sleepModule.resolve("AsyncSleep")), + "SharedAsyncSleep" to configReexport(sleepModule.resolve("SharedAsyncSleep")), + "Sleep" to configReexport(sleepModule.resolve("Sleep")), "ClientRateLimiter" to retries.resolve("ClientRateLimiter"), - "SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource"), "ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"), - "TokenBucketPartition" to retries.resolve("TokenBucketPartition"), - "RetryPartition" to retries.resolve("RetryPartition"), "debug" to RuntimeType.Tracing.resolve("debug"), + "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), + "RetryConfig" to retryConfig.resolve("RetryConfig"), + "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), + "RetryPartition" to retries.resolve("RetryPartition"), + "SharedAsyncSleep" to configReexport(sleepModule.resolve("SharedAsyncSleep")), + "SharedRetryStrategy" to configReexport(RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::retries::SharedRetryStrategy")), + "SharedTimeSource" to configReexport(RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource")), + "StandardRetryStrategy" to configReexport(retries.resolve("strategy::StandardRetryStrategy")), + "SystemTime" to RuntimeType.std.resolve("time::SystemTime"), + "TimeoutConfig" to timeoutModule.resolve("TimeoutConfig"), ) override fun section(section: ServiceConfig) = writable { when (section) { - is ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { - rustTemplate( - """ - retry_config: #{Option}<#{RetryConfig}>, - sleep_impl: #{Option}<#{SharedAsyncSleep}>, - timeout_config: #{Option}<#{TimeoutConfig}>, - """, - *codegenScope, - ) - } - } - is ServiceConfig.ConfigImpl -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Return a reference to the retry configuration contained in this config, if any. - pub fn retry_config(&self) -> #{Option}<&#{RetryConfig}> { - self.inner.load::<#{RetryConfig}>() - } - - /// Return a cloned shared async sleep implementation from this config, if any. - pub fn sleep_impl(&self) -> #{Option}<#{SharedAsyncSleep}> { - self.inner.load::<#{SharedAsyncSleep}>().cloned() - } - - /// Return a reference to the timeout configuration contained in this config, if any. - pub fn timeout_config(&self) -> #{Option}<&#{TimeoutConfig}> { - self.inner.load::<#{TimeoutConfig}>() - } - - ##[doc(hidden)] - /// Returns a reference to the retry partition contained in this config, if any. - /// - /// WARNING: This method is unstable and may be removed at any time. Do not rely on this - /// method for anything! - pub fn retry_partition(&self) -> #{Option}<&#{RetryPartition}> { - self.inner.load::<#{RetryPartition}>() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Return a reference to the retry configuration contained in this config, if any. - pub fn retry_config(&self) -> #{Option}<&#{RetryConfig}> { - self.retry_config.as_ref() - } + rustTemplate( + """ + /// Return a reference to the retry configuration contained in this config, if any. + pub fn retry_config(&self) -> #{Option}<&#{RetryConfig}> { + self.config.load::<#{RetryConfig}>() + } - /// Return a cloned shared async sleep implementation from this config, if any. - pub fn sleep_impl(&self) -> #{Option}<#{SharedAsyncSleep}> { - self.sleep_impl.clone() - } + /// Return a cloned shared async sleep implementation from this config, if any. + pub fn sleep_impl(&self) -> #{Option}<#{SharedAsyncSleep}> { + self.runtime_components.sleep_impl() + } - /// Return a reference to the timeout configuration contained in this config, if any. - pub fn timeout_config(&self) -> #{Option}<&#{TimeoutConfig}> { - self.timeout_config.as_ref() - } - """, - *codegenScope, - ) - } - } + /// Return a reference to the timeout configuration contained in this config, if any. + pub fn timeout_config(&self) -> #{Option}<&#{TimeoutConfig}> { + self.config.load::<#{TimeoutConfig}>() + } - is ServiceConfig.BuilderStruct -> { - if (runtimeMode.defaultToMiddleware) { - rustTemplate( - """ - retry_config: #{Option}<#{RetryConfig}>, - sleep_impl: #{Option}<#{SharedAsyncSleep}>, - timeout_config: #{Option}<#{TimeoutConfig}>, - """, - *codegenScope, - ) - } + /// Returns a reference to the retry partition contained in this config, if any. + /// + /// WARNING: This method is unstable and may be removed at any time. Do not rely on this + /// method for anything! + pub fn retry_partition(&self) -> #{Option}<&#{RetryPartition}> { + self.config.load::<#{RetryPartition}>() + } + """, + *codegenScope, + ) } is ServiceConfig.BuilderImpl -> { @@ -167,27 +114,15 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self { - retry_config.map(|r| self.inner.store_put(r)); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self { - self.retry_config = retry_config; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self { + retry_config.map(|r| self.config.store_put(r)); + self + } + """, + *codegenScope, + ) rustTemplate( """ @@ -211,8 +146,8 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon /// let sleep_impl = SharedAsyncSleep::new(ForeverSleep); /// let config = Config::builder().sleep_impl(sleep_impl).build(); /// ``` - pub fn sleep_impl(mut self, sleep_impl: #{SharedAsyncSleep}) -> Self { - self.set_sleep_impl(Some(sleep_impl)); + pub fn sleep_impl(mut self, sleep_impl: impl #{AsyncSleep} + 'static) -> Self { + self.set_sleep_impl(Some(#{IntoShared}::into_shared(sleep_impl))); self } @@ -245,27 +180,15 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self { - sleep_impl.map(|s| self.inner.store_put(s)); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self { - self.sleep_impl = sleep_impl; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self { + self.runtime_components.set_sleep_impl(sleep_impl); + self + } + """, + *codegenScope, + ) rustTemplate( """ @@ -313,129 +236,41 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self { - timeout_config.map(|t| self.inner.store_put(t)); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self { - self.timeout_config = timeout_config; - self - } - """, - *codegenScope, - ) - } - - if (runtimeMode.defaultToOrchestrator) { - Attribute.DocHidden.render(this) - rustTemplate( - """ - /// Set the partition for retry-related state. When clients share a retry partition, they will - /// also share things like token buckets and client rate limiters. By default, all clients - /// for the same service will share a partition. - pub fn retry_partition(mut self, retry_partition: #{RetryPartition}) -> Self { - self.set_retry_partition(Some(retry_partition)); - self - } - """, - *codegenScope, - ) - - Attribute.DocHidden.render(this) - rustTemplate( - """ - /// Set the partition for retry-related state. When clients share a retry partition, they will - /// also share things like token buckets and client rate limiters. By default, all clients - /// for the same service will share a partition. - pub fn set_retry_partition(&mut self, retry_partition: #{Option}<#{RetryPartition}>) -> &mut Self { - retry_partition.map(|r| self.inner.store_put(r)); - self - } - """, - *codegenScope, - ) - } - } - - is ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - let retry_partition = layer.load::<#{RetryPartition}>().cloned().unwrap_or_else(|| #{RetryPartition}::new("${codegenContext.serviceShape.sdkId()}")); - let retry_config = layer.load::<#{RetryConfig}>().cloned().unwrap_or_else(#{RetryConfig}::disabled); - if retry_config.has_retry() { - #{debug}!("using retry strategy with partition '{}'", retry_partition); - } - - if retry_config.mode() == #{RetryMode}::Adaptive { - if let #{Some}(time_source) = layer.load::<#{SharedTimeSource}>().cloned() { - let seconds_since_unix_epoch = time_source - .now() - .duration_since(#{SystemTime}::UNIX_EPOCH) - .expect("the present takes place after the UNIX_EPOCH") - .as_secs_f64(); - let client_rate_limiter_partition = #{ClientRateLimiterPartition}::new(retry_partition.clone()); - let client_rate_limiter = CLIENT_RATE_LIMITER.get_or_init(client_rate_limiter_partition, || { - #{ClientRateLimiter}::new(seconds_since_unix_epoch) - }); - layer.store_put(client_rate_limiter); - } - } - - // The token bucket is used for both standard AND adaptive retries. - let token_bucket_partition = #{TokenBucketPartition}::new(retry_partition); - let token_bucket = TOKEN_BUCKET.get_or_init(token_bucket_partition, #{TokenBucket}::default); - layer.store_put(token_bucket); - layer.set_retry_strategy(#{DynRetryStrategy}::new(#{StandardRetryStrategy}::new(&retry_config))); + rustTemplate( + """ + pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self { + timeout_config.map(|t| self.config.store_put(t)); + self + } + """, + *codegenScope, + ) - // TODO(enableNewSmithyRuntimeCleanup): Should not need to provide a default once smithy-rs##2770 - // is resolved - if layer.load::<#{TimeoutConfig}>().is_none() { - layer.store_put(#{TimeoutConfig}::disabled()); - } - """, - *codegenScope, - ) - } else { - rustTemplate( - // We call clone on sleep_impl because the field is used by - // initializing the credentials_cache field later in the build - // method of a Config builder. - """ - retry_config: self.retry_config, - sleep_impl: self.sleep_impl.clone(), - timeout_config: self.timeout_config, - """, - *codegenScope, - ) - } - } + rustTemplate( + """ + /// Set the partition for retry-related state. When clients share a retry partition, they will + /// also share things like token buckets and client rate limiters. By default, all clients + /// for the same service will share a partition. + pub fn retry_partition(mut self, retry_partition: #{RetryPartition}) -> Self { + self.set_retry_partition(Some(retry_partition)); + self + } + """, + *codegenScope, + ) - is ServiceConfig.OperationConfigOverride -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - if let #{Some}(retry_config) = layer - .load::<#{RetryConfig}>() - .cloned() - { - layer.set_retry_strategy( - #{DynRetryStrategy}::new(#{StandardRetryStrategy}::new(&retry_config)) - ); - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Set the partition for retry-related state. When clients share a retry partition, they will + /// also share things like token buckets and client rate limiters. By default, all clients + /// for the same service will share a partition. + pub fn set_retry_partition(&mut self, retry_partition: #{Option}<#{RetryPartition}>) -> &mut Self { + retry_partition.map(|r| self.config.store_put(r)); + self + } + """, + *codegenScope, + ) } else -> emptySection @@ -445,12 +280,11 @@ class ResiliencyConfigCustomization(private val codegenContext: ClientCodegenCon class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode fun extras(rustCrate: RustCrate) { rustCrate.withModule(ClientRustModule.config) { rustTemplate( - "pub use #{sleep}::{AsyncSleep, SharedAsyncSleep, Sleep};", + "pub use #{sleep}::{Sleep};", "sleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep"), ) } @@ -460,12 +294,10 @@ class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { "types_retry" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry"), ) - if (runtimeMode.generateOrchestrator) { - rustTemplate( - "pub use #{types_retry}::RetryPartition;", - "types_retry" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::retries"), - ) - } + rustTemplate( + "pub use #{types_retry}::RetryPartition;", + "types_retry" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::retries"), + ) } rustCrate.withModule(ClientRustModule.Config.timeout) { rustTemplate( @@ -475,37 +307,3 @@ class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) { } } } - -class ResiliencyServiceRuntimePluginCustomization(codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { - private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode - private val smithyRuntime = RuntimeType.smithyRuntime(runtimeConfig) - private val retries = smithyRuntime.resolve("client::retries") - private val codegenScope = arrayOf( - "TokenBucket" to retries.resolve("TokenBucket"), - "TokenBucketPartition" to retries.resolve("TokenBucketPartition"), - "ClientRateLimiter" to retries.resolve("ClientRateLimiter"), - "ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"), - "StaticPartitionMap" to smithyRuntime.resolve("static_partition_map::StaticPartitionMap"), - ) - - override fun section(section: ServiceRuntimePluginSection): Writable = writable { - if (runtimeMode.generateOrchestrator) { - when (section) { - is ServiceRuntimePluginSection.DeclareSingletons -> { - // TODO(enableNewSmithyRuntimeCleanup) We can use the standard library's `OnceCell` once we upgrade the - // MSRV to 1.70 - rustTemplate( - """ - static TOKEN_BUCKET: #{StaticPartitionMap}<#{TokenBucketPartition}, #{TokenBucket}> = #{StaticPartitionMap}::new(); - static CLIENT_RATE_LIMITER: #{StaticPartitionMap}<#{ClientRateLimiterPartition}, #{ClientRateLimiter}> = #{StaticPartitionMap}::new(); - """, - *codegenScope, - ) - } - - else -> emptySection - } - } - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryClassifierConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryClassifierConfigCustomization.kt new file mode 100644 index 00000000000..8b23e4efbac --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryClassifierConfigCustomization.kt @@ -0,0 +1,297 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType + +class RetryClassifierConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { + private val runtimeConfig = codegenContext.runtimeConfig + private val moduleUseName = codegenContext.moduleUseName() + + private val retries = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::retries") + private val classifiers = retries.resolve("classifiers") + private val codegenScope = arrayOf( + "ClassifyRetry" to classifiers.resolve("ClassifyRetry"), + "RetryStrategy" to retries.resolve("RetryStrategy"), + "SharedRetryClassifier" to classifiers.resolve("SharedRetryClassifier"), + "RetryClassifierPriority" to classifiers.resolve("RetryClassifierPriority"), + ) + + override fun section(section: ServiceConfig) = + writable { + when (section) { + ServiceConfig.ConfigImpl -> rustTemplate( + """ + /// Returns retry classifiers currently registered by the user. + pub fn retry_classifiers(&self) -> impl Iterator + '_ { + self.runtime_components.retry_classifiers() + } + """, + *codegenScope, + ) + + ServiceConfig.BuilderImpl -> + rustTemplate( + """ + /// Add type implementing [`ClassifyRetry`](#{ClassifyRetry}) that will be used by the + /// [`RetryStrategy`](#{RetryStrategy}) to determine what responses should be retried. + /// + /// A retry classifier configured by this method will run according to its [priority](#{RetryClassifierPriority}). + /// + /// ## Examples + /// ```no_run + /// ## ##[cfg(test)] + /// ## mod tests { + /// ## ##[test] + /// ## fn example() { + /// use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + /// use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + /// use aws_smithy_runtime_api::client::retries::classifiers::{ + /// ClassifyRetry, RetryAction, RetryClassifierPriority, + /// }; + /// use aws_smithy_types::error::metadata::ProvideErrorMetadata; + /// use aws_smithy_types::retry::ErrorKind; + /// use std::error::Error as StdError; + /// use std::marker::PhantomData; + /// use $moduleUseName::config::Config; + /// ## struct SomeOperationError {} + /// + /// const RETRYABLE_ERROR_CODES: &[&str] = [ + /// // List error codes to be retried here... + /// ]; + /// + /// // When classifying at an operation's error type, classifiers require a generic parameter. + /// // When classifying the HTTP response alone, no generic is needed. + /// ##[derive(Debug, Default)] + /// pub struct ErrorCodeClassifier { + /// _inner: PhantomData, + /// } + /// + /// impl ExampleErrorCodeClassifier { + /// pub fn new() -> Self { + /// Self { + /// _inner: PhantomData, + /// } + /// } + /// } + /// + /// impl ClassifyRetry for ExampleErrorCodeClassifier + /// where + /// // Adding a trait bound for ProvideErrorMetadata allows us to inspect the error code. + /// E: StdError + ProvideErrorMetadata + Send + Sync + 'static, + /// { + /// fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + /// // Check for a result + /// let output_or_error = ctx.output_or_error(); + /// // Check for an error + /// let error = match output_or_error { + /// Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + /// Some(Err(err)) => err, + /// }; + /// + /// // Downcast the generic error and extract the code + /// let error_code = OrchestratorError::as_operation_error(error) + /// .and_then(|err| err.downcast_ref::()) + /// .and_then(|err| err.code()); + /// + /// // If this error's code is in our list, return an action that tells the RetryStrategy to retry this request. + /// if let Some(error_code) = error_code { + /// if RETRYABLE_ERROR_CODES.contains(&error_code) { + /// return RetryAction::transient_error(); + /// } + /// } + /// + /// // Otherwise, return that no action is indicated i.e. that this classifier doesn't require a retry. + /// // Another classifier may still classify this response as retryable. + /// RetryAction::NoActionIndicated + /// } + /// + /// fn name(&self) -> &'static str { "Example Error Code Classifier" } + /// } + /// + /// let config = Config::builder() + /// .retry_classifier(ExampleErrorCodeClassifier::::new()) + /// .build(); + /// ## } + /// ## } + /// ``` + pub fn retry_classifier(mut self, retry_classifier: impl #{ClassifyRetry} + 'static) -> Self { + self.push_retry_classifier(#{SharedRetryClassifier}::new(retry_classifier)); + self + } + + /// Add a [`SharedRetryClassifier`](#{SharedRetryClassifier}) that will be used by the + /// [`RetryStrategy`](#{RetryStrategy}) to determine what responses should be retried. + /// + /// A retry classifier configured by this method will run according to its priority. + /// + /// ## Examples + /// ```no_run + /// ## ##[cfg(test)] + /// ## mod tests { + /// ## ##[test] + /// ## fn example() { + /// use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; + /// use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + /// use aws_smithy_runtime_api::client::retries::classifiers::{ + /// ClassifyRetry, RetryAction, RetryClassifierPriority, + /// }; + /// use aws_smithy_types::error::metadata::ProvideErrorMetadata; + /// use aws_smithy_types::retry::ErrorKind; + /// use std::error::Error as StdError; + /// use std::marker::PhantomData; + /// use $moduleUseName::config::{Builder, Config}; + /// ## struct SomeOperationError {} + /// + /// const RETRYABLE_ERROR_CODES: &[&str] = [ + /// // List error codes to be retried here... + /// ]; + /// fn set_example_error_code_classifier(builder: &mut Builder) { + /// // When classifying at an operation's error type, classifiers require a generic parameter. + /// // When classifying the HTTP response alone, no generic is needed. + /// ##[derive(Debug, Default)] + /// pub struct ExampleErrorCodeClassifier { + /// _inner: PhantomData, + /// } + /// + /// impl ExampleErrorCodeClassifier { + /// pub fn new() -> Self { + /// Self { + /// _inner: PhantomData, + /// } + /// } + /// } + /// + /// impl ClassifyRetry for ExampleErrorCodeClassifier + /// where + /// // Adding a trait bound for ProvideErrorMetadata allows us to inspect the error code. + /// E: StdError + ProvideErrorMetadata + Send + Sync + 'static, + /// { + /// fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + /// // Check for a result + /// let output_or_error = ctx.output_or_error(); + /// // Check for an error + /// let error = match output_or_error { + /// Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + /// Some(Err(err)) => err, + /// }; + /// + /// // Downcast the generic error and extract the code + /// let error_code = OrchestratorError::as_operation_error(error) + /// .and_then(|err| err.downcast_ref::()) + /// .and_then(|err| err.code()); + /// + /// // If this error's code is in our list, return an action that tells the RetryStrategy to retry this request. + /// if let Some(error_code) = error_code { + /// if RETRYABLE_ERROR_CODES.contains(&error_code) { + /// return RetryAction::transient_error(); + /// } + /// } + /// + /// // Otherwise, return that no action is indicated i.e. that this classifier doesn't require a retry. + /// // Another classifier may still classify this response as retryable. + /// RetryAction::NoActionIndicated + /// } + /// + /// fn name(&self) -> &'static str { "Example Error Code Classifier" } + /// } + /// + /// builder.push_retry_classifier(ExampleErrorCodeClassifier::::new()) + /// } + /// + /// let mut builder = Config::builder(); + /// set_example_error_code_classifier(&mut builder); + /// let config = builder.build(); + /// ## } + /// ## } + /// ``` + pub fn push_retry_classifier(&mut self, retry_classifier: #{SharedRetryClassifier}) -> &mut Self { + self.runtime_components.push_retry_classifier(retry_classifier); + self + } + + /// Set [`SharedRetryClassifier`](#{SharedRetryClassifier})s for the builder, replacing any that + /// were previously set. + pub fn set_retry_classifiers(&mut self, retry_classifiers: impl IntoIterator) -> &mut Self { + self.runtime_components.set_retry_classifiers(retry_classifiers.into_iter()); + self + } + """, + *codegenScope, + ) + + else -> emptySection + } + } +} + +class RetryClassifierServiceRuntimePluginCustomization(codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() { + private val runtimeConfig = codegenContext.runtimeConfig + private val retries = RuntimeType.smithyRuntime(runtimeConfig).resolve("client::retries") + + override fun section(section: ServiceRuntimePluginSection): Writable = writable { + when (section) { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> { + section.registerRetryClassifier(this) { + rustTemplate( + "#{HttpStatusCodeClassifier}::default()", + "HttpStatusCodeClassifier" to retries.resolve("classifiers::HttpStatusCodeClassifier"), + ) + } + } + + else -> emptySection + } + } +} + +class RetryClassifierOperationCustomization( + codegenContext: ClientCodegenContext, + val operation: OperationShape, +) : OperationCustomization() { + private val runtimeConfig = codegenContext.runtimeConfig + private val symbolProvider = codegenContext.symbolProvider + + override fun section(section: OperationSection): Writable = writable { + val classifiers = RuntimeType.smithyRuntime(runtimeConfig).resolve("client::retries::classifiers") + + val codegenScope = arrayOf( + *RuntimeType.preludeScope, + "TransientErrorClassifier" to classifiers.resolve("TransientErrorClassifier"), + "ModeledAsRetryableClassifier" to classifiers.resolve("ModeledAsRetryableClassifier"), + "OperationError" to symbolProvider.symbolForOperationError(operation), + ) + + when (section) { + is OperationSection.RetryClassifiers -> { + section.registerRetryClassifier(this) { + rustTemplate( + "#{TransientErrorClassifier}::<#{OperationError}>::new()", + *codegenScope, + ) + } + section.registerRetryClassifier(this) { + rustTemplate( + "#{ModeledAsRetryableClassifier}::<#{OperationError}>::new()", + *codegenScope, + ) + } + } + else -> emptySection + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt new file mode 100644 index 00000000000..5e484d4c861 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt @@ -0,0 +1,47 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.SensitiveIndex +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType + +class SensitiveOutputDecorator : ClientCodegenDecorator { + override val name: String get() = "SensitiveOutputDecorator" + override val order: Byte get() = 0 + + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List = + baseCustomizations + listOf(SensitiveOutputCustomization(codegenContext, operation)) +} + +private class SensitiveOutputCustomization( + private val codegenContext: ClientCodegenContext, + private val operation: OperationShape, +) : OperationCustomization() { + private val sensitiveIndex = SensitiveIndex.of(codegenContext.model) + override fun section(section: OperationSection): Writable = writable { + if (section is OperationSection.AdditionalRuntimePluginConfig && sensitiveIndex.hasSensitiveOutput(operation)) { + rustTemplate( + """ + ${section.newLayerName}.store_put(#{SensitiveOutput}); + """, + "SensitiveOutput" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) + .resolve("client::orchestrator::SensitiveOutput"), + ) + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt index 0dacbd72909..67b3664688c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt @@ -6,11 +6,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -19,47 +16,27 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() { - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, + "IntoShared" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve("shared::IntoShared"), "SharedTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::SharedTimeSource"), + "StaticTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::StaticTimeSource"), + "TimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve("time::TimeSource"), + "UNIX_EPOCH" to RuntimeType.std.resolve("time::UNIX_EPOCH"), + "Duration" to RuntimeType.std.resolve("time::Duration"), ) override fun section(section: ServiceConfig) = writable { when (section) { - is ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { - rustTemplate( - """ - pub(crate) time_source: #{SharedTimeSource}, - """, - *codegenScope, - ) - } - } - is ServiceConfig.ConfigImpl -> { rust("/// Return time source used for this service.") rustBlockTemplate( - "pub fn time_source(&self) -> #{SharedTimeSource}", + "pub fn time_source(&self) -> #{Option}<#{SharedTimeSource}>", *codegenScope, ) { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """self.inner.load::<#{SharedTimeSource}>().expect("time source should be set").clone()""", - *codegenScope, - ) - } else { - rust("self.time_source.clone()") - } - } - } - - is ServiceConfig.BuilderStruct -> { - if (runtimeMode.defaultToMiddleware) { rustTemplate( - "time_source: #{Option}<#{SharedTimeSource}>,", + """self.runtime_components.time_source()""", *codegenScope, ) } @@ -71,77 +48,54 @@ class TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCust /// Sets the time source used for this service pub fn time_source( mut self, - time_source: impl #{Into}<#{SharedTimeSource}>, + time_source: impl #{TimeSource} + 'static, ) -> Self { - self.set_time_source(#{Some}(time_source.into())); + self.set_time_source(#{Some}(#{IntoShared}::into_shared(time_source))); self } """, *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Sets the time source used for this service - pub fn set_time_source( - &mut self, - time_source: #{Option}<#{SharedTimeSource}>, - ) -> &mut Self { - self.inner.store_or_unset(time_source); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the time source used for this service - pub fn set_time_source( - &mut self, - time_source: #{Option}<#{SharedTimeSource}>, - ) -> &mut Self { - self.time_source = time_source; - self - } - """, - *codegenScope, - ) - } + rustTemplate( + """ + /// Sets the time source used for this service + pub fn set_time_source( + &mut self, + time_source: #{Option}<#{SharedTimeSource}>, + ) -> &mut Self { + self.runtime_components.set_time_source(time_source); + self + } + """, + *codegenScope, + ) } ServiceConfig.BuilderBuild -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - "layer.store_put(layer.load::<#{SharedTimeSource}>().cloned().unwrap_or_default());", - *codegenScope, - ) - } else { - rustTemplate( - "time_source: self.time_source.unwrap_or_default(),", - *codegenScope, - ) - } + rustTemplate( + """ + if self.runtime_components.time_source().is_none() { + self.runtime_components.set_time_source(#{Some}(#{Default}::default())); + } + """, + *codegenScope, + ) } - else -> emptySection - } - } -} + is ServiceConfig.DefaultForTests -> { + rustTemplate( + """ + ${section.configBuilderRef} + .set_time_source(#{Some}(#{SharedTimeSource}::new( + #{StaticTimeSource}::new(#{UNIX_EPOCH} + #{Duration}::from_secs(1234567890))) + )); + """, + *codegenScope, + ) + } -class TimeSourceOperationCustomization : OperationCustomization() { - override fun section(section: OperationSection): Writable { - return when (section) { - is OperationSection.MutateRequest -> writable { - rust( - """ - ${section.request}.properties_mut().insert(${section.config}.time_source.clone()); - """, - ) + else -> emptySection } - - else -> emptySection } - } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt index 3dfd77976fa..bfbbb056982 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt @@ -26,14 +26,14 @@ import java.util.logging.Logger typealias ClientProtocolMap = ProtocolMap -sealed interface AuthOption { - /** Auth scheme for the `StaticAuthOptionResolver` */ - data class StaticAuthOption( +sealed interface AuthSchemeOption { + /** Auth scheme for the `StaticAuthSchemeOptionResolver` */ + data class StaticAuthSchemeOption( val schemeShapeId: ShapeId, - val constructor: Writable, - ) : AuthOption + val constructor: List, + ) : AuthSchemeOption - class CustomResolver(/* unimplemented */) : AuthOption + class CustomResolver(/* unimplemented */) : AuthSchemeOption } /** @@ -47,8 +47,8 @@ interface ClientCodegenDecorator : CoreCodegenDecorator, - ): List = baseAuthOptions + baseAuthSchemeOptions: List, + ): List = baseAuthSchemeOptions fun configCustomizations( codegenContext: ClientCodegenContext, @@ -110,8 +110,8 @@ open class CombinedClientCodegenDecorator(decorators: List, - ): List = combineCustomizations(baseAuthOptions) { decorator, authOptions -> + baseAuthSchemeOptions: List, + ): List = combineCustomizations(baseAuthSchemeOptions) { decorator, authOptions -> decorator.authOptions(codegenContext, operationShape, authOptions) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt index e26e228c7e6..70e9d67c2ad 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt @@ -9,27 +9,29 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customizations.ConnectionPoisoningRuntimePluginCustomization -import software.amazon.smithy.rust.codegen.client.smithy.customizations.EndpointPrefixGenerator import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpChecksumRequiredGenerator -import software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpVersionListCustomization -import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdempotencyTokenGenerator -import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdentityConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.IdentityCacheConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.InterceptorConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.MetadataCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyReExportCustomization -import software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierConfigCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierOperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.customizations.TimeSourceCustomization -import software.amazon.smithy.rust.codegen.client.smithy.customizations.TimeSourceOperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.core.rustlang.Feature +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customizations.AllowLintsCustomization import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization -import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyErrorTypes import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives +import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitivesEventStream import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization +import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError val TestUtilFeature = Feature("test-util", false, listOf()) @@ -48,27 +50,19 @@ class RequiredCustomizations : ClientCodegenDecorator { baseCustomizations: List, ): List = baseCustomizations + - IdempotencyTokenGenerator(codegenContext, operation) + - EndpointPrefixGenerator(codegenContext, operation) + + MetadataCustomization(codegenContext, operation) + HttpChecksumRequiredGenerator(codegenContext, operation) + - HttpVersionListCustomization(codegenContext, operation) + - TimeSourceOperationCustomization() + RetryClassifierOperationCustomization(codegenContext, operation) override fun configCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - baseCustomizations + - ResiliencyConfigCustomization(codegenContext) + - InterceptorConfigCustomization(codegenContext) + - TimeSourceCustomization(codegenContext) + - IdentityConfigCustomization(codegenContext) - } else { - baseCustomizations + - ResiliencyConfigCustomization(codegenContext) + - TimeSourceCustomization(codegenContext) - } + ): List = baseCustomizations + + ResiliencyConfigCustomization(codegenContext) + + IdentityCacheConfigCustomization(codegenContext) + + InterceptorConfigCustomization(codegenContext) + + TimeSourceCustomization(codegenContext) + + RetryClassifierConfigCustomization(codegenContext) override fun libRsCustomizations( codegenContext: ClientCodegenContext, @@ -77,19 +71,49 @@ class RequiredCustomizations : ClientCodegenDecorator { baseCustomizations + AllowLintsCustomization() override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { + val rc = codegenContext.runtimeConfig + // Add rt-tokio feature for `ByteStream::from_path` - rustCrate.mergeFeature(Feature("rt-tokio", true, listOf("aws-smithy-http/rt-tokio"))) + rustCrate.mergeFeature( + Feature( + "rt-tokio", + true, + listOf("aws-smithy-async/rt-tokio", "aws-smithy-types/rt-tokio"), + ), + ) rustCrate.mergeFeature(TestUtilFeature) // Re-export resiliency types ResiliencyReExportCustomization(codegenContext).extras(rustCrate) - rustCrate.withModule(ClientRustModule.Primitives) { - pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) + rustCrate.withModule(ClientRustModule.primitives) { + pubUseSmithyPrimitives(codegenContext, codegenContext.model, rustCrate)(this) + } + rustCrate.withModule(ClientRustModule.Primitives.EventStream) { + pubUseSmithyPrimitivesEventStream(codegenContext, codegenContext.model)(this) } rustCrate.withModule(ClientRustModule.Error) { - pubUseSmithyErrorTypes(codegenContext)(this) + rustTemplate( + """ + /// Error type returned by the client. + pub type SdkError = #{SdkError}; + pub use #{BuildError}; + pub use #{ConnectorError}; + + pub use #{DisplayErrorContext}; + pub use #{ProvideErrorMetadata}; + pub use #{ErrorMetadata}; + """, + "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), + "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), + "ErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ErrorMetadata"), + "R" to RuntimeType.smithyRuntimeApiClient(rc).resolve("client::orchestrator::HttpResponse"), + "SdkError" to RuntimeType.sdkError(rc), + // this can't use the auto-rexport because the builder generator is defined in codegen core + "BuildError" to rc.operationBuildError(), + "ConnectorError" to RuntimeType.smithyRuntimeApi(rc).resolve("client::result::ConnectorError"), + ) } ClientRustModule.Meta.also { metaModule -> @@ -102,11 +126,7 @@ class RequiredCustomizations : ClientCodegenDecorator { override fun serviceRuntimePluginCustomizations( codegenContext: ClientCodegenContext, baseCustomizations: List, - ): List = if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - baseCustomizations + - ResiliencyServiceRuntimePluginCustomization(codegenContext) + - ConnectionPoisoningRuntimePluginCustomization(codegenContext) - } else { - baseCustomizations - } + ): List = baseCustomizations + + ConnectionPoisoningRuntimePluginCustomization(codegenContext) + + RetryClassifierServiceRuntimePluginCustomization(codegenContext) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt index a55c5b3e7d0..1131c201d3a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.serviceSpecificEndpointResolver import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -25,237 +26,126 @@ internal class EndpointConfigCustomization( ConfigCustomization() { private val runtimeConfig = codegenContext.runtimeConfig private val moduleUseName = codegenContext.moduleUseName() - private val runtimeMode = codegenContext.smithyRuntimeMode - private val types = Types(runtimeConfig) + private val epModule = RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::endpoint") + private val epRuntimeModule = RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::endpoints") + + private val codegenScope = arrayOf( + *preludeScope, + "Params" to typesGenerator.paramsStruct(), + "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), + "SharedEndpointResolver" to epModule.resolve("SharedEndpointResolver"), + "StaticUriEndpointResolver" to epRuntimeModule.resolve("StaticUriEndpointResolver"), + "ServiceSpecificResolver" to codegenContext.serviceSpecificEndpointResolver(), + "IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"), + ) override fun section(section: ServiceConfig): Writable { return writable { - val sharedEndpointResolver = "#{SharedEndpointResolver}<#{Params}>" - val resolverTrait = "#{SmithyResolver}<#{Params}>" - val codegenScope = arrayOf( - *preludeScope, - "DefaultEndpointResolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::endpoints::DefaultEndpointResolver"), - "DynEndpointResolver" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::DynEndpointResolver"), - "SharedEndpointResolver" to types.sharedEndpointResolver, - "SmithyResolver" to types.resolveEndpoint, - "Params" to typesGenerator.paramsStruct(), - ) when (section) { - is ServiceConfig.ConfigStruct -> { - if (runtimeMode.defaultToMiddleware) { - rustTemplate( - "pub (crate) endpoint_resolver: $sharedEndpointResolver,", - *codegenScope, - ) - } + is ServiceConfig.ConfigImpl -> { + rustTemplate( + """ + /// Returns the endpoint resolver. + pub fn endpoint_resolver(&self) -> #{SharedEndpointResolver} { + self.runtime_components.endpoint_resolver().expect("resolver defaulted if not set") + } + """, + *codegenScope, + ) } - is ServiceConfig.ConfigImpl -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Returns the endpoint resolver. - pub fn endpoint_resolver(&self) -> $sharedEndpointResolver { - self.inner.load::<$sharedEndpointResolver>().expect("endpoint resolver should be set").clone() - } - """, - *codegenScope, - ) + ServiceConfig.BuilderImpl -> { + val endpointModule = ClientRustModule.Config.endpoint.fullyQualifiedPath() + .replace("crate::", "$moduleUseName::") + // if there are no rules, we don't generate a default resolver—we need to also suppress those docs. + val defaultResolverDocs = if (typesGenerator.defaultResolver() != null) { + """ + /// When unset, the client will used a generated endpoint resolver based on the endpoint resolution + /// rules for `$moduleUseName`. + """ } else { + "/// This service does not define a default endpoint resolver." + } + if (codegenContext.settings.codegenConfig.includeEndpointUrlConfig) { rustTemplate( """ - /// Returns the endpoint resolver. - pub fn endpoint_resolver(&self) -> $sharedEndpointResolver { - self.endpoint_resolver.clone() + /// Set the endpoint URL to use when making requests. + /// + /// Note: setting an endpoint URL will replace any endpoint resolver that has been set. + /// + /// ## Panics + /// Panics if an invalid URL is given. + pub fn endpoint_url(mut self, endpoint_url: impl #{Into}<#{String}>) -> Self { + self.set_endpoint_url(#{Some}(endpoint_url.into())); + self } - """, - *codegenScope, - ) - } - } - is ServiceConfig.BuilderStruct -> { - if (runtimeMode.defaultToMiddleware) { - rustTemplate( - "endpoint_resolver: #{Option}<$sharedEndpointResolver>,", + /// Set the endpoint URL to use when making requests. + /// + /// Note: setting an endpoint URL will replace any endpoint resolver that has been set. + /// + /// ## Panics + /// Panics if an invalid URL is given. + pub fn set_endpoint_url(&mut self, endpoint_url: #{Option}<#{String}>) -> &mut Self { + ##[allow(deprecated)] + self.set_endpoint_resolver( + endpoint_url.map(|url| { + #{IntoShared}::into_shared(#{StaticUriEndpointResolver}::uri(url)) + }) + ); + self + } + """, *codegenScope, ) } - } - - ServiceConfig.BuilderImpl -> { - // if there are no rules, we don't generate a default resolver—we need to also suppress those docs. - val defaultResolverDocs = if (typesGenerator.defaultResolver() != null) { - val endpointModule = ClientRustModule.endpoint(codegenContext).fullyQualifiedPath() - .replace("crate::", "$moduleUseName::") + rustTemplate( """ + /// Sets the endpoint resolver to use when making requests. /// - /// When unset, the client will used a generated endpoint resolver based on the endpoint resolution - /// rules for `$moduleUseName`. + $defaultResolverDocs + /// + /// Note: setting an endpoint resolver will replace any endpoint URL that has been set. + /// This method accepts an endpoint resolver [specific to this service](#{ServiceSpecificResolver}). If you want to + /// provide a shared endpoint resolver, use [`Self::set_endpoint_resolver`]. /// /// ## Examples + /// Create a custom endpoint resolver that resolves a different endpoing per-stage, e.g. staging vs. production. /// ```no_run - /// use aws_smithy_http::endpoint; - /// use $endpointModule::{Params as EndpointParams, DefaultResolver}; - /// /// Endpoint resolver which adds a prefix to the generated endpoint + /// use $endpointModule::{ResolveEndpoint, EndpointFuture, Params, Endpoint}; /// ##[derive(Debug)] - /// struct PrefixResolver { - /// base_resolver: DefaultResolver, - /// prefix: String - /// } - /// impl endpoint::ResolveEndpoint for PrefixResolver { - /// fn resolve_endpoint(&self, params: &EndpointParams) -> endpoint::Result { - /// self.base_resolver - /// .resolve_endpoint(params) - /// .map(|ep|{ - /// let url = ep.url().to_string(); - /// ep.into_builder().url(format!("{}.{}", &self.prefix, url)).build() - /// }) - /// } + /// struct StageResolver { stage: String } + /// impl ResolveEndpoint for StageResolver { + /// fn resolve_endpoint(&self, params: &Params) -> EndpointFuture<'_> { + /// let stage = &self.stage; + /// EndpointFuture::ready(Ok(Endpoint::builder().url(format!("{stage}.myservice.com")).build())) + /// } /// } - /// let prefix_resolver = PrefixResolver { - /// base_resolver: DefaultResolver::new(), - /// prefix: "subdomain".to_string() - /// }; - /// let config = $moduleUseName::Config::builder().endpoint_resolver(prefix_resolver); + /// let resolver = StageResolver { stage: std::env::var("STAGE").unwrap() }; + /// let config = $moduleUseName::Config::builder().endpoint_resolver(resolver).build(); + /// let client = $moduleUseName::Client::from_conf(config); /// ``` - """ - } else { - "" - } - rustTemplate( - """ - /// Sets the endpoint resolver to use when making requests. - $defaultResolverDocs - pub fn endpoint_resolver(mut self, endpoint_resolver: impl $resolverTrait + 'static) -> Self { - self.set_endpoint_resolver(#{Some}(#{SharedEndpointResolver}::new(endpoint_resolver))); + pub fn endpoint_resolver(mut self, endpoint_resolver: impl #{ServiceSpecificResolver} + 'static) -> Self { + self.set_endpoint_resolver(#{Some}(endpoint_resolver.into_shared_resolver())); self } /// Sets the endpoint resolver to use when making requests. /// - /// When unset, the client will used a generated endpoint resolver based on the endpoint resolution - /// rules for `$moduleUseName`. + $defaultResolverDocs """, *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { - self.inner.store_or_unset(endpoint_resolver); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self { - self.endpoint_resolver = endpoint_resolver; - self - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderBuild -> { - val defaultResolver = typesGenerator.defaultResolver() - if (defaultResolver != null) { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - // TODO(enableNewSmithyRuntimeCleanup): Simplify the endpoint resolvers - """ - let endpoint_resolver = #{DynEndpointResolver}::new( - #{DefaultEndpointResolver}::<#{Params}>::new( - layer.load::<$sharedEndpointResolver>().cloned().unwrap_or_else(|| - #{SharedEndpointResolver}::new(#{DefaultResolver}::new()) - ) - ) - ); - layer.set_endpoint_resolver(endpoint_resolver); - """, - *codegenScope, - "DefaultResolver" to defaultResolver, - ) - } else { - rustTemplate( - """ - endpoint_resolver: self.endpoint_resolver.unwrap_or_else(|| - #{SharedEndpointResolver}::new(#{DefaultResolver}::new()) - ), - """, - *codegenScope, - "DefaultResolver" to defaultResolver, - ) - } - } else { - val alwaysFailsResolver = - RuntimeType.forInlineFun("MissingResolver", ClientRustModule.endpoint(codegenContext)) { - rustTemplate( - """ - ##[derive(Debug)] - pub(crate) struct MissingResolver; - impl #{ResolveEndpoint} for MissingResolver { - fn resolve_endpoint(&self, _params: &T) -> #{Result} { - Err(#{ResolveEndpointError}::message("an endpoint resolver must be provided.")) - } - } - """, - "ResolveEndpoint" to types.resolveEndpoint, - "ResolveEndpointError" to types.resolveEndpointError, - "Result" to types.smithyHttpEndpointModule.resolve("Result"), - ) - } - // To keep this diff under control, rather than `.expect` here, insert a resolver that will - // always fail. In the future, this will be changed to an `expect()` - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - let endpoint_resolver = #{DynEndpointResolver}::new( - #{DefaultEndpointResolver}::<#{Params}>::new( - layer.load::<$sharedEndpointResolver>().cloned().unwrap_or_else(|| - #{SharedEndpointResolver}::new(#{FailingResolver}) - ).clone() - ) - ); - layer.set_endpoint_resolver(endpoint_resolver); - """, - *codegenScope, - "FailingResolver" to alwaysFailsResolver, - ) - } else { - rustTemplate( - """ - endpoint_resolver: self.endpoint_resolver.unwrap_or_else(||#{SharedEndpointResolver}::new(#{FailingResolver})), - """, - *codegenScope, - "FailingResolver" to alwaysFailsResolver, - ) + rustTemplate( + """ + pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<#{SharedEndpointResolver}>) -> &mut Self { + self.runtime_components.set_endpoint_resolver(endpoint_resolver); + self } - } - } - - is ServiceConfig.OperationConfigOverride -> { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - if let #{Some}(resolver) = layer - .load::<$sharedEndpointResolver>() - .cloned() - { - let endpoint_resolver = #{DynEndpointResolver}::new( - #{DefaultEndpointResolver}::<#{Params}>::new(resolver)); - layer.set_endpoint_resolver(endpoint_resolver); - } - """, - *codegenScope, - ) - } + """, + *codegenScope, + ) } else -> emptySection diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt index c3d136659d3..d752efef95c 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt @@ -13,7 +13,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSec import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.util.letIf /** * Decorator that injects operation-level interceptors that configure an endpoint parameters builder @@ -31,9 +30,7 @@ class EndpointParamsDecorator : ClientCodegenDecorator { operation: OperationShape, baseCustomizations: List, ): List = - baseCustomizations.letIf(codegenContext.smithyRuntimeMode.generateOrchestrator) { - it + listOf(EndpointParametersCustomization(codegenContext, operation)) - } + baseCustomizations + listOf(EndpointParametersCustomization(codegenContext, operation)) } private class EndpointParametersCustomization( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt index c28c4c43a52..a47aa2d8082 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt @@ -25,7 +25,7 @@ class EndpointRulesetIndex : KnowledgeIndex { serviceShape, ) { serviceShape.getTrait()?.ruleSet?.let { EndpointRuleSet.fromNode(it) } - ?.also { it.typecheck() } + ?.also { it.typeCheck() } } fun endpointTests(serviceShape: ServiceShape) = diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt index 889b741ebbc..d20e2d72b8f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt @@ -53,7 +53,6 @@ class EndpointTypesGenerator( it, params, codegenContext = codegenContext, - endpointCustomizations = codegenContext.rootDecorator.endpointCustomizations(codegenContext), ).generate() } ?: {} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt index 351d205813c..2e53a29dccf 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt @@ -5,33 +5,22 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import software.amazon.smithy.model.node.BooleanNode import software.amazon.smithy.model.node.Node -import software.amazon.smithy.model.node.StringNode -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeType import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter -import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters -import software.amazon.smithy.rulesengine.traits.ContextIndex import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.endpointTestsModule +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.serviceSpecificEndpointResolver import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate -import software.amazon.smithy.rust.codegen.core.util.PANIC -import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.orNull /** * BuiltInResolver enables potentially external codegen stages to provide sources for `builtIn` parameters. @@ -49,7 +38,7 @@ interface EndpointCustomization { * ```kotlin * override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? { * return when (parameter.builtIn) { - * Builtins.REGION.builtIn -> writable { rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") } + * AwsBuiltIns.REGION.builtIn -> writable { rust("$configRef.region.as_ref().map(|r|r.as_ref().to_owned())") } * else -> null * } * } @@ -63,7 +52,7 @@ interface EndpointCustomization { * Example: * ```kotlin * override fun setBuiltInOnServiceConfig(name: String, value: Node, configBuilderRef: String): Writable? { - * if (name != Builtins.REGION.builtIn.get()) { + * if (name != AwsBuiltIns.REGION.builtIn.get()) { * return null * } * return writable { @@ -102,18 +91,6 @@ class EndpointsDecorator : ClientCodegenDecorator { override val name: String = "Endpoints" override val order: Byte = 0 - override fun operationCustomizations( - codegenContext: ClientCodegenContext, - operation: OperationShape, - baseCustomizations: List, - ): List { - return baseCustomizations + InjectEndpointInMakeOperation( - codegenContext, - EndpointTypesGenerator.fromContext(codegenContext), - operation, - ) - } - override fun endpointCustomizations(codegenContext: ClientCodegenContext): List { return listOf( object : EndpointCustomization { @@ -132,117 +109,51 @@ class EndpointsDecorator : ClientCodegenDecorator { EndpointConfigCustomization(codegenContext, EndpointTypesGenerator.fromContext(codegenContext)) } - override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { - val generator = EndpointTypesGenerator.fromContext(codegenContext) - rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) { - withInlineModule(endpointTestsModule(codegenContext), rustCrate.moduleDocProvider) { - generator.testGenerator()(this) - } - } - } - - /** - * Creates an `::endpoint_resolver::Params` structure in make operation generator. This combines state from the - * client, the operation, and the model to create parameters. - * - * Example generated code: - * ```rust - * let _endpoint_params = crate::endpoint_resolver::Params::builder() - * .set_region(Some("test-region")) - * .set_disable_everything(Some(true)) - * .set_bucket(input.bucket.as_ref()) - * .build(); - * ``` - */ - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization - class InjectEndpointInMakeOperation( - private val ctx: ClientCodegenContext, - private val typesGenerator: EndpointTypesGenerator, - private val operationShape: OperationShape, - ) : - OperationCustomization() { - - private val idx = ContextIndex.of(ctx.model) - private val types = Types(ctx.runtimeConfig) - - override fun section(section: OperationSection): Writable { - val codegenScope = arrayOf( - *RuntimeType.preludeScope, - "Params" to typesGenerator.paramsStruct(), - "ResolveEndpoint" to types.resolveEndpoint, - "ResolveEndpointError" to types.resolveEndpointError, - ) - return when (section) { - is OperationSection.MutateInput -> writable { - rustTemplate( - """ - use #{ResolveEndpoint}; - let params_result = #{Params}::builder()#{builderFields:W}.build() - .map_err(|err| #{ResolveEndpointError}::from_source("could not construct endpoint parameters", err)); - let (endpoint_result, params) = match params_result { - #{Ok}(params) => (${section.config}.endpoint_resolver.resolve_endpoint(¶ms), #{Some}(params)), - #{Err}(e) => (#{Err}(e), #{None}) - }; - """, - "builderFields" to builderFields(typesGenerator.params, section), - *codegenScope, - ) - } - - is OperationSection.MutateRequest -> writable { - // insert the endpoint the bag - rustTemplate("${section.request}.properties_mut().insert(endpoint_result);") - rustTemplate("""if let #{Some}(params) = params { ${section.request}.properties_mut().insert(params); }""", *codegenScope) + override fun serviceRuntimePluginCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List { + return baseCustomizations + object : ServiceRuntimePluginCustomization() { + override fun section(section: ServiceRuntimePluginSection): Writable { + return when (section) { + is ServiceRuntimePluginSection.RegisterRuntimeComponents -> writable { + codegenContext.defaultEndpointResolver()?.also { resolver -> + section.registerEndpointResolver(this, resolver) + } + } + + else -> emptySection } - - else -> emptySection } } + } - private fun Node.toWritable(): Writable { - val node = this - return writable { - when (node) { - is StringNode -> rustTemplate("#{Some}(${node.value.dq()}.to_string())", *RuntimeType.preludeScope) - is BooleanNode -> rustTemplate("#{Some}(${node.value})", *RuntimeType.preludeScope) - else -> PANIC("unsupported default value: $node") - } + override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) { + val generator = EndpointTypesGenerator.fromContext(codegenContext) + rustCrate.withModule(ClientRustModule.Config.endpoint) { + withInlineModule(endpointTestsModule(), rustCrate.moduleDocProvider) { + generator.testGenerator()(this) } } + } +} - private fun builderFields(params: Parameters, section: OperationSection.MutateInput) = writable { - val memberParams = idx.getContextParams(operationShape).toList().sortedBy { it.first.memberName } - val builtInParams = params.toList().filter { it.isBuiltIn } - // first load builtins and their defaults - builtInParams.forEach { param -> - typesGenerator.builtInFor(param, section.config)?.also { defaultValue -> - rust(".set_${param.name.rustName()}(#W)", defaultValue) - } - } - - idx.getClientContextParams(ctx.serviceShape).orNull()?.parameters?.forEach { (name, param) -> - val paramName = EndpointParamsGenerator.memberName(name) - val setterName = EndpointParamsGenerator.setterName(name) - if (param.type == ShapeType.BOOLEAN) { - rust(".$setterName(${section.config}.$paramName)") - } else { - rust(".$setterName(${section.config}.$paramName.clone())") - } - } - - idx.getStaticContextParams(operationShape).orNull()?.parameters?.forEach { (name, param) -> - val setterName = EndpointParamsGenerator.setterName(name) - val value = param.value.toWritable() - rust(".$setterName(#W)", value) - } - - // lastly, allow these to be overridden by members - memberParams.forEach { (memberShape, param) -> - val memberName = ctx.symbolProvider.toMemberName(memberShape) - rust( - ".${EndpointParamsGenerator.setterName(param.name)}(${section.input}.$memberName.clone())", - ) - } - } +/** + * Returns the rules-generated endpoint resolver for this service + * + * If no endpoint rules are provided, `null` will be returned. + */ +private fun ClientCodegenContext.defaultEndpointResolver(): Writable? { + val generator = EndpointTypesGenerator.fromContext(this) + val defaultResolver = generator.defaultResolver() ?: return null + val ctx = arrayOf("DefaultResolver" to defaultResolver, "ServiceSpecificResolver" to serviceSpecificEndpointResolver()) + return writable { + rustTemplate( + """{ + use #{ServiceSpecificResolver}; + #{DefaultResolver}::new().into_shared_resolver() + }""", + *ctx, + ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt index bed14f40aeb..7d88408b738 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt @@ -6,22 +6,34 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.rulesengine.language.Endpoint +import software.amazon.smithy.rulesengine.language.EndpointRuleSet import software.amazon.smithy.rulesengine.language.syntax.Identifier +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter import software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType +import software.amazon.smithy.rulesengine.language.syntax.rule.Rule +import software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor import software.amazon.smithy.rulesengine.traits.ContextParamTrait +import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointStdLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustType +import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.makeOptional import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.smithy.unsafeToRustName +import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.letIf +import software.amazon.smithy.rust.codegen.core.util.orNull data class Context(val functionRegistry: FunctionRegistry, val runtimeConfig: RuntimeConfig) @@ -33,26 +45,49 @@ fun Identifier.rustName(): String { } /** - * Endpoints standard library file + * Endpoints standard library */ -internal fun endpointsLib(name: String, vararg additionalDependency: RustDependency) = InlineDependency.forRustFile( - RustModule.pubCrate( - name, - parent = EndpointStdLib, - ), - "/inlineable/src/endpoint_lib/$name.rs", - *additionalDependency, -) +object EndpointsLib { + val DiagnosticCollector = endpointsLib("diagnostic").toType().resolve("DiagnosticCollector") + fun PartitionResolver(runtimeConfig: RuntimeConfig) = + endpointsLib("partition", CargoDependency.smithyJson(runtimeConfig), CargoDependency.RegexLite).toType() + .resolve("PartitionResolver") + + val substring = endpointsLib("substring").toType().resolve("substring") + val isValidHostLabel = endpointsLib("host").toType().resolve("is_valid_host_label") + val parseUrl = endpointsLib("parse_url", CargoDependency.Http, CargoDependency.Url).toType().resolve("parse_url") + val uriEncode = endpointsLib("uri_encode", CargoDependency.PercentEncoding).toType().resolve("uri_encode") + + val awsParseArn = endpointsLib("arn").toType().resolve("parse_arn") + val awsIsVirtualHostableS3Bucket = + endpointsLib("s3", endpointsLib("host"), CargoDependency.OnceCell, CargoDependency.RegexLite).toType() + .resolve("is_virtual_hostable_s3_bucket") + + private fun endpointsLib(name: String, vararg additionalDependency: RustDependency) = InlineDependency.forRustFile( + RustModule.pubCrate( + name, + parent = EndpointStdLib, + ), + "/inlineable/src/endpoint_lib/$name.rs", + *additionalDependency, + ) +} class Types(runtimeConfig: RuntimeConfig) { private val smithyTypesEndpointModule = RuntimeType.smithyTypes(runtimeConfig).resolve("endpoint") val smithyHttpEndpointModule = RuntimeType.smithyHttp(runtimeConfig).resolve("endpoint") - val resolveEndpoint = smithyHttpEndpointModule.resolve("ResolveEndpoint") - val sharedEndpointResolver = smithyHttpEndpointModule.resolve("SharedEndpointResolver") val smithyEndpoint = smithyTypesEndpointModule.resolve("Endpoint") + val endpointFuture = RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::endpoint::EndpointFuture") + private val endpointRtApi = RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::endpoint") val resolveEndpointError = smithyHttpEndpointModule.resolve("ResolveEndpointError") - fun toArray() = arrayOf("ResolveEndpointError" to resolveEndpointError, "Endpoint" to smithyEndpoint) + fun toArray() = arrayOf( + "Endpoint" to smithyEndpoint, + "EndpointFuture" to endpointFuture, + "SharedEndpointResolver" to endpointRtApi.resolve("SharedEndpointResolver"), + "EndpointResolverParams" to endpointRtApi.resolve("EndpointResolverParams"), + "ResolveEndpoint" to endpointRtApi.resolve("ResolveEndpoint"), + ) } /** @@ -65,7 +100,7 @@ fun Parameter.memberName(): String { fun ContextParamTrait.memberName(): String = this.name.unsafeToRustName() /** - * Returns the symbol for a given parameter. This enables [RustWriter] to generate the correct [RustType]. + * Returns the symbol for a given parameter. This enables [software.amazon.smithy.rust.codegen.core.rustlang.RustWriter] to generate the correct [RustType]. */ fun Parameter.symbol(): Symbol { val rustType = when (this.type) { @@ -76,3 +111,39 @@ fun Parameter.symbol(): Symbol { // Parameter return types are always optional return Symbol.builder().rustType(rustType).build().letIf(!this.isRequired) { it.makeOptional() } } + +/** + * A class for fetching the set of auth schemes supported by an `EndpointRuleSet`. + */ +class AuthSchemeLister : RuleValueVisitor> { + companion object { + fun authSchemesForRuleset(endpointRuleSet: EndpointRuleSet): Set { + return AuthSchemeLister().visitTreeRule(endpointRuleSet.rules) + } + } + + override fun visitEndpointRule(endpoint: Endpoint): Set { + return endpoint.properties.getOrDefault(Identifier.of("authSchemes"), Literal.tupleLiteral(listOf())) + .asTupleLiteral() + .orNull()?.let { + it.map { authScheme -> + authScheme.asRecordLiteral().get()[Identifier.of("name")]!!.asStringLiteral().get().expectLiteral() + } + }?.toHashSet() ?: hashSetOf() + } + + override fun visitTreeRule(rules: MutableList): Set { + return rules.map { it.accept(this) }.reduce { a, b -> a.union(b) } + } + + override fun visitErrorRule(error: Expression?): Set { + return setOf() + } +} + +/** + * Returns a service's supported auth schemes + */ +fun ServiceShape.supportedAuthSchemes(): Set = + this.getTrait()?.ruleSet?.let { EndpointRuleSet.fromNode(it) }?.also { it.typeCheck() } + ?.let { AuthSchemeLister.authSchemesForRuleset(it) } ?: setOf() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt index 779a4eb8d27..57a8f31de85 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt @@ -5,7 +5,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators -import software.amazon.smithy.rulesengine.language.eval.Value +import software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue +import software.amazon.smithy.rulesengine.language.evaluation.value.StringValue +import software.amazon.smithy.rulesengine.language.evaluation.value.Value import software.amazon.smithy.rulesengine.language.syntax.Identifier import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -38,12 +40,12 @@ import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.orNull // internals contains the actual resolver function -fun endpointImplModule(codegenContext: ClientCodegenContext) = RustModule.private("internals", parent = ClientRustModule.endpoint(codegenContext)) +fun endpointImplModule() = RustModule.private("internals", parent = ClientRustModule.Config.endpoint) -fun endpointTestsModule(codegenContext: ClientCodegenContext) = RustModule.new( +fun endpointTestsModule() = RustModule.new( "test", visibility = Visibility.PRIVATE, - parent = ClientRustModule.endpoint(codegenContext), + parent = ClientRustModule.Config.endpoint, inline = true, documentationOverride = "", ).cfgTest() @@ -118,15 +120,15 @@ internal class EndpointParamsGenerator( fun setterName(parameterName: String) = "set_${memberName(parameterName)}" } - fun paramsStruct(): RuntimeType = RuntimeType.forInlineFun("Params", ClientRustModule.endpoint(codegenContext)) { + fun paramsStruct(): RuntimeType = RuntimeType.forInlineFun("Params", ClientRustModule.Config.endpoint) { generateEndpointsStruct(this) } - internal fun paramsBuilder(): RuntimeType = RuntimeType.forInlineFun("ParamsBuilder", ClientRustModule.endpoint(codegenContext)) { + internal fun paramsBuilder(): RuntimeType = RuntimeType.forInlineFun("ParamsBuilder", ClientRustModule.Config.endpoint) { generateEndpointParamsBuilder(this) } - private fun paramsError(): RuntimeType = RuntimeType.forInlineFun("InvalidParams", ClientRustModule.endpoint(codegenContext)) { + private fun paramsError(): RuntimeType = RuntimeType.forInlineFun("InvalidParams", ClientRustModule.Config.endpoint) { rust( """ /// An error that occurred during endpoint resolution @@ -216,8 +218,8 @@ internal class EndpointParamsGenerator( private fun value(value: Value): String { return when (value) { - is Value.String -> value.value().dq() + ".to_string()" - is Value.Bool -> value.expectBool().toString() + is StringValue -> value.value.dq() + ".to_string()" + is BooleanValue -> value.value.toString() else -> TODO("unexpected type: $value") } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt index b9dca27732b..ec3b21417a1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt @@ -28,10 +28,12 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.smithy.generators.enforceRequired import software.amazon.smithy.rust.codegen.core.util.PANIC import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.inputShape import software.amazon.smithy.rust.codegen.core.util.orNull +import software.amazon.smithy.rust.codegen.core.util.toPascalCase class EndpointParamsInterceptorGenerator( private val codegenContext: ClientCodegenContext, @@ -41,21 +43,18 @@ class EndpointParamsInterceptorGenerator( private val endpointTypesGenerator = EndpointTypesGenerator.fromContext(codegenContext) private val codegenScope = codegenContext.runtimeConfig.let { rc -> val endpointTypesGenerator = EndpointTypesGenerator.fromContext(codegenContext) - val runtimeApi = CargoDependency.smithyRuntimeApi(rc).toType() + val runtimeApi = CargoDependency.smithyRuntimeApiClient(rc).toType() val interceptors = runtimeApi.resolve("client::interceptors") val orchestrator = runtimeApi.resolve("client::orchestrator") - val smithyTypes = CargoDependency.smithyTypes(rc).toType() arrayOf( *preludeScope, "BoxError" to RuntimeType.boxError(rc), "ConfigBag" to RuntimeType.configBag(rc), - "ConfigBagAccessors" to RuntimeType.smithyRuntimeApi(rc) - .resolve("client::config_bag_accessors::ConfigBagAccessors"), "ContextAttachedError" to interceptors.resolve("error::ContextAttachedError"), - "EndpointResolverParams" to orchestrator.resolve("EndpointResolverParams"), + "EndpointResolverParams" to runtimeApi.resolve("client::endpoint::EndpointResolverParams"), "HttpRequest" to orchestrator.resolve("HttpRequest"), "HttpResponse" to orchestrator.resolve("HttpResponse"), - "Interceptor" to RuntimeType.interceptor(rc), + "Intercept" to RuntimeType.intercept(rc), "InterceptorContext" to RuntimeType.interceptorContext(rc), "BeforeSerializationInterceptorContextRef" to RuntimeType.beforeSerializationInterceptorContextRef(rc), "Input" to interceptors.resolve("context::Input"), @@ -75,13 +74,16 @@ class EndpointParamsInterceptorGenerator( ##[derive(Debug)] struct $interceptorName; - impl #{Interceptor} for $interceptorName { + impl #{Intercept} for $interceptorName { + fn name(&self) -> &'static str { + ${interceptorName.dq()} + } + fn read_before_execution( &self, context: &#{BeforeSerializationInterceptorContextRef}<'_, #{Input}, #{Output}, #{Error}>, cfg: &mut #{ConfigBag}, ) -> #{Result}<(), #{BoxError}> { - use #{ConfigBagAccessors}; let _input = context.input() .downcast_ref::<${operationInput.name}>() .ok_or("failed to downcast to ${operationInput.name}")?; @@ -92,7 +94,7 @@ class EndpointParamsInterceptorGenerator( #{param_setters} .build() .map_err(|err| #{ContextAttachedError}::new("endpoint params could not be built", err))?; - cfg.interceptor_state().set_endpoint_resolver_params(#{EndpointResolverParams}::new(params)); + cfg.interceptor_state().store_put(#{EndpointResolverParams}::new(params)); #{Ok}(()) } } @@ -109,12 +111,7 @@ class EndpointParamsInterceptorGenerator( val builtInParams = params.toList().filter { it.isBuiltIn } // first load builtins and their defaults builtInParams.forEach { param -> - val config = if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - "cfg" - } else { - "_config" - } - endpointTypesGenerator.builtInFor(param, config)?.also { defaultValue -> + endpointTypesGenerator.builtInFor(param, "cfg")?.also { defaultValue -> rust(".set_${param.name.rustName()}(#W)", defaultValue) } } @@ -122,7 +119,7 @@ class EndpointParamsInterceptorGenerator( idx.getClientContextParams(codegenContext.serviceShape).orNull()?.parameters?.forEach { (name, param) -> val setterName = EndpointParamsGenerator.setterName(name) val inner = ClientContextConfigCustomization.toSymbol(param.type, symbolProvider) - val newtype = configParamNewtype(name, inner, codegenContext.runtimeConfig) + val newtype = configParamNewtype(name.toPascalCase(), inner, codegenContext.runtimeConfig) rustTemplate( ".$setterName(cfg.#{load_from_service_config_layer})", "load_from_service_config_layer" to loadFromConfigBag(inner.name, newtype), @@ -138,8 +135,10 @@ class EndpointParamsInterceptorGenerator( // lastly, allow these to be overridden by members memberParams.forEach { (memberShape, param) -> val memberName = codegenContext.symbolProvider.toMemberName(memberShape) - rust( - ".${EndpointParamsGenerator.setterName(param.name)}(_input.$memberName.clone())", + val member = memberShape.enforceRequired(writable("_input.$memberName.clone()"), codegenContext) + + rustTemplate( + ".${EndpointParamsGenerator.setterName(param.name)}(#{member})", "member" to member, ) } } @@ -172,7 +171,6 @@ class EndpointParamsInterceptorGenerator( endpointTraitBindings.render( this, "_input", - codegenContext.smithyRuntimeMode, ) } rust("cfg.interceptor_state().store_put(endpoint_prefix);") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt index a8237205711..174bf8f5861 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt @@ -7,18 +7,20 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators import software.amazon.smithy.rulesengine.language.Endpoint import software.amazon.smithy.rulesengine.language.EndpointRuleSet -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Reference -import software.amazon.smithy.rulesengine.language.syntax.fn.IsSet +import software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType +import software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Reference +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.IsSet import software.amazon.smithy.rulesengine.language.syntax.rule.Condition import software.amazon.smithy.rulesengine.language.syntax.rule.Rule -import software.amazon.smithy.rulesengine.language.visit.RuleValueVisitor +import software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.endpointsLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.memberName import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.ExpressionGenerator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.Ownership @@ -32,11 +34,12 @@ import software.amazon.smithy.rust.codegen.core.rustlang.escape import software.amazon.smithy.rust.codegen.core.rustlang.join import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.orNull +import software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault abstract class CustomRuntimeFunction { abstract val id: String @@ -127,10 +130,14 @@ internal class EndpointResolverGenerator( private val registry: FunctionRegistry = FunctionRegistry(stdlib) private val types = Types(runtimeConfig) private val codegenScope = arrayOf( + "BoxError" to RuntimeType.boxError(runtimeConfig), "endpoint" to types.smithyHttpEndpointModule, "SmithyEndpoint" to types.smithyEndpoint, + "EndpointFuture" to types.endpointFuture, + "ResolveEndpointError" to types.resolveEndpointError, "EndpointError" to types.resolveEndpointError, - "DiagnosticCollector" to endpointsLib("diagnostic").toType().resolve("DiagnosticCollector"), + "ServiceSpecificEndpointResolver" to codegenContext.serviceSpecificEndpointResolver(), + "DiagnosticCollector" to EndpointsLib.DiagnosticCollector, ) private val allowLintsForResolver = listOf( @@ -168,7 +175,7 @@ internal class EndpointResolverGenerator( // Now that we rendered the rules once (and then threw it away) we can see what functions we actually used! val fnsUsed = registry.fnsUsed() - return RuntimeType.forInlineFun("DefaultResolver", ClientRustModule.endpoint(codegenContext)) { + return RuntimeType.forInlineFun("DefaultResolver", ClientRustModule.Config.endpoint) { rustTemplate( """ /// The default endpoint resolver @@ -182,13 +189,17 @@ internal class EndpointResolverGenerator( pub fn new() -> Self { Self { #{custom_fields_init:W} } } - } - impl #{endpoint}::ResolveEndpoint<#{Params}> for DefaultResolver { - fn resolve_endpoint(&self, params: &Params) -> #{endpoint}::Result { + fn resolve_endpoint(&self, params: &#{Params}) -> Result<#{SmithyEndpoint}, #{BoxError}> { let mut diagnostic_collector = #{DiagnosticCollector}::new(); - #{resolver_fn}(params, &mut diagnostic_collector, #{additional_args}) - .map_err(|err|err.with_source(diagnostic_collector.take_last_error())) + Ok(#{resolver_fn}(params, &mut diagnostic_collector, #{additional_args}) + .map_err(|err|err.with_source(diagnostic_collector.take_last_error()))?) + } + } + + impl #{ServiceSpecificEndpointResolver} for DefaultResolver { + fn resolve_endpoint(&self, params: &#{Params}) -> #{EndpointFuture} { + #{EndpointFuture}::ready(self.resolve_endpoint(params)) } } """, @@ -206,7 +217,7 @@ internal class EndpointResolverGenerator( endpointRuleSet: EndpointRuleSet, fnsUsed: List, ): RuntimeType { - return RuntimeType.forInlineFun("resolve_endpoint", endpointImplModule(codegenContext)) { + return RuntimeType.forInlineFun("resolve_endpoint", endpointImplModule()) { Attribute(allow(allowLintsForResolver)).render(this) rustTemplate( """ @@ -247,9 +258,9 @@ internal class EndpointResolverGenerator( } private fun isExhaustive(rule: Rule): Boolean = rule.conditions.isEmpty() || rule.conditions.all { - when (it.fn.type()) { - is Type.Bool -> false - is Type.Option -> false + when (it.function.type()) { + is BooleanType -> false + is OptionalType -> false else -> true } } @@ -262,8 +273,8 @@ internal class EndpointResolverGenerator( * deal with the actual target of the condition but flattening through isSet */ private fun Condition.targetFunction(): Expression { - return when (val fn = this.fn) { - is IsSet -> fn.target + return when (val fn = this.function) { + is IsSet -> fn.arguments[0] else -> fn } } @@ -292,7 +303,7 @@ internal class EndpointResolverGenerator( val target = generator.generate(fn) val next = generateRuleInternal(rule, rest) when { - fn.type() is Type.Option -> { + fn.type() is OptionalType -> { Attribute.AllowUnusedVariables.render(this) rustTemplate( "if let Some($resultName) = #{target:W} { #{next:W} }", @@ -301,7 +312,7 @@ internal class EndpointResolverGenerator( ) } - fn.type() is Type.Bool -> { + fn.type() is BooleanType -> { rustTemplate( """ if #{target:W} {#{binding} @@ -362,8 +373,51 @@ internal class EndpointResolverGenerator( return writable { rustTemplate("#{SmithyEndpoint}::builder().url(#{url:W})", *codegenScope, "url" to url) headers.forEach { (name, values) -> values.forEach { rust(".header(${name.dq()}, #W)", it) } } - properties.forEach { (name, value) -> rust(".property(${name.asString().dq()}, #W)", value) } + properties.forEach { (name, value) -> rust(".property(${name.toString().dq()}, #W)", value) } rust(".build()") } } } + +fun ClientCodegenContext.serviceSpecificEndpointResolver(): RuntimeType { + val generator = EndpointTypesGenerator.fromContext(this) + return RuntimeType.forInlineFun("ResolveEndpoint", ClientRustModule.Config.endpoint) { + val ctx = arrayOf(*preludeScope, "Params" to generator.paramsStruct(), *Types(runtimeConfig).toArray(), "Debug" to RuntimeType.Debug) + rustTemplate( + """ + /// Endpoint resolver trait specific to ${serviceShape.serviceNameOrDefault("this service")} + pub trait ResolveEndpoint: #{Send} + #{Sync} + #{Debug} { + /// Resolve an endpoint with the given parameters + fn resolve_endpoint<'a>(&'a self, params: &'a #{Params}) -> #{EndpointFuture}<'a>; + + /// Convert this service-specific resolver into a `SharedEndpointResolver` + /// + /// The resulting resolver will downcast `EndpointResolverParams` into `#{Params}`. + fn into_shared_resolver(self) -> #{SharedEndpointResolver} + where + Self: Sized + 'static, + { + #{SharedEndpointResolver}::new(DowncastParams(self)) + } + } + + ##[derive(Debug)] + struct DowncastParams(T); + impl #{ResolveEndpoint} for DowncastParams + where + T: ResolveEndpoint, + { + fn resolve_endpoint<'a>(&'a self, params: &'a #{EndpointResolverParams}) -> #{EndpointFuture}<'a> { + let ep = match params.get::<#{Params}>() { + Some(params) => self.0.resolve_endpoint(params), + None => #{EndpointFuture}::ready(Err("params of expected type was not present".into())), + }; + ep + } + } + + """, + *ctx, + ) + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt index c5b415b2a6b..d14c0f3d224 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt @@ -5,13 +5,17 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators -import software.amazon.smithy.rulesengine.language.eval.Value +import software.amazon.smithy.rulesengine.language.evaluation.value.ArrayValue +import software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue +import software.amazon.smithy.rulesengine.language.evaluation.value.IntegerValue +import software.amazon.smithy.rulesengine.language.evaluation.value.RecordValue +import software.amazon.smithy.rulesengine.language.evaluation.value.StringValue +import software.amazon.smithy.rulesengine.language.evaluation.value.Value import software.amazon.smithy.rulesengine.language.syntax.Identifier import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters import software.amazon.smithy.rulesengine.traits.EndpointTestCase import software.amazon.smithy.rulesengine.traits.ExpectedEndpoint import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName import software.amazon.smithy.rust.codegen.client.smithy.generators.ClientInstantiator @@ -33,16 +37,12 @@ internal class EndpointTestGenerator( private val paramsType: RuntimeType, private val resolverType: RuntimeType, private val params: Parameters, - private val endpointCustomizations: List, codegenContext: ClientCodegenContext, ) { private val runtimeConfig = codegenContext.runtimeConfig - private val serviceShape = codegenContext.serviceShape - private val model = codegenContext.model private val types = Types(runtimeConfig) private val codegenScope = arrayOf( "Endpoint" to types.smithyEndpoint, - "ResolveEndpoint" to types.resolveEndpoint, "Error" to types.resolveEndpointError, "Document" to RuntimeType.document(runtimeConfig), "HashMap" to RuntimeType.HashMap, @@ -62,7 +62,6 @@ internal class EndpointTestGenerator( #{docs:W} ##[test] fn test_$id() { - use #{ResolveEndpoint}; let params = #{params:W}; let resolver = #{resolver}::new(); let endpoint = resolver.resolve_endpoint(¶ms); @@ -119,9 +118,9 @@ internal class EndpointTestGenerator( private fun generateValue(value: Value): Writable { return { when (value) { - is Value.String -> rust(escape(value.value()).dq() + ".to_string()") - is Value.Bool -> rust(value.toString()) - is Value.Array -> { + is StringValue -> rust(escape(value.value).dq() + ".to_string()") + is BooleanValue -> rust(value.toString()) + is ArrayValue -> { rust( "vec![#W]", value.values.map { member -> @@ -136,22 +135,20 @@ internal class EndpointTestGenerator( ) } - is Value.Integer -> rust(value.expectInteger().toString()) + is IntegerValue -> rust(value.value.toString()) - is Value.Record -> + is RecordValue -> rustBlock("") { rustTemplate( "let mut out = #{HashMap}::::new();", *codegenScope, ) - // TODO(https://github.com/awslabs/smithy/pull/1555): remove sort by name when upgrading to - // Smithy version with this PR merged - val keys = mutableListOf() - value.forEach { id, _ -> keys.add(id) } - keys.sortedBy { it.name.value }.forEach { identifier -> - val v = value.get(identifier) + val ids = mutableListOf() + value.value.forEach { (id, _) -> ids.add(id) } + ids.forEach { id -> + val v = value.get(id) rust( - "out.insert(${identifier.toString().dq()}.to_string(), #W.into());", + "out.insert(${id.toString().dq()}.to_string(), #W.into());", // When writing into the hashmap, it always needs to be an owned type generateValue(v), ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt index b0d45366ed0..562ba8e2018 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt @@ -6,13 +6,15 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import org.jetbrains.annotations.Contract -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Reference -import software.amazon.smithy.rulesengine.language.syntax.fn.FunctionDefinition -import software.amazon.smithy.rulesengine.language.syntax.fn.GetAttr -import software.amazon.smithy.rulesengine.language.visit.ExpressionVisitor +import software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType +import software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType +import software.amazon.smithy.rulesengine.language.evaluation.type.Type +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.ExpressionVisitor +import software.amazon.smithy.rulesengine.language.syntax.expressions.Reference +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.FunctionDefinition +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.GetAttr +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName @@ -51,7 +53,7 @@ class ExpressionGenerator( override fun visitRef(ref: Reference) = writable { if (ownership == Ownership.Owned) { when (ref.type()) { - is Type.Bool -> rust("*${ref.name.rustName()}") + is BooleanType -> rust("*${ref.name.rustName()}") else -> rust("${ref.name.rustName()}.to_owned()") } } else { @@ -75,8 +77,8 @@ class ExpressionGenerator( } } } - if (ownership == Ownership.Owned && getAttr.type() != Type.bool()) { - if (getAttr.type() is Type.Option) { + if (ownership == Ownership.Owned && getAttr.type() != Type.booleanType()) { + if (getAttr.type() is OptionalType) { rust(".map(|t|t.to_owned())") } else { rust(".to_owned()") diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt index 8911ddc7a54..a986c50e6da 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt @@ -6,8 +6,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import software.amazon.smithy.rulesengine.language.syntax.Identifier -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.LiteralVisitor import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -24,13 +25,13 @@ import java.util.stream.Stream * The `Document` type is used to support generating JSON-like documents */ class LiteralGenerator(private val ownership: Ownership, private val context: Context) : - Literal.Vistor { + LiteralVisitor { private val runtimeConfig = context.runtimeConfig private val codegenScope = arrayOf( "Document" to RuntimeType.document(runtimeConfig), "HashMap" to RuntimeType.HashMap, ) - override fun visitBool(b: Boolean) = writable { + override fun visitBoolean(b: Boolean) = writable { rust(b.toString()) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt index 2c16a51bb72..8bbb3cd9629 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt @@ -6,13 +6,13 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.endpointsLib +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsLib import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointStdLib import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.toType import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -22,16 +22,10 @@ import software.amazon.smithy.rust.codegen.core.util.dq * Standard library functions available to all generated crates (e.g. not `aws.` specific / prefixed) */ internal val SmithyEndpointsStdLib: List = listOf( - SimpleRuntimeFunction("substring", endpointsLib("substring").toType().resolve("substring")), - SimpleRuntimeFunction("isValidHostLabel", endpointsLib("host").toType().resolve("is_valid_host_label")), - SimpleRuntimeFunction( - "parseURL", - endpointsLib("parse_url", CargoDependency.Http, CargoDependency.Url).toType().resolve("parse_url"), - ), - SimpleRuntimeFunction( - "uriEncode", - endpointsLib("uri_encode", CargoDependency.PercentEncoding).toType().resolve("uri_encode"), - ), + SimpleRuntimeFunction("substring", EndpointsLib.substring), + SimpleRuntimeFunction("isValidHostLabel", EndpointsLib.isValidHostLabel), + SimpleRuntimeFunction("parseURL", EndpointsLib.parseUrl), + SimpleRuntimeFunction("uriEncode", EndpointsLib.uriEncode), ) /** @@ -40,20 +34,9 @@ internal val SmithyEndpointsStdLib: List = listOf( * This is defined in client-codegen to support running tests—it is not used when generating smithy-native services. */ fun awsStandardLib(runtimeConfig: RuntimeConfig, partitionsDotJson: Node) = listOf( - SimpleRuntimeFunction("aws.parseArn", endpointsLib("arn").toType().resolve("parse_arn")), - SimpleRuntimeFunction( - "aws.isVirtualHostableS3Bucket", - endpointsLib( - "s3", - endpointsLib("host"), - CargoDependency.OnceCell, - CargoDependency.Regex, - ).toType().resolve("is_virtual_hostable_s3_bucket"), - ), - AwsPartitionResolver( - runtimeConfig, - partitionsDotJson, - ), + SimpleRuntimeFunction("aws.parseArn", EndpointsLib.awsParseArn), + SimpleRuntimeFunction("aws.isVirtualHostableS3Bucket", EndpointsLib.awsIsVirtualHostableS3Bucket), + AwsPartitionResolver(runtimeConfig, partitionsDotJson), ) /** @@ -65,19 +48,26 @@ class AwsPartitionResolver(runtimeConfig: RuntimeConfig, private val partitionsD CustomRuntimeFunction() { override val id: String = "aws.partition" private val codegenScope = arrayOf( - "PartitionResolver" to endpointsLib( - "partition", - CargoDependency.smithyJson(runtimeConfig), - CargoDependency.Regex, - ).toType() - .resolve("PartitionResolver"), + "PartitionResolver" to EndpointsLib.PartitionResolver(runtimeConfig), + "Lazy" to CargoDependency.OnceCell.toType().resolve("sync::Lazy"), ) override fun structFieldInit() = writable { val json = Node.printJson(partitionsDotJson).dq() rustTemplate( - """partition_resolver: #{PartitionResolver}::new_from_json(b$json).expect("valid JSON")""", + """partition_resolver: #{DEFAULT_PARTITION_RESOLVER}.clone()""", *codegenScope, + "DEFAULT_PARTITION_RESOLVER" to RuntimeType.forInlineFun("DEFAULT_PARTITION_RESOLVER", EndpointStdLib) { + rustTemplate( + """ + // Loading the partition JSON is expensive since it involves many regex compilations, + // so cache the result so that it only need to be paid for the first constructed client. + pub(crate) static DEFAULT_PARTITION_RESOLVER: #{Lazy}<#{PartitionResolver}> = + #{Lazy}::new(|| #{PartitionResolver}::new_from_json(b$json).expect("valid JSON")); + """, + *codegenScope, + ) + }, ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt index 93381313926..29b8a8d50f1 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt @@ -5,8 +5,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.visit.TemplateVisitor +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.TemplateVisitor import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/AuthOptionsPluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/AuthOptionsPluginGenerator.kt new file mode 100644 index 00000000000..2fd61b38062 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/AuthOptionsPluginGenerator.kt @@ -0,0 +1,78 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators + +import software.amazon.smithy.model.knowledge.ServiceIndex +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.traits.OptionalAuthTrait +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.customizations.noAuthSchemeShapeId +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.isEmpty +import software.amazon.smithy.rust.codegen.core.rustlang.join +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.util.PANIC +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import java.util.logging.Logger + +class AuthOptionsPluginGenerator(private val codegenContext: ClientCodegenContext) { + private val runtimeConfig = codegenContext.runtimeConfig + + private val logger: Logger = Logger.getLogger(javaClass.name) + fun authPlugin(operationShape: OperationShape, authSchemeOptions: List) = writable { + rustTemplate( + """ + #{DefaultAuthOptionsPlugin}::new(vec![#{options}]) + + """, + "DefaultAuthOptionsPlugin" to RuntimeType.defaultAuthPlugin(runtimeConfig), + "options" to actualAuthSchemes(operationShape, authSchemeOptions).join(", "), + ) + } + + private fun actualAuthSchemes(operationShape: OperationShape, authSchemeOptions: List): List { + val out: MutableList = mutableListOf() + + var noSupportedAuthSchemes = true + val authSchemes = ServiceIndex.of(codegenContext.model) + .getEffectiveAuthSchemes(codegenContext.serviceShape, operationShape) + + for (schemeShapeId in authSchemes.keys) { + val optionsForScheme = authSchemeOptions.filter { + when (it) { + is AuthSchemeOption.CustomResolver -> false + is AuthSchemeOption.StaticAuthSchemeOption -> { + it.schemeShapeId == schemeShapeId + } + } + } + + if (optionsForScheme.isNotEmpty()) { + out.addAll(optionsForScheme.flatMap { (it as AuthSchemeOption.StaticAuthSchemeOption).constructor }) + noSupportedAuthSchemes = false + } else { + logger.warning( + "No auth scheme implementation available for $schemeShapeId. " + + "The generated client will not attempt to use this auth scheme.", + ) + } + } + if (operationShape.hasTrait() || noSupportedAuthSchemes) { + val authOption = authSchemeOptions.find { + it is AuthSchemeOption.StaticAuthSchemeOption && it.schemeShapeId == noAuthSchemeShapeId + } + ?: throw IllegalStateException("Missing 'no auth' implementation. This is a codegen bug.") + out += (authOption as AuthSchemeOption.StaticAuthSchemeOption).constructor + } + if (out.any { it.isEmpty() }) { + PANIC("Got an empty auth scheme constructor. This is a bug. $out") + } + return out + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt new file mode 100644 index 00000000000..453568c8c57 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt @@ -0,0 +1,52 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators + +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.map +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator + +class ClientBuilderInstantiator(private val clientCodegenContext: ClientCodegenContext) : BuilderInstantiator { + override fun setField(builder: String, value: Writable, field: MemberShape): Writable { + return setFieldWithSetter(builder, value, field) + } + + /** + * For the client, we finalize builders with error correction enabled + */ + override fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable?): Writable = writable { + val correctErrors = clientCodegenContext.correctErrors(shape) + val builderW = writable { + when { + correctErrors != null -> rustTemplate("#{correctErrors}($builder)", "correctErrors" to correctErrors) + else -> rustTemplate(builder) + } + } + if (BuilderGenerator.hasFallibleBuilder(shape, clientCodegenContext.symbolProvider)) { + rustTemplate( + "#{builder}.build()#{mapErr}", + "builder" to builderW, + "mapErr" to ( + mapErr?.map { + rust(".map_err(#T)?", it) + } ?: writable { } + ), + ) + } else { + rustTemplate( + "#{builder}.build()", + "builder" to builderW, + ) + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt index 64f6d9446ba..c665144c23a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt @@ -10,6 +10,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.Visibility import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -75,12 +76,39 @@ data class InfallibleEnumType( ) } + override fun additionalEnumImpls(context: EnumGeneratorContext): Writable = writable { + // `try_parse` isn't needed for unnamed enums + if (context.enumTrait.hasNames()) { + rustTemplate( + """ + impl ${context.enumName} { + /// Parses the enum value while disallowing unknown variants. + /// + /// Unknown variants will result in an error. + pub fn try_parse(value: &str) -> #{Result} { + match Self::from(value) { + ##[allow(deprecated)] + Self::Unknown(_) => #{Err}(#{UnknownVariantError}::new(value)), + known => Ok(known), + } + } + } + """, + *preludeScope, + "UnknownVariantError" to unknownVariantError(), + ) + } + } + override fun additionalDocs(context: EnumGeneratorContext): Writable = writable { renderForwardCompatibilityNote(context.enumName, context.sortedMembers, UnknownVariant, UnknownVariantValue) } override fun additionalEnumMembers(context: EnumGeneratorContext): Writable = writable { docs("`$UnknownVariant` contains new variants that have been added since this code was generated.") + rust( + """##[deprecated(note = "Don't directly match on `$UnknownVariant`. See the docs on this enum for the correct way to handle unknown variants.")]""", + ) rust("$UnknownVariant(#T)", unknownVariantValue(context)) } @@ -93,10 +121,9 @@ data class InfallibleEnumType( docs( """ Opaque struct used as inner data for the `Unknown` variant defined in enums in - the crate + the crate. - While this is not intended to be used directly, it is marked as `pub` because it is - part of the enums that are public interface. + This is not intended to be used directly. """.trimIndent(), ) context.enumMeta.render(this) @@ -174,5 +201,35 @@ class ClientEnumGenerator(codegenContext: ClientCodegenContext, shape: StringSha codegenContext.model, codegenContext.symbolProvider, shape, - InfallibleEnumType(ClientRustModule.Primitives), + InfallibleEnumType( + RustModule.new( + "sealed_enum_unknown", + visibility = Visibility.PUBCRATE, + parent = ClientRustModule.primitives, + ), + ), ) + +private fun unknownVariantError(): RuntimeType = RuntimeType.forInlineFun("UnknownVariantError", ClientRustModule.Error) { + rustTemplate( + """ + /// The given enum value failed to parse since it is not a known value. + ##[derive(Debug)] + pub struct UnknownVariantError { + value: #{String}, + } + impl UnknownVariantError { + pub(crate) fn new(value: impl #{Into}<#{String}>) -> Self { + Self { value: value.into() } + } + } + impl ::std::fmt::Display for UnknownVariantError { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> #{Result}<(), ::std::fmt::Error> { + write!(f, "unknown enum variant: '{}'", self.value) + } + } + impl ::std::error::Error for UnknownVariantError {} + """, + *preludeScope, + ) +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt index a065fe3b96d..ca39264a1c0 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt @@ -5,7 +5,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators -import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.ObjectNode import software.amazon.smithy.model.shapes.MemberShape @@ -14,18 +13,12 @@ import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName -private fun enumFromStringFn(enumSymbol: Symbol, data: String): Writable = writable { - rust("#T::from($data)", enumSymbol) -} - class ClientBuilderKindBehavior(val codegenContext: CodegenContext) : Instantiator.BuilderKindBehavior { override fun hasFallibleBuilder(shape: StructureShape): Boolean = BuilderGenerator.hasFallibleBuilder(shape, codegenContext.symbolProvider) @@ -40,7 +33,6 @@ class ClientInstantiator(private val codegenContext: ClientCodegenContext) : Ins codegenContext.model, codegenContext.runtimeConfig, ClientBuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) { fun renderFluentCall( writer: RustWriter, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt index 408ff44390f..0951ce1d714 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt @@ -7,6 +7,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate @@ -16,42 +17,42 @@ class ClientRuntimeTypesReExportGenerator( private val rustCrate: RustCrate, ) { fun render() { - if (!codegenContext.smithyRuntimeMode.generateOrchestrator) { - return - } - val rc = codegenContext.runtimeConfig - val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(rc) + val smithyRuntimeApi = RuntimeType.smithyRuntimeApiClient(rc) rustCrate.withModule(ClientRustModule.config) { rustTemplate( """ pub use #{ConfigBag}; - pub use #{Interceptor}; + pub use #{RuntimeComponents}; + pub use #{IdentityCache}; """, "ConfigBag" to RuntimeType.configBag(rc), - "Interceptor" to RuntimeType.interceptor(rc), + "Intercept" to RuntimeType.intercept(rc), + "RuntimeComponents" to RuntimeType.runtimeComponents(rc), + "SharedInterceptor" to RuntimeType.sharedInterceptor(rc), + "IdentityCache" to RuntimeType.smithyRuntime(rc).resolve("client::identity::IdentityCache"), ) } - rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) { + rustCrate.withModule(ClientRustModule.Config.endpoint) { rustTemplate( """ - pub use #{ResolveEndpoint}; pub use #{SharedEndpointResolver}; + pub use #{EndpointFuture}; + pub use #{Endpoint}; """, - "ResolveEndpoint" to RuntimeType.smithyHttp(rc).resolve("endpoint::ResolveEndpoint"), - "SharedEndpointResolver" to RuntimeType.smithyHttp(rc).resolve("endpoint::SharedEndpointResolver"), + *Types(rc).toArray(), ) } rustCrate.withModule(ClientRustModule.Config.retry) { rustTemplate( """ pub use #{ClassifyRetry}; - pub use #{RetryReason}; + pub use #{RetryAction}; pub use #{ShouldAttempt}; """, - "ClassifyRetry" to smithyRuntimeApi.resolve("client::retries::ClassifyRetry"), - "RetryReason" to smithyRuntimeApi.resolve("client::retries::RetryReason"), + "ClassifyRetry" to smithyRuntimeApi.resolve("client::retries::classifiers::ClassifyRetry"), + "RetryAction" to smithyRuntimeApi.resolve("client::retries::classifiers::RetryAction"), "ShouldAttempt" to smithyRuntimeApi.resolve("client::retries::ShouldAttempt"), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt index edfe94af95b..1c92575ea42 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt @@ -19,16 +19,18 @@ class ConfigOverrideRuntimePluginGenerator( ) { private val moduleUseName = codegenContext.moduleUseName() private val codegenScope = codegenContext.runtimeConfig.let { rc -> - val runtimeApi = RuntimeType.smithyRuntimeApi(rc) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc) val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( *RuntimeType.preludeScope, + "Cow" to RuntimeType.Cow, "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), - "ConfigBagAccessors" to runtimeApi.resolve("client::config_bag_accessors::ConfigBagAccessors"), "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), "Layer" to smithyTypes.resolve("config_bag::Layer"), - "RuntimePlugin" to runtimeApi.resolve("client::runtime_plugin::RuntimePlugin"), + "Resolver" to RuntimeType.smithyRuntime(rc).resolve("client::config_override::Resolver"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), + "RuntimePlugin" to RuntimeType.runtimePlugin(rc), ) } @@ -41,31 +43,42 @@ class ConfigOverrideRuntimePluginGenerator( /// In the case of default values requested, they will be obtained from `client_config`. ##[derive(Debug)] pub(crate) struct ConfigOverrideRuntimePlugin { - pub(crate) config_override: Builder, - pub(crate) client_config: #{FrozenLayer}, + pub(crate) config: #{FrozenLayer}, + pub(crate) components: #{RuntimeComponentsBuilder}, } - impl #{RuntimePlugin} for ConfigOverrideRuntimePlugin { - fn config(&self) -> #{Option}<#{FrozenLayer}> { - use #{ConfigBagAccessors}; - + impl ConfigOverrideRuntimePlugin { + ##[allow(dead_code)] // unused when a service does not provide any operations + pub(crate) fn new( + config_override: Builder, + initial_config: #{FrozenLayer}, + initial_components: &#{RuntimeComponentsBuilder} + ) -> Self { + let mut layer = config_override.config; + let mut components = config_override.runtime_components; ##[allow(unused_mut)] - let layer: #{Layer} = self - .config_override - .inner - .clone() - .into(); - let mut layer = layer.with_name("$moduleUseName::config::ConfigOverrideRuntimePlugin"); + let mut resolver = #{Resolver}::overrid(initial_config, initial_components, &mut layer, &mut components); + #{config} - #{Some}(layer.freeze()) + let _ = resolver; + Self { + config: #{Layer}::from(layer) + .with_name("$moduleUseName::config::ConfigOverrideRuntimePlugin").freeze(), + components, + } } + } - fn interceptors(&self, _interceptors: &mut #{InterceptorRegistrar}) { - #{interceptors} + impl #{RuntimePlugin} for ConfigOverrideRuntimePlugin { + fn config(&self) -> #{Option}<#{FrozenLayer}> { + Some(self.config.clone()) } - } + fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + #{Cow}::Borrowed(&self.components) + } + } """, *codegenScope, "config" to writable { @@ -74,9 +87,6 @@ class ConfigOverrideRuntimePluginGenerator( ServiceConfig.OperationConfigOverride("layer"), ) }, - "interceptors" to writable { - writeCustomizations(customizations, ServiceConfig.RuntimePluginInterceptors("_interceptors", "self.config_override")) - }, ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt index 1741a080354..fe373a13bb4 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.traits.EndpointTrait -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.smithy.generators.http.rustFormatString import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -17,7 +16,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider -import software.amazon.smithy.rust.codegen.core.smithy.generators.OperationBuildError import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -48,7 +46,6 @@ class EndpointTraitBindings( fun render( writer: RustWriter, input: String, - smithyRuntimeMode: SmithyRuntimeMode, generateValidation: Boolean = true, ) { // the Rust format pattern to make the endpoint prefix e.g. "{}.foo" @@ -74,27 +71,17 @@ class EndpointTraitBindings( rust("let $field = &$input.$field;") } if (generateValidation) { - val contents = if (smithyRuntimeMode.generateOrchestrator) { - // TODO(enableNewSmithyRuntimeCleanup): Remove the allow attribute once all places need .into method + val errorString = "$field was unset or empty but must be set as part of the endpoint prefix" + val contents = """ if $field.is_empty() { - ##[allow(clippy::useless_conversion)] - return Err(#{invalidFieldError:W}.into()) + return Err(#{InvalidEndpointError}::failed_to_construct_uri("$errorString").into()); } """ - } else { - """ - if $field.is_empty() { - return Err(#{invalidFieldError:W}) - } - """ - } rustTemplate( contents, - "invalidFieldError" to OperationBuildError(runtimeConfig).invalidField( - field, - "$field was unset or empty but must be set as part of the endpoint prefix", - ), + "InvalidEndpointError" to RuntimeType.smithyHttp(runtimeConfig) + .resolve("endpoint::error::InvalidEndpointError"), ) } "${label.content} = $field" diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt new file mode 100644 index 00000000000..b05c0143836 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt @@ -0,0 +1,122 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators + +import software.amazon.smithy.model.node.Node +import software.amazon.smithy.model.shapes.BlobShape +import software.amazon.smithy.model.shapes.BooleanShape +import software.amazon.smithy.model.shapes.DocumentShape +import software.amazon.smithy.model.shapes.EnumShape +import software.amazon.smithy.model.shapes.ListShape +import software.amazon.smithy.model.shapes.MapShape +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.NumberShape +import software.amazon.smithy.model.shapes.StringShape +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.shapes.TimestampShape +import software.amazon.smithy.model.shapes.UnionShape +import software.amazon.smithy.model.traits.EnumTrait +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.core.rustlang.RustModule +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.isEmpty +import software.amazon.smithy.rust.codegen.core.rustlang.map +import software.amazon.smithy.rust.codegen.core.rustlang.plus +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.some +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.PrimitiveInstantiator +import software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed +import software.amazon.smithy.rust.codegen.core.smithy.protocols.shapeFunctionName +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.isEventStream +import software.amazon.smithy.rust.codegen.core.util.isStreaming +import software.amazon.smithy.rust.codegen.core.util.letIf + +/** + * For AWS-services, the spec defines error correction semantics to recover from missing default values for required members: + * https://smithy.io/2.0/spec/aggregate-types.html?highlight=error%20correction#client-error-correction + */ + +private fun ClientCodegenContext.errorCorrectedDefault(member: MemberShape): Writable? { + if (!member.isRequired) { + return null + } + val target = model.expectShape(member.target) + val memberSymbol = symbolProvider.toSymbol(member) + val targetSymbol = symbolProvider.toSymbol(target) + if (member.isEventStream(model) || member.isStreaming(model)) { + return null + } + val instantiator = PrimitiveInstantiator(runtimeConfig, symbolProvider) + return writable { + when { + target is EnumShape || target.hasTrait() -> rustTemplate( + """"no value was set".parse::<#{Shape}>().ok()""", + "Shape" to targetSymbol, + ) + + target is BooleanShape || target is NumberShape || target is StringShape || target is DocumentShape || target is ListShape || target is MapShape -> rust( + "Some(Default::default())", + ) + + target is StructureShape -> rustTemplate( + "{ let builder = #{Builder}::default(); #{instantiate} }", + "Builder" to symbolProvider.symbolForBuilder(target), + "instantiate" to builderInstantiator().finalizeBuilder("builder", target).map { + if (BuilderGenerator.hasFallibleBuilder(target, symbolProvider)) { + rust("#T.ok()", it) + } else { + it.some()(this) + } + }.letIf(memberSymbol.isRustBoxed()) { + it.plus { rustTemplate(".map(#{Box}::new)", *preludeScope) } + }, + ) + + target is TimestampShape -> instantiator.instantiate(target, Node.from(0)).some()(this) + target is BlobShape -> instantiator.instantiate(target, Node.from("")).some()(this) + target is UnionShape -> rust("Some(#T::Unknown)", targetSymbol) + } + } +} + +fun ClientCodegenContext.correctErrors(shape: StructureShape): RuntimeType? { + val name = symbolProvider.shapeFunctionName(serviceShape, shape) + "_correct_errors" + val corrections = writable { + shape.members().forEach { member -> + val memberName = symbolProvider.toMemberName(member) + errorCorrectedDefault(member)?.also { default -> + rustTemplate( + """if builder.$memberName.is_none() { builder.$memberName = #{default} }""", + "default" to default, + ) + } + } + } + + if (corrections.isEmpty()) { + return null + } + + return RuntimeType.forInlineFun(name, RustModule.private("serde_util")) { + rustTemplate( + """ + pub(crate) fn $name(mut builder: #{Builder}) -> #{Builder} { + #{corrections} + builder + } + + """, + "Builder" to symbolProvider.symbolForBuilder(shape), + "corrections" to corrections, + ) + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt index 87fead7142f..176b85b1c8f 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt @@ -6,15 +6,12 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section -import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol sealed class OperationSection(name: String) : Section(name) { abstract val customizations: List @@ -23,55 +20,11 @@ sealed class OperationSection(name: String) : Section(name) { data class OperationImplBlock(override val customizations: List) : OperationSection("OperationImplBlock") - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization hook when cleaning up middleware - /** Write additional functions inside the Input's impl block */ - @Deprecated("customization for middleware; won't be used in the orchestrator impl") - data class InputImpl( - override val customizations: List, - val operationShape: OperationShape, - val inputShape: StructureShape, - val protocol: Protocol, - ) : OperationSection("InputImpl") - - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization hook when cleaning up middleware - @Deprecated("customization for middleware; won't be used in the orchestrator impl") - data class MutateInput( - override val customizations: List, - val input: String, - val config: String, - ) : OperationSection("MutateInput") - - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization hook when cleaning up middleware - /** Write custom code into the block that builds an operation - * - * [request]: Name of the variable holding the `aws_smithy_http::Request` - * [config]: Name of the variable holding the service config. - * - * */ - @Deprecated("customization for middleware; won't be used in the orchestrator impl") - data class MutateRequest( - override val customizations: List, - val request: String, - val config: String, - ) : OperationSection("Feature") - - // TODO(enableNewSmithyRuntimeCleanup): Delete this customization hook when cleaning up middleware - @Deprecated("customization for middleware; won't be used in the orchestrator impl") - data class FinalizeOperation( - override val customizations: List, - val operation: String, - val config: String, - ) : OperationSection("Finalize") - data class MutateOutput( override val customizations: List, val operationShape: OperationShape, /** Name of the response headers map (for referring to it in Rust code) */ val responseHeadersName: String, - - // TODO(enableNewSmithyRuntimeCleanup): Remove this flag when switching to the orchestrator - /** Whether the property bag exists in this context */ - val propertyBagAvailable: Boolean, ) : OperationSection("MutateOutput") /** @@ -94,6 +47,14 @@ sealed class OperationSection(name: String) : Section(name) { data class BeforeParseResponse( override val customizations: List, val responseName: String, + /** + * Name of the `force_error` variable. Set this to true to trigger error parsing. + */ + val forceError: String, + /** + * When set, the name of the response body data field + */ + val body: String?, ) : OperationSection("BeforeParseResponse") /** @@ -107,36 +68,16 @@ sealed class OperationSection(name: String) : Section(name) { data class AdditionalInterceptors( override val customizations: List, - val interceptorRegistrarName: String, val operationShape: OperationShape, ) : OperationSection("AdditionalInterceptors") { fun registerInterceptor(runtimeConfig: RuntimeConfig, writer: RustWriter, interceptor: Writable) { - val smithyRuntimeApi = RuntimeType.smithyRuntimeApi(runtimeConfig) writer.rustTemplate( - """ - $interceptorRegistrarName.register(#{SharedInterceptor}::new(#{interceptor}) as _); - """, + ".with_interceptor(#{interceptor})", "interceptor" to interceptor, - "SharedInterceptor" to smithyRuntimeApi.resolve("client::interceptors::SharedInterceptor"), ) } } - /** - * Hook for adding retry classifiers to an operation's `RetryClassifiers` bundle. - * - * Should emit 1+ lines of code that look like the following: - * ```rust - * .with_classifier(AwsErrorCodeClassifier::new()) - * .with_classifier(HttpStatusCodeClassifier::new()) - * ``` - */ - data class RetryClassifier( - override val customizations: List, - val configBagName: String, - val operationShape: OperationShape, - ) : OperationSection("RetryClassifier") - /** * Hook for adding supporting types for operation-specific runtime plugins. * Examples include various operation-specific types (retry classifiers, config bag types, etc.) @@ -154,35 +95,23 @@ sealed class OperationSection(name: String) : Section(name) { override val customizations: List, val operationShape: OperationShape, ) : OperationSection("AdditionalRuntimePlugins") { - fun addServiceRuntimePlugin(writer: RustWriter, plugin: Writable) { - writer.rustTemplate(".with_service_plugin(#{plugin})", "plugin" to plugin) + fun addClientPlugin(writer: RustWriter, plugin: Writable) { + writer.rustTemplate(".with_client_plugin(#{plugin})", "plugin" to plugin) } fun addOperationRuntimePlugin(writer: RustWriter, plugin: Writable) { writer.rustTemplate(".with_operation_plugin(#{plugin})", "plugin" to plugin) } } -} - -abstract class OperationCustomization : NamedCustomization() { - // TODO(enableNewSmithyRuntimeCleanup): Delete this when cleaning up middleware - @Deprecated("property for middleware; won't be used in the orchestrator impl") - open fun retryType(): RuntimeType? = null - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when cleaning up middleware - /** - * Does `make_operation` consume the self parameter? - * - * This is required for things like idempotency tokens where the operation can only be sent once - * and an idempotency token will mutate the request. - */ - @Deprecated("property for middleware; won't be used in the orchestrator impl") - open fun consumesSelf(): Boolean = false - // TODO(enableNewSmithyRuntimeCleanup): Delete this when cleaning up middleware - /** - * Does `make_operation` mutate the self parameter? - */ - @Deprecated("property for middleware; won't be used in the orchestrator impl") - open fun mutSelf(): Boolean = false + data class RetryClassifiers( + override val customizations: List, + val operationShape: OperationShape, + ) : OperationSection("RetryClassifiers") { + fun registerRetryClassifier(writer: RustWriter, classifier: Writable) { + writer.rustTemplate(".with_retry_classifier(#{classifier})", "classifier" to classifier) + } + } } + +abstract class OperationCustomization : NamedCustomization() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt index a0087b3d2a3..f96534ed9db 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt @@ -7,17 +7,18 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption +import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsInterceptorGenerator -import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.MakeOperationGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.RequestSerializerGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ResponseDeserializerGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.HttpBoundProtocolTraitImplGenerator +import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientHttpBoundProtocolPayloadGenerator import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.implBlock +import software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate @@ -35,15 +36,9 @@ import software.amazon.smithy.rust.codegen.core.util.sdkId open class OperationGenerator( private val codegenContext: ClientCodegenContext, private val protocol: Protocol, - /** - * Operations generate a `make_operation(&config)` method to build a `aws_smithy_http::Operation` that can be dispatched - * This is the serializer side of request dispatch - */ - // TODO(enableNewSmithyRuntimeCleanup): Remove the `makeOperationGenerator` - private val makeOperationGenerator: MakeOperationGenerator, - private val bodyGenerator: ProtocolPayloadGenerator, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `traitGenerator` - private val traitGenerator: HttpBoundProtocolTraitImplGenerator, + private val bodyGenerator: ProtocolPayloadGenerator = ClientHttpBoundProtocolPayloadGenerator( + codegenContext, protocol, + ), ) { private val model = codegenContext.model private val runtimeConfig = codegenContext.runtimeConfig @@ -54,25 +49,11 @@ open class OperationGenerator( */ fun renderOperation( operationWriter: RustWriter, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `inputWriter` since `make_operation` generation is going away - inputWriter: RustWriter, operationShape: OperationShape, codegenDecorator: ClientCodegenDecorator, ) { - val operationCustomizations = codegenDecorator.operationCustomizations(codegenContext, operationShape, emptyList()) - val inputShape = operationShape.inputShape(model) - - // impl OperationInputShape { ... } - inputWriter.implBlock(symbolProvider.toSymbol(inputShape)) { - writeCustomizations( - operationCustomizations, - OperationSection.InputImpl(operationCustomizations, operationShape, inputShape, protocol), - ) - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - makeOperationGenerator.generateMakeOperation(this, operationShape, operationCustomizations) - } - } - + val operationCustomizations = + codegenDecorator.operationCustomizations(codegenContext, operationShape, emptyList()) renderOperationStruct( operationWriter, operationShape, @@ -84,7 +65,7 @@ open class OperationGenerator( private fun renderOperationStruct( operationWriter: RustWriter, operationShape: OperationShape, - authOptions: List, + authSchemeOptions: List, operationCustomizations: List, ) { val operationName = symbolProvider.toSymbol(operationShape).name @@ -97,10 +78,9 @@ open class OperationGenerator( ) Attribute(derive(RuntimeType.Clone, RuntimeType.Default, RuntimeType.Debug)).render(operationWriter) Attribute.NonExhaustive.render(operationWriter) - Attribute.DocHidden.render(operationWriter) operationWriter.rust("pub struct $operationName;") operationWriter.implBlock(symbolProvider.toSymbol(operationShape)) { - Attribute.DocHidden.render(operationWriter) + docs("Creates a new `$operationName`") rustBlock("pub fn new() -> Self") { rust("Self") } @@ -110,106 +90,118 @@ open class OperationGenerator( val codegenScope = arrayOf( *preludeScope, "Arc" to RuntimeType.Arc, - "Input" to symbolProvider.toSymbol(operationShape.inputShape(model)), + "ConcreteInput" to symbolProvider.toSymbol(operationShape.inputShape(model)), + "Input" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::Input"), "Operation" to symbolProvider.toSymbol(operationShape), "OperationError" to errorType, "OperationOutput" to outputType, - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) + .resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), ) - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { + val additionalPlugins = writable { + writeCustomizations( + operationCustomizations, + OperationSection.AdditionalRuntimePlugins(operationCustomizations, operationShape), + ) rustTemplate( - """ - pub(crate) async fn orchestrate( - runtime_plugins: &#{RuntimePlugins}, - input: #{Input}, - ) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { - let map_err = |err: #{SdkError}<#{Error}, #{HttpResponse}>| { - err.map_service_error(|err| { - #{TypedBox}::<#{OperationError}>::assume_from(err.into()) - .expect("correct error type") - .unwrap() - }) - }; - let context = Self::orchestrate_with_stop_point(runtime_plugins, input, #{StopPoint}::None) - .await - .map_err(map_err)?; - let output = context.finalize().map_err(map_err)?; - #{Ok}(#{TypedBox}::<#{OperationOutput}>::assume_from(output).expect("correct output type").unwrap()) - } - - pub(crate) async fn orchestrate_with_stop_point( - runtime_plugins: &#{RuntimePlugins}, - input: #{Input}, - stop_point: #{StopPoint}, - ) -> #{Result}<#{InterceptorContext}, #{SdkError}<#{Error}, #{HttpResponse}>> { - let input = #{TypedBox}::new(input).erase(); - #{invoke_with_stop_point}( - ${codegenContext.serviceShape.sdkId().dq()}, - ${operationName.dq()}, - input, - runtime_plugins, - stop_point - ).await - } - - pub(crate) fn operation_runtime_plugins( - client_runtime_plugins: #{RuntimePlugins}, - client_config: &crate::config::Config, - config_override: #{Option}, - ) -> #{RuntimePlugins} { - let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new()); - if let Some(config_override) = config_override { - runtime_plugins = runtime_plugins.with_operation_plugin(crate::config::ConfigOverrideRuntimePlugin { - config_override, - client_config: #{RuntimePlugin}::config(client_config).expect("frozen layer should exist in client config"), - }) + ".with_client_plugin(#{auth_plugin})", + "auth_plugin" to AuthOptionsPluginGenerator(codegenContext).authPlugin( + operationShape, + authSchemeOptions, + ), + ) + } + rustTemplate( + """ + pub(crate) async fn orchestrate( + runtime_plugins: &#{RuntimePlugins}, + input: #{ConcreteInput}, + ) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { + let map_err = |err: #{SdkError}<#{Error}, #{HttpResponse}>| { + err.map_service_error(|err| { + err.downcast::<#{OperationError}>().expect("correct error type") + }) + }; + let context = Self::orchestrate_with_stop_point(runtime_plugins, input, #{StopPoint}::None) + .await + .map_err(map_err)?; + let output = context.finalize().map_err(map_err)?; + #{Ok}(output.downcast::<#{OperationOutput}>().expect("correct output type")) + } + + pub(crate) async fn orchestrate_with_stop_point( + runtime_plugins: &#{RuntimePlugins}, + input: #{ConcreteInput}, + stop_point: #{StopPoint}, + ) -> #{Result}<#{InterceptorContext}, #{SdkError}<#{Error}, #{HttpResponse}>> { + let input = #{Input}::erase(input); + #{invoke_with_stop_point}( + ${codegenContext.serviceShape.sdkId().dq()}, + ${operationName.dq()}, + input, + runtime_plugins, + stop_point + ).await + } + + pub(crate) fn operation_runtime_plugins( + client_runtime_plugins: #{RuntimePlugins}, + client_config: &crate::config::Config, + config_override: #{Option}, + ) -> #{RuntimePlugins} { + let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new()); + #{additional_runtime_plugins} + if let #{Some}(config_override) = config_override { + for plugin in config_override.runtime_plugins.iter().cloned() { + runtime_plugins = runtime_plugins.with_operation_plugin(plugin); } - runtime_plugins - #{additional_runtime_plugins} + runtime_plugins = runtime_plugins.with_operation_plugin( + crate::config::ConfigOverrideRuntimePlugin::new(config_override, client_config.config.clone(), &client_config.runtime_components) + ); } - """, - *codegenScope, - "Error" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Error"), - "TypedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypedBox"), - "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), - "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::error::OrchestratorError"), - "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "StopPoint" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::StopPoint"), - "invoke_with_stop_point" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::invoke_with_stop_point"), - "additional_runtime_plugins" to writable { - writeCustomizations( - operationCustomizations, - OperationSection.AdditionalRuntimePlugins(operationCustomizations, operationShape), + runtime_plugins + } + """, + *codegenScope, + "Error" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::Error"), + "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), + "OrchestratorError" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) + .resolve("client::orchestrator::error::OrchestratorError"), + "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), + "StopPoint" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::orchestrator::StopPoint"), + "invoke_with_stop_point" to RuntimeType.smithyRuntime(runtimeConfig) + .resolve("client::orchestrator::invoke_with_stop_point"), + "additional_runtime_plugins" to writable { + if (additionalPlugins.isNotEmpty()) { + rustTemplate( + """ + runtime_plugins = runtime_plugins + #{additional_runtime_plugins}; + """, + "additional_runtime_plugins" to additionalPlugins, ) - }, - ) - } + } + }, + ) writeCustomizations(operationCustomizations, OperationSection.OperationImplBlock(operationCustomizations)) } - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - traitGenerator.generateTraitImpls(operationWriter, operationShape, operationCustomizations) - } - - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - OperationRuntimePluginGenerator(codegenContext).render( - operationWriter, - operationShape, - operationName, - authOptions, - operationCustomizations, - ) + OperationRuntimePluginGenerator(codegenContext).render( + operationWriter, + operationShape, + operationName, + operationCustomizations, + ) - ResponseDeserializerGenerator(codegenContext, protocol) - .render(operationWriter, operationShape, operationCustomizations) - RequestSerializerGenerator(codegenContext, protocol, bodyGenerator) - .render(operationWriter, operationShape) + ResponseDeserializerGenerator(codegenContext, protocol) + .render(operationWriter, operationShape, operationCustomizations) + RequestSerializerGenerator(codegenContext, protocol, bodyGenerator) + .render(operationWriter, operationShape) - EndpointParamsInterceptorGenerator(codegenContext) - .render(operationWriter, operationShape) - } + EndpointParamsInterceptorGenerator(codegenContext) + .render(operationWriter, operationShape) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt index febdb958256..4d4d32a8dd2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt @@ -5,23 +5,15 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators -import software.amazon.smithy.model.knowledge.ServiceIndex import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.traits.OptionalAuthTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.customizations.noAuthSchemeShapeId -import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthOption import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.hasTrait -import java.util.logging.Logger /** * Generates operation-level runtime plugins @@ -29,25 +21,26 @@ import java.util.logging.Logger class OperationRuntimePluginGenerator( private val codegenContext: ClientCodegenContext, ) { - private val logger: Logger = Logger.getLogger(javaClass.name) private val codegenScope = codegenContext.runtimeConfig.let { rc -> - val runtimeApi = RuntimeType.smithyRuntimeApi(rc) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc) val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( - "AuthOptionResolverParams" to runtimeApi.resolve("client::auth::AuthOptionResolverParams"), + *preludeScope, + "AuthSchemeOptionResolverParams" to runtimeApi.resolve("client::auth::AuthSchemeOptionResolverParams"), "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(codegenContext.runtimeConfig), - "DynAuthOptionResolver" to runtimeApi.resolve("client::auth::DynAuthOptionResolver"), - "DynResponseDeserializer" to runtimeApi.resolve("client::orchestrator::DynResponseDeserializer"), + "Cow" to RuntimeType.Cow, "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), - "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), + "IntoShared" to runtimeApi.resolve("shared::IntoShared"), "Layer" to smithyTypes.resolve("config_bag::Layer"), "RetryClassifiers" to runtimeApi.resolve("client::retries::RetryClassifiers"), - "RuntimePlugin" to runtimeApi.resolve("client::runtime_plugin::RuntimePlugin"), - "SharedRequestSerializer" to runtimeApi.resolve("client::orchestrator::SharedRequestSerializer"), - "StaticAuthOptionResolver" to runtimeApi.resolve("client::auth::option_resolver::StaticAuthOptionResolver"), - "StaticAuthOptionResolverParams" to runtimeApi.resolve("client::auth::option_resolver::StaticAuthOptionResolverParams"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(codegenContext.runtimeConfig), + "RuntimePlugin" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig), + "SharedAuthSchemeOptionResolver" to runtimeApi.resolve("client::auth::SharedAuthSchemeOptionResolver"), + "SharedRequestSerializer" to runtimeApi.resolve("client::ser_de::SharedRequestSerializer"), + "SharedResponseDeserializer" to runtimeApi.resolve("client::ser_de::SharedResponseDeserializer"), + "StaticAuthSchemeOptionResolver" to runtimeApi.resolve("client::auth::static_resolver::StaticAuthSchemeOptionResolver"), + "StaticAuthSchemeOptionResolverParams" to runtimeApi.resolve("client::auth::static_resolver::StaticAuthSchemeOptionResolverParams"), ) } @@ -55,35 +48,33 @@ class OperationRuntimePluginGenerator( writer: RustWriter, operationShape: OperationShape, operationStructName: String, - authOptions: List, customizations: List, ) { + val layerName = operationShape.id.name.dq() writer.rustTemplate( """ impl #{RuntimePlugin} for $operationStructName { fn config(&self) -> #{Option}<#{FrozenLayer}> { - let mut cfg = #{Layer}::new(${operationShape.id.name.dq()}); - use #{ConfigBagAccessors} as _; - - cfg.set_request_serializer(#{SharedRequestSerializer}::new(${operationStructName}RequestSerializer)); - cfg.set_response_deserializer(#{DynResponseDeserializer}::new(${operationStructName}ResponseDeserializer)); + let mut cfg = #{Layer}::new($layerName); - // Retry classifiers are operation-specific because they need to downcast operation-specific error types. - let retry_classifiers = #{RetryClassifiers}::new() - #{retry_classifier_customizations}; - cfg.set_retry_classifiers(retry_classifiers); + cfg.store_put(#{SharedRequestSerializer}::new(${operationStructName}RequestSerializer)); + cfg.store_put(#{SharedResponseDeserializer}::new(${operationStructName}ResponseDeserializer)); ${"" /* TODO(IdentityAndAuth): Resolve auth parameters from input for services that need this */} - cfg.set_auth_option_resolver_params(#{AuthOptionResolverParams}::new(#{StaticAuthOptionResolverParams}::new())); + cfg.store_put(#{AuthSchemeOptionResolverParams}::new(#{StaticAuthSchemeOptionResolverParams}::new())); - #{auth_options} #{additional_config} - Some(cfg.freeze()) + #{Some}(cfg.freeze()) } - fn interceptors(&self, _interceptors: &mut #{InterceptorRegistrar}) { - #{interceptors} + fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + ##[allow(unused_mut)] + let mut rcb = #{RuntimeComponentsBuilder}::new($layerName) + #{interceptors} + #{retry_classifiers}; + + #{Cow}::Owned(rcb) } } @@ -91,7 +82,6 @@ class OperationRuntimePluginGenerator( """, *codegenScope, *preludeScope, - "auth_options" to generateAuthOptions(operationShape, authOptions), "additional_config" to writable { writeCustomizations( customizations, @@ -102,64 +92,24 @@ class OperationRuntimePluginGenerator( ), ) }, - "retry_classifier_customizations" to writable { + "runtime_plugin_supporting_types" to writable { writeCustomizations( customizations, - OperationSection.RetryClassifier(customizations, "cfg", operationShape), + OperationSection.RuntimePluginSupportingTypes(customizations, "cfg", operationShape), ) }, - "runtime_plugin_supporting_types" to writable { + "interceptors" to writable { writeCustomizations( customizations, - OperationSection.RuntimePluginSupportingTypes(customizations, "cfg", operationShape), + OperationSection.AdditionalInterceptors(customizations, operationShape), ) }, - "interceptors" to writable { + "retry_classifiers" to writable { writeCustomizations( customizations, - OperationSection.AdditionalInterceptors(customizations, "_interceptors", operationShape), + OperationSection.RetryClassifiers(customizations, operationShape), ) }, ) } - - private fun generateAuthOptions( - operationShape: OperationShape, - authOptions: List, - ): Writable = writable { - if (authOptions.any { it is AuthOption.CustomResolver }) { - throw IllegalStateException("AuthOption.CustomResolver is unimplemented") - } else { - val authOptionsMap = authOptions.associate { - val option = it as AuthOption.StaticAuthOption - option.schemeShapeId to option - } - withBlockTemplate( - "cfg.set_auth_option_resolver(#{DynAuthOptionResolver}::new(#{StaticAuthOptionResolver}::new(vec![", - "])));", - *codegenScope, - ) { - var noSupportedAuthSchemes = true - val authSchemes = ServiceIndex.of(codegenContext.model) - .getEffectiveAuthSchemes(codegenContext.serviceShape, operationShape) - for (schemeShapeId in authSchemes.keys) { - val authOption = authOptionsMap[schemeShapeId] - if (authOption != null) { - authOption.constructor(this) - noSupportedAuthSchemes = false - } else { - logger.warning( - "No auth scheme implementation available for $schemeShapeId. " + - "The generated client will not attempt to use this auth scheme.", - ) - } - } - if (operationShape.hasTrait() || noSupportedAuthSchemes) { - val authOption = authOptionsMap[noAuthSchemeShapeId] - ?: throw IllegalStateException("Missing 'no auth' implementation. This is a codegen bug.") - authOption.constructor(this) - } - } - } - } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt index 3f86fe720d3..c9c342a2a31 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt @@ -11,7 +11,6 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.traits.IdempotencyTokenTrait import software.amazon.smithy.model.traits.PaginatedTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerics import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustType import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -30,7 +29,7 @@ import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.outputShape import software.amazon.smithy.rust.codegen.core.util.toPascalCase -// TODO(https://github.com/awslabs/smithy-rs/issues/1013) Support pagination when the idempotency trait is present +// TODO(https://github.com/smithy-lang/smithy-rs/issues/1013) Support pagination when the idempotency trait is present fun OperationShape.isPaginated(model: Model) = hasTrait() && inputShape(model) .findMemberWithTrait(model) == null @@ -38,23 +37,14 @@ fun OperationShape.isPaginated(model: Model) = class PaginatorGenerator private constructor( private val codegenContext: ClientCodegenContext, operation: OperationShape, - private val generics: FluentClientGenerics, - retryClassifier: RuntimeType, ) { companion object { fun paginatorType( codegenContext: ClientCodegenContext, - generics: FluentClientGenerics, operationShape: OperationShape, - retryClassifier: RuntimeType, ): RuntimeType? { return if (operationShape.isPaginated(codegenContext.model)) { - PaginatorGenerator( - codegenContext, - operationShape, - generics, - retryClassifier, - ).paginatorType() + PaginatorGenerator(codegenContext, operationShape).paginatorType() } else { null } @@ -87,15 +77,7 @@ class PaginatorGenerator private constructor( private val codegenScope = arrayOf( *preludeScope, - "generics" to generics.decl, - "bounds" to generics.bounds, "page_size_setter" to pageSizeSetter(), - "send_bounds" to generics.sendBounds( - symbolProvider.toSymbol(operation), - outputType, - errorType, - retryClassifier, - ), // Operation Types "operation" to symbolProvider.toSymbol(operation), @@ -105,10 +87,9 @@ class PaginatorGenerator private constructor( "Builder" to symbolProvider.symbolForBuilder(operation.inputShape(model)), // SDK Types - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse"), + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), - "client" to RuntimeType.smithyClient(runtimeConfig), - "fn_stream" to RuntimeType.smithyAsync(runtimeConfig).resolve("future::fn_stream"), + "pagination_stream" to RuntimeType.smithyAsync(runtimeConfig).resolve("future::pagination_stream"), // External Types "Stream" to RuntimeType.TokioStream.resolve("Stream"), @@ -125,15 +106,15 @@ class PaginatorGenerator private constructor( rustTemplate( """ /// Paginator for #{operation:D} - pub struct $paginatorName#{generics:W} { - handle: std::sync::Arc, + pub struct $paginatorName { + handle: std::sync::Arc, builder: #{Builder}, stop_on_duplicate_token: bool, } - impl${generics.inst} ${paginatorName}${generics.inst} #{bounds:W} { + impl $paginatorName { /// Create a new paginator-wrapper - pub(crate) fn new(handle: std::sync::Arc, builder: #{Builder}) -> Self { + pub(crate) fn new(handle: std::sync::Arc, builder: #{Builder}) -> Self { Self { handle, builder, @@ -159,14 +140,14 @@ class PaginatorGenerator private constructor( /// Create the pagination stream /// - /// _Note:_ No requests will be dispatched until the stream is used (eg. with [`.next().await`](tokio_stream::StreamExt::next)). - pub fn send(self) -> impl #{Stream} + #{Unpin} - #{send_bounds:W} { + /// _Note:_ No requests will be dispatched until the stream is used + /// (e.g. with the [`.next().await`](aws_smithy_async::future::pagination_stream::PaginationStream::next) method). + pub fn send(self) -> #{pagination_stream}::PaginationStream<#{item_type}> { // Move individual fields out of self for the borrow checker let builder = self.builder; let handle = self.handle; #{runtime_plugin_init} - #{fn_stream}::FnStream::new(move |tx| #{Box}::pin(async move { + #{pagination_stream}::PaginationStream::new(#{pagination_stream}::fn_stream::FnStream::new(move |tx| #{Box}::pin(async move { // Build the input for the first time. If required fields are missing, this is where we'll produce an early error. let mut input = match builder.build().map_err(#{SdkError}::construction_failure) { #{Ok}(input) => input, @@ -196,7 +177,7 @@ class PaginatorGenerator private constructor( return } } - })) + }))) } } """, @@ -204,52 +185,26 @@ class PaginatorGenerator private constructor( "items_fn" to itemsFn(), "output_token" to outputTokenLens, "item_type" to writable { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rustTemplate("#{Result}<#{Output}, #{SdkError}<#{Error}>>", *codegenScope) - } else { - rustTemplate("#{Result}<#{Output}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) - } + rustTemplate("#{Result}<#{Output}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) }, "orchestrate" to writable { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rustTemplate( - """ - { - let op = match input.make_operation(&handle.conf) - .await - .map_err(#{SdkError}::construction_failure) { - #{Ok}(op) => op, - #{Err}(e) => { - let _ = tx.send(#{Err}(e)).await; - return; - } - }; - handle.client.call(op).await - } - """, - *codegenScope, - ) - } else { - rustTemplate( - "#{operation}::orchestrate(&runtime_plugins, input.clone()).await", - *codegenScope, - ) - } + rustTemplate( + "#{operation}::orchestrate(&runtime_plugins, input.clone()).await", + *codegenScope, + ) }, "runtime_plugin_init" to writable { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - rustTemplate( - """ - let runtime_plugins = #{operation}::operation_runtime_plugins( - handle.runtime_plugins.clone(), - &handle.conf, - #{None}, - ); - """, - *codegenScope, - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - ) - } + rustTemplate( + """ + let runtime_plugins = #{operation}::operation_runtime_plugins( + handle.runtime_plugins.clone(), + &handle.conf, + #{None}, + ); + """, + *codegenScope, + "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), + ) }, ) } @@ -278,7 +233,7 @@ class PaginatorGenerator private constructor( /// /// This paginator automatically flattens results using `$documentedPath`. Queries to the underlying service /// are dispatched lazily. - pub fn items(self) -> #{ItemPaginator}${generics.inst} { + pub fn items(self) -> #{ItemPaginator} { #{ItemPaginator}(self) } """, @@ -297,17 +252,17 @@ class PaginatorGenerator private constructor( /// Flattened paginator for `$paginatorName` /// /// This is created with [`.items()`]($paginatorName::items) - pub struct ${paginatorName}Items#{generics:W}($paginatorName${generics.inst}); + pub struct ${paginatorName}Items($paginatorName); - impl ${generics.inst} ${paginatorName}Items${generics.inst} #{bounds:W} { + impl ${paginatorName}Items { /// Create the pagination stream /// - /// _Note: No requests will be dispatched until the stream is used (eg. with [`.next().await`](tokio_stream::StreamExt::next))._ + /// _Note_: No requests will be dispatched until the stream is used + /// (e.g. with the [`.next().await`](aws_smithy_async::future::pagination_stream::PaginationStream::next) method). /// - /// To read the entirety of the paginator, use [`.collect::, _>()`](tokio_stream::StreamExt::collect). - pub fn send(self) -> impl #{Stream} + #{Unpin} - #{send_bounds:W} { - #{fn_stream}::TryFlatMap::new(self.0.send()).flat_map(|page| #{extract_items}(page).unwrap_or_default().into_iter()) + /// To read the entirety of the paginator, use [`.collect::, _>()`](aws_smithy_async::future::pagination_stream::PaginationStream::collect). + pub fn send(self) -> #{pagination_stream}::PaginationStream<#{item_type}> { + #{pagination_stream}::TryFlatMap::new(self.0.send()).flat_map(|page| #{extract_items}(page).unwrap_or_default().into_iter()) } } @@ -317,11 +272,7 @@ class PaginatorGenerator private constructor( paginationInfo.itemsMemberPath, ), "item_type" to writable { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rustTemplate("#{Result}<${itemType()}, #{SdkError}<#{Error}>>", *codegenScope) - } else { - rustTemplate("#{Result}<${itemType()}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) - } + rustTemplate("#{Result}<${itemType()}, #{SdkError}<#{Error}, #{HttpResponse}>>", *codegenScope) }, *codegenScope, ) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt index 1c85d9047b0..dfdd302a31e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt @@ -47,17 +47,14 @@ class ServiceGenerator( ) serviceConfigGenerator.render(this) - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - // Enable users to opt in to the test-utils in the runtime crate - rustCrate.mergeFeature(TestUtilFeature.copy(deps = listOf("aws-smithy-runtime/test-util"))) + // Enable users to opt in to the test-utils in the runtime crate + rustCrate.mergeFeature(TestUtilFeature.copy(deps = listOf("aws-smithy-runtime/test-util"))) - ServiceRuntimePluginGenerator(codegenContext) - .render(this, decorator.serviceRuntimePluginCustomizations(codegenContext, emptyList())) + ServiceRuntimePluginGenerator(codegenContext) + .render(this, decorator.serviceRuntimePluginCustomizations(codegenContext, emptyList())) - serviceConfigGenerator.renderRuntimePluginImplForSelf(this) - ConfigOverrideRuntimePluginGenerator(codegenContext) - .render(this, decorator.configCustomizations(codegenContext, listOf())) - } + ConfigOverrideRuntimePluginGenerator(codegenContext) + .render(this, decorator.configCustomizations(codegenContext, listOf())) } rustCrate.lib { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt index c77e95940a8..b58b8e97641 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt @@ -12,7 +12,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization @@ -36,44 +35,24 @@ sealed class ServiceRuntimePluginSection(name: String) : Section(name) { fun putConfigValue(writer: RustWriter, value: Writable) { writer.rust("$newLayerName.store_put(#T);", value) } + } - fun registerHttpAuthScheme(writer: RustWriter, runtimeConfig: RuntimeConfig, authScheme: Writable) { - writer.rustTemplate( - """ - #{ConfigBagAccessors}::push_http_auth_scheme( - &mut $newLayerName, - #{auth_scheme} - ); - """, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), - "auth_scheme" to authScheme, - ) + data class RegisterRuntimeComponents(val serviceConfigName: String) : ServiceRuntimePluginSection("RegisterRuntimeComponents") { + /** Generates the code to register an interceptor */ + fun registerInterceptor(writer: RustWriter, interceptor: Writable) { + writer.rust("runtime_components.push_interceptor(#T);", interceptor) } - fun registerIdentityResolver(writer: RustWriter, runtimeConfig: RuntimeConfig, identityResolver: Writable) { - writer.rustTemplate( - """ - #{ConfigBagAccessors}::push_identity_resolver( - &mut $newLayerName, - #{identity_resolver} - ); - """, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), - "identity_resolver" to identityResolver, - ) + fun registerAuthScheme(writer: RustWriter, authScheme: Writable) { + writer.rust("runtime_components.push_auth_scheme(#T);", authScheme) } - } - data class RegisterInterceptor(val interceptorRegistrarName: String) : ServiceRuntimePluginSection("RegisterInterceptor") { - /** Generates the code to register an interceptor */ - fun registerInterceptor(runtimeConfig: RuntimeConfig, writer: RustWriter, interceptor: Writable) { - writer.rustTemplate( - """ - $interceptorRegistrarName.register(#{SharedInterceptor}::new(#{interceptor}) as _); - """, - "interceptor" to interceptor, - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor"), - ) + fun registerEndpointResolver(writer: RustWriter, resolver: Writable) { + writer.rust("runtime_components.set_endpoint_resolver(Some(#T));", resolver) + } + + fun registerRetryClassifier(writer: RustWriter, classifier: Writable) { + writer.rust("runtime_components.push_retry_classifier(#T);", classifier) } } } @@ -86,18 +65,19 @@ class ServiceRuntimePluginGenerator( private val codegenContext: ClientCodegenContext, ) { private val codegenScope = codegenContext.runtimeConfig.let { rc -> - val runtimeApi = RuntimeType.smithyRuntimeApi(rc) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc) val smithyTypes = RuntimeType.smithyTypes(rc) arrayOf( *preludeScope, "Arc" to RuntimeType.Arc, "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), - "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), - "Layer" to smithyTypes.resolve("config_bag::Layer"), + "Cow" to RuntimeType.Cow, "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(rc), - "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), - "RuntimePlugin" to runtimeApi.resolve("client::runtime_plugin::RuntimePlugin"), + "IntoShared" to runtimeApi.resolve("shared::IntoShared"), + "Layer" to smithyTypes.resolve("config_bag::Layer"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(rc), + "RuntimePlugin" to RuntimeType.runtimePlugin(rc), + "Order" to runtimeApi.resolve("client::runtime_plugin::Order"), ) } @@ -110,18 +90,18 @@ class ServiceRuntimePluginGenerator( } writer.rustTemplate( """ - ##[derive(Debug)] + ##[derive(::std::fmt::Debug)] pub(crate) struct ServiceRuntimePlugin { config: #{Option}<#{FrozenLayer}>, + runtime_components: #{RuntimeComponentsBuilder}, } impl ServiceRuntimePlugin { pub fn new(_service_config: crate::config::Config) -> Self { - Self { - config: { - #{config} - }, - } + let config = { #{config} }; + let mut runtime_components = #{RuntimeComponentsBuilder}::new("ServiceRuntimePlugin"); + #{runtime_components} + Self { config, runtime_components } } } @@ -130,9 +110,12 @@ class ServiceRuntimePluginGenerator( self.config.clone() } - fn interceptors(&self, interceptors: &mut #{InterceptorRegistrar}) { - let _interceptors = interceptors; - #{additional_interceptors} + fn order(&self) -> #{Order} { + #{Order}::Defaults + } + + fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> { + #{Cow}::Borrowed(&self.runtime_components) } } @@ -146,7 +129,7 @@ class ServiceRuntimePluginGenerator( """ let mut cfg = #{Layer}::new(${codegenContext.serviceShape.id.name.dq()}); #{additional_config} - Some(cfg.freeze()) + #{Some}(cfg.freeze()) """, *codegenScope, "additional_config" to additionalConfig, @@ -155,8 +138,8 @@ class ServiceRuntimePluginGenerator( rust("None") } }, - "additional_interceptors" to writable { - writeCustomizations(customizations, ServiceRuntimePluginSection.RegisterInterceptor("_interceptors")) + "runtime_components" to writable { + writeCustomizations(customizations, ServiceRuntimePluginSection.RegisterRuntimeComponents("_service_config")) }, "declare_singletons" to writable { writeCustomizations(customizations, ServiceRuntimePluginSection.DeclareSingletons()) diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt index 8859cc598f1..608a6afea7e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt @@ -10,9 +10,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.Section sealed class CustomizableOperationSection(name: String) : Section(name) { /** Write custom code into a customizable operation's impl block */ - data class CustomizableOperationImpl( - val isRuntimeModeOrchestrator: Boolean, - ) : CustomizableOperationSection("CustomizableOperationImpl") + object CustomizableOperationImpl : CustomizableOperationSection("CustomizableOperationImpl") } abstract class CustomizableOperationCustomization : NamedCustomization() diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt index c8afcb7a960..68ed17a95b7 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt @@ -7,9 +7,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.client import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.GenericTypeArg -import software.amazon.smithy.rust.codegen.core.rustlang.RustGenerics import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Visibility @@ -25,204 +22,107 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizat * fluent client builders. */ class CustomizableOperationGenerator( - private val codegenContext: ClientCodegenContext, - private val generics: FluentClientGenerics, + codegenContext: ClientCodegenContext, private val customizations: List, ) { private val runtimeConfig = codegenContext.runtimeConfig - private val smithyHttp = CargoDependency.smithyHttp(runtimeConfig).toType() - private val smithyTypes = CargoDependency.smithyTypes(runtimeConfig).toType() fun render(crate: RustCrate) { - crate.withModule(ClientRustModule.Client.customize) { - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - pub use #{Operation}; - pub use #{Request}; - pub use #{Response}; - pub use #{ClassifyRetry}; - pub use #{RetryKind}; - """, - "Operation" to smithyHttp.resolve("operation::Operation"), - "Request" to smithyHttp.resolve("operation::Request"), - "Response" to smithyHttp.resolve("operation::Response"), - "ClassifyRetry" to RuntimeType.classifyRetry(runtimeConfig), - "RetryKind" to smithyTypes.resolve("retry::RetryKind"), - ) - renderCustomizableOperationModule(this) - } - } - } - - private fun renderCustomizableOperationModule(writer: RustWriter) { - val operationGenerics = RustGenerics(GenericTypeArg("O"), GenericTypeArg("Retry")) - val handleGenerics = generics.toRustGenerics() - val combinedGenerics = operationGenerics + handleGenerics - - val codegenScope = arrayOf( - *preludeScope, - "Arc" to RuntimeType.Arc, - "Infallible" to RuntimeType.stdConvert.resolve("Infallible"), - // SDK Types - "HttpRequest" to RuntimeType.HttpRequest, - "handle_generics_decl" to handleGenerics.declaration(), - "handle_generics_bounds" to handleGenerics.bounds(), - "operation_generics_decl" to operationGenerics.declaration(), - "combined_generics_decl" to combinedGenerics.declaration(), - "customize_module" to ClientRustModule.Client.customize, - "SdkBody" to RuntimeType.sdkBody(runtimeConfig), - ) - - writer.rustTemplate( - """ - /// A wrapper type for [`Operation`](aws_smithy_http::operation::Operation)s that allows for - /// customization of the operation before it is sent. A `CustomizableOperation` may be sent - /// by calling its [`.send()`][#{customize_module}::CustomizableOperation::send] method. - ##[derive(Debug)] - pub struct CustomizableOperation#{combined_generics_decl:W} { - pub(crate) handle: #{Arc}, - pub(crate) operation: Operation#{operation_generics_decl:W}, - } - - impl#{combined_generics_decl:W} CustomizableOperation#{combined_generics_decl:W} - where - #{handle_generics_bounds:W} - { - /// Allows for customizing the operation's request - pub fn map_request( - mut self, - f: impl #{FnOnce}(#{HttpRequest}<#{SdkBody}>) -> #{Result}<#{HttpRequest}<#{SdkBody}>, E>, - ) -> #{Result} { - let (request, response) = self.operation.into_request_response(); - let request = request.augment(|req, _props| f(req))?; - self.operation = Operation::from_parts(request, response); - #{Ok}(self) - } - - /// Convenience for `map_request` where infallible direct mutation of request is acceptable - pub fn mutate_request(self, f: impl #{FnOnce}(&mut #{HttpRequest}<#{SdkBody}>)) -> Self { - self.map_request(|mut req| { - f(&mut req); - #{Result}::<_, #{Infallible}>::Ok(req) - }) - .expect("infallible") - } - - /// Allows for customizing the entire operation - pub fn map_operation( - mut self, - f: impl #{FnOnce}(Operation#{operation_generics_decl:W}) -> #{Result}, - ) -> #{Result} { - self.operation = f(self.operation)?; - #{Ok}(self) - } - - /// Direct access to read the HTTP request - pub fn request(&self) -> &#{HttpRequest}<#{SdkBody}> { - self.operation.request() - } - - /// Direct access to mutate the HTTP request - pub fn request_mut(&mut self) -> &mut #{HttpRequest}<#{SdkBody}> { - self.operation.request_mut() - } - - #{additional_methods} - } - """, - *codegenScope, - "additional_methods" to writable { - writeCustomizations(customizations, CustomizableOperationSection.CustomizableOperationImpl(false)) - }, - ) - } - - fun renderForOrchestrator(crate: RustCrate) { val codegenScope = arrayOf( *preludeScope, "CustomizableOperation" to ClientRustModule.Client.customize.toType() - .resolve("orchestrator::CustomizableOperation"), + .resolve("CustomizableOperation"), "CustomizableSend" to ClientRustModule.Client.customize.toType() .resolve("internal::CustomizableSend"), - "HttpRequest" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "HttpRequest" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::HttpRequest"), - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::HttpResponse"), - "Interceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::interceptors::Interceptor"), + "Intercept" to RuntimeType.intercept(runtimeConfig), "MapRequestInterceptor" to RuntimeType.smithyRuntime(runtimeConfig) .resolve("client::interceptors::MapRequestInterceptor"), "MutateRequestInterceptor" to RuntimeType.smithyRuntime(runtimeConfig) .resolve("client::interceptors::MutateRequestInterceptor"), + "PhantomData" to RuntimeType.Phantom, "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "SharedRuntimePlugin" to RuntimeType.sharedRuntimePlugin(runtimeConfig), "SendResult" to ClientRustModule.Client.customize.toType() .resolve("internal::SendResult"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "SdkError" to RuntimeType.sdkError(runtimeConfig), - "SharedInterceptor" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "SharedInterceptor" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::interceptors::SharedInterceptor"), ) val customizeModule = ClientRustModule.Client.customize - crate.withModule(customizeModule) { renderConvenienceAliases(customizeModule, this) - // TODO(enableNewSmithyRuntimeCleanup): Render it directly under the customize module when CustomizableOperation - // in the middleware has been removed. - withInlineModule( - RustModule.new( - "orchestrator", - Visibility.PUBLIC, - true, - customizeModule, - documentationOverride = "Module for defining types for `CustomizableOperation` in the orchestrator", - ), - null, - ) { - rustTemplate( - """ - /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. - pub struct CustomizableOperation { - pub(crate) customizable_send: #{Box}>, - pub(crate) config_override: #{Option}, - pub(crate) interceptors: Vec<#{SharedInterceptor}>, - } + rustTemplate( + """ + /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent. + pub struct CustomizableOperation { + customizable_send: B, + config_override: #{Option}, + interceptors: Vec<#{SharedInterceptor}>, + runtime_plugins: Vec<#{SharedRuntimePlugin}>, + _output: #{PhantomData}, + _error: #{PhantomData}, + } - impl CustomizableOperation { - /// Adds an [`Interceptor`](#{Interceptor}) that runs at specific stages of the request execution pipeline. - /// - /// Note that interceptors can also be added to `CustomizableOperation` by `config_override`, - /// `map_request`, and `mutate_request` (the last two are implemented via interceptors under the hood). - /// The order in which those user-specified operation interceptors are invoked should not be relied upon - /// as it is an implementation detail. - pub fn interceptor(mut self, interceptor: impl #{Interceptor} + #{Send} + #{Sync} + 'static) -> Self { - self.interceptors.push(#{SharedInterceptor}::new(interceptor)); - self + impl CustomizableOperation { + /// Creates a new `CustomizableOperation` from `customizable_send`. + ##[allow(dead_code)] // unused when a service does not provide any operations + pub(crate) fn new(customizable_send: B) -> Self { + Self { + customizable_send, + config_override: #{None}, + interceptors: vec![], + runtime_plugins: vec![], + _output: #{PhantomData}, + _error: #{PhantomData} + } } - /// Allows for customizing the operation's request. - pub fn map_request(mut self, f: F) -> Self - where - F: #{Fn}(#{HttpRequest}) -> #{Result}<#{HttpRequest}, MapE> - + #{Send} - + #{Sync} - + 'static, - MapE: ::std::error::Error + #{Send} + #{Sync} + 'static, - { - self.interceptors.push( - #{SharedInterceptor}::new( - #{MapRequestInterceptor}::new(f), - ), - ); - self - } + /// Adds an [interceptor](#{Intercept}) that runs at specific stages of the request execution pipeline. + /// + /// Note that interceptors can also be added to `CustomizableOperation` by `config_override`, + /// `map_request`, and `mutate_request` (the last two are implemented via interceptors under the hood). + /// The order in which those user-specified operation interceptors are invoked should not be relied upon + /// as it is an implementation detail. + pub fn interceptor(mut self, interceptor: impl #{Intercept} + 'static) -> Self { + self.interceptors.push(#{SharedInterceptor}::new(interceptor)); + self + } + + /// Adds a runtime plugin. + ##[allow(unused)] + pub(crate) fn runtime_plugin(mut self, runtime_plugin: impl #{RuntimePlugin} + 'static) -> Self { + self.runtime_plugins.push(#{SharedRuntimePlugin}::new(runtime_plugin)); + self + } + + /// Allows for customizing the operation's request. + pub fn map_request(mut self, f: F) -> Self + where + F: #{Fn}(#{HttpRequest}) -> #{Result}<#{HttpRequest}, MapE> + + #{Send} + + #{Sync} + + 'static, + MapE: ::std::error::Error + #{Send} + #{Sync} + 'static, + { + self.interceptors.push( + #{SharedInterceptor}::new( + #{MapRequestInterceptor}::new(f), + ), + ); + self + } /// Convenience for `map_request` where infallible direct mutation of request is acceptable. pub fn mutate_request(mut self, f: F) -> Self where - F: #{Fn}(&mut http::Request<#{SdkBody}>) + #{Send} + #{Sync} + 'static, + F: #{Fn}(&mut #{HttpRequest}) + #{Send} + #{Sync} + 'static, { self.interceptors.push( #{SharedInterceptor}::new( @@ -232,56 +132,55 @@ class CustomizableOperationGenerator( self } - /// Overrides config for a single operation invocation. - /// - /// `config_override` is applied to the operation configuration level. - /// The fields in the builder that are `Some` override those applied to the service - /// configuration level. For instance, - /// - /// Config A overridden by Config B == Config C - /// field_1: None, field_1: Some(v2), field_1: Some(v2), - /// field_2: Some(v1), field_2: Some(v2), field_2: Some(v2), - /// field_3: Some(v1), field_3: None, field_3: Some(v1), - pub fn config_override( - mut self, - config_override: impl #{Into}, - ) -> Self { - self.config_override = Some(config_override.into()); - self - } - - /// Sends the request and returns the response. - pub async fn send( - self, - ) -> #{SendResult} - where - E: std::error::Error + #{Send} + #{Sync} + 'static, - { - let mut config_override = if let Some(config_override) = self.config_override { - config_override - } else { - crate::config::Builder::new() - }; - - self.interceptors.into_iter().for_each(|interceptor| { - config_override.add_interceptor(interceptor); - }); - - (self.customizable_send)(config_override).await - } + /// Overrides config for a single operation invocation. + /// + /// `config_override` is applied to the operation configuration level. + /// The fields in the builder that are `Some` override those applied to the service + /// configuration level. For instance, + /// + /// | Config A | overridden by Config B | = Config C | + /// |--------------------|------------------------|--------------------| + /// | field_1: None, | field_1: Some(v2), | field_1: Some(v2), | + /// | field_2: Some(v1), | field_2: Some(v2), | field_2: Some(v2), | + /// | field_3: Some(v1), | field_3: None, | field_3: Some(v1), | + pub fn config_override( + mut self, + config_override: impl #{Into}, + ) -> Self { + self.config_override = Some(config_override.into()); + self + } - #{additional_methods} + /// Sends the request and returns the response. + pub async fn send( + self, + ) -> #{SendResult} + where + E: std::error::Error + #{Send} + #{Sync} + 'static, + B: #{CustomizableSend}, + { + let mut config_override = self.config_override.unwrap_or_default(); + self.interceptors.into_iter().for_each(|interceptor| { + config_override.push_interceptor(interceptor); + }); + self.runtime_plugins.into_iter().for_each(|plugin| { + config_override.push_runtime_plugin(plugin); + }); + + self.customizable_send.send(config_override).await } - """, - *codegenScope, - "additional_methods" to writable { - writeCustomizations( - customizations, - CustomizableOperationSection.CustomizableOperationImpl(true), - ) - }, - ) - } + + #{additional_methods} + } + """, + *codegenScope, + "additional_methods" to writable { + writeCustomizations( + customizations, + CustomizableOperationSection.CustomizableOperationImpl, + ) + }, + ) } } @@ -299,89 +198,18 @@ class CustomizableOperationGenerator( >, >; - pub trait CustomizableSend: - #{FnOnce}(crate::config::Builder) -> BoxFuture> - {} - - impl CustomizableSend for F - where - F: #{FnOnce}(crate::config::Builder) -> BoxFuture> - {} + pub trait CustomizableSend: #{Send} + #{Sync} { + // Takes an owned `self` as the implementation will internally call methods that take `self`. + // If it took `&self`, that would make this trait object safe, but some implementing types do not + // derive `Clone`, unable to yield `self` from `&self`. + fn send(self, config_override: crate::config::Builder) -> BoxFuture>; + } """, *preludeScope, - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) .resolve("client::orchestrator::HttpResponse"), "SdkError" to RuntimeType.sdkError(runtimeConfig), ) } } } - -fun renderCustomizableOperationSend(codegenContext: ClientCodegenContext, generics: FluentClientGenerics, writer: RustWriter) { - val runtimeConfig = codegenContext.runtimeConfig - val smithyHttp = CargoDependency.smithyHttp(runtimeConfig).toType() - val smithyClient = CargoDependency.smithyClient(runtimeConfig).toType() - - val operationGenerics = RustGenerics(GenericTypeArg("O"), GenericTypeArg("Retry")) - val handleGenerics = generics.toRustGenerics() - val combinedGenerics = operationGenerics + handleGenerics - - val codegenScope = arrayOf( - *preludeScope, - "SdkSuccess" to RuntimeType.sdkSuccess(runtimeConfig), - "SdkError" to RuntimeType.sdkError(runtimeConfig), - // TODO(enableNewSmithyRuntimeCleanup): Delete the trait bounds when cleaning up middleware - "ParseHttpResponse" to smithyHttp.resolve("response::ParseHttpResponse"), - "NewRequestPolicy" to smithyClient.resolve("retry::NewRequestPolicy"), - "SmithyRetryPolicy" to smithyClient.resolve("bounds::SmithyRetryPolicy"), - "ClassifyRetry" to RuntimeType.classifyRetry(runtimeConfig), - // TODO(enableNewSmithyRuntimeCleanup): Delete the generics when cleaning up middleware - "combined_generics_decl" to combinedGenerics.declaration(), - "handle_generics_bounds" to handleGenerics.bounds(), - ) - - if (generics is FlexibleClientGenerics) { - writer.rustTemplate( - """ - impl#{combined_generics_decl:W} CustomizableOperation#{combined_generics_decl:W} - where - #{handle_generics_bounds:W} - { - /// Sends this operation's request - pub async fn send(self) -> #{Result}> - where - E: std::error::Error + #{Send} + #{Sync} + 'static, - O: #{ParseHttpResponse}> + #{Send} + #{Sync} + #{Clone} + 'static, - Retry: #{Send} + #{Sync} + #{Clone}, - Retry: #{ClassifyRetry}<#{SdkSuccess}, #{SdkError}> + #{Send} + #{Sync} + #{Clone}, - ::Policy: #{SmithyRetryPolicy} + #{Clone}, - { - self.handle.client.call(self.operation).await - } - } - """, - *codegenScope, - ) - } else if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - writer.rustTemplate( - """ - impl#{combined_generics_decl:W} CustomizableOperation#{combined_generics_decl:W} - where - #{handle_generics_bounds:W} - { - /// Sends this operation's request - pub async fn send(self) -> #{Result}> - where - E: std::error::Error + #{Send} + #{Sync} + 'static, - O: #{ParseHttpResponse}> + #{Send} + #{Sync} + #{Clone} + 'static, - Retry: #{Send} + #{Sync} + #{Clone}, - Retry: #{ClassifyRetry}<#{SdkSuccess}, #{SdkError}> + #{Send} + #{Sync} + #{Clone}, - { - self.handle.client.call(self.operation).await - } - } - """, - *codegenScope, - ) - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt index 9775a342fb2..73296eb3378 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt @@ -9,14 +9,12 @@ import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section @@ -36,27 +34,12 @@ class FluentClientDecorator : ClientCodegenDecorator { return } - val generics = if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - NoClientGenerics(codegenContext.runtimeConfig) - } else { - FlexibleClientGenerics( - connectorDefault = null, - middlewareDefault = null, - retryDefault = RuntimeType.smithyClient(codegenContext.runtimeConfig).resolve("retry::Standard"), - client = RuntimeType.smithyClient(codegenContext.runtimeConfig), - ) - } - FluentClientGenerator( codegenContext, - generics = generics, customizations = listOf(GenericFluentClient(codegenContext)), ).render(rustCrate) - rustCrate.withModule(ClientRustModule.Client.customize) { - renderCustomizableOperationSend(codegenContext, generics, this) - } - rustCrate.mergeFeature(Feature("rustls", default = true, listOf("aws-smithy-client/rustls"))) + rustCrate.mergeFeature(Feature("rustls", default = true, listOf("aws-smithy-runtime/tls-rustls"))) } override fun libRsCustomizations( @@ -70,7 +53,7 @@ class FluentClientDecorator : ClientCodegenDecorator { return baseCustomizations + object : LibRsCustomization() { override fun section(section: LibRsSection) = when (section) { is LibRsSection.Body -> writable { - rust("pub use client::{Client, Builder};") + rust("pub use client::Client;") } else -> emptySection } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt index b83cb7a8601..448b576a9d3 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt @@ -8,7 +8,6 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.client import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.docsTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -22,157 +21,32 @@ object FluentClientDocs { """ Client for calling $serviceName. - #### Client types and purposes - - Clients generated by smithy-rs have two separate client layers: - - 1. The Smithy [`Client`](#{aws_smithy_client}::Client): A _lower level client_ that is not tied - to the service and directly operates on operation structs. A Smithy client is composed of a - connector, middleware, and retry strategy. - 2. The "fluent" [`Client`]: A _higher level client_ that is convenient to use. - - The vast majority of use-cases don't require using the Smithy client, so it is usually only relevant - for client construction. Because of this, this documentation will refer to the fluent client as simply - the "client". The Smithy client is only relevant when customizing the connector, middleware, or - retry strategy, or for even more advanced use cases. - #### Constructing a `Client` - A fluent [`Client`] is composed of a Smithy client and service configuration. In order to - construct one, a Smithy client must be created first, and this is done using - the [`client::Builder`](crate::client::Builder) struct: - - ```rust,no_run - let smithy_client = $moduleUseName::client::Builder::new() - // Use the default HTTPS connector - .dyn_https_connector(Default::default()) - // Use a no-op middleware - .middleware_fn(|request| request) - // Build a type-erased Smithy client - .build_dyn(); - ``` + A `Client` requires a config in order to be constructed. With the default set of Cargo features, + this config will only require an endpoint to produce a functioning client. However, some Smithy + features will require additional configuration. For example, `@auth` requires some kind of identity + or identity resolver to be configured. The config is used to customize various aspects of the client, + such as: - The client builder has generics `C`, `M`, and `R` representing the connector, middleware, and - retry strategy: + - [HTTP Connector](crate::config::Builder::http_connector) + - [Retry](crate::config::Builder::retry_config) + - [Timeouts](crate::config::Builder::timeout_config) + - [... and more](crate::config::Builder) - - A connector (`C`) specifies how HTTP requests are translated into HTTP responses. This will typically be - an HTTP client (like `hyper`), but you can also provide your own, like a mock connector for testing. - - Middleware (`M`) modifies requests prior to them being sent to the service. Most commonly, middleware decide - what endpoint the requests should be sent to, as well as perform authentication and authorization (such - as HTTP basic auth or AWS SigV4). You can also have middleware that performs request/response tracing, - throttling, or other middleware-like tasks. - - A retry strategy (`R`) dictates the behavior for requests that fail. The default, - [`RetryMode::Standard`](aws_smithy_types::retry::RetryMode::Standard) is generally what you want since - it provides a well-vetted exponential backoff retry implementation. - - Once the Smithy client is created, a service config and fluent client can be created. Generally, you - want to call [`Client::with_config`], which takes a Smithy client and the service [`Config`](crate::Config). - The config is constructed using the [builder pattern], and has several builder methods to further - customize the client. - - In _most_ circumstances, you will want to use the following pattern to construct a client: + Below is a minimal example of how to create a client: ```rust,no_run - let smithy_client = $moduleUseName::client::Builder::new() - .dyn_https_connector(Default::default()) - ## /* - .middleware(/* discussed below */) - ## */ - ## .middleware_fn(|r| r) - .build_dyn(); - - let config = $moduleUseName::Config::builder().build(); - let client = $moduleUseName::Client::with_config(smithy_client, config); + let config = $moduleUseName::Config::builder() + .endpoint_url("http://localhost:1234") + .build(); + let client = $moduleUseName::Client::from_conf(config); ``` _Note:_ Client construction is expensive due to connection thread pool initialization, and should be done - once at application start-up. - - For middleware, you'll want to use whatever matches the routing, authentication, and authorization - required by the target service. For example, for the AWS SDK which uses [SigV4-signed requests], the - middleware looks like this: - - ```rust,ignore - use aws_endpoint::AwsEndpointStage; - use aws_http::auth::CredentialsStage; - use aws_http::recursion_detection::RecursionDetectionStage; - use aws_http::user_agent::UserAgentStage; - use aws_sig_auth::middleware::SigV4SigningStage; - use aws_sig_auth::signer::SigV4Signer; - use aws_smithy_client::retry::Config as RetryConfig; - use aws_smithy_http_tower::map_request::{AsyncMapRequestLayer, MapRequestLayer}; - use std::fmt::Debug; - use tower::layer::util::{Identity, Stack}; - use tower::ServiceBuilder; - - type AwsMiddlewareStack = Stack< - MapRequestLayer, - Stack< - MapRequestLayer, - Stack< - AsyncMapRequestLayer, - Stack< - MapRequestLayer, - Stack, Identity>, - >, - >, - >, - >; - - /// AWS Middleware Stack - /// - /// This implements the middleware stack for this service. It will: - /// 1. Load credentials asynchronously into the property bag - /// 2. Sign the request with SigV4 - /// 3. Resolve an Endpoint for the request - /// 4. Add a user agent to the request - ##[derive(Debug, Default, Clone)] - ##[non_exhaustive] - pub struct AwsMiddleware; - - impl AwsMiddleware { - /// Create a new `AwsMiddleware` stack - /// - /// Note: `AwsMiddleware` holds no state. - pub fn new() -> Self { - AwsMiddleware::default() - } - } - - // define the middleware stack in a non-generic location to reduce code bloat. - fn base() -> ServiceBuilder { - let credential_provider = AsyncMapRequestLayer::for_mapper(CredentialsStage::new()); - let signer = MapRequestLayer::for_mapper(SigV4SigningStage::new(SigV4Signer::new())); - let endpoint_resolver = MapRequestLayer::for_mapper(AwsEndpointStage); - let user_agent = MapRequestLayer::for_mapper(UserAgentStage::new()); - let recursion_detection = MapRequestLayer::for_mapper(RecursionDetectionStage::new()); - // These layers can be considered as occurring in order, that is: - // 1. Resolve an endpoint - // 2. Add a user agent - // 3. Acquire credentials - // 4. Sign with credentials - // (5. Dispatch over the wire) - ServiceBuilder::new() - .layer(endpoint_resolver) - .layer(user_agent) - .layer(credential_provider) - .layer(signer) - .layer(recursion_detection) - } - - impl tower::Layer for AwsMiddleware { - type Service = >::Service; - - fn layer(&self, inner: S) -> Self::Service { - base().service(inner) - } - } - ``` - - [builder pattern]: https://rust-lang.github.io/api-guidelines/type-safety.html##builders-enable-construction-of-complex-values-c-builder - [SigV4-signed requests]: https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html""${'"'}, + once at application start-up. Cloning a client is cheap (it's just an [`Arc`](std::sync::Arc) under the hood), + so creating it once at start-up and cloning it around the application as needed is recommended. """.trimIndent(), - "aws_smithy_client" to CargoDependency.smithyClient(codegenContext.runtimeConfig).toDevDependency().toType(), ) } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt index 6fe9978f78d..3865d5a0ab2 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt @@ -18,7 +18,9 @@ import software.amazon.smithy.rust.codegen.client.smithy.generators.PaginatorGen import software.amazon.smithy.rust.codegen.client.smithy.generators.isPaginated import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.EscapeFor +import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords import software.amazon.smithy.rust.codegen.core.rustlang.RustType @@ -30,18 +32,17 @@ import software.amazon.smithy.rust.codegen.core.rustlang.docLink import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.documentShape import software.amazon.smithy.rust.codegen.core.rustlang.escape +import software.amazon.smithy.rust.codegen.core.rustlang.featureGatedBlock import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.normalizeHtml import software.amazon.smithy.rust.codegen.core.rustlang.qualifiedName import software.amazon.smithy.rust.codegen.core.rustlang.render import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.rustTypeParameters import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate @@ -51,19 +52,19 @@ import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata import software.amazon.smithy.rust.codegen.core.smithy.generators.getterName import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName import software.amazon.smithy.rust.codegen.core.smithy.rustType +import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.inputShape import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.outputShape +import software.amazon.smithy.rust.codegen.core.util.sdkId import software.amazon.smithy.rust.codegen.core.util.toSnakeCase +private val BehaviorVersionLatest = Feature("behavior-version-latest", false, listOf()) class FluentClientGenerator( private val codegenContext: ClientCodegenContext, - private val reexportSmithyClientBuilder: Boolean = true, - private val generics: FluentClientGenerics, private val customizations: List = emptyList(), - private val retryClassifier: RuntimeType = RuntimeType.smithyHttp(codegenContext.runtimeConfig) - .resolve("retry::DefaultResponseRetryClassifier"), ) { + companion object { fun clientOperationFnName(operationShape: OperationShape, symbolProvider: RustSymbolProvider): String = RustReservedWords.escapeIfNeeded(symbolProvider.toSymbol(operationShape).name.toSnakeCase()) @@ -82,12 +83,11 @@ class FluentClientGenerator( private val model = codegenContext.model private val runtimeConfig = codegenContext.runtimeConfig private val core = FluentClientCore(model) - private val smithyRuntimeMode = codegenContext.smithyRuntimeMode fun render(crate: RustCrate, customizableOperationCustomizations: List = emptyList()) { renderFluentClient(crate) - val customizableOperationGenerator = CustomizableOperationGenerator(codegenContext, generics, customizableOperationCustomizations) + val customizableOperationGenerator = CustomizableOperationGenerator(codegenContext, customizableOperationCustomizations) operations.forEach { operation -> crate.withModule(symbolProvider.moduleForBuilder(operation)) { renderFluentBuilder(operation) @@ -95,158 +95,83 @@ class FluentClientGenerator( } customizableOperationGenerator.render(crate) - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - customizableOperationGenerator.renderForOrchestrator(crate) - } } private fun renderFluentClient(crate: RustCrate) { + crate.mergeFeature(BehaviorVersionLatest) crate.withModule(ClientRustModule.client) { - if (reexportSmithyClientBuilder) { - rustTemplate( - """ - ##[doc(inline)] - pub use #{client}::Builder; - """, - "client" to RuntimeType.smithyClient(runtimeConfig), - ) - } - val clientScope = arrayOf( - *preludeScope, - "Arc" to RuntimeType.Arc, - "client" to RuntimeType.smithyClient(runtimeConfig), - "client_docs" to writable - { - customizations.forEach { - it.section( - FluentClientSection.FluentClientDocs( - serviceShape, - ), - )(this) - } - }, - "RetryConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryConfig"), - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"), - // TODO(enableNewSmithyRuntimeCleanup): Delete the generics when cleaning up middleware - "generics_decl" to generics.decl, - "smithy_inst" to generics.smithyInst, - ) - if (codegenContext.smithyRuntimeMode.generateMiddleware) { - rustTemplate( - """ - ##[derive(Debug)] - pub(crate) struct Handle#{generics_decl:W} { - pub(crate) client: #{client}::Client#{smithy_inst:W}, - pub(crate) conf: crate::Config, - } + rustTemplate( + """ + ##[derive(Debug)] + pub(crate) struct Handle { + pub(crate) conf: crate::Config, + ##[allow(dead_code)] // unused when a service does not provide any operations + pub(crate) runtime_plugins: #{RuntimePlugins}, + } - #{client_docs:W} - ##[derive(::std::fmt::Debug)] - pub struct Client#{generics_decl:W} { - handle: #{Arc} - } + #{client_docs:W} + ##[derive(#{Clone}, ::std::fmt::Debug)] + pub struct Client { + handle: #{Arc}, + } - impl${generics.inst} #{Clone} for Client${generics.inst} { - fn clone(&self) -> Self { - Self { handle: self.handle.clone() } + impl Client { + /// Creates a new client from the service [`Config`](crate::Config). + /// + /// ## Panics + /// + /// This method will panic in the following cases: + /// + /// - Retries or timeouts are enabled without a `sleep_impl` configured. + /// - Identity caching is enabled without a `sleep_impl` and `time_source` configured. + /// - No `behavior_version` is provided. + /// + /// The panic message for each of these will have instructions on how to resolve them. + ##[track_caller] + pub fn from_conf(conf: crate::Config) -> Self { + let handle = Handle { + conf: conf.clone(), + runtime_plugins: #{base_client_runtime_plugins}(conf), + }; + if let Err(err) = Self::validate_config(&handle) { + panic!("Invalid client configuration: {err}"); } - } - - impl${generics.inst} From<#{client}::Client#{smithy_inst:W}> for Client${generics.inst} { - fn from(client: #{client}::Client#{smithy_inst:W}) -> Self { - Self::with_config(client, crate::Config::builder().build()) + Self { + handle: #{Arc}::new(handle) } } - impl${generics.inst} Client${generics.inst} { - /// Creates a client with the given service configuration. - pub fn with_config(client: #{client}::Client#{smithy_inst:W}, conf: crate::Config) -> Self { - Self { - handle: #{Arc}::new(Handle { - client, - conf, - }) - } - } - - /// Returns the client's configuration. - pub fn conf(&self) -> &crate::Config { - &self.handle.conf - } - } - """, - *clientScope, - ) - } else { - rustTemplate( - """ - ##[derive(Debug)] - pub(crate) struct Handle { - pub(crate) conf: crate::Config, - pub(crate) runtime_plugins: #{RuntimePlugins}, + /// Returns the client's configuration. + pub fn config(&self) -> &crate::Config { + &self.handle.conf } - #{client_docs:W} - ##[derive(#{Clone}, ::std::fmt::Debug)] - pub struct Client { - handle: #{Arc}, + fn validate_config(handle: &Handle) -> Result<(), #{BoxError}> { + let mut cfg = #{ConfigBag}::base(); + handle.runtime_plugins + .apply_client_configuration(&mut cfg)? + .validate_base_client_config(&cfg)?; + Ok(()) } - - impl Client { - /// Creates a new client from the service [`Config`](crate::Config). - /// - /// ## Panics - /// - /// - This method will panic if the `conf` is missing an async sleep implementation. If you experience this panic, set - /// the `sleep_impl` on the Config passed into this function to fix it. - /// - This method will panic if the `conf` is missing an HTTP connector. If you experience this panic, set the - /// `http_connector` on the Config passed into this function to fix it. - pub fn from_conf(conf: crate::Config) -> Self { - let retry_config = conf.retry_config().cloned().unwrap_or_else(#{RetryConfig}::disabled); - let timeout_config = conf.timeout_config().cloned().unwrap_or_else(#{TimeoutConfig}::disabled); - let sleep_impl = conf.sleep_impl(); - if (retry_config.has_retry() || timeout_config.has_timeouts()) && sleep_impl.is_none() { - panic!("An async sleep implementation is required for retries or timeouts to work. \ - Set the `sleep_impl` on the Config passed into this function to fix this panic."); - } - - Self { - handle: #{Arc}::new( - Handle { - conf: conf.clone(), - runtime_plugins: #{base_client_runtime_plugins}(conf), - } - ) - } - } - - /// Returns the client's configuration. - pub fn config(&self) -> &crate::Config { - &self.handle.conf - } - - ##[doc(hidden)] - // TODO(enableNewSmithyRuntimeCleanup): Delete this function when cleaning up middleware - // This is currently kept around so the tests still compile in both modes - /// Creates a client with the given service configuration. - pub fn with_config(_client: #{client}::Client, conf: crate::Config) -> Self { - Self::from_conf(conf) - } - - ##[doc(hidden)] - // TODO(enableNewSmithyRuntimeCleanup): Delete this function when cleaning up middleware - // This is currently kept around so the tests still compile in both modes - /// Returns the client's configuration. - pub fn conf(&self) -> &crate::Config { - &self.handle.conf - } + } + """, + *preludeScope, + "Arc" to RuntimeType.Arc, + "base_client_runtime_plugins" to baseClientRuntimePluginsFn(codegenContext), + "BoxError" to RuntimeType.boxError(runtimeConfig), + "client_docs" to writable { + customizations.forEach { + it.section( + FluentClientSection.FluentClientDocs( + serviceShape, + ), + )(this) } - """, - *clientScope, - "base_client_runtime_plugins" to baseClientRuntimePluginsFn(runtimeConfig), - ) - } + }, + "ConfigBag" to RuntimeType.configBag(runtimeConfig), + "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), + "tracing" to CargoDependency.Tracing.toType(), + ) } operations.forEach { operation -> @@ -256,11 +181,7 @@ class FluentClientGenerator( val privateModule = RustModule.private(moduleName, parent = ClientRustModule.client) crate.withModule(privateModule) { - rustBlockTemplate( - "impl${generics.inst} super::Client${generics.inst} #{bounds:W}", - "client" to RuntimeType.smithyClient(runtimeConfig), - "bounds" to generics.bounds, - ) { + rustBlock("impl super::Client") { val fullPath = operation.fullyQualifiedFluentBuilder(symbolProvider) val maybePaginated = if (operation.isPaginated(model)) { "\n/// This operation supports pagination; See [`into_paginator()`]($fullPath::into_paginator)." @@ -306,7 +227,7 @@ class FluentClientGenerator( rustTemplate( """ - pub fn $fnName(&self) -> #{FluentBuilder}${generics.inst} { + pub fn $fnName(&self) -> #{FluentBuilder} { #{FluentBuilder}::new(self.handle.clone()) } """, @@ -331,34 +252,25 @@ class FluentClientGenerator( rustTemplate( """ /// Sends a request with this input using the given client. - pub async fn send_with${generics.inst}( - self, - client: &crate::Client${generics.inst} - ) -> #{Result}< + pub async fn send_with(self, client: &crate::Client) -> #{Result}< #{OperationOutput}, #{SdkError}< #{OperationError}, #{RawResponseType} > - > #{send_bounds:W} #{boundsWithoutWhereClause:W} { + > { let mut fluent_builder = client.$fnName(); fluent_builder.inner = self; fluent_builder.send().await } """, *preludeScope, - "RawResponseType" to if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - RuntimeType.smithyHttp(runtimeConfig).resolve("operation::Response") - } else { - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::HttpResponse") - }, + "RawResponseType" to + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::orchestrator::HttpResponse"), "Operation" to operationSymbol, "OperationError" to errorType, "OperationOutput" to outputType, "SdkError" to RuntimeType.sdkError(runtimeConfig), - "SdkSuccess" to RuntimeType.sdkSuccess(runtimeConfig), - "boundsWithoutWhereClause" to generics.boundsWithoutWhereClause, - "send_bounds" to generics.sendBounds(operationSymbol, outputType, errorType, retryClassifier), ) } @@ -370,44 +282,60 @@ class FluentClientGenerator( deprecatedShape(operation) Attribute(derive(derives.toSet())).render(this) withBlockTemplate( - "pub struct $builderName#{generics:W} {", + "pub struct $builderName {", "}", - "generics" to generics.decl, ) { rustTemplate( """ - handle: #{Arc}, + handle: #{Arc}, inner: #{Inner}, """, "Inner" to symbolProvider.symbolForBuilder(input), "Arc" to RuntimeType.Arc, - "generics" to generics.decl, ) - if (smithyRuntimeMode.generateOrchestrator) { - rustTemplate("config_override: #{Option},", *preludeScope) - } + rustTemplate("config_override: #{Option},", *preludeScope) } - rustBlockTemplate( - "impl${generics.inst} $builderName${generics.inst} #{bounds:W}", - "client" to RuntimeType.smithyClient(runtimeConfig), - "bounds" to generics.bounds, - ) { + rustTemplate( + """ + impl + crate::client::customize::internal::CustomizableSend< + #{OperationOutput}, + #{OperationError}, + > for $builderName + { + fn send( + self, + config_override: crate::config::Builder, + ) -> crate::client::customize::internal::BoxFuture< + crate::client::customize::internal::SendResult< + #{OperationOutput}, + #{OperationError}, + >, + > { + #{Box}::pin(async move { self.config_override(config_override).send().await }) + } + } + """, + *preludeScope, + "OperationError" to errorType, + "OperationOutput" to outputType, + "SdkError" to RuntimeType.sdkError(runtimeConfig), + ) + + rustBlock("impl $builderName") { rust("/// Creates a new `${operationSymbol.name}`.") withBlockTemplate( - "pub(crate) fn new(handle: #{Arc}) -> Self {", + "pub(crate) fn new(handle: #{Arc}) -> Self {", "}", "Arc" to RuntimeType.Arc, - "generics" to generics.decl, ) { withBlockTemplate( "Self {", "}", ) { rustTemplate("handle, inner: #{Default}::default(),", *preludeScope) - if (smithyRuntimeMode.generateOrchestrator) { - rustTemplate("config_override: #{None},", *preludeScope) - } + rustTemplate("config_override: #{None},", *preludeScope) } } @@ -419,199 +347,78 @@ class FluentClientGenerator( write("&self.inner") } - if (smithyRuntimeMode.generateMiddleware) { - val middlewareScope = arrayOf( - *preludeScope, - "CustomizableOperation" to ClientRustModule.Client.customize.toType() - .resolve("CustomizableOperation"), - "ClassifyRetry" to RuntimeType.classifyRetry(runtimeConfig), - "Operation" to operationSymbol, - "OperationError" to errorType, - "OperationOutput" to outputType, - "SdkError" to RuntimeType.sdkError(runtimeConfig), - "SdkSuccess" to RuntimeType.sdkSuccess(runtimeConfig), - "send_bounds" to generics.sendBounds(operationSymbol, outputType, errorType, retryClassifier), - "customizable_op_type_params" to rustTypeParameters( - symbolProvider.toSymbol(operation), - retryClassifier, - generics.toRustGenerics(), - ), - ) - rustTemplate( - """ - // This function will go away in the near future. Do not rely on it. - ##[doc(hidden)] - pub async fn customize_middleware(self) -> #{Result}< - #{CustomizableOperation}#{customizable_op_type_params:W}, - #{SdkError}<#{OperationError}> - > #{send_bounds:W} { - let handle = self.handle.clone(); - let operation = self.inner.build().map_err(#{SdkError}::construction_failure)? - .make_operation(&handle.conf) - .await - .map_err(#{SdkError}::construction_failure)?; - #{Ok}(#{CustomizableOperation} { handle, operation }) - } - - // This function will go away in the near future. Do not rely on it. - ##[doc(hidden)] - pub async fn send_middleware(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}>> - #{send_bounds:W} { - let op = self.inner.build().map_err(#{SdkError}::construction_failure)? - .make_operation(&self.handle.conf) - .await - .map_err(#{SdkError}::construction_failure)?; - self.handle.client.call(op).await - } - """, - *middlewareScope, - ) - if (smithyRuntimeMode.defaultToMiddleware) { - rustTemplate( - """ - /// Sends the request and returns the response. - /// - /// If an error occurs, an `SdkError` will be returned with additional details that - /// can be matched against. - /// - /// By default, any retryable failures will be retried twice. Retry behavior - /// is configurable with the [RetryConfig](aws_smithy_types::retry::RetryConfig), which can be - /// set when configuring the client. - pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}>> - #{send_bounds:W} { - self.send_middleware().await - } - - /// Consumes this builder, creating a customizable operation that can be modified before being - /// sent. The operation's inner [http::Request] can be modified as well. - pub async fn customize(self) -> #{Result}< - #{CustomizableOperation}#{customizable_op_type_params:W}, - #{SdkError}<#{OperationError}> - > #{send_bounds:W} { - self.customize_middleware().await - } - """, - *middlewareScope, - ) + val orchestratorScope = arrayOf( + *preludeScope, + "CustomizableOperation" to ClientRustModule.Client.customize.toType() + .resolve("CustomizableOperation"), + "HttpResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) + .resolve("client::orchestrator::HttpResponse"), + "Operation" to operationSymbol, + "OperationError" to errorType, + "OperationOutput" to outputType, + "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), + "SendResult" to ClientRustModule.Client.customize.toType() + .resolve("internal::SendResult"), + "SdkError" to RuntimeType.sdkError(runtimeConfig), + ) + rustTemplate( + """ + /// Sends the request and returns the response. + /// + /// If an error occurs, an `SdkError` will be returned with additional details that + /// can be matched against. + /// + /// By default, any retryable failures will be retried twice. Retry behavior + /// is configurable with the [RetryConfig](aws_smithy_types::retry::RetryConfig), which can be + /// set when configuring the client. + pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { + let input = self.inner.build().map_err(#{SdkError}::construction_failure)?; + let runtime_plugins = #{Operation}::operation_runtime_plugins( + self.handle.runtime_plugins.clone(), + &self.handle.conf, + self.config_override, + ); + #{Operation}::orchestrate(&runtime_plugins, input).await } - } - - if (smithyRuntimeMode.generateOrchestrator) { - val orchestratorScope = arrayOf( - *preludeScope, - "CustomizableOperation" to ClientRustModule.Client.customize.toType() - .resolve("orchestrator::CustomizableOperation"), - "HttpResponse" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::orchestrator::HttpResponse"), - "Operation" to operationSymbol, - "OperationError" to errorType, - "OperationOutput" to outputType, - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "SendResult" to ClientRustModule.Client.customize.toType() - .resolve("internal::SendResult"), - "SdkError" to RuntimeType.sdkError(runtimeConfig), - ) - rustTemplate( - """ - ##[doc(hidden)] - pub async fn send_orchestrator(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { - let input = self.inner.build().map_err(#{SdkError}::construction_failure)?; - let runtime_plugins = #{Operation}::operation_runtime_plugins( - self.handle.runtime_plugins.clone(), - &self.handle.conf, - self.config_override, - ); - #{Operation}::orchestrate(&runtime_plugins, input).await - } - - ##[doc(hidden)] - // TODO(enableNewSmithyRuntimeCleanup): Remove `async` once we switch to orchestrator - pub async fn customize_orchestrator( - self, - ) -> #{CustomizableOperation}< - #{OperationOutput}, - #{OperationError}, - > - { - #{CustomizableOperation} { - customizable_send: #{Box}::new(move |config_override| { - #{Box}::pin(async { - self.config_override(config_override) - .send_orchestrator() - .await - }) - }), - config_override: None, - interceptors: vec![], - } - } - """, - *orchestratorScope, - ) - if (smithyRuntimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Sends the request and returns the response. - /// - /// If an error occurs, an `SdkError` will be returned with additional details that - /// can be matched against. - /// - /// By default, any retryable failures will be retried twice. Retry behavior - /// is configurable with the [RetryConfig](aws_smithy_types::retry::RetryConfig), which can be - /// set when configuring the client. - pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> { - self.send_orchestrator().await - } - /// Consumes this builder, creating a customizable operation that can be modified before being - /// sent. - // TODO(enableNewSmithyRuntimeCleanup): Remove `async` and `Result` once we switch to orchestrator - pub async fn customize( - self, - ) -> #{Result}< - #{CustomizableOperation}< - #{OperationOutput}, - #{OperationError}, - >, - #{SdkError}<#{OperationError}>, - > - { - #{Ok}(self.customize_orchestrator().await) - } - """, - *orchestratorScope, - ) + /// Consumes this builder, creating a customizable operation that can be modified before being sent. + pub fn customize( + self, + ) -> #{CustomizableOperation}<#{OperationOutput}, #{OperationError}, Self> { + #{CustomizableOperation}::new(self) } + """, + *orchestratorScope, + ) - rustTemplate( - """ - pub(crate) fn config_override( - mut self, - config_override: impl Into, - ) -> Self { - self.set_config_override(Some(config_override.into())); - self - } + rustTemplate( + """ + pub(crate) fn config_override( + mut self, + config_override: impl Into, + ) -> Self { + self.set_config_override(Some(config_override.into())); + self + } - pub(crate) fn set_config_override( - &mut self, - config_override: Option, - ) -> &mut Self { - self.config_override = config_override; - self - } - """, - ) - } + pub(crate) fn set_config_override( + &mut self, + config_override: Option, + ) -> &mut Self { + self.config_override = config_override; + self + } + """, + ) - PaginatorGenerator.paginatorType(codegenContext, generics, operation, retryClassifier) + PaginatorGenerator.paginatorType(codegenContext, operation) ?.also { paginatorType -> rustTemplate( """ /// Create a paginator for this request /// - /// Paginators are used by calling [`send().await`](#{Paginator}::send) which returns a `Stream`. - pub fn into_paginator(self) -> #{Paginator}${generics.inst} { + /// Paginators are used by calling [`send().await`](#{Paginator}::send) which returns a [`PaginationStream`](aws_smithy_async::future::pagination_stream::PaginationStream). + pub fn into_paginator(self) -> #{Paginator} { #{Paginator}::new(self.handle, self.inner) } """, @@ -647,25 +454,67 @@ class FluentClientGenerator( } } -private fun baseClientRuntimePluginsFn(runtimeConfig: RuntimeConfig): RuntimeType = +private fun baseClientRuntimePluginsFn(codegenContext: ClientCodegenContext): RuntimeType = codegenContext.runtimeConfig.let { rc -> RuntimeType.forInlineFun("base_client_runtime_plugins", ClientRustModule.config) { + val api = RuntimeType.smithyRuntimeApiClient(rc) + val rt = RuntimeType.smithyRuntime(rc) + val behaviorVersionError = "Invalid client configuration: A behavior major version must be set when sending a " + + "request or constructing a client. You must set it during client construction or by enabling the " + + "`${BehaviorVersionLatest.name}` cargo feature." rustTemplate( """ pub(crate) fn base_client_runtime_plugins( - config: crate::Config, + mut config: crate::Config, ) -> #{RuntimePlugins} { - #{RuntimePlugins}::new() - .with_client_plugin(config.clone()) + let mut configured_plugins = #{Vec}::new(); + ::std::mem::swap(&mut config.runtime_plugins, &mut configured_plugins); + ##[allow(unused_mut)] + let mut behavior_version = config.behavior_version.clone(); + #{update_bmv} + + let mut plugins = #{RuntimePlugins}::new() + // defaults + .with_client_plugins(#{default_plugins}( + #{DefaultPluginParams}::new() + .with_retry_partition_name(${codegenContext.serviceShape.sdkId().dq()}) + .with_behavior_version(behavior_version.expect(${behaviorVersionError.dq()})) + )) + // user config + .with_client_plugin( + #{StaticRuntimePlugin}::new() + .with_config(config.config.clone()) + .with_runtime_components(config.runtime_components.clone()) + ) + // codegen config .with_client_plugin(crate::config::ServiceRuntimePlugin::new(config)) - .with_client_plugin(#{NoAuthRuntimePlugin}::new()) + .with_client_plugin(#{NoAuthRuntimePlugin}::new()); + + for plugin in configured_plugins { + plugins = plugins.with_client_plugin(plugin); + } + plugins } """, *preludeScope, - "RuntimePlugins" to RuntimeType.runtimePlugins(runtimeConfig), - "NoAuthRuntimePlugin" to RuntimeType.smithyRuntime(runtimeConfig) - .resolve("client::auth::no_auth::NoAuthRuntimePlugin"), + "DefaultPluginParams" to rt.resolve("client::defaults::DefaultPluginParams"), + "default_plugins" to rt.resolve("client::defaults::default_plugins"), + "NoAuthRuntimePlugin" to rt.resolve("client::auth::no_auth::NoAuthRuntimePlugin"), + "RuntimePlugins" to RuntimeType.runtimePlugins(rc), + "StaticRuntimePlugin" to api.resolve("client::runtime_plugin::StaticRuntimePlugin"), + "update_bmv" to featureGatedBlock(BehaviorVersionLatest) { + rustTemplate( + """ + if behavior_version.is_none() { + behavior_version = Some(#{BehaviorVersion}::latest()); + } + + """, + "BehaviorVersion" to api.resolve("client::behavior_version::BehaviorVersion"), + ) + }, ) } +} /** * For a given `operation` shape, return a list of strings where each string describes the name and input type of one of @@ -693,7 +542,7 @@ private fun generateOperationShapeDocs( else -> "(undocumented)" } - "[`$builderInputDoc`]($builderInputLink) / [`$builderSetterDoc`]($builderSetterLink): $docs" + "[`$builderInputDoc`]($builderInputLink) / [`$builderSetterDoc`]($builderSetterLink):
required: **${memberShape.isRequired}**
$docs
" } } @@ -743,11 +592,18 @@ private fun OperationShape.fullyQualifiedFluentBuilder( * * _NOTE: This function generates the type names that appear under **"The fluent builder is configurable:"**_ */ -private fun MemberShape.asFluentBuilderInputDoc(symbolProvider: SymbolProvider): String { +internal fun MemberShape.asFluentBuilderInputDoc(symbolProvider: SymbolProvider): String { val memberName = symbolProvider.toMemberName(this) - val outerType = symbolProvider.toSymbol(this).rustType() + val outerType = symbolProvider.toSymbol(this).rustType().stripOuter() + // We generate Vec/HashMap helpers + val renderedType = when (outerType) { + is RustType.Vec -> listOf(outerType.member) + is RustType.HashMap -> listOf(outerType.key, outerType.member) + else -> listOf(outerType) + } + val args = renderedType.joinToString { it.asArgumentType(fullyQualified = false) } - return "$memberName(${outerType.stripOuter().asArgumentType(fullyQualified = false)})" + return "$memberName($args)" } /** diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerics.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerics.kt deleted file mode 100644 index 77b4a460198..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerics.kt +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.generators.client - -import software.amazon.smithy.codegen.core.Symbol -import software.amazon.smithy.rust.codegen.core.rustlang.GenericTypeArg -import software.amazon.smithy.rust.codegen.core.rustlang.RustGenerics -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType - -// TODO(enableNewSmithyRuntimeCleanup): Delete this client generics on/off switch headache -interface FluentClientGenerics { - /** Declaration with defaults set */ - val decl: Writable - - /** Instantiation of the Smithy client generics */ - val smithyInst: Writable - - /** Instantiation */ - val inst: String - - /** Bounds */ - val bounds: Writable - - /** Bounds for generated `send()` functions */ - fun sendBounds(operation: Symbol, operationOutput: Symbol, operationError: Symbol, retryClassifier: RuntimeType): Writable - - /** Convert this `FluentClientGenerics` into the more general `RustGenerics` */ - fun toRustGenerics(): RustGenerics - - /** bounds without where clause. If bounds does is not prefixed with `where\n`, then it gets the same value. **/ - val boundsWithoutWhereClause: Writable -} - -class NoClientGenerics(private val runtimeConfig: RuntimeConfig) : FluentClientGenerics { - /** Declaration with defaults set */ - override val decl = writable { } - - /** Instantiation of the Smithy client generics */ - override val smithyInst = writable { - rustTemplate( - "<#{DynConnector}, #{DynMiddleware}<#{DynConnector}>>", - "DynConnector" to RuntimeType.smithyClient(runtimeConfig).resolve("erase::DynConnector"), - "DynMiddleware" to RuntimeType.smithyClient(runtimeConfig).resolve("erase::DynMiddleware"), - ) - } - - /** Instantiation */ - override val inst = "" - - /** Trait bounds */ - override val bounds = writable { } - - override val boundsWithoutWhereClause = writable {} - - /** Bounds for generated `send()` functions */ - override fun sendBounds( - operation: Symbol, - operationOutput: Symbol, - operationError: Symbol, - retryClassifier: RuntimeType, - ): Writable = - writable { } - - override fun toRustGenerics() = RustGenerics() -} - -data class FlexibleClientGenerics( - val connectorDefault: RuntimeType?, - val middlewareDefault: RuntimeType?, - val retryDefault: RuntimeType?, - val client: RuntimeType, -) : FluentClientGenerics { - /** Declaration with defaults set */ - override val decl = writable { - rustTemplate( - "", - "c" to defaultType(connectorDefault), - "m" to defaultType(middlewareDefault), - "r" to defaultType(retryDefault), - ) - } - - /** Instantiation of the Smithy client generics */ - override val smithyInst = writable { rust("") } - - /** Instantiation */ - override val inst: String = "" - - /** Trait bounds */ - override val bounds = writable { - rustTemplate( - """ - where - #{bounds} - """, - "bounds" to boundsWithoutWhereClause, - ) - } - - override val boundsWithoutWhereClause = writable { - rustTemplate( - """ - C: #{client}::bounds::SmithyConnector, - M: #{client}::bounds::SmithyMiddleware, - R: #{client}::retry::NewRequestPolicy, - """, - "client" to client, - ) - } - - /** Bounds for generated `send()` functions */ - override fun sendBounds(operation: Symbol, operationOutput: Symbol, operationError: Symbol, retryClassifier: RuntimeType): Writable = writable { - rustTemplate( - """ - where - R::Policy: #{client}::bounds::SmithyRetryPolicy< - #{Operation}, - #{OperationOutput}, - #{OperationError}, - #{RetryClassifier} - >, - """, - "client" to client, - "Operation" to operation, - "OperationOutput" to operationOutput, - "OperationError" to operationError, - "RetryClassifier" to retryClassifier, - ) - } - - override fun toRustGenerics(): RustGenerics = RustGenerics( - GenericTypeArg("C", client.resolve("bounds::SmithyConnector")), - GenericTypeArg("M", client.resolve("bounds::SmithyMiddleware")), - GenericTypeArg("R", client.resolve("retry::NewRequestPolicy")), - ) - - private fun defaultType(default: RuntimeType?) = writable { - default?.also { rust("= #T", default) } - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt index 7e03e1ece5b..fd04a062248 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt @@ -19,55 +19,13 @@ import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomizat */ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext) : NamedCustomization() { private val runtimeConfig = codegenContext.runtimeConfig - private val runtimeMode = codegenContext.smithyRuntimeMode private val codegenScope = arrayOf( *preludeScope, - "default_provider" to RuntimeType.idempotencyToken(runtimeConfig).resolve("default_provider"), "IdempotencyTokenProvider" to RuntimeType.idempotencyToken(runtimeConfig).resolve("IdempotencyTokenProvider"), ) override fun section(section: ServiceConfig): Writable { return when (section) { - is ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("pub (crate) idempotency_token_provider: #{IdempotencyTokenProvider},", *codegenScope) - } - } - - ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Returns a copy of the idempotency token provider. - /// If a random token provider was configured, - /// a newly-randomized token provider will be returned. - pub fn idempotency_token_provider(&self) -> #{IdempotencyTokenProvider} { - self.inner.load::<#{IdempotencyTokenProvider}>().expect("the idempotency provider should be set").clone() - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Returns a copy of the idempotency token provider. - /// If a random token provider was configured, - /// a newly-randomized token provider will be returned. - pub fn idempotency_token_provider(&self) -> #{IdempotencyTokenProvider} { - self.idempotency_token_provider.clone() - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rustTemplate("idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>,", *codegenScope) - } - } - ServiceConfig.BuilderImpl -> writable { rustTemplate( """ @@ -80,43 +38,16 @@ class IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext *codegenScope, ) - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// Sets the idempotency token provider to use for service calls that require tokens. - pub fn set_idempotency_token_provider(&mut self, idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>) -> &mut Self { - self.inner.store_or_unset(idempotency_token_provider); - self - } - """, - *codegenScope, - ) - } else { - rustTemplate( - """ - /// Sets the idempotency token provider to use for service calls that require tokens. - pub fn set_idempotency_token_provider(&mut self, idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>) -> &mut Self { - self.idempotency_token_provider = idempotency_token_provider; - self - } - """, - *codegenScope, - ) - } - } - - ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - "layer.store_put(layer.load::<#{IdempotencyTokenProvider}>().cloned().unwrap_or_else(#{default_provider}));", - *codegenScope, - ) - } else { - rustTemplate( - "idempotency_token_provider: self.idempotency_token_provider.unwrap_or_else(#{default_provider}),", - *codegenScope, - ) - } + rustTemplate( + """ + /// Sets the idempotency token provider to use for service calls that require tokens. + pub fn set_idempotency_token_provider(&mut self, idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>) -> &mut Self { + self.config.store_or_unset(idempotency_token_provider); + self + } + """, + *codegenScope, + ) } is ServiceConfig.DefaultForTests -> writable { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt index 148353269f4..26f4cd7a634 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt @@ -13,15 +13,16 @@ import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.traits.IdempotencyTokenTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule +import software.amazon.smithy.rust.codegen.client.smithy.configReexport import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.docsOrFallback -import software.amazon.smithy.rust.codegen.core.rustlang.raw import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig @@ -29,10 +30,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section -import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations -import software.amazon.smithy.rust.codegen.core.smithy.makeOptional import software.amazon.smithy.rust.codegen.core.util.hasTrait -import software.amazon.smithy.rust.codegen.core.util.letIf /** * [ServiceConfig] is the parent type of sections that can be overridden when generating a config for a service. @@ -101,11 +99,6 @@ sealed class ServiceConfig(name: String) : Section(name) { */ data class OperationConfigOverride(val cfg: String) : ServiceConfig("ToRuntimePlugin") - /** - * A section for appending additional runtime plugins, stored in [interceptorsField], to [interceptors] - */ - data class RuntimePluginInterceptors(val interceptors: String, val interceptorsField: String) : ServiceConfig("ToRuntimePluginInterceptors") - /** * A section for extra functionality that needs to be defined with the config module */ @@ -196,77 +189,38 @@ fun loadFromConfigBag(innerTypeName: String, newtype: RuntimeType): Writable = w * 2. convenience setter (non-optional) * 3. standard setter (&mut self) */ -fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext): ConfigCustomization = object : ConfigCustomization() { - private val runtimeMode = codegenContext.smithyRuntimeMode - - override fun section(section: ServiceConfig): Writable { - return when (section) { - ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - docsOrFallback(param.getterDocs) - val t = when (param.optional) { - true -> param.type.makeOptional() - false -> param.type - } - rust("pub (crate) ${param.name}: #T,", t) - } - } - - ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rust("${param.name}: #T,", param.type.makeOptional()) - } - } - - ServiceConfig.BuilderImpl -> writable { - docsOrFallback(param.setterDocs) - rust( - """ - pub fn ${param.name}(mut self, ${param.name}: impl Into<#T>) -> Self { - self.set_${param.name}(Some(${param.name}.into())); - self +fun standardConfigParam(param: ConfigParam, codegenContext: ClientCodegenContext): ConfigCustomization = + object : ConfigCustomization() { + override fun section(section: ServiceConfig): Writable { + return when (section) { + ServiceConfig.BuilderImpl -> writable { + docsOrFallback(param.setterDocs) + rust( + """ + pub fn ${param.name}(mut self, ${param.name}: impl Into<#T>) -> Self { + self.set_${param.name}(Some(${param.name}.into())); + self }""", - param.type, - ) + param.type, + ) - docsOrFallback(param.setterDocs) - if (runtimeMode.defaultToOrchestrator) { + docsOrFallback(param.setterDocs) rustTemplate( """ pub fn set_${param.name}(&mut self, ${param.name}: Option<#{T}>) -> &mut Self { - self.inner.store_or_unset(${param.name}.map(#{newtype})); + self.config.store_or_unset(${param.name}.map(#{newtype})); self } """, "T" to param.type, "newtype" to param.newtype!!, ) - } else { - rust( - """ - pub fn set_${param.name}(&mut self, ${param.name}: Option<#T>) -> &mut Self { - self.${param.name} = ${param.name}; - self - } - """, - param.type, - ) } - } - ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToMiddleware) { - val default = "".letIf(!param.optional) { ".unwrap_or_default() " } - rust("${param.name}: self.${param.name}$default,") - } + else -> emptySection } - - is ServiceConfig.OperationConfigOverride -> emptySection - - else -> emptySection } } -} fun ServiceShape.needsIdempotencyToken(model: Model): Boolean { val operationIndex = OperationIndex.of(model) @@ -305,64 +259,133 @@ class ServiceConfigGenerator( extraCustomizations: List, ): ServiceConfigGenerator { val baseFeatures = mutableListOf() - if (codegenContext.serviceShape.needsIdempotencyToken(codegenContext.model)) { - baseFeatures.add(IdempotencyTokenProviderCustomization(codegenContext)) - } return ServiceConfigGenerator(codegenContext, baseFeatures + extraCustomizations) } } - private val runtimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) - private val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig) + private val moduleUseName = codegenContext.moduleUseName() + private val runtimeConfig = codegenContext.runtimeConfig + private val enableUserConfigurableRuntimePlugins = codegenContext.enableUserConfigurableRuntimePlugins + private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) val codegenScope = arrayOf( - "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), + *preludeScope, + "BoxError" to RuntimeType.boxError(runtimeConfig), "CloneableLayer" to smithyTypes.resolve("config_bag::CloneableLayer"), "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(codegenContext.runtimeConfig), - "FrozenLayer" to smithyTypes.resolve("config_bag::FrozenLayer"), - "InterceptorRegistrar" to runtimeApi.resolve("client::interceptors::InterceptorRegistrar"), - "Layer" to smithyTypes.resolve("config_bag::Layer"), - "RuntimePlugin" to runtimeApi.resolve("client::runtime_plugin::RuntimePlugin"), - *preludeScope, + "Cow" to RuntimeType.Cow, + "FrozenLayer" to configReexport(smithyTypes.resolve("config_bag::FrozenLayer")), + "Layer" to configReexport(smithyTypes.resolve("config_bag::Layer")), + "Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"), + "RuntimeComponentsBuilder" to configReexport(RuntimeType.runtimeComponentsBuilder(runtimeConfig)), + "RuntimePlugin" to configReexport(RuntimeType.runtimePlugin(runtimeConfig)), + "SharedRuntimePlugin" to configReexport(RuntimeType.sharedRuntimePlugin(runtimeConfig)), + "runtime_plugin" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin"), + "BehaviorVersion" to configReexport( + RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::behavior_version::BehaviorVersion"), + ), ) - private val moduleUseName = codegenContext.moduleUseName() - private val runtimeMode = codegenContext.smithyRuntimeMode + + private fun behaviorMv() = writable { + val docs = """ + /// Sets the [`behavior major version`](crate::config::BehaviorVersion). + /// + /// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards + /// compatible. For example, a change which introduces new default timeouts or a new retry-mode for + /// all operations might be the ideal behavior but could break existing applications. + /// + /// ## Examples + /// + /// Set the behavior major version to `latest`. This is equivalent to enabling the `behavior-version-latest` cargo feature. + /// ```no_run + /// use $moduleUseName::config::BehaviorVersion; + /// + /// let config = $moduleUseName::Config::builder() + /// .behavior_version(BehaviorVersion::latest()) + /// // ... + /// .build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + /// + /// Customizing behavior major version: + /// ```no_run + /// use $moduleUseName::config::BehaviorVersion; + /// + /// let config = $moduleUseName::Config::builder() + /// .behavior_version(BehaviorVersion::v2023_11_09()) + /// // ... + /// .build(); + /// let client = $moduleUseName::Client::from_conf(config); + /// ``` + """ + rustTemplate( + """ + $docs + pub fn behavior_version(mut self, behavior_version: crate::config::BehaviorVersion) -> Self { + self.set_behavior_version(Some(behavior_version)); + self + } + + $docs + pub fn set_behavior_version(&mut self, behavior_version: Option) -> &mut Self { + self.behavior_version = behavior_version; + self + } + + /// Convenience method to set the latest behavior major version + /// + /// This is equivalent to enabling the `behavior-version-latest` Cargo feature + pub fn behavior_version_latest(mut self) -> Self { + self.set_behavior_version(Some(crate::config::BehaviorVersion::latest())); + self + } + """, + *codegenScope, + ) + } fun render(writer: RustWriter) { - writer.docs("Service config.\n") + writer.docs("Configuration for a $moduleUseName service client.\n") customizations.forEach { it.section(ServiceConfig.ConfigStructAdditionalDocs)(writer) } - Attribute(Attribute.derive(RuntimeType.Clone)).render(writer) + Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer) writer.rustBlock("pub struct Config") { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - "inner: #{FrozenLayer},", - *codegenScope, - ) - } + rustTemplate( + """ + // Both `config` and `cloneable` are the same config, but the cloneable one + // is kept around so that it is possible to convert back into a builder. This can be + // optimized in the future. + pub(crate) config: #{FrozenLayer}, + cloneable: #{CloneableLayer}, + pub(crate) runtime_components: #{RuntimeComponentsBuilder}, + pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, + behavior_version: #{Option}<#{BehaviorVersion}>, + """, + *codegenScope, + ) customizations.forEach { it.section(ServiceConfig.ConfigStruct)(this) } } - // Custom implementation for Debug so we don't need to enforce Debug down the chain - writer.rustBlock("impl std::fmt::Debug for Config") { + writer.rustBlock("impl Config") { writer.rustTemplate( """ - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut config = f.debug_struct("Config"); - config.finish() - } + /// Constructs a config builder. + pub fn builder() -> Builder { Builder::default() } """, ) - } - - writer.rustBlock("impl Config") { writer.rustTemplate( """ - /// Constructs a config builder. - pub fn builder() -> Builder { Builder::default() } + /// Converts this config back into a builder so that it can be tweaked. + pub fn to_builder(&self) -> Builder { + Builder { + config: self.cloneable.clone(), + runtime_components: self.runtime_components.clone(), + runtime_plugins: self.runtime_plugins.clone(), + behavior_version: self.behavior_version.clone(), + } + } """, ) customizations.forEach { @@ -371,28 +394,36 @@ class ServiceConfigGenerator( } writer.docs("Builder for creating a `Config`.") - writer.raw("#[derive(Clone, Default)]") + Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer) writer.rustBlock("pub struct Builder") { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - "inner: #{CloneableLayer},", - *codegenScope, - ) - } + rustTemplate( + """ + pub(crate) config: #{CloneableLayer}, + pub(crate) runtime_components: #{RuntimeComponentsBuilder}, + pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>, + pub(crate) behavior_version: #{Option}<#{BehaviorVersion}>, + """, + *codegenScope, + ) customizations.forEach { it.section(ServiceConfig.BuilderStruct)(this) } } - // Custom implementation for Debug so we don't need to enforce Debug down the chain - writer.rustBlock("impl std::fmt::Debug for Builder") { + // Custom implementation of Default to give the runtime components builder a name + writer.rustBlockTemplate("impl #{Default} for Builder", *codegenScope) { writer.rustTemplate( """ - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut config = f.debug_struct("Builder"); - config.finish() + fn default() -> Self { + Self { + config: #{Default}::default(), + runtime_components: #{RuntimeComponentsBuilder}::new("service config"), + runtime_plugins: #{Default}::default(), + behavior_version: #{Default}::default(), + } } """, + *codegenScope, ) } @@ -402,6 +433,40 @@ class ServiceConfigGenerator( customizations.forEach { it.section(ServiceConfig.BuilderImpl)(this) } + behaviorMv()(this) + + val visibility = if (enableUserConfigurableRuntimePlugins) { + "pub" + } else { + "pub(crate)" + } + + docs("Adds a runtime plugin to the config.") + if (!enableUserConfigurableRuntimePlugins) { + Attribute.AllowUnused.render(this) + } + rustTemplate( + """ + $visibility fn runtime_plugin(mut self, plugin: impl #{RuntimePlugin} + 'static) -> Self { + self.push_runtime_plugin(#{SharedRuntimePlugin}::new(plugin)); + self + } + """, + *codegenScope, + ) + docs("Adds a runtime plugin to the config.") + if (!enableUserConfigurableRuntimePlugins) { + Attribute.AllowUnused.render(this) + } + rustTemplate( + """ + $visibility fn push_runtime_plugin(&mut self, plugin: #{SharedRuntimePlugin}) -> &mut Self { + self.runtime_plugins.push(plugin); + self + } + """, + *codegenScope, + ) val testUtilOnly = Attribute(Attribute.cfg(Attribute.any(Attribute.feature(TestUtilFeature.name), writable("test")))) @@ -409,8 +474,9 @@ class ServiceConfigGenerator( testUtilOnly.render(this) Attribute.AllowUnusedMut.render(this) docs("Apply test defaults to the builder") - rustBlock("pub fn set_test_defaults(&mut self) -> &mut Self") { + rustBlock("pub fn apply_test_defaults(&mut self) -> &mut Self") { customizations.forEach { it.section(ServiceConfig.DefaultForTests("self"))(this) } + rustTemplate("self.behavior_version = #{Some}(crate::config::BehaviorVersion::latest());", *preludeScope) rust("self") } @@ -418,72 +484,41 @@ class ServiceConfigGenerator( Attribute.AllowUnusedMut.render(this) docs("Apply test defaults to the builder") rustBlock("pub fn with_test_defaults(mut self) -> Self") { - rust("self.set_test_defaults(); self") + rust("self.apply_test_defaults(); self") } docs("Builds a [`Config`].") - if (runtimeMode.defaultToOrchestrator) { - rust("##[allow(unused_mut)]") - rustBlock("pub fn build(mut self) -> Config") { + rust("##[allow(unused_mut)]") + rustBlock("pub fn build(mut self) -> Config") { + rustTemplate( + """ + let mut layer = self.config; + """, + *codegenScope, + ) + customizations.forEach { + it.section(ServiceConfig.BuilderBuild)(this) + } + rustBlock("Config") { + customizations.forEach { + it.section(ServiceConfig.BuilderBuildExtras)(this) + } rustTemplate( """ - ##[allow(unused_imports)] - use #{ConfigBagAccessors}; - // The builder is being turned into a service config. While doing so, we'd like to avoid - // requiring that items created and stored _during_ the build method be `Clone`, since they - // will soon be part of a `FrozenLayer` owned by the service config. So we will convert the - // current `CloneableLayer` into a `Layer` that does not impose the `Clone` requirement. - let layer: #{Layer} = self - .inner - .into(); - let mut layer = layer.with_name("$moduleUseName::config::config"); + config: #{Layer}::from(layer.clone()).with_name("$moduleUseName::config::Config").freeze(), + cloneable: layer, + runtime_components: self.runtime_components, + runtime_plugins: self.runtime_plugins, + behavior_version: self.behavior_version, """, *codegenScope, ) - customizations.forEach { - it.section(ServiceConfig.BuilderBuild)(this) - } - rustBlock("Config") { - customizations.forEach { - it.section(ServiceConfig.BuilderBuildExtras)(this) - } - rust("inner: layer.freeze(),") - } - } - } else { - rustBlock("pub fn build(self) -> Config") { - rustBlock("Config") { - customizations.forEach { - it.section(ServiceConfig.BuilderBuild)(this) - } - } } } + customizations.forEach { it.section(ServiceConfig.Extras)(writer) } } } - - fun renderRuntimePluginImplForSelf(writer: RustWriter) { - writer.rustTemplate( - """ - impl #{RuntimePlugin} for Config { - fn config(&self) -> #{Option}<#{FrozenLayer}> { - #{Some}(self.inner.clone()) - } - - fn interceptors(&self, _interceptors: &mut #{InterceptorRegistrar}) { - #{interceptors} - } - } - - """, - *codegenScope, - "config" to writable { writeCustomizations(customizations, ServiceConfig.OperationConfigOverride("cfg")) }, - "interceptors" to writable { - writeCustomizations(customizations, ServiceConfig.RuntimePluginInterceptors("_interceptors", "self")) - }, - ) - } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/StalledStreamProtectionConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/StalledStreamProtectionConfigCustomization.kt new file mode 100644 index 00000000000..03164cbfab1 --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/StalledStreamProtectionConfigCustomization.kt @@ -0,0 +1,126 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators.config + +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.smithy.configReexport +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization + +class StalledStreamProtectionDecorator : ClientCodegenDecorator { + override val name: String = "StalledStreamProtection" + override val order: Byte = 0 + + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List { + return baseCustomizations + StalledStreamProtectionConfigCustomization(codegenContext) + } + + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List { + return baseCustomizations + StalledStreamProtectionOperationCustomization(codegenContext) + } +} + +/** + * Add a `stalled_stream_protection` field to Service config. + */ +class StalledStreamProtectionConfigCustomization(codegenContext: ClientCodegenContext) : NamedCustomization() { + private val rc = codegenContext.runtimeConfig + private val codegenScope = arrayOf( + *preludeScope, + "StalledStreamProtectionConfig" to configReexport(RuntimeType.smithyRuntimeApi(rc).resolve("client::stalled_stream_protection::StalledStreamProtectionConfig")), + ) + + override fun section(section: ServiceConfig): Writable { + return when (section) { + ServiceConfig.ConfigImpl -> writable { + rustTemplate( + """ + /// Return a reference to the stalled stream protection configuration contained in this config, if any. + pub fn stalled_stream_protection(&self) -> #{Option}<&#{StalledStreamProtectionConfig}> { + self.config.load::<#{StalledStreamProtectionConfig}>() + } + """, + *codegenScope, + ) + } + ServiceConfig.BuilderImpl -> writable { + rustTemplate( + """ + /// Set the [`StalledStreamProtectionConfig`](#{StalledStreamProtectionConfig}) + /// to configure protection for stalled streams. + pub fn stalled_stream_protection( + mut self, + stalled_stream_protection_config: #{StalledStreamProtectionConfig} + ) -> Self { + self.set_stalled_stream_protection(#{Some}(stalled_stream_protection_config)); + self + } + """, + *codegenScope, + ) + + rustTemplate( + """ + /// Set the [`StalledStreamProtectionConfig`](#{StalledStreamProtectionConfig}) + /// to configure protection for stalled streams. + pub fn set_stalled_stream_protection( + &mut self, + stalled_stream_protection_config: #{Option}<#{StalledStreamProtectionConfig}> + ) -> &mut Self { + self.config.store_or_unset(stalled_stream_protection_config); + self + } + """, + *codegenScope, + ) + } + + else -> emptySection + } + } +} + +class StalledStreamProtectionOperationCustomization( + codegenContext: ClientCodegenContext, +) : OperationCustomization() { + private val rc = codegenContext.runtimeConfig + + override fun section(section: OperationSection): Writable = writable { + when (section) { + is OperationSection.AdditionalInterceptors -> { + val stalledStreamProtectionModule = RuntimeType.smithyRuntime(rc).resolve("client::stalled_stream_protection") + section.registerInterceptor(rc, this) { + // Currently, only response bodies are protected/supported because + // we can't count on hyper to poll a request body on wake. + rustTemplate( + """ + #{StalledStreamProtectionInterceptor}::new(#{Kind}::ResponseBody) + """, + *preludeScope, + "StalledStreamProtectionInterceptor" to stalledStreamProtectionModule.resolve("StalledStreamProtectionInterceptor"), + "Kind" to stalledStreamProtectionModule.resolve("StalledStreamProtectionInterceptorKind"), + ) + } + } + else -> { } + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt index 21d4f24aef6..d90fd441529 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt @@ -22,6 +22,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderSection +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSection @@ -34,6 +35,7 @@ class ErrorGenerator( private val shape: StructureShape, private val error: ErrorTrait, private val implCustomizations: List, + private val structSettings: StructSettings, ) { private val runtimeConfig = symbolProvider.config.runtimeConfig private val symbol = symbolProvider.toSymbol(shape) @@ -59,6 +61,7 @@ class ErrorGenerator( } }, ), + structSettings, ).render() ErrorImplGenerator( diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt index 8e17d5bd9d8..280b06c2cac 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt @@ -28,14 +28,12 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.errorMetadata import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.unhandledError import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.Section import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations import software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors import software.amazon.smithy.rust.codegen.core.smithy.transformers.operationErrors import software.amazon.smithy.rust.codegen.core.util.UNREACHABLE -import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.toSnakeCase @@ -54,7 +52,7 @@ class OperationErrorGenerator( private val runtimeConfig = symbolProvider.config.runtimeConfig private val errorMetadata = errorMetadata(symbolProvider.config.runtimeConfig) private val createUnhandledError = - RuntimeType.smithyHttp(runtimeConfig).resolve("result::CreateUnhandledError") + RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::result::CreateUnhandledError") private fun operationErrors(): List = (operationOrEventStream as OperationShape).operationErrors(model).map { it.asStructureShape().get() } @@ -75,22 +73,6 @@ class OperationErrorGenerator( visibility = Visibility.PUBLIC, ) - // TODO(deprecated): Remove this temporary alias. This was added so that the compiler - // points customers in the right direction when they are upgrading. Unfortunately there's no - // way to provide better backwards compatibility on this change. - val kindDeprecationMessage = "Operation `*Error/*ErrorKind` types were combined into a single `*Error` enum. " + - "The `.kind` field on `*Error` no longer exists and isn't needed anymore (you can just match on the " + - "error directly since it's an enum now)." - writer.rust( - """ - /// Do not use this. - /// - /// $kindDeprecationMessage - ##[deprecated(note = ${kindDeprecationMessage.dq()})] - pub type ${errorSymbol.name}Kind = ${errorSymbol.name}; - """, - ) - writer.rust("/// Error type for the `${errorSymbol.name}` operation.") meta.render(writer) writer.rustBlock("enum ${errorSymbol.name}") { @@ -100,15 +82,28 @@ class OperationErrorGenerator( val errorVariantSymbol = symbolProvider.toSymbol(errorVariant) write("${errorVariantSymbol.name}(#T),", errorVariantSymbol) } - rust( + rustTemplate( """ /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). - Unhandled(#T), + #{deprecation} + Unhandled(#{Unhandled}), """, - unhandledError(runtimeConfig), + "deprecation" to writable { renderUnhandledErrorDeprecation(runtimeConfig, errorSymbol.name) }, + "Unhandled" to unhandledError(runtimeConfig), ) } - writer.rustBlock("impl #T for ${errorSymbol.name}", createUnhandledError) { + + writer.renderImpl(errorSymbol, errors) + writer.renderImplStdError(errorSymbol, errors) + writer.renderImplDisplay(errorSymbol, errors) + writer.renderImplProvideErrorKind(errorSymbol, errors) + writer.renderImplProvideErrorMetadata(errorSymbol, errors) + writer.renderImplCreateUnhandledError(errorSymbol) + writer.writeCustomizations(customizations, ErrorSection.OperationErrorAdditionalTraitImpls(errorSymbol, errors)) + } + + private fun RustWriter.renderImplCreateUnhandledError(errorSymbol: Symbol) { + rustBlock("impl #T for ${errorSymbol.name}", createUnhandledError) { rustBlockTemplate( """ fn create_unhandled_error( @@ -120,39 +115,58 @@ class OperationErrorGenerator( "StdError" to RuntimeType.StdError, "ErrorMeta" to errorMetadata, ) { - rust( - """ - Self::Unhandled({ - let mut builder = #T::builder().source(source); - builder.set_meta(meta); - builder.build() - }) - """, - unhandledError(runtimeConfig), + rustTemplate( + """Self::Unhandled(#{Unhandled} { source, meta: meta.unwrap_or_default() })""", + "Unhandled" to unhandledError(runtimeConfig), ) } } - writer.rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.Display) { + } + + private fun RustWriter.renderImplDisplay(errorSymbol: Symbol, errors: List) { + rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.Display) { rustBlock("fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result") { - delegateToVariants(errors) { - writable { rust("_inner.fmt(f)") } + delegateToVariants(errors) { variantMatch -> + when (variantMatch) { + is VariantMatch.Unhandled -> writable { + rustTemplate( + """ + if let #{Some}(code) = #{ProvideErrorMetadata}::code(self) { + write!(f, "unhandled error ({code})") + } else { + f.write_str("unhandled error") + } + """, + *preludeScope, + "ProvideErrorMetadata" to RuntimeType.provideErrorMetadataTrait(runtimeConfig), + ) + } + is VariantMatch.Modeled -> writable { rust("_inner.fmt(f)") } + } } } } + } + private fun RustWriter.renderImplProvideErrorMetadata(errorSymbol: Symbol, errors: List) { val errorMetadataTrait = RuntimeType.provideErrorMetadataTrait(runtimeConfig) - writer.rustBlock("impl #T for ${errorSymbol.name}", errorMetadataTrait) { + rustBlock("impl #T for ${errorSymbol.name}", errorMetadataTrait) { rustBlock("fn meta(&self) -> &#T", errorMetadata(runtimeConfig)) { - delegateToVariants(errors) { - writable { rust("#T::meta(_inner)", errorMetadataTrait) } + delegateToVariants(errors) { variantMatch -> + writable { + when (variantMatch) { + is VariantMatch.Unhandled -> rust("&_inner.meta") + is VariantMatch.Modeled -> rust("#T::meta(_inner)", errorMetadataTrait) + } + } } } } + } - writer.writeCustomizations(customizations, ErrorSection.OperationErrorAdditionalTraitImpls(errorSymbol, errors)) - + private fun RustWriter.renderImplProvideErrorKind(errorSymbol: Symbol, errors: List) { val retryErrorKindT = RuntimeType.retryErrorKind(symbolProvider.config.runtimeConfig) - writer.rustBlock( + rustBlock( "impl #T for ${errorSymbol.name}", RuntimeType.provideErrorKind(symbolProvider.config.runtimeConfig), ) { @@ -182,60 +196,71 @@ class OperationErrorGenerator( } } } + } - writer.rustBlock("impl ${errorSymbol.name}") { - writer.rustTemplate( + private fun RustWriter.renderImpl(errorSymbol: Symbol, errors: List) { + rustBlock("impl ${errorSymbol.name}") { + rustTemplate( """ /// Creates the `${errorSymbol.name}::Unhandled` variant from any error type. pub fn unhandled(err: impl #{Into}<#{Box}>) -> Self { - Self::Unhandled(#{Unhandled}::builder().source(err).build()) + Self::Unhandled(#{Unhandled} { source: err.into(), meta: #{Default}::default() }) } - /// Creates the `${errorSymbol.name}::Unhandled` variant from a `#{error_metadata}`. - pub fn generic(err: #{error_metadata}) -> Self { - Self::Unhandled(#{Unhandled}::builder().source(err.clone()).meta(err).build()) + /// Creates the `${errorSymbol.name}::Unhandled` variant from an [`ErrorMetadata`](#{ErrorMetadata}). + pub fn generic(err: #{ErrorMetadata}) -> Self { + Self::Unhandled(#{Unhandled} { source: err.clone().into(), meta: err }) } """, *preludeScope, - "error_metadata" to errorMetadata, + "ErrorMetadata" to errorMetadata, "StdError" to RuntimeType.StdError, "Unhandled" to unhandledError(runtimeConfig), ) - writer.docs( + docs( """ Returns error metadata, which includes the error code, message, request ID, and potentially additional information. """, ) - writer.rustBlock("pub fn meta(&self) -> &#T", errorMetadata) { - rust("use #T;", RuntimeType.provideErrorMetadataTrait(runtimeConfig)) + rustBlock("pub fn meta(&self) -> &#T", errorMetadata) { rustBlock("match self") { errors.forEach { error -> val errorVariantSymbol = symbolProvider.toSymbol(error) - rust("Self::${errorVariantSymbol.name}(e) => e.meta(),") + rustTemplate( + "Self::${errorVariantSymbol.name}(e) => #{ProvideErrorMetadata}::meta(e),", + "ProvideErrorMetadata" to RuntimeType.provideErrorMetadataTrait(runtimeConfig), + ) } - rust("Self::Unhandled(e) => e.meta(),") + rust("Self::Unhandled(e) => &e.meta,") } } errors.forEach { error -> val errorVariantSymbol = symbolProvider.toSymbol(error) val fnName = errorVariantSymbol.name.toSnakeCase() - writer.rust("/// Returns `true` if the error kind is `${errorSymbol.name}::${errorVariantSymbol.name}`.") - writer.rustBlock("pub fn is_$fnName(&self) -> bool") { + rust("/// Returns `true` if the error kind is `${errorSymbol.name}::${errorVariantSymbol.name}`.") + rustBlock("pub fn is_$fnName(&self) -> bool") { rust("matches!(self, Self::${errorVariantSymbol.name}(_))") } } } + } - writer.rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.StdError) { + private fun RustWriter.renderImplStdError(errorSymbol: Symbol, errors: List) { + rustBlock("impl #T for ${errorSymbol.name}", RuntimeType.StdError) { rustBlockTemplate( "fn source(&self) -> #{Option}<&(dyn #{StdError} + 'static)>", *preludeScope, "StdError" to RuntimeType.StdError, ) { - delegateToVariants(errors) { - writable { - rustTemplate("#{Some}(_inner)", *preludeScope) + delegateToVariants(errors) { variantMatch -> + when (variantMatch) { + is VariantMatch.Unhandled -> writable { + rustTemplate("#{Some}(&*_inner.source)", *preludeScope) + } + is VariantMatch.Modeled -> writable { + rustTemplate("#{Some}(_inner)", *preludeScope) + } } } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt index c11fbfecf86..5a33941845b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt @@ -9,6 +9,7 @@ import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata import software.amazon.smithy.rust.codegen.core.rustlang.RustModule @@ -21,12 +22,15 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.unhandledError +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations +import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError import software.amazon.smithy.rust.codegen.core.smithy.transformers.allErrors import software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors @@ -65,6 +69,8 @@ class ServiceErrorGenerator( crate.withModule(RustModule.private("error_meta")) { renderDefinition() renderImplDisplay() + renderImplFromBuildError() + renderImplProvideErrorMetadata() // Every operation error can be converted into service::Error operations.forEach { operationShape -> // operation errors @@ -86,7 +92,7 @@ class ServiceErrorGenerator( allErrors.forEach { rust("Error::${symbolProvider.toSymbol(it).name}(inner) => inner.source(),") } - rust("Error::Unhandled(inner) => inner.source()") + rustTemplate("Error::Unhandled(inner) => #{Some}(&*inner.source)", *preludeScope) } } } @@ -102,12 +108,38 @@ class ServiceErrorGenerator( allErrors.forEach { rust("Error::${symbolProvider.toSymbol(it).name}(inner) => inner.fmt(f),") } - rust("Error::Unhandled(inner) => inner.fmt(f)") + rustTemplate( + """ + Error::Unhandled(_) => if let #{Some}(code) = #{ProvideErrorMetadata}::code(self) { + write!(f, "unhandled error ({code})") + } else { + f.write_str("unhandled error") + } + """, + *preludeScope, + "ProvideErrorMetadata" to RuntimeType.provideErrorMetadataTrait(codegenContext.runtimeConfig), + ) } } } } + private fun RustWriter.renderImplFromBuildError() { + rustTemplate( + """ + impl From<#{BuildError}> for Error { + fn from(value: #{BuildError}) -> Self { + Error::Unhandled(#{Unhandled} { source: value.into(), meta: #{Default}::default() }) + } + } + + """, + *preludeScope, + "BuildError" to codegenContext.runtimeConfig.operationBuildError(), + "Unhandled" to unhandledError(codegenContext.runtimeConfig), + ) + } + private fun RustWriter.renderImplFrom(errorSymbol: Symbol, errors: List) { if (errors.isNotEmpty() || CodegenTarget.CLIENT == codegenContext.target) { val operationErrors = errors.map { model.expectShape(it) } @@ -126,10 +158,10 @@ class ServiceErrorGenerator( rustTemplate( """ _ => Error::Unhandled( - #{Unhandled}::builder() - .meta(#{ProvideErrorMetadata}::meta(&err).clone()) - .source(err) - .build() + #{Unhandled} { + meta: #{ProvideErrorMetadata}::meta(&err).clone(), + source: err.into(), + } ), """, "Unhandled" to unhandledError(codegenContext.runtimeConfig), @@ -160,6 +192,32 @@ class ServiceErrorGenerator( } } + private fun RustWriter.renderImplProvideErrorMetadata() { + rustTemplate( + """ + impl #{ProvideErrorMetadata} for Error { + fn meta(&self) -> &#{ErrorMetadata} { + match self { + #{matchers} + Self::Unhandled(inner) => &inner.meta, + } + } + } + """, + *preludeScope, + "ErrorMetadata" to RuntimeType.smithyTypes(codegenContext.runtimeConfig) + .resolve("error::metadata::ErrorMetadata"), + "ProvideErrorMetadata" to RuntimeType.smithyTypes(codegenContext.runtimeConfig) + .resolve("error::metadata::ProvideErrorMetadata"), + "matchers" to writable { + allErrors.forEach { errorShape -> + val errSymbol = symbolProvider.toSymbol(errorShape) + rust("Self::${errSymbol.name}(inner) => inner.meta(),") + } + }, + ) + } + private fun RustWriter.renderDefinition() { rust("/// All possible error types for this service.") RustMetadata( @@ -174,7 +232,57 @@ class ServiceErrorGenerator( rust("${sym.name}(#T),", sym) } docs("An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).") + renderUnhandledErrorDeprecation(codegenContext.runtimeConfig, "Error") rust("Unhandled(#T)", unhandledError(codegenContext.runtimeConfig)) } } } + +fun unhandledError(rc: RuntimeConfig): RuntimeType = RuntimeType.forInlineFun( + "Unhandled", + // Place in a sealed module so that it can't be referenced at all + RustModule.pubCrate("sealed_unhandled", ClientRustModule.Error), +) { + rustTemplate( + """ + /// This struct is not intended to be used. + /// + /// This struct holds information about an unhandled error, + /// but that information should be obtained by using the + /// [`ProvideErrorMetadata`](#{ProvideErrorMetadata}) trait + /// on the error type. + /// + /// This struct intentionally doesn't yield any useful information itself. + #{deprecation} + ##[derive(Debug)] + pub struct Unhandled { + pub(crate) source: #{BoxError}, + pub(crate) meta: #{ErrorMetadata}, + } + """, + "BoxError" to RuntimeType.smithyRuntimeApi(rc).resolve("box_error::BoxError"), + "deprecation" to writable { renderUnhandledErrorDeprecation(rc) }, + "ErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ErrorMetadata"), + "ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"), + ) +} + +fun RustWriter.renderUnhandledErrorDeprecation(rc: RuntimeConfig, errorName: String? = null) { + val link = if (errorName != null) { + "##impl-ProvideErrorMetadata-for-$errorName" + } else { + "#{ProvideErrorMetadata}" + } + val message = """ + Matching `Unhandled` directly is not forwards compatible. Instead, match using a + variable wildcard pattern and check `.code()`:
+    `err if err.code() == Some("SpecificExceptionCode") => { /* handle the error */ }`
+ See [`ProvideErrorMetadata`]($link) for what information is available for the error. + """.trimIndent() + // `.dq()` doesn't quite do what we want here since we actually want a Rust multi-line string + val messageEscaped = message.replace("\"", "\\\"").replace("\n", " \\\n").replace("
", "\n") + rustTemplate( + """##[deprecated(note = "$messageEscaped")]""", + "ProvideErrorMetadata" to RuntimeType.provideErrorMetadataTrait(rc), + ) +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/MakeOperationGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/MakeOperationGenerator.kt deleted file mode 100644 index d79817df40c..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/MakeOperationGenerator.kt +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol - -import software.amazon.smithy.model.shapes.BlobShape -import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.http.RequestBindingGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientAdditionalPayloadContext -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.docs -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.withBlock -import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations -import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator -import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation -import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol -import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.findStreamingMember -import software.amazon.smithy.rust.codegen.core.util.inputShape -import software.amazon.smithy.rust.codegen.core.util.letIf -import software.amazon.smithy.rust.codegen.core.util.sdkId - -// TODO(enableNewSmithyRuntimeCleanup): Delete this class when cleaning up `enableNewSmithyRuntime` -/** Generates the `make_operation` function on input structs */ -open class MakeOperationGenerator( - protected val codegenContext: CodegenContext, - private val protocol: Protocol, - private val bodyGenerator: ProtocolPayloadGenerator, - private val public: Boolean, - /** Whether to include default values for content-length and content-type */ - private val includeDefaultPayloadHeaders: Boolean, - private val functionName: String = "make_operation", -) { - protected val model = codegenContext.model - protected val runtimeConfig = codegenContext.runtimeConfig - protected val symbolProvider = codegenContext.symbolProvider - private val httpBindingResolver = protocol.httpBindingResolver - private val defaultClassifier = RuntimeType.smithyHttp(runtimeConfig) - .resolve("retry::DefaultResponseRetryClassifier") - - private val sdkId = codegenContext.serviceShape.sdkId() - - private val codegenScope = arrayOf( - *preludeScope, - "config" to ClientRustModule.config, - "header_util" to RuntimeType.smithyHttp(runtimeConfig).resolve("header"), - "http" to RuntimeType.Http, - "operation" to RuntimeType.operationModule(runtimeConfig), - "HttpRequestBuilder" to RuntimeType.HttpRequestBuilder, - "OpBuildError" to runtimeConfig.operationBuildError(), - "SdkBody" to RuntimeType.sdkBody(runtimeConfig), - "SharedPropertyBag" to RuntimeType.smithyHttp(runtimeConfig).resolve("property_bag::SharedPropertyBag"), - "RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"), - ) - - fun generateMakeOperation( - implBlockWriter: RustWriter, - shape: OperationShape, - customizations: List, - ) { - val operationName = symbolProvider.toSymbol(shape).name - val baseReturnType = buildOperationType(implBlockWriter, shape, customizations) - val returnType = - "#{Result}<$baseReturnType, ${implBlockWriter.format(runtimeConfig.operationBuildError())}>" - val outputSymbol = symbolProvider.toSymbol(shape) - - val takesOwnership = bodyGenerator.payloadMetadata(shape).takesOwnership - val mut = customizations.any { it.mutSelf() } - val consumes = customizations.any { it.consumesSelf() } || takesOwnership - val self = "self".letIf(mut) { "mut $it" }.letIf(!consumes) { "&$it" } - val fnType = if (public) "pub async fn" else "async fn" - - implBlockWriter.docs("Consumes the builder and constructs an Operation<#D>", outputSymbol) - // For codegen simplicity - Attribute.AllowUnusedMut.render(implBlockWriter) - // For codegen simplicity, allow `let x = ...; x` - Attribute.AllowClippyLetAndReturn.render(implBlockWriter) - // Allows builders that don’t consume the input borrow - Attribute.AllowClippyNeedlessBorrow.render(implBlockWriter) - - implBlockWriter.rustBlockTemplate( - "$fnType $functionName($self, _config: &#{config}::Config) -> $returnType", - *codegenScope, - ) { - rustTemplate( - """ - assert_ne!(_config.retry_config().map(|rc| rc.mode()), #{Option}::Some(#{RetryMode}::Adaptive), "Adaptive retry mode is unsupported, please use Standard mode or disable retries."); - """, - *codegenScope, - ) - writeCustomizations(customizations, OperationSection.MutateInput(customizations, "self", "_config")) - - withBlock("let mut request = {", "};") { - createHttpRequest(this, shape) - } - rustTemplate("let mut properties = #{SharedPropertyBag}::new();", *codegenScope) - - // When the payload is a `ByteStream`, `into_inner()` already returns an `SdkBody`, so we mute this - // Clippy warning to make the codegen a little simpler in that case. - Attribute.AllowClippyUselessConversion.render(this) - withBlockTemplate("let body = #{SdkBody}::from(", ");", *codegenScope) { - bodyGenerator.generatePayload( - this, - "self", - shape, - ClientAdditionalPayloadContext(propertyBagAvailable = true), - ) - val streamingMember = shape.inputShape(model).findStreamingMember(model) - val isBlobStreaming = streamingMember != null && model.expectShape(streamingMember.target) is BlobShape - if (isBlobStreaming) { - // Consume the `ByteStream` into its inner `SdkBody`. - rust(".into_inner()") - } - } - if (includeDefaultPayloadHeaders && needsContentLength(shape)) { - rustTemplate( - """ - if let #{Some}(content_length) = body.content_length() { - request = #{header_util}::set_request_header_if_absent(request, #{http}::header::CONTENT_LENGTH, content_length); - } - """, - *codegenScope, - ) - } - rust("""let request = request.body(body).expect("should be valid request");""") - rustTemplate( - """ - let mut request = #{operation}::Request::from_parts(request, properties); - """, - *codegenScope, - ) - writeCustomizations(customizations, OperationSection.MutateRequest(customizations, "request", "_config")) - rustTemplate( - """ - let op = #{operation}::Operation::new(request, #{OperationType}::new()) - .with_metadata(#{operation}::Metadata::new(${operationName.dq()}, ${sdkId.dq()})); - """, - *codegenScope, - "OperationType" to symbolProvider.toSymbol(shape), - ) - writeCustomizations(customizations, OperationSection.FinalizeOperation(customizations, "op", "_config")) - rustTemplate("#{Ok}(op)", *codegenScope) - } - } - - private fun buildOperationType( - writer: RustWriter, - shape: OperationShape, - customizations: List, - ): String { - val operationT = RuntimeType.operation(runtimeConfig) - val output = buildOperationTypeOutput(writer, shape) - val retry = buildOperationTypeRetry(writer, customizations) - return with(writer) { "${format(operationT)}<$output, $retry>" } - } - - private fun buildOperationTypeOutput(writer: RustWriter, shape: OperationShape): String = - writer.format(symbolProvider.toSymbol(shape)) - - private fun buildOperationTypeRetry(writer: RustWriter, customizations: List): String = - (customizations.firstNotNullOfOrNull { it.retryType() } ?: defaultClassifier).let { writer.format(it) } - - private fun needsContentLength(operationShape: OperationShape): Boolean { - return protocol.httpBindingResolver.requestBindings(operationShape) - .any { it.location == HttpLocation.DOCUMENT || it.location == HttpLocation.PAYLOAD } - } - - open fun createHttpRequest(writer: RustWriter, operationShape: OperationShape) { - val httpBindingGenerator = RequestBindingGenerator( - codegenContext, - protocol, - operationShape, - ) - val contentType = httpBindingResolver.requestContentType(operationShape) - httpBindingGenerator.renderUpdateHttpBuilder(writer) - - writer.rust("let mut builder = update_http_builder(&self, #T::new())?;", RuntimeType.HttpRequestBuilder) - if (includeDefaultPayloadHeaders && contentType != null) { - writer.rustTemplate( - "builder = #{header_util}::set_request_header_if_absent(builder, #{http}::header::CONTENT_TYPE, ${contentType.dq()});", - *codegenScope, - ) - } - for (header in protocol.additionalRequestHeaders(operationShape)) { - writer.rustTemplate( - """ - builder = #{header_util}::set_request_header_if_absent( - builder, - #{http}::header::HeaderName::from_static(${header.first.dq()}), - ${header.second.dq()} - ); - """, - *codegenScope, - ) - } - writer.rust("builder") - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt index 61b0c420473..8ce713b457d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt @@ -26,8 +26,8 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations -import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName +import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol @@ -51,28 +51,25 @@ class ProtocolParserGenerator( private val symbolProvider: RustSymbolProvider = codegenContext.symbolProvider private val codegenScope = arrayOf( + "Bytes" to RuntimeType.Bytes, + "Headers" to RuntimeType.headers(codegenContext.runtimeConfig), + "Response" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve("http::Response"), "http" to RuntimeType.Http, "operation" to RuntimeType.operationModule(codegenContext.runtimeConfig), - "Bytes" to RuntimeType.Bytes, "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), - // TODO(enableNewSmithyRuntimeCleanup): Remove the `PropertyBag` below - "PropertyBag" to RuntimeType.smithyHttp(codegenContext.runtimeConfig).resolve("property_bag::PropertyBag"), ) fun parseResponseFn( operationShape: OperationShape, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `propertyBagAvailable` flag as if it were always set to `false` when switching to the orchestrator - propertyBagAvailable: Boolean, customizations: List, ): RuntimeType { val outputShape = operationShape.outputShape(model) val outputSymbol = symbolProvider.toSymbol(outputShape) val errorSymbol = symbolProvider.symbolForOperationError(operationShape) - val fnNameSuffix = if (propertyBagAvailable) "http_response_with_props" else "http_response" - return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = fnNameSuffix) { fnName -> + return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "http_response") { fnName -> Attribute.AllowClippyUnnecessaryWraps.render(this) rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{http}::header::HeaderMap, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", *codegenScope, "O" to outputSymbol, "E" to errorSymbol, @@ -83,7 +80,6 @@ class ProtocolParserGenerator( outputShape, httpBindingResolver.responseBindings(operationShape), errorSymbol, - propertyBagAvailable, customizations, ) } @@ -101,7 +97,7 @@ class ProtocolParserGenerator( return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "http_error") { fnName -> Attribute.AllowClippyUnnecessaryWraps.render(this) rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{http}::header::HeaderMap, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>", *codegenScope, "O" to outputSymbol, "E" to errorSymbol, @@ -137,7 +133,7 @@ class ProtocolParserGenerator( withBlock("Err(match error_code {", "})") { val errors = operationShape.operationErrors(model) errors.forEach { error -> - val errorShape = model.expectShape(error.id, software.amazon.smithy.model.shapes.StructureShape::class.java) + val errorShape = model.expectShape(error.id, StructureShape::class.java) val variantName = symbolProvider.toSymbol(model.expectShape(error.id)).name val errorCode = httpBindingResolver.errorCode(errorShape).dq() withBlock( @@ -145,7 +141,7 @@ class ProtocolParserGenerator( "}),", errorSymbol, ) { - software.amazon.smithy.rust.codegen.core.rustlang.Attribute.AllowUnusedMut.render(this) + Attribute.AllowUnusedMut.render(this) assignment("mut tmp") { rustBlock("") { renderShapeParser( @@ -153,7 +149,6 @@ class ProtocolParserGenerator( errorShape, httpBindingResolver.errorResponseBindings(errorShape), errorSymbol, - false, listOf( object : OperationCustomization() { override fun section(section: OperationSection): Writable = { @@ -166,14 +161,19 @@ class ProtocolParserGenerator( ) } } - if (errorShape.errorMessageMember() != null) { - rust( - """ - if tmp.message.is_none() { - tmp.message = _error_message; - } - """, - ) + val errorMessageMember = errorShape.errorMessageMember() + // If the message member is optional and wasn't set, we set a generic error message. + if (errorMessageMember != null) { + val symbol = symbolProvider.toSymbol(errorMessageMember) + if (symbol.isOptional()) { + rust( + """ + if tmp.message.is_none() { + tmp.message = _error_message; + } + """, + ) + } } rust("tmp") } @@ -189,24 +189,15 @@ class ProtocolParserGenerator( fun parseStreamingResponseFn( operationShape: OperationShape, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `propertyBagAvailable` flag as if it were always set to `false` when switching to the orchestrator - propertyBagAvailable: Boolean, customizations: List, ): RuntimeType { val outputShape = operationShape.outputShape(model) val outputSymbol = symbolProvider.toSymbol(outputShape) val errorSymbol = symbolProvider.symbolForOperationError(operationShape) - val fnNameSuffix = if (propertyBagAvailable) "http_response_with_props" else "http_response" - return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = fnNameSuffix) { fnName -> + return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "http_response") { fnName -> Attribute.AllowClippyUnnecessaryWraps.render(this) - val propertiesArg = if (propertyBagAvailable) { - Attribute.AllowUnusedVariables.render(this) - ", properties: &#{PropertyBag}" - } else { - "" - } rustBlockTemplate( - "pub fn $fnName(response: &mut #{http}::Response<#{SdkBody}>$propertiesArg) -> std::result::Result<#{O}, #{E}>", + "pub fn $fnName(response: &mut #{Response}) -> std::result::Result<#{O}, #{E}>", *codegenScope, "O" to outputSymbol, "E" to errorSymbol, @@ -228,7 +219,6 @@ class ProtocolParserGenerator( outputShape, httpBindingResolver.responseBindings(operationShape), errorSymbol, - propertyBagAvailable, customizations, ) } @@ -241,8 +231,6 @@ class ProtocolParserGenerator( outputShape: StructureShape, bindings: List, errorSymbol: Symbol, - // TODO(enableNewSmithyRuntimeCleanup): Remove the `propertyBagAvailable` flag as if it were always set to `false` when switching to the orchestrator - propertyBagAvailable: Boolean, customizations: List, ) { val httpBindingGenerator = ResponseBindingGenerator(protocol, codegenContext, operationShape) @@ -276,18 +264,15 @@ class ProtocolParserGenerator( } } - val err = if (BuilderGenerator.hasFallibleBuilder(outputShape, symbolProvider)) { - ".map_err(${format(errorSymbol)}::unhandled)?" - } else { - "" + val mapErr = writable { + rust("#T::unhandled", errorSymbol) } writeCustomizations( customizations, - OperationSection.MutateOutput(customizations, operationShape, "_response_headers", propertyBagAvailable), + OperationSection.MutateOutput(customizations, operationShape, "_response_headers"), ) - - rust("output.build()$err") + codegenContext.builderInstantiator().finalizeBuilder("output", outputShape, mapErr)(this) } /** diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt index 22c64d36e04..133b0dddf72 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGenerator.kt @@ -20,7 +20,6 @@ import software.amazon.smithy.protocoltests.traits.HttpResponseTestCase import software.amazon.smithy.protocoltests.traits.HttpResponseTestsTrait import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.customizations.EndpointPrefixGenerator import software.amazon.smithy.rust.codegen.client.smithy.generators.ClientInstantiator import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.allow @@ -34,7 +33,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait @@ -45,10 +43,11 @@ import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.outputShape import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import java.util.logging.Logger +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType as RT data class ClientCreationParams( val codegenContext: ClientCodegenContext, - val connectorName: String, + val httpClientName: String, val configBuilderName: String, val clientName: String, ) @@ -70,36 +69,19 @@ class DefaultProtocolTestGenerator( override val operationShape: OperationShape, private val renderClientCreation: RustWriter.(ClientCreationParams) -> Unit = { params -> - if (params.codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rustTemplate( - """ - let smithy_client = #{Builder}::new() - .connector(${params.connectorName}) - .middleware(#{MapRequestLayer}::for_mapper(#{SmithyEndpointStage}::new())) - .build(); - let ${params.clientName} = #{Client}::with_config(smithy_client, ${params.configBuilderName}.build()); - """, - "Client" to ClientRustModule.root.toType().resolve("Client"), - "Builder" to ClientRustModule.client.toType().resolve("Builder"), - "SmithyEndpointStage" to RuntimeType.smithyHttp(codegenContext.runtimeConfig) - .resolve("endpoint::middleware::SmithyEndpointStage"), - "MapRequestLayer" to RuntimeType.smithyHttpTower(codegenContext.runtimeConfig) - .resolve("map_request::MapRequestLayer"), - ) - } else { - rustTemplate( - """ - let ${params.clientName} = #{Client}::from_conf( - ${params.configBuilderName} - .http_connector(${params.connectorName}) - .build() - ); - """, - "Client" to ClientRustModule.root.toType().resolve("Client"), - ) - } + rustTemplate( + """ + let ${params.clientName} = #{Client}::from_conf( + ${params.configBuilderName} + .http_client(${params.httpClientName}) + .build() + ); + """, + "Client" to ClientRustModule.root.toType().resolve("Client"), + ) }, ) : ProtocolTestGenerator { + private val rc = codegenContext.runtimeConfig private val logger = Logger.getLogger(javaClass.name) private val inputShape = operationShape.inputShape(codegenContext.model) @@ -110,8 +92,9 @@ class DefaultProtocolTestGenerator( private val instantiator = ClientInstantiator(codegenContext) private val codegenScope = arrayOf( - "SmithyHttp" to RuntimeType.smithyHttp(codegenContext.runtimeConfig), - "AssertEq" to RuntimeType.PrettyAssertions.resolve("assert_eq!"), + "SmithyHttp" to RT.smithyHttp(rc), + "AssertEq" to RT.PrettyAssertions.resolve("assert_eq!"), + "Uri" to RT.Http.resolve("Uri"), ) sealed class TestCase { @@ -220,22 +203,21 @@ class DefaultProtocolTestGenerator( } } } ?: writable { } + // support test cases that set the host value, e.g: https://github.com/smithy-lang/smithy/blob/be68f3bbdfe5bf50a104b387094d40c8069f16b1/smithy-aws-protocol-tests/model/restJson1/endpoint-paths.smithy#L19 + val host = "https://${httpRequestTestCase.host.orNull() ?: "example.com"}".dq() rustTemplate( """ - let (conn, request_receiver) = #{capture_request}(None); - let config_builder = #{config}::Config::builder().with_test_defaults().endpoint_resolver("https://example.com"); + let (http_client, request_receiver) = #{capture_request}(None); + let config_builder = #{config}::Config::builder().with_test_defaults().endpoint_url($host); #{customParams} """, - "capture_request" to CargoDependency.smithyClient(codegenContext.runtimeConfig) - .toDevDependency() - .withFeature("test-util") - .toType() - .resolve("test_connection::capture_request"), + "capture_request" to CargoDependency.smithyRuntimeTestUtil(rc).toType() + .resolve("client::http::test_util::capture_request"), "config" to ClientRustModule.config, "customParams" to customParams, ) - renderClientCreation(this, ClientCreationParams(codegenContext, "conn", "config_builder", "client")) + renderClientCreation(this, ClientCreationParams(codegenContext, "http_client", "config_builder", "client")) writeInline("let result = ") instantiator.renderFluentCall(this, "client", operationShape, inputShape, httpRequestTestCase.params) @@ -245,51 +227,13 @@ class DefaultProtocolTestGenerator( rust("let _ = dbg!(result);") rust("""let http_request = request_receiver.expect_request();""") - with(httpRequestTestCase) { - // Override the endpoint for tests that set a `host`, for example: - // https://github.com/awslabs/smithy/blob/be68f3bbdfe5bf50a104b387094d40c8069f16b1/smithy-aws-protocol-tests/model/restJson1/endpoint-paths.smithy#L19 - host.orNull()?.also { host -> - val withScheme = "http://$host" - when (val bindings = EndpointPrefixGenerator.endpointTraitBindings(codegenContext, operationShape)) { - null -> rust("let endpoint_prefix = None;") - else -> { - withBlock("let input = ", ";") { - instantiator.render(this@renderHttpRequestTestCase, inputShape, httpRequestTestCase.params) - } - withBlock("let endpoint_prefix = Some({", "}.unwrap());") { - bindings.render(this, "input", codegenContext.smithyRuntimeMode, generateValidation = false) - } - } - } - rustTemplate( - """ - let mut http_request = http_request; - let ep = #{SmithyHttp}::endpoint::Endpoint::mutable(${withScheme.dq()}).expect("valid endpoint"); - ep.set_endpoint(http_request.uri_mut(), endpoint_prefix.as_ref()).expect("valid endpoint"); - """, - *codegenScope, - ) - } - rustTemplate( - """ - #{AssertEq}(http_request.method(), ${method.dq()}); - #{AssertEq}(http_request.uri().path(), ${uri.dq()}); - """, - *codegenScope, - ) - resolvedHost.orNull()?.also { host -> - rustTemplate( - """#{AssertEq}(http_request.uri().host().expect("host should be set"), ${host.dq()});""", - *codegenScope, - ) - } - } checkQueryParams(this, httpRequestTestCase.queryParams) checkForbidQueryParams(this, httpRequestTestCase.forbidQueryParams) checkRequiredQueryParams(this, httpRequestTestCase.requireQueryParams) checkHeaders(this, "http_request.headers()", httpRequestTestCase.headers) checkForbidHeaders(this, "http_request.headers()", httpRequestTestCase.forbidHeaders) checkRequiredHeaders(this, "http_request.headers()", httpRequestTestCase.requireHeaders) + if (protocolSupport.requestBodySerialization) { // "If no request body is defined, then no assertions are made about the body of the message." httpRequestTestCase.body.orNull()?.also { body -> @@ -305,6 +249,22 @@ class DefaultProtocolTestGenerator( if (!httpRequestTestCase.vendorParams.isEmpty) { logger.warning("Test case provided vendorParams but these were ignored") } + + rustTemplate( + """ + let uri: #{Uri} = http_request.uri().parse().expect("invalid URI sent"); + #{AssertEq}(http_request.method(), ${method.dq()}, "method was incorrect"); + #{AssertEq}(uri.path(), ${uri.dq()}, "path was incorrect"); + """, + *codegenScope, + ) + + resolvedHost.orNull()?.also { host -> + rustTemplate( + """#{AssertEq}(uri.host().expect("host should be set"), ${host.dq()});""", + *codegenScope, + ) + } } } @@ -334,7 +294,11 @@ class DefaultProtocolTestGenerator( writeInline("let expected_output =") instantiator.render(this, expectedShape, testCase.params) write(";") - write("let mut http_response = #T::new()", RuntimeType.HttpResponseBuilder) + rustTemplate( + "let mut http_response = #{Response}::try_from(#{HttpResponseBuilder}::new()", + "Response" to RT.smithyRuntimeApi(rc).resolve("http::Response"), + "HttpResponseBuilder" to RT.HttpResponseBuilder, + ) testCase.headers.forEach { (key, value) -> writeWithNoFormatting(".header(${key.dq()}, ${value.dq()})") } @@ -342,61 +306,44 @@ class DefaultProtocolTestGenerator( """ .status(${testCase.code}) .body(#T::from(${testCase.body.orNull()?.dq()?.replace("#", "##") ?: "vec![]"})) - .unwrap(); + .unwrap() + ).unwrap(); """, - RuntimeType.sdkBody(runtimeConfig = codegenContext.runtimeConfig), + RT.sdkBody(runtimeConfig = rc), ) - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rust( - "let mut op_response = #T::new(http_response);", - RuntimeType.operationModule(codegenContext.runtimeConfig).resolve("Response"), - ) - rustTemplate( - """ - use #{parse_http_response}; - let parser = #{op}::new(); - let parsed = parser.parse_unloaded(&mut op_response); - let parsed = parsed.unwrap_or_else(|| { - let (http_response, _) = op_response.into_parts(); - let http_response = http_response.map(|body|#{copy_from_slice}(body.bytes().unwrap())); - <#{op} as #{parse_http_response}>::parse_loaded(&parser, &http_response) - }); - """, - "op" to operationSymbol, - "copy_from_slice" to RuntimeType.Bytes.resolve("copy_from_slice"), - "parse_http_response" to RuntimeType.parseHttpResponse(codegenContext.runtimeConfig), - ) - } else { - rustTemplate( - """ - use #{ResponseDeserializer}; - let de = #{OperationDeserializer}; - let parsed = de.deserialize_streaming(&mut http_response); - let parsed = parsed.unwrap_or_else(|| { - let http_response = http_response.map(|body| { - #{SdkBody}::from(#{copy_from_slice}(body.bytes().unwrap())) - }); - de.deserialize_nonstreaming(&http_response) + rustTemplate( + """ + use #{DeserializeResponse}; + use #{RuntimePlugin}; + + let op = #{Operation}::new(); + let config = op.config().expect("the operation has config"); + let de = config.load::<#{SharedResponseDeserializer}>().expect("the config must have a deserializer"); + + let parsed = de.deserialize_streaming(&mut http_response); + let parsed = parsed.unwrap_or_else(|| { + let http_response = http_response.map(|body| { + #{SdkBody}::from(#{copy_from_slice}(body.bytes().unwrap())) }); - """, - "OperationDeserializer" to codegenContext.symbolProvider.moduleForShape(operationShape).toType() - .resolve("${operationSymbol.name}ResponseDeserializer"), - "copy_from_slice" to RuntimeType.Bytes.resolve("copy_from_slice"), - "ResponseDeserializer" to CargoDependency.smithyRuntimeApi(codegenContext.runtimeConfig).toType() - .resolve("client::orchestrator::ResponseDeserializer"), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), - ) - } + de.deserialize_nonstreaming(&http_response) + }); + """, + "copy_from_slice" to RT.Bytes.resolve("copy_from_slice"), + "SharedResponseDeserializer" to RT.smithyRuntimeApiClient(rc) + .resolve("client::ser_de::SharedResponseDeserializer"), + "Operation" to codegenContext.symbolProvider.toSymbol(operationShape), + "DeserializeResponse" to RT.smithyRuntimeApiClient(rc).resolve("client::ser_de::DeserializeResponse"), + "RuntimePlugin" to RT.runtimePlugin(rc), + "SdkBody" to RT.sdkBody(rc), + ) if (expectedShape.hasTrait()) { val errorSymbol = codegenContext.symbolProvider.symbolForOperationError(operationShape) val errorVariant = codegenContext.symbolProvider.toSymbol(expectedShape).name rust("""let parsed = parsed.expect_err("should be error response");""") - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - rustTemplate( - """let parsed: &#{Error} = parsed.as_operation_error().expect("operation error").downcast_ref().unwrap();""", - "Error" to codegenContext.symbolProvider.symbolForOperationError(operationShape), - ) - } + rustTemplate( + """let parsed: &#{Error} = parsed.as_operation_error().expect("operation error").downcast_ref().unwrap();""", + "Error" to codegenContext.symbolProvider.symbolForOperationError(operationShape), + ) rustBlock("if let #T::$errorVariant(parsed) = parsed", errorSymbol) { compareMembers(expectedShape) } @@ -404,14 +351,10 @@ class DefaultProtocolTestGenerator( rust("panic!(\"wrong variant: Got: {:?}. Expected: {:?}\", parsed, expected_output);") } } else { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rust("let parsed = parsed.unwrap();") - } else { - rustTemplate( - """let parsed: #{Output} = *parsed.expect("should be successful response").downcast().unwrap();""", - "Output" to codegenContext.symbolProvider.toSymbol(expectedShape), - ) - } + rustTemplate( + """let parsed = parsed.expect("should be successful response").downcast::<#{Output}>().unwrap();""", + "Output" to codegenContext.symbolProvider.toSymbol(expectedShape), + ) compareMembers(outputShape) } } @@ -432,9 +375,7 @@ class DefaultProtocolTestGenerator( } else { when (codegenContext.model.expectShape(member.target)) { is DoubleShape, is FloatShape -> { - addUseImports( - RuntimeType.protocolTest(codegenContext.runtimeConfig, "FloatEquals").toSymbol(), - ) + addUseImports(RT.protocolTest(rc, "FloatEquals").toSymbol()) rust( """ assert!(parsed.$memberName.float_equals(&expected_output.$memberName), @@ -467,11 +408,11 @@ class DefaultProtocolTestGenerator( // When we generate a body instead of a stub, drop the trailing `;` and enable the assertion assertOk(rustWriter) { rustWriter.write( - "#T(&body, ${ + "#T(body, ${ rustWriter.escape(body).dq() }, #T::from(${(mediaType ?: "unknown").dq()}))", - RuntimeType.protocolTest(codegenContext.runtimeConfig, "validate_body"), - RuntimeType.protocolTest(codegenContext.runtimeConfig, "MediaType"), + RT.protocolTest(rc, "validate_body"), + RT.protocolTest(rc, "MediaType"), ) } } @@ -512,7 +453,7 @@ class DefaultProtocolTestGenerator( assertOk(rustWriter) { write( "#T($actualExpression, $variableName)", - RuntimeType.protocolTest(codegenContext.runtimeConfig, "validate_headers"), + RT.protocolTest(rc, "validate_headers"), ) } } @@ -566,7 +507,7 @@ class DefaultProtocolTestGenerator( assertOk(rustWriter) { write( "#T($actualExpression, $expectedVariableName)", - RuntimeType.protocolTest(codegenContext.runtimeConfig, checkFunction), + RT.protocolTest(rc, checkFunction), ) } } @@ -576,7 +517,7 @@ class DefaultProtocolTestGenerator( * for pretty printing protocol test helper results */ private fun assertOk(rustWriter: RustWriter, inner: Writable) { - rustWriter.write("#T(", RuntimeType.protocolTest(codegenContext.runtimeConfig, "assert_ok")) + rustWriter.write("#T(", RT.protocolTest(rc, "assert_ok")) inner(rustWriter) rustWriter.write(");") } @@ -610,6 +551,20 @@ class DefaultProtocolTestGenerator( // These tests are not even attempted to be generated, either because they will not compile // or because they are flaky - private val DisableTests = setOf() + private val DisableTests = setOf( + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2891): Implement support for `@requestCompression` + "SDKAppendedGzipAfterProvidedEncoding_restJson1", + "SDKAppendedGzipAfterProvidedEncoding_restXml", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_0", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_1", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsQuery", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_ec2Query", + "SDKAppliedContentEncoding_awsJson1_0", + "SDKAppliedContentEncoding_awsJson1_1", + "SDKAppliedContentEncoding_awsQuery", + "SDKAppliedContentEncoding_ec2Query", + "SDKAppliedContentEncoding_restJson1", + "SDKAppliedContentEncoding_restXml", + ) } } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt index fb21d70cd22..f079cf1026a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt @@ -10,7 +10,6 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule import software.amazon.smithy.rust.codegen.client.smithy.generators.http.RequestBindingGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientAdditionalPayloadContext import software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -35,10 +34,8 @@ class RequestSerializerGenerator( private val httpBindingResolver = protocol.httpBindingResolver private val symbolProvider = codegenContext.symbolProvider private val codegenScope by lazy { - val runtimeApi = RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig) + val runtimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig) val interceptorContext = runtimeApi.resolve("client::interceptors::context") - val orchestrator = runtimeApi.resolve("client::orchestrator") - val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig) arrayOf( *preludeScope, "BoxError" to RuntimeType.boxError(codegenContext.runtimeConfig), @@ -46,18 +43,17 @@ class RequestSerializerGenerator( "ConfigBag" to RuntimeType.configBag(codegenContext.runtimeConfig), "header_util" to RuntimeType.smithyHttp(codegenContext.runtimeConfig).resolve("header"), "http" to RuntimeType.Http, - "HttpRequest" to orchestrator.resolve("HttpRequest"), + "HttpRequest" to runtimeApi.resolve("client::orchestrator::HttpRequest"), "HttpRequestBuilder" to RuntimeType.HttpRequestBuilder, "Input" to interceptorContext.resolve("Input"), "operation" to RuntimeType.operationModule(codegenContext.runtimeConfig), - "RequestSerializer" to orchestrator.resolve("RequestSerializer"), + "SerializeRequest" to runtimeApi.resolve("client::ser_de::SerializeRequest"), "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), "HeaderSerializationSettings" to RuntimeType.forInlineDependency( InlineDependency.serializationSettings( codegenContext.runtimeConfig, ), ).resolve("HeaderSerializationSettings"), - "TypedBox" to smithyTypes.resolve("type_erasure::TypedBox"), ) } @@ -70,17 +66,17 @@ class RequestSerializerGenerator( """ ##[derive(Debug)] struct $serializerName; - impl #{RequestSerializer} for $serializerName { + impl #{SerializeRequest} for $serializerName { ##[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)] fn serialize_input(&self, input: #{Input}, _cfg: &mut #{ConfigBag}) -> #{Result}<#{HttpRequest}, #{BoxError}> { - let input = #{TypedBox}::<#{ConcreteInput}>::assume_from(input).expect("correct type").unwrap(); + let input = input.downcast::<#{ConcreteInput}>().expect("correct type"); let _header_serialization_settings = _cfg.load::<#{HeaderSerializationSettings}>().cloned().unwrap_or_default(); let mut request_builder = { #{create_http_request} }; let body = #{generate_body}; #{add_content_length} - #{Ok}(request_builder.body(body).expect("valid request")) + #{Ok}(request_builder.body(body).expect("valid request").try_into().unwrap()) } } """, @@ -90,12 +86,7 @@ class RequestSerializerGenerator( "generate_body" to writable { if (bodyGenerator != null) { val body = writable { - bodyGenerator.generatePayload( - this, - "input", - operationShape, - ClientAdditionalPayloadContext(propertyBagAvailable = false), - ) + bodyGenerator.generatePayload(this, "input", operationShape) } val streamingMember = inputShape.findStreamingMember(codegenContext.model) val isBlobStreaming = diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt index e08ea15f13a..2f183c3444e 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt @@ -33,9 +33,9 @@ class ResponseDeserializerGenerator( private val codegenScope by lazy { val interceptorContext = - CargoDependency.smithyRuntimeApi(runtimeConfig).toType().resolve("client::interceptors::context") + CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType().resolve("client::interceptors::context") val orchestrator = - CargoDependency.smithyRuntimeApi(runtimeConfig).toType().resolve("client::orchestrator") + CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType().resolve("client::orchestrator") arrayOf( *preludeScope, "Error" to interceptorContext.resolve("Error"), @@ -44,10 +44,9 @@ class ResponseDeserializerGenerator( "Output" to interceptorContext.resolve("Output"), "OutputOrError" to interceptorContext.resolve("OutputOrError"), "OrchestratorError" to orchestrator.resolve("OrchestratorError"), - "ResponseDeserializer" to orchestrator.resolve("ResponseDeserializer"), + "DeserializeResponse" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve("client::ser_de::DeserializeResponse"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "SdkError" to RuntimeType.sdkError(runtimeConfig), - "TypedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypedBox"), "debug_span" to RuntimeType.Tracing.resolve("debug_span"), "type_erase_result" to typeEraseResult(), ) @@ -62,7 +61,7 @@ class ResponseDeserializerGenerator( """ ##[derive(Debug)] struct ${operationName}ResponseDeserializer; - impl #{ResponseDeserializer} for ${operationName}ResponseDeserializer { + impl #{DeserializeResponse} for ${operationName}ResponseDeserializer { #{deserialize_streaming} fn deserialize_nonstreaming(&self, response: &#{HttpResponse}) -> #{OutputOrError} { @@ -95,19 +94,21 @@ class ResponseDeserializerGenerator( rustTemplate( """ fn deserialize_streaming(&self, response: &mut #{HttpResponse}) -> #{Option}<#{OutputOrError}> { + ##[allow(unused_mut)] + let mut force_error = false; #{BeforeParseResponse} // If this is an error, defer to the non-streaming parser - if !response.status().is_success() && response.status().as_u16() != $successCode { + if (!response.status().is_success() && response.status().as_u16() != $successCode) || force_error { return #{None}; } #{Some}(#{type_erase_result}(#{parse_streaming_response}(response))) } """, *codegenScope, - "parse_streaming_response" to parserGenerator.parseStreamingResponseFn(operationShape, false, customizations), + "parse_streaming_response" to parserGenerator.parseStreamingResponseFn(operationShape, customizations), "BeforeParseResponse" to writable { - writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) + writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response", "force_error", body = null)) }, ) } @@ -137,8 +138,10 @@ class ResponseDeserializerGenerator( let (success, status) = (response.status().is_success(), response.status().as_u16()); let headers = response.headers(); let body = response.body().bytes().expect("body loaded"); + ##[allow(unused_mut)] + let mut force_error = false; #{BeforeParseResponse} - let parse_result = if !success && status != $successCode { + let parse_result = if !success && status != $successCode || force_error { #{parse_error}(status, headers, body) } else { #{parse_response}(status, headers, body) @@ -147,9 +150,9 @@ class ResponseDeserializerGenerator( """, *codegenScope, "parse_error" to parserGenerator.parseErrorFn(operationShape, customizations), - "parse_response" to parserGenerator.parseResponseFn(operationShape, false, customizations), + "parse_response" to parserGenerator.parseResponseFn(operationShape, customizations), "BeforeParseResponse" to writable { - writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) + writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response", "force_error", "body")) }, ) } @@ -162,8 +165,8 @@ class ResponseDeserializerGenerator( O: ::std::fmt::Debug + #{Send} + #{Sync} + 'static, E: ::std::error::Error + std::fmt::Debug + #{Send} + #{Sync} + 'static, { - result.map(|output| #{TypedBox}::new(output).erase()) - .map_err(|error| #{TypedBox}::new(error).erase_error()) + result.map(|output| #{Output}::erase(output)) + .map_err(|error| #{Error}::erase(error)) .map_err(#{Into}::into) } """, diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt index 7c949c92a27..cb9c7db7e5a 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt @@ -60,7 +60,7 @@ private val CLIENT_PROTOCOL_SUPPORT = ProtocolSupport( ) private class ClientAwsJsonFactory(private val version: AwsJsonVersion) : - ProtocolGeneratorFactory { + ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = if (compatibleWithAwsQuery(codegenContext.serviceShape, version)) { AwsQueryCompatible(codegenContext, AwsJson(codegenContext, version)) @@ -68,8 +68,8 @@ private class ClientAwsJsonFactory(private val version: AwsJsonVersion) : AwsJson(codegenContext, version) } - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, protocol(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, protocol(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT @@ -77,40 +77,40 @@ private class ClientAwsJsonFactory(private val version: AwsJsonVersion) : serviceShape.hasTrait() && version == AwsJsonVersion.Json10 } -private class ClientAwsQueryFactory : ProtocolGeneratorFactory { +private class ClientAwsQueryFactory : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = AwsQueryProtocol(codegenContext) - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, protocol(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, protocol(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT } -private class ClientRestJsonFactory : ProtocolGeneratorFactory { +private class ClientRestJsonFactory : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = RestJson(codegenContext) - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, RestJson(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, RestJson(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT } -private class ClientEc2QueryFactory : ProtocolGeneratorFactory { +private class ClientEc2QueryFactory : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = Ec2QueryProtocol(codegenContext) - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, protocol(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, protocol(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT } class ClientRestXmlFactory( private val generator: (CodegenContext) -> Protocol = { RestXml(it) }, -) : ProtocolGeneratorFactory { +) : ProtocolGeneratorFactory { override fun protocol(codegenContext: ClientCodegenContext): Protocol = generator(codegenContext) - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): HttpBoundProtocolGenerator = - HttpBoundProtocolGenerator(codegenContext, protocol(codegenContext)) + override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator = + OperationGenerator(codegenContext, protocol(codegenContext)) override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT } diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt index d8c8bf9dc27..f3cc0abad08 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt @@ -5,57 +5,14 @@ package software.amazon.smithy.rust.codegen.client.smithy.protocols -import software.amazon.smithy.codegen.core.Symbol -import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection -import software.amazon.smithy.rust.codegen.client.smithy.generators.SensitiveIndex -import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.MakeOperationGenerator -import software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ProtocolParserGenerator -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations import software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpMessageType -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.AdditionalPayloadContext import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBoundProtocolPayloadGenerator import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol -import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions -import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember -import software.amazon.smithy.rust.codegen.core.util.outputShape - -// TODO(enableNewSmithyRuntimeCleanup): Delete this class when cleaning up `enableNewSmithyRuntime` (replace with ClientProtocolGenerator) -class HttpBoundProtocolGenerator( - codegenContext: ClientCodegenContext, - protocol: Protocol, - bodyGenerator: ProtocolPayloadGenerator = ClientHttpBoundProtocolPayloadGenerator(codegenContext, protocol), -) : OperationGenerator( - codegenContext, - protocol, - MakeOperationGenerator( - codegenContext, - protocol, - bodyGenerator, - public = true, - includeDefaultPayloadHeaders = true, - ), - bodyGenerator, - HttpBoundProtocolTraitImplGenerator(codegenContext, protocol), -) - -// TODO(enableNewSmithyRuntimeCleanup): Completely delete `AdditionalPayloadContext` when switching to the orchestrator -data class ClientAdditionalPayloadContext( - val propertyBagAvailable: Boolean, -) : AdditionalPayloadContext class ClientHttpBoundProtocolPayloadGenerator( codegenContext: ClientCodegenContext, @@ -63,189 +20,25 @@ class ClientHttpBoundProtocolPayloadGenerator( ) : ProtocolPayloadGenerator by HttpBoundProtocolPayloadGenerator( codegenContext, protocol, HttpMessageType.REQUEST, renderEventStreamBody = { writer, params -> - val propertyBagAvailable = (params.additionalPayloadContext as ClientAdditionalPayloadContext).propertyBagAvailable writer.rustTemplate( """ { let error_marshaller = #{errorMarshallerConstructorFn}(); let marshaller = #{marshallerConstructorFn}(); let (signer, signer_sender) = #{DeferredSigner}::new(); - #{insert_into_config} + _cfg.interceptor_state().store_put(signer_sender); let adapter: #{aws_smithy_http}::event_stream::MessageStreamAdapter<_, _> = ${params.outerName}.${params.memberName}.into_body_stream(marshaller, error_marshaller, signer); - let body: #{SdkBody} = #{hyper}::Body::wrap_stream(adapter).into(); - body + #{SdkBody}::from_body_0_4(#{hyper}::Body::wrap_stream(adapter)) } """, "hyper" to CargoDependency.HyperWithStream.toType(), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + "SdkBody" to CargoDependency.smithyTypes(codegenContext.runtimeConfig).withFeature("http-body-0-4-x") + .toType().resolve("body::SdkBody"), "aws_smithy_http" to RuntimeType.smithyHttp(codegenContext.runtimeConfig), "DeferredSigner" to RuntimeType.smithyEventStream(codegenContext.runtimeConfig).resolve("frame::DeferredSigner"), "marshallerConstructorFn" to params.marshallerConstructorFn, "errorMarshallerConstructorFn" to params.errorMarshallerConstructorFn, - "insert_into_config" to writable { - if (propertyBagAvailable) { - rust("properties.acquire_mut().insert(signer_sender);") - } else { - rust("_cfg.interceptor_state().store_put(signer_sender);") - } - }, ) }, ) - -// TODO(enableNewSmithyRuntimeCleanup): Delete this class when cleaning up `enableNewSmithyRuntime` -open class HttpBoundProtocolTraitImplGenerator( - codegenContext: ClientCodegenContext, - protocol: Protocol, -) { - private val symbolProvider = codegenContext.symbolProvider - private val model = codegenContext.model - private val runtimeConfig = codegenContext.runtimeConfig - private val httpBindingResolver = protocol.httpBindingResolver - private val protocolFunctions = ProtocolFunctions(codegenContext) - private val parserGenerator = ProtocolParserGenerator(codegenContext, protocol) - - private val codegenScope = arrayOf( - *preludeScope, - "ParseStrict" to RuntimeType.parseStrictResponse(runtimeConfig), - "ParseResponse" to RuntimeType.parseHttpResponse(runtimeConfig), - "http" to RuntimeType.Http, - "operation" to RuntimeType.operationModule(runtimeConfig), - "Bytes" to RuntimeType.Bytes, - "SdkBody" to RuntimeType.sdkBody(runtimeConfig), - ) - - private val sensitiveIndex = SensitiveIndex.of(model) - - open fun generateTraitImpls( - operationWriter: RustWriter, - operationShape: OperationShape, - customizations: List, - ) { - val outputSymbol = symbolProvider.toSymbol(operationShape.outputShape(model)) - val operationName = symbolProvider.toSymbol(operationShape).name - - // For streaming response bodies, we need to generate a different implementation of the parse traits. - // These will first offer the streaming input to the parser & potentially read the body into memory - // if an error occurred or if the streaming parser indicates that it needs the full data to proceed. - val streaming = operationShape.outputShape(model).hasStreamingMember(model) - if (streaming) { - operationWriter.renderStreamingTraits(operationName, outputSymbol, operationShape, customizations) - } else { - operationWriter.renderNonStreamingTraits(operationName, outputSymbol, operationShape, customizations) - } - } - - private fun RustWriter.renderNonStreamingTraits( - operationName: String?, - outputSymbol: Symbol, - operationShape: OperationShape, - customizations: List, - ) { - val successCode = httpBindingResolver.httpTrait(operationShape).code - val localScope = arrayOf( - "O" to outputSymbol, - "E" to symbolProvider.symbolForOperationError(operationShape), - "parse_error" to parserGenerator.parseErrorFn(operationShape, customizations), - "parse_response" to parserGenerator.parseResponseFn(operationShape, true, customizations), - "BeforeParseResponse" to writable { - writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) - }, - ) - val sensitive = writable { - if (sensitiveIndex.hasSensitiveOutput(operationShape)) { - rust("fn sensitive(&self) -> bool { true }") - } - } - rustTemplate( - """ - impl #{ParseStrict} for $operationName { - type Output = #{Result}<#{O}, #{E}>; - fn parse(&self, response: &#{http}::Response<#{Bytes}>) -> Self::Output { - let (success, status) = (response.status().is_success(), response.status().as_u16()); - let headers = response.headers(); - let body = response.body().as_ref(); - #{BeforeParseResponse} - if !success && status != $successCode { - #{parse_error}(status, headers, body) - } else { - #{parse_response}(status, headers, body) - } - } - #{sensitive} - }""", - *codegenScope, - *localScope, - "sensitive" to sensitive, - ) - } - - private fun RustWriter.renderStreamingTraits( - operationName: String, - outputSymbol: Symbol, - operationShape: OperationShape, - customizations: List, - ) { - val successCode = httpBindingResolver.httpTrait(operationShape).code - rustTemplate( - """ - impl #{ParseResponse} for $operationName { - type Output = #{Result}<#{O}, #{E}>; - fn parse_unloaded(&self, response: &mut #{operation}::Response) -> #{Option} { - #{BeforeParseResponse} - // This is an error, defer to the non-streaming parser - if !response.http().status().is_success() && response.http().status().as_u16() != $successCode { - return #{None}; - } - #{Some}(#{parse_streaming_response}(response)) - } - fn parse_loaded(&self, response: &#{http}::Response<#{Bytes}>) -> Self::Output { - // if streaming, we only hit this case if its an error - #{parse_error}(response.status().as_u16(), response.headers(), response.body().as_ref()) - } - } - """, - "O" to outputSymbol, - "E" to symbolProvider.symbolForOperationError(operationShape), - "parse_streaming_response" to parseStreamingResponse(operationShape, customizations), - "parse_error" to parserGenerator.parseErrorFn(operationShape, customizations), - "BeforeParseResponse" to writable { - writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, "response")) - }, - *codegenScope, - ) - } - - private fun parseStreamingResponse( - operationShape: OperationShape, - customizations: List, - ): RuntimeType { - val outputShape = operationShape.outputShape(model) - val outputSymbol = symbolProvider.toSymbol(outputShape) - val errorSymbol = symbolProvider.symbolForOperationError(operationShape) - return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = "op_response") { fnName -> - Attribute.AllowClippyUnnecessaryWraps.render(this) - rustBlockTemplate( - "pub fn $fnName(op_response: &mut #{operation}::Response) -> #{Result}<#{O}, #{E}>", - *codegenScope, - "O" to outputSymbol, - "E" to errorSymbol, - ) { - // Not all implementations will use the property bag, but some will - Attribute.AllowUnusedVariables.render(this) - rust("let (response, properties) = op_response.parts_mut();") - rustTemplate( - """ - #{parse_streaming_response}(response, &properties) - """, - "parse_streaming_response" to parserGenerator.parseStreamingResponseFn( - operationShape, - true, - customizations, - ), - ) - } - } - } -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt index 138f43cd264..5d6de735b99 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt @@ -18,7 +18,7 @@ import java.nio.file.Path fun clientIntegrationTest( model: Model, - params: IntegrationTestParams = IntegrationTestParams(), + params: IntegrationTestParams = IntegrationTestParams(cargoCommand = "cargo test --features behavior-version-latest"), additionalDecorators: List = listOf(), test: (ClientCodegenContext, RustCrate) -> Unit = { _, _ -> }, ): Path { diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt new file mode 100644 index 00000000000..4cc67ae464e --- /dev/null +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt @@ -0,0 +1,40 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.testutil + +import software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.knowledge.ServiceIndex +import software.amazon.smithy.model.loader.ModelAssembler +import software.amazon.smithy.model.loader.ModelDiscovery +import software.amazon.smithy.model.transform.ModelTransformer +import software.amazon.smithy.rust.codegen.core.util.PANIC +import software.amazon.smithy.rust.codegen.core.util.letIf + +class EndpointTestDiscovery { + fun testCases(): List { + val models = ModelDiscovery.findModels(javaClass.getResource("/META-INF/smithy/manif3st")) + val assembledModels = models.map { url -> ModelAssembler().discoverModels().addImport(url).assemble().unwrap() } + // add a protocol trait so we can generate of it + return assembledModels.map { model -> + if (model.serviceShapes.size > 1) { + PANIC("too many services") + } + val service = model.serviceShapes.first() + if (ServiceIndex.of(model).getProtocols(service).isEmpty()) { + ModelTransformer.create().mapShapes(model) { s -> + s.letIf(s == service) { + s.asServiceShape().get().toBuilder().addTrait( + AwsJson1_0Trait.builder().build(), + ).build() + } + } + } else { + model + } + } + } +} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt deleted file mode 100644 index e449fe448cb..00000000000 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestConfigCustomization.kt +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.testutil - -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfigGenerator -import software.amazon.smithy.rust.codegen.client.smithy.generators.config.configParamNewtype -import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.TestWriterDelegator -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import software.amazon.smithy.rust.codegen.core.util.toPascalCase - -/** - * Test helper to produce a valid config customization to test that a [ConfigCustomization] can be used in conjunction - * with other [ConfigCustomization]s. - */ -fun stubConfigCustomization(name: String, codegenContext: ClientCodegenContext): ConfigCustomization { - return object : ConfigCustomization() { - override fun section(section: ServiceConfig): Writable = writable { - when (section) { - ServiceConfig.ConfigStruct -> { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rust("_$name: u64,") - } - } - ServiceConfig.ConfigImpl -> { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - rustTemplate( - """ - ##[allow(missing_docs)] - pub fn $name(&self) -> u64 { - self.inner.load::<#{T}>().map(|u| u.0).unwrap() - } - """, - "T" to configParamNewtype( - "_$name".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } else { - rust( - """ - ##[allow(missing_docs)] - pub fn $name(&self) -> u64 { - self._$name - } - """, - ) - } - } - ServiceConfig.BuilderStruct -> { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rust("_$name: Option,") - } - } - ServiceConfig.BuilderImpl -> { - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - rustTemplate( - """ - /// docs! - pub fn $name(mut self, $name: u64) -> Self { - self.inner.store_put(#{T}($name)); - self - } - """, - "T" to configParamNewtype( - "_$name".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } else { - rust( - """ - /// docs! - pub fn $name(mut self, $name: u64) -> Self { - self._$name = Some($name); - self - } - """, - ) - } - } - ServiceConfig.BuilderBuild -> { - if (codegenContext.smithyRuntimeMode.defaultToMiddleware) { - rust( - """ - _$name: self._$name.unwrap_or(123), - """, - ) - } - } - else -> emptySection - } - } - } -} - -/** Basic validation of [ConfigCustomization]s - * - * This test is not comprehensive, but it ensures that your customization generates Rust code that compiles and correctly - * composes with other customizations. - * */ -@Suppress("NAME_SHADOWING") -fun validateConfigCustomizations( - codegenContext: ClientCodegenContext, - customization: ConfigCustomization, - project: TestWriterDelegator? = null, -): TestWriterDelegator { - val project = project ?: TestWorkspace.testProject() - stubConfigProject(codegenContext, customization, project) - project.compileAndTest() - return project -} - -fun stubConfigProject(codegenContext: ClientCodegenContext, customization: ConfigCustomization, project: TestWriterDelegator): TestWriterDelegator { - val customizations = listOf(stubConfigCustomization("a", codegenContext)) + customization + stubConfigCustomization("b", codegenContext) - val generator = ServiceConfigGenerator(codegenContext, customizations = customizations.toList()) - project.withModule(ClientRustModule.config) { - generator.render(this) - if (codegenContext.smithyRuntimeMode.defaultToOrchestrator) { - generator.renderRuntimePluginImplForSelf(this) - } - unitTest( - "config_send_sync", - """ - fn assert_send_sync() {} - assert_send_sync::(); - """, - ) - } - project.lib { rust("pub use config::Config;") } - return project -} diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt index 97464760e9a..a65d734085d 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt @@ -15,7 +15,6 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientModuleProvider import software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings import software.amazon.smithy.rust.codegen.client.smithy.RustClientCodegenPlugin -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig @@ -91,8 +90,8 @@ fun testClientCodegenContext( rootDecorator ?: CombinedClientCodegenDecorator(emptyList()), ) -fun ClientCodegenContext.withSmithyRuntimeMode(smithyRuntimeMode: SmithyRuntimeMode): ClientCodegenContext = - copy(settings = settings.copy(codegenConfig = settings.codegenConfig.copy(enableNewSmithyRuntime = smithyRuntimeMode))) +fun ClientCodegenContext.withEnableUserConfigurableRuntimePlugins(enableUserConfigurableRuntimePlugins: Boolean): ClientCodegenContext = + copy(settings = settings.copy(codegenConfig = settings.codegenConfig.copy(enableUserConfigurableRuntimePlugins = enableUserConfigurableRuntimePlugins))) fun TestWriterDelegator.clientRustSettings() = testClientRustSettings( @@ -100,3 +99,5 @@ fun TestWriterDelegator.clientRustSettings() = moduleName = "test_${baseDir.toFile().nameWithoutExtension}", codegenConfig = codegenConfig as ClientCodegenConfig, ) + +fun TestWriterDelegator.clientCodegenContext(model: Model) = testClientCodegenContext(model, settings = clientRustSettings()) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt index e9e26724d9c..6b8c28826cc 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt @@ -69,7 +69,7 @@ class EventStreamSymbolProviderTest { listOf(someStream, someStreamError), ) outputType shouldBe RustType.Application( - RuntimeType.eventStreamReceiver(TestRuntimeConfig).toSymbol().rustType(), + RuntimeType.eventReceiver(TestRuntimeConfig).toSymbol().rustType(), listOf(someStream, someStreamError), ) } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt index aba0edc1a57..addc4d8f1e8 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt @@ -6,7 +6,10 @@ package software.amazon.smithy.rust.codegen.client.smithy import org.junit.jupiter.api.Test +import software.amazon.smithy.aws.traits.protocols.RestJson1Trait +import software.amazon.smithy.aws.traits.protocols.RestXmlTrait import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.reusedInputOutputShapesModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumVariantsModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumsModel import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeOperationsModel @@ -32,4 +35,14 @@ class NamingObstacleCourseTest { fun `test Rust prelude enum variant names compile`() { clientIntegrationTest(rustPreludeEnumVariantsModel()) { _, _ -> } } + + @Test + fun `test reuse of input and output shapes json`() { + clientIntegrationTest(reusedInputOutputShapesModel(RestJson1Trait.builder().build())) + } + + @Test + fun `test reuse of input and output shapes xml`() { + clientIntegrationTest(reusedInputOutputShapesModel(RestXmlTrait.builder().build())) + } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt index 61d97317f20..9846d9b0c00 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt @@ -43,13 +43,13 @@ internal class StreamingShapeSymbolProviderTest { modelWithOperationTraits.lookup("test.synthetic#GenerateSpeechOutput\$data").also { shape -> symbolProvider.toSymbol(shape).also { symbol -> symbol.name shouldBe "data" - symbol.rustType() shouldBe RustType.Opaque("ByteStream", "::aws_smithy_http::byte_stream") + symbol.rustType() shouldBe RustType.Opaque("ByteStream", "::aws_smithy_types::byte_stream") } } modelWithOperationTraits.lookup("test.synthetic#GenerateSpeechInput\$data").also { shape -> symbolProvider.toSymbol(shape).also { symbol -> symbol.name shouldBe "data" - symbol.rustType() shouldBe RustType.Opaque("ByteStream", "::aws_smithy_http::byte_stream") + symbol.rustType() shouldBe RustType.Opaque("ByteStream", "::aws_smithy_types::byte_stream") } } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt deleted file mode 100644 index 1673ac299f0..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ApiKeyAuthDecoratorTest.kt +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.integrationTest -import software.amazon.smithy.rust.codegen.core.testutil.runWithWarnings - -internal class ApiKeyAuthDecoratorTest { - private val modelQuery = """ - namespace test - - use aws.api#service - use aws.protocols#restJson1 - - @service(sdkId: "Test Api Key Auth") - @restJson1 - @httpApiKeyAuth(name: "api_key", in: "query") - @auth([httpApiKeyAuth]) - service TestService { - version: "2023-01-01", - operations: [SomeOperation] - } - - structure SomeOutput { - someAttribute: Long, - someVal: String - } - - @http(uri: "/SomeOperation", method: "GET") - operation SomeOperation { - output: SomeOutput - } - """.asSmithyModel() - - @Test - fun `set an api key in query parameter`() { - val testDir = clientIntegrationTest( - modelQuery, - // just run integration tests - IntegrationTestParams(command = { "cargo test --test *".runWithWarnings(it) }), - ) { clientCodegenContext, rustCrate -> - rustCrate.integrationTest("api_key_present_in_property_bag") { - val moduleName = clientCodegenContext.moduleUseName() - Attribute.TokioTest.render(this) - rust( - """ - async fn api_key_present_in_property_bag() { - use aws_smithy_http_auth::api_key::AuthApiKey; - let api_key_value = "some-api-key"; - let conf = $moduleName::Config::builder() - .api_key(AuthApiKey::new(api_key_value)) - .build(); - let operation = $moduleName::operation::some_operation::SomeOperationInput::builder() - .build() - .expect("input is valid") - .make_operation(&conf) - .await - .expect("valid operation"); - let props = operation.properties(); - let api_key_config = props.get::().expect("api key in the bag"); - assert_eq!( - api_key_config, - &AuthApiKey::new(api_key_value), - ); - } - """, - ) - } - - rustCrate.integrationTest("api_key_auth_is_set_in_query") { - val moduleName = clientCodegenContext.moduleUseName() - Attribute.TokioTest.render(this) - rust( - """ - async fn api_key_auth_is_set_in_query() { - use aws_smithy_http_auth::api_key::AuthApiKey; - let api_key_value = "some-api-key"; - let conf = $moduleName::Config::builder() - .api_key(AuthApiKey::new(api_key_value)) - .build(); - let operation = $moduleName::operation::some_operation::SomeOperationInput::builder() - .build() - .expect("input is valid") - .make_operation(&conf) - .await - .expect("valid operation"); - assert_eq!( - operation.request().uri().query(), - Some("api_key=some-api-key"), - ); - } - """, - ) - } - } - "cargo clippy".runWithWarnings(testDir) - } - - private val modelHeader = """ - namespace test - - use aws.api#service - use aws.protocols#restJson1 - - @service(sdkId: "Test Api Key Auth") - @restJson1 - @httpApiKeyAuth(name: "authorization", in: "header", scheme: "ApiKey") - @auth([httpApiKeyAuth]) - service TestService { - version: "2023-01-01", - operations: [SomeOperation] - } - - structure SomeOutput { - someAttribute: Long, - someVal: String - } - - @http(uri: "/SomeOperation", method: "GET") - operation SomeOperation { - output: SomeOutput - } - """.asSmithyModel() - - @Test - fun `set an api key in http header`() { - val testDir = clientIntegrationTest( - modelHeader, - // just run integration tests - IntegrationTestParams(command = { "cargo test --test *".runWithWarnings(it) }), - ) { clientCodegenContext, rustCrate -> - rustCrate.integrationTest("api_key_auth_is_set_in_http_header") { - val moduleName = clientCodegenContext.moduleUseName() - Attribute.TokioTest.render(this) - rust( - """ - async fn api_key_auth_is_set_in_http_header() { - use aws_smithy_http_auth::api_key::AuthApiKey; - let api_key_value = "some-api-key"; - let conf = $moduleName::Config::builder() - .api_key(AuthApiKey::new(api_key_value)) - .build(); - let operation = $moduleName::operation::some_operation::SomeOperationInput::builder() - .build() - .expect("input is valid") - .make_operation(&conf) - .await - .expect("valid operation"); - let props = operation.properties(); - let api_key_config = props.get::().expect("api key in the bag"); - assert_eq!( - api_key_config, - &AuthApiKey::new(api_key_value), - ); - assert_eq!( - operation.request().headers().contains_key("authorization"), - true, - ); - } - """, - ) - } - } - "cargo clippy".runWithWarnings(testDir) - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt index 92f653bf1b7..e235144f2d7 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt @@ -6,10 +6,10 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rawRust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -18,18 +18,18 @@ import software.amazon.smithy.rust.codegen.core.testutil.integrationTest class HttpAuthDecoratorTest { private fun codegenScope(runtimeConfig: RuntimeConfig): Array> = arrayOf( - "TestConnection" to CargoDependency.smithyClient(runtimeConfig) - .withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), + "ReplayEvent" to CargoDependency.smithyRuntime(runtimeConfig) + .toDevDependency().withFeature("test-util").toType() + .resolve("client::http::test_util::ReplayEvent"), + "StaticReplayClient" to CargoDependency.smithyRuntime(runtimeConfig) + .toDevDependency().withFeature("test-util").toType() + .resolve("client::http::test_util::StaticReplayClient"), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), ) @Test fun multipleAuthSchemesSchemeSelection() { - clientIntegrationTest( - TestModels.allSchemes, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.allSchemes) { codegenContext, rustCrate -> rustCrate.integrationTest("tests") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -38,29 +38,27 @@ class HttpAuthDecoratorTest { async fn use_api_key_auth_when_api_key_provided() { use aws_smithy_runtime_api::client::identity::http::Token; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .uri("http://localhost:1234/SomeOperation?api_key=some-api-key") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .uri("http://localhost:1234/SomeOperation?api_key=some-api-key") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) - .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -71,30 +69,28 @@ class HttpAuthDecoratorTest { async fn use_basic_auth_when_basic_auth_login_provided() { use aws_smithy_runtime_api::client::identity::http::Login; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .header("authorization", "Basic c29tZS11c2VyOnNvbWUtcGFzcw==") - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "Basic c29tZS11c2VyOnNvbWUtcGFzcw==") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .basic_auth_login(Login::new("some-user", "some-pass", None)) - .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -103,12 +99,173 @@ class HttpAuthDecoratorTest { } } + @Test + fun noAuthCustomAuth() { + clientIntegrationTest(TestModels.noSchemes) { ctx, rustCrate -> + rustCrate.integrationTest("custom_auth_scheme_works") { + val moduleName = ctx.moduleUseName() + rawRust( + """ + use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; + use aws_smithy_runtime_api::client::auth::AuthScheme; + use aws_smithy_runtime_api::client::auth::{AuthSchemeId, Sign}; + use aws_smithy_runtime_api::client::identity::{ + IdentityFuture, ResolveIdentity, SharedIdentityResolver, + }; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_runtime_api::client::runtime_components::{ + GetIdentityResolver, RuntimeComponentsBuilder, + }; + use aws_smithy_runtime_api::client::identity::Identity; + use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; + use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig; + use aws_smithy_types::config_bag::ConfigBag; + use std::borrow::Cow; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + #[derive(Debug)] + struct CustomAuthRuntimePlugin { + components: RuntimeComponentsBuilder, + } + + impl RuntimePlugin for CustomAuthRuntimePlugin { + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.components) + } + } + + #[derive(Debug)] + struct TestAuthScheme { signer: CustomSigner } + + impl AuthScheme for TestAuthScheme { + fn scheme_id(&self) -> AuthSchemeId { + AuthSchemeId::new("customauth") + } + + fn identity_resolver( + &self, + identity_resolvers: &dyn GetIdentityResolver, + ) -> Option { + identity_resolvers.identity_resolver(self.scheme_id()) + } + + fn signer(&self) -> &dyn Sign { + &self.signer + } + } + + #[derive(Debug, Default)] + struct CustomSigner; + + #[derive(Debug)] + struct CustomIdentity(String); + + impl Sign for CustomSigner { + fn sign_http_request( + &self, + request: &mut HttpRequest, + identity: &Identity, + // In some advanced use cases, the Smithy `@endpointRuleSet` can + // provide additional context in this config: + _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, + _config_bag: &ConfigBag, + ) -> Result<(), BoxError> { + // Downcast the identity to our known `Login` type + let login = identity + .data::() + .ok_or("custom auth requires a `Login` identity")?; + // Use the login to add an authorization header to the request + request.headers_mut().try_append( + http::header::AUTHORIZATION, + login.0.to_string() + )?; + Ok(()) + } + } + + + #[derive(Debug)] + struct TestResolver; + impl ResolveIdentity for TestResolver { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new(CustomIdentity("password".to_string()), None))) + } + } + + impl CustomAuthRuntimePlugin { + pub fn new() -> Self { + let scheme_id = AuthSchemeId::new("customauth"); + Self { + components: RuntimeComponentsBuilder::new("test-auth-scheme") + // Register our auth scheme + .with_auth_scheme(TestAuthScheme { signer: CustomSigner }) + // Register our identity resolver with our auth scheme ID + .with_identity_resolver( + // This scheme ID needs to match the scheme ID returned in the auth scheme implementation + scheme_id, + TestResolver, + ) + // Set the auth scheme option resolver to always use our basic auth auth scheme + .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new(vec![ + scheme_id, + ]))), + } + } + } + + #[test] + fn compile() {} + + """, + + ) + Attribute.TokioTest.render(this) + rustTemplate( + """ + async fn apply_custom_auth_scheme() { + let (_guard, _rx) = #{capture_test_logs}(); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "password") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); + let config = $moduleName::Config::builder() + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) + .runtime_plugin(CustomAuthRuntimePlugin::new()) + .build(); + let client = $moduleName::Client::from_conf(config); + let _req = dbg!(client.some_operation() + .send() + .await).expect("request should succeed"); + + http_client.assert_requests_match(&[]); + } + """, + "capture_test_logs" to CargoDependency.smithyRuntimeTestUtil(ctx.runtimeConfig).toType() + .resolve("test_util::capture_test_logs::capture_test_logs"), + *codegenScope(ctx.runtimeConfig), + ) + } + } + } + @Test fun apiKeyInQueryString() { - clientIntegrationTest( - TestModels.apiKeyInQueryString, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.apiKeyInQueryString) { codegenContext, rustCrate -> rustCrate.integrationTest("api_key_applied_to_query_string") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -117,29 +274,27 @@ class HttpAuthDecoratorTest { async fn api_key_applied_to_query_string() { use aws_smithy_runtime_api::client::identity::http::Token; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .uri("http://localhost:1234/SomeOperation?api_key=some-api-key") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .uri("http://localhost:1234/SomeOperation?api_key=some-api-key") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) - .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -150,10 +305,7 @@ class HttpAuthDecoratorTest { @Test fun apiKeyInHeaders() { - clientIntegrationTest( - TestModels.apiKeyInHeaders, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.apiKeyInHeaders) { codegenContext, rustCrate -> rustCrate.integrationTest("api_key_applied_to_headers") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -162,30 +314,28 @@ class HttpAuthDecoratorTest { async fn api_key_applied_to_headers() { use aws_smithy_runtime_api::client::identity::http::Token; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .header("authorization", "ApiKey some-api-key") - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "ApiKey some-api-key") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .api_key(Token::new("some-api-key", None)) - .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -196,10 +346,7 @@ class HttpAuthDecoratorTest { @Test fun basicAuth() { - clientIntegrationTest( - TestModels.basicAuth, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.basicAuth) { codegenContext, rustCrate -> rustCrate.integrationTest("basic_auth") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -208,30 +355,28 @@ class HttpAuthDecoratorTest { async fn basic_auth() { use aws_smithy_runtime_api::client::identity::http::Login; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .header("authorization", "Basic c29tZS11c2VyOnNvbWUtcGFzcw==") - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "Basic c29tZS11c2VyOnNvbWUtcGFzcw==") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .basic_auth_login(Login::new("some-user", "some-pass", None)) - .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -242,10 +387,7 @@ class HttpAuthDecoratorTest { @Test fun bearerAuth() { - clientIntegrationTest( - TestModels.bearerAuth, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.bearerAuth) { codegenContext, rustCrate -> rustCrate.integrationTest("bearer_auth") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) @@ -254,30 +396,28 @@ class HttpAuthDecoratorTest { async fn basic_auth() { use aws_smithy_runtime_api::client::identity::http::Token; - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .header("authorization", "Bearer some-token") - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .header("authorization", "Bearer some-token") + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() .bearer_token(Token::new("some-token", None)) - .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -288,38 +428,33 @@ class HttpAuthDecoratorTest { @Test fun optionalAuth() { - clientIntegrationTest( - TestModels.optionalAuth, - TestCodegenSettings.orchestratorModeTestParams, - ) { codegenContext, rustCrate -> + clientIntegrationTest(TestModels.optionalAuth) { codegenContext, rustCrate -> rustCrate.integrationTest("optional_auth") { val moduleName = codegenContext.moduleUseName() Attribute.TokioTest.render(this) rustTemplate( """ async fn optional_auth() { - let connector = #{TestConnection}::new(vec![( - http::Request::builder() - .uri("http://localhost:1234/SomeOperation") - .body(#{SdkBody}::empty()) - .unwrap(), - http::Response::builder().status(200).body("").unwrap(), - )]); + let http_client = #{StaticReplayClient}::new( + vec![#{ReplayEvent}::new( + http::Request::builder() + .uri("http://localhost:1234/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(), + )], + ); let config = $moduleName::Config::builder() - .endpoint_resolver("http://localhost:1234") - .http_connector(connector.clone()) + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let _ = client.some_operation() - .send_orchestrator() + .send() .await .expect("success"); - connector.assert_requests_match(&[]); + http_client.assert_requests_match(&[]); } """, *codegenScope(codegenContext.runtimeConfig), @@ -359,6 +494,29 @@ private object TestModels { } """.asSmithyModel() + val noSchemes = """ + namespace test + + use aws.api#service + use aws.protocols#restJson1 + + @service(sdkId: "Test Api Key Auth") + @restJson1 + service TestService { + version: "2023-01-01", + operations: [SomeOperation] + } + + structure SomeOutput { + someAttribute: Long, + someVal: String + } + + @http(uri: "/SomeOperation", method: "GET") + operation SomeOperation { + output: SomeOutput + }""".asSmithyModel() + val apiKeyInQueryString = """ namespace test diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt deleted file mode 100644 index 73633a603ea..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpVersionListGeneratorTest.kt +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.customizations - -import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest -import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.integrationTest - -// If any of these tests fail, and you want to understand why, run them with logging: -// ``` -// ./gradlew codegen-client:test --tests software.amazon.smithy.rust.codegen.client.HttpVersionListGeneratorTest --info -// ``` - -internal class HttpVersionListGeneratorTest { - @Test - fun `http version list integration test (no preferred version)`() { - val model = """ - namespace com.example - - use aws.protocols#awsJson1_0 - - @awsJson1_0 - @aws.api#service(sdkId: "Test", endpointPrefix: "differentPrefix") - service TestService { - operations: [SayHello], - version: "1" - } - - @endpoint(hostPrefix: "test123.{greeting}.") - operation SayHello { - input: SayHelloInput - } - - structure SayHelloInput { - @required - @hostLabel - greeting: String - } - """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("http_version_list") { - Attribute.TokioTest.render(this) - rust( - """ - async fn test_http_version_list_defaults() { - let conf = $moduleName::Config::builder().build(); - let op = $moduleName::operation::say_hello::SayHelloInput::builder() - .greeting("hello") - .build().expect("valid operation") - .make_operation(&conf).await.expect("hello is a valid prefix"); - let properties = op.properties(); - let actual_http_versions = properties.get::>() - .expect("http versions list should be in property bag"); - let expected_http_versions = &vec![http::Version::HTTP_11]; - assert_eq!(actual_http_versions, expected_http_versions); - } - """, - ) - } - } - } - - @Test - fun `http version list integration test (http)`() { - val model = """ - namespace com.example - - use aws.protocols#restJson1 - - @restJson1(http: ["http/1.1", "h2"]) - @aws.api#service(sdkId: "Test", endpointPrefix: "differentPrefix") - service TestService { - operations: [SayHello], - version: "1" - } - - @http(method: "PUT", uri: "/input", code: 200) - @idempotent - @endpoint(hostPrefix: "test123.{greeting}.") - operation SayHello { - input: SayHelloInput - } - - structure SayHelloInput { - @required - @hostLabel - greeting: String - } - """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("validate_http") { - Attribute.TokioTest.render(this) - rust( - """ - async fn test_http_version_list_defaults() { - let conf = $moduleName::Config::builder().build(); - let op = $moduleName::operation::say_hello::SayHelloInput::builder() - .greeting("hello") - .build().expect("valid operation") - .make_operation(&conf).await.expect("hello is a valid prefix"); - let properties = op.properties(); - let actual_http_versions = properties.get::>() - .expect("http versions list should be in property bag"); - let expected_http_versions = &vec![http::Version::HTTP_11, http::Version::HTTP_2]; - assert_eq!(actual_http_versions, expected_http_versions); - } - """, - ) - } - } - } - - @Test - fun `http version list integration test (eventStreamHttp)`() { - val model = """ - namespace com.example - - use aws.protocols#restJson1 - - @restJson1(http: ["h2", "http/1.1"], eventStreamHttp: ["h2"]) - @aws.api#service(sdkId: "Test") - service TestService { - operations: [SayHello], - version: "1" - } - - @idempotent - @http(uri: "/test", method: "PUT") - operation SayHello { - input: SayHelloInput, - output: SayHelloOutput - } - - structure SayHelloInput {} - - structure SayHelloOutput { - @httpPayload - greeting: SomeStream - } - - structure Something { stuff: SomethingElse } - - structure SomethingElse { - version: String - } - - @streaming - union SomeStream { - Something: Something, - } - """.asSmithyModel() - - clientIntegrationTest( - model, - IntegrationTestParams(addModuleToEventStreamAllowList = true), - ) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("validate_eventstream_http") { - Attribute.TokioTest.render(this) - rust( - """ - async fn test_http_version_list_defaults() { - let conf = $moduleName::Config::builder().build(); - let op = $moduleName::operation::say_hello::SayHelloInput::builder() - .build().expect("valid operation") - .make_operation(&conf).await.unwrap(); - let properties = op.properties(); - let actual_http_versions = properties.get::>() - .expect("http versions list should be in property bag"); - let expected_http_versions = &vec![http::Version::HTTP_2]; - assert_eq!(actual_http_versions, expected_http_versions); - } - """, - ) - } - } - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt new file mode 100644 index 00000000000..cac24f5b962 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt @@ -0,0 +1,99 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels +import software.amazon.smithy.rust.codegen.core.testutil.testModule +import software.amazon.smithy.rust.codegen.core.testutil.tokioTest + +class MetadataCustomizationTest { + + @Test + fun `extract metadata via customizable operation`() { + clientIntegrationTest(BasicTestModels.AwsJson10TestModel) { clientCodegenContext, rustCrate -> + val runtimeConfig = clientCodegenContext.runtimeConfig + val codegenScope = arrayOf( + *preludeScope, + "BeforeTransmitInterceptorContextMut" to RuntimeType.beforeTransmitInterceptorContextMut(runtimeConfig), + "BoxError" to RuntimeType.boxError(runtimeConfig), + "ConfigBag" to RuntimeType.configBag(runtimeConfig), + "Intercept" to RuntimeType.intercept(runtimeConfig), + "Metadata" to RuntimeType.operationModule(runtimeConfig).resolve("Metadata"), + "capture_request" to RuntimeType.captureRequest(runtimeConfig), + "RuntimeComponents" to RuntimeType.smithyRuntimeApiClient(runtimeConfig) + .resolve("client::runtime_components::RuntimeComponents"), + ) + rustCrate.testModule { + addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) + tokioTest("test_extract_metadata_via_customizable_operation") { + rustTemplate( + """ + // Interceptors aren’t supposed to store states, but it is done this way for a testing purpose. + ##[derive(Debug)] + struct ExtractMetadataInterceptor( + ::std::sync::Mutex<#{Option}<::std::sync::mpsc::Sender<(String, String)>>>, + ); + + impl #{Intercept} for ExtractMetadataInterceptor { + fn name(&self) -> &'static str { + "ExtractMetadataInterceptor" + } + + fn modify_before_signing( + &self, + _context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, + _runtime_components: &#{RuntimeComponents}, + cfg: &mut #{ConfigBag}, + ) -> #{Result}<(), #{BoxError}> { + let metadata = cfg + .load::<#{Metadata}>() + .expect("metadata should exist"); + let service_name = metadata.service().to_string(); + let operation_name = metadata.name().to_string(); + let tx = self.0.lock().unwrap().take().unwrap(); + tx.send((service_name, operation_name)).unwrap(); + #{Ok}(()) + } + } + + let (tx, rx) = ::std::sync::mpsc::channel(); + + let (http_client, _captured_request) = #{capture_request}(#{None}); + let client_config = crate::config::Config::builder() + .endpoint_url("http://localhost:1234/") + .http_client(http_client) + .build(); + let client = crate::client::Client::from_conf(client_config); + let _ = client + .say_hello() + .customize() + .interceptor(ExtractMetadataInterceptor(::std::sync::Mutex::new(#{Some}(tx)))) + .send() + .await; + + match rx.recv() { + #{Ok}((service_name, operation_name)) => { + assert_eq!("HelloService", &service_name); + assert_eq!("SayHello", &operation_name); + } + #{Err}(_) => panic!( + "failed to receive service name and operation name from `ExtractMetadataInterceptor`" + ), + } + """, + *codegenScope, + ) + } + } + } + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt index b84f204c240..30d046ff635 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt @@ -6,41 +6,25 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenConfig -import software.amazon.smithy.rust.codegen.client.testutil.clientRustSettings -import software.amazon.smithy.rust.codegen.client.testutil.stubConfigProject -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer -import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels +import software.amazon.smithy.rust.codegen.core.testutil.unitTest internal class ResiliencyConfigCustomizationTest { - private val baseModel = """ - namespace test - use aws.protocols#awsQuery - - structure SomeOutput { - @xmlAttribute - someAttribute: Long, - - someVal: String - } - - operation SomeOperation { - output: SomeOutput - } - """.asSmithyModel() @Test fun `generates a valid config`() { - val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) - val project = TestWorkspace.testProject(model, ClientCodegenConfig()) - val codegenContext = testClientCodegenContext(model, settings = project.clientRustSettings()) - - stubConfigProject(codegenContext, ResiliencyConfigCustomization(codegenContext), project) - ResiliencyReExportCustomization(codegenContext).extras(project) - project.compileAndTest() + clientIntegrationTest(BasicTestModels.AwsJson10TestModel) { _, crate -> + crate.unitTest("resiliency_fields") { + rustTemplate( + """ + let mut conf = crate::Config::builder(); + conf.set_sleep_impl(None); + conf.set_retry_config(None); + """, + ) + } + } } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt new file mode 100644 index 00000000000..e97ad2921b9 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt @@ -0,0 +1,84 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.customizations + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.Attribute +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class SensitiveOutputDecoratorTest { + private fun codegenScope(runtimeConfig: RuntimeConfig): Array> = arrayOf( + "capture_test_logs" to CargoDependency.smithyRuntimeTestUtil(runtimeConfig).toType() + .resolve("test_util::capture_test_logs::capture_test_logs"), + "capture_request" to RuntimeType.captureRequest(runtimeConfig), + "SdkBody" to RuntimeType.sdkBody(runtimeConfig), + ) + + private val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + @optionalAuth + operation SayHello { output: TestOutput } + + @sensitive + structure Credentials { + username: String, + password: String + } + + structure TestOutput { + credentials: Credentials, + } + """.asSmithyModel() + + @Test + fun `sensitive output in model should redact response body`() { + clientIntegrationTest(model) { codegenContext, rustCrate -> + rustCrate.integrationTest("redacting_sensitive_response_body") { + val moduleName = codegenContext.moduleUseName() + Attribute.TokioTest.render(this) + rustTemplate( + """ + async fn redacting_sensitive_response_body() { + let (_logs, logs_rx) = #{capture_test_logs}(); + let (http_client, _r) = #{capture_request}(Some( + http::Response::builder() + .status(200) + .body(#{SdkBody}::from("")) + .unwrap(), + )); + + let config = $moduleName::Config::builder() + .endpoint_url("http://localhost:1234") + .http_client(http_client.clone()) + .build(); + let client = $moduleName::Client::from_conf(config); + let _ = client.say_hello() + .send() + .await + .expect("success"); + + let log_contents = logs_rx.contents(); + assert!(log_contents.contains("** REDACTED **")); + } + """, + *codegenScope(codegenContext.runtimeConfig), + ) + } + } + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt index c467189c24a..15b6f0e5953 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt @@ -5,16 +5,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode -import software.amazon.smithy.rust.codegen.core.rustlang.rust +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.unitTest @@ -22,6 +15,7 @@ class ClientContextConfigCustomizationTest { val model = """ namespace test use smithy.rules#clientContextParams + use aws.protocols#awsJson1_0 @clientContextParams(aStringParam: { documentation: "string docs", @@ -31,84 +25,54 @@ class ClientContextConfigCustomizationTest { documentation: "bool docs", type: "boolean" }) + @awsJson1_0 service TestService { operations: [] } """.asSmithyModel() - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `client params generate a valid customization`(smithyRuntimeModeStr: String) { - val project = TestWorkspace.testProject() - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val context = testClientCodegenContext(model).withSmithyRuntimeMode(smithyRuntimeMode) - project.unitTest { - if (smithyRuntimeMode.defaultToOrchestrator) { + @Test + fun `client params generate a valid customization`() { + clientIntegrationTest(model) { _, crate -> + crate.unitTest { rustTemplate( """ - use #{RuntimePlugin}; let conf = crate::Config::builder().a_string_param("hello!").a_bool_param(true).build(); assert_eq!( - conf.config() - .unwrap() + conf.config .load::() .map(|u| u.0.clone()) .unwrap(), "hello!" ); assert_eq!( - conf.config() - .unwrap() + conf.config .load::() .map(|u| u.0), Some(true) ); """, - "RuntimePlugin" to RuntimeType.runtimePlugin(context.runtimeConfig), - ) - } else { - rust( - """ - let conf = crate::Config::builder().a_string_param("hello!").a_bool_param(true).build(); - assert_eq!(conf.a_string_param.unwrap(), "hello!"); - assert_eq!(conf.a_bool_param, Some(true)); - """, ) } - } - // unset fields - project.unitTest { - if (smithyRuntimeMode.defaultToOrchestrator) { + + crate.unitTest("unset_fields") { rustTemplate( """ - use #{RuntimePlugin}; let conf = crate::Config::builder().a_string_param("hello!").build(); assert_eq!( - conf.config() - .unwrap() + conf.config .load::() .map(|u| u.0.clone()) .unwrap(), "hello!" ); assert_eq!( - conf.config() - .unwrap() + conf.config .load::() .map(|u| u.0), None, ); """, - "RuntimePlugin" to RuntimeType.runtimePlugin(context.runtimeConfig), - ) - } else { - rust( - """ - let conf = crate::Config::builder().a_string_param("hello!").build(); - assert_eq!(conf.a_string_param.unwrap(), "hello!"); - assert_eq!(conf.a_bool_param, None); - """, ) } } - validateConfigCustomizations(context, ClientContextConfigCustomization(context), project) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt index 34636f596c5..209e235299a 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt @@ -5,18 +5,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.MethodSource -import software.amazon.smithy.rulesengine.testutil.TestDiscovery -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import java.util.stream.Stream - internal class EndpointParamsGeneratorTest { + /* companion object { @JvmStatic fun testSuites(): Stream = TestDiscovery().testSuites() @@ -39,5 +29,5 @@ internal class EndpointParamsGeneratorTest { } } project.compileAndTest() - } + }*/ } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt index 5a798cae4d5..aaa8cfa284f 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt @@ -5,74 +5,58 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint -import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.MethodSource -import software.amazon.smithy.codegen.core.CodegenException import software.amazon.smithy.model.Model -import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rulesengine.language.Endpoint -import software.amazon.smithy.rulesengine.language.eval.Scope -import software.amazon.smithy.rulesengine.language.eval.Type -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.testutil.TestDiscovery -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointTestGenerator -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib -import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.awsStandardLib -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest -import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import java.util.stream.Stream +import software.amazon.smithy.rust.codegen.client.testutil.EndpointTestDiscovery +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest class EndpointResolverGeneratorTest { companion object { + val testCases = listOf( + "default-values.smithy", + "deprecated-param.smithy", + "duplicate-param.smithy", + "get-attr-type-inference.smithy", + "headers.smithy", + "minimal-ruleset.smithy", + "parse-url.smithy", + "substring.smithy", + "uri-encode.smithy", + "valid-hostlabel.smithy", + "valid-model.smithy", + ) + @JvmStatic - fun testSuites(): Stream = - TestDiscovery().testSuites().map { it.ruleSet().typecheck(); it } + fun testSuites(): List { + return EndpointTestDiscovery().testCases() + } + } + + @Test + fun `test`() { + `generate all rulesets`(testSuites()[0]) } // for tests, load partitions.json from smithy—for real usage, this file will be inserted at codegen time - private val partitionsJson = + /*private val partitionsJson = Node.parse( this::class.java.getResource("/software/amazon/smithy/rulesengine/language/partitions.json")?.readText() ?: throw CodegenException("partitions.json was not present in smithy bundle"), - ) + )*/ @ParameterizedTest(name = "{0}") @MethodSource("testSuites") - fun `generate all rulesets`(suite: TestDiscovery.RulesTestSuite) { + fun `generate all rulesets`(suite: Model) { // snippet to only run one ruleset during tests - if (!suite.toString().contains("hostable")) { - // return - } - val project = TestWorkspace.testProject() - val context = testClientCodegenContext() - suite.ruleSet().typecheck() - project.lib { - val ruleset = EndpointResolverGenerator( - context, - SmithyEndpointsStdLib + awsStandardLib(TestRuntimeConfig, partitionsJson), - ).defaultEndpointResolver(suite.ruleSet()) - val testGenerator = EndpointTestGenerator( - suite.testSuite().testCases, - paramsType = EndpointParamsGenerator(context, suite.ruleSet().parameters).paramsStruct(), - resolverType = ruleset, - suite.ruleSet().parameters, - codegenContext = testClientCodegenContext(model = Model.builder().build()), - endpointCustomizations = listOf(), - ) - testGenerator.generate()(this) - } - project.compileAndTest(runClippy = true) + // if (!suite.toString().contains("hostable")) { + // return + // } + clientIntegrationTest(suite) } + /* @Test fun `only include actually used functions in endpoints lib`() { testSuites().map { it.ruleSet().sourceLocation.filename }.forEach { println(it) } @@ -108,14 +92,14 @@ class EndpointResolverGeneratorTest { @Test fun generateEndpoints() { val endpoint = Endpoint.builder().url(Expression.of("https://{Region}.amazonaws.com")) - .addHeader("x-amz-test", listOf(Literal.of("header-value"))) + .putHeader("x-amz-test", listOf(Literal.of("header-value"))) .addAuthScheme( "sigv4", hashMapOf("signingName" to Literal.of("service"), "signingScope" to Literal.of("{Region}")), ) .build() val scope = Scope() - scope.insert("Region", Type.string()) + scope.insert("Region", Type.stringType()) endpoint.typeCheck(scope) val context = testClientCodegenContext() val generator = EndpointResolverGenerator(context, listOf()) @@ -130,5 +114,5 @@ class EndpointResolverGeneratorTest { "endpoint" to generator.generateEndpoint(endpoint), ) }.compileAndTest() - } + }*/ } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt index 56cd00f0ee3..789315e2189 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt @@ -10,12 +10,14 @@ import io.kotest.matchers.string.shouldContain import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute -import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest import software.amazon.smithy.rust.codegen.core.testutil.runWithWarnings -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError +import software.amazon.smithy.rust.codegen.core.util.runCommand /** * End-to-end test of endpoint resolvers, attaching a real resolver to a fully generated service @@ -68,7 +70,7 @@ class EndpointsDecoratorTest { documentation: "string docs", type: "string" }, - aBoolParam: { + ABoolParam: { documentation: "bool docs", type: "boolean" } @@ -109,8 +111,10 @@ class EndpointsDecoratorTest { input: TestOperationInput } + @input structure TestOperationInput { @contextParam(name: "Bucket") + @required bucket: String, nested: NestedStructure } @@ -118,51 +122,113 @@ class EndpointsDecoratorTest { structure NestedStructure { field: String } - """.asSmithyModel() + """.asSmithyModel(disableValidation = true) @Test - fun `set an endpoint in the property bag`() { + fun `resolve endpoint`() { val testDir = clientIntegrationTest( model, // Just run integration tests. - IntegrationTestParams(command = { "cargo test --test *".runWithWarnings(it) }), + IntegrationTestParams(command = { "cargo test --all-features --test *".runCommand(it) }), ) { clientCodegenContext, rustCrate -> rustCrate.integrationTest("endpoint_params_test") { val moduleName = clientCodegenContext.moduleUseName() Attribute.TokioTest.render(this) - rust( + rustTemplate( """ async fn endpoint_params_are_set() { - let conf = $moduleName::Config::builder().a_string_param("hello").a_bool_param(false).build(); - let operation = $moduleName::operation::test_operation::TestOperationInput::builder() - .bucket("bucket-name").build().expect("input is valid") - .make_operation(&conf).await.expect("valid operation"); - use $moduleName::endpoint::{Params}; - use aws_smithy_http::endpoint::Result; - let props = operation.properties(); - let endpoint_result = dbg!(props.get::().expect("endpoint result in the bag")); - let endpoint_params = props.get::().expect("endpoint params in the bag"); - let endpoint = endpoint_result.as_ref().expect("endpoint resolved properly"); - assert_eq!( - endpoint_params, - &Params::builder() - .bucket("bucket-name".to_string()) - .built_in_with_default("some-default") - .bool_built_in_with_default(true) - .a_bool_param(false) - .a_string_param("hello".to_string()) - .region("us-east-2".to_string()) - .build().unwrap() - ); - - assert_eq!(endpoint.url(), "https://www.us-east-2.example.com"); + use #{NeverClient}; + use #{TokioSleep}; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::endpoint::EndpointResolverParams; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_types::config_bag::ConfigBag; + use aws_smithy_types::endpoint::Endpoint; + use aws_smithy_types::timeout::TimeoutConfig; + use std::sync::atomic::AtomicBool; + use std::sync::atomic::Ordering; + use std::sync::Arc; + use std::time::Duration; + use $moduleName::{ + config::endpoint::Params, config::interceptors::BeforeTransmitInterceptorContextRef, + config::Intercept, config::SharedAsyncSleep, Client, Config, + }; + + ##[derive(Clone, Debug, Default)] + struct TestInterceptor { + called: Arc, + } + impl Intercept for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + + fn read_before_transmit( + &self, + _context: &BeforeTransmitInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let params = cfg + .load::() + .expect("params set in config"); + let params: &Params = params.get().expect("correct type"); + assert_eq!( + params, + &Params::builder() + .bucket("bucket-name".to_string()) + .built_in_with_default("some-default") + .bool_built_in_with_default(true) + .a_bool_param(false) + .a_string_param("hello".to_string()) + .region("us-east-2".to_string()) + .build() + .unwrap() + ); + + let endpoint = cfg.load::().expect("endpoint set in config"); + assert_eq!(endpoint.url(), "https://www.us-east-2.example.com"); + + self.called.store(true, Ordering::Relaxed); + Ok(()) + } + } + + let interceptor = TestInterceptor::default(); + let config = Config::builder() + .http_client(NeverClient::new()) + .interceptor(interceptor.clone()) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_millis(30)) + .build(), + ) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .a_string_param("hello") + .a_bool_param(false) + .build(); + let client = Client::from_conf(config); + + let _ = dbg!(client.test_operation().bucket("bucket-name").send().await); + assert!( + interceptor.called.load(Ordering::Relaxed), + "the interceptor should have been called" + ); + + // bucket_name is unset and marked as required on the model, so we'll refuse to construct this request + let err = client.test_operation().send().await.expect_err("param missing"); + assert_eq!(format!("{}", err), "failed to construct request"); } """, + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(clientCodegenContext.runtimeConfig) + .toType().resolve("client::http::test_util::NeverClient"), + "TokioSleep" to CargoDependency.smithyAsync(clientCodegenContext.runtimeConfig) + .withFeature("rt-tokio").toType().resolve("rt::sleep::TokioSleep"), ) } } // the model has an intentionally failing test—ensure it fails - val failure = shouldThrow { "cargo test".runWithWarnings(testDir) } + val failure = shouldThrow { "cargo test".runWithWarnings(testDir) } failure.output shouldContain "endpoint::test::test_1" failure.output shouldContain "https://failingtest.com" "cargo clippy".runWithWarnings(testDir) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt index 34781b1eac9..58e23cb28b0 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt @@ -9,12 +9,12 @@ import org.junit.jupiter.api.Test import software.amazon.smithy.model.node.ArrayNode import software.amazon.smithy.model.node.BooleanNode import software.amazon.smithy.model.node.Node -import software.amazon.smithy.rulesengine.language.stdlib.BooleanEquals import software.amazon.smithy.rulesengine.language.syntax.Identifier -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Literal -import software.amazon.smithy.rulesengine.language.syntax.expr.Template -import software.amazon.smithy.rulesengine.language.syntax.fn.LibraryFunction +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.BooleanEquals +import software.amazon.smithy.rulesengine.language.syntax.expressions.functions.StringEquals +import software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry import software.amazon.smithy.rust.codegen.core.rustlang.rust @@ -26,25 +26,13 @@ import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.unitTest internal class ExprGeneratorTest { - /** - * This works around a bug in smithy-endpoint-rules where the constructors on functions like `BooleanEquals` - * hit the wrong branch in the visitor (but when they get parsed, they hit the right branch). - */ - fun Expression.shoop() = Expression.fromNode(this.toNode()) private val testContext = Context(FunctionRegistry(listOf()), TestRuntimeConfig) - @Test - fun `fail when smithy is fixed`() { - check(BooleanEquals.ofExpressions(Expression.of(true), Expression.of(true)) is LibraryFunction) { - "smithy has been fixed, shoop can be removed" - } - } - @Test fun generateExprs() { - val boolEq = Expression.of(true).equal(true).shoop() - val strEq = Expression.of("helloworld").equal("goodbyeworld").not().shoop() - val combined = BooleanEquals.ofExpressions(boolEq, strEq).shoop() + val boolEq = BooleanEquals.ofExpressions(Expression.of(true), Expression.of(true)) + val strEq = StringEquals.ofExpressions(Expression.of("helloworld"), Expression.of("goodbyeworld")).not() + val combined = BooleanEquals.ofExpressions(boolEq, strEq) TestWorkspace.testProject().unitTest { val generator = ExpressionGenerator(Ownership.Borrowed, testContext) rust("assert_eq!(true, #W);", generator.generate(boolEq)) @@ -55,10 +43,10 @@ internal class ExprGeneratorTest { @Test fun generateLiterals1() { - val literal = Literal.record( + val literal = Literal.recordLiteral( mutableMapOf( - Identifier.of("this") to Literal.integer(5), - Identifier.of("that") to Literal.string( + Identifier.of("this") to Literal.integerLiteral(5), + Identifier.of("that") to Literal.stringLiteral( Template.fromString("static"), ), ), diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt index 8e78e1983c6..95188a9b5dd 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt @@ -6,8 +6,8 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen import org.junit.jupiter.api.Test -import software.amazon.smithy.rulesengine.language.syntax.expr.Expression -import software.amazon.smithy.rulesengine.language.syntax.expr.Template +import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression +import software.amazon.smithy.rulesengine.language.syntax.expressions.Template import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt index 43540334852..9c0817e5c55 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt @@ -119,7 +119,10 @@ class ClientEnumGeneratorTest { """ assert_eq!(SomeEnum::from("Unknown"), SomeEnum::UnknownValue); assert_eq!(SomeEnum::from("UnknownValue"), SomeEnum::UnknownValue_); - assert_eq!(SomeEnum::from("SomethingNew"), SomeEnum::Unknown(crate::primitives::UnknownVariantValue("SomethingNew".to_owned()))); + assert_eq!( + SomeEnum::from("SomethingNew"), + SomeEnum::Unknown(crate::primitives::sealed_enum_unknown::UnknownVariantValue("SomethingNew".to_owned())) + ); """, ) } @@ -150,7 +153,10 @@ class ClientEnumGeneratorTest { assert_eq!(instance.as_str(), "t2.micro"); assert_eq!(InstanceType::from("t2.nano"), InstanceType::T2Nano); // round trip unknown variants: - assert_eq!(InstanceType::from("other"), InstanceType::Unknown(crate::primitives::UnknownVariantValue("other".to_owned()))); + assert_eq!( + InstanceType::from("other"), + InstanceType::Unknown(crate::primitives::sealed_enum_unknown::UnknownVariantValue("other".to_owned())) + ); assert_eq!(InstanceType::from("other").as_str(), "other"); """, ) diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt index b1ee6311a69..b60f99a67de 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt @@ -6,14 +6,12 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApiTestUtil import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.testModule import software.amazon.smithy.rust.codegen.core.testutil.tokioTest @@ -39,42 +37,29 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { @Test fun `operation overrides endpoint resolver`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "EndpointResolverParams" to RuntimeType.smithyRuntimeApi(runtimeConfig) - .resolve("client::orchestrator::EndpointResolverParams"), + .resolve("client::endpoint::EndpointResolverParams"), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), + "capture_request" to RuntimeType.captureRequest(runtimeConfig), ) rustCrate.testModule { - addDependency(CargoDependency.Tokio.withFeature("test-util").toDevDependency()) + addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) tokioTest("test_operation_overrides_endpoint_resolver") { rustTemplate( """ - use #{ConfigBagAccessors}; - use #{RuntimePlugin}; - let expected_url = "http://localhost:1234/"; - let client_config = crate::config::Config::builder().build(); + let (http_client, req) = #{capture_request}(None); + let client_config = crate::config::Config::builder().http_client(http_client).build(); let config_override = - crate::config::Config::builder().endpoint_resolver(expected_url); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config.config().unwrap(), - config_override, - }; - let sut_layer = sut.config().unwrap(); - let endpoint_resolver = sut_layer.endpoint_resolver(); - let endpoint = endpoint_resolver - .resolve_endpoint(&#{EndpointResolverParams}::new(crate::config::endpoint::Params {})) - .await - .unwrap(); - - assert_eq!(expected_url, endpoint.url()); + crate::config::Config::builder().endpoint_url(expected_url); + let client = crate::Client::from_conf(client_config); + let _ = dbg!(client.say_hello().customize().config_override(config_override).send().await); + assert_eq!("http://localhost:1234/", req.expect_request().uri()); """, *codegenScope, ) @@ -85,28 +70,24 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { @Test fun `operation overrides http connector`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), ) rustCrate.testModule { - addDependency(CargoDependency.Tokio.withFeature("test-util").toDevDependency()) - tokioTest("test_operation_overrides_http_connection") { + addDependency(CargoDependency.Tokio.toDevDependency().withFeature("test-util")) + tokioTest("test_operation_overrides_http_client") { rustTemplate( """ use #{AsyncSleep}; - let (conn, captured_request) = #{capture_request}(#{None}); + let (http_client, captured_request) = #{capture_request}(#{None}); let expected_url = "http://localhost:1234/"; let client_config = crate::config::Config::builder() - .endpoint_resolver(expected_url) - .http_connector(#{NeverConnector}::new()) + .endpoint_url(expected_url) + .http_client(#{NeverClient}::new()) .build(); let client = crate::client::Client::from_conf(client_config.clone()); let sleep = #{TokioSleep}::new(); @@ -125,9 +106,7 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { let customizable_send = client .say_hello() .customize() - .await - .unwrap() - .config_override(crate::config::Config::builder().http_connector(conn)) + .config_override(crate::config::Config::builder().http_client(http_client)) .send(); let timeout = #{Timeout}::new( @@ -151,11 +130,11 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { *codegenScope, "AsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::AsyncSleep"), "capture_request" to RuntimeType.captureRequest(runtimeConfig), - "NeverConnector" to RuntimeType.smithyClient(runtimeConfig) - .resolve("never::NeverConnector"), + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(runtimeConfig).toType() + .resolve("client::http::test_util::NeverClient"), "Timeout" to RuntimeType.smithyAsync(runtimeConfig).resolve("future::timeout::Timeout"), - "TokioSleep" to RuntimeType.smithyAsync(runtimeConfig) - .resolve("rt::sleep::TokioSleep"), + "TokioSleep" to CargoDependency.smithyAsync(runtimeConfig).withFeature("rt-tokio") + .toType().resolve("rt::sleep::TokioSleep"), ) } } @@ -163,19 +142,16 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { } @Test - fun `operation overrides retry strategy`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + fun `operation overrides retry config`() { + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> val runtimeConfig = clientCodegenContext.runtimeConfig val codegenScope = arrayOf( *preludeScope, "AlwaysRetry" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::AlwaysRetry"), "ConfigBag" to RuntimeType.smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag"), - "ConfigBagAccessors" to RuntimeType.configBagAccessors(runtimeConfig), "ErrorKind" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::ErrorKind"), + "Input" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::Input"), "InterceptorContext" to RuntimeType.interceptorContext(runtimeConfig), "Layer" to RuntimeType.smithyTypes(runtimeConfig).resolve("config_bag::Layer"), "OrchestratorError" to RuntimeType.smithyRuntimeApi(runtimeConfig) @@ -183,58 +159,81 @@ internal class ConfigOverrideRuntimePluginGeneratorTest { "RetryConfig" to RuntimeType.smithyTypes(clientCodegenContext.runtimeConfig) .resolve("retry::RetryConfig"), "RequestAttempts" to smithyRuntimeApiTestUtil(runtimeConfig).toType() - .resolve("client::request_attempts::RequestAttempts"), + .resolve("client::retries::RequestAttempts"), "RetryClassifiers" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::RetryClassifiers"), + "RuntimeComponentsBuilder" to RuntimeType.runtimeComponentsBuilder(runtimeConfig), "RuntimePlugin" to RuntimeType.runtimePlugin(runtimeConfig), + "StandardRetryStrategy" to RuntimeType.smithyRuntime(runtimeConfig) + .resolve("client::retries::strategy::StandardRetryStrategy"), "ShouldAttempt" to RuntimeType.smithyRuntimeApi(runtimeConfig) .resolve("client::retries::ShouldAttempt"), - "TypeErasedBox" to RuntimeType.smithyTypes(runtimeConfig).resolve("type_erasure::TypeErasedBox"), ) rustCrate.testModule { - unitTest("test_operation_overrides_retry_strategy") { + unitTest("test_operation_overrides_retry_config") { rustTemplate( """ - use #{ConfigBagAccessors}; use #{RuntimePlugin}; + use ::aws_smithy_runtime_api::client::retries::RetryStrategy; let client_config = crate::config::Config::builder() .retry_config(#{RetryConfig}::standard().with_max_attempts(3)) .build(); - let client_config_layer = client_config.config().unwrap(); - - let mut ctx = #{InterceptorContext}::new(#{TypeErasedBox}::new(())); + let mut ctx = #{InterceptorContext}::new(#{Input}::doesnt_matter()); ctx.set_output_or_error(#{Err}(#{OrchestratorError}::other("doesn't matter"))); + let mut layer = #{Layer}::new("test"); layer.store_put(#{RequestAttempts}::new(1)); - layer.set_retry_classifiers( - #{RetryClassifiers}::new().with_classifier(#{AlwaysRetry}(#{ErrorKind}::TransientError)), - ); let mut cfg = #{ConfigBag}::of_layers(vec![layer]); + let client_config_layer = client_config.config; cfg.push_shared_layer(client_config_layer.clone()); - let retry = cfg.retry_strategy().unwrap(); + let retry_classifiers_component = #{RuntimeComponentsBuilder}::new("retry_classifier") + .with_retry_classifier(#{AlwaysRetry}(#{ErrorKind}::TransientError)); + + // Emulate the merging of runtime components from runtime plugins that the orchestrator does + let runtime_components = #{RuntimeComponentsBuilder}::for_tests() + // emulate the default retry config plugin by setting a retry strategy + .with_retry_strategy(#{Some}(#{StandardRetryStrategy}::new())) + .merge_from(&client_config.runtime_components) + .merge_from(&retry_classifiers_component) + .build() + .unwrap(); + + let retry = runtime_components.retry_strategy(); assert!(matches!( - retry.should_attempt_retry(&ctx, &cfg).unwrap(), + retry.should_attempt_retry(&ctx, &runtime_components, &cfg).unwrap(), #{ShouldAttempt}::YesAfterDelay(_) )); // sets `max_attempts` to 1 implicitly by using `disabled()`, forcing it to run out of // attempts with respect to `RequestAttempts` set to 1 above - let config_override = crate::config::Config::builder() + let config_override_builder = crate::config::Config::builder() .retry_config(#{RetryConfig}::disabled()); - let sut = crate::config::ConfigOverrideRuntimePlugin { - client_config: client_config_layer, - config_override, - }; + let config_override = config_override_builder.clone().build(); + let sut = crate::config::ConfigOverrideRuntimePlugin::new( + config_override_builder, + client_config_layer, + &client_config.runtime_components, + ); let sut_layer = sut.config().unwrap(); cfg.push_shared_layer(sut_layer); - let retry = cfg.retry_strategy().unwrap(); + // Emulate the merging of runtime components from runtime plugins that the orchestrator does + let runtime_components = #{RuntimeComponentsBuilder}::for_tests() + // emulate the default retry config plugin by setting a retry strategy + .with_retry_strategy(#{Some}(#{StandardRetryStrategy}::new())) + .merge_from(&client_config.runtime_components) + .merge_from(&retry_classifiers_component) + .merge_from(&config_override.runtime_components) + .build() + .unwrap(); + + let retry = runtime_components.retry_strategy(); assert!(matches!( - retry.should_attempt_retry(&ctx, &cfg).unwrap(), + retry.should_attempt_retry(&ctx, &runtime_components, &cfg).unwrap(), #{ShouldAttempt}::No )); """, diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt index 34225e8dfd6..c645759040f 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt @@ -7,20 +7,18 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.traits.EndpointTrait -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.Attribute +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel @@ -37,10 +35,8 @@ internal class EndpointTraitBindingsTest { epTrait.prefixFormatString() shouldBe ("\"{foo}.data\"") } - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generate endpoint prefixes`(smithyRuntimeModeStr: String) { - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) + @Test + fun `generate endpoint prefixes`() { val model = """ namespace test @readonly @@ -73,12 +69,11 @@ internal class EndpointTraitBindingsTest { """, ) implBlock(symbolProvider.toSymbol(model.lookup("test#GetStatusInput"))) { - rustBlock( - "fn endpoint_prefix(&self) -> std::result::Result<#T::endpoint::EndpointPrefix, #T>", - RuntimeType.smithyHttp(TestRuntimeConfig), - TestRuntimeConfig.operationBuildError(), + rustBlockTemplate( + "fn endpoint_prefix(&self) -> std::result::Result<#{endpoint}::EndpointPrefix, #{endpoint}::error::InvalidEndpointError>", + "endpoint" to RuntimeType.smithyHttp(TestRuntimeConfig).resolve("endpoint"), ) { - endpointBindingGenerator.render(this, "self", smithyRuntimeMode) + endpointBindingGenerator.render(this, "self") } } unitTest( @@ -126,8 +121,22 @@ internal class EndpointTraitBindingsTest { val model = """ namespace com.example use aws.protocols#awsJson1_0 + use smithy.rules#endpointRuleSet + @awsJson1_0 @aws.api#service(sdkId: "Test", endpointPrefix: "differentprefix") + @endpointRuleSet({ + "version": "1.0", + "rules": [{ + "conditions": [], + "type": "endpoint", + "endpoint": { + "url": "https://example.com", + "properties": {} + } + }], + "parameters": {} + }) service TestService { operations: [SayHello], version: "1" @@ -146,24 +155,97 @@ internal class EndpointTraitBindingsTest { val moduleName = clientCodegenContext.moduleUseName() rustCrate.integrationTest("test_endpoint_prefix") { Attribute.TokioTest.render(this) - rust( + rustTemplate( """ async fn test_endpoint_prefix() { - let conf = $moduleName::Config::builder().build(); - $moduleName::operation::say_hello::SayHelloInput::builder() - .greeting("hey there!").build().expect("input is valid") - .make_operation(&conf).await.expect_err("no spaces or exclamation points in ep prefixes"); - let op = $moduleName::operation::say_hello::SayHelloInput::builder() - .greeting("hello") - .build().expect("valid operation") - .make_operation(&conf).await.expect("hello is a valid prefix"); - let properties = op.properties(); - let prefix = properties.get::() - .expect("prefix should be in config") - .as_str(); - assert_eq!(prefix, "test123.hello."); + use #{capture_request}; + use aws_smithy_http::endpoint::EndpointPrefix; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::config_bag::ConfigBag; + use std::sync::atomic::{AtomicU32, Ordering}; + use std::sync::{Arc, Mutex}; + use $moduleName::{ + config::interceptors::BeforeTransmitInterceptorContextRef, + config::Intercept, + error::DisplayErrorContext, + {Client, Config}, + }; + + ##[derive(Clone, Debug, Default)] + struct TestInterceptor { + called: Arc, + last_endpoint_prefix: Arc>>, + } + impl Intercept for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + + fn read_before_transmit( + &self, + _context: &BeforeTransmitInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.called.fetch_add(1, Ordering::Relaxed); + if let Some(prefix) = cfg.load::() { + self.last_endpoint_prefix + .lock() + .unwrap() + .replace(prefix.clone()); + } + Ok(()) + } + } + + let (http_client, _r) = capture_request(Some( + http::Response::builder() + .status(200) + .body(SdkBody::from("")) + .unwrap(), + )); + let interceptor = TestInterceptor::default(); + let config = Config::builder() + .http_client(http_client) + .interceptor(interceptor.clone()) + .build(); + let client = Client::from_conf(config); + let err = dbg!(client.say_hello().greeting("hey there!").send().await) + .expect_err("the endpoint should be invalid since it has an exclamation mark in it"); + let err_fmt = format!("{}", DisplayErrorContext(err)); + assert!( + err_fmt.contains("endpoint prefix could not be built"), + "expected '{}' to contain 'endpoint prefix could not be built'", + err_fmt + ); + + assert!( + interceptor.called.load(Ordering::Relaxed) == 0, + "the interceptor should not have been called since endpoint resolution failed" + ); + + dbg!(client.say_hello().greeting("hello").send().await) + .expect("hello is a valid endpoint prefix"); + assert!( + interceptor.called.load(Ordering::Relaxed) == 1, + "the interceptor should have been called" + ); + assert_eq!( + "test123.hello.", + interceptor + .last_endpoint_prefix + .lock() + .unwrap() + .clone() + .unwrap() + .as_str() + ); } """, + "capture_request" to CargoDependency.smithyRuntimeTestUtil(clientCodegenContext.runtimeConfig) + .toType().resolve("client::http::test_util::capture_request"), ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt new file mode 100644 index 00000000000..69691b476e5 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt @@ -0,0 +1,125 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +package software.amazon.smithy.rust.codegen.client.smithy.generators + +import org.junit.jupiter.api.Test +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.unitTest +import software.amazon.smithy.rust.codegen.core.util.lookup + +class ErrorCorrectionTest { + private val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + + operation SayHello { input: TestInput } + structure TestInput { nested: TestStruct } + structure TestStruct { + @required + foo: String, + @required + byteValue: Byte, + @required + listValue: StringList, + @required + mapValue: ListMap, + @required + doubleListValue: DoubleList + @required + document: Document + @required + nested: Nested + @required + blob: Blob + @required + enum: Enum + @required + union: U + notRequired: String + } + + enum Enum { + A, + B, + C + } + + union U { + A: Integer, + B: String, + C: Unit + } + + structure Nested { + @required + a: String + } + + list StringList { + member: String + } + + list DoubleList { + member: StringList + } + + map ListMap { + key: String, + value: StringList + } + """.asSmithyModel(smithyVersion = "2.0") + + @Test + fun correctMissingFields() { + val shape = model.lookup("com.example#TestStruct") + clientIntegrationTest(model) { ctx, crate -> + crate.lib { + val codegenCtx = + arrayOf("correct_errors" to ctx.correctErrors(shape)!!, "Shape" to ctx.symbolProvider.toSymbol(shape)) + rustTemplate( + """ + /// avoid unused warnings + pub fn use_fn_publicly() { #{correct_errors}(#{Shape}::builder()); } """, + *codegenCtx, + ) + unitTest("test_default_builder") { + rustTemplate( + """ + let builder = #{correct_errors}(#{Shape}::builder().foo("abcd")); + let shape = builder.build().unwrap(); + // don't override a field already set + assert_eq!(shape.foo(), "abcd"); + // set nested fields + assert_eq!(shape.nested().a(), ""); + // don't default non-required fields + assert_eq!(shape.not_required(), None); + + // set defaults for everything else + assert_eq!(shape.blob().as_ref(), b""); + + assert!(shape.list_value().is_empty()); + assert!(shape.map_value().is_empty()); + assert!(shape.double_list_value().is_empty()); + + // enums and unions become unknown variants + assert!(matches!(shape.r##enum(), crate::types::Enum::Unknown(_))); + assert!(shape.union().is_unknown()); + """, + *codegenCtx, + ) + } + } + } + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt index 0726c6870c3..4b3d7f3a5f7 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt @@ -6,11 +6,9 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.rust -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest @@ -71,23 +69,9 @@ internal class PaginatorGeneratorTest { } """.asSmithyModel() - // TODO(enableNewSmithyRuntimeCleanup): Remove this middleware test when launching - @Test - fun `generate paginators that compile with middleware`() { - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> - rustCrate.integrationTest("paginators_generated") { - Attribute.AllowUnusedImports.render(this) - rust("use ${clientCodegenContext.moduleUseName()}::operation::paginated_list::paginator::PaginatedListPaginator;") - } - } - } - @Test fun `generate paginators that compile`() { - clientIntegrationTest( - model, - params = IntegrationTestParams(additionalSettings = TestCodegenSettings.orchestratorMode()), - ) { clientCodegenContext, rustCrate -> + clientIntegrationTest(model) { clientCodegenContext, rustCrate -> rustCrate.integrationTest("paginators_generated") { Attribute.AllowUnusedImports.render(this) rust("use ${clientCodegenContext.moduleUseName()}::operation::paginated_list::paginator::PaginatedListPaginator;") diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt new file mode 100644 index 00000000000..c14d6b21fbe --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt @@ -0,0 +1,61 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators.client + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RustCrate +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class CustomizableOperationGeneratorTest { + val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + + @optionalAuth + operation SayHello { input: TestInput } + structure TestInput { + foo: String, + } + """.asSmithyModel() + + @Test + fun `CustomizableOperation is send and sync`() { + val test: (ClientCodegenContext, RustCrate) -> Unit = { codegenContext, rustCrate -> + rustCrate.integrationTest("customizable_operation_is_send_and_sync") { + val moduleName = codegenContext.moduleUseName() + rustTemplate( + """ + fn check_send_and_sync(_: T) {} + + ##[test] + fn test() { + let config = $moduleName::Config::builder() + .http_client(#{NeverClient}::new()) + .endpoint_url("http://localhost:1234") + .build(); + let client = $moduleName::Client::from_conf(config); + check_send_and_sync(client.say_hello().customize()); + } + """, + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::NeverClient"), + ) + } + } + clientIntegrationTest(model, test = test) + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt index de6b6f175e3..f36c0dbfdcc 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt @@ -5,18 +5,16 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.client +import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test -import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext -import software.amazon.smithy.rust.codegen.client.testutil.TestCodegenSettings +import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.integrationTest +import software.amazon.smithy.rust.codegen.core.util.lookup class FluentClientGeneratorTest { val model = """ @@ -34,12 +32,42 @@ class FluentClientGeneratorTest { structure TestInput { foo: String, byteValue: Byte, + listValue: StringList, + mapValue: ListMap, + doubleListValue: DoubleList + } + + list StringList { + member: String + } + + list DoubleList { + member: StringList + } + + map ListMap { + key: String, + value: StringList } """.asSmithyModel() + @Test + fun `generate correct input docs`() { + val expectations = mapOf( + "listValue" to "list_value(impl Into)", + "doubleListValue" to "double_list_value(Vec::)", + "mapValue" to "map_value(impl Into, Vec::)", + "byteValue" to "byte_value(i8)", + ) + expectations.forEach { (name, expect) -> + val member = model.lookup("com.example#TestInput\$$name") + member.asFluentBuilderInputDoc(testSymbolProvider(model)) shouldBe expect + } + } + @Test fun `send() future implements Send`() { - val test: (ClientCodegenContext, RustCrate) -> Unit = { codegenContext, rustCrate -> + clientIntegrationTest(model) { codegenContext, rustCrate -> rustCrate.integrationTest("send_future_is_send") { val moduleName = codegenContext.moduleUseName() rustTemplate( @@ -48,58 +76,35 @@ class FluentClientGeneratorTest { ##[test] fn test() { - let connector = #{TestConnection}::<#{SdkBody}>::new(Vec::new()); let config = $moduleName::Config::builder() - .endpoint_resolver("http://localhost:1234") - #{set_http_connector} + .endpoint_url("http://localhost:1234") + .http_client(#{NeverClient}::new()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); check_send(client.say_hello().send()); } """, - "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) - .withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), - "set_http_connector" to writable { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rust(".http_connector(connector.clone())") - } - }, + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::NeverClient"), ) } } - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams, test = test) - clientIntegrationTest( - model, - TestCodegenSettings.orchestratorModeTestParams, - test = test, - ) } @Test fun `generate inner builders`() { - val test: (ClientCodegenContext, RustCrate) -> Unit = { codegenContext, rustCrate -> + clientIntegrationTest(model) { codegenContext, rustCrate -> rustCrate.integrationTest("inner_builder") { val moduleName = codegenContext.moduleUseName() rustTemplate( """ ##[test] fn test() { - let connector = #{TestConnection}::<#{SdkBody}>::new(Vec::new()); let config = $moduleName::Config::builder() - .endpoint_resolver("http://localhost:1234") - #{set_http_connector} + .endpoint_url("http://localhost:1234") + .http_client(#{NeverClient}::new()) .build(); - let smithy_client = aws_smithy_client::Builder::new() - .connector(connector.clone()) - .middleware_fn(|r| r) - .build_dyn(); - let client = $moduleName::Client::with_config(smithy_client, config); + let client = $moduleName::Client::from_conf(config); let say_hello_fluent_builder = client.say_hello().byte_value(4).foo("hello!"); assert_eq!(*say_hello_fluent_builder.get_foo(), Some("hello!".to_string())); @@ -107,23 +112,25 @@ class FluentClientGeneratorTest { assert_eq!(*input.get_byte_value(), Some(4)); } """, - "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) - .withFeature("test-util").toType() - .resolve("test_connection::TestConnection"), - "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), - "set_http_connector" to writable { - if (codegenContext.smithyRuntimeMode.generateOrchestrator) { - rust(".http_connector(connector.clone())") - } - }, + "NeverClient" to CargoDependency.smithyRuntimeTestUtil(codegenContext.runtimeConfig).toType() + .resolve("client::http::test_util::NeverClient"), ) } } - clientIntegrationTest(model, TestCodegenSettings.middlewareModeTestParams, test = test) - clientIntegrationTest( - model, - TestCodegenSettings.orchestratorModeTestParams, - test = test, - ) + } + + @Test + fun `dead-code warning should not be issued when a service has no operations`() { + val model = """ + namespace com.example + use aws.protocols#awsJson1_0 + + @awsJson1_0 + service HelloService { + version: "1" + } + """.asSmithyModel() + + clientIntegrationTest(model) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt deleted file mode 100644 index 2ae469608e2..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomizationTest.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.smithy.generators.config - -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.client.testutil.validateConfigCustomizations -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode -import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel - -class IdempotencyTokenProviderCustomizationTest { - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generates a valid config`(smithyRuntimeModeStr: String) { - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val model = "namespace test".asSmithyModel() - val codegenContext = testClientCodegenContext(model).withSmithyRuntimeMode(smithyRuntimeMode) - validateConfigCustomizations( - codegenContext, - IdempotencyTokenProviderCustomization(codegenContext), - ) - } -} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt index 646d6863e9b..7cdd0f7b890 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt @@ -7,23 +7,18 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.config import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule -import software.amazon.smithy.rust.codegen.client.smithy.SmithyRuntimeMode -import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext -import software.amazon.smithy.rust.codegen.client.testutil.withSmithyRuntimeMode +import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization -import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace +import software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.unitTest import software.amazon.smithy.rust.codegen.core.util.lookup import software.amazon.smithy.rust.codegen.core.util.toPascalCase @@ -84,74 +79,44 @@ internal class ServiceConfigGeneratorTest { model.lookup("com.example#ResourceService").needsIdempotencyToken(model) shouldBe true } - @ParameterizedTest - @ValueSource(strings = ["middleware", "orchestrator"]) - fun `generate customizations as specified`(smithyRuntimeModeStr: String) { + @Test + fun `generate customizations as specified`() { class ServiceCustomizer(private val codegenContext: ClientCodegenContext) : NamedCustomization() { - private val runtimeMode = codegenContext.smithyRuntimeMode override fun section(section: ServiceConfig): Writable { return when (section) { ServiceConfig.ConfigStructAdditionalDocs -> emptySection - ServiceConfig.ConfigStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rust("config_field: u64,") - } - } ServiceConfig.ConfigImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - ##[allow(missing_docs)] - pub fn config_field(&self) -> u64 { - self.inner.load::<#{T}>().map(|u| u.0).unwrap() - } - """, - "T" to configParamNewtype( - "config_field".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } else { - rust( - """ - ##[allow(missing_docs)] - pub fn config_field(&self) -> u64 { - self.config_field - } - """, - ) - } + rustTemplate( + """ + ##[allow(missing_docs)] + pub fn config_field(&self) -> u64 { + self.config.load::<#{T}>().map(|u| u.0).unwrap() + } + """, + "T" to configParamNewtype( + "config_field".toPascalCase(), RuntimeType.U64.toSymbol(), + codegenContext.runtimeConfig, + ), + ) } - ServiceConfig.BuilderStruct -> writable { - if (runtimeMode.defaultToMiddleware) { - rust("config_field: Option") - } - } ServiceConfig.BuilderImpl -> writable { - if (runtimeMode.defaultToOrchestrator) { - rustTemplate( - """ - ##[allow(missing_docs)] - pub fn config_field(mut self, config_field: u64) -> Self { - self.inner.store_put(#{T}(config_field)); - self - } - """, - "T" to configParamNewtype( - "config_field".toPascalCase(), RuntimeType.U64.toSymbol(), - codegenContext.runtimeConfig, - ), - ) - } - } - ServiceConfig.BuilderBuild -> writable { - if (runtimeMode.defaultToMiddleware) { - rust("config_field: self.config_field.unwrap_or_default(),") - } + rustTemplate( + """ + ##[allow(missing_docs)] + pub fn config_field(mut self, config_field: u64) -> Self { + self.config.store_put(#{T}(config_field)); + self + } + """, + "T" to configParamNewtype( + "config_field".toPascalCase(), RuntimeType.U64.toSymbol(), + codegenContext.runtimeConfig, + ), + ) } else -> emptySection @@ -159,15 +124,19 @@ internal class ServiceConfigGeneratorTest { } } - val model = "namespace empty".asSmithyModel() - val smithyRuntimeMode = SmithyRuntimeMode.fromString(smithyRuntimeModeStr) - val codegenContext = testClientCodegenContext(model).withSmithyRuntimeMode(smithyRuntimeMode) - val sut = ServiceConfigGenerator(codegenContext, listOf(ServiceCustomizer(codegenContext))) - val symbolProvider = codegenContext.symbolProvider - val project = TestWorkspace.testProject(symbolProvider) - project.withModule(ClientRustModule.config) { - sut.render(this) - if (smithyRuntimeMode.defaultToOrchestrator) { + val serviceDecorator = object : ClientCodegenDecorator { + override val name: String = "Add service plugin" + override val order: Byte = 0 + override fun configCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List { + return baseCustomizations + ServiceCustomizer(codegenContext) + } + } + + clientIntegrationTest(BasicTestModels.AwsJson10TestModel, additionalDecorators = listOf(serviceDecorator)) { ctx, rustCrate -> + rustCrate.withModule(ClientRustModule.config) { unitTest( "set_config_fields", """ @@ -176,18 +145,29 @@ internal class ServiceConfigGeneratorTest { assert_eq!(config.config_field(), 99); """, ) - } else { + unitTest( - "set_config_fields", + "set_runtime_plugin", """ - let mut builder = Config::builder(); - builder.config_field = Some(99); - let config = builder.build(); - assert_eq!(config.config_field, 99); + use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; + use aws_smithy_types::config_bag::FrozenLayer; + + #[derive(Debug)] + struct TestRuntimePlugin; + + impl RuntimePlugin for TestRuntimePlugin { + fn config(&self) -> Option { + todo!("ExampleRuntimePlugin.config") + } + } + + let config = Config::builder() + .runtime_plugin(TestRuntimePlugin) + .build(); + assert_eq!(config.runtime_plugins.len(), 1); """, ) } } - project.compileAndTest() } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt index 590b7acb9c4..1f1b7032411 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt @@ -53,11 +53,12 @@ class OperationErrorGeneratorTest { name = "generates_combined_error_enums", test = """ use crate::operation::greeting::GreetingError; + use aws_smithy_types::error::ErrorMetadata; let error = GreetingError::InvalidGreeting( InvalidGreeting::builder() .message("an error") - .meta(aws_smithy_types::Error::builder().code("InvalidGreeting").message("an error").build()) + .meta(ErrorMetadata::builder().code("InvalidGreeting").message("an error").build()) .build() ); assert_eq!(format!("{}", error), "InvalidGreeting: an error"); @@ -71,7 +72,7 @@ class OperationErrorGeneratorTest { assert_eq!(error.is_complex_error(), false); // Unhandled variants properly delegate message. - let error = GreetingError::generic(aws_smithy_types::Error::builder().message("hello").build()); + let error = GreetingError::generic(ErrorMetadata::builder().message("hello").build()); assert_eq!(error.meta().message(), Some("hello")); let error = GreetingError::unhandled("some other error"); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt index 0f26fc7b42b..a8ce5b832a0 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt @@ -84,4 +84,30 @@ internal class ServiceErrorGeneratorTest { } } } + + @Test + fun `provides error metadata`() { + clientIntegrationTest(model) { _, rustCrate -> + rustCrate.moduleFor(model.lookup("com.example#CanYouRepeatThat")) { + unitTest( + name = "generates_combined_error_enums", + test = """ + use crate::Error; + use crate::error::{ErrorMetadata, ProvideErrorMetadata}; + use crate::operation::say_hello::SayHelloError; + use crate::types::error::*; + + // Unhandled variants properly delegate source. + let error = Error::from(SayHelloError::SorryBusy( + SorryBusy::builder() + .meta(ErrorMetadata::builder().code("some code").message("some message").build()) + .build() + )); + assert_eq!("some code", error.code().expect("code field")); + assert_eq!("some message", error.message().expect("message field")); + """, + ) + } + } + } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt index a4b9f6e8b72..b02e6879b6d 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt @@ -11,6 +11,8 @@ import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver @@ -21,7 +23,6 @@ import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder -import software.amazon.smithy.rust.codegen.core.testutil.unitTest import software.amazon.smithy.rust.codegen.core.util.lookup import software.amazon.smithy.rust.codegen.core.util.outputShape @@ -95,21 +96,28 @@ class ResponseBindingGeneratorTest { val testProject = TestWorkspace.testProject(symbolProvider) testProject.renderOperation() testProject.withModule(symbolProvider.moduleForShape(outputShape)) { - unitTest( - "http_header_deser", + rustTemplate( """ - use crate::protocol_serde::shape_put_object_output::*; - let resp = http::Response::builder() - .header("X-Ints", "1,2,3") - .header("X-Ints", "4,5,6") - .header("X-MediaType", "c21pdGh5LXJz") - .header("X-Dates", "Mon, 16 Dec 2019 23:48:18 GMT") - .header("X-Dates", "Mon, 16 Dec 2019 23:48:18 GMT,Tue, 17 Dec 2019 23:48:18 GMT") - .body(()).expect("valid request"); - assert_eq!(de_int_list_header(resp.headers()).unwrap(), Some(vec![1,2,3,4,5,6])); - assert_eq!(de_media_type_header(resp.headers()).expect("valid").unwrap(), "smithy-rs"); - assert_eq!(de_date_header_list_header(resp.headers()).unwrap().unwrap().len(), 3); + ##[test] + fn http_header_deser() { + use crate::protocol_serde::shape_put_object_output::*; + let resp = #{Response}::try_from( + #{http}::Response::builder() + .header("X-Ints", "1,2,3") + .header("X-Ints", "4,5,6") + .header("X-MediaType", "c21pdGh5LXJz") + .header("X-Dates", "Mon, 16 Dec 2019 23:48:18 GMT") + .header("X-Dates", "Mon, 16 Dec 2019 23:48:18 GMT,Tue, 17 Dec 2019 23:48:18 GMT") + .body(()) + .expect("valid request") + ).unwrap(); + assert_eq!(de_int_list_header(resp.headers()).unwrap(), Some(vec![1,2,3,4,5,6])); + assert_eq!(de_media_type_header(resp.headers()).expect("valid").unwrap(), "smithy-rs"); + assert_eq!(de_date_header_list_header(resp.headers()).unwrap().unwrap().len(), 3); + } """, + "Response" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve("http::Response"), + "http" to RuntimeType.Http, ) } testProject.compileAndTest() diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGeneratorTest.kt new file mode 100644 index 00000000000..760eced3874 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGeneratorTest.kt @@ -0,0 +1,71 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel + +class ProtocolParserGeneratorTest { + private val model = """ + ${'$'}version: "2.0" + namespace test + + use aws.protocols#restJson1 + + @restJson1 + service TestService { + version: "2019-12-16", + operations: [SomeOperation] + errors: [SomeTopLevelError] + } + + @http(uri: "/SomeOperation", method: "POST") + operation SomeOperation { + input: SomeOperationInputOutput, + output: SomeOperationInputOutput, + errors: [SomeOperationError] + } + + structure SomeOperationInputOutput { + payload: String, + a: String, + b: Integer + } + + @error("server") + structure SomeTopLevelError { + @required + requestId: String + + @required + message: String + + code: String = "400" + + context: String + } + + @error("client") + structure SomeOperationError { + @required + requestId: String + + @required + message: String + + code: String = "400" + + context: String + } + """ + .asSmithyModel() + + @Test + fun `generate an complex error structure that compiles`() { + clientIntegrationTest(model) { _, _ -> } + } +} diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt index c80ed9ba047..401e7b8007f 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt @@ -8,138 +8,115 @@ package software.amazon.smithy.rust.codegen.client.smithy.generators.protocol import io.kotest.matchers.string.shouldContain import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows -import software.amazon.smithy.aws.traits.protocols.RestJson1Trait import software.amazon.smithy.model.shapes.OperationShape -import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization -import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator -import software.amazon.smithy.rust.codegen.client.smithy.protocols.HttpBoundProtocolTraitImplGenerator +import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization +import software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest -import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter -import software.amazon.smithy.rust.codegen.core.rustlang.escape -import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate -import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.AdditionalPayloadContext -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator -import software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport -import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol -import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory -import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap -import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.dq -import software.amazon.smithy.rust.codegen.core.util.outputShape import java.nio.file.Path - -private class TestProtocolPayloadGenerator(private val body: String) : ProtocolPayloadGenerator { - override fun payloadMetadata(operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext) = - ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = false) - - override fun generatePayload( - writer: RustWriter, - shapeName: String, - operationShape: OperationShape, - additionalPayloadContext: AdditionalPayloadContext, - ) { - writer.writeWithNoFormatting(body) - } -} - -private class TestProtocolTraitImplGenerator( - private val codegenContext: ClientCodegenContext, - private val correctResponse: String, -) : HttpBoundProtocolTraitImplGenerator(codegenContext, RestJson(codegenContext)) { - private val symbolProvider = codegenContext.symbolProvider - - override fun generateTraitImpls( - operationWriter: RustWriter, - operationShape: OperationShape, - customizations: List, - ) { - operationWriter.rustTemplate( - """ - impl #{parse_strict} for ${operationShape.id.name}{ - type Output = Result<#{Output}, #{Error}>; - fn parse(&self, _response: &#{Response}<#{Bytes}>) -> Self::Output { - ${operationWriter.escape(correctResponse)} - } +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType as RT + +private class TestServiceRuntimePluginCustomization( + private val context: ClientCodegenContext, + private val fakeRequestBuilder: String, + private val fakeRequestBody: String, +) : ServiceRuntimePluginCustomization() { + override fun section(section: ServiceRuntimePluginSection): Writable = writable { + if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) { + val rc = context.runtimeConfig + section.registerInterceptor(this) { + rustTemplate( + """ + { + ##[derive(::std::fmt::Debug)] + struct TestInterceptor; + impl #{Intercept} for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + + fn modify_before_retry_loop( + &self, + context: &mut #{BeforeTransmitInterceptorContextMut}<'_>, + _rc: &#{RuntimeComponents}, + _cfg: &mut #{ConfigBag}, + ) -> #{Result}<(), #{BoxError}> { + // Replace the serialized request + let mut fake_req = ::http::Request::builder() + $fakeRequestBuilder + .body(#{SdkBody}::from($fakeRequestBody)) + .expect("valid request").try_into().unwrap(); + ::std::mem::swap( + context.request_mut(), + &mut fake_req, + ); + Ok(()) + } + } + + TestInterceptor + } + """, + *preludeScope, + "BeforeTransmitInterceptorContextMut" to RT.beforeTransmitInterceptorContextMut(rc), + "BoxError" to RT.boxError(rc), + "ConfigBag" to RT.configBag(rc), + "Intercept" to RT.intercept(rc), + "RuntimeComponents" to RT.runtimeComponents(rc), + "SdkBody" to RT.sdkBody(rc), + ) } - """, - "parse_strict" to RuntimeType.parseStrictResponse(codegenContext.runtimeConfig), - "Output" to symbolProvider.toSymbol(operationShape.outputShape(codegenContext.model)), - "Error" to symbolProvider.symbolForOperationError(operationShape), - "Response" to RuntimeType.HttpResponse, - "Bytes" to RuntimeType.Bytes, - ) - } -} - -private class TestProtocolMakeOperationGenerator( - codegenContext: CodegenContext, - protocol: Protocol, - body: String, - private val httpRequestBuilder: String, -) : MakeOperationGenerator( - codegenContext, - protocol, - TestProtocolPayloadGenerator(body), - public = true, - includeDefaultPayloadHeaders = true, -) { - override fun createHttpRequest(writer: RustWriter, operationShape: OperationShape) { - writer.rust("#T::new()", RuntimeType.HttpRequestBuilder) - writer.writeWithNoFormatting(httpRequestBuilder) + } } } -// A stubbed test protocol to do enable testing intentionally broken protocols -private class TestProtocolGenerator( - codegenContext: ClientCodegenContext, - protocol: Protocol, - httpRequestBuilder: String, - body: String, - correctResponse: String, -) : OperationGenerator( - codegenContext, - protocol, - TestProtocolMakeOperationGenerator(codegenContext, protocol, body, httpRequestBuilder), - TestProtocolPayloadGenerator(body), - TestProtocolTraitImplGenerator(codegenContext, correctResponse), -) - -private class TestProtocolFactory( - private val httpRequestBuilder: String, - private val body: String, - private val correctResponse: String, -) : ProtocolGeneratorFactory { - override fun protocol(codegenContext: ClientCodegenContext): Protocol = RestJson(codegenContext) - - override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator { - return TestProtocolGenerator( - codegenContext, - protocol(codegenContext), - httpRequestBuilder, - body, - correctResponse, - ) - } - - override fun support(): ProtocolSupport { - return ProtocolSupport( - requestSerialization = true, - requestBodySerialization = true, - responseDeserialization = true, - errorDeserialization = true, - requestDeserialization = false, - requestBodyDeserialization = false, - responseSerialization = false, - errorSerialization = false, - ) +private class TestOperationCustomization( + private val context: ClientCodegenContext, + private val fakeOutput: String, +) : OperationCustomization() { + override fun section(section: OperationSection): Writable = writable { + val rc = context.runtimeConfig + if (section is OperationSection.AdditionalRuntimePluginConfig) { + rustTemplate( + """ + // Override the default response deserializer with our fake output + ##[derive(::std::fmt::Debug)] + struct TestDeser; + impl #{DeserializeResponse} for TestDeser { + fn deserialize_nonstreaming( + &self, + _response: &#{HttpResponse}, + ) -> #{Result}<#{Output}, #{OrchestratorError}<#{Error}>> { + let fake_out: #{Result}< + crate::operation::say_hello::SayHelloOutput, + crate::operation::say_hello::SayHelloError, + > = $fakeOutput; + fake_out + .map(|o| #{Output}::erase(o)) + .map_err(|e| #{OrchestratorError}::operation(#{Error}::erase(e))) + } + } + cfg.store_put(#{SharedResponseDeserializer}::new(TestDeser)); + """, + *preludeScope, + "SharedResponseDeserializer" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::SharedResponseDeserializer"), + "Error" to RT.smithyRuntimeApi(rc).resolve("client::interceptors::context::Error"), + "HttpResponse" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"), + "OrchestratorError" to RT.smithyRuntimeApi(rc).resolve("client::orchestrator::OrchestratorError"), + "Output" to RT.smithyRuntimeApi(rc).resolve("client::interceptors::context::Output"), + "DeserializeResponse" to RT.smithyRuntimeApi(rc).resolve("client::ser_de::DeserializeResponse"), + ) + } } } @@ -226,22 +203,34 @@ class ProtocolTestGeneratorTest { * Returns the [Path] the service was generated at, suitable for running `cargo test` */ private fun testService( - httpRequestBuilder: String, - body: String = "${correctBody.dq()}.to_string()", - correctResponse: String = """Ok(crate::operation::say_hello::SayHelloOutput::builder().value("hey there!").build())""", + fakeRequestBuilder: String, + fakeRequestBody: String = "${correctBody.dq()}.to_string()", + fakeOutput: String = """Ok(crate::operation::say_hello::SayHelloOutput::builder().value("hey there!").build())""", ): Path { val codegenDecorator = object : ClientCodegenDecorator { override val name: String = "mock" override val order: Byte = 0 override fun classpathDiscoverable(): Boolean = false - override fun protocols( - serviceId: ShapeId, - currentProtocols: ProtocolMap, - ): ProtocolMap = - // Intentionally replace the builtin implementation of RestJson1 with our fake protocol - mapOf(RestJson1Trait.ID to TestProtocolFactory(httpRequestBuilder, body, correctResponse)) + + override fun serviceRuntimePluginCustomizations( + codegenContext: ClientCodegenContext, + baseCustomizations: List, + ): List = baseCustomizations + TestServiceRuntimePluginCustomization( + codegenContext, + fakeRequestBuilder, + fakeRequestBody, + ) + + override fun operationCustomizations( + codegenContext: ClientCodegenContext, + operation: OperationShape, + baseCustomizations: List, + ): List = baseCustomizations + TestOperationCustomization(codegenContext, fakeOutput) } - return clientIntegrationTest(model, additionalDecorators = listOf(codegenDecorator)) + return clientIntegrationTest( + model, + additionalDecorators = listOf(codegenDecorator), + ) } @Test @@ -257,14 +246,14 @@ class ProtocolTestGeneratorTest { @Test fun `test incorrect response parsing`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=Hello%20there&required") .header("X-Greeting", "Hi") .method("POST") """, - correctResponse = "Ok(crate::operation::say_hello::SayHelloOutput::builder().build())", + fakeOutput = "Ok(crate::operation::say_hello::SayHelloOutput::builder().build())", ) } @@ -273,7 +262,7 @@ class ProtocolTestGeneratorTest { @Test fun `test invalid body`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=Hello%20there&required") @@ -290,7 +279,7 @@ class ProtocolTestGeneratorTest { @Test fun `test invalid url parameter`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=INCORRECT&required") @@ -306,7 +295,7 @@ class ProtocolTestGeneratorTest { @Test fun `test forbidden url parameter`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?goodbye&Hi=Hello%20there&required") @@ -323,7 +312,7 @@ class ProtocolTestGeneratorTest { @Test fun `test required url parameter`() { // Hard coded implementation for this 1 test - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=Hello%20there") @@ -338,9 +327,26 @@ class ProtocolTestGeneratorTest { err.message shouldContain "required query param missing" } + @Test + fun `test invalid path`() { + val err = assertThrows { + testService( + """ + .uri("/incorrect-path?required&Hi=Hello%20there") + .header("X-Greeting", "Hi") + .method("POST") + """, + ) + } + + // Verify the test actually ran + err.message shouldContain "say_hello_request ... FAILED" + err.message shouldContain "path was incorrect" + } + @Test fun `invalid header`() { - val err = assertThrows { + val err = assertThrows { testService( """ .uri("/?Hi=Hello%20there&required") diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt index c5b2470dd9b..706e7b81c01 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt @@ -6,10 +6,12 @@ package software.amazon.smithy.rust.codegen.client.smithy.protocols import org.junit.jupiter.api.Test +import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest -import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel -import software.amazon.smithy.rust.codegen.core.testutil.integrationTest +import software.amazon.smithy.rust.codegen.core.util.lookup class AwsQueryCompatibleTest { @Test @@ -48,33 +50,40 @@ class AwsQueryCompatibleTest { } """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("should_parse_code_and_type_fields") { - rust( + clientIntegrationTest(model) { context, rustCrate -> + val operation: OperationShape = context.model.lookup("test#SomeOperation") + rustCrate.withModule(context.symbolProvider.moduleForShape(operation)) { + rustTemplate( """ - ##[test] - fn should_parse_code_and_type_fields() { - use aws_smithy_http::response::ParseStrictResponse; - - let response = http::Response::builder() - .header( - "x-amzn-query-error", - http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue;Sender"), - ) - .status(400) - .body( - r##"{ - "__type": "com.amazonaws.sqs##QueueDoesNotExist", - "message": "Some user-visible message" - }"##, - ) - .unwrap(); - let some_operation = $moduleName::operation::some_operation::SomeOperation::new(); - let error = some_operation - .parse(&response.map(bytes::Bytes::from)) - .err() - .unwrap(); + ##[cfg(test)] + ##[#{tokio}::test] + async fn should_parse_code_and_type_fields() { + use aws_smithy_types::body::SdkBody; + + let response = |_: http::Request| { + http::Response::builder() + .header( + "x-amzn-query-error", + http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue;Sender"), + ) + .status(400) + .body( + SdkBody::from( + r##"{ + "__type": "com.amazonaws.sqs##QueueDoesNotExist", + "message": "Some user-visible message" + }"## + ) + ) + .unwrap() + }; + let client = crate::Client::from_conf( + crate::Config::builder() + .http_client(#{infallible_client_fn}(response)) + .endpoint_url("http://localhost:1234") + .build() + ); + let error = dbg!(client.some_operation().send().await).err().unwrap().into_service_error(); assert_eq!( Some("AWS.SimpleQueueService.NonExistentQueue"), error.meta().code(), @@ -82,6 +91,9 @@ class AwsQueryCompatibleTest { assert_eq!(Some("Sender"), error.meta().extra("type")); } """, + "infallible_client_fn" to CargoDependency.smithyRuntimeTestUtil(context.runtimeConfig) + .toType().resolve("client::http::test_util::infallible_client_fn"), + "tokio" to CargoDependency.Tokio.toType(), ) } } @@ -118,33 +130,43 @@ class AwsQueryCompatibleTest { } """.asSmithyModel() - clientIntegrationTest(model) { clientCodegenContext, rustCrate -> - val moduleName = clientCodegenContext.moduleUseName() - rustCrate.integrationTest("should_parse_code_from_payload") { - rust( + clientIntegrationTest(model) { context, rustCrate -> + val operation: OperationShape = context.model.lookup("test#SomeOperation") + rustCrate.withModule(context.symbolProvider.moduleForShape(operation)) { + rustTemplate( """ - ##[test] - fn should_parse_code_from_payload() { - use aws_smithy_http::response::ParseStrictResponse; - - let response = http::Response::builder() - .status(400) - .body( - r##"{ - "__type": "com.amazonaws.sqs##QueueDoesNotExist", - "message": "Some user-visible message" - }"##, - ) - .unwrap(); - let some_operation = $moduleName::operation::some_operation::SomeOperation::new(); - let error = some_operation - .parse(&response.map(bytes::Bytes::from)) - .err() - .unwrap(); + ##[cfg(test)] + ##[#{tokio}::test] + async fn should_parse_code_from_payload() { + use aws_smithy_types::body::SdkBody; + + let response = |_: http::Request| { + http::Response::builder() + .status(400) + .body( + SdkBody::from( + r##"{ + "__type": "com.amazonaws.sqs##QueueDoesNotExist", + "message": "Some user-visible message" + }"##, + ) + ) + .unwrap() + }; + let client = crate::Client::from_conf( + crate::Config::builder() + .http_client(#{infallible_client_fn}(response)) + .endpoint_url("http://localhost:1234") + .build() + ); + let error = dbg!(client.some_operation().send().await).err().unwrap().into_service_error(); assert_eq!(Some("QueueDoesNotExist"), error.meta().code()); assert_eq!(None, error.meta().extra("type")); } """, + "infallible_client_fn" to CargoDependency.smithyRuntimeTestUtil(context.runtimeConfig) + .toType().resolve("client::http::test_util::infallible_client_fn"), + "tokio" to CargoDependency.Tokio.toType(), ) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt index d0118d1f84c..92d0b3663c3 100644 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt @@ -51,7 +51,7 @@ class ClientEventStreamUnmarshallerGeneratorTest { let result = $generator::new().unmarshall(&message); assert!(result.is_ok(), "expected ok, got: {:?}", result); match expect_error(result.unwrap()) { - TestStreamError::Unhandled(err) => { + err @ TestStreamError::Unhandled(_) => { let message = format!("{}", crate::error::DisplayErrorContext(&err)); let expected = "message: \"unmodeled error\""; assert!(message.contains(expected), "Expected '{message}' to contain '{expected}'"); diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestCodegenSettings.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestCodegenSettings.kt deleted file mode 100644 index a54397ff594..00000000000 --- a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestCodegenSettings.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package software.amazon.smithy.rust.codegen.client.testutil - -import software.amazon.smithy.model.node.ObjectNode -import software.amazon.smithy.model.node.StringNode -import software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams - -object TestCodegenSettings { - // TODO(enableNewSmithyRuntimeCleanup): Delete this when removing `enableNewSmithyRuntime` feature gate - fun middlewareMode(): ObjectNode = ObjectNode.objectNodeBuilder() - .withMember( - "codegen", - ObjectNode.objectNodeBuilder() - .withMember("enableNewSmithyRuntime", StringNode.from("middleware")).build(), - ) - .build() - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when removing `enableNewSmithyRuntime` feature gate - fun orchestratorMode(): ObjectNode = ObjectNode.objectNodeBuilder() - .withMember( - "codegen", - ObjectNode.objectNodeBuilder() - .withMember("enableNewSmithyRuntime", StringNode.from("orchestrator")).build(), - ) - .build() - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when removing `enableNewSmithyRuntime` feature gate - val middlewareModeTestParams get(): IntegrationTestParams = - IntegrationTestParams(additionalSettings = middlewareMode()) - - // TODO(enableNewSmithyRuntimeCleanup): Delete this when removing `enableNewSmithyRuntime` feature gate - val orchestratorModeTestParams get(): IntegrationTestParams = - IntegrationTestParams(additionalSettings = orchestratorMode()) -} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy new file mode 100644 index 00000000000..3a2be041952 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/default-values.smithy @@ -0,0 +1,88 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@clientContextParams( + bar: {type: "string", documentation: "a client string parameter"} +) +@endpointRuleSet({ + version: "1.0", + parameters: { + bar: { + type: "string", + documentation: "docs" + }, + endpoint: { + type: "string", + builtIn: "SDK::Endpoint", + required: true, + default: "asdf" + documentation: "docs" + }, + }, + rules: [ + { + "documentation": "Template the region into the URI when FIPS is enabled", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "bar" + } + ] + } + ], + "endpoint": { + "url": "https://example.com" + }, + "type": "endpoint" + }, + { + "conditions": [], + "documentation": "error fallthrough", + "error": "endpoint error", + "type": "error" + } + ] +}) +@endpointTests({ + "version": "1.0", + "testCases": [ + { + "params": { + "bar": "a b", + } + "operationInputs": [{ + "operationName": "GetThing", + "builtInParams": { + "SDK::Endpoint": "https://custom.example.com" + } + }], + "expect": { + "endpoint": { + "url": "https://example.com" + } + } + }, + { + "documentation": "a documentation string", + "expect": { + "error": "endpoint error" + } + } + ] +}) +@aws.protocols#awsJson1_0 +service FizzBuzz { + version: "2022-01-01", + operations: [GetThing] +} + +operation GetThing { + input := {} +} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy new file mode 100644 index 00000000000..c4e5894e074 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/deprecated-param.smithy @@ -0,0 +1,44 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "required": false, + "deprecated": { + "message": "use blahdeblah region instead" + }, + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "base rule", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "properties": {} + }, + "type": "endpoint" + } + ], + "version": "1.3" +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy new file mode 100644 index 00000000000..822d6ec93e5 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/duplicate-param.smithy @@ -0,0 +1,55 @@ +$version: "1.0" + +namespace example + +use smithy.rules#contextParam +use smithy.rules#endpointRuleSet +use smithy.rules#staticContextParams + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "ParameterBar": { + "type": "String", + "required": true, + "documentation": "docs" + } + }, + "rules": [ + { + "conditions": [], + "documentation": "base rule", + "endpoint": { + "url": "https://{ParameterBar}.amazonaws.com", + "headers": {} + }, + "type": "endpoint" + } + ] +}) +service FizzBuzz { + operations: [GetResource, GetAnotherResource] +} + +@staticContextParams( + "ParameterBar": {value: "bar"} +) +operation GetResource { + input: GetResourceInput +} + +structure GetResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +operation GetAnotherResource { + input: GetAnotherResourceInput +} + +structure GetAnotherResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +string ResourceId diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy new file mode 100644 index 00000000000..50fbe5df74e --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/get-attr-type-inference.smithy @@ -0,0 +1,56 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Bucket": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "bucket is set, handle bucket specific endpoints", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Bucket" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + "{Bucket}" + ], + "assign": "bucketUrl" + }, + { + "fn": "getAttr", + "argv": [ + { + "ref": "bucketUrl" + }, + "path" + ], + "assign": "path" + } + ], + "endpoint": { + "url": "https://{bucketUrl#authority}/{path}" + }, + "type": "endpoint" + } + ] +}) +@clientContextParams( + Bucket: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy new file mode 100644 index 00000000000..5587c8be35a --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/headers.smithy @@ -0,0 +1,80 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "documentation": "The region to dispatch this request, eg. `us-east-1`." + } + }, + "rules": [ + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Region" + } + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "headers": { + "x-amz-region": [ + "{Region}" + ], + "x-amz-multi": [ + "*", + "{Region}" + ] + } + }, + "type": "endpoint" + }, + { + "documentation": "fallback when region is unset", + "conditions": [], + "error": "Region must be set to resolve a valid endpoint", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + "version": "1.0", + "testCases": [ + { + "documentation": "header set to region", + "params": { + "Region": "us-east-1" + }, + "expect": { + "endpoint": { + "url": "https://us-east-1.amazonaws.com", + "headers": { + "x-amz-region": [ + "us-east-1" + ], + "x-amz-multi": [ + "*", + "us-east-1" + ] + } + } + } + } + ] +) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy new file mode 100644 index 00000000000..3a8a927a366 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/minimal-ruleset.smithy @@ -0,0 +1,33 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Region": { + "required": true, + "type": "String", + "documentation": "docs" + } + }, + "rules": [ + { + "conditions": [], + "documentation": "base rule", + "endpoint": { + "url": "https://{Region}.amazonaws.com", + "properties": {}, + "headers": {} + }, + "type": "endpoint" + } + ] +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy new file mode 100644 index 00000000000..fce40b5f31e --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/parse-url.smithy @@ -0,0 +1,264 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Endpoint": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "endpoint is set and is a valid URL", + "conditions": [ + { + "fn": "isSet", + "argv": [ + { + "ref": "Endpoint" + } + ] + }, + { + "fn": "parseURL", + "argv": [ + "{Endpoint}" + ], + "assign": "url" + } + ], + "rules": [ + { + "conditions": [ + { + "fn": "booleanEquals", + "argv": [ + { + "fn": "getAttr", + "argv": [ + { + "ref": "url" + }, + "isIp" + ] + }, + true + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}{url#normalizedPath}is-ip-addr" + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{url#path}", + "/port" + ] + } + ], + "endpoint": { + "url": "{url#scheme}://{url#authority}/uri-with-port" + }, + "type": "endpoint" + }, + { + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{url#normalizedPath}", + "/" + ] + } + ], + "endpoint": { + "url": "https://{url#scheme}-{url#authority}-nopath.example.com" + }, + "type": "endpoint" + }, + { + "conditions": [], + "endpoint": { + "url": "https://{url#scheme}-{url#authority}.example.com/path-is{url#path}" + }, + "type": "endpoint" + } + ], + "type": "tree" + }, + { + "error": "endpoint was invalid", + "conditions": [], + "type": "error" + } + ] +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "simple URL parsing", + "params": { + "Endpoint": "https://authority.com/custom-path" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com.example.com/path-is/custom-path" + } + } + }, + { + "documentation": "empty path no slash", + "params": { + "Endpoint": "https://authority.com" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com-nopath.example.com" + } + } + }, + { + "documentation": "empty path with slash", + "params": { + "Endpoint": "https://authority.com/" + }, + "expect": { + "endpoint": { + "url": "https://https-authority.com-nopath.example.com" + } + } + }, + { + "documentation": "authority with port", + "params": { + "Endpoint": "https://authority.com:8000/port" + }, + "expect": { + "endpoint": { + "url": "https://authority.com:8000/uri-with-port" + } + } + }, + { + "documentation": "http schemes", + "params": { + "Endpoint": "http://authority.com:8000/port" + }, + "expect": { + "endpoint": { + "url": "http://authority.com:8000/uri-with-port" + } + } + }, + { + "documentation": "arbitrary schemes are not supported", + "params": { + "Endpoint": "acbd://example.com" + }, + "expect": { + "error": "endpoint was invalid" + } + }, + { + "documentation": "host labels are not validated", + "params": { + "Endpoint": "http://99_ab.com" + }, + "expect": { + "endpoint": { + "url": "https://http-99_ab.com-nopath.example.com" + } + } + }, + { + "documentation": "host labels are not validated", + "params": { + "Endpoint": "http://99_ab-.com" + }, + "expect": { + "endpoint": { + "url": "https://http-99_ab-.com-nopath.example.com" + } + } + }, + { + "documentation": "invalid URL", + "params": { + "Endpoint": "http://abc.com:a/foo" + }, + "expect": { + "error": "endpoint was invalid" + } + }, + { + "documentation": "IP Address", + "params": { + "Endpoint": "http://192.168.1.1/foo/" + }, + "expect": { + "endpoint": { + "url": "http://192.168.1.1/foo/is-ip-addr" + } + } + }, + { + "documentation": "IP Address with port", + "params": { + "Endpoint": "http://192.168.1.1:1234/foo/" + }, + "expect": { + "endpoint": { + "url": "http://192.168.1.1:1234/foo/is-ip-addr" + } + } + }, + { + "documentation": "IPv6 Address", + "params": { + "Endpoint": "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443" + }, + "expect": { + "endpoint": { + "url": "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443/is-ip-addr" + } + } + }, + { + "documentation": "weird DNS name", + "params": { + "Endpoint": "https://999.999.abc.blah" + }, + "expect": { + "endpoint": { + "url": "https://https-999.999.abc.blah-nopath.example.com" + } + } + }, + { + "documentation": "query in resolved endpoint is not supported", + "params": { + "Endpoint": "https://example.com/path?query1=foo" + }, + "expect": { + "error": "endpoint was invalid" + } + } + ] +) +@clientContextParams( + Endpoint: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy new file mode 100644 index 00000000000..42d93b922d4 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/substring.smithy @@ -0,0 +1,293 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "TestCaseId": { + "type": "string", + "required": true, + "documentation": "Test case id used to select the test case to use" + }, + "Input": { + "type": "string", + "required": true, + "documentation": "the input used to test substring" + } + }, + "rules": [ + { + "documentation": "Substring from beginning of input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "1" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 0, + 4, + false + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "Substring from end of input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "2" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 0, + 4, + true + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "Substring the middle of the string", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "3" + ] + }, + { + "fn": "substring", + "argv": [ + "{Input}", + 1, + 3, + false + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "fallback when no tests match", + "conditions": [], + "error": "No tests matched", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "substring when string is long enough", + "params": { + "TestCaseId": "1", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `abcd`" + } + }, + { + "documentation": "substring when string is exactly the right length", + "params": { + "TestCaseId": "1", + "Input": "abcd" + }, + "expect": { + "error": "The value is: `abcd`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "1", + "Input": "abc" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "1", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "1", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "unicode characters always return `None`", + "params": { + "TestCaseId": "1", + "Input": "abcdef\uD83D\uDC31" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "non-ascii cause substring to always return `None`", + "params": { + "TestCaseId": "1", + "Input": "abcdef\u0080" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "the full set of ascii is supported, including non-printable characters", + "params": { + "TestCaseId": "1", + "Input": "\u007Fabcdef" + }, + "expect": { + "error": "The value is: `\u007Fabc`" + } + }, + { + "documentation": "substring when string is long enough", + "params": { + "TestCaseId": "2", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `defg`" + } + }, + { + "documentation": "substring when string is exactly the right length", + "params": { + "TestCaseId": "2", + "Input": "defg" + }, + "expect": { + "error": "The value is: `defg`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "2", + "Input": "abc" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "2", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "2", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is longer", + "params": { + "TestCaseId": "3", + "Input": "defg" + }, + "expect": { + "error": "The value is: `ef`" + } + }, + { + "documentation": "substring when string is exact length", + "params": { + "TestCaseId": "3", + "Input": "def" + }, + "expect": { + "error": "The value is: `ef`" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "3", + "Input": "ab" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring when string is too short", + "params": { + "TestCaseId": "3", + "Input": "" + }, + "expect": { + "error": "No tests matched" + } + }, + { + "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", + "params": { + "TestCaseId": "3", + "Input": "\ufdfd" + }, + "expect": { + "error": "No tests matched" + } + } + ] +) +@clientContextParams( + TestCaseId: {type: "string", documentation: "docs"} + Input: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy new file mode 100644 index 00000000000..6d2ef57f69c --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/uri-encode.smithy @@ -0,0 +1,132 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "TestCaseId": { + "type": "string", + "required": true, + "documentation": "Test case id used to select the test case to use" + }, + "Input": { + "type": "string", + "required": true, + "documentation": "The input used to test uriEncode" + } + }, + "rules": [ + { + "documentation": "uriEncode on input", + "conditions": [ + { + "fn": "stringEquals", + "argv": [ + "{TestCaseId}", + "1" + ] + }, + { + "fn": "uriEncode", + "argv": [ + "{Input}" + ], + "assign": "output" + } + ], + "error": "The value is: `{output}`", + "type": "error" + }, + { + "documentation": "fallback when no tests match", + "conditions": [], + "error": "No tests matched", + "type": "error" + } + ] +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "uriEncode when the string has nothing to encode returns the input", + "params": { + "TestCaseId": "1", + "Input": "abcdefg" + }, + "expect": { + "error": "The value is: `abcdefg`" + } + }, + { + "documentation": "uriEncode with single character to encode encodes only that character", + "params": { + "TestCaseId": "1", + "Input": "abc:defg" + }, + "expect": { + "error": "The value is: `abc%3Adefg`" + } + }, + { + "documentation": "uriEncode with all ASCII characters to encode encodes all characters", + "params": { + "TestCaseId": "1", + "Input": "/:,?#[]{}|@! $&'()*+;=%<>\"^`\\" + }, + "expect": { + "error": "The value is: `%2F%3A%2C%3F%23%5B%5D%7B%7D%7C%40%21%20%24%26%27%28%29%2A%2B%3B%3D%25%3C%3E%22%5E%60%5C`" + } + }, + { + "documentation": "uriEncode with ASCII characters that should not be encoded returns the input", + "params": { + "TestCaseId": "1", + "Input": "0123456789.underscore_dash-Tilda~" + }, + "expect": { + "error": "The value is: `0123456789.underscore_dash-Tilda~`" + } + }, + { + "documentation": "uriEncode encodes unicode characters", + "params": { + "TestCaseId": "1", + "Input": "\ud83d\ude39" + }, + "expect": { + "error": "The value is: `%F0%9F%98%B9`" + } + }, + { + "documentation": "uriEncode on all printable ASCII characters", + "params": { + "TestCaseId": "1", + "Input": " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" + }, + "expect": { + "error": "The value is: `%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~`" + } + }, + { + "documentation": "uriEncode on an empty string", + "params": { + "TestCaseId": "1", + "Input": "" + }, + "expect": { + "error": "The value is: ``" + } + } + ] +) +@clientContextParams( + TestCaseId: {type: "string", documentation: "Test case id used to select the test case to use"}, + Input: {type: "string", documentation: "The input used to test uriEncoder"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy new file mode 100644 index 00000000000..1e951294ea7 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-hostlabel.smithy @@ -0,0 +1,122 @@ +$version: "2.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#endpointRuleSet +use smithy.rules#endpointTests + +@endpointRuleSet({ + "parameters": { + "Region": { + "type": "string", + "required": true, + "documentation": "The region to dispatch this request, eg. `us-east-1`." + } + }, + "rules": [ + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + false + ] + } + ], + "endpoint": { + "url": "https://{Region}.amazonaws.com" + }, + "type": "endpoint" + }, + { + "documentation": "Template the region into the URI when region is set", + "conditions": [ + { + "fn": "isValidHostLabel", + "argv": [ + { + "ref": "Region" + }, + true + ] + } + ], + "endpoint": { + "url": "https://{Region}-subdomains.amazonaws.com" + }, + "type": "endpoint" + }, + { + "documentation": "Region was not a valid host label", + "conditions": [], + "error": "Invalid hostlabel", + "type": "error" + } + ], + "version": "1.3" +}) +@endpointTests( + version: "1.0", + testCases: [ + { + "documentation": "standard region is a valid hostlabel", + "params": { + "Region": "us-east-1" + }, + "expect": { + "endpoint": { + "url": "https://us-east-1.amazonaws.com" + } + } + }, + { + "documentation": "starting with a number is a valid hostlabel", + "params": { + "Region": "3aws4" + }, + "expect": { + "endpoint": { + "url": "https://3aws4.amazonaws.com" + } + } + }, + { + "documentation": "when there are dots, only match if subdomains are allowed", + "params": { + "Region": "part1.part2" + }, + "expect": { + "endpoint": { + "url": "https://part1.part2-subdomains.amazonaws.com" + } + } + }, + { + "documentation": "a space is never a valid hostlabel", + "params": { + "Region": "part1 part2" + }, + "expect": { + "error": "Invalid hostlabel" + } + }, + { + "documentation": "an empty string is not a valid hostlabel", + "params": { + "Region": "" + }, + "expect": { + "error": "Invalid hostlabel" + } + } + ] +) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz {} diff --git a/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy new file mode 100644 index 00000000000..776d3ba7fe0 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/endpoint-tests/valid-model.smithy @@ -0,0 +1,73 @@ +$version: "1.0" + +namespace example + +use smithy.rules#clientContextParams +use smithy.rules#contextParam +use smithy.rules#endpointRuleSet +use smithy.rules#staticContextParams + +@endpointRuleSet({ + "version": "1.3", + "parameters": { + "Region": { + "type": "string", + "documentation": "docs" + }, + "ParameterFoo": { + "type": "string", + "documentation": "docs" + }, + "ParameterBar": { + "type": "string", + "documentation": "docs" + }, + "ExtraParameter": { + "type": "string", + "documentation": "docs" + } + }, + "rules": [ + { + "documentation": "stub rule", + "conditions": [ ], + "endpoint": { + "url": "https://example.com" + }, + "type": "endpoint" + }, + ] +}) +@clientContextParams( + Region: {type: "string", documentation: "docs"} +) +service FizzBuzz { + operations: [GetResource, GetAnotherResource] +} + +@staticContextParams( + "ParameterFoo": {value: "foo"}, + "ExtraParameter": {value: "someValue"} +) +operation GetResource { + input: GetResourceInput +} + +structure GetResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +@staticContextParams( + "ParameterFoo": {value: "bar"} +) +operation GetAnotherResource { + input: GetAnotherResourceInput +} + +structure GetAnotherResourceInput { + @contextParam(name: "ParameterBar") + ResourceId: ResourceId +} + +string ResourceId diff --git a/codegen-client/src/test/resources/META-INF/smithy/manif3st b/codegen-client/src/test/resources/META-INF/smithy/manif3st new file mode 100644 index 00000000000..b8f6d1fb488 --- /dev/null +++ b/codegen-client/src/test/resources/META-INF/smithy/manif3st @@ -0,0 +1,11 @@ +endpoint-tests/default-values.smithy +endpoint-tests/deprecated-param.smithy +endpoint-tests/duplicate-param.smithy +endpoint-tests/get-attr-type-inference.smithy +endpoint-tests/headers.smithy +endpoint-tests/minimal-ruleset.smithy +endpoint-tests/parse-url.smithy +endpoint-tests/substring.smithy +endpoint-tests/uri-encode.smithy +endpoint-tests/valid-hostlabel.smithy +endpoint-tests/valid-model.smithy diff --git a/codegen-core/build.gradle.kts b/codegen-core/build.gradle.kts index 393eb4dfa73..c4b32832896 100644 --- a/codegen-core/build.gradle.kts +++ b/codegen-core/build.gradle.kts @@ -23,7 +23,7 @@ val smithyVersion: String by project dependencies { implementation(kotlin("stdlib-jdk8")) - implementation("org.jsoup:jsoup:1.14.3") + implementation("org.jsoup:jsoup:1.15.3") api("software.amazon.smithy:smithy-codegen-core:$smithyVersion") api("com.moandjiezana.toml:toml4j:0.7.2") implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") @@ -53,18 +53,47 @@ fun gitCommitHash(): String { } val generateSmithyRuntimeCrateVersion by tasks.registering { + fun kv(key: String, value: String) = "\"$key\": \"$value\"" // generate the version of the runtime to use as a resource. // this keeps us from having to manually change version numbers in multiple places - val resourcesDir = "$buildDir/resources/main/software/amazon/smithy/rust/codegen/core" - val versionFile = file("$resourcesDir/runtime-crate-version.txt") + val resourcesDir = layout.buildDirectory.dir("resources/main/software/amazon/smithy/rust/codegen/core") + val versionFile = resourcesDir.get().file("runtime-crate-version.txt") outputs.file(versionFile) - val crateVersion = project.properties["smithy.rs.runtime.crate.version"].toString() - inputs.property("crateVersion", crateVersion) + val stableCrateVersion = project.properties["smithy.rs.runtime.crate.stable.version"].toString() + val unstableCrateVersion = project.properties["smithy.rs.runtime.crate.unstable.version"].toString() + inputs.property("crateVersion", stableCrateVersion) // version format must be in sync with `software.amazon.smithy.rust.codegen.core.Version` - val version = "$crateVersion\n${gitCommitHash()}" + val version = StringBuilder().append("{") + version.append(kv("githash", gitCommitHash())).append(",") + version.append(kv("stableVersion", stableCrateVersion)).append(",") + version.append(kv("unstableVersion", unstableCrateVersion)).append(",") + // hack for internal build + val smithyStableCrates = listOf( + // AWS crates + "aws-config", + "aws-credential-types", + "aws-runtime", + "aws-runtime-api", + "aws-sigv4", + "aws-types", + + // smithy crates + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-runtime", + "aws-smithy-types", + ) + + val runtimeCrates = + smithyStableCrates.joinToString(separator = ",", prefix = "{", postfix = "}") { crate -> + kv(crate, stableCrateVersion) + } + + version.append(""""runtimeCrates": $runtimeCrates""").append("}") + sourceSets.main.get().output.dir(resourcesDir) doLast { - versionFile.writeText(version) + versionFile.asFile.writeText(version.toString()) } } @@ -112,12 +141,11 @@ if (isTestingEnabled.toBoolean()) { tasks.test { useJUnitPlatform() testLogging { - events("passed", "skipped", "failed") + events("failed") exceptionFormat = TestExceptionFormat.FULL showCauses = true showExceptions = true showStackTraces = true - showStandardStreams = true } } @@ -126,7 +154,7 @@ if (isTestingEnabled.toBoolean()) { reports { xml.required.set(false) csv.required.set(false) - html.outputLocation.set(file("$buildDir/reports/jacoco")) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco")) } } @@ -141,5 +169,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-core/common-test-models/aws-json-query-compat.smithy b/codegen-core/common-test-models/aws-json-query-compat.smithy new file mode 100644 index 00000000000..b3e1cf03750 --- /dev/null +++ b/codegen-core/common-test-models/aws-json-query-compat.smithy @@ -0,0 +1,38 @@ +$version: "1.0" + +namespace aws.protocoltests.misc + +use aws.protocols#awsQueryCompatible +use aws.protocols#awsJson1_0 +use aws.protocols#awsQueryError +use smithy.test#httpRequestTests +@awsQueryCompatible +@awsJson1_0 +service QueryCompatService { + operations: [ + Operation + ] +} + +@httpRequestTests([{ + id: "BasicQueryCompatTest" + protocol: awsJson1_0, + method: "POST", + uri: "/", + body: "{\"message\":\"hello!\"}", + bodyMedaType: "application/json", + params: { + message: "hello!" + }, + headers: { "x-amz-target": "QueryCompatService.Operation"} + + } +]) +operation Operation { + input: OperationInputOutput + output: OperationInputOutput +} + +structure OperationInputOutput { + message: String +} diff --git a/codegen-core/common-test-models/constraints.smithy b/codegen-core/common-test-models/constraints.smithy index c30c669b160..18bbdc252a2 100644 --- a/codegen-core/common-test-models/constraints.smithy +++ b/codegen-core/common-test-models/constraints.smithy @@ -11,7 +11,7 @@ use smithy.framework#ValidationException service ConstraintsService { operations: [ ConstrainedShapesOperation, - // See https://github.com/awslabs/smithy-rs/issues/2760 for why testing operations reaching + // See https://github.com/smithy-lang/smithy-rs/issues/2760 for why testing operations reaching // constrained shapes that only lie in the output is important. ConstrainedShapesOnlyInOutputOperation, ConstrainedHttpBoundShapesOperation, @@ -37,7 +37,7 @@ service ConstraintsService { QueryParamsTargetingMapOfEnumStringOperation, QueryParamsTargetingMapOfListOfEnumStringOperation, - // TODO(https://github.com/awslabs/smithy-rs/issues/1431) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1431) // HttpPrefixHeadersTargetingMapOfEnumStringOperation, NonStreamingBlobOperation, @@ -274,7 +274,7 @@ structure ConstrainedHttpBoundShapesOperationInputOutput { @httpHeader("X-Range-Long-List") rangeLongListHeader: ListOfRangeLong, - // TODO(https://github.com/awslabs/smithy-rs/issues/1431) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1431) // @httpHeader("X-Enum") //enumStringHeader: EnumString, @@ -498,7 +498,7 @@ structure ConA { mapOfLengthString: MapOfLengthString, listOfLengthBlob: ListOfLengthBlob, - // TODO(https://github.com/awslabs/smithy-rs/issues/1401): a `set` shape is + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): a `set` shape is // just a `list` shape with `uniqueItems`, which hasn't been implemented yet. // setOfLengthBlob: SetOfLengthBlob, mapOfLengthBlob: MapOfLengthBlob, @@ -948,7 +948,7 @@ structure ConstrainedShapesOnlyInOutputOperationOutput { list: ConstrainedListInOutput map: ConstrainedMapInOutput // Unions were not affected by - // https://github.com/awslabs/smithy-rs/issues/2760, but testing anyway for + // https://github.com/smithy-lang/smithy-rs/issues/2760, but testing anyway for // good measure. union: ConstrainedUnionInOutput } diff --git a/codegen-core/common-test-models/misc.smithy b/codegen-core/common-test-models/misc.smithy index f78bb6db7cd..10072543c9f 100644 --- a/codegen-core/common-test-models/misc.smithy +++ b/codegen-core/common-test-models/misc.smithy @@ -95,7 +95,7 @@ structure InnermostShape { @required aDouble: Double, - // TODO(https://github.com/awslabs/smithy-rs/issues/312) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/312) // @required // aBigInteger: BigInteger, diff --git a/codegen-core/common-test-models/naming-obstacle-course-casing.smithy b/codegen-core/common-test-models/naming-obstacle-course-casing.smithy index fb80a46d48b..cef9f58e727 100644 --- a/codegen-core/common-test-models/naming-obstacle-course-casing.smithy +++ b/codegen-core/common-test-models/naming-obstacle-course-casing.smithy @@ -3,7 +3,7 @@ namespace casing use aws.protocols#awsJson1_1 -// TODO(https://github.com/awslabs/smithy-rs/issues/2340): The commented part of the model breaks the generator in a +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2340): The commented part of the model breaks the generator in a // miriad of ways. Any solution to the linked issue must address this. /// Confounds model generation machinery with lots of problematic casing diff --git a/codegen-core/common-test-models/pokemon-awsjson.smithy b/codegen-core/common-test-models/pokemon-awsjson.smithy index 12e455ecdd0..3d074f1e88c 100644 --- a/codegen-core/common-test-models/pokemon-awsjson.smithy +++ b/codegen-core/common-test-models/pokemon-awsjson.smithy @@ -1,6 +1,6 @@ $version: "1.0" -// TODO(https://github.com/awslabs/smithy-rs/issues/2215) +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2215) // This is a temporary model to test AwsJson 1.0 with @streaming. // This model will be removed when protocol tests support @streaming. diff --git a/codegen-core/common-test-models/rest-json-extras.smithy b/codegen-core/common-test-models/rest-json-extras.smithy index b9946baa811..2633fe00a83 100644 --- a/codegen-core/common-test-models/rest-json-extras.smithy +++ b/codegen-core/common-test-models/rest-json-extras.smithy @@ -65,6 +65,9 @@ service RestJsonExtras { NullInNonSparse, CaseInsensitiveErrorOperation, EmptyStructWithContentOnWireOp, + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2968): Remove the following once these tests are included in Smithy + // They're being added in https://github.com/smithy-lang/smithy/pull/1908 + HttpPayloadWithUnion, ], errors: [ExtraError] } @@ -81,16 +84,12 @@ service RestJsonExtras { appliesTo: "client", }, { - documentation: """ - Upper case error modeled lower case. - Servers render the full shape ID (including namespace), since some - existing clients rely on it to deserialize the error shape and fail - if only the shape name is present.""", + documentation: "Upper case error modeled lower case.", id: "ServiceLevelErrorServer", protocol: "aws.protocols#restJson1", code: 500, body: "{}", - headers: { "X-Amzn-Errortype": "aws.protocoltests.restjson#ExtraError" }, + headers: { "X-Amzn-Errortype": "ExtraError" }, params: {}, appliesTo: "server", } @@ -318,7 +317,7 @@ operation CaseInsensitiveErrorOperation { @httpResponseTests([ { - documentation: "Upper case error modeled lower case. See: https://github.com/awslabs/smithy-rs/blob/6c21fb0eb377c7120a8179f4537ba99a4b50ba96/rust-runtime/inlineable/src/json_errors.rs#L51-L51", + documentation: "Upper case error modeled lower case. See: https://github.com/smithy-lang/smithy-rs/blob/6c21fb0eb377c7120a8179f4537ba99a4b50ba96/rust-runtime/inlineable/src/json_errors.rs#L51-L51", id: "UpperErrorModeledLower", protocol: "aws.protocols#restJson1", code: 500, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt index 633d92c2279..071f0a2089b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt @@ -6,29 +6,49 @@ package software.amazon.smithy.rust.codegen.core import software.amazon.smithy.codegen.core.CodegenException +import software.amazon.smithy.model.node.Node // generated as part of the build, see codegen-core/build.gradle.kts private const val VERSION_FILENAME = "runtime-crate-version.txt" -data class Version(val fullVersion: String, val crateVersion: String) { +data class Version( + val fullVersion: String, + val stableCrateVersion: String, + val unstableCrateVersion: String, + val crates: Map, +) { companion object { // Version must be in the "{smithy_rs_version}\n{git_commit_hash}" format fun parse(content: String): Version { - val lines = content.lines() - if (lines.size != 2) { - throw IllegalArgumentException("Invalid version format, it should contain `2` lines but contains `${lines.size}` line(s)") - } - return Version(lines.joinToString("-"), lines.first()) + val node = Node.parse(content).expectObjectNode() + val githash = node.expectStringMember("githash").value + val stableVersion = node.expectStringMember("stableVersion").value + val unstableVersion = node.expectStringMember("unstableVersion").value + return Version( + "$stableVersion-$githash", + stableCrateVersion = stableVersion, + unstableCrateVersion = unstableVersion, + node.expectObjectMember("runtimeCrates").members.map { + it.key.value to it.value.expectStringNode().value + }.toMap(), + ) } // Returns full version in the "{smithy_rs_version}-{git_commit_hash}" format fun fullVersion(): String = fromDefaultResource().fullVersion - fun crateVersion(): String = - fromDefaultResource().crateVersion + fun stableCrateVersion(): String = + fromDefaultResource().stableCrateVersion - private fun fromDefaultResource(): Version = parse( + fun unstableCrateVersion(): String = + fromDefaultResource().unstableCrateVersion + + fun crateVersion(crate: String): String { + val version = fromDefaultResource() + return version.crates[crate] ?: version.unstableCrateVersion + } + fun fromDefaultResource(): Version = parse( Version::class.java.getResource(VERSION_FILENAME)?.readText() ?: throw CodegenException("$VERSION_FILENAME does not exist"), ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt index b91020fe3fd..88416e45c45 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt @@ -13,11 +13,11 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.util.dq import java.nio.file.Path -sealed class DependencyScope { - object Dev : DependencyScope() - object Compile : DependencyScope() - object CfgUnstable : DependencyScope() - object Build : DependencyScope() +enum class DependencyScope { + Build, + CfgUnstable, + Compile, + Dev, } sealed class DependencyLocation @@ -89,6 +89,16 @@ class InlineDependency( private fun forInlineableRustFile(name: String, vararg additionalDependencies: RustDependency) = forRustFile(RustModule.private(name), "/inlineable/src/$name.rs", *additionalDependencies) + fun eventReceiver(runtimeConfig: RuntimeConfig) = + forInlineableRustFile( + "event_receiver", + CargoDependency.smithyHttp(runtimeConfig), + CargoDependency.smithyRuntimeApi(runtimeConfig), + CargoDependency.smithyTypes(runtimeConfig), + ) + + fun defaultAuthPlugin(runtimeConfig: RuntimeConfig) = forInlineableRustFile("auth_plugin", CargoDependency.smithyRuntimeApiClient(runtimeConfig)) + fun jsonErrors(runtimeConfig: RuntimeConfig) = forInlineableRustFile( "json_errors", @@ -136,6 +146,8 @@ fun InlineDependency.toType() = RuntimeType(module.fullyQualifiedPath(), this) data class Feature(val name: String, val default: Boolean, val deps: List) +val DEV_ONLY_FEATURES = setOf("test-util") + /** * A dependency on an internal or external Cargo Crate */ @@ -150,6 +162,12 @@ data class CargoDependency( ) : RustDependency(name) { val key: Triple get() = Triple(name, location, scope) + init { + if (scope != DependencyScope.Dev && DEV_ONLY_FEATURES.any { features.contains(it) }) { + throw IllegalArgumentException("The `test-util` feature cannot be used outside of DependencyScope.Dev") + } + } + fun withFeature(feature: String): CargoDependency { return copy(features = features.toMutableSet().apply { add(feature) }) } @@ -205,7 +223,8 @@ data class CargoDependency( attribs.add("features = [${joinToString(",") { it.dq() }}]") } } - return "$name = { ${attribs.joinToString(",")} }" + attribs.add("scope = $scope") + return "$name = { ${attribs.joinToString(", ")} }" } fun toType(): RuntimeType { @@ -217,7 +236,7 @@ data class CargoDependency( val Url: CargoDependency = CargoDependency("url", CratesIo("2.3.1")) val Bytes: CargoDependency = CargoDependency("bytes", CratesIo("1.0.0")) val BytesUtils: CargoDependency = CargoDependency("bytes-utils", CratesIo("0.1.0")) - val FastRand: CargoDependency = CargoDependency("fastrand", CratesIo("1.8.0")) + val FastRand: CargoDependency = CargoDependency("fastrand", CratesIo("2.0.0")) val Hex: CargoDependency = CargoDependency("hex", CratesIo("0.4.3")) val Http: CargoDependency = CargoDependency("http", CratesIo("0.2.9")) val HttpBody: CargoDependency = CargoDependency("http-body", CratesIo("0.4.4")) @@ -227,7 +246,8 @@ data class CargoDependency( val Md5: CargoDependency = CargoDependency("md-5", CratesIo("0.10.0"), rustName = "md5") val PercentEncoding: CargoDependency = CargoDependency("percent-encoding", CratesIo("2.0.0")) val Regex: CargoDependency = CargoDependency("regex", CratesIo("1.5.5")) - val Ring: CargoDependency = CargoDependency("ring", CratesIo("0.16.0")) + val RegexLite: CargoDependency = CargoDependency("regex-lite", CratesIo("0.1.5")) + val Ring: CargoDependency = CargoDependency("ring", CratesIo("0.17.5")) val TokioStream: CargoDependency = CargoDependency("tokio-stream", CratesIo("0.1.7")) val Tower: CargoDependency = CargoDependency("tower", CratesIo("0.4")) val Tracing: CargoDependency = CargoDependency("tracing", CratesIo("0.1")) @@ -236,10 +256,10 @@ data class CargoDependency( val Approx: CargoDependency = CargoDependency("approx", CratesIo("0.5.1"), DependencyScope.Dev) val AsyncStd: CargoDependency = CargoDependency("async-std", CratesIo("1.12.0"), DependencyScope.Dev) val AsyncStream: CargoDependency = CargoDependency("async-stream", CratesIo("0.3.0"), DependencyScope.Dev) - val Criterion: CargoDependency = CargoDependency("criterion", CratesIo("0.4.0"), DependencyScope.Dev) + val Criterion: CargoDependency = CargoDependency("criterion", CratesIo("0.5.0"), DependencyScope.Dev) val FuturesCore: CargoDependency = CargoDependency("futures-core", CratesIo("0.3.25"), DependencyScope.Dev) val FuturesUtil: CargoDependency = - CargoDependency("futures-util", CratesIo("0.3.25"), DependencyScope.Dev, defaultFeatures = false) + CargoDependency("futures-util", CratesIo("0.3.25"), DependencyScope.Dev, defaultFeatures = false, features = setOf("alloc")) val HdrHistogram: CargoDependency = CargoDependency("hdrhistogram", CratesIo("7.5.2"), DependencyScope.Dev) val Hound: CargoDependency = CargoDependency("hound", CratesIo("3.4.0"), DependencyScope.Dev) val PrettyAssertions: CargoDependency = @@ -274,21 +294,19 @@ data class CargoDependency( fun smithyAsync(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-async") fun smithyChecksums(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-checksums") - fun smithyClient(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-client") - fun smithyClientTestUtil(runtimeConfig: RuntimeConfig) = - smithyClient(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyEventStream(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-eventstream") fun smithyHttp(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-http") - fun smithyHttpAuth(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-http-auth") - fun smithyHttpTower(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-http-tower") fun smithyJson(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-json") fun smithyProtocolTestHelpers(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-protocol-test", scope = DependencyScope.Dev) fun smithyQuery(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-query") fun smithyRuntime(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-runtime") + .withFeature("client") + fun smithyRuntimeTestUtil(runtimeConfig: RuntimeConfig) = smithyRuntime(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-runtime-api") + fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).withFeature("client").withFeature("http-02x") fun smithyRuntimeApiTestUtil(runtimeConfig: RuntimeConfig) = smithyRuntimeApi(runtimeConfig).toDevDependency().withFeature("test-util") fun smithyTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate("smithy-types") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt index c9fdbafb13b..260cb62295a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt @@ -69,7 +69,7 @@ class RustReservedWordSymbolProvider( "RustReservedWordSymbolProvider should only run once" } - var renamedSymbol = internal.toSymbol(shape) + val renamedSymbol = internal.toSymbol(shape) return when (shape) { is MemberShape -> { val container = model.expectShape(shape.container) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt index 3cb637b64b8..75d97a2721b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt @@ -56,29 +56,29 @@ sealed class RustType { * * When formatted, the converted type will appear as such: * - * | Type | Formatted | - * | -------------------------------------------------- | ------------------------------------------------------------------- | - * | RustType.Unit | () | - * | RustType.Bool | bool | - * | RustType.Float(32) | f32 | - * | RustType.Float(64) | f64 | - * | RustType.Integer(8) | i8 | - * | RustType.Integer(16) | i16 | - * | RustType.Integer(32) | i32 | - * | RustType.Integer(64) | i64 | - * | RustType.String | std::string::String | - * | RustType.Vec(RustType.String) | std::vec::Vec | - * | RustType.Slice(RustType.String) | [std::string::String] | - * | RustType.HashMap(RustType.String, RustType.String) | std::collections::HashMap | - * | RustType.HashSet(RustType.String) | std::vec::Vec | - * | RustType.Reference("&", RustType.String) | &std::string::String | - * | RustType.Reference("&mut", RustType.String) | &mut std::string::String | - * | RustType.Reference("&'static", RustType.String) | &'static std::string::String | - * | RustType.Option(RustType.String) | std::option::Option | - * | RustType.Box(RustType.String) | std::boxed::Box | - * | RustType.Opaque("SoCool", "zelda_is") | zelda_is::SoCool | - * | RustType.Opaque("SoCool") | SoCool | - * | RustType.Dyn(RustType.Opaque("Foo", "foo")) | dyn foo::Foo | + * | Type | Formatted | + * | -------------------------------------------------- | ------------------------------------------------------------------- | + * | RustType.Unit | () | + * | RustType.Bool | bool | + * | RustType.Float(32) | f32 | + * | RustType.Float(64) | f64 | + * | RustType.Integer(8) | i8 | + * | RustType.Integer(16) | i16 | + * | RustType.Integer(32) | i32 | + * | RustType.Integer(64) | i64 | + * | RustType.String | std::string::String | + * | RustType.Vec(RustType.String) | std::vec::Vec:: | + * | RustType.Slice(RustType.String) | [std::string::String] | + * | RustType.HashMap(RustType.String, RustType.String) | std::collections::HashMap::| + * | RustType.HashSet(RustType.String) | std::vec::Vec:: | + * | RustType.Reference("&", RustType.String) | &std::string::String | + * | RustType.Reference("&mut", RustType.String) | &mut std::string::String | + * | RustType.Reference("&'static", RustType.String) | &'static std::string::String | + * | RustType.Option(RustType.String) | std::option::Option | + * | RustType.Box(RustType.String) | std::boxed::Box | + * | RustType.Opaque("SoCool", "zelda_is") | zelda_is::SoCool | + * | RustType.Opaque("SoCool") | SoCool | + * | RustType.Dyn(RustType.Opaque("Foo", "foo")) | dyn foo::Foo | */ val writable = writable { rustInlineTemplate("#{this}", "this" to this@RustType) } @@ -200,7 +200,7 @@ fun RustType.qualifiedName(): String { /** Format this Rust type as an `impl Into` */ fun RustType.implInto(fullyQualified: Boolean = true): String { - return "impl ${RuntimeType.Into.fullyQualifiedName()}<${this.render(fullyQualified)}>" + return "impl ${RuntimeType.Into.render(fullyQualified)}<${this.render(fullyQualified)}>" } /** Format this Rust type so that it may be used as an argument type in a function definition */ @@ -244,10 +244,10 @@ fun RustType.render(fullyQualified: Boolean = true): String { is RustType.Float -> this.name is RustType.Integer -> this.name is RustType.String -> this.name - is RustType.Vec -> "${this.name}<${this.member.render(fullyQualified)}>" + is RustType.Vec -> "${this.name}::<${this.member.render(fullyQualified)}>" is RustType.Slice -> "[${this.member.render(fullyQualified)}]" - is RustType.HashMap -> "${this.name}<${this.key.render(fullyQualified)}, ${this.member.render(fullyQualified)}>" - is RustType.HashSet -> "${this.name}<${this.member.render(fullyQualified)}>" + is RustType.HashMap -> "${this.name}::<${this.key.render(fullyQualified)}, ${this.member.render(fullyQualified)}>" + is RustType.HashSet -> "${this.name}::<${this.member.render(fullyQualified)}>" is RustType.Reference -> { if (this.lifetime == "&") { "&${this.member.render(fullyQualified)}" @@ -284,6 +284,13 @@ inline fun RustType.stripOuter(): RustType = wh else -> this } +/** Extracts the inner Reference type */ +fun RustType.innerReference(): RustType? = when (this) { + is RustType.Reference -> this + is RustType.Container -> this.member.innerReference() + else -> null +} + /** Wraps a type in Option if it isn't already */ fun RustType.asOptional(): RustType = when (this) { is RustType.Option -> this @@ -478,7 +485,7 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { // These were supposed to be a part of companion object but we decided to move it out to here to avoid NPE // You can find the discussion here. - // https://github.com/awslabs/smithy-rs/discussions/2248 + // https://github.com/smithy-lang/smithy-rs/discussions/2248 public fun SerdeSerialize(): Attribute { return Attribute(cfgAttr(all(writable("aws_sdk_unstable"), feature("serde-serialize")), derive(RuntimeType.SerdeSerialize))) } @@ -494,6 +501,7 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { } companion object { + val AllowNeedlessQuestionMark = Attribute(allow("clippy::needless_question_mark")) val AllowClippyBoxedLocal = Attribute(allow("clippy::boxed_local")) val AllowClippyLetAndReturn = Attribute(allow("clippy::let_and_return")) val AllowClippyNeedlessBorrow = Attribute(allow("clippy::needless_borrow")) @@ -509,6 +517,7 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { val AllowNonSnakeCase = Attribute(allow("non_snake_case")) val AllowUnreachableCode = Attribute(allow("unreachable_code")) val AllowUnreachablePatterns = Attribute(allow("unreachable_patterns")) + val AllowUnused = Attribute(allow("unused")) val AllowUnusedImports = Attribute(allow("unused_imports")) val AllowUnusedMut = Attribute(allow("unused_mut")) val AllowUnusedVariables = Attribute(allow("unused_variables")) @@ -565,6 +574,9 @@ class Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) { fun not(vararg attrMacros: Writable): Writable = macroWithArgs("not", *attrMacros) fun feature(feature: String) = writable("feature = ${feature.dq()}") + fun featureGate(featureName: String): Attribute { + return Attribute(cfg(feature(featureName))) + } fun deprecated(since: String? = null, note: String? = null): Writable { val optionalFields = mutableListOf() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt index 9dece19f8b6..e8bf22ff7c7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt @@ -31,6 +31,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.util.PANIC +import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.orNull @@ -168,6 +169,12 @@ fun > T.rust( this.write(contents.trim(), *args) } +fun > T.rawRust( + @Language("Rust", prefix = "macro_rules! foo { () => {{\n", suffix = "\n}}}") contents: String, +) { + this.write(escape(contents.trim())) +} + /** * Convenience wrapper that tells Intellij that the contents of this block are Rust */ @@ -440,6 +447,28 @@ fun RustWriter.implBlock(symbol: Symbol, block: Writable) { } } +/** Write a `#[cfg(feature = "...")]` block for the given feature */ +fun RustWriter.featureGateBlock(feature: String, block: Writable) { + featureGatedBlock(feature, block)(this) +} + +/** Write a `#[cfg(feature = "...")]` block for the given feature */ +fun featureGatedBlock(feature: String, block: Writable): Writable { + return writable { + rustBlock("##[cfg(feature = ${feature.dq()})]") { + block() + } + } +} + +fun featureGatedBlock(feature: Feature, block: Writable): Writable { + return writable { + rustBlock("##[cfg(feature = ${feature.name.dq()})]") { + block() + } + } +} + /** * Write _exactly_ the text as written into the code writer without newlines or formatting */ @@ -498,6 +527,15 @@ class RustWriter private constructor( } } + fun toml(fileName: String, debugMode: Boolean = false): RustWriter = + RustWriter( + fileName, + namespace = "ignore", + commentCharacter = "#", + printWarning = false, + debugMode = debugMode, + ) + private fun rawWriter(fileName: String, debugMode: Boolean): RustWriter = RustWriter( fileName, @@ -528,10 +566,7 @@ class RustWriter private constructor( if (this.className.contains("AbstractCodeWriter") || this.className.startsWith("java.lang")) { return false } - if (this.fileName == "RustWriter.kt") { - return false - } - return true + return this.fileName != "RustWriter.kt" } private val preamble = mutableListOf() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt index b17eb3b030a..8ef68e9ef25 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt @@ -25,6 +25,16 @@ fun Writable.isEmpty(): Boolean { return writer.toString() == RustWriter.root().toString() } +fun Writable.map(f: RustWriter.(Writable) -> Unit): Writable { + val self = this + return writable { f(self) } +} + +/** Returns Some(..arg) */ +fun Writable.some(): Writable { + return this.map { rust("Some(#T)", it) } +} + fun Writable.isNotEmpty(): Boolean = !this.isEmpty() operator fun Writable.plus(other: Writable): Writable { @@ -85,14 +95,14 @@ fun Array.join(separator: Writable) = asIterable().join(separator) * "type_params" to rustTypeParameters( * symbolProvider.toSymbol(operation), * RustType.Unit, - * runtimeConfig.smithyHttp().resolve("body::SdkBody"), + * runtimeConfig.smithyTypes().resolve("body::SdkBody"), * GenericsGenerator(GenericTypeArg("A"), GenericTypeArg("B")), * ) * ) * ``` * would write out something like: * ```rust - * some_fn::(); + * some_fn::(); * ``` */ fun rustTypeParameters( @@ -108,10 +118,12 @@ fun rustTypeParameters( "#{gg:W}", "gg" to typeParameter.declaration(withAngleBrackets = false), ) + else -> { // Check if it's a writer. If it is, invoke it; Else, throw a codegen error. @Suppress("UNCHECKED_CAST") - val func = typeParameter as? Writable ?: throw CodegenException("Unhandled type '$typeParameter' encountered by rustTypeParameters writer") + val func = typeParameter as? Writable + ?: throw CodegenException("Unhandled type '$typeParameter' encountered by rustTypeParameters writer") func.invoke(this) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt index 3fa6f688e32..a08eddb5ed5 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt @@ -8,6 +8,8 @@ package software.amazon.smithy.rust.codegen.core.smithy import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings /** * [CodegenContext] contains code-generation context that is _common to all_ smithy-rs plugins. @@ -17,7 +19,7 @@ import software.amazon.smithy.model.shapes.ShapeId * If your data is specific to the `rust-client-codegen` client plugin, put it in [ClientCodegenContext] instead. * If your data is specific to the `rust-server-codegen` server plugin, put it in [ServerCodegenContext] instead. */ -open class CodegenContext( +abstract class CodegenContext( /** * The smithy model. * @@ -89,4 +91,8 @@ open class CodegenContext( fun expectModuleDocProvider(): ModuleDocProvider = checkNotNull(moduleDocProvider) { "A ModuleDocProvider must be set on the CodegenContext" } + + fun structSettings() = StructSettings(settings.codegenConfig.flattenCollectionAccessors) + + abstract fun builderInstantiator(): BuilderInstantiator } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt index 157a6f2539e..d52359d6c40 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.codegen.core.WriterDelegator import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.DEV_ONLY_FEATURES import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency @@ -236,7 +237,7 @@ open class RustCrate( } } -// TODO(https://github.com/awslabs/smithy-rs/issues/2341): Remove unconstrained/constrained from codegen-core +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2341): Remove unconstrained/constrained from codegen-core val UnconstrainedModule = RustModule.private("unconstrained") val ConstrainedModule = RustModule.private("constrained") @@ -298,7 +299,9 @@ internal fun List.mergeIdenticalTestDependencies(): List + dep.scope == DependencyScope.Dev && + DEV_ONLY_FEATURES.none { devOnly -> dep.features.contains(devOnly) } && + compileDeps.contains(dep.copy(scope = DependencyScope.Compile)) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt index 72db4046d79..5e103f14625 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt @@ -41,16 +41,19 @@ const val CODEGEN_SETTINGS = "codegen" open class CoreCodegenConfig( open val formatTimeoutSeconds: Int = defaultFormatTimeoutSeconds, open val debugMode: Boolean = defaultDebugMode, + open val flattenCollectionAccessors: Boolean = defaultFlattenMode, ) { companion object { const val defaultFormatTimeoutSeconds = 20 const val defaultDebugMode = false + const val defaultFlattenMode = false fun fromNode(node: Optional): CoreCodegenConfig = if (node.isPresent) { CoreCodegenConfig( - node.get().getNumberMemberOrDefault("formatTimeoutSeconds", defaultFormatTimeoutSeconds).toInt(), - node.get().getBooleanMemberOrDefault("debugMode", defaultDebugMode), + formatTimeoutSeconds = node.get().getNumberMemberOrDefault("formatTimeoutSeconds", defaultFormatTimeoutSeconds).toInt(), + debugMode = node.get().getBooleanMemberOrDefault("debugMode", defaultDebugMode), + flattenCollectionAccessors = node.get().getBooleanMemberOrDefault("flattenCollectionAccessors", defaultFlattenMode), ) } else { CoreCodegenConfig( diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt index fdb6e35a833..97ef843fe7a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt @@ -53,7 +53,13 @@ class EventStreamSymbolProvider( (shape.isOutputEventStream(model) && target == CodegenTarget.SERVER) val outer = when (isSender) { true -> RuntimeType.eventStreamSender(runtimeConfig).toSymbol().rustType() - else -> RuntimeType.eventStreamReceiver(runtimeConfig).toSymbol().rustType() + else -> { + if (target == CodegenTarget.SERVER) { + RuntimeType.eventStreamReceiver(runtimeConfig).toSymbol().rustType() + } else { + RuntimeType.eventReceiver(runtimeConfig).toSymbol().rustType() + } + } } val rustType = RustType.Application(outer, listOf(innerT, errorT)) return initial.toBuilder() diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index cbf2514157a..6235af28447 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -40,19 +40,21 @@ data class RuntimeCrateLocation(val path: String?, val versions: CrateVersionMap } } -fun RuntimeCrateLocation.crateLocation(crateName: String?): DependencyLocation { - val version = crateName.let { versions.map[crateName] } ?: versions.map[DEFAULT_KEY] +fun RuntimeCrateLocation.crateLocation(crateName: String): DependencyLocation { + val version = crateName.let { + versions.map[crateName] + } ?: Version.crateVersion(crateName) return when (this.path) { // CratesIo needs an exact version. However, for local runtime crates we do not // provide a detected version unless the user explicitly sets one via the `versions` map. - null -> CratesIo(version ?: defaultRuntimeCrateVersion()) - else -> Local(this.path, version) + null -> CratesIo(version) + else -> Local(this.path) } } fun defaultRuntimeCrateVersion(): String { try { - return Version.crateVersion() + return Version.stableCrateVersion() } catch (ex: Exception) { throw CodegenException("failed to get crate version which sets the default client-runtime version", ex) } @@ -94,10 +96,6 @@ data class RuntimeConfig( } } - val crateSrcPrefix: String = cratePrefix.replace("-", "_") - - fun runtimeCratesPath(): String? = runtimeCrateLocation.path - fun smithyRuntimeCrate( runtimeCrateName: String, optional: Boolean = false, @@ -115,7 +113,7 @@ data class RuntimeConfig( /** * `RuntimeType` captures all necessary information to render a type into a Rust file: - * - [name]: What type is this? + * - [fullyQualifiedName]: What type is this? * - [namespace]: Where can we find this type. * - [dependency]: What other crates, if any, are required to use this type? * @@ -126,7 +124,7 @@ data class RuntimeConfig( * `http::header::HeaderName` * ------------ ---------- * | | - * `[namespace]` `[name]` + * `[namespace]` `[fullyQualifiedName]` * * This type would have a [CargoDependency] pointing to the `http` crate. Writing it multiple times would still only * add the dependency once. @@ -185,8 +183,14 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) /** * Returns the fully qualified name for this type */ - fun fullyQualifiedName(): String { - return path + fun fullyQualifiedName(): String = path + + fun render(fullyQualified: Boolean = true): String { + return if (fullyQualified) { + fullyQualifiedName() + } else { + name + } } /** @@ -293,10 +297,12 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) val PercentEncoding = CargoDependency.PercentEncoding.toType() val PrettyAssertions = CargoDependency.PrettyAssertions.toType() val Regex = CargoDependency.Regex.toType() + val RegexLite = CargoDependency.RegexLite.toType() val Tokio = CargoDependency.Tokio.toType() val TokioStream = CargoDependency.TokioStream.toType() val Tower = CargoDependency.Tower.toType() val Tracing = CargoDependency.Tracing.toType() + val TracingTest = CargoDependency.TracingTest.toType() // codegen types val ConstrainedTrait = RuntimeType("crate::constrained::Constrained", InlineDependency.constrained()) @@ -310,18 +316,16 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) // smithy runtime types fun smithyAsync(runtimeConfig: RuntimeConfig) = CargoDependency.smithyAsync(runtimeConfig).toType() fun smithyChecksums(runtimeConfig: RuntimeConfig) = CargoDependency.smithyChecksums(runtimeConfig).toType() - fun smithyClient(runtimeConfig: RuntimeConfig) = CargoDependency.smithyClient(runtimeConfig).toType() - fun smithyClientTestUtil(runtimeConfig: RuntimeConfig) = CargoDependency.smithyClient(runtimeConfig) - .copy(features = setOf("test-util"), scope = DependencyScope.Dev).toType() fun smithyEventStream(runtimeConfig: RuntimeConfig) = CargoDependency.smithyEventStream(runtimeConfig).toType() fun smithyHttp(runtimeConfig: RuntimeConfig) = CargoDependency.smithyHttp(runtimeConfig).toType() - fun smithyHttpAuth(runtimeConfig: RuntimeConfig) = CargoDependency.smithyHttpAuth(runtimeConfig).toType() - fun smithyHttpTower(runtimeConfig: RuntimeConfig) = CargoDependency.smithyHttpTower(runtimeConfig).toType() fun smithyJson(runtimeConfig: RuntimeConfig) = CargoDependency.smithyJson(runtimeConfig).toType() fun smithyQuery(runtimeConfig: RuntimeConfig) = CargoDependency.smithyQuery(runtimeConfig).toType() fun smithyRuntime(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntime(runtimeConfig).toType() fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntimeApi(runtimeConfig).toType() + fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) = + CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType() + fun smithyTypes(runtimeConfig: RuntimeConfig) = CargoDependency.smithyTypes(runtimeConfig).toType() fun smithyXml(runtimeConfig: RuntimeConfig) = CargoDependency.smithyXml(runtimeConfig).toType() private fun smithyProtocolTest(runtimeConfig: RuntimeConfig) = @@ -336,41 +340,69 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun configBag(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("config_bag::ConfigBag") - fun configBagAccessors(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::config_bag_accessors::ConfigBagAccessors") + + fun runtimeComponents(runtimeConfig: RuntimeConfig) = + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_components::RuntimeComponents") + + fun runtimeComponentsBuilder(runtimeConfig: RuntimeConfig) = + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_components::RuntimeComponentsBuilder") + fun runtimePlugins(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugins") + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugins") + + fun runtimePlugin(runtimeConfig: RuntimeConfig) = + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugin") + + fun sharedRuntimePlugin(runtimeConfig: RuntimeConfig) = + smithyRuntimeApiClient(runtimeConfig).resolve("client::runtime_plugin::SharedRuntimePlugin") + fun boxError(runtimeConfig: RuntimeConfig): RuntimeType = smithyRuntimeApi(runtimeConfig).resolve("box_error::BoxError") - fun interceptor(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::Interceptor") + + fun sdkError(runtimeConfig: RuntimeConfig): RuntimeType = + smithyRuntimeApiClient(runtimeConfig).resolve("client::result::SdkError") + + fun intercept(runtimeConfig: RuntimeConfig): RuntimeType = + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::Intercept") + fun interceptorContext(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::InterceptorContext") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::InterceptorContext") + fun sharedInterceptor(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::SharedInterceptor") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::SharedInterceptor") fun afterDeserializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::AfterDeserializationInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::AfterDeserializationInterceptorContextRef") + fun beforeSerializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextRef") + fun beforeSerializationInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextMut") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeSerializationInterceptorContextMut") + fun beforeDeserializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextRef") + fun beforeDeserializationInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextMut") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeDeserializationInterceptorContextMut") + fun beforeTransmitInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextRef") + fun beforeTransmitInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextMut") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::BeforeTransmitInterceptorContextMut") + fun finalizerInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextRef") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextRef") + fun finalizerInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType = - smithyRuntimeApi(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextMut") + smithyRuntimeApiClient(runtimeConfig).resolve("client::interceptors::context::FinalizerInterceptorContextMut") + + fun headers(runtimeConfig: RuntimeConfig): RuntimeType = + smithyRuntimeApi(runtimeConfig).resolve("http::Headers") fun blob(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("Blob") - fun byteStream(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("byte_stream::ByteStream") - fun classifyRetry(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("retry::ClassifyRetry") + fun byteStream(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("byte_stream::ByteStream") fun dateTime(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("DateTime") fun document(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("Document") fun format(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("date_time::Format") @@ -378,9 +410,15 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun eventStreamReceiver(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("event_stream::Receiver") + fun eventReceiver(runtimeConfig: RuntimeConfig) = + forInlineDependency(InlineDependency.eventReceiver(runtimeConfig)).resolve("EventReceiver") + fun eventStreamSender(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("event_stream::EventStreamSender") + fun futuresStreamCompatByteStream(runtimeConfig: RuntimeConfig): RuntimeType = + smithyHttp(runtimeConfig).resolve("futures_stream_adapter::FuturesStreamCompatByteStream") + fun errorMetadata(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("error::ErrorMetadata") fun errorMetadataBuilder(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("error::metadata::Builder") @@ -388,19 +426,17 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun provideErrorMetadataTrait(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("error::metadata::ProvideErrorMetadata") - fun unhandledError(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve("error::Unhandled") fun jsonErrors(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.jsonErrors(runtimeConfig)) fun awsQueryCompatibleErrors(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.awsQueryCompatibleErrors(runtimeConfig)) + fun defaultAuthPlugin(runtimeConfig: RuntimeConfig) = + RuntimeType.forInlineDependency(InlineDependency.defaultAuthPlugin(runtimeConfig)) + .resolve("DefaultAuthOptionsPlugin") + fun labelFormat(runtimeConfig: RuntimeConfig, func: String) = smithyHttp(runtimeConfig).resolve("label::$func") fun operation(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("operation::Operation") fun operationModule(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve("operation") - fun parseHttpResponse(runtimeConfig: RuntimeConfig) = - smithyHttp(runtimeConfig).resolve("response::ParseHttpResponse") - - fun parseStrictResponse(runtimeConfig: RuntimeConfig) = - smithyHttp(runtimeConfig).resolve("response::ParseStrictResponse") fun protocolTest(runtimeConfig: RuntimeConfig, func: String): RuntimeType = smithyProtocolTest(runtimeConfig).resolve(func) @@ -409,10 +445,7 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) smithyTypes(runtimeConfig).resolve("retry::ProvideErrorKind") fun queryFormat(runtimeConfig: RuntimeConfig, func: String) = smithyHttp(runtimeConfig).resolve("query::$func") - fun sdkBody(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("body::SdkBody") - fun sdkError(runtimeConfig: RuntimeConfig): RuntimeType = smithyHttp(runtimeConfig).resolve("result::SdkError") - fun sdkSuccess(runtimeConfig: RuntimeConfig): RuntimeType = - smithyHttp(runtimeConfig).resolve("result::SdkSuccess") + fun sdkBody(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve("body::SdkBody") fun parseTimestampFormat( codegenTarget: CodegenTarget, @@ -445,8 +478,8 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) return smithyTypes(runtimeConfig).resolve("date_time::Format::$timestampFormat") } - fun captureRequest(runtimeConfig: RuntimeConfig) = - CargoDependency.smithyClientTestUtil(runtimeConfig).toType().resolve("test_connection::capture_request") + fun captureRequest(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntimeTestUtil(runtimeConfig).toType() + .resolve("client::http::test_util::capture_request") fun forInlineDependency(inlineDependency: InlineDependency) = RuntimeType("crate::${inlineDependency.name}", inlineDependency) @@ -468,8 +501,5 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) fun idempotencyToken(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.idempotencyToken(runtimeConfig)) - - fun runtimePlugin(runtimeConfig: RuntimeConfig) = - RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::runtime_plugin::RuntimePlugin") } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt index 3b9307ab7ee..35a278a3182 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.smithy import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustType @@ -102,6 +103,11 @@ sealed class Default { * This symbol should use the Rust `std::default::Default` when unset */ object RustDefault : Default() + + /** + * This symbol has a custom default value different from `Default::default` + */ + data class NonZeroDefault(val value: Node) : Default() } /** diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt index d78818601cd..6476dd538e3 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt @@ -20,7 +20,6 @@ import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.model.traits.EnumTrait import software.amazon.smithy.model.traits.SensitiveTrait -import software.amazon.smithy.model.traits.StreamingTrait import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata import software.amazon.smithy.rust.codegen.core.rustlang.Visibility @@ -99,24 +98,12 @@ class BaseSymbolMetadataProvider( override fun memberMeta(memberShape: MemberShape): RustMetadata = when (val container = model.expectShape(memberShape.container)) { - is StructureShape -> { - // TODO(https://github.com/awslabs/smithy-rs/issues/943): Once streaming accessors are usable, - // then also make streaming members `#[doc(hidden)]` - if (memberShape.getMemberTrait(model, StreamingTrait::class.java).isPresent) { - RustMetadata(visibility = Visibility.PUBLIC) - } else { - RustMetadata( - // At some point, visibility _may_ be made `PRIVATE`, so make these `#[doc(hidden)]` for now. - visibility = Visibility.PUBLIC, - additionalAttributes = listOf(Attribute.DocHidden), - ) - } - } + is StructureShape -> RustMetadata(visibility = Visibility.PUBLIC) is UnionShape, is CollectionShape, is MapShape -> RustMetadata(visibility = Visibility.PUBLIC) // This covers strings with the enum trait for now, and can be removed once we're fully on EnumShape - // TODO(https://github.com/awslabs/smithy-rs/issues/1700): Remove this `is StringShape` match arm + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1700): Remove this `is StringShape` match arm is StringShape -> RustMetadata(visibility = Visibility.PUBLIC) else -> TODO("Unrecognized container type: $container") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt index b2426c602c0..af74c80d9f6 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt @@ -10,6 +10,7 @@ import software.amazon.smithy.codegen.core.SymbolProvider import software.amazon.smithy.model.Model import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.knowledge.NullableIndex.CheckMode +import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.shapes.BigDecimalShape import software.amazon.smithy.model.shapes.BigIntegerShape import software.amazon.smithy.model.shapes.BlobShape @@ -37,6 +38,7 @@ import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.TimestampShape import software.amazon.smithy.model.shapes.UnionShape +import software.amazon.smithy.model.traits.DefaultTrait import software.amazon.smithy.model.traits.EnumTrait import software.amazon.smithy.model.traits.ErrorTrait import software.amazon.smithy.rust.codegen.core.rustlang.Attribute @@ -48,6 +50,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.traits.RustBoxTrait import software.amazon.smithy.rust.codegen.core.util.PANIC import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.letIf +import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.toPascalCase import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import kotlin.reflect.KClass @@ -79,16 +82,18 @@ data class MaybeRenamed(val name: String, val renamedFrom: String?) /** * Make the return [value] optional if the [member] symbol is as well optional. */ -fun SymbolProvider.wrapOptional(member: MemberShape, value: String): String = value.letIf(toSymbol(member).isOptional()) { - "Some($value)" -} +fun SymbolProvider.wrapOptional(member: MemberShape, value: String): String = + value.letIf(toSymbol(member).isOptional()) { + "Some($value)" + } /** * Make the return [value] optional if the [member] symbol is not optional. */ -fun SymbolProvider.toOptional(member: MemberShape, value: String): String = value.letIf(!toSymbol(member).isOptional()) { - "Some($value)" -} +fun SymbolProvider.toOptional(member: MemberShape, value: String): String = + value.letIf(!toSymbol(member).isOptional()) { + "Some($value)" + } /** * Services can rename their contained shapes. See https://awslabs.github.io/smithy/1.0/spec/core/model.html#service @@ -111,7 +116,7 @@ fun Shape.contextName(serviceShape: ServiceShape?): String { */ open class SymbolVisitor( settings: CoreRustSettings, - override val model: Model, + final override val model: Model, private val serviceShape: ServiceShape?, override val config: RustSymbolProviderConfig, ) : RustSymbolProvider, ShapeVisitor { @@ -170,7 +175,7 @@ open class SymbolVisitor( } private fun simpleShape(shape: SimpleShape): Symbol { - return symbolBuilder(shape, SimpleShapes.getValue(shape::class)).setDefault(Default.RustDefault).build() + return symbolBuilder(shape, SimpleShapes.getValue(shape::class)).build() } override fun booleanShape(shape: BooleanShape): Symbol = simpleShape(shape) @@ -187,7 +192,7 @@ open class SymbolVisitor( val rustType = RustType.Opaque(shape.contextName(serviceShape).toPascalCase()) symbolBuilder(shape, rustType).locatedIn(moduleForShape(shape)).build() } else { - simpleShape(shape) + symbolBuilder(shape, RustType.String).build() } } @@ -221,11 +226,11 @@ open class SymbolVisitor( } override fun bigIntegerShape(shape: BigIntegerShape?): Symbol { - TODO("Not yet implemented: https://github.com/awslabs/smithy-rs/issues/312") + TODO("Not yet implemented: https://github.com/smithy-lang/smithy-rs/issues/312") } override fun bigDecimalShape(shape: BigDecimalShape?): Symbol { - TODO("Not yet implemented: https://github.com/awslabs/smithy-rs/issues/312") + TODO("Not yet implemented: https://github.com/smithy-lang/smithy-rs/issues/312") } override fun operationShape(shape: OperationShape): Symbol { @@ -263,13 +268,24 @@ open class SymbolVisitor( override fun memberShape(shape: MemberShape): Symbol { val target = model.expectShape(shape.target) + val defaultValue = shape.getMemberTrait(model, DefaultTrait::class.java).orNull()?.let { trait -> + if (target.isDocumentShape || target.isTimestampShape) { + Default.NonZeroDefault(trait.toNode()) + } else { + when (val value = trait.toNode()) { + Node.from(""), Node.from(0), Node.from(false), Node.arrayNode(), Node.objectNode() -> Default.RustDefault + Node.nullNode() -> Default.NoDefault + else -> Default.NonZeroDefault(value) + } + } + } ?: Default.NoDefault // Handle boxing first, so we end up with Option>, not Box>. return handleOptionality( handleRustBoxing(toSymbol(target), shape), shape, nullableIndex, config.nullabilityCheckMode, - ) + ).toBuilder().setDefault(defaultValue).build() } override fun timestampShape(shape: TimestampShape?): Symbol { @@ -297,7 +313,12 @@ fun symbolBuilder(shape: Shape?, rustType: RustType): Symbol.Builder = // If we ever generate a `thisisabug.rs`, there is a bug in our symbol generation .definitionFile("thisisabug.rs") -fun handleOptionality(symbol: Symbol, member: MemberShape, nullableIndex: NullableIndex, nullabilityCheckMode: CheckMode): Symbol = +fun handleOptionality( + symbol: Symbol, + member: MemberShape, + nullableIndex: NullableIndex, + nullabilityCheckMode: CheckMode, +): Symbol = symbol.letIf(nullableIndex.isMemberNullable(member, nullabilityCheckMode)) { symbol.makeOptional() } /** diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt index 301ee11da8c..2a285ca13f3 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt @@ -8,21 +8,16 @@ package software.amazon.smithy.rust.codegen.core.smithy.customizations import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.rustlang.Feature import software.amazon.smithy.rust.codegen.core.rustlang.Writable -import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext -import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember +import software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations import software.amazon.smithy.rust.codegen.core.util.hasStreamingMember -import software.amazon.smithy.rust.codegen.core.util.letIf - -private data class PubUseType( - val type: RuntimeType, - val shouldExport: (Model) -> Boolean, - val alias: String? = null, -) /** Returns true if the model has normal streaming operations (excluding event streams) */ private fun hasStreamingOperations(model: Model): Boolean { @@ -34,7 +29,7 @@ private fun hasStreamingOperations(model: Model): Boolean { } } -// TODO(https://github.com/awslabs/smithy-rs/issues/2111): Fix this logic to consider collection/map shapes +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2111): Fix this logic to consider collection/map shapes private fun structUnionMembersMatchPredicate(model: Model, predicate: (Shape) -> Boolean): Boolean = model.structureShapes.any { structure -> structure.members().any { member -> predicate(model.expectShape(member.target)) } @@ -48,62 +43,60 @@ private fun hasBlobs(model: Model): Boolean = structUnionMembersMatchPredicate(m /** Returns true if the model uses any timestamp shapes */ private fun hasDateTimes(model: Model): Boolean = structUnionMembersMatchPredicate(model, Shape::isTimestampShape) -/** Returns a list of types that should be re-exported for the given model */ -internal fun pubUseTypes(codegenContext: CodegenContext, model: Model): List = - pubUseTypesThatShouldBeExported(codegenContext, model).map { it.type } - -private fun pubUseTypesThatShouldBeExported(codegenContext: CodegenContext, model: Model): List { - val runtimeConfig = codegenContext.runtimeConfig - return ( - listOf( - PubUseType(RuntimeType.blob(runtimeConfig), ::hasBlobs), - PubUseType(RuntimeType.dateTime(runtimeConfig), ::hasDateTimes), - PubUseType(RuntimeType.format(runtimeConfig), ::hasDateTimes, "DateTimeFormat"), - ) + RuntimeType.smithyHttp(runtimeConfig).let { http -> - listOf( - PubUseType(http.resolve("byte_stream::ByteStream"), ::hasStreamingOperations), - PubUseType(http.resolve("byte_stream::AggregatedBytes"), ::hasStreamingOperations), - PubUseType(http.resolve("byte_stream::error::Error"), ::hasStreamingOperations, "ByteStreamError"), - PubUseType(http.resolve("body::SdkBody"), ::hasStreamingOperations), - ) - } - ).filter { pubUseType -> pubUseType.shouldExport(model) } -} - /** Adds re-export statements for Smithy primitives */ -fun pubUseSmithyPrimitives(codegenContext: CodegenContext, model: Model): Writable = writable { - val types = pubUseTypesThatShouldBeExported(codegenContext, model) - if (types.isNotEmpty()) { - types.forEach { - val useStatement = if (it.alias == null) { - "pub use #T;" - } else { - "pub use #T as ${it.alias};" - } - rust(useStatement, it.type) - } +fun pubUseSmithyPrimitives(codegenContext: CodegenContext, model: Model, rustCrate: RustCrate): Writable = writable { + val rc = codegenContext.runtimeConfig + if (hasBlobs(model)) { + rustTemplate("pub use #{Blob};", "Blob" to RuntimeType.blob(rc)) + } + if (hasDateTimes(model)) { + rustTemplate( + """ + pub use #{DateTime}; + pub use #{Format} as DateTimeFormat; + """, + "DateTime" to RuntimeType.dateTime(rc), + "Format" to RuntimeType.format(rc), + ) + } + if (hasStreamingOperations(model)) { + rustCrate.mergeFeature( + Feature( + "rt-tokio", + true, + listOf("aws-smithy-types/rt-tokio"), + ), + ) + rustTemplate( + """ + pub use #{ByteStream}; + pub use #{AggregatedBytes}; + pub use #{Error} as ByteStreamError; + pub use #{SdkBody}; + """, + "ByteStream" to RuntimeType.smithyTypes(rc).resolve("byte_stream::ByteStream"), + "AggregatedBytes" to RuntimeType.smithyTypes(rc).resolve("byte_stream::AggregatedBytes"), + "Error" to RuntimeType.smithyTypes(rc).resolve("byte_stream::error::Error"), + "SdkBody" to RuntimeType.smithyTypes(rc).resolve("body::SdkBody"), + ) } } -/** Adds re-export statements for error types */ -fun pubUseSmithyErrorTypes(codegenContext: CodegenContext): Writable = writable { - val runtimeConfig = codegenContext.runtimeConfig - val reexports = listOf( - listOf( - RuntimeType.smithyHttp(runtimeConfig).let { http -> - PubUseType(http.resolve("result::SdkError"), { _ -> true }) - }, - ), - RuntimeType.smithyTypes(runtimeConfig).let { types -> - listOf(PubUseType(types.resolve("error::display::DisplayErrorContext"), { _ -> true })) - // Only re-export `ProvideErrorMetadata` for clients - .letIf(codegenContext.target == CodegenTarget.CLIENT) { list -> - list + - listOf(PubUseType(types.resolve("error::metadata::ProvideErrorMetadata"), { _ -> true })) - } - }, - ).flatten() - reexports.forEach { reexport -> - rust("pub use #T;", reexport.type) +/** Adds re-export statements for event-stream-related Smithy primitives */ +fun pubUseSmithyPrimitivesEventStream(codegenContext: CodegenContext, model: Model): Writable = writable { + val rc = codegenContext.runtimeConfig + if (codegenContext.serviceShape.hasEventStreamOperations(model)) { + rustTemplate( + """ + pub use #{Header}; + pub use #{HeaderValue}; + pub use #{Message}; + pub use #{StrBytes}; + """, + "Header" to RuntimeType.smithyTypes(rc).resolve("event_stream::Header"), + "HeaderValue" to RuntimeType.smithyTypes(rc).resolve("event_stream::HeaderValue"), + "Message" to RuntimeType.smithyTypes(rc).resolve("event_stream::Message"), + "StrBytes" to RuntimeType.smithyTypes(rc).resolve("str_bytes::StrBytes"), + ) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt index c91d705ac39..923f4fce554 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt @@ -83,7 +83,7 @@ interface CoreCodegenDecorator { baseCustomizations: List, ): List = baseCustomizations - // TODO(https://github.com/awslabs/smithy-rs/issues/1401): Move builder customizations into `ClientCodegenDecorator` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): Move builder customizations into `ClientCodegenDecorator` /** * Hook to customize generated builders. */ diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index e86061c4c3c..76c8caf4efa 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -9,6 +9,7 @@ import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.codegen.core.SymbolProvider import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive @@ -21,6 +22,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlockTemplat import software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.documentShape +import software.amazon.smithy.rust.codegen.core.rustlang.map import software.amazon.smithy.rust.codegen.core.rustlang.render import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock @@ -29,7 +31,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable -import software.amazon.smithy.rust.codegen.core.smithy.Default +import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope @@ -38,7 +40,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.canUseDefault import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section import software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations -import software.amazon.smithy.rust.codegen.core.smithy.defaultValue import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.makeOptional @@ -46,10 +47,11 @@ import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.redactIfNecessary import software.amazon.smithy.rust.codegen.core.util.toSnakeCase -// TODO(https://github.com/awslabs/smithy-rs/issues/1401) This builder generator is only used by the client. +// TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) This builder generator is only used by the client. // Move this entire file, and its tests, to `codegen-client`. /** BuilderGenerator customization sections */ @@ -73,13 +75,42 @@ sealed class BuilderSection(name: String) : Section(name) { /** Customizations for BuilderGenerator */ abstract class BuilderCustomization : NamedCustomization() -fun RuntimeConfig.operationBuildError() = RuntimeType.operationModule(this).resolve("error::BuildError") -fun RuntimeConfig.serializationError() = RuntimeType.operationModule(this).resolve("error::SerializationError") +fun RuntimeConfig.operationBuildError() = RuntimeType.smithyTypes(this).resolve("error::operation::BuildError") +fun RuntimeConfig.serializationError() = RuntimeType.smithyTypes(this).resolve("error::operation::SerializationError") + +fun MemberShape.enforceRequired( + field: Writable, + codegenContext: CodegenContext, + produceOption: Boolean = true, +): Writable { + if (!this.isRequired) { + return field + } + val shape = this + val isOptional = codegenContext.symbolProvider.toSymbol(shape).isOptional() + val field = field.letIf(!isOptional) { field.map { rust("Some(#T)", it) } } + val error = OperationBuildError(codegenContext.runtimeConfig).missingField( + codegenContext.symbolProvider.toMemberName(shape), "A required field was not set", + ) + val unwrapped = when (codegenContext.model.expectShape(this.target)) { + is StringShape -> writable { + rustTemplate( + "#{field}.filter(|f|!AsRef::::as_ref(f).trim().is_empty())", + "field" to field, + ) + } + + else -> field + }.map { base -> rustTemplate("#{base}.ok_or_else(||#{error})?", "base" to base, "error" to error) } + return unwrapped.letIf(produceOption) { w -> w.map { rust("Some(#T)", it) } } +} class OperationBuildError(private val runtimeConfig: RuntimeConfig) { + fun missingField(field: String, details: String) = writable { rust("#T::missing_field(${field.dq()}, ${details.dq()})", runtimeConfig.operationBuildError()) } + fun invalidField(field: String, details: String) = invalidField(field) { rust(details.dq()) } fun invalidField(field: String, details: Writable) = writable { rustTemplate( @@ -155,6 +186,14 @@ class BuilderGenerator( false -> implBlockWriter.format(outputSymbol) } implBlockWriter.docs("Consumes the builder and constructs a #D.", outputSymbol) + val trulyRequiredMembers = members.filter { trulyRequired(it) } + if (trulyRequiredMembers.isNotEmpty()) { + implBlockWriter.docs("This method will fail if any of the following fields are not set:") + trulyRequiredMembers.forEach { + val memberName = symbolProvider.toMemberName(it) + implBlockWriter.docs("- [`$memberName`](#T::$memberName)", symbolProvider.symbolForBuilder(shape)) + } + } implBlockWriter.rustBlockTemplate("pub fn build(self) -> $returnType", *preludeScope) { conditionalBlockTemplate("#{Ok}(", ")", conditional = fallibleBuilder, *preludeScope) { // If a wrapper is specified, use the `::new` associated function to construct the wrapper @@ -164,7 +203,8 @@ class BuilderGenerator( } private fun RustWriter.missingRequiredField(field: String) { - val detailedMessage = "$field was not specified but it is required when building ${symbolProvider.toSymbol(shape).name}" + val detailedMessage = + "$field was not specified but it is required when building ${symbolProvider.toSymbol(shape).name}" OperationBuildError(runtimeConfig).missingField(field, detailedMessage)(this) } @@ -184,6 +224,9 @@ class BuilderGenerator( val input = coreType.asArgument("input") writer.documentShape(member, model) + if (member.isRequired) { + writer.docs("This field is required.") + } writer.deprecatedShape(member) writer.rustBlock("pub fn $memberName(mut self, ${input.argument}) -> Self") { rustTemplate("self.$memberName = #{Some}(${input.value});", *preludeScope) @@ -201,7 +244,7 @@ class BuilderGenerator( member: MemberShape, memberName: String, ) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in // the case where the shape is a `@streaming` blob, because [StreamingTraitSymbolProvider] always generates // a non `Option`al target type: in all other cases the client generates `Option`al types. val inputType = outerType.asOptional() @@ -223,7 +266,7 @@ class BuilderGenerator( member: MemberShape, memberName: String, ) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in // the case where the shape is a `@streaming` blob, because [StreamingTraitSymbolProvider] always generates // a non `Option`al target type: in all other cases the client generates `Option`al types. val inputType = outerType.asOptional() @@ -337,6 +380,10 @@ class BuilderGenerator( } } + private fun trulyRequired(member: MemberShape) = symbolProvider.toSymbol(member).let { + !it.isOptional() && !it.canUseDefault() + } + /** * The core builder of the inner type. If the structure requires a fallible builder, this may use `?` to return * errors. @@ -353,15 +400,22 @@ class BuilderGenerator( members.forEach { member -> val memberName = symbolProvider.toMemberName(member) val memberSymbol = symbolProvider.toSymbol(member) - val default = memberSymbol.defaultValue() withBlock("$memberName: self.$memberName", ",") { - // Write the modifier - when { - !memberSymbol.isOptional() && default == Default.RustDefault -> rust(".unwrap_or_default()") - !memberSymbol.isOptional() -> withBlock( - ".ok_or_else(||", - ")?", - ) { missingRequiredField(memberName) } + val generator = DefaultValueGenerator(runtimeConfig, symbolProvider, model) + val default = generator.defaultValue(member) + if (!memberSymbol.isOptional()) { + if (default != null) { + if (default.isRustDefault) { + rust(".unwrap_or_default()") + } else { + rust(".unwrap_or_else(#T)", default.expr) + } + } else { + withBlock( + ".ok_or_else(||", + ")?", + ) { missingRequiredField(memberName) } + } } } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderInstantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderInstantiator.kt new file mode 100644 index 00000000000..fd62ced0668 --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderInstantiator.kt @@ -0,0 +1,32 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.smithy.generators + +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable + +/** Abstraction for instantiating builders. + * + * Builder abstractions vary—clients MAY use `build_with_error_correction`, e.g., and builders can vary in fallibility. + * */ +interface BuilderInstantiator { + /** Set a field on a builder. */ + fun setField(builder: String, value: Writable, field: MemberShape): Writable + + /** Finalize a builder, turning it into a built object + * - In the case of builders-of-builders, the value should be returned directly + * - If an error is returned, you MUST use `mapErr` to convert the error type + */ + fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable? = null): Writable + + /** Set a field on a builder using the `$setterName` method. $value will be passed directly. */ + fun setFieldWithSetter(builder: String, value: Writable, field: MemberShape) = writable { + rustTemplate("$builder = $builder.${field.setterName()}(#{value})", "value" to value) + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt index 86c76c521a0..b5eca73acd8 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt @@ -43,12 +43,36 @@ typealias ManifestCustomizations = Map * Generates the crate manifest Cargo.toml file. */ class CargoTomlGenerator( - private val settings: CoreRustSettings, + private val moduleName: String, + private val moduleVersion: String, + private val moduleAuthors: List, + private val moduleDescription: String?, + private val moduleLicense: String?, + private val moduleRepository: String?, private val writer: RustWriter, - private val manifestCustomizations: ManifestCustomizations, - private val dependencies: List, - private val features: List, + private val manifestCustomizations: ManifestCustomizations = emptyMap(), + private val dependencies: List = emptyList(), + private val features: List = emptyList(), ) { + constructor( + settings: CoreRustSettings, + writer: RustWriter, + manifestCustomizations: ManifestCustomizations, + dependencies: List, + features: List, + ) : this( + settings.moduleName, + settings.moduleVersion, + settings.moduleAuthors, + settings.moduleDescription, + settings.license, + settings.moduleRepository, + writer, + manifestCustomizations, + dependencies, + features, + ) + fun render() { val cargoFeatures = features.map { it.name to it.deps }.toMutableList() if (features.isNotEmpty()) { @@ -57,13 +81,13 @@ class CargoTomlGenerator( val cargoToml = mapOf( "package" to listOfNotNull( - "name" to settings.moduleName, - "version" to settings.moduleVersion, - "authors" to settings.moduleAuthors, - settings.moduleDescription?.let { "description" to it }, + "name" to moduleName, + "version" to moduleVersion, + "authors" to moduleAuthors, + moduleDescription?.let { "description" to it }, "edition" to "2021", - "license" to settings.license, - "repository" to settings.moduleRepository, + "license" to moduleLicense, + "repository" to moduleRepository, "metadata" to listOfNotNull( "smithy" to listOfNotNull( "codegen-version" to Version.fullVersion(), diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/DefaultValueGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/DefaultValueGenerator.kt new file mode 100644 index 00000000000..38001bf102e --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/DefaultValueGenerator.kt @@ -0,0 +1,40 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.smithy.generators + +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.SimpleShape +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.Default +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.defaultValue + +class DefaultValueGenerator( + runtimeConfig: RuntimeConfig, + private val symbolProvider: RustSymbolProvider, + private val model: Model, +) { + private val instantiator = PrimitiveInstantiator(runtimeConfig, symbolProvider) + + data class DefaultValue(val isRustDefault: Boolean, val expr: Writable) + + /** Returns the default value as set by the defaultValue trait */ + fun defaultValue(member: MemberShape): DefaultValue? { + val target = model.expectShape(member.target) + return when (val default = symbolProvider.toSymbol(member).defaultValue()) { + is Default.NoDefault -> null + is Default.RustDefault -> DefaultValue(isRustDefault = true, writable("Default::default")) + is Default.NonZeroDefault -> { + val instantiation = instantiator.instantiate(target as SimpleShape, default.value) + DefaultValue(isRustDefault = false, writable { rust("||#T", instantiation) }) + } + } + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt index a84820ad263..9c614c7c6e4 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt @@ -88,7 +88,7 @@ class EnumMemberModel( * * Ordinarily, the symbol provider would determine this name, but the enum trait doesn't allow for this. * - * TODO(https://github.com/awslabs/smithy-rs/issues/1700): Remove this function when refactoring to EnumShape. + * TODO(https://github.com/smithy-lang/smithy-rs/issues/1700): Remove this function when refactoring to EnumShape. */ @Deprecated("This function will go away when we handle EnumShape instead of EnumTrait") fun toEnumVariantName( @@ -232,6 +232,20 @@ open class EnumGenerator( }, ) + // Add an infallible FromStr implementation for uniformity + rustTemplate( + """ + impl ::std::str::FromStr for ${context.enumName} { + type Err = ::std::convert::Infallible; + + fn from_str(s: &str) -> #{Result}::Err> { + #{Ok}(${context.enumName}::from(s)) + } + } + """, + *preludeScope, + ) + rustTemplate( """ impl #{From} for ${context.enumName} where T: #{AsRef} { @@ -239,6 +253,7 @@ open class EnumGenerator( ${context.enumName}(s.as_ref().to_owned()) } } + """, *preludeScope, ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt index eed196e4891..795a6b5a1dc 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt @@ -6,7 +6,7 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import software.amazon.smithy.codegen.core.CodegenException -import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.codegen.core.SymbolProvider import software.amazon.smithy.model.Model import software.amazon.smithy.model.node.ArrayNode import software.amazon.smithy.model.node.Node @@ -18,12 +18,14 @@ import software.amazon.smithy.model.shapes.BlobShape import software.amazon.smithy.model.shapes.BooleanShape import software.amazon.smithy.model.shapes.CollectionShape import software.amazon.smithy.model.shapes.DocumentShape +import software.amazon.smithy.model.shapes.EnumShape import software.amazon.smithy.model.shapes.ListShape import software.amazon.smithy.model.shapes.MapShape import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.NumberShape import software.amazon.smithy.model.shapes.SetShape import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.SimpleShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.TimestampShape @@ -44,6 +46,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock +import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -84,14 +87,11 @@ open class Instantiator( private val runtimeConfig: RuntimeConfig, /** Behavior of the builder type used for structure shapes. */ private val builderKindBehavior: BuilderKindBehavior, - /** - * A function that given a symbol for an enum shape and a string, returns a writable to instantiate the enum with - * the string value. - **/ - private val enumFromStringFn: (Symbol, String) -> Writable, /** Fill out required fields with a default value. **/ private val defaultsForRequiredFields: Boolean = false, private val customizations: List = listOf(), + private val constructPattern: InstantiatorConstructPattern = InstantiatorConstructPattern.BUILDER, + private val customWritable: CustomWritable = NoCustomWritable(), ) { data class Ctx( // The `http` crate requires that headers be lowercase, but Smithy protocol tests @@ -99,6 +99,16 @@ open class Instantiator( val lowercaseMapKeys: Boolean = false, ) + /** + * A struct can be built by: + * * direct instantiation: A { field_1: value_1, field_2: value_2 } + * * its associated builder: A::builder().field_1(value_1).field_2(value_2).build() + */ + enum class InstantiatorConstructPattern { + DIRECT, + BUILDER, + } + /** * Client and server structures have different builder types. `Instantiator` needs to know how the builder * type behaves to generate code for it. @@ -113,85 +123,54 @@ open class Instantiator( fun doesSetterTakeInOption(memberShape: MemberShape): Boolean } + /** + * Customize how each shape is rendered, instead of relying on static `Node` data. + */ + interface CustomWritable { + // Return `null` to rely on the default behavior, which uses the static `Node` data. + fun generate(shape: Shape): Writable? + } + + class NoCustomWritable : CustomWritable { + override fun generate(shape: Shape): Writable? = null + } + fun generate(shape: Shape, data: Node, headers: Map = mapOf(), ctx: Ctx = Ctx()) = writable { render(this, shape, data, headers, ctx) } - fun render(writer: RustWriter, shape: Shape, data: Node, headers: Map = mapOf(), ctx: Ctx = Ctx()) { - when (shape) { - // Compound Shapes - is StructureShape -> renderStructure(writer, shape, data as ObjectNode, headers, ctx) - is UnionShape -> renderUnion(writer, shape, data as ObjectNode, ctx) - - // Collections - is ListShape -> renderList(writer, shape, data as ArrayNode, ctx) - is MapShape -> renderMap(writer, shape, data as ObjectNode, ctx) - is SetShape -> renderSet(writer, shape, data as ArrayNode, ctx) - - // Members, supporting potentially optional members - is MemberShape -> renderMember(writer, shape, data, ctx) - - // Wrapped Shapes - is TimestampShape -> { - val node = (data as NumberNode) - val num = BigDecimal(node.toString()) - val wholePart = num.toInt() - val fractionalPart = num.remainder(BigDecimal.ONE) - writer.rust( - "#T::from_fractional_secs($wholePart, ${fractionalPart}_f64)", - RuntimeType.dateTime(runtimeConfig), - ) - } - - /** - * ```rust - * Blob::new("arg") - * ``` - */ - is BlobShape -> if (shape.hasTrait()) { - writer.rust( - "#T::from_static(b${(data as StringNode).value.dq()})", - RuntimeType.byteStream(runtimeConfig), - ) - } else { - writer.rust( - "#T::new(${(data as StringNode).value.dq()})", - RuntimeType.blob(runtimeConfig), - ) - } + open fun render( + writer: RustWriter, + shape: Shape, + data: Node, + headers: Map = mapOf(), + ctx: Ctx = Ctx(), + ) { + customWritable.generate(shape) + ?.let { it(writer) } + ?: run { + when (shape) { + // Compound Shapes + is StructureShape -> renderStructure(writer, shape, data as ObjectNode, headers, ctx) + is UnionShape -> renderUnion(writer, shape, data as ObjectNode, ctx) + + // Collections + is ListShape -> renderList(writer, shape, data as ArrayNode, ctx) + is MapShape -> renderMap(writer, shape, data as ObjectNode, ctx) + is SetShape -> renderSet(writer, shape, data as ArrayNode, ctx) + + // Members, supporting potentially optional members + is MemberShape -> renderMember(writer, shape, data, ctx) + + is SimpleShape -> PrimitiveInstantiator(runtimeConfig, symbolProvider).instantiate( + shape, + data, + customWritable, + )(writer) - // Simple Shapes - is StringShape -> renderString(writer, shape, data as StringNode) - is NumberShape -> when (data) { - is StringNode -> { - val numberSymbol = symbolProvider.toSymbol(shape) - // support Smithy custom values, such as Infinity - writer.rust( - """<#T as #T>::parse_smithy_primitive(${data.value.dq()}).expect("invalid string for number")""", - numberSymbol, - RuntimeType.smithyTypes(runtimeConfig).resolve("primitive::Parse"), - ) + else -> writer.writeWithNoFormatting("todo!() /* $shape $data */") } - - is NumberNode -> writer.write(data.value) - } - - is BooleanShape -> writer.rust(data.asBooleanNode().get().toString()) - is DocumentShape -> writer.rustBlock("") { - val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType() - rustTemplate( - """ - let json_bytes = br##"${Node.prettyPrintJson(data)}"##; - let mut tokens = #{json_token_iter}(json_bytes).peekable(); - #{expect_document}(&mut tokens).expect("well formed json") - """, - "expect_document" to smithyJson.resolve("deserialize::token::expect_document"), - "json_token_iter" to smithyJson.resolve("deserialize::json_token_iter"), - ) } - - else -> writer.writeWithNoFormatting("todo!() /* $shape $data */") - } } /** @@ -201,44 +180,53 @@ open class Instantiator( private fun renderMember(writer: RustWriter, memberShape: MemberShape, data: Node, ctx: Ctx) { val targetShape = model.expectShape(memberShape.target) val symbol = symbolProvider.toSymbol(memberShape) - if (data is NullNode) { - check(symbol.isOptional()) { - "A null node was provided for $memberShape but the symbol was not optional. This is invalid input data." - } - writer.rustTemplate("#{None}", *preludeScope) - } else { - // Structure builder setters for structure shape members _always_ take in `Option`. - // Other aggregate shapes' members are optional only when their symbol is. - writer.conditionalBlockTemplate( - "#{Some}(", - ")", - // The conditions are not commutative: note client builders always take in `Option`. - conditional = symbol.isOptional() || - (model.expectShape(memberShape.container) is StructureShape && builderKindBehavior.doesSetterTakeInOption(memberShape)), - *preludeScope, - ) { - writer.conditionalBlockTemplate( - "#{Box}::new(", - ")", - conditional = symbol.rustType().stripOuter() is RustType.Box, - *preludeScope, - ) { - render( - this, - targetShape, - data, - mapOf(), - ctx.copy() - .letIf(memberShape.hasTrait()) { - it.copy(lowercaseMapKeys = true) - }, - ) + customWritable.generate(memberShape) + ?.let { it(writer) } + ?: run { + if (data is NullNode && !targetShape.isDocumentShape) { + check(symbol.isOptional()) { + "A null node was provided for $memberShape but the symbol was not optional. This is invalid input data." + } + writer.rustTemplate("#{None}", *preludeScope) + } else { + // Structure builder setters for structure shape members _always_ take in `Option`. + // Other aggregate shapes' members are optional only when their symbol is. + writer.conditionalBlockTemplate( + "#{Some}(", + ")", + // The conditions are not commutative: note client builders always take in `Option`. + conditional = symbol.isOptional() || + ( + model.expectShape(memberShape.container) is StructureShape && builderKindBehavior.doesSetterTakeInOption( + memberShape, + ) + ), + *preludeScope, + ) { + writer.conditionalBlockTemplate( + "#{Box}::new(", + ")", + conditional = symbol.rustType().stripOuter() is RustType.Box, + *preludeScope, + ) { + render( + this, + targetShape, + data, + mapOf(), + ctx.copy() + .letIf(memberShape.hasTrait()) { + it.copy(lowercaseMapKeys = true) + }, + ) + } + } } } - } } - private fun renderSet(writer: RustWriter, shape: SetShape, data: ArrayNode, ctx: Ctx) = renderList(writer, shape, data, ctx) + private fun renderSet(writer: RustWriter, shape: SetShape, data: ArrayNode, ctx: Ctx) = + renderList(writer, shape, data, ctx) /** * ```rust @@ -317,29 +305,34 @@ open class Instantiator( } } - private fun renderString(writer: RustWriter, shape: StringShape, arg: StringNode) { - val data = writer.escape(arg.value).dq() - if (!shape.hasTrait()) { - writer.rust("$data.to_owned()") - } else { - val enumSymbol = symbolProvider.toSymbol(shape) - writer.rustTemplate("#{EnumFromStringFn:W}", "EnumFromStringFn" to enumFromStringFn(enumSymbol, data)) - } - } - /** * ```rust * MyStruct::builder().field_1("hello").field_2(5).build() * ``` */ - private fun renderStructure(writer: RustWriter, shape: StructureShape, data: ObjectNode, headers: Map, ctx: Ctx) { - writer.rust("#T::builder()", symbolProvider.toSymbol(shape)) + private fun renderStructure( + writer: RustWriter, + shape: StructureShape, + data: ObjectNode, + headers: Map, + ctx: Ctx, + ) { + when (constructPattern) { + InstantiatorConstructPattern.DIRECT -> + writer.withBlockTemplate("#{T} {", "}", "T" to symbolProvider.toSymbol(shape)) { + renderStructureMembers(writer, shape, data, headers, ctx) + } + + InstantiatorConstructPattern.BUILDER -> { + writer.rust("#T::builder()", symbolProvider.toSymbol(shape)) - renderStructureMembers(writer, shape, data, headers, ctx) + renderStructureMembers(writer, shape, data, headers, ctx) - writer.rust(".build()") - if (builderKindBehavior.hasFallibleBuilder(shape)) { - writer.rust(".unwrap()") + writer.rust(".build()") + if (builderKindBehavior.hasFallibleBuilder(shape)) { + writer.rust(".unwrap()") + } + } } } @@ -350,10 +343,23 @@ open class Instantiator( headers: Map, ctx: Ctx, ) { + val renderedMembers = mutableSetOf() fun renderMemberHelper(memberShape: MemberShape, value: Node) { - val setterName = builderKindBehavior.setterName(memberShape) - writer.withBlock(".$setterName(", ")") { - renderMember(this, memberShape, value, ctx) + renderedMembers.add(memberShape) + when (constructPattern) { + InstantiatorConstructPattern.DIRECT -> { + val fieldName = symbolProvider.toMemberName(memberShape) + writer.withBlock("$fieldName:", ",") { + renderMember(this, memberShape, value, ctx) + } + } + + InstantiatorConstructPattern.BUILDER -> { + val setterName = builderKindBehavior.setterName(memberShape) + writer.withBlock(".$setterName(", ")") { + renderMember(this, memberShape, value, ctx) + } + } } } @@ -372,7 +378,7 @@ open class Instantiator( .filter { it.value.hasTrait() } .forEach { (_, value) -> val trait = value.expectTrait().value - headers.get(trait)?.let { renderMemberHelper(value, Node.from(it)) } + headers[trait]?.let { renderMemberHelper(value, Node.from(it)) } } } @@ -390,6 +396,13 @@ open class Instantiator( ?.let { renderMemberHelper(it.value, fillDefaultValue(model.expectShape(it.value.target))) } + + if (constructPattern == InstantiatorConstructPattern.DIRECT) { + val membersToRender = shape.allMembers.values.minus(renderedMembers) + check(membersToRender.all { it.isOptional }) + membersToRender + .forEach { renderMemberHelper(it, Node.nullNode()) } + } } /** @@ -416,3 +429,82 @@ open class Instantiator( else -> throw CodegenException("Unrecognized shape `$shape`") } } + +class PrimitiveInstantiator(private val runtimeConfig: RuntimeConfig, private val symbolProvider: SymbolProvider) { + fun instantiate( + shape: SimpleShape, + data: Node, + customWritable: Instantiator.CustomWritable = Instantiator.NoCustomWritable(), + ): Writable = + customWritable.generate(shape) ?: writable { + when (shape) { + // Simple Shapes + is TimestampShape -> { + val node = (data as NumberNode) + val num = BigDecimal(node.toString()) + val wholePart = num.toInt() + val fractionalPart = num.remainder(BigDecimal.ONE) + rust( + "#T::from_fractional_secs($wholePart, ${fractionalPart}_f64)", + RuntimeType.dateTime(runtimeConfig), + ) + } + + /** + * ```rust + * Blob::new("arg") + * ``` + */ + is BlobShape -> if (shape.hasTrait()) { + rust( + "#T::from_static(b${(data as StringNode).value.dq()})", + RuntimeType.byteStream(runtimeConfig), + ) + } else { + rust( + "#T::new(${(data as StringNode).value.dq()})", + RuntimeType.blob(runtimeConfig), + ) + } + + is StringShape -> renderString(shape, data as StringNode)(this) + is NumberShape -> when (data) { + is StringNode -> { + val numberSymbol = symbolProvider.toSymbol(shape) + // support Smithy custom values, such as Infinity + rust( + """<#T as #T>::parse_smithy_primitive(${data.value.dq()}).expect("invalid string for number")""", + numberSymbol, + RuntimeType.smithyTypes(runtimeConfig).resolve("primitive::Parse"), + ) + } + + is NumberNode -> write(data.value) + } + + is BooleanShape -> rust(data.asBooleanNode().get().toString()) + is DocumentShape -> rustBlock("") { + val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType() + rustTemplate( + """ + let json_bytes = br##"${Node.prettyPrintJson(data)}"##; + let mut tokens = #{json_token_iter}(json_bytes).peekable(); + #{expect_document}(&mut tokens).expect("well formed json") + """, + "expect_document" to smithyJson.resolve("deserialize::token::expect_document"), + "json_token_iter" to smithyJson.resolve("deserialize::json_token_iter"), + ) + } + } + } + + private fun renderString(shape: StringShape, arg: StringNode): Writable = { + val data = escape(arg.value).dq() + if (shape.hasTrait() || shape is EnumShape) { + val enumSymbol = symbolProvider.toSymbol(shape) + rust("""$data.parse::<#T>().expect("static value validated to member")""", enumSymbol) + } else { + rust("$data.to_owned()") + } + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt index 1da954f0860..ed05e0c1f07 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt @@ -80,7 +80,7 @@ class LibRsGenerator( writeTo(this) } - // TODO(https://github.com/awslabs/smithy-rs/issues/69): Generate a basic example for all crates (eg. select first operation and render an example of usage) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/69): Generate a basic example for all crates (eg. select first operation and render an example of usage) settings.examplesUri?.also { uri -> containerDocs("Examples can be found [here]($uri).") } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt index 80d89e341ff..64b7f55702d 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt @@ -16,12 +16,15 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.asDeref import software.amazon.smithy.rust.codegen.core.rustlang.asRef import software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape +import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.documentShape +import software.amazon.smithy.rust.codegen.core.rustlang.innerReference import software.amazon.smithy.rust.codegen.core.rustlang.isCopy import software.amazon.smithy.rust.codegen.core.rustlang.isDeref import software.amazon.smithy.rust.codegen.core.rustlang.render import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization @@ -53,12 +56,15 @@ sealed class StructureSection(name: String) : Section(name) { /** Customizations for StructureGenerator */ abstract class StructureCustomization : NamedCustomization() +data class StructSettings(val flattenVecAccessors: Boolean) + open class StructureGenerator( val model: Model, private val symbolProvider: RustSymbolProvider, private val writer: RustWriter, private val shape: StructureShape, private val customizations: List, + private val structSettings: StructSettings, ) { companion object { /** Reserved struct member names */ @@ -82,32 +88,16 @@ open class StructureGenerator( renderStructure() } - /** - * Search for lifetimes used by the members of the struct and generate a declaration. - * e.g. `<'a, 'b>` - */ - private fun lifetimeDeclaration(): String { - val lifetimes = members - .map { symbolProvider.toSymbol(it).rustType() } - .mapNotNull { - when (it) { - is RustType.Reference -> it.lifetime - else -> null - } - }.toSet().sorted() - return if (lifetimes.isNotEmpty()) { - "<${lifetimes.joinToString { "'$it" }}>" - } else { - "" - } - } - /** * Render a custom debug implementation * When [SensitiveTrait] support is required, render a custom debug implementation to redact sensitive data */ private fun renderDebugImpl() { - writer.rustBlock("impl ${lifetimeDeclaration()} #T for $name ${lifetimeDeclaration()}", RuntimeType.Debug) { + val lifetime = shape.lifetimeDeclaration(symbolProvider) + writer.rustBlock( + "impl ${shape.lifetimeDeclaration(symbolProvider)} #T for $name $lifetime", + RuntimeType.Debug, + ) { writer.rustBlock("fn fmt(&self, f: &mut #1T::Formatter<'_>) -> #1T::Result", RuntimeType.stdFmt) { rust("""let mut formatter = f.debug_struct(${name.dq()});""") members.forEach { member -> @@ -128,18 +118,36 @@ open class StructureGenerator( if (accessorMembers.isEmpty()) { return } - writer.rustBlock("impl $name") { + writer.rustBlock( + "impl ${shape.lifetimeDeclaration(symbolProvider)} $name ${ + shape.lifetimeDeclaration( + symbolProvider, + ) + }", + ) { // Render field accessor methods forEachMember(accessorMembers) { member, memberName, memberSymbol -> - writer.renderMemberDoc(member, memberSymbol) - writer.deprecatedShape(member) val memberType = memberSymbol.rustType() + var unwrapOrDefault = false val returnType = when { + // Automatically flatten vecs + structSettings.flattenVecAccessors && memberType is RustType.Option && memberType.stripOuter() is RustType.Vec -> { + unwrapOrDefault = true + memberType.stripOuter().asDeref().asRef() + } + memberType.isCopy() -> memberType memberType is RustType.Option && memberType.member.isDeref() -> memberType.asDeref() memberType.isDeref() -> memberType.asDeref().asRef() else -> memberType.asRef() } + writer.renderMemberDoc(member, memberSymbol) + if (unwrapOrDefault) { + // Add a newline + writer.docs("") + writer.docs("If no value was sent for this field, a default will be set. If you want to determine if no value was sent, use `.$memberName.is_none()`.") + } + writer.deprecatedShape(member) writer.rustBlock("pub fn $memberName(&self) -> ${returnType.render()}") { when { memberType.isCopy() -> rust("self.$memberName") @@ -148,6 +156,9 @@ open class StructureGenerator( memberType.isDeref() -> rust("use std::ops::Deref; self.$memberName.deref()") else -> rust("&self.$memberName") } + if (unwrapOrDefault) { + rust(".unwrap_or_default()") + } } } } @@ -167,7 +178,7 @@ open class StructureGenerator( writer.deprecatedShape(shape) containerMeta.render(writer) - writer.rustBlock("struct $name ${lifetimeDeclaration()}") { + writer.rustBlock("struct $name ${shape.lifetimeDeclaration(symbolProvider)}") { writer.forEachMember(members) { member, memberName, memberSymbol -> renderStructureMember(writer, member, memberName, memberSymbol) } @@ -202,3 +213,19 @@ open class StructureGenerator( ) } } + +/** + * Search for lifetimes used by the members of the struct and generate a declaration. + * e.g. `<'a, 'b>` + */ +fun StructureShape.lifetimeDeclaration(symbolProvider: RustSymbolProvider): String { + val lifetimes = this.members() + .mapNotNull { symbolProvider.toSymbol(it).rustType().innerReference()?.let { it as RustType.Reference } } + .mapNotNull { it.lifetime } + .toSet().sorted() + return if (lifetimes.isNotEmpty()) { + "<${lifetimes.joinToString { "'$it" }}>" + } else { + "" + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt index 3f7927d7281..93bea4c0101 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt @@ -109,7 +109,6 @@ open class UnionGenerator( private fun renderImplBlock(unionSymbol: Symbol) { writer.rustBlock("impl ${unionSymbol.name}") { sortedMembers.forEach { member -> - val memberSymbol = symbolProvider.toSymbol(member) val funcNamePart = member.memberName.toSnakeCase() val variantName = symbolProvider.toMemberName(member) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt index 7268dfd12a2..8ebf6082c86 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt @@ -38,9 +38,11 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock +import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section import software.amazon.smithy.rust.codegen.core.smithy.generators.OperationBuildError @@ -126,7 +128,6 @@ class HttpBindingGenerator( private val index = HttpBindingIndex.of(model) private val headerUtil = RuntimeType.smithyHttp(runtimeConfig).resolve("header") private val defaultTimestampFormat = TimestampFormatTrait.Format.EPOCH_SECONDS - private val dateTime = RuntimeType.dateTime(runtimeConfig).toSymbol().rustType() private val protocolFunctions = ProtocolFunctions(codegenContext) /** @@ -145,13 +146,14 @@ class HttpBindingGenerator( check(binding.location == HttpLocation.HEADER) val outputT = symbolProvider.toSymbol(binding.member).makeOptional() return protocolFunctions.deserializeFn(binding.member, fnNameSuffix = "header") { fnName -> - rustBlock( - "pub(crate) fn $fnName(header_map: &#T::HeaderMap) -> std::result::Result<#T, #T::ParseError>", - RuntimeType.Http, - outputT, - headerUtil, + rustBlockTemplate( + "pub(crate) fn $fnName(header_map: &#{Headers}) -> #{Result}<#{Output}, #{header_util}::ParseError>", + *preludeScope, + "Headers" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("http::Headers"), + "Output" to outputT, + "header_util" to headerUtil, ) { - rust("let headers = header_map.get_all(${binding.locationName.dq()}).iter();") + rust("let headers = header_map.get_all(${binding.locationName.dq()});") deserializeFromHeader(model.expectShape(binding.member.target), binding.member) } } @@ -163,30 +165,33 @@ class HttpBindingGenerator( val target = model.expectShape(binding.member.target) check(target is MapShape) val inner = protocolFunctions.deserializeFn(binding.member, fnNameSuffix = "inner") { fnName -> - rustBlock( - "pub fn $fnName(headers: #T::header::ValueIter) -> std::result::Result, #T::ParseError>", - RuntimeType.Http, - symbolProvider.toSymbol(model.expectShape(target.value.target)), - headerUtil, + rustBlockTemplate( + "pub fn $fnName<'a>(headers: impl #{Iterator}) -> std::result::Result, #{header_util}::ParseError>", + *preludeScope, + "Value" to symbolProvider.toSymbol(model.expectShape(target.value.target)), + "header_util" to headerUtil, ) { deserializeFromHeader(model.expectShape(target.value.target), binding.member) } } val returnTypeSymbol = outputSymbol.mapRustType { it.asOptional() } return protocolFunctions.deserializeFn(binding.member, fnNameSuffix = "prefix_header") { fnName -> - rustBlock( - "pub(crate) fn $fnName(header_map: &#T::HeaderMap) -> std::result::Result<#T, #T::ParseError>", - RuntimeType.Http, - returnTypeSymbol, - headerUtil, + rustBlockTemplate( + "pub(crate) fn $fnName(header_map: &#{Headers}) -> std::result::Result<#{Value}, #{header_util}::ParseError>", + "Headers" to RuntimeType.headers(runtimeConfig), + "Value" to returnTypeSymbol, + "header_util" to headerUtil, ) { rust( """ - let headers = #T::headers_for_prefix(header_map, ${binding.locationName.dq()}); + let headers = #T::headers_for_prefix( + header_map.iter().map(|(k, _)| k), + ${binding.locationName.dq()} + ); let out: std::result::Result<_, _> = headers.map(|(key, header_name)| { let values = header_map.get_all(header_name); - #T(values.iter()).map(|v| (key.to_string(), v.expect( - "we have checked there is at least one value for this header name; please file a bug report under https://github.com/awslabs/smithy-rs/issues" + #T(values).map(|v| (key.to_string(), v.expect( + "we have checked there is at least one value for this header name; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues" ))) }).collect(); """, @@ -254,15 +259,25 @@ class HttpBindingGenerator( operationShape, targetShape, ).render() - val receiver = outputT.rustType().qualifiedName() rustTemplate( """ let unmarshaller = #{unmarshallerConstructorFn}(); let body = std::mem::replace(body, #{SdkBody}::taken()); - Ok($receiver::new(unmarshaller, body)) + Ok(#{receiver:W}) """, "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "unmarshallerConstructorFn" to unmarshallerConstructorFn, + "receiver" to writable { + if (codegenTarget == CodegenTarget.SERVER) { + rust("${outputT.rustType().qualifiedName()}::new(unmarshaller, body)") + } else { + rustTemplate( + "#{EventReceiver}::new(#{Receiver}::new(unmarshaller, body))", + "EventReceiver" to RuntimeType.eventReceiver(runtimeConfig), + "Receiver" to RuntimeType.eventStreamReceiver(runtimeConfig), + ) + } + }, ) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt index 0a534225522..06b479506c1 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt @@ -50,11 +50,11 @@ class AwsJsonHttpBindingResolver( private fun bindings(shape: ToShapeId): List { val members = shape.let { model.expectShape(it.toShapeId()) }.members() - // TODO(https://github.com/awslabs/smithy-rs/issues/2237): support non-streaming members too + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2237): support non-streaming members too if (members.size > 1 && members.any { it.isStreaming(model) }) { throw CodegenException( "We only support one payload member if that payload contains a streaming member." + - "Tracking issue to relax this constraint: https://github.com/awslabs/smithy-rs/issues/2237", + "Tracking issue to relax this constraint: https://github.com/smithy-lang/smithy-rs/issues/2237", ) } @@ -127,7 +127,7 @@ open class AwsJson( private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.Http.resolve("HeaderMap"), + "Headers" to RuntimeType.headers(runtimeConfig), "JsonError" to CargoDependency.smithyJson(runtimeConfig).toType() .resolve("deserialize::error::DeserializeError"), "json_errors" to RuntimeType.jsonErrors(runtimeConfig), @@ -157,7 +157,7 @@ open class AwsJson( ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustTemplate( """ - pub fn $fnName(_response_status: u16, response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { + pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { #{json_errors}::parse_error_metadata(response_body, response_headers) } """, @@ -171,7 +171,7 @@ open class AwsJson( """ pub fn $fnName(payload: &#{Bytes}) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { // Note: HeaderMap::new() doesn't allocate - #{json_errors}::parse_error_metadata(payload, &#{HeaderMap}::new()) + #{json_errors}::parse_error_metadata(payload, &#{Headers}::new()) } """, *errorScope, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt index 934b703ebae..da7ccd1ad12 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt @@ -42,8 +42,7 @@ class AwsQueryProtocol(private val codegenContext: CodegenContext) : Protocol { private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, - "Response" to RuntimeType.HttpResponse, + "Headers" to RuntimeType.headers(runtimeConfig), "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"), ) @@ -60,7 +59,7 @@ class AwsQueryProtocol(private val codegenContext: CodegenContext) : Protocol { override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType = ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", *errorScope, ) { rust("#T::parse_error_metadata(response_body)", awsQueryErrors) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt index 489f1de5827..61861a369a7 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt @@ -49,7 +49,7 @@ class AwsQueryCompatible( private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, + "Headers" to RuntimeType.headers(runtimeConfig), "JsonError" to CargoDependency.smithyJson(runtimeConfig).toType() .resolve("deserialize::error::DeserializeError"), "aws_query_compatible_errors" to RuntimeType.awsQueryCompatibleErrors(runtimeConfig), @@ -74,7 +74,7 @@ class AwsQueryCompatible( ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustTemplate( """ - pub fn $fnName(_response_status: u16, response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { + pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { let mut builder = #{json_errors}::parse_error_metadata(response_body, response_headers)?; if let Some((error_code, error_type)) = @@ -92,4 +92,7 @@ class AwsQueryCompatible( override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType = awsJson.parseEventStreamErrorMetadata(operationShape) + + override fun additionalRequestHeaders(operationShape: OperationShape): List> = + listOf("x-amz-target" to "${codegenContext.serviceShape.id.name}.${operationShape.id.name}") } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt index 215865f4cb5..691736780b9 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt @@ -24,8 +24,7 @@ class Ec2QueryProtocol(private val codegenContext: CodegenContext) : Protocol { private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, - "Response" to RuntimeType.HttpResponse, + "Headers" to RuntimeType.headers(runtimeConfig), "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"), ) @@ -51,7 +50,7 @@ class Ec2QueryProtocol(private val codegenContext: CodegenContext) : Protocol { override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType = ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", *errorScope, ) { rust("#T::parse_error_metadata(response_body)", ec2QueryErrors) @@ -59,7 +58,7 @@ class Ec2QueryProtocol(private val codegenContext: CodegenContext) : Protocol { } override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType = - ProtocolFunctions.crossOperationFn("parse_event_stream_error_metadata") { fnName -> + ProtocolFunctions.crossOperationFn("parse_event_stream_error_metadata") { rustBlockTemplate( "pub fn parse_event_stream_error_metadata(payload: &#{Bytes}) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", *errorScope, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt index 2c6ffc662ce..5b1d9df988a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt @@ -78,6 +78,7 @@ class HttpBoundProtocolPayloadGenerator( val (shape, payloadMemberName) = when (httpMessageType) { HttpMessageType.RESPONSE -> operationShape.outputShape(model) to httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + HttpMessageType.REQUEST -> operationShape.inputShape(model) to httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName } @@ -97,6 +98,7 @@ class HttpBoundProtocolPayloadGenerator( is DocumentShape, is StructureShape, is UnionShape -> ProtocolPayloadGenerator.PayloadMetadata( takesOwnership = false, ) + is StringShape, is BlobShape -> ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = true) else -> UNREACHABLE("Unexpected payload target type: $type") } @@ -110,8 +112,19 @@ class HttpBoundProtocolPayloadGenerator( additionalPayloadContext: AdditionalPayloadContext, ) { when (httpMessageType) { - HttpMessageType.RESPONSE -> generateResponsePayload(writer, shapeName, operationShape, additionalPayloadContext) - HttpMessageType.REQUEST -> generateRequestPayload(writer, shapeName, operationShape, additionalPayloadContext) + HttpMessageType.RESPONSE -> generateResponsePayload( + writer, + shapeName, + operationShape, + additionalPayloadContext, + ) + + HttpMessageType.REQUEST -> generateRequestPayload( + writer, + shapeName, + operationShape, + additionalPayloadContext, + ) } } @@ -119,13 +132,20 @@ class HttpBoundProtocolPayloadGenerator( writer: RustWriter, shapeName: String, operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext, ) { - val payloadMemberName = httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + val payloadMemberName = + httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName if (payloadMemberName == null) { val serializerGenerator = protocol.structuredDataSerializer() generateStructureSerializer(writer, shapeName, serializerGenerator.operationInputSerializer(operationShape)) } else { - generatePayloadMemberSerializer(writer, shapeName, operationShape, payloadMemberName, additionalPayloadContext) + generatePayloadMemberSerializer( + writer, + shapeName, + operationShape, + payloadMemberName, + additionalPayloadContext, + ) } } @@ -133,13 +153,24 @@ class HttpBoundProtocolPayloadGenerator( writer: RustWriter, shapeName: String, operationShape: OperationShape, additionalPayloadContext: AdditionalPayloadContext, ) { - val payloadMemberName = httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName + val payloadMemberName = + httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName if (payloadMemberName == null) { val serializerGenerator = protocol.structuredDataSerializer() - generateStructureSerializer(writer, shapeName, serializerGenerator.operationOutputSerializer(operationShape)) + generateStructureSerializer( + writer, + shapeName, + serializerGenerator.operationOutputSerializer(operationShape), + ) } else { - generatePayloadMemberSerializer(writer, shapeName, operationShape, payloadMemberName, additionalPayloadContext) + generatePayloadMemberSerializer( + writer, + shapeName, + operationShape, + payloadMemberName, + additionalPayloadContext, + ) } } @@ -152,16 +183,24 @@ class HttpBoundProtocolPayloadGenerator( ) { val serializerGenerator = protocol.structuredDataSerializer() - if (operationShape.isEventStream(model)) { - if (operationShape.isInputEventStream(model) && target == CodegenTarget.CLIENT) { - val payloadMember = operationShape.inputShape(model).expectMember(payloadMemberName) - writer.serializeViaEventStream(operationShape, payloadMember, serializerGenerator, shapeName, additionalPayloadContext) - } else if (operationShape.isOutputEventStream(model) && target == CodegenTarget.SERVER) { - val payloadMember = operationShape.outputShape(model).expectMember(payloadMemberName) - writer.serializeViaEventStream(operationShape, payloadMember, serializerGenerator, "output", additionalPayloadContext) - } else { - throw CodegenException("Payload serializer for event streams with an invalid configuration") - } + if (operationShape.isInputEventStream(model) && target == CodegenTarget.CLIENT) { + val payloadMember = operationShape.inputShape(model).expectMember(payloadMemberName) + writer.serializeViaEventStream( + operationShape, + payloadMember, + serializerGenerator, + shapeName, + additionalPayloadContext, + ) + } else if (operationShape.isOutputEventStream(model) && target == CodegenTarget.SERVER) { + val payloadMember = operationShape.outputShape(model).expectMember(payloadMemberName) + writer.serializeViaEventStream( + operationShape, + payloadMember, + serializerGenerator, + "output", + additionalPayloadContext, + ) } else { val bodyMetadata = payloadMetadata(operationShape) val payloadMember = when (httpMessageType) { @@ -268,8 +307,9 @@ class HttpBoundProtocolPayloadGenerator( Vec::new() """, ) + is StructureShape -> rust("#T()", serializerGenerator.unsetStructure(targetShape)) - is UnionShape -> throw CodegenException("Currently unsupported. Tracking issue: https://github.com/awslabs/smithy-rs/issues/1896") + is UnionShape -> rust("#T()", serializerGenerator.unsetUnion(targetShape)) else -> throw CodegenException("`httpPayload` on member shapes targeting shapes of type ${targetShape.type} is unsupported") } } @@ -310,6 +350,7 @@ class HttpBoundProtocolPayloadGenerator( rust("$payloadName.into_inner()") } } + is StructureShape, is UnionShape -> { check( !((targetShape as? UnionShape)?.isEventStream() ?: false), @@ -320,12 +361,14 @@ class HttpBoundProtocolPayloadGenerator( serializer.payloadSerializer(member), ) } + is DocumentShape -> { rust( "#T($payloadName)", serializer.documentSerializer(), ) } + else -> PANIC("Unexpected payload target type: $targetShape") } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt index 682b36a8ad8..c468fdca0bc 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt @@ -18,6 +18,10 @@ import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.contextName +import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait +import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait +import software.amazon.smithy.rust.codegen.core.util.hasTrait +import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.toSnakeCase /** @@ -138,11 +142,14 @@ internal fun RustSymbolProvider.shapeModuleName(serviceShape: ServiceShape?, sha ) /** Creates a unique name for a ser/de function. */ -internal fun RustSymbolProvider.shapeFunctionName(serviceShape: ServiceShape?, shape: Shape): String { +fun RustSymbolProvider.shapeFunctionName(serviceShape: ServiceShape?, shape: Shape): String { + val extras = "".letIf(shape.hasTrait()) { + it + "_output" + }.letIf(shape.hasTrait()) { it + "_input" } val containerName = when (shape) { is MemberShape -> model.expectShape(shape.container).contextName(serviceShape).toSnakeCase() else -> shape.contextName(serviceShape).toSnakeCase() - } + } + extras return when (shape) { is MemberShape -> shape.memberName.toSnakeCase() is DocumentShape -> "document" diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt index 9a3d12a9932..3e08ceca8e2 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt @@ -64,10 +64,9 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.Http.resolve("HeaderMap"), + "Headers" to RuntimeType.headers(runtimeConfig), "JsonError" to CargoDependency.smithyJson(runtimeConfig).toType() .resolve("deserialize::error::DeserializeError"), - "Response" to RuntimeType.Http.resolve("Response"), "json_errors" to RuntimeType.jsonErrors(runtimeConfig), ) @@ -80,14 +79,19 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { * RestJson1 implementations can denote errors in responses in several ways. * New server-side protocol implementations MUST use a header field named `X-Amzn-Errortype`. * - * Note that the spec says that implementations SHOULD strip the error shape ID's namespace. - * However, our server implementation renders the full shape ID (including namespace), since some - * existing clients rely on it to deserialize the error shape and fail if only the shape name is present. - * This is compliant with the spec, see https://github.com/awslabs/smithy/pull/1493. - * See https://github.com/awslabs/smithy/issues/1494 too. + * Note that the spec says that implementations SHOULD strip the error shape ID's namespace + * (see https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization): + * + * > The value of this component SHOULD contain only the shape name of the error's Shape ID. + * + * But it's a SHOULD; we could strip the namespace if we wanted to. In fact, we did so in smithy-rs versions + * 0.52.0 to 0.55.4; see: + * - https://github.com/smithy-lang/smithy-rs/pull/1982 + * - https://github.com/awslabs/smithy/pull/1493 + * - https://github.com/awslabs/smithy/issues/1494 */ override fun additionalErrorResponseHeaders(errorShape: StructureShape): List> = - listOf("x-amzn-errortype" to errorShape.id.toString()) + listOf("x-amzn-errortype" to errorShape.id.name) override fun structuredDataParser(): StructuredDataParserGenerator = JsonParserGenerator(codegenContext, httpBindingResolver, ::restJsonFieldName) @@ -99,7 +103,7 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustTemplate( """ - pub fn $fnName(_response_status: u16, response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { + pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { #{json_errors}::parse_error_metadata(response_body, response_headers) } """, @@ -113,7 +117,7 @@ open class RestJson(val codegenContext: CodegenContext) : Protocol { """ pub fn $fnName(payload: &#{Bytes}) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> { // Note: HeaderMap::new() doesn't allocate - #{json_errors}::parse_error_metadata(payload, &#{HeaderMap}::new()) + #{json_errors}::parse_error_metadata(payload, &#{Headers}::new()) } """, *errorScope, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt index 41df9fd52d6..15d294c0356 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt @@ -24,8 +24,7 @@ open class RestXml(val codegenContext: CodegenContext) : Protocol { private val errorScope = arrayOf( "Bytes" to RuntimeType.Bytes, "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig), - "HeaderMap" to RuntimeType.HttpHeaderMap, - "Response" to RuntimeType.HttpResponse, + "Headers" to RuntimeType.headers(runtimeConfig), "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"), ) @@ -49,7 +48,7 @@ open class RestXml(val codegenContext: CodegenContext) : Protocol { override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType = ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName -> rustBlockTemplate( - "pub fn $fnName(_response_status: u16, _response_headers: &#{HeaderMap}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", + "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>", *errorScope, ) { rust("#T::parse_error_metadata(response_body)", restXmlErrors) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt index 6b706a1e098..47aadd368d3 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt @@ -53,6 +53,7 @@ class EventStreamUnmarshallerGenerator( private val unionShape: UnionShape, ) { private val model = codegenContext.model + private val builderInstantiator = codegenContext.builderInstantiator() private val symbolProvider = codegenContext.symbolProvider private val codegenTarget = codegenContext.target private val runtimeConfig = codegenContext.runtimeConfig @@ -63,14 +64,15 @@ class EventStreamUnmarshallerGenerator( symbolProvider.symbolForEventStreamError(unionShape) } private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig) + private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) private val eventStreamSerdeModule = RustModule.eventStreamSerdeModule() private val codegenScope = arrayOf( "Blob" to RuntimeType.blob(runtimeConfig), "expect_fns" to smithyEventStream.resolve("smithy"), "MarshallMessage" to smithyEventStream.resolve("frame::MarshallMessage"), - "Message" to smithyEventStream.resolve("frame::Message"), - "Header" to smithyEventStream.resolve("frame::Header"), - "HeaderValue" to smithyEventStream.resolve("frame::HeaderValue"), + "Message" to smithyTypes.resolve("event_stream::Message"), + "Header" to smithyTypes.resolve("event_stream::Header"), + "HeaderValue" to smithyTypes.resolve("event_stream::HeaderValue"), "Error" to smithyEventStream.resolve("error::Error"), "OpError" to errorSymbol, "SmithyError" to RuntimeType.smithyTypes(runtimeConfig).resolve("Error"), @@ -339,6 +341,7 @@ class EventStreamUnmarshallerGenerator( // TODO(EventStream): Errors on the operation can be disjoint with errors in the union, // so we need to generate a new top-level Error type for each event stream union. when (codegenTarget) { + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1970) It should be possible to unify these branches now CodegenTarget.CLIENT -> { val target = model.expectShape(member.target, StructureShape::class.java) val parser = protocol.structuredDataParser().errorParser(target) @@ -352,9 +355,19 @@ class EventStreamUnmarshallerGenerator( })?; builder.set_meta(Some(generic)); return Ok(#{UnmarshalledMessage}::Error( - #{OpError}::${member.target.name}(builder.build()) + #{OpError}::${member.target.name}( + #{build} + ) )) """, + "build" to builderInstantiator.finalizeBuilder( + "builder", target, + mapErr = { + rustTemplate( + """|err|#{Error}::unmarshalling(format!("{}", err))""", *codegenScope, + ) + }, + ), "parser" to parser, *codegenScope, ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt index 01c2b64e6a2..6b0a7b507bd 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt @@ -59,13 +59,16 @@ import software.amazon.smithy.utils.StringUtils * Class describing a JSON parser section that can be used in a customization. */ sealed class JsonParserSection(name: String) : Section(name) { - data class BeforeBoxingDeserializedMember(val shape: MemberShape) : JsonParserSection("BeforeBoxingDeserializedMember") + data class BeforeBoxingDeserializedMember(val shape: MemberShape) : + JsonParserSection("BeforeBoxingDeserializedMember") - data class AfterTimestampDeserializedMember(val shape: MemberShape) : JsonParserSection("AfterTimestampDeserializedMember") + data class AfterTimestampDeserializedMember(val shape: MemberShape) : + JsonParserSection("AfterTimestampDeserializedMember") data class AfterBlobDeserializedMember(val shape: MemberShape) : JsonParserSection("AfterBlobDeserializedMember") - data class AfterDocumentDeserializedMember(val shape: MemberShape) : JsonParserSection("AfterDocumentDeserializedMember") + data class AfterDocumentDeserializedMember(val shape: MemberShape) : + JsonParserSection("AfterDocumentDeserializedMember") } /** @@ -100,6 +103,7 @@ class JsonParserGenerator( private val codegenTarget = codegenContext.target private val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType() private val protocolFunctions = ProtocolFunctions(codegenContext) + private val builderInstantiator = codegenContext.builderInstantiator() private val codegenScope = arrayOf( "Error" to smithyJson.resolve("deserialize::error::DeserializeError"), "expect_blob_or_null" to smithyJson.resolve("deserialize::token::expect_blob_or_null"), @@ -251,6 +255,7 @@ class JsonParserGenerator( deserializeMember(member) } } + CodegenTarget.SERVER -> { if (symbolProvider.toSymbol(member).isOptional()) { withBlock("builder = builder.${member.setterName()}(", ");") { @@ -282,7 +287,7 @@ class JsonParserGenerator( is BooleanShape -> rustTemplate("#{expect_bool_or_null}(tokens.next())?", *codegenScope) is NumberShape -> deserializeNumber(target) is BlobShape -> deserializeBlob(memberShape) - is TimestampShape -> deserializeTimestamp(target, memberShape) + is TimestampShape -> deserializeTimestamp(memberShape) is CollectionShape -> deserializeCollection(target) is MapShape -> deserializeMap(target) is StructureShape -> deserializeStruct(target) @@ -356,7 +361,7 @@ class JsonParserGenerator( } } - private fun RustWriter.deserializeTimestamp(shape: TimestampShape, member: MemberShape) { + private fun RustWriter.deserializeTimestamp(member: MemberShape) { val timestampFormat = httpBindingResolver.timestampFormat( member, HttpLocation.DOCUMENT, @@ -508,12 +513,14 @@ class JsonParserGenerator( "Builder" to symbolProvider.symbolForBuilder(shape), ) deserializeStructInner(shape.members()) - // Only call `build()` if the builder is not fallible. Otherwise, return the builder. - if (returnSymbolToParse.isUnconstrained) { - rust("Ok(Some(builder))") - } else { - rust("Ok(Some(builder.build()))") + val builder = builderInstantiator.finalizeBuilder( + "builder", shape, + ) { + rustTemplate( + """|err|#{Error}::custom_source("Response was invalid", err)""", *codegenScope, + ) } + rust("Ok(Some(#T))", builder) } } } @@ -544,13 +551,18 @@ class JsonParserGenerator( objectKeyLoop(hasMembers = shape.members().isNotEmpty()) { rustTemplate( """ + let key = key.to_unescaped()?; + if key == "__type" { + #{skip_value}(tokens)?; + continue + } if variant.is_some() { return Err(#{Error}::custom("encountered mixed variants in union")); } """, *codegenScope, ) - withBlock("variant = match key.to_unescaped()?.as_ref() {", "};") { + withBlock("variant = match key.as_ref() {", "};") { for (member in shape.members()) { val variantName = symbolProvider.toMemberName(member) rustBlock("${jsonName(member).dq()} =>") { diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt index d083d0e901b..03caf527a89 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt @@ -39,7 +39,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType -import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant import software.amazon.smithy.rust.codegen.core.smithy.generators.setterName @@ -101,6 +100,7 @@ class XmlBindingTraitParserGenerator( private val runtimeConfig = codegenContext.runtimeConfig private val protocolFunctions = ProtocolFunctions(codegenContext) private val codegenTarget = codegenContext.target + private val builderInstantiator = codegenContext.builderInstantiator() // The symbols we want all the time private val codegenScope = arrayOf( @@ -159,6 +159,7 @@ class XmlBindingTraitParserGenerator( is StructureShape -> { parseStructure(shape, ctx) } + is UnionShape -> parseUnion(shape, ctx) } } @@ -294,7 +295,10 @@ class XmlBindingTraitParserGenerator( } rust("$builder = $builder.${member.setterName()}($temp);") } - rustTemplate("_ => return Err(#{XmlDecodeError}::custom(\"expected ${member.xmlName()} tag\"))", *codegenScope) + rustTemplate( + "_ => return Err(#{XmlDecodeError}::custom(\"expected ${member.xmlName()} tag\"))", + *codegenScope, + ) } } @@ -359,19 +363,23 @@ class XmlBindingTraitParserGenerator( parsePrimitiveInner(memberShape) { rustTemplate("#{try_data}(&mut ${ctx.tag})?.as_ref()", *codegenScope) } + is MapShape -> if (memberShape.isFlattened()) { parseFlatMap(target, ctx) } else { parseMap(target, ctx) } + is CollectionShape -> if (memberShape.isFlattened()) { parseFlatList(target, ctx) } else { parseList(target, ctx) } + is StructureShape -> { parseStructure(target, ctx) } + is UnionShape -> parseUnion(target, ctx) else -> PANIC("Unhandled: $target") } @@ -436,10 +444,16 @@ class XmlBindingTraitParserGenerator( } when (target.renderUnknownVariant()) { true -> rust("_unknown => base = Some(#T::${UnionGenerator.UnknownVariantName}),", symbol) - false -> rustTemplate("""variant => return Err(#{XmlDecodeError}::custom(format!("unexpected union variant: {:?}", variant)))""", *codegenScope) + false -> rustTemplate( + """variant => return Err(#{XmlDecodeError}::custom(format!("unexpected union variant: {:?}", variant)))""", + *codegenScope, + ) } } - rustTemplate("""base.ok_or_else(||#{XmlDecodeError}::custom("expected union, got nothing"))""", *codegenScope) + rustTemplate( + """base.ok_or_else(||#{XmlDecodeError}::custom("expected union, got nothing"))""", + *codegenScope, + ) } } rust("#T(&mut ${ctx.tag})", nestedParser) @@ -462,6 +476,7 @@ class XmlBindingTraitParserGenerator( private fun RustWriter.parseStructure(shape: StructureShape, ctx: Ctx) { val symbol = symbolProvider.toSymbol(shape) val nestedParser = protocolFunctions.deserializeFn(shape) { fnName -> + Attribute.AllowNeedlessQuestionMark.render(this) rustBlockTemplate( "pub fn $fnName(decoder: &mut #{ScopedDecoder}) -> Result<#{Shape}, #{XmlDecodeError}>", *codegenScope, "Shape" to symbol, @@ -474,17 +489,17 @@ class XmlBindingTraitParserGenerator( } else { rust("let _ = decoder;") } - withBlock("Ok(builder.build()", ")") { - if (BuilderGenerator.hasFallibleBuilder(shape, symbolProvider)) { - // NOTE:(rcoh) This branch is unreachable given the current nullability rules. - // Only synthetic inputs can have fallible builders, but synthetic inputs can never be parsed - // (because they're inputs, only outputs will be parsed!) - - // I'm leaving this branch here so that the binding trait parser generator would work for a server - // side implementation in the future. - rustTemplate(""".map_err(|_|#{XmlDecodeError}::custom("missing field"))?""", *codegenScope) - } - } + val builder = builderInstantiator.finalizeBuilder( + "builder", + shape, + mapErr = { + rustTemplate( + """|_|#{XmlDecodeError}::custom("missing field")""", + *codegenScope, + ) + }, + ) + rust("Ok(#T)", builder) } } rust("#T(&mut ${ctx.tag})", nestedParser) @@ -622,6 +637,7 @@ class XmlBindingTraitParserGenerator( ) } } + is TimestampShape -> { val timestampFormat = index.determineTimestampFormat( @@ -629,7 +645,8 @@ class XmlBindingTraitParserGenerator( HttpBinding.Location.DOCUMENT, TimestampFormatTrait.Format.DATE_TIME, ) - val timestampFormatType = RuntimeType.parseTimestampFormat(codegenTarget, runtimeConfig, timestampFormat) + val timestampFormatType = + RuntimeType.parseTimestampFormat(codegenTarget, runtimeConfig, timestampFormat) withBlock("#T::from_str(", ")", RuntimeType.dateTime(runtimeConfig)) { provider() rust(", #T", timestampFormatType) @@ -639,6 +656,7 @@ class XmlBindingTraitParserGenerator( *codegenScope, ) } + is BlobShape -> { withBlock("#T(", ")", RuntimeType.base64Decode(runtimeConfig)) { provider() @@ -648,6 +666,7 @@ class XmlBindingTraitParserGenerator( *codegenScope, ) } + else -> PANIC("unexpected shape: $shape") } } @@ -660,7 +679,10 @@ class XmlBindingTraitParserGenerator( withBlock("#T::try_from(", ")", enumSymbol) { provider() } - rustTemplate(""".map_err(|e| #{XmlDecodeError}::custom(format!("unknown variant {}", e)))?""", *codegenScope) + rustTemplate( + """.map_err(|e| #{XmlDecodeError}::custom(format!("unknown variant {}", e)))?""", + *codegenScope, + ) } else { withBlock("#T::from(", ")", enumSymbol) { provider() @@ -674,7 +696,8 @@ class XmlBindingTraitParserGenerator( } } - private fun convertsToEnumInServer(shape: StringShape) = target == CodegenTarget.SERVER && shape.hasTrait() + private fun convertsToEnumInServer(shape: StringShape) = + target == CodegenTarget.SERVER && shape.hasTrait() private fun MemberShape.xmlName(): XmlName { return XmlName(xmlIndex.memberName(this)) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt index 3a0c5c1b30b..b9491f29e8c 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt @@ -44,6 +44,7 @@ class EventStreamErrorMarshallerGenerator( payloadContentType: String, ) : EventStreamMarshallerGenerator(model, target, runtimeConfig, symbolProvider, unionShape, serializerGenerator, payloadContentType) { private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig) + private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) private val operationErrorSymbol = if (target == CodegenTarget.SERVER && unionShape.eventStreamErrors().isEmpty()) { RuntimeType.smithyHttp(runtimeConfig).resolve("event_stream::MessageStreamError").toSymbol() @@ -54,9 +55,9 @@ class EventStreamErrorMarshallerGenerator( private val errorsShape = unionShape.expectTrait() private val codegenScope = arrayOf( "MarshallMessage" to smithyEventStream.resolve("frame::MarshallMessage"), - "Message" to smithyEventStream.resolve("frame::Message"), - "Header" to smithyEventStream.resolve("frame::Header"), - "HeaderValue" to smithyEventStream.resolve("frame::HeaderValue"), + "Message" to smithyTypes.resolve("event_stream::Message"), + "Header" to smithyTypes.resolve("event_stream::Header"), + "HeaderValue" to smithyTypes.resolve("event_stream::HeaderValue"), "Error" to smithyEventStream.resolve("error::Error"), ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt index 201cd82ed5d..ac6cf88ccc2 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt @@ -54,12 +54,13 @@ open class EventStreamMarshallerGenerator( private val payloadContentType: String, ) { private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig) + private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig) private val eventStreamSerdeModule = RustModule.eventStreamSerdeModule() private val codegenScope = arrayOf( "MarshallMessage" to smithyEventStream.resolve("frame::MarshallMessage"), - "Message" to smithyEventStream.resolve("frame::Message"), - "Header" to smithyEventStream.resolve("frame::Header"), - "HeaderValue" to smithyEventStream.resolve("frame::HeaderValue"), + "Message" to smithyTypes.resolve("event_stream::Message"), + "Header" to smithyTypes.resolve("event_stream::Header"), + "HeaderValue" to smithyTypes.resolve("event_stream::HeaderValue"), "Error" to smithyEventStream.resolve("error::Error"), ) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt index 87562dc2ab6..981706b5665 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt @@ -36,6 +36,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section @@ -170,7 +171,7 @@ class JsonSerializerGenerator( private val runtimeConfig = codegenContext.runtimeConfig private val protocolFunctions = ProtocolFunctions(codegenContext) private val codegenScope = arrayOf( - "String" to RuntimeType.String, + *preludeScope, "Error" to runtimeConfig.serializationError(), "SdkBody" to RuntimeType.sdkBody(runtimeConfig), "JsonObjectWriter" to RuntimeType.smithyJson(runtimeConfig).resolve("serialize::JsonObjectWriter"), @@ -232,7 +233,7 @@ class JsonSerializerGenerator( } override fun unsetStructure(structure: StructureShape): RuntimeType = - ProtocolFunctions.crossOperationFn("rest_json_unsetpayload") { fnName -> + ProtocolFunctions.crossOperationFn("rest_json_unset_struct_payload") { fnName -> rustTemplate( """ pub fn $fnName() -> #{ByteSlab} { @@ -243,6 +244,14 @@ class JsonSerializerGenerator( ) } + override fun unsetUnion(union: UnionShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_json_unset_union_payload") { fnName -> + rustTemplate( + "pub fn $fnName() -> #{ByteSlab} { #{Vec}::new() }", + *codegenScope, + ) + } + override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? { // Don't generate an operation JSON serializer if there is no JSON body. val httpDocumentMembers = httpBindingResolver.requestMembers(operationShape, HttpLocation.DOCUMENT) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt index 974e112cde7..23c8bbb4fb8 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt @@ -5,6 +5,7 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.BlobShape import software.amazon.smithy.model.shapes.BooleanShape import software.amazon.smithy.model.shapes.CollectionShape @@ -44,13 +45,14 @@ import software.amazon.smithy.rust.codegen.core.util.inputShape import software.amazon.smithy.rust.codegen.core.util.isTargetUnit import software.amazon.smithy.rust.codegen.core.util.orNull -abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : StructuredDataSerializerGenerator { +abstract class QuerySerializerGenerator(private val codegenContext: CodegenContext) : StructuredDataSerializerGenerator { protected data class Context( /** Expression that yields a QueryValueWriter */ val writerExpression: String, /** Expression representing the value to write to the QueryValueWriter */ val valueExpression: ValueExpression, val shape: T, + val isOptional: Boolean = false, ) protected data class MemberContext( @@ -88,6 +90,7 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct protected val model = codegenContext.model protected val symbolProvider = codegenContext.symbolProvider protected val runtimeConfig = codegenContext.runtimeConfig + private val nullableIndex = NullableIndex(model) private val target = codegenContext.target private val serviceShape = codegenContext.serviceShape private val serializerError = runtimeConfig.serializationError() @@ -118,7 +121,11 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct } override fun unsetStructure(structure: StructureShape): RuntimeType { - TODO("AwsQuery doesn't support payload serialization") + TODO("$protocolName doesn't support payload serialization") + } + + override fun unsetUnion(union: UnionShape): RuntimeType { + TODO("$protocolName doesn't support payload serialization") } override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? { @@ -175,7 +182,8 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct rust("Ok(())") } } - rust("#T(${context.writerExpression}, ${context.valueExpression.name})?;", structureSerializer) + + rust("#T(${context.writerExpression}, ${context.valueExpression.asRef()})?;", structureSerializer) } private fun RustWriter.serializeStructureInner(context: Context) { @@ -212,9 +220,11 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct val writer = context.writerExpression val value = context.valueExpression when (target) { - is StringShape -> when (target.hasTrait()) { - true -> rust("$writer.string(${value.name}.as_str());") - false -> rust("$writer.string(${value.name});") + is StringShape -> { + when (target.hasTrait()) { + true -> rust("$writer.string(${value.name}.as_str());") + false -> rust("$writer.string(${value.asRef()});") + } } is BooleanShape -> rust("$writer.boolean(${value.asValue()});") is NumberShape -> { @@ -230,13 +240,13 @@ abstract class QuerySerializerGenerator(codegenContext: CodegenContext) : Struct ) } is BlobShape -> rust( - "$writer.string(&#T(${value.name}));", + "$writer.string(&#T(${value.asRef()}));", RuntimeType.base64Encode(runtimeConfig), ) is TimestampShape -> { val timestampFormat = determineTimestampFormat(context.shape) val timestampFormatType = RuntimeType.serializeTimestampFormat(runtimeConfig, timestampFormat) - rust("$writer.date_time(${value.name}, #T)?;", timestampFormatType) + rust("$writer.date_time(${value.asRef()}, #T)?;", timestampFormatType) } is CollectionShape -> serializeCollection(context, Context(writer, context.valueExpression, target)) is MapShape -> serializeMap(context, Context(writer, context.valueExpression, target)) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt index 78012b1d6d4..27293e43039 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt @@ -15,7 +15,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock class SerializerUtil(private val model: Model) { fun RustWriter.ignoreZeroValues(shape: MemberShape, value: ValueExpression, inner: Writable) { // Required shapes should always be serialized - // See https://github.com/awslabs/smithy-rs/issues/230 and https://github.com/aws/aws-sdk-go-v2/pull/1129 + // See https://github.com/smithy-lang/smithy-rs/issues/230 and https://github.com/aws/aws-sdk-go-v2/pull/1129 if ( shape.isRequired || // Zero values are always serialized in lists and collections, this only applies to structures diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt index 962b9c87201..92b28d89fcf 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt @@ -9,6 +9,7 @@ import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType interface StructuredDataSerializerGenerator { @@ -27,12 +28,22 @@ interface StructuredDataSerializerGenerator { * Generate the correct data when attempting to serialize a structure that is unset * * ```rust - * fn rest_json_unsetpayload() -> Vec { + * fn rest_json_unset_struct_payload() -> Vec { * ... * } */ fun unsetStructure(structure: StructureShape): RuntimeType + /** + * Generate the correct data when attempting to serialize a union that is unset + * + * ```rust + * fn rest_json_unset_union_payload() -> Vec { + * ... + * } + */ + fun unsetUnion(union: UnionShape): RuntimeType + /** * Generate a serializer for an operation input structure. * This serializer is only used by clients. diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt index 678768cfa70..fc4f0198387 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt @@ -35,6 +35,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.stripOuter import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant import software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError @@ -176,8 +177,8 @@ class XmlBindingTraitSerializerGenerator( } } - override fun unsetStructure(structure: StructureShape): RuntimeType { - return ProtocolFunctions.crossOperationFn("rest_xml_unset_payload") { fnName -> + override fun unsetStructure(structure: StructureShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_xml_unset_struct_payload") { fnName -> rustTemplate( """ pub fn $fnName() -> #{ByteSlab} { @@ -187,7 +188,15 @@ class XmlBindingTraitSerializerGenerator( "ByteSlab" to RuntimeType.ByteSlab, ) } - } + + override fun unsetUnion(union: UnionShape): RuntimeType = + ProtocolFunctions.crossOperationFn("rest_xml_unset_union_payload") { fnName -> + rustTemplate( + "pub fn $fnName() -> #{ByteSlab} { #{Vec}::new() }", + *preludeScope, + "ByteSlab" to RuntimeType.ByteSlab, + ) + } override fun operationOutputSerializer(operationShape: OperationShape): RuntimeType? { val outputShape = operationShape.outputShape(model) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt index 78a6852fd6b..241e0d44d14 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt @@ -10,9 +10,11 @@ import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.model.traits.InputTrait import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait +import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.orNull import software.amazon.smithy.rust.codegen.core.util.rename import java.util.Optional @@ -60,7 +62,7 @@ object OperationNormalizer { check( shapeConflict == null, ) { - "shape $shapeConflict conflicted with an existing shape in the model (${model.getShape(shapeConflict!!.id)}. This is a bug." + "shape $shapeConflict conflicted with an existing shape in the model (${model.expectShape(shapeConflict!!.id)}). This is a bug." } val modelWithOperationInputs = model.toBuilder().addShapes(newShapes).build() return transformer.mapShapes(modelWithOperationInputs) { @@ -106,6 +108,11 @@ object OperationNormalizer { val inputShapeBuilder = operation.input.map { shapeId -> model.expectShape(shapeId, StructureShape::class.java).toBuilder().rename(inputId) }.orElse(empty(inputId)) + // There are still shapes missing the input trait. If we don't apply this, we'll get bad results from the + // nullability index + if (!inputShapeBuilder.build().hasTrait()) { + inputShapeBuilder.addTrait(InputTrait()) + } return inputShapeBuilder.addTrait( SyntheticInputTrait( operation = operation.id, diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/BasicTestModels.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/BasicTestModels.kt new file mode 100644 index 00000000000..eb4829702ee --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/BasicTestModels.kt @@ -0,0 +1,23 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.testutil + +object BasicTestModels { + val AwsJson10TestModel = """ + namespace com.example + use aws.protocols#awsJson1_0 + @awsJson1_0 + service HelloService { + operations: [SayHello], + version: "1" + } + @optionalAuth + operation SayHello { input: TestInput } + structure TestInput { + foo: String, + } + """.asSmithyModel() +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt index d1f208c3931..19bd7ddf580 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.util.runCommand import java.io.File import java.nio.file.Path +import java.util.logging.Logger /** * A helper class holding common data with defaults that is threaded through several functions, to make their @@ -20,10 +21,12 @@ import java.nio.file.Path data class IntegrationTestParams( val addModuleToEventStreamAllowList: Boolean = false, val service: String? = null, + val moduleVersion: String = "1.0.0", val runtimeConfig: RuntimeConfig? = null, val additionalSettings: ObjectNode = ObjectNode.builder().build(), val overrideTestDir: File? = null, val command: ((Path) -> Unit)? = null, + val cargoCommand: String? = null, ) /** @@ -34,12 +37,18 @@ fun codegenIntegrationTest(model: Model, params: IntegrationTestParams, invokePl model, params.additionalSettings, params.addModuleToEventStreamAllowList, + params.moduleVersion, params.service, params.runtimeConfig, params.overrideTestDir, ) + + testDir.writeDotCargoConfigToml(listOf("--deny", "warnings")) + invokePlugin(ctx) ctx.fileManifest.printGeneratedFiles() - params.command?.invoke(testDir) ?: "cargo test".runCommand(testDir, environment = mapOf("RUSTFLAGS" to "-D warnings")) + val logger = Logger.getLogger("CodegenIntegrationTest") + val out = params.command?.invoke(testDir) ?: (params.cargoCommand ?: "cargo test --lib --tests").runCommand(testDir) + logger.fine(out.toString()) return testDir } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt new file mode 100644 index 00000000000..96af195c764 --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt @@ -0,0 +1,37 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.testutil + +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator + +/** + * A Default instantiator that uses `builder.build()` in all cases. This exists to support tests in codegen-core + * and to serve as the base behavior for client and server instantiators. + */ +class DefaultBuilderInstantiator(private val checkFallibleBuilder: Boolean, private val symbolProvider: RustSymbolProvider) : BuilderInstantiator { + override fun setField(builder: String, value: Writable, field: MemberShape): Writable { + return setFieldWithSetter(builder, value, field) + } + + override fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable?): Writable { + return writable { + rust("builder.build()") + if (checkFallibleBuilder && BuilderGenerator.hasFallibleBuilder(shape, symbolProvider)) { + if (mapErr != null) { + rust(".map_err(#T)", mapErr) + } + rust("?") + } + } + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt index 896e3c01025..2850f51c721 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt @@ -35,7 +35,8 @@ object EventStreamMarshallTestCases { val typesModule = codegenContext.symbolProvider.moduleForShape(codegenContext.model.lookup("test#TestStruct")) rustTemplate( """ - use aws_smithy_eventstream::frame::{Message, Header, HeaderValue, MarshallMessage}; + use aws_smithy_eventstream::frame::MarshallMessage; + use aws_smithy_types::event_stream::{Message, Header, HeaderValue}; use std::collections::HashMap; use aws_smithy_types::{Blob, DateTime}; use ${typesModule.fullyQualifiedPath()}::*; diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt index 215e7ad9de7..3adc813546a 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt @@ -28,7 +28,8 @@ object EventStreamUnmarshallTestCases { val typesModule = codegenContext.symbolProvider.moduleForShape(codegenContext.model.lookup("test#TestStruct")) rust( """ - use aws_smithy_eventstream::frame::{Header, HeaderValue, Message, UnmarshallMessage, UnmarshalledMessage}; + use aws_smithy_eventstream::frame::{UnmarshallMessage, UnmarshalledMessage}; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use aws_smithy_types::{Blob, DateTime}; use $testStreamError; use ${typesModule.fullyQualifiedPath()}::*; diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt index c45a7d09925..72979545b94 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.testutil import software.amazon.smithy.model.Model +import software.amazon.smithy.model.traits.Trait import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope object NamingObstacleCourseTestModels { @@ -169,4 +170,61 @@ object NamingObstacleCourseTestModels { """, ) }.toString().asSmithyModel() + + /** + * This targets two bug classes: + * - operation inputs used as nested outputs + * - operation outputs used as nested outputs + */ + fun reusedInputOutputShapesModel(protocol: Trait) = """ + namespace test + use ${protocol.toShapeId()} + use aws.api#service + @${protocol.toShapeId().name} + @service(sdkId: "test") + service Service { + version: "2006-03-01", + operations: [GetThing, ReuseGetThingIO] + } + + // re-use get thing output in a list & in an operation + @http(uri: "/SomeOperation2", method: "POST") + operation GetThing { + output: GetThingOutput + input: GetThingInput + } + + // an operation that re-uses the input and output shapes from `GetThing` above. this has caused issues in the + // past with operation/input shape confusion during function signature generation + @http(uri: "/SomeOperation3", method: "POST") + operation ReuseGetThingIO { + input: GetThingNested + output: GetThingNested + } + + structure GetThingOutput { + @required + meta: String + } + + structure GetThingInput { + @required + meta: String + } + + // nested structure which reuses input and output shapes internally + structure GetThingNested { + thingsOut: GetThingOutputList, + thingsIn: GetThingInputList, + thingOut: GetThingOutput, + thingIn: GetThingInput + } + + list GetThingOutputList { + member: GetThingOutput + } + list GetThingInputList { + member: GetThingInput + } + """.asSmithyModel() } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt index b40d5b8a062..db1f7fe4b5b 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt @@ -32,15 +32,19 @@ import software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider -import software.amazon.smithy.rust.codegen.core.util.CommandFailed -import software.amazon.smithy.rust.codegen.core.util.dq +import software.amazon.smithy.rust.codegen.core.smithy.generators.CargoTomlGenerator +import software.amazon.smithy.rust.codegen.core.smithy.mergeDependencyFeatures +import software.amazon.smithy.rust.codegen.core.smithy.mergeIdenticalTestDependencies +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.letIf import software.amazon.smithy.rust.codegen.core.util.orNullIfEmpty import software.amazon.smithy.rust.codegen.core.util.runCommand import java.io.File +import java.nio.file.Files import java.nio.file.Files.createTempDirectory import java.nio.file.Path import kotlin.io.path.absolutePathString +import kotlin.io.path.writeText val TestModuleDocProvider = object : ModuleDocProvider { override fun docsWriter(module: RustModule.LeafModule): Writable = writable { @@ -107,9 +111,9 @@ object TestWorkspace { ) newProject.resolve("rust-toolchain.toml").writeText( // help rust select the right version when we run cargo test - // TODO(https://github.com/awslabs/smithy-rs/issues/2048): load this from the msrv property using a + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2048): load this from the msrv property using a // method as we do for runtime crate versions - "[toolchain]\nchannel = \"1.68.2\"\n", + "[toolchain]\nchannel = \"1.70.0\"\n", ) // ensure there at least an empty lib.rs file to avoid broken crates newProject.resolve("src").mkdirs() @@ -160,6 +164,7 @@ fun generatePluginContext( model: Model, additionalSettings: ObjectNode = ObjectNode.builder().build(), addModuleToEventStreamAllowList: Boolean = false, + moduleVersion: String = "1.0.0", service: String? = null, runtimeConfig: RuntimeConfig? = null, overrideTestDir: File? = null, @@ -170,7 +175,7 @@ fun generatePluginContext( val manifest = FileManifest.create(testPath) var settingsBuilder = Node.objectNodeBuilder() .withMember("module", Node.from(moduleName)) - .withMember("moduleVersion", Node.from("1.0.0")) + .withMember("moduleVersion", Node.from(moduleVersion)) .withMember("moduleDescription", Node.from("test")) .withMember("moduleAuthors", Node.fromStrings("testgenerator@smithy.com")) .letIf(service != null) { it.withMember("service", service) } @@ -292,7 +297,7 @@ class TestWriterDelegator( } /** - * Generate a newtest module + * Generate a new test module * * This should only be used in test code—the generated module name will be something like `tests_123` */ @@ -338,14 +343,33 @@ fun TestWriterDelegator.compileAndTest( } catch (e: Exception) { // cargo fmt errors are useless, ignore } - val env = mapOf("RUSTFLAGS" to "-A dead_code") + + // Clean `RUSTFLAGS` because in CI we pass in `--deny warnings` and + // we still generate test code with warnings. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/3194) + val env = mapOf("RUSTFLAGS" to "") + baseDir.writeDotCargoConfigToml(listOf("--allow", "dead_code")) + val testOutput = "cargo test".runCommand(baseDir, env) if (runClippy) { - "cargo clippy".runCommand(baseDir, env) + "cargo clippy --all-features".runCommand(baseDir, env) } return testOutput } +fun Path.writeDotCargoConfigToml(rustFlags: List) { + val dotCargoDir = this.resolve(".cargo") + Files.createDirectory(dotCargoDir) + + dotCargoDir.resolve("config.toml") + .writeText( + """ + [build] + rustflags = [${rustFlags.joinToString(",") { "\"$it\"" }}] + """.trimIndent(), + ) +} + fun TestWriterDelegator.rustSettings() = testRustSettings( service = ShapeId.from("fake#Fake"), @@ -369,14 +393,19 @@ fun RustWriter.compileAndTest( clippy: Boolean = false, expectFailure: Boolean = false, ): String { - val deps = this.dependencies.map { RustDependency.fromSymbolDependency(it) }.filterIsInstance() + val deps = this.dependencies + .map { RustDependency.fromSymbolDependency(it) } + .filterIsInstance() + .distinct() + .mergeDependencyFeatures() + .mergeIdenticalTestDependencies() val module = if (this.namespace.contains("::")) { this.namespace.split("::")[1] } else { "lib" } val tempDir = this.toString() - .intoCrate(deps.toSet(), module = module, main = main, strict = clippy) + .intoCrate(deps, module = module, main = main, strict = clippy) val mainRs = tempDir.resolve("src/main.rs") val testModule = tempDir.resolve("src/$module.rs") try { @@ -389,7 +418,7 @@ fun RustWriter.compileAndTest( println("Test sources for debugging: file://${testModule.absolutePath}") } return testOutput - } catch (e: CommandFailed) { + } catch (e: CommandError) { if (!expectFailure) { println("Test sources for debugging: file://${testModule.absolutePath}") } @@ -398,23 +427,25 @@ fun RustWriter.compileAndTest( } private fun String.intoCrate( - deps: Set, + deps: List, module: String? = null, main: String = "", strict: Boolean = false, ): File { this.shouldParseAsRust() val tempDir = TestWorkspace.subproject() - val cargoToml = """ - [package] - name = ${tempDir.nameWithoutExtension.dq()} - version = "0.0.1" - authors = ["rcoh@amazon.com"] - edition = "2021" - - [dependencies] - ${deps.joinToString("\n") { it.toString() }} - """.trimIndent() + val cargoToml = RustWriter.toml("Cargo.toml").apply { + CargoTomlGenerator( + moduleName = tempDir.nameWithoutExtension, + moduleVersion = "0.0.1", + moduleAuthors = listOf("Testy McTesterson"), + moduleDescription = null, + moduleLicense = null, + moduleRepository = null, + writer = this, + dependencies = deps, + ).render() + }.toString() tempDir.resolve("Cargo.toml").writeText(cargoToml) tempDir.resolve("src").mkdirs() val mainRs = tempDir.resolve("src/main.rs") diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt index b80f211c766..cbd29d33d46 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt @@ -21,6 +21,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords import software.amazon.smithy.rust.codegen.core.rustlang.Visibility +import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.smithy.BaseSymbolMetadataProvider import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext @@ -36,6 +37,8 @@ import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.module import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait @@ -88,7 +91,11 @@ private object CodegenCoreTestModules { eventStream: UnionShape, ): RustModule.LeafModule = ErrorsTestModule - override fun moduleForBuilder(context: ModuleProviderContext, shape: Shape, symbol: Symbol): RustModule.LeafModule { + override fun moduleForBuilder( + context: ModuleProviderContext, + shape: Shape, + symbol: Symbol, + ): RustModule.LeafModule { val builderNamespace = RustReservedWords.escapeIfNeeded("test_" + symbol.name.toSnakeCase()) return RustModule.new( builderNamespace, @@ -100,10 +107,10 @@ private object CodegenCoreTestModules { } } -val TestRustSymbolProviderConfig = RustSymbolProviderConfig( +fun testRustSymbolProviderConfig(nullabilityCheckMode: NullableIndex.CheckMode) = RustSymbolProviderConfig( runtimeConfig = TestRuntimeConfig, renameExceptions = true, - nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_ZERO_VALUE_V1, + nullabilityCheckMode = nullabilityCheckMode, moduleProvider = CodegenCoreTestModules.TestModuleProvider, ) @@ -132,9 +139,17 @@ fun testRustSettings( ) private const val SmithyVersion = "1.0" -fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = SmithyVersion): Model { +fun String.asSmithyModel( + sourceLocation: String? = null, + smithyVersion: String = SmithyVersion, + disableValidation: Boolean = false, +): Model { val processed = letIf(!this.trimStart().startsWith("\$version")) { "\$version: ${smithyVersion.dq()}\n$it" } - return Model.assembler().discoverModels().addUnparsedModel(sourceLocation ?: "test.smithy", processed).assemble() + val assembler = Model.assembler().discoverModels().addUnparsedModel(sourceLocation ?: "test.smithy", processed) + if (disableValidation) { + assembler.disableValidation() + } + return assembler.assemble() .unwrap() } @@ -142,11 +157,12 @@ fun String.asSmithyModel(sourceLocation: String? = null, smithyVersion: String = internal fun testSymbolProvider( model: Model, rustReservedWordConfig: RustReservedWordConfig? = null, + nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT, ): RustSymbolProvider = SymbolVisitor( testRustSettings(), model, ServiceShape.builder().version("test").id("test#Service").build(), - TestRustSymbolProviderConfig, + testRustSymbolProviderConfig(nullabilityCheckMode), ).let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf(Attribute.NonExhaustive)) } .let { RustReservedWordSymbolProvider( @@ -161,9 +177,10 @@ internal fun testCodegenContext( serviceShape: ServiceShape? = null, settings: CoreRustSettings = testRustSettings(), codegenTarget: CodegenTarget = CodegenTarget.CLIENT, -): CodegenContext = CodegenContext( + nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT, +): CodegenContext = object : CodegenContext( model, - testSymbolProvider(model), + testSymbolProvider(model, nullabilityCheckMode = nullabilityCheckMode), TestModuleDocProvider, serviceShape ?: model.serviceShapes.firstOrNull() @@ -171,7 +188,11 @@ internal fun testCodegenContext( ShapeId.from("test#Protocol"), settings, codegenTarget, -) +) { + override fun builderInstantiator(): BuilderInstantiator { + return DefaultBuilderInstantiator(codegenTarget == CodegenTarget.CLIENT, symbolProvider) + } +} /** * In tests, we frequently need to generate a struct, a builder, and an impl block to access said builder. @@ -183,7 +204,7 @@ fun StructureShape.renderWithModelBuilder( ) { val struct = this rustCrate.withModule(symbolProvider.moduleForShape(struct)) { - StructureGenerator(model, symbolProvider, this, struct, emptyList()).render() + StructureGenerator(model, symbolProvider, this, struct, emptyList(), StructSettings(true)).render() implBlock(symbolProvider.toSymbol(struct)) { BuilderGenerator.renderConvenienceMethod(this, symbolProvider, struct) } @@ -192,3 +213,10 @@ fun StructureShape.renderWithModelBuilder( BuilderGenerator(model, symbolProvider, struct, emptyList()).render(this) } } + +fun RustCrate.unitTest(name: String? = null, test: Writable) { + lib { + val testName = name ?: safeName("test") + unitTest(testName, block = test) + } +} diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt index 7609e950a2c..64223fe5500 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt @@ -8,10 +8,14 @@ package software.amazon.smithy.rust.codegen.core.util import java.io.IOException import java.nio.file.Path import java.util.concurrent.TimeUnit +import java.util.logging.Logger -data class CommandFailed(val output: String) : Exception("Command Failed\n$output") +data class CommandError(val output: String) : Exception("Command Error\n$output") fun String.runCommand(workdir: Path? = null, environment: Map = mapOf(), timeout: Long = 3600): String { + val logger = Logger.getLogger("RunCommand") + logger.fine("Invoking comment $this in `$workdir` with env $environment") + val start = System.currentTimeMillis() val parts = this.split("\\s".toRegex()) val builder = ProcessBuilder(*parts.toTypedArray()) .redirectOutput(ProcessBuilder.Redirect.PIPE) @@ -30,13 +34,16 @@ fun String.runCommand(workdir: Path? = null, environment: Map = val output = "$stdErr\n$stdOut" return when (proc.exitValue()) { 0 -> output - else -> throw CommandFailed("Command Failed\n$output") + else -> throw CommandError("Command Error\n$output") } } catch (_: IllegalThreadStateException) { - throw CommandFailed("Timeout") + throw CommandError("Timeout") } catch (err: IOException) { - throw CommandFailed("$this was not a valid command.\n Hint: is everything installed?\n$err") + throw CommandError("$this was not a valid command.\n Hint: is everything installed?\n$err") } catch (other: Exception) { - throw CommandFailed("Unexpected exception thrown when executing subprocess:\n$other") + throw CommandError("Unexpected exception thrown when executing subprocess:\n$other") + } finally { + val end = System.currentTimeMillis() + logger.fine("command duration: ${end - start}ms") } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt index 9ac1b7004ce..d6668500280 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt @@ -8,20 +8,123 @@ package software.amazon.smithy.rust.codegen.core.util import software.amazon.smithy.utils.CaseUtils import software.amazon.smithy.utils.StringUtils -fun String.doubleQuote(): String = StringUtils.escapeJavaString(this, "").replace(Regex("""\\u([0-9a-f]{4})""")) { matchResult: MatchResult -> - "\\u{" + matchResult.groupValues[1] + "}" as CharSequence -} +fun String.doubleQuote(): String = + StringUtils.escapeJavaString(this, "").replace(Regex("""\\u([0-9a-f]{4})""")) { matchResult: MatchResult -> + "\\u{" + matchResult.groupValues[1] + "}" as CharSequence + } /** * Double quote a string, e.g. "abc" -> "\"abc\"" */ fun String.dq(): String = this.doubleQuote() -// String extensions +private val completeWords: List = listOf("ipv4", "ipv6", "sigv4", "mib", "gib", "kib", "ttl") + +private fun String.splitOnWordBoundaries(): List { + val out = mutableListOf() + // These are whole words but cased differently, e.g. `IPv4`, `MiB`, `GiB`, `TtL` + var currentWord = "" + + var completeWordInProgress = true + // emit the current word and update from the next character + val emit = { next: Char -> + completeWordInProgress = true + if (currentWord.isNotEmpty()) { + out += currentWord.lowercase() + } + currentWord = if (next.isLetterOrDigit()) { + next.toString() + } else { + "" + } + } + val allLowerCase = this.lowercase() == this + this.forEachIndexed { index, nextCharacter -> + val computeWordInProgress = { + val result = completeWordInProgress && currentWord.isNotEmpty() && completeWords.any { + it.startsWith(currentWord, ignoreCase = true) && (currentWord + this.substring(index)).startsWith( + it, + ignoreCase = true, + ) && !it.equals(currentWord, ignoreCase = true) + } + + completeWordInProgress = result + result + } + when { + // [C] in these docs indicates the value of nextCharacter + // A[_]B + !nextCharacter.isLetterOrDigit() -> emit(nextCharacter) + + // If we have no letters so far, push the next letter (we already know it's a letter or digit) + currentWord.isEmpty() -> currentWord += nextCharacter.toString() + + // Abc[D]ef or Ab2[D]ef + !computeWordInProgress() && loweredFollowedByUpper(currentWord, nextCharacter) -> emit(nextCharacter) + + // s3[k]ey + !computeWordInProgress() && allLowerCase && digitFollowedByLower(currentWord, nextCharacter) -> emit( + nextCharacter, + ) + + // DB[P]roxy, or `IAM[U]ser` but not AC[L]s + endOfAcronym(currentWord, nextCharacter, this.getOrNull(index + 1), this.getOrNull(index + 2)) -> emit(nextCharacter) + + // If we haven't found a word boundary, push it and keep going + else -> currentWord += nextCharacter.toString() + } + } + if (currentWord.isNotEmpty()) { + out += currentWord + } + return out +} + +/** + * Handle cases like `DB[P]roxy`, `ARN[S]upport`, `AC[L]s` + */ +private fun endOfAcronym(current: String, nextChar: Char, peek: Char?, doublePeek: Char?): Boolean { + if (!current.last().isUpperCase()) { + // Not an acronym in progress + return false + } + if (!nextChar.isUpperCase()) { + // We aren't at the next word yet + return false + } + + if (peek?.isLowerCase() != true) { + return false + } + + // Skip cases like `AR[N]s`, `AC[L]s` but not `IAM[U]ser` + if (peek == 's' && (doublePeek == null || !doublePeek.isLowerCase())) { + return false + } + + // Skip cases like `DynamoD[B]v2` + if (peek == 'v' && doublePeek?.isDigit() == true) { + return false + } + return true +} + +private fun loweredFollowedByUpper(current: String, nextChar: Char): Boolean { + if (!nextChar.isUpperCase()) { + return false + } + return current.last().isLowerCase() || current.last().isDigit() +} + +private fun digitFollowedByLower(current: String, nextChar: Char): Boolean { + return (current.last().isDigit() && nextChar.isLowerCase()) +} + fun String.toSnakeCase(): String { - return CaseUtils.toSnakeCase(this) + return this.splitOnWordBoundaries().joinToString("_") { it.lowercase() } } fun String.toPascalCase(): String { + // TODO(https://github.com/smithy-lang/smithy-rs/issues/3047): consider using our updated toSnakeCase (but need to audit diff) return CaseUtils.toSnakeCase(this).let { CaseUtils.toPascalCase(it) } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt index 9c4cde5f5c6..2147dc857ce 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt @@ -21,7 +21,7 @@ class VersionTest { ) { val version = Version.parse(content) version.fullVersion shouldBe fullVersion - version.crateVersion shouldBe crateVersion + version.stableCrateVersion shouldBe crateVersion } @ParameterizedTest() @@ -36,30 +36,15 @@ class VersionTest { @JvmStatic fun versionProvider() = listOf( Arguments.of( - "0.47.0\n0198d26096eb1af510ce24766c921ffc5e4c191e", - "0.47.0-0198d26096eb1af510ce24766c921ffc5e4c191e", - "0.47.0", + """{ "stableVersion": "1.0.1", "unstableVersion": "0.60.1","githash": "0198d26096eb1af510ce24766c921ffc5e4c191e", "runtimeCrates": {} }""", + "1.0.1-0198d26096eb1af510ce24766c921ffc5e4c191e", + "1.0.1", ), Arguments.of( - "release-2022-08-04\ndb48039065bec890ef387385773b37154b555b14", + """{ "unstableVersion": "0.60.1", "stableVersion": "release-2022-08-04", "githash": "db48039065bec890ef387385773b37154b555b14", "runtimeCrates": {} }""", "release-2022-08-04-db48039065bec890ef387385773b37154b555b14", "release-2022-08-04", ), - Arguments.of( - "0.30.0-alpha\na1dbbe2947de3c8bbbef9446eb442e298f83f200", - "0.30.0-alpha-a1dbbe2947de3c8bbbef9446eb442e298f83f200", - "0.30.0-alpha", - ), - Arguments.of( - "0.6-rc1.cargo\nc281800a185b34600b05f8b501a0322074184123", - "0.6-rc1.cargo-c281800a185b34600b05f8b501a0322074184123", - "0.6-rc1.cargo", - ), - Arguments.of( - "0.27.0-alpha.1\n643f2ee", - "0.27.0-alpha.1-643f2ee", - "0.27.0-alpha.1", - ), ) @JvmStatic diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependencyTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependencyTest.kt new file mode 100644 index 00000000000..9d18c4725e3 --- /dev/null +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependencyTest.kt @@ -0,0 +1,48 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.rustlang + +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +class CargoDependencyTest { + @Test + fun `it should not allow a dependency with test-util in non-dev scopes`() { + // OK + CargoDependency( + name = "test", + location = CratesIo("1.0"), + features = setOf("foo", "test-util", "bar"), + scope = DependencyScope.Dev, + ) + + // OK + CargoDependency( + name = "test", + location = CratesIo("1.0"), + features = setOf("foo", "bar"), + scope = DependencyScope.Dev, + ).toDevDependency().withFeature("test-util") + + assertThrows { + CargoDependency( + name = "test", + location = CratesIo("1.0"), + features = setOf("foo", "test-util", "bar"), + scope = DependencyScope.Compile, + ) + } + + assertThrows { + CargoDependency( + name = "test", + location = CratesIo("1.0"), + features = setOf("foo", "bar"), + scope = DependencyScope.Compile, + ).withFeature("test-util") + } + } +} diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt index 25e47e09635..ec97799af42 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt @@ -8,20 +8,21 @@ package software.amazon.smithy.rust.codegen.core.rustlang import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test import software.amazon.smithy.model.Model +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.rust.codegen.core.smithy.MaybeRenamed import software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.renamedFrom -import software.amazon.smithy.rust.codegen.core.testutil.TestRustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.testRustSettings +import software.amazon.smithy.rust.codegen.core.testutil.testRustSymbolProviderConfig import software.amazon.smithy.rust.codegen.core.util.lookup internal class RustReservedWordSymbolProviderTest { - private class TestSymbolProvider(model: Model) : - WrappingSymbolProvider(SymbolVisitor(testRustSettings(), model, null, TestRustSymbolProviderConfig)) + private class TestSymbolProvider(model: Model, nullabilityCheckMode: NullableIndex.CheckMode) : + WrappingSymbolProvider(SymbolVisitor(testRustSettings(), model, null, testRustSymbolProviderConfig(nullabilityCheckMode))) private val emptyConfig = RustReservedWordConfig(emptyMap(), emptyMap(), emptyMap()) @Test @@ -30,13 +31,13 @@ internal class RustReservedWordSymbolProviderTest { namespace test structure Self {} """.asSmithyModel() - val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model), emptyConfig) + val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), emptyConfig) val symbol = provider.toSymbol(model.lookup("test#Self")) symbol.name shouldBe "SelfValue" } private fun mappingTest(config: RustReservedWordConfig, model: Model, id: String, test: (String) -> Unit) { - val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model), config) + val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), config) val symbol = provider.toMemberName(model.lookup("test#Container\$$id")) test(symbol) } @@ -132,7 +133,7 @@ internal class RustReservedWordSymbolProviderTest { async: String } """.asSmithyModel() - val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model), emptyConfig) + val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), emptyConfig) provider.toMemberName( MemberShape.builder().id("namespace#container\$async").target("namespace#Integer").build(), ) shouldBe "r##async" @@ -149,7 +150,7 @@ internal class RustReservedWordSymbolProviderTest { @enum([{ name: "dontcare", value: "dontcare" }]) string Container """.asSmithyModel() val provider = RustReservedWordSymbolProvider( - TestSymbolProvider(model), + TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), reservedWordConfig = emptyConfig.copy( enumMemberMap = mapOf( "Unknown" to "UnknownValue", diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt index 1c89f39058a..fcd9583d497 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt @@ -61,7 +61,7 @@ internal class RustTypesTest { fun `RustType_Vec_writable produces a template-compatible RuntimeType`() { forInputExpectOutput( RustType.Vec(RustType.String).writable, - "'::std::vec::Vec<::std::string::String>'", + "'::std::vec::Vec::<::std::string::String>'", ) } @@ -77,7 +77,7 @@ internal class RustTypesTest { fun `RustType_HashMap_writable produces a template-compatible RuntimeType`() { forInputExpectOutput( RustType.HashMap(RustType.String, RustType.String).writable, - "'::std::collections::HashMap<::std::string::String, ::std::string::String>'", + "'::std::collections::HashMap::<::std::string::String, ::std::string::String>'", ) } @@ -87,7 +87,7 @@ internal class RustTypesTest { RustType.HashSet(RustType.String).writable, // Rust doesn't guarantee that `HashSet`s are insertion ordered, so we use a `Vec` instead. // This is called out in a comment in the RustType.HashSet declaration - "'::std::vec::Vec<::std::string::String>'", + "'::std::vec::Vec::<::std::string::String>'", ) } @@ -146,8 +146,8 @@ internal class RustTypesTest { @Test fun `types render properly`() { val type = RustType.Box(RustType.Option(RustType.Reference("a", RustType.Vec(RustType.String)))) - type.render(false) shouldBe "Box>>" - type.render(true) shouldBe "::std::boxed::Box<::std::option::Option<&'a ::std::vec::Vec<::std::string::String>>>" + type.render(false) shouldBe "Box>>" + type.render(true) shouldBe "::std::boxed::Box<::std::option::Option<&'a ::std::vec::Vec::<::std::string::String>>>" } @Test @@ -220,4 +220,13 @@ internal class RustTypesTest { val attributeMacro = Attribute(derive()) forInputExpectOutput(writable { attributeMacro.render(this) }, "") } + + @Test + fun `finds inner reference type`() { + val innerReference = RustType.Reference("a", RustType.Bool) + val type = RustType.Box(RustType.Option(innerReference)) + + type.innerReference() shouldBe innerReference + RustType.Bool.innerReference() shouldBe null + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt index 04c5ff2f1a4..a9b45582ef5 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.rustlang import io.kotest.matchers.string.shouldContain +import io.kotest.matchers.string.shouldEndWith import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -106,4 +107,13 @@ internal class RustTypeParametersTest { }.join(writable("+"))(writer) writer.toString() shouldContain "A-B-CD+E+F" } + + @Test + fun `test map`() { + val writer = RustWriter.forModule("model") + val a = writable { rust("a") } + val b = a.map { rust("b(#T)", it) } + b(writer) + writer.toString().trim() shouldEndWith "b(a)" + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt index c9407372d76..6ed2fc5ed32 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.smithy import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.RepeatedTest import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency import software.amazon.smithy.rust.codegen.core.rustlang.CratesIo @@ -13,7 +14,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope.Compile import software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope.Dev class CodegenDelegatorTest { - @Test + @RepeatedTest(10) // Test it several times since the shuffle adds in some randomness fun testMergeDependencyFeatures() { val merged = listOf( @@ -36,6 +37,22 @@ class CodegenDelegatorTest { ) } + @RepeatedTest(10) // Test it several times since the shuffle adds in some randomness + fun testMergeDependencyFeaturesDontMergeDevOnlyFeatures() { + val merged = listOf( + CargoDependency("A", CratesIo("1"), Compile, features = setOf("a")), + CargoDependency("A", CratesIo("1"), Compile, features = setOf("b")), + CargoDependency("A", CratesIo("1"), Dev, features = setOf("c")), + CargoDependency("A", CratesIo("1"), Dev, features = setOf("test-util")), + ).shuffled().mergeDependencyFeatures() + .sortedBy { it.scope } + + merged shouldBe setOf( + CargoDependency("A", CratesIo("1"), Compile, features = setOf("a", "b")), + CargoDependency("A", CratesIo("1"), Dev, features = setOf("c", "test-util")), + ) + } + @Test fun testMergeIdenticalFeatures() { val merged = listOf( @@ -43,11 +60,15 @@ class CodegenDelegatorTest { CargoDependency("A", CratesIo("1"), Dev), CargoDependency("B", CratesIo("1"), Compile), CargoDependency("B", CratesIo("1"), Dev, features = setOf("a", "b")), + CargoDependency("C", CratesIo("1"), Compile), + CargoDependency("C", CratesIo("1"), Dev, features = setOf("test-util")), ).mergeIdenticalTestDependencies() merged shouldBe setOf( CargoDependency("A", CratesIo("1"), Compile), CargoDependency("B", CratesIo("1"), Compile), CargoDependency("B", CratesIo("1"), Dev, features = setOf("a", "b")), + CargoDependency("C", CratesIo("1"), Compile), + CargoDependency("C", CratesIo("1"), Dev, features = setOf("test-util")), ) } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt index 1ae310088d9..b3dec08b7c4 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt @@ -11,8 +11,8 @@ import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource import software.amazon.smithy.model.node.Node +import software.amazon.smithy.rust.codegen.core.Version import software.amazon.smithy.rust.codegen.core.rustlang.CratesIo -import software.amazon.smithy.rust.codegen.core.rustlang.DependencyLocation import software.amazon.smithy.rust.codegen.core.rustlang.Local import java.util.Optional @@ -35,22 +35,20 @@ class RuntimeTypesTest { cfg.runtimeCrateLocation shouldBe RuntimeCrateLocation(null, CrateVersionMap(mapOf())) } - @ParameterizedTest - @MethodSource("runtimeCrateLocationProvider") - fun `runtimeCrateLocation provides dependency location`( - path: String?, - versions: CrateVersionMap, - crateName: String?, - expectedDependencyLocation: DependencyLocation, - ) { - val crateLoc = RuntimeCrateLocation(path, versions) - val depLoc = crateLoc.crateLocation(crateName) - depLoc shouldBe expectedDependencyLocation + @Test + fun `runtimeCrateLocation provides dependency location`() { + val crateLoc = RuntimeCrateLocation("/foo", CrateVersionMap(mapOf("aws-smithy-runtime-api" to "999.999"))) + crateLoc.crateLocation("aws-smithy-runtime") shouldBe Local("/foo", null) + crateLoc.crateLocation("aws-smithy-runtime-api") shouldBe Local("/foo", null) + crateLoc.crateLocation("aws-smithy-http") shouldBe Local("/foo", null) + + val crateLocVersioned = RuntimeCrateLocation(null, CrateVersionMap(mapOf("aws-smithy-runtime-api" to "999.999"))) + crateLocVersioned.crateLocation("aws-smithy-runtime") shouldBe CratesIo(Version.stableCrateVersion()) + crateLocVersioned.crateLocation("aws-smithy-runtime-api") shouldBe CratesIo("999.999") + crateLocVersioned.crateLocation("aws-smithy-http") shouldBe CratesIo(Version.unstableCrateVersion()) } companion object { - @JvmStatic - private val defaultVersion = defaultRuntimeCrateVersion() @JvmStatic fun runtimeConfigProvider() = listOf( @@ -90,97 +88,5 @@ class RuntimeTypesTest { RuntimeCrateLocation("/path", CrateVersionMap(mapOf("a" to "1.0", "b" to "2.0"))), ), ) - - @JvmStatic - fun runtimeCrateLocationProvider() = listOf( - // If user specifies `relativePath` in `runtimeConfig`, then that always takes precedence over versions. - Arguments.of( - "/path", - mapOf(), - null, - Local("/path"), - ), - Arguments.of( - "/path", - mapOf("a" to "1.0", "b" to "2.0"), - null, - Local("/path"), - ), - Arguments.of( - "/path", - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - null, - Local("/path", "0.1"), - ), - - // User does not specify the versions object. - // The version number of the code-generator should be used as the version for all runtime crates. - Arguments.of( - null, - mapOf(), - null, - CratesIo(defaultVersion), - ), - Arguments.of( - null, - mapOf(), - "a", - CratesIo(defaultVersion), - ), - - // User specifies versions object, setting explicit version numbers for some runtime crates. - // Then the rest of the runtime crates use the code-generator's version as their version. - Arguments.of( - null, - mapOf("a" to "1.0", "b" to "2.0"), - null, - CratesIo(defaultVersion), - ), - Arguments.of( - null, - mapOf("a" to "1.0", "b" to "2.0"), - "a", - CratesIo("1.0"), - ), - Arguments.of( - null, - mapOf("a" to "1.0", "b" to "2.0"), - "b", - CratesIo("2.0"), - ), - Arguments.of( - null, - mapOf("a" to "1.0", "b" to "2.0"), - "c", - CratesIo(defaultVersion), - ), - - // User specifies versions object, setting DEFAULT and setting version numbers for some runtime crates. - // Then the specified version in DEFAULT is used for all runtime crates, except for those where the user specified a value for in the map. - Arguments.of( - null, - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - null, - CratesIo("0.1"), - ), - Arguments.of( - null, - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - "a", - CratesIo("1.0"), - ), - Arguments.of( - null, - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - "b", - CratesIo("2.0"), - ), - Arguments.of( - null, - mapOf("DEFAULT" to "0.1", "a" to "1.0", "b" to "2.0"), - "c", - CratesIo("0.1"), - ), - ) } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt index 3c47ca4f672..06485823c69 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt @@ -153,7 +153,7 @@ class SymbolVisitorTest { val provider: SymbolProvider = testSymbolProvider(model) val setSymbol = provider.toSymbol(set) - setSymbol.rustType().render(false) shouldBe "${RustType.HashSet.Type}" + setSymbol.rustType().render(false) shouldBe "${RustType.HashSet.Type}::" setSymbol.referenceClosure().map { it.name } shouldBe listOf(RustType.HashSet.Type, "String") } @@ -172,7 +172,7 @@ class SymbolVisitorTest { val provider: SymbolProvider = testSymbolProvider(model) val setSymbol = provider.toSymbol(set) - setSymbol.rustType().render(false) shouldBe "Vec" + setSymbol.rustType().render(false) shouldBe "Vec::" setSymbol.referenceClosure().map { it.name } shouldBe listOf("Vec", "Record") } @@ -193,7 +193,7 @@ class SymbolVisitorTest { val provider: SymbolProvider = testSymbolProvider(model) val setSymbol = provider.toSymbol(set) - setSymbol.rustType().render(false) shouldBe "Vec>" + setSymbol.rustType().render(false) shouldBe "Vec::>" setSymbol.referenceClosure().map { it.name } shouldBe listOf("Vec", "Option", "Record") } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt index 55b792218f3..f9eda03a43f 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt @@ -7,9 +7,12 @@ package software.amazon.smithy.rust.codegen.core.smithy.customizations import org.junit.jupiter.api.Test import software.amazon.smithy.model.Model -import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext +import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGeneratorTest.Companion.model import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.generatePluginContext import software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext class SmithyTypesPubUseExtraTest { @@ -43,61 +46,81 @@ class SmithyTypesPubUseExtraTest { """.asSmithyModel() } - private fun typesWithEmptyModel() = typesWithMember() - private fun typesWithMember( + private val rustCrate: RustCrate + private val codegenContext: CodegenContext = testCodegenContext(model) + + init { + val (context, _) = generatePluginContext( + model, + runtimeConfig = codegenContext.runtimeConfig, + ) + rustCrate = RustCrate( + context.fileManifest, + codegenContext.symbolProvider, + codegenContext.settings.codegenConfig, + codegenContext.expectModuleDocProvider(), + ) + } + + private fun reexportsWithEmptyModel() = reexportsWithMember() + private fun reexportsWithMember( inputMember: String = "", outputMember: String = "", unionMember: String = "", additionalShape: String = "", - ) = pubUseTypes(testCodegenContext(model), modelWithMember(inputMember, outputMember, unionMember, additionalShape)) + ) = RustWriter.root().let { writer -> + pubUseSmithyPrimitives( + codegenContext, + modelWithMember(inputMember, outputMember, unionMember, additionalShape), + rustCrate, + )(writer) + writer.toString() + } - private fun assertDoesntHaveTypes(types: List, expectedTypes: List) = - expectedTypes.forEach { assertDoesntHaveType(types, it) } + private fun assertDoesntHaveReexports(reexports: String, expectedTypes: List) = + expectedTypes.forEach { assertDoesntHaveReexports(reexports, it) } - private fun assertDoesntHaveType(types: List, type: String) { - if (types.any { t -> t.fullyQualifiedName() == type }) { + private fun assertDoesntHaveReexports(reexports: String, type: String) { + if (reexports.contains(type)) { throw AssertionError("Expected $type to NOT be re-exported, but it was.") } } - private fun assertHasTypes(types: List, expectedTypes: List) = - expectedTypes.forEach { assertHasType(types, it) } + private fun assertHasReexports(reexports: String, expectedTypes: List) = + expectedTypes.forEach { assertHasReexport(reexports, it) } - private fun assertHasType(types: List, type: String) { - if (types.none { t -> t.fullyQualifiedName() == type }) { - throw AssertionError( - "Expected $type to be re-exported. Re-exported types: " + - types.joinToString { it.fullyQualifiedName() }, - ) + private fun assertHasReexport(reexports: String, type: String) { + if (!reexports.contains(type)) { + throw AssertionError("Expected $type to be re-exported. Re-exported types:\n$reexports") } } @Test fun `it re-exports Blob when a model uses blobs`() { - assertDoesntHaveType(typesWithEmptyModel(), "::aws_smithy_types::Blob") - assertHasType(typesWithMember(inputMember = "foo: Blob"), "::aws_smithy_types::Blob") - assertHasType(typesWithMember(outputMember = "foo: Blob"), "::aws_smithy_types::Blob") - assertHasType( - typesWithMember(inputMember = "foo: SomeUnion", unionMember = "foo: Blob"), + this.assertDoesntHaveReexports(reexportsWithEmptyModel(), "::aws_smithy_types::Blob") + assertHasReexport(reexportsWithMember(inputMember = "foo: Blob"), "::aws_smithy_types::Blob") + assertHasReexport(reexportsWithMember(outputMember = "foo: Blob"), "::aws_smithy_types::Blob") + assertHasReexport( + reexportsWithMember(inputMember = "foo: SomeUnion", unionMember = "foo: Blob"), "::aws_smithy_types::Blob", ) - assertHasType( - typesWithMember(outputMember = "foo: SomeUnion", unionMember = "foo: Blob"), + assertHasReexport( + reexportsWithMember(outputMember = "foo: SomeUnion", unionMember = "foo: Blob"), "::aws_smithy_types::Blob", ) } @Test fun `it re-exports DateTime when a model uses timestamps`() { - assertDoesntHaveType(typesWithEmptyModel(), "aws_smithy_types::DateTime") - assertHasType(typesWithMember(inputMember = "foo: Timestamp"), "::aws_smithy_types::DateTime") - assertHasType(typesWithMember(outputMember = "foo: Timestamp"), "::aws_smithy_types::DateTime") - assertHasType( - typesWithMember(inputMember = "foo: SomeUnion", unionMember = "foo: Timestamp"), + this.assertDoesntHaveReexports(reexportsWithEmptyModel(), "aws_smithy_types::DateTime") + assertHasReexport(reexportsWithMember(inputMember = "foo: Timestamp"), "::aws_smithy_types::DateTime") + assertHasReexport(reexportsWithMember(outputMember = "foo: Timestamp"), "::aws_smithy_types::DateTime") + assertHasReexport( + reexportsWithMember(inputMember = "foo: SomeUnion", unionMember = "foo: Timestamp"), "::aws_smithy_types::DateTime", ) - assertHasType( - typesWithMember(outputMember = "foo: SomeUnion", unionMember = "foo: Timestamp"), + assertHasReexport( + reexportsWithMember(outputMember = "foo: SomeUnion", unionMember = "foo: Timestamp"), "::aws_smithy_types::DateTime", ) } @@ -105,23 +128,23 @@ class SmithyTypesPubUseExtraTest { @Test fun `it re-exports ByteStream and AggregatedBytes when a model has streaming`() { val streamingTypes = - listOf("::aws_smithy_http::byte_stream::ByteStream", "::aws_smithy_http::byte_stream::AggregatedBytes") + listOf("::aws_smithy_types::byte_stream::ByteStream", "::aws_smithy_types::byte_stream::AggregatedBytes") val streamingShape = "@streaming blob Streaming" - assertDoesntHaveTypes(typesWithEmptyModel(), streamingTypes) - assertHasTypes(typesWithMember(additionalShape = streamingShape, inputMember = "m: Streaming"), streamingTypes) - assertHasTypes(typesWithMember(additionalShape = streamingShape, outputMember = "m: Streaming"), streamingTypes) + this.assertDoesntHaveReexports(reexportsWithEmptyModel(), streamingTypes) + assertHasReexports(reexportsWithMember(additionalShape = streamingShape, inputMember = "m: Streaming"), streamingTypes) + assertHasReexports(reexportsWithMember(additionalShape = streamingShape, outputMember = "m: Streaming"), streamingTypes) // Event streams don't re-export the normal streaming types - assertDoesntHaveTypes( - typesWithMember( + this.assertDoesntHaveReexports( + reexportsWithMember( additionalShape = "@streaming union EventStream { foo: SomeStruct }", inputMember = "m: EventStream", ), streamingTypes, ) - assertDoesntHaveTypes( - typesWithMember( + this.assertDoesntHaveReexports( + reexportsWithMember( additionalShape = "@streaming union EventStream { foo: SomeStruct }", outputMember = "m: EventStream", ), diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt index 95021bdd7ab..acddf9e1887 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt @@ -8,19 +8,27 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Test import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.AllowDeprecated +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.implBlock import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.Default +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.setDefault import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.testutil.unitTest import kotlin.io.path.extension import kotlin.io.path.readText +import software.amazon.smithy.rust.codegen.core.util.lookup internal class BuilderGeneratorTest { private val model = StructureGeneratorTest.model @@ -36,8 +44,8 @@ internal class BuilderGeneratorTest { val project = TestWorkspace.testProject(provider) project.moduleFor(inner) { rust("##![allow(deprecated)]") - StructureGenerator(model, provider, this, inner, emptyList()).render() - StructureGenerator(model, provider, this, struct, emptyList()).render() + generator(model, provider, this, inner).render() + generator(model, provider, this, struct).render() implBlock(provider.toSymbol(struct)) { BuilderGenerator.renderConvenienceMethod(this, provider, struct) } @@ -72,8 +80,8 @@ internal class BuilderGeneratorTest { project.moduleFor(StructureGeneratorTest.struct) { AllowDeprecated.render(this) - StructureGenerator(model, provider, this, inner, emptyList()).render() - StructureGenerator(model, provider, this, struct, emptyList()).render() + generator(model, provider, this, inner).render() + generator(model, provider, this, struct).render() implBlock(provider.toSymbol(struct)) { BuilderGenerator.renderConvenienceMethod(this, provider, struct) } @@ -93,12 +101,14 @@ internal class BuilderGeneratorTest { project.compileAndTest() } + private fun generator(model: Model, provider: RustSymbolProvider, writer: RustWriter, shape: StructureShape) = StructureGenerator(model, provider, writer, shape, emptyList(), StructSettings(flattenVecAccessors = true)) + @Test fun `builder for a struct with sensitive fields should implement the debug trait as such`() { val provider = testSymbolProvider(model) val project = TestWorkspace.testProject(provider) project.moduleFor(credentials) { - StructureGenerator(model, provider, this, credentials, emptyList()).render() + generator(model, provider, this, credentials).render() implBlock(provider.toSymbol(credentials)) { BuilderGenerator.renderConvenienceMethod(this, provider, credentials) } @@ -125,7 +135,7 @@ internal class BuilderGeneratorTest { val provider = testSymbolProvider(model) val project = TestWorkspace.testProject(provider) project.moduleFor(secretStructure) { - StructureGenerator(model, provider, this, secretStructure, emptyList()).render() + generator(model, provider, this, secretStructure).render() implBlock(provider.toSymbol(secretStructure)) { BuilderGenerator.renderConvenienceMethod(this, provider, secretStructure) } @@ -168,5 +178,86 @@ internal class BuilderGeneratorTest { Assertions.assertFalse(file.contains("serde::")) } } + + fun `it supports nonzero defaults`() { + val model = """ + namespace com.test + structure MyStruct { + @default(0) + @required + zeroDefault: Integer + @required + @default(1) + oneDefault: OneDefault + @required + @default("") + defaultEmpty: String + @required + @default("some-value") + defaultValue: String + @required + anActuallyRequiredField: Integer + @required + @default([]) + emptyList: StringList + noDefault: String + @default(true) + @required + defaultDocument: Document + + @default([]) + @required + listDocument: Document + + @default(0) + zero_timestamp: Timestamp + + @default(1) + one_timestamp: Timestamp + + @default("abc") + blob_abc: Blob + } + list StringList { + member: String + } + @default(1) + integer OneDefault + + """.asSmithyModel(smithyVersion = "2.0") + + val provider = testSymbolProvider( + model, + rustReservedWordConfig = StructureGeneratorTest.rustReservedWordConfig, + nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_CAREFUL, + ) + val project = TestWorkspace.testProject(provider) + val shape: StructureShape = model.lookup("com.test#MyStruct") + project.useShapeWriter(shape) { + generator(model, provider, this, shape).render() + BuilderGenerator(model, provider, shape, listOf()).render(this) + unitTest("test_defaults") { + rustTemplate( + """ + let s = Builder::default().an_actually_required_field(5).build().unwrap(); + assert_eq!(s.zero_default(), 0); + assert_eq!(s.default_empty(), ""); + assert_eq!(s.default_value(), "some-value"); + assert_eq!(s.one_default(), 1); + assert!(s.empty_list().is_empty()); + assert_eq!(s.an_actually_required_field(), 5); + assert_eq!(s.no_default(), None); + assert_eq!(s.default_document().as_bool().unwrap(), true); + assert_eq!(s.list_document().as_array().expect("empty list"), &[]); + assert_eq!(std::str::from_utf8(s.blob_abc().as_ref()).expect("invalid blob"), "abc"); + assert_eq!(s.zero_timestamp().secs(), 0); + assert_eq!(s.one_timestamp().secs(), 1); + """, + "Struct" to provider.toSymbol(shape), + ) + } + } + project.compileAndTest() + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt index 5232fb1df21..aa89acbb2bf 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt @@ -6,7 +6,6 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import org.junit.jupiter.api.Test -import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.NumberNode import software.amazon.smithy.model.node.StringNode @@ -19,7 +18,6 @@ import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.withBlock -import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer @@ -102,14 +100,11 @@ class InstantiatorTest { override fun doesSetterTakeInOption(memberShape: MemberShape) = true } - // This can be empty since the actual behavior is tested in `ClientInstantiatorTest` and `ServerInstantiatorTest`. - private fun enumFromStringFn(symbol: Symbol, data: String) = writable { } - @Test fun `generate unions`() { val union = model.lookup("com.test#MyUnion") val sut = - Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext), ::enumFromStringFn) + Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext)) val data = Node.parse("""{ "stringVariant": "ok!" }""") val project = TestWorkspace.testProject(model) @@ -129,7 +124,7 @@ class InstantiatorTest { fun `generate struct builders`() { val structure = model.lookup("com.test#MyStruct") val sut = - Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext), ::enumFromStringFn) + Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext)) val data = Node.parse("""{ "bar": 10, "foo": "hello" }""") val project = TestWorkspace.testProject(model) @@ -154,7 +149,7 @@ class InstantiatorTest { fun `generate builders for boxed structs`() { val structure = model.lookup("com.test#WithBox") val sut = - Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext), ::enumFromStringFn) + Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext)) val data = Node.parse( """ { @@ -193,7 +188,7 @@ class InstantiatorTest { fun `generate lists`() { val data = Node.parse("""["bar", "foo"]""") val sut = - Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext), ::enumFromStringFn) + Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext)) val project = TestWorkspace.testProject() project.lib { @@ -214,7 +209,6 @@ class InstantiatorTest { model, runtimeConfig, BuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) val project = TestWorkspace.testProject(model) @@ -245,7 +239,6 @@ class InstantiatorTest { model, runtimeConfig, BuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) val inner = model.lookup("com.test#Inner") @@ -278,7 +271,6 @@ class InstantiatorTest { model, runtimeConfig, BuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) val project = TestWorkspace.testProject(model) @@ -306,7 +298,6 @@ class InstantiatorTest { model, runtimeConfig, BuilderKindBehavior(codegenContext), - ::enumFromStringFn, ) val project = TestWorkspace.testProject(model) project.testModule { diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt index f7655873001..f31fd538e83 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt @@ -7,8 +7,8 @@ package software.amazon.smithy.rust.codegen.core.smithy.generators import io.kotest.matchers.string.shouldContainInOrder import io.kotest.matchers.string.shouldNotContain -import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test +import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.RustModule @@ -16,6 +16,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel @@ -85,7 +86,6 @@ class StructureGeneratorTest { val credentials = model.lookup("com.test#Credentials") val secretStructure = model.lookup("com.test#SecretStructure") val structWithInnerSecretStructure = model.lookup("com.test#StructWithInnerSecretStructure") - val error = model.lookup("com.test#MyError") val rustReservedWordConfig: RustReservedWordConfig = RustReservedWordConfig( structureMemberMap = StructureGenerator.structureMemberNameMap, @@ -94,13 +94,15 @@ class StructureGeneratorTest { ) } + private fun structureGenerator(model: Model, provider: RustSymbolProvider, writer: RustWriter, shape: StructureShape) = StructureGenerator(model, provider, writer, shape, emptyList(), StructSettings(flattenVecAccessors = true)) + @Test fun `generate basic structures`() { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) val project = TestWorkspace.testProject(provider) project.useShapeWriter(inner) { - StructureGenerator(model, provider, this, inner, emptyList()).render() - StructureGenerator(model, provider, this, struct, emptyList()).render() + structureGenerator(model, provider, this, inner).render() + structureGenerator(model, provider, this, struct).render() unitTest( "struct_fields_optional", """ @@ -122,11 +124,11 @@ class StructureGeneratorTest { project.lib { Attribute.AllowDeprecated.render(this) } project.moduleFor(inner) { - val innerGenerator = StructureGenerator(model, provider, this, inner, emptyList()) + val innerGenerator = structureGenerator(model, provider, this, inner) innerGenerator.render() } project.withModule(RustModule.public("structs")) { - val generator = StructureGenerator(model, provider, this, struct, emptyList()) + val generator = structureGenerator(model, provider, this, struct) generator.render() } // By putting the test in another module, it can't access the struct @@ -149,7 +151,7 @@ class StructureGeneratorTest { fun `generate a custom debug implementation when the sensitive trait is applied to some members`() { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) TestWorkspace.testProject().unitTest { - StructureGenerator(model, provider, this, credentials, emptyList()).render() + structureGenerator(model, provider, this, credentials).render() this.unitTest( "sensitive_fields_redacted", @@ -169,7 +171,7 @@ class StructureGeneratorTest { fun `generate a custom debug implementation when the sensitive trait is applied to the struct`() { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) TestWorkspace.testProject().unitTest { - StructureGenerator(model, provider, this, secretStructure, emptyList()).render() + structureGenerator(model, provider, this, secretStructure).render() this.unitTest( "sensitive_structure_redacted", @@ -188,8 +190,8 @@ class StructureGeneratorTest { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) val project = TestWorkspace.testProject(provider) project.useShapeWriter(inner) { - val secretGenerator = StructureGenerator(model, provider, this, secretStructure, emptyList()) - val generator = StructureGenerator(model, provider, this, structWithInnerSecretStructure, emptyList()) + val secretGenerator = structureGenerator(model, provider, this, secretStructure) + val generator = structureGenerator(model, provider, this, structWithInnerSecretStructure) secretGenerator.render() generator.render() unitTest( @@ -232,8 +234,8 @@ class StructureGeneratorTest { Attribute.DenyMissingDocs.render(this) } project.moduleFor(model.lookup("com.test#Inner")) { - StructureGenerator(model, provider, this, model.lookup("com.test#Inner"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("com.test#MyStruct"), emptyList()).render() + structureGenerator(model, provider, this, model.lookup("com.test#Inner")).render() + structureGenerator(model, provider, this, model.lookup("com.test#MyStruct")).render() } project.compileAndTest() @@ -243,7 +245,7 @@ class StructureGeneratorTest { fun `documents are optional in structs`() { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) TestWorkspace.testProject().unitTest { - StructureGenerator(model, provider, this, structWithDoc, emptyList()).render() + structureGenerator(model, provider, this, structWithDoc).render() rust( """ let _struct = StructWithDoc { @@ -276,10 +278,10 @@ class StructureGeneratorTest { val project = TestWorkspace.testProject(provider) project.lib { rust("##![allow(deprecated)]") } project.moduleFor(model.lookup("test#Foo")) { - StructureGenerator(model, provider, this, model.lookup("test#Foo"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Bar"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Baz"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Qux"), emptyList()).render() + structureGenerator(model, provider, this, model.lookup("test#Foo")).render() + structureGenerator(model, provider, this, model.lookup("test#Bar")).render() + structureGenerator(model, provider, this, model.lookup("test#Baz")).render() + structureGenerator(model, provider, this, model.lookup("test#Qux")).render() } // turn on clippy to check the semver-compliant version of `since`. @@ -309,9 +311,9 @@ class StructureGeneratorTest { val project = TestWorkspace.testProject(provider) project.lib { rust("##![allow(deprecated)]") } project.moduleFor(model.lookup("test#Nested")) { - StructureGenerator(model, provider, this, model.lookup("test#Nested"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Foo"), emptyList()).render() - StructureGenerator(model, provider, this, model.lookup("test#Bar"), emptyList()).render() + structureGenerator(model, provider, this, model.lookup("test#Nested")).render() + structureGenerator(model, provider, this, model.lookup("test#Foo")).render() + structureGenerator(model, provider, this, model.lookup("test#Bar")).render() } project.compileAndTest() @@ -358,8 +360,8 @@ class StructureGeneratorTest { val project = TestWorkspace.testProject(provider) project.useShapeWriter(inner) { - StructureGenerator(testModel, provider, this, testModel.lookup("test#One"), emptyList()).render() - StructureGenerator(testModel, provider, this, testModel.lookup("test#Two"), emptyList()).render() + structureGenerator(testModel, provider, this, testModel.lookup("test#One")).render() + structureGenerator(testModel, provider, this, testModel.lookup("test#Two")).render() rustBlock("fn compile_test_one(one: &crate::test_model::One)") { rust( @@ -401,7 +403,7 @@ class StructureGeneratorTest { } @Test - fun `non-streaming fields are doc-hidden`() { + fun `fields are NOT doc-hidden`() { val model = """ namespace com.test structure MyStruct { @@ -415,9 +417,9 @@ class StructureGeneratorTest { val struct = model.lookup("com.test#MyStruct") val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) - RustWriter.forModule("test").let { - StructureGenerator(model, provider, it, struct, emptyList()).render() - assertEquals(6, it.toString().split("#[doc(hidden)]").size, "there should be 5 doc-hiddens") + RustWriter.forModule("test").let { writer -> + structureGenerator(model, provider, writer, struct).render() + writer.toString().shouldNotContain("#[doc(hidden)]") } } @@ -432,7 +434,7 @@ class StructureGeneratorTest { val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig) RustWriter.forModule("test").let { writer -> - StructureGenerator(model, provider, writer, struct, emptyList()).render() + structureGenerator(model, provider, writer, struct).render() writer.toString().shouldNotContain("#[doc(hidden)]") } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt index 79435b5e9b8..e5ca4d19aee 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt @@ -149,7 +149,7 @@ class JsonParserGeneratorTest { let top = output.top.expect("top"); assert_eq!(Some(45), top.extra); assert_eq!(Some("something".to_string()), top.field); - assert_eq!(Some(Choice::Int(5)), top.choice); + assert_eq!(Choice::Int(5), top.choice); """, ) unitTest( @@ -166,7 +166,18 @@ class JsonParserGeneratorTest { // unknown variant let input = br#"{ "top": { "choice": { "somenewvariant": "data" } } }"#; let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build(); - assert!(output.top.unwrap().choice.unwrap().is_unknown()); + assert!(output.top.unwrap().choice.is_unknown()); + """, + ) + + unitTest( + "dunder_type_should_be_ignored", + """ + // __type field should be ignored during deserialization + let input = br#"{ "top": { "choice": { "int": 5, "__type": "value-should-be-ignored-anyway" } } }"#; + let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build(); + use test_model::Choice; + assert_eq!(Choice::Int(5), output.top.unwrap().choice); """, ) diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt index 47f310e83df..0d78af182ea 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt @@ -81,7 +81,7 @@ internal class XmlBindingTraitParserGeneratorTest { extra: Long, @xmlName("prefix:local") - renamedWithPrefix: String + renamedWithPrefix: String, } @http(uri: "/top", method: "POST") diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt index ad44554e36d..2203b05dc1f 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt @@ -7,10 +7,12 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.CsvSource +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator.Companion.hasFallibleBuilder import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator @@ -95,7 +97,7 @@ class AwsQuerySerializerGeneratorTest { val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) val codegenContext = testCodegenContext(model, codegenTarget = codegenTarget) val symbolProvider = codegenContext.symbolProvider - val parserGenerator = AwsQuerySerializerGenerator(testCodegenContext(model, codegenTarget = codegenTarget)) + val parserGenerator = AwsQuerySerializerGenerator(codegenContext) val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op")) val project = TestWorkspace.testProject(symbolProvider) @@ -152,4 +154,162 @@ class AwsQuerySerializerGeneratorTest { } project.compileAndTest() } + + private val baseModelWithRequiredTypes = """ + namespace test + use aws.protocols#restJson1 + + union Choice { + blob: Blob, + boolean: Boolean, + date: Timestamp, + enum: FooEnum, + int: Integer, + @xmlFlattened + list: SomeList, + long: Long, + map: MyMap, + number: Double, + s: String, + top: Top, + unit: Unit, + } + + @enum([{name: "FOO", value: "FOO"}]) + string FooEnum + + map MyMap { + key: String, + value: Choice, + } + + list SomeList { + member: Choice + } + + structure Top { + @required + choice: Choice, + @required + field: String, + @required + extra: Long, + @xmlName("rec") + recursive: TopList + } + + list TopList { + @xmlName("item") + member: Top + } + + structure OpInput { + @required + @xmlName("some_bool") + boolean: Boolean, + list: SomeList, + map: MyMap, + @required + top: Top, + @required + blob: Blob + } + + @http(uri: "/top", method: "POST") + operation Op { + input: OpInput, + } + """.asSmithyModel() + + @ParameterizedTest + @CsvSource( + "true, CLIENT", + "true, CLIENT_CAREFUL", + "true, CLIENT_ZERO_VALUE_V1", + "true, CLIENT_ZERO_VALUE_V1_NO_INPUT", + "false, SERVER", + ) + fun `generates valid serializers for required types`(generateUnknownVariant: Boolean, nullabilityCheckMode: NullableIndex.CheckMode) { + val codegenTarget = when (generateUnknownVariant) { + true -> CodegenTarget.CLIENT + false -> CodegenTarget.SERVER + } + val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes)) + val codegenContext = testCodegenContext(model, codegenTarget = codegenTarget, nullabilityCheckMode = nullabilityCheckMode) + val symbolProvider = codegenContext.symbolProvider + val parserGenerator = AwsQuerySerializerGenerator(codegenContext) + val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op")) + + val project = TestWorkspace.testProject(symbolProvider) + + // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to + // add unwrap calls. + val builderIsFallible = hasFallibleBuilder(model.lookup("test#Top"), symbolProvider) + val maybeUnwrap = if (builderIsFallible) { ".unwrap()" } else { "" } + project.lib { + unitTest( + "query_serializer", + """ + use test_model::{Choice, Top}; + + let input = crate::test_input::OpInput::builder() + .top( + Top::builder() + .field("Hello") + .choice(Choice::Boolean(true)) + .extra(45) + .recursive( + Top::builder() + .field("World!") + .choice(Choice::Boolean(true)) + .extra(55) + .build() + $maybeUnwrap + ) + .build() + $maybeUnwrap + ) + .boolean(true) + .blob(aws_smithy_types::Blob::new(&b"test"[..])) + .build() + .unwrap(); + let serialized = ${format(operationGenerator!!)}(&input).unwrap(); + let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap(); + assert_eq!( + output, + "\ + Action=Op\ + &Version=test\ + &some_bool=true\ + &top.choice.choice=true\ + &top.field=Hello\ + &top.extra=45\ + &top.rec.item.1.choice.choice=true\ + &top.rec.item.1.field=World%21\ + &top.rec.item.1.extra=55\ + &blob=dGVzdA%3D%3D" + ); + """, + ) + } + model.lookup("test#Top").also { top -> + top.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(top) { + UnionGenerator( + model, + symbolProvider, + this, + model.lookup("test#Choice"), + renderUnknownVariant = generateUnknownVariant, + ).render() + val enum = model.lookup("test#FooEnum") + EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this) + } + } + + model.lookup("test#Op").inputShape(model).also { input -> + input.renderWithModelBuilder(model, symbolProvider, project) + } + project.compileAndTest() + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt index 2436aff7061..4b5f490e13a 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt @@ -5,10 +5,13 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize -import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator @@ -19,6 +22,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder import software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext +import software.amazon.smithy.rust.codegen.core.testutil.testRustSettings import software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider import software.amazon.smithy.rust.codegen.core.testutil.unitTest import software.amazon.smithy.rust.codegen.core.util.inputShape @@ -83,10 +87,18 @@ class Ec2QuerySerializerGeneratorTest { } """.asSmithyModel() - @Test - fun `generates valid serializers`() { + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) { val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) - val codegenContext = testCodegenContext(model) + val settings = testRustSettings() + val codegenContext = testCodegenContext(model, settings = settings, nullabilityCheckMode = nullabilityCheckMode) val symbolProvider = codegenContext.symbolProvider val parserGenerator = Ec2QuerySerializerGenerator(codegenContext) val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op")) @@ -139,4 +151,153 @@ class Ec2QuerySerializerGeneratorTest { } project.compileAndTest() } + + private val baseModelWithRequiredTypes = """ + namespace test + + union Choice { + blob: Blob, + boolean: Boolean, + date: Timestamp, + enum: FooEnum, + int: Integer, + @xmlFlattened + list: SomeList, + long: Long, + map: MyMap, + number: Double, + s: String, + top: Top, + unit: Unit, + } + + @enum([{name: "FOO", value: "FOO"}]) + string FooEnum + + map MyMap { + key: String, + value: Choice, + } + + list SomeList { + member: Choice + } + + structure Top { + @required + choice: Choice, + @required + field: String, + @required + extra: Long, + @xmlName("rec") + recursive: TopList + } + + list TopList { + @xmlName("item") + member: Top + } + + structure OpInput { + @required + @xmlName("some_bool") + boolean: Boolean, + list: SomeList, + map: MyMap, + @required + top: Top, + @required + blob: Blob + } + + @http(uri: "/top", method: "POST") + operation Op { + input: OpInput, + } + """.asSmithyModel() + + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) { + val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes)) + val settings = testRustSettings() + val codegenContext = testCodegenContext(model, settings = settings, nullabilityCheckMode = nullabilityCheckMode) + val symbolProvider = codegenContext.symbolProvider + val parserGenerator = Ec2QuerySerializerGenerator(codegenContext) + val operationGenerator = parserGenerator.operationInputSerializer(model.lookup("test#Op")) + + val project = TestWorkspace.testProject(testSymbolProvider(model)) + + // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to + // add unwrap calls. + val builderIsFallible = + BuilderGenerator.hasFallibleBuilder(model.lookup("test#Top"), symbolProvider) + val maybeUnwrap = if (builderIsFallible) { ".unwrap()" } else { "" } + project.lib { + unitTest( + "ec2query_serializer", + """ + use test_model::{Choice, Top}; + + let input = crate::test_input::OpInput::builder() + .top( + Top::builder() + .field("Hello") + .choice(Choice::Boolean(true)) + .extra(45) + .recursive( + Top::builder() + .field("World!") + .choice(Choice::Boolean(true)) + .extra(55) + .build() + $maybeUnwrap + ) + .build() + $maybeUnwrap + ) + .boolean(true) + .blob(aws_smithy_types::Blob::new(&b"test"[..])) + .build() + .unwrap(); + let serialized = ${format(operationGenerator!!)}(&input).unwrap(); + let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap(); + assert_eq!( + output, + "\ + Action=Op\ + &Version=test\ + &Some_bool=true\ + &Top.Choice.Choice=true\ + &Top.Field=Hello\ + &Top.Extra=45\ + &Top.Rec.1.Choice.Choice=true\ + &Top.Rec.1.Field=World%21\ + &Top.Rec.1.Extra=55\ + &Blob=dGVzdA%3D%3D" + ); + """, + ) + } + model.lookup("test#Top").also { top -> + top.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(top) { + UnionGenerator(model, symbolProvider, this, model.lookup("test#Choice")).render() + val enum = model.lookup("test#FooEnum") + EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this) + } + } + + model.lookup("test#Op").inputShape(model).also { input -> + input.renderWithModelBuilder(model, symbolProvider, project) + } + project.compileAndTest() + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt index 23c27f331b1..61140ecd420 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt @@ -5,10 +5,13 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize -import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource +import software.amazon.smithy.model.knowledge.NullableIndex import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator @@ -85,6 +88,7 @@ class JsonSerializerGeneratorTest { member: Top } + @input structure OpInput { @httpHeader("x-test") someHeader: String, @@ -98,10 +102,17 @@ class JsonSerializerGeneratorTest { } """.asSmithyModel() - @Test - fun `generates valid serializers`() { + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) { val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) - val codegenContext = testCodegenContext(model) + val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode) val symbolProvider = codegenContext.symbolProvider val parserSerializer = JsonSerializerGenerator( codegenContext, @@ -111,7 +122,7 @@ class JsonSerializerGeneratorTest { val operationGenerator = parserSerializer.operationInputSerializer(model.lookup("test#Op")) val documentGenerator = parserSerializer.documentSerializer() - val project = TestWorkspace.testProject(testSymbolProvider(model)) + val project = TestWorkspace.testProject(symbolProvider) project.lib { unitTest( "json_serializers", @@ -137,7 +148,174 @@ class JsonSerializerGeneratorTest { .choice(Choice::Unknown) .build() ).build().unwrap(); - let serialized = ${format(operationGenerator)}(&input).expect_err("cannot serialize unknown variant"); + ${format(operationGenerator)}(&input).expect_err("cannot serialize unknown variant"); + """, + ) + } + model.lookup("test#Top").also { top -> + top.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(top) { + UnionGenerator(model, symbolProvider, this, model.lookup("test#Choice")).render() + val enum = model.lookup("test#FooEnum") + EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this) + } + } + + model.lookup("test#Op").inputShape(model).also { input -> + input.renderWithModelBuilder(model, symbolProvider, project) + } + project.compileAndTest() + } + + private val baseModelWithRequiredTypes = """ + namespace test + use aws.protocols#restJson1 + + union Choice { + blob: Blob, + boolean: Boolean, + date: Timestamp, + document: Document, + enum: FooEnum, + int: Integer, + list: SomeList, + listSparse: SomeSparseList, + long: Long, + map: MyMap, + mapSparse: MySparseMap, + number: Double, + s: String, + top: Top, + unit: Unit, + } + + @enum([{name: "FOO", value: "FOO"}]) + string FooEnum + + map MyMap { + key: String, + value: Choice, + } + + @sparse + map MySparseMap { + key: String, + value: Choice, + } + + list SomeList { + member: Choice + } + + @sparse + list SomeSparseList { + member: Choice + } + + structure Top { + @required + choice: Choice, + @required + field: String, + @required + extra: Long, + @jsonName("rec") + recursive: TopList + } + + list TopList { + member: Top + } + + @input + structure OpInput { + @httpHeader("x-test") + someHeader: String, + + @required + boolean: Boolean, + list: SomeList, + map: MyMap, + + @required + top: Top + } + + @http(uri: "/top", method: "POST") + operation Op { + input: OpInput, + } + """.asSmithyModel() + + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) { + val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes)) + val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode) + val symbolProvider = codegenContext.symbolProvider + val parserSerializer = JsonSerializerGenerator( + codegenContext, + HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent("application/json")), + ::restJsonFieldName, + ) + val operationGenerator = parserSerializer.operationInputSerializer(model.lookup("test#Op")) + val documentGenerator = parserSerializer.documentSerializer() + + val project = TestWorkspace.testProject(testSymbolProvider(model)) + + // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to + // add unwrap calls. + val builderIsFallible = + BuilderGenerator.hasFallibleBuilder(model.lookup("test#Top"), symbolProvider) + val maybeUnwrap = if (builderIsFallible) { ".unwrap()" } else { "" } + project.lib { + unitTest( + "json_serializers", + """ + use test_model::{Choice, Top}; + + // Generate the document serializer even though it's not tested directly + // ${format(documentGenerator)} + + let input = crate::test_input::OpInput::builder() + .top( + Top::builder() + .field("Hello") + .choice(Choice::Boolean(true)) + .extra(45) + .recursive( + Top::builder() + .field("World!") + .choice(Choice::Boolean(true)) + .extra(55) + .build() + $maybeUnwrap + ) + .build() + $maybeUnwrap + ) + .boolean(true) + .build() + .unwrap(); + let serialized = ${format(operationGenerator!!)}(&input).unwrap(); + let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap(); + assert_eq!(output, r#"{"boolean":true,"top":{"choice":{"boolean":true},"field":"Hello","extra":45,"rec":[{"choice":{"boolean":true},"field":"World!","extra":55}]}}"#); + + let input = crate::test_input::OpInput::builder().top( + Top::builder() + .field("Hello") + .choice(Choice::Unknown) + .extra(45) + .build() + $maybeUnwrap + ).boolean(false).build().unwrap(); + ${format(operationGenerator)}(&input).expect_err("cannot serialize unknown variant"); """, ) } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt index a695d2a4018..2aa24581b55 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt @@ -5,13 +5,18 @@ package software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize -import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.CsvSource +import software.amazon.smithy.model.knowledge.NullableIndex +import software.amazon.smithy.model.shapes.MemberShape import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator +import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolContentTypes import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer @@ -103,10 +108,17 @@ internal class XmlBindingTraitSerializerGeneratorTest { } """.asSmithyModel() - @Test - fun `generates valid serializers`() { + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) { val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel)) - val codegenContext = testCodegenContext(model) + val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode) val symbolProvider = codegenContext.symbolProvider val parserGenerator = XmlBindingTraitSerializerGenerator( codegenContext, @@ -120,14 +132,14 @@ internal class XmlBindingTraitSerializerGeneratorTest { "serialize_xml", """ use test_model::Top; - let inp = crate::test_input::OpInput::builder().payload( + let input = crate::test_input::OpInput::builder().payload( Top::builder() .field("hello!") .extra(45) .recursive(Top::builder().extra(55).build()) .build() ).build().unwrap(); - let serialized = ${format(operationSerializer)}(&inp.payload.unwrap()).unwrap(); + let serialized = ${format(operationSerializer)}(&input.payload.unwrap()).unwrap(); let output = std::str::from_utf8(&serialized).unwrap(); assert_eq!(output, "hello!"); """, @@ -158,4 +170,161 @@ internal class XmlBindingTraitSerializerGeneratorTest { } project.compileAndTest() } + + private val baseModelWithRequiredTypes = """ + namespace test + use aws.protocols#restXml + union Choice { + boolean: Boolean, + @xmlFlattened + @xmlName("Hi") + flatMap: MyMap, + deepMap: MyMap, + @xmlFlattened + flatList: SomeList, + deepList: SomeList, + s: String, + enum: FooEnum, + date: Timestamp, + number: Double, + top: Top, + blob: Blob, + unit: Unit, + } + + @enum([{name: "FOO", value: "FOO"}]) + string FooEnum + + map MyMap { + @xmlName("Name") + key: String, + @xmlName("Setting") + value: Choice, + } + + list SomeList { + member: Choice + } + + + structure Top { + @required + choice: Choice, + @required + field: String, + @required + @xmlAttribute + extra: Long, + @xmlName("prefix:local") + renamedWithPrefix: String, + @xmlName("rec") + @xmlFlattened + recursive: TopList + } + + list TopList { + member: Top + } + + @input + structure OpInput { + @required + @httpPayload + payload: Top + } + + @http(uri: "/top", method: "POST") + operation Op { + input: OpInput, + } + """.asSmithyModel() + + @ParameterizedTest + @CsvSource( + "CLIENT", + "CLIENT_CAREFUL", + "CLIENT_ZERO_VALUE_V1", + "CLIENT_ZERO_VALUE_V1_NO_INPUT", + "SERVER", + ) + fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) { + val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes)) + val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode) + val symbolProvider = codegenContext.symbolProvider + val parserGenerator = XmlBindingTraitSerializerGenerator( + codegenContext, + HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent("application/xml")), + ) + val operationSerializer = parserGenerator.payloadSerializer(model.lookup("test#OpInput\$payload")) + + val project = TestWorkspace.testProject(symbolProvider) + + // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to + // add unwrap calls. + val builderIsFallible = + BuilderGenerator.hasFallibleBuilder(model.lookup("test#Top"), symbolProvider) + val maybeUnwrap = if (builderIsFallible) { ".unwrap()" } else { "" } + val payloadIsOptional = model.lookup("test#OpInput\$payload").let { + symbolProvider.toSymbol(it).isOptional() + } + val maybeUnwrapPayload = if (payloadIsOptional) { ".unwrap()" } else { "" } + project.lib { + unitTest( + "serialize_xml", + """ + use test_model::{Choice, Top}; + + let input = crate::test_input::OpInput::builder() + .payload( + Top::builder() + .field("Hello") + .choice(Choice::Boolean(true)) + .extra(45) + .recursive( + Top::builder() + .field("World!") + .choice(Choice::Boolean(true)) + .extra(55) + .build() + $maybeUnwrap + ) + .build() + $maybeUnwrap + ) + .build() + .unwrap(); + let serialized = ${format(operationSerializer)}(&input.payload$maybeUnwrapPayload).unwrap(); + let output = std::str::from_utf8(&serialized).unwrap(); + assert_eq!(output, "trueHellotrueWorld!"); + """, + ) + unitTest( + "unknown_variants", + """ + use test_model::{Choice, Top}; + let input = crate::test_input::OpInput::builder().payload( + Top::builder() + .field("Hello") + .choice(Choice::Unknown) + .extra(45) + .build() + $maybeUnwrap + ).build().unwrap(); + ${format(operationSerializer)}(&input.payload$maybeUnwrapPayload).expect_err("cannot serialize unknown variant"); + """, + ) + } + model.lookup("test#Top").also { top -> + top.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(top) { + UnionGenerator(model, symbolProvider, this, model.lookup("test#Choice")).render() + val enum = model.lookup("test#FooEnum") + EnumGenerator(model, symbolProvider, enum, TestEnumType).render(this) + } + } + model.lookup("test#Op").inputShape(model).also { input -> + input.renderWithModelBuilder(model, symbolProvider, project) + } + project.compileAndTest() + } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt index 1dfc41795df..110836fdadd 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt @@ -11,13 +11,14 @@ import org.junit.jupiter.api.assertThrows import software.amazon.smithy.model.Model import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.lookup class RecursiveShapesIntegrationTest { @@ -50,7 +51,7 @@ class RecursiveShapesIntegrationTest { val structures = listOf("Expr", "SecondTree").map { input.lookup("com.example#$it") } structures.forEach { struct -> project.moduleFor(struct) { - StructureGenerator(input, symbolProvider, this, struct, emptyList()).render() + StructureGenerator(input, symbolProvider, this, struct, emptyList(), StructSettings(true)).render() } } input.lookup("com.example#Atom").also { atom -> @@ -61,7 +62,7 @@ class RecursiveShapesIntegrationTest { project } val unmodifiedProject = check(model) - val output = assertThrows { + val output = assertThrows { unmodifiedProject.compileAndTest(expectFailure = true) } // THIS IS A LOAD-BEARING shouldContain! If the compiler error changes then this will break! diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt index aab2b706130..5041166fb70 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test internal class ExecKtTest { @Test fun `missing command throws CommandFailed`() { - shouldThrow { + shouldThrow { "notaprogram run".runCommand() } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt index ff029c0e182..af4e65d450e 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt @@ -7,6 +7,14 @@ package software.amazon.smithy.rust.codegen.core.util import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtensionContext +import org.junit.jupiter.api.fail +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.ArgumentsProvider +import org.junit.jupiter.params.provider.ArgumentsSource +import java.io.File +import java.util.stream.Stream internal class StringsTest { @@ -18,4 +26,77 @@ internal class StringsTest { "{\"nested\": \"{\\\"nested\\\": 5}\"}\"}" """.trimIndent().trim() } + + @Test + fun correctlyConvertToSnakeCase() { + "NotificationARNs".toSnakeCase() shouldBe "notification_arns" + } + + @Test + fun testAllNames() { + // Set this to true to write a new test expectation file + val publishUpdate = false + val allNames = this::class.java.getResource("/testOutput.txt")?.readText()!! + val errors = mutableListOf() + val output = StringBuilder() + allNames.lines().filter { it.isNotBlank() }.forEach { + val split = it.split(',') + val input = split[0] + val expectation = split[1] + val actual = input.toSnakeCase() + if (input.toSnakeCase() != expectation) { + errors += "$it => $actual (expected $expectation)" + } + output.appendLine("$input,$actual") + } + if (publishUpdate) { + File("testOutput.txt").writeText(output.toString()) + } + if (errors.isNotEmpty()) { + fail(errors.joinToString("\n")) + } + } + + @ParameterizedTest + @ArgumentsSource(TestCasesProvider::class) + fun testSnakeCase(input: String, output: String) { + input.toSnakeCase() shouldBe output + } +} + +class TestCasesProvider : ArgumentsProvider { + override fun provideArguments(context: ExtensionContext?): Stream = + listOf( + "ACLs" to "acls", + "ACLsUpdateStatus" to "acls_update_status", + "AllowedAllVPCs" to "allowed_all_vpcs", + "BluePrimaryX" to "blue_primary_x", + "CIDRs" to "cidrs", + "AuthTtL" to "auth_ttl", + "CNAMEPrefix" to "cname_prefix", + "S3Location" to "s3_location", + "signatureS" to "signature_s", + "signatureR" to "signature_r", + "M3u8Settings" to "m3u8_settings", + "IAMUser" to "iam_user", + "OtaaV1_0_x" to "otaa_v1_0_x", + "DynamoDBv2Action" to "dynamo_dbv2_action", + "SessionKeyEmv2000" to "session_key_emv2000", + "SupportsClassB" to "supports_class_b", + "UnassignIpv6AddressesRequest" to "unassign_ipv6_addresses_request", + "TotalGpuMemoryInMiB" to "total_gpu_memory_in_mib", + "WriteIOs" to "write_ios", + "dynamoDBv2" to "dynamo_dbv2", + "ipv4Address" to "ipv4_address", + "sigv4" to "sigv4", + "s3key" to "s3_key", + "sha256sum" to "sha256_sum", + "Av1QvbrSettings" to "av1_qvbr_settings", + "Av1Settings" to "av1_settings", + "AwsElbv2LoadBalancer" to "aws_elbv2_load_balancer", + "SigV4Authorization" to "sigv4_authorization", + "IpV6Address" to "ipv6_address", + "IpV6Cidr" to "ipv6_cidr", + "IpV4Addresses" to "ipv4_addresses", + ).map { Arguments.of(it.first, it.second) }.stream() } diff --git a/codegen-core/src/test/resources/allNames.txt b/codegen-core/src/test/resources/allNames.txt new file mode 100644 index 00000000000..7f2a5ac7ab5 --- /dev/null +++ b/codegen-core/src/test/resources/allNames.txt @@ -0,0 +1,62988 @@ +ACL +ACLAlreadyExistsFault +ACLName +ACLNames +ACLNotFoundFault +ACLPendingChanges +ACLQuotaExceededFault +ACLToApply +ACLs +ACLsUpdateStatus +ACMCertificateArn +ACTIVE +ADDomainJoinPassword +ADDomainJoinUser +ADM +ADMChannelRequest +ADMChannelResponse +ADMMessage +ALPNPolicyNotSupportedException +APICallRateForCustomerExceededFault +APIKey +APIKeySummaries +APIKeySummary +APIName +APNS +APNSChannelRequest +APNSChannelResponse +APNSMessage +APNSPushNotificationTemplate +APNSPushType +APNSSandboxChannelRequest +APNSSandboxChannelResponse +APNSVoipChannelRequest +APNSVoipChannelResponse +APNSVoipSandboxChannelRequest +APNSVoipSandboxChannelResponse +ARN +ASN1Subject +ASName +ASNumber +ASSERTION +ATIMetricDataPoint +ATIModelPerformance +ATITrainingMetricsValue +AWSAccessKeyId +AWSAccount +AWSAccountId +AWSAccountIds +AWSCost +AWSDomainInformation +AWSKMSKeyARN +AWSLocation +AWSManagedRulesACFPRuleSet +AWSManagedRulesATPRuleSet +AWSManagedRulesBotControlRuleSet +AWSOrganizationsNotInUseException +AWSService +AWSServiceAccessNotEnabledException +AWSServiceName +AWSSessionCredentials +AZList +AZMode +AacSettings +AbortConfig +AbortCriteria +AbortDate +AbortDocumentVersionUploadRequest +AbortEnvironmentUpdateMessage +AbortIncompleteMultipartUpload +AbortMultipartReadSetUploadRequest +AbortMultipartUploadInput +AbortMultipartUploadOutput +AbortMultipartUploadRequest +AbortRuleId +AbortTransaction +AbortTransactionResult +AbortVaultLockInput +AbortableOperationInProgress +AbpV1_0_x +AbpV1_1 +AbrSettings +AbsentInputAudioBehavior +AbsoluteTime +AbsoluteTimeRange +AbuseContactEmail +AbuseContactPhone +Ac3Settings +AccelerateConfiguration +AccelerationSettings +AccelerationStatus +Accelerator +AcceleratorArn +AcceleratorAttributes +AcceleratorCount +AcceleratorCountRequest +AcceleratorEvent +AcceleratorManufacturers +AcceleratorNames +AcceleratorNotDisabledException +AcceleratorNotFoundException +AcceleratorPort +AcceleratorSocketAddresses +AcceleratorTotalMemoryMiB +AcceleratorTotalMemoryMiBRequest +AcceleratorType +AcceleratorTypeOffering +AcceleratorTypes +Accelerators +Accent +AccentForeground +Accept +AcceptAddressTransferRequest +AcceptAddressTransferResult +AcceptAdministratorInvitationRequest +AcceptAnyDate +AcceptAttachmentRequest +AcceptAttachmentResponse +AcceptCertificateTransferRequest +AcceptCode +AcceptCodeValidation +AcceptDirectConnectGatewayAssociationProposalRequest +AcceptDirectConnectGatewayAssociationProposalResult +AcceptDomainTransferFromAnotherAwsAccountRequest +AcceptDomainTransferFromAnotherAwsAccountResponse +AcceptEnvironmentAccountConnectionInput +AcceptEnvironmentAccountConnectionOutput +AcceptEulasRequest +AcceptEulasResponse +AcceptGrantRequest +AcceptGrantResponse +AcceptHandshakeRequest +AcceptHandshakeResponse +AcceptInboundConnectionRequest +AcceptInboundConnectionResponse +AcceptInboundCrossClusterSearchConnectionRequest +AcceptInboundCrossClusterSearchConnectionResponse +AcceptInputDeviceTransferRequest +AcceptInvitationRequest +AcceptLanguage +AcceptMatchInput +AcceptPageRequest +AcceptPortfolioShareInput +AcceptQualificationRequestRequest +AcceptRanges +AcceptReservedInstancesExchangeQuoteRequest +AcceptReservedInstancesExchangeQuoteResult +AcceptReservedNodeExchangeInputMessage +AcceptReservedNodeExchangeOutputMessage +AcceptResourceShareInvitationRequest +AcceptResourceShareInvitationResponse +AcceptShareRequest +AcceptShareResponse +AcceptSharedDirectoryRequest +AcceptSharedDirectoryResult +AcceptTermsAndConditions +AcceptTime +AcceptTransitGatewayMulticastDomainAssociationsRequest +AcceptTransitGatewayMulticastDomainAssociationsResult +AcceptTransitGatewayPeeringAttachmentRequest +AcceptTransitGatewayPeeringAttachmentResult +AcceptTransitGatewayVpcAttachmentRequest +AcceptTransitGatewayVpcAttachmentResult +AcceptType +AcceptVpcEndpointConnectionsRequest +AcceptVpcEndpointConnectionsResult +AcceptVpcPeeringConnectionRequest +AcceptVpcPeeringConnectionResult +AcceptanceRequired +AcceptanceThreshold +AcceptanceTimeoutSeconds +AcceptanceType +Accepted +AcceptedRouteCount +AccepterPeeringConnectionOptions +AccepterTgwInfo +AccepterTransitGatewayAttachmentId +AccepterVpcInfo +Access +AccessAll +AccessAlternateDirectly +AccessBasedEnumeration +AccessConfiguration +AccessControl +AccessControlAllowCredentials +AccessControlAllowHeaders +AccessControlAllowMethods +AccessControlAllowOrigins +AccessControlAttribute +AccessControlAttributeValue +AccessControlAttributes +AccessControlConfigurationId +AccessControlConfigurationSummary +AccessControlConfigurations +AccessControlEntries +AccessControlEntry +AccessControlEntrySummary +AccessControlExposeHeaders +AccessControlGrants +AccessControlList +AccessControlListConfiguration +AccessControlMaxAgeSec +AccessControlPolicy +AccessControlRule +AccessControlTranslation +AccessDenied +AccessDeniedException +AccessDeniedFault +AccessDeniedForDependencyException +AccessDescription +AccessDetail +AccessDetails +AccessEndpoint +AccessEndpoints +AccessForbidden +AccessGroupId +AccessKey +AccessKeyDetails +AccessKeyId +AccessKeyLastUsed +AccessKeyMetadata +AccessLevelFilter +AccessLocation +AccessLog +AccessLogSettings +AccessLogSubscriptionSummary +AccessLoggingEnabled +AccessLogs +AccessMethod +AccessMethodType +AccessPoint +AccessPointAlreadyExists +AccessPointArn +AccessPointDescription +AccessPointId +AccessPointLimitExceeded +AccessPointList +AccessPointNotFound +AccessPointNotFoundException +AccessPoints +AccessPolicies +AccessPoliciesStatus +AccessPolicy +AccessPolicyDetail +AccessPolicyStats +AccessPolicySummary +AccessPreview +AccessPreviewFinding +AccessPreviewStatusReason +AccessPreviewSummary +AccessRights +AccessRole +AccessRoleArn +AccessRules +AccessScopeAnalysisFinding +AccessScopePath +AccessScopePathRequest +AccessStatus +AccessString +AccessSysfs +AccessTier +AccessToClusterDeniedFault +AccessToSnapshotDeniedFault +AccessToken +AccessTokenExpiration +AccessTokenSummary +AccessTokenValidity +AccessType +AccessUrl +Accesses +Accessibility +AccessibilityCaptionHints +Accessor +AccessorId +AccessorSummary +AccessorType +Accessors +Account +AccountActionRequiredException +AccountAggregation +AccountAggregationResponse +AccountAggregationSource +AccountAggregationSources +AccountAlias +AccountAliases +AccountAlreadyClosedException +AccountAlreadyRegisteredException +AccountAssignment +AccountAssignmentCreationRequestId +AccountAssignmentCreationStatus +AccountAssignmentDeletionRequestId +AccountAssignmentDeletionStatus +AccountAssignmentOperationStatus +AccountAssignmentOperationStatusMetadata +AccountAssignments +AccountAssignmentsCreationStatus +AccountAssignmentsDeletionStatus +AccountAssociationsListElement +AccountAttribute +AccountAttributeList +AccountAttributeValue +AccountAttributes +AccountAttributesMessage +AccountChannelLimitExceededException +AccountConfiguration +AccountCustomization +AccountDetail +AccountDetails +AccountEmail +AccountEnrollmentStatus +AccountEntityAggregate +AccountFilterType +AccountFindingsMetric +AccountFreeTrialInfo +AccountGateResult +AccountGrouping +AccountHasOngoingImportException +AccountHealth +AccountID +AccountId +AccountIds +AccountIdsToAdd +AccountIdsToRemove +AccountInfo +AccountInsightHealth +AccountLevel +AccountLevelBpaSync +AccountLevelPermissions +AccountLimit +AccountLimitExceededException +AccountLimits +AccountLinked +AccountMaxReadCapacityUnits +AccountMaxWriteCapacityUnits +AccountModification +AccountModifications +AccountName +AccountNotFoundException +AccountNotRegisteredException +AccountNumber +AccountOwnerNotVerifiedException +AccountPassword +AccountPolicy +AccountQuota +AccountQuotaName +AccountQuotas +AccountRecoverySetting +AccountRecoverySettingType +AccountRegisteredException +AccountScope +AccountSendingPausedException +AccountSettings +AccountSettingsDetail +AccountSetupInProgressException +AccountSharingInfo +AccountSharingInfoList +AccountState +AccountStatus +AccountStatusList +AccountStreamLimitExceededException +AccountSubscriptionStatus +AccountSummary +AccountSuspendedException +AccountTakeoverActionType +AccountTakeoverActionsType +AccountTakeoverRiskConfiguration +AccountTakeoverRiskConfigurationType +AccountType +AccountUsage +AccountWithRestoreAccess +Accounts +AccountsUrl +AccountsWithRestoreAccess +AccumulatedInferenceDataEndTime +AccumulatedInferenceDataStartTime +Accuracy +AccuracyCostTradeoff +AckModeRetryDurationSecs +AcknowledgeActionConfiguration +AcknowledgeAlarmActionRequest +AcknowledgeFlow +AcknowledgeJobInput +AcknowledgeJobOutput +AcknowledgeOrderReceiptRequest +AcknowledgeOrderReceiptResponse +AcknowledgeThirdPartyJobInput +AcknowledgeThirdPartyJobOutput +AcknowledgedAt +Acl +AclConfiguration +AclRule +AcmCertificateArn +AcquisitionPointId +Action +ActionAfterCompletion +ActionArn +ActionCondition +ActionConfiguration +ActionConfigurationProperty +ActionContext +ActionDeclaration +ActionDefinition +ActionDescription +ActionExecution +ActionExecutionDetail +ActionExecutionFilter +ActionExecutionInput +ActionExecutionOutput +ActionExecutionResult +ActionHistories +ActionHistory +ActionHistoryDetails +ActionID +ActionId +ActionIdentifier +ActionInvocation +ActionInvocations +ActionLocalIpDetails +ActionLocalPortDetails +ActionName +ActionNames +ActionNotFoundException +ActionOnFailure +ActionOperations +ActionParameter +ActionParameters +ActionPrefix +ActionRemoteIpDetails +ActionRemotePortDetails +ActionRequired +ActionRequiredCode +ActionRequiredInfo +ActionRevision +ActionSource +ActionState +ActionSubType +ActionSummaries +ActionSummary +ActionTarget +ActionTargetArn +ActionTargetArns +ActionTargets +ActionThreshold +ActionThresholdType +ActionThresholdValue +ActionToUse +ActionType +ActionTypeArtifactDetails +ActionTypeDeclaration +ActionTypeExecutor +ActionTypeId +ActionTypeIdentifier +ActionTypeNotFoundException +ActionTypePermissions +ActionTypeProperty +ActionTypeSettings +ActionTypeUrls +Actions +ActionsEnabled +ActionsGuarded +ActionsRequired +ActionsSuppressedBy +ActionsSuppressedReason +ActionsSuppressor +ActionsSuppressorExtensionPeriod +ActionsSuppressorWaitPeriod +Activate +ActivateAnomalyDetectorRequest +ActivateContactChannelRequest +ActivateDeviceIdentifierRequest +ActivateDeviceIdentifierResponse +ActivateEvaluationFormRequest +ActivateEvaluationFormResponse +ActivateEventSourceRequest +ActivateGatewayInput +ActivateGatewayOutput +ActivateKeySigningKeyRequest +ActivateKeySigningKeyResponse +ActivateNetworkSiteRequest +ActivateNetworkSiteResponse +ActivatePipelineInput +ActivateReadSetFilter +ActivateReadSetJobItem +ActivateReadSetSourceItem +ActivateTypeInput +ActivateTypeOutput +ActivateUserRequest +ActivateUserResponse +Activated +ActivatedRule +ActivatedRules +Activation +ActivationCode +ActivationId +ActivationKey +ActivationList +ActivationOverrideBehavior +ActivationState +ActivationStatus +ActivationUrl +Active +ActiveAssignments +ActiveAvailabilityZoneCount +ActiveChannelPipeline +ActiveContext +ActiveContextTimeToLive +ActiveDate +ActiveDeviceCount +ActiveDirectory +ActiveDirectoryBackupAttributes +ActiveDirectoryComputerAttribute +ActiveDirectoryConfiguration +ActiveDirectoryError +ActiveDirectoryId +ActiveDirectoryIdentityProvider +ActiveDirectoryName +ActiveDirectoryStatus +ActiveGameSessionCount +ActiveIAMPolicyAssignment +ActiveInput +ActiveInputAttachmentName +ActiveInputSwitchActionName +ActiveInstance +ActiveInstanceRefreshNotFoundFault +ActiveInstances +ActiveMQBrokerParameters +ActiveModelArn +ActiveModelVersion +ActiveModelVersionArn +ActiveMotionGraphicsActionName +ActiveMotionGraphicsUri +ActiveNodes +ActiveOperationArn +ActiveServerProcessCount +ActiveServicesCount +ActiveSlotsByChannel +ActiveSpeakerOnlyConfiguration +ActiveSpeakerPosition +ActiveStatementsExceededException +ActiveSubscribedDomains +ActiveTracing +ActiveTrustedKeyGroups +ActiveTrustedSigners +ActiveVersion +ActiveViolation +ActiveWatermarkProcess +Activities +ActivitiesResponse +ActivitiesType +Activity +ActivityDoesNotExist +ActivityFailedEventDetails +ActivityId +ActivityIds +ActivityLimitExceeded +ActivityListItem +ActivityMetrics +ActivityResponse +ActivityScheduleFailedEventDetails +ActivityScheduledEventDetails +ActivityStartedEventDetails +ActivityStatus +ActivityStreamEngineNativeAuditFieldsIncluded +ActivityStreamKinesisStreamName +ActivityStreamKmsKeyId +ActivityStreamMode +ActivityStreamPolicyStatus +ActivityStreamStatus +ActivitySucceededEventDetails +ActivityTask +ActivityTaskCancelRequestedEventAttributes +ActivityTaskCanceledEventAttributes +ActivityTaskCompletedEventAttributes +ActivityTaskFailedEventAttributes +ActivityTaskScheduledEventAttributes +ActivityTaskStartedEventAttributes +ActivityTaskStatus +ActivityTaskTimedOutEventAttributes +ActivityTimedOutEventDetails +ActivityType +ActivityTypeConfiguration +ActivityTypeDetail +ActivityTypeInfo +ActivityTypeInfos +ActivityTypes +ActivityWorkerLimitExceeded +ActorDoesNotExistException +Actual +ActualAmount +ActualBlockHourlyPrice +ActualEndTime +ActualFirewallEndpoint +ActualFirewallSubnetId +ActualFirewallSubnetRoutes +ActualIncrementalBackupSizeInMegaBytes +ActualInternetGatewayRoutes +ActualProperties +ActualSpend +ActualStartTime +ActualValue +Actuator +AdAvailOffset +AdBreak +AdBreakMetadata +AdBreaks +AdDecisionServerUrl +AdHocFilteringOption +AdMarkerHls +AdMarkerPassthrough +AdMarkers +AdMarkupType +AdSegmentUrlPrefix +AdTriggers +AdaptiveQuantization +Add +AddAllocationResourceTags +AddAllowedPrincipals +AddApplicationCloudWatchLoggingOptionRequest +AddApplicationCloudWatchLoggingOptionResponse +AddApplicationInputProcessingConfigurationRequest +AddApplicationInputProcessingConfigurationResponse +AddApplicationInputRequest +AddApplicationInputResponse +AddApplicationOutputRequest +AddApplicationOutputResponse +AddApplicationReferenceDataSourceRequest +AddApplicationReferenceDataSourceResponse +AddApplicationVpcConfigurationRequest +AddApplicationVpcConfigurationResponse +AddArguments +AddAssociationRequest +AddAssociationResponse +AddAttachmentsToSetRequest +AddAttachmentsToSetResponse +AddAttributesActivity +AddAttributesToFindingsRequest +AddAttributesToFindingsResponse +AddAvailabilityZonesInput +AddAvailabilityZonesOutput +AddBridgeFlowSourceRequest +AddBridgeNetworkOutputRequest +AddBridgeNetworkSourceRequest +AddBridgeOutputRequest +AddBridgeOutputsRequest +AddBridgeOutputsResponse +AddBridgeSourceRequest +AddBridgeSourcesRequest +AddBridgeSourcesResponse +AddCacheInput +AddCacheOutput +AddClientIDToOpenIDConnectProviderRequest +AddColumnName +AddCommunicationToCaseRequest +AddCommunicationToCaseResponse +AddCustomAttributesRequest +AddCustomRoutingEndpointsRequest +AddCustomRoutingEndpointsResponse +AddDraftAppVersionResourceMappingsRequest +AddDraftAppVersionResourceMappingsResponse +AddEgressGatewayBridgeRequest +AddEndpointsRequest +AddEndpointsResponse +AddEntries +AddFacetToObject +AddFacetToObjectRequest +AddFlowMediaStreamsRequest +AddFlowMediaStreamsResponse +AddFlowOutputs420Exception +AddFlowOutputsRequest +AddFlowOutputsResponse +AddFlowSourcesRequest +AddFlowSourcesResponse +AddFlowVpcInterfacesRequest +AddFlowVpcInterfacesResponse +AddGatewayLoadBalancerArns +AddGwMetadata +AddHeaderAction +AddIamRoles +AddIdleTimeBetweenReads +AddInId +AddIngressGatewayBridgeRequest +AddIns +AddInstanceFleetInput +AddInstanceFleetOutput +AddInstanceGroupsInput +AddInstanceGroupsOutput +AddIpRoutesRequest +AddIpamOperatingRegion +AddJobFlowStepsInput +AddJobFlowStepsOutput +AddLFTagsToResourceRequest +AddLFTagsToResourceResponse +AddLayerVersionPermissionRequest +AddLayerVersionPermissionResponse +AddLicenseSpecifications +AddListenerCertificatesInput +AddListenerCertificatesOutput +AddMaintenance +AddMediaStreamRequest +AddNetworkLoadBalancerArns +AddNetworkServices +AddNotificationChannelRequest +AddNotificationChannelResponse +AddNotificationChannelsRequest +AddNotificationChannelsResponse +AddObject +AddObjectInput +AddOn +AddOnRequest +AddOperatingRegions +AddOutputRequest +AddPermissionInput +AddPermissionRequest +AddPermissionResponse +AddPrefixListEntry +AddProfileKeyRequest +AddProfileKeyResponse +AddProfilePermissionRequest +AddProfilePermissionResponse +AddPublicKeys +AddRecordTimestamp +AddRegionAction +AddRegionRequest +AddReplicaRegions +AddResourcePermissionsRequest +AddResourcePermissionsResponse +AddRoleToDBClusterMessage +AddRoleToDBInstanceMessage +AddRoleToInstanceProfileRequest +AddRouteTableIds +AddSecurityGroupIds +AddSourceIdentifierToSubscriptionMessage +AddSourceIdentifierToSubscriptionResult +AddStorageSystemRequest +AddStorageSystemResponse +AddSubnetArns +AddSubnetIds +AddSubnets +AddSupplementalLogging +AddSupportedIpAddressTypes +AddTags +AddTagsInput +AddTagsOutput +AddTagsRequest +AddTagsToCertificateRequest +AddTagsToOnPremisesInstancesInput +AddTagsToResourceInput +AddTagsToResourceMessage +AddTagsToResourceOutput +AddTagsToResourceRequest +AddTagsToResourceResponse +AddTagsToStreamInput +AddTagsToVaultInput +AddTexture +AddThingToBillingGroupRequest +AddThingToThingGroupRequest +AddThingsToThingGroupParams +AddTrailingPaddingCharacter +AddTransitGatewayCidrBlocks +AddUploadBufferInput +AddUploadBufferOutput +AddUserToGroupRequest +AddWorkingStorageInput +AddWorkingStorageOutput +AddWorkloadRequest +AddWorkloadResponse +AddedDateTime +AddedPrincipal +AddedPrincipals +AddedToClusterTime +AdditionalAccounts +AdditionalArchivedLogDestId +AdditionalArtifacts +AdditionalAttribute +AdditionalAttributes +AdditionalAuditContext +AdditionalAuthTypes +AdditionalAuthenticationProvider +AdditionalAuthenticationProviders +AdditionalBootstrapServers +AdditionalCodeRepositories +AdditionalCodeRepositoryEquals +AdditionalConfigs +AdditionalConfiguration +AdditionalConstraints +AdditionalContactEmailAddresses +AdditionalDashboardIds +AdditionalDataPending +AdditionalDataSources +AdditionalDataset +AdditionalDatasets +AdditionalDeltaOptions +AdditionalDetail +AdditionalDetailType +AdditionalDetails +AdditionalHudiOptions +AdditionalInferenceSpecificationDefinition +AdditionalInferenceSpecifications +AdditionalInferenceSpecificationsToAdd +AdditionalInfo +AdditionalInformation +AdditionalInstanceConfiguration +AdditionalLanguageCodes +AdditionalLimit +AdditionalLimits +AdditionalLocations +AdditionalManifests +AdditionalMasterSecurityGroups +AdditionalMetadata +AdditionalMetrics +AdditionalOccurrences +AdditionalOptions +AdditionalPlanOptionsMap +AdditionalPlayerCount +AdditionalRegions +AdditionalResources +AdditionalResponseAttributes +AdditionalResponseFields +AdditionalResultAttribute +AdditionalResultAttributeValue +AdditionalRoutesAvailable +AdditionalRunOptions +AdditionalSchemaElements +AdditionalSearchKey +AdditionalSearchKeys +AdditionalSlaveSecurityGroups +AdditionalStagingLabelsToDownload +AdditionalStatistics +AdditionalTreatments +AdditionalVersionWeights +Addon +AddonDetails +AddonHealth +AddonInfo +AddonIssue +AddonStatus +AddonVersion +AddonVersionInfo +Address +Address1 +Address2 +Address3 +Address4 +AddressAllocationIds +AddressAttribute +AddressBook +AddressBookArn +AddressBookData +AddressBooks +AddressConfiguration +AddressCount +AddressDefinition +AddressExternalId +AddressFamily +AddressField +AddressFields +AddressId +AddressLine1 +AddressLine2 +AddressLine3 +AddressNumber +AddressTransfer +AddressTransferStatus +AddressTransfers +AddressType +Addresses +AddressingType +AdiFilename +AdjacentParentShardId +AdjacentShardToMerge +Adjustable +Adjustment +AdjustmentType +AdjustmentTypes +Adjustments +Admin +AdminAccount +AdminAccountId +AdminAccountSummary +AdminAccounts +AdminAddUserToGroupRequest +AdminConfirmSignUpRequest +AdminContact +AdminCreateUserConfig +AdminCreateUserConfigType +AdminCreateUserRequest +AdminCreateUserResponse +AdminDeleteUserAttributesRequest +AdminDeleteUserRequest +AdminDetectorId +AdminDisableProviderForUserRequest +AdminDisableUserRequest +AdminEnableUserRequest +AdminForgetDeviceRequest +AdminGetDeviceRequest +AdminGetDeviceResponse +AdminGetUserRequest +AdminGetUserResponse +AdminGroup +AdminInitiateAuthRequest +AdminInitiateAuthResponse +AdminLinkProviderForUserRequest +AdminListDevicesRequest +AdminListDevicesResponse +AdminListGroupsForUserRequest +AdminListGroupsForUserResponse +AdminListUserAuthEventsRequest +AdminListUserAuthEventsResponse +AdminPassword +AdminPrivacy +AdminRemoveUserFromGroupRequest +AdminResetUserPasswordRequest +AdminRespondToAuthChallengeRequest +AdminRespondToAuthChallengeResponse +AdminScope +AdminSetUserMFAPreferenceRequest +AdminSetUserPasswordRequest +AdminSetUserSettingsRequest +AdminStatus +AdminUpdateAuthEventFeedbackRequest +AdminUpdateDeviceStatusRequest +AdminUpdateUserAttributesRequest +AdminUserGlobalSignOutRequest +AdminUserList +AdminUsername +AdministrationRoleARN +AdministrativeAction +AdministrativeActionFailureDetails +AdministrativeActionType +AdministrativeActions +Administrator +AdministratorId +Administrators +AdsOnDeliveryRestrictions +AdvancedBackupSetting +AdvancedBackupSettings +AdvancedCostOptimizationMetrics +AdvancedDataProtectionMetrics +AdvancedEventSelector +AdvancedEventSelectors +AdvancedFieldSelector +AdvancedInputFilter +AdvancedInputFilterSettings +AdvancedOptions +AdvancedOptionsStatus +AdvancedRecognitionSetting +AdvancedSecurityEnabled +AdvancedSecurityMode +AdvancedSecurityOptions +AdvancedSecurityOptionsInput +AdvancedSecurityOptionsStatus +AdvertiseByoipCidrRequest +AdvertiseByoipCidrResponse +AdvertiseByoipCidrResult +AdvisoryIds +AfdSignaling +AffectedEntity +AffectedResource +AffectedResources +AffectedSensorCount +AffectedSubnets +Affiliated +Affinity +After +AfterConnectScript +AfterContactWorkTimeLimit +AfterCreationDate +AfterFragmentNumber +AgeRange +AgentAlreadyRunningAssessment +AgentArn +AgentArns +AgentAvailabilityTimer +AgentConfig +AgentConfiguration +AgentConfigurationStatus +AgentContactReference +AgentContactState +AgentCount +AgentDetails +AgentFilter +AgentInfo +AgentInstallerUrl +AgentListEntry +AgentMetrics +AgentName +AgentNetworkInfo +AgentOrchestrationConfig +AgentPreview +AgentStatus +AgentStatusARN +AgentStatusId +AgentStatusReference +AgentStatusSummary +AgentStatusSummaryList +AgentStatusTypes +AgentTurnResult +AgentTurnSpecification +AgentVersion +AgentVersions +AgentlessDialerConfig +Agents +AgentsAlreadyRunningAssessmentException +AggFunc +Aggregate +AggregateBy +AggregateColumn +AggregateComplianceByConfigRule +AggregateComplianceByConfigRules +AggregateComplianceByConformancePack +AggregateComplianceByConformancePacks +AggregateComplianceCount +AggregateComplianceCounts +AggregateConformancePackCompliance +AggregateConformancePackComplianceCount +AggregateConformancePackComplianceFilters +AggregateConformancePackComplianceSummaries +AggregateConformancePackComplianceSummary +AggregateConformancePackComplianceSummaryFilters +AggregateEvaluationResult +AggregateEvaluationResults +AggregateKeyType +AggregateOperation +AggregateResourceIdentifier +AggregateStatus +AggregateValue +AggregatedLogOddsMetric +AggregatedProfileTime +AggregatedSourceStatus +AggregatedSourceStatusList +AggregatedUtterancesFilter +AggregatedUtterancesSortBy +AggregatedUtterancesSummary +AggregatedValue +AggregatedVariablesImpactExplanation +AggregatedVariablesImportanceMetrics +Aggregates +Aggregation +AggregationAuthorization +AggregationAuthorizationArn +AggregationAuthorizations +AggregationConfig +AggregationConstraint +AggregationEnabled +AggregationFunction +AggregationFunctionParameters +AggregationSortConfiguration +AggregationSortConfigurations +AggregationStatistic +AggregationType +AggregationVisibility +Aggregations +Aggregator +AggregatorType +Aggregators +AggressiveMode +Aggs +Agreement +AgreementId +Agreements +AiffSettings +AirflowConfigurationOptions +AirflowVersion +Alarm +AlarmARN +AlarmAction +AlarmActions +AlarmArn +AlarmCapabilities +AlarmConfiguration +AlarmConfigurationUpdatedTimestamp +AlarmDescription +AlarmEventActions +AlarmHistoryItem +AlarmHistoryItems +AlarmIdentifier +AlarmModelSummary +AlarmModelVersionSummary +AlarmName +AlarmNamePrefix +AlarmNames +AlarmNotification +AlarmRecommendation +AlarmRoleArn +AlarmRule +AlarmSpecification +AlarmState +AlarmStateInformation +AlarmSummary +AlarmType +AlarmTypes +Alarms +AlarmsLimitExceededException +AlbumArt +AlbumArtFormat +Alert +AlertArn +AlertCode +AlertDescription +AlertFilters +AlertManagerDefinitionDescription +AlertManagerDefinitionStatus +AlertMessage +AlertName +AlertSensitivityThreshold +AlertStatus +AlertSummary +AlertSummaryList +AlertTarget +AlertType +AlexaForBusinessMetadata +AlexaForBusinessRoomArn +AlexaSkillIds +AlexaSkillStatus +AlfrescoConfiguration +Algorithm +AlgorithmArn +AlgorithmControl +AlgorithmDescription +AlgorithmImage +AlgorithmName +AlgorithmSpecification +AlgorithmStatus +AlgorithmStatusDetails +AlgorithmStatusItem +AlgorithmSummary +AlgorithmSummaryList +AlgorithmValidationProfile +AlgorithmValidationSpecification +AlgorithmicStemming +AlgorithmsConfig +Alias +AliasArn +AliasAttributes +AliasConfiguration +AliasExistsException +AliasICPRecordal +AliasICPRecordals +AliasId +AliasIds +AliasListEntry +AliasName +AliasPrefix +AliasRoutingConfiguration +AliasTarget +Aliased +Aliases +AliasesToAdd +AliasesToDelete +AlignedEndTime +AlignedStartTime +Alignment +All +AllAccountsEnabled +AllAvailabilityZones +AllAwsRegions +AllColumnsRequested +AllDataPointsVisibility +AllOrganizationalUnitsEnabled +AllParameters +AllPolicyTypesEnabled +AllQueryArguments +AllRegions +AllRegionsEnabled +AllRowsWildcard +AllSheets +AllocateAddressRequest +AllocateAddressResult +AllocateConnectionOnInterconnectRequest +AllocateHostedConnectionRequest +AllocateHostsRequest +AllocateHostsResult +AllocateIpamPoolCidrRequest +AllocateIpamPoolCidrResult +AllocatePrivateVirtualInterfaceRequest +AllocatePublicVirtualInterfaceRequest +AllocateStaticIpRequest +AllocateStaticIpResult +AllocateTransitVirtualInterfaceRequest +AllocateTransitVirtualInterfaceResult +AllocatedCapacity +AllocatedDpus +AllocatedProvisionedConcurrentExecutions +AllocatedStorage +AllocatedUsageQuantity +AllocationDefaultNetmaskLength +AllocationId +AllocationIdNotFoundException +AllocationIds +AllocationMaxNetmaskLength +AllocationMinNetmaskLength +AllocationResourceTags +AllocationStrategy +AllocationTime +AllocationType +Allow +AllowAction +AllowActions +AllowAdminCreateUserOnly +AllowAllTrafficToEndpoint +AllowAssociation +AllowCancelResize +AllowCheckIn +AllowClassicFlow +AllowCookies +AllowCopyImage +AllowCredentials +AllowCustomRoutingTrafficRequest +AllowDataLoss +AllowDeferredExecution +AllowDenyList +AllowDnsResolutionFromRemoteVpc +AllowEarlyCheckIn +AllowEgressFromLocalClassicLinkToRemoteVpc +AllowEgressFromLocalVpcToRemoteClassicLink +AllowEngineModeChange +AllowExternalDataFiltering +AllowForceDelete +AllowFullTableExternalDataAccess +AllowHeaders +AllowListCriteria +AllowListStatus +AllowListSummary +AllowMajorVersionUpdate +AllowMajorVersionUpgrade +AllowMessages +AllowMethods +AllowNonRestoredState +AllowNotifications +AllowOrigins +AllowProfileCreation +AllowPubliclyAccessibleConsumers +AllowQuotedRecordDelimiter +AllowReassignment +AllowReassociation +AllowReferers +AllowResources +AllowSelectNestedTables +AllowSelfManagement +AllowSingleColumn +AllowSsh +AllowSudo +AllowUnassociatedTargets +AllowUnauthenticatedIdentities +AllowUpdate +AllowUsersToChangePassword +AllowVersionUpgrade +Allowed +AllowedAccessControlTags +AllowedAggregations +AllowedAllVPCs +AllowedAttempts +AllowedByOrganizations +AllowedByPermissionsBoundary +AllowedDomains +AllowedFeatures +AllowedGroupsColumnName +AllowedHeaders +AllowedIPRange +AllowedInputTypes +AllowedInstanceTypes +AllowedIps +AllowedLocations +AllowedMethods +AllowedMonitorCapabilities +AllowedNodeTypeModificationsMessage +AllowedOAuthFlows +AllowedOAuthFlowsUserPoolClient +AllowedOAuthScopes +AllowedOperations +AllowedOrigins +AllowedPattern +AllowedPrincipal +AllowedPrincipals +AllowedPublishers +AllowedRenditionSize +AllowedRenditions +AllowedStatistics +AllowedTargets +AllowedVPCs +AllowedValue +AllowedValues +AllowsMultipleInstanceTypes +AllowsPublicReadAccess +AllowsPublicWriteAccess +AllowsVpcAndNonVpcInstanceMemberships +AlphaBehavior +Alphabet +AlpnPolicy +AlreadyExistsException +AlreadyExistsFault +AlreadyInOrganizationException +AlreadyStreamedException +AlternateBandColorsVisibility +AlternateBandEvenColor +AlternateBandOddColor +AlternateContact +AlternateContactType +AlternateDataSourceParameters +AlternateIdentifier +AlternateKey +AlternatePathHint +AlternatePathHints +AlternateSoftwareMetadata +AlternateSoftwares +AlternateTransferFunctionSei +Alternative +AlternativeTransferFunction +Alternatives +AmazonCodeGuruProfiler +AmazonCodeGuruProfilerIntegration +AmazonElasticsearchParameters +AmazonForecastRoleArn +AmazonId +AmazonIdEventTopic +AmazonManagedKafkaEventSourceConfig +AmazonOpenSearchParameters +AmazonOpenSearchServerlessBufferingHints +AmazonOpenSearchServerlessDestinationConfiguration +AmazonOpenSearchServerlessDestinationDescription +AmazonOpenSearchServerlessDestinationUpdate +AmazonOpenSearchServerlessRetryOptions +AmazonProvidedIpv6CidrBlock +AmazonRedshiftAdvancedOption +AmazonRedshiftNodeData +AmazonRedshiftSource +AmazonRedshiftTarget +AmazonSideAsn +AmazonTranscribeCallAnalyticsProcessorConfiguration +AmazonTranscribeProcessorConfiguration +AmazonopensearchserviceBufferingHints +AmazonopensearchserviceDestinationConfiguration +AmazonopensearchserviceDestinationDescription +AmazonopensearchserviceDestinationUpdate +AmazonopensearchserviceRetryOptions +AmbiguousRoleResolution +AmdSevSnp +AmexCardSecurityCodeVersion1 +AmexCardSecurityCodeVersion2 +Ami +AmiAggregation +AmiAggregationResponse +AmiAssociationScope +AmiDistributionConfiguration +AmiId +AmiLaunchIndex +AmiVersion +AmortizedCommitment +AmortizedRecurringCommitment +AmortizedRecurringFee +AmortizedUpfrontCommitment +AmortizedUpfrontFee +Amount +AmountInUsd +AmplifyFeatureFlags +AmplifyMetaConfig +Amplitude +AmplitudeConnectorProfileCredentials +AmplitudeSourceProperties +AmznClientToken +Analyses +Analysis +AnalysisAclRule +AnalysisArn +AnalysisComponent +AnalysisDefaults +AnalysisDefinition +AnalysisEndTime +AnalysisError +AnalysisFindings +AnalysisId +AnalysisLoadBalancerListener +AnalysisLoadBalancerTarget +AnalysisOptions +AnalysisPacketHeader +AnalysisParameter +AnalysisReport +AnalysisReportId +AnalysisReportSummary +AnalysisReports +AnalysisResult +AnalysisResultLocation +AnalysisRouteTableRoute +AnalysisRule +AnalysisRuleAggregation +AnalysisRuleCustom +AnalysisRuleList +AnalysisSchema +AnalysisScheme +AnalysisSchemeLanguage +AnalysisSchemeName +AnalysisSchemeNames +AnalysisSchemeStatus +AnalysisSchemes +AnalysisSearchFilter +AnalysisSecurityGroupRule +AnalysisSourceEntity +AnalysisSourceTemplate +AnalysisStartTime +AnalysisStartTimeBegin +AnalysisStartTimeEnd +AnalysisStatus +AnalysisSummary +AnalysisSummaryList +AnalysisTemplate +AnalysisTemplateSummary +AnalysisTypes +Analytics +AnalyticsAndOperator +AnalyticsBinBySpecification +AnalyticsBinKey +AnalyticsConfiguration +AnalyticsConfigurationList +AnalyticsConfigurationType +AnalyticsEndpointId +AnalyticsExportDestination +AnalyticsIntentFilter +AnalyticsIntentGroupByKey +AnalyticsIntentGroupBySpecification +AnalyticsIntentMetric +AnalyticsIntentMetricResult +AnalyticsIntentNodeSummary +AnalyticsIntentResult +AnalyticsIntentStageFilter +AnalyticsIntentStageGroupByKey +AnalyticsIntentStageGroupBySpecification +AnalyticsIntentStageMetric +AnalyticsIntentStageMetricResult +AnalyticsIntentStageResult +AnalyticsMetadata +AnalyticsMetadataType +AnalyticsPathFilter +AnalyticsS3BucketDestination +AnalyticsSessionFilter +AnalyticsSessionGroupByKey +AnalyticsSessionGroupBySpecification +AnalyticsSessionMetric +AnalyticsSessionMetricResult +AnalyticsSessionResult +AnalyticsUtteranceAttribute +AnalyticsUtteranceAttributeResult +AnalyticsUtteranceFilter +AnalyticsUtteranceGroupByKey +AnalyticsUtteranceGroupBySpecification +AnalyticsUtteranceMetric +AnalyticsUtteranceMetricResult +AnalyticsUtteranceResult +AnalyzeDocumentModelVersion +AnalyzeDocumentRequest +AnalyzeDocumentResponse +AnalyzeExpenseModelVersion +AnalyzeExpenseRequest +AnalyzeExpenseResponse +AnalyzeIDDetections +AnalyzeIDModelVersion +AnalyzeIDRequest +AnalyzeIDResponse +AnalyzeLendingModelVersion +AnalyzedEniCount +AnalyzedResource +AnalyzedResourceCount +AnalyzedResourceSummary +AnalyzedTime +AnalyzerSummary +AncestorIds +Anchor +AnchorDateConfiguration +AnchorOption +AncillarySourceSettings +And +AndAllFilters +AndConditions +AndStatement +Android +AndroidPushNotificationTemplate +Annotation +AnnotationConsolidationConfig +AnnotationConsolidationLambdaArn +AnnotationDataS3Uri +AnnotationImportItemDetail +AnnotationImportItemSource +AnnotationImportJobItem +AnnotationStoreItem +AnnotationStoreVersionItem +AnnotationValue +Annotations +AnnouncementArn +AnnouncementDirection +Anomalies +AnomalousLogGroup +AnomalousLogGroups +AnomalousService +Anomaly +AnomalyClass +AnomalyDateInterval +AnomalyDetector +AnomalyDetectorArn +AnomalyDetectorConfig +AnomalyDetectorConfigSummary +AnomalyDetectorConfiguration +AnomalyDetectorDataQualityMetric +AnomalyDetectorDataQualityMetricList +AnomalyDetectorDescription +AnomalyDetectorFrequency +AnomalyDetectorName +AnomalyDetectorSummary +AnomalyDetectorSummaryList +AnomalyDetectorTypes +AnomalyDetectors +AnomalyEndDate +AnomalyGroup +AnomalyGroupId +AnomalyGroupScore +AnomalyGroupStatistics +AnomalyGroupSummary +AnomalyGroupSummaryList +AnomalyGroupTimeSeries +AnomalyGroupTimeSeriesFeedback +AnomalyId +AnomalyInstance +AnomalyMask +AnomalyMonitor +AnomalyMonitors +AnomalyReportedTimeRange +AnomalyResource +AnomalyResources +AnomalyScore +AnomalySourceDetails +AnomalySourceMetadata +AnomalyStartDate +AnomalySubscription +AnomalySubscriptions +AnomalyTimeRange +AnonymousAuthDisableDate +AnonymousAuthEnabled +AnonymousUserArn +AnonymousUserDashboardEmbeddingConfiguration +AnonymousUserDashboardVisualEmbeddingConfiguration +AnonymousUserEmbeddingExperienceConfiguration +AnonymousUserQSearchBarEmbeddingConfiguration +AnonymousUserSnapshotJobResult +AnonymousUsers +Answer +AnswerKey +AnswerMachineDetectionConfig +AnswerSummaries +AnswerSummary +Answers +AntennaDemodDecodeDetails +AntennaDownlinkConfig +AntennaDownlinkDemodDecodeConfig +AntennaUplinkConfig +AntiAlias +AntipatternReportResult +AntipatternSeveritySummary +Any +AnywhereConfiguration +ApId +ApacheKafkaCluster +ApacheKafkaClusterDescription +Api +ApiAssociation +ApiCache +ApiCallDetails +ApiDescription +ApiDestination +ApiDestinationArn +ApiDestinationState +ApiDestinations +ApiEndpoint +ApiGatewayApiAsset +ApiGatewayDomainName +ApiGatewayId +ApiGatewayManaged +ApiGatewayProxy +ApiGatewayProxyConfig +ApiGatewayProxyInput +ApiGatewayProxySummary +ApiId +ApiKey +ApiKeyAuthParameters +ApiKeyCredential +ApiKeyCredentials +ApiKeyFilter +ApiKeyIds +ApiKeyLimitExceededException +ApiKeyName +ApiKeyRequired +ApiKeyRestrictions +ApiKeySelectionExpression +ApiKeySource +ApiKeyValidityOutOfBoundsException +ApiKeyValue +ApiKeys +ApiLimitExceededException +ApiMapping +ApiMappingId +ApiMappingKey +ApiMappingSelectionExpression +ApiName +ApiPassthrough +ApiSpecificationDownloadUrl +ApiSpecificationDownloadUrlExpiresAt +ApiSpecificationMd5Hash +ApiSpecificationUploadUrl +ApiSpecificationUploadUrlExpiresAt +ApiStage +App +AppArn +AppAssessment +AppAssessmentSummary +AppAuthorization +AppAuthorizationSummary +AppBlock +AppBlockArn +AppBlockBuilder +AppBlockBuilderAppBlockAssociation +AppBlockBuilderAppBlockAssociations +AppBlockBuilderErrors +AppBlockBuilderName +AppBlockBuilderStateChangeReason +AppBlockBuilders +AppBlockErrors +AppBlocks +AppBoundaryKey +AppBundle +AppBundleSummary +AppComponent +AppComponentCompliance +AppCookieStickinessPolicies +AppCookieStickinessPolicy +AppDetails +AppEui +AppFlowConfig +AppId +AppIdClientRegex +AppIds +AppImageConfigArn +AppImageConfigDetails +AppImageConfigName +AppImageConfigs +AppInputSource +AppInstance +AppInstanceAdmin +AppInstanceAdminArn +AppInstanceAdminSummary +AppInstanceAdmins +AppInstanceArn +AppInstanceBot +AppInstanceBotArn +AppInstanceBotSummary +AppInstanceBots +AppInstanceDataType +AppInstanceRetentionSettings +AppInstanceStreamingConfiguration +AppInstanceStreamingConfigurations +AppInstanceSummary +AppInstanceUser +AppInstanceUserArn +AppInstanceUserEndpoint +AppInstanceUserEndpointSummary +AppInstanceUserEndpoints +AppInstanceUserId +AppInstanceUserMembershipSummary +AppInstanceUserSummary +AppInstanceUsers +AppInstances +AppIntegrationsConfiguration +AppKey +AppLogsEnabled +AppManaged +AppMonitor +AppMonitorConfiguration +AppMonitorDetails +AppMonitorName +AppMonitorSummaries +AppMonitorSummary +AppName +AppNetworkAccessType +AppPackageName +AppRegistryArn +AppRegistryConfiguration +AppSKey +AppSecurityGroupManagement +AppServerPrivateKey +AppSource +AppSpecContent +AppSpecification +AppSummary +AppSyncRuntime +AppTitle +AppType +AppTypeEquals +AppUnitError +AppValidationConfiguration +AppValidationOutput +AppVersion +AppVersionCode +AppVersionSummary +AppVisibility +AppendAccessString +AppendSourcePath +AppflowIntegration +AppflowIntegrationWorkflowAttributes +AppflowIntegrationWorkflowMetrics +AppflowIntegrationWorkflowStep +ApplianceModeSupport +Applicability +Application +ApplicationARN +ApplicationAggregatedStatus +ApplicationAlreadyExistsException +ApplicationArn +ApplicationArns +ApplicationCode +ApplicationCodeConfiguration +ApplicationCodeConfigurationDescription +ApplicationCodeConfigurationUpdate +ApplicationCodeUpdate +ApplicationComponent +ApplicationComponentDetail +ApplicationComponentList +ApplicationComponentStatusSummary +ApplicationComponentStrategy +ApplicationComponentSummary +ApplicationConfig +ApplicationConfiguration +ApplicationConfigurationDescription +ApplicationConfigurationUpdate +ApplicationCredential +ApplicationDPUSizes +ApplicationDateRangeKpiResponse +ApplicationDependencySummary +ApplicationDescription +ApplicationDescriptionMessage +ApplicationDescriptionsMessage +ApplicationDetail +ApplicationDoesNotExistException +ApplicationDomain +ApplicationFleetAssociation +ApplicationFleetAssociations +ApplicationId +ApplicationIdentifier +ApplicationIds +ApplicationInfo +ApplicationInfoList +ApplicationInstance +ApplicationInstanceId +ApplicationInstanceIdToReplace +ApplicationInstances +ApplicationIntegrationURL +ApplicationLayerAutomaticResponseConfiguration +ApplicationLimitExceededException +ApplicationMaintenanceConfigurationDescription +ApplicationMaintenanceConfigurationUpdate +ApplicationMaintenanceWindowEndTime +ApplicationMaintenanceWindowStartTime +ApplicationMaintenanceWindowStartTimeUpdate +ApplicationMetrics +ApplicationMode +ApplicationName +ApplicationNameRequiredException +ApplicationNames +ApplicationPermissions +ApplicationPolicies +ApplicationPolicyStatement +ApplicationPreferences +ApplicationQuota +ApplicationResourceLifecycleConfig +ApplicationResourceLifecycleDescriptionMessage +ApplicationResponse +ApplicationRestoreConfiguration +ApplicationRestoreConfigurationDescription +ApplicationRestoreType +ApplicationRuntimeId +ApplicationServerPublicKey +ApplicationSettings +ApplicationSettingsJourneyLimits +ApplicationSettingsResource +ApplicationSettingsResponse +ApplicationSnapshotConfiguration +ApplicationSnapshotConfigurationDescription +ApplicationSnapshotConfigurationUpdate +ApplicationSource +ApplicationSourceConfig +ApplicationSources +ApplicationState +ApplicationStateList +ApplicationStatus +ApplicationSuccessFeedbackRoleArn +ApplicationSummaries +ApplicationSummary +ApplicationSummaryList +ApplicationTransactionCounter +ApplicationType +ApplicationUpdate +ApplicationVersion +ApplicationVersionArn +ApplicationVersionDescription +ApplicationVersionDescriptionMessage +ApplicationVersionDescriptionsMessage +ApplicationVersionDetail +ApplicationVersionId +ApplicationVersionLifecycleConfig +ApplicationVersionQuota +ApplicationVersionRolledBackFrom +ApplicationVersionRolledBackTo +ApplicationVersionSummaries +ApplicationVersionSummary +ApplicationVersionUpdatedFrom +ApplicationVersions +Applications +ApplicationsResponse +AppliedColorSpaceConversion +AppliedDdls +AppliedDeletes +AppliedExtension +AppliedExtensions +AppliedInserts +AppliedSchemaArn +AppliedSettings +AppliedTerminologies +AppliedTerminology +AppliedUpdates +AppliedValue +ApplyAction +ApplyArchiveRuleRequest +ApplyEnvironmentManagedActionRequest +ApplyEnvironmentManagedActionResult +ApplyFontColor +ApplyImmediately +ApplyMapping +ApplyMethod +ApplyOn +ApplyOnlyAtCronInterval +ApplyPendingMaintenance +ApplyPendingMaintenanceActionMessage +ApplyPendingMaintenanceActionResponse +ApplyPendingMaintenanceActionResult +ApplySchemaRequest +ApplySchemaResponse +ApplySecurityGroupsToClientVpnTargetNetworkRequest +ApplySecurityGroupsToClientVpnTargetNetworkResult +ApplySecurityGroupsToLoadBalancerInput +ApplySecurityGroupsToLoadBalancerOutput +ApplyServerSideEncryptionByDefault +ApplyStatus +ApplyTo +ApplyToAllRegions +ApplyType +Approval +ApprovalAlreadyCompletedException +ApprovalDate +ApprovalDescription +ApprovalModel +ApprovalResult +ApprovalRule +ApprovalRuleContentRequiredException +ApprovalRuleDoesNotExistException +ApprovalRuleEventMetadata +ApprovalRuleNameAlreadyExistsException +ApprovalRuleNameRequiredException +ApprovalRuleOverriddenEventMetadata +ApprovalRuleTemplate +ApprovalRuleTemplateContentRequiredException +ApprovalRuleTemplateDoesNotExistException +ApprovalRuleTemplateInUseException +ApprovalRuleTemplateNameAlreadyExistsException +ApprovalRuleTemplateNameRequiredException +ApprovalRules +ApprovalStateChangedEventMetadata +ApprovalStateRequiredException +ApprovalThresholdPolicy +ApprovalTime +ApproveAfterDays +ApproveAssignmentRequest +ApproveSkillRequest +ApproveUntilDate +ApprovedOrigins +ApprovedPatches +ApprovedPatchesComplianceLevel +ApprovedPatchesEnableNonSecurity +ApprovedVersion +ApproximateAggregateValue +ApproximateArrivalTimestamp +ApproximateAssetCount +ApproximateCount +ApproximateCreationDateTime +ApproximateDurationSeconds +ApproximateNumberOfMessagesMoved +ApproximateNumberOfMessagesToMove +ApproximateResultCount +ApproximateStartTime +ApproximateTime +ApproximateTotalCount +ApproximateUniqueCount +ApproximateValue +Apps +AppsCount +AppsList +AppsListArn +AppsListData +AppsListDataSummary +AppsLists +AppstreamAgentVersion +AquaConfiguration +AquaConfigurationStatus +AquaStatus +ArbitraryPatternLimits +Arc +ArcAngle +ArcAxis +ArcAxisConfiguration +ArcAxisDisplayRange +ArcConfiguration +ArcOptions +ArcThickness +Arch +ArchitecturalDesign +Architecture +ArchitectureTypes +Architectures +ArchivalBackupArn +ArchivalCompleteTime +ArchivalDateTime +ArchivalReason +ArchivalSummary +Archive +ArchiveAllowedFlag +ArchiveApplicationRequest +ArchiveArn +ArchiveCdnSettings +ArchiveContainerSettings +ArchiveCreationOutput +ArchiveDescription +ArchiveFindingsRequest +ArchiveGroupSettings +ArchiveId +ArchiveName +ArchiveOutputSettings +ArchiveRetainRule +ArchiveRule +ArchiveRuleSummary +ArchiveS3Settings +ArchiveSHA256TreeHash +ArchiveSizeInBytes +ArchiveStatus +ArchiveWaveRequest +Archived +ArchivedLogDestId +ArchivedLogsOnly +Archives +AreaCode +AreaOfInterest +AreaStyleSettings +AreaUnderPRCurve +Args +ArgumentException +Arguments +ArgumentsMap +Arib +AribCaptionsPid +AribCaptionsPidControl +AribDestinationSettings +AribSourceSettings +Arn +ArnNotSupportedException +Arns +ArrayColumnInfo +ArrayProperties +ArrayPropertiesDetail +ArrayPropertiesSummary +ArrayValue +ArrivalDate +Artifact +ArtifactArn +ArtifactConfig +ArtifactConfigInput +ArtifactConfigOutput +ArtifactDetail +ArtifactDetails +ArtifactDigest +ArtifactId +ArtifactIdentifier +ArtifactLocation +ArtifactName +ArtifactPath +ArtifactRevision +ArtifactS3Location +ArtifactSource +ArtifactSourceType +ArtifactStore +ArtifactSummaries +ArtifactSummary +ArtifactType +Artifacts +ArtifactsConcatenationConfiguration +ArtifactsConfiguration +Artwork +As2Config +As2ConnectorConfig +As2Id +As2Transports +AsPath +Ascending +AsmPassword +AsmServer +AsmUser +Asn +AsnOrg +AspectRatio +AssembleWith +AssertedControls +AssertionAttributes +AssertionRule +AssertionRuleUpdate +Assessment +AssessmentControl +AssessmentControlSet +AssessmentEvidenceFolder +AssessmentFramework +AssessmentFrameworkMetadata +AssessmentFrameworkShareRequest +AssessmentMetadata +AssessmentMetadataItem +AssessmentProgress +AssessmentReport +AssessmentReportEvidenceError +AssessmentReportMetadata +AssessmentReportTypes +AssessmentReportsDestination +AssessmentResults +AssessmentResultsFile +AssessmentRun +AssessmentRunAgent +AssessmentRunFilter +AssessmentRunInProgressException +AssessmentRunName +AssessmentRunNotification +AssessmentRunStateChange +AssessmentStatus +AssessmentSummary +AssessmentTarget +AssessmentTargetFilter +AssessmentTemplate +AssessmentTemplateFilter +Asset +AssetAttributes +AssetBundleCloudFormationOverridePropertyConfiguration +AssetBundleExportJobAnalysisOverrideProperties +AssetBundleExportJobDashboardOverrideProperties +AssetBundleExportJobDataSetOverrideProperties +AssetBundleExportJobDataSourceOverrideProperties +AssetBundleExportJobError +AssetBundleExportJobId +AssetBundleExportJobRefreshScheduleOverrideProperties +AssetBundleExportJobResourceIdOverrideConfiguration +AssetBundleExportJobSummary +AssetBundleExportJobSummaryList +AssetBundleExportJobThemeOverrideProperties +AssetBundleExportJobVPCConnectionOverrideProperties +AssetBundleImportJobAnalysisOverrideParameters +AssetBundleImportJobDashboardOverrideParameters +AssetBundleImportJobDataSetOverrideParameters +AssetBundleImportJobDataSourceCredentialPair +AssetBundleImportJobDataSourceCredentials +AssetBundleImportJobDataSourceOverrideParameters +AssetBundleImportJobError +AssetBundleImportJobId +AssetBundleImportJobOverrideParameters +AssetBundleImportJobRefreshScheduleOverrideParameters +AssetBundleImportJobResourceIdOverrideConfiguration +AssetBundleImportJobSummary +AssetBundleImportJobSummaryList +AssetBundleImportJobThemeOverrideParameters +AssetBundleImportJobVPCConnectionOverrideParameters +AssetBundleImportSource +AssetBundleImportSourceDescription +AssetCompositeModel +AssetDestinationEntry +AssetDestinations +AssetDetails +AssetEntry +AssetErrorDetails +AssetHierarchy +AssetHierarchyInfo +AssetId +AssetIds +AssetInfo +AssetInformationList +AssetLocation +AssetModelCompositeModel +AssetModelCompositeModelDefinition +AssetModelHierarchy +AssetModelHierarchyDefinition +AssetModelProperty +AssetModelPropertyDefinition +AssetModelPropertySummary +AssetModelStatus +AssetModelSummary +AssetName +AssetProperty +AssetPropertySummary +AssetPropertyTimestamp +AssetPropertyValue +AssetPropertyVariant +AssetRelationshipSummary +AssetShallow +AssetSource +AssetSourceEntry +AssetSources +AssetStatus +AssetSummary +AssetType +AssetValue +Assets +Assign +AssignContactCategoryAction +AssignInstanceRequest +AssignIpv6AddressOnCreation +AssignIpv6AddressesRequest +AssignIpv6AddressesResult +AssignPrivateIpAddressesRequest +AssignPrivateIpAddressesResult +AssignPrivateNatGatewayAddressRequest +AssignPrivateNatGatewayAddressResult +AssignPublicIp +AssignTapePoolInput +AssignTapePoolOutput +AssignVolumeRequest +AssignedIpv4Prefixes +AssignedIpv6Addresses +AssignedIpv6Prefixes +AssignedPrivateIpAddress +AssignedPrivateIpAddresses +Assigning +Assignment +AssignmentDurationInSeconds +AssignmentId +AssignmentName +AssignmentReviewPolicy +AssignmentReviewReport +AssignmentStatus +AssignmentStatuses +Assignments +AssistAltitude +AssistPosition +AssistantAssociationData +AssistantAssociationSummary +AssistantData +AssistantIntegrationConfiguration +AssistantSummary +AssociateAccountsInput +AssociateAccountsOutput +AssociateAddressRequest +AssociateAddressResult +AssociateAdminAccountRequest +AssociateAliasRequest +AssociateApiRequest +AssociateApiResponse +AssociateAppBlockBuilderAppBlockRequest +AssociateAppBlockBuilderAppBlockResult +AssociateApplicationFleetRequest +AssociateApplicationFleetResult +AssociateApplicationToEntitlementRequest +AssociateApplicationsRequest +AssociateApprovalRuleTemplateWithRepositoryInput +AssociateApprovedOriginRequest +AssociateAssessmentReportEvidenceFolderRequest +AssociateAssetsRequest +AssociateAttributeGroupRequest +AssociateAttributeGroupResponse +AssociateAwsAccountWithPartnerAccountRequest +AssociateAwsAccountWithPartnerAccountResponse +AssociateBotRequest +AssociateBrowserSettingsRequest +AssociateBrowserSettingsResponse +AssociateBudgetWithResourceInput +AssociateCarrierIpAddress +AssociateCertificateRequest +AssociateChannelFlowRequest +AssociateClientDeviceWithCoreDeviceEntry +AssociateClientDeviceWithCoreDeviceErrorEntry +AssociateClientVpnTargetNetworkRequest +AssociateClientVpnTargetNetworkResult +AssociateConfigurationItemsToApplicationRequest +AssociateConnectPeerRequest +AssociateConnectPeerResponse +AssociateConnectionAliasRequest +AssociateConnectionAliasResult +AssociateConnectionWithLagRequest +AssociateContactWithAddressBookRequest +AssociateCreatedArtifactRequest +AssociateCustomDomainRequest +AssociateCustomDomainResponse +AssociateCustomerGatewayRequest +AssociateCustomerGatewayResponse +AssociateDRTLogBucketRequest +AssociateDRTRoleRequest +AssociateDataShareConsumerMessage +AssociateDefaultViewInput +AssociateDefaultViewOutput +AssociateDefaultVocabularyRequest +AssociateDelegateToResourceRequest +AssociateDelegationSignerToDomainRequest +AssociateDelegationSignerToDomainResponse +AssociateDeviceWithNetworkProfileRequest +AssociateDeviceWithPlacementRequest +AssociateDeviceWithRoomRequest +AssociateDhcpOptionsRequest +AssociateDiscoveredResourceRequest +AssociateDomainRequest +AssociateElasticIpRequest +AssociateEnclaveCertificateIamRoleRequest +AssociateEnclaveCertificateIamRoleResult +AssociateEncryptionConfigRequest +AssociateEncryptionConfigResponse +AssociateEntireAccount +AssociateEntitiesToExperienceRequest +AssociateEntitiesToExperienceResponse +AssociateEntityToThingRequest +AssociateEnvironmentOperationsRoleMessage +AssociateExternalConnectionRequest +AssociateExternalConnectionResult +AssociateFacesRequest +AssociateFacesResponse +AssociateFileSystemAliasesRequest +AssociateFileSystemAliasesResponse +AssociateFileSystemInput +AssociateFileSystemOutput +AssociateFirewallPolicyRequest +AssociateFirewallPolicyResponse +AssociateFirewallRuleGroupRequest +AssociateFirewallRuleGroupResponse +AssociateFleetRequest +AssociateFraudsterRequest +AssociateFraudsterResponse +AssociateGatewayToServerInput +AssociateGatewayToServerOutput +AssociateHealthCheckRequest +AssociateHostedConnectionRequest +AssociateIamInstanceProfileRequest +AssociateIamInstanceProfileResult +AssociateIdentityProviderConfigRequest +AssociateIdentityProviderConfigResponse +AssociateInstanceEventWindowRequest +AssociateInstanceEventWindowResult +AssociateInstanceStorageConfigRequest +AssociateInstanceStorageConfigResponse +AssociateIpAccessSettingsRequest +AssociateIpAccessSettingsResponse +AssociateIpGroupsRequest +AssociateIpamResourceDiscoveryRequest +AssociateIpamResourceDiscoveryResult +AssociateKmsKeyRequest +AssociateLambdaFunctionRequest +AssociateLensesInput +AssociateLexBotRequest +AssociateLicenseRequest +AssociateLicenseResponse +AssociateLinkRequest +AssociateLinkResponse +AssociateMacSecKeyRequest +AssociateMacSecKeyResponse +AssociateMemberAccountRequest +AssociateMemberRequest +AssociateMemberResponse +AssociateMemberToGroupRequest +AssociateMergedGraphqlApiRequest +AssociateMergedGraphqlApiResponse +AssociateMulticastGroupWithFuotaTaskRequest +AssociateNatGatewayAddressRequest +AssociateNatGatewayAddressResult +AssociateNetworkSettingsRequest +AssociateNetworkSettingsResponse +AssociateNodeRequest +AssociateNodeResponse +AssociateOpsItemRelatedItemRequest +AssociateOpsItemRelatedItemResponse +AssociateOriginationIdentityRequest +AssociateOriginationIdentityResult +AssociatePackageRequest +AssociatePackageResponse +AssociatePersonasToEntitiesRequest +AssociatePersonasToEntitiesResponse +AssociatePhoneNumberContactFlowRequest +AssociatePhoneNumberWithUserRequest +AssociatePhoneNumbersWithVoiceConnectorGroupRequest +AssociatePhoneNumbersWithVoiceConnectorGroupResponse +AssociatePhoneNumbersWithVoiceConnectorRequest +AssociatePhoneNumbersWithVoiceConnectorResponse +AssociatePricingRulesInput +AssociatePricingRulesOutput +AssociatePrincipalWithPortfolioInput +AssociateProactiveEngagementDetailsRequest +AssociateProductWithPortfolioInput +AssociateProfilesInput +AssociatePublicIpAddress +AssociateQualificationWithWorkerRequest +AssociateQueueQuickConnectsRequest +AssociateRepositoryRequest +AssociateRepositoryResponse +AssociateResolverEndpointIpAddressRequest +AssociateResolverEndpointIpAddressResponse +AssociateResolverQueryLogConfigRequest +AssociateResolverQueryLogConfigResponse +AssociateResolverRuleRequest +AssociateResolverRuleResponse +AssociateResourceError +AssociateResourceRequest +AssociateResourceResponse +AssociateResourceResponseElement +AssociateResourceSharePermissionRequest +AssociateResourceSharePermissionResponse +AssociateResourceShareRequest +AssociateResourceShareResponse +AssociateRoleToGroupRequest +AssociateRoleToGroupResponse +AssociateRouteTableRequest +AssociateRouteTableResult +AssociateRoutingProfileQueuesRequest +AssociateS3ResourcesRequest +AssociateS3ResourcesResult +AssociateSecurityKeyRequest +AssociateSecurityKeyResponse +AssociateServiceActionWithProvisioningArtifactInput +AssociateServiceRoleToAccountRequest +AssociateServiceRoleToAccountResponse +AssociateSigninDelegateGroupsWithAccountRequest +AssociateSkillGroupWithRoomRequest +AssociateSkillWithSkillGroupRequest +AssociateSkillWithUsersRequest +AssociateSoftwareTokenRequest +AssociateSoftwareTokenResponse +AssociateSourceGraphqlApiRequest +AssociateSourceGraphqlApiResponse +AssociateSourceNetworkStackRequest +AssociateSourceNetworkStackResponse +AssociateSourceServersRequest +AssociateSubnetCidrBlockRequest +AssociateSubnetCidrBlockResult +AssociateSubnetsRequest +AssociateSubnetsResponse +AssociateTagOptionWithResourceInput +AssociateTargetsWithJobRequest +AssociateTargetsWithJobResponse +AssociateTeamMemberRequest +AssociateTeamMemberResult +AssociateThirdPartyFirewallRequest +AssociateThirdPartyFirewallResponse +AssociateTimeSeriesToAssetPropertyRequest +AssociateTrackerConsumerRequest +AssociateTrafficDistributionGroupUserRequest +AssociateTransitGatewayConnectPeerRequest +AssociateTransitGatewayConnectPeerResponse +AssociateTransitGatewayMulticastDomainRequest +AssociateTransitGatewayMulticastDomainResult +AssociateTransitGatewayPolicyTableRequest +AssociateTransitGatewayPolicyTableResult +AssociateTransitGatewayRouteTableRequest +AssociateTransitGatewayRouteTableResult +AssociateTrialComponentRequest +AssociateTrialComponentResponse +AssociateTrunkInterfaceRequest +AssociateTrunkInterfaceResult +AssociateTrustStoreRequest +AssociateTrustStoreResponse +AssociateUserAccessLoggingSettingsRequest +AssociateUserAccessLoggingSettingsResponse +AssociateUserRequest +AssociateUserResponse +AssociateUserSettingsRequest +AssociateUserSettingsResponse +AssociateUserToPermissionGroupRequest +AssociateUserToPermissionGroupResponse +AssociateVPCWithHostedZoneRequest +AssociateVPCWithHostedZoneResponse +AssociateVehicleFleetRequest +AssociateVirtualInterfaceRequest +AssociateVpcCidrBlockRequest +AssociateVpcCidrBlockResult +AssociateWebACLRequest +AssociateWebsiteAuthorizationProviderRequest +AssociateWebsiteAuthorizationProviderResponse +AssociateWebsiteCertificateAuthorityRequest +AssociateWebsiteCertificateAuthorityResponse +AssociateWirelessDeviceWithFuotaTaskRequest +AssociateWirelessDeviceWithMulticastGroupRequest +AssociateWirelessDeviceWithThingRequest +AssociateWirelessGatewayWithCertificateRequest +AssociateWirelessGatewayWithCertificateResponse +AssociateWirelessGatewayWithThingRequest +AssociatedAccountId +AssociatedApplication +AssociatedAssetsSummary +AssociatedAt +AssociatedClientDevice +AssociatedClusterCount +AssociatedClusters +AssociatedEndpointGroupFoundException +AssociatedFace +AssociatedFaces +AssociatedGateway +AssociatedGlueResource +AssociatedHost +AssociatedInsightId +AssociatedListenerFoundException +AssociatedPermission +AssociatedPricingPlanCount +AssociatedResource +AssociatedResourceArns +AssociatedResources +AssociatedRole +AssociatedRoleArn +AssociatedRoles +AssociatedRuleGroupArn +AssociatedStandard +AssociatedStandards +AssociatedTargetNetwork +AssociatedTargetNetworks +AssociatedTimestamp +AssociatedTranscript +AssociatedTranscriptFilter +AssociatedValues +Association +AssociationArn +AssociationConfig +AssociationCount +AssociationDate +AssociationDefaultRouteTableId +AssociationDescription +AssociationDoesNotExist +AssociationExecution +AssociationExecutionDoesNotExist +AssociationExecutionFilter +AssociationExecutionTarget +AssociationExecutionTargets +AssociationExecutionTargetsFilter +AssociationExecutions +AssociationFilter +AssociationFilterList +AssociationId +AssociationIds +AssociationName +AssociationOverview +AssociationSet +AssociationSetDetails +AssociationSize +AssociationState +AssociationStateDetails +AssociationStatus +AssociationStatusAggregatedCount +AssociationSummaries +AssociationSummary +AssociationTarget +AssociationTime +AssociationType +AssociationVersion +AssociationVersionInfo +AssociationVersionLimitExceeded +AssociationVersions +Associations +AssumeControl +AssumeDecoratedRoleWithSAMLRequest +AssumeDecoratedRoleWithSAMLResponse +AssumeImpersonationRoleRequest +AssumeImpersonationRoleResponse +AssumeRolePolicyDocument +AssumeRoleRequest +AssumeRoleResponse +AssumeRoleWithSAMLRequest +AssumeRoleWithSAMLResponse +AssumeRoleWithWebIdentityRequest +AssumeRoleWithWebIdentityResponse +AssumedRole +AssumedRoleId +AssumedRoleUser +AsymmetricEncryptionAttributes +AsyncErrorDetails +AsyncInferenceClientConfig +AsyncInferenceConfig +AsyncInferenceNotificationConfig +AsyncInferenceOutputConfig +AsyncOperation +AsyncRequestParameters +AsyncResponseDetails +AtRestEncryptionEnabled +AtTime +AthenaConnectorSource +AthenaDatasetDefinition +AthenaError +AthenaErrorCode +AthenaIntegration +AthenaIntegrations +AthenaParameters +AthenaSourceConfig +AtigData +Atime +AttachCertificateToDistributionRequest +AttachCertificateToDistributionResult +AttachClassicLinkVpcRequest +AttachClassicLinkVpcResult +AttachCustomerManagedPolicyReferenceToPermissionSetRequest +AttachDiskRequest +AttachDiskResult +AttachElasticLoadBalancerRequest +AttachGroupPolicyRequest +AttachInstancesQuery +AttachInstancesToLoadBalancerRequest +AttachInstancesToLoadBalancerResult +AttachInternetGatewayRequest +AttachLoadBalancerTargetGroupsType +AttachLoadBalancerTlsCertificateRequest +AttachLoadBalancerTlsCertificateResult +AttachLoadBalancerToSubnetsInput +AttachLoadBalancerToSubnetsOutput +AttachLoadBalancersType +AttachManagedPolicyToPermissionSetRequest +AttachNetworkInterfaceRequest +AttachNetworkInterfaceResult +AttachObject +AttachObjectRequest +AttachObjectResponse +AttachPolicy +AttachPolicyRequest +AttachPrincipalPolicyRequest +AttachRolePolicyRequest +AttachSecurityProfileRequest +AttachStaticIpRequest +AttachStaticIpResult +AttachThingPrincipalRequest +AttachTime +AttachToIndex +AttachToIndexRequest +AttachToIndexResponse +AttachTrafficSourcesType +AttachTypedLink +AttachTypedLinkRequest +AttachTypedLinkResponse +AttachUserPolicyRequest +AttachVerifiedAccessTrustProviderRequest +AttachVerifiedAccessTrustProviderResult +AttachVolumeInput +AttachVolumeOutput +AttachVolumeRequest +AttachVpnGatewayRequest +AttachVpnGatewayResult +AttachedChannels +AttachedDisk +AttachedENIId +AttachedManagedPolicies +AttachedManagedPolicy +AttachedObjectIdentifier +AttachedPermissionsBoundary +AttachedPolicies +AttachedPolicy +AttachedPolicyIds +AttachedTo +AttachedVolumes +Attachment +AttachmentConfiguration +AttachmentContent +AttachmentCount +AttachmentDetails +AttachmentEnaSrdSpecification +AttachmentEnaSrdUdpSpecification +AttachmentFieldMappings +AttachmentId +AttachmentIdNotFound +AttachmentIds +AttachmentInformation +AttachmentItem +AttachmentLimitExceeded +AttachmentName +AttachmentPolicyRuleNumber +AttachmentReference +AttachmentSetExpired +AttachmentSetIdNotFound +AttachmentSetSizeLimitExceeded +AttachmentSizeInBytes +AttachmentStateChange +AttachmentStatuses +AttachmentType +Attachments +AttachmentsContent +AttachmentsInformation +AttachmentsSource +Attack +AttackCount +AttackCounters +AttackDetail +AttackId +AttackLayer +AttackProperties +AttackProperty +AttackPropertyIdentifier +AttackStatisticsDataItem +AttackSummaries +AttackSummary +AttackVectorDescription +AttackVectors +AttackVolume +AttackVolumeStatistics +Attempt +AttemptContainerDetail +AttemptCount +AttemptDetail +Attempts +Attendee +AttendeeCapabilities +AttendeeId +AttendeeIdItem +AttendeeIds +Attendees +AttenuationControl +AttestationDocument +Attribute +AttributeAction +AttributeActionType +AttributeAggregationFunction +AttributeBooleanValue +AttributeConfig +AttributeConfigs +AttributeDataType +AttributeDefinition +AttributeDefinitions +AttributeDetails +AttributeDimension +AttributeFilter +AttributeGroup +AttributeGroupDetails +AttributeGroupSummary +AttributeItem +AttributeKey +AttributeKeyAndValue +AttributeLimitExceededException +AttributeMapping +AttributeMatchingModel +AttributeName +AttributeNameAndValue +AttributeNames +AttributeOperation +AttributePath +AttributePayload +AttributeReference +AttributeSuggestionsConfig +AttributeSuggestionsDescribeConfig +AttributeSuggestionsGetConfig +AttributeSuggestionsMode +AttributeSuggestionsUpdateConfig +AttributeType +AttributeTypesSelector +AttributeUpdateValue +AttributeUpdates +AttributeValue +AttributeValueList +AttributeValueTarget +AttributeValueUpdate +AttributeValues +Attributes +AttributesData +AttributesRequireVerificationBeforeUpdate +AttributesResource +AttributesToDelete +AttributesToGet +Audience +Audio +AudioAggregationEndedAt +AudioAggregationStartedAt +AudioAndDTMFInputSpecification +AudioArtifactsConfiguration +AudioBufferModel +AudioChannelConfigSchemeIdUri +AudioChannelMapping +AudioChannelTaggingSettings +AudioChannels +AudioChunk +AudioCodecOptions +AudioCodecSettings +AudioConcatenationConfiguration +AudioConfiguration +AudioDeduplication +AudioDescription +AudioDescriptionBroadcasterMix +AudioDescriptionNames +AudioDescriptions +AudioDolbyEDecode +AudioDuration +AudioDurationCorrection +AudioEvent +AudioFallbackUrl +AudioFeatures +AudioFramesPerPes +AudioGroupId +AudioHlsRenditionSelection +AudioHostUrl +AudioInputEvent +AudioLanguageSelection +AudioList +AudioLogDestination +AudioLogSetting +AudioMetadata +AudioNormalizationSettings +AudioOnlyContainer +AudioOnlyHeader +AudioOnlyHlsSettings +AudioOnlyImage +AudioOnlyTimecodeControl +AudioPackingMode +AudioParameters +AudioPidSelection +AudioPids +AudioRenditionSets +AudioResponseEvent +AudioSampleRate +AudioSelector +AudioSelectorGroup +AudioSelectorGroups +AudioSelectorName +AudioSelectorNames +AudioSelectorSettings +AudioSelectors +AudioSilenceFailoverSettings +AudioSilenceSettings +AudioSilenceThresholdMsec +AudioSourceName +AudioSpecification +AudioStream +AudioStreamType +AudioTrack +AudioTrackSelection +AudioTrackType +AudioType +AudioTypeControl +AudioWatermarkSettings +AudioWatermarkingSettings +Audit +AuditCheckConfiguration +AuditCheckDetails +AuditContext +AuditDestinationARN +AuditEvent +AuditEventResultEntry +AuditFinding +AuditImage +AuditImages +AuditImagesLimit +AuditLogConfiguration +AuditLogDestination +AuditLogDestinationConfiguration +AuditLogGroup +AuditLogProcessingConfiguration +AuditLogVolume +AuditLogs +AuditMitigationActionExecutionMetadata +AuditMitigationActionsTaskMetadata +AuditMitigationActionsTaskTarget +AuditNotificationTarget +AuditPolicyState +AuditReportId +AuditReportResponseFormat +AuditReportStatus +AuditStreamArn +AuditSuppression +AuditTaskMetadata +AugmentedManifests +AugmentedManifestsListItem +AuroraParameters +AuroraPostgreSqlParameters +Auth +AuthCode +AuthEventType +AuthEvents +AuthException +AuthFlow +AuthInfo +AuthMechanism +AuthMethod +AuthMode +AuthParameter +AuthParameters +AuthPassword +AuthRequest +AuthRequestCryptogram +AuthResources +AuthResponseAttributes +AuthResponseCode +AuthResponseValue +AuthResult +AuthScheme +AuthSecretArn +AuthSessionValidity +AuthSource +AuthStrategy +AuthToken +AuthTokenEnabled +AuthTokenExpirationTime +AuthTokenLastModifiedDate +AuthTokenStatus +AuthTokenUpdateStrategy +AuthTtL +AuthType +AuthUserName +AuthenticateCognitoActionConfig +AuthenticateCognitoConfig +AuthenticateOidcActionConfig +AuthenticateOidcConfig +AuthenticateOnUnsubscribe +Authenticated +Authentication +AuthenticationCode1 +AuthenticationCode2 +AuthenticationConfig +AuthenticationConfiguration +AuthenticationDescription +AuthenticationFailedException +AuthenticationMethod +AuthenticationMode +AuthenticationOptions +AuthenticationProfile +AuthenticationProfileAlreadyExistsFault +AuthenticationProfileContent +AuthenticationProfileName +AuthenticationProfileNotFoundFault +AuthenticationProfileQuotaExceededFault +AuthenticationProfiles +AuthenticationProtocol +AuthenticationRequestExtraParams +AuthenticationResult +AuthenticationResultId +AuthenticationResultType +AuthenticationScheme +AuthenticationStrategy +AuthenticationSummary +AuthenticationToken +AuthenticationType +Author +AuthorDoesNotExistException +AuthorGroup +Authorization +AuthorizationAlreadyExistsFault +AuthorizationConfig +AuthorizationData +AuthorizationEndpoint +AuthorizationErrorException +AuthorizationException +AuthorizationNotFoundFault +AuthorizationPendingException +AuthorizationProviderId +AuthorizationProviderType +AuthorizationQuotaExceededFault +AuthorizationResult +AuthorizationRule +AuthorizationRules +AuthorizationScopes +AuthorizationStrategy +AuthorizationType +AuthorizeAllGroups +AuthorizeCacheSecurityGroupIngressMessage +AuthorizeCacheSecurityGroupIngressResult +AuthorizeClientVpnIngressRequest +AuthorizeClientVpnIngressResult +AuthorizeClusterSecurityGroupIngressMessage +AuthorizeClusterSecurityGroupIngressResult +AuthorizeDBSecurityGroupIngressMessage +AuthorizeDBSecurityGroupIngressResult +AuthorizeDataShareMessage +AuthorizeEndpointAccessMessage +AuthorizeIpRulesRequest +AuthorizeSecurityGroupEgressRequest +AuthorizeSecurityGroupEgressResult +AuthorizeSecurityGroupIngressRequest +AuthorizeSecurityGroupIngressResult +AuthorizeSnapshotAccessMessage +AuthorizeSnapshotAccessResult +AuthorizeTime +AuthorizeVpcEndpointAccessRequest +AuthorizeVpcEndpointAccessResponse +AuthorizedAccountId +AuthorizedAwsRegion +AuthorizedColumns +AuthorizedPrincipal +AuthorizedPrincipalList +AuthorizedResourceArns +AuthorizedSessionTagValueList +AuthorizedUrl +Authorizer +AuthorizerConfig +AuthorizerCredentialsArn +AuthorizerDescription +AuthorizerId +AuthorizerPayloadFormatVersion +AuthorizerResultTtlInSeconds +AuthorizerSummary +AuthorizerType +AuthorizerUri +Authorizers +AutoAccept +AutoAcceptRequests +AutoAcceptSharedAssociations +AutoAcceptSharedAttachments +AutoAddGroupOwner +AutoAdjustData +AutoAdjustType +AutoAppliedAfterDate +AutoApprovalDelayInSeconds +AutoApprovalTime +AutoApprove +AutoAssignElasticIps +AutoAssignPublicIps +AutoAssociate +AutoBranchCreationConfig +AutoConfigEnabled +AutoCreate +AutoCreateApplication +AutoCreateTasks +AutoDeclineConflictingRequests +AutoDeclineRecurringRequests +AutoDeploy +AutoDeployed +AutoDeployment +AutoDeploymentsEnabled +AutoDetectionMetricSource +AutoDetectionS3SourceConfig +AutoEnable +AutoEnableControls +AutoEnableIO +AutoEnableOrganizationMembers +AutoEnableStandards +AutoEnroll +AutoEnrollment +AutoExportPolicy +AutoExportRevisionDestinationEntry +AutoExportRevisionToS3RequestDetails +AutoGenerateEndpointName +AutoGranted +AutoGrantedValue +AutoImport +AutoImportPolicy +AutoMLAlgorithmArns +AutoMLAlgorithmConfig +AutoMLAlgorithms +AutoMLCandidate +AutoMLCandidateGenerationConfig +AutoMLCandidateStep +AutoMLChannel +AutoMLConfig +AutoMLContainerDefinition +AutoMLDataSource +AutoMLDataSplitConfig +AutoMLJob +AutoMLJobArn +AutoMLJobArtifacts +AutoMLJobChannel +AutoMLJobCompletionCriteria +AutoMLJobConfig +AutoMLJobInputDataConfig +AutoMLJobName +AutoMLJobObjective +AutoMLJobSecondaryStatus +AutoMLJobStatus +AutoMLJobStepMetadata +AutoMLJobSummaries +AutoMLJobSummary +AutoMLOutputDataConfig +AutoMLOverrideStrategy +AutoMLPartialFailureReason +AutoMLProblemTypeConfig +AutoMLProblemTypeConfigName +AutoMLProblemTypeResolvedAttributes +AutoMLResolvedAttributes +AutoMLResult +AutoMLS3DataSource +AutoMLSecurityConfig +AutoMerging +AutoMinorVersionUpgrade +AutoParameter +AutoParameters +AutoPause +AutoPlacement +AutoPromotionResult +AutoPromotionResultReason +AutoPushdown +AutoRecovery +AutoRecoverySupported +AutoRenew +AutoRollback +AutoRollbackConfig +AutoRollbackConfiguration +AutoScaling +AutoScalingConfiguration +AutoScalingConfigurationArn +AutoScalingConfigurationName +AutoScalingConfigurationRevision +AutoScalingConfigurationSummary +AutoScalingConfigurationSummaryList +AutoScalingDescription +AutoScalingDisabled +AutoScalingEnabled +AutoScalingEnabledUpdate +AutoScalingGroup +AutoScalingGroupARN +AutoScalingGroupArn +AutoScalingGroupConfiguration +AutoScalingGroupName +AutoScalingGroupNames +AutoScalingGroupNamesType +AutoScalingGroupProvider +AutoScalingGroupProviderUpdate +AutoScalingGroupRecommendation +AutoScalingGroupRecommendationOption +AutoScalingGroupState +AutoScalingGroups +AutoScalingGroupsType +AutoScalingInstanceDetails +AutoScalingInstances +AutoScalingInstancesType +AutoScalingNotificationTypes +AutoScalingPolicy +AutoScalingPolicyDescription +AutoScalingPolicyStateChangeReason +AutoScalingPolicyStatus +AutoScalingPolicyUpdate +AutoScalingRole +AutoScalingRoleArn +AutoScalingSchedule +AutoScalingSettingsDescription +AutoScalingSettingsUpdate +AutoScalingTargetTrackingScalingPolicyConfigurationDescription +AutoScalingTargetTrackingScalingPolicyConfigurationUpdate +AutoScalingThresholds +AutoScalingType +AutoScalingUpdate +AutoSnapshotAddOnRequest +AutoSnapshotDetails +AutoSoftwareUpdateEnabled +AutoStartConfig +AutoStopConfig +AutoTerminate +AutoTerminationPolicy +AutoTune +AutoTuneDetails +AutoTuneMaintenanceSchedule +AutoTuneOptions +AutoTuneOptionsInput +AutoTuneOptionsOutput +AutoTuneOptionsStatus +AutoTuneStatus +AutoTuneType +AutoTunes +AutoUpdate +AutoUpdateAfterRecommendedApplyByDate +AutoUpdateStartDate +AutoUpgrade +AutoUpgradeDate +AutoVerifiedAttributes +AutoWarmupEnabled +AutocommitPeriod +AutodefinedReverse +AutodefinedReverseFlag +AutomatedAbrRule +AutomatedAbrSettings +AutomatedDiscoveryInformation +AutomatedEncodingSettings +AutomatedSnapshotRetentionPeriod +AutomatedSnapshotStartHour +AutomatedUpdateDate +Automatic +AutomaticBackupRetentionDays +AutomaticFail +AutomaticFailover +AutomaticFailoverEnabled +AutomaticFailoverStatus +AutomaticInputFailoverSettings +AutomaticRenewal +AutomaticRestartTime +AutomaticTapeCreationPolicyInfo +AutomaticTapeCreationPolicyInfos +AutomaticTapeCreationRule +AutomaticTapeCreationRules +AutomaticallyAfterDays +Automation +AutomationDefinitionNotApprovedException +AutomationDefinitionNotFoundException +AutomationDefinitionVersionNotFoundException +AutomationExecution +AutomationExecutionException +AutomationExecutionFilter +AutomationExecutionId +AutomationExecutionLimitExceededException +AutomationExecutionMetadata +AutomationExecutionMetadataList +AutomationExecutionNotFoundException +AutomationExecutionStatus +AutomationExecutionTimeoutException +AutomationMode +AutomationRulesAction +AutomationRulesArns +AutomationRulesConfig +AutomationRulesFindingFieldsUpdate +AutomationRulesFindingFilters +AutomationRulesMetadata +AutomationStepNotFoundException +AutomationSubtype +AutomationTargetParameterName +AutomationType +Autoprovision +Autotune +AuxiliaryDataLocation +Av1QvbrSettings +Av1Settings +AvailBlanking +AvailBlankingImage +AvailConfiguration +AvailMatchingCriteria +AvailNum +AvailSettings +AvailSuppression +Availability +AvailabilityConfiguration +AvailabilityConfigurations +AvailabilityLocalHealthEventsConfig +AvailabilityMeasurement +AvailabilityMode +AvailabilityOptions +AvailabilityOptionsStatus +AvailabilityScoreThreshold +AvailabilityStatus +AvailabilityZone +AvailabilityZoneCount +AvailabilityZoneDetail +AvailabilityZoneFilter +AvailabilityZoneGroup +AvailabilityZoneId +AvailabilityZoneIdFilter +AvailabilityZoneInfo +AvailabilityZoneInformation +AvailabilityZoneMessage +AvailabilityZoneName +AvailabilityZoneNotSupportedException +AvailabilityZoneRelocation +AvailabilityZoneRelocationStatus +AvailabilityZones +AvailabilityZonesMismatch +Available +AvailableAddressCount +AvailableBalance +AvailableCIDRCount +AvailableCapacity +AvailableDataNodeCount +AvailableInstanceCapacity +AvailableInstanceCount +AvailableIpAddressCount +AvailableLabels +AvailableNumberSummary +AvailableNumbersList +AvailableOSReleases +AvailablePackageVersion +AvailablePolicyTypes +AvailableProcessorFeature +AvailableProcessorFeatures +AvailableProvisionedConcurrentExecutions +AvailableSlotsByChannel +AvailableUpgrades +AvailableVCpus +AvailsExpected +AvcIntraClass +AvcIntraSettings +AvcIntraUhdSettings +Average +AverageAccuracy +AverageDownloadRateLimitInBitsPerSec +AverageExecutionTimeMillis +AverageF1Score +AverageLength +AverageNormalizedUnitsUsedPerHour +AverageNumberOfInstancesUsedPerHour +AveragePrecision +AverageRecall +AverageUploadRateLimitInBitsPerSec +AverageUtilization +AverageWeightedQuantileLoss +Avg +AvgResizeRateInMegaBytesPerSecond +AvoidEmptyBatches +AvoidFerries +AvoidTolls +AwaitAnswerMachinePrompt +AwsAccount +AwsAccountId +AwsAccountNumber +AwsAmazonMqBroker +AwsAmazonMqBrokerDetails +AwsAmazonMqBrokerEncryptionOptionsDetails +AwsAmazonMqBrokerLdapServerMetadataDetails +AwsAmazonMqBrokerLogsDetails +AwsAmazonMqBrokerLogsPendingDetails +AwsAmazonMqBrokerMaintenanceWindowStartTimeDetails +AwsAmazonMqBrokerUsersDetails +AwsApiCallAction +AwsApiCallActionDomainDetails +AwsApiGatewayAccessLogSettings +AwsApiGatewayCanarySettings +AwsApiGatewayEndpointConfiguration +AwsApiGatewayMethodSettings +AwsApiGatewayRestApi +AwsApiGatewayRestApiDetails +AwsApiGatewayStage +AwsApiGatewayStageDetails +AwsApiGatewayV2Api +AwsApiGatewayV2ApiDetails +AwsApiGatewayV2RouteSettings +AwsApiGatewayV2Stage +AwsApiGatewayV2StageDetails +AwsAppSyncGraphQlApi +AwsAppSyncGraphQlApiAdditionalAuthenticationProvidersDetails +AwsAppSyncGraphQlApiDetails +AwsAppSyncGraphQlApiLambdaAuthorizerConfigDetails +AwsAppSyncGraphQlApiLogConfigDetails +AwsAppSyncGraphQlApiOpenIdConnectConfigDetails +AwsAppSyncGraphQlApiUserPoolConfigDetails +AwsAthenaWorkGroup +AwsAthenaWorkGroupConfigurationDetails +AwsAthenaWorkGroupConfigurationResultConfigurationDetails +AwsAthenaWorkGroupConfigurationResultConfigurationEncryptionConfigurationDetails +AwsAthenaWorkGroupDetails +AwsAutoScalingAutoScalingGroup +AwsAutoScalingAutoScalingGroupAvailabilityZonesListDetails +AwsAutoScalingAutoScalingGroupDetails +AwsAutoScalingAutoScalingGroupLaunchTemplateLaunchTemplateSpecification +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyDetails +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyInstancesDistributionDetails +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateDetails +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateLaunchTemplateSpecification +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateOverridesListDetails +AwsAutoScalingLaunchConfiguration +AwsAutoScalingLaunchConfigurationBlockDeviceMappingsDetails +AwsAutoScalingLaunchConfigurationBlockDeviceMappingsEbsDetails +AwsAutoScalingLaunchConfigurationDetails +AwsAutoScalingLaunchConfigurationInstanceMonitoringDetails +AwsAutoScalingLaunchConfigurationMetadataOptions +AwsBackupBackupPlan +AwsBackupBackupPlanAdvancedBackupSettingsDetails +AwsBackupBackupPlanBackupPlanDetails +AwsBackupBackupPlanDetails +AwsBackupBackupPlanLifecycleDetails +AwsBackupBackupPlanRuleCopyActionsDetails +AwsBackupBackupPlanRuleDetails +AwsBackupBackupVault +AwsBackupBackupVaultDetails +AwsBackupBackupVaultNotificationsDetails +AwsBackupRecoveryPoint +AwsBackupRecoveryPointArn +AwsBackupRecoveryPointCalculatedLifecycleDetails +AwsBackupRecoveryPointCreatedByDetails +AwsBackupRecoveryPointDetails +AwsBackupRecoveryPointLifecycleDetails +AwsCertificateManagerCertificate +AwsCertificateManagerCertificateDetails +AwsCertificateManagerCertificateDomainValidationOption +AwsCertificateManagerCertificateExtendedKeyUsage +AwsCertificateManagerCertificateKeyUsage +AwsCertificateManagerCertificateOptions +AwsCertificateManagerCertificateRenewalSummary +AwsCertificateManagerCertificateResourceRecord +AwsCloudFormationStack +AwsCloudFormationStackDetails +AwsCloudFormationStackDriftInformationDetails +AwsCloudFormationStackOutputsDetails +AwsCloudFrontDistribution +AwsCloudFrontDistributionCacheBehavior +AwsCloudFrontDistributionCacheBehaviors +AwsCloudFrontDistributionDefaultCacheBehavior +AwsCloudFrontDistributionDetails +AwsCloudFrontDistributionLogging +AwsCloudFrontDistributionOriginCustomOriginConfig +AwsCloudFrontDistributionOriginGroup +AwsCloudFrontDistributionOriginGroupFailover +AwsCloudFrontDistributionOriginGroupFailoverStatusCodes +AwsCloudFrontDistributionOriginGroups +AwsCloudFrontDistributionOriginItem +AwsCloudFrontDistributionOriginS3OriginConfig +AwsCloudFrontDistributionOriginSslProtocols +AwsCloudFrontDistributionOrigins +AwsCloudFrontDistributionViewerCertificate +AwsCloudMapInstanceAttribute +AwsCloudMapServiceDiscovery +AwsCloudTrailTrail +AwsCloudTrailTrailDetails +AwsCloudWatchAlarm +AwsCloudWatchAlarmDetails +AwsCloudWatchAlarmDimensionsDetails +AwsCodeBuildProject +AwsCodeBuildProjectArtifactsDetails +AwsCodeBuildProjectDetails +AwsCodeBuildProjectEnvironment +AwsCodeBuildProjectEnvironmentEnvironmentVariablesDetails +AwsCodeBuildProjectEnvironmentRegistryCredential +AwsCodeBuildProjectLogsConfigCloudWatchLogsDetails +AwsCodeBuildProjectLogsConfigDetails +AwsCodeBuildProjectLogsConfigS3LogsDetails +AwsCodeBuildProjectSource +AwsCodeBuildProjectVpcConfig +AwsCognitoIdentityPoolId +AwsCognitoRegion +AwsCorsConfiguration +AwsCredentials +AwsDynamoDbTable +AwsDynamoDbTableAttributeDefinition +AwsDynamoDbTableBillingModeSummary +AwsDynamoDbTableDetails +AwsDynamoDbTableGlobalSecondaryIndex +AwsDynamoDbTableKeySchema +AwsDynamoDbTableLocalSecondaryIndex +AwsDynamoDbTableProjection +AwsDynamoDbTableProvisionedThroughput +AwsDynamoDbTableProvisionedThroughputOverride +AwsDynamoDbTableReplica +AwsDynamoDbTableReplicaGlobalSecondaryIndex +AwsDynamoDbTableRestoreSummary +AwsDynamoDbTableSseDescription +AwsDynamoDbTableStreamSpecification +AwsEc2Eip +AwsEc2EipDetails +AwsEc2Instance +AwsEc2InstanceDetails +AwsEc2InstanceMetadataOptions +AwsEc2InstanceMonitoringDetails +AwsEc2InstanceNetworkInterfacesDetails +AwsEc2InstanceViolation +AwsEc2LaunchTemplate +AwsEc2LaunchTemplateDataBlockDeviceMappingSetDetails +AwsEc2LaunchTemplateDataBlockDeviceMappingSetEbsDetails +AwsEc2LaunchTemplateDataCapacityReservationSpecificationCapacityReservationTargetDetails +AwsEc2LaunchTemplateDataCapacityReservationSpecificationDetails +AwsEc2LaunchTemplateDataCpuOptionsDetails +AwsEc2LaunchTemplateDataCreditSpecificationDetails +AwsEc2LaunchTemplateDataDetails +AwsEc2LaunchTemplateDataElasticGpuSpecificationSetDetails +AwsEc2LaunchTemplateDataElasticInferenceAcceleratorSetDetails +AwsEc2LaunchTemplateDataEnclaveOptionsDetails +AwsEc2LaunchTemplateDataHibernationOptionsDetails +AwsEc2LaunchTemplateDataIamInstanceProfileDetails +AwsEc2LaunchTemplateDataInstanceMarketOptionsDetails +AwsEc2LaunchTemplateDataInstanceMarketOptionsSpotOptionsDetails +AwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorCountDetails +AwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorTotalMemoryMiBDetails +AwsEc2LaunchTemplateDataInstanceRequirementsBaselineEbsBandwidthMbpsDetails +AwsEc2LaunchTemplateDataInstanceRequirementsDetails +AwsEc2LaunchTemplateDataInstanceRequirementsMemoryGiBPerVCpuDetails +AwsEc2LaunchTemplateDataInstanceRequirementsMemoryMiBDetails +AwsEc2LaunchTemplateDataInstanceRequirementsNetworkInterfaceCountDetails +AwsEc2LaunchTemplateDataInstanceRequirementsTotalLocalStorageGBDetails +AwsEc2LaunchTemplateDataInstanceRequirementsVCpuCountDetails +AwsEc2LaunchTemplateDataLicenseSetDetails +AwsEc2LaunchTemplateDataMaintenanceOptionsDetails +AwsEc2LaunchTemplateDataMetadataOptionsDetails +AwsEc2LaunchTemplateDataMonitoringDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv4PrefixesDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6AddressesDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6PrefixesDetails +AwsEc2LaunchTemplateDataNetworkInterfaceSetPrivateIpAddressesDetails +AwsEc2LaunchTemplateDataPlacementDetails +AwsEc2LaunchTemplateDataPrivateDnsNameOptionsDetails +AwsEc2LaunchTemplateDetails +AwsEc2NetworkAcl +AwsEc2NetworkAclAssociation +AwsEc2NetworkAclDetails +AwsEc2NetworkAclEntry +AwsEc2NetworkInterface +AwsEc2NetworkInterfaceAttachment +AwsEc2NetworkInterfaceDetails +AwsEc2NetworkInterfaceIpV6AddressDetail +AwsEc2NetworkInterfacePrivateIpAddressDetail +AwsEc2NetworkInterfaceSecurityGroup +AwsEc2NetworkInterfaceViolation +AwsEc2NetworkInterfaceViolations +AwsEc2RouteTable +AwsEc2RouteTableDetails +AwsEc2SecurityGroup +AwsEc2SecurityGroupDetails +AwsEc2SecurityGroupIpPermission +AwsEc2SecurityGroupIpRange +AwsEc2SecurityGroupIpv6Range +AwsEc2SecurityGroupPrefixListId +AwsEc2SecurityGroupUserIdGroupPair +AwsEc2Subnet +AwsEc2SubnetDetails +AwsEc2TransitGateway +AwsEc2TransitGatewayDetails +AwsEc2Volume +AwsEc2VolumeAttachment +AwsEc2VolumeDetails +AwsEc2Vpc +AwsEc2VpcDetails +AwsEc2VpcEndpointService +AwsEc2VpcEndpointServiceDetails +AwsEc2VpcEndpointServiceServiceTypeDetails +AwsEc2VpcPeeringConnection +AwsEc2VpcPeeringConnectionDetails +AwsEc2VpcPeeringConnectionStatusDetails +AwsEc2VpcPeeringConnectionVpcInfoDetails +AwsEc2VpnConnection +AwsEc2VpnConnectionDetails +AwsEc2VpnConnectionOptionsDetails +AwsEc2VpnConnectionOptionsTunnelOptionsDetails +AwsEc2VpnConnectionRoutesDetails +AwsEc2VpnConnectionVgwTelemetryDetails +AwsEcrContainerAggregation +AwsEcrContainerAggregationResponse +AwsEcrContainerImage +AwsEcrContainerImageDetails +AwsEcrRepository +AwsEcrRepositoryDetails +AwsEcrRepositoryImageScanningConfigurationDetails +AwsEcrRepositoryLifecyclePolicyDetails +AwsEcsCluster +AwsEcsClusterClusterSettingsDetails +AwsEcsClusterConfigurationDetails +AwsEcsClusterConfigurationExecuteCommandConfigurationDetails +AwsEcsClusterConfigurationExecuteCommandConfigurationLogConfigurationDetails +AwsEcsClusterDefaultCapacityProviderStrategyDetails +AwsEcsClusterDetails +AwsEcsContainer +AwsEcsContainerDetails +AwsEcsService +AwsEcsServiceCapacityProviderStrategyDetails +AwsEcsServiceDeploymentConfigurationDeploymentCircuitBreakerDetails +AwsEcsServiceDeploymentConfigurationDetails +AwsEcsServiceDeploymentControllerDetails +AwsEcsServiceDetails +AwsEcsServiceLoadBalancersDetails +AwsEcsServiceNetworkConfigurationAwsVpcConfigurationDetails +AwsEcsServiceNetworkConfigurationDetails +AwsEcsServicePlacementConstraintsDetails +AwsEcsServicePlacementStrategiesDetails +AwsEcsServiceServiceRegistriesDetails +AwsEcsTask +AwsEcsTaskDefinition +AwsEcsTaskDefinitionContainerDefinitionsDependsOnDetails +AwsEcsTaskDefinitionContainerDefinitionsDetails +AwsEcsTaskDefinitionContainerDefinitionsEnvironmentDetails +AwsEcsTaskDefinitionContainerDefinitionsEnvironmentFilesDetails +AwsEcsTaskDefinitionContainerDefinitionsExtraHostsDetails +AwsEcsTaskDefinitionContainerDefinitionsFirelensConfigurationDetails +AwsEcsTaskDefinitionContainerDefinitionsHealthCheckDetails +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersCapabilitiesDetails +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDetails +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDevicesDetails +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersTmpfsDetails +AwsEcsTaskDefinitionContainerDefinitionsLogConfigurationDetails +AwsEcsTaskDefinitionContainerDefinitionsLogConfigurationSecretOptionsDetails +AwsEcsTaskDefinitionContainerDefinitionsMountPointsDetails +AwsEcsTaskDefinitionContainerDefinitionsPortMappingsDetails +AwsEcsTaskDefinitionContainerDefinitionsRepositoryCredentialsDetails +AwsEcsTaskDefinitionContainerDefinitionsResourceRequirementsDetails +AwsEcsTaskDefinitionContainerDefinitionsSecretsDetails +AwsEcsTaskDefinitionContainerDefinitionsSystemControlsDetails +AwsEcsTaskDefinitionContainerDefinitionsUlimitsDetails +AwsEcsTaskDefinitionContainerDefinitionsVolumesFromDetails +AwsEcsTaskDefinitionDetails +AwsEcsTaskDefinitionInferenceAcceleratorsDetails +AwsEcsTaskDefinitionPlacementConstraintsDetails +AwsEcsTaskDefinitionProxyConfigurationDetails +AwsEcsTaskDefinitionProxyConfigurationProxyConfigurationPropertiesDetails +AwsEcsTaskDefinitionVolumesDetails +AwsEcsTaskDefinitionVolumesDockerVolumeConfigurationDetails +AwsEcsTaskDefinitionVolumesEfsVolumeConfigurationAuthorizationConfigDetails +AwsEcsTaskDefinitionVolumesEfsVolumeConfigurationDetails +AwsEcsTaskDefinitionVolumesHostDetails +AwsEcsTaskDetails +AwsEcsTaskVolumeDetails +AwsEcsTaskVolumeHostDetails +AwsEfsAccessPoint +AwsEfsAccessPointDetails +AwsEfsAccessPointPosixUserDetails +AwsEfsAccessPointRootDirectoryCreationInfoDetails +AwsEfsAccessPointRootDirectoryDetails +AwsEksCluster +AwsEksClusterDetails +AwsEksClusterLoggingClusterLoggingDetails +AwsEksClusterLoggingDetails +AwsEksClusterResourcesVpcConfigDetails +AwsElasticBeanstalkEnvironment +AwsElasticBeanstalkEnvironmentDetails +AwsElasticBeanstalkEnvironmentEnvironmentLink +AwsElasticBeanstalkEnvironmentOptionSetting +AwsElasticBeanstalkEnvironmentTier +AwsElasticsearchDomain +AwsElasticsearchDomainDetails +AwsElasticsearchDomainDomainEndpointOptions +AwsElasticsearchDomainElasticsearchClusterConfigDetails +AwsElasticsearchDomainElasticsearchClusterConfigZoneAwarenessConfigDetails +AwsElasticsearchDomainEncryptionAtRestOptions +AwsElasticsearchDomainLogPublishingOptions +AwsElasticsearchDomainLogPublishingOptionsLogConfig +AwsElasticsearchDomainNodeToNodeEncryptionOptions +AwsElasticsearchDomainServiceSoftwareOptions +AwsElasticsearchDomainVPCOptions +AwsElbAppCookieStickinessPolicy +AwsElbLbCookieStickinessPolicy +AwsElbLoadBalancer +AwsElbLoadBalancerAccessLog +AwsElbLoadBalancerAdditionalAttribute +AwsElbLoadBalancerAttributes +AwsElbLoadBalancerBackendServerDescription +AwsElbLoadBalancerConnectionDraining +AwsElbLoadBalancerConnectionSettings +AwsElbLoadBalancerCrossZoneLoadBalancing +AwsElbLoadBalancerDetails +AwsElbLoadBalancerHealthCheck +AwsElbLoadBalancerInstance +AwsElbLoadBalancerListener +AwsElbLoadBalancerListenerDescription +AwsElbLoadBalancerPolicies +AwsElbLoadBalancerSourceSecurityGroup +AwsElbv2LoadBalancer +AwsElbv2LoadBalancerAttribute +AwsElbv2LoadBalancerDetails +AwsEventSchemasRegistry +AwsEventSchemasRegistryDetails +AwsGroundStationAgentEndpoint +AwsGuardDutyDetector +AwsGuardDutyDetectorDataSourcesCloudTrailDetails +AwsGuardDutyDetectorDataSourcesDetails +AwsGuardDutyDetectorDataSourcesDnsLogsDetails +AwsGuardDutyDetectorDataSourcesFlowLogsDetails +AwsGuardDutyDetectorDataSourcesKubernetesAuditLogsDetails +AwsGuardDutyDetectorDataSourcesKubernetesDetails +AwsGuardDutyDetectorDataSourcesMalwareProtectionDetails +AwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsDetails +AwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsEbsVolumesDetails +AwsGuardDutyDetectorDataSourcesS3LogsDetails +AwsGuardDutyDetectorDetails +AwsGuardDutyDetectorFeaturesDetails +AwsHardwareCertificate +AwsIamAccessKey +AwsIamAccessKeyDetails +AwsIamAccessKeySessionContext +AwsIamAccessKeySessionContextAttributes +AwsIamAccessKeySessionContextSessionIssuer +AwsIamAttachedManagedPolicy +AwsIamConfig +AwsIamGroup +AwsIamGroupDetails +AwsIamGroupPolicy +AwsIamInstanceProfile +AwsIamInstanceProfileRole +AwsIamPermissionsBoundary +AwsIamPolicy +AwsIamPolicyDetails +AwsIamPolicyVersion +AwsIamRole +AwsIamRoleDetails +AwsIamRolePolicy +AwsIamUser +AwsIamUserDetails +AwsIamUserPolicy +AwsIdentity +AwsIotAnalyticsParameters +AwsJobAbortConfig +AwsJobAbortCriteria +AwsJobExecutionsRolloutConfig +AwsJobExponentialRolloutRate +AwsJobPresignedUrlConfig +AwsJobRateIncreaseCriteria +AwsJobTimeoutConfig +AwsKinesisStream +AwsKinesisStreamDetails +AwsKinesisStreamStreamEncryptionDetails +AwsKmsKey +AwsKmsKeyArn +AwsKmsKeyDetails +AwsKmsKeyId +AwsLambdaFunction +AwsLambdaFunctionCode +AwsLambdaFunctionDeadLetterConfig +AwsLambdaFunctionDetails +AwsLambdaFunctionEnvironment +AwsLambdaFunctionEnvironmentError +AwsLambdaFunctionLayer +AwsLambdaFunctionTracingConfig +AwsLambdaFunctionVpcConfig +AwsLambdaLayerVersion +AwsLambdaLayerVersionDetails +AwsLambdaTransformation +AwsLogSourceConfiguration +AwsLogSourceResource +AwsManaged +AwsManagedHumanLoopRequestSource +AwsManagedResources +AwsMountPoint +AwsNetworkFirewallFirewall +AwsNetworkFirewallFirewallDetails +AwsNetworkFirewallFirewallPolicy +AwsNetworkFirewallFirewallPolicyDetails +AwsNetworkFirewallFirewallSubnetMappingsDetails +AwsNetworkFirewallRuleGroup +AwsNetworkFirewallRuleGroupDetails +AwsOpenSearchServiceDomain +AwsOpenSearchServiceDomainAdvancedSecurityOptionsDetails +AwsOpenSearchServiceDomainClusterConfigDetails +AwsOpenSearchServiceDomainClusterConfigZoneAwarenessConfigDetails +AwsOpenSearchServiceDomainDetails +AwsOpenSearchServiceDomainDomainEndpointOptionsDetails +AwsOpenSearchServiceDomainEncryptionAtRestOptionsDetails +AwsOpenSearchServiceDomainLogPublishingOption +AwsOpenSearchServiceDomainLogPublishingOptionsDetails +AwsOpenSearchServiceDomainMasterUserOptionsDetails +AwsOpenSearchServiceDomainNodeToNodeEncryptionOptionsDetails +AwsOpenSearchServiceDomainServiceSoftwareOptionsDetails +AwsOpenSearchServiceDomainVpcOptionsDetails +AwsOrg +AwsOrganizationsSource +AwsRdsDbCluster +AwsRdsDbClusterAssociatedRole +AwsRdsDbClusterDetails +AwsRdsDbClusterMember +AwsRdsDbClusterOptionGroupMembership +AwsRdsDbClusterSnapshot +AwsRdsDbClusterSnapshotDbClusterSnapshotAttribute +AwsRdsDbClusterSnapshotDetails +AwsRdsDbDomainMembership +AwsRdsDbInstance +AwsRdsDbInstanceAssociatedRole +AwsRdsDbInstanceDetails +AwsRdsDbInstanceEndpoint +AwsRdsDbInstanceVpcSecurityGroup +AwsRdsDbOptionGroupMembership +AwsRdsDbParameterGroup +AwsRdsDbPendingModifiedValues +AwsRdsDbProcessorFeature +AwsRdsDbSecurityGroup +AwsRdsDbSecurityGroupDetails +AwsRdsDbSecurityGroupEc2SecurityGroup +AwsRdsDbSecurityGroupIpRange +AwsRdsDbSnapshot +AwsRdsDbSnapshotDetails +AwsRdsDbStatusInfo +AwsRdsDbSubnetGroup +AwsRdsDbSubnetGroupSubnet +AwsRdsDbSubnetGroupSubnetAvailabilityZone +AwsRdsEventSubscription +AwsRdsEventSubscriptionDetails +AwsRdsPendingCloudWatchLogsExports +AwsRedshiftCluster +AwsRedshiftClusterClusterNode +AwsRedshiftClusterClusterParameterGroup +AwsRedshiftClusterClusterParameterStatus +AwsRedshiftClusterClusterSecurityGroup +AwsRedshiftClusterClusterSnapshotCopyStatus +AwsRedshiftClusterDeferredMaintenanceWindow +AwsRedshiftClusterDetails +AwsRedshiftClusterElasticIpStatus +AwsRedshiftClusterEndpoint +AwsRedshiftClusterHsmStatus +AwsRedshiftClusterIamRole +AwsRedshiftClusterLoggingStatus +AwsRedshiftClusterPendingModifiedValues +AwsRedshiftClusterResizeInfo +AwsRedshiftClusterRestoreStatus +AwsRedshiftClusterVpcSecurityGroup +AwsRegion +AwsRegions +AwsS3AccountPublicAccessBlock +AwsS3AccountPublicAccessBlockDetails +AwsS3Bucket +AwsS3BucketBucketLifecycleConfigurationDetails +AwsS3BucketBucketLifecycleConfigurationRulesAbortIncompleteMultipartUploadDetails +AwsS3BucketBucketLifecycleConfigurationRulesDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsTagDetails +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateTagDetails +AwsS3BucketBucketLifecycleConfigurationRulesNoncurrentVersionTransitionsDetails +AwsS3BucketBucketLifecycleConfigurationRulesTransitionsDetails +AwsS3BucketBucketVersioningConfiguration +AwsS3BucketDetails +AwsS3BucketLoggingConfiguration +AwsS3BucketNotificationConfiguration +AwsS3BucketNotificationConfigurationDetail +AwsS3BucketNotificationConfigurationFilter +AwsS3BucketNotificationConfigurationS3KeyFilter +AwsS3BucketNotificationConfigurationS3KeyFilterRule +AwsS3BucketObjectLockConfiguration +AwsS3BucketObjectLockConfigurationRuleDefaultRetentionDetails +AwsS3BucketObjectLockConfigurationRuleDetails +AwsS3BucketServerSideEncryptionByDefault +AwsS3BucketServerSideEncryptionConfiguration +AwsS3BucketServerSideEncryptionRule +AwsS3BucketWebsiteConfiguration +AwsS3BucketWebsiteConfigurationRedirectTo +AwsS3BucketWebsiteConfigurationRoutingRule +AwsS3BucketWebsiteConfigurationRoutingRuleCondition +AwsS3BucketWebsiteConfigurationRoutingRuleRedirect +AwsS3Object +AwsS3ObjectDetails +AwsSageMakerNotebookInstance +AwsSageMakerNotebookInstanceDetails +AwsSageMakerNotebookInstanceMetadataServiceConfigurationDetails +AwsSecretsManagerSecret +AwsSecretsManagerSecretDetails +AwsSecretsManagerSecretRotationRules +AwsSecurityFinding +AwsSecurityFindingFilters +AwsSecurityFindingIdentifier +AwsService +AwsSnsTopic +AwsSnsTopicDetails +AwsSnsTopicSubscription +AwsSqsQueue +AwsSqsQueueDetails +AwsSsmComplianceSummary +AwsSsmPatch +AwsSsmPatchCompliance +AwsSsmPatchComplianceDetails +AwsSsoAuthentication +AwsStepFunctionStateMachine +AwsStepFunctionStateMachineDetails +AwsStepFunctionStateMachineLoggingConfigurationDestinationsCloudWatchLogsLogGroupDetails +AwsStepFunctionStateMachineLoggingConfigurationDestinationsDetails +AwsStepFunctionStateMachineLoggingConfigurationDetails +AwsStepFunctionStateMachineTracingConfigurationDetails +AwsTagKey +AwsTagValue +AwsUserPoolsId +AwsUserPoolsWebClientId +AwsVPCSecurityGroupViolation +AwsVpcConfiguration +AwsWafRateBasedRule +AwsWafRateBasedRuleDetails +AwsWafRateBasedRuleMatchPredicate +AwsWafRegionalRateBasedRule +AwsWafRegionalRateBasedRuleDetails +AwsWafRegionalRateBasedRuleMatchPredicate +AwsWafRegionalRule +AwsWafRegionalRuleDetails +AwsWafRegionalRuleGroup +AwsWafRegionalRuleGroupDetails +AwsWafRegionalRuleGroupRulesActionDetails +AwsWafRegionalRuleGroupRulesDetails +AwsWafRegionalRulePredicateListDetails +AwsWafRegionalWebAcl +AwsWafRegionalWebAclDetails +AwsWafRegionalWebAclRulesListActionDetails +AwsWafRegionalWebAclRulesListDetails +AwsWafRegionalWebAclRulesListOverrideActionDetails +AwsWafRule +AwsWafRuleDetails +AwsWafRuleGroup +AwsWafRuleGroupDetails +AwsWafRuleGroupRulesActionDetails +AwsWafRuleGroupRulesDetails +AwsWafRulePredicateListDetails +AwsWafWebAcl +AwsWafWebAclDetails +AwsWafWebAclRule +AwsWafv2ActionAllowDetails +AwsWafv2ActionBlockDetails +AwsWafv2CustomHttpHeader +AwsWafv2CustomRequestHandlingDetails +AwsWafv2CustomResponseDetails +AwsWafv2RuleGroup +AwsWafv2RuleGroupDetails +AwsWafv2RulesActionCaptchaDetails +AwsWafv2RulesActionCountDetails +AwsWafv2RulesActionDetails +AwsWafv2RulesDetails +AwsWafv2VisibilityConfigDetails +AwsWafv2WebAcl +AwsWafv2WebAclActionDetails +AwsWafv2WebAclCaptchaConfigDetails +AwsWafv2WebAclCaptchaConfigImmunityTimePropertyDetails +AwsWafv2WebAclDetails +AwsXrayEncryptionConfig +AwsXrayEncryptionConfigDetails +AxesRangeScale +AxisBinding +AxisDataOptions +AxisDisplayMinMaxRange +AxisDisplayOptions +AxisDisplayRange +AxisLabelOptions +AxisLabelReferenceOptions +AxisLineVisibility +AxisLinearScale +AxisLogarithmicScale +AxisOffset +AxisOptions +AxisScale +AxisTickLabelOptions +AzureBlobSasConfiguration +B +BGPPeer +BS +BabelfishDatabaseName +BackTestAnomalyDetectorRequest +BackTestConfiguration +BackTestWindowOffset +BackendAPIAppSyncAuthSettings +BackendAPIAuthType +BackendAPIConflictResolution +BackendAPIResourceConfig +BackendAuthAppleProviderConfig +BackendAuthSocialProviderConfig +BackendConnectionErrors +BackendDefaults +BackendEnvironment +BackendEnvironmentList +BackendEnvironmentName +BackendJobRespObj +BackendManagerAppId +BackendServerDescription +BackendServerDescriptions +BackendStoragePermissions +BackfillError +BackfillErrors +BackfillMode +Backfilling +Background +BackgroundColor +BackgroundOpacity +BackgroundStyle +BackgroundVisibility +Backint +BackintConfig +BackintMode +BacktestResults +BacktrackConsumedChangeRecords +BacktrackDBClusterMessage +BacktrackIdentifier +BacktrackRequestCreationTime +BacktrackTo +BacktrackWindow +BacktrackedFrom +Backup +BackupArn +BackupBeingCopied +BackupCreationDateTime +BackupDescription +BackupDetails +BackupExpiryDateTime +BackupFailureDetails +BackupId +BackupIds +BackupInProgress +BackupInUseException +BackupJob +BackupJobId +BackupJobs +BackupName +BackupNotFound +BackupNotFoundException +BackupObject +BackupOptions +BackupPlan +BackupPlanArn +BackupPlanDocument +BackupPlanId +BackupPlanInput +BackupPlanName +BackupPlanRule +BackupPlanTags +BackupPlanTemplateId +BackupPlanTemplateJson +BackupPlanTemplateName +BackupPlanTemplatesList +BackupPlanTemplatesListMember +BackupPlanVersion +BackupPlanVersionsList +BackupPlansList +BackupPlansListMember +BackupPolicy +BackupPolicyDescription +BackupPolicyNotFoundFault +BackupProgressInMegaBytes +BackupRestoring +BackupRetentionCount +BackupRetentionPeriod +BackupRetentionPolicy +BackupRule +BackupRuleId +BackupRuleInput +BackupSelection +BackupSelectionsList +BackupSelectionsListMember +BackupSizeBytes +BackupSizeInBytes +BackupState +BackupStatus +BackupSummaries +BackupSummary +BackupTarget +BackupType +BackupVaultAccountId +BackupVaultArn +BackupVaultEvents +BackupVaultList +BackupVaultListMember +BackupVaultName +BackupVaultTags +Backups +BadDocumentException +BadGatewayException +BadRequest +BadRequestDetail +BadRequestException +Badge +Baidu +BaiduChannelRequest +BaiduChannelResponse +BaiduMessage +BalancingStrategy +BandFilter +BandMathConfigInput +BandName +Bandwidth +BandwidthRateLimitInterval +BandwidthRateLimitIntervals +BandwidthReductionFilter +BandwidthType +BannerText +BarChartAggregatedFieldWells +BarChartConfiguration +BarChartFieldWells +BarChartSortConfiguration +BarChartVisual +BarDataLabels +BarValues +BareMetal +BarsArrangement +Base +Base32StringSeed +Base64String +BaseCanaryRunId +BaseConfigurationItem +BaseConfigurationItems +BaseDirectory +BaseEndpointDnsNames +BaseException +BaseImage +BaseImageArn +BaseKpiResult +BaseLat +BaseLensVersion +BaseLng +BaseMapStyle +BaseModelName +BasePath +BasePathMapping +BasePathMappings +BasePathUpdate +BaseScore +BaseScreenshot +BaseScreenshots +BaseSeriesSettings +BaseStationId +BaseThemeId +BaseUrl +BaseUrlContent +BaseUrlContent1 +BaseUrlManifest +BaseUrlManifest1 +BaseVector +BasedOnSpiceSchedule +Baseline +BaselineBandwidthInGbps +BaselineBandwidthInMbps +BaselineConfig +BaselineData +BaselineDescription +BaselineEbsBandwidthMbps +BaselineEbsBandwidthMbpsRequest +BaselineId +BaselineIdentities +BaselineIdentity +BaselineIops +BaselineMetric +BaselineMetrics +BaselineName +BaselineOverride +BaselineThroughputInMBps +BaselineUsedForDriftCheckConstraints +BaselineUsedForDriftCheckStatistics +BaseliningJobName +Basepath +BasicAuthCredentials +BasicAuthParameters +BasicAuthSecretId +BasicAuthentication +BasicAuthenticationConfiguration +BasicCatalogTarget +BasicLayout +Batch +BatchAcknowledgeAlarmRequest +BatchAcknowledgeAlarmResponse +BatchAddFacetToObject +BatchAlarmActionErrorEntry +BatchApplyUpdateActionMessage +BatchArrayProperties +BatchAssociateApprovalRuleTemplateWithRepositoriesError +BatchAssociateApprovalRuleTemplateWithRepositoriesInput +BatchAssociateApprovalRuleTemplateWithRepositoriesOutput +BatchAssociateAssessmentReportEvidenceRequest +BatchAssociateAssessmentReportEvidenceResponse +BatchAssociateClientDeviceWithCoreDeviceRequest +BatchAssociateClientDeviceWithCoreDeviceResponse +BatchAssociateProjectAssetsRequest +BatchAssociateProjectAssetsResponse +BatchAssociateResourceRequest +BatchAssociateResourceResponse +BatchAssociateResourcesToCustomLineItemInput +BatchAssociateResourcesToCustomLineItemOutput +BatchAssociateScramSecretRequest +BatchAssociateScramSecretResponse +BatchAssociateServiceActionWithProvisioningArtifactInput +BatchAssociateServiceActionWithProvisioningArtifactOutput +BatchAssociateUserStackRequest +BatchAssociateUserStackResult +BatchAttachObject +BatchAttachObjectResponse +BatchAttachPolicy +BatchAttachToIndex +BatchAttachToIndexResponse +BatchAttachTypedLink +BatchAttachTypedLinkResponse +BatchChannelMemberships +BatchCheckLayerAvailabilityRequest +BatchCheckLayerAvailabilityResponse +BatchContainerOverrides +BatchCount +BatchCreateAttendeeRequest +BatchCreateAttendeeResponse +BatchCreateChannelMembershipError +BatchCreateChannelMembershipRequest +BatchCreateChannelMembershipResponse +BatchCreateCustomVocabularyItemRequest +BatchCreateCustomVocabularyItemResponse +BatchCreateDelegationByAssessmentError +BatchCreateDelegationByAssessmentRequest +BatchCreateDelegationByAssessmentResponse +BatchCreateIndex +BatchCreateIndexResponse +BatchCreateObject +BatchCreateObjectResponse +BatchCreatePartitionRequest +BatchCreatePartitionResponse +BatchCreateRoomMembershipRequest +BatchCreateRoomMembershipResponse +BatchCreateRumMetricDefinitionsError +BatchCreateRumMetricDefinitionsRequest +BatchCreateRumMetricDefinitionsResponse +BatchCreateTableRowsRequest +BatchCreateTableRowsResult +BatchCreateVariableError +BatchCreateVariableRequest +BatchCreateVariableResult +BatchCreateVehicleRequest +BatchCreateVehicleResponse +BatchDataCaptureConfig +BatchDeleteAutomationRulesRequest +BatchDeleteAutomationRulesResponse +BatchDeleteBuildsInput +BatchDeleteBuildsOutput +BatchDeleteClusterSnapshotsRequest +BatchDeleteClusterSnapshotsResult +BatchDeleteConnectionRequest +BatchDeleteConnectionResponse +BatchDeleteCustomVocabularyItemRequest +BatchDeleteCustomVocabularyItemResponse +BatchDeleteDelegationByAssessmentError +BatchDeleteDelegationByAssessmentRequest +BatchDeleteDelegationByAssessmentResponse +BatchDeleteDetectorErrorEntry +BatchDeleteDetectorRequest +BatchDeleteDetectorResponse +BatchDeleteDevicePositionHistoryError +BatchDeleteDevicePositionHistoryRequest +BatchDeleteDevicePositionHistoryResponse +BatchDeleteDocumentRequest +BatchDeleteDocumentResponse +BatchDeleteDocumentResponseFailedDocument +BatchDeleteFeaturedResultsSetError +BatchDeleteFeaturedResultsSetRequest +BatchDeleteFeaturedResultsSetResponse +BatchDeleteGeofenceError +BatchDeleteGeofenceRequest +BatchDeleteGeofenceResponse +BatchDeleteImageRequest +BatchDeleteImageResponse +BatchDeleteImportDataError +BatchDeleteImportDataRequest +BatchDeleteImportDataResponse +BatchDeleteObject +BatchDeletePartitionRequest +BatchDeletePartitionResponse +BatchDeletePhoneNumberRequest +BatchDeletePhoneNumberResponse +BatchDeleteReadSetRequest +BatchDeleteReadSetResponse +BatchDeleteRecipeVersionRequest +BatchDeleteRecipeVersionResponse +BatchDeleteRequest +BatchDeleteRequestSizeExceededFault +BatchDeleteResponse +BatchDeleteRumMetricDefinitionsError +BatchDeleteRumMetricDefinitionsRequest +BatchDeleteRumMetricDefinitionsResponse +BatchDeleteScheduledActionAnswer +BatchDeleteScheduledActionType +BatchDeleteTableRequest +BatchDeleteTableResponse +BatchDeleteTableRowsRequest +BatchDeleteTableRowsResult +BatchDeleteTableVersionRequest +BatchDeleteTableVersionResponse +BatchDeleteWorldsRequest +BatchDeleteWorldsResponse +BatchDescribeMergeConflictsError +BatchDescribeMergeConflictsInput +BatchDescribeMergeConflictsOutput +BatchDescribeModelPackageError +BatchDescribeModelPackageErrorMap +BatchDescribeModelPackageInput +BatchDescribeModelPackageOutput +BatchDescribeModelPackageSummary +BatchDescribeSimulationJobRequest +BatchDescribeSimulationJobResponse +BatchDescribeTypeConfigurationsError +BatchDescribeTypeConfigurationsInput +BatchDescribeTypeConfigurationsOutput +BatchDetachFromIndex +BatchDetachFromIndexResponse +BatchDetachObject +BatchDetachObjectResponse +BatchDetachPolicy +BatchDetachTypedLink +BatchDetectDominantLanguageItemResult +BatchDetectDominantLanguageRequest +BatchDetectDominantLanguageResponse +BatchDetectEntitiesItemResult +BatchDetectEntitiesRequest +BatchDetectEntitiesResponse +BatchDetectKeyPhrasesItemResult +BatchDetectKeyPhrasesRequest +BatchDetectKeyPhrasesResponse +BatchDetectSentimentItemResult +BatchDetectSentimentRequest +BatchDetectSentimentResponse +BatchDetectSyntaxItemResult +BatchDetectSyntaxRequest +BatchDetectSyntaxResponse +BatchDetectTargetedSentimentItemResult +BatchDetectTargetedSentimentRequest +BatchDetectTargetedSentimentResponse +BatchDisableAlarmRequest +BatchDisableAlarmResponse +BatchDisableStandardsRequest +BatchDisableStandardsResponse +BatchDisassociateApprovalRuleTemplateFromRepositoriesError +BatchDisassociateApprovalRuleTemplateFromRepositoriesInput +BatchDisassociateApprovalRuleTemplateFromRepositoriesOutput +BatchDisassociateAssessmentReportEvidenceRequest +BatchDisassociateAssessmentReportEvidenceResponse +BatchDisassociateClientDeviceFromCoreDeviceRequest +BatchDisassociateClientDeviceFromCoreDeviceResponse +BatchDisassociateProjectAssetsRequest +BatchDisassociateProjectAssetsResponse +BatchDisassociateResourceRequest +BatchDisassociateResourceResponse +BatchDisassociateResourcesFromCustomLineItemInput +BatchDisassociateResourcesFromCustomLineItemOutput +BatchDisassociateScramSecretRequest +BatchDisassociateScramSecretResponse +BatchDisassociateServiceActionFromProvisioningArtifactInput +BatchDisassociateServiceActionFromProvisioningArtifactOutput +BatchDisassociateUserStackRequest +BatchDisassociateUserStackResult +BatchEnableAlarmRequest +BatchEnableAlarmResponse +BatchEnableStandardsRequest +BatchEnableStandardsResponse +BatchEntryIdsNotDistinctException +BatchEnvironmentVariable +BatchError +BatchEvaluateFeatureRequest +BatchEvaluateFeatureResponse +BatchEvaluateGeofencesError +BatchEvaluateGeofencesRequest +BatchEvaluateGeofencesResponse +BatchExecuteStatementException +BatchExecuteStatementInput +BatchExecuteStatementOutput +BatchExecuteStatementRequest +BatchExecuteStatementResponse +BatchFailedResultModel +BatchGetAccountStatusRequest +BatchGetAccountStatusResponse +BatchGetAggregateResourceConfigRequest +BatchGetAggregateResourceConfigResponse +BatchGetApplicationRevisionsInput +BatchGetApplicationRevisionsOutput +BatchGetApplicationsInput +BatchGetApplicationsOutput +BatchGetAssetPropertyAggregatesEntry +BatchGetAssetPropertyAggregatesErrorEntry +BatchGetAssetPropertyAggregatesErrorInfo +BatchGetAssetPropertyAggregatesRequest +BatchGetAssetPropertyAggregatesResponse +BatchGetAssetPropertyAggregatesSkippedEntry +BatchGetAssetPropertyAggregatesSuccessEntry +BatchGetAssetPropertyValueEntry +BatchGetAssetPropertyValueErrorEntry +BatchGetAssetPropertyValueErrorInfo +BatchGetAssetPropertyValueHistoryEntry +BatchGetAssetPropertyValueHistoryErrorEntry +BatchGetAssetPropertyValueHistoryErrorInfo +BatchGetAssetPropertyValueHistoryRequest +BatchGetAssetPropertyValueHistoryResponse +BatchGetAssetPropertyValueHistorySkippedEntry +BatchGetAssetPropertyValueHistorySuccessEntry +BatchGetAssetPropertyValueRequest +BatchGetAssetPropertyValueResponse +BatchGetAssetPropertyValueSkippedEntry +BatchGetAssetPropertyValueSuccessEntry +BatchGetAutomationRulesRequest +BatchGetAutomationRulesResponse +BatchGetBlueprintsRequest +BatchGetBlueprintsResponse +BatchGetBuildBatchesInput +BatchGetBuildBatchesOutput +BatchGetBuildsInput +BatchGetBuildsOutput +BatchGetChannelRequest +BatchGetChannelResponse +BatchGetCodeSnippetRequest +BatchGetCodeSnippetResponse +BatchGetCollaborationAnalysisTemplateError +BatchGetCollaborationAnalysisTemplateInput +BatchGetCollaborationAnalysisTemplateOutput +BatchGetCollectionRequest +BatchGetCollectionResponse +BatchGetCommitsError +BatchGetCommitsInput +BatchGetCommitsOutput +BatchGetCrawlersRequest +BatchGetCrawlersResponse +BatchGetCustomDataIdentifierSummary +BatchGetCustomDataIdentifiersRequest +BatchGetCustomDataIdentifiersResponse +BatchGetCustomEntityTypesRequest +BatchGetCustomEntityTypesResponse +BatchGetDataQualityResultRequest +BatchGetDataQualityResultResponse +BatchGetDeploymentGroupsInput +BatchGetDeploymentGroupsOutput +BatchGetDeploymentInstancesInput +BatchGetDeploymentInstancesOutput +BatchGetDeploymentTargetsInput +BatchGetDeploymentTargetsOutput +BatchGetDeploymentsInput +BatchGetDeploymentsOutput +BatchGetDevEndpointsRequest +BatchGetDevEndpointsResponse +BatchGetDevicePositionError +BatchGetDevicePositionRequest +BatchGetDevicePositionResponse +BatchGetDocumentStatusRequest +BatchGetDocumentStatusResponse +BatchGetDocumentStatusResponseError +BatchGetFieldRequest +BatchGetFieldResponse +BatchGetFindingDetailsRequest +BatchGetFindingDetailsResponse +BatchGetFindingsError +BatchGetFindingsRequest +BatchGetFindingsResponse +BatchGetFrameMetricDataRequest +BatchGetFrameMetricDataResponse +BatchGetFreeTrialInfoRequest +BatchGetFreeTrialInfoResponse +BatchGetGraphMemberDatasourcesRequest +BatchGetGraphMemberDatasourcesResponse +BatchGetImageRequest +BatchGetImageResponse +BatchGetItemInput +BatchGetItemOutput +BatchGetJobsRequest +BatchGetJobsResponse +BatchGetLinkAttributes +BatchGetLinkAttributesResponse +BatchGetMemberEc2DeepInspectionStatusRequest +BatchGetMemberEc2DeepInspectionStatusResponse +BatchGetMembershipDatasourcesRequest +BatchGetMembershipDatasourcesResponse +BatchGetMetricDataQuery +BatchGetMetricDataRequest +BatchGetMetricDataResponse +BatchGetNamedQueryInput +BatchGetNamedQueryOutput +BatchGetObjectAttributes +BatchGetObjectAttributesResponse +BatchGetObjectInformation +BatchGetObjectInformationResponse +BatchGetOnPremisesInstancesInput +BatchGetOnPremisesInstancesOutput +BatchGetPartitionRequest +BatchGetPartitionResponse +BatchGetPreparedStatementInput +BatchGetPreparedStatementOutput +BatchGetProjectsInput +BatchGetProjectsOutput +BatchGetQueryExecutionInput +BatchGetQueryExecutionOutput +BatchGetRecordError +BatchGetRecordIdentifier +BatchGetRecordRequest +BatchGetRecordResponse +BatchGetRecordResultDetail +BatchGetReportGroupsInput +BatchGetReportGroupsOutput +BatchGetReportsInput +BatchGetReportsOutput +BatchGetRepositoriesInput +BatchGetRepositoriesOutput +BatchGetRepositoryScanningConfigurationRequest +BatchGetRepositoryScanningConfigurationResponse +BatchGetResourceConfigRequest +BatchGetResourceConfigResponse +BatchGetRumMetricDefinitionsRequest +BatchGetRumMetricDefinitionsResponse +BatchGetSchemaError +BatchGetSchemaInput +BatchGetSchemaOutput +BatchGetSecurityControlsRequest +BatchGetSecurityControlsResponse +BatchGetStandardsControlAssociationsRequest +BatchGetStandardsControlAssociationsResponse +BatchGetStreamKeyRequest +BatchGetStreamKeyResponse +BatchGetTokenBalanceErrorItem +BatchGetTokenBalanceInput +BatchGetTokenBalanceInputItem +BatchGetTokenBalanceOutput +BatchGetTokenBalanceOutputItem +BatchGetTracesRequest +BatchGetTracesResult +BatchGetTriggersRequest +BatchGetTriggersResponse +BatchGetUserAccessTasksRequest +BatchGetUserAccessTasksResponse +BatchGetVariableError +BatchGetVariableRequest +BatchGetVariableResult +BatchGetViewError +BatchGetViewInput +BatchGetViewOutput +BatchGetVpcEndpointRequest +BatchGetVpcEndpointResponse +BatchGetWorkflowsRequest +BatchGetWorkflowsResponse +BatchGrantPermissionsRequest +BatchGrantPermissionsResponse +BatchId +BatchImport +BatchImportEvidenceToAssessmentControlError +BatchImportEvidenceToAssessmentControlRequest +BatchImportEvidenceToAssessmentControlResponse +BatchImportFindingsRequest +BatchImportFindingsResponse +BatchImportMetaDataOnCreate +BatchInferenceJob +BatchInferenceJobConfig +BatchInferenceJobInput +BatchInferenceJobOutput +BatchInferenceJobSummary +BatchItem +BatchItemError +BatchJobDependency +BatchJobExecutionSummary +BatchJobParameters +BatchLimitExceededException +BatchListAttachedIndices +BatchListAttachedIndicesResponse +BatchListIncomingTypedLinks +BatchListIncomingTypedLinksResponse +BatchListIndex +BatchListIndexResponse +BatchListObjectAttributes +BatchListObjectAttributesResponse +BatchListObjectChildren +BatchListObjectChildrenResponse +BatchListObjectParentPaths +BatchListObjectParentPathsResponse +BatchListObjectParents +BatchListObjectParentsResponse +BatchListObjectPolicies +BatchListObjectPoliciesResponse +BatchListOutgoingTypedLinks +BatchListOutgoingTypedLinksResponse +BatchListPolicyAttachments +BatchListPolicyAttachmentsResponse +BatchLoadProgressReport +BatchLoadTask +BatchLoadTaskDescription +BatchLoadTasks +BatchLookupPolicy +BatchLookupPolicyResponse +BatchMeterUsageRequest +BatchMeterUsageResult +BatchModifyClusterSnapshotsLimitExceededFault +BatchModifyClusterSnapshotsMessage +BatchModifyClusterSnapshotsOutputMessage +BatchParameters +BatchPermissionsFailureEntry +BatchPermissionsRequestEntry +BatchPolicy +BatchPrediction +BatchPredictionDataSourceId +BatchPredictionId +BatchPredictionName +BatchPutAssetPropertyError +BatchPutAssetPropertyErrorEntry +BatchPutAssetPropertyValueRequest +BatchPutAssetPropertyValueResponse +BatchPutDocumentRequest +BatchPutDocumentResponse +BatchPutDocumentResponseFailedDocument +BatchPutFieldOptionsRequest +BatchPutFieldOptionsResponse +BatchPutGeofenceError +BatchPutGeofenceRequest +BatchPutGeofenceRequestEntry +BatchPutGeofenceResponse +BatchPutGeofenceSuccess +BatchPutMessageErrorEntries +BatchPutMessageErrorEntry +BatchPutMessageRequest +BatchPutMessageResponse +BatchPutMetricsError +BatchPutMetricsRequest +BatchPutMetricsResponse +BatchPutPropertyError +BatchPutPropertyErrorEntry +BatchPutPropertyValuesRequest +BatchPutPropertyValuesResponse +BatchPutScheduledUpdateGroupActionAnswer +BatchPutScheduledUpdateGroupActionType +BatchReadException +BatchReadOperation +BatchReadOperationResponse +BatchReadRequest +BatchReadResponse +BatchReadSuccessfulResponse +BatchRecordsEndTime +BatchRecordsStartTime +BatchReferenceName +BatchRemoveFacetFromObject +BatchRequestTooLongException +BatchResetAlarmRequest +BatchResetAlarmResponse +BatchResourceRequirement +BatchRestrictions +BatchResultErrorEntry +BatchRetryStrategy +BatchRevokePermissionsRequest +BatchRevokePermissionsResponse +BatchScheduleActionCreateRequest +BatchScheduleActionCreateResult +BatchScheduleActionDeleteRequest +BatchScheduleActionDeleteResult +BatchSegmentJob +BatchSegmentJobInput +BatchSegmentJobOutput +BatchSegmentJobSummary +BatchSize +BatchSizeLimitExceededException +BatchSnoozeAlarmRequest +BatchSnoozeAlarmResponse +BatchStartRecommendationsErrorEntry +BatchStartRecommendationsRequest +BatchStartRecommendationsResponse +BatchStartRequest +BatchStartResponse +BatchStartViewerSessionRevocationError +BatchStartViewerSessionRevocationRequest +BatchStartViewerSessionRevocationResponse +BatchStartViewerSessionRevocationViewerSession +BatchStatementError +BatchStatementRequest +BatchStatementResponse +BatchStopJobRunError +BatchStopJobRunRequest +BatchStopJobRunResponse +BatchStopJobRunSuccessfulSubmission +BatchStopRequest +BatchStopResponse +BatchStopUpdateActionMessage +BatchStrategy +BatchSuccessfulResultModel +BatchSuspendUserRequest +BatchSuspendUserResponse +BatchTooLarge +BatchTransformInput +BatchUnsuspendUserRequest +BatchUnsuspendUserResponse +BatchUpdateAttendeeCapabilitiesExceptRequest +BatchUpdateAutomationRulesRequest +BatchUpdateAutomationRulesResponse +BatchUpdateClusterRequest +BatchUpdateClusterResponse +BatchUpdateCustomVocabularyItemRequest +BatchUpdateCustomVocabularyItemResponse +BatchUpdateDetectorErrorEntry +BatchUpdateDetectorRequest +BatchUpdateDetectorResponse +BatchUpdateDevicePositionError +BatchUpdateDevicePositionRequest +BatchUpdateDevicePositionResponse +BatchUpdateFindingsRequest +BatchUpdateFindingsResponse +BatchUpdateFindingsUnprocessedFinding +BatchUpdateLinkAttributes +BatchUpdateMemberEc2DeepInspectionStatusRequest +BatchUpdateMemberEc2DeepInspectionStatusResponse +BatchUpdateObjectAttributes +BatchUpdateObjectAttributesResponse +BatchUpdatePartitionFailureEntry +BatchUpdatePartitionRequest +BatchUpdatePartitionRequestEntry +BatchUpdatePartitionResponse +BatchUpdatePhoneNumberRequest +BatchUpdatePhoneNumberResponse +BatchUpdateRecommendationStatusFailedEntry +BatchUpdateRecommendationStatusRequest +BatchUpdateRecommendationStatusResponse +BatchUpdateRecommendationStatusSuccessfulEntry +BatchUpdateRuleRequest +BatchUpdateRuleResponse +BatchUpdateScheduleRequest +BatchUpdateScheduleResponse +BatchUpdateStandardsControlAssociationsRequest +BatchUpdateStandardsControlAssociationsResponse +BatchUpdateTableRowsRequest +BatchUpdateTableRowsResult +BatchUpdateUserRequest +BatchUpdateUserResponse +BatchUpdateVehicleRequest +BatchUpdateVehicleResponse +BatchUpsertTableRowsRequest +BatchUpsertTableRowsResult +BatchWindow +BatchWriteException +BatchWriteItemInput +BatchWriteItemOutput +BatchWriteOperation +BatchWriteOperationResponse +BatchWriteRequest +BatchWriteResponse +Batches +BatteryLevel +BccAddresses +Bcch +BcpPacketSize +Beaconing +Beard +BearerToken +Before +BeforeCommitIdAndAfterCommitIdAreSameException +BeforeCreationDate +Begin +BeginMarker +BeginOffset +BeginOffsetChar +BeginOffsetMillis +BeginTransactionRequest +BeginTransactionResponse +Behavior +BehaviorCriteria +BehaviorModelTrainingSummary +BehaviorOnMXFailure +BehaviorOnMxFailure +BehaviorType +Beneficiary +BenefitsConsidered +BerkshelfVersion +BestCandidate +BestObjectiveNotImproving +BestPractice +BestPractices +BestTrainingJob +BgpAsn +BgpConfigurations +BgpOptions +BgpStatus +Bias +BiasPosition +BidPrice +BidPriceAsPercentageOfOnDemandPrice +BillDate +BillExpirationException +BillableTimeInSeconds +BillableTrainingTimeInSeconds +BilledSizeBytes +BillingAddress +BillingDetails +BillingEntity +BillingGroupArn +BillingGroupArns +BillingGroupCostReportElement +BillingGroupCostReports +BillingGroupListElement +BillingGroupMetadata +BillingGroupProperties +BillingGroups +BillingMode +BillingModeOverride +BillingModeSummary +BillingPeriod +BillingPeriodRange +BillingProducts +BillingRecord +BillingRecords +BillingSubscriptionId +BillingTagsSource +BillingToken +BillingViewArn +BinCount +BinCountLimit +BinCountOptions +BinOptions +BinWidth +BinWidthOptions +BinaryColumnStatisticsData +BinaryFile +BinaryListValues +BinaryMediaTypes +BinaryPrefixLocation +BinaryValue +BirthDate +BisectBatchOnFunctionError +BitDepth +BitOrder +BitRate +Bitbucket +Bitrate +BitrateClass +BitsPerSecond +BitstreamMode +BlackDetectThreshold +BlackFrame +BlackFrameMsec +Blackhole +Blacklist +BlacklistEntry +BlacklistItemNames +BlacklistReport +BlackoutSlate +BlackoutSlateImage +BlankCellFormat +Blob +BlobAttributeValue +BlobIdDoesNotExistException +BlobIdRequiredException +BlobMetadata +BlobType +Block +BlockAction +BlockAddress +BlockData +BlockDeviceMapping +BlockDeviceMappingSet +BlockDeviceMappings +BlockDurationMinutes +BlockEmail +BlockId +BlockIndex +BlockListSummaryItems +BlockOverrideDnsType +BlockOverrideDomain +BlockOverrideTtl +BlockPublicAccess +BlockPublicAccessConfiguration +BlockPublicAccessConfigurationMetadata +BlockPublicAcls +BlockPublicPolicy +BlockPublicSecurityGroupRules +BlockReference +BlockReferences +BlockResponse +BlockSize +BlockSizeBytes +BlockToken +BlockType +BlockchainInstant +Blocked +BlockedException +BlockedIPRangeList +BlockedReason +BlockerDeclaration +Blocks +BlogConfiguration +BlogFieldMappings +BloomFilterColumns +BloomFilterFalsePositiveProbability +Blue +BlueGreenDeployment +BlueGreenDeploymentAlreadyExistsFault +BlueGreenDeploymentConfiguration +BlueGreenDeploymentIdentifier +BlueGreenDeploymentName +BlueGreenDeploymentNotFoundFault +BlueGreenDeploymentTask +BlueGreenDeployments +BlueGreenUpdatePolicy +BlueInstanceTerminationOption +BluePrimaryX +BluePrimaryY +Blueprint +BlueprintDetails +BlueprintLocation +BlueprintName +BlueprintRun +BlueprintRuns +BlueprintServiceLocation +Blueprints +Body +BodyConfig +BodyContains +BodyOverride +BodyParameters +BodyParts +BodySectionConfiguration +BodySectionContent +BodySections +BonusAmount +BonusPayment +BonusPayments +BookingOptions +Bookmarks +BookmarksConfigurations +BooleanColumnStatisticsData +BooleanFilter +BooleanValue +BootMode +Booting +BootstrapActionConfig +BootstrapActionDetail +BootstrapActions +BootstrapBrokerString +BootstrapBrokerStringPublicSaslIam +BootstrapBrokerStringPublicSaslScram +BootstrapBrokerStringPublicTls +BootstrapBrokerStringSaslIam +BootstrapBrokerStringSaslScram +BootstrapBrokerStringTls +BootstrapBrokerStringVpcConnectivitySaslIam +BootstrapBrokerStringVpcConnectivitySaslScram +BootstrapBrokerStringVpcConnectivityTls +BootstrapServers +Border +BorderColor +BorderRadius +BorderStyle +BorderThickness +BorderVisibility +BorrowConfiguration +BorrowCount +Bot +BotAliasHistoryEvent +BotAliasLocaleSettings +BotAliasMetadata +BotAliasSummary +BotAliasTestExecutionTarget +BotAliases +BotChannelAssociation +BotEmail +BotExportSpecification +BotFilter +BotId +BotImportSpecification +BotLocaleExportSpecification +BotLocaleFilter +BotLocaleHistoryEvent +BotLocaleImportSpecification +BotLocaleSortBy +BotLocaleSummary +BotMember +BotMetadata +BotName +BotRecommendationResultStatistics +BotRecommendationResults +BotRecommendationSummary +BotSortBy +BotSummary +BotType +BotVersionLocaleDetails +BotVersionSortBy +BotVersionSummary +Bots +Bottom +Bounce +BounceAction +BounceSender +BounceSenderArn +BounceSubType +BounceTopic +BounceType +BouncedRecipientInfo +BouncedRecipientInfoList +Bounces +BoundedFiles +BoundedSize +BoundingBox +BoundingBoxCount +Bounds +BoxConfiguration +BoxPlotAggregatedFieldWells +BoxPlotChartConfiguration +BoxPlotFieldWells +BoxPlotOptions +BoxPlotSortConfiguration +BoxPlotStyleOptions +BoxPlotVisual +Branch +BranchDiff +BranchDiffSourceCodeType +BranchDoesNotExistException +BranchInfo +BranchInterfaceId +BranchName +BranchNameExistsException +BranchNameIsTagNameException +BranchNameRequiredException +BranchOrder +Branches +Brand +BrandName +BreachAction +BreachThreshold +BreakdownItemsLimit +Breakdowns +BreakoutCode +Bridge +BridgeArn +BridgeFlowOutput +BridgeFlowSource +BridgeMessages +BridgeNetworkOutput +BridgeNetworkSource +BridgeOutput +BridgePlacement +BridgePorts +BridgeSource +BridgeState +BridgeType +Bridges +Brightness +Broker +BrokerAZDistribution +BrokerArn +BrokerEBSVolumeInfo +BrokerEngineType +BrokerEngineTypes +BrokerId +BrokerIds +BrokerInstance +BrokerInstanceOption +BrokerInstanceOptions +BrokerInstances +BrokerLogs +BrokerName +BrokerNodeGroupInfo +BrokerNodeInfo +BrokerSoftwareInfo +BrokerState +BrokerSummaries +BrokerSummary +BrowserSettings +BrowserSettingsSummary +Bsic +Bucket +BucketARN +BucketARNUpdate +BucketAccessLogConfig +BucketAccessRoleArn +BucketAccountId +BucketArn +BucketBundle +BucketColumns +BucketConfiguration +BucketCountByEffectivePermission +BucketCountByEncryptionType +BucketCountBySharedAccessType +BucketCountPolicyAllowsUnencryptedObjectUploads +BucketCriteriaAdditionalProperties +BucketFolder +BucketInfo +BucketKeyEnabled +BucketLevel +BucketLevelPermissions +BucketLifecycleConfiguration +BucketLoggingConfiguration +BucketLoggingStatus +BucketMetadata +BucketName +BucketNameFilterRequiredException +BucketNotFoundFault +BucketNotificationConfiguration +BucketOwner +BucketPermissionConfiguration +BucketPolicy +BucketPrefix +BucketPublicAccess +BucketRegion +BucketServerSideEncryption +BucketSortCriteria +BucketState +BucketStatisticsBySensitivity +BucketVersioningConfiguration +BucketWebsiteConfiguration +Buckets +BucketsAggregationType +Budget +BudgetAdjustmentPeriod +BudgetDetail +BudgetLimit +BudgetName +BudgetNotificationsForAccount +BudgetPerformanceHistory +BudgetType +BudgetedAmount +BudgetedAndActualAmounts +BudgetedAndActualAmountsList +Budgets +BufFillPct +BufSize +BufferDuration +BufferModel +BufferMsec +BufferSegments +BufferingHints +BugzillaIds +Build +BuildArn +BuildArtifacts +BuildArtifactsObjectKey +BuildBatch +BuildBatchFilter +BuildBatchPhase +BuildBotLocaleRequest +BuildBotLocaleResponse +BuildCommand +BuildConfiguration +BuildGroup +BuildId +BuildNotDeleted +BuildPhase +BuildStatusConfig +BuildSuggestersRequest +BuildSuggestersResponse +BuildSummary +Builder +Builds +BuiltInIntentSortBy +BuiltInIntentSummary +BuiltInSlotTypeSortBy +BuiltInSlotTypeSummary +BuiltinIntentMetadata +BuiltinIntentSlot +BuiltinSlotTypeMetadata +BulkDeployment +BulkDeploymentArn +BulkDeploymentId +BulkDeploymentMetrics +BulkDeploymentResult +BulkDeploymentStatus +BulkDeployments +BulkEmailContent +BulkEmailDestination +BulkEmailDestinationStatus +BulkEmailEntries +BulkEmailEntry +BulkEmailEntryResult +BulkEmailEntryResults +BulkLoadIdNotFoundException +BulkPublishCompleteTime +BulkPublishRequest +BulkPublishResponse +BulkPublishStartTime +BulkPublishStatus +BulletPoints +Bumper +Bundle +BundleDescription +BundleDetails +BundleId +BundleIds +BundleInformation +BundleInstanceRequest +BundleInstanceResult +BundleName +BundleTask +BundleTaskError +BundleTasks +BundleType +Bundles +BurnInDestinationSettings +BurninDestinationSettings +BurstablePerformance +BurstablePerformanceSupported +BusinessCalling +BusinessCallingSettings +BusinessEmailAddress +BusinessGoals +BusinessName +BusinessPhoneNumber +BusinessReport +BusinessReportContentRange +BusinessReportRecurrence +BusinessReportS3Location +BusinessReportSchedule +BusinessReportSchedules +Button +ButtonAction +ByAccountId +ByBackupPlanId +ByBackupVaultName +ByCompleteAfter +ByCompleteBefore +ByCreatedAfter +ByCreatedBefore +ByCreationAfter +ByCreationBefore +ByDestinationVaultArn +ByParentJobId +ByParentRecoveryPointArn +ByReportPlanName +ByResourceArn +ByResourceType +ByShared +ByState +ByStatus +ByVaultType +ByoipCidr +ByoipCidrEvent +ByoipCidrNotFoundException +ByoipCidrs +BypassGovernanceRetention +BypassPolicyLockoutCheck +BypassPolicyLockoutSafetyCheck +BypassSnaplockEnterpriseRetention +ByteMatchSet +ByteMatchSetId +ByteMatchSetSummary +ByteMatchSetUpdate +ByteMatchSets +ByteMatchStatement +ByteMatchTuple +ByteMatchTuples +Bytes +BytesCompressed +BytesConverted +BytesMetered +BytesPerHour +BytesPerSecond +BytesProcessed +BytesReturned +BytesScanned +BytesScannedCutoffPerQuery +BytesTransferred +BytesWritten +CACertificate +CACertificateDescription +CACertificateIdentifier +CAIdentifier +CFNRegistryException +CIDRIP +CIDRSummary +CIDRs +CNAME +CNAMEAlreadyExists +CNAMEPrefix +CORSConfiguration +CORSRule +CORSRules +CPU +CPUUtilization +CRLSign +CSS +CSSColor +CSSVersion +CSV +CSVHeader +CSVInput +CSVMappingParameters +CSVOutput +CUSTOM +CVEIds +CWEMonitorEnabled +CaCertificateIdentifier +CaEndpoint +CaLogs +CacheAllocatedInBytes +CacheAttributes +CacheBehavior +CacheBehaviorPerPath +CacheBehaviors +CacheCluster +CacheClusterAlreadyExistsFault +CacheClusterCreateTime +CacheClusterEnabled +CacheClusterId +CacheClusterIds +CacheClusterMessage +CacheClusterNotFoundFault +CacheClusterSize +CacheClusterStatus +CacheClusters +CacheControl +CacheDataEncrypted +CacheDirtyPercentage +CacheEngineDescription +CacheEngineVersion +CacheEngineVersionDescription +CacheEngineVersionMessage +CacheEngineVersions +CacheFullBehavior +CacheHitPercentage +CacheHitResult +CacheLength +CacheMissPercentage +CacheNode +CacheNodeCount +CacheNodeCreateTime +CacheNodeId +CacheNodeIdsToReboot +CacheNodeIdsToRemove +CacheNodeStatus +CacheNodeType +CacheNodeTypeSpecificParameter +CacheNodeTypeSpecificParameters +CacheNodeTypeSpecificValue +CacheNodeTypeSpecificValues +CacheNodeUpdateStatus +CacheNodes +CacheParameterGroup +CacheParameterGroupAlreadyExistsFault +CacheParameterGroupDetails +CacheParameterGroupFamily +CacheParameterGroupName +CacheParameterGroupNameMessage +CacheParameterGroupNotFoundFault +CacheParameterGroupQuotaExceededFault +CacheParameterGroupStatus +CacheParameterGroups +CacheParameterGroupsMessage +CachePeriodInMinutes +CachePolicy +CachePolicyAlreadyExists +CachePolicyConfig +CachePolicyCookiesConfig +CachePolicyHeadersConfig +CachePolicyId +CachePolicyInUse +CachePolicyList +CachePolicyQueryStringsConfig +CachePolicySummary +CacheSecurityGroup +CacheSecurityGroupAlreadyExistsFault +CacheSecurityGroupMembership +CacheSecurityGroupMessage +CacheSecurityGroupName +CacheSecurityGroupNames +CacheSecurityGroupNotFoundFault +CacheSecurityGroupQuotaExceededFault +CacheSecurityGroups +CacheSettings +CacheSize +CacheStaleTimeoutInSeconds +CacheSubnetGroup +CacheSubnetGroupAlreadyExistsFault +CacheSubnetGroupDescription +CacheSubnetGroupInUse +CacheSubnetGroupMessage +CacheSubnetGroupName +CacheSubnetGroupNotFoundFault +CacheSubnetGroupQuotaExceededFault +CacheSubnetGroups +CacheSubnetQuotaExceededFault +CacheTTL +CacheTtlInSeconds +CacheUsedPercentage +CachedMethods +CachediSCSIVolume +CachediSCSIVolumes +CachingConfig +CachingEnabled +CalculateRouteCarModeOptions +CalculateRouteMatrixRequest +CalculateRouteMatrixResponse +CalculateRouteMatrixSummary +CalculateRouteRequest +CalculateRouteResponse +CalculateRouteSummary +CalculateRouteTruckModeOptions +CalculatedAttributeName +CalculatedBaselineConstraints +CalculatedBaselineStatistics +CalculatedColumn +CalculatedField +CalculatedFieldDescription +CalculatedFieldName +CalculatedFieldSynonyms +CalculatedFields +CalculatedLifecycle +CalculatedMeasureField +CalculatedSpend +Calculation +CalculationConfiguration +CalculationExecutionId +CalculationResult +CalculationStatistics +CalculationStatus +CalculationSummary +Calculations +CalculatorArn +CalculatorName +CalendarNames +CallAnalyticsEntity +CallAnalyticsItem +CallAnalyticsJob +CallAnalyticsJobName +CallAnalyticsJobSettings +CallAnalyticsJobStatus +CallAnalyticsJobSummaries +CallAnalyticsJobSummary +CallAnalyticsStreamCategories +CallAnalyticsTranscriptResultStream +CallAs +CallDetails +CallInstructionsMessage +CallInstructionsMessageType +CallLeg +CallRateLimitExceededException +Callback +CallbackId +CallbackStepMetadata +CallbackToken +CallbackURLs +CallerArn +CallerId +CallerReference +CallerType +CallingCountry +CallingName +CallingNameStatus +CallingNameUpdatedTimestamp +CallingRegions +Campaign +CampaignConfig +CampaignCustomMessage +CampaignDateRangeKpiResponse +CampaignEmailMessage +CampaignEventFilter +CampaignFilters +CampaignHook +CampaignId +CampaignInAppMessage +CampaignLimits +CampaignResponse +CampaignSmsMessage +CampaignState +CampaignStatus +CampaignSummary +CampaignUpdateSummary +CampaignsResponse +CanDbcDefinition +CanInterface +CanSignal +Canaries +CanariesLastRun +Canary +CanaryCodeInput +CanaryCodeOutput +CanaryLastRun +CanaryName +CanaryRun +CanaryRunConfigInput +CanaryRunConfigOutput +CanaryRunStatus +CanaryRunTimeline +CanaryRuns +CanaryScheduleInput +CanaryScheduleOutput +CanarySettings +CanarySize +CanaryStatus +CanaryTimeline +CancelAnnotationImportRequest +CancelArchivalInput +CancelArchivalOutput +CancelAuditMitigationActionsTaskRequest +CancelAuditTaskRequest +CancelBatchImportJobRequest +CancelBatchJobExecutionRequest +CancelBatchPredictionJobRequest +CancelBundleTaskRequest +CancelBundleTaskResult +CancelCapacityReservationFleetError +CancelCapacityReservationFleetsRequest +CancelCapacityReservationFleetsResult +CancelCapacityReservationInput +CancelCapacityReservationRequest +CancelCapacityReservationResult +CancelCertificateTransferRequest +CancelChangeSetRequest +CancelChangeSetResponse +CancelClusterRequest +CancelCommandRequest +CancelComponentDeploymentInput +CancelComponentDeploymentOutput +CancelContactRequest +CancelConversionRequest +CancelDataQualityRuleRecommendationRunRequest +CancelDataQualityRulesetEvaluationRunRequest +CancelDataRepositoryTaskRequest +CancelDataRepositoryTaskResponse +CancelDeploymentJobRequest +CancelDeploymentRequest +CancelDeploymentResponse +CancelDescription +CancelDetectMitigationActionsTaskRequest +CancelDomainTransferToAnotherAwsAccountRequest +CancelDomainTransferToAnotherAwsAccountResponse +CancelElasticsearchServiceSoftwareUpdateRequest +CancelElasticsearchServiceSoftwareUpdateResponse +CancelEnvironmentDeploymentInput +CancelEnvironmentDeploymentOutput +CancelExportJobRequest +CancelExportTaskMessage +CancelExportTaskRequest +CancelFindingsReportRequest +CancelFindingsReportResponse +CancelFlowExecutionsRequest +CancelFlowExecutionsResponse +CancelGremlinQueryInput +CancelGremlinQueryOutput +CancelHandshakeRequest +CancelHandshakeResponse +CancelImageCreationRequest +CancelImageCreationResponse +CancelImageLaunchPermissionRequest +CancelImageLaunchPermissionResult +CancelImportTaskRequest +CancelImportTaskResult +CancelIngestionRequest +CancelIngestionResponse +CancelInputDeviceTransferRequest +CancelInstanceRefreshAnswer +CancelInstanceRefreshType +CancelJobExecutionRequest +CancelJobRequest +CancelJobResponse +CancelJobRunRequest +CancelJobRunResponse +CancelJournalKinesisStreamRequest +CancelJournalKinesisStreamResponse +CancelKeyDeletionRequest +CancelKeyDeletionResponse +CancelLegalHoldInput +CancelLoaderJobInput +CancelLoaderJobOutput +CancelMLDataProcessingJobInput +CancelMLDataProcessingJobOutput +CancelMLModelTrainingJobInput +CancelMLModelTrainingJobOutput +CancelMLModelTransformJobInput +CancelMLModelTransformJobOutput +CancelMLTaskRunRequest +CancelMLTaskRunResponse +CancelMailboxExportJobRequest +CancelMaintenanceWindowExecutionRequest +CancelMaintenanceWindowExecutionResult +CancelMessageMoveTaskRequest +CancelMessageMoveTaskResult +CancelMulticastGroupSessionRequest +CancelOpenCypherQueryInput +CancelOpenCypherQueryOutput +CancelOrderInput +CancelPipelineReprocessingRequest +CancelPolicyGenerationRequest +CancelQuantumTaskRequest +CancelQuantumTaskResponse +CancelQueryRequest +CancelQueryResponse +CancelReason +CancelReplayRequest +CancelReplayResponse +CancelReplicationTaskAssessmentRunMessage +CancelReplicationTaskAssessmentRunResponse +CancelReservedInstancesListingRequest +CancelReservedInstancesListingResult +CancelResizeMessage +CancelResourceRequestInput +CancelResourceRequestOutput +CancelRetrievalInput +CancelRetrievalOutput +CancelRotateSecretRequest +CancelRotateSecretResponse +CancelRunRequest +CancelSbomExportRequest +CancelSbomExportResponse +CancelSchemaExtensionRequest +CancelServiceInstanceDeploymentInput +CancelServiceInstanceDeploymentOutput +CancelServicePipelineDeploymentInput +CancelServicePipelineDeploymentOutput +CancelServiceSoftwareUpdateRequest +CancelServiceSoftwareUpdateResponse +CancelSigningProfileRequest +CancelSimulationJobBatchRequest +CancelSimulationJobRequest +CancelSolNetworkOperationInput +CancelSpotFleetRequestsError +CancelSpotFleetRequestsErrorItem +CancelSpotFleetRequestsRequest +CancelSpotFleetRequestsResponse +CancelSpotFleetRequestsSuccessItem +CancelSpotInstanceRequestsRequest +CancelSpotInstanceRequestsResult +CancelStatementRequest +CancelStatementResponse +CancelStepsInfo +CancelStepsInfoList +CancelStepsInput +CancelStepsOutput +CancelTaskExecutionRequest +CancelTaskInput +CancelTaskOutput +CancelTimerDecisionAttributes +CancelTimerFailedEventAttributes +CancelTransactionRequest +CancelUpdateStackInput +CancelVariantImportRequest +CancelWorkflowExecutionDecisionAttributes +CancelWorkflowExecutionFailedEventAttributes +CancelWorldExportJobRequest +CancelWorldGenerationJobRequest +CancelZonalShiftRequest +Cancellable +CancellationDate +CancellationMessage +CancellationReason +CancellationReasons +CancelledByUserException +CancelledSpotInstanceRequest +CancelledSpotInstanceRequests +CancelledSteps +CandidateAddress +CandidateAddressList +CandidateArtifactLocations +CandidateDefinitionNotebookLocation +CandidateGenerationConfig +CandidateMetrics +CandidateName +CandidateNameEquals +CandidateProperties +CandidateStatus +CandidateStepArn +CandidateStepName +CandidateStepType +CandidateSteps +Candidates +CannedACL +CannedAccessControlList +CannedAcl +CannedAclForObjects +CannotChangeImmutablePublicKeyFields +CannotDelegateManagementAccountException +CannotDeleteApprovalRuleFromTemplateException +CannotDeleteException +CannotListParentOfRootException +CannotModifyApprovalRuleFromTemplateException +CanonicalHostedZoneId +CanonicalHostedZoneName +CanonicalHostedZoneNameID +CanvasAppSettings +CanvasOrientation +CanvasSizeOptions +Cap +CapExceeded +Capabilities +CapabilitiesReason +Capacity +CapacityAllocation +CapacityAllocations +CapacityAssignment +CapacityAssignmentConfiguration +CapacityAssignments +CapacityConfiguration +CapacityDescription +CapacityExceededException +CapacityForecast +CapacityId +CapacityInBytes +CapacityLimits +CapacityProvider +CapacityProviderStrategy +CapacityProviderStrategyItem +CapacityProviders +CapacityProvisioned +CapacityRebalance +CapacityRegion +CapacityReservation +CapacityReservationArn +CapacityReservationFleet +CapacityReservationFleetArn +CapacityReservationFleetCancellationState +CapacityReservationFleetId +CapacityReservationFleetIds +CapacityReservationFleets +CapacityReservationGroup +CapacityReservationGroups +CapacityReservationId +CapacityReservationIds +CapacityReservationName +CapacityReservationOptions +CapacityReservationOptionsRequest +CapacityReservationPreference +CapacityReservationResourceGroupArn +CapacityReservationSpecification +CapacityReservationSpecificationResponse +CapacityReservationTarget +CapacityReservationTargetResponse +CapacityReservations +CapacitySize +CapacitySpecification +CapacitySpecificationSummary +CapacityToRelease +CapacityUnits +CapacityUnitsConfiguration +CapacityUpdate +CapacityUsageSummary +CapacityUsed +CappedCount +Captcha +CaptchaAction +CaptchaConfig +CaptchaResponse +CaptionChannel +CaptionContainerType +CaptionData +CaptionDescription +CaptionDescriptionNames +CaptionDescriptionPreset +CaptionDescriptions +CaptionDestinationSettings +CaptionFormat +CaptionFormats +CaptionLanguageMapping +CaptionLanguageMappings +CaptionLanguageSetting +CaptionRectangle +CaptionSegmentLengthControl +CaptionSelector +CaptionSelectorName +CaptionSelectorSettings +CaptionSelectors +CaptionSource +CaptionSourceFramerate +CaptionSourceSettings +CaptionSources +Captions +CaptureContentTypeHeader +CaptureDdls +CaptureInterval +CaptureIntervalUnits +CaptureMode +CaptureOption +CaptureOptions +CaptureStatus +CaptureTime +CaptureTimeAccuracy +CarModeOptions +CardExpiryDate +CardHolderVerificationValue +CardStatusUpdate +CardVerificationValue1 +CardVerificationValue2 +Cardinality +Carrier +CarrierGateway +CarrierGatewayId +CarrierGatewayIds +CarrierGateways +CarrierIp +CartesianCoordinates +Cascade +CascadingControlConfiguration +CascadingControlSource +CaseCreationLimitExceeded +CaseDetails +CaseEventIncludedData +CaseId +CaseIdNotFound +CaseInsensitive +CaseSensitive +CaseSensitiveNames +CaseSensitivity +CaseSummary +CastColumnTypeOperation +Catalog +CatalogConfiguration +CatalogConfigurationDescription +CatalogConfigurationUpdate +CatalogDatabase +CatalogDeltaSource +CatalogEncryptionMode +CatalogEntry +CatalogHudiSource +CatalogId +CatalogImportStatus +CatalogItem +CatalogItemId +CatalogItems +CatalogKafkaSource +CatalogKinesisSource +CatalogName +CatalogRedshiftSchema +CatalogRedshiftTable +CatalogSchemaChangePolicy +CatalogSource +CatalogTable +CatalogTarget +CatalogTargets +CategoricalAggregationFunction +CategoricalDimensionField +CategoricalHyperParameterRange +CategoricalMeasureField +CategoricalParameter +CategoricalParameterRange +CategoricalParameterRangeSpecification +CategoricalParameterRanges +CategoricalValues +Categories +Category +CategoryAxis +CategoryAxisDisplayOptions +CategoryAxisLabelOptions +CategoryDetails +CategoryDrillDownFilter +CategoryEnum +CategoryEvent +CategoryFilter +CategoryFilterConfiguration +CategoryFilterFunction +CategoryFilterType +CategoryId +CategoryItemsLimit +CategoryItemsLimitConfiguration +CategoryLabelOptions +CategoryLabelVisibility +CategoryList +CategoryName +CategoryProperties +CategorySort +CategoryValue +CategoryValues +CategoryWithFindingNum +CausalAnomalyId +Cause +CausedBy +Causes +CausingEntity +CbetCheckDigitString +CbetSourceId +CbetStepaside +CcAddresses +CcDescriptor +CdcInsertsAndUpdates +CdcInsertsOnly +CdcMaxBatchInterval +CdcMinFileSize +CdcPath +CdcStartPosition +CdcStartTime +CdcStopPosition +CdiInputSpecification +Cdma +CdmaChannel +CdmaLocalId +CdmaNmr +CdmaNmrObj +CdmaObj +CdnConfiguration +CdnIdentifierSecret +CdrBucket +Celebrities +Celebrity +CelebrityDetail +CelebrityFaces +CelebrityRecognition +Cell +CellArn +CellFilters +CellInput +CellName +CellOutput +CellParams +CellReference +CellStyle +CellTowers +CellType +CellValue +CellValueSynonym +CellValueSynonyms +Cells +Center +Cents +CertPolicyId +Certificate +CertificateAlreadyExistsException +CertificateArn +CertificateAssociation +CertificateAssociations +CertificateAuthentication +CertificateAuthenticationRequest +CertificateAuthorities +CertificateAuthority +CertificateAuthorityArn +CertificateAuthorityArnList +CertificateAuthorityConfiguration +CertificateAuthorityData +CertificateAuthorityExpiryInMilliseconds +CertificateAuthorityId +CertificateAuthorityPublicKeyIdentifier +CertificateAuthorityType +CertificateBasedAuthProperties +CertificateBody +CertificateChain +CertificateConfiguration +CertificateConflictException +CertificateCreationDate +CertificateData +CertificateDescription +CertificateDetail +CertificateDetails +CertificateDoesNotExistException +CertificateEnrollmentPolicyServerEndpoint +CertificateExpirationTime +CertificateExpiryInMilliseconds +CertificateFingerprint +CertificateId +CertificateIdentifier +CertificateIds +CertificateInUseException +CertificateInfo +CertificateLimitExceededException +CertificateList +CertificateMessage +CertificateMismatchException +CertificateMode +CertificateName +CertificateNotFoundException +CertificateNotFoundFault +CertificateOptions +CertificateOwner +CertificatePath +CertificatePem +CertificatePolicies +CertificateRevocationList +CertificateRotationRestart +CertificateS3BucketName +CertificateS3ObjectKey +CertificateSerial +CertificateSource +CertificateStateException +CertificateStatuses +CertificateSummary +CertificateSummaryList +CertificateTransparencyLoggingPreference +CertificateType +CertificateUploadDate +CertificateValidationException +CertificateValidationRecord +CertificateValidationRecords +CertificateValidity +CertificateWallet +Certificates +CertificatesInfo +Certifications +CertifyForMarketplace +Chain +ChainId +ChaincodeLogs +Challenge +ChallengeAction +ChallengeCode +ChallengeConfig +ChallengeName +ChallengeParameters +ChallengeRequiredOnNewDevice +ChallengeResponse +ChallengeResponseType +ChallengeResponses +Change +ChangeBatch +ChangeCidrCollectionRequest +ChangeCidrCollectionResponse +ChangeComputeType +ChangeDetails +ChangeDetectingColumns +ChangeId +ChangeInfo +ChangeLog +ChangeMessageVisibilityBatchRequest +ChangeMessageVisibilityBatchRequestEntry +ChangeMessageVisibilityBatchResult +ChangeMessageVisibilityBatchResultEntry +ChangeMessageVisibilityRequest +ChangeName +ChangeOwnershipPrice +ChangePasswordRequest +ChangeProgressDetails +ChangeProgressStage +ChangeProgressStages +ChangeProgressStatus +ChangeProgressStatusDetails +ChangeProgressStatuses +ChangeRequest +ChangeRequestName +ChangeResourceRecordSetsRequest +ChangeResourceRecordSetsResponse +ChangeServerLifeCycleStateRequest +ChangeServerLifeCycleStateSourceServerLifecycle +ChangeSet +ChangeSetArn +ChangeSetHook +ChangeSetHookResourceTargetDetails +ChangeSetHookTargetDetails +ChangeSetId +ChangeSetName +ChangeSetNotFoundException +ChangeSetState +ChangeSetSummary +ChangeSetSummaryList +ChangeSetSummaryListItem +ChangeSetTags +ChangeSetType +ChangeSeverity +ChangeSource +ChangeSummary +ChangeTagsForResourceRequest +ChangeToken +ChangeTokenStatus +ChangeType +ChangeableForDays +ChangedBlock +ChangedBlocks +ChangedBlocksCount +Changes +ChangesetErrorInfo +ChangesetSummary +Channel +ChannelARN +ChannelARNInvalidException +ChannelActivity +ChannelAlreadyExistsException +ChannelArn +ChannelAssociatedWithFlowSummary +ChannelBan +ChannelBanSummary +ChannelBans +ChannelClass +ChannelConfiguration +ChannelCounts +ChannelDefinition +ChannelDefinitions +ChannelEgressEndpoint +ChannelExistsForEDSException +ChannelFlow +ChannelFlowArn +ChannelFlowCallbackRequest +ChannelFlowCallbackResponse +ChannelFlowSummary +ChannelFlows +ChannelGroupListConfiguration +ChannelGroupName +ChannelId +ChannelIdentification +ChannelIds +ChannelInfo +ChannelInfoList +ChannelInsufficientPermission +ChannelListConfiguration +ChannelMapping +ChannelMappings +ChannelMask +ChannelMaxLimitExceededException +ChannelMembership +ChannelMembershipForAppInstanceUserSummary +ChannelMembershipPreferences +ChannelMembershipSummary +ChannelMemberships +ChannelMessage +ChannelMessageCallback +ChannelMessageStatusStructure +ChannelMessageSummary +ChannelMessages +ChannelModeratedByAppInstanceUserSummary +ChannelModerator +ChannelModeratorArn +ChannelModeratorSummary +ChannelModerators +ChannelName +ChannelNameCondition +ChannelNotBroadcasting +ChannelNotFound +ChannelNotFoundException +ChannelOrder +ChannelResponse +ChannelRetentionSettings +ChannelSpecification +ChannelState +ChannelStatistics +ChannelStatus +ChannelStorage +ChannelStorageSummary +ChannelSummary +ChannelTag +ChannelTargetInfo +ChannelType +ChannelUnsupportedSchema +Channels +ChannelsIn +ChannelsOut +ChannelsResponse +ChapCredentials +ChapEnabled +ChapInfo +CharLengthSemantics +CharacterOffsets +CharacterSet +CharacterSetDescription +CharacterSetName +Characters +ChargeDetails +ChargeValue +Charset +ChartAxisLabelOptions +ChartColor +ChartConfiguration +ChatDurationInMinutes +ChatMessage +ChatParticipantRoleConfig +ChatStreamingConfiguration +ChatterFeedConfiguration +CheckCapacityRequest +CheckCapacityResponse +CheckDNSAvailabilityMessage +CheckDNSAvailabilityResultMessage +CheckDetail +CheckDetails +CheckDigitString +CheckDomainAvailabilityRequest +CheckDomainAvailabilityResponse +CheckDomainTransferabilityRequest +CheckDomainTransferabilityResponse +CheckExpression +CheckIfPhoneNumberIsOptedOutInput +CheckIfPhoneNumberIsOptedOutResponse +CheckInLicenseRequest +CheckJobArn +CheckName +CheckSchemaVersionValidityInput +CheckSchemaVersionValidityResponse +CheckSummaries +CheckSummary +CheckType +CheckedTime +CheckerIpRanges +CheckoutBorrowLicenseRequest +CheckoutBorrowLicenseResponse +CheckoutLicenseRequest +CheckoutLicenseResponse +CheckoutMetadata +CheckoutType +CheckpointConfig +CheckpointConfiguration +CheckpointConfigurationDescription +CheckpointConfigurationUpdate +CheckpointDelay +CheckpointInterval +CheckpointIntervalUpdate +CheckpointPercentages +CheckpointingEnabled +CheckpointingEnabledUpdate +Checksum +ChecksumAggregationMethod +ChecksumAlgorithm +ChecksumCRC32 +ChecksumCRC32C +ChecksumMode +ChecksumSHA1 +ChecksumSHA256 +ChefConfiguration +Child +ChildBlock +ChildBlockId +ChildBlocks +ChildComponents +ChildHealthChecks +ChildId +ChildJobsInState +ChildManifestName +ChildNotFoundException +ChildReference +ChildShard +ChildShards +ChildType +ChildWorkflowExecutionCanceledEventAttributes +ChildWorkflowExecutionCompletedEventAttributes +ChildWorkflowExecutionFailedEventAttributes +ChildWorkflowExecutionStartedEventAttributes +ChildWorkflowExecutionTerminatedEventAttributes +ChildWorkflowExecutionTimedOutEventAttributes +Children +ChildrenOfAlarmName +ChimeBearer +ChimeSdkMeetingConcatenationConfiguration +ChimeSdkMeetingConfiguration +ChimeSdkMeetingLiveConnectorConfiguration +Choice +ChoiceAnswer +ChoiceAnswerSummaries +ChoiceAnswerSummary +ChoiceAnswers +ChoiceContent +ChoiceDescription +ChoiceId +ChoiceImprovementPlan +ChoiceTitle +ChoiceUpdate +ChoiceUpdates +Choices +ChromaSampling +Chunk +ChunkChecksum +ChunkChecksumAlgorithm +ChunkIndex +ChunkList +ChunkToken +ChunksCount +Cidr +CidrAllowList +CidrAllowedList +CidrAuthorizationContext +CidrBlock +CidrBlockAssociation +CidrBlockAssociationSet +CidrBlockInUseException +CidrBlockSet +CidrBlockState +CidrBlockSummary +CidrBlocks +CidrCollection +CidrCollectionAlreadyExistsException +CidrCollectionChange +CidrCollectionInUseException +CidrCollectionVersionMismatchException +CidrCollections +CidrIp +CidrIps +CidrIpv4 +CidrIpv6 +CidrList +CidrLocations +CidrRoutingConfig +Cidrs +CifsShareCount +Cipher +CipherText +Ciphers +CiphertextBlob +CiphertextForRecipient +Circle +CisaData +City +CityName +Claim +ClaimCode +ClaimDeviceRequest +ClaimDevicesByClaimCodeRequest +ClaimDevicesByClaimCodeResponse +ClaimFilterOption +ClaimGameServerInput +ClaimGameServerOutput +ClaimPhoneNumberRequest +ClaimPhoneNumberResponse +ClaimRegex +ClaimStatus +ClaimedPhoneNumberSummary +ClapAtom +ClarifyCheck +ClarifyCheckStepMetadata +ClarifyExplainerConfig +ClarifyInferenceConfig +ClarifyShapBaselineConfig +ClarifyShapConfig +ClarifyTextConfig +ClassBTimeout +ClassCTimeout +ClassName +Classes +Classic +ClassicLinkDnsSupport +ClassicLinkDnsSupported +ClassicLinkEnabled +ClassicLinkInstance +ClassicLinkVPCId +ClassicLinkVPCSecurityGroups +ClassicLinkVpcId +ClassicLinkVpcSecurityGroups +ClassicLoadBalancer +ClassicLoadBalancerListener +ClassicLoadBalancers +ClassicLoadBalancersConfig +Classification +ClassificationDetails +ClassificationExportConfiguration +ClassificationResult +ClassificationResultStatus +ClassificationScopeSummary +ClassificationStatus +ClassificationType +ClassificationTypeUpdate +Classifier +ClassifierEvaluationMetrics +ClassifierMetadata +Classifiers +ClassifyDocumentRequest +ClassifyDocumentResponse +CleanAmplifyApp +CleanSourceMetadataOnMismatch +CleansedPhoneNumberE164 +CleansedPhoneNumberNational +ClearAllocationDefaultNetmaskLength +ClearQuerySuggestionsRequest +ClearTimerAction +CliToken +ClickFeedback +ClickFeedbackItems +ClickTime +ClientAffinity +ClientArn +ClientAssociationMetadata +ClientAuthentication +ClientAuthenticationSettingInfo +ClientAuthenticationSettingsInfo +ClientBroker +ClientCache +ClientCertAuthSettings +ClientCertificate +ClientCertificateId +ClientCertificateRevocationListStatus +ClientCertificates +ClientCidrBlock +ClientConfig +ClientConfiguration +ClientConfigurationVersion +ClientConfigurations +ClientConnectOptions +ClientConnectResponseOptions +ClientContext +ClientData +ClientDownloadLandingPage +ClientException +ClientID +ClientIDList +ClientIP +ClientIPPreservationEnabled +ClientId +ClientImpacting +ClientIp +ClientLimitExceededException +ClientList +ClientLoginBannerOptions +ClientLoginBannerResponseOptions +ClientMetadata +ClientName +ClientParameters +ClientPasswordAuthType +ClientPolicy +ClientPolicyTls +ClientProperties +ClientPropertiesList +ClientPropertiesResult +ClientPublicKey +ClientRequestId +ClientRequestImpactStatistics +ClientRequestToken +ClientRequestTokenRequiredException +ClientRootCertificateChain +ClientRootCertificateChainArn +ClientSdkVersion +ClientSecret +ClientSessionId +ClientSideTimestamps +ClientSubnet +ClientSubnets +ClientTimeoutException +ClientToken +ClientTokenConflictException +ClientTokenId +ClientTunnelAddress +ClientVersion +ClientVpcConnection +ClientVpcConnections +ClientVpcIpAddress +ClientVpnAuthentication +ClientVpnAuthenticationRequest +ClientVpnAuthorizationRuleStatus +ClientVpnConnection +ClientVpnConnectionStatus +ClientVpnEndpoint +ClientVpnEndpointAttributeStatus +ClientVpnEndpointId +ClientVpnEndpointIds +ClientVpnEndpointStatus +ClientVpnEndpoints +ClientVpnRoute +ClientVpnRouteStatus +ClientVpnTargetNetworks +Clients +Clip +ClipFragmentSelector +ClipLimits +ClipRange +ClipTimestampRange +ClockRate +ClockSync +Clocks +CloneAppIds +CloneBackendRequest +CloneBackendResponse +CloneGroupId +ClonePermissions +CloneReceiptRuleSetRequest +CloneStackRequest +CloneStackResult +CloseAccountRequest +CloseInstancePublicPortsRequest +CloseInstancePublicPortsResult +CloseStatusFilter +CloseTime +CloseTunnelRequest +Closed +ClosedDays +ClosedDaysRule +CloudComponentStatus +CloudFormation +CloudFormationCollection +CloudFormationCollectionFilter +CloudFormationCostEstimationResourceCollectionFilter +CloudFormationHealth +CloudFormationOverridePropertyConfiguration +CloudFormationStackARN +CloudFormationStackArn +CloudFormationStackRecord +CloudFormationStackRecordSourceInfo +CloudFormationTarget +CloudFrontDefaultCertificate +CloudFrontDistribution +CloudFrontDomain +CloudFrontOriginAccessIdentity +CloudFrontOriginAccessIdentityAlreadyExists +CloudFrontOriginAccessIdentityConfig +CloudFrontOriginAccessIdentityInUse +CloudFrontOriginAccessIdentityList +CloudFrontOriginAccessIdentitySummary +CloudHsmAccessDeniedException +CloudHsmClusterId +CloudHsmClusterInUseException +CloudHsmClusterInvalidConfigurationException +CloudHsmClusterNotActiveException +CloudHsmClusterNotFoundException +CloudHsmClusterNotRelatedException +CloudHsmInternalException +CloudHsmInternalFailureException +CloudHsmInvalidRequestException +CloudHsmResourceNotFoundException +CloudHsmServiceException +CloudHsmTagException +CloudLayout +CloudOnlyDirectoriesCurrentCount +CloudOnlyDirectoriesLimit +CloudOnlyDirectoriesLimitReached +CloudOnlyMicrosoftADCurrentCount +CloudOnlyMicrosoftADLimit +CloudOnlyMicrosoftADLimitReached +CloudRemovalConfigInput +CloudTrail +CloudTrailARNInvalidException +CloudTrailAccessNotEnabledException +CloudTrailConfigurationResult +CloudTrailDetails +CloudTrailEvent +CloudTrailInvalidClientTokenIdException +CloudTrailProperties +CloudWatchAlarmConfiguration +CloudWatchAlarmDefinition +CloudWatchConfig +CloudWatchDashboard +CloudWatchDashboards +CloudWatchDestination +CloudWatchDimensionConfiguration +CloudWatchEncryption +CloudWatchEncryptionEnabled +CloudWatchEncryptionMode +CloudWatchEventDetailType +CloudWatchEventId +CloudWatchEventSource +CloudWatchEventsExecutionDataDetails +CloudWatchLogDeliveryOptions +CloudWatchLogDestination +CloudWatchLogGroupARN +CloudWatchLogGroupArn +CloudWatchLogGroupLogDestination +CloudWatchLogGroupName +CloudWatchLogOptions +CloudWatchLogOptionsSpecification +CloudWatchLoggingConfiguration +CloudWatchLoggingOption +CloudWatchLoggingOptionDescription +CloudWatchLoggingOptionDescriptions +CloudWatchLoggingOptionId +CloudWatchLoggingOptionUpdate +CloudWatchLoggingOptionUpdates +CloudWatchLoggingOptions +CloudWatchLogs +CloudWatchLogsConfig +CloudWatchLogsConfiguration +CloudWatchLogsConfigurationType +CloudWatchLogsDeliveryUnavailableException +CloudWatchLogsDestination +CloudWatchLogsDestinationConfig +CloudWatchLogsDestinationConfiguration +CloudWatchLogsDestinationDetails +CloudWatchLogsDetails +CloudWatchLogsLogDelivery +CloudWatchLogsLogDeliveryDescription +CloudWatchLogsLogGroup +CloudWatchLogsLogGroupArn +CloudWatchLogsLogStream +CloudWatchLogsParameters +CloudWatchLogsRoleArn +CloudWatchMetrics +CloudWatchMetricsDataSummary +CloudWatchMetricsDetail +CloudWatchMetricsDimension +CloudWatchMetricsEnabled +CloudWatchMonitoringConfiguration +CloudWatchOutputConfig +CloudWatchOutputEnabled +CloudWatchOutputUrl +Cloudwatch +CloudwatchAlarmAction +CloudwatchLogGroup +CloudwatchLogStream +CloudwatchLogsAction +CloudwatchLogsExportConfiguration +CloudwatchMetricAction +Cluster +ClusterAlreadyExistsFault +ClusterArn +ClusterAssociatedToSchedule +ClusterAvailabilityStatus +ClusterBlockStorageLogicalUsed +ClusterBlockStorageSize +ClusterBlockStorageUsed +ClusterCertificate +ClusterCloudStorageUsed +ClusterConfig +ClusterConfigStatus +ClusterConfiguration +ClusterContainsContainerInstancesException +ClusterContainsServicesException +ClusterContainsTasksException +ClusterCreateTime +ClusterCredentials +ClusterCsr +ClusterDbRevision +ClusterDbRevisions +ClusterDbRevisionsMessage +ClusterDiscoveryEndpoint +ClusterEnabled +ClusterEndpoint +ClusterEndpointEncryptionType +ClusterEndpoints +ClusterExists +ClusterExtendedCredentials +ClusterHealth +ClusterIamRole +ClusterId +ClusterIdentifier +ClusterInList +ClusterInfo +ClusterInfoList +ClusterIssue +ClusterJDBCURL +ClusterLimitExceededException +ClusterListEntries +ClusterListEntry +ClusterLogging +ClusterMarker +ClusterMarkerConfiguration +ClusterMetadata +ClusterMode +ClusterName +ClusterNameFilter +ClusterNames +ClusterNamespaceArn +ClusterNode +ClusterNodes +ClusterNotFoundException +ClusterNotFoundFault +ClusterOnLatestRevisionFault +ClusterOperationArn +ClusterOperationInfo +ClusterOperationInfoList +ClusterOperationStep +ClusterOperationStepInfo +ClusterOperationV2 +ClusterOperationV2Provisioned +ClusterOperationV2Serverless +ClusterOperationV2Summary +ClusterParameterGroup +ClusterParameterGroupAlreadyExistsFault +ClusterParameterGroupDetails +ClusterParameterGroupFamily +ClusterParameterGroupName +ClusterParameterGroupNameMessage +ClusterParameterGroupNotFoundFault +ClusterParameterGroupQuotaExceededFault +ClusterParameterGroupStatus +ClusterParameterGroups +ClusterParameterGroupsMessage +ClusterParameterStatus +ClusterParameterStatusList +ClusterPendingModifiedValues +ClusterPendingUpdates +ClusterPublicKey +ClusterQuotaExceededFault +ClusterQuotaForCustomerExceededFault +ClusterRevisionNumber +ClusterRoleArn +ClusterSecurityGroup +ClusterSecurityGroupAlreadyExistsFault +ClusterSecurityGroupMembership +ClusterSecurityGroupMessage +ClusterSecurityGroupName +ClusterSecurityGroupNotFoundFault +ClusterSecurityGroupQuotaExceededFault +ClusterSecurityGroups +ClusterServiceConnectDefaults +ClusterServiceConnectDefaultsRequest +ClusterSetting +ClusterSettings +ClusterSnapshot +ClusterSnapshotAlreadyExistsFault +ClusterSnapshotCopyStatus +ClusterSnapshotInList +ClusterSnapshotNotFoundFault +ClusterSnapshotQuotaExceededFault +ClusterState +ClusterStateChangeReason +ClusterStates +ClusterStatus +ClusterSubnetGroup +ClusterSubnetGroupAlreadyExistsFault +ClusterSubnetGroupMessage +ClusterSubnetGroupName +ClusterSubnetGroupNotFoundFault +ClusterSubnetGroupQuotaExceededFault +ClusterSubnetGroups +ClusterSubnetQuotaExceededFault +ClusterSummary +ClusterTimeline +ClusterType +ClusterTypeFilter +ClusterUuid +ClusterVersion +ClusterVersions +ClusterVersionsMessage +ClusteringKey +Clusters +ClustersMessage +CmafAdditionalManifest +CmafEncryption +CmafEncryptionMethod +CmafEncryptionSettings +CmafGroupSettings +CmafImageBasedTrickPlaySettings +CmafPackage +CmafPackageCreateOrUpdateParameters +CmfcSettings +CmkArn +CmkType +Cname +CoIp +Code +CodeArtifacts +CodeBlock +CodeBuildNotInServiceRegionException +CodeBuildServiceRole +CodeCommit +CodeCommitCodeDestination +CodeCommitRepository +CodeConfiguration +CodeConfigurationValues +CodeContent +CodeContentDescription +CodeContentType +CodeContentTypeUpdate +CodeContentUpdate +CodeCoverage +CodeCoverageReportSummary +CodeDeliveryDetails +CodeDeliveryDetailsList +CodeDeliveryDetailsType +CodeDeliveryFailureException +CodeDeployApplication +CodeDeployDeploymentGroup +CodeDeployDeploymentId +CodeDeployInstanceGroupId +CodeDeployState +CodeDestination +CodeError +CodeErrorLocation +CodeFilePath +CodeGenConfigurationNode +CodeGenConfigurationNodes +CodeGenEdge +CodeGenNode +CodeGenNodeArg +CodeHook +CodeHookSpecification +CodeLength +CodeLine +CodeLineCount +CodeMD5 +CodeMismatchException +CodeRepositories +CodeRepository +CodeRepositoryArn +CodeRepositoryName +CodeRepositorySummary +CodeRepositorySummaryList +CodeReview +CodeReviewArn +CodeReviewSummaries +CodeReviewSummary +CodeReviewType +CodeSha256 +CodeSigning +CodeSigningCertificateChain +CodeSigningConfig +CodeSigningConfigArn +CodeSigningConfigId +CodeSigningConfigNotFoundException +CodeSigningConfigs +CodeSigningPolicies +CodeSigningSignature +CodeSize +CodeSizeUnzipped +CodeSizeZipped +CodeSnippetError +CodeSnippetResult +CodeSource +CodeStar +CodeStarParameters +CodeStorageExceededException +CodeValidationException +CodeVerificationFailedException +CodeVulnerabilities +CodeVulnerabilitiesFilePath +CodeVulnerabilityDetails +Codec +CodecLevel +CodecOptions +CodecProfile +CodecSettings +CodecSpecification +CodegenDependency +CodegenFeatureFlags +CodegenGenericDataEnum +CodegenGenericDataField +CodegenGenericDataModel +CodegenGenericDataNonModel +CodegenGenericDataRelationshipType +CodegenJob +CodegenJobAsset +CodegenJobGenericDataSchema +CodegenJobSummary +CodingMode +CognitoConfig +CognitoEnabled +CognitoIdentityProvider +CognitoIdentityProviders +CognitoMemberDefinition +CognitoOptions +CognitoOptionsStatus +CognitoStreams +CognitoUserPoolConfig +CognitoUserPoolConfiguration +CognitoUserPoolId +CohortId +CoipAddressUsage +CoipAddressUsages +CoipCidr +CoipPool +CoipPoolId +CoipPools +ColdStorageOptions +Collaboration +CollaborationAnalysisTemplate +CollaborationAnalysisTemplateSummary +CollaborationSummary +CollapseId +CollapseKey +CollapseStateOptions +CollapsedRowDimensionsVisibility +Collection +CollectionARN +CollectionArn +CollectionConfig +CollectionConfiguration +CollectionConfigurations +CollectionDetail +CollectionDurationMinutes +CollectionEndpoint +CollectionErrorDetail +CollectionFilters +CollectionId +CollectionIds +CollectionName +CollectionParameters +CollectionSummary +CollectionType +CollectionVersion +Collections +CollectiveConstant +Collector +CollectorHealthCheck +CollectorName +CollectorNotFoundFault +CollectorReferencedId +CollectorResponse +CollectorShortInfoResponse +CollectorStatus +CollectorVersion +Collectors +Color +ColorAxis +ColorCorrector +ColorFillType +ColorItemsLimit +ColorItemsLimitConfiguration +ColorLabelOptions +ColorMap +ColorMetadata +ColorRange +ColorScale +ColorSort +ColorSpace +ColorSpaceConversion +ColorSpacePassthroughSettings +ColorSpaceSettings +ColorSpaceUsage +Colorimetry +Colors +ColorsConfiguration +Column +ColumnConfiguration +ColumnConfigurations +ColumnDataRole +ColumnDefinition +ColumnDepth +ColumnDescription +ColumnError +ColumnFormat +ColumnFriendlyName +ColumnGeographicRole +ColumnGroup +ColumnGroupColumnSchema +ColumnGroupColumnSchemaList +ColumnGroupSchema +ColumnGroupSchemaList +ColumnGroups +ColumnHeaderStyle +ColumnHierarchies +ColumnHierarchy +ColumnId +ColumnIdentifier +ColumnImportance +ColumnImportances +ColumnIndex +ColumnInfo +ColumnLFTag +ColumnLabelOptions +ColumnLevelPermissionRule +ColumnLevelPermissionRules +ColumnLevelPermissionRulesApplied +ColumnList +ColumnMetadata +ColumnName +ColumnNames +ColumnNamesVisibility +ColumnRange +ColumnRowFilter +ColumnSchema +ColumnSchemaList +ColumnSelector +ColumnSelectors +ColumnSeparator +ColumnSort +ColumnSpan +ColumnStatistics +ColumnStatisticsConfiguration +ColumnStatisticsConfigurations +ColumnStatisticsData +ColumnStatisticsError +ColumnStatisticsList +ColumnSubtotalOptions +ColumnSynonyms +ColumnTag +ColumnToJsonKeyMappings +ColumnToMatch +ColumnTooltipItem +ColumnTotalOptions +ColumnType +ColumnWildcard +Columns +ComboChartAggregatedFieldWells +ComboChartConfiguration +ComboChartFieldWells +ComboChartSortConfiguration +ComboChartVisual +Command +CommandFilter +CommandId +CommandIds +CommandInvocation +CommandInvocations +CommandPlugin +CommandPlugins +Commands +Comment +CommentContent +CommentContentRequiredException +CommentContentSizeLimitExceededException +CommentDeletedException +CommentDoesNotExistException +CommentFieldMappings +CommentId +CommentIdRequiredException +CommentMetadata +CommentNotCreatedByCallerException +CommentStatus +Comments +CommentsForComparedCommit +CommentsForPullRequest +Commit +CommitDiff +CommitDiffSourceCodeType +CommitDigest +CommitDoesNotExistException +CommitId +CommitIdDoesNotExistException +CommitIdRequiredException +CommitIdsLimitExceededException +CommitIdsListRequiredException +CommitMessage +CommitMessageLengthExceededException +CommitRequiredException +CommitTransaction +CommitTransactionRequest +CommitTransactionResponse +CommitTransactionResult +Commitment +CommitmentConfiguration +CommitmentInformation +CommonAttributes +CommonName +CommonPrefix +CommonPrefixes +CommsProtocol +Communication +CommunicationTypeOptions +CompUpdate +Company +CompanyCode +CompanyName +ComparativeOrder +Comparator +CompareFacesMatch +CompareFacesRequest +CompareFacesResponse +ComparedFace +ComparedSourceImageFace +Comparison +ComparisonConfiguration +ComparisonFormat +ComparisonFormatConfiguration +ComparisonMethod +ComparisonOperator +ComparisonType +ComparisonValue +ComparisonValues +Compatibility +CompatibleArchitecture +CompatibleArchitectures +CompatibleElasticsearchVersions +CompatibleEnvironmentTemplate +CompatibleEnvironmentTemplateInput +CompatibleImage +CompatibleImages +CompatibleKafkaVersion +CompatibleKafkaVersions +CompatibleNodes +CompatibleRuntime +CompatibleRuntimes +CompatibleVersions +CompatibleVersionsMap +CompilationEndTime +CompilationJobArn +CompilationJobName +CompilationJobStatus +CompilationJobSummaries +CompilationJobSummary +CompilationStartTime +CompilationTargetDevice +CompilationTargetPlatformAccelerator +CompilationTargetPlatformArch +CompilationTargetPlatformOs +CompiledOutputConfig +CompilerOptions +Complaint +ComplaintFeedbackType +ComplaintSubType +ComplaintTopic +Complaints +Complete +CompleteAttachmentUploadRequest +CompleteLayerUploadRequest +CompleteLayerUploadResponse +CompleteLifecycleActionType +CompleteMigrationMessage +CompleteMigrationResponse +CompleteMultipartReadSetUploadRequest +CompleteMultipartReadSetUploadResponse +CompleteMultipartUploadInput +CompleteMultipartUploadOutput +CompleteMultipartUploadRequest +CompleteOnConvergence +CompleteReadSetUploadPartListItem +CompleteSnapshotRequest +CompleteSnapshotResponse +CompleteTime +CompleteVaultLockInput +CompleteWindowMinutes +CompleteWorkflowExecutionDecisionAttributes +CompleteWorkflowExecutionFailedEventAttributes +Completed +CompletedAt +CompletedCount +CompletedDate +CompletedMultipartUpload +CompletedOn +CompletedPart +CompletedPieces +CompletedProperties +CompletedTimestamp +CompletionCriteria +CompletionDate +CompletionDateTime +CompletionMessage +CompletionReport +CompletionStatus +CompletionTime +CompletionWindowMinutes +Complexity +Compliance +ComplianceAssociatedStandardsId +ComplianceByConfigRule +ComplianceByConfigRules +ComplianceByResource +ComplianceByResources +ComplianceContributorCount +ComplianceDetails +ComplianceDrift +ComplianceExecutionSummary +ComplianceItem +ComplianceItemEntry +ComplianceItems +ComplianceLevel +ComplianceResourceId +ComplianceResourceIds +ComplianceResourceType +ComplianceResourceTypes +ComplianceSecurityControlId +ComplianceSeverity +ComplianceStatus +ComplianceStringFilter +ComplianceSummariesByResourceType +ComplianceSummary +ComplianceSummaryByResourceType +ComplianceSummaryItem +ComplianceSummaryItems +ComplianceSummaryTimestamp +ComplianceType +ComplianceTypeCountLimitExceededException +ComplianceTypes +ComplianceViolator +CompliantConformancePackCount +CompliantCount +CompliantCriticalCount +CompliantHighCount +CompliantInformationalCount +CompliantLowCount +CompliantMediumCount +CompliantResourceCount +CompliantRuleCount +CompliantSummary +CompliantUnspecifiedCount +Component +ComponentAccount +ComponentArn +ComponentBindingPropertiesValue +ComponentBindingPropertiesValueProperties +ComponentCandidate +ComponentChild +ComponentConditionProperty +ComponentConfiguration +ComponentConfigurationUpdate +ComponentDataConfiguration +ComponentDependencyRequirement +ComponentDeploymentSpecification +ComponentDescription +ComponentEvent +ComponentId +ComponentLatestVersion +ComponentName +ComponentParameter +ComponentParameterDetail +ComponentPlatform +ComponentProperty +ComponentPropertyBindingProperties +ComponentPropertyGroupRequest +ComponentPropertyGroupResponse +ComponentRecommendation +ComponentRegion +ComponentRemarks +ComponentRequest +ComponentResponse +ComponentRunWith +ComponentState +ComponentStatusData +ComponentSummary +ComponentTimestampDelimiter +ComponentType +ComponentTypeSummary +ComponentUpdateRequest +ComponentVariant +ComponentVersion +ComponentVersionArn +ComponentVersionListItem +Components +ComposeEnvironmentsMessage +CompositeAlarm +CompositeAlarms +CompositeMemberIdentifier +CompositeModelProperty +CompositePartitionKey +CompositeSlotTypeSetting +CompositedVideo +CompositedVideoArtifactsConfiguration +CompositedVideoConcatenationConfiguration +Composition +ComprehendMedicalAsyncJobFilter +ComprehendMedicalAsyncJobProperties +ComprehendMedicalAsyncJobPropertiesList +Compress +Compressed +Compression +CompressionFactor +CompressionFormat +CompressionType +CompromisedCredentialsActionsType +CompromisedCredentialsDetected +CompromisedCredentialsRiskConfiguration +CompromisedCredentialsRiskConfigurationType +Computation +ComputationId +ComputationPreference +Computations +Compute +ComputeArn +ComputeAttributes +ComputeCapacity +ComputeCapacityStatus +ComputeConfig +ComputeEnvironmentDetail +ComputeEnvironmentOrder +ComputeFarmConfiguration +ComputeLimits +ComputeList +ComputeName +ComputeResource +ComputeResourceUpdate +ComputeResponse +ComputeStatistics +ComputeStatus +ComputeTime +ComputeType +ComputeTypeName +ComputeUtilization +Computer +ComputerAttributes +ComputerId +ComputerName +ConcatenationSink +ConcatenationSource +Concurrency +ConcurrentAccessException +ConcurrentDeploymentException +ConcurrentExecutionRatePercentage +ConcurrentExecutions +ConcurrentLimitExceededException +ConcurrentModification +ConcurrentModificationException +ConcurrentOperationException +ConcurrentReferenceUpdateException +ConcurrentRunsExceededException +ConcurrentUpdateException +ConcurrentUpdatingException +Condition +ConditionBasedCollectionScheme +ConditionCheck +ConditionCheckFailureException +ConditionDocumentAttributeKey +ConditionExpression +ConditionExpressions +ConditionKey +ConditionOnValue +ConditionParameter +ConditionStepMetadata +ConditionType +ConditionValue +ConditionalBranch +ConditionalCheckFailedException +ConditionalFormatting +ConditionalFormattingColor +ConditionalFormattingCustomIconCondition +ConditionalFormattingCustomIconOptions +ConditionalFormattingGradientColor +ConditionalFormattingIcon +ConditionalFormattingIconDisplayConfiguration +ConditionalFormattingIconSet +ConditionalFormattingOptions +ConditionalFormattingSolidColor +ConditionalForwarder +ConditionalForwarderIpAddrs +ConditionalForwarders +ConditionalOperator +ConditionalSpecification +ConditionalSplit +ConditionalSplitActivity +ConditionalToken +Conditions +ConferencePreference +ConferenceProvider +ConferenceProviderArn +ConferenceProviderName +ConferenceProviderType +ConferenceProviders +Confidence +ConfidenceScore +Config +ConfigCred +ConfigDeliveryS3DestinationArn +ConfigExportDeliveryInfo +ConfigFile +ConfigFileState +ConfigId +ConfigIdResponse +ConfigListItem +ConfigParameter +ConfigRecommendation +ConfigRule +ConfigRuleArn +ConfigRuleComplianceFilters +ConfigRuleComplianceSummaryFilters +ConfigRuleEvaluationStatus +ConfigRuleId +ConfigRuleInvokedTime +ConfigRuleName +ConfigRuleNames +ConfigRuleState +ConfigRules +ConfigRulesEvaluationStatus +ConfigSnapshotDeliveryProperties +ConfigStreamDeliveryInfo +ConfigType +ConfigUri +Configuration +ConfigurationAggregator +ConfigurationAggregatorArn +ConfigurationAggregatorName +ConfigurationAggregatorNames +ConfigurationAggregators +ConfigurationAlias +ConfigurationAliases +ConfigurationArn +ConfigurationEndpoint +ConfigurationErrorDetails +ConfigurationEvent +ConfigurationException +ConfigurationId +ConfigurationInfo +ConfigurationItem +ConfigurationLocationUri +ConfigurationManager +ConfigurationManagers +ConfigurationName +ConfigurationOptionDescription +ConfigurationOptionSetting +ConfigurationOptionsDescription +ConfigurationOverrides +ConfigurationProfile +ConfigurationProfileId +ConfigurationProfileIdentifier +ConfigurationProfileSummary +ConfigurationProfiles +ConfigurationRecorder +ConfigurationRecorderName +ConfigurationRecorderNames +ConfigurationRecorderStatus +ConfigurationRecorders +ConfigurationRecordersStatus +ConfigurationRevision +ConfigurationSchema +ConfigurationSet +ConfigurationSetAlreadyExistsException +ConfigurationSetArn +ConfigurationSetAttributeNames +ConfigurationSetDoesNotExistException +ConfigurationSetFilter +ConfigurationSetInformation +ConfigurationSetName +ConfigurationSetNames +ConfigurationSetSendingPausedException +ConfigurationSets +ConfigurationSettings +ConfigurationSettingsDescription +ConfigurationSettingsDescriptions +ConfigurationSettingsValidationMessages +ConfigurationSource +ConfigurationStatus +ConfigurationSummary +ConfigurationSyncStateSummary +ConfigurationSyncStatus +ConfigurationTag +ConfigurationTemplateQuota +ConfigurationTemplates +ConfigurationToken +ConfigurationType +ConfigurationTypeUpdate +ConfigurationUpdate +ConfigurationUpdates +ConfigurationVersion +Configurations +ConfigurationsVersion +Configure +ConfigureAccessPointRequest +ConfigureAccessPointResponse +ConfigureAgentRequest +ConfigureAgentResponse +ConfigureHealthCheckInput +ConfigureHealthCheckOutput +ConfigureLogsForChannelRequest +ConfigureLogsForChannelResponse +ConfigureLogsForPlaybackConfigurationRequest +ConfigureLogsForPlaybackConfigurationResponse +ConfigureLogsRequest +ConfigureLogsResponse +ConfigureShard +Configured +ConfiguredDataNodeCount +ConfiguredInput +ConfiguredTable +ConfiguredTableAnalysisRule +ConfiguredTableAssociation +ConfiguredTableAssociationSummary +ConfiguredTableSummary +ConfirmConnectionRequest +ConfirmConnectionResponse +ConfirmCustomerAgreementRequest +ConfirmCustomerAgreementResponse +ConfirmDeviceRequest +ConfirmDeviceResponse +ConfirmForgotPasswordRequest +ConfirmPrivateVirtualInterfaceRequest +ConfirmPrivateVirtualInterfaceResponse +ConfirmProductInstanceRequest +ConfirmProductInstanceResult +ConfirmPublicVirtualInterfaceRequest +ConfirmPublicVirtualInterfaceResponse +ConfirmRemoveSelfBucketAccess +ConfirmSignUpRequest +ConfirmSubscriptionInput +ConfirmSubscriptionResponse +ConfirmTopicRuleDestinationRequest +ConfirmTransitVirtualInterfaceRequest +ConfirmTransitVirtualInterfaceResponse +ConfirmationCode +ConfirmationRequired +Conflict +ConflictErrorException +ConflictException +ConflictExceptionErrorArgument +ConflictExceptionType +ConflictMetadata +ConflictResolution +ConflictResolvingModel +ConflictResource +ConflictType +ConflictingAlias +ConflictingAliasesList +ConflictingDomainExists +ConflictingItem +ConflictingItems +ConflictingOperationException +ConflictingPolicyId +ConflictingPriority +ConflictingResourceUpdateException +ConflictingTypes +ConfluenceAttachmentConfiguration +ConfluenceAttachmentToIndexFieldMapping +ConfluenceBlogConfiguration +ConfluenceBlogToIndexFieldMapping +ConfluenceConfiguration +ConfluencePageConfiguration +ConfluencePageToIndexFieldMapping +ConfluenceSpaceConfiguration +ConfluenceSpaceToIndexFieldMapping +ConformancePackArn +ConformancePackComplianceFilters +ConformancePackComplianceScore +ConformancePackComplianceScores +ConformancePackComplianceScoresFilters +ConformancePackComplianceStatus +ConformancePackComplianceSummary +ConformancePackComplianceSummaryList +ConformancePackDetail +ConformancePackDetails +ConformancePackEvaluationFilters +ConformancePackEvaluationResult +ConformancePackId +ConformancePackInputParameter +ConformancePackInputParameters +ConformancePackName +ConformancePackNames +ConformancePackRuleCompliance +ConformancePackRuleComplianceList +ConformancePackRuleEvaluationResults +ConformancePackState +ConformancePackStatusDetail +ConformancePackStatusDetails +ConformancePackStatusReason +ConformancePackTemplateValidationException +ConfusionMatrix +ConnectAppAuthorizationRequest +ConnectAppAuthorizationResponse +ConnectAttachment +ConnectAttachmentId +ConnectAttachmentOptions +ConnectCampaignArn +ConnectCampaignExecutionRoleArn +ConnectClientAddIn +ConnectCustomKeyStoreRequest +ConnectDirectoryRequest +ConnectDirectoryResult +ConnectIps +ConnectParticipant +ConnectPeer +ConnectPeerAssociation +ConnectPeerAssociations +ConnectPeerBgpConfiguration +ConnectPeerConfiguration +ConnectPeerId +ConnectPeerIds +ConnectPeerState +ConnectPeerSummary +ConnectPeers +ConnectSettings +ConnectedAt +ConnectedDatabase +ConnectedDeviceCount +ConnectedDeviceId +ConnectedDirectoriesCurrentCount +ConnectedDirectoriesLimit +ConnectedDirectoriesLimitReached +ConnectedHome +ConnectedHomeForUpdate +ConnectedHomeSettings +ConnectedHomeSettingsForUpdate +ConnectedLinkId +ConnectedToAgentTimestamp +Connection +ConnectionAlias +ConnectionAliasAssociation +ConnectionAliasPermission +ConnectionAliasPermissions +ConnectionAliases +ConnectionApiKeyAuthResponseParameters +ConnectionArn +ConnectionAttempts +ConnectionAuthResponseParameters +ConnectionBasicAuthResponseParameters +ConnectionBodyParameter +ConnectionBorrowTimeout +ConnectionConfiguration +ConnectionCredentials +ConnectionDetails +ConnectionDirection +ConnectionDraining +ConnectionEndTime +ConnectionErrorCode +ConnectionEstablishedTime +ConnectionEvents +ConnectionExpiry +ConnectionHeaderParameter +ConnectionHealth +ConnectionHttpParameters +ConnectionId +ConnectionIdentifier +ConnectionIds +ConnectionInfo +ConnectionInput +ConnectionLimitExceededException +ConnectionList +ConnectionLogOptions +ConnectionLogResponseOptions +ConnectionLost +ConnectionMode +ConnectionName +ConnectionNameList +ConnectionNotification +ConnectionNotificationArn +ConnectionNotificationId +ConnectionNotificationIds +ConnectionNotificationSet +ConnectionNotificationState +ConnectionNotificationType +ConnectionOAuthClientResponseParameters +ConnectionOAuthResponseParameters +ConnectionParameters +ConnectionPasswordEncryption +ConnectionPoolConfig +ConnectionPoolConfiguration +ConnectionPoolConfigurationInfo +ConnectionProperties +ConnectionQueryStringParameter +ConnectionRefusedCount +ConnectionRetryInterval +ConnectionSettings +ConnectionState +ConnectionStateCheckTimestamp +ConnectionStatus +ConnectionStatusEventConfiguration +ConnectionStatusResourceTypeEventConfiguration +ConnectionStatusUpdatedTime +ConnectionStatuses +ConnectionString +ConnectionSummary +ConnectionSummaryList +ConnectionTable +ConnectionTimeout +ConnectionToken +ConnectionType +Connections +ConnectionsList +Connectivity +ConnectivityInfo +ConnectivityStatus +ConnectivityType +Connector +ConnectorArn +ConnectorAuthenticationException +ConnectorConfigRequest +ConnectorConfigResponse +ConnectorConfiguration +ConnectorDefinitionId +ConnectorDefinitionVersion +ConnectorDefinitionVersionArn +ConnectorDefinitionVersionId +ConnectorDetail +ConnectorEntity +ConnectorEntityField +ConnectorFailureException +ConnectorId +ConnectorMetadata +ConnectorName +ConnectorOAuthRequest +ConnectorOperator +ConnectorProfile +ConnectorProfileConfig +ConnectorProfileCredentials +ConnectorProfileName +ConnectorProfileProperties +ConnectorProvisioningConfig +ConnectorRuntimeSetting +ConnectorServerException +ConnectorSummary +ConnectorTimeoutException +ConnectorType +Connectors +Consent +ConsistencyLevel +ConsistentRead +ConsoleAccess +ConsoleURL +ConsolidatedReportMetric +Consolidation +ConsolidationKey +Constant +ConstantBitrate +ConstantInitializationVector +ConstantIv +ConstantType +Constraint +ConstraintDescription +ConstraintDetail +ConstraintDetails +ConstraintId +ConstraintParameters +ConstraintSummaries +ConstraintSummary +ConstraintViolationException +Constraints +ConstraintsResource +ConsumedCapacity +ConsumedIOs +ConsumedLabels +ConsumedLicenseSummary +ConsumedLicenseSummaryList +ConsumedLicenses +ConsumedResources +ConsumedSpiceCapacityInBytes +ConsumedStatefulRuleCapacity +ConsumedStatelessRuleCapacity +ConsumedValue +Consumer +ConsumerARN +ConsumerArn +ConsumerArns +ConsumerCount +ConsumerCreationTimestamp +ConsumerDescription +ConsumerGroupID +ConsumerGroupId +ConsumerIdentifier +ConsumerName +ConsumerRegion +ConsumerStatus +Consumers +Consumption +ConsumptionConfiguration +Contact +ContactAgentId +ContactArn +ContactCenter +ContactCenterActivity +ContactChannel +ContactChannelAddress +ContactChannelArn +ContactChannelId +ContactChannels +ContactContent +ContactData +ContactDetail +ContactEmail +ContactFilter +ContactFlow +ContactFlowArn +ContactFlowId +ContactFlowModule +ContactFlowModuleId +ContactFlowModuleState +ContactFlowModuleSummary +ContactFlowModulesSummaryList +ContactFlowNotPublishedException +ContactFlowState +ContactFlowSummary +ContactFlowSummaryList +ContactFlowType +ContactFlowTypes +ContactId +ContactIdResponse +ContactIds +ContactInformation +ContactLanguage +ContactList +ContactListDestination +ContactListImportAction +ContactListName +ContactLists +ContactMethod +ContactName +ContactNotFoundException +ContactNotes +ContactNumber +ContactPhoneNumber +ContactStates +ContactTargetInfo +ContactType +Contacts +Container +ContainerArguments +ContainerConfig +ContainerConfiguration +ContainerDatasetAction +ContainerDefinition +ContainerDefinitions +ContainerDependency +ContainerDetail +ContainerDetails +ContainerDistributionConfiguration +ContainerEntrypoint +ContainerFormat +ContainerHostname +ContainerImage +ContainerInUseException +ContainerInstance +ContainerInstanceHealthStatus +ContainerLevelMetrics +ContainerLogRotationConfiguration +ContainerName +ContainerNotFoundException +ContainerOverride +ContainerOverrides +ContainerPath +ContainerPort +ContainerProperties +ContainerProvider +ContainerRecipe +ContainerRecipeSummary +ContainerRecommendation +ContainerRuntime +ContainerService +ContainerServiceDeployment +ContainerServiceDeploymentRequest +ContainerServiceECRImagePullerRole +ContainerServiceECRImagePullerRoleRequest +ContainerServiceEndpoint +ContainerServiceHealthCheckConfig +ContainerServiceLogEvent +ContainerServicePower +ContainerServiceRegistryLogin +ContainerServiceStateDetail +ContainerServicesListResult +ContainerSettings +ContainerStartupHealthCheckTimeoutInSeconds +ContainerStateChange +ContainerSummary +ContainerType +ContainerUrl +Containers +ContainsAll +ContainsAny +ContainsHeader +ContainsLabels +ContainsOldGroupVersions +ContainsPiiEntitiesRequest +ContainsPiiEntitiesResponse +Content +ContentArtifactsConfiguration +ContentCategories +ContentClassifiers +ContentColumn +ContentConcatenationConfiguration +ContentConfig +ContentCreatedTimestamp +ContentData +ContentDigest +ContentDisposition +ContentEncoding +ContentHandlingStrategy +ContentHash +ContentIdentificationType +ContentLanguage +ContentLength +ContentMD5 +ContentModerationDetection +ContentModifiedTimestamp +ContentRange +ContentRedaction +ContentRedactionOutput +ContentRedactionType +ContentReference +ContentSHA256 +ContentSecurityPolicy +ContentSegmentUrlPrefix +ContentSha256 +ContentShareLayout +ContentSourceConfiguration +ContentSummary +ContentTemplate +ContentTransformation +ContentType +ContentTypeOptions +ContentTypeProfile +ContentTypeProfileConfig +ContentTypeProfiles +ContentUrl +Contents +Context +ContextArn +ContextAssertion +ContextData +ContextDataType +ContextEntries +ContextEntry +ContextId +ContextKeyName +ContextKeyNames +ContextKeyType +ContextKeyValues +ContextName +ContextScope +ContextScopeType +ContextSource +ContextSummaries +ContextSummary +ContextType +ContextWords +ContinentCode +ContinentName +ContinuationSequenceNumber +ContinuationToken +ContinueAsNewWorkflowExecutionDecisionAttributes +ContinueAsNewWorkflowExecutionFailedEventAttributes +ContinueDeploymentInput +ContinueUpdateRollbackInput +ContinuedFromContactId +ContinuousBackupsDescription +ContinuousBackupsStatus +ContinuousBackupsUnavailableException +ContinuousDeploymentPolicy +ContinuousDeploymentPolicyAlreadyExists +ContinuousDeploymentPolicyConfig +ContinuousDeploymentPolicyId +ContinuousDeploymentPolicyInUse +ContinuousDeploymentPolicyList +ContinuousDeploymentPolicySummary +ContinuousDeploymentSingleHeaderConfig +ContinuousDeploymentSingleWeightConfig +ContinuousExportDescription +ContinuousHyperParameterRange +ContinuousParameterRange +ContinuousParameterRangeSpecification +ContinuousParameterRanges +Contrast +ContributingSubnets +ContributionAnalysisDefault +ContributionAnalysisDefaults +ContributionMatrix +ContributionPercentage +ContributionScore +Contributor +ContributorDimensions +ContributorId +ContributorInsightsAction +ContributorInsightsRuleList +ContributorInsightsStatus +ContributorInsightsSummaries +ContributorInsightsSummary +Contributors +Control +ControlComment +ControlDomainInsights +ControlFindingGenerator +ControlId +ControlInputParameter +ControlInputParameters +ControlInsightsMetadataByAssessmentItem +ControlInsightsMetadataItem +ControlMappingSource +ControlMetadata +ControlName +ControlOperation +ControlPanel +ControlPanelArn +ControlPanelName +ControlPanels +ControlPlanePlacementRequest +ControlPlanePlacementResponse +ControlPlaneTagFilter +ControlScope +ControlSet +ControlStatus +ControlStatusUpdatedAt +ControlTablesFileGroup +Controls +ConvergenceDetected +ConvergenceDetectedTime +ConversationId +ConversationLevelIntentClassificationResultItem +ConversationLevelResultDetail +ConversationLevelSlotResolutionResultItem +ConversationLevelTestResultItem +ConversationLevelTestResults +ConversationLevelTestResultsFilterBy +ConversationLogSettings +ConversationLogsDataSource +ConversationLogsDataSourceFilterBy +ConversationLogsRequest +ConversationLogsResponse +ConversationRetentionSettings +ConversionConfiguration +ConversionProperties +ConversionTask +ConversionTaskId +ConversionTaskIds +ConversionTasks +Convert608To708 +ConvertDotsInJsonKeysToUnderscores +ConvertPaintToPop +ConvertRecoveryPointToSnapshotRequest +ConvertRecoveryPointToSnapshotResponse +ConvertTimestampWithZoneToUTC +Cookie +CookieBehavior +CookieExpirationPeriod +CookieMatchPattern +CookieName +CookieNames +CookieObject +CookiePreference +CookieSpecification +CookieSynchronizationConfiguration +Cookies +CookiesConfig +CoolDown +Cooldown +CoolingPeriod +Coordinates +CoordinatorDpuSize +CopyAction +CopyActions +CopyBackupRequest +CopyBackupResponse +CopyBackupToRegionRequest +CopyBackupToRegionResponse +CopyClusterSnapshotMessage +CopyClusterSnapshotResult +CopyCommand +CopyDBClusterParameterGroupMessage +CopyDBClusterParameterGroupResult +CopyDBClusterSnapshotMessage +CopyDBClusterSnapshotResult +CopyDBParameterGroupMessage +CopyDBParameterGroupResult +CopyDBSnapshotMessage +CopyDBSnapshotResult +CopyDestinationImageSet +CopyDestinationImageSetProperties +CopyDistributionRequest +CopyDistributionResult +CopyFpgaImageRequest +CopyFpgaImageResult +CopyImageRequest +CopyImageResponse +CopyImageResult +CopyImageSetInformation +CopyImageSetRequest +CopyImageSetResponse +CopyImageTags +CopyJob +CopyJobId +CopyJobs +CopyObjectOutput +CopyObjectRequest +CopyObjectResult +CopyOptionGroup +CopyOptionGroupMessage +CopyOptionGroupResult +CopyOptions +CopyPackageVersionsRequest +CopyPackageVersionsResult +CopyPartResult +CopyProductInput +CopyProductOutput +CopyProductStatus +CopyProductToken +CopyProjectVersionRequest +CopyProjectVersionResponse +CopyProtectionAction +CopySnapshotMessage +CopySnapshotRequest +CopySnapshotResponse +CopySnapshotResult +CopySource +CopySourceArn +CopySourceIfMatch +CopySourceIfModifiedSince +CopySourceIfNoneMatch +CopySourceIfUnmodifiedSince +CopySourceImageSetInformation +CopySourceImageSetProperties +CopySourceRange +CopySourceSSECustomerAlgorithm +CopySourceSSECustomerKey +CopySourceSSECustomerKeyMD5 +CopySourceTagsToRestoredResource +CopySourceVersionId +CopyStepDetails +CopyStrategy +CopyTags +CopyTagsFromSource +CopyTagsToBackups +CopyTagsToDataRepositoryAssociations +CopyTagsToSnapshot +CopyTagsToSnapshots +CopyTagsToVolumes +CopyTimestamp +CopyToRegionDisabledFault +CopyWorkspaceImageRequest +CopyWorkspaceImageResult +CopyableCrossAccount +CopyrightHolder +Core +CoreCount +CoreDefinitionId +CoreDefinitionVersion +CoreDefinitionVersionArn +CoreDefinitionVersionId +CoreDevice +CoreDumpConfig +CoreNetwork +CoreNetworkAddress +CoreNetworkArn +CoreNetworkAsn +CoreNetworkAttachmentArn +CoreNetworkAttachmentId +CoreNetworkChange +CoreNetworkChangeEvent +CoreNetworkChangeEventValues +CoreNetworkChangeEvents +CoreNetworkChangeValues +CoreNetworkChanges +CoreNetworkEdge +CoreNetworkId +CoreNetworkPolicy +CoreNetworkPolicyError +CoreNetworkPolicyException +CoreNetworkPolicyVersion +CoreNetworkPolicyVersions +CoreNetworkSegment +CoreNetworkSegmentEdge +CoreNetworkSegmentEdgeIdentifier +CoreNetworkSummary +CoreNetworks +Cores +CornerRadius +CorrectedTerm +Correction +CorrectionGateLevel +Corrections +Cors +CorsConfig +CorsConfiguration +CorsPolicy +CorsPolicyNotFoundException +CorsRule +Cost +CostAllocationTag +CostAllocationTagStatusEntry +CostAllocationTags +CostAllocationTagsStatus +CostCategories +CostCategory +CostCategoryArn +CostCategoryInheritedValueDimension +CostCategoryName +CostCategoryNames +CostCategoryProcessingStatus +CostCategoryReference +CostCategoryReferences +CostCategoryRule +CostCategorySplitChargeRule +CostCategorySplitChargeRuleParameter +CostCategoryValues +CostEstimate +CostEstimationResourceCollectionFilter +CostEstimationTimeRange +CostFilters +CostPerHour +CostPerInference +CostTypes +Costs +Count +CountAction +CountByCoverageStatus +CountByResourceType +CountBySeverity +CountClosedWorkflowExecutionsInput +CountDistinct +CountDistinctLong +CountLong +CountNan +CountNanLong +CountNull +CountNullLong +CountOpenWorkflowExecutionsInput +CountPendingActivityTasksInput +CountPendingDecisionTasksInput +CountPercent +CountUpdate +Counters +Country +CountryCode +CountryCodeIso2 +CountryCodeNumeric +CountryCodes +CountryName +Counts +CountsSummary +County +Coverage +CoverageByTime +CoverageCost +CoverageDateFilter +CoverageEksClusterDetails +CoverageFilterCondition +CoverageFilterCriteria +CoverageFilterCriterion +CoverageHours +CoverageHoursPercentage +CoverageMapFilter +CoverageNormalizedUnits +CoverageNormalizedUnitsPercentage +CoveragePercentage +CoverageResource +CoverageResourceDetails +CoverageSortCriteria +CoverageStatistics +CoverageStatus +CoverageStringFilter +CoverageTime +CoveragesByTime +CoveredNodes +CoveredResource +CoversBodyPart +CpsLimit +CpsUri +Cpu +CpuCredits +CpuManufacturers +CpuOptions +CpuOptionsRequest +CpuThreshold +CpuUtilization +Crawl +CrawlArchivedSpaces +CrawlAttachments +CrawlBotMessage +CrawlChatRooms +CrawlComments +CrawlDepth +CrawlElapsedTime +CrawlFileComments +CrawlId +CrawlIssue +CrawlIssueComment +CrawlIssueCommentAttachment +CrawlPersonalSpaces +CrawlPullRequest +CrawlPullRequestComment +CrawlPullRequestCommentAttachment +CrawlRepositoryDocuments +CrawlState +CrawlSystemFolders +CrawlTasks +CrawlWebLinks +Crawler +CrawlerConnection +CrawlerDetails +CrawlerHistory +CrawlerLineageSettings +CrawlerMetrics +CrawlerMetricsList +CrawlerName +CrawlerNameList +CrawlerNames +CrawlerNodeDetails +CrawlerNotRunningException +CrawlerRunningException +CrawlerSecurityConfiguration +CrawlerStoppingException +CrawlerTargets +Crawlers +CrawlersNotFound +Crawls +CrawlsFilter +Create +CreateACLRequest +CreateACLResponse +CreateAPIKeyRequest +CreateAPIKeyResponse +CreateAcceleratorRequest +CreateAcceleratorResponse +CreateAccessControlConfigurationRequest +CreateAccessControlConfigurationResponse +CreateAccessKeyRequest +CreateAccessKeyResponse +CreateAccessLogSubscriptionRequest +CreateAccessLogSubscriptionResponse +CreateAccessPointForObjectLambdaRequest +CreateAccessPointForObjectLambdaResult +CreateAccessPointInput +CreateAccessPointOutput +CreateAccessPointRequest +CreateAccessPointResult +CreateAccessPolicyRequest +CreateAccessPolicyResponse +CreateAccessPreviewRequest +CreateAccessPreviewResponse +CreateAccessRequest +CreateAccessResponse +CreateAccessTokenRequest +CreateAccessTokenResponse +CreateAccessorInput +CreateAccessorOutput +CreateAccountAliasRequest +CreateAccountAssignmentRequest +CreateAccountAssignmentResponse +CreateAccountCustomizationRequest +CreateAccountCustomizationResponse +CreateAccountRequest +CreateAccountRequestId +CreateAccountResponse +CreateAccountStatus +CreateAccountStatusNotFoundException +CreateAccountStatuses +CreateAccountSubscriptionRequest +CreateAccountSubscriptionResponse +CreateActionRequest +CreateActionResponse +CreateActionTargetRequest +CreateActionTargetResponse +CreateActivationRequest +CreateActivationResult +CreateActivityInput +CreateActivityOutput +CreateAdditionalAssignmentsForHITRequest +CreateAddonRequest +CreateAddonResponse +CreateAddressBookRequest +CreateAddressBookResponse +CreateAddressRequest +CreateAddressResult +CreateAgentRequest +CreateAgentResponse +CreateAgentStatusRequest +CreateAgentStatusResponse +CreateAgreementRequest +CreateAgreementResponse +CreateAlarmModelRequest +CreateAlarmModelResponse +CreateAlertManagerDefinitionRequest +CreateAlertManagerDefinitionResponse +CreateAlertRequest +CreateAlertResponse +CreateAlgorithmInput +CreateAlgorithmOutput +CreateAliasInput +CreateAliasOutput +CreateAliasRequest +CreateAliasResult +CreateAllowListRequest +CreateAllowListResponse +CreateAnalysisRequest +CreateAnalysisResponse +CreateAnalysisTemplateInput +CreateAnalysisTemplateOutput +CreateAnalyzerRequest +CreateAnalyzerResponse +CreateAnnotationStoreRequest +CreateAnnotationStoreResponse +CreateAnnotationStoreVersionRequest +CreateAnnotationStoreVersionResponse +CreateAnomalyDetectorRequest +CreateAnomalyDetectorResponse +CreateAnomalyMonitorRequest +CreateAnomalyMonitorResponse +CreateAnomalySubscriptionRequest +CreateAnomalySubscriptionResponse +CreateApiCacheRequest +CreateApiCacheResponse +CreateApiDestinationRequest +CreateApiDestinationResponse +CreateApiKeyRequest +CreateApiKeyResponse +CreateApiMappingRequest +CreateApiMappingResponse +CreateApiRequest +CreateApiResponse +CreateAppAuthorizationRequest +CreateAppAuthorizationResponse +CreateAppBlockBuilderRequest +CreateAppBlockBuilderResult +CreateAppBlockBuilderStreamingURLRequest +CreateAppBlockBuilderStreamingURLResult +CreateAppBlockRequest +CreateAppBlockResult +CreateAppBundleRequest +CreateAppBundleResponse +CreateAppCookieStickinessPolicyInput +CreateAppImageConfigRequest +CreateAppImageConfigResponse +CreateAppInstanceAdminRequest +CreateAppInstanceAdminResponse +CreateAppInstanceBotRequest +CreateAppInstanceBotResponse +CreateAppInstanceRequest +CreateAppInstanceResponse +CreateAppInstanceUserRequest +CreateAppInstanceUserResponse +CreateAppMonitorRequest +CreateAppMonitorResponse +CreateAppRequest +CreateAppResponse +CreateAppResult +CreateAppVersionAppComponentRequest +CreateAppVersionAppComponentResponse +CreateAppVersionResourceRequest +CreateAppVersionResourceResponse +CreateApplicationInput +CreateApplicationInstanceRequest +CreateApplicationInstanceResponse +CreateApplicationMessage +CreateApplicationOutput +CreateApplicationPresignedUrlRequest +CreateApplicationPresignedUrlResponse +CreateApplicationRequest +CreateApplicationResponse +CreateApplicationResult +CreateApplicationSnapshotRequest +CreateApplicationVersionMessage +CreateApplicationVersionRequest +CreateApplicationVersionResponse +CreateApprovalRuleTemplateInput +CreateApprovalRuleTemplateOutput +CreateArchiveRequest +CreateArchiveResponse +CreateArchiveRuleRequest +CreateArtifactRequest +CreateArtifactResponse +CreateAssessmentFrameworkControl +CreateAssessmentFrameworkControlSet +CreateAssessmentFrameworkRequest +CreateAssessmentFrameworkResponse +CreateAssessmentReportRequest +CreateAssessmentReportResponse +CreateAssessmentRequest +CreateAssessmentResponse +CreateAssessmentTargetRequest +CreateAssessmentTargetResponse +CreateAssessmentTemplateRequest +CreateAssessmentTemplateResponse +CreateAssetModelRequest +CreateAssetModelResponse +CreateAssetRequest +CreateAssetResponse +CreateAssistantAssociationRequest +CreateAssistantAssociationResponse +CreateAssistantRequest +CreateAssistantResponse +CreateAssociationBatchRequest +CreateAssociationBatchRequestEntry +CreateAssociationBatchResult +CreateAssociationRequest +CreateAssociationResult +CreateAttendeeError +CreateAttendeeRequest +CreateAttendeeRequestItem +CreateAttendeeResponse +CreateAttributeGroupRequest +CreateAttributeGroupResponse +CreateAuditSuppressionRequest +CreateAuthChallenge +CreateAuthenticationProfileMessage +CreateAuthenticationProfileResult +CreateAuthorizerRequest +CreateAuthorizerResponse +CreateAutoMLJobRequest +CreateAutoMLJobResponse +CreateAutoMLJobV2Request +CreateAutoMLJobV2Response +CreateAutoPredictorRequest +CreateAutoPredictorResponse +CreateAutoScalingConfigurationRequest +CreateAutoScalingConfigurationResponse +CreateAutoScalingGroupType +CreateAutomationRuleRequest +CreateAutomationRuleResponse +CreateAvailabilityConfigurationRequest +CreateAwsLogSourceRequest +CreateAwsLogSourceResponse +CreateBGPPeerRequest +CreateBGPPeerResponse +CreateBackendAPIRequest +CreateBackendAPIResponse +CreateBackendAuthForgotPasswordConfig +CreateBackendAuthIdentityPoolConfig +CreateBackendAuthMFAConfig +CreateBackendAuthOAuthConfig +CreateBackendAuthPasswordPolicyConfig +CreateBackendAuthRequest +CreateBackendAuthResourceConfig +CreateBackendAuthResponse +CreateBackendAuthUserPoolConfig +CreateBackendAuthVerificationMessageConfig +CreateBackendConfigRequest +CreateBackendConfigResponse +CreateBackendEnvironmentRequest +CreateBackendEnvironmentResult +CreateBackendRequest +CreateBackendResponse +CreateBackendStorageRequest +CreateBackendStorageResourceConfig +CreateBackendStorageResponse +CreateBackupInput +CreateBackupOutput +CreateBackupPlanInput +CreateBackupPlanOutput +CreateBackupRequest +CreateBackupResponse +CreateBackupSelectionInput +CreateBackupSelectionOutput +CreateBackupVaultInput +CreateBackupVaultOutput +CreateBasePathMappingRequest +CreateBatchImportJobRequest +CreateBatchInferenceJobRequest +CreateBatchInferenceJobResponse +CreateBatchLoadTaskRequest +CreateBatchLoadTaskResponse +CreateBatchPredictionInput +CreateBatchPredictionJobRequest +CreateBatchPredictionOutput +CreateBatchSegmentJobRequest +CreateBatchSegmentJobResponse +CreateBillingGroupInput +CreateBillingGroupOutput +CreateBillingGroupRequest +CreateBillingGroupResponse +CreateBlueGreenDeploymentRequest +CreateBlueGreenDeploymentResponse +CreateBlueprintRequest +CreateBlueprintResponse +CreateBotAliasRequest +CreateBotAliasResponse +CreateBotLocaleRequest +CreateBotLocaleResponse +CreateBotRequest +CreateBotResponse +CreateBotVersionRequest +CreateBotVersionResponse +CreateBranchInput +CreateBranchRequest +CreateBranchResult +CreateBridge420Exception +CreateBridgeRequest +CreateBridgeResponse +CreateBrokerRequest +CreateBrokerResponse +CreateBrowserSettingsRequest +CreateBrowserSettingsResponse +CreateBucketAccessKeyRequest +CreateBucketAccessKeyResult +CreateBucketConfiguration +CreateBucketOutput +CreateBucketRequest +CreateBucketResult +CreateBudgetActionRequest +CreateBudgetActionResponse +CreateBudgetRequest +CreateBuildInput +CreateBuildOutput +CreateBulkImportJobRequest +CreateBulkImportJobResponse +CreateBusinessReportScheduleRequest +CreateBusinessReportScheduleResponse +CreateByteMatchSetRequest +CreateByteMatchSetResponse +CreateCacheClusterMessage +CreateCacheClusterResult +CreateCacheParameterGroupMessage +CreateCacheParameterGroupResult +CreateCachePolicyRequest +CreateCachePolicyResult +CreateCacheSecurityGroupMessage +CreateCacheSecurityGroupResult +CreateCacheSubnetGroupMessage +CreateCacheSubnetGroupResult +CreateCachediSCSIVolumeInput +CreateCachediSCSIVolumeOutput +CreateCalculatedAttributeDefinitionRequest +CreateCalculatedAttributeDefinitionResponse +CreateCallAnalyticsCategoryRequest +CreateCallAnalyticsCategoryResponse +CreateCampaignRequest +CreateCampaignResponse +CreateCanaryRequest +CreateCanaryResponse +CreateCapacityProviderRequest +CreateCapacityProviderResponse +CreateCapacityReservationFleetRequest +CreateCapacityReservationFleetResult +CreateCapacityReservationInput +CreateCapacityReservationRequest +CreateCapacityReservationResult +CreateCarrierGatewayRequest +CreateCarrierGatewayResult +CreateCaseRequest +CreateCaseResponse +CreateCellRequest +CreateCellResponse +CreateCertificateAuthorityAuditReportRequest +CreateCertificateAuthorityAuditReportResponse +CreateCertificateAuthorityRequest +CreateCertificateAuthorityResponse +CreateCertificateFromCsrRequest +CreateCertificateFromCsrResponse +CreateCertificateRequest +CreateCertificateResult +CreateChangeSetInput +CreateChangeSetOutput +CreateChangesetRequest +CreateChangesetResponse +CreateChannelBanRequest +CreateChannelBanResponse +CreateChannelFlowRequest +CreateChannelFlowResponse +CreateChannelGroupRequest +CreateChannelGroupResponse +CreateChannelMembershipRequest +CreateChannelMembershipResponse +CreateChannelModeratorRequest +CreateChannelModeratorResponse +CreateChannelRequest +CreateChannelResponse +CreateChatTokenRequest +CreateChatTokenResponse +CreateCidrCollectionRequest +CreateCidrCollectionResponse +CreateClassificationJobRequest +CreateClassificationJobResponse +CreateClassifierRequest +CreateCliTokenRequest +CreateCliTokenResponse +CreateClientVpnEndpointRequest +CreateClientVpnEndpointResult +CreateClientVpnRouteRequest +CreateClientVpnRouteResult +CreateCloudFormationChangeSetRequest +CreateCloudFormationChangeSetResponse +CreateCloudFormationStackRequest +CreateCloudFormationStackResult +CreateCloudFormationTemplateRequest +CreateCloudFormationTemplateResponse +CreateCloudFrontOriginAccessIdentityRequest +CreateCloudFrontOriginAccessIdentityResult +CreateClusterInput +CreateClusterMessage +CreateClusterOutput +CreateClusterParameterGroupMessage +CreateClusterParameterGroupResult +CreateClusterRequest +CreateClusterResponse +CreateClusterResult +CreateClusterSecurityGroupMessage +CreateClusterSecurityGroupResult +CreateClusterSnapshotInput +CreateClusterSnapshotMessage +CreateClusterSnapshotOutput +CreateClusterSnapshotResult +CreateClusterSubnetGroupMessage +CreateClusterSubnetGroupResult +CreateClusterV2Request +CreateClusterV2Response +CreateCodeRepositoryInput +CreateCodeRepositoryOutput +CreateCodeReviewRequest +CreateCodeReviewResponse +CreateCodeSigningConfigRequest +CreateCodeSigningConfigResponse +CreateCoipCidrRequest +CreateCoipCidrResult +CreateCoipPoolRequest +CreateCoipPoolResult +CreateCollaborationInput +CreateCollaborationOutput +CreateCollectionDetail +CreateCollectionRequest +CreateCollectionResponse +CreateColumn +CreateColumnsOperation +CreateCommentRequest +CreateCommentResponse +CreateCommitInput +CreateCommitOutput +CreateCompilationJobRequest +CreateCompilationJobResponse +CreateComponentData +CreateComponentInput +CreateComponentOutput +CreateComponentRequest +CreateComponentResponse +CreateComponentTypeRequest +CreateComponentTypeResponse +CreateComponentVersionRequest +CreateComponentVersionResponse +CreateComputeEnvironmentRequest +CreateComputeEnvironmentResponse +CreateComputerRequest +CreateComputerResult +CreateConditionalForwarderRequest +CreateConferenceProviderRequest +CreateConferenceProviderResponse +CreateConfigRequest +CreateConfigurationProfileRequest +CreateConfigurationRequest +CreateConfigurationResponse +CreateConfigurationSetEventDestinationRequest +CreateConfigurationSetRequest +CreateConfigurationSetResult +CreateConfigurationSetTrackingOptionsRequest +CreateConfigurationTemplateMessage +CreateConfiguredTableAnalysisRuleInput +CreateConfiguredTableAnalysisRuleOutput +CreateConfiguredTableAssociationInput +CreateConfiguredTableAssociationOutput +CreateConfiguredTableInput +CreateConfiguredTableOutput +CreateConnectAttachmentRequest +CreateConnectAttachmentResponse +CreateConnectClientAddInRequest +CreateConnectClientAddInResult +CreateConnectPeerRequest +CreateConnectPeerResponse +CreateConnectionAliasRequest +CreateConnectionAliasResult +CreateConnectionApiKeyAuthRequestParameters +CreateConnectionAuthRequestParameters +CreateConnectionBasicAuthRequestParameters +CreateConnectionInput +CreateConnectionOAuthClientRequestParameters +CreateConnectionOAuthRequestParameters +CreateConnectionOutput +CreateConnectionRequest +CreateConnectionResponse +CreateConnectorDefinitionRequest +CreateConnectorDefinitionResponse +CreateConnectorDefinitionVersionRequest +CreateConnectorDefinitionVersionResponse +CreateConnectorProfileRequest +CreateConnectorProfileResponse +CreateConnectorRequest +CreateConnectorResponse +CreateConstraintInput +CreateConstraintOutput +CreateContactChannelRequest +CreateContactChannelResult +CreateContactFlowModuleRequest +CreateContactFlowModuleResponse +CreateContactFlowRequest +CreateContactFlowResponse +CreateContactListRequest +CreateContactMethodRequest +CreateContactMethodResult +CreateContactRequest +CreateContactResponse +CreateContactResult +CreateContainerInput +CreateContainerOutput +CreateContainerRecipeRequest +CreateContainerRecipeResponse +CreateContainerServiceDeploymentRequest +CreateContainerServiceDeploymentResult +CreateContainerServiceRegistryLoginResult +CreateContainerServiceRequest +CreateContainerServiceResult +CreateContentRequest +CreateContentResponse +CreateContextRequest +CreateContextResponse +CreateContinuousDeploymentPolicyRequest +CreateContinuousDeploymentPolicyResult +CreateControlMappingSource +CreateControlPanelRequest +CreateControlPanelResponse +CreateControlRequest +CreateControlResponse +CreateCoreDefinitionRequest +CreateCoreDefinitionResponse +CreateCoreDefinitionVersionRequest +CreateCoreDefinitionVersionResponse +CreateCoreNetworkRequest +CreateCoreNetworkResponse +CreateCostCategoryDefinitionRequest +CreateCostCategoryDefinitionResponse +CreateCrawlerRequest +CreateCrossAccountAuthorizationRequest +CreateCrossAccountAuthorizationResponse +CreateCsvClassifierRequest +CreateCustomActionTypeInput +CreateCustomActionTypeOutput +CreateCustomDBEngineVersionFault +CreateCustomDBEngineVersionMessage +CreateCustomDataIdentifierRequest +CreateCustomDataIdentifierResponse +CreateCustomDomainAssociationMessage +CreateCustomDomainAssociationResult +CreateCustomEntityTypeRequest +CreateCustomEntityTypeResponse +CreateCustomKeyStoreRequest +CreateCustomKeyStoreResponse +CreateCustomLineItemInput +CreateCustomLineItemOutput +CreateCustomLogSourceRequest +CreateCustomLogSourceResponse +CreateCustomMetadataRequest +CreateCustomMetricRequest +CreateCustomMetricResponse +CreateCustomPluginRequest +CreateCustomPluginResponse +CreateCustomRoutingAcceleratorRequest +CreateCustomRoutingAcceleratorResponse +CreateCustomRoutingEndpointGroupRequest +CreateCustomRoutingEndpointGroupResponse +CreateCustomRoutingListenerRequest +CreateCustomRoutingListenerResponse +CreateCustomVerificationEmailTemplateRequest +CreateCustomerGatewayRequest +CreateCustomerGatewayResult +CreateDBClusterEndpointMessage +CreateDBClusterEndpointOutput +CreateDBClusterMessage +CreateDBClusterParameterGroupMessage +CreateDBClusterParameterGroupResult +CreateDBClusterResult +CreateDBClusterSnapshotMessage +CreateDBClusterSnapshotResult +CreateDBInstanceMessage +CreateDBInstanceReadReplicaMessage +CreateDBInstanceReadReplicaResult +CreateDBInstanceResult +CreateDBParameterGroupMessage +CreateDBParameterGroupResult +CreateDBProxyEndpointRequest +CreateDBProxyEndpointResponse +CreateDBProxyRequest +CreateDBProxyResponse +CreateDBSecurityGroupMessage +CreateDBSecurityGroupResult +CreateDBSnapshotMessage +CreateDBSnapshotResult +CreateDBSubnetGroupMessage +CreateDBSubnetGroupResult +CreateDashboardRequest +CreateDashboardResponse +CreateDataCatalogInput +CreateDataCellsFilterRequest +CreateDataIntegrationRequest +CreateDataIntegrationResponse +CreateDataLakeExceptionSubscriptionRequest +CreateDataLakeOrganizationConfigurationRequest +CreateDataLakeRequest +CreateDataLakeResponse +CreateDataProviderMessage +CreateDataProviderResponse +CreateDataQualityJobDefinitionRequest +CreateDataQualityJobDefinitionResponse +CreateDataQualityRulesetRequest +CreateDataQualityRulesetResponse +CreateDataRepositoryAssociationRequest +CreateDataRepositoryAssociationResponse +CreateDataRepositoryTaskRequest +CreateDataRepositoryTaskResponse +CreateDataSetImportTaskRequest +CreateDataSetImportTaskResponse +CreateDataSetRequest +CreateDataSetResponse +CreateDataSourceFromRDSInput +CreateDataSourceFromRDSOutput +CreateDataSourceFromRedshiftInput +CreateDataSourceFromRedshiftOutput +CreateDataSourceFromS3Input +CreateDataSourceFromS3Output +CreateDataSourceRequest +CreateDataSourceResponse +CreateDataViewRequest +CreateDataViewResponse +CreateDatabaseDefaultPermissions +CreateDatabaseRequest +CreateDatabaseResponse +CreateDataflowEndpointGroupRequest +CreateDatasetContentRequest +CreateDatasetContentResponse +CreateDatasetExportJobRequest +CreateDatasetExportJobResponse +CreateDatasetGroupRequest +CreateDatasetGroupResponse +CreateDatasetImportJobRequest +CreateDatasetImportJobResponse +CreateDatasetRequest +CreateDatasetResponse +CreateDatastoreRequest +CreateDatastoreResponse +CreateDate +CreateDecoderManifestRequest +CreateDecoderManifestResponse +CreateDedicatedIpPoolRequest +CreateDefaultSubnetRequest +CreateDefaultSubnetResult +CreateDefaultVpcRequest +CreateDefaultVpcResult +CreateDelegationRequest +CreateDeliverabilityTestReportRequest +CreateDeliverabilityTestReportResponse +CreateDeliveryStreamInput +CreateDeliveryStreamOutput +CreateDeploymentConfigInput +CreateDeploymentConfigOutput +CreateDeploymentGroupInput +CreateDeploymentGroupOutput +CreateDeploymentInput +CreateDeploymentJobRequest +CreateDeploymentJobResponse +CreateDeploymentOutput +CreateDeploymentRequest +CreateDeploymentResponse +CreateDeploymentResult +CreateDeploymentStrategyRequest +CreateDestinationRequest +CreateDestinationResponse +CreateDetectorModelRequest +CreateDetectorModelResponse +CreateDetectorRequest +CreateDetectorResponse +CreateDetectorVersionRequest +CreateDetectorVersionResult +CreateDevEndpointRequest +CreateDevEndpointResponse +CreateDevEnvironmentRequest +CreateDevEnvironmentResponse +CreateDeviceDefinitionRequest +CreateDeviceDefinitionResponse +CreateDeviceDefinitionVersionRequest +CreateDeviceDefinitionVersionResponse +CreateDeviceFleetRequest +CreateDevicePoolRequest +CreateDevicePoolResult +CreateDeviceProfileRequest +CreateDeviceProfileResponse +CreateDeviceRequest +CreateDeviceResponse +CreateDhcpOptionsRequest +CreateDhcpOptionsResult +CreateDimensionRequest +CreateDimensionResponse +CreateDirectConnectGatewayAssociationProposalRequest +CreateDirectConnectGatewayAssociationProposalResult +CreateDirectConnectGatewayAssociationRequest +CreateDirectConnectGatewayAssociationResult +CreateDirectConnectGatewayRequest +CreateDirectConnectGatewayResult +CreateDirectoryConfigRequest +CreateDirectoryConfigResult +CreateDirectoryRegistrationRequest +CreateDirectoryRegistrationResponse +CreateDirectoryRequest +CreateDirectoryResponse +CreateDirectoryResult +CreateDiscovererRequest +CreateDiscovererResponse +CreateDiskFromSnapshotRequest +CreateDiskFromSnapshotResult +CreateDiskRequest +CreateDiskResult +CreateDiskSnapshotRequest +CreateDiskSnapshotResult +CreateDistributionConfigurationRequest +CreateDistributionConfigurationResponse +CreateDistributionRequest +CreateDistributionResult +CreateDistributionWithTagsRequest +CreateDistributionWithTagsResult +CreateDocumentClassifierRequest +CreateDocumentClassifierResponse +CreateDocumentRequest +CreateDocumentResult +CreateDocumentationPartRequest +CreateDocumentationVersionRequest +CreateDomainAssociationRequest +CreateDomainAssociationResult +CreateDomainConfigurationRequest +CreateDomainConfigurationResponse +CreateDomainEntryRequest +CreateDomainEntryResult +CreateDomainNameRequest +CreateDomainNameResponse +CreateDomainRequest +CreateDomainResponse +CreateDomainResult +CreateDynamicThingGroupRequest +CreateDynamicThingGroupResponse +CreateEdgeDeploymentPlanRequest +CreateEdgeDeploymentPlanResponse +CreateEdgeDeploymentStageRequest +CreateEdgePackagingJobRequest +CreateEgressOnlyInternetGatewayRequest +CreateEgressOnlyInternetGatewayResult +CreateElasticsearchDomainRequest +CreateElasticsearchDomainResponse +CreateEmailIdentityPolicyRequest +CreateEmailIdentityRequest +CreateEmailIdentityResponse +CreateEmailTemplateRequest +CreateEmailTemplateResponse +CreateEndOfMeetingReminder +CreateEndpointAccessMessage +CreateEndpointAccessRequest +CreateEndpointAccessResponse +CreateEndpointConfigInput +CreateEndpointConfigOutput +CreateEndpointGroupRequest +CreateEndpointGroupResponse +CreateEndpointInput +CreateEndpointMessage +CreateEndpointOutput +CreateEndpointRequest +CreateEndpointResponse +CreateEndpointResult +CreateEntitlementRequest +CreateEntitlementResult +CreateEntityRecognizerRequest +CreateEntityRecognizerResponse +CreateEntityRequest +CreateEntityResponse +CreateEnvironmentAccountConnectionInput +CreateEnvironmentAccountConnectionOutput +CreateEnvironmentEC2Request +CreateEnvironmentEC2Result +CreateEnvironmentInput +CreateEnvironmentMembershipRequest +CreateEnvironmentMembershipResult +CreateEnvironmentMessage +CreateEnvironmentOutput +CreateEnvironmentRequest +CreateEnvironmentResponse +CreateEnvironmentTemplateInput +CreateEnvironmentTemplateOutput +CreateEnvironmentTemplateVersionInput +CreateEnvironmentTemplateVersionOutput +CreateEphemerisRequest +CreateEvaluationFormRequest +CreateEvaluationFormResponse +CreateEvaluationInput +CreateEvaluationOutput +CreateEventActionRequest +CreateEventActionResponse +CreateEventBusRequest +CreateEventBusResponse +CreateEventDataStoreRequest +CreateEventDataStoreResponse +CreateEventDestinationRequest +CreateEventDestinationResult +CreateEventIntegrationRequest +CreateEventIntegrationResponse +CreateEventSourceMappingRequest +CreateEventStreamRequest +CreateEventStreamResponse +CreateEventSubscriptionMessage +CreateEventSubscriptionResponse +CreateEventSubscriptionResult +CreateEventTrackerRequest +CreateEventTrackerResponse +CreateExclusionsPreviewRequest +CreateExclusionsPreviewResponse +CreateExperienceRequest +CreateExperienceResponse +CreateExperimentRequest +CreateExperimentResponse +CreateExperimentTemplateActionInput +CreateExperimentTemplateLogConfigurationInput +CreateExperimentTemplateRequest +CreateExperimentTemplateResponse +CreateExperimentTemplateStopConditionInput +CreateExperimentTemplateTargetInput +CreateExplainabilityExportRequest +CreateExplainabilityExportResponse +CreateExplainabilityRequest +CreateExplainabilityResponse +CreateExportJobRequest +CreateExportJobResponse +CreateExportRequest +CreateExportResponse +CreateExportTaskRequest +CreateExportTaskResponse +CreateExtendedSourceServerRequest +CreateExtendedSourceServerResponse +CreateExtensionAssociationRequest +CreateExtensionRequest +CreateFHIRDatastoreRequest +CreateFHIRDatastoreResponse +CreateFaceLivenessSessionRequest +CreateFaceLivenessSessionRequestSettings +CreateFaceLivenessSessionResponse +CreateFacetRequest +CreateFaqRequest +CreateFaqResponse +CreateFargateProfileRequest +CreateFargateProfileResponse +CreateFeatureGroupRequest +CreateFeatureGroupResponse +CreateFeatureRequest +CreateFeatureResponse +CreateFeaturedResultsSetRequest +CreateFeaturedResultsSetResponse +CreateFieldLevelEncryptionConfigRequest +CreateFieldLevelEncryptionConfigResult +CreateFieldLevelEncryptionProfileRequest +CreateFieldLevelEncryptionProfileResult +CreateFieldRequest +CreateFieldResponse +CreateFileCacheLustreConfiguration +CreateFileCacheRequest +CreateFileCacheResponse +CreateFileSystemFromBackupRequest +CreateFileSystemFromBackupResponse +CreateFileSystemLustreConfiguration +CreateFileSystemOntapConfiguration +CreateFileSystemOpenZFSConfiguration +CreateFileSystemRequest +CreateFileSystemResponse +CreateFileSystemWindowsConfiguration +CreateFilterRequest +CreateFilterResponse +CreateFindingAggregatorRequest +CreateFindingAggregatorResponse +CreateFindingsFilterRequest +CreateFindingsFilterResponse +CreateFindingsReportRequest +CreateFindingsReportResponse +CreateFirewallDomainListRequest +CreateFirewallDomainListResponse +CreateFirewallPolicyRequest +CreateFirewallPolicyResponse +CreateFirewallRequest +CreateFirewallResponse +CreateFirewallRuleGroupRequest +CreateFirewallRuleGroupResponse +CreateFirewallRuleRequest +CreateFirewallRuleResponse +CreateFleetAdvisorCollectorRequest +CreateFleetAdvisorCollectorResponse +CreateFleetError +CreateFleetInput +CreateFleetInstance +CreateFleetLocationsInput +CreateFleetLocationsOutput +CreateFleetMetricRequest +CreateFleetMetricResponse +CreateFleetOutput +CreateFleetRequest +CreateFleetResponse +CreateFleetResult +CreateFlow420Exception +CreateFlowDefinitionRequest +CreateFlowDefinitionResponse +CreateFlowLogsRequest +CreateFlowLogsResult +CreateFlowRequest +CreateFlowResponse +CreateFlowTemplateRequest +CreateFlowTemplateResponse +CreateFlywheelRequest +CreateFlywheelResponse +CreateFolderMembershipRequest +CreateFolderMembershipResponse +CreateFolderRequest +CreateFolderResponse +CreateForecastExportJobRequest +CreateForecastExportJobResponse +CreateForecastRequest +CreateForecastResponse +CreateFormData +CreateFormRequest +CreateFormResponse +CreateFpgaImageRequest +CreateFpgaImageResult +CreateFrameworkInput +CreateFrameworkOutput +CreateFreeTierConfig +CreateFunctionDefinitionRequest +CreateFunctionDefinitionResponse +CreateFunctionDefinitionVersionRequest +CreateFunctionDefinitionVersionResponse +CreateFunctionRequest +CreateFunctionResponse +CreateFunctionResult +CreateFunctionUrlConfigRequest +CreateFunctionUrlConfigResponse +CreateFuotaTaskRequest +CreateFuotaTaskResponse +CreateGUISessionAccessDetailsRequest +CreateGUISessionAccessDetailsResult +CreateGameRequest +CreateGameResult +CreateGameServerGroupInput +CreateGameServerGroupOutput +CreateGameSessionInput +CreateGameSessionOutput +CreateGameSessionQueueInput +CreateGameSessionQueueOutput +CreateGateway420Exception +CreateGatewayGroupRequest +CreateGatewayGroupResponse +CreateGatewayInput +CreateGatewayOutput +CreateGatewayRequest +CreateGatewayResponse +CreateGatewayRouteInput +CreateGatewayRouteOutput +CreateGeoMatchSetRequest +CreateGeoMatchSetResponse +CreateGeofenceCollectionRequest +CreateGeofenceCollectionResponse +CreateGlobalClusterMessage +CreateGlobalClusterResult +CreateGlobalNetworkRequest +CreateGlobalNetworkResponse +CreateGlobalReplicationGroupMessage +CreateGlobalReplicationGroupResult +CreateGlobalSecondaryIndexAction +CreateGlobalTableInput +CreateGlobalTableOutput +CreateGovCloudAccountRequest +CreateGovCloudAccountResponse +CreateGrantRequest +CreateGrantResponse +CreateGrantVersionRequest +CreateGrantVersionResponse +CreateGraphRequest +CreateGraphResponse +CreateGraphqlApiRequest +CreateGraphqlApiResponse +CreateGrokClassifierRequest +CreateGroupCertificateAuthorityRequest +CreateGroupCertificateAuthorityResponse +CreateGroupInput +CreateGroupMembershipRequest +CreateGroupMembershipResponse +CreateGroupOutput +CreateGroupRequest +CreateGroupResponse +CreateGroupResult +CreateGroupVersionRequest +CreateGroupVersionResponse +CreateHITRequest +CreateHITResponse +CreateHITTypeRequest +CreateHITTypeResponse +CreateHITWithHITTypeRequest +CreateHITWithHITTypeResponse +CreateHapgRequest +CreateHapgResponse +CreateHarvestJobRequest +CreateHarvestJobResponse +CreateHealthCheckRequest +CreateHealthCheckResponse +CreateHlsManifestConfiguration +CreateHomeRegionControlRequest +CreateHomeRegionControlResult +CreateHostInput +CreateHostOutput +CreateHostedConfigurationVersionRequest +CreateHostedZoneRequest +CreateHostedZoneResponse +CreateHoursOfOperationRequest +CreateHoursOfOperationResponse +CreateHsmClientCertificateMessage +CreateHsmClientCertificateResult +CreateHsmConfigurationMessage +CreateHsmConfigurationResult +CreateHsmRequest +CreateHsmResponse +CreateHttpNamespaceRequest +CreateHttpNamespaceResponse +CreateHubRequest +CreateHubResponse +CreateHumanTaskUiRequest +CreateHumanTaskUiResponse +CreateHyperParameterTuningJobRequest +CreateHyperParameterTuningJobResponse +CreateIAMPolicyAssignmentRequest +CreateIAMPolicyAssignmentResponse +CreateIPSetRequest +CreateIPSetResponse +CreateIdentityPoolInput +CreateIdentityProviderRequest +CreateIdentityProviderResponse +CreateIdentitySourceInput +CreateIdentitySourceOutput +CreateImageBuilderRequest +CreateImageBuilderResult +CreateImageBuilderStreamingURLRequest +CreateImageBuilderStreamingURLResult +CreateImagePipelineRequest +CreateImagePipelineResponse +CreateImageRecipeRequest +CreateImageRecipeResponse +CreateImageRequest +CreateImageResponse +CreateImageResult +CreateImageVersionRequest +CreateImageVersionResponse +CreateImpersonationRoleRequest +CreateImpersonationRoleResponse +CreateImportJobRequest +CreateImportJobResponse +CreateInAppTemplateRequest +CreateInAppTemplateResponse +CreateIndex +CreateIndexInput +CreateIndexOutput +CreateIndexRequest +CreateIndexResponse +CreateInferenceExperimentRequest +CreateInferenceExperimentResponse +CreateInferenceRecommendationsJobRequest +CreateInferenceRecommendationsJobResponse +CreateInferenceSchedulerRequest +CreateInferenceSchedulerResponse +CreateInfrastructureConfigurationRequest +CreateInfrastructureConfigurationResponse +CreateIngestionDestinationRequest +CreateIngestionDestinationResponse +CreateIngestionRequest +CreateIngestionResponse +CreateInputRequest +CreateInputResponse +CreateInputSecurityGroupRequest +CreateInputSecurityGroupResponse +CreateInsightRequest +CreateInsightResponse +CreateInstanceAccessControlAttributeConfigurationRequest +CreateInstanceConnectEndpointRequest +CreateInstanceConnectEndpointResult +CreateInstanceEventWindowRequest +CreateInstanceEventWindowResult +CreateInstanceExportTaskRequest +CreateInstanceExportTaskResult +CreateInstanceProfileMessage +CreateInstanceProfileRequest +CreateInstanceProfileResponse +CreateInstanceProfileResult +CreateInstanceRequest +CreateInstanceResponse +CreateInstanceResult +CreateInstanceSnapshotRequest +CreateInstanceSnapshotResult +CreateInstancesFromSnapshotRequest +CreateInstancesFromSnapshotResult +CreateInstancesRequest +CreateInstancesResult +CreateInstantBooking +CreateIntegrationAssociationRequest +CreateIntegrationAssociationResponse +CreateIntegrationRequest +CreateIntegrationResponseRequest +CreateIntegrationResponseResponse +CreateIntegrationResult +CreateIntegrationWorkflowRequest +CreateIntegrationWorkflowResponse +CreateIntentRequest +CreateIntentResponse +CreateIntentVersionRequest +CreateIntentVersionResponse +CreateInterconnectRequest +CreateInternetGatewayRequest +CreateInternetGatewayResult +CreateInvalidationRequest +CreateInvalidationResult +CreateInvitationsRequest +CreateInvitationsResponse +CreateIpAccessSettingsRequest +CreateIpAccessSettingsResponse +CreateIpGroupRequest +CreateIpGroupResult +CreateIpamPoolRequest +CreateIpamPoolResult +CreateIpamRequest +CreateIpamResourceDiscoveryRequest +CreateIpamResourceDiscoveryResult +CreateIpamResult +CreateIpamScopeRequest +CreateIpamScopeResult +CreateJobForDevicesRequest +CreateJobForDevicesResponse +CreateJobOutput +CreateJobPlaylist +CreateJobQueueRequest +CreateJobQueueResponse +CreateJobRequest +CreateJobResponse +CreateJobResult +CreateJobTemplateRequest +CreateJobTemplateResponse +CreateJourneyRequest +CreateJourneyResponse +CreateJsonClassifierRequest +CreateKeyGroupRequest +CreateKeyGroupResult +CreateKeyInput +CreateKeyOutput +CreateKeyPairRequest +CreateKeyPairResult +CreateKeyRequest +CreateKeyResponse +CreateKeySigningKeyRequest +CreateKeySigningKeyResponse +CreateKeysAndCertificateRequest +CreateKeysAndCertificateResponse +CreateKeyspaceRequest +CreateKeyspaceResponse +CreateKnowledgeBaseRequest +CreateKnowledgeBaseResponse +CreateKxChangesetRequest +CreateKxChangesetResponse +CreateKxClusterRequest +CreateKxClusterResponse +CreateKxDatabaseRequest +CreateKxDatabaseResponse +CreateKxEnvironmentRequest +CreateKxEnvironmentResponse +CreateKxUserRequest +CreateKxUserResponse +CreateLBCookieStickinessPolicyInput +CreateLFTagRequest +CreateLabelGroupRequest +CreateLabelGroupResponse +CreateLabelRequest +CreateLabelResponse +CreateLabelingJobRequest +CreateLabelingJobResponse +CreateLabelsRequest +CreateLagRequest +CreateLakeFormationOptInRequest +CreateLanguageModelRequest +CreateLanguageModelResponse +CreateLaunchConfigurationTemplateRequest +CreateLaunchConfigurationTemplateResponse +CreateLaunchConfigurationType +CreateLaunchProfileRequest +CreateLaunchProfileResponse +CreateLaunchRequest +CreateLaunchResponse +CreateLaunchTemplateRequest +CreateLaunchTemplateResult +CreateLaunchTemplateVersionRequest +CreateLaunchTemplateVersionResult +CreateLayerRequest +CreateLayerResult +CreateLayoutRequest +CreateLayoutResponse +CreateLedgerRequest +CreateLedgerResponse +CreateLegalHoldInput +CreateLegalHoldOutput +CreateLensShareInput +CreateLensShareOutput +CreateLensVersionInput +CreateLensVersionOutput +CreateLicenseConfigurationRequest +CreateLicenseConfigurationResponse +CreateLicenseConversionTaskForResourceRequest +CreateLicenseConversionTaskForResourceResponse +CreateLicenseManagerReportGeneratorRequest +CreateLicenseManagerReportGeneratorResponse +CreateLicenseRequest +CreateLicenseResponse +CreateLicenseVersionRequest +CreateLicenseVersionResponse +CreateLifecyclePolicyRequest +CreateLifecyclePolicyResponse +CreateLinkInput +CreateLinkOutput +CreateLinkRequest +CreateLinkResponse +CreateListRequest +CreateListenerInput +CreateListenerOutput +CreateListenerRequest +CreateListenerResponse +CreateLiveSourceRequest +CreateLiveSourceResponse +CreateLoadBalancerInput +CreateLoadBalancerListenerInput +CreateLoadBalancerOutput +CreateLoadBalancerPolicyInput +CreateLoadBalancerRequest +CreateLoadBalancerResult +CreateLoadBalancerTlsCertificateRequest +CreateLoadBalancerTlsCertificateResult +CreateLocalGatewayRouteRequest +CreateLocalGatewayRouteResult +CreateLocalGatewayRouteTableRequest +CreateLocalGatewayRouteTableResult +CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest +CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult +CreateLocalGatewayRouteTableVpcAssociationRequest +CreateLocalGatewayRouteTableVpcAssociationResult +CreateLocationAzureBlobRequest +CreateLocationAzureBlobResponse +CreateLocationEfsRequest +CreateLocationEfsResponse +CreateLocationFsxLustreRequest +CreateLocationFsxLustreResponse +CreateLocationFsxOntapRequest +CreateLocationFsxOntapResponse +CreateLocationFsxOpenZfsRequest +CreateLocationFsxOpenZfsResponse +CreateLocationFsxWindowsRequest +CreateLocationFsxWindowsResponse +CreateLocationHdfsRequest +CreateLocationHdfsResponse +CreateLocationInput +CreateLocationNfsRequest +CreateLocationNfsResponse +CreateLocationObjectStorageRequest +CreateLocationObjectStorageResponse +CreateLocationOutput +CreateLocationS3Request +CreateLocationS3Response +CreateLocationSmbRequest +CreateLocationSmbResponse +CreateLogGroupRequest +CreateLogPatternRequest +CreateLogPatternResponse +CreateLogStreamRequest +CreateLogSubscriptionRequest +CreateLoggerDefinitionRequest +CreateLoggerDefinitionResponse +CreateLoggerDefinitionVersionRequest +CreateLoggerDefinitionVersionResponse +CreateLoggingConfigurationRequest +CreateLoggingConfigurationResponse +CreateLogicallyAirGappedBackupVaultInput +CreateLogicallyAirGappedBackupVaultOutput +CreateLoginProfileRequest +CreateLoginProfileResponse +CreateLongTermPricingRequest +CreateLongTermPricingResult +CreateLowLatencyHlsManifestConfiguration +CreateLunaClientRequest +CreateLunaClientResponse +CreateMLEndpointInput +CreateMLEndpointOutput +CreateMLModelInput +CreateMLModelOutput +CreateMLTransformRequest +CreateMLTransformResponse +CreateMaintenanceWindowRequest +CreateMaintenanceWindowResult +CreateManagedEndpointRequest +CreateManagedEndpointResponse +CreateManagedPrefixListRequest +CreateManagedPrefixListResult +CreateMapRequest +CreateMapResponse +CreateMatchingWorkflowInput +CreateMatchingWorkflowOutput +CreateMatchmakingConfigurationInput +CreateMatchmakingConfigurationOutput +CreateMatchmakingRuleSetInput +CreateMatchmakingRuleSetOutput +CreateMediaCapturePipelineRequest +CreateMediaCapturePipelineResponse +CreateMediaConcatenationPipelineRequest +CreateMediaConcatenationPipelineResponse +CreateMediaInsightsPipelineConfigurationRequest +CreateMediaInsightsPipelineConfigurationResponse +CreateMediaInsightsPipelineRequest +CreateMediaInsightsPipelineResponse +CreateMediaLiveConnectorPipelineRequest +CreateMediaLiveConnectorPipelineResponse +CreateMediaPipelineKinesisVideoStreamPoolRequest +CreateMediaPipelineKinesisVideoStreamPoolResponse +CreateMediaStreamPipelineRequest +CreateMediaStreamPipelineResponse +CreateMedicalVocabularyRequest +CreateMedicalVocabularyResponse +CreateMeetingDialOutRequest +CreateMeetingDialOutResponse +CreateMeetingRequest +CreateMeetingResponse +CreateMeetingRoomConfiguration +CreateMeetingWithAttendeesRequest +CreateMeetingWithAttendeesResponse +CreateMemberInput +CreateMemberOutput +CreateMemberRequest +CreateMemberResponse +CreateMembersRequest +CreateMembersResponse +CreateMembershipInput +CreateMembershipOutput +CreateMeshInput +CreateMeshOutput +CreateMetricAttributionRequest +CreateMetricAttributionResponse +CreateMetricSetRequest +CreateMetricSetResponse +CreateMicrosoftADRequest +CreateMicrosoftADResult +CreateMigrationProjectMessage +CreateMigrationProjectResponse +CreateMigrationWorkflowRequest +CreateMigrationWorkflowResponse +CreateMilestoneInput +CreateMilestoneOutput +CreateMissionProfileRequest +CreateMitigationActionRequest +CreateMitigationActionResponse +CreateMobileDeviceAccessRuleRequest +CreateMobileDeviceAccessRuleResponse +CreateModelBiasJobDefinitionRequest +CreateModelBiasJobDefinitionResponse +CreateModelCardExportJobRequest +CreateModelCardExportJobResponse +CreateModelCardRequest +CreateModelCardResponse +CreateModelCustomizationJobRequest +CreateModelCustomizationJobResponse +CreateModelExplainabilityJobDefinitionRequest +CreateModelExplainabilityJobDefinitionResponse +CreateModelInput +CreateModelManifestRequest +CreateModelManifestResponse +CreateModelOutput +CreateModelPackageGroupInput +CreateModelPackageGroupOutput +CreateModelPackageInput +CreateModelPackageOutput +CreateModelQualityJobDefinitionRequest +CreateModelQualityJobDefinitionResponse +CreateModelRequest +CreateModelResponse +CreateModelVersionRequest +CreateModelVersionResult +CreateMonitorInput +CreateMonitorOutput +CreateMonitorRequest +CreateMonitorResponse +CreateMonitoringScheduleRequest +CreateMonitoringScheduleResponse +CreateMonitoringSubscriptionRequest +CreateMonitoringSubscriptionResult +CreateMountTargetRequest +CreateMultiRegionAccessPointInput +CreateMultiRegionAccessPointRequest +CreateMultiRegionAccessPointResult +CreateMulticastGroupRequest +CreateMulticastGroupResponse +CreateMultipartReadSetUploadRequest +CreateMultipartReadSetUploadResponse +CreateMultipartUploadOutput +CreateMultipartUploadRequest +CreateMultiplexProgramRequest +CreateMultiplexProgramResponse +CreateMultiplexRequest +CreateMultiplexResponse +CreateNFSFileShareInput +CreateNFSFileShareOutput +CreateNamedQueryInput +CreateNamedQueryOutput +CreateNamespaceRequest +CreateNamespaceResponse +CreateNatGatewayRequest +CreateNatGatewayResult +CreateNativeDeltaTable +CreateNetworkAclEntryRequest +CreateNetworkAclRequest +CreateNetworkAclResult +CreateNetworkAnalyzerConfigurationRequest +CreateNetworkAnalyzerConfigurationResponse +CreateNetworkInput +CreateNetworkInsightsAccessScopeRequest +CreateNetworkInsightsAccessScopeResult +CreateNetworkInsightsPathRequest +CreateNetworkInsightsPathResult +CreateNetworkInterfacePermissionRequest +CreateNetworkInterfacePermissionResult +CreateNetworkInterfaceRequest +CreateNetworkInterfaceResult +CreateNetworkOutput +CreateNetworkProfileRequest +CreateNetworkProfileResponse +CreateNetworkProfileResult +CreateNetworkRequest +CreateNetworkResponse +CreateNetworkSettingsRequest +CreateNetworkSettingsResponse +CreateNetworkSiteRequest +CreateNetworkSiteResponse +CreateNewVersion +CreateNodeFromTemplateJobRequest +CreateNodeFromTemplateJobResponse +CreateNodeInput +CreateNodeOutput +CreateNodegroupRequest +CreateNodegroupResponse +CreateNotebookInput +CreateNotebookInstanceInput +CreateNotebookInstanceLifecycleConfigInput +CreateNotebookInstanceLifecycleConfigOutput +CreateNotebookInstanceOutput +CreateNotebookOutput +CreateNotificationRequest +CreateNotificationRuleRequest +CreateNotificationRuleResult +CreateNotificationSubscriptionRequest +CreateNotificationSubscriptionResponse +CreateOTAUpdateRequest +CreateOTAUpdateResponse +CreateObject +CreateObjectRequest +CreateObjectResponse +CreateObservabilityConfigurationRequest +CreateObservabilityConfigurationResponse +CreateOntapVolumeConfiguration +CreateOpenIDConnectProviderRequest +CreateOpenIDConnectProviderResponse +CreateOpenZFSOriginSnapshotConfiguration +CreateOpenZFSVolumeConfiguration +CreateOpsItemRequest +CreateOpsItemResponse +CreateOpsMetadataRequest +CreateOpsMetadataResult +CreateOptOutListRequest +CreateOptOutListResult +CreateOptionGroupMessage +CreateOptionGroupResult +CreateOrUpdateTagsType +CreateOrderInput +CreateOrderOutput +CreateOrganizationRequest +CreateOrganizationResponse +CreateOrganizationalUnitRequest +CreateOrganizationalUnitResponse +CreateOriginAccessControlRequest +CreateOriginAccessControlResult +CreateOriginEndpointRequest +CreateOriginEndpointResponse +CreateOriginRequestPolicyRequest +CreateOriginRequestPolicyResult +CreateOutboundConnectionRequest +CreateOutboundConnectionResponse +CreateOutboundCrossClusterSearchConnectionRequest +CreateOutboundCrossClusterSearchConnectionResponse +CreateOutpostInput +CreateOutpostOutput +CreateOutpostResolverRequest +CreateOutpostResolverResponse +CreatePackageImportJobRequest +CreatePackageImportJobResponse +CreatePackageRequest +CreatePackageResponse +CreatePackageVersionRequest +CreatePackageVersionResponse +CreatePackagingConfigurationRequest +CreatePackagingConfigurationResponse +CreatePackagingGroupRequest +CreatePackagingGroupResponse +CreateParallelDataRequest +CreateParallelDataResponse +CreateParameterGroupRequest +CreateParameterGroupResponse +CreateParticipantConnectionRequest +CreateParticipantConnectionResponse +CreateParticipantRequest +CreateParticipantResponse +CreateParticipantTokenRequest +CreateParticipantTokenResponse +CreatePartitionIndexRequest +CreatePartitionRequest +CreatePartnerEventSourceRequest +CreatePartnerEventSourceResponse +CreatePartnerInputRequest +CreatePartnerInputResponse +CreatePatchBaselineRequest +CreatePatchBaselineResult +CreatePerformanceAnalysisReportRequest +CreatePerformanceAnalysisReportResponse +CreatePermissionGroupRequest +CreatePermissionGroupResponse +CreatePermissionRequest +CreatePermissionResponse +CreatePermissionSetRequest +CreatePermissionSetResponse +CreatePermissionVersionRequest +CreatePermissionVersionResponse +CreatePhoneNumberOrderRequest +CreatePhoneNumberOrderResponse +CreatePipeRequest +CreatePipeResponse +CreatePipelineInput +CreatePipelineOutput +CreatePipelineRequest +CreatePipelineResponse +CreatePlaceIndexRequest +CreatePlaceIndexResponse +CreatePlacementGroupRequest +CreatePlacementGroupResult +CreatePlacementRequest +CreatePlatformApplicationInput +CreatePlatformApplicationResponse +CreatePlatformEndpointInput +CreatePlatformVersionRequest +CreatePlatformVersionResult +CreatePlayerSessionInput +CreatePlayerSessionOutput +CreatePlayerSessionsInput +CreatePlayerSessionsOutput +CreatePolicyInput +CreatePolicyOutput +CreatePolicyRequest +CreatePolicyResponse +CreatePolicyStoreInput +CreatePolicyStoreOutput +CreatePolicyTemplateInput +CreatePolicyTemplateOutput +CreatePolicyVersionRequest +CreatePolicyVersionResponse +CreatePoolRequest +CreatePoolResult +CreatePortalRequest +CreatePortalResponse +CreatePortfolioInput +CreatePortfolioOutput +CreatePortfolioShareInput +CreatePortfolioShareOutput +CreatePredictorBacktestExportJobRequest +CreatePredictorBacktestExportJobResponse +CreatePredictorRequest +CreatePredictorResponse +CreatePrefetchScheduleRequest +CreatePrefetchScheduleResponse +CreatePreparedStatementInput +CreatePresetRequest +CreatePresetResponse +CreatePresignedDomainUrlRequest +CreatePresignedDomainUrlResponse +CreatePresignedNotebookInstanceUrlInput +CreatePresignedNotebookInstanceUrlOutput +CreatePresignedNotebookUrlRequest +CreatePresignedNotebookUrlResponse +CreatePricingPlanInput +CreatePricingPlanOutput +CreatePricingRuleInput +CreatePricingRuleOutput +CreatePrivateDnsNamespaceRequest +CreatePrivateDnsNamespaceResponse +CreatePrivateVirtualInterfaceRequest +CreateProactiveJoin +CreateProcessingJobRequest +CreateProcessingJobResponse +CreateProductInput +CreateProductOutput +CreateProfileInput +CreateProfileJobRequest +CreateProfileJobResponse +CreateProfileOutput +CreateProfileRequest +CreateProfileResponse +CreateProfileShareInput +CreateProfileShareOutput +CreateProfilingGroupRequest +CreateProfilingGroupResponse +CreateProgramRequest +CreateProgramResponse +CreateProgressUpdateStreamRequest +CreateProjectInput +CreateProjectOutput +CreateProjectRequest +CreateProjectResponse +CreateProjectResult +CreateProjectVersionRequest +CreateProjectVersionResponse +CreatePromptRequest +CreatePromptResponse +CreateProposalInput +CreateProposalOutput +CreateProtectionGroupRequest +CreateProtectionRequest +CreateProtectionResponse +CreateProvisionedModelThroughputRequest +CreateProvisionedModelThroughputResponse +CreateProvisionedProductPlanInput +CreateProvisionedProductPlanOutput +CreateProvisioningArtifactInput +CreateProvisioningArtifactOutput +CreateProvisioningClaimRequest +CreateProvisioningClaimResponse +CreateProvisioningTemplateRequest +CreateProvisioningTemplateResponse +CreateProvisioningTemplateVersionRequest +CreateProvisioningTemplateVersionResponse +CreateProxySessionRequest +CreateProxySessionResponse +CreatePublicDnsNamespaceRequest +CreatePublicDnsNamespaceResponse +CreatePublicIpv4PoolRequest +CreatePublicIpv4PoolResult +CreatePublicKeyRequest +CreatePublicKeyResult +CreatePublicVirtualInterfaceRequest +CreatePublishingDestinationRequest +CreatePublishingDestinationResponse +CreatePullRequestApprovalRuleInput +CreatePullRequestApprovalRuleOutput +CreatePullRequestInput +CreatePullRequestOutput +CreatePullThroughCacheRuleRequest +CreatePullThroughCacheRuleResponse +CreatePushTemplateRequest +CreatePushTemplateResponse +CreateQualificationTypeRequest +CreateQualificationTypeResponse +CreateQuantumTaskRequest +CreateQuantumTaskResponse +CreateQueryLoggingConfigRequest +CreateQueryLoggingConfigResponse +CreateQuerySuggestionsBlockListRequest +CreateQuerySuggestionsBlockListResponse +CreateQueueRequest +CreateQueueResponse +CreateQueueResult +CreateQuickConnectRequest +CreateQuickConnectResponse +CreateRateBasedRuleRequest +CreateRateBasedRuleResponse +CreateReadinessCheckRequest +CreateReadinessCheckResponse +CreateRealtimeEndpointInput +CreateRealtimeEndpointOutput +CreateRealtimeLogConfigRequest +CreateRealtimeLogConfigResult +CreateReceiptFilterRequest +CreateReceiptRuleRequest +CreateReceiptRuleSetRequest +CreateRecipeJobRequest +CreateRecipeJobResponse +CreateRecipeRequest +CreateRecipeResponse +CreateRecommendationTemplateRequest +CreateRecommendationTemplateResponse +CreateRecommenderConfiguration +CreateRecommenderConfigurationRequest +CreateRecommenderConfigurationResponse +CreateRecommenderConfigurationShape +CreateRecommenderRequest +CreateRecommenderResponse +CreateRecordingConfigurationRequest +CreateRecordingConfigurationResponse +CreateRecoveryGroupRequest +CreateRecoveryGroupResponse +CreateReferenceStoreRequest +CreateReferenceStoreResponse +CreateRefreshScheduleRequest +CreateRefreshScheduleResponse +CreateRegexMatchSetRequest +CreateRegexMatchSetResponse +CreateRegexPatternSetRequest +CreateRegexPatternSetResponse +CreateRegistryInput +CreateRegistryRequest +CreateRegistryResponse +CreateRelatedItemRequest +CreateRelatedItemResponse +CreateRelationalDatabaseFromSnapshotRequest +CreateRelationalDatabaseFromSnapshotResult +CreateRelationalDatabaseRequest +CreateRelationalDatabaseResult +CreateRelationalDatabaseSnapshotRequest +CreateRelationalDatabaseSnapshotResult +CreateRemoteAccessSessionConfiguration +CreateRemoteAccessSessionRequest +CreateRemoteAccessSessionResult +CreateReplaceRootVolumeTaskRequest +CreateReplaceRootVolumeTaskResult +CreateReplicaAction +CreateReplicationConfigMessage +CreateReplicationConfigResponse +CreateReplicationConfigurationRequest +CreateReplicationConfigurationTemplateRequest +CreateReplicationGroupMemberAction +CreateReplicationGroupMessage +CreateReplicationGroupResult +CreateReplicationInstanceMessage +CreateReplicationInstanceResponse +CreateReplicationJobRequest +CreateReplicationJobResponse +CreateReplicationSetInput +CreateReplicationSetOutput +CreateReplicationSubnetGroupMessage +CreateReplicationSubnetGroupResponse +CreateReplicationTaskMessage +CreateReplicationTaskResponse +CreateReportGroupInput +CreateReportGroupOutput +CreateReportPlanInput +CreateReportPlanOutput +CreateRepositoryInput +CreateRepositoryOutput +CreateRepositoryRequest +CreateRepositoryResponse +CreateRepositoryResult +CreateRequestValidatorRequest +CreateRequireCheckIn +CreateRescoreExecutionPlanRequest +CreateRescoreExecutionPlanResponse +CreateReservedInstancesListingRequest +CreateReservedInstancesListingResult +CreateResiliencyPolicyRequest +CreateResiliencyPolicyResponse +CreateResolverEndpointRequest +CreateResolverEndpointResponse +CreateResolverQueryLogConfigRequest +CreateResolverQueryLogConfigResponse +CreateResolverRequest +CreateResolverResponse +CreateResolverRuleRequest +CreateResolverRuleResponse +CreateResourceDataSyncRequest +CreateResourceDefinitionRequest +CreateResourceDefinitionResponse +CreateResourceDefinitionVersionRequest +CreateResourceDefinitionVersionResponse +CreateResourceGroupRequest +CreateResourceGroupResponse +CreateResourceInput +CreateResourceOutput +CreateResourcePolicyRequest +CreateResourcePolicyResponse +CreateResourcePolicyStatementRequest +CreateResourcePolicyStatementResponse +CreateResourceRequest +CreateResourceResponse +CreateResourceServerRequest +CreateResourceServerResponse +CreateResourceSetRequest +CreateResourceSetResponse +CreateResourceShareRequest +CreateResourceShareResponse +CreateResponseHeadersPolicyRequest +CreateResponseHeadersPolicyResult +CreateResponsePlanInput +CreateResponsePlanOutput +CreateRestApiRequest +CreateRestoreImageTaskRequest +CreateRestoreImageTaskResult +CreateRetrainingSchedulerRequest +CreateRetrainingSchedulerResponse +CreateReturnShippingLabelRequest +CreateReturnShippingLabelResult +CreateReusableDelegationSetRequest +CreateReusableDelegationSetResponse +CreateRevisionRequest +CreateRevisionResponse +CreateRobotApplicationRequest +CreateRobotApplicationResponse +CreateRobotApplicationVersionRequest +CreateRobotApplicationVersionResponse +CreateRobotRequest +CreateRobotResponse +CreateRoleAliasRequest +CreateRoleAliasResponse +CreateRoleRequest +CreateRoleResponse +CreateRoomMembershipRequest +CreateRoomMembershipResponse +CreateRoomRequest +CreateRoomResponse +CreateRotationOverrideRequest +CreateRotationOverrideResult +CreateRotationRequest +CreateRotationResult +CreateRouteCalculatorRequest +CreateRouteCalculatorResponse +CreateRouteInput +CreateRouteOutput +CreateRouteRequest +CreateRouteResponse +CreateRouteResponseRequest +CreateRouteResponseResponse +CreateRouteResult +CreateRouteTableRequest +CreateRouteTableResult +CreateRoutingControlRequest +CreateRoutingControlResponse +CreateRoutingProfileRequest +CreateRoutingProfileResponse +CreateRowData +CreateRule +CreateRuleGroupRequest +CreateRuleGroupResponse +CreateRuleGroupsNamespaceRequest +CreateRuleGroupsNamespaceResponse +CreateRuleInput +CreateRuleOutput +CreateRuleRequest +CreateRuleResponse +CreateRuleResult +CreateRulesetRequest +CreateRulesetResponse +CreateRunGroupRequest +CreateRunGroupResponse +CreateS3DataAccessFromS3Bucket +CreateS3DataAccessFromS3BucketRequestDetails +CreateS3DataAccessFromS3BucketResponseDetails +CreateSAMLProviderRequest +CreateSAMLProviderResponse +CreateSMBFileShareInput +CreateSMBFileShareOutput +CreateSMSSandboxPhoneNumberInput +CreateSafetyRuleRequest +CreateSafetyRuleResponse +CreateSampleFindingsRequest +CreateSamplingRuleRequest +CreateSamplingRuleResult +CreateSavingsPlanRequest +CreateSavingsPlanResponse +CreateSbomExportRequest +CreateSbomExportResponse +CreateScalingPlanRequest +CreateScalingPlanResponse +CreateScanRequest +CreateScanResponse +CreateSceneRequest +CreateSceneResponse +CreateScheduleGroupInput +CreateScheduleGroupOutput +CreateScheduleInput +CreateScheduleOutput +CreateScheduleRequest +CreateScheduleResponse +CreateScheduledActionMessage +CreateScheduledAuditRequest +CreateScheduledAuditResponse +CreateScheduledQueryRequest +CreateScheduledQueryResponse +CreateSchedulingPolicyRequest +CreateSchedulingPolicyResponse +CreateSchemaInput +CreateSchemaMappingInput +CreateSchemaMappingOutput +CreateSchemaRequest +CreateSchemaResponse +CreateScriptInput +CreateScriptOutput +CreateScriptRequest +CreateScriptResponse +CreateSecretRequest +CreateSecretResponse +CreateSecurityConfigRequest +CreateSecurityConfigResponse +CreateSecurityConfigurationInput +CreateSecurityConfigurationOutput +CreateSecurityConfigurationRequest +CreateSecurityConfigurationResponse +CreateSecurityGroupRequest +CreateSecurityGroupResult +CreateSecurityPolicyRequest +CreateSecurityPolicyResponse +CreateSecurityProfileRequest +CreateSecurityProfileResponse +CreateSegmentRequest +CreateSegmentResponse +CreateSequenceStoreRequest +CreateSequenceStoreResponse +CreateServerRequest +CreateServerResponse +CreateServiceActionInput +CreateServiceActionOutput +CreateServiceInput +CreateServiceInstanceInput +CreateServiceInstanceOutput +CreateServiceLinkedRoleRequest +CreateServiceLinkedRoleResponse +CreateServiceNetworkRequest +CreateServiceNetworkResponse +CreateServiceNetworkServiceAssociationRequest +CreateServiceNetworkServiceAssociationResponse +CreateServiceNetworkVpcAssociationRequest +CreateServiceNetworkVpcAssociationResponse +CreateServiceOutput +CreateServicePrincipalNameRequest +CreateServiceProfileRequest +CreateServiceProfileResponse +CreateServiceRequest +CreateServiceResponse +CreateServiceSpecificCredentialRequest +CreateServiceSpecificCredentialResponse +CreateServiceSyncConfigInput +CreateServiceSyncConfigOutput +CreateServiceTemplateInput +CreateServiceTemplateOutput +CreateServiceTemplateVersionInput +CreateServiceTemplateVersionOutput +CreateSessionRequest +CreateSessionResponse +CreateShareRequest +CreateShareResponse +CreateSignalCatalogRequest +CreateSignalCatalogResponse +CreateSignalingChannelInput +CreateSignalingChannelOutput +CreateSimulationApplicationRequest +CreateSimulationApplicationResponse +CreateSimulationApplicationVersionRequest +CreateSimulationApplicationVersionResponse +CreateSimulationJobRequest +CreateSimulationJobResponse +CreateSinkInput +CreateSinkOutput +CreateSipMediaApplicationCallRequest +CreateSipMediaApplicationCallResponse +CreateSipMediaApplicationRequest +CreateSipMediaApplicationResponse +CreateSipRuleRequest +CreateSipRuleResponse +CreateSiteInput +CreateSiteOutput +CreateSiteRequest +CreateSiteResponse +CreateSiteToSiteVpnAttachmentRequest +CreateSiteToSiteVpnAttachmentResponse +CreateSizeConstraintSetRequest +CreateSizeConstraintSetResponse +CreateSkillGroupRequest +CreateSkillGroupResponse +CreateSlackChannelConfigurationRequest +CreateSlotRequest +CreateSlotResponse +CreateSlotTypeRequest +CreateSlotTypeResponse +CreateSlotTypeVersionRequest +CreateSlotTypeVersionResponse +CreateSmsTemplateRequest +CreateSmsTemplateResponse +CreateSnaplockConfiguration +CreateSnapshotBeforeSchemaExtension +CreateSnapshotBeforeUpdate +CreateSnapshotCopyGrantMessage +CreateSnapshotCopyGrantResult +CreateSnapshotFromVolumeRecoveryPointInput +CreateSnapshotFromVolumeRecoveryPointOutput +CreateSnapshotInput +CreateSnapshotMessage +CreateSnapshotOutput +CreateSnapshotRequest +CreateSnapshotResponse +CreateSnapshotResult +CreateSnapshotScheduleMessage +CreateSnapshotsRequest +CreateSnapshotsResult +CreateSoftwareUpdateJobRequest +CreateSoftwareUpdateJobResponse +CreateSolFunctionPackageInput +CreateSolFunctionPackageOutput +CreateSolNetworkInstanceInput +CreateSolNetworkInstanceOutput +CreateSolNetworkPackageInput +CreateSolNetworkPackageOutput +CreateSolutionRequest +CreateSolutionResponse +CreateSolutionVersionRequest +CreateSolutionVersionResponse +CreateSourceLocationRequest +CreateSourceLocationResponse +CreateSourceNetworkRequest +CreateSourceNetworkResponse +CreateSourceRepositoryBranchRequest +CreateSourceRepositoryBranchResponse +CreateSourceRepositoryRequest +CreateSourceRepositoryResponse +CreateSpaceRequest +CreateSpaceResponse +CreateSpotDatafeedSubscriptionRequest +CreateSpotDatafeedSubscriptionResult +CreateSqlInjectionMatchSetRequest +CreateSqlInjectionMatchSetResponse +CreateStackInput +CreateStackInstancesInput +CreateStackInstancesOutput +CreateStackOutput +CreateStackRequest +CreateStackResult +CreateStackSetInput +CreateStackSetOutput +CreateStageRequest +CreateStageResponse +CreateStageResult +CreateStandbyWorkspacesRequest +CreateStandbyWorkspacesResult +CreateStateMachineAliasInput +CreateStateMachineAliasOutput +CreateStateMachineInput +CreateStateMachineOutput +CreateStorageLocationResultMessage +CreateStorageVirtualMachineRequest +CreateStorageVirtualMachineResponse +CreateStoreImageTaskRequest +CreateStoreImageTaskResult +CreateStorediSCSIVolumeInput +CreateStorediSCSIVolumeOutput +CreateStreamInput +CreateStreamKeyRequest +CreateStreamKeyResponse +CreateStreamOutput +CreateStreamProcessorRequest +CreateStreamProcessorResponse +CreateStreamRequest +CreateStreamResponse +CreateStreamingDistributionRequest +CreateStreamingDistributionResult +CreateStreamingDistributionWithTagsRequest +CreateStreamingDistributionWithTagsResult +CreateStreamingImageRequest +CreateStreamingImageResponse +CreateStreamingSessionRequest +CreateStreamingSessionResponse +CreateStreamingSessionStreamRequest +CreateStreamingSessionStreamResponse +CreateStreamingURLRequest +CreateStreamingURLResult +CreateStudioComponentRequest +CreateStudioComponentResponse +CreateStudioInput +CreateStudioLifecycleConfigRequest +CreateStudioLifecycleConfigResponse +CreateStudioOutput +CreateStudioRequest +CreateStudioResponse +CreateStudioSessionMappingInput +CreateSubnetCidrReservationRequest +CreateSubnetCidrReservationResult +CreateSubnetGroupRequest +CreateSubnetGroupResponse +CreateSubnetRequest +CreateSubnetResult +CreateSubscriberNotificationRequest +CreateSubscriberNotificationResponse +CreateSubscriberRequest +CreateSubscriberResponse +CreateSubscriptionDefinitionRequest +CreateSubscriptionDefinitionResponse +CreateSubscriptionDefinitionVersionRequest +CreateSubscriptionDefinitionVersionResponse +CreateSuiteDefinitionRequest +CreateSuiteDefinitionResponse +CreateSvmActiveDirectoryConfiguration +CreateSyncJobRequest +CreateSyncJobResponse +CreateSystemInstanceRequest +CreateSystemInstanceResponse +CreateSystemTemplateRequest +CreateSystemTemplateResponse +CreateTLSInspectionConfigurationRequest +CreateTLSInspectionConfigurationResponse +CreateTableDefaultPermissions +CreateTableInput +CreateTableOutput +CreateTableRequest +CreateTableResponse +CreateTagOptionInput +CreateTagOptionOutput +CreateTagsMessage +CreateTagsRequest +CreateTapePoolInput +CreateTapePoolOutput +CreateTapeWithBarcodeInput +CreateTapeWithBarcodeOutput +CreateTapesInput +CreateTapesOutput +CreateTargetGroupInput +CreateTargetGroupOutput +CreateTargetGroupRequest +CreateTargetGroupResponse +CreateTaskInput +CreateTaskOutput +CreateTaskRequest +CreateTaskResponse +CreateTaskSetRequest +CreateTaskSetResponse +CreateTaskTemplateRequest +CreateTaskTemplateResponse +CreateTemplateAliasRequest +CreateTemplateAliasResponse +CreateTemplateGroupAccessControlEntryRequest +CreateTemplateMessageBody +CreateTemplateRequest +CreateTemplateResponse +CreateTemplateSyncConfigInput +CreateTemplateSyncConfigOutput +CreateTestGridProjectRequest +CreateTestGridProjectResult +CreateTestGridUrlRequest +CreateTestGridUrlResult +CreateTestSetDiscrepancyReportRequest +CreateTestSetDiscrepancyReportResponse +CreateThemeAliasRequest +CreateThemeAliasResponse +CreateThemeData +CreateThemeRequest +CreateThemeResponse +CreateThesaurusRequest +CreateThesaurusResponse +CreateThingGroupRequest +CreateThingGroupResponse +CreateThingRequest +CreateThingResponse +CreateThingTypeRequest +CreateThingTypeResponse +CreateThreatIntelSetRequest +CreateThreatIntelSetResponse +CreateTieringInput +CreateTime +CreateTimelineEventInput +CreateTimelineEventOutput +CreateTimestamp +CreateTokenRequest +CreateTokenResponse +CreateTopicInput +CreateTopicRefreshScheduleRequest +CreateTopicRefreshScheduleResponse +CreateTopicRequest +CreateTopicResponse +CreateTopicRuleDestinationRequest +CreateTopicRuleDestinationResponse +CreateTopicRuleRequest +CreateTrackerRequest +CreateTrackerResponse +CreateTrafficDistributionGroupRequest +CreateTrafficDistributionGroupResponse +CreateTrafficMirrorFilterRequest +CreateTrafficMirrorFilterResult +CreateTrafficMirrorFilterRuleRequest +CreateTrafficMirrorFilterRuleResult +CreateTrafficMirrorSessionRequest +CreateTrafficMirrorSessionResult +CreateTrafficMirrorTargetRequest +CreateTrafficMirrorTargetResult +CreateTrafficPolicyInstanceRequest +CreateTrafficPolicyInstanceResponse +CreateTrafficPolicyRequest +CreateTrafficPolicyResponse +CreateTrafficPolicyVersionRequest +CreateTrafficPolicyVersionResponse +CreateTrailRequest +CreateTrailResponse +CreateTrainingJobRequest +CreateTrainingJobResponse +CreateTransformJobRequest +CreateTransformJobResponse +CreateTransitGatewayConnectPeerRequest +CreateTransitGatewayConnectPeerResult +CreateTransitGatewayConnectRequest +CreateTransitGatewayConnectRequestOptions +CreateTransitGatewayConnectResult +CreateTransitGatewayMulticastDomainRequest +CreateTransitGatewayMulticastDomainRequestOptions +CreateTransitGatewayMulticastDomainResult +CreateTransitGatewayPeeringAttachmentRequest +CreateTransitGatewayPeeringAttachmentRequestOptions +CreateTransitGatewayPeeringAttachmentResult +CreateTransitGatewayPeeringRequest +CreateTransitGatewayPeeringResponse +CreateTransitGatewayPolicyTableRequest +CreateTransitGatewayPolicyTableResult +CreateTransitGatewayPrefixListReferenceRequest +CreateTransitGatewayPrefixListReferenceResult +CreateTransitGatewayRequest +CreateTransitGatewayResult +CreateTransitGatewayRouteRequest +CreateTransitGatewayRouteResult +CreateTransitGatewayRouteTableAnnouncementRequest +CreateTransitGatewayRouteTableAnnouncementResult +CreateTransitGatewayRouteTableAttachmentRequest +CreateTransitGatewayRouteTableAttachmentResponse +CreateTransitGatewayRouteTableRequest +CreateTransitGatewayRouteTableResult +CreateTransitGatewayVpcAttachmentRequest +CreateTransitGatewayVpcAttachmentRequestOptions +CreateTransitGatewayVpcAttachmentResult +CreateTransitVirtualInterfaceRequest +CreateTransitVirtualInterfaceResult +CreateTrialComponentRequest +CreateTrialComponentResponse +CreateTrialRequest +CreateTrialResponse +CreateTriggerRequest +CreateTriggerResponse +CreateTrustAnchorRequest +CreateTrustRequest +CreateTrustResult +CreateTrustStoreRequest +CreateTrustStoreResponse +CreateTypeRequest +CreateTypeResponse +CreateTypedLinkFacetRequest +CreateUnreferencedMergeCommitInput +CreateUnreferencedMergeCommitOutput +CreateUpdatedImageRequest +CreateUpdatedImageResult +CreateUpdatedWorkspaceImageRequest +CreateUpdatedWorkspaceImageResult +CreateUploadRequest +CreateUploadResult +CreateUploadUrlRequest +CreateUploadUrlResponse +CreateUsageLimitMessage +CreateUsageLimitRequest +CreateUsageLimitResponse +CreateUsagePlanKeyRequest +CreateUsagePlanRequest +CreateUsageReportSubscriptionResult +CreateUseCaseRequest +CreateUseCaseResponse +CreateUserAccessLoggingSettingsRequest +CreateUserAccessLoggingSettingsResponse +CreateUserDefinedFunctionRequest +CreateUserGroupMessage +CreateUserHierarchyGroupRequest +CreateUserHierarchyGroupResponse +CreateUserImportJobRequest +CreateUserImportJobResponse +CreateUserMessage +CreateUserPoolClientRequest +CreateUserPoolClientResponse +CreateUserPoolDomainRequest +CreateUserPoolDomainResponse +CreateUserPoolRequest +CreateUserPoolResponse +CreateUserProfileRequest +CreateUserProfileResponse +CreateUserProfileResult +CreateUserRequest +CreateUserResponse +CreateUserSettingsRequest +CreateUserSettingsResponse +CreateVPCAssociationAuthorizationRequest +CreateVPCAssociationAuthorizationResponse +CreateVPCConnectionRequest +CreateVPCConnectionResponse +CreateVPCEConfigurationRequest +CreateVPCEConfigurationResult +CreateVariableRequest +CreateVariantStoreRequest +CreateVariantStoreResponse +CreateVaultInput +CreateVaultOutput +CreateVehicleError +CreateVehicleRequest +CreateVehicleRequestItem +CreateVehicleResponse +CreateVehicleResponseItem +CreateVerifiedAccessEndpointEniOptions +CreateVerifiedAccessEndpointLoadBalancerOptions +CreateVerifiedAccessEndpointRequest +CreateVerifiedAccessEndpointResult +CreateVerifiedAccessGroupRequest +CreateVerifiedAccessGroupResult +CreateVerifiedAccessInstanceRequest +CreateVerifiedAccessInstanceResult +CreateVerifiedAccessTrustProviderDeviceOptions +CreateVerifiedAccessTrustProviderOidcOptions +CreateVerifiedAccessTrustProviderRequest +CreateVerifiedAccessTrustProviderResult +CreateViewInput +CreateViewOutput +CreateViewRequest +CreateViewResponse +CreateViewVersionRequest +CreateViewVersionResponse +CreateVirtualClusterRequest +CreateVirtualClusterResponse +CreateVirtualGatewayInput +CreateVirtualGatewayOutput +CreateVirtualMFADeviceRequest +CreateVirtualMFADeviceResponse +CreateVirtualNodeInput +CreateVirtualNodeOutput +CreateVirtualRouterInput +CreateVirtualRouterOutput +CreateVirtualServiceInput +CreateVirtualServiceOutput +CreateVocabularyFilterRequest +CreateVocabularyFilterResponse +CreateVocabularyRequest +CreateVocabularyResponse +CreateVodSourceRequest +CreateVodSourceResponse +CreateVoiceConnectorGroupRequest +CreateVoiceConnectorGroupResponse +CreateVoiceConnectorRequest +CreateVoiceConnectorResponse +CreateVoiceProfileDomainRequest +CreateVoiceProfileDomainResponse +CreateVoiceProfileRequest +CreateVoiceProfileResponse +CreateVoiceTemplateRequest +CreateVoiceTemplateResponse +CreateVolumeFromBackupRequest +CreateVolumeFromBackupResponse +CreateVolumePermission +CreateVolumePermissionModifications +CreateVolumePermissions +CreateVolumeRequest +CreateVolumeResponse +CreateVpcAttachmentRequest +CreateVpcAttachmentResponse +CreateVpcConnectionRequest +CreateVpcConnectionResponse +CreateVpcConnectorRequest +CreateVpcConnectorResponse +CreateVpcEndpointConnectionNotificationRequest +CreateVpcEndpointConnectionNotificationResult +CreateVpcEndpointDetail +CreateVpcEndpointRequest +CreateVpcEndpointResponse +CreateVpcEndpointResult +CreateVpcEndpointServiceConfigurationRequest +CreateVpcEndpointServiceConfigurationResult +CreateVpcIngressConnectionRequest +CreateVpcIngressConnectionResponse +CreateVpcLinkRequest +CreateVpcLinkResponse +CreateVpcPeeringAuthorizationInput +CreateVpcPeeringAuthorizationOutput +CreateVpcPeeringConnectionInput +CreateVpcPeeringConnectionRequest +CreateVpcPeeringConnectionResult +CreateVpcRequest +CreateVpcResult +CreateVpnConnectionRequest +CreateVpnConnectionResult +CreateVpnConnectionRouteRequest +CreateVpnGatewayRequest +CreateVpnGatewayResult +CreateWatchlistRequest +CreateWatchlistResponse +CreateWaveRequest +CreateWebACLMigrationStackRequest +CreateWebACLMigrationStackResponse +CreateWebACLRequest +CreateWebACLResponse +CreateWebLoginTokenRequest +CreateWebLoginTokenResponse +CreateWebhookInput +CreateWebhookOutput +CreateWebhookRequest +CreateWebhookResult +CreateWhatIfAnalysisRequest +CreateWhatIfAnalysisResponse +CreateWhatIfForecastExportRequest +CreateWhatIfForecastExportResponse +CreateWhatIfForecastRequest +CreateWhatIfForecastResponse +CreateWirelessDeviceRequest +CreateWirelessDeviceResponse +CreateWirelessGatewayRequest +CreateWirelessGatewayResponse +CreateWirelessGatewayTaskDefinitionRequest +CreateWirelessGatewayTaskDefinitionResponse +CreateWirelessGatewayTaskRequest +CreateWirelessGatewayTaskResponse +CreateWorkGroupInput +CreateWorkerBlockRequest +CreateWorkerConfigurationRequest +CreateWorkerConfigurationResponse +CreateWorkerFleetRequest +CreateWorkerFleetResponse +CreateWorkerRequest +CreateWorkerResponse +CreateWorkflowRequest +CreateWorkflowResponse +CreateWorkflowStepGroupRequest +CreateWorkflowStepGroupResponse +CreateWorkflowStepRequest +CreateWorkflowStepResponse +CreateWorkforceRequest +CreateWorkforceResponse +CreateWorkgroupRequest +CreateWorkgroupResponse +CreateWorkloadInput +CreateWorkloadOutput +CreateWorkloadShareInput +CreateWorkloadShareOutput +CreateWorkspaceApiKeyRequest +CreateWorkspaceApiKeyResponse +CreateWorkspaceBundleRequest +CreateWorkspaceBundleResult +CreateWorkspaceImageRequest +CreateWorkspaceImageResult +CreateWorkspaceRequest +CreateWorkspaceResponse +CreateWorkspacesRequest +CreateWorkspacesResult +CreateWorkteamRequest +CreateWorkteamResponse +CreateWorldExportJobRequest +CreateWorldExportJobResponse +CreateWorldGenerationJobRequest +CreateWorldGenerationJobResponse +CreateWorldTemplateRequest +CreateWorldTemplateResponse +CreateXMLClassifierRequest +CreateXssMatchSetRequest +CreateXssMatchSetResponse +Created +CreatedAfter +CreatedArtifact +CreatedArtifactList +CreatedArtifactName +CreatedAt +CreatedAtEndTime +CreatedAtStartTime +CreatedBefore +CreatedButModifiedException +CreatedBy +CreatedByAccountId +CreatedByArn +CreatedByIamUser +CreatedByService +CreatedDate +CreatedDateTime +CreatedOn +CreatedRange +CreatedResourceArn +CreatedRulesetName +CreatedTime +CreatedTimeStamp +CreatedTimestamp +CreatedUsingAutoPredictor +Creates +CreationDate +CreationDateTime +CreationInfo +CreationLimitExceededException +CreationPath +CreationRequestDateTime +CreationStatus +CreationTime +CreationTimeAfter +CreationTimeBefore +CreationTimestamp +CreationToken +CreatorId +CreatorRequestId +Credential +CredentialPair +CredentialProvider +CredentialReportExpiredException +CredentialReportNotPresentException +CredentialReportNotReadyException +CredentialSummary +CredentialType +Credentials +CredentialsArn +CredentialsParameter +CredentialsSecretName +CredentialsToAddOrUpdate +CredentialsToRemove +CreditSpecification +CreditSpecificationRequest +Criteria +CriteriaBlockForJob +CriteriaForJob +Criterion +CriterionAdditionalProperties +CriterionKey +Critical +CriticalCount +CriticalNonCompliantCount +Criticality +CrlConfiguration +CrlDetail +CrlDetailResponse +CronExpression +CronExpressionForRecurrence +Crop +CrossAccount +CrossAccountAuthorization +CrossAccountAuthorizations +CrossAccountClone +CrossAccountFilterOption +CrossAccountModelRegisterRoleArn +CrossChannelBehavior +CrossClusterSearch +CrossClusterSearchConnection +CrossClusterSearchConnectionId +CrossClusterSearchConnectionProperties +CrossClusterSearchConnections +CrossDataset +CrossRealmTrustPrincipalPassword +CrossRegionCopy +CrossRegionCopyAction +CrossRegionCopyDeprecateRule +CrossRegionCopyRetainRule +CrossRegionCopyRule +CrossRegionCopyRules +CrossZoneLoadBalancing +CryptoProviders +CryptogramVerificationArpcMethod1 +CryptogramVerificationArpcMethod2 +Csid +CslgAtom +Csr +CsrExtensions +Csv +CsvClassifier +CsvConfiguration +CsvContentTypes +CsvDelimiter +CsvFormatDescriptor +CsvNoSupValue +CsvNullValue +CsvOptions +CsvOutputOptions +CsvReport +CsvRowDelimiter +CttsVersion +CumulativeBytesMetered +CumulativeBytesScanned +Currency +CurrencyCode +CurrencyDisplayFormatConfiguration +CurrencySymbol +Current +CurrentAction +CurrentActiveJob +CurrentActiveVersion +CurrentActiveVersionArn +CurrentApplicationVersionId +CurrentApplyDate +CurrentAverageCoverage +CurrentAverageHourlyOnDemandSpend +CurrentBackupRateInMegaBytesPerSecond +CurrentBrokerSoftwareInfo +CurrentCapacity +CurrentCoverage +CurrentDatabaseRevision +CurrentDefaultVersion +CurrentDeliveryStreamVersionId +CurrentExpiryYear +CurrentFirewallSubnetRouteTable +CurrentFleetState +CurrentGeneration +CurrentInferenceUnits +CurrentInstance +CurrentInstanceBootMode +CurrentInstanceCount +CurrentInstances +CurrentInternetGatewayRouteTable +CurrentIpamScopeId +CurrentLensVersion +CurrentLsn +CurrentMaximumHourlyOnDemandSpend +CurrentMetric +CurrentMetricData +CurrentMetricResult +CurrentMetricSortCriteria +CurrentMetrics +CurrentMinimumHourlyOnDemandSpend +CurrentNetworkingStatus +CurrentOnDemandSpend +CurrentOperationStatus +CurrentParallelism +CurrentPassword +CurrentPerformanceRiskRatings +CurrentPhase +CurrentPlayerSessionCount +CurrentPolicyDescription +CurrentProfileVersion +CurrentRateInMegaBytesPerSecond +CurrentRegionAvailability +CurrentRestoreRateInMegaBytesPerSecond +CurrentRevision +CurrentRole +CurrentRouteTable +CurrentSamplingPercentage +CurrentScore +CurrentServerlessConfig +CurrentShardCount +CurrentShardLevelMetrics +CurrentSigningKeyLength +CurrentSoftware +CurrentSpotFleetRequestState +CurrentState +CurrentStatus +CurrentStepName +CurrentTaskExecutionArn +CurrentVersion +CurrentWeight +CustSubscriptionId +CustomAction +CustomActionFilterOperation +CustomActionId +CustomActionNavigationOperation +CustomActionSetParametersOperation +CustomActionURLOperation +CustomActions +CustomAmi +CustomAmiId +CustomAmiList +CustomArtifactConfiguration +CustomArtifactConfigurationDescription +CustomArtifactsConfiguration +CustomArtifactsConfigurationDescription +CustomArtifactsConfigurationUpdate +CustomAttribute +CustomAttributes +CustomAuthConfig +CustomAuthCredentials +CustomAvailabilityZoneNotFoundFault +CustomCertificate +CustomCname +CustomCnameAssociationFault +CustomCode +CustomCodeSigning +CustomColor +CustomColors +CustomCondition +CustomConfig +CustomConnector +CustomConnectorDestinationProperties +CustomConnectorProfileCredentials +CustomConnectorProfileProperties +CustomConnectorSourceProperties +CustomContentConfiguration +CustomContentVisual +CustomCookbooksSource +CustomDBEngineVersionAMI +CustomDBEngineVersionAlreadyExistsFault +CustomDBEngineVersionManifest +CustomDBEngineVersionNotFoundFault +CustomDBEngineVersionQuotaExceededFault +CustomDNSServer +CustomDataIdentifierSummary +CustomDataIdentifiers +CustomDataIdentifiersDetections +CustomDataIdentifiersResult +CustomDatatypeConfigured +CustomDatatypes +CustomDeliveryConfiguration +CustomDetection +CustomDnsServers +CustomDocumentEnrichmentConfiguration +CustomDomain +CustomDomainAssociationNotFoundFault +CustomDomainAssociationsMessage +CustomDomainCertExpiryTime +CustomDomainCertificateArn +CustomDomainCertificateExpiryDate +CustomDomainConfig +CustomDomainConfigType +CustomDomainName +CustomDomains +CustomEmailLambdaVersionConfigType +CustomEmailSender +CustomEndpoint +CustomEndpointCertificateArn +CustomEndpointEnabled +CustomEndpointType +CustomEndpoints +CustomEntityType +CustomEntityTypes +CustomEntityTypesNotFound +CustomEpoch +CustomErrorResponse +CustomErrorResponses +CustomEventData +CustomEvents +CustomExtension +CustomExtensions +CustomFederationProviderUrl +CustomFilterConfiguration +CustomFilterListConfiguration +CustomHTTPHeader +CustomHeaders +CustomHeadersConfig +CustomHealthNotFound +CustomIamInstanceProfile +CustomIconContent +CustomImage +CustomImages +CustomIndices +CustomIndicesInput +CustomInstanceProfileArn +CustomJson +CustomKeyStoreHasCMKsException +CustomKeyStoreId +CustomKeyStoreInvalidStateException +CustomKeyStoreName +CustomKeyStoreNameInUseException +CustomKeyStoreNotFoundException +CustomKeyStoreType +CustomKeyStores +CustomKeyStoresListEntry +CustomKeys +CustomKnowledgeArticleTypeConfigurations +CustomLabel +CustomLabelConfiguration +CustomLabels +CustomLanguageCode +CustomLibraries +CustomLineItemBillingPeriodRange +CustomLineItemChargeDetails +CustomLineItemFlatChargeDetails +CustomLineItemListElement +CustomLineItemPercentageChargeDetails +CustomLineItemVersionListElement +CustomLineItemVersions +CustomLineItems +CustomLogSourceAttributes +CustomLogSourceConfiguration +CustomLogSourceCrawlerConfiguration +CustomLogSourceProvider +CustomLogSourceResource +CustomMessage +CustomMessageActivity +CustomMetadata +CustomMetadataLimitExceededException +CustomModelSummary +CustomModelTrainingParameters +CustomModelTransformParameters +CustomName +CustomNarrative +CustomNarrativeOptions +CustomObjectIdentifier +CustomOriginConfig +CustomParameterValues +CustomPatterns +CustomPayload +CustomPermissionsName +CustomPlatformQuota +CustomPlugin +CustomPluginDescription +CustomPluginFileDescription +CustomPluginLocation +CustomPluginLocationDescription +CustomPluginRevisionSummary +CustomPluginSummary +CustomPolicyDetails +CustomPrivateKey +CustomRecipes +CustomRedirectDomain +CustomRequestHandling +CustomResponse +CustomResponseBodies +CustomResponseBody +CustomResponseBodyKey +CustomRoleArn +CustomRoutingAccelerator +CustomRoutingAcceleratorAttributes +CustomRoutingDestinationConfiguration +CustomRoutingDestinationDescription +CustomRoutingEndpointConfiguration +CustomRoutingEndpointDescription +CustomRoutingEndpointGroup +CustomRoutingListener +CustomRule +CustomSMSLambdaVersionConfigType +CustomSMSSender +CustomSchemaCountLimitExceededException +CustomSeasonalityValue +CustomSecurityGroupId +CustomSecurityGroupIds +CustomSql +CustomStepDetails +CustomSuffix +CustomTextContent +CustomUserData +CustomValue +CustomValues +CustomValuesConfiguration +CustomVerificationEmailInvalidContentException +CustomVerificationEmailTemplate +CustomVerificationEmailTemplateAlreadyExistsException +CustomVerificationEmailTemplateDoesNotExistException +CustomVerificationEmailTemplateMetadata +CustomVerificationEmailTemplateName +CustomVerificationEmailTemplates +CustomVocabularyEntryId +CustomVocabularyExportSpecification +CustomVocabularyImportSpecification +CustomVocabularyItem +CustomerAWSAccountId +CustomerAction +CustomerAgentInfo +CustomerAgentlessCollectorInfo +CustomerAgreement +CustomerArtifactPaths +CustomerAvailabilityZone +CustomerAwsId +CustomerConnectorInfo +CustomerContentEncryptionConfiguration +CustomerDnsIps +CustomerGateway +CustomerGatewayArn +CustomerGatewayArns +CustomerGatewayAssociation +CustomerGatewayAssociations +CustomerGatewayConfiguration +CustomerGatewayId +CustomerGatewayIds +CustomerGateways +CustomerIdentifier +CustomerManagedChannelS3Storage +CustomerManagedChannelS3StorageSummary +CustomerManagedDatastoreS3Storage +CustomerManagedDatastoreS3StorageSummary +CustomerManagedKeyEnabled +CustomerManagedPolicyReference +CustomerManagedPolicyReferences +CustomerManagedS3Storage +CustomerMasterKeySpec +CustomerMeCollectorInfo +CustomerMetadataProperties +CustomerMetadataPropertiesToRemove +CustomerNodeEndpoint +CustomerNodeEndpointList +CustomerNotEntitledException +CustomerOutpostArn +CustomerOverride +CustomerOverrideValidTill +CustomerOwnedIp +CustomerOwnedIpEnabled +CustomerOwnedIpv4Pool +CustomerProfiles +CustomerProfilesDestinationProperties +CustomerResultObject +CustomerSpeakerId +CustomerStorageMessage +CustomerUserName +CustomizedCapacityMetricSpecification +CustomizedLoadMetricSpecification +CustomizedMetricSpecification +CustomizedScalingMetricSpecification +Cutoff +CutoffBehavior +Cvss +Cvss2 +Cvss3 +CvssScore +CvssScoreAdjustment +CvssScoreDetails +CwLog +CwLogEnabled +CwLogGroup +Cwes +DASHFragmentSelector +DASHStreamingSessionURL +DASHTimestampRange +DBCluster +DBClusterAlreadyExistsFault +DBClusterArn +DBClusterAutomatedBackup +DBClusterAutomatedBackupMessage +DBClusterAutomatedBackupNotFoundFault +DBClusterAutomatedBackupQuotaExceededFault +DBClusterAutomatedBackups +DBClusterAutomatedBackupsArn +DBClusterBacktrack +DBClusterBacktrackMessage +DBClusterBacktrackNotFoundFault +DBClusterBacktracks +DBClusterCapacityInfo +DBClusterEndpoint +DBClusterEndpointAlreadyExistsFault +DBClusterEndpointArn +DBClusterEndpointIdentifier +DBClusterEndpointMessage +DBClusterEndpointNotFoundFault +DBClusterEndpointQuotaExceededFault +DBClusterEndpointResourceIdentifier +DBClusterEndpoints +DBClusterIdentifier +DBClusterIdentifiers +DBClusterInstanceClass +DBClusterMember +DBClusterMembers +DBClusterMessage +DBClusterNotFoundFault +DBClusterOptionGroupMemberships +DBClusterOptionGroupName +DBClusterOptionGroupStatus +DBClusterParameterGroup +DBClusterParameterGroupArn +DBClusterParameterGroupDetails +DBClusterParameterGroupName +DBClusterParameterGroupNameMessage +DBClusterParameterGroupNotFoundFault +DBClusterParameterGroupStatus +DBClusterParameterGroups +DBClusterParameterGroupsMessage +DBClusterQuotaExceededFault +DBClusterRole +DBClusterRoleAlreadyExistsFault +DBClusterRoleNotFoundFault +DBClusterRoleQuotaExceededFault +DBClusterSnapshot +DBClusterSnapshotAlreadyExistsFault +DBClusterSnapshotArn +DBClusterSnapshotAttribute +DBClusterSnapshotAttributes +DBClusterSnapshotAttributesResult +DBClusterSnapshotIdentifier +DBClusterSnapshotMessage +DBClusterSnapshotNotFoundFault +DBClusterSnapshots +DBClusters +DBEngineDescription +DBEngineMediaType +DBEngineVersion +DBEngineVersionArn +DBEngineVersionDescription +DBEngineVersionMessage +DBEngineVersions +DBInstance +DBInstanceAlreadyExistsFault +DBInstanceArn +DBInstanceAutomatedBackup +DBInstanceAutomatedBackupMessage +DBInstanceAutomatedBackupNotFoundFault +DBInstanceAutomatedBackupQuotaExceededFault +DBInstanceAutomatedBackups +DBInstanceAutomatedBackupsArn +DBInstanceAutomatedBackupsReplication +DBInstanceAutomatedBackupsReplications +DBInstanceClass +DBInstanceCount +DBInstanceIdentifier +DBInstanceIdentifiers +DBInstanceMessage +DBInstanceNotFoundFault +DBInstanceParameterGroupName +DBInstanceRole +DBInstanceRoleAlreadyExistsFault +DBInstanceRoleNotFoundFault +DBInstanceRoleQuotaExceededFault +DBInstanceStatus +DBInstanceStatusInfo +DBInstances +DBLogFileNotFoundFault +DBName +DBParameterGroup +DBParameterGroupAlreadyExistsFault +DBParameterGroupArn +DBParameterGroupDetails +DBParameterGroupFamily +DBParameterGroupName +DBParameterGroupNameMessage +DBParameterGroupNotFoundFault +DBParameterGroupQuotaExceededFault +DBParameterGroupStatus +DBParameterGroups +DBParameterGroupsMessage +DBPortNumber +DBProxies +DBProxy +DBProxyAlreadyExistsFault +DBProxyArn +DBProxyEndpoint +DBProxyEndpointAlreadyExistsFault +DBProxyEndpointArn +DBProxyEndpointName +DBProxyEndpointNotFoundFault +DBProxyEndpointQuotaExceededFault +DBProxyEndpoints +DBProxyName +DBProxyNotFoundFault +DBProxyQuotaExceededFault +DBProxyTarget +DBProxyTargetAlreadyRegisteredFault +DBProxyTargetGroup +DBProxyTargetGroupNotFoundFault +DBProxyTargetNotFoundFault +DBProxyTargets +DBSecurityGroup +DBSecurityGroupAlreadyExistsFault +DBSecurityGroupArn +DBSecurityGroupDescription +DBSecurityGroupMembership +DBSecurityGroupMemberships +DBSecurityGroupMessage +DBSecurityGroupName +DBSecurityGroupNotFoundFault +DBSecurityGroupNotSupportedFault +DBSecurityGroupQuotaExceededFault +DBSecurityGroups +DBSnapshot +DBSnapshotAlreadyExistsFault +DBSnapshotArn +DBSnapshotAttribute +DBSnapshotAttributes +DBSnapshotAttributesResult +DBSnapshotIdentifier +DBSnapshotMessage +DBSnapshotNotFoundFault +DBSnapshots +DBSubnetGroup +DBSubnetGroupAlreadyExistsFault +DBSubnetGroupArn +DBSubnetGroupDescription +DBSubnetGroupDoesNotCoverEnoughAZs +DBSubnetGroupMessage +DBSubnetGroupName +DBSubnetGroupNotAllowedFault +DBSubnetGroupNotFoundFault +DBSubnetGroupQuotaExceededFault +DBSubnetGroups +DBSubnetQuotaExceededFault +DBSystemId +DBUpgradeDependencyFailureFault +DESIRED +DICOMAccessionNumber +DICOMImportJobProperties +DICOMImportJobSummary +DICOMNumberOfStudyRelatedInstances +DICOMNumberOfStudyRelatedSeries +DICOMPatientBirthDate +DICOMPatientId +DICOMPatientName +DICOMPatientSex +DICOMStudyDate +DICOMStudyDateAndTime +DICOMStudyDescription +DICOMStudyId +DICOMStudyInstanceUID +DICOMStudyTime +DICOMTags +DICOMUpdates +DNIS +DNISEmergencyCallingConfiguration +DNSKEYRecord +DNSLogs +DNSLogsConfigurationResult +DNSName +DNSSECNotFound +DNSSECStatus +DNSTarget +DNSTargetResource +DPDTimeoutAction +DPDTimeoutSeconds +DPUHour +DPUSeconds +DQResultsPublishingOptions +DQStopJobOnFailureOptions +DSRecord +DTMFInputEvent +DTMFSpecification +DagEdges +DagNodes +DagProcessingLogs +DagS3Path +Daily +DailyAutomaticBackupStartTime +DailyCap +DailyCommitmentToPurchase +DailySettings +DailyVolume +DailyVolumes +DakCertificateMetadata +Danger +DangerForeground +DashAdditionalManifest +DashConfiguration +DashConfigurationForPut +DashEncryption +DashIsoEncryptionSettings +DashIsoGroupSettings +DashIsoImageBasedTrickPlaySettings +DashManifest +DashManifestStyle +DashManifests +DashPackage +DashPlaylistSettings +DashSignaledSystemIds +Dashboard +DashboardArn +DashboardAttributes +DashboardBody +DashboardEnabled +DashboardEntries +DashboardEntry +DashboardError +DashboardId +DashboardInvalidInputError +DashboardName +DashboardNamePrefix +DashboardNames +DashboardNotFoundError +DashboardOptions +DashboardPublishOptions +DashboardSearchFilter +DashboardSourceEntity +DashboardSourceTemplate +DashboardSummary +DashboardSummaryList +DashboardValidationMessage +DashboardValidationMessages +DashboardVersion +DashboardVersionDefinition +DashboardVersionSummary +DashboardVersionSummaryList +DashboardVisual +DashboardVisualId +DashboardVisualPublishOptions +Dashboards +Data +DataAccessRoleArn +DataAggregation +DataAlreadyAcceptedException +DataAlreadyExistsException +DataAnalysisEndTime +DataAnalysisStartTime +DataAttributes +DataBars +DataBarsOptions +DataCaptureConfig +DataCaptureConfigSummary +DataCapturedDestinationS3Uri +DataCatalog +DataCatalogConfig +DataCatalogEncryptionSettings +DataCatalogInputDefinition +DataCatalogOutput +DataCatalogOutputs +DataCatalogSummary +DataCatalogsSummary +DataCellsFilter +DataCellsFilterResource +DataCellsFilters +DataChannel +DataChannelConcatenationConfiguration +DataClassification +DataClassificationDetails +DataCollectionDetails +DataColor +DataColorPalette +DataCompressionType +DataConfig +DataConfiguration +DataConnector +DataDelayOffsetInMinutes +DataDestination +DataDistributionType +DataDriven +DataEncipherment +DataEncryptionException +DataEncryptionKeyId +DataEncryptionMetadata +DataEndTime +DataEndTimeBefore +DataEndpoint +DataExists +DataExplorationNotebookLocation +DataExport +DataFieldSeriesItem +DataFormat +DataFormatConversionConfiguration +DataFrequency +DataId +DataIngestionJobSummaries +DataIngestionJobSummary +DataInputConfig +DataInputConfiguration +DataIntegrationArn +DataIntegrationAssociationArn +DataIntegrationAssociationSummary +DataIntegrationAssociations +DataIntegrationIdentifier +DataIntegrationSummary +DataIntegrations +DataItem +DataItems +DataLabelOptions +DataLabelType +DataLabelTypes +DataLabels +DataLakeAdmins +DataLakeAutoEnableNewAccountConfiguration +DataLakeConfiguration +DataLakeEncryptionConfiguration +DataLakeException +DataLakeKmsKeyId +DataLakeLifecycleConfiguration +DataLakeLifecycleExpiration +DataLakeLifecycleTransition +DataLakePrincipal +DataLakePrincipalIdentifier +DataLakeReplicationConfiguration +DataLakeResource +DataLakeS3Uri +DataLakeSettings +DataLakeSource +DataLakeSourceStatus +DataLakeUpdateException +DataLakeUpdateStatus +DataLength +DataLocation +DataLocationResource +DataLocationS3 +DataManifestLocation +DataModel +DataModelConfiguration +DataModelS3Configuration +DataNodeCount +DataOptions +DataOutputConfiguration +DataPTSControl +DataPageSize +DataPath +DataPathColor +DataPathLabelType +DataPathList +DataPathOptions +DataPathSort +DataPathValue +DataPipelineId +DataPoint +DataPointDrillUpDownOption +DataPointMenuLabelOption +DataPointTooltipOption +DataPoints +DataPolicyCount +DataPreProcessingConfiguration +DataPreviewOptions +DataPrivacy +DataProcessing +DataProtectionPolicy +DataProvider +DataProviderArn +DataProviderCreationTime +DataProviderDescriptor +DataProviderDescriptorDefinition +DataProviderIdentifier +DataProviderName +DataProviders +DataPullMode +DataQualityAppSpecification +DataQualityBaselineConfig +DataQualityEvaluationRunAdditionalRunOptions +DataQualityJobInput +DataQualityJobOutputConfig +DataQualityMetric +DataQualityMetricList +DataQualityResult +DataQualityResultDescription +DataQualityResultFilterCriteria +DataQualityRuleRecommendationRunDescription +DataQualityRuleRecommendationRunFilter +DataQualityRuleResult +DataQualityRulesetEvaluationRunDescription +DataQualityRulesetEvaluationRunFilter +DataQualityRulesetFilterCriteria +DataQualityRulesetListDetails +DataQualitySummary +DataQualityTargetTable +DataQueries +DataQuery +DataRate +DataRearrangement +DataReplicationCounterpart +DataReplicationError +DataReplicationInfo +DataReplicationInfoReplicatedDisk +DataReplicationInitiation +DataReplicationInitiationStep +DataReplicationMetadata +DataReplicationMetadataOutput +DataReplicationMode +DataReplicationPrimaryBrokerArn +DataReplicationRole +DataRepositoryAssociation +DataRepositoryAssociationIds +DataRepositoryAssociationNotFound +DataRepositoryAssociations +DataRepositoryConfiguration +DataRepositoryFailureDetails +DataRepositoryPath +DataRepositorySubdirectories +DataRepositoryTask +DataRepositoryTaskEnded +DataRepositoryTaskExecuting +DataRepositoryTaskFailureDetails +DataRepositoryTaskFilter +DataRepositoryTaskNotFound +DataRepositoryTaskStatus +DataRepositoryTasks +DataResource +DataResources +DataResponse +DataResponses +DataRetentionChangeInHours +DataRetentionInHours +DataRetentionOptIn +DataRetentionSupport +DataRetrievalPolicy +DataRetrievalRule +DataScannedBytes +DataScannedInBytes +DataSchema +DataSchemaLocationS3 +DataSchemaUri +DataSecurityConfig +DataSet +DataSetArn +DataSetArns +DataSetConfiguration +DataSetConfigurations +DataSetEntry +DataSetId +DataSetIdentifier +DataSetIdentifierDeclaration +DataSetIdentifierDeclarations +DataSetImportItem +DataSetImportSummary +DataSetImportTask +DataSetName +DataSetParameterName +DataSetPlaceholder +DataSetReference +DataSetReferences +DataSetRefreshProperties +DataSetSchema +DataSetSearchFilter +DataSetSummaries +DataSetSummary +DataSetUsageConfiguration +DataSets +DataShare +DataShareArn +DataShareAssociation +DataShareAssociations +DataShares +DataSharingPreference +DataSharingPreferenceForUpdate +DataSize +DataSizeInBytes +DataSnapshotTime +DataSource +DataSourceArn +DataSourceConfig +DataSourceConfiguration +DataSourceConfigurations +DataSourceConfigurationsResult +DataSourceCredentials +DataSourceErrorCode +DataSourceErrorInfo +DataSourceFieldName +DataSourceFreeTrial +DataSourceGroup +DataSourceGroups +DataSourceId +DataSourceIds +DataSourceName +DataSourceParameters +DataSourceS3Configuration +DataSourceSchema +DataSourceSearchFilter +DataSourceSummaries +DataSourceSummary +DataSourceSyncJob +DataSourceSyncJobId +DataSourceSyncJobMetricTarget +DataSourceSyncJobMetrics +DataSourceToIndexFieldMapping +DataSourceVpcConfiguration +DataSources +DataSourcesFreeTrial +DataSpec +DataSplitConfig +DataStartTime +DataStartTimeAfter +DataStorage +DataStorageConfig +DataTableColumns +DataTableName +DataTiering +DataTieringEnabled +DataTraceEnabled +DataTransfer +DataTransferApi +DataTransferProgress +DataTransferProgressPercent +DataTransferProtection +DataTransferSubscriberFeePercent +DataTransferredInMegaBytes +DataTransforms +DataType +DataTypeMapping +DataUnavailableException +DataUploadFrequency +DataValidationMetrics +DataValue +DataViewDestinationTypeParams +DataViewErrorInfo +DataViewSummary +DataVolumeKMSKeyId +DataWrites +Database +DatabaseARN +DatabaseARNUpdate +DatabaseArn +DatabaseConfigDetail +DatabaseConfiguration +DatabaseConnectionException +DatabaseCredentials +DatabaseEdition +DatabaseEngine +DatabaseEngineType +DatabaseHost +DatabaseId +DatabaseIdentifier +DatabaseIds +DatabaseInformation +DatabaseInput +DatabaseInputDefinition +DatabaseInstallationFilesS3BucketName +DatabaseInstallationFilesS3Prefix +DatabaseInstance +DatabaseInstanceSoftwareDetailsResponse +DatabaseIpAddress +DatabaseLFTagPolicy +DatabaseLFTagPolicyAndPermissions +DatabaseList +DatabaseMode +DatabaseName +DatabaseOptions +DatabaseOutput +DatabaseOutputMode +DatabaseOutputs +DatabasePort +DatabasePreferences +DatabaseResource +DatabaseResponse +DatabaseRevision +DatabaseRevisionReleaseDate +DatabaseShortInfoResponse +DatabaseSummary +DatabaseTableName +DatabaseTableOutputOptions +DatabaseType +DatabaseUserName +DatabaseVersion +Databases +DatabricksParameters +Datadog +DatadogConnectorProfileCredentials +DatadogConnectorProfileProperties +DatadogSourceProperties +DataflowDetail +DataflowEndpoint +DataflowEndpointConfig +DataflowEndpointGroupIdResponse +DataflowEndpointListItem +Datapoint +Datapoints +DatapointsToAlarm +DatapointsToAlert +Dataset +DatasetAction +DatasetActionSummary +DatasetArn +DatasetArns +DatasetAugmentedManifestsListItem +DatasetChanges +DatasetContentDeliveryDestination +DatasetContentDeliveryRule +DatasetContentStatus +DatasetContentSummary +DatasetContentVersionValue +DatasetCount +DatasetDefinition +DatasetDeletedAfterRequestedSyncCount +DatasetDescription +DatasetDocumentClassifierInputDataConfig +DatasetEntityRecognizerAnnotations +DatasetEntityRecognizerDocuments +DatasetEntityRecognizerEntityList +DatasetEntityRecognizerInputDataConfig +DatasetEntries +DatasetEntry +DatasetExists +DatasetExportJob +DatasetExportJobOutput +DatasetExportJobSummary +DatasetFilter +DatasetFormat +DatasetGroundTruthManifest +DatasetGroup +DatasetGroupArn +DatasetGroupName +DatasetGroupSummary +DatasetGroups +DatasetId +DatasetImageStats +DatasetImportJob +DatasetImportJobArn +DatasetImportJobArns +DatasetImportJobName +DatasetImportJobSummary +DatasetImportJobs +DatasetInputDataConfig +DatasetLabelDescription +DatasetLabelDescriptions +DatasetLabelStats +DatasetMetadata +DatasetName +DatasetNameBeginsWith +DatasetOwnerInfo +DatasetParameter +DatasetParameters +DatasetProperties +DatasetPropertiesList +DatasetRowDateGranularity +DatasetS3Uri +DatasetSchema +DatasetSchemaSummary +DatasetSource +DatasetStatisticsConfiguration +DatasetStats +DatasetSummaries +DatasetSummary +DatasetSyncCount +DatasetTrigger +DatasetType +DatasetUpdateSummary +Datasets +DatasourcePackageIngestDetail +DatasourcePackageIngestHistory +DatasourcePackageIngestState +DatasourcePackageIngestStates +DatasourcePackageUsageInfo +DatasourcePackages +Datastore +DatastoreActivity +DatastoreArn +DatastoreEndpoint +DatastoreFilter +DatastoreId +DatastoreIotSiteWiseMultiLayerStorage +DatastoreIotSiteWiseMultiLayerStorageSummary +DatastoreName +DatastorePartition +DatastorePartitions +DatastoreProperties +DatastorePropertiesList +DatastoreStatistics +DatastoreStatus +DatastoreStorageSummary +DatastoreSummary +DatastoreTypeVersion +Datatype +Date +DateAggregationFunction +DateArrayOptions +DateAxisOptions +DateColumnStatisticsData +DateCreated +DateDimensionField +DateEnabled +DateFieldFormat +DateFilter +DateFormat +DateGranularity +DateImported +DateInterval +DateMeasureField +DateModified +DateNewProvisioningDataAvailable +DateOptions +DatePartitionDelimiter +DatePartitionEnabled +DatePartitionSequence +DatePartitionTimezone +DateProvisioned +DateRange +DateRangeFilter +DateRangeType +DateReference +DateTime +DateTimeDatasetParameter +DateTimeDatasetParameterDefaultValues +DateTimeDefaultValues +DateTimeFormat +DateTimeFormatConfiguration +DateTimeHierarchy +DateTimeParameter +DateTimeParameterDeclaration +DateTimeParameters +DateTimePicker +DateTimePickerControlDisplayOptions +DateTimeRange +DateTimeStaticValues +DateTimeValueWhenUnsetConfiguration +DateTimeValues +DateUpdated +DateValue +Datetime +DatetimeFormat +DatetimeOptions +DatetimeRange +DatetimeTypeFieldName +Datum +Day +DayOfMonth +DayOfTheWeek +DayOfWeek +Days +DaysAfterInitiation +DaysBeforeExpiry +DaysOfWeek +DbClusterIdentifier +DbClusterMembers +DbClusterOptionGroupMemberships +DbClusterOptionGroupName +DbClusterParameterGroup +DbClusterParameterGroupStatus +DbClusterResourceId +DbClusterSnapshotAttributes +DbClusterSnapshotIdentifier +DbGroups +DbInstanceArn +DbInstanceClass +DbInstanceIdentifier +DbInstancePort +DbInstanceStatus +DbName +DbParameterGroupName +DbParameterGroups +DbPassword +DbSecurityGroupArn +DbSecurityGroupDescription +DbSecurityGroupName +DbSecurityGroups +DbSnapshotIdentifier +DbSubnetGroup +DbSubnetGroupArn +DbSubnetGroupDescription +DbSubnetGroupName +DbUser +DbiResourceId +DcFilter +DdlArtifactsSchema +Ddls +DdsHandling +DdsXCoordinate +DdsYCoordinate +DeactivateAnomalyDetectorRequest +DeactivateContactChannelRequest +DeactivateDeviceIdentifierRequest +DeactivateDeviceIdentifierResponse +DeactivateEvaluationFormRequest +DeactivateEvaluationFormResponse +DeactivateEventSourceRequest +DeactivateKeySigningKeyRequest +DeactivateKeySigningKeyResponse +DeactivateMFADeviceRequest +DeactivatePipelineInput +DeactivateTypeInput +DeactivateUserRequest +DeactivatingLastSystemUserException +DeadLetterConfig +DeadLetterQueueUrl +DeadLetterTargetArn +Deadline +DeauthorizeConnectionRequest +DeauthorizeConnectionResponse +DeauthorizeDataShareMessage +DeblockFilter +DebugHookConfig +DebugLogDeliveryAccounts +DebugLogging +DebugRuleConfiguration +DebugRuleConfigurations +DebugRuleEvaluationStatus +DebugRuleEvaluationStatuses +DebugSession +DecimalColumnStatisticsData +DecimalDatasetParameter +DecimalDatasetParameterDefaultValues +DecimalDefaultValues +DecimalNumber +DecimalParameter +DecimalParameterDeclaration +DecimalParameters +DecimalPlaces +DecimalPlacesConfiguration +DecimalSeparator +DecimalStaticValues +DecimalValueWhenUnsetConfiguration +DecimalValues +DecimalizationTable +DecipherOnly +Decision +DecisionTask +DecisionTaskCompletedEventAttributes +DecisionTaskScheduledEventAttributes +DecisionTaskStartedEventAttributes +DecisionTaskTimedOutEventAttributes +Declared +DeclaredTransforms +DeclineHandshakeRequest +DeclineHandshakeResponse +DeclineInvitationsRequest +DeclineInvitationsResponse +DecodeAuthorizationMessageRequest +DecodeAuthorizationMessageResponse +DecodeConfig +DecodedMessage +DecoderManifestSummary +DecoderManifestValidationException +DecommissionTimeout +DecreaseNodeGroupsInGlobalReplicationGroupMessage +DecreaseNodeGroupsInGlobalReplicationGroupResult +DecreaseReplicaCountMessage +DecreaseReplicaCountResult +DecreaseReplicationFactorRequest +DecreaseReplicationFactorResponse +DecreaseStreamRetentionPeriodInput +Decrypt +DecryptDataInput +DecryptDataOutput +DecryptRequest +DecryptResponse +DecryptStepDetails +Decryption +DecryptionAttributes +DecryptionFailure +DecryptionMode +DecryptionSettings +DedicatedHostIds +DedicatedHostsSupported +DedicatedIp +DedicatedIpAutoWarmupEnabled +DedicatedIpPool +DedicatedIpPools +DedicatedIps +DedicatedMaster +DedicatedMasterCount +DedicatedMasterEnabled +DedicatedMasterType +DedicatedTenancyManagementCidrRange +DedicatedTenancySupport +Default +DefaultAction +DefaultActions +DefaultActivity +DefaultAdmin +DefaultAllocatedStorage +DefaultArguments +DefaultAssociationRouteTable +DefaultAuthType +DefaultAuthenticationMethod +DefaultAvailabilityZone +DefaultBaseline +DefaultBehavior +DefaultBranchCannotBeDeletedException +DefaultButtonConfiguration +DefaultCacheBehavior +DefaultCapacityProviderStrategy +DefaultCategoricalHyperParameterRange +DefaultCellWidth +DefaultCertificateForNewLaunches +DefaultCharacterSet +DefaultClientBrandingAttributes +DefaultClusterParameters +DefaultCodeRepository +DefaultCodeRepositoryContains +DefaultConditionalBranch +DefaultConferenceProviderArn +DefaultConfig +DefaultContent +DefaultContinuousHyperParameterRange +DefaultControlPanel +DefaultCooldown +DefaultCores +DefaultDateColumnName +DefaultDetection +DefaultDimensionValue +DefaultDocumentIdFormat +DefaultDomain +DefaultEmailCustomizationTemplate +DefaultEmailOption +DefaultEmailTags +DefaultEncryptionKey +DefaultErrorDetails +DefaultExecutorDpuSize +DefaultExpirationDays +DefaultExportDestination +DefaultFieldValues +DefaultForAz +DefaultFormatting +DefaultFreeFormLayoutConfiguration +DefaultGateway +DefaultGid +DefaultGridLayoutConfiguration +DefaultHyperParameterRanges +DefaultIamRoleArn +DefaultImportClientBrandingAttributes +DefaultInstanceName +DefaultInstanceProfileArn +DefaultInstanceWarmup +DefaultIntegerHyperParameterRange +DefaultInteractiveLayoutConfiguration +DefaultLicense +DefaultList +DefaultLists +DefaultLogLevel +DefaultMailDomain +DefaultMessage +DefaultMessageType +DefaultNamespace +DefaultNetworkCardIndex +DefaultNewSheetConfiguration +DefaultOnly +DefaultOptionRefId +DefaultOs +DefaultOu +DefaultOutboundQueueId +DefaultPaginatedLayoutConfiguration +DefaultPhoneNumber +DefaultPort +DefaultPropagationRouteTable +DefaultPushNotificationMessage +DefaultPushNotificationTemplate +DefaultRecipes +DefaultRedirectURI +DefaultResourceDiscoveryAssociationId +DefaultResourceDiscoveryId +DefaultResourceSpec +DefaultResult +DefaultRetention +DefaultRootDeviceType +DefaultRootObject +DefaultRoute +DefaultRouteInput +DefaultRouteSettings +DefaultRouteTableAssociation +DefaultRouteTablePropagation +DefaultRunProperties +DefaultRuntimeContextDevice +DefaultRuntimeContextDeviceName +DefaultS3Location +DefaultSectionBasedLayoutConfiguration +DefaultSecurityGroupNames +DefaultSegmentDeliveryConfiguration +DefaultSelection +DefaultSenderId +DefaultSeriesSettings +DefaultServerSideEncryption +DefaultSessionExpiryMinutes +DefaultSizeInspectionLimit +DefaultSpaceSettings +DefaultSshKeyName +DefaultState +DefaultStorageClass +DefaultSubnetId +DefaultSubscriptionStatus +DefaultSubstitutions +DefaultTTL +DefaultTags +DefaultTargetCapacityType +DefaultTargetInstance +DefaultTemplateData +DefaultTheme +DefaultThreadsPerCore +DefaultUid +DefaultUndefinedFault +DefaultUserAssociatedToUserGroupFault +DefaultUserRequired +DefaultUserSettings +DefaultVCpus +DefaultValue +DefaultValueColumn +DefaultValues +DefaultVersion +DefaultVersionId +DefaultVersionName +DefaultVersionNumber +DefaultVocabulary +DefaultVocabularyList +DefaultWatchlist +DefaultWatchlistId +DefaultWorkspaceCreationProperties +Defaults +DeferActivation +DeferMaintenance +DeferMaintenanceDuration +DeferMaintenanceEndTime +DeferMaintenanceIdentifier +DeferMaintenanceStartTime +DeferredMaintenanceWindow +DeferredMaintenanceWindows +DefineAnalysisSchemeRequest +DefineAnalysisSchemeResponse +DefineAuthChallenge +DefineExpressionRequest +DefineExpressionResponse +DefineIndexFieldRequest +DefineIndexFieldResponse +DefineSegment +DefineSuggesterRequest +DefineSuggesterResponse +Definition +DefinitionArn +DefinitionDocument +DefinitionInformation +DefinitionName +DefinitionTimestamp +DefinitionType +Definitions +Degraded +Deinterlacer +Delay +DelaySeconds +DelayUntilElbConnectionsDrained +Delegate +DelegatedAdmin +DelegatedAdminAccount +DelegatedAdminAccountId +DelegatedAdminAccountLimitExceededException +DelegatedAdministrator +DelegatedAdministrators +DelegatedService +DelegatedServices +Delegates +Delegation +DelegationEnabledDate +DelegationMetadata +DelegationSet +DelegationSetAlreadyCreated +DelegationSetAlreadyReusable +DelegationSetId +DelegationSetInUse +DelegationSetNotAvailable +DelegationSetNotReusable +DelegationSets +DelegationTime +Delete +DeleteACLRequest +DeleteACLResponse +DeleteAcceleratorRequest +DeleteAccessControlConfigurationRequest +DeleteAccessControlRuleRequest +DeleteAccessKeyRequest +DeleteAccessLogSettingsRequest +DeleteAccessLogSubscriptionRequest +DeleteAccessPointForObjectLambdaRequest +DeleteAccessPointInput +DeleteAccessPointPolicyForObjectLambdaRequest +DeleteAccessPointPolicyRequest +DeleteAccessPointRequest +DeleteAccessPolicyRequest +DeleteAccessRequest +DeleteAccessTokenRequest +DeleteAccessorInput +DeleteAccountAliasRequest +DeleteAccountAssignmentRequest +DeleteAccountAssignmentResponse +DeleteAccountAuditConfigurationRequest +DeleteAccountCustomizationRequest +DeleteAccountCustomizationResponse +DeleteAccountPolicyRequest +DeleteAccountRequest +DeleteAccountSettingRequest +DeleteAccountSettingResponse +DeleteAccountSubscriptionRequest +DeleteAccountSubscriptionResponse +DeleteActionRequest +DeleteActionResponse +DeleteActionTargetRequest +DeleteActionTargetResponse +DeleteActivationRequest +DeleteActivityInput +DeleteAddonRequest +DeleteAddonResponse +DeleteAddressBookRequest +DeleteAdmChannelRequest +DeleteAdmChannelResponse +DeleteAfterDays +DeleteAfterUpload +DeleteAgentRequest +DeleteAggregationAuthorizationRequest +DeleteAgreementRequest +DeleteAlarmModelRequest +DeleteAlarmRequest +DeleteAlarmResult +DeleteAlarmsInput +DeleteAlertManagerDefinitionRequest +DeleteAlertRequest +DeleteAlgorithmInput +DeleteAliasInput +DeleteAliasRequest +DeleteAll +DeleteAllPolicyResources +DeleteAllRevisions +DeleteAllowListRequest +DeleteAlternateContactRequest +DeleteAnalysisRequest +DeleteAnalysisResponse +DeleteAnalysisSchemeRequest +DeleteAnalysisSchemeResponse +DeleteAnalysisTemplateInput +DeleteAnalyzerRequest +DeleteAnnotationStoreRequest +DeleteAnnotationStoreResponse +DeleteAnnotationStoreVersionsRequest +DeleteAnnotationStoreVersionsResponse +DeleteAnomalyDetectorInput +DeleteAnomalyDetectorRequest +DeleteAnomalyMonitorRequest +DeleteAnomalySubscriptionRequest +DeleteApiCacheRequest +DeleteApiDestinationRequest +DeleteApiKeyRequest +DeleteApiMappingRequest +DeleteApiRequest +DeleteApnsChannelRequest +DeleteApnsChannelResponse +DeleteApnsSandboxChannelRequest +DeleteApnsSandboxChannelResponse +DeleteApnsVoipChannelRequest +DeleteApnsVoipChannelResponse +DeleteApnsVoipSandboxChannelRequest +DeleteApnsVoipSandboxChannelResponse +DeleteAppAssessmentRequest +DeleteAppAssessmentResponse +DeleteAppAuthorizationRequest +DeleteAppBlockBuilderRequest +DeleteAppBlockRequest +DeleteAppBundleRequest +DeleteAppImageConfigRequest +DeleteAppInput +DeleteAppInputSourceRequest +DeleteAppInputSourceResponse +DeleteAppInstanceAdminRequest +DeleteAppInstanceBotRequest +DeleteAppInstanceRequest +DeleteAppInstanceStreamingConfigurationsRequest +DeleteAppInstanceUserRequest +DeleteAppLaunchConfigurationRequest +DeleteAppMonitorRequest +DeleteAppReplicationConfigurationRequest +DeleteAppRequest +DeleteAppResponse +DeleteAppResult +DeleteAppValidationConfigurationRequest +DeleteAppVersionAppComponentRequest +DeleteAppVersionAppComponentResponse +DeleteAppVersionResourceRequest +DeleteAppVersionResourceResponse +DeleteApplicationCloudWatchLoggingOptionRequest +DeleteApplicationCloudWatchLoggingOptionResponse +DeleteApplicationFromEnvironmentRequest +DeleteApplicationInput +DeleteApplicationInputProcessingConfigurationRequest +DeleteApplicationInputProcessingConfigurationResponse +DeleteApplicationMessage +DeleteApplicationOutputRequest +DeleteApplicationOutputResponse +DeleteApplicationReferenceDataSourceRequest +DeleteApplicationReferenceDataSourceResponse +DeleteApplicationRequest +DeleteApplicationResponse +DeleteApplicationSnapshotRequest +DeleteApplicationVersionMessage +DeleteApplicationVpcConfigurationRequest +DeleteApplicationVpcConfigurationResponse +DeleteApplicationsRequest +DeleteApprovalRuleTemplateInput +DeleteApprovalRuleTemplateOutput +DeleteAppsListRequest +DeleteArchiveInput +DeleteArchiveRequest +DeleteArchiveRuleRequest +DeleteArguments +DeleteArtifactRequest +DeleteArtifactResponse +DeleteAssessmentFrameworkRequest +DeleteAssessmentFrameworkShareRequest +DeleteAssessmentReportRequest +DeleteAssessmentRequest +DeleteAssessmentRunRequest +DeleteAssessmentTargetRequest +DeleteAssessmentTemplateRequest +DeleteAssetModelRequest +DeleteAssetModelResponse +DeleteAssetRequest +DeleteAssetResponse +DeleteAssistantAssociationRequest +DeleteAssistantRequest +DeleteAssociatedConditionalForwarder +DeleteAssociationRequest +DeleteAssociationResponse +DeleteAt +DeleteAttachmentRequest +DeleteAttachmentResponse +DeleteAttendeeRequest +DeleteAttributeGroupRequest +DeleteAttributeGroupResponse +DeleteAttributesRequest +DeleteAttributesResponse +DeleteAuditSuppressionRequest +DeleteAuthPolicyRequest +DeleteAuthenticationProfileMessage +DeleteAuthenticationProfileResult +DeleteAuthorizerRequest +DeleteAutoScalingConfigurationRequest +DeleteAutoScalingConfigurationResponse +DeleteAutoScalingGroupType +DeleteAutoSnapshotRequest +DeleteAutoSnapshotResult +DeleteAutomatedBackups +DeleteAutomaticTapeCreationPolicyInput +DeleteAutomaticTapeCreationPolicyOutput +DeleteAvailabilityConfigurationRequest +DeleteAwsLogSourceRequest +DeleteAwsLogSourceResponse +DeleteBGPPeerRequest +DeleteBGPPeerResponse +DeleteBackendAPIRequest +DeleteBackendAPIResponse +DeleteBackendAuthRequest +DeleteBackendAuthResponse +DeleteBackendEnvironmentRequest +DeleteBackendEnvironmentResult +DeleteBackendRequest +DeleteBackendResponse +DeleteBackendStorageRequest +DeleteBackendStorageResponse +DeleteBackupInput +DeleteBackupOutput +DeleteBackupPlanInput +DeleteBackupPlanOutput +DeleteBackupRequest +DeleteBackupResponse +DeleteBackupSelectionInput +DeleteBackupVaultAccessPolicyInput +DeleteBackupVaultInput +DeleteBackupVaultLockConfigurationInput +DeleteBackupVaultNotificationsInput +DeleteBaiduChannelRequest +DeleteBaiduChannelResponse +DeleteBandwidthRateLimitInput +DeleteBandwidthRateLimitOutput +DeleteBasePathMappingRequest +DeleteBatchImportJobRequest +DeleteBatchPredictionInput +DeleteBatchPredictionJobRequest +DeleteBatchPredictionOutput +DeleteBehavior +DeleteBillingGroupInput +DeleteBillingGroupOutput +DeleteBillingGroupRequest +DeleteBlueGreenDeploymentRequest +DeleteBlueGreenDeploymentResponse +DeleteBlueprintRequest +DeleteBlueprintResponse +DeleteBotAliasRequest +DeleteBotAliasResponse +DeleteBotChannelAssociationRequest +DeleteBotLocaleRequest +DeleteBotLocaleResponse +DeleteBotRequest +DeleteBotResponse +DeleteBotVersionRequest +DeleteBotVersionResponse +DeleteBranchInput +DeleteBranchOutput +DeleteBranchRequest +DeleteBranchResult +DeleteBridgeRequest +DeleteBridgeResponse +DeleteBrokerRequest +DeleteBrokerResponse +DeleteBrowserSettingsRequest +DeleteBucketAccessKeyRequest +DeleteBucketAccessKeyResult +DeleteBucketAnalyticsConfigurationRequest +DeleteBucketCorsRequest +DeleteBucketEncryptionRequest +DeleteBucketIntelligentTieringConfigurationRequest +DeleteBucketInventoryConfigurationRequest +DeleteBucketLifecycleConfigurationRequest +DeleteBucketLifecycleRequest +DeleteBucketMetricsConfigurationRequest +DeleteBucketOwnershipControlsRequest +DeleteBucketPolicyRequest +DeleteBucketReplicationRequest +DeleteBucketRequest +DeleteBucketResult +DeleteBucketTaggingRequest +DeleteBucketWebsiteRequest +DeleteBudgetActionRequest +DeleteBudgetActionResponse +DeleteBudgetRequest +DeleteBuildBatchInput +DeleteBuildBatchOutput +DeleteBuildInput +DeleteBusinessReportScheduleRequest +DeleteByteMatchSetRequest +DeleteByteMatchSetResponse +DeleteCACertificateRequest +DeleteCacheClusterMessage +DeleteCacheClusterResult +DeleteCacheParameterGroupMessage +DeleteCachePolicyRequest +DeleteCacheSecurityGroupMessage +DeleteCacheSubnetGroupMessage +DeleteCalculatedAttributeDefinitionRequest +DeleteCallAnalyticsCategoryRequest +DeleteCallAnalyticsJobRequest +DeleteCampaignRequest +DeleteCampaignResponse +DeleteCanaryRequest +DeleteCapacityProviderRequest +DeleteCapacityProviderResponse +DeleteCapacityReservationInput +DeleteCarrierGatewayRequest +DeleteCarrierGatewayResult +DeleteCellRequest +DeleteCertificateAuthorityRequest +DeleteCertificateMessage +DeleteCertificateRequest +DeleteCertificateResponse +DeleteCertificateResult +DeleteChangeSetInput +DeleteChannelBanRequest +DeleteChannelFlowRequest +DeleteChannelGroupRequest +DeleteChannelMembershipRequest +DeleteChannelMessageRequest +DeleteChannelModeratorRequest +DeleteChannelPolicyRequest +DeleteChannelRequest +DeleteChannelResponse +DeleteChapCredentialsInput +DeleteChapCredentialsOutput +DeleteCidrCollectionRequest +DeleteClassifierRequest +DeleteClientBrandingRequest +DeleteClientCertificateRequest +DeleteClientVpnEndpointRequest +DeleteClientVpnEndpointResult +DeleteClientVpnRouteRequest +DeleteClientVpnRouteResult +DeleteClonedVolumes +DeleteCloudFrontOriginAccessIdentityRequest +DeleteClusterInput +DeleteClusterMessage +DeleteClusterOutput +DeleteClusterParameterGroupMessage +DeleteClusterPolicyRequest +DeleteClusterRequest +DeleteClusterResponse +DeleteClusterResult +DeleteClusterSecurityGroupMessage +DeleteClusterSnapshotInput +DeleteClusterSnapshotMessage +DeleteClusterSnapshotOutput +DeleteClusterSnapshotResult +DeleteClusterSubnetGroupMessage +DeleteCodeRepositoryInput +DeleteCodeSigningConfigRequest +DeleteCoipCidrRequest +DeleteCoipCidrResult +DeleteCoipPoolRequest +DeleteCoipPoolResult +DeleteCollaborationInput +DeleteCollectionDetail +DeleteCollectionRequest +DeleteCollectionResponse +DeleteCollectorRequest +DeleteColumnStatisticsForPartitionRequest +DeleteColumnStatisticsForTableRequest +DeleteCommentContentInput +DeleteCommentContentOutput +DeleteCommentRequest +DeleteComponentInput +DeleteComponentOutput +DeleteComponentRequest +DeleteComponentResponse +DeleteComponentTypeRequest +DeleteComponentTypeResponse +DeleteComputeEnvironmentRequest +DeleteConditionalForwarderRequest +DeleteConferenceProviderRequest +DeleteConfigRequest +DeleteConfigRuleRequest +DeleteConfigurationAggregatorRequest +DeleteConfigurationProfileRequest +DeleteConfigurationRecorderRequest +DeleteConfigurationRequest +DeleteConfigurationResponse +DeleteConfigurationSetEventDestinationRequest +DeleteConfigurationSetRequest +DeleteConfigurationSetResult +DeleteConfigurationSetTrackingOptionsRequest +DeleteConfigurationTemplateMessage +DeleteConfiguredTableAnalysisRuleInput +DeleteConfiguredTableAssociationInput +DeleteConfiguredTableInput +DeleteConflictException +DeleteConformancePackRequest +DeleteConnectClientAddInRequest +DeleteConnectInstanceConfigRequest +DeleteConnectPeerRequest +DeleteConnectPeerResponse +DeleteConnectionAliasRequest +DeleteConnectionInput +DeleteConnectionMessage +DeleteConnectionRequest +DeleteConnectionResponse +DeleteConnectorDefinitionRequest +DeleteConnectorProfileRequest +DeleteConnectorRequest +DeleteConnectorResponse +DeleteConstraintInput +DeleteContactChannelRequest +DeleteContactEvaluationRequest +DeleteContactFlowModuleRequest +DeleteContactFlowRequest +DeleteContactListRequest +DeleteContactMethodRequest +DeleteContactMethodResult +DeleteContactRequest +DeleteContainerImageRequest +DeleteContainerInput +DeleteContainerPolicyInput +DeleteContainerRecipeRequest +DeleteContainerRecipeResponse +DeleteContainerServiceRequest +DeleteContentRequest +DeleteContextRequest +DeleteContextResponse +DeleteContinuousDeploymentPolicyRequest +DeleteControlPanelRequest +DeleteControlRequest +DeleteCoreDefinitionRequest +DeleteCoreDeviceRequest +DeleteCoreNetworkPolicyVersionRequest +DeleteCoreNetworkPolicyVersionResponse +DeleteCoreNetworkRequest +DeleteCoreNetworkResponse +DeleteCorsConfigurationRequest +DeleteCorsPolicyInput +DeleteCostCategoryDefinitionRequest +DeleteCostCategoryDefinitionResponse +DeleteCrawlerRequest +DeleteCrossAccountAuthorizationRequest +DeleteCustomActionTypeInput +DeleteCustomDBEngineVersionMessage +DeleteCustomDataIdentifierRequest +DeleteCustomDomainAssociationMessage +DeleteCustomEntityTypeRequest +DeleteCustomEntityTypeResponse +DeleteCustomKeyStoreRequest +DeleteCustomLineItemInput +DeleteCustomLineItemOutput +DeleteCustomLogSourceRequest +DeleteCustomMetadataRequest +DeleteCustomMetricRequest +DeleteCustomModelRequest +DeleteCustomPluginRequest +DeleteCustomPluginResponse +DeleteCustomRoutingAcceleratorRequest +DeleteCustomRoutingEndpointGroupRequest +DeleteCustomRoutingListenerRequest +DeleteCustomVerificationEmailTemplateRequest +DeleteCustomVocabularyRequest +DeleteCustomVocabularyResponse +DeleteCustomerGatewayRequest +DeleteDBClusterAutomatedBackupMessage +DeleteDBClusterAutomatedBackupResult +DeleteDBClusterEndpointMessage +DeleteDBClusterEndpointOutput +DeleteDBClusterMessage +DeleteDBClusterParameterGroupMessage +DeleteDBClusterResult +DeleteDBClusterSnapshotMessage +DeleteDBClusterSnapshotResult +DeleteDBInstanceAutomatedBackupMessage +DeleteDBInstanceAutomatedBackupResult +DeleteDBInstanceMessage +DeleteDBInstanceResult +DeleteDBParameterGroupMessage +DeleteDBProxyEndpointRequest +DeleteDBProxyEndpointResponse +DeleteDBProxyRequest +DeleteDBProxyResponse +DeleteDBSecurityGroupMessage +DeleteDBSnapshotMessage +DeleteDBSnapshotResult +DeleteDBSubnetGroupMessage +DeleteDashboardRequest +DeleteDashboardResponse +DeleteDashboardsInput +DeleteDataCatalogInput +DeleteDataCellsFilterRequest +DeleteDataInFileSystem +DeleteDataIntegrationRequest +DeleteDataLakeOrganizationConfigurationRequest +DeleteDataLakeRequest +DeleteDataProtectionPolicyRequest +DeleteDataProviderMessage +DeleteDataProviderResponse +DeleteDataQualityJobDefinitionRequest +DeleteDataQualityRulesetRequest +DeleteDataRepositoryAssociationRequest +DeleteDataRepositoryAssociationResponse +DeleteDataSetRefreshPropertiesRequest +DeleteDataSetRefreshPropertiesResponse +DeleteDataSetRequest +DeleteDataSetResponse +DeleteDataSourceInput +DeleteDataSourceOutput +DeleteDataSourceRequest +DeleteDataSourceResponse +DeleteDatabaseRequest +DeleteDataflowEndpointGroupRequest +DeleteDatasetContentRequest +DeleteDatasetGroupRequest +DeleteDatasetImportJobRequest +DeleteDatasetRequest +DeleteDatasetResponse +DeleteDatastoreRequest +DeleteDatastoreResponse +DeleteDecoderManifestRequest +DeleteDecoderManifestResponse +DeleteDedicatedIpPoolRequest +DeleteDefaultMessageTypeRequest +DeleteDefaultMessageTypeResult +DeleteDefaultSenderIdRequest +DeleteDefaultSenderIdResult +DeleteDeliveryChannelRequest +DeleteDeliveryStreamInput +DeleteDeploymentConfigInput +DeleteDeploymentGroupInput +DeleteDeploymentGroupOutput +DeleteDeploymentInput +DeleteDeploymentOutput +DeleteDeploymentRequest +DeleteDeploymentStrategyRequest +DeleteDestinationRequest +DeleteDetectorModelRequest +DeleteDetectorRequest +DeleteDetectorVersionRequest +DeleteDevEndpointRequest +DeleteDevEnvironmentRequest +DeleteDevEnvironmentResponse +DeleteDeviceDefinitionRequest +DeleteDeviceFleetRequest +DeleteDevicePoolRequest +DeleteDeviceProfileRequest +DeleteDeviceRequest +DeleteDeviceResponse +DeleteDeviceUsageDataRequest +DeleteDhcpOptionsRequest +DeleteDimensionRequest +DeleteDirectConnectGatewayAssociationProposalRequest +DeleteDirectConnectGatewayAssociationProposalResult +DeleteDirectConnectGatewayAssociationRequest +DeleteDirectConnectGatewayAssociationResult +DeleteDirectConnectGatewayRequest +DeleteDirectConnectGatewayResult +DeleteDirectory +DeleteDirectoryConfigRequest +DeleteDirectoryRegistrationRequest +DeleteDirectoryRequest +DeleteDirectoryResponse +DeleteDirectoryResult +DeleteDiscovererRequest +DeleteDiskRequest +DeleteDiskResult +DeleteDiskSnapshotRequest +DeleteDiskSnapshotResult +DeleteDistributionConfigurationRequest +DeleteDistributionConfigurationResponse +DeleteDistributionRequest +DeleteDistributionResult +DeleteDocumentClassifierRequest +DeleteDocumentRequest +DeleteDocumentVersionRequest +DeleteDocumentationPartRequest +DeleteDocumentationVersionRequest +DeleteDomainAssociationRequest +DeleteDomainAssociationResult +DeleteDomainConfigurationRequest +DeleteDomainEntryRequest +DeleteDomainEntryResult +DeleteDomainNameRequest +DeleteDomainPermissionsPolicyRequest +DeleteDomainPermissionsPolicyResult +DeleteDomainRequest +DeleteDomainResponse +DeleteDomainResult +DeleteDynamicThingGroupRequest +DeleteEarthObservationJobInput +DeleteEdgeConfigurationInput +DeleteEdgeDeploymentPlanRequest +DeleteEdgeDeploymentStageRequest +DeleteEgressOnlyInternetGatewayRequest +DeleteEgressOnlyInternetGatewayResult +DeleteElasticIp +DeleteElasticsearchDomainRequest +DeleteElasticsearchDomainResponse +DeleteEmailChannelRequest +DeleteEmailChannelResponse +DeleteEmailIdentityPolicyRequest +DeleteEmailIdentityRequest +DeleteEmailMonitoringConfigurationRequest +DeleteEmailTemplateRequest +DeleteEmailTemplateResponse +DeleteEndpointAccessMessage +DeleteEndpointAccessRequest +DeleteEndpointAccessResponse +DeleteEndpointConfigInput +DeleteEndpointGroupRequest +DeleteEndpointInput +DeleteEndpointMessage +DeleteEndpointRequest +DeleteEndpointResponse +DeleteEntitlementRequest +DeleteEntityRecognizerRequest +DeleteEntityRequest +DeleteEntityResponse +DeleteEntityTypeRequest +DeleteEnvironmentAccountConnectionInput +DeleteEnvironmentAccountConnectionOutput +DeleteEnvironmentConfigurationMessage +DeleteEnvironmentInput +DeleteEnvironmentMembershipRequest +DeleteEnvironmentOutput +DeleteEnvironmentRequest +DeleteEnvironmentResponse +DeleteEnvironmentTemplateInput +DeleteEnvironmentTemplateOutput +DeleteEnvironmentTemplateVersionInput +DeleteEnvironmentTemplateVersionOutput +DeleteEphemerisRequest +DeleteEvaluationFormRequest +DeleteEvaluationInput +DeleteEvaluationOutput +DeleteEvaluationResultsRequest +DeleteEventActionRequest +DeleteEventBusRequest +DeleteEventDataStoreRequest +DeleteEventDestinationRequest +DeleteEventDestinationResult +DeleteEventIntegrationRequest +DeleteEventRequest +DeleteEventSourceMappingRequest +DeleteEventStreamRequest +DeleteEventStreamResponse +DeleteEventSubscriptionMessage +DeleteEventSubscriptionResponse +DeleteEventSubscriptionResult +DeleteEventTrackerRequest +DeleteEventTypeRequest +DeleteEventsByEventTypeRequest +DeleteEventsByEventTypeResult +DeleteEventsConfigurationRequest +DeleteExperienceRequest +DeleteExperimentRequest +DeleteExperimentResponse +DeleteExperimentTemplateRequest +DeleteExperimentTemplateResponse +DeleteExplainabilityExportRequest +DeleteExplainabilityRequest +DeleteExportRequest +DeleteExportResponse +DeleteExpressionRequest +DeleteExpressionResponse +DeleteExtensionAssociationRequest +DeleteExtensionRequest +DeleteExternalModelRequest +DeleteFHIRDatastoreRequest +DeleteFHIRDatastoreResponse +DeleteFacesRequest +DeleteFacesResponse +DeleteFacetRequest +DeleteFaqRequest +DeleteFargateProfileRequest +DeleteFargateProfileResponse +DeleteFeatureGroupRequest +DeleteFeatureRequest +DeleteFieldLevelEncryptionConfigRequest +DeleteFieldLevelEncryptionProfileRequest +DeleteFileCacheRequest +DeleteFileCacheResponse +DeleteFileEntry +DeleteFileInput +DeleteFileOutput +DeleteFileShareInput +DeleteFileShareOutput +DeleteFileSystemLustreConfiguration +DeleteFileSystemLustreResponse +DeleteFileSystemOpenZFSConfiguration +DeleteFileSystemOpenZFSResponse +DeleteFileSystemPolicyRequest +DeleteFileSystemRequest +DeleteFileSystemResponse +DeleteFileSystemWindowsConfiguration +DeleteFileSystemWindowsResponse +DeleteFilterRequest +DeleteFilterResponse +DeleteFindingAggregatorRequest +DeleteFindingsFilterRequest +DeleteFirewallDomainListRequest +DeleteFirewallDomainListResponse +DeleteFirewallManagerRuleGroupsRequest +DeleteFirewallManagerRuleGroupsResponse +DeleteFirewallPolicyRequest +DeleteFirewallPolicyResponse +DeleteFirewallRequest +DeleteFirewallResponse +DeleteFirewallRuleGroupRequest +DeleteFirewallRuleGroupResponse +DeleteFirewallRuleRequest +DeleteFirewallRuleResponse +DeleteFleetAdvisorDatabasesRequest +DeleteFleetAdvisorDatabasesResponse +DeleteFleetError +DeleteFleetErrorItem +DeleteFleetInput +DeleteFleetLocationsInput +DeleteFleetLocationsOutput +DeleteFleetMetricRequest +DeleteFleetRequest +DeleteFleetResponse +DeleteFleetSuccessItem +DeleteFleetsRequest +DeleteFleetsResult +DeleteFlowDefinitionRequest +DeleteFlowLogsRequest +DeleteFlowLogsResult +DeleteFlowRequest +DeleteFlowResponse +DeleteFlowTemplateRequest +DeleteFlywheelRequest +DeleteFolderContentsRequest +DeleteFolderMembershipRequest +DeleteFolderMembershipResponse +DeleteFolderRequest +DeleteFolderResponse +DeleteForecastExportJobRequest +DeleteForecastRequest +DeleteFormRequest +DeleteFpgaImageRequest +DeleteFpgaImageResult +DeleteFrameworkInput +DeleteFraudsterRequest +DeleteFunctionCodeSigningConfigRequest +DeleteFunctionConcurrencyRequest +DeleteFunctionDefinitionRequest +DeleteFunctionEventInvokeConfigRequest +DeleteFunctionRequest +DeleteFunctionUrlConfigRequest +DeleteFuotaTaskRequest +DeleteGameRequest +DeleteGameServerGroupInput +DeleteGameServerGroupOutput +DeleteGameSessionQueueInput +DeleteGatewayGroupRequest +DeleteGatewayInput +DeleteGatewayOutput +DeleteGatewayRequest +DeleteGatewayResponse +DeleteGatewayResponseRequest +DeleteGatewayRouteInput +DeleteGatewayRouteOutput +DeleteGcmChannelRequest +DeleteGcmChannelResponse +DeleteGeoMatchSetRequest +DeleteGeoMatchSetResponse +DeleteGeofenceCollectionRequest +DeleteGitHubAccountTokenInput +DeleteGitHubAccountTokenOutput +DeleteGlobalClusterMessage +DeleteGlobalClusterResult +DeleteGlobalNetworkRequest +DeleteGlobalNetworkResponse +DeleteGlobalReplicationGroupMessage +DeleteGlobalReplicationGroupResult +DeleteGlobalSecondaryIndexAction +DeleteGrantRequest +DeleteGrantResponse +DeleteGraphRequest +DeleteGraphqlApiRequest +DeleteGroupInput +DeleteGroupMembershipRequest +DeleteGroupMembershipResponse +DeleteGroupOutput +DeleteGroupPolicyRequest +DeleteGroupRequest +DeleteGroupResponse +DeleteHITRequest +DeleteHapgRequest +DeleteHapgResponse +DeleteHealthCheckRequest +DeleteHostInput +DeleteHostKeyRequest +DeleteHostedConfigurationVersionRequest +DeleteHostedZoneRequest +DeleteHostedZoneResponse +DeleteHoursOfOperationRequest +DeleteHsmClientCertificateMessage +DeleteHsmConfigurationMessage +DeleteHsmRequest +DeleteHsmResponse +DeleteHubContentRequest +DeleteHubRequest +DeleteHumanLoopRequest +DeleteHumanTaskUiRequest +DeleteHypervisorInput +DeleteHypervisorOutput +DeleteIAMPolicyAssignmentRequest +DeleteIAMPolicyAssignmentResponse +DeleteIPSetRequest +DeleteIPSetResponse +DeleteIdentitiesInput +DeleteIdentitiesResponse +DeleteIdentityPolicyRequest +DeleteIdentityPoolInput +DeleteIdentityProviderRequest +DeleteIdentityRequest +DeleteIdentitySourceInput +DeleteImageBuilderRequest +DeleteImageBuilderResult +DeleteImagePermissionsRequest +DeleteImagePipelineRequest +DeleteImagePipelineResponse +DeleteImageRecipeRequest +DeleteImageRecipeResponse +DeleteImageRequest +DeleteImageResponse +DeleteImageResult +DeleteImageSetRequest +DeleteImageSetResponse +DeleteImageVersionRequest +DeleteImpersonationRoleRequest +DeleteImportRequest +DeleteImportResponse +DeleteImportedKeyMaterialRequest +DeleteInAppTemplateRequest +DeleteInAppTemplateResponse +DeleteInboundConnectionRequest +DeleteInboundConnectionResponse +DeleteInboundCrossClusterSearchConnectionRequest +DeleteInboundCrossClusterSearchConnectionResponse +DeleteIncidentRecordInput +DeleteIndexFieldRequest +DeleteIndexFieldResponse +DeleteIndexInput +DeleteIndexOutput +DeleteIndexRequest +DeleteInferenceExperimentRequest +DeleteInferenceExperimentResponse +DeleteInferenceSchedulerRequest +DeleteInfrastructureConfigurationRequest +DeleteInfrastructureConfigurationResponse +DeleteIngestionDestinationRequest +DeleteIngestionRequest +DeleteInlinePolicyFromPermissionSetRequest +DeleteInputRequest +DeleteInputSecurityGroupRequest +DeleteInsightRequest +DeleteInsightResponse +DeleteInsightRulesInput +DeleteInsightRulesOutput +DeleteInstanceAccessControlAttributeConfigurationRequest +DeleteInstanceConnectEndpointRequest +DeleteInstanceConnectEndpointResult +DeleteInstanceEventWindowRequest +DeleteInstanceEventWindowResult +DeleteInstanceOnboardingJobRequest +DeleteInstanceProfileMessage +DeleteInstanceProfileRequest +DeleteInstanceProfileResponse +DeleteInstanceRequest +DeleteInstanceResult +DeleteInstanceSnapshotRequest +DeleteInstanceSnapshotResult +DeleteIntegrationAssociationRequest +DeleteIntegrationRequest +DeleteIntegrationResponse +DeleteIntegrationResponseRequest +DeleteIntentRequest +DeleteIntentVersionRequest +DeleteInterconnectRequest +DeleteInterconnectResponse +DeleteIntermediateSnaphots +DeleteInternetGatewayRequest +DeleteInventoryRequest +DeleteInventoryResult +DeleteInvitationsRequest +DeleteInvitationsResponse +DeleteIpAccessSettingsRequest +DeleteIpGroupRequest +DeleteIpamPoolRequest +DeleteIpamPoolResult +DeleteIpamRequest +DeleteIpamResourceDiscoveryRequest +DeleteIpamResourceDiscoveryResult +DeleteIpamResult +DeleteIpamScopeRequest +DeleteIpamScopeResult +DeleteItemInput +DeleteItemOutput +DeleteJobExecutionRequest +DeleteJobQueueRequest +DeleteJobRequest +DeleteJobResponse +DeleteJobResult +DeleteJobTaggingRequest +DeleteJobTemplateRequest +DeleteJobTemplateResponse +DeleteJourneyRequest +DeleteJourneyResponse +DeleteKeyGroupRequest +DeleteKeyInDays +DeleteKeyInput +DeleteKeyOutput +DeleteKeyPairRequest +DeleteKeyPairResult +DeleteKeyRequest +DeleteKeySigningKeyRequest +DeleteKeySigningKeyResponse +DeleteKeyspaceRequest +DeleteKeywordRequest +DeleteKeywordResult +DeleteKnowledgeBaseRequest +DeleteKnownHostKeysRequest +DeleteKnownHostKeysResult +DeleteKxClusterRequest +DeleteKxDatabaseRequest +DeleteKxEnvironmentRequest +DeleteKxUserRequest +DeleteLFTagRequest +DeleteLabelGroupRequest +DeleteLabelRequest +DeleteLabelsRequest +DeleteLagRequest +DeleteLakeFormationOptInRequest +DeleteLambda +DeleteLanguageModelRequest +DeleteLaunchActionRequest +DeleteLaunchConfigurationTemplateRequest +DeleteLaunchProfileMemberRequest +DeleteLaunchProfileRequest +DeleteLaunchProfileResponse +DeleteLaunchRequest +DeleteLaunchTemplateRequest +DeleteLaunchTemplateResult +DeleteLaunchTemplateVersionsRequest +DeleteLaunchTemplateVersionsResponseErrorItem +DeleteLaunchTemplateVersionsResponseSuccessItem +DeleteLaunchTemplateVersionsResult +DeleteLayerRequest +DeleteLayerVersionRequest +DeleteLedgerRequest +DeleteLensInput +DeleteLensShareInput +DeleteLexiconInput +DeleteLicenseConfigurationRequest +DeleteLicenseManagerReportGeneratorRequest +DeleteLicenseRequest +DeleteLicenseResponse +DeleteLifecycleHookType +DeleteLifecyclePolicyInput +DeleteLifecyclePolicyRequest +DeleteLifecyclePolicyResponse +DeleteLinkInput +DeleteLinkRequest +DeleteLinkResponse +DeleteListRequest +DeleteListenerInput +DeleteListenerRequest +DeleteLiveSourceRequest +DeleteLoadBalancerInput +DeleteLoadBalancerListenerInput +DeleteLoadBalancerPolicyInput +DeleteLoadBalancerRequest +DeleteLoadBalancerResult +DeleteLoadBalancerTlsCertificateRequest +DeleteLoadBalancerTlsCertificateResult +DeleteLocalGatewayRouteRequest +DeleteLocalGatewayRouteResult +DeleteLocalGatewayRouteTableRequest +DeleteLocalGatewayRouteTableResult +DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest +DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult +DeleteLocalGatewayRouteTableVpcAssociationRequest +DeleteLocalGatewayRouteTableVpcAssociationResult +DeleteLocationInput +DeleteLocationRequest +DeleteLogGroupRequest +DeleteLogPatternRequest +DeleteLogStreamRequest +DeleteLogSubscriptionRequest +DeleteLoggerDefinitionRequest +DeleteLoggingConfigurationRequest +DeleteLoginProfileRequest +DeleteLunaClientRequest +DeleteLunaClientResponse +DeleteMLEndpointInput +DeleteMLEndpointOutput +DeleteMLModelInput +DeleteMLModelOutput +DeleteMLTransformRequest +DeleteMLTransformResponse +DeleteMailboxPermissionsRequest +DeleteMaintenanceWindowRequest +DeleteMaintenanceWindowResult +DeleteManagedEndpointRequest +DeleteManagedEndpointResponse +DeleteManagedPrefixListRequest +DeleteManagedPrefixListResult +DeleteMapRequest +DeleteMarker +DeleteMarkerEntry +DeleteMarkerReplication +DeleteMarkerVersionId +DeleteMarkers +DeleteMatchingWorkflowInput +DeleteMatchingWorkflowOutput +DeleteMatchmakingConfigurationInput +DeleteMatchmakingRuleSetInput +DeleteMediaCapturePipelineRequest +DeleteMediaInsightsPipelineConfigurationRequest +DeleteMediaPipelineKinesisVideoStreamPoolRequest +DeleteMediaPipelineRequest +DeleteMedicalTranscriptionJobRequest +DeleteMedicalVocabularyRequest +DeleteMeetingRequest +DeleteMemberInput +DeleteMemberRequest +DeleteMembersRequest +DeleteMembersResponse +DeleteMembershipInput +DeleteMeshInput +DeleteMeshOutput +DeleteMessageBatchRequest +DeleteMessageBatchRequestEntry +DeleteMessageBatchResult +DeleteMessageBatchResultEntry +DeleteMessageRequest +DeleteMessageResponse +DeleteMessagingStreamingConfigurationsRequest +DeleteMethodRequest +DeleteMethodResponseRequest +DeleteMetricAttributionRequest +DeleteMetricFilterRequest +DeleteMetricPolicyInput +DeleteMetricStreamInput +DeleteMigrationProjectMessage +DeleteMigrationProjectResponse +DeleteMigrationWorkflowRequest +DeleteMigrationWorkflowResponse +DeleteMissionProfileRequest +DeleteMitigationActionRequest +DeleteMobileDeviceAccessOverrideRequest +DeleteMobileDeviceAccessRuleRequest +DeleteModelBiasJobDefinitionRequest +DeleteModelCardRequest +DeleteModelExplainabilityJobDefinitionRequest +DeleteModelInput +DeleteModelManifestRequest +DeleteModelManifestResponse +DeleteModelPackageGroupInput +DeleteModelPackageGroupPolicyInput +DeleteModelPackageInput +DeleteModelQualityJobDefinitionRequest +DeleteModelRequest +DeleteModelResponse +DeleteModelVersionRequest +DeleteMonitorInput +DeleteMonitorRequest +DeleteMonitoringScheduleRequest +DeleteMonitoringSubscriptionRequest +DeleteMountTargetRequest +DeleteMultiRegionAccessPointInput +DeleteMultiRegionAccessPointRequest +DeleteMultiRegionAccessPointResult +DeleteMulticastGroupRequest +DeleteMultiplexProgramRequest +DeleteMultiplexProgramResponse +DeleteMultiplexRequest +DeleteMultiplexResponse +DeleteNamedQueryInput +DeleteNamespaceRequest +DeleteNamespaceResponse +DeleteNatGatewayRequest +DeleteNatGatewayResult +DeleteNetworkAclEntryRequest +DeleteNetworkAclRequest +DeleteNetworkAnalyzerConfigurationRequest +DeleteNetworkInsightsAccessScopeAnalysisRequest +DeleteNetworkInsightsAccessScopeAnalysisResult +DeleteNetworkInsightsAccessScopeRequest +DeleteNetworkInsightsAccessScopeResult +DeleteNetworkInsightsAnalysisRequest +DeleteNetworkInsightsAnalysisResult +DeleteNetworkInsightsPathRequest +DeleteNetworkInsightsPathResult +DeleteNetworkInterfacePermissionRequest +DeleteNetworkInterfacePermissionResult +DeleteNetworkInterfaceRequest +DeleteNetworkProfileRequest +DeleteNetworkRequest +DeleteNetworkResponse +DeleteNetworkSettingsRequest +DeleteNetworkSiteRequest +DeleteNetworkSiteResponse +DeleteNodeInput +DeleteNodegroupRequest +DeleteNodegroupResponse +DeleteNotebookInput +DeleteNotebookInstanceInput +DeleteNotebookInstanceLifecycleConfigInput +DeleteNotificationConfigurationType +DeleteNotificationRequest +DeleteNotificationRuleRequest +DeleteNotificationRuleResult +DeleteNotificationSubscriptionRequest +DeleteOTAUpdateRequest +DeleteObject +DeleteObjectInput +DeleteObjectOutput +DeleteObjectRequest +DeleteObjectTaggingOutput +DeleteObjectTaggingRequest +DeleteObjectsOnCancelRequest +DeleteObjectsOutput +DeleteObjectsRequest +DeleteObservabilityConfigurationRequest +DeleteObservabilityConfigurationResponse +DeleteOnTermination +DeleteOpenIDConnectProviderRequest +DeleteOpsMetadataRequest +DeleteOptOutListRequest +DeleteOptOutListResult +DeleteOptedOutNumberRequest +DeleteOptedOutNumberResult +DeleteOption +DeleteOptionGroupMessage +DeleteOrganizationConfigRuleRequest +DeleteOrganizationConformancePackRequest +DeleteOrganizationRequest +DeleteOrganizationResponse +DeleteOrganizationalUnitRequest +DeleteOriginAccessControlRequest +DeleteOriginEndpointPolicyRequest +DeleteOriginEndpointRequest +DeleteOriginRequestPolicyRequest +DeleteOutboundConnectionRequest +DeleteOutboundConnectionResponse +DeleteOutboundCrossClusterSearchConnectionRequest +DeleteOutboundCrossClusterSearchConnectionResponse +DeleteOutcomeRequest +DeleteOutpostInput +DeleteOutpostResolverRequest +DeleteOutpostResolverResponse +DeletePackageRequest +DeletePackageResponse +DeletePackageResult +DeletePackageVersionRequest +DeletePackageVersionsRequest +DeletePackageVersionsResult +DeletePackagingConfigurationRequest +DeletePackagingGroupRequest +DeleteParallelDataRequest +DeleteParallelDataResponse +DeleteParameterGroupRequest +DeleteParameterGroupResponse +DeleteParameterRequest +DeleteParametersRequest +DeleteParametersResult +DeletePartitionIndexRequest +DeletePartitionRequest +DeletePartnerEventSourceRequest +DeletePatchBaselineRequest +DeletePatchBaselineResult +DeletePeeringRequest +DeletePeeringResponse +DeletePendingAggregationRequestRequest +DeletePendingTimestamp +DeletePerformanceAnalysisReportRequest +DeletePermissionGroupRequest +DeletePermissionGroupResponse +DeletePermissionPolicyRequest +DeletePermissionRequest +DeletePermissionResponse +DeletePermissionSetRequest +DeletePermissionVersionRequest +DeletePermissionVersionResponse +DeletePermissionsBoundaryFromPermissionSetRequest +DeletePhoneNumberRequest +DeletePipeRequest +DeletePipeResponse +DeletePipelineInput +DeletePipelineRequest +DeletePipelineResponse +DeletePlaceIndexRequest +DeletePlacementGroupRequest +DeletePlacementRequest +DeletePlatformApplicationInput +DeletePlatformVersionRequest +DeletePlatformVersionResult +DeletePlaybackConfigurationRequest +DeletePlaybackKeyPairRequest +DeletePolicyInput +DeletePolicyRequest +DeletePolicyStoreInput +DeletePolicyTemplateInput +DeletePolicyType +DeletePolicyVersionRequest +DeletePoolRequest +DeletePoolResult +DeletePortalRequest +DeletePortalResponse +DeletePortfolioInput +DeletePortfolioShareInput +DeletePortfolioShareOutput +DeletePredictorBacktestExportJobRequest +DeletePredictorRequest +DeletePrefetchScheduleRequest +DeletePreparedStatementInput +DeletePresetRequest +DeletePricingPlanInput +DeletePricingPlanOutput +DeletePricingRuleInput +DeletePricingRuleOutput +DeletePrincipalMappingRequest +DeletePriorVersions +DeleteProductInput +DeleteProfileInput +DeleteProfileKeyRequest +DeleteProfileKeyResponse +DeleteProfileObjectRequest +DeleteProfileObjectResponse +DeleteProfileObjectTypeRequest +DeleteProfileObjectTypeResponse +DeleteProfileRequest +DeleteProfileResponse +DeleteProfileShareInput +DeleteProfilingGroupRequest +DeleteProgramRequest +DeleteProgressUpdateStreamRequest +DeleteProjectInput +DeleteProjectPolicyRequest +DeleteProjectRequest +DeleteProjectResponse +DeleteProjectResult +DeleteProjectVersionRequest +DeleteProjectVersionResponse +DeletePromptRequest +DeleteProperties +DeletePropertygraphStatisticsOutput +DeleteProtection +DeleteProtectionGroupRequest +DeleteProtectionRequest +DeleteProtocolsListRequest +DeleteProvisionedConcurrencyConfigRequest +DeleteProvisionedModelThroughputRequest +DeleteProvisionedProductPlanInput +DeleteProvisioningArtifactInput +DeleteProvisioningTemplateRequest +DeleteProvisioningTemplateVersionRequest +DeleteProxySessionRequest +DeletePublicAccessBlockRequest +DeletePublicIpv4PoolRequest +DeletePublicIpv4PoolResult +DeletePublicKeyRequest +DeletePublicKeys +DeletePublishingDestinationRequest +DeletePullRequestApprovalRuleInput +DeletePullRequestApprovalRuleOutput +DeletePullThroughCacheRuleRequest +DeletePullThroughCacheRuleResponse +DeletePushTemplateRequest +DeletePushTemplateResponse +DeleteQualificationTypeRequest +DeleteQueryDefinitionRequest +DeleteQueryDefinitionResponse +DeleteQueryLoggingConfigRequest +DeleteQuerySuggestionsBlockListRequest +DeleteQueueRequest +DeleteQueuedMessagesRequest +DeleteQueuedReservedInstancesError +DeleteQueuedReservedInstancesRequest +DeleteQueuedReservedInstancesResult +DeleteQueuedSavingsPlanRequest +DeleteQuickConnectRequest +DeleteRate +DeleteRateBasedRuleRequest +DeleteRateBasedRuleResponse +DeleteReadinessCheckRequest +DeleteRealtimeEndpointInput +DeleteRealtimeEndpointOutput +DeleteRealtimeLogConfigRequest +DeleteReceiptFilterRequest +DeleteReceiptRuleRequest +DeleteReceiptRuleSetRequest +DeleteRecipeVersionRequest +DeleteRecipeVersionResponse +DeleteRecommendationPreferencesRequest +DeleteRecommendationTemplateRequest +DeleteRecommendationTemplateResponse +DeleteRecommenderConfigurationRequest +DeleteRecommenderConfigurationResponse +DeleteRecommenderRequest +DeleteRecordRequest +DeleteRecordingConfigurationRequest +DeleteRecoveryGroupRequest +DeleteRecoveryInstanceRequest +DeleteRecoveryPointInput +DeleteReferenceRequest +DeleteReferenceStoreRequest +DeleteRefreshScheduleRequest +DeleteRefreshScheduleResponse +DeleteRegexMatchSetRequest +DeleteRegexMatchSetResponse +DeleteRegexPatternSetRequest +DeleteRegexPatternSetResponse +DeleteRegionAction +DeleteRegistryInput +DeleteRegistryPolicyResponse +DeleteRegistryRequest +DeleteRegistryResponse +DeleteRelationalDatabaseRequest +DeleteRelationalDatabaseResult +DeleteRelationalDatabaseSnapshotRequest +DeleteRelationalDatabaseSnapshotResult +DeleteRemediationConfigurationRequest +DeleteRemediationExceptionsRequest +DeleteRemediationExceptionsResponse +DeleteRemoteAccessSessionRequest +DeleteReplacedRootVolume +DeleteReplicaAction +DeleteReplicationConfigMessage +DeleteReplicationConfigResponse +DeleteReplicationConfigurationRequest +DeleteReplicationConfigurationTemplateRequest +DeleteReplicationGroupMemberAction +DeleteReplicationGroupMessage +DeleteReplicationGroupResult +DeleteReplicationInstanceMessage +DeleteReplicationInstanceResponse +DeleteReplicationJobRequest +DeleteReplicationSetInput +DeleteReplicationSubnetGroupMessage +DeleteReplicationTaskAssessmentRunMessage +DeleteReplicationTaskAssessmentRunResponse +DeleteReplicationTaskMessage +DeleteReplicationTaskResponse +DeleteReportDefinitionRequest +DeleteReportDefinitionResponse +DeleteReportDefinitionResult +DeleteReportGroupInput +DeleteReportInput +DeleteReportPlanInput +DeleteRepositoryInput +DeleteRepositoryOutput +DeleteRepositoryPermissionsPolicyRequest +DeleteRepositoryPermissionsPolicyResult +DeleteRepositoryPolicyRequest +DeleteRepositoryPolicyResponse +DeleteRepositoryRequest +DeleteRepositoryResponse +DeleteRepositoryResult +DeleteRequest +DeleteRequestValidatorRequest +DeleteRescoreExecutionPlanRequest +DeleteReservationRequest +DeleteReservationResponse +DeleteResiliencyPolicyRequest +DeleteResiliencyPolicyResponse +DeleteResolverEndpointRequest +DeleteResolverEndpointResponse +DeleteResolverQueryLogConfigRequest +DeleteResolverQueryLogConfigResponse +DeleteResolverRequest +DeleteResolverRuleRequest +DeleteResolverRuleResponse +DeleteResource +DeleteResourceConfigRequest +DeleteResourceDataSyncRequest +DeleteResourceDefinitionRequest +DeleteResourceInput +DeleteResourceOutput +DeleteResourcePermissionInput +DeleteResourcePermissionOutput +DeleteResourcePolicyInput +DeleteResourcePolicyRequest +DeleteResourcePolicyResponse +DeleteResourcePolicyStatementRequest +DeleteResourcePolicyStatementResponse +DeleteResourceRequest +DeleteResourceServerRequest +DeleteResourceSetRequest +DeleteResourceShareRequest +DeleteResourceShareResponse +DeleteResourceTreeRequest +DeleteResourcesByExternalIdInput +DeleteResponseHeadersPolicyRequest +DeleteResponsePlanInput +DeleteRestApiRequest +DeleteRetentionConfigurationRequest +DeleteRetentionPolicyRequest +DeleteRetrainingSchedulerRequest +DeleteReusableDelegationSetRequest +DeleteRevisionRequest +DeleteRobotApplicationRequest +DeleteRobotRequest +DeleteRoleAliasRequest +DeleteRolePermissionsBoundaryRequest +DeleteRolePolicyRequest +DeleteRoleRequest +DeleteRoomMembershipRequest +DeleteRoomRequest +DeleteRoomSkillParameterRequest +DeleteRotationOverrideRequest +DeleteRotationRequest +DeleteRouteCalculatorRequest +DeleteRouteInput +DeleteRouteOutput +DeleteRouteRequest +DeleteRouteRequestParameterRequest +DeleteRouteResponse +DeleteRouteResponseRequest +DeleteRouteSettingsRequest +DeleteRouteTableRequest +DeleteRoutingControlRequest +DeleteRoutingProfileRequest +DeleteRuleGroupRequest +DeleteRuleGroupResponse +DeleteRuleGroupsNamespaceRequest +DeleteRuleInput +DeleteRuleRequest +DeleteRuleResponse +DeleteRulesetRequest +DeleteRulesetResponse +DeleteRumMetricsDestinationRequest +DeleteRunGroupRequest +DeleteRunRequest +DeleteSAMLProviderRequest +DeleteSMSSandboxPhoneNumberInput +DeleteSSHPublicKeyRequest +DeleteSafetyRuleRequest +DeleteSamplingRuleRequest +DeleteSamplingRuleResult +DeleteScalingPlanRequest +DeleteScalingPolicyInput +DeleteScalingPolicyRequest +DeleteSceneRequest +DeleteScheduleGroupInput +DeleteScheduleInput +DeleteScheduleRequest +DeleteScheduleResponse +DeleteScheduledActionMessage +DeleteScheduledActionRequest +DeleteScheduledActionType +DeleteScheduledAuditRequest +DeleteScheduledQueryRequest +DeleteSchedulingPolicyRequest +DeleteSchemaInput +DeleteSchemaMappingInput +DeleteSchemaMappingOutput +DeleteSchemaRequest +DeleteSchemaResponse +DeleteSchemaVersionRequest +DeleteSchemaVersionsInput +DeleteSchemaVersionsResponse +DeleteScriptInput +DeleteSecretRequest +DeleteSecretResponse +DeleteSecurityConfigRequest +DeleteSecurityConfigurationInput +DeleteSecurityConfigurationRequest +DeleteSecurityGroupRequest +DeleteSecurityPolicyRequest +DeleteSecurityProfileRequest +DeleteSegmentRequest +DeleteSegmentResponse +DeleteSequenceStoreRequest +DeleteServerCertificateRequest +DeleteServerRequest +DeleteServiceActionInput +DeleteServiceInput +DeleteServiceLinkedRoleRequest +DeleteServiceLinkedRoleResponse +DeleteServiceNetworkRequest +DeleteServiceNetworkServiceAssociationRequest +DeleteServiceNetworkServiceAssociationResponse +DeleteServiceNetworkVpcAssociationRequest +DeleteServiceNetworkVpcAssociationResponse +DeleteServiceOutput +DeleteServicePrincipalNameRequest +DeleteServiceProfileRequest +DeleteServiceQuotaIncreaseRequestFromTemplateRequest +DeleteServiceRequest +DeleteServiceResponse +DeleteServiceSpecificCredentialRequest +DeleteServiceSyncConfigInput +DeleteServiceSyncConfigOutput +DeleteServiceTemplateInput +DeleteServiceTemplateOutput +DeleteServiceTemplateVersionInput +DeleteServiceTemplateVersionOutput +DeleteSessionRequest +DeleteSessionResponse +DeleteShareRequest +DeleteShareResponse +DeleteSignalCatalogRequest +DeleteSignalCatalogResponse +DeleteSignalingChannelInput +DeleteSigningCertificateRequest +DeleteSimulationApplicationRequest +DeleteSimulationInput +DeleteSinkInput +DeleteSipMediaApplicationRequest +DeleteSipRuleRequest +DeleteSiteInput +DeleteSiteRequest +DeleteSiteResponse +DeleteSizeConstraintSetRequest +DeleteSizeConstraintSetResponse +DeleteSkillAuthorizationRequest +DeleteSkillGroupRequest +DeleteSlackChannelConfigurationRequest +DeleteSlackWorkspaceConfigurationRequest +DeleteSlotRequest +DeleteSlotTypeRequest +DeleteSlotTypeVersionRequest +DeleteSmsChannelRequest +DeleteSmsChannelResponse +DeleteSmsTemplateRequest +DeleteSmsTemplateResponse +DeleteSnapshotCopyGrantMessage +DeleteSnapshotMessage +DeleteSnapshotRequest +DeleteSnapshotResponse +DeleteSnapshotResult +DeleteSnapshotScheduleInput +DeleteSnapshotScheduleMessage +DeleteSnapshotScheduleOutput +DeleteSolFunctionPackageInput +DeleteSolNetworkInstanceInput +DeleteSolNetworkPackageInput +DeleteSolutionRequest +DeleteSourceBundle +DeleteSourceCredentialsInput +DeleteSourceCredentialsOutput +DeleteSourceFromS3 +DeleteSourceLocationRequest +DeleteSourceNetworkRequest +DeleteSourceRepositoryRequest +DeleteSourceRepositoryResponse +DeleteSourceServerRequest +DeleteSpaceRequest +DeleteSpaceResponse +DeleteSparqlStatisticsOutput +DeleteSpeakerRequest +DeleteSpotDatafeedSubscriptionRequest +DeleteSqlInjectionMatchSetRequest +DeleteSqlInjectionMatchSetResponse +DeleteSshPublicKeyRequest +DeleteStackInput +DeleteStackInstancesInput +DeleteStackInstancesOutput +DeleteStackRequest +DeleteStackSetInput +DeleteStageRequest +DeleteStateMachineAliasInput +DeleteStateMachineInput +DeleteStateMachineVersionInput +DeleteStatisticsValueMap +DeleteStepDetails +DeleteStorageConnectors +DeleteStorageLensConfigurationRequest +DeleteStorageLensConfigurationTaggingRequest +DeleteStorageVirtualMachineRequest +DeleteStorageVirtualMachineResponse +DeleteStoredQueryRequest +DeleteStreamInput +DeleteStreamKeyRequest +DeleteStreamProcessorRequest +DeleteStreamRequest +DeleteStreamingDistributionRequest +DeleteStreamingImageRequest +DeleteStreamingImageResponse +DeleteStreamingSessionRequest +DeleteStreamingSessionResponse +DeleteStudioComponentRequest +DeleteStudioComponentResponse +DeleteStudioInput +DeleteStudioLifecycleConfigRequest +DeleteStudioMemberRequest +DeleteStudioRequest +DeleteStudioResponse +DeleteStudioSessionMappingInput +DeleteSubnetCidrReservationRequest +DeleteSubnetCidrReservationResult +DeleteSubnetGroupRequest +DeleteSubnetGroupResponse +DeleteSubnetRequest +DeleteSubscriberNotificationRequest +DeleteSubscriberRequest +DeleteSubscriptionDefinitionRequest +DeleteSubscriptionFilterRequest +DeleteSuggesterRequest +DeleteSuggesterResponse +DeleteSuiteDefinitionRequest +DeleteSuppressedDestinationRequest +DeleteSyncJobRequest +DeleteSyncJobResponse +DeleteSystemInstanceRequest +DeleteSystemTemplateRequest +DeleteTLSInspectionConfigurationRequest +DeleteTLSInspectionConfigurationResponse +DeleteTableInput +DeleteTableOutput +DeleteTableRequest +DeleteTableVersionRequest +DeleteTagOptionInput +DeleteTagsForDomainRequest +DeleteTagsInput +DeleteTagsMessage +DeleteTagsOutput +DeleteTagsRequest +DeleteTagsType +DeleteTapeArchiveInput +DeleteTapeArchiveOutput +DeleteTapeInput +DeleteTapeOutput +DeleteTapePoolInput +DeleteTapePoolOutput +DeleteTarget +DeleteTargetGroupInput +DeleteTargetGroupRequest +DeleteTargetGroupResponse +DeleteTargetRequest +DeleteTaskDefinitionsRequest +DeleteTaskDefinitionsResponse +DeleteTaskRequest +DeleteTaskSetRequest +DeleteTaskSetResponse +DeleteTaskTemplateRequest +DeleteTemplateAliasRequest +DeleteTemplateAliasResponse +DeleteTemplateGroupAccessControlEntryRequest +DeleteTemplateRequest +DeleteTemplateResponse +DeleteTemplateSyncConfigInput +DeleteTemplateSyncConfigOutput +DeleteTerminologyRequest +DeleteTestGridProjectRequest +DeleteTestSetRequest +DeleteTextMessageSpendLimitOverrideResult +DeleteThemeAliasRequest +DeleteThemeAliasResponse +DeleteThemeRequest +DeleteThemeResponse +DeleteThesaurusRequest +DeleteThingGroupRequest +DeleteThingRequest +DeleteThingShadowRequest +DeleteThingShadowResponse +DeleteThingTypeRequest +DeleteThreatIntelSetRequest +DeleteTime +DeleteTimeSeriesRequest +DeleteTimelineEventInput +DeleteTimestamp +DeleteTokenRequest +DeleteTokenResponse +DeleteTopicInput +DeleteTopicRefreshScheduleRequest +DeleteTopicRefreshScheduleResponse +DeleteTopicRequest +DeleteTopicResponse +DeleteTopicRuleDestinationRequest +DeleteTopicRuleRequest +DeleteTrackerRequest +DeleteTrafficDistributionGroupRequest +DeleteTrafficMirrorFilterRequest +DeleteTrafficMirrorFilterResult +DeleteTrafficMirrorFilterRuleRequest +DeleteTrafficMirrorFilterRuleResult +DeleteTrafficMirrorSessionRequest +DeleteTrafficMirrorSessionResult +DeleteTrafficMirrorTargetRequest +DeleteTrafficMirrorTargetResult +DeleteTrafficPolicyInstanceRequest +DeleteTrafficPolicyRequest +DeleteTrailRequest +DeleteTranscriptionJobRequest +DeleteTransitGatewayConnectPeerRequest +DeleteTransitGatewayConnectPeerResult +DeleteTransitGatewayConnectRequest +DeleteTransitGatewayConnectResult +DeleteTransitGatewayMulticastDomainRequest +DeleteTransitGatewayMulticastDomainResult +DeleteTransitGatewayPeeringAttachmentRequest +DeleteTransitGatewayPeeringAttachmentResult +DeleteTransitGatewayPolicyTableRequest +DeleteTransitGatewayPolicyTableResult +DeleteTransitGatewayPrefixListReferenceRequest +DeleteTransitGatewayPrefixListReferenceResult +DeleteTransitGatewayRequest +DeleteTransitGatewayResult +DeleteTransitGatewayRouteRequest +DeleteTransitGatewayRouteResult +DeleteTransitGatewayRouteTableAnnouncementRequest +DeleteTransitGatewayRouteTableAnnouncementResult +DeleteTransitGatewayRouteTableRequest +DeleteTransitGatewayRouteTableResult +DeleteTransitGatewayVpcAttachmentRequest +DeleteTransitGatewayVpcAttachmentResult +DeleteTrialComponentRequest +DeleteTrialComponentResponse +DeleteTrialRequest +DeleteTrialResponse +DeleteTriggerRequest +DeleteTriggerResponse +DeleteTrustRequest +DeleteTrustResult +DeleteTrustStoreRequest +DeleteTypeRequest +DeleteTypedLinkFacetRequest +DeleteUnusedFMManagedResources +DeleteUploadRequest +DeleteUsageLimitMessage +DeleteUsageLimitRequest +DeleteUsageLimitResponse +DeleteUsagePlanKeyRequest +DeleteUsagePlanRequest +DeleteUseCaseRequest +DeleteUserAccessLoggingSettingsRequest +DeleteUserAttributesRequest +DeleteUserByPrincipalIdRequest +DeleteUserByPrincipalIdResponse +DeleteUserDefinedFunctionRequest +DeleteUserEndpointsRequest +DeleteUserEndpointsResponse +DeleteUserGroupMessage +DeleteUserHierarchyGroupRequest +DeleteUserMessage +DeleteUserPermissionsBoundaryRequest +DeleteUserPolicyRequest +DeleteUserPoolClientRequest +DeleteUserPoolDomainRequest +DeleteUserPoolRequest +DeleteUserProfileRequest +DeleteUserProfileResult +DeleteUserRequest +DeleteUserResponse +DeleteUserSettingsRequest +DeleteUtterancesRequest +DeleteV2LoggingLevelRequest +DeleteVPCAssociationAuthorizationRequest +DeleteVPCConnectionRequest +DeleteVPCConnectionResponse +DeleteVPCEConfigurationRequest +DeleteVariableRequest +DeleteVariantStoreRequest +DeleteVariantStoreResponse +DeleteVaultAccessPolicyInput +DeleteVaultInput +DeleteVaultNotificationsInput +DeleteVcenterClientRequest +DeleteVectorEnrichmentJobInput +DeleteVehicleRequest +DeleteVehicleResponse +DeleteVerifiedAccessEndpointRequest +DeleteVerifiedAccessEndpointResult +DeleteVerifiedAccessGroupRequest +DeleteVerifiedAccessGroupResult +DeleteVerifiedAccessInstanceRequest +DeleteVerifiedAccessInstanceResult +DeleteVerifiedAccessTrustProviderRequest +DeleteVerifiedAccessTrustProviderResult +DeleteVerifiedEmailAddressRequest +DeleteViewInput +DeleteViewOutput +DeleteViewRequest +DeleteViewVersionRequest +DeleteVirtualClusterRequest +DeleteVirtualClusterResponse +DeleteVirtualGatewayInput +DeleteVirtualGatewayOutput +DeleteVirtualInterfaceRequest +DeleteVirtualInterfaceResponse +DeleteVirtualMFADeviceRequest +DeleteVirtualNodeInput +DeleteVirtualNodeOutput +DeleteVirtualRouterInput +DeleteVirtualRouterOutput +DeleteVirtualServiceInput +DeleteVirtualServiceOutput +DeleteVocabularyFilterRequest +DeleteVocabularyRequest +DeleteVocabularyResponse +DeleteVodSourceRequest +DeleteVoiceChannelRequest +DeleteVoiceChannelResponse +DeleteVoiceConnectorEmergencyCallingConfigurationRequest +DeleteVoiceConnectorGroupRequest +DeleteVoiceConnectorOriginationRequest +DeleteVoiceConnectorProxyRequest +DeleteVoiceConnectorRequest +DeleteVoiceConnectorStreamingConfigurationRequest +DeleteVoiceConnectorTerminationCredentialsRequest +DeleteVoiceConnectorTerminationRequest +DeleteVoiceMessageSpendLimitOverrideResult +DeleteVoiceProfileDomainRequest +DeleteVoiceProfileRequest +DeleteVoiceTemplateRequest +DeleteVoiceTemplateResponse +DeleteVolumeInput +DeleteVolumeOntapConfiguration +DeleteVolumeOntapResponse +DeleteVolumeOpenZFSConfiguration +DeleteVolumeOutput +DeleteVolumeRequest +DeleteVolumeResponse +DeleteVolumes +DeleteVpcConfig +DeleteVpcConnectionRequest +DeleteVpcConnectionResponse +DeleteVpcConnectorRequest +DeleteVpcConnectorResponse +DeleteVpcEndpointConnectionNotificationsRequest +DeleteVpcEndpointConnectionNotificationsResult +DeleteVpcEndpointDetail +DeleteVpcEndpointRequest +DeleteVpcEndpointResponse +DeleteVpcEndpointServiceConfigurationsRequest +DeleteVpcEndpointServiceConfigurationsResult +DeleteVpcEndpointsRequest +DeleteVpcEndpointsResult +DeleteVpcIngressConnectionRequest +DeleteVpcIngressConnectionResponse +DeleteVpcLinkRequest +DeleteVpcPeeringAuthorizationInput +DeleteVpcPeeringConnectionInput +DeleteVpcPeeringConnectionRequest +DeleteVpcPeeringConnectionResult +DeleteVpcRequest +DeleteVpnConnectionRequest +DeleteVpnConnectionRouteRequest +DeleteVpnGatewayRequest +DeleteWarmPoolType +DeleteWatchlistRequest +DeleteWaveRequest +DeleteWebACLRequest +DeleteWebACLResponse +DeleteWebhookInput +DeleteWebhookRequest +DeleteWebhookResult +DeleteWhatIfAnalysisRequest +DeleteWhatIfForecastExportRequest +DeleteWhatIfForecastRequest +DeleteWirelessDeviceImportTaskRequest +DeleteWirelessDeviceRequest +DeleteWirelessGatewayRequest +DeleteWirelessGatewayTaskDefinitionRequest +DeleteWirelessGatewayTaskRequest +DeleteWorkGroupInput +DeleteWorkerBlockRequest +DeleteWorkerFleetRequest +DeleteWorkerRequest +DeleteWorkflowRequest +DeleteWorkflowResponse +DeleteWorkflowStepGroupRequest +DeleteWorkflowStepRequest +DeleteWorkforceRequest +DeleteWorkgroupRequest +DeleteWorkgroupResponse +DeleteWorkloadInput +DeleteWorkloadShareInput +DeleteWorkspaceApiKeyRequest +DeleteWorkspaceApiKeyResponse +DeleteWorkspaceBundleRequest +DeleteWorkspaceImageRequest +DeleteWorkspaceRequest +DeleteWorkspaceResponse +DeleteWorkteamRequest +DeleteWorkteamResponse +DeleteWorldTemplateRequest +DeleteXssMatchSetRequest +DeleteXssMatchSetResponse +Deleted +DeletedAt +DeletedDate +DeletedFaces +DeletedObject +DeletedParameters +DeletedSubnetCidrReservation +Deletes +DeletionConfig +DeletionDate +DeletionId +DeletionMessage +DeletionMode +DeletionProtection +DeletionProtectionEnabled +DeletionStartTime +DeletionStatus +DeletionSummary +DeletionTaskFailureReasonType +DeletionTaskId +DeletionTime +DeletionTimestamp +DelimitedTextImportOptions +Delimiter +DeliverConfigSnapshotRequest +DeliverConfigSnapshotResponse +DeliverCrossAccountRole +DeliverLogsErrorMessage +DeliverLogsPermissionArn +DeliverLogsStatus +DeliverabilityTestReport +DeliverabilityTestReports +DeliverabilityTestStatus +DeliveredTimestamp +DeliveryAddress +DeliveryAttempts +DeliveryChannel +DeliveryChannelName +DeliveryChannelNames +DeliveryChannelStatus +DeliveryChannels +DeliveryChannelsStatus +DeliveryMedium +DeliveryMethod +DeliveryOptions +DeliveryRestrictions +DeliveryS3Bucket +DeliveryS3KeyPrefix +DeliveryS3Uri +DeliveryStartTimestamp +DeliveryStatus +DeliveryStream +DeliveryStreamARN +DeliveryStreamArn +DeliveryStreamDescription +DeliveryStreamEncryptionConfiguration +DeliveryStreamEncryptionConfigurationInput +DeliveryStreamName +DeliveryStreamNames +DeliveryStreamStatus +DeliveryStreamType +DeliveryTime +DeliveryTimedOutCount +DeliveryTopic +DeliveryUri +DeltaSyncConfig +DeltaTables +DeltaTarget +DeltaTargets +DeltaTime +DeltaTimeSessionWindowConfiguration +DemodulationConfig +Demographic +Denied +DenoiseFilter +DenyAllIgwTraffic +DenyAllTrafficToEndpoint +DenyCustomRoutingTrafficRequest +DepartNow +Department +DeparturePosition +DeparturePositions +DepartureTime +Dependencies +DependencyAccessDeniedException +DependencyCopyPath +DependencyException +DependencyFailedException +DependencyFailureException +DependencyOriginPath +DependencyRevision +DependencyThrottleException +DependencyTimeout +DependencyTimeoutException +DependentEntities +DependentEntity +DependentJobName +DependentResourceIds +DependentService +DependentServiceFailureException +DependentServiceRequestThrottlingFault +DependentServiceUnavailableFault +DependentServices +DependsOn +Deploy +DeployAsApplicationConfiguration +DeployAsApplicationConfigurationDescription +DeployAsApplicationConfigurationUpdate +DeploySystemInstanceRequest +DeploySystemInstanceResponse +Deployed +DeployedImage +DeployedImages +DeployedStageName +DeployedVersionSummary +Deployment +DeploymentAction +DeploymentAlarms +DeploymentAlreadyCompletedException +DeploymentApplicationConfig +DeploymentArn +DeploymentCanarySettings +DeploymentCircuitBreaker +DeploymentCommand +DeploymentComponentUpdatePolicy +DeploymentConfig +DeploymentConfigAlreadyExistsException +DeploymentConfigDoesNotExistException +DeploymentConfigInUseException +DeploymentConfigInfo +DeploymentConfigLimitExceededException +DeploymentConfigNameRequiredException +DeploymentConfiguration +DeploymentConfigurationValidationPolicy +DeploymentController +DeploymentDoesNotExistException +DeploymentDurationInMinutes +DeploymentEndTime +DeploymentEvent +DeploymentGroupAlreadyExistsException +DeploymentGroupDoesNotExistException +DeploymentGroupInfo +DeploymentGroupLimitExceededException +DeploymentGroupNameRequiredException +DeploymentId +DeploymentIdRequiredException +DeploymentIds +DeploymentInfo +DeploymentIoTJobConfiguration +DeploymentIsNotInReadyStateException +DeploymentJob +DeploymentLaunchConfig +DeploymentLimitExceededException +DeploymentMode +DeploymentModel +DeploymentModels +DeploymentName +DeploymentNotStartedException +DeploymentNumber +DeploymentOption +DeploymentOverview +DeploymentPolicies +DeploymentReadyOption +DeploymentRecommendation +DeploymentResult +DeploymentStage +DeploymentStageStatusSummary +DeploymentStartTime +DeploymentState +DeploymentStatus +DeploymentStatusMessage +DeploymentStrategies +DeploymentStrategy +DeploymentStrategyId +DeploymentStyle +DeploymentSummary +DeploymentTarget +DeploymentTargetDoesNotExistException +DeploymentTargetIdRequiredException +DeploymentTargetListSizeExceededException +DeploymentTargets +DeploymentTime +DeploymentType +Deployments +DeprecateActivityTypeInput +DeprecateAt +DeprecateDomainInput +DeprecateFlowTemplateRequest +DeprecateRule +DeprecateSystemTemplateRequest +DeprecateThingTypeRequest +DeprecateWorkflowTypeInput +DeprecatedStatus +DeprecationDate +DeprecationTime +DeprovisionByoipCidrRequest +DeprovisionByoipCidrResponse +DeprovisionByoipCidrResult +DeprovisionIpamPoolCidrRequest +DeprovisionIpamPoolCidrResult +DeprovisionPublicIpv4PoolCidrRequest +DeprovisionPublicIpv4PoolCidrResult +DeprovisionedAddresses +DeregisterAccountResponse +DeregisterAppInstanceUserEndpointRequest +DeregisterApplicationInput +DeregisterCertificateRequest +DeregisterClusterRequest +DeregisterClusterResponse +DeregisterComputeInput +DeregisterContainerInstanceRequest +DeregisterContainerInstanceResponse +DeregisterDBProxyTargetsRequest +DeregisterDelegatedAdministratorRequest +DeregisterDevicesRequest +DeregisterEcsClusterRequest +DeregisterElasticIpRequest +DeregisterEndPointsInput +DeregisterEndPointsOutput +DeregisterEventTopicRequest +DeregisterFromWorkMailRequest +DeregisterGameServerInput +DeregisterGatewayInstanceRequest +DeregisterGatewayInstanceResponse +DeregisterIdentityProviderRequest +DeregisterIdentityProviderResponse +DeregisterImageRequest +DeregisterInstanceEventNotificationAttributesRequest +DeregisterInstanceEventNotificationAttributesResult +DeregisterInstanceRequest +DeregisterInstanceResponse +DeregisterInstanceTagAttributeRequest +DeregisterJobDefinitionRequest +DeregisterMailDomainRequest +DeregisterManagedInstanceRequest +DeregisterOnPremisesInstanceInput +DeregisterOrganizationAdminAccountRequest +DeregisterOrganizationDelegatedAdminRequest +DeregisterPackageVersionRequest +DeregisterPatchBaselineForPatchGroupRequest +DeregisterPatchBaselineForPatchGroupResult +DeregisterRdsDbInstanceRequest +DeregisterResourceRequest +DeregisterRobotRequest +DeregisterRobotResponse +DeregisterScalableTargetRequest +DeregisterStreamConsumerInput +DeregisterTargetFromMaintenanceWindowRequest +DeregisterTargetFromMaintenanceWindowResult +DeregisterTargetsInput +DeregisterTargetsRequest +DeregisterTargetsResponse +DeregisterTaskDefinitionRequest +DeregisterTaskDefinitionResponse +DeregisterTaskFromMaintenanceWindowRequest +DeregisterTaskFromMaintenanceWindowResult +DeregisterTransitGatewayMulticastGroupMembersRequest +DeregisterTransitGatewayMulticastGroupMembersResult +DeregisterTransitGatewayMulticastGroupSourcesRequest +DeregisterTransitGatewayMulticastGroupSourcesResult +DeregisterTransitGatewayRequest +DeregisterTransitGatewayResponse +DeregisterTypeInput +DeregisterVolumeRequest +DeregisterWebhookWithThirdPartyInput +DeregisterWirelessDeviceRequest +DeregisterWorkspaceDirectoryRequest +DeregisteredMulticastGroupMembers +DeregisteredMulticastGroupSources +DeregisteredNetworkInterfaceIds +Deregistering +DeregistrationPolicy +DeriveKey +DerivedDataInputConfig +DerivedInformation +DescribeACLsRequest +DescribeACLsResponse +DescribeAcceleratorAttributesRequest +DescribeAcceleratorAttributesResponse +DescribeAcceleratorOfferingsRequest +DescribeAcceleratorOfferingsResponse +DescribeAcceleratorRequest +DescribeAcceleratorResponse +DescribeAcceleratorTypesResponse +DescribeAcceleratorsRequest +DescribeAcceleratorsResponse +DescribeAccessControlConfigurationRequest +DescribeAccessControlConfigurationResponse +DescribeAccessPointsInput +DescribeAccessPointsOutput +DescribeAccessPointsRequest +DescribeAccessPointsResponse +DescribeAccessPolicyRequest +DescribeAccessPolicyResponse +DescribeAccessRequest +DescribeAccessResponse +DescribeAccountAssignmentCreationStatusRequest +DescribeAccountAssignmentCreationStatusResponse +DescribeAccountAssignmentDeletionStatusRequest +DescribeAccountAssignmentDeletionStatusResponse +DescribeAccountAttributesMessage +DescribeAccountAttributesRequest +DescribeAccountAttributesResponse +DescribeAccountAttributesResult +DescribeAccountAuditConfigurationResponse +DescribeAccountConfigurationResponse +DescribeAccountCustomizationRequest +DescribeAccountCustomizationResponse +DescribeAccountHealthResponse +DescribeAccountLimitsAnswer +DescribeAccountLimitsInput +DescribeAccountLimitsOutput +DescribeAccountLimitsRequest +DescribeAccountLimitsResult +DescribeAccountModificationsRequest +DescribeAccountModificationsResult +DescribeAccountOverviewRequest +DescribeAccountOverviewResponse +DescribeAccountPoliciesRequest +DescribeAccountPoliciesResponse +DescribeAccountPreferencesRequest +DescribeAccountPreferencesResponse +DescribeAccountRequest +DescribeAccountResponse +DescribeAccountResult +DescribeAccountSettingsRequest +DescribeAccountSettingsResponse +DescribeAccountSubscriptionRequest +DescribeAccountSubscriptionResponse +DescribeActionRequest +DescribeActionResponse +DescribeActionTargetsRequest +DescribeActionTargetsResponse +DescribeActivationsFilter +DescribeActivationsRequest +DescribeActivationsResult +DescribeActiveReceiptRuleSetResponse +DescribeActivitiesRequest +DescribeActivitiesResponse +DescribeActivityInput +DescribeActivityOutput +DescribeActivityTypeInput +DescribeAddonConfigurationRequest +DescribeAddonConfigurationResponse +DescribeAddonRequest +DescribeAddonResponse +DescribeAddonVersionsRequest +DescribeAddonVersionsResponse +DescribeAddressRequest +DescribeAddressResult +DescribeAddressTransfersRequest +DescribeAddressTransfersResult +DescribeAddressesAttributeRequest +DescribeAddressesAttributeResult +DescribeAddressesRequest +DescribeAddressesResult +DescribeAdjustmentTypesAnswer +DescribeAffectedAccountsForOrganizationRequest +DescribeAffectedAccountsForOrganizationResponse +DescribeAffectedEntitiesForOrganizationRequest +DescribeAffectedEntitiesForOrganizationResponse +DescribeAffectedEntitiesRequest +DescribeAffectedEntitiesResponse +DescribeAgentRequest +DescribeAgentResponse +DescribeAgentStatusRequest +DescribeAgentStatusResponse +DescribeAgentVersionsRequest +DescribeAgentVersionsResult +DescribeAgentsRequest +DescribeAgentsResponse +DescribeAggregateComplianceByConfigRulesRequest +DescribeAggregateComplianceByConfigRulesResponse +DescribeAggregateComplianceByConformancePacksRequest +DescribeAggregateComplianceByConformancePacksResponse +DescribeAggregateIdFormatRequest +DescribeAggregateIdFormatResult +DescribeAggregationAuthorizationsRequest +DescribeAggregationAuthorizationsResponse +DescribeAgreementRequest +DescribeAgreementResponse +DescribeAlarmHistoryInput +DescribeAlarmHistoryOutput +DescribeAlarmModelRequest +DescribeAlarmModelResponse +DescribeAlarmRequest +DescribeAlarmResponse +DescribeAlarmsForMetricInput +DescribeAlarmsForMetricOutput +DescribeAlarmsInput +DescribeAlarmsOutput +DescribeAlertManagerDefinitionRequest +DescribeAlertManagerDefinitionResponse +DescribeAlertRequest +DescribeAlertResponse +DescribeAlgorithmInput +DescribeAlgorithmOutput +DescribeAlgorithmRequest +DescribeAlgorithmResponse +DescribeAliasInput +DescribeAliasOutput +DescribeAllManagedProductsRequest +DescribeAllManagedProductsResponse +DescribeAnalysisDefinitionRequest +DescribeAnalysisDefinitionResponse +DescribeAnalysisPermissionsRequest +DescribeAnalysisPermissionsResponse +DescribeAnalysisRequest +DescribeAnalysisResponse +DescribeAnalysisSchemesRequest +DescribeAnalysisSchemesResponse +DescribeAnomalyDetectionExecutionsRequest +DescribeAnomalyDetectionExecutionsResponse +DescribeAnomalyDetectorRequest +DescribeAnomalyDetectorResponse +DescribeAnomalyDetectorsInput +DescribeAnomalyDetectorsOutput +DescribeAnomalyRequest +DescribeAnomalyResponse +DescribeApiDestinationRequest +DescribeApiDestinationResponse +DescribeAppAssessmentRequest +DescribeAppAssessmentResponse +DescribeAppBlockBuilderAppBlockAssociationsRequest +DescribeAppBlockBuilderAppBlockAssociationsResult +DescribeAppBlockBuildersRequest +DescribeAppBlockBuildersResult +DescribeAppBlocksRequest +DescribeAppBlocksResult +DescribeAppImageConfigRequest +DescribeAppImageConfigResponse +DescribeAppInput +DescribeAppInstanceAdminRequest +DescribeAppInstanceAdminResponse +DescribeAppInstanceBotRequest +DescribeAppInstanceBotResponse +DescribeAppInstanceRequest +DescribeAppInstanceResponse +DescribeAppInstanceUserEndpointRequest +DescribeAppInstanceUserEndpointResponse +DescribeAppInstanceUserRequest +DescribeAppInstanceUserResponse +DescribeAppOutput +DescribeAppRequest +DescribeAppResponse +DescribeAppVersionAppComponentRequest +DescribeAppVersionAppComponentResponse +DescribeAppVersionRequest +DescribeAppVersionResourceRequest +DescribeAppVersionResourceResponse +DescribeAppVersionResourcesResolutionStatusRequest +DescribeAppVersionResourcesResolutionStatusResponse +DescribeAppVersionResponse +DescribeAppVersionTemplateRequest +DescribeAppVersionTemplateResponse +DescribeApplicableIndividualAssessmentsMessage +DescribeApplicableIndividualAssessmentsResponse +DescribeApplicationFleetAssociationsRequest +DescribeApplicationFleetAssociationsResult +DescribeApplicationInstanceDetailsRequest +DescribeApplicationInstanceDetailsResponse +DescribeApplicationInstanceRequest +DescribeApplicationInstanceResponse +DescribeApplicationRequest +DescribeApplicationResponse +DescribeApplicationSnapshotRequest +DescribeApplicationSnapshotResponse +DescribeApplicationStateRequest +DescribeApplicationStateResult +DescribeApplicationVersionRequest +DescribeApplicationVersionResponse +DescribeApplicationVersionsMessage +DescribeApplicationsMessage +DescribeApplicationsRequest +DescribeApplicationsResult +DescribeAppsRequest +DescribeAppsResult +DescribeArchiveRequest +DescribeArchiveResponse +DescribeArtifactRequest +DescribeArtifactResponse +DescribeAssessmentRunsRequest +DescribeAssessmentRunsResponse +DescribeAssessmentTargetsRequest +DescribeAssessmentTargetsResponse +DescribeAssessmentTemplatesRequest +DescribeAssessmentTemplatesResponse +DescribeAssetBundleExportJobRequest +DescribeAssetBundleExportJobResponse +DescribeAssetBundleImportJobRequest +DescribeAssetBundleImportJobResponse +DescribeAssetModelRequest +DescribeAssetModelResponse +DescribeAssetPropertyRequest +DescribeAssetPropertyResponse +DescribeAssetRequest +DescribeAssetResponse +DescribeAssociationExecutionTargetsRequest +DescribeAssociationExecutionTargetsResult +DescribeAssociationExecutionsRequest +DescribeAssociationExecutionsResult +DescribeAssociationRequest +DescribeAssociationResult +DescribeAttachmentLimitExceeded +DescribeAttachmentRequest +DescribeAttachmentResponse +DescribeAttackRequest +DescribeAttackResponse +DescribeAttackStatisticsResponse +DescribeAuditFindingRequest +DescribeAuditFindingResponse +DescribeAuditMitigationActionsTaskRequest +DescribeAuditMitigationActionsTaskResponse +DescribeAuditStreamConfigurationRequest +DescribeAuditStreamConfigurationResponse +DescribeAuditSuppressionRequest +DescribeAuditSuppressionResponse +DescribeAuditTaskRequest +DescribeAuditTaskResponse +DescribeAuthenticationProfilesMessage +DescribeAuthenticationProfilesResult +DescribeAuthorizerRequest +DescribeAuthorizerResponse +DescribeAutoMLJobRequest +DescribeAutoMLJobResponse +DescribeAutoMLJobV2Request +DescribeAutoMLJobV2Response +DescribeAutoPredictorRequest +DescribeAutoPredictorResponse +DescribeAutoScalingConfigurationRequest +DescribeAutoScalingConfigurationResponse +DescribeAutoScalingInstancesType +DescribeAutoScalingNotificationTypesAnswer +DescribeAutomationExecutionsRequest +DescribeAutomationExecutionsResult +DescribeAutomationStepExecutionsRequest +DescribeAutomationStepExecutionsResult +DescribeAvailabilityMonitorTestInput +DescribeAvailabilityMonitorTestOutput +DescribeAvailabilityOptionsRequest +DescribeAvailabilityOptionsResponse +DescribeAvailabilityZonesRequest +DescribeAvailabilityZonesResult +DescribeAvailablePatchesRequest +DescribeAvailablePatchesResult +DescribeAwsNetworkPerformanceMetricSubscriptionsRequest +DescribeAwsNetworkPerformanceMetricSubscriptionsResult +DescribeBackupInput +DescribeBackupJobInput +DescribeBackupJobOutput +DescribeBackupOutput +DescribeBackupPolicyRequest +DescribeBackupVaultInput +DescribeBackupVaultOutput +DescribeBackupsRequest +DescribeBackupsResponse +DescribeBandwidthRateLimitInput +DescribeBandwidthRateLimitOutput +DescribeBandwidthRateLimitScheduleInput +DescribeBandwidthRateLimitScheduleOutput +DescribeBatchInferenceJobRequest +DescribeBatchInferenceJobResponse +DescribeBatchLoadTaskRequest +DescribeBatchLoadTaskResponse +DescribeBatchPredictionsInput +DescribeBatchPredictionsOutput +DescribeBatchSegmentJobRequest +DescribeBatchSegmentJobResponse +DescribeBillingGroupRequest +DescribeBillingGroupResponse +DescribeBlueGreenDeploymentsRequest +DescribeBlueGreenDeploymentsResponse +DescribeBotAliasRequest +DescribeBotAliasResponse +DescribeBotLocaleRequest +DescribeBotLocaleResponse +DescribeBotRecommendationRequest +DescribeBotRecommendationResponse +DescribeBotRequest +DescribeBotResponse +DescribeBotVersionRequest +DescribeBotVersionResponse +DescribeBridgeRequest +DescribeBridgeResponse +DescribeBrokerEngineTypesRequest +DescribeBrokerEngineTypesResponse +DescribeBrokerInstanceOptionsRequest +DescribeBrokerInstanceOptionsResponse +DescribeBrokerRequest +DescribeBrokerResponse +DescribeBucketsRequest +DescribeBucketsResponse +DescribeBudgetActionHistoriesRequest +DescribeBudgetActionHistoriesResponse +DescribeBudgetActionRequest +DescribeBudgetActionResponse +DescribeBudgetActionsForAccountRequest +DescribeBudgetActionsForAccountResponse +DescribeBudgetActionsForBudgetRequest +DescribeBudgetActionsForBudgetResponse +DescribeBudgetNotificationsForAccountRequest +DescribeBudgetNotificationsForAccountResponse +DescribeBudgetPerformanceHistoryRequest +DescribeBudgetPerformanceHistoryResponse +DescribeBudgetRequest +DescribeBudgetResponse +DescribeBudgetsRequest +DescribeBudgetsResponse +DescribeBuildInput +DescribeBuildOutput +DescribeBulkImportJobRequest +DescribeBulkImportJobResponse +DescribeBundleRequest +DescribeBundleResult +DescribeBundleTasksRequest +DescribeBundleTasksResult +DescribeByoipCidrsRequest +DescribeByoipCidrsResult +DescribeCACertificateRequest +DescribeCACertificateResponse +DescribeCacheClustersMessage +DescribeCacheEngineVersionsMessage +DescribeCacheInput +DescribeCacheOutput +DescribeCacheParameterGroupsMessage +DescribeCacheParametersMessage +DescribeCacheSecurityGroupsMessage +DescribeCacheSubnetGroupsMessage +DescribeCachediSCSIVolumesInput +DescribeCachediSCSIVolumesOutput +DescribeCampaignRequest +DescribeCampaignResponse +DescribeCanariesLastRunRequest +DescribeCanariesLastRunResponse +DescribeCanariesRequest +DescribeCanariesResponse +DescribeCapacityProvidersRequest +DescribeCapacityProvidersResponse +DescribeCapacityReservationFleetsRequest +DescribeCapacityReservationFleetsResult +DescribeCapacityReservationsRequest +DescribeCapacityReservationsResult +DescribeCarrierGatewaysRequest +DescribeCarrierGatewaysResult +DescribeCasesRequest +DescribeCasesResponse +DescribeCertificateAuthorityAuditReportRequest +DescribeCertificateAuthorityAuditReportResponse +DescribeCertificateAuthorityRequest +DescribeCertificateAuthorityResponse +DescribeCertificateRequest +DescribeCertificateResponse +DescribeCertificateResult +DescribeCertificatesMessage +DescribeCertificatesResponse +DescribeChangeSetHooksInput +DescribeChangeSetHooksOutput +DescribeChangeSetInput +DescribeChangeSetOutput +DescribeChangeSetRequest +DescribeChangeSetResponse +DescribeChannelBanRequest +DescribeChannelBanResponse +DescribeChannelFlowRequest +DescribeChannelFlowResponse +DescribeChannelMembershipForAppInstanceUserRequest +DescribeChannelMembershipForAppInstanceUserResponse +DescribeChannelMembershipRequest +DescribeChannelMembershipResponse +DescribeChannelModeratedByAppInstanceUserRequest +DescribeChannelModeratedByAppInstanceUserResponse +DescribeChannelModeratorRequest +DescribeChannelModeratorResponse +DescribeChannelRequest +DescribeChannelResponse +DescribeChapCredentialsInput +DescribeChapCredentialsOutput +DescribeClassicLinkInstancesRequest +DescribeClassicLinkInstancesResult +DescribeClassificationJobRequest +DescribeClassificationJobResponse +DescribeClientAuthenticationSettingsRequest +DescribeClientAuthenticationSettingsResult +DescribeClientBrandingRequest +DescribeClientBrandingResult +DescribeClientPropertiesRequest +DescribeClientPropertiesResult +DescribeClientVpnAuthorizationRulesRequest +DescribeClientVpnAuthorizationRulesResult +DescribeClientVpnConnectionsRequest +DescribeClientVpnConnectionsResult +DescribeClientVpnEndpointsRequest +DescribeClientVpnEndpointsResult +DescribeClientVpnRoutesRequest +DescribeClientVpnRoutesResult +DescribeClientVpnTargetNetworksRequest +DescribeClientVpnTargetNetworksResult +DescribeClusterDbRevisionsMessage +DescribeClusterInput +DescribeClusterOperationRequest +DescribeClusterOperationResponse +DescribeClusterOperationV2Request +DescribeClusterOperationV2Response +DescribeClusterOutput +DescribeClusterParameterGroupsMessage +DescribeClusterParametersMessage +DescribeClusterRequest +DescribeClusterResponse +DescribeClusterResult +DescribeClusterSecurityGroupsMessage +DescribeClusterSnapshotsMessage +DescribeClusterSubnetGroupsMessage +DescribeClusterTracksMessage +DescribeClusterV2Request +DescribeClusterV2Response +DescribeClusterVersionsMessage +DescribeClustersMessage +DescribeClustersRequest +DescribeClustersResponse +DescribeCodeBindingRequest +DescribeCodeBindingResponse +DescribeCodeCoveragesInput +DescribeCodeCoveragesOutput +DescribeCodeRepositoryInput +DescribeCodeRepositoryOutput +DescribeCodeReviewRequest +DescribeCodeReviewResponse +DescribeCoipPoolsRequest +DescribeCoipPoolsResult +DescribeCollectionRequest +DescribeCollectionResponse +DescribeCommandsRequest +DescribeCommandsResult +DescribeCommentsRequest +DescribeCommentsResponse +DescribeCommunicationsRequest +DescribeCommunicationsResponse +DescribeCompanyNetworkConfigurationRequest +DescribeCompanyNetworkConfigurationResponse +DescribeCompilationJobRequest +DescribeCompilationJobResponse +DescribeComplianceByConfigRuleRequest +DescribeComplianceByConfigRuleResponse +DescribeComplianceByResourceRequest +DescribeComplianceByResourceResponse +DescribeComponentConfigurationRecommendationRequest +DescribeComponentConfigurationRecommendationResponse +DescribeComponentConfigurationRequest +DescribeComponentConfigurationResponse +DescribeComponentRequest +DescribeComponentResponse +DescribeComputeEnvironmentsRequest +DescribeComputeEnvironmentsResponse +DescribeComputeInput +DescribeComputeOutput +DescribeConditionalForwardersRequest +DescribeConditionalForwardersResult +DescribeConfigRuleEvaluationStatusRequest +DescribeConfigRuleEvaluationStatusResponse +DescribeConfigRulesFilters +DescribeConfigRulesRequest +DescribeConfigRulesResponse +DescribeConfigurationAggregatorSourcesStatusRequest +DescribeConfigurationAggregatorSourcesStatusResponse +DescribeConfigurationAggregatorsRequest +DescribeConfigurationAggregatorsResponse +DescribeConfigurationOptionsMessage +DescribeConfigurationRecorderStatusRequest +DescribeConfigurationRecorderStatusResponse +DescribeConfigurationRecordersRequest +DescribeConfigurationRecordersResponse +DescribeConfigurationRequest +DescribeConfigurationResponse +DescribeConfigurationRevisionRequest +DescribeConfigurationRevisionResponse +DescribeConfigurationSetRequest +DescribeConfigurationSetResponse +DescribeConfigurationSetsRequest +DescribeConfigurationSetsResult +DescribeConfigurationSettingsMessage +DescribeConfigurationsRequest +DescribeConfigurationsResponse +DescribeConformancePackComplianceRequest +DescribeConformancePackComplianceResponse +DescribeConformancePackStatusRequest +DescribeConformancePackStatusResponse +DescribeConformancePacksRequest +DescribeConformancePacksResponse +DescribeConnectClientAddInsRequest +DescribeConnectClientAddInsResult +DescribeConnectionAliasPermissionsRequest +DescribeConnectionAliasPermissionsResult +DescribeConnectionAliasesRequest +DescribeConnectionAliasesResult +DescribeConnectionLoaRequest +DescribeConnectionLoaResponse +DescribeConnectionRequest +DescribeConnectionResponse +DescribeConnectionsMessage +DescribeConnectionsOnInterconnectRequest +DescribeConnectionsRequest +DescribeConnectionsResponse +DescribeConnectorEntityRequest +DescribeConnectorEntityResponse +DescribeConnectorProfilesRequest +DescribeConnectorProfilesResponse +DescribeConnectorRequest +DescribeConnectorResponse +DescribeConnectorsRequest +DescribeConnectorsResponse +DescribeConstraintInput +DescribeConstraintOutput +DescribeContactEvaluationRequest +DescribeContactEvaluationResponse +DescribeContactFlowModuleRequest +DescribeContactFlowModuleResponse +DescribeContactFlowRequest +DescribeContactFlowResponse +DescribeContactRequest +DescribeContactResponse +DescribeContainerInput +DescribeContainerInstancesRequest +DescribeContainerInstancesResponse +DescribeContainerOutput +DescribeContextRequest +DescribeContextResponse +DescribeContinuousBackupsInput +DescribeContinuousBackupsOutput +DescribeContinuousExportsRequest +DescribeContinuousExportsResponse +DescribeContributorInsightsInput +DescribeContributorInsightsOutput +DescribeControlPanelRequest +DescribeControlPanelResponse +DescribeConversionConfigurationMessage +DescribeConversionConfigurationResponse +DescribeConversionTasksRequest +DescribeConversionTasksResult +DescribeCopyJobInput +DescribeCopyJobOutput +DescribeCopyProductStatusInput +DescribeCopyProductStatusOutput +DescribeCostCategoryDefinitionRequest +DescribeCostCategoryDefinitionResponse +DescribeCreateAccountStatusRequest +DescribeCreateAccountStatusResponse +DescribeCreateCaseOptionsRequest +DescribeCreateCaseOptionsResponse +DescribeCrossAccountAccessRoleResponse +DescribeCustomDomainAssociationsMessage +DescribeCustomDomainsRequest +DescribeCustomDomainsResponse +DescribeCustomKeyStoresRequest +DescribeCustomKeyStoresResponse +DescribeCustomMetricRequest +DescribeCustomMetricResponse +DescribeCustomPluginRequest +DescribeCustomPluginResponse +DescribeCustomRoutingAcceleratorAttributesRequest +DescribeCustomRoutingAcceleratorAttributesResponse +DescribeCustomRoutingAcceleratorRequest +DescribeCustomRoutingAcceleratorResponse +DescribeCustomRoutingEndpointGroupRequest +DescribeCustomRoutingEndpointGroupResponse +DescribeCustomRoutingListenerRequest +DescribeCustomRoutingListenerResponse +DescribeCustomVocabularyMetadataRequest +DescribeCustomVocabularyMetadataResponse +DescribeCustomerGatewaysRequest +DescribeCustomerGatewaysResult +DescribeCustomerMetadataResponse +DescribeDBClusterAutomatedBackupsMessage +DescribeDBClusterBacktracksMessage +DescribeDBClusterEndpointsMessage +DescribeDBClusterParameterGroupsMessage +DescribeDBClusterParametersMessage +DescribeDBClusterSnapshotAttributesMessage +DescribeDBClusterSnapshotAttributesResult +DescribeDBClusterSnapshotsMessage +DescribeDBClustersMessage +DescribeDBEngineVersionsMessage +DescribeDBInstanceAutomatedBackupsMessage +DescribeDBInstancesMessage +DescribeDBLogFiles +DescribeDBLogFilesDetails +DescribeDBLogFilesMessage +DescribeDBLogFilesResponse +DescribeDBParameterGroupsMessage +DescribeDBParametersMessage +DescribeDBProxiesRequest +DescribeDBProxiesResponse +DescribeDBProxyEndpointsRequest +DescribeDBProxyEndpointsResponse +DescribeDBProxyTargetGroupsRequest +DescribeDBProxyTargetGroupsResponse +DescribeDBProxyTargetsRequest +DescribeDBProxyTargetsResponse +DescribeDBSecurityGroupsMessage +DescribeDBSnapshotAttributesMessage +DescribeDBSnapshotAttributesResult +DescribeDBSnapshotsMessage +DescribeDBSubnetGroupsMessage +DescribeDRTAccessResponse +DescribeDashboardDefinitionRequest +DescribeDashboardDefinitionResponse +DescribeDashboardPermissionsRequest +DescribeDashboardPermissionsResponse +DescribeDashboardRequest +DescribeDashboardResponse +DescribeDashboardSnapshotJobRequest +DescribeDashboardSnapshotJobResponse +DescribeDashboardSnapshotJobResultRequest +DescribeDashboardSnapshotJobResultResponse +DescribeDataIngestionJobRequest +DescribeDataIngestionJobResponse +DescribeDataProvidersMessage +DescribeDataProvidersResponse +DescribeDataQualityJobDefinitionRequest +DescribeDataQualityJobDefinitionResponse +DescribeDataRepositoryAssociationsRequest +DescribeDataRepositoryAssociationsResponse +DescribeDataRepositoryTasksRequest +DescribeDataRepositoryTasksResponse +DescribeDataSetPermissionsRequest +DescribeDataSetPermissionsResponse +DescribeDataSetRefreshPropertiesRequest +DescribeDataSetRefreshPropertiesResponse +DescribeDataSetRequest +DescribeDataSetResponse +DescribeDataSharesForConsumerMessage +DescribeDataSharesForConsumerResult +DescribeDataSharesForProducerMessage +DescribeDataSharesForProducerResult +DescribeDataSharesMessage +DescribeDataSharesResult +DescribeDataSourcePermissionsRequest +DescribeDataSourcePermissionsResponse +DescribeDataSourceRequest +DescribeDataSourceResponse +DescribeDataSourcesInput +DescribeDataSourcesOutput +DescribeDatabaseRequest +DescribeDatabaseResponse +DescribeDatasetExportJobRequest +DescribeDatasetExportJobResponse +DescribeDatasetGroupRequest +DescribeDatasetGroupResponse +DescribeDatasetImportJobRequest +DescribeDatasetImportJobResponse +DescribeDatasetRequest +DescribeDatasetResponse +DescribeDatastoreRequest +DescribeDatastoreResponse +DescribeDefaultAuthorizerResponse +DescribeDefaultClusterParametersMessage +DescribeDefaultClusterParametersResult +DescribeDefaultEncryptionConfigurationResponse +DescribeDefaultParametersRequest +DescribeDefaultParametersResponse +DescribeDeliveryChannelStatusRequest +DescribeDeliveryChannelStatusResponse +DescribeDeliveryChannelsRequest +DescribeDeliveryChannelsResponse +DescribeDeliveryStreamInput +DescribeDeliveryStreamOutput +DescribeDeploymentJobRequest +DescribeDeploymentJobResponse +DescribeDeploymentsRequest +DescribeDeploymentsResult +DescribeDestinationsRequest +DescribeDestinationsResponse +DescribeDetectMitigationActionsTaskRequest +DescribeDetectMitigationActionsTaskResponse +DescribeDetectorModelAnalysisRequest +DescribeDetectorModelAnalysisResponse +DescribeDetectorModelRequest +DescribeDetectorModelResponse +DescribeDetectorRequest +DescribeDetectorResponse +DescribeDetectorResult +DescribeDeviceEc2Input +DescribeDeviceEc2Output +DescribeDeviceFleetRequest +DescribeDeviceFleetResponse +DescribeDeviceInput +DescribeDeviceJobRequest +DescribeDeviceJobResponse +DescribeDeviceOutput +DescribeDevicePolicyConfigurationRequest +DescribeDevicePolicyConfigurationResponse +DescribeDeviceRequest +DescribeDeviceResponse +DescribeDhcpOptionsRequest +DescribeDhcpOptionsResult +DescribeDimensionKeysRequest +DescribeDimensionKeysResponse +DescribeDimensionRequest +DescribeDimensionResponse +DescribeDirectConnectGatewayAssociationProposalsRequest +DescribeDirectConnectGatewayAssociationProposalsResult +DescribeDirectConnectGatewayAssociationsRequest +DescribeDirectConnectGatewayAssociationsResult +DescribeDirectConnectGatewayAttachmentsRequest +DescribeDirectConnectGatewayAttachmentsResult +DescribeDirectConnectGatewaysRequest +DescribeDirectConnectGatewaysResult +DescribeDirectoriesRequest +DescribeDirectoriesResult +DescribeDirectoryConfigsRequest +DescribeDirectoryConfigsResult +DescribeDiscovererRequest +DescribeDiscovererResponse +DescribeDiscoveryJobRequest +DescribeDiscoveryJobResponse +DescribeDocumentClassificationJobRequest +DescribeDocumentClassificationJobResponse +DescribeDocumentClassifierRequest +DescribeDocumentClassifierResponse +DescribeDocumentPermissionRequest +DescribeDocumentPermissionResponse +DescribeDocumentRequest +DescribeDocumentResult +DescribeDocumentVersionsRequest +DescribeDocumentVersionsResponse +DescribeDomainAutoTunesRequest +DescribeDomainAutoTunesResponse +DescribeDomainChangeProgressRequest +DescribeDomainChangeProgressResponse +DescribeDomainConfigRequest +DescribeDomainConfigResponse +DescribeDomainConfigurationRequest +DescribeDomainConfigurationResponse +DescribeDomainControllersRequest +DescribeDomainControllersResult +DescribeDomainEndpointOptionsRequest +DescribeDomainEndpointOptionsResponse +DescribeDomainHealthRequest +DescribeDomainHealthResponse +DescribeDomainInput +DescribeDomainNodesRequest +DescribeDomainNodesResponse +DescribeDomainRequest +DescribeDomainResponse +DescribeDomainResult +DescribeDomainsRequest +DescribeDomainsResponse +DescribeDominantLanguageDetectionJobRequest +DescribeDominantLanguageDetectionJobResponse +DescribeDraftAppVersionResourcesImportStatusRequest +DescribeDraftAppVersionResourcesImportStatusResponse +DescribeDryRunProgressRequest +DescribeDryRunProgressResponse +DescribeEC2InstanceLimitsInput +DescribeEC2InstanceLimitsOutput +DescribeEcsClustersRequest +DescribeEcsClustersResult +DescribeEdgeConfigurationInput +DescribeEdgeConfigurationOutput +DescribeEdgeDeploymentPlanRequest +DescribeEdgeDeploymentPlanResponse +DescribeEdgePackagingJobRequest +DescribeEdgePackagingJobResponse +DescribeEffectiveInstanceAssociationsRequest +DescribeEffectiveInstanceAssociationsResult +DescribeEffectivePatchesForPatchBaselineRequest +DescribeEffectivePatchesForPatchBaselineResult +DescribeEffectivePolicyRequest +DescribeEffectivePolicyResponse +DescribeEgressOnlyInternetGatewaysRequest +DescribeEgressOnlyInternetGatewaysResult +DescribeElasticGpusRequest +DescribeElasticGpusResult +DescribeElasticIpsRequest +DescribeElasticIpsResult +DescribeElasticLoadBalancersRequest +DescribeElasticLoadBalancersResult +DescribeElasticsearchDomainConfigRequest +DescribeElasticsearchDomainConfigResponse +DescribeElasticsearchDomainRequest +DescribeElasticsearchDomainResponse +DescribeElasticsearchDomainsRequest +DescribeElasticsearchDomainsResponse +DescribeElasticsearchInstanceTypeLimitsRequest +DescribeElasticsearchInstanceTypeLimitsResponse +DescribeEmailMonitoringConfigurationRequest +DescribeEmailMonitoringConfigurationResponse +DescribeEmergencyContactSettingsResponse +DescribeEndPointStateInput +DescribeEndPointStateOutput +DescribeEndpointAccessMessage +DescribeEndpointAuthorizationMessage +DescribeEndpointConfigInput +DescribeEndpointConfigOutput +DescribeEndpointGroupRequest +DescribeEndpointGroupResponse +DescribeEndpointInput +DescribeEndpointOutput +DescribeEndpointRequest +DescribeEndpointResponse +DescribeEndpointSettingsMessage +DescribeEndpointSettingsResponse +DescribeEndpointTypesMessage +DescribeEndpointTypesResponse +DescribeEndpointsMessage +DescribeEndpointsRequest +DescribeEndpointsResponse +DescribeEngagementRequest +DescribeEngagementResult +DescribeEngineDefaultClusterParametersMessage +DescribeEngineDefaultClusterParametersResult +DescribeEngineDefaultParametersMessage +DescribeEngineDefaultParametersResult +DescribeEngineVersionsMessage +DescribeEngineVersionsRequest +DescribeEngineVersionsResponse +DescribeEntitiesDetectionJobRequest +DescribeEntitiesDetectionJobResponse +DescribeEntitiesDetectionV2JobRequest +DescribeEntitiesDetectionV2JobResponse +DescribeEntitlementsRequest +DescribeEntitlementsResult +DescribeEntityAggregatesForOrganizationRequest +DescribeEntityAggregatesForOrganizationResponse +DescribeEntityAggregatesRequest +DescribeEntityAggregatesResponse +DescribeEntityRecognizerRequest +DescribeEntityRecognizerResponse +DescribeEntityRequest +DescribeEntityResponse +DescribeEnvironmentHealthRequest +DescribeEnvironmentHealthResult +DescribeEnvironmentManagedActionHistoryRequest +DescribeEnvironmentManagedActionHistoryResult +DescribeEnvironmentManagedActionsRequest +DescribeEnvironmentManagedActionsResult +DescribeEnvironmentMembershipsRequest +DescribeEnvironmentMembershipsResult +DescribeEnvironmentResourcesMessage +DescribeEnvironmentStatusRequest +DescribeEnvironmentStatusResult +DescribeEnvironmentsMessage +DescribeEnvironmentsRequest +DescribeEnvironmentsResult +DescribeEphemerisRequest +DescribeEphemerisResponse +DescribeEvaluationFormRequest +DescribeEvaluationFormResponse +DescribeEvaluationsInput +DescribeEvaluationsOutput +DescribeEventAggregatesRequest +DescribeEventAggregatesResponse +DescribeEventBusRequest +DescribeEventBusResponse +DescribeEventCategoriesMessage +DescribeEventCategoriesResponse +DescribeEventConfigurationsResponse +DescribeEventDetailsForOrganizationRequest +DescribeEventDetailsForOrganizationResponse +DescribeEventDetailsRequest +DescribeEventDetailsResponse +DescribeEventSourceRequest +DescribeEventSourceResponse +DescribeEventSourcesConfigResponse +DescribeEventSubscriptionsMessage +DescribeEventSubscriptionsResponse +DescribeEventTopicsRequest +DescribeEventTopicsResult +DescribeEventTrackerRequest +DescribeEventTrackerResponse +DescribeEventTypesRequest +DescribeEventTypesResponse +DescribeEventsDetectionJobRequest +DescribeEventsDetectionJobResponse +DescribeEventsForOrganizationRequest +DescribeEventsForOrganizationResponse +DescribeEventsMessage +DescribeEventsRequest +DescribeEventsResponse +DescribeExclusionsRequest +DescribeExclusionsResponse +DescribeExecutionInput +DescribeExecutionOutput +DescribeExecutionRequest +DescribeExecutionResponse +DescribeExperienceRequest +DescribeExperienceResponse +DescribeExperimentRequest +DescribeExperimentResponse +DescribeExplainabilityExportRequest +DescribeExplainabilityExportResponse +DescribeExplainabilityRequest +DescribeExplainabilityResponse +DescribeExportConfigurationsRequest +DescribeExportConfigurationsResponse +DescribeExportImageTasksRequest +DescribeExportImageTasksResult +DescribeExportInput +DescribeExportOutput +DescribeExportRequest +DescribeExportResponse +DescribeExportTasksMessage +DescribeExportTasksRequest +DescribeExportTasksResponse +DescribeExportTasksResult +DescribeExpressionsRequest +DescribeExpressionsResponse +DescribeExtensionPackAssociationsMessage +DescribeExtensionPackAssociationsResponse +DescribeFHIRDatastoreRequest +DescribeFHIRDatastoreResponse +DescribeFHIRExportJobRequest +DescribeFHIRExportJobResponse +DescribeFHIRImportJobRequest +DescribeFHIRImportJobResponse +DescribeFaqRequest +DescribeFaqResponse +DescribeFargateProfileRequest +DescribeFargateProfileResponse +DescribeFastLaunchImagesRequest +DescribeFastLaunchImagesResult +DescribeFastLaunchImagesSuccessItem +DescribeFastSnapshotRestoreSuccessItem +DescribeFastSnapshotRestoresRequest +DescribeFastSnapshotRestoresResult +DescribeFeatureGroupRequest +DescribeFeatureGroupResponse +DescribeFeatureMetadataRequest +DescribeFeatureMetadataResponse +DescribeFeatureTransformationRequest +DescribeFeatureTransformationResponse +DescribeFeaturedResultsSetRequest +DescribeFeaturedResultsSetResponse +DescribeFeedbackRequest +DescribeFeedbackResponse +DescribeFileCachesRequest +DescribeFileCachesResponse +DescribeFileSystemAliasesRequest +DescribeFileSystemAliasesResponse +DescribeFileSystemAssociationsInput +DescribeFileSystemAssociationsOutput +DescribeFileSystemPolicyRequest +DescribeFileSystemsRequest +DescribeFileSystemsResponse +DescribeFilterRequest +DescribeFilterResponse +DescribeFindingsRequest +DescribeFindingsResponse +DescribeFirewallPolicyRequest +DescribeFirewallPolicyResponse +DescribeFirewallRequest +DescribeFirewallResponse +DescribeFleetAdvisorCollectorsRequest +DescribeFleetAdvisorCollectorsResponse +DescribeFleetAdvisorDatabasesRequest +DescribeFleetAdvisorDatabasesResponse +DescribeFleetAdvisorLsaAnalysisRequest +DescribeFleetAdvisorLsaAnalysisResponse +DescribeFleetAdvisorSchemaObjectSummaryRequest +DescribeFleetAdvisorSchemaObjectSummaryResponse +DescribeFleetAdvisorSchemasRequest +DescribeFleetAdvisorSchemasResponse +DescribeFleetAttributesInput +DescribeFleetAttributesOutput +DescribeFleetCapacityInput +DescribeFleetCapacityOutput +DescribeFleetError +DescribeFleetEventsInput +DescribeFleetEventsOutput +DescribeFleetHistoryRequest +DescribeFleetHistoryResult +DescribeFleetInstancesRequest +DescribeFleetInstancesResult +DescribeFleetLocationAttributesInput +DescribeFleetLocationAttributesOutput +DescribeFleetLocationCapacityInput +DescribeFleetLocationCapacityOutput +DescribeFleetLocationUtilizationInput +DescribeFleetLocationUtilizationOutput +DescribeFleetMetadataRequest +DescribeFleetMetadataResponse +DescribeFleetMetricRequest +DescribeFleetMetricResponse +DescribeFleetPortSettingsInput +DescribeFleetPortSettingsOutput +DescribeFleetRequest +DescribeFleetResponse +DescribeFleetUtilizationInput +DescribeFleetUtilizationOutput +DescribeFleetsInstances +DescribeFleetsRequest +DescribeFleetsResult +DescribeFlowDefinitionRequest +DescribeFlowDefinitionResponse +DescribeFlowExecutionRecordsRequest +DescribeFlowExecutionRecordsResponse +DescribeFlowLogsRequest +DescribeFlowLogsResult +DescribeFlowRequest +DescribeFlowResponse +DescribeFlywheelIterationRequest +DescribeFlywheelIterationResponse +DescribeFlywheelRequest +DescribeFlywheelResponse +DescribeFolderContentsRequest +DescribeFolderContentsResponse +DescribeFolderPermissionsRequest +DescribeFolderPermissionsResponse +DescribeFolderRequest +DescribeFolderResolvedPermissionsRequest +DescribeFolderResolvedPermissionsResponse +DescribeFolderResponse +DescribeForecastExportJobRequest +DescribeForecastExportJobResponse +DescribeForecastRequest +DescribeForecastResponse +DescribeFpgaImageAttributeRequest +DescribeFpgaImageAttributeResult +DescribeFpgaImagesRequest +DescribeFpgaImagesResult +DescribeFrameworkInput +DescribeFrameworkOutput +DescribeFraudsterRegistrationJobRequest +DescribeFraudsterRegistrationJobResponse +DescribeFraudsterRequest +DescribeFraudsterResponse +DescribeFunctionRequest +DescribeFunctionResult +DescribeGameServerGroupInput +DescribeGameServerGroupOutput +DescribeGameServerInput +DescribeGameServerInstancesInput +DescribeGameServerInstancesOutput +DescribeGameServerOutput +DescribeGameSessionDetailsInput +DescribeGameSessionDetailsOutput +DescribeGameSessionPlacementInput +DescribeGameSessionPlacementOutput +DescribeGameSessionQueuesInput +DescribeGameSessionQueuesOutput +DescribeGameSessionsInput +DescribeGameSessionsOutput +DescribeGatewayCapabilityConfigurationRequest +DescribeGatewayCapabilityConfigurationResponse +DescribeGatewayInformationInput +DescribeGatewayInformationOutput +DescribeGatewayInstanceRequest +DescribeGatewayInstanceResponse +DescribeGatewayRequest +DescribeGatewayResponse +DescribeGatewayRouteInput +DescribeGatewayRouteOutput +DescribeGeofenceCollectionRequest +DescribeGeofenceCollectionResponse +DescribeGlobalClustersMessage +DescribeGlobalNetworksRequest +DescribeGlobalNetworksResponse +DescribeGlobalReplicationGroupsMessage +DescribeGlobalReplicationGroupsResult +DescribeGlobalSettingsOutput +DescribeGlobalTableInput +DescribeGlobalTableOutput +DescribeGlobalTableSettingsInput +DescribeGlobalTableSettingsOutput +DescribeGroupMembershipRequest +DescribeGroupMembershipResponse +DescribeGroupRequest +DescribeGroupResponse +DescribeGroupsRequest +DescribeGroupsResponse +DescribeHandshakeRequest +DescribeHandshakeResponse +DescribeHapgRequest +DescribeHapgResponse +DescribeHarvestJobRequest +DescribeHarvestJobResponse +DescribeHealthServiceStatusForOrganizationResponse +DescribeHomeRegionControlsRequest +DescribeHomeRegionControlsResult +DescribeHostKeyRequest +DescribeHostKeyResponse +DescribeHostReservationOfferingsRequest +DescribeHostReservationOfferingsResult +DescribeHostReservationsRequest +DescribeHostReservationsResult +DescribeHostedConnectionsRequest +DescribeHostsRequest +DescribeHostsResult +DescribeHoursOfOperationRequest +DescribeHoursOfOperationResponse +DescribeHsmClientCertificatesMessage +DescribeHsmConfigurationsMessage +DescribeHsmRequest +DescribeHsmResponse +DescribeHubContentRequest +DescribeHubContentResponse +DescribeHubRequest +DescribeHubResponse +DescribeHumanLoopRequest +DescribeHumanLoopResponse +DescribeHumanTaskUiRequest +DescribeHumanTaskUiResponse +DescribeHyperParameterTuningJobRequest +DescribeHyperParameterTuningJobResponse +DescribeIAMPolicyAssignmentRequest +DescribeIAMPolicyAssignmentResponse +DescribeICD10CMInferenceJobRequest +DescribeICD10CMInferenceJobResponse +DescribeIamInstanceProfileAssociationsRequest +DescribeIamInstanceProfileAssociationsResult +DescribeIdFormatRequest +DescribeIdFormatResult +DescribeIdentityIdFormatRequest +DescribeIdentityIdFormatResult +DescribeIdentityInput +DescribeIdentityPoolInput +DescribeIdentityPoolUsageRequest +DescribeIdentityPoolUsageResponse +DescribeIdentityProviderConfigRequest +DescribeIdentityProviderConfigResponse +DescribeIdentityProviderConfigurationRequest +DescribeIdentityProviderConfigurationResponse +DescribeIdentityProviderRequest +DescribeIdentityProviderResponse +DescribeIdentityUsageRequest +DescribeIdentityUsageResponse +DescribeImageAttributeRequest +DescribeImageBuildersRequest +DescribeImageBuildersResult +DescribeImageGenerationConfigurationInput +DescribeImageGenerationConfigurationOutput +DescribeImagePermissionsRequest +DescribeImagePermissionsResult +DescribeImageReplicationStatusRequest +DescribeImageReplicationStatusResponse +DescribeImageRequest +DescribeImageResponse +DescribeImageScanFindingsRequest +DescribeImageScanFindingsResponse +DescribeImageTagsRequest +DescribeImageTagsResponse +DescribeImageVersionRequest +DescribeImageVersionResponse +DescribeImagesFilter +DescribeImagesRequest +DescribeImagesResponse +DescribeImagesResult +DescribeImportImageTasksRequest +DescribeImportImageTasksResult +DescribeImportInput +DescribeImportOutput +DescribeImportRequest +DescribeImportResponse +DescribeImportSnapshotTasksRequest +DescribeImportSnapshotTasksResult +DescribeImportTasksRequest +DescribeImportTasksResponse +DescribeInboundConnectionsRequest +DescribeInboundConnectionsResponse +DescribeInboundCrossClusterSearchConnectionsRequest +DescribeInboundCrossClusterSearchConnectionsResponse +DescribeInboundDmarcSettingsRequest +DescribeInboundDmarcSettingsResponse +DescribeIndexFieldsRequest +DescribeIndexFieldsResponse +DescribeIndexRequest +DescribeIndexResponse +DescribeInferenceExperimentRequest +DescribeInferenceExperimentResponse +DescribeInferenceRecommendationsJobRequest +DescribeInferenceRecommendationsJobResponse +DescribeInferenceSchedulerRequest +DescribeInferenceSchedulerResponse +DescribeIngestionRequest +DescribeIngestionResponse +DescribeInputDeviceRequest +DescribeInputDeviceResponse +DescribeInputDeviceThumbnailRequest +DescribeInputDeviceThumbnailResponse +DescribeInputRequest +DescribeInputResponse +DescribeInputSecurityGroupRequest +DescribeInputSecurityGroupResponse +DescribeInsightRequest +DescribeInsightResponse +DescribeInsightRulesInput +DescribeInsightRulesOutput +DescribeInstanceAccessControlAttributeConfigurationRequest +DescribeInstanceAccessControlAttributeConfigurationResponse +DescribeInstanceAssociationsStatusRequest +DescribeInstanceAssociationsStatusResult +DescribeInstanceAttributeRequest +DescribeInstanceAttributeResponse +DescribeInstanceConnectEndpointsRequest +DescribeInstanceConnectEndpointsResult +DescribeInstanceCreditSpecificationsRequest +DescribeInstanceCreditSpecificationsResult +DescribeInstanceEventNotificationAttributesRequest +DescribeInstanceEventNotificationAttributesResult +DescribeInstanceEventWindowsRequest +DescribeInstanceEventWindowsResult +DescribeInstanceInformationRequest +DescribeInstanceInformationResult +DescribeInstancePatchStatesForPatchGroupRequest +DescribeInstancePatchStatesForPatchGroupResult +DescribeInstancePatchStatesRequest +DescribeInstancePatchStatesResult +DescribeInstancePatchesRequest +DescribeInstancePatchesResult +DescribeInstanceProfilesMessage +DescribeInstanceProfilesResponse +DescribeInstanceRefreshesAnswer +DescribeInstanceRefreshesType +DescribeInstanceRequest +DescribeInstanceResponse +DescribeInstanceStatusRequest +DescribeInstanceStatusResult +DescribeInstanceStorageConfigRequest +DescribeInstanceStorageConfigResponse +DescribeInstanceTypeLimitsRequest +DescribeInstanceTypeLimitsResponse +DescribeInstanceTypeOfferingsRequest +DescribeInstanceTypeOfferingsResult +DescribeInstanceTypesRequest +DescribeInstanceTypesResult +DescribeInstancesHealthRequest +DescribeInstancesHealthResult +DescribeInstancesInput +DescribeInstancesOutput +DescribeInstancesRequest +DescribeInstancesResult +DescribeIntentRequest +DescribeIntentResponse +DescribeInterconnectLoaRequest +DescribeInterconnectLoaResponse +DescribeInterconnectsRequest +DescribeInternetGatewaysRequest +DescribeInternetGatewaysResult +DescribeInventoryDeletionsRequest +DescribeInventoryDeletionsResult +DescribeIpGroupsRequest +DescribeIpGroupsResult +DescribeIpRestrictionRequest +DescribeIpRestrictionResponse +DescribeIpamPoolsRequest +DescribeIpamPoolsResult +DescribeIpamResourceDiscoveriesRequest +DescribeIpamResourceDiscoveriesResult +DescribeIpamResourceDiscoveryAssociationsRequest +DescribeIpamResourceDiscoveryAssociationsResult +DescribeIpamScopesRequest +DescribeIpamScopesResult +DescribeIpamsRequest +DescribeIpamsResult +DescribeIpv6PoolsRequest +DescribeIpv6PoolsResult +DescribeJobDefinitionsRequest +DescribeJobDefinitionsResponse +DescribeJobExecutionRequest +DescribeJobExecutionResponse +DescribeJobFlowsInput +DescribeJobFlowsOutput +DescribeJobInput +DescribeJobLogItemsRequest +DescribeJobLogItemsResponse +DescribeJobQueuesRequest +DescribeJobQueuesResponse +DescribeJobRequest +DescribeJobResponse +DescribeJobResult +DescribeJobRunRequest +DescribeJobRunResponse +DescribeJobTemplateRequest +DescribeJobTemplateResponse +DescribeJobsRequest +DescribeJobsRequestFilters +DescribeJobsResponse +DescribeJournalKinesisStreamRequest +DescribeJournalKinesisStreamResponse +DescribeJournalS3ExportRequest +DescribeJournalS3ExportResponse +DescribeKeyPairsRequest +DescribeKeyPairsResult +DescribeKeyPhrasesDetectionJobRequest +DescribeKeyPhrasesDetectionJobResponse +DescribeKeyRequest +DescribeKeyResponse +DescribeKeywordsRequest +DescribeKeywordsResult +DescribeKinesisStreamingDestinationInput +DescribeKinesisStreamingDestinationOutput +DescribeLDAPSSettingsRequest +DescribeLDAPSSettingsResult +DescribeLabelGroupRequest +DescribeLabelGroupResponse +DescribeLabelRequest +DescribeLabelResponse +DescribeLabelingJobRequest +DescribeLabelingJobResponse +DescribeLagsRequest +DescribeLanguageModelRequest +DescribeLanguageModelResponse +DescribeLaunchConfigurationTemplatesRequest +DescribeLaunchConfigurationTemplatesResponse +DescribeLaunchTemplateVersionsRequest +DescribeLaunchTemplateVersionsResult +DescribeLaunchTemplatesRequest +DescribeLaunchTemplatesResult +DescribeLayersRequest +DescribeLayersResult +DescribeLedgerRequest +DescribeLedgerResponse +DescribeLifecycleConfigurationRequest +DescribeLifecycleHookTypesAnswer +DescribeLifecycleHooksAnswer +DescribeLifecycleHooksType +DescribeLimitsOutput +DescribeLineageGroupRequest +DescribeLineageGroupResponse +DescribeListenerCertificatesInput +DescribeListenerCertificatesOutput +DescribeListenerRequest +DescribeListenerResponse +DescribeListenersInput +DescribeListenersOutput +DescribeLiveSourceRequest +DescribeLiveSourceResponse +DescribeLoaRequest +DescribeLoadBalancerAttributesInput +DescribeLoadBalancerAttributesOutput +DescribeLoadBalancerPoliciesInput +DescribeLoadBalancerPoliciesOutput +DescribeLoadBalancerPolicyTypesInput +DescribeLoadBalancerPolicyTypesOutput +DescribeLoadBalancerTargetGroupsRequest +DescribeLoadBalancerTargetGroupsResponse +DescribeLoadBalancersInput +DescribeLoadBalancersOutput +DescribeLoadBalancersRequest +DescribeLoadBalancersResponse +DescribeLoadBasedAutoScalingRequest +DescribeLoadBasedAutoScalingResult +DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest +DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsResult +DescribeLocalGatewayRouteTableVpcAssociationsRequest +DescribeLocalGatewayRouteTableVpcAssociationsResult +DescribeLocalGatewayRouteTablesRequest +DescribeLocalGatewayRouteTablesResult +DescribeLocalGatewayVirtualInterfaceGroupsRequest +DescribeLocalGatewayVirtualInterfaceGroupsResult +DescribeLocalGatewayVirtualInterfacesRequest +DescribeLocalGatewayVirtualInterfacesResult +DescribeLocalGatewaysRequest +DescribeLocalGatewaysResult +DescribeLocationAzureBlobRequest +DescribeLocationAzureBlobResponse +DescribeLocationEfsRequest +DescribeLocationEfsResponse +DescribeLocationFsxLustreRequest +DescribeLocationFsxLustreResponse +DescribeLocationFsxOntapRequest +DescribeLocationFsxOntapResponse +DescribeLocationFsxOpenZfsRequest +DescribeLocationFsxOpenZfsResponse +DescribeLocationFsxWindowsRequest +DescribeLocationFsxWindowsResponse +DescribeLocationHdfsRequest +DescribeLocationHdfsResponse +DescribeLocationNfsRequest +DescribeLocationNfsResponse +DescribeLocationObjectStorageRequest +DescribeLocationObjectStorageResponse +DescribeLocationS3Request +DescribeLocationS3Response +DescribeLocationSmbRequest +DescribeLocationSmbResponse +DescribeLogGroupsRequest +DescribeLogGroupsResponse +DescribeLogPatternRequest +DescribeLogPatternResponse +DescribeLogStreamsRequest +DescribeLogStreamsResponse +DescribeLoggingConfigurationRequest +DescribeLoggingConfigurationResponse +DescribeLoggingOptionsResponse +DescribeLoggingStatusMessage +DescribeLunaClientRequest +DescribeLunaClientResponse +DescribeMLModelsInput +DescribeMLModelsOutput +DescribeMailboxExportJobRequest +DescribeMailboxExportJobResponse +DescribeMaintenanceStartTimeInput +DescribeMaintenanceStartTimeOutput +DescribeMaintenanceWindowExecutionTaskInvocationsRequest +DescribeMaintenanceWindowExecutionTaskInvocationsResult +DescribeMaintenanceWindowExecutionTasksRequest +DescribeMaintenanceWindowExecutionTasksResult +DescribeMaintenanceWindowExecutionsRequest +DescribeMaintenanceWindowExecutionsResult +DescribeMaintenanceWindowScheduleRequest +DescribeMaintenanceWindowScheduleResult +DescribeMaintenanceWindowTargetsRequest +DescribeMaintenanceWindowTargetsResult +DescribeMaintenanceWindowTasksRequest +DescribeMaintenanceWindowTasksResult +DescribeMaintenanceWindowsForTargetRequest +DescribeMaintenanceWindowsForTargetResult +DescribeMaintenanceWindowsRequest +DescribeMaintenanceWindowsResult +DescribeMalwareScansRequest +DescribeMalwareScansResponse +DescribeManagedEndpointRequest +DescribeManagedEndpointResponse +DescribeManagedJobTemplateRequest +DescribeManagedJobTemplateResponse +DescribeManagedPrefixListsRequest +DescribeManagedPrefixListsResult +DescribeManagedProductsByVendorRequest +DescribeManagedProductsByVendorResponse +DescribeManagedRuleGroupRequest +DescribeManagedRuleGroupResponse +DescribeMapRequest +DescribeMapResponse +DescribeMapRunInput +DescribeMapRunOutput +DescribeMappedResourceConfigurationInput +DescribeMappedResourceConfigurationOutput +DescribeMatchmakingConfigurationsInput +DescribeMatchmakingConfigurationsOutput +DescribeMatchmakingInput +DescribeMatchmakingOutput +DescribeMatchmakingRuleSetsInput +DescribeMatchmakingRuleSetsOutput +DescribeMediaStorageConfigurationInput +DescribeMediaStorageConfigurationOutput +DescribeMergeConflictsInput +DescribeMergeConflictsOutput +DescribeMeshInput +DescribeMeshOutput +DescribeMetadataModelAssessmentsMessage +DescribeMetadataModelAssessmentsResponse +DescribeMetadataModelConversionsMessage +DescribeMetadataModelConversionsResponse +DescribeMetadataModelExportsAsScriptMessage +DescribeMetadataModelExportsAsScriptResponse +DescribeMetadataModelExportsToTargetMessage +DescribeMetadataModelExportsToTargetResponse +DescribeMetadataModelImportsMessage +DescribeMetadataModelImportsResponse +DescribeMetricAttributionRequest +DescribeMetricAttributionResponse +DescribeMetricCollectionTypesAnswer +DescribeMetricFiltersRequest +DescribeMetricFiltersResponse +DescribeMetricSetRequest +DescribeMetricSetResponse +DescribeMigrationProjectsMessage +DescribeMigrationProjectsResponse +DescribeMigrationTaskRequest +DescribeMigrationTaskResult +DescribeMitigationActionRequest +DescribeMitigationActionResponse +DescribeModelBiasJobDefinitionRequest +DescribeModelBiasJobDefinitionResponse +DescribeModelCardExportJobRequest +DescribeModelCardExportJobResponse +DescribeModelCardRequest +DescribeModelCardResponse +DescribeModelExplainabilityJobDefinitionRequest +DescribeModelExplainabilityJobDefinitionResponse +DescribeModelInput +DescribeModelOutput +DescribeModelPackageGroupInput +DescribeModelPackageGroupOutput +DescribeModelPackageInput +DescribeModelPackageOutput +DescribeModelPackagingJobRequest +DescribeModelPackagingJobResponse +DescribeModelQualityJobDefinitionRequest +DescribeModelQualityJobDefinitionResponse +DescribeModelRequest +DescribeModelResponse +DescribeModelVersionRequest +DescribeModelVersionResponse +DescribeModelVersionsRequest +DescribeModelVersionsResult +DescribeMonitorRequest +DescribeMonitorResponse +DescribeMonitoringScheduleRequest +DescribeMonitoringScheduleResponse +DescribeMountTargetSecurityGroupsRequest +DescribeMountTargetSecurityGroupsResponse +DescribeMountTargetsRequest +DescribeMountTargetsResponse +DescribeMovingAddressesRequest +DescribeMovingAddressesResult +DescribeMultiRegionAccessPointOperationRequest +DescribeMultiRegionAccessPointOperationResult +DescribeMultiplexProgramRequest +DescribeMultiplexProgramResponse +DescribeMultiplexRequest +DescribeMultiplexResponse +DescribeMyUserProfileResult +DescribeNFSFileSharesInput +DescribeNFSFileSharesOutput +DescribeNamespaceRequest +DescribeNamespaceResponse +DescribeNatGatewaysRequest +DescribeNatGatewaysResult +DescribeNetworkAclsRequest +DescribeNetworkAclsResult +DescribeNetworkInsightsAccessScopeAnalysesRequest +DescribeNetworkInsightsAccessScopeAnalysesResult +DescribeNetworkInsightsAccessScopesRequest +DescribeNetworkInsightsAccessScopesResult +DescribeNetworkInsightsAnalysesRequest +DescribeNetworkInsightsAnalysesResult +DescribeNetworkInsightsPathsRequest +DescribeNetworkInsightsPathsResult +DescribeNetworkInterfaceAttributeRequest +DescribeNetworkInterfaceAttributeResult +DescribeNetworkInterfacePermissionsRequest +DescribeNetworkInterfacePermissionsResult +DescribeNetworkInterfacesRequest +DescribeNetworkInterfacesResult +DescribeNodeAssociationStatusRequest +DescribeNodeAssociationStatusResponse +DescribeNodeConfigurationOptionsMessage +DescribeNodeFromTemplateJobRequest +DescribeNodeFromTemplateJobResponse +DescribeNodeRequest +DescribeNodeResponse +DescribeNodegroupRequest +DescribeNodegroupResponse +DescribeNotebookExecutionInput +DescribeNotebookExecutionOutput +DescribeNotebookInstanceInput +DescribeNotebookInstanceLifecycleConfigInput +DescribeNotebookInstanceLifecycleConfigOutput +DescribeNotebookInstanceOutput +DescribeNotificationConfigurationInput +DescribeNotificationConfigurationOutput +DescribeNotificationConfigurationsAnswer +DescribeNotificationConfigurationsType +DescribeNotificationRuleRequest +DescribeNotificationRuleResult +DescribeNotificationSubscriptionsRequest +DescribeNotificationSubscriptionsResponse +DescribeNotificationsForBudgetRequest +DescribeNotificationsForBudgetResponse +DescribeObjectRequest +DescribeObjectResponse +DescribeObjectsInput +DescribeObjectsOutput +DescribeObservabilityConfigurationRequest +DescribeObservabilityConfigurationResponse +DescribeObservationRequest +DescribeObservationResponse +DescribeOfferingRequest +DescribeOfferingResponse +DescribeOperatingSystemsResponse +DescribeOpsItemsRequest +DescribeOpsItemsResponse +DescribeOptOutListsRequest +DescribeOptOutListsResult +DescribeOptedOutNumbersRequest +DescribeOptedOutNumbersResult +DescribeOptionGroupOptionsMessage +DescribeOptionGroupsMessage +DescribeOrderableClusterOptionsMessage +DescribeOrderableDBInstanceOptionsMessage +DescribeOrderableReplicationInstancesMessage +DescribeOrderableReplicationInstancesResponse +DescribeOrganizationConfigRuleStatusesRequest +DescribeOrganizationConfigRuleStatusesResponse +DescribeOrganizationConfigRulesRequest +DescribeOrganizationConfigRulesResponse +DescribeOrganizationConfigurationRequest +DescribeOrganizationConfigurationResponse +DescribeOrganizationConformancePackStatusesRequest +DescribeOrganizationConformancePackStatusesResponse +DescribeOrganizationConformancePacksRequest +DescribeOrganizationConformancePacksResponse +DescribeOrganizationHealthRequest +DescribeOrganizationHealthResponse +DescribeOrganizationOverviewRequest +DescribeOrganizationOverviewResponse +DescribeOrganizationRequest +DescribeOrganizationResourceCollectionHealthRequest +DescribeOrganizationResourceCollectionHealthResponse +DescribeOrganizationResponse +DescribeOrganizationalUnitRequest +DescribeOrganizationalUnitResponse +DescribeOrganizationsAccessInput +DescribeOrganizationsAccessOutput +DescribeOriginEndpointRequest +DescribeOriginEndpointResponse +DescribeOutboundConnectionsRequest +DescribeOutboundConnectionsResponse +DescribeOutboundCrossClusterSearchConnectionsRequest +DescribeOutboundCrossClusterSearchConnectionsResponse +DescribePHIDetectionJobRequest +DescribePHIDetectionJobResponse +DescribePackageImportJobRequest +DescribePackageImportJobResponse +DescribePackageRequest +DescribePackageResponse +DescribePackageResult +DescribePackageVersionRequest +DescribePackageVersionResponse +DescribePackageVersionResult +DescribePackagesFilter +DescribePackagesRequest +DescribePackagesResponse +DescribePackagingConfigurationRequest +DescribePackagingConfigurationResponse +DescribePackagingGroupRequest +DescribePackagingGroupResponse +DescribePageRequest +DescribePageResult +DescribeParameterGroupsRequest +DescribeParameterGroupsResponse +DescribeParametersRequest +DescribeParametersResponse +DescribeParametersResult +DescribePartnerEventSourceRequest +DescribePartnerEventSourceResponse +DescribePartnersInputMessage +DescribePartnersOutputMessage +DescribePatchBaselinesRequest +DescribePatchBaselinesResult +DescribePatchGroupStateRequest +DescribePatchGroupStateResult +DescribePatchGroupsRequest +DescribePatchGroupsResult +DescribePatchPropertiesRequest +DescribePatchPropertiesResult +DescribePendingAggregationRequestsRequest +DescribePendingAggregationRequestsResponse +DescribePendingMaintenanceActionsMessage +DescribePendingMaintenanceActionsResponse +DescribePermissionSetProvisioningStatusRequest +DescribePermissionSetProvisioningStatusResponse +DescribePermissionSetRequest +DescribePermissionSetResponse +DescribePermissionsRequest +DescribePermissionsResult +DescribePhoneNumberRequest +DescribePhoneNumberResponse +DescribePhoneNumbersRequest +DescribePhoneNumbersResult +DescribePiiEntitiesDetectionJobRequest +DescribePiiEntitiesDetectionJobResponse +DescribePipeRequest +DescribePipeResponse +DescribePipelineDefinitionForExecutionRequest +DescribePipelineDefinitionForExecutionResponse +DescribePipelineExecutionRequest +DescribePipelineExecutionResponse +DescribePipelineRequest +DescribePipelineResponse +DescribePipelinesInput +DescribePipelinesOutput +DescribePlaceIndexRequest +DescribePlaceIndexResponse +DescribePlacementGroupsRequest +DescribePlacementGroupsResult +DescribePlacementRequest +DescribePlacementResponse +DescribePlatformVersionRequest +DescribePlatformVersionResult +DescribePlayerSessionsInput +DescribePlayerSessionsOutput +DescribePoliciesType +DescribePolicyRequest +DescribePolicyResponse +DescribePoolsRequest +DescribePoolsResult +DescribePortalRequest +DescribePortalResponse +DescribePortfolioInput +DescribePortfolioOutput +DescribePortfolioShareStatusInput +DescribePortfolioShareStatusOutput +DescribePortfolioSharesInput +DescribePortfolioSharesOutput +DescribePredictorBacktestExportJobRequest +DescribePredictorBacktestExportJobResponse +DescribePredictorRequest +DescribePredictorResponse +DescribePrefixListsRequest +DescribePrefixListsResult +DescribePrincipalIdFormatRequest +DescribePrincipalIdFormatResult +DescribePrincipalMappingRequest +DescribePrincipalMappingResponse +DescribeProblemObservationsRequest +DescribeProblemObservationsResponse +DescribeProblemRequest +DescribeProblemResponse +DescribeProcessingJobRequest +DescribeProcessingJobResponse +DescribeProductAsAdminInput +DescribeProductAsAdminOutput +DescribeProductInput +DescribeProductOutput +DescribeProductViewInput +DescribeProductViewOutput +DescribeProductsRequest +DescribeProductsResponse +DescribeProfileRequest +DescribeProfileResponse +DescribeProfilingGroupRequest +DescribeProfilingGroupResponse +DescribeProgramRequest +DescribeProgramResponse +DescribeProjectInput +DescribeProjectOutput +DescribeProjectRequest +DescribeProjectResponse +DescribeProjectResult +DescribeProjectVersionsRequest +DescribeProjectVersionsResponse +DescribeProjectsRequest +DescribeProjectsResponse +DescribePromptRequest +DescribePromptResponse +DescribeProtectedResourceInput +DescribeProtectedResourceOutput +DescribeProtectionGroupRequest +DescribeProtectionGroupResponse +DescribeProtectionRequest +DescribeProtectionResponse +DescribeProvisionedProductInput +DescribeProvisionedProductOutput +DescribeProvisionedProductPlanInput +DescribeProvisionedProductPlanOutput +DescribeProvisioningArtifactInput +DescribeProvisioningArtifactOutput +DescribeProvisioningParametersInput +DescribeProvisioningParametersOutput +DescribeProvisioningTemplateRequest +DescribeProvisioningTemplateResponse +DescribeProvisioningTemplateVersionRequest +DescribeProvisioningTemplateVersionResponse +DescribePublicIpv4PoolsRequest +DescribePublicIpv4PoolsResult +DescribePublisherInput +DescribePublisherOutput +DescribePublishingDestinationRequest +DescribePublishingDestinationResponse +DescribePullRequestEventsInput +DescribePullRequestEventsOutput +DescribePullThroughCacheRulesRequest +DescribePullThroughCacheRulesResponse +DescribeQueriesRequest +DescribeQueriesResponse +DescribeQueryDefinitionsRequest +DescribeQueryDefinitionsResponse +DescribeQueryRequest +DescribeQueryResponse +DescribeQuerySuggestionsBlockListRequest +DescribeQuerySuggestionsBlockListResponse +DescribeQuerySuggestionsConfigRequest +DescribeQuerySuggestionsConfigResponse +DescribeQueueRequest +DescribeQueueResponse +DescribeQuickConnectRequest +DescribeQuickConnectResponse +DescribeRaidArraysRequest +DescribeRaidArraysResult +DescribeRdsDbInstancesRequest +DescribeRdsDbInstancesResult +DescribeReceiptRuleRequest +DescribeReceiptRuleResponse +DescribeReceiptRuleSetRequest +DescribeReceiptRuleSetResponse +DescribeRecipeRequest +DescribeRecipeResponse +DescribeRecommendationExportJobsRequest +DescribeRecommendationExportJobsResponse +DescribeRecommendationFeedbackRequest +DescribeRecommendationFeedbackResponse +DescribeRecommendationLimitationsRequest +DescribeRecommendationLimitationsResponse +DescribeRecommendationsRequest +DescribeRecommendationsResponse +DescribeRecommenderRequest +DescribeRecommenderResponse +DescribeRecordInput +DescribeRecordOutput +DescribeRecoveryInstancesRequest +DescribeRecoveryInstancesRequestFilters +DescribeRecoveryInstancesResponse +DescribeRecoveryPointInput +DescribeRecoveryPointOutput +DescribeRecoverySnapshotsRequest +DescribeRecoverySnapshotsRequestFilters +DescribeRecoverySnapshotsResponse +DescribeRefreshScheduleRequest +DescribeRefreshScheduleResponse +DescribeRefreshSchemasStatusMessage +DescribeRefreshSchemasStatusResponse +DescribeRegionSettingsOutput +DescribeRegionsRequest +DescribeRegionsResult +DescribeRegistriesRequest +DescribeRegistriesResponse +DescribeRegistryRequest +DescribeRegistryResponse +DescribeReleaseLabelInput +DescribeReleaseLabelOutput +DescribeRemediationConfigurationsRequest +DescribeRemediationConfigurationsResponse +DescribeRemediationExceptionsRequest +DescribeRemediationExceptionsResponse +DescribeRemediationExecutionStatusRequest +DescribeRemediationExecutionStatusResponse +DescribeReplaceRootVolumeTasksRequest +DescribeReplaceRootVolumeTasksResult +DescribeReplayRequest +DescribeReplayResponse +DescribeReplicationConfigsMessage +DescribeReplicationConfigsResponse +DescribeReplicationConfigurationTemplatesRequest +DescribeReplicationConfigurationTemplatesResponse +DescribeReplicationConfigurationsRequest +DescribeReplicationConfigurationsResponse +DescribeReplicationGroupsMessage +DescribeReplicationInstanceTaskLogsMessage +DescribeReplicationInstanceTaskLogsResponse +DescribeReplicationInstancesMessage +DescribeReplicationInstancesResponse +DescribeReplicationSubnetGroupsMessage +DescribeReplicationSubnetGroupsResponse +DescribeReplicationTableStatisticsMessage +DescribeReplicationTableStatisticsResponse +DescribeReplicationTaskAssessmentResultsMessage +DescribeReplicationTaskAssessmentResultsResponse +DescribeReplicationTaskAssessmentRunsMessage +DescribeReplicationTaskAssessmentRunsResponse +DescribeReplicationTaskIndividualAssessmentsMessage +DescribeReplicationTaskIndividualAssessmentsResponse +DescribeReplicationTasksMessage +DescribeReplicationTasksResponse +DescribeReplicationsMessage +DescribeReplicationsResponse +DescribeReportCreationOutput +DescribeReportDefinitionsRequest +DescribeReportDefinitionsResponse +DescribeReportJobInput +DescribeReportJobOutput +DescribeReportPlanInput +DescribeReportPlanOutput +DescribeRepositoriesRequest +DescribeRepositoriesResponse +DescribeRepositoryAssociationRequest +DescribeRepositoryAssociationResponse +DescribeRepositoryRequest +DescribeRepositoryResult +DescribeRescoreExecutionPlanRequest +DescribeRescoreExecutionPlanResponse +DescribeReservationRequest +DescribeReservationResponse +DescribeReservedCacheNodesMessage +DescribeReservedCacheNodesOfferingsMessage +DescribeReservedDBInstancesMessage +DescribeReservedDBInstancesOfferingsMessage +DescribeReservedElasticsearchInstanceOfferingsRequest +DescribeReservedElasticsearchInstanceOfferingsResponse +DescribeReservedElasticsearchInstancesRequest +DescribeReservedElasticsearchInstancesResponse +DescribeReservedInstanceOfferingsRequest +DescribeReservedInstanceOfferingsResponse +DescribeReservedInstancesListingsRequest +DescribeReservedInstancesListingsResult +DescribeReservedInstancesModificationsRequest +DescribeReservedInstancesModificationsResult +DescribeReservedInstancesOfferingsRequest +DescribeReservedInstancesOfferingsResult +DescribeReservedInstancesRequest +DescribeReservedInstancesResponse +DescribeReservedInstancesResult +DescribeReservedNodeExchangeStatusInputMessage +DescribeReservedNodeExchangeStatusOutputMessage +DescribeReservedNodeOfferingsMessage +DescribeReservedNodesMessage +DescribeReservedNodesOfferingsRequest +DescribeReservedNodesOfferingsResponse +DescribeReservedNodesRequest +DescribeReservedNodesResponse +DescribeResiliencyPolicyRequest +DescribeResiliencyPolicyResponse +DescribeResizeMessage +DescribeResourceCollectionHealthRequest +DescribeResourceCollectionHealthResponse +DescribeResourceGroupsRequest +DescribeResourceGroupsResponse +DescribeResourcePermissionsRequest +DescribeResourcePermissionsResponse +DescribeResourcePoliciesRequest +DescribeResourcePoliciesResponse +DescribeResourcePolicyRequest +DescribeResourcePolicyResponse +DescribeResourceRequest +DescribeResourceResponse +DescribeResourceServerRequest +DescribeResourceServerResponse +DescribeRestoreJobInput +DescribeRestoreJobOutput +DescribeRetentionConfigurationsRequest +DescribeRetentionConfigurationsResponse +DescribeRetrainingSchedulerRequest +DescribeRetrainingSchedulerResponse +DescribeReturnShippingLabelRequest +DescribeReturnShippingLabelResult +DescribeRiskConfigurationRequest +DescribeRiskConfigurationResponse +DescribeRobotApplicationRequest +DescribeRobotApplicationResponse +DescribeRobotRequest +DescribeRobotResponse +DescribeRoleAliasRequest +DescribeRoleAliasResponse +DescribeRootFoldersRequest +DescribeRootFoldersResponse +DescribeRouteCalculatorRequest +DescribeRouteCalculatorResponse +DescribeRouteInput +DescribeRouteOutput +DescribeRouteTablesRequest +DescribeRouteTablesResult +DescribeRouterConfigurationRequest +DescribeRouterConfigurationResponse +DescribeRoutingControlRequest +DescribeRoutingControlResponse +DescribeRoutingProfileRequest +DescribeRoutingProfileResponse +DescribeRuleGroupMetadataRequest +DescribeRuleGroupMetadataResponse +DescribeRuleGroupRequest +DescribeRuleGroupResponse +DescribeRuleGroupsNamespaceRequest +DescribeRuleGroupsNamespaceResponse +DescribeRuleRequest +DescribeRuleResponse +DescribeRulesInput +DescribeRulesOutput +DescribeRulesPackagesRequest +DescribeRulesPackagesResponse +DescribeRulesetRequest +DescribeRulesetResponse +DescribeRuntimeConfigurationInput +DescribeRuntimeConfigurationOutput +DescribeRuntimeVersionsRequest +DescribeRuntimeVersionsResponse +DescribeRxNormInferenceJobRequest +DescribeRxNormInferenceJobResponse +DescribeSMBFileSharesInput +DescribeSMBFileSharesOutput +DescribeSMBSettingsInput +DescribeSMBSettingsOutput +DescribeSNOMEDCTInferenceJobRequest +DescribeSNOMEDCTInferenceJobResponse +DescribeSSLPoliciesInput +DescribeSSLPoliciesOutput +DescribeSafetyRuleRequest +DescribeSafetyRuleResponse +DescribeSavingsPlanRatesRequest +DescribeSavingsPlanRatesResponse +DescribeSavingsPlansOfferingRatesRequest +DescribeSavingsPlansOfferingRatesResponse +DescribeSavingsPlansOfferingsRequest +DescribeSavingsPlansOfferingsResponse +DescribeSavingsPlansRequest +DescribeSavingsPlansResponse +DescribeScalableTargetsRequest +DescribeScalableTargetsResponse +DescribeScalingActivitiesRequest +DescribeScalingActivitiesResponse +DescribeScalingActivitiesType +DescribeScalingParametersRequest +DescribeScalingParametersResponse +DescribeScalingPlanResourcesRequest +DescribeScalingPlanResourcesResponse +DescribeScalingPlansRequest +DescribeScalingPlansResponse +DescribeScalingPoliciesInput +DescribeScalingPoliciesOutput +DescribeScalingPoliciesRequest +DescribeScalingPoliciesResponse +DescribeScheduleRequest +DescribeScheduleResponse +DescribeScheduledActionsMessage +DescribeScheduledActionsRequest +DescribeScheduledActionsResponse +DescribeScheduledActionsType +DescribeScheduledAuditRequest +DescribeScheduledAuditResponse +DescribeScheduledInstanceAvailabilityRequest +DescribeScheduledInstanceAvailabilityResult +DescribeScheduledInstancesRequest +DescribeScheduledInstancesResult +DescribeScheduledQueryRequest +DescribeScheduledQueryResponse +DescribeSchedulingPoliciesRequest +DescribeSchedulingPoliciesResponse +DescribeSchemaRequest +DescribeSchemaResponse +DescribeSchemasMessage +DescribeSchemasResponse +DescribeScriptInput +DescribeScriptOutput +DescribeSecretRequest +DescribeSecretResponse +DescribeSecurityConfigurationInput +DescribeSecurityConfigurationOutput +DescribeSecurityGroupReferencesRequest +DescribeSecurityGroupReferencesResult +DescribeSecurityGroupRulesRequest +DescribeSecurityGroupRulesResult +DescribeSecurityGroupsRequest +DescribeSecurityGroupsResult +DescribeSecurityPolicyRequest +DescribeSecurityPolicyResponse +DescribeSecurityProfileRequest +DescribeSecurityProfileResponse +DescribeSenderIdsRequest +DescribeSenderIdsResult +DescribeSentimentDetectionJobRequest +DescribeSentimentDetectionJobResponse +DescribeServerRequest +DescribeServerResponse +DescribeServersRequest +DescribeServersResponse +DescribeServiceAccessPoliciesRequest +DescribeServiceAccessPoliciesResponse +DescribeServiceActionExecutionParametersInput +DescribeServiceActionExecutionParametersOutput +DescribeServiceActionInput +DescribeServiceActionOutput +DescribeServiceErrorsRequest +DescribeServiceErrorsResult +DescribeServiceIntegrationResponse +DescribeServiceRequest +DescribeServiceResponse +DescribeServiceUpdatesMessage +DescribeServiceUpdatesRequest +DescribeServiceUpdatesResponse +DescribeServicesRequest +DescribeServicesResponse +DescribeSessionsRequest +DescribeSessionsResponse +DescribeSessionsResult +DescribeSettingsRequest +DescribeSettingsResult +DescribeSeverityLevelsRequest +DescribeSeverityLevelsResponse +DescribeShardInterval +DescribeSharedDirectoriesRequest +DescribeSharedDirectoriesResult +DescribeSignalingChannelInput +DescribeSignalingChannelOutput +DescribeSigningJobRequest +DescribeSigningJobResponse +DescribeSimulationApplicationRequest +DescribeSimulationApplicationResponse +DescribeSimulationInput +DescribeSimulationJobBatchRequest +DescribeSimulationJobBatchResponse +DescribeSimulationJobRequest +DescribeSimulationJobResponse +DescribeSimulationOutput +DescribeSlotRequest +DescribeSlotResponse +DescribeSlotTypeRequest +DescribeSlotTypeResponse +DescribeSnapshotAttributeRequest +DescribeSnapshotAttributeResult +DescribeSnapshotCopyGrantsMessage +DescribeSnapshotScheduleInput +DescribeSnapshotScheduleOutput +DescribeSnapshotSchedulesMessage +DescribeSnapshotSchedulesOutputMessage +DescribeSnapshotTierStatusRequest +DescribeSnapshotTierStatusResult +DescribeSnapshotsListMessage +DescribeSnapshotsMessage +DescribeSnapshotsRequest +DescribeSnapshotsResponse +DescribeSnapshotsResult +DescribeSolutionRequest +DescribeSolutionResponse +DescribeSolutionVersionRequest +DescribeSolutionVersionResponse +DescribeSourceLocationRequest +DescribeSourceLocationResponse +DescribeSourceNetworksRequest +DescribeSourceNetworksRequestFilters +DescribeSourceNetworksResponse +DescribeSourceRegionsMessage +DescribeSourceServersRequest +DescribeSourceServersRequestFilters +DescribeSourceServersResponse +DescribeSpaceRequest +DescribeSpaceResponse +DescribeSpeakerEnrollmentJobRequest +DescribeSpeakerEnrollmentJobResponse +DescribeSpeakerRequest +DescribeSpeakerResponse +DescribeSpendLimitsRequest +DescribeSpendLimitsResult +DescribeSpotDatafeedSubscriptionRequest +DescribeSpotDatafeedSubscriptionResult +DescribeSpotFleetInstancesRequest +DescribeSpotFleetInstancesResponse +DescribeSpotFleetRequestHistoryRequest +DescribeSpotFleetRequestHistoryResponse +DescribeSpotFleetRequestsRequest +DescribeSpotFleetRequestsResponse +DescribeSpotInstanceRequestsRequest +DescribeSpotInstanceRequestsResult +DescribeSpotPriceHistoryRequest +DescribeSpotPriceHistoryResult +DescribeStackDriftDetectionStatusInput +DescribeStackDriftDetectionStatusOutput +DescribeStackEventsInput +DescribeStackEventsOutput +DescribeStackInstanceInput +DescribeStackInstanceOutput +DescribeStackProvisioningParametersRequest +DescribeStackProvisioningParametersResult +DescribeStackResourceDriftsInput +DescribeStackResourceDriftsOutput +DescribeStackResourceInput +DescribeStackResourceOutput +DescribeStackResourcesInput +DescribeStackResourcesOutput +DescribeStackSetInput +DescribeStackSetOperationInput +DescribeStackSetOperationOutput +DescribeStackSetOutput +DescribeStackSummaryRequest +DescribeStackSummaryResult +DescribeStacksInput +DescribeStacksOutput +DescribeStacksRequest +DescribeStacksResult +DescribeStaleSecurityGroupsRequest +DescribeStaleSecurityGroupsResult +DescribeStandardsControlsRequest +DescribeStandardsControlsResponse +DescribeStandardsRequest +DescribeStandardsResponse +DescribeStateMachineAliasInput +DescribeStateMachineAliasOutput +DescribeStateMachineForExecutionInput +DescribeStateMachineForExecutionOutput +DescribeStateMachineInput +DescribeStateMachineOutput +DescribeStatementRequest +DescribeStatementResponse +DescribeStepInput +DescribeStepOutput +DescribeStorageConfigurationResponse +DescribeStorageSystemRequest +DescribeStorageSystemResourceMetricsRequest +DescribeStorageSystemResourceMetricsResponse +DescribeStorageSystemResourcesRequest +DescribeStorageSystemResourcesResponse +DescribeStorageSystemResponse +DescribeStorageVirtualMachinesRequest +DescribeStorageVirtualMachinesResponse +DescribeStoreImageTasksRequest +DescribeStoreImageTasksResult +DescribeStorediSCSIVolumesInput +DescribeStorediSCSIVolumesOutput +DescribeStreamConsumerInput +DescribeStreamConsumerOutput +DescribeStreamInput +DescribeStreamOutput +DescribeStreamProcessorRequest +DescribeStreamProcessorResponse +DescribeStreamRequest +DescribeStreamResponse +DescribeStreamSummaryInput +DescribeStreamSummaryOutput +DescribeStudioInput +DescribeStudioLifecycleConfigRequest +DescribeStudioLifecycleConfigResponse +DescribeStudioOutput +DescribeSubnetGroupsRequest +DescribeSubnetGroupsResponse +DescribeSubnetsRequest +DescribeSubnetsResult +DescribeSubscribedWorkteamRequest +DescribeSubscribedWorkteamResponse +DescribeSubscribersForNotificationRequest +DescribeSubscribersForNotificationResponse +DescribeSubscriptionFiltersRequest +DescribeSubscriptionFiltersResponse +DescribeSubscriptionResponse +DescribeSuggestersRequest +DescribeSuggestersResponse +DescribeSupportedLanguagesRequest +DescribeSupportedLanguagesResponse +DescribeTLSInspectionConfigurationRequest +DescribeTLSInspectionConfigurationResponse +DescribeTableDataImportJobRequest +DescribeTableDataImportJobResult +DescribeTableInput +DescribeTableOutput +DescribeTableReplicaAutoScalingInput +DescribeTableReplicaAutoScalingOutput +DescribeTableRequest +DescribeTableResponse +DescribeTableRestoreStatusMessage +DescribeTableStatisticsMessage +DescribeTableStatisticsResponse +DescribeTagOptionInput +DescribeTagOptionOutput +DescribeTagsInput +DescribeTagsMessage +DescribeTagsOutput +DescribeTagsRequest +DescribeTagsResponse +DescribeTagsResult +DescribeTagsType +DescribeTapeArchivesInput +DescribeTapeArchivesOutput +DescribeTapeRecoveryPointsInput +DescribeTapeRecoveryPointsOutput +DescribeTapesInput +DescribeTapesOutput +DescribeTargetGroupAttributesInput +DescribeTargetGroupAttributesOutput +DescribeTargetGroupsInput +DescribeTargetGroupsOutput +DescribeTargetHealthInput +DescribeTargetHealthOutput +DescribeTargetedSentimentDetectionJobRequest +DescribeTargetedSentimentDetectionJobResponse +DescribeTaskDefinitionRequest +DescribeTaskDefinitionResponse +DescribeTaskExecutionRequest +DescribeTaskExecutionResponse +DescribeTaskInput +DescribeTaskOutput +DescribeTaskRequest +DescribeTaskResponse +DescribeTaskSetsRequest +DescribeTaskSetsResponse +DescribeTasksRequest +DescribeTasksResponse +DescribeTemplateAliasRequest +DescribeTemplateAliasResponse +DescribeTemplateDefinitionRequest +DescribeTemplateDefinitionResponse +DescribeTemplatePermissionsRequest +DescribeTemplatePermissionsResponse +DescribeTemplateRequest +DescribeTemplateResponse +DescribeTerminationPolicyTypesAnswer +DescribeTestCasesInput +DescribeTestCasesOutput +DescribeTestExecutionRequest +DescribeTestExecutionResponse +DescribeTestSetDiscrepancyReportRequest +DescribeTestSetDiscrepancyReportResponse +DescribeTestSetGenerationRequest +DescribeTestSetGenerationResponse +DescribeTestSetRequest +DescribeTestSetResponse +DescribeTextTranslationJobRequest +DescribeTextTranslationJobResponse +DescribeThemeAliasRequest +DescribeThemeAliasResponse +DescribeThemePermissionsRequest +DescribeThemePermissionsResponse +DescribeThemeRequest +DescribeThemeResponse +DescribeThesaurusRequest +DescribeThesaurusResponse +DescribeThingGroupRequest +DescribeThingGroupResponse +DescribeThingRegistrationTaskRequest +DescribeThingRegistrationTaskResponse +DescribeThingRequest +DescribeThingResponse +DescribeThingTypeRequest +DescribeThingTypeResponse +DescribeThumbnailsRequest +DescribeThumbnailsResponse +DescribeTimeBasedAutoScalingRequest +DescribeTimeBasedAutoScalingResult +DescribeTimeSeriesRequest +DescribeTimeSeriesResponse +DescribeTimeToLiveInput +DescribeTimeToLiveOutput +DescribeTopicPermissionsRequest +DescribeTopicPermissionsResponse +DescribeTopicRefreshRequest +DescribeTopicRefreshResponse +DescribeTopicRefreshScheduleRequest +DescribeTopicRefreshScheduleResponse +DescribeTopicRequest +DescribeTopicResponse +DescribeTopicsDetectionJobRequest +DescribeTopicsDetectionJobResponse +DescribeTrackerRequest +DescribeTrackerResponse +DescribeTrafficDistributionGroupRequest +DescribeTrafficDistributionGroupResponse +DescribeTrafficMirrorFiltersRequest +DescribeTrafficMirrorFiltersResult +DescribeTrafficMirrorSessionsRequest +DescribeTrafficMirrorSessionsResult +DescribeTrafficMirrorTargetsRequest +DescribeTrafficMirrorTargetsResult +DescribeTrafficSourcesRequest +DescribeTrafficSourcesResponse +DescribeTrailsRequest +DescribeTrailsResponse +DescribeTrainingJobRequest +DescribeTrainingJobResponse +DescribeTransactionRequest +DescribeTransactionResponse +DescribeTransformJobRequest +DescribeTransformJobResponse +DescribeTransitGatewayAttachmentsRequest +DescribeTransitGatewayAttachmentsResult +DescribeTransitGatewayConnectPeersRequest +DescribeTransitGatewayConnectPeersResult +DescribeTransitGatewayConnectsRequest +DescribeTransitGatewayConnectsResult +DescribeTransitGatewayMulticastDomainsRequest +DescribeTransitGatewayMulticastDomainsResult +DescribeTransitGatewayPeeringAttachmentsRequest +DescribeTransitGatewayPeeringAttachmentsResult +DescribeTransitGatewayPolicyTablesRequest +DescribeTransitGatewayPolicyTablesResult +DescribeTransitGatewayRouteTableAnnouncementsRequest +DescribeTransitGatewayRouteTableAnnouncementsResult +DescribeTransitGatewayRouteTablesRequest +DescribeTransitGatewayRouteTablesResult +DescribeTransitGatewayVpcAttachmentsRequest +DescribeTransitGatewayVpcAttachmentsResult +DescribeTransitGatewaysRequest +DescribeTransitGatewaysResult +DescribeTrialComponentRequest +DescribeTrialComponentResponse +DescribeTrialRequest +DescribeTrialResponse +DescribeTrunkInterfaceAssociationsRequest +DescribeTrunkInterfaceAssociationsResult +DescribeTrustedAdvisorCheckRefreshStatusesRequest +DescribeTrustedAdvisorCheckRefreshStatusesResponse +DescribeTrustedAdvisorCheckResultRequest +DescribeTrustedAdvisorCheckResultResponse +DescribeTrustedAdvisorCheckSummariesRequest +DescribeTrustedAdvisorCheckSummariesResponse +DescribeTrustedAdvisorChecksRequest +DescribeTrustedAdvisorChecksResponse +DescribeTrustsRequest +DescribeTrustsResult +DescribeTunnelRequest +DescribeTunnelResponse +DescribeTypeInput +DescribeTypeOutput +DescribeTypeRegistrationInput +DescribeTypeRegistrationOutput +DescribeUpdateActionsMessage +DescribeUpdateDirectoryRequest +DescribeUpdateDirectoryResult +DescribeUpdateRequest +DescribeUpdateResponse +DescribeUploadBufferInput +DescribeUploadBufferOutput +DescribeUsageLimitsMessage +DescribeUsageReportSubscriptionsRequest +DescribeUsageReportSubscriptionsResult +DescribeUserGroupsMessage +DescribeUserGroupsResult +DescribeUserHierarchyGroupRequest +DescribeUserHierarchyGroupResponse +DescribeUserHierarchyStructureRequest +DescribeUserHierarchyStructureResponse +DescribeUserImportJobRequest +DescribeUserImportJobResponse +DescribeUserPoolClientRequest +DescribeUserPoolClientResponse +DescribeUserPoolDomainRequest +DescribeUserPoolDomainResponse +DescribeUserPoolRequest +DescribeUserPoolResponse +DescribeUserProfileRequest +DescribeUserProfileResponse +DescribeUserProfileResult +DescribeUserProfilesRequest +DescribeUserProfilesResult +DescribeUserRequest +DescribeUserResponse +DescribeUserStackAssociationsRequest +DescribeUserStackAssociationsResult +DescribeUsersMessage +DescribeUsersRequest +DescribeUsersResponse +DescribeUsersResult +DescribeVPCConnectionRequest +DescribeVPCConnectionResponse +DescribeVTLDevicesInput +DescribeVTLDevicesOutput +DescribeValidDBInstanceModificationsMessage +DescribeValidDBInstanceModificationsResult +DescribeVaultInput +DescribeVaultOutput +DescribeVcenterClientsRequest +DescribeVcenterClientsResponse +DescribeVerifiedAccessEndpointsRequest +DescribeVerifiedAccessEndpointsResult +DescribeVerifiedAccessGroupsRequest +DescribeVerifiedAccessGroupsResult +DescribeVerifiedAccessInstanceLoggingConfigurationsRequest +DescribeVerifiedAccessInstanceLoggingConfigurationsResult +DescribeVerifiedAccessInstancesRequest +DescribeVerifiedAccessInstancesResult +DescribeVerifiedAccessTrustProvidersRequest +DescribeVerifiedAccessTrustProvidersResult +DescribeViewRequest +DescribeViewResponse +DescribeVirtualClusterRequest +DescribeVirtualClusterResponse +DescribeVirtualGatewayInput +DescribeVirtualGatewayOutput +DescribeVirtualInterfacesRequest +DescribeVirtualNodeInput +DescribeVirtualNodeOutput +DescribeVirtualRouterInput +DescribeVirtualRouterOutput +DescribeVirtualServiceInput +DescribeVirtualServiceOutput +DescribeVocabularyRequest +DescribeVocabularyResponse +DescribeVodSourceRequest +DescribeVodSourceResponse +DescribeVoicesInput +DescribeVoicesOutput +DescribeVolumeAttributeRequest +DescribeVolumeAttributeResult +DescribeVolumeStatusRequest +DescribeVolumeStatusResult +DescribeVolumesModificationsRequest +DescribeVolumesModificationsResult +DescribeVolumesRequest +DescribeVolumesResponse +DescribeVolumesResult +DescribeVpcAttributeRequest +DescribeVpcAttributeResult +DescribeVpcClassicLinkDnsSupportRequest +DescribeVpcClassicLinkDnsSupportResult +DescribeVpcClassicLinkRequest +DescribeVpcClassicLinkResult +DescribeVpcConnectionRequest +DescribeVpcConnectionResponse +DescribeVpcConnectorRequest +DescribeVpcConnectorResponse +DescribeVpcEndpointConnectionNotificationsRequest +DescribeVpcEndpointConnectionNotificationsResult +DescribeVpcEndpointConnectionsRequest +DescribeVpcEndpointConnectionsResult +DescribeVpcEndpointServiceConfigurationsRequest +DescribeVpcEndpointServiceConfigurationsResult +DescribeVpcEndpointServicePermissionsRequest +DescribeVpcEndpointServicePermissionsResult +DescribeVpcEndpointServicesRequest +DescribeVpcEndpointServicesResult +DescribeVpcEndpointsRequest +DescribeVpcEndpointsResponse +DescribeVpcEndpointsResult +DescribeVpcIngressConnectionRequest +DescribeVpcIngressConnectionResponse +DescribeVpcPeeringAuthorizationsOutput +DescribeVpcPeeringConnectionsInput +DescribeVpcPeeringConnectionsOutput +DescribeVpcPeeringConnectionsRequest +DescribeVpcPeeringConnectionsResult +DescribeVpcsRequest +DescribeVpcsResult +DescribeVpnConnectionsRequest +DescribeVpnConnectionsResult +DescribeVpnGatewaysRequest +DescribeVpnGatewaysResult +DescribeWarmPoolAnswer +DescribeWarmPoolType +DescribeWatchlistRequest +DescribeWatchlistResponse +DescribeWebsiteCertificateAuthorityRequest +DescribeWebsiteCertificateAuthorityResponse +DescribeWhatIfAnalysisRequest +DescribeWhatIfAnalysisResponse +DescribeWhatIfForecastExportRequest +DescribeWhatIfForecastExportResponse +DescribeWhatIfForecastRequest +DescribeWhatIfForecastResponse +DescribeWorkerConfigurationRequest +DescribeWorkerConfigurationResponse +DescribeWorkflowExecutionInput +DescribeWorkflowRequest +DescribeWorkflowResponse +DescribeWorkflowTypeInput +DescribeWorkforceRequest +DescribeWorkforceResponse +DescribeWorkingStorageInput +DescribeWorkingStorageOutput +DescribeWorkloadRequest +DescribeWorkloadResponse +DescribeWorkspaceAuthenticationRequest +DescribeWorkspaceAuthenticationResponse +DescribeWorkspaceBundlesRequest +DescribeWorkspaceBundlesResult +DescribeWorkspaceConfigurationRequest +DescribeWorkspaceConfigurationResponse +DescribeWorkspaceDirectoriesRequest +DescribeWorkspaceDirectoriesResult +DescribeWorkspaceImagePermissionsRequest +DescribeWorkspaceImagePermissionsResult +DescribeWorkspaceImagesRequest +DescribeWorkspaceImagesResult +DescribeWorkspaceRequest +DescribeWorkspaceResponse +DescribeWorkspaceSnapshotsRequest +DescribeWorkspaceSnapshotsResult +DescribeWorkspacesConnectionStatusRequest +DescribeWorkspacesConnectionStatusResult +DescribeWorkspacesRequest +DescribeWorkspacesResult +DescribeWorkteamRequest +DescribeWorkteamResponse +DescribeWorldExportJobRequest +DescribeWorldExportJobResponse +DescribeWorldGenerationJobRequest +DescribeWorldGenerationJobResponse +DescribeWorldRequest +DescribeWorldResponse +DescribeWorldTemplateRequest +DescribeWorldTemplateResponse +DescribedAccess +DescribedAgreement +DescribedCertificate +DescribedConnector +DescribedExecution +DescribedHostKey +DescribedProfile +DescribedSecurityPolicy +DescribedServer +DescribedUser +DescribedWorkflow +Description +DescriptionPageUrl +DescriptionRegex +DescriptionTooLongException +DescriptiveMentionIndex +DescriptiveVideoServiceFlag +Deserializer +Desired +DesiredCapacity +DesiredCapacityType +DesiredConfiguration +DesiredCount +DesiredDataAccessRoleArn +DesiredDeliveryMediums +DesiredInferenceUnits +DesiredInstanceCount +DesiredInstanceType +DesiredInstances +DesiredModelArn +DesiredModelVariants +DesiredNumber +DesiredNumberOfDomainControllers +DesiredPartitionCount +DesiredPlayerSession +DesiredPlayerSessions +DesiredReplicationCount +DesiredServerlessConfig +DesiredShardLevelMetrics +DesiredStartTime +DesiredState +DesiredValue +DesiredWeight +DesiredWeightAndCapacity +DesiredWeightsAndCapacities +DeskPhoneNumber +Destination +Destination608ChannelNumber +Destination708ServiceNumber +DestinationAddress +DestinationAddresses +DestinationArn +DestinationBackup +DestinationBackupVaultArn +DestinationBranchName +DestinationBucketName +DestinationCidr +DestinationCidrBlock +DestinationColumn +DestinationCommit +DestinationConfig +DestinationConfiguration +DestinationConfigurationRequest +DestinationConfigurations +DestinationConnectorProperties +DestinationCountryParameters +DestinationDataSharing +DestinationDataSharingType +DestinationDescription +DestinationDescriptions +DestinationDetails +DestinationDomain +DestinationDomainInfo +DestinationEncryptionAlgorithm +DestinationEncryptionContext +DestinationEnvironmentId +DestinationEnvironmentName +DestinationField +DestinationFieldProperties +DestinationFileLocation +DestinationFilters +DestinationFlowConfig +DestinationId +DestinationIdentifier +DestinationIdentity +DestinationImageDescription +DestinationImageName +DestinationInfo +DestinationIp +DestinationIpV4 +DestinationIpV6 +DestinationIpamScopeId +DestinationIpv6CidrBlock +DestinationItemsLimit +DestinationKeyId +DestinationLicenseContext +DestinationList +DestinationLocationArn +DestinationName +DestinationNamePrefix +DestinationNetworkInterfaceArns +DestinationNotAllowedException +DestinationOptions +DestinationOptionsRequest +DestinationOptionsResponse +DestinationOutpostArn +DestinationParameterName +DestinationParameterValueConfiguration +DestinationParentId +DestinationParentNotFoundException +DestinationPath +DestinationPhoneNumber +DestinationPoolName +DestinationPort +DestinationPortMapping +DestinationPortMappings +DestinationPortRange +DestinationPortRanges +DestinationPorts +DestinationPosition +DestinationPositions +DestinationPrefixListId +DestinationPrefixLists +DestinationProjectArn +DestinationProperties +DestinationQueue +DestinationRecoveryPointArn +DestinationRefId +DestinationRegion +DestinationS3Uri +DestinationSchema +DestinationSchemaUpdate +DestinationSettings +DestinationSocketAddress +DestinationStatus +DestinationStatusDescription +DestinationStreamArn +DestinationSummary +DestinationToCreate +DestinationTrafficState +DestinationType +DestinationUser +DestinationUserIdentifier +DestinationVpc +Destinations +DetachCertificateFromDistributionRequest +DetachCertificateFromDistributionResult +DetachClassicLinkVpcRequest +DetachClassicLinkVpcResult +DetachCustomerManagedPolicyReferenceFromPermissionSetRequest +DetachDiskRequest +DetachDiskResult +DetachElasticLoadBalancerRequest +DetachFromIndex +DetachFromIndexRequest +DetachFromIndexResponse +DetachGroupPolicyRequest +DetachInstancesAnswer +DetachInstancesFromLoadBalancerRequest +DetachInstancesFromLoadBalancerResult +DetachInstancesQuery +DetachInternetGatewayRequest +DetachLoadBalancerFromSubnetsInput +DetachLoadBalancerFromSubnetsOutput +DetachLoadBalancerTargetGroupsType +DetachLoadBalancersType +DetachManagedPolicyFromPermissionSetRequest +DetachNetworkInterfaceRequest +DetachObject +DetachObjectRequest +DetachObjectResponse +DetachPolicy +DetachPolicyRequest +DetachPrincipalPolicyRequest +DetachRolePolicyRequest +DetachSecurityProfileRequest +DetachStaticIpRequest +DetachStaticIpResult +DetachThingPrincipalRequest +DetachTrafficSourcesType +DetachTypedLink +DetachTypedLinkRequest +DetachUserPolicyRequest +DetachVerifiedAccessTrustProviderRequest +DetachVerifiedAccessTrustProviderResult +DetachVolumeInput +DetachVolumeOutput +DetachVolumeRequest +DetachVpnGatewayRequest +DetachedObjectIdentifier +Detail +DetailType +DetailedError +DetailedErrorCode +DetailedErrorMessage +DetailedMetricsEnabled +DetailedResultsLocation +DetailedStatus +DetailedStatusCodesMetrics +Details +DetailsMap +DetectAnomaliesRequest +DetectAnomaliesResponse +DetectAnomalyResult +DetectCustomLabelsRequest +DetectCustomLabelsResponse +DetectDocumentTextModelVersion +DetectDocumentTextRequest +DetectDocumentTextResponse +DetectDominantLanguageRequest +DetectDominantLanguageResponse +DetectEntitiesRequest +DetectEntitiesResponse +DetectEntitiesV2Request +DetectEntitiesV2Response +DetectFacesRequest +DetectFacesResponse +DetectKeyPhrasesRequest +DetectKeyPhrasesResponse +DetectLabelsImageBackground +DetectLabelsImageForeground +DetectLabelsImageProperties +DetectLabelsImagePropertiesSettings +DetectLabelsImageQuality +DetectLabelsRequest +DetectLabelsResponse +DetectLabelsSettings +DetectMetricSetConfigRequest +DetectMetricSetConfigResponse +DetectMitigationActionExecution +DetectMitigationActionsTaskStatistics +DetectMitigationActionsTaskSummary +DetectMitigationActionsTaskTarget +DetectModerationLabelsRequest +DetectModerationLabelsResponse +DetectPHIRequest +DetectPHIResponse +DetectPiiEntitiesRequest +DetectPiiEntitiesResponse +DetectProtectiveEquipmentRequest +DetectProtectiveEquipmentResponse +DetectSchema +DetectSentimentRequest +DetectSentimentResponse +DetectStackDriftInput +DetectStackDriftOutput +DetectStackResourceDriftInput +DetectStackResourceDriftOutput +DetectStackSetDriftInput +DetectStackSetDriftOutput +DetectSyntaxRequest +DetectSyntaxResponse +DetectTargetedSentimentRequest +DetectTargetedSentimentResponse +DetectTextFilters +DetectTextRequest +DetectTextResponse +DetectedCsvFormatDescriptor +DetectedDataDetails +DetectedField +DetectedFileFormatDescriptor +DetectedJsonFormatDescriptor +DetectedLanguageCode +DetectedLanguageLowConfidenceException +DetectedMetricSetConfig +DetectedMetricSource +DetectedProperties +DetectedS3SourceConfig +DetectedSignature +DetectedSignatures +DetectedText +DetectedWorkload +Detection +DetectionAttributes +DetectionFilter +DetectionStatus +DetectionStatusReason +Detections +Detector +DetectorAdditionalConfiguration +DetectorAdditionalConfigurationResult +DetectorDebugOption +DetectorFeatureConfiguration +DetectorFeatureConfigurationResult +DetectorId +DetectorIds +DetectorModel +DetectorModelConfiguration +DetectorModelDefinition +DetectorModelSummary +DetectorModelVersionSummary +DetectorState +DetectorStateDefinition +DetectorStateSummary +DetectorSummary +DetectorVersionSummary +DeterminingPolicyItem +DevAddr +DevEndpoint +DevEndpointCustomLibraries +DevEndpointNames +DevEndpoints +DevEndpointsNotFound +DevEnvironmentAccessDetails +DevEnvironmentRepositorySummary +DevEnvironmentSessionConfiguration +DevEnvironmentSessionSummary +DevEnvironmentSummary +DevEui +DevEuiEventTopic +DevStatusReqFreq +DeveloperInfo +DeveloperName +DeveloperOnlyAttribute +DeveloperProviderName +DeveloperUserAlreadyRegisteredException +DeveloperUserIdentifier +DeveloperUserIdentifierList +DevelopmentSchemaArn +Device +DeviceAggregatedStatus +DeviceAggregatedStatusFilter +DeviceArn +DeviceAttributes +DeviceCaCertificate +DeviceCertificates +DeviceConfig +DeviceConfiguration +DeviceConfigurationType +DeviceConnectionStatus +DeviceCreateDate +DeviceCreationFile +DeviceCreationFileList +DeviceData +DeviceDefinitionId +DeviceDefinitionVersion +DeviceDefinitionVersionArn +DeviceDefinitionVersionId +DeviceDeploymentStatus +DeviceDeploymentStatusMessage +DeviceDeploymentSummaries +DeviceDeploymentSummary +DeviceDescription +DeviceEvent +DeviceEvents +DeviceFilter +DeviceFleetArn +DeviceFleetName +DeviceFleetNameContains +DeviceFleetSummaries +DeviceFleetSummary +DeviceGroupKey +DeviceId +DeviceIdentifier +DeviceIds +DeviceIndex +DeviceInstance +DeviceJob +DeviceJobConfig +DeviceJobs +DeviceKey +DeviceLastAuthenticatedDate +DeviceLastModifiedDate +DeviceMethod +DeviceMethodParameters +DeviceMethodResponse +DeviceMethods +DeviceMinutes +DeviceModel +DeviceModels +DeviceName +DeviceNameContains +DeviceNames +DeviceNetworkProfileInfo +DeviceNotRegisteredException +DeviceOfflineException +DeviceOnlyRememberedOnUserPrompt +DeviceOperatingSystem +DeviceOperatingSystems +DeviceOptions +DevicePickupId +DevicePickupSnsTopicARN +DevicePool +DevicePoolCompatibilityResult +DevicePosition +DevicePositionUpdate +DevicePositionUpdates +DevicePositions +DeviceProfile +DeviceProfileId +DeviceProfileList +DeviceProfileType +DeviceQueueInfo +DeviceRegistration +DeviceRegistrationState +DeviceRegistrationStateEventConfiguration +DeviceRegistrationStateResourceTypeEventConfiguration +DeviceRegistryEnrichActivity +DeviceRememberedStatus +DeviceReportedStatus +DeviceReportedTime +DeviceRestrictions +DeviceRetiredException +DeviceSecretVerifierConfig +DeviceSecretVerifierConfigType +DeviceSelectionConfig +DeviceSelectionConfiguration +DeviceSelectionResult +DeviceSerialNumber +DeviceSettingsSyncState +DeviceShadowEnrichActivity +DeviceState +DeviceStats +DeviceStatus +DeviceStatusDetail +DeviceStatusDetails +DeviceStatusInfo +DeviceStreamLimitExceededException +DeviceSubsetType +DeviceSummaries +DeviceSummary +DeviceTemplate +DeviceToken +DeviceTrustProviderType +DeviceType +DeviceTypeAndroid +DeviceTypeChromeOs +DeviceTypeId +DeviceTypeIos +DeviceTypeLinux +DeviceTypeOsx +DeviceTypeWeb +DeviceTypeWindows +DeviceTypeZeroClient +DeviceTypes +DeviceUnderTest +DeviceUpdateStatus +DeviceUsageType +DeviceUserAgent +DeviceUserAgents +DeviceValidationDomain +DeviceiSCSIAttributes +Devices +DhcpConfiguration +DhcpConfigurations +DhcpOptions +DhcpOptionsId +DhcpOptionsIds +DiagnosticCode +Diagnostics +DialRequest +Dialnorm +DialogAction +DialogCodeHookInvocationSetting +DialogCodeHookSettings +DialogState +DialogueIntelligence +DictPageSizeLimit +DictionaryKeyThreshold +Diff +Difference +DifferenceStatus +DifferenceType +Digest +DigestAlgorithmMnemonic +DigestAlgorithmType +DigestTipAddress +DigestType +DigestValue +DigitalSignature +DigitalSignatureMethod +Dimension +DimensionConfigurations +DimensionContribution +DimensionContributionList +DimensionDetail +DimensionField +DimensionFilter +DimensionFilterList +DimensionForeground +DimensionGroup +DimensionGroupDetail +DimensionKey +DimensionKeyDescription +DimensionKeyDetail +DimensionKeys +DimensionList +DimensionMapping +DimensionMappings +DimensionName +DimensionNameValue +DimensionType +DimensionValue +DimensionValueAttributes +DimensionValueContribution +DimensionValueContributionList +DimensionValueList +DimensionValueSource +DimensionValueType +DimensionValues +DimensionValuesWithAttributes +DimensionalValueCount +Dimensions +DirectConnectClientException +DirectConnectGateway +DirectConnectGatewayAssociation +DirectConnectGatewayAssociationProposal +DirectConnectGatewayAttachment +DirectConnectServerException +DirectInternetAccess +DirectJDBCSource +DirectKafkaSource +DirectKinesisSource +DirectMessageConfiguration +DirectPathNoLog +DirectPathParallelLoad +DirectPutContent +DirectSchemaChangePolicy +Direction +Directionality +Directories +Directory +DirectoryAlreadyExistsException +DirectoryAlreadyInRegionException +DirectoryAlreadySharedException +DirectoryArn +DirectoryConfig +DirectoryConfigs +DirectoryConnectSettings +DirectoryConnectSettingsDescription +DirectoryDeletedException +DirectoryDescription +DirectoryDescriptions +DirectoryDoesNotExistException +DirectoryId +DirectoryIds +DirectoryInDesiredStateException +DirectoryInUseException +DirectoryInformation +DirectoryLimitExceededException +DirectoryLimits +DirectoryMode +DirectoryName +DirectoryNameConflictsWithFileNameException +DirectoryNames +DirectoryNotDisabledException +DirectoryNotEnabledException +DirectoryNotSharedException +DirectoryPath +DirectoryRegistration +DirectoryRegistrationArn +DirectoryRegistrationSummary +DirectoryRegistrations +DirectoryServiceAuthentication +DirectoryServiceAuthenticationFailedException +DirectoryServiceAuthenticationRequest +DirectoryStructure +DirectoryType +DirectoryUnavailableException +DirectoryUserId +DirectoryVpcSettings +DirectoryVpcSettingsDescription +DisableAWSServiceAccessRequest +DisableActionConfiguration +DisableAddOnRequest +DisableAddOnResult +DisableAddressTransferRequest +DisableAddressTransferResult +DisableAlarmActionRequest +DisableAlarmActionsInput +DisableApiStop +DisableApiTermination +DisableApplicationLayerAutomaticResponseRequest +DisableAutomatedBackup +DisableAwsNetworkPerformanceMetricSubscriptionRequest +DisableAwsNetworkPerformanceMetricSubscriptionResult +DisableClientAuthenticationRequest +DisableControlInput +DisableControlOutput +DisableDelegatedAdminAccountRequest +DisableDelegatedAdminAccountResponse +DisableDirectoryRequest +DisableDirectoryResponse +DisableDomain +DisableDomainAutoRenewRequest +DisableDomainTransferLockRequest +DisableDomainTransferLockResponse +DisableDynamicScaling +DisableEbsEncryptionByDefaultRequest +DisableEbsEncryptionByDefaultResult +DisableEmailNotification +DisableEnhancedMonitoringInput +DisableExecuteApiEndpoint +DisableFastLaunchRequest +DisableFastLaunchResult +DisableFastSnapshotRestoreErrorItem +DisableFastSnapshotRestoreStateError +DisableFastSnapshotRestoreStateErrorItem +DisableFastSnapshotRestoreSuccessItem +DisableFastSnapshotRestoresRequest +DisableFastSnapshotRestoresResult +DisableGatewayInput +DisableGatewayOutput +DisableGlueTableCreation +DisableHostedZoneDNSSECRequest +DisableHostedZoneDNSSECResponse +DisableImageBlockPublicAccessRequest +DisableImageBlockPublicAccessResult +DisableImageDeprecationRequest +DisableImageDeprecationResult +DisableImportFindingsForProductRequest +DisableIndexing +DisableInsightRulesInput +DisableInsightRulesOutput +DisableIpamOrganizationAdminAccountRequest +DisableIpamOrganizationAdminAccountResult +DisableKeyRequest +DisableKeyRotationRequest +DisableLDAPSRequest +DisableLniAtDeviceIndex +DisableLocalGroups +DisableLogTypes +DisableLoggingMessage +DisableMetricsCollectionQuery +DisableNetworking +DisableOrganizationAdminAccountRequest +DisablePolicyTypeRequest +DisablePolicyTypeResponse +DisableProfiler +DisableRadiusRequest +DisableRegionRequest +DisableRemoteControl +DisableRequest +DisableResponse +DisableRollback +DisableRuleRequest +DisableScaleIn +DisableSchemaValidation +DisableSerialConsoleAccessRequest +DisableSerialConsoleAccessResult +DisableSnapshotCopyMessage +DisableSnapshotCopyResult +DisableSsl +DisableSsoRequest +DisableStageTransitionInput +DisableTemplateValidation +DisableTopicRuleRequest +DisableTransitGatewayRouteTablePropagationRequest +DisableTransitGatewayRouteTablePropagationResult +DisableUseAsDirectQuerySource +DisableUseAsImportedSource +DisableUserRequest +DisableUserResponse +DisableValueTrimming +DisableVgwRoutePropagationRequest +DisableVpcClassicLinkDnsSupportRequest +DisableVpcClassicLinkDnsSupportResult +DisableVpcClassicLinkRequest +DisableVpcClassicLinkResult +Disabled +DisabledApiException +DisabledDate +DisabledException +DisabledOperationException +DisabledReason +DisabledTime +DisablingTime +DisallowedCidrs +DisassociateAcceleratorTypes +DisassociateAccountsInput +DisassociateAccountsOutput +DisassociateAdditionalCodeRepositories +DisassociateAddressRequest +DisassociateApiRequest +DisassociateAppBlockBuilderAppBlockRequest +DisassociateApplicationFleetRequest +DisassociateApplicationFromEntitlementRequest +DisassociateApplicationsRequest +DisassociateApprovalRuleTemplateFromRepositoryInput +DisassociateApprovedOriginRequest +DisassociateAssessmentReportEvidenceFolderRequest +DisassociateAssetsRequest +DisassociateAttributeGroupRequest +DisassociateAttributeGroupResponse +DisassociateAwsAccountFromPartnerAccountRequest +DisassociateBotRequest +DisassociateBrowserSettingsRequest +DisassociateBudgetFromResourceInput +DisassociateCertificateRequest +DisassociateChannelFlowRequest +DisassociateClientDeviceFromCoreDeviceEntry +DisassociateClientDeviceFromCoreDeviceErrorEntry +DisassociateClientVpnTargetNetworkRequest +DisassociateClientVpnTargetNetworkResult +DisassociateConfigurationItemsFromApplicationRequest +DisassociateConnectPeerRequest +DisassociateConnectPeerResponse +DisassociateConnectionAliasRequest +DisassociateConnectionFromLagRequest +DisassociateConnectorRequest +DisassociateContactFromAddressBookRequest +DisassociateCreatedArtifactRequest +DisassociateCustomDomainRequest +DisassociateCustomDomainResponse +DisassociateCustomerGatewayRequest +DisassociateCustomerGatewayResponse +DisassociateDRTLogBucketRequest +DisassociateDataShareConsumerMessage +DisassociateDefaultCodeRepository +DisassociateDelegateFromResourceRequest +DisassociateDelegationSignerFromDomainRequest +DisassociateDelegationSignerFromDomainResponse +DisassociateDeviceFromPlacementRequest +DisassociateDeviceFromRoomRequest +DisassociateDiscoveredResourceRequest +DisassociateDomainRequest +DisassociateElasticIpRequest +DisassociateEnclaveCertificateIamRoleRequest +DisassociateEnclaveCertificateIamRoleResult +DisassociateEntireAccount +DisassociateEntitiesFromExperienceRequest +DisassociateEntitiesFromExperienceResponse +DisassociateEnvironmentOperationsRoleMessage +DisassociateExternalConnectionRequest +DisassociateExternalConnectionResult +DisassociateFacesRequest +DisassociateFacesResponse +DisassociateFileSystemAliasesRequest +DisassociateFileSystemAliasesResponse +DisassociateFileSystemInput +DisassociateFileSystemOutput +DisassociateFirewallRuleGroupRequest +DisassociateFirewallRuleGroupResponse +DisassociateFleetRequest +DisassociateFraudsterRequest +DisassociateFraudsterResponse +DisassociateFromAdministratorAccountRequest +DisassociateFromMasterAccountRequest +DisassociateGatewayFromServerInput +DisassociateGatewayFromServerOutput +DisassociateGlobalReplicationGroupMessage +DisassociateGlobalReplicationGroupResult +DisassociateHealthCheckRequest +DisassociateIamInstanceProfileRequest +DisassociateIamInstanceProfileResult +DisassociateIdentityProviderConfigRequest +DisassociateIdentityProviderConfigResponse +DisassociateInstanceEventWindowRequest +DisassociateInstanceEventWindowResult +DisassociateInstanceStorageConfigRequest +DisassociateIpAccessSettingsRequest +DisassociateIpGroupsRequest +DisassociateIpamResourceDiscoveryRequest +DisassociateIpamResourceDiscoveryResult +DisassociateKmsKeyRequest +DisassociateLambdaFunctionRequest +DisassociateLensesInput +DisassociateLexBotRequest +DisassociateLicenseRequest +DisassociateLicenseResponse +DisassociateLifecycleConfig +DisassociateLinkRequest +DisassociateLinkResponse +DisassociateMacSecKeyRequest +DisassociateMacSecKeyResponse +DisassociateMemberAccountRequest +DisassociateMemberFromGroupRequest +DisassociateMemberRequest +DisassociateMemberResponse +DisassociateMembersRequest +DisassociateMembersResponse +DisassociateMembershipRequest +DisassociateMergedGraphqlApiRequest +DisassociateMergedGraphqlApiResponse +DisassociateMulticastGroupFromFuotaTaskRequest +DisassociateNatGatewayAddressRequest +DisassociateNatGatewayAddressResult +DisassociateNetworkSettingsRequest +DisassociateNodeRequest +DisassociateNodeResponse +DisassociateOpsItemRelatedItemRequest +DisassociateOriginationIdentityRequest +DisassociateOriginationIdentityResult +DisassociatePersonasFromEntitiesRequest +DisassociatePersonasFromEntitiesResponse +DisassociatePhoneNumberContactFlowRequest +DisassociatePhoneNumberFromUserRequest +DisassociatePhoneNumbersFromVoiceConnectorGroupRequest +DisassociatePhoneNumbersFromVoiceConnectorGroupResponse +DisassociatePhoneNumbersFromVoiceConnectorRequest +DisassociatePhoneNumbersFromVoiceConnectorResponse +DisassociatePricingRulesInput +DisassociatePricingRulesOutput +DisassociatePrincipalFromPortfolioInput +DisassociateProductFromPortfolioInput +DisassociateProfilesInput +DisassociateQualificationFromWorkerRequest +DisassociateQueueQuickConnectsRequest +DisassociateRecoveryPointFromParentInput +DisassociateRecoveryPointInput +DisassociateRepositoryRequest +DisassociateRepositoryResponse +DisassociateResolverEndpointIpAddressRequest +DisassociateResolverEndpointIpAddressResponse +DisassociateResolverQueryLogConfigRequest +DisassociateResolverQueryLogConfigResponse +DisassociateResolverRuleRequest +DisassociateResolverRuleResponse +DisassociateResourceRequest +DisassociateResourceResponse +DisassociateResourceResponseElement +DisassociateResourceSharePermissionRequest +DisassociateResourceSharePermissionResponse +DisassociateResourceShareRequest +DisassociateResourceShareResponse +DisassociateRoleFromGroupRequest +DisassociateRoleFromGroupResponse +DisassociateRouteTableRequest +DisassociateRoutingProfileQueuesRequest +DisassociateS3ResourcesRequest +DisassociateS3ResourcesResult +DisassociateSchedule +DisassociateSecurityKeyRequest +DisassociateServiceActionFromProvisioningArtifactInput +DisassociateServiceRoleFromAccountResponse +DisassociateSigninDelegateGroupsFromAccountRequest +DisassociateSkillFromSkillGroupRequest +DisassociateSkillFromUsersRequest +DisassociateSkillGroupFromRoomRequest +DisassociateSourceGraphqlApiRequest +DisassociateSourceGraphqlApiResponse +DisassociateSourceServersRequest +DisassociateSubnetCidrBlockRequest +DisassociateSubnetCidrBlockResult +DisassociateSubnetsRequest +DisassociateSubnetsResponse +DisassociateTagOptionFromResourceInput +DisassociateTeamMemberRequest +DisassociateThirdPartyFirewallRequest +DisassociateThirdPartyFirewallResponse +DisassociateTimeSeriesFromAssetPropertyRequest +DisassociateTrackerConsumerRequest +DisassociateTrafficDistributionGroupUserRequest +DisassociateTransitGatewayConnectPeerRequest +DisassociateTransitGatewayConnectPeerResponse +DisassociateTransitGatewayMulticastDomainRequest +DisassociateTransitGatewayMulticastDomainResult +DisassociateTransitGatewayPolicyTableRequest +DisassociateTransitGatewayPolicyTableResult +DisassociateTransitGatewayRouteTableRequest +DisassociateTransitGatewayRouteTableResult +DisassociateTrialComponentRequest +DisassociateTrialComponentResponse +DisassociateTrunkInterfaceRequest +DisassociateTrunkInterfaceResult +DisassociateTrustStoreRequest +DisassociateUserAccessLoggingSettingsRequest +DisassociateUserFromPermissionGroupRequest +DisassociateUserFromPermissionGroupResponse +DisassociateUserRequest +DisassociateUserResponse +DisassociateUserSettingsRequest +DisassociateVPCFromHostedZoneRequest +DisassociateVPCFromHostedZoneResponse +DisassociateVehicleFleetRequest +DisassociateVpcCidrBlockRequest +DisassociateVpcCidrBlockResult +DisassociateWebACLRequest +DisassociateWebsiteAuthorizationProviderRequest +DisassociateWebsiteCertificateAuthorityRequest +DisassociateWhenNotFound +DisassociateWirelessDeviceFromFuotaTaskRequest +DisassociateWirelessDeviceFromMulticastGroupRequest +DisassociateWirelessDeviceFromThingRequest +DisassociateWirelessGatewayFromCertificateRequest +DisassociateWirelessGatewayFromThingRequest +DisassociatedAt +DisassociatedFace +DisassociatedFaces +DisassociationDate +DiscardedFiles +DisconnectCustomKeyStoreRequest +DisconnectFailures +DisconnectFromServiceRequest +DisconnectParticipantRequest +DisconnectPlayerRequest +DisconnectPlayerResult +DisconnectRecoveryInstanceRequest +DisconnectSourceServerRequest +DisconnectSuccesses +DisconnectTimeoutInSeconds +DisconnectTimestamp +DisconnectUserRequest +DisconnectionEvent +DiscontinuityMode +DiscontinuityTags +DiscoverDynamicCardVerificationCode +DiscoverInputSchemaRequest +DiscoverInputSchemaResponse +DiscoverInstancesRequest +DiscoverInstancesResponse +DiscoverInstancesRevisionRequest +DiscoverInstancesRevisionResponse +DiscoverPollEndpointRequest +DiscoverPollEndpointResponse +DiscoveredResource +DiscoveredResourceList +DiscovererArn +DiscovererId +DiscovererIdPrefix +DiscovererSummary +Discoverers +DiscoveryConfig +DiscoveryData +DiscoveryIntegrationStatus +DiscoveryJobArn +DiscoveryJobListEntry +DiscoveryJobs +DiscoveryRegion +DiscoveryServerConfiguration +DiscoveryStatus +DiscoveryType +Disk +DiskAllocationResource +DiskAllocationType +DiskAttributeList +DiskContainer +DiskContainers +DiskId +DiskIds +DiskImage +DiskImageDescription +DiskImageDetail +DiskImageFormat +DiskImageSize +DiskImageVolumeDescription +DiskImages +DiskInfo +DiskIopsConfiguration +DiskMap +DiskNode +DiskPath +DiskReadBytesPerSecond +DiskReadOpsPerSecond +DiskResourceUtilization +DiskSizeInBytes +DiskSnapshot +DiskSnapshotInfo +DiskStatus +DiskWriteBytesPerSecond +DiskWriteOpsPerSecond +Disks +DismissUserContactRequest +DisplayAs +DisplayAspectRatio +DisplayConfiguration +DisplayData +DisplayFormat +DisplayFormatOptions +DisplayFragmentNumber +DisplayFragmentTimestamp +DisplayLabel +DisplayLanguageCode +DisplayMode +DisplayName +DisplayNamePrefix +DisplayOptions +DisplayOrder +DisplayText +Displayable +DisposePackageVersionsRequest +DisposePackageVersionsResult +DisruptionCompliance +DissociateEntityFromThingRequest +DissociatePackageRequest +DissociatePackageResponse +Distance +DistanceUnit +DistinguishedNameQualifier +DistributeDataset +DistributeDatasetEntriesRequest +Distribution +DistributionAlreadyExists +DistributionBundle +DistributionConfig +DistributionConfigWithTags +DistributionConfiguration +DistributionConfigurationSummary +DistributionId +DistributionIdList +DistributionList +DistributionNotDisabled +DistributionSummary +Distributions +Distributor +DistributorId +DistrictOrCounty +DkimAttributes +DkimEnabled +DkimPercentage +DkimSigningAttributes +DkimStatus +DkimTokens +DkimVerificationStatus +DlBucketSize +DlClass +DlDr +DlFreq +DlRate +DlRatePolicy +DlqEventQueueArn +DmsTransferSettings +Dns +DnsAddresses +DnsConfig +DnsConfigChange +DnsDuplicateRuleGroupViolation +DnsEntries +DnsEntry +DnsIpAddr +DnsIpAddresses +DnsIpAddrs +DnsIps +DnsLogs +DnsName +DnsNameServers +DnsOptions +DnsOptionsSpecification +DnsProperties +DnsRecord +DnsRecordCreationState +DnsRecordIpType +DnsRecords +DnsRequestAction +DnsResolvers +DnsRuleGroupLimitExceededViolation +DnsRuleGroupPriorityConflictViolation +DnsSearchDomains +DnsSec +DnsServers +DnsServersOptionsModifyStructure +DnsServiceDiscovery +DnsSupport +DnsTargetResource +DnssecKey +DnssecKeys +DnssecLimitExceeded +DnssecSigningAttributes +DocDbDataProviderSettings +DocDbSettings +DocService +DockerLabels +DockerSecurityOptions +DockerVolumeConfiguration +DocsToInvestigate +Document +DocumentAlreadyExists +DocumentAttribute +DocumentAttributeCondition +DocumentAttributeKey +DocumentAttributeTarget +DocumentAttributeValue +DocumentAttributeValueCountPair +DocumentAttributeValueCountPairs +DocumentAttributeValueType +DocumentAttributes +DocumentClass +DocumentClassificationConfig +DocumentClassificationJobFilter +DocumentClassificationJobProperties +DocumentClassificationJobPropertiesList +DocumentClassifierArn +DocumentClassifierDocuments +DocumentClassifierFilter +DocumentClassifierInputDataConfig +DocumentClassifierName +DocumentClassifierOutputDataConfig +DocumentClassifierProperties +DocumentClassifierPropertiesList +DocumentClassifierSummariesList +DocumentClassifierSummary +DocumentContentDeletion +DocumentDBEventSourceConfig +DocumentDataColumnName +DocumentDataFieldName +DocumentDefaultVersionDescription +DocumentDescription +DocumentExcerpt +DocumentFilter +DocumentFilterList +DocumentFormat +DocumentGroup +DocumentGroups +DocumentHash +DocumentHashType +DocumentId +DocumentIdColumnName +DocumentIdList +DocumentIdOptions +DocumentIdentifier +DocumentIdentifiers +DocumentIndex +DocumentInfo +DocumentInfoList +DocumentKeyValuesFilter +DocumentLabel +DocumentLibraryFieldMappings +DocumentLimitExceeded +DocumentLocation +DocumentLockedForCommentsException +DocumentMetadata +DocumentMetadataConfiguration +DocumentMetadataConfigurationUpdates +DocumentMetadataConfigurations +DocumentMetadataResponseInfo +DocumentName +DocumentPages +DocumentParameter +DocumentPermissionLimit +DocumentReadAction +DocumentReadMode +DocumentReaderConfig +DocumentRelevanceConfiguration +DocumentRelevanceOverrideConfigurations +DocumentRequires +DocumentReviewCommentSource +DocumentReviewerResponseSource +DocumentReviews +DocumentSchemaVersion +DocumentServiceException +DocumentServiceWarning +DocumentSizeInBytes +DocumentStatus +DocumentStatusList +DocumentSuggesterOptions +DocumentText +DocumentTitle +DocumentTitleColumnName +DocumentTitleFieldName +DocumentTooLargeException +DocumentType +DocumentTypeListItem +DocumentURI +DocumentVersion +DocumentVersionInfo +DocumentVersionLimitExceeded +DocumentVersionMetadata +DocumentVersions +DocumentationPart +DocumentationPartIds +DocumentationPartLocation +DocumentationParts +DocumentationUrl +DocumentationVersion +DocumentationVersions +Documents +DocumentsAdded +DocumentsDeleted +DocumentsFailed +DocumentsMetadataConfiguration +DocumentsModified +DocumentsScanned +DocumentsWithErrorsCount +DoesNotExistException +DolbyEDecode +DolbyVision +DolbyVision81Settings +DolbyVisionLevel6Metadata +DolbyVisionMetadataXml +Dollars +Domain +DomainARN +DomainAlreadyExistsFault +DomainArn +DomainAssociation +DomainAuthSecretArn +DomainCertificateArn +DomainConfig +DomainConfiguration +DomainConfigurationSummary +DomainController +DomainControllerId +DomainControllerIds +DomainControllerLimitExceededException +DomainControllers +DomainCount +DomainDeliverabilityCampaign +DomainDeliverabilityCampaigns +DomainDeliverabilityTrackingOption +DomainDeprecatedFault +DomainDescription +DomainDescriptionType +DomainDetail +DomainDetails +DomainDnsIps +DomainEndpoint +DomainEndpointOptions +DomainEndpointOptionsStatus +DomainEndpoints +DomainEntry +DomainEntryPoint +DomainExecutionRoleArn +DomainFileUrl +DomainFqdn +DomainIAMRoleName +DomainId +DomainIdEquals +DomainInfo +DomainInformation +DomainInformationContainer +DomainInfos +DomainIspPlacement +DomainIspPlacements +DomainJoinInfo +DomainLimitExceeded +DomainMembership +DomainMemberships +DomainName +DomainNameConfig +DomainNameConfiguration +DomainNameConfigurations +DomainNameStatus +DomainNameStatusMessage +DomainNames +DomainNodesStatus +DomainNodesStatusList +DomainNotFoundFault +DomainNotWhitelistedException +DomainOu +DomainPackageDetails +DomainPackageDetailsList +DomainPackageStatus +DomainPrefix +DomainPrice +DomainSettings +DomainSettingsForUpdate +DomainSigningPrivateKey +DomainSigningSelector +DomainState +DomainStats +DomainStatus +DomainStatusList +DomainSuggestion +DomainSummaries +DomainSummary +DomainTransferability +DomainValidation +DomainValidationOption +DomainValidationOptions +DomainValidationRecord +Domains +DominantColor +DominantColors +DominantLanguage +DominantLanguageDetectionJobFilter +DominantLanguageDetectionJobProperties +DominantLanguageDetectionJobPropertiesList +DonutCenterOptions +DonutOptions +DoubleArrayOptions +DoubleColumnStatisticsData +DoubleOptions +DoubleRange +DoubleValue +DownScaling +DownlinkFrequency +DownlinkMode +DownlinkQueueMessage +DownlinkQueueMessagesList +DownloadDBLogFilePortionDetails +DownloadDBLogFilePortionMessage +DownloadDefaultKeyPairResult +DownloadSpeed +DownloadUri +DownloadUrl +DownmixControl +DpdTimeoutAction +DpdTimeoutSeconds +DpuExecutionInMillis +DrMax +DrMin +DraftUploadOutOfSyncException +DrcLine +DrcProfile +DrcRf +DriftCheckBaselines +DriftCheckBias +DriftCheckExplainability +DriftCheckModelDataQuality +DriftCheckModelQuality +DriftDetectionStatus +DriftInformation +DriftStatus +DriftedStackInstancesCount +DriftedStackResourceCount +DrillDownFilter +DrillDownFilters +DriveCacheType +Driver +DriverOpts +DrmSystems +Drop +DropDownControlDisplayOptions +DropDuplicates +DropFields +DropFrameTimecode +DropNullFields +Dropdown +Dropped +DryRun +DryRunConfig +DryRunId +DryRunMode +DryRunOperation +DryRunOperationException +DryRunProgressStatus +DryRunResults +DryRunStatus +DualStackDnsName +DukptAttributes +DukptDerivationAttributes +DukptDerivationType +DukptEncryptionAttributes +DukptKeyDerivationType +DukptKeyVariant +DuplicateAccessPointNameException +DuplicateAccountException +DuplicateCertificateException +DuplicateDocumentContent +DuplicateDocumentVersionName +DuplicateHandshakeException +DuplicateItemException +DuplicateListenerException +DuplicateLoadBalancerNameException +DuplicateOperationId +DuplicateOrganizationalUnitException +DuplicatePolicyAttachmentException +DuplicatePolicyException +DuplicatePolicyNameException +DuplicateProviderException +DuplicateRecordException +DuplicateRegistrationAction +DuplicateReportNameException +DuplicateRequest +DuplicateRequestException +DuplicateResourceException +DuplicateSSHPublicKeyException +DuplicateTagKeysException +DuplicateTargetGroupNameException +DuplicateTimestamps +DuplicateUserNameFault +DuplicatedAuditEventId +DuplicatedStopRequestException +Duration +DurationFrames +DurationHistogram +DurationInMinutes +DurationInMs +DurationInSeconds +DurationInYears +DurationMillis +DurationMinutes +DurationMode +DurationRange +DurationSMPTE +DurationSeconds +DurationSinceLastAccess +DurationUnits +DvbNitSettings +DvbSdtSettings +DvbSubDestinationSettings +DvbSubPids +DvbSubSourceSettings +DvbTdtSettings +DvbTeletextPid +DynamicCardVerificationCode +DynamicCardVerificationValue +DynamicConfiguration +DynamicDefaultValue +DynamicPartitioningConfiguration +DynamicRangeCompressionLine +DynamicRangeCompressionProfile +DynamicRangeCompressionRf +DynamicRangeControl +DynamicRouting +DynamicScalingConfiguration +DynamicScalingInSuspended +DynamicScalingOutSuspended +DynamicSubGop +DynamicTransform +DynamicValue +DynamicVariable +DynamicVariables +DynamoDB +DynamoDBAction +DynamoDBCatalogSource +DynamoDBStreamParameters +DynamoDBTarget +DynamoDBTargets +DynamoDBv2Action +DynamoDbSettings +DynamodbDataSourceConfig +Dynatrace +DynatraceConnectorProfileCredentials +DynatraceConnectorProfileProperties +DynatraceSourceProperties +E164PhoneNumber +E164PhoneNumbers +EBSEnabled +EBSFilter +EBSOptions +EBSOptionsStatus +EBSResourceUtilization +EBSStorageInfo +EBSUtilizationMetric +EC2AccessDeniedException +EC2AssociateRouteTableAction +EC2Capacities +EC2Capacity +EC2CopyRouteTableAction +EC2CreateRouteAction +EC2CreateRouteTableAction +EC2DeleteRouteAction +EC2ErrorCode +EC2FamilyFilter +EC2InboundPermissions +EC2InstanceCounts +EC2InstanceDetails +EC2InstanceId +EC2InstanceIdsToTerminate +EC2InstanceLimit +EC2InstanceLimits +EC2InstanceNotFoundException +EC2InstanceStateInvalidException +EC2InstanceType +EC2InstanceTypeInvalidException +EC2InstanceUnavailableException +EC2ReplaceRouteAction +EC2ReplaceRouteTableAssociationAction +EC2ResourceDetails +EC2ResourceUtilization +EC2SecurityGroup +EC2SecurityGroupId +EC2SecurityGroupName +EC2SecurityGroupOwnerId +EC2SecurityGroups +EC2Specification +EC2TagFilter +EC2TagSet +EC2ThrottledException +EC2UnexpectedException +ECSService +ECSServiceMappingLimitExceededException +ECSServiceProjectedMetric +ECSServiceProjectedUtilizationMetric +ECSServiceRecommendation +ECSServiceRecommendationFilter +ECSServiceRecommendationOption +ECSServiceRecommendedOptionProjectedMetric +ECSServiceUtilizationMetric +ECSTarget +ECSTaskSet +EDNS0ClientSubnetIP +EDNS0ClientSubnetMask +EFSAuthorizationConfig +EFSIOException +EFSMountConnectivityException +EFSMountFailureException +EFSMountTimeoutException +EFSVolumeConfiguration +EKSAnywhereVersion +EKSOnDeviceService +EKSOnDeviceServiceConfiguration +ELBInfo +EMAIL +EMR +EMRStepMetadata +ENILimitReachedException +EQ +ESInstanceDetails +ETag +Eac3AtmosSettings +Eac3Settings +EapMethod +Earfcn +EarliestBacktrackTime +EarliestRestorableDateTime +EarliestRestorableTime +EarliestTime +EarthObservationJobErrorDetails +EarthObservationJobSummaries +East +Ebif +EbpAudioInterval +EbpLookaheadMs +EbpPlacement +Ebs +EbsBlockDevice +EbsBlockDeviceConfig +EbsBlockDeviceConfigs +EbsBlockDevices +EbsCause +EbsConfiguration +EbsEncryptionByDefault +EbsEvent +EbsInfo +EbsInstanceBlockDevice +EbsInstanceBlockDeviceSpecification +EbsOptimized +EbsOptimizedAvailable +EbsOptimizedByDefault +EbsOptimizedInfo +EbsOptimizedSupport +EbsReadBytesPerSecond +EbsReadOpsPerSecond +EbsRequestId +EbsResult +EbsRootVolumeSize +EbsSnapshotConfiguration +EbsSnapshotPreservation +EbsStorageInfo +EbsStorageOnly +EbsVolume +EbsVolumeDetails +EbsVolumeScanDetails +EbsVolumes +EbsVolumesResult +EbsWriteBytesPerSecond +EbsWriteOpsPerSecond +EbuTtDDestinationSettings +Ec2AmiResource +Ec2AmiResources +Ec2AvailabilityZone +Ec2Config +Ec2Configuration +Ec2ImageId +Ec2ImagePropertiesNotSupportedFault +Ec2InstanceAggregation +Ec2InstanceAggregationResponse +Ec2InstanceAttributes +Ec2InstanceConnectEndpoint +Ec2InstanceId +Ec2InstanceIds +Ec2InstanceRegion +Ec2KeyName +Ec2Metadata +Ec2RecommendationsExportPreferences +Ec2RequestFailedException +Ec2SecurityGroupId +Ec2SecurityGroupName +Ec2SecurityGroupOwnerId +Ec2SecurityGroups +Ec2State +Ec2SubnetId +Ec2SubnetIds +Ec2VolumeId +EchoReduction +EcmPid +EcrConfiguration +EcrConfigurationState +EcrContainerImageMetadata +EcrRepositoryConfiguration +EcrRepositoryMetadata +EcrRescanDurationState +EcsCluster +EcsClusterArn +EcsClusterArns +EcsClusterDetails +EcsClusterName +EcsClusters +EcsContainerInstanceArn +EcsContainerOverride +EcsEnvironmentFile +EcsEnvironmentVariable +EcsEphemeralStorage +EcsInferenceAcceleratorOverride +EcsParameters +EcsResourceRequirement +EcsTaskDetails +EcsTaskOverride +EcsTaskParameters +Edge +EdgeAgentStatus +EdgeConfig +EdgeConfigs +EdgeDeployment +EdgeDeploymentConfig +EdgeDeploymentFailed +EdgeDeploymentFailedInStage +EdgeDeploymentModelConfig +EdgeDeploymentPending +EdgeDeploymentPendingInStage +EdgeDeploymentPlanArn +EdgeDeploymentPlanName +EdgeDeploymentPlanSummaries +EdgeDeploymentPlanSummary +EdgeDeploymentStageStartTime +EdgeDeploymentStatus +EdgeDeploymentStatusMessage +EdgeDeploymentSuccess +EdgeDeploymentSuccessInStage +EdgeLocation +EdgeLocations +EdgeMetric +EdgeModel +EdgeModelStat +EdgeModelSummary +EdgeOutputConfig +EdgePackagingJobArn +EdgePackagingJobName +EdgePackagingJobStatus +EdgePackagingJobStatusMessage +EdgePackagingJobSummaries +EdgePackagingJobSummary +EdgePresetDeploymentOutput +EdgeRetentionInHours +EdgeStatistics +EdgeStructure +EdgeSummaryStatistics +EdgeType +Edges +EdiPartyName +Edition +EditorId +EfaInfo +EfaSupported +Effect +EffectiveDate +EffectiveDeployment +EffectiveDeploymentStatusDetails +EffectiveEnd +EffectiveEngineVersion +EffectiveOn +EffectivePatch +EffectivePatches +EffectivePermission +EffectivePolicy +EffectivePolicyNotFoundException +EffectiveRecommendationPreferences +EffectiveStart +EfsFileLocation +EfsFileSystemConfiguration +EfsFilesystemArn +EfsStorageConfiguration +EfsVolumeConfiguration +Egress +EgressAccessLogs +EgressBytes +EgressCidrBlocks +EgressConfiguration +EgressDomain +EgressEndpoint +EgressEndpoints +EgressFilter +EgressFilterRules +EgressGatewayBridge +EgressIp +EgressOnlyInternetGateway +EgressOnlyInternetGatewayId +EgressOnlyInternetGatewayIds +EgressOnlyInternetGateways +EgressPackets +EgressType +Eirp +EksAttemptContainerDetail +EksAttemptDetail +EksClusterDetails +EksConfiguration +EksContainer +EksContainerDetail +EksContainerEnvironmentVariable +EksContainerOverride +EksContainerResourceRequirements +EksContainerSecurityContext +EksContainerVolumeMount +EksEmptyDir +EksHostPath +EksInfo +EksMetadata +EksPodProperties +EksPodPropertiesDetail +EksPodPropertiesOverride +EksProperties +EksPropertiesDetail +EksPropertiesOverride +EksSecret +EksSource +EksSourceClusterNamespace +EksVolume +ElapsedTimeInActiveSeconds +ElapsedTimeInSeconds +ElapsedTimeMillis +ElastiCacheInstanceDetails +ElasticBeanstalkServiceException +ElasticChannelConfiguration +ElasticGpuAssociation +ElasticGpuAssociationId +ElasticGpuAssociationState +ElasticGpuAssociationTime +ElasticGpuAssociations +ElasticGpuHealth +ElasticGpuId +ElasticGpuIds +ElasticGpuSet +ElasticGpuSpecification +ElasticGpuSpecificationResponse +ElasticGpuSpecificationSet +ElasticGpuSpecifications +ElasticGpuState +ElasticGpuType +ElasticGpus +ElasticInferenceAccelerator +ElasticInferenceAcceleratorArn +ElasticInferenceAcceleratorAssociation +ElasticInferenceAcceleratorAssociationId +ElasticInferenceAcceleratorAssociationState +ElasticInferenceAcceleratorAssociationTime +ElasticInferenceAcceleratorAssociations +ElasticInferenceAcceleratorHealth +ElasticInferenceAcceleratorSet +ElasticInferenceAccelerators +ElasticIp +ElasticIpStatus +ElasticIps +ElasticLoadBalancer +ElasticLoadBalancerListener +ElasticLoadBalancerName +ElasticLoadBalancers +ElasticResizeNumberOfNodeOptions +ElasticsearchAction +ElasticsearchBufferingHints +ElasticsearchClusterConfig +ElasticsearchClusterConfigStatus +ElasticsearchDataSourceConfig +ElasticsearchDestinationConfiguration +ElasticsearchDestinationDescription +ElasticsearchDestinationUpdate +ElasticsearchDomainConfig +ElasticsearchDomainStatus +ElasticsearchInstanceCount +ElasticsearchInstanceType +ElasticsearchInstanceTypes +ElasticsearchRetryOptions +ElasticsearchSettings +ElasticsearchVersion +ElasticsearchVersionStatus +ElasticsearchVersions +Element +ElementId +ElementName +ElementPath +ElementStatuses +ElementType +Elements +Elevation +ElicitSubSlot +ElicitationCodeHookInvocationSetting +EligibleForReplication +Email +EmailAddress +EmailAddressInUseException +EmailChannelRequest +EmailChannelResponse +EmailConfiguration +EmailConfigurationFailure +EmailConfigurationType +EmailContent +EmailField +EmailForwardingEnabled +EmailIdentities +EmailIdentity +EmailInsights +EmailMessage +EmailMessageActivity +EmailMessageByLink +EmailRecipients +EmailReference +EmailSendingAccount +EmailSettings +EmailStatus +EmailSubject +EmailSubjectByLink +EmailTags +EmailTemplate +EmailTemplateContent +EmailTemplateMetadata +EmailTemplateRequest +EmailTemplateResponse +EmailVerificationMessage +EmailVerificationSubject +Emails +EmbedHostDomains +EmbedUrl +EmbeddedDestinationSettings +EmbeddedPlusScte20DestinationSettings +EmbeddedSourceSettings +EmbeddedTimecodeOverride +EmergencyCallingConfiguration +EmergencyContact +EmergencyContactList +EmergencyPhoneNumber +EmitConsumerLagMetrics +EmitInterval +Emotion +Emotions +EmptyAsNull +EmptyBatchRequestException +EmptyFillColor +EmptyUploadException +EmptyVisual +EmrManagedMasterSecurityGroup +EmrManagedSlaveSecurityGroup +EnaSrdEnabled +EnaSrdSpecification +EnaSrdSupported +EnaSrdUdpEnabled +EnaSrdUdpSpecification +EnaSupport +Enable +EnableAWSServiceAccessRequest +EnableAcceleration +EnableAcceptEncodingBrotli +EnableAcceptEncodingGzip +EnableActionConfiguration +EnableAddOnRequest +EnableAddOnResult +EnableAdditionalMetadata +EnableAddressTransferRequest +EnableAddressTransferResult +EnableAlarmActionRequest +EnableAlarmActionsInput +EnableAllFeaturesResponse +EnableAllOpsDataSources +EnableAnswerMachineDetection +EnableApplicationLayerAutomaticResponseRequest +EnableAutoHealing +EnableAwsNetworkPerformanceMetricSubscriptionRequest +EnableAwsNetworkPerformanceMetricSubscriptionResult +EnableCapture +EnableCaseSensitiveIdentifier +EnableChannelIdentification +EnableClientAuthenticationRequest +EnableCloudwatchLogsExports +EnableContinuousBackup +EnableControlInput +EnableControlOutput +EnableCrossAccountsDiscovery +EnableCustomerOwnedIp +EnableDate +EnableDebugLogDelivery +EnableDefaultInternetAccess +EnableDefaultStandards +EnableDelegatedAdminAccountRequest +EnableDelegatedAdminAccountResponse +EnableDialOut +EnableDictionaryCompression +EnableDirectoryRequest +EnableDirectoryResponse +EnableDns64 +EnableDnsHostnames +EnableDnsSupport +EnableDomainAutoRenewRequest +EnableDomainTransferLockRequest +EnableDomainTransferLockResponse +EnableDynamicFieldUpdate +EnableECSManagedTags +EnableEbsEncryptionByDefaultRequest +EnableEbsEncryptionByDefaultResult +EnableEcsManagedTags +EnableEnhancedMonitoringInput +EnableExecuteCommand +EnableExplanations +EnableFastLaunchRequest +EnableFastLaunchResult +EnableFastSnapshotRestoreErrorItem +EnableFastSnapshotRestoreStateError +EnableFastSnapshotRestoreStateErrorItem +EnableFastSnapshotRestoreSuccessItem +EnableFastSnapshotRestoresRequest +EnableFastSnapshotRestoresResult +EnableGlobalWriteForwarding +EnableHomogenousTablespace +EnableHostedZoneDNSSECRequest +EnableHostedZoneDNSSECResponse +EnableHttpEndpoint +EnableHybrid +EnableIAMDatabaseAuthentication +EnableImageBlockPublicAccessRequest +EnableImageBlockPublicAccessResult +EnableImageDeprecationRequest +EnableImageDeprecationResult +EnableImportFindingsForProductRequest +EnableImportFindingsForProductResponse +EnableInsightRulesInput +EnableInsightRulesOutput +EnableIntegration +EnableInterContainerTrafficEncryption +EnableInternetAccess +EnableInteroperability +EnableIoTLoggingParams +EnableIotRoleAlias +EnableIpamOrganizationAdminAccountRequest +EnableIpamOrganizationAdminAccountResult +EnableKeyRequest +EnableKeyReuseOnNtTokenKeysetStorageFull +EnableKeyRotationRequest +EnableLDAPSRequest +EnableLniAtDeviceIndex +EnableLocalWriteForwarding +EnableLogFileValidation +EnableLogTypes +EnableLoggingMessage +EnableMFADeviceRequest +EnableMachineLearning +EnableMacieRequest +EnableMagneticStoreWrites +EnableMaintenanceMode +EnableManagedSpotTraining +EnableManifestOutput +EnableMediaMetricLogs +EnableMetricsCollectionQuery +EnableMinimumEncryptionConfiguration +EnableNetworkAddressUsageMetrics +EnableNetworkIsolation +EnableNonSecurity +EnableOnlineStore +EnableOrganizationAdminAccountRequest +EnablePadding +EnablePartialResultsStabilization +EnablePerformanceInsights +EnablePolicyTypeRequest +EnablePolicyTypeResponse +EnablePrimaryIpv6 +EnablePropagateAdditionalUserContextData +EnableRadiusRequest +EnableReachabilityAnalyzerOrganizationSharingRequest +EnableReachabilityAnalyzerOrganizationSharingResult +EnableRegexInPath +EnableRegionRequest +EnableRequest +EnableResourceNameDnsAAAARecord +EnableResourceNameDnsAAAARecordOnLaunch +EnableResourceNameDnsARecord +EnableResourceNameDnsARecordOnLaunch +EnableResponse +EnableRuleRequest +EnableSIPLogs +EnableSNI +EnableSSMAccess +EnableSageMakerMetricsTimeSeries +EnableSamplePath +EnableSecurityHubRequest +EnableSelfService +EnableSerialConsoleAccessRequest +EnableSerialConsoleAccessResult +EnableSharingWithAwsOrganizationResponse +EnableSimpleResponses +EnableSipMediaApplicationMessageLogs +EnableSnapshotCopyMessage +EnableSnapshotCopyResult +EnableSoftwareTokenMFAException +EnableSsl +EnableSsoRequest +EnableStageTransitionInput +EnableStatistics +EnableTerminationProtection +EnableTokenRevocation +EnableTopicRuleRequest +EnableTransitGatewayRouteTablePropagationRequest +EnableTransitGatewayRouteTablePropagationResult +EnableTunnelLifecycleControl +EnableUpdateCatalog +EnableUserRequest +EnableUserResponse +EnableVgwRoutePropagationRequest +EnableVisualization +EnableVolumeIORequest +EnableVpcClassicLinkDnsSupportRequest +EnableVpcClassicLinkDnsSupportResult +EnableVpcClassicLinkRequest +EnableVpcClassicLinkResult +EnableWWWSubdomain +EnableWorkDocs +EnableXRay +Enabled +EnabledByDefault +EnabledByMotion +EnabledCloudWatchLogsExports +EnabledCloudwatchLogsExports +EnabledControlSummary +EnabledDate +EnabledInBroker +EnabledMetric +EnabledMetrics +EnabledProtocols +EnabledServicePrincipal +EnabledServicePrincipals +EnabledTime +EnablementType +EnablingTime +EncipherOnly +EnclaveOptions +EnclaveOptionsRequest +EncodedData +EncodedKey +EncodedMessage +EncoderProfile +EncoderSettings +Encoding +EncodingName +EncodingParameters +EncodingParametersRequest +EncodingType +Encrypt +EncryptDataInput +EncryptDataOutput +EncryptRequest +EncryptResponse +Encrypted +EncryptedDecryptionKey +EncryptedKeyMaterial +EncryptedPinBlock +EncryptedWithHSM +Encryption +EncryptionAlgorithm +EncryptionAlgorithmOptions +EncryptionAlgorithms +EncryptionAtRest +EncryptionAtRestOptions +EncryptionAtRestOptionsStatus +EncryptionAttributes +EncryptionConfig +EncryptionConfiguration +EncryptionContext +EncryptionContextEquals +EncryptionContextSubset +EncryptionContractConfiguration +EncryptionDescription +EncryptionDisabled +EncryptionEnabled +EncryptionEntities +EncryptionEntity +EncryptionFailure +EncryptionInTransit +EncryptionInTransitSupported +EncryptionInfo +EncryptionIntegrityChecksFailedException +EncryptionKey +EncryptionKeyAccessDeniedException +EncryptionKeyArn +EncryptionKeyCheckValue +EncryptionKeyDisabledException +EncryptionKeyIdentifier +EncryptionKeyNotFoundException +EncryptionKeyUnavailableException +EncryptionKmsKeyId +EncryptionMethod +EncryptionMode +EncryptionOption +EncryptionOptions +EncryptionPolicyCount +EncryptionSetting +EncryptionSpecification +EncryptionStatus +EncryptionSupport +EncryptionType +End +EndBillingPeriod +EndDate +EndDateTime +EndDateType +EndEventTime +EndFrameNumber +EndHour +EndHourOfDay +EndLine +EndMarker +EndMinuteOfHour +EndMode +EndOfMeetingReminder +EndOffset +EndOffsetChar +EndOffsetMillis +EndPercentage +EndPoint +EndPoints +EndPosition +EndSession +EndSessionResult +EndTime +EndTimeExclusive +EndTimeOffset +EndTimeRange +EndTimecode +EndTimecodeSMPTE +EndTimestamp +EndTimestampMillis +EndUrl +EndUserLicenseAgreement +EndUserOptedOut +EndValue +EndWeekDay +EndedAt +EndedTimestamp +EndingHashKey +EndingOffsets +EndingSequenceNumber +Endpoint +EndpointAccess +EndpointAccessList +EndpointAlreadyExistsException +EndpointAlreadyExistsFault +EndpointArn +EndpointAttributes +EndpointAuthorization +EndpointAuthorizationAlreadyExistsFault +EndpointAuthorizationList +EndpointAuthorizationNotFoundFault +EndpointAuthorizationsPerClusterLimitExceededFault +EndpointBatchItem +EndpointBatchRequest +EndpointConfigArn +EndpointConfigName +EndpointConfigSummary +EndpointConfigs +EndpointConfiguration +EndpointConfigurations +EndpointCount +EndpointCreateTime +EndpointDemographic +EndpointDescription +EndpointDescriptions +EndpointDetails +EndpointDisabledException +EndpointDomain +EndpointDomainPrefix +EndpointEventBus +EndpointFilter +EndpointGroup +EndpointGroupAlreadyExistsException +EndpointGroupArn +EndpointGroupNotFoundException +EndpointGroupRegion +EndpointGroups +EndpointId +EndpointIdentifier +EndpointIdentifiers +EndpointIds +EndpointInfo +EndpointInput +EndpointInputConfiguration +EndpointIpAddress +EndpointIpAddressRange +EndpointItemResponse +EndpointLocation +EndpointMessageResult +EndpointMetadata +EndpointMetrics +EndpointName +EndpointNetworkConfiguration +EndpointNotFoundException +EndpointNotFoundFault +EndpointOutputConfiguration +EndpointPerformance +EndpointPerformances +EndpointPort +EndpointProperties +EndpointPropertiesList +EndpointPublicAccess +EndpointReentryCap +EndpointReentryInterval +EndpointRequest +EndpointResponse +EndpointResult +EndpointSendConfiguration +EndpointSetting +EndpointSettings +EndpointState +EndpointStatus +EndpointSummary +EndpointTemporarilyUnavailableException +EndpointType +EndpointTypes +EndpointURL +EndpointUri +EndpointUrl +EndpointUser +Endpoints +EndpointsPerAuthorizationLimitExceededFault +EndpointsPerClusterLimitExceededFault +EndpointsResponse +EndsWith +EnforceConsumerDeletion +EnforceHTTPS +EnforceProvidedLabels +EnforceSecurityGroupInboundRulesOnPrivateLinkTraffic +EnforceWorkGroupConfiguration +Enforced +EnforcedLimit +EnforcementInRecord +EnforcementStatus +Engagement +EngagementArn +EngagementId +EngagementMetrics +Engagements +Engine +EngineArn +EngineAttribute +EngineAttributes +EngineConfiguration +EngineDefaults +EngineDisplayName +EngineEdition +EngineExecutionTimeInMillis +EngineFamily +EngineFullVersion +EngineMode +EngineModel +EngineName +EngineNativeAuditFieldsIncluded +EngineNotSupportedException +EnginePatchVersion +EngineSecurityGroupId +EngineTranscribeMedicalSettings +EngineTranscribeSettings +EngineType +EngineVersion +EngineVersionInfo +EngineVersions +EngineVersionsSummary +EngineWorkflowResourceIdentifier +EnhancedImageScanFinding +EnhancedMetrics +EnhancedMonitoring +EnhancedMonitoringOutput +EnhancedMonitoringResourceArn +EnhancedVpcRouting +EniId +EniIp +EniPrivateIpAddress +EnqueueTimestamp +Enrichment +EnrichmentParameters +Enroll +EnrollmentConfig +EnrollmentFilter +EnrollmentFlags +EnrollmentFlagsV2 +EnrollmentFlagsV3 +EnrollmentFlagsV4 +EnrollmentId +EnrollmentJobFraudDetectionConfig +EnrollmentStatus +EnsureNoBackupInProcess +EnterStandbyAnswer +EnterStandbyQuery +EnterpriseId +Entities +EntitiesDetectionJobFilter +EntitiesDetectionJobProperties +EntitiesDetectionJobPropertiesList +EntitledApplication +EntitledApplications +Entitlement +EntitlementAlreadyExistsException +EntitlementArn +EntitlementAttribute +EntitlementData +EntitlementName +EntitlementNotAllowedException +EntitlementNotFoundException +EntitlementStatus +EntitlementUsage +EntitlementUsages +EntitlementValue +Entitlements +EntitlementsAllowed +Entity +EntityAccountFilter +EntityAggregate +EntityAlreadyExistsException +EntityAlreadyRegisteredException +EntityArn +EntityConfiguration +EntityDescription +EntityDetails +EntityDetailsList +EntityDetectorConfiguration +EntityDisplayData +EntityDoesNotExistException +EntityFilter +EntityId +EntityIdList +EntityIdentifier +EntityIds +EntityInfo +EntityItem +EntityLabel +EntityList +EntityName +EntityNotExistsException +EntityNotFoundException +EntityPath +EntityPersonaConfiguration +EntityPropertyReference +EntityRecognitionConfig +EntityRecognizerAnnotations +EntityRecognizerArn +EntityRecognizerDocuments +EntityRecognizerEntityList +EntityRecognizerEvaluationMetrics +EntityRecognizerFilter +EntityRecognizerInputDataConfig +EntityRecognizerMetadata +EntityRecognizerMetadataEntityTypesListItem +EntityRecognizerOutputDataConfig +EntityRecognizerProperties +EntityRecognizerPropertiesList +EntityRecognizerSummariesList +EntityRecognizerSummary +EntitySelectorExpression +EntityStateException +EntitySummary +EntitySummaryList +EntitySynonyms +EntityTags +EntityTemporarilyUnmodifiableException +EntityType +EntityTypes +EntityTypesEvaluationMetrics +EntityTypesListItem +EntityTypesToDetect +Entries +EntropyEncoding +Entry +EntryCount +EntryPoint +EnumDefinition +EnumValues +EnumerationValue +Environment +EnvironmentAccountConnection +EnvironmentAccountConnectionSummary +EnvironmentArn +EnvironmentClass +EnvironmentDescription +EnvironmentDescriptionsMessage +EnvironmentError +EnvironmentFile +EnvironmentFiles +EnvironmentId +EnvironmentIdentifier +EnvironmentIds +EnvironmentImage +EnvironmentInfo +EnvironmentInfoDescription +EnvironmentInformation +EnvironmentLanguage +EnvironmentLifecycle +EnvironmentLink +EnvironmentLinks +EnvironmentMember +EnvironmentName +EnvironmentNames +EnvironmentParameter +EnvironmentParameterRanges +EnvironmentParameters +EnvironmentPlatform +EnvironmentProperties +EnvironmentPropertyDescriptions +EnvironmentPropertyUpdates +EnvironmentQuota +EnvironmentResourceDescription +EnvironmentResourceDescriptionsMessage +EnvironmentResources +EnvironmentResourcesDescription +EnvironmentResponse +EnvironmentState +EnvironmentSummary +EnvironmentSummaryList +EnvironmentTemplate +EnvironmentTemplateFilter +EnvironmentTemplateSummary +EnvironmentTemplateVersion +EnvironmentTemplateVersionSummary +EnvironmentTier +EnvironmentVariable +EnvironmentVariables +EnvironmentVpc +EnvironmentVpcList +Environments +EoCloudCover +EoCloudCoverInput +EphemeralStorage +EphemerisDescription +EphemerisIdResponse +EphemerisItem +EphemerisMetaData +EpisodeId +Epoch +EpochLockingSettings +Epss +EpssDetails +EpssScore +Eq +Equals +EqualsTo +EqualsValue +Equation +Equipment +EquipmentDetection +EquipmentDetections +Error +ErrorArguments +ErrorAttribute +ErrorCachingMinTTL +ErrorCategory +ErrorCause +ErrorClearTimeMsec +ErrorCode +ErrorCodeReason +ErrorCount +ErrorData +ErrorDescription +ErrorDetail +ErrorDetailList +ErrorDetails +ErrorDocument +ErrorEntries +ErrorHandlingConfig +ErrorId +ErrorInfo +ErrorInformation +ErrorList +ErrorMessage +ErrorMetric +ErrorMetrics +ErrorName +ErrorOutputPrefix +ErrorPercentage +ErrorReason +ErrorReportConfiguration +ErrorReportLocation +ErrorResponse +ErrorRetryDuration +ErrorRootCause +ErrorRootCauseEntity +ErrorRootCauseService +ErrorRootCauses +ErrorStatistics +ErrorString +ErrorTimestamp +ErrorTopic +ErrorType +ErrorValue +ErroredActions +Errors +ErrorsListItem +EsRateInPes +Esam +EsamManifestConfirmConditionNotification +EsamSettings +EsamSignalProcessingNotification +EscapeChar +Escaper +Esps +Essential +Established +EstablishedMultiRegionAccessPointPolicy +EstimateByTime +EstimateTemplateCostInput +EstimateTemplateCostOutput +Estimated +EstimatedAverageCoverage +EstimatedAverageUtilization +EstimatedBreakEvenInMonths +EstimatedBytesToTransfer +EstimatedCompletionTime +EstimatedCoverage +EstimatedDataToScanBytes +EstimatedDiskUtilizationPercent +EstimatedEvaluationTimeRemainingInMinutes +EstimatedFilesToDelete +EstimatedFilesToTransfer +EstimatedInstanceWarmup +EstimatedMonthlyCost +EstimatedMonthlyOnDemandCost +EstimatedMonthlySavings +EstimatedMonthlySavingsAmount +EstimatedMonthlySavingsPercentage +EstimatedMonthlyStorageCost +EstimatedNewCommitmentUtilization +EstimatedNumberOfUsers +EstimatedOnDemandCost +EstimatedOnDemandCostWithCurrentCommitment +EstimatedProgress +EstimatedROI +EstimatedReservationCostForLookbackPeriod +EstimatedResourceSize +EstimatedSPCost +EstimatedSavingsAmount +EstimatedSavingsPercentage +EstimatedSecondsToCompletion +EstimatedTimeRemainingInMinutes +EstimatedTimeToCompletionInSeconds +EstimatedTotalCost +EstimatedTotalMonthlySavingsAmount +EstimatedUpdateTime +EstimatedWaitTime +Etag +Ethereum +Ethernet0 +Ethernet0Status +Ethernet1 +Ethernet1Status +EthernetPayload +EthernetStatus +EtvPlatformPid +EtvSignalPid +Euid +Eula +EulaAcceptance +EutranCid +EvalActionName +EvalDecision +EvalDecisionDetails +EvalResourceDecision +EvalResourceName +EvaluateCodeErrorDetail +EvaluateCodeRequest +EvaluateCodeResponse +EvaluateDataQuality +EvaluateDataQualityMultiFrame +EvaluateExpressionInput +EvaluateExpressionOutput +EvaluateFeatureRequest +EvaluateFeatureResponse +EvaluateLowSampleCountPercentile +EvaluateMappingTemplateRequest +EvaluateMappingTemplateResponse +EvaluateOnExit +EvaluatePullRequestApprovalRulesInput +EvaluatePullRequestApprovalRulesOutput +EvaluateSessionRequest +EvaluateSessionResponse +EvaluateTargetHealth +EvaluatedExternalModel +EvaluatedMetrics +EvaluatedModelArn +EvaluatedModelMetrics +EvaluatedModelVersion +EvaluatedRule +Evaluation +EvaluationAnswerInput +EvaluationAnswerOutput +EvaluationArn +EvaluationContext +EvaluationContextIdentifier +EvaluationDataEndTime +EvaluationDataSourceId +EvaluationDataStartTime +EvaluationEndTimestamp +EvaluationErrorItem +EvaluationForm +EvaluationFormArn +EvaluationFormContent +EvaluationFormId +EvaluationFormNumericQuestionOption +EvaluationFormNumericQuestionProperties +EvaluationFormQuestion +EvaluationFormScoringStrategy +EvaluationFormSection +EvaluationFormSingleSelectQuestionAutomation +EvaluationFormSingleSelectQuestionOption +EvaluationFormSingleSelectQuestionProperties +EvaluationFormSummary +EvaluationFormSummaryList +EvaluationFormTitle +EvaluationFormVersion +EvaluationFormVersionSummary +EvaluationFormVersionSummaryList +EvaluationId +EvaluationLimitExceeded +EvaluationManifest +EvaluationManifestS3Prefix +EvaluationMessage +EvaluationMetadata +EvaluationMetrics +EvaluationMode +EvaluationModeConfiguration +EvaluationModes +EvaluationName +EvaluationNote +EvaluationParameters +EvaluationPeriod +EvaluationPeriods +EvaluationRequest +EvaluationResult +EvaluationResultIdentifier +EvaluationResultQualifier +EvaluationResults +EvaluationRule +EvaluationScore +EvaluationStartDate +EvaluationStartTimestamp +EvaluationState +EvaluationStatus +EvaluationSummary +EvaluationSummaryList +EvaluationTime +EvaluationTimeout +EvaluationType +EvaluationWaitTime +Evaluations +EvaluatorArn +Event +EventAccountFilter +EventAction +EventActionArn +EventActionEntry +EventActionId +EventActions +EventAggregate +EventArn +EventBatchingCondition +EventBridge +EventBridgeAction +EventBridgeActionDefinition +EventBridgeBus +EventBridgeConfiguration +EventBridgeDataSourceConfig +EventBridgeDestinationProperties +EventBridgeEnabled +EventBridgeEventBusParameters +EventBridgeParameters +EventBridgeRuleName +EventBus +EventBusArn +EventBusName +EventBuses +EventCategories +EventCategoriesList +EventCategoriesMap +EventCategoriesMapList +EventCategoriesMessage +EventCategory +EventCategoryGroup +EventCategoryGroupList +EventClass +EventCode +EventCondition +EventConfigurationItem +EventConfigurationsList +EventContextData +EventContextDataType +EventCount +EventDataStore +EventDataStoreARNInvalidException +EventDataStoreAlreadyExistsException +EventDataStoreArn +EventDataStoreHasOngoingImportException +EventDataStoreMaxLimitExceededException +EventDataStoreNotFoundException +EventDataStoreTerminationProtectedException +EventDataStores +EventDate +EventDescription +EventDescriptionsMessage +EventDestination +EventDestinationAlreadyExistsException +EventDestinationDefinition +EventDestinationDoesNotExistException +EventDestinationName +EventDestinations +EventDetail +EventDetails +EventDetailsErrorItem +EventDimensions +EventDurationInSeconds +EventEndTime +EventFeedback +EventFeedbackType +EventFilter +EventFirstSeen +EventId +EventIdMode +EventIncludedData +EventInfo +EventInfoMap +EventInformation +EventIngestionUrl +EventIntegration +EventIntegrationArn +EventIntegrationAssociation +EventIntegrationAssociationArn +EventIntegrationAssociationId +EventIntegrationAssociations +EventIntegrationName +EventIntegrations +EventItemResponse +EventLastReplayedTime +EventLastSeen +EventList +EventLog +EventLogEntry +EventName +EventNotificationItemConfigurations +EventObject +EventOrchestration +EventParameters +EventPattern +EventPayload +EventPredictionSummary +EventQueueArn +EventResource +EventResourceARN +EventResourceName +EventResourceType +EventResponse +EventRisk +EventRiskType +EventSelector +EventSelectors +EventSource +EventSourceArn +EventSourceId +EventSourceMappingConfiguration +EventSourceMappings +EventSourceName +EventSourceToken +EventSources +EventSourcesConfig +EventStartCondition +EventStartTime +EventStatus +EventStopBehavior +EventStream +EventStreamArn +EventStreamDestinationDetails +EventStreamName +EventStreamSummary +EventSubType +EventSubscription +EventSubscriptionArn +EventSubscriptionQuotaExceededFault +EventSubscriptionsList +EventSubscriptionsMessage +EventSummary +EventTaggingEnabled +EventThreshold +EventTime +EventTimeFeatureName +EventTimeRange +EventTopic +EventTopics +EventTracker +EventTrackerSummary +EventTriggerDefinition +EventTriggers +EventType +EventTypeFilter +EventTypeId +EventTypeIds +EventTypeName +EventTypeSummary +EventTypes +EventVariableSummary +Events +EventsBatch +EventsCompleted +EventsConfiguration +EventsDetectionJobFilter +EventsDetectionJobProperties +EventsDetectionJobPropertiesList +EventsItemResponse +EventsMatched +EventsMessage +EventsPollInterval +EventsRequest +EventsResponse +EventsScanned +Evidence +EvidenceFinderEnablement +EvidenceInsights +EwsAvailabilityProvider +EwsEndpoint +EwsPassword +EwsProvider +EwsUsername +ExactCidrMatches +ExactFramerate +ExactSettings +Example +ExampleError +ExasolParameters +ExceedsLimitException +Excel +ExcelOptions +ExceptionCause +ExceptionDescription +ExceptionName +ExceptionResponse +ExceptionType +Exceptions +ExcessCapacityTerminationPolicy +ExchangeCodeForTokenRequest +ExchangeCodeForTokenRequestBody +ExchangeCodeForTokenResponse +ExchangeId +ExchangedReservedNode +Exclude +ExcludeArchived +ExcludeAttachmentFilePatterns +ExcludeBootVolume +ExcludeCharacters +ExcludeColumnSchema +ExcludeCompliantResources +ExcludeDataVolumeIds +ExcludeDataVolumeTags +ExcludeDevicesDeployedInOtherStage +ExcludeFeaturesAttribute +ExcludeFilters +ExcludeLowercase +ExcludeManagementEventSources +ExcludeMap +ExcludeMimeTypes +ExcludeNumbers +ExcludePaths +ExcludePeriodConfiguration +ExcludePunctuation +ExcludeResourceTags +ExcludeRetainedVariantProperties +ExcludeSharedDrives +ExcludeSpaces +ExcludeSpecifiedAccounts +ExcludeSpecifiedOrganizationalUnits +ExcludeUppercase +ExcludeUserAccounts +ExcludeVerboseContent +ExcludedAccounts +ExcludedAttendeeIds +ExcludedColumnNames +ExcludedCookies +ExcludedHeaders +ExcludedInstanceTypes +ExcludedMembers +ExcludedPages +ExcludedRule +ExcludedRules +ExcludedTimeRanges +Excludes +Exclusion +ExclusionByResourceTypes +ExclusionFileNamePatterns +ExclusionFileTypePatterns +ExclusionFolderNamePatterns +ExclusionPatterns +ExclusionPreview +Exclusions +ExclusiveEndBillingPeriod +ExclusiveEndTime +ExclusiveStartApplicationName +ExclusiveStartBackupArn +ExclusiveStartDeliveryStreamName +ExclusiveStartDestinationId +ExclusiveStartGlobalTableName +ExclusiveStartKey +ExclusiveStartShardId +ExclusiveStartStreamArn +ExclusiveStartStreamName +ExclusiveStartTableName +ExclusiveStartTagKey +ExecArgs +Executable +ExecutableParameters +ExecutablePath +ExecutableSha256 +ExecutableUsers +ExecuteBudgetActionRequest +ExecuteBudgetActionResponse +ExecuteChangeSetInput +ExecuteCommandConfiguration +ExecuteCommandLogConfiguration +ExecuteCommandRequest +ExecuteCommandResponse +ExecuteCommandSessionConfiguration +ExecuteCoreNetworkChangeSetRequest +ExecuteFastResetInput +ExecuteFastResetOutput +ExecuteGremlinExplainQueryInput +ExecuteGremlinExplainQueryOutput +ExecuteGremlinProfileQueryInput +ExecuteGremlinProfileQueryOutput +ExecuteGremlinQueryInput +ExecuteGremlinQueryOutput +ExecuteOpenCypherExplainQueryInput +ExecuteOpenCypherExplainQueryOutput +ExecuteOpenCypherQueryInput +ExecuteOpenCypherQueryOutput +ExecutePolicyType +ExecuteProvisionedProductPlanInput +ExecuteProvisionedProductPlanOutput +ExecuteProvisionedProductServiceActionInput +ExecuteProvisionedProductServiceActionOutput +ExecuteQueryRequest +ExecuteQueryResponse +ExecuteScheduledQueryRequest +ExecuteSqlRequest +ExecuteSqlResponse +ExecuteStatement +ExecuteStatementException +ExecuteStatementInput +ExecuteStatementOutput +ExecuteStatementRequest +ExecuteStatementResponse +ExecuteStatementResult +ExecuteTimeout +ExecuteToken +ExecuteTransactionInput +ExecuteTransactionOutput +ExecutedBy +ExecutedTime +ExecutedVersion +Execution +ExecutionAbortedEventDetails +ExecutionAlreadyExists +ExecutionClass +ExecutionConfiguration +ExecutionControls +ExecutionCount +ExecutionDate +ExecutionDetails +ExecutionDoesNotExist +ExecutionElapsedTime +ExecutionEndDateTime +ExecutionEndTime +ExecutionEngine +ExecutionEngineConfig +ExecutionEngineId +ExecutionError +ExecutionErrorDetails +ExecutionFailedEventDetails +ExecutionId +ExecutionLimitExceeded +ExecutionList +ExecutionListItem +ExecutionMessage +ExecutionMetrics +ExecutionOrder +ExecutionParameter +ExecutionParameters +ExecutionProperty +ExecutionRecord +ExecutionResult +ExecutionResults +ExecutionRole +ExecutionRoleArn +ExecutionRoleIdentityConfig +ExecutionRoleName +ExecutionStartDateTime +ExecutionStartTime +ExecutionStartedEventDetails +ExecutionStatistics +ExecutionStats +ExecutionStatus +ExecutionStatusDetail +ExecutionStepResult +ExecutionSucceededEventDetails +ExecutionSummary +ExecutionTime +ExecutionTimeFilter +ExecutionTimeInMillis +ExecutionTimedOutEventDetails +ExecutionTimeout +ExecutionTrigger +ExecutionType +Executions +ExecutorConfiguration +ExecutorId +ExecutorSize +ExecutorState +ExecutorStateFilter +ExecutorType +ExecutorsSummary +ExistingEnrollmentAction +ExistingHourlyCommitment +ExistingObjectReplication +ExistingVersion +Exists +ExitCode +ExitMessage +ExitStandbyAnswer +ExitStandbyQuery +Expected +ExpectedAttributeValue +ExpectedBucketOwner +ExpectedCompletionDate +ExpectedCompletionTimeMinutes +ExpectedFirewallEndpoint +ExpectedFirewallSubnetId +ExpectedFirewallSubnetRoutes +ExpectedInternetGatewayRoutes +ExpectedManifestBucketOwner +ExpectedNextSnapshotScheduleTime +ExpectedNextSnapshotScheduleTimeStatus +ExpectedPolicyDescription +ExpectedProperties +ExpectedResourceUtilization +ExpectedRoute +ExpectedRouteTable +ExpectedRoutes +ExpectedSourceBucketOwner +ExpectedValue +ExpenseCurrency +ExpenseDetection +ExpenseDocument +ExpenseDocuments +ExpenseField +ExpenseGroupProperty +ExpenseIndex +ExpenseType +ExperienceConfiguration +ExperienceEndpoint +ExperienceEntitiesSummary +ExperienceScore +ExperiencesSummary +Experiment +ExperimentAction +ExperimentActionState +ExperimentArn +ExperimentCloudWatchLogsLogConfiguration +ExperimentConfig +ExperimentExecution +ExperimentLogConfiguration +ExperimentName +ExperimentReport +ExperimentResultsData +ExperimentS3LogConfiguration +ExperimentSchedule +ExperimentSource +ExperimentState +ExperimentStopCondition +ExperimentSummaries +ExperimentSummary +ExperimentTarget +ExperimentTargetFilter +ExperimentTemplate +ExperimentTemplateAction +ExperimentTemplateCloudWatchLogsLogConfiguration +ExperimentTemplateCloudWatchLogsLogConfigurationInput +ExperimentTemplateLogConfiguration +ExperimentTemplateS3LogConfiguration +ExperimentTemplateS3LogConfigurationInput +ExperimentTemplateStopCondition +ExperimentTemplateSummary +ExperimentTemplateTarget +ExperimentTemplateTargetFilter +ExperimentTemplateTargetInputFilter +Expiration +ExpirationCriterion +ExpirationDate +ExpirationDays +ExpirationInDays +ExpirationModel +ExpirationSettings +ExpirationTime +ExpirationTimeResponse +ExpirationTimestamp +ExpireAt +ExpirePasswords +ExpireSessionRequest +ExpireTime +Expired +ExpiredAt +ExpiredCodeException +ExpiredException +ExpiredImportTokenException +ExpiredIteratorException +ExpiredNextTokenException +ExpiredObjectDeleteMarker +ExpiredStreamException +ExpiredTokenException +Expires +ExpiresAfter +ExpiresAt +ExpiresIn +ExpiresInSeconds +ExpiringVersion +Expiry +ExpiryDateTime +ExpiryEvents +ExpiryEventsConfiguration +ExpiryMinutes +ExpiryTime +ExpiryTimestamp +ExplainPredictor +Explainabilities +Explainability +ExplainabilityArn +ExplainabilityConfig +ExplainabilityExportArn +ExplainabilityExportName +ExplainabilityExportSummary +ExplainabilityExports +ExplainabilityInfo +ExplainabilityName +ExplainabilitySummary +ExplainerConfig +Explanation +ExplanationCode +Explanations +ExplicitAuthFlows +ExplicitDeny +ExplicitHashKey +ExplicitHierarchy +ExplicitIds +ExploitAvailable +ExploitObserved +ExploitabilityDetails +ExponentialRolloutRate +Export +ExportApiRequest +ExportApiResponse +ExportArn +ExportArtifacts +ExportAssetToSignedUrl +ExportAssetToSignedUrlRequestDetails +ExportAssetToSignedUrlResponseDetails +ExportAssetsToS3 +ExportAssetsToS3RequestDetails +ExportAssetsToS3ResponseDetails +ExportAttributeName +ExportAutoScalingGroupRecommendationsRequest +ExportAutoScalingGroupRecommendationsResponse +ExportBackupPlanTemplateInput +ExportBackupPlanTemplateOutput +ExportBundleRequest +ExportBundleResult +ExportCertificateRequest +ExportCertificateResponse +ExportClientVpnClientCertificateRevocationListRequest +ExportClientVpnClientCertificateRevocationListResult +ExportClientVpnClientConfigurationRequest +ExportClientVpnClientConfigurationResult +ExportComponentsRequest +ExportComponentsResponse +ExportConfigurationsResponse +ExportConflictException +ExportCreationTime +ExportDataSource +ExportDescription +ExportDestination +ExportEBSVolumeRecommendationsRequest +ExportEBSVolumeRecommendationsResponse +ExportEC2InstanceRecommendationsRequest +ExportEC2InstanceRecommendationsResponse +ExportECSServiceRecommendationsRequest +ExportECSServiceRecommendationsResponse +ExportEarthObservationJobInput +ExportEarthObservationJobOutput +ExportErrorData +ExportErrorDetails +ExportErrorDetailsOutput +ExportFilter +ExportFormat +ExportFormsRequest +ExportFormsResponse +ExportFromTime +ExportHiddenFieldsOption +ExportId +ExportImageRequest +ExportImageResult +ExportImageTask +ExportImageTaskId +ExportImageTaskIds +ExportImageTasks +ExportInfo +ExportJobProperties +ExportJobPropertiesList +ExportJobRequest +ExportJobResource +ExportJobResponse +ExportJobSummary +ExportJobs +ExportJobsResponse +ExportJournalToS3Request +ExportJournalToS3Response +ExportKeyIdentifier +ExportKeyInput +ExportKeyOutput +ExportLabelsTaskRunProperties +ExportLambdaFunctionRecommendationsRequest +ExportLambdaFunctionRecommendationsResponse +ExportLensInput +ExportLensOutput +ExportLicenseRecommendationsRequest +ExportLicenseRecommendationsResponse +ExportManifest +ExportMetadataModelAssessmentMessage +ExportMetadataModelAssessmentResponse +ExportMetadataModelAssessmentResultEntry +ExportMetric +ExportName +ExportNotFoundException +ExportNotebookInput +ExportNotebookOutput +ExportOnly +ExportPath +ExportProjectRequest +ExportProjectResult +ExportReadSet +ExportReadSetDetail +ExportReadSetFilter +ExportReadSetJobDetail +ExportResourceSpecification +ExportResponse +ExportResults +ExportRevisionToS3 +ExportRevisionsToS3 +ExportRevisionsToS3RequestDetails +ExportRevisionsToS3ResponseDetails +ExportS3DataInput +ExportSchemaRequest +ExportSchemaResponse +ExportServerEngineAttributeRequest +ExportServerEngineAttributeResponse +ExportServerSideEncryption +ExportSnapshotRecord +ExportSnapshotRecordSourceInfo +ExportSnapshotRequest +ExportSnapshotResult +ExportSortBy +ExportSourceImages +ExportSourceNetworkCfnTemplateRequest +ExportSourceNetworkCfnTemplateResponse +ExportSourceType +ExportSqlDetails +ExportStatistics +ExportStatus +ExportSummaries +ExportSummary +ExportTableToPointInTimeInput +ExportTableToPointInTimeOutput +ExportTask +ExportTaskAlreadyExistsFault +ExportTaskError +ExportTaskExecutionInfo +ExportTaskId +ExportTaskIdentifier +ExportTaskIds +ExportTaskNotFoundFault +ExportTaskS3Location +ExportTaskS3LocationRequest +ExportTaskStatus +ExportTaskSummary +ExportTasks +ExportTasksMessage +ExportThemesRequest +ExportThemesResponse +ExportTime +ExportToCSVOption +ExportToS3Task +ExportToS3TaskSpecification +ExportToTime +ExportToken +ExportTr31KeyBlock +ExportTr34KeyBlock +ExportTransitGatewayRoutesRequest +ExportTransitGatewayRoutesResult +ExportType +ExportVectorEnrichmentJobInput +ExportVectorEnrichmentJobOutput +ExportVectorEnrichmentJobOutputConfig +ExportVersion +ExportViewType +ExportWithHiddenFieldsOption +Exportable +ExportableKey +ExportableLogTypes +Exported +ExportedEnvironmentVariable +ExportedRecordsCount +ExportingConfig +ExportingLocation +ExportingStackId +Exports +ExposeHeaders +Expression +ExpressionAttributeNames +ExpressionAttributeValues +ExpressionName +ExpressionNames +ExpressionStatus +ExpressionType +ExpressionValue +ExpressionVariable +Expressions +ExtendLicenseConsumptionRequest +ExtendLicenseConsumptionResponse +ExtendTransactionRequest +ExtendedDataServices +ExtendedKeyUsage +ExtendedKeyUsageObjectIdentifier +ExtendedKeyUsageType +ExtendedKeyUsages +ExtendedS3DestinationConfiguration +ExtendedS3DestinationDescription +ExtendedS3DestinationUpdate +ExtendedStatistic +ExtendedStatistics +Extension +ExtensionArn +ExtensionAssociation +ExtensionAssociationId +ExtensionAssociationSummary +ExtensionAssociations +ExtensionDetails +ExtensionField +ExtensionFields +ExtensionId +ExtensionIdentifier +ExtensionSummary +ExtensionVersion +ExtensionVersionDetails +ExtensionVersionNumber +ExtensionVersions +Extensions +ExtensionsV2 +ExtensionsV3 +ExtensionsV4 +ExternalAudioFileInput +ExternalDataFilteringAllowList +ExternalEvaluation +ExternalEventsDetail +ExternalId +ExternalIds +ExternalImageId +ExternalLoginFederationProviderType +ExternalLoginFederationProviderUrl +ExternalLoginId +ExternalMeetingId +ExternalMetricStatus +ExternalMetricsPreference +ExternalModel +ExternalModelOutputs +ExternalModelSummary +ExternalServiceException +ExternalSourceSetting +ExternalTableDefinition +ExternalUrlConfig +ExternalUserId +ExternalUserIds +ExternalWorkflowExecutionCancelRequestedEventAttributes +ExternalWorkflowExecutionSignaledEventAttributes +ExtraArchivedLogDestIds +ExtraConnectionAttributes +ExtraHosts +ExtraJarsS3Path +ExtraParam +ExtraParams +ExtraPythonLibsS3Path +ExtractDocId +ExtractedCharacters +ExtractedCharactersListItem +Extraction +Extractions +EyeDirection +EyeOpen +Eyeglasses +EyesOpen +F1 +F1Score +F4vSettings +FCntStart +FIAuthKey +FIPSEnabled +FMSPolicyUpdateFirewallCreationConfigAction +FNwkSIntKey +FPort +FPorts +FQDN +FSxWindowsFileServerAuthorizationConfig +FSxWindowsFileServerVolumeConfiguration +Fabric +Face +FaceAttributes +FaceCount +FaceDetail +FaceDetails +FaceDetection +FaceId +FaceIds +FaceMatch +FaceMatchThreshold +FaceMatches +FaceModelVersion +FaceModelVersions +FaceOccluded +FaceRecord +FaceRecords +FaceSearch +FaceSearchSettings +Facebook +Faces +Facet +FacetAlreadyExistsException +FacetAttribute +FacetAttributeDefinition +FacetAttributeReference +FacetAttributeUpdate +FacetEnabled +FacetFilter +FacetInUseException +FacetName +FacetNames +FacetNotFoundException +FacetResult +FacetResults +FacetStyle +FacetValidationException +Facetable +Facets +FactoryPresetFreqsList +FactorySupport +FadeIn +FadeOut +Fail +FailOnWarnings +FailStepMetadata +FailTasksOnLobTruncation +FailWorkflowExecutionDecisionAttributes +FailWorkflowExecutionFailedEventAttributes +Failed +FailedAccount +FailedActions +FailedAssociatedResources +FailedBatchItem +FailedBatches +FailedCampaignStateResponse +FailedCapacityReservationFleetCancellationResult +FailedCount +FailedCreateAssociation +FailedCreateSimulationJobRequest +FailedCreateStandbyWorkspacesRequest +FailedCreateWorkspaceRequest +FailedCustomVocabularyItem +FailedDeleteRemediationExceptionsBatch +FailedDependencyException +FailedDisassociatedResources +FailedDocuments +FailedEntity +FailedEntityList +FailedEntries +FailedEntryCount +FailedEvaluations +FailedFindings +FailedFleetCancellations +FailedImportedDeviceCount +FailedItem +FailedItemDetails +FailedItems +FailedLoginAttempts +FailedMemberAccountEc2DeepInspectionStatusState +FailedNonRetryableError +FailedPieces +FailedPutCount +FailedQueuedPurchaseDeletion +FailedQueuedPurchaseDeletions +FailedReason +FailedRecordCount +FailedRecordsCount +FailedRecordsS3Url +FailedRemediationBatch +FailedRemediationExceptionBatch +FailedRequest +FailedRequests +FailedResource +FailedResourceAccessException +FailedResourcesMap +FailedS3Resource +FailedScheduledActions +FailedScheduledUpdateGroupActionRequest +FailedScheduledUpdateGroupActions +FailedServiceActionAssociation +FailedServiceActionAssociations +FailedStackInstancesCount +FailedStandbyRequests +FailedStatusDetails +FailedSteps +FailedUsers +FailedWorkspaceChangeRequest +Failover +FailoverCondition +FailoverConditionSettings +FailoverConditions +FailoverConfig +FailoverCriteria +FailoverDBClusterMessage +FailoverDBClusterResult +FailoverGlobalClusterMessage +FailoverGlobalClusterResult +FailoverGlobalReplicationGroupMessage +FailoverGlobalReplicationGroupResult +FailoverMode +FailoverShardRequest +FailoverShardResponse +FailoverState +Failure +FailureAction +FailureByQueryException +FailureCause +FailureCode +FailureCodes +FailureDescription +FailureDetails +FailureException +FailureHandlingPolicy +FailureInfo +FailureLocation +FailureMessage +FailureMessages +FailureMode +FailurePolicy +FailureReason +FailureReasons +FailureRedirectionURL +FailureResource +FailureRetentionPeriodInDays +FailureStage +FailureStrings +FailureSummary +FailureThreshold +FailureTime +FailureToleranceCount +FailureTolerancePercentage +FailureType +FailureValues +Failures +FairsharePolicy +FallBackPhoneNumber +FallbackAction +FallbackBehavior +FallbackFont +FalseActivity +FalseyCellValue +FalseyCellValueSynonyms +Family +FamilyName +FaqIds +FaqStatistics +FaqSummary +FaqSummaryItems +FargatePlatformConfiguration +FargateProfile +FargateProfileSelector +FastLaunchConfiguration +FastLaunchImages +FastLaunchLaunchTemplateSpecification +FastLaunchLaunchTemplateSpecificationRequest +FastLaunchLaunchTemplateSpecificationResponse +FastLaunchSnapshotConfiguration +FastLaunchSnapshotConfigurationRequest +FastLaunchSnapshotConfigurationResponse +FastResetToken +FastRestoreRule +FastRestored +FastSnapshotRestoreStateErrors +FastSnapshotRestores +Fault +FaultCode +FaultCodes +FaultCount +FaultCountHigh +FaultCountLow +FaultRootCause +FaultRootCauseEntity +FaultRootCauseService +FaultRootCauses +FaultStatistics +FaultTolerance +FavoritePages +Fax +Feature +FeatureActivations +FeatureAdditions +FeatureConfigurations +FeatureDefinition +FeatureDefinitions +FeatureGroup +FeatureGroupArn +FeatureGroupName +FeatureGroupStatus +FeatureGroupStatusEquals +FeatureGroupSummaries +FeatureGroupSummary +FeatureHeaders +FeatureMetadata +FeatureName +FeatureNames +FeatureNotAvailableException +FeatureParameter +FeatureSet +FeatureSpecificationS3Uri +FeatureStoreOutput +FeatureSummary +FeatureTransformation +FeatureType +FeatureTypes +FeatureValue +FeaturedDocument +FeaturedDocumentMissing +FeaturedDocumentWithMetadata +FeaturedDocuments +FeaturedDocumentsMissing +FeaturedDocumentsWithMetadata +FeaturedResultsConflictException +FeaturedResultsItem +FeaturedResultsItems +FeaturedResultsSet +FeaturedResultsSetId +FeaturedResultsSetIds +FeaturedResultsSetName +FeaturedResultsSetSummary +FeaturedResultsSetSummaryItems +Features +FeaturesAttribute +Featurization +FeaturizationConfig +FeaturizationMethod +FeaturizationMethodName +FeaturizationMethodParameters +FeaturizationPipeline +Featurizations +Fec +FecOutputSettings +FederatedAuthentication +FederatedAuthenticationRequest +FederatedDatabase +FederatedResourceAlreadyExistsException +FederatedTable +FederatedUser +FederatedUserId +FederationParameters +FederationSourceErrorCode +FederationSourceException +FederationSourceRetryableException +Feedback +FeedbackDate +FeedbackForwardingAddress +FeedbackForwardingEmailAddress +FeedbackForwardingEmailAddressIdentityArn +FeedbackForwardingStatus +FeedbackId +FeedbackToken +FeedbackURL +FeedbackValue +FetchOwner +FetchPage +FetchPageRequest +FetchPageResult +FiberOpticCableType +Field +FieldBasedTooltip +FieldConfig +FieldDataPathValues +FieldDelimiter +FieldEncoding +FieldError +FieldFolder +FieldFolders +FieldGroup +FieldId +FieldIdentifier +FieldInfo +FieldInputConfig +FieldItem +FieldLabelType +FieldLevel +FieldLevelEncryption +FieldLevelEncryptionConfig +FieldLevelEncryptionConfigAlreadyExists +FieldLevelEncryptionConfigInUse +FieldLevelEncryptionId +FieldLevelEncryptionList +FieldLevelEncryptionProfile +FieldLevelEncryptionProfileAlreadyExists +FieldLevelEncryptionProfileConfig +FieldLevelEncryptionProfileInUse +FieldLevelEncryptionProfileList +FieldLevelEncryptionProfileSizeExceeded +FieldLevelEncryptionProfileSummary +FieldLevelEncryptionSummary +FieldLevelOptions +FieldList +FieldLogLevel +FieldMappings +FieldName +FieldNames +FieldOption +FieldOptionError +FieldOptions +FieldPatterns +FieldSelectors +FieldSeriesItem +FieldSort +FieldSortOptions +FieldSourceProfileIds +FieldStatistics +FieldStats +FieldSummary +FieldToMatch +FieldTooltipItem +FieldTypeDetails +FieldValidationConfiguration +FieldValidationMessage +FieldValue +FieldWells +Fields +File +FileAccessAuditLogLevel +FileAccessLog +FileBatchJobDefinition +FileBatchJobIdentifier +FileCache +FileCacheCreating +FileCacheDataRepositoryAssociation +FileCacheFailureDetails +FileCacheId +FileCacheIds +FileCacheLustreConfiguration +FileCacheLustreMetadataConfiguration +FileCacheNFSConfiguration +FileCacheNotFound +FileCachePath +FileCacheType +FileCacheTypeVersion +FileCaches +FileCompression +FileConfiguration +FileContentAndSourceFileSpecifiedException +FileContentRequiredException +FileContentSizeLimitExceededException +FileCount +FileDoesNotExistException +FileEntryRequiredException +FileFailures +FileFieldMappings +FileFingerprintLines +FileFormat +FileFormatConfiguration +FileFormatDescriptor +FileFormats +FileGroupSettings +FileGroups +FileHeaderInfo +FileInformation +FileInput +FileKey +FileKeyUpdate +FileLastWritten +FileLocation +FileMetadata +FileMode +FileModeRequiredException +FileModes +FileName +FileNameConflictsWithDirectoryNameException +FileOffset +FilePath +FilePathConflictsWithSubmodulePathException +FilePaths +FileShareARN +FileShareARNList +FileShareAccessAuditLogLevel +FileShareId +FileShareInfo +FileShareInfoList +FileShareName +FileShareStatus +FileShareType +FileSharesVisible +FileSize +FileSizeBytes +FileSizes +FileSource +FileSourceSettings +FileSystem +FileSystemAccessMode +FileSystemAccessRoleArn +FileSystemAdministratorsGroup +FileSystemAlreadyExists +FileSystemArn +FileSystemAssociationARN +FileSystemAssociationARNList +FileSystemAssociationId +FileSystemAssociationInfo +FileSystemAssociationInfoList +FileSystemAssociationStatus +FileSystemAssociationStatusDetail +FileSystemAssociationStatusDetails +FileSystemAssociationSummary +FileSystemAssociationSummaryList +FileSystemConfig +FileSystemConfigs +FileSystemDataSource +FileSystemDescription +FileSystemEndpoint +FileSystemEndpoints +FileSystemFailureDetails +FileSystemId +FileSystemIds +FileSystemInUse +FileSystemLimitExceeded +FileSystemNotFound +FileSystemPath +FileSystemPolicyDescription +FileSystemSize +FileSystemType +FileSystemTypeVersion +FileSystems +FileTooLargeException +FileTransferUploadStreams +FileUploadURL +FileUploaderFieldConfig +FileValidationMessage +FileVersion +FilecacheDuration +FilenameContains +Files +FilesCompleted +FilesDeleted +FilesLimit +FilesSkipped +FilesTransferred +FilesVerified +FilesystemId +FillLineGap +FillMissingValues +FillPolicy +FillStyle +FilledMapAggregatedFieldWells +FilledMapConditionalFormatting +FilledMapConditionalFormattingOption +FilledMapConfiguration +FilledMapFieldWells +FilledMapShapeConditionalFormatting +FilledMapSortConfiguration +FilledMapVisual +FilledPath +FillerSlate +Filling +FilmGrainSynthesis +Filter +FilterActivity +FilterArn +FilterArns +FilterAtDestination +FilterAtSource +FilterAttributeRanges +FilterBBox +FilterCategories +FilterClass +FilterCondition +FilterConditionList +FilterConditions +FilterConfiguration +FilterControl +FilterControlId +FilterControls +FilterCountries +FilterCriteria +FilterCriterion +FilterDateTimePickerControl +FilterDefinition +FilterDescription +FilterDropDownControl +FilterEnable +FilterExpression +FilterGroup +FilterGroupId +FilterGroups +FilterId +FilterInArns +FilterKey +FilterLimitExceededException +FilterList +FilterListConfiguration +FilterListControl +FilterLogEventsRequest +FilterLogEventsResponse +FilterName +FilterNames +FilterOperation +FilterOperationSelectedFieldsConfiguration +FilterOperationTargetVisualsConfiguration +FilterOperator +FilterOption +FilterPartialResults +FilterPolicyLimitExceededException +FilterPortRange +FilterPredicate +FilterQuery +FilterRelativeDateTimeControl +FilterRule +FilterRules +FilterScopeConfiguration +FilterSelectableValues +FilterSettings +FilterSliderControl +FilterStrength +FilterString +FilterSummary +FilterSynonyms +FilterTextAreaControl +FilterTextFieldControl +FilterType +FilterTypedLink +FilterV2 +FilterValue +FilterValues +FilterVariable +FilteredLogEvent +FilteredStatus +Filters +FinalActiveLearningModelArn +FinalAutoMLJobObjectiveMetric +FinalBackupId +FinalBackupTags +FinalBakeTimeInMinutes +FinalClusterSnapshotIdentifier +FinalClusterSnapshotRetentionPeriod +FinalDBSnapshotIdentifier +FinalHyperParameterTuningJobObjectiveMetric +FinalMetricDataList +FinalRecipient +FinalSnapshotIdentifier +FinalSnapshotName +FinalizeCutoverRequest +FinalizeDeviceClaimRequest +FinalizeDeviceClaimResponse +Finalized +FinalizingOrganizationException +FindMatchesMetrics +FindMatchesParameters +FindMatchesTaskRunProperties +Finding +FindingAction +FindingActor +FindingAggregationRegion +FindingAggregator +FindingAggregatorArn +FindingAggregators +FindingComponents +FindingCreated +FindingCriteria +FindingDetail +FindingDetailsError +FindingFieldsUpdate +FindingFilter +FindingHistoryRecord +FindingHistoryUpdate +FindingHistoryUpdateSource +FindingId +FindingIdentifier +FindingIdentifiers +FindingIds +FindingMetricsValuePerSeverity +FindingProviderFields +FindingProviderFieldsConfidence +FindingProviderFieldsCriticality +FindingProviderFieldsRelatedFindingsId +FindingProviderFieldsRelatedFindingsProductArn +FindingProviderFieldsSeverityLabel +FindingProviderFieldsSeverityOriginal +FindingProviderFieldsTypes +FindingProviderSeverity +FindingPublishingFrequency +FindingReasonCodes +FindingSource +FindingSourceDetail +FindingStatisticTypes +FindingStatistics +FindingStatisticsSortCriteria +FindingSummary +FindingTypeAggregation +FindingTypeAggregationResponse +FindingTypes +Findings +FindingsCount +FindingsFilterListItem +FindingsFound +FindingsReportSummary +FineGrainedAuthorizationEnabled +Fingerprint +FinishTime +FinishTimeMillis +FinishedAt +FinishedTime +FinishedWorldsSummary +Fips +FipsDnsName +FipsEnabled +Firehose +FirehoseAction +FirehoseArn +FirehoseDestinationConfiguration +FirehoseFailureFeedbackRoleArn +FirehoseLogDelivery +FirehoseLogDeliveryDescription +FirehoseStream +FirehoseSuccessFeedbackRoleArn +FirelensConfiguration +Firewall +FirewallArn +FirewallConfig +FirewallConfigs +FirewallCreationConfig +FirewallDeploymentModel +FirewallDomainList +FirewallDomainListId +FirewallDomainListMetadata +FirewallDomainLists +FirewallEndpoint +FirewallFailOpen +FirewallId +FirewallManagerRuleGroup +FirewallManagerStatement +FirewallMetadata +FirewallName +FirewallPolicies +FirewallPolicy +FirewallPolicyArn +FirewallPolicyChangeProtection +FirewallPolicyDetails +FirewallPolicyId +FirewallPolicyMetadata +FirewallPolicyName +FirewallPolicyResponse +FirewallPolicyStatefulRuleGroupReferencesDetails +FirewallPolicyStatelessCustomActionsDetails +FirewallPolicyStatelessRuleGroupReferencesDetails +FirewallPolicyStatus +FirewallRule +FirewallRuleGroup +FirewallRuleGroupAssociation +FirewallRuleGroupAssociationId +FirewallRuleGroupAssociations +FirewallRuleGroupId +FirewallRuleGroupMetadata +FirewallRuleGroupPolicy +FirewallRuleGroups +FirewallRules +FirewallStatefulRule +FirewallStatelessRule +FirewallStatus +FirewallSubnetId +FirewallSubnetIsOutOfScopeViolation +FirewallSubnetMissingVPCEndpointViolation +FirewallSubnetRoutes +Firewalls +FirmwareUpdateImage +FirmwareUpdateRole +First +FirstAccessedTime +FirstActivatedTime +FirstAddress +FirstBlockToken +FirstEvaluationStarted +FirstExecutionFrom +FirstName +FirstObservedAt +FirstPage +FirstSchemaVersionNumber +FirstSeen +FirstSeenDateTime +FirstSlotStartTime +FirstSlotStartTimeRange +FirstSnapshotId +FixAvailable +FixedAfd +FixedGOP +FixedInVersion +FixedModeScheduleActionStartSettings +FixedPrice +FixedRate +FixedResponseAction +FixedResponseActionConfig +FixedResponseConfig +FlacSettings +Flag +FlaggedResources +Flags +Flat +FlatInvocations +Fleet +FleetAdvisorLsaAnalysisResponse +FleetAdvisorSchemaObjectResponse +FleetAdvisorSchemaObjects +FleetAdvisorSchemas +FleetArn +FleetAttributes +FleetCapacity +FleetCapacityExceededException +FleetCapacityReservation +FleetCapacityReservations +FleetData +FleetError +FleetErrors +FleetId +FleetIds +FleetLaunchTemplateConfig +FleetLaunchTemplateConfigRequest +FleetLaunchTemplateOverrides +FleetLaunchTemplateOverridesRequest +FleetLaunchTemplateSpecification +FleetLaunchTemplateSpecificationRequest +FleetMetricNameAndArn +FleetName +FleetSpotCapacityRebalance +FleetSpotCapacityRebalanceRequest +FleetSpotMaintenanceStrategies +FleetSpotMaintenanceStrategiesRequest +FleetState +FleetStatus +FleetSummary +FleetSummaryList +FleetType +FleetUtilization +Fleets +FlexCacheEndpointType +FlexMatchMode +FlexibleTimeWindow +FlickerAdaptiveQuantization +FlickerAq +FlinkApplicationConfiguration +FlinkApplicationConfigurationDescription +FlinkApplicationConfigurationUpdate +FlinkRunConfiguration +FlinkRunConfigurationDescription +Flow +FlowArn +FlowDefinition +FlowDefinitionArn +FlowDefinitionName +FlowDefinitionOutputConfig +FlowDefinitionStatus +FlowDefinitionSummaries +FlowDefinitionSummary +FlowExecutionMessage +FlowExecutionSummary +FlowLog +FlowLogId +FlowLogIds +FlowLogStatus +FlowLogs +FlowLogsConfigurationResult +FlowLogsEnabled +FlowLogsS3Bucket +FlowLogsS3Prefix +FlowName +FlowOutput +FlowSource +FlowSourceArn +FlowTemplateDescription +FlowTemplateFilter +FlowTemplateSummary +FlowVpcInterfaceAttachment +Flows +FlushApiCacheRequest +FlushStageAuthorizersCacheRequest +FlushStageCacheRequest +FlywheelArn +FlywheelFilter +FlywheelIterationFilter +FlywheelIterationId +FlywheelIterationProperties +FlywheelIterationPropertiesList +FlywheelModelEvaluationMetrics +FlywheelName +FlywheelProperties +FlywheelStatsS3Prefix +FlywheelSummary +FlywheelSummaryList +Fmp4HlsSettings +Fmt +Fmtp +FmtpRequest +Folder +FolderConfiguration +FolderConfigurations +FolderContentSizeLimitExceededException +FolderDoesNotExistException +FolderId +FolderIds +FolderList +FolderMember +FolderMemberList +FolderMetadata +FolderPath +FolderSearchFilter +FolderSummary +FolderSummaryList +FolderType +Folders +FollowInputIndex +FollowModeScheduleActionStartSettings +FollowPoint +FollowUpPrompt +Font +FontColor +FontConfiguration +FontDecoration +FontFamilies +FontFamily +FontOpacity +FontResolution +FontScript +FontSize +FontStack +FontStyle +FontUnicodeRange +FontWeight +FooterSections +ForbiddenException +Force +ForceAliasCreation +ForceAssociate +ForceCreateJobs +ForceDelete +ForceDeleteWithoutRecovery +ForceDetach +ForceFailover +ForceFieldPictures +ForceIncludeRenditionSize +ForceIncludeRenditions +ForceLobLookup +ForceMove +ForceOverwriteReplicaSecret +ForcePlannedFailover +ForceTerminate +ForceTsVideoEbpOrder +ForceUnsubscribeAll +ForceUpdate +ForceUpgradeDate +ForcedApplyDate +Forecast +ForecastArn +ForecastComputation +ForecastConfiguration +ForecastConfigurations +ForecastDataType +ForecastDimensions +ForecastExportJobArn +ForecastExportJobName +ForecastExportJobSummary +ForecastExportJobs +ForecastFrequency +ForecastHorizon +ForecastName +ForecastProperties +ForecastQuantiles +ForecastResult +ForecastResultsByTime +ForecastScenario +ForecastStatistics +ForecastSummary +ForecastType +ForecastTypes +ForecastedLifetime +ForecastedSpend +Forecasts +Foreground +ForegroundColor +ForgetDeviceRequest +ForgetSmartHomeAppliancesRequest +ForgotPassword +ForgotPasswordLink +ForgotPasswordRequest +ForgotPasswordResponse +Form +FormBindingElement +FormButton +FormCTA +FormDataTypeConfig +FormInputBindingPropertiesValue +FormInputBindingPropertiesValueProperties +FormInputValueProperty +FormInputValuePropertyBindingProperties +FormStyle +FormSummary +Formality +Format +FormatConfig +FormatConfiguration +FormatOptions +FormatText +FormatType +FormatVersion +Formats +Formatted +Forward +ForwardAction +ForwardActionConfig +ForwardConfig +ForwardPath +ForwardPathComponents +ForwardWhenContentTypeIsUnknown +ForwardWhenQueryArgProfileIsUnknown +ForwardedIP +ForwardedIPConfig +ForwardedValues +ForwardingAddressId +ForwardingConfig +ForwardingEnabled +FoundByItems +FoundByKeyValue +FoundationModelDetails +FoundationModelSummary +FpgaDeviceInfo +FpgaDeviceMemoryInfo +FpgaImage +FpgaImageAttribute +FpgaImageGlobalId +FpgaImageId +FpgaImageIds +FpgaImageState +FpgaImages +FpgaInfo +Fpgas +Fqdn +FractionDigits +Fragment +FragmentIntervalMS +FragmentLength +FragmentLengthControl +FragmentLengthInMilliseconds +FragmentNumber +FragmentSelector +FragmentSelectorType +FragmentSizeBytes +FragmentSizeInBytes +FragmentTime +Fragments +FrameCaptureCdnSettings +FrameCaptureGroupSettings +FrameCaptureHlsSettings +FrameCaptureOutputSettings +FrameCaptureS3Settings +FrameCaptureSettings +FrameHeight +FrameMetric +FrameMetricDatum +FrameOption +FrameOptions +FrameRate +FrameWidth +Framerate +FramerateControl +FramerateConversionAlgorithm +FramerateDenominator +FramerateNumerator +Framework +FrameworkArn +FrameworkArns +FrameworkAttributes +FrameworkConfiguration +FrameworkControl +FrameworkControls +FrameworkDescription +FrameworkMetadata +FrameworkName +FrameworkStatus +FrameworkTags +FrameworkVersion +Frameworks +FraudDetectionAction +FraudDetectionConfig +FraudDetectionConfiguration +FraudDetectionResult +FraudDetectionResultId +FraudRiskDetails +Fraudster +FraudsterId +FraudsterRegistrationJob +FraudsterRegistrationJobSummary +FraudsterSimilarityThreshold +FraudsterSummaries +FraudsterSummary +FreeForm +FreeFormLayout +FreeFormLayoutCanvasSizeOptions +FreeFormLayoutConfiguration +FreeFormLayoutElement +FreeFormLayoutElementBackgroundStyle +FreeFormLayoutElementBorderStyle +FreeFormLayoutScreenCanvasSizeOptions +FreeFormSectionLayoutConfiguration +FreeSpaceBox +FreeTier +FreeTierConfig +FreeTierEligible +FreeTrialAccountInfo +FreeTrialDaysRemaining +FreeTrialFeatureConfigurationResult +FreeTrialInfo +FreeTrialInfoError +FreeUntil +Frequencies +Frequency +FrequencyBandwidth +FreshStartDate +Freshness +Friday +FriendlyDeviceName +FriendlyName +From +FromAddress +FromArn +FromDate +FromDbClusterArn +FromEmailAddress +FromEmailAddressIdentityArn +FromEmailAddressNotVerifiedException +FromFederationSource +FromInclusive +FromPath +FromPhoneNumber +FromPort +FromTime +FromTimeStamp +FromType +FromValue +FsxAdminPassword +FsxConfiguration +FsxFilesystemArn +FsxProtocol +FsxProtocolNfs +FsxProtocolSmb +FsxStorageConfiguration +FulfilledCapacity +FulfilledOnDemandCapacity +FulfillmentActivity +FulfillmentCodeHookSettings +FulfillmentStartResponseSpecification +FulfillmentUpdateResponseSpecification +FulfillmentUpdatesSpecification +FullDocument +FullLoadCondtnlChkFailedRows +FullLoadEndTime +FullLoadErrorPercentage +FullLoadErrorRows +FullLoadFinishDate +FullLoadProgressPercent +FullLoadReloaded +FullLoadRows +FullLoadStartDate +FullLoadStartTime +FullName +FullyQualifiedCNAME +FullyQualifiedDomainName +Function +FunctionARN +FunctionAlreadyExists +FunctionArn +FunctionArns +FunctionArtifactMeta +FunctionAssociation +FunctionAssociations +FunctionCode +FunctionCodeLocation +FunctionConfig +FunctionConfiguration +FunctionConfigurationEnvironment +FunctionCount +FunctionDefaultConfig +FunctionDefaultExecutionConfig +FunctionDefinitionId +FunctionDefinitionVersion +FunctionDefinitionVersionArn +FunctionDefinitionVersionId +FunctionError +FunctionErrorMessage +FunctionEventInvokeConfig +FunctionEventInvokeConfigs +FunctionExecutionConfig +FunctionExecutionLogs +FunctionInUse +FunctionInput +FunctionList +FunctionMetadata +FunctionName +FunctionOutput +FunctionPayload +FunctionRequest +FunctionResponse +FunctionResponseTypes +FunctionRunAsConfig +FunctionRuntimeOverride +FunctionSizeLimitExceeded +FunctionSummary +FunctionUrl +FunctionUrlAuthType +FunctionUrlConfig +FunctionUrlConfigs +FunctionVersion +Functions +FunnelChartAggregatedFieldWells +FunnelChartConfiguration +FunnelChartDataLabelOptions +FunnelChartFieldWells +FunnelChartSortConfiguration +FunnelChartVisual +Fuota +FuotaDeviceStatus +FuotaTask +FuotaTaskId +FuotaTaskList +FuzzyMatching +GATING +GCM +GCMChannelRequest +GCMChannelResponse +GCMMessage +GE +GPSCoordinates +GPSPoint +GPSPointDimension +GSTIN +GT +Gain +Game +GameConfiguration +GameConfigurationDetails +GameDetails +GameKey +GameLiftAwsAccountId +GameLiftServiceSdkEndpoint +GameLiftVpcId +GameName +GameProperties +GameProperty +GameSdkVersion +GameServer +GameServerData +GameServerGroup +GameServerGroupArn +GameServerGroupAutoScalingPolicy +GameServerGroupName +GameServerGroups +GameServerId +GameServerInstance +GameServerInstances +GameServerProtectionPolicy +GameServers +GameSession +GameSessionActivationTimeoutSeconds +GameSessionArn +GameSessionConnectionInfo +GameSessionData +GameSessionDetail +GameSessionDetails +GameSessionFullException +GameSessionId +GameSessionName +GameSessionPlacement +GameSessionQueue +GameSessionQueueArn +GameSessionQueueArns +GameSessionQueueDestination +GameSessionQueueName +GameSessionQueues +GameSessionRegion +GameSessions +GameSummary +Games +Gateway +GatewayARN +GatewayAdmins +GatewayArn +GatewayAssociationState +GatewayBridgeSource +GatewayCapabilitySummary +GatewayCapacity +GatewayDetails +GatewayDisplayName +GatewayEui +GatewayEuiEventTopic +GatewayGroup +GatewayGroupArn +GatewayGroupSummary +GatewayGroups +GatewayId +GatewayInfo +GatewayInstance +GatewayInstanceArn +GatewayList +GatewayListItem +GatewayLoadBalancerArns +GatewayLoadBalancerEndpointId +GatewayMessages +GatewayName +GatewayNetwork +GatewayNetworkInterfaces +GatewayOperationalState +GatewayPlatform +GatewayRegion +GatewayResponse +GatewayResponses +GatewayRouteData +GatewayRouteHostnameMatch +GatewayRouteHostnameRewrite +GatewayRouteRef +GatewayRouteSpec +GatewayRouteStatus +GatewayRouteTarget +GatewayRouteVirtualService +GatewayState +GatewaySummary +GatewayTimeoutException +GatewayTimezone +GatewayType +Gateways +GatingControls +GatingRule +GatingRuleUpdate +GaugeChartArcConditionalFormatting +GaugeChartConditionalFormatting +GaugeChartConditionalFormattingOption +GaugeChartConfiguration +GaugeChartFieldWells +GaugeChartOptions +GaugeChartPrimaryValueConditionalFormatting +GaugeChartVisual +GcpMySQLSettings +GdgAttributes +GdgDetailAttributes +GenAppKey +Gender +GenderString +General +GeneralFlags +GeneralFlagsV2 +GeneralFlagsV3 +GeneralFlagsV4 +GeneralLabels +GeneralLabelsSettings +GeneralLogGroup +GeneralName +GeneralServiceException +Generate +GenerateAccessLogsRequest +GenerateAccessLogsResult +GenerateBackendAPIModelsRequest +GenerateBackendAPIModelsResponse +GenerateCandidateDefinitionsOnly +GenerateCardValidationDataInput +GenerateCardValidationDataOutput +GenerateChangeSetRequest +GenerateChangeSetResponse +GenerateClientCertificateRequest +GenerateCredentialReportResponse +GenerateDataKeyPairRequest +GenerateDataKeyPairResponse +GenerateDataKeyPairWithoutPlaintextRequest +GenerateDataKeyPairWithoutPlaintextResponse +GenerateDataKeyRequest +GenerateDataKeyResponse +GenerateDataKeyWithoutPlaintextRequest +GenerateDataKeyWithoutPlaintextResponse +GenerateDataSetRequest +GenerateDataSetResult +GenerateEmbedUrlForAnonymousUserRequest +GenerateEmbedUrlForAnonymousUserResponse +GenerateEmbedUrlForRegisteredUserRequest +GenerateEmbedUrlForRegisteredUserResponse +GenerateInferenceId +GenerateMacInput +GenerateMacOutput +GenerateMacRequest +GenerateMacResponse +GenerateMobileSdkReleaseUrlRequest +GenerateMobileSdkReleaseUrlResponse +GenerateOrganizationsAccessReportRequest +GenerateOrganizationsAccessReportResponse +GeneratePinDataInput +GeneratePinDataOutput +GenerateRandomRequest +GenerateRandomResponse +GenerateRecommendationsRequest +GenerateSecret +GenerateServiceLastAccessedDetailsRequest +GenerateServiceLastAccessedDetailsResponse +GenerateTemplateRequest +GenerateTemplateResponse +GeneratedBy +GeneratedCodeJob +GeneratedCodeJobDetails +GeneratedCodeJobId +GeneratedCodeJobs +GeneratedFraudsterId +GeneratedManifestDescriptor +GeneratedManifestEncryption +GeneratedPolicy +GeneratedPolicyProperties +GeneratedPolicyResult +GeneratedPrefixLocation +GeneratedRulesType +GeneratedSpeakerId +GeneratedTime +GenerationAttributes +GenerationCompletionTime +GenerationExistsException +GenerationKeyArn +GenerationKeyCheckValue +GenerationKeyIdentifier +GenerationQualifier +GenerationStartedTime +GenerationStatus +GenerationSummary +GenerationSummaryList +GenerationTimestamp +Generator +GeneratorDetails +GeneratorId +GenericAttachment +GenericKeywords +GenericRevisionInfo +GeoJsonPayload +GeoLocation +GeoLocationDetails +GeoLocationDetailsList +GeoMatchConstraint +GeoMatchConstraints +GeoMatchLevel +GeoMatchParams +GeoMatchSet +GeoMatchSetId +GeoMatchSetSummary +GeoMatchSetUpdate +GeoMatchSets +GeoMatchStatement +GeoMosaicConfigInput +GeoRestriction +GeoSpatialColumnGroup +GeofenceGeometry +GeofenceId +GeofenceIds +GeofenceProperties +GeographicRole +GeolocationFormat +Geometry +GeometryOffset +Geospatial +GeospatialCoordinateBounds +GeospatialHeatmapColorScale +GeospatialHeatmapConfiguration +GeospatialHeatmapDataColor +GeospatialMapAggregatedFieldWells +GeospatialMapConfiguration +GeospatialMapFieldWells +GeospatialMapStyleOptions +GeospatialMapVisual +GeospatialPointStyleOptions +GeospatialWindowOptions +GeranCid +Get +GetAWSDefaultServiceQuotaRequest +GetAWSDefaultServiceQuotaResponse +GetAWSOrganizationsAccessStatusOutput +GetAccessControlEffectRequest +GetAccessControlEffectResponse +GetAccessKeyInfoRequest +GetAccessKeyInfoResponse +GetAccessKeyLastUsedRequest +GetAccessKeyLastUsedResponse +GetAccessLogSubscriptionRequest +GetAccessLogSubscriptionResponse +GetAccessPointConfigurationForObjectLambdaRequest +GetAccessPointConfigurationForObjectLambdaResult +GetAccessPointForObjectLambdaRequest +GetAccessPointForObjectLambdaResult +GetAccessPointPolicyForObjectLambdaRequest +GetAccessPointPolicyForObjectLambdaResult +GetAccessPointPolicyRequest +GetAccessPointPolicyResult +GetAccessPointPolicyStatusForObjectLambdaRequest +GetAccessPointPolicyStatusForObjectLambdaResult +GetAccessPointPolicyStatusRequest +GetAccessPointPolicyStatusResult +GetAccessPointRequest +GetAccessPointResult +GetAccessPolicyRequest +GetAccessPolicyResponse +GetAccessPreviewRequest +GetAccessPreviewResponse +GetAccessTokenRequest +GetAccessTokenResponse +GetAccessorInput +GetAccessorOutput +GetAccountAliasResult +GetAccountAuthorizationDetailsRequest +GetAccountAuthorizationDetailsResponse +GetAccountBalanceResponse +GetAccountConfigurationResponse +GetAccountLimitRequest +GetAccountLimitResponse +GetAccountPasswordPolicyResponse +GetAccountRequest +GetAccountResponse +GetAccountSendingEnabledResponse +GetAccountSettingsOutput +GetAccountSettingsRequest +GetAccountSettingsResponse +GetAccountSettingsResult +GetAccountStatusResponse +GetAccountSummaryResponse +GetAccuracyMetricsRequest +GetAccuracyMetricsResponse +GetActionRequest +GetActionResponse +GetActionTypeInput +GetActionTypeOutput +GetActiveNamesRequest +GetActiveNamesResult +GetActivityTaskInput +GetActivityTaskOutput +GetAddressBookRequest +GetAddressBookResponse +GetAdmChannelRequest +GetAdmChannelResponse +GetAdminAccountResponse +GetAdminScopeRequest +GetAdminScopeResponse +GetAdministratorAccountRequest +GetAdministratorAccountResponse +GetAgentConfigurationRequest +GetAgentConfigurationResponse +GetAggregateComplianceDetailsByConfigRuleRequest +GetAggregateComplianceDetailsByConfigRuleResponse +GetAggregateConfigRuleComplianceSummaryRequest +GetAggregateConfigRuleComplianceSummaryResponse +GetAggregateConformancePackComplianceSummaryRequest +GetAggregateConformancePackComplianceSummaryResponse +GetAggregateDiscoveredResourceCountsRequest +GetAggregateDiscoveredResourceCountsResponse +GetAggregateResourceConfigRequest +GetAggregateResourceConfigResponse +GetAlarmsRequest +GetAlarmsResult +GetAliasInput +GetAliasOutput +GetAliasRequest +GetAllowListRequest +GetAllowListResponse +GetAlternateContactRequest +GetAlternateContactResponse +GetAnalysisTemplateInput +GetAnalysisTemplateOutput +GetAnalyzedResourceRequest +GetAnalyzedResourceResponse +GetAnalyzerRequest +GetAnalyzerResponse +GetAnnotationImportRequest +GetAnnotationImportResponse +GetAnnotationStoreRequest +GetAnnotationStoreResponse +GetAnnotationStoreVersionRequest +GetAnnotationStoreVersionResponse +GetAnomaliesRequest +GetAnomaliesResponse +GetAnomalyGroupRequest +GetAnomalyGroupResponse +GetAnomalyMonitorsRequest +GetAnomalyMonitorsResponse +GetAnomalySubscriptionsRequest +GetAnomalySubscriptionsResponse +GetAnswerInput +GetAnswerOutput +GetApiAssociationRequest +GetApiAssociationResponse +GetApiCacheRequest +GetApiCacheResponse +GetApiKeyRequest +GetApiKeysRequest +GetApiMappingRequest +GetApiMappingResponse +GetApiMappingsRequest +GetApiMappingsResponse +GetApiRequest +GetApiResponse +GetApisRequest +GetApisResponse +GetApnsChannelRequest +GetApnsChannelResponse +GetApnsSandboxChannelRequest +GetApnsSandboxChannelResponse +GetApnsVoipChannelRequest +GetApnsVoipChannelResponse +GetApnsVoipSandboxChannelRequest +GetApnsVoipSandboxChannelResponse +GetAppAuthorizationRequest +GetAppAuthorizationResponse +GetAppBundleRequest +GetAppBundleResponse +GetAppInstanceRetentionSettingsRequest +GetAppInstanceRetentionSettingsResponse +GetAppInstanceStreamingConfigurationsRequest +GetAppInstanceStreamingConfigurationsResponse +GetAppLaunchConfigurationRequest +GetAppLaunchConfigurationResponse +GetAppMonitorDataRequest +GetAppMonitorDataResponse +GetAppMonitorRequest +GetAppMonitorResponse +GetAppReplicationConfigurationRequest +GetAppReplicationConfigurationResponse +GetAppRequest +GetAppResponse +GetAppResult +GetAppValidationConfigurationRequest +GetAppValidationConfigurationResponse +GetAppValidationOutputRequest +GetAppValidationOutputResponse +GetApplicationComponentDetailsRequest +GetApplicationComponentDetailsResponse +GetApplicationComponentStrategiesRequest +GetApplicationComponentStrategiesResponse +GetApplicationDateRangeKpiRequest +GetApplicationDateRangeKpiResponse +GetApplicationInput +GetApplicationOutput +GetApplicationPolicyRequest +GetApplicationPolicyResponse +GetApplicationRequest +GetApplicationResponse +GetApplicationRevisionInput +GetApplicationRevisionOutput +GetApplicationSettingsRequest +GetApplicationSettingsResponse +GetApplicationVersionRequest +GetApplicationVersionResponse +GetAppliedSchemaVersionRequest +GetAppliedSchemaVersionResponse +GetApprovalRuleTemplateInput +GetApprovalRuleTemplateOutput +GetAppsListRequest +GetAppsListResponse +GetAppsRequest +GetAppsResponse +GetArchitectureRecommendationsRequest +GetArchitectureRecommendationsResponse +GetArchiveRuleRequest +GetArchiveRuleResponse +GetArtifactUrlRequest +GetArtifactUrlResult +GetAssessmentFrameworkRequest +GetAssessmentFrameworkResponse +GetAssessmentReportRequest +GetAssessmentReportResponse +GetAssessmentReportUrlRequest +GetAssessmentReportUrlResponse +GetAssessmentRequest +GetAssessmentResponse +GetAssetPropertyAggregatesRequest +GetAssetPropertyAggregatesResponse +GetAssetPropertyValueHistoryRequest +GetAssetPropertyValueHistoryResponse +GetAssetPropertyValueRequest +GetAssetPropertyValueResponse +GetAssetRequest +GetAssetResponse +GetAssignmentRequest +GetAssignmentResponse +GetAssistantAssociationRequest +GetAssistantAssociationResponse +GetAssistantRequest +GetAssistantResponse +GetAssociatedEnclaveCertificateIamRolesRequest +GetAssociatedEnclaveCertificateIamRolesResult +GetAssociatedIpv6PoolCidrsRequest +GetAssociatedIpv6PoolCidrsResult +GetAssociatedResourceRequest +GetAssociatedResourceResponse +GetAssociatedRoleRequest +GetAssociatedRoleResponse +GetAssociationForServiceQuotaTemplateResponse +GetAttachmentRequest +GetAttachmentResponse +GetAttendeeRequest +GetAttendeeResponse +GetAttributeGroupRequest +GetAttributeGroupResponse +GetAttributeValuesRequest +GetAttributeValuesResponse +GetAuthPolicyRequest +GetAuthPolicyResponse +GetAuthorizationTokenRequest +GetAuthorizationTokenResponse +GetAuthorizationTokenResult +GetAuthorizerRequest +GetAuthorizerResponse +GetAuthorizersRequest +GetAuthorizersResponse +GetAutoMergingPreviewRequest +GetAutoMergingPreviewResponse +GetAutoScalingGroupRecommendationsRequest +GetAutoScalingGroupRecommendationsResponse +GetAutoSnapshotsRequest +GetAutoSnapshotsResult +GetAutoTerminationPolicyInput +GetAutoTerminationPolicyOutput +GetAutomatedDiscoveryConfigurationResponse +GetAutomationExecutionRequest +GetAutomationExecutionResult +GetAwsNetworkPerformanceDataRequest +GetAwsNetworkPerformanceDataResult +GetBackendAPIModelsRequest +GetBackendAPIModelsResponse +GetBackendAPIRequest +GetBackendAPIResponse +GetBackendAuthRequest +GetBackendAuthResponse +GetBackendEnvironmentRequest +GetBackendEnvironmentResult +GetBackendJobRequest +GetBackendJobResponse +GetBackendRequest +GetBackendResponse +GetBackendStorageRequest +GetBackendStorageResourceConfig +GetBackendStorageResponse +GetBackupPlanFromJSONInput +GetBackupPlanFromJSONOutput +GetBackupPlanFromTemplateInput +GetBackupPlanFromTemplateOutput +GetBackupPlanInput +GetBackupPlanOutput +GetBackupSelectionInput +GetBackupSelectionOutput +GetBackupVaultAccessPolicyInput +GetBackupVaultAccessPolicyOutput +GetBackupVaultNotificationsInput +GetBackupVaultNotificationsOutput +GetBaiduChannelRequest +GetBaiduChannelResponse +GetBandwidthRateLimitScheduleInput +GetBandwidthRateLimitScheduleOutput +GetBasePathMappingRequest +GetBasePathMappingsRequest +GetBatchImportJobsRequest +GetBatchImportJobsResult +GetBatchJobExecutionRequest +GetBatchJobExecutionResponse +GetBatchPredictionInput +GetBatchPredictionJobsRequest +GetBatchPredictionJobsResult +GetBatchPredictionOutput +GetBehaviorModelTrainingSummariesRequest +GetBehaviorModelTrainingSummariesResponse +GetBlacklistReportsRequest +GetBlacklistReportsResponse +GetBlobInput +GetBlobOutput +GetBlockPublicAccessConfigurationOutput +GetBlockRequest +GetBlockResponse +GetBlueprintRequest +GetBlueprintResponse +GetBlueprintRunRequest +GetBlueprintRunResponse +GetBlueprintRunsRequest +GetBlueprintRunsResponse +GetBlueprintsRequest +GetBlueprintsResult +GetBootstrapBrokersRequest +GetBootstrapBrokersResponse +GetBotAliasRequest +GetBotAliasResponse +GetBotAliasesRequest +GetBotAliasesResponse +GetBotChannelAssociationRequest +GetBotChannelAssociationResponse +GetBotChannelAssociationsRequest +GetBotChannelAssociationsResponse +GetBotRequest +GetBotResponse +GetBotVersionsRequest +GetBotVersionsResponse +GetBotsRequest +GetBotsResponse +GetBranchInput +GetBranchOutput +GetBranchRequest +GetBranchResult +GetBrowserSettingsRequest +GetBrowserSettingsResponse +GetBucketAccelerateConfigurationOutput +GetBucketAccelerateConfigurationRequest +GetBucketAccessKeysRequest +GetBucketAccessKeysResult +GetBucketAclOutput +GetBucketAclRequest +GetBucketAnalyticsConfigurationOutput +GetBucketAnalyticsConfigurationRequest +GetBucketBundlesRequest +GetBucketBundlesResult +GetBucketCorsOutput +GetBucketCorsRequest +GetBucketEncryptionOutput +GetBucketEncryptionRequest +GetBucketIntelligentTieringConfigurationOutput +GetBucketIntelligentTieringConfigurationRequest +GetBucketInventoryConfigurationOutput +GetBucketInventoryConfigurationRequest +GetBucketLifecycleConfigurationOutput +GetBucketLifecycleConfigurationRequest +GetBucketLifecycleConfigurationResult +GetBucketLocationOutput +GetBucketLocationRequest +GetBucketLoggingOutput +GetBucketLoggingRequest +GetBucketMetricDataRequest +GetBucketMetricDataResult +GetBucketMetricsConfigurationOutput +GetBucketMetricsConfigurationRequest +GetBucketNotificationConfigurationRequest +GetBucketOwnershipControlsOutput +GetBucketOwnershipControlsRequest +GetBucketPolicyOutput +GetBucketPolicyRequest +GetBucketPolicyResult +GetBucketPolicyStatusOutput +GetBucketPolicyStatusRequest +GetBucketReplicationOutput +GetBucketReplicationRequest +GetBucketReplicationResult +GetBucketRequest +GetBucketRequestPaymentOutput +GetBucketRequestPaymentRequest +GetBucketResult +GetBucketStatisticsRequest +GetBucketStatisticsResponse +GetBucketTaggingOutput +GetBucketTaggingRequest +GetBucketTaggingResult +GetBucketVersioningOutput +GetBucketVersioningRequest +GetBucketVersioningResult +GetBucketWebsiteOutput +GetBucketWebsiteRequest +GetBucketsAggregationRequest +GetBucketsAggregationResponse +GetBucketsRequest +GetBucketsResult +GetBuiltinIntentRequest +GetBuiltinIntentResponse +GetBuiltinIntentsRequest +GetBuiltinIntentsResponse +GetBuiltinSlotTypesRequest +GetBuiltinSlotTypesResponse +GetBulkDeploymentStatusRequest +GetBulkDeploymentStatusResponse +GetBulkPublishDetailsRequest +GetBulkPublishDetailsResponse +GetBundlesRequest +GetBundlesResult +GetByteMatchSetRequest +GetByteMatchSetResponse +GetCSVHeaderRequest +GetCSVHeaderResponse +GetCachePolicyConfigRequest +GetCachePolicyConfigResult +GetCachePolicyRequest +GetCachePolicyResult +GetCalculatedAttributeDefinitionRequest +GetCalculatedAttributeDefinitionResponse +GetCalculatedAttributeForProfileRequest +GetCalculatedAttributeForProfileResponse +GetCalculationExecutionCodeRequest +GetCalculationExecutionCodeResponse +GetCalculationExecutionRequest +GetCalculationExecutionResponse +GetCalculationExecutionStatusRequest +GetCalculationExecutionStatusResponse +GetCalendarStateRequest +GetCalendarStateResponse +GetCallAnalyticsCategoryRequest +GetCallAnalyticsCategoryResponse +GetCallAnalyticsJobRequest +GetCallAnalyticsJobResponse +GetCallerIdentityResponse +GetCampaignActivitiesRequest +GetCampaignActivitiesResponse +GetCampaignDateRangeKpiRequest +GetCampaignDateRangeKpiResponse +GetCampaignRequest +GetCampaignResponse +GetCampaignStateBatchRequest +GetCampaignStateBatchResponse +GetCampaignStateRequest +GetCampaignStateResponse +GetCampaignVersionRequest +GetCampaignVersionResponse +GetCampaignVersionsRequest +GetCampaignVersionsResponse +GetCampaignsRequest +GetCampaignsResponse +GetCanaryRequest +GetCanaryResponse +GetCanaryRunsRequest +GetCanaryRunsResponse +GetCapacityAssignmentConfigurationInput +GetCapacityAssignmentConfigurationOutput +GetCapacityReservationInput +GetCapacityReservationOutput +GetCapacityReservationUsageRequest +GetCapacityReservationUsageResult +GetCardinalityRequest +GetCardinalityResponse +GetCaseEventConfigurationRequest +GetCaseEventConfigurationResponse +GetCaseRequest +GetCaseResponse +GetCatalogImportStatusRequest +GetCatalogImportStatusResponse +GetCatalogItemInput +GetCatalogItemOutput +GetCelebrityInfoRequest +GetCelebrityInfoResponse +GetCelebrityRecognitionRequest +GetCelebrityRecognitionResponse +GetCellReadinessSummaryRequest +GetCellReadinessSummaryResponse +GetCellRequest +GetCellResponse +GetCertificateAuthorityCertificateRequest +GetCertificateAuthorityCertificateResponse +GetCertificateAuthorityCsrRequest +GetCertificateAuthorityCsrResponse +GetCertificateRequest +GetCertificateResponse +GetCertificatesRequest +GetCertificatesResult +GetChangeLogsRequest +GetChangeLogsResponse +GetChangeRequest +GetChangeResponse +GetChangeTokenResponse +GetChangeTokenStatusRequest +GetChangeTokenStatusResponse +GetChangesetRequest +GetChangesetResponse +GetChannelGroupRequest +GetChannelGroupResponse +GetChannelMembershipPreferencesRequest +GetChannelMembershipPreferencesResponse +GetChannelMessageRequest +GetChannelMessageResponse +GetChannelMessageStatusRequest +GetChannelMessageStatusResponse +GetChannelPolicyRequest +GetChannelPolicyResponse +GetChannelRequest +GetChannelResponse +GetChannelScheduleRequest +GetChannelScheduleResponse +GetChannelsRequest +GetChannelsResponse +GetCheckerIpRangesResponse +GetChunkInput +GetChunkOutput +GetClassificationExportConfigurationResponse +GetClassificationScopeRequest +GetClassificationScopeResponse +GetClassifierRequest +GetClassifierResponse +GetClassifiersRequest +GetClassifiersResponse +GetClientCertificateRequest +GetClientCertificatesRequest +GetClipInput +GetClipOutput +GetCloudFormationStackRecordsRequest +GetCloudFormationStackRecordsResult +GetCloudFormationTemplateRequest +GetCloudFormationTemplateResponse +GetCloudFrontOriginAccessIdentityConfigRequest +GetCloudFrontOriginAccessIdentityConfigResult +GetCloudFrontOriginAccessIdentityRequest +GetCloudFrontOriginAccessIdentityResult +GetClusterCredentialsMessage +GetClusterCredentialsWithIAMMessage +GetClusterInput +GetClusterOutput +GetClusterPolicyRequest +GetClusterPolicyResponse +GetClusterSessionCredentialsInput +GetClusterSessionCredentialsOutput +GetClusterSnapshotInput +GetClusterSnapshotOutput +GetCodeBindingSourceRequest +GetCodeBindingSourceResponse +GetCodeSigningConfigRequest +GetCodeSigningConfigResponse +GetCodegenJobRequest +GetCodegenJobResponse +GetCognitoEventsRequest +GetCognitoEventsResponse +GetCoipPoolUsageRequest +GetCoipPoolUsageResult +GetCollaborationAnalysisTemplateInput +GetCollaborationAnalysisTemplateOutput +GetCollaborationInput +GetCollaborationOutput +GetColumnStatisticsForPartitionRequest +GetColumnStatisticsForPartitionResponse +GetColumnStatisticsForTableRequest +GetColumnStatisticsForTableResponse +GetCommandInvocationRequest +GetCommandInvocationResult +GetCommentInput +GetCommentOutput +GetCommentReactionsInput +GetCommentReactionsOutput +GetCommentsForComparedCommitInput +GetCommentsForComparedCommitOutput +GetCommentsForPullRequestInput +GetCommentsForPullRequestOutput +GetCommitInput +GetCommitOutput +GetCompatibleElasticsearchVersionsRequest +GetCompatibleElasticsearchVersionsResponse +GetCompatibleKafkaVersionsRequest +GetCompatibleKafkaVersionsResponse +GetCompatibleVersionsRequest +GetCompatibleVersionsResponse +GetComplianceDetailRequest +GetComplianceDetailResponse +GetComplianceDetailsByConfigRuleRequest +GetComplianceDetailsByConfigRuleResponse +GetComplianceDetailsByResourceRequest +GetComplianceDetailsByResourceResponse +GetComplianceSummaryByConfigRuleResponse +GetComplianceSummaryByResourceTypeRequest +GetComplianceSummaryByResourceTypeResponse +GetComplianceSummaryInput +GetComplianceSummaryOutput +GetComponentInput +GetComponentOutput +GetComponentPolicyRequest +GetComponentPolicyResponse +GetComponentRequest +GetComponentResponse +GetComponentTypeRequest +GetComponentTypeResponse +GetComponentVersionArtifactRequest +GetComponentVersionArtifactResponse +GetComputeAccessInput +GetComputeAccessOutput +GetComputeAuthTokenInput +GetComputeAuthTokenOutput +GetConferencePreferenceResponse +GetConferenceProviderRequest +GetConferenceProviderResponse +GetConfigRequest +GetConfigResponse +GetConfigurationProfileRequest +GetConfigurationRequest +GetConfigurationResponse +GetConfigurationSetEventDestinationsRequest +GetConfigurationSetEventDestinationsResponse +GetConfigurationSetRequest +GetConfigurationSetResponse +GetConfiguredTableAnalysisRuleInput +GetConfiguredTableAnalysisRuleOutput +GetConfiguredTableAssociationInput +GetConfiguredTableAssociationOutput +GetConfiguredTableInput +GetConfiguredTableOutput +GetConformancePackComplianceDetailsRequest +GetConformancePackComplianceDetailsResponse +GetConformancePackComplianceSummaryRequest +GetConformancePackComplianceSummaryResponse +GetConnectAttachmentRequest +GetConnectAttachmentResponse +GetConnectInstanceConfigRequest +GetConnectInstanceConfigResponse +GetConnectPeerAssociationsRequest +GetConnectPeerAssociationsResponse +GetConnectPeerRequest +GetConnectPeerResponse +GetConnectionInput +GetConnectionOutput +GetConnectionRequest +GetConnectionResponse +GetConnectionStatusRequest +GetConnectionStatusResponse +GetConnectionsFilter +GetConnectionsRequest +GetConnectionsResponse +GetConnectivityInfoRequest +GetConnectivityInfoResponse +GetConnectorDefinitionRequest +GetConnectorDefinitionResponse +GetConnectorDefinitionVersionRequest +GetConnectorDefinitionVersionResponse +GetConnectorRequest +GetConnectorResponse +GetConnectorsRequest +GetConnectorsResponse +GetConsoleOutputRequest +GetConsoleOutputResult +GetConsoleScreenshotRequest +GetConsoleScreenshotResult +GetConsolidatedReportInput +GetConsolidatedReportOutput +GetContactAttributesRequest +GetContactAttributesResponse +GetContactChannelRequest +GetContactChannelResult +GetContactInformationRequest +GetContactInformationResponse +GetContactListRequest +GetContactListResponse +GetContactMethodsRequest +GetContactMethodsResult +GetContactPolicyRequest +GetContactPolicyResult +GetContactReachabilityStatusRequest +GetContactReachabilityStatusResponse +GetContactRequest +GetContactResponse +GetContactResult +GetContainerAPIMetadataResult +GetContainerImagesRequest +GetContainerImagesResult +GetContainerLogRequest +GetContainerLogResult +GetContainerPolicyInput +GetContainerPolicyOutput +GetContainerRecipePolicyRequest +GetContainerRecipePolicyResponse +GetContainerRecipeRequest +GetContainerRecipeResponse +GetContainerServiceDeploymentsRequest +GetContainerServiceDeploymentsResult +GetContainerServiceMetricDataRequest +GetContainerServiceMetricDataResult +GetContainerServicePowersResult +GetContainerServicesRequest +GetContentModerationRequest +GetContentModerationRequestMetadata +GetContentModerationResponse +GetContentRequest +GetContentResponse +GetContentSummaryRequest +GetContentSummaryResponse +GetContextKeysForCustomPolicyRequest +GetContextKeysForPolicyResponse +GetContextKeysForPrincipalPolicyRequest +GetContinuousDeploymentPolicyConfigRequest +GetContinuousDeploymentPolicyConfigResult +GetContinuousDeploymentPolicyRequest +GetContinuousDeploymentPolicyResult +GetControlOperationInput +GetControlOperationOutput +GetControlRequest +GetControlResponse +GetCoreDefinitionRequest +GetCoreDefinitionResponse +GetCoreDefinitionVersionRequest +GetCoreDefinitionVersionResponse +GetCoreDeviceRequest +GetCoreDeviceResponse +GetCoreNetworkChangeEventsRequest +GetCoreNetworkChangeEventsResponse +GetCoreNetworkChangeSetRequest +GetCoreNetworkChangeSetResponse +GetCoreNetworkPolicyRequest +GetCoreNetworkPolicyResponse +GetCoreNetworkRequest +GetCoreNetworkResponse +GetCorsPolicyInput +GetCorsPolicyOutput +GetCostAndUsageRequest +GetCostAndUsageResponse +GetCostAndUsageWithResourcesRequest +GetCostAndUsageWithResourcesResponse +GetCostCategoriesRequest +GetCostCategoriesResponse +GetCostEstimateRequest +GetCostEstimateResult +GetCostEstimationRequest +GetCostEstimationResponse +GetCostForecastRequest +GetCostForecastResponse +GetCoverageStatisticsRequest +GetCoverageStatisticsResponse +GetCrawlerMetricsRequest +GetCrawlerMetricsResponse +GetCrawlerRequest +GetCrawlerResponse +GetCrawlersRequest +GetCrawlersResponse +GetCredentialReportResponse +GetCredentialsForIdentityInput +GetCredentialsForIdentityResponse +GetCredentialsRequest +GetCredentialsResponse +GetCurrentMetricDataRequest +GetCurrentMetricDataResponse +GetCurrentUserDataRequest +GetCurrentUserDataResponse +GetCurrentUserRequest +GetCurrentUserResponse +GetCustomDataIdentifierRequest +GetCustomDataIdentifierResponse +GetCustomEntityTypeRequest +GetCustomEntityTypeResponse +GetCustomModelRequest +GetCustomModelResponse +GetCustomRulePolicyRequest +GetCustomRulePolicyResponse +GetCustomVerificationEmailTemplateRequest +GetCustomVerificationEmailTemplateResponse +GetCustomerGatewayAssociationsRequest +GetCustomerGatewayAssociationsResponse +GetDASHStreamingSessionURLInput +GetDASHStreamingSessionURLOutput +GetDICOMImportJobRequest +GetDICOMImportJobResponse +GetDNSSECRequest +GetDNSSECResponse +GetDashboardEmbedUrlRequest +GetDashboardEmbedUrlResponse +GetDashboardForJobRunRequest +GetDashboardForJobRunResponse +GetDashboardInput +GetDashboardOutput +GetDataCatalogEncryptionSettingsRequest +GetDataCatalogEncryptionSettingsResponse +GetDataCatalogInput +GetDataCatalogOutput +GetDataCellsFilterRequest +GetDataCellsFilterResponse +GetDataEndpointInput +GetDataEndpointOutput +GetDataIntegrationRequest +GetDataIntegrationResponse +GetDataLakeExceptionSubscriptionResponse +GetDataLakeOrganizationConfigurationResponse +GetDataLakeSettingsRequest +GetDataLakeSettingsResponse +GetDataLakeSourcesRequest +GetDataLakeSourcesResponse +GetDataProtectionPolicyInput +GetDataProtectionPolicyRequest +GetDataProtectionPolicyResponse +GetDataQualityMetricsRequest +GetDataQualityMetricsResponse +GetDataQualityResultRequest +GetDataQualityResultResponse +GetDataQualityRuleRecommendationRunRequest +GetDataQualityRuleRecommendationRunResponse +GetDataQualityRulesetEvaluationRunRequest +GetDataQualityRulesetEvaluationRunResponse +GetDataQualityRulesetRequest +GetDataQualityRulesetResponse +GetDataRetrievalPolicyInput +GetDataRetrievalPolicyOutput +GetDataSetDetailsRequest +GetDataSetDetailsResponse +GetDataSetImportTaskRequest +GetDataSetImportTaskResponse +GetDataSetRequest +GetDataSetResponse +GetDataSourceInput +GetDataSourceOutput +GetDataSourceRequest +GetDataSourceResponse +GetDataViewRequest +GetDataViewResponse +GetDatabaseInput +GetDatabaseOutput +GetDatabaseRequest +GetDatabaseResponse +GetDatabasesRequest +GetDatabasesResponse +GetDataflowEndpointGroupRequest +GetDataflowEndpointGroupResponse +GetDataflowGraphRequest +GetDataflowGraphResponse +GetDatasetContentRequest +GetDatasetContentResponse +GetDatasetRequest +GetDatasetResponse +GetDatastoreRequest +GetDatastoreResponse +GetDecoderManifestRequest +GetDecoderManifestResponse +GetDecryptedAPIKeyRequest +GetDecryptedAPIKeyResponse +GetDedicatedIpPoolRequest +GetDedicatedIpPoolResponse +GetDedicatedIpRequest +GetDedicatedIpResponse +GetDedicatedIpsRequest +GetDedicatedIpsResponse +GetDefaultCreditSpecificationRequest +GetDefaultCreditSpecificationResult +GetDefaultPatchBaselineRequest +GetDefaultPatchBaselineResult +GetDefaultRetentionPolicyRequest +GetDefaultRetentionPolicyResponse +GetDefaultViewOutput +GetDelegatedAdminAccountResponse +GetDelegationsRequest +GetDelegationsResponse +GetDeleteEventsByEventTypeStatusRequest +GetDeleteEventsByEventTypeStatusResult +GetDeliverabilityDashboardOptionsResponse +GetDeliverabilityTestReportRequest +GetDeliverabilityTestReportResponse +GetDeployablePatchSnapshotForInstanceRequest +GetDeployablePatchSnapshotForInstanceResult +GetDeploymentConfigInput +GetDeploymentConfigOutput +GetDeploymentGroupInput +GetDeploymentGroupOutput +GetDeploymentInput +GetDeploymentInstanceInput +GetDeploymentInstanceOutput +GetDeploymentOutput +GetDeploymentRequest +GetDeploymentResponse +GetDeploymentStatusRequest +GetDeploymentStatusResponse +GetDeploymentStrategyRequest +GetDeploymentTargetInput +GetDeploymentTargetOutput +GetDeploymentsRequest +GetDeploymentsResponse +GetDeploymentsResult +GetDestinationRequest +GetDestinationResponse +GetDetectorModelAnalysisResultsRequest +GetDetectorModelAnalysisResultsResponse +GetDetectorRequest +GetDetectorResponse +GetDetectorVersionRequest +GetDetectorVersionResult +GetDetectorsRequest +GetDetectorsResult +GetDevEndpointRequest +GetDevEndpointResponse +GetDevEndpointsRequest +GetDevEndpointsResponse +GetDevEnvironmentRequest +GetDevEnvironmentResponse +GetDeviceDefinitionRequest +GetDeviceDefinitionResponse +GetDeviceDefinitionVersionRequest +GetDeviceDefinitionVersionResponse +GetDeviceFleetReportRequest +GetDeviceFleetReportResponse +GetDeviceIdentifierRequest +GetDeviceIdentifierResponse +GetDeviceInstanceRequest +GetDeviceInstanceResult +GetDeviceMethodsRequest +GetDeviceMethodsResponse +GetDevicePoolCompatibilityRequest +GetDevicePoolCompatibilityResult +GetDevicePoolRequest +GetDevicePoolResult +GetDevicePositionHistoryRequest +GetDevicePositionHistoryResponse +GetDevicePositionRequest +GetDevicePositionResponse +GetDeviceProfileRequest +GetDeviceProfileResponse +GetDeviceRegistrationRequest +GetDeviceRegistrationResult +GetDeviceRequest +GetDeviceResponse +GetDeviceResult +GetDevicesInPlacementRequest +GetDevicesInPlacementResponse +GetDevicesRequest +GetDevicesResponse +GetDifferencesInput +GetDifferencesOutput +GetDigestRequest +GetDigestResponse +GetDimensionKeyDetailsRequest +GetDimensionKeyDetailsResponse +GetDimensionValuesRequest +GetDimensionValuesResponse +GetDirectoryLimitsResult +GetDirectoryRegistrationRequest +GetDirectoryRegistrationResponse +GetDirectoryRequest +GetDirectoryResponse +GetDiscoveredResourceCountsRequest +GetDiscoveredResourceCountsResponse +GetDiscoveredSchemaRequest +GetDiscoveredSchemaResponse +GetDiscoverySummaryResponse +GetDiskRequest +GetDiskResult +GetDiskSnapshotRequest +GetDiskSnapshotResult +GetDiskSnapshotsRequest +GetDiskSnapshotsResult +GetDisksRequest +GetDisksResult +GetDistributionBundlesResult +GetDistributionConfigRequest +GetDistributionConfigResult +GetDistributionConfigurationRequest +GetDistributionConfigurationResponse +GetDistributionLatestCacheResetRequest +GetDistributionLatestCacheResetResult +GetDistributionMetricDataRequest +GetDistributionMetricDataResult +GetDistributionRequest +GetDistributionResult +GetDistributionsRequest +GetDistributionsResult +GetDocumentAnalysisRequest +GetDocumentAnalysisResponse +GetDocumentPathRequest +GetDocumentPathResponse +GetDocumentRequest +GetDocumentResponse +GetDocumentResult +GetDocumentTextDetectionRequest +GetDocumentTextDetectionResponse +GetDocumentVersionRequest +GetDocumentVersionResponse +GetDocumentationPartRequest +GetDocumentationPartsRequest +GetDocumentationVersionRequest +GetDocumentationVersionsRequest +GetDomainAssociationRequest +GetDomainAssociationResult +GetDomainDeliverabilityCampaignRequest +GetDomainDeliverabilityCampaignResponse +GetDomainDetailRequest +GetDomainDetailResponse +GetDomainNameRequest +GetDomainNameResponse +GetDomainNamesRequest +GetDomainNamesResponse +GetDomainPermissionsPolicyRequest +GetDomainPermissionsPolicyResult +GetDomainRequest +GetDomainResponse +GetDomainResult +GetDomainStatisticsReportRequest +GetDomainStatisticsReportResponse +GetDomainSuggestionsRequest +GetDomainSuggestionsResponse +GetDomainsRequest +GetDomainsResult +GetDownloadUrlForLayerRequest +GetDownloadUrlForLayerResponse +GetEBSVolumeRecommendationsRequest +GetEBSVolumeRecommendationsResponse +GetEC2InstanceRecommendationsRequest +GetEC2InstanceRecommendationsResponse +GetEC2RecommendationProjectedMetricsRequest +GetEC2RecommendationProjectedMetricsResponse +GetECSServiceRecommendationProjectedMetricsRequest +GetECSServiceRecommendationProjectedMetricsResponse +GetECSServiceRecommendationsRequest +GetECSServiceRecommendationsResponse +GetEarthObservationJobInput +GetEarthObservationJobOutput +GetEbsDefaultKmsKeyIdRequest +GetEbsDefaultKmsKeyIdResult +GetEbsEncryptionByDefaultRequest +GetEbsEncryptionByDefaultResult +GetEc2DeepInspectionConfigurationResponse +GetEffectivePermissionsForPathRequest +GetEffectivePermissionsForPathResponse +GetEffectivePoliciesRequest +GetEffectivePoliciesResponse +GetEffectiveRecommendationPreferencesRequest +GetEffectiveRecommendationPreferencesResponse +GetEmailChannelRequest +GetEmailChannelResponse +GetEmailIdentityPoliciesRequest +GetEmailIdentityPoliciesResponse +GetEmailIdentityRequest +GetEmailIdentityResponse +GetEmailTemplateRequest +GetEmailTemplateResponse +GetEnabledStandardsRequest +GetEnabledStandardsResponse +GetEncryptionConfigResult +GetEncryptionConfigurationResponse +GetEncryptionKeyRequest +GetEncryptionKeyResponse +GetEndpointAccessRequest +GetEndpointAccessResponse +GetEndpointAttributesInput +GetEndpointAttributesResponse +GetEndpointRequest +GetEndpointResponse +GetEngineStatusOutput +GetEnrollmentStatusResponse +GetEnrollmentStatusesForOrganizationRequest +GetEnrollmentStatusesForOrganizationResponse +GetEntitiesRequest +GetEntitiesResponse +GetEntitlementsRequest +GetEntitlementsResult +GetEntityRequest +GetEntityResponse +GetEntityTypesRequest +GetEntityTypesResult +GetEnvironmentAccountConnectionInput +GetEnvironmentAccountConnectionOutput +GetEnvironmentInput +GetEnvironmentOutput +GetEnvironmentRequest +GetEnvironmentResponse +GetEnvironmentTemplateInput +GetEnvironmentTemplateOutput +GetEnvironmentTemplateVersionInput +GetEnvironmentTemplateVersionOutput +GetEulaRequest +GetEulaResponse +GetEvaluationInput +GetEvaluationOutput +GetEventActionRequest +GetEventActionResponse +GetEventConfigurationByResourceTypesResponse +GetEventDataStoreRequest +GetEventDataStoreResponse +GetEventIntegrationRequest +GetEventIntegrationResponse +GetEventPredictionMetadataRequest +GetEventPredictionMetadataResult +GetEventPredictionRequest +GetEventPredictionResult +GetEventRequest +GetEventResult +GetEventSelectorsRequest +GetEventSelectorsResponse +GetEventSourceMappingRequest +GetEventStreamRequest +GetEventStreamResponse +GetEventTypesRequest +GetEventTypesResult +GetEventsConfigurationRequest +GetEventsConfigurationResponse +GetEvidenceByEvidenceFolderRequest +GetEvidenceByEvidenceFolderResponse +GetEvidenceFileUploadUrlRequest +GetEvidenceFileUploadUrlResponse +GetEvidenceFolderRequest +GetEvidenceFolderResponse +GetEvidenceFoldersByAssessmentControlRequest +GetEvidenceFoldersByAssessmentControlResponse +GetEvidenceFoldersByAssessmentRequest +GetEvidenceFoldersByAssessmentResponse +GetEvidenceRequest +GetEvidenceResponse +GetExclusionsPreviewRequest +GetExclusionsPreviewResponse +GetExecutionHistoryInput +GetExecutionHistoryOutput +GetExpenseAnalysisRequest +GetExpenseAnalysisResponse +GetExperimentRequest +GetExperimentResponse +GetExperimentResultsRequest +GetExperimentResultsResponse +GetExperimentTemplateRequest +GetExperimentTemplateResponse +GetExportJobRequest +GetExportJobResponse +GetExportJobsRequest +GetExportJobsResponse +GetExportRequest +GetExportResponse +GetExportSnapshotRecordsRequest +GetExportSnapshotRecordsResult +GetExtensionAssociationRequest +GetExtensionRequest +GetExtensionResult +GetExtensionVersionRequest +GetExtensionVersionResult +GetExternalDataViewAccessDetailsRequest +GetExternalDataViewAccessDetailsResponse +GetExternalModelsRequest +GetExternalModelsResult +GetFaceDetectionRequest +GetFaceDetectionResponse +GetFaceLivenessSessionResultsRequest +GetFaceLivenessSessionResultsResponse +GetFaceSearchRequest +GetFaceSearchResponse +GetFacetRequest +GetFacetResponse +GetFailbackReplicationConfigurationRequest +GetFailbackReplicationConfigurationResponse +GetFeatureRequest +GetFeatureResponse +GetFederationTokenRequest +GetFederationTokenResponse +GetFeedbackRequest +GetFeedbackResponse +GetFieldLevelEncryptionConfigRequest +GetFieldLevelEncryptionConfigResult +GetFieldLevelEncryptionProfileConfigRequest +GetFieldLevelEncryptionProfileConfigResult +GetFieldLevelEncryptionProfileRequest +GetFieldLevelEncryptionProfileResult +GetFieldLevelEncryptionRequest +GetFieldLevelEncryptionResult +GetFieldResponse +GetFileInput +GetFileOutput +GetFileUploadURLRequest +GetFileUploadURLResponse +GetFilterRequest +GetFilterResponse +GetFindingAggregatorRequest +GetFindingAggregatorResponse +GetFindingHistoryRequest +GetFindingHistoryResponse +GetFindingRequest +GetFindingResponse +GetFindingStatisticsRequest +GetFindingStatisticsResponse +GetFindingsFilterRequest +GetFindingsFilterResponse +GetFindingsPublicationConfigurationResponse +GetFindingsReportAccountSummaryRequest +GetFindingsReportAccountSummaryResponse +GetFindingsReportStatusRequest +GetFindingsReportStatusResponse +GetFindingsRequest +GetFindingsResponse +GetFindingsStatisticsRequest +GetFindingsStatisticsResponse +GetFirewallConfigRequest +GetFirewallConfigResponse +GetFirewallDomainListRequest +GetFirewallDomainListResponse +GetFirewallRuleGroupAssociationRequest +GetFirewallRuleGroupAssociationResponse +GetFirewallRuleGroupPolicyRequest +GetFirewallRuleGroupPolicyResponse +GetFirewallRuleGroupRequest +GetFirewallRuleGroupResponse +GetFleetRequest +GetFleetResponse +GetFlowLogsIntegrationTemplateRequest +GetFlowLogsIntegrationTemplateResult +GetFlowTemplateRequest +GetFlowTemplateResponse +GetFlowTemplateRevisionsRequest +GetFlowTemplateRevisionsResponse +GetFolderInput +GetFolderOutput +GetFolderPathRequest +GetFolderPathResponse +GetFolderRequest +GetFolderResponse +GetFormRequest +GetFormResponse +GetFoundationModelRequest +GetFoundationModelResponse +GetFunctionCodeSigningConfigRequest +GetFunctionCodeSigningConfigResponse +GetFunctionConcurrencyRequest +GetFunctionConcurrencyResponse +GetFunctionConfigurationRequest +GetFunctionDefinitionRequest +GetFunctionDefinitionResponse +GetFunctionDefinitionVersionRequest +GetFunctionDefinitionVersionResponse +GetFunctionEventInvokeConfigRequest +GetFunctionRequest +GetFunctionResponse +GetFunctionResult +GetFunctionUrlConfigRequest +GetFunctionUrlConfigResponse +GetFuotaTaskRequest +GetFuotaTaskResponse +GetGameConfigurationRequest +GetGameConfigurationResult +GetGameRequest +GetGameResult +GetGameSessionLogUrlInput +GetGameSessionLogUrlOutput +GetGatewayGroupRequest +GetGatewayGroupResponse +GetGatewayInput +GetGatewayOutput +GetGatewayRequest +GetGatewayResponse +GetGatewayResponseRequest +GetGatewayResponsesRequest +GetGcmChannelRequest +GetGcmChannelResponse +GetGeneratedCodeJobRequest +GetGeneratedCodeJobResult +GetGeneratedPolicyRequest +GetGeneratedPolicyResponse +GetGeoLocationRequest +GetGeoLocationResponse +GetGeoMatchSetRequest +GetGeoMatchSetResponse +GetGeofenceRequest +GetGeofenceResponse +GetGlobalSettingsResponse +GetGrantRequest +GetGrantResponse +GetGraphqlApiRequest +GetGraphqlApiResponse +GetGremlinQueryStatusInput +GetGremlinQueryStatusOutput +GetGroupCertificateAuthorityRequest +GetGroupCertificateAuthorityResponse +GetGroupCertificateConfigurationRequest +GetGroupCertificateConfigurationResponse +GetGroupConfigurationInput +GetGroupConfigurationOutput +GetGroupIdRequest +GetGroupIdResponse +GetGroupInput +GetGroupMembershipIdRequest +GetGroupMembershipIdResponse +GetGroupOutput +GetGroupPolicyRequest +GetGroupPolicyResponse +GetGroupQueryInput +GetGroupQueryOutput +GetGroupRequest +GetGroupResponse +GetGroupResult +GetGroupVersionRequest +GetGroupVersionResponse +GetGroupsForCapacityReservationRequest +GetGroupsForCapacityReservationResult +GetGroupsRequest +GetGroupsResult +GetHITRequest +GetHITResponse +GetHLSStreamingSessionURLInput +GetHLSStreamingSessionURLOutput +GetHealthCheckCountResponse +GetHealthCheckLastFailureReasonRequest +GetHealthCheckLastFailureReasonResponse +GetHealthCheckRequest +GetHealthCheckResponse +GetHealthCheckStatusRequest +GetHealthCheckStatusResponse +GetHealthEventInput +GetHealthEventOutput +GetHlsManifestConfiguration +GetHomeRegionResult +GetHostInput +GetHostOutput +GetHostReservationPurchasePreviewRequest +GetHostReservationPurchasePreviewResult +GetHostedConfigurationVersionRequest +GetHostedZoneCountResponse +GetHostedZoneLimitRequest +GetHostedZoneLimitResponse +GetHostedZoneRequest +GetHostedZoneResponse +GetHostnameSuggestionRequest +GetHostnameSuggestionResult +GetHypervisorInput +GetHypervisorOutput +GetHypervisorPropertyMappingsInput +GetHypervisorPropertyMappingsOutput +GetIPSetRequest +GetIPSetResponse +GetIceServerConfigRequest +GetIceServerConfigResponse +GetIdInput +GetIdResponse +GetIdentityDkimAttributesRequest +GetIdentityDkimAttributesResponse +GetIdentityMailFromDomainAttributesRequest +GetIdentityMailFromDomainAttributesResponse +GetIdentityNotificationAttributesRequest +GetIdentityNotificationAttributesResponse +GetIdentityPoliciesRequest +GetIdentityPoliciesResponse +GetIdentityPoolConfigurationRequest +GetIdentityPoolConfigurationResponse +GetIdentityPoolRolesInput +GetIdentityPoolRolesResponse +GetIdentityProviderByIdentifierRequest +GetIdentityProviderByIdentifierResponse +GetIdentityProviderRequest +GetIdentityProviderResponse +GetIdentityResolutionJobRequest +GetIdentityResolutionJobResponse +GetIdentitySourceInput +GetIdentitySourceOutput +GetIdentityVerificationAttributesRequest +GetIdentityVerificationAttributesResponse +GetImageBlockPublicAccessStateRequest +GetImageBlockPublicAccessStateResult +GetImageFrameRequest +GetImageFrameResponse +GetImagePipelineRequest +GetImagePipelineResponse +GetImagePolicyRequest +GetImagePolicyResponse +GetImageRecipePolicyRequest +GetImageRecipePolicyResponse +GetImageRecipeRequest +GetImageRecipeResponse +GetImageRequest +GetImageResponse +GetImageSetMetadataRequest +GetImageSetMetadataResponse +GetImageSetRequest +GetImageSetResponse +GetImagesInput +GetImagesOutput +GetImpersonationRoleEffectRequest +GetImpersonationRoleEffectResponse +GetImpersonationRoleRequest +GetImpersonationRoleResponse +GetImportFileTaskRequest +GetImportFileTaskResponse +GetImportJobRequest +GetImportJobResponse +GetImportJobsRequest +GetImportJobsResponse +GetImportRequest +GetImportResponse +GetInAppMessagesRequest +GetInAppMessagesResponse +GetInAppTemplateRequest +GetInAppTemplateResponse +GetIncidentRecordInput +GetIncidentRecordOutput +GetIndexOutput +GetIndexingConfigurationResponse +GetInfrastructureConfigurationRequest +GetInfrastructureConfigurationResponse +GetIngestionDestinationRequest +GetIngestionDestinationResponse +GetIngestionRequest +GetIngestionResponse +GetInlinePolicyForPermissionSetRequest +GetInlinePolicyForPermissionSetResponse +GetInsightEventsRequest +GetInsightEventsResult +GetInsightImpactGraphRequest +GetInsightImpactGraphResult +GetInsightRequest +GetInsightResult +GetInsightResultsRequest +GetInsightResultsResponse +GetInsightRuleReportInput +GetInsightRuleReportOutput +GetInsightSelectorsRequest +GetInsightSelectorsResponse +GetInsightSummariesRequest +GetInsightSummariesResult +GetInsightsByAssessmentRequest +GetInsightsByAssessmentResponse +GetInsightsRequest +GetInsightsResponse +GetInstanceAccessDetailsRequest +GetInstanceAccessDetailsResult +GetInstanceAccessInput +GetInstanceAccessOutput +GetInstanceMetricDataRequest +GetInstanceMetricDataResult +GetInstanceOnboardingJobStatusRequest +GetInstanceOnboardingJobStatusResponse +GetInstancePortStatesRequest +GetInstancePortStatesResult +GetInstanceProfileRequest +GetInstanceProfileResponse +GetInstanceProfileResult +GetInstanceRequest +GetInstanceResponse +GetInstanceResult +GetInstanceSnapshotRequest +GetInstanceSnapshotResult +GetInstanceSnapshotsRequest +GetInstanceSnapshotsResult +GetInstanceStateRequest +GetInstanceStateResult +GetInstanceTypesFromInstanceRequirementsRequest +GetInstanceTypesFromInstanceRequirementsResult +GetInstanceUefiDataRequest +GetInstanceUefiDataResult +GetInstancesHealthStatusRequest +GetInstancesHealthStatusResponse +GetInstancesRequest +GetInstancesResult +GetIntegrationRequest +GetIntegrationResponse +GetIntegrationResponseRequest +GetIntegrationResponseResponse +GetIntegrationResponsesRequest +GetIntegrationResponsesResponse +GetIntegrationResult +GetIntegrationsRequest +GetIntegrationsResponse +GetIntentRequest +GetIntentResponse +GetIntentVersionsRequest +GetIntentVersionsResponse +GetIntentsRequest +GetIntentsResponse +GetInterpolatedAssetPropertyValuesRequest +GetInterpolatedAssetPropertyValuesResponse +GetIntrospectionSchemaRequest +GetIntrospectionSchemaResponse +GetInvalidationRequest +GetInvalidationResult +GetInventoryRequest +GetInventoryResult +GetInventorySchemaRequest +GetInventorySchemaResult +GetInvitationConfigurationResponse +GetInvitationsCountResponse +GetIpAccessSettingsRequest +GetIpAccessSettingsResponse +GetIpamAddressHistoryRequest +GetIpamAddressHistoryResult +GetIpamDiscoveredAccountsRequest +GetIpamDiscoveredAccountsResult +GetIpamDiscoveredResourceCidrsRequest +GetIpamDiscoveredResourceCidrsResult +GetIpamPoolAllocationsRequest +GetIpamPoolAllocationsResult +GetIpamPoolCidrsRequest +GetIpamPoolCidrsResult +GetIpamResourceCidrsRequest +GetIpamResourceCidrsResult +GetItemInput +GetItemOutput +GetJobBookmarkRequest +GetJobBookmarkResponse +GetJobDetailsInput +GetJobDetailsOutput +GetJobDocumentRequest +GetJobDocumentResponse +GetJobManifestRequest +GetJobManifestResult +GetJobOutputInput +GetJobOutputOutput +GetJobRequest +GetJobResponse +GetJobResult +GetJobRunRequest +GetJobRunResponse +GetJobRunsRequest +GetJobRunsResponse +GetJobTaggingRequest +GetJobTaggingResult +GetJobTemplateRequest +GetJobTemplateResponse +GetJobUnlockCodeRequest +GetJobUnlockCodeResult +GetJobsRequest +GetJobsResponse +GetJourneyDateRangeKpiRequest +GetJourneyDateRangeKpiResponse +GetJourneyExecutionActivityMetricsRequest +GetJourneyExecutionActivityMetricsResponse +GetJourneyExecutionMetricsRequest +GetJourneyExecutionMetricsResponse +GetJourneyRequest +GetJourneyResponse +GetJourneyRunExecutionActivityMetricsRequest +GetJourneyRunExecutionActivityMetricsResponse +GetJourneyRunExecutionMetricsRequest +GetJourneyRunExecutionMetricsResponse +GetJourneyRunsRequest +GetJourneyRunsResponse +GetKMSEncryptionKeyResult +GetKeyGroupConfigRequest +GetKeyGroupConfigResult +GetKeyGroupRequest +GetKeyGroupResult +GetKeyInput +GetKeyOutput +GetKeyPairRequest +GetKeyPairResult +GetKeyPairsRequest +GetKeyPairsResult +GetKeyPolicyRequest +GetKeyPolicyResponse +GetKeyRotationStatusRequest +GetKeyRotationStatusResponse +GetKeyspaceRequest +GetKeyspaceResponse +GetKnowledgeBaseRequest +GetKnowledgeBaseResponse +GetKxChangesetRequest +GetKxChangesetResponse +GetKxClusterRequest +GetKxClusterResponse +GetKxConnectionStringRequest +GetKxConnectionStringResponse +GetKxDatabaseRequest +GetKxDatabaseResponse +GetKxEnvironmentRequest +GetKxEnvironmentResponse +GetKxUserRequest +GetKxUserResponse +GetLFTagRequest +GetLFTagResponse +GetLabelDetectionRequest +GetLabelDetectionRequestMetadata +GetLabelDetectionResponse +GetLabelsRequest +GetLabelsResult +GetLambdaFunctionRecommendationsRequest +GetLambdaFunctionRecommendationsResponse +GetLatestAssessmentIdResponse +GetLatestConfigurationRequest +GetLatestConfigurationResponse +GetLaunchConfigurationRequest +GetLaunchProfileDetailsRequest +GetLaunchProfileDetailsResponse +GetLaunchProfileInitializationRequest +GetLaunchProfileInitializationResponse +GetLaunchProfileMemberRequest +GetLaunchProfileMemberResponse +GetLaunchProfileRequest +GetLaunchProfileResponse +GetLaunchRequest +GetLaunchResponse +GetLaunchTemplateDataRequest +GetLaunchTemplateDataResult +GetLayerVersionByArnRequest +GetLayerVersionPolicyRequest +GetLayerVersionPolicyResponse +GetLayerVersionRequest +GetLayerVersionResponse +GetLayoutRequest +GetLayoutResponse +GetLegalHoldInput +GetLegalHoldOutput +GetLendingAnalysisRequest +GetLendingAnalysisResponse +GetLendingAnalysisSummaryRequest +GetLendingAnalysisSummaryResponse +GetLensInput +GetLensOutput +GetLensReviewInput +GetLensReviewOutput +GetLensReviewReportInput +GetLensReviewReportOutput +GetLensVersionDifferenceInput +GetLensVersionDifferenceOutput +GetLexiconInput +GetLexiconOutput +GetLicenseConfigurationRequest +GetLicenseConfigurationResponse +GetLicenseConversionTaskRequest +GetLicenseConversionTaskResponse +GetLicenseManagerReportGeneratorRequest +GetLicenseManagerReportGeneratorResponse +GetLicenseRecommendationsRequest +GetLicenseRecommendationsResponse +GetLicenseRequest +GetLicenseResponse +GetLicenseUsageRequest +GetLicenseUsageResponse +GetLifecyclePoliciesRequest +GetLifecyclePoliciesResponse +GetLifecyclePolicyInput +GetLifecyclePolicyOutput +GetLifecyclePolicyPreviewRequest +GetLifecyclePolicyPreviewResponse +GetLifecyclePolicyRequest +GetLifecyclePolicyResponse +GetLineageGroupPolicyRequest +GetLineageGroupPolicyResponse +GetLinkAssociationsRequest +GetLinkAssociationsResponse +GetLinkAttributes +GetLinkAttributesRequest +GetLinkAttributesResponse +GetLinkInput +GetLinkOutput +GetLinksRequest +GetLinksResponse +GetListElementsRequest +GetListElementsResult +GetListenerRequest +GetListenerResponse +GetListsMetadataRequest +GetListsMetadataResult +GetLoadBalancerMetricDataRequest +GetLoadBalancerMetricDataResult +GetLoadBalancerRequest +GetLoadBalancerResult +GetLoadBalancerTlsCertificatesRequest +GetLoadBalancerTlsCertificatesResult +GetLoadBalancerTlsPoliciesRequest +GetLoadBalancerTlsPoliciesResult +GetLoadBalancersRequest +GetLoadBalancersResult +GetLoaderJobStatusInput +GetLoaderJobStatusOutput +GetLogDeliveryConfigurationRequest +GetLogDeliveryConfigurationResponse +GetLogEventsRequest +GetLogEventsResponse +GetLogGroupFieldsRequest +GetLogGroupFieldsResponse +GetLogLevelsByResourceTypesResponse +GetLogRecordRequest +GetLogRecordResponse +GetLoggerDefinitionRequest +GetLoggerDefinitionResponse +GetLoggerDefinitionVersionRequest +GetLoggerDefinitionVersionResponse +GetLoggingConfigurationRequest +GetLoggingConfigurationResponse +GetLoggingOptionsResponse +GetLoginProfileRequest +GetLoginProfileResponse +GetLowLatencyHlsManifestConfiguration +GetMFADeviceRequest +GetMFADeviceResponse +GetMLDataProcessingJobInput +GetMLDataProcessingJobOutput +GetMLEndpointInput +GetMLEndpointOutput +GetMLModelInput +GetMLModelOutput +GetMLModelTrainingJobInput +GetMLModelTrainingJobOutput +GetMLModelTransformJobInput +GetMLModelTransformJobOutput +GetMLTaskRunRequest +GetMLTaskRunResponse +GetMLTaskRunsRequest +GetMLTaskRunsResponse +GetMLTransformRequest +GetMLTransformResponse +GetMLTransformsRequest +GetMLTransformsResponse +GetMacieSessionResponse +GetMailDomainRequest +GetMailDomainResponse +GetMailboxDetailsRequest +GetMailboxDetailsResponse +GetMaintenanceWindowExecutionRequest +GetMaintenanceWindowExecutionResult +GetMaintenanceWindowExecutionTaskInvocationRequest +GetMaintenanceWindowExecutionTaskInvocationResult +GetMaintenanceWindowExecutionTaskRequest +GetMaintenanceWindowExecutionTaskResult +GetMaintenanceWindowRequest +GetMaintenanceWindowResult +GetMaintenanceWindowTaskRequest +GetMaintenanceWindowTaskResult +GetMalwareScanSettingsRequest +GetMalwareScanSettingsResponse +GetManagedEndpointSessionCredentialsRequest +GetManagedEndpointSessionCredentialsResponse +GetManagedPrefixListAssociationsRequest +GetManagedPrefixListAssociationsResult +GetManagedPrefixListEntriesRequest +GetManagedPrefixListEntriesResult +GetManagedResourceRequest +GetManagedResourceResponse +GetManagedRuleSetRequest +GetManagedRuleSetResponse +GetManagedScalingPolicyInput +GetManagedScalingPolicyOutput +GetMapGlyphsRequest +GetMapGlyphsResponse +GetMapSpritesRequest +GetMapSpritesResponse +GetMapStyleDescriptorRequest +GetMapStyleDescriptorResponse +GetMapTileRequest +GetMapTileResponse +GetMappingRequest +GetMappingResponse +GetMasterAccountRequest +GetMasterAccountResponse +GetMatchIdInput +GetMatchIdOutput +GetMatchesRequest +GetMatchesResponse +GetMatchingJobInput +GetMatchingJobOutput +GetMatchingWorkflowInput +GetMatchingWorkflowOutput +GetMediaCapturePipelineRequest +GetMediaCapturePipelineResponse +GetMediaForFragmentListInput +GetMediaForFragmentListOutput +GetMediaInput +GetMediaInsightsPipelineConfigurationRequest +GetMediaInsightsPipelineConfigurationResponse +GetMediaOutput +GetMediaPipelineKinesisVideoStreamPoolRequest +GetMediaPipelineKinesisVideoStreamPoolResponse +GetMediaPipelineRequest +GetMediaPipelineResponse +GetMedicalTranscriptionJobRequest +GetMedicalTranscriptionJobResponse +GetMedicalVocabularyRequest +GetMedicalVocabularyResponse +GetMeetingRequest +GetMeetingResponse +GetMemberDetectorsRequest +GetMemberDetectorsResponse +GetMemberInput +GetMemberOutput +GetMemberRequest +GetMemberResponse +GetMembersRequest +GetMembersResponse +GetMembershipInput +GetMembershipOutput +GetMergeCommitInput +GetMergeCommitOutput +GetMergeConflictsInput +GetMergeConflictsOutput +GetMergeOptionsInput +GetMergeOptionsOutput +GetMessageInsightsRequest +GetMessageInsightsResponse +GetMessagingSessionEndpointResponse +GetMessagingStreamingConfigurationsRequest +GetMessagingStreamingConfigurationsResponse +GetMetadataRequest +GetMetadataResponse +GetMethodRequest +GetMethodResponseRequest +GetMetricDataInput +GetMetricDataOutput +GetMetricDataRequest +GetMetricDataResponse +GetMetricDataV2Request +GetMetricDataV2Response +GetMetricPolicyInput +GetMetricPolicyOutput +GetMetricStatisticsInput +GetMetricStatisticsOutput +GetMetricStreamInput +GetMetricStreamOutput +GetMetricWidgetImageInput +GetMetricWidgetImageOutput +GetMetricsSummaryRequest +GetMetricsSummaryResponse +GetMigrationRequest +GetMigrationResponse +GetMigrationWorkflowRequest +GetMigrationWorkflowResponse +GetMigrationWorkflowTemplateRequest +GetMigrationWorkflowTemplateResponse +GetMigrationsRequest +GetMigrationsResponse +GetMilestoneInput +GetMilestoneOutput +GetMinuteUsageRequest +GetMinuteUsageResponse +GetMissionProfileRequest +GetMissionProfileResponse +GetMobileDeviceAccessEffectRequest +GetMobileDeviceAccessEffectResponse +GetMobileDeviceAccessOverrideRequest +GetMobileDeviceAccessOverrideResponse +GetMobileSdkReleaseRequest +GetMobileSdkReleaseResponse +GetModelCustomizationJobRequest +GetModelCustomizationJobResponse +GetModelInvocationLoggingConfigurationResponse +GetModelManifestRequest +GetModelManifestResponse +GetModelPackageGroupPolicyInput +GetModelPackageGroupPolicyOutput +GetModelRequest +GetModelResponse +GetModelTemplateRequest +GetModelTemplateResponse +GetModelVersionRequest +GetModelVersionResult +GetModelsRequest +GetModelsResponse +GetModelsResult +GetMonitorInput +GetMonitorOutput +GetMonitoringSubscriptionRequest +GetMonitoringSubscriptionResult +GetMultiRegionAccessPointPolicyRequest +GetMultiRegionAccessPointPolicyResult +GetMultiRegionAccessPointPolicyStatusRequest +GetMultiRegionAccessPointPolicyStatusResult +GetMultiRegionAccessPointRequest +GetMultiRegionAccessPointResult +GetMultiRegionAccessPointRoutesRequest +GetMultiRegionAccessPointRoutesResult +GetMulticastGroupRequest +GetMulticastGroupResponse +GetMulticastGroupSessionRequest +GetMulticastGroupSessionResponse +GetNamedQueryInput +GetNamedQueryOutput +GetNamespaceDeletionStatusResponse +GetNamespaceRequest +GetNamespaceResponse +GetNetworkAnalyzerConfigurationRequest +GetNetworkAnalyzerConfigurationResponse +GetNetworkInput +GetNetworkInsightsAccessScopeAnalysisFindingsRequest +GetNetworkInsightsAccessScopeAnalysisFindingsResult +GetNetworkInsightsAccessScopeContentRequest +GetNetworkInsightsAccessScopeContentResult +GetNetworkOutput +GetNetworkProfileRequest +GetNetworkProfileResponse +GetNetworkProfileResult +GetNetworkRequest +GetNetworkResourceCountsRequest +GetNetworkResourceCountsResponse +GetNetworkResourceRelationshipsRequest +GetNetworkResourceRelationshipsResponse +GetNetworkResourceRequest +GetNetworkResourceResponse +GetNetworkResourcesRequest +GetNetworkResourcesResponse +GetNetworkResponse +GetNetworkRoutesRequest +GetNetworkRoutesResponse +GetNetworkSettingsRequest +GetNetworkSettingsResponse +GetNetworkSiteRequest +GetNetworkSiteResponse +GetNetworkTelemetryRequest +GetNetworkTelemetryResponse +GetNodeInput +GetNodeOutput +GetNotebookMetadataInput +GetNotebookMetadataOutput +GetNotificationChannelResponse +GetNotificationConfigurationRequest +GetNotificationConfigurationResponse +GetOTAUpdateRequest +GetOTAUpdateResponse +GetObjectAclOutput +GetObjectAclRequest +GetObjectAttributes +GetObjectAttributesOutput +GetObjectAttributesParts +GetObjectAttributesRequest +GetObjectAttributesResponse +GetObjectInformation +GetObjectInformationRequest +GetObjectInformationResponse +GetObjectLegalHoldOutput +GetObjectLegalHoldRequest +GetObjectLockConfigurationOutput +GetObjectLockConfigurationRequest +GetObjectMetadataInput +GetObjectMetadataOutput +GetObjectOutput +GetObjectRequest +GetObjectResponse +GetObjectRetentionOutput +GetObjectRetentionRequest +GetObjectTaggingOutput +GetObjectTaggingRequest +GetObjectTorrentOutput +GetObjectTorrentRequest +GetOfferingStatusRequest +GetOfferingStatusResult +GetOnPremisesInstanceInput +GetOnPremisesInstanceOutput +GetOpenCypherQueryStatusInput +GetOpenCypherQueryStatusOutput +GetOpenIDConnectProviderRequest +GetOpenIDConnectProviderResponse +GetOpenIdTokenForDeveloperIdentityInput +GetOpenIdTokenForDeveloperIdentityResponse +GetOpenIdTokenInput +GetOpenIdTokenResponse +GetOperationDetailRequest +GetOperationDetailResponse +GetOperationInput +GetOperationOutput +GetOperationRequest +GetOperationResponse +GetOperationResult +GetOperationsForResourceRequest +GetOperationsForResourceResult +GetOperationsRequest +GetOperationsResult +GetOpsItemRequest +GetOpsItemResponse +GetOpsMetadataRequest +GetOpsMetadataResult +GetOpsSummaryRequest +GetOpsSummaryResult +GetOrderInput +GetOrderOutput +GetOrderRequest +GetOrderResponse +GetOrganizationAdminAccountResponse +GetOrganizationConfigRuleDetailedStatusRequest +GetOrganizationConfigRuleDetailedStatusResponse +GetOrganizationConformancePackDetailedStatusRequest +GetOrganizationConformancePackDetailedStatusResponse +GetOrganizationCustomRulePolicyRequest +GetOrganizationCustomRulePolicyResponse +GetOrganizationsAccessReportRequest +GetOrganizationsAccessReportResponse +GetOriginAccessControlConfigRequest +GetOriginAccessControlConfigResult +GetOriginAccessControlRequest +GetOriginAccessControlResult +GetOriginEndpointPolicyRequest +GetOriginEndpointPolicyResponse +GetOriginEndpointRequest +GetOriginEndpointResponse +GetOriginRequestPolicyConfigRequest +GetOriginRequestPolicyConfigResult +GetOriginRequestPolicyRequest +GetOriginRequestPolicyResult +GetOutcomesRequest +GetOutcomesResult +GetOutpostInput +GetOutpostInstanceTypesInput +GetOutpostInstanceTypesOutput +GetOutpostOutput +GetOutpostResolverRequest +GetOutpostResolverResponse +GetPackageConfigurationResponse +GetPackageRequest +GetPackageResponse +GetPackageVersionAssetRequest +GetPackageVersionAssetResult +GetPackageVersionHistoryRequest +GetPackageVersionHistoryResponse +GetPackageVersionReadmeRequest +GetPackageVersionReadmeResult +GetPackageVersionRequest +GetPackageVersionResponse +GetParallelDataRequest +GetParallelDataResponse +GetParameterHistoryRequest +GetParameterHistoryResult +GetParameterRequest +GetParameterResult +GetParametersByPathRequest +GetParametersByPathResult +GetParametersForExportInput +GetParametersForExportOutput +GetParametersForImportInput +GetParametersForImportOutput +GetParametersForImportRequest +GetParametersForImportResponse +GetParametersRequest +GetParametersResult +GetParticipantRequest +GetParticipantResponse +GetPartitionIndexesRequest +GetPartitionIndexesResponse +GetPartitionRequest +GetPartitionResponse +GetPartitionsRequest +GetPartitionsResponse +GetPartnerAccountRequest +GetPartnerAccountResponse +GetPasswordDataRequest +GetPasswordDataResult +GetPatchBaselineForPatchGroupRequest +GetPatchBaselineForPatchGroupResult +GetPatchBaselineRequest +GetPatchBaselineResult +GetPendingJobExecutionsRequest +GetPendingJobExecutionsResponse +GetPercentilesRequest +GetPercentilesResponse +GetPerformanceAnalysisReportRequest +GetPerformanceAnalysisReportResponse +GetPermissionGroupRequest +GetPermissionGroupResponse +GetPermissionPolicyRequest +GetPermissionPolicyResponse +GetPermissionRequest +GetPermissionResponse +GetPermissionsBoundaryForPermissionSetRequest +GetPermissionsBoundaryForPermissionSetResponse +GetPersonTrackingRequest +GetPersonTrackingResponse +GetPersonalizedRankingRequest +GetPersonalizedRankingResponse +GetPhoneNumberOrderRequest +GetPhoneNumberOrderResponse +GetPhoneNumberRequest +GetPhoneNumberResponse +GetPhoneNumberSettingsResponse +GetPipelineBlueprintRequest +GetPipelineBlueprintResponse +GetPipelineChangeProgressRequest +GetPipelineChangeProgressResponse +GetPipelineDefinitionInput +GetPipelineDefinitionOutput +GetPipelineExecutionInput +GetPipelineExecutionOutput +GetPipelineInput +GetPipelineOutput +GetPipelineRequest +GetPipelineResponse +GetPipelineStateInput +GetPipelineStateOutput +GetPlaceRequest +GetPlaceResponse +GetPlanRequest +GetPlanResponse +GetPlatformApplicationAttributesInput +GetPlatformApplicationAttributesResponse +GetPlaybackConfigurationRequest +GetPlaybackConfigurationResponse +GetPlaybackKeyPairRequest +GetPlaybackKeyPairResponse +GetPlayerConnectionStatusRequest +GetPlayerConnectionStatusResult +GetPoliciesStatsResponse +GetPolicyInput +GetPolicyOutput +GetPolicyRequest +GetPolicyResponse +GetPolicyStoreInput +GetPolicyStoreOutput +GetPolicyTemplateInput +GetPolicyTemplateOutput +GetPolicyVersionRequest +GetPolicyVersionResponse +GetPortalRequest +GetPortalResponse +GetPortalServiceProviderMetadataRequest +GetPortalServiceProviderMetadataResponse +GetPortfolioPreferencesResponse +GetPortfolioSummaryResponse +GetPositionConfigurationRequest +GetPositionConfigurationResponse +GetPositionEstimateRequest +GetPositionEstimateResponse +GetPositionRequest +GetPositionResponse +GetPredictiveScalingForecastAnswer +GetPredictiveScalingForecastType +GetPrefetchScheduleRequest +GetPrefetchScheduleResponse +GetPreparedStatementInput +GetPreparedStatementOutput +GetPresetRequest +GetPresetResponse +GetPriceListFileUrlRequest +GetPriceListFileUrlResponse +GetPricingPlanResponse +GetPrincipalTagAttributeMapInput +GetPrincipalTagAttributeMapResponse +GetProductsRequest +GetProductsResponse +GetProfileInput +GetProfileObjectTypeRequest +GetProfileObjectTypeResponse +GetProfileObjectTypeTemplateRequest +GetProfileObjectTypeTemplateResponse +GetProfileOutput +GetProfileRequest +GetProfileResponse +GetProfileTemplateOutput +GetProgrammaticAccessCredentialsRequest +GetProgrammaticAccessCredentialsResponse +GetProjectRequest +GetProjectResponse +GetProjectResult +GetPromptFileRequest +GetPromptFileResponse +GetPropertyValueHistoryRequest +GetPropertyValueHistoryResponse +GetPropertyValueRequest +GetPropertyValueResponse +GetPropertygraphStatisticsOutput +GetPropertygraphStreamInput +GetPropertygraphStreamOutput +GetPropertygraphSummaryInput +GetPropertygraphSummaryOutput +GetProposalInput +GetProposalOutput +GetProtectedQueryInput +GetProtectedQueryOutput +GetProtectionStatusRequest +GetProtectionStatusResponse +GetProtocolsListRequest +GetProtocolsListResponse +GetProvisionedConcurrencyConfigRequest +GetProvisionedConcurrencyConfigResponse +GetProvisionedModelThroughputRequest +GetProvisionedModelThroughputResponse +GetProvisionedProductOutputsInput +GetProvisionedProductOutputsOutput +GetProxySessionRequest +GetProxySessionResponse +GetPublicAccessBlockOutput +GetPublicAccessBlockRequest +GetPublicKeyCertificateInput +GetPublicKeyCertificateOutput +GetPublicKeyConfigRequest +GetPublicKeyConfigResult +GetPublicKeyRequest +GetPublicKeyResponse +GetPublicKeyResult +GetPullRequestApprovalStatesInput +GetPullRequestApprovalStatesOutput +GetPullRequestInput +GetPullRequestOutput +GetPullRequestOverrideStateInput +GetPullRequestOverrideStateOutput +GetPushTemplateRequest +GetPushTemplateResponse +GetQualificationScoreRequest +GetQualificationScoreResponse +GetQualificationTypeRequest +GetQualificationTypeResponse +GetQuantumTaskRequest +GetQuantumTaskResponse +GetQueryExecutionInput +GetQueryExecutionOutput +GetQueryLoggingConfigRequest +GetQueryLoggingConfigResponse +GetQueryResultsInput +GetQueryResultsOutput +GetQueryResultsRequest +GetQueryResultsResponse +GetQueryRuntimeStatisticsInput +GetQueryRuntimeStatisticsOutput +GetQueryStateRequest +GetQueryStateResponse +GetQueryStatisticsRequest +GetQueryStatisticsResponse +GetQuerySuggestionsRequest +GetQuerySuggestionsResponse +GetQueueAttributesRequest +GetQueueAttributesResult +GetQueueRequest +GetQueueResponse +GetQueueUrlRequest +GetQueueUrlResult +GetRDFGraphSummaryInput +GetRDFGraphSummaryOutput +GetRandomPasswordRequest +GetRandomPasswordResponse +GetRasterDataCollectionInput +GetRasterDataCollectionOutput +GetRateBasedRuleManagedKeysRequest +GetRateBasedRuleManagedKeysResponse +GetRateBasedRuleRequest +GetRateBasedRuleResponse +GetRateBasedStatementManagedKeysRequest +GetRateBasedStatementManagedKeysResponse +GetRawMessageContentRequest +GetRawMessageContentResponse +GetReadSetActivationJobRequest +GetReadSetActivationJobResponse +GetReadSetExportJobRequest +GetReadSetExportJobResponse +GetReadSetImportJobRequest +GetReadSetImportJobResponse +GetReadSetMetadataRequest +GetReadSetMetadataResponse +GetReadSetRequest +GetReadSetResponse +GetReadinessCheckRequest +GetReadinessCheckResourceStatusRequest +GetReadinessCheckResourceStatusResponse +GetReadinessCheckResponse +GetReadinessCheckStatusRequest +GetReadinessCheckStatusResponse +GetRealtimeLogConfigRequest +GetRealtimeLogConfigResult +GetRecommendationError +GetRecommendationPreferencesRequest +GetRecommendationPreferencesResponse +GetRecommendationReportDetailsRequest +GetRecommendationReportDetailsResponse +GetRecommendationSummariesRequest +GetRecommendationSummariesResponse +GetRecommendationsRequest +GetRecommendationsResponse +GetRecommenderConfigurationRequest +GetRecommenderConfigurationResponse +GetRecommenderConfigurationsRequest +GetRecommenderConfigurationsResponse +GetRecordRequest +GetRecordResponse +GetRecordingConfigurationRequest +GetRecordingConfigurationResponse +GetRecordsInput +GetRecordsOutput +GetRecoveryGroupReadinessSummaryRequest +GetRecoveryGroupReadinessSummaryResponse +GetRecoveryGroupRequest +GetRecoveryGroupResponse +GetRecoveryPointRequest +GetRecoveryPointResponse +GetRecoveryPointRestoreMetadataInput +GetRecoveryPointRestoreMetadataOutput +GetReferenceImportJobRequest +GetReferenceImportJobResponse +GetReferenceMetadataRequest +GetReferenceMetadataResponse +GetReferenceRequest +GetReferenceResponse +GetReferenceStoreRequest +GetReferenceStoreResponse +GetRegexMatchSetRequest +GetRegexMatchSetResponse +GetRegexPatternSetRequest +GetRegexPatternSetResponse +GetRegionOptStatusRequest +GetRegionOptStatusResponse +GetRegionsRequest +GetRegionsResult +GetRegisterAccountStatusResponse +GetRegistrationCodeResponse +GetRegistryCatalogDataResponse +GetRegistryInput +GetRegistryPolicyResponse +GetRegistryResponse +GetRegistryScanningConfigurationResponse +GetRelationalDatabaseBlueprintsRequest +GetRelationalDatabaseBlueprintsResult +GetRelationalDatabaseBundlesRequest +GetRelationalDatabaseBundlesResult +GetRelationalDatabaseEventsRequest +GetRelationalDatabaseEventsResult +GetRelationalDatabaseLogEventsRequest +GetRelationalDatabaseLogEventsResult +GetRelationalDatabaseLogStreamsRequest +GetRelationalDatabaseLogStreamsResult +GetRelationalDatabaseMasterUserPasswordRequest +GetRelationalDatabaseMasterUserPasswordResult +GetRelationalDatabaseMetricDataRequest +GetRelationalDatabaseMetricDataResult +GetRelationalDatabaseParametersRequest +GetRelationalDatabaseParametersResult +GetRelationalDatabaseRequest +GetRelationalDatabaseResult +GetRelationalDatabaseSnapshotRequest +GetRelationalDatabaseSnapshotResult +GetRelationalDatabaseSnapshotsRequest +GetRelationalDatabaseSnapshotsResult +GetRelationalDatabasesRequest +GetRelationalDatabasesResult +GetRemainingFreeTrialDaysRequest +GetRemainingFreeTrialDaysResponse +GetRemoteAccessSessionRequest +GetRemoteAccessSessionResult +GetReplicationConfigurationRequest +GetReplicationJobsRequest +GetReplicationJobsResponse +GetReplicationRunsRequest +GetReplicationRunsResponse +GetReplicationSetInput +GetReplicationSetOutput +GetReportDefinitionRequest +GetReportDefinitionResult +GetReportGroupTrendInput +GetReportGroupTrendOutput +GetRepositoryCatalogDataRequest +GetRepositoryCatalogDataResponse +GetRepositoryEndpointRequest +GetRepositoryEndpointResult +GetRepositoryInput +GetRepositoryOutput +GetRepositoryPermissionsPolicyRequest +GetRepositoryPermissionsPolicyResult +GetRepositoryPolicyRequest +GetRepositoryPolicyResponse +GetRepositorySyncStatusInput +GetRepositorySyncStatusOutput +GetRepositoryTriggersInput +GetRepositoryTriggersOutput +GetRequestMetadata +GetRequestValidatorRequest +GetRequestValidatorsRequest +GetRequestedServiceQuotaChangeRequest +GetRequestedServiceQuotaChangeResponse +GetReservationCoverageRequest +GetReservationCoverageResponse +GetReservationPurchaseRecommendationRequest +GetReservationPurchaseRecommendationResponse +GetReservationUtilizationRequest +GetReservationUtilizationResponse +GetReservedInstancesExchangeQuoteRequest +GetReservedInstancesExchangeQuoteResult +GetReservedNodeExchangeConfigurationOptionsInputMessage +GetReservedNodeExchangeConfigurationOptionsOutputMessage +GetReservedNodeExchangeOfferingsInputMessage +GetReservedNodeExchangeOfferingsOutputMessage +GetResolverConfigRequest +GetResolverConfigResponse +GetResolverDnssecConfigRequest +GetResolverDnssecConfigResponse +GetResolverEndpointRequest +GetResolverEndpointResponse +GetResolverQueryLogConfigAssociationRequest +GetResolverQueryLogConfigAssociationResponse +GetResolverQueryLogConfigPolicyRequest +GetResolverQueryLogConfigPolicyResponse +GetResolverQueryLogConfigRequest +GetResolverQueryLogConfigResponse +GetResolverRequest +GetResolverResponse +GetResolverRuleAssociationRequest +GetResolverRuleAssociationResponse +GetResolverRulePolicyRequest +GetResolverRulePolicyResponse +GetResolverRuleRequest +GetResolverRuleResponse +GetResourceCollectionRequest +GetResourceCollectionResponse +GetResourceConfigHistoryRequest +GetResourceConfigHistoryResponse +GetResourceDefinitionRequest +GetResourceDefinitionResponse +GetResourceDefinitionVersionRequest +GetResourceDefinitionVersionResponse +GetResourceEvaluationSummaryRequest +GetResourceEvaluationSummaryResponse +GetResourceEventConfigurationRequest +GetResourceEventConfigurationResponse +GetResourceInput +GetResourceLFTagsRequest +GetResourceLFTagsResponse +GetResourceLogLevelRequest +GetResourceLogLevelResponse +GetResourceMetadataRequest +GetResourceMetadataResponse +GetResourceMetricsRequest +GetResourceMetricsResponse +GetResourceOutput +GetResourcePermissionInput +GetResourcePermissionOutput +GetResourcePoliciesInput +GetResourcePoliciesOutput +GetResourcePoliciesRequest +GetResourcePoliciesResponse +GetResourcePoliciesResponseEntry +GetResourcePoliciesResponseList +GetResourcePolicyInput +GetResourcePolicyOutput +GetResourcePolicyRequest +GetResourcePolicyResponse +GetResourcePositionRequest +GetResourcePositionResponse +GetResourceProfileRequest +GetResourceProfileResponse +GetResourceRequest +GetResourceRequestStatusInput +GetResourceRequestStatusOutput +GetResourceSetRequest +GetResourceSetResponse +GetResourceShareAssociationsRequest +GetResourceShareAssociationsResponse +GetResourceShareInvitationsRequest +GetResourceShareInvitationsResponse +GetResourceSharesRequest +GetResourceSharesResponse +GetResourcesInput +GetResourcesOutput +GetResourcesRequest +GetResourcesResponse +GetResourcesSummaryOutput +GetResponseHeadersPolicyConfigRequest +GetResponseHeadersPolicyConfigResult +GetResponseHeadersPolicyRequest +GetResponseHeadersPolicyResult +GetResponsePlanInput +GetResponsePlanOutput +GetRestApiRequest +GetRestApisRequest +GetRetainedMessageRequest +GetRetainedMessageResponse +GetRetentionSettingsRequest +GetRetentionSettingsResponse +GetReusableDelegationSetLimitRequest +GetReusableDelegationSetLimitResponse +GetReusableDelegationSetRequest +GetReusableDelegationSetResponse +GetRevealConfigurationResponse +GetRevisionRequest +GetRevisionResponse +GetRevocationStatusRequest +GetRevocationStatusResponse +GetRightsizingRecommendationRequest +GetRightsizingRecommendationResponse +GetRoleCredentialsRequest +GetRoleCredentialsResponse +GetRolePolicyRequest +GetRolePolicyResponse +GetRoleRequest +GetRoleResponse +GetRoomRequest +GetRoomResponse +GetRoomSkillParameterRequest +GetRoomSkillParameterResponse +GetRotationOverrideRequest +GetRotationOverrideResult +GetRotationRequest +GetRotationResult +GetRouteAnalysisRequest +GetRouteAnalysisResponse +GetRouteRequest +GetRouteResponse +GetRouteResponseRequest +GetRouteResponseResponse +GetRouteResponsesRequest +GetRouteResponsesResponse +GetRouteResult +GetRoutesRequest +GetRoutesResponse +GetRoutingControlStateRequest +GetRoutingControlStateResponse +GetRuleGroupRequest +GetRuleGroupResponse +GetRuleRequest +GetRuleResponse +GetRulesRequest +GetRulesResult +GetRunGroupRequest +GetRunGroupResponse +GetRunRequest +GetRunResponse +GetRunResult +GetRunTaskRequest +GetRunTaskResponse +GetRuntimeManagementConfigRequest +GetRuntimeManagementConfigResponse +GetSAMLProviderRequest +GetSAMLProviderResponse +GetSMSAttributesInput +GetSMSAttributesResponse +GetSMSSandboxAccountStatusResult +GetSSHPublicKeyRequest +GetSSHPublicKeyResponse +GetSagemakerServicecatalogPortfolioStatusOutput +GetSampleDataRequest +GetSampleDataResponse +GetSampledRequestsRequest +GetSampledRequestsResponse +GetSamplingRulesRequest +GetSamplingRulesResult +GetSamplingStatisticSummariesRequest +GetSamplingStatisticSummariesResult +GetSamplingTargetsRequest +GetSamplingTargetsResult +GetSatelliteRequest +GetSatelliteResponse +GetSavingsPlanPurchaseRecommendationDetailsRequest +GetSavingsPlanPurchaseRecommendationDetailsResponse +GetSavingsPlansCoverageRequest +GetSavingsPlansCoverageResponse +GetSavingsPlansPurchaseRecommendationRequest +GetSavingsPlansPurchaseRecommendationResponse +GetSavingsPlansUtilizationDetailsRequest +GetSavingsPlansUtilizationDetailsResponse +GetSavingsPlansUtilizationRequest +GetSavingsPlansUtilizationResponse +GetSbomExportRequest +GetSbomExportResponse +GetScalingConfigurationRecommendationRequest +GetScalingConfigurationRecommendationResponse +GetScalingPlanResourceForecastDataRequest +GetScalingPlanResourceForecastDataResponse +GetScanRequest +GetScanResponse +GetSceneRequest +GetSceneResponse +GetScheduleGroupInput +GetScheduleGroupOutput +GetScheduleInput +GetScheduleOutput +GetSchemaAnalysisRuleInput +GetSchemaAnalysisRuleOutput +GetSchemaAsJsonRequest +GetSchemaAsJsonResponse +GetSchemaByDefinitionInput +GetSchemaByDefinitionResponse +GetSchemaCreationStatusRequest +GetSchemaCreationStatusResponse +GetSchemaInput +GetSchemaMappingInput +GetSchemaMappingOutput +GetSchemaOutput +GetSchemaResponse +GetSchemaVersionInput +GetSchemaVersionResponse +GetSchemaVersionsDiffInput +GetSchemaVersionsDiffResponse +GetScreenDataRequest +GetScreenDataResult +GetSdkRequest +GetSdkTypeRequest +GetSdkTypesRequest +GetSearchSuggestionsRequest +GetSearchSuggestionsResponse +GetSecretValueRequest +GetSecretValueResponse +GetSecurityConfigRequest +GetSecurityConfigResponse +GetSecurityConfigurationRequest +GetSecurityConfigurationResponse +GetSecurityConfigurationsRequest +GetSecurityConfigurationsResponse +GetSecurityPolicyRequest +GetSecurityPolicyResponse +GetSegmentDetectionRequest +GetSegmentDetectionResponse +GetSegmentExportJobsRequest +GetSegmentExportJobsResponse +GetSegmentImportJobsRequest +GetSegmentImportJobsResponse +GetSegmentRequest +GetSegmentResponse +GetSegmentVersionRequest +GetSegmentVersionResponse +GetSegmentVersionsRequest +GetSegmentVersionsResponse +GetSegmentsRequest +GetSegmentsResponse +GetSendQuotaResponse +GetSendStatisticsResponse +GetSensitiveDataOccurrencesAvailabilityRequest +GetSensitiveDataOccurrencesAvailabilityResponse +GetSensitiveDataOccurrencesRequest +GetSensitiveDataOccurrencesResponse +GetSensitivityInspectionTemplateRequest +GetSensitivityInspectionTemplateResponse +GetSequenceStoreRequest +GetSequenceStoreResponse +GetSerialConsoleAccessStatusRequest +GetSerialConsoleAccessStatusResult +GetServerCertificateRequest +GetServerCertificateResponse +GetServerDetailsRequest +GetServerDetailsResponse +GetServerStrategiesRequest +GetServerStrategiesResponse +GetServersRequest +GetServersResponse +GetServiceEndpointRequest +GetServiceEndpointResponse +GetServiceGraphRequest +GetServiceGraphResult +GetServiceInput +GetServiceInstanceInput +GetServiceInstanceOutput +GetServiceInstanceSyncStatusInput +GetServiceInstanceSyncStatusOutput +GetServiceLastAccessedDetailsRequest +GetServiceLastAccessedDetailsResponse +GetServiceLastAccessedDetailsWithEntitiesRequest +GetServiceLastAccessedDetailsWithEntitiesResponse +GetServiceLinkedRoleDeletionStatusRequest +GetServiceLinkedRoleDeletionStatusResponse +GetServiceNetworkRequest +GetServiceNetworkResponse +GetServiceNetworkServiceAssociationRequest +GetServiceNetworkServiceAssociationResponse +GetServiceNetworkVpcAssociationRequest +GetServiceNetworkVpcAssociationResponse +GetServiceOutput +GetServicePrincipalNameRequest +GetServicePrincipalNameResponse +GetServiceProfileRequest +GetServiceProfileResponse +GetServiceQuotaIncreaseRequestFromTemplateRequest +GetServiceQuotaIncreaseRequestFromTemplateResponse +GetServiceQuotaRequest +GetServiceQuotaResponse +GetServiceRequest +GetServiceResponse +GetServiceRoleForAccountResponse +GetServiceSettingRequest +GetServiceSettingResult +GetServiceSettingsResponse +GetServiceSyncBlockerSummaryInput +GetServiceSyncBlockerSummaryOutput +GetServiceSyncConfigInput +GetServiceSyncConfigOutput +GetServiceTemplateInput +GetServiceTemplateOutput +GetServiceTemplateVersionInput +GetServiceTemplateVersionOutput +GetServicesInScopeResponse +GetSessionEmbedUrlRequest +GetSessionEmbedUrlResponse +GetSessionRequest +GetSessionResponse +GetSessionStatusRequest +GetSessionStatusResponse +GetSessionTokenRequest +GetSessionTokenResponse +GetSettingsRequest +GetSettingsResponse +GetShardIteratorInput +GetShardIteratorOutput +GetShareRequest +GetShareResponse +GetSignalCatalogRequest +GetSignalCatalogResponse +GetSignalingChannelEndpointInput +GetSignalingChannelEndpointOutput +GetSignedBluinsightsUrlResponse +GetSigningCertificateRequest +GetSigningCertificateResponse +GetSigningPlatformRequest +GetSigningPlatformResponse +GetSigningProfileRequest +GetSigningProfileResponse +GetSimilarProfilesRequest +GetSimilarProfilesResponse +GetSinkInput +GetSinkOutput +GetSinkPolicyInput +GetSinkPolicyOutput +GetSipMediaApplicationAlexaSkillConfigurationRequest +GetSipMediaApplicationAlexaSkillConfigurationResponse +GetSipMediaApplicationLoggingConfigurationRequest +GetSipMediaApplicationLoggingConfigurationResponse +GetSipMediaApplicationRequest +GetSipMediaApplicationResponse +GetSipRuleRequest +GetSipRuleResponse +GetSiteAddressInput +GetSiteAddressOutput +GetSiteInput +GetSiteOutput +GetSiteRequest +GetSiteResponse +GetSiteToSiteVpnAttachmentRequest +GetSiteToSiteVpnAttachmentResponse +GetSitesRequest +GetSitesResponse +GetSizeConstraintSetRequest +GetSizeConstraintSetResponse +GetSkillGroupRequest +GetSkillGroupResponse +GetSlotTypeRequest +GetSlotTypeResponse +GetSlotTypeVersionsRequest +GetSlotTypeVersionsResponse +GetSlotTypesRequest +GetSlotTypesResponse +GetSmsChannelRequest +GetSmsChannelResponse +GetSmsTemplateRequest +GetSmsTemplateResponse +GetSnapshotBlockRequest +GetSnapshotBlockResponse +GetSnapshotLimitsRequest +GetSnapshotLimitsResult +GetSnapshotRequest +GetSnapshotResponse +GetSnapshotResult +GetSnapshotsRequest +GetSnapshotsResponse +GetSnowballUsageResult +GetSoftwareUpdatesRequest +GetSoftwareUpdatesResult +GetSolFunctionInstanceInput +GetSolFunctionInstanceMetadata +GetSolFunctionInstanceOutput +GetSolFunctionPackageContentInput +GetSolFunctionPackageContentOutput +GetSolFunctionPackageDescriptorInput +GetSolFunctionPackageDescriptorOutput +GetSolFunctionPackageInput +GetSolFunctionPackageMetadata +GetSolFunctionPackageOutput +GetSolInstantiatedVnfInfo +GetSolNetworkInstanceInput +GetSolNetworkInstanceMetadata +GetSolNetworkInstanceOutput +GetSolNetworkOperationInput +GetSolNetworkOperationMetadata +GetSolNetworkOperationOutput +GetSolNetworkOperationTaskDetails +GetSolNetworkPackageContentInput +GetSolNetworkPackageContentOutput +GetSolNetworkPackageDescriptorInput +GetSolNetworkPackageDescriptorOutput +GetSolNetworkPackageInput +GetSolNetworkPackageMetadata +GetSolNetworkPackageOutput +GetSolVnfInfo +GetSolVnfcResourceInfo +GetSolVnfcResourceInfoMetadata +GetSolutionMetricsRequest +GetSolutionMetricsResponse +GetSourceApiAssociationRequest +GetSourceApiAssociationResponse +GetSourceRepositoryCloneUrlsRequest +GetSourceRepositoryCloneUrlsResponse +GetSourceRepositoryRequest +GetSourceRepositoryResponse +GetSpaceRequest +GetSpaceResponse +GetSparqlStatisticsOutput +GetSparqlStreamInput +GetSparqlStreamOutput +GetSpeakerSearchTaskRequest +GetSpeakerSearchTaskResponse +GetSpeechSynthesisTaskInput +GetSpeechSynthesisTaskOutput +GetSpotPlacementScoresRequest +GetSpotPlacementScoresResult +GetSqlInjectionMatchSetRequest +GetSqlInjectionMatchSetResponse +GetStackPolicyInput +GetStackPolicyOutput +GetStageDeploymentRequest +GetStageDeploymentResult +GetStageRequest +GetStageResponse +GetStageResult +GetStageSessionRequest +GetStageSessionResponse +GetStagesRequest +GetStagesResponse +GetStatementRequest +GetStatementResponse +GetStatementResultRequest +GetStatementResultResponse +GetStaticIpRequest +GetStaticIpResult +GetStaticIpsRequest +GetStaticIpsResult +GetStatisticsRequest +GetStatisticsResponse +GetStorageLensConfigurationRequest +GetStorageLensConfigurationResult +GetStorageLensConfigurationTaggingRequest +GetStorageLensConfigurationTaggingResult +GetStoredQueryRequest +GetStoredQueryResponse +GetStreamKeyRequest +GetStreamKeyResponse +GetStreamRequest +GetStreamResponse +GetStreamSessionRequest +GetStreamSessionResponse +GetStreamingDistributionConfigRequest +GetStreamingDistributionConfigResult +GetStreamingDistributionRequest +GetStreamingDistributionResult +GetStreamingImageRequest +GetStreamingImageResponse +GetStreamingSessionBackupRequest +GetStreamingSessionBackupResponse +GetStreamingSessionRequest +GetStreamingSessionResponse +GetStreamingSessionStreamRequest +GetStreamingSessionStreamResponse +GetStudioComponentRequest +GetStudioComponentResponse +GetStudioMemberRequest +GetStudioMemberResponse +GetStudioRequest +GetStudioResponse +GetStudioSessionMappingInput +GetStudioSessionMappingOutput +GetSubnetCidrReservationsRequest +GetSubnetCidrReservationsResult +GetSubscriberRequest +GetSubscriberResponse +GetSubscriptionAttributesInput +GetSubscriptionAttributesResponse +GetSubscriptionDefinitionRequest +GetSubscriptionDefinitionResponse +GetSubscriptionDefinitionVersionRequest +GetSubscriptionDefinitionVersionResponse +GetSubscriptionRequest +GetSubscriptionResponse +GetSubscriptionStateResponse +GetSuiteDefinitionRequest +GetSuiteDefinitionResponse +GetSuiteRequest +GetSuiteResult +GetSuiteRunReportRequest +GetSuiteRunReportResponse +GetSuiteRunRequest +GetSuiteRunResponse +GetSupportedResourceTypesOutput +GetSuppressedDestinationRequest +GetSuppressedDestinationResponse +GetSyncJobRequest +GetSyncJobResponse +GetSystemInstanceRequest +GetSystemInstanceResponse +GetSystemTemplateRequest +GetSystemTemplateResponse +GetSystemTemplateRevisionsRequest +GetSystemTemplateRevisionsResponse +GetTableMetadataInput +GetTableMetadataOutput +GetTableObjectsRequest +GetTableObjectsResponse +GetTableRequest +GetTableResponse +GetTableRestoreStatusRequest +GetTableRestoreStatusResponse +GetTableVersionRequest +GetTableVersionResponse +GetTableVersionsRequest +GetTableVersionsResponse +GetTablesRequest +GetTablesResponse +GetTagKeysInput +GetTagKeysOutput +GetTagValuesInput +GetTagValuesOutput +GetTagsInput +GetTagsOutput +GetTagsRequest +GetTagsResponse +GetTargetGroupRequest +GetTargetGroupResponse +GetTargetResourceTypeRequest +GetTargetResourceTypeResponse +GetTaskProtectionRequest +GetTaskProtectionResponse +GetTaskTemplateRequest +GetTaskTemplateResponse +GetTelemetryMetadataRequest +GetTelemetryMetadataResponse +GetTemplateGroupAccessControlEntryRequest +GetTemplateGroupAccessControlEntryResponse +GetTemplateInput +GetTemplateOutput +GetTemplateRequest +GetTemplateResponse +GetTemplateStepGroupRequest +GetTemplateStepGroupResponse +GetTemplateStepRequest +GetTemplateStepResponse +GetTemplateSummaryInput +GetTemplateSummaryOutput +GetTemplateSyncConfigInput +GetTemplateSyncConfigOutput +GetTemplateSyncStatusInput +GetTemplateSyncStatusOutput +GetTemporaryGluePartitionCredentialsRequest +GetTemporaryGluePartitionCredentialsResponse +GetTemporaryGlueTableCredentialsRequest +GetTemporaryGlueTableCredentialsResponse +GetTerminologyRequest +GetTerminologyResponse +GetTestExecutionArtifactsUrlRequest +GetTestExecutionArtifactsUrlResponse +GetTestGridProjectRequest +GetTestGridProjectResult +GetTestGridSessionRequest +GetTestGridSessionResult +GetTestRequest +GetTestResult +GetTextDetectionRequest +GetTextDetectionResponse +GetThemeRequest +GetThemeResponse +GetThingRuntimeConfigurationRequest +GetThingRuntimeConfigurationResponse +GetThingShadowRequest +GetThingShadowResponse +GetThirdPartyFirewallAssociationStatusRequest +GetThirdPartyFirewallAssociationStatusResponse +GetThirdPartyJobDetailsInput +GetThirdPartyJobDetailsOutput +GetThreatIntelSetRequest +GetThreatIntelSetResponse +GetTileInput +GetTileOutput +GetTimeSeriesServiceStatisticsRequest +GetTimeSeriesServiceStatisticsResult +GetTimelineEventInput +GetTimelineEventOutput +GetTokenBalanceInput +GetTokenBalanceOutput +GetTokenRequest +GetTokenResponse +GetTopicAttributesInput +GetTopicAttributesResponse +GetTopicRuleDestinationRequest +GetTopicRuleDestinationResponse +GetTopicRuleRequest +GetTopicRuleResponse +GetTraceGraphRequest +GetTraceGraphResult +GetTraceSummariesRequest +GetTraceSummariesResult +GetTrafficDistributionRequest +GetTrafficDistributionResponse +GetTrafficPolicyInstanceCountResponse +GetTrafficPolicyInstanceRequest +GetTrafficPolicyInstanceResponse +GetTrafficPolicyRequest +GetTrafficPolicyResponse +GetTrailRequest +GetTrailResponse +GetTrailStatusRequest +GetTrailStatusResponse +GetTransactionInput +GetTransactionOutput +GetTranscriptRequest +GetTranscriptResponse +GetTranscriptionJobRequest +GetTranscriptionJobResponse +GetTransitGatewayAttachmentPropagationsRequest +GetTransitGatewayAttachmentPropagationsResult +GetTransitGatewayConnectPeerAssociationsRequest +GetTransitGatewayConnectPeerAssociationsResponse +GetTransitGatewayMulticastDomainAssociationsRequest +GetTransitGatewayMulticastDomainAssociationsResult +GetTransitGatewayPeeringRequest +GetTransitGatewayPeeringResponse +GetTransitGatewayPolicyTableAssociationsRequest +GetTransitGatewayPolicyTableAssociationsResult +GetTransitGatewayPolicyTableEntriesRequest +GetTransitGatewayPolicyTableEntriesResult +GetTransitGatewayPrefixListReferencesRequest +GetTransitGatewayPrefixListReferencesResult +GetTransitGatewayRegistrationsRequest +GetTransitGatewayRegistrationsResponse +GetTransitGatewayRouteTableAssociationsRequest +GetTransitGatewayRouteTableAssociationsResult +GetTransitGatewayRouteTableAttachmentRequest +GetTransitGatewayRouteTableAttachmentResponse +GetTransitGatewayRouteTablePropagationsRequest +GetTransitGatewayRouteTablePropagationsResult +GetTriggerRequest +GetTriggerResponse +GetTriggersRequest +GetTriggersResponse +GetTrustStoreCertificateRequest +GetTrustStoreCertificateResponse +GetTrustStoreRequest +GetTrustStoreResponse +GetTypeRequest +GetTypeResponse +GetTypedLinkFacetInformationRequest +GetTypedLinkFacetInformationResponse +GetUICustomizationRequest +GetUICustomizationResponse +GetUnfilteredPartitionMetadataRequest +GetUnfilteredPartitionMetadataResponse +GetUnfilteredPartitionsMetadataRequest +GetUnfilteredPartitionsMetadataResponse +GetUnfilteredTableMetadataRequest +GetUnfilteredTableMetadataResponse +GetUpgradeHistoryRequest +GetUpgradeHistoryResponse +GetUpgradeStatusRequest +GetUpgradeStatusResponse +GetUploadRequest +GetUploadResult +GetUploadStatusRequest +GetUploadStatusResponse +GetUsageForecastRequest +GetUsageForecastResponse +GetUsageLimitRequest +GetUsageLimitResponse +GetUsagePlanKeyRequest +GetUsagePlanKeysRequest +GetUsagePlanRequest +GetUsagePlansRequest +GetUsageRequest +GetUsageStatisticsRequest +GetUsageStatisticsResponse +GetUsageTotalsRequest +GetUsageTotalsResponse +GetUserAccessLoggingSettingsRequest +GetUserAccessLoggingSettingsResponse +GetUserAttributeVerificationCodeRequest +GetUserAttributeVerificationCodeResponse +GetUserDefinedFunctionRequest +GetUserDefinedFunctionResponse +GetUserDefinedFunctionsRequest +GetUserDefinedFunctionsResponse +GetUserDetailsRequest +GetUserDetailsResponse +GetUserEndpointsRequest +GetUserEndpointsResponse +GetUserIdRequest +GetUserIdResponse +GetUserPolicyRequest +GetUserPolicyResponse +GetUserPoolMfaConfigRequest +GetUserPoolMfaConfigResponse +GetUserRequest +GetUserResponse +GetUserSettingsRequest +GetUserSettingsResponse +GetUtterancesViewRequest +GetUtterancesViewResponse +GetV2LoggingOptionsResponse +GetVPCEConfigurationRequest +GetVPCEConfigurationResult +GetVariablesRequest +GetVariablesResult +GetVariantImportRequest +GetVariantImportResponse +GetVariantStoreRequest +GetVariantStoreResponse +GetVaultAccessPolicyInput +GetVaultAccessPolicyOutput +GetVaultLockInput +GetVaultLockOutput +GetVaultNotificationsInput +GetVaultNotificationsOutput +GetVectorEnrichmentJobInput +GetVectorEnrichmentJobOutput +GetVehicleRequest +GetVehicleResponse +GetVehicleStatusRequest +GetVehicleStatusResponse +GetVerifiedAccessEndpointPolicyRequest +GetVerifiedAccessEndpointPolicyResult +GetVerifiedAccessGroupPolicyRequest +GetVerifiedAccessGroupPolicyResult +GetViewInput +GetViewOutput +GetViolationDetailsRequest +GetViolationDetailsResponse +GetVirtualMachineInput +GetVirtualMachineOutput +GetVocabularyFilterRequest +GetVocabularyFilterResponse +GetVocabularyRequest +GetVocabularyResponse +GetVoiceChannelRequest +GetVoiceChannelResponse +GetVoiceConnectorEmergencyCallingConfigurationRequest +GetVoiceConnectorEmergencyCallingConfigurationResponse +GetVoiceConnectorGroupRequest +GetVoiceConnectorGroupResponse +GetVoiceConnectorLoggingConfigurationRequest +GetVoiceConnectorLoggingConfigurationResponse +GetVoiceConnectorOriginationRequest +GetVoiceConnectorOriginationResponse +GetVoiceConnectorProxyRequest +GetVoiceConnectorProxyResponse +GetVoiceConnectorRequest +GetVoiceConnectorResponse +GetVoiceConnectorStreamingConfigurationRequest +GetVoiceConnectorStreamingConfigurationResponse +GetVoiceConnectorTerminationHealthRequest +GetVoiceConnectorTerminationHealthResponse +GetVoiceConnectorTerminationRequest +GetVoiceConnectorTerminationResponse +GetVoiceProfileDomainRequest +GetVoiceProfileDomainResponse +GetVoiceProfileRequest +GetVoiceProfileResponse +GetVoiceTemplateRequest +GetVoiceTemplateResponse +GetVoiceToneAnalysisTaskRequest +GetVoiceToneAnalysisTaskResponse +GetVpcAttachmentRequest +GetVpcAttachmentResponse +GetVpcLinkRequest +GetVpcLinkResponse +GetVpcLinksRequest +GetVpcLinksResponse +GetVpnConnectionDeviceSampleConfigurationRequest +GetVpnConnectionDeviceSampleConfigurationResult +GetVpnConnectionDeviceTypesRequest +GetVpnConnectionDeviceTypesResult +GetVpnTunnelReplacementStatusRequest +GetVpnTunnelReplacementStatusResult +GetWebACLForResourceRequest +GetWebACLForResourceResponse +GetWebACLRequest +GetWebACLResponse +GetWebhookRequest +GetWebhookResult +GetWirelessDeviceImportTaskRequest +GetWirelessDeviceImportTaskResponse +GetWirelessDeviceRequest +GetWirelessDeviceResponse +GetWirelessDeviceStatisticsRequest +GetWirelessDeviceStatisticsResponse +GetWirelessGatewayCertificateRequest +GetWirelessGatewayCertificateResponse +GetWirelessGatewayFirmwareInformationRequest +GetWirelessGatewayFirmwareInformationResponse +GetWirelessGatewayRequest +GetWirelessGatewayResponse +GetWirelessGatewayStatisticsRequest +GetWirelessGatewayStatisticsResponse +GetWirelessGatewayTaskDefinitionRequest +GetWirelessGatewayTaskDefinitionResponse +GetWirelessGatewayTaskRequest +GetWirelessGatewayTaskResponse +GetWorkGroupInput +GetWorkGroupOutput +GetWorkUnitResultsRequest +GetWorkUnitResultsResponse +GetWorkUnitsRequest +GetWorkUnitsResponse +GetWorkerFleetRequest +GetWorkerFleetResponse +GetWorkerRequest +GetWorkerResponse +GetWorkflowExecutionHistoryInput +GetWorkflowExecutionRequest +GetWorkflowExecutionResponse +GetWorkflowRequest +GetWorkflowResponse +GetWorkflowRunPropertiesRequest +GetWorkflowRunPropertiesResponse +GetWorkflowRunRequest +GetWorkflowRunResponse +GetWorkflowRunsRequest +GetWorkflowRunsResponse +GetWorkflowStepExecutionRequest +GetWorkflowStepExecutionResponse +GetWorkflowStepGroupRequest +GetWorkflowStepGroupResponse +GetWorkflowStepRequest +GetWorkflowStepResponse +GetWorkflowStepsRequest +GetWorkflowStepsResponse +GetWorkgroupRequest +GetWorkgroupResponse +GetWorkingLocationRequest +GetWorkingLocationResponse +GetWorkloadInput +GetWorkloadOutput +GetWorkspaceRequest +GetWorkspaceResponse +GetWorldTemplateBodyRequest +GetWorldTemplateBodyResponse +GetXssMatchSetRequest +GetXssMatchSetResponse +Gid +GitCloneDepth +GitConfig +GitConfigForUpdate +GitHubAccountTokenDoesNotExistException +GitHubAccountTokenNameRequiredException +GitHubCodeDestination +GitHubCommitConfigurationFieldMappings +GitHubConfiguration +GitHubDocumentCrawlProperties +GitHubEnterpriseServer +GitHubIssueAttachmentConfigurationFieldMappings +GitHubIssueCommentConfigurationFieldMappings +GitHubIssueDocumentConfigurationFieldMappings +GitHubLocation +GitHubPullRequestCommentConfigurationFieldMappings +GitHubPullRequestDocumentAttachmentConfigurationFieldMappings +GitHubPullRequestDocumentConfigurationFieldMappings +GitHubRepositoryConfigurationFieldMappings +GitSubmodulesConfig +GivenName +GlacierJobDescription +GlacierJobParameters +GlacierJobTier +Global +GlobalCluster +GlobalClusterAlreadyExistsFault +GlobalClusterArn +GlobalClusterIdentifier +GlobalClusterMember +GlobalClusterMembers +GlobalClusterNotFoundFault +GlobalClusterQuotaExceededFault +GlobalClusterResourceId +GlobalClusters +GlobalClustersMessage +GlobalConfiguration +GlobalEndpointTokenVersion +GlobalFilters +GlobalIdentity +GlobalNetwork +GlobalNetworkArn +GlobalNetworkId +GlobalNetworkIds +GlobalNetworks +GlobalNodeGroup +GlobalNodeGroupId +GlobalNodeGroups +GlobalNodeGroupsToRemove +GlobalNodeGroupsToRetain +GlobalQuota +GlobalReplicationGroup +GlobalReplicationGroupAlreadyExistsFault +GlobalReplicationGroupDescription +GlobalReplicationGroupId +GlobalReplicationGroupIdSuffix +GlobalReplicationGroupInfo +GlobalReplicationGroupMember +GlobalReplicationGroupMemberRole +GlobalReplicationGroupNotFoundFault +GlobalReplicationGroups +GlobalSecondaryIndex +GlobalSecondaryIndexAutoScalingUpdate +GlobalSecondaryIndexDescription +GlobalSecondaryIndexInfo +GlobalSecondaryIndexOverride +GlobalSecondaryIndexUpdate +GlobalSecondaryIndexUpdates +GlobalSecondaryIndexes +GlobalSettings +GlobalSignOutRequest +GlobalTable +GlobalTableAlreadyExistsException +GlobalTableArn +GlobalTableBillingMode +GlobalTableBorderOptions +GlobalTableDescription +GlobalTableGlobalSecondaryIndexSettingsUpdate +GlobalTableName +GlobalTableNotFoundException +GlobalTableProvisionedWriteCapacityAutoScalingSettingsUpdate +GlobalTableProvisionedWriteCapacityUnits +GlobalTableStatus +GlobalTableVersion +GlobalTables +GlobalTimeout +GlobalWriteForwardingRequested +GlobalWriteForwardingStatus +GlueCatalogGeneration +GlueConfiguration +GlueConnectionName +GlueDataCatalogConfig +GlueDataCatalogConfiguration +GlueDataCatalogConfigurationDescription +GlueDataCatalogConfigurationUpdate +GlueEncryptionException +GlueIps +GluePolicy +GlueSchema +GlueStudioSchemaColumn +GlueTable +GlueTableReference +GlueVersion +Gnss +GoneException +Google +GoogleAnalytics +GoogleAnalyticsConnectorProfileCredentials +GoogleAnalyticsMetadata +GoogleAnalyticsSourceProperties +GoogleDriveConfiguration +GopBReference +GopClosedCadence +GopNumBFrames +GopSize +GopSizeUnits +GovCloudAccountId +GovernedCatalogSource +GovernedCatalogTarget +Gpu +GpuDeviceInfo +GpuDeviceMemoryInfo +GpuInfo +Gpus +Gradient +GradientColor +GradientOffset +GradientStop +GrammarSlotTypeSetting +GrammarSlotTypeSource +Grant +GrantAccessRequest +GrantAccessResult +GrantArn +GrantArns +GrantConstraints +GrantEntitlementRequest +GrantFlowEntitlements420Exception +GrantFlowEntitlementsRequest +GrantFlowEntitlementsResponse +GrantFullControl +GrantId +GrantLinkPermissions +GrantListEntry +GrantName +GrantPermissions +GrantPermissionsRequest +GrantPoweruserPrivileges +GrantRead +GrantReadACP +GrantStatus +GrantTime +GrantToken +GrantTokens +GrantWrite +GrantWriteACP +GrantedLicense +GrantedOperations +Grantee +GranteeId +GranteePrincipal +GranteePrincipalArn +GranteeType +Grantor +Grants +Granularities +Granularity +Graph +GraphArn +GraphArns +GraphList +GraphQLRenderConfig +GraphQLSchemaException +GraphqlApi +GreKey +GreaterThan +GreaterThanOrEqual +GreaterThanOrEquals +Green +GreenFleetProvisioningOption +GreenPrimaryX +GreenPrimaryY +Greengrass +GreengrassConfiguration +GreengrassOutputDetails +GreengrassV2 +GremlinQueryStatus +GremlinQueryStatusAttributes +Grid +GridLayout +GridLayoutCanvasSizeOptions +GridLayoutConfiguration +GridLayoutElement +GridLayoutScreenCanvasSizeOptions +GridLineVisibility +GridViewConfiguration +GrokClassifier +GrokPattern +GroundStationData +GroundTruth +GroundTruthManifest +GroundTruthS3Input +Group +GroupARN +GroupArn +GroupAttributeField +GroupBy +GroupByAttribute +GroupByAttributeValue +GroupByKey +GroupCertificateAuthorities +GroupCertificateAuthorityArn +GroupCertificateAuthorityId +GroupCertificateAuthorityProperties +GroupConfiguration +GroupConfigurationItem +GroupConfigurationParameter +GroupCount +GroupDefinition +GroupDefinitions +GroupDesc +GroupDetail +GroupDetailList +GroupDisplayName +GroupExistsException +GroupFiles +GroupFilter +GroupId +GroupIdentifier +GroupIdentifiers +GroupIdentity +GroupIds +GroupInformation +GroupIpAddress +GroupLabelOptions +GroupLifecycleEventsDesiredStatus +GroupLifecycleEventsStatus +GroupLifecycleEventsStatusMessage +GroupList +GroupMember +GroupMemberList +GroupMembers +GroupMembership +GroupMembershipExistenceResult +GroupMemberships +GroupMetadata +GroupName +GroupNameAndArn +GroupNameColumn +GroupNamePrefix +GroupNames +GroupOrderingIdSummaries +GroupOrderingIdSummary +GroupOwner +GroupOwnerId +GroupOwnerSetting +GroupPermission +GroupPolicyList +GroupProperties +GroupQuery +GroupResourcesInput +GroupResourcesOutput +GroupResult +GroupScore +GroupSearchFilter +GroupSecurityIdentifier +GroupSize +GroupSource +GroupSummary +GroupType +GroupVersion +GroupVersionId +GroupedBys +GroupedResourceCount +GroupedResourceCounts +GroupingAttributeNames +GroupingSeparator +GroupingType +Groupings +Groups +GroupsSummaries +GrowthFactor +GrowthRate +GrowthRateComputation +GrowthType +GrpcCode +GrpcGatewayRoute +GrpcGatewayRouteAction +GrpcGatewayRouteMatch +GrpcGatewayRouteMetadata +GrpcGatewayRouteRewrite +GrpcRetryPolicy +GrpcRoute +GrpcRouteAction +GrpcRouteMatch +GrpcRouteMetadata +GrpcTimeout +Gsm +GsmLocalId +GsmNmr +GsmNmrObj +GsmObj +GsmTimingAdvance +Gt +Gte +GuardDutyFindingId +GuardianAttributes +GuardianOptions +GuessMIMETypeEnabled +GuestRoleArn +Guidance +Gutter +GutterSpacing +GutterStyle +GutterVisibility +H264ColorSpaceSettings +H264FilterSettings +H264QvbrSettings +H264Settings +H265ColorSpaceSettings +H265FilterSettings +H265PackagingType +H265QvbrSettings +H265Settings +HECAcknowledgmentTimeoutInSeconds +HECEndpoint +HECEndpointType +HECToken +HIT +HITGroupId +HITId +HITLayoutId +HITLayoutParameter +HITLayoutParameters +HITReviewPolicy +HITReviewReport +HITReviewStatus +HITStatus +HITTypeId +HITs +HLSFragmentSelector +HLSStreamingSessionURL +HLSTimestampRange +HPOConfig +HPOObjective +HPOResourceConfig +HTTPCode4XXCount +HTTPCode5XXCount +HTTPHeader +HTTPMethod +HTTPPort +HTTPRequest +HTTPSPort +HTTPVersion +HadoopJarStep +HadoopJarStepConfig +HadoopStepConfig +HadoopVersion +HammingLoss +HandOffTime +Handler +HandlerFailureException +HandlerInternalFailureException +Handshake +HandshakeAlreadyInStateException +HandshakeConstraintViolationException +HandshakeFilter +HandshakeId +HandshakeNotFoundException +HandshakeParty +HandshakeResource +Handshakes +HapgArn +HapgList +HapgSerial +HardExpiry +HardLimit +HarvestJob +HarvestJobs +HasAdditionalSubjectAlternativeNames +HasAssociatedService +HasCredential +HasCustomEventSelectors +HasDefaultPath +HasError +HasErrors +HasFault +HasFcmServiceCredentials +HasInsightSelectors +HasMoreApplications +HasMoreDeliveryStreams +HasMoreDestinations +HasMoreShards +HasMoreStreams +HasMoreTags +HasResultSet +HasThrottle +HasTokenKey +Hash +HashAlgorithm +HashAlgorithmOptions +HashKeyRange +HashType +HbbtvCompliance +HdDeviceSettings +HdbVersion +HdfsNameNode +Hdr10Metadata +Hdr10Plus +Hdr10Settings +HdrToSdrToneMapper +HeadBucketRequest +HeadObjectOutput +HeadObjectRequest +Header +HeaderBehavior +HeaderConfig +HeaderFooterSectionConfiguration +HeaderList +HeaderMatch +HeaderMatchPattern +HeaderName +HeaderObject +HeaderOrder +HeaderParameters +HeaderRow +HeaderSections +HeaderStyle +HeaderValue +HeaderValues +Headers +HeadersConfig +HeadersInBounceNotificationsEnabled +HeadersInComplaintNotificationsEnabled +HeadersInDeliveryNotificationsEnabled +HeadersToInclude +Health +HealthCheck +HealthCheckAlreadyExists +HealthCheckArn +HealthCheckConfig +HealthCheckConfiguration +HealthCheckCount +HealthCheckCustomConfig +HealthCheckEnabled +HealthCheckGracePeriod +HealthCheckGracePeriodSeconds +HealthCheckId +HealthCheckIds +HealthCheckInUse +HealthCheckIntervalSeconds +HealthCheckObservation +HealthCheckObservations +HealthCheckPath +HealthCheckPolicy +HealthCheckPort +HealthCheckProtocol +HealthCheckTimeoutSeconds +HealthCheckType +HealthCheckVersion +HealthCheckVersionMismatch +HealthChecks +HealthEvent +HealthEventArn +HealthEventDescription +HealthEventTypeCategory +HealthEventTypeCode +HealthEvents +HealthEventsConfig +HealthReason +HealthScoreThreshold +HealthService +HealthState +HealthStatus +HealthThreshold +HealthUnavailableException +HealthUrl +HealthyThreshold +HealthyThresholdCount +HeartbeatEnable +HeartbeatEvent +HeartbeatFrequency +HeartbeatSchema +HeartbeatTimeout +HeatMapAggregatedFieldWells +HeatMapColumnItemsLimitConfiguration +HeatMapColumnSort +HeatMapConfiguration +HeatMapFieldWells +HeatMapRowItemsLimitConfiguration +HeatMapRowSort +HeatMapSortConfiguration +HeatMapVisual +HeatmapColor +HeatmapConfiguration +Height +HeightInPx +HeightPixels +HeightTrim +HelpfulResource +HelpfulResourceDisplayText +HelpfulResourceUrl +Heterogeneous +HexCode +HexFontColor +Hibernate +HibernationOptions +HibernationOptionsRequest +HibernationSupported +HiddenColumns +HiddenFromGlobalAddressList +HideDisabled +HidePassword +HierarchicalAccessControlList +HierarchicalPrincipal +HierarchyGroup +HierarchyGroupArn +HierarchyGroupCondition +HierarchyGroupId +HierarchyGroupMatchType +HierarchyGroupSummary +HierarchyGroupSummaryReference +HierarchyId +HierarchyLevel +HierarchyLevelLimitExceededException +HierarchyLevelUpdate +HierarchyPath +HierarchyPathReference +HierarchyStructure +HierarchyStructureUpdate +HierarchyTypeMismatchException +High +HighAction +HighAvailabilityConfig +HighCount +HighestSeverityThreatDetails +Highlight +HighlightColor +HighlightEnabled +Highlighted +Highlights +HistogramAggregatedFieldWells +HistogramBinOptions +HistogramConfiguration +HistogramEntry +HistogramFieldWells +HistogramVisual +HistoricalDataPathList +HistoricalMetric +HistoricalMetricData +HistoricalMetricResult +HistoricalMetrics +HistoricalOptions +History +HistoryData +HistoryEvent +HistoryEventExecutionDataDetails +HistoryItemType +HistoryRecord +HistoryRecordEntry +HistoryRecords +HistorySummary +Hit +Hits +Hive +HiveCompatiblePartitions +HiveJsonSerDe +HlsAdditionalManifest +HlsAkamaiSettings +HlsBasicPutSettings +HlsCaptionLanguageMapping +HlsCdnSettings +HlsConfiguration +HlsContentProtection +HlsEncryption +HlsEncryptionSettings +HlsGroupSettings +HlsId3SegmentTagging +HlsId3SegmentTaggingScheduleActionSettings +HlsId3SegmentTaggingSettings +HlsImageBasedTrickPlaySettings +HlsIngest +HlsInputSettings +HlsManifest +HlsManifestCreateOrUpdateParameters +HlsManifests +HlsMediaStoreSettings +HlsOutputSettings +HlsPackage +HlsPlaylistSettings +HlsRenditionGroupSettings +HlsS3Settings +HlsSettings +HlsSignaledSystemIds +HlsTimedMetadataScheduleActionSettings +HlsTimedMetadataSettings +HlsWebdavSettings +Holdout +HoldoutActivity +HoldoutPercent +HolidayConfig +HolidayConfigAttributes +HomeDirectory +HomeDirectoryMapEntry +HomeDirectoryMappings +HomeDirectoryType +HomeEfsFileSystem +HomeEfsFileSystemId +HomeEfsFileSystemKmsKeyId +HomeEfsFileSystemUid +HomePageUrl +HomePhoneNumber +HomeRegion +HomeRegionControl +HomeRegionControls +HomeRegionNotSetException +HomeRegions +Homogeneous +Honeycode +HoneycodeConnectorProfileCredentials +HoneycodeDestinationProperties +HoneycodeMetadata +HonorCooldown +HonorificPrefix +HonorificSuffix +Hook +HookConfiguration +HookFailureMode +HookInvocationCount +HookInvocationPoint +HookParameters +HookStatus +HookStatusReason +HookType +Hooks +HopDestination +HopDestinations +Horizontal +HorizontalAccuracy +HorizontalAlign +HorizontalLayoutConfiguration +HorizontalOffset +HorizontalPosition +HorizontalTextAlignment +Horovod +Host +HostAddress +HostArn +HostArnFilter +HostEntry +HostEnvironment +HostEnvironmentId +HostHeaderConditionConfig +HostHeaderConfig +HostId +HostIdFilter +HostIdSet +HostIds +HostInstance +HostInstanceType +HostIp +HostKey +HostKeyAttributes +HostKeyBody +HostKeyFingerprint +HostKeyId +HostKeys +HostMaintenance +HostName +HostNetwork +HostOffering +HostPath +HostPort +HostProperties +HostRecovery +HostReservation +HostReservationId +HostReservationIdSet +HostReservationSet +HostResourceGroupArn +HostRole +HostUrl +HostVPCId +HostVolumeProperties +HostedConfigurationVersion +HostedConfigurationVersionSummary +HostedConfigurationVersions +HostedZone +HostedZoneAlreadyExists +HostedZoneArn +HostedZoneConfig +HostedZoneCount +HostedZoneId +HostedZoneIdMarker +HostedZoneLimit +HostedZoneNotEmpty +HostedZoneNotFound +HostedZoneNotPrivate +HostedZoneOwner +HostedZonePartiallyDelegated +HostedZoneSummaries +HostedZoneSummary +HostedZones +Hostname +HostnameTheme +HostnameType +Hosts +Hour +HourOfDay +HourlyCommitmentToPurchase +HourlyOnDemandRate +HourlyPrice +Hours +HoursOfOperation +HoursOfOperationArn +HoursOfOperationConfig +HoursOfOperationId +HoursOfOperationSearchCriteria +HoursOfOperationSearchFilter +HoursOfOperationSummary +HoursOfOperationSummaryList +HoursOfOperationTimeSlice +HoursOfOperations +HrAllowed +HrdBufferFinalFillPercentage +HrdBufferInitialFillPercentage +HrdBufferSize +Href +Hsm +HsmArn +HsmCertificate +HsmClientCertificate +HsmClientCertificateAlreadyExistsFault +HsmClientCertificateIdentifier +HsmClientCertificateMessage +HsmClientCertificateNotFoundFault +HsmClientCertificatePublicKey +HsmClientCertificateQuotaExceededFault +HsmClientCertificates +HsmConfiguration +HsmConfigurationAlreadyExistsFault +HsmConfigurationIdentifier +HsmConfigurationMessage +HsmConfigurationNotFoundFault +HsmConfigurationQuotaExceededFault +HsmConfigurations +HsmId +HsmIpAddress +HsmList +HsmPartitionName +HsmPartitionPassword +HsmSerialNumber +HsmServerPublicCertificate +HsmStatus +HsmType +Hsms +HsmsLastActionFailed +HsmsPendingDeletion +HsmsPendingRegistration +HsrOperationMode +HsrReplicationMode +HsrTier +Html +HtmlBody +HtmlMotionGraphicsSettings +HtmlPart +Http +HttpAction +HttpActionHeader +HttpAuthorization +HttpCode +HttpConfiguration +HttpContext +HttpDataSourceConfig +HttpEndpoint +HttpEndpointBufferingHints +HttpEndpointCommonAttribute +HttpEndpointConfiguration +HttpEndpointDescription +HttpEndpointDestinationConfiguration +HttpEndpointDestinationDescription +HttpEndpointDestinationUpdate +HttpEndpointEnabled +HttpEndpointRequestConfiguration +HttpEndpointRetryOptions +HttpErrorCodeReturnedEquals +HttpExpiresDate +HttpFailureFeedbackRoleArn +HttpGatewayRoute +HttpGatewayRouteAction +HttpGatewayRouteHeader +HttpGatewayRouteMatch +HttpGatewayRoutePathRewrite +HttpGatewayRoutePrefixRewrite +HttpGatewayRouteRewrite +HttpHeader +HttpHeaderConditionConfig +HttpHeaderConfig +HttpHeaderName +HttpHeaders +HttpInputs +HttpInstanceSummary +HttpMatch +HttpMethod +HttpName +HttpNamespaceChange +HttpPackageConfiguration +HttpPackageConfigurations +HttpParameters +HttpPathMatch +HttpPort +HttpProperties +HttpProtocolIpv6 +HttpPutResponseHopLimit +HttpQueryParameter +HttpRedirectCode +HttpRequestMethodConditionConfig +HttpRequestMethodConfig +HttpRetryPolicy +HttpRoute +HttpRouteAction +HttpRouteHeader +HttpRouteMatch +HttpStatus +HttpSuccessFeedbackRoleArn +HttpTimeout +HttpTokens +HttpTransferMode +HttpURL +HttpUrlDestinationConfiguration +HttpUrlDestinationProperties +HttpUrlDestinationSummary +HttpVersion +HttpsInputs +HttpsNotificationConfiguration +HttpsPort +HubArn +HubContentArn +HubContentDependencies +HubContentDependency +HubContentDescription +HubContentDisplayName +HubContentDocument +HubContentInfo +HubContentMarkdown +HubContentName +HubContentSearchKeywords +HubContentStatus +HubContentSummaries +HubContentType +HubContentVersion +HubDescription +HubDeviceArn +HubDisplayName +HubInfo +HubName +HubS3StorageConfig +HubSearchKeywords +HubStatus +HubSummaries +HudiTarget +HudiTargets +Hue +HumanLabeled +HumanLoopActivationConditions +HumanLoopActivationConditionsConfig +HumanLoopActivationConditionsEvaluationResults +HumanLoopActivationConfig +HumanLoopActivationOutput +HumanLoopActivationReasons +HumanLoopArn +HumanLoopConfig +HumanLoopDataAttributes +HumanLoopInput +HumanLoopName +HumanLoopOutput +HumanLoopQuotaExceededException +HumanLoopRequestSource +HumanLoopStatus +HumanLoopSummaries +HumanLoopSummary +HumanTaskConfig +HumanTaskUiArn +HumanTaskUiName +HumanTaskUiStatus +HumanTaskUiSummaries +HumanTaskUiSummary +HwAddress +HybridAccessEnabled +HybridJobQueueInfo +HyperParameterAlgorithmSpecification +HyperParameterRanges +HyperParameterSpecification +HyperParameterTrainingJobDefinition +HyperParameterTrainingJobSummary +HyperParameterTuningEndTime +HyperParameterTuningInstanceConfig +HyperParameterTuningJob +HyperParameterTuningJobArn +HyperParameterTuningJobCompletionDetails +HyperParameterTuningJobConfig +HyperParameterTuningJobConsumedResources +HyperParameterTuningJobName +HyperParameterTuningJobObjective +HyperParameterTuningJobSearchEntity +HyperParameterTuningJobStatus +HyperParameterTuningJobStrategyConfig +HyperParameterTuningJobSummaries +HyperParameterTuningJobSummary +HyperParameterTuningJobWarmStartConfig +HyperParameterTuningResourceConfig +HyperParameters +HyperbandStrategyConfig +Hypervisor +HypervisorArn +HypervisorDetails +HypervisorId +Hypervisors +IAMAuth +IAMCertificateId +IAMDatabaseAuthenticationEnabled +IAMIdentityCenterInstanceArn +IAMPolicyAssignment +IAMPolicyAssignmentSummary +IAMPolicyAssignments +IAMRoleARN +IAMRoleIdentity +IAMRoleName +IAMUser +IAMUserIdentity +IBMDb2Settings +ICD10CMAttribute +ICD10CMConcept +ICD10CMConcepts +ICD10CMEntity +ICD10CMTrait +ICPRecordalStatus +ID +IDLE +IDPCommunicationErrorException +IDPRejectedClaimException +IFrameOnlyManifest +IFrameOnlyPlaylists +IKEVersions +IKEVersionsListValue +IKEVersionsRequestListValue +IND +INDTaxDocuments +IOOptimizedNextAllowedModificationTime +IOPS +IOS +IOUsage +IOWait +IP +IPAddress +IPAddressBasedRemoteInfo +IPAddressType +IPAddressVersion +IPDialIn +IPRange +IPRanges +IPSet +IPSetDescriptor +IPSetDescriptors +IPSetForwardedIPConfig +IPSetId +IPSetMetadata +IPSetReference +IPSetReferenceStatement +IPSetReferences +IPSetSummary +IPSetUpdate +IPSets +IPV4Range +IPV6Range +IPv6Address +IRQ +Iam +IamActionDefinition +IamArn +IamArnRequiredException +IamAuthEnabled +IamCertificateId +IamDatabaseAuthenticationEnabled +IamFleetRole +IamIdentity +IamInstanceProfile +IamInstanceProfileArn +IamInstanceProfileAssociation +IamInstanceProfileAssociations +IamInstanceProfileSpecification +IamRegistrationResponse +IamResources +IamRole +IamRoleArn +IamRoleConfiguration +IamRoleId +IamRoleMissingPermissionsFault +IamRoleName +IamRoleNotFoundFault +IamRoles +IamSessionArnAlreadyRegisteredException +IamUser +IamUserAccessToBilling +IamUserArn +IamUserArnAlreadyRegisteredException +IamUserArnRequiredException +IamUserArns +IanaProtocolNumber +IatTtL +Ibm3624NaturalPin +Ibm3624PinFromOffset +Ibm3624PinOffset +Ibm3624PinVerification +Ibm3624RandomPin +IceServer +IceServerList +IcebergInput +IcebergTarget +IcebergTargets +IcmpTypeCode +Icon +IconDisplayOption +IconOptions +IconReference +IconS3Location +IconSet +IconSetType +IconURL +IconUrl +Id +Id3 +Id3Insertion +Id3Insertions +IdAttributeName +IdFormat +IdToken +IdTokenValidity +Ide +IdeConfiguration +IdempotencyException +IdempotencyParameterMismatchException +IdempotencyToken +IdempotentParameterMismatch +IdempotentParameterMismatchException +IdentificationExpirationDate +IdentificationHints +IdentificationIssuingOrg +IdentificationNumber +IdentifiedLanguageScore +IdentifiedUserName +Identifier +IdentifierPath +IdentifierType +Identifiers +IdentifyLanguage +IdentifyMultipleLanguages +Identities +Identity +IdentityAttributeName +IdentityAttributeOrder +IdentityAttributeValues +IdentityDescription +IdentityDkimAttributes +IdentityDocument +IdentityDocumentField +IdentityDocumentFields +IdentityDocuments +IdentityId +IdentityIdsToDelete +IdentityInfo +IdentityMailFromDomainAttributes +IdentityManagementType +IdentityName +IdentityNotificationAttributes +IdentityPool +IdentityPoolConfigs +IdentityPoolId +IdentityPoolName +IdentityPoolShortDescription +IdentityPoolTags +IdentityPoolUsage +IdentityPoolUsages +IdentityPools +IdentityProvider +IdentityProviderConfig +IdentityProviderConfigResponse +IdentityProviderConfiguration +IdentityProviderDetails +IdentityProviderName +IdentityProviderOAuthSetting +IdentityProviderOAuthSettings +IdentityProviderSamlMetadata +IdentityProviderSummaries +IdentityProviderSummary +IdentityProviderType +IdentityResolutionJob +IdentityResolutionJobsList +IdentitySource +IdentitySourceDetails +IdentitySourceFilter +IdentitySourceItem +IdentitySourceItemDetails +IdentityStore +IdentityStoreId +IdentityType +IdentityTypeNotSupportedException +IdentityUsage +IdentityValidationExpression +IdentityVerificationAttributes +Idle +IdleClientTimeout +IdleDisconnectTimeoutInSeconds +IdleSinceDateTime +IdleTTL +IdleTimeBetweenReadsInMs +IdleTimeout +IdleTimeoutSeconds +IdnLangCode +Idp +IdpAuthUrl +IdpIdentifier +IdpIdentifiers +IdpLambdaArn +IdpRelayStateParameterName +Ids +IfMatch +IfModifiedSince +IfNoneMatch +IfUnmodifiedSince +Igmpv2Support +IgnoreCoordinates +IgnoreErrors +IgnoreHeaderRows +IgnoreMetricsTime +IgnorePollAlarmFailure +IgnorePublicAcls +IgnoreUnsupportedType +IkeVersions +IllegalActionException +IllegalArgumentException +IllegalBlueprintStateException +IllegalDelete +IllegalFieldLevelEncryptionConfigAssociationWithCacheBehavior +IllegalOriginAccessConfiguration +IllegalSessionStateException +IllegalStatusException +IllegalUpdate +IllegalUserStateException +IllegalWorkflowStateException +Image +ImageAggregation +ImageAlreadyExistsException +ImageArn +ImageAssets +ImageAttribute +ImageBasedTrickPlay +ImageBasedTrickPlaySettings +ImageBlockPublicAccessState +ImageBuilder +ImageBuilderErrors +ImageBuilderName +ImageBuilderStateChangeReason +ImageBuilderSupported +ImageBuilders +ImageClassificationJobConfig +ImageConfig +ImageConfigError +ImageConfigResponse +ImageConfiguration +ImageConfigurationInput +ImageContent +ImageData +ImageDescription +ImageDetail +ImageDigest +ImageDigestDoesNotMatchException +ImageDiskContainer +ImageErrors +ImageFailure +ImageFile +ImageFrameInformation +ImageGenerationConfiguration +ImageGenerationDestinationConfig +ImageIconUrl +ImageId +ImageIdentifier +ImageIds +ImageInserter +ImageInserterInput +ImageLayerAggregation +ImageLayerAggregationResponse +ImageLocation +ImageMask +ImageName +ImageNotFoundException +ImageOwnerAlias +ImagePackage +ImagePermission +ImagePermissions +ImagePipeline +ImagePipelineAggregation +ImagePrefix +ImageProperties +ImagePublishedAt +ImagePullCredentialsType +ImageQuality +ImageRecipe +ImageRecipeSummary +ImageRecycleBinInfo +ImageReplicationStatus +ImageRepository +ImageRepositoryType +ImageResponseCard +ImageScaling +ImageScanFinding +ImageScanFindingAggregation +ImageScanFindings +ImageScanFindingsFilter +ImageScanFindingsSummary +ImageScanState +ImageScanStatus +ImageScanStatuses +ImageScanningConfiguration +ImageSelectorType +ImageSetProperties +ImageSetWorkflowStatus +ImageSetsMetadataSummary +ImageSmallIconUrl +ImageSource +ImageSourceBands +ImageState +ImageStateChangeReason +ImageStats +ImageStatus +ImageSummary +ImageTagAlreadyExistsException +ImageTagDetail +ImageTagMutability +ImageTags +ImageTestsConfiguration +ImageTooLargeException +ImageType +ImageUri +ImageUrl +ImageVersion +ImageVersionArn +ImageVersionNumber +ImageVersionStatus +ImageVersions +ImageX +ImageY +Images +ImdsSupport +ImmediateModeScheduleActionStartSettings +ImmunityTime +ImmunityTimeProperty +Impact +ImpactEndTime +ImpactLevel +ImpactStartTime +ImpactType +ImpactedLocation +ImpactedLocations +ImpairedSince +ImpersonationMatchedRule +ImpersonationRole +ImpersonationRoleId +ImpersonationRoleIds +ImpersonationRule +ImpersonationRuleId +ImplicitDeny +ImportApiKeysRequest +ImportApiRequest +ImportApiResponse +ImportAppCatalogRequest +ImportApplicationUsageRequest +ImportApplicationUsageResult +ImportArn +ImportAsProvisionedProductInput +ImportAsProvisionedProductOutput +ImportAssetFromApiGatewayApi +ImportAssetFromApiGatewayApiRequestDetails +ImportAssetFromApiGatewayApiResponseDetails +ImportAssetFromSignedUrl +ImportAssetFromSignedUrlJobErrorDetails +ImportAssetFromSignedUrlRequestDetails +ImportAssetFromSignedUrlResponseDetails +ImportAssetsFromLakeFormationTagPolicy +ImportAssetsFromLakeFormationTagPolicyRequestDetails +ImportAssetsFromLakeFormationTagPolicyResponseDetails +ImportAssetsFromRedshiftDataShares +ImportAssetsFromRedshiftDataSharesRequestDetails +ImportAssetsFromRedshiftDataSharesResponseDetails +ImportAssetsFromS3 +ImportAssetsFromS3JobErrorDetails +ImportAssetsFromS3RequestDetails +ImportAssetsFromS3ResponseDetails +ImportBackendAuthRequest +ImportBackendAuthResponse +ImportBackendStorageRequest +ImportBackendStorageResponse +ImportCatalogToGlueRequest +ImportCertificateAuthorityCertificateRequest +ImportCertificateMessage +ImportCertificateRequest +ImportCertificateResponse +ImportClientBrandingRequest +ImportClientBrandingResult +ImportClientVpnClientCertificateRevocationListRequest +ImportClientVpnClientCertificateRevocationListResult +ImportCompleted +ImportComponentRequest +ImportComponentResponse +ImportConflictException +ImportCrlRequest +ImportDataSource +ImportDataSourceConfig +ImportDatasetRequest +ImportDatasetResponse +ImportDecoderManifestRequest +ImportDecoderManifestResponse +ImportDefinition +ImportDestination +ImportDestinationType +ImportDocumentationPartsRequest +ImportErrorData +ImportFailureListItem +ImportFileTaskInformation +ImportFilter +ImportFindingsError +ImportFirewallDomainsRequest +ImportFirewallDomainsResponse +ImportGameConfigurationRequest +ImportGameConfigurationResult +ImportGameConfigurationSource +ImportHostKeyRequest +ImportHostKeyResponse +ImportHubContentRequest +ImportHubContentResponse +ImportHypervisorConfigurationInput +ImportHypervisorConfigurationOutput +ImportId +ImportImageLicenseConfigurationRequest +ImportImageLicenseConfigurationResponse +ImportImageRequest +ImportImageResult +ImportImageTask +ImportImageTasks +ImportInfo +ImportInstance +ImportInstanceLaunchSpecification +ImportInstanceRequest +ImportInstanceResult +ImportInstanceTaskDetails +ImportInstanceVolumeDetailItem +ImportJobEndTime +ImportJobProperties +ImportJobPropertiesList +ImportJobRequest +ImportJobResource +ImportJobResponse +ImportJobStartTime +ImportJobSubmitter +ImportJobSummary +ImportJobs +ImportJobsResponse +ImportKeyInput +ImportKeyMaterialRequest +ImportKeyOutput +ImportKeyPairRequest +ImportKeyPairResult +ImportLabelsTaskRunProperties +ImportLensInput +ImportLensOutput +ImportManifestUrl +ImportMigrationTaskRequest +ImportMode +ImportModelRequest +ImportModelResponse +ImportModelVersionRequest +ImportModelVersionResponse +ImportNotFoundException +ImportNotebookInput +ImportNotebookOutput +ImportOptions +ImportPath +ImportPlaybackKeyPairRequest +ImportPlaybackKeyPairResponse +ImportReadSetFilter +ImportReadSetJobItem +ImportReadSetSourceItem +ImportReferenceFilter +ImportReferenceJobItem +ImportReferenceSourceItem +ImportResourceSpecification +ImportResourcesToDraftAppVersionRequest +ImportResourcesToDraftAppVersionResponse +ImportRestApiRequest +ImportSignalCatalogRequest +ImportSignalCatalogResponse +ImportSnapshotRequest +ImportSnapshotResult +ImportSnapshotTask +ImportSnapshotTasks +ImportSortBy +ImportSource +ImportSourceCredentialsInput +ImportSourceCredentialsOutput +ImportSshPublicKeyRequest +ImportSshPublicKeyResponse +ImportStacksToStackSetInput +ImportStacksToStackSetOutput +ImportStatistics +ImportStatus +ImportSummary +ImportSummaryList +ImportTableDescription +ImportTableInput +ImportTableOutput +ImportTablesCompleted +ImportTablesInProgress +ImportTablesNotStarted +ImportTask +ImportTaskError +ImportTaskFilter +ImportTaskId +ImportTaskIds +ImportTaskSummary +ImportTaskSummaryApplications +ImportTaskSummaryServers +ImportTaskSummaryWaves +ImportTerminologyRequest +ImportTerminologyResponse +ImportTime +ImportToken +ImportTr31KeyBlock +ImportTr34KeyBlock +ImportVmImageRequest +ImportVmImageResponse +ImportVolume +ImportVolumeRequest +ImportVolumeResult +ImportVolumeTaskDetails +ImportWorkspaceImageRequest +ImportWorkspaceImageResult +Importance +Imported +ImportedAt +ImportedBy +ImportedDataSize +ImportedDataSizeInBytes +ImportedFileChunkSize +ImportedItemCount +ImportedRecordCount +ImportedSidewalkDevice +ImportedUsers +ImportedWirelessDevice +ImportedWirelessDeviceList +Imports +ImportsListItem +ImprovementPlan +ImprovementPlanUrl +ImprovementPlans +ImprovementStatus +ImprovementSummaries +ImprovementSummary +ImputedPath +ImscDestinationSettings +InAppCampaignSchedule +InAppMessage +InAppMessageBodyConfig +InAppMessageButton +InAppMessageCampaign +InAppMessageCampaigns +InAppMessageContent +InAppMessageHeaderConfig +InAppMessagesResponse +InAppStreamNames +InAppTemplate +InAppTemplateRequest +InAppTemplateResponse +InCluster +InProgress +InProgressInvalidationBatches +InProgressStackInstancesCount +InProgressTableRestoreQuotaExceededFault +InSyncStackInstancesCount +InTransitEncryption +InUse +InUseBy +InaccessibleEncryptionDateTime +InaccessibleKmsKeyDateTime +InactiveDate +InactiveEventDataStoreException +InactiveQueryException +InboundCall +InboundCalling +InboundCallsEnabled +InboundConnection +InboundConnectionStatus +InboundCrossClusterSearchConnection +InboundCrossClusterSearchConnectionStatus +InboundHeader +InboundMMS +InboundPermissionAuthorizations +InboundPermissionRevocations +InboundPermissions +InboundSMS +InboundShipment +InboxCount +InboxPercentage +InboxPlacementTrackingOption +InboxRawCount +IncidentId +IncidentRecord +IncidentRecordSource +IncidentRecordSummary +IncidentTemplate +Include +IncludeAdditionalDetails +IncludeAdditionalLanguageCodes +IncludeAll +IncludeAllDependencies +IncludeAllInstances +IncludeAllLinksToEachParent +IncludeAllTagsOfInstance +IncludeAttachmentFilePatterns +IncludeBlueprint +IncludeBody +IncludeChannelId +IncludeChildPaths +IncludeComplianceDetails +IncludeControlDetails +IncludeCookies +IncludeCredit +IncludeCustomMetadata +IncludeDeleted +IncludeDeletedGroups +IncludeDeletedRecords +IncludeDeprecated +IncludeDiscount +IncludeDvbSubtitles +IncludeEdges +IncludeEncoderConfigurationInSegments +IncludeExecutionData +IncludeExtensions +IncludeFec +IncludeFillerNalUnits +IncludeFilterTypes +IncludeFilters +IncludeFutureRegions +IncludeGlobalServiceEvents +IncludeGraph +IncludeHeaders +IncludeHidden +IncludeIframeOnlyStream +IncludeIframeOnlyStreams +IncludeIndirectActivities +IncludeInferenceResponseIn +IncludeLegGeometry +IncludeLinkedAccounts +IncludeLinkedAccountsMetrics +IncludeManagementEvents +IncludeMap +IncludeMarketplace +IncludeMaximum +IncludeMetrics +IncludeMinimum +IncludeNestedStacks +IncludeNotScaledActivities +IncludeNullAndEmpty +IncludeNullValue +IncludeOnly +IncludeOpForFullLoad +IncludeOtherSubscription +IncludeParameterSpec +IncludePartitionValue +IncludePlannedDeletion +IncludeProvisioningArtifactParameters +IncludePublic +IncludePublicKey +IncludeQueriesWithoutUserInformation +IncludeQuerySpellCheckSuggestions +IncludeRecurring +IncludeRefund +IncludeRelated +IncludeReturnPath +IncludeShared +IncludeSharedResources +IncludeSpace +IncludeSpaces +IncludeStatus +IncludeSubdomains +IncludeSubscription +IncludeSupport +IncludeSymmetricAlgorithms +IncludeTableAlterOperations +IncludeTax +IncludeTransactionDetails +IncludeTrustContext +IncludeUpfront +IncludedAllocatedStorage +IncludedCookies +IncludedDeletedBackTo +IncludedHeaders +IncludedObjectVersions +IncludedPages +IncludedPaths +IncludedProperties +IncludedProperty +IncludedStates +IncludedStatistics +Includes +InclusionFileNamePatterns +InclusionFileTypePatterns +InclusionFilters +InclusionFolderNamePatterns +InclusionPatterns +InclusionPrefixes +InclusionProtectionFilters +InclusionProtectionGroupFilters +Inclusive +InclusiveStartBillingPeriod +InclusiveStartTime +IncomingDukptAttributes +IncomingEncryptionAttributes +IncomingKeyIdentifier +IncomingTranslationAttributes +IncompatibilityMessage +IncompatibleImageException +IncompatibleOrderableOptions +IncompatibleParameterError +IncompatiblePolicyException +IncompatibleProtocolsException +IncompatibleRegionForMultiAZ +IncompatibleSchemaException +IncompatibleSettingsException +IncompatibleVersion +IncompatibleVersionException +IncompleteSegmentBehavior +InconsistentQuantities +IncorrectCidrStateException +IncorrectFileSystemLifeCycleState +IncorrectKeyException +IncorrectKeyMaterialException +IncorrectMountTargetState +IncorrectTrustAnchorException +IncreaseNodeGroupsInGlobalReplicationGroupMessage +IncreaseNodeGroupsInGlobalReplicationGroupResult +IncreaseReplicaCountMessage +IncreaseReplicaCountResult +IncreaseReplicationFactorRequest +IncreaseReplicationFactorResponse +IncreaseStreamRetentionPeriodInput +IncreaseVolumeSize +IncrementalExportSpecification +IncrementalPullConfig +IncrementalRefresh +IncrementalRunConfig +Index +IndexArn +IndexAttachment +IndexAttachments +IndexConfigurationSummary +IndexConfigurationSummaryItems +IndexDocument +IndexDocumentSuffix +IndexDocumentsRequest +IndexDocumentsResponse +IndexFacesModelVersion +IndexFacesRequest +IndexFacesResponse +IndexField +IndexFieldName +IndexFieldStatus +IndexFieldType +IndexFields +IndexId +IndexNSegments +IndexName +IndexNotFoundException +IndexNotReadyException +IndexReference +IndexRotationPeriod +IndexSizeBytes +IndexSlowLogs +IndexStatistics +IndexStatus +IndexedAttributeMissingException +IndexedAttributes +IndexedQuestionAnswersCount +IndexedTextBytes +IndexedTextDocumentsCount +Indexes +IndexingFilter +IndividualAssessmentCompletedCount +IndividualAssessmentCount +IndividualAssessmentName +IndividualAssessmentNames +Industry +IndustryType +InferICD10CMRequest +InferICD10CMResponse +InferRxNormRequest +InferRxNormResponse +InferSNOMEDCTRequest +InferSNOMEDCTResponse +InferenceAccelerator +InferenceAcceleratorInfo +InferenceAcceleratorOverride +InferenceAcceleratorOverrides +InferenceAccelerators +InferenceAttribute +InferenceBenchmark +InferenceConfig +InferenceContainerDefinitions +InferenceContainers +InferenceDataImportStrategy +InferenceDeviceInfo +InferenceDeviceMemoryInfo +InferenceEventSummaries +InferenceEventSummary +InferenceExecutionConfig +InferenceExecutionSummaries +InferenceExecutionSummary +InferenceExperimentArn +InferenceExperimentDataStorageConfig +InferenceExperimentSchedule +InferenceExperimentSummary +InferenceExperiments +InferenceId +InferenceImage +InferenceInputConfiguration +InferenceInputNameConfiguration +InferenceMetrics +InferenceOutputConfiguration +InferenceRecommendation +InferenceRecommendations +InferenceRecommendationsJob +InferenceRecommendationsJobName +InferenceRecommendationsJobStep +InferenceRecommendationsJobs +InferenceS3InputConfiguration +InferenceS3OutputConfiguration +InferenceSchedulerArn +InferenceSchedulerName +InferenceSchedulerNameBeginsWith +InferenceSchedulerSummaries +InferenceSchedulerSummary +InferenceSpecification +InferenceSpecificationName +Inferred +InferredWorkloadSaving +Info +InfoIconLabelOptions +InfoIconText +InfoType +InforNexus +InforNexusConnectorProfileCredentials +InforNexusConnectorProfileProperties +InforNexusSourceProperties +InformationalCount +InfrastructureClass +InfrastructureConfig +InfrastructureConfiguration +InfrastructureConfigurationSummary +InfrastructureType +IngestConfiguration +IngestEndpoint +IngestEndpointId +IngestEndpointUrls +IngestEndpoints +IngestIp +IngestPort +IngestedDataSize +IngestedEventStatistics +IngestedEventsDetail +IngestedEventsTimeWindow +IngestedFilesSummary +IngestedNumberOfFiles +Ingestion +IngestionArn +IngestionDestination +IngestionDestinationSummary +IngestionId +IngestionInputConfiguration +IngestionJobId +IngestionProcess +IngestionS3InputConfiguration +IngestionSizeInBytes +IngestionStatus +IngestionSummary +IngestionTimeInSeconds +IngestionType +Ingestions +Ingress +IngressAccessLogs +IngressBytes +IngressConfiguration +IngressFilterRules +IngressGatewayBridge +IngressPackets +IngressPortMappings +IngressRouteTable +IngressVpcConfiguration +InheritedValue +InitProcessEnabled +InitQuery +InitialActiveLearningModelArn +InitialAudioGain +InitialCapacityConfig +InitialClusterSize +InitialConfigurationToken +InitialContactId +InitialDashboardId +InitialDashboardVisualId +InitialFileLocation +InitialInstanceCount +InitialMessage +InitialNumberOfUsers +InitialPath +InitialPosition +InitialResponseSetting +InitialSamplingPercentage +InitialTopicId +InitialVariantWeight +InitialVersion +InitializationConfiguration +InitializationVector +InitializationVectorInManifest +InitializeClusterRequest +InitializeClusterResponse +InitializedImportedDeviceCount +Initials +InitiateAuthRequest +InitiateAuthResponse +InitiateDeletionTimestamp +InitiateDeviceClaimRequest +InitiateDeviceClaimResponse +InitiateDocumentVersionUploadRequest +InitiateDocumentVersionUploadResponse +InitiateJobInput +InitiateJobOutput +InitiateLayerUploadRequest +InitiateLayerUploadResponse +InitiateMultipartUploadInput +InitiateMultipartUploadOutput +InitiateVaultLockInput +InitiateVaultLockOutput +Initiated +InitiatedBy +InitiationMethod +InitiationTimestamp +Initiator +InitiatorName +Initiators +InlineArchiveRule +InlineChunk +InlineChunkChecksum +InlineChunkChecksumAlgorithm +InlineChunkLength +InlineConfigurations +InlineCustomDocumentEnrichmentConfiguration +InlineDataSchema +InlinePolicy +InnerHorizontal +InnerVertical +Input +InputArtifact +InputArtifacts +InputArtifactsToRemove +InputAttachment +InputAttachmentName +InputAttachmentNameReference +InputAttachments +InputAttributes +InputBucket +InputBytes +InputCaptions +InputChannel +InputChannelLevel +InputChannelLevels +InputChannels +InputChannelsFineTune +InputClass +InputClipping +InputClippingSettings +InputClippings +InputColumn +InputColumns +InputCompressionType +InputConfig +InputConfigInput +InputConfigOutput +InputConfiguration +InputConfigurationRequest +InputConfigurations +InputContent +InputContext +InputDataConfig +InputDataLocationS3 +InputDecryptionSettings +InputDefinition +InputDescription +InputDescriptions +InputDestination +InputDestinationRequest +InputDestinationVpc +InputDeviceConfigurableSettings +InputDeviceHdSettings +InputDeviceId +InputDeviceMediaConnectConfigurableSettings +InputDeviceMediaConnectSettings +InputDeviceNetworkSettings +InputDeviceRequest +InputDeviceSettings +InputDeviceSummary +InputDeviceTransfers +InputDeviceUhdSettings +InputDevices +InputDocumentsCount +InputEndAction +InputFileConfig +InputFileLocation +InputFileUri +InputFilter +InputFormat +InputFormatConfiguration +InputFormatOptions +InputId +InputIdentifier +InputIds +InputIp +InputKey +InputLambdaProcessor +InputLambdaProcessorDescription +InputLambdaProcessorUpdate +InputLocation +InputLogEvent +InputLossAction +InputLossBehavior +InputLossFailoverSettings +InputLossImageColor +InputLossImageSlate +InputLossImageType +InputLossSettings +InputLossThresholdMsec +InputMode +InputName +InputOrigin +InputParallelism +InputParallelismUpdate +InputParameters +InputPartnerIds +InputPath +InputPathsMap +InputPort +InputPreference +InputPrepareScheduleActionSettings +InputPrepareScheduleActions +InputPrepareSettings +InputProcessingConfiguration +InputProcessingConfigurationDescription +InputProcessingConfigurationUpdate +InputRecordTables +InputRows +InputS3Object +InputS3Path +InputScanType +InputSchema +InputSchemaUpdate +InputSecurityGroup +InputSecurityGroupId +InputSecurityGroupIds +InputSecurityGroups +InputSerialization +InputSessionStateSpecification +InputSettings +InputSource +InputSourceRequest +InputSourceType +InputSpecification +InputStartingPosition +InputStartingPositionConfiguration +InputStorageLocation +InputSummary +InputSwitchScheduleActionSettings +InputSwitchSettings +InputTemplate +InputTimeZoneOffset +InputTimecodeSource +InputTransformer +InputType +InputUpdate +InputUpdates +InputVideoGenerator +InputVpcRequest +InputWhitelistRule +InputWhitelistRuleCidr +Inputs +InsecureSsl +InsertHeaders +InsertableImage +InsertableImages +InsertionMode +Inserts +InsideCidrBlocks +Insight +InsightArn +InsightArns +InsightConfiguration +InsightData +InsightEvent +InsightEvents +InsightFeedback +InsightHealth +InsightId +InsightImpactGraphEdge +InsightImpactGraphService +InsightNotEnabledException +InsightResultValue +InsightResults +InsightRule +InsightRuleContributor +InsightRuleContributorDatapoint +InsightRuleMetricDatapoint +InsightRules +InsightSelector +InsightSelectors +InsightSummaries +InsightSummary +InsightTimeRange +InsightType +InsightVisual +Insights +InsightsByAssessment +InsightsConfiguration +InsightsEnabled +InsightsEvent +InsightsTarget +InspectionLevel +InspectorScoreDetails +InspectorServiceAttributes +InstallOverrideList +InstallToRemoteAccessSessionRequest +InstallToRemoteAccessSessionResult +InstallUpdatesOnBoot +InstalledComponent +InstalledCount +InstalledOtherCount +InstalledPendingReboot +InstalledPendingRebootCount +InstalledRejectedCount +InstalledTime +Instance +InstanceAccess +InstanceAccessControlAttributeConfiguration +InstanceAccessDetails +InstanceAccessUrl +InstanceAggregatedAssociationOverview +InstanceAlias +InstanceArn +InstanceAssociation +InstanceAssociationOutputLocation +InstanceAssociationOutputUrl +InstanceAssociationStatusAggregatedCount +InstanceAssociationStatusInfo +InstanceAssociationStatusInfos +InstanceAttribute +InstanceBlockDeviceMapping +InstanceBlockDeviceMappingSpecification +InstanceCapacity +InstanceClass +InstanceCollectionType +InstanceConfig +InstanceConfigs +InstanceConfiguration +InstanceConnectEndpoint +InstanceConnectEndpointArn +InstanceConnectEndpointId +InstanceConnectEndpointIds +InstanceConnectEndpoints +InstanceCount +InstanceCountLimits +InstanceCounts +InstanceCreateTime +InstanceCredentials +InstanceCreditSpecification +InstanceCreditSpecificationRequest +InstanceCreditSpecifications +InstanceDefinition +InstanceDefinitions +InstanceDetails +InstanceDoesNotExistException +InstanceEntry +InstanceEventId +InstanceEventWindow +InstanceEventWindowAssociationRequest +InstanceEventWindowAssociationTarget +InstanceEventWindowDisassociationRequest +InstanceEventWindowId +InstanceEventWindowIds +InstanceEventWindowState +InstanceEventWindowStateChange +InstanceEventWindowTimeRange +InstanceEventWindowTimeRangeRequest +InstanceEventWindows +InstanceExportDetails +InstanceFamilies +InstanceFamily +InstanceFamilyCreditSpecification +InstanceFamilyId +InstanceFleet +InstanceFleetConfig +InstanceFleetId +InstanceFleetModifyConfig +InstanceFleetProvisioningSpecifications +InstanceFleetResizingSpecifications +InstanceFleetStateChangeReason +InstanceFleetStatus +InstanceFleetTimeline +InstanceFleetType +InstanceFleets +InstanceGenerations +InstanceGroup +InstanceGroupConfig +InstanceGroupDetail +InstanceGroupId +InstanceGroupIds +InstanceGroupModifyConfig +InstanceGroupName +InstanceGroupNames +InstanceGroupStateChangeReason +InstanceGroupStatus +InstanceGroupTimeline +InstanceGroupType +InstanceGroupTypes +InstanceGroups +InstanceHardware +InstanceHealth +InstanceHealthCheckResult +InstanceHealthList +InstanceHealthSummary +InstanceID +InstanceId +InstanceIdDetail +InstanceIdFilter +InstanceIdRequiredException +InstanceIdSet +InstanceIdentifier +InstanceIdentity +InstanceIds +InstanceInfo +InstanceInformation +InstanceInformationFilter +InstanceInformationFilterList +InstanceInformationList +InstanceInformationStringFilter +InstanceInitiatedShutdownBehavior +InstanceInterruptionBehavior +InstanceIpv4Prefix +InstanceIpv6Address +InstanceIpv6AddressRequest +InstanceIpv6Prefix +InstanceLifecycle +InstanceLimit +InstanceLimitExceededException +InstanceLimits +InstanceMaintenanceOptions +InstanceMaintenanceOptionsRequest +InstanceMarketOptions +InstanceMarketOptionsRequest +InstanceMatchCriteria +InstanceMemory +InstanceMessages +InstanceMetadata +InstanceMetadataOptions +InstanceMetadataOptionsRequest +InstanceMetadataOptionsResponse +InstanceMetadataServiceConfiguration +InstanceMetadataTags +InstanceMonitoring +InstanceMonitorings +InstanceName +InstanceNameAlreadyRegisteredException +InstanceNameRequiredException +InstanceNetworkInterface +InstanceNetworkInterfaceAssociation +InstanceNetworkInterfaceAttachment +InstanceNetworkInterfaceSpecification +InstanceNetworking +InstanceNotFound +InstanceNotRegisteredException +InstanceOSUser +InstanceOnboardingJobStatus +InstanceOwnerId +InstancePatchState +InstancePatchStateFilter +InstancePatchStates +InstancePlatform +InstancePoolsToUseCount +InstancePort +InstancePortInfo +InstancePortState +InstancePrivateIpAddress +InstanceProfile +InstanceProfileArn +InstanceProfileCreationTime +InstanceProfileId +InstanceProfileIdentifier +InstanceProfileList +InstanceProfileName +InstanceProfiles +InstanceProperty +InstanceProtocol +InstanceQuotaExceededFault +InstanceRecommendation +InstanceRecommendationOption +InstanceRefresh +InstanceRefreshId +InstanceRefreshIds +InstanceRefreshInProgressFault +InstanceRefreshLivePoolProgress +InstanceRefreshProgressDetails +InstanceRefreshWarmPoolProgress +InstanceRefreshes +InstanceRequestCount +InstanceRequirements +InstanceRequirementsRequest +InstanceRequirementsWithMetadata +InstanceRequirementsWithMetadataRequest +InstanceResizePolicy +InstanceReusePolicy +InstanceRole +InstanceRoleArn +InstanceRunningCount +InstanceSize +InstanceSizingType +InstanceSnapshot +InstanceSnapshotInfo +InstanceSpecification +InstanceState +InstanceStateChange +InstanceStateChangeReason +InstanceStates +InstanceStatus +InstanceStatusDetails +InstanceStatusEvent +InstanceStatusReason +InstanceStatusSummary +InstanceStatuses +InstanceStorageConfig +InstanceStorageInfo +InstanceStorageSupported +InstanceSummaries +InstanceSummary +InstanceSummaryList +InstanceTagAttribute +InstanceTagKeys +InstanceTagNotificationAttribute +InstanceTags +InstanceTarget +InstanceTenancy +InstanceTerminationTimeout +InstanceTimeline +InstanceType +InstanceTypeConfig +InstanceTypeConfigs +InstanceTypeDetails +InstanceTypeInfo +InstanceTypeInfoFromInstanceRequirements +InstanceTypeItem +InstanceTypeOffering +InstanceTypeOfferings +InstanceTypeSpecification +InstanceTypeSpecifications +InstanceTypes +InstanceUsage +InstanceUsages +InstanceUserSummaries +InstanceUserSummary +InstanceVcpu +InstanceWarmup +Instances +InstancesCount +InstancesDistribution +InstancesHealth +InstancesRevision +InstancesToProtect +InstancesToTerminate +InstancesToUpdate +InstancesToUpdateOnRollback +InstancesWithCriticalNonCompliantPatches +InstancesWithFailedPatches +InstancesWithInstalledOtherPatches +InstancesWithInstalledPatches +InstancesWithInstalledPendingRebootPatches +InstancesWithInstalledRejectedPatches +InstancesWithMissingPatches +InstancesWithNotApplicablePatches +InstancesWithOtherNonCompliantPatches +InstancesWithSecurityNonCompliantPatches +InstancesWithUnreportedNotApplicablePatches +InstantBooking +InstantiateSolNetworkInstanceInput +InstantiateSolNetworkInstanceOutput +Instructions +InsufficientAvailableIPsInSubnetFault +InsufficientCacheClusterCapacityFault +InsufficientCapabilitiesException +InsufficientCapacityException +InsufficientCloudWatchLogsResourcePolicy +InsufficientClusterCapacityFault +InsufficientDBClusterCapacityFault +InsufficientDBInstanceCapacityFault +InsufficientDataActions +InsufficientDataHealthStatus +InsufficientDeliveryPolicyException +InsufficientDependencyServiceAccessPermissionException +InsufficientEncryptionPolicyException +InsufficientPermissionsException +InsufficientPrivilegesException +InsufficientResourceCapacityFault +InsufficientS3BucketPolicyException +InsufficientS3BucketPolicyFault +InsufficientSensorData +InsufficientSnsTopicPolicyException +InsufficientStorageClusterCapacityFault +InsufficientThroughputCapacity +IntArrayOptions +IntOptions +IntValueMax +IntValueMin +IntegerDatasetParameter +IntegerDatasetParameterDefaultValues +IntegerDefaultValues +IntegerHyperParameterRange +IntegerParameter +IntegerParameterDeclaration +IntegerParameterRange +IntegerParameterRangeSpecification +IntegerParameterRanges +IntegerParameters +IntegerRange +IntegerStaticValues +IntegerValue +IntegerValueWhenUnsetConfiguration +IntegerValues +IntegrateServices +Integration +IntegrationArn +IntegrationAssociationArn +IntegrationAssociationId +IntegrationAssociationSummary +IntegrationAssociationSummaryList +IntegrationConfig +IntegrationId +IntegrationMethod +IntegrationResponse +IntegrationResponseId +IntegrationResponseKey +IntegrationResponseSelectionExpression +IntegrationResultS3DestinationArn +IntegrationSubtype +IntegrationType +IntegrationTypes +IntegrationUri +Integrations +IntelligentTieringAndOperator +IntelligentTieringConfiguration +IntelligentTieringConfigurationList +IntelligentTieringFilter +IntendedUse +Intent +IntentClassificationTestResultItem +IntentClassificationTestResultItemCounts +IntentClassificationTestResults +IntentClosingSetting +IntentConfidence +IntentConfirmationSetting +IntentFilter +IntentLevelSlotResolutionTestResultItem +IntentLevelSlotResolutionTestResults +IntentMetadata +IntentOverride +IntentResultEvent +IntentSortBy +IntentStatistics +IntentSummary +InterMetricImpactDetails +InterMetricImpactList +Interactive +InteractiveLayoutConfiguration +Intercluster +Interconnect +Interconnects +Interface +InterfaceAssociation +InterfaceAssociations +InterfacePermission +InterfaceProtocol +InterfaceRequest +InterfaceType +InterlaceMode +Interlaced +InternalDependencyException +InternalError +InternalErrorException +InternalException +InternalFailure +InternalFailureException +InternalServerError +InternalServerErrorException +InternalServerException +InternalServiceError +InternalServiceErrorException +InternalServiceException +InternalServiceFault +InternalStreamFailure +InternalUserDatabaseEnabled +InternetGateway +InternetGatewayAttachment +InternetGatewayId +InternetGatewayIds +InternetGatewayRoutes +InternetGateways +InternetHealth +InternetKeyExchangeVersion +InternetMeasurementsLogDelivery +InteroperabilityEnabled +Interpolated +InterpolatedAssetPropertyValue +InterpolationParameters +InterpolationValue +Interpretation +InterruptionFilter +Interval +IntervalCadence +IntervalEndTime +IntervalInSeconds +IntervalStartTime +IntervalUnit +IntraDcPrecision +InvalidACLStateFault +InvalidARNFault +InvalidAccessException +InvalidAccountStatusException +InvalidActionDeclarationException +InvalidActivation +InvalidActivationId +InvalidActorArnException +InvalidAddressException +InvalidAggregationException +InvalidAggregatorException +InvalidAlarmConfigException +InvalidAliasNameException +InvalidAllowedPatternException +InvalidApplicationConfigurationException +InvalidApplicationNameException +InvalidApprovalRuleContentException +InvalidApprovalRuleNameException +InvalidApprovalRuleTemplateContentException +InvalidApprovalRuleTemplateDescriptionException +InvalidApprovalRuleTemplateNameException +InvalidApprovalStateException +InvalidApprovalTokenException +InvalidArgsException +InvalidArgument +InvalidArgumentException +InvalidArn +InvalidArnException +InvalidAssociation +InvalidAssociationVersion +InvalidAttachmentException +InvalidAuthenticationCodeException +InvalidAuthenticationProfileRequestFault +InvalidAuthorArnException +InvalidAuthorizationMessageException +InvalidAuthorizationStateFault +InvalidAutoRollbackConfigException +InvalidAutoScalingGroupException +InvalidAutomationExecutionParametersException +InvalidAutomationSignalException +InvalidAutomationStatusUpdateException +InvalidBatchEntryIdException +InvalidBlobIdException +InvalidBlockerDeclarationException +InvalidBlueGreenDeploymentConfigurationException +InvalidBlueGreenDeploymentStateFault +InvalidBranchNameException +InvalidBucketNameFilterException +InvalidCacheClusterStateFault +InvalidCacheParameterGroupStateFault +InvalidCacheSecurityGroupStateFault +InvalidCampaignStateException +InvalidCertificateAuthorityException +InvalidCertificateException +InvalidCertificateFault +InvalidChangeBatch +InvalidChangeSetStatusException +InvalidChannelARN +InvalidCiphertextException +InvalidClientAuthStatusException +InvalidClientException +InvalidClientMetadataException +InvalidClientRequestTokenException +InvalidClientTokenException +InvalidCloudWatchDestinationException +InvalidCloudWatchLogsLogGroupArnException +InvalidCloudWatchLogsRoleArnException +InvalidClusterParameterGroupStateFault +InvalidClusterSecurityGroupStateFault +InvalidClusterSnapshotScheduleStateFault +InvalidClusterSnapshotStateFault +InvalidClusterStateFault +InvalidClusterSubnetGroupStateFault +InvalidClusterSubnetStateFault +InvalidClusterTrackFault +InvalidCodeSignatureException +InvalidCodecPrivateDataException +InvalidCommentIdException +InvalidCommentOperationException +InvalidCommitException +InvalidCommitIdException +InvalidComputePlatformException +InvalidConfigurationDetail +InvalidConfigurationException +InvalidConfigurationRecorderNameException +InvalidConfigurationRequestException +InvalidConfigurationSetException +InvalidConflictDetailLevelException +InvalidConflictResolutionException +InvalidConflictResolutionStrategyException +InvalidContactFlowException +InvalidContactFlowModuleException +InvalidContentLocation +InvalidContinuationTokenException +InvalidCredentialsException +InvalidCrossAccountRoleException +InvalidCustomDBEngineVersionStateFault +InvalidCustomSesConfigurationException +InvalidCustomerIdentifierException +InvalidDBClusterAutomatedBackupStateFault +InvalidDBClusterCapacityFault +InvalidDBClusterEndpointStateFault +InvalidDBClusterSnapshotStateFault +InvalidDBClusterStateFault +InvalidDBInstanceAutomatedBackupStateFault +InvalidDBInstanceStateFault +InvalidDBParameterGroupStateFault +InvalidDBProxyEndpointStateFault +InvalidDBProxyStateFault +InvalidDBSecurityGroupStateFault +InvalidDBSnapshotStateFault +InvalidDBSubnetGroupFault +InvalidDBSubnetGroupStateFault +InvalidDBSubnetStateFault +InvalidDataRepositoryType +InvalidDataShareFault +InvalidDateEntries +InvalidDateRangeException +InvalidDefaultRootObject +InvalidDefinition +InvalidDeleteInventoryParametersException +InvalidDeletionIdException +InvalidDeletionParameterException +InvalidDeliveryChannelNameException +InvalidDeliveryOptionsException +InvalidDeployedStateFilterException +InvalidDeploymentConfigNameException +InvalidDeploymentGroupNameException +InvalidDeploymentIdException +InvalidDeploymentInstanceTypeException +InvalidDeploymentStatusException +InvalidDeploymentStyleException +InvalidDeploymentTargetIdException +InvalidDeploymentWaitTypeException +InvalidDescriptionException +InvalidDestinationCommitSpecifierException +InvalidDestinationKmsKey +InvalidDeviceException +InvalidDocument +InvalidDocumentContent +InvalidDocumentOperation +InvalidDocumentSchemaVersion +InvalidDocumentType +InvalidDocumentVersion +InvalidDomainName +InvalidDomainNameForOriginAccessControl +InvalidDomainValidationOptionsException +InvalidEC2TagCombinationException +InvalidEC2TagException +InvalidECSServiceException +InvalidElasticIpFault +InvalidEmailException +InvalidEmailRoleAccessPolicyException +InvalidEncodingException +InvalidEndPointException +InvalidEndpointException +InvalidEndpointRegionException +InvalidEndpointStateFault +InvalidErrorCode +InvalidEventCategoryException +InvalidEventDataStoreCategoryException +InvalidEventDataStoreStatusException +InvalidEventPatternException +InvalidEventSelectorsException +InvalidEventSubscriptionStateFault +InvalidExecutionInput +InvalidExportOnlyFault +InvalidExportPath +InvalidExportSourceStateFault +InvalidExportTaskStateFault +InvalidExportTimeException +InvalidExpressionException +InvalidExternalIdException +InvalidFacetUpdateException +InvalidFallbackBehavior +InvalidFileExistsBehaviorException +InvalidFileLocationException +InvalidFileModeException +InvalidFilePositionException +InvalidFilter +InvalidFilterException +InvalidFilterOption +InvalidFilterValue +InvalidFirehoseDestinationException +InvalidFleetStatusException +InvalidFormatFault +InvalidForwardCookies +InvalidFunctionAssociation +InvalidGameSessionStatusException +InvalidGatewayRequestException +InvalidGeoRestrictionParameter +InvalidGitHubAccountTokenException +InvalidGitHubAccountTokenNameException +InvalidGlobalClusterStateFault +InvalidGlobalReplicationGroupStateFault +InvalidGrantException +InvalidGrantIdException +InvalidGrantTokenException +InvalidHandshakeTransitionException +InvalidHeadersForS3Origin +InvalidHomeRegionException +InvalidHsmClientCertificateStateFault +InvalidHsmConfigurationStateFault +InvalidIamSessionArnException +InvalidIamUserArnException +InvalidIdentityPoolConfigurationException +InvalidIdentityTokenException +InvalidIfMatchVersion +InvalidIgnoreApplicationStopFailuresValueException +InvalidImageFormatException +InvalidImportPath +InvalidImportSourceException +InvalidImportTokenException +InvalidInput +InvalidInputCombinationException +InvalidInputException +InvalidInputRecords +InvalidInsightSelectorsException +InvalidInstanceId +InvalidInstanceInformationFilterValue +InvalidInstanceNameException +InvalidInstanceStatusException +InvalidInstanceTypeException +InvalidInventoryGroupException +InvalidInventoryItemContextException +InvalidInventoryRequestException +InvalidItemContentException +InvalidJobException +InvalidJobIdException +InvalidJobStateException +InvalidKMSArn +InvalidKMSKeyException +InvalidKMSKeyFault +InvalidKMSResourceException +InvalidKeyId +InvalidKeyPrefixFilterException +InvalidKeySigningKeyName +InvalidKeySigningKeyStatus +InvalidKeyUsageException +InvalidKmsKeyIdException +InvalidLDAPSStatusException +InvalidLabels +InvalidLambdaFunctionAssociation +InvalidLambdaFunctionException +InvalidLambdaFunctionOutputException +InvalidLambdaResponseException +InvalidLayerException +InvalidLayerPartException +InvalidLexiconException +InvalidLifecycleEventHookExecutionIdException +InvalidLifecycleEventHookExecutionStatusException +InvalidLimitException +InvalidLoadBalancerActionException +InvalidLoadBalancerInfoException +InvalidLocationCode +InvalidLoggingConfiguration +InvalidLookupAttributesException +InvalidMarkerException +InvalidMaxConflictFilesException +InvalidMaxMergeHunksException +InvalidMaxResultsException +InvalidMediaFrameException +InvalidMergeOptionException +InvalidMinimumHealthyHostValueException +InvalidMinimumProtocolVersion +InvalidName +InvalidNamespaceFault +InvalidNetworkInterface +InvalidNetworkSettings +InvalidNextToken +InvalidNextTokenException +InvalidNodeException +InvalidNodeStateFault +InvalidNonceException +InvalidNotificationConfig +InvalidNumericDataException +InvalidOAuthFlowException +InvalidObjectState +InvalidOnPremisesTagCombinationException +InvalidOperationException +InvalidOperationFault +InvalidOptionException +InvalidOptionGroupStateFault +InvalidOrderException +InvalidOrigin +InvalidOriginAccessControl +InvalidOriginAccessIdentity +InvalidOriginKeepaliveTimeout +InvalidOriginReadTimeout +InvalidOutput +InvalidOverrideStatusException +InvalidPaginationException +InvalidPaginationToken +InvalidPaginationTokenException +InvalidParameter +InvalidParameterCombinationException +InvalidParameterDetail +InvalidParameterException +InvalidParameterGroupStateFault +InvalidParameterValueException +InvalidParameterValuesException +InvalidParameters +InvalidParametersException +InvalidParentCommitIdException +InvalidPasswordException +InvalidPathException +InvalidPerUnitStorageThroughput +InvalidPermissionType +InvalidPolicyAttributeException +InvalidPolicyDocument +InvalidPolicyException +InvalidPolicyRevisionIdException +InvalidPolicyTypeException +InvalidPortRangeException +InvalidProductCodeException +InvalidProtocolSettings +InvalidPublicKeyException +InvalidPublicKeyVersionException +InvalidPullRequestEventTypeException +InvalidPullRequestIdException +InvalidPullRequestStatusException +InvalidPullRequestStatusUpdateException +InvalidQueryException +InvalidQueryStatementException +InvalidQueryStatusException +InvalidQueryStringParameters +InvalidReactionUserArnException +InvalidReactionValueException +InvalidRecordCount +InvalidRecordingGroupException +InvalidReferenceNameException +InvalidRegion +InvalidRegionException +InvalidRegistrationStatusException +InvalidRelativeFileVersionEnumException +InvalidRelativePath +InvalidRenderingParameterException +InvalidReplacementContentException +InvalidReplacementTypeException +InvalidReplicationGroupStateFault +InvalidRepositoryDescriptionException +InvalidRepositoryNameException +InvalidRepositoryTriggerBranchNameException +InvalidRepositoryTriggerCustomDataException +InvalidRepositoryTriggerDestinationArnException +InvalidRepositoryTriggerEventsException +InvalidRepositoryTriggerNameException +InvalidRepositoryTriggerRegionException +InvalidRequestContentException +InvalidRequestDetail +InvalidRequestException +InvalidRequiredProtocol +InvalidReservedNodeStateFault +InvalidResourceArnException +InvalidResourceException +InvalidResourceFormatException +InvalidResourcePolicyException +InvalidResourceStateException +InvalidResourceStateFault +InvalidResourceTypeException +InvalidResponseCode +InvalidResponseException +InvalidRestoreFault +InvalidRestoreTimeException +InvalidResultAttributeException +InvalidResultTokenException +InvalidRetentionPeriodFault +InvalidRevisionException +InvalidRevisionIdException +InvalidRole +InvalidRoleException +InvalidRouteTableId +InvalidRuleContentSha256Exception +InvalidRuleException +InvalidRuntimeException +InvalidS3BucketException +InvalidS3BucketFault +InvalidS3BucketNameException +InvalidS3BucketNameFault +InvalidS3ConfigurationException +InvalidS3KeyException +InvalidS3KeyPrefixException +InvalidS3KeyPrefixFault +InvalidS3KmsKeyArnException +InvalidS3ObjectException +InvalidS3PrefixException +InvalidSNSDestinationException +InvalidSNSTopicARNException +InvalidSampleRateException +InvalidSchedule +InvalidScheduleFault +InvalidScheduledActionFault +InvalidSchemaDocException +InvalidSchemeException +InvalidScopeException +InvalidSecretsManagerResourceException +InvalidSecurityException +InvalidSecurityGroupException +InvalidSecurityGroupIDException +InvalidSecurityGroupId +InvalidSensorData +InvalidSequenceTokenException +InvalidServiceLinkedRoleStateException +InvalidServiceRoleException +InvalidSessionException +InvalidSignal +InvalidSignalDecoder +InvalidSignalsException +InvalidSigningStatus +InvalidSmsRoleAccessPolicyException +InvalidSmsRoleTrustRelationshipException +InvalidSnapshotCopyGrantStateFault +InvalidSnapshotStateFault +InvalidSnsTopicArnException +InvalidSnsTopicException +InvalidSnsTopicNameException +InvalidSortByException +InvalidSortOrderException +InvalidSourceCommitSpecifierException +InvalidSourceException +InvalidSourceKmsKey +InvalidSsmlException +InvalidStageDeclarationException +InvalidStateException +InvalidStateTransitionException +InvalidStructureException +InvalidSubnet +InvalidSubnetException +InvalidSubnetIDException +InvalidSubnetId +InvalidSubscriptionStateFault +InvalidSystemTagUsageException +InvalidTTLOrder +InvalidTableRestoreArgumentFault +InvalidTag +InvalidTagException +InvalidTagFault +InvalidTagFilterException +InvalidTagKeysListException +InvalidTagParameterException +InvalidTagging +InvalidTaggingRequestException +InvalidTagsException +InvalidTagsMapException +InvalidTagsToAddException +InvalidTarget +InvalidTargetBranchException +InvalidTargetException +InvalidTargetFilterNameException +InvalidTargetGroupPairException +InvalidTargetInstancesException +InvalidTargetMaps +InvalidTargetsException +InvalidTaskIdException +InvalidTemplateException +InvalidTimeRangeException +InvalidTitleException +InvalidToken +InvalidTokenException +InvalidTracingConfiguration +InvalidTrackingOptionsException +InvalidTrafficPolicyDocument +InvalidTrafficRoutingConfigurationException +InvalidTrailNameException +InvalidTriggerConfigException +InvalidTypeException +InvalidTypeNameException +InvalidUpdate +InvalidUpdateOutdatedInstancesOnlyValueException +InvalidUsageAllocationsException +InvalidUsageDimensionException +InvalidUsageLimitFault +InvalidUserGroupStateFault +InvalidUserList +InvalidUserPoolConfigurationException +InvalidUserStateFault +InvalidUserStatusException +InvalidUserTypeException +InvalidVPCId +InvalidVPCNetworkStateFault +InvalidValues +InvalidVersionNumberException +InvalidViewerCertificate +InvalidWebACLId +InvalidWebhookAuthenticationParametersException +InvalidWebhookFilterPatternException +InvalidZipFileException +InvalidateProjectCacheInput +Invalidation +InvalidationBatch +InvalidationList +InvalidationSummary +InventoryAggregator +InventoryConfiguration +InventoryConfigurationList +InventoryData +InventoryDeletionStatusItem +InventoryDeletionSummary +InventoryDeletionSummaryItem +InventoryDeletions +InventoryDestination +InventoryEncryption +InventoryFilter +InventoryGroup +InventoryItem +InventoryItemAttribute +InventoryItemSchema +InventoryResultEntity +InventoryResultItem +InventoryRetrievalJobDescription +InventoryRetrievalJobInput +InventoryRetrievalParameters +InventoryS3BucketDestination +InventorySchedule +InventorySizeInBytes +Inverse +Inverted +InvisibleFieldInfo +InvisibleFields +Invitation +InvitationId +InvitationType +Invitations +InvitationsCount +Invite +InviteAccountToOrganizationRequest +InviteAccountToOrganizationResponse +InviteAction +InviteId +InviteMembersRequest +InviteMembersResponse +InviteMessageTemplate +InviteUsersRequest +InviteUsersResponse +InvitedAt +InvitedBy +InvitedOn +InvitedTime +InviteePrincipalId +Invites +InvocationCondition +InvocationEndTime +InvocationEndpoint +InvocationHttpParameters +InvocationId +InvocationPhrase +InvocationPoint +InvocationRateLimitPerSecond +InvocationRequest +InvocationResponse +InvocationRole +InvocationStartTime +InvocationTime +InvocationTimeoutSeconds +InvocationType +InvocationsMaxRetries +InvocationsPerInstance +InvocationsTimeoutInSeconds +InvoiceId +InvokeArgs +InvokeAsyncRequest +InvokeAsyncResponse +InvokeDeviceMethodRequest +InvokeDeviceMethodResponse +InvokeEndpointAsyncInput +InvokeEndpointAsyncOutput +InvokeEndpointInput +InvokeEndpointOutput +InvokeEndpointWithResponseStreamInput +InvokeEndpointWithResponseStreamOutput +InvokeMode +InvokeModelRequest +InvokeModelResponse +InvokeModelWithResponseStreamRequest +InvokeModelWithResponseStreamResponse +InvokeResponseStreamUpdate +InvokeScreenAutomationRequest +InvokeScreenAutomationResult +InvokeWithResponseStreamCompleteEvent +InvokeWithResponseStreamRequest +InvokeWithResponseStreamResponse +InvokedBy +InvokedIntentSample +InvokedProductionVariant +IoPerformance +IoTJobAbortConfig +IoTJobAbortCriteria +IoTJobExecutionsRolloutConfig +IoTJobExponentialRolloutRate +IoTJobRateIncreaseCriteria +IoTJobTimeoutConfig +IonBinary +IonText +Iops +IopsOther +IopsRead +IopsToStorageRatio +IopsTotal +IopsWrite +IosClientBrandingAttributes +IosImportClientBrandingAttributes +IotAnalyticsAction +IotCertificateId +IotEventsAction +IotEventsDestinationConfiguration +IotEventsInputIdentifier +IotJobArn +IotJobId +IotRoleAlias +IotSiteWiseAction +IotSiteWiseAssetModelPropertyIdentifier +IotSiteWiseCustomerManagedDatastoreS3Storage +IotSiteWiseCustomerManagedDatastoreS3StorageSummary +IotSiteWiseInputIdentifier +IotThingName +IotTopicPublishAction +Ip +IpAccessSettings +IpAccessSettingsSummary +IpAddress +IpAddressCount +IpAddressDetails +IpAddressFamily +IpAddressInUse +IpAddressRequest +IpAddressResponse +IpAddressType +IpAddressUpdate +IpAddressV4 +IpAddresses +IpCity +IpCountry +IpDiscovery +IpFamily +IpFilter +IpGeoLocation +IpId +IpOrganizationDetails +IpOwner +IpOwnerId +IpPermission +IpPermissions +IpPermissionsEgress +IpProtocol +IpRange +IpRanges +IpRestrictionRuleMap +IpRoute +IpRouteInfo +IpRouteLimitExceededException +IpRouteStatusMsg +IpRouteStatusReason +IpRoutes +IpRoutesInfo +IpRule +IpRuleItem +IpScheme +IpSet +IpSetId +IpSetIds +IpSets +IpUsage +IpV4Addresses +IpV4Cidr +IpV4CidrBlock +IpV6Address +IpV6Addresses +IpV6Cidr +Ipam +IpamAddressHistoryRecord +IpamArn +IpamCidrAuthorizationContext +IpamDiscoveredAccount +IpamDiscoveredAccounts +IpamDiscoveredResourceCidr +IpamDiscoveredResourceCidrs +IpamDiscoveryFailureReason +IpamId +IpamIds +IpamOperatingRegion +IpamPool +IpamPoolAllocation +IpamPoolAllocationId +IpamPoolAllocations +IpamPoolArn +IpamPoolCidr +IpamPoolCidrFailureReason +IpamPoolCidrId +IpamPoolCidrs +IpamPoolId +IpamPoolIds +IpamPoolOwner +IpamPools +IpamRegion +IpamResourceCidr +IpamResourceCidrs +IpamResourceDiscoveries +IpamResourceDiscovery +IpamResourceDiscoveryArn +IpamResourceDiscoveryAssociation +IpamResourceDiscoveryAssociationArn +IpamResourceDiscoveryAssociationId +IpamResourceDiscoveryAssociationIds +IpamResourceDiscoveryAssociations +IpamResourceDiscoveryId +IpamResourceDiscoveryIds +IpamResourceDiscoveryRegion +IpamResourceTag +IpamScope +IpamScopeArn +IpamScopeId +IpamScopeIds +IpamScopeType +IpamScopes +Ipams +IpcMode +Ips +Ipv4 +Ipv4Address +Ipv4AddressesPerInterface +Ipv4IpamPoolId +Ipv4NetmaskLength +Ipv4Prefix +Ipv4PrefixCount +Ipv4PrefixSpecification +Ipv4PrefixSpecificationRequest +Ipv4PrefixSpecificationResponse +Ipv4Prefixes +Ipv6 +Ipv6Address +Ipv6AddressCount +Ipv6Addresses +Ipv6AddressesPerInterface +Ipv6Cidr +Ipv6CidrAssociation +Ipv6CidrAssociations +Ipv6CidrBlock +Ipv6CidrBlockAssociation +Ipv6CidrBlockAssociationSet +Ipv6CidrBlockNetworkBorderGroup +Ipv6CidrBlockSet +Ipv6CidrBlockState +Ipv6IpamPoolId +Ipv6Native +Ipv6NetmaskLength +Ipv6Pool +Ipv6Pools +Ipv6Prefix +Ipv6PrefixCount +Ipv6PrefixSpecification +Ipv6PrefixSpecificationRequest +Ipv6PrefixSpecificationResponse +Ipv6Prefixes +Ipv6Range +Ipv6Ranges +Ipv6Support +Ipv6Supported +IrreversibleInstanceRefreshFault +Is64BitsOnly +IsActivated +IsAdvancedManagedRuleSet +IsAlexaForBusinessEnabled +IsAnomalous +IsAnomaly +IsApplicable +IsArchived +IsAttachable +IsAuthorizedInput +IsAuthorizedOutput +IsAuthorizedWithTokenInput +IsAuthorizedWithTokenOutput +IsAutoPredictor +IsBatchStatement +IsBinaryFile +IsCaller +IsClusterWriter +IsCollection +IsCritical +IsDataLossAllowed +IsDataPartial +IsDefault +IsDefaultAction +IsDefaultConfiguration +IsDefaultVersion +IsEgress +IsEmpty +IsEnabled +IsEncrypted +IsEnd +IsEssential +IsGlobal +IsIPV6Enabled +IsImmutable +IsInSandbox +IsIncludedInTopic +IsIndirectActivity +IsLatest +IsLatestPatch +IsLatestVersion +IsLocalTime +IsLogging +IsLoggingEnabled +IsLongTermPricingAutoRenew +IsMajorVersion +IsMajorVersionUpgrade +IsMaster +IsMemberInGroupsRequest +IsMemberInGroupsResponse +IsMfaDeleteEnabled +IsMiddlebox +IsModifiable +IsMultiRegionTrail +IsNegOne +IsNewProvisioningAvailable +IsNoEcho +IsNullString +IsOptional +IsOrganizationTrail +IsOwned +IsParent +IsPartial +IsPaused +IsPermanentRestore +IsPrimary +IsPrimaryIpv6 +IsPublic +IsPubliclyAccessible +IsRegisteredWithLakeFormation +IsRequestable +IsRequired +IsRestoreInProgress +IsRestricted +IsReviewOwnerUpdateAcknowledged +IsRouteTableUsedInDifferentAZ +IsSuccess +IsTerminal +IsTestDomain +IsTruncated +IsTunable +IsUnique +IsUnstructured +IsValidExchange +IsValueSecret +IsVerifiedAuthor +IsVersioningSupported +IsVpcPeeredResult +IsWifiEnabled +IsWriter +Iscsi +Iso2CountryCode +IsoCountryCode +IsolationMode +Isp +IspName +IspPlacement +IspPlacements +Issue +IssueCertificateRequest +IssueCertificateResponse +IssueDetected +IssueDetectionConfiguration +IssueFieldMappings +IssueInfoMap +IssueSubEntityFilter +IssueType +IssuedAt +Issuer +IssuerCertificateIdentifier +IssuerDetails +Issues +IssuesDetected +IssuingAccount +Item +ItemClassFilter +ItemCollectionKey +ItemCollectionMetrics +ItemCollectionSizeLimitExceededException +ItemContentHash +ItemContentMismatchException +ItemCount +ItemIdentifier +ItemIdentifierAttributeName +ItemResponse +ItemSizeLimitExceededException +ItemSource +ItemStatus +ItemizedMetricStats +ItemizedMetricStatsList +Items +ItemsLimit +ItemsLimitConfiguration +IvInManifest +IvSource +JA3Fingerprint +JDBCConnectorOptions +JDBCConnectorSource +JDBCConnectorTarget +JSON +JSONInput +JSONMappingParameters +JSONOutput +JSONString +JWTConfiguration +JamSyncTime +JapaneseTokenizationDictionary +Jar +Jdbc +JdbcTarget +JdbcTargets +JiraAccountUrl +JiraConfiguration +JiraParameters +JmxExporter +JmxExporterInfo +Job +JobAlbumArt +JobArn +JobBookmark +JobBookmarkEntry +JobBookmarkKeys +JobBookmarkKeysSortOrder +JobBookmarksEncryption +JobBookmarksEncryptionMode +JobCheckpointConfig +JobCommand +JobCompletionDate +JobCompletionReportURI +JobConfig +JobConfiguration +JobCreationDate +JobData +JobDefinition +JobDefinitionArn +JobDefinitionName +JobDefinitionSummaries +JobDependency +JobDescription +JobDescriptor +JobDetail +JobDetails +JobDriver +JobDurationInSeconds +JobEndTime +JobEntry +JobError +JobEventDetails +JobExecution +JobExecutionSettings +JobExecutionState +JobExecutionStatusDetails +JobExecutionSummary +JobExecutionSummaryForJob +JobExecutionSummaryForThing +JobExecutionsRetryConfig +JobExecutionsRolloutConfig +JobExpirationTime +JobFailure +JobFailureLogURI +JobFilter +JobFlowDetail +JobFlowExecutionStatusDetail +JobFlowId +JobFlowIds +JobFlowInstancesConfig +JobFlowInstancesDetail +JobFlowRole +JobFlowStates +JobFlows +JobId +JobIds +JobInput +JobList +JobListDescriptor +JobListEntries +JobListEntry +JobLog +JobLogEventData +JobLogInfo +JobLogs +JobManifest +JobManifestGeneratorFilter +JobManifestLocation +JobManifestSpec +JobMessages +JobMetadata +JobMetrics +JobName +JobNameContains +JobNames +JobNodeDetails +JobNotFoundException +JobOperation +JobOutput +JobOutputDataConfig +JobOutputPath +JobParameters +JobPercentComplete +JobPlanDescription +JobPostLaunchActionsLaunchStatus +JobProcessDetails +JobProgress +JobProgressSummary +JobQueueDetail +JobReferenceCode +JobReferenceCodeContains +JobReport +JobResource +JobResourceTags +JobResources +JobRun +JobRunId +JobRunIds +JobRunState +JobRunSummary +JobRuns +JobSample +JobSchedule +JobScheduleFrequency +JobScopeTerm +JobScopingBlock +JobSettings +JobStartTime +JobState +JobStatesToNotify +JobStats +JobStatus +JobStatusDetails +JobStatusException +JobStatuses +JobStoppingCondition +JobSuccessLogURI +JobSummaries +JobSummary +JobTag +JobTags +JobTemplate +JobTemplateData +JobTemplateSettings +JobTemplateSummary +JobTemplates +JobTimeout +JobTimers +JobTitle +JobType +JobUpdate +JobWatermark +JobWorkerExecutorConfiguration +Jobs +JobsNotFound +Join +JoinColumn +JoinDomainInput +JoinDomainOutput +JoinEui +JoinEuiFilters +JoinEventConfiguration +JoinInstruction +JoinKeyProperties +JoinResourceTypeEventConfiguration +JoinSource +JoinStorageSessionInput +JoinToken +JoinType +JoinedMethod +JoinedTimestamp +JournalKinesisStreamDescription +JournalS3ExportDescription +JournalS3Exports +JourneyActivityId +JourneyChannelSettings +JourneyCustomMessage +JourneyDateRangeKpiResponse +JourneyEmailMessage +JourneyExecutionActivityMetricsResponse +JourneyExecutionMetricsResponse +JourneyId +JourneyLimits +JourneyPushMessage +JourneyResponse +JourneyRunExecutionActivityMetricsResponse +JourneyRunExecutionMetricsResponse +JourneyRunResponse +JourneyRunsResponse +JourneySMSMessage +JourneySchedule +JourneyStateRequest +JourneyTimeframeCap +JourneysResponse +Json +JsonBody +JsonClassifier +JsonContentTypes +JsonFormatDescriptor +JsonFormatRef +JsonMatchPattern +JsonOptions +JsonPath +JsonTokenTypeConfiguration +JunctionPath +JupyterServerAppSettings +JwksUri +JwtConfiguration +JwtTokenTypeConfiguration +KBId +KGKeyPairIds +KMSAccessDeniedException +KMSAccessDeniedFault +KMSArn +KMSContext +KMSDisabledException +KMSDisabledFault +KMSEncrypted +KMSEncryptionConfig +KMSEncryptionContext +KMSFault +KMSInternalException +KMSInvalidKeyUsageException +KMSInvalidMacException +KMSInvalidSignatureException +KMSInvalidStateException +KMSInvalidStateFault +KMSKey +KMSKeyArn +KMSKeyDetails +KMSKeyID +KMSKeyId +KMSKeyNotAccessibleFault +KMSMasterKeyArn +KMSMasterKeyID +KMSMasterKeyId +KMSNotFoundException +KMSNotFoundFault +KMSOptInRequired +KMSRequestFailedException +KMSServerSideEncryption +KMSServerSideEncryptionIntegration +KMSServerSideEncryptionIntegrationConfig +KMSThrottlingException +KMSThrottlingFault +KPIActualValueConditionalFormatting +KPIComparisonValueConditionalFormatting +KPIConditionalFormatting +KPIConditionalFormattingOption +KPIConfiguration +KPIFieldWells +KPIOptions +KPIPrimaryValueConditionalFormatting +KPIProgressBarConditionalFormatting +KPISortConfiguration +KPISparklineOptions +KPIVisual +KPIVisualLayoutOptions +KPIVisualStandardLayout +KVSStreamStartSelector +KafkaAction +KafkaActionHeader +KafkaBrokerNodeId +KafkaCluster +KafkaClusterClientAuthentication +KafkaClusterClientAuthenticationDescription +KafkaClusterDescription +KafkaClusterEncryptionInTransit +KafkaClusterEncryptionInTransitDescription +KafkaSettings +KafkaStreamingSourceOptions +KafkaVersion +KafkaVersions +KantarLicenseId +KantarServerUrl +KantarWatermark +KantarWatermarkSettings +KbNumber +KdcAdminPassword +KeepAlivePeriodInSeconds +KeepJobFlowAliveWhenNoSteps +KeepSegments +KendraConfiguration +KerberosAttributes +KerberosKeytab +KerberosKrb5Conf +KerberosPrincipal +Kernel +KernelCapabilities +KernelGatewayAppSettings +KernelGatewayImageConfig +KernelId +KernelSpec +KernelSpecs +Key +KeyARN +KeyAgreement +KeyAlgorithm +KeyArn +KeyAttributes +KeyBlockFormat +KeyCertSign +KeyCertificate +KeyCertificateChain +KeyCheckValue +KeyCheckValueAlgorithm +KeyClass +KeyConditionExpression +KeyConditions +KeyCount +KeyDetection +KeyEncipherment +KeyEncryptionAlgorithm +KeyFingerprint +KeyFormat +KeyFormatVersions +KeyGroup +KeyGroupAlreadyExists +KeyGroupConfig +KeyGroupId +KeyGroupList +KeyGroupSummary +KeyId +KeyIdentifier +KeyLabels +KeyLength +KeyListEntry +KeyLocation +KeyManagementServiceArn +KeyManager +KeyMarker +KeyMaterial +KeyMaterialType +KeyMd5 +KeyMetadata +KeyModesOfUse +KeyName +KeyNames +KeyOrigin +KeyPair +KeyPairId +KeyPairIds +KeyPairInfo +KeyPairMismatchException +KeyPairSpec +KeyPairs +KeyPath +KeyPattern +KeyPhrase +KeyPhrases +KeyPhrasesDetectionJobFilter +KeyPhrasesDetectionJobProperties +KeyPhrasesDetectionJobPropertiesList +KeyPrefix +KeyPrefixEquals +KeyPrefixes +KeyProviderServer +KeyProviderSettings +KeyRange +KeyRotationEnabled +KeyRotationIntervalSeconds +KeyRotationStatus +KeySchema +KeySchemaElement +KeySerialNumber +KeySigningKey +KeySigningKeyAlreadyExists +KeySigningKeyInParentDSRecord +KeySigningKeyInUse +KeySigningKeyWithActiveStatusNotFound +KeySigningKeys +KeySpec +KeyState +KeyStatus +KeyStoragePolicy +KeyStorageSecurityStandard +KeyStorePassword +KeySummary +KeyTag +KeyType +KeyUnavailableException +KeyUsage +KeyUsageFlags +KeyUsageProperty +KeyUsagePropertyFlags +KeyUsages +KeyValue +KeyValuePair +KeyValuesPair +KeyframesMaxDist +Keys +KeysAndAttributes +KeysToDelete +KeysWithNoncompliantValues +KeyspaceSummary +Keyword +KeywordAction +KeywordFilter +KeywordInformation +KeywordMatchConfiguration +KeywordMessage +Keywords +KinesisAction +KinesisConfiguration +KinesisDataFirehose +KinesisDataStream +KinesisDataStreamDestination +KinesisDataStreamDestinations +KinesisDataStreamSinkConfiguration +KinesisFirehoseConfig +KinesisFirehoseDestination +KinesisFirehoseDestinationDetails +KinesisFirehoseDetails +KinesisFirehoseInput +KinesisFirehoseInputDescription +KinesisFirehoseInputUpdate +KinesisFirehoseOutput +KinesisFirehoseOutputDescription +KinesisFirehoseOutputUpdate +KinesisParameters +KinesisSettings +KinesisStreamARN +KinesisStreamConfig +KinesisStreamName +KinesisStreamParameters +KinesisStreamSourceConfiguration +KinesisStreamSourceDescription +KinesisStreamingDestinationInput +KinesisStreamingDestinationOutput +KinesisStreamingSourceOptions +KinesisStreamsInput +KinesisStreamsInputDescription +KinesisStreamsInputUpdate +KinesisStreamsOutput +KinesisStreamsOutputDescription +KinesisStreamsOutputUpdate +KinesisVideoStream +KinesisVideoStreamConfig +KinesisVideoStreamConfiguration +KinesisVideoStreamConfigurationUpdate +KinesisVideoStreamPoolConfiguration +KinesisVideoStreamPoolSummary +KinesisVideoStreamPools +KinesisVideoStreamRecordingSourceRuntimeConfiguration +KinesisVideoStreamSourceRuntimeConfiguration +KinesisVideoStreamSourceTaskConfiguration +KinesisVideoStreamStartSelector +Klv +KlvBehavior +KlvDataPids +KlvMetadata +KmsArn +KmsDataKeyReusePeriodSeconds +KmsEncryptionConfig +KmsEncryptionContext +KmsException +KmsGrantConfiguration +KmsGrantConstraints +KmsKey +KmsKeyARN +KmsKeyArn +KmsKeyConfiguration +KmsKeyDisabledException +KmsKeyId +KmsKeyIdentifier +KmsKeyIds +KmsKeyNotFoundException +KmsKeyProviderUri +KmsKeyRegion +KmsKeyToGrant +KmsKeyValidationException +KmsKeysToGrant +KmsMasterKeyArn +KmsMasterKeyId +KnowledgeArticleConfiguration +KnowledgeBaseAssociationData +KnowledgeBaseData +KnowledgeBaseSummary +KnownFraudsterRisk +KnownGender +KpiName +KpiResult +Kubernetes +KubernetesApiCallAction +KubernetesAuditLogsConfiguration +KubernetesAuditLogsConfigurationResult +KubernetesConfiguration +KubernetesConfigurationResult +KubernetesDataSourceFreeTrial +KubernetesDetails +KubernetesNetworkConfigRequest +KubernetesNetworkConfigResponse +KubernetesUserDetails +KubernetesVersion +KubernetesWorkloadDetails +KxCacheStorageConfiguration +KxChangesetListEntry +KxCluster +KxCommandLineArgument +KxDatabaseCacheConfiguration +KxDatabaseConfiguration +KxDatabaseListEntry +KxDeploymentConfiguration +KxEnvironment +KxNode +KxSavedownStorageConfiguration +KxUser +L6Metadata +L6Mode +LBCookieStickinessPolicies +LBCookieStickinessPolicy +LDAPSSettingInfo +LDAPSSettingsInfo +LDAPSStatus +LDAPSStatusReason +LE +LFResourceDetails +LFTag +LFTagError +LFTagKeyResource +LFTagOnDatabase +LFTagPair +LFTagPolicy +LFTagPolicyDetails +LFTagPolicyResource +LFTags +LFTagsOnColumns +LFTagsOnTable +LT +Label +LabelAlias +LabelAttribute +LabelAttributeName +LabelCategory +LabelCategoryConfigS3Uri +LabelCategoryExclusionFilters +LabelCategoryInclusionFilters +LabelColor +LabelConfiguration +LabelContent +LabelCount +LabelCounters +LabelCountersForWorkteam +LabelDelimiter +LabelDetection +LabelDetectionSettings +LabelExclusionFilters +LabelFontConfiguration +LabelGroupArn +LabelGroupName +LabelGroupNameBeginsWith +LabelGroupSummaries +LabelGroupSummary +LabelHeaders +LabelId +LabelInclusionFilters +LabelIndex +LabelMatchStatement +LabelModelVersion +LabelName +LabelNameCondition +LabelNamespace +LabelOptions +LabelParameterVersionRequest +LabelParameterVersionResult +LabelSchema +LabelStats +LabelSummaries +LabelSummary +LabelTemplate +LabelVisibility +Labeled +LabeledEntries +LabelingJobAlgorithmSpecificationArn +LabelingJobAlgorithmsConfig +LabelingJobArn +LabelingJobDataAttributes +LabelingJobDataSource +LabelingJobForWorkteamSummary +LabelingJobInputConfig +LabelingJobName +LabelingJobOutput +LabelingJobOutputConfig +LabelingJobResourceConfig +LabelingJobS3DataSource +LabelingJobSnsDataSource +LabelingJobStatus +LabelingJobStoppingConditions +LabelingJobSummary +LabelingJobSummaryList +LabelingSetGenerationTaskRunProperties +Labels +LabelsInputConfiguration +LabelsS3InputConfiguration +Lac +Lag +Lags +LakeFormationConfiguration +LakeFormationDataPermissionAsset +LakeFormationDataPermissionDetails +LakeFormationDataPermissionType +LakeFormationOptInsInfo +LakeFormationOptInsInfoList +Lambda +LambdaAction +LambdaActivity +LambdaArn +LambdaAuthorizerConfig +LambdaAvailabilityProvider +LambdaCodeHook +LambdaConfig +LambdaConfigType +LambdaConfiguration +LambdaConflictHandlerConfig +LambdaConnectorProvisioningConfig +LambdaContainerParams +LambdaDataSourceConfig +LambdaDetails +LambdaDeviceMount +LambdaEndpoint +LambdaEndpointConfig +LambdaEndpointInput +LambdaEndpointSummary +LambdaEventSource +LambdaExecutionParameters +LambdaExecutorConfiguration +LambdaFunction +LambdaFunctionARN +LambdaFunctionAggregation +LambdaFunctionAggregationResponse +LambdaFunctionArn +LambdaFunctionAssociation +LambdaFunctionAssociations +LambdaFunctionCompletedEventAttributes +LambdaFunctionConfiguration +LambdaFunctionConfigurations +LambdaFunctionFailedEventAttributes +LambdaFunctionFailedEventDetails +LambdaFunctionInfo +LambdaFunctionMemoryProjectedMetric +LambdaFunctionMemoryRecommendationOption +LambdaFunctionMetadata +LambdaFunctionName +LambdaFunctionParameters +LambdaFunctionRecipeSource +LambdaFunctionRecommendation +LambdaFunctionRecommendationFilter +LambdaFunctionScheduleFailedEventDetails +LambdaFunctionScheduledEventAttributes +LambdaFunctionScheduledEventDetails +LambdaFunctionSinkConfiguration +LambdaFunctionStartFailedEventDetails +LambdaFunctionStartedEventAttributes +LambdaFunctionSucceededEventDetails +LambdaFunctionTimedOutEventAttributes +LambdaFunctionTimedOutEventDetails +LambdaFunctionUtilizationMetric +LambdaFunctions +LambdaInvoke +LambdaInvokeOperation +LambdaLayerAggregation +LambdaLayerAggregationResponse +LambdaLinuxProcessParams +LambdaOutput +LambdaOutputDescription +LambdaOutputUpdate +LambdaProvider +LambdaResource +LambdaResources +LambdaStepMetadata +LambdaTarget +LambdaThrottledException +LambdaVersion +LambdaVolumeMount +LambdaVpcConfig +Landmark +Landmarks +LandsatCloudCoverLand +LandsatCloudCoverLandInput +Lang +Language +LanguageCode +LanguageCodeControl +LanguageCodeItem +LanguageCodes +LanguageDescription +LanguageIdSettings +LanguageIdentification +LanguageModel +LanguageModelName +LanguageName +LanguageNotSupportedException +LanguageOptions +LanguageSelectionPolicy +LanguageWithScore +Languages +LargeTimestampGaps +Last +LastAccessTime +LastAccessedAt +LastAccessedDate +LastAccessedEntity +LastAccessedRegion +LastAccessedTime +LastActivatedBy +LastActivatedTime +LastActiveAt +LastActiveDefinition +LastAddress +LastAllocation +LastAnalyzedTime +LastAssociationExecutionDate +LastAttemptDate +LastAttemptedDiscoveryTime +LastAttemptedExecutionTime +LastAuditTimestamp +LastAuthenticated +LastAuthenticatedEntity +LastAuthenticatedRegion +LastAuthenticatedTime +LastAuthorizedTime +LastAutoAdjustTime +LastBackupDate +LastBackupTime +LastBatchTransformJob +LastBusinessReport +LastChangedDate +LastCheckTimestamp +LastCheckedTimestamp +LastClaimTime +LastClearTime +LastCollectedTime +LastCommitId +LastConnectionTime +LastCrawl +LastCrawlInfo +LastDataReceived +LastDeactivatedTime +LastDebugLogDeliveryStatus +LastDebugLogDeliveryStatusReason +LastDebugLogDeliveryTime +LastDecreaseDateTime +LastDeliveryChannelDeleteFailedException +LastDeliveryEvent +LastDeploymentConfig +LastDeploymentInfo +LastDeploymentStatusMessage +LastDriftCheckTimestamp +LastEditedTimestamp +LastEngagementEvent +LastError +LastErrorCode +LastErrorMessage +LastEvaluatedBackupArn +LastEvaluatedDate +LastEvaluatedGlobalTableName +LastEvaluatedKey +LastEvaluatedShardId +LastEvaluatedStreamArn +LastEvaluatedTableName +LastEvaluatedTime +LastEvaluationState +LastEvaluationTime +LastExecutionDate +LastExecutionTime +LastFailedEvaluationTime +LastFailedInvocationTime +LastFailureMessage +LastFailureTime +LastFrameClippingBehavior +LastFreshStart +LastGeneratedReportDate +LastHealthCheckTime +LastHealthCheckTimestamp +LastIncreaseDateTime +LastIngestStateChange +LastInventoryDate +LastKeyGenerationTimestamp +LastKnownUserConnectionTimestamp +LastLaunchedTime +LastMaintenanceApplied +LastMessageTimestamp +LastModificationDate +LastModificationTime +LastModified +LastModifiedAfter +LastModifiedAt +LastModifiedBefore +LastModifiedBy +LastModifiedDate +LastModifiedDateCondition +LastModifiedDateTime +LastModifiedOn +LastModifiedTime +LastModifiedTimeAfter +LastModifiedTimeBefore +LastModifiedTimestamp +LastModifiedUser +LastMonitoringExecutionSummary +LastName +LastNoRebootInstallOperationTime +LastObservedAt +LastOperationId +LastPingDateTime +LastProcessingResult +LastProvisioningRecordId +LastPublishedTime +LastRecordId +LastRecorderStatus +LastRecurrenceTime +LastRefreshDate +LastReplicatedTimestamp +LastReportGenerationExecutionError +LastReportGenerationTime +LastReportedAt +LastRequestedDateTime +LastRestoreTime +LastRotatedDate +LastRuleModification +LastRun +LastRunDetails +LastRunErrorStatus +LastRunFailureReason +LastRunStatus +LastRunSummary +LastRunTime +LastRuntimeSeconds +LastSeen +LastSeenDateTime +LastSeenTime +LastServiceErrorId +LastSoftwareUpdate +LastStarted +LastStateChangeAt +LastStateChangeReason +LastStatus +LastStatusChange +LastStatusCheckDate +LastStatusMessage +LastStatusUpdateTime +LastStopped +LastSuccessfulAllocationTime +LastSuccessfulAssociationExecutionDate +LastSuccessfulDeliveryTime +LastSuccessfulDiscoveryTime +LastSuccessfulEvaluationTime +LastSuccessfulExecutionDate +LastSuccessfulExecutionTime +LastSuccessfulInvocationTime +LastSuccessfulMetadataSyncTime +LastSuccessfulProvisioningRecordId +LastSuccessfulSyncProvisioningArtifactId +LastSuccessfulSyncTime +LastSuccessfullyAppliedConfigurations +LastSuccessfullyAppliedConfigurationsVersion +LastSuggestionsBuildTime +LastSync +LastSyncCount +LastSyncStatus +LastSyncStatusMessage +LastSyncTime +LastTieringOperationStatus +LastTieringOperationStatusDetail +LastTieringProgress +LastTieringStartTime +LastUpdate +LastUpdateAssociationDate +LastUpdateCompletedTime +LastUpdateDate +LastUpdateDateTime +LastUpdateRequestedTime +LastUpdateStatus +LastUpdateStatusReason +LastUpdateStatusReasonCode +LastUpdateTime +LastUpdateTimestamp +LastUpdateToPayPerRequestDateTime +LastUpdated +LastUpdatedAt +LastUpdatedBy +LastUpdatedDate +LastUpdatedDateTime +LastUpdatedTime +LastUpdatedTimeStamp +LastUpdatedTimestamp +LastUplinkReceivedAt +LastUploaderStatus +LastUsedDate +LastUserActivityTimestamp +LastVPCAssociation +LastWritten +Lat +LatLonOptions +LateDataRule +LateDataRuleConfiguration +Latency +LatencyInMilliseconds +LatencyInMs +LatencyMs +LatencyOther +LatencyRead +LatencyWrite +Latest +LatestAlternateSoftware +LatestCloudWatchLogsDeliveryError +LatestCloudWatchLogsDeliveryTime +LatestDeliveryAttemptSucceeded +LatestDeliveryAttemptTime +LatestDeliveryError +LatestDeliveryTime +LatestDeviceJob +LatestDigestDeliveryError +LatestDigestDeliveryTime +LatestFlywheelIteration +LatestHeartbeat +LatestHeartbeatAfter +LatestInference +LatestInferenceResult +LatestIngestionAttemptEventID +LatestIngestionAttemptTime +LatestIngestionErrorCode +LatestIngestionSuccessEventID +LatestIngestionSuccessTime +LatestLensVersion +LatestMatchingVersion +LatestMetadataSyncStatus +LatestMetadataSyncStatusMessage +LatestNotificationAttemptSucceeded +LatestNotificationAttemptTime +LatestNotificationError +LatestNotificationTime +LatestOnly +LatestProfileVersion +LatestPublicVersion +LatestRestorableDateTime +LatestRestorableTime +LatestRevision +LatestSampleTime +LatestScheduledRetrainingAvailableDataInDays +LatestScheduledRetrainingFailedReason +LatestScheduledRetrainingModelVersion +LatestScheduledRetrainingStartTime +LatestScheduledRetrainingStatus +LatestSchemaVersion +LatestSoftware +LatestStreamArn +LatestStreamLabel +LatestTime +LatestUpdateAttemptAt +LatestUpdateAttemptAuxiliaryDataLocation +LatestUpdateAttemptStatus +LatestUsageTimestamp +LatestVersion +LatestVersionArn +LatestVersionCreatedAt +LatestVersionId +LatestVersionMetadata +LatestVersionName +LatestVersionNumber +LatestVersionSize +LatestVersionStatus +Latitude +Launch +LaunchAction +LaunchActionParameter +LaunchActionRun +LaunchActionsRequestFilters +LaunchActionsStatus +LaunchAppRequest +LaunchCommands +LaunchConfig +LaunchConfiguration +LaunchConfigurationARN +LaunchConfigurationName +LaunchConfigurationNameType +LaunchConfigurationNames +LaunchConfigurationNamesType +LaunchConfigurationTemplate +LaunchConfigurations +LaunchConfigurationsType +LaunchDate +LaunchDetails +LaunchExecution +LaunchGroup +LaunchGroupConfig +LaunchOverrides +LaunchParameters +LaunchPath +LaunchPathSummaries +LaunchPathSummary +LaunchPaths +LaunchPermission +LaunchPermissionConfiguration +LaunchPermissionModifications +LaunchPermissions +LaunchProfile +LaunchProfileInitialization +LaunchProfileInitializationActiveDirectory +LaunchProfileInitializationScript +LaunchProfileMembership +LaunchRoleArn +LaunchSpecification +LaunchSpecifications +LaunchTemplate +LaunchTemplateAndOverrides +LaunchTemplateAndOverridesResponse +LaunchTemplateBlockDeviceMapping +LaunchTemplateBlockDeviceMappingRequest +LaunchTemplateCapacityReservationSpecificationRequest +LaunchTemplateCapacityReservationSpecificationResponse +LaunchTemplateConfig +LaunchTemplateConfigs +LaunchTemplateConfiguration +LaunchTemplateCpuOptions +LaunchTemplateCpuOptionsRequest +LaunchTemplateData +LaunchTemplateDiskConf +LaunchTemplateEbsBlockDevice +LaunchTemplateEbsBlockDeviceRequest +LaunchTemplateElasticInferenceAccelerator +LaunchTemplateElasticInferenceAcceleratorResponse +LaunchTemplateEnclaveOptions +LaunchTemplateEnclaveOptionsRequest +LaunchTemplateHibernationOptions +LaunchTemplateHibernationOptionsRequest +LaunchTemplateIamInstanceProfileSpecification +LaunchTemplateIamInstanceProfileSpecificationRequest +LaunchTemplateId +LaunchTemplateIds +LaunchTemplateInstanceMaintenanceOptions +LaunchTemplateInstanceMaintenanceOptionsRequest +LaunchTemplateInstanceMarketOptions +LaunchTemplateInstanceMarketOptionsRequest +LaunchTemplateInstanceMetadataOptions +LaunchTemplateInstanceMetadataOptionsRequest +LaunchTemplateInstanceNetworkInterfaceSpecification +LaunchTemplateInstanceNetworkInterfaceSpecificationRequest +LaunchTemplateLicenseConfiguration +LaunchTemplateLicenseConfigurationRequest +LaunchTemplateName +LaunchTemplateNames +LaunchTemplateOverrides +LaunchTemplatePlacement +LaunchTemplatePlacementRequest +LaunchTemplatePrivateDnsNameOptions +LaunchTemplatePrivateDnsNameOptionsRequest +LaunchTemplateSpecification +LaunchTemplateSpotMarketOptions +LaunchTemplateSpotMarketOptionsRequest +LaunchTemplateTagSpecification +LaunchTemplateTagSpecificationRequest +LaunchTemplateVersion +LaunchTemplateVersions +LaunchTemplates +LaunchTemplatesMonitoring +LaunchTemplatesMonitoringRequest +LaunchTime +LaunchType +LaunchedAt +LaunchedAvailabilityZone +LaunchedInstance +Layer +LayerAlreadyExistsException +LayerArn +LayerFailure +LayerId +LayerIds +LayerInaccessibleException +LayerName +LayerPartTooSmallException +LayerVersionArn +LayerVersionContentInput +LayerVersionContentOutput +LayerVersions +LayerVersionsListItem +Layers +LayersCount +LayersListItem +LayersNotFoundException +Layout +LayoutConfiguration +LayoutSections +LayoutSummary +Layouts +LbCookieStickinessPolicies +LcmOperationInfo +LdPreloadValue +LdapServerMetadata +LdapServerMetadataInput +LdapServerMetadataOutput +LdifContent +LeaseExpirationTime +LeaseId +LedgerEncryptionDescription +LedgerName +LedgerSummary +Ledgers +Left +LeftJoinKeyProperties +LeftOffset +LeftOperand +Leg +LegGeometry +LegalHold +LegalHoldArn +LegalHoldId +LegalHolds +Legend +LegendOptions +Legs +LendingDetection +LendingDocument +LendingField +LendingFields +LendingResult +LendingSummary +Length +Lens +LensAlias +LensAliases +LensArn +LensJSON +LensMetric +LensName +LensNamePrefix +LensNotes +LensReview +LensReviewReport +LensReviewSummaries +LensReviewSummary +LensShareSummaries +LensShareSummary +LensStatus +LensSummaries +LensSummary +LensType +LensUpgradeSummary +LensVersion +Lenses +LensesAppliedCount +LessThan +LessThanOrEqual +LessThanOrEquals +Level +LevelFive +LevelFour +LevelId +LevelOne +LevelThree +LevelTwo +Lex +LexBot +LexBotAliasArn +LexBotConfig +LexBots +LexConfiguration +LexRegion +LexTranscriptFilter +LexV2Bot +LexVersion +LexemesCount +Lexicon +LexiconArn +LexiconAttributes +LexiconDescription +LexiconNames +LexiconNotFoundException +LexiconSizeExceededException +Lexicons +LfeControl +LfeFilter +LibraryPath +License +LicenseAcquisitionUrl +LicenseArn +LicenseArns +LicenseBody +LicenseConfiguration +LicenseConfigurationArn +LicenseConfigurationArns +LicenseConfigurationAssociation +LicenseConfigurationAssociations +LicenseConfigurationId +LicenseConfigurationRequest +LicenseConfigurationStatus +LicenseConfigurationUsage +LicenseConfigurationUsageList +LicenseConfigurations +LicenseConsumptionToken +LicenseConversionContext +LicenseConversionTask +LicenseConversionTaskId +LicenseConversionTasks +LicenseConversionTime +LicenseCount +LicenseCountHardLimit +LicenseCountingType +LicenseInfo +LicenseManagerReportGeneratorArn +LicenseManagerResourceShareArn +LicenseMetadata +LicenseModel +LicenseName +LicenseOperationFailure +LicenseOperationFailureList +LicenseRecommendation +LicenseRecommendationFilter +LicenseRecommendationOption +LicenseRules +LicenseServiceConfiguration +LicenseSet +LicenseSpecification +LicenseSpecifications +LicenseType +LicenseUrl +LicenseUsage +LicenseUsageException +Licenses +Licensing +LifeCycle +LifeCycleLastCutover +LifeCycleLastCutoverFinalized +LifeCycleLastCutoverInitiated +LifeCycleLastCutoverReverted +LifeCycleLastLaunch +LifeCycleLastLaunchInitiated +LifeCycleLastTest +LifeCycleLastTestFinalized +LifeCycleLastTestInitiated +LifeCycleLastTestReverted +LifeCycleState +LifeCycleStatus +LifeCycleStatusFilter +Lifecycle +LifecycleActionResult +LifecycleActionToken +LifecycleConfigArn +LifecycleConfigArns +LifecycleConfigName +LifecycleConfiguration +LifecycleConfigurationDescription +LifecycleEvent +LifecycleEventAlreadyCompletedException +LifecycleEventConfiguration +LifecycleExpiration +LifecycleHook +LifecycleHookLimitExceededException +LifecycleHookName +LifecycleHookNames +LifecycleHookSpecification +LifecycleHookSpecificationList +LifecycleHookTypes +LifecycleHooks +LifecyclePolicies +LifecyclePolicy +LifecyclePolicyNotFoundException +LifecyclePolicyPreviewFilter +LifecyclePolicyPreviewInProgressException +LifecyclePolicyPreviewNotFoundException +LifecyclePolicyPreviewResult +LifecyclePolicyPreviewSummary +LifecyclePolicyRuleAction +LifecyclePolicySummary +LifecyclePolicyText +LifecycleRule +LifecycleRuleAndOperator +LifecycleRuleFilter +LifecycleState +LifecycleTransition +LifecycleTransitionReason +LifetimeInSeconds +LightsailDistribution +Limit +LimitCode +LimitExceeded +LimitExceededException +LimitExceededFault +LimitName +LimitPrice +LimitType +LimitValue +LimitValues +Limitation +Limitations +Limits +LimitsByRole +LimitsExceeded +LimitsExceededException +Line +LineChartAggregatedFieldWells +LineChartConfiguration +LineChartDefaultSeriesSettings +LineChartFieldWells +LineChartLineStyleSettings +LineChartMarkerStyleSettings +LineChartSeriesSettings +LineChartSortConfiguration +LineChartVisual +LineDataLabels +LineInterpolation +LineItem +LineItemAssetInformation +LineItemCountsByStatus +LineItemExpenseFields +LineItemFields +LineItemFilter +LineItemFilters +LineItemGroup +LineItemGroupIndex +LineItemGroups +LineItemId +LineItemRequest +LineItems +LineNumber +LineRange +LineRanges +LineSeriesAxisDisplayOptions +LineString +LineStyle +LineStyleSettings +LineTime +LineValues +LineVisibility +LineWidth +Lineage +LineageConfiguration +LineageGroupArn +LineageGroupName +LineageGroupSummaries +LineageGroupSummary +LineageObject +LineageType +LineageTypes +Linear +LinearStepSize +Link +LinkArn +LinkAssociation +LinkAssociationState +LinkAssociations +LinkAttributeAction +LinkAttributeUpdate +LinkConfiguration +LinkId +LinkIds +LinkName +LinkNameAlreadyInUseException +LinkSharingConfiguration +LinkSpecifiers +LinkToDataSetColumn +LinkedAccount +LinkedAccountIds +LinkedAccountName +LinkedAccounts +LinkedService +Links +LinuxParameters +LinuxSubscriptionsDiscovery +LinuxSubscriptionsDiscoverySettings +List +ListAPIKeysRequest +ListAPIKeysResponse +ListAWSDefaultServiceQuotasRequest +ListAWSDefaultServiceQuotasResponse +ListAWSServiceAccessForOrganizationRequest +ListAWSServiceAccessForOrganizationResponse +ListAcceleratorsRequest +ListAcceleratorsResponse +ListAcceptedPortfolioSharesInput +ListAcceptedPortfolioSharesOutput +ListAccessControlConfigurationsRequest +ListAccessControlConfigurationsResponse +ListAccessControlRulesRequest +ListAccessControlRulesResponse +ListAccessKeysRequest +ListAccessKeysResponse +ListAccessLogSubscriptionsRequest +ListAccessLogSubscriptionsResponse +ListAccessPointsForObjectLambdaRequest +ListAccessPointsForObjectLambdaResult +ListAccessPointsRequest +ListAccessPointsResult +ListAccessPoliciesRequest +ListAccessPoliciesResponse +ListAccessPreviewFindingsRequest +ListAccessPreviewFindingsResponse +ListAccessPreviewsRequest +ListAccessPreviewsResponse +ListAccessTokensRequest +ListAccessTokensResponse +ListAccessesRequest +ListAccessesResponse +ListAccessorsInput +ListAccessorsOutput +ListAccountAliasesRequest +ListAccountAliasesResponse +ListAccountAssignmentCreationStatusRequest +ListAccountAssignmentCreationStatusResponse +ListAccountAssignmentDeletionStatusRequest +ListAccountAssignmentDeletionStatusResponse +ListAccountAssignmentsRequest +ListAccountAssignmentsResponse +ListAccountAssociationsFilter +ListAccountAssociationsInput +ListAccountAssociationsOutput +ListAccountIntegrationsRequest +ListAccountIntegrationsResponse +ListAccountPermissionsRequest +ListAccountPermissionsResponse +ListAccountRolesRequest +ListAccountRolesResponse +ListAccountSettingsRequest +ListAccountSettingsResponse +ListAccountsForParentRequest +ListAccountsForParentResponse +ListAccountsForProvisionedPermissionSetRequest +ListAccountsForProvisionedPermissionSetResponse +ListAccountsRequest +ListAccountsResponse +ListActionExecutionsInput +ListActionExecutionsOutput +ListActionTypesInput +ListActionTypesOutput +ListActionsRequest +ListActionsResponse +ListActivatedRulesInRuleGroupRequest +ListActivatedRulesInRuleGroupResponse +ListActiveViolationsRequest +ListActiveViolationsResponse +ListActivitiesInput +ListActivitiesOutput +ListActivityTypesInput +ListAddonsRequest +ListAddonsResponse +ListAdminAccountsForOrganizationRequest +ListAdminAccountsForOrganizationResponse +ListAdminsManagingAccountRequest +ListAdminsManagingAccountResponse +ListAgentStatusRequest +ListAgentStatusResponse +ListAgentsRequest +ListAgentsResponse +ListAggregateDiscoveredResourcesRequest +ListAggregateDiscoveredResourcesResponse +ListAggregatedUtterancesRequest +ListAggregatedUtterancesResponse +ListAgreementsRequest +ListAgreementsResponse +ListAlarmModelVersionsRequest +ListAlarmModelVersionsResponse +ListAlarmModelsRequest +ListAlarmModelsResponse +ListAlarmRecommendationsRequest +ListAlarmRecommendationsResponse +ListAlarmsRequest +ListAlarmsResponse +ListAlertsRequest +ListAlertsResponse +ListAlgorithmsInput +ListAlgorithmsOutput +ListAliasesInput +ListAliasesOutput +ListAliasesRequest +ListAliasesResponse +ListAllowListsRequest +ListAllowListsResponse +ListAllowedNodeTypeModificationsMessage +ListAllowedNodeTypeUpdatesRequest +ListAllowedNodeTypeUpdatesResponse +ListAnalysesRequest +ListAnalysesResponse +ListAnalysisTemplatesInput +ListAnalysisTemplatesOutput +ListAnalyzedResourcesRequest +ListAnalyzedResourcesResponse +ListAnalyzersRequest +ListAnalyzersResponse +ListAnnotationImportJobsFilter +ListAnnotationImportJobsRequest +ListAnnotationImportJobsResponse +ListAnnotationStoreVersionsFilter +ListAnnotationStoreVersionsRequest +ListAnnotationStoreVersionsResponse +ListAnnotationStoresFilter +ListAnnotationStoresRequest +ListAnnotationStoresResponse +ListAnomaliesForInsightFilters +ListAnomaliesForInsightRequest +ListAnomaliesForInsightResponse +ListAnomalousLogGroupsRequest +ListAnomalousLogGroupsResponse +ListAnomalyDetectorsRequest +ListAnomalyDetectorsResponse +ListAnomalyGroupRelatedMetricsRequest +ListAnomalyGroupRelatedMetricsResponse +ListAnomalyGroupSummariesRequest +ListAnomalyGroupSummariesResponse +ListAnomalyGroupTimeSeriesRequest +ListAnomalyGroupTimeSeriesResponse +ListAnswersInput +ListAnswersOutput +ListApiDestinationsRequest +ListApiDestinationsResponse +ListApiKeysRequest +ListApiKeysResponse +ListAppAssessmentComplianceDriftsRequest +ListAppAssessmentComplianceDriftsResponse +ListAppAssessmentsRequest +ListAppAssessmentsResponse +ListAppAuthorizationsRequest +ListAppAuthorizationsResponse +ListAppBundlesRequest +ListAppBundlesResponse +ListAppComponentCompliancesRequest +ListAppComponentCompliancesResponse +ListAppComponentRecommendationsRequest +ListAppComponentRecommendationsResponse +ListAppImageConfigsRequest +ListAppImageConfigsResponse +ListAppInputSourcesRequest +ListAppInputSourcesResponse +ListAppInstanceAdminsRequest +ListAppInstanceAdminsResponse +ListAppInstanceBotsRequest +ListAppInstanceBotsResponse +ListAppInstanceUserEndpointsRequest +ListAppInstanceUserEndpointsResponse +ListAppInstanceUsersRequest +ListAppInstanceUsersResponse +ListAppInstancesRequest +ListAppInstancesResponse +ListAppMonitorsRequest +ListAppMonitorsResponse +ListAppVersionAppComponentsRequest +ListAppVersionAppComponentsResponse +ListAppVersionResourceMappingsRequest +ListAppVersionResourceMappingsResponse +ListAppVersionResourcesRequest +ListAppVersionResourcesResponse +ListAppVersionsRequest +ListAppVersionsResponse +ListApplicationComponentsRequest +ListApplicationComponentsResponse +ListApplicationDPUSizesInput +ListApplicationDPUSizesOutput +ListApplicationDependenciesRequest +ListApplicationDependenciesResponse +ListApplicationInstanceDependenciesRequest +ListApplicationInstanceDependenciesResponse +ListApplicationInstanceNodeInstancesRequest +ListApplicationInstanceNodeInstancesResponse +ListApplicationInstancesRequest +ListApplicationInstancesResponse +ListApplicationRevisionsInput +ListApplicationRevisionsOutput +ListApplicationSnapshotsRequest +ListApplicationSnapshotsResponse +ListApplicationStatesRequest +ListApplicationStatesResult +ListApplicationVersionsRequest +ListApplicationVersionsResponse +ListApplicationsInput +ListApplicationsOutput +ListApplicationsRequest +ListApplicationsRequestFilters +ListApplicationsResponse +ListAppliedSchemaArnsRequest +ListAppliedSchemaArnsResponse +ListApprovalRuleTemplatesInput +ListApprovalRuleTemplatesOutput +ListApprovedOriginsRequest +ListApprovedOriginsResponse +ListAppsInput +ListAppsListsRequest +ListAppsListsResponse +ListAppsOutput +ListAppsRequest +ListAppsResponse +ListAppsResult +ListArchiveRulesRequest +ListArchiveRulesResponse +ListArchivesRequest +ListArchivesResponse +ListArn +ListArtifactsRequest +ListArtifactsResponse +ListArtifactsResult +ListAssessmentControlInsightsByControlDomainRequest +ListAssessmentControlInsightsByControlDomainResponse +ListAssessmentFrameworkShareRequestsRequest +ListAssessmentFrameworkShareRequestsResponse +ListAssessmentFrameworksRequest +ListAssessmentFrameworksResponse +ListAssessmentReportsRequest +ListAssessmentReportsResponse +ListAssessmentRunAgentsRequest +ListAssessmentRunAgentsResponse +ListAssessmentRunsRequest +ListAssessmentRunsResponse +ListAssessmentTargetsRequest +ListAssessmentTargetsResponse +ListAssessmentTemplatesRequest +ListAssessmentTemplatesResponse +ListAssessmentsRequest +ListAssessmentsResponse +ListAssetBundleExportJobsRequest +ListAssetBundleExportJobsResponse +ListAssetBundleImportJobsRequest +ListAssetBundleImportJobsResponse +ListAssetModelPropertiesRequest +ListAssetModelPropertiesResponse +ListAssetModelsRequest +ListAssetModelsResponse +ListAssetPropertiesRequest +ListAssetPropertiesResponse +ListAssetRelationshipsRequest +ListAssetRelationshipsResponse +ListAssetsInput +ListAssetsOutput +ListAssetsRequest +ListAssetsResponse +ListAssignmentsForHITRequest +ListAssignmentsForHITResponse +ListAssistantAssociationsRequest +ListAssistantAssociationsResponse +ListAssistantsRequest +ListAssistantsResponse +ListAssociatedApprovalRuleTemplatesForRepositoryInput +ListAssociatedApprovalRuleTemplatesForRepositoryOutput +ListAssociatedAssetsRequest +ListAssociatedAssetsResponse +ListAssociatedAttributeGroupsRequest +ListAssociatedAttributeGroupsResponse +ListAssociatedFleetsRequest +ListAssociatedFleetsResult +ListAssociatedGroupsRequest +ListAssociatedGroupsResponse +ListAssociatedResourcesRequest +ListAssociatedResourcesResponse +ListAssociatedRoute53HealthChecksRequest +ListAssociatedRoute53HealthChecksResponse +ListAssociatedStacksRequest +ListAssociatedStacksResult +ListAssociationVersionsRequest +ListAssociationVersionsResult +ListAssociationsForLicenseConfigurationRequest +ListAssociationsForLicenseConfigurationResponse +ListAssociationsRequest +ListAssociationsResponse +ListAssociationsResult +ListAttachedGroupPoliciesRequest +ListAttachedGroupPoliciesResponse +ListAttachedIndices +ListAttachedIndicesRequest +ListAttachedIndicesResponse +ListAttachedLinksInput +ListAttachedLinksItem +ListAttachedLinksOutput +ListAttachedPoliciesRequest +ListAttachedPoliciesResponse +ListAttachedRolePoliciesRequest +ListAttachedRolePoliciesResponse +ListAttachedUserPoliciesRequest +ListAttachedUserPoliciesResponse +ListAttachmentsRequest +ListAttachmentsResponse +ListAttacksRequest +ListAttacksResponse +ListAttendeeTagsRequest +ListAttendeeTagsResponse +ListAttendeesRequest +ListAttendeesResponse +ListAttributeGroupsForApplicationRequest +ListAttributeGroupsForApplicationResponse +ListAttributeGroupsRequest +ListAttributeGroupsResponse +ListAttributesRequest +ListAttributesResponse +ListAuditFindingsRequest +ListAuditFindingsResponse +ListAuditMitigationActionsExecutionsRequest +ListAuditMitigationActionsExecutionsResponse +ListAuditMitigationActionsTasksRequest +ListAuditMitigationActionsTasksResponse +ListAuditSuppressionsRequest +ListAuditSuppressionsResponse +ListAuditTasksRequest +ListAuditTasksResponse +ListAuthorizersRequest +ListAuthorizersResponse +ListAutoMLJobsRequest +ListAutoMLJobsResponse +ListAutoScalingConfigurationsRequest +ListAutoScalingConfigurationsResponse +ListAutomaticTapeCreationPoliciesInput +ListAutomaticTapeCreationPoliciesOutput +ListAutomationRulesRequest +ListAutomationRulesResponse +ListAvailabilityConfigurationsRequest +ListAvailabilityConfigurationsResponse +ListAvailableManagedRuleGroupVersionsRequest +ListAvailableManagedRuleGroupVersionsResponse +ListAvailableManagedRuleGroupsRequest +ListAvailableManagedRuleGroupsResponse +ListAvailableManagementCidrRangesRequest +ListAvailableManagementCidrRangesResult +ListAvailableResourceDimensionsRequest +ListAvailableResourceDimensionsResponse +ListAvailableResourceMetricsRequest +ListAvailableResourceMetricsResponse +ListAvailableSolutionStacksResultMessage +ListAvailableVoiceConnectorRegionsResponse +ListAvailableZonesResponse +ListBackendEnvironmentsRequest +ListBackendEnvironmentsResult +ListBackendJobsRequest +ListBackendJobsResponse +ListBackupJobsInput +ListBackupJobsOutput +ListBackupPlanTemplatesInput +ListBackupPlanTemplatesOutput +ListBackupPlanVersionsInput +ListBackupPlanVersionsOutput +ListBackupPlansInput +ListBackupPlansOutput +ListBackupSelectionsInput +ListBackupSelectionsOutput +ListBackupVaultsInput +ListBackupVaultsOutput +ListBackupsInput +ListBackupsOutput +ListBatchInferenceJobsRequest +ListBatchInferenceJobsResponse +ListBatchJobDefinitionsRequest +ListBatchJobDefinitionsResponse +ListBatchJobExecutionsRequest +ListBatchJobExecutionsResponse +ListBatchLoadTasksRequest +ListBatchLoadTasksResponse +ListBatchSegmentJobsRequest +ListBatchSegmentJobsResponse +ListBillingGroupAccountGrouping +ListBillingGroupCostReportsFilter +ListBillingGroupCostReportsInput +ListBillingGroupCostReportsOutput +ListBillingGroupsFilter +ListBillingGroupsInput +ListBillingGroupsOutput +ListBillingGroupsRequest +ListBillingGroupsResponse +ListBlueprintsRequest +ListBlueprintsResponse +ListBonusPaymentsRequest +ListBonusPaymentsResponse +ListBootstrapActionsInput +ListBootstrapActionsOutput +ListBotAliasesRequest +ListBotAliasesResponse +ListBotLocalesRequest +ListBotLocalesResponse +ListBotRecommendationsRequest +ListBotRecommendationsResponse +ListBotVersionsRequest +ListBotVersionsResponse +ListBotsRequest +ListBotsResponse +ListBranchesInput +ListBranchesOutput +ListBranchesRequest +ListBranchesResult +ListBridgesRequest +ListBridgesResponse +ListBrokersRequest +ListBrokersResponse +ListBrowserSettingsRequest +ListBrowserSettingsResponse +ListBucketAnalyticsConfigurationsOutput +ListBucketAnalyticsConfigurationsRequest +ListBucketIntelligentTieringConfigurationsOutput +ListBucketIntelligentTieringConfigurationsRequest +ListBucketInventoryConfigurationsOutput +ListBucketInventoryConfigurationsRequest +ListBucketMetricsConfigurationsOutput +ListBucketMetricsConfigurationsRequest +ListBucketsOutput +ListBudgetsForResourceInput +ListBudgetsForResourceOutput +ListBuildBatchesForProjectInput +ListBuildBatchesForProjectOutput +ListBuildBatchesInput +ListBuildBatchesOutput +ListBuildsForProjectInput +ListBuildsForProjectOutput +ListBuildsInput +ListBuildsOutput +ListBuiltInIntentsRequest +ListBuiltInIntentsResponse +ListBuiltInSlotTypesRequest +ListBuiltInSlotTypesResponse +ListBulkDeploymentDetailedReportsRequest +ListBulkDeploymentDetailedReportsResponse +ListBulkDeploymentsRequest +ListBulkDeploymentsResponse +ListBulkImportJobsRequest +ListBulkImportJobsResponse +ListBundlesRequest +ListBundlesResult +ListBusinessReportSchedulesRequest +ListBusinessReportSchedulesResponse +ListBy +ListByoipCidrsRequest +ListByoipCidrsResponse +ListByteMatchSetsRequest +ListByteMatchSetsResponse +ListCACertificatesRequest +ListCACertificatesResponse +ListCachePoliciesRequest +ListCachePoliciesResult +ListCalculatedAttributeDefinitionItem +ListCalculatedAttributeDefinitionsRequest +ListCalculatedAttributeDefinitionsResponse +ListCalculatedAttributeForProfileItem +ListCalculatedAttributesForProfileRequest +ListCalculatedAttributesForProfileResponse +ListCalculationExecutionsRequest +ListCalculationExecutionsResponse +ListCallAnalyticsCategoriesRequest +ListCallAnalyticsCategoriesResponse +ListCallAnalyticsJobsRequest +ListCallAnalyticsJobsResponse +ListCampaignsRequest +ListCampaignsResponse +ListCandidatesForAutoMLJobRequest +ListCandidatesForAutoMLJobResponse +ListCapacityReservationsInput +ListCapacityReservationsOutput +ListCasesForContactRequest +ListCasesForContactResponse +ListCatalogItemsInput +ListCatalogItemsOutput +ListCellsRequest +ListCellsResponse +ListCertificateAuthoritiesRequest +ListCertificateAuthoritiesResponse +ListCertificatesByCARequest +ListCertificatesByCAResponse +ListCertificatesRequest +ListCertificatesResponse +ListCertificatesResult +ListChangeSetsInput +ListChangeSetsOutput +ListChangeSetsRequest +ListChangeSetsResponse +ListChangedBlocksRequest +ListChangedBlocksResponse +ListChangesetsRequest +ListChangesetsResponse +ListChannelBansRequest +ListChannelBansResponse +ListChannelFlowsRequest +ListChannelFlowsResponse +ListChannelGroupsRequest +ListChannelGroupsResponse +ListChannelMembershipsForAppInstanceUserRequest +ListChannelMembershipsForAppInstanceUserResponse +ListChannelMembershipsRequest +ListChannelMembershipsResponse +ListChannelMessagesRequest +ListChannelMessagesResponse +ListChannelModeratorsRequest +ListChannelModeratorsResponse +ListChannelsAssociatedWithChannelFlowRequest +ListChannelsAssociatedWithChannelFlowResponse +ListChannelsModeratedByAppInstanceUserRequest +ListChannelsModeratedByAppInstanceUserResponse +ListChannelsRequest +ListChannelsResponse +ListCheckDetailsInput +ListCheckDetailsOutput +ListCheckSummariesInput +ListCheckSummariesOutput +ListChildrenRequest +ListChildrenResponse +ListChunksInput +ListChunksOutput +ListCidrBlocksRequest +ListCidrBlocksResponse +ListCidrCollectionsRequest +ListCidrCollectionsResponse +ListCidrLocationsRequest +ListCidrLocationsResponse +ListClassificationJobsRequest +ListClassificationJobsResponse +ListClassificationScopesRequest +ListClassificationScopesResponse +ListClientDevicesAssociatedWithCoreDeviceRequest +ListClientDevicesAssociatedWithCoreDeviceResponse +ListClientVpcConnectionsRequest +ListClientVpcConnectionsResponse +ListClosedWorkflowExecutionsInput +ListCloudFrontOriginAccessIdentitiesRequest +ListCloudFrontOriginAccessIdentitiesResult +ListClusterJobsRequest +ListClusterJobsResult +ListClusterOperationsRequest +ListClusterOperationsResponse +ListClusterOperationsV2Request +ListClusterOperationsV2Response +ListClusterSnapshotsInput +ListClusterSnapshotsOutput +ListClustersInput +ListClustersOutput +ListClustersRequest +ListClustersResponse +ListClustersResult +ListClustersV2Request +ListClustersV2Response +ListCodeRepositoriesInput +ListCodeRepositoriesOutput +ListCodeReviewsRequest +ListCodeReviewsResponse +ListCodeSigningConfigsRequest +ListCodeSigningConfigsResponse +ListCodegenJobsRequest +ListCodegenJobsResponse +ListCollaborationAnalysisTemplatesInput +ListCollaborationAnalysisTemplatesOutput +ListCollaborationsInput +ListCollaborationsOutput +ListCollectionsRequest +ListCollectionsResponse +ListCollectorsRequest +ListCollectorsResponse +ListCommandInvocationsRequest +ListCommandInvocationsResult +ListCommandsRequest +ListCommandsResult +ListCompatibleImagesRequest +ListCompatibleImagesResult +ListCompilationJobsRequest +ListCompilationJobsResponse +ListComplianceItemsRequest +ListComplianceItemsResult +ListComplianceStatusRequest +ListComplianceStatusResponse +ListComplianceSummariesRequest +ListComplianceSummariesResult +ListComponentBuildVersionsRequest +ListComponentBuildVersionsResponse +ListComponentOutputsInput +ListComponentOutputsOutput +ListComponentProvisionedResourcesInput +ListComponentProvisionedResourcesOutput +ListComponentTypesRequest +ListComponentTypesResponse +ListComponentVersionsRequest +ListComponentVersionsResponse +ListComponentsInput +ListComponentsOutput +ListComponentsRequest +ListComponentsResponse +ListComputeInput +ListComputeOutput +ListConferenceProvidersRequest +ListConferenceProvidersResponse +ListConfigsRequest +ListConfigsResponse +ListConfigurationHistoryRequest +ListConfigurationHistoryResponse +ListConfigurationProfilesRequest +ListConfigurationRevisionsRequest +ListConfigurationRevisionsResponse +ListConfigurationSetsRequest +ListConfigurationSetsResponse +ListConfigurationsRequest +ListConfigurationsResponse +ListConfiguredTableAssociationsInput +ListConfiguredTableAssociationsOutput +ListConfiguredTablesInput +ListConfiguredTablesOutput +ListConflictingAliasesRequest +ListConflictingAliasesResult +ListConformancePackComplianceScoresRequest +ListConformancePackComplianceScoresResponse +ListConnectPeersRequest +ListConnectPeersResponse +ListConnectionsInput +ListConnectionsOutput +ListConnectionsRequest +ListConnectionsResponse +ListConnectorDefinitionVersionsRequest +ListConnectorDefinitionVersionsResponse +ListConnectorDefinitionsRequest +ListConnectorDefinitionsResponse +ListConnectorEntitiesRequest +ListConnectorEntitiesResponse +ListConnectorsRequest +ListConnectorsResponse +ListConstraintsForPortfolioInput +ListConstraintsForPortfolioOutput +ListContactChannelsRequest +ListContactChannelsResult +ListContactEvaluationsRequest +ListContactEvaluationsResponse +ListContactFlowModulesRequest +ListContactFlowModulesResponse +ListContactFlowsRequest +ListContactFlowsResponse +ListContactListsRequest +ListContactListsResponse +ListContactReferencesRequest +ListContactReferencesResponse +ListContactsFilter +ListContactsRequest +ListContactsResponse +ListContactsResult +ListContainerInstancesRequest +ListContainerInstancesResponse +ListContainerRecipesRequest +ListContainerRecipesResponse +ListContainersInput +ListContainersOutput +ListContentsRequest +ListContentsResponse +ListContextsRequest +ListContextsResponse +ListContinuousDeploymentPoliciesRequest +ListContinuousDeploymentPoliciesResult +ListContributorInsightsInput +ListContributorInsightsOutput +ListControlDisplayOptions +ListControlDomainInsightsByAssessmentRequest +ListControlDomainInsightsByAssessmentResponse +ListControlDomainInsightsRequest +ListControlDomainInsightsResponse +ListControlInsightsByControlDomainRequest +ListControlInsightsByControlDomainResponse +ListControlPanelsRequest +ListControlPanelsResponse +ListControlSearchOptions +ListControlSelectAllOptions +ListControlsRequest +ListControlsResponse +ListCopyJobsInput +ListCopyJobsOutput +ListCoreDefinitionVersionsRequest +ListCoreDefinitionVersionsResponse +ListCoreDefinitionsRequest +ListCoreDefinitionsResponse +ListCoreDevicesRequest +ListCoreDevicesResponse +ListCoreNetworkPolicyVersionsRequest +ListCoreNetworkPolicyVersionsResponse +ListCoreNetworksRequest +ListCoreNetworksResponse +ListCostAllocationTagsRequest +ListCostAllocationTagsResponse +ListCostCategoryDefinitionsRequest +ListCostCategoryDefinitionsResponse +ListCoverageRequest +ListCoverageResponse +ListCoverageStatisticsRequest +ListCoverageStatisticsResponse +ListCrawlersRequest +ListCrawlersResponse +ListCrawlsRequest +ListCrawlsResponse +ListCreateAccountStatusRequest +ListCreateAccountStatusResponse +ListCreatedArtifactsRequest +ListCreatedArtifactsResult +ListCrlsResponse +ListCrossAccountAuthorizationsRequest +ListCrossAccountAuthorizationsResponse +ListCuratedEnvironmentImagesOutput +ListCustomDataIdentifiersRequest +ListCustomDataIdentifiersResponse +ListCustomEntityTypesRequest +ListCustomEntityTypesResponse +ListCustomLineItemChargeDetails +ListCustomLineItemFlatChargeDetails +ListCustomLineItemPercentageChargeDetails +ListCustomLineItemVersionsBillingPeriodRangeFilter +ListCustomLineItemVersionsFilter +ListCustomLineItemVersionsInput +ListCustomLineItemVersionsOutput +ListCustomLineItemsFilter +ListCustomLineItemsInput +ListCustomLineItemsOutput +ListCustomMetricsRequest +ListCustomMetricsResponse +ListCustomModelsRequest +ListCustomModelsResponse +ListCustomPluginsRequest +ListCustomPluginsResponse +ListCustomRoutingAcceleratorsRequest +ListCustomRoutingAcceleratorsResponse +ListCustomRoutingEndpointGroupsRequest +ListCustomRoutingEndpointGroupsResponse +ListCustomRoutingListenersRequest +ListCustomRoutingListenersResponse +ListCustomRoutingPortMappingsByDestinationRequest +ListCustomRoutingPortMappingsByDestinationResponse +ListCustomRoutingPortMappingsRequest +ListCustomRoutingPortMappingsResponse +ListCustomVerificationEmailTemplatesRequest +ListCustomVerificationEmailTemplatesResponse +ListCustomVocabularyItemsRequest +ListCustomVocabularyItemsResponse +ListCustomerManagedPolicyReferencesInPermissionSetRequest +ListCustomerManagedPolicyReferencesInPermissionSetResponse +ListDICOMImportJobsRequest +ListDICOMImportJobsResponse +ListDashboardVersionsRequest +ListDashboardVersionsResponse +ListDashboardsInput +ListDashboardsOutput +ListDashboardsRequest +ListDashboardsResponse +ListDataCatalogsInput +ListDataCatalogsOutput +ListDataCellsFilterRequest +ListDataCellsFilterResponse +ListDataIngestionJobsRequest +ListDataIngestionJobsResponse +ListDataIntegrationAssociationsRequest +ListDataIntegrationAssociationsResponse +ListDataIntegrationsRequest +ListDataIntegrationsResponse +ListDataLakeExceptionsRequest +ListDataLakeExceptionsResponse +ListDataLakesRequest +ListDataLakesResponse +ListDataQualityJobDefinitionsRequest +ListDataQualityJobDefinitionsResponse +ListDataQualityResultsRequest +ListDataQualityResultsResponse +ListDataQualityRuleRecommendationRunsRequest +ListDataQualityRuleRecommendationRunsResponse +ListDataQualityRulesetEvaluationRunsRequest +ListDataQualityRulesetEvaluationRunsResponse +ListDataQualityRulesetsRequest +ListDataQualityRulesetsResponse +ListDataSetImportHistoryRequest +ListDataSetImportHistoryResponse +ListDataSetRevisionsRequest +ListDataSetRevisionsResponse +ListDataSetsRequest +ListDataSetsResponse +ListDataSourceSyncJobsRequest +ListDataSourceSyncJobsResponse +ListDataSourcesRequest +ListDataSourcesResponse +ListDataViewsRequest +ListDataViewsResponse +ListDatabasesInput +ListDatabasesOutput +ListDatabasesRequest +ListDatabasesResponse +ListDataflowEndpointGroupsRequest +ListDataflowEndpointGroupsResponse +ListDatasetContentsRequest +ListDatasetContentsResponse +ListDatasetEntriesRequest +ListDatasetEntriesResponse +ListDatasetExportJobsRequest +ListDatasetExportJobsResponse +ListDatasetGroupsRequest +ListDatasetGroupsResponse +ListDatasetImportJobsRequest +ListDatasetImportJobsResponse +ListDatasetLabelsRequest +ListDatasetLabelsResponse +ListDatasetsRequest +ListDatasetsResponse +ListDatasourcePackagesRequest +ListDatasourcePackagesResponse +ListDatastoresRequest +ListDatastoresResponse +ListDeadLetterSourceQueuesRequest +ListDeadLetterSourceQueuesResult +ListDecoderManifestNetworkInterfacesRequest +ListDecoderManifestNetworkInterfacesResponse +ListDecoderManifestSignalsRequest +ListDecoderManifestSignalsResponse +ListDecoderManifestsRequest +ListDecoderManifestsResponse +ListDedicatedIpPoolsRequest +ListDedicatedIpPoolsResponse +ListDefaultVocabulariesRequest +ListDefaultVocabulariesResponse +ListDelegatedAdminAccountsRequest +ListDelegatedAdminAccountsResponse +ListDelegatedAdministratorsRequest +ListDelegatedAdministratorsResponse +ListDelegatedServicesForAccountRequest +ListDelegatedServicesForAccountResponse +ListDeliverabilityTestReportsRequest +ListDeliverabilityTestReportsResponse +ListDeliveryStreamsInput +ListDeliveryStreamsOutput +ListDeploymentConfigsInput +ListDeploymentConfigsOutput +ListDeploymentGroupsInput +ListDeploymentGroupsOutput +ListDeploymentInstancesInput +ListDeploymentInstancesOutput +ListDeploymentJobsRequest +ListDeploymentJobsResponse +ListDeploymentStrategiesRequest +ListDeploymentTargetsInput +ListDeploymentTargetsOutput +ListDeploymentsInput +ListDeploymentsOutput +ListDeploymentsRequest +ListDeploymentsResponse +ListDestinationsRequest +ListDestinationsResponse +ListDetectMitigationActionsExecutionsRequest +ListDetectMitigationActionsExecutionsResponse +ListDetectMitigationActionsTasksRequest +ListDetectMitigationActionsTasksResponse +ListDetectorModelVersionsRequest +ListDetectorModelVersionsResponse +ListDetectorModelsRequest +ListDetectorModelsResponse +ListDetectorsRequest +ListDetectorsResponse +ListDevEndpointsRequest +ListDevEndpointsResponse +ListDevEnvironmentSessionsRequest +ListDevEnvironmentSessionsResponse +ListDevEnvironmentsRequest +ListDevEnvironmentsResponse +ListDevelopmentSchemaArnsRequest +ListDevelopmentSchemaArnsResponse +ListDeviceDefinitionVersionsRequest +ListDeviceDefinitionVersionsResponse +ListDeviceDefinitionsRequest +ListDeviceDefinitionsResponse +ListDeviceEventsRequest +ListDeviceEventsResponse +ListDeviceFleetsRequest +ListDeviceFleetsResponse +ListDeviceIdentifiersRequest +ListDeviceIdentifiersResponse +ListDeviceInstancesRequest +ListDeviceInstancesResult +ListDevicePoolsRequest +ListDevicePoolsResult +ListDevicePositionsRequest +ListDevicePositionsResponse +ListDevicePositionsResponseEntry +ListDeviceProfilesRequest +ListDeviceProfilesResponse +ListDeviceResourcesInput +ListDeviceResourcesOutput +ListDevicesForWirelessDeviceImportTaskRequest +ListDevicesForWirelessDeviceImportTaskResponse +ListDevicesInput +ListDevicesJobsRequest +ListDevicesJobsResponse +ListDevicesOutput +ListDevicesRequest +ListDevicesResponse +ListDevicesResult +ListDimensionsRequest +ListDimensionsResponse +ListDirectoriesRequest +ListDirectoriesResponse +ListDirectoryRegistrationsRequest +ListDirectoryRegistrationsResponse +ListDiscoveredResourcesRequest +ListDiscoveredResourcesResponse +ListDiscoveredResourcesResult +ListDiscoverersRequest +ListDiscoverersResponse +ListDiscoveryJobsRequest +ListDiscoveryJobsResponse +ListDistributedGrantsRequest +ListDistributedGrantsResponse +ListDistributionConfigurationsRequest +ListDistributionConfigurationsResponse +ListDistributionsByCachePolicyIdRequest +ListDistributionsByCachePolicyIdResult +ListDistributionsByKeyGroupRequest +ListDistributionsByKeyGroupResult +ListDistributionsByOriginRequestPolicyIdRequest +ListDistributionsByOriginRequestPolicyIdResult +ListDistributionsByRealtimeLogConfigRequest +ListDistributionsByRealtimeLogConfigResult +ListDistributionsByResponseHeadersPolicyIdRequest +ListDistributionsByResponseHeadersPolicyIdResult +ListDistributionsByWebACLIdRequest +ListDistributionsByWebACLIdResult +ListDistributionsRequest +ListDistributionsResult +ListDocumentClassificationJobsRequest +ListDocumentClassificationJobsResponse +ListDocumentClassifierSummariesRequest +ListDocumentClassifierSummariesResponse +ListDocumentClassifiersRequest +ListDocumentClassifiersResponse +ListDocumentMetadataHistoryRequest +ListDocumentMetadataHistoryResponse +ListDocumentVersionsRequest +ListDocumentVersionsResult +ListDocumentsRequest +ListDocumentsResult +ListDomainAssociationsRequest +ListDomainAssociationsResult +ListDomainConfigurationsRequest +ListDomainConfigurationsResponse +ListDomainDeliverabilityCampaignsRequest +ListDomainDeliverabilityCampaignsResponse +ListDomainItem +ListDomainNamesRequest +ListDomainNamesResponse +ListDomainsForPackageRequest +ListDomainsForPackageResponse +ListDomainsInput +ListDomainsRequest +ListDomainsResponse +ListDomainsResult +ListDominantLanguageDetectionJobsRequest +ListDominantLanguageDetectionJobsResponse +ListEarthObservationJobInput +ListEarthObservationJobOutput +ListEarthObservationJobOutputConfig +ListEdgeAgentConfigurationsEdgeConfig +ListEdgeAgentConfigurationsInput +ListEdgeAgentConfigurationsOutput +ListEdgeDeploymentPlansRequest +ListEdgeDeploymentPlansResponse +ListEdgePackagingJobsRequest +ListEdgePackagingJobsResponse +ListEffectiveDeploymentsRequest +ListEffectiveDeploymentsResponse +ListElasticsearchInstanceTypesRequest +ListElasticsearchInstanceTypesResponse +ListElasticsearchVersionsRequest +ListElasticsearchVersionsResponse +ListEmailIdentitiesRequest +ListEmailIdentitiesResponse +ListEmailTemplatesRequest +ListEmailTemplatesResponse +ListEnabledControlsInput +ListEnabledControlsOutput +ListEnabledProductsForImportRequest +ListEnabledProductsForImportResponse +ListEndpointAccessRequest +ListEndpointAccessResponse +ListEndpointConfigsInput +ListEndpointConfigsOutput +ListEndpointGroupsRequest +ListEndpointGroupsResponse +ListEndpointsByPlatformApplicationInput +ListEndpointsByPlatformApplicationResponse +ListEndpointsInput +ListEndpointsOutput +ListEndpointsRequest +ListEndpointsResponse +ListEndpointsResult +ListEngagementsRequest +ListEngagementsResult +ListEngineVersionsInput +ListEngineVersionsOutput +ListEngineVersionsRequest +ListEngineVersionsResponse +ListEntitiesDetectionJobsRequest +ListEntitiesDetectionJobsResponse +ListEntitiesDetectionV2JobsRequest +ListEntitiesDetectionV2JobsResponse +ListEntitiesForPolicyRequest +ListEntitiesForPolicyResponse +ListEntitiesRequest +ListEntitiesResponse +ListEntitledApplicationsRequest +ListEntitledApplicationsResult +ListEntitlementsRequest +ListEntitlementsResponse +ListEntityPersonasRequest +ListEntityPersonasResponse +ListEntityRecognizerSummariesRequest +ListEntityRecognizerSummariesResponse +ListEntityRecognizersRequest +ListEntityRecognizersResponse +ListEnvironmentAccountConnectionsInput +ListEnvironmentAccountConnectionsOutput +ListEnvironmentOutputsInput +ListEnvironmentOutputsOutput +ListEnvironmentProvisionedResourcesInput +ListEnvironmentProvisionedResourcesOutput +ListEnvironmentTemplateVersionsInput +ListEnvironmentTemplateVersionsOutput +ListEnvironmentTemplatesInput +ListEnvironmentTemplatesOutput +ListEnvironmentVpcsRequest +ListEnvironmentVpcsResponse +ListEnvironmentsInput +ListEnvironmentsOutput +ListEnvironmentsRequest +ListEnvironmentsResponse +ListEnvironmentsResult +ListEphemeridesRequest +ListEphemeridesResponse +ListEulaAcceptancesRequest +ListEulaAcceptancesResponse +ListEulasRequest +ListEulasResponse +ListEvaluationFormVersionsRequest +ListEvaluationFormVersionsResponse +ListEvaluationFormsRequest +ListEvaluationFormsResponse +ListEventActionsRequest +ListEventActionsResponse +ListEventBusesRequest +ListEventBusesResponse +ListEventConfigurationsRequest +ListEventConfigurationsResponse +ListEventDataStoresRequest +ListEventDataStoresResponse +ListEventIntegrationAssociationsRequest +ListEventIntegrationAssociationsResponse +ListEventIntegrationsRequest +ListEventIntegrationsResponse +ListEventLogsRequest +ListEventLogsResponse +ListEventPredictionsRequest +ListEventPredictionsResult +ListEventSourceMappingsRequest +ListEventSourceMappingsResponse +ListEventSourcesRequest +ListEventSourcesResponse +ListEventStreamsRequest +ListEventStreamsResponse +ListEventSubscriptionsRequest +ListEventSubscriptionsResponse +ListEventTrackersRequest +ListEventTrackersResponse +ListEventTypesFilter +ListEventTypesRequest +ListEventTypesResult +ListEventsDetectionJobsRequest +ListEventsDetectionJobsResponse +ListEventsFilters +ListEventsRequest +ListEventsResponse +ListExclusionsRequest +ListExclusionsResponse +ListExecutionsInput +ListExecutionsOutput +ListExecutionsRequest +ListExecutionsResponse +ListExecutorsRequest +ListExecutorsResponse +ListExperienceEntitiesRequest +ListExperienceEntitiesResponse +ListExperiencesRequest +ListExperiencesResponse +ListExperimentTemplatesRequest +ListExperimentTemplatesResponse +ListExperimentsRequest +ListExperimentsResponse +ListExplainabilitiesRequest +ListExplainabilitiesResponse +ListExplainabilityExportsRequest +ListExplainabilityExportsResponse +ListExportErrorsRequest +ListExportErrorsResponse +ListExportJobsRequest +ListExportJobsResponse +ListExportsInput +ListExportsOutput +ListExportsRequest +ListExportsRequestFilters +ListExportsResponse +ListExtensibleSourceServersRequest +ListExtensibleSourceServersResponse +ListExtensionAssociationsRequest +ListExtensionVersionsRequest +ListExtensionVersionsResult +ListExtensionsRequest +ListExtensionsResult +ListFHIRDatastoresRequest +ListFHIRDatastoresResponse +ListFHIRExportJobsRequest +ListFHIRExportJobsResponse +ListFHIRImportJobsRequest +ListFHIRImportJobsResponse +ListFacesRequest +ListFacesResponse +ListFacetAttributesRequest +ListFacetAttributesResponse +ListFacetNamesRequest +ListFacetNamesResponse +ListFailuresForLicenseConfigurationOperationsRequest +ListFailuresForLicenseConfigurationOperationsResponse +ListFaqsRequest +ListFaqsResponse +ListFargateProfilesRequest +ListFargateProfilesResponse +ListFeatureGroupsRequest +ListFeatureGroupsResponse +ListFeaturedResultsSetsRequest +ListFeaturedResultsSetsResponse +ListFeaturesRequest +ListFeaturesResponse +ListFieldLevelEncryptionConfigsRequest +ListFieldLevelEncryptionConfigsResult +ListFieldLevelEncryptionProfilesRequest +ListFieldLevelEncryptionProfilesResult +ListFieldOptionsRequest +ListFieldOptionsResponse +ListFieldsRequest +ListFieldsResponse +ListFileCommitHistoryRequest +ListFileCommitHistoryResponse +ListFileSharesInput +ListFileSharesOutput +ListFileSystemAssociationsInput +ListFileSystemAssociationsOutput +ListFiltersRequest +ListFiltersResponse +ListFindingAggregationsRequest +ListFindingAggregationsResponse +ListFindingAggregatorsRequest +ListFindingAggregatorsResponse +ListFindingsFiltersRequest +ListFindingsFiltersResponse +ListFindingsMetricsRequest +ListFindingsMetricsResponse +ListFindingsReportsRequest +ListFindingsReportsResponse +ListFindingsRequest +ListFindingsResponse +ListFirewallConfigsRequest +ListFirewallConfigsResponse +ListFirewallDomainListsRequest +ListFirewallDomainListsResponse +ListFirewallDomainsRequest +ListFirewallDomainsResponse +ListFirewallPoliciesRequest +ListFirewallPoliciesResponse +ListFirewallRuleGroupAssociationsRequest +ListFirewallRuleGroupAssociationsResponse +ListFirewallRuleGroupsRequest +ListFirewallRuleGroupsResponse +ListFirewallRulesRequest +ListFirewallRulesResponse +ListFirewallsRequest +ListFirewallsResponse +ListFleetMetricsRequest +ListFleetMetricsResponse +ListFleetsForVehicleRequest +ListFleetsForVehicleResponse +ListFleetsInput +ListFleetsOutput +ListFleetsRequest +ListFleetsResponse +ListFlowDefinitionsRequest +ListFlowDefinitionsResponse +ListFlowExecutionMessagesRequest +ListFlowExecutionMessagesResponse +ListFlowsRequest +ListFlowsResponse +ListFlywheelIterationHistoryRequest +ListFlywheelIterationHistoryResponse +ListFlywheelsRequest +ListFlywheelsResponse +ListFolderMembersRequest +ListFolderMembersResponse +ListFoldersRequest +ListFoldersResponse +ListForecastExportJobsRequest +ListForecastExportJobsResponse +ListForecastsRequest +ListForecastsResponse +ListFormsRequest +ListFormsResponse +ListFoundationModelsRequest +ListFoundationModelsResponse +ListFragmentsInput +ListFragmentsOutput +ListFrameworksInput +ListFrameworksOutput +ListFraudsterRegistrationJobsRequest +ListFraudsterRegistrationJobsResponse +ListFraudstersRequest +ListFraudstersResponse +ListFunctionDefinitionVersionsRequest +ListFunctionDefinitionVersionsResponse +ListFunctionDefinitionsRequest +ListFunctionDefinitionsResponse +ListFunctionEventInvokeConfigsRequest +ListFunctionEventInvokeConfigsResponse +ListFunctionUrlConfigsRequest +ListFunctionUrlConfigsResponse +ListFunctionsByCodeSigningConfigRequest +ListFunctionsByCodeSigningConfigResponse +ListFunctionsRequest +ListFunctionsResponse +ListFunctionsResult +ListFuotaTasksRequest +ListFuotaTasksResponse +ListGameServerGroupsInput +ListGameServerGroupsOutput +ListGameServersInput +ListGameServersOutput +ListGamesRequest +ListGamesResult +ListGatewayGroupsRequest +ListGatewayGroupsResponse +ListGatewayInstancesRequest +ListGatewayInstancesResponse +ListGatewayRoutesInput +ListGatewayRoutesOutput +ListGatewaysInput +ListGatewaysOutput +ListGatewaysRequest +ListGatewaysResponse +ListGeneratedCodeJobsRequest +ListGeneratedCodeJobsResult +ListGeoLocationsRequest +ListGeoLocationsResponse +ListGeoMatchSetsRequest +ListGeoMatchSetsResponse +ListGeofenceCollectionsRequest +ListGeofenceCollectionsResponse +ListGeofenceCollectionsResponseEntry +ListGeofenceResponseEntry +ListGeofencesRequest +ListGeofencesResponse +ListGitHubAccountTokenNamesInput +ListGitHubAccountTokenNamesOutput +ListGlobalTablesInput +ListGlobalTablesOutput +ListGrantsRequest +ListGrantsResponse +ListGraphqlApisRequest +ListGraphqlApisResponse +ListGraphsRequest +ListGraphsResponse +ListGremlinQueriesInput +ListGremlinQueriesOutput +ListGroundStationsRequest +ListGroundStationsResponse +ListGroupCertificateAuthoritiesRequest +ListGroupCertificateAuthoritiesResponse +ListGroupMembersRequest +ListGroupMembersResponse +ListGroupMembershipsForMemberRequest +ListGroupMembershipsForMemberResponse +ListGroupMembershipsRequest +ListGroupMembershipsResponse +ListGroupPoliciesRequest +ListGroupPoliciesResponse +ListGroupResourcesInput +ListGroupResourcesItem +ListGroupResourcesOutput +ListGroupResourcesRequest +ListGroupResourcesResponse +ListGroupVersionsRequest +ListGroupVersionsResponse +ListGroupsFilters +ListGroupsForEntityFilters +ListGroupsForEntityRequest +ListGroupsForEntityResponse +ListGroupsForUserRequest +ListGroupsForUserResponse +ListGroupsInput +ListGroupsOlderThanOrderingIdRequest +ListGroupsOlderThanOrderingIdResponse +ListGroupsOutput +ListGroupsRequest +ListGroupsResponse +ListHITsForQualificationTypeRequest +ListHITsForQualificationTypeResponse +ListHITsRequest +ListHITsResponse +ListHandshakesForAccountRequest +ListHandshakesForAccountResponse +ListHandshakesForOrganizationRequest +ListHandshakesForOrganizationResponse +ListHapgsRequest +ListHapgsResponse +ListHarvestJobsRequest +ListHarvestJobsResponse +ListHealthChecksRequest +ListHealthChecksResponse +ListHealthEventsInput +ListHealthEventsOutput +ListHlsManifestConfiguration +ListHostKeysRequest +ListHostKeysResponse +ListHostedConfigurationVersionsRequest +ListHostedZonesByNameRequest +ListHostedZonesByNameResponse +ListHostedZonesByVPCRequest +ListHostedZonesByVPCResponse +ListHostedZonesRequest +ListHostedZonesResponse +ListHostsInput +ListHostsOutput +ListHoursOfOperationsRequest +ListHoursOfOperationsResponse +ListHsmsRequest +ListHsmsResponse +ListHubContentVersionsRequest +ListHubContentVersionsResponse +ListHubContentsRequest +ListHubContentsResponse +ListHubsRequest +ListHubsResponse +ListHumanLoopsRequest +ListHumanLoopsResponse +ListHumanTaskUisRequest +ListHumanTaskUisResponse +ListHyperParameterTuningJobsRequest +ListHyperParameterTuningJobsResponse +ListHypervisorsInput +ListHypervisorsOutput +ListIAMPolicyAssignmentsForUserRequest +ListIAMPolicyAssignmentsForUserResponse +ListIAMPolicyAssignmentsRequest +ListIAMPolicyAssignmentsResponse +ListICD10CMInferenceJobsRequest +ListICD10CMInferenceJobsResponse +ListIPSetsRequest +ListIPSetsResponse +ListId +ListIdentitiesInput +ListIdentitiesRequest +ListIdentitiesResponse +ListIdentityPoliciesRequest +ListIdentityPoliciesResponse +ListIdentityPoolUsageRequest +ListIdentityPoolUsageResponse +ListIdentityPoolsInput +ListIdentityPoolsResponse +ListIdentityProviderConfigsRequest +ListIdentityProviderConfigsResponse +ListIdentityProvidersRequest +ListIdentityProvidersResponse +ListIdentityResolutionJobsRequest +ListIdentityResolutionJobsResponse +ListIdentitySourcesInput +ListIdentitySourcesOutput +ListImageBuildVersionsRequest +ListImageBuildVersionsResponse +ListImagePackagesRequest +ListImagePackagesResponse +ListImagePipelineImagesRequest +ListImagePipelineImagesResponse +ListImagePipelinesRequest +ListImagePipelinesResponse +ListImageRecipesRequest +ListImageRecipesResponse +ListImageScanFindingAggregationsRequest +ListImageScanFindingAggregationsResponse +ListImageScanFindingsRequest +ListImageScanFindingsResponse +ListImageSetVersionsRequest +ListImageSetVersionsResponse +ListImageVersionsRequest +ListImageVersionsResponse +ListImagesFilter +ListImagesInRecycleBinRequest +ListImagesInRecycleBinResult +ListImagesRequest +ListImagesResponse +ListImpersonationRolesRequest +ListImpersonationRolesResponse +ListImportErrorsRequest +ListImportErrorsResponse +ListImportFailuresRequest +ListImportFailuresResponse +ListImportFileTaskRequest +ListImportFileTaskResponse +ListImportJobsRequest +ListImportJobsResponse +ListImportsInput +ListImportsOutput +ListImportsRequest +ListImportsRequestFilters +ListImportsResponse +ListIncidentRecordsInput +ListIncidentRecordsOutput +ListIncomingTypedLinks +ListIncomingTypedLinksRequest +ListIncomingTypedLinksResponse +ListIndex +ListIndexRequest +ListIndexResponse +ListIndexesInput +ListIndexesOutput +ListIndicesRequest +ListIndicesResponse +ListInferenceEventsRequest +ListInferenceEventsResponse +ListInferenceExecutionsRequest +ListInferenceExecutionsResponse +ListInferenceExperimentsRequest +ListInferenceExperimentsResponse +ListInferenceRecommendationsJobStepsRequest +ListInferenceRecommendationsJobStepsResponse +ListInferenceRecommendationsJobsRequest +ListInferenceRecommendationsJobsResponse +ListInferenceSchedulersRequest +ListInferenceSchedulersResponse +ListInfrastructureConfigurationsRequest +ListInfrastructureConfigurationsResponse +ListIngestionDestinationsRequest +ListIngestionDestinationsResponse +ListIngestionsRequest +ListIngestionsResponse +ListInputDeviceTransfersRequest +ListInputDeviceTransfersResponse +ListInputDevicesRequest +ListInputDevicesResponse +ListInputRoutingsRequest +ListInputRoutingsResponse +ListInputSecurityGroupsRequest +ListInputSecurityGroupsResponse +ListInputsRequest +ListInputsResponse +ListInsightsAnyStatusFilter +ListInsightsClosedStatusFilter +ListInsightsOngoingStatusFilter +ListInsightsRequest +ListInsightsResponse +ListInsightsStatusFilter +ListInstalledComponentsRequest +ListInstalledComponentsResponse +ListInstanceAttributesRequest +ListInstanceAttributesResponse +ListInstanceFleetsInput +ListInstanceFleetsOutput +ListInstanceGroupsInput +ListInstanceGroupsOutput +ListInstanceProfileTagsRequest +ListInstanceProfileTagsResponse +ListInstanceProfilesForRoleRequest +ListInstanceProfilesForRoleResponse +ListInstanceProfilesRequest +ListInstanceProfilesResponse +ListInstanceProfilesResult +ListInstanceStorageConfigsRequest +ListInstanceStorageConfigsResponse +ListInstanceTypeDetailsRequest +ListInstanceTypeDetailsResponse +ListInstancesInput +ListInstancesOutput +ListInstancesRequest +ListInstancesResponse +ListIntegrationAssociationsRequest +ListIntegrationAssociationsResponse +ListIntegrationItem +ListIntegrationsRequest +ListIntegrationsResponse +ListIntentMetricsRequest +ListIntentMetricsResponse +ListIntentPathsRequest +ListIntentPathsResponse +ListIntentStageMetricsRequest +ListIntentStageMetricsResponse +ListIntentsRequest +ListIntentsResponse +ListInvalidationsRequest +ListInvalidationsResult +ListInventoryEntriesRequest +ListInventoryEntriesResult +ListInvitationsInput +ListInvitationsOutput +ListInvitationsRequest +ListInvitationsResponse +ListIpAccessSettingsRequest +ListIpAccessSettingsResponse +ListIpRoutesRequest +ListIpRoutesResult +ListItemsRequest +ListItemsResponse +ListJobExecutionsForJobRequest +ListJobExecutionsForJobResponse +ListJobExecutionsForThingRequest +ListJobExecutionsForThingResponse +ListJobRunsRequest +ListJobRunsResponse +ListJobTemplatesRequest +ListJobTemplatesResponse +ListJobsByPipelineRequest +ListJobsByPipelineResponse +ListJobsByStatusRequest +ListJobsByStatusResponse +ListJobsFilterCriteria +ListJobsFilterTerm +ListJobsInput +ListJobsOutput +ListJobsRequest +ListJobsResponse +ListJobsResult +ListJobsSortCriteria +ListJournalKinesisStreamsForLedgerRequest +ListJournalKinesisStreamsForLedgerResponse +ListJournalS3ExportsForLedgerRequest +ListJournalS3ExportsForLedgerResponse +ListJournalS3ExportsRequest +ListJournalS3ExportsResponse +ListJourneysRequest +ListJourneysResponse +ListKafkaVersionsRequest +ListKafkaVersionsResponse +ListKeyGroupsRequest +ListKeyGroupsResult +ListKeyPhrasesDetectionJobsRequest +ListKeyPhrasesDetectionJobsResponse +ListKeyPoliciesRequest +ListKeyPoliciesResponse +ListKeysInput +ListKeysOutput +ListKeysRequest +ListKeysResponse +ListKeysResponseEntry +ListKeyspacesRequest +ListKeyspacesResponse +ListKeywordsForDataSourceRequest +ListKeywordsForDataSourceResponse +ListKnowledgeBasesRequest +ListKnowledgeBasesResponse +ListKxChangesetsRequest +ListKxChangesetsResponse +ListKxClusterNodesRequest +ListKxClusterNodesResponse +ListKxClustersRequest +ListKxClustersResponse +ListKxDatabasesRequest +ListKxDatabasesResponse +ListKxEnvironmentsRequest +ListKxEnvironmentsResponse +ListKxUsersRequest +ListKxUsersResponse +ListLFTagsRequest +ListLFTagsResponse +ListLabelGroupsRequest +ListLabelGroupsResponse +ListLabelingJobsForWorkteamRequest +ListLabelingJobsForWorkteamResponse +ListLabelingJobsRequest +ListLabelingJobsResponse +ListLabelsRequest +ListLabelsResponse +ListLakeFormationOptInsRequest +ListLakeFormationOptInsResponse +ListLambdaFunctionsRequest +ListLambdaFunctionsResponse +ListLanguageModelsRequest +ListLanguageModelsResponse +ListLanguagesRequest +ListLanguagesResponse +ListLaunchActionsRequest +ListLaunchActionsResponse +ListLaunchPathsInput +ListLaunchPathsOutput +ListLaunchProfileMembersRequest +ListLaunchProfileMembersResponse +ListLaunchProfilesRequest +ListLaunchProfilesResponse +ListLaunchesRequest +ListLaunchesResponse +ListLayerVersionsRequest +ListLayerVersionsResponse +ListLayersRequest +ListLayersResponse +ListLayoutsRequest +ListLayoutsResponse +ListLedgersRequest +ListLedgersResponse +ListLegalHoldsInput +ListLegalHoldsOutput +ListLensReviewImprovementsInput +ListLensReviewImprovementsOutput +ListLensReviewsInput +ListLensReviewsOutput +ListLensSharesInput +ListLensSharesOutput +ListLensesInput +ListLensesOutput +ListLexBotsRequest +ListLexBotsResponse +ListLexiconsInput +ListLexiconsOutput +ListLicenseConfigurationsRequest +ListLicenseConfigurationsResponse +ListLicenseConversionTasksRequest +ListLicenseConversionTasksResponse +ListLicenseManagerReportGeneratorsRequest +ListLicenseManagerReportGeneratorsResponse +ListLicenseSpecificationsForResourceRequest +ListLicenseSpecificationsForResourceResponse +ListLicenseVersionsRequest +ListLicenseVersionsResponse +ListLicensesRequest +ListLicensesResponse +ListLineageGroupsRequest +ListLineageGroupsResponse +ListLinksInput +ListLinksItem +ListLinksOutput +ListLinuxSubscriptionInstancesRequest +ListLinuxSubscriptionInstancesResponse +ListLinuxSubscriptionsRequest +ListLinuxSubscriptionsResponse +ListListenersRequest +ListListenersResponse +ListLiveSourcesRequest +ListLiveSourcesResponse +ListLoaderJobsInput +ListLoaderJobsOutput +ListLocalDisksInput +ListLocalDisksOutput +ListLocationsInput +ListLocationsOutput +ListLocationsRequest +ListLocationsResponse +ListLogPatternSetsRequest +ListLogPatternSetsResponse +ListLogPatternsRequest +ListLogPatternsResponse +ListLogSourcesRequest +ListLogSourcesResponse +ListLogSubscriptionsRequest +ListLogSubscriptionsResult +ListLoggerDefinitionVersionsRequest +ListLoggerDefinitionVersionsResponse +ListLoggerDefinitionsRequest +ListLoggerDefinitionsResponse +ListLoggingConfigurationsRequest +ListLoggingConfigurationsResponse +ListLongTermPricingRequest +ListLongTermPricingResult +ListLowLatencyHlsManifestConfiguration +ListLunaClientsRequest +ListLunaClientsResponse +ListMFADeviceTagsRequest +ListMFADeviceTagsResponse +ListMFADevicesRequest +ListMFADevicesResponse +ListMLDataProcessingJobsInput +ListMLDataProcessingJobsOutput +ListMLEndpointsInput +ListMLEndpointsOutput +ListMLModelTrainingJobsInput +ListMLModelTrainingJobsOutput +ListMLModelTransformJobsInput +ListMLModelTransformJobsOutput +ListMLTransformsRequest +ListMLTransformsResponse +ListMailDomainsRequest +ListMailDomainsResponse +ListMailboxExportJobsRequest +ListMailboxExportJobsResponse +ListMailboxPermissionsRequest +ListMailboxPermissionsResponse +ListManagedAccountsRequest +ListManagedAccountsResponse +ListManagedDataIdentifiersRequest +ListManagedDataIdentifiersResponse +ListManagedEndpointsRequest +ListManagedEndpointsResponse +ListManagedInsightRulesInput +ListManagedInsightRulesOutput +ListManagedJobTemplatesRequest +ListManagedJobTemplatesResponse +ListManagedPoliciesInPermissionSetRequest +ListManagedPoliciesInPermissionSetResponse +ListManagedResourcesRequest +ListManagedResourcesResponse +ListManagedRuleSetsRequest +ListManagedRuleSetsResponse +ListManagedSchemaArnsRequest +ListManagedSchemaArnsResponse +ListManagementOptions +ListMapRunsInput +ListMapRunsOutput +ListMapsRequest +ListMapsResponse +ListMapsResponseEntry +ListMatchingJobsInput +ListMatchingJobsOutput +ListMatchingWorkflowsInput +ListMatchingWorkflowsOutput +ListMediaCapturePipelinesRequest +ListMediaCapturePipelinesResponse +ListMediaInsightsPipelineConfigurationsRequest +ListMediaInsightsPipelineConfigurationsResponse +ListMediaPipelineKinesisVideoStreamPoolsRequest +ListMediaPipelineKinesisVideoStreamPoolsResponse +ListMediaPipelinesRequest +ListMediaPipelinesResponse +ListMedicalTranscriptionJobsRequest +ListMedicalTranscriptionJobsResponse +ListMedicalVocabulariesRequest +ListMedicalVocabulariesResponse +ListMeetingTagsRequest +ListMeetingTagsResponse +ListMeetingsRequest +ListMeetingsResponse +ListMemberAccountsRequest +ListMemberAccountsResponse +ListMemberAccountsResult +ListMembersInput +ListMembersOutput +ListMembersRequest +ListMembersResponse +ListMembershipsInput +ListMembershipsOutput +ListMeshesInput +ListMeshesOutput +ListMessageMoveTasksRequest +ListMessageMoveTasksResult +ListMessageMoveTasksResultEntry +ListMetricAttributionMetricsRequest +ListMetricAttributionMetricsResponse +ListMetricAttributionsRequest +ListMetricAttributionsResponse +ListMetricSetsRequest +ListMetricSetsResponse +ListMetricStreamsInput +ListMetricStreamsOutput +ListMetricValuesRequest +ListMetricValuesResponse +ListMetricsInput +ListMetricsOutput +ListMigrationTasksRequest +ListMigrationTasksResult +ListMigrationWorkflowTemplatesRequest +ListMigrationWorkflowTemplatesResponse +ListMigrationWorkflowsRequest +ListMigrationWorkflowsResponse +ListMilestonesInput +ListMilestonesOutput +ListMissionProfilesRequest +ListMissionProfilesResponse +ListMitigationActionsRequest +ListMitigationActionsResponse +ListMobileDeviceAccessOverridesRequest +ListMobileDeviceAccessOverridesResponse +ListMobileDeviceAccessRulesRequest +ListMobileDeviceAccessRulesResponse +ListMobileSdkReleasesRequest +ListMobileSdkReleasesResponse +ListModelBiasJobDefinitionsRequest +ListModelBiasJobDefinitionsResponse +ListModelCardExportJobsRequest +ListModelCardExportJobsResponse +ListModelCardVersionsRequest +ListModelCardVersionsResponse +ListModelCardsRequest +ListModelCardsResponse +ListModelCustomizationJobsRequest +ListModelCustomizationJobsResponse +ListModelExplainabilityJobDefinitionsRequest +ListModelExplainabilityJobDefinitionsResponse +ListModelManifestNodesRequest +ListModelManifestNodesResponse +ListModelManifestsRequest +ListModelManifestsResponse +ListModelMetadataRequest +ListModelMetadataResponse +ListModelPackageGroupsInput +ListModelPackageGroupsOutput +ListModelPackagesInput +ListModelPackagesOutput +ListModelPackagingJobsRequest +ListModelPackagingJobsResponse +ListModelQualityJobDefinitionsRequest +ListModelQualityJobDefinitionsResponse +ListModelVersionsRequest +ListModelVersionsResponse +ListModelsInput +ListModelsOutput +ListModelsRequest +ListModelsResponse +ListMonitorEvaluationsRequest +ListMonitorEvaluationsResponse +ListMonitoredResourcesFilters +ListMonitoredResourcesRequest +ListMonitoredResourcesResponse +ListMonitoringAlertHistoryRequest +ListMonitoringAlertHistoryResponse +ListMonitoringAlertsRequest +ListMonitoringAlertsResponse +ListMonitoringExecutionsRequest +ListMonitoringExecutionsResponse +ListMonitoringSchedulesRequest +ListMonitoringSchedulesResponse +ListMonitorsInput +ListMonitorsOutput +ListMonitorsRequest +ListMonitorsResponse +ListMultiRegionAccessPointsRequest +ListMultiRegionAccessPointsResult +ListMulticastGroupsByFuotaTaskRequest +ListMulticastGroupsByFuotaTaskResponse +ListMulticastGroupsRequest +ListMulticastGroupsResponse +ListMultipartReadSetUploadsRequest +ListMultipartReadSetUploadsResponse +ListMultipartUploadsInput +ListMultipartUploadsOutput +ListMultipartUploadsRequest +ListMultiplexProgramsRequest +ListMultiplexProgramsResponse +ListMultiplexesRequest +ListMultiplexesResponse +ListName +ListNamedQueriesInput +ListNamedQueriesOutput +ListNamedShadowsForThingRequest +ListNamedShadowsForThingResponse +ListNamespacesRequest +ListNamespacesResponse +ListNetworkAnalyzerConfigurationsRequest +ListNetworkAnalyzerConfigurationsResponse +ListNetworkProfilesRequest +ListNetworkProfilesResult +ListNetworkResourcesRequest +ListNetworkResourcesResponse +ListNetworkSettingsRequest +ListNetworkSettingsResponse +ListNetworkSitesRequest +ListNetworkSitesResponse +ListNetworksInput +ListNetworksOutput +ListNetworksRequest +ListNetworksResponse +ListNodeFromTemplateJobsRequest +ListNodeFromTemplateJobsResponse +ListNodegroupsRequest +ListNodegroupsResponse +ListNodesInput +ListNodesOutput +ListNodesRequest +ListNodesResponse +ListNotebookExecutionsInput +ListNotebookExecutionsOutput +ListNotebookInstanceLifecycleConfigsInput +ListNotebookInstanceLifecycleConfigsOutput +ListNotebookInstancesInput +ListNotebookInstancesOutput +ListNotebookMetadataInput +ListNotebookMetadataOutput +ListNotebookSessionsRequest +ListNotebookSessionsResponse +ListNotificationChannelsRequest +ListNotificationChannelsResponse +ListNotificationRulesFilter +ListNotificationRulesRequest +ListNotificationRulesResult +ListNotificationsInput +ListNotificationsOutput +ListNotificationsRequest +ListNotificationsResponse +ListOTAUpdatesRequest +ListOTAUpdatesResponse +ListObjectAttributes +ListObjectAttributesRequest +ListObjectAttributesResponse +ListObjectChildren +ListObjectChildrenRequest +ListObjectChildrenResponse +ListObjectParentPaths +ListObjectParentPathsRequest +ListObjectParentPathsResponse +ListObjectParents +ListObjectParentsRequest +ListObjectParentsResponse +ListObjectPolicies +ListObjectPoliciesRequest +ListObjectPoliciesResponse +ListObjectVersionsOutput +ListObjectVersionsRequest +ListObjectsInput +ListObjectsOutput +ListObjectsRequest +ListObjectsV2Output +ListObjectsV2Request +ListObservabilityConfigurationsRequest +ListObservabilityConfigurationsResponse +ListOfTags +ListOfferingPromotionsRequest +ListOfferingPromotionsResult +ListOfferingTransactionsRequest +ListOfferingTransactionsResult +ListOfferingsRequest +ListOfferingsResponse +ListOfferingsResult +ListOnPremisesInstancesInput +ListOnPremisesInstancesOutput +ListOpenCypherQueriesInput +ListOpenCypherQueriesOutput +ListOpenIDConnectProviderTagsRequest +ListOpenIDConnectProviderTagsResponse +ListOpenIDConnectProvidersResponse +ListOpenWorkflowExecutionsInput +ListOperationsInput +ListOperationsOutput +ListOperationsRequest +ListOperationsResponse +ListOpsItemEventsRequest +ListOpsItemEventsResponse +ListOpsItemRelatedItemsRequest +ListOpsItemRelatedItemsResponse +ListOpsMetadataRequest +ListOpsMetadataResult +ListOrdersInput +ListOrdersOutput +ListOrdersRequest +ListOrdersResponse +ListOrganizationAdminAccountsRequest +ListOrganizationAdminAccountsResponse +ListOrganizationInsightsRequest +ListOrganizationInsightsResponse +ListOrganizationPortfolioAccessInput +ListOrganizationPortfolioAccessOutput +ListOrganizationServiceAccessStatusRequest +ListOrganizationServiceAccessStatusResponse +ListOrganizationalUnitsForParentRequest +ListOrganizationalUnitsForParentResponse +ListOrganizationsRequest +ListOrganizationsResponse +ListOriginAccessControlsRequest +ListOriginAccessControlsResult +ListOriginEndpointsRequest +ListOriginEndpointsResponse +ListOriginRequestPoliciesRequest +ListOriginRequestPoliciesResult +ListOriginationNumbersRequest +ListOriginationNumbersResult +ListOutgoingCertificatesRequest +ListOutgoingCertificatesResponse +ListOutgoingTypedLinks +ListOutgoingTypedLinksRequest +ListOutgoingTypedLinksResponse +ListOutpostResolversRequest +ListOutpostResolversResponse +ListOutpostsInput +ListOutpostsOutput +ListOutpostsWithS3Request +ListOutpostsWithS3Result +ListPHIDetectionJobsRequest +ListPHIDetectionJobsResponse +ListPackageImportJobsRequest +ListPackageImportJobsResponse +ListPackageVersionAssetsRequest +ListPackageVersionAssetsResult +ListPackageVersionDependenciesRequest +ListPackageVersionDependenciesResult +ListPackageVersionsRequest +ListPackageVersionsResponse +ListPackageVersionsResult +ListPackagesForDomainRequest +ListPackagesForDomainResponse +ListPackagesRequest +ListPackagesResponse +ListPackagesResult +ListPackagingConfigurationsRequest +ListPackagingConfigurationsResponse +ListPackagingGroupsRequest +ListPackagingGroupsResponse +ListPageReceiptsRequest +ListPageReceiptsResult +ListPageResolutionsRequest +ListPageResolutionsResult +ListPagesByContactRequest +ListPagesByContactResult +ListPagesByEngagementRequest +ListPagesByEngagementResult +ListParallelDataRequest +ListParallelDataResponse +ListParentsRequest +ListParentsResponse +ListParticipantEventsRequest +ListParticipantEventsResponse +ListParticipantsRequest +ListParticipantsResponse +ListPartnerAccountsRequest +ListPartnerAccountsResponse +ListPartnerEventSourceAccountsRequest +ListPartnerEventSourceAccountsResponse +ListPartnerEventSourcesRequest +ListPartnerEventSourcesResponse +ListPartsInput +ListPartsOutput +ListPartsRequest +ListPeeringsRequest +ListPeeringsResponse +ListPendingInvitationResourcesRequest +ListPendingInvitationResourcesResponse +ListPerformanceAnalysisReportsRequest +ListPerformanceAnalysisReportsResponse +ListPermissionAssociationsRequest +ListPermissionAssociationsResponse +ListPermissionGroupsByUserRequest +ListPermissionGroupsByUserResponse +ListPermissionGroupsRequest +ListPermissionGroupsResponse +ListPermissionSetProvisioningStatusRequest +ListPermissionSetProvisioningStatusResponse +ListPermissionSetsProvisionedToAccountRequest +ListPermissionSetsProvisionedToAccountResponse +ListPermissionSetsRequest +ListPermissionSetsResponse +ListPermissionVersionsRequest +ListPermissionVersionsResponse +ListPermissionsRequest +ListPermissionsResponse +ListPhoneNumberOrdersRequest +ListPhoneNumberOrdersResponse +ListPhoneNumbersOptedOutInput +ListPhoneNumbersOptedOutResponse +ListPhoneNumbersRequest +ListPhoneNumbersResponse +ListPhoneNumbersSummary +ListPhoneNumbersSummaryList +ListPhoneNumbersV2Request +ListPhoneNumbersV2Response +ListPickupLocationsRequest +ListPickupLocationsResult +ListPiiEntitiesDetectionJobsRequest +ListPiiEntitiesDetectionJobsResponse +ListPipelineBlueprintsResponse +ListPipelineExecutionStepsRequest +ListPipelineExecutionStepsResponse +ListPipelineExecutionsInput +ListPipelineExecutionsOutput +ListPipelineExecutionsRequest +ListPipelineExecutionsResponse +ListPipelineParametersForExecutionRequest +ListPipelineParametersForExecutionResponse +ListPipelinesInput +ListPipelinesOutput +ListPipelinesRequest +ListPipelinesResponse +ListPipesRequest +ListPipesResponse +ListPlaceIndexesRequest +ListPlaceIndexesResponse +ListPlaceIndexesResponseEntry +ListPlacementsRequest +ListPlacementsResponse +ListPlatformApplicationsInput +ListPlatformApplicationsResponse +ListPlatformBranchesRequest +ListPlatformBranchesResult +ListPlatformVersionsRequest +ListPlatformVersionsResult +ListPlaybackConfigurationsRequest +ListPlaybackConfigurationsResponse +ListPlaybackKeyPairsRequest +ListPlaybackKeyPairsResponse +ListPluginsRequest +ListPluginsResponse +ListPoliciesForTargetRequest +ListPoliciesForTargetResponse +ListPoliciesGrantingServiceAccessEntry +ListPoliciesGrantingServiceAccessRequest +ListPoliciesGrantingServiceAccessResponse +ListPoliciesInput +ListPoliciesOutput +ListPoliciesRequest +ListPoliciesResponse +ListPolicyAttachments +ListPolicyAttachmentsRequest +ListPolicyAttachmentsResponse +ListPolicyGenerationsRequest +ListPolicyGenerationsResponse +ListPolicyPrincipalsRequest +ListPolicyPrincipalsResponse +ListPolicyStoresInput +ListPolicyStoresOutput +ListPolicyTagsRequest +ListPolicyTagsResponse +ListPolicyTemplatesInput +ListPolicyTemplatesOutput +ListPolicyVersionsRequest +ListPolicyVersionsResponse +ListPoolOriginationIdentitiesRequest +ListPoolOriginationIdentitiesResult +ListPortalsRequest +ListPortalsResponse +ListPortfolioAccessInput +ListPortfolioAccessOutput +ListPortfoliosForProductInput +ListPortfoliosForProductOutput +ListPortfoliosInput +ListPortfoliosOutput +ListPositionConfigurationsRequest +ListPositionConfigurationsResponse +ListPredictorBacktestExportJobsRequest +ListPredictorBacktestExportJobsResponse +ListPredictorsRequest +ListPredictorsResponse +ListPrefetchSchedulesRequest +ListPrefetchSchedulesResponse +ListPreparedStatementsInput +ListPreparedStatementsOutput +ListPresetsRequest +ListPresetsResponse +ListPreviewRotationShiftsRequest +ListPreviewRotationShiftsResult +ListPriceListsRequest +ListPriceListsResponse +ListPricesRequest +ListPricesResponse +ListPricingPlansAssociatedWithPricingRuleInput +ListPricingPlansAssociatedWithPricingRuleOutput +ListPricingPlansFilter +ListPricingPlansInput +ListPricingPlansOutput +ListPricingRulesAssociatedToPricingPlanInput +ListPricingRulesAssociatedToPricingPlanOutput +ListPricingRulesFilter +ListPricingRulesInput +ListPricingRulesOutput +ListPrincipalPoliciesRequest +ListPrincipalPoliciesResponse +ListPrincipalThingsRequest +ListPrincipalThingsResponse +ListPrincipalsForPortfolioInput +ListPrincipalsForPortfolioOutput +ListPrincipalsRequest +ListPrincipalsResponse +ListProblemsRequest +ListProblemsResponse +ListProcessingJobsRequest +ListProcessingJobsResponse +ListProductSubscriptionsRequest +ListProductSubscriptionsResponse +ListProfileNotificationsInput +ListProfileNotificationsOutput +ListProfileObjectTypeItem +ListProfileObjectTypeTemplateItem +ListProfileObjectTypeTemplatesRequest +ListProfileObjectTypeTemplatesResponse +ListProfileObjectTypesRequest +ListProfileObjectTypesResponse +ListProfileObjectsItem +ListProfileObjectsRequest +ListProfileObjectsResponse +ListProfilePermissionsRequest +ListProfilePermissionsResponse +ListProfileSharesInput +ListProfileSharesOutput +ListProfileTimesRequest +ListProfileTimesResponse +ListProfilesInput +ListProfilesOutput +ListProfilesRequest +ListProfilesResponse +ListProfilingGroupsRequest +ListProfilingGroupsResponse +ListProgressUpdateStreamsRequest +ListProgressUpdateStreamsResult +ListProjectAssetsRequest +ListProjectAssetsResponse +ListProjectPoliciesRequest +ListProjectPoliciesResponse +ListProjectsInput +ListProjectsOutput +ListProjectsRequest +ListProjectsResponse +ListProjectsResult +ListPromptsRequest +ListPromptsResponse +ListProposalVotesInput +ListProposalVotesOutput +ListProposalsInput +ListProposalsOutput +ListProtectedQueriesInput +ListProtectedQueriesOutput +ListProtectedResourcesByBackupVaultInput +ListProtectedResourcesByBackupVaultOutput +ListProtectedResourcesInput +ListProtectedResourcesOutput +ListProtectionGroupsRequest +ListProtectionGroupsResponse +ListProtectionsRequest +ListProtectionsResponse +ListProtocolsListsRequest +ListProtocolsListsResponse +ListProvisionedCapacityInput +ListProvisionedCapacityOutput +ListProvisionedConcurrencyConfigsRequest +ListProvisionedConcurrencyConfigsResponse +ListProvisionedModelThroughputsRequest +ListProvisionedModelThroughputsResponse +ListProvisionedProductPlansInput +ListProvisionedProductPlansOutput +ListProvisioningArtifactsForServiceActionInput +ListProvisioningArtifactsForServiceActionOutput +ListProvisioningArtifactsInput +ListProvisioningArtifactsOutput +ListProvisioningTemplateVersionsRequest +ListProvisioningTemplateVersionsResponse +ListProvisioningTemplatesRequest +ListProvisioningTemplatesResponse +ListProxySessionsRequest +ListProxySessionsResponse +ListPublicKeysRequest +ListPublicKeysResponse +ListPublicKeysResult +ListPublishedSchemaArnsRequest +ListPublishedSchemaArnsResponse +ListPublishingDestinationsRequest +ListPublishingDestinationsResponse +ListPullRequestsInput +ListPullRequestsOutput +ListQualificationRequestsRequest +ListQualificationRequestsResponse +ListQualificationTypesRequest +ListQualificationTypesResponse +ListQueriesRequest +ListQueriesResponse +ListQueryExecutionsInput +ListQueryExecutionsOutput +ListQueryLoggingConfigsRequest +ListQueryLoggingConfigsResponse +ListQuerySuggestionsBlockListsRequest +ListQuerySuggestionsBlockListsResponse +ListQueueQuickConnectsRequest +ListQueueQuickConnectsResponse +ListQueueTagsRequest +ListQueueTagsResult +ListQueuedMessagesRequest +ListQueuedMessagesResponse +ListQueuesRequest +ListQueuesResponse +ListQueuesResult +ListQuickConnectsRequest +ListQuickConnectsResponse +ListRasterDataCollectionsInput +ListRasterDataCollectionsOutput +ListRateBasedRulesRequest +ListRateBasedRulesResponse +ListReadSetActivationJobsRequest +ListReadSetActivationJobsResponse +ListReadSetExportJobsRequest +ListReadSetExportJobsResponse +ListReadSetImportJobsRequest +ListReadSetImportJobsResponse +ListReadSetUploadPartsRequest +ListReadSetUploadPartsResponse +ListReadSetsRequest +ListReadSetsResponse +ListReadinessChecksRequest +ListReadinessChecksResponse +ListRealtimeContactAnalysisSegmentsRequest +ListRealtimeContactAnalysisSegmentsResponse +ListRealtimeLogConfigsRequest +ListRealtimeLogConfigsResult +ListReceiptFiltersResponse +ListReceiptRuleSetsRequest +ListReceiptRuleSetsResponse +ListReceivedGrantsForOrganizationRequest +ListReceivedGrantsForOrganizationResponse +ListReceivedGrantsRequest +ListReceivedGrantsResponse +ListReceivedLicensesForOrganizationRequest +ListReceivedLicensesForOrganizationResponse +ListReceivedLicensesRequest +ListReceivedLicensesResponse +ListRecipeVersionsRequest +ListRecipeVersionsResponse +ListRecipesRequest +ListRecipesResponse +ListRecommendationFeedbackRequest +ListRecommendationFeedbackResponse +ListRecommendationTemplatesRequest +ListRecommendationTemplatesResponse +ListRecommendationsRequest +ListRecommendationsResponse +ListRecommendedIntentsRequest +ListRecommendedIntentsResponse +ListRecommenderConfigurationsResponse +ListRecommendersRequest +ListRecommendersResponse +ListRecordHistoryInput +ListRecordHistoryOutput +ListRecordHistorySearchFilter +ListRecordingConfigurationsRequest +ListRecordingConfigurationsResponse +ListRecordsRequest +ListRecordsResponse +ListRecoveryGroupsRequest +ListRecoveryGroupsResponse +ListRecoveryPointsByBackupVaultInput +ListRecoveryPointsByBackupVaultOutput +ListRecoveryPointsByLegalHoldInput +ListRecoveryPointsByLegalHoldOutput +ListRecoveryPointsByResourceInput +ListRecoveryPointsByResourceOutput +ListRecoveryPointsRequest +ListRecoveryPointsResponse +ListReferenceImportJobsRequest +ListReferenceImportJobsResponse +ListReferenceStoresRequest +ListReferenceStoresResponse +ListReferencesRequest +ListReferencesResponse +ListRefreshSchedulesRequest +ListRefreshSchedulesResponse +ListRegexMatchSetsRequest +ListRegexMatchSetsResponse +ListRegexPatternSetsRequest +ListRegexPatternSetsResponse +ListRegionalBucketsRequest +ListRegionalBucketsResult +ListRegionsRequest +ListRegionsResponse +ListRegistriesInput +ListRegistriesRequest +ListRegistriesResponse +ListRelatedItemsInput +ListRelatedItemsOutput +ListRelatedResourcesForAuditFindingRequest +ListRelatedResourcesForAuditFindingResponse +ListReleaseLabelsInput +ListReleaseLabelsOutput +ListRemoteAccessSessionsRequest +ListRemoteAccessSessionsResult +ListReplacePermissionAssociationsWorkRequest +ListReplacePermissionAssociationsWorkResponse +ListReplaysRequest +ListReplaysResponse +ListReplicationSetsInput +ListReplicationSetsOutput +ListReportDefinitionsRequest +ListReportDefinitionsResult +ListReportGroupsInput +ListReportGroupsOutput +ListReportJobsInput +ListReportJobsOutput +ListReportPlansInput +ListReportPlansOutput +ListReportsForReportGroupInput +ListReportsForReportGroupOutput +ListReportsInput +ListReportsOutput +ListRepositoriesForApprovalRuleTemplateInput +ListRepositoriesForApprovalRuleTemplateOutput +ListRepositoriesInDomainRequest +ListRepositoriesInDomainResult +ListRepositoriesInput +ListRepositoriesOutput +ListRepositoriesRequest +ListRepositoriesResult +ListRepositoryAssociationsRequest +ListRepositoryAssociationsResponse +ListRepositorySyncDefinitionsInput +ListRepositorySyncDefinitionsOutput +ListRequest +ListRequestedServiceQuotaChangeHistoryByQuotaRequest +ListRequestedServiceQuotaChangeHistoryByQuotaResponse +ListRequestedServiceQuotaChangeHistoryRequest +ListRequestedServiceQuotaChangeHistoryResponse +ListRescoreExecutionPlansRequest +ListRescoreExecutionPlansResponse +ListReservationsRequest +ListReservationsResponse +ListResiliencyPoliciesRequest +ListResiliencyPoliciesResponse +ListResolverConfigsRequest +ListResolverConfigsResponse +ListResolverDnssecConfigsRequest +ListResolverDnssecConfigsResponse +ListResolverEndpointIpAddressesRequest +ListResolverEndpointIpAddressesResponse +ListResolverEndpointsRequest +ListResolverEndpointsResponse +ListResolverQueryLogConfigAssociationsRequest +ListResolverQueryLogConfigAssociationsResponse +ListResolverQueryLogConfigsRequest +ListResolverQueryLogConfigsResponse +ListResolverRuleAssociationsRequest +ListResolverRuleAssociationsResponse +ListResolverRulesRequest +ListResolverRulesResponse +ListResolversByFunctionRequest +ListResolversByFunctionResponse +ListResolversRequest +ListResolversResponse +ListResourceCatalogsRequest +ListResourceCatalogsResponse +ListResourceComplianceSummariesRequest +ListResourceComplianceSummariesResult +ListResourceDataSyncRequest +ListResourceDataSyncResult +ListResourceDefinitionVersionsRequest +ListResourceDefinitionVersionsResponse +ListResourceDefinitionsRequest +ListResourceDefinitionsResponse +ListResourceDelegatesRequest +ListResourceDelegatesResponse +ListResourceEvaluationsRequest +ListResourceEvaluationsResponse +ListResourceInventoryRequest +ListResourceInventoryResponse +ListResourcePoliciesRequest +ListResourcePoliciesResult +ListResourceProfileArtifactsRequest +ListResourceProfileArtifactsResponse +ListResourceProfileDetectionsRequest +ListResourceProfileDetectionsResponse +ListResourceRecordSetsRequest +ListResourceRecordSetsResponse +ListResourceRequestsInput +ListResourceRequestsOutput +ListResourceServersRequest +ListResourceServersResponse +ListResourceSetResourcesRequest +ListResourceSetResourcesResponse +ListResourceSetsRequest +ListResourceSetsResponse +ListResourceSharePermissionsRequest +ListResourceSharePermissionsResponse +ListResourceTagsRequest +ListResourceTagsResponse +ListResourceTypesRequest +ListResourceTypesResponse +ListResourcesAssociatedToCustomLineItemFilter +ListResourcesAssociatedToCustomLineItemInput +ListResourcesAssociatedToCustomLineItemOutput +ListResourcesAssociatedToCustomLineItemResponseElement +ListResourcesFilters +ListResourcesForTagOptionInput +ListResourcesForTagOptionOutput +ListResourcesForWebACLRequest +ListResourcesForWebACLResponse +ListResourcesInProtectionGroupRequest +ListResourcesInProtectionGroupResponse +ListResourcesInput +ListResourcesOutput +ListResourcesRequest +ListResourcesResponse +ListResourcesResult +ListResponseHeadersPoliciesRequest +ListResponseHeadersPoliciesResult +ListResponsePlansInput +ListResponsePlansOutput +ListRestoreJobsInput +ListRestoreJobsOutput +ListRetainedMessagesRequest +ListRetainedMessagesResponse +ListRetirableGrantsRequest +ListRetrainingSchedulersRequest +ListRetrainingSchedulersResponse +ListReusableDelegationSetsRequest +ListReusableDelegationSetsResponse +ListReviewPolicyResultsForHITRequest +ListReviewPolicyResultsForHITResponse +ListReviewableHITsRequest +ListReviewableHITsResponse +ListRevisionAssetsRequest +ListRevisionAssetsResponse +ListRobotApplicationsRequest +ListRobotApplicationsResponse +ListRobotsRequest +ListRobotsResponse +ListRoleAliasesRequest +ListRoleAliasesResponse +ListRolePoliciesRequest +ListRolePoliciesResponse +ListRoleTagsRequest +ListRoleTagsResponse +ListRolesRequest +ListRolesResponse +ListRoomMembershipsRequest +ListRoomMembershipsResponse +ListRoomsRequest +ListRoomsResponse +ListRootsRequest +ListRootsResponse +ListRotationOverridesRequest +ListRotationOverridesResult +ListRotationShiftsRequest +ListRotationShiftsResult +ListRotationsRequest +ListRotationsResult +ListRouteCalculatorsRequest +ListRouteCalculatorsResponse +ListRouteCalculatorsResponseEntry +ListRoutesInput +ListRoutesOutput +ListRoutesRequest +ListRoutesResponse +ListRoutingControlsRequest +ListRoutingControlsResponse +ListRoutingProfileQueuesRequest +ListRoutingProfileQueuesResponse +ListRoutingProfilesRequest +ListRoutingProfilesResponse +ListRuleBasedMatchesRequest +ListRuleBasedMatchesResponse +ListRuleGroupsNamespacesRequest +ListRuleGroupsNamespacesResponse +ListRuleGroupsRequest +ListRuleGroupsResponse +ListRuleNamesByTargetRequest +ListRuleNamesByTargetResponse +ListRulesOutput +ListRulesPackagesRequest +ListRulesPackagesResponse +ListRulesRequest +ListRulesResponse +ListRulesetsRequest +ListRulesetsResponse +ListRumMetricsDestinationsRequest +ListRumMetricsDestinationsResponse +ListRunGroupsRequest +ListRunGroupsResponse +ListRunTasksRequest +ListRunTasksResponse +ListRunsRequest +ListRunsResponse +ListRunsResult +ListRxNormInferenceJobsRequest +ListRxNormInferenceJobsResponse +ListS3BucketsRequest +ListS3BucketsResponse +ListS3ResourcesRequest +ListS3ResourcesResult +ListSAMLProviderTagsRequest +ListSAMLProviderTagsResponse +ListSAMLProvidersResponse +ListSMSSandboxPhoneNumbersInput +ListSMSSandboxPhoneNumbersResult +ListSNOMEDCTInferenceJobsRequest +ListSNOMEDCTInferenceJobsResponse +ListSSHPublicKeysRequest +ListSSHPublicKeysResponse +ListSafetyRulesRequest +ListSafetyRulesResponse +ListSamplesRequest +ListSamplesResult +ListSatellitesRequest +ListSatellitesResponse +ListSavingsPlansPurchaseRecommendationGenerationRequest +ListSavingsPlansPurchaseRecommendationGenerationResponse +ListScansRequest +ListScansResponse +ListScenesRequest +ListScenesResponse +ListScheduleGroupsInput +ListScheduleGroupsOutput +ListScheduledActionsRequest +ListScheduledActionsResponse +ListScheduledAuditsRequest +ListScheduledAuditsResponse +ListScheduledQueriesRequest +ListScheduledQueriesResponse +ListSchedulesInput +ListSchedulesOutput +ListSchedulesRequest +ListSchedulesResponse +ListSchedulingPoliciesRequest +ListSchedulingPoliciesResponse +ListSchemaExtensionsRequest +ListSchemaExtensionsResult +ListSchemaMappingsInput +ListSchemaMappingsOutput +ListSchemaVersionsInput +ListSchemaVersionsRequest +ListSchemaVersionsResponse +ListSchemasInput +ListSchemasOutput +ListSchemasRequest +ListSchemasResponse +ListScramSecretsRequest +ListScramSecretsResponse +ListScriptsInput +ListScriptsOutput +ListSecretVersionIdsRequest +ListSecretVersionIdsResponse +ListSecretsRequest +ListSecretsResponse +ListSecurityConfigsRequest +ListSecurityConfigsResponse +ListSecurityConfigurationsInput +ListSecurityConfigurationsOutput +ListSecurityControlDefinitionsRequest +ListSecurityControlDefinitionsResponse +ListSecurityKeysRequest +ListSecurityKeysResponse +ListSecurityPoliciesRequest +ListSecurityPoliciesResponse +ListSecurityProfileApplicationsRequest +ListSecurityProfileApplicationsResponse +ListSecurityProfilePermissionsRequest +ListSecurityProfilePermissionsResponse +ListSecurityProfilesForTargetRequest +ListSecurityProfilesForTargetResponse +ListSecurityProfilesRequest +ListSecurityProfilesResponse +ListSegmentReferencesRequest +ListSegmentReferencesResponse +ListSegmentsRequest +ListSegmentsResponse +ListSensitivityInspectionTemplatesRequest +ListSensitivityInspectionTemplatesResponse +ListSensorStatisticsRequest +ListSensorStatisticsResponse +ListSentimentDetectionJobsRequest +ListSentimentDetectionJobsResponse +ListSequenceStoresRequest +ListSequenceStoresResponse +ListServerCertificateTagsRequest +ListServerCertificateTagsResponse +ListServerCertificatesRequest +ListServerCertificatesResponse +ListServerNeighborsRequest +ListServerNeighborsResponse +ListServersRequest +ListServersResponse +ListServiceActionsForProvisioningArtifactInput +ListServiceActionsForProvisioningArtifactOutput +ListServiceActionsInput +ListServiceActionsOutput +ListServiceInstanceOutputsInput +ListServiceInstanceOutputsOutput +ListServiceInstanceProvisionedResourcesInput +ListServiceInstanceProvisionedResourcesOutput +ListServiceInstancesFilter +ListServiceInstancesInput +ListServiceInstancesOutput +ListServiceNetworkServiceAssociationsRequest +ListServiceNetworkServiceAssociationsResponse +ListServiceNetworkVpcAssociationsRequest +ListServiceNetworkVpcAssociationsResponse +ListServiceNetworksRequest +ListServiceNetworksResponse +ListServicePipelineOutputsInput +ListServicePipelineOutputsOutput +ListServicePipelineProvisionedResourcesInput +ListServicePipelineProvisionedResourcesOutput +ListServicePrincipalNamesRequest +ListServicePrincipalNamesResponse +ListServiceProfilesRequest +ListServiceProfilesResponse +ListServiceQuotaIncreaseRequestsInTemplateRequest +ListServiceQuotaIncreaseRequestsInTemplateResponse +ListServiceQuotasRequest +ListServiceQuotasResponse +ListServiceSpecificCredentialsRequest +ListServiceSpecificCredentialsResponse +ListServiceTemplateVersionsInput +ListServiceTemplateVersionsOutput +ListServiceTemplatesInput +ListServiceTemplatesOutput +ListServiceVersionsRequest +ListServiceVersionsResult +ListServicesByNamespaceRequest +ListServicesByNamespaceResponse +ListServicesForAutoScalingConfigurationRequest +ListServicesForAutoScalingConfigurationResponse +ListServicesInput +ListServicesOutput +ListServicesRequest +ListServicesResponse +ListSessionAnalyticsDataRequest +ListSessionAnalyticsDataResponse +ListSessionMetricsRequest +ListSessionMetricsResponse +ListSessionsRequest +ListSessionsResponse +ListShardsInput +ListShardsOutput +ListShareInvitationsInput +ListShareInvitationsOutput +ListSharedEndpointsRequest +ListSharedEndpointsResult +ListSharedProjectsInput +ListSharedProjectsOutput +ListSharedReportGroupsInput +ListSharedReportGroupsOutput +ListSharesRequest +ListSharesResponse +ListSignalCatalogNodesRequest +ListSignalCatalogNodesResponse +ListSignalCatalogsRequest +ListSignalCatalogsResponse +ListSignalingChannelsInput +ListSignalingChannelsOutput +ListSigningCertificatesRequest +ListSigningCertificatesResponse +ListSigningJobsRequest +ListSigningJobsResponse +ListSigningPlatformsRequest +ListSigningPlatformsResponse +ListSigningProfilesRequest +ListSigningProfilesResponse +ListSimulationApplicationsRequest +ListSimulationApplicationsResponse +ListSimulationJobBatchesRequest +ListSimulationJobBatchesResponse +ListSimulationJobsRequest +ListSimulationJobsResponse +ListSimulationsInput +ListSimulationsOutput +ListSinksInput +ListSinksItem +ListSinksOutput +ListSipMediaApplicationsRequest +ListSipMediaApplicationsResponse +ListSipRulesRequest +ListSipRulesResponse +ListSitesInput +ListSitesOutput +ListSitesRequest +ListSitesResponse +ListSizeConstraintSetsRequest +ListSizeConstraintSetsResponse +ListSkillsRequest +ListSkillsResponse +ListSkillsStoreCategoriesRequest +ListSkillsStoreCategoriesResponse +ListSkillsStoreSkillsByCategoryRequest +ListSkillsStoreSkillsByCategoryResponse +ListSlackChannelConfigurationsRequest +ListSlackChannelConfigurationsResult +ListSlackWorkspaceConfigurationsRequest +ListSlackWorkspaceConfigurationsResult +ListSlotTypesRequest +ListSlotTypesResponse +ListSlotsRequest +ListSlotsResponse +ListSmartHomeAppliancesRequest +ListSmartHomeAppliancesResponse +ListSnapshotBlocksRequest +ListSnapshotBlocksResponse +ListSnapshotsInRecycleBinRequest +ListSnapshotsInRecycleBinResult +ListSnapshotsRequest +ListSnapshotsResponse +ListSnapshotsResult +ListSolFunctionInstanceInfo +ListSolFunctionInstanceMetadata +ListSolFunctionInstancesInput +ListSolFunctionInstancesOutput +ListSolFunctionPackageInfo +ListSolFunctionPackageMetadata +ListSolFunctionPackagesInput +ListSolFunctionPackagesOutput +ListSolNetworkInstanceInfo +ListSolNetworkInstanceMetadata +ListSolNetworkInstancesInput +ListSolNetworkInstancesOutput +ListSolNetworkOperationsInfo +ListSolNetworkOperationsInput +ListSolNetworkOperationsMetadata +ListSolNetworkOperationsOutput +ListSolNetworkPackageInfo +ListSolNetworkPackageMetadata +ListSolNetworkPackagesInput +ListSolNetworkPackagesOutput +ListSolutionVersionsRequest +ListSolutionVersionsResponse +ListSolutionsRequest +ListSolutionsResponse +ListSopRecommendationsRequest +ListSopRecommendationsResponse +ListSourceApiAssociationsRequest +ListSourceApiAssociationsResponse +ListSourceCredentialsOutput +ListSourceLocationsRequest +ListSourceLocationsResponse +ListSourceRepositoriesItem +ListSourceRepositoriesRequest +ListSourceRepositoriesResponse +ListSourceRepositoryBranchesItem +ListSourceRepositoryBranchesRequest +ListSourceRepositoryBranchesResponse +ListSourceServerActionsRequest +ListSourceServerActionsResponse +ListSpacesRequest +ListSpacesResponse +ListSpeakerEnrollmentJobsRequest +ListSpeakerEnrollmentJobsResponse +ListSpeakersRequest +ListSpeakersResponse +ListSpeechSynthesisTasksInput +ListSpeechSynthesisTasksOutput +ListSqlInjectionMatchSetsRequest +ListSqlInjectionMatchSetsResponse +ListStackInstanceResourceDriftsInput +ListStackInstanceResourceDriftsOutput +ListStackInstancesForProvisionedProductInput +ListStackInstancesForProvisionedProductOutput +ListStackInstancesInput +ListStackInstancesOutput +ListStackResourcesInput +ListStackResourcesOutput +ListStackSetOperationResultsInput +ListStackSetOperationResultsOutput +ListStackSetOperationsInput +ListStackSetOperationsOutput +ListStackSetsInput +ListStackSetsOutput +ListStacksInput +ListStacksOutput +ListStageDeploymentsRequest +ListStageDeploymentsResult +ListStageDevicesRequest +ListStageDevicesResponse +ListStageSessionsRequest +ListStageSessionsResponse +ListStagesRequest +ListStagesResponse +ListStagesResult +ListStagingAccountsRequest +ListStagingAccountsResponse +ListStandardsControlAssociationsRequest +ListStandardsControlAssociationsResponse +ListStateMachineAliasesInput +ListStateMachineAliasesOutput +ListStateMachineVersionsInput +ListStateMachineVersionsOutput +ListStateMachinesInput +ListStateMachinesOutput +ListStatementsRequest +ListStatementsResponse +ListStepsInput +ListStepsOutput +ListStorageLensConfigurationEntry +ListStorageLensConfigurationsRequest +ListStorageLensConfigurationsResult +ListStorageSystemsRequest +ListStorageSystemsResponse +ListStoredQueriesRequest +ListStoredQueriesResponse +ListStreamConsumersInput +ListStreamConsumersOutput +ListStreamKeysRequest +ListStreamKeysResponse +ListStreamProcessorsRequest +ListStreamProcessorsResponse +ListStreamSessionsRequest +ListStreamSessionsResponse +ListStreamingDistributionsRequest +ListStreamingDistributionsResult +ListStreamingImagesRequest +ListStreamingImagesResponse +ListStreamingSessionBackupsRequest +ListStreamingSessionBackupsResponse +ListStreamingSessionsRequest +ListStreamingSessionsResponse +ListStreamsInput +ListStreamsOutput +ListStreamsRequest +ListStreamsResponse +ListStudioComponentsRequest +ListStudioComponentsResponse +ListStudioLifecycleConfigsRequest +ListStudioLifecycleConfigsResponse +ListStudioMembersRequest +ListStudioMembersResponse +ListStudioSessionMappingsInput +ListStudioSessionMappingsOutput +ListStudiosInput +ListStudiosOutput +ListStudiosRequest +ListStudiosResponse +ListSubChannelsRequest +ListSubChannelsResponse +ListSubjectsResponse +ListSubscribedRuleGroupsRequest +ListSubscribedRuleGroupsResponse +ListSubscribedWorkteamsRequest +ListSubscribedWorkteamsResponse +ListSubscribersRequest +ListSubscribersResponse +ListSubscriptionDefinitionVersionsRequest +ListSubscriptionDefinitionVersionsResponse +ListSubscriptionDefinitionsRequest +ListSubscriptionDefinitionsResponse +ListSubscriptionsByTopicInput +ListSubscriptionsByTopicResponse +ListSubscriptionsInput +ListSubscriptionsResponse +ListSuggestedResiliencyPoliciesRequest +ListSuggestedResiliencyPoliciesResponse +ListSuiteDefinitionsRequest +ListSuiteDefinitionsResponse +ListSuiteRunsRequest +ListSuiteRunsResponse +ListSuitesRequest +ListSuitesResult +ListSupportedCharacterSets +ListSupportedInstanceTypesInput +ListSupportedInstanceTypesOutput +ListSupportedPhoneNumberCountriesRequest +ListSupportedPhoneNumberCountriesResponse +ListSupportedResourceTypesInput +ListSupportedResourceTypesOutput +ListSupportedTimezones +ListSuppressedDestinationsRequest +ListSuppressedDestinationsResponse +ListSyncJobsRequest +ListSyncJobsResponse +ListSyncResourcesRequest +ListSyncResourcesResponse +ListTLSInspectionConfigurationsRequest +ListTLSInspectionConfigurationsResponse +ListTableColumnsRequest +ListTableColumnsResult +ListTableMetadataInput +ListTableMetadataOutput +ListTableRestoreStatusRequest +ListTableRestoreStatusResponse +ListTableRowsRequest +ListTableRowsResult +ListTableStorageOptimizersRequest +ListTableStorageOptimizersResponse +ListTablesInput +ListTablesOutput +ListTablesRequest +ListTablesResponse +ListTablesResult +ListTagOptionsFilters +ListTagOptionsInput +ListTagOptionsOutput +ListTags +ListTagsForCertificateRequest +ListTagsForCertificateResponse +ListTagsForDeliveryStreamInput +ListTagsForDeliveryStreamOutput +ListTagsForDomainRequest +ListTagsForDomainResponse +ListTagsForProjectRequest +ListTagsForProjectResult +ListTagsForResourceInput +ListTagsForResourceMessage +ListTagsForResourceOutput +ListTagsForResourceRequest +ListTagsForResourceResponse +ListTagsForResourceResult +ListTagsForResourcesRequest +ListTagsForResourcesResponse +ListTagsForStreamInput +ListTagsForStreamOutput +ListTagsForVaultInput +ListTagsForVaultOutput +ListTagsInput +ListTagsLogGroupRequest +ListTagsLogGroupResponse +ListTagsOfResourceInput +ListTagsOfResourceOutput +ListTagsOutput +ListTagsRequest +ListTagsResponse +ListTagsResult +ListTapePoolsInput +ListTapePoolsOutput +ListTapesInput +ListTapesOutput +ListTargetGroupsRequest +ListTargetGroupsResponse +ListTargetResourceTypesRequest +ListTargetResourceTypesResponse +ListTargetedSentimentDetectionJobsRequest +ListTargetedSentimentDetectionJobsResponse +ListTargetsByRuleRequest +ListTargetsByRuleResponse +ListTargetsFilter +ListTargetsForPolicyRequest +ListTargetsForPolicyResponse +ListTargetsForSecurityProfileRequest +ListTargetsForSecurityProfileResponse +ListTargetsRequest +ListTargetsResponse +ListTargetsResult +ListTaskDefinitionFamiliesRequest +ListTaskDefinitionFamiliesResponse +ListTaskDefinitionsRequest +ListTaskDefinitionsResponse +ListTaskExecutionsRequest +ListTaskExecutionsResponse +ListTaskTemplatesRequest +ListTaskTemplatesResponse +ListTasksInput +ListTasksOutput +ListTasksRequest +ListTasksResponse +ListTeamMembersRequest +ListTeamMembersResult +ListTemplateActionsRequest +ListTemplateActionsResponse +ListTemplateAliasesRequest +ListTemplateAliasesResponse +ListTemplateGroupAccessControlEntriesRequest +ListTemplateGroupAccessControlEntriesResponse +ListTemplateStepGroupsRequest +ListTemplateStepGroupsResponse +ListTemplateStepsRequest +ListTemplateStepsResponse +ListTemplateVersionsRequest +ListTemplateVersionsResponse +ListTemplatesRequest +ListTemplatesResponse +ListTerminologiesRequest +ListTerminologiesResponse +ListTestExecutionResultItemsRequest +ListTestExecutionResultItemsResponse +ListTestExecutionsRequest +ListTestExecutionsResponse +ListTestGridProjectsRequest +ListTestGridProjectsResult +ListTestGridSessionActionsRequest +ListTestGridSessionActionsResult +ListTestGridSessionArtifactsRequest +ListTestGridSessionArtifactsResult +ListTestGridSessionsRequest +ListTestGridSessionsResult +ListTestRecommendationsRequest +ListTestRecommendationsResponse +ListTestSetRecordsRequest +ListTestSetRecordsResponse +ListTestSetsRequest +ListTestSetsResponse +ListTestsRequest +ListTestsResult +ListTextTranslationJobsRequest +ListTextTranslationJobsResponse +ListThemeAliasesRequest +ListThemeAliasesResponse +ListThemeVersionsRequest +ListThemeVersionsResponse +ListThemesRequest +ListThemesResponse +ListThesauriRequest +ListThesauriResponse +ListThingGroupsForThingRequest +ListThingGroupsForThingResponse +ListThingGroupsRequest +ListThingGroupsResponse +ListThingPrincipalsRequest +ListThingPrincipalsResponse +ListThingRegistrationTaskReportsRequest +ListThingRegistrationTaskReportsResponse +ListThingRegistrationTasksRequest +ListThingRegistrationTasksResponse +ListThingTypesRequest +ListThingTypesResponse +ListThingsInBillingGroupRequest +ListThingsInBillingGroupResponse +ListThingsInThingGroupRequest +ListThingsInThingGroupResponse +ListThingsRequest +ListThingsResponse +ListThirdPartyFirewallFirewallPoliciesRequest +ListThirdPartyFirewallFirewallPoliciesResponse +ListThreatIntelSetsRequest +ListThreatIntelSetsResponse +ListTimeSeriesRequest +ListTimeSeriesResponse +ListTimelineEventsInput +ListTimelineEventsOutput +ListTokenBalancesInput +ListTokenBalancesOutput +ListTokensRequest +ListTokensResponse +ListTopicRefreshSchedulesRequest +ListTopicRefreshSchedulesResponse +ListTopicRuleDestinationsRequest +ListTopicRuleDestinationsResponse +ListTopicRulesRequest +ListTopicRulesResponse +ListTopicsDetectionJobsRequest +ListTopicsDetectionJobsResponse +ListTopicsInput +ListTopicsRequest +ListTopicsResponse +ListTrackerConsumersRequest +ListTrackerConsumersResponse +ListTrackersRequest +ListTrackersResponse +ListTrackersResponseEntry +ListTrafficDistributionGroupUsersRequest +ListTrafficDistributionGroupUsersResponse +ListTrafficDistributionGroupsRequest +ListTrafficDistributionGroupsResponse +ListTrafficPoliciesRequest +ListTrafficPoliciesResponse +ListTrafficPolicyInstancesByHostedZoneRequest +ListTrafficPolicyInstancesByHostedZoneResponse +ListTrafficPolicyInstancesByPolicyRequest +ListTrafficPolicyInstancesByPolicyResponse +ListTrafficPolicyInstancesRequest +ListTrafficPolicyInstancesResponse +ListTrafficPolicyVersionsRequest +ListTrafficPolicyVersionsResponse +ListTrailsRequest +ListTrailsResponse +ListTrainingJobsForHyperParameterTuningJobRequest +ListTrainingJobsForHyperParameterTuningJobResponse +ListTrainingJobsRequest +ListTrainingJobsResponse +ListTransactionEventsInput +ListTransactionEventsOutput +ListTransactionsInput +ListTransactionsOutput +ListTransactionsRequest +ListTransactionsResponse +ListTransactionsSort +ListTranscriptionJobsRequest +ListTranscriptionJobsResponse +ListTransformJobsRequest +ListTransformJobsResponse +ListTrialComponentsRequest +ListTrialComponentsResponse +ListTrialsRequest +ListTrialsResponse +ListTriggersRequest +ListTriggersResponse +ListTrustAnchorsResponse +ListTrustStoreCertificatesRequest +ListTrustStoreCertificatesResponse +ListTrustStoresRequest +ListTrustStoresResponse +ListTunnelsRequest +ListTunnelsResponse +ListType +ListTypeRegistrationsInput +ListTypeRegistrationsOutput +ListTypeVersionsInput +ListTypeVersionsOutput +ListTypedLinkFacetAttributesRequest +ListTypedLinkFacetAttributesResponse +ListTypedLinkFacetNamesRequest +ListTypedLinkFacetNamesResponse +ListTypesByAssociationRequest +ListTypesByAssociationResponse +ListTypesInput +ListTypesOutput +ListTypesRequest +ListTypesResponse +ListUniqueProblemsRequest +ListUniqueProblemsResult +ListUnsupportedAppVersionResourcesRequest +ListUnsupportedAppVersionResourcesResponse +ListUpdateToken +ListUpdatesRequest +ListUpdatesResponse +ListUploadsRequest +ListUploadsResult +ListUsageForLicenseConfigurationRequest +ListUsageForLicenseConfigurationResponse +ListUsageLimitsRequest +ListUsageLimitsResponse +ListUsageTotalsRequest +ListUsageTotalsResponse +ListUseCasesRequest +ListUseCasesResponse +ListUserAccessLoggingSettingsRequest +ListUserAccessLoggingSettingsResponse +ListUserAssociationsRequest +ListUserAssociationsResponse +ListUserGroupsRequest +ListUserGroupsResponse +ListUserHierarchyGroupsRequest +ListUserHierarchyGroupsResponse +ListUserImportJobsRequest +ListUserImportJobsResponse +ListUserPoliciesRequest +ListUserPoliciesResponse +ListUserPoolClientsRequest +ListUserPoolClientsResponse +ListUserPoolsRequest +ListUserPoolsResponse +ListUserProfilesRequest +ListUserProfilesResponse +ListUserProfilesResult +ListUserSettingsRequest +ListUserSettingsResponse +ListUserTagsRequest +ListUserTagsResponse +ListUsersByPermissionGroupRequest +ListUsersByPermissionGroupResponse +ListUsersFilters +ListUsersInGroupRequest +ListUsersInGroupResponse +ListUsersRequest +ListUsersResponse +ListUtteranceAnalyticsDataRequest +ListUtteranceAnalyticsDataResponse +ListUtteranceMetricsRequest +ListUtteranceMetricsResponse +ListV2LoggingLevelsRequest +ListV2LoggingLevelsResponse +ListVPCAssociationAuthorizationsRequest +ListVPCAssociationAuthorizationsResponse +ListVPCConnectionsRequest +ListVPCConnectionsResponse +ListVPCEConfigurationsRequest +ListVPCEConfigurationsResult +ListVariantImportJobsFilter +ListVariantImportJobsRequest +ListVariantImportJobsResponse +ListVariantStoresFilter +ListVariantStoresRequest +ListVariantStoresResponse +ListVaultsInput +ListVaultsOutput +ListVectorEnrichmentJobInput +ListVectorEnrichmentJobOutput +ListVectorEnrichmentJobOutputConfig +ListVehiclesInFleetRequest +ListVehiclesInFleetResponse +ListVehiclesRequest +ListVehiclesResponse +ListVerifiedEmailAddressesResponse +ListVersionsByFunctionRequest +ListVersionsByFunctionResponse +ListVersionsRequest +ListVersionsResponse +ListViewVersionsRequest +ListViewVersionsResponse +ListViewsInput +ListViewsOutput +ListViewsRequest +ListViewsResponse +ListViolationEventsRequest +ListViolationEventsResponse +ListVirtualClustersRequest +ListVirtualClustersResponse +ListVirtualGatewaysInput +ListVirtualGatewaysOutput +ListVirtualInterfaceTestHistoryRequest +ListVirtualInterfaceTestHistoryResponse +ListVirtualMFADevicesRequest +ListVirtualMFADevicesResponse +ListVirtualMachinesInput +ListVirtualMachinesOutput +ListVirtualNodesInput +ListVirtualNodesOutput +ListVirtualRoutersInput +ListVirtualRoutersOutput +ListVirtualServicesInput +ListVirtualServicesOutput +ListVocabulariesRequest +ListVocabulariesResponse +ListVocabularyFiltersRequest +ListVocabularyFiltersResponse +ListVodSourcesRequest +ListVodSourcesResponse +ListVoiceConnectorGroupsRequest +ListVoiceConnectorGroupsResponse +ListVoiceConnectorTerminationCredentialsRequest +ListVoiceConnectorTerminationCredentialsResponse +ListVoiceConnectorsRequest +ListVoiceConnectorsResponse +ListVoiceProfileDomainsRequest +ListVoiceProfileDomainsResponse +ListVoiceProfilesRequest +ListVoiceProfilesResponse +ListVolumeInitiatorsInput +ListVolumeInitiatorsOutput +ListVolumeRecoveryPointsInput +ListVolumeRecoveryPointsOutput +ListVolumesInput +ListVolumesOutput +ListVpcConnectionsRequest +ListVpcConnectionsResponse +ListVpcConnectorsRequest +ListVpcConnectorsResponse +ListVpcEndpointAccessRequest +ListVpcEndpointAccessResponse +ListVpcEndpointsForDomainRequest +ListVpcEndpointsForDomainResponse +ListVpcEndpointsRequest +ListVpcEndpointsResponse +ListVpcIngressConnectionsFilter +ListVpcIngressConnectionsRequest +ListVpcIngressConnectionsResponse +ListWatchlistsRequest +ListWatchlistsResponse +ListWavesRequest +ListWavesRequestFilters +ListWavesResponse +ListWebACLsRequest +ListWebACLsResponse +ListWebhookItem +ListWebhooksInput +ListWebhooksOutput +ListWebhooksRequest +ListWebhooksResult +ListWebsiteAuthorizationProvidersRequest +ListWebsiteAuthorizationProvidersResponse +ListWebsiteCertificateAuthoritiesRequest +ListWebsiteCertificateAuthoritiesResponse +ListWhatIfAnalysesRequest +ListWhatIfAnalysesResponse +ListWhatIfForecastExportsRequest +ListWhatIfForecastExportsResponse +ListWhatIfForecastsRequest +ListWhatIfForecastsResponse +ListWirelessDeviceImportTasksRequest +ListWirelessDeviceImportTasksResponse +ListWirelessDevicesRequest +ListWirelessDevicesResponse +ListWirelessGatewayTaskDefinitionsRequest +ListWirelessGatewayTaskDefinitionsResponse +ListWirelessGatewaysRequest +ListWirelessGatewaysResponse +ListWorkGroupsInput +ListWorkGroupsOutput +ListWorkerBlocksRequest +ListWorkerBlocksResponse +ListWorkerConfigurationsRequest +ListWorkerConfigurationsResponse +ListWorkerFleetsRequest +ListWorkerFleetsResponse +ListWorkersRequest +ListWorkersResponse +ListWorkersWithQualificationTypeRequest +ListWorkersWithQualificationTypeResponse +ListWorkflowExecutionsRequest +ListWorkflowExecutionsResponse +ListWorkflowStepExecutionsRequest +ListWorkflowStepExecutionsResponse +ListWorkflowStepGroupsRequest +ListWorkflowStepGroupsResponse +ListWorkflowStepsRequest +ListWorkflowStepsResponse +ListWorkflowTypesInput +ListWorkflowsItem +ListWorkflowsRequest +ListWorkflowsResponse +ListWorkforcesRequest +ListWorkforcesResponse +ListWorkgroupsRequest +ListWorkgroupsResponse +ListWorkloadSharesInput +ListWorkloadSharesOutput +ListWorkloadsInput +ListWorkloadsOutput +ListWorkloadsRequest +ListWorkloadsResponse +ListWorkspacesRequest +ListWorkspacesResponse +ListWorkteamsRequest +ListWorkteamsResponse +ListWorldExportJobsRequest +ListWorldExportJobsResponse +ListWorldGenerationJobsRequest +ListWorldGenerationJobsResponse +ListWorldTemplatesRequest +ListWorldTemplatesResponse +ListWorldsRequest +ListWorldsResponse +ListXssMatchSetsRequest +ListXssMatchSetsResponse +ListZonalShiftsRequest +ListZonalShiftsResponse +ListedAccess +ListedAgreement +ListedBridge +ListedCertificate +ListedConnector +ListedEntitlement +ListedExecution +ListedFlow +ListedGateway +ListedGatewayInstance +ListedHostKey +ListedProfile +ListedServer +ListedUser +ListedWorkflow +Listener +ListenerAddress +ListenerArn +ListenerArns +ListenerDescription +ListenerDescriptions +ListenerEndpoint +ListenerNotFoundException +ListenerPort +ListenerSummary +ListenerTls +ListenerTlsAcmCertificate +ListenerTlsFileCertificate +ListenerTlsSdsCertificate +ListenerTlsValidationContext +Listeners +ListingId +ListingTime +LiteralArrayOptions +LiteralOptions +LiveConnectorRTMPConfiguration +LiveConnectorSinkConfiguration +LiveConnectorSourceConfiguration +LivePoolProgress +LivePreRollConfiguration +LiveSimulationState +LiveSource +LiveSourceName +LivenessOutputConfig +LoRaWAN +LoRaWANConnectionStatusEventNotificationConfigurations +LoRaWANConnectionStatusResourceTypeEventConfiguration +LoRaWANDevice +LoRaWANDeviceMetadata +LoRaWANDeviceProfile +LoRaWANFuotaTask +LoRaWANFuotaTaskGetInfo +LoRaWANGateway +LoRaWANGatewayCurrentVersion +LoRaWANGatewayMetadata +LoRaWANGatewayVersion +LoRaWANGetServiceProfileInfo +LoRaWANJoinEventNotificationConfigurations +LoRaWANJoinResourceTypeEventConfiguration +LoRaWANListDevice +LoRaWANMulticast +LoRaWANMulticastGet +LoRaWANMulticastMetadata +LoRaWANMulticastSession +LoRaWANNetworkServerCertificateId +LoRaWANSendDataToDevice +LoRaWANServiceProfile +LoRaWANStartFuotaTask +LoRaWANUpdateDevice +LoRaWANUpdateGatewayTaskCreate +LoRaWANUpdateGatewayTaskEntry +LoRoCenterMixLevel +LoRoSurroundMixLevel +Loa +LoadAverage +LoadBalancer +LoadBalancerAddress +LoadBalancerAddresses +LoadBalancerArn +LoadBalancerArns +LoadBalancerAttribute +LoadBalancerAttributeNotFoundException +LoadBalancerAttributes +LoadBalancerDescription +LoadBalancerDescriptions +LoadBalancerInfo +LoadBalancerListenerPort +LoadBalancerName +LoadBalancerNames +LoadBalancerNotFoundException +LoadBalancerOptions +LoadBalancerPort +LoadBalancerPorts +LoadBalancerState +LoadBalancerTarget +LoadBalancerTargetGroup +LoadBalancerTargetGroupARN +LoadBalancerTargetGroupState +LoadBalancerTargetGroups +LoadBalancerTargetPort +LoadBalancerTlsCertificate +LoadBalancerTlsCertificateDnsRecordCreationState +LoadBalancerTlsCertificateDomainValidationOption +LoadBalancerTlsCertificateDomainValidationRecord +LoadBalancerTlsCertificateRenewalSummary +LoadBalancerTlsCertificateSummary +LoadBalancerTlsPolicy +LoadBalancerType +LoadBalancers +LoadBalancersConfig +LoadBasedAutoScalingConfiguration +LoadBasedAutoScalingConfigurations +LoadDryRunConfig +LoadForecast +LoadPermission +LoadPermissionModifications +LoadPermissionRequest +LoadPermissions +LoadSampleData +LoadThreshold +LoadTimeout +LoadUrlAccessDeniedException +LoaderIdResult +LoadingAnimation +LocalAddress +LocalBgpAsn +LocalCollectorS3Access +LocalConsolePassword +LocalDeviceResourceData +LocalDirectoryPath +LocalDomainInfo +LocalGateway +LocalGatewayId +LocalGatewayIds +LocalGatewayRoute +LocalGatewayRouteTable +LocalGatewayRouteTableArn +LocalGatewayRouteTableId +LocalGatewayRouteTableIds +LocalGatewayRouteTableVirtualInterfaceGroupAssociation +LocalGatewayRouteTableVirtualInterfaceGroupAssociationId +LocalGatewayRouteTableVirtualInterfaceGroupAssociationIds +LocalGatewayRouteTableVirtualInterfaceGroupAssociations +LocalGatewayRouteTableVpcAssociation +LocalGatewayRouteTableVpcAssociationId +LocalGatewayRouteTableVpcAssociationIds +LocalGatewayRouteTableVpcAssociations +LocalGatewayRouteTables +LocalGatewayVirtualInterface +LocalGatewayVirtualInterfaceGroup +LocalGatewayVirtualInterfaceGroupId +LocalGatewayVirtualInterfaceGroupIds +LocalGatewayVirtualInterfaceGroups +LocalGatewayVirtualInterfaceId +LocalGatewayVirtualInterfaceIds +LocalGatewayVirtualInterfaces +LocalGateways +LocalHealthEventsConfig +LocalIpDetails +LocalIpv4NetworkCidr +LocalIpv6NetworkCidr +LocalMountPath +LocalNavigationConfiguration +LocalPath +LocalPortDetails +LocalProfileId +LocalSecondaryIndex +LocalSecondaryIndexDescription +LocalSecondaryIndexInfo +LocalSecondaryIndexOverride +LocalSecondaryIndexes +LocalSizeConfig +LocalStorage +LocalStorageTypes +LocalTarget +LocalTime +LocalVolumeResourceData +LocalWriteForwardingStatus +Locale +LocaleCode +LocaleId +LocaleValue +LocaleValues +Locality +Location +LocationARN +LocationAction +LocationArn +LocationAttributes +LocationConfiguration +LocationConstraint +LocationFilter +LocationListEntry +LocationModel +LocationName +LocationOrder +LocationState +LocationStates +LocationSummary +LocationTimestamp +LocationType +LocationUri +Locations +LockConfiguration +LockDate +LockEndTime +LockRuleRequest +LockRuleResponse +LockState +LockToken +Locked +LockedSubscriptionException +LockoutPreventedException +LockoutPreventionException +LogAnomalyClass +LogAnomalyClasses +LogAnomalyShowcase +LogAnomalyShowcases +LogAnomalyToken +LogAnomalyType +LogBucket +LogBucketList +LogConfig +LogConfiguration +LogConfigurationForChannel +LogConfigurationType +LogConfigurations +LogDelivery +LogDeliveryBucket +LogDeliveryConfiguration +LogDeliveryConfigurationRequest +LogDeliveryConfigurationType +LogDeliveryConfigurations +LogDeliveryDescription +LogDeliveryStatus +LogDestination +LogDestinationConfig +LogDestinationConfigs +LogDestinationPermissionException +LogDestinationType +LogDriver +LogEnabled +LogEncryptionKmsKeyId +LogEvent +LogEventId +LogEventTimestamp +LogExports +LogFile +LogFileData +LogFileName +LogFilePath +LogFilePrefix +LogFileValidationEnabled +LogFilter +LogFormat +LogGroup +LogGroupArn +LogGroupField +LogGroupName +LogGroupSummary +LogLevel +LogLevelUpdate +LogOddsMetric +LogOptions +LogOutputFormat +LogPaths +LogPattern +LogPatternSets +LogPatterns +LogPublishingConfiguration +LogPublishingOption +LogPublishingOptions +LogPublishingOptionsStatus +LogResult +LogRoleArn +LogSettingsRequest +LogSettingsResponse +LogSetup +LogSource +LogStream +LogStreamARN +LogStreamARNUpdate +LogStreamArn +LogStreamName +LogStreams +LogSubscription +LogSubscriptions +LogTarget +LogTargetConfiguration +LogText +LogType +LogTypes +LogTypesToDisable +LogTypesToEnable +LogUploadEnabled +LogUri +LogUrl +LogVersion +Logarithmic +Logger +LoggerDefinitionId +LoggerDefinitionVersion +LoggerDefinitionVersionArn +LoggerDefinitionVersionId +Loggers +Logging +LoggingConfig +LoggingConfiguration +LoggingConfigurationInput +LoggingConfigurationMetadata +LoggingConfigurationStatus +LoggingConfigurationSummary +LoggingConfigurations +LoggingEnabled +LoggingFilter +LoggingInfo +LoggingLevel +LoggingOptions +LoggingOptionsPayload +LoggingRole +LoggingStatus +Logical +LogicalCapacityUsed +LogicalIdHierarchy +LogicalOperator +LogicalResourceId +LogicalResourceIds +LogicalTable +LogicalTableMap +LogicalTableSource +LogicalUsed +LoginAttribute +LoginAttributes +LoginAuthConfig +LoginAuthConfigReqObj +LoginMessage +LoginPath +LoginProfile +LoginWithAmazon +Logins +LoginsToRemove +Logo +Logo2x +Logo2xUrl +Logo3x +Logo3xUrl +LogoUrl +LogoutEndpoint +LogoutRequest +LogoutURLs +LogoutUserRequest +Logref +Logs +LogsAnomalyDetection +LogsAnomalyDetectionIntegration +LogsAnomalyDetectionIntegrationConfig +LogsConfig +LogsLocation +LogsStorageLocation +LogsSummary +Lon +LongColumnStatisticsData +LongDescription +LongFormatText +LongRangeType +LongTermPricingEndDate +LongTermPricingEntries +LongTermPricingId +LongTermPricingIds +LongTermPricingListEntry +LongTermPricingStartDate +LongTermPricingStatus +LongTermPricingType +LongValue +LongestPrefixMatches +Longitude +LookAheadRateControl +LookBackAvailablePeriods +LookBackPeriod +LookbackPeriodInDays +LookbackWindow +LookoutMetrics +LookupAttribute +LookupAttributes +LookupDeveloperIdentityInput +LookupDeveloperIdentityResponse +LookupEventsRequest +LookupEventsResponse +LookupPolicy +LookupPolicyRequest +LookupPolicyResponse +LoopDetectedException +LossValue +LoudnessLogging +Low +LowAction +LowCount +LowLatencyHlsManifests +LowerBound +LowerBoundary +LsaAnalysisId +Lt +LtRtCenterMixLevel +LtRtSurroundMixLevel +Lte +LteLocalId +LteNmr +LteNmrObj +LteObj +LteTimingAdvance +LunCount +LunNumber +LustreConfiguration +LustreFileSystemConfiguration +LustreLogConfiguration +LustreLogCreateConfiguration +LustreResponse +LustreRootSquashConfiguration +M2tsScte35Esam +M2tsSettings +M3u8Settings +MAPE +MASE +MAXIMUM +MD5 +MD5OfBody +MD5OfMessageAttributes +MD5OfMessageBody +MD5OfMessageSystemAttributes +MFA +MFADelete +MFADevice +MFADevices +MFAMethodNotFoundException +MFAMode +MFAOptionType +MFAOptions +MINIMUM +MLFramework +MLModel +MLModelId +MLModelName +MLModelType +MLResourceNotFoundException +MLTransform +MLTransformNotReadyException +MLUserDataEncryption +MSKClusterARN +MSKSourceConfiguration +MSKSourceDescription +Mac +MacAddress +MacAddressList +MacAlgorithm +MacAlgorithmDukpt +MacAlgorithmEmv +MacAlgorithms +MacLength +MacSecKey +MacValid +MacVersion +MachineLabeled +MachineLearningDetectionConfig +MachineType +MagneticDuration +MagneticStore +MagneticStoreRejectedDataLocation +MagneticStoreRetentionPeriodInDays +MagneticStoreWriteProperties +MailDomainInUseException +MailDomainNotFoundException +MailDomainStateException +MailDomainSummary +MailDomains +MailFromAttributes +MailFromDomain +MailFromDomainAttributes +MailFromDomainNotVerifiedException +MailFromDomainStatus +MailType +MailboxDeprovisionedDate +MailboxExportJob +MailboxProvisionedDate +MailboxQuota +MailboxSize +MailingAddress +Main +MainClass +MainProfileId +Maintainer +Maintenance +MaintenanceAutoAppliedAfter +MaintenanceCreateSettings +MaintenanceDay +MaintenanceDeadline +MaintenanceDetails +MaintenanceOperationsInProgress +MaintenanceOptions +MaintenanceSchedule +MaintenanceScheduledDate +MaintenanceSchedules +MaintenanceStartHour +MaintenanceStartTime +MaintenanceStatus +MaintenanceStrategies +MaintenanceTrack +MaintenanceTrackName +MaintenanceTracks +MaintenanceUpdateSettings +MaintenanceWindow +MaintenanceWindowAutomationParameters +MaintenanceWindowExecution +MaintenanceWindowExecutionTaskIdentity +MaintenanceWindowExecutionTaskInvocationIdentity +MaintenanceWindowFilter +MaintenanceWindowIdentity +MaintenanceWindowIdentityForTarget +MaintenanceWindowLambdaParameters +MaintenanceWindowRunCommandParameters +MaintenanceWindowStartTime +MaintenanceWindowStepFunctionsParameters +MaintenanceWindowTarget +MaintenanceWindowTask +MaintenanceWindowTaskInvocationParameters +MaintenanceWindowTaskParameterValueExpression +MajorEngineVersion +MajorKeyDerivationMode +MajorRevision +MajorVersion +Make +MalformedArnException +MalformedCSRException +MalformedCertificateException +MalformedPolicyDocumentException +MalformedPolicyException +MalformedPolicyTemplateException +MalformedQueryException +Malware +MalwareName +MalwarePath +MalwareProtection +MalwareProtectionConfiguration +MalwareProtectionConfigurationResult +MalwareProtectionDataSourceFreeTrial +MalwareState +MalwareType +ManageBerkshelf +ManageMasterUserPassword +ManagePropertygraphStatisticsInput +ManagePropertygraphStatisticsOutput +ManageSparqlStatisticsInput +ManageSparqlStatisticsOutput +ManagedAccount +ManagedAction +ManagedActionHistoryItem +ManagedActionHistoryItems +ManagedActionInvalidStateException +ManagedActions +ManagedAgent +ManagedAgentStateChange +ManagedBy +ManagedByFirewallManager +ManagedDataIdentifierSummary +ManagedExecution +ManagedJobTemplateSummary +ManagedKeys +ManagedKeysIPV4 +ManagedKeysIPV6 +ManagedOwnerName +ManagedPersistenceMonitoringConfiguration +ManagedPolicyArn +ManagedPolicyDetail +ManagedPrefixList +ManagedProductDescriptor +ManagedProducts +ManagedResourceSummary +ManagedResourceSummaryList +ManagedRule +ManagedRuleDescription +ManagedRuleException +ManagedRuleGroupConfig +ManagedRuleGroupConfigs +ManagedRuleGroupStatement +ManagedRuleGroupSummary +ManagedRuleGroupVersion +ManagedRuleGroups +ManagedRuleSet +ManagedRuleSetName +ManagedRuleSetSummary +ManagedRuleSetVersion +ManagedRuleSets +ManagedRuleState +ManagedRules +ManagedScaling +ManagedScalingPolicy +ManagedServiceData +ManagedStreamingKafkaParameters +ManagedType +ManagedbyFirewallManager +Management +ManagementCidrRangeConstraint +ManagementCidrRanges +ManagementState +ManagementType +ManagesVpcEndpoints +Mandatory +Manifest +ManifestCompression +ManifestConfirmConditionNotification +ManifestDurationFormat +ManifestEncoding +ManifestEncryption +ManifestEndpointPrefix +ManifestFileLocation +ManifestFilePath +ManifestFormat +ManifestGenerator +ManifestKey +ManifestLayout +ManifestMetadataSignaling +ManifestName +ManifestNameModifier +ManifestOutputLocation +ManifestOverridesPayload +ManifestPayload +ManifestPrefix +ManifestPrefixLocation +ManifestProcessingRules +ManifestS3Uri +ManifestSummary +ManifestURI +ManifestWindowSeconds +Manual +ManualEvidence +ManualMergeRequiredException +ManualSnapshotRemainingDays +ManualSnapshotRetentionPeriod +ManualSnapshotsCurrentCount +ManualSnapshotsLimit +ManualSnapshotsLimitReached +Manufacturer +ManufacturerHardwareCertificate +ManufacturerName +MapArn +MapBooleanAsBoolean +MapConfiguration +MapConfigurationUpdate +MapCustomerOwnedIpOnLaunch +MapEntries +MapEquals +MapFilter +MapIterationEventDetails +MapJsonbAsClob +MapLongVarcharAs +MapMatchingConfig +MapName +MapPublicIpOnLaunch +MapRunExecutionCounts +MapRunFailedEventDetails +MapRunItemCounts +MapRunListItem +MapRunStartedEventDetails +MapStateStartedEventDetails +MapStyleOptions +MapZoomMode +MappedDataSetParameter +MappedDataSetParameters +MappedResourceConfigurationList +MappedResourceConfigurationListItem +Mapping +MappingEntry +MappingParameters +MappingRule +Mappings +Margin +MarginPercentage +MarginStyle +MariaDbDataProviderSettings +MariaDbParameters +MarkAsArchivedRequest +MarkLatest +Marker +MarkerColor +MarkerRecordedEventAttributes +MarkerShape +MarkerSize +MarkerStyleSettings +MarkerVisibility +Market +MarketType +Marketo +MarketoConnectorProfileCredentials +MarketoConnectorProfileProperties +MarketoDestinationProperties +MarketoSourceProperties +Marketplace +MarketplaceCommerceAnalyticsException +MarketplaceDescription +MarketplaceInformation +MarketplaceOnboardingStatus +MarketplaceTitle +MarketplaceUrl +MarksNotSupportedForFormatException +Mask +MaskCharacter +MaskMode +MaskValue +Masks +Master +MasterAccountArn +MasterAccountEmail +MasterAccountId +MasterArn +MasterBackendRole +MasterCannotLeaveOrganizationException +MasterEligibleNodeCount +MasterId +MasterInstanceId +MasterInstanceSecurityGroupId +MasterInstanceType +MasterNode +MasterPublicDnsName +MasterRegion +MasterUserARN +MasterUserArn +MasterUserName +MasterUserOptions +MasterUserPassword +MasterUserSecret +MasterUserSecretKmsKeyId +MasterUsername +MasteringMonitorNits +Match +MatchAllValue +MatchAttributes +MatchConfidence +MatchCriteria +MatchGenerationDate +MatchId +MatchIds +MatchItem +MatchOperator +MatchOption +MatchOptions +MatchPaths +MatchPattern +MatchPredicates +MatchRange +MatchScope +MatchType +MatchedCategories +MatchedDetails +MatchedEventTime +MatchedPlayerSession +MatchedPlayerSessions +MatchedRules +MatchedStatements +MatchedUser +Matcher +Matches +Matching +MatchingAttributesList +MatchingBucket +MatchingEventTypes +MatchingRequest +MatchingResource +MatchingResponse +MatchingRule +MatchingRules +MatchingWorkflowSummary +MatchmakerData +MatchmakingConfiguration +MatchmakingRuleSet +MatchmakingTicket +MathActivity +MavenReference +MavenReferenceDescription +Max +Max24HourSend +MaxAbrBitrate +MaxActiveResourcesExceededException +MaxAge +MaxAgeInDays +MaxAgeInMinutes +MaxAgeRule +MaxAgeSeconds +MaxAggregationInterval +MaxAllocatedStorage +MaxAllowedRuleLevelForMatching +MaxAllowedRuleLevelForMerging +MaxAllowedSignature +MaxAlternatives +MaxAncDataSize +MaxAssignments +MaxAttempts +MaxAutoMLJobRuntimeInSeconds +MaxAverageBitrate +MaxBand +MaxBitrate +MaxCandidates +MaxCapacity +MaxCapacityBreachBehavior +MaxCapacityBuffer +MaxCapacityUnits +MaxCaptures +MaxCityNetworksToMonitor +MaxCll +MaxConcurrency +MaxConcurrentCount +MaxConcurrentDpus +MaxConcurrentGameSessionActivations +MaxConcurrentInvocationsPerInstance +MaxConcurrentPercentage +MaxConcurrentQueriesException +MaxConcurrentRuns +MaxConcurrentSessions +MaxConcurrentTaskCount +MaxConcurrentTransforms +MaxConnections +MaxConnectionsPercent +MaxContacts +MaxContentLightLevel +MaxContentSizePerPageInMegaBytes +MaxContributorCount +MaxContributorValue +MaxCount +MaxCountRule +MaxCpuUtilizationPercentage +MaxDatapoints +MaxDepth +MaxDocumentSizeExceeded +MaxDominantColors +MaxDrainDurationSeconds +MaxDuration +MaxDurationInSeconds +MaxDurationSeconds +MaxDutyCycle +MaxEirp +MaxEntries +MaxErrors +MaxExpirationTime +MaxFaces +MaxFall +MaxFetchRecordsPerShard +MaxFetchTimeInMs +MaxFileSize +MaxFiles +MaxFilesInBand +MaxFrameAverageLightLevel +MaxFrameRate +MaxGroupPreparedCapacity +MaxHeight +MaxHumanLabeledObjectCount +MaxIdleConnectionsPercent +MaxImpact +MaxInferenceUnits +MaxInstanceCount +MaxInstanceLifetime +MaxInvocations +MaxInvocationsPerMinute +MaxIopsPerDbInstance +MaxIopsPerGib +MaxItems +MaxKBytesPerRead +MaxKeys +MaxLabels +MaxLatency +MaxLength +MaxLexemeLengthExceededException +MaxLexiconsNumberExceededException +MaxLimit +MaxLinksPerPage +MaxLocalMediaSizeInMB +MaxLuminance +MaxManifestFragmentResults +MaxMediaPlaylistFragmentResults +MaxMembers +MaxMemoryUtilizationPercentage +MaxModelVersion +MaxModels +MaxNumberOfAutoScalingGroups +MaxNumberOfConfigRulesExceededException +MaxNumberOfConfigurationRecordersExceededException +MaxNumberOfConformancePacksExceededException +MaxNumberOfDeliveryChannelsExceededException +MaxNumberOfLaunchConfigurations +MaxNumberOfMessages +MaxNumberOfMessagesPerSecond +MaxNumberOfOrganizationConfigRulesExceededException +MaxNumberOfOrganizationConformancePacksExceededException +MaxNumberOfRetentionConfigurationsExceededException +MaxNumberOfTests +MaxNumberOfTrainingJobs +MaxNumberOfTrainingJobsNotImproving +MaxOffsetsPerTrigger +MaxOutputFiles +MaxOutputs +MaxP95Performance +MaxPaddingBytes +MaxParallelExecutionSteps +MaxParallelLaunches +MaxParallelOfTests +MaxParallelTrainingJobs +MaxParts +MaxPasswordAge +MaxPayloadInMB +MaxPcrInterval +MaxPercentageOfInputDatasetLabeled +MaxPixelThreshold +MaxPrice +MaxPricePerMinute +MaxProtectionGroups +MaxQueryResults +MaxRange +MaxRecordCount +MaxRecordPerRead +MaxRecords +MaxRenditions +MaxResource +MaxResults +MaxRetentionDays +MaxRetries +MaxRetryCount +MaxRetryIntervalMs +MaxRows +MaxRuntimeInSeconds +MaxRuntimePerTrainingJobInSeconds +MaxSchemaVersion +MaxScore +MaxSelectedChoices +MaxSendRate +MaxSessionDuration +MaxSize +MaxSlotDurationInHours +MaxSlotsByChannel +MaxSpeakerLabels +MaxStorageSize +MaxStorageThroughputPerDbInstance +MaxStorageThroughputPerIops +MaxStorageUtilizationPercentage +MaxSuggestionsCount +MaxSwap +MaxSyncBuffer +MaxTTL +MaxTermDurationInDays +MaxTimeToLiveInMinutes +MaxTimestampGapInDays +MaxTotalPrice +MaxUnits +MaxUploads +MaxUrlsPerMinuteCrawlRate +MaxUserDurationInSeconds +MaxUsers +MaxValue +MaxVersion +MaxVideoBitsPerSecond +MaxVisibleColumns +MaxVisibleRows +MaxVolumeLimit +MaxWaitTimeInSeconds +MaxWidth +MaxWorkers +Maximum +MaximumAllowedResources +MaximumAutomaticAttempts +MaximumBandwidthInMbps +MaximumBatchSize +MaximumBatchingWindowInSeconds +MaximumBitrate +MaximumBranchesExceededException +MaximumCapacityUnits +MaximumConcurrency +MaximumConflictResolutionEntriesExceededException +MaximumCoreCapacityUnits +MaximumDuration +MaximumEfaInterfaces +MaximumEventAgeInSeconds +MaximumExecutionFrequency +MaximumExecutionTimeoutInSeconds +MaximumFileContentToLoadExceededException +MaximumFileEntriesExceededException +MaximumFramerate +MaximumIndividualPlayerLatencyMilliseconds +MaximumInstanceCount +MaximumIops +MaximumItemsToCompareExceededException +MaximumLabelType +MaximumLength +MaximumMinimum +MaximumMinimumComputation +MaximumNetworkCards +MaximumNetworkInterfaces +MaximumNormalizedUnitsUsedPerHour +MaximumNumberOfApprovalsExceededException +MaximumNumberOfInstancesUsedPerHour +MaximumNumberOfTrailsExceededException +MaximumOnDemandCapacityUnits +MaximumOpenPullRequestsExceededException +MaximumPartitionCount +MaximumPercent +MaximumPlayerSessionCount +MaximumRGBTolerance +MaximumRecordAgeInSeconds +MaximumReplicationCount +MaximumRepositoryNamesExceededException +MaximumRepositoryTriggersExceededException +MaximumResultReturnedException +MaximumRetention +MaximumRetryAttempts +MaximumRuleTemplatesAssociatedWithRepositoryException +MaximumStringLength +MaximumSubChannels +MaximumSupportedWeightLbs +MaximumTTL +MaximumThroughputInMBps +MaximumTraversalDepth +MaximumUnits +MaximumValue +MaximumVideoBufferDelayMilliseconds +MaximumWindowInMinutes +MaximumYUV +McGroupId +Mcc +MccXml +Md5Hash +MdnResponse +MdnSigningAlgorithm +MeanTimeToRecoverInMilliseconds +MeanValue +Measure +MeasureAggregationFunction +MeasureDataLabelStyle +MeasureField +MeasureFieldId +MeasureForeground +MeasureLabelVisibility +MeasureLatency +MeasureName +MeasureNameColumn +MeasureValue +MeasureValueType +MeasureValues +Measurement +MeasurementProcessingConfig +Media +MediaCapturePipeline +MediaCapturePipelineSourceConfiguration +MediaCapturePipelineSummary +MediaCapturePipelines +MediaConcatenationPipeline +MediaConcurrencies +MediaConcurrency +MediaConnectFlow +MediaConnectFlowRequest +MediaConnectFlows +MediaConnectSettings +MediaEncoding +MediaFileUri +MediaFormat +MediaInsightsConfiguration +MediaInsightsPipeline +MediaInsightsPipelineConfiguration +MediaInsightsPipelineConfigurationArn +MediaInsightsPipelineConfigurationElement +MediaInsightsPipelineConfigurationId +MediaInsightsPipelineConfigurationName +MediaInsightsPipelineConfigurationSummary +MediaInsightsPipelineConfigurations +MediaInsightsPipelineElementStatus +MediaInsightsRuntimeMetadata +MediaLiveConnectorPipeline +MediaLiveInputArn +MediaPackageGroupSettings +MediaPackageOutputDestinationSettings +MediaPackageOutputSettings +MediaPackageSettings +MediaPipeline +MediaPipelineArn +MediaPipelineId +MediaPipelineSummary +MediaPipelines +MediaPlacement +MediaRegion +MediaSampleRate +MediaSampleRateHertz +MediaSourceConfig +MediaStorageConfiguration +MediaStoreStorageClass +MediaStream +MediaStreamAttributes +MediaStreamAttributesRequest +MediaStreamId +MediaStreamName +MediaStreamOutputConfiguration +MediaStreamOutputConfigurationRequest +MediaStreamOutputConfigurations +MediaStreamPipeline +MediaStreamSink +MediaStreamSource +MediaStreamSourceConfiguration +MediaStreamSourceConfigurationRequest +MediaStreamSourceConfigurations +MediaStreamType +MediaStreams +MediaType +MediaUriSecretArn +MediaUriType +MediaUrl +MediaconnectSettings +MedialiveInputArns +MedianRuntimeSeconds +MedicalAlternative +MedicalEntity +MedicalItem +MedicalResult +MedicalTranscript +MedicalTranscriptEvent +MedicalTranscriptionJob +MedicalTranscriptionJobName +MedicalTranscriptionJobSummaries +MedicalTranscriptionJobSummary +MedicalTranscriptionSetting +MediumAction +MediumChangerType +MediumCount +Meeting +MeetingArn +MeetingEvents +MeetingEventsConcatenationConfiguration +MeetingFeatures +MeetingFeaturesConfiguration +MeetingHostId +MeetingId +MeetingNotificationConfiguration +MeetingRoomConfiguration +MeetingSetting +Meetings +Member +MemberAccount +MemberAccountEc2DeepInspectionStatus +MemberAccountEc2DeepInspectionStatusState +MemberAccountId +MemberAccountIds +MemberAccountLimitReached +MemberAccountRuleStatus +MemberAccountStatus +MemberAccounts +MemberAdditionalConfiguration +MemberAdditionalConfigurationResult +MemberArn +MemberArns +MemberClusters +MemberClustersOutpostArns +MemberConfiguration +MemberDataSourceConfiguration +MemberDataSourceConfigurations +MemberDatasources +MemberDefinition +MemberDefinitions +MemberDetail +MemberDetails +MemberError +MemberFabricAttributes +MemberFabricConfiguration +MemberFabricLogPublishingConfiguration +MemberFeaturesConfiguration +MemberFeaturesConfigurationResult +MemberFrameworkAttributes +MemberFrameworkConfiguration +MemberGroup +MemberGroups +MemberId +MemberIdArnPair +MemberLogPublishingConfiguration +MemberName +MemberOfServiceLinkedResourceGroup +MemberSpecification +MemberStatus +MemberSummary +MemberType +MemberUser +MemberUsers +Members +Membership +MembershipCount +MembershipDatasources +MembershipExists +MembershipId +MembershipItem +MembershipItemList +MembershipProtectedQueryResultConfiguration +MembershipSummary +Memory +MemoryDuration +MemoryGB +MemoryGiBPerVCpu +MemoryGiBPerVCpuRequest +MemoryInMB +MemoryInfo +MemoryLimitExceededException +MemoryMiB +MemoryMiBRequest +MemoryRegions +MemoryReservation +MemorySize +MemorySizeConfiguration +MemorySizeInMB +MemoryStore +MemoryStoreRetentionPeriodInHours +MemoryThreshold +MemoryUtilization +MentionSentiment +Mentions +Merge +MergeAction +MergeBaseCommit +MergeBranchesByFastForwardInput +MergeBranchesByFastForwardOutput +MergeBranchesBySquashInput +MergeBranchesBySquashOutput +MergeBranchesByThreeWayInput +MergeBranchesByThreeWayOutput +MergeClause +MergeDeveloperIdentitiesInput +MergeDeveloperIdentitiesResponse +MergeHunk +MergeHunkDetail +MergeMetadata +MergeOperations +MergeOptionRequiredException +MergePolicy +MergeProfilesRequest +MergeProfilesResponse +MergePullRequestByFastForwardInput +MergePullRequestByFastForwardOutput +MergePullRequestBySquashInput +MergePullRequestBySquashOutput +MergePullRequestByThreeWayInput +MergePullRequestByThreeWayOutput +MergeShardsInput +MergeStrategy +MergeWhenMatched +MergeWhenNotMatched +MergedDatasetNames +MeshData +MeshRef +MeshServiceDiscovery +MeshSpec +MeshStatus +Message +MessageAction +MessageActivity +MessageAttributeNames +MessageAttributeValue +MessageAttributes +MessageBody +MessageBodyTextType +MessageConfig +MessageConfiguration +MessageData +MessageDeduplicationId +MessageDeliveryStatus +MessageDeliveryStatusEventConfiguration +MessageDeliveryStatusResourceTypeEventConfiguration +MessageDetail +MessageDsn +MessageFieldMappings +MessageFormat +MessageFrozen +MessageGroup +MessageGroupId +MessageId +MessageInsightsDataSource +MessageInsightsFilters +MessageMaxBytes +MessageMetadata +MessagePayload +MessagePrefix +MessageRejected +MessageRequest +MessageResponse +MessageResult +MessageReviewHandler +MessageStructure +MessageSubject +MessageSystemAttributeValue +MessageSystemAttributes +MessageTag +MessageTemplateType +MessageText +MessageTtlSeconds +MessageType +MessageTypes +Messages +MessagesPerSecond +MessagingSessionEndpoint +MetaData +MetaDataKey +MetaDataValue +Metadata +Metadata3 +Metadata4 +Metadata5 +Metadata6 +Metadata7 +Metadata8 +MetadataBlob +MetadataBlobChecksum +MetadataBlobChecksumAlgorithm +MetadataBlobLength +MetadataCatalogConfig +MetadataCatalogDetail +MetadataConfiguration +MetadataContent +MetadataControl +MetadataDestination +MetadataDirective +MetadataEntry +MetadataException +MetadataInfo +MetadataInfoMap +MetadataKey +MetadataKeyValue +MetadataKeyValuePair +MetadataList +MetadataOperation +MetadataOptions +MetadataProperties +MetadataString +MetadataToUpdate +MetadataValue +MeterUsageRequest +MeterUsageResult +MeteredLinesOfCodeCount +MeteringMode +MeteringProfileCount +MeteringRecordId +Method +MethodName +MethodNotAllowedException +MethodResponse +MethodSetting +MethodSettings +MethodSnapshot +Methods +Metric +MetricAggregationType +MetricAlarm +MetricAlarms +MetricAttribute +MetricAttribution +MetricAttributionOutput +MetricAttributionSummary +MetricCollectionType +MetricComparison +MetricComparisonComputation +MetricData +MetricDataError +MetricDataPoint +MetricDataQueries +MetricDataQuery +MetricDataResult +MetricDataResults +MetricDataSummary +MetricDataV2 +MetricDatapoint +MetricDatapoints +MetricDatum +MetricDefinition +MetricDefinitionConfig +MetricDefinitionId +MetricDefinitionIds +MetricDefinitionRequest +MetricDefinitions +MetricDescription +MetricDestinationSummary +MetricDimension +MetricDimensionGroups +MetricDimensions +MetricDisplayName +MetricFilter +MetricFilterKey +MetricFilterMatchRecord +MetricFilterV2 +MetricFilterValues +MetricFilters +MetricGoal +MetricGoalConfig +MetricGranularityType +MetricGroups +MetricHeaderCellStyle +MetricIndex +MetricInfo +MetricIntervalLowerBound +MetricIntervalUpperBound +MetricKeyDataPoints +MetricLevelImpact +MetricLevelImpactList +MetricList +MetricMathAnomalyDetector +MetricMonitor +MetricMonitorConfig +MetricName +MetricNames +MetricNamespace +MetricPlacement +MetricPoint +MetricPoints +MetricPolicy +MetricPolicyRule +MetricPolicyRules +MetricProcessingConfig +MetricQueries +MetricQuery +MetricResult +MetricResultV2 +MetricResults +MetricSetArn +MetricSetDataQualityMetric +MetricSetDataQualityMetricList +MetricSetDescription +MetricSetDimensionFilter +MetricSetFrequency +MetricSetName +MetricSetSummary +MetricSetSummaryList +MetricSource +MetricSpecification +MetricSpecifications +MetricStat +MetricStatisticRecommendation +MetricStreamEntry +MetricStreamFilter +MetricStreamStatisticsConfiguration +MetricStreamStatisticsMetric +MetricTimezone +MetricToRetain +MetricTransformation +MetricType +MetricTypes +MetricV2 +MetricValue +MetricValueList +MetricWidget +MetricWidgetImage +MetricWindow +Metrics +MetricsAnalyzed +MetricsAndOperator +MetricsConfiguration +MetricsConfigurationList +MetricsDataSource +MetricsEnabled +MetricsLevel +MetricsLevelUpdate +MetricsOverLookbackPeriod +MetricsSource +MetricsSummary +Metro +Mfa +MfaAuthenticated +MfaConfiguration +MfaEmail +MfaTypes +MicroF1Score +MicroPrecision +MicroRecall +MicrosoftSQLServerCatalogSource +MicrosoftSQLServerCatalogTarget +MicrosoftSQLServerSettings +MicrosoftSqlServerDataProviderSettings +MiddleName +MigrateWorkspaceRequest +MigrateWorkspaceResult +MigrationAdmin +MigrationAlert +MigrationErrorReason +MigrationErrorType +MigrationProject +MigrationProjectArn +MigrationProjectCreationTime +MigrationProjectIdentifier +MigrationProjectName +MigrationProjects +MigrationSummary +MigrationTask +MigrationTaskName +MigrationTaskSummary +MigrationTaskSummaryList +MigrationType +MigrationWorkflowSummary +Milestone +MilestoneName +MilestoneNumber +MilestoneSummaries +MilestoneSummary +MillisBehindLatest +MimeType +Min +MinAbrBitrate +MinAdjustmentMagnitude +MinAdjustmentStep +MinAllocatedStorage +MinAllowedConfidenceScoreForMerging +MinBottomRenditionSize +MinBoundingBoxHeight +MinBoundingBoxWidth +MinBufferTime +MinBufferTimeSeconds +MinCapacity +MinCapacityUnits +MinConfidence +MinCount +MinCoveragePercentage +MinDuration +MinEbpInterval +MinFinalSegmentLength +MinGwDiversity +MinHealthyPercentage +MinIInterval +MinInferenceUnits +MinInvocationsPerMinute +MinIopsPerDbInstance +MinIopsPerGib +MinLatency +MinLength +MinLuminance +MinMax +MinMaxGradient +MinModelVersion +MinPartitions +MinPauseBetweenCheckpoints +MinPauseBetweenCheckpointsUpdate +MinRange +MinResource +MinRetentionDays +MinSegmentConfidence +MinSegmentLength +MinSelectedChoices +MinSize +MinSlotDurationInHours +MinStorageBytesPercentage +MinStorageSize +MinStorageThroughputPerDbInstance +MinStorageThroughputPerIops +MinTTL +MinTargetCapacity +MinTermDurationInDays +MinTopRenditionSize +MinTrafficImpact +MinUnits +MinUpdatePeriodSeconds +MinValue +MinVersion +MinVideoBitsPerSecond +MinWorkers +MinimalKeyLength +Minimum +MinimumBitrate +MinimumCapacityUnits +MinimumCompressionSize +MinimumEngineVersion +MinimumEngineVersionPerAllowedValue +MinimumGranularity +MinimumHealthyHosts +MinimumHealthyPercent +MinimumInstanceCount +MinimumInstanceMetadataServiceVersion +MinimumLabelType +MinimumLength +MinimumMembershipPercentage +MinimumNormalizedUnitsUsedPerHour +MinimumNumTapes +MinimumNumberOfInstancesUsedPerHour +MinimumNumberOfQueryingUsers +MinimumPasswordLength +MinimumProtocolVersion +MinimumQueryCount +MinimumRGBTolerance +MinimumRequiredMinorEngineVersion +MinimumRetention +MinimumUnits +MinimumValue +MinimumYUV +MinorRevision +MinorVersion +MinuteOfHour +Minutes +MissingAuthenticationToken +MissingBlueprints +MissingBody +MissingCodecPrivateDataException +MissingCompleteSensorData +MissingComponent +MissingContextValues +MissingCount +MissingDataConfiguration +MissingDataConfigurations +MissingDateVisibility +MissingFileCacheConfiguration +MissingFileSystemConfiguration +MissingMeta +MissingOnRds +MissingParameterException +MissingParameterValueException +MissingPercentage +MissingRenderingAttributeException +MissingRequiredParameter +MissingRequiredParameterException +MissingSensorData +MissingValues +MissingVersionException +MissingVolumeConfiguration +MissingWorkflows +MissionProfileIdResponse +MissionProfileListItem +Mitigation +MitigationAction +MitigationActionIdentifier +MitigationActionParams +MitigationName +Mitigations +Mixed +MixedInstancesPolicy +MixedMeasureMapping +MixedMeasureMappings +MlConfigDefinition +MlResourceDefinition +MlUserDataEncryption +MlUserDataEncryptionMode +Mnc +Mobile +MobileDeviceAccessMatchedRule +MobileDeviceAccessOverride +MobileDeviceAccessRule +MobileDeviceAccessRuleId +MobilePhoneNumber +MobileSdkRelease +Mode +ModeBlock +Model +ModelApprovalStatus +ModelArn +ModelArtifact +ModelArtifacts +ModelBiasAppSpecification +ModelBiasBaselineConfig +ModelBiasJobInput +ModelBiasJobOutputConfig +ModelCacheSetting +ModelCard +ModelCardArn +ModelCardExportArtifacts +ModelCardExportJobArn +ModelCardExportJobName +ModelCardExportJobNameContains +ModelCardExportJobSummaries +ModelCardExportJobSummary +ModelCardExportOutputConfig +ModelCardName +ModelCardProcessingStatus +ModelCardSecurityConfig +ModelCardStatus +ModelCardSummaries +ModelCardSummary +ModelCardVersion +ModelCardVersionSummary +ModelCardVersionSummaryList +ModelClientConfig +ModelConfigs +ModelConfiguration +ModelCustomizationJobSummary +ModelDashboardEndpoint +ModelDashboardIndicator +ModelDashboardIndicatorAction +ModelDashboardModel +ModelDashboardModelCard +ModelDashboardMonitoringSchedule +ModelDataDownloadTimeoutInSeconds +ModelDataQuality +ModelDataSource +ModelDataUrl +ModelDeployConfig +ModelDeployResult +ModelDescription +ModelDigests +ModelEndpointDataBlob +ModelError +ModelErrorException +ModelExplainabilityAppSpecification +ModelExplainabilityBaselineConfig +ModelExplainabilityJobInput +ModelExplainabilityJobOutputConfig +ModelHandle +ModelId +ModelInfrastructureConfig +ModelInput +ModelInputConfiguration +ModelInsights +ModelIntrospectionSchema +ModelKmsKeyId +ModelLatency +ModelLatencyThreshold +ModelLatencyThresholds +ModelManifestSummary +ModelMetadata +ModelMetadataFilter +ModelMetadataSearchExpression +ModelMetadataSummaries +ModelMetadataSummary +ModelMetrics +ModelName +ModelNameBeginsWith +ModelNameContains +ModelNameEquals +ModelNotReadyException +ModelOutputConfiguration +ModelPackage +ModelPackageArn +ModelPackageArnList +ModelPackageContainerDefinition +ModelPackageDescription +ModelPackageGroup +ModelPackageGroupArn +ModelPackageGroupDescription +ModelPackageGroupName +ModelPackageGroupStatus +ModelPackageGroupSummary +ModelPackageGroupSummaryList +ModelPackageName +ModelPackageStatus +ModelPackageStatusDetails +ModelPackageStatusItem +ModelPackageSummaries +ModelPackageSummary +ModelPackageSummaryList +ModelPackageType +ModelPackageValidationProfile +ModelPackageValidationSpecification +ModelPackageVersion +ModelPackageVersionArn +ModelPackageVersionArnEquals +ModelPackagingConfiguration +ModelPackagingDescription +ModelPackagingJobDescription +ModelPackagingJobMetadata +ModelPackagingJobs +ModelPackagingMethod +ModelPackagingOutputDetails +ModelPerformance +ModelPolicy +ModelQuality +ModelQualityAppSpecification +ModelQualityBaselineConfig +ModelQualityJobInput +ModelQualityJobOutputConfig +ModelRegisterSettings +ModelScores +ModelSelectionExpression +ModelSettings +ModelSetupTime +ModelSignature +ModelStats +ModelStatus +ModelStepMetadata +ModelStreamError +ModelStreamErrorException +ModelSummaries +ModelSummary +ModelTimeoutException +ModelType +ModelVariantActions +ModelVariantConfig +ModelVariantConfigSummary +ModelVariants +ModelVersion +ModelVersionActivatedAt +ModelVersionArn +ModelVersionDetail +ModelVersionEvaluation +ModelVersionSummaries +ModelVersionSummary +Models +ModerationLabel +ModerationLabels +ModerationModelVersion +Moderator +ModeratorArns +ModificationResults +ModificationState +ModificationStates +ModificationTime +Modifications +ModifiedAfter +ModifiedAt +ModifiedBefore +ModifiedDate +ModifiedRange +ModifiedSinceConstraint +ModifiedTimeAfter +ModifiedTimeBefore +ModifiedTimestamp +ModifierPercentage +ModifyAccountRequest +ModifyActivityStreamRequest +ModifyActivityStreamResponse +ModifyAddressAttributeRequest +ModifyAddressAttributeResult +ModifyAquaInputMessage +ModifyAquaOutputMessage +ModifyAuthenticationProfileMessage +ModifyAuthenticationProfileResult +ModifyAvailabilityZoneGroupRequest +ModifyAvailabilityZoneGroupResult +ModifyBackupAttributesRequest +ModifyBackupAttributesResponse +ModifyCacheClusterMessage +ModifyCacheClusterResult +ModifyCacheParameterGroupMessage +ModifyCacheSubnetGroupMessage +ModifyCacheSubnetGroupResult +ModifyCapacityReservationFleetRequest +ModifyCapacityReservationFleetResult +ModifyCapacityReservationRequest +ModifyCapacityReservationResult +ModifyCertificateBasedAuthPropertiesRequest +ModifyCertificatesMessage +ModifyCertificatesResult +ModifyClientPropertiesRequest +ModifyClientVpnEndpointRequest +ModifyClientVpnEndpointResult +ModifyClusterDbRevisionMessage +ModifyClusterDbRevisionResult +ModifyClusterIamRolesMessage +ModifyClusterIamRolesResult +ModifyClusterInput +ModifyClusterMaintenanceMessage +ModifyClusterMaintenanceResult +ModifyClusterMessage +ModifyClusterOutput +ModifyClusterParameterGroupMessage +ModifyClusterRequest +ModifyClusterResponse +ModifyClusterResult +ModifyClusterSnapshotMessage +ModifyClusterSnapshotResult +ModifyClusterSnapshotScheduleMessage +ModifyClusterSubnetGroupMessage +ModifyClusterSubnetGroupResult +ModifyConversionConfigurationMessage +ModifyConversionConfigurationResponse +ModifyCurrentDBClusterCapacityMessage +ModifyCustomDBEngineVersionMessage +ModifyCustomDomainAssociationMessage +ModifyCustomDomainAssociationResult +ModifyDBClusterEndpointMessage +ModifyDBClusterEndpointOutput +ModifyDBClusterMessage +ModifyDBClusterParameterGroupMessage +ModifyDBClusterResult +ModifyDBClusterSnapshotAttributeMessage +ModifyDBClusterSnapshotAttributeResult +ModifyDBInstanceMessage +ModifyDBInstanceResult +ModifyDBParameterGroupMessage +ModifyDBProxyEndpointRequest +ModifyDBProxyEndpointResponse +ModifyDBProxyRequest +ModifyDBProxyResponse +ModifyDBProxyTargetGroupRequest +ModifyDBProxyTargetGroupResponse +ModifyDBSnapshotAttributeMessage +ModifyDBSnapshotAttributeResult +ModifyDBSnapshotMessage +ModifyDBSnapshotResult +ModifyDBSubnetGroupMessage +ModifyDBSubnetGroupResult +ModifyDataProviderMessage +ModifyDataProviderResponse +ModifyDefaultCreditSpecificationRequest +ModifyDefaultCreditSpecificationResult +ModifyDocumentPermissionRequest +ModifyEbsDefaultKmsKeyIdRequest +ModifyEbsDefaultKmsKeyIdResult +ModifyEndpointAccessMessage +ModifyEndpointMessage +ModifyEndpointResponse +ModifyEventSubscriptionMessage +ModifyEventSubscriptionResponse +ModifyEventSubscriptionResult +ModifyFleetRequest +ModifyFleetResult +ModifyFpgaImageAttributeRequest +ModifyFpgaImageAttributeResult +ModifyGlobalClusterMessage +ModifyGlobalClusterResult +ModifyGlobalReplicationGroupMessage +ModifyGlobalReplicationGroupResult +ModifyHapgRequest +ModifyHapgResponse +ModifyHostsRequest +ModifyHostsResult +ModifyHsmRequest +ModifyHsmResponse +ModifyIdFormatRequest +ModifyIdentityIdFormatRequest +ModifyImageAttributeRequest +ModifyInstanceAttributeRequest +ModifyInstanceCapacityReservationAttributesRequest +ModifyInstanceCapacityReservationAttributesResult +ModifyInstanceCreditSpecificationRequest +ModifyInstanceCreditSpecificationResult +ModifyInstanceEventStartTimeRequest +ModifyInstanceEventStartTimeResult +ModifyInstanceEventWindowRequest +ModifyInstanceEventWindowResult +ModifyInstanceFleetInput +ModifyInstanceGroupsInput +ModifyInstanceMaintenanceOptionsRequest +ModifyInstanceMaintenanceOptionsResult +ModifyInstanceMetadataOptionsRequest +ModifyInstanceMetadataOptionsResult +ModifyInstancePlacementRequest +ModifyInstancePlacementResult +ModifyInstanceProfileMessage +ModifyInstanceProfileResponse +ModifyIpamPoolRequest +ModifyIpamPoolResult +ModifyIpamRequest +ModifyIpamResourceCidrRequest +ModifyIpamResourceCidrResult +ModifyIpamResourceDiscoveryRequest +ModifyIpamResourceDiscoveryResult +ModifyIpamResult +ModifyIpamScopeRequest +ModifyIpamScopeResult +ModifyLaunchTemplateRequest +ModifyLaunchTemplateResult +ModifyListenerInput +ModifyListenerOutput +ModifyLoadBalancerAttributesInput +ModifyLoadBalancerAttributesOutput +ModifyLocalGatewayRouteRequest +ModifyLocalGatewayRouteResult +ModifyLunaClientRequest +ModifyLunaClientResponse +ModifyManagedPrefixListRequest +ModifyManagedPrefixListResult +ModifyMigrationProjectMessage +ModifyMigrationProjectResponse +ModifyMountTargetSecurityGroupsRequest +ModifyNetworkInterfaceAttributeRequest +ModifyOptionGroupMessage +ModifyOptionGroupResult +ModifyPrivateDnsNameOptionsRequest +ModifyPrivateDnsNameOptionsResult +ModifyRecommendationDetail +ModifyReplicationConfigMessage +ModifyReplicationConfigResponse +ModifyReplicationGroupMessage +ModifyReplicationGroupResult +ModifyReplicationGroupShardConfigurationMessage +ModifyReplicationGroupShardConfigurationResult +ModifyReplicationInstanceMessage +ModifyReplicationInstanceResponse +ModifyReplicationSubnetGroupMessage +ModifyReplicationSubnetGroupResponse +ModifyReplicationTaskMessage +ModifyReplicationTaskResponse +ModifyReportDefinitionRequest +ModifyReservedInstancesRequest +ModifyReservedInstancesResult +ModifyRuleInput +ModifyRuleOutput +ModifySamlPropertiesRequest +ModifyScheduledActionMessage +ModifySecurityGroupRulesRequest +ModifySecurityGroupRulesResult +ModifySelfservicePermissionsRequest +ModifySnapshotAttributeRequest +ModifySnapshotCopyRetentionPeriodMessage +ModifySnapshotCopyRetentionPeriodResult +ModifySnapshotScheduleMessage +ModifySnapshotTierRequest +ModifySnapshotTierResult +ModifySpotFleetRequestRequest +ModifySpotFleetRequestResponse +ModifyStatus +ModifySubnetAttributeRequest +ModifyTargetGroupAttributesInput +ModifyTargetGroupAttributesOutput +ModifyTargetGroupInput +ModifyTargetGroupOutput +ModifyTrafficMirrorFilterNetworkServicesRequest +ModifyTrafficMirrorFilterNetworkServicesResult +ModifyTrafficMirrorFilterRuleRequest +ModifyTrafficMirrorFilterRuleResult +ModifyTrafficMirrorSessionRequest +ModifyTrafficMirrorSessionResult +ModifyTransitGatewayOptions +ModifyTransitGatewayPrefixListReferenceRequest +ModifyTransitGatewayPrefixListReferenceResult +ModifyTransitGatewayRequest +ModifyTransitGatewayResult +ModifyTransitGatewayVpcAttachmentRequest +ModifyTransitGatewayVpcAttachmentRequestOptions +ModifyTransitGatewayVpcAttachmentResult +ModifyUsageLimitMessage +ModifyUserGroupMessage +ModifyUserMessage +ModifyVerifiedAccessEndpointEniOptions +ModifyVerifiedAccessEndpointLoadBalancerOptions +ModifyVerifiedAccessEndpointPolicyRequest +ModifyVerifiedAccessEndpointPolicyResult +ModifyVerifiedAccessEndpointRequest +ModifyVerifiedAccessEndpointResult +ModifyVerifiedAccessGroupPolicyRequest +ModifyVerifiedAccessGroupPolicyResult +ModifyVerifiedAccessGroupRequest +ModifyVerifiedAccessGroupResult +ModifyVerifiedAccessInstanceLoggingConfigurationRequest +ModifyVerifiedAccessInstanceLoggingConfigurationResult +ModifyVerifiedAccessInstanceRequest +ModifyVerifiedAccessInstanceResult +ModifyVerifiedAccessTrustProviderOidcOptions +ModifyVerifiedAccessTrustProviderRequest +ModifyVerifiedAccessTrustProviderResult +ModifyVolumeAttributeRequest +ModifyVolumeRequest +ModifyVolumeResult +ModifyVpcAttributeRequest +ModifyVpcEndpointConnectionNotificationRequest +ModifyVpcEndpointConnectionNotificationResult +ModifyVpcEndpointRequest +ModifyVpcEndpointResult +ModifyVpcEndpointServiceConfigurationRequest +ModifyVpcEndpointServiceConfigurationResult +ModifyVpcEndpointServicePayerResponsibilityRequest +ModifyVpcEndpointServicePayerResponsibilityResult +ModifyVpcEndpointServicePermissionsRequest +ModifyVpcEndpointServicePermissionsResult +ModifyVpcPeeringConnectionOptionsRequest +ModifyVpcPeeringConnectionOptionsResult +ModifyVpcTenancyRequest +ModifyVpcTenancyResult +ModifyVpnConnectionOptionsRequest +ModifyVpnConnectionOptionsResult +ModifyVpnConnectionRequest +ModifyVpnConnectionResult +ModifyVpnTunnelCertificateRequest +ModifyVpnTunnelCertificateResult +ModifyVpnTunnelOptionsRequest +ModifyVpnTunnelOptionsResult +ModifyVpnTunnelOptionsSpecification +ModifyWorkspaceAccessPropertiesRequest +ModifyWorkspaceCreationPropertiesRequest +ModifyWorkspacePropertiesRequest +ModifyWorkspaceStateRequest +ModifyingProcess +ModuleFilePath +ModuleInfo +ModuleLoggingConfiguration +ModuleLoggingConfigurationInput +ModuleName +ModuleSha256 +Monday +MonetaryAmount +MongoDBTarget +MongoDBTargets +MongoDbDataProviderSettings +MongoDbSettings +Monitor +MonitorArn +MonitorArnList +MonitorConfig +MonitorContactRequest +MonitorContactResponse +MonitorDataSource +MonitorDimension +MonitorErrorDetails +MonitorInfo +MonitorInstancesRequest +MonitorInstancesResult +MonitorName +MonitorSpecification +MonitorStatus +MonitorSummary +MonitorType +Monitored +MonitoredResourceARN +MonitoredResourceIdentifier +MonitoredResourceIdentifiers +MonitoredResourceInfo +MonitoredResourceName +Monitoring +MonitoringAlertActions +MonitoringAlertHistory +MonitoringAlertHistorySummary +MonitoringAlertName +MonitoringAlertSummaries +MonitoringAlertSummary +MonitoringAppSpecification +MonitoringBaselineConfig +MonitoringClusterConfig +MonitoringConfiguration +MonitoringConfigurationDescription +MonitoringConfigurationUpdate +MonitoringConstraintsResource +MonitoringCsvDatasetFormat +MonitoringDatasetFormat +MonitoringExecutionStatus +MonitoringExecutionSummaries +MonitoringExecutionSummary +MonitoringGroundTruthS3Input +MonitoringInput +MonitoringInputs +MonitoringInterval +MonitoringJobDefinition +MonitoringJobDefinitionArn +MonitoringJobDefinitionName +MonitoringJobDefinitionSummary +MonitoringJsonDatasetFormat +MonitoringNetworkConfig +MonitoringOutput +MonitoringOutputConfig +MonitoringOutputs +MonitoringResources +MonitoringRoleArn +MonitoringS3Output +MonitoringSchedule +MonitoringScheduleArn +MonitoringScheduleConfig +MonitoringScheduleName +MonitoringScheduleStatus +MonitoringScheduleSummaries +MonitoringScheduleSummary +MonitoringSchedules +MonitoringStatisticsResource +MonitoringStoppingCondition +MonitoringSubscription +MonitoringSubscriptionAlreadyExists +MonitoringTimeInMinutes +MonitoringType +MonitoringTypeEquals +Monitors +MonotonicValues +Monotonicity +Month +MonthlyCost +MonthlyLeasingPrice +MonthlyLimit +MonthlySchedule +MonthlySetting +MonthlySettings +MonthlyTransfer +MoovPlacement +MostRecent +MotionGraphicsActivateScheduleActionSettings +MotionGraphicsConfiguration +MotionGraphicsImageActivateSettings +MotionGraphicsImageDeactivateSettings +MotionGraphicsInsertion +MotionGraphicsSettings +MotionImageInserter +MotionImageInsertionFramerate +MotionImageInsertionOffset +MountName +MountOptions +MountPath +MountPoint +MountPoints +MountSource +MountTarget +MountTargetConflict +MountTargetDescription +MountTargetId +MountTargetNotFound +MountTargets +MouthOpen +MovSettings +MoveAccountRequest +MoveAddressToVpcRequest +MoveAddressToVpcResult +MoveByoipCidrToIpamRequest +MoveByoipCidrToIpamResult +MoveReplicationTaskMessage +MoveReplicationTaskResponse +MoveStatus +MoveToColdStorageAfterDays +MoveToColdStorageAt +MoveToVersionId +MoverSize +MovingAddressStatus +MovingAddressStatuses +Mp2Settings +Mp3Settings +Mp4MajorBrand +Mp4Settings +MpdLocation +MpdManifestBandwidthType +MpdProfile +MpdSettings +Mpeg2FilterSettings +Mpeg2FourCCControl +Mpeg2Settings +MqttContext +MqttHeaders +Mrap +MsSmoothAdditionalManifest +MsSmoothEncryptionSettings +MsSmoothGroupSettings +MsSmoothOutputSettings +MsrcNumber +MsrcSeverity +MssEncryption +MssManifest +MssManifests +MssPackage +Mtime +MultiAZ +MultiAZCapable +MultiAZEnabled +MultiAZWithStandbyEnabled +MultiAttachEnabled +MultiAz +MultiCondition +MultiConditionalBranch +MultiConditionalSplitActivity +MultiLayerStorage +MultiLine +MultiLineStartPattern +MultiMeasureAttributeMapping +MultiMeasureAttributeMappings +MultiMeasureMappings +MultiModelConfig +MultiPolygonGeometryInput +MultiRegion +MultiRegionAccessPointDetails +MultiRegionAccessPointPolicyDocument +MultiRegionAccessPointRegionalResponse +MultiRegionAccessPointReport +MultiRegionAccessPointRoute +MultiRegionAccessPointsAsyncResponse +MultiRegionConfiguration +MultiRegionEnabled +MultiRegionKey +MultiRegionKeyType +MultiValueAnswer +Multicast +MulticastDeviceStatus +MulticastDomainAssociations +MulticastFrameInfo +MulticastGroup +MulticastGroupByFuotaTask +MulticastGroupId +MulticastGroupList +MulticastGroups +MulticastGroupsToAdd +MulticastGroupsToRemove +MulticastIp +MulticastSupport +MulticastWirelessMetadata +Multiline +MultipartReadSetUploadListItem +MultipartUpload +MultipartUploadId +MultipleConflictResolutionEntriesException +MultipleIamArnsProvidedException +MultipleOperatingModes +MultipleRepositoriesInPullRequestException +MultipleValuesSetting +Multiplex +MultiplexGroupSettings +MultiplexId +MultiplexIds +MultiplexMediaConnectOutputDestinationSettings +MultiplexOutputDestination +MultiplexOutputSettings +MultiplexProgram +MultiplexProgramChannelDestinationSettings +MultiplexProgramPacketIdentifiersMap +MultiplexProgramPipelineDetail +MultiplexProgramServiceDescriptor +MultiplexProgramSettings +MultiplexProgramSummary +MultiplexPrograms +MultiplexSettings +MultiplexSettingsSummary +MultiplexStatmuxVideoSettings +MultiplexSummary +MultiplexVideoSettings +Multiplexes +Municipality +MustBeOwnedByCaller +MustBeRequestable +Mustache +Mutable +MutableClusterInfo +MutationActionSetStateParameter +MutationProtection +MutualAuthentication +MutualTlsAuthentication +MutualTlsAuthenticationInput +MutuallyExclusiveParameters +MuxType +MxfSettings +MxfXavcProfileSettings +MySQLCatalogSource +MySQLCatalogTarget +MySQLSettings +MySqlDataProviderSettings +MySqlParameters +N +NE +NFS +NFSDataRepositoryConfiguration +NFSFileShareDefaults +NFSFileShareInfo +NFSFileShareInfoList +NFSOnDeviceService +NFSOnDeviceServiceConfiguration +NLBResource +NS +Name +NameAlreadyExistsException +NameAssigner +NameAvailabilityException +NameContains +NameFilter +NameInUseException +NameLengthExceededException +NameModifier +NameNodes +NamePrefix +NamePrefixUpdate +NameQualifier +NameServers +NameServersUpdateState +NameStartsWith +NameTag +NameUpdate +NameValuePair +NamedEntities +NamedEntityDefinition +NamedEntityDefinitionMetric +NamedQueries +NamedQuery +NamedQueryId +NamedQueryIds +Names +Nameserver +Nameservers +Namespace +NamespaceAlreadyExists +NamespaceError +NamespaceFilter +NamespaceId +NamespaceInfoV2 +NamespaceName +NamespaceNotFound +NamespaceNotFoundException +NamespacePid +NamespaceProperties +NamespaceSummary +NamespaceType +Namespaces +Narrative +NatGateway +NatGatewayAddress +NatGatewayAddresses +NatGatewayId +NatGatewayIds +NatGateways +NativeClientId +NavigationOperation +NcharCharacterSetName +NearestModelName +Negate +Negated +Negative +NegativeColor +NegativeFormat +NegativeValueConfiguration +NeighborConnectionDetail +Neighborhood +NeoVpcConfig +NeptuneSettings +Neq +NestedFilters +NestedPropertyName +NestingLevel +NetAppONTAPCluster +NetAppONTAPClusters +NetAppONTAPSVM +NetAppONTAPSVMs +NetAppONTAPVolume +NetAppONTAPVolumes +NetBiosName +NetIdFilters +NetRISavings +NetSavings +NetmaskLength +Network +NetworkACLEntry +NetworkAccessConfiguration +NetworkAcl +NetworkAclAssociation +NetworkAclAssociationId +NetworkAclEntry +NetworkAclId +NetworkAclIds +NetworkAcls +NetworkAnalyzerConfigurationList +NetworkAnalyzerConfigurations +NetworkArtifactMeta +NetworkBandwidthGbps +NetworkBandwidthGbpsRequest +NetworkBinding +NetworkBorderGroup +NetworkCardIndex +NetworkCardInfo +NetworkCards +NetworkConfig +NetworkConfiguration +NetworkConnectionAction +NetworkDestinationDomain +NetworkDestinationIpV4 +NetworkDestinationIpV6 +NetworkDestinationPort +NetworkDirection +NetworkEndBlackout +NetworkEndBlackoutImage +NetworkEthereumAttributes +NetworkEventType +NetworkFabricAttributes +NetworkFabricConfiguration +NetworkFabricType +NetworkFailureException +NetworkFirewallBlackHoleRouteDetectedViolation +NetworkFirewallInternetTrafficNotInspectedViolation +NetworkFirewallInvalidRouteConfigurationViolation +NetworkFirewallMissingExpectedRTViolation +NetworkFirewallMissingExpectedRoutesViolation +NetworkFirewallMissingFirewallViolation +NetworkFirewallMissingSubnetViolation +NetworkFirewallPolicy +NetworkFirewallPolicyDescription +NetworkFirewallPolicyModifiedViolation +NetworkFirewallStatefulRuleGroupOverride +NetworkFirewallUnexpectedFirewallRoutesViolation +NetworkFirewallUnexpectedGatewayRoutesViolation +NetworkFrameworkAttributes +NetworkFrameworkConfiguration +NetworkHeader +NetworkId +NetworkImpairment +NetworkInBytesPerSecond +NetworkInfo +NetworkInputSettings +NetworkInsightsAccessScope +NetworkInsightsAccessScopeAnalyses +NetworkInsightsAccessScopeAnalysis +NetworkInsightsAccessScopeAnalysisArn +NetworkInsightsAccessScopeAnalysisId +NetworkInsightsAccessScopeAnalysisIds +NetworkInsightsAccessScopeArn +NetworkInsightsAccessScopeContent +NetworkInsightsAccessScopeId +NetworkInsightsAccessScopeIds +NetworkInsightsAccessScopes +NetworkInsightsAnalyses +NetworkInsightsAnalysis +NetworkInsightsAnalysisArn +NetworkInsightsAnalysisId +NetworkInsightsAnalysisIds +NetworkInsightsPath +NetworkInsightsPathArn +NetworkInsightsPathId +NetworkInsightsPathIds +NetworkInsightsPaths +NetworkInterface +NetworkInterfaceAssociation +NetworkInterfaceAttachment +NetworkInterfaceAttachmentChanges +NetworkInterfaceCount +NetworkInterfaceCountRequest +NetworkInterfaceDeviceIndex +NetworkInterfaceId +NetworkInterfaceIds +NetworkInterfaceIpv6Address +NetworkInterfaceLimitExceeded +NetworkInterfaceOptions +NetworkInterfaceOwnerId +NetworkInterfacePermission +NetworkInterfacePermissionId +NetworkInterfacePermissionIds +NetworkInterfacePermissionState +NetworkInterfacePermissions +NetworkInterfacePort +NetworkInterfacePrivateIpAddress +NetworkInterfaceSet +NetworkInterfaceType +NetworkInterfaces +NetworkLoadBalancerArn +NetworkLoadBalancerArns +NetworkMode +NetworkName +NetworkOrigin +NetworkOutBytesPerSecond +NetworkOutput +NetworkPacketsInPerSecond +NetworkPacketsOutPerSecond +NetworkPath +NetworkPathComponent +NetworkPathComponentDetails +NetworkPathFound +NetworkPayload +NetworkPerformance +NetworkPlatform +NetworkPolicyCount +NetworkProfile +NetworkProfileArn +NetworkProfileData +NetworkProfileInfo +NetworkProfileName +NetworkProfiles +NetworkProtocol +NetworkReachabilityDetails +NetworkResource +NetworkResourceCount +NetworkResourceCounts +NetworkResourceDefinition +NetworkResourceSummary +NetworkResourceUtilization +NetworkResources +NetworkRoute +NetworkRouteDestination +NetworkRoutes +NetworkServices +NetworkSettings +NetworkSettingsSummary +NetworkSite +NetworkSource +NetworkSourceDomain +NetworkSourceIpV4 +NetworkSourceIpV6 +NetworkSourceMac +NetworkSourcePort +NetworkStatus +NetworkSummary +NetworkTelemetry +NetworkType +NetworkTypeNotSupported +NetworkingConfiguration +Networks +Neutral +NeverAggregateInFilter +NeverExpires +NewAction +NewAssertionRule +NewAssociationId +NewAvailabilityZones +NewBGPPeer +NewBudget +NewClusterIdentifier +NewColumnName +NewColumnType +NewComponentName +NewContactIds +NewCustomKeyStoreName +NewCustomVocabularyItem +NewDBClusterIdentifier +NewDBInstanceIdentifier +NewDBProxyEndpointName +NewDBProxyName +NewDefaultValues +NewDeviceMetadata +NewDeviceMetadataType +NewDhcpConfiguration +NewGameSessionProtectionPolicy +NewGameSessionsPerCreator +NewGatingRule +NewGlobalClusterIdentifier +NewGroupName +NewImage +NewInThisVersionBulletPoints +NewInstancesProtectedFromScaleIn +NewLaunchProfileMember +NewMembers +NewName +NewNotification +NewObjectMetadata +NewObjectTagging +NewParameterName +NewPassword +NewPath +NewPrivateVirtualInterface +NewPrivateVirtualInterfaceAllocation +NewPublicVirtualInterface +NewPublicVirtualInterfaceAllocation +NewReplicaCount +NewReplicationFactor +NewServerCertificateName +NewStartingHashKey +NewStudioMember +NewSubscriber +NewSupportedProducts +NewTableName +NewTransitVirtualInterface +NewTransitVirtualInterfaceAllocation +NewUserName +NewValue +NewValues +NewVersion +NewerNoncurrentVersions +NexGuardFileMarkerSettings +NexguardFileMarkerSettings +NextActivity +NextContinentCode +NextContinuationToken +NextCountryCode +NextDNSName +NextExecutionTime +NextHostedZoneId +NextInvocationTime +NextInvocations +NextKeyMarker +NextLockToken +NextMaintenanceWindowStartTime +NextMarker +NextPageMarker +NextPageToken +NextPartNumberMarker +NextPassword +NextPollConfigurationToken +NextPollIntervalInSeconds +NextRecordIdentifier +NextRecordName +NextRecordType +NextRefreshTime +NextRotationDate +NextScheduledRetrainingStartDate +NextSchemaVersion +NextShardIterator +NextSigningKeyLength +NextSlotStartTime +NextStatus +NextStep +NextSubdivisionCode +NextToken +NextTransitionTime +NextUpdateAvailabilityDate +NextUpdateAvailabilityTime +NextUpdateSeconds +NextUploadIdMarker +NextVersionIdMarker +NextWebACLLockToken +Nfs +NfsExported +NfsExportedVolumes +NfsExports +NfsMountOptions +Nice +NickName +NielsenCBET +NielsenCbetSettings +NielsenConfiguration +NielsenDistributionType +NielsenId3 +NielsenId3Behavior +NielsenNaesIiNw +NielsenNaesIiNwSettings +NielsenNonLinearWatermark +NielsenNonLinearWatermarkSettings +NielsenPcmToId3Tagging +NielsenWatermarksSettings +NitInterval +NitroEnclavesSupport +NitroTpmInfo +NitroTpmSupport +NlbArn +NlbName +NoActionEmail +NoAssociatedRoleException +NoAvailableCertificateException +NoAvailableConfigurationRecorderException +NoAvailableDeliveryChannelException +NoAvailableOrganizationException +NoChangeException +NoConnectorsAvailableException +NoData +NoDataRetentionException +NoDatabaseMigrationPreference +NoDevice +NoEcho +NoEncryptionConfig +NoEntitlementsAllowedException +NoExpiry +NoFreeAddressesInSubnet +NoHexPrefix +NoManagementAccountSLRExistsException +NoManagementPreference +NoOperationFault +NoPasswordRequired +NoReboot +NoRegionalBlackoutFlag +NoRestrictions +NoRunningConfigurationRecorderException +NoScheduleException +NoSecurityExtension +NoSquashNids +NoSuchBucketException +NoSuchCachePolicy +NoSuchChange +NoSuchCidrCollectionException +NoSuchCidrLocationException +NoSuchCloudFrontOriginAccessIdentity +NoSuchCloudWatchLogsLogGroup +NoSuchConfigRuleException +NoSuchConfigRuleInConformancePackException +NoSuchConfigurationAggregatorException +NoSuchConfigurationRecorderException +NoSuchConformancePackException +NoSuchContinuousDeploymentPolicy +NoSuchDelegationSet +NoSuchDeliveryChannelException +NoSuchDistribution +NoSuchEntityException +NoSuchFieldLevelEncryptionConfig +NoSuchFieldLevelEncryptionProfile +NoSuchFunctionExists +NoSuchGeoLocation +NoSuchHealthCheck +NoSuchHostedZone +NoSuchInvalidation +NoSuchKeySigningKey +NoSuchMonitoringSubscription +NoSuchOrganizationConfigRuleException +NoSuchOrganizationConformancePackException +NoSuchOrigin +NoSuchOriginAccessControl +NoSuchOriginRequestPolicy +NoSuchPublicAccessBlockConfiguration +NoSuchPublicKey +NoSuchQueryLoggingConfig +NoSuchRealtimeLogConfig +NoSuchRemediationConfigurationException +NoSuchRemediationExceptionException +NoSuchResource +NoSuchResourceException +NoSuchResponseHeadersPolicy +NoSuchRetentionConfigurationException +NoSuchStreamingDistribution +NoSuchTrafficPolicy +NoSuchTrafficPolicyInstance +NoUpdateAvailableException +NoVoteCount +Node +NodeARN +NodeAssociationStatus +NodeAssociationStatusToken +NodeConfiguration +NodeConfigurationOption +NodeConfigurationOptionList +NodeConfigurationOptionsFilter +NodeConfigurationOptionsMessage +NodeCount +NodeCounts +NodeCreateTime +NodeDeletionDate +NodeDescription +NodeDetails +NodeEthereumAttributes +NodeExporter +NodeExporterInfo +NodeFabricAttributes +NodeFabricLogPublishingConfiguration +NodeFrameworkAttributes +NodeFromTemplateJob +NodeFromTemplateJobs +NodeGroup +NodeGroupConfiguration +NodeGroupCount +NodeGroupId +NodeGroupMember +NodeGroupMemberUpdateStatus +NodeGroupMembers +NodeGroupNotFoundFault +NodeGroupUpdateStatus +NodeGroups +NodeGroupsPerReplicationGroupQuotaExceededFault +NodeGroupsToRemove +NodeGroupsToRetain +NodeId +NodeIds +NodeIdsToReboot +NodeIdsToRemove +NodeInfo +NodeInfoList +NodeInputPort +NodeInstance +NodeInstanceId +NodeInstances +NodeInterface +NodeLogPublishingConfiguration +NodeName +NodeNotFoundFault +NodeOutputPort +NodeOverrides +NodeProperties +NodePropertiesSummary +NodePropertyOverride +NodeQuotaForClusterExceededFault +NodeQuotaForCustomerExceededFault +NodeRangeProperty +NodeRole +NodeSignal +NodeSignals +NodeSnapshot +NodeSnapshots +NodeStatus +NodeStructure +NodeSummary +NodeToNodeEncryptionOptions +NodeToNodeEncryptionOptionsStatus +NodeType +NodeTypeSpecificValue +NodeTypeSpecificValues +NodeUpdateEndDate +NodeUpdateInitiatedBy +NodeUpdateInitiatedDate +NodeUpdateStartDate +NodeUpdateStatus +NodeUpdateStatusModifiedDate +Nodegroup +NodegroupHealth +NodegroupResources +NodegroupScalingConfig +NodegroupUpdateConfig +Nodes +NodesUpdated +NoiseReducer +NoiseReducerFilterSettings +NoiseReducerSpatialFilterSettings +NoiseReducerTemporalFilterSettings +NonAdditive +NonAwsRegions +NonCompliantConformancePackCount +NonCompliantCount +NonCompliantCriticalCount +NonCompliantHighCount +NonCompliantInformationalCount +NonCompliantLowCount +NonCompliantMediumCount +NonCompliantResource +NonCompliantResourceCount +NonCompliantResources +NonCompliantRuleCount +NonCompliantSummary +NonCompliantUnspecifiedCount +NonDeletedNetworkInterfaceIds +NonKeyAttributes +NonOverridableArguments +NonRepudiation +NonRetryableError +NonTalkTimeFilter +Nonce +NoncompliantKeys +NoncurrentDays +NoncurrentVersionExpiration +NoncurrentVersionExpirationInDays +NoncurrentVersionTransition +NoncurrentVersionTransitions +None +Normal +Normalized +NormalizedInstanceHours +NormalizedValue +North +Not +NotAcceptableException +NotActions +NotAfter +NotAfterDate +NotAllowedAggregations +NotApplicable +NotApplicableCount +NotApplicableEnabled +NotAuthorizedException +NotBefore +NotBeforeDate +NotBeforeDeadline +NotConfiguredException +NotDeviceModels +NotDeviceOperatingSystems +NotDeviceTypes +NotDeviceUserAgents +NotEligibleException +NotEndsWith +NotEquals +NotFilter +NotFoundException +NotImpersonationRoleIds +NotIndexException +NotIpRanges +NotLatestPipelineExecutionException +NotNodeException +NotOrganizationManagementAccountException +NotOrganizationMasterAccountException +NotPolicyException +NotReadableInputStreamException +NotResources +NotScaledReason +NotScaledReasons +NotServiceResourceError +NotStabilizedException +NotStartsWith +NotStatement +NotSupportedOperationException +NotTargetUsers +NotUpdatableException +NotUserIds +Note +NoteText +NoteUpdate +NoteUpdatedAt +NoteUpdatedBy +NotebookExecution +NotebookExecutionId +NotebookExecutionName +NotebookExecutionSummary +NotebookExecutions +NotebookId +NotebookInstanceArn +NotebookInstanceLifecycleConfigArn +NotebookInstanceLifecycleConfigName +NotebookInstanceLifecycleConfigNameContains +NotebookInstanceLifecycleConfigSummary +NotebookInstanceLifecycleConfigs +NotebookInstanceLifecycleHook +NotebookInstanceName +NotebookInstanceSecurityGroupId +NotebookInstanceStatus +NotebookInstanceSummary +NotebookInstances +NotebookMetadata +NotebookMetadataList +NotebookOutputOption +NotebookParams +NotebookS3Location +NotebookS3LocationForOutput +NotebookS3LocationFromInput +NotebookSessionSummary +NotebookSessionsList +NotebookUrl +NotebookVersion +Notes +Notification +NotificationARNs +NotificationAction +NotificationArn +NotificationArns +NotificationAttributes +NotificationChannel +NotificationChannelConfig +NotificationConfig +NotificationConfiguration +NotificationConfigurationFilter +NotificationConfigurations +NotificationContext +NotificationDestinationConfig +NotificationEmail +NotificationEvents +NotificationFilterConfig +NotificationId +NotificationMetadata +NotificationOptions +NotificationPolicy +NotificationProperty +NotificationRecipientType +NotificationRuleSummary +NotificationRules +NotificationSetting +NotificationSettingDetail +NotificationSettingKey +NotificationSpecification +NotificationState +NotificationSummaries +NotificationSummary +NotificationTarget +NotificationTargetARN +NotificationTargetActions +NotificationTopicArn +NotificationTopicStatus +NotificationType +NotificationTypes +NotificationWithSubscribers +Notifications +NotificationsConfiguration +NotificationsEnabled +NotificationsWithSubscribers +Notify +NotifyAll +NotifyAppValidationOutputRequest +NotifyApplicationStateRequest +NotifyCollaborators +NotifyConfiguration +NotifyConfigurationType +NotifyDelayAfter +NotifyEmailType +NotifyMigrationTaskStateRequest +NotifyObjectCompleteInput +NotifyObjectCompleteOutput +NotifyProvisionProductEngineWorkflowResultInput +NotifyRecommendationsReceivedError +NotifyRecommendationsReceivedRequest +NotifyRecommendationsReceivedResponse +NotifyResourceDeploymentStatusChangeInput +NotifyTerminateProvisionedProductEngineWorkflowResultInput +NotifyUpdateProvisionedProductEngineWorkflowResultInput +NotifyWhenUploadedInput +NotifyWhenUploadedOutput +NotifyWorkersFailureCode +NotifyWorkersFailureMessage +NotifyWorkersFailureStatus +NotifyWorkersFailureStatuses +NotifyWorkersRequest +NotifyWorkersResponse +NrCapable +Ntp +NtpPayload +NtpServerName +NtpServers +NtpStatus +NullCheckBoxList +NullOption +NullPacketBitrate +NullString +NullTextList +NullValue +NullValueColor +NullValueField +NullValueFormatConfiguration +Nullable +NumCacheClusters +NumCacheNodes +NumFalseNegatives +NumFalsePositives +NumItemsEvaluated +NumNodeGroups +NumPartitions +NumRecords +NumRefFrames +NumReplicasPerShard +NumResults +NumRetries +NumShards +NumTapesToCreate +NumTimeSeries +NumTrueNegatives +NumTruePositives +Number +NumberAttributeConstraints +NumberAttributeConstraintsType +NumberBFramesBetweenReferenceFrames +NumberCapabilities +NumberDatatypeScale +NumberDisplayFormatConfiguration +NumberFilter +NumberFormatConfiguration +NumberOfAdditionalAssignments +NumberOfArchives +NumberOfAssignmentsAvailable +NumberOfAssignmentsCompleted +NumberOfAssignmentsPending +NumberOfAssociatedQueues +NumberOfAssociatedUsers +NumberOfAssociations +NumberOfAutoScalingGroups +NumberOfBacktestWindows +NumberOfBrokerNodes +NumberOfBuckets +NumberOfBytes +NumberOfCategory +NumberOfChannels +NumberOfChildJobs +NumberOfControls +NumberOfDatabases +NumberOfDecreasesToday +NumberOfDevicesInGroup +NumberOfDevicesRequested +NumberOfDisks +NumberOfDistinctValues +NumberOfDocuments +NumberOfFalses +NumberOfFiles +NumberOfFrameworks +NumberOfHumanWorkersPerDataObject +NumberOfLabels +NumberOfLargeTimestampGaps +NumberOfLaunchConfigurations +NumberOfLines +NumberOfLogLinesOccurrences +NumberOfLogLinesScanned +NumberOfMatchesFound +NumberOfMatchesInSample +NumberOfMergesDone +NumberOfMountTargets +NumberOfNodes +NumberOfNodesPerClusterLimitExceededFault +NumberOfNodesQuotaExceededFault +NumberOfNulls +NumberOfObjects +NumberOfOnCalls +NumberOfProfilesInSample +NumberOfProfilesReviewed +NumberOfProfilesWillBeMerged +NumberOfRecoveryPoints +NumberOfRuleGroupsAlreadyAssociated +NumberOfRuleTemplatesExceededException +NumberOfRules +NumberOfRulesExceededException +NumberOfSamples +NumberOfSchemas +NumberOfServicesAccessible +NumberOfServicesNotAccessed +NumberOfShards +NumberOfSteps +NumberOfTasksFailed +NumberOfTasksSucceeded +NumberOfTestDocuments +NumberOfTopics +NumberOfTrainMentions +NumberOfTrainedDocuments +NumberOfTrainingJobsObjectiveNotImproving +NumberOfTrues +NumberOfVersions +NumberOfWorkers +NumberReference +NumberReferenceFrames +NumberScale +NumberSelectionBehavior +NumberType +NumberValidateRequest +NumberValidateResponse +NumericAxisOptions +NumericEqualityDrillDownFilter +NumericEqualityFilter +NumericFormatConfiguration +NumericOperator +NumericQuestionPropertyValueAutomation +NumericRangeFilter +NumericRangeFilterValue +NumericSeparatorConfiguration +NumericalAggregationFunction +NumericalDimensionField +NumericalMeasureField +NvmeSupport +NwkGeoLoc +NwkKey +NwkSEncKey +NwkSKey +OAuth +OAuth2Credentials +OAuth2CustomParameter +OAuth2Defaults +OAuth2Properties +OAuthCredentials +OAuthGrantType +OAuthHttpParameters +OAuthParameters +OAuthProperties +OAuthProviderException +OAuthScopes +OCSPUrl +OEMEphemeris +OFIMetricDataPoint +OFIModelPerformance +OFITrainingMetricsValue +OID +OIDC +OId +OKActions +OS +OSInfo +OSRelease +OSReleaseLabel +OSUpdateSettings +OSVersion +OTAJobConfig +OTAUpdateFile +OTAUpdateInfo +OTAUpdateSummary +OU +Oauth2Credential +ObdInterface +ObdSignal +ObfuscationSetting +Object +ObjectACL +ObjectAlreadyDetachedException +ObjectArn +ObjectAttributeAction +ObjectAttributeActionType +ObjectAttributeKey +ObjectAttributeList +ObjectAttributeRange +ObjectAttributeUpdate +ObjectAttributeUpdateValue +ObjectAttributes +ObjectChecksum +ObjectChecksumAlgorithm +ObjectConfiguration +ObjectCount +ObjectCountByEncryptionType +ObjectEncryptionType +ObjectFilter +ObjectGroup +ObjectGroupName +ObjectIdentifier +ObjectIdentifierAndLinkNameTuple +ObjectIdentifiers +ObjectKey +ObjectKeyPrefix +ObjectLambdaAccessPoint +ObjectLambdaAccessPointAlias +ObjectLambdaAccessPointArn +ObjectLambdaAccessPointList +ObjectLambdaConfiguration +ObjectLambdaTransformationConfiguration +ObjectLevelStatistics +ObjectList +ObjectLockConfiguration +ObjectLockEnabled +ObjectLockEnabledForBucket +ObjectLockLegalHold +ObjectLockLegalHoldStatus +ObjectLockMode +ObjectLockRetainUntilDate +ObjectLockRetention +ObjectLockRule +ObjectName +ObjectNotDetachedException +ObjectNotFoundException +ObjectOwnership +ObjectPart +ObjectParts +ObjectReference +ObjectReplicationStatuses +ObjectSize +ObjectSizeGreaterThan +ObjectSizeLessThan +ObjectTags +ObjectToken +ObjectType +ObjectTypeField +ObjectTypeKey +ObjectTypeName +ObjectTypeNames +ObjectTypes +ObjectURL +ObjectVersion +ObjectVersionId +ObjectVersionIds +ObjectVersionUpdate +ObjectiveStatus +ObjectiveStatusCounters +Objects +ObjectsTransferred +ObservabilityConfiguration +ObservabilityConfigurationArn +ObservabilityConfigurationName +ObservabilityConfigurationRevision +ObservabilityConfigurationSummary +ObservabilityConfigurationSummaryList +ObservabilityEnabled +Observation +ObservationId +ObservationList +OccConflictException +OccurredAt +OccurrenceCount +OccurrenceDaySet +OccurrenceDays +OccurrenceRelativeToEnd +OccurrenceUnit +Occurrences +OcrLanguage +OcspConfiguration +OcspCustomCname +OcuLimitExceededException +OffCondition +OffPeakWindow +OffPeakWindowOptions +OffPeakWindowOptionsStatus +Offering +OfferingArn +OfferingClass +OfferingDescription +OfferingId +OfferingPromotion +OfferingSet +OfferingStatus +OfferingTransaction +OfferingType +Offerings +Office +OfflineDeviceCount +OfflineEncrypted +OfflineStoreConfig +OfflineStoreStatus +OfflineStoreStatusEquals +Offset +OffsetMillis +OffsetRange +OffsetRanges +OidcConfig +OidcConfigForResponse +OidcIdentityProviderConfig +OidcIdentityProviderConfigRequest +OidcMemberDefinition +OidcOptions +Ok +OkActions +OkCount +OldAction +OldImage +OldKmsKeyId +OldNotification +OldPassword +OldSubscriber +OldValue +OnClause +OnCreate +OnDemandAllocationStrategy +OnDemandBaseCapacity +OnDemandCapacityReservationOptions +OnDemandCost +OnDemandCostEquivalent +OnDemandCostOfRIHoursUsed +OnDemandFulfilledCapacity +OnDemandHours +OnDemandHoursInLookbackPeriod +OnDemandMaxPricePercentageOverLowestPrice +OnDemandMaxTotalPrice +OnDemandNormalizedUnits +OnDemandOptions +OnDemandOptionsRequest +OnDemandPercentageAboveBaseCapacity +OnDemandProvisioningSpecification +OnDemandResizeSpecification +OnDemandResizingSpecification +OnDemandSpecification +OnDemandStreamCount +OnDemandStreamCountLimit +OnDemandTargetCapacity +OnDeviceServiceConfiguration +OnEnterLifecycle +OnExceptionSteps +OnExitLifecycle +OnFailure +OnHoldBalance +OnInputLifecycle +OnPartialBatchItemFailure +OnPartialUpload +OnPremConfig +OnPremiseConfiguration +OnPremisesTagSet +OnStackFailure +OnStart +OnSuccess +OnUnauthenticatedRequest +OnUpload +OnboardedImportedDeviceCount +OnboardingStatus +OnboardingStatusReason +OneClickIdDelay +OneClickPinDelay +OneDriveConfiguration +OneDriveUserList +OneDriveUserS3Path +OneDriveUsers +OneTimePassword +Ongoing +Online +OnlineAbConfig +OnlineAbDefinition +OnlineStoreConfig +OnlineStoreConfigUpdate +OnlineStoreSecurityConfig +OnlineStoreTotalSizeBytes +OnlyAssociated +OnlyAttached +OnlyAvailable +OntapConfiguration +OntapFileSystemConfiguration +OntapResponse +OntapVolumeConfiguration +OntapVolumeType +Op +Opacity +OpenDate +OpenHours +OpenHoursRule +OpenIDAuthTTL +OpenIDClientId +OpenIDConnectConfig +OpenIDConnectProviderArn +OpenIDConnectProviderList +OpenIDConnectProviderListEntry +OpenIDIatTTL +OpenIDIssueURL +OpenIDProviderName +OpenIdConnectConfig +OpenIdConnectProviderARNs +OpenInstancePublicPortsRequest +OpenInstancePublicPortsResult +OpenMonitoring +OpenMonitoringInfo +OpenPortRange +OpenProactiveInsights +OpenReactiveInsights +OpenSearchAction +OpenSearchServiceDataSourceConfig +OpenShardCount +OpenTableFormatInput +OpenTime +OpenTransactionWindow +OpenTunnelRequest +OpenTunnelResponse +OpenXJsonSerDe +OpenZFSClientConfiguration +OpenZFSConfiguration +OpenZFSCreateRootVolumeConfiguration +OpenZFSFileSystemConfiguration +OpenZFSNfsExport +OpenZFSOriginSnapshotConfiguration +OpenZFSResponse +OpenZFSUserOrGroupQuota +OpenZFSVolumeConfiguration +OpenedBy +OperandFieldName +Operands +OperatingAddress +OperatingAddressCity +OperatingAddressCityFilter +OperatingAddressCountryCode +OperatingAddressCountryCodeFilter +OperatingAddressStateOrRegion +OperatingAddressStateOrRegionFilter +OperatingRegions +OperatingSystem +OperatingSystemConfigurationManager +OperatingSystemName +OperatingSystemVersion +OperatingSystems +Operation +OperationAbortedException +OperationArn +OperationDisabledException +OperationEndTime +OperationFailureException +OperationFilter +OperationId +OperationIdAlreadyExistsException +OperationIds +OperationInProgressException +OperationLimitExceeded +OperationName +OperationNotFound +OperationNotFoundException +OperationNotPermittedException +OperationNotPermittedFault +OperationNotSupportedException +OperationPreferences +OperationRequestedBy +OperationResultFilter +OperationStartTime +OperationState +OperationStatus +OperationStatusCheckFailedException +OperationStatusFilter +OperationStatuses +OperationSteps +OperationSummary +OperationSummaryList +OperationTimeoutException +OperationType +OperationalData +OperationalDataToDelete +Operations +OperationsRole +Operator +OplocksEnabled +OpsAggregator +OpsCenter +OpsCenterEnabled +OpsCenterIntegration +OpsCenterIntegrationConfig +OpsEntity +OpsEntityItem +OpsFilter +OpsItem +OpsItemAccessDeniedException +OpsItemAlreadyExistsException +OpsItemArn +OpsItemDataValue +OpsItemEventFilter +OpsItemEventSummary +OpsItemFilter +OpsItemFilters +OpsItemId +OpsItemIdentity +OpsItemInvalidParameterException +OpsItemLimitExceededException +OpsItemNotFoundException +OpsItemNotification +OpsItemRelatedItemAlreadyExistsException +OpsItemRelatedItemAssociationNotFoundException +OpsItemRelatedItemSummary +OpsItemRelatedItemsFilter +OpsItemSNSTopicArn +OpsItemSummaries +OpsItemSummary +OpsItemType +OpsMetadata +OpsMetadataAlreadyExistsException +OpsMetadataArn +OpsMetadataFilter +OpsMetadataInvalidArgumentException +OpsMetadataKeyLimitExceededException +OpsMetadataLimitExceededException +OpsMetadataList +OpsMetadataNotFoundException +OpsMetadataTooManyUpdatesException +OpsResultAttribute +OptIn +OptInPhoneNumberInput +OptInRequiredException +OptInStatus +OptInType +OptOut +OptOutListArn +OptOutListInformation +OptOutListName +OptOutListNames +OptOutLists +OptOutSpeakerRequest +OptOutSpeakerResponse +OptedOutException +OptedOutFilter +OptedOutNumber +OptedOutNumberInformation +OptedOutNumbers +OptedOutTimestamp +OpticalStandard +OptimisticLockException +OptimizationMetric +OptimizationObjective +OptimizationStatus +OptimizeForEndUserLocation +OptimizePerformance +OptimizedSharedDelivery +OptimizedViewPortWidth +OptimizingTime +Option +OptionConfiguration +OptionDescription +OptionGroup +OptionGroupAlreadyExistsFault +OptionGroupArn +OptionGroupDescription +OptionGroupMembership +OptionGroupMemberships +OptionGroupName +OptionGroupNotFoundFault +OptionGroupOption +OptionGroupOptionSetting +OptionGroupOptionSettings +OptionGroupOptionVersions +OptionGroupOptions +OptionGroupOptionsMessage +OptionGroupQuotaExceededFault +OptionGroups +OptionGroupsList +OptionName +OptionRefId +OptionRestrictionRegex +OptionSetting +OptionSettings +OptionSpecification +OptionStatus +OptionVersion +OptionalDeployment +OptionalFields +OptionalObjectAttributes +OptionalParameters +Options +OptionsConflictsWith +OptionsDependedOn +OptionsToInclude +OptionsToRemove +OpusSettings +Or +OrAllFilters +OrConditions +OrStatement +OracleDataProviderSettings +OracleParameters +OraclePathPrefix +OracleSQLCatalogSource +OracleSQLCatalogTarget +OracleSettings +OrcSerDe +Order +OrderBy +OrderByElement +OrderFulfilledDate +OrderId +OrderSubmissionDate +OrderSummary +OrderType +OrderableClusterOption +OrderableClusterOptions +OrderableClusterOptionsMessage +OrderableDBInstanceOption +OrderableDBInstanceOptions +OrderableDBInstanceOptionsMessage +OrderableReplicationInstance +OrderableReplicationInstances +OrderedBy +OrderedIndexedAttributeList +OrderedPhoneNumber +OrderedPhoneNumbers +OrderedRemediationActions +OrderedResourceDefinition +OrderingId +OrderingServiceEndpoint +OrderingTimestamp +Orders +Org +Organization +OrganizationAccessDeniedException +OrganizationAdditionalConfiguration +OrganizationAdditionalConfigurationResult +OrganizationAffectedEntitiesErrorItem +OrganizationAggregationSource +OrganizationAllFeaturesNotEnabledException +OrganizationArn +OrganizationArns +OrganizationAwsServiceAccessStatus +OrganizationConfigRule +OrganizationConfigRuleArn +OrganizationConfigRuleDetailedStatus +OrganizationConfigRuleName +OrganizationConfigRuleNames +OrganizationConfigRuleStatus +OrganizationConfigRuleStatuses +OrganizationConfigRuleTriggerTypes +OrganizationConfigRules +OrganizationConfiguration +OrganizationConformancePack +OrganizationConformancePackArn +OrganizationConformancePackDetailedStatus +OrganizationConformancePackDetailedStatuses +OrganizationConformancePackName +OrganizationConformancePackNames +OrganizationConformancePackStatus +OrganizationConformancePackStatuses +OrganizationConformancePackTemplateValidationException +OrganizationConformancePacks +OrganizationCustomPolicyRuleMetadata +OrganizationCustomPolicyRuleMetadataNoPolicy +OrganizationCustomRuleMetadata +OrganizationDataSourceConfigurations +OrganizationDataSourceConfigurationsResult +OrganizationEbsVolumes +OrganizationEbsVolumesResult +OrganizationEnabled +OrganizationEntityAggregate +OrganizationEvent +OrganizationEventDetails +OrganizationEventDetailsErrorItem +OrganizationEventFilter +OrganizationFeatureConfiguration +OrganizationFeatureConfigurationResult +OrganizationId +OrganizationIntegration +OrganizationKubernetesAuditLogsConfiguration +OrganizationKubernetesAuditLogsConfigurationResult +OrganizationKubernetesConfiguration +OrganizationKubernetesConfigurationResult +OrganizationMalwareProtectionConfiguration +OrganizationMalwareProtectionConfigurationResult +OrganizationManagedRuleMetadata +OrganizationName +OrganizationNode +OrganizationNodeType +OrganizationNodeValue +OrganizationNodes +OrganizationNotEmptyException +OrganizationNotFoundException +OrganizationNotInAllFeaturesModeException +OrganizationParentId +OrganizationResourceCollectionType +OrganizationResourceDetailedStatusFilters +OrganizationResourceId +OrganizationRuleStatus +OrganizationS3LogsConfiguration +OrganizationS3LogsConfigurationResult +OrganizationScanEc2InstanceWithFindings +OrganizationScanEc2InstanceWithFindingsResult +OrganizationSharingStatus +OrganizationSourceType +OrganizationStateException +OrganizationStatus +OrganizationSummaries +OrganizationSummary +OrganizationUnits +OrganizationalUnit +OrganizationalUnitArn +OrganizationalUnitArns +OrganizationalUnitDistinguishedName +OrganizationalUnitDistinguishedNames +OrganizationalUnitId +OrganizationalUnitIds +OrganizationalUnitNotEmptyException +OrganizationalUnitNotFoundException +OrganizationalUnitScope +OrganizationalUnits +OrganizationsDecisionDetail +OrganizationsException +OrganizationsNotInUseException +OrganizationsPolicyId +Orientation +OrientationCorrection +Origin +OriginAccessControl +OriginAccessControlAlreadyExists +OriginAccessControlConfig +OriginAccessControlId +OriginAccessControlInUse +OriginAccessControlList +OriginAccessControlOriginType +OriginAccessControlSummary +OriginAccessIdentity +OriginApprovalRuleTemplate +OriginCustomHeader +OriginDetails +OriginEndpoint +OriginEndpointId +OriginEndpointListConfiguration +OriginEndpointName +OriginEndpoints +OriginGroup +OriginGroupFailoverCriteria +OriginGroupMember +OriginGroupMembers +OriginGroups +OriginId +OriginKeepaliveTimeout +OriginManifestType +OriginOverride +OriginPath +OriginProtocolPolicy +OriginReadTimeout +OriginRequestPolicy +OriginRequestPolicyAlreadyExists +OriginRequestPolicyConfig +OriginRequestPolicyCookiesConfig +OriginRequestPolicyHeadersConfig +OriginRequestPolicyId +OriginRequestPolicyInUse +OriginRequestPolicyList +OriginRequestPolicyQueryStringsConfig +OriginRequestPolicySummary +OriginShield +OriginShieldRegion +OriginSnapshot +OriginSslProtocols +Original +OriginalCountryCodeIso2 +OriginalIops +OriginalMessage +OriginalMessageId +OriginalMultiAttachEnabled +OriginalName +OriginalParent +OriginalPhoneNumber +OriginalRuleSetName +OriginalSchema +OriginalScore +OriginalSize +OriginalSnapshotCreateTime +OriginalSourceFileSystemArn +OriginalStatusCode +OriginalTextCharacters +OriginalThroughput +OriginalTypeArn +OriginalTypeName +OriginalVolumeType +Origination +OriginationIdentities +OriginationIdentity +OriginationIdentityArn +OriginationIdentityMetadata +OriginationNumber +OriginationPhoneNumber +OriginationRoute +Origins +Os +OsArchitecture +OsType +OsVersion +OtaaV1_0_x +OtaaV1_1 +Other +OtherCategories +OtherCount +OtherMetadataValueList +OtherMetadataValueListItem +OtherName +OtherNonCompliantCount +OtherPolicies +Otp +OutOfCapacityException +OutPutS3Location +OutboundCall +OutboundCallConfig +OutboundCallerConfig +OutboundCallerIdName +OutboundCallerIdNumberId +OutboundCalling +OutboundCallsEnabled +OutboundConnection +OutboundConnectionStatus +OutboundContactNotPermittedException +OutboundCrossClusterSearchConnection +OutboundCrossClusterSearchConnectionStatus +OutboundEventsHTTPSEndpoint +OutboundFlowId +OutboundHeader +OutboundHostName +OutboundIp +OutboundMMS +OutboundSMS +OutboundShipment +Outcome +OutgoingCertificate +OutgoingDukptAttributes +OutgoingEncryptionAttributes +OutgoingKeyIdentifier +OutgoingTranslationAttributes +OutlierDetection +OutlierVisibility +OutlineColor +OutlineSize +Outpost +OutpostArn +OutpostCapable +OutpostConfigRequest +OutpostConfigResponse +OutpostId +OutpostIdentifier +OutpostIdentifierFilter +OutpostMode +OutpostOfflineException +OutpostResolver +OutpostResolvers +Outposts +OutpostsId +Output +OutputArn +OutputArtifact +OutputArtifacts +OutputArtifactsToRemove +OutputAttribute +OutputBand +OutputBands +OutputBucket +OutputBucketName +OutputBytes +OutputChannel +OutputChannelMapping +OutputChannels +OutputColumn +OutputColumnName +OutputColumns +OutputCompression +OutputConfig +OutputConfigInput +OutputContext +OutputDataConfig +OutputDataType +OutputDatasetS3Uri +OutputDescription +OutputDescriptions +OutputDestination +OutputDestinationSettings +OutputDetail +OutputDetails +OutputEncryptionKMSKeyId +OutputFileUriValue +OutputFilter +OutputFormat +OutputFormatConfiguration +OutputFormatOptions +OutputGroup +OutputGroupDetail +OutputGroupDetails +OutputGroupSettings +OutputGroups +OutputId +OutputKey +OutputKeyPrefix +OutputKeys +OutputLocation +OutputLocationRef +OutputLocationType +OutputLockingMode +OutputLockingSettings +OutputLogEvent +OutputName +OutputNotebookFormat +OutputNotebookS3Location +OutputNotebookS3LocationForOutput +OutputNotebookS3LocationFromInput +OutputNotebookURI +OutputPackageName +OutputPackageVersion +OutputParameter +OutputParameters +OutputRectangle +OutputReservedInstancesWillExpireAt +OutputResolution +OutputResolutionResamplingInput +OutputResolutionStackInput +OutputResources +OutputRows +OutputS3BucketName +OutputS3KeyPrefix +OutputS3Location +OutputS3Object +OutputS3Path +OutputS3Region +OutputS3Uri +OutputSchemaVersion +OutputSchemas +OutputSdt +OutputSelection +OutputSerialization +OutputSettings +OutputSource +OutputSourceId +OutputSourceType +OutputStage +OutputStartIndex +OutputTimingSource +OutputType +OutputUpdate +OutputUpdates +OutputUri +OutputUrl +OutputValue +OutputVariablesSizeExceededException +Outputs +OutsideIpAddress +OutsideIpAddressType +OutstandingVoteCount +Overage +OverallBestTrainingJob +OverallPlacement +OverallSeverity +OverallTestResultItem +OverallTestResults +OverallVolume +OverflowColumnHeaderVisibility +Overlap +OverlapStatus +Overridden +OverriddenAction +OverriddenContactIds +OverriddenParameters +Override +OverrideAction +OverrideAlreadySetException +OverrideArtifactName +OverrideButtonConfiguration +OverrideDatasetParameterOperation +OverrideOptions +OverrideParameters +OverridePullRequestApprovalRulesInput +OverrideRejection +OverrideStatusRequiredException +Overrides +OversizeHandling +OversizedConfigurationItemException +Overview +Overwrite +OverwriteExisting +OverwriteExtensionPack +OverwriteMode +Owner +OwnerAccount +OwnerAccountId +OwnerAlias +OwnerDirectoryDescription +OwnerDirectoryId +OwnerFilter +OwnerGid +OwnerId +OwnerIdentifier +OwnerIds +OwnerInformation +OwnerName +OwnerSetting +OwnerType +OwnerUid +Owners +OwnershipControls +OwnershipControlsRule +OwnershipType +OwnershipVerificationCertificateArn +OwnershipVerificationStatus +OwningAccount +OwningAccountId +OwningAccounts +OwningService +P10 +P50 +P75 +P85 +P90 +P95 +P95Metrics +P99 +P999 +PENDING +PIIDetection +PITPolicyRule +PSTNDialIn +PSTNEnabled +PUSH +PackageAggregation +PackageAggregationResponse +PackageArn +PackageDependency +PackageDescription +PackageDetails +PackageDetailsList +PackageFilter +PackageID +PackageId +PackageImportJob +PackageImportJobInputConfig +PackageImportJobOutput +PackageImportJobOutputConfig +PackageImportJobs +PackageListItem +PackageManager +PackageName +PackageObject +PackageObjects +PackageOriginConfiguration +PackageOriginRestrictions +PackagePatchVersion +PackageSource +PackageStatus +PackageSummary +PackageType +PackageVersion +PackageVersionDescription +PackageVersionError +PackageVersionHistory +PackageVersionHistoryList +PackageVersionInputConfig +PackageVersionOrigin +PackageVersionOutputConfig +PackageVersionSummary +PackageVulnerabilityDetails +Packages +Packaging +PackagingConfiguration +PackagingConfigurationId +PackagingConfigurations +PackagingGroup +PackagingGroupId +PackagingGroups +PackagingType +PackedPolicySize +PackedPolicyTooLargeException +PacketField +PacketHeaderStatement +PacketHeaderStatementRequest +PacketIdentifiersMap +PacketLength +PacketsPerSecond +PadVideo +Padding +PaddingControl +PaddingPolicy +PaddingTolerance +PaddingType +Page +PageArn +PageBreakConfiguration +PageClassification +PageConfiguration +PageFieldMappings +PageId +PageNumber +PageResolutions +PageSize +PageSizeBytes +PageToken +PageType +PageTypes +PagerDutyConfiguration +PagerDutyIncidentConfiguration +PagerDutyIncidentDetail +Pages +PaginatedLayoutConfiguration +PaginatedReportOptions +PaginationConfiguration +PaginationToken +PaginationTokenExpiredException +PanSequenceNumber +PanelConfiguration +PanelTitleOptions +PaperCanvasSizeOptions +PaperMargin +PaperOrientation +PaperSize +Par +ParControl +ParDenominator +ParNumerator +ParallelAsmReadThreads +ParallelDataConfig +ParallelDataDataLocation +ParallelDataNames +ParallelDataProperties +ParallelDataPropertiesList +ParallelLoadThreads +Parallelism +ParallelismConfiguration +ParallelismConfigurationDescription +ParallelismConfigurationUpdate +ParallelismPerKPU +ParallelismPerKPUUpdate +ParallelismUpdate +ParallelizationFactor +Param +Parameter +ParameterAdditions +ParameterAlreadyExists +ParameterApplyErrorDescription +ParameterApplyStatus +ParameterAttribute +ParameterConstraints +ParameterControl +ParameterControlId +ParameterControls +ParameterDateTimePickerControl +ParameterDeclaration +ParameterDeclarations +ParameterDefinition +ParameterDefinitions +ParameterDropDownControl +ParameterFilters +ParameterGroup +ParameterGroupAlreadyExistsFault +ParameterGroupFamily +ParameterGroupName +ParameterGroupNames +ParameterGroupNotFoundFault +ParameterGroupQuotaExceededFault +ParameterGroupStatus +ParameterGroups +ParameterHistory +ParameterInlinePolicy +ParameterKey +ParameterLimitExceeded +ParameterListControl +ParameterMapEntry +ParameterMapping +ParameterMaxVersionLimitExceeded +ParameterMetadata +ParameterName +ParameterNameValue +ParameterNameValues +ParameterNames +ParameterNotFound +ParameterObject +ParameterOverrides +ParameterPatternMismatchException +ParameterRange +ParameterRanges +ParameterRemovals +ParameterSelectableValues +ParameterSliderControl +ParameterSpec +ParameterStringFilter +ParameterTextAreaControl +ParameterTextFieldControl +ParameterType +ParameterValue +ParameterValueConfigurations +ParameterValueType +ParameterValues +ParameterVersion +ParameterVersionLabelLimitExceeded +ParameterVersionNotFound +ParameterizedStatement +Parameters +ParametersFilter +ParametersInCacheKeyAndForwardedToOrigin +ParametersToDelete +ParametersToRemove +ParametersValidTo +ParametersValidUntilTimestamp +ParametricCloudWatchMonitoringConfiguration +ParametricConfigurationOverrides +ParametricMonitoringConfiguration +ParametricS3MonitoringConfiguration +Pardot +PardotConnectorProfileCredentials +PardotConnectorProfileProperties +PardotSourceProperties +Parent +ParentArn +ParentAutomationExecutionId +ParentBotNetwork +ParentChangeSetId +ParentCommitDoesNotExistException +ParentCommitIdOutdatedException +ParentCommitIdRequiredException +ParentComponent +ParentEntityUpdateRequest +ParentFolderArn +ParentFolderId +ParentGroupId +ParentHandshakeId +ParentHyperParameterTuningJob +ParentHyperParameterTuningJobs +ParentId +ParentJobId +ParentLinks +ParentName +ParentNotFoundException +ParentPid +ParentReadinessScopes +ParentRecoveryPointArn +ParentReference +ParentSavingsPlanOffering +ParentShardId +ParentShards +ParentSnapshotId +ParentUuid +ParentVolumeId +ParentZoneId +ParentZoneName +Parents +ParentsOfAlarmName +Parquet +ParquetConfiguration +ParquetSerDe +ParquetTimestampInMillisecond +ParquetVersion +ParseFailures +ParsedInputRecords +ParsingException +Part +PartListElement +PartNumber +PartNumberMarker +PartOfSpeech +PartOfSpeechTag +PartSizeInBytes +PartialFailure +PartialFailureMessage +PartialFailureReasons +PartialMatch +PartialMatches +PartialResultsStability +Participant +ParticipantCredentials +ParticipantDetails +ParticipantDetailsToAdd +ParticipantId +ParticipantPhoneNumbers +ParticipantRole +ParticipantSummary +ParticipantTimerConfigList +ParticipantTimerConfiguration +ParticipantToken +ParticipantTokenConfiguration +ParticipantTokenCredentials +Participants +ParticipatingGateways +ParticipatingResource +ParticipatingServer +Parties +Partition +PartitionBy +PartitionColumn +PartitionColumns +PartitionCount +PartitionEndDate +PartitionError +PartitionIncludeSchemaTable +PartitionIndex +PartitionIndexDescriptor +PartitionIndexDescriptorList +PartitionIndexes +PartitionInput +PartitionInputList +PartitionKey +PartitionKeyPath +PartitionKeys +PartitionLoadFrequency +PartitionNumber +PartitionObjects +PartitionPredicate +PartitionSerialList +PartitionStartDate +PartitionValueList +PartitionValues +Partitions +PartitionsToDelete +PartitionsToGet +PartnerAccountId +PartnerEventSource +PartnerEventSourceAccount +PartnerEventSourceAccounts +PartnerEventSources +PartnerIntegrationInfo +PartnerIntegrationInfoList +PartnerIntegrationInputMessage +PartnerIntegrationOutputMessage +PartnerName +PartnerNotFoundFault +PartnerProfileId +PartnerType +PartnerWatermarking +Parts +PartsCount +PartyName +PartyType +PartyTypeString +PassThroughSettings +PassiveIp +Passphrase +PassthroughBehavior +PassthroughControl +Password +PasswordCount +PasswordData +PasswordField +PasswordLastUsed +PasswordLength +PasswordParam +PasswordPolicy +PasswordPolicyType +PasswordPolicyViolationException +PasswordResetRequired +PasswordResetRequiredException +PasswordReusePrevention +PasswordVerifier +Passwords +PatInterval +Patch +PatchBaselineId +PatchBaselineIdentity +PatchComplianceData +PatchDocument +PatchFilter +PatchFilterGroup +PatchFilters +PatchGroup +PatchGroupPatchBaselineMapping +PatchGroups +PatchLevel +PatchOperation +PatchOrchestratorFilter +PatchRule +PatchRuleGroup +PatchRules +PatchSet +PatchSource +PatchStatus +PatchSummary +PatchVersion +Patches +Path +PathComponent +PathDoesNotExistException +PathFilter +PathFormat +PathId +PathLoss +PathMatch +PathName +PathOptions +PathParameterValues +PathPattern +PathPatternConditionConfig +PathPatternConfig +PathPrefix +PathRequestFilter +PathRequiredException +PathResourceToId +PathStatement +PathStatementRequest +PathToObjectIdentifiers +PathToObjectIdentifiersList +Paths +Pattern +PatternName +PatternSetName +PatternTypeLimits +Patterns +PauseCampaignRequest +PauseCluster +PauseClusterMessage +PauseClusterResult +PauseReplicationRequest +PauseServiceRequest +PauseServiceResponse +PauseStateScheduleActionSettings +PauseStateSettings +Payer +PayerResponsibility +Payload +PayloadConfig +PayloadData +PayloadFormatVersion +PayloadPart +PayloadTooLargeException +PayloadType +PaymentDue +PaymentOption +PaymentTerm +Pci +PciId +PcrControl +PcrPeriod +PcrPid +PdfReport +PeakBandwidthInGbps +PeakCalculation +PeakRequestsPerSecond +PeerAccountId +PeerAddress +PeerAsn +PeerBgpAsn +PeerCoreNetworkId +PeerEndpoint +PeerEventEndpoint +PeerLogs +PeerOwnerId +PeerRegion +PeerTransitGatewayId +PeerVpcAwsAccountId +PeerVpcId +PeerVpcResult +Peering +PeeringAttachmentId +PeeringAttachmentStatus +PeeringConnectionOptions +PeeringConnectionOptionsRequest +PeeringId +PeeringOptions +PeeringStatus +PeeringTgwInfo +PeeringType +Peerings +PemEncodedCertificate +Pending +PendingActions +PendingAggregationRequest +PendingAggregationRequests +PendingAuthenticationStrategy +PendingCapacity +PendingChange +PendingChanges +PendingCloudWatchLogsExports +PendingCloudwatchLogsExports +PendingCreateStandbyWorkspacesRequest +PendingDataReplicationMetadata +PendingDataReplicationMode +PendingDeletion +PendingDeletionWindowInDays +PendingDeploymentSummary +PendingEngineVersion +PendingExpirationSubscribedDomains +PendingHostInstanceType +PendingHuman +PendingImportedDeviceCount +PendingLdapServerMetadata +PendingLogDeliveryConfiguration +PendingLogs +PendingMaintenance +PendingMaintenanceAction +PendingMaintenanceActionDetails +PendingMaintenanceActions +PendingMaintenanceActionsMessage +PendingModifiedRelationalDatabaseValues +PendingModifiedServiceUpdate +PendingModifiedValues +PendingProductionVariantSummary +PendingProperties +PendingRequests +PendingResource +PendingReviewVersion +PendingSecurityGroups +PendingStandbyRequests +PendingTaskCount +PendingUpdates +PendingVerification +PendingWindowInDays +PerHourPartition +PerObjectStatus +PerUnitStorageThroughput +PercentComplete +PercentDone +PercentEnabled +PercentOfClientLocationImpacted +PercentOfGraphUtilization +PercentOfGraphUtilizationUpdatedTime +PercentOfTotalTrafficImpacted +PercentPair +PercentProgress +PercentRange +PercentTraffic +PercentVisibleRange +Percentage +PercentageComplete +PercentageCompleteOnRollback +PercentageDisplayFormatConfiguration +PercentageValue +Percentile +PercentileAggregation +PercentileValue +PerformAutoML +PerformCheckOnly +PerformHPO +Performance +PerformanceInsightsEnabled +PerformanceInsightsKMSKeyId +PerformanceInsightsKmsKeyId +PerformanceInsightsMetric +PerformanceInsightsMetricDimensionGroup +PerformanceInsightsMetricQuery +PerformanceInsightsMetrics +PerformanceInsightsMetricsDetail +PerformanceInsightsReferenceComparisonValues +PerformanceInsightsReferenceData +PerformanceInsightsReferenceMetric +PerformanceInsightsReferenceScalar +PerformanceInsightsRetentionPeriod +PerformanceInsightsStat +PerformanceLocalHealthEventsConfig +PerformanceMeasurement +PerformanceMetrics +PerformanceMode +PerformanceScoreThreshold +Period +PeriodAlignment +PeriodInSeconds +PeriodOverPeriod +PeriodOverPeriodComputation +PeriodSize +PeriodTimeGranularity +PeriodToDate +PeriodToDateComputation +PeriodTriggers +PeriodType +PeriodUnit +PeriodValue +PeriodsBackward +PeriodsForward +Permanent +PermanentDeletionTimeInDays +PermanentRestore +Permission +PermissionAlreadyExistsException +PermissionConfiguration +PermissionEntry +PermissionGroup +PermissionGroupByUser +PermissionGroupParams +PermissionInfo +PermissionLimitExceededException +PermissionModel +PermissionPolicy +PermissionSet +PermissionSetArn +PermissionSetProvisioningStatus +PermissionSetProvisioningStatusMetadata +PermissionSets +PermissionSetsProvisioningStatus +PermissionState +PermissionType +PermissionTypeMismatchException +PermissionValues +PermissionVersionsLimitExceededException +Permissions +PermissionsBoundary +PermissionsBoundaryArn +PermissionsBoundaryDecisionDetail +PermissionsBoundaryPolicyInputList +PermissionsBoundaryType +PermissionsBoundaryUsageCount +PermissionsMode +PermissionsWithGrantOption +PermittedFileTypes +PermittedPublicSecurityGroupRuleRanges +Persistence +Persistent +PersistentChat +PersistentStorage +PersistentStorageConfiguration +Person +PersonDetail +PersonDetection +PersonMatch +Persona +PersonalEmailAddress +PersonalPIN +PersonalizationThresholdSeconds +Personas +PersonasSummary +Persons +PersonsIndeterminate +PersonsWithRequiredEquipment +PersonsWithoutRequiredEquipment +Phase +Phase1DHGroupNumbers +Phase1DHGroupNumbersListValue +Phase1DHGroupNumbersRequestListValue +Phase1DhGroupNumbers +Phase1EncryptionAlgorithms +Phase1EncryptionAlgorithmsListValue +Phase1EncryptionAlgorithmsRequestListValue +Phase1IntegrityAlgorithms +Phase1IntegrityAlgorithmsListValue +Phase1IntegrityAlgorithmsRequestListValue +Phase1LifetimeSeconds +Phase2DHGroupNumbers +Phase2DHGroupNumbersListValue +Phase2DHGroupNumbersRequestListValue +Phase2DhGroupNumbers +Phase2EncryptionAlgorithms +Phase2EncryptionAlgorithmsListValue +Phase2EncryptionAlgorithmsRequestListValue +Phase2IntegrityAlgorithms +Phase2IntegrityAlgorithmsListValue +Phase2IntegrityAlgorithmsRequestListValue +Phase2LifetimeSeconds +PhaseContext +PhaseControl +Phases +PhoneConfig +PhoneNumber +PhoneNumberArn +PhoneNumberAssociation +PhoneNumberCapabilities +PhoneNumberCountries +PhoneNumberCountry +PhoneNumberCountryCode +PhoneNumberCountryCodes +PhoneNumberDescription +PhoneNumberError +PhoneNumberErrors +PhoneNumberField +PhoneNumberFields +PhoneNumberFilter +PhoneNumberId +PhoneNumberIds +PhoneNumberInformation +PhoneNumberOrder +PhoneNumberOrderId +PhoneNumberOrders +PhoneNumberPoolCountries +PhoneNumberPrefix +PhoneNumberQuickConnectConfig +PhoneNumberStatus +PhoneNumberSummary +PhoneNumberSummaryList +PhoneNumberType +PhoneNumberTypes +PhoneNumberValidateRequest +PhoneNumberValidateResponse +PhoneNumbers +PhoneType +PhoneTypeCode +Phrases +PhysicalConnectionRequirements +PhysicalId +PhysicalNetworkInterface +PhysicalResource +PhysicalResourceId +PhysicalResourceIdContext +PhysicalResourceIdContextKeyValuePair +PhysicalTableId +PhysicalTableMap +PickupDetails +Pid +PidMode +Pids +PieChartAggregatedFieldWells +PieChartConfiguration +PieChartFieldWells +PieChartSortConfiguration +PieChartVisual +PiiEntitiesDetectionJobFilter +PiiEntitiesDetectionJobProperties +PiiEntitiesDetectionJobPropertiesList +PiiEntity +PiiEntityTypes +PiiOutputDataConfig +PiiType +PillarDifference +PillarDifferences +PillarId +PillarMetric +PillarName +PillarNotes +PillarPriorities +PillarReviewSummaries +PillarReviewSummary +Pillars +PilotPower +PinBlock +PinBlockFormat +PinData +PinDataLength +PinOffset +PinValidationData +PinValidationDataPadCharacter +PinVerificationKeyIndex +PingResponse +PingSlotDr +PingSlotFreq +PingSlotPeriod +PingStatus +Pinned +PinnedFieldOptions +PinnedLeftFields +PinpointDestination +Pipe +PipeEnrichmentHttpParameters +PipeEnrichmentParameters +PipeSourceActiveMQBrokerParameters +PipeSourceDynamoDBStreamParameters +PipeSourceKinesisStreamParameters +PipeSourceManagedStreamingKafkaParameters +PipeSourceParameters +PipeSourceRabbitMQBrokerParameters +PipeSourceSelfManagedKafkaParameters +PipeSourceSqsQueueParameters +PipeTargetBatchJobParameters +PipeTargetCloudWatchLogsParameters +PipeTargetEcsTaskParameters +PipeTargetEventBridgeEventBusParameters +PipeTargetHttpParameters +PipeTargetKinesisStreamParameters +PipeTargetLambdaFunctionParameters +PipeTargetParameters +PipeTargetRedshiftDataParameters +PipeTargetSageMakerPipelineParameters +PipeTargetSqsQueueParameters +PipeTargetStateMachineParameters +Pipeline +PipelineActivity +PipelineArn +PipelineBlueprint +PipelineBlueprintSummary +PipelineConfig +PipelineConfigurationBody +PipelineContext +PipelineDeclaration +PipelineDefinition +PipelineDefinitionS3Location +PipelineDeletedException +PipelineDescription +PipelineDetail +PipelineDetails +PipelineDisplayName +PipelineExecution +PipelineExecutionArn +PipelineExecutionDescription +PipelineExecutionDisplayName +PipelineExecutionFailureReason +PipelineExecutionNotFoundException +PipelineExecutionNotStoppableException +PipelineExecutionStatus +PipelineExecutionStep +PipelineExecutionStepMetadata +PipelineExecutionSteps +PipelineExecutionSummaries +PipelineExecutionSummary +PipelineExperimentConfig +PipelineId +PipelineIdName +PipelineInfo +PipelineLockingSettings +PipelineMetadata +PipelineName +PipelineNameInUseException +PipelineNamePrefix +PipelineNotFoundException +PipelineObject +PipelineOutputConfig +PipelineParameterList +PipelineParameters +PipelinePauseStateSettings +PipelineStatus +PipelineStatusReason +PipelineSummaries +PipelineSummary +PipelineVersionNotFoundException +Pipelines +PipelinesRunningCount +Pipes +Pitch +PivotFieldSortOptions +PivotTableAggregatedFieldWells +PivotTableCellConditionalFormatting +PivotTableConditionalFormatting +PivotTableConditionalFormattingOption +PivotTableConditionalFormattingScope +PivotTableConfiguration +PivotTableDataPathOption +PivotTableFieldCollapseStateOption +PivotTableFieldCollapseStateTarget +PivotTableFieldOption +PivotTableFieldOptions +PivotTableFieldSubtotalOptions +PivotTableFieldWells +PivotTableOptions +PivotTablePaginatedReportOptions +PivotTableRowsLabelOptions +PivotTableSortBy +PivotTableSortConfiguration +PivotTableTotalOptions +PivotTableVisual +PivotTotalOptions +PixelAnomaly +PixelPercent +Place +PlaceGeometry +PlaceId +PlacedPlayerSession +PlacedPlayerSessions +Placeholder +PlaceholderOptions +Placement +PlacementArn +PlacementConstraint +PlacementConstraints +PlacementDescription +PlacementGroup +PlacementGroupArn +PlacementGroupConfig +PlacementGroupConfigs +PlacementGroupInfo +PlacementGroups +PlacementId +PlacementResponse +PlacementStatistics +PlacementStrategies +PlacementStrategy +PlacementSummary +PlacementTemplate +PlacementTenancy +PlacementType +PlainText +PlainTextMessage +PlainTextMessageType +Plaintext +Plan +PlanId +PlanName +PlanType +PlannedBudgetLimits +PlannedEndTime +PlannedStartTime +PlanningStatistics +PlanningTimeMillis +Platform +PlatformApplication +PlatformApplicationArn +PlatformApplicationDisabledException +PlatformApplications +PlatformArn +PlatformBranchLifecycleState +PlatformBranchName +PlatformBranchSummary +PlatformBranchSummaryList +PlatformCategory +PlatformCommand +PlatformDefinitionBundle +PlatformDescription +PlatformDetails +PlatformDevice +PlatformDifferences +PlatformFilter +PlatformFramework +PlatformIdentifier +PlatformInput +PlatformLifecycleState +PlatformName +PlatformNotSupportedException +PlatformOwner +PlatformProgrammingLanguage +PlatformScriptKey +PlatformSoftwareVersion +PlatformStatus +PlatformSummary +PlatformSummaryList +PlatformTaskDefinitionIncompatibilityException +PlatformType +PlatformTypes +PlatformUnknownException +PlatformVersion +PlatformVersionStillReferencedException +Platforms +PlayReadyDrm +Playback +PlaybackCompletionEvent +PlaybackConfiguration +PlaybackConfigurationArn +PlaybackConfigurationName +PlaybackDeviceCompatibility +PlaybackEndpointPrefix +PlaybackInterruptionEvent +PlaybackKeyPair +PlaybackKeyPairSummary +PlaybackMode +PlaybackUrl +Player +PlayerAttributes +PlayerData +PlayerDataMap +PlayerId +PlayerIds +PlayerLatencies +PlayerLatency +PlayerLatencyPolicies +PlayerLatencyPolicy +PlayerSession +PlayerSessionCreationPolicy +PlayerSessionId +PlayerSessionStatusFilter +PlayerSessions +Players +Playlist +PlaylistType +PlaylistWindowSeconds +Playlists +Plugin +PluginDescription +PluginName +PluginSummary +PluginsS3ObjectVersion +PluginsS3Path +PmtInterval +PmtPid +PnOffset +PoAttributes +PoDetailAttributes +Point +PointInTimeRecovery +PointInTimeRecoveryDescription +PointInTimeRecoveryEnabled +PointInTimeRecoverySpecification +PointInTimeRecoveryStatus +PointInTimeRecoverySummary +PointInTimeRecoveryUnavailableException +PointInTimeRestoreNotEnabledFault +PointOfInterest +PointStyleOptions +PointsOfInterest +PoisEndpoint +Policies +PoliciesGrantingServiceAccess +PoliciesLimitExceededException +PoliciesType +Policy +PolicyARN +PolicyARNType +PolicyArn +PolicyArns +PolicyAttachment +PolicyAttribute +PolicyAttributeDescription +PolicyAttributeDescriptions +PolicyAttributeTypeDescription +PolicyAttributeTypeDescriptions +PolicyAttributes +PolicyChangesInProgressException +PolicyComplianceDetail +PolicyComplianceStatus +PolicyComplianceStatusList +PolicyContent +PolicyCountLimitExceededException +PolicyDescription +PolicyDescriptions +PolicyDescriptorType +PolicyDetail +PolicyDetails +PolicyDocument +PolicyDurationSeconds +PolicyEnabled +PolicyEnforcedException +PolicyErrorException +PolicyErrors +PolicyEvaluationException +PolicyExistsCondition +PolicyFilter +PolicyGeneration +PolicyGenerationDetails +PolicyGrantingServiceAccess +PolicyGroup +PolicyGroups +PolicyHash +PolicyHashCondition +PolicyId +PolicyIds +PolicyInJson +PolicyInUseException +PolicyInformation +PolicyInputList +PolicyItem +PolicyLengthExceededException +PolicyLevels +PolicyList +PolicyName +PolicyNames +PolicyNotAttachableException +PolicyNotAttachedException +PolicyNotFound +PolicyNotFoundException +PolicyOption +PolicyOwner +PolicyParameter +PolicyPeriodInMinutes +PolicyQualifierId +PolicyQualifierInfo +PolicyQualifiers +PolicyReference +PolicyReferenceName +PolicyRevisionId +PolicyRole +PolicyRoles +PolicyRule +PolicyRuleNumber +PolicyRuntime +PolicySchema +PolicySizeLimitExceededException +PolicySourceArn +PolicyStatus +PolicyStoreItem +PolicySummary +PolicyTargetSummary +PolicyTemplateItem +PolicyText +PolicyToPath +PolicyToPathList +PolicyType +PolicyTypeAlreadyEnabledException +PolicyTypeDescription +PolicyTypeDescriptions +PolicyTypeName +PolicyTypeNames +PolicyTypeNotAvailableForOrganizationException +PolicyTypeNotEnabledException +PolicyTypeNotFoundException +PolicyTypeScope +PolicyTypeSummary +PolicyTypes +PolicyUpdateToken +PolicyUsageFilter +PolicyUser +PolicyUsers +PolicyValidationPassed +PolicyVariables +PolicyVersion +PolicyVersionId +PolicyVersionIdentifier +PolicyVersionList +PoliticalView +PollForActivityTaskInput +PollForDecisionTaskInput +PollForJobsInput +PollForJobsOutput +PollForTaskInput +PollForTaskOutput +PollForThirdPartyJobsInput +PollForThirdPartyJobsOutput +PollTimeoutMs +PollingTime +Polygon +PolygonGeometryInput +PoolARN +PoolARNs +PoolAddressRange +PoolAddressRanges +PoolArn +PoolCidrBlock +PoolCidrBlocks +PoolCidrs +PoolCount +PoolDepth +PoolEntryDate +PoolFilter +PoolId +PoolIds +PoolInfo +PoolInformation +PoolInfos +PoolName +PoolOriginationIdentitiesFilter +PoolSize +PoolState +PoolStatus +PoolTagSpecifications +Pools +PopulationSize +Port +PortForwardingConfig +PortInfo +PortMapping +PortMappings +PortName +PortNumber +PortOverride +PortOverrides +PortProbeAction +PortProbeDetail +PortProbeDetails +PortRange +PortRangeFilter +PortRangeFromTo +PortRanges +PortRequired +PortSet +PortSets +Portal +PortalResource +PortalStatus +PortalSummary +PortfolioDetail +PortfolioDetails +PortfolioId +PortfolioShareDetail +PortfolioShareDetails +PortfolioShareToken +PortfolioShareType +Pose +Position +PositionConfigurationItem +PositionConfigurationList +PositionFiltering +PositionProperties +PositionSolverConfigurations +PositionSolverDetails +PositionalAccuracy +PositionalConstraint +Positioning +Positive +PositiveColor +PosixPermissions +PosixProfile +PosixUser +PossibleRemediationAction +PossibleRemediationActions +PossibleSecurityGroupRemediationActions +PostAction +PostAgentProfileRequest +PostAnalyticsProcessorSourceUri +PostAuthentication +PostAuthenticationLoginBanner +PostCallAnalyticsSettings +PostCommentForComparedCommitInput +PostCommentForComparedCommitOutput +PostCommentForPullRequestInput +PostCommentForPullRequestOutput +PostCommentReplyInput +PostCommentReplyOutput +PostConfirmation +PostContentRequest +PostContentResponse +PostDialogCodeHookInvocationSpecification +PostExtractionHookConfiguration +PostFilterSharpenStrength +PostFilterSharpening +PostFulfillmentStatusSpecification +PostLaunchActions +PostLaunchActionsStatus +PostProcessFirewallManagerRuleGroups +PostSetupScriptDetails +PostTemporalSharpening +PostTemporalSharpeningStrength +PostTextRequest +PostTextResponse +PostToConnectionRequest +PostTrainingConstraints +PostTrainingReport +PostalCode +PostgreSQLCatalogSource +PostgreSQLCatalogTarget +PostgreSQLSettings +PostgreSqlDataProviderSettings +PostgreSqlParameters +PostureComplianceStatuses +PotentialMatches +PowerConnector +PowerDrawKva +PowerFeedDrop +PowerKva +PowerPhase +PrAllowed +PreAction +PreAuthentication +PreAuthenticationLoginBanner +PreCoPassword +PreExtractionHookConfiguration +PreHumanTaskLambdaArn +PreProcessFirewallManagerRuleGroups +PreSharedKey +PreSignUp +PreSignedLogUrl +PreSignedUrl +PreTokenGeneration +PreTrainingConstraints +PreTrainingReport +Precedence +Precision +PrecisionRecallTradeoff +PreconditionFailed +PreconditionFailedException +PreconditionNotMetException +PreconditionsFailedException +Predecessor +PredecessorRuns +PredecessorsIncluded +Predefined +PredefinedHierarchy +PredefinedIndices +PredefinedLoadMetricSpecification +PredefinedLoadMetricType +PredefinedMetricPairSpecification +PredefinedMetricSpecification +PredefinedMetricType +PredefinedScalingMetricSpecification +PredefinedScalingMetricType +Predicate +PredicateList +Predicates +PredictEndpoint +PredictInput +PredictOutput +PredictedCapacity +PredictedIntent +PredictedItem +Prediction +PredictionExplanations +PredictionInterval +PredictionIntervalLevel +PredictionIntervalLowerBound +PredictionIntervalUpperBound +PredictionTimeRange +Predictions +PredictiveDialerConfig +PredictiveScalingConfiguration +PredictiveScalingCustomizedCapacityMetric +PredictiveScalingCustomizedLoadMetric +PredictiveScalingCustomizedScalingMetric +PredictiveScalingMaxCapacityBehavior +PredictiveScalingMaxCapacityBuffer +PredictiveScalingMetricSpecification +PredictiveScalingMode +PredictiveScalingPredefinedLoadMetric +PredictiveScalingPredefinedMetricPair +PredictiveScalingPredefinedScalingMetric +PredictorArn +PredictorBacktestExportJobArn +PredictorBacktestExportJobName +PredictorBacktestExportJobSummary +PredictorBacktestExportJobs +PredictorBaseline +PredictorEvaluationResults +PredictorEvent +PredictorExecution +PredictorExecutionDetails +PredictorExecutions +PredictorMonitorEvaluation +PredictorMonitorEvaluations +PredictorName +PredictorNotMountedException +PredictorSummary +Predictors +PrefectureOrDistrict +Preference +Preferences +Preferred +PreferredAuthenticationMethod +PreferredAvailabilityZone +PreferredAvailabilityZones +PreferredBackupWindow +PreferredCacheClusterAZs +PreferredChannelPipeline +PreferredFileServerIp +PreferredInstanceType +PreferredLanguage +PreferredMaintenanceWindow +PreferredMfa +PreferredMfaSetting +PreferredOutpostArn +PreferredOutpostArns +PreferredProtocol +PreferredSubnetId +PrefetchConsumption +PrefetchRetrieval +PrefetchSchedule +Prefix +PrefixConfig +PrefixForAllResources +PrefixLevel +PrefixLevelStorageMetrics +PrefixList +PrefixListArn +PrefixListAssociation +PrefixListAssociations +PrefixListEntry +PrefixListId +PrefixListIds +PrefixListName +PrefixListOwnerId +PrefixLists +PrefixesCompleted +PrefixesFound +Preload +PreloadDataConfig +PreloadDataType +PrepareDuration +PrepareQueryRequest +PrepareQueryResponse +PrepareStatus +PreparedStatement +PreparedStatementNames +PreparedStatementSummary +PreparedStatements +PresenterOnlyConfiguration +PresenterPosition +PreserveClientIp +PreserveDeletedFiles +PreserveDevices +PreserveExistingData +PreserveTransactions +PreservedExistingData +Preset +PresetDeploymentConfig +PresetDeploymentOutput +PresetDeploymentType +PresetId +PresetSettings +PresetSpeke20Audio +PresetSpeke20Video +PresetWatermark +PresetWatermarkId +Presets +PresignedUrl +PresignedUrlConfig +PrestoParameters +PreventUserExistenceErrors +Preview +PreviewAgentsRequest +PreviewAgentsResponse +PreviewGenerationInProgressException +PreviewNextCidr +PreviewOverride +PreviousActiveModelVersion +PreviousActiveModelVersionArn +PreviousActiveVersion +PreviousActiveVersionArn +PreviousAppsList +PreviousContactId +PreviousEarthObservationJobArn +PreviousFleetState +PreviousInvocationTime +PreviousLineItemId +PreviousModelVersionActivatedAt +PreviousOrderId +PreviousPassword +PreviousProtocolsList +PreviousRunId +PreviousSlotEndTime +PreviousSpotFleetRequestState +PreviousState +PreviousStatus +PreviousValue +PreviousValues +PreviousVersion +Price +PriceClass +PriceList +PriceListArn +PriceLists +PricePerUnit +PriceSchedule +PriceScheduleSpecification +PriceSchedules +PriceUnits +PriceWithCurrency +Prices +PricingDetail +PricingDetails +PricingPlan +PricingPlanArn +PricingPlanArns +PricingPlanDataSource +PricingPlanListElement +PricingPlans +PricingRuleArn +PricingRuleArns +PricingRuleListElement +PricingRules +Primary +PrimaryAccountId +PrimaryAccountNumber +PrimaryAvailabilityZone +PrimaryBackground +PrimaryBtn +PrimaryClusterId +PrimaryContainer +PrimaryDistributionId +PrimaryEmail +PrimaryEmailPrefix +PrimaryEndpoint +PrimaryForeground +PrimaryHost +PrimaryIpv6 +PrimaryKey +PrimaryKeyColumnName +PrimaryKeys +PrimaryMeetingId +PrimaryMetricName +PrimaryOutpostArn +PrimaryProvisionedNumber +PrimaryRegion +PrimaryReplicationGroupId +PrimarySource +PrimaryStatus +PrimaryValue +PrimaryValueDisplayType +PrimaryValueFontConfiguration +PrimaryWorkspaceId +PrimaryYAxisDisplayOptions +PrimaryYAxisLabelOptions +Principal +PrincipalARN +PrincipalArn +PrincipalId +PrincipalIdFormat +PrincipalList +PrincipalName +PrincipalOrgID +PrincipalOrgIDs +PrincipalPermissions +PrincipalResourcePermissions +PrincipalTags +PrincipalType +Principals +PriorModelMetrics +PriorRequestNotComplete +PrioritizeBusinessGoals +PrioritizedRiskCounts +Priority +PriorityConfiguration +PriorityInUseException +PriorityOrder +Privacy +PrivacyPolicy +PrivacyProtectAdminContact +PrivacyProtectRegistrantContact +PrivacyProtectTechContact +PrivateAddress +PrivateChannelFilter +PrivateConnectionProvisioningState +PrivateDefaultScopeId +PrivateDns +PrivateDnsDetails +PrivateDnsEnabled +PrivateDnsHostnameType +PrivateDnsHostnameTypeOnLaunch +PrivateDnsName +PrivateDnsNameConfiguration +PrivateDnsNameOptions +PrivateDnsNameOptionsOnLaunch +PrivateDnsNameOptionsRequest +PrivateDnsNameOptionsResponse +PrivateDnsNameVerificationState +PrivateDnsNames +PrivateDnsNamespaceChange +PrivateDnsNamespaceProperties +PrivateDnsNamespacePropertiesChange +PrivateDnsOnlyForInboundResolverEndpoint +PrivateDnsPropertiesMutable +PrivateDnsPropertiesMutableChange +PrivateIPAddress +PrivateIPv4Address +PrivateIp +PrivateIpAddress +PrivateIpAddressConfigs +PrivateIpAddressCount +PrivateIpAddressDetails +PrivateIpAddressSpecification +PrivateIpAddresses +PrivateKey +PrivateKeyAttributes +PrivateKeyAttributesV2 +PrivateKeyAttributesV3 +PrivateKeyAttributesV4 +PrivateKeyCiphertextBlob +PrivateKeyFlags +PrivateKeyFlagsV2 +PrivateKeyFlagsV3 +PrivateKeyFlagsV4 +PrivateKeyPlaintext +PrivateKeys +PrivateLinkConfig +PrivateLinkEndpoint +PrivateMetadataPid +PrivateRegistryAccess +PrivateRegistryAccessRequest +PrivateSkillIds +PrivateTypeException +PrivateZone +Privileged +PrivilegedDelete +PrivilegedMode +ProactiveAnomalies +ProactiveAnomaly +ProactiveAnomalySummary +ProactiveEngagementStatus +ProactiveInsight +ProactiveInsightSummary +ProactiveInsights +ProactiveJoin +ProactiveOrganizationInsightSummary +Prob +ProbabilityAttribute +ProbabilityIndex +ProbabilityThresholdAttribute +Problem +ProblemDetail +ProblemDetails +ProblemId +ProblemList +ProblemType +Problems +Process +ProcessDetails +ProcessLaunchedAt +ProcessName +ProcessParentPid +ProcessPath +ProcessPid +ProcessTerminatedAt +ProcessType +ProcessedAutomationRules +ProcessedClusters +ProcessedFindings +ProcessedInputRecords +ProcessedItemCount +ProcessedRecordsCount +ProcessedSizeBytes +ProcessedUpdateAction +ProcessedUpdateActions +Processes +ProcessesType +Processing +ProcessingClusterConfig +ProcessingConfiguration +ProcessingEndTime +ProcessingFeatureStoreOutput +ProcessingInput +ProcessingInputs +ProcessingJob +ProcessingJobArn +ProcessingJobName +ProcessingJobStatus +ProcessingJobStepMetadata +ProcessingJobSummaries +ProcessingJobSummary +ProcessingOutput +ProcessingOutputConfig +ProcessingResources +ProcessingResult +ProcessingS3Input +ProcessingS3Output +ProcessingStartTime +ProcessingStatus +ProcessingStatusInfo +ProcessingStoppingCondition +ProcessingTimeMilliseconds +Processor +ProcessorConfiguration +ProcessorFeature +ProcessorFeatures +ProcessorInfo +ProcessorParameter +Processors +ProducerArn +ProducerTimestamp +Product +ProductARN +ProductArn +ProductCode +ProductCodeId +ProductCodeType +ProductCodes +ProductDescription +ProductDescriptions +ProductFamily +ProductFields +ProductId +ProductInformation +ProductInformationFilter +ProductInformationFilterComparator +ProductInformationFilterList +ProductInformationFilterName +ProductInformationFilterValue +ProductInformationList +ProductLink +ProductListingIds +ProductName +ProductSKU +ProductSource +ProductSubscriptionArn +ProductSubscriptionResourcePolicy +ProductSubscriptions +ProductTitle +ProductType +ProductUserSummaries +ProductUserSummary +ProductViewAggregationValue +ProductViewAggregations +ProductViewDetail +ProductViewDetails +ProductViewSummaries +ProductViewSummary +ProductionAccessEnabled +ProductionAccessNotGrantedException +ProductionBranch +ProductionVariant +ProductionVariantCoreDumpConfig +ProductionVariantServerlessConfig +ProductionVariantServerlessUpdateConfig +ProductionVariantStatus +ProductionVariantSummary +ProductionVariants +Products +Profanity +Profile +ProfileArn +ProfileArns +ProfileChoice +ProfileColumns +ProfileConfiguration +ProfileCount +ProfileData +ProfileDescription +ProfileDetail +ProfileDetailResponse +ProfileId +ProfileIds +ProfileIdsToBeMerged +ProfileName +ProfileNamePrefix +ProfileNotificationSummary +ProfileObjectUniqueKey +ProfileOwnerType +ProfileQuestion +ProfileQuestionUpdate +ProfileQuestions +ProfileShareSummaries +ProfileShareSummary +ProfileSummaries +ProfileSummary +ProfileTemplate +ProfileTemplateChoice +ProfileTemplateQuestion +ProfileTime +ProfileType +ProfileUrl +ProfileVersion +ProfilerConfig +ProfilerConfigForUpdate +ProfilerRuleConfiguration +ProfilerRuleConfigurations +ProfilerRuleEvaluationStatus +ProfilerRuleEvaluationStatuses +Profiles +ProfilingGroupDescription +ProfilingIntervalInMilliseconds +ProfilingParameters +ProfilingStatus +ProformaCost +ProgramCount +ProgramDateTime +ProgramDateTimeClock +ProgramDateTimeIntervalSeconds +ProgramDateTimePeriod +ProgramId +ProgramName +ProgramNum +ProgramNumber +ProgramSelection +ProgrammingLang +ProgrammingLanguages +Progress +ProgressBar +ProgressBarOptions +ProgressCounters +ProgressDetail +ProgressDetails +ProgressDetailsOnRollback +ProgressEvent +ProgressInMegaBytes +ProgressPercent +ProgressPercentage +ProgressReport +ProgressStatus +ProgressSummary +ProgressUpdateStream +ProgressUpdateStreamName +ProgressUpdateStreamSummary +ProgressUpdateStreamSummaryList +Progressing +ProgressingJobsCount +ProgressiveDialerConfig +ProgressiveWriteHlsManifest +ProhibitedStateException +Project +ProjectAlreadyExistsException +ProjectAppConfigResource +ProjectAppConfigResourceConfig +ProjectArn +ProjectArtifacts +ProjectBadge +ProjectBuildBatchConfig +ProjectCache +ProjectConfigurationException +ProjectCreationFailedException +ProjectDataDelivery +ProjectDataDeliveryConfig +ProjectDescription +ProjectDescriptions +ProjectDetails +ProjectEnvironment +ProjectFieldMappings +ProjectFileSystemLocation +ProjectId +ProjectInformation +ProjectListFilter +ProjectMetadata +ProjectName +ProjectNames +ProjectNotFoundException +ProjectOperation +ProjectPolicies +ProjectPolicy +ProjectResource +ProjectSource +ProjectSourceVersion +ProjectStatus +ProjectSummary +ProjectSummaryList +ProjectVersionArn +ProjectVersionDescription +ProjectVersionDescriptions +ProjectedColumns +ProjectedInbox +ProjectedMetric +ProjectedSpam +ProjectedVolume +Projection +ProjectionExpression +ProjectionType +Projects +Prometheus +PrometheusInfo +PromoteMode +PromotePermissionCreatedFromPolicyRequest +PromotePermissionCreatedFromPolicyResponse +PromoteReadReplicaDBClusterMessage +PromoteReadReplicaDBClusterResult +PromoteReadReplicaMessage +PromoteReadReplicaResult +PromoteRequest +PromoteResourceShareCreatedFromPolicyRequest +PromoteResourceShareCreatedFromPolicyResponse +PromoteResponse +Promotion +PromotionTier +PromotionalMessagesPerSecond +Prompt +PromptARN +PromptAttemptSpecification +PromptId +PromptPresignedUrl +PromptSearchCriteria +PromptSearchFilter +PromptSpecification +PromptSummary +PromptSummaryList +Prompts +Proof +PropagateAtLaunch +PropagateTags +PropagatingVgw +PropagatingVgwSet +PropagatingVgwSetDetails +PropagatingVgws +Propagation +PropagationDefaultRouteTableId +Properties +PropertiesToDelete +PropertiesToRemove +Property +PropertyDefinitionRequest +PropertyDefinitionResponse +PropertyDifference +PropertyDifferences +PropertyFilter +PropertyFilters +PropertyGroup +PropertyGroupDescriptions +PropertyGroupId +PropertyGroupRequest +PropertyGroupResponse +PropertyGroups +PropertyLatestValue +PropertyList +PropertyMap +PropertyName +PropertyNameHint +PropertyNameQuery +PropertyNameSuggestion +PropertyNameSuggestions +PropertyNotification +PropertyPath +PropertyPredicate +PropertyRequest +PropertyResponse +PropertyRole +PropertyType +PropertyUsage +PropertyValidationException +PropertyValidationExceptionProperty +PropertyValue +PropertyValueEntry +PropertyValueHistory +PropertygraphData +PropertygraphRecord +PropertygraphSummary +PropertygraphSummaryValueMap +Proposal +ProposalActions +ProposalDurationInHours +ProposalId +ProposalSummary +ProposalVotes +Proposals +Proposed +ProposedByMemberId +ProposedByMemberName +ProposedConfiguration +ProposedMultiRegionAccessPointPolicy +ProposedPassword +ProposedSegmentChange +ProprietaryAuthenticationData +ProresSettings +ProtectedFromScaleIn +ProtectedQuery +ProtectedQueryError +ProtectedQueryResult +ProtectedQueryResultConfiguration +ProtectedQueryS3Output +ProtectedQueryS3OutputConfiguration +ProtectedQuerySQLParameters +ProtectedQuerySingleMemberOutput +ProtectedQueryStatistics +ProtectedQuerySummary +ProtectedResource +ProtectedResourceTypeLimits +ProtectedTask +Protection +ProtectionArn +ProtectionGroup +ProtectionGroupArbitraryPatternLimits +ProtectionGroupArn +ProtectionGroupId +ProtectionGroupIds +ProtectionGroupLimits +ProtectionGroupPatternTypeLimits +ProtectionGroups +ProtectionId +ProtectionLimits +ProtectionNames +ProtectionPolicy +Protections +ProtectiveEquipmentBodyPart +ProtectiveEquipmentModelVersion +ProtectiveEquipmentPerson +ProtectiveEquipmentSummarizationAttributes +ProtectiveEquipmentSummary +Protocol +ProtocolDetails +ProtocolType +ProtocolVersion +Protocols +ProtocolsList +ProtocolsListArn +ProtocolsListData +ProtocolsListDataSummary +ProtocolsLists +ProvideAnomalyFeedbackRequest +ProvideAnomalyFeedbackResponse +ProvidedContext +ProvidedContexts +Provider +ProviderArn +ProviderAttributeName +ProviderAttributeValue +ProviderCalendarId +ProviderDescription +ProviderDetails +ProviderEndpoint +ProviderId +ProviderName +ProviderType +ProviderTypeFilter +ProviderTypes +ProviderUserIdentifierType +Providers +Province +ProvisionByoipCidrRequest +ProvisionByoipCidrResponse +ProvisionByoipCidrResult +ProvisionData +ProvisionDeviceRequest +ProvisionDeviceResponse +ProvisionIpamPoolCidrRequest +ProvisionIpamPoolCidrResult +ProvisionPermissionSetRequest +ProvisionPermissionSetRequestId +ProvisionPermissionSetResponse +ProvisionProductId +ProvisionProductInput +ProvisionProductName +ProvisionProductOutput +ProvisionPublicIpv4PoolCidrRequest +ProvisionPublicIpv4PoolCidrResult +ProvisionState +ProvisionTime +ProvisionToken +ProvisionalConfiguration +Provisioned +ProvisionedBandwidth +ProvisionedCapacity +ProvisionedCapacityDescription +ProvisionedCapacityList +ProvisionedCapacityUnits +ProvisionedCapacityUpdate +ProvisionedConcurrency +ProvisionedConcurrencyConfigListItem +ProvisionedConcurrencyConfigNotFoundException +ProvisionedConcurrencyConfigs +ProvisionedConcurrentExecutions +ProvisionedIops +ProvisionedIopsNotAvailableInAZFault +ProvisionedModelSummary +ProvisionedOnDemandCapacity +ProvisionedProductAttribute +ProvisionedProductDetail +ProvisionedProductId +ProvisionedProductName +ProvisionedProductPlanDetails +ProvisionedProductPlanSummary +ProvisionedProductPlans +ProvisionedProductProperties +ProvisionedProductStatusMessage +ProvisionedProductType +ProvisionedProducts +ProvisionedReadCapacityAutoScalingSettings +ProvisionedReadCapacityAutoScalingSettingsUpdate +ProvisionedReadCapacityAutoScalingUpdate +ProvisionedReadCapacityUnits +ProvisionedRequest +ProvisionedResource +ProvisionedSpotCapacity +ProvisionedStorageThroughput +ProvisionedThroughput +ProvisionedThroughputDescription +ProvisionedThroughputExceededException +ProvisionedThroughputInMibps +ProvisionedThroughputOverride +ProvisionedWriteCapacityAutoScalingSettings +ProvisionedWriteCapacityAutoScalingSettingsUpdate +ProvisionedWriteCapacityAutoScalingUpdate +ProvisionedWriteCapacityUnits +ProvisioningArtifact +ProvisioningArtifactDetail +ProvisioningArtifactDetails +ProvisioningArtifactId +ProvisioningArtifactMetadata +ProvisioningArtifactName +ProvisioningArtifactOutput +ProvisioningArtifactOutputKeys +ProvisioningArtifactOutputs +ProvisioningArtifactParameter +ProvisioningArtifactParameters +ProvisioningArtifactPreferences +ProvisioningArtifactProperties +ProvisioningArtifactSummaries +ProvisioningArtifactSummary +ProvisioningArtifactView +ProvisioningArtifactViews +ProvisioningArtifacts +ProvisioningHook +ProvisioningParameter +ProvisioningParameters +ProvisioningPreferences +ProvisioningStatus +ProvisioningTemplateSummary +ProvisioningTemplateVersionSummary +ProvisioningType +Proximity +ProximityEventConfiguration +ProximityResourceTypeEventConfiguration +Proxy +ProxyConfiguration +ProxyConfigurationProperties +ProxyPhoneNumber +ProxySession +ProxySessionId +ProxySessions +ProxyType +ProxyUrl +PsAttributes +PsDetailAttributes +Psc +PseudoTerminal +Pseudonym +PsiControl +PtrRecord +PtrRecordUpdate +PtrUpdateStatus +PtsOffset +PtsOffsetHandlingForBFrames +PtsOffsetMode +Public +PublicAccess +PublicAccessBlock +PublicAccessBlockConfiguration +PublicAccessBlockEnabled +PublicAddress +PublicAddressAllocationIds +PublicBaseImageReleasedDate +PublicChannelFilter +PublicContent +PublicDefaultScopeId +PublicDns +PublicDnsName +PublicDnsNamespaceChange +PublicDnsNamespaceProperties +PublicDnsNamespacePropertiesChange +PublicDnsPropertiesMutable +PublicDnsPropertiesMutableChange +PublicEndpoint +PublicIPAddress +PublicIp +PublicIpAddress +PublicIpSource +PublicIps +PublicIpv4Pool +PublicIpv4PoolRange +PublicIpv4Pools +PublicKey +PublicKeyAlreadyExists +PublicKeyCertificate +PublicKeyConfig +PublicKeyId +PublicKeyInUse +PublicKeyList +PublicKeyMaterial +PublicKeyRotationTimestamp +PublicKeySummary +PublicKeyVersion +PublicKeys +PublicPolicyException +PublicSharingEnabled +PublicSubject +PublicTypeArn +PublicVersionNumber +PublicWorkforceTaskPrice +PublicZoneVPCAssociation +Publication +Publications +PubliclyAccessible +PubliclyAdvertisable +Publish +PublishAppVersionRequest +PublishAppVersionResponse +PublishBatchInput +PublishBatchRequestEntries +PublishBatchRequestEntry +PublishBatchResponse +PublishBatchResultEntry +PublishCloudWatchMetricsEnabled +PublishFindingToSnsParams +PublishFunctionRequest +PublishFunctionResult +PublishInput +PublishLayerVersionRequest +PublishLayerVersionResponse +PublishMetricAction +PublishMetricsInput +PublishPackageVersionRequest +PublishPackageVersionResult +PublishRecipeRequest +PublishRecipeResponse +PublishRequest +PublishResponse +PublishSchemaRequest +PublishSchemaResponse +PublishStateMachineVersionInput +PublishStateMachineVersionOutput +PublishStatus +PublishTimestamp +PublishTypeInput +PublishTypeOutput +PublishVersionRequest +PublishedBy +PublishedDate +PublishedSchemaArn +PublishedVersionNumber +PublishedVersions +PublisherId +PublisherIdentity +PublisherName +PublisherProfile +PublisherStatus +PublishingFailureStartTimestamp +PublishingOptions +PullRequest +PullRequestAlreadyClosedException +PullRequestApprovalRulesNotSatisfiedException +PullRequestCannotBeApprovedByAuthorException +PullRequestCreatedEventMetadata +PullRequestDoesNotExistException +PullRequestEvent +PullRequestId +PullRequestIdRequiredException +PullRequestMergedStateChangedEventMetadata +PullRequestSourceReferenceUpdatedEventMetadata +PullRequestStatusChangedEventMetadata +PullRequestStatusRequiredException +PullRequestTarget +PullThroughCacheRule +PullThroughCacheRuleAlreadyExistsException +PullThroughCacheRuleNotFoundException +Purchase +PurchaseHostReservationRequest +PurchaseHostReservationResult +PurchaseOfferingRequest +PurchaseOfferingResponse +PurchaseOfferingResult +PurchaseProvisionedCapacityInput +PurchaseProvisionedCapacityOutput +PurchaseRequest +PurchaseRequests +PurchaseReservedCacheNodesOfferingMessage +PurchaseReservedCacheNodesOfferingResult +PurchaseReservedDBInstancesOfferingMessage +PurchaseReservedDBInstancesOfferingResult +PurchaseReservedElasticsearchInstanceOfferingRequest +PurchaseReservedElasticsearchInstanceOfferingResponse +PurchaseReservedInstanceOfferingRequest +PurchaseReservedInstanceOfferingResponse +PurchaseReservedInstancesOfferingRequest +PurchaseReservedInstancesOfferingResult +PurchaseReservedNodeOfferingMessage +PurchaseReservedNodeOfferingResult +PurchaseReservedNodesOfferingRequest +PurchaseReservedNodesOfferingResponse +PurchaseScheduledInstancesRequest +PurchaseScheduledInstancesResult +PurchaseTime +PurchaseToken +PurchasedAt +PurchasedHours +PurchasedUnits +PurgeQueueRequest +PushDomainRequest +PushMessageActivity +PushNotification +PushNotificationConfiguration +PushNotificationPreferences +PushNotificationTemplateRequest +PushNotificationTemplateResponse +PushNotifications +PushSync +PushTemplate +Put +PutAccessControlRuleRequest +PutAccessPointConfigurationForObjectLambdaRequest +PutAccessPointPolicyForObjectLambdaRequest +PutAccessPointPolicyRequest +PutAccountAliasRequest +PutAccountConfigurationRequest +PutAccountDedicatedIpWarmupAttributesRequest +PutAccountDetailsRequest +PutAccountPolicyRequest +PutAccountPolicyResponse +PutAccountPreferencesRequest +PutAccountPreferencesResponse +PutAccountSendingAttributesRequest +PutAccountSettingDefaultRequest +PutAccountSettingDefaultResponse +PutAccountSettingRequest +PutAccountSettingResponse +PutAccountSuppressionAttributesRequest +PutAccountVdmAttributesRequest +PutActionRevisionInput +PutActionRevisionOutput +PutAdminAccountRequest +PutAggregationAuthorizationRequest +PutAggregationAuthorizationResponse +PutAlarmRequest +PutAlarmResult +PutAlertManagerDefinitionRequest +PutAlertManagerDefinitionResponse +PutAlternateContactRequest +PutAnomalyDetectorInput +PutAppInstanceRetentionSettingsRequest +PutAppInstanceRetentionSettingsResponse +PutAppInstanceStreamingConfigurationsRequest +PutAppInstanceStreamingConfigurationsResponse +PutAppInstanceUserExpirationSettingsRequest +PutAppInstanceUserExpirationSettingsResponse +PutAppLaunchConfigurationRequest +PutAppReplicationConfigurationRequest +PutAppValidationConfigurationRequest +PutApplicationPolicyRequest +PutApplicationPolicyResponse +PutApprovalResultInput +PutApprovalResultOutput +PutAppsListRequest +PutAppsListResponse +PutAssetPropertyValueEntry +PutAttributesRequest +PutAttributesResponse +PutAuditEventsRequest +PutAuditEventsResponse +PutAuthPolicyRequest +PutAuthPolicyResponse +PutAutoScalingPolicyInput +PutAutoScalingPolicyOutput +PutAutoTerminationPolicyInput +PutBackupPolicyRequest +PutBackupVaultAccessPolicyInput +PutBackupVaultLockConfigurationInput +PutBackupVaultNotificationsInput +PutBandwidthRateLimitScheduleInput +PutBandwidthRateLimitScheduleOutput +PutBlockPublicAccessConfigurationInput +PutBotAliasRequest +PutBotAliasResponse +PutBotRequest +PutBotResponse +PutBucketAccelerateConfigurationRequest +PutBucketAclRequest +PutBucketAnalyticsConfigurationRequest +PutBucketCorsRequest +PutBucketEncryptionRequest +PutBucketIntelligentTieringConfigurationRequest +PutBucketInventoryConfigurationRequest +PutBucketLifecycleConfigurationRequest +PutBucketLoggingRequest +PutBucketMetricsConfigurationRequest +PutBucketNotificationConfigurationRequest +PutBucketOwnershipControlsRequest +PutBucketPolicyRequest +PutBucketReplicationRequest +PutBucketRequestPaymentRequest +PutBucketTaggingRequest +PutBucketVersioningRequest +PutBucketWebsiteRequest +PutCapacityAssignmentConfigurationInput +PutCaseEventConfigurationRequest +PutChannelExpirationSettingsRequest +PutChannelExpirationSettingsResponse +PutChannelMembershipPreferencesRequest +PutChannelMembershipPreferencesResponse +PutChannelPolicyRequest +PutChunkInput +PutChunkOutput +PutClassificationExportConfigurationRequest +PutClassificationExportConfigurationResponse +PutClusterCapacityProvidersRequest +PutClusterCapacityProvidersResponse +PutClusterPolicyRequest +PutClusterPolicyResponse +PutCodeBindingRequest +PutCodeBindingResponse +PutCommentReactionInput +PutComplianceItemsRequest +PutComponentPolicyRequest +PutComponentPolicyResponse +PutCompositeAlarmInput +PutConferencePreferenceRequest +PutConfigRuleRequest +PutConfigurationAggregatorRequest +PutConfigurationAggregatorResponse +PutConfigurationRecorderRequest +PutConfigurationRequest +PutConfigurationSetDeliveryOptionsRequest +PutConfigurationSetReputationOptionsRequest +PutConfigurationSetSendingOptionsRequest +PutConfigurationSetSuppressionOptionsRequest +PutConfigurationSetTrackingOptionsRequest +PutConfigurationSetVdmOptionsRequest +PutConformancePackRequest +PutConformancePackResponse +PutContactInformationRequest +PutContactPolicyRequest +PutContainerPolicyInput +PutContainerRecipePolicyRequest +PutContainerRecipePolicyResponse +PutCoreNetworkPolicyRequest +PutCoreNetworkPolicyResponse +PutCorsPolicyInput +PutDashboardInput +PutDashboardOutput +PutDataCatalogEncryptionSettingsRequest +PutDataLakeSettingsRequest +PutDataProtectionPolicyInput +PutDataProtectionPolicyRequest +PutDataProtectionPolicyResponse +PutDataSetRefreshPropertiesRequest +PutDataSetRefreshPropertiesResponse +PutDedicatedIpInPoolRequest +PutDedicatedIpPoolScalingAttributesRequest +PutDedicatedIpWarmupAttributesRequest +PutDefaultEncryptionConfigurationRequest +PutDefaultEncryptionConfigurationResponse +PutDeliverabilityDashboardOptionRequest +PutDeliveryChannelRequest +PutDestinationPolicyRequest +PutDestinationRequest +PutDestinationResponse +PutDetectorRequest +PutDialRequestBatchRequest +PutDialRequestBatchResponse +PutDomainPermissionsPolicyRequest +PutDomainPermissionsPolicyResult +PutDraftAppVersionTemplateRequest +PutDraftAppVersionTemplateResponse +PutEmailIdentityConfigurationSetAttributesRequest +PutEmailIdentityDkimAttributesRequest +PutEmailIdentityDkimSigningAttributesRequest +PutEmailIdentityDkimSigningAttributesResponse +PutEmailIdentityFeedbackAttributesRequest +PutEmailIdentityMailFromAttributesRequest +PutEmailMonitoringConfigurationRequest +PutEncryptionConfigRequest +PutEncryptionConfigResult +PutEncryptionConfigurationRequest +PutEncryptionConfigurationResponse +PutEntityTypeRequest +PutEvaluationsRequest +PutEvaluationsResponse +PutEventSelectorsRequest +PutEventSelectorsResponse +PutEventStreamRequest +PutEventStreamResponse +PutEventTypeRequest +PutEventsConfigurationRequest +PutEventsConfigurationResponse +PutEventsRequest +PutEventsRequestEntry +PutEventsResponse +PutEventsResultEntry +PutExternalEvaluationRequest +PutExternalModelRequest +PutFeedbackRequest +PutFileEntry +PutFileEntryConflictException +PutFileInput +PutFileOutput +PutFileSystemPolicyRequest +PutFindingsPublicationConfigurationRequest +PutFirewallRuleGroupPolicyRequest +PutFirewallRuleGroupPolicyResponse +PutFunctionCodeSigningConfigRequest +PutFunctionCodeSigningConfigResponse +PutFunctionConcurrencyRequest +PutFunctionEventInvokeConfigRequest +PutGatewayResponseRequest +PutGeofenceRequest +PutGeofenceResponse +PutGroupConfigurationInput +PutGroupPolicyRequest +PutHypervisorPropertyMappingsInput +PutHypervisorPropertyMappingsOutput +PutIdentityPolicyRequest +PutImagePolicyRequest +PutImagePolicyResponse +PutImageRecipePolicyRequest +PutImageRecipePolicyResponse +PutImageRequest +PutImageResponse +PutImageScanningConfigurationRequest +PutImageScanningConfigurationResponse +PutImageTagMutabilityRequest +PutImageTagMutabilityResponse +PutInboundDmarcSettingsRequest +PutInlinePolicyToPermissionSetRequest +PutInsightRuleInput +PutInsightSelectorsRequest +PutInsightSelectorsResponse +PutInstancePublicPortsRequest +PutInstancePublicPortsResult +PutIntegrationRequest +PutIntegrationResponse +PutIntegrationResponseRequest +PutIntentRequest +PutIntentResponse +PutInventoryRequest +PutInventoryResult +PutInvitationConfigurationRequest +PutItemInput +PutItemOutput +PutItemsRequest +PutJobFailureResultInput +PutJobSuccessResultInput +PutJobTaggingRequest +PutKMSEncryptionKeyRequest +PutKeyPolicyRequest +PutKeywordRequest +PutKeywordResult +PutLabelRequest +PutLaunchActionRequest +PutLaunchActionResponse +PutLaunchProfileMembersRequest +PutLexiconInput +PutLifecycleConfigurationRequest +PutLifecycleEventHookExecutionStatusInput +PutLifecycleEventHookExecutionStatusOutput +PutLifecycleHookType +PutLifecyclePolicyInput +PutLifecyclePolicyRequest +PutLifecyclePolicyResponse +PutLogEventsRequest +PutLogEventsResponse +PutLoggingConfigurationRequest +PutLoggingConfigurationResponse +PutLoggingOptionsRequest +PutMailboxPermissionsRequest +PutMaintenanceStartTimeInput +PutMaintenanceStartTimeOutput +PutManagedInsightRulesInput +PutManagedInsightRulesOutput +PutManagedRuleSetVersionsRequest +PutManagedRuleSetVersionsResponse +PutManagedScalingPolicyInput +PutMessagingStreamingConfigurationsRequest +PutMessagingStreamingConfigurationsResponse +PutMetadataFlagBody +PutMetadataFlagRequest +PutMetadataRequest +PutMethodRequest +PutMethodResponseRequest +PutMetricAlarmInput +PutMetricDataInput +PutMetricFilterRequest +PutMetricPolicyInput +PutMetricStreamInput +PutMetricStreamOutput +PutMobileDeviceAccessOverrideRequest +PutModelInvocationLoggingConfigurationRequest +PutModelPackageGroupPolicyInput +PutModelPackageGroupPolicyOutput +PutMultiRegionAccessPointPolicyInput +PutMultiRegionAccessPointPolicyRequest +PutMultiRegionAccessPointPolicyResult +PutNotificationChannelRequest +PutNotificationConfigurationType +PutNotificationSettingsRequest +PutNotificationSettingsResponse +PutObjectAclOutput +PutObjectAclRequest +PutObjectInput +PutObjectLegalHoldOutput +PutObjectLegalHoldRequest +PutObjectLockConfigurationOutput +PutObjectLockConfigurationRequest +PutObjectOutput +PutObjectRequest +PutObjectResponse +PutObjectRetentionOutput +PutObjectRetentionRequest +PutObjectTaggingOutput +PutObjectTaggingRequest +PutOptedOutNumberRequest +PutOptedOutNumberResult +PutOrganizationConfigRuleRequest +PutOrganizationConfigRuleResponse +PutOrganizationConformancePackRequest +PutOrganizationConformancePackResponse +PutOriginEndpointPolicyRequest +PutOutcomeRequest +PutPackageOriginConfigurationRequest +PutPackageOriginConfigurationResult +PutParameterRequest +PutParameterResult +PutPartnerEventsRequest +PutPartnerEventsRequestEntry +PutPartnerEventsResponse +PutPartnerEventsResultEntry +PutPermissionPolicyRequest +PutPermissionRequest +PutPermissionResponse +PutPermissionsBoundaryToPermissionSetRequest +PutPipelineDefinitionInput +PutPipelineDefinitionOutput +PutPlaybackConfigurationRequest +PutPlaybackConfigurationResponse +PutPolicyRequest +PutPolicyResponse +PutPortfolioPreferencesRequest +PutPositionConfigurationRequest +PutPrincipalMappingRequest +PutProfileObjectRequest +PutProfileObjectResponse +PutProfileObjectTypeRequest +PutProfileObjectTypeResponse +PutProjectEventsRequest +PutProjectEventsResponse +PutProjectEventsResultEntry +PutProjectPolicyRequest +PutProjectPolicyResponse +PutProtocolsListRequest +PutProtocolsListResponse +PutProvisionedConcurrencyConfigRequest +PutProvisionedConcurrencyConfigResponse +PutPublicAccessBlockRequest +PutQueryDefinitionRequest +PutQueryDefinitionResponse +PutRawMessageContentRequest +PutRecommendationFeedbackRequest +PutRecommendationPreferencesRequest +PutRecordBatchInput +PutRecordBatchOutput +PutRecordBatchResponseEntry +PutRecordInput +PutRecordOutput +PutRecordRequest +PutRecordsInput +PutRecordsOutput +PutRecordsRequestEntry +PutRecordsResultEntry +PutRegistryCatalogDataRequest +PutRegistryCatalogDataResponse +PutRegistryPolicyRequest +PutRegistryPolicyResponse +PutRegistryScanningConfigurationRequest +PutRegistryScanningConfigurationResponse +PutRemediationConfigurationsRequest +PutRemediationConfigurationsResponse +PutRemediationExceptionsRequest +PutRemediationExceptionsResponse +PutReplicationConfigurationRequest +PutReplicationConfigurationResponse +PutReportDefinitionRequest +PutReportDefinitionResult +PutRepositoryCatalogDataRequest +PutRepositoryCatalogDataResponse +PutRepositoryPermissionsPolicyRequest +PutRepositoryPermissionsPolicyResult +PutRepositoryTriggersInput +PutRepositoryTriggersOutput +PutRequest +PutResolverQueryLogConfigPolicyRequest +PutResolverQueryLogConfigPolicyResponse +PutResolverRulePolicyRequest +PutResolverRulePolicyResponse +PutResourceAttributesRequest +PutResourceConfigRequest +PutResourceLogLevelRequest +PutResourcePermissionInput +PutResourcePermissionOutput +PutResourcePolicyInput +PutResourcePolicyOutput +PutResourcePolicyRequest +PutResourcePolicyResponse +PutResourcePolicyResult +PutResourceSetRequest +PutResourceSetResponse +PutRestApiRequest +PutRetentionConfigurationRequest +PutRetentionConfigurationResponse +PutRetentionPolicyRequest +PutRetentionSettingsRequest +PutRetentionSettingsResponse +PutRolePermissionsBoundaryRequest +PutRolePolicyRequest +PutRoomSkillParameterRequest +PutRuleGroupsNamespaceRequest +PutRuleGroupsNamespaceResponse +PutRuleRequest +PutRuleResponse +PutRumEventsRequest +PutRumMetricsDestinationRequest +PutRuntimeManagementConfigRequest +PutRuntimeManagementConfigResponse +PutScalingPolicyInput +PutScalingPolicyOutput +PutScalingPolicyRequest +PutScalingPolicyResponse +PutScalingPolicyType +PutScheduledActionRequest +PutScheduledUpdateGroupActionType +PutSchemaFromJsonRequest +PutSchemaFromJsonResponse +PutSchemaInput +PutSchemaOutput +PutSchemaVersionMetadataInput +PutSchemaVersionMetadataResponse +PutSecretValueRequest +PutSecretValueResponse +PutServiceQuotaIncreaseRequestIntoTemplateRequest +PutServiceQuotaIncreaseRequestIntoTemplateResponse +PutSessionRequest +PutSessionResponse +PutSigningProfileRequest +PutSigningProfileResponse +PutSinkPolicyInput +PutSinkPolicyOutput +PutSipMediaApplicationAlexaSkillConfigurationRequest +PutSipMediaApplicationAlexaSkillConfigurationResponse +PutSipMediaApplicationLoggingConfigurationRequest +PutSipMediaApplicationLoggingConfigurationResponse +PutSkillAuthorizationRequest +PutSlotTypeRequest +PutSlotTypeResponse +PutSnapshotBlockRequest +PutSnapshotBlockResponse +PutSolFunctionPackageContentInput +PutSolFunctionPackageContentMetadata +PutSolFunctionPackageContentOutput +PutSolNetworkPackageContentInput +PutSolNetworkPackageContentMetadata +PutSolNetworkPackageContentOutput +PutSourceServerActionRequest +PutStorageConfigurationRequest +PutStorageConfigurationResponse +PutStorageLensConfigurationRequest +PutStorageLensConfigurationTaggingRequest +PutStoredQueryRequest +PutStoredQueryResponse +PutStudioMembersRequest +PutSubscriptionFilterRequest +PutSuppressedDestinationRequest +PutTargetsRequest +PutTargetsResponse +PutTargetsResultEntry +PutTelemetryRecordsRequest +PutTemplateActionRequest +PutThirdPartyJobFailureResultInput +PutThirdPartyJobSuccessResultInput +PutTraceSegmentsRequest +PutTraceSegmentsResult +PutUserPermissionsBoundaryRequest +PutUserPolicyRequest +PutUserStatusRequest +PutUsersRequest +PutVerificationStateOnViolationRequest +PutVoiceConnectorEmergencyCallingConfigurationRequest +PutVoiceConnectorEmergencyCallingConfigurationResponse +PutVoiceConnectorLoggingConfigurationRequest +PutVoiceConnectorLoggingConfigurationResponse +PutVoiceConnectorOriginationRequest +PutVoiceConnectorOriginationResponse +PutVoiceConnectorProxyRequest +PutVoiceConnectorProxyResponse +PutVoiceConnectorStreamingConfigurationRequest +PutVoiceConnectorStreamingConfigurationResponse +PutVoiceConnectorTerminationCredentialsRequest +PutVoiceConnectorTerminationRequest +PutVoiceConnectorTerminationResponse +PutWarmPoolType +PutWebhookInput +PutWebhookOutput +PutWorkflowRunPropertiesRequest +Pwd +PythonScript +PythonVersion +QRCodePNG +QSearchBar +QopConfiguration +Qualification +QualificationRequest +QualificationRequestId +QualificationRequests +QualificationRequirement +QualificationRequirements +QualificationStatus +QualificationType +QualificationTypeId +QualificationTypeStatus +QualificationTypes +Qualifications +Qualifier +Quality +QualityCheck +QualityCheckStepMetadata +QualityFilter +QualityLevel +QualityTuningLevel +Quantile +Quantity +QuantumTaskQueueInfo +QuantumTaskSummary +Queries +QueriesConfig +Query +QueryAlias +QueryArg +QueryArgProfile +QueryArgProfileConfig +QueryArgProfileEmpty +QueryArgProfiles +QueryArgument +QueryArn +QueryAsOfTime +QueryAssistantRequest +QueryAssistantResponse +QueryCapacityUnits +QueryCompileError +QueryCompileErrorLocation +QueryDefinition +QueryEndDate +QueryError +QueryErrors +QueryEvalStats +QueryExecution +QueryExecutionContext +QueryExecutionException +QueryExecutionId +QueryExecutionIds +QueryExecutionStatistics +QueryExecutionStatus +QueryExecutions +QueryFilter +QueryFilters +QueryForecastRequest +QueryForecastResponse +QueryId +QueryIdNotFoundException +QueryIdentifiersEnclosingOption +QueryInfo +QueryInput +QueryLanguageVersion +QueryLimitExceededException +QueryLimitException +QueryLineageRequest +QueryLineageResponse +QueryLogLookBackWindowInDays +QueryLoggingConfig +QueryLoggingConfigAlreadyExists +QueryLoggingConfigs +QueryName +QueryObjectsInput +QueryObjectsOutput +QueryOutput +QueryParameterMatch +QueryParameters +QueryPlanningContext +QueryPlanningTimeInMillis +QueryQueueTimeInMillis +QueryRecommendationTriggerData +QueryRequest +QueryResponse +QueryResult +QueryResultItem +QueryResultRows +QueryResultTypeFilter +QueryRuntimeStatistics +QueryRuntimeStatisticsRows +QueryRuntimeStatisticsTimeline +QuerySchemaVersionMetadataInput +QuerySchemaVersionMetadataResponse +QueryScopes +QuerySingleAlwaysOnNode +QueryStage +QueryStagePlan +QueryStagePlanNode +QueryStartDate +QueryStatement +QueryStatistics +QueryStatisticsForDescribeQuery +QueryStatus +QueryString +QueryStringBehavior +QueryStringCacheKeys +QueryStringConditionConfig +QueryStringConfig +QueryStringKeyValuePair +QueryStringNames +QueryStringObject +QueryStringParameters +QueryStrings +QueryStringsConfig +QuerySubmissionTime +QuerySuggestionsBlockListSummary +QuerySuggestionsId +QueryTableRowsRequest +QueryTableRowsResult +QueryText +QueryTexts +QueryTimeoutException +QueryTooLargeException +QueryWhatIfForecastRequest +QueryWhatIfForecastResponse +Question +QuestionChoices +QuestionDescription +QuestionDifference +QuestionDifferences +QuestionId +QuestionIdentifier +QuestionMetric +QuestionPriority +QuestionTitle +QuestionType +QuestionTypeProperties +Questions +Queue +QueueArn +QueueConfig +QueueConfigs +QueueConfiguration +QueueConfigurations +QueueId +QueueInfo +QueueName +QueueNamePrefix +QueueOwnerAWSAccountId +QueueQuickConnectConfig +QueueReference +QueueReferences +QueueSearchCriteria +QueueSearchFilter +QueueSummary +QueueSummaryList +QueueTimeMillis +QueueTransition +QueueTransitions +QueueType +QueueTypeCondition +QueueTypes +QueueUrl +QueueUrls +QueuedIngestion +Queues +QuickConnect +QuickConnectARN +QuickConnectConfig +QuickConnectId +QuickConnectIds +QuickConnectSearchCriteria +QuickConnectSearchFilter +QuickConnectSummary +QuickConnectSummaryList +QuickConnectType +QuickConnectTypes +QuickConnects +QuickSightConsole +QuickSightUserNotFoundException +Quiet +QuietTime +QuipConfiguration +Quota +QuotaAppliedAtLevel +QuotaArn +QuotaCode +QuotaContext +QuotaContextInfo +QuotaExceededException +QuotaName +QuotaPeriod +QuotaRequestedAtLevel +QuotaSettings +Quotas +QuoteChar +QuoteCharacter +QuoteEscapeCharacter +QuoteFields +QuoteSymbol +QvbrQualityLevel +QvbrQualityLevelFineTune +QvbrSettings +R53HostedZoneDeletionState +R53Resource +R53ResourceRecord +RDFGraphSummary +RDFGraphSummaryValueMap +RDSData +RDSDataSpec +RDSDatabase +RDSDatabaseCredentials +RDSInstanceDetails +RDSMetadata +RDSSourceConfig +RICostForUnusedHours +RMSE +RSessionAppSettings +RStudioConnectUrl +RStudioPackageManagerUrl +RStudioServerProAppSettings +RStudioServerProDomainSettings +RStudioServerProDomainSettingsForUpdate +RTMPConfiguration +RaAllowed +RabbitMQBrokerParameters +RackElevation +RackId +RackPhysicalProperties +RadarChartAggregatedFieldWells +RadarChartAreaStyleSettings +RadarChartConfiguration +RadarChartFieldWells +RadarChartSeriesSettings +RadarChartSortConfiguration +RadarChartVisual +Radios +Radius +RadiusPort +RadiusRetries +RadiusServers +RadiusSettings +RadiusStatus +RadiusTimeout +RaidArray +RaidArrayId +RaidArrayIds +RaidArrays +RaidLevel +RamDiskId +Ramdisk +RamdiskId +RandomNonce +RandomPassword +RandomSeed +RandomSplit +RandomSplitActivity +RandomSplitEntry +Range +RangeConstant +RangeEndsLabelType +RangeInBytes +RangeInKilometers +RangeMaximum +RangeMaximumValue +RangeMinimum +RangeMinimumValue +RangeNotSatisfiableException +RangedConnectionDetails +RangedSocketAddress +RangesOnIndexedValues +Rank +RankOrder +RasterDataCollectionArn +RasterDataCollectionMetadata +RasterDataCollectionName +RasterDataCollectionQuery +RasterDataCollectionQueryInput +RasterDataCollectionQueryOutput +RasterDataCollectionQueryWithBandFilterInput +RasterDataCollectionSummaries +RateBasedRule +RateBasedStatement +RateBasedStatementCustomKey +RateBasedStatementManagedKeysIPSet +RateControlMode +RateExceededException +RateIncreaseCriteria +RateKey +RateLimit +RateLimitCookie +RateLimitExceededException +RateLimitHeader +RateLimitLabelNamespace +RateLimitQueryArgument +RateLimitQueryString +RateLimitUriPath +RateMode +Rating +Raw +RawContent +RawEmail +RawFormat +RawInputRecords +RawMessage +RawMessageContent +RawMetricData +RawSecretAccessKey +RawSettings +RawString +RblName +RdsConfiguration +RdsDbClusterSnapshotConfiguration +RdsDbInstance +RdsDbInstanceArn +RdsDbInstanceArns +RdsDbInstanceDetails +RdsDbInstances +RdsDbSnapshotConfiguration +RdsDbUserDetails +RdsEngine +RdsEventCategories +RdsEventMessage +RdsHttpEndpointConfig +RdsLoginAttemptAction +RdsParameters +RdsRecommendation +RdsRequirements +RdsResourceId +ReEncryptDataInput +ReEncryptDataOutput +ReEncryptRequest +ReEncryptResponse +ReactStartCodegenJobData +ReactionForComment +ReactionLimitExceededException +ReactionValueFormats +ReactionValueRequiredException +Reactions +ReactiveAnomalies +ReactiveAnomaly +ReactiveAnomalySummary +ReactiveInsight +ReactiveInsightSummary +ReactiveInsights +ReactiveOrganizationInsightSummary +Read +ReadAccessPrincipalArns +ReadAheadBlocks +ReadAttributes +ReadBackupOnly +ReadCapacityUnits +ReadDeleteRate +ReadEndpoint +ReadIOs +ReadJobRequest +ReadJobResponse +ReadMarkerTimestamp +ReadOnly +ReadOnlyAdmins +ReadOnlyFieldInfo +ReadOnlyFields +ReadOnlyViolationException +ReadOptions +ReadPipelineRequest +ReadPipelineResponse +ReadPresetRequest +ReadPresetResponse +ReadRate +ReadRatePercent +ReadReplicaCapable +ReadReplicaDBClusterIdentifiers +ReadReplicaDBInstanceIdentifiers +ReadReplicaIdentifiers +ReadReplicaSourceDBClusterIdentifier +ReadReplicaSourceDBInstanceIdentifier +ReadSetBatchError +ReadSetFiles +ReadSetFilter +ReadSetListItem +ReadSetUploadPartListFilter +ReadSetUploadPartListItem +ReadTableSpaceName +ReadTime +ReadTimestamp +ReadWriteType +ReaderEndpoint +ReaderGroup +Readers +Readiness +ReadinessCheckArn +ReadinessCheckName +ReadinessCheckOutput +ReadinessCheckSummary +ReadinessChecks +ReadinessScopes +ReadmeBody +ReadmeUrl +ReadonlyRootFilesystem +Ready +ReadyDateTime +RealTimeAlertConfiguration +RealTimeAlertRule +RealTimeInferenceConfig +RealTimeInferenceRecommendation +RealTimeInferenceRecommendations +RealizedSavings +Realm +RealtimeContactAnalysisSegment +RealtimeEndpointInfo +RealtimeLogConfig +RealtimeLogConfigAlreadyExists +RealtimeLogConfigArn +RealtimeLogConfigInUse +RealtimeLogConfigName +RealtimeLogConfigOwnerMismatch +RealtimeLogConfigs +RealtimeMetricsSubscriptionConfig +RealtimeMetricsSubscriptionStatus +Reason +ReasonCode +ReasonCodeSummary +ReasonCodes +ReasonContext +ReasonForNewProvisioningData +ReasonMessage +Reasons +RebalanceSlotsInGlobalReplicationGroupMessage +RebalanceSlotsInGlobalReplicationGroupResult +RebootBrokerRequest +RebootBrokerResponse +RebootCacheClusterMessage +RebootCacheClusterResult +RebootClusterMessage +RebootClusterResult +RebootDBClusterMessage +RebootDBClusterResult +RebootDBInstanceMessage +RebootDBInstanceResult +RebootInputDeviceRequest +RebootInstanceRequest +RebootInstanceResult +RebootInstancesRequest +RebootNodeRequest +RebootNodeResponse +RebootOption +RebootRelationalDatabaseRequest +RebootRelationalDatabaseResult +RebootReplicationInstanceMessage +RebootReplicationInstanceResponse +RebootRequest +RebootWorkspaceRequests +RebootWorkspacesRequest +RebootWorkspacesResult +Rebooting +RebuildEnvironmentMessage +RebuildRequest +RebuildSnapshots +RebuildWorkspace +RebuildWorkspaceRequests +RebuildWorkspacesRequest +RebuildWorkspacesResult +Rec601Settings +Rec709Settings +Recall +Receipt +ReceiptAction +ReceiptFilter +ReceiptHandle +ReceiptInfo +ReceiptIpFilter +ReceiptRule +ReceiptRuleSetMetadata +ReceiptTime +ReceiptType +Receipts +ReceiveMessageRequest +ReceiveMessageResult +ReceiveRequestAttemptId +ReceivedAt +ReceivedEventAgeHistogram +ReceivedMetadata +ReceivedStatus +ReceivedStatusReason +ReceivedTime +Recency +RecencyDimension +RecencyType +RecentCaseCommunications +RecentlyActive +RecentlyFailedRuns +Recipe +RecipeAction +RecipeArn +RecipeName +RecipeReference +RecipeStep +RecipeSummary +RecipeUri +RecipeVersion +RecipeVersionErrorDetail +RecipeVersions +Recipes +Recipient +RecipientArn +RecipientDetail +RecipientDsnFields +RecipientId +RecipientInfo +RecipientParticipantId +Recipients +RecognizeCelebritiesRequest +RecognizeCelebritiesResponse +RecognizeTextRequest +RecognizeTextResponse +RecognizeUtteranceRequest +RecognizeUtteranceResponse +RecognizedBotMember +RecognizerMetadata +RecognizerName +Recommendation +RecommendationCategory +RecommendationData +RecommendationDescription +RecommendationDetailData +RecommendationDetailHourlyMetrics +RecommendationDetailId +RecommendationDetails +RecommendationDisruptionCompliance +RecommendationExportJob +RecommendationFeedback +RecommendationFeedbackSummaries +RecommendationFeedbackSummary +RecommendationId +RecommendationIds +RecommendationItem +RecommendationJobCompiledOutputConfig +RecommendationJobContainerConfig +RecommendationJobInferenceBenchmark +RecommendationJobInputConfig +RecommendationJobOutputConfig +RecommendationJobPayloadConfig +RecommendationJobResourceLimit +RecommendationJobStoppingConditions +RecommendationJobVpcConfig +RecommendationMetrics +RecommendationPreferences +RecommendationPreferencesDetail +RecommendationProviderIdType +RecommendationProviderRoleArn +RecommendationProviderUri +RecommendationRelatedAnomaly +RecommendationRelatedAnomalyResource +RecommendationRelatedAnomalySourceDetail +RecommendationRelatedCloudWatchMetricsSourceDetail +RecommendationRelatedEvent +RecommendationRelatedEventResource +RecommendationReportDetails +RecommendationRunId +RecommendationSet +RecommendationSettings +RecommendationSource +RecommendationStatus +RecommendationSummaries +RecommendationSummary +RecommendationTarget +RecommendationTemplate +RecommendationText +RecommendationTransformerUri +RecommendationTrigger +RecommendationType +Recommendations +RecommendationsDisplayName +RecommendationsPerMessage +RecommendedIntentSummary +RecommendedNormalizedUnitsToPurchase +RecommendedNumberOfInstancesToPurchase +RecommendedOptionProjectedMetric +RecommendedRuleset +RecommendedVersion +Recommender +RecommenderConfig +RecommenderConfigurationResponse +RecommenderId +RecommenderSummary +RecommenderUpdateSummary +ReconfigurationType +ReconnectEnabled +Record +RecordActivityTaskHeartbeatInput +RecordColumn +RecordColumnDelimiter +RecordColumnUpdates +RecordColumns +RecordData +RecordDelimiter +RecordDetail +RecordDetails +RecordEncoding +RecordEncodingUpdate +RecordError +RecordErrors +RecordFormat +RecordFormatType +RecordFormatUpdate +RecordHandlerProgressInput +RecordId +RecordIdentifierFeatureName +RecordIdentifierValueAsString +RecordIdentifiersValueAsString +RecordIndex +RecordIngestionFailures +RecordLength +RecordLifecycleActionHeartbeatType +RecordMarkerDecisionAttributes +RecordMarkerFailedEventAttributes +RecordName +RecordOutput +RecordOutputs +RecordPatch +RecordPatches +RecordPollingLimit +RecordPreprocessorSourceUri +RecordRowDelimiter +RecordRowPath +RecordSetId +RecordSizeKiB +RecordState +RecordTag +RecordTags +RecordType +RecordVersion +RecordWrapperType +RecordedAt +RecorderConfig +RecorderStatus +RecordingConfiguration +RecordingConfigurationSummary +RecordingFileFormat +RecordingGroup +RecordingStrategy +RecordingStreamConfiguration +Records +RecordsEvent +RecordsIngested +RecordsProcessed +RecoveryCheckpoint +RecoveryGroupArn +RecoveryGroupName +RecoveryGroupOutput +RecoveryGroups +RecoveryInstance +RecoveryInstanceDataReplicationError +RecoveryInstanceDataReplicationInfo +RecoveryInstanceDataReplicationInfoReplicatedDisk +RecoveryInstanceDataReplicationInitiation +RecoveryInstanceDataReplicationInitiationStep +RecoveryInstanceDisk +RecoveryInstanceFailback +RecoveryInstanceProperties +RecoveryLifeCycle +RecoveryMechanisms +RecoveryOptionType +RecoveryPoint +RecoveryPointArn +RecoveryPointByBackupVault +RecoveryPointByResource +RecoveryPointCreator +RecoveryPointMember +RecoveryPointSelection +RecoveryPointTags +RecoveryPoints +RecoverySnapshot +RecoveryWindow +RecoveryWindowInDays +RecrawlBehavior +RecrawlPolicy +Rectangle +Recurrence +RecurrenceInHours +RecurrenceMultiplier +RecurrenceSettings +RecurringCharge +RecurringChargeAmount +RecurringChargeFrequency +RecurringCharges +RecurringCount +RecurringStandardMonthlyCost +Recurse +Recursive +RecursiveDeleteOption +RecursiveInvocationException +RecycleBinEnterTime +RecycleBinExitTime +RecycleBinFolderId +Red +RedPrimaryX +RedPrimaryY +RedactChannelMessageRequest +RedactChannelMessageResponse +RedactConversationMessageRequest +RedactRoomMessageRequest +Redacted +RedactedEwsAvailabilityProvider +RedactedFields +RedactedMediaFileUri +RedactedTranscriptFileUri +RedactionConfig +RedactionOutput +RedactionType +Redirect +RedirectActionConfig +RedirectAllRequestsTo +RedirectConfig +RedirectException +RedirectLocation +RedirectSignInURIs +RedirectSignOutURIs +RedirectURL +RedisSettings +Redshift +RedshiftConnectorProfileCredentials +RedshiftConnectorProfileProperties +RedshiftDataParameters +RedshiftDataProviderSettings +RedshiftDataShareAsset +RedshiftDataShareAssetSourceEntry +RedshiftDataSpec +RedshiftDatabase +RedshiftDatabaseCredentials +RedshiftDatasetDefinition +RedshiftDestinationConfiguration +RedshiftDestinationDescription +RedshiftDestinationProperties +RedshiftDestinationUpdate +RedshiftInstanceDetails +RedshiftMetadata +RedshiftParameters +RedshiftPid +RedshiftQueryId +RedshiftRetryOptions +RedshiftSettings +RedshiftSource +RedshiftSourceConfig +RedshiftTarget +RedshiftTmpDir +RedundancyPercent +RedundantManifest +ReenrollAllCertificateHolders +RefId +RefResource +Reference +ReferenceActionName +ReferenceArn +ReferenceData +ReferenceDataSource +ReferenceDataSourceDescription +ReferenceDataSourceDescriptions +ReferenceDataSourceUpdate +ReferenceDataSourceUpdates +ReferenceDataSources +ReferenceDoesNotExistException +ReferenceFiles +ReferenceFilter +ReferenceId +ReferenceImage +ReferenceLine +ReferenceLineCustomLabelConfiguration +ReferenceLineDataConfiguration +ReferenceLineDynamicDataConfiguration +ReferenceLineLabelConfiguration +ReferenceLineStaticDataConfiguration +ReferenceLineStyleConfiguration +ReferenceLineValueLabelConfiguration +ReferenceLines +ReferenceListItem +ReferenceMetric +ReferenceNameRequiredException +ReferencePath +ReferencePredictorArn +ReferencePredictorSummary +ReferenceRoleARN +ReferenceRoleARNUpdate +ReferenceScalar +ReferenceSchema +ReferenceSchemaUpdate +ReferenceSets +ReferenceStoreDetail +ReferenceStoreFilter +ReferenceSummaryList +ReferenceTypeNotSupportedException +ReferenceTypes +ReferenceUrls +ReferencedBy +ReferencedByResources +ReferencedGroupId +ReferencedGroupInfo +ReferencedImageDetail +ReferencedImagesNotFoundException +ReferencedSecurityGroup +References +ReferencingVpcId +ReferrerPolicy +Refresh +RefreshArn +RefreshCacheInput +RefreshCacheOutput +RefreshClosedReports +RefreshConfiguration +RefreshDetails +RefreshFrequency +RefreshId +RefreshOnDay +RefreshOnSegmentUpdate +RefreshPreferences +RefreshSchedule +RefreshSchedules +RefreshSchemasMessage +RefreshSchemasResponse +RefreshSchemasStatus +RefreshStatisticsIdMap +RefreshStatus +RefreshToken +RefreshTokenExpiration +RefreshTokenRequest +RefreshTokenRequestBody +RefreshTokenResponse +RefreshTokenValidity +RefreshTrustedAdvisorCheckRequest +RefreshTrustedAdvisorCheckResponse +RefreshType +RefreshedAt +RegParamsRevision +RegenerateSecurityTokenRequest +RegenerateSecurityTokenResponse +Regex +RegexMatchSet +RegexMatchSetId +RegexMatchSetSummary +RegexMatchSetUpdate +RegexMatchSets +RegexMatchStatement +RegexMatchTuple +RegexMatchTuples +RegexPatternSet +RegexPatternSetId +RegexPatternSetReferenceStatement +RegexPatternSetSummary +RegexPatternSetUpdate +RegexPatternSets +RegexPatternString +RegexPatternStrings +RegexString +Region +RegionCode +RegionConcurrencyType +RegionDescription +RegionDisabledException +RegionFilters +RegionIdentifier +RegionInfo +RegionLimitExceededException +RegionLinkingMode +RegionMapInputValue +RegionName +RegionNames +RegionOfInterest +RegionOptStatus +RegionOptStatusContains +RegionOrder +RegionReport +RegionScope +RegionType +RegionalBucket +RegionalBucketList +RegionalConfiguration +RegionalConfigurations +Regions +RegionsDescription +RegionsInfo +RegionsOfInterest +RegionsOfInterestForUpdate +RegisterAVSDeviceRequest +RegisterAVSDeviceResponse +RegisterAccountRequest +RegisterAccountResponse +RegisterActivityTypeInput +RegisterAgentRequest +RegisterAgentResponse +RegisterAppInstanceUserEndpointRequest +RegisterAppInstanceUserEndpointResponse +RegisterApplicationInput +RegisterApplicationOutput +RegisterApplicationRevisionInput +RegisterCACertificateRequest +RegisterCACertificateResponse +RegisterCertificateRequest +RegisterCertificateResponse +RegisterCertificateResult +RegisterCertificateWithoutCARequest +RegisterCertificateWithoutCAResponse +RegisterClientRequest +RegisterClientResponse +RegisterClusterRequest +RegisterClusterResponse +RegisterComputeInput +RegisterComputeOutput +RegisterConnectorRequest +RegisterConnectorResponse +RegisterContainerImageRequest +RegisterContainerImageResult +RegisterContainerInstanceRequest +RegisterContainerInstanceResponse +RegisterCrossAccountAccessRoleRequest +RegisterDBProxyTargetsRequest +RegisterDBProxyTargetsResponse +RegisterDataLakeDelegatedAdministratorRequest +RegisterDefaultPatchBaselineRequest +RegisterDefaultPatchBaselineResult +RegisterDelegatedAdministratorRequest +RegisterDeviceRequest +RegisterDeviceResponse +RegisterDevicesRequest +RegisterDomainInput +RegisterDomainRequest +RegisterDomainResponse +RegisterEcsClusterRequest +RegisterEcsClusterResult +RegisterElasticIpRequest +RegisterElasticIpResult +RegisterEndPointsInput +RegisterEndPointsOutput +RegisterEndpoints +RegisterEventTopicRequest +RegisterGameServerInput +RegisterGameServerOutput +RegisterIdentityProviderRequest +RegisterIdentityProviderResponse +RegisterImageRequest +RegisterImageResult +RegisterInstanceEventNotificationAttributesRequest +RegisterInstanceEventNotificationAttributesResult +RegisterInstanceRequest +RegisterInstanceResponse +RegisterInstanceResult +RegisterInstanceTagAttributeRequest +RegisterJobDefinitionRequest +RegisterJobDefinitionResponse +RegisterMailDomainRequest +RegisterModel +RegisterModelStepMetadata +RegisterNewBaseline +RegisterOnPremisesInstanceInput +RegisterOrganizationAdminAccountRequest +RegisterOrganizationAdminAccountResponse +RegisterOrganizationDelegatedAdminRequest +RegisterPackageVersionRequest +RegisterPatchBaselineForPatchGroupRequest +RegisterPatchBaselineForPatchGroupResult +RegisterPublisherInput +RegisterPublisherOutput +RegisterRdsDbInstanceRequest +RegisterResourceRequest +RegisterRobotRequest +RegisterRobotResponse +RegisterScalableTargetRequest +RegisterScalableTargetResponse +RegisterSchemaVersionInput +RegisterSchemaVersionResponse +RegisterSlackWorkspaceForOrganizationRequest +RegisterSlackWorkspaceForOrganizationResult +RegisterStreamConsumerInput +RegisterStreamConsumerOutput +RegisterTargetWithMaintenanceWindowRequest +RegisterTargetWithMaintenanceWindowResult +RegisterTargetsInput +RegisterTargetsRequest +RegisterTargetsResponse +RegisterTaskDefinitionRequest +RegisterTaskDefinitionResponse +RegisterTaskWithMaintenanceWindowRequest +RegisterTaskWithMaintenanceWindowResult +RegisterThingRequest +RegisterThingResponse +RegisterToWorkMailRequest +RegisterTransitGatewayMulticastGroupMembersRequest +RegisterTransitGatewayMulticastGroupMembersResult +RegisterTransitGatewayMulticastGroupSourcesRequest +RegisterTransitGatewayMulticastGroupSourcesResult +RegisterTransitGatewayRequest +RegisterTransitGatewayResponse +RegisterTypeInput +RegisterTypeOutput +RegisterUsageRequest +RegisterUsageResult +RegisterUserRequest +RegisterUserResponse +RegisterVolumeRequest +RegisterVolumeResult +RegisterWebhookWithThirdPartyInput +RegisterWorkflowTypeInput +RegisterWorkspaceDirectoryRequest +Registered +RegisteredAt +RegisteredBy +RegisteredContainerInstancesCount +RegisteredDate +RegisteredDateTime +RegisteredDeviceCount +RegisteredDomainDelegationInfo +RegisteredGatewayArn +RegisteredId +RegisteredMulticastGroupMembers +RegisteredMulticastGroupSources +RegisteredNetworkInterfaceIds +RegisteredOn +RegisteredTime +RegisteredUserConsoleFeatureConfigurations +RegisteredUserDashboardEmbeddingConfiguration +RegisteredUserDashboardFeatureConfigurations +RegisteredUserDashboardVisualEmbeddingConfiguration +RegisteredUserEmbeddingExperienceConfiguration +RegisteredUserQSearchBarEmbeddingConfiguration +RegisteredUserQuickSightConsoleEmbeddingConfiguration +Registering +RegistrantContact +RegistrantPrivacy +RegistrarName +RegistrarUrl +RegistrationCode +RegistrationCodeValidationException +RegistrationConfig +RegistrationDate +RegistrationId +RegistrationLimit +RegistrationMetadata +RegistrationMetadataItem +RegistrationOutput +RegistrationPagePath +RegistrationPrice +RegistrationStatusFilter +RegistrationTime +RegistrationToken +RegistrationTokenList +RegistrationZone +RegistrationsCount +Registries +Registry +RegistryAlias +RegistryArn +RegistryCatalogData +RegistryCredential +RegistryDomainId +RegistryId +RegistryListItem +RegistryName +RegistryNamePrefix +RegistryNotFoundException +RegistryPolicyNotFoundException +RegistryScanningConfiguration +RegistryScanningRule +RegistrySummary +RegularExpressionList +RehydrationType +ReimportApiRequest +ReimportApiResponse +RejectAssignmentRequest +RejectAttachmentRequest +RejectAttachmentResponse +RejectCertificateTransferRequest +RejectClientVpcConnectionRequest +RejectDataShareMessage +RejectDomainTransferFromAnotherAwsAccountRequest +RejectDomainTransferFromAnotherAwsAccountResponse +RejectEnvironmentAccountConnectionInput +RejectEnvironmentAccountConnectionOutput +RejectGrantRequest +RejectGrantResponse +RejectInboundConnectionRequest +RejectInboundConnectionResponse +RejectInboundCrossClusterSearchConnectionRequest +RejectInboundCrossClusterSearchConnectionResponse +RejectInputDeviceTransferRequest +RejectInvitationInput +RejectInvitationRequest +RejectPortfolioShareInput +RejectQualificationRequestRequest +RejectResourceShareInvitationRequest +RejectResourceShareInvitationResponse +RejectSharedDirectoryRequest +RejectSharedDirectoryResult +RejectSkillRequest +RejectTransitGatewayMulticastDomainAssociationsRequest +RejectTransitGatewayMulticastDomainAssociationsResult +RejectTransitGatewayPeeringAttachmentRequest +RejectTransitGatewayPeeringAttachmentResult +RejectTransitGatewayVpcAttachmentRequest +RejectTransitGatewayVpcAttachmentResult +RejectVpcEndpointConnectionsRequest +RejectVpcEndpointConnectionsResult +RejectVpcPeeringConnectionRequest +RejectVpcPeeringConnectionResult +RejectedLogEventsInfo +RejectedPatches +RejectedPatchesAction +RejectedRecord +RejectedRecords +RejectedRecordsException +RejectionTime +Rejects +RekeyFuzzPercentage +RekeyMarginTimeSeconds +RelatedAnomalies +RelatedColumnName +RelatedContactId +RelatedDeployments +RelatedEvents +RelatedFinding +RelatedFindings +RelatedFindingsId +RelatedFindingsProductArn +RelatedItem +RelatedItemEventIncludedData +RelatedObservations +RelatedOpsItem +RelatedOpsItems +RelatedRequirements +RelatedResource +RelatedResourceArns +RelatedVulnerabilities +RelatedWorkspaceProperties +RelatedWorkspaces +RelationType +RelationalCatalogSource +RelationalDatabase +RelationalDatabaseBlueprint +RelationalDatabaseBundle +RelationalDatabaseDataSourceConfig +RelationalDatabaseEndpoint +RelationalDatabaseEvent +RelationalDatabaseHardware +RelationalDatabaseParameter +RelationalDatabaseSnapshot +RelationalTable +Relationship +RelationshipScore +RelationshipStatus +RelationshipType +RelationshipTypeFilter +RelationshipValue +Relationships +RelationshipsListItem +Relative +RelativeAggregationDuration +RelativeDateFilter +RelativeDateFilterFunction +RelativeDateTime +RelativeDateTimeControlDisplayOptions +RelativeDateType +RelativeDateValue +RelativeDatesFilter +RelativePath +RelativePosition +RelativeProgram +RelativeTimeRange +RelayState +RelayStateParameterName +Release +ReleaseAddressRequest +ReleaseAfterMinutes +ReleaseAgentPath +ReleaseConfiguration +ReleaseDate +ReleaseFileSystemNfsV3LocksRequest +ReleaseFileSystemNfsV3LocksResponse +ReleaseHostsRequest +ReleaseHostsResult +ReleaseIpamPoolAllocationRequest +ReleaseIpamPoolAllocationResult +ReleaseLabel +ReleaseLabelFilter +ReleaseLabels +ReleaseNotes +ReleasePhoneNumberRequest +ReleasePhoneNumberResult +ReleaseStaticIpRequest +ReleaseStaticIpResult +ReleaseStatus +ReleaseSummaries +ReleaseSummary +ReleaseTime +ReleaseVersion +ReleasedCapacity +Relevance +RelevanceFeedback +RelevanceFeedbackItems +RelevanceValue +ReloadOption +ReloadReplicationTablesMessage +ReloadReplicationTablesResponse +ReloadTablesMessage +ReloadTablesResponse +RemainingCount +RemainingLife +RemainingTotalValue +RemainingUpfrontValue +Remarks +Remediation +RemediationAction +RemediationActionType +RemediationActionWithOrder +RemediationConfiguration +RemediationConfigurations +RemediationEnabled +RemediationException +RemediationExceptionResourceKey +RemediationExceptions +RemediationExecutionStatus +RemediationExecutionStatuses +RemediationExecutionStep +RemediationInProgressException +RemediationParameterValue +RemediationRecommendation +RemediationResult +RemediationUrl +ReminderAtMinutes +ReminderType +RemixSettings +Remote +RemoteAccessConfig +RemoteAccessSession +RemoteAccountDetails +RemoteAdministrationEndpoint +RemoteDirectoryPath +RemoteDomainInfo +RemoteDomainName +RemoteDomainNames +RemoteId +RemoteIpDetails +RemoteIpv4NetworkCidr +RemoteIpv6NetworkCidr +RemoteManagement +RemoteMta +RemotePortDetails +RemoteSourceCodeAnalysisServerInfo +RemoteSources +Removals +Remove +RemoveAccountFromOrganizationRequest +RemoveAclConfiguration +RemoveAction +RemoveAllBackendsRequest +RemoveAllBackendsResponse +RemoveAllPermissions +RemoveAllResourcePermissionsRequest +RemoveAllocationResourceTags +RemoveAllowedPrincipals +RemoveApplicationInstanceRequest +RemoveAttributesActivity +RemoveAttributesFromFindingsRequest +RemoveAttributesFromFindingsResponse +RemoveAttributesRequest +RemoveAttributesResponse +RemoveAutoScalingPolicyInput +RemoveAutoTerminationPolicyInput +RemoveAvailabilityZonesInput +RemoveAvailabilityZonesOutput +RemoveBackendConfigRequest +RemoveBackendConfigResponse +RemoveBridgeOutputRequest +RemoveBridgeOutputResponse +RemoveBridgeSourceRequest +RemoveBridgeSourceResponse +RemoveBytesScannedCutoffPerQuery +RemoveClientIDFromOpenIDConnectProviderRequest +RemoveCustomRoutingEndpointsRequest +RemoveCustomerContentEncryptionConfiguration +RemoveCustomerOverride +RemoveDraftAppVersionResourceMappingsRequest +RemoveDraftAppVersionResourceMappingsResponse +RemoveEncryptionConfiguration +RemoveEndDate +RemoveEndpointsRequest +RemoveEntries +RemoveExpectedBucketOwner +RemoveFacetFromObject +RemoveFacetFromObjectRequest +RemoveFields +RemoveFlowMediaStreamRequest +RemoveFlowMediaStreamResponse +RemoveFlowOutputRequest +RemoveFlowOutputResponse +RemoveFlowSourceRequest +RemoveFlowSourceResponse +RemoveFlowVpcInterfaceRequest +RemoveFlowVpcInterfaceResponse +RemoveFromGlobalClusterMessage +RemoveFromGlobalClusterResult +RemoveFromVersionId +RemoveGatewayLoadBalancerArns +RemoveHeadersConfig +RemoveIamRoles +RemoveInvalidCertificateFromPersonalStore +RemoveIpRoutesRequest +RemoveIpamOperatingRegion +RemoveKnowledgeBaseTemplateUriRequest +RemoveLFTagsFromResourceRequest +RemoveLFTagsFromResourceResponse +RemoveLayerVersionPermissionRequest +RemoveLicenseSpecifications +RemoveListenerCertificatesInput +RemoveManagedScalingPolicyInput +RemoveNetworkLoadBalancerArns +RemoveNetworkServices +RemoveNotificationChannelRequest +RemoveNotificationChannelResponse +RemoveOperatingRegions +RemoveOutputLocation +RemovePermissionInput +RemovePermissionRequest +RemovePermissionResponse +RemovePrefixListEntry +RemovePrivateDnsName +RemoveProfilePermissionRequest +RemoveProfilePermissionResponse +RemoveQuotes +RemoveRegionRequest +RemoveRegionsFromReplicationRequest +RemoveRegionsFromReplicationResponse +RemoveReplicaRegions +RemoveResourcePermissionRequest +RemoveRoleFromDBClusterMessage +RemoveRoleFromDBInstanceMessage +RemoveRoleFromInstanceProfileRequest +RemoveRouteTableIds +RemoveSNSTopic +RemoveSchemaVersionMetadataInput +RemoveSchemaVersionMetadataResponse +RemoveSecurityGroupIds +RemoveSourceIdentifierFromSubscriptionMessage +RemoveSourceIdentifierFromSubscriptionResult +RemoveSourceServerActionRequest +RemoveStorageSystemRequest +RemoveSubnetArns +RemoveSubnetIds +RemoveSubnets +RemoveSupportedIpAddressTypes +RemoveTagKeys +RemoveTags +RemoveTagsFromCertificateRequest +RemoveTagsFromOnPremisesInstancesInput +RemoveTagsFromResourceInput +RemoveTagsFromResourceMessage +RemoveTagsFromResourceOutput +RemoveTagsFromResourceRequest +RemoveTagsFromResourceResponse +RemoveTagsFromStreamInput +RemoveTagsFromVaultInput +RemoveTagsInput +RemoveTagsRequest +RemoveTargetsRequest +RemoveTargetsResponse +RemoveTargetsResultEntry +RemoveTemplateActionRequest +RemoveThingFromBillingGroupRequest +RemoveThingFromThingGroupRequest +RemoveTransitGatewayCidrBlocks +RemoveUserFromGroupRequest +RemoveUserGroups +RemoveWorkloadRequest +RemovedLabels +RenameColumnOperation +RenameField +RenderUiTemplateRequest +RenderUiTemplateResponse +RenderableTask +RenderedContent +RenderedTemplate +RenderingConfiguration +RenderingEngine +RenderingError +RenderingRules +RenditionConfiguration +RenditionGroupId +RenditionLanguageCode +RenditionName +RenewCertificateRequest +RenewDomainRequest +RenewDomainResponse +RenewOfferingRequest +RenewOfferingResult +RenewType +RenewalCount +RenewalEligibility +RenewalPeriod +RenewalPrice +RenewalSettings +RenewalStatus +RenewalStatusReason +RenewalSummary +RenewalType +ReorderReceiptRuleSetRequest +RepInterval +RepeatAt +RepeatExtXKey +RepeatFrameMsec +RepeatPps +Replace +ReplaceAllLabels +ReplaceChars +ReplaceContentEntry +ReplaceDefaultPolicyVersionParams +ReplaceIamInstanceProfileAssociationRequest +ReplaceIamInstanceProfileAssociationResult +ReplaceInvalidChars +ReplaceKeyPrefixWith +ReplaceKeyWith +ReplaceNetworkAclAssociationRequest +ReplaceNetworkAclAssociationResult +ReplaceNetworkAclEntryRequest +ReplacePathPrefix +ReplacePermissionAssociationsRequest +ReplacePermissionAssociationsResponse +ReplacePermissionAssociationsWork +ReplaceRootVolumeTask +ReplaceRootVolumeTaskId +ReplaceRootVolumeTaskIds +ReplaceRootVolumeTasks +ReplaceRouteRequest +ReplaceRouteTableAssociationRequest +ReplaceRouteTableAssociationResult +ReplaceTopicRuleRequest +ReplaceTransitGatewayRouteRequest +ReplaceTransitGatewayRouteResult +ReplaceUnhealthyInstances +ReplaceVpnTunnelRequest +ReplaceVpnTunnelResult +Replacement +ReplacementContentRequiredException +ReplacementEmailContent +ReplacementJob +ReplacementStrategy +ReplacementTags +ReplacementTemplate +ReplacementTemplateData +ReplacementTypeRequiredException +Replay +ReplayArn +ReplayDestination +ReplayEndTime +ReplayName +ReplayStartTime +ReplayWindowSize +Replays +Replica +ReplicaAlias +ReplicaAlreadyExistsException +ReplicaAutoScalingDescription +ReplicaAutoScalingUpdate +ReplicaAvailabilityZones +ReplicaBillingModeSummary +ReplicaConfiguration +ReplicaConfigurationRequest +ReplicaCount +ReplicaDescription +ReplicaGlobalSecondaryIndex +ReplicaGlobalSecondaryIndexAutoScalingDescription +ReplicaGlobalSecondaryIndexAutoScalingUpdate +ReplicaGlobalSecondaryIndexDescription +ReplicaGlobalSecondaryIndexSettings +ReplicaGlobalSecondaryIndexSettingsDescription +ReplicaGlobalSecondaryIndexSettingsUpdate +ReplicaGlobalSecondaryIndexUpdates +ReplicaInaccessibleDateTime +ReplicaKeyMetadata +ReplicaKeys +ReplicaKmsKeyID +ReplicaMode +ReplicaModifications +ReplicaNotFoundException +ReplicaOutpostArns +ReplicaPolicy +ReplicaProvisionedReadCapacityAutoScalingSettings +ReplicaProvisionedReadCapacityAutoScalingSettingsUpdate +ReplicaProvisionedReadCapacityAutoScalingUpdate +ReplicaProvisionedReadCapacityUnits +ReplicaProvisionedWriteCapacityAutoScalingSettings +ReplicaProvisionedWriteCapacityUnits +ReplicaRegion +ReplicaRegionType +ReplicaSettings +ReplicaSettingsDescription +ReplicaSettingsUpdate +ReplicaStatus +ReplicaStatusDescription +ReplicaStatusPercentProgress +ReplicaTableClass +ReplicaTableClassSummary +ReplicaTags +ReplicaUpdate +ReplicaUpdates +Replicas +ReplicasPerNodeGroup +ReplicasToRemove +ReplicateInstanceRequest +ReplicateInstanceResponse +ReplicateKeyRequest +ReplicateKeyResponse +ReplicateSecretToRegionsRequest +ReplicateSecretToRegionsResponse +ReplicateShardCollections +ReplicateTo +ReplicatingFrom +ReplicatingTo +Replication +ReplicationConfig +ReplicationConfigArn +ReplicationConfigCreateTime +ReplicationConfigIdentifier +ReplicationConfigUpdateTime +ReplicationConfigs +ReplicationConfiguration +ReplicationConfigurationDescription +ReplicationConfigurationReplicatedDisk +ReplicationConfigurationTemplate +ReplicationCreateTime +ReplicationDestination +ReplicationDetails +ReplicationFactor +ReplicationGroup +ReplicationGroupAlreadyExistsFault +ReplicationGroupAlreadyUnderMigrationFault +ReplicationGroupCreateTime +ReplicationGroupDescription +ReplicationGroupId +ReplicationGroupIds +ReplicationGroupLogDeliveryEnabled +ReplicationGroupMessage +ReplicationGroupNotFoundFault +ReplicationGroupNotUnderMigrationFault +ReplicationGroupPendingModifiedValues +ReplicationGroupRegion +ReplicationGroupUpdate +ReplicationGroups +ReplicationInstance +ReplicationInstanceArn +ReplicationInstanceClass +ReplicationInstanceEngineMinimumVersion +ReplicationInstanceIdentifier +ReplicationInstanceIpv6Addresses +ReplicationInstancePrivateIpAddress +ReplicationInstancePrivateIpAddresses +ReplicationInstancePublicIpAddress +ReplicationInstancePublicIpAddresses +ReplicationInstanceStatus +ReplicationInstanceTaskLog +ReplicationInstanceTaskLogSize +ReplicationInstanceTaskLogs +ReplicationInstances +ReplicationJob +ReplicationJobAlreadyExistsException +ReplicationJobNotFoundException +ReplicationLastStopTime +ReplicationNotFound +ReplicationPendingModifiedValues +ReplicationRule +ReplicationRuleAndOperator +ReplicationRuleFilter +ReplicationRun +ReplicationRunLimitExceededException +ReplicationRunStageDetails +ReplicationScope +ReplicationSet +ReplicationSettings +ReplicationSourceIdentifier +ReplicationSpecification +ReplicationStats +ReplicationStatus +ReplicationStatusType +ReplicationSubnetGroup +ReplicationSubnetGroupDescription +ReplicationSubnetGroupDoesNotCoverEnoughAZs +ReplicationSubnetGroupId +ReplicationSubnetGroupIdentifier +ReplicationSubnetGroups +ReplicationTableStatistics +ReplicationTask +ReplicationTaskArn +ReplicationTaskAssessmentResult +ReplicationTaskAssessmentResults +ReplicationTaskAssessmentRun +ReplicationTaskAssessmentRunArn +ReplicationTaskAssessmentRunCreationDate +ReplicationTaskAssessmentRunProgress +ReplicationTaskAssessmentRuns +ReplicationTaskCreationDate +ReplicationTaskIdentifier +ReplicationTaskIndividualAssessment +ReplicationTaskIndividualAssessmentArn +ReplicationTaskIndividualAssessmentStartDate +ReplicationTaskIndividualAssessments +ReplicationTaskLastAssessmentDate +ReplicationTaskName +ReplicationTaskSettings +ReplicationTaskStartDate +ReplicationTaskStats +ReplicationTasks +ReplicationTime +ReplicationTimeValue +ReplicationType +ReplicationUpdateTime +ReplicationUser +Replications +ReplyTo +ReplyToAddresses +ReplyToEmailAddress +RepoPrefixLocation +RepoUpgradeOnBoot +Report +ReportConfiguration +ReportContext +ReportCreatorAccount +ReportDefinition +ReportDefinitions +ReportDeliveryChannel +ReportDestination +ReportDestinationS3 +ReportDevStatusBattery +ReportDevStatusMargin +ReportExportConfig +ReportFilter +ReportFormat +ReportFrequency +ReportGenerated +ReportGenerationLimitExceededException +ReportGenerator +ReportGeneratorName +ReportGenerators +ReportGroup +ReportGroupTrendStats +ReportId +ReportInstanceStatusRequest +ReportJob +ReportJobId +ReportJobs +ReportLevel +ReportLimitReachedException +ReportName +ReportOverride +ReportOverrides +ReportPlan +ReportPlanArn +ReportPlanDescription +ReportPlanName +ReportPlanTags +ReportPlans +ReportResult +ReportS3Configuration +ReportScope +ReportSetting +ReportTaskProgressInput +ReportTaskProgressOutput +ReportTaskRunnerHeartbeatInput +ReportTaskRunnerHeartbeatOutput +ReportTemplate +ReportType +ReportUri +ReportVersioning +ReportWithRawData +ReportedAgentVersion +ReportedName +ReportedOs +ReportedRuntimeContextState +ReportedVersion +ReportingMta +Repository +RepositoryAccessMode +RepositoryAggregation +RepositoryAggregationResponse +RepositoryAlreadyExistsException +RepositoryAnalysis +RepositoryAssociation +RepositoryAssociationArn +RepositoryAssociationSummaries +RepositoryAssociationSummary +RepositoryAuthConfig +RepositoryBranch +RepositoryBranchInput +RepositoryCatalogData +RepositoryCatalogDataInput +RepositoryCatalogDataNotFoundException +RepositoryCredentials +RepositoryCredentialsProviderArn +RepositoryDescription +RepositoryDoesNotExistException +RepositoryExternalConnectionInfo +RepositoryFilter +RepositoryHead +RepositoryHeadSourceCodeType +RepositoryInput +RepositoryLimitExceededException +RepositoryMetadata +RepositoryName +RepositoryNameExistsException +RepositoryNameIdPair +RepositoryNameRequiredException +RepositoryNames +RepositoryNamesRequiredException +RepositoryNotAssociatedWithPullRequestException +RepositoryNotEmptyException +RepositoryNotFoundException +RepositoryOwner +RepositoryPolicyNotFoundException +RepositoryPolicyText +RepositoryScanningConfiguration +RepositoryScanningConfigurationFailure +RepositorySummary +RepositorySyncAttempt +RepositorySyncDefinition +RepositorySyncEvent +RepositoryTrigger +RepositoryTriggerBranchNameListRequiredException +RepositoryTriggerDestinationArnRequiredException +RepositoryTriggerEventsListRequiredException +RepositoryTriggerExecutionFailure +RepositoryTriggerNameRequiredException +RepositoryTriggersListRequiredException +RepositoryType +RepositoryUrl +ReprocessingSummary +RepublishAction +ReputationMetricsEnabled +ReputationOptions +Request +RequestAlreadyInProgressException +RequestAlreadyProcessedException +RequestBody +RequestBodyAssociatedResourceTypeConfig +RequestCancelActivityTaskDecisionAttributes +RequestCancelActivityTaskFailedEventAttributes +RequestCancelExternalWorkflowExecutionDecisionAttributes +RequestCancelExternalWorkflowExecutionFailedEventAttributes +RequestCancelExternalWorkflowExecutionInitiatedEventAttributes +RequestCancelWorkflowExecutionInput +RequestCertificateRequest +RequestCertificateResponse +RequestChangedException +RequestCharacters +RequestCharged +RequestCompletionTime +RequestConfiguration +RequestCount +RequestDetailedStatus +RequestDetails +RequestEntityTooLargeException +RequestEntry +RequestEnvironmentInfoMessage +RequestError +RequestFailedException +RequestFilterPortRange +RequestHeaders +RequestHeadersInserted +RequestID +RequestId +RequestIdentifier +RequestImpactStatistics +RequestInProgressException +RequestInspection +RequestInspectionACFP +RequestInterval +RequestIpamResourceTag +RequestItems +RequestLaunchTemplateData +RequestLimitExceeded +RequestLimitExceededException +RequestMetadata +RequestModels +RequestOrigin +RequestOutputItem +RequestParameterKey +RequestParameters +RequestPayer +RequestPaymentConfiguration +RequestPhoneNumberRequest +RequestPhoneNumberResult +RequestProgress +RequestResponses +RequestRoute +RequestServiceQuotaIncreaseRequest +RequestServiceQuotaIncreaseResponse +RequestSource +RequestSpotFleetRequest +RequestSpotFleetResponse +RequestSpotInstancesRequest +RequestSpotInstancesResult +RequestSpotLaunchSpecification +RequestStatus +RequestStatusMessage +RequestTTLSeconds +RequestTemplates +RequestThrottledException +RequestTime +RequestTimeoutException +RequestTimeoutSeconds +RequestToken +RequestTokenARN +RequestTokenNotFoundException +RequestTooLargeException +RequestType +RequestUploadCredentialsInput +RequestUploadCredentialsOutput +RequestUri +RequestValidator +RequestValidators +Requested +RequestedAmiVersion +RequestedColumns +RequestedDateTime +RequestedDimensions +RequestedDocumentAttributes +RequestedEc2AvailabilityZones +RequestedEc2SubnetIds +RequestedEntityTooLargeException +RequestedInstanceCount +RequestedJobStatus +RequestedProvisionedConcurrentExecutions +RequestedQuota +RequestedQuotas +RequestedRangeNotSatisfiableException +RequestedServiceQuotaChange +RequestedTime +RequestedTimestamp +RequestedValue +Requester +RequesterAccountId +RequesterAnnotation +RequesterAwsRegion +RequesterCharged +RequesterFeedback +RequesterId +RequesterManaged +RequesterPays +RequesterPaysEnabled +RequesterPeeringConnectionOptions +RequesterTgwInfo +RequesterVpcInfo +Requests +RequestsPerSecond +RequireAlternateSignatureAlgorithm +RequireAuthorizationForCacheControl +RequireCheckIn +RequireCommonName +RequireDirectoryPath +RequireDnsAsCn +RequireEachIncludedType +RequireEmail +RequireEncryption +RequireHibernateSupport +RequireLowercase +RequireLowercaseCharacters +RequireNumbers +RequirePin +RequireSameKeyRenewal +RequireSymbols +RequireTLS +RequireType +RequireUppercase +RequireUppercaseCharacters +Required +RequiredActivatedType +RequiredActivatedTypes +RequiredBehavior +RequiredCapabilities +RequiredEquipmentTypes +RequiredField +RequiredFieldInfo +RequiredFields +RequiredMinimumPollIntervalInSeconds +RequiredParameters +RequiredSignUpAttributes +RequiredTenancy +RequiredToPreview +Requirement +RequirementsS3ObjectVersion +RequirementsS3Path +RequirementsToTarget +Requires +RequiresAutoMinorEngineVersionUpgrade +RequiresCompatibilities +RequiresIndexDocuments +RequiresRecreation +ResamplingConfigInput +RescoreCapacityUnits +RescoreExecutionPlanId +RescoreExecutionPlanSummary +RescoreId +RescoreRequest +RescoreResult +RescoreResultItem +Reseller +ResendConfirmationCodeRequest +ResendConfirmationCodeResponse +ResendContactReachabilityEmailRequest +ResendContactReachabilityEmailResponse +ResendOperationAuthorizationRequest +ResendValidationEmailRequest +Reservation +ReservationARN +ReservationAggregates +ReservationArn +ReservationCoverageGroup +ReservationCoveredHoursInLookbackPeriod +ReservationFleetInstanceSpecification +ReservationId +ReservationName +ReservationPlan +ReservationPlanSettings +ReservationPurchaseRecommendation +ReservationPurchaseRecommendationDetail +ReservationPurchaseRecommendationMetadata +ReservationPurchaseRecommendationSummary +ReservationResourceSpecification +ReservationState +ReservationType +ReservationUtilizationGroup +ReservationValue +Reservations +ReserveContactRequest +ReserveRange +Reserved +ReservedBitrate +ReservedCacheNode +ReservedCacheNodeAlreadyExistsFault +ReservedCacheNodeId +ReservedCacheNodeMessage +ReservedCacheNodeNotFoundFault +ReservedCacheNodeQuotaExceededFault +ReservedCacheNodes +ReservedCacheNodesOffering +ReservedCacheNodesOfferingId +ReservedCacheNodesOfferingMessage +ReservedCacheNodesOfferingNotFoundFault +ReservedCacheNodesOfferings +ReservedConcurrentExecutions +ReservedDBInstance +ReservedDBInstanceAlreadyExistsFault +ReservedDBInstanceArn +ReservedDBInstanceId +ReservedDBInstanceMessage +ReservedDBInstanceNotFoundFault +ReservedDBInstanceQuotaExceededFault +ReservedDBInstances +ReservedDBInstancesOffering +ReservedDBInstancesOfferingId +ReservedDBInstancesOfferingMessage +ReservedDBInstancesOfferingNotFoundFault +ReservedDBInstancesOfferings +ReservedElasticsearchInstance +ReservedElasticsearchInstanceId +ReservedElasticsearchInstanceOffering +ReservedElasticsearchInstanceOfferingId +ReservedElasticsearchInstanceOfferings +ReservedElasticsearchInstances +ReservedHours +ReservedInstance +ReservedInstanceId +ReservedInstanceIds +ReservedInstanceLimitPrice +ReservedInstanceOffering +ReservedInstanceOfferingId +ReservedInstanceOfferings +ReservedInstanceOptions +ReservedInstanceReservationValue +ReservedInstanceValueRollup +ReservedInstanceValueSet +ReservedInstances +ReservedInstancesConfiguration +ReservedInstancesId +ReservedInstancesIds +ReservedInstancesListing +ReservedInstancesListingId +ReservedInstancesListings +ReservedInstancesModification +ReservedInstancesModificationId +ReservedInstancesModificationIds +ReservedInstancesModificationResult +ReservedInstancesModifications +ReservedInstancesOffering +ReservedInstancesOfferingId +ReservedInstancesOfferingIds +ReservedInstancesOfferings +ReservedNameException +ReservedNode +ReservedNodeAlreadyExistsFault +ReservedNodeAlreadyMigratedFault +ReservedNodeConfigurationOption +ReservedNodeConfigurationOptionList +ReservedNodeExchangeNotFoundFault +ReservedNodeExchangeRequestId +ReservedNodeExchangeStatus +ReservedNodeExchangeStatusDetails +ReservedNodeId +ReservedNodeNotFoundFault +ReservedNodeOffering +ReservedNodeOfferingId +ReservedNodeOfferingNotFoundFault +ReservedNodeOfferingType +ReservedNodeOfferings +ReservedNodeOfferingsMessage +ReservedNodeQuotaExceededFault +ReservedNodes +ReservedNodesMessage +ReservedNodesOffering +ReservedNodesOfferingId +ReservedNodesOfferingNotFoundFault +ReservedNodesOfferings +ReservedNormalizedUnits +ReservedSlots +ReservedStreamCapacity +ReservoirQuota +ReservoirQuotaTTL +ReservoirSize +ResetActionConfiguration +ResetAddressAttributeRequest +ResetAddressAttributeResult +ResetAlarmActionRequest +ResetAllParameters +ResetAuthorizersCacheRequest +ResetCacheInput +ResetCacheOutput +ResetCacheParameterGroupMessage +ResetClusterParameterGroupMessage +ResetConnectorMetadataCacheRequest +ResetDBClusterParameterGroupMessage +ResetDBParameterGroupMessage +ResetDeploymentsRequest +ResetDeploymentsResponse +ResetDisabled +ResetDistributionCacheRequest +ResetDistributionCacheResult +ResetEbsDefaultKmsKeyIdRequest +ResetEbsDefaultKmsKeyIdResult +ResetElements +ResetEncryptionKeyRequest +ResetFpgaImageAttributeRequest +ResetFpgaImageAttributeResult +ResetImageAttributeRequest +ResetInstanceAttributeRequest +ResetJobBookmarkRequest +ResetJobBookmarkResponse +ResetNetworkInterfaceAttributeRequest +ResetNotificationSettingsRequest +ResetNotificationSettingsResponse +ResetOrderNumber +ResetParameterGroupRequest +ResetParameterGroupResponse +ResetPasswordRequest +ResetPersonalPINRequest +ResetPersonalPINResponse +ResetPolicy +ResetResourceLogLevelRequest +ResetServiceSettingRequest +ResetServiceSettingResult +ResetServiceSpecificCredentialRequest +ResetServiceSpecificCredentialResponse +ResetSnapshotAttributeRequest +ResetTimerAction +ResetUserPasswordRequest +ResetUserPasswordResponse +Resharding +ReshardingConfiguration +ReshardingStatus +Resilience +ResiliencyPolicy +ResiliencyScore +ResizeCluster +ResizeClusterMessage +ResizeClusterResult +ResizeInfo +ResizeNotFoundFault +ResizeOption +ResizeProgressMessage +ResizeSpecifications +ResizeType +Resolution +ResolutionContact +ResolutionMethod +ResolutionStrategy +ResolutionTechniques +ResolutionTime +ResolveAlias +ResolveAliasInput +ResolveAliasOutput +ResolveAppVersionResourcesRequest +ResolveAppVersionResourcesResponse +ResolveCaseRequest +ResolveCaseResponse +ResolveComponentCandidatesRequest +ResolveComponentCandidatesResponse +ResolveCustomerRequest +ResolveCustomerResult +ResolveRoomRequest +ResolveRoomResponse +Resolved +ResolvedArtifact +ResolvedAttributes +ResolvedCIDRCount +ResolvedComponentVersion +ResolvedImage +ResolvedImageUri +ResolvedOutputS3Uri +ResolvedTargets +ResolvedValue +Resolver +ResolverConfig +ResolverConfigs +ResolverDNSSECConfig +ResolverDnssecConfig +ResolverDnssecConfigs +ResolverEndpoint +ResolverEndpointId +ResolverEndpointType +ResolverEndpoints +ResolverIP +ResolverQueryLogConfig +ResolverQueryLogConfigAssociation +ResolverQueryLogConfigAssociationId +ResolverQueryLogConfigAssociations +ResolverQueryLogConfigId +ResolverQueryLogConfigPolicy +ResolverQueryLogConfigs +ResolverRule +ResolverRuleAssociation +ResolverRuleAssociationId +ResolverRuleAssociations +ResolverRuleConfig +ResolverRuleId +ResolverRulePolicy +ResolverRules +Resource +ResourceARN +ResourceARNDetail +ResourceARNList +ResourceARNNotValidException +ResourceARNUpdate +ResourceARNs +ResourceAccessPolicies +ResourceAccessPolicy +ResourceAccessRoleArn +ResourceAction +ResourceAlreadyCheckedOutException +ResourceAlreadyExistException +ResourceAlreadyExistsException +ResourceAlreadyExistsFault +ResourceArn +ResourceArnList +ResourceArnNotFoundException +ResourceArnRequiredException +ResourceArns +ResourceAssociatedException +ResourceAttribute +ResourceAttributeList +ResourceAwsEc2InstanceIamInstanceProfileArn +ResourceAwsEc2InstanceImageId +ResourceAwsEc2InstanceIpV4Addresses +ResourceAwsEc2InstanceIpV6Addresses +ResourceAwsEc2InstanceKeyName +ResourceAwsEc2InstanceLaunchedAt +ResourceAwsEc2InstanceSubnetId +ResourceAwsEc2InstanceType +ResourceAwsEc2InstanceVpcId +ResourceAwsIamAccessKeyCreatedAt +ResourceAwsIamAccessKeyPrincipalName +ResourceAwsIamAccessKeyStatus +ResourceAwsIamAccessKeyUserName +ResourceAwsIamUserUserName +ResourceAwsS3BucketOwnerId +ResourceAwsS3BucketOwnerName +ResourceBudgetEstimate +ResourceCatalog +ResourceCatalogArn +ResourceCatalogName +ResourceCatalogs +ResourceChange +ResourceChangeDetail +ResourceChanges +ResourceCidr +ResourceCollection +ResourceCollectionFilter +ResourceCollectionType +ResourceComplianceStatus +ResourceComplianceSummaryItem +ResourceComplianceSummaryItems +ResourceConcurrentModificationException +ResourceConfig +ResourceConfigForUpdate +ResourceConfiguration +ResourceConfigurationSchemaType +ResourceConflict +ResourceConflictException +ResourceContainerImageId +ResourceContainerImageName +ResourceContainerLaunchedAt +ResourceContainerName +ResourceContentionFault +ResourceCount +ResourceCountByStatus +ResourceCountFilters +ResourceCountsSummary +ResourceCreationFailedException +ResourceCreationLimitPolicy +ResourceDataContainer +ResourceDataSyncAlreadyExistsException +ResourceDataSyncAwsOrganizationsSource +ResourceDataSyncConflictException +ResourceDataSyncCountExceededException +ResourceDataSyncDestinationDataSharing +ResourceDataSyncInvalidConfigurationException +ResourceDataSyncItem +ResourceDataSyncItems +ResourceDataSyncNotFoundException +ResourceDataSyncOrganizationalUnit +ResourceDataSyncS3Destination +ResourceDataSyncSource +ResourceDataSyncSourceWithState +ResourceDefinitionId +ResourceDefinitionVersion +ResourceDefinitionVersionArn +ResourceDefinitionVersionId +ResourceDependencyException +ResourceDescription +ResourceDescriptions +ResourceDetail +ResourceDetails +ResourceDetailsOther +ResourceDiscoveryAssociationCount +ResourceDiscoveryStatus +ResourceDoesNotSupportTagging +ResourceDownloadOwnerSetting +ResourceEndpoint +ResourceEndpointList +ResourceEndpointListItem +ResourceError +ResourceErrorsDetails +ResourceEvaluation +ResourceEvaluationFilters +ResourceEvaluationId +ResourceEvaluations +ResourceExistsException +ResourceFilter +ResourceFilterCriteria +ResourceFilters +ResourceGroup +ResourceGroupName +ResourceGroupTag +ResourceHandlingOption +ResourceHours +ResourceId +ResourceIdList +ResourceIdOverrideConfiguration +ResourceIdPreference +ResourceIdScope +ResourceIdType +ResourceIdentifier +ResourceIdentifierSummaries +ResourceIdentifierSummary +ResourceIdentifiers +ResourceIds +ResourceInUse +ResourceInUseException +ResourceInUseFault +ResourceInfo +ResourceInfoList +ResourceIntegrations +ResourceInventory +ResourceInventoryList +ResourceKey +ResourceKeys +ResourceLabel +ResourceLifecycleConfig +ResourceLimit +ResourceLimitExceeded +ResourceLimitExceededException +ResourceLimits +ResourceList +ResourceLocation +ResourceLocations +ResourceLockedException +ResourceMapFilter +ResourceMapping +ResourceMetadata +ResourceMetrics +ResourceModel +ResourceName +ResourceNotAvailableException +ResourceNotDiscoveredException +ResourceNotFound +ResourceNotFoundException +ResourceNotFoundFault +ResourceNotReadyException +ResourceNotSupportedException +ResourceNumberLimitExceededException +ResourceOverlapStatus +ResourceOwner +ResourceOwnerCheckException +ResourceOwnerId +ResourceOwningAccountId +ResourcePartition +ResourcePath +ResourcePathComponent +ResourcePendingMaintenanceActions +ResourcePermission +ResourcePolicies +ResourcePolicy +ResourcePolicyConflictException +ResourcePolicyInvalidParameterException +ResourcePolicyLimitExceededException +ResourcePolicyNotFoundException +ResourcePolicyNotValidException +ResourcePolicySummary +ResourcePreconditionNotMetException +ResourceProfileArtifact +ResourcePropagationDelayException +ResourceProperties +ResourceProperty +ResourceProvisionedThroughputExceededException +ResourceQuery +ResourceQuota +ResourceQuotaExceededException +ResourceQuotaExceededFault +ResourceQuotas +ResourceReceivingAccess +ResourceRecord +ResourceRecordSet +ResourceRecordSetCount +ResourceRecordSets +ResourceRecords +ResourceReference +ResourceRegion +ResourceRegistrationFailureException +ResourceRequestStatusFilter +ResourceRequestStatusSummaries +ResourceRequirement +ResourceRequirements +ResourceResult +ResourceRetainedBillableTimeInSeconds +ResourceRole +ResourceScanMetadata +ResourceServer +ResourceServerScopeType +ResourceServerType +ResourceServers +ResourceSet +ResourceSetArn +ResourceSetIdentifier +ResourceSetIds +ResourceSetName +ResourceSetOutput +ResourceSetStatus +ResourceSetSummary +ResourceSetType +ResourceSets +ResourceShare +ResourceShareAssociation +ResourceShareInvitation +ResourceShareInvitationAlreadyAcceptedException +ResourceShareInvitationAlreadyRejectedException +ResourceShareInvitationArnNotFoundException +ResourceShareInvitationExpiredException +ResourceShareLimitExceededException +ResourceSharePermissionDetail +ResourceSharePermissionSummary +ResourceShareType +ResourceSpec +ResourceSpecificResult +ResourceSpecificResults +ResourceSpecification +ResourceState +ResourceStatement +ResourceStatementRequest +ResourceStatistics +ResourceStatus +ResourceStatusReason +ResourceStringFilter +ResourceSummary +ResourceSyncAttempt +ResourceSyncEvent +ResourceTag +ResourceTagKey +ResourceTagKeys +ResourceTagList +ResourceTagMapping +ResourceTagMappingList +ResourceTagSet +ResourceTagSets +ResourceTagValue +ResourceTags +ResourceTagsDescriptionMessage +ResourceTagsSearchCriteria +ResourceTargetDefinition +ResourceTargetDetails +ResourceToImport +ResourceType +ResourceTypeFilters +ResourceTypeList +ResourceTypeManagementPreference +ResourceTypeNotFound +ResourceTypeNotSupportedException +ResourceTypeOptInPreference +ResourceTypes +ResourceTypesScope +ResourceUnavailableException +ResourceUri +ResourceUris +ResourceUtilization +ResourceValidationException +ResourceValue +ResourceViolation +ResourceViolations +Resources +ResourcesAffected +ResourcesPerPage +ResourcesSupported +ResourcesToAdd +ResourcesToImport +ResourcesToRemove +ResourcesToSkip +ResourcesVpcConfig +RespondActivityTaskCanceledInput +RespondActivityTaskCompletedInput +RespondActivityTaskFailedInput +RespondDecisionTaskCompletedInput +RespondToAfd +RespondToAuthChallengeRequest +RespondToAuthChallengeResponse +RespondsTo +Response +ResponseAction +ResponseCacheControl +ResponseCard +ResponseCode +ResponseCodeSent +ResponseContentDisposition +ResponseContentEncoding +ResponseContentLanguage +ResponseContentType +ResponseDetails +ResponseError +ResponseExpires +ResponseFinishDateTime +ResponseHeaders +ResponseHeadersPolicy +ResponseHeadersPolicyAccessControlAllowHeaders +ResponseHeadersPolicyAccessControlAllowMethods +ResponseHeadersPolicyAccessControlAllowOrigins +ResponseHeadersPolicyAccessControlExposeHeaders +ResponseHeadersPolicyAlreadyExists +ResponseHeadersPolicyConfig +ResponseHeadersPolicyContentSecurityPolicy +ResponseHeadersPolicyContentTypeOptions +ResponseHeadersPolicyCorsConfig +ResponseHeadersPolicyCustomHeader +ResponseHeadersPolicyCustomHeadersConfig +ResponseHeadersPolicyFrameOptions +ResponseHeadersPolicyId +ResponseHeadersPolicyInUse +ResponseHeadersPolicyList +ResponseHeadersPolicyReferrerPolicy +ResponseHeadersPolicyRemoveHeader +ResponseHeadersPolicyRemoveHeadersConfig +ResponseHeadersPolicySecurityHeadersConfig +ResponseHeadersPolicyServerTimingHeadersConfig +ResponseHeadersPolicyStrictTransportSecurity +ResponseHeadersPolicySummary +ResponseHeadersPolicyXSSProtection +ResponseInspection +ResponseInspectionBodyContains +ResponseInspectionHeader +ResponseInspectionJson +ResponseInspectionStatusCode +ResponseItem +ResponseLaunchTemplateData +ResponseMessage +ResponseModels +ResponseOutputItem +ResponsePagePath +ResponseParameters +ResponsePartitionKey +ResponsePlanSummary +ResponseResourceMetric +ResponseResourceMetricKey +ResponseSignalPreroll +ResponseSpecification +ResponseStartDateTime +ResponseStreamContentType +ResponseTemplates +ResponseTime +ResponseTimeHistogram +ResponseTimeRootCause +ResponseTimeRootCauseEntity +ResponseTimeRootCauseService +ResponseTimeRootCauses +Responses +RestApi +RestApis +RestartAppServerMessage +RestartDelay +RestartSimulationJobRequest +RestartWorkspace +RestorableByUserIds +RestorableNodeTypes +RestorableUntil +RestorationPrice +Restore +RestoreAddressToClassicRequest +RestoreAddressToClassicResult +RestoreAnalysisRequest +RestoreAnalysisResponse +RestoreBackupRequest +RestoreBackupResponse +RestoreCertificateAuthorityRequest +RestoreClusterFromSnapshotInput +RestoreClusterFromSnapshotOutput +RestoreCoreNetworkPolicyVersionRequest +RestoreCoreNetworkPolicyVersionResponse +RestoreDBClusterFromS3Message +RestoreDBClusterFromS3Result +RestoreDBClusterFromSnapshotMessage +RestoreDBClusterFromSnapshotResult +RestoreDBClusterToPointInTimeMessage +RestoreDBClusterToPointInTimeResult +RestoreDBInstanceFromDBSnapshotMessage +RestoreDBInstanceFromDBSnapshotResult +RestoreDBInstanceFromS3Message +RestoreDBInstanceFromS3Result +RestoreDBInstanceToPointInTimeMessage +RestoreDBInstanceToPointInTimeResult +RestoreDateTime +RestoreDocumentVersionsRequest +RestoreDomainAccessRequest +RestoreDuration +RestoreEventDataStoreRequest +RestoreEventDataStoreResponse +RestoreExpiryDate +RestoreExpiryTime +RestoreFromClusterSnapshotMessage +RestoreFromClusterSnapshotResult +RestoreFromRecoveryPointRequest +RestoreFromRecoveryPointResponse +RestoreFromSnapshotRequest +RestoreFromSnapshotResponse +RestoreImageFromRecycleBinRequest +RestoreImageFromRecycleBinResult +RestoreInProgress +RestoreJobId +RestoreJobs +RestoreJobsListMember +RestoreKeyInput +RestoreKeyOutput +RestoreManagedPrefixListVersionRequest +RestoreManagedPrefixListVersionResult +RestoreMetadata +RestoreObjectOutput +RestoreObjectRequest +RestoreOutputPath +RestorePhoneNumberRequest +RestorePhoneNumberResponse +RestoreRequest +RestoreSecretRequest +RestoreSecretResponse +RestoreServerRequest +RestoreServerResponse +RestoreSnapshotFromRecycleBinRequest +RestoreSnapshotFromRecycleBinResult +RestoreSnapshotTierRequest +RestoreSnapshotTierResult +RestoreSnapshots +RestoreStartTime +RestoreStatus +RestoreSummary +RestoreTableFromBackupInput +RestoreTableFromBackupOutput +RestoreTableFromClusterSnapshotMessage +RestoreTableFromClusterSnapshotResult +RestoreTableFromSnapshotRequest +RestoreTableFromSnapshotResponse +RestoreTableRequest +RestoreTableResponse +RestoreTableToPointInTimeInput +RestoreTableToPointInTimeOutput +RestoreTime +RestoreToSnapshot +RestoreToTime +RestoreType +RestoreVolumeFromSnapshotRequest +RestoreVolumeFromSnapshotResponse +RestoreWindow +RestoreWorkspaceRequest +RestrictPublicBuckets +RestrictedPackageName +RestrictedSourceFileException +RestrictionType +Restrictions +Result +ResultAttribute +ResultAttributes +ResultBBox +ResultByTime +ResultCode +ResultConfiguration +ResultConfigurationUpdates +ResultData +ResultEncryptionMode +ResultErrorEntry +ResultField +ResultFrame +ResultId +ResultIds +ResultItems +ResultKmsKeyArn +ResultList +ResultLocationBucket +ResultLocationFolder +ResultRecordedTime +ResultReuseByAgeConfiguration +ResultReuseConfiguration +ResultReuseInformation +ResultRow +ResultRowValue +ResultRows +ResultS3Uri +ResultSet +ResultSetMetadata +ResultSetOptions +ResultSize +ResultStream +ResultToken +ResultType +ResultValues +Results +ResultsByTime +ResultsCount +ResultsNotFound +ResultsPublishingEnabled +ResultsS3Prefix +ResumableUntil +ResumeActions +ResumeBatchLoadTaskRequest +ResumeCampaignRequest +ResumeCluster +ResumeClusterMessage +ResumeClusterResult +ResumeContactRecordingRequest +ResumeFullAutomationModeMinutes +ResumeFullAutomationModeTime +ResumeGameServerGroupInput +ResumeGameServerGroupOutput +ResumeReplicationRequest +ResumeResourceRequest +ResumeServiceRequest +ResumeServiceResponse +ResumeSessionRequest +ResumeSessionResponse +ResumeWorkflowRunRequest +ResumeWorkflowRunResponse +ResyncMFADeviceRequest +RetainAllVariantProperties +RetainDeploymentConfig +RetainExceptOnCreate +RetainPhysicalResources +RetainPrimaryCluster +RetainPrimaryReplicationGroup +RetainRecordInDays +RetainRecordUntil +RetainResources +RetainRule +RetainStacks +RetainStacksOnAccountRemoval +RetainUntilDate +RetainedMessageSummary +Retention +RetentionArchiveTier +RetentionConfiguration +RetentionConfigurationName +RetentionConfigurationNames +RetentionConfigurations +RetentionDays +RetentionLockTimeInDays +RetentionLockType +RetentionPeriod +RetentionPeriodHours +RetentionPeriodInDays +RetentionPeriodUnit +RetentionPeriodValue +RetentionPolicy +RetentionProperties +RetentionSettings +RetentionStartDate +RetireGrantRequest +RetiringPrincipal +RetrainingAvailableDataInDays +RetrainingFrequency +RetrainingSchedulerStatus +RetrainingSchedulerSummaries +RetrainingSchedulerSummary +RetrainingStartDate +Retries +Retrieval +RetrievalByteRange +RetrievalRoleArn +RetrieveAZs +RetrieveActions +RetrieveDomainAuthCodeRequest +RetrieveDomainAuthCodeResponse +RetrieveEnvironmentInfoMessage +RetrieveEnvironmentInfoResultMessage +RetrieveFilePaths +RetrieveRequest +RetrieveResult +RetrieveResultItem +RetrieveResults +RetrieveTapeArchiveInput +RetrieveTapeArchiveOutput +RetrieveTapeRecoveryPointInput +RetrieveTapeRecoveryPointOutput +RetrievedTo +RetryAfter +RetryAfterSeconds +RetryAttemptSeconds +RetryAttempts +RetryBuildBatchInput +RetryBuildBatchOutput +RetryBuildInput +RetryBuildOutput +RetryCount +RetryCriteria +RetryDataReplicationRequest +RetryDelayInSeconds +RetryInterval +RetryIntervalInMinutes +RetryIntervalMs +RetryOptions +RetryPipelineExecutionRequest +RetryPipelineExecutionResponse +RetryPolicy +RetryPolicyConfiguration +RetryPolicyExecution +RetryStageExecutionInput +RetryStageExecutionOutput +RetryStrategy +RetryWorkflowStepRequest +RetryWorkflowStepResponse +Retryable +RetryableConflictException +RetryableError +RetryableException +Return +ReturnCode +ReturnConnectionPasswordEncrypted +ReturnConsumedCapacity +ReturnData +ReturnEnabled +ReturnInformation +ReturnItemCollectionMetrics +ReturnPath +ReturnPathArn +ReturnPathComponents +ReturnShippingLabelAlreadyExistsException +ReturnShippingLabelURI +ReturnSize +ReturnSubscriptionArn +ReturnValue +ReturnValues +ReturnValuesOnConditionCheckFailure +ReusableDelegationSetLimit +ReuseOnScaleIn +ReusedByJob +ReusedPreviousResult +RevealConfiguration +ReverseGeocodingConfig +ReverseOrder +ReverseReplicationRequest +ReverseReplicationResponse +Revert +ReviewActionDetail +ReviewActions +ReviewDetails +ReviewInformation +ReviewOwner +ReviewPolicy +ReviewReport +ReviewRestrictionDate +ReviewResultDetail +ReviewResults +ReviewStatus +ReviewedTime +Reviewer +ReviewerResponse +Reviews +Revision +RevisionDestination +RevisionDestinationEntry +RevisionDestinations +RevisionDoesNotExistException +RevisionEntry +RevisionId +RevisionIdRequiredException +RevisionInfo +RevisionLocation +RevisionNotCurrentException +RevisionPublished +RevisionRequiredException +RevisionTarget +RevisionTargets +Revisions +RevocationComment +RevocationConfiguration +RevocationReason +RevokeAllGroups +RevokeCacheSecurityGroupIngressMessage +RevokeCacheSecurityGroupIngressResult +RevokeCertificateRequest +RevokeClientVpnIngressRequest +RevokeClientVpnIngressResult +RevokeClusterSecurityGroupIngressMessage +RevokeClusterSecurityGroupIngressResult +RevokeDBSecurityGroupIngressMessage +RevokeDBSecurityGroupIngressResult +RevokeDomainAccessRequest +RevokeEndpointAccessMessage +RevokeFlowEntitlementRequest +RevokeFlowEntitlementResponse +RevokeGrantRequest +RevokeInvitationRequest +RevokeIpRulesRequest +RevokeLinkPermissions +RevokePermissions +RevokePermissionsRequest +RevokeRevisionRequest +RevokeRevisionResponse +RevokeSecurityGroupEgressRequest +RevokeSecurityGroupEgressResult +RevokeSecurityGroupIngressRequest +RevokeSecurityGroupIngressResult +RevokeSignatureRequest +RevokeSigningProfileRequest +RevokeSnapshotAccessMessage +RevokeSnapshotAccessResult +RevokeTokenRequest +RevokeVpcEndpointAccessRequest +Revoked +RevokedAt +Reward +RfRegion +Rfc4180 +Rfc822Name +RichText +Right +RightJoinKeyProperties +RightOperand +RightsizingRecommendation +RightsizingRecommendationConfiguration +RightsizingRecommendationMetadata +RightsizingRecommendationSummary +RightsizingRecommendations +RightsizingType +Risk +RiskConfiguration +RiskConfigurationType +RiskCounts +RiskDecision +RiskDetails +RiskExceptionConfiguration +RiskExceptionConfigurationType +RiskLevel +RiskRating +RiskScore +RiskThreshold +Robot +RobotApplicationConfig +RobotApplicationSummary +RobotDeployment +RobotSoftwareSuite +Role +RoleARN +RoleARNUpdate +RoleAliasDescription +RoleArn +RoleArns +RoleBase +RoleCredentials +RoleDetail +RoleDetailList +RoleId +RoleInfo +RoleLastUsed +RoleLevel +RoleMapping +RoleMappings +RoleName +RolePolicyList +RoleRequiredException +RoleSearchMatching +RoleSearchSubtree +RoleSessionName +RoleStatus +RoleUsageList +RoleUsageType +RoleValues +Roles +RolesKey +Roll +Rollback +RollbackApplicationRequest +RollbackApplicationResponse +RollbackConfiguration +RollbackDetails +RollbackErrorMessage +RollbackErrors +RollbackFailureReason +RollbackInfo +RollbackInstanceRefreshAnswer +RollbackInstanceRefreshType +RollbackMaximumBatchSize +RollbackOnDisable +RollbackReason +RollbackStackInput +RollbackStackOutput +RollbackStartTime +RollbackTransactionRequest +RollbackTransactionResponse +RollbackTrigger +RollbackTriggers +RollingDate +RollingDateConfiguration +RollingUpdatePolicy +RolloverInterval +Room +RoomArn +RoomData +RoomFilters +RoomId +RoomMembership +RoomMemberships +RoomName +RoomRetentionSettings +RoomSkillParameter +RoomSkillParameters +RoomSummary +RoomUtilizationMetricsEnabled +Rooms +Root +RootAccess +RootCause +RootCauseException +RootCauseServiceId +RootCauseServiceRequestImpactStatistics +RootCauses +RootCertificatePublicKey +RootChangeSetId +RootDeviceName +RootDeviceType +RootDeviceVolumeId +RootDirectory +RootFolderId +RootId +RootNotFoundException +RootSquash +RootSquashConfiguration +RootStorage +RootVolumeConfiguration +RootVolumeEncryptionEnabled +RootVolumeId +RootVolumeSecurityStyle +RootVolumeSizeGib +Roots +Rotate +RotateChannelCredentialsRequest +RotateChannelCredentialsResponse +RotateEncryptionKeyMessage +RotateEncryptionKeyResult +RotateImmediately +RotateIngestEndpointCredentialsRequest +RotateIngestEndpointCredentialsResponse +RotateMasterUserPassword +RotateSecretRequest +RotateSecretResponse +RotateTunnelAccessTokenRequest +RotateTunnelAccessTokenResponse +Rotation +RotationAngle +RotationArn +RotationEnabled +RotationId +RotationIds +RotationLambdaARN +RotationLambdaArn +RotationNamePrefix +RotationOccurredWithinFrequency +RotationOverride +RotationOverrideId +RotationOverrides +RotationRules +RotationRulesType +RotationShift +RotationShifts +RotationStartTime +Rotations +RoundTripTime +Route +RouteAnalysis +RouteAnalysisCompletion +RouteAnalysisEndpointOptions +RouteAnalysisEndpointOptionsSpecification +RouteAnalysisId +RouteAnalysisPath +RouteBBox +RouteCount +RouteData +RouteFilterPrefix +RouteHasOutOfScopeEndpointViolation +RouteId +RouteIdentifier +RouteKey +RouteMatrix +RouteMatrixEntry +RouteMatrixEntryError +RouteOrigin +RouteRef +RouteResponse +RouteResponseId +RouteResponseKey +RouteResponseSelectionExpression +RouteSelectionExpression +RouteSet +RouteSetDetails +RouteSettings +RouteSpec +RouteStatus +RouteSummary +RouteSummaryList +RouteTable +RouteTableArn +RouteTableAssociation +RouteTableAssociationId +RouteTableAssociationState +RouteTableId +RouteTableIdentifier +RouteTableIds +RouteTableRoute +RouteTableTimestamp +RouteTableType +RouteTables +RouteType +RouteUpdates +RoutedResource +RouterType +Routes +RoutingConfig +RoutingConfigurationListItem +RoutingControl +RoutingControlArn +RoutingControlCount +RoutingControlName +RoutingControlState +RoutingControls +RoutingPolicy +RoutingProfile +RoutingProfileArn +RoutingProfileId +RoutingProfileQueueConfig +RoutingProfileQueueConfigSummary +RoutingProfileQueueConfigSummaryList +RoutingProfileQueueReference +RoutingProfileReference +RoutingProfileSearchCriteria +RoutingProfileSearchFilter +RoutingProfileSummary +RoutingProfileSummaryList +RoutingProfiles +RoutingRule +RoutingRules +RoutingStrategy +RoutingStrategyType +Row +RowAlternateColorOptions +RowAlternateColors +RowColumnInfo +RowFieldNamesStyle +RowFilter +RowFilterExpression +RowGroupLength +RowHeaderStyle +RowIndex +RowIndexStride +RowInfo +RowLabelOptions +RowLength +RowLevelPermissionDataSet +RowLevelPermissionTagConfiguration +RowLevelPermissionTagConfigurationApplied +RowLevelPermissionTagKeys +RowLevelPermissionTagRule +RowLevelPermissionTags +RowRange +RowSort +RowSpan +RowSubtotalOptions +RowTag +RowTotalOptions +RowValue +Rows +RowsDropped +RowsIngested +RowsLabelOptions +RowsLayout +RpcProtection +RsaPublicKey +RsaPublicKeyFingerprint +Rscp +Rsrp +Rsrq +Rss +Rssi +RtmpCaptionInfoDestinationSettings +RtmpGroupSettings +RtmpOutputSettings +Rule +RuleARN +RuleAction +RuleActionOverride +RuleActionOverrides +RuleArn +RuleArns +RuleBasedMatching +RuleBasedMatchingRequest +RuleBasedMatchingResponse +RuleBasedProperties +RuleCondition +RuleConfig +RuleConfigurationName +RuleCount +RuleDefinition +RuleDescription +RuleDetail +RuleDoesNotExistException +RuleEvaluation +RuleEvaluationJobArn +RuleEvaluationStatus +RuleEvaluatorImage +RuleGroup +RuleGroupArn +RuleGroupDetails +RuleGroupId +RuleGroupMetadata +RuleGroupName +RuleGroupReferenceStatement +RuleGroupResponse +RuleGroupRuleName +RuleGroupRuleOptionsPair +RuleGroupRuleOptionsPairs +RuleGroupSource +RuleGroupSourceCustomActionsDetails +RuleGroupSourceListDetails +RuleGroupSourceStatefulRulesDetails +RuleGroupSourceStatefulRulesHeaderDetails +RuleGroupSourceStatefulRulesOptionsDetails +RuleGroupSourceStatelessRuleDefinition +RuleGroupSourceStatelessRuleMatchAttributes +RuleGroupSourceStatelessRuleMatchAttributesDestinationPorts +RuleGroupSourceStatelessRuleMatchAttributesDestinations +RuleGroupSourceStatelessRuleMatchAttributesSourcePorts +RuleGroupSourceStatelessRuleMatchAttributesSources +RuleGroupSourceStatelessRuleMatchAttributesTcpFlags +RuleGroupSourceStatelessRulesAndCustomActionsDetails +RuleGroupSourceStatelessRulesDetails +RuleGroupStatus +RuleGroupSummary +RuleGroupType +RuleGroupTypePair +RuleGroupTypePairs +RuleGroupUpdate +RuleGroupVariables +RuleGroupVariablesIpSetsDetails +RuleGroupVariablesPortSetsDetails +RuleGroups +RuleGroupsNamespaceDescription +RuleGroupsNamespaceStatus +RuleGroupsNamespaceSummary +RuleId +RuleIdentifier +RuleLabels +RuleLevel +RuleLimitExceededException +RuleMetadata +RuleMetricName +RuleName +RuleNameWithinRuleGroup +RuleNames +RuleNotFoundException +RuleNumber +RuleOption +RuleOptions +RuleOrder +RuleParameters +RulePriorities +RulePriorityPair +RuleResult +RuleResults +RuleSet +RuleSetArn +RuleSetBody +RuleSetDoesNotExistException +RuleSetName +RuleSets +RuleState +RuleStatus +RuleSummary +RuleSummaryList +RuleTags +RuleTriggerEventSource +RuleType +RuleUpdate +RuleUpdateFailure +RuleUpdateSuccess +RuleVariables +RuleVersion +RuleWithinRuleGroup +Rules +RulesConfiguration +RulesConfigurationType +RulesList +RulesPackage +RulesSource +RulesSourceList +RulesString +Ruleset +RulesetArn +RulesetEvaluationRunId +RulesetItem +RulesetName +RulesetNames +Rulesets +RumEvent +RumEvents +Run +RunAs +RunBackTestMode +RunCommand +RunCommandParameters +RunCommandTarget +RunCommandTargets +RunConfig +RunConfiguration +RunConfigurationDescription +RunConfigurationUpdate +RunFleetAdvisorLsaAnalysisResponse +RunGroupListItem +RunId +RunInstancesMonitoringEnabled +RunInstancesRequest +RunJobFlowInput +RunJobFlowOutput +RunListItem +RunName +RunPipelineActivityRequest +RunPipelineActivityResponse +RunProperties +RunScheduledInstancesRequest +RunScheduledInstancesResult +RunStatementRequest +RunStatementResponse +RunStatus +RunTaskRequest +RunTaskResponse +Runbook +Runbooks +RuncBinaryPath +Running +RunningActions +RunningAmiVersion +RunningBridgeCount +RunningInstanceCount +RunningMode +RunningModeAutoStopTimeoutInMinutes +RunningSetup +RunningTasksCount +Runs +Runtime +RuntimeConfiguration +RuntimeContext +RuntimeContextName +RuntimeContextStates +RuntimeDetails +RuntimeEnvironment +RuntimeEnvironmentSecrets +RuntimeEnvironmentVariables +RuntimeHintDetails +RuntimeHintValue +RuntimeHints +RuntimeInSeconds +RuntimePlatform +RuntimeRoleArn +RuntimeVersion +RuntimeVersionArn +RuntimeVersionConfig +RuntimeVersionError +RuntimeVersions +RxDataRate2 +RxDelay1 +RxDrOffset1 +RxFreq2 +RxLevel +RxNormAttribute +RxNormConcept +RxNormConcepts +RxNormEntity +RxNormTrait +S +S3 +S3AccessControlList +S3AccessControlPolicy +S3AccessDeniedFault +S3AccessPointAlias +S3AccessPointArn +S3AccessPointConfiguration +S3AclOption +S3Action +S3ApplicationCodeLocationDescription +S3ArtifactLocation +S3ArtifactPath +S3BackupConfiguration +S3BackupDescription +S3BackupMode +S3BackupUpdate +S3Bucket +S3BucketAccessRoleArn +S3BucketAclGrantConfiguration +S3BucketArn +S3BucketConfiguration +S3BucketCriteriaForJob +S3BucketDefinitionForJob +S3BucketDestination +S3BucketDetail +S3BucketDetails +S3BucketDoesNotExistException +S3BucketFolder +S3BucketInfo +S3BucketLogDestination +S3BucketName +S3BucketOwner +S3BucketPath +S3BucketPrefix +S3BucketRegion +S3BucketRepository +S3BucketRoleArn +S3BucketSinkConfiguration +S3BucketSource +S3BucketTranscriptSource +S3CanonicalUserId +S3CatalogDeltaSource +S3CatalogHudiSource +S3CatalogSource +S3CatalogTarget +S3ClassificationScope +S3ClassificationScopeExclusion +S3ClassificationScopeExclusionUpdate +S3ClassificationScopeUpdate +S3CompressionType +S3Config +S3Configuration +S3ContentBaseLocation +S3ContentBaseLocationDescription +S3ContentBaseLocationUpdate +S3ContentLocation +S3ContentLocationDescription +S3ContentLocationUpdate +S3CopyObjectOperation +S3CsvSource +S3Data +S3DataAccessAsset +S3DataAccessAssetSourceEntry +S3DataConfig +S3DataDistributionType +S3DataRepositoryConfiguration +S3DataSize +S3DataSource +S3DataSourceConfiguration +S3DataSpec +S3DataType +S3DataUrl +S3DeleteObjectTagging +S3DeltaCatalogTarget +S3DeltaDirectTarget +S3DeltaSource +S3Destination +S3DestinationAccessControl +S3DestinationConfig +S3DestinationConfiguration +S3DestinationDescription +S3DestinationProperties +S3DestinationSettings +S3DestinationUpdate +S3Destinations +S3DirectSourceAdditionalOptions +S3DirectTarget +S3Encryption +S3EncryptionConfig +S3EncryptionConfiguration +S3EncryptionEnabled +S3EncryptionMode +S3EncryptionSettings +S3EventName +S3Exception +S3ExportArtifacts +S3ExportConfiguration +S3ExportLocation +S3Exporting +S3ExportingConfig +S3ExportingLocation +S3FailurePath +S3FileLocation +S3GeneratedManifestDescriptor +S3GlueParquetTarget +S3Grant +S3Grantee +S3HudiCatalogTarget +S3HudiDirectTarget +S3HudiSource +S3ImportSource +S3IngestionRoleArn +S3InitiateRestoreObject +S3InitiateRestoreObjectOperation +S3Input +S3InputConfiguration +S3InputDefinition +S3InputFileLocation +S3InputFormatConfig +S3InputMode +S3Inputs +S3JobDefinition +S3JobManifestGenerator +S3JsonSource +S3Key +S3KeyFilter +S3KeyName +S3KeyOutput +S3KeyPrefix +S3Keys +S3KmsKeyId +S3Location +S3LocationDescription +S3LocationNotInServiceRegionException +S3LocationUri +S3LogDelivery +S3LogDeliveryDescription +S3LogUrl +S3Logs +S3LogsConfig +S3LogsConfiguration +S3LogsConfigurationResult +S3MachineLearningModelResourceData +S3ManifestOutputLocation +S3ModelArtifacts +S3ModelDataSource +S3MonitoringConfiguration +S3Object +S3ObjectAcl +S3ObjectKey +S3ObjectLockLegalHold +S3ObjectMetadata +S3ObjectOwner +S3ObjectSource +S3ObjectTag +S3ObjectTags +S3ObjectUrl +S3ObjectVersion +S3OnDeviceService +S3OnDeviceServiceConfiguration +S3Options +S3Origin +S3OriginConfig +S3Output +S3OutputConfiguration +S3OutputFormatConfig +S3OutputLocation +S3OutputPath +S3OutputUri +S3OutputUrl +S3Parameters +S3ParquetSource +S3Path +S3PathforGroupMembers +S3Prefix +S3PublicAccessBlockConfiguration +S3PutObjectAcl +S3PutObjectCopy +S3PutObjectLegalHold +S3PutObjectRetention +S3PutObjectTagging +S3RecordingConfig +S3RecordingDetails +S3RecordingSinkConfiguration +S3RecordingSinkRuntimeConfiguration +S3Reference +S3ReferenceDataSource +S3ReferenceDataSourceDescription +S3ReferenceDataSourceUpdate +S3Region +S3ReplicateObject +S3ReportExportConfig +S3ReportLocation +S3Repository +S3RepositoryDetails +S3Resource +S3ResourceClassification +S3ResourceClassificationUpdate +S3ResourceNotFoundFault +S3Resources +S3Results +S3ResultsPath +S3Retention +S3SetObjectAclOperation +S3SetObjectLegalHoldOperation +S3SetObjectRetentionOperation +S3SetObjectTaggingOperation +S3Settings +S3SignedObject +S3SnapshotAsset +S3Source +S3SourceAdditionalOptions +S3SourceConfig +S3SourceProperties +S3SseAlgorithm +S3SseKmsKeyId +S3StagingLocation +S3Storage +S3StorageClass +S3StorageConfig +S3SubscriptionRequiredException +S3TableOutputOptions +S3Tag +S3Target +S3Targets +S3Update +S3UploadMode +S3Uri +S3Url +S3UrlPrefix +S3UrlSignerRole +S3Version +S3WordsList +S3objectKey +SAMLAssertion +SAMLIdp +SAMLMetadataDocument +SAMLOptions +SAMLOptionsInput +SAMLOptionsOutput +SAMLProviderArn +SAMLProviderList +SAMLProviderListEntry +SAPOData +SAPODataConnectorProfileCredentials +SAPODataConnectorProfileProperties +SAPODataDestinationProperties +SAPODataPaginationConfig +SAPODataParallelismConfig +SAPODataSourceProperties +SCApplicationAttributes +SDM +SHA256TreeHash +SL +SLRDeploymentStatus +SMB +SMBACLEnabled +SMBFileShareInfo +SMBFileShareInfoList +SMBGuestPasswordSet +SMBLocalGroups +SMBSecurityStrategy +SMS +SMSChannelRequest +SMSChannelResponse +SMSConfiguration +SMSMessage +SMSMessageActivity +SMSMfaSettings +SMSMfaSettingsType +SMSSandboxPhoneNumber +SMSTemplate +SMSTemplateRequest +SMSTemplateResponse +SNOMEDCTAttribute +SNOMEDCTConcept +SNOMEDCTConcepts +SNOMEDCTDetails +SNOMEDCTEntity +SNOMEDCTTrait +SNSAction +SNSConfiguration +SNSDestination +SNSInvalidTopicFault +SNSNoAuthorizationFault +SNSTopic +SNSTopicArn +SNSTopicArnNotFoundFault +SNSTopicPublishAction +SNwkSIntKey +SOA +SOAChange +SQLPort +SS +SSEAlgorithm +SSEAwsKmsKeyId +SSECustomerAlgorithm +SSECustomerKey +SSECustomerKeyMD5 +SSEDescription +SSEKMS +SSEKMSEncryption +SSEKMSEncryptionContext +SSEKMSKeyId +SSES3 +SSESpecification +SSESpecificationOverride +SSEType +SSHPublicKey +SSHPublicKeyBody +SSHPublicKeyId +SSHPublicKeyMetadata +SSHPublicKeys +SSLCertificateId +SSLPolicyNotFoundException +SSLSupportMethod +SSMLMessage +SSMLMessageType +SSMOutput +SSMValidationParameters +SSOIdentity +SaaSConfiguration +Safe +SafeguardPolicy +SafetyRuleArn +SafetyRules +SafetyRulesToOverride +SageMakerImageArn +SageMakerImageVersionAliases +SageMakerImageVersionArn +SageMakerJobArn +SageMakerMachineLearningModelResourceData +SageMakerPipelineParameter +SageMakerPipelineParameters +Salesforce +SalesforceAction +SalesforceChatterFeedConfiguration +SalesforceConfiguration +SalesforceConnectorProfileCredentials +SalesforceConnectorProfileProperties +SalesforceCustomKnowledgeArticleTypeConfiguration +SalesforceDestinationProperties +SalesforceKnowledgeArticleConfiguration +SalesforceMetadata +SalesforceSourceProperties +SalesforceStandardKnowledgeArticleTypeConfiguration +SalesforceStandardObjectAttachmentConfiguration +SalesforceStandardObjectConfiguration +Salt +SameFileContentException +SamePathRequestException +SameSheetTargetVisualConfiguration +SamlAuthentication +SamlConfigCount +SamlConfigOptions +SamlConfiguration +SamlProperties +SamlProviderARNs +SamlProviderArn +Sample +SampleAdaptiveOffsetFilterMode +SampleChannelDataRequest +SampleChannelDataResponse +SampleCount +SampleDataS3SourceConfig +SampleFraction +SamplePath +SamplePayloadUrl +SampleQuery +SampleRange +SampleRangeConversion +SampleRate +SampleRows +SampleSize +SampleTime +SampleTimestamp +SampleUtterance +SampleUtterances +SampleValue +SampleWeightAttributeName +SampledCount +SampledEndTime +SampledHTTPRequest +SampledRequests +SampledRequestsEnabled +SampledStartTime +Sampling +SamplingDeviceCount +SamplingInterval +SamplingPercentage +SamplingRate +SamplingRule +SamplingRuleRecord +SamplingRuleRecords +SamplingRuleUpdate +SamplingStatisticSummaries +SamplingStatisticSummary +SamplingStatisticsDocument +SamplingStatisticsDocuments +SamplingStrategy +SamplingTargetDocument +SamplingTargetDocuments +SanRequireDirectoryGuid +SanRequireDns +SanRequireDomainDns +SanRequireEmail +SanRequireSpn +SanRequireUpn +SanitizationWarning +SankeyDiagramAggregatedFieldWells +SankeyDiagramChartConfiguration +SankeyDiagramFieldWells +SankeyDiagramSortConfiguration +SankeyDiagramVisual +SapHostname +SapInstanceNumber +SapKernelVersion +SasConfiguration +Sasl +SaslMechanism +SaslPassword +SaslUsername +SatelliteListItem +Saturation +Saturday +Savings +SavingsCurrencyCode +SavingsOpportunity +SavingsPercentage +SavingsPlan +SavingsPlanArn +SavingsPlanFilter +SavingsPlanOffering +SavingsPlanOfferingFilterElement +SavingsPlanOfferingProperty +SavingsPlanOfferingRate +SavingsPlanOfferingRateFilterElement +SavingsPlanOfferingRateProperty +SavingsPlanRate +SavingsPlanRateFilter +SavingsPlanRateProperty +SavingsPlansAmortizedCommitment +SavingsPlansCoverage +SavingsPlansCoverageData +SavingsPlansCoverages +SavingsPlansCoveredHoursInLookbackPeriod +SavingsPlansDetails +SavingsPlansPurchaseRecommendation +SavingsPlansPurchaseRecommendationDetail +SavingsPlansPurchaseRecommendationDetails +SavingsPlansPurchaseRecommendationMetadata +SavingsPlansPurchaseRecommendationSummary +SavingsPlansSavings +SavingsPlansType +SavingsPlansUtilization +SavingsPlansUtilizationAggregates +SavingsPlansUtilizationByTime +SavingsPlansUtilizationDetail +SavingsPlansUtilizationDetails +SavingsPlansUtilizationsByTime +ScalaCode +ScalableDimension +ScalableTarget +ScalableTargetARN +ScalableTargetAction +ScalableTargets +ScalarCrlRequest +ScalarProfileRequest +ScalarSubjectRequest +ScalarTrustAnchorRequest +ScalarType +ScalarValue +Scale +ScaleDownBehavior +ScaleDownModifications +ScaleDownNodeTypes +ScaleInCooldown +ScaleInPolicy +ScaleInPolicyDescription +ScaleInPolicyUpdate +ScaleInProtectedInstances +ScaleOutCooldown +ScaleOutPolicy +ScaleOutPolicyDescription +ScaleOutPolicyUpdate +ScaleUpModifications +ScaleUpNodeTypes +ScalingAction +ScalingActivities +ScalingActivity +ScalingActivityInProgressFault +ScalingAdjustment +ScalingAdjustmentType +ScalingBehavior +ScalingConfig +ScalingConfiguration +ScalingConfigurationInfo +ScalingConstraints +ScalingInstruction +ScalingInstructions +ScalingMode +ScalingParameters +ScalingParametersStatus +ScalingPlan +ScalingPlanName +ScalingPlanNames +ScalingPlanResource +ScalingPlanResources +ScalingPlanVersion +ScalingPlans +ScalingPolicies +ScalingPolicy +ScalingPolicyMetric +ScalingPolicyObjective +ScalingPolicyUpdate +ScalingPolicyUpdateBehavior +ScalingProcessQuery +ScalingProcesses +ScalingRule +ScalingStatusCode +ScalingStatusMessage +ScalingTrigger +ScalingType +Scan +ScanAll +ScanBy +ScanCompletedAt +ScanCondition +ScanConditionPair +ScanDetections +ScanDirection +ScanEc2InstanceWithFindings +ScanEc2InstanceWithFindingsResult +ScanEnabled +ScanEndTime +ScanFilePath +ScanFilter +ScanId +ScanIndexForward +ScanInput +ScanMode +ScanNameWithFindingNum +ScanNotFoundException +ScanOnPush +ScanOutput +ScanProvisionedProductsInput +ScanProvisionedProductsOutput +ScanRange +ScanResourceCriteria +ScanResult +ScanResultDetails +ScanStartTime +ScanStartedAt +ScanStatus +ScanSummary +ScanThreatName +ScanType +ScanTypeConversionMode +ScannedCount +ScannedItemCount +ScannedVolumeDetails +ScanningRepositoryFilter +Scans +ScatterPlotCategoricallyAggregatedFieldWells +ScatterPlotConfiguration +ScatterPlotFieldWells +ScatterPlotUnaggregatedFieldWells +ScatterPlotVisual +SccDestinationSettings +SccXml +Scenario +SceneChangeDetect +SceneError +SceneSummary +Schedule +ScheduleAction +ScheduleActionSettings +ScheduleActionStartSettings +ScheduleActions +ScheduleActivityTaskDecisionAttributes +ScheduleActivityTaskFailedEventAttributes +ScheduleAdBreak +ScheduleAdBreaks +ScheduleArn +ScheduleAssociationState +ScheduleAt +ScheduleConfig +ScheduleConfiguration +ScheduleDefinitionTypeUnsupportedFault +ScheduleDefinitions +ScheduleDescription +ScheduleEndTime +ScheduleEntry +ScheduleEntryType +ScheduleExpression +ScheduleExpressionTimezone +ScheduleFrequency +ScheduleGroupArn +ScheduleGroupSummary +ScheduleGroups +ScheduleId +ScheduleIdentifier +ScheduleKeyDeletionRequest +ScheduleKeyDeletionResponse +ScheduleLambdaFunctionDecisionAttributes +ScheduleLambdaFunctionFailedEventAttributes +ScheduleName +ScheduleOffset +ScheduleRefreshOnEntity +ScheduleRunConfiguration +ScheduleRunRequest +ScheduleRunResult +ScheduleRunTest +ScheduleStartTime +ScheduleSummary +ScheduleTimezone +Scheduled +ScheduledAction +ScheduledActionARN +ScheduledActionAlreadyExistsFault +ScheduledActionBufferTime +ScheduledActionDescription +ScheduledActionFilter +ScheduledActionName +ScheduledActionNames +ScheduledActionNotFoundFault +ScheduledActionQuotaExceededFault +ScheduledActionType +ScheduledActionTypeUnsupportedFault +ScheduledActions +ScheduledActionsMessage +ScheduledActionsType +ScheduledAuditMetadata +ScheduledAutoTuneDetails +ScheduledBy +ScheduledEndTime +ScheduledInstance +ScheduledInstanceAvailability +ScheduledInstanceAvailabilitySet +ScheduledInstanceId +ScheduledInstanceIds +ScheduledInstanceRecurrence +ScheduledInstanceRecurrenceRequest +ScheduledInstanceSet +ScheduledInstancesBlockDeviceMapping +ScheduledInstancesEbs +ScheduledInstancesIamInstanceProfile +ScheduledInstancesIpv6Address +ScheduledInstancesLaunchSpecification +ScheduledInstancesMonitoring +ScheduledInstancesNetworkInterface +ScheduledInstancesPlacement +ScheduledInstancesPrivateIpAddressConfig +ScheduledJobRollout +ScheduledQueries +ScheduledQuery +ScheduledQueryArn +ScheduledQueryDescription +ScheduledQueryExecutionRoleArn +ScheduledQueryRunSummary +ScheduledScalingSuspended +ScheduledSplit +ScheduledSplitConfig +ScheduledSplitsLaunchConfig +ScheduledSplitsLaunchDefinition +ScheduledStart +ScheduledStartTime +ScheduledStartTimeMillis +ScheduledTime +ScheduledTimeAfter +ScheduledTimeBefore +ScheduledTimestamp +ScheduledTriggerProperties +ScheduledUpdateGroupAction +ScheduledUpdateGroupActionRequest +ScheduledUpdateGroupActions +ScheduledWindowExecution +ScheduledWindowExecutions +SchedulerLogs +SchedulerNotRunningException +SchedulerRunningException +SchedulerTransitioningException +Schedulers +Schedules +SchedulingBufferTime +SchedulingConfig +SchedulingPolicyDetail +SchedulingPolicyListingDetail +SchedulingStrategy +Schema +SchemaAlreadyExistsException +SchemaAlreadyPublishedException +SchemaArn +SchemaArns +SchemaAttribute +SchemaAttributeType +SchemaAttributes +SchemaChangePolicy +SchemaCheckpoint +SchemaColumn +SchemaConfiguration +SchemaConversionApplicationAttributes +SchemaConversionRequest +SchemaDefinition +SchemaDeleteOption +SchemaDiffType +SchemaError +SchemaExtensionId +SchemaExtensionInfo +SchemaExtensionStatus +SchemaExtensionStatusReason +SchemaExtensionsInfo +SchemaFacet +SchemaFacets +SchemaHandlerPackage +SchemaId +SchemaInputAttribute +SchemaListItem +SchemaMappingSummary +SchemaName +SchemaNamePrefix +SchemaPattern +SchemaReference +SchemaResponse +SchemaS3Location +SchemaShortInfoResponse +SchemaStatus +SchemaSummary +SchemaUnion +SchemaVersion +SchemaVersionErrorItem +SchemaVersionErrors +SchemaVersionId +SchemaVersionListItem +SchemaVersionNumber +SchemaVersionStatus +SchemaVersionSummary +SchemaVersions +Schemas +Scheme +Scope +ScopeConfiguration +ScopeCount +ScopeDescription +ScopeDoesNotExistException +ScopeDownStatement +ScopeName +Scopes +Scoping +Score +ScoreAttributes +ScoreConfidence +ScoreDetails +ScoreThreshold +ScoreThresholdLastUpdatedAt +Scores +ScoringStrategy +ScpActionDefinition +Scram +ScreenCanvasSizeOptions +ScreenDataUrl +ScreenSharingUrl +ScreenViewingUrl +ScreenshotName +Script +ScriptArn +ScriptBatchJobDefinition +ScriptBatchJobIdentifier +ScriptBootstrapAction +ScriptBootstrapActionConfig +ScriptDetails +ScriptId +ScriptLocation +ScriptModeConfig +ScriptParameterKeyValue +ScriptPath +ScriptS3Location +Scripts +ScrollBarOptions +ScrollStatus +ScrollbarOptions +Scte +Scte20Detection +Scte20PlusEmbeddedDestinationSettings +Scte20SourceSettings +Scte27DestinationSettings +Scte27Pids +Scte27SourceSettings +Scte35Behavior +Scte35Control +Scte35DeliveryRestrictions +Scte35Descriptor +Scte35DescriptorSettings +Scte35Descriptors +Scte35Esam +Scte35EsamPid +Scte35InputScheduleActionSettings +Scte35InputSettings +Scte35Pid +Scte35PrerollPullupMilliseconds +Scte35ReturnToNetworkScheduleActionSettings +Scte35ReturnToNetworkSettings +Scte35SegmentationDescriptor +Scte35Source +Scte35SpliceInsert +Scte35SpliceInsertScheduleActionSettings +Scte35SpliceInsertSettings +Scte35TimeSignalApos +Scte35TimeSignalScheduleActionSettings +Scte35TimeSignalSettings +ScteFilter +ScteHls +ScteMarkersSource +SdkConfigurationProperty +SdkName +SdkResponse +SdkType +SdkTypes +SdrReferenceWhiteLevel +SdtInterval +Search +SearchAddressBooksRequest +SearchAddressBooksResponse +SearchAnalysesRequest +SearchAnalysesResponse +SearchAssociatedTranscriptsRequest +SearchAssociatedTranscriptsResponse +SearchAvailablePhoneNumbersRequest +SearchAvailablePhoneNumbersResponse +SearchCasesRequest +SearchCasesResponse +SearchCasesResponseItem +SearchChannelsRequest +SearchChannelsResponse +SearchCollectionTypes +SearchContactsRequest +SearchContactsResponse +SearchContentRequest +SearchContentResponse +SearchCriteria +SearchDashboardsRequest +SearchDashboardsResponse +SearchDataSetsRequest +SearchDataSetsResponse +SearchDataSourcesRequest +SearchDataSourcesResponse +SearchDatabasesByLFTagsRequest +SearchDatabasesByLFTagsResponse +SearchDevicesFilter +SearchDevicesRequest +SearchDevicesResponse +SearchEnabled +SearchEntitiesRequest +SearchEntitiesResponse +SearchException +SearchExpression +SearchFacesByImageRequest +SearchFacesByImageResponse +SearchFacesRequest +SearchFacesResponse +SearchField +SearchFilter +SearchFlowExecutionsRequest +SearchFlowExecutionsResponse +SearchFlowTemplatesRequest +SearchFlowTemplatesResponse +SearchFoldersRequest +SearchFoldersResponse +SearchForPositionResult +SearchForSuggestionsResult +SearchForTextResult +SearchGameSessionsInput +SearchGameSessionsOutput +SearchGroupsRequest +SearchGroupsResponse +SearchHoursOfOperationsRequest +SearchHoursOfOperationsResponse +SearchImageSetsRequest +SearchImageSetsResponse +SearchIndexRequest +SearchIndexResponse +SearchInput +SearchInsightsFilters +SearchInsightsRequest +SearchInsightsResponse +SearchInstanceCount +SearchInstanceType +SearchJobsFilter +SearchJobsRequest +SearchJobsResponse +SearchKey +SearchLocalGatewayRoutesRequest +SearchLocalGatewayRoutesResult +SearchNetworkProfilesRequest +SearchNetworkProfilesResponse +SearchOptions +SearchOrganizationInsightsFilters +SearchOrganizationInsightsRequest +SearchOrganizationInsightsResponse +SearchOutput +SearchPartitionCount +SearchPlaceIndexForPositionRequest +SearchPlaceIndexForPositionResponse +SearchPlaceIndexForPositionSummary +SearchPlaceIndexForSuggestionsRequest +SearchPlaceIndexForSuggestionsResponse +SearchPlaceIndexForSuggestionsSummary +SearchPlaceIndexForTextRequest +SearchPlaceIndexForTextResponse +SearchPlaceIndexForTextSummary +SearchPrincipalType +SearchProductsAsAdminInput +SearchProductsAsAdminOutput +SearchProductsInput +SearchProductsOutput +SearchProfilesRequest +SearchProfilesResponse +SearchPromptsRequest +SearchPromptsResponse +SearchProvisionedProductsInput +SearchProvisionedProductsOutput +SearchQuantumTasksFilter +SearchQuantumTasksRequest +SearchQuantumTasksResponse +SearchQuery +SearchQueuesRequest +SearchQueuesResponse +SearchQuickConnectsRequest +SearchQuickConnectsResponse +SearchRasterDataCollectionInput +SearchRasterDataCollectionOutput +SearchRecord +SearchRelatedItemsRequest +SearchRelatedItemsResponse +SearchRelatedItemsResponseItem +SearchRequest +SearchResourceTagsRequest +SearchResourceTagsResponse +SearchResourcesBucketCriteria +SearchResourcesCriteria +SearchResourcesCriteriaBlock +SearchResourcesInput +SearchResourcesOutput +SearchResourcesRequest +SearchResourcesResponse +SearchResourcesSimpleCriterion +SearchResourcesSortCriteria +SearchResourcesTagCriterion +SearchResourcesTagCriterionPair +SearchResponse +SearchRoomsRequest +SearchRoomsResponse +SearchRoutingProfilesRequest +SearchRoutingProfilesResponse +SearchSchemaSummary +SearchSchemaVersionSummary +SearchSchemasRequest +SearchSchemasResponse +SearchSecurityProfilesRequest +SearchSecurityProfilesResponse +SearchService +SearchSessionsRequest +SearchSessionsResponse +SearchSkillGroupsRequest +SearchSkillGroupsResponse +SearchSlowLogs +SearchSortResult +SearchStatus +SearchString +SearchSystemInstancesRequest +SearchSystemInstancesResponse +SearchSystemTemplatesRequest +SearchSystemTemplatesResponse +SearchTablesByLFTagsRequest +SearchTablesByLFTagsResponse +SearchTablesRequest +SearchTablesResponse +SearchText +SearchThingsRequest +SearchThingsResponse +SearchTransitGatewayMulticastGroupsRequest +SearchTransitGatewayMulticastGroupsResult +SearchTransitGatewayRoutesRequest +SearchTransitGatewayRoutesResult +SearchUsersByImageRequest +SearchUsersByImageResponse +SearchUsersRequest +SearchUsersResponse +SearchValue +SearchVocabulariesRequest +SearchVocabulariesResponse +SearchVulnerabilitiesFilterCriteria +SearchVulnerabilitiesRequest +SearchVulnerabilitiesResponse +Searchable +SearchedFace +SearchedFaceBoundingBox +SearchedFaceConfidence +SearchedFaceDetails +SearchedFaceId +SearchedLogStream +SearchedUser +Seasonality +SecondBlockToken +SecondSchemaVersionNumber +SecondSnapshotId +Secondary +SecondaryAllocationIds +SecondaryArtifacts +SecondaryAvailabilityZone +SecondaryBackground +SecondaryBtn +SecondaryEmail +SecondaryForeground +SecondaryGids +SecondaryInputId +SecondaryPrivateIpAddressCount +SecondaryPrivateIpAddresses +SecondaryStatus +SecondaryStatusTransition +SecondaryStatusTransitions +SecondaryValue +SecondaryValueFontConfiguration +SecondaryValueOptions +SecondaryYAxisDisplayOptions +SecondaryYAxisLabelOptions +SecondsBeforeTimeout +SecondsUntilAutoPause +Secret +SecretAccessKey +SecretArn +SecretArnList +SecretBinary +SecretCode +SecretHash +SecretId +SecretKey +SecretList +SecretListEntry +SecretManagerArn +SecretOptions +SecretStatus +SecretString +SecretStringKey +SecretToAuthenticateInitiator +SecretToAuthenticateTarget +SecretToken +SecretVersionsListEntry +SecretVersionsToStages +Secrets +SecretsManagerAccessRoleArn +SecretsManagerAccessTokenConfiguration +SecretsManagerArn +SecretsManagerOracleAsmAccessRoleArn +SecretsManagerOracleAsmSecretId +SecretsManagerSecretConfiguration +SecretsManagerSecretId +SecretsManagerSecretResourceData +SecretsManagerSecurityDbEncryptionAccessRoleArn +SecretsManagerSecurityDbEncryptionSecretId +SecretsRoleArn +Section +SectionAfterPageBreak +SectionBased +SectionBasedLayout +SectionBasedLayoutCanvasSizeOptions +SectionBasedLayoutConfiguration +SectionBasedLayoutPaperCanvasSizeOptions +SectionId +SectionLayoutConfiguration +SectionModification +SectionPageBreakConfiguration +SectionStyle +SectionalElement +Sections +Secure +SecurityConfig +SecurityConfigDetail +SecurityConfigStats +SecurityConfigSummary +SecurityConfiguration +SecurityConfigurationSummary +SecurityConfigurations +SecurityContext +SecurityControl +SecurityControlArn +SecurityControlDefinition +SecurityControlDefinitions +SecurityControlId +SecurityControlIds +SecurityControlStatus +SecurityControls +SecurityDbEncryption +SecurityDbEncryptionName +SecurityDescriptorCopyFlags +SecurityDetails +SecurityGroup +SecurityGroupArns +SecurityGroupId +SecurityGroupIdForDomainBoundary +SecurityGroupIdList +SecurityGroupIdSet +SecurityGroupIdUpdates +SecurityGroupIdentifier +SecurityGroupIds +SecurityGroupLimitExceeded +SecurityGroupMembership +SecurityGroupNotFound +SecurityGroupReference +SecurityGroupReferenceSet +SecurityGroupRemediationAction +SecurityGroupRule +SecurityGroupRuleDescription +SecurityGroupRuleDescriptions +SecurityGroupRuleId +SecurityGroupRuleIds +SecurityGroupRuleRequest +SecurityGroupRuleUpdate +SecurityGroupRules +SecurityGroupSet +SecurityGroups +SecurityHeadersConfig +SecurityHubConfiguration +SecurityKey +SecurityKeys +SecurityNonCompliantCount +SecurityPolicy +SecurityPolicyDetail +SecurityPolicyName +SecurityPolicyNames +SecurityPolicyStats +SecurityPolicySummary +SecurityProfile +SecurityProfileArn +SecurityProfileId +SecurityProfileIdentifier +SecurityProfileIds +SecurityProfileName +SecurityProfileSearchCriteria +SecurityProfileSearchSummary +SecurityProfileSummary +SecurityProfileSummaryList +SecurityProfileTarget +SecurityProfileTargetMapping +SecurityProfiles +SecurityProfilesSearchFilter +SecurityProtocol +SecurityServicePolicyData +SecurityServiceType +SecurityStyle +SecurityToken +SecurityType +Seed +SeedUrlConfiguration +SeedUrls +Segment +SegmentBehaviors +SegmentCondition +SegmentControl +SegmentDeliveryConfiguration +SegmentDeliveryConfigurations +SegmentDemographics +SegmentDetection +SegmentDimensions +SegmentDuration +SegmentDurationSeconds +SegmentGroup +SegmentGroupList +SegmentGroups +SegmentId +SegmentImportResource +SegmentLength +SegmentLengthControl +SegmentLocation +SegmentModifier +SegmentName +SegmentNum +SegmentNumber +SegmentOverride +SegmentPrefix +SegmentReference +SegmentResponse +SegmentStartCondition +SegmentTemplateFormat +SegmentType +SegmentTypeInfo +SegmentTypes +SegmentVersion +SegmentationCancelIndicator +SegmentationDescriptor +SegmentationDescriptorScte35DescriptorSettings +SegmentationDescriptors +SegmentationDuration +SegmentationEventId +SegmentationMarkers +SegmentationMode +SegmentationStyle +SegmentationTime +SegmentationTypeId +SegmentationUpid +SegmentationUpidType +Segments +SegmentsExpected +SegmentsPerSubdirectory +SegmentsReceivedCount +SegmentsRejectedCount +SegmentsResponse +SegmentsSentCount +SegmentsSpilloverCount +Select +SelectAggregateResourceConfigRequest +SelectAggregateResourceConfigResponse +SelectAllOptions +SelectAllValueOptions +SelectAttributesActivity +SelectColumn +SelectFields +SelectFromCollection +SelectObjectContentOutput +SelectObjectContentRequest +SelectParameters +SelectResourceConfigRequest +SelectResourceConfigResponse +SelectSqlQuery +SelectableValues +SelectedBinType +SelectedBorderStyle +SelectedChoiceIds +SelectedChoices +SelectedColumns +SelectedEngineVersion +SelectedFieldOptions +SelectedFields +SelectedFieldsConfiguration +SelectedOutputs +SelectedPointStyle +SelectedSegmentTypes +SelectedSheets +SelectedSheetsFilterScopeConfiguration +SelectedStep +SelectedSteps +SelectedTooltipType +SelectedVideoStreams +SelectionCriteria +SelectionId +SelectionName +SelectionRules +SelectionScope +SelectionStatus +SelectiveAuth +SelectiveExecutionConfig +SelectiveExecutionResult +Selector +SelectorSettings +SelectorType +Selectors +SelfManageResources +SelfManagedActiveDirectoryAttributes +SelfManagedActiveDirectoryConfiguration +SelfManagedActiveDirectoryConfigurationUpdates +SelfManagedEventSource +SelfManagedKafkaAccessConfigurationVpc +SelfManagedKafkaEventSourceConfig +SelfManagedKafkaParameters +SelfManagedOptOutsEnabled +SelfServicePortal +SelfServicePortalUrl +SelfServiceSAMLProviderArn +SelfServiceSamlProviderArn +SelfUserProfile +SelfservicePermissions +SellerName +SemanticEntityType +SemanticType +SemanticVersion +SemtechGnss +SemtechGnssConfiguration +SemtechGnssDetail +SendActivationCodeRequest +SendAlexaOfferToMasterRequest +SendAlexaOfferToMasterResponse +SendAnnouncementRequest +SendAnnouncementResponse +SendApiAssetRequest +SendApiAssetResponse +SendAutomationSignalRequest +SendBonusRequest +SendBounceRequest +SendBounceResponse +SendBulkEmailRequest +SendBulkEmailResponse +SendBulkTemplatedEmailRequest +SendBulkTemplatedEmailResponse +SendChannelMessageRequest +SendChannelMessageResponse +SendCommandRequest +SendCommandResult +SendContactMethodVerificationRequest +SendContactMethodVerificationResult +SendCustomVerificationEmailRequest +SendCustomVerificationEmailResponse +SendDataPoint +SendDataPoints +SendDataToMulticastGroupRequest +SendDataToMulticastGroupResponse +SendDataToWirelessDeviceRequest +SendDataToWirelessDeviceResponse +SendDelayMs +SendDiagnosticInterruptRequest +SendEmail +SendEmailNotification +SendEmailRequest +SendEmailResponse +SendEventRequest +SendEventResponse +SendFilePaths +SendHeartbeatRequest +SendInvitationRequest +SendMessageBatchRequest +SendMessageBatchRequestEntry +SendMessageBatchResult +SendMessageBatchResultEntry +SendMessageRequest +SendMessageResponse +SendMessageResult +SendMessagesRequest +SendMessagesResponse +SendNotification +SendNotificationAction +SendNotificationActionDefinition +SendOTPMessageRequest +SendOTPMessageRequestParameters +SendOTPMessageResponse +SendPipelineExecutionStepFailureRequest +SendPipelineExecutionStepFailureResponse +SendPipelineExecutionStepSuccessRequest +SendPipelineExecutionStepSuccessResponse +SendProjectSessionActionRequest +SendProjectSessionActionResponse +SendQuota +SendRawEmailRequest +SendRawEmailResponse +SendSSHPublicKeyRequest +SendSSHPublicKeyResponse +SendSerialConsoleSSHPublicKeyRequest +SendSerialConsoleSSHPublicKeyResponse +SendTaskFailureInput +SendTaskHeartbeatInput +SendTaskSuccessInput +SendTemplatedEmailRequest +SendTemplatedEmailResponse +SendTestEventNotificationRequest +SendTextMessageRequest +SendTextMessageResult +SendUsersMessageRequest +SendUsersMessageResponse +SendUsersMessagesRequest +SendUsersMessagesResponse +SendVoiceMessageRequest +SendVoiceMessageResponse +SendVoiceMessageResult +SendWorkflowStepStateRequest +Sender +SenderClientId +SenderControlPort +SenderFault +SenderId +SenderIdAndCountry +SenderIdArn +SenderIdFilter +SenderIdInformation +SenderIds +SenderIpAddress +SendingEnabled +SendingIps +SendingOptions +SendingPausedException +SendingPoolName +SendingSchedule +Sensitive +SensitiveData +SensitiveDataDetections +SensitiveDataItem +SensitiveDataResult +SensitivityAggregations +SensitivityInspectionTemplateExcludes +SensitivityInspectionTemplateIncludes +SensitivityInspectionTemplatesEntry +SensitivityLevel +SensitivityThreshold +Sensor +SensorName +SensorStatisticsSummaries +SensorStatisticsSummary +SensorsWithShortDateRange +SentLast24Hours +SentTime +Sentiment +SentimentAnalysisSettings +SentimentConfiguration +SentimentDetectionJobFilter +SentimentDetectionJobProperties +SentimentDetectionJobPropertiesList +SentimentFilter +SentimentResponse +SentimentScore +SentimentType +Sentiments +Separator +SeparatorConfiguration +Seq +Sequence +SequenceInformation +SequenceNumber +SequenceNumberForOrdering +SequenceNumberRange +SequenceStoreDetail +SequenceStoreFilter +SerDeInfo +Serde +SerdeInfo +Serial +SerialConsoleAccessDisabledException +SerialConsoleAccessEnabled +SerialConsoleSessionLimitExceededException +SerialConsoleSessionUnavailableException +SerialNumber +SerialPort +SerializationLibrary +Serializer +Series +SeriesItem +ServeSignature +Server +ServerArn +ServerCannotBeReplicatedException +ServerCertLastUpdated +ServerCertUri +ServerCertificate +ServerCertificateArn +ServerCertificateConfiguration +ServerCertificateConfigurations +ServerCertificateId +ServerCertificateMetadata +ServerCertificateMetadataList +ServerCertificateName +ServerCertificateScope +ServerCertificateSummary +ServerCertificates +ServerConfiguration +ServerDetail +ServerEndpoint +ServerError +ServerEvent +ServerEvents +ServerException +ServerGroup +ServerGroupLaunchConfiguration +ServerGroupReplicationConfiguration +ServerGroupValidationConfiguration +ServerHostname +ServerId +ServerInternalErrorException +ServerInternalException +ServerLaunchConfiguration +ServerLaunchParameters +ServerLaunchPath +ServerName +ServerNameToVerify +ServerOsType +ServerPath +ServerPort +ServerProcess +ServerProcesses +ServerProperties +ServerProtocol +ServerPublicKey +ServerReplicationConfiguration +ServerReplicationParameters +ServerRootCaCertificate +ServerSdkVersion +ServerShortInfoResponse +ServerShutdownException +ServerSideEncryption +ServerSideEncryptionByDefault +ServerSideEncryptionConfiguration +ServerSideEncryptionKmsKeyId +ServerSideEncryptionRule +ServerSideEncryptionUpdateDetails +ServerSideKmsKeyId +ServerSideTokenCheck +ServerStatusSummary +ServerStrategy +ServerSummary +ServerTimestamp +ServerTimezone +ServerTimingHeadersConfig +ServerTrust +ServerTunnelAddress +ServerUrl +ServerValidation +ServerValidationConfiguration +ServerValidationOutput +Serverless +ServerlessClientAuthentication +ServerlessConfig +ServerlessRequest +ServerlessSasl +ServerlessUpdateConfig +ServerlessV2ScalingConfiguration +ServerlessV2ScalingConfigurationInfo +Servers +Service +ServiceAccessRoleArn +ServiceAccessSecurityGroup +ServiceAccountCredentials +ServiceAccountException +ServiceAccountPassword +ServiceAccountUsername +ServiceActionAssociation +ServiceActionAssociations +ServiceActionDetail +ServiceActionId +ServiceActionParameters +ServiceActionSummaries +ServiceActionSummary +ServiceAdditionalInfo +ServiceAlreadyExists +ServiceArn +ServiceArnList +ServiceCatalogConfiguration +ServiceCatalogProvisionedProductDetails +ServiceCatalogProvisioningDetails +ServiceCatalogProvisioningUpdateDetails +ServiceChange +ServiceCode +ServiceCollection +ServiceConfiguration +ServiceConfigurations +ServiceConnectClientAlias +ServiceConnectConfiguration +ServiceConnectService +ServiceConnectServiceResource +ServiceCount +ServiceDescriptor +ServiceDetail +ServiceDetails +ServiceEndpoint +ServiceError +ServiceErrorId +ServiceErrorIds +ServiceErrors +ServiceEvent +ServiceException +ServiceExecutionRole +ServiceExecutionRoleUpdate +ServiceFailureException +ServiceFault +ServiceFilter +ServiceForecastStatistics +ServiceGraphEndTime +ServiceGraphStartTime +ServiceHealth +ServiceId +ServiceIdentifier +ServiceIds +ServiceInfo +ServiceInsightHealth +ServiceInstance +ServiceInstanceState +ServiceInstanceSummary +ServiceIntegration +ServiceIntegrationConfig +ServiceInternalErrorException +ServiceInternalException +ServiceJson +ServiceLastAccessed +ServiceLimit +ServiceLimitExceeded +ServiceLimitExceededException +ServiceLinkedRoleARN +ServiceLinkedRoleFailure +ServiceLinkedRoleLockClientException +ServiceLinkedRoleNotFoundFault +ServiceLocation +ServiceMetadata +ServiceName +ServiceNameAndResourceType +ServiceNames +ServiceNamespace +ServiceNamespaces +ServiceNetworkServiceAssociationSummary +ServiceNetworkSummary +ServiceNetworkVpcAssociationSummary +ServiceNotActiveException +ServiceNotFound +ServiceNotFoundException +ServiceNotSupportedException +ServiceNow +ServiceNowBuildVersion +ServiceNowConfiguration +ServiceNowConnectorProfileCredentials +ServiceNowConnectorProfileProperties +ServiceNowKnowledgeArticleConfiguration +ServiceNowParameters +ServiceNowServiceCatalogConfiguration +ServiceNowSourceProperties +ServiceObservabilityConfiguration +ServicePack +ServicePassword +ServicePermissionId +ServicePipeline +ServicePipelineState +ServicePrincipal +ServicePrincipalName +ServicePrincipalNameSummary +ServicePrincipalNames +ServiceProcessingTimeInMillis +ServiceProfile +ServiceProfileId +ServiceProfileList +ServiceProviderName +ServiceProviderSamlMetadata +ServiceQuota +ServiceQuotaExceededException +ServiceQuotaIncreaseRequestInTemplate +ServiceQuotaIncreaseRequestInTemplateList +ServiceQuotaTemplateAssociationStatus +ServiceQuotaTemplateNotInUseException +ServiceRegistries +ServiceRegistry +ServiceResourceCost +ServiceRole +ServiceRoleArn +ServiceSetting +ServiceSettingNotFound +ServiceSize +ServiceSoftwareOptions +ServiceSpecificCredential +ServiceSpecificCredentialId +ServiceSpecificCredentialMetadata +ServiceSpecificCredentials +ServiceSpecification +ServiceState +ServiceStatistics +ServiceSummary +ServiceSummaryList +ServiceSummaryStatistics +ServiceSyncBlockerSummary +ServiceSyncConfig +ServiceTemplate +ServiceTemplateSummary +ServiceTemplateVersion +ServiceTemplateVersionSummary +ServiceTemporarilyUnavailableException +ServiceType +ServiceTypeDetail +ServiceUnavailable +ServiceUnavailableError +ServiceUnavailableException +ServiceUpdate +ServiceUpdateDescription +ServiceUpdateEndDate +ServiceUpdateName +ServiceUpdateNameToApply +ServiceUpdateNotFoundFault +ServiceUpdateRecommendedApplyByDate +ServiceUpdateReleaseDate +ServiceUpdateRequest +ServiceUpdateSeverity +ServiceUpdateStatus +ServiceUpdateTimeRange +ServiceUpdateType +ServiceUpdates +ServiceUpdatesMessage +ServiceUrl +ServiceUserName +ServiceVersion +ServiceVersions +Services +ServicesLastAccessed +Session +SessionAlreadyExistsException +SessionArn +SessionCap +SessionCommand +SessionConfiguration +SessionContext +SessionContextAttributes +SessionCookieName +SessionData +SessionDataSortBy +SessionDuration +SessionExpirationDurationInSeconds +SessionExpiredException +SessionFilter +SessionId +SessionIdleTimeoutInMinutes +SessionInitializationEndpointPrefix +SessionIntegrationConfiguration +SessionIssuer +SessionKeyAmex +SessionKeyDerivationAttributes +SessionKeyDerivationMode +SessionKeyDerivationValue +SessionKeyEmv2000 +SessionKeyEmvCommon +SessionKeyMastercard +SessionKeyVisa +SessionKeys +SessionKeysAbpV1_0_x +SessionKeysAbpV1_1 +SessionLifetimeInMinutes +SessionLifetimeInMinutesInvalidException +SessionManagerOutputUrl +SessionMapping +SessionMappingDetail +SessionMappingSummary +SessionMappings +SessionName +SessionNameOrId +SessionNotFoundException +SessionNumber +SessionPinningFilters +SessionPolicyArn +SessionSampleRate +SessionScriptS3Location +SessionSpecification +SessionStartTime +SessionState +SessionStatistics +SessionStatus +SessionStickinessConfig +SessionSummary +SessionTag +SessionTags +SessionTimeout +SessionTimeoutHours +SessionTimeoutMinutes +SessionToken +Sessions +Set +SetActiveReceiptRuleSetRequest +SetAlarmStateInput +SetAsDefault +SetCognitoEventsRequest +SetDataCaptureChanges +SetDataRetrievalPolicyInput +SetDefaultAuthorizerRequest +SetDefaultAuthorizerResponse +SetDefaultMessageTypeRequest +SetDefaultMessageTypeResult +SetDefaultPermissionVersionRequest +SetDefaultPermissionVersionResponse +SetDefaultPolicyVersionRequest +SetDefaultSenderIdRequest +SetDefaultSenderIdResult +SetDesiredCapacityType +SetDimension +SetEndpointAttributesInput +SetFileModeEntry +SetGatewayBridgeSourceRequest +SetId +SetIdentifier +SetIdentityDkimEnabledRequest +SetIdentityFeedbackForwardingEnabledRequest +SetIdentityHeadersInNotificationsEnabledRequest +SetIdentityMailFromDomainRequest +SetIdentityNotificationTopicRequest +SetIdentityPoolConfigurationRequest +SetIdentityPoolConfigurationResponse +SetIdentityPoolRolesInput +SetInstanceHealthQuery +SetInstanceProtectionQuery +SetIpAddressTypeInput +SetIpAddressTypeOutput +SetIpAddressTypeRequest +SetIpAddressTypeResult +SetLoadBalancerListenerSSLCertificateInput +SetLoadBalancerPoliciesForBackendServerInput +SetLoadBalancerPoliciesOfListenerInput +SetLoadBasedAutoScalingRequest +SetLocalConsolePasswordInput +SetLocalConsolePasswordOutput +SetLogDeliveryConfigurationRequest +SetLogDeliveryConfigurationResponse +SetLoggingOptionsRequest +SetName +SetParameterValueConfiguration +SetParametersOperation +SetPermissionRequest +SetPlatformApplicationAttributesInput +SetPrincipalTagAttributeMapInput +SetPrincipalTagAttributeMapResponse +SetQueueAttributesRequest +SetReceiptRulePositionRequest +SetRepositoryPolicyRequest +SetRepositoryPolicyResponse +SetResourceAccessForBucketRequest +SetResourceAccessForBucketResult +SetRiskConfigurationRequest +SetRiskConfigurationResponse +SetRulePrioritiesInput +SetRulePrioritiesOutput +SetSMBGuestPasswordInput +SetSMBGuestPasswordOutput +SetSMSAttributesInput +SetSecurityGroupsInput +SetSecurityGroupsOutput +SetSecurityTokenServicePreferencesRequest +SetSourceRequest +SetStackPolicyInput +SetStatOption +SetStatusInput +SetSubnetsInput +SetSubnetsOutput +SetSubscriptionAttributesInput +SetTagsForResourceRequest +SetTaskStatusInput +SetTerminationProtectionInput +SetTextMessageSpendLimitOverrideRequest +SetTextMessageSpendLimitOverrideResult +SetTimeBasedAutoScalingRequest +SetTimerAction +SetTopicAttributesInput +SetTypeConfigurationInput +SetTypeConfigurationOutput +SetTypeDefaultVersionInput +SetUICustomizationRequest +SetUICustomizationResponse +SetUserMFAPreferenceRequest +SetUserPoolMfaConfigRequest +SetUserPoolMfaConfigResponse +SetUserSettingsRequest +SetV2LoggingLevelRequest +SetV2LoggingOptionsRequest +SetVariableAction +SetVaultAccessPolicyInput +SetVaultNotificationsInput +SetVisibleToAllUsersInput +SetVoiceMessageSpendLimitOverrideRequest +SetVoiceMessageSpendLimitOverrideResult +Setting +SettingDescription +SettingEntries +SettingEntry +SettingId +SettingName +SettingValue +Settings +SettingsForUpdate +SettingsGroup +Setup +SetupFailed +SetupModeDisabled +SetupScriptDetails +Severe +Severities +Severity +SeverityCounts +SeverityLabel +SeverityLevel +SeverityNormalized +SeverityProduct +SeverityRating +SeveritySummary +SeverityUpdate +SftpAuthenticationMethods +SftpConfig +SftpConnectorConfig +Sha1 +ShadowColor +ShadowModeConfig +ShadowModelVariantConfig +ShadowModelVariantName +ShadowModelVariants +ShadowOpacity +ShadowProductionVariants +ShadowXOffset +ShadowYOffset +ShapBaseline +ShapBaselineConfig +ShapBaselineUri +ShapConfig +Shape +ShapeConditionalFormat +Shard +ShardConfiguration +ShardConfigurationRequest +ShardCount +ShardDetail +ShardFilter +ShardId +ShardIterator +ShardIteratorType +ShardLevelMetrics +ShardLimit +ShardName +ShardNotFoundFault +ShardToMerge +ShardToSplit +Shards +ShardsPerClusterQuotaExceededFault +ShareAttributes +ShareDetails +ShareDirectoryRequest +ShareDirectoryResult +ShareError +ShareErrors +ShareId +ShareInvitation +ShareInvitationAction +ShareInvitationId +ShareInvitationSummaries +ShareInvitationSummary +ShareLimitExceededException +ShareMethod +ShareNotes +SharePointConfiguration +SharePointVersion +SharePrincipal +SharePrincipals +ShareResourceType +ShareResult +ShareResults +ShareRule +ShareRules +ShareStatus +ShareTagOptions +ShareTarget +SharedAccountId +SharedAwsAccountIds +SharedBy +SharedDirectories +SharedDirectory +SharedDirectoryId +SharedDirectoryIds +SharedDocumentVersion +SharedFileSystemConfiguration +SharedImagePermissions +SharedImagePermissionsList +SharedMemorySize +SharedRoutesEnabled +SharedSecret +SharedSegments +SharedSnapshotQuotaExceededFault +SharedWith +SharedWithPrefix +SharingModel +SharingSettings +Sharpening +Sharpness +Sheet +SheetContentType +SheetControlInfoIconLabelOptions +SheetControlLayout +SheetControlLayoutConfiguration +SheetControlLayouts +SheetControlsOption +SheetDefinition +SheetElementConfigurationOverrides +SheetElementRenderingRule +SheetId +SheetIndexes +SheetLayoutElementMaximizationOption +SheetNames +SheetSelections +SheetStyle +SheetTextBox +SheetTextBoxId +SheetVisualScopingConfiguration +SheetVisualScopingConfigurations +Sheets +ShellHistoryFilePath +ShellVersion +ShiftCoverages +ShiftDetails +Shipment +ShipmentCarrier +ShipmentInformation +ShipmentState +ShipmentTrackingNumber +ShippingAddress +ShippingDetails +ShippingOption +ShortCode +ShortDescription +ShortFormatText +ShortName +Shortened +Shortname +ShotFilter +ShotSegment +ShouldDecrementDesiredCapacity +ShouldRespectGracePeriod +Show +ShowAlternatives +ShowAssignedLFTags +ShowCacheClustersNotInReplicationGroups +ShowCacheNodeInfo +ShowDetail +ShowMemberInfo +ShowNodeGroupConfig +ShowNodeLevelUpdateStatus +ShowShardDetails +ShowSpeakerLabel +ShowSpeakerLabels +ShrinkPolicy +ShuffleConfig +Shutdown +ShutdownEventConfiguration +ShutdownGatewayInput +ShutdownGatewayOutput +ShuttingDown +Sid +SideSpecificBorder +Sidewalk +SidewalkAccountInfo +SidewalkAccountInfoWithFingerprint +SidewalkCreateWirelessDevice +SidewalkDevice +SidewalkDeviceMetadata +SidewalkEventNotificationConfigurations +SidewalkGetDeviceProfile +SidewalkGetStartImportInfo +SidewalkId +SidewalkListDevice +SidewalkManufacturingSn +SidewalkResourceTypeEventConfiguration +SidewalkSendDataToDevice +SidewalkSingleStartImportInfo +SidewalkStartImportInfo +SidewalkUpdateAccount +SidewalkUpdateImportInfo +SigKeyCrc +SigV4Authorization +Sign +SignInConfig +SignInDistribution +SignInMethod +SignInUrl +SignInWithApple +SignKey +SignOutUserRequest +SignPayloadRequest +SignPayloadResponse +SignRequest +SignResponse +SignUpRequest +SignUpResponse +Signal +SignalApplicationInstanceNodeInstancesRequest +SignalApplicationInstanceNodeInstancesResponse +SignalCatalogSummary +SignalDecoder +SignalExternalWorkflowExecutionDecisionAttributes +SignalExternalWorkflowExecutionFailedEventAttributes +SignalExternalWorkflowExecutionInitiatedEventAttributes +SignalInformation +SignalProcessingNotification +SignalResourceInput +SignalType +SignalWorkflowExecutionInput +SignalingUrl +Signature +SignatureAlgorithm +SignatureDetection +SignatureDetections +SignatureValid +SignatureValidityPeriod +Signed +SignedCert +SignedHeaders +SignedObject +SignedToken +SignedUrl +SignedUrlExpiresAt +Signer +SigninDelegateGroup +SigninDelegateGroups +SigningAlg +SigningAlgorithm +SigningAlgorithmMnemonic +SigningAlgorithmType +SigningAlgorithms +SigningAttributes +SigningAttributesOrigin +SigningBehavior +SigningCertificate +SigningConfiguration +SigningConfigurationOverrides +SigningEnabled +SigningImageFormat +SigningJob +SigningJobArn +SigningJobRevocationRecord +SigningKeyAlgorithm +SigningKeyCertificate +SigningKeyCertificateChain +SigningMaterial +SigningPlatform +SigningPlatformOverrides +SigningProfile +SigningProfileParameter +SigningProfileRevocationRecord +SigningProfileVersionArn +SigningProfileVersionArns +SigningProtocol +SignupResponse +SilentPush +Similarity +SimilarityThreshold +Simple +SimpleAddress +SimpleAttributeAggregation +SimpleClusterMarker +SimpleCondition +SimpleCriterionForJob +SimpleEmail +SimpleEmailPart +SimpleNumericalAggregation +SimpleRule +SimpleRuleEvaluation +SimpleScalingPolicyConfiguration +SimpleScopeTerm +SimpleUser +SimplifiedApplication +SimplifiedColor +SimulateCustomPolicyRequest +SimulatePolicyResponse +SimulatePrincipalPolicyRequest +SimulateReservedQueue +Simulation +SimulationAppEndpointInfo +SimulationAppMetadata +SimulationAppPortMapping +SimulationApplicationConfig +SimulationApplicationSummary +SimulationClock +SimulationJob +SimulationJobBatchSummary +SimulationJobRequest +SimulationJobSummary +SimulationMetadata +SimulationSoftwareSuite +Simulations +SinceCrawlDate +SingleAvailabilityZone +SingleHeader +SingleHeaderConfig +SingleInstanceHealth +SingleInstanceType +SingleMasterChannelEndpointConfiguration +SingleMasterConfiguration +SingleMetricAnomalyDetector +SingleMetricVisibility +SingleQueryArgument +SingleSelectOptions +SingleSelectQuestionRuleCategoryAutomation +SingleSignOnManagedApplicationInstanceId +SingleSignOnUserIdentifier +SingleSignOnUserValue +SingleWeightConfig +Singular +SingularConnectorProfileCredentials +SingularConstant +SingularSourceProperties +SinkArn +SinkId +SinkIdentifier +SinkType +Sinks +SipAddress +SipAddresses +SipHeaders +SipMediaApplication +SipMediaApplicationAlexaSkillConfiguration +SipMediaApplicationArn +SipMediaApplicationCall +SipMediaApplicationEndpoint +SipMediaApplicationId +SipMediaApplicationLoggingConfiguration +SipMediaApplications +SipRule +SipRuleId +SipRuleTargetApplication +SipRules +Site +SiteArn +SiteBaseUrl +SiteId +SiteIds +SiteMaps +SiteMapsConfiguration +SitePlan +SiteToSiteVpnAttachment +SiteUrl +Sites +Size +SizeBytes +SizeClassified +SizeConstraint +SizeConstraintSet +SizeConstraintSetId +SizeConstraintSetSummary +SizeConstraintSetUpdate +SizeConstraintSets +SizeConstraintStatement +SizeConstraints +SizeEstimateRangeGB +SizeFlexEligible +SizeInBytes +SizeInGB +SizeInMBs +SizeInMegabytes +SizeInMiB +SizeLabelOptions +SizeOnDisk +SizePercent +SizeRange +SizeUnit +Sizes +SizingOptions +SizingPolicy +SkewedColumnNames +SkewedColumnValueLocationMaps +SkewedColumnValues +SkewedInfo +SkillDetails +SkillGroup +SkillGroupArn +SkillGroupData +SkillGroupName +SkillGroups +SkillId +SkillName +SkillNotLinkedException +SkillSummaries +SkillSummary +SkillType +SkillTypes +SkillsStoreSkill +SkillsStoreSkills +SkipArchive +SkipCheck +SkipDestinationValidation +SkipFinalBackup +SkipFinalClusterSnapshot +SkipFinalSnapshot +SkipFirst +SkipMatching +SkipModelValidation +SkipTunnelReplacement +SkipUnavailable +SkipWaitTimeForInstanceTerminationInput +Skipped +SkippedIPRangeList +SkippedRecordCount +SkippedTermCount +SkippedUsers +SkippedVolumeDetails +Sku +SlaMet +Slack +SlackChannelConfiguration +SlackConfiguration +SlackConnectorProfileCredentials +SlackConnectorProfileProperties +SlackEntityList +SlackMetadata +SlackSourceProperties +SlackWorkspaceConfiguration +Slate +SlateAdUrl +SlateSource +SlaveInstanceType +Slices +Slider +SliderControlDisplayOptions +Slot +SlotCaptureSetting +SlotDateTimeRangeRequest +SlotDefaultValue +SlotDefaultValueSpec +SlotDefaultValueSpecification +SlotDurationInHours +SlotFilter +SlotMigration +SlotName +SlotNotAvailableException +SlotPriority +SlotResolutionTestResultItem +SlotResolutionTestResultItemCounts +SlotSortBy +SlotStartTimeRange +SlotStartTimeRangeRequest +SlotSuggestions +SlotSummary +SlotTypeConfiguration +SlotTypeFilter +SlotTypeMetadata +SlotTypeRegexConfiguration +SlotTypeSortBy +SlotTypeStatistics +SlotTypeSummary +SlotTypeValue +SlotValue +SlotValueElicitationSetting +SlotValueOverride +SlotValueRegexFilter +SlotValueSelectionSetting +Slots +SlowDownException +SlowPal +SmallImageIconUrl +SmallMultiples +SmallMultiplesAxisProperties +SmallMultiplesLimitConfiguration +SmallMultiplesOptions +SmallMultiplesSort +SmartHomeAppliance +SmartHomeAppliances +Smb +SmbMountOptions +Smile +SmoothStreaming +SmoothingLatency +Smpte2038DataPreference +SmpteTtDestinationSettings +SmsAuthenticationMessage +SmsConfiguration +SmsConfigurationFailure +SmsConfigurationType +SmsMessage +SmsMfaConfigType +SmsMfaConfiguration +SmsSettings +SmsVerificationMessage +SmtpReplyCode +SnapShotTimeFilter +SnapStart +SnapStartException +SnapStartNotReadyException +SnapStartResponse +SnapStartTimeoutException +SnaplockConfiguration +SnaplockRetentionPeriod +SnaplockType +SnappedDeparturePositions +SnappedDestinationPositions +Snapshot +SnapshotARN +SnapshotAlreadyExistsFault +SnapshotAnonymousUser +SnapshotAnonymousUserRedacted +SnapshotArn +SnapshotArns +SnapshotCapacityUsed +SnapshotClusterIdentifier +SnapshotConfiguration +SnapshotCopyAlreadyDisabledFault +SnapshotCopyAlreadyEnabledFault +SnapshotCopyDisabledFault +SnapshotCopyGrant +SnapshotCopyGrantAlreadyExistsFault +SnapshotCopyGrantMessage +SnapshotCopyGrantName +SnapshotCopyGrantNotFoundFault +SnapshotCopyGrantQuotaExceededFault +SnapshotCopyGrants +SnapshotCreateTime +SnapshotCreationTime +SnapshotCreationTimestamp +SnapshotDatabaseTime +SnapshotDescription +SnapshotDestinationConfiguration +SnapshotDetail +SnapshotDetails +SnapshotDiskContainer +SnapshotDownloadUrl +SnapshotErrorMessage +SnapshotFeatureNotSupportedFault +SnapshotFile +SnapshotFileGroup +SnapshotFileSheetSelection +SnapshotFilter +SnapshotId +SnapshotIdentifier +SnapshotIdentifierList +SnapshotIds +SnapshotInfo +SnapshotJobErrorInfo +SnapshotJobId +SnapshotJobResult +SnapshotJobResultErrorInfo +SnapshotJobResultFileGroup +SnapshotJobS3Result +SnapshotLimitExceededException +SnapshotLimits +SnapshotMessage +SnapshotName +SnapshotNotFound +SnapshotNotFoundFault +SnapshotOptions +SnapshotOptionsStatus +SnapshotOwner +SnapshotPolicy +SnapshotQuotaExceededFault +SnapshotRecycleBinInfo +SnapshotRetentionLimit +SnapshotRetentionStartTime +SnapshotS3DestinationConfiguration +SnapshotS3Location +SnapshotSchedule +SnapshotScheduleAlreadyExistsFault +SnapshotScheduleIdentifier +SnapshotScheduleNotFoundFault +SnapshotScheduleQuotaExceededFault +SnapshotScheduleState +SnapshotScheduleUpdateInProgressFault +SnapshotSchedules +SnapshotSizeInMegaBytes +SnapshotSortingEntity +SnapshotSource +SnapshotStatus +SnapshotSummaries +SnapshotSummary +SnapshotTarget +SnapshotTaskDetail +SnapshotTierStatus +SnapshotTierStatuses +SnapshotTime +SnapshotType +SnapshotUserConfiguration +SnapshotUserConfigurationRedacted +SnapshotVersion +SnapshotWindow +Snapshots +SnapshotsData +SnapshotsDataHeader +SnapshotsEnabled +SnapshotsEnabledUpdate +SnapshottingClusterId +SnoozeActionConfiguration +SnoozeAlarmActionRequest +SnowballAmiId +SnowballCapacityPreference +SnowballId +SnowballLimit +SnowballType +SnowballsInUse +SnowconeDeviceConfiguration +Snowflake +SnowflakeConnectorProfileCredentials +SnowflakeConnectorProfileProperties +SnowflakeDestinationProperties +SnowflakeMetadata +SnowflakeNodeData +SnowflakeParameters +SnowflakeSource +SnowflakeTarget +Snr +Sns +SnsAction +SnsCallerArn +SnsChannelConfig +SnsConfiguration +SnsDataSource +SnsDestination +SnsFormat +SnsRegion +SnsRoleName +SnsTopic +SnsTopicARN +SnsTopicArn +SnsTopicConfiguration +SnsTopicName +SnsTopicSinkConfiguration +SnsTopicStatus +SocialProviderSettings +SocketAddress +SocketPath +Sockets +SoftIRQ +SoftLimit +Softness +Software +SoftwareDetails +SoftwareInformation +SoftwarePackage +SoftwareToUpdate +SoftwareTokenMFANotFoundException +SoftwareTokenMfaConfigType +SoftwareTokenMfaConfiguration +SoftwareTokenMfaSettings +SoftwareTokenMfaSettingsType +SoftwareUpdateOptions +SoftwareUpdateOptionsStatus +SoftwareUpdatesEndDate +SoftwareVersion +Solid +Solution +SolutionConfig +SolutionStackDescription +SolutionStackDetails +SolutionStackName +SolutionStacks +SolutionSummary +SolutionVersion +SolutionVersionSummary +SolveTimestamp +SolverProvider +SolverType +SolverVersion +Solvers +SopRecommendation +Sort +SortAscending +SortBy +SortByMetric +SortColumns +SortCondition +SortConfiguration +SortCriteria +SortCriterion +SortDefinition +SortDirection +SortEnabled +SortExpression +SortIconVisibility +SortKey +SortOrder +SortPaths +SortProperty +Sortable +SortingConfiguration +SortingEntities +Sound +Source +Source608ChannelNumber +Source608TrackNumber +SourceARN +SourceAccessConfiguration +SourceAccessConfigurations +SourceAccount +SourceAccountId +SourceAddress +SourceAddresses +SourceAlgorithm +SourceAlgorithmSpecification +SourceAlgorithms +SourceAnalysis +SourceAncillaryChannelNumber +SourceAndDestinationAreSameException +SourceApiAssociation +SourceApiAssociationConfig +SourceApiAssociationSummary +SourceApplicationName +SourceApplicationUrl +SourceArn +SourceArnPrefix +SourceAuth +SourceBackup +SourceBackupArn +SourceBackupId +SourceBackupRegion +SourceBackupUnavailable +SourceBackupVaultArn +SourceBackupVaultName +SourceBranchName +SourceBucket +SourceBucketArn +SourceBuildInformation +SourceBundle +SourceBundleDeletionException +SourceCacheNodeId +SourceCidrBlock +SourceCloudProperties +SourceCluster +SourceClusterInfo +SourceClusterNotSupportedFault +SourceCode +SourceCodeArchiveUrl +SourceCodeArtifactsObjectKey +SourceCodeRepository +SourceCodeType +SourceCodeUrl +SourceCodeVersion +SourceColumn +SourceCommit +SourceConfig +SourceConfiguration +SourceConnection +SourceConnectionDetail +SourceConnectionParameters +SourceConnectorProperties +SourceConnectorType +SourceContactId +SourceContainer +SourceControlDetails +SourceControls +SourceCredentialsInfo +SourceCustomDbEngineVersionIdentifier +SourceDBClusterIdentifier +SourceDBClusterParameterGroupIdentifier +SourceDBClusterSnapshotArn +SourceDBClusterSnapshotIdentifier +SourceDBInstanceArn +SourceDBInstanceAutomatedBackupsArn +SourceDBInstanceIdentifier +SourceDBParameterGroupIdentifier +SourceDBSnapshotIdentifier +SourceDataColumnProperties +SourceDataProviderDescriptors +SourceDatabaseName +SourceDatabaseNotSupportedFault +SourceDatasetArn +SourceDbClusterResourceId +SourceDbSnapshotIdentifier +SourceDbiResourceId +SourceDescription +SourceDestCheck +SourceDetail +SourceDetails +SourceDirectory +SourceDocument +SourceDocuments +SourceDocumentsS3Uri +SourceDomain +SourceDomainInfo +SourceEncryptionAlgorithm +SourceEncryptionContext +SourceEndBehavior +SourceEndpointArn +SourceEngine +SourceEngineName +SourceEngineVersion +SourceEntity +SourceEntityArn +SourceEnvironmentId +SourceEnvironmentName +SourceFailoverConfig +SourceField +SourceFieldProperties +SourceFields +SourceFile +SourceFileLocation +SourceFileOrContentRequiredException +SourceFileSpecifier +SourceFileSystemArn +SourceFileSystemId +SourceFileSystemRegion +SourceFiles +SourceFilterId +SourceFlowConfig +SourceFpgaImageId +SourceGroup +SourceId +SourceIdType +SourceIdentifier +SourceIdentity +SourceIds +SourceIdsList +SourceImage +SourceImageFace +SourceImageId +SourceImageName +SourceImageOrientationCorrection +SourceIp +SourceIpConditionConfig +SourceIpConfig +SourceIpV4 +SourceIpV6 +SourceIpamPoolId +SourceIps +SourceItemsLimit +SourceKeyId +SourceKeyword +SourceLanguageCode +SourceLastUpdatedTimestampFormat +SourceLayerArn +SourceLayerHash +SourceLicenseContext +SourceListenerAddress +SourceListenerPort +SourceLocation +SourceLocationArn +SourceLocationName +SourceMac +SourceMember +SourceMetadata +SourceModelArn +SourceModelVariantName +SourceModelVersionArn +SourceName +SourceNetwork +SourceNetworkData +SourceNetworkInterfaceArns +SourceNotFoundFault +SourceObject +SourceObjectReference +SourceOptionGroup +SourceOptionGroupIdentifier +SourceParameterName +SourceParameters +SourceParentId +SourceParentNotFoundException +SourcePath +SourcePhoneNumber +SourcePipelineExecutionArn +SourcePolicyId +SourcePolicyType +SourcePort +SourcePortRange +SourcePortRanges +SourcePortfolioId +SourcePorts +SourcePrefix +SourcePrefixLists +SourcePriority +SourceProductArn +SourceProjectArn +SourceProjectVersionArn +SourceProperties +SourceProvisioningArtifactIdentifiers +SourceQueue +SourceRecoveryPointArn +SourceRefContains +SourceRegion +SourceRegionMessage +SourceRegions +SourceRepository +SourceReservedNode +SourceReservedNodeCount +SourceReservedNodeId +SourceReservedNodeType +SourceResourceArn +SourceResourceName +SourceResourceType +SourceResult +SourceRevision +SourceRoleArn +SourceS3Location +SourceS3Path +SourceSchema +SourceSchemaName +SourceSecurityGroup +SourceSecurityGroupName +SourceSecurityGroupOwnerId +SourceSegments +SourceSelectionCriteria +SourceServer +SourceServerActionDocument +SourceServerActionsRequestFilters +SourceSettings +SourceSheetControlId +SourceSnapshotClusterIdentifier +SourceSnapshotId +SourceSnapshotIdentifier +SourceSnapshotIds +SourceSnapshotName +SourceStackId +SourceTable +SourceTableArn +SourceTableDetails +SourceTableFeatureDetails +SourceTableName +SourceTemplate +SourceText +SourceType +SourceTypes +SourceURI +SourceUpdateToken +SourceUri +SourceUrl +SourceUser +SourceUserIdentifier +SourceVersion +SourceVolume +SourceVolumeARN +SourceVpc +SourceWatermarkStatus +SourceWorkspaceId +Sources +South +Space +SpaceArn +SpaceConfiguration +SpaceDetails +SpaceFieldMappings +SpaceName +SpaceNameContains +SpaceNameEquals +SpaceSettings +SpaceSummary +Spaces +Spacing +SpamCount +SpamPercentage +SpamRawCount +Span +SparkConnectorSource +SparkConnectorTarget +SparkParameters +SparkProperties +SparkSQL +SparkSqlJobDriver +SparkSubmit +SparkSubmitJobDriver +Sparkline +SparqlData +SparqlRecord +SparseTrackType +SpatialAdaptiveQuantization +SpatialAq +SpatialDataOptionToGeoJsonFunctionName +SpatialFilterSettings +SpawnRate +SpdxLicenseId +Speaker +SpeakerEnrollmentJob +SpeakerEnrollmentJobSummary +SpeakerId +SpeakerSearchDetails +SpeakerSearchResult +SpeakerSearchStatus +SpeakerSearchTask +SpeakerSearchTaskId +SpeakerSearchTaskStatus +SpeakerSummaries +SpeakerSummary +Spec +SpecialFeature +SpecialValue +Specialty +SpecifedOrder +Specification +Specifications +SpecifiedImage +SpectrumConfig +SpeechMarkTypes +SpeechThreshold +Speed +SpekeKeyProvider +SpekeKeyProviderCmaf +SpellCorrectedQueries +SpellCorrectedQuery +SpellCorrectionConfiguration +Spend +SpendCoveredBySavingsPlans +SpendLimit +SpendLimits +SpfPercentage +Spigot +SpliceEventId +SpliceInsertMessage +Split +SplitChargeRules +SplitDocument +SplitDocuments +SplitFields +SplitShardInput +SplitTunnel +SplitType +SplunkDestinationConfiguration +SplunkDestinationDescription +SplunkDestinationUpdate +SplunkRetryOptions +SpotAllocationStrategy +SpotCapacityRebalance +SpotDatafeedSubscription +SpotFleetLaunchSpecification +SpotFleetMonitoring +SpotFleetRequestConfig +SpotFleetRequestConfigData +SpotFleetRequestConfigs +SpotFleetRequestId +SpotFleetRequestIds +SpotFleetRequestState +SpotFleetTagSpecification +SpotInstancePools +SpotInstanceRequest +SpotInstanceRequestId +SpotInstanceRequestIds +SpotInstanceRequests +SpotInstanceStateFault +SpotInstanceStatus +SpotInstanceType +SpotMaintenanceStrategies +SpotMarketOptions +SpotMaxPrice +SpotMaxPricePercentageOverLowestPrice +SpotMaxTotalPrice +SpotOptions +SpotOptionsRequest +SpotPlacement +SpotPlacementScore +SpotPlacementScores +SpotPrice +SpotPriceHistory +SpotProvisioningSpecification +SpotResizeSpecification +SpotResizingSpecification +SpotSpecification +SpotTargetCapacity +SpreadDomain +SpreadLevel +Sql +SqlAlias +SqlAliases +SqlApplicationConfiguration +SqlApplicationConfigurationDescription +SqlApplicationConfigurationUpdate +SqlConfiguration +SqlEndpointPath +SqlInjectionMatchSet +SqlInjectionMatchSetId +SqlInjectionMatchSetSummary +SqlInjectionMatchSetUpdate +SqlInjectionMatchSets +SqlInjectionMatchTuple +SqlInjectionMatchTuples +SqlParameter +SqlParseException +SqlQuery +SqlQueryDatasetAction +SqlRunConfiguration +SqlRunConfigurations +SqlServerParameters +SqlStatementResult +SqlType +SqliMatchStatement +Sqls +SqsAction +SqsFailureFeedbackRoleArn +SqsParameters +SqsQueueArn +SqsQueueConfiguration +SqsQueueParameters +SqsQueueSinkConfiguration +SqsQueueUrl +SqsSuccessFeedbackRoleArn +Squash +SriovNetSupport +SrtDestinationSettings +SseAwsKmsKeyId +SseConfig +SseConfiguration +SseDescription +SseKmsEncryptedObjects +SseSpecification +SseType +SshCiphers +SshHostDsaKeyFingerprint +SshHostRsaKeyFingerprint +SshKexs +SshKey +SshKeyLastUpdated +SshKeyName +SshMacs +SshPublicKey +SshPublicKeyBody +SshPublicKeyCount +SshPublicKeyId +SshPublicKeys +SshUsername +Ssid +Ssl +SslCaCertificateArn +SslCertificateId +SslCertificateS3Path +SslClientCertificateArn +SslClientKeyArn +SslClientKeyPassword +SslConfiguration +SslEndpointIdentificationAlgorithm +SslMode +SslPolicies +SslPolicy +SslProperties +SslProtocols +SslSecurityProtocol +SslSupportMethod +SsmActionDefinition +SsmAutomation +SsmControls +SsmDocument +SsmOpsItemId +SsmParameterStoreParameter +Ssml +SsmlList +SsmlMarksNotSupportedForTextTypeException +SsoEnabled +Stable +Stack +StackArn +StackConfigInput +StackConfigurationManager +StackDriftDetectionId +StackDriftInformation +StackDriftInformationSummary +StackDriftStatus +StackError +StackErrors +StackEvent +StackEvents +StackId +StackIds +StackIdsUrl +StackInstance +StackInstanceAccount +StackInstanceComprehensiveStatus +StackInstanceFilter +StackInstanceNotFoundException +StackInstanceRegion +StackInstanceResourceDriftStatuses +StackInstanceResourceDriftsSummary +StackInstanceStatus +StackInstanceSummary +StackInstances +StackName +StackNames +StackNotFoundException +StackPolicyBody +StackPolicyDuringUpdateBody +StackPolicyDuringUpdateURL +StackPolicyURL +StackResource +StackResourceDetail +StackResourceDrift +StackResourceDriftInformation +StackResourceDriftInformationSummary +StackResourceDriftStatus +StackResourceDriftStatusFilters +StackResourceDrifts +StackResourceSummaries +StackResourceSummary +StackResources +StackSet +StackSetARN +StackSetAccounts +StackSetDriftDetectionDetails +StackSetFailureToleranceCount +StackSetFailureTolerancePercentage +StackSetId +StackSetMaxConcurrencyCount +StackSetMaxConcurrencyPercentage +StackSetName +StackSetNotEmptyException +StackSetNotFoundException +StackSetOperation +StackSetOperationPreferences +StackSetOperationResultSummary +StackSetOperationStatusDetails +StackSetOperationSummary +StackSetOperationType +StackSetRegions +StackSetSummary +StackStatus +StackStatusFilter +StackStatusReason +StackSummaries +StackSummary +Stacks +Stage +StageContext +StageDeclaration +StageDeployment +StageDeploymentDetails +StageDeploymentSummary +StageDeployments +StageDetails +StageExecution +StageId +StageIndex +StageKey +StageLastUpdatedDateTime +StageName +StageNotFoundException +StageNotRetryableException +StageReason +StageSession +StageSessionSummary +StageState +StageStatus +StageSummary +StageVariableOverrides +StageVariables +Stages +StagesAvailable +Staging +StagingArea +StagingDistributionDnsNames +StagingDistributionId +StagingDistributionInUse +StagingSourceServer +StagingTable +Stairs +StaleIpPermission +StaleIpPermissions +StaleIpPermissionsEgress +StaleRequestException +StaleSecurityGroup +StaleSecurityGroupSet +StaleTagException +StandByAvailabilityZoneCount +Standard +StandardErrorContent +StandardErrorUrl +StandardHlsSettings +StandardIdentifiers +StandardKnowledgeArticleTypeConfiguration +StandardLayout +StandardMessages +StandardMetricName +StandardObjectAttachmentConfiguration +StandardObjectConfigurations +StandardOutputContent +StandardOutputUrl +Standards +StandardsArn +StandardsControl +StandardsControlArn +StandardsControlArns +StandardsControlAssociationDetail +StandardsControlAssociationDetails +StandardsControlAssociationId +StandardsControlAssociationIds +StandardsControlAssociationSummaries +StandardsControlAssociationSummary +StandardsControlAssociationUpdate +StandardsControlAssociationUpdates +StandardsControlDescription +StandardsControlTitle +StandardsId +StandardsInput +StandardsManagedBy +StandardsStatus +StandardsStatusReason +StandardsSubscription +StandardsSubscriptionArn +StandardsSubscriptionArns +StandardsSubscriptionRequest +StandardsSubscriptionRequests +StandardsSubscriptions +StandbyDelayTime +StandbyInstances +StandbyWorkspace +StandbyWorkspaceRequest +StandbyWorkspaces +Start +StartAccessLoggingInput +StartActivity +StartActivityStreamRequest +StartActivityStreamResponse +StartAfter +StartAfterDateTime +StartAngle +StartAnnotationImportRequest +StartAnnotationImportResponse +StartAppAssessmentRequest +StartAppAssessmentResponse +StartAppBlockBuilderRequest +StartAppBlockBuilderResult +StartAppInput +StartAppOutput +StartAppReplicationRequest +StartApplicationRefreshInput +StartApplicationRefreshOutput +StartApplicationRequest +StartArns +StartAssessmentFrameworkShareRequest +StartAssessmentFrameworkShareResponse +StartAssessmentRequest +StartAssessmentResponse +StartAssessmentRunRequest +StartAssessmentRunResponse +StartAssetBundleExportJobRequest +StartAssetBundleExportJobResponse +StartAssetBundleImportJobRequest +StartAssetBundleImportJobResponse +StartAssociationsOnceRequest +StartAt +StartAttachmentUploadRequest +StartAttachmentUploadResponse +StartAuditMitigationActionsTaskRequest +StartAuditMitigationActionsTaskResponse +StartAutomationExecutionRequest +StartAutomationExecutionResult +StartAvailabilityMonitorTestInput +StartAvailabilityMonitorTestOutput +StartBackupJobInput +StartBackupJobOutput +StartBatchJobRequest +StartBatchJobResponse +StartBgpFailoverTestRequest +StartBgpFailoverTestResponse +StartBillingPeriod +StartBlueprintRunRequest +StartBlueprintRunResponse +StartBotRecommendationRequest +StartBotRecommendationResponse +StartBuildBatchInput +StartBuildBatchOutput +StartBuildInput +StartBuildOutput +StartBulkAssociateWirelessDeviceWithMulticastGroupRequest +StartBulkDeploymentRequest +StartBulkDeploymentResponse +StartBulkDisassociateWirelessDeviceFromMulticastGroupRequest +StartBy +StartCalculationExecutionRequest +StartCalculationExecutionResponse +StartCallAnalyticsJobRequest +StartCallAnalyticsJobResponse +StartCallAnalyticsStreamTranscriptionRequest +StartCallAnalyticsStreamTranscriptionResponse +StartCampaignRequest +StartCanaryRequest +StartCelebrityRecognitionRequest +StartCelebrityRecognitionResponse +StartChangeRequestExecutionRequest +StartChangeRequestExecutionResult +StartChangeSetRequest +StartChangeSetResponse +StartChannelRequest +StartChannelResponse +StartChatContactRequest +StartChatContactResponse +StartChildWorkflowExecutionDecisionAttributes +StartChildWorkflowExecutionFailedEventAttributes +StartChildWorkflowExecutionInitiatedEventAttributes +StartClockInput +StartCodegenJobData +StartCodegenJobRequest +StartCodegenJobResponse +StartColumn +StartColumnIndex +StartCommand +StartCondition +StartConfigRulesEvaluationRequest +StartConfigurationRecorderRequest +StartConfigurationSessionRequest +StartConfigurationSessionResponse +StartConnectionRequest +StartConnectionResponse +StartContactEvaluationRequest +StartContactEvaluationResponse +StartContactRecordingRequest +StartContactStreamingRequest +StartContactStreamingResponse +StartContentModerationRequest +StartContentModerationResponse +StartContentUploadRequest +StartContentUploadResponse +StartContinentCode +StartContinuousExportResponse +StartConversationRequest +StartConversationResponse +StartCopyJobInput +StartCopyJobOutput +StartCostEstimationRequest +StartCountryCode +StartCrawlerRequest +StartCrawlerScheduleRequest +StartCutoverRequest +StartCutoverResponse +StartDBClusterMessage +StartDBClusterResult +StartDBInstanceAutomatedBackupsReplicationMessage +StartDBInstanceAutomatedBackupsReplicationResult +StartDBInstanceMessage +StartDBInstanceResult +StartDICOMImportJobRequest +StartDICOMImportJobResponse +StartDashboardSnapshotJobRequest +StartDashboardSnapshotJobResponse +StartDataCollectionByAgentIdsRequest +StartDataCollectionByAgentIdsResponse +StartDataIngestionJobRequest +StartDataIngestionJobResponse +StartDataQualityRuleRecommendationRunRequest +StartDataQualityRuleRecommendationRunResponse +StartDataQualityRulesetEvaluationRunRequest +StartDataQualityRulesetEvaluationRunResponse +StartDataSourceSyncJobRequest +StartDataSourceSyncJobResponse +StartDate +StartDateTime +StartDeliveryStreamEncryptionInput +StartDeploymentRequest +StartDeploymentResponse +StartDeploymentResult +StartDetectMitigationActionsTaskRequest +StartDetectMitigationActionsTaskResponse +StartDetectorModelAnalysisRequest +StartDetectorModelAnalysisResponse +StartDevEnvironmentRequest +StartDevEnvironmentResponse +StartDevEnvironmentSessionRequest +StartDevEnvironmentSessionResponse +StartDeviceAuthorizationRequest +StartDeviceAuthorizationResponse +StartDeviceSyncRequest +StartDiscovererRequest +StartDiscovererResponse +StartDiscoveryJobRequest +StartDiscoveryJobResponse +StartDocumentAnalysisRequest +StartDocumentAnalysisResponse +StartDocumentClassificationJobRequest +StartDocumentClassificationJobResponse +StartDocumentTextDetectionRequest +StartDocumentTextDetectionResponse +StartDominantLanguageDetectionJobRequest +StartDominantLanguageDetectionJobResponse +StartEarthObservationJobInput +StartEarthObservationJobOutput +StartEdgeConfigurationUpdateInput +StartEdgeConfigurationUpdateOutput +StartEdgeDeploymentStageRequest +StartElasticsearchServiceSoftwareUpdateRequest +StartElasticsearchServiceSoftwareUpdateResponse +StartEngagementRequest +StartEngagementResult +StartEntitiesDetectionJobRequest +StartEntitiesDetectionJobResponse +StartEntitiesDetectionV2JobRequest +StartEntitiesDetectionV2JobResponse +StartError +StartEventDataStoreIngestionRequest +StartEventTime +StartEventsDetectionJobRequest +StartEventsDetectionJobResponse +StartExecutionInput +StartExecutionOutput +StartExpenseAnalysisRequest +StartExpenseAnalysisResponse +StartExperimentRequest +StartExperimentResponse +StartExportLabelsTaskRunRequest +StartExportLabelsTaskRunResponse +StartExportRequest +StartExportResponse +StartExportTaskMessage +StartExportTaskRequest +StartExportTaskResponse +StartExtensionPackAssociationMessage +StartExtensionPackAssociationResponse +StartFHIRExportJobRequest +StartFHIRExportJobResponse +StartFHIRImportJobRequest +StartFHIRImportJobResponse +StartFaceDetectionRequest +StartFaceDetectionResponse +StartFaceSearchRequest +StartFaceSearchResponse +StartFailbackLaunchRequest +StartFailbackLaunchResponse +StartFailed +StartFileTransferRequest +StartFileTransferResponse +StartFleetActionsInput +StartFleetActionsOutput +StartFleetRequest +StartFlowRequest +StartFlowResponse +StartFlywheelIterationRequest +StartFlywheelIterationResponse +StartFrameNumber +StartFraudsterRegistrationJobRequest +StartFraudsterRegistrationJobResponse +StartFromRow +StartFuotaTaskRequest +StartGUISessionRequest +StartGUISessionResult +StartGameSessionPlacementInput +StartGameSessionPlacementOutput +StartGatewayInput +StartGatewayOutput +StartGeneratedCodeJobRequest +StartGeneratedCodeJobResult +StartHour +StartHourOfDay +StartHumanLoopRequest +StartHumanLoopResponse +StartICD10CMInferenceJobRequest +StartICD10CMInferenceJobResponse +StartImageBuilderRequest +StartImageBuilderResult +StartImagePipelineExecutionRequest +StartImagePipelineExecutionResponse +StartImageScanRequest +StartImageScanResponse +StartImportFileTaskRequest +StartImportFileTaskResponse +StartImportLabelsTaskRunRequest +StartImportLabelsTaskRunResponse +StartImportRequest +StartImportResponse +StartImportTaskRequest +StartImportTaskResponse +StartIncidentInput +StartIncidentOutput +StartInferenceExperimentRequest +StartInferenceExperimentResponse +StartInferenceSchedulerRequest +StartInferenceSchedulerResponse +StartIngestion +StartIngestionRequest +StartInputDeviceMaintenanceWindowRequest +StartInputDeviceRequest +StartInstanceOnboardingJobRequest +StartInstanceOnboardingJobResponse +StartInstanceRefreshAnswer +StartInstanceRefreshType +StartInstanceRequest +StartInstanceResult +StartInstancesRequest +StartInstancesResult +StartJobRequest +StartJobResult +StartJobRunRequest +StartJobRunResponse +StartKeyPhrasesDetectionJobRequest +StartKeyPhrasesDetectionJobResponse +StartKeyUsageInput +StartKeyUsageOutput +StartLabelDetectionRequest +StartLabelDetectionResponse +StartLambdaFunctionFailedEventAttributes +StartLaunchRequest +StartLaunchResponse +StartLendingAnalysisRequest +StartLendingAnalysisResponse +StartLifecyclePolicyPreviewRequest +StartLifecyclePolicyPreviewResponse +StartLine +StartLoaderJobInput +StartLoaderJobOutput +StartLoggingRequest +StartLoggingTime +StartMLDataProcessingJobInput +StartMLDataProcessingJobOutput +StartMLEvaluationTaskRunRequest +StartMLEvaluationTaskRunResponse +StartMLLabelingSetGenerationTaskRunRequest +StartMLLabelingSetGenerationTaskRunResponse +StartMLModelTrainingJobInput +StartMLModelTrainingJobOutput +StartMLModelTransformJobInput +StartMLModelTransformJobOutput +StartMailboxExportJobRequest +StartMailboxExportJobResponse +StartMaintenanceRequest +StartMaintenanceResponse +StartMalwareScanRequest +StartMalwareScanResponse +StartMatchBackfillInput +StartMatchBackfillOutput +StartMatchingJobInput +StartMatchingJobOutput +StartMatchmakingInput +StartMatchmakingOutput +StartMedicalStreamTranscriptionRequest +StartMedicalStreamTranscriptionResponse +StartMedicalTranscriptionJobRequest +StartMedicalTranscriptionJobResponse +StartMeetingTranscriptionRequest +StartMessageMoveTaskRequest +StartMessageMoveTaskResult +StartMetadataModelAssessmentMessage +StartMetadataModelAssessmentResponse +StartMetadataModelConversionMessage +StartMetadataModelConversionResponse +StartMetadataModelExportAsScriptMessage +StartMetadataModelExportAsScriptResponse +StartMetadataModelExportToTargetMessage +StartMetadataModelExportToTargetResponse +StartMetadataModelImportMessage +StartMetadataModelImportResponse +StartMetricStreamsInput +StartMigrationMessage +StartMigrationRequest +StartMigrationResponse +StartMigrationWorkflowRequest +StartMigrationWorkflowResponse +StartMinuteOfHour +StartMode +StartModelPackagingJobRequest +StartModelPackagingJobResponse +StartModelRequest +StartModelResponse +StartMonitoringMemberRequest +StartMonitoringMembersRequest +StartMonitoringMembersResponse +StartMonitoringScheduleRequest +StartMulticastGroupSessionRequest +StartMultiplexRequest +StartMultiplexResponse +StartNetworkInsightsAccessScopeAnalysisRequest +StartNetworkInsightsAccessScopeAnalysisResult +StartNetworkInsightsAnalysisRequest +StartNetworkInsightsAnalysisResult +StartNetworkResourceUpdateRequest +StartNetworkResourceUpdateResponse +StartNextPendingJobExecutionRequest +StartNextPendingJobExecutionResponse +StartNotebookExecutionInput +StartNotebookExecutionOutput +StartNotebookInstanceInput +StartObjectInput +StartObjectOutput +StartOnCreation +StartOnDemandAppReplicationRequest +StartOnDemandAuditTaskRequest +StartOnDemandAuditTaskResponse +StartOnDemandReplicationRunRequest +StartOnDemandReplicationRunResponse +StartOrganizationServiceAccessUpdateRequest +StartOrganizationServiceAccessUpdateResponse +StartOutboundVoiceContactRequest +StartOutboundVoiceContactResponse +StartPHIDetectionJobRequest +StartPHIDetectionJobResponse +StartPercentage +StartPeriod +StartPersonTrackingRequest +StartPersonTrackingResponse +StartPiiEntitiesDetectionJobRequest +StartPiiEntitiesDetectionJobResponse +StartPipeRequest +StartPipeResponse +StartPipelineExecutionInput +StartPipelineExecutionOutput +StartPipelineExecutionRequest +StartPipelineExecutionResponse +StartPipelineReprocessingRequest +StartPipelineReprocessingResponse +StartPipelineRequest +StartPipelineResponse +StartPolicyGenerationRequest +StartPolicyGenerationResponse +StartPosition +StartProductSubscriptionRequest +StartProductSubscriptionResponse +StartProjectSessionRequest +StartProjectSessionResponse +StartProjectVersionRequest +StartProjectVersionResponse +StartProtectedQueryInput +StartProtectedQueryOutput +StartQueryExecutionInput +StartQueryExecutionOutput +StartQueryPlanningRequest +StartQueryPlanningResponse +StartQueryRequest +StartQueryResponse +StartReadSetActivationJobRequest +StartReadSetActivationJobResponse +StartReadSetActivationJobSourceItem +StartReadSetExportJobRequest +StartReadSetExportJobResponse +StartReadSetImportJobRequest +StartReadSetImportJobResponse +StartReadSetImportJobSourceItem +StartRecommendationReportGenerationRequest +StartRecommendationReportGenerationResponse +StartRecommendationsRequest +StartRecommendationsRequestEntry +StartRecommenderRequest +StartRecommenderResponse +StartRecordIdentifier +StartRecordName +StartRecordType +StartRecoveryRequest +StartRecoveryRequestSourceServer +StartRecoveryResponse +StartReferenceImportJobRequest +StartReferenceImportJobResponse +StartReferenceImportJobSourceItem +StartRelationalDatabaseRequest +StartRelationalDatabaseResult +StartRemediationExecutionRequest +StartRemediationExecutionResponse +StartReplayRequest +StartReplayResponse +StartReplicationMessage +StartReplicationRequest +StartReplicationResponse +StartReplicationTaskAssessmentMessage +StartReplicationTaskAssessmentResponse +StartReplicationTaskAssessmentRunMessage +StartReplicationTaskAssessmentRunResponse +StartReplicationTaskMessage +StartReplicationTaskResponse +StartReplicationTaskType +StartReplicationType +StartReportCreationInput +StartReportJobInput +StartReportJobOutput +StartRequest +StartResourceEvaluationRequest +StartResourceEvaluationResponse +StartResourceScanRequest +StartRestoreJobInput +StartRestoreJobOutput +StartRetrainingSchedulerRequest +StartRetrainingSchedulerResponse +StartRouteAnalysisRequest +StartRouteAnalysisResponse +StartRowIndex +StartRunRequest +StartRunResponse +StartRxNormInferenceJobRequest +StartRxNormInferenceJobResponse +StartSNOMEDCTInferenceJobRequest +StartSNOMEDCTInferenceJobResponse +StartSavingsPlansPurchaseRecommendationGenerationResponse +StartSchemaCreationRequest +StartSchemaCreationResponse +StartSchemaExtensionRequest +StartSchemaExtensionResult +StartSchemaMergeRequest +StartSchemaMergeResponse +StartSegmentDetectionFilters +StartSegmentDetectionRequest +StartSegmentDetectionResponse +StartSelector +StartSelectorType +StartSentimentDetectionJobRequest +StartSentimentDetectionJobResponse +StartServerRequest +StartServiceSoftwareUpdateRequest +StartServiceSoftwareUpdateResponse +StartSession +StartSessionRequest +StartSessionResponse +StartSessionResult +StartShotDetectionFilter +StartSigningJobParameter +StartSigningJobRequest +StartSigningJobResponse +StartSimulationInput +StartSimulationJobBatchRequest +StartSimulationJobBatchResponse +StartSimulationOutput +StartSingleWirelessDeviceImportTaskRequest +StartSingleWirelessDeviceImportTaskResponse +StartSmartHomeApplianceDiscoveryRequest +StartSnapshotRequest +StartSnapshotResponse +StartSourceNetworkRecoveryRequest +StartSourceNetworkRecoveryRequestNetworkEntry +StartSourceNetworkRecoveryResponse +StartSourceNetworkReplicationRequest +StartSourceNetworkReplicationResponse +StartSpeakerEnrollmentJobRequest +StartSpeakerEnrollmentJobResponse +StartSpeakerSearchTaskRequest +StartSpeakerSearchTaskResponse +StartSpeechSynthesisTaskInput +StartSpeechSynthesisTaskOutput +StartStackRequest +StartStageDeploymentRequest +StartStageDeploymentResult +StartStreamEncryptionInput +StartStreamProcessorRequest +StartStreamProcessorResponse +StartStreamTranscriptionRequest +StartStreamTranscriptionResponse +StartStreamingSessionRequest +StartStreamingSessionResponse +StartStudioSSOConfigurationRepairRequest +StartStudioSSOConfigurationRepairResponse +StartSubdivisionCode +StartSuiteRunRequest +StartSuiteRunResponse +StartSupportDataExportRequest +StartSupportDataExportResult +StartSyncExecutionInput +StartSyncExecutionOutput +StartTableDataImportJobRequest +StartTableDataImportJobResult +StartTargetedSentimentDetectionJobRequest +StartTargetedSentimentDetectionJobResponse +StartTaskContactRequest +StartTaskContactResponse +StartTaskExecutionRequest +StartTaskExecutionResponse +StartTaskRequest +StartTaskResponse +StartTechnicalCueDetectionFilter +StartTestExecutionRequest +StartTestExecutionResponse +StartTestRequest +StartTestResponse +StartTestSetGenerationRequest +StartTestSetGenerationResponse +StartTextDetectionFilters +StartTextDetectionRequest +StartTextDetectionResponse +StartTextTranslationJobRequest +StartTextTranslationJobResponse +StartThingRegistrationTaskRequest +StartThingRegistrationTaskResponse +StartTime +StartTimeFilter +StartTimeInclusive +StartTimeMillis +StartTimeOffset +StartTimeRange +StartTimecode +StartTimecodeSMPTE +StartTimeout +StartTimerDecisionAttributes +StartTimerFailedEventAttributes +StartTimestamp +StartTimestampMillis +StartTopicsDetectionJobRequest +StartTopicsDetectionJobResponse +StartTransaction +StartTransactionRequest +StartTransactionResponse +StartTransactionResult +StartTranscriptionJobRequest +StartTranscriptionJobResponse +StartTriggerRequest +StartTriggerResponse +StartUrl +StartUserAccessTasksRequest +StartUserAccessTasksResponse +StartUserImportJobRequest +StartUserImportJobResponse +StartValue +StartVariantImportRequest +StartVariantImportResponse +StartVectorEnrichmentJobInput +StartVectorEnrichmentJobOutput +StartViewerSessionRevocationRequest +StartVirtualMachinesMetadataSyncInput +StartVirtualMachinesMetadataSyncOutput +StartVoiceToneAnalysisTaskRequest +StartVoiceToneAnalysisTaskResponse +StartVpcEndpointServicePrivateDnsVerificationRequest +StartVpcEndpointServicePrivateDnsVerificationResult +StartWeekDay +StartWindowMinutes +StartWirelessDeviceImportTaskRequest +StartWirelessDeviceImportTaskResponse +StartWorkflowExecutionInput +StartWorkflowRunRequest +StartWorkflowRunResponse +StartWorkspaceRequests +StartWorkspacesRequest +StartWorkspacesResult +StartZonalShiftRequest +Started +StartedAfter +StartedAt +StartedBefore +StartedBy +StartedOn +StartedTimestamp +StartingAt +StartingBlockIndex +StartingEventBatchCondition +StartingHashKey +StartingInstances +StartingObjectName +StartingObjectPrefix +StartingOffsets +StartingPosition +StartingPositionTimestamp +StartingSequenceNumber +StartingTimestamp +StartoverWindowSeconds +StartsWith +StartupAction +StartupScriptS3ObjectVersion +StartupScriptS3Path +Stat +State +StateChangeConfiguration +StateChangeReason +StateDB +StateDescription +StateEnteredEventDetails +StateEquals +StateExitedEventDetails +StateFilter +StateInfo +StateLastUpdatedDateTime +StateMachineAliasListItem +StateMachineAlreadyExists +StateMachineArn +StateMachineDeleting +StateMachineDoesNotExist +StateMachineLimitExceeded +StateMachineListItem +StateMachineTypeNotSupported +StateMachineVersionListItem +StateMessage +StateOrProvince +StateOrRegion +StatePersistence +StatePersistenceConfigurations +StatePersistenceEnabled +StateReason +StateReasonCode +StateReasonData +StateStartTimestamp +StateTransitionReason +StateTransitionTime +StateTransitionedTimestamp +StateUpdatedTimestamp +StateValue +StatefulDefaultActions +StatefulEngineOptions +StatefulRule +StatefulRuleGroup +StatefulRuleGroupOverride +StatefulRuleGroupReference +StatefulRuleGroupReferences +StatefulRuleGroups +StatefulRuleOptions +StatefulRules +StatelessCustomActionDefinition +StatelessCustomActions +StatelessCustomPublishMetricAction +StatelessCustomPublishMetricActionDimension +StatelessDefaultActions +StatelessFragmentDefaultActions +StatelessRule +StatelessRuleGroup +StatelessRuleGroupReference +StatelessRuleGroupReferences +StatelessRuleGroups +StatelessRules +StatelessRulesAndCustomActions +Statement +StatementData +StatementId +StatementName +StatementOutput +StatementOutputData +StatementTimeoutException +StatementType +Statements +States +StatesArn +StatesExecutionArn +StatesInput +StatesStatus +StaticColumn +StaticConfiguration +StaticHyperParameters +StaticImageActivateScheduleActionSettings +StaticImageActivateSettings +StaticImageDeactivateScheduleActionSettings +StaticImageDeactivateSettings +StaticIp +StaticIpConnectionInfo +StaticKeyProvider +StaticKeySettings +StaticKeyValue +StaticMembers +StaticPolicyDefinition +StaticPolicyDefinitionDetail +StaticPolicyDefinitionItem +StaticRoutesOnly +StaticSourcesSupport +StaticValue +StaticValues +Station +Statistic +StatisticOverride +StatisticSet +StatisticValues +StatisticalThreshold +Statistics +StatisticsConfiguration +StatisticsConfigurations +StatisticsData +StatisticsNotAvailableException +StatisticsNotReadyYetException +StatisticsResource +StatisticsSummary +StatisticsType +StatmuxSettings +Stats +StatsAtAnomaly +StatsAtBaseline +StatsEvent +Status +Status2xx +Status3xx +Status4xx +Status5xx +StatusArn +StatusChangeDate +StatusCode +StatusCodes +StatusDescription +StatusDetail +StatusDetailFilters +StatusDetails +StatusEquals +StatusFilter +StatusFlag +StatusInformation +StatusInfos +StatusLastUpdatedDateTime +StatusList +StatusMessage +StatusMessageCode +StatusName +StatusReason +StatusReasonCode +StatusReasons +StatusReport +StatusStartTime +StatusStartTimestamp +StatusType +StatusUpdateInterval +StatusUpdateReason +Statuses +StdDev +StdErrorS3Uri +StdEvent +StdOutS3Uri +Stddev +StemmingDictionary +Step +StepAdjustment +StepAdjustments +StepAutomationConfiguration +StepCancellationOption +StepConcurrencyLevel +StepConfig +StepCount +StepDescription +StepDetail +StepDetails +StepDisplayName +StepExecution +StepExecutionFilter +StepExecutionId +StepExecutionStatusDetail +StepExecutions +StepExecutionsTruncated +StepFunctionStateMachineParameters +StepFunctions +StepFunctionsAction +StepId +StepIds +StepIndex +StepInfo +StepName +StepOutput +StepScalingPolicyConfiguration +StepSize +StepStateChangeReason +StepStates +StepStatus +StepSummary +StepTimeline +StepType +Steps +StepsCompleted +StepsList +StereoDownmix +StillContainsLinksException +StillEstimating +StillWaitingResponseSpecification +StopAccessLoggingInput +StopAction +StopActivityStreamRequest +StopActivityStreamResponse +StopAppBlockBuilderRequest +StopAppBlockBuilderResult +StopAppInput +StopAppReplicationRequest +StopApplicationRequest +StopAssessmentRequest +StopAssessmentRunRequest +StopAutoMLJobRequest +StopAutomationExecutionRequest +StopBackupJobInput +StopBgpFailoverTestRequest +StopBgpFailoverTestResponse +StopBotRecommendationRequest +StopBotRecommendationResponse +StopBuildBatchInput +StopBuildBatchOutput +StopBuildInput +StopBuildOutput +StopBulkDeploymentRequest +StopCalculationExecutionRequest +StopCalculationExecutionResponse +StopCampaignRequest +StopCanaryRequest +StopChannelRequest +StopChannelResponse +StopClockInput +StopCompilationJobRequest +StopConfigurationRecorderRequest +StopContactRecordingRequest +StopContactRequest +StopContactStreamingRequest +StopContinuousExportRequest +StopContinuousExportResponse +StopCrawlerRequest +StopCrawlerScheduleRequest +StopDBClusterMessage +StopDBClusterResult +StopDBInstanceAutomatedBackupsReplicationMessage +StopDBInstanceAutomatedBackupsReplicationResult +StopDBInstanceMessage +StopDBInstanceResult +StopDataCollectionByAgentIdsRequest +StopDataCollectionByAgentIdsResponse +StopDataSourceSyncJobRequest +StopDate +StopDeliveryStreamEncryptionInput +StopDeploymentInput +StopDeploymentOutput +StopDeploymentRequest +StopDevEnvironmentRequest +StopDevEnvironmentResponse +StopDevEnvironmentSessionRequest +StopDevEnvironmentSessionResponse +StopDiscovererRequest +StopDiscovererResponse +StopDiscoveryJobRequest +StopDominantLanguageDetectionJobRequest +StopDominantLanguageDetectionJobResponse +StopEarthObservationJobInput +StopEdgeDeploymentStageRequest +StopEdgePackagingJobRequest +StopEngagementRequest +StopEntitiesDetectionJobRequest +StopEntitiesDetectionJobResponse +StopEntitiesDetectionV2JobRequest +StopEntitiesDetectionV2JobResponse +StopEventDataStoreIngestionRequest +StopEventsDetectionJobRequest +StopEventsDetectionJobResponse +StopExecutionInput +StopExecutionOutput +StopExecutionTrigger +StopExperimentRequest +StopExperimentResponse +StopFailbackRequest +StopFailed +StopFleetActionsInput +StopFleetActionsOutput +StopFleetRequest +StopFlowRequest +StopFlowResponse +StopGUISessionRequest +StopGUISessionResult +StopGameSessionPlacementInput +StopGameSessionPlacementOutput +StopHumanLoopRequest +StopHyperParameterTuningJobRequest +StopICD10CMInferenceJobRequest +StopICD10CMInferenceJobResponse +StopImageBuilderRequest +StopImageBuilderResult +StopImportRequest +StopImportResponse +StopInferenceExperimentRequest +StopInferenceExperimentResponse +StopInferenceRecommendationsJobRequest +StopInferenceSchedulerRequest +StopInferenceSchedulerResponse +StopIngestionRequest +StopInputDeviceRequest +StopInstanceOnIdleRequest +StopInstanceRequest +StopInstanceResult +StopInstancesRequest +StopInstancesResult +StopJobOnFailureOptions +StopJobOnFailureTiming +StopJobRequest +StopJobResult +StopJobRunRequest +StopJobRunResponse +StopKeyPhrasesDetectionJobRequest +StopKeyPhrasesDetectionJobResponse +StopKeyUsageInput +StopKeyUsageOutput +StopLabelingJobRequest +StopLaunchRequest +StopLaunchResponse +StopLoggingRequest +StopLoggingTime +StopMatchmakingInput +StopMeetingTranscriptionRequest +StopMetricStreamsInput +StopMigrationWorkflowRequest +StopMigrationWorkflowResponse +StopModelCustomizationJobRequest +StopModelRequest +StopModelResponse +StopMonitoringMembersRequest +StopMonitoringMembersResponse +StopMonitoringScheduleRequest +StopMultiplexRequest +StopMultiplexResponse +StopNotebookExecutionInput +StopNotebookInstanceInput +StopPHIDetectionJobRequest +StopPHIDetectionJobResponse +StopPiiEntitiesDetectionJobRequest +StopPiiEntitiesDetectionJobResponse +StopPipeRequest +StopPipeResponse +StopPipelineExecutionInput +StopPipelineExecutionOutput +StopPipelineExecutionRequest +StopPipelineExecutionResponse +StopPipelineRequest +StopPipelineResponse +StopProcessingJobRequest +StopProductSubscriptionRequest +StopProductSubscriptionResponse +StopProjectVersionRequest +StopProjectVersionResponse +StopQueryExecutionInput +StopQueryRequest +StopQueryResponse +StopReason +StopRecommenderRequest +StopRecommenderResponse +StopRelationalDatabaseRequest +StopRelationalDatabaseResult +StopRemoteAccessSessionRequest +StopRemoteAccessSessionResult +StopReplicationMessage +StopReplicationRequest +StopReplicationResponse +StopReplicationTaskMessage +StopReplicationTaskResponse +StopReplicationToReplicaRequest +StopReplicationToReplicaResponse +StopRequest +StopResourceRequest +StopRetrainingSchedulerRequest +StopRetrainingSchedulerResponse +StopRunRequest +StopRunResult +StopRxNormInferenceJobRequest +StopRxNormInferenceJobResponse +StopSNOMEDCTInferenceJobRequest +StopSNOMEDCTInferenceJobResponse +StopSelector +StopSentimentDetectionJobRequest +StopSentimentDetectionJobResponse +StopServerRequest +StopSessionRequest +StopSessionResponse +StopSimulationInput +StopSolutionVersionCreationRequest +StopSourceNetworkReplicationRequest +StopSourceNetworkReplicationResponse +StopSpeakerSearchTaskRequest +StopStackRequest +StopStackSetOperationInput +StopStreamEncryptionInput +StopStreamProcessorRequest +StopStreamRequest +StopStreamingSessionRequest +StopStreamingSessionResponse +StopSuiteRunRequest +StopTargetedSentimentDetectionJobRequest +StopTargetedSentimentDetectionJobResponse +StopTaskRequest +StopTaskResponse +StopTextTranslationJobRequest +StopTextTranslationJobResponse +StopThingRegistrationTaskRequest +StopTime +StopTimecode +StopTimeout +StopTimestamp +StopTrainingDocumentClassifierRequest +StopTrainingEntityRecognizerRequest +StopTrainingJobRequest +StopTransformJobRequest +StopTriggerRequest +StopTriggerResponse +StopUserImportJobRequest +StopUserImportJobResponse +StopVectorEnrichmentJobInput +StopVoiceToneAnalysisTaskRequest +StopWorkflowRunRequest +StopWorkspaceRequests +StopWorkspacesRequest +StopWorkspacesResult +Stopped +StoppedActions +StoppedSince +Stopping +StoppingCondition +StoppingConditions +StoppingInstances +Stops +Stopwords +Storage +StorageAllocatedInBytes +StorageCapacity +StorageCapacityQuotaGiB +StorageCapacityReservationGiB +StorageCapacityUnits +StorageClass +StorageClassAnalysis +StorageClassAnalysisDataExport +StorageConfig +StorageConfigs +StorageConfiguration +StorageConnector +StorageConnectors +StorageDescriptor +StorageEfficiencyEnabled +StorageEncrypted +StorageGB +StorageGatewayError +StorageInfo +StorageIops +StorageJobId +StorageLensArn +StorageLensAwsOrg +StorageLensConfiguration +StorageLensConfigurationList +StorageLensDataExport +StorageLensDataExportEncryption +StorageLensTag +StorageLimit +StorageLimitExceededException +StorageLimitWillExceedException +StorageLocation +StorageMetrics +StorageMode +StorageOptimizer +StorageOptimizerConfig +StorageOptimizerList +StorageOptimizerType +StorageQuotaExceededFault +StorageResolution +StorageRule +StorageRuleType +StorageSize +StorageSubTypeName +StorageSystemArn +StorageSystemListEntry +StorageSystems +StorageThroughput +StorageThroughputToIopsRatio +StorageTier +StorageType +StorageTypeLimit +StorageTypeLimits +StorageTypeName +StorageTypeNotAvailableFault +StorageTypeNotSupportedFault +StorageTypes +StorageUnit +StorageUtilizedInBytes +StorageVirtualMachine +StorageVirtualMachineArn +StorageVirtualMachineFilter +StorageVirtualMachineId +StorageVirtualMachineIds +StorageVirtualMachineNotFound +StorageVirtualMachineRoot +StorageVirtualMachines +StorageVolumeType +StoreImageTaskResult +StoreImageTaskResults +StoreTaskFailureReason +StoreTaskState +StoredAsSubDirectories +StoredQuery +StoredQueryMetadata +StorediSCSIVolume +StorediSCSIVolumes +Strategy +StrategyConfig +StrategyOnFullSize +StrategyOption +StrategySummary +Stream +StreamARN +StreamArn +StreamChannelDefinition +StreamConfiguration +StreamConfigurationCreate +StreamConfigurationSessionBackup +StreamConfigurationSessionStorage +StreamCreationTimestamp +StreamDescription +StreamDescriptionSummary +StreamEdgeConfigurationNotFoundException +StreamEnabled +StreamEncryption +StreamEvent +StreamExceptionPolicy +StreamFile +StreamFilters +StreamId +StreamInfResolution +StreamInfo +StreamInfoList +StreamJournalToKinesisRequest +StreamJournalToKinesisResponse +StreamKey +StreamKeySummary +StreamLabel +StreamManifestBehavior +StreamMode +StreamModeDetails +StreamName +StreamNameCondition +StreamNames +StreamOrder +StreamProcessingStartSelector +StreamProcessingStopSelector +StreamProcessor +StreamProcessorArn +StreamProcessorDataSharingPreference +StreamProcessorInput +StreamProcessorNotificationChannel +StreamProcessorOutput +StreamProcessorSettings +StreamProcessorSettingsForUpdate +StreamProcessors +StreamRecord +StreamRecordsNotFoundException +StreamSelection +StreamSession +StreamSessionSummary +StreamSpecification +StreamStatus +StreamSummaries +StreamSummary +StreamType +StreamUnavailable +StreamUrl +StreamView +StreamViewType +StreamingConfiguration +StreamingConfigurations +StreamingDataPreviewOptions +StreamingDistribution +StreamingDistributionAlreadyExists +StreamingDistributionConfig +StreamingDistributionConfigWithTags +StreamingDistributionList +StreamingDistributionNotDisabled +StreamingDistributionSummary +StreamingEndpointArn +StreamingExperienceSettings +StreamingId +StreamingImage +StreamingImageEncryptionConfiguration +StreamingLoggingConfig +StreamingNotificationTarget +StreamingNotificationTargets +StreamingOptions +StreamingSession +StreamingSessionBackup +StreamingSessionStorageRoot +StreamingSessionStream +StreamingStatus +StreamingURL +Streams +Street +Street1 +Street2 +Street3 +StreetAddress +StreetInfo +StreetNumber +Strength +StrictTransportSecurity +StringAttributeConstraints +StringAttributeConstraintsType +StringColumnStatisticsData +StringCondition +StringDatasetParameter +StringDatasetParameterDefaultValues +StringDefaultValues +StringEquals +StringFilter +StringFormatConfiguration +StringLike +StringListValue +StringListValues +StringNotEquals +StringNotLike +StringParameter +StringParameterDeclaration +StringParameters +StringReference +StringStaticValues +StringValue +StringValueList +StringValueWhenUnsetConfiguration +StringValues +StripeSizeBytes +StrongKeyProtectionRequired +StructValue +StructuredLogDestinations +Studio +StudioArn +StudioComponent +StudioComponentInitializationScript +StudioComponentSummary +StudioEncryptionConfiguration +StudioId +StudioLifecycleConfigAppType +StudioLifecycleConfigArn +StudioLifecycleConfigContent +StudioLifecycleConfigDetails +StudioLifecycleConfigName +StudioLifecycleConfigs +StudioMembership +StudioSummary +Studios +Style +StyleConfiguration +StyleControl +StyleOptions +StylePassthrough +StyleTargets +SubBands +SubChannelId +SubChannelSummary +SubChannels +SubDomain +SubDomainSetting +SubErrorCode +SubErrorCodeReason +SubExpressions +SubJobMetadata +SubModule +SubRegion +SubResourceSummary +SubResources +SubSegmentNum +SubSegmentsExpected +SubSlotSetting +SubSlotTypeComposition +SubSlotValueElicitationSetting +SubStages +SubStatementData +SubStatements +SubType +SubTypeCountLimitExceededException +SubTypeName +Subdirectory +Subdivision +SubdivisionCode +SubdivisionName +SubgopLength +Subject +SubjectAlternativeNameMatchers +SubjectAlternativeNameSummaries +SubjectAlternativeNames +SubjectDetail +SubjectDetailResponse +SubjectFromWebIdentityToken +SubjectId +SubjectInformationAccess +SubjectKey +SubjectNameFlags +SubjectNameFlagsV2 +SubjectNameFlagsV3 +SubjectNameFlagsV4 +SubjectPart +SubjectStructure +SubjectSummary +SubjectType +SubmissionDateTime +SubmitAttachmentStateChangesRequest +SubmitAttachmentStateChangesResponse +SubmitContactEvaluationRequest +SubmitContactEvaluationResponse +SubmitContainerStateChangeRequest +SubmitContainerStateChangeResponse +SubmitFeedbackRequest +SubmitJobRequest +SubmitJobResponse +SubmitMultiRegionAccessPointRoutesRequest +SubmitTaskStateChangeRequest +SubmitTaskStateChangeResponse +SubmitTime +SubmitTimeAfter +SubmitTimeBefore +SubmitTimeMillis +SubmittedAfter +SubmittedAfterTime +SubmittedAt +SubmittedBefore +SubmittedBeforeTime +SubmittedDate +SubmittedJobsCount +SubmittedSince +SubmittedTime +Subnet +SubnetAlreadyInUse +SubnetArn +SubnetArns +SubnetAssociation +SubnetAvailabilityZone +SubnetAvailabilityZoneId +SubnetChangeProtection +SubnetCidrBlockState +SubnetCidrReservation +SubnetCidrReservationId +SubnetConfiguration +SubnetConfigurations +SubnetGroup +SubnetGroupAlreadyExistsFault +SubnetGroupIdentifier +SubnetGroupInUseFault +SubnetGroupName +SubnetGroupNames +SubnetGroupNotFoundFault +SubnetGroupQuotaExceededFault +SubnetGroupStatus +SubnetGroups +SubnetIPAddressLimitReachedException +SubnetId +SubnetIdList +SubnetIdUpdates +SubnetIdentifier +SubnetIds +SubnetInUse +SubnetIpv4CidrReservations +SubnetIpv6CidrBlockAssociation +SubnetIpv6CidrReservations +SubnetMapping +SubnetMappings +SubnetMask +SubnetNotAllowedFault +SubnetNotFound +SubnetNotFoundException +SubnetOfMatches +SubnetOutpost +SubnetOutpostArn +SubnetQuotaExceededFault +SubnetRouteTable +SubnetStatus +Subnets +SubscribeInput +SubscribePattern +SubscribeRequest +SubscribeResponse +SubscribeResult +SubscribeToDatasetRequest +SubscribeToEventRequest +SubscribeToShardEvent +SubscribeToShardInput +SubscribeToShardOutput +SubscribedAt +SubscribedDomain +SubscribedDomains +SubscribedRuleGroupSummary +SubscribedWorkteam +SubscribedWorkteams +Subscriber +SubscriberResource +Subscribers +Subscription +SubscriptionAlreadyExistFault +SubscriptionArn +SubscriptionArnList +SubscriptionCategoryNotFoundFault +SubscriptionCreatedDateTime +SubscriptionCreationTime +SubscriptionDefinitionId +SubscriptionDefinitionVersion +SubscriptionDefinitionVersionArn +SubscriptionDefinitionVersionId +SubscriptionEndDate +SubscriptionErrors +SubscriptionEventIdNotFoundFault +SubscriptionExpiryDate +SubscriptionFilter +SubscriptionId +SubscriptionLimitExceededException +SubscriptionLimits +SubscriptionName +SubscriptionNotFoundFault +SubscriptionSeverityNotFoundFault +SubscriptionStartDate +SubscriptionState +SubscriptionStatus +SubscriptionType +Subscriptions +SubstatementType +SubstitutionMap +Substitutions +Substring +SubsystemId +SubsystemVendorId +Subtitle +SubtitleFileUris +Subtitles +SubtitlesOutput +SubtitlingType +SubtotalOptions +Subtype +Succeeded +SucceededActions +SucceededCount +Success +SuccessCodes +SuccessCount +SuccessForeground +SuccessRedirectionURL +SuccessResponseHandlingConfig +SuccessRetentionPeriodInDays +SuccessSteps +SuccessStrings +SuccessTopic +SuccessValues +Successes +Successful +SuccessfulCampaignStateResponse +SuccessfulEndpointCount +SuccessfulFleetCancellations +SuccessfulFleetDeletions +SuccessfulFleetRequests +SuccessfulInstanceCreditSpecificationItem +SuccessfulInstanceCreditSpecifications +SuccessfulLoginAttempts +SuccessfulPackageVersionInfo +SuccessfulQueuedPurchaseDeletion +SuccessfulQueuedPurchaseDeletions +SuccessfulRequest +SuccessfulResponse +SuccessfulShares +SuccessfulSubmissions +SuccessfullyAssociatedResources +SuccessfullyDeletedLaunchTemplateVersions +SuccessfullyDisassociatedResources +Suffix +SuggestModel +SuggestRequest +SuggestResponse +SuggestStatus +Suggestable +SuggestableConfig +SuggestableConfigList +SuggestedAccounts +SuggestedFix +SuggestedPresentationDelaySeconds +SuggestedQueryText +Suggester +SuggesterName +SuggesterNames +SuggesterStatus +Suggesters +Suggestion +SuggestionAttributes +SuggestionCount +SuggestionHighlight +SuggestionMatch +SuggestionQuery +SuggestionTextWithHighlights +SuggestionTypes +SuggestionValue +Suggestions +SuggestionsList +Suite +SuiteDefinitionConfiguration +SuiteDefinitionInformation +SuiteRunConfiguration +SuiteRunInformation +Sum +SumByAccount +SumByDataSource +SumByFeature +SumByResource +Summaries +SummarizationAttributes +SummarizedAttackVector +SummarizedCounter +Summary +SummaryFields +SummaryItems +SummaryList +SummaryMap +SummaryStatistics +Sunday +Sunglasses +SupernetOfMatches +SupersededTemplates +SuperuserParameters +SupplementalCategories +SupplementalImps +SupplementalSettings +SupplementaryFeature +SupplementaryFeatures +SupportDescription +SupportEmail +SupportLevel +SupportLink +SupportLowFramerateInputs +SupportUrl +Supported +SupportedActivityStreamModes +SupportedAddonList +SupportedArchitectures +SupportedBootModes +SupportedCACertificateIdentifiers +SupportedCharacterSets +SupportedCompressionTypes +SupportedContentTypes +SupportedDPUSizes +SupportedDeploymentModes +SupportedEndpointType +SupportedEndpointTypes +SupportedEngineModes +SupportedEngineVersions +SupportedEngines +SupportedFeatureNames +SupportedFeatures +SupportedFieldTypeDetails +SupportedFilters +SupportedGatewayCapacities +SupportedHardwareType +SupportedHour +SupportedHyperParameters +SupportedIdentityProviders +SupportedInputModes +SupportedInstanceType +SupportedInstanceTypes +SupportedIpAddressTypes +SupportedLanguage +SupportedLicenses +SupportedLoadBalancerTypes +SupportedLoginProviders +SupportedMajorVersions +SupportedMessagingContentTypes +SupportedNcharCharacterSets +SupportedNetworkTypes +SupportedOperation +SupportedOperations +SupportedPermissionTypes +SupportedPhoneNumberTypes +SupportedPlatform +SupportedPlatforms +SupportedProductConfig +SupportedProducts +SupportedRealtimeInferenceInstanceTypes +SupportedResourceType +SupportedResponseMIMETypes +SupportedRootDeviceTypes +SupportedStorage +SupportedStorageFilter +SupportedStrategies +SupportedTierList +SupportedTimezones +SupportedTrainingInstanceTypes +SupportedTransformInstanceTypes +SupportedTuningJobObjectiveMetrics +SupportedUplinkGbps +SupportedUsageClasses +SupportedVersions +SupportedVirtualizationTypes +SupportingAccessPoint +SupportingInsights +Supports32BitFCnt +SupportsBabelfish +SupportsCDC +SupportsCertificateRotationWithoutRestart +SupportsClassB +SupportsClassC +SupportsClusters +SupportsDBInstanceAutomatedBackupsReplication +SupportsDistributedTraining +SupportsEnhancedMonitoring +SupportsGlobalDatabases +SupportsIAMDatabaseAuthentication +SupportsIops +SupportsJoin +SupportsKerberosAuthentication +SupportsLinking +SupportsLocalWriteForwarding +SupportsLogExportsToCloudwatchLogs +SupportsOptionVersionDowngrade +SupportsParallelQuery +SupportsPerformanceInsights +SupportsReadReplica +SupportsStorageAutoscaling +SupportsStorageEncryption +SupportsStorageThroughput +SuppressDataIdentifier +SuppressedDestination +SuppressedDestinationAttributes +SuppressedDestinationSummaries +SuppressedDestinationSummary +SuppressedLinesOfCodeCount +SuppressedReasons +SuppressionAttributes +SuppressionListDestination +SuppressionListImportAction +SuppressionOptions +Surname +SurroundExMode +SurroundMode +SurroundTrim +SuspendActions +SuspendContactRecordingRequest +SuspendGameServerGroupInput +SuspendGameServerGroupOutput +SuspendedActions +SuspendedCause +SuspendedDate +SuspendedProcess +SuspendedProcesses +SuspendedState +SuspensionReason +SustainedClockSpeedInGhz +SvmActiveDirectoryConfiguration +SvmAdminPassword +SvmEndpoint +SvmEndpoints +SvmName +SvmUuid +SwapEnvironmentCNAMEsMessage +Swappiness +SwitchRunningMode +Switchover +SwitchoverBlueGreenDeploymentRequest +SwitchoverBlueGreenDeploymentResponse +SwitchoverDetail +SwitchoverDetails +SwitchoverGlobalClusterMessage +SwitchoverGlobalClusterResult +SwitchoverReadReplicaMessage +SwitchoverReadReplicaResult +SwitchoverTimeout +SybaseSettings +Symbol +SymbolicLink +SymmetricEncryptionAttributes +SyncBlocker +SyncBlockerContext +SyncCompliance +SyncConfig +SyncCount +SyncCreatedTime +SyncDeploymentJobRequest +SyncDeploymentJobResponse +SyncFormat +SyncJobStatus +SyncJobSummary +SyncLastModifiedTime +SyncName +SyncResourceRequest +SyncResourceResponse +SyncResourceStatus +SyncResourceSummary +SyncSessionToken +SyncSessionsCount +SyncShadow +SyncSource +SyncState +SyncStates +SyncStatus +SyncThreshold +SyncType +SynchronizationStatus +SynonymRuleCount +Synonyms +Syntax +SyntaxToken +SyntaxTokens +SynthesisTask +SynthesisTaskNotFoundException +SynthesisTasks +SynthesizeSpeechInput +SynthesizeSpeechOutput +SyslogIp +System +SystemControl +SystemControls +SystemEvent +SystemId +SystemIds +SystemInfo +SystemInstanceDescription +SystemInstanceFilter +SystemInstanceSummary +SystemResourceLimits +SystemStatus +SystemSuggestedValue +SystemTemplateDescription +SystemTemplateFilter +SystemTemplateSummary +SystemType +SystemsManagerAgent +TCPFlagField +TCPFlags +TERMINATING +TFIMetricDataPoint +TFIModelPerformance +TFITrainingMetricsValue +TGWOnDeviceService +TGWOnDeviceServiceConfiguration +TLDRulesViolation +TLEData +TLEEphemeris +TLSEnabled +TLSInspectionConfiguration +TLSInspectionConfigurationArn +TLSInspectionConfigurationId +TLSInspectionConfigurationMetadata +TLSInspectionConfigurationName +TLSInspectionConfigurationResponse +TLSInspectionConfigurationStatus +TLSInspectionConfigurations +TLSSecurityPolicy +TTL +Table +TableAggregatedFieldWells +TableAlreadyExistsException +TableArn +TableAutoScalingDescription +TableBorderOptions +TableCatalogId +TableCell +TableCellConditionalFormatting +TableCellImageScalingConfiguration +TableCellImageSizingConfiguration +TableCellStyle +TableClass +TableClassOverride +TableClassSummary +TableColumn +TableConditionalFormatting +TableConditionalFormattingOption +TableConfiguration +TableCount +TableCreationDateTime +TableCreationParameters +TableData +TableDataImportJobMetadata +TableDescription +TableError +TableExcerpt +TableFieldCustomIconContent +TableFieldCustomTextContent +TableFieldImageConfiguration +TableFieldLinkConfiguration +TableFieldLinkContentConfiguration +TableFieldOption +TableFieldOptions +TableFieldURLConfiguration +TableFieldWells +TableFormat +TableId +TableIdentifier +TableInUseException +TableInlineVisualization +TableInlineVisualizations +TableInput +TableLFTagPolicy +TableLFTagPolicyAndPermissions +TableLimitExceededFault +TableList +TableLocation +TableMappings +TableMaxReadCapacityUnits +TableMaxWriteCapacityUnits +TableMember +TableMetadata +TableMetadataList +TableName +TableNameUpdate +TableNames +TableNotFoundException +TableObject +TableOptions +TablePaginatedReportOptions +TablePattern +TablePinnedFieldOptions +TablePrefix +TableResource +TableRestoreNotFoundFault +TableRestoreRequestId +TableRestoreStatus +TableRestoreStatusDetails +TableRestoreStatusMessage +TableRow +TableRowConditionalFormatting +TableSchema +TableSideBorderOptions +TableSizeBytes +TableSortConfiguration +TableState +TableStatistics +TableStatus +TableStyleTarget +TableSummary +TableToReload +TableType +TableUnaggregatedFieldWells +TableVersion +TableVersionError +TableVersions +TableVisual +TableWildcard +TableWithColumns +TableWithColumnsResource +Tables +TablesCreated +TablesDeleted +TablesErrored +TablesLoaded +TablesLoading +TablesQueued +TablesToDelete +TablesToReload +TablesUpdated +TabularConditions +TabularJobConfig +TabularResolvedAttributes +Tac +Tag +TagAttendeeRequest +TagCertificateAuthorityRequest +TagCollection +TagCollectionFilter +TagColumnOperation +TagCondition +TagCostEstimationResourceCollectionFilter +TagCount +TagCriterionForJob +TagCriterionPairForJob +TagDeliveryStreamInput +TagDescription +TagDescriptions +TagException +TagFilter +TagFilters +TagHealth +TagInfoForResource +TagInput +TagInstanceProfileRequest +TagKey +TagKeyFilters +TagKeyList +TagKeyOnly +TagKeyScope +TagKeys +TagKeysListRequiredException +TagLimitExceededException +TagLimitExceededFault +TagList +TagListEntry +TagListMessage +TagLogGroupRequest +TagMFADeviceRequest +TagMeetingRequest +TagMultiValueDelimiter +TagNames +TagNotFoundFault +TagOpenIDConnectProviderRequest +TagOperationException +TagOptionDetail +TagOptionDetails +TagOptionId +TagOptionNotMigratedException +TagOptionSummary +TagOptions +TagOutput +TagPolicyException +TagPolicyRequest +TagPolicyViolationException +TagProjectRequest +TagProjectResult +TagQueryConfiguration +TagQueueRequest +TagQuotaPerResourceExceeded +TagRef +TagRequiredException +TagResourceInput +TagResourceOutput +TagResourceRequest +TagResourceResponse +TagResourceResult +TagResourcesInput +TagResourcesOutput +TagRestrictedResources +TagRoleRequest +TagRuleConfigurations +TagRules +TagSAMLProviderRequest +TagScopeTerm +TagSearchCondition +TagServerCertificateRequest +TagSet +TagSetListLimitExceededException +TagSpecification +TagSpecifications +TagStepDetails +TagStreamInput +TagUserRequest +TagValue +TagValuePair +TagValueScope +TagValues +TagValuesToAdd +TagValuesToDelete +TaggedDatabase +TaggedResource +TaggedResourceListMessage +TaggedResources +TaggedTable +Tagging +TaggingDirective +TaggingFailedException +Tags +TagsAlreadyExistException +TagsLimitExceededException +TagsList +TagsMapRequiredException +TagsModel +TagsPerPage +TagsPerResourceExceededLimitException +TagsToAdd +TagsToDelete +TagsToRemove +TagsToUpdate +TagsType +Taint +Tape +TapeARN +TapeARNs +TapeArchive +TapeArchives +TapeBarcode +TapeBarcodePrefix +TapeCreatedDate +TapeDriveType +TapeInfo +TapeInfos +TapeRecoveryPointInfo +TapeRecoveryPointInfos +TapeRecoveryPointTime +TapeSizeInBytes +TapeStatus +TapeUsedInBytes +Tapes +Target +TargetARN +TargetAccounts +TargetAction +TargetActionType +TargetAddress +TargetApplications +TargetArn +TargetAttributeName +TargetBackupVault +TargetBackupVaultName +TargetBands +TargetBrokerEBSVolumeInfo +TargetBucket +TargetCapacity +TargetCapacitySpecification +TargetCapacitySpecificationRequest +TargetCapacityUnitType +TargetClusterArn +TargetClusterInfo +TargetClusterType +TargetColumn +TargetConfiguration +TargetConfigurationRequest +TargetConfigurationValueRollup +TargetConfigurationValueSet +TargetConfigurations +TargetContainerHostname +TargetContainerRepository +TargetControls +TargetCount +TargetCpuUtilizationPerCore +TargetCustomAvailabilityZone +TargetCustomerId +TargetDBClusterParameterGroupDescription +TargetDBClusterParameterGroupIdentifier +TargetDBClusterParameterGroupName +TargetDBClusterSnapshotIdentifier +TargetDBInstanceIdentifier +TargetDBParameterGroupDescription +TargetDBParameterGroupIdentifier +TargetDBParameterGroupName +TargetDBSnapshotIdentifier +TargetDataProviderDescriptors +TargetDatabase +TargetDatabaseName +TargetDbClusterIdentifier +TargetDbType +TargetDescription +TargetDestination +TargetDetails +TargetDevice +TargetDistributionId +TargetDocumentAttributeKey +TargetDocumentAttributeValue +TargetDocumentAttributeValueDeletion +TargetDpus +TargetDurationCompatibilityMode +TargetEncryptionType +TargetEndpointArn +TargetEngineName +TargetEngineVersion +TargetEnvironment +TargetEnvironmentName +TargetEventTypes +TargetFacetName +TargetFailure +TargetFileSystemValues +TargetGrant +TargetGrants +TargetGroup +TargetGroupARNs +TargetGroupArn +TargetGroupArns +TargetGroupAssociationLimitException +TargetGroupAttribute +TargetGroupConfig +TargetGroupInfo +TargetGroupName +TargetGroupNotFoundException +TargetGroupPairInfo +TargetGroupStickinessConfig +TargetGroupSummary +TargetGroupTuple +TargetGroups +TargetGroupsConfig +TargetHealth +TargetHealthDescription +TargetHealthDescriptions +TargetId +TargetIdFilters +TargetIdType +TargetIds +TargetImage +TargetImageOrientationCorrection +TargetInUseException +TargetInstance +TargetInstanceType +TargetInstances +TargetIops +TargetIps +TargetKafkaVersion +TargetKeyId +TargetKeyPrefix +TargetLabelColumn +TargetLanguageCode +TargetLanguageCodes +TargetLensVersion +TargetLkfs +TargetLocation +TargetLocationAlarmConfiguration +TargetLocationMaxConcurrency +TargetLocationMaxErrors +TargetLocations +TargetMaps +TargetMeasureName +TargetMember +TargetMembershipsPerSubChannel +TargetModel +TargetMonitorNits +TargetMultiAttachEnabled +TargetMultiMeasureAttributeName +TargetMultiMeasureName +TargetName +TargetNetwork +TargetNetworkCidr +TargetNetworkId +TargetNodeType +TargetNotConnected +TargetNotConnectedException +TargetNotFoundException +TargetNumberOfBrokerNodes +TargetNumberOfNodes +TargetObjectReference +TargetObjectiveMetricValue +TargetOnDemandCapacity +TargetOnDeviceService +TargetOnDeviceServices +TargetOptionGroupDescription +TargetOptionGroupIdentifier +TargetOriginId +TargetParameter +TargetParameterName +TargetParameters +TargetPath +TargetPer +TargetPlatform +TargetPrefix +TargetProcess +TargetProductId +TargetProductName +TargetReference +TargetRegion +TargetReplicationInstanceArn +TargetRequiredException +TargetReservationValue +TargetReservedNodeCount +TargetReservedNodeOffering +TargetReservedNodeOfferingId +TargetReservedNodeType +TargetResource +TargetResourceCount +TargetResourceType +TargetResourceTypeParameter +TargetResourceTypeSummary +TargetRole +TargetRouteTableId +TargetSamplingRate +TargetSchemaName +TargetShardCount +TargetSheetId +TargetSize +TargetSnapshotIdentifier +TargetSnapshotName +TargetSnapshotValues +TargetSpotCapacity +TargetStatus +TargetStores +TargetString +TargetSubnet +TargetSummary +TargetTable +TargetTableName +TargetTags +TargetText +TargetThroughput +TargetTrackingConfiguration +TargetTrackingConfigurations +TargetTrackingMetric +TargetTrackingMetricDataQuery +TargetTrackingMetricDimension +TargetTrackingMetricStat +TargetTrackingScalingPolicyConfiguration +TargetType +TargetTypes +TargetUser +TargetUsers +TargetValue +TargetValues +TargetVariant +TargetVersion +TargetVersions +TargetViolationReason +TargetViolationReasons +TargetVisualOptions +TargetVisuals +TargetVisualsConfiguration +TargetVolumeType +TargetVolumeValues +TargetVpcSubnetId +TargetWorkspaceId +TargetedMessages +TargetedSentimentDetectionJobFilter +TargetedSentimentDetectionJobProperties +TargetedSentimentDetectionJobPropertiesList +TargetedSentimentEntity +TargetedSentimentMention +Targets +TargetsRequiredException +Task +TaskAction +TaskActionDefinition +TaskAlreadyExistsException +TaskArn +TaskAvailabilityLifetimeInSeconds +TaskConfig +TaskCount +TaskCreatedAt +TaskCredentials +TaskData +TaskDefinition +TaskDefinitionArn +TaskDefinitionPlacementConstraint +TaskDefinitionType +TaskDefinitions +TaskDescription +TaskDetails +TaskDoesNotExist +TaskEndTime +TaskError +TaskExecutionArn +TaskExecutionId +TaskExecutionListEntry +TaskExecutionResultDetail +TaskExecutions +TaskFailedEventDetails +TaskFieldMappings +TaskFilter +TaskHandle +TaskId +TaskIds +TaskInvocationParameters +TaskKeywords +TaskList +TaskListEntry +TaskListItem +TaskLogs +TaskNotFoundException +TaskObject +TaskOverride +TaskParameters +TaskProperties +TaskQueueing +TaskReportConfig +TaskRoleArn +TaskRun +TaskRunFilterCriteria +TaskRunId +TaskRunProperties +TaskRunSecurityConfigurationName +TaskRunSortCriteria +TaskRunType +TaskRuns +TaskSchedule +TaskScheduledEventDetails +TaskSet +TaskSetNotFoundException +TaskStartFailedEventDetails +TaskStartTime +TaskStartedEventDetails +TaskState +TaskStatistics +TaskStatisticsForAuditCheck +TaskStatus +TaskStatusReason +TaskSubmitFailedEventDetails +TaskSubmittedEventDetails +TaskSucceededEventDetails +TaskSummary +TaskTemplateConstraints +TaskTemplateDefaultFieldValue +TaskTemplateDefaults +TaskTemplateField +TaskTemplateFieldIdentifier +TaskTemplateId +TaskTemplateMetadata +TaskTemplates +TaskTimeLimitInSeconds +TaskTimedOut +TaskTimedOutEventDetails +TaskTitle +TaskType +Tasks +TaxDocuments +TcpFlags +TcpRoute +TcpRouteAction +TcpRouteMatch +TcpTimeout +Tcs +TdeCredentialArn +TdeCredentialPassword +Tdscdma +TdscdmaLocalId +TdscdmaNmr +TdscdmaNmrObj +TdscdmaObj +TdscdmaTimingAdvance +TdtInterval +Team +TeamId +TeamMember +TeamMemberAlreadyAssociatedException +TeamMemberNotFoundException +TechContact +TechPrivacy +TechnicalCueFilter +TechnicalCueSegment +Telecine +Telemetries +Telemetry +TelemetryConfiguration +TelemetryConfigurationUpdate +TelemetryMetadata +TelemetryRecord +TelemetryRecords +Telephone +Telephony +TelephonyConfig +TelephonySettings +TeletextDestinationSettings +TeletextGridControl +TeletextSourceSettings +TeletextSpacing +TempDir +TempDirectory +TemperatureUnit +Template +TemplateActionDocument +TemplateActionsRequestFilters +TemplateActiveVersionRequest +TemplateAlias +TemplateAliasList +TemplateArn +TemplateBody +TemplateConfiguration +TemplateContent +TemplateCreateMessageBody +TemplateData +TemplateDescription +TemplateDoesNotExistException +TemplateError +TemplateId +TemplateInput +TemplateLinkedPolicyDefinition +TemplateLinkedPolicyDefinitionDetail +TemplateLinkedPolicyDefinitionItem +TemplateLocation +TemplateMetadata +TemplateName +TemplateParameter +TemplateParameterConfiguration +TemplateParameters +TemplateQuestions +TemplateResponse +TemplateRevision +TemplateS3Uri +TemplateSSMDocumentDetails +TemplateSelectionExpression +TemplateSourceAnalysis +TemplateSourceEntity +TemplateSourceTemplate +TemplateStage +TemplateStepGroupSummary +TemplateStepSummary +TemplateSubject +TemplateSummary +TemplateSummaryConfig +TemplateSummaryList +TemplateSyncConfig +TemplateType +TemplateURL +TemplateUrl +TemplateV2 +TemplateV3 +TemplateV4 +TemplateVersion +TemplateVersionDefinition +TemplateVersionNumber +TemplateVersionResponse +TemplateVersionSummary +TemplateVersionSummaryList +TemplateVersionsResponse +TemplatedPathList +Templates +TemplatesMetadata +TemplatesNotAvailableInRegionException +TemplatesResponse +TemporalAdaptiveQuantization +TemporalAq +TemporalFilterSettings +TemporalIds +TemporalStatisticsConfigInput +TemporaryCredential +TemporaryPassword +TemporaryPasswordValidityDays +TemporaryRestoreDays +Tenancy +Tenant +TenantDomain +TenantId +TenantIds +TensorBoardAppSettings +TensorBoardOutputConfig +TenthFractionsOfACent +TeradataParameters +Term +TermCount +TermEndDate +TermInYears +TermStartDate +TerminalRoutingStrategyException +TerminalStateException +TerminateAppRequest +TerminateCaptions +TerminateClientVpnConnectionsRequest +TerminateClientVpnConnectionsResult +TerminateConnectionStatus +TerminateEnvByForce +TerminateEnvironmentMessage +TerminateInstanceInAutoScalingGroupType +TerminateInstances +TerminateInstancesRequest +TerminateInstancesResult +TerminateInstancesWithExpiration +TerminateJobFlowsInput +TerminateJobRequest +TerminateProvisionedProductInput +TerminateProvisionedProductOutput +TerminateRecommendationDetail +TerminateRecoveryInstancesRequest +TerminateRecoveryInstancesResponse +TerminateRequest +TerminateResources +TerminateSessionRequest +TerminateSessionResponse +TerminateSolNetworkInstanceInput +TerminateSolNetworkInstanceOutput +TerminateTargetInstancesRequest +TerminateTargetInstancesResponse +TerminateToken +TerminateWorkflowExecutionInput +TerminateWorkspaceRequests +TerminateWorkspacesRequest +TerminateWorkspacesResult +Terminated +TerminatedAt +Terminating +TerminatingInstances +Termination +TerminationDate +TerminationDateTime +TerminationDelay +TerminationHealth +TerminationPolicies +TerminationPolicyTypes +TerminationProtected +TerminationProtectionEnabled +TerminationTime +TerminationWaitInSeconds +TerminologyData +TerminologyDataFormat +TerminologyDataLocation +TerminologyNames +TerminologyProperties +TerminologyPropertiesList +Terms +TermsAggregation +TerraformSource +Test +TestAlarmRequest +TestAlarmResult +TestAuthorizationRequest +TestAuthorizationResponse +TestAvailabilityConfigurationRequest +TestAvailabilityConfigurationResponse +TestCase +TestCaseFilter +TestCaseRun +TestCaseScenario +TestConnectionMessage +TestConnectionRequest +TestConnectionResponse +TestCustomDataIdentifierRequest +TestCustomDataIdentifierResponse +TestDNSAnswerRequest +TestDNSAnswerResponse +TestDurationInSeconds +TestEventPatternRequest +TestEventPatternResponse +TestEventType +TestExecutionResultFilterBy +TestExecutionResultItems +TestExecutionSortBy +TestExecutionSummary +TestExecutionTarget +TestFailoverMessage +TestFailoverNotAvailableFault +TestFailoverResult +TestFunctionFailed +TestFunctionRequest +TestFunctionResult +TestGridProject +TestGridSession +TestGridSessionAction +TestGridSessionArtifact +TestGridVpcConfig +TestHypervisorConfigurationInput +TestIdentityProviderRequest +TestIdentityProviderResponse +TestInvokeAuthorizerRequest +TestInvokeAuthorizerResponse +TestInvokeMethodRequest +TestInvokeMethodResponse +TestMetricFilterRequest +TestMetricFilterResponse +TestMigrationMessage +TestMigrationResponse +TestMode +TestPassed +TestPhoneNumber +TestRecommendation +TestRenderEmailTemplateRequest +TestRenderEmailTemplateResponse +TestRenderTemplateRequest +TestRenderTemplateResponse +TestReportSummary +TestRepositoryTriggersInput +TestRepositoryTriggersOutput +TestResult +TestRoleRequest +TestRoleResponse +TestS3Uri +TestSegmentPatternRequest +TestSegmentPatternResponse +TestSetDiscrepancyErrors +TestSetDiscrepancyReportBotAliasTarget +TestSetDiscrepancyReportResourceTarget +TestSetExportSpecification +TestSetGenerationDataSource +TestSetImportInputLocation +TestSetImportResourceSpecification +TestSetIntentDiscrepancyItem +TestSetSlotDiscrepancyItem +TestSetSortBy +TestSetStorageLocation +TestSetSummary +TestSetTurnRecord +TestSetTurnResult +TestTypeInput +TestTypeOutput +TestWindowEnd +TestWindowStart +TestWindowSummary +TestWindows +TestWirelessDeviceRequest +TestWirelessDeviceResponse +TestingData +TestingDataResult +Text +TextArea +TextAreaControlDisplayOptions +TextArrayOptions +TextBody +TextBoxes +TextClassificationJobConfig +TextColor +TextConditionalFormat +TextConfig +TextContent +TextContentUpdate +TextControlPlaceholderOptions +TextDetection +TextDetectionResult +TextDetections +TextDocumentStatistics +TextField +TextFieldControlDisplayOptions +TextFormat +TextInputEvent +TextInputSpecification +TextLengthExceededException +TextList +TextLocales +TextLogDestination +TextLogSetting +TextModelVersion +TextOptions +TextPart +TextPlain +TextQualifier +TextResponseEvent +TextSizeLimitExceededException +TextTransformation +TextTransformations +TextTranslationJobFilter +TextTranslationJobProperties +TextTranslationJobPropertiesList +TextType +TextWithHighlights +TextWithHighlightsValue +TextWrap +Theme +ThemeAlias +ThemeAliasList +ThemeArn +ThemeConfiguration +ThemeError +ThemeId +ThemeSummary +ThemeSummaryList +ThemeValue +ThemeValues +ThemeVersion +ThemeVersionNumber +ThemeVersionSummary +ThemeVersionSummaryList +Themes +ThesaurusSummary +ThesaurusSummaryItems +Thickness +Thing +ThingArn +ThingAttribute +ThingConnectivity +ThingDocument +ThingGroupDocument +ThingGroupIndexingConfiguration +ThingGroupMetadata +ThingGroupProperties +ThingIndexingConfiguration +ThingName +ThingTypeDefinition +ThingTypeMetadata +ThingTypeProperties +ThirdPartyFirewall +ThirdPartyFirewallFirewallPolicies +ThirdPartyFirewallFirewallPolicy +ThirdPartyFirewallMissingExpectedRouteTableViolation +ThirdPartyFirewallMissingFirewallViolation +ThirdPartyFirewallMissingSubnetViolation +ThirdPartyFirewallPolicy +ThirdPartyFirewallStatus +ThirdPartyJob +ThirdPartyJobData +ThirdPartyJobDetails +ThirdPartySourceRepository +ThousandSeparatorOptions +ThousandsSeparator +ThreadFieldMappings +ThreadId +ThreadsPerCore +Threat +ThreatDetectedByName +ThreatIntelIndicator +ThreatIntelIndicatorCategory +ThreatIntelIndicatorLastObservedAt +ThreatIntelIndicatorSource +ThreatIntelIndicatorSourceUrl +ThreatIntelIndicatorType +ThreatIntelIndicatorValue +ThreatIntelIndicators +ThreatIntelSetId +ThreatIntelSetIds +ThreatIntelligenceDetail +ThreatIntelligenceDetails +ThreatListName +ThreatName +ThreatNames +Threats +ThreatsDetectedItemCount +Threshold +ThresholdComparator +ThresholdCount +ThresholdExpression +ThresholdFraction +ThresholdMetricId +ThresholdPercentage +ThresholdType +ThresholdV2 +ThresholdValue +ThresholdsWaitTime +ThrottleCount +ThrottleSettings +ThrottledClientException +ThrottledException +ThrottlingBurstLimit +ThrottlingException +ThrottlingRateLimit +ThroughResources +ThroughResourcesStatement +ThroughResourcesStatementRequest +Throughput +ThroughputCapacity +ThroughputLimitExceeded +ThroughputMode +ThroughputOther +ThroughputRead +ThroughputTotal +ThroughputWrite +ThrowOnDuplicate +Thumbnail +ThumbnailConfig +ThumbnailConfiguration +ThumbnailDetail +ThumbnailDetails +ThumbnailEncryption +ThumbnailHeight +ThumbnailInterval +ThumbnailPattern +ThumbnailType +ThumbnailWidth +Thumbnails +Thumbprint +ThumbprintList +Thursday +TicServerUrl +TickLabelOptions +TicketId +TicketIds +TicketList +Tier +Tiering +TieringPolicy +TieringStartTime +Tierings +Tile +TileAspectRatio +TileCount +TileHeight +TileLayout +TileLayoutStyle +TileOrder +TilePosition +TileStyle +TileWidth +Tiles +Time +TimeAlignmentBoundary +TimeBasedAutoScalingConfiguration +TimeBasedAutoScalingConfigurations +TimeBasedCanary +TimeBasedCollectionScheme +TimeBasedForecastProperties +TimeBasedLinear +TimeColumn +TimeCommitmentInSeconds +TimeCreated +TimeDelaySeconds +TimeDelta +TimeDeltaUnits +TimeEqualityFilter +TimeFormat +TimeGranularity +TimeInNanos +TimeLeftSeconds +TimeLimitExceededException +TimeLoggingStarted +TimeLoggingStopped +TimeOfDay +TimeOfTheDay +TimeOffset +TimePeriod +TimePointGranularity +TimeRange +TimeRangeDrillDownFilter +TimeRangeFilter +TimeRangeFilterInput +TimeRangeFilterOutput +TimeRangeFilterValue +TimeRangeLowerBound +TimeRangeType +TimeRangeUpperBound +TimeRangeValue +TimeRanges +TimeSeries +TimeSeriesCondition +TimeSeriesConditions +TimeSeriesConfig +TimeSeriesDataPoint +TimeSeriesFeedback +TimeSeriesForecastingJobConfig +TimeSeriesForecastingSettings +TimeSeriesGranularity +TimeSeriesId +TimeSeriesIdentifiers +TimeSeriesList +TimeSeriesMeasureValueColumnInfo +TimeSeriesReplacementsDataSource +TimeSeriesSelector +TimeSeriesServiceStatistics +TimeSeriesSummaries +TimeSeriesSummary +TimeSeriesTransformation +TimeSeriesTransformations +TimeSeriesValue +TimeSignalMessage +TimeSpan +TimeStamp +TimeToLive +TimeToLiveDescription +TimeToLiveInSeconds +TimeToLiveSpecification +TimeToLiveStatus +TimeUnit +TimeWindow +TimeZone +TimeZoneId +Timecode +TimecodeBurnin +TimecodeBurninSettings +TimecodeConfig +TimecodeInsertion +TimecodeSource +TimecodeStart +TimedMetadata +TimedMetadataBehavior +TimedMetadataBoxVersion +TimedMetadataId3Frame +TimedMetadataId3Period +TimedMetadataInsertion +TimedMetadataPid +TimedMetadataSchemeIdUri +TimedMetadataValue +TimedOutSteps +TimeframeCap +Timeline +TimelineEvent +Timeout +TimeoutAction +TimeoutActions +TimeoutConfig +TimeoutCount +TimeoutDurationMinutes +TimeoutInMillis +TimeoutInMinutes +TimeoutInSeconds +TimeoutSeconds +Timer +TimerCanceledEventAttributes +TimerDefinition +TimerFiredEventAttributes +TimerStartedEventAttributes +TimerType +TimerValue +Timers +Times +Timestamp +TimestampAttributeName +TimestampColumn +TimestampColumnName +TimestampDeltaMilliseconds +TimestampForCollection +TimestampFormat +TimestampFormats +TimestampList +TimestampMetricValuePair +TimestampMetricValuePairList +TimestampOffset +TimestampOffsetMode +TimestampOutOfBoundsException +TimestampPartition +TimestampRange +TimestampRanges +TimestampStructure +TimestampValue +Timestamps +TimestreamAction +TimestreamConfig +TimestreamConfiguration +TimestreamDestination +TimestreamDimension +TimestreamRegistrationResponse +TimestreamResources +TimestreamSettings +TimestreamTimestamp +Timezone +TimezoneEstimationMethods +TimezoneName +TimezoneOffset +TimezonesCompletedCount +TimezonesTotalCount +Timing +TimingInformation +TipOfSourceReferenceIsDifferentException +TipsDivergenceExceededException +Title +TitleAggregation +TitleAggregationResponse +TitleOptions +TitleOverride +TitleRequiredException +Tld +TlogAccessMode +Tls +TlsCertificate +TlsCertificateData +TlsCiphers +TlsConfig +TlsConfigInput +TlsContext +TlsPolicy +TlsSessionResumptionMode +TlsValidationContext +TlsValidationContextAcmTrust +TlsValidationContextFileTrust +TlsValidationContextSdsTrust +TmpDirIAMRole +Tmpfs +To +ToAddresses +ToDate +ToDbClusterArn +ToExclusive +ToKey +ToPhoneNumber +ToPort +ToTime +ToTimeStamp +ToType +ToggleButtonsVisibility +Token +TokenAlreadyExistsException +TokenBalance +TokenCode +TokenData +TokenDomains +TokenDuration +TokenEndpoint +TokenFilter +TokenId +TokenIdentifier +TokenIds +TokenKey +TokenKeyId +TokenProperties +TokenType +TokenValidityUnits +TokenValidityUnitsType +TokenValue +TokenizedBody +TokenizedTitle +Tokens +TollFreePrefix +TooLongCSPInResponseHeadersPolicy +TooManyAccessPointsException +TooManyActionsException +TooManyApplicationVersionsException +TooManyApplicationsException +TooManyBucketsException +TooManyCacheBehaviors +TooManyCachePolicies +TooManyCertificates +TooManyCertificatesException +TooManyCloudFrontOriginAccessIdentities +TooManyConfigurationTemplatesException +TooManyContinuousDeploymentPolicies +TooManyCookieNamesInWhiteList +TooManyCookiesInCachePolicy +TooManyCookiesInOriginRequestPolicy +TooManyCustomHeadersInResponseHeadersPolicy +TooManyDistributionCNAMEs +TooManyDistributions +TooManyDistributionsAssociatedToCachePolicy +TooManyDistributionsAssociatedToFieldLevelEncryptionConfig +TooManyDistributionsAssociatedToKeyGroup +TooManyDistributionsAssociatedToOriginAccessControl +TooManyDistributionsAssociatedToOriginRequestPolicy +TooManyDistributionsAssociatedToResponseHeadersPolicy +TooManyDistributionsWithFunctionAssociations +TooManyDistributionsWithLambdaAssociations +TooManyDistributionsWithSingleFunctionARN +TooManyEntriesInBatchRequestException +TooManyEnvironmentsException +TooManyFailedAttemptsException +TooManyFieldLevelEncryptionConfigs +TooManyFieldLevelEncryptionContentTypeProfiles +TooManyFieldLevelEncryptionEncryptionEntities +TooManyFieldLevelEncryptionFieldPatterns +TooManyFieldLevelEncryptionProfiles +TooManyFieldLevelEncryptionQueryArgProfiles +TooManyFunctionAssociations +TooManyFunctions +TooManyHeadersInCachePolicy +TooManyHeadersInForwardedValues +TooManyHeadersInOriginRequestPolicy +TooManyHealthChecks +TooManyHostedZones +TooManyInvalidationsInProgress +TooManyKeyGroups +TooManyKeyGroupsAssociatedToDistribution +TooManyKeySigningKeys +TooManyLabelsException +TooManyLambdaFunctionAssociations +TooManyListenersException +TooManyLoadBalancersException +TooManyOriginAccessControls +TooManyOriginCustomHeaders +TooManyOriginGroupsPerDistribution +TooManyOriginRequestPolicies +TooManyOrigins +TooManyPlatformsException +TooManyPoliciesException +TooManyPublicKeys +TooManyPublicKeysInKeyGroup +TooManyQueryStringParameters +TooManyQueryStringsInCachePolicy +TooManyQueryStringsInOriginRequestPolicy +TooManyRealtimeLogConfigs +TooManyRegistrationsForTargetIdException +TooManyRemoveHeadersInResponseHeadersPolicy +TooManyRequests +TooManyRequestsException +TooManyResponseHeadersPolicies +TooManyRulesException +TooManyStreamingDistributionCNAMEs +TooManyStreamingDistributions +TooManySubscriptionsException +TooManyTagKeysException +TooManyTags +TooManyTagsException +TooManyTagsFault +TooManyTargetGroupsException +TooManyTargetsException +TooManyTrafficPolicies +TooManyTrafficPolicyInstances +TooManyTrafficPolicyVersionsForCurrentPolicy +TooManyTrustedSigners +TooManyUniqueTargetGroupsPerLoadBalancerException +TooManyUpdates +TooManyVPCAssociationAuthorizations +Tool +Toolchain +ToolchainSource +ToolsVersion +Tooltip +TooltipFields +TooltipItem +TooltipOptions +TooltipTitleType +TooltipVisibility +Top +TopAnomalousServices +TopAnswer +TopBottomFilter +TopBottomMovers +TopBottomMoversComputation +TopBottomRanked +TopBottomRankedComputation +TopContributors +TopOffset +TopResources +Topic +TopicARN +TopicArn +TopicCalculatedField +TopicCategoryFilter +TopicCategoryFilterConstant +TopicColumn +TopicConfiguration +TopicConfigurations +TopicDateRangeFilter +TopicDefaultPreferences +TopicDetails +TopicFilter +TopicId +TopicLimitExceededException +TopicName +TopicNamedEntity +TopicNames +TopicNumericEqualityFilter +TopicNumericRangeFilter +TopicPreference +TopicPreferences +TopicRangeFilterConstant +TopicRefreshDetails +TopicRefreshSchedule +TopicRefreshScheduleSummary +TopicRelativeDateFilter +TopicRule +TopicRuleDestination +TopicRuleDestinationConfiguration +TopicRuleDestinationSummary +TopicRuleListItem +TopicRulePayload +TopicScheduleType +TopicSingularFilterConstant +TopicStatus +TopicSummary +Topics +TopicsDetectionJobFilter +TopicsDetectionJobProperties +TopicsDetectionJobPropertiesList +TopicsSummaries +Topk +ToscaOverride +Total +TotalActions +TotalActualHours +TotalActualSpend +TotalActualUnits +TotalAddressCount +TotalAggregation +TotalAggregationComputation +TotalAmortizedCommitment +TotalAmortizedFee +TotalAuthenticatedEntities +TotalAvailableAddressCount +TotalBackupSizeInMegaBytes +TotalBarLabel +TotalBytes +TotalCap +TotalCapacity +TotalCapacityProvisioned +TotalCapacityUsed +TotalCellStyle +TotalCodeSize +TotalCommitment +TotalCost +TotalCount +TotalDataInMegaBytes +TotalDiscoveredResources +TotalDuration +TotalEndpointCount +TotalEntries +TotalEstimatedMonthlySavingsAmount +TotalEstimatedMonthlySavingsPercentage +TotalExecutionTimeInMillis +TotalExpectedSpend +TotalExtractedDataInGB +TotalFailures +TotalFilteredCount +TotalFpgaMemoryInMiB +TotalFulfilledCapacity +TotalGb +TotalGpuMemoryInMiB +TotalHourlyPrice +TotalImpact +TotalImpactFilter +TotalImpactPercentage +TotalInferenceMemoryInMiB +TotalInstanceCount +TotalLabeled +TotalLabels +TotalLocalStorageGB +TotalLocalStorageGBRequest +TotalLogicalCapacityUsed +TotalNodes +TotalNumRows +TotalNumberOfDuplicateTimestamps +TotalNumberOfFiles +TotalNumberOfInvalidValues +TotalNumberOfMissingValues +TotalNumberOfResults +TotalNumberOfRows +TotalNumberOfStages +TotalNumberOfTasks +TotalNumberOfUnsupportedTimestamps +TotalNumberOfUsers +TotalObjects +TotalOptions +TotalPartsCount +TotalPercentageArea +TotalPieces +TotalPolicyCount +TotalPotentialRISavings +TotalProcessed +TotalProvisionedStorageInMegaBytes +TotalRecommendationCount +TotalRecordCount +TotalResizeDataInMegaBytes +TotalResourceUtilization +TotalResources +TotalResponseTime +TotalResultsCount +TotalRowsInDataset +TotalRuleCount +TotalRunningHours +TotalRunningHoursInLookbackPeriod +TotalRunningNormalizedUnits +TotalScheduledInstanceHours +TotalSegments +TotalShards +TotalSize +TotalSizeInGB +TotalSizeLimitExceededException +TotalSnapshotCapacityUsed +TotalStackInstancesCount +TotalSteps +TotalStorageCapacityInMegaBytes +TotalSuggestionsCount +TotalTargetCapacity +TotalUnAssignedShards +TotalUpfrontPrice +TotalVCpus +TotalsVisibility +ToxicityCategories +ToxicityDetection +ToxicityDetectionSettings +TpmSupport +Trace +TraceConfiguration +TraceContent +TraceHeader +TraceId +TraceIds +TraceOutput +TraceSegmentDocuments +TraceSummaries +TraceSummary +TraceUser +Traceback +Traces +TracesProcessedCount +TracingConfig +TracingConfigResponse +TracingConfiguration +TracingEnabled +Track +TrackData +TrackListMessage +TrackNumber +TrackSourceSettings +TrackedActionLastAccessed +TrackedActionsLastAccessed +TrackedClusterId +TrackedIsps +TrackerArn +TrackerName +TrackingConfig +TrackingInformation +TrackingNumber +TrackingOptions +TrackingOptionsAlreadyExistsException +TrackingOptionsDoesNotExistException +Tracks +TrafficConfig +TrafficDialPercentage +TrafficDirection +TrafficDistributionGroup +TrafficDistributionGroupId +TrafficDistributionGroupSummary +TrafficDistributionGroupSummaryList +TrafficDistributionGroupUserSummary +TrafficDistributionGroupUserSummaryList +TrafficMirrorFilter +TrafficMirrorFilterId +TrafficMirrorFilterIds +TrafficMirrorFilterRule +TrafficMirrorFilterRuleId +TrafficMirrorFilters +TrafficMirrorPortRange +TrafficMirrorPortRangeRequest +TrafficMirrorSession +TrafficMirrorSessionId +TrafficMirrorSessionIds +TrafficMirrorSessions +TrafficMirrorTarget +TrafficMirrorTargetId +TrafficMirrorTargetIds +TrafficMirrorTargets +TrafficPattern +TrafficPercentageToMonitor +TrafficPolicies +TrafficPolicy +TrafficPolicyAlreadyExists +TrafficPolicyCount +TrafficPolicyId +TrafficPolicyIdMarker +TrafficPolicyInUse +TrafficPolicyInstance +TrafficPolicyInstanceAlreadyExists +TrafficPolicyInstanceCount +TrafficPolicyInstanceId +TrafficPolicyInstanceNameMarker +TrafficPolicyInstanceTypeMarker +TrafficPolicyInstances +TrafficPolicySummaries +TrafficPolicySummary +TrafficPolicyType +TrafficPolicyVersion +TrafficPolicyVersionMarker +TrafficRoute +TrafficRoutingConfig +TrafficRoutingConfiguration +TrafficSource +TrafficSourceIdentifier +TrafficSourceState +TrafficSourceType +TrafficSources +TrafficType +Trail +TrailARN +TrailAlreadyExistsException +TrailArn +TrailInfo +TrailName +TrailNotFoundException +TrailNotProvidedException +TrailProperties +Trails +TrainedModelArn +TrainedModelMetrics +TrainingChannels +TrainingData +TrainingDataConfig +TrainingDataEndTime +TrainingDataResult +TrainingDataSchema +TrainingDataSourceId +TrainingDataStartTime +TrainingEndTime +TrainingEndTimestamp +TrainingExecutionEndTime +TrainingExecutionStartTime +TrainingImage +TrainingImageConfig +TrainingImageDigest +TrainingInputMode +TrainingJob +TrainingJobArn +TrainingJobDefinition +TrainingJobDefinitionName +TrainingJobDefinitions +TrainingJobEarlyStoppingType +TrainingJobName +TrainingJobStatus +TrainingJobStatusCounters +TrainingJobStepMetadata +TrainingJobSummaries +TrainingJobSummary +TrainingMetrics +TrainingMetricsV2 +TrainingParameters +TrainingRepositoryAccessMode +TrainingRepositoryAuthConfig +TrainingRepositoryCredentialsProviderArn +TrainingResult +TrainingResultV2 +TrainingSpecification +TrainingStartTime +TrainingTimeInSeconds +Trait +TraitDiffRule +Traits +TransactGetItem +TransactGetItemsInput +TransactGetItemsOutput +TransactItems +TransactStatements +TransactWriteItem +TransactWriteItemsInput +TransactWriteItemsOutput +Transaction +TransactionCanceledException +TransactionCommitInProgressException +TransactionCommittedException +TransactionConflictException +TransactionData +TransactionDescription +TransactionEndTime +TransactionEvent +TransactionId +TransactionInProgressException +TransactionOutputItem +TransactionStartTime +TransactionStatus +TransactionType +TransactionalMessagesPerSecond +Transactions +TranscodeProfileName +Transcript +TranscriptEvent +TranscriptFileUri +TranscriptFilter +TranscriptFilterType +TranscriptResultStream +TranscriptSourceSetting +TranscriptionConfiguration +TranscriptionJob +TranscriptionJobName +TranscriptionJobStatus +TranscriptionJobSummaries +TranscriptionJobSummary +TranscriptionMessages +TranscriptionMessagesConcatenationConfiguration +TransferAccountId +TransferAlreadyCompletedException +TransferCertificateRequest +TransferCertificateResponse +TransferConflictException +TransferContactRequest +TransferContactResponse +TransferData +TransferDomainRequest +TransferDomainResponse +TransferDomainToAnotherAwsAccountRequest +TransferDomainToAnotherAwsAccountResponse +TransferDuration +TransferId +TransferInputDeviceRequest +TransferLock +TransferMessage +TransferMode +TransferOfferAcceptedTimestamp +TransferOfferExpirationTimestamp +TransferOption +TransferPrice +TransferStatus +TransferType +Transferability +Transferable +Transferred +TransferringInputDeviceSummary +Transform +TransformConfigParameter +TransformDataSource +TransformEncryption +TransformEndTime +TransformFilterCriteria +TransformId +TransformIds +TransformInput +TransformJob +TransformJobArn +TransformJobDefinition +TransformJobName +TransformJobStatus +TransformJobStepMetadata +TransformJobSummaries +TransformJobSummary +TransformName +TransformOutput +TransformParameters +TransformProcessingConfig +TransformResources +TransformS3DataSource +TransformSchema +TransformSortCriteria +TransformStartTime +TransformType +TransformationConfigurations +TransformationRules +TransformationTool +Transformations +Transforms +TransitEncryption +TransitEncryptionEnabled +TransitEncryptionMode +TransitEncryptionPort +TransitGateway +TransitGatewayAddress +TransitGatewayArn +TransitGatewayArns +TransitGatewayAsn +TransitGatewayAssociation +TransitGatewayAttachment +TransitGatewayAttachmentArn +TransitGatewayAttachmentAssociation +TransitGatewayAttachmentBgpConfiguration +TransitGatewayAttachmentId +TransitGatewayAttachmentIds +TransitGatewayAttachmentPropagation +TransitGatewayAttachmentPropagations +TransitGatewayAttachments +TransitGatewayCidrBlocks +TransitGatewayConfiguration +TransitGatewayConnect +TransitGatewayConnectOptions +TransitGatewayConnectPeer +TransitGatewayConnectPeerArn +TransitGatewayConnectPeerArns +TransitGatewayConnectPeerAssociation +TransitGatewayConnectPeerAssociations +TransitGatewayConnectPeerConfiguration +TransitGatewayConnectPeerId +TransitGatewayConnectPeerIds +TransitGatewayConnectPeers +TransitGatewayConnectRequestBgpOptions +TransitGatewayConnects +TransitGatewayId +TransitGatewayIds +TransitGatewayMulticastDeregisteredGroupMembers +TransitGatewayMulticastDeregisteredGroupSources +TransitGatewayMulticastDomain +TransitGatewayMulticastDomainArn +TransitGatewayMulticastDomainAssociation +TransitGatewayMulticastDomainAssociations +TransitGatewayMulticastDomainId +TransitGatewayMulticastDomainIds +TransitGatewayMulticastDomainOptions +TransitGatewayMulticastDomains +TransitGatewayMulticastGroup +TransitGatewayMulticastRegisteredGroupMembers +TransitGatewayMulticastRegisteredGroupSources +TransitGatewayOptions +TransitGatewayOwnerId +TransitGatewayPeering +TransitGatewayPeeringAttachment +TransitGatewayPeeringAttachmentId +TransitGatewayPeeringAttachmentOptions +TransitGatewayPeeringAttachments +TransitGatewayPolicyRule +TransitGatewayPolicyRuleMetaData +TransitGatewayPolicyTable +TransitGatewayPolicyTableAssociation +TransitGatewayPolicyTableEntries +TransitGatewayPolicyTableEntry +TransitGatewayPolicyTableId +TransitGatewayPolicyTableIds +TransitGatewayPolicyTables +TransitGatewayPrefixListAttachment +TransitGatewayPrefixListReference +TransitGatewayPrefixListReferences +TransitGatewayPropagation +TransitGatewayRegistration +TransitGatewayRegistrationStateReason +TransitGatewayRegistrations +TransitGatewayRequestOptions +TransitGatewayRoute +TransitGatewayRouteAttachment +TransitGatewayRouteTable +TransitGatewayRouteTableAnnouncement +TransitGatewayRouteTableAnnouncementId +TransitGatewayRouteTableAnnouncementIds +TransitGatewayRouteTableAnnouncements +TransitGatewayRouteTableArn +TransitGatewayRouteTableAssociation +TransitGatewayRouteTableAttachment +TransitGatewayRouteTableId +TransitGatewayRouteTableIds +TransitGatewayRouteTablePropagation +TransitGatewayRouteTablePropagations +TransitGatewayRouteTableRoute +TransitGatewayRouteTables +TransitGatewayVpcAttachment +TransitGatewayVpcAttachmentOptions +TransitGatewayVpcAttachments +TransitGateways +Transition +TransitionEvent +TransitionState +TransitionToIA +TransitionToPrimaryStorageClass +Transitions +TransitiveTagKeys +TranslateDocumentRequest +TranslateDocumentResponse +TranslatePinDataInput +TranslatePinDataOutput +TranslateTextRequest +TranslateTextResponse +TranslatedDocument +TranslatedDocumentsCount +TranslatedText +TranslationPinDataIsoFormat034 +TranslationSettings +TransmissionInterval +TransmitMode +Transport +TransportAttachmentId +TransportProtocol +TransportStreamBitrate +TransportStreamId +TransportStreamReservedBitrate +TransportTransitGatewayAttachmentId +TravelMode +TreatMissingData +TreatUndefinedSpecifiedValues +TreatUnrecognizedResourceTypesAsWarnings +Treatment +TreatmentConfig +TreatmentDescription +TreatmentId +TreatmentName +TreatmentOption +TreatmentResource +TreeMapAggregatedFieldWells +TreeMapConfiguration +TreeMapFieldWells +TreeMapGroupItemsLimitConfiguration +TreeMapSort +TreeMapSortConfiguration +TreeMapVisual +TrendArrowOptions +TrendArrows +TrendGroupSort +TrendGroups +Trendmicro +TrendmicroConnectorProfileCredentials +TrendmicroSourceProperties +Trial +TrialArn +TrialComponent +TrialComponentArn +TrialComponentArtifact +TrialComponentDisplayName +TrialComponentMetricSummary +TrialComponentName +TrialComponentSimpleSummary +TrialComponentSource +TrialComponentSourceDetail +TrialComponentStatus +TrialComponentSummaries +TrialComponentSummary +TrialMinutes +TrialName +TrialSource +TrialSummaries +TrialSummary +Trigger +TriggerConfig +TriggerDetails +TriggerEventSource +TriggerFindingId +TriggerName +TriggerNames +TriggerNodeDetails +TriggerProperties +TriggerTargetsLimitExceededException +TriggerTime +TriggerType +TriggerUpdate +TriggerValue +TriggeredAlarms +TriggeredBy +TriggeringDataset +Triggers +TriggersNotFound +TrimBlanks +TrimSpaceInChar +TrimWhiteSpace +TrimmedDataAccessException +TruckDimensions +TruckModeOptions +TruckWeight +TrueActivity +TruePeakLimiterThreshold +TruncateColumns +Truncated +TrunkInterfaceAssociation +TrunkInterfaceId +Trust +TrustAnchor +TrustAnchorCertificate +TrustAnchorDetail +TrustAnchorDetailResponse +TrustAnchors +TrustDirection +TrustId +TrustIds +TrustPassword +TrustProviderType +TrustState +TrustStateReason +TrustStore +TrustStoreSummary +TrustType +TrustedAdvisorCategorySpecificSummary +TrustedAdvisorCheckDescription +TrustedAdvisorCheckRefreshStatus +TrustedAdvisorCheckResult +TrustedAdvisorCheckSummary +TrustedAdvisorCostOptimizingSummary +TrustedAdvisorIntegrationStatus +TrustedAdvisorResourceDetail +TrustedAdvisorResourcesSummary +TrustedCertificatePublicKey +TrustedHostKeys +TrustedKeyGroupDoesNotExist +TrustedKeyGroups +TrustedResourceOwners +TrustedSignerDoesNotExist +TrustedSigners +Trusts +TruststoreUri +TruststoreVersion +TruststoreWarnings +TruthyCellValue +TruthyCellValueSynonyms +TsEncryptionMethod +TsFileMode +TsIncludeDvbSubtitles +TsUseAudioRenditionGroup +TsvOptions +TsvStoreOptions +TsvVersionOptions +Ttl +TtlDuration +TtmlDestinationSettings +Tuesday +TumblingWindow +TumblingWindowInSeconds +TunedHPOParams +TunedHyperParameters +TuningDataS3Uri +TuningJob +TuningJobArn +TuningJobCompletionCriteria +TuningJobCompletionDetails +TuningJobName +TuningJobStepMetaData +TuningObjective +Tunnel +TunnelInsideCidr +TunnelInsideIpVersion +TunnelInsideIpv6Cidr +TunnelOption +TunnelOptions +TunnelSummary +TurkErrorCode +TurnControlUrl +TurnSpecification +TwitterParameters +TwoWayChannelArn +TwoWayEnabled +Type +TypeAlreadyExistsFault +TypeArn +TypeConfigurationAlias +TypeConfigurationArn +TypeConfigurationDetails +TypeConfigurationIdentifier +TypeConfigurationIdentifiers +TypeConfigurationNotFoundException +TypeConfigurationVersionId +TypeConfigurations +TypeDeprecatedFault +TypeFilters +TypeHierarchy +TypeId +TypeIdentifier +TypeName +TypeNameAlias +TypeNamePrefix +TypeNotFoundException +TypeParameters +TypeSummaries +TypeSummary +TypeTestsStatus +TypeTestsStatusDescription +TypeVersionArn +TypeVersionId +TypeVersionSummaries +TypeVersionSummary +TypedAttributeValueRange +TypedLinkAttributeDefinition +TypedLinkAttributeRange +TypedLinkFacet +TypedLinkFacetAttributeUpdate +TypedLinkName +TypedLinkSchemaAndFacetName +TypedLinkSpecifier +TypedLinkSpecifiers +Types +Typography +UIColorPalette +UICustomization +UICustomizationType +URI +URL +URLOperation +URLPath +URLStyling +URLTarget +URLTemplate +USD +UUID +Uarfcn +Uarfcndl +UdpContainerSettings +UdpGroupSettings +UdpOutputSettings +UefiData +UhdDeviceSettings +UiConfig +UiTemplate +UiTemplateInfo +UiTemplateS3Uri +Uid +UlBucketSize +UlRate +UlRatePolicy +Ulimit +Ulimits +UnAuthenticated +UnModifiedSinceConstraint +UnableToDetectSchemaException +UnaggregatedField +UnapplyCustomPermissions +UnarchiveApplicationRequest +UnarchiveFindingsRequest +UnarchiveWaveRequest +UnassignInstanceRequest +UnassignIpv6AddressesRequest +UnassignIpv6AddressesResult +UnassignPrivateIpAddressesRequest +UnassignPrivateNatGatewayAddressRequest +UnassignPrivateNatGatewayAddressResult +UnassignVolumeRequest +UnassignedIpv6Addresses +UnassignedIpv6Prefixes +Unassigning +Unauthenticated +UnauthenticatedException +UnauthenticatedLogin +UnauthorizedCacheControlHeaderStrategy +UnauthorizedClientException +UnauthorizedException +UnauthorizedOperation +UnauthorizedOperationException +UnauthorizedPartnerIntegrationFault +UnauthorizedResourceAccessException +UnavailablePriorities +UncertaintyRange +UnclaimDeviceRequest +UnclaimDeviceResponse +Undeploy +UndeploySystemInstanceRequest +UndeploySystemInstanceResponse +UndeprecateActivityTypeInput +UndeprecateDomainInput +UndeprecateWorkflowTypeInput +UnderlayIpAddress +UndetectedDocumentTypes +UndetectedSignature +UndetectedSignatures +UndoRedoDisabled +UnexpectedLambdaException +UnfilteredPartition +UnfilteredPartitions +UngroupResourcesInput +UngroupResourcesOutput +UnhealthySince +UnhealthyThreshold +UnhealthyThresholdCount +UnicodeIcon +UniformBorder +UniformResourceIdentifier +UnindexedFace +UnindexedFaces +UninitializedAccountException +Union +UnionType +UniqueAccountIdentifier +UniqueAttribute +UniqueContributors +UniqueId +UniqueKey +UniqueProblem +UniqueProgramId +UniqueRequestToken +UniqueTag +UniqueTagResourceIdentifier +UniqueThreatNameCount +UniqueTicPerAudioTrack +UniqueValues +UniqueValuesComputation +Unit +UnitCost +UnitLabel +UnitNumber +UnitScaler +UnitType +Units +Unknown +UnknownHostCount +UnknownIpPermissions +UnknownMonitorException +UnknownResourceException +UnknownResourceFault +UnknownSnapshotCopyRegionFault +UnknownSubscriptionException +UnlabelParameterVersionRequest +UnlabelParameterVersionResult +Unlabeled +UnlinkDeveloperIdentityInput +UnlinkIdentityInput +UnlockCode +UnlockDelay +UnlockDelayUnit +UnlockDelayValue +UnlockRuleRequest +UnlockRuleResponse +UnmappedAttribute +UnmappedAttributes +UnmatchedFaces +UnmatchedPolicyPermissionException +UnmodifiableEntityException +UnmonitorInstancesRequest +UnmonitorInstancesResult +UnpeerVpcResult +UnpredictableNumber +UnprocessableEntityException +UnprocessedAccount +UnprocessedAccounts +UnprocessedAssociationUpdates +UnprocessedAssociations +UnprocessedAutomationRule +UnprocessedAutomationRules +UnprocessedCluster +UnprocessedClusters +UnprocessedDataSources +UnprocessedDataSourcesResult +UnprocessedFindings +UnprocessedGraph +UnprocessedGraphs +UnprocessedIdentifiers +UnprocessedIdentityId +UnprocessedIdentityIds +UnprocessedIds +UnprocessedItems +UnprocessedKeys +UnprocessedNamedQueryId +UnprocessedNamedQueryIds +UnprocessedPreparedStatementName +UnprocessedPreparedStatementNames +UnprocessedQueryExecutionId +UnprocessedQueryExecutionIds +UnprocessedRecords +UnprocessedResourceIdentifiers +UnprocessedScramSecret +UnprocessedScramSecrets +UnprocessedSecurityControl +UnprocessedStandardsControlAssociation +UnprocessedStandardsControlAssociationUpdate +UnprocessedStatistics +UnprocessedTraceIds +UnprocessedTraceSegment +UnprocessedTraceSegments +UnprocessedTypeConfigurations +UnprocessedUpdateAction +UnprocessedUpdateActions +UnrealizedSavings +UnrecognizedClientException +UnrecognizedFaces +UnrecognizedPublicKeyEncodingException +UnrecognizedResourceTypes +UnregisterConnectorRequest +UnregisteredSeiTimecode +UnreportedNotApplicableCount +UnreservedConcurrentExecutions +UnresolvableUsageUnitException +UnscaledValue +UnsearchedFace +UnsearchedFaces +UnshareApplicationRequest +UnshareDirectoryRequest +UnshareDirectoryResult +UnshareInterval +UnshareIntervalUnit +UnshareTarget +UnspecifiedCount +UnsubscribeAll +UnsubscribeFromDatasetRequest +UnsubscribeFromEventRequest +UnsubscribeInput +UnsubscribeRequest +UnsubscribeResult +Unsuccessful +UnsuccessfulFaceAssociation +UnsuccessfulFaceAssociations +UnsuccessfulFaceDeletion +UnsuccessfulFaceDeletions +UnsuccessfulFaceDisassociation +UnsuccessfulFaceDisassociations +UnsuccessfulFleetDeletions +UnsuccessfulFleetRequests +UnsuccessfulInstanceCreditSpecificationItem +UnsuccessfulInstanceCreditSpecificationItemError +UnsuccessfulInstanceCreditSpecifications +UnsuccessfulItem +UnsuccessfulItemError +UnsuccessfullyDeletedLaunchTemplateVersions +UnsupportedAPIEndpointException +UnsupportedActionException +UnsupportedActionForDeploymentTypeException +UnsupportedAddressException +UnsupportedAvailabilityZone +UnsupportedAvailabilityZoneException +UnsupportedCalendarException +UnsupportedCommandException +UnsupportedDigitalSignatureMethodException +UnsupportedDisplayLanguageCodeException +UnsupportedDocumentEncodingException +UnsupportedDocumentException +UnsupportedFeatureException +UnsupportedFeatureRequiredException +UnsupportedGrantTypeException +UnsupportedIdentityProviderException +UnsupportedImageTypeException +UnsupportedIndexTypeException +UnsupportedInventoryItemContextException +UnsupportedInventorySchemaVersionException +UnsupportedLanguageException +UnsupportedLanguagePairException +UnsupportedLocale +UnsupportedMediaTypeException +UnsupportedNetworkConfigurationException +UnsupportedOperatingSystem +UnsupportedOperation +UnsupportedOperationException +UnsupportedOperationFault +UnsupportedOptionFault +UnsupportedParameterType +UnsupportedPlatformType +UnsupportedPlsAlphabetException +UnsupportedPlsLanguageException +UnsupportedPricingPlanException +UnsupportedProtocolException +UnsupportedRegionException +UnsupportedResource +UnsupportedSettingsException +UnsupportedStreamMediaTypeException +UnsupportedTLD +UnsupportedTimestamps +UnsupportedTokenTypeException +UnsupportedUpstreamRegistryException +UnsupportedUserEditionException +UnsupportedUserStateException +UnsupportedWorkspaceConfigurationException +UntagAttendeeRequest +UntagCertificateAuthorityRequest +UntagColumnOperation +UntagDeliveryStreamInput +UntagInput +UntagInstanceProfileRequest +UntagLogGroupRequest +UntagMFADeviceRequest +UntagMeetingRequest +UntagOpenIDConnectProviderRequest +UntagOutput +UntagPolicyRequest +UntagProjectRequest +UntagQueueRequest +UntagResourceInput +UntagResourceOutput +UntagResourceRequest +UntagResourceResponse +UntagResourceResult +UntagResourcesInput +UntagResourcesOutput +UntagRoleRequest +UntagSAMLProviderRequest +UntagServerCertificateRequest +UntagStreamInput +UntagUserRequest +UntrustedArtifactOnDeployment +UnusedAccountValidityDays +UnusedCommitment +UnusedHours +UnusedUnits +Unwrap +UpScaling +Update +UpdateACLRequest +UpdateACLResponse +UpdateAbpV1_0_x +UpdateAbpV1_1 +UpdateAcceleratorAttributesRequest +UpdateAcceleratorAttributesResponse +UpdateAcceleratorRequest +UpdateAcceleratorResponse +UpdateAccessControlConfigurationRequest +UpdateAccessKeyRequest +UpdateAccessLogSubscriptionRequest +UpdateAccessLogSubscriptionResponse +UpdateAccessPolicyRequest +UpdateAccessPolicyResponse +UpdateAccessRequest +UpdateAccessResponse +UpdateAccountAuditConfigurationRequest +UpdateAccountConfigurationRequest +UpdateAccountConfigurationResponse +UpdateAccountCustomizationRequest +UpdateAccountCustomizationResponse +UpdateAccountPasswordPolicyRequest +UpdateAccountRequest +UpdateAccountResponse +UpdateAccountSendingEnabledRequest +UpdateAccountSettingsInput +UpdateAccountSettingsOutput +UpdateAccountSettingsRequest +UpdateAccountSettingsResponse +UpdateAction +UpdateActionAvailableDate +UpdateActionRequest +UpdateActionResponse +UpdateActionResultsMessage +UpdateActionStatus +UpdateActionStatusModifiedDate +UpdateActionTargetRequest +UpdateActionTypeInput +UpdateActions +UpdateActionsMessage +UpdateActiveModelVersionRequest +UpdateActiveModelVersionResponse +UpdateActivities +UpdateAddonRequest +UpdateAddonResponse +UpdateAddress +UpdateAddressBookRequest +UpdateAdmChannelRequest +UpdateAdmChannelResponse +UpdateAgentLogLevel +UpdateAgentRequest +UpdateAgentStatusRequest +UpdateAgentStatusResponse +UpdateAgreementRequest +UpdateAgreementResponse +UpdateAlarmModelRequest +UpdateAlarmModelResponse +UpdateAlertRequest +UpdateAlertResponse +UpdateAliasInput +UpdateAliasOutput +UpdateAliasRequest +UpdateAllowListRequest +UpdateAllowListResponse +UpdateAnalysisPermissionsRequest +UpdateAnalysisPermissionsResponse +UpdateAnalysisRequest +UpdateAnalysisResponse +UpdateAnalysisTemplateInput +UpdateAnalysisTemplateOutput +UpdateAnnotationStoreRequest +UpdateAnnotationStoreResponse +UpdateAnnotationStoreVersionRequest +UpdateAnnotationStoreVersionResponse +UpdateAnomalyDetectorRequest +UpdateAnomalyDetectorResponse +UpdateAnomalyMonitorRequest +UpdateAnomalyMonitorResponse +UpdateAnomalySubscriptionRequest +UpdateAnomalySubscriptionResponse +UpdateAnswerInput +UpdateAnswerOutput +UpdateApiCacheRequest +UpdateApiCacheResponse +UpdateApiDestinationRequest +UpdateApiDestinationResponse +UpdateApiKeyRequest +UpdateApiKeyResponse +UpdateApiMappingRequest +UpdateApiMappingResponse +UpdateApiRequest +UpdateApiResponse +UpdateApnsChannelRequest +UpdateApnsChannelResponse +UpdateApnsSandboxChannelRequest +UpdateApnsSandboxChannelResponse +UpdateApnsVoipChannelRequest +UpdateApnsVoipChannelResponse +UpdateApnsVoipSandboxChannelRequest +UpdateApnsVoipSandboxChannelResponse +UpdateAppAuthorizationRequest +UpdateAppAuthorizationResponse +UpdateAppBlockBuilderRequest +UpdateAppBlockBuilderResult +UpdateAppImageConfigRequest +UpdateAppImageConfigResponse +UpdateAppInstanceBotRequest +UpdateAppInstanceBotResponse +UpdateAppInstanceRequest +UpdateAppInstanceResponse +UpdateAppInstanceUserEndpointRequest +UpdateAppInstanceUserEndpointResponse +UpdateAppInstanceUserRequest +UpdateAppInstanceUserResponse +UpdateAppMonitorRequest +UpdateAppRequest +UpdateAppResponse +UpdateAppResult +UpdateAppVersionAppComponentRequest +UpdateAppVersionAppComponentResponse +UpdateAppVersionRequest +UpdateAppVersionResourceRequest +UpdateAppVersionResourceResponse +UpdateAppVersionResponse +UpdateApplicationComponentConfigRequest +UpdateApplicationInput +UpdateApplicationLayerAutomaticResponseRequest +UpdateApplicationMaintenanceConfigurationRequest +UpdateApplicationMaintenanceConfigurationResponse +UpdateApplicationMessage +UpdateApplicationRequest +UpdateApplicationResourceLifecycleMessage +UpdateApplicationResponse +UpdateApplicationResult +UpdateApplicationSettingsInput +UpdateApplicationSettingsOutput +UpdateApplicationSettingsRequest +UpdateApplicationSettingsResponse +UpdateApplicationVersionMessage +UpdateApprovalRuleTemplateContentInput +UpdateApprovalRuleTemplateContentOutput +UpdateApprovalRuleTemplateDescriptionInput +UpdateApprovalRuleTemplateDescriptionOutput +UpdateApprovalRuleTemplateNameInput +UpdateApprovalRuleTemplateNameOutput +UpdateArchiveRequest +UpdateArchiveResponse +UpdateArchiveRuleRequest +UpdateArtifactRequest +UpdateArtifactResponse +UpdateAssessmentControlRequest +UpdateAssessmentControlResponse +UpdateAssessmentControlSetStatusRequest +UpdateAssessmentControlSetStatusResponse +UpdateAssessmentFrameworkControlSet +UpdateAssessmentFrameworkRequest +UpdateAssessmentFrameworkResponse +UpdateAssessmentFrameworkShareRequest +UpdateAssessmentFrameworkShareResponse +UpdateAssessmentRequest +UpdateAssessmentResponse +UpdateAssessmentStatusRequest +UpdateAssessmentStatusResponse +UpdateAssessmentTargetRequest +UpdateAssetModelRequest +UpdateAssetModelResponse +UpdateAssetPropertyRequest +UpdateAssetRequest +UpdateAssetResponse +UpdateAssociationRequest +UpdateAssociationResult +UpdateAssociationStatusRequest +UpdateAssociationStatusResult +UpdateAssumeRolePolicyRequest +UpdateAttendeeCapabilitiesRequest +UpdateAttendeeCapabilitiesResponse +UpdateAttributeGroupRequest +UpdateAttributeGroupResponse +UpdateAttributesRequest +UpdateAuditStreamConfigurationRequest +UpdateAuditSuppressionRequest +UpdateAuthEventFeedbackRequest +UpdateAuthorizerRequest +UpdateAuthorizerResponse +UpdateAutoScalingGroupType +UpdateAutomatedDiscoveryConfigurationRequest +UpdateAutomaticTapeCreationPolicyInput +UpdateAutomaticTapeCreationPolicyOutput +UpdateAutomationRulesRequestItem +UpdateAutomationRulesRequestItems +UpdateAvailabilityConfigurationRequest +UpdateAvailabilityOptionsRequest +UpdateAvailabilityOptionsResponse +UpdateAvailable +UpdateBackendAPIRequest +UpdateBackendAPIResponse +UpdateBackendAuthForgotPasswordConfig +UpdateBackendAuthIdentityPoolConfig +UpdateBackendAuthMFAConfig +UpdateBackendAuthOAuthConfig +UpdateBackendAuthPasswordPolicyConfig +UpdateBackendAuthRequest +UpdateBackendAuthResourceConfig +UpdateBackendAuthResponse +UpdateBackendAuthUserPoolConfig +UpdateBackendAuthVerificationMessageConfig +UpdateBackendConfigRequest +UpdateBackendConfigResponse +UpdateBackendJobRequest +UpdateBackendJobResponse +UpdateBackendStorageRequest +UpdateBackendStorageResourceConfig +UpdateBackendStorageResponse +UpdateBackupPlanInput +UpdateBackupPlanOutput +UpdateBaiduChannelRequest +UpdateBaiduChannelResponse +UpdateBandwidthRateLimitInput +UpdateBandwidthRateLimitOutput +UpdateBandwidthRateLimitScheduleInput +UpdateBandwidthRateLimitScheduleOutput +UpdateBasePathMappingRequest +UpdateBatchPredictionInput +UpdateBatchPredictionOutput +UpdateBehavior +UpdateBillingGroupAccountGrouping +UpdateBillingGroupInput +UpdateBillingGroupOutput +UpdateBillingGroupRequest +UpdateBillingGroupResponse +UpdateBlueprintRequest +UpdateBlueprintResponse +UpdateBotAliasRequest +UpdateBotAliasResponse +UpdateBotLocaleRequest +UpdateBotLocaleResponse +UpdateBotRecommendationRequest +UpdateBotRecommendationResponse +UpdateBotRequest +UpdateBotResponse +UpdateBranchRequest +UpdateBranchResult +UpdateBridgeFlowSourceRequest +UpdateBridgeNetworkOutputRequest +UpdateBridgeNetworkSourceRequest +UpdateBridgeOutputRequest +UpdateBridgeOutputResponse +UpdateBridgeRequest +UpdateBridgeResponse +UpdateBridgeSourceRequest +UpdateBridgeSourceResponse +UpdateBridgeStateRequest +UpdateBridgeStateResponse +UpdateBrokerCountRequest +UpdateBrokerCountResponse +UpdateBrokerRequest +UpdateBrokerResponse +UpdateBrokerStorageRequest +UpdateBrokerStorageResponse +UpdateBrokerTypeRequest +UpdateBrokerTypeResponse +UpdateBrowserSettingsRequest +UpdateBrowserSettingsResponse +UpdateBucketBundleRequest +UpdateBucketBundleResult +UpdateBucketRequest +UpdateBucketResult +UpdateBudgetActionRequest +UpdateBudgetActionResponse +UpdateBudgetRequest +UpdateBuildInput +UpdateBuildOutput +UpdateBusinessReportScheduleRequest +UpdateByteMatchSetRequest +UpdateByteMatchSetResponse +UpdateCACertificateParams +UpdateCACertificateRequest +UpdateCachePolicyRequest +UpdateCachePolicyResult +UpdateCalculatedAttributeDefinitionRequest +UpdateCalculatedAttributeDefinitionResponse +UpdateCallAnalyticsCategoryRequest +UpdateCallAnalyticsCategoryResponse +UpdateCampaignDialerConfigRequest +UpdateCampaignNameRequest +UpdateCampaignOutboundCallConfigRequest +UpdateCampaignRequest +UpdateCampaignResponse +UpdateCanaryRequest +UpdateCapacityProviderRequest +UpdateCapacityProviderResponse +UpdateCapacityReservationInput +UpdateCaseRequest +UpdateCellRequest +UpdateCellResponse +UpdateCertificateAuthorityRequest +UpdateCertificateOptionsRequest +UpdateCertificateRequest +UpdateCertificateResponse +UpdateChangesetRequest +UpdateChangesetResponse +UpdateChannelClassRequest +UpdateChannelClassResponse +UpdateChannelFlowRequest +UpdateChannelFlowResponse +UpdateChannelGroupRequest +UpdateChannelGroupResponse +UpdateChannelMessageRequest +UpdateChannelMessageResponse +UpdateChannelReadMarkerRequest +UpdateChannelReadMarkerResponse +UpdateChannelRequest +UpdateChannelResponse +UpdateChapCredentialsInput +UpdateChapCredentialsOutput +UpdateClassificationJobRequest +UpdateClassificationScopeRequest +UpdateClassifierRequest +UpdateClientCertificateRequest +UpdateCloudFormationCollectionFilter +UpdateCloudFrontOriginAccessIdentityRequest +UpdateCloudFrontOriginAccessIdentityResult +UpdateClusterConfigRequest +UpdateClusterConfigResponse +UpdateClusterConfigurationRequest +UpdateClusterConfigurationResponse +UpdateClusterInput +UpdateClusterKafkaVersionRequest +UpdateClusterKafkaVersionResponse +UpdateClusterOutput +UpdateClusterRequest +UpdateClusterResponse +UpdateClusterSettingsRequest +UpdateClusterSettingsResponse +UpdateClusterVersionRequest +UpdateClusterVersionResponse +UpdateCodeRepositoryInput +UpdateCodeRepositoryOutput +UpdateCodeSigningConfigRequest +UpdateCodeSigningConfigResponse +UpdateCognitoUserPoolConfiguration +UpdateCollaborationInput +UpdateCollaborationOutput +UpdateCollectionDetail +UpdateCollectionRequest +UpdateCollectionResponse +UpdateColumnStatisticsForPartitionRequest +UpdateColumnStatisticsForPartitionResponse +UpdateColumnStatisticsForTableRequest +UpdateColumnStatisticsForTableResponse +UpdateCommentInput +UpdateCommentOutput +UpdateCompanyNetworkConfigurationRequest +UpdateComponentConfigurationRequest +UpdateComponentData +UpdateComponentInput +UpdateComponentOutput +UpdateComponentRequest +UpdateComponentResponse +UpdateComponentTypeRequest +UpdateComponentTypeResponse +UpdateComputeEnvironmentRequest +UpdateComputeEnvironmentResponse +UpdateConditionalForwarderRequest +UpdateConferenceProviderRequest +UpdateConfigRequest +UpdateConfigurationProfileRequest +UpdateConfigurationRequest +UpdateConfigurationResponse +UpdateConfigurationSetEventDestinationRequest +UpdateConfigurationSetReputationMetricsEnabledRequest +UpdateConfigurationSetSendingEnabledRequest +UpdateConfigurationSetTrackingOptionsRequest +UpdateConfigurationTemplateMessage +UpdateConfiguredTableAnalysisRuleInput +UpdateConfiguredTableAnalysisRuleOutput +UpdateConfiguredTableAssociationInput +UpdateConfiguredTableAssociationOutput +UpdateConfiguredTableInput +UpdateConfiguredTableOutput +UpdateConnectClientAddInRequest +UpdateConnectionAliasPermissionRequest +UpdateConnectionApiKeyAuthRequestParameters +UpdateConnectionAuthRequestParameters +UpdateConnectionBasicAuthRequestParameters +UpdateConnectionOAuthClientRequestParameters +UpdateConnectionOAuthRequestParameters +UpdateConnectionRequest +UpdateConnectionResponse +UpdateConnectivityInfoRequest +UpdateConnectivityInfoResponse +UpdateConnectivityRequest +UpdateConnectivityResponse +UpdateConnectorDefinitionRequest +UpdateConnectorProfileRequest +UpdateConnectorProfileResponse +UpdateConnectorRegistrationRequest +UpdateConnectorRegistrationResponse +UpdateConnectorRequest +UpdateConnectorResponse +UpdateConstraintInput +UpdateConstraintOutput +UpdateContactAttributesRequest +UpdateContactChannelRequest +UpdateContactEvaluationRequest +UpdateContactEvaluationResponse +UpdateContactFlowContentRequest +UpdateContactFlowMetadataRequest +UpdateContactFlowModuleContentRequest +UpdateContactFlowModuleMetadataRequest +UpdateContactFlowNameRequest +UpdateContactListRequest +UpdateContactRequest +UpdateContactScheduleRequest +UpdateContainerAgentRequest +UpdateContainerAgentResponse +UpdateContainerInstancesStateRequest +UpdateContainerInstancesStateResponse +UpdateContainerServiceRequest +UpdateContainerServiceResult +UpdateContentRequest +UpdateContentResponse +UpdateContextRequest +UpdateContextResponse +UpdateContinuousBackupsInput +UpdateContinuousBackupsOutput +UpdateContinuousDeploymentPolicyRequest +UpdateContinuousDeploymentPolicyResult +UpdateContributorInsightsInput +UpdateContributorInsightsOutput +UpdateControlPanelRequest +UpdateControlPanelResponse +UpdateControlRequest +UpdateControlResponse +UpdateCoreDefinitionRequest +UpdateCoreNetworkRequest +UpdateCoreNetworkResponse +UpdateCostAllocationTagsStatusError +UpdateCostAllocationTagsStatusRequest +UpdateCostAllocationTagsStatusResponse +UpdateCostCategoryDefinitionRequest +UpdateCostCategoryDefinitionResponse +UpdateCount +UpdateCrawlerRequest +UpdateCrawlerScheduleRequest +UpdateCrlRequest +UpdateCsvClassifierRequest +UpdateCustomKeyStoreRequest +UpdateCustomLineItemChargeDetails +UpdateCustomLineItemFlatChargeDetails +UpdateCustomLineItemInput +UpdateCustomLineItemOutput +UpdateCustomLineItemPercentageChargeDetails +UpdateCustomMetricRequest +UpdateCustomMetricResponse +UpdateCustomRoutingAcceleratorAttributesRequest +UpdateCustomRoutingAcceleratorAttributesResponse +UpdateCustomRoutingAcceleratorRequest +UpdateCustomRoutingAcceleratorResponse +UpdateCustomRoutingListenerRequest +UpdateCustomRoutingListenerResponse +UpdateCustomVerificationEmailTemplateRequest +UpdateDashboardPermissionsRequest +UpdateDashboardPermissionsResponse +UpdateDashboardPublishedVersionRequest +UpdateDashboardPublishedVersionResponse +UpdateDashboardRequest +UpdateDashboardResponse +UpdateDataCatalogInput +UpdateDataCellsFilterRequest +UpdateDataIntegrationRequest +UpdateDataLakeExceptionSubscriptionRequest +UpdateDataLakeRequest +UpdateDataLakeResponse +UpdateDataQualityRulesetRequest +UpdateDataQualityRulesetResponse +UpdateDataRepositoryAssociationRequest +UpdateDataRepositoryAssociationResponse +UpdateDataRetentionInput +UpdateDataRole +UpdateDataSecurityConfig +UpdateDataSetPermissionsRequest +UpdateDataSetPermissionsResponse +UpdateDataSetRequest +UpdateDataSetResponse +UpdateDataSource +UpdateDataSourceInput +UpdateDataSourceOutput +UpdateDataSourcePermissionsRequest +UpdateDataSourcePermissionsResponse +UpdateDataSourceRequest +UpdateDataSourceResponse +UpdateDatabaseRequest +UpdateDatabaseResponse +UpdateDatasetEntriesRequest +UpdateDatasetEntriesResponse +UpdateDatasetGroupRequest +UpdateDatasetRequest +UpdateDatasetResponse +UpdateDatasourcePackagesRequest +UpdateDatastoreRequest +UpdateDate +UpdateDateTime +UpdateDecoderManifestRequest +UpdateDecoderManifestResponse +UpdateDefaultAutoScalingConfigurationRequest +UpdateDefaultAutoScalingConfigurationResponse +UpdateDefaultBranchInput +UpdateDefaultMailDomainRequest +UpdateDeletionProtectionInput +UpdateDeploymentGroupInput +UpdateDeploymentGroupOutput +UpdateDeploymentRequest +UpdateDeploymentResponse +UpdateDeploymentStrategyRequest +UpdateDestinationInput +UpdateDestinationRequest +UpdateDestinationResponse +UpdateDetectorModelRequest +UpdateDetectorModelResponse +UpdateDetectorRequest +UpdateDetectorVersionMetadataRequest +UpdateDetectorVersionRequest +UpdateDetectorVersionStatusRequest +UpdateDevEndpointRequest +UpdateDevEnvironmentRequest +UpdateDevEnvironmentResponse +UpdateDeviceCertificateParams +UpdateDeviceDefinitionRequest +UpdateDeviceFleetRequest +UpdateDeviceInstanceRequest +UpdateDeviceInstanceResult +UpdateDeviceMetadataRequest +UpdateDeviceMetadataResponse +UpdateDevicePolicyConfigurationRequest +UpdateDevicePoolRequest +UpdateDevicePoolResult +UpdateDeviceRequest +UpdateDeviceResponse +UpdateDeviceStateRequest +UpdateDeviceStatusRequest +UpdateDevicesRequest +UpdateDimensionRequest +UpdateDimensionResponse +UpdateDirectConnectGatewayAssociationRequest +UpdateDirectConnectGatewayAssociationResult +UpdateDirectConnectGatewayRequest +UpdateDirectConnectGatewayResponse +UpdateDirectoryConfigRequest +UpdateDirectoryConfigResult +UpdateDirectorySetupRequest +UpdateDiscovererRequest +UpdateDiscovererResponse +UpdateDiscoveryJobRequest +UpdateDistributionBundleRequest +UpdateDistributionBundleResult +UpdateDistributionConfigurationRequest +UpdateDistributionConfigurationResponse +UpdateDistributionRequest +UpdateDistributionResult +UpdateDistributionWithStagingConfigRequest +UpdateDistributionWithStagingConfigResult +UpdateDocumentDefaultVersionRequest +UpdateDocumentDefaultVersionResult +UpdateDocumentMetadataRequest +UpdateDocumentRequest +UpdateDocumentResult +UpdateDocumentVersionRequest +UpdateDocumentationPartRequest +UpdateDocumentationVersionRequest +UpdateDomainAssociationRequest +UpdateDomainAssociationResult +UpdateDomainConfigRequest +UpdateDomainConfigResponse +UpdateDomainConfigurationRequest +UpdateDomainConfigurationResponse +UpdateDomainContactPrivacyRequest +UpdateDomainContactPrivacyResponse +UpdateDomainContactRequest +UpdateDomainContactResponse +UpdateDomainEndpointOptionsRequest +UpdateDomainEndpointOptionsResponse +UpdateDomainEntryRequest +UpdateDomainEntryResult +UpdateDomainMetadataRequest +UpdateDomainNameRequest +UpdateDomainNameResponse +UpdateDomainNameserversRequest +UpdateDomainNameserversResponse +UpdateDomainRequest +UpdateDomainResponse +UpdateDynamicThingGroupRequest +UpdateDynamicThingGroupResponse +UpdateEc2DeepInspectionConfigurationRequest +UpdateEc2DeepInspectionConfigurationResponse +UpdateEgressGatewayBridgeRequest +UpdateElasticIpRequest +UpdateElasticsearchDomainConfigRequest +UpdateElasticsearchDomainConfigResponse +UpdateEmailChannelRequest +UpdateEmailChannelResponse +UpdateEmailIdentityPolicyRequest +UpdateEmailTemplateRequest +UpdateEmailTemplateResponse +UpdateEmergencyContactSettingsRequest +UpdateEncryption +UpdateEncryptionKeyRequest +UpdateEndOfMeetingReminder +UpdateEndpointAccessRequest +UpdateEndpointAccessResponse +UpdateEndpointGroupRequest +UpdateEndpointGroupResponse +UpdateEndpointInput +UpdateEndpointOutput +UpdateEndpointRequest +UpdateEndpointResponse +UpdateEndpointWeightsAndCapacitiesInput +UpdateEndpointWeightsAndCapacitiesOutput +UpdateEndpointsBatchRequest +UpdateEndpointsBatchResponse +UpdateEnrollmentStatusRequest +UpdateEnrollmentStatusResponse +UpdateEntitlementRequest +UpdateEntitlementResult +UpdateEntityRequest +UpdateEntityResponse +UpdateEnvironmentAccountConnectionInput +UpdateEnvironmentAccountConnectionOutput +UpdateEnvironmentInput +UpdateEnvironmentMembershipRequest +UpdateEnvironmentMembershipResult +UpdateEnvironmentMessage +UpdateEnvironmentOutput +UpdateEnvironmentRequest +UpdateEnvironmentResponse +UpdateEnvironmentTemplateInput +UpdateEnvironmentTemplateOutput +UpdateEnvironmentTemplateVersionInput +UpdateEnvironmentTemplateVersionOutput +UpdateEphemerisRequest +UpdateError +UpdateEtlLibraries +UpdateEvaluationFormRequest +UpdateEvaluationFormResponse +UpdateEvaluationInput +UpdateEvaluationOutput +UpdateEventActionRequest +UpdateEventActionResponse +UpdateEventConfigurationByResourceTypesRequest +UpdateEventConfigurationsRequest +UpdateEventDataStoreRequest +UpdateEventDataStoreResponse +UpdateEventDestinationRequest +UpdateEventDestinationResult +UpdateEventIntegrationRequest +UpdateEventLabelRequest +UpdateEventSourceMappingRequest +UpdateEventSourcesConfigRequest +UpdateExperienceRequest +UpdateExperimentRequest +UpdateExperimentResponse +UpdateExperimentTemplateActionInputItem +UpdateExperimentTemplateLogConfigurationInput +UpdateExperimentTemplateRequest +UpdateExperimentTemplateResponse +UpdateExperimentTemplateStopConditionInput +UpdateExperimentTemplateTargetInput +UpdateExpirationForHITRequest +UpdateExportRequest +UpdateExportResponse +UpdateExpression +UpdateExtensionAssociationRequest +UpdateExtensionRequest +UpdateFPorts +UpdateFacetRequest +UpdateFailbackReplicationConfigurationRequest +UpdateFailoverConfig +UpdateFeatureGroupRequest +UpdateFeatureGroupResponse +UpdateFeatureMetadataRequest +UpdateFeatureRequest +UpdateFeatureResponse +UpdateFeaturedResultsSetRequest +UpdateFeaturedResultsSetResponse +UpdateFieldLevelEncryptionConfigRequest +UpdateFieldLevelEncryptionConfigResult +UpdateFieldLevelEncryptionProfileRequest +UpdateFieldLevelEncryptionProfileResult +UpdateFieldRequest +UpdateFileCacheLustreConfiguration +UpdateFileCacheRequest +UpdateFileCacheResponse +UpdateFileSystemAssociationInput +UpdateFileSystemAssociationOutput +UpdateFileSystemLustreConfiguration +UpdateFileSystemOntapConfiguration +UpdateFileSystemOpenZFSConfiguration +UpdateFileSystemRequest +UpdateFileSystemResponse +UpdateFileSystemWindowsConfiguration +UpdateFilterRequest +UpdateFilterResponse +UpdateFindingAggregatorRequest +UpdateFindingAggregatorResponse +UpdateFindingsFeedbackRequest +UpdateFindingsFilterRequest +UpdateFindingsFilterResponse +UpdateFindingsRequest +UpdateFirewallConfigRequest +UpdateFirewallConfigResponse +UpdateFirewallDeleteProtectionRequest +UpdateFirewallDeleteProtectionResponse +UpdateFirewallDescriptionRequest +UpdateFirewallDescriptionResponse +UpdateFirewallDomainsRequest +UpdateFirewallDomainsResponse +UpdateFirewallEncryptionConfigurationRequest +UpdateFirewallEncryptionConfigurationResponse +UpdateFirewallPolicyChangeProtectionRequest +UpdateFirewallPolicyChangeProtectionResponse +UpdateFirewallPolicyRequest +UpdateFirewallPolicyResponse +UpdateFirewallRuleGroupAssociationRequest +UpdateFirewallRuleGroupAssociationResponse +UpdateFirewallRuleRequest +UpdateFirewallRuleResponse +UpdateFleetAttributesInput +UpdateFleetAttributesOutput +UpdateFleetCapacityInput +UpdateFleetCapacityOutput +UpdateFleetMetadataRequest +UpdateFleetMetricRequest +UpdateFleetPortSettingsInput +UpdateFleetPortSettingsOutput +UpdateFleetRequest +UpdateFleetResponse +UpdateFleetResult +UpdateFlowEntitlementRequest +UpdateFlowEntitlementResponse +UpdateFlowMediaStreamRequest +UpdateFlowMediaStreamResponse +UpdateFlowOutputRequest +UpdateFlowOutputResponse +UpdateFlowRequest +UpdateFlowResponse +UpdateFlowSourceRequest +UpdateFlowSourceResponse +UpdateFlowTemplateRequest +UpdateFlowTemplateResponse +UpdateFlywheelRequest +UpdateFlywheelResponse +UpdateFolderPermissionsRequest +UpdateFolderPermissionsResponse +UpdateFolderRequest +UpdateFolderResponse +UpdateFormData +UpdateFormRequest +UpdateFormResponse +UpdateFrameworkInput +UpdateFrameworkOutput +UpdateFreeTierConfig +UpdateFunctionCodeRequest +UpdateFunctionConfigurationRequest +UpdateFunctionDefinitionRequest +UpdateFunctionEventInvokeConfigRequest +UpdateFunctionRequest +UpdateFunctionResponse +UpdateFunctionResult +UpdateFunctionUrlConfigRequest +UpdateFunctionUrlConfigResponse +UpdateFuotaTaskRequest +UpdateGameConfigurationRequest +UpdateGameConfigurationResult +UpdateGameRequest +UpdateGameResult +UpdateGameServerGroupInput +UpdateGameServerGroupOutput +UpdateGameServerInput +UpdateGameServerOutput +UpdateGameSessionInput +UpdateGameSessionOutput +UpdateGameSessionQueueInput +UpdateGameSessionQueueOutput +UpdateGatewayBridgeSourceRequest +UpdateGatewayCapabilityConfigurationRequest +UpdateGatewayCapabilityConfigurationResponse +UpdateGatewayGroupRequest +UpdateGatewayInformationInput +UpdateGatewayInformationOutput +UpdateGatewayInstanceRequest +UpdateGatewayInstanceResponse +UpdateGatewayRequest +UpdateGatewayResponseRequest +UpdateGatewayRouteInput +UpdateGatewayRouteOutput +UpdateGatewaySoftwareNowInput +UpdateGatewaySoftwareNowOutput +UpdateGcmChannelRequest +UpdateGcmChannelResponse +UpdateGeoMatchSetRequest +UpdateGeoMatchSetResponse +UpdateGeofenceCollectionRequest +UpdateGeofenceCollectionResponse +UpdateGlobalNetworkRequest +UpdateGlobalNetworkResponse +UpdateGlobalSecondaryIndexAction +UpdateGlobalSettingsInput +UpdateGlobalSettingsRequest +UpdateGlobalTableInput +UpdateGlobalTableOutput +UpdateGlobalTableSettingsInput +UpdateGlobalTableSettingsOutput +UpdateGraphqlApiRequest +UpdateGraphqlApiResponse +UpdateGrokClassifierRequest +UpdateGroupCertificateConfigurationRequest +UpdateGroupCertificateConfigurationResponse +UpdateGroupInput +UpdateGroupOutput +UpdateGroupQueryInput +UpdateGroupQueryOutput +UpdateGroupRequest +UpdateGroupResponse +UpdateGroupResult +UpdateHITReviewStatusRequest +UpdateHITTypeOfHITRequest +UpdateHealthCheckRequest +UpdateHealthCheckResponse +UpdateHostInput +UpdateHostKeyRequest +UpdateHostKeyResponse +UpdateHostedZoneCommentRequest +UpdateHostedZoneCommentResponse +UpdateHoursOfOperationRequest +UpdateHttpNamespaceRequest +UpdateHttpNamespaceResponse +UpdateHubRequest +UpdateHubResponse +UpdateHypervisorInput +UpdateHypervisorOutput +UpdateIAMPolicyAssignmentRequest +UpdateIAMPolicyAssignmentResponse +UpdateIPSetRequest +UpdateIPSetResponse +UpdateIdentityProviderConfigurationRequest +UpdateIdentityProviderRequest +UpdateIdentityProviderResponse +UpdateIdentityProviderSettingsRequest +UpdateIdentityProviderSettingsResponse +UpdateIdentitySourceInput +UpdateIdentitySourceOutput +UpdateImageGenerationConfigurationInput +UpdateImagePermissionsRequest +UpdateImagePipelineRequest +UpdateImagePipelineResponse +UpdateImageRequest +UpdateImageResponse +UpdateImageSetMetadataRequest +UpdateImageSetMetadataResponse +UpdateImageVersionRequest +UpdateImageVersionResponse +UpdateImpersonationRoleRequest +UpdateInAppTemplateRequest +UpdateInAppTemplateResponse +UpdateInProgressException +UpdateIncidentRecordInput +UpdateIndexRequest +UpdateIndexTypeInput +UpdateIndexTypeOutput +UpdateIndexingConfigurationRequest +UpdateInferenceExperimentRequest +UpdateInferenceExperimentResponse +UpdateInferenceSchedulerRequest +UpdateInfoEntry +UpdateInfrastructureConfigurationRequest +UpdateInfrastructureConfigurationResponse +UpdateIngestionDestinationRequest +UpdateIngestionDestinationResponse +UpdateIngressGatewayBridgeRequest +UpdateInputDeviceRequest +UpdateInputDeviceResponse +UpdateInputRequest +UpdateInputResponse +UpdateInputSecurityGroupRequest +UpdateInputSecurityGroupResponse +UpdateInsightRequest +UpdateInstanceAccessControlAttributeConfigurationRequest +UpdateInstanceAttributeRequest +UpdateInstanceCustomHealthStatusRequest +UpdateInstanceMetadataOptionsRequest +UpdateInstanceMetadataOptionsResult +UpdateInstanceProfileRequest +UpdateInstanceProfileResult +UpdateInstanceRequest +UpdateInstanceStorageConfigRequest +UpdateInstantBooking +UpdateInstruction +UpdateIntegrationRequest +UpdateIntegrationResponseRequest +UpdateIntegrationResponseResponse +UpdateIntegrationResult +UpdateIntentRequest +UpdateIntentResponse +UpdateIpAccessSettingsRequest +UpdateIpAccessSettingsResponse +UpdateIpAddress +UpdateIpAddresses +UpdateIpRestrictionRequest +UpdateIpRestrictionResponse +UpdateItemInput +UpdateItemOutput +UpdateJobExecutionRequest +UpdateJobExecutionResponse +UpdateJobFromSourceControlRequest +UpdateJobFromSourceControlResponse +UpdateJobPriorityRequest +UpdateJobPriorityResult +UpdateJobQueueRequest +UpdateJobQueueResponse +UpdateJobRequest +UpdateJobResponse +UpdateJobShipmentStateRequest +UpdateJobStatusRequest +UpdateJobStatusResult +UpdateJobTemplateRequest +UpdateJobTemplateResponse +UpdateJourneyRequest +UpdateJourneyResponse +UpdateJourneyStateRequest +UpdateJourneyStateResponse +UpdateJsonClassifierRequest +UpdateKeyDescriptionRequest +UpdateKeyGroupRequest +UpdateKeyGroupResult +UpdateKeyRequest +UpdateKeyResponse +UpdateKnowledgeBaseTemplateUriRequest +UpdateKnowledgeBaseTemplateUriResponse +UpdateKxClusterDatabasesRequest +UpdateKxDatabaseRequest +UpdateKxDatabaseResponse +UpdateKxEnvironmentNetworkRequest +UpdateKxEnvironmentNetworkResponse +UpdateKxEnvironmentRequest +UpdateKxEnvironmentResponse +UpdateKxUserRequest +UpdateKxUserResponse +UpdateLFTagRequest +UpdateLabelGroupRequest +UpdateLabelsPayload +UpdateLagRequest +UpdateLaunchConfigurationRequest +UpdateLaunchConfigurationTemplateRequest +UpdateLaunchConfigurationTemplateResponse +UpdateLaunchProfileMemberRequest +UpdateLaunchProfileMemberResponse +UpdateLaunchProfileRequest +UpdateLaunchProfileResponse +UpdateLaunchRequest +UpdateLaunchResponse +UpdateLayerRequest +UpdateLayoutRequest +UpdateLedgerPermissionsModeRequest +UpdateLedgerPermissionsModeResponse +UpdateLedgerRequest +UpdateLedgerResponse +UpdateLensReviewInput +UpdateLensReviewOutput +UpdateLicenseConfigurationRequest +UpdateLicenseManagerReportGeneratorRequest +UpdateLicenseSpecificationsForResourceRequest +UpdateLifecyclePolicyRequest +UpdateLinkAttributes +UpdateLinkAttributesRequest +UpdateLinkInput +UpdateLinkOutput +UpdateLinkRequest +UpdateLinkResponse +UpdateListRequest +UpdateListenerRequest +UpdateListenerResponse +UpdateLiveSourceRequest +UpdateLiveSourceResponse +UpdateLoadBalancerAttributeRequest +UpdateLoadBalancerAttributeResult +UpdateLocationAzureBlobRequest +UpdateLocationHdfsRequest +UpdateLocationNfsRequest +UpdateLocationObjectStorageRequest +UpdateLocationSmbRequest +UpdateLogLevelsByResourceTypesRequest +UpdateLogPatternRequest +UpdateLogPatternResponse +UpdateLoggerDefinitionRequest +UpdateLoggingConfigurationRequest +UpdateLoggingConfigurationResponse +UpdateLoginProfileRequest +UpdateLongTermPricingRequest +UpdateMLModelInput +UpdateMLModelOutput +UpdateMLTransformRequest +UpdateMLTransformResponse +UpdateMacieSessionRequest +UpdateMailboxQuotaRequest +UpdateMaintenance +UpdateMaintenanceStartTimeInput +UpdateMaintenanceStartTimeOutput +UpdateMaintenanceWindowRequest +UpdateMaintenanceWindowResult +UpdateMaintenanceWindowTargetRequest +UpdateMaintenanceWindowTargetResult +UpdateMaintenanceWindowTaskRequest +UpdateMaintenanceWindowTaskResult +UpdateMalwareScanSettingsRequest +UpdateManagedInstanceRoleRequest +UpdateManagedRuleSetVersionExpiryDateRequest +UpdateManagedRuleSetVersionExpiryDateResponse +UpdateMapRequest +UpdateMapResponse +UpdateMapRunInput +UpdateMatchingWorkflowInput +UpdateMatchingWorkflowOutput +UpdateMatchmakingConfigurationInput +UpdateMatchmakingConfigurationOutput +UpdateMediaInsightsPipelineConfigurationRequest +UpdateMediaInsightsPipelineConfigurationResponse +UpdateMediaInsightsPipelineStatusRequest +UpdateMediaPipelineKinesisVideoStreamPoolRequest +UpdateMediaPipelineKinesisVideoStreamPoolResponse +UpdateMediaStorageConfigurationInput +UpdateMedicalVocabularyRequest +UpdateMedicalVocabularyResponse +UpdateMeetingRoomConfiguration +UpdateMemberDetectorsRequest +UpdateMemberDetectorsResponse +UpdateMemberInput +UpdateMemberSessionRequest +UpdateMembershipInput +UpdateMembershipOutput +UpdateMeshInput +UpdateMeshOutput +UpdateMethodRequest +UpdateMethodResponseRequest +UpdateMetricAttributionRequest +UpdateMetricAttributionResponse +UpdateMetricSetRequest +UpdateMetricSetResponse +UpdateMigrationWorkflowRequest +UpdateMigrationWorkflowResponse +UpdateMissionProfileRequest +UpdateMitigationActionRequest +UpdateMitigationActionResponse +UpdateMobileDeviceAccessRuleRequest +UpdateModelCardRequest +UpdateModelCardResponse +UpdateModelManifestRequest +UpdateModelManifestResponse +UpdateModelPackageInput +UpdateModelPackageOutput +UpdateModelRequest +UpdateModelResponse +UpdateModelVersionRequest +UpdateModelVersionResult +UpdateModelVersionStatusRequest +UpdateMonitorInput +UpdateMonitorOutput +UpdateMonitoringAlertRequest +UpdateMonitoringAlertResponse +UpdateMonitoringRequest +UpdateMonitoringResponse +UpdateMonitoringScheduleRequest +UpdateMonitoringScheduleResponse +UpdateMulticastGroupRequest +UpdateMultiplexProgramRequest +UpdateMultiplexProgramResponse +UpdateMultiplexRequest +UpdateMultiplexResponse +UpdateMyUserProfileRequest +UpdateNFSFileShareInput +UpdateNFSFileShareOutput +UpdateNamedQueryInput +UpdateNamespaceRequest +UpdateNamespaceResponse +UpdateNetworkAnalyzerConfigurationRequest +UpdateNetworkConfigurationInput +UpdateNetworkProfileRequest +UpdateNetworkProfileResult +UpdateNetworkResourceMetadataRequest +UpdateNetworkResourceMetadataResponse +UpdateNetworkSettingsRequest +UpdateNetworkSettingsResponse +UpdateNetworkSitePlanRequest +UpdateNetworkSiteRequest +UpdateNetworkSiteResponse +UpdateNodeInput +UpdateNodegroupConfigRequest +UpdateNodegroupConfigResponse +UpdateNodegroupVersionRequest +UpdateNodegroupVersionResponse +UpdateNotebookInput +UpdateNotebookInstanceInput +UpdateNotebookInstanceLifecycleConfigInput +UpdateNotebookMetadataInput +UpdateNotificationConfigurationInput +UpdateNotificationRequest +UpdateNotificationRuleRequest +UpdateNotificationSettingsRequest +UpdateNumberOfDomainControllersRequest +UpdateObjectAttributes +UpdateObjectAttributesRequest +UpdateObjectAttributesResponse +UpdateOntapVolumeConfiguration +UpdateOpenIDConnectProviderThumbprintRequest +UpdateOpenZFSVolumeConfiguration +UpdateOpsItemRequest +UpdateOpsMetadataRequest +UpdateOpsMetadataResult +UpdateOrgEc2DeepInspectionConfigurationRequest +UpdateOrganizationConfigurationRequest +UpdateOrganizationConfigurationResponse +UpdateOrganizationalUnitRequest +UpdateOrganizationalUnitResponse +UpdateOriginAccessControlRequest +UpdateOriginAccessControlResult +UpdateOriginEndpointRequest +UpdateOriginEndpointResponse +UpdateOriginRequestPolicyRequest +UpdateOriginRequestPolicyResult +UpdateOutpostInput +UpdateOutpostOutput +UpdateOutpostResolverRequest +UpdateOutpostResolverResponse +UpdatePackageConfigurationRequest +UpdatePackageRequest +UpdatePackageResponse +UpdatePackageVersionRequest +UpdatePackageVersionsStatusRequest +UpdatePackageVersionsStatusResult +UpdatePackagingGroupRequest +UpdatePackagingGroupResponse +UpdateParallelDataRequest +UpdateParallelDataResponse +UpdateParam +UpdateParameterGroupRequest +UpdateParameterGroupResponse +UpdateParticipantRoleConfigRequest +UpdatePartitionRequest +UpdatePartnerAccountRequest +UpdatePartnerStatusInputMessage +UpdatePatchBaselineRequest +UpdatePatchBaselineResult +UpdatePermissionGroupRequest +UpdatePermissionGroupResponse +UpdatePermissionSetRequest +UpdatePermissionsRequest +UpdatePermissionsResponse +UpdatePhoneNumberRequest +UpdatePhoneNumberRequestItem +UpdatePhoneNumberRequestItems +UpdatePhoneNumberResponse +UpdatePhoneNumberResult +UpdatePhoneNumberSettingsRequest +UpdatePipeRequest +UpdatePipeResponse +UpdatePipeSourceActiveMQBrokerParameters +UpdatePipeSourceDynamoDBStreamParameters +UpdatePipeSourceKinesisStreamParameters +UpdatePipeSourceManagedStreamingKafkaParameters +UpdatePipeSourceParameters +UpdatePipeSourceRabbitMQBrokerParameters +UpdatePipeSourceSelfManagedKafkaParameters +UpdatePipeSourceSqsQueueParameters +UpdatePipelineExecutionRequest +UpdatePipelineExecutionResponse +UpdatePipelineInput +UpdatePipelineNotificationsRequest +UpdatePipelineNotificationsResponse +UpdatePipelineOutput +UpdatePipelineRequest +UpdatePipelineResponse +UpdatePipelineStatusRequest +UpdatePipelineStatusResponse +UpdatePlaceIndexRequest +UpdatePlaceIndexResponse +UpdatePlacementRequest +UpdatePolicy +UpdatePolicyInput +UpdatePolicyOutput +UpdatePolicyRequest +UpdatePolicyResponse +UpdatePolicyStoreInput +UpdatePolicyStoreOutput +UpdatePolicyTemplateInput +UpdatePolicyTemplateOutput +UpdatePoolRequest +UpdatePoolResult +UpdatePortalRequest +UpdatePortalResponse +UpdatePortfolioInput +UpdatePortfolioOutput +UpdatePortfolioShareInput +UpdatePortfolioShareOutput +UpdatePositionRequest +UpdatePreparedStatementInput +UpdatePresetRequest +UpdatePresetResponse +UpdatePricingPlanInput +UpdatePricingPlanOutput +UpdatePricingPlanRequest +UpdatePricingPlanResponse +UpdatePricingRuleInput +UpdatePricingRuleOutput +UpdatePrimaryEmailAddressRequest +UpdatePrimaryRegionRequest +UpdatePrivateDnsNamespaceRequest +UpdatePrivateDnsNamespaceResponse +UpdateProactiveJoin +UpdateProblemRequest +UpdateProductInput +UpdateProductOutput +UpdateProfileInput +UpdateProfileJobRequest +UpdateProfileJobResponse +UpdateProfileOutput +UpdateProfileRequest +UpdateProfileResponse +UpdateProfilingGroupRequest +UpdateProfilingGroupResponse +UpdateProgramRequest +UpdateProgramResponse +UpdateProgramScheduleConfiguration +UpdateProgramTransition +UpdateProjectDataDeliveryRequest +UpdateProjectDataDeliveryResponse +UpdateProjectInput +UpdateProjectOutput +UpdateProjectRequest +UpdateProjectResponse +UpdateProjectResult +UpdateProjectVisibilityInput +UpdateProjectVisibilityOutput +UpdatePromptRequest +UpdatePromptResponse +UpdateProtectedQueryInput +UpdateProtectedQueryOutput +UpdateProtectionGroupRequest +UpdateProvisionedModelThroughputRequest +UpdateProvisionedProductInput +UpdateProvisionedProductOutput +UpdateProvisionedProductPropertiesInput +UpdateProvisionedProductPropertiesOutput +UpdateProvisioningArtifactInput +UpdateProvisioningArtifactOutput +UpdateProvisioningParameter +UpdateProvisioningPreferences +UpdateProvisioningTemplateRequest +UpdateProxySessionRequest +UpdateProxySessionResponse +UpdatePublicDnsNamespaceRequest +UpdatePublicDnsNamespaceResponse +UpdatePublicKeyRequest +UpdatePublicKeyResult +UpdatePublicSharingSettingsRequest +UpdatePublicSharingSettingsResponse +UpdatePublishingDestinationRequest +UpdatePullRequestApprovalRuleContentInput +UpdatePullRequestApprovalRuleContentOutput +UpdatePullRequestApprovalStateInput +UpdatePullRequestDescriptionInput +UpdatePullRequestDescriptionOutput +UpdatePullRequestStatusInput +UpdatePullRequestStatusOutput +UpdatePullRequestTitleInput +UpdatePullRequestTitleOutput +UpdatePushTemplateRequest +UpdatePushTemplateResponse +UpdateQualificationTypeRequest +UpdateQualificationTypeResponse +UpdateQuerySuggestionsBlockListRequest +UpdateQuerySuggestionsConfigRequest +UpdateQueueHoursOfOperationRequest +UpdateQueueMaxContactsRequest +UpdateQueueNameRequest +UpdateQueueOutboundCallerConfigRequest +UpdateQueueRequest +UpdateQueueResponse +UpdateQueueStatusRequest +UpdateQuickConnectConfigRequest +UpdateQuickConnectNameRequest +UpdateRadiusRequest +UpdateRateBasedRuleRequest +UpdateRateBasedRuleResponse +UpdateRdsDbInstanceRequest +UpdateReadinessCheckRequest +UpdateReadinessCheckResponse +UpdateRealtimeLogConfigRequest +UpdateRealtimeLogConfigResult +UpdateReceiptRuleRequest +UpdateRecipeJobRequest +UpdateRecipeJobResponse +UpdateRecipeRequest +UpdateRecipeResponse +UpdateRecommendationStatusItem +UpdateRecommendationStatusRequestEntry +UpdateRecommenderConfiguration +UpdateRecommenderConfigurationRequest +UpdateRecommenderConfigurationResponse +UpdateRecommenderConfigurationShape +UpdateRecommenderRequest +UpdateRecommenderResponse +UpdateRecordsRequest +UpdateRecordsResponse +UpdateRecoveryGroupRequest +UpdateRecoveryGroupResponse +UpdateRecoveryPointLifecycleInput +UpdateRecoveryPointLifecycleOutput +UpdateRefreshScheduleRequest +UpdateRefreshScheduleResponse +UpdateRegexMatchSetRequest +UpdateRegexMatchSetResponse +UpdateRegexPatternSetRequest +UpdateRegexPatternSetResponse +UpdateRegionSettingsInput +UpdateRegistryInput +UpdateRegistryRequest +UpdateRegistryResponse +UpdateRelatedItemsInput +UpdateRelationalDatabaseParametersRequest +UpdateRelationalDatabaseParametersResult +UpdateRelationalDatabaseRequest +UpdateRelationalDatabaseResult +UpdateReplicationConfigurationRequest +UpdateReplicationConfigurationTemplateRequest +UpdateReplicationGroupMemberAction +UpdateReplicationJobRequest +UpdateReplicationSetInput +UpdateReportDefinitionRequest +UpdateReportDefinitionResult +UpdateReportGroupInput +UpdateReportGroupOutput +UpdateReportPlanInput +UpdateReportPlanOutput +UpdateRepositoryDescriptionInput +UpdateRepositoryNameInput +UpdateRepositoryRequest +UpdateRepositoryResult +UpdateRequestValidatorRequest +UpdateRequireCheckIn +UpdateRescoreExecutionPlanRequest +UpdateReservationRequest +UpdateReservationResponse +UpdateResiliencyPolicyRequest +UpdateResiliencyPolicyResponse +UpdateResolverConfigRequest +UpdateResolverConfigResponse +UpdateResolverDnssecConfigRequest +UpdateResolverDnssecConfigResponse +UpdateResolverEndpointRequest +UpdateResolverEndpointResponse +UpdateResolverRequest +UpdateResolverResponse +UpdateResolverRuleRequest +UpdateResolverRuleResponse +UpdateResourceCollectionFilter +UpdateResourceCollectionRequest +UpdateResourceDataSyncRequest +UpdateResourceDefinitionRequest +UpdateResourceEventConfigurationRequest +UpdateResourceInput +UpdateResourceOutput +UpdateResourcePolicyRequest +UpdateResourcePolicyResponse +UpdateResourcePositionRequest +UpdateResourceProfileDetectionsRequest +UpdateResourceProfileRequest +UpdateResourceRequest +UpdateResourceServerRequest +UpdateResourceServerResponse +UpdateResourceSetRequest +UpdateResourceSetResponse +UpdateResourceShareRequest +UpdateResourceShareResponse +UpdateResponseHeadersPolicyRequest +UpdateResponseHeadersPolicyResult +UpdateResponsePlanInput +UpdateRestApiRequest +UpdateResult +UpdateRetrainingSchedulerRequest +UpdateRevealConfigurationRequest +UpdateRevealConfigurationResponse +UpdateRevisionRequest +UpdateRevisionResponse +UpdateRobotApplicationRequest +UpdateRobotApplicationResponse +UpdateRoleAliasRequest +UpdateRoleAliasResponse +UpdateRoleDescriptionRequest +UpdateRoleDescriptionResponse +UpdateRoleRequest +UpdateRoomMembershipRequest +UpdateRoomMembershipResponse +UpdateRoomRequest +UpdateRoomResponse +UpdateRotationRequest +UpdateRouteCalculatorRequest +UpdateRouteCalculatorResponse +UpdateRouteInput +UpdateRouteOutput +UpdateRouteRequest +UpdateRouteResponse +UpdateRouteResponseRequest +UpdateRouteResponseResponse +UpdateRouteResult +UpdateRoutingControlRequest +UpdateRoutingControlResponse +UpdateRoutingControlStateEntries +UpdateRoutingControlStateEntry +UpdateRoutingControlStateRequest +UpdateRoutingControlStatesRequest +UpdateRoutingProfileAgentAvailabilityTimerRequest +UpdateRoutingProfileConcurrencyRequest +UpdateRoutingProfileDefaultOutboundQueueRequest +UpdateRoutingProfileNameRequest +UpdateRoutingProfileQueuesRequest +UpdateRowData +UpdateRuleGroupRequest +UpdateRuleGroupResponse +UpdateRuleMetadataRequest +UpdateRuleRequest +UpdateRuleResponse +UpdateRuleVersionRequest +UpdateRuleVersionResult +UpdateRulesOfIpGroupRequest +UpdateRulesetRequest +UpdateRulesetResponse +UpdateRumMetricDefinitionRequest +UpdateRunGroupRequest +UpdateRuntimeConfigurationInput +UpdateRuntimeConfigurationOutput +UpdateRuntimeOn +UpdateS3ResourcesRequest +UpdateS3ResourcesResult +UpdateSAMLProviderRequest +UpdateSAMLProviderResponse +UpdateSMBFileShareInput +UpdateSMBFileShareOutput +UpdateSMBFileShareVisibilityInput +UpdateSMBFileShareVisibilityOutput +UpdateSMBLocalGroupsInput +UpdateSMBLocalGroupsOutput +UpdateSMBSecurityStrategyInput +UpdateSMBSecurityStrategyOutput +UpdateSSHPublicKeyRequest +UpdateSafetyRuleRequest +UpdateSafetyRuleResponse +UpdateSamplingRuleRequest +UpdateSamplingRuleResult +UpdateScalingParametersRequest +UpdateScalingParametersResponse +UpdateScalingPlanRequest +UpdateSceneRequest +UpdateSceneResponse +UpdateScheduleInput +UpdateScheduleOutput +UpdateScheduleRequest +UpdateScheduleResponse +UpdateScheduledActionRequest +UpdateScheduledActionResponse +UpdateScheduledAuditRequest +UpdateScheduledAuditResponse +UpdateScheduledQueryRequest +UpdateSchedulingPolicyRequest +UpdateSchemaInput +UpdateSchemaRequest +UpdateSchemaResponse +UpdateScriptInput +UpdateScriptOutput +UpdateSecretRequest +UpdateSecretResponse +UpdateSecretVersionStageRequest +UpdateSecretVersionStageResponse +UpdateSecurityConfigRequest +UpdateSecurityConfigResponse +UpdateSecurityGroupForDirectoryControllers +UpdateSecurityGroupRuleDescriptionsEgressRequest +UpdateSecurityGroupRuleDescriptionsEgressResult +UpdateSecurityGroupRuleDescriptionsIngressRequest +UpdateSecurityGroupRuleDescriptionsIngressResult +UpdateSecurityHubConfigurationRequest +UpdateSecurityPolicyRequest +UpdateSecurityPolicyResponse +UpdateSecurityProfileRequest +UpdateSecurityProfileResponse +UpdateSecurityRequest +UpdateSecurityResponse +UpdateSegmentRequest +UpdateSegmentResponse +UpdateSensitivityInspectionTemplateRequest +UpdateServerCertificateRequest +UpdateServerConfigRequest +UpdateServerEngineAttributesRequest +UpdateServerEngineAttributesResponse +UpdateServerRequest +UpdateServerResponse +UpdateServiceAccessPoliciesRequest +UpdateServiceAccessPoliciesResponse +UpdateServiceActionInput +UpdateServiceActionOutput +UpdateServiceInput +UpdateServiceInstanceInput +UpdateServiceInstanceOutput +UpdateServiceIntegrationConfig +UpdateServiceIntegrationRequest +UpdateServiceNetworkRequest +UpdateServiceNetworkResponse +UpdateServiceNetworkVpcAssociationRequest +UpdateServiceNetworkVpcAssociationResponse +UpdateServiceOutput +UpdateServicePipelineInput +UpdateServicePipelineOutput +UpdateServicePrimaryTaskSetRequest +UpdateServicePrimaryTaskSetResponse +UpdateServiceRequest +UpdateServiceResponse +UpdateServiceSettingRequest +UpdateServiceSettingsRequest +UpdateServiceSettingsResponse +UpdateServiceSpecificCredentialRequest +UpdateServiceSyncBlockerInput +UpdateServiceSyncBlockerOutput +UpdateServiceSyncConfigInput +UpdateServiceSyncConfigOutput +UpdateServiceTemplateInput +UpdateServiceTemplateOutput +UpdateServiceTemplateVersionInput +UpdateServiceTemplateVersionOutput +UpdateSettings +UpdateSettingsRequest +UpdateSettingsResponse +UpdateSettingsResult +UpdateShardCountInput +UpdateShardCountOutput +UpdateShareInvitationInput +UpdateShareInvitationOutput +UpdateSignalCatalogRequest +UpdateSignalCatalogResponse +UpdateSignalingChannelInput +UpdateSignature +UpdateSigningCertificateRequest +UpdateSimulationApplicationRequest +UpdateSimulationApplicationResponse +UpdateSipMediaApplicationCallRequest +UpdateSipMediaApplicationCallResponse +UpdateSipMediaApplicationRequest +UpdateSipMediaApplicationResponse +UpdateSipRuleRequest +UpdateSipRuleResponse +UpdateSiteAddressInput +UpdateSiteAddressOutput +UpdateSiteInput +UpdateSiteOutput +UpdateSiteRackPhysicalPropertiesInput +UpdateSiteRackPhysicalPropertiesOutput +UpdateSiteRequest +UpdateSiteResponse +UpdateSizeConstraintSetRequest +UpdateSizeConstraintSetResponse +UpdateSkillGroupRequest +UpdateSlackChannelConfigurationRequest +UpdateSlackChannelConfigurationResult +UpdateSlotRequest +UpdateSlotResponse +UpdateSlotTypeRequest +UpdateSlotTypeResponse +UpdateSmsChannelRequest +UpdateSmsChannelResponse +UpdateSmsTemplateRequest +UpdateSmsTemplateResponse +UpdateSnaplockConfiguration +UpdateSnapshotRequest +UpdateSnapshotResponse +UpdateSnapshotResult +UpdateSnapshotScheduleInput +UpdateSnapshotScheduleOutput +UpdateSolFunctionPackageInput +UpdateSolFunctionPackageOutput +UpdateSolNetworkInstanceInput +UpdateSolNetworkInstanceOutput +UpdateSolNetworkModify +UpdateSolNetworkPackageInput +UpdateSolNetworkPackageOutput +UpdateSource +UpdateSourceApiAssociationRequest +UpdateSourceApiAssociationResponse +UpdateSourceControlFromJobRequest +UpdateSourceControlFromJobResponse +UpdateSourceLocationRequest +UpdateSourceLocationResponse +UpdateSourceServerReplicationTypeRequest +UpdateSpaceRequest +UpdateSpaceResponse +UpdateSqlInjectionMatchSetRequest +UpdateSqlInjectionMatchSetResponse +UpdateStackInput +UpdateStackInstancesInput +UpdateStackInstancesOutput +UpdateStackOutput +UpdateStackRequest +UpdateStackResult +UpdateStackSetInput +UpdateStackSetOutput +UpdateStageRequest +UpdateStageResponse +UpdateStageResult +UpdateStandardsControlRequest +UpdateStateMachineAliasInput +UpdateStateMachineAliasOutput +UpdateStateMachineInput +UpdateStateMachineOutput +UpdateStaticPolicyDefinition +UpdateStatus +UpdateStorageRequest +UpdateStorageResponse +UpdateStorageSystemRequest +UpdateStorageVirtualMachineRequest +UpdateStorageVirtualMachineResponse +UpdateStreamInput +UpdateStreamModeInput +UpdateStreamProcessorRequest +UpdateStreamRequest +UpdateStreamResponse +UpdateStreamingDistributionRequest +UpdateStreamingDistributionResult +UpdateStreamingImageRequest +UpdateStreamingImageResponse +UpdateStudioComponentRequest +UpdateStudioComponentResponse +UpdateStudioInput +UpdateStudioRequest +UpdateStudioResponse +UpdateStudioSessionMappingInput +UpdateSubnetChangeProtectionRequest +UpdateSubnetChangeProtectionResponse +UpdateSubnetGroupRequest +UpdateSubnetGroupResponse +UpdateSubscriberNotificationRequest +UpdateSubscriberNotificationResponse +UpdateSubscriberRequest +UpdateSubscriberResponse +UpdateSubscriptionDefinitionRequest +UpdateSubscriptionRequest +UpdateSubscriptionsToEventBridgeMessage +UpdateSubscriptionsToEventBridgeResponse +UpdateSuiteDefinitionRequest +UpdateSuiteDefinitionResponse +UpdateSvmActiveDirectoryConfiguration +UpdateSystemTemplateRequest +UpdateSystemTemplateResponse +UpdateTLSInspectionConfigurationRequest +UpdateTLSInspectionConfigurationResponse +UpdateTableInput +UpdateTableObjectsRequest +UpdateTableOutput +UpdateTableReplicaAutoScalingInput +UpdateTableReplicaAutoScalingOutput +UpdateTableRequest +UpdateTableResponse +UpdateTableStorageOptimizerRequest +UpdateTableStorageOptimizerResponse +UpdateTagCollectionFilter +UpdateTagOptionInput +UpdateTagOptionOutput +UpdateTagsForDomainRequest +UpdateTagsForResourceMessage +UpdateTaintsPayload +UpdateTarget +UpdateTargetGroupRequest +UpdateTargetGroupResponse +UpdateTargets +UpdateTargetsArchitecture +UpdateTargetsOperatingSystem +UpdateTaskExecutionRequest +UpdateTaskProtectionRequest +UpdateTaskProtectionResponse +UpdateTaskRequest +UpdateTaskSetRequest +UpdateTaskSetResponse +UpdateTaskTemplateRequest +UpdateTaskTemplateResponse +UpdateTeamMemberRequest +UpdateTeamMemberResult +UpdateTemplateActiveVersionRequest +UpdateTemplateActiveVersionResponse +UpdateTemplateAliasRequest +UpdateTemplateAliasResponse +UpdateTemplateGroupAccessControlEntryRequest +UpdateTemplatePermissionsRequest +UpdateTemplatePermissionsResponse +UpdateTemplateRequest +UpdateTemplateResponse +UpdateTemplateSyncConfigInput +UpdateTemplateSyncConfigOutput +UpdateTerminationProtectionInput +UpdateTerminationProtectionOutput +UpdateTestGridProjectRequest +UpdateTestGridProjectResult +UpdateTestSetRequest +UpdateTestSetResponse +UpdateThemeAliasRequest +UpdateThemeAliasResponse +UpdateThemeData +UpdateThemePermissionsRequest +UpdateThemePermissionsResponse +UpdateThemeRequest +UpdateThemeResponse +UpdateThesaurusRequest +UpdateThingGroupRequest +UpdateThingGroupResponse +UpdateThingGroupsForThingRequest +UpdateThingRequest +UpdateThingRuntimeConfigurationRequest +UpdateThingShadowRequest +UpdateThingShadowResponse +UpdateThreatIntelSetRequest +UpdateTieringInput +UpdateTime +UpdateTimeToLiveInput +UpdateTimeToLiveOutput +UpdateTimelineEventInput +UpdateToken +UpdateTopicPermissionsRequest +UpdateTopicPermissionsResponse +UpdateTopicRefreshScheduleRequest +UpdateTopicRefreshScheduleResponse +UpdateTopicRequest +UpdateTopicResponse +UpdateTopicRuleDestinationRequest +UpdateTrackerRequest +UpdateTrackerResponse +UpdateTrafficDistributionRequest +UpdateTrafficPolicyCommentRequest +UpdateTrafficPolicyCommentResponse +UpdateTrafficPolicyInstanceRequest +UpdateTrafficPolicyInstanceResponse +UpdateTrailRequest +UpdateTrailResponse +UpdateTrainingJobRequest +UpdateTrainingJobResponse +UpdateTrialComponentRequest +UpdateTrialComponentResponse +UpdateTrialRequest +UpdateTrialResponse +UpdateTriggerRequest +UpdateTriggerResponse +UpdateTrustAnchorRequest +UpdateTrustRequest +UpdateTrustResult +UpdateTrustStoreRequest +UpdateTrustStoreResponse +UpdateType +UpdateTypeRequest +UpdateTypeResponse +UpdateTypedLinkFacetRequest +UpdateUploadRequest +UpdateUploadResult +UpdateUsageLimitRequest +UpdateUsageLimitResponse +UpdateUsagePlanRequest +UpdateUsageRequest +UpdateUserAccessLoggingSettingsRequest +UpdateUserAccessLoggingSettingsResponse +UpdateUserAttributesRequest +UpdateUserAttributesResponse +UpdateUserDefinedFunctionRequest +UpdateUserHierarchyGroupNameRequest +UpdateUserHierarchyRequest +UpdateUserHierarchyStructureRequest +UpdateUserIdentityInfoRequest +UpdateUserPhoneConfigRequest +UpdateUserPoolClientRequest +UpdateUserPoolClientResponse +UpdateUserPoolDomainRequest +UpdateUserPoolDomainResponse +UpdateUserPoolRequest +UpdateUserProfileRequest +UpdateUserProfileResponse +UpdateUserProfileResult +UpdateUserRequest +UpdateUserRequestItem +UpdateUserRequestItems +UpdateUserResponse +UpdateUserRoutingProfileRequest +UpdateUserSecurityProfilesRequest +UpdateUserSettingsRequest +UpdateUserSettingsResponse +UpdateVPCConnectionRequest +UpdateVPCConnectionResponse +UpdateVPCEConfigurationRequest +UpdateVPCEConfigurationResult +UpdateVTLDeviceTypeInput +UpdateVTLDeviceTypeOutput +UpdateValue +UpdateVariableRequest +UpdateVariantStoreRequest +UpdateVariantStoreResponse +UpdateVehicleError +UpdateVehicleRequest +UpdateVehicleRequestItem +UpdateVehicleResponse +UpdateVehicleResponseItem +UpdateVersion +UpdateViewContentRequest +UpdateViewContentResponse +UpdateViewInput +UpdateViewMetadataRequest +UpdateViewOutput +UpdateVirtualGatewayInput +UpdateVirtualGatewayOutput +UpdateVirtualInterfaceAttributesRequest +UpdateVirtualNodeInput +UpdateVirtualNodeOutput +UpdateVirtualRouterInput +UpdateVirtualRouterOutput +UpdateVirtualServiceInput +UpdateVirtualServiceOutput +UpdateVocabularyFilterRequest +UpdateVocabularyFilterResponse +UpdateVocabularyRequest +UpdateVocabularyResponse +UpdateVodSourceRequest +UpdateVodSourceResponse +UpdateVoiceChannelRequest +UpdateVoiceChannelResponse +UpdateVoiceConnectorGroupRequest +UpdateVoiceConnectorGroupResponse +UpdateVoiceConnectorRequest +UpdateVoiceConnectorResponse +UpdateVoiceProfileDomainRequest +UpdateVoiceProfileDomainResponse +UpdateVoiceProfileRequest +UpdateVoiceProfileResponse +UpdateVoiceTemplateRequest +UpdateVoiceTemplateResponse +UpdateVolumeRequest +UpdateVolumeResponse +UpdateVpcAttachmentRequest +UpdateVpcAttachmentResponse +UpdateVpcEndpointDetail +UpdateVpcEndpointRequest +UpdateVpcEndpointResponse +UpdateVpcIngressConnectionRequest +UpdateVpcIngressConnectionResponse +UpdateVpcLinkRequest +UpdateVpcLinkResponse +UpdateWatchlistRequest +UpdateWatchlistResponse +UpdateWaveRequest +UpdateWebACLRequest +UpdateWebACLResponse +UpdateWebhookInput +UpdateWebhookOutput +UpdateWebhookRequest +UpdateWebhookResult +UpdateWirelessDeviceImportTaskRequest +UpdateWirelessDeviceRequest +UpdateWirelessGatewayRequest +UpdateWirelessGatewayTaskCreate +UpdateWirelessGatewayTaskEntry +UpdateWorkGroupInput +UpdateWorkerFleetRequest +UpdateWorkerFleetResponse +UpdateWorkerRequest +UpdateWorkerResponse +UpdateWorkflowRequest +UpdateWorkflowResponse +UpdateWorkflowStepGroupRequest +UpdateWorkflowStepGroupResponse +UpdateWorkflowStepRequest +UpdateWorkflowStepResponse +UpdateWorkforceRequest +UpdateWorkforceResponse +UpdateWorkgroupRequest +UpdateWorkgroupResponse +UpdateWorkloadInput +UpdateWorkloadOutput +UpdateWorkloadRequest +UpdateWorkloadResponse +UpdateWorkloadShareInput +UpdateWorkloadShareOutput +UpdateWorkspaceAliasRequest +UpdateWorkspaceAuthenticationRequest +UpdateWorkspaceAuthenticationResponse +UpdateWorkspaceBundleRequest +UpdateWorkspaceConfigurationRequest +UpdateWorkspaceImagePermissionRequest +UpdateWorkspaceRequest +UpdateWorkspaceResponse +UpdateWorkteamRequest +UpdateWorkteamResponse +UpdateWorldTemplateRequest +UpdateWorldTemplateResponse +UpdateXMLClassifierRequest +UpdateXssMatchSetRequest +UpdateXssMatchSetResponse +UpdateZonalShiftRequest +UpdatedAt +UpdatedBy +UpdatedDate +UpdatedField +UpdatedLatestPatchVersion +UpdatedReason +UpdatedTime +UpdatedTimestamp +UpdatedToken +UpdaterRequestId +Updates +UpdatesURI +UpfrontCost +UpfrontPrice +UpgradeAppliedSchemaRequest +UpgradeAppliedSchemaResponse +UpgradeAvailability +UpgradeDependencyFailureFault +UpgradeDomainRequest +UpgradeDomainResponse +UpgradeElasticsearchDomainRequest +UpgradeElasticsearchDomainResponse +UpgradeHistories +UpgradeHistory +UpgradeId +UpgradeLensReviewInput +UpgradeName +UpgradeProcessing +UpgradeProfileVersionInput +UpgradePublishedSchemaRequest +UpgradePublishedSchemaResponse +UpgradeStatus +UpgradeStep +UpgradeStepItem +UpgradeStepStatus +UpgradeTarget +UpgradedSchemaArn +UplinkCount +UplinkEchoConfig +UplinkGbps +UplinkSpectrumConfig +Upload +UploadArchiveInput +UploadAvailability +UploadBufferAllocatedInBytes +UploadBufferUsedInBytes +UploadConfiguration +UploadCredentials +UploadDate +UploadDocumentsRequest +UploadDocumentsResponse +UploadEnd +UploadEntityDefinitionsRequest +UploadEntityDefinitionsResponse +UploadId +UploadIdMarker +UploadLayerPartRequest +UploadLayerPartResponse +UploadListElement +UploadMetadata +UploadMultipartPartInput +UploadMultipartPartOutput +UploadNotFoundException +UploadPartCopyOutput +UploadPartCopyRequest +UploadPartOutput +UploadPartRequest +UploadPolicy +UploadPolicySignature +UploadReadSetPartRequest +UploadReadSetPartResponse +UploadSSHPublicKeyRequest +UploadSSHPublicKeyResponse +UploadServerCertificateRequest +UploadServerCertificateResponse +UploadSettings +UploadSigningCertificateRequest +UploadSigningCertificateResponse +UploadSize +UploadSpeed +UploadStart +UploadType +UploadUrl +UploaderConfig +UploaderStatus +Uploads +UploadsList +UpperBound +UpperBoundary +Upsert +UpsertKeys +UpsertRedshiftOptions +UpsertRedshiftTargetOptions +UpsertRowData +UpsertRowsResult +Upsolver +UpsolverDestinationProperties +UpsolverS3OutputFormatConfig +UpstreamRepository +UpstreamRepositoryInfo +Uri +UriEndpoint +UriPath +UriPathRoute +UriPathRouteInput +Uris +Url +UrlEndpoint +UrlEndpointConfig +UrlEndpointInput +UrlEndpointSummary +UrlExclusionPatterns +UrlExpiry +UrlInclusionPatterns +UrlPath +UrlReference +UrlType +Urls +Usage +UsageAccountResult +UsageAllocation +UsageAllocations +UsageByAccount +UsageCriteria +UsageDataSourceResult +UsageDimension +UsageFeatureResult +UsageFlags +UsageInstruction +UsageInstructions +UsageLimit +UsageLimitAlreadyExistsFault +UsageLimitId +UsageLimitList +UsageLimitNotFoundFault +UsageLimits +UsageMetric +UsageMetricBasis +UsageMode +UsageOperation +UsageOperationUpdateTime +UsagePlan +UsagePlanKey +UsagePlanKeys +UsagePlans +UsagePrice +UsageQuantity +UsageRecord +UsageRecordResult +UsageRecords +UsageReportSubscription +UsageReportSubscriptions +UsageResourceResult +UsageStartTimestamp +UsageStatisticType +UsageStatistics +UsageStatisticsFilter +UsageStatisticsSortBy +UsageStopTimestamp +UsageStrategy +UsageTotal +UsageType +UsbDeviceFilterStrings +Use2DSolver +UseAlternateFolderForOnline +UseAmortized +UseAudioRenditionGroup +UseAwsOwnedKey +UseAwsProvidedLatestImage +UseBFile +UseBcpFullLoad +UseBlankCellFormat +UseBlended +UseCase +UseCaseArn +UseCaseDescription +UseCaseId +UseCaseSummaryList +UseCaseType +UseChangeLog +UseCsvNoSupValue +UseCustomCookbooks +UseDefaultIfPreferenceUnavailable +UseDefaultProcessorFeatures +UseDefaults +UseDirectPathFullLoad +UseEarliestTimeOnPointInTimeUnavailable +UseEbsOptimizedInstances +UseExistingClientSecret +UseGeolocationForTimeZone +UseGrouping +UseLakeFormationCredentials +UseLatestRestorableTime +UseLegacyProvider +UseLogit +UseLogminerReader +UseLongIds +UseLongIdsAggregated +UseMiddleboxes +UseNewMappingType +UseOffPeakWindow +UseOpsworksSecurityGroups +UseOrdering +UsePathPrefix +UsePreviousTemplate +UsePreviousValue +UsePrimaryBackgroundColor +UseSameUsername +UseServiceLinkedRole +UseStageCache +UseTaskStartTimeForFullLoadTimestamp +UseThirdPartyBackupDevice +UseUpdateLookUp +Used +UsedCommitment +UsedInstanceCount +User +UserAccessLoggingSettings +UserAccessLoggingSettingsSummary +UserAccessResultItem +UserAccessTaskItem +UserAccessUrl +UserActivities +UserAgent +UserAlreadyExistsFault +UserAndGroupQuotas +UserArn +UserArnSession +UserAttributeNames +UserAttributeUpdateSettings +UserAttributeUpdateSettingsType +UserAttributes +UserAuthConfig +UserAuthConfigInfo +UserBase +UserBucket +UserBucketDetails +UserByPermissionGroup +UserCode +UserConfig +UserConfiguration +UserConfirmationNecessary +UserConfirmed +UserContext +UserContextData +UserContextDataType +UserContextPolicy +UserCount +UserCreateDate +UserData +UserDataFilters +UserDataList +UserDataShared +UserDataValidationParameters +UserDefined +UserDefinedFields +UserDefinedFunction +UserDefinedFunctionInput +UserDefinedFunctions +UserDetail +UserDetailList +UserDetails +UserDoesNotExistException +UserEmail +UserEmailList +UserEnabledAsLocalAdministrator +UserError +UserErrorException +UserErrors +UserFeedback +UserGroup +UserGroupAlreadyExistsFault +UserGroupId +UserGroupIds +UserGroupIdsToAdd +UserGroupIdsToRemove +UserGroupNotFoundFault +UserGroupPendingChanges +UserGroupQuotaExceededFault +UserGroupResolutionConfiguration +UserGroupResolutionMode +UserGroups +UserGroupsUpdateStatus +UserHierarchyGroupSummaryList +UserHierarchyGroups +UserId +UserIdGroupPair +UserIdGroupPairs +UserIdList +UserIdentity +UserIdentityConfiguration +UserIdentityInfo +UserIdentityInfoLite +UserIdentityRoot +UserIds +UserIdsToAdd +UserIdsToRemove +UserImportInProgressException +UserImportJob +UserImportJobType +UserImportJobs +UserInfo +UserInfoEndpoint +UserInteractionRequired +UserInvitationStatus +UserInvitationUrl +UserLambdaValidationException +UserLastModifiedDate +UserList +UserMFASettingList +UserMatch +UserMatchThreshold +UserMatches +UserMetadata +UserMigration +UserName +UserNameAttributeField +UserNameColumn +UserNames +UserNamesToAdd +UserNamesToRemove +UserNotConfirmedException +UserNotFoundException +UserNotFoundFault +UserPassword +UserPausedDetails +UserPendingChanges +UserPhoneConfig +UserPolicyList +UserPool +UserPoolAddOnNotEnabledException +UserPoolAddOns +UserPoolAddOnsType +UserPoolArn +UserPoolClient +UserPoolClientDescription +UserPoolClientId +UserPoolClientType +UserPoolClients +UserPoolConfig +UserPoolConfigs +UserPoolDescriptionType +UserPoolDomain +UserPoolId +UserPoolName +UserPoolPolicyType +UserPoolTaggingException +UserPoolTags +UserPoolType +UserPools +UserProfile +UserProfileAlreadyExistsException +UserProfileArn +UserProfileDetails +UserProfileName +UserProfileNameContains +UserProfileNameEquals +UserProfileNotFoundException +UserProfileSummary +UserProfiles +UserProperty +UserQuickConnectConfig +UserQuotaExceededFault +UserReference +UserRegistrationStatus +UserRole +UserRoleName +UserRules +UserSearchCriteria +UserSearchFilter +UserSearchMatching +UserSearchSubtree +UserSearchSummary +UserSecretId +UserSetting +UserSettings +UserSettingsSummary +UserStackAssociation +UserStackAssociationError +UserStackAssociations +UserStatus +UserStorage +UserStorageMetadata +UserSub +UserSummary +UserSummaryList +UserTags +UserTokenConfiguration +UserTokenConfigurations +UserTrustProviderType +UserTurnInputSpecification +UserTurnIntentOutput +UserTurnOutputSpecification +UserTurnResult +UserTurnSlotOutput +UserTurnSpecification +UserType +UserVolumeEncryptionEnabled +UserVolumeSizeGib +Username +UsernameAttributes +UsernameConfiguration +UsernameConfigurationType +UsernameExistsException +UsernameField +UsernamePassword +UsernamePrefix +Usernames +Users +UsersPerStep +UtcTiming +UtcTimingUri +Utilization +UtilizationByTime +UtilizationMetric +UtilizationPercentage +UtilizationPercentageInUnits +UtilizationStatus +UtilizationsByTime +UtilizedCIDRCount +UtranCid +UtteranceAggregationDuration +UtteranceAudioInputSpecification +UtteranceBotResponse +UtteranceData +UtteranceDataSortBy +UtteranceEvent +UtteranceId +UtteranceInputSpecification +UtteranceLevelTestResultItem +UtteranceLevelTestResults +UtteranceList +UtteranceSpecification +Uuid +VCPU +VCpuCount +VCpuCountRange +VCpuCountRangeRequest +VCpuCountRequest +VCpuInfo +VOICE +VPC +VPCAssociationAuthorizationNotFound +VPCAssociationNotFound +VPCConfig +VPCConfigResponse +VPCConnection +VPCConnectionId +VPCConnectionSummaries +VPCConnectionSummary +VPCConnections +VPCDerivedInfo +VPCDerivedInfoStatus +VPCEConfiguration +VPCEndpoint +VPCEndpointDNSName +VPCId +VPCOptions +VPCRegion +VPCSettings +VPCZoneIdentifier +VPCs +VTLDevice +VTLDeviceARN +VTLDeviceARNs +VTLDeviceProductIdentifier +VTLDeviceType +VTLDeviceVendor +VTLDevices +Valid +ValidCores +ValidDBInstanceModificationsMessage +ValidForInMinutes +ValidFrom +ValidFromDate +ValidNextSteps +ValidProcessorFeatures +ValidStorageOptions +ValidThreadsPerCore +ValidTill +ValidTo +ValidToDate +ValidUntil +ValidUpgradeTarget +ValidUserList +ValidateAssessmentReportIntegrityRequest +ValidateAssessmentReportIntegrityResponse +ValidateConfigurationRequest +ValidateConfigurationSettingsMessage +ValidateE911AddressRequest +ValidateE911AddressResponse +ValidateMatchmakingRuleSetInput +ValidateMatchmakingRuleSetOutput +ValidateOnly +ValidatePipelineDefinitionInput +ValidatePipelineDefinitionOutput +ValidatePipelineRequest +ValidatePipelineResponse +ValidatePolicyFinding +ValidatePolicyRequest +ValidatePolicyResponse +ValidateResourcePolicyRequest +ValidateResourcePolicyResponse +ValidateSecurityProfileBehaviorsRequest +ValidateSecurityProfileBehaviorsResponse +ValidateSolFunctionPackageContentInput +ValidateSolFunctionPackageContentMetadata +ValidateSolFunctionPackageContentOutput +ValidateSolNetworkPackageContentInput +ValidateSolNetworkPackageContentMetadata +ValidateSolNetworkPackageContentOutput +ValidateTemplateInput +ValidateTemplateOutput +Validation +ValidationConfiguration +ValidationConfigurations +ValidationData +ValidationDataConfig +ValidationDataLength +ValidationDomain +ValidationEmails +ValidationError +ValidationErrors +ValidationErrorsEntry +ValidationException +ValidationExceptionErrorArgument +ValidationExceptionField +ValidationExceptionType +ValidationFailedRecords +ValidationFailure +ValidationFailureReason +ValidationFailures +ValidationFraction +ValidationIssue +ValidationMessage +ValidationMethod +ValidationMode +ValidationOutput +ValidationPendingRecords +ValidationProfiles +ValidationResult +ValidationRole +ValidationRule +ValidationSettings +ValidationSpecification +ValidationState +ValidationStateDetails +ValidationStatus +ValidationStatuses +ValidationSuspendedRecords +ValidationWarning +Validator +ValidatorMetric +ValidatorTypes +Validators +Validity +ValidityEndTime +ValidityNotBefore +ValidityPeriod +ValidityStartTime +Value +ValueAsString +ValueAsStringList +ValueAxis +ValueCellStyle +ValueDetection +ValueDetections +ValueForMultipleValues +ValueFrom +ValueHint +ValueHolder +ValueImportanceMap +ValueInIA +ValueInMilliseconds +ValueInStandard +ValueKey +ValueLabelConfiguration +ValueLabelOptions +ValueList +ValueMapping +ValueMappings +ValueOptions +ValueType +ValueWhenUnset +ValueWhenUnsetOption +ValueWithServiceIds +Values +ValuesMap +ValuesToAdd +ValuesToRemove +VarCharValue +Variable +VariableDefinition +VariableEntry +VariableImpactExplanation +VariableImportanceMetrics +VariableTags +VariableValue +Variables +Variant +VariantImportItemDetail +VariantImportItemSource +VariantImportJobItem +VariantName +VariantProperty +VariantPropertyType +VariantStatus +VariantStoreItem +Variation +VariationConfig +VaultARN +VaultAccessPolicy +VaultList +VaultLockPolicy +VaultName +VaultNames +VaultNotificationConfig +VaultState +VaultType +VbrQuality +Vc3Class +Vc3Settings +VcenterBasedRemoteInfo +VcenterClient +VcfOptions +VchipAction +Vcpu +VdmAttributes +VdmEnabled +VdmOptions +VectorConfig +VectorCounters +VectorEnrichmentJobErrorDetails +VectorEnrichmentJobExportErrorDetails +VectorEnrichmentJobInputConfig +VectorEnrichmentJobS3Data +VectorEnrichmentJobSummaries +VectorType +Veeva +VeevaConnectorProfileCredentials +VeevaConnectorProfileProperties +VeevaSourceProperties +VehicleStatus +VehicleSummary +Vendor +VendorCreatedAt +VendorGuidance +VendorId +VendorName +VendorProperties +VendorSeverity +VendorUpdatedAt +Verb +Verbose +VerificationAttributes +VerificationException +VerificationFailedException +VerificationKeyArn +VerificationKeyCheckValue +VerificationKeyIdentifier +VerificationMessage +VerificationMessageTemplate +VerificationMessageTemplateType +VerificationResponse +VerificationState +VerificationStatus +VerificationToken +VerificationValue +Verified +VerifiedAccessEndpoint +VerifiedAccessEndpointEniOptions +VerifiedAccessEndpointId +VerifiedAccessEndpointIds +VerifiedAccessEndpointLoadBalancerOptions +VerifiedAccessEndpointStatus +VerifiedAccessEndpoints +VerifiedAccessGroup +VerifiedAccessGroupArn +VerifiedAccessGroupId +VerifiedAccessGroupIds +VerifiedAccessGroups +VerifiedAccessInstance +VerifiedAccessInstanceId +VerifiedAccessInstanceIds +VerifiedAccessInstanceLoggingConfiguration +VerifiedAccessInstances +VerifiedAccessLogCloudWatchLogsDestination +VerifiedAccessLogCloudWatchLogsDestinationOptions +VerifiedAccessLogDeliveryStatus +VerifiedAccessLogKinesisDataFirehoseDestination +VerifiedAccessLogKinesisDataFirehoseDestinationOptions +VerifiedAccessLogOptions +VerifiedAccessLogS3Destination +VerifiedAccessLogS3DestinationOptions +VerifiedAccessLogs +VerifiedAccessSseSpecificationRequest +VerifiedAccessSseSpecificationResponse +VerifiedAccessTrustProvider +VerifiedAccessTrustProviderCondensed +VerifiedAccessTrustProviderId +VerifiedAccessTrustProviderIds +VerifiedAccessTrustProviders +VerifiedAuthorUrl +VerifiedEmailAddresses +VerifiedForSendingStatus +Verify +VerifyAuthChallengeResponse +VerifyAuthRequestCryptogramInput +VerifyAuthRequestCryptogramOutput +VerifyCardValidationDataInput +VerifyCardValidationDataOutput +VerifyDomainDkimRequest +VerifyDomainDkimResponse +VerifyDomainIdentityRequest +VerifyDomainIdentityResponse +VerifyDuration +VerifyEmailAddressRequest +VerifyEmailIdentityRequest +VerifyMacInput +VerifyMacOutput +VerifyMacRequest +VerifyMacResponse +VerifyMode +VerifyOTPMessageRequest +VerifyOTPMessageRequestParameters +VerifyOTPMessageResponse +VerifyPinDataInput +VerifyPinDataOutput +VerifyRequest +VerifyResponse +VerifySMSSandboxPhoneNumberInput +VerifySessionResponse +VerifySoftwareTokenRequest +VerifySoftwareTokenResponse +VerifyStatus +VerifyTrustRequest +VerifyTrustResult +VerifyUserAttributeRequest +Version +VersionArn +VersionBump +VersionConflictException +VersionControlInfo +VersionCount +VersionCreatedDate +VersionDate +VersionDeleteError +VersionDescription +VersionDifferences +VersionId +VersionIdMarker +VersionIds +VersionIdsToStages +VersionInfo +VersionInformation +VersionLabel +VersionLabels +VersionLifecycleConfig +VersionMismatchException +VersionName +VersionNames +VersionNumber +VersionStage +VersionStages +VersionStatus +VersionSummary +VersionToExpire +VersionToPublish +VersionUpdateByJobsConfig +VersioningConfiguration +VersioningSupported +Versions +VersionsLimitExceededException +VersionsToPublish +Vertex +VerticalAccuracy +VerticalAlign +VerticalLayoutConfiguration +VerticalOffset +VerticalOverflowVisibility +VerticalPosition +VerticalTextAlignment +Vertices +VgwTelemetry +Video +VideoArtifactsConfiguration +VideoAttribute +VideoBlackFailoverSettings +VideoBlackSettings +VideoBlackThresholdMsec +VideoCodecSettings +VideoCompositionOffsets +VideoConcatenationConfiguration +VideoConfiguration +VideoContentSourceUrl +VideoDescription +VideoDescriptionName +VideoDescriptions +VideoDetail +VideoDetails +VideoFormat +VideoGenerator +VideoMetadata +VideoParameters +VideoPid +VideoPreprocessor +VideoPreprocessors +VideoQuality +VideoSelector +VideoSelectorColorSpaceSettings +VideoSelectorPid +VideoSelectorProgramId +VideoSelectorSettings +VideoSettings +VideoTooLargeException +View +ViewArn +ViewArns +ViewBillingRequest +ViewBillingResponse +ViewContent +ViewContentSha256 +ViewExpandedText +ViewFrame +ViewId +ViewInputContent +ViewName +ViewOffNadir +ViewOffNadirInput +ViewOriginalText +ViewSummary +ViewSunAzimuth +ViewSunAzimuthInput +ViewSunElevation +ViewSunElevationInput +ViewToken +ViewVersion +ViewVersionSummary +ViewVersionSummaryList +ViewerCertificate +ViewerProtocolPolicy +Views +ViewsSummaryList +ViolatedEntities +ViolatingRoute +ViolatingRoutes +ViolatingSecurityGroups +ViolationDetail +ViolationEvent +ViolationEventAdditionalInfo +ViolationEventOccurrenceRange +ViolationReason +ViolationReport +ViolationTarget +ViolationTargetDescription +ViolatorCount +Violators +VirtualCluster +VirtualGateway +VirtualGatewayBackendDefaults +VirtualGatewayClientPolicy +VirtualGatewayClientPolicyTls +VirtualGatewayData +VirtualGatewayFileAccessLog +VirtualGatewayGrpcConnectionPool +VirtualGatewayHealthCheckPolicy +VirtualGatewayHttp2ConnectionPool +VirtualGatewayHttpConnectionPool +VirtualGatewayListener +VirtualGatewayListenerTls +VirtualGatewayListenerTlsAcmCertificate +VirtualGatewayListenerTlsFileCertificate +VirtualGatewayListenerTlsSdsCertificate +VirtualGatewayListenerTlsValidationContext +VirtualGatewayLogging +VirtualGatewayPortMapping +VirtualGatewayRef +VirtualGatewaySpec +VirtualGatewayStatus +VirtualGatewayTlsValidationContext +VirtualGatewayTlsValidationContextAcmTrust +VirtualGatewayTlsValidationContextFileTrust +VirtualGatewayTlsValidationContextSdsTrust +VirtualGateways +VirtualHost +VirtualInterface +VirtualInterfaceTestHistory +VirtualInterfaces +VirtualMFADevice +VirtualMFADeviceName +VirtualMFADevices +VirtualMachine +VirtualMachineDetails +VirtualMachines +VirtualName +VirtualNetworkId +VirtualNodeData +VirtualNodeGrpcConnectionPool +VirtualNodeHttp2ConnectionPool +VirtualNodeHttpConnectionPool +VirtualNodeRef +VirtualNodeServiceProvider +VirtualNodeSpec +VirtualNodeStatus +VirtualNodeTcpConnectionPool +VirtualObject +VirtualRouterData +VirtualRouterListener +VirtualRouterRef +VirtualRouterServiceProvider +VirtualRouterSpec +VirtualRouterStatus +VirtualServiceBackend +VirtualServiceData +VirtualServiceRef +VirtualServiceSpec +VirtualServiceStatus +VirtualizationType +VirtualizationTypes +VisaPin +VisaPinVerification +VisaPinVerificationValue +Visibility +VisibilityConfig +VisibilityState +VisibilityTimeout +VisibleRange +VisibleRangeOptions +VisibleToAllUsers +VisitorId +Visual +VisualAxisSortOption +VisualCustomAction +VisualCustomActionOperation +VisualId +VisualIds +VisualLayoutOptions +VisualMenuOption +VisualPalette +VisualPublishOptions +VisualReference +VisualReferenceInput +VisualReferenceOutput +VisualSubtitleLabelOptions +VisualTitleLabelOptions +Visuals +Vlan +VlanId +VmServer +VmServerAddress +VmwareCategory +VmwareTag +VmwareTagDescription +VmwareTagName +VmwareTags +VmwareToAwsTagMapping +VmwareToAwsTagMappings +Vocabularies +Vocabulary +VocabularyArn +VocabularyFileUri +VocabularyFilterFileUri +VocabularyFilterInfo +VocabularyFilterMatch +VocabularyFilterMethod +VocabularyFilterName +VocabularyFilterNames +VocabularyFilters +VocabularyId +VocabularyInfo +VocabularyName +VocabularyNames +VocabularyState +VocabularySummary +VocabularySummaryList +VodSource +VodSourceName +Voice +VoiceAnalyticsProcessorConfiguration +VoiceChannelRequest +VoiceChannelResponse +VoiceConnector +VoiceConnectorArn +VoiceConnectorGroup +VoiceConnectorGroupArn +VoiceConnectorGroupId +VoiceConnectorGroups +VoiceConnectorId +VoiceConnectorItem +VoiceConnectorItems +VoiceConnectorRegions +VoiceConnectorSettings +VoiceConnectors +VoiceEnhancementSinkConfiguration +VoiceId +VoiceMessage +VoiceMessageContent +VoiceProfile +VoiceProfileArn +VoiceProfileDomain +VoiceProfileDomainArn +VoiceProfileDomainId +VoiceProfileDomainSummary +VoiceProfileDomains +VoiceProfileId +VoiceProfileSummary +VoiceProfiles +VoiceRecordingConfiguration +VoiceRecordingTrack +VoiceSettings +VoiceSpoofingRisk +VoiceTemplate +VoiceTemplateRequest +VoiceTemplateResponse +VoiceToneAnalysisStatus +VoiceToneAnalysisTask +VoiceToneAnalysisTaskId +VoiceToneAnalysisTaskStatus +VoiceprintGenerationStatus +Voices +VoipDeviceToken +Volume +VolumeARN +VolumeARNs +VolumeAppendModeEnabled +VolumeArn +VolumeAttachment +VolumeAttachmentStatus +VolumeConfiguration +VolumeConfigurations +VolumeDetail +VolumeDiskId +VolumeEncryptionKey +VolumeFilter +VolumeFrom +VolumeId +VolumeIds +VolumeInfo +VolumeInfos +VolumeKmsKeyId +VolumeModification +VolumeMount +VolumeMounts +VolumeName +VolumeNotFound +VolumePath +VolumeProgress +VolumeRecommendation +VolumeRecommendationOption +VolumeRecoveryPointInfo +VolumeRecoveryPointInfos +VolumeRecoveryPointTime +VolumeScanStatus +VolumeSize +VolumeSizeGB +VolumeSizeInBytes +VolumeSizeInGB +VolumeSpecification +VolumeStatistics +VolumeStatus +VolumeStatusAction +VolumeStatusAttachmentStatus +VolumeStatusDetails +VolumeStatusEvent +VolumeStatusInfo +VolumeStatusItem +VolumeStatuses +VolumeThroughput +VolumeType +VolumeUsageByDatasourcePackage +VolumeUsageInBytes +VolumeUsageUpdateTime +VolumeUsageUpdatedTime +VolumeUsedInBytes +VolumeiSCSIAttributes +Volumes +VolumesFrom +VolumesModifications +VolumesPerInstance +VorbisSettings +Vote +VoteOnProposalInput +VoteSummary +VoterMemberId +VotingPolicy +Vp8Settings +Vp9Settings +Vpc +VpcArn +VpcAttachment +VpcAttachments +VpcCidrBlockAssociation +VpcCidrBlockState +VpcClassicLink +VpcConfig +VpcConfigInput +VpcConfigOutput +VpcConfigRequest +VpcConfigResponse +VpcConfigs +VpcConfiguration +VpcConfigurationDescription +VpcConfigurationDescriptions +VpcConfigurationId +VpcConfigurationUpdate +VpcConfigurationUpdates +VpcConfigurations +VpcConnection +VpcConnectionArn +VpcConnectionInfo +VpcConnectionInfoServerless +VpcConnectionProperties +VpcConnections +VpcConnectivity +VpcConnectivityClientAuthentication +VpcConnectivityIam +VpcConnectivitySasl +VpcConnectivityScram +VpcConnectivityTls +VpcConnector +VpcConnectorArn +VpcConnectorName +VpcConnectorRevision +VpcConnectors +VpcDNSTarget +VpcDNSTargets +VpcDescription +VpcDestinationConfiguration +VpcDestinationProperties +VpcDestinationSummary +VpcEndpoint +VpcEndpointConnection +VpcEndpointConnectionId +VpcEndpointConnections +VpcEndpointDetail +VpcEndpointError +VpcEndpointErrorDetail +VpcEndpointErrors +VpcEndpointFilters +VpcEndpointId +VpcEndpointIds +VpcEndpointOwner +VpcEndpointPolicySupported +VpcEndpointService +VpcEndpointServiceName +VpcEndpointState +VpcEndpointSummary +VpcEndpointSummaryList +VpcEndpointType +VpcEndpoints +VpcId +VpcIds +VpcInfoCidrBlockSetDetails +VpcInfoIpv6CidrBlockSetDetails +VpcInfoPeeringOptionsDetails +VpcInformation +VpcIngressConnection +VpcIngressConnectionArn +VpcIngressConnectionName +VpcIngressConnectionSummary +VpcIngressConnectionSummaryList +VpcInterface +VpcInterfaceAttachment +VpcInterfaceName +VpcInterfaceRequest +VpcInterfaces +VpcIpv6CidrBlockAssociation +VpcLink +VpcLinkId +VpcLinkStatus +VpcLinkStatusMessage +VpcLinkVersion +VpcLinks +VpcName +VpcOnly +VpcOptions +VpcOutputSettings +VpcOutputSettingsDescription +VpcOwnerId +VpcPeeringAuthorization +VpcPeeringAuthorizations +VpcPeeringConnection +VpcPeeringConnectionId +VpcPeeringConnectionIds +VpcPeeringConnectionOptionsDescription +VpcPeeringConnectionStateReason +VpcPeeringConnectionStatus +VpcPeeringConnectionVpcInfo +VpcPeeringConnections +VpcSecurityGroupId +VpcSecurityGroupIds +VpcSecurityGroupMembership +VpcSecurityGroupMemberships +VpcSecurityGroups +VpcSettings +VpcSubnetIds +VpcSubnets +VpceId +Vpcs +VpnConnection +VpnConnectionArn +VpnConnectionDeviceSampleConfiguration +VpnConnectionDeviceType +VpnConnectionDeviceTypeId +VpnConnectionDeviceTypes +VpnConnectionId +VpnConnectionIds +VpnConnectionOptions +VpnConnectionOptionsSpecification +VpnConnections +VpnEcmpSupport +VpnGateway +VpnGatewayId +VpnGatewayIds +VpnGateways +VpnPort +VpnProtocol +VpnStaticRoute +VpnTunnelLogOptions +VpnTunnelLogOptionsSpecification +VpnTunnelOptionsSpecification +VpnTunnelOutsideIpAddress +VsamAttributes +VsamDetailAttributes +Vulnerabilities +Vulnerability +VulnerabilityCodeVulnerabilities +VulnerabilityIdAggregation +VulnerabilityVendor +VulnerablePackage +VulnerablePackages +WAFAssociatedItemException +WAFBadRequestException +WAFConfigurationWarningException +WAFDisallowedNameException +WAFDuplicateItemException +WAFEntityMigrationException +WAFExpiredManagedRuleGroupVersionException +WAFInternalErrorException +WAFInvalidOperationException +WAFInvalidParameterException +WAFInvalidPermissionPolicyException +WAFInvalidRegexPatternException +WAFInvalidResourceException +WAFLimitsExceededException +WAFLogDestinationPermissionIssueException +WAFNonEmptyEntityException +WAFNonexistentContainerException +WAFNonexistentItemException +WAFOptimisticLockException +WAFReferencedItemException +WAFServiceLinkedRoleErrorException +WAFStaleDataException +WAFSubscriptionNotFoundException +WAFTagOperationException +WAFTagOperationInternalErrorException +WAFUnavailableEntityException +WAFUnsupportedAggregateKeyTypeException +WAPE +WafAction +WafExcludedRule +WafOverrideAction +WafWebAclArn +Wait +WaitActivity +WaitAndContinueSpecification +WaitFor +WaitForQuietTime +WaitIntervalInSeconds +WaitMinutes +WaitPeriodMs +WaitTime +WaitTimeSeconds +WaitUntil +WaitingActions +WaitingOnIngestion +WakeUp +WakeWord +Warehouse +WarmCount +WarmEnabled +WarmNodeCount +WarmPoolConfiguration +WarmPoolProgress +WarmPoolSize +WarmPoolStatus +WarmPoolStatusEquals +WarmStartConfig +WarmStartType +WarmType +WarmupPercentage +WarmupStatus +WarnCode +WarnMessage +Warning +WarningForeground +WarningGroup +WarningMessage +Warnings +WarningsListItem +Watchlist +WatchlistDetails +WatchlistId +WatchlistIds +WatchlistSummaries +WatchlistSummary +WaterfallChartAggregatedFieldWells +WaterfallChartConfiguration +WaterfallChartFieldWells +WaterfallChartOptions +WaterfallChartSortConfiguration +WaterfallVisual +Watermarks +WavSettings +Wave +WaveAggregatedStatus +WaypointPositions +Wcdma +WcdmaLocalId +WcdmaNmr +WcdmaNmrObj +WcdmaObj +Web +WebACL +WebACLArn +WebACLId +WebACLLockToken +WebACLName +WebACLSummary +WebACLUpdate +WebACLs +WebAclArn +WebAclId +WebClientId +WebCollectorGrantedRoleBasedAccess +WebCollectorS3Access +WebCrawlerConfiguration +WebCrawlerMode +WebDeliveryAllowedFlag +WebIdentityToken +WebLinkFieldMappings +WebServerHostname +WebSocketEndpoint +WebToken +WebUrl +Webhook +WebhookAuthConfiguration +WebhookDefinition +WebhookFilter +WebhookFilterRule +WebserverAccessMode +WebserverLogs +WebserverUrl +WebsiteAuthorizationProviderSummary +WebsiteAuthorizationProviders +WebsiteCaId +WebsiteCaSummary +WebsiteCertificateAuthorities +WebsiteConfiguration +WebsiteRedirectLocation +WebsiteURL +WebsiteUrl +Websocket +WebvttDestinationSettings +WebvttHlsSourceSettings +Wednesday +WeeklyAutoScalingSchedule +WeeklyMaintenanceStartTime +WeeklyMaintenanceWindowStart +WeeklySchedule +WeeklySetting +WeeklySettings +WeeklyStartTime +Weight +WeightLbs +WeightSort +WeightedCapacity +WeightedQuantileLoss +WeightedQuantileLosses +WeightedTarget +WeightedTargetGroup +WelcomeIntent +West +WhatIfAnalyses +WhatIfAnalysisArn +WhatIfAnalysisName +WhatIfAnalysisSummary +WhatIfForecastArn +WhatIfForecastArns +WhatIfForecastExportArn +WhatIfForecastExportName +WhatIfForecastExportSummary +WhatIfForecastExports +WhatIfForecastName +WhatIfForecastSummary +WhatIfForecasts +WhatIfPointScenario +WhatIfRangeScenario +WhitePointX +WhitePointY +Whitelist +WhitelistCidr +WhitelistRules +WhitelistedNames +WhoIsServer +WiFiAccessPoint +WiFiAccessPoints +Width +WidthInPx +WidthPixels +WikiFieldMappings +WindowEndDatetime +WindowExecutionId +WindowExecutionTaskIdentities +WindowExecutionTaskInvocationIdentities +WindowExecutions +WindowId +WindowIdentities +WindowOptions +WindowSize +WindowStartDatetime +WindowStartTime +WindowSummary +WindowTargetId +WindowTaskId +WindowsAuditLogConfiguration +WindowsAuditLogCreateConfiguration +WindowsConfiguration +WindowsFileSystemConfiguration +WindowsResponse +WirelessConnection +WirelessDeviceEventLogOption +WirelessDeviceEventTopic +WirelessDeviceFrameInfo +WirelessDeviceId +WirelessDeviceIdEventTopic +WirelessDeviceImportTask +WirelessDeviceImportTaskList +WirelessDeviceList +WirelessDeviceLogOption +WirelessDeviceLogOptions +WirelessDeviceStatistics +WirelessDeviceType +WirelessDevices +WirelessDevicesToAdd +WirelessDevicesToRemove +WirelessGatewayEventLogOption +WirelessGatewayEventTopic +WirelessGatewayId +WirelessGatewayIdEventTopic +WirelessGatewayList +WirelessGatewayLogOption +WirelessGatewayLogOptions +WirelessGatewayStatistics +WirelessGatewayTaskDefinitionId +WirelessGateways +WirelessGatewaysToAdd +WirelessGatewaysToRemove +WirelessMetadata +WisdomInfo +WithDecryption +WithEvent +WithFederation +WithHeader +WithdrawByoipCidrRequest +WithdrawByoipCidrResponse +WithdrawByoipCidrResult +WithoutSettings +WordCasing +WordCloudAggregatedFieldWells +WordCloudChartConfiguration +WordCloudFieldWells +WordCloudOptions +WordCloudSortConfiguration +WordCloudVisual +WordFilter +WordOrientation +WordPadding +WordScaling +Words +WorkDocsConfiguration +WorkGroup +WorkGroupConfiguration +WorkGroupConfigurationUpdates +WorkGroupName +WorkGroupNames +WorkGroupSummary +WorkGroups +WorkLogFieldMappings +WorkRequesterAccountId +WorkUnitId +WorkUnitIdMax +WorkUnitIdMin +WorkUnitRange +WorkUnitRanges +WorkUnitToken +WorkUnitsExecutedCount +WorkUnitsGeneratedCount +WorkUnitsNotReadyYetException +Worker +WorkerBlock +WorkerBlocks +WorkerConfiguration +WorkerConfigurationDescription +WorkerConfigurationRevisionDescription +WorkerConfigurationRevisionSummary +WorkerConfigurationSummary +WorkerFleet +WorkerId +WorkerIds +WorkerLogDelivery +WorkerLogDeliveryDescription +WorkerLogs +WorkerResourceConfig +WorkerType +WorkerTypeSpecification +WorkerTypeSpecificationInput +Workflow +WorkflowAttributes +WorkflowDetail +WorkflowDetails +WorkflowExecution +WorkflowExecutionAlreadyStartedFault +WorkflowExecutionCancelRequestedEventAttributes +WorkflowExecutionCanceledEventAttributes +WorkflowExecutionCompletedEventAttributes +WorkflowExecutionConfiguration +WorkflowExecutionContinuedAsNewEventAttributes +WorkflowExecutionCount +WorkflowExecutionDetail +WorkflowExecutionFailedEventAttributes +WorkflowExecutionFilter +WorkflowExecutionInfo +WorkflowExecutionInfos +WorkflowExecutionMetadata +WorkflowExecutionOpenCounts +WorkflowExecutionSignaledEventAttributes +WorkflowExecutionStartedEventAttributes +WorkflowExecutionTerminatedEventAttributes +WorkflowExecutionTimedOutEventAttributes +WorkflowGraph +WorkflowId +WorkflowListItem +WorkflowMetrics +WorkflowName +WorkflowParameter +WorkflowRun +WorkflowRunId +WorkflowRunProperties +WorkflowRunStatistics +WorkflowState +WorkflowStatus +WorkflowStep +WorkflowStepAutomationConfiguration +WorkflowStepGroupSummary +WorkflowStepItem +WorkflowStepMetadata +WorkflowStepOutput +WorkflowStepSummary +WorkflowToken +WorkflowType +WorkflowTypeConfiguration +WorkflowTypeDetail +WorkflowTypeFilter +WorkflowTypeInfo +WorkflowTypeInfos +WorkflowUpdate +Workflows +Workforce +WorkforceArn +WorkforceName +WorkforceVpcConfig +WorkforceVpcConfigRequest +WorkforceVpcConfigResponse +Workforces +Workgroup +WorkgroupName +WorkingDirectory +WorkingStorageAllocatedInBytes +WorkingStorageUsedInBytes +Workload +WorkloadArn +WorkloadConfiguration +WorkloadDiscoveryConfig +WorkloadId +WorkloadList +WorkloadName +WorkloadNamePrefix +WorkloadProfile +WorkloadRemarks +WorkloadResourceDefinition +WorkloadShare +WorkloadShareSummaries +WorkloadShareSummary +WorkloadSummaries +WorkloadSummary +WorkloadType +WorkmailAction +Workspace +WorkspaceAccessProperties +WorkspaceBundle +WorkspaceConnectionStatus +WorkspaceCreationProperties +WorkspaceDescription +WorkspaceDirectory +WorkspaceId +WorkspaceIds +WorkspaceImage +WorkspaceProperties +WorkspaceRequest +WorkspaceSecurityGroupId +WorkspaceSettings +WorkspaceState +WorkspaceStatus +WorkspaceSummary +Workspaces +WorkspacesConnectionStatus +WorkspacesDefaultRoleNotFoundException +WorkspacesIpGroup +Workteam +WorkteamArn +WorkteamName +Workteams +WorldConfig +WorldCount +WorldExportJobSummary +WorldFailure +WorldGenerationJobSummary +WorldSummary +Worm +Wrap +WrappedKey +WrappedKeyBlock +WrappedKeyMaterialFormat +WrappingAlgorithm +WrappingKeyAlgorithm +WrappingKeyArn +WrappingKeyCertificate +WrappingKeyCertificateChain +WrappingKeyIdentifier +WrappingKeySpec +Write +WriteAccessPrincipalArns +WriteApplicationSettingsRequest +WriteAttributes +WriteBufferSize +WriteCampaignRequest +WriteCapacityUnits +WriteDashManifest +WriteEventStream +WriteGetObjectResponseRequest +WriteHeader +WriteHlsManifest +WriteIOs +WriteJourneyRequest +WriteManifest +WriteMp4PackagingType +WriteOperation +WriteOperations +WriteRecordsRequest +WriteRecordsResponse +WriteRequest +WriteSegmentRequest +WriteSegmentTimelineInRepresentation +WriteTreatmentResource +WriterVersion +X +XAttributeName +XAxis +XAxisDisplayOptions +XAxisLabelOptions +XAxisLocation +XMLClassifier +XPosition +XRayErrorPercent +XRayFaultPercent +XRayNodeName +XRayNodeType +XRayRequestAverageLatency +XRayRequestCount +XRayThrottlePercent +XSSProtection +Xavc4kIntraCbgProfileSettings +Xavc4kIntraVbrProfileSettings +Xavc4kProfileSettings +XavcClass +XavcHdIntraCbgProfileSettings +XavcHdProfileSettings +XavcProfileSettings +XavcSettings +XksKeyAlreadyInUseException +XksKeyConfiguration +XksKeyConfigurationType +XksKeyId +XksKeyInvalidConfigurationException +XksKeyNotFoundException +XksProxyAuthenticationCredential +XksProxyAuthenticationCredentialType +XksProxyConfiguration +XksProxyConfigurationType +XksProxyConnectivity +XksProxyIncorrectAuthenticationCredentialException +XksProxyInvalidConfigurationException +XksProxyInvalidResponseException +XksProxyUriEndpoint +XksProxyUriEndpointInUseException +XksProxyUriInUseException +XksProxyUriPath +XksProxyUriUnreachableException +XksProxyVpcEndpointServiceInUseException +XksProxyVpcEndpointServiceInvalidConfigurationException +XksProxyVpcEndpointServiceName +XksProxyVpcEndpointServiceNotFoundException +XrayEnabled +XssMatchSet +XssMatchSetId +XssMatchSetSummary +XssMatchSetUpdate +XssMatchSets +XssMatchStatement +XssMatchTuple +XssMatchTuples +Y +YAttributeName +YAxis +YAxisDisplayOptions +YAxisLabelOptions +YAxisLocation +YPosition +YarnEndpointAddress +Yaw +Years +YesVoteCount +Z +Zendesk +ZendeskConnectorProfileCredentials +ZendeskConnectorProfileProperties +ZendeskDestinationProperties +ZendeskMetadata +ZendeskSourceProperties +ZeppelinApplicationConfiguration +ZeppelinApplicationConfigurationDescription +ZeppelinApplicationConfigurationUpdate +ZeppelinMonitoringConfiguration +ZeppelinMonitoringConfigurationDescription +ZeppelinMonitoringConfigurationUpdate +ZeppelinRemoteSparkInterpreterPort +ZipCode +ZipFile +ZipFileContent +ZipFileContentUpdate +ZonalShift +ZonalShiftInResource +ZonalShiftSummary +ZonalStatisticsConfigInput +Zone +ZoneAwarenessConfig +ZoneAwarenessEnabled +ZoneId +ZoneIdentity +ZoneIds +ZoneName +ZoneNames +ZoneS3Path +ZoneS3PathKmsKeyId +ZoneStatus +ZoneType +ZookeeperConnectString +ZookeeperConnectStringTls +ZookeeperId +ZookeeperNodeInfo +ZookeeperVersion +abandon +abilities +ableToUpdateBundle +abortConfig +abortCriteriaList +abortStatement +aborted +aboutText +absolutePath +acceleratorHealth +acceleratorId +acceleratorIds +acceleratorSet +acceleratorType +acceleratorTypeName +acceleratorTypeOfferings +acceleratorTypes +accelerators +accept +acceptDate +acceptRanges +acceptedAt +acceptedBy +acceptedFileTypes +acceptedMediaTypes +acceptedQueryCount +accepteeId +accepts +access +accessControlList +accessDetails +accessDirection +accessFrom +accessKey +accessKeyId +accessKeys +accessLevel +accessLog +accessLogConfig +accessLogSettings +accessLogSubscriptionIdentifier +accessPoint +accessPointAccount +accessPointArn +accessPointId +accessPointPolicy +accessPoints +accessPolicy +accessPolicyArn +accessPolicyCreationDate +accessPolicyDetail +accessPolicyId +accessPolicyIdentity +accessPolicyLastUpdateDate +accessPolicyPermission +accessPolicyResource +accessPolicySummaries +accessPreview +accessPreviewId +accessPreviews +accessRole +accessRules +accessToken +accessTokenId +accessType +accessTypes +account +accountAccessType +accountAggregation +accountAlias +accountEnrollmentStatuses +accountID +accountId +accountIdentifiers +accountIds +accountLevelBpaSync +accountLevelPermissions +accountList +accountName +accountPolicies +accountPolicy +accountSettings +accountSettingsDetail +accountStatus +accountType +accounts +accountsCleanup +accountsWithProvisionedRestoreAccess +accountsWithRestoreAccess +achievableRpoInSecs +achievableRtoInSecs +acknowledgeActionConfiguration +acknowledgeActionRequests +acknowledgeFlow +acknowledgment +acknowledgmentStatus +action +actionArn +actionCode +actionConfiguration +actionConfigurationProperties +actionExecutionDetails +actionExecutionId +actionGroup +actionID +actionIDs +actionId +actionIdentifiers +actionIds +actionName +actionOnTimeout +actionOwnerFilter +actionParams +actionPlanInstructions +actionPlanTitle +actionRevision +actionStates +actionStatus +actionTaken +actionType +actionTypeId +actionTypes +actionVersion +actions +actionsDefinition +actionsExecuted +actionsExecutions +actionsFailed +actionsSkipped +activateCaseSensitiveIdentifier +activateDeepInspection +activationCode +activationExpiry +activationId +activationJobs +active +activeAgentlessCollectors +activeAgents +activeAssessmentsCount +activeConnectors +activeContexts +activeDirectory +activeDirectoryUser +activeExperimentCount +activeFromTimestamp +activeJobId +activeLaunchCount +activeMeCollectors +activeNames +activeServicesCount +activeSessionId +activeUntilTimestamp +activeViolations +activities +activityArn +activityFailedEventDetails +activityId +activityScheduleFailedEventDetails +activityScheduledEventDetails +activityStartedEventDetails +activitySucceededEventDetails +activityTaskCancelRequestedEventAttributes +activityTaskCanceledEventAttributes +activityTaskCompletedEventAttributes +activityTaskFailedEventAttributes +activityTaskScheduledEventAttributes +activityTaskStartedEventAttributes +activityTaskTimedOutEventAttributes +activityTimedOutEventDetails +activityType +actor +actorArn +actualAgentPrompt +actualCapacity +actualElicitedSlot +actualIncrementalBackupSizeInMegaBytes +actualIntent +actualOutput +actualReferenceId +actualValue +add +addAllowedPrefixesToDirectConnectGateway +addAttributes +addColumns +addGroupOwner +addMetrics +addOnRequest +addOnType +addOns +addOrUpdateLabels +addOrUpdateTaints +addOrUpdateVariations +addSecurityGroupIds +addSubnetIds +addThingsToThingGroupParams +addedToServiceDateTime +additionalAllowedHeaders +additionalAttributeNames +additionalAuthenticationProviders +additionalContext +additionalData +additionalDeploymentStatusInfo +additionalEncryptionContext +additionalExposedHeaders +additionalFixedProperties +additionalInfo +additionalInstanceConfiguration +additionalMessage +additionalMetricsToRetain +additionalMetricsToRetainV2 +additionalOccurrences +additionalParameters +additionalParamsForNs +additionalTransientProperties +addon +addonArn +addonName +addonVersion +addonVersions +addons +address +addressFamily +adds +adjustedCvss +adjustments +admin +adminAccountId +adminAccounts +adminRoleArn +adminUserName +adminUserPassword +adminUsername +administrator +administratorAccount +administratorAccountId +adr +adsApplicationConfigurationId +adsApplicationConfigurationName +adsApplicationName +advancedRecognitionSetting +affectedAccounts +affectedImages +affectedInstances +afterBlob +afterBlobId +afterCommitId +afterCommitSpecifier +afterPath +afterTime +agent +agentConnected +agentCpuCores +agentDetails +agentHash +agentHealth +agentHealthCode +agentHealthCodes +agentHealthDetails +agentHealths +agentId +agentIds +agentLastSeenByServiceDateTime +agentNetworkInfoList +agentOrchestrationConfig +agentParameters +agentPreviews +agentProfile +agentPrompt +agentStatus +agentSummary +agentTurn +agentType +agentUpdateStatus +agentVersion +agentlessCollectorSummary +agents +agentsConfigurationStatus +agentsInfo +agentsTruncated +aggregateColumns +aggregateField +aggregateStatus +aggregateTypes +aggregateValue +aggregatedUtterancesSummaries +aggregatedValues +aggregatedVariablesImpactExplanations +aggregatedVariablesImportance +aggregatedVariablesImportanceMetrics +aggregationConfig +aggregationDuration +aggregationField +aggregationLastRefreshedDateTime +aggregationRequest +aggregationType +aggregationWindowEndTime +aggregationWindowStartTime +agreementName +agreements +alarm +alarmActions +alarmCapabilities +alarmConfiguration +alarmEventActions +alarmModelArn +alarmModelDescription +alarmModelName +alarmModelSummaries +alarmModelVersion +alarmModelVersionSummaries +alarmName +alarmNames +alarmNotification +alarmRecommendations +alarmRoleArn +alarmRule +alarmState +alarmSummaries +alarms +alertManagerDefinition +alertTargetArn +alertTargets +alerts +algorithm +algorithmArn +algorithmHyperParameterRanges +algorithmHyperParameters +algorithmImage +algorithmSpecification +alias +aliasPrefix +aliases +alignment +all +allColumns +allMatchesCount +allMatchesSum +allRegions +allSupported +allocationStrategy +allowAudioInput +allowAuthorizerOverride +allowAutoRegistration +allowCleartext +allowConstraintErrors +allowDTMFInput +allowDuplicates +allowExternalPrincipals +allowFleet +allowImageBuilder +allowInterrupt +allowJoinsOnColumnsWithDifferentNames +allowListIds +allowLists +allowMultipleValues +allowOrganizationMemberAccount +allowOverwrite +allowPublicOverrides +allowed +allowedAccounts +allowedAnalyses +allowedAnalysisProviders +allowedColumns +allowedHTTPMethods +allowedInputTypes +allowedJoinOperators +allowedOrganizations +allowedPrefixesToDirectConnectGateway +allowedValues +allowlist +allowsHostedConnections +allowsPublicReadAccess +allowsPublicWriteAccess +allowsUnencryptedObjectUploads +alreadyImplemented +alternateKeys +alternativeDomainNames +alternativeIntents +amazonAddress +amazonSideAsn +ami +amiDistributionConfiguration +amiId +amiLaunchIndex +amiTags +amiType +amis +amount +amznErrorType +analysisCompleteTime +analysisId +analysisMethod +analysisParameters +analysisResults +analysisRule +analysisRulePolicy +analysisRuleType +analysisRuleTypes +analysisStatus +analysisTemplate +analysisTemplateArn +analysisTemplateArns +analysisTemplateIdentifier +analysisTemplateSummaries +analysisType +analyzedAt +analyzedResources +analyzer +analyzerArn +analyzerName +analyzers +anchor +and +androidPaths +annotationFields +annotationImportJobs +annotationStoreVersions +annotationStores +annotationType +anomalies +anomalyInstanceId +answerMachineDetectionConfig +antennaUplinkConfigArn +antiPatternReportS3Object +antipatternReportResultList +antipatternReportS3Object +antipatternReportStatus +antipatternReportStatusMessage +apacheKafkaCluster +api +apiAccess +apiAccessPrincipalArn +apiAssociation +apiCache +apiCachingBehavior +apiCallDateTime +apiCallDetails +apiConfiguration +apiId +apiKey +apiKeyRequired +apiKeySource +apiKeyVersion +apiKeys +apiMode +apiSecretKey +apiServiceName +apiStages +apiSummary +apiToken +apiType +apiVersion +app +appArn +appAuthorization +appAuthorizationArn +appAuthorizationIdentifier +appAuthorizationSummary +appAuthorizationSummaryList +appBundle +appBundleArn +appBundleIdentifier +appBundleSummaryList +appCategory +appComponent +appComponentName +appComponentNames +appComponents +appConfigResource +appId +appIdClientRegex +appIds +appInputSource +appInputSources +appIntegrationArn +appPackagesCleanup +appProtocol +appRegistryAppName +appRegistryAppNames +appSpecContent +appSummaries +appSummary +appTemplateBody +appType +appUnitError +appUnitErrorCategory +appUpload +appValidationConfigurations +appValidationOutput +appValidationStrategy +appVersion +appVersions +application +applicationAggregatedStatus +applicationArn +applicationCallBackURL +applicationComponentCriteria +applicationComponentDetail +applicationComponentId +applicationComponentInfos +applicationComponentStrategies +applicationComponentStrategySummary +applicationConfiguration +applicationConfigurationId +applicationCreationDate +applicationDescription +applicationHostUrl +applicationID +applicationIDs +applicationId +applicationImportFailure +applicationImportSuccess +applicationKey +applicationLastUpdateDate +applicationMode +applicationName +applicationNames +applicationPermissions +applicationPort +applicationPreferences +applicationServicePath +applicationState +applicationSummaries +applicationType +applicationUrl +applicationVersion +applicationVersions +applications +applicationsCount +applicationsInfo +appliedRulePriority +appliedScanFilters +appliedStatus +appliedWeights +applyDuringMaintenanceWindow +applyImmediately +applyMethod +applyNormalization +applyType +approvalRule +approvalRuleContent +approvalRuleEventMetadata +approvalRuleId +approvalRuleName +approvalRuleOverriddenEventMetadata +approvalRuleTemplate +approvalRuleTemplateContent +approvalRuleTemplateDescription +approvalRuleTemplateId +approvalRuleTemplateName +approvalRuleTemplateNames +approvalRules +approvalRulesNotSatisfied +approvalRulesSatisfied +approvalState +approvalStateChangedEventMetadata +approvalStatus +approvals +approved +approvedAt +approximateNumberOfObjectsToProcess +approximateSecondsBeforeTimedOut +apps +appsyncDomainName +arch +architecture +architectures +archiveDescription +archiveId +archiveRule +archiveRules +archiveSize +archived +args +arguments +arn +arns +arrayBaseColumnType +arrayJobId +arrayProperties +artifactCredentials +artifactFileName +artifactId +artifactIdentifier +artifactMediaType +artifactName +artifactRevisions +artifactStore +artifactStores +artifactUrl +artifacts +artifactsOverride +artifactsUrl +asOfTimestamp +ascendingOrder +asi +asn +asnOrg +assertionAttributes +assessment +assessmentArn +assessmentControlsCountByNoncompliantEvidence +assessmentDescription +assessmentFrameworkShareRequest +assessmentFrameworkShareRequests +assessmentId +assessmentMetadata +assessmentName +assessmentReport +assessmentReportEvidenceCount +assessmentReportId +assessmentReportSelection +assessmentReportSelectionCount +assessmentReports +assessmentReportsDestination +assessmentRunAgents +assessmentRunArn +assessmentRunArns +assessmentRunArnsTruncated +assessmentRunCount +assessmentRunName +assessmentRuns +assessmentSchedule +assessmentStatus +assessmentSummaries +assessmentSummary +assessmentTargetArn +assessmentTargetArns +assessmentTargetName +assessmentTargetNamePattern +assessmentTargets +assessmentTemplateArn +assessmentTemplateArns +assessmentTemplateName +assessmentTemplates +asset +assetArn +assetAttributes +assetCompositeModelId +assetCompositeModels +assetContent +assetCreationDate +assetDescription +assetHierarchies +assetId +assetIds +assetLastUpdateDate +assetModelArn +assetModelCompositeModelId +assetModelCompositeModels +assetModelCreationDate +assetModelDescription +assetModelHierarchies +assetModelId +assetModelLastUpdateDate +assetModelName +assetModelProperties +assetModelPropertySummaries +assetModelStatus +assetModelSummaries +assetName +assetProperties +assetProperty +assetPropertySummaries +assetPropertyValue +assetPropertyValueHistory +assetRelationshipSummaries +assetSHA256 +assetSizeBytes +assetStatus +assetSummaries +assetType +assets +assignPublicIp +assignedLabel +assignedValue +assistant +assistantArn +assistantAssociation +assistantAssociationArn +assistantAssociationId +assistantAssociationSummaries +assistantId +assistantSummaries +associateDefaultSecurityGroup +associatePublicIpAddress +associatedApplications +associatedAt +associatedClientDevices +associatedEntity +associatedFields +associatedGateway +associatedGatewayId +associatedGatewayOwnerAccount +associatedIntentName +associatedOn +associatedPortalArns +associatedRepositoryNames +associatedResourceCount +associatedResources +associatedS3Resources +associatedServerId +associatedServerIds +associatedSlotName +associatedTranscripts +associatedTranscriptsPassword +associatedTranscriptsUrl +associatedWithJob +association +associationArn +associationBehavior +associationData +associationId +associationState +associationStatus +associationTime +associationTimestamp +associationType +assumedRole +atBlockchainInstant +atRestEncryptionEnabled +ati +atigData +atodr +attachTime +attachedDiskMapping +attachedObjectIdentifier +attachedResource +attachedTo +attachment +attachmentArn +attachmentId +attachmentLinkUrl +attachmentNetworkAclConfiguration +attachmentSet +attachmentSetId +attachmentState +attachmentType +attachments +attachmentsStatus +attemptDurationSeconds +attemptId +attempts +attribute +attributeGroup +attributeGroupArn +attributeGroups +attributeGroupsDetails +attributeKeys +attributeMap +attributeMatchingModel +attributeName +attributePartition +attributePayload +attributeResults +attributeUpdateMode +attributeValue +attributes +auc +audio +audioAndDTMFInputSpecification +audioChunk +audioFileS3Location +audioInput +audioLogSettings +audioRecognitionStrategy +audioSpecification +audioStream +audioVoiceDurationMillis +auditCheckConfigurations +auditCheckToActionsMapping +auditCheckToReasonCodeFilter +auditDetails +auditEvents +auditNotificationTargetConfigurations +auditResults +auditTaskId +auth +authCode +authCodeUrl +authCodeUrls +authDecision +authDefinition +authInfo +authInfos +authKey +authParameters +authRequest +authResults +authTTL +authType +authUrl +authentication +authenticationConfig +authenticationConfiguration +authenticationMethod +authenticationProviders +authenticationType +author +authorArn +authorName +authorization +authorizationApiKeyName +authorizationApiKeyValue +authorizationConfig +authorizationData +authorizationEndpoint +authorizationScopes +authorizationToken +authorizationType +authorized +authorizerArn +authorizerConfig +authorizerCredentials +authorizerDescription +authorizerFunctionArn +authorizerId +authorizerName +authorizerResultTtlInSeconds +authorizerUri +authorizers +autoBranchCreationConfig +autoBranchCreationPatterns +autoCompute +autoEnable +autoEnableNewAccount +autoGenerateForms +autoLaunch +autoMLConfig +autoMLResult +autoMountStatus +autoMounting +autoRegistrationStatus +autoReplicateNewDisks +autoResolve +autoRollbackConfiguration +autoRollbackEnabled +autoScaling +autoScalingConfiguration +autoScalingGroup +autoScalingGroupArn +autoScalingGroupArns +autoScalingGroupName +autoScalingGroupProvider +autoScalingGroupRecommendations +autoScalingGroups +autoScalingMetric +autoSnapshotAddOnRequest +autoSnapshots +autoStartConfiguration +autoStopConfiguration +autoSubDomainCreationPatterns +autoSubDomainIAMRole +autoUpdate +autoUpdateOutdatedInstancesDeploymentIds +autoUpdateOutdatedInstancesRootDeploymentId +automatedDiscoveryFreeTrialStartDate +automaticRenewal +automaticStopTimeMinutes +automaticTerminationMode +automationExecutions +autoprovision +autotrack +auxiliaryApps +availability +availabilityZone +availabilityZoneId +availabilityZoneIds +availabilityZones +available +availableMacSecPortSpeeds +availablePlatforms +availablePortSpeeds +availableProviders +avcLevel +avcProfile +average +awayFrom +awsAccount +awsAccountId +awsAccountIds +awsAccountName +awsAccountNumber +awsAccounts +awsDevice +awsDeviceV2 +awsEc2Instance +awsEcrContainerImage +awsGroundStationAgentEndpoint +awsIamConfig +awsInstanceID +awsIotJobArn +awsIotJobId +awsIotSqlVersion +awsJobAbortConfig +awsJobExecutionsRolloutConfig +awsJobPresignedUrlConfig +awsJobTimeoutConfig +awsLambdaFunction +awsLogicalDeviceId +awsOrganization +awsRegion +awsSecretStoreArn +awsService +awsServices +awsSignerJobId +awsSso +awsvpcConfiguration +azMode +backendDefaults +backendEnvironment +backendEnvironmentArn +backendEnvironments +backends +backfillStatus +backloggedStorageBytes +backupId +backupMode +backupProgressInMegaBytes +backupRetentionEnabled +badge +badgeEnabled +badgeRequestUrl +balance +bandwidth +bandwidthAllocation +bandwidthThrottling +base +baseCapacity +baseCommitId +baseConfigurationItems +baseEjectionDuration +baseModelArn +baseModelArnEquals +baseModelIdentifier +baseModelName +basePath +baseProcessingInstanceType +baseProcessingInstanceVolumeSizeInGB +baseProcessingJob +baseRatePerMinute +baseScore +baseStat +baseTableTTL +basic +basicAuthCredentials +batch +batchDeleteDetectorErrorEntries +batchImports +batchInferenceJob +batchInferenceJobArn +batchInferenceJobConfig +batchInferenceJobs +batchItemId +batchJobDefinitions +batchJobExecutions +batchJobIdentifier +batchMode +batchPolicy +batchPredictions +batchPutMessageErrorEntries +batchReportMode +batchSegmentJob +batchSegmentJobArn +batchSegmentJobs +batchSize +batchUpdateDetectorErrorEntries +beforeBlob +beforeBlobId +beforeCommitId +beforeCommitSpecifier +beforePath +beforeTime +begin +beginDate +beginInclusive +beginOffsetInclusive +behavior +behaviorCriteriaType +behaviorName +behaviors +behindMajor +behindMinor +belongsToFieldOnRelatedModel +bestRecipeArn +bgpPeerId +bgpPeerState +bgpPeers +bgpStatus +bidPercentage +billableDuration +billableEntityCount +billedDurationInMilliseconds +billedMemoryUsedInMB +billedResourceUtilization +billingDetails +billingGroupArn +billingGroupDescription +billingGroupId +billingGroupMetadata +billingGroupName +billingGroupProperties +billingGroups +billingMethod +billingMinutes +binBy +binKeys +binaryMediaTypes +bindIP +bindingEvent +bindingProperties +bindings +bitMaskLength +bitRightShift +blackListedAgents +blackListedConnectors +blobId +blockDeviceMappings +blockHash +blockNumber +blockPublicAccess +blockPublicAcls +blockPublicPolicy +blockers +blocklist +blocksize +blueGreenDeploymentConfiguration +blueprintId +blueprintName +blueprints +bluetooth +body +booleanValue +bootMode +bootstrapServers +botAlias +botAliasHistoryEvents +botAliasId +botAliasLocaleSettings +botAliasName +botAliasStatus +botAliasSummaries +botAliasTarget +botChannelAssociations +botConfiguration +botExportSpecification +botId +botImportSpecification +botLocaleExportPassword +botLocaleExportSpecification +botLocaleExportUrl +botLocaleHistoryEvents +botLocaleImportSpecification +botLocaleStatus +botLocaleSummaries +botMemberAliasId +botMemberAliasName +botMemberId +botMemberName +botMemberVersion +botMembers +botName +botRecommendationId +botRecommendationResults +botRecommendationStatus +botRecommendationSummaries +botResponseAudioVoiceId +botResponses +botStatus +botSummaries +botTags +botType +botVersion +botVersionLocaleSpecification +botVersionSummaries +botVersions +bots +bpaImpactsLightsail +branch +branchArn +branchCoveragePercentage +branchFilter +branchName +branches +branchesCovered +branchesMissed +breachAction +breakingChanges +browserPolicy +browserSettings +browserSettingsArn +browserType +bucket +bucketAclGrants +bucketArn +bucketCount +bucketCountByEffectivePermission +bucketCountByEncryptionType +bucketCountByObjectEncryptionRequirement +bucketCountBySharedAccessType +bucketCreatedAt +bucketCriteria +bucketDefinitions +bucketKey +bucketLevelPermissions +bucketName +bucketNames +bucketOwner +bucketOwnerAccess +bucketPolicy +bucketPrefix +bucketPublicAccessBlock +bucketStatisticsBySensitivity +buckets +bucketsAggregationType +build +buildBatch +buildBatchArn +buildBatchConfig +buildBatchConfigOverride +buildBatchNumber +buildBatchStatus +buildBatches +buildBatchesNotFound +buildComplete +buildGroups +buildNumber +buildSpec +buildStatus +buildStatusConfig +buildStatusConfigOverride +buildTimeoutInMinutes +buildTimeoutInMinutesOverride +buildType +builds +buildsDeleted +buildsNotDeleted +buildsNotFound +buildspec +buildspecOverride +builtInIntentSummaries +builtInSlotTypeSummaries +bundleId +bundleInformation +bundleList +bundleNames +bundleType +bundles +burstLimit +businessGoals +businessUnitId +buttons +byCustomizationType +byInferenceType +byName +byOutputModality +byProvider +byteBuffer +byteLength +bytes +bytesProcessed +bytesReceived +bytesScanned +bytesSent +bytesWritten +caCertificate +caCertificateId +caCertificateIdentifier +caCertificatePem +cache +cacheAtStartup +cacheBehaviorSettings +cacheBehaviors +cacheClusterEnabled +cacheClusterSize +cacheClusterStatus +cacheConfigurations +cacheDataEncrypted +cacheKeyParameters +cacheNamespace +cacheOverride +cacheStorageConfigurations +cacheTtlInSeconds +cacheType +cachedHTTPMethods +cachingConfig +cachingEnabled +cachingKeys +cak +callbackOverrides +callerReactions +campaign +campaignArn +campaignConfig +campaignId +campaignIds +campaignName +campaignSummaries +campaignSummaryList +campaigns +canDbcFiles +canInterface +canRetry +canSignal +canUnlinkAssociatedModel +canUpdateImage +canUseAsDestination +canUseAsSource +canaryInterval +canaryPercentage +canarySettings +cancel +cancelActive +cancelRequested +cancelTimerDecisionAttributes +cancelTimerFailedEventAttributes +cancelWorkflowExecutionDecisionAttributes +cancelWorkflowExecutionFailedEventAttributes +canceled +canceledChecks +canceledFindingsCount +cancellationStatus +cancelled +cannedAcl +capabilities +capabilityArn +capabilityArns +capabilityConfiguration +capabilityList +capabilityNamespace +capabilitySyncStatus +capacity +capacityConfiguration +capacityId +capacityLimits +capacityProvider +capacityProviderArn +capacityProviderName +capacityProviderStrategy +capacityProviders +capacitySpecification +capacitySpecificationOverride +capacityType +captureConditional +captureNextStep +captureResponse +cardinality +carrier +caseArn +caseData +caseId +caseIdList +caseSensitive +cases +catalogData +catalogType +categoricalHyperParameterRanges +categories +categoriesWithMostFindings +category +categoryCode +categoryName +categorySpecificSummary +cause +causedBy +causedByEventId +ccEmailAddresses +cellReference +cells +cellsToCreate +cellsToUpdate +centerFrequency +certKey +certificate +certificateAlternativeNames +certificateArn +certificateAuthority +certificateAuthorityArn +certificateAuthorityArns +certificateBody +certificateChain +certificateData +certificateDescription +certificateDetail +certificateDomainName +certificateHashes +certificateId +certificateList +certificateMode +certificateName +certificateOverride +certificatePathOnDevice +certificatePem +certificatePrivateKey +certificateSigningRequest +certificateStatuses +certificateUploadDate +certificateVerificationDNSRecord +certificates +certificatesToAdd +certificatesToDelete +cfnStackName +change +changeDescription +changeIdentifier +changeLogs +changeRequests +changeType +changesetArn +changesetFormat +changesetId +changesets +channel +channelArn +channelId +channelMessages +channelName +channelRoleArn +channelStorage +channelSummaries +channels +chatChannel +checkCompliant +checkId +checkIds +checkName +checkRunStatus +checkpointConfig +checkpointLabel +checkpointLabelFilter +checks +checksum +childAssetId +childAssetModelId +childConnectionTags +childDirected +childPolicy +childWorkflowExecutionCanceledEventAttributes +childWorkflowExecutionCompletedEventAttributes +childWorkflowExecutionFailedEventAttributes +childWorkflowExecutionStartedEventAttributes +childWorkflowExecutionTerminatedEventAttributes +childWorkflowExecutionTimedOutEventAttributes +children +chop +chronologicalOrder +cidr +cidrBlock +cidrListAliases +cidrs +ciphers +ciphertext +cisaData +city +ckn +claims +clarificationPrompt +className +classes +classifiableObjectCount +classifiableSizeInBytes +classification +classificationDetails +classificationError +classificationResultStatus +classificationScopeId +classificationScopes +classificationType +classificationTypeUpdate +clean +clear +clearMaxDevices +clearResiliencyPolicyArn +clearTimer +clientAliases +clientCertificateId +clientCredentialsArn +clientId +clientIdIssuedAt +clientIds +clientMode +clientName +clientNumber +clientPolicy +clientProperties +clientRequestToken +clientSecret +clientSecretExpiresAt +clientSideTimestamps +clientStatus +clientTimestampMillis +clientToken +clientType +clipboardMode +clock +cloneFrom +cloneUrlHttp +cloneUrlSsh +closeStatus +closeStatusFilter +closeTimeFilter +closeTimestamp +closedFindings +closingResponse +cloudFormationStackRecords +cloudFormationTarget +cloudMetricEnabled +cloudTrailArn +cloudTrailDetails +cloudTrailProperties +cloudWatch +cloudWatchConfig +cloudWatchEncryptionEnabled +cloudWatchLogDelivery +cloudWatchLogGroupArn +cloudWatchLogGroupName +cloudWatchLoggingConfiguration +cloudWatchLogs +cloudWatchLogsArn +cloudWatchLogsConfiguration +cloudWatchLogsLogGroup +cloudWatchLogsRoleArn +cloudWatchMonitoringConfiguration +cloudwatchAlarm +cloudwatchLogUrl +cloudwatchLogs +cloudwatchMetric +cloudwatchRoleArn +cluster +clusterArn +clusterArns +clusterCreationTime +clusterDescription +clusterEndpoint +clusterIdentifier +clusterLogging +clusterName +clusterSecurityGroupId +clusterType +clusterVersion +clusteringKeys +clusters +code +codeArtifactId +codeCommit +codeCoverageSummary +codeCoverages +codeErrors +codeHook +codeHookInterfaceVersion +codeHookSpecification +codeSha256 +codeSigning +codeSnippet +codeSnippetResults +codeVulnerabilityDetails +codeVulnerabilityDetectorName +codeVulnerabilityDetectorTags +codeVulnerabilityFilePath +codebuildRoleArn +codec +codegenJobToCreate +cognitoIdentityPoolId +collaboration +collaborationAnalysisTemplate +collaborationAnalysisTemplateSummaries +collaborationAnalysisTemplates +collaborationArn +collaborationCreatorAccountId +collaborationCreatorDisplayName +collaborationId +collaborationIdentifier +collaborationList +collaborationName +collectionBindingProperties +collectionDetails +collectionEndpoint +collectionErrorDetails +collectionFilters +collectionProperties +collectionScheme +collectionStatus +collectionSummaries +collectorHealth +collectorId +collectorVersion +column +columnCount +columnDefault +columnDescription +columnDescriptions +columnIds +columnIndex +columnMap +columnMetadata +columnName +columnNames +columns +combineArtifacts +command +commandLineArguments +comment +commentBody +commentId +comments +commentsForComparedCommitData +commentsForPullRequestData +commit +commitId +commitIds +commitMessage +commitNum +commitSpecifier +commitTime +commitTimestampInMillis +commitment +commitmentConfiguration +commitmentDuration +commitmentExpirationTime +commitmentInformation +commitmentLength +commits +committer +commonName +communicationBody +communicationTypes +communications +company +comparator +comparison +comparisonOperator +compatibilities +compatible +compatibleDevices +compatibleEnvironmentTemplates +compatibleNamespaceVersion +complete +completeTime +completeWorkflowExecutionDecisionAttributes +completeWorkflowExecutionFailedEventAttributes +completed +completedAt +completedJobs +completedOn +completedSteps +completedTime +completionStatus +completionTime +completionTimeRange +compliance +complianceCheck +complianceDrifts +complianceStatus +complianceType +compliantChecks +compliantEvidenceCount +component +componentArn +componentBuildVersionArn +componentCandidates +componentCompliances +componentDependencies +componentId +componentLambdaParameters +componentName +componentPlatforms +componentRecommendations +componentRoleArn +componentState +componentStatuses +componentSummaryList +componentToCreate +componentType +componentTypeId +componentTypeName +componentTypeSummaries +componentUpdatePolicy +componentUpdates +componentVersion +componentVersionArn +componentVersionList +componentVersions +components +compositeModel +compositeSlotTypeSetting +compressed +compression +compressionType +compute +computeEnvironment +computeEnvironmentArn +computeEnvironmentName +computeEnvironmentOrder +computeEnvironments +computeLocation +computePlatform +computeReservation +computeResources +computeType +computeTypeOverride +computeTypesAllowed +computedDesiredCount +computerAttributes +concat +conclusionStatement +concurrentBuildLimit +concurrentDeploymentPercentage +condition +conditionLanguageVersion +conditional +conditionalBranches +confidence +confidenceLevel +config +configArn +configData +configDetails +configFileName +configHistoryDeliveryInfo +configId +configList +configParameters +configRecommendations +configSnapshotDeliveryInfo +configSnapshotDeliveryProperties +configSnapshotId +configStreamDeliveryInfo +configType +configVersion +configuration +configurationId +configurationIds +configurationItemCaptureTime +configurationItemMD5Hash +configurationItemStatus +configurationItems +configurationOptions +configurationOverrides +configurationProfileId +configurationProperties +configurationSchema +configurationStateId +configurationStatus +configurationSummary +configurationType +configurationUpdate +configurationUrl +configurationValidationPolicy +configurationValues +configurations +configurationsDownloadUrl +configureOnly +configureScript +configureScriptType +configured +configuredBy +configuredTable +configuredTableArn +configuredTableAssociation +configuredTableAssociationIdentifier +configuredTableAssociationSummaries +configuredTableId +configuredTableIdentifier +configuredTableSummaries +confirmationConditional +confirmationNextStep +confirmationPrompt +confirmationResponse +confirmationState +confirmationStatus +confirmationToken +confirmationUrl +conflictDetailLevel +conflictDetection +conflictHandler +conflictMetadata +conflictMetadataList +conflictResolution +conflictResolutionStrategy +conflicts +connectContactFlowId +connectInstanceConfig +connectInstanceId +connectInstanceOnboardingJobStatus +connectQueueId +connectSourcePhoneNumber +connected +connectedToSystemTime +connectionArn +connectionId +connectionMode +connectionName +connectionPool +connectionState +connectionType +connections +connectionsBandwidth +connectionsCount +connectivity +connectivityAt +connectivityInfo +connectorArn +connectorConfig +connectorConfiguration +connectorConfigurations +connectorDescription +connectorEntityFields +connectorEntityMap +connectorEntityName +connectorId +connectorLabel +connectorList +connectorMetadata +connectorModes +connectorName +connectorNamePrefix +connectorOperator +connectorOwner +connectorProfileArn +connectorProfileConfig +connectorProfileCredentials +connectorProfileDetails +connectorProfileName +connectorProfileNames +connectorProfileProperties +connectorProvisioningConfig +connectorProvisioningType +connectorRuntimeSettings +connectorState +connectorSummary +connectorSuppliedValueOptions +connectorSuppliedValues +connectorType +connectorTypes +connectorVersion +connectors +consecutiveDatapointsToAlarm +consecutiveDatapointsToClear +consoleUrl +constraints +contactArn +contactEndpoint +contactId +contactList +contactMethods +contactPostPassDurationSeconds +contactPrePassDurationSeconds +contactProtocols +contactStatus +container +containerAction +containerArn +containerConfigurations +containerDefinitions +containerDistributionConfiguration +containerImage +containerImages +containerInstance +containerInstanceArn +containerInstanceArns +containerInstances +containerLogRotationConfiguration +containerName +containerOrchestrationType +containerOverrides +containerParams +containerPath +containerPort +containerPortRange +containerProperties +containerProvider +containerProviderId +containerProviderType +containerRecipe +containerRecipeArn +containerRecipeSummaryList +containerRecommendations +containerService +containerServiceName +containerServices +containerTags +containerType +containers +contains +containsDataFromDeletedResources +content +contentArn +contentConflict +contentDeliveryRules +contentDisposition +contentEncoding +contentExpression +contentHandling +contentId +contentLength +contentLocation +contentRange +contentReference +contentSummaries +contentSummary +contentType +contents +context +contextAttributes +contextRowId +contexts +continentCode +continuationToken +continueAfterTimeout +continueAsNewWorkflowExecutionDecisionAttributes +continueAsNewWorkflowExecutionFailedEventAttributes +continueResponse +continuedExecutionRunId +continuous +continuousHyperParameterRanges +contractAddress +control +controlDomainId +controlDomainInsights +controlId +controlIdentifier +controlInsightsByAssessment +controlInsightsMetadata +controlMappingSources +controlMetadataList +controlName +controlOperation +controlPlaneInstanceType +controlPlanePlacement +controlSet +controlSetId +controlSetName +controlSets +controlSetsCount +controlSources +controlStatus +controlTreatmentName +controlType +controls +controlsCount +controlsCountByNoncompliantEvidence +conversationDurationSeconds +conversationEndState +conversationEndTime +conversationId +conversationLevelResult +conversationLevelTestResults +conversationLevelTestResultsFilterBy +conversationLogSettings +conversationLogs +conversationLogsDataSource +conversationMode +conversationStartTime +conversionProperties +conversionServerID +cookieSynchronizationConfiguration +cookiesAllowList +copyAllowed +copyImageSetInformation +copyPrivateIp +copyTags +coreCount +coreDeviceExecutionStatus +coreDeviceThingName +coreDevices +coreVersion +cores +correlationData +cors +cost +costEstimates +costOptimizing +count +counters +countersToAggregate +country +countryCode +counts +countsByGroup +coveredResources +cpiSecretKey +cpiUserId +cpiUserPassword +cpiUsername +cpu +cpuArchitecture +cpuCount +cpuOptions +cpuPerformanceMetricBasis +cpuUtilizationPercentage +cpuVendorArchitectures +cpus +cr +crawlerArn +crawlerConfiguration +createCollectionDetail +createDate +createDelegationRequest +createDelegationRequests +createPublicIP +createSimulationJobRequests +createStatus +createTime +createTimeRange +createTimestamp +createVersion +createVpcEndpointDetail +created +createdAfter +createdAt +createdAtAfter +createdAtBefore +createdBefore +createdBy +createdCount +createdDate +createdOn +createdReason +createdRequestCount +createdRequests +createdRows +createdTime +createdTimeStamp +createdTimestamp +creationDate +creationDateTime +creationTime +creationTimeAfter +creationTimeBefore +creationTimeInMillis +creationTimeRange +creationTimestamp +creationType +creator +creatorAccountId +creatorDisplayName +creatorId +creatorMemberAbilities +credential +credentialDurationSeconds +credentialProvider +credentialSpecs +credentialType +credentials +credentialsArn +credentialsMap +credentialsParameter +criteria +criteriaList +criterion +critical +crl +crlArn +crlData +crlId +crls +crossAccountRoleArns +csv +csvIndexToVariableMap +csvInputTemplate +cta +cumulativeGasUsed +currencies +currency +currencyCode +current +currentApplicationVersion +currentApplyDate +currentAttemptCount +currentBackupRateInMegaBytesPerSecond +currentBuildSummary +currentConfiguration +currentDeployment +currentDeploymentGroupName +currentEphemeris +currentInstanceGpuInfo +currentInstanceType +currentLabel +currentLicenseConfiguration +currentMemorySize +currentPerformanceRisk +currentPerformanceRiskRatings +currentPhase +currentPlan +currentPricingPlan +currentProgress +currentRevision +currentRevisionId +currentRpoInSecs +currentRtoInSecs +currentServiceConfiguration +currentVersion +cursor +custom +customAuthConfigs +customAuthenticationType +customCodeSigning +customControlsCount +customDNSConfiguration +customDNSServerIP +customDNSServerName +customData +customDataIdentifierId +customDataIdentifierIds +customDataIdentifiers +customDomainName +customDomains +customFields +customHeaders +customImageName +customModelArn +customModelKmsKeyId +customModelName +customModelTags +customModelTrainingParameters +customModelTransformParameters +customPayload +customPlugin +customPluginArn +customPluginState +customPlugins +customProperties +customRules +customVocabularyExportSpecification +customVocabularyImportSpecification +customVocabularyItemList +customVocabularyItems +customVocabularyStatus +customerAccountId +customerAction +customerAddress +customerArtifactPaths +customerDefinedValues +customerId +customerManaged +customerManagedKey +customerManagedKeyArn +customerManagedKeyIdentifier +customerManagedS3 +customerManagedS3Storage +customerRouterConfig +customerVersion +customizationsSupported +cvss +cvss2 +cvss3 +cvssSource +cwes +dailyReportsOnly +dailySchedule +dashboardArn +dashboardCreationDate +dashboardDefinition +dashboardDescription +dashboardEndpoint +dashboardId +dashboardLastUpdateDate +dashboardName +dashboardSummaries +dashboardValidationMessages +data +dataAccessRoleArn +dataApiRoleArn +dataBundles +dataCharacterEncoding +dataCollected +dataCollectionDetails +dataCollectionStatus +dataDelivery +dataDestinationConfigs +dataEncryptionMetadata +dataExtraDimensions +dataFormat +dataItems +dataLakeArn +dataLakeSources +dataLakes +dataLocation +dataLocationConstraint +dataPlaneRouting +dataPrivacy +dataProcessingJobId +dataProtectionStatus +dataPullEndTime +dataPullMode +dataPullStartTime +dataReplicationError +dataReplicationInfo +dataReplicationInitiation +dataReplicationState +dataSet +dataSetImportTasks +dataSetName +dataSetOrg +dataSetPublicationDate +dataSetRequestId +dataSetType +dataSets +dataSize +dataSource +dataSourceArn +dataSourceConfig +dataSourceName +dataSourceNames +dataSourceType +dataSourceUrl +dataSources +dataTimestamp +dataTraceEnabled +dataTransferApi +dataTransferApis +dataType +dataTypeName +dataTypeSpec +dataTypeValue +dataURI +dataValidationMetrics +dataViewArn +dataViewId +dataViews +database +databaseArn +databaseConfigDetail +databaseManagementPreference +databaseMigrationPreference +databaseName +databasePreferences +databaseUrl +databases +datacenterName +dataflowDestinationRegion +dataflowEdges +dataflowEndpointGroupArn +dataflowEndpointGroupId +dataflowEndpointGroupList +dataflowEndpointName +dataflowEndpointRegion +dataflowId +dataflowList +dataflowSourceRegion +datakey +datapointsCollectionPercentage +datapointsToAlarm +dataset +datasetArn +datasetContentSummaries +datasetContentVersionValue +datasetDescription +datasetExportJob +datasetExportJobArn +datasetExportJobs +datasetGroup +datasetGroupArn +datasetGroups +datasetId +datasetImportJob +datasetImportJobArn +datasetImportJobs +datasetName +datasetOrg +datasetPermissions +datasetSummaries +datasetTitle +datasetType +datasets +datastore +datastoreArn +datastoreId +datastoreName +datastorePartitions +datastoreProperties +datastoreStatus +datastoreStorage +datastoreSummaries +datasyncErrorCode +date +dateAdded +dateCreated +dateDue +dateLastRun +dateNextRun +dateRangeFilter +dateUpdated +datesWithoutSupport +datetimeTypeFieldName +dayOfMonth +dayOfWeek +days +dbClusterIdentifier +dbClusterOrInstanceArn +dbConnectionId +dbEngineVersion +dbName +dbPassword +dbPath +dbPaths +dbUser +debugSession +debugSessionEnabled +decimalReturnType +decision +decisionTaskCompletedEventAttributes +decisionTaskCompletedEventId +decisionTaskScheduledEventAttributes +decisionTaskStartedEventAttributes +decisionTaskTimedOutEventAttributes +decisionType +decisions +declinationConditional +declinationNextStep +declinationResponse +decodeConfig +decoderManifestArn +decryptionError +dedicatedServiceAccountId +dedupeString +deepLink +defaultAction +defaultAssessmentReportsDestination +defaultAttributes +defaultAuthorizerName +defaultBranch +defaultBranchName +defaultCacheBehavior +defaultCapacityProviderStrategy +defaultChecked +defaultChildPolicy +defaultClientId +defaultCountryCode +defaultDevices +defaultDisplayVersion +defaultDomain +defaultExecutionStartToCloseTimeout +defaultExportDestination +defaultFormat +defaultGateway +defaultHyperParameterRanges +defaultHyperParameters +defaultIamRoleArn +defaultJobTimeoutMinutes +defaultLambdaRole +defaultLargeStagingDiskType +defaultLayout +defaultLogLevel +defaultParameters +defaultPrefix +defaultProcessOwners +defaultRegistryAlias +defaultResourceConfig +defaultResponse +defaultResultConfiguration +defaultServerSideEncryption +defaultTTL +defaultTargetHostname +defaultTaskHeartbeatTimeout +defaultTaskList +defaultTaskPriority +defaultTaskScheduleToCloseTimeout +defaultTaskScheduleToStartTimeout +defaultTaskStartToCloseTimeout +defaultTimeToLive +defaultValue +defaultValueList +defaultValueSpec +defaultValueSpecification +defaultVariation +defaultVersion +defaultVersionId +defaultVersionName +definedIn +definition +definitionContent +definitionUri +definitionZip +delayInSeconds +delegatedAdmin +delegatedAdminAccount +delegatedAdminAccountId +delegatedAdminAccounts +delegationId +delegationIds +delegations +delete +deleteAdditionalMetricsToRetain +deleteAlertTargets +deleteAuditHistory +deleteBehaviors +deleteCollectionDetail +deleteFiles +deleteOnTermination +deletePipelineProvisioningRepository +deleteReports +deleteResources +deleteScheduledAudits +deleteStack +deleteStream +deleteVpcEndpointDetail +deleted +deletedAt +deletedBranch +deletedPackage +deletedResources +deletes +deletionCharacter +deletionProtected +delimitedTextOptions +delimiter +deliveryChannelName +deliveryFrequency +deliveryStream +deliveryStreamName +deltaSyncConfig +deltaSyncTableName +deltaSyncTableTTL +deltaTime +deltaTimeSessionWindowConfiguration +demodulationConfig +denied +deniesUnencryptedObjectUploads +denyListedAgentlessCollectors +denyListedMeCollectors +dependencies +dependencyType +dependsOn +dependsOnAlarms +deployAsNew +deployed +deployedVersion +deployment +deploymentApplicationConfigs +deploymentArtifacts +deploymentCircuitBreaker +deploymentConfig +deploymentConfigId +deploymentConfigInfo +deploymentConfigName +deploymentConfigsList +deploymentConfiguration +deploymentController +deploymentDetail +deploymentFinishTime +deploymentGroupId +deploymentGroupInfo +deploymentGroupName +deploymentGroupNames +deploymentGroups +deploymentGroupsInfo +deploymentId +deploymentIds +deploymentInfo +deploymentJobs +deploymentName +deploymentOption +deploymentOverview +deploymentPolicies +deploymentReadyOption +deploymentStartTime +deploymentStatus +deploymentStatusMessage +deploymentStatusMessages +deploymentStrategy +deploymentStyle +deploymentTarget +deploymentTargetType +deploymentTargets +deploymentType +deploymentWaitType +deployments +deploymentsInfo +deprecateExistingEntities +deprecated +deprecationDate +deprecationMessage +deregisterTime +deregisteredAt +deregistrationPolicy +descending +description +descriptions +descriptiveText +desiredCapacity +desiredChange +desiredCount +desiredModelArn +desiredModelId +desiredModelUnits +desiredProvisionedModelName +desiredSize +desiredState +desiredStatus +desiredvCpus +destination +destinationAccessToken +destinationAccount +destinationArn +destinationBranch +destinationCommit +destinationCommitId +destinationCommitSpecifier +destinationConfig +destinationConfiguration +destinationConnectionState +destinationConnectorLabel +destinationConnectorProperties +destinationConnectorType +destinationField +destinationFlowConfigList +destinationImageSet +destinationImageSetProperties +destinationInfo +destinationName +destinationOptions +destinationPackageVersions +destinationPath +destinationPort +destinationPrefix +destinationProperties +destinationReference +destinationRegion +destinationRepository +destinationS3BucketName +destinationS3Location +destinationS3Prefix +destinationServerId +destinationSummaries +destinationTableId +destinationType +destinationTypeParams +destinationTypeProperties +destinations +detachedObjectIdentifier +detail +detailedMessage +detailedResultsLocation +details +detailsMap +detectSentiment +detectionPlatforms +detections +detector +detectorDebugOptions +detectorId +detectorModel +detectorModelArn +detectorModelConfiguration +detectorModelDefinition +detectorModelDescription +detectorModelName +detectorModelSummaries +detectorModelVersion +detectorModelVersionSummaries +detectorName +detectorSummaries +detectorTags +detectorVersion +detectorVersionId +detectorVersionStatus +detectorVersionSummaries +detectors +determiningPolicies +devEnvironmentId +device +deviceArn +deviceCapabilities +deviceCapacities +deviceCertificateArn +deviceCertificateId +deviceCode +deviceConfig +deviceDefender +deviceDefenderIndexingMode +deviceHostPaths +deviceId +deviceIdentifier +deviceIdentifierArn +deviceIdentifiers +deviceInstance +deviceInstances +deviceMinutes +deviceName +deviceParameters +devicePermissionRoleArn +devicePool +devicePoolArn +devicePools +deviceQueueInfo +deviceRegistryEnrich +deviceRoleArn +deviceSelectionConfiguration +deviceSelectionResult +deviceShadowEnrich +deviceState +deviceStatus +deviceTemplateName +deviceTemplates +deviceType +deviceUdid +devices +dfeQueryEngine +diagnostics +diagnosticsMode +dialRequests +dialerConfig +dialingCapacity +dialogAction +dialogActionType +dialogCodeHook +dialogState +diffType +differences +digest +dimensionColumns +dimensionName +dimensionNames +dimensionValueOperator +dimensions +directConnectGateway +directConnectGatewayAssociation +directConnectGatewayAssociationProposal +directConnectGatewayAssociationProposals +directConnectGatewayAssociations +directConnectGatewayAttachments +directConnectGatewayId +directConnectGatewayName +directConnectGatewayOwnerAccount +directConnectGatewayState +directConnectGateways +direction +directory +directoryId +directoryName +directoryType +disableActionConfiguration +disableActionRequests +disableAllLogs +disableBackupRetention +disableEmailNotification +disableExecuteApiEndpoint +disableNetworking +disablePlayback +disableSSO +disabledAt +disabledOnInitialization +disabledReason +disassociatedAt +disassociatedDataStorage +disassociatedRepositoryNames +disconnectAfterInSeconds +disconnectReason +disconnectTimeoutInMinutes +discoveredIntentCount +discoveredSlotTypeCount +discoveryArn +discoveryData +discoveryName +discoveryUrl +disk +diskImageFormat +diskName +diskPath +diskSize +diskSizeInGb +diskSnapshot +diskSnapshotInfo +diskSnapshotName +diskSnapshots +disks +display +displayAs +displayId +displayName +displayValue +disruptionScore +distinctOutgoingEdgeLabels +distinctUsers +distribution +distributionConfiguration +distributionConfigurationArn +distributionConfigurationSummaryList +distributionDomainName +distributionHostedZoneId +distributionName +distributions +dns +dnsEntry +dnsIpAddresses +dnsName +dnsPolicy +dnsRecord +dnsRecordCreationState +dnsSearchDomains +dnsServers +dnsStatus +dockerLabels +dockerSecurityOptions +dockerURI +dockerVersion +dockerVolumeConfiguration +dockerfileTemplateData +dockerfileTemplateUri +docs +document +documentIdentifier +documentName +documentParameters +documentSource +documentType +documentVersion +documentation +documentationPartId +documentationVersion +documents +domain +domainArn +domainAssociation +domainAssociationArn +domainAssociations +domainConfigurationArn +domainConfigurationName +domainConfigurationStatus +domainConfigurations +domainDetails +domainEntries +domainEntry +domainEntryPoint +domainId +domainInfo +domainInfos +domainName +domainNameConfig +domainNameConfigs +domainNameStatus +domainNameStatusMessage +domainOwner +domainStatus +domainType +domainValidationOptions +domainValidationRecords +domains +doubleValue +downlinkBandwidthBits +downlinkDelayMs +downlinkJitterMs +downlinkLossPercent +downloadAllowed +downloadArtifactsUrl +downloadConditionFile +downloadUrl +driftStatus +driftType +driver +driverOpts +drop +dryRun +dtcRequestIntervalSeconds +dtmfSpecification +duration +durationExpression +durationInMinutes +durationInNanoSeconds +durationInSeconds +durationRange +durationSeconds +durations +dynamicParameters +dynamoDB +dynamoDBv2 +dynamodb +dynamodbConfig +eTag +earlierTime +earliestRestorableTimestamp +ebs +ebsEncryption +ebsEncryptionKeyArn +ebsSnapshots +ebsVolumeID +ec2 +ec2Configuration +ec2ImageId +ec2InstanceFamily +ec2InstanceID +ec2InstanceId +ec2InstanceImageId +ec2InstanceState +ec2InstanceSubnetId +ec2InstanceTags +ec2InstanceType +ec2InstanceTypes +ec2InstanceVpcId +ec2KeyName +ec2KeyPair +ec2LaunchTemplateID +ec2ScanStatus +ec2SecurityGroupIds +ec2SshKey +ec2SubnetIds +ec2TagFilters +ec2TagSet +ec2TagSetList +ecr +ecrConfiguration +ecrImage +ecrImageArchitecture +ecrImageHash +ecrImagePullerRole +ecrImagePushedAt +ecrImageRegistry +ecrImageRepositoryName +ecrImageTags +ecrRepository +ecrRepositoryName +ecrRepositoryPrefix +ecrRepositoryPrefixes +ecsClusterArn +ecsServiceRecommendations +ecsServices +ecsTarget +edgeLabels +edgeProperties +edgeStructures +editContent +editor +effect +effectiveDateTime +effectiveDeployments +effectiveGasPrice +effectiveOn +effectivePermission +effectivePolicies +effectiveRecommendationPreferences +effectiveSettings +effectiveTime +efsVolumeConfiguration +egressAddress +egressFilter +eksAttempts +eksClusterArn +eksConfiguration +eksProperties +eksPropertiesOverride +eksSourceClusterNamespace +eksSourceName +eksSourceNames +eksSources +elapsed +elapsedReplicationDuration +elapsedTimeInSeconds +elasticsearch +elasticsearchConfig +elbInfoList +element +elements +elevation +elevationReference +elevationUnit +elicitationCodeHook +eligibleToRenew +else +email +emailAddress +emailConfigurations +embed +embeddingDataDeliveryEnabled +emoji +emptyDir +enable +enableActionConfiguration +enableActionRequests +enableAnswerMachineDetection +enableAutoBranchCreation +enableAutoBuild +enableAutoSubDomain +enableBackupRetention +enableBasicAuth +enableBranchAutoBuild +enableBranchAutoDeletion +enableCachingForHttp +enableCodeHookInvocation +enableDynamicFieldUpdate +enableECSManagedTags +enableExecuteCommand +enableIoTLoggingParams +enableManagedSpotTraining +enableMapAutoTagging +enableModelImprovements +enableNotification +enableObjectVersioning +enableOnPublicIp +enablePerformanceMode +enablePullRequestPreview +enableSiteLink +enabled +enabledControls +enablementStatus +encodedInputTranscript +encodedMessage +encoder +encoding +encodings +encrypted +encryptionAlgorithm +encryptionAlgorithmOptions +encryptionConfig +encryptionConfiguration +encryptionContextEquals +encryptionContextSubset +encryptionDisabled +encryptionKey +encryptionKeyArn +encryptionKeyOverride +encryptionMode +encryptionSetting +encryptionSpecification +encryptionSpecificationOverride +encryptionStatus +encryptionType +end +endAt +endBehavior +endCharOffset +endCharacter +endDate +endDateTime +endInclusive +endLine +endOffsetExclusive +endTime +endTimeAfter +endTimeBefore +endTimeInSeconds +endTimeOffsetInNanos +endTimeoutMs +endTimes +endToEndResult +endToEndResultCounts +ended +endedAt +endedTime +endpoint +endpointAddress +endpointArn +endpointConfig +endpointConfiguration +endpointCreateTime +endpointDetails +endpointIdentifier +endpointName +endpointPrivateAccess +endpointPublicAccess +endpointStatus +endpointType +endpoints +endpointsDetails +enforce +engagements +engine +engineDescription +engineType +engineVersion +engineVersionDescription +engineVersions +enhancedFindings +enhancedImageMetadataEnabled +enhancedInfrastructureMetrics +enhancedVpcRouting +entities +entitiesPath +entity +entityAggregates +entityArn +entityArns +entityId +entityIdKey +entityName +entityOverrides +entityPropertyReference +entitySummaries +entityType +entityTypes +entityUrl +entityUrlTemplate +entityValue +entityValues +entries +entry +entryId +entryName +entryPoint +entryPointArguments +enumerationValues +enums +env +environment +environmentAccountConnection +environmentAccountConnectionId +environmentAccountConnections +environmentAccountId +environmentArn +environmentFiles +environmentId +environmentIds +environmentName +environmentTemplate +environmentTemplateVersion +environmentTemplates +environmentTypeOverride +environmentUrl +environmentVariables +environmentVariablesOverride +environments +ephemeralStorage +ephemerides +ephemeris +ephemerisData +ephemerisId +epoch +epss +epssScore +eq +eqExactMatch +error +errorAction +errorCategory +errorCode +errorData +errorDateTime +errorDescription +errorDetails +errorEntries +errorHandlingConfig +errorId +errorInfo +errorInformation +errorMessage +errorName +errorReason +errorReportLocation +errorStack +errorStackTrace +errorTimestamp +errorType +errorTypes +error_description +errored +errors +errorsAndFailedEntriesZip +errorsPerPage +escape +escapeQuotes +essential +estimatedCost +estimatedCostTier +estimatedMinutesRemaining +estimatedMonthlyCost +estimatedMonthlySavings +estimatedOn +estimatedPercentMonthlySavings +estimatedSecondsToCompletion +estimatedSizeInBytes +estimatedTimeRemainingSeconds +etaDateTime +etag +eula +eulaAcceptanceId +eulaAcceptances +eulaId +eulaIds +eulas +evaluateExpressions +evaluateOnExit +evaluated +evaluatedExpression +evaluatedExternalModels +evaluatedModelVersions +evaluation +evaluationContext +evaluationMethod +evaluationOrder +evaluationPeriods +evaluationResult +evaluationRules +evaluationScore +evaluationStrategy +evaluations +event +eventAggregates +eventArn +eventArns +eventAttributionSource +eventBridge +eventBridgeConfig +eventBridgeEnabled +eventBusArn +eventCategories +eventCategory +eventClasses +eventConfigurations +eventCount +eventData +eventDataChecksum +eventDataSizeInBytes +eventDataStoreArn +eventDate +eventDescription +eventID +eventId +eventIngestion +eventList +eventMessage +eventMetadata +eventName +eventNumber +eventOrchestration +eventPattern +eventPredictionSummaries +eventPublishers +eventReason +eventReferences +eventResourceData +eventResults +eventScopeCode +eventSource +eventSources +eventStatusCodes +eventSubscriptions +eventSummaries +eventTime +eventTimestamp +eventTracker +eventTrackerArn +eventTrackers +eventType +eventTypeCategories +eventTypeCategory +eventTypeCode +eventTypeCodes +eventTypeName +eventTypes +eventUpdatedTime +eventValue +eventValueThreshold +eventVariableName +eventVariableNames +eventVariables +eventVersion +events +eventsDeletionStatus +evidence +evidenceAwsAccountId +evidenceAwsServiceSourceCount +evidenceByType +evidenceByTypeComplianceCheckCount +evidenceByTypeComplianceCheckIssuesCount +evidenceByTypeConfigurationDataCount +evidenceByTypeManualCount +evidenceByTypeUserActivityCount +evidenceCount +evidenceDetail +evidenceFileName +evidenceFinderEnabled +evidenceFinderEnablement +evidenceFolder +evidenceFolderId +evidenceFolders +evidenceId +evidenceIds +evidenceInsights +evidenceResourcesIncludedCount +evidenceRule +evidenceSources +evidences +exact +example +exampleReference +exception +exceptionMessage +exceptionName +exceptionTimeToLive +exceptions +excerpt +excludeAppPackagesFromCleanup +excludeMatchedPattern +excludeProperties +excludeReason +excludeVerboseContent +excluded +excludedDatasetColumns +excludedInstanceTypes +excludes +exclusionArns +exclusionByResourceTypes +exclusionPreviews +exclusions +execArgs +executeCommandConfiguration +executeCommandSessionConfiguration +execution +executionAbortedEventDetails +executionArn +executionConfiguration +executionContext +executionCounts +executionDetails +executionEndDate +executionFailedEventDetails +executionFilter +executionID +executionId +executionIds +executionInfo +executionInfos +executionMessage +executionNamePrefix +executionNumber +executionResult +executionRole +executionRoleArn +executionStartDate +executionStartToCloseTimeout +executionStartedEventDetails +executionState +executionStatus +executionStoppedAt +executionSucceededEventDetails +executionSummaries +executionTimedOutEventDetails +executionTimeoutMinutes +executionTimeoutSeconds +executionUrlTemplate +executions +executor +existingAllowedPrefixesToDirectConnectGateway +existingFindingId +existingFindingStatus +existingImageName +existingRuleContentSha256 +exists +exitBehavior +exitCode +expected +expectedAgentPrompt +expectedComplianceStatus +expectedFingerprint +expectedOutput +expectedReferenceId +expectedRevisionId +expectedRpoDescription +expectedRpoInSecs +expectedRtoDescription +expectedRtoInSecs +expectedSequenceToken +expectedStatus +expectedTimestamp +expectedValue +expectedVersion +experiment +experimentCount +experimentTemplate +experimentTemplateId +experimentTemplates +experiments +expiration +expirationDate +expirationInSeconds +expirationTime +expired +expiredLogEventEndIndex +expires +expiresAt +expiresIn +expiresInMinutes +expiresInSec +expiresInSeconds +expiresOn +expiresTime +expiringImageTotalCount +expiryTime +explainMode +explicitDeny +exploitAvailable +exploitObserved +exploitabilityDetails +exponentialRate +export +exportBucketArn +exportConfig +exportConfigType +exportDataFormat +exportID +exportIDs +exportId +exportIds +exportJobs +exportRequestTime +exportSnapshotRecords +exportStatus +exportSummaries +exportTask +exportTasks +exportType +exportedEnvironmentVariables +exportsInfo +expr +expression +expressionString +expressionWithValues +exprs +extendedKeyUsage +extendsFrom +extension +external +externalConnection +externalConnectionName +externalConnections +externalEventsDetail +externalExecutionId +externalExecutionSummary +externalExecutionUrl +externalId +externalIdProperty +externalInitiatedEventId +externalLocation +externalMetricStatus +externalMetricsPreference +externalModel +externalModelEndpointDataBlobs +externalModelEndpoints +externalModelOutputs +externalModels +externalParameters +externalSourceSetting +externalWorkflowExecution +externalWorkflowExecutionCancelRequestedEventAttributes +externalWorkflowExecutionSignaledEventAttributes +extraDataPackageArn +extraHosts +extractedValues +facet +facets +fact +factor +facts +failOnError +failOnFirstDestinationError +failOnWarnings +failWhenMissing +failWorkflowExecutionDecisionAttributes +failWorkflowExecutionFailedEventAttributes +failback +failbackClientID +failbackClientLastSeenByServiceDateTime +failbackInitiationTime +failbackJobID +failbackLaunchType +failbackToOriginalServer +failed +failedAccountIds +failedAccounts +failedAt +failedBatchItems +failedChecks +failedEntries +failedEventCount +failedExecutions +failedFindings +failedFindingsCount +failedItem +failedItems +failedRecordsCount +failedRequestCount +failedRequests +failedS3Resources +failedSet +failedTasks +failedVersions +failedWorldCount +failure +failureBehavior +failureCause +failureCode +failureConditional +failureCount +failureDetails +failureHandlingPolicy +failureMessage +failureNextStep +failureReason +failureReasons +failureResource +failureResponse +failureSummary +failureThresholdPercentage +failureType +failures +fairsharePolicy +fallbackLocation +fallbackResult +families +family +familyPrefix +fargatePlatformConfiguration +fargateProfile +fargateProfileArn +fargateProfileName +fargateProfileNames +fastLaunchConfigurations +feature +featureCount +featureName +featureSet +featureTransformation +featureTransformationArn +featureTransformationParameters +featureVariations +features +federatedUser +federationMode +federationParameters +federationProviderName +federationURN +fetchSubmodules +field +fieldArn +fieldId +fieldLengthRange +fieldLevelMessages +fieldList +fieldLogLevel +fieldName +fieldType +fieldValueRange +fields +fieldsToExport +file +fileContent +fileDescription +fileExistsBehavior +fileFormat +fileFormatConfiguration +fileFormatType +fileId +fileKey +fileLevelMessages +fileLocation +fileMap +fileMd5 +fileMode +fileModeConflict +fileModes +fileName +filePassword +filePath +filePaths +filePosition +fileSize +fileSizes +fileSystemId +fileSystemLocations +fileSystemPolicy +fileSystemType +fileType +fileUploadUrls +fileUploaderConfig +fileVersion +filename +files +filesAdded +filesDeleted +filesUpdated +filter +filterArn +filterBy +filterByName +filterByPublished +filterByRecordingConfigurationArn +filterByState +filterByUserId +filterCriteria +filterExpression +filterFormula +filterGroups +filterName +filterNamePrefix +filterOperators +filterPattern +filterQuery +filterType +filterValue +filterValues +filters +finalCaseStatus +finalRelationalDatabaseSnapshotName +finalSnapshotName +finalSnapshotRetentionPeriod +finalized +finding +findingArn +findingArns +findingCounts +findingCriteria +findingDetails +findingId +findingIdentifiers +findingIds +findingNumber +findingPublishingFrequency +findingReasonCodes +findingSeverityCounts +findingStatus +findingTime +findingType +findingTypes +findings +findingsFilterListItems +findingsMetrics +findingsReportSummaries +fingerprint +fingerprintSHA1 +fingerprintSHA256 +finishedAt +finishedCount +finishedWorldsSummary +firehose +firelensConfiguration +firstBoot +firstByteDateTime +firstEnabledAt +firstEventTimestamp +firstExecutionFrom +firstJoinTime +firstName +firstObservedAt +firstSeen +firstUsedTime +firstUtteredDate +fixAvailable +fixedInVersion +flaggedResources +flatten +fleet +fleetArn +fleetDetails +fleetId +fleetInstanceId +fleetMetrics +fleetName +fleetSummaries +fleetType +fleets +floorplanCount +flowActionsRoleArn +flowArn +flowErrorDeactivationThreshold +flowExecutionId +flowExecutions +flowName +flowStatus +flowStatusMessage +flowTemplateId +flows +folderPath +followUpPrompt +force +forceCanceled +forceDelete +forceDeleteAWSJob +forceDeleteAddOns +forceNewDeployment +forceStop +forceStopAppReplication +forceTerminateApp +forceUefi +forceUpdate +form +formActionType +formFactor +formToCreate +format +formatOptions +formatParams +formatRecordsAs +formatToHeader +formattedRecords +formattedValue +formattedValues +formula +forwardedCookies +forwardedHeaders +forwardedQueryStrings +forwardingConfig +found +foundationModelArn +foundationModelArnEquals +fpr +fqdn +fqdnForActionFramework +fragmentsFilePath +frameAddress +frameMetric +frameMetricData +frameMetrics +frameName +framework +frameworkDescription +frameworkId +frameworkMetadataList +frameworkName +frameworkType +freeTrialConsumed +freeTrialExpiration +freeTrialInfo +freeTrialStartDate +frequency +frequencyInSeconds +friendlyName +from +fromAttachedDisks +fromBlockchainInstant +fromBlueprintId +fromBundleId +fromDate +fromDateTime +fromDiskArn +fromDiskInfo +fromDiskName +fromInstanceArn +fromInstanceName +fromPermissionArn +fromPermissionVersion +fromPort +fromRelationalDatabaseArn +fromRelationalDatabaseBlueprintId +fromRelationalDatabaseBundleId +fromRelationalDatabaseName +fromResourceArn +fromResourceName +fsxWindowsFileServerVolumeConfiguration +fulfillmentActivity +fulfillmentCodeHook +fulfillmentState +fulfillmentUpdatesSpecification +fullString +fullyQualifiedName +function +functionAlias +functionArn +functionArns +functionConfiguration +functionId +functionInstances +functionName +functionNames +functionPackages +functionTags +functionVersion +functions +gasUsed +gatewayArn +gatewayCapabilitySummaries +gatewayId +gatewayName +gatewayPlatform +gatewayRoute +gatewayRouteName +gatewayRoutes +gatewaySummaries +gbInUse +gbPerMonthAllocated +generateDistinctId +generatedFields +generatedFrom +generatedId +generatedPolicies +generatedPolicyResult +generatedSceneMetadata +generationDataSource +generationId +generationJob +generatorId +genericAttachments +genericDataSchema +genericRevisionInfo +getObject +getTokenBalanceInputs +gitCloneDepth +gitCloneDepthOverride +gitHub +gitHubAccountName +gitHubLocation +gitSubmodulesConfig +gitSubmodulesConfigOverride +global +glueConfiguration +glueDataCatalog +gps +gpuCount +gpuIds +gpuMemorySizeInMiB +gpuUnitLimit +gpus +grafanaVersion +grafanaVersions +grammarSlotTypeSetting +grantType +grantee +granteePrincipal +grants +graphSummary +graphqlApi +graphqlApis +greenFleetProvisioningOption +greenGrassGroupId +greengrass +greengrassDeploymentId +greengrassGroupId +greengrassGroupName +greengrassGroupVersionId +greengrassV2 +gremlin +gremlinQuery +groundStation +groundStationId +groundStationList +groundStationName +groundStations +group +groupArn +groupAttribute +groupBy +groupByKeys +groupDesc +groupId +groupIdFilter +groupKey +groupName +groupNumber +groupType +groupWeights +groups +groupsClaim +groupsPrefix +grpcRetryEvents +grpcRoute +gt +gte +haArchitecture +hardLimit +hardware +hardwareId +hasChildEntities +hasErrorEvent +hasFlaggedResources +hasHeaderRow +hasLogicalRedundancy +hasMoreErrors +hasMoreResults +hasNestedEntities +hasTransmissionEcu +hashAlgorithm +hashAlgorithmOptions +hashKeyField +hashKeyType +hashKeyValue +hashed +hashes +headCommitId +header +headerMatches +headerName +headerValue +headers +headersAllowList +headersToInclude +health +healthCheck +healthCheckGracePeriodSeconds +healthCheckIntervalSeconds +healthCheckPath +healthCheckTimeoutSeconds +healthReasons +healthServiceAccessStatusForOrganization +healthStatus +healthyAgentlessCollectors +healthyAgents +healthyConnectors +healthyMeCollectors +healthyThreshold +healthyThresholdCount +heapSize +heartbeatInSeconds +heartbeatTimeout +height +helmChart +hierarchies +hierarchyId +hierarchyInfo +high +highAvailabilityConfig +highlight +highlights +historyFilter +hit +hitCount +hits +homePage +homeRegion +hook +hooksNotCleanedUp +horizontalGap +host +hostAddress +hostKeys +hostName +hostNetwork +hostPath +hostPort +hostPortRange +hostPrefix +hostedZoneId +hostname +hpoConfig +hpoJob +hpoObjective +hpoResourceConfig +http +http2Route +httpApiKeyAuth +httpConfig +httpContext +httpEndpoint +httpMethod +httpProtocolIpv6 +httpPutResponseHopLimit +httpRetryEvents +httpRoute +httpTokens +httpUrlConfiguration +httpUrlProperties +httpUrlSummary +https +httpsRedirectionEnabled +hunkContent +hyperParameters +hyperlinkName +iam +iamArn +iamId +iamInstanceProfileArn +iamInstanceProfileName +iamRegistrationResponse +iamResources +iamRole +iamRoleArn +iamRoles +iamServiceRoleArn +iamSessionArn +iamUser +iamUserArn +iatTTL +iccid +icmpTypeCode +iconUrl +id +idFieldNames +idRef +idToken +idempotencyToken +identifer +identificationHints +identifier +identifiers +identity +identityId +identityProvider +identityProviderArn +identityProviderConfig +identityProviderConfigArn +identityProviderConfigName +identityProviderConfigs +identityProviderDetails +identityProviderName +identityProviderType +identityProviders +identitySource +identitySourceId +identitySources +identityStoreId +identityToken +identityType +identityValidationExpression +ides +idle +idleDisconnectTimeoutInMinutes +idleSessionTTLInSeconds +idleTimeoutMinutes +idpMetadata +ids +ignoreApplicationStopFailures +ignoreEmptyRows +ignoreFailure +ignoreFilterField +ignoreJobChecks +ignorePollAlarmFailure +ignorePublicAcls +ignoreQualField +ignoreWords +image +imageAggregation +imageArn +imageBuildVersionArn +imageConfiguration +imageDataDeliveryEnabled +imageDetail +imageDetails +imageDigest +imageFrameBlob +imageFrameId +imageFrameInformation +imageHash +imageId +imageIdOverride +imageIds +imageKubernetesVersion +imageManifest +imageManifestMediaType +imageOsVersionOverride +imageOverride +imagePackageList +imagePermissions +imagePipeline +imagePipelineAggregation +imagePipelineArn +imagePipelineList +imagePullCredentialsType +imagePullCredentialsTypeOverride +imagePullPolicy +imagePushedAt +imageRecipe +imageRecipeArn +imageRecipeSummaryList +imageResponseCard +imageScanCompletedAt +imageScanFindings +imageScanFindingsSummary +imageScanStatus +imageScanningConfiguration +imageScanningEnabled +imageSetArn +imageSetId +imageSetMetadataBlob +imageSetPropertiesList +imageSetState +imageSetWorkflowStatus +imageSetsMetadataSummaries +imageSha +imageShas +imageSizeInBytes +imageSource +imageSummaryList +imageTag +imageTagDetails +imageTagMutability +imageTags +imageTestsConfiguration +imageTestsEnabled +imageType +imageUri +imageUris +imageUrl +imageVersionArn +imageVersionList +images +impact +implementedBy +implicitDeny +importCompletionTime +importConfig +importDeletedTime +importID +importIDs +importId +importInputLocation +importJobs +importMode +importName +importOptions +importRequestTime +importStatus +importStrategy +importSummaries +importTask +importTaskId +importTaskIds +importType +importUrl +importedAppId +importedResourceId +importedResourceName +importedResourceType +importedValue +impression +imsi +in +inProgress +inProgressChecks +inProgressJobs +inProgressTimeoutInMinutes +inReplyTo +inUseResourceCount +inactivityTimeoutMinutes +inboundExecution +inboundTransitionState +incidentRecord +incidentRecordArn +incidentRecordSource +incidentRecordSummaries +incidentTags +incidentTemplate +incidentTemplateDedupeString +incidentTemplateImpact +incidentTemplateNotificationTargets +incidentTemplateSummary +incidentTemplateTags +incidentTemplateTitle +include +includeAllVersions +includeAvailabilityZones +includeCanceled +includeCertificateDetails +includeCommunications +includeConnectedResources +includeContent +includeDefaultKeyPair +includeDeletedRecords +includeDeletedResources +includeDeprecated +includeDescription +includeDirectives +includeExecutionData +includeFromUpstream +includeGlobalResourceTypes +includeInactive +includeJobDocument +includeJobExecutionState +includeLinkedAccounts +includeMemberAccounts +includeOnlyActiveViolations +includeOnlyStatuses +includeQueuedLoads +includeRelationalDatabaseAvailabilityZones +includeRenditions +includeResolvedCases +includeResourcePlaceholders +includeResultMetadata +includeServiceLevelTemplate +includeShadowTrails +includeSourceFiles +includeStatistics +includeSuppressedAlerts +includeValue +includeValues +includeWaiting +included +includedData +includes +inclusionStatus +incompatibilityMessages +incompatibleDevices +inconclusiveEvidenceCount +incrementFactor +incrementalPullConfig +incrementalRunConfig +incrementalRunType +index +indexName +indexNames +indexOps +indexStatus +indicatorOfCompromise +inferenceAcceleratorOverrides +inferenceAccelerators +inferenceTypesSupported +inferredWorkloadSavings +inferredWorkloadTypes +info +infrastructureConfiguration +infrastructureConfigurationArn +infrastructureConfigurationSummaryList +ingestConfiguration +ingestEndpoint +ingestedEventStatistics +ingestedEventsDetail +ingestedEventsTimeWindow +ingestion +ingestionArn +ingestionDestination +ingestionDestinationIdentifier +ingestionDestinations +ingestionIdentifier +ingestionMode +ingestionTime +ingestionType +ingestions +ingressAddress +ingressPortOverride +inheritedProperties +initProcessEnabled +initQueryFile +initialCapacity +initialCaseStatus +initialResponse +initialResponseSetting +initialRevision +initialRun +initialState +initialStateName +initializationConfiguration +initializationScript +initializationScripts +initiated +initiatedBy +initiatedEventId +initiator +inlineDocument +inlineRecipe +inlineSourceMap +input +inputArn +inputArtifactDetails +inputArtifacts +inputCharacter +inputConfiguration +inputContexts +inputDataConfig +inputDataS3Location +inputDefinition +inputDescription +inputDetails +inputFileBucket +inputFileKey +inputIdentifier +inputList +inputModalities +inputMode +inputName +inputParameters +inputPath +inputPayloadEncodingType +inputProperty +inputPropertyValue +inputRecords +inputS3Bucket +inputS3Key +inputS3Uri +inputSourceARN +inputSourceConfig +inputStream +inputSummaries +inputText +inputToken +inputTranscript +inputType +inputVariables +inputs +insecureIngest +insecureSkipVerification +insecureSsl +insecureSslOverride +insights +inspectorScore +inspectorScoreDetails +installState +installedComponents +installedVersion +installingVersion +instance +instanceArn +instanceArns +instanceConfig +instanceConfiguration +instanceCount +instanceGpuInfo +instanceHealth +instanceHealthReason +instanceHealthSummary +instanceId +instanceIdFilter +instanceIdentity +instanceIdentityDocument +instanceIdentityDocumentSignature +instanceIds +instanceInfo +instanceInfos +instanceLabel +instanceMetadataOptions +instanceName +instanceNames +instancePort +instanceProfile +instanceProfileName +instanceProfiles +instanceProperties +instanceRecommendations +instanceRole +instanceSnapshot +instanceSnapshotInfo +instanceSnapshotName +instanceSnapshots +instanceState +instanceStatusFilter +instanceSummary +instanceTags +instanceTarget +instanceTerminationWaitTimeStarted +instanceType +instanceTypeFilter +instanceTypes +instanceUrl +instanceWarmupPeriod +instances +instancesList +instancesSummary +instantiatedVnfInfo +instantiationState +integerHyperParameterRanges +integerValue +integrationConfiguration +integrationHttpMethod +integrationResponses +integrations +intendedForQualification +intent +intentClassificationResults +intentClassificationTestResults +intentClosingSetting +intentConfirmationSetting +intentCount +intentDiscrepancies +intentId +intentLevel +intentLevelSlotResolutionTestResults +intentMatchResult +intentMatchResultCounts +intentName +intentPath +intentSignature +intentState +intentSummaries +intentVersion +intents +intentsCount +interactionMode +interactive +interconnectId +interconnectName +interconnectState +interconnects +interfaceId +interfaceName +interiorCountPerFloorplan +interleaved +intermediateBucketName +internal +internalDeviceName +interpolatedAssetPropertyValues +interpolation +interpolationType +interpretations +interpretedValue +interval +intervalInSeconds +intervalMillis +intervalSeconds +intervalWindowInSeconds +invalidExecutions +invalidNetworkInterfaces +invalidNodes +invalidReason +invalidSignals +invert +invitationId +invitationTimestamp +invitations +invitationsCount +invitedAt +invocationLabel +invokeModelEndpointRoleArn +invokedBy +invokedIntentSamples +invoker +invokerRoleName +iops +iosPaths +iotAnalytics +iotEvents +iotEventsDestinationConfiguration +iotEventsInputIdentifier +iotJobArn +iotJobConfiguration +iotJobId +iotSiteWise +iotSiteWiseAssetModelPropertyIdentifier +iotSiteWiseInputIdentifier +iotSiteWiseMultiLayerStorage +iotTopicPublish +ipAccessSettings +ipAccessSettingsArn +ipAddress +ipAddressAssignment +ipAddressBasedRemoteInfoList +ipAddressConfigurationTimeStamp +ipAddressDetails +ipAddressType +ipAddressV4 +ipCity +ipCountry +ipFamily +ipGeoLocation +ipGroupIds +ipOwner +ipPreference +ipRange +ipRule +ipRules +ipV4Addresses +ipV6Addresses +ipcMode +ips +ipv4Address +ipv4Addresses +ipv6Address +ipv6Addresses +ipv6Cidrs +isAbstract +isActive +isAlias +isAlreadyVerified +isApiKeyAuthSupported +isArchived +isArray +isAttached +isAuthenticated +isAutoIncrement +isAwsOrgEnabled +isBasicAuthSupported +isBigEndian +isBinaryFile +isBootDisk +isCancelled +isCaseSensitive +isComplete +isConcurrent +isConflict +isCreatable +isCurrency +isCustomAuthSupported +isDefault +isDefaultVersion +isDefaultedOnCreate +isDefinedInJob +isDeprecated +isDisabled +isDrill +isEnabled +isEncrypted +isEngineDefault +isExternalId +isFinal +isFromAutoSnapshot +isHasManyIndex +isImported +isInherited +isJoinTable +isLastOp +isLatestForTarget +isLongDurationTest +isMainNode +isMerged +isModifiable +isMonitoredByJob +isMove +isNative +isNonModelSupported +isNullable +isOAuth2Supported +isOptedOut +isPeered +isPreferred +isPrimary +isPrimaryKey +isPrivateLinkEnabled +isPrivateLinkEndpointUrlRequired +isPublic +isQueryable +isRecursive +isRedshiftServerless +isRelationshipSupported +isRequired +isRequiredInEntity +isReservedMinutesCustomer +isResourceTypeDefault +isResumable +isRetrievable +isRevoked +isRoot +isSandboxEnvironment +isSchemaInitialized +isSemVer +isSensitiveField +isServiceLimited +isSigned +isSingleton +isStaticIp +isStoredExternally +isSuppressed +isSystemDisk +isTerminal +isTerminated +isTimeSeries +isTimestampFieldForIncrementalQueries +isTruncated +isTunable +isUpdatable +isUpsertable +isValid +isolationMode +isp +issueCode +issueType +issuedAt +issuer +issuerCA +issuerCertificateIdentifier +issuerCertificateSerialNumber +issuerCertificateSubject +issuerId +issuerUrl +issues +issuesEnabled +issuingAccount +item +itemAttribute +itemCount +itemCounts +itemExplorationConfig +itemId +itemList +items +iteratorType +job +jobArn +jobConfiguration +jobCreationDate +jobDefinition +jobDefinitionArn +jobDefinitionName +jobDefinitions +jobDetails +jobDocument +jobDriver +jobError +jobExecutionSummary +jobExecutionTimeoutMinutes +jobExecutionsRetryConfig +jobExecutionsRolloutConfig +jobExpiresAt +jobID +jobIDs +jobId +jobIdentifier +jobIds +jobImminentExpirationHealthEventArn +jobInput +jobInvoker +jobLastUpdateDate +jobMetadata +jobName +jobOutput +jobOutputPath +jobOwner +jobParameters +jobParams +jobPausedAt +jobPort +jobProcessDetails +jobProperties +jobQueue +jobQueueArn +jobQueueName +jobQueues +jobReason +jobRoleArn +jobRun +jobRunId +jobRuns +jobStatus +jobSummaries +jobSummary +jobSummaryList +jobTags +jobTemplate +jobTemplateArn +jobTemplateData +jobTemplateId +jobTemplateParameters +jobTemplates +jobTimeout +jobTimeoutMinutes +jobToken +jobType +jobUser +jobWorkerExecutorConfiguration +jobs +joinColumns +joinRequired +jsonConfiguration +jsonInputTemplate +jsonKeyToVariableMap +jsonPath +jumboFrameCapable +jwtToken +kafka +kafkaCluster +kafkaClusterClientAuthentication +kafkaClusterEncryptionInTransit +kafkaConnectVersion +keepEmptyFolders +kendraConfiguration +kendraIndex +kernelVersion +key +keyAlgorithm +keyArn +keyId +keyName +keyPair +keyPairName +keyPairs +keyPolicies +keyPrefix +keyRole +keyTemplate +keyType +keyTypes +keyUsage +keyValue +keyspaceName +keyspaces +keyword +keywordInputType +keywordValue +keywords +kind +kinesis +kinesisStreamArn +kmsArn +kmsEncryptionKeyArn +kmsError +kmsKey +kmsKeyArn +kmsKeyId +kmsKeyIdentifier +kmsManaged +kmsMasterKeyId +knowledgeBase +knowledgeBaseArn +knowledgeBaseId +knowledgeBaseSummaries +knowledgeBaseType +knownDependencyCount +kubernetesNamespace +kubernetesNetworkConfig +kubernetesVersion +kxChangesets +kxClusterSummaries +kxDatabases +labMode +label +labelDecorator +labelMapper +labelSchema +labelTimestamp +labels +lagDuration +lagId +lagName +lagState +lags +lambda +lambdaARN +lambdaAction +lambdaArn +lambdaAuthorizerConfig +lambdaCode +lambdaCodeHook +lambdaConfig +lambdaConflictHandlerArn +lambdaConflictHandlerConfig +lambdaEventStructureVersion +lambdaExecutorConfiguration +lambdaFunction +lambdaFunctionArn +lambdaFunctionCompletedEventAttributes +lambdaFunctionExecutionRoleArn +lambdaFunctionFailedEventAttributes +lambdaFunctionFailedEventDetails +lambdaFunctionInfo +lambdaFunctionLastModifiedAt +lambdaFunctionLayers +lambdaFunctionName +lambdaFunctionRecommendations +lambdaFunctionRuntime +lambdaFunctionScheduleFailedEventDetails +lambdaFunctionScheduledEventAttributes +lambdaFunctionScheduledEventDetails +lambdaFunctionStartFailedEventDetails +lambdaFunctionStartedEventAttributes +lambdaFunctionSucceededEventDetails +lambdaFunctionTags +lambdaFunctionTimedOutEventAttributes +lambdaFunctionTimedOutEventDetails +lambdaName +lambdaRole +lambdaTags +lambdaTarget +language +languageAvailability +languages +largeDataDeliveryS3Config +largeVolumeConf +lastAccess +lastActivityDate +lastActivityTimeStamp +lastAnalyzedTimestamp +lastAppComplianceEvaluationTime +lastAssessmentRunArn +lastAttemptTime +lastAttemptedDeployment +lastAttemptedDeploymentId +lastAutomatedDiscoveryTime +lastBuildSubmittedDateTime +lastByteReceived +lastChangedAt +lastChangedBy +lastClientRequestToken +lastCompletedChangesetId +lastContentModificationTime +lastCutover +lastDeployTime +lastDeploymentAttemptedAt +lastDeploymentJob +lastDeploymentStatus +lastDeploymentSucceededAt +lastDeploymentTime +lastDisabledTime +lastDriftEvaluationTime +lastEnabledTime +lastErrorCode +lastErrorMessage +lastEvaluatedAt +lastEventId +lastEventTimestamp +lastHealthPingTime +lastHeartbeatTime +lastIngestionTime +lastInstallationSource +lastJobId +lastJobRunTime +lastKnownExploitAt +lastLaunch +lastLaunchResult +lastLoginTime +lastMessageArrivalTime +lastModelRefreshDate +lastModificationTime +lastModified +lastModifiedAt +lastModifiedBy +lastModifiedDate +lastModifiedDateTime +lastModifiedOn +lastModifiedSecret +lastModifiedTime +lastModifiedTimestamp +lastModifiedUser +lastName +lastObservedAt +lastReachedOutAt +lastRecordedPullTime +lastRecovery +lastRecoveryResult +lastReferencedTime +lastRefreshTimestamp +lastReportedTimestamp +lastResiliencyScoreEvaluationTime +lastResourceAnalyzed +lastResourceAnalyzedAt +lastRunErrorStatus +lastRunExecutionDetails +lastRunMetadataCatalogDetails +lastRunTime +lastScannedAt +lastSeen +lastSeenAt +lastSeenByServiceDateTime +lastSeenDatetime +lastSnapshotDateTime +lastStartTime +lastStartedAt +lastStatisticsComputationTime +lastStatus +lastStatusChange +lastStatusChangeDate +lastStatusChangeTime +lastStatusChangeTimestamp +lastStatusUpdateTimestamp +lastStopTime +lastSucceededDeploymentId +lastSuccessfulComponentDeploymentIds +lastSuccessfulDeployment +lastSuccessfulEnvironmentDeploymentId +lastSuccessfulMergeDate +lastSuccessfulServicePipelineDeploymentId +lastSuccessfulTime +lastSyncedAt +lastTest +lastTriggered +lastTrxTimestampInMillis +lastUpdateDate +lastUpdateDateTime +lastUpdateTime +lastUpdateToPayPerRequestTimestamp +lastUpdated +lastUpdatedAt +lastUpdatedBy +lastUpdatedDataTime +lastUpdatedDate +lastUpdatedDateTime +lastUpdatedOn +lastUpdatedTime +lastUpdatedTimes +lastUpdatedTimestamp +lastUsed +lastUsedDate +lastUsedIntent +lastUsedTime +lastUtteredDate +lastValidByteReceived +lastViolationTime +lastViolationValue +lat +lateDataRules +latency +latencyMode +laterTime +latestActivityTaskTimestamp +latestAgentOrchestratedAt +latestAgentProfileReportedAt +latestAggregatedProfile +latestAmiId +latestBlockers +latestBotVersion +latestCampaignUpdate +latestCancelRequestedEventId +latestDatasetUpdate +latestDate +latestDescription +latestExecution +latestExecutionContext +latestLaunchTime +latestRecommenderUpdate +latestReplicationTime +latestRestorableTime +latestRevision +latestSolutionVersion +latestSuccessfulSync +latestSync +latestValidationTime +latestVersion +latestVersionId +latitude +launch +launchActionsStatus +launchConfig +launchConfigurationStatus +launchConfigurationTemplate +launchConfigurationTemplateID +launchConfigurationTemplateIDs +launchCount +launchDetails +launchDisposition +launchFile +launchOrder +launchPermission +launchProfile +launchProfileId +launchProfileInitialization +launchProfileProtocolVersion +launchProfileProtocolVersions +launchProfiles +launchPurpose +launchStatus +launchStatusMessage +launchTemplate +launchTemplateConfigurations +launchTemplateId +launchTemplateName +launchTemplateVersion +launchTime +launchType +launchedAt +launchedEc2InstanceID +launchedInstance +launchedVpcID +launches +layerArn +layerArns +layerAvailability +layerDigest +layerDigests +layerHash +layerHashes +layerPartBlob +layerSize +layers +layoutArn +layoutConfiguration +layoutId +layouts +lcmOpInfo +lcmOperationType +learnMoreLink +leastRecentEvent +length +level +lexTranscriptFilter +licenseConfigurationArns +licenseCostReduction +licenseEdition +licenseExpiration +licenseModel +licenseName +licenseRecommendationOptions +licenseRecommendations +licenseType +licenseUrl +licenseVersion +licenses +licensing +lifeCycle +lifeCycleStates +lifecycle +lifecycleConfiguration +lifecycleEventHookExecutionId +lifecycleEventName +lifecycleEvents +lifecyclePolicyText +lifecycleState +lifecycleStateDetails +lifecycleStatusCodes +limit +limitCode +limits +line +lineCoveragePercentage +lineNumber +lineRange +lineRanges +lineSep +linearInterval +linearPercentage +linesCovered +linesMissed +link +linkOutUri +linkedToGitHub +links +linux +linuxMountPoint +linuxParameters +linuxProcessParams +listAntipatternSeveritySummary +listApplicationComponentStatusSummary +listApplicationComponentStrategySummary +listApplicationComponentSummary +listColumns +listServerStatusSummary +listServerStrategySummary +listServerSummary +listSuppressedAlerts +listSuppressedFindings +listValue +listenerArns +listenerIdentifier +listenerPorts +listeners +lists +loa +loaContent +loaContentType +loaIssueTime +loadBalancer +loadBalancerArn +loadBalancerDnsName +loadBalancerInfo +loadBalancerName +loadBalancers +loadId +loadIds +localPath +localTraits +locale +localeId +localeName +location +locationCode +locationName +locationStatus +locationType +locations +lockId +log +logConfig +logConfiguration +logContext +logDateTime +logDelivery +logDriver +logEventMessages +logEvents +logExports +logGroup +logGroupArn +logGroupFields +logGroupIdentifier +logGroupIdentifiers +logGroupName +logGroupNamePattern +logGroupNamePrefix +logGroupNames +logGroups +logLevel +logOddsImpact +logOddsMetrics +logPrefix +logRecord +logRecordPointer +logResult +logSchemaVersion +logSettings +logStream +logStreamName +logStreamNamePrefix +logStreamNames +logStreams +logTail +logTarget +logTargetConfigurations +logType +logTypes +logUri +logUrl +logging +loggingConfig +loggingConfiguration +loggingConfigurationIdentifier +loggingConfigurationIdentifiers +loggingConfigurations +loggingLevel +loggingOptions +loggingOptionsPayload +logicalId +logicalResourceId +logicalStackName +logicalStackNames +login +loginValidityDuration +logo +logoImageBlob +logoURL +logoUrl +logonLanguage +logs +logsConfig +logsConfigOverride +lon +longReturnType +longValue +longitude +lookBackPeriodInDays +lookbackPeriodInDays +low +lowerBoundValue +lowerBoundValues +lowerInclusive +lt +lte +macAddress +macSecCapable +macSecKeys +main +mainNode +maintenanceWindows +majorVersion +majorVersionNumber +managedAgentName +managedAgents +managedCredentialsAction +managedCredentialsStatus +managedDataIdentifierIds +managedDataIdentifierSelector +managedDeviceArn +managedDeviceId +managedFields +managedJobTemplates +managedPersistenceMonitoringConfiguration +managedPolicyArns +managedScaling +managedTerminationProtection +managementAccountId +managementPreference +manifest +manualEvidence +manualEvidenceCount +manufacturer +mapAutoTaggingMpeID +mapIterationAbortedEventDetails +mapIterationFailedEventDetails +mapIterationStartedEventDetails +mapIterationSucceededEventDetails +mapRunArn +mapRunFailedEventDetails +mapRunStartedEventDetails +mapRuns +mapStateStartedEventDetails +mapValue +mappedInputFields +mappingType +marker +markerName +markerRecordedEventAttributes +marketplaceCertified +marketplaceInformation +master +masterAccount +masterAccountId +masterDatabaseName +masterEndpoint +masterUserPassword +masterUsername +match +matchCount +matchEquals +matchIDs +matchId +matchKey +matchResult +matched +matchedDevicesCount +matcher +matches +matchingBucket +matchingKeys +matchingResources +math +max +maxAccountLimitReached +maxAge +maxAttempts +maxBackupsToRetain +maxBatchSize +maxBuckets +maxConcurrency +maxConflictFiles +maxConnections +maxCpus +maxDepth +maxDevices +maxDuration +maxEjectionPercent +maxFileCount +maxFilesToKeep +maxGpus +maxHPONumberOfTrainingJobs +maxHPOParallelTrainingJobs +maxIdleTimeInSeconds +maxIndexingCapacityInOCU +maxInstancesCount +maxItems +maxJobDurationInSeconds +maxJobTimeoutMinutes +maxLength +maxLengthMs +maxLifetimeTimeoutMinutes +maxLineCoveragePercentage +maxMergeHunks +maxMessages +maxNodeCount +maxNumberOfTrainingJobs +maxPageSize +maxParallelLaunches +maxParallelTrainingJobs +maxParallelism +maxPendingRequests +maxQueueSize +maxRequests +maxResult +maxResults +maxRetries +maxRuns +maxRuntimeInSeconds +maxSampleCount +maxSearchCapacityInOCU +maxSeconds +maxServerErrors +maxSessionLengthInMinutes +maxSize +maxSizeInMB +maxSlots +maxStoppedSessionLengthInMinutes +maxSwap +maxUnavailable +maxUnavailablePercentage +maxValue +maxVersions +maxWorkerCount +maximum +maximumBuildsAllowed +maximumCapacity +maximumCount +maximumElevation +maximumMatchDistance +maximumMessageLength +maximumMessageRatePerSecond +maximumPageSize +maximumPerMinute +maximumPercent +maximumScalingStepSize +maximumTTL +maxvCpus +mcuCount +md5 +md5sum +meCollectorSummary +mean +meanTimeToClose +measurement +mediaType +medium +member +memberAbilities +memberAccountId +memberAccounts +memberAccountsEnrolled +memberFileExtensions +memberStatus +memberSummaries +members +membership +membershipArn +membershipId +membershipIdentifier +membershipStatus +membershipSummaries +memberships +memory +memoryGBHour +memoryInfo +memoryReservation +memorySize +memorySizeConfiguration +memorySizeInKB +memorySizeRecommendationOptions +merge +mergeBase +mergeCommitId +mergeHunks +mergeMetadata +mergeOperations +mergeOption +mergeOptions +mergeStrategy +mergeType +mergeable +mergedApiArn +mergedApiExecutionRoleArn +mergedApiId +mergedApiIdentifier +mergedBy +mergedCommitId +mesh +meshName +meshOwner +meshes +message +messageContent +messageExpiry +messageFormat +messageGroups +messageId +messageReviewHandler +messageReviewHandlerUri +messageSelectionStrategy +messageType +messageVersion +messages +meta +metaStoreManagerRoleArn +metadata +metadataCatalogConfig +metadataCatalogDetails +metadataKey +metadataOptions +metered +method +methodIntegration +methodName +methodResponses +methodSettings +metric +metricArn +metricAttribution +metricAttributionArn +metricAttributions +metricData +metricDataPoints +metricDatumList +metricDefinition +metricDimension +metricFilterCount +metricFilters +metricGoals +metricMonitors +metricName +metricNames +metricNamespace +metricRegex +metricRuleRoleArn +metricTarget +metricTimestamp +metricTransformations +metricType +metricUnit +metricValue +metrics +metricsConfiguration +metricsEnabled +metricsOutputConfig +metricsResults +metricsSource +metricsSummary +mfaAuthenticated +migrationEffort +migrationId +migrationStatus +migrationStatusEquals +migrationStrategy +migrationSummaries +migrationTimestamp +migrationWorkflowSummary +millisUntilNextRefreshable +mimeType +min +minLineCoveragePercentage +minNodeCount +minNumberOfExecutedThings +minPower +minProvisionedTPS +minRecommendationRequestsPerSecond +minSeconds +minSize +minValue +minWorkerCount +minimum +minimumCompressionSize +minimumCount +minimumHealthyHosts +minimumHealthyPercent +minimumLinks +minimumSamplingIntervalMs +minimumScalingStepSize +minimumTTL +minimumTriggerIntervalMs +minimumViableContactDurationSeconds +minorVersion +minvCpus +missedCount +missing +missingContextValues +missionProfileArn +missionProfileId +missionProfileList +mixed +mixin +mlDetectionConfig +mlModelTrainingJobId +mlModelTransformJobId +mlModels +modality +mode +model +modelArn +modelArnEquals +modelCustomizationJobSummaries +modelDetails +modelEndpoint +modelEndpointStatus +modelId +modelIdentifier +modelKmsKeyArn +modelManifestArn +modelMetrics +modelName +modelPerformance +modelScores +modelSource +modelStatus +modelSummaries +modelTransformJob +modelTransformOutputS3Location +modelType +modelUnits +modelVariables +modelVersion +modelVersionDetails +modelVersionNumber +modelVersions +models +modernizeInfrastructureWithCloudNativeTechnologies +modes +modified +modifiedAt +modifiedCount +modifiedTimestamp +modifyVnfInfoData +module +monitoredResourceInfo +monitoredResourceName +monitoringConfiguration +month +monthlySchedule +monthlyTransfer +moreApplicationResource +moreInfo +moreServerAssociationExists +mostRecentEvent +mostRecentExecutionMessage +mostRecentExecutionStatus +mostRecentExecutionTime +mountOptions +mountPath +mountPoint +mountPoints +mountROSysfs +mqttContext +mqttTopic +mtu +multiLayerStorage +multiNodeJobId +multiTurnConversation +multiValueHeaders +multipleValuesSetting +mustSucceedForCutover +mutationsFilePath +mutualTlsAuthentication +name +nameContains +namePattern +namePrefixFilter +nameQuery +nameServersUpdateState +namedShadowIndexingMode +namedShadowNames +names +namespace +namespaceArn +namespaceId +namespaceName +namespaceType +namespaceVersion +namespaces +needsReplacements +negative +neighborConfigurationIds +neighbors +neptuneIamRoleArn +neq +nestedType +netMask +netmask +network +networkAccessControl +networkArn +networkBindings +networkConfiguration +networkFileDefinitions +networkFindings +networkInfoList +networkInstances +networkInterface +networkInterfaceId +networkInterfaces +networkInterfacesToAdd +networkInterfacesToRemove +networkInterfacesToUpdate +networkMode +networkName +networkOperations +networkOrigin +networkPackages +networkPath +networkProfile +networkProfileArn +networkProfiles +networkProtocol +networkReachabilityDetails +networkResource +networkResourceArn +networkResources +networkSettings +networkSettingsArn +networkSite +networkSiteArn +networkSiteName +networkSites +networking +networks +neutral +newApplicationName +newApprovalRuleTemplateName +newAutoRegistrationStatus +newBGPPeer +newDeploymentGroupName +newDirectConnectGatewayName +newDiskName +newExecutionRunId +newFindings +newImageDescription +newImageDisplayName +newImageName +newImageTags +newName +newPrivateVirtualInterface +newPrivateVirtualInterfaceAllocation +newPublicVirtualInterface +newPublicVirtualInterfaceAllocation +newRevision +newRuleContent +newStatus +newTableName +newTransitVirtualInterface +newTransitVirtualInterfaceAllocation +newValue +next +nextAttemptDateTime +nextBackwardToken +nextDeliveryTime +nextDeployment +nextForwardToken +nextIndex +nextMarker +nextPageCount +nextPageToken +nextPeriod +nextRefreshTime +nextReplicationRunStartTime +nextSequenceToken +nextSnapshotTimeOfDay +nextState +nextStep +nextToken +nfc +nluConfidence +nluIntentConfidence +nluIntentConfidenceThreshold +nniPartnerType +noDevice +noEcho +noInlineDocumentSupport +noOfSrvCompleted +noOfSrvFailed +nodeCount +nodeCounts +nodeDetails +nodeGroup +nodeId +nodeIndex +nodeLabels +nodeName +nodeOverrides +nodeProperties +nodePropertyOverrides +nodeRangeProperties +nodeRole +nodeStructures +nodeSummaries +nodeType +nodegroup +nodegroupArn +nodegroupName +nodegroups +nodes +nodesToAdd +nodesToRemove +nodesToUpdate +nonCompliantChecks +nonCompliantResource +nonCompliantResourcesCount +nonModels +nonce +noncompliantEvidenceCount +noradSatelliteID +notAfter +notBefore +notClassified +notFoundIdentifierIds +notSensitive +notShared +notValidAfter +notValidBefore +note +notification +notificationActions +notificationConfiguration +notificationContext +notificationDestinations +notificationEnabled +notificationEndpoint +notificationLambdaArn +notificationSenderEmail +notificationSettingKeys +notificationSettings +notificationTargets +notificationTriggers +notifications +notifyOnAddCorrespondenceToCase +notifyOnCaseSeverity +notifyOnCreateOrReopenCase +notifyOnResolveCase +nsDescription +nsInstanceDescription +nsInstanceId +nsInstanceName +nsLcmOpOccId +nsName +nsState +nsd +nsdContent +nsdDesigner +nsdId +nsdInfoId +nsdInvariantId +nsdName +nsdOnboardingState +nsdOperationalState +nsdUsageState +nsdVersion +nullable +numBytes +numChangesets +numClasses +numDistinctPredicates +numDistinctSubjects +numEdgeLabels +numEdgeProperties +numEdges +numFiles +numNodeLabels +numNodeProperties +numNodes +numOfReports +numParallelProcesses +numQuads +numResults +numTurns +numValues +numVersions +number +numberOfApplicationComponents +numberOfAssociatedServices +numberOfAssociatedVPCs +numberOfCanceledThings +numberOfConflicts +numberOfConnections +numberOfCores +numberOfDays +numberOfEvents +numberOfFailedThings +numberOfInProgressThings +numberOfInvocations +numberOfMemberAccountsOptedIn +numberOfNotifiedThings +numberOfQueuedThings +numberOfRecentAmisToKeep +numberOfRecordsFailed +numberOfRecordsSuccess +numberOfRecordsUpdated +numberOfRejectedThings +numberOfRemovedThings +numberOfRetries +numberOfRevisions +numberOfRuns +numberOfSucceededThings +numberOfTimedOutThings +numberOfTransactions +numberOfTurns +numbers +numericSeverity +oAuth2Credentials +oAuth2Defaults +oAuth2GrantType +oAuth2Properties +oAuthCredentials +oAuthProperties +oAuthRequest +oAuthScopes +oauth2 +oauth2CustomProperties +oauth2GrantTypesSupported +oauthScopes +oauthToken +obdInterface +obdSignal +obdStandard +obfuscate +obfuscationSetting +obfuscationSettingType +object +objectCount +objectCountByEncryptionType +objectFields +objectId +objectIds +objectKey +objectName +objectPath +objectPrefixes +objectType +objectTypeConflict +objectTypeName +objectTypes +objectVersion +objectVersioning +objectiveSensitivity +objects +occurrences +occurrencesThreshold +oemData +offering +offeringClass +offeringId +offeringIds +offeringPromotionId +offeringPromotions +offeringStatus +offeringTransaction +offeringTransactions +offerings +offset +offsetInNanos +offsetRange +offsetRanges +offsetSeconds +ofi +oidc +oldApprovalRuleTemplateName +oldName +oldestDate +onEnter +onExit +onExitCode +onFailure +onInput +onPremisesInstanceTagFilters +onPremisesTagSet +onPremisesTagSetList +onReason +onStatusReason +onboardingState +oneTime +onlineAbConfig +onlineAbDefinition +onlyActiveViolationsIncluded +onlyAssociated +op +opNum +openActivityTasks +openChildWorkflowExecutions +openCounts +openCypherQuery +openDecisionTasks +openFindings +openIDConnectConfig +openIdIssuer +openLambdaFunctions +openPortRange +openSearch +openSearchServiceConfig +openTimers +opencypher +operand +operandType +operatingSystem +operatingSystemFamily +operatingSystems +operation +operationDetails +operationId +operationIdentifier +operationName +operationState +operationSucceeded +operationType +operationalState +operations +operator +optimizationObjective +optimizationType +optimizedStagingDiskType +option +optional +options +or +order +orderArn +orderBy +orderByTime +orderedResources +orders +org +orgPackagePaths +organizationArns +organizationEntityAccountFilters +organizationEntityAggregates +organizationEntityFilters +organizationEventDetailFilters +organizationId +organizationRoleName +organizationalUnitArns +organizationalUnitDistinguishedName +organizationalUnits +orientation +origin +originAccountID +originApprovalRuleTemplate +originAvailabilityZone +originConfiguration +originEnvironment +originPublicDNS +originRegion +originType +originalDiskPath +originalMessage +originalStatusCode +originalValue +originatingRequestId +orphanedResources +os +osByol +osDriver +osInfo +osType +osVersion +otaUpdateArn +otaUpdateFiles +otaUpdateId +otaUpdateInfo +otaUpdateStatus +otaUpdates +outboundCallConfig +outcomes +outdatedInstancesStrategy +outerPadding +outgoingCertificates +outlierDetection +outpostArns +outpostConfig +output +outputArtifactDetails +outputArtifacts +outputConfiguration +outputConstraints +outputContexts +outputDataConfig +outputDetails +outputFileUriValue +outputFormat +outputLocation +outputModalities +outputModelArn +outputModelKmsKeyArn +outputModelName +outputNode +outputPath +outputResources +outputS3Bucket +outputS3BucketName +outputS3Directory +outputS3KeyPrefix +outputS3Path +outputS3Uri +outputSourceConfig +outputToken +outputType +outputUri +outputVariableName +outputVariables +outputs +overallStatus +overallTestResults +overridden +overrideAlarmConfiguration +overrideAllowedPrefixesToDirectConnectGateway +overrideArtifactName +overrideDynamicGroups +overrideFormat +overrideLinkOutUri +overrideStatus +overrider +overrides +ownedBy +owner +ownerAccount +ownerArn +ownerContact +ownerFilter +ownerId +ownerIdentifier +ownerInfo +owners +ownershipVerificationCertificateArn +owningAccountId +package +packageArn +packageCleanup +packageContent +packageFormat +packageManager +packageName +packageNames +packagePaths +packagePrefix +packageSummaries +packageType +packageVersion +packageVersionArn +packageVersionRevision +packageVersionSummaries +packageVulnerabilityDetails +packages +packaging +packetsDropped +page +pageNumber +pageSize +pageToken +pagerDutyIncidentConfiguration +pages +paginated +paginationConfig +parallelRun +parallelism +parallelismConfig +parameter +parameterApplyStatus +parameterConfiguration +parameterKey +parameterName +parameterObjects +parameterSets +parameterTemplate +parameterType +parameterValue +parameterValues +parameters +params +parent +parentAssetId +parentBotNetworks +parentCommitId +parentConnectionId +parentEntityId +parentEntityUpdate +parentGroup +parentGroupName +parentGroupNames +parentId +parentIdentifier +parentImage +parentInitiatedEventId +parentIntentSignature +parentResourceName +parentSlotTypeSignature +parentTargetArn +parentWorkflowExecution +parents +parquetConfiguration +parserConfiguration +parsingResultUrl +partFirstByte +partLastByte +partNumber +partSize +partSource +partial +participant +participantId +participantToken +participantTokenConfigurations +participantTokens +participants +participatingResourceID +participatingResources +participatingServers +partition +partitionColumns +partitionKey +partitionKeys +partitionRegistrationOutput +partitions +partner +partnerName +parts +passed +passthroughBehavior +password +passwordData +passwordVersion +pasteAllowed +patchOperations +path +pathFormat +pathMatch +pathPart +pathPrefixHierarchy +pathWithQueryString +pattern +payload +payloadField +payloadFormat +payloadFormatIndicator +payloadSize +payloadUrl +payloadVersion +payloads +paymentOption +paymentOptions +pemEncodedCertificate +pending +pendingCount +pendingMaintenance +pendingMaintenanceActions +pendingModifiedValues +pendingPlan +pendingPricingPlan +pendingRequestCount +pendingRequests +pendingTasksCount +perRequest +perRetryTimeout +percent +percentComplete +percentDone +percentPromotedItems +percentTraffic +percentageAdjust +percentageComplete +percentageProgress +percentiles +percents +performAutoML +performHPO +performanceRisk +period +periodInSeconds +periodMs +permission +permissionArn +permissionArns +permissionConfiguration +permissionGroup +permissionGroupId +permissionGroupParams +permissionGroups +permissionModel +permissionStatus +permissionType +permissionVersion +permissions +persistentAppUI +persistentStorage +persona +personalizedRanking +phaseStatus +phaseType +phases +phoneNumber +phoneNumbers +phrase +physicalConnectorType +physicalNetworkInterfaceId +physicalNetworkInterfaces +physicalResource +physicalResourceId +physicalResources +pid +pidMode +pidRequestIntervalSeconds +pidResponseLength +pinned +pipeline +pipelineActivities +pipelineActivity +pipelineArn +pipelineCodebuildRoleArn +pipelineConfig +pipelineConfigurationTimeStamp +pipelineContext +pipelineDescriptionList +pipelineExecution +pipelineExecutionId +pipelineExecutionStartCondition +pipelineExecutionSummaries +pipelineId +pipelineIdList +pipelineIds +pipelineInfoList +pipelineName +pipelineObjects +pipelineProvisioning +pipelineProvisioningRepository +pipelineServiceRoleArn +pipelineSummaries +pipelineType +pipelineVersion +pipelines +pitPolicy +placeholder +placement +placementConstraints +placementGroup +placementName +placementStrategy +placementTemplate +placements +plainTextMessage +planDescription +planType +planTypes +platform +platformCapabilities +platformDevices +platformDifferences +platformDisplayName +platformFamily +platformId +platformOverride +platformVersion +platformVersions +platforms +playbackUrl +pluginId +plugins +podExecutionRoleArn +podName +podProperties +pointInTimeRecovery +pointInTimeRecoveryOverride +pointInTimeSnapshotDateTime +polarization +policies +policy +policyArn +policyDescription +policyDetails +policyDocument +policyDocuments +policyGenerationDetails +policyGenerations +policyId +policyName +policyNamesToAdd +policyNamesToSkip +policyRevision +policySizeBytes +policyStatementsTemplate +policyStoreId +policyStores +policyTemplate +policyTemplateId +policyTemplates +policyText +policyType +policyVersion +policyVersionId +policyVersionIdentifier +policyVersions +pollingAccounts +pollingDisabledAt +pollingServicePrincipals +port +portEncryptionStatus +portForwardingConfig +portInfo +portInfoSource +portInformationNeeded +portInfos +portMapping +portMappings +portName +portNumber +portRange +portStates +portal +portalArn +portalAuthMode +portalClientId +portalContactEmail +portalCreationDate +portalDescription +portalEndpoint +portalId +portalLastUpdateDate +portalLogoImage +portalLogoImageFile +portalLogoImageLocation +portalName +portalStartUrl +portalStatus +portalSummaries +portals +ports +position +positive +posixUser +postCodeHookSpecification +postDirectional +postFulfillmentStatusSpecification +postLaunchActions +postLaunchActionsLaunchStatusList +postLaunchActionsStatus +postLaunchEnabled +postLaunchFile +postPassEndTime +postTriggerCollectionDuration +postalCode +postalCodePlus4 +postedDate +power +powerId +powers +preDirectional +preLaunchFile +prePassStartTime +preProvisioningHook +preSignedUrl +precision +predicate +predicateCount +predicates +predictedLabel +predictedScores +predictedValue +predictionExplanations +predictionTimeRange +predictionTimestamp +preferences +preferredBackupWindow +preferredMaintenanceWindow +preferredRegion +prefix +prefixConfig +prefixFormat +prefixListIds +prefixType +prerequisite +preserve +preserveNulls +preserveSourceDataTyping +preset +presignedUrlConfig +previewAgentsArn +previewResults +previewStatus +previewToken +previous +previousDataProcessingJobId +previousEventId +previousModelTrainingJobId +previousOwnedBy +previousRevision +previousStartedEventId +price +pricingMode +pricingTier +pricingUnit +primaryArtifact +primaryDevice +primaryEmail +primaryKey +primaryKeyColumns +primaryKeys +primaryRegistryAlias +primaryTaskSet +principal +principalArn +principalEntityType +principalId +principalSubscriber +principals +printAllowed +priorBuildSummaryList +prioritizeBusinessGoals +priority +privateConnectionProvisioningState +privateDnsName +privateDomainName +privateIpAddress +privateIpAddresses +privateIpv4Address +privateKey +privateKeyBase64 +privateLinkServiceName +privateRegistryAccess +privateRepository +privileged +privilegedMode +privilegedModeOverride +problems +processBehavior +processedDataS3Location +processedRecordsCount +processingConfig +processingConfiguration +processingInstanceType +processingInstanceVolumeSizeInGB +processingJob +processingTargets +processingTimeOutInSeconds +prodTrafficRoute +productCode +productId +productType +productTypes +productUrl +productionBranch +products +profile +profileArn +profileEndTime +profileId +profileName +profileOwner +profileProperties +profileStartTime +profileTimes +profileToken +profileUpdatedAt +profileVersion +profileVersionArn +profiles +profilingEnabled +profilingGroup +profilingGroupName +profilingGroupNames +profilingGroups +profilingStatus +progress +progressDetail +progressInMegaBytes +progressPercentage +progressStatus +project +projectArn +projectCreationDate +projectDescription +projectId +projectInformation +projectLastUpdateDate +projectName +projectRole +projectSummaries +projectTemplateId +projectVisibility +projectedMetrics +projectedUtilizationMetrics +projects +projectsNotFound +prometheusEndpoint +promotionName +promotions +prompt +promptAttemptsSpecification +promptSpecification +propagateTags +properties +propertiesFileContent +property +propertyAlias +propertyDefinitions +propertyFilters +propertyGroupName +propertyGroupUpdates +propertyGroups +propertyId +propertyName +propertyNames +propertyNotificationState +propertyReference +propertyUnit +propertyUpdates +propertyValue +propertyValues +proposalId +proposalState +protectedQueries +protectedQuery +protectedQueryIdentifier +protectedTasks +protectionEnabled +protocol +protocolDefinition +protocolName +protocolPolicy +protocolVersion +protocols +protonServiceRoleArn +provider +providerARNs +providerArn +providerIdentity +providerName +providers +provisionedCapacity +provisionedModelArn +provisionedModelId +provisionedModelName +provisionedModelSummaries +provisionedResources +provisioning +provisioningEngine +provisioningRepository +provisioningRoleArn +proxyConfiguration +proxyEndpoint +pseudoTerminal +publicAccess +publicAccessBlock +publicAccessCidrs +publicDnsName +publicDomainNames +publicEndpoint +publicIp +publicIpAddress +publicIpAddresses +publicKey +publicKeyBase64 +publicKeyMaterial +publicPorts +publicProjectAlias +publiclyAccessible +publiclyAccessibleCount +publiclyReadable +publiclyWritable +publish +publishAttributionMetricsToS3 +publishClassificationFindings +publishFindingToSnsParams +publishPolicyFindings +published +publishedTime +publisher +publishers +pullRequest +pullRequestCreatedEventMetadata +pullRequestEnvironmentName +pullRequestEventType +pullRequestEvents +pullRequestId +pullRequestIds +pullRequestMergedStateChangedEventMetadata +pullRequestSourceReferenceUpdatedEventMetadata +pullRequestStatus +pullRequestStatusChangedEventMetadata +pullRequestTargets +pullStartedAt +pullStoppedAt +pullThroughCacheRules +purchaseTime +purchasingOption +pushedAt +putAssetPropertyValueEntries +putFailuresCount +putFiles +putItem +qos +qualificationReportDownloadUrl +qualities +quality +quantity +quantumTaskArn +quantumTasks +queries +queriesFilePath +query +queryAction +queryCompileError +queryDefinitionId +queryDefinitionNamePrefix +queryDefinitions +queryEvalStats +queryFilterString +queryFilterStringEnabled +queryId +queryLogStatus +queryOptions +queryParam +queryParameters +queryParser +queryStatement +queryString +queryStringsAllowList +queryText +queryVersion +queryable +queue +queueInfo +queuePolicy +queuePriority +queueRequest +queueSize +queueUrl +queueUrls +queuedAt +queuedJobs +queuedTimeoutInMinutes +queuedTimeoutInMinutesOverride +quota +quotaCode +quotaName +quotaValue +quote +quoteAll +r53HostedZoneDeletionState +radio +radios +ramBytes +ramPerformanceMetricBasis +ramResourceShareRegion +ramSizeInGb +randomizationSalt +range +rangeKeyField +rangeKeyType +rangeKeyValue +rank +rate +rateIncreaseCriteria +rateLimit +rawData +rawError +rawValue +rdsHttpEndpointConfig +reaction +reactionCounts +reactionUserArn +reactionUsers +reactionValue +reactionsForComment +reactionsFromDeletedUsersCount +readCapacityUnits +readOnly +readOnlyRootFilesystem +readOptions +readSetId +readSets +readme +readonlyAccessAccounts +readonlyRootFilesystem +reason +reasonCode +reasonCodeSummaries +reasonForNonCompliance +reasonForNonComplianceCode +reasons +rebootAfterUse +receiverAccountId +receiverArn +recentCommunications +recentIntentSummaryView +recipe +recipeArn +recipeList +recipeOutputFormat +recipeProvider +recipeType +recipes +recipients +recognizedBotMember +recommendation +recommendationCompliance +recommendationExportJobs +recommendationId +recommendationIds +recommendationOptions +recommendationPreferenceNames +recommendationPreferences +recommendationPreferencesDetails +recommendationReportDetails +recommendationResourceType +recommendationSet +recommendationSourceArn +recommendationSourceType +recommendationSources +recommendationStatus +recommendationSummaries +recommendationTemplate +recommendationTemplateArn +recommendationTemplates +recommendationTypes +recommendations +recommended +recommendedActions +recommendedCpuUnits +recommendedInstanceType +recommendedMemorySize +recommendedMinorVersion +recommendedOptionProjectedMetrics +recommendedVersion +recommender +recommenderArn +recommenderConfig +recommenders +record +recordAllRosTopics +recordFormat +recordIndex +recordLength +recordMarkerDecisionAttributes +recordMarkerFailedEventAttributes +recordNumber +recording +recordingConfiguration +recordingConfigurationArn +recordingConfigurations +recordingGroup +recordingMode +recordingReconnectWindowSeconds +recordingStrategy +records +recordsMatched +recordsNotProcessed +recordsProcessed +recordsScanned +recoveryInstanceID +recoveryInstanceIDs +recoveryInstanceId +recoveryInstanceProperties +recoveryPoint +recoveryPointCreateTime +recoveryPointId +recoveryPoints +recoverySnapshotID +recurringCharges +recurringPaymentAmount +recursive +redirectUri +reduceOperationalOverheadWithManagedServices +ref +refValue +reference +referenceArn +referenceId +referenceStoreId +referenceStores +referenceType +referenceURLs +referenceUrls +referencedBy +referencedTables +references +refreshAfterInSeconds +refreshToken +refreshTokenBody +regex +regexConfiguration +regexFilter +region +regionFilter +regionList +regionMap +regionName +regionalCertificateArn +regionalCertificateName +regionalDomainName +regionalHostedZoneId +regions +registerAccountStatus +registerTime +registeredAt +registeredBy +registeredContainerInstancesCount +registeredDomainDelegationInfo +registeredResources +registeredTime +registeredTimeStamp +registrationCode +registrationConfig +registrationStatus +registries +registry +registryArn +registryCatalogData +registryCredential +registryCredentialOverride +registryId +registryIds +registryLogin +registryScanningConfiguration +registryUri +rejectDate +rejectReason +rejectedLogEventsInfo +rejectionStatement +rel +relatedDeployments +relatedEvents +relatedItemArn +relatedItemData +relatedItemId +relatedItems +relatedItemsUpdate +relatedJoinFieldName +relatedJoinTableName +relatedModelFields +relatedModelName +relatedResources +relatedVulnerabilities +relationalDatabase +relationalDatabaseAvailabilityZones +relationalDatabaseBlueprintId +relationalDatabaseBundleId +relationalDatabaseConfig +relationalDatabaseEvents +relationalDatabaseName +relationalDatabaseSnapshot +relationalDatabaseSnapshotName +relationalDatabaseSnapshots +relationalDatabaseSourceType +relationalDatabases +relationship +relationshipName +relationshipStatus +relationshipType +relationshipValue +relationships +relativeAggregationDuration +relativeFileVersion +relativeImpact +relativePath +release +releaseLabel +releaseVersion +relevanceLevel +relevanceScore +remaining +remainingResources +remediation +remoteAccess +remoteAccessAllowed +remoteAccessEnabled +remoteAccessSecurityGroup +remoteAccessSession +remoteAccessSessionArn +remoteAccessSessions +remoteDebugEnabled +remoteModelTransformJob +remoteParticipantId +remoteRecordAppArn +remoteRecordEnabled +remoteSourceCodeAnalysisServerConfigurationTimestamp +remoteSourceCodeAnalysisServerInfo +removableAttributes +removeAllowedPrefixesToDirectConnectGateway +removeAttributes +removeAuthorizerConfig +removeAutoRegistration +removeLabels +removeMetrics +removeNetworkAccessConfiguration +removeOverrideLinkOutUri +removePreProvisioningHook +removeSecurityGroupIds +removeSegment +removeSubnetIds +removeTaints +removeThingType +removeVariations +removeVpcConfiguration +renderConfig +renderTypeDeclarations +rendererType +renderingConfiguration +renderingEngine +renditionConfiguration +renditionSelection +renditions +renewalStatus +renewalStatusReason +renewalSummary +replace +replaceContents +replaceDefaultPolicyVersionParams +replacePermissionAssociationsWork +replacePermissionAssociationsWorks +replacementOrderArn +replacementType +replicated +replicatedDisks +replicatedExternally +replicatedStorageBytes +replicationAccounts +replicationConfiguration +replicationConfigurationStatus +replicationConfigurationTemplateID +replicationConfigurationTemplateIDs +replicationDetails +replicationDirection +replicationJob +replicationJobId +replicationJobList +replicationJobTerminated +replicationRegions +replicationRunId +replicationRunList +replicationServerInstanceType +replicationServersSecurityGroupsIDs +replicationSet +replicationSetArns +replicationSpecification +replicationStartedDateTime +replicationStatus +replicationStatusDetails +replicationStatusMessage +replicationStatuses +replicationStrategy +replicationType +replicationTypes +reportARN +reportArn +reportArns +reportBuildBatchStatusOverride +reportBuildStatus +reportBuildStatusOverride +reportDefinitions +reportDescription +reportFileFormat +reportFormat +reportFrequency +reportGroup +reportGroupArn +reportGroupArns +reportGroups +reportGroupsNotFound +reportId +reportName +reportNames +reportSummaries +reportType +reports +reportsNotFound +repositories +repositoriesNotFound +repository +repositoryArn +repositoryCloneMethod +repositoryConnectionArn +repositoryCount +repositoryCredentials +repositoryDescription +repositoryEndpoint +repositoryFilters +repositoryId +repositoryMetadata +repositoryName +repositoryNames +repositoryPolicy +repositoryPrefix +repositoryProvider +repositoryUri +reprocessingId +reprocessingSummaries +republish +request +requestAttributes +requestCancelActivityTaskDecisionAttributes +requestCancelActivityTaskFailedEventAttributes +requestCancelExternalWorkflowExecutionDecisionAttributes +requestCancelExternalWorkflowExecutionFailedEventAttributes +requestCancelExternalWorkflowExecutionInitiatedEventAttributes +requestCompression +requestContentType +requestEntries +requestEventStream +requestFailureReason +requestHeaders +requestId +requestMACSec +requestMappingTemplate +requestMessageId +requestMethod +requestModels +requestParameters +requestPayload +requestTemplates +requestTime +requestType +requestValidatorId +requestedAllowedPrefixesToDirectConnectGateway +requestedAt +requestedBy +requestedEndTime +requestedOn +requestedStartTime +requests +requireAuthorizationForCacheControl +requireInstanceProperties +required +requiredClaims +requiredFields +requiredProperties +requiresAttributes +requiresCompatibilities +requiresConfiguration +rescanDuration +rescanDurationState +rescannedStorageBytes +reservedCpuCores +reservedInstanceOptions +reset +resetActionConfiguration +resetActionRequests +resetTimer +resiliencyPolicies +resiliencyScore +resolution +resolutionId +resolutionSteps +resolutionStrategy +resolutionTechniques +resolutionType +resolveConflicts +resolvedAt +resolvedComponentVersions +resolvedConfiguration +resolvedImageDigest +resolvedReason +resolvedSourceVersion +resolvedTime +resolvedValues +resolver +resolverArn +resolvers +resource +resourceARN +resourceAccessRole +resourceArn +resourceArns +resourceConfiguration +resourceCount +resourceCounts +resourceCreationTime +resourceDefinitions +resourceDeletionTime +resourceDetails +resourceDigests +resourceErrors +resourceErrorsDetails +resourceFilterCriteria +resourceGroup +resourceGroupArn +resourceGroupArns +resourceGroupName +resourceGroupNames +resourceGroupTags +resourceGroups +resourceId +resourceIdentifier +resourceIdentifiers +resourceIds +resourceKeys +resourceLinks +resourceLogEvents +resourceMappings +resourceMetadata +resourceMethods +resourceName +resourceNames +resourceOwner +resourceOwnerAccount +resourcePolicies +resourcePolicy +resourcePrefix +resourceRecord +resourceRegionScope +resourceRequirements +resourceShare +resourceShareArn +resourceShareArns +resourceShareAssociations +resourceShareInvitation +resourceShareInvitationArn +resourceShareInvitationArns +resourceShareInvitations +resourceShareName +resourceShareStatus +resourceShares +resourceSpecification +resourceState +resourceStatus +resourceSubType +resourceTags +resourceType +resourceTypes +resources +resourcesAffected +resourcesBudgetEstimate +resourcesFlagged +resourcesIgnored +resourcesIncluded +resourcesProcessed +resourcesReceivingAccess +resourcesSummary +resourcesSuppressed +resourcesVpcConfig +response +responseCard +responseContentType +responseEventStream +responseMappingTemplate +responseModels +responseParameters +responsePayload +responsePlanArn +responsePlanSummaries +responseStreamingSupported +responseTemplates +responseTopic +responseType +responses +restApiId +restoreDate +restoreTime +restoreTimestamp +restoredTableARN +restrictPublicBuckets +restrictions +result +resultCode +resultConfiguration +resultCounts +resultFilterBy +resultFormat +resultFrame +resultId +resultList +resultSetMetadata +resultSetOptions +resultStat +resultStats +resultStatus +resultTypeFilter +results +resultsByTime +resultsData +resultsWritten +retain +retainedTopics +retentionDuration +retentionInDays +retentionMode +retentionPeriod +retiringPrincipal +retries +retryAfter +retryAfterSeconds +retryAttempt +retryMode +retryPolicy +retryPolicyConfiguration +retryPolicyExecution +retryStrategy +retryType +retryable +return +returnCode +returnInformation +returnReason +returnValue +reverseOrder +reversedDirectionSourceServerArn +reverted +revision +revisionChangeId +revisionChangeIdentifier +revisionChildren +revisionDag +revisionId +revisionInfo +revisionLocation +revisionNumber +revisionSummary +revisionType +revisionUrl +revisionUrlTemplate +revisions +revocationEffectiveFrom +revocationReason +revocationRecord +revocationSupported +revokedAt +revokedBy +revokedEntities +rewrite +rid +risk +riskScore +robot +robotApplicationNames +robotApplicationSummaries +robotApplications +robotDeploymentSummary +robotDeploymentTimeoutInSeconds +robotSoftwareSuite +robots +role +roleARN +roleAlias +roleAliasArn +roleAliasDescription +roleAliases +roleArn +roleArnForLogging +roleArns +roleCredentials +roleList +roleName +roleNameArn +roleType +roleValues +roles +rollDisposition +rollback +rollbackDeploymentId +rollbackInfo +rollbackMessage +rollbackStatus +rollbackTriggeringDeploymentId +rollingBackTrxCount +rollingBackTrxEarliestStartTime +rolloutState +rolloutStateReason +roomIdentifier +rooms +root +rootDeviceName +rootDirectory +rootGroup +rootResourceId +rootToParentThingGroups +rootVolume +rootVolumeName +rotateMasterUserPassword +rotateSecret +rotationSize +routableCIDRSpace +route +routeFilterPrefixes +routeName +routedResources +router +routerTypeIdentifier +routes +routingConfiguration +row +rowData +rowId +rowIds +rowIdsNotFound +rowNumber +rows +rowsToCreate +rowsToUpdate +rowsToUpsert +rpoDescription +rpoInSecs +rpoReferenceId +rtoDescription +rtoInSecs +rtoReferenceId +rule +ruleAction +ruleArn +ruleBasedProperties +ruleConfiguration +ruleContentSha256 +ruleDesc +ruleDetails +ruleDisabled +ruleEvaluation +ruleExecutionMode +ruleGroupsNamespace +ruleGroupsNamespaces +ruleID +ruleId +ruleIdentifier +ruleName +ruleNames +ruleNumber +ruleResults +ruleVersion +rules +rulesPackageArn +rulesPackageArns +rulesPackages +run +runAsGroup +runAsNonRoot +runAsUser +runContext +runEnvironment +runGroupId +runId +runLeftNormalization +runOnce +runOrder +runTimeAssessmentStatus +runWith +running +runningCount +runningQueryCount +runningTasksCount +runs +runtime +runtimeConfiguration +runtimeHintValues +runtimeHints +runtimeId +runtimePlatform +runtimeRoleArn +runtimeStatus +runtimeStatusMessage +runtimeVersion +runtimes +s3 +s3Bucket +s3BucketArn +s3BucketName +s3BucketOwner +s3BucketRegion +s3BucketSource +s3BucketTranscriptSource +s3Config +s3Configuration +s3DataDestination +s3DataSource +s3DeepLink +s3Destination +s3DestinationConfig +s3DestinationConfiguration +s3DestinationExportFileFormat +s3DestinationExportFileFormatOptions +s3DestinationUrl +s3EncryptionEnabled +s3Etags +s3ExportConfiguration +s3InputFileType +s3InputFormatConfig +s3JobDefinition +s3Key +s3KeyPrefix +s3Keys +s3KmsKeyArn +s3Location +s3LogBucket +s3Logs +s3LogsArn +s3Managed +s3MonitoringConfiguration +s3Object +s3ObjectKey +s3ObjectVersion +s3OutputEncryptionKMSKey +s3OutputFormatConfig +s3OutputKeyPrefix +s3Path +s3Paths +s3Prefix +s3Reference +s3RelativePath +s3ResourceArn +s3ResourcePath +s3Resources +s3ResourcesUpdate +s3StateFileUrl +s3Uri +s3Url +s3WordsList +s3bucketForAnalysisData +s3bucketForReportData +s3key +s3location +sageMakerStudioDomainUrl +sagemakerIamRoleArn +salesforce +saml +samlConfiguration +samlConfigurationStatus +samlMetadataDocument +samlMetadataURL +samlOptions +sample +sampleCount +sampleFailureReason +sampleId +sampleRate +sampleText +sampleUtterances +sampleUtterancesCount +sampleValue +samples +samplingPercentage +samplingRate +satelliteArn +satelliteId +satellites +savedownStorageConfiguration +savingsOpportunity +savingsOpportunityPercentage +savingsPlanArn +savingsPlanArns +savingsPlanId +savingsPlanIds +savingsPlanOffering +savingsPlanOfferingId +savingsPlanOfferingIds +savingsPlanPaymentOptions +savingsPlanType +savingsPlanTypes +savingsPlans +scalarFunctions +scale +scaleInCooldownSeconds +scaleInPolicy +scaleOutCooldownSeconds +scaleOutPolicy +scaling +scalingConfig +scanAll +scanFrequency +scanName +scanNameArn +scanOnPush +scanRate +scanState +scanStatus +scanStatusCode +scanStatusReason +scanType +scanningConfiguration +scanningConfigurations +scansWithMostOpenCriticalFindings +scansWithMostOpenFindings +sceneId +sceneMetadata +sceneSummaries +schedule +scheduleActivityTaskDecisionAttributes +scheduleActivityTaskFailedEventAttributes +scheduleEndTime +scheduleExpression +scheduleFrequency +scheduleLambdaFunctionDecisionAttributes +scheduleLambdaFunctionFailedEventAttributes +scheduleOffset +scheduleStartTime +scheduleTime +scheduleToCloseTimeout +scheduleToStartTimeout +scheduledAuditArn +scheduledAuditName +scheduledAudits +scheduledBefore +scheduledEventId +scheduledJobRollouts +scheduledOnOrAfter +scheduledSplitsConfig +scheduledSplitsDefinition +scheduledStartTime +schedulingConfig +schedulingPolicies +schedulingPolicyArn +schedulingPriority +schedulingPriorityOverride +schedulingStrategy +schema +schemaArn +schemaDefinition +schemaList +schemaName +schemaStorageConfig +schemaSummaries +schemaType +schemaVersion +schemas +scheme +scope +scopes +scoping +score +scoreDetails +scoreSource +scores +scoringVector +screenAutomationId +screenId +screenshots +script +scriptLocation +scriptLocationS3Bucket +scriptLocationS3Key +scriptModeConfig +scriptName +scriptOutputLocation +scriptParameters +scriptType +sdkType +searchCriteria +searchExpression +searchOrder +searchResults +searchTerm +searchableAttributes +searchedCompletely +searchedLogStreams +secondaryArtifacts +secondaryArtifactsOverride +secondaryAvailabilityZone +secondarySourceVersions +secondarySources +secondarySourcesOverride +secondarySourcesVersionOverride +seconds +secondsToLive +secret +secretARN +secretAccessKey +secretArn +secretId +secretKey +secretName +secretOptions +secretPolicy +secrets +secretsManagerKey +sectionalElements +sections +secureInitializationRoleArn +securityConfigDetail +securityConfigSummaries +securityContext +securityDetails +securityGroup +securityGroupIds +securityGroups +securityHubConfiguration +securityPolicy +securityPolicyDetail +securityPolicySummaries +securityProfileArn +securityProfileDescription +securityProfileIdentifier +securityProfileIdentifiers +securityProfileName +securityProfileTargetArn +securityProfileTargetMappings +securityProfileTargets +seed +seedReplicationTime +seedTime +seenAt +segment +segmentOverrides +segments +selectAttributes +selectedProperties +selectedTestList +selectionMode +selectionPattern +selector +selectors +seleniumProperties +semanticVersion +senderAccountId +senderId +sensitive +sensitiveData +sensitiveDataOccurrences +sensitivityInspectionTemplateId +sensitivityInspectionTemplates +sensitivityScore +sensitivityScoreOverridden +sensitivityScoreOverride +sentAt +sentiment +sentimentAnalysisSettings +sentimentLabel +sentimentResponse +sentimentScore +sep +separator +sequenceInformation +sequenceStoreId +sequenceStores +sequenceToken +serial +serialNumber +serializer +server +serverCatalogStatus +serverCertificateArn +serverCertificateArns +serverCertificateStatus +serverCertificateStatusDetail +serverCertificates +serverCriteria +serverDetail +serverError +serverErrorCategory +serverGroupId +serverGroupLaunchConfigurations +serverGroupReplicationConfigurations +serverGroupValidationConfigurations +serverGroups +serverId +serverImportFailure +serverImportSuccess +serverInfos +serverLaunchConfigurations +serverList +serverName +serverReplicationConfigurations +serverReplicationParameters +serverSideEncryption +serverSideEncryptionConfiguration +serverStrategies +serverType +serverUrl +serverValidationConfigurations +serverValidationOutput +serverValidationStrategy +servers +serversCount +serversMappedToApplications +serversMappedtoTags +service +serviceAccountName +serviceAccountRoleArn +serviceArn +serviceArns +serviceAttributes +serviceCode +serviceCodeList +serviceCodes +serviceConnectConfiguration +serviceConnectDefaults +serviceConnectEndpoint +serviceConnectResources +serviceDiscovery +serviceDnsName +serviceExecutionRoleArn +serviceId +serviceIdentifier +serviceInstance +serviceInstanceName +serviceInstances +serviceIpv4Cidr +serviceIpv6Cidr +serviceLimit +serviceLinkedRoleArn +serviceManagedS3 +serviceMetadata +serviceMode +serviceName +serviceNetworkArn +serviceNetworkId +serviceNetworkIdentifier +serviceNetworkName +serviceNetworkServiceAssociationIdentifier +serviceNetworkVpcAssociationIdentifier +serviceProviderSamlMetadata +serviceRecommendationOptions +serviceRegistries +serviceRole +serviceRoleArn +serviceRoleOverride +serviceSpec +serviceSyncBlocker +serviceSyncBlockerSummary +serviceSyncConfig +serviceTemplate +serviceTemplateVersion +serviceTemplates +serviceType +services +session +sessionArn +sessionAttributes +sessionBackup +sessionConfiguration +sessionContext +sessionDurationInMinutes +sessionEnabled +sessionExpirationTime +sessionId +sessionIds +sessionIssuer +sessionPersistenceMode +sessionPolicy +sessionState +sessionStorage +sessionSummaries +sessionTarget +sessionTimeout +sessionToken +sessionType +sessions +set +setAsActive +setAsDefault +setDefaultVersion +setFileModes +setTimer +setVariable +setting +settings +severities +severity +severityCode +severityCounts +severityLevels +sha +sha256 +sha256sum +shadow +shadowName +shape +shapeId +shardCapacity +shardCount +share +shareDecaySeconds +shareDistribution +shareId +shareIdentifier +shareName +shareUrl +sharedAccess +sharedAccountId +sharedMemorySize +sharedVia +shares +shippingAddress +shippingLabel +shortCode +shots +shouldOverwrite +shouldProfile +showThumbnails +shutdownAgentlessCollectors +shutdownAgents +shutdownConnectors +shutdownMeCollectors +sid +signalCatalogArn +signalDecoders +signalDecodersToAdd +signalDecodersToRemove +signalDecodersToUpdate +signalExternalWorkflowExecutionDecisionAttributes +signalExternalWorkflowExecutionFailedEventAttributes +signalExternalWorkflowExecutionInitiatedEventAttributes +signalName +signalsMap +signalsToCollect +signature +signatureAlgorithm +signatureContains +signatureCount +signatureDateTime +signatureExpiresAfter +signatureExpiresAt +signatureExpiresBefore +signatureInfo +signatureKeyId +signatureMap +signatureR +signatureS +signatureTimestamp +signatureV +signatureValid +signatureValidityPeriod +signedBiUrl +signedConnectionString +signedObject +signingConfiguration +signingDisabled +signingImageFormat +signingMaterial +signingParameters +signingProfileName +signingProfileParameter +signingRegion +signingServiceName +sigv4 +silent +simpleCriterion +simpleRule +simpleRuleEvaluation +simpleScopeTerm +simulationApplicationNames +simulationApplicationSummaries +simulationApplications +simulationJobBatchSummaries +simulationJobSummaries +simulationSoftwareSuite +simulationTimeMillis +simulationUnitLimit +since +site +siteLinkEnabled +sites +size +sizeClassified +sizeInBytes +sizeInBytesCompressed +sizeInGb +sizeInGiB +sizeInMiB +sizeLimit +skipAppResign +skipFinalSnapshot +skipResourceInUseCheck +skipped +skippedEntries +skippedFindingsCount +slackChannelConfigurations +slackWorkspaceConfigurations +slotCaptureSetting +slotConstraint +slotDiscrepancies +slotElicitationStyle +slotHints +slotId +slotMatchResult +slotMatchResultCounts +slotName +slotPriorities +slotResolutionResults +slotSpecifications +slotSummaries +slotToElicit +slotType +slotTypeCategory +slotTypeConfigurations +slotTypeId +slotTypeName +slotTypeSignature +slotTypeSummaries +slotTypeValues +slotTypeVersion +slotTypes +slotTypesCount +slots +slotsFilledInSession +smallVolumeConf +smallVolumeMaxSize +smsConfigurations +snapshot +snapshotArn +snapshotConfiguration +snapshotCreateTime +snapshotCreationTime +snapshotID +snapshotId +snapshotName +snapshotRemainingDays +snapshotRetentionPeriod +snapshotRetentionStartTime +snapshotTimeOfDay +snapshots +snoozeActionConfiguration +snoozeActionRequests +snoozeDuration +sns +snsPublishStatusCode +snsTopic +snsTopicARN +snsTopicArn +socketAddress +softLimit +software +solution +solutionArn +solutionConfig +solutionVersion +solutionVersionArn +solutionVersions +solutions +sopRecommendations +sort +sortBy +sortByAttribute +sortByOrder +sortColumns +sortCriteria +sortOrder +sorts +source +source1 +source2 +sourceAccessToken +sourceAccount +sourceAccountID +sourceApiArn +sourceApiAssociation +sourceApiAssociationConfig +sourceApiAssociationStatus +sourceApiAssociationStatusDetail +sourceApiAssociationSummaries +sourceApiId +sourceApiIdentifier +sourceArn +sourceArns +sourceAuthOverride +sourceBotVersion +sourceBranch +sourceCloudProperties +sourceCode +sourceCodeList +sourceCodeRepositories +sourceCodeRepository +sourceCommit +sourceCommitId +sourceCommitSpecifier +sourceConfiguration +sourceConnectionState +sourceConnectorLabel +sourceConnectorProperties +sourceConnectorType +sourceContainer +sourceCredentialsInfos +sourceData +sourceDatabaseName +sourceDescription +sourceDiskName +sourceFields +sourceFile +sourceFileType +sourceFiles +sourceFlowConfig +sourceFrequency +sourceId +sourceIdentifier +sourceImageSet +sourceImageSetId +sourceImageSetProperties +sourceInfo +sourceInstanceName +sourceIpAddress +sourceKeyspaceName +sourceKeyword +sourceLambdaLayerArn +sourceLayerHash +sourceLocationOverride +sourceName +sourceNetwork +sourceNetworkID +sourceNetworkIDs +sourceNetworks +sourceParams +sourcePath +sourcePipelineArn +sourcePipelineName +sourceProperties +sourceReference +sourceRegion +sourceRelationalDatabaseName +sourceRepository +sourceRepositoryName +sourceResourceName +sourceRevisions +sourceS3DirectoryPath +sourceS3Location +sourceS3Object +sourceSchemaName +sourceSecurityGroups +sourceServer +sourceServerArn +sourceServerID +sourceServerIDs +sourceServerId +sourceServerTags +sourceServers +sourceSetUpOption +sourceSnapshotName +sourceStatuses +sourceTableName +sourceType +sourceTypeOverride +sourceUrl +sourceVersion +sourceVolume +sourceVpc +sourceVpcID +sources +spaceName +span +sparkSqlJobDriver +sparkSqlParameters +sparkSubmitJobDriver +sparkSubmitParameters +sparql +spec +spectrumConfig +speechTranscriptionResult +speechTranscriptionResultCounts +speedOfMigration +sphere +spoolingMode +spotIamFleetRole +sql +sqlParameters +sqlQuery +sqlStatementResults +sqlStatements +sqs +srcCodeOrDbAnalysisStatus +sseConfig +sseKmsKeyId +sshKeyName +sshPublicKey +ssmAgentDiscoveryDatetime +ssmDocument +ssmDocumentName +ssmDocumentType +ssmDocuments +ssmOutput +ssmValidationParameters +ssmlMessage +ssoApplicationId +ssoClientId +ssoIdentity +stabilityStatus +stabilityStatusAt +stackId +stackName +stackParameters +stackSetName +stage +stageArn +stageDescription +stageDetails +stageKeys +stageName +stageProgress +stageSession +stageSessions +stageStates +stageVariableOverrides +stageVariables +stages +stagingAccountID +stagingAccountIDs +stagingArea +stagingAreaSubnetId +stagingAreaTags +stagingAvailabilityZone +stagingDiskType +stagingSourceServerArn +standardControlsCount +standardDeviation +start +startAfter +startAt +startAtPreviousStartedEvent +startBit +startByte +startCharOffset +startChildWorkflowExecutionDecisionAttributes +startChildWorkflowExecutionFailedEventAttributes +startChildWorkflowExecutionInitiatedEventAttributes +startColumn +startDate +startDateTime +startFromHead +startInclusive +startLambdaFunctionFailedEventAttributes +startLine +startOn +startPeriod +startResponse +startSigningJobParameter +startTime +startTimeFilter +startTimeInSeconds +startTimeOffsetInNanos +startTimeRange +startTimeout +startTimeoutMs +startTimerDecisionAttributes +startTimerFailedEventAttributes +startTimes +startTimestamp +startToCloseTimeout +startToFireTimeout +startToken +startUrl +started +startedAfter +startedAt +startedBefore +startedBy +startedEventId +startedFromBackupId +startedOn +startedTime +startingToken +stat +state +stateChangeConfiguration +stateChangeError +stateChangeTimeRange +stateChangedAt +stateChanges +stateDescription +stateDetail +stateDetails +stateEnteredEventDetails +stateExitedEventDetails +stateMachineAliasArn +stateMachineAliases +stateMachineArn +stateMachineName +stateMachineVersionArn +stateMachineVersions +stateMachines +stateName +stateOrProvince +stateReason +stateValue +statement +statementId +states +staticColumns +staticIp +staticIpName +staticIps +statistic +statisticalThreshold +statistics +statisticsId +stats +status +statusChangeTime +statusChangedAt +statusCode +statusCodes +statusCounts +statusDetail +statusDetails +statusEquals +statusFilter +statusList +statusMessage +statusReason +statusReportS3Bucket +statusReportS3Key +statusSummary +statusTimeoutInSeconds +statusType +statusUpdateDateTime +statuscode +statuses +stdDeviation +stddev +step +stepActionType +stepAutomationConfiguration +stepExecutionId +stepFunctions +stepGroupId +stepId +stepName +stepTarget +stepTargets +stepTimeoutInMinutes +steps +stillWaitingResponse +stmt +stopAction +stopAt +stopCode +stopConditions +stopDate +stopInstanceOnIdleRequest +stopTime +stopTimeout +stopTrigger +stopped +stoppedAt +stoppedBy +stoppedReason +stoppingAt +stoppingCondition +storage +storageCapacity +storageClass +storageCompressionFormat +storageConfigurations +storageGBHour +storageLocation +storagePerMonthInGb +storageType +storeArn +storeFormat +storeId +storeName +storeOptions +storeSizeBytes +storedBytes +strValues +strategy +strategyOption +stream +streamArn +streamConfiguration +streamId +streamInfo +streamKey +streamKeys +streamName +streamOutputToCloudWatch +streamSession +streamSessions +streamUI +streamUrl +streamVersion +streamingImage +streamingImageId +streamingImageIds +streamingImages +streamingSessionBackup +streamingSessionBackups +streams +streamsKmsKey +streamsKmsRole +street1 +street2 +street3 +streetInfo +streetName +streetNumber +streetSuffix +string +stringSetValue +stringValue +stringValues +strings +structurallyExclusive +studio +studioComponent +studioComponentId +studioComponentIds +studioComponentName +studioComponentSummaries +studioComponents +studioEncryptionConfiguration +studioId +studioName +studioUrl +studios +style +subDomainSetting +subDomainSettings +subDomains +subFolders +subModules +subResourceId +subSlotHints +subSlotSetting +subSlotToElicit +subSlots +subTitle +subdirectory +subject +subjectAlternativeNames +subjectArn +subjectId +subjectStructures +subjects +submit +submitTime +submittedAt +submittedBy +submitter +subnet +subnetId +subnetIds +subnets +subqueries +subscribedAt +subscriber +subscriberArn +subscriberDescription +subscriberEndpoint +subscriberId +subscriberIdentity +subscriberName +subscriberStatus +subscribers +subscriptionFilters +subscriptionProtocol +subscriptionType +subscriptions +subscriptionsFilePath +subtitle +subtype +succeeded +succeededFindingsCount +succeededWorldCount +succeededWorlds +success +successCodes +successConditional +successCount +successEntries +successNextStep +successResponse +successResponseHandlingConfig +successful +successfulEntries +successfulExecutions +successfulRequests +successfulSet +successfulVersions +suffix +suggest +suggestedChanges +suggestedFixes +suggester +suggestion +suggestions +suite +suiteDefinitionArn +suiteDefinitionConfiguration +suiteDefinitionId +suiteDefinitionInformationList +suiteDefinitionName +suiteDefinitionVersion +suiteRunArn +suiteRunConfiguration +suiteRunId +suiteRunsList +suites +sum +sumOfSquares +summaries +summary +summaryList +superuserParameters +supplementaryConfiguration +suppliedData +supportCode +supportedApiVersions +supportedAppCategories +supportedComponentSources +supportedDataTransferApis +supportedDataTransferTypes +supportedDateFormat +supportedDestinationConnectors +supportedFieldTypeDetails +supportedFormats +supportedHours +supportedLanguages +supportedLocales +supportedOperators +supportedOsVersions +supportedPlatforms +supportedRegions +supportedSchedulingFrequencies +supportedTriggerTypes +supportedValues +supportedVersion +supportedWriteOperations +supportsNitroInstances +suppressAlerts +suppressDataIdentifiers +suppressIndefinitely +suppressNextMessage +suppressed +suppressedAlertsIncluded +suppressedNonCompliantResourcesCount +suppressions +swappiness +symbolicLinks +syncConfig +syncDefinitions +syncFromResources +syncJobSummaries +syncResources +syncRole +syncSource +syncType +syncWithPublicNamespace +synonyms +systemControls +systemEvent +systemEvidenceCount +systemInfo +systemInitializationScripts +systemInstanceId +systemMessage +systemResourceLimits +systemsManagerAgent +tableArn +tableColumnId +tableColumnName +tableColumns +tableId +tableName +tablePrefix +tableReference +tableRegistrationOutput +tableRestoreRequestId +tableRestoreStatus +tableRestoreStatuses +tables +tabularConditions +tabularPropertyValues +tabularSchemaConfig +tag +tagCriterion +tagFilter +tagFilters +tagKey +tagKeyComparisonType +tagKeys +tagList +tagQueryConfiguration +tagScopeTerm +tagStatus +tagValue +tagValueComparisonType +tagValues +tags +tagsOverride +taints +target +targetAccount +targetAccountId +targetAccountIds +targetAction +targetArn +targetArns +targetAwsAccount +targetBitrate +targetBranch +targetCapacity +targetCheckNames +targetComponentName +targetComponentTypeId +targetDatabaseEngine +targetDatabaseName +targetDestination +targetEirp +targetEntityId +targetFileSize +targetFilters +targetFramerate +targetFrames +targetFramesIndex +targetGroup +targetGroupArn +targetGroupArns +targetGroupIdentifier +targetGroupInfoList +targetGroupPairInfoList +targetGroupType +targetGroups +targetId +targetIdentifier +targetIds +targetInstanceID +targetInstanceTypeRightSizingMethod +targetInstances +targetIntervalSeconds +targetKeyspaceName +targetName +targetNodes +targetPipeline +targetRegion +targetRepository +targetResolution +targetResource +targetResourceCount +targetResourceCreatedAt +targetResourceType +targetResourceTypes +targetRevision +targetRoleArn +targetSchemaName +targetSelection +targetSnapshotName +targetState +targetStatus +targetTableName +targetType +targetUrl +targetVersion +targetVersionWeight +targetVpc +targets +task +taskArn +taskArns +taskContext +taskCredentials +taskDefinition +taskDefinitionArn +taskDefinitionArns +taskDefinitions +taskEndTime +taskError +taskErrorDetails +taskFailedEventDetails +taskId +taskIdList +taskIds +taskInfos +taskList +taskListScheduleToStartTimeout +taskName +taskObject +taskPriority +taskProperties +taskRoleArn +taskScheduledEventDetails +taskSet +taskSetArn +taskSetLabel +taskSets +taskSetsInfo +taskStartFailedEventDetails +taskStartTime +taskStartToCloseTimeout +taskStartedEventDetails +taskStatistics +taskStatus +taskSubmitFailedEventDetails +taskSubmittedEventDetails +taskSucceededEventDetails +taskSummary +taskTimedOutEventDetails +taskToken +taskType +taskingDocument +taskrunnerId +tasks +tcpRetryEvents +tcpRoute +teamId +teamMembers +teamName +telemetryEndpoint +telemetryMetadata +template +templateArn +templateBody +templateFile +templateFormat +templateId +templateLocation +templateMajorVersion +templateMinorVersion +templateName +templateStepGroupSummary +templateStepSummaryList +templateSummaries +templateSummary +templateSyncConfig +templateType +templateUri +templateVersion +templateVersions +templates +templatesLocation +temporaryPassword +tenancy +tenant +tenantDisplayName +tenantId +tenantIdentifier +termDurationInSeconds +termLength +terminate +terminateAt +terminateBlueInstancesOnDeploymentSuccess +terminateInstanceOnFailure +terminateJobsOnUpdate +terminationWaitTimeInMinutes +termsAggregation +terraformSource +terraformSourceName +terraformSourceNames +terraformSources +test +testArtifactsUrl +testBotAliasTags +testCaseDefinitionId +testCaseDefinitionName +testCaseRunId +testCaseScenarioId +testCaseScenarioType +testCases +testConfigUrl +testDurationInMinutes +testExecutionId +testExecutionModality +testExecutionResults +testExecutionStatus +testExecutions +testGridProject +testGridProjects +testGridSession +testGridSessions +testId +testPackageArn +testRawDataPath +testRecommendations +testResult +testScenarios +testSetDiscrepancyRawOutputUrl +testSetDiscrepancyReportId +testSetDiscrepancyReportStatus +testSetDiscrepancyTopErrors +testSetExportSpecification +testSetGenerationId +testSetGenerationStatus +testSetId +testSetImportResourceSpecification +testSetName +testSetRecords +testSetTags +testSets +testSpecArn +testSummary +testTrafficRoute +testType +testingInformation +tests +text +textDataDeliveryEnabled +textInput +textInputSpecification +textLogSettings +textResponse +tfi +tgwStatus +theme +themeToCreate +then +thingArn +thingConnectivityIndexingMode +thingGroupArn +thingGroupDescription +thingGroupId +thingGroupIndexingConfiguration +thingGroupIndexingMode +thingGroupMetadata +thingGroupName +thingGroupNames +thingGroupProperties +thingGroups +thingGroupsToAdd +thingGroupsToRemove +thingId +thingIndexingConfiguration +thingIndexingMode +thingName +thingTypeArn +thingTypeDescription +thingTypeId +thingTypeMetadata +thingTypeName +thingTypeProperties +thingTypes +things +thirdPartyConfigurationUrl +threadStates +threadsPerCore +threshold +thresholdBreachValue +thresholdPercent +thresholdPercentage +thresholdValue +throttle +throttleSettings +throttling +throttlingBurstLimit +throttlingRateLimit +throughput +throughputInfo +throughputMode +thumbnailConfiguration +thumbnailUrl +thumbprint +tier +time +timeBasedCanary +timeBasedLinear +timeCreated +timeDimension +timeExpression +timeInMillis +timeInSeconds +timeOfCreation +timeOfEvent +timeOrdering +timePeriod +timeRange +timeSeriesArn +timeSeriesCreationDate +timeSeriesId +timeSeriesLastUpdateDate +timeSeriesType +timeToLive +timeToLiveInSeconds +timeValue +timedOut +timems +timeout +timeoutConditional +timeoutConfig +timeoutInMillis +timeoutInMins +timeoutInMinutes +timeoutInMinutesOverride +timeoutInSeconds +timeoutMillis +timeoutMinutes +timeoutNextStep +timeoutResponse +timeoutSeconds +timeoutType +timerCanceledEventAttributes +timerFiredEventAttributes +timerId +timerName +timerStartedEventAttributes +timers +timestamp +timestampFormat +timestampPartition +timestamps +timestream +timestreamDatabaseArn +timestreamDatabaseName +timestreamRegistrationResponse +timestreamResources +timestreamTableArn +timestreamTableName +timezone +tip +title +titles +tleData +tleLine1 +tleLine2 +tls +tlsCertificateSummaries +tlsCertificates +tlsConfig +tlsContext +tlsPolicies +tlsPolicyName +tmpfs +to +toBlockchainInstant +toDate +toDateTime +toPermissionArn +toPermissionVersion +toPort +token +tokenBalances +tokenEndpoint +tokenExpirationTime +tokenFilter +tokenId +tokenIdentifier +tokenKeyName +tokenName +tokenNameList +tokenSignature +tokenSigningPublicKeys +tokenType +tokenUrl +tokenUrlCustomProperties +tokenUrls +tokenValue +toleratedFailureCount +toleratedFailurePercentage +tooNewLogEventStartIndex +tooOldLogEventEndIndex +toolName +toolchain +tools +topMatches +topPanel +topic +topicArn +topicIntegrationArn +topicPattern +topicPolicy +topicRuleDestination +topicRulePayload +topologyFilter +total +totalActuators +totalAgentlessCollectors +totalAgents +totalApplications +totalAssessmentControlsCount +totalAttributes +totalBackupSizeInMegaBytes +totalBaseCount +totalBranches +totalBytesClassified +totalChecks +totalConnectors +totalControlsCount +totalCount +totalCounts +totalDataInMegaBytes +totalDetections +totalDetectionsSuppressed +totalDiscoveredResources +totalDurationInMillis +totalEdgePropertyValues +totalEvidence +totalExecutionDurationSeconds +totalFailureCount +totalFindingsCount +totalItemsClassified +totalItemsSensitive +totalItemsSkipped +totalItemsSkippedInvalidEncryption +totalItemsSkippedInvalidKms +totalItemsSkippedPermissionDenied +totalJobs +totalMeCollectors +totalNoOfSrv +totalNodePropertyValues +totalNodes +totalNumberOfFindings +totalNumberOfJobs +totalParts +totalReadCount +totalRecords +totalRecordsCount +totalRecordsProcessed +totalReservedMinuteAllocation +totalResourceUtilization +totalResources +totalResourcesCount +totalResultCount +totalResults +totalScheduledMinutes +totalSensors +totalServerGroups +totalServers +totalSizeInBytes +totalSizeInMegaBytes +totalSourceServers +totalStepCount +totalSteps +totalStepsFailed +totalStepsSkipped +totalStepsSucceeded +totalStorageBytes +totals +tpr +traceHeader +tracingConfiguration +tracingEnabled +trackerName +trackingConfigArn +trackingId +trackingInformation +trackingNamespaceName +trackingNamespaceVersion +trackingNumber +trafficGroupArn +trafficRoutingConfig +trafficWeight +trailList +trailNameList +trailProperties +trails +trainModelS3Location +trainingDataCollectionStartDate +trainingDataConfig +trainingDataSchema +trainingDataSource +trainingEntryPointScript +trainingHours +trainingInputMode +trainingInstanceType +trainingInstanceVolumeSizeInGB +trainingJobName +trainingLoss +trainingMetrics +trainingMetricsV2 +trainingMode +trainingResult +trainingResultV2 +trainingTimeOutInSeconds +trait +traits +tranformationToolInstallationLink +transaction +transactionFee +transactionHash +transactionId +transactionIndex +transactionStatus +transactionTimestamp +transactions +transcript +transcriptFilter +transcriptFormat +transcriptSourceSetting +transferData +transferDate +transferMessage +transferPerMonthInGb +transferredCertificateArn +transferredTo +transform +transformEntryPointScript +transformationTool +transitEncryption +transitEncryptionEnabled +transitEncryptionPort +transitGatewayConfiguration +transitGatewayID +transitionEvents +transitionType +transitions +transmitDisabled +transportProtocol +traversalDirection +traversalType +treatMissingData +treatmentName +treatmentNames +treatmentWeights +treatments +treeId +trendField +trialMinutes +trigger +triggerArn +triggerConfig +triggerConfigurations +triggerDetail +triggerDetails +triggerEvents +triggerMode +triggerName +triggerProperties +triggerTargetArn +triggerType +triggers +troubleshootingText +truncated +truncatedEvents +trust +trustAnchor +trustAnchorArn +trustAnchorId +trustAnchors +trustPolicy +trustStore +trustStoreArn +trustStores +truststoreUri +truststoreVersion +truststoreWarnings +ttl +ttps +tumbling +tunedHPOParams +tunnel +tunnelArn +tunnelId +tunnelSummaries +turnNumber +turnResult +turnSpecification +turnsToLive +type +typeFilter +typeHint +typeInfo +typeInfos +typeName +types +typesFilePath +udid +uid +ulimits +unauthorizedCacheControlHeaderStrategy +uncertaintyRange +unclassifiableObjectCount +unclassifiableObjectSizeInBytes +undoDeprecate +unencrypted +unfinished +unhealthyAgentlessCollectors +unhealthyAgents +unhealthyConnectors +unhealthyMeCollectors +unhealthyThreshold +unhealthyThresholdCount +unicode +uninstallAfterBuild +uniqueId +uniqueProblems +unit +unitLabel +unitOfMeasure +units +unknown +unknownAgentlessCollectors +unknownAgents +unknownConnectors +unknownMeCollectors +unlabeledEventsTreatment +unlimited +unmanagedvCpus +unmask +unmetered +unmeteredDevices +unmeteredRemoteAccessDevices +unprocessedAccounts +unprocessedEndTimes +unprocessedJobs +unprocessedResourceKeys +unprocessedWorlds +unsetDefaultVersion +unsuccessful +unsupportedResourceStatus +unsupportedResources +unvalidatedJSON +upToDate +upcomingMinutesScheduled +updatableAttributes +update +updateCACertificateParams +updateCollectionDetail +updateConfig +updateConfiguration +updateDate +updateDateTime +updateDeviceCertificateParams +updateId +updateIds +updateImageSetMetadataUpdates +updateInstructionBatch +updateMode +updateOutdatedInstancesOnly +updatePolicy +updateReason +updateResponse +updateResults +updateSingleCardinalityProperties +updateStatus +updateStatusReason +updateTime +updateTimestamp +updateToLatestImageVersion +updateType +updated +updatedAt +updatedBy +updatedByChangesetId +updatedComponent +updatedDate +updatedForm +updatedTheme +updatedTime +updatesChangesetId +upfrontPaymentAmount +uplinkBandwidthBits +uplinkDelayMs +uplinkJitterMs +uplinkLossPercent +upload +uploadAllowed +uploadBehavior +uploadConfigurations +uploadId +uploadSequenceToken +uploadStatus +uploadUrl +uploads +upperBoundValue +upperBoundValues +upperInclusive +upsertAction +upstream +upstreamRegistryUrl +upstreams +uri +uris +url +urlExpiry +urls +usage +usageCost +usageLimit +usageLimitArn +usageLimitId +usageLimits +usagePlanId +usageState +usageText +usageTotals +usageType +usageTypes +useBase64 +useCallerCredentials +useDedicatedReplicationServer +useDefaultApplications +useDefaultTools +useDefaultUploadConfigurations +useEventVariables +useExtendedIds +useFipsEndpoint +useLatestRestorableAutoSnapshot +useLatestRestorableTime +useOnly +usePrefixAttributeValue +usePrivateIP +usePrivateLinkForMetadataAndAuthorization +useStageCache +used +user +userAccessLoggingSettings +userAccessLoggingSettingsArn +userAccessResultsList +userAccessTasksList +userAgent +userArn +userAttribute +userAttributes +userAttributesForFindings +userCode +userData +userDataOverride +userDataValidationParameters +userFeedback +userFirstName +userFullName +userGroups +userId +userIdentity +userIds +userInitializationScripts +userLastName +userLoginName +userName +userPausedDetails +userPoolArn +userPoolConfig +userPoolId +userProfiles +userProperties +userProvidedEdgeIds +userProvidedID +userRole +userRoleArn +userRules +userSettings +userSettingsArn +userStatus +userTurn +userType +username +usernameClaim +usernamePrefix +users +utilizationMetrics +utterance +utteranceFirstRecordedInAggregationDuration +utteranceInput +utteranceLastRecordedInAggregationDuration +utteranceLevelTestResults +utteranceRequestId +utteranceString +utteranceTimestamp +utteranceUnderstood +utterances +uuid +v1 +v1BotLocale +v1BotName +v1BotNameContains +v1BotVersion +v2BotId +v2BotName +v2BotRole +vCPUHour +valid +validTimeRange +validZones +validatePolicyResourceType +validateRequestBody +validateRequestParameters +validatedDependencyRevisions +validatedNamespaceVersion +validation +validationCertificateArn +validationDataConfig +validationErrors +validationId +validationLoss +validationMessage +validationMetrics +validationOutputList +validationResults +validationSettings +validationStatus +validationWarnings +validations +validators +validity +value +valueElicitationPrompt +valueElicitationPromptSpecification +valueElicitationSetting +valueFrom +valueKey +valueMappings +valueRegexPattern +valueSelectionSetting +valueSelectionStrategy +valueSet +valueString +valueType +values +variableEntries +variableImpactExplanations +variableImportance +variableImportanceMetrics +variableName +variableNames +variableType +variables +variance +variantImportJobs +variantStores +variantValues +variants +variation +variations +vaultName +vaultNotificationConfig +vcenterBasedRemoteInfoList +vcenterClientID +vcenterConfigurationTimeStamp +vcenterUUID +vcpus +vehicleName +vehicleSummaries +vehicles +vendor +vendorAdditionalFixedProperties +vendorAdditionalTransientProperties +vendorCreatedAt +vendorGuidance +vendorGuidanceMessage +vendorProperties +vendorSeverity +vendorUpdatedAt +vendorWorkerId +vendorWorkerIpAddress +verificationCertificate +verificationState +verificationStateDescription +verificationUri +verificationUriComplete +verified +version +versionArn +versionCode +versionControl +versionControlConfigurationTimeStamp +versionControlInfoList +versionControlType +versionDescription +versionId +versionInfo +versionName +versionNumber +versionOptions +versionOrAlias +versionQualifier +versionRequirement +versionRequirements +versionRevision +versionRevisions +versionSizeBytes +versionStatus +versionUpdateByJobsConfig +versioned +versioning +versioningConfiguration +versions +verticalGap +veryLow +video +videoCapture +videoEndpoint +videoHeight +videoWidth +viewerCount +viewerId +viewerSessionVersionsLessThanOrEqualTo +viewerSessions +violationEventAdditionalInfo +violationEventOccurrenceRange +violationEventTime +violationEventType +violationEvents +violationId +violationIds +violationStartTime +virtualCluster +virtualClusterId +virtualClusterIdentifier +virtualClusters +virtualGateway +virtualGatewayId +virtualGatewayName +virtualGatewayOwnerAccount +virtualGatewayRegion +virtualGatewayState +virtualGateways +virtualInterface +virtualInterfaceId +virtualInterfaceName +virtualInterfaceOwnerAccount +virtualInterfaceRegion +virtualInterfaceState +virtualInterfaceTest +virtualInterfaceTestHistory +virtualInterfaceType +virtualInterfaces +virtualName +virtualNode +virtualNodeName +virtualNodes +virtualRouter +virtualRouterName +virtualRouters +virtualService +virtualServiceName +virtualServices +visibility +vlan +vmId +vmImportTaskId +vmManagerId +vmManagerName +vmManagerType +vmName +vmPath +vmServer +vmServerAddress +vmServerAddressList +vmWareUuid +vnfConfigurableProperties +vnfInstanceId +vnfPkgId +vnfPkgIds +vnfPkgName +vnfProductName +vnfProvider +vnfState +vnfcResourceInfo +vnfd +vnfdId +vnfdVersion +voiceId +voiceSettings +volumeArn +volumeArns +volumeBaselineIOPS +volumeBaselineThroughput +volumeBurstIOPS +volumeBurstThroughput +volumeConfiguration +volumeEncryptionKMSKey +volumeId +volumeMounts +volumeRecommendationOptions +volumeRecommendations +volumeRetentionMode +volumeSize +volumeSizeInGB +volumeSizeInGb +volumeToConversionMap +volumeToVolumeSize +volumeType +volumes +volumesFrom +voutIndex +vpc +vpcConfig +vpcConfiguration +vpcDestinationSummary +vpcEndpoint +vpcEndpointDetails +vpcEndpointErrorDetails +vpcEndpointFilters +vpcEndpointId +vpcEndpointIds +vpcEndpointSummaries +vpcEndpoints +vpcID +vpcId +vpcIdentifier +vpcLinkId +vpcProperties +vpcSecurityGroupId +vpcSecurityGroupIds +vpcSecurityGroups +vpceConfiguration +vpceConfigurationArns +vpceConfigurationDescription +vpceConfigurationName +vpceConfigurations +vpceIds +vpceServiceName +vss +vulnerabilities +vulnerability +vulnerabilityId +vulnerabilityIdAggregation +vulnerabilityIds +vulnerabilitySource +vulnerabilitySourceUpdatedAt +vulnerablePackages +wafWebAclArn +waitAndContinueSpecification +waitTimeInMinutes +waitTimeSeconds +waited +waitingForDataCollectionChecks +waitingResponse +warehouse +warned +warnings +waveAggregatedStatus +waveID +waveIDs +waves +wavesCount +webAclArn +webUrl +webhook +webhookArn +webhookId +webhookName +webhookUrl +webhooks +weeklySchedule +weight +weightFactor +weightedTargets +weights +welcomeMessages +width +wifi +window +windows +windowsMountDrive +windowsUser +witnessedAt +workIds +workbookCursor +workbookId +workerConfiguration +workerConfigurationArn +workerConfigurations +workerCount +workerFleets +workerGroup +workerLogDelivery +workerName +workerTypeSpecifications +workers +workflowArn +workflowBucket +workflowBuildVersionArn +workflowExecution +workflowExecutionCancelRequestedEventAttributes +workflowExecutionCanceledEventAttributes +workflowExecutionCompletedEventAttributes +workflowExecutionContinuedAsNewEventAttributes +workflowExecutionFailedEventAttributes +workflowExecutionId +workflowExecutionRetentionPeriodInDays +workflowExecutionSignaledEventAttributes +workflowExecutionStartedEventAttributes +workflowExecutionTerminatedEventAttributes +workflowExecutionTimedOutEventAttributes +workflowExecutions +workflowId +workflowInputs +workflowName +workflowStepAutomationConfiguration +workflowStepGroupsSummary +workflowStepsSummary +workflowSummaries +workflowType +workflowTypeVersion +workgroup +workgroupArn +workgroupId +workgroupName +workgroups +workingDirectory +workspace +workspaceDataSources +workspaceDescription +workspaceId +workspaceName +workspaceNotificationDestinations +workspaceOrganizationalUnits +workspaceRoleArn +workspaceSummaries +workspaces +world +worldConfigs +worldCount +worldDescriptionBody +worldExportJobSummaries +worldGenerationJobSummaries +worldSummaries +worldTags +worlds +writeCapacityUnits +writeOperationType +x +x509CertificateData +x509Subject +xAmzErrorType +xmlNamespace +xrayEnabled +xsltTemplateName +xsltTemplateNameForMacSec +y +year +z +zipUploadUrl +zonalShiftId +zonalShifts +zoneName diff --git a/codegen-core/src/test/resources/testOutput.txt b/codegen-core/src/test/resources/testOutput.txt new file mode 100644 index 00000000000..08b51fdf854 --- /dev/null +++ b/codegen-core/src/test/resources/testOutput.txt @@ -0,0 +1,62988 @@ +ACL,acl +ACLAlreadyExistsFault,acl_already_exists_fault +ACLName,acl_name +ACLNames,acl_names +ACLNotFoundFault,acl_not_found_fault +ACLPendingChanges,acl_pending_changes +ACLQuotaExceededFault,acl_quota_exceeded_fault +ACLToApply,acl_to_apply +ACLs,acls +ACLsUpdateStatus,acls_update_status +ACMCertificateArn,acm_certificate_arn +ACTIVE,active +ADDomainJoinPassword,ad_domain_join_password +ADDomainJoinUser,ad_domain_join_user +ADM,adm +ADMChannelRequest,adm_channel_request +ADMChannelResponse,adm_channel_response +ADMMessage,adm_message +ALPNPolicyNotSupportedException,alpn_policy_not_supported_exception +APICallRateForCustomerExceededFault,api_call_rate_for_customer_exceeded_fault +APIKey,api_key +APIKeySummaries,api_key_summaries +APIKeySummary,api_key_summary +APIName,api_name +APNS,apns +APNSChannelRequest,apns_channel_request +APNSChannelResponse,apns_channel_response +APNSMessage,apns_message +APNSPushNotificationTemplate,apns_push_notification_template +APNSPushType,apns_push_type +APNSSandboxChannelRequest,apns_sandbox_channel_request +APNSSandboxChannelResponse,apns_sandbox_channel_response +APNSVoipChannelRequest,apns_voip_channel_request +APNSVoipChannelResponse,apns_voip_channel_response +APNSVoipSandboxChannelRequest,apns_voip_sandbox_channel_request +APNSVoipSandboxChannelResponse,apns_voip_sandbox_channel_response +ARN,arn +ASN1Subject,asn1_subject +ASName,as_name +ASNumber,as_number +ASSERTION,assertion +ATIMetricDataPoint,ati_metric_data_point +ATIModelPerformance,ati_model_performance +ATITrainingMetricsValue,ati_training_metrics_value +AWSAccessKeyId,aws_access_key_id +AWSAccount,aws_account +AWSAccountId,aws_account_id +AWSAccountIds,aws_account_ids +AWSCost,aws_cost +AWSDomainInformation,aws_domain_information +AWSKMSKeyARN,awskms_key_arn +AWSLocation,aws_location +AWSManagedRulesACFPRuleSet,aws_managed_rules_acfp_rule_set +AWSManagedRulesATPRuleSet,aws_managed_rules_atp_rule_set +AWSManagedRulesBotControlRuleSet,aws_managed_rules_bot_control_rule_set +AWSOrganizationsNotInUseException,aws_organizations_not_in_use_exception +AWSService,aws_service +AWSServiceAccessNotEnabledException,aws_service_access_not_enabled_exception +AWSServiceName,aws_service_name +AWSSessionCredentials,aws_session_credentials +AZList,az_list +AZMode,az_mode +AacSettings,aac_settings +AbortConfig,abort_config +AbortCriteria,abort_criteria +AbortDate,abort_date +AbortDocumentVersionUploadRequest,abort_document_version_upload_request +AbortEnvironmentUpdateMessage,abort_environment_update_message +AbortIncompleteMultipartUpload,abort_incomplete_multipart_upload +AbortMultipartReadSetUploadRequest,abort_multipart_read_set_upload_request +AbortMultipartUploadInput,abort_multipart_upload_input +AbortMultipartUploadOutput,abort_multipart_upload_output +AbortMultipartUploadRequest,abort_multipart_upload_request +AbortRuleId,abort_rule_id +AbortTransaction,abort_transaction +AbortTransactionResult,abort_transaction_result +AbortVaultLockInput,abort_vault_lock_input +AbortableOperationInProgress,abortable_operation_in_progress +AbpV1_0_x,abp_v1_0_x +AbpV1_1,abp_v1_1 +AbrSettings,abr_settings +AbsentInputAudioBehavior,absent_input_audio_behavior +AbsoluteTime,absolute_time +AbsoluteTimeRange,absolute_time_range +AbuseContactEmail,abuse_contact_email +AbuseContactPhone,abuse_contact_phone +Ac3Settings,ac3_settings +AccelerateConfiguration,accelerate_configuration +AccelerationSettings,acceleration_settings +AccelerationStatus,acceleration_status +Accelerator,accelerator +AcceleratorArn,accelerator_arn +AcceleratorAttributes,accelerator_attributes +AcceleratorCount,accelerator_count +AcceleratorCountRequest,accelerator_count_request +AcceleratorEvent,accelerator_event +AcceleratorManufacturers,accelerator_manufacturers +AcceleratorNames,accelerator_names +AcceleratorNotDisabledException,accelerator_not_disabled_exception +AcceleratorNotFoundException,accelerator_not_found_exception +AcceleratorPort,accelerator_port +AcceleratorSocketAddresses,accelerator_socket_addresses +AcceleratorTotalMemoryMiB,accelerator_total_memory_mib +AcceleratorTotalMemoryMiBRequest,accelerator_total_memory_mib_request +AcceleratorType,accelerator_type +AcceleratorTypeOffering,accelerator_type_offering +AcceleratorTypes,accelerator_types +Accelerators,accelerators +Accent,accent +AccentForeground,accent_foreground +Accept,accept +AcceptAddressTransferRequest,accept_address_transfer_request +AcceptAddressTransferResult,accept_address_transfer_result +AcceptAdministratorInvitationRequest,accept_administrator_invitation_request +AcceptAnyDate,accept_any_date +AcceptAttachmentRequest,accept_attachment_request +AcceptAttachmentResponse,accept_attachment_response +AcceptCertificateTransferRequest,accept_certificate_transfer_request +AcceptCode,accept_code +AcceptCodeValidation,accept_code_validation +AcceptDirectConnectGatewayAssociationProposalRequest,accept_direct_connect_gateway_association_proposal_request +AcceptDirectConnectGatewayAssociationProposalResult,accept_direct_connect_gateway_association_proposal_result +AcceptDomainTransferFromAnotherAwsAccountRequest,accept_domain_transfer_from_another_aws_account_request +AcceptDomainTransferFromAnotherAwsAccountResponse,accept_domain_transfer_from_another_aws_account_response +AcceptEnvironmentAccountConnectionInput,accept_environment_account_connection_input +AcceptEnvironmentAccountConnectionOutput,accept_environment_account_connection_output +AcceptEulasRequest,accept_eulas_request +AcceptEulasResponse,accept_eulas_response +AcceptGrantRequest,accept_grant_request +AcceptGrantResponse,accept_grant_response +AcceptHandshakeRequest,accept_handshake_request +AcceptHandshakeResponse,accept_handshake_response +AcceptInboundConnectionRequest,accept_inbound_connection_request +AcceptInboundConnectionResponse,accept_inbound_connection_response +AcceptInboundCrossClusterSearchConnectionRequest,accept_inbound_cross_cluster_search_connection_request +AcceptInboundCrossClusterSearchConnectionResponse,accept_inbound_cross_cluster_search_connection_response +AcceptInputDeviceTransferRequest,accept_input_device_transfer_request +AcceptInvitationRequest,accept_invitation_request +AcceptLanguage,accept_language +AcceptMatchInput,accept_match_input +AcceptPageRequest,accept_page_request +AcceptPortfolioShareInput,accept_portfolio_share_input +AcceptQualificationRequestRequest,accept_qualification_request_request +AcceptRanges,accept_ranges +AcceptReservedInstancesExchangeQuoteRequest,accept_reserved_instances_exchange_quote_request +AcceptReservedInstancesExchangeQuoteResult,accept_reserved_instances_exchange_quote_result +AcceptReservedNodeExchangeInputMessage,accept_reserved_node_exchange_input_message +AcceptReservedNodeExchangeOutputMessage,accept_reserved_node_exchange_output_message +AcceptResourceShareInvitationRequest,accept_resource_share_invitation_request +AcceptResourceShareInvitationResponse,accept_resource_share_invitation_response +AcceptShareRequest,accept_share_request +AcceptShareResponse,accept_share_response +AcceptSharedDirectoryRequest,accept_shared_directory_request +AcceptSharedDirectoryResult,accept_shared_directory_result +AcceptTermsAndConditions,accept_terms_and_conditions +AcceptTime,accept_time +AcceptTransitGatewayMulticastDomainAssociationsRequest,accept_transit_gateway_multicast_domain_associations_request +AcceptTransitGatewayMulticastDomainAssociationsResult,accept_transit_gateway_multicast_domain_associations_result +AcceptTransitGatewayPeeringAttachmentRequest,accept_transit_gateway_peering_attachment_request +AcceptTransitGatewayPeeringAttachmentResult,accept_transit_gateway_peering_attachment_result +AcceptTransitGatewayVpcAttachmentRequest,accept_transit_gateway_vpc_attachment_request +AcceptTransitGatewayVpcAttachmentResult,accept_transit_gateway_vpc_attachment_result +AcceptType,accept_type +AcceptVpcEndpointConnectionsRequest,accept_vpc_endpoint_connections_request +AcceptVpcEndpointConnectionsResult,accept_vpc_endpoint_connections_result +AcceptVpcPeeringConnectionRequest,accept_vpc_peering_connection_request +AcceptVpcPeeringConnectionResult,accept_vpc_peering_connection_result +AcceptanceRequired,acceptance_required +AcceptanceThreshold,acceptance_threshold +AcceptanceTimeoutSeconds,acceptance_timeout_seconds +AcceptanceType,acceptance_type +Accepted,accepted +AcceptedRouteCount,accepted_route_count +AccepterPeeringConnectionOptions,accepter_peering_connection_options +AccepterTgwInfo,accepter_tgw_info +AccepterTransitGatewayAttachmentId,accepter_transit_gateway_attachment_id +AccepterVpcInfo,accepter_vpc_info +Access,access +AccessAll,access_all +AccessAlternateDirectly,access_alternate_directly +AccessBasedEnumeration,access_based_enumeration +AccessConfiguration,access_configuration +AccessControl,access_control +AccessControlAllowCredentials,access_control_allow_credentials +AccessControlAllowHeaders,access_control_allow_headers +AccessControlAllowMethods,access_control_allow_methods +AccessControlAllowOrigins,access_control_allow_origins +AccessControlAttribute,access_control_attribute +AccessControlAttributeValue,access_control_attribute_value +AccessControlAttributes,access_control_attributes +AccessControlConfigurationId,access_control_configuration_id +AccessControlConfigurationSummary,access_control_configuration_summary +AccessControlConfigurations,access_control_configurations +AccessControlEntries,access_control_entries +AccessControlEntry,access_control_entry +AccessControlEntrySummary,access_control_entry_summary +AccessControlExposeHeaders,access_control_expose_headers +AccessControlGrants,access_control_grants +AccessControlList,access_control_list +AccessControlListConfiguration,access_control_list_configuration +AccessControlMaxAgeSec,access_control_max_age_sec +AccessControlPolicy,access_control_policy +AccessControlRule,access_control_rule +AccessControlTranslation,access_control_translation +AccessDenied,access_denied +AccessDeniedException,access_denied_exception +AccessDeniedFault,access_denied_fault +AccessDeniedForDependencyException,access_denied_for_dependency_exception +AccessDescription,access_description +AccessDetail,access_detail +AccessDetails,access_details +AccessEndpoint,access_endpoint +AccessEndpoints,access_endpoints +AccessForbidden,access_forbidden +AccessGroupId,access_group_id +AccessKey,access_key +AccessKeyDetails,access_key_details +AccessKeyId,access_key_id +AccessKeyLastUsed,access_key_last_used +AccessKeyMetadata,access_key_metadata +AccessLevelFilter,access_level_filter +AccessLocation,access_location +AccessLog,access_log +AccessLogSettings,access_log_settings +AccessLogSubscriptionSummary,access_log_subscription_summary +AccessLoggingEnabled,access_logging_enabled +AccessLogs,access_logs +AccessMethod,access_method +AccessMethodType,access_method_type +AccessPoint,access_point +AccessPointAlreadyExists,access_point_already_exists +AccessPointArn,access_point_arn +AccessPointDescription,access_point_description +AccessPointId,access_point_id +AccessPointLimitExceeded,access_point_limit_exceeded +AccessPointList,access_point_list +AccessPointNotFound,access_point_not_found +AccessPointNotFoundException,access_point_not_found_exception +AccessPoints,access_points +AccessPolicies,access_policies +AccessPoliciesStatus,access_policies_status +AccessPolicy,access_policy +AccessPolicyDetail,access_policy_detail +AccessPolicyStats,access_policy_stats +AccessPolicySummary,access_policy_summary +AccessPreview,access_preview +AccessPreviewFinding,access_preview_finding +AccessPreviewStatusReason,access_preview_status_reason +AccessPreviewSummary,access_preview_summary +AccessRights,access_rights +AccessRole,access_role +AccessRoleArn,access_role_arn +AccessRules,access_rules +AccessScopeAnalysisFinding,access_scope_analysis_finding +AccessScopePath,access_scope_path +AccessScopePathRequest,access_scope_path_request +AccessStatus,access_status +AccessString,access_string +AccessSysfs,access_sysfs +AccessTier,access_tier +AccessToClusterDeniedFault,access_to_cluster_denied_fault +AccessToSnapshotDeniedFault,access_to_snapshot_denied_fault +AccessToken,access_token +AccessTokenExpiration,access_token_expiration +AccessTokenSummary,access_token_summary +AccessTokenValidity,access_token_validity +AccessType,access_type +AccessUrl,access_url +Accesses,accesses +Accessibility,accessibility +AccessibilityCaptionHints,accessibility_caption_hints +Accessor,accessor +AccessorId,accessor_id +AccessorSummary,accessor_summary +AccessorType,accessor_type +Accessors,accessors +Account,account +AccountActionRequiredException,account_action_required_exception +AccountAggregation,account_aggregation +AccountAggregationResponse,account_aggregation_response +AccountAggregationSource,account_aggregation_source +AccountAggregationSources,account_aggregation_sources +AccountAlias,account_alias +AccountAliases,account_aliases +AccountAlreadyClosedException,account_already_closed_exception +AccountAlreadyRegisteredException,account_already_registered_exception +AccountAssignment,account_assignment +AccountAssignmentCreationRequestId,account_assignment_creation_request_id +AccountAssignmentCreationStatus,account_assignment_creation_status +AccountAssignmentDeletionRequestId,account_assignment_deletion_request_id +AccountAssignmentDeletionStatus,account_assignment_deletion_status +AccountAssignmentOperationStatus,account_assignment_operation_status +AccountAssignmentOperationStatusMetadata,account_assignment_operation_status_metadata +AccountAssignments,account_assignments +AccountAssignmentsCreationStatus,account_assignments_creation_status +AccountAssignmentsDeletionStatus,account_assignments_deletion_status +AccountAssociationsListElement,account_associations_list_element +AccountAttribute,account_attribute +AccountAttributeList,account_attribute_list +AccountAttributeValue,account_attribute_value +AccountAttributes,account_attributes +AccountAttributesMessage,account_attributes_message +AccountChannelLimitExceededException,account_channel_limit_exceeded_exception +AccountConfiguration,account_configuration +AccountCustomization,account_customization +AccountDetail,account_detail +AccountDetails,account_details +AccountEmail,account_email +AccountEnrollmentStatus,account_enrollment_status +AccountEntityAggregate,account_entity_aggregate +AccountFilterType,account_filter_type +AccountFindingsMetric,account_findings_metric +AccountFreeTrialInfo,account_free_trial_info +AccountGateResult,account_gate_result +AccountGrouping,account_grouping +AccountHasOngoingImportException,account_has_ongoing_import_exception +AccountHealth,account_health +AccountID,account_id +AccountId,account_id +AccountIds,account_ids +AccountIdsToAdd,account_ids_to_add +AccountIdsToRemove,account_ids_to_remove +AccountInfo,account_info +AccountInsightHealth,account_insight_health +AccountLevel,account_level +AccountLevelBpaSync,account_level_bpa_sync +AccountLevelPermissions,account_level_permissions +AccountLimit,account_limit +AccountLimitExceededException,account_limit_exceeded_exception +AccountLimits,account_limits +AccountLinked,account_linked +AccountMaxReadCapacityUnits,account_max_read_capacity_units +AccountMaxWriteCapacityUnits,account_max_write_capacity_units +AccountModification,account_modification +AccountModifications,account_modifications +AccountName,account_name +AccountNotFoundException,account_not_found_exception +AccountNotRegisteredException,account_not_registered_exception +AccountNumber,account_number +AccountOwnerNotVerifiedException,account_owner_not_verified_exception +AccountPassword,account_password +AccountPolicy,account_policy +AccountQuota,account_quota +AccountQuotaName,account_quota_name +AccountQuotas,account_quotas +AccountRecoverySetting,account_recovery_setting +AccountRecoverySettingType,account_recovery_setting_type +AccountRegisteredException,account_registered_exception +AccountScope,account_scope +AccountSendingPausedException,account_sending_paused_exception +AccountSettings,account_settings +AccountSettingsDetail,account_settings_detail +AccountSetupInProgressException,account_setup_in_progress_exception +AccountSharingInfo,account_sharing_info +AccountSharingInfoList,account_sharing_info_list +AccountState,account_state +AccountStatus,account_status +AccountStatusList,account_status_list +AccountStreamLimitExceededException,account_stream_limit_exceeded_exception +AccountSubscriptionStatus,account_subscription_status +AccountSummary,account_summary +AccountSuspendedException,account_suspended_exception +AccountTakeoverActionType,account_takeover_action_type +AccountTakeoverActionsType,account_takeover_actions_type +AccountTakeoverRiskConfiguration,account_takeover_risk_configuration +AccountTakeoverRiskConfigurationType,account_takeover_risk_configuration_type +AccountType,account_type +AccountUsage,account_usage +AccountWithRestoreAccess,account_with_restore_access +Accounts,accounts +AccountsUrl,accounts_url +AccountsWithRestoreAccess,accounts_with_restore_access +AccumulatedInferenceDataEndTime,accumulated_inference_data_end_time +AccumulatedInferenceDataStartTime,accumulated_inference_data_start_time +Accuracy,accuracy +AccuracyCostTradeoff,accuracy_cost_tradeoff +AckModeRetryDurationSecs,ack_mode_retry_duration_secs +AcknowledgeActionConfiguration,acknowledge_action_configuration +AcknowledgeAlarmActionRequest,acknowledge_alarm_action_request +AcknowledgeFlow,acknowledge_flow +AcknowledgeJobInput,acknowledge_job_input +AcknowledgeJobOutput,acknowledge_job_output +AcknowledgeOrderReceiptRequest,acknowledge_order_receipt_request +AcknowledgeOrderReceiptResponse,acknowledge_order_receipt_response +AcknowledgeThirdPartyJobInput,acknowledge_third_party_job_input +AcknowledgeThirdPartyJobOutput,acknowledge_third_party_job_output +AcknowledgedAt,acknowledged_at +Acl,acl +AclConfiguration,acl_configuration +AclRule,acl_rule +AcmCertificateArn,acm_certificate_arn +AcquisitionPointId,acquisition_point_id +Action,action +ActionAfterCompletion,action_after_completion +ActionArn,action_arn +ActionCondition,action_condition +ActionConfiguration,action_configuration +ActionConfigurationProperty,action_configuration_property +ActionContext,action_context +ActionDeclaration,action_declaration +ActionDefinition,action_definition +ActionDescription,action_description +ActionExecution,action_execution +ActionExecutionDetail,action_execution_detail +ActionExecutionFilter,action_execution_filter +ActionExecutionInput,action_execution_input +ActionExecutionOutput,action_execution_output +ActionExecutionResult,action_execution_result +ActionHistories,action_histories +ActionHistory,action_history +ActionHistoryDetails,action_history_details +ActionID,action_id +ActionId,action_id +ActionIdentifier,action_identifier +ActionInvocation,action_invocation +ActionInvocations,action_invocations +ActionLocalIpDetails,action_local_ip_details +ActionLocalPortDetails,action_local_port_details +ActionName,action_name +ActionNames,action_names +ActionNotFoundException,action_not_found_exception +ActionOnFailure,action_on_failure +ActionOperations,action_operations +ActionParameter,action_parameter +ActionParameters,action_parameters +ActionPrefix,action_prefix +ActionRemoteIpDetails,action_remote_ip_details +ActionRemotePortDetails,action_remote_port_details +ActionRequired,action_required +ActionRequiredCode,action_required_code +ActionRequiredInfo,action_required_info +ActionRevision,action_revision +ActionSource,action_source +ActionState,action_state +ActionSubType,action_sub_type +ActionSummaries,action_summaries +ActionSummary,action_summary +ActionTarget,action_target +ActionTargetArn,action_target_arn +ActionTargetArns,action_target_arns +ActionTargets,action_targets +ActionThreshold,action_threshold +ActionThresholdType,action_threshold_type +ActionThresholdValue,action_threshold_value +ActionToUse,action_to_use +ActionType,action_type +ActionTypeArtifactDetails,action_type_artifact_details +ActionTypeDeclaration,action_type_declaration +ActionTypeExecutor,action_type_executor +ActionTypeId,action_type_id +ActionTypeIdentifier,action_type_identifier +ActionTypeNotFoundException,action_type_not_found_exception +ActionTypePermissions,action_type_permissions +ActionTypeProperty,action_type_property +ActionTypeSettings,action_type_settings +ActionTypeUrls,action_type_urls +Actions,actions +ActionsEnabled,actions_enabled +ActionsGuarded,actions_guarded +ActionsRequired,actions_required +ActionsSuppressedBy,actions_suppressed_by +ActionsSuppressedReason,actions_suppressed_reason +ActionsSuppressor,actions_suppressor +ActionsSuppressorExtensionPeriod,actions_suppressor_extension_period +ActionsSuppressorWaitPeriod,actions_suppressor_wait_period +Activate,activate +ActivateAnomalyDetectorRequest,activate_anomaly_detector_request +ActivateContactChannelRequest,activate_contact_channel_request +ActivateDeviceIdentifierRequest,activate_device_identifier_request +ActivateDeviceIdentifierResponse,activate_device_identifier_response +ActivateEvaluationFormRequest,activate_evaluation_form_request +ActivateEvaluationFormResponse,activate_evaluation_form_response +ActivateEventSourceRequest,activate_event_source_request +ActivateGatewayInput,activate_gateway_input +ActivateGatewayOutput,activate_gateway_output +ActivateKeySigningKeyRequest,activate_key_signing_key_request +ActivateKeySigningKeyResponse,activate_key_signing_key_response +ActivateNetworkSiteRequest,activate_network_site_request +ActivateNetworkSiteResponse,activate_network_site_response +ActivatePipelineInput,activate_pipeline_input +ActivateReadSetFilter,activate_read_set_filter +ActivateReadSetJobItem,activate_read_set_job_item +ActivateReadSetSourceItem,activate_read_set_source_item +ActivateTypeInput,activate_type_input +ActivateTypeOutput,activate_type_output +ActivateUserRequest,activate_user_request +ActivateUserResponse,activate_user_response +Activated,activated +ActivatedRule,activated_rule +ActivatedRules,activated_rules +Activation,activation +ActivationCode,activation_code +ActivationId,activation_id +ActivationKey,activation_key +ActivationList,activation_list +ActivationOverrideBehavior,activation_override_behavior +ActivationState,activation_state +ActivationStatus,activation_status +ActivationUrl,activation_url +Active,active +ActiveAssignments,active_assignments +ActiveAvailabilityZoneCount,active_availability_zone_count +ActiveChannelPipeline,active_channel_pipeline +ActiveContext,active_context +ActiveContextTimeToLive,active_context_time_to_live +ActiveDate,active_date +ActiveDeviceCount,active_device_count +ActiveDirectory,active_directory +ActiveDirectoryBackupAttributes,active_directory_backup_attributes +ActiveDirectoryComputerAttribute,active_directory_computer_attribute +ActiveDirectoryConfiguration,active_directory_configuration +ActiveDirectoryError,active_directory_error +ActiveDirectoryId,active_directory_id +ActiveDirectoryIdentityProvider,active_directory_identity_provider +ActiveDirectoryName,active_directory_name +ActiveDirectoryStatus,active_directory_status +ActiveGameSessionCount,active_game_session_count +ActiveIAMPolicyAssignment,active_iam_policy_assignment +ActiveInput,active_input +ActiveInputAttachmentName,active_input_attachment_name +ActiveInputSwitchActionName,active_input_switch_action_name +ActiveInstance,active_instance +ActiveInstanceRefreshNotFoundFault,active_instance_refresh_not_found_fault +ActiveInstances,active_instances +ActiveMQBrokerParameters,active_mq_broker_parameters +ActiveModelArn,active_model_arn +ActiveModelVersion,active_model_version +ActiveModelVersionArn,active_model_version_arn +ActiveMotionGraphicsActionName,active_motion_graphics_action_name +ActiveMotionGraphicsUri,active_motion_graphics_uri +ActiveNodes,active_nodes +ActiveOperationArn,active_operation_arn +ActiveServerProcessCount,active_server_process_count +ActiveServicesCount,active_services_count +ActiveSlotsByChannel,active_slots_by_channel +ActiveSpeakerOnlyConfiguration,active_speaker_only_configuration +ActiveSpeakerPosition,active_speaker_position +ActiveStatementsExceededException,active_statements_exceeded_exception +ActiveSubscribedDomains,active_subscribed_domains +ActiveTracing,active_tracing +ActiveTrustedKeyGroups,active_trusted_key_groups +ActiveTrustedSigners,active_trusted_signers +ActiveVersion,active_version +ActiveViolation,active_violation +ActiveWatermarkProcess,active_watermark_process +Activities,activities +ActivitiesResponse,activities_response +ActivitiesType,activities_type +Activity,activity +ActivityDoesNotExist,activity_does_not_exist +ActivityFailedEventDetails,activity_failed_event_details +ActivityId,activity_id +ActivityIds,activity_ids +ActivityLimitExceeded,activity_limit_exceeded +ActivityListItem,activity_list_item +ActivityMetrics,activity_metrics +ActivityResponse,activity_response +ActivityScheduleFailedEventDetails,activity_schedule_failed_event_details +ActivityScheduledEventDetails,activity_scheduled_event_details +ActivityStartedEventDetails,activity_started_event_details +ActivityStatus,activity_status +ActivityStreamEngineNativeAuditFieldsIncluded,activity_stream_engine_native_audit_fields_included +ActivityStreamKinesisStreamName,activity_stream_kinesis_stream_name +ActivityStreamKmsKeyId,activity_stream_kms_key_id +ActivityStreamMode,activity_stream_mode +ActivityStreamPolicyStatus,activity_stream_policy_status +ActivityStreamStatus,activity_stream_status +ActivitySucceededEventDetails,activity_succeeded_event_details +ActivityTask,activity_task +ActivityTaskCancelRequestedEventAttributes,activity_task_cancel_requested_event_attributes +ActivityTaskCanceledEventAttributes,activity_task_canceled_event_attributes +ActivityTaskCompletedEventAttributes,activity_task_completed_event_attributes +ActivityTaskFailedEventAttributes,activity_task_failed_event_attributes +ActivityTaskScheduledEventAttributes,activity_task_scheduled_event_attributes +ActivityTaskStartedEventAttributes,activity_task_started_event_attributes +ActivityTaskStatus,activity_task_status +ActivityTaskTimedOutEventAttributes,activity_task_timed_out_event_attributes +ActivityTimedOutEventDetails,activity_timed_out_event_details +ActivityType,activity_type +ActivityTypeConfiguration,activity_type_configuration +ActivityTypeDetail,activity_type_detail +ActivityTypeInfo,activity_type_info +ActivityTypeInfos,activity_type_infos +ActivityTypes,activity_types +ActivityWorkerLimitExceeded,activity_worker_limit_exceeded +ActorDoesNotExistException,actor_does_not_exist_exception +Actual,actual +ActualAmount,actual_amount +ActualBlockHourlyPrice,actual_block_hourly_price +ActualEndTime,actual_end_time +ActualFirewallEndpoint,actual_firewall_endpoint +ActualFirewallSubnetId,actual_firewall_subnet_id +ActualFirewallSubnetRoutes,actual_firewall_subnet_routes +ActualIncrementalBackupSizeInMegaBytes,actual_incremental_backup_size_in_mega_bytes +ActualInternetGatewayRoutes,actual_internet_gateway_routes +ActualProperties,actual_properties +ActualSpend,actual_spend +ActualStartTime,actual_start_time +ActualValue,actual_value +Actuator,actuator +AdAvailOffset,ad_avail_offset +AdBreak,ad_break +AdBreakMetadata,ad_break_metadata +AdBreaks,ad_breaks +AdDecisionServerUrl,ad_decision_server_url +AdHocFilteringOption,ad_hoc_filtering_option +AdMarkerHls,ad_marker_hls +AdMarkerPassthrough,ad_marker_passthrough +AdMarkers,ad_markers +AdMarkupType,ad_markup_type +AdSegmentUrlPrefix,ad_segment_url_prefix +AdTriggers,ad_triggers +AdaptiveQuantization,adaptive_quantization +Add,add +AddAllocationResourceTags,add_allocation_resource_tags +AddAllowedPrincipals,add_allowed_principals +AddApplicationCloudWatchLoggingOptionRequest,add_application_cloud_watch_logging_option_request +AddApplicationCloudWatchLoggingOptionResponse,add_application_cloud_watch_logging_option_response +AddApplicationInputProcessingConfigurationRequest,add_application_input_processing_configuration_request +AddApplicationInputProcessingConfigurationResponse,add_application_input_processing_configuration_response +AddApplicationInputRequest,add_application_input_request +AddApplicationInputResponse,add_application_input_response +AddApplicationOutputRequest,add_application_output_request +AddApplicationOutputResponse,add_application_output_response +AddApplicationReferenceDataSourceRequest,add_application_reference_data_source_request +AddApplicationReferenceDataSourceResponse,add_application_reference_data_source_response +AddApplicationVpcConfigurationRequest,add_application_vpc_configuration_request +AddApplicationVpcConfigurationResponse,add_application_vpc_configuration_response +AddArguments,add_arguments +AddAssociationRequest,add_association_request +AddAssociationResponse,add_association_response +AddAttachmentsToSetRequest,add_attachments_to_set_request +AddAttachmentsToSetResponse,add_attachments_to_set_response +AddAttributesActivity,add_attributes_activity +AddAttributesToFindingsRequest,add_attributes_to_findings_request +AddAttributesToFindingsResponse,add_attributes_to_findings_response +AddAvailabilityZonesInput,add_availability_zones_input +AddAvailabilityZonesOutput,add_availability_zones_output +AddBridgeFlowSourceRequest,add_bridge_flow_source_request +AddBridgeNetworkOutputRequest,add_bridge_network_output_request +AddBridgeNetworkSourceRequest,add_bridge_network_source_request +AddBridgeOutputRequest,add_bridge_output_request +AddBridgeOutputsRequest,add_bridge_outputs_request +AddBridgeOutputsResponse,add_bridge_outputs_response +AddBridgeSourceRequest,add_bridge_source_request +AddBridgeSourcesRequest,add_bridge_sources_request +AddBridgeSourcesResponse,add_bridge_sources_response +AddCacheInput,add_cache_input +AddCacheOutput,add_cache_output +AddClientIDToOpenIDConnectProviderRequest,add_client_id_to_open_id_connect_provider_request +AddColumnName,add_column_name +AddCommunicationToCaseRequest,add_communication_to_case_request +AddCommunicationToCaseResponse,add_communication_to_case_response +AddCustomAttributesRequest,add_custom_attributes_request +AddCustomRoutingEndpointsRequest,add_custom_routing_endpoints_request +AddCustomRoutingEndpointsResponse,add_custom_routing_endpoints_response +AddDraftAppVersionResourceMappingsRequest,add_draft_app_version_resource_mappings_request +AddDraftAppVersionResourceMappingsResponse,add_draft_app_version_resource_mappings_response +AddEgressGatewayBridgeRequest,add_egress_gateway_bridge_request +AddEndpointsRequest,add_endpoints_request +AddEndpointsResponse,add_endpoints_response +AddEntries,add_entries +AddFacetToObject,add_facet_to_object +AddFacetToObjectRequest,add_facet_to_object_request +AddFlowMediaStreamsRequest,add_flow_media_streams_request +AddFlowMediaStreamsResponse,add_flow_media_streams_response +AddFlowOutputs420Exception,add_flow_outputs420_exception +AddFlowOutputsRequest,add_flow_outputs_request +AddFlowOutputsResponse,add_flow_outputs_response +AddFlowSourcesRequest,add_flow_sources_request +AddFlowSourcesResponse,add_flow_sources_response +AddFlowVpcInterfacesRequest,add_flow_vpc_interfaces_request +AddFlowVpcInterfacesResponse,add_flow_vpc_interfaces_response +AddGatewayLoadBalancerArns,add_gateway_load_balancer_arns +AddGwMetadata,add_gw_metadata +AddHeaderAction,add_header_action +AddIamRoles,add_iam_roles +AddIdleTimeBetweenReads,add_idle_time_between_reads +AddInId,add_in_id +AddIngressGatewayBridgeRequest,add_ingress_gateway_bridge_request +AddIns,add_ins +AddInstanceFleetInput,add_instance_fleet_input +AddInstanceFleetOutput,add_instance_fleet_output +AddInstanceGroupsInput,add_instance_groups_input +AddInstanceGroupsOutput,add_instance_groups_output +AddIpRoutesRequest,add_ip_routes_request +AddIpamOperatingRegion,add_ipam_operating_region +AddJobFlowStepsInput,add_job_flow_steps_input +AddJobFlowStepsOutput,add_job_flow_steps_output +AddLFTagsToResourceRequest,add_lf_tags_to_resource_request +AddLFTagsToResourceResponse,add_lf_tags_to_resource_response +AddLayerVersionPermissionRequest,add_layer_version_permission_request +AddLayerVersionPermissionResponse,add_layer_version_permission_response +AddLicenseSpecifications,add_license_specifications +AddListenerCertificatesInput,add_listener_certificates_input +AddListenerCertificatesOutput,add_listener_certificates_output +AddMaintenance,add_maintenance +AddMediaStreamRequest,add_media_stream_request +AddNetworkLoadBalancerArns,add_network_load_balancer_arns +AddNetworkServices,add_network_services +AddNotificationChannelRequest,add_notification_channel_request +AddNotificationChannelResponse,add_notification_channel_response +AddNotificationChannelsRequest,add_notification_channels_request +AddNotificationChannelsResponse,add_notification_channels_response +AddObject,add_object +AddObjectInput,add_object_input +AddOn,add_on +AddOnRequest,add_on_request +AddOperatingRegions,add_operating_regions +AddOutputRequest,add_output_request +AddPermissionInput,add_permission_input +AddPermissionRequest,add_permission_request +AddPermissionResponse,add_permission_response +AddPrefixListEntry,add_prefix_list_entry +AddProfileKeyRequest,add_profile_key_request +AddProfileKeyResponse,add_profile_key_response +AddProfilePermissionRequest,add_profile_permission_request +AddProfilePermissionResponse,add_profile_permission_response +AddPublicKeys,add_public_keys +AddRecordTimestamp,add_record_timestamp +AddRegionAction,add_region_action +AddRegionRequest,add_region_request +AddReplicaRegions,add_replica_regions +AddResourcePermissionsRequest,add_resource_permissions_request +AddResourcePermissionsResponse,add_resource_permissions_response +AddRoleToDBClusterMessage,add_role_to_db_cluster_message +AddRoleToDBInstanceMessage,add_role_to_db_instance_message +AddRoleToInstanceProfileRequest,add_role_to_instance_profile_request +AddRouteTableIds,add_route_table_ids +AddSecurityGroupIds,add_security_group_ids +AddSourceIdentifierToSubscriptionMessage,add_source_identifier_to_subscription_message +AddSourceIdentifierToSubscriptionResult,add_source_identifier_to_subscription_result +AddStorageSystemRequest,add_storage_system_request +AddStorageSystemResponse,add_storage_system_response +AddSubnetArns,add_subnet_arns +AddSubnetIds,add_subnet_ids +AddSubnets,add_subnets +AddSupplementalLogging,add_supplemental_logging +AddSupportedIpAddressTypes,add_supported_ip_address_types +AddTags,add_tags +AddTagsInput,add_tags_input +AddTagsOutput,add_tags_output +AddTagsRequest,add_tags_request +AddTagsToCertificateRequest,add_tags_to_certificate_request +AddTagsToOnPremisesInstancesInput,add_tags_to_on_premises_instances_input +AddTagsToResourceInput,add_tags_to_resource_input +AddTagsToResourceMessage,add_tags_to_resource_message +AddTagsToResourceOutput,add_tags_to_resource_output +AddTagsToResourceRequest,add_tags_to_resource_request +AddTagsToResourceResponse,add_tags_to_resource_response +AddTagsToStreamInput,add_tags_to_stream_input +AddTagsToVaultInput,add_tags_to_vault_input +AddTexture,add_texture +AddThingToBillingGroupRequest,add_thing_to_billing_group_request +AddThingToThingGroupRequest,add_thing_to_thing_group_request +AddThingsToThingGroupParams,add_things_to_thing_group_params +AddTrailingPaddingCharacter,add_trailing_padding_character +AddTransitGatewayCidrBlocks,add_transit_gateway_cidr_blocks +AddUploadBufferInput,add_upload_buffer_input +AddUploadBufferOutput,add_upload_buffer_output +AddUserToGroupRequest,add_user_to_group_request +AddWorkingStorageInput,add_working_storage_input +AddWorkingStorageOutput,add_working_storage_output +AddWorkloadRequest,add_workload_request +AddWorkloadResponse,add_workload_response +AddedDateTime,added_date_time +AddedPrincipal,added_principal +AddedPrincipals,added_principals +AddedToClusterTime,added_to_cluster_time +AdditionalAccounts,additional_accounts +AdditionalArchivedLogDestId,additional_archived_log_dest_id +AdditionalArtifacts,additional_artifacts +AdditionalAttribute,additional_attribute +AdditionalAttributes,additional_attributes +AdditionalAuditContext,additional_audit_context +AdditionalAuthTypes,additional_auth_types +AdditionalAuthenticationProvider,additional_authentication_provider +AdditionalAuthenticationProviders,additional_authentication_providers +AdditionalBootstrapServers,additional_bootstrap_servers +AdditionalCodeRepositories,additional_code_repositories +AdditionalCodeRepositoryEquals,additional_code_repository_equals +AdditionalConfigs,additional_configs +AdditionalConfiguration,additional_configuration +AdditionalConstraints,additional_constraints +AdditionalContactEmailAddresses,additional_contact_email_addresses +AdditionalDashboardIds,additional_dashboard_ids +AdditionalDataPending,additional_data_pending +AdditionalDataSources,additional_data_sources +AdditionalDataset,additional_dataset +AdditionalDatasets,additional_datasets +AdditionalDeltaOptions,additional_delta_options +AdditionalDetail,additional_detail +AdditionalDetailType,additional_detail_type +AdditionalDetails,additional_details +AdditionalHudiOptions,additional_hudi_options +AdditionalInferenceSpecificationDefinition,additional_inference_specification_definition +AdditionalInferenceSpecifications,additional_inference_specifications +AdditionalInferenceSpecificationsToAdd,additional_inference_specifications_to_add +AdditionalInfo,additional_info +AdditionalInformation,additional_information +AdditionalInstanceConfiguration,additional_instance_configuration +AdditionalLanguageCodes,additional_language_codes +AdditionalLimit,additional_limit +AdditionalLimits,additional_limits +AdditionalLocations,additional_locations +AdditionalManifests,additional_manifests +AdditionalMasterSecurityGroups,additional_master_security_groups +AdditionalMetadata,additional_metadata +AdditionalMetrics,additional_metrics +AdditionalOccurrences,additional_occurrences +AdditionalOptions,additional_options +AdditionalPlanOptionsMap,additional_plan_options_map +AdditionalPlayerCount,additional_player_count +AdditionalRegions,additional_regions +AdditionalResources,additional_resources +AdditionalResponseAttributes,additional_response_attributes +AdditionalResponseFields,additional_response_fields +AdditionalResultAttribute,additional_result_attribute +AdditionalResultAttributeValue,additional_result_attribute_value +AdditionalRoutesAvailable,additional_routes_available +AdditionalRunOptions,additional_run_options +AdditionalSchemaElements,additional_schema_elements +AdditionalSearchKey,additional_search_key +AdditionalSearchKeys,additional_search_keys +AdditionalSlaveSecurityGroups,additional_slave_security_groups +AdditionalStagingLabelsToDownload,additional_staging_labels_to_download +AdditionalStatistics,additional_statistics +AdditionalTreatments,additional_treatments +AdditionalVersionWeights,additional_version_weights +Addon,addon +AddonDetails,addon_details +AddonHealth,addon_health +AddonInfo,addon_info +AddonIssue,addon_issue +AddonStatus,addon_status +AddonVersion,addon_version +AddonVersionInfo,addon_version_info +Address,address +Address1,address1 +Address2,address2 +Address3,address3 +Address4,address4 +AddressAllocationIds,address_allocation_ids +AddressAttribute,address_attribute +AddressBook,address_book +AddressBookArn,address_book_arn +AddressBookData,address_book_data +AddressBooks,address_books +AddressConfiguration,address_configuration +AddressCount,address_count +AddressDefinition,address_definition +AddressExternalId,address_external_id +AddressFamily,address_family +AddressField,address_field +AddressFields,address_fields +AddressId,address_id +AddressLine1,address_line1 +AddressLine2,address_line2 +AddressLine3,address_line3 +AddressNumber,address_number +AddressTransfer,address_transfer +AddressTransferStatus,address_transfer_status +AddressTransfers,address_transfers +AddressType,address_type +Addresses,addresses +AddressingType,addressing_type +AdiFilename,adi_filename +AdjacentParentShardId,adjacent_parent_shard_id +AdjacentShardToMerge,adjacent_shard_to_merge +Adjustable,adjustable +Adjustment,adjustment +AdjustmentType,adjustment_type +AdjustmentTypes,adjustment_types +Adjustments,adjustments +Admin,admin +AdminAccount,admin_account +AdminAccountId,admin_account_id +AdminAccountSummary,admin_account_summary +AdminAccounts,admin_accounts +AdminAddUserToGroupRequest,admin_add_user_to_group_request +AdminConfirmSignUpRequest,admin_confirm_sign_up_request +AdminContact,admin_contact +AdminCreateUserConfig,admin_create_user_config +AdminCreateUserConfigType,admin_create_user_config_type +AdminCreateUserRequest,admin_create_user_request +AdminCreateUserResponse,admin_create_user_response +AdminDeleteUserAttributesRequest,admin_delete_user_attributes_request +AdminDeleteUserRequest,admin_delete_user_request +AdminDetectorId,admin_detector_id +AdminDisableProviderForUserRequest,admin_disable_provider_for_user_request +AdminDisableUserRequest,admin_disable_user_request +AdminEnableUserRequest,admin_enable_user_request +AdminForgetDeviceRequest,admin_forget_device_request +AdminGetDeviceRequest,admin_get_device_request +AdminGetDeviceResponse,admin_get_device_response +AdminGetUserRequest,admin_get_user_request +AdminGetUserResponse,admin_get_user_response +AdminGroup,admin_group +AdminInitiateAuthRequest,admin_initiate_auth_request +AdminInitiateAuthResponse,admin_initiate_auth_response +AdminLinkProviderForUserRequest,admin_link_provider_for_user_request +AdminListDevicesRequest,admin_list_devices_request +AdminListDevicesResponse,admin_list_devices_response +AdminListGroupsForUserRequest,admin_list_groups_for_user_request +AdminListGroupsForUserResponse,admin_list_groups_for_user_response +AdminListUserAuthEventsRequest,admin_list_user_auth_events_request +AdminListUserAuthEventsResponse,admin_list_user_auth_events_response +AdminPassword,admin_password +AdminPrivacy,admin_privacy +AdminRemoveUserFromGroupRequest,admin_remove_user_from_group_request +AdminResetUserPasswordRequest,admin_reset_user_password_request +AdminRespondToAuthChallengeRequest,admin_respond_to_auth_challenge_request +AdminRespondToAuthChallengeResponse,admin_respond_to_auth_challenge_response +AdminScope,admin_scope +AdminSetUserMFAPreferenceRequest,admin_set_user_mfa_preference_request +AdminSetUserPasswordRequest,admin_set_user_password_request +AdminSetUserSettingsRequest,admin_set_user_settings_request +AdminStatus,admin_status +AdminUpdateAuthEventFeedbackRequest,admin_update_auth_event_feedback_request +AdminUpdateDeviceStatusRequest,admin_update_device_status_request +AdminUpdateUserAttributesRequest,admin_update_user_attributes_request +AdminUserGlobalSignOutRequest,admin_user_global_sign_out_request +AdminUserList,admin_user_list +AdminUsername,admin_username +AdministrationRoleARN,administration_role_arn +AdministrativeAction,administrative_action +AdministrativeActionFailureDetails,administrative_action_failure_details +AdministrativeActionType,administrative_action_type +AdministrativeActions,administrative_actions +Administrator,administrator +AdministratorId,administrator_id +Administrators,administrators +AdsOnDeliveryRestrictions,ads_on_delivery_restrictions +AdvancedBackupSetting,advanced_backup_setting +AdvancedBackupSettings,advanced_backup_settings +AdvancedCostOptimizationMetrics,advanced_cost_optimization_metrics +AdvancedDataProtectionMetrics,advanced_data_protection_metrics +AdvancedEventSelector,advanced_event_selector +AdvancedEventSelectors,advanced_event_selectors +AdvancedFieldSelector,advanced_field_selector +AdvancedInputFilter,advanced_input_filter +AdvancedInputFilterSettings,advanced_input_filter_settings +AdvancedOptions,advanced_options +AdvancedOptionsStatus,advanced_options_status +AdvancedRecognitionSetting,advanced_recognition_setting +AdvancedSecurityEnabled,advanced_security_enabled +AdvancedSecurityMode,advanced_security_mode +AdvancedSecurityOptions,advanced_security_options +AdvancedSecurityOptionsInput,advanced_security_options_input +AdvancedSecurityOptionsStatus,advanced_security_options_status +AdvertiseByoipCidrRequest,advertise_byoip_cidr_request +AdvertiseByoipCidrResponse,advertise_byoip_cidr_response +AdvertiseByoipCidrResult,advertise_byoip_cidr_result +AdvisoryIds,advisory_ids +AfdSignaling,afd_signaling +AffectedEntity,affected_entity +AffectedResource,affected_resource +AffectedResources,affected_resources +AffectedSensorCount,affected_sensor_count +AffectedSubnets,affected_subnets +Affiliated,affiliated +Affinity,affinity +After,after +AfterConnectScript,after_connect_script +AfterContactWorkTimeLimit,after_contact_work_time_limit +AfterCreationDate,after_creation_date +AfterFragmentNumber,after_fragment_number +AgeRange,age_range +AgentAlreadyRunningAssessment,agent_already_running_assessment +AgentArn,agent_arn +AgentArns,agent_arns +AgentAvailabilityTimer,agent_availability_timer +AgentConfig,agent_config +AgentConfiguration,agent_configuration +AgentConfigurationStatus,agent_configuration_status +AgentContactReference,agent_contact_reference +AgentContactState,agent_contact_state +AgentCount,agent_count +AgentDetails,agent_details +AgentFilter,agent_filter +AgentInfo,agent_info +AgentInstallerUrl,agent_installer_url +AgentListEntry,agent_list_entry +AgentMetrics,agent_metrics +AgentName,agent_name +AgentNetworkInfo,agent_network_info +AgentOrchestrationConfig,agent_orchestration_config +AgentPreview,agent_preview +AgentStatus,agent_status +AgentStatusARN,agent_status_arn +AgentStatusId,agent_status_id +AgentStatusReference,agent_status_reference +AgentStatusSummary,agent_status_summary +AgentStatusSummaryList,agent_status_summary_list +AgentStatusTypes,agent_status_types +AgentTurnResult,agent_turn_result +AgentTurnSpecification,agent_turn_specification +AgentVersion,agent_version +AgentVersions,agent_versions +AgentlessDialerConfig,agentless_dialer_config +Agents,agents +AgentsAlreadyRunningAssessmentException,agents_already_running_assessment_exception +AggFunc,agg_func +Aggregate,aggregate +AggregateBy,aggregate_by +AggregateColumn,aggregate_column +AggregateComplianceByConfigRule,aggregate_compliance_by_config_rule +AggregateComplianceByConfigRules,aggregate_compliance_by_config_rules +AggregateComplianceByConformancePack,aggregate_compliance_by_conformance_pack +AggregateComplianceByConformancePacks,aggregate_compliance_by_conformance_packs +AggregateComplianceCount,aggregate_compliance_count +AggregateComplianceCounts,aggregate_compliance_counts +AggregateConformancePackCompliance,aggregate_conformance_pack_compliance +AggregateConformancePackComplianceCount,aggregate_conformance_pack_compliance_count +AggregateConformancePackComplianceFilters,aggregate_conformance_pack_compliance_filters +AggregateConformancePackComplianceSummaries,aggregate_conformance_pack_compliance_summaries +AggregateConformancePackComplianceSummary,aggregate_conformance_pack_compliance_summary +AggregateConformancePackComplianceSummaryFilters,aggregate_conformance_pack_compliance_summary_filters +AggregateEvaluationResult,aggregate_evaluation_result +AggregateEvaluationResults,aggregate_evaluation_results +AggregateKeyType,aggregate_key_type +AggregateOperation,aggregate_operation +AggregateResourceIdentifier,aggregate_resource_identifier +AggregateStatus,aggregate_status +AggregateValue,aggregate_value +AggregatedLogOddsMetric,aggregated_log_odds_metric +AggregatedProfileTime,aggregated_profile_time +AggregatedSourceStatus,aggregated_source_status +AggregatedSourceStatusList,aggregated_source_status_list +AggregatedUtterancesFilter,aggregated_utterances_filter +AggregatedUtterancesSortBy,aggregated_utterances_sort_by +AggregatedUtterancesSummary,aggregated_utterances_summary +AggregatedValue,aggregated_value +AggregatedVariablesImpactExplanation,aggregated_variables_impact_explanation +AggregatedVariablesImportanceMetrics,aggregated_variables_importance_metrics +Aggregates,aggregates +Aggregation,aggregation +AggregationAuthorization,aggregation_authorization +AggregationAuthorizationArn,aggregation_authorization_arn +AggregationAuthorizations,aggregation_authorizations +AggregationConfig,aggregation_config +AggregationConstraint,aggregation_constraint +AggregationEnabled,aggregation_enabled +AggregationFunction,aggregation_function +AggregationFunctionParameters,aggregation_function_parameters +AggregationSortConfiguration,aggregation_sort_configuration +AggregationSortConfigurations,aggregation_sort_configurations +AggregationStatistic,aggregation_statistic +AggregationType,aggregation_type +AggregationVisibility,aggregation_visibility +Aggregations,aggregations +Aggregator,aggregator +AggregatorType,aggregator_type +Aggregators,aggregators +AggressiveMode,aggressive_mode +Aggs,aggs +Agreement,agreement +AgreementId,agreement_id +Agreements,agreements +AiffSettings,aiff_settings +AirflowConfigurationOptions,airflow_configuration_options +AirflowVersion,airflow_version +Alarm,alarm +AlarmARN,alarm_arn +AlarmAction,alarm_action +AlarmActions,alarm_actions +AlarmArn,alarm_arn +AlarmCapabilities,alarm_capabilities +AlarmConfiguration,alarm_configuration +AlarmConfigurationUpdatedTimestamp,alarm_configuration_updated_timestamp +AlarmDescription,alarm_description +AlarmEventActions,alarm_event_actions +AlarmHistoryItem,alarm_history_item +AlarmHistoryItems,alarm_history_items +AlarmIdentifier,alarm_identifier +AlarmModelSummary,alarm_model_summary +AlarmModelVersionSummary,alarm_model_version_summary +AlarmName,alarm_name +AlarmNamePrefix,alarm_name_prefix +AlarmNames,alarm_names +AlarmNotification,alarm_notification +AlarmRecommendation,alarm_recommendation +AlarmRoleArn,alarm_role_arn +AlarmRule,alarm_rule +AlarmSpecification,alarm_specification +AlarmState,alarm_state +AlarmStateInformation,alarm_state_information +AlarmSummary,alarm_summary +AlarmType,alarm_type +AlarmTypes,alarm_types +Alarms,alarms +AlarmsLimitExceededException,alarms_limit_exceeded_exception +AlbumArt,album_art +AlbumArtFormat,album_art_format +Alert,alert +AlertArn,alert_arn +AlertCode,alert_code +AlertDescription,alert_description +AlertFilters,alert_filters +AlertManagerDefinitionDescription,alert_manager_definition_description +AlertManagerDefinitionStatus,alert_manager_definition_status +AlertMessage,alert_message +AlertName,alert_name +AlertSensitivityThreshold,alert_sensitivity_threshold +AlertStatus,alert_status +AlertSummary,alert_summary +AlertSummaryList,alert_summary_list +AlertTarget,alert_target +AlertType,alert_type +AlexaForBusinessMetadata,alexa_for_business_metadata +AlexaForBusinessRoomArn,alexa_for_business_room_arn +AlexaSkillIds,alexa_skill_ids +AlexaSkillStatus,alexa_skill_status +AlfrescoConfiguration,alfresco_configuration +Algorithm,algorithm +AlgorithmArn,algorithm_arn +AlgorithmControl,algorithm_control +AlgorithmDescription,algorithm_description +AlgorithmImage,algorithm_image +AlgorithmName,algorithm_name +AlgorithmSpecification,algorithm_specification +AlgorithmStatus,algorithm_status +AlgorithmStatusDetails,algorithm_status_details +AlgorithmStatusItem,algorithm_status_item +AlgorithmSummary,algorithm_summary +AlgorithmSummaryList,algorithm_summary_list +AlgorithmValidationProfile,algorithm_validation_profile +AlgorithmValidationSpecification,algorithm_validation_specification +AlgorithmicStemming,algorithmic_stemming +AlgorithmsConfig,algorithms_config +Alias,alias +AliasArn,alias_arn +AliasAttributes,alias_attributes +AliasConfiguration,alias_configuration +AliasExistsException,alias_exists_exception +AliasICPRecordal,alias_icp_recordal +AliasICPRecordals,alias_icp_recordals +AliasId,alias_id +AliasIds,alias_ids +AliasListEntry,alias_list_entry +AliasName,alias_name +AliasPrefix,alias_prefix +AliasRoutingConfiguration,alias_routing_configuration +AliasTarget,alias_target +Aliased,aliased +Aliases,aliases +AliasesToAdd,aliases_to_add +AliasesToDelete,aliases_to_delete +AlignedEndTime,aligned_end_time +AlignedStartTime,aligned_start_time +Alignment,alignment +All,all +AllAccountsEnabled,all_accounts_enabled +AllAvailabilityZones,all_availability_zones +AllAwsRegions,all_aws_regions +AllColumnsRequested,all_columns_requested +AllDataPointsVisibility,all_data_points_visibility +AllOrganizationalUnitsEnabled,all_organizational_units_enabled +AllParameters,all_parameters +AllPolicyTypesEnabled,all_policy_types_enabled +AllQueryArguments,all_query_arguments +AllRegions,all_regions +AllRegionsEnabled,all_regions_enabled +AllRowsWildcard,all_rows_wildcard +AllSheets,all_sheets +AllocateAddressRequest,allocate_address_request +AllocateAddressResult,allocate_address_result +AllocateConnectionOnInterconnectRequest,allocate_connection_on_interconnect_request +AllocateHostedConnectionRequest,allocate_hosted_connection_request +AllocateHostsRequest,allocate_hosts_request +AllocateHostsResult,allocate_hosts_result +AllocateIpamPoolCidrRequest,allocate_ipam_pool_cidr_request +AllocateIpamPoolCidrResult,allocate_ipam_pool_cidr_result +AllocatePrivateVirtualInterfaceRequest,allocate_private_virtual_interface_request +AllocatePublicVirtualInterfaceRequest,allocate_public_virtual_interface_request +AllocateStaticIpRequest,allocate_static_ip_request +AllocateStaticIpResult,allocate_static_ip_result +AllocateTransitVirtualInterfaceRequest,allocate_transit_virtual_interface_request +AllocateTransitVirtualInterfaceResult,allocate_transit_virtual_interface_result +AllocatedCapacity,allocated_capacity +AllocatedDpus,allocated_dpus +AllocatedProvisionedConcurrentExecutions,allocated_provisioned_concurrent_executions +AllocatedStorage,allocated_storage +AllocatedUsageQuantity,allocated_usage_quantity +AllocationDefaultNetmaskLength,allocation_default_netmask_length +AllocationId,allocation_id +AllocationIdNotFoundException,allocation_id_not_found_exception +AllocationIds,allocation_ids +AllocationMaxNetmaskLength,allocation_max_netmask_length +AllocationMinNetmaskLength,allocation_min_netmask_length +AllocationResourceTags,allocation_resource_tags +AllocationStrategy,allocation_strategy +AllocationTime,allocation_time +AllocationType,allocation_type +Allow,allow +AllowAction,allow_action +AllowActions,allow_actions +AllowAdminCreateUserOnly,allow_admin_create_user_only +AllowAllTrafficToEndpoint,allow_all_traffic_to_endpoint +AllowAssociation,allow_association +AllowCancelResize,allow_cancel_resize +AllowCheckIn,allow_check_in +AllowClassicFlow,allow_classic_flow +AllowCookies,allow_cookies +AllowCopyImage,allow_copy_image +AllowCredentials,allow_credentials +AllowCustomRoutingTrafficRequest,allow_custom_routing_traffic_request +AllowDataLoss,allow_data_loss +AllowDeferredExecution,allow_deferred_execution +AllowDenyList,allow_deny_list +AllowDnsResolutionFromRemoteVpc,allow_dns_resolution_from_remote_vpc +AllowEarlyCheckIn,allow_early_check_in +AllowEgressFromLocalClassicLinkToRemoteVpc,allow_egress_from_local_classic_link_to_remote_vpc +AllowEgressFromLocalVpcToRemoteClassicLink,allow_egress_from_local_vpc_to_remote_classic_link +AllowEngineModeChange,allow_engine_mode_change +AllowExternalDataFiltering,allow_external_data_filtering +AllowForceDelete,allow_force_delete +AllowFullTableExternalDataAccess,allow_full_table_external_data_access +AllowHeaders,allow_headers +AllowListCriteria,allow_list_criteria +AllowListStatus,allow_list_status +AllowListSummary,allow_list_summary +AllowMajorVersionUpdate,allow_major_version_update +AllowMajorVersionUpgrade,allow_major_version_upgrade +AllowMessages,allow_messages +AllowMethods,allow_methods +AllowNonRestoredState,allow_non_restored_state +AllowNotifications,allow_notifications +AllowOrigins,allow_origins +AllowProfileCreation,allow_profile_creation +AllowPubliclyAccessibleConsumers,allow_publicly_accessible_consumers +AllowQuotedRecordDelimiter,allow_quoted_record_delimiter +AllowReassignment,allow_reassignment +AllowReassociation,allow_reassociation +AllowReferers,allow_referers +AllowResources,allow_resources +AllowSelectNestedTables,allow_select_nested_tables +AllowSelfManagement,allow_self_management +AllowSingleColumn,allow_single_column +AllowSsh,allow_ssh +AllowSudo,allow_sudo +AllowUnassociatedTargets,allow_unassociated_targets +AllowUnauthenticatedIdentities,allow_unauthenticated_identities +AllowUpdate,allow_update +AllowUsersToChangePassword,allow_users_to_change_password +AllowVersionUpgrade,allow_version_upgrade +Allowed,allowed +AllowedAccessControlTags,allowed_access_control_tags +AllowedAggregations,allowed_aggregations +AllowedAllVPCs,allowed_all_vpcs +AllowedAttempts,allowed_attempts +AllowedByOrganizations,allowed_by_organizations +AllowedByPermissionsBoundary,allowed_by_permissions_boundary +AllowedDomains,allowed_domains +AllowedFeatures,allowed_features +AllowedGroupsColumnName,allowed_groups_column_name +AllowedHeaders,allowed_headers +AllowedIPRange,allowed_ip_range +AllowedInputTypes,allowed_input_types +AllowedInstanceTypes,allowed_instance_types +AllowedIps,allowed_ips +AllowedLocations,allowed_locations +AllowedMethods,allowed_methods +AllowedMonitorCapabilities,allowed_monitor_capabilities +AllowedNodeTypeModificationsMessage,allowed_node_type_modifications_message +AllowedOAuthFlows,allowed_o_auth_flows +AllowedOAuthFlowsUserPoolClient,allowed_o_auth_flows_user_pool_client +AllowedOAuthScopes,allowed_o_auth_scopes +AllowedOperations,allowed_operations +AllowedOrigins,allowed_origins +AllowedPattern,allowed_pattern +AllowedPrincipal,allowed_principal +AllowedPrincipals,allowed_principals +AllowedPublishers,allowed_publishers +AllowedRenditionSize,allowed_rendition_size +AllowedRenditions,allowed_renditions +AllowedStatistics,allowed_statistics +AllowedTargets,allowed_targets +AllowedVPCs,allowed_vpcs +AllowedValue,allowed_value +AllowedValues,allowed_values +AllowsMultipleInstanceTypes,allows_multiple_instance_types +AllowsPublicReadAccess,allows_public_read_access +AllowsPublicWriteAccess,allows_public_write_access +AllowsVpcAndNonVpcInstanceMemberships,allows_vpc_and_non_vpc_instance_memberships +AlphaBehavior,alpha_behavior +Alphabet,alphabet +AlpnPolicy,alpn_policy +AlreadyExistsException,already_exists_exception +AlreadyExistsFault,already_exists_fault +AlreadyInOrganizationException,already_in_organization_exception +AlreadyStreamedException,already_streamed_exception +AlternateBandColorsVisibility,alternate_band_colors_visibility +AlternateBandEvenColor,alternate_band_even_color +AlternateBandOddColor,alternate_band_odd_color +AlternateContact,alternate_contact +AlternateContactType,alternate_contact_type +AlternateDataSourceParameters,alternate_data_source_parameters +AlternateIdentifier,alternate_identifier +AlternateKey,alternate_key +AlternatePathHint,alternate_path_hint +AlternatePathHints,alternate_path_hints +AlternateSoftwareMetadata,alternate_software_metadata +AlternateSoftwares,alternate_softwares +AlternateTransferFunctionSei,alternate_transfer_function_sei +Alternative,alternative +AlternativeTransferFunction,alternative_transfer_function +Alternatives,alternatives +AmazonCodeGuruProfiler,amazon_code_guru_profiler +AmazonCodeGuruProfilerIntegration,amazon_code_guru_profiler_integration +AmazonElasticsearchParameters,amazon_elasticsearch_parameters +AmazonForecastRoleArn,amazon_forecast_role_arn +AmazonId,amazon_id +AmazonIdEventTopic,amazon_id_event_topic +AmazonManagedKafkaEventSourceConfig,amazon_managed_kafka_event_source_config +AmazonOpenSearchParameters,amazon_open_search_parameters +AmazonOpenSearchServerlessBufferingHints,amazon_open_search_serverless_buffering_hints +AmazonOpenSearchServerlessDestinationConfiguration,amazon_open_search_serverless_destination_configuration +AmazonOpenSearchServerlessDestinationDescription,amazon_open_search_serverless_destination_description +AmazonOpenSearchServerlessDestinationUpdate,amazon_open_search_serverless_destination_update +AmazonOpenSearchServerlessRetryOptions,amazon_open_search_serverless_retry_options +AmazonProvidedIpv6CidrBlock,amazon_provided_ipv6_cidr_block +AmazonRedshiftAdvancedOption,amazon_redshift_advanced_option +AmazonRedshiftNodeData,amazon_redshift_node_data +AmazonRedshiftSource,amazon_redshift_source +AmazonRedshiftTarget,amazon_redshift_target +AmazonSideAsn,amazon_side_asn +AmazonTranscribeCallAnalyticsProcessorConfiguration,amazon_transcribe_call_analytics_processor_configuration +AmazonTranscribeProcessorConfiguration,amazon_transcribe_processor_configuration +AmazonopensearchserviceBufferingHints,amazonopensearchservice_buffering_hints +AmazonopensearchserviceDestinationConfiguration,amazonopensearchservice_destination_configuration +AmazonopensearchserviceDestinationDescription,amazonopensearchservice_destination_description +AmazonopensearchserviceDestinationUpdate,amazonopensearchservice_destination_update +AmazonopensearchserviceRetryOptions,amazonopensearchservice_retry_options +AmbiguousRoleResolution,ambiguous_role_resolution +AmdSevSnp,amd_sev_snp +AmexCardSecurityCodeVersion1,amex_card_security_code_version1 +AmexCardSecurityCodeVersion2,amex_card_security_code_version2 +Ami,ami +AmiAggregation,ami_aggregation +AmiAggregationResponse,ami_aggregation_response +AmiAssociationScope,ami_association_scope +AmiDistributionConfiguration,ami_distribution_configuration +AmiId,ami_id +AmiLaunchIndex,ami_launch_index +AmiVersion,ami_version +AmortizedCommitment,amortized_commitment +AmortizedRecurringCommitment,amortized_recurring_commitment +AmortizedRecurringFee,amortized_recurring_fee +AmortizedUpfrontCommitment,amortized_upfront_commitment +AmortizedUpfrontFee,amortized_upfront_fee +Amount,amount +AmountInUsd,amount_in_usd +AmplifyFeatureFlags,amplify_feature_flags +AmplifyMetaConfig,amplify_meta_config +Amplitude,amplitude +AmplitudeConnectorProfileCredentials,amplitude_connector_profile_credentials +AmplitudeSourceProperties,amplitude_source_properties +AmznClientToken,amzn_client_token +Analyses,analyses +Analysis,analysis +AnalysisAclRule,analysis_acl_rule +AnalysisArn,analysis_arn +AnalysisComponent,analysis_component +AnalysisDefaults,analysis_defaults +AnalysisDefinition,analysis_definition +AnalysisEndTime,analysis_end_time +AnalysisError,analysis_error +AnalysisFindings,analysis_findings +AnalysisId,analysis_id +AnalysisLoadBalancerListener,analysis_load_balancer_listener +AnalysisLoadBalancerTarget,analysis_load_balancer_target +AnalysisOptions,analysis_options +AnalysisPacketHeader,analysis_packet_header +AnalysisParameter,analysis_parameter +AnalysisReport,analysis_report +AnalysisReportId,analysis_report_id +AnalysisReportSummary,analysis_report_summary +AnalysisReports,analysis_reports +AnalysisResult,analysis_result +AnalysisResultLocation,analysis_result_location +AnalysisRouteTableRoute,analysis_route_table_route +AnalysisRule,analysis_rule +AnalysisRuleAggregation,analysis_rule_aggregation +AnalysisRuleCustom,analysis_rule_custom +AnalysisRuleList,analysis_rule_list +AnalysisSchema,analysis_schema +AnalysisScheme,analysis_scheme +AnalysisSchemeLanguage,analysis_scheme_language +AnalysisSchemeName,analysis_scheme_name +AnalysisSchemeNames,analysis_scheme_names +AnalysisSchemeStatus,analysis_scheme_status +AnalysisSchemes,analysis_schemes +AnalysisSearchFilter,analysis_search_filter +AnalysisSecurityGroupRule,analysis_security_group_rule +AnalysisSourceEntity,analysis_source_entity +AnalysisSourceTemplate,analysis_source_template +AnalysisStartTime,analysis_start_time +AnalysisStartTimeBegin,analysis_start_time_begin +AnalysisStartTimeEnd,analysis_start_time_end +AnalysisStatus,analysis_status +AnalysisSummary,analysis_summary +AnalysisSummaryList,analysis_summary_list +AnalysisTemplate,analysis_template +AnalysisTemplateSummary,analysis_template_summary +AnalysisTypes,analysis_types +Analytics,analytics +AnalyticsAndOperator,analytics_and_operator +AnalyticsBinBySpecification,analytics_bin_by_specification +AnalyticsBinKey,analytics_bin_key +AnalyticsConfiguration,analytics_configuration +AnalyticsConfigurationList,analytics_configuration_list +AnalyticsConfigurationType,analytics_configuration_type +AnalyticsEndpointId,analytics_endpoint_id +AnalyticsExportDestination,analytics_export_destination +AnalyticsIntentFilter,analytics_intent_filter +AnalyticsIntentGroupByKey,analytics_intent_group_by_key +AnalyticsIntentGroupBySpecification,analytics_intent_group_by_specification +AnalyticsIntentMetric,analytics_intent_metric +AnalyticsIntentMetricResult,analytics_intent_metric_result +AnalyticsIntentNodeSummary,analytics_intent_node_summary +AnalyticsIntentResult,analytics_intent_result +AnalyticsIntentStageFilter,analytics_intent_stage_filter +AnalyticsIntentStageGroupByKey,analytics_intent_stage_group_by_key +AnalyticsIntentStageGroupBySpecification,analytics_intent_stage_group_by_specification +AnalyticsIntentStageMetric,analytics_intent_stage_metric +AnalyticsIntentStageMetricResult,analytics_intent_stage_metric_result +AnalyticsIntentStageResult,analytics_intent_stage_result +AnalyticsMetadata,analytics_metadata +AnalyticsMetadataType,analytics_metadata_type +AnalyticsPathFilter,analytics_path_filter +AnalyticsS3BucketDestination,analytics_s3_bucket_destination +AnalyticsSessionFilter,analytics_session_filter +AnalyticsSessionGroupByKey,analytics_session_group_by_key +AnalyticsSessionGroupBySpecification,analytics_session_group_by_specification +AnalyticsSessionMetric,analytics_session_metric +AnalyticsSessionMetricResult,analytics_session_metric_result +AnalyticsSessionResult,analytics_session_result +AnalyticsUtteranceAttribute,analytics_utterance_attribute +AnalyticsUtteranceAttributeResult,analytics_utterance_attribute_result +AnalyticsUtteranceFilter,analytics_utterance_filter +AnalyticsUtteranceGroupByKey,analytics_utterance_group_by_key +AnalyticsUtteranceGroupBySpecification,analytics_utterance_group_by_specification +AnalyticsUtteranceMetric,analytics_utterance_metric +AnalyticsUtteranceMetricResult,analytics_utterance_metric_result +AnalyticsUtteranceResult,analytics_utterance_result +AnalyzeDocumentModelVersion,analyze_document_model_version +AnalyzeDocumentRequest,analyze_document_request +AnalyzeDocumentResponse,analyze_document_response +AnalyzeExpenseModelVersion,analyze_expense_model_version +AnalyzeExpenseRequest,analyze_expense_request +AnalyzeExpenseResponse,analyze_expense_response +AnalyzeIDDetections,analyze_id_detections +AnalyzeIDModelVersion,analyze_id_model_version +AnalyzeIDRequest,analyze_id_request +AnalyzeIDResponse,analyze_id_response +AnalyzeLendingModelVersion,analyze_lending_model_version +AnalyzedEniCount,analyzed_eni_count +AnalyzedResource,analyzed_resource +AnalyzedResourceCount,analyzed_resource_count +AnalyzedResourceSummary,analyzed_resource_summary +AnalyzedTime,analyzed_time +AnalyzerSummary,analyzer_summary +AncestorIds,ancestor_ids +Anchor,anchor +AnchorDateConfiguration,anchor_date_configuration +AnchorOption,anchor_option +AncillarySourceSettings,ancillary_source_settings +And,and +AndAllFilters,and_all_filters +AndConditions,and_conditions +AndStatement,and_statement +Android,android +AndroidPushNotificationTemplate,android_push_notification_template +Annotation,annotation +AnnotationConsolidationConfig,annotation_consolidation_config +AnnotationConsolidationLambdaArn,annotation_consolidation_lambda_arn +AnnotationDataS3Uri,annotation_data_s3_uri +AnnotationImportItemDetail,annotation_import_item_detail +AnnotationImportItemSource,annotation_import_item_source +AnnotationImportJobItem,annotation_import_job_item +AnnotationStoreItem,annotation_store_item +AnnotationStoreVersionItem,annotation_store_version_item +AnnotationValue,annotation_value +Annotations,annotations +AnnouncementArn,announcement_arn +AnnouncementDirection,announcement_direction +Anomalies,anomalies +AnomalousLogGroup,anomalous_log_group +AnomalousLogGroups,anomalous_log_groups +AnomalousService,anomalous_service +Anomaly,anomaly +AnomalyClass,anomaly_class +AnomalyDateInterval,anomaly_date_interval +AnomalyDetector,anomaly_detector +AnomalyDetectorArn,anomaly_detector_arn +AnomalyDetectorConfig,anomaly_detector_config +AnomalyDetectorConfigSummary,anomaly_detector_config_summary +AnomalyDetectorConfiguration,anomaly_detector_configuration +AnomalyDetectorDataQualityMetric,anomaly_detector_data_quality_metric +AnomalyDetectorDataQualityMetricList,anomaly_detector_data_quality_metric_list +AnomalyDetectorDescription,anomaly_detector_description +AnomalyDetectorFrequency,anomaly_detector_frequency +AnomalyDetectorName,anomaly_detector_name +AnomalyDetectorSummary,anomaly_detector_summary +AnomalyDetectorSummaryList,anomaly_detector_summary_list +AnomalyDetectorTypes,anomaly_detector_types +AnomalyDetectors,anomaly_detectors +AnomalyEndDate,anomaly_end_date +AnomalyGroup,anomaly_group +AnomalyGroupId,anomaly_group_id +AnomalyGroupScore,anomaly_group_score +AnomalyGroupStatistics,anomaly_group_statistics +AnomalyGroupSummary,anomaly_group_summary +AnomalyGroupSummaryList,anomaly_group_summary_list +AnomalyGroupTimeSeries,anomaly_group_time_series +AnomalyGroupTimeSeriesFeedback,anomaly_group_time_series_feedback +AnomalyId,anomaly_id +AnomalyInstance,anomaly_instance +AnomalyMask,anomaly_mask +AnomalyMonitor,anomaly_monitor +AnomalyMonitors,anomaly_monitors +AnomalyReportedTimeRange,anomaly_reported_time_range +AnomalyResource,anomaly_resource +AnomalyResources,anomaly_resources +AnomalyScore,anomaly_score +AnomalySourceDetails,anomaly_source_details +AnomalySourceMetadata,anomaly_source_metadata +AnomalyStartDate,anomaly_start_date +AnomalySubscription,anomaly_subscription +AnomalySubscriptions,anomaly_subscriptions +AnomalyTimeRange,anomaly_time_range +AnonymousAuthDisableDate,anonymous_auth_disable_date +AnonymousAuthEnabled,anonymous_auth_enabled +AnonymousUserArn,anonymous_user_arn +AnonymousUserDashboardEmbeddingConfiguration,anonymous_user_dashboard_embedding_configuration +AnonymousUserDashboardVisualEmbeddingConfiguration,anonymous_user_dashboard_visual_embedding_configuration +AnonymousUserEmbeddingExperienceConfiguration,anonymous_user_embedding_experience_configuration +AnonymousUserQSearchBarEmbeddingConfiguration,anonymous_user_q_search_bar_embedding_configuration +AnonymousUserSnapshotJobResult,anonymous_user_snapshot_job_result +AnonymousUsers,anonymous_users +Answer,answer +AnswerKey,answer_key +AnswerMachineDetectionConfig,answer_machine_detection_config +AnswerSummaries,answer_summaries +AnswerSummary,answer_summary +Answers,answers +AntennaDemodDecodeDetails,antenna_demod_decode_details +AntennaDownlinkConfig,antenna_downlink_config +AntennaDownlinkDemodDecodeConfig,antenna_downlink_demod_decode_config +AntennaUplinkConfig,antenna_uplink_config +AntiAlias,anti_alias +AntipatternReportResult,antipattern_report_result +AntipatternSeveritySummary,antipattern_severity_summary +Any,any +AnywhereConfiguration,anywhere_configuration +ApId,ap_id +ApacheKafkaCluster,apache_kafka_cluster +ApacheKafkaClusterDescription,apache_kafka_cluster_description +Api,api +ApiAssociation,api_association +ApiCache,api_cache +ApiCallDetails,api_call_details +ApiDescription,api_description +ApiDestination,api_destination +ApiDestinationArn,api_destination_arn +ApiDestinationState,api_destination_state +ApiDestinations,api_destinations +ApiEndpoint,api_endpoint +ApiGatewayApiAsset,api_gateway_api_asset +ApiGatewayDomainName,api_gateway_domain_name +ApiGatewayId,api_gateway_id +ApiGatewayManaged,api_gateway_managed +ApiGatewayProxy,api_gateway_proxy +ApiGatewayProxyConfig,api_gateway_proxy_config +ApiGatewayProxyInput,api_gateway_proxy_input +ApiGatewayProxySummary,api_gateway_proxy_summary +ApiId,api_id +ApiKey,api_key +ApiKeyAuthParameters,api_key_auth_parameters +ApiKeyCredential,api_key_credential +ApiKeyCredentials,api_key_credentials +ApiKeyFilter,api_key_filter +ApiKeyIds,api_key_ids +ApiKeyLimitExceededException,api_key_limit_exceeded_exception +ApiKeyName,api_key_name +ApiKeyRequired,api_key_required +ApiKeyRestrictions,api_key_restrictions +ApiKeySelectionExpression,api_key_selection_expression +ApiKeySource,api_key_source +ApiKeyValidityOutOfBoundsException,api_key_validity_out_of_bounds_exception +ApiKeyValue,api_key_value +ApiKeys,api_keys +ApiLimitExceededException,api_limit_exceeded_exception +ApiMapping,api_mapping +ApiMappingId,api_mapping_id +ApiMappingKey,api_mapping_key +ApiMappingSelectionExpression,api_mapping_selection_expression +ApiName,api_name +ApiPassthrough,api_passthrough +ApiSpecificationDownloadUrl,api_specification_download_url +ApiSpecificationDownloadUrlExpiresAt,api_specification_download_url_expires_at +ApiSpecificationMd5Hash,api_specification_md5_hash +ApiSpecificationUploadUrl,api_specification_upload_url +ApiSpecificationUploadUrlExpiresAt,api_specification_upload_url_expires_at +ApiStage,api_stage +App,app +AppArn,app_arn +AppAssessment,app_assessment +AppAssessmentSummary,app_assessment_summary +AppAuthorization,app_authorization +AppAuthorizationSummary,app_authorization_summary +AppBlock,app_block +AppBlockArn,app_block_arn +AppBlockBuilder,app_block_builder +AppBlockBuilderAppBlockAssociation,app_block_builder_app_block_association +AppBlockBuilderAppBlockAssociations,app_block_builder_app_block_associations +AppBlockBuilderErrors,app_block_builder_errors +AppBlockBuilderName,app_block_builder_name +AppBlockBuilderStateChangeReason,app_block_builder_state_change_reason +AppBlockBuilders,app_block_builders +AppBlockErrors,app_block_errors +AppBlocks,app_blocks +AppBoundaryKey,app_boundary_key +AppBundle,app_bundle +AppBundleSummary,app_bundle_summary +AppComponent,app_component +AppComponentCompliance,app_component_compliance +AppCookieStickinessPolicies,app_cookie_stickiness_policies +AppCookieStickinessPolicy,app_cookie_stickiness_policy +AppDetails,app_details +AppEui,app_eui +AppFlowConfig,app_flow_config +AppId,app_id +AppIdClientRegex,app_id_client_regex +AppIds,app_ids +AppImageConfigArn,app_image_config_arn +AppImageConfigDetails,app_image_config_details +AppImageConfigName,app_image_config_name +AppImageConfigs,app_image_configs +AppInputSource,app_input_source +AppInstance,app_instance +AppInstanceAdmin,app_instance_admin +AppInstanceAdminArn,app_instance_admin_arn +AppInstanceAdminSummary,app_instance_admin_summary +AppInstanceAdmins,app_instance_admins +AppInstanceArn,app_instance_arn +AppInstanceBot,app_instance_bot +AppInstanceBotArn,app_instance_bot_arn +AppInstanceBotSummary,app_instance_bot_summary +AppInstanceBots,app_instance_bots +AppInstanceDataType,app_instance_data_type +AppInstanceRetentionSettings,app_instance_retention_settings +AppInstanceStreamingConfiguration,app_instance_streaming_configuration +AppInstanceStreamingConfigurations,app_instance_streaming_configurations +AppInstanceSummary,app_instance_summary +AppInstanceUser,app_instance_user +AppInstanceUserArn,app_instance_user_arn +AppInstanceUserEndpoint,app_instance_user_endpoint +AppInstanceUserEndpointSummary,app_instance_user_endpoint_summary +AppInstanceUserEndpoints,app_instance_user_endpoints +AppInstanceUserId,app_instance_user_id +AppInstanceUserMembershipSummary,app_instance_user_membership_summary +AppInstanceUserSummary,app_instance_user_summary +AppInstanceUsers,app_instance_users +AppInstances,app_instances +AppIntegrationsConfiguration,app_integrations_configuration +AppKey,app_key +AppLogsEnabled,app_logs_enabled +AppManaged,app_managed +AppMonitor,app_monitor +AppMonitorConfiguration,app_monitor_configuration +AppMonitorDetails,app_monitor_details +AppMonitorName,app_monitor_name +AppMonitorSummaries,app_monitor_summaries +AppMonitorSummary,app_monitor_summary +AppName,app_name +AppNetworkAccessType,app_network_access_type +AppPackageName,app_package_name +AppRegistryArn,app_registry_arn +AppRegistryConfiguration,app_registry_configuration +AppSKey,app_s_key +AppSecurityGroupManagement,app_security_group_management +AppServerPrivateKey,app_server_private_key +AppSource,app_source +AppSpecContent,app_spec_content +AppSpecification,app_specification +AppSummary,app_summary +AppSyncRuntime,app_sync_runtime +AppTitle,app_title +AppType,app_type +AppTypeEquals,app_type_equals +AppUnitError,app_unit_error +AppValidationConfiguration,app_validation_configuration +AppValidationOutput,app_validation_output +AppVersion,app_version +AppVersionCode,app_version_code +AppVersionSummary,app_version_summary +AppVisibility,app_visibility +AppendAccessString,append_access_string +AppendSourcePath,append_source_path +AppflowIntegration,appflow_integration +AppflowIntegrationWorkflowAttributes,appflow_integration_workflow_attributes +AppflowIntegrationWorkflowMetrics,appflow_integration_workflow_metrics +AppflowIntegrationWorkflowStep,appflow_integration_workflow_step +ApplianceModeSupport,appliance_mode_support +Applicability,applicability +Application,application +ApplicationARN,application_arn +ApplicationAggregatedStatus,application_aggregated_status +ApplicationAlreadyExistsException,application_already_exists_exception +ApplicationArn,application_arn +ApplicationArns,application_arns +ApplicationCode,application_code +ApplicationCodeConfiguration,application_code_configuration +ApplicationCodeConfigurationDescription,application_code_configuration_description +ApplicationCodeConfigurationUpdate,application_code_configuration_update +ApplicationCodeUpdate,application_code_update +ApplicationComponent,application_component +ApplicationComponentDetail,application_component_detail +ApplicationComponentList,application_component_list +ApplicationComponentStatusSummary,application_component_status_summary +ApplicationComponentStrategy,application_component_strategy +ApplicationComponentSummary,application_component_summary +ApplicationConfig,application_config +ApplicationConfiguration,application_configuration +ApplicationConfigurationDescription,application_configuration_description +ApplicationConfigurationUpdate,application_configuration_update +ApplicationCredential,application_credential +ApplicationDPUSizes,application_dpu_sizes +ApplicationDateRangeKpiResponse,application_date_range_kpi_response +ApplicationDependencySummary,application_dependency_summary +ApplicationDescription,application_description +ApplicationDescriptionMessage,application_description_message +ApplicationDescriptionsMessage,application_descriptions_message +ApplicationDetail,application_detail +ApplicationDoesNotExistException,application_does_not_exist_exception +ApplicationDomain,application_domain +ApplicationFleetAssociation,application_fleet_association +ApplicationFleetAssociations,application_fleet_associations +ApplicationId,application_id +ApplicationIdentifier,application_identifier +ApplicationIds,application_ids +ApplicationInfo,application_info +ApplicationInfoList,application_info_list +ApplicationInstance,application_instance +ApplicationInstanceId,application_instance_id +ApplicationInstanceIdToReplace,application_instance_id_to_replace +ApplicationInstances,application_instances +ApplicationIntegrationURL,application_integration_url +ApplicationLayerAutomaticResponseConfiguration,application_layer_automatic_response_configuration +ApplicationLimitExceededException,application_limit_exceeded_exception +ApplicationMaintenanceConfigurationDescription,application_maintenance_configuration_description +ApplicationMaintenanceConfigurationUpdate,application_maintenance_configuration_update +ApplicationMaintenanceWindowEndTime,application_maintenance_window_end_time +ApplicationMaintenanceWindowStartTime,application_maintenance_window_start_time +ApplicationMaintenanceWindowStartTimeUpdate,application_maintenance_window_start_time_update +ApplicationMetrics,application_metrics +ApplicationMode,application_mode +ApplicationName,application_name +ApplicationNameRequiredException,application_name_required_exception +ApplicationNames,application_names +ApplicationPermissions,application_permissions +ApplicationPolicies,application_policies +ApplicationPolicyStatement,application_policy_statement +ApplicationPreferences,application_preferences +ApplicationQuota,application_quota +ApplicationResourceLifecycleConfig,application_resource_lifecycle_config +ApplicationResourceLifecycleDescriptionMessage,application_resource_lifecycle_description_message +ApplicationResponse,application_response +ApplicationRestoreConfiguration,application_restore_configuration +ApplicationRestoreConfigurationDescription,application_restore_configuration_description +ApplicationRestoreType,application_restore_type +ApplicationRuntimeId,application_runtime_id +ApplicationServerPublicKey,application_server_public_key +ApplicationSettings,application_settings +ApplicationSettingsJourneyLimits,application_settings_journey_limits +ApplicationSettingsResource,application_settings_resource +ApplicationSettingsResponse,application_settings_response +ApplicationSnapshotConfiguration,application_snapshot_configuration +ApplicationSnapshotConfigurationDescription,application_snapshot_configuration_description +ApplicationSnapshotConfigurationUpdate,application_snapshot_configuration_update +ApplicationSource,application_source +ApplicationSourceConfig,application_source_config +ApplicationSources,application_sources +ApplicationState,application_state +ApplicationStateList,application_state_list +ApplicationStatus,application_status +ApplicationSuccessFeedbackRoleArn,application_success_feedback_role_arn +ApplicationSummaries,application_summaries +ApplicationSummary,application_summary +ApplicationSummaryList,application_summary_list +ApplicationTransactionCounter,application_transaction_counter +ApplicationType,application_type +ApplicationUpdate,application_update +ApplicationVersion,application_version +ApplicationVersionArn,application_version_arn +ApplicationVersionDescription,application_version_description +ApplicationVersionDescriptionMessage,application_version_description_message +ApplicationVersionDescriptionsMessage,application_version_descriptions_message +ApplicationVersionDetail,application_version_detail +ApplicationVersionId,application_version_id +ApplicationVersionLifecycleConfig,application_version_lifecycle_config +ApplicationVersionQuota,application_version_quota +ApplicationVersionRolledBackFrom,application_version_rolled_back_from +ApplicationVersionRolledBackTo,application_version_rolled_back_to +ApplicationVersionSummaries,application_version_summaries +ApplicationVersionSummary,application_version_summary +ApplicationVersionUpdatedFrom,application_version_updated_from +ApplicationVersions,application_versions +Applications,applications +ApplicationsResponse,applications_response +AppliedColorSpaceConversion,applied_color_space_conversion +AppliedDdls,applied_ddls +AppliedDeletes,applied_deletes +AppliedExtension,applied_extension +AppliedExtensions,applied_extensions +AppliedInserts,applied_inserts +AppliedSchemaArn,applied_schema_arn +AppliedSettings,applied_settings +AppliedTerminologies,applied_terminologies +AppliedTerminology,applied_terminology +AppliedUpdates,applied_updates +AppliedValue,applied_value +ApplyAction,apply_action +ApplyArchiveRuleRequest,apply_archive_rule_request +ApplyEnvironmentManagedActionRequest,apply_environment_managed_action_request +ApplyEnvironmentManagedActionResult,apply_environment_managed_action_result +ApplyFontColor,apply_font_color +ApplyImmediately,apply_immediately +ApplyMapping,apply_mapping +ApplyMethod,apply_method +ApplyOn,apply_on +ApplyOnlyAtCronInterval,apply_only_at_cron_interval +ApplyPendingMaintenance,apply_pending_maintenance +ApplyPendingMaintenanceActionMessage,apply_pending_maintenance_action_message +ApplyPendingMaintenanceActionResponse,apply_pending_maintenance_action_response +ApplyPendingMaintenanceActionResult,apply_pending_maintenance_action_result +ApplySchemaRequest,apply_schema_request +ApplySchemaResponse,apply_schema_response +ApplySecurityGroupsToClientVpnTargetNetworkRequest,apply_security_groups_to_client_vpn_target_network_request +ApplySecurityGroupsToClientVpnTargetNetworkResult,apply_security_groups_to_client_vpn_target_network_result +ApplySecurityGroupsToLoadBalancerInput,apply_security_groups_to_load_balancer_input +ApplySecurityGroupsToLoadBalancerOutput,apply_security_groups_to_load_balancer_output +ApplyServerSideEncryptionByDefault,apply_server_side_encryption_by_default +ApplyStatus,apply_status +ApplyTo,apply_to +ApplyToAllRegions,apply_to_all_regions +ApplyType,apply_type +Approval,approval +ApprovalAlreadyCompletedException,approval_already_completed_exception +ApprovalDate,approval_date +ApprovalDescription,approval_description +ApprovalModel,approval_model +ApprovalResult,approval_result +ApprovalRule,approval_rule +ApprovalRuleContentRequiredException,approval_rule_content_required_exception +ApprovalRuleDoesNotExistException,approval_rule_does_not_exist_exception +ApprovalRuleEventMetadata,approval_rule_event_metadata +ApprovalRuleNameAlreadyExistsException,approval_rule_name_already_exists_exception +ApprovalRuleNameRequiredException,approval_rule_name_required_exception +ApprovalRuleOverriddenEventMetadata,approval_rule_overridden_event_metadata +ApprovalRuleTemplate,approval_rule_template +ApprovalRuleTemplateContentRequiredException,approval_rule_template_content_required_exception +ApprovalRuleTemplateDoesNotExistException,approval_rule_template_does_not_exist_exception +ApprovalRuleTemplateInUseException,approval_rule_template_in_use_exception +ApprovalRuleTemplateNameAlreadyExistsException,approval_rule_template_name_already_exists_exception +ApprovalRuleTemplateNameRequiredException,approval_rule_template_name_required_exception +ApprovalRules,approval_rules +ApprovalStateChangedEventMetadata,approval_state_changed_event_metadata +ApprovalStateRequiredException,approval_state_required_exception +ApprovalThresholdPolicy,approval_threshold_policy +ApprovalTime,approval_time +ApproveAfterDays,approve_after_days +ApproveAssignmentRequest,approve_assignment_request +ApproveSkillRequest,approve_skill_request +ApproveUntilDate,approve_until_date +ApprovedOrigins,approved_origins +ApprovedPatches,approved_patches +ApprovedPatchesComplianceLevel,approved_patches_compliance_level +ApprovedPatchesEnableNonSecurity,approved_patches_enable_non_security +ApprovedVersion,approved_version +ApproximateAggregateValue,approximate_aggregate_value +ApproximateArrivalTimestamp,approximate_arrival_timestamp +ApproximateAssetCount,approximate_asset_count +ApproximateCount,approximate_count +ApproximateCreationDateTime,approximate_creation_date_time +ApproximateDurationSeconds,approximate_duration_seconds +ApproximateNumberOfMessagesMoved,approximate_number_of_messages_moved +ApproximateNumberOfMessagesToMove,approximate_number_of_messages_to_move +ApproximateResultCount,approximate_result_count +ApproximateStartTime,approximate_start_time +ApproximateTime,approximate_time +ApproximateTotalCount,approximate_total_count +ApproximateUniqueCount,approximate_unique_count +ApproximateValue,approximate_value +Apps,apps +AppsCount,apps_count +AppsList,apps_list +AppsListArn,apps_list_arn +AppsListData,apps_list_data +AppsListDataSummary,apps_list_data_summary +AppsLists,apps_lists +AppstreamAgentVersion,appstream_agent_version +AquaConfiguration,aqua_configuration +AquaConfigurationStatus,aqua_configuration_status +AquaStatus,aqua_status +ArbitraryPatternLimits,arbitrary_pattern_limits +Arc,arc +ArcAngle,arc_angle +ArcAxis,arc_axis +ArcAxisConfiguration,arc_axis_configuration +ArcAxisDisplayRange,arc_axis_display_range +ArcConfiguration,arc_configuration +ArcOptions,arc_options +ArcThickness,arc_thickness +Arch,arch +ArchitecturalDesign,architectural_design +Architecture,architecture +ArchitectureTypes,architecture_types +Architectures,architectures +ArchivalBackupArn,archival_backup_arn +ArchivalCompleteTime,archival_complete_time +ArchivalDateTime,archival_date_time +ArchivalReason,archival_reason +ArchivalSummary,archival_summary +Archive,archive +ArchiveAllowedFlag,archive_allowed_flag +ArchiveApplicationRequest,archive_application_request +ArchiveArn,archive_arn +ArchiveCdnSettings,archive_cdn_settings +ArchiveContainerSettings,archive_container_settings +ArchiveCreationOutput,archive_creation_output +ArchiveDescription,archive_description +ArchiveFindingsRequest,archive_findings_request +ArchiveGroupSettings,archive_group_settings +ArchiveId,archive_id +ArchiveName,archive_name +ArchiveOutputSettings,archive_output_settings +ArchiveRetainRule,archive_retain_rule +ArchiveRule,archive_rule +ArchiveRuleSummary,archive_rule_summary +ArchiveS3Settings,archive_s3_settings +ArchiveSHA256TreeHash,archive_sha256_tree_hash +ArchiveSizeInBytes,archive_size_in_bytes +ArchiveStatus,archive_status +ArchiveWaveRequest,archive_wave_request +Archived,archived +ArchivedLogDestId,archived_log_dest_id +ArchivedLogsOnly,archived_logs_only +Archives,archives +AreaCode,area_code +AreaOfInterest,area_of_interest +AreaStyleSettings,area_style_settings +AreaUnderPRCurve,area_under_pr_curve +Args,args +ArgumentException,argument_exception +Arguments,arguments +ArgumentsMap,arguments_map +Arib,arib +AribCaptionsPid,arib_captions_pid +AribCaptionsPidControl,arib_captions_pid_control +AribDestinationSettings,arib_destination_settings +AribSourceSettings,arib_source_settings +Arn,arn +ArnNotSupportedException,arn_not_supported_exception +Arns,arns +ArrayColumnInfo,array_column_info +ArrayProperties,array_properties +ArrayPropertiesDetail,array_properties_detail +ArrayPropertiesSummary,array_properties_summary +ArrayValue,array_value +ArrivalDate,arrival_date +Artifact,artifact +ArtifactArn,artifact_arn +ArtifactConfig,artifact_config +ArtifactConfigInput,artifact_config_input +ArtifactConfigOutput,artifact_config_output +ArtifactDetail,artifact_detail +ArtifactDetails,artifact_details +ArtifactDigest,artifact_digest +ArtifactId,artifact_id +ArtifactIdentifier,artifact_identifier +ArtifactLocation,artifact_location +ArtifactName,artifact_name +ArtifactPath,artifact_path +ArtifactRevision,artifact_revision +ArtifactS3Location,artifact_s3_location +ArtifactSource,artifact_source +ArtifactSourceType,artifact_source_type +ArtifactStore,artifact_store +ArtifactSummaries,artifact_summaries +ArtifactSummary,artifact_summary +ArtifactType,artifact_type +Artifacts,artifacts +ArtifactsConcatenationConfiguration,artifacts_concatenation_configuration +ArtifactsConfiguration,artifacts_configuration +Artwork,artwork +As2Config,as2_config +As2ConnectorConfig,as2_connector_config +As2Id,as2_id +As2Transports,as2_transports +AsPath,as_path +Ascending,ascending +AsmPassword,asm_password +AsmServer,asm_server +AsmUser,asm_user +Asn,asn +AsnOrg,asn_org +AspectRatio,aspect_ratio +AssembleWith,assemble_with +AssertedControls,asserted_controls +AssertionAttributes,assertion_attributes +AssertionRule,assertion_rule +AssertionRuleUpdate,assertion_rule_update +Assessment,assessment +AssessmentControl,assessment_control +AssessmentControlSet,assessment_control_set +AssessmentEvidenceFolder,assessment_evidence_folder +AssessmentFramework,assessment_framework +AssessmentFrameworkMetadata,assessment_framework_metadata +AssessmentFrameworkShareRequest,assessment_framework_share_request +AssessmentMetadata,assessment_metadata +AssessmentMetadataItem,assessment_metadata_item +AssessmentProgress,assessment_progress +AssessmentReport,assessment_report +AssessmentReportEvidenceError,assessment_report_evidence_error +AssessmentReportMetadata,assessment_report_metadata +AssessmentReportTypes,assessment_report_types +AssessmentReportsDestination,assessment_reports_destination +AssessmentResults,assessment_results +AssessmentResultsFile,assessment_results_file +AssessmentRun,assessment_run +AssessmentRunAgent,assessment_run_agent +AssessmentRunFilter,assessment_run_filter +AssessmentRunInProgressException,assessment_run_in_progress_exception +AssessmentRunName,assessment_run_name +AssessmentRunNotification,assessment_run_notification +AssessmentRunStateChange,assessment_run_state_change +AssessmentStatus,assessment_status +AssessmentSummary,assessment_summary +AssessmentTarget,assessment_target +AssessmentTargetFilter,assessment_target_filter +AssessmentTemplate,assessment_template +AssessmentTemplateFilter,assessment_template_filter +Asset,asset +AssetAttributes,asset_attributes +AssetBundleCloudFormationOverridePropertyConfiguration,asset_bundle_cloud_formation_override_property_configuration +AssetBundleExportJobAnalysisOverrideProperties,asset_bundle_export_job_analysis_override_properties +AssetBundleExportJobDashboardOverrideProperties,asset_bundle_export_job_dashboard_override_properties +AssetBundleExportJobDataSetOverrideProperties,asset_bundle_export_job_data_set_override_properties +AssetBundleExportJobDataSourceOverrideProperties,asset_bundle_export_job_data_source_override_properties +AssetBundleExportJobError,asset_bundle_export_job_error +AssetBundleExportJobId,asset_bundle_export_job_id +AssetBundleExportJobRefreshScheduleOverrideProperties,asset_bundle_export_job_refresh_schedule_override_properties +AssetBundleExportJobResourceIdOverrideConfiguration,asset_bundle_export_job_resource_id_override_configuration +AssetBundleExportJobSummary,asset_bundle_export_job_summary +AssetBundleExportJobSummaryList,asset_bundle_export_job_summary_list +AssetBundleExportJobThemeOverrideProperties,asset_bundle_export_job_theme_override_properties +AssetBundleExportJobVPCConnectionOverrideProperties,asset_bundle_export_job_vpc_connection_override_properties +AssetBundleImportJobAnalysisOverrideParameters,asset_bundle_import_job_analysis_override_parameters +AssetBundleImportJobDashboardOverrideParameters,asset_bundle_import_job_dashboard_override_parameters +AssetBundleImportJobDataSetOverrideParameters,asset_bundle_import_job_data_set_override_parameters +AssetBundleImportJobDataSourceCredentialPair,asset_bundle_import_job_data_source_credential_pair +AssetBundleImportJobDataSourceCredentials,asset_bundle_import_job_data_source_credentials +AssetBundleImportJobDataSourceOverrideParameters,asset_bundle_import_job_data_source_override_parameters +AssetBundleImportJobError,asset_bundle_import_job_error +AssetBundleImportJobId,asset_bundle_import_job_id +AssetBundleImportJobOverrideParameters,asset_bundle_import_job_override_parameters +AssetBundleImportJobRefreshScheduleOverrideParameters,asset_bundle_import_job_refresh_schedule_override_parameters +AssetBundleImportJobResourceIdOverrideConfiguration,asset_bundle_import_job_resource_id_override_configuration +AssetBundleImportJobSummary,asset_bundle_import_job_summary +AssetBundleImportJobSummaryList,asset_bundle_import_job_summary_list +AssetBundleImportJobThemeOverrideParameters,asset_bundle_import_job_theme_override_parameters +AssetBundleImportJobVPCConnectionOverrideParameters,asset_bundle_import_job_vpc_connection_override_parameters +AssetBundleImportSource,asset_bundle_import_source +AssetBundleImportSourceDescription,asset_bundle_import_source_description +AssetCompositeModel,asset_composite_model +AssetDestinationEntry,asset_destination_entry +AssetDestinations,asset_destinations +AssetDetails,asset_details +AssetEntry,asset_entry +AssetErrorDetails,asset_error_details +AssetHierarchy,asset_hierarchy +AssetHierarchyInfo,asset_hierarchy_info +AssetId,asset_id +AssetIds,asset_ids +AssetInfo,asset_info +AssetInformationList,asset_information_list +AssetLocation,asset_location +AssetModelCompositeModel,asset_model_composite_model +AssetModelCompositeModelDefinition,asset_model_composite_model_definition +AssetModelHierarchy,asset_model_hierarchy +AssetModelHierarchyDefinition,asset_model_hierarchy_definition +AssetModelProperty,asset_model_property +AssetModelPropertyDefinition,asset_model_property_definition +AssetModelPropertySummary,asset_model_property_summary +AssetModelStatus,asset_model_status +AssetModelSummary,asset_model_summary +AssetName,asset_name +AssetProperty,asset_property +AssetPropertySummary,asset_property_summary +AssetPropertyTimestamp,asset_property_timestamp +AssetPropertyValue,asset_property_value +AssetPropertyVariant,asset_property_variant +AssetRelationshipSummary,asset_relationship_summary +AssetShallow,asset_shallow +AssetSource,asset_source +AssetSourceEntry,asset_source_entry +AssetSources,asset_sources +AssetStatus,asset_status +AssetSummary,asset_summary +AssetType,asset_type +AssetValue,asset_value +Assets,assets +Assign,assign +AssignContactCategoryAction,assign_contact_category_action +AssignInstanceRequest,assign_instance_request +AssignIpv6AddressOnCreation,assign_ipv6_address_on_creation +AssignIpv6AddressesRequest,assign_ipv6_addresses_request +AssignIpv6AddressesResult,assign_ipv6_addresses_result +AssignPrivateIpAddressesRequest,assign_private_ip_addresses_request +AssignPrivateIpAddressesResult,assign_private_ip_addresses_result +AssignPrivateNatGatewayAddressRequest,assign_private_nat_gateway_address_request +AssignPrivateNatGatewayAddressResult,assign_private_nat_gateway_address_result +AssignPublicIp,assign_public_ip +AssignTapePoolInput,assign_tape_pool_input +AssignTapePoolOutput,assign_tape_pool_output +AssignVolumeRequest,assign_volume_request +AssignedIpv4Prefixes,assigned_ipv4_prefixes +AssignedIpv6Addresses,assigned_ipv6_addresses +AssignedIpv6Prefixes,assigned_ipv6_prefixes +AssignedPrivateIpAddress,assigned_private_ip_address +AssignedPrivateIpAddresses,assigned_private_ip_addresses +Assigning,assigning +Assignment,assignment +AssignmentDurationInSeconds,assignment_duration_in_seconds +AssignmentId,assignment_id +AssignmentName,assignment_name +AssignmentReviewPolicy,assignment_review_policy +AssignmentReviewReport,assignment_review_report +AssignmentStatus,assignment_status +AssignmentStatuses,assignment_statuses +Assignments,assignments +AssistAltitude,assist_altitude +AssistPosition,assist_position +AssistantAssociationData,assistant_association_data +AssistantAssociationSummary,assistant_association_summary +AssistantData,assistant_data +AssistantIntegrationConfiguration,assistant_integration_configuration +AssistantSummary,assistant_summary +AssociateAccountsInput,associate_accounts_input +AssociateAccountsOutput,associate_accounts_output +AssociateAddressRequest,associate_address_request +AssociateAddressResult,associate_address_result +AssociateAdminAccountRequest,associate_admin_account_request +AssociateAliasRequest,associate_alias_request +AssociateApiRequest,associate_api_request +AssociateApiResponse,associate_api_response +AssociateAppBlockBuilderAppBlockRequest,associate_app_block_builder_app_block_request +AssociateAppBlockBuilderAppBlockResult,associate_app_block_builder_app_block_result +AssociateApplicationFleetRequest,associate_application_fleet_request +AssociateApplicationFleetResult,associate_application_fleet_result +AssociateApplicationToEntitlementRequest,associate_application_to_entitlement_request +AssociateApplicationsRequest,associate_applications_request +AssociateApprovalRuleTemplateWithRepositoryInput,associate_approval_rule_template_with_repository_input +AssociateApprovedOriginRequest,associate_approved_origin_request +AssociateAssessmentReportEvidenceFolderRequest,associate_assessment_report_evidence_folder_request +AssociateAssetsRequest,associate_assets_request +AssociateAttributeGroupRequest,associate_attribute_group_request +AssociateAttributeGroupResponse,associate_attribute_group_response +AssociateAwsAccountWithPartnerAccountRequest,associate_aws_account_with_partner_account_request +AssociateAwsAccountWithPartnerAccountResponse,associate_aws_account_with_partner_account_response +AssociateBotRequest,associate_bot_request +AssociateBrowserSettingsRequest,associate_browser_settings_request +AssociateBrowserSettingsResponse,associate_browser_settings_response +AssociateBudgetWithResourceInput,associate_budget_with_resource_input +AssociateCarrierIpAddress,associate_carrier_ip_address +AssociateCertificateRequest,associate_certificate_request +AssociateChannelFlowRequest,associate_channel_flow_request +AssociateClientDeviceWithCoreDeviceEntry,associate_client_device_with_core_device_entry +AssociateClientDeviceWithCoreDeviceErrorEntry,associate_client_device_with_core_device_error_entry +AssociateClientVpnTargetNetworkRequest,associate_client_vpn_target_network_request +AssociateClientVpnTargetNetworkResult,associate_client_vpn_target_network_result +AssociateConfigurationItemsToApplicationRequest,associate_configuration_items_to_application_request +AssociateConnectPeerRequest,associate_connect_peer_request +AssociateConnectPeerResponse,associate_connect_peer_response +AssociateConnectionAliasRequest,associate_connection_alias_request +AssociateConnectionAliasResult,associate_connection_alias_result +AssociateConnectionWithLagRequest,associate_connection_with_lag_request +AssociateContactWithAddressBookRequest,associate_contact_with_address_book_request +AssociateCreatedArtifactRequest,associate_created_artifact_request +AssociateCustomDomainRequest,associate_custom_domain_request +AssociateCustomDomainResponse,associate_custom_domain_response +AssociateCustomerGatewayRequest,associate_customer_gateway_request +AssociateCustomerGatewayResponse,associate_customer_gateway_response +AssociateDRTLogBucketRequest,associate_drt_log_bucket_request +AssociateDRTRoleRequest,associate_drt_role_request +AssociateDataShareConsumerMessage,associate_data_share_consumer_message +AssociateDefaultViewInput,associate_default_view_input +AssociateDefaultViewOutput,associate_default_view_output +AssociateDefaultVocabularyRequest,associate_default_vocabulary_request +AssociateDelegateToResourceRequest,associate_delegate_to_resource_request +AssociateDelegationSignerToDomainRequest,associate_delegation_signer_to_domain_request +AssociateDelegationSignerToDomainResponse,associate_delegation_signer_to_domain_response +AssociateDeviceWithNetworkProfileRequest,associate_device_with_network_profile_request +AssociateDeviceWithPlacementRequest,associate_device_with_placement_request +AssociateDeviceWithRoomRequest,associate_device_with_room_request +AssociateDhcpOptionsRequest,associate_dhcp_options_request +AssociateDiscoveredResourceRequest,associate_discovered_resource_request +AssociateDomainRequest,associate_domain_request +AssociateElasticIpRequest,associate_elastic_ip_request +AssociateEnclaveCertificateIamRoleRequest,associate_enclave_certificate_iam_role_request +AssociateEnclaveCertificateIamRoleResult,associate_enclave_certificate_iam_role_result +AssociateEncryptionConfigRequest,associate_encryption_config_request +AssociateEncryptionConfigResponse,associate_encryption_config_response +AssociateEntireAccount,associate_entire_account +AssociateEntitiesToExperienceRequest,associate_entities_to_experience_request +AssociateEntitiesToExperienceResponse,associate_entities_to_experience_response +AssociateEntityToThingRequest,associate_entity_to_thing_request +AssociateEnvironmentOperationsRoleMessage,associate_environment_operations_role_message +AssociateExternalConnectionRequest,associate_external_connection_request +AssociateExternalConnectionResult,associate_external_connection_result +AssociateFacesRequest,associate_faces_request +AssociateFacesResponse,associate_faces_response +AssociateFileSystemAliasesRequest,associate_file_system_aliases_request +AssociateFileSystemAliasesResponse,associate_file_system_aliases_response +AssociateFileSystemInput,associate_file_system_input +AssociateFileSystemOutput,associate_file_system_output +AssociateFirewallPolicyRequest,associate_firewall_policy_request +AssociateFirewallPolicyResponse,associate_firewall_policy_response +AssociateFirewallRuleGroupRequest,associate_firewall_rule_group_request +AssociateFirewallRuleGroupResponse,associate_firewall_rule_group_response +AssociateFleetRequest,associate_fleet_request +AssociateFraudsterRequest,associate_fraudster_request +AssociateFraudsterResponse,associate_fraudster_response +AssociateGatewayToServerInput,associate_gateway_to_server_input +AssociateGatewayToServerOutput,associate_gateway_to_server_output +AssociateHealthCheckRequest,associate_health_check_request +AssociateHostedConnectionRequest,associate_hosted_connection_request +AssociateIamInstanceProfileRequest,associate_iam_instance_profile_request +AssociateIamInstanceProfileResult,associate_iam_instance_profile_result +AssociateIdentityProviderConfigRequest,associate_identity_provider_config_request +AssociateIdentityProviderConfigResponse,associate_identity_provider_config_response +AssociateInstanceEventWindowRequest,associate_instance_event_window_request +AssociateInstanceEventWindowResult,associate_instance_event_window_result +AssociateInstanceStorageConfigRequest,associate_instance_storage_config_request +AssociateInstanceStorageConfigResponse,associate_instance_storage_config_response +AssociateIpAccessSettingsRequest,associate_ip_access_settings_request +AssociateIpAccessSettingsResponse,associate_ip_access_settings_response +AssociateIpGroupsRequest,associate_ip_groups_request +AssociateIpamResourceDiscoveryRequest,associate_ipam_resource_discovery_request +AssociateIpamResourceDiscoveryResult,associate_ipam_resource_discovery_result +AssociateKmsKeyRequest,associate_kms_key_request +AssociateLambdaFunctionRequest,associate_lambda_function_request +AssociateLensesInput,associate_lenses_input +AssociateLexBotRequest,associate_lex_bot_request +AssociateLicenseRequest,associate_license_request +AssociateLicenseResponse,associate_license_response +AssociateLinkRequest,associate_link_request +AssociateLinkResponse,associate_link_response +AssociateMacSecKeyRequest,associate_mac_sec_key_request +AssociateMacSecKeyResponse,associate_mac_sec_key_response +AssociateMemberAccountRequest,associate_member_account_request +AssociateMemberRequest,associate_member_request +AssociateMemberResponse,associate_member_response +AssociateMemberToGroupRequest,associate_member_to_group_request +AssociateMergedGraphqlApiRequest,associate_merged_graphql_api_request +AssociateMergedGraphqlApiResponse,associate_merged_graphql_api_response +AssociateMulticastGroupWithFuotaTaskRequest,associate_multicast_group_with_fuota_task_request +AssociateNatGatewayAddressRequest,associate_nat_gateway_address_request +AssociateNatGatewayAddressResult,associate_nat_gateway_address_result +AssociateNetworkSettingsRequest,associate_network_settings_request +AssociateNetworkSettingsResponse,associate_network_settings_response +AssociateNodeRequest,associate_node_request +AssociateNodeResponse,associate_node_response +AssociateOpsItemRelatedItemRequest,associate_ops_item_related_item_request +AssociateOpsItemRelatedItemResponse,associate_ops_item_related_item_response +AssociateOriginationIdentityRequest,associate_origination_identity_request +AssociateOriginationIdentityResult,associate_origination_identity_result +AssociatePackageRequest,associate_package_request +AssociatePackageResponse,associate_package_response +AssociatePersonasToEntitiesRequest,associate_personas_to_entities_request +AssociatePersonasToEntitiesResponse,associate_personas_to_entities_response +AssociatePhoneNumberContactFlowRequest,associate_phone_number_contact_flow_request +AssociatePhoneNumberWithUserRequest,associate_phone_number_with_user_request +AssociatePhoneNumbersWithVoiceConnectorGroupRequest,associate_phone_numbers_with_voice_connector_group_request +AssociatePhoneNumbersWithVoiceConnectorGroupResponse,associate_phone_numbers_with_voice_connector_group_response +AssociatePhoneNumbersWithVoiceConnectorRequest,associate_phone_numbers_with_voice_connector_request +AssociatePhoneNumbersWithVoiceConnectorResponse,associate_phone_numbers_with_voice_connector_response +AssociatePricingRulesInput,associate_pricing_rules_input +AssociatePricingRulesOutput,associate_pricing_rules_output +AssociatePrincipalWithPortfolioInput,associate_principal_with_portfolio_input +AssociateProactiveEngagementDetailsRequest,associate_proactive_engagement_details_request +AssociateProductWithPortfolioInput,associate_product_with_portfolio_input +AssociateProfilesInput,associate_profiles_input +AssociatePublicIpAddress,associate_public_ip_address +AssociateQualificationWithWorkerRequest,associate_qualification_with_worker_request +AssociateQueueQuickConnectsRequest,associate_queue_quick_connects_request +AssociateRepositoryRequest,associate_repository_request +AssociateRepositoryResponse,associate_repository_response +AssociateResolverEndpointIpAddressRequest,associate_resolver_endpoint_ip_address_request +AssociateResolverEndpointIpAddressResponse,associate_resolver_endpoint_ip_address_response +AssociateResolverQueryLogConfigRequest,associate_resolver_query_log_config_request +AssociateResolverQueryLogConfigResponse,associate_resolver_query_log_config_response +AssociateResolverRuleRequest,associate_resolver_rule_request +AssociateResolverRuleResponse,associate_resolver_rule_response +AssociateResourceError,associate_resource_error +AssociateResourceRequest,associate_resource_request +AssociateResourceResponse,associate_resource_response +AssociateResourceResponseElement,associate_resource_response_element +AssociateResourceSharePermissionRequest,associate_resource_share_permission_request +AssociateResourceSharePermissionResponse,associate_resource_share_permission_response +AssociateResourceShareRequest,associate_resource_share_request +AssociateResourceShareResponse,associate_resource_share_response +AssociateRoleToGroupRequest,associate_role_to_group_request +AssociateRoleToGroupResponse,associate_role_to_group_response +AssociateRouteTableRequest,associate_route_table_request +AssociateRouteTableResult,associate_route_table_result +AssociateRoutingProfileQueuesRequest,associate_routing_profile_queues_request +AssociateS3ResourcesRequest,associate_s3_resources_request +AssociateS3ResourcesResult,associate_s3_resources_result +AssociateSecurityKeyRequest,associate_security_key_request +AssociateSecurityKeyResponse,associate_security_key_response +AssociateServiceActionWithProvisioningArtifactInput,associate_service_action_with_provisioning_artifact_input +AssociateServiceRoleToAccountRequest,associate_service_role_to_account_request +AssociateServiceRoleToAccountResponse,associate_service_role_to_account_response +AssociateSigninDelegateGroupsWithAccountRequest,associate_signin_delegate_groups_with_account_request +AssociateSkillGroupWithRoomRequest,associate_skill_group_with_room_request +AssociateSkillWithSkillGroupRequest,associate_skill_with_skill_group_request +AssociateSkillWithUsersRequest,associate_skill_with_users_request +AssociateSoftwareTokenRequest,associate_software_token_request +AssociateSoftwareTokenResponse,associate_software_token_response +AssociateSourceGraphqlApiRequest,associate_source_graphql_api_request +AssociateSourceGraphqlApiResponse,associate_source_graphql_api_response +AssociateSourceNetworkStackRequest,associate_source_network_stack_request +AssociateSourceNetworkStackResponse,associate_source_network_stack_response +AssociateSourceServersRequest,associate_source_servers_request +AssociateSubnetCidrBlockRequest,associate_subnet_cidr_block_request +AssociateSubnetCidrBlockResult,associate_subnet_cidr_block_result +AssociateSubnetsRequest,associate_subnets_request +AssociateSubnetsResponse,associate_subnets_response +AssociateTagOptionWithResourceInput,associate_tag_option_with_resource_input +AssociateTargetsWithJobRequest,associate_targets_with_job_request +AssociateTargetsWithJobResponse,associate_targets_with_job_response +AssociateTeamMemberRequest,associate_team_member_request +AssociateTeamMemberResult,associate_team_member_result +AssociateThirdPartyFirewallRequest,associate_third_party_firewall_request +AssociateThirdPartyFirewallResponse,associate_third_party_firewall_response +AssociateTimeSeriesToAssetPropertyRequest,associate_time_series_to_asset_property_request +AssociateTrackerConsumerRequest,associate_tracker_consumer_request +AssociateTrafficDistributionGroupUserRequest,associate_traffic_distribution_group_user_request +AssociateTransitGatewayConnectPeerRequest,associate_transit_gateway_connect_peer_request +AssociateTransitGatewayConnectPeerResponse,associate_transit_gateway_connect_peer_response +AssociateTransitGatewayMulticastDomainRequest,associate_transit_gateway_multicast_domain_request +AssociateTransitGatewayMulticastDomainResult,associate_transit_gateway_multicast_domain_result +AssociateTransitGatewayPolicyTableRequest,associate_transit_gateway_policy_table_request +AssociateTransitGatewayPolicyTableResult,associate_transit_gateway_policy_table_result +AssociateTransitGatewayRouteTableRequest,associate_transit_gateway_route_table_request +AssociateTransitGatewayRouteTableResult,associate_transit_gateway_route_table_result +AssociateTrialComponentRequest,associate_trial_component_request +AssociateTrialComponentResponse,associate_trial_component_response +AssociateTrunkInterfaceRequest,associate_trunk_interface_request +AssociateTrunkInterfaceResult,associate_trunk_interface_result +AssociateTrustStoreRequest,associate_trust_store_request +AssociateTrustStoreResponse,associate_trust_store_response +AssociateUserAccessLoggingSettingsRequest,associate_user_access_logging_settings_request +AssociateUserAccessLoggingSettingsResponse,associate_user_access_logging_settings_response +AssociateUserRequest,associate_user_request +AssociateUserResponse,associate_user_response +AssociateUserSettingsRequest,associate_user_settings_request +AssociateUserSettingsResponse,associate_user_settings_response +AssociateUserToPermissionGroupRequest,associate_user_to_permission_group_request +AssociateUserToPermissionGroupResponse,associate_user_to_permission_group_response +AssociateVPCWithHostedZoneRequest,associate_vpc_with_hosted_zone_request +AssociateVPCWithHostedZoneResponse,associate_vpc_with_hosted_zone_response +AssociateVehicleFleetRequest,associate_vehicle_fleet_request +AssociateVirtualInterfaceRequest,associate_virtual_interface_request +AssociateVpcCidrBlockRequest,associate_vpc_cidr_block_request +AssociateVpcCidrBlockResult,associate_vpc_cidr_block_result +AssociateWebACLRequest,associate_web_acl_request +AssociateWebsiteAuthorizationProviderRequest,associate_website_authorization_provider_request +AssociateWebsiteAuthorizationProviderResponse,associate_website_authorization_provider_response +AssociateWebsiteCertificateAuthorityRequest,associate_website_certificate_authority_request +AssociateWebsiteCertificateAuthorityResponse,associate_website_certificate_authority_response +AssociateWirelessDeviceWithFuotaTaskRequest,associate_wireless_device_with_fuota_task_request +AssociateWirelessDeviceWithMulticastGroupRequest,associate_wireless_device_with_multicast_group_request +AssociateWirelessDeviceWithThingRequest,associate_wireless_device_with_thing_request +AssociateWirelessGatewayWithCertificateRequest,associate_wireless_gateway_with_certificate_request +AssociateWirelessGatewayWithCertificateResponse,associate_wireless_gateway_with_certificate_response +AssociateWirelessGatewayWithThingRequest,associate_wireless_gateway_with_thing_request +AssociatedAccountId,associated_account_id +AssociatedApplication,associated_application +AssociatedAssetsSummary,associated_assets_summary +AssociatedAt,associated_at +AssociatedClientDevice,associated_client_device +AssociatedClusterCount,associated_cluster_count +AssociatedClusters,associated_clusters +AssociatedEndpointGroupFoundException,associated_endpoint_group_found_exception +AssociatedFace,associated_face +AssociatedFaces,associated_faces +AssociatedGateway,associated_gateway +AssociatedGlueResource,associated_glue_resource +AssociatedHost,associated_host +AssociatedInsightId,associated_insight_id +AssociatedListenerFoundException,associated_listener_found_exception +AssociatedPermission,associated_permission +AssociatedPricingPlanCount,associated_pricing_plan_count +AssociatedResource,associated_resource +AssociatedResourceArns,associated_resource_arns +AssociatedResources,associated_resources +AssociatedRole,associated_role +AssociatedRoleArn,associated_role_arn +AssociatedRoles,associated_roles +AssociatedRuleGroupArn,associated_rule_group_arn +AssociatedStandard,associated_standard +AssociatedStandards,associated_standards +AssociatedTargetNetwork,associated_target_network +AssociatedTargetNetworks,associated_target_networks +AssociatedTimestamp,associated_timestamp +AssociatedTranscript,associated_transcript +AssociatedTranscriptFilter,associated_transcript_filter +AssociatedValues,associated_values +Association,association +AssociationArn,association_arn +AssociationConfig,association_config +AssociationCount,association_count +AssociationDate,association_date +AssociationDefaultRouteTableId,association_default_route_table_id +AssociationDescription,association_description +AssociationDoesNotExist,association_does_not_exist +AssociationExecution,association_execution +AssociationExecutionDoesNotExist,association_execution_does_not_exist +AssociationExecutionFilter,association_execution_filter +AssociationExecutionTarget,association_execution_target +AssociationExecutionTargets,association_execution_targets +AssociationExecutionTargetsFilter,association_execution_targets_filter +AssociationExecutions,association_executions +AssociationFilter,association_filter +AssociationFilterList,association_filter_list +AssociationId,association_id +AssociationIds,association_ids +AssociationName,association_name +AssociationOverview,association_overview +AssociationSet,association_set +AssociationSetDetails,association_set_details +AssociationSize,association_size +AssociationState,association_state +AssociationStateDetails,association_state_details +AssociationStatus,association_status +AssociationStatusAggregatedCount,association_status_aggregated_count +AssociationSummaries,association_summaries +AssociationSummary,association_summary +AssociationTarget,association_target +AssociationTime,association_time +AssociationType,association_type +AssociationVersion,association_version +AssociationVersionInfo,association_version_info +AssociationVersionLimitExceeded,association_version_limit_exceeded +AssociationVersions,association_versions +Associations,associations +AssumeControl,assume_control +AssumeDecoratedRoleWithSAMLRequest,assume_decorated_role_with_saml_request +AssumeDecoratedRoleWithSAMLResponse,assume_decorated_role_with_saml_response +AssumeImpersonationRoleRequest,assume_impersonation_role_request +AssumeImpersonationRoleResponse,assume_impersonation_role_response +AssumeRolePolicyDocument,assume_role_policy_document +AssumeRoleRequest,assume_role_request +AssumeRoleResponse,assume_role_response +AssumeRoleWithSAMLRequest,assume_role_with_saml_request +AssumeRoleWithSAMLResponse,assume_role_with_saml_response +AssumeRoleWithWebIdentityRequest,assume_role_with_web_identity_request +AssumeRoleWithWebIdentityResponse,assume_role_with_web_identity_response +AssumedRole,assumed_role +AssumedRoleId,assumed_role_id +AssumedRoleUser,assumed_role_user +AsymmetricEncryptionAttributes,asymmetric_encryption_attributes +AsyncErrorDetails,async_error_details +AsyncInferenceClientConfig,async_inference_client_config +AsyncInferenceConfig,async_inference_config +AsyncInferenceNotificationConfig,async_inference_notification_config +AsyncInferenceOutputConfig,async_inference_output_config +AsyncOperation,async_operation +AsyncRequestParameters,async_request_parameters +AsyncResponseDetails,async_response_details +AtRestEncryptionEnabled,at_rest_encryption_enabled +AtTime,at_time +AthenaConnectorSource,athena_connector_source +AthenaDatasetDefinition,athena_dataset_definition +AthenaError,athena_error +AthenaErrorCode,athena_error_code +AthenaIntegration,athena_integration +AthenaIntegrations,athena_integrations +AthenaParameters,athena_parameters +AthenaSourceConfig,athena_source_config +AtigData,atig_data +Atime,atime +AttachCertificateToDistributionRequest,attach_certificate_to_distribution_request +AttachCertificateToDistributionResult,attach_certificate_to_distribution_result +AttachClassicLinkVpcRequest,attach_classic_link_vpc_request +AttachClassicLinkVpcResult,attach_classic_link_vpc_result +AttachCustomerManagedPolicyReferenceToPermissionSetRequest,attach_customer_managed_policy_reference_to_permission_set_request +AttachDiskRequest,attach_disk_request +AttachDiskResult,attach_disk_result +AttachElasticLoadBalancerRequest,attach_elastic_load_balancer_request +AttachGroupPolicyRequest,attach_group_policy_request +AttachInstancesQuery,attach_instances_query +AttachInstancesToLoadBalancerRequest,attach_instances_to_load_balancer_request +AttachInstancesToLoadBalancerResult,attach_instances_to_load_balancer_result +AttachInternetGatewayRequest,attach_internet_gateway_request +AttachLoadBalancerTargetGroupsType,attach_load_balancer_target_groups_type +AttachLoadBalancerTlsCertificateRequest,attach_load_balancer_tls_certificate_request +AttachLoadBalancerTlsCertificateResult,attach_load_balancer_tls_certificate_result +AttachLoadBalancerToSubnetsInput,attach_load_balancer_to_subnets_input +AttachLoadBalancerToSubnetsOutput,attach_load_balancer_to_subnets_output +AttachLoadBalancersType,attach_load_balancers_type +AttachManagedPolicyToPermissionSetRequest,attach_managed_policy_to_permission_set_request +AttachNetworkInterfaceRequest,attach_network_interface_request +AttachNetworkInterfaceResult,attach_network_interface_result +AttachObject,attach_object +AttachObjectRequest,attach_object_request +AttachObjectResponse,attach_object_response +AttachPolicy,attach_policy +AttachPolicyRequest,attach_policy_request +AttachPrincipalPolicyRequest,attach_principal_policy_request +AttachRolePolicyRequest,attach_role_policy_request +AttachSecurityProfileRequest,attach_security_profile_request +AttachStaticIpRequest,attach_static_ip_request +AttachStaticIpResult,attach_static_ip_result +AttachThingPrincipalRequest,attach_thing_principal_request +AttachTime,attach_time +AttachToIndex,attach_to_index +AttachToIndexRequest,attach_to_index_request +AttachToIndexResponse,attach_to_index_response +AttachTrafficSourcesType,attach_traffic_sources_type +AttachTypedLink,attach_typed_link +AttachTypedLinkRequest,attach_typed_link_request +AttachTypedLinkResponse,attach_typed_link_response +AttachUserPolicyRequest,attach_user_policy_request +AttachVerifiedAccessTrustProviderRequest,attach_verified_access_trust_provider_request +AttachVerifiedAccessTrustProviderResult,attach_verified_access_trust_provider_result +AttachVolumeInput,attach_volume_input +AttachVolumeOutput,attach_volume_output +AttachVolumeRequest,attach_volume_request +AttachVpnGatewayRequest,attach_vpn_gateway_request +AttachVpnGatewayResult,attach_vpn_gateway_result +AttachedChannels,attached_channels +AttachedDisk,attached_disk +AttachedENIId,attached_eni_id +AttachedManagedPolicies,attached_managed_policies +AttachedManagedPolicy,attached_managed_policy +AttachedObjectIdentifier,attached_object_identifier +AttachedPermissionsBoundary,attached_permissions_boundary +AttachedPolicies,attached_policies +AttachedPolicy,attached_policy +AttachedPolicyIds,attached_policy_ids +AttachedTo,attached_to +AttachedVolumes,attached_volumes +Attachment,attachment +AttachmentConfiguration,attachment_configuration +AttachmentContent,attachment_content +AttachmentCount,attachment_count +AttachmentDetails,attachment_details +AttachmentEnaSrdSpecification,attachment_ena_srd_specification +AttachmentEnaSrdUdpSpecification,attachment_ena_srd_udp_specification +AttachmentFieldMappings,attachment_field_mappings +AttachmentId,attachment_id +AttachmentIdNotFound,attachment_id_not_found +AttachmentIds,attachment_ids +AttachmentInformation,attachment_information +AttachmentItem,attachment_item +AttachmentLimitExceeded,attachment_limit_exceeded +AttachmentName,attachment_name +AttachmentPolicyRuleNumber,attachment_policy_rule_number +AttachmentReference,attachment_reference +AttachmentSetExpired,attachment_set_expired +AttachmentSetIdNotFound,attachment_set_id_not_found +AttachmentSetSizeLimitExceeded,attachment_set_size_limit_exceeded +AttachmentSizeInBytes,attachment_size_in_bytes +AttachmentStateChange,attachment_state_change +AttachmentStatuses,attachment_statuses +AttachmentType,attachment_type +Attachments,attachments +AttachmentsContent,attachments_content +AttachmentsInformation,attachments_information +AttachmentsSource,attachments_source +Attack,attack +AttackCount,attack_count +AttackCounters,attack_counters +AttackDetail,attack_detail +AttackId,attack_id +AttackLayer,attack_layer +AttackProperties,attack_properties +AttackProperty,attack_property +AttackPropertyIdentifier,attack_property_identifier +AttackStatisticsDataItem,attack_statistics_data_item +AttackSummaries,attack_summaries +AttackSummary,attack_summary +AttackVectorDescription,attack_vector_description +AttackVectors,attack_vectors +AttackVolume,attack_volume +AttackVolumeStatistics,attack_volume_statistics +Attempt,attempt +AttemptContainerDetail,attempt_container_detail +AttemptCount,attempt_count +AttemptDetail,attempt_detail +Attempts,attempts +Attendee,attendee +AttendeeCapabilities,attendee_capabilities +AttendeeId,attendee_id +AttendeeIdItem,attendee_id_item +AttendeeIds,attendee_ids +Attendees,attendees +AttenuationControl,attenuation_control +AttestationDocument,attestation_document +Attribute,attribute +AttributeAction,attribute_action +AttributeActionType,attribute_action_type +AttributeAggregationFunction,attribute_aggregation_function +AttributeBooleanValue,attribute_boolean_value +AttributeConfig,attribute_config +AttributeConfigs,attribute_configs +AttributeDataType,attribute_data_type +AttributeDefinition,attribute_definition +AttributeDefinitions,attribute_definitions +AttributeDetails,attribute_details +AttributeDimension,attribute_dimension +AttributeFilter,attribute_filter +AttributeGroup,attribute_group +AttributeGroupDetails,attribute_group_details +AttributeGroupSummary,attribute_group_summary +AttributeItem,attribute_item +AttributeKey,attribute_key +AttributeKeyAndValue,attribute_key_and_value +AttributeLimitExceededException,attribute_limit_exceeded_exception +AttributeMapping,attribute_mapping +AttributeMatchingModel,attribute_matching_model +AttributeName,attribute_name +AttributeNameAndValue,attribute_name_and_value +AttributeNames,attribute_names +AttributeOperation,attribute_operation +AttributePath,attribute_path +AttributePayload,attribute_payload +AttributeReference,attribute_reference +AttributeSuggestionsConfig,attribute_suggestions_config +AttributeSuggestionsDescribeConfig,attribute_suggestions_describe_config +AttributeSuggestionsGetConfig,attribute_suggestions_get_config +AttributeSuggestionsMode,attribute_suggestions_mode +AttributeSuggestionsUpdateConfig,attribute_suggestions_update_config +AttributeType,attribute_type +AttributeTypesSelector,attribute_types_selector +AttributeUpdateValue,attribute_update_value +AttributeUpdates,attribute_updates +AttributeValue,attribute_value +AttributeValueList,attribute_value_list +AttributeValueTarget,attribute_value_target +AttributeValueUpdate,attribute_value_update +AttributeValues,attribute_values +Attributes,attributes +AttributesData,attributes_data +AttributesRequireVerificationBeforeUpdate,attributes_require_verification_before_update +AttributesResource,attributes_resource +AttributesToDelete,attributes_to_delete +AttributesToGet,attributes_to_get +Audience,audience +Audio,audio +AudioAggregationEndedAt,audio_aggregation_ended_at +AudioAggregationStartedAt,audio_aggregation_started_at +AudioAndDTMFInputSpecification,audio_and_dtmf_input_specification +AudioArtifactsConfiguration,audio_artifacts_configuration +AudioBufferModel,audio_buffer_model +AudioChannelConfigSchemeIdUri,audio_channel_config_scheme_id_uri +AudioChannelMapping,audio_channel_mapping +AudioChannelTaggingSettings,audio_channel_tagging_settings +AudioChannels,audio_channels +AudioChunk,audio_chunk +AudioCodecOptions,audio_codec_options +AudioCodecSettings,audio_codec_settings +AudioConcatenationConfiguration,audio_concatenation_configuration +AudioConfiguration,audio_configuration +AudioDeduplication,audio_deduplication +AudioDescription,audio_description +AudioDescriptionBroadcasterMix,audio_description_broadcaster_mix +AudioDescriptionNames,audio_description_names +AudioDescriptions,audio_descriptions +AudioDolbyEDecode,audio_dolby_e_decode +AudioDuration,audio_duration +AudioDurationCorrection,audio_duration_correction +AudioEvent,audio_event +AudioFallbackUrl,audio_fallback_url +AudioFeatures,audio_features +AudioFramesPerPes,audio_frames_per_pes +AudioGroupId,audio_group_id +AudioHlsRenditionSelection,audio_hls_rendition_selection +AudioHostUrl,audio_host_url +AudioInputEvent,audio_input_event +AudioLanguageSelection,audio_language_selection +AudioList,audio_list +AudioLogDestination,audio_log_destination +AudioLogSetting,audio_log_setting +AudioMetadata,audio_metadata +AudioNormalizationSettings,audio_normalization_settings +AudioOnlyContainer,audio_only_container +AudioOnlyHeader,audio_only_header +AudioOnlyHlsSettings,audio_only_hls_settings +AudioOnlyImage,audio_only_image +AudioOnlyTimecodeControl,audio_only_timecode_control +AudioPackingMode,audio_packing_mode +AudioParameters,audio_parameters +AudioPidSelection,audio_pid_selection +AudioPids,audio_pids +AudioRenditionSets,audio_rendition_sets +AudioResponseEvent,audio_response_event +AudioSampleRate,audio_sample_rate +AudioSelector,audio_selector +AudioSelectorGroup,audio_selector_group +AudioSelectorGroups,audio_selector_groups +AudioSelectorName,audio_selector_name +AudioSelectorNames,audio_selector_names +AudioSelectorSettings,audio_selector_settings +AudioSelectors,audio_selectors +AudioSilenceFailoverSettings,audio_silence_failover_settings +AudioSilenceSettings,audio_silence_settings +AudioSilenceThresholdMsec,audio_silence_threshold_msec +AudioSourceName,audio_source_name +AudioSpecification,audio_specification +AudioStream,audio_stream +AudioStreamType,audio_stream_type +AudioTrack,audio_track +AudioTrackSelection,audio_track_selection +AudioTrackType,audio_track_type +AudioType,audio_type +AudioTypeControl,audio_type_control +AudioWatermarkSettings,audio_watermark_settings +AudioWatermarkingSettings,audio_watermarking_settings +Audit,audit +AuditCheckConfiguration,audit_check_configuration +AuditCheckDetails,audit_check_details +AuditContext,audit_context +AuditDestinationARN,audit_destination_arn +AuditEvent,audit_event +AuditEventResultEntry,audit_event_result_entry +AuditFinding,audit_finding +AuditImage,audit_image +AuditImages,audit_images +AuditImagesLimit,audit_images_limit +AuditLogConfiguration,audit_log_configuration +AuditLogDestination,audit_log_destination +AuditLogDestinationConfiguration,audit_log_destination_configuration +AuditLogGroup,audit_log_group +AuditLogProcessingConfiguration,audit_log_processing_configuration +AuditLogVolume,audit_log_volume +AuditLogs,audit_logs +AuditMitigationActionExecutionMetadata,audit_mitigation_action_execution_metadata +AuditMitigationActionsTaskMetadata,audit_mitigation_actions_task_metadata +AuditMitigationActionsTaskTarget,audit_mitigation_actions_task_target +AuditNotificationTarget,audit_notification_target +AuditPolicyState,audit_policy_state +AuditReportId,audit_report_id +AuditReportResponseFormat,audit_report_response_format +AuditReportStatus,audit_report_status +AuditStreamArn,audit_stream_arn +AuditSuppression,audit_suppression +AuditTaskMetadata,audit_task_metadata +AugmentedManifests,augmented_manifests +AugmentedManifestsListItem,augmented_manifests_list_item +AuroraParameters,aurora_parameters +AuroraPostgreSqlParameters,aurora_postgre_sql_parameters +Auth,auth +AuthCode,auth_code +AuthEventType,auth_event_type +AuthEvents,auth_events +AuthException,auth_exception +AuthFlow,auth_flow +AuthInfo,auth_info +AuthMechanism,auth_mechanism +AuthMethod,auth_method +AuthMode,auth_mode +AuthParameter,auth_parameter +AuthParameters,auth_parameters +AuthPassword,auth_password +AuthRequest,auth_request +AuthRequestCryptogram,auth_request_cryptogram +AuthResources,auth_resources +AuthResponseAttributes,auth_response_attributes +AuthResponseCode,auth_response_code +AuthResponseValue,auth_response_value +AuthResult,auth_result +AuthScheme,auth_scheme +AuthSecretArn,auth_secret_arn +AuthSessionValidity,auth_session_validity +AuthSource,auth_source +AuthStrategy,auth_strategy +AuthToken,auth_token +AuthTokenEnabled,auth_token_enabled +AuthTokenExpirationTime,auth_token_expiration_time +AuthTokenLastModifiedDate,auth_token_last_modified_date +AuthTokenStatus,auth_token_status +AuthTokenUpdateStrategy,auth_token_update_strategy +AuthTtL,auth_ttl +AuthType,auth_type +AuthUserName,auth_user_name +AuthenticateCognitoActionConfig,authenticate_cognito_action_config +AuthenticateCognitoConfig,authenticate_cognito_config +AuthenticateOidcActionConfig,authenticate_oidc_action_config +AuthenticateOidcConfig,authenticate_oidc_config +AuthenticateOnUnsubscribe,authenticate_on_unsubscribe +Authenticated,authenticated +Authentication,authentication +AuthenticationCode1,authentication_code1 +AuthenticationCode2,authentication_code2 +AuthenticationConfig,authentication_config +AuthenticationConfiguration,authentication_configuration +AuthenticationDescription,authentication_description +AuthenticationFailedException,authentication_failed_exception +AuthenticationMethod,authentication_method +AuthenticationMode,authentication_mode +AuthenticationOptions,authentication_options +AuthenticationProfile,authentication_profile +AuthenticationProfileAlreadyExistsFault,authentication_profile_already_exists_fault +AuthenticationProfileContent,authentication_profile_content +AuthenticationProfileName,authentication_profile_name +AuthenticationProfileNotFoundFault,authentication_profile_not_found_fault +AuthenticationProfileQuotaExceededFault,authentication_profile_quota_exceeded_fault +AuthenticationProfiles,authentication_profiles +AuthenticationProtocol,authentication_protocol +AuthenticationRequestExtraParams,authentication_request_extra_params +AuthenticationResult,authentication_result +AuthenticationResultId,authentication_result_id +AuthenticationResultType,authentication_result_type +AuthenticationScheme,authentication_scheme +AuthenticationStrategy,authentication_strategy +AuthenticationSummary,authentication_summary +AuthenticationToken,authentication_token +AuthenticationType,authentication_type +Author,author +AuthorDoesNotExistException,author_does_not_exist_exception +AuthorGroup,author_group +Authorization,authorization +AuthorizationAlreadyExistsFault,authorization_already_exists_fault +AuthorizationConfig,authorization_config +AuthorizationData,authorization_data +AuthorizationEndpoint,authorization_endpoint +AuthorizationErrorException,authorization_error_exception +AuthorizationException,authorization_exception +AuthorizationNotFoundFault,authorization_not_found_fault +AuthorizationPendingException,authorization_pending_exception +AuthorizationProviderId,authorization_provider_id +AuthorizationProviderType,authorization_provider_type +AuthorizationQuotaExceededFault,authorization_quota_exceeded_fault +AuthorizationResult,authorization_result +AuthorizationRule,authorization_rule +AuthorizationRules,authorization_rules +AuthorizationScopes,authorization_scopes +AuthorizationStrategy,authorization_strategy +AuthorizationType,authorization_type +AuthorizeAllGroups,authorize_all_groups +AuthorizeCacheSecurityGroupIngressMessage,authorize_cache_security_group_ingress_message +AuthorizeCacheSecurityGroupIngressResult,authorize_cache_security_group_ingress_result +AuthorizeClientVpnIngressRequest,authorize_client_vpn_ingress_request +AuthorizeClientVpnIngressResult,authorize_client_vpn_ingress_result +AuthorizeClusterSecurityGroupIngressMessage,authorize_cluster_security_group_ingress_message +AuthorizeClusterSecurityGroupIngressResult,authorize_cluster_security_group_ingress_result +AuthorizeDBSecurityGroupIngressMessage,authorize_db_security_group_ingress_message +AuthorizeDBSecurityGroupIngressResult,authorize_db_security_group_ingress_result +AuthorizeDataShareMessage,authorize_data_share_message +AuthorizeEndpointAccessMessage,authorize_endpoint_access_message +AuthorizeIpRulesRequest,authorize_ip_rules_request +AuthorizeSecurityGroupEgressRequest,authorize_security_group_egress_request +AuthorizeSecurityGroupEgressResult,authorize_security_group_egress_result +AuthorizeSecurityGroupIngressRequest,authorize_security_group_ingress_request +AuthorizeSecurityGroupIngressResult,authorize_security_group_ingress_result +AuthorizeSnapshotAccessMessage,authorize_snapshot_access_message +AuthorizeSnapshotAccessResult,authorize_snapshot_access_result +AuthorizeTime,authorize_time +AuthorizeVpcEndpointAccessRequest,authorize_vpc_endpoint_access_request +AuthorizeVpcEndpointAccessResponse,authorize_vpc_endpoint_access_response +AuthorizedAccountId,authorized_account_id +AuthorizedAwsRegion,authorized_aws_region +AuthorizedColumns,authorized_columns +AuthorizedPrincipal,authorized_principal +AuthorizedPrincipalList,authorized_principal_list +AuthorizedResourceArns,authorized_resource_arns +AuthorizedSessionTagValueList,authorized_session_tag_value_list +AuthorizedUrl,authorized_url +Authorizer,authorizer +AuthorizerConfig,authorizer_config +AuthorizerCredentialsArn,authorizer_credentials_arn +AuthorizerDescription,authorizer_description +AuthorizerId,authorizer_id +AuthorizerPayloadFormatVersion,authorizer_payload_format_version +AuthorizerResultTtlInSeconds,authorizer_result_ttl_in_seconds +AuthorizerSummary,authorizer_summary +AuthorizerType,authorizer_type +AuthorizerUri,authorizer_uri +Authorizers,authorizers +AutoAccept,auto_accept +AutoAcceptRequests,auto_accept_requests +AutoAcceptSharedAssociations,auto_accept_shared_associations +AutoAcceptSharedAttachments,auto_accept_shared_attachments +AutoAddGroupOwner,auto_add_group_owner +AutoAdjustData,auto_adjust_data +AutoAdjustType,auto_adjust_type +AutoAppliedAfterDate,auto_applied_after_date +AutoApprovalDelayInSeconds,auto_approval_delay_in_seconds +AutoApprovalTime,auto_approval_time +AutoApprove,auto_approve +AutoAssignElasticIps,auto_assign_elastic_ips +AutoAssignPublicIps,auto_assign_public_ips +AutoAssociate,auto_associate +AutoBranchCreationConfig,auto_branch_creation_config +AutoConfigEnabled,auto_config_enabled +AutoCreate,auto_create +AutoCreateApplication,auto_create_application +AutoCreateTasks,auto_create_tasks +AutoDeclineConflictingRequests,auto_decline_conflicting_requests +AutoDeclineRecurringRequests,auto_decline_recurring_requests +AutoDeploy,auto_deploy +AutoDeployed,auto_deployed +AutoDeployment,auto_deployment +AutoDeploymentsEnabled,auto_deployments_enabled +AutoDetectionMetricSource,auto_detection_metric_source +AutoDetectionS3SourceConfig,auto_detection_s3_source_config +AutoEnable,auto_enable +AutoEnableControls,auto_enable_controls +AutoEnableIO,auto_enable_io +AutoEnableOrganizationMembers,auto_enable_organization_members +AutoEnableStandards,auto_enable_standards +AutoEnroll,auto_enroll +AutoEnrollment,auto_enrollment +AutoExportPolicy,auto_export_policy +AutoExportRevisionDestinationEntry,auto_export_revision_destination_entry +AutoExportRevisionToS3RequestDetails,auto_export_revision_to_s3_request_details +AutoGenerateEndpointName,auto_generate_endpoint_name +AutoGranted,auto_granted +AutoGrantedValue,auto_granted_value +AutoImport,auto_import +AutoImportPolicy,auto_import_policy +AutoMLAlgorithmArns,auto_ml_algorithm_arns +AutoMLAlgorithmConfig,auto_ml_algorithm_config +AutoMLAlgorithms,auto_ml_algorithms +AutoMLCandidate,auto_ml_candidate +AutoMLCandidateGenerationConfig,auto_ml_candidate_generation_config +AutoMLCandidateStep,auto_ml_candidate_step +AutoMLChannel,auto_ml_channel +AutoMLConfig,auto_ml_config +AutoMLContainerDefinition,auto_ml_container_definition +AutoMLDataSource,auto_ml_data_source +AutoMLDataSplitConfig,auto_ml_data_split_config +AutoMLJob,auto_ml_job +AutoMLJobArn,auto_ml_job_arn +AutoMLJobArtifacts,auto_ml_job_artifacts +AutoMLJobChannel,auto_ml_job_channel +AutoMLJobCompletionCriteria,auto_ml_job_completion_criteria +AutoMLJobConfig,auto_ml_job_config +AutoMLJobInputDataConfig,auto_ml_job_input_data_config +AutoMLJobName,auto_ml_job_name +AutoMLJobObjective,auto_ml_job_objective +AutoMLJobSecondaryStatus,auto_ml_job_secondary_status +AutoMLJobStatus,auto_ml_job_status +AutoMLJobStepMetadata,auto_ml_job_step_metadata +AutoMLJobSummaries,auto_ml_job_summaries +AutoMLJobSummary,auto_ml_job_summary +AutoMLOutputDataConfig,auto_ml_output_data_config +AutoMLOverrideStrategy,auto_ml_override_strategy +AutoMLPartialFailureReason,auto_ml_partial_failure_reason +AutoMLProblemTypeConfig,auto_ml_problem_type_config +AutoMLProblemTypeConfigName,auto_ml_problem_type_config_name +AutoMLProblemTypeResolvedAttributes,auto_ml_problem_type_resolved_attributes +AutoMLResolvedAttributes,auto_ml_resolved_attributes +AutoMLResult,auto_ml_result +AutoMLS3DataSource,auto_mls3_data_source +AutoMLSecurityConfig,auto_ml_security_config +AutoMerging,auto_merging +AutoMinorVersionUpgrade,auto_minor_version_upgrade +AutoParameter,auto_parameter +AutoParameters,auto_parameters +AutoPause,auto_pause +AutoPlacement,auto_placement +AutoPromotionResult,auto_promotion_result +AutoPromotionResultReason,auto_promotion_result_reason +AutoPushdown,auto_pushdown +AutoRecovery,auto_recovery +AutoRecoverySupported,auto_recovery_supported +AutoRenew,auto_renew +AutoRollback,auto_rollback +AutoRollbackConfig,auto_rollback_config +AutoRollbackConfiguration,auto_rollback_configuration +AutoScaling,auto_scaling +AutoScalingConfiguration,auto_scaling_configuration +AutoScalingConfigurationArn,auto_scaling_configuration_arn +AutoScalingConfigurationName,auto_scaling_configuration_name +AutoScalingConfigurationRevision,auto_scaling_configuration_revision +AutoScalingConfigurationSummary,auto_scaling_configuration_summary +AutoScalingConfigurationSummaryList,auto_scaling_configuration_summary_list +AutoScalingDescription,auto_scaling_description +AutoScalingDisabled,auto_scaling_disabled +AutoScalingEnabled,auto_scaling_enabled +AutoScalingEnabledUpdate,auto_scaling_enabled_update +AutoScalingGroup,auto_scaling_group +AutoScalingGroupARN,auto_scaling_group_arn +AutoScalingGroupArn,auto_scaling_group_arn +AutoScalingGroupConfiguration,auto_scaling_group_configuration +AutoScalingGroupName,auto_scaling_group_name +AutoScalingGroupNames,auto_scaling_group_names +AutoScalingGroupNamesType,auto_scaling_group_names_type +AutoScalingGroupProvider,auto_scaling_group_provider +AutoScalingGroupProviderUpdate,auto_scaling_group_provider_update +AutoScalingGroupRecommendation,auto_scaling_group_recommendation +AutoScalingGroupRecommendationOption,auto_scaling_group_recommendation_option +AutoScalingGroupState,auto_scaling_group_state +AutoScalingGroups,auto_scaling_groups +AutoScalingGroupsType,auto_scaling_groups_type +AutoScalingInstanceDetails,auto_scaling_instance_details +AutoScalingInstances,auto_scaling_instances +AutoScalingInstancesType,auto_scaling_instances_type +AutoScalingNotificationTypes,auto_scaling_notification_types +AutoScalingPolicy,auto_scaling_policy +AutoScalingPolicyDescription,auto_scaling_policy_description +AutoScalingPolicyStateChangeReason,auto_scaling_policy_state_change_reason +AutoScalingPolicyStatus,auto_scaling_policy_status +AutoScalingPolicyUpdate,auto_scaling_policy_update +AutoScalingRole,auto_scaling_role +AutoScalingRoleArn,auto_scaling_role_arn +AutoScalingSchedule,auto_scaling_schedule +AutoScalingSettingsDescription,auto_scaling_settings_description +AutoScalingSettingsUpdate,auto_scaling_settings_update +AutoScalingTargetTrackingScalingPolicyConfigurationDescription,auto_scaling_target_tracking_scaling_policy_configuration_description +AutoScalingTargetTrackingScalingPolicyConfigurationUpdate,auto_scaling_target_tracking_scaling_policy_configuration_update +AutoScalingThresholds,auto_scaling_thresholds +AutoScalingType,auto_scaling_type +AutoScalingUpdate,auto_scaling_update +AutoSnapshotAddOnRequest,auto_snapshot_add_on_request +AutoSnapshotDetails,auto_snapshot_details +AutoSoftwareUpdateEnabled,auto_software_update_enabled +AutoStartConfig,auto_start_config +AutoStopConfig,auto_stop_config +AutoTerminate,auto_terminate +AutoTerminationPolicy,auto_termination_policy +AutoTune,auto_tune +AutoTuneDetails,auto_tune_details +AutoTuneMaintenanceSchedule,auto_tune_maintenance_schedule +AutoTuneOptions,auto_tune_options +AutoTuneOptionsInput,auto_tune_options_input +AutoTuneOptionsOutput,auto_tune_options_output +AutoTuneOptionsStatus,auto_tune_options_status +AutoTuneStatus,auto_tune_status +AutoTuneType,auto_tune_type +AutoTunes,auto_tunes +AutoUpdate,auto_update +AutoUpdateAfterRecommendedApplyByDate,auto_update_after_recommended_apply_by_date +AutoUpdateStartDate,auto_update_start_date +AutoUpgrade,auto_upgrade +AutoUpgradeDate,auto_upgrade_date +AutoVerifiedAttributes,auto_verified_attributes +AutoWarmupEnabled,auto_warmup_enabled +AutocommitPeriod,autocommit_period +AutodefinedReverse,autodefined_reverse +AutodefinedReverseFlag,autodefined_reverse_flag +AutomatedAbrRule,automated_abr_rule +AutomatedAbrSettings,automated_abr_settings +AutomatedDiscoveryInformation,automated_discovery_information +AutomatedEncodingSettings,automated_encoding_settings +AutomatedSnapshotRetentionPeriod,automated_snapshot_retention_period +AutomatedSnapshotStartHour,automated_snapshot_start_hour +AutomatedUpdateDate,automated_update_date +Automatic,automatic +AutomaticBackupRetentionDays,automatic_backup_retention_days +AutomaticFail,automatic_fail +AutomaticFailover,automatic_failover +AutomaticFailoverEnabled,automatic_failover_enabled +AutomaticFailoverStatus,automatic_failover_status +AutomaticInputFailoverSettings,automatic_input_failover_settings +AutomaticRenewal,automatic_renewal +AutomaticRestartTime,automatic_restart_time +AutomaticTapeCreationPolicyInfo,automatic_tape_creation_policy_info +AutomaticTapeCreationPolicyInfos,automatic_tape_creation_policy_infos +AutomaticTapeCreationRule,automatic_tape_creation_rule +AutomaticTapeCreationRules,automatic_tape_creation_rules +AutomaticallyAfterDays,automatically_after_days +Automation,automation +AutomationDefinitionNotApprovedException,automation_definition_not_approved_exception +AutomationDefinitionNotFoundException,automation_definition_not_found_exception +AutomationDefinitionVersionNotFoundException,automation_definition_version_not_found_exception +AutomationExecution,automation_execution +AutomationExecutionException,automation_execution_exception +AutomationExecutionFilter,automation_execution_filter +AutomationExecutionId,automation_execution_id +AutomationExecutionLimitExceededException,automation_execution_limit_exceeded_exception +AutomationExecutionMetadata,automation_execution_metadata +AutomationExecutionMetadataList,automation_execution_metadata_list +AutomationExecutionNotFoundException,automation_execution_not_found_exception +AutomationExecutionStatus,automation_execution_status +AutomationExecutionTimeoutException,automation_execution_timeout_exception +AutomationMode,automation_mode +AutomationRulesAction,automation_rules_action +AutomationRulesArns,automation_rules_arns +AutomationRulesConfig,automation_rules_config +AutomationRulesFindingFieldsUpdate,automation_rules_finding_fields_update +AutomationRulesFindingFilters,automation_rules_finding_filters +AutomationRulesMetadata,automation_rules_metadata +AutomationStepNotFoundException,automation_step_not_found_exception +AutomationSubtype,automation_subtype +AutomationTargetParameterName,automation_target_parameter_name +AutomationType,automation_type +Autoprovision,autoprovision +Autotune,autotune +AuxiliaryDataLocation,auxiliary_data_location +Av1QvbrSettings,av1_qvbr_settings +Av1Settings,av1_settings +AvailBlanking,avail_blanking +AvailBlankingImage,avail_blanking_image +AvailConfiguration,avail_configuration +AvailMatchingCriteria,avail_matching_criteria +AvailNum,avail_num +AvailSettings,avail_settings +AvailSuppression,avail_suppression +Availability,availability +AvailabilityConfiguration,availability_configuration +AvailabilityConfigurations,availability_configurations +AvailabilityLocalHealthEventsConfig,availability_local_health_events_config +AvailabilityMeasurement,availability_measurement +AvailabilityMode,availability_mode +AvailabilityOptions,availability_options +AvailabilityOptionsStatus,availability_options_status +AvailabilityScoreThreshold,availability_score_threshold +AvailabilityStatus,availability_status +AvailabilityZone,availability_zone +AvailabilityZoneCount,availability_zone_count +AvailabilityZoneDetail,availability_zone_detail +AvailabilityZoneFilter,availability_zone_filter +AvailabilityZoneGroup,availability_zone_group +AvailabilityZoneId,availability_zone_id +AvailabilityZoneIdFilter,availability_zone_id_filter +AvailabilityZoneInfo,availability_zone_info +AvailabilityZoneInformation,availability_zone_information +AvailabilityZoneMessage,availability_zone_message +AvailabilityZoneName,availability_zone_name +AvailabilityZoneNotSupportedException,availability_zone_not_supported_exception +AvailabilityZoneRelocation,availability_zone_relocation +AvailabilityZoneRelocationStatus,availability_zone_relocation_status +AvailabilityZones,availability_zones +AvailabilityZonesMismatch,availability_zones_mismatch +Available,available +AvailableAddressCount,available_address_count +AvailableBalance,available_balance +AvailableCIDRCount,available_cidr_count +AvailableCapacity,available_capacity +AvailableDataNodeCount,available_data_node_count +AvailableInstanceCapacity,available_instance_capacity +AvailableInstanceCount,available_instance_count +AvailableIpAddressCount,available_ip_address_count +AvailableLabels,available_labels +AvailableNumberSummary,available_number_summary +AvailableNumbersList,available_numbers_list +AvailableOSReleases,available_os_releases +AvailablePackageVersion,available_package_version +AvailablePolicyTypes,available_policy_types +AvailableProcessorFeature,available_processor_feature +AvailableProcessorFeatures,available_processor_features +AvailableProvisionedConcurrentExecutions,available_provisioned_concurrent_executions +AvailableSlotsByChannel,available_slots_by_channel +AvailableUpgrades,available_upgrades +AvailableVCpus,available_v_cpus +AvailsExpected,avails_expected +AvcIntraClass,avc_intra_class +AvcIntraSettings,avc_intra_settings +AvcIntraUhdSettings,avc_intra_uhd_settings +Average,average +AverageAccuracy,average_accuracy +AverageDownloadRateLimitInBitsPerSec,average_download_rate_limit_in_bits_per_sec +AverageExecutionTimeMillis,average_execution_time_millis +AverageF1Score,average_f1_score +AverageLength,average_length +AverageNormalizedUnitsUsedPerHour,average_normalized_units_used_per_hour +AverageNumberOfInstancesUsedPerHour,average_number_of_instances_used_per_hour +AveragePrecision,average_precision +AverageRecall,average_recall +AverageUploadRateLimitInBitsPerSec,average_upload_rate_limit_in_bits_per_sec +AverageUtilization,average_utilization +AverageWeightedQuantileLoss,average_weighted_quantile_loss +Avg,avg +AvgResizeRateInMegaBytesPerSecond,avg_resize_rate_in_mega_bytes_per_second +AvoidEmptyBatches,avoid_empty_batches +AvoidFerries,avoid_ferries +AvoidTolls,avoid_tolls +AwaitAnswerMachinePrompt,await_answer_machine_prompt +AwsAccount,aws_account +AwsAccountId,aws_account_id +AwsAccountNumber,aws_account_number +AwsAmazonMqBroker,aws_amazon_mq_broker +AwsAmazonMqBrokerDetails,aws_amazon_mq_broker_details +AwsAmazonMqBrokerEncryptionOptionsDetails,aws_amazon_mq_broker_encryption_options_details +AwsAmazonMqBrokerLdapServerMetadataDetails,aws_amazon_mq_broker_ldap_server_metadata_details +AwsAmazonMqBrokerLogsDetails,aws_amazon_mq_broker_logs_details +AwsAmazonMqBrokerLogsPendingDetails,aws_amazon_mq_broker_logs_pending_details +AwsAmazonMqBrokerMaintenanceWindowStartTimeDetails,aws_amazon_mq_broker_maintenance_window_start_time_details +AwsAmazonMqBrokerUsersDetails,aws_amazon_mq_broker_users_details +AwsApiCallAction,aws_api_call_action +AwsApiCallActionDomainDetails,aws_api_call_action_domain_details +AwsApiGatewayAccessLogSettings,aws_api_gateway_access_log_settings +AwsApiGatewayCanarySettings,aws_api_gateway_canary_settings +AwsApiGatewayEndpointConfiguration,aws_api_gateway_endpoint_configuration +AwsApiGatewayMethodSettings,aws_api_gateway_method_settings +AwsApiGatewayRestApi,aws_api_gateway_rest_api +AwsApiGatewayRestApiDetails,aws_api_gateway_rest_api_details +AwsApiGatewayStage,aws_api_gateway_stage +AwsApiGatewayStageDetails,aws_api_gateway_stage_details +AwsApiGatewayV2Api,aws_api_gateway_v2_api +AwsApiGatewayV2ApiDetails,aws_api_gateway_v2_api_details +AwsApiGatewayV2RouteSettings,aws_api_gateway_v2_route_settings +AwsApiGatewayV2Stage,aws_api_gateway_v2_stage +AwsApiGatewayV2StageDetails,aws_api_gateway_v2_stage_details +AwsAppSyncGraphQlApi,aws_app_sync_graph_ql_api +AwsAppSyncGraphQlApiAdditionalAuthenticationProvidersDetails,aws_app_sync_graph_ql_api_additional_authentication_providers_details +AwsAppSyncGraphQlApiDetails,aws_app_sync_graph_ql_api_details +AwsAppSyncGraphQlApiLambdaAuthorizerConfigDetails,aws_app_sync_graph_ql_api_lambda_authorizer_config_details +AwsAppSyncGraphQlApiLogConfigDetails,aws_app_sync_graph_ql_api_log_config_details +AwsAppSyncGraphQlApiOpenIdConnectConfigDetails,aws_app_sync_graph_ql_api_open_id_connect_config_details +AwsAppSyncGraphQlApiUserPoolConfigDetails,aws_app_sync_graph_ql_api_user_pool_config_details +AwsAthenaWorkGroup,aws_athena_work_group +AwsAthenaWorkGroupConfigurationDetails,aws_athena_work_group_configuration_details +AwsAthenaWorkGroupConfigurationResultConfigurationDetails,aws_athena_work_group_configuration_result_configuration_details +AwsAthenaWorkGroupConfigurationResultConfigurationEncryptionConfigurationDetails,aws_athena_work_group_configuration_result_configuration_encryption_configuration_details +AwsAthenaWorkGroupDetails,aws_athena_work_group_details +AwsAutoScalingAutoScalingGroup,aws_auto_scaling_auto_scaling_group +AwsAutoScalingAutoScalingGroupAvailabilityZonesListDetails,aws_auto_scaling_auto_scaling_group_availability_zones_list_details +AwsAutoScalingAutoScalingGroupDetails,aws_auto_scaling_auto_scaling_group_details +AwsAutoScalingAutoScalingGroupLaunchTemplateLaunchTemplateSpecification,aws_auto_scaling_auto_scaling_group_launch_template_launch_template_specification +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_details +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyInstancesDistributionDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_instances_distribution_details +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_details +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateLaunchTemplateSpecification,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_launch_template_specification +AwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateOverridesListDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_overrides_list_details +AwsAutoScalingLaunchConfiguration,aws_auto_scaling_launch_configuration +AwsAutoScalingLaunchConfigurationBlockDeviceMappingsDetails,aws_auto_scaling_launch_configuration_block_device_mappings_details +AwsAutoScalingLaunchConfigurationBlockDeviceMappingsEbsDetails,aws_auto_scaling_launch_configuration_block_device_mappings_ebs_details +AwsAutoScalingLaunchConfigurationDetails,aws_auto_scaling_launch_configuration_details +AwsAutoScalingLaunchConfigurationInstanceMonitoringDetails,aws_auto_scaling_launch_configuration_instance_monitoring_details +AwsAutoScalingLaunchConfigurationMetadataOptions,aws_auto_scaling_launch_configuration_metadata_options +AwsBackupBackupPlan,aws_backup_backup_plan +AwsBackupBackupPlanAdvancedBackupSettingsDetails,aws_backup_backup_plan_advanced_backup_settings_details +AwsBackupBackupPlanBackupPlanDetails,aws_backup_backup_plan_backup_plan_details +AwsBackupBackupPlanDetails,aws_backup_backup_plan_details +AwsBackupBackupPlanLifecycleDetails,aws_backup_backup_plan_lifecycle_details +AwsBackupBackupPlanRuleCopyActionsDetails,aws_backup_backup_plan_rule_copy_actions_details +AwsBackupBackupPlanRuleDetails,aws_backup_backup_plan_rule_details +AwsBackupBackupVault,aws_backup_backup_vault +AwsBackupBackupVaultDetails,aws_backup_backup_vault_details +AwsBackupBackupVaultNotificationsDetails,aws_backup_backup_vault_notifications_details +AwsBackupRecoveryPoint,aws_backup_recovery_point +AwsBackupRecoveryPointArn,aws_backup_recovery_point_arn +AwsBackupRecoveryPointCalculatedLifecycleDetails,aws_backup_recovery_point_calculated_lifecycle_details +AwsBackupRecoveryPointCreatedByDetails,aws_backup_recovery_point_created_by_details +AwsBackupRecoveryPointDetails,aws_backup_recovery_point_details +AwsBackupRecoveryPointLifecycleDetails,aws_backup_recovery_point_lifecycle_details +AwsCertificateManagerCertificate,aws_certificate_manager_certificate +AwsCertificateManagerCertificateDetails,aws_certificate_manager_certificate_details +AwsCertificateManagerCertificateDomainValidationOption,aws_certificate_manager_certificate_domain_validation_option +AwsCertificateManagerCertificateExtendedKeyUsage,aws_certificate_manager_certificate_extended_key_usage +AwsCertificateManagerCertificateKeyUsage,aws_certificate_manager_certificate_key_usage +AwsCertificateManagerCertificateOptions,aws_certificate_manager_certificate_options +AwsCertificateManagerCertificateRenewalSummary,aws_certificate_manager_certificate_renewal_summary +AwsCertificateManagerCertificateResourceRecord,aws_certificate_manager_certificate_resource_record +AwsCloudFormationStack,aws_cloud_formation_stack +AwsCloudFormationStackDetails,aws_cloud_formation_stack_details +AwsCloudFormationStackDriftInformationDetails,aws_cloud_formation_stack_drift_information_details +AwsCloudFormationStackOutputsDetails,aws_cloud_formation_stack_outputs_details +AwsCloudFrontDistribution,aws_cloud_front_distribution +AwsCloudFrontDistributionCacheBehavior,aws_cloud_front_distribution_cache_behavior +AwsCloudFrontDistributionCacheBehaviors,aws_cloud_front_distribution_cache_behaviors +AwsCloudFrontDistributionDefaultCacheBehavior,aws_cloud_front_distribution_default_cache_behavior +AwsCloudFrontDistributionDetails,aws_cloud_front_distribution_details +AwsCloudFrontDistributionLogging,aws_cloud_front_distribution_logging +AwsCloudFrontDistributionOriginCustomOriginConfig,aws_cloud_front_distribution_origin_custom_origin_config +AwsCloudFrontDistributionOriginGroup,aws_cloud_front_distribution_origin_group +AwsCloudFrontDistributionOriginGroupFailover,aws_cloud_front_distribution_origin_group_failover +AwsCloudFrontDistributionOriginGroupFailoverStatusCodes,aws_cloud_front_distribution_origin_group_failover_status_codes +AwsCloudFrontDistributionOriginGroups,aws_cloud_front_distribution_origin_groups +AwsCloudFrontDistributionOriginItem,aws_cloud_front_distribution_origin_item +AwsCloudFrontDistributionOriginS3OriginConfig,aws_cloud_front_distribution_origin_s3_origin_config +AwsCloudFrontDistributionOriginSslProtocols,aws_cloud_front_distribution_origin_ssl_protocols +AwsCloudFrontDistributionOrigins,aws_cloud_front_distribution_origins +AwsCloudFrontDistributionViewerCertificate,aws_cloud_front_distribution_viewer_certificate +AwsCloudMapInstanceAttribute,aws_cloud_map_instance_attribute +AwsCloudMapServiceDiscovery,aws_cloud_map_service_discovery +AwsCloudTrailTrail,aws_cloud_trail_trail +AwsCloudTrailTrailDetails,aws_cloud_trail_trail_details +AwsCloudWatchAlarm,aws_cloud_watch_alarm +AwsCloudWatchAlarmDetails,aws_cloud_watch_alarm_details +AwsCloudWatchAlarmDimensionsDetails,aws_cloud_watch_alarm_dimensions_details +AwsCodeBuildProject,aws_code_build_project +AwsCodeBuildProjectArtifactsDetails,aws_code_build_project_artifacts_details +AwsCodeBuildProjectDetails,aws_code_build_project_details +AwsCodeBuildProjectEnvironment,aws_code_build_project_environment +AwsCodeBuildProjectEnvironmentEnvironmentVariablesDetails,aws_code_build_project_environment_environment_variables_details +AwsCodeBuildProjectEnvironmentRegistryCredential,aws_code_build_project_environment_registry_credential +AwsCodeBuildProjectLogsConfigCloudWatchLogsDetails,aws_code_build_project_logs_config_cloud_watch_logs_details +AwsCodeBuildProjectLogsConfigDetails,aws_code_build_project_logs_config_details +AwsCodeBuildProjectLogsConfigS3LogsDetails,aws_code_build_project_logs_config_s3_logs_details +AwsCodeBuildProjectSource,aws_code_build_project_source +AwsCodeBuildProjectVpcConfig,aws_code_build_project_vpc_config +AwsCognitoIdentityPoolId,aws_cognito_identity_pool_id +AwsCognitoRegion,aws_cognito_region +AwsCorsConfiguration,aws_cors_configuration +AwsCredentials,aws_credentials +AwsDynamoDbTable,aws_dynamo_db_table +AwsDynamoDbTableAttributeDefinition,aws_dynamo_db_table_attribute_definition +AwsDynamoDbTableBillingModeSummary,aws_dynamo_db_table_billing_mode_summary +AwsDynamoDbTableDetails,aws_dynamo_db_table_details +AwsDynamoDbTableGlobalSecondaryIndex,aws_dynamo_db_table_global_secondary_index +AwsDynamoDbTableKeySchema,aws_dynamo_db_table_key_schema +AwsDynamoDbTableLocalSecondaryIndex,aws_dynamo_db_table_local_secondary_index +AwsDynamoDbTableProjection,aws_dynamo_db_table_projection +AwsDynamoDbTableProvisionedThroughput,aws_dynamo_db_table_provisioned_throughput +AwsDynamoDbTableProvisionedThroughputOverride,aws_dynamo_db_table_provisioned_throughput_override +AwsDynamoDbTableReplica,aws_dynamo_db_table_replica +AwsDynamoDbTableReplicaGlobalSecondaryIndex,aws_dynamo_db_table_replica_global_secondary_index +AwsDynamoDbTableRestoreSummary,aws_dynamo_db_table_restore_summary +AwsDynamoDbTableSseDescription,aws_dynamo_db_table_sse_description +AwsDynamoDbTableStreamSpecification,aws_dynamo_db_table_stream_specification +AwsEc2Eip,aws_ec2_eip +AwsEc2EipDetails,aws_ec2_eip_details +AwsEc2Instance,aws_ec2_instance +AwsEc2InstanceDetails,aws_ec2_instance_details +AwsEc2InstanceMetadataOptions,aws_ec2_instance_metadata_options +AwsEc2InstanceMonitoringDetails,aws_ec2_instance_monitoring_details +AwsEc2InstanceNetworkInterfacesDetails,aws_ec2_instance_network_interfaces_details +AwsEc2InstanceViolation,aws_ec2_instance_violation +AwsEc2LaunchTemplate,aws_ec2_launch_template +AwsEc2LaunchTemplateDataBlockDeviceMappingSetDetails,aws_ec2_launch_template_data_block_device_mapping_set_details +AwsEc2LaunchTemplateDataBlockDeviceMappingSetEbsDetails,aws_ec2_launch_template_data_block_device_mapping_set_ebs_details +AwsEc2LaunchTemplateDataCapacityReservationSpecificationCapacityReservationTargetDetails,aws_ec2_launch_template_data_capacity_reservation_specification_capacity_reservation_target_details +AwsEc2LaunchTemplateDataCapacityReservationSpecificationDetails,aws_ec2_launch_template_data_capacity_reservation_specification_details +AwsEc2LaunchTemplateDataCpuOptionsDetails,aws_ec2_launch_template_data_cpu_options_details +AwsEc2LaunchTemplateDataCreditSpecificationDetails,aws_ec2_launch_template_data_credit_specification_details +AwsEc2LaunchTemplateDataDetails,aws_ec2_launch_template_data_details +AwsEc2LaunchTemplateDataElasticGpuSpecificationSetDetails,aws_ec2_launch_template_data_elastic_gpu_specification_set_details +AwsEc2LaunchTemplateDataElasticInferenceAcceleratorSetDetails,aws_ec2_launch_template_data_elastic_inference_accelerator_set_details +AwsEc2LaunchTemplateDataEnclaveOptionsDetails,aws_ec2_launch_template_data_enclave_options_details +AwsEc2LaunchTemplateDataHibernationOptionsDetails,aws_ec2_launch_template_data_hibernation_options_details +AwsEc2LaunchTemplateDataIamInstanceProfileDetails,aws_ec2_launch_template_data_iam_instance_profile_details +AwsEc2LaunchTemplateDataInstanceMarketOptionsDetails,aws_ec2_launch_template_data_instance_market_options_details +AwsEc2LaunchTemplateDataInstanceMarketOptionsSpotOptionsDetails,aws_ec2_launch_template_data_instance_market_options_spot_options_details +AwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorCountDetails,aws_ec2_launch_template_data_instance_requirements_accelerator_count_details +AwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorTotalMemoryMiBDetails,aws_ec2_launch_template_data_instance_requirements_accelerator_total_memory_mib_details +AwsEc2LaunchTemplateDataInstanceRequirementsBaselineEbsBandwidthMbpsDetails,aws_ec2_launch_template_data_instance_requirements_baseline_ebs_bandwidth_mbps_details +AwsEc2LaunchTemplateDataInstanceRequirementsDetails,aws_ec2_launch_template_data_instance_requirements_details +AwsEc2LaunchTemplateDataInstanceRequirementsMemoryGiBPerVCpuDetails,aws_ec2_launch_template_data_instance_requirements_memory_gib_per_v_cpu_details +AwsEc2LaunchTemplateDataInstanceRequirementsMemoryMiBDetails,aws_ec2_launch_template_data_instance_requirements_memory_mib_details +AwsEc2LaunchTemplateDataInstanceRequirementsNetworkInterfaceCountDetails,aws_ec2_launch_template_data_instance_requirements_network_interface_count_details +AwsEc2LaunchTemplateDataInstanceRequirementsTotalLocalStorageGBDetails,aws_ec2_launch_template_data_instance_requirements_total_local_storage_gb_details +AwsEc2LaunchTemplateDataInstanceRequirementsVCpuCountDetails,aws_ec2_launch_template_data_instance_requirements_v_cpu_count_details +AwsEc2LaunchTemplateDataLicenseSetDetails,aws_ec2_launch_template_data_license_set_details +AwsEc2LaunchTemplateDataMaintenanceOptionsDetails,aws_ec2_launch_template_data_maintenance_options_details +AwsEc2LaunchTemplateDataMetadataOptionsDetails,aws_ec2_launch_template_data_metadata_options_details +AwsEc2LaunchTemplateDataMonitoringDetails,aws_ec2_launch_template_data_monitoring_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetDetails,aws_ec2_launch_template_data_network_interface_set_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv4PrefixesDetails,aws_ec2_launch_template_data_network_interface_set_ipv4_prefixes_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6AddressesDetails,aws_ec2_launch_template_data_network_interface_set_ipv6_addresses_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6PrefixesDetails,aws_ec2_launch_template_data_network_interface_set_ipv6_prefixes_details +AwsEc2LaunchTemplateDataNetworkInterfaceSetPrivateIpAddressesDetails,aws_ec2_launch_template_data_network_interface_set_private_ip_addresses_details +AwsEc2LaunchTemplateDataPlacementDetails,aws_ec2_launch_template_data_placement_details +AwsEc2LaunchTemplateDataPrivateDnsNameOptionsDetails,aws_ec2_launch_template_data_private_dns_name_options_details +AwsEc2LaunchTemplateDetails,aws_ec2_launch_template_details +AwsEc2NetworkAcl,aws_ec2_network_acl +AwsEc2NetworkAclAssociation,aws_ec2_network_acl_association +AwsEc2NetworkAclDetails,aws_ec2_network_acl_details +AwsEc2NetworkAclEntry,aws_ec2_network_acl_entry +AwsEc2NetworkInterface,aws_ec2_network_interface +AwsEc2NetworkInterfaceAttachment,aws_ec2_network_interface_attachment +AwsEc2NetworkInterfaceDetails,aws_ec2_network_interface_details +AwsEc2NetworkInterfaceIpV6AddressDetail,aws_ec2_network_interface_ipv6_address_detail +AwsEc2NetworkInterfacePrivateIpAddressDetail,aws_ec2_network_interface_private_ip_address_detail +AwsEc2NetworkInterfaceSecurityGroup,aws_ec2_network_interface_security_group +AwsEc2NetworkInterfaceViolation,aws_ec2_network_interface_violation +AwsEc2NetworkInterfaceViolations,aws_ec2_network_interface_violations +AwsEc2RouteTable,aws_ec2_route_table +AwsEc2RouteTableDetails,aws_ec2_route_table_details +AwsEc2SecurityGroup,aws_ec2_security_group +AwsEc2SecurityGroupDetails,aws_ec2_security_group_details +AwsEc2SecurityGroupIpPermission,aws_ec2_security_group_ip_permission +AwsEc2SecurityGroupIpRange,aws_ec2_security_group_ip_range +AwsEc2SecurityGroupIpv6Range,aws_ec2_security_group_ipv6_range +AwsEc2SecurityGroupPrefixListId,aws_ec2_security_group_prefix_list_id +AwsEc2SecurityGroupUserIdGroupPair,aws_ec2_security_group_user_id_group_pair +AwsEc2Subnet,aws_ec2_subnet +AwsEc2SubnetDetails,aws_ec2_subnet_details +AwsEc2TransitGateway,aws_ec2_transit_gateway +AwsEc2TransitGatewayDetails,aws_ec2_transit_gateway_details +AwsEc2Volume,aws_ec2_volume +AwsEc2VolumeAttachment,aws_ec2_volume_attachment +AwsEc2VolumeDetails,aws_ec2_volume_details +AwsEc2Vpc,aws_ec2_vpc +AwsEc2VpcDetails,aws_ec2_vpc_details +AwsEc2VpcEndpointService,aws_ec2_vpc_endpoint_service +AwsEc2VpcEndpointServiceDetails,aws_ec2_vpc_endpoint_service_details +AwsEc2VpcEndpointServiceServiceTypeDetails,aws_ec2_vpc_endpoint_service_service_type_details +AwsEc2VpcPeeringConnection,aws_ec2_vpc_peering_connection +AwsEc2VpcPeeringConnectionDetails,aws_ec2_vpc_peering_connection_details +AwsEc2VpcPeeringConnectionStatusDetails,aws_ec2_vpc_peering_connection_status_details +AwsEc2VpcPeeringConnectionVpcInfoDetails,aws_ec2_vpc_peering_connection_vpc_info_details +AwsEc2VpnConnection,aws_ec2_vpn_connection +AwsEc2VpnConnectionDetails,aws_ec2_vpn_connection_details +AwsEc2VpnConnectionOptionsDetails,aws_ec2_vpn_connection_options_details +AwsEc2VpnConnectionOptionsTunnelOptionsDetails,aws_ec2_vpn_connection_options_tunnel_options_details +AwsEc2VpnConnectionRoutesDetails,aws_ec2_vpn_connection_routes_details +AwsEc2VpnConnectionVgwTelemetryDetails,aws_ec2_vpn_connection_vgw_telemetry_details +AwsEcrContainerAggregation,aws_ecr_container_aggregation +AwsEcrContainerAggregationResponse,aws_ecr_container_aggregation_response +AwsEcrContainerImage,aws_ecr_container_image +AwsEcrContainerImageDetails,aws_ecr_container_image_details +AwsEcrRepository,aws_ecr_repository +AwsEcrRepositoryDetails,aws_ecr_repository_details +AwsEcrRepositoryImageScanningConfigurationDetails,aws_ecr_repository_image_scanning_configuration_details +AwsEcrRepositoryLifecyclePolicyDetails,aws_ecr_repository_lifecycle_policy_details +AwsEcsCluster,aws_ecs_cluster +AwsEcsClusterClusterSettingsDetails,aws_ecs_cluster_cluster_settings_details +AwsEcsClusterConfigurationDetails,aws_ecs_cluster_configuration_details +AwsEcsClusterConfigurationExecuteCommandConfigurationDetails,aws_ecs_cluster_configuration_execute_command_configuration_details +AwsEcsClusterConfigurationExecuteCommandConfigurationLogConfigurationDetails,aws_ecs_cluster_configuration_execute_command_configuration_log_configuration_details +AwsEcsClusterDefaultCapacityProviderStrategyDetails,aws_ecs_cluster_default_capacity_provider_strategy_details +AwsEcsClusterDetails,aws_ecs_cluster_details +AwsEcsContainer,aws_ecs_container +AwsEcsContainerDetails,aws_ecs_container_details +AwsEcsService,aws_ecs_service +AwsEcsServiceCapacityProviderStrategyDetails,aws_ecs_service_capacity_provider_strategy_details +AwsEcsServiceDeploymentConfigurationDeploymentCircuitBreakerDetails,aws_ecs_service_deployment_configuration_deployment_circuit_breaker_details +AwsEcsServiceDeploymentConfigurationDetails,aws_ecs_service_deployment_configuration_details +AwsEcsServiceDeploymentControllerDetails,aws_ecs_service_deployment_controller_details +AwsEcsServiceDetails,aws_ecs_service_details +AwsEcsServiceLoadBalancersDetails,aws_ecs_service_load_balancers_details +AwsEcsServiceNetworkConfigurationAwsVpcConfigurationDetails,aws_ecs_service_network_configuration_aws_vpc_configuration_details +AwsEcsServiceNetworkConfigurationDetails,aws_ecs_service_network_configuration_details +AwsEcsServicePlacementConstraintsDetails,aws_ecs_service_placement_constraints_details +AwsEcsServicePlacementStrategiesDetails,aws_ecs_service_placement_strategies_details +AwsEcsServiceServiceRegistriesDetails,aws_ecs_service_service_registries_details +AwsEcsTask,aws_ecs_task +AwsEcsTaskDefinition,aws_ecs_task_definition +AwsEcsTaskDefinitionContainerDefinitionsDependsOnDetails,aws_ecs_task_definition_container_definitions_depends_on_details +AwsEcsTaskDefinitionContainerDefinitionsDetails,aws_ecs_task_definition_container_definitions_details +AwsEcsTaskDefinitionContainerDefinitionsEnvironmentDetails,aws_ecs_task_definition_container_definitions_environment_details +AwsEcsTaskDefinitionContainerDefinitionsEnvironmentFilesDetails,aws_ecs_task_definition_container_definitions_environment_files_details +AwsEcsTaskDefinitionContainerDefinitionsExtraHostsDetails,aws_ecs_task_definition_container_definitions_extra_hosts_details +AwsEcsTaskDefinitionContainerDefinitionsFirelensConfigurationDetails,aws_ecs_task_definition_container_definitions_firelens_configuration_details +AwsEcsTaskDefinitionContainerDefinitionsHealthCheckDetails,aws_ecs_task_definition_container_definitions_health_check_details +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersCapabilitiesDetails,aws_ecs_task_definition_container_definitions_linux_parameters_capabilities_details +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDetails,aws_ecs_task_definition_container_definitions_linux_parameters_details +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDevicesDetails,aws_ecs_task_definition_container_definitions_linux_parameters_devices_details +AwsEcsTaskDefinitionContainerDefinitionsLinuxParametersTmpfsDetails,aws_ecs_task_definition_container_definitions_linux_parameters_tmpfs_details +AwsEcsTaskDefinitionContainerDefinitionsLogConfigurationDetails,aws_ecs_task_definition_container_definitions_log_configuration_details +AwsEcsTaskDefinitionContainerDefinitionsLogConfigurationSecretOptionsDetails,aws_ecs_task_definition_container_definitions_log_configuration_secret_options_details +AwsEcsTaskDefinitionContainerDefinitionsMountPointsDetails,aws_ecs_task_definition_container_definitions_mount_points_details +AwsEcsTaskDefinitionContainerDefinitionsPortMappingsDetails,aws_ecs_task_definition_container_definitions_port_mappings_details +AwsEcsTaskDefinitionContainerDefinitionsRepositoryCredentialsDetails,aws_ecs_task_definition_container_definitions_repository_credentials_details +AwsEcsTaskDefinitionContainerDefinitionsResourceRequirementsDetails,aws_ecs_task_definition_container_definitions_resource_requirements_details +AwsEcsTaskDefinitionContainerDefinitionsSecretsDetails,aws_ecs_task_definition_container_definitions_secrets_details +AwsEcsTaskDefinitionContainerDefinitionsSystemControlsDetails,aws_ecs_task_definition_container_definitions_system_controls_details +AwsEcsTaskDefinitionContainerDefinitionsUlimitsDetails,aws_ecs_task_definition_container_definitions_ulimits_details +AwsEcsTaskDefinitionContainerDefinitionsVolumesFromDetails,aws_ecs_task_definition_container_definitions_volumes_from_details +AwsEcsTaskDefinitionDetails,aws_ecs_task_definition_details +AwsEcsTaskDefinitionInferenceAcceleratorsDetails,aws_ecs_task_definition_inference_accelerators_details +AwsEcsTaskDefinitionPlacementConstraintsDetails,aws_ecs_task_definition_placement_constraints_details +AwsEcsTaskDefinitionProxyConfigurationDetails,aws_ecs_task_definition_proxy_configuration_details +AwsEcsTaskDefinitionProxyConfigurationProxyConfigurationPropertiesDetails,aws_ecs_task_definition_proxy_configuration_proxy_configuration_properties_details +AwsEcsTaskDefinitionVolumesDetails,aws_ecs_task_definition_volumes_details +AwsEcsTaskDefinitionVolumesDockerVolumeConfigurationDetails,aws_ecs_task_definition_volumes_docker_volume_configuration_details +AwsEcsTaskDefinitionVolumesEfsVolumeConfigurationAuthorizationConfigDetails,aws_ecs_task_definition_volumes_efs_volume_configuration_authorization_config_details +AwsEcsTaskDefinitionVolumesEfsVolumeConfigurationDetails,aws_ecs_task_definition_volumes_efs_volume_configuration_details +AwsEcsTaskDefinitionVolumesHostDetails,aws_ecs_task_definition_volumes_host_details +AwsEcsTaskDetails,aws_ecs_task_details +AwsEcsTaskVolumeDetails,aws_ecs_task_volume_details +AwsEcsTaskVolumeHostDetails,aws_ecs_task_volume_host_details +AwsEfsAccessPoint,aws_efs_access_point +AwsEfsAccessPointDetails,aws_efs_access_point_details +AwsEfsAccessPointPosixUserDetails,aws_efs_access_point_posix_user_details +AwsEfsAccessPointRootDirectoryCreationInfoDetails,aws_efs_access_point_root_directory_creation_info_details +AwsEfsAccessPointRootDirectoryDetails,aws_efs_access_point_root_directory_details +AwsEksCluster,aws_eks_cluster +AwsEksClusterDetails,aws_eks_cluster_details +AwsEksClusterLoggingClusterLoggingDetails,aws_eks_cluster_logging_cluster_logging_details +AwsEksClusterLoggingDetails,aws_eks_cluster_logging_details +AwsEksClusterResourcesVpcConfigDetails,aws_eks_cluster_resources_vpc_config_details +AwsElasticBeanstalkEnvironment,aws_elastic_beanstalk_environment +AwsElasticBeanstalkEnvironmentDetails,aws_elastic_beanstalk_environment_details +AwsElasticBeanstalkEnvironmentEnvironmentLink,aws_elastic_beanstalk_environment_environment_link +AwsElasticBeanstalkEnvironmentOptionSetting,aws_elastic_beanstalk_environment_option_setting +AwsElasticBeanstalkEnvironmentTier,aws_elastic_beanstalk_environment_tier +AwsElasticsearchDomain,aws_elasticsearch_domain +AwsElasticsearchDomainDetails,aws_elasticsearch_domain_details +AwsElasticsearchDomainDomainEndpointOptions,aws_elasticsearch_domain_domain_endpoint_options +AwsElasticsearchDomainElasticsearchClusterConfigDetails,aws_elasticsearch_domain_elasticsearch_cluster_config_details +AwsElasticsearchDomainElasticsearchClusterConfigZoneAwarenessConfigDetails,aws_elasticsearch_domain_elasticsearch_cluster_config_zone_awareness_config_details +AwsElasticsearchDomainEncryptionAtRestOptions,aws_elasticsearch_domain_encryption_at_rest_options +AwsElasticsearchDomainLogPublishingOptions,aws_elasticsearch_domain_log_publishing_options +AwsElasticsearchDomainLogPublishingOptionsLogConfig,aws_elasticsearch_domain_log_publishing_options_log_config +AwsElasticsearchDomainNodeToNodeEncryptionOptions,aws_elasticsearch_domain_node_to_node_encryption_options +AwsElasticsearchDomainServiceSoftwareOptions,aws_elasticsearch_domain_service_software_options +AwsElasticsearchDomainVPCOptions,aws_elasticsearch_domain_vpc_options +AwsElbAppCookieStickinessPolicy,aws_elb_app_cookie_stickiness_policy +AwsElbLbCookieStickinessPolicy,aws_elb_lb_cookie_stickiness_policy +AwsElbLoadBalancer,aws_elb_load_balancer +AwsElbLoadBalancerAccessLog,aws_elb_load_balancer_access_log +AwsElbLoadBalancerAdditionalAttribute,aws_elb_load_balancer_additional_attribute +AwsElbLoadBalancerAttributes,aws_elb_load_balancer_attributes +AwsElbLoadBalancerBackendServerDescription,aws_elb_load_balancer_backend_server_description +AwsElbLoadBalancerConnectionDraining,aws_elb_load_balancer_connection_draining +AwsElbLoadBalancerConnectionSettings,aws_elb_load_balancer_connection_settings +AwsElbLoadBalancerCrossZoneLoadBalancing,aws_elb_load_balancer_cross_zone_load_balancing +AwsElbLoadBalancerDetails,aws_elb_load_balancer_details +AwsElbLoadBalancerHealthCheck,aws_elb_load_balancer_health_check +AwsElbLoadBalancerInstance,aws_elb_load_balancer_instance +AwsElbLoadBalancerListener,aws_elb_load_balancer_listener +AwsElbLoadBalancerListenerDescription,aws_elb_load_balancer_listener_description +AwsElbLoadBalancerPolicies,aws_elb_load_balancer_policies +AwsElbLoadBalancerSourceSecurityGroup,aws_elb_load_balancer_source_security_group +AwsElbv2LoadBalancer,aws_elbv2_load_balancer +AwsElbv2LoadBalancerAttribute,aws_elbv2_load_balancer_attribute +AwsElbv2LoadBalancerDetails,aws_elbv2_load_balancer_details +AwsEventSchemasRegistry,aws_event_schemas_registry +AwsEventSchemasRegistryDetails,aws_event_schemas_registry_details +AwsGroundStationAgentEndpoint,aws_ground_station_agent_endpoint +AwsGuardDutyDetector,aws_guard_duty_detector +AwsGuardDutyDetectorDataSourcesCloudTrailDetails,aws_guard_duty_detector_data_sources_cloud_trail_details +AwsGuardDutyDetectorDataSourcesDetails,aws_guard_duty_detector_data_sources_details +AwsGuardDutyDetectorDataSourcesDnsLogsDetails,aws_guard_duty_detector_data_sources_dns_logs_details +AwsGuardDutyDetectorDataSourcesFlowLogsDetails,aws_guard_duty_detector_data_sources_flow_logs_details +AwsGuardDutyDetectorDataSourcesKubernetesAuditLogsDetails,aws_guard_duty_detector_data_sources_kubernetes_audit_logs_details +AwsGuardDutyDetectorDataSourcesKubernetesDetails,aws_guard_duty_detector_data_sources_kubernetes_details +AwsGuardDutyDetectorDataSourcesMalwareProtectionDetails,aws_guard_duty_detector_data_sources_malware_protection_details +AwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsDetails,aws_guard_duty_detector_data_sources_malware_protection_scan_ec2_instance_with_findings_details +AwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsEbsVolumesDetails,aws_guard_duty_detector_data_sources_malware_protection_scan_ec2_instance_with_findings_ebs_volumes_details +AwsGuardDutyDetectorDataSourcesS3LogsDetails,aws_guard_duty_detector_data_sources_s3_logs_details +AwsGuardDutyDetectorDetails,aws_guard_duty_detector_details +AwsGuardDutyDetectorFeaturesDetails,aws_guard_duty_detector_features_details +AwsHardwareCertificate,aws_hardware_certificate +AwsIamAccessKey,aws_iam_access_key +AwsIamAccessKeyDetails,aws_iam_access_key_details +AwsIamAccessKeySessionContext,aws_iam_access_key_session_context +AwsIamAccessKeySessionContextAttributes,aws_iam_access_key_session_context_attributes +AwsIamAccessKeySessionContextSessionIssuer,aws_iam_access_key_session_context_session_issuer +AwsIamAttachedManagedPolicy,aws_iam_attached_managed_policy +AwsIamConfig,aws_iam_config +AwsIamGroup,aws_iam_group +AwsIamGroupDetails,aws_iam_group_details +AwsIamGroupPolicy,aws_iam_group_policy +AwsIamInstanceProfile,aws_iam_instance_profile +AwsIamInstanceProfileRole,aws_iam_instance_profile_role +AwsIamPermissionsBoundary,aws_iam_permissions_boundary +AwsIamPolicy,aws_iam_policy +AwsIamPolicyDetails,aws_iam_policy_details +AwsIamPolicyVersion,aws_iam_policy_version +AwsIamRole,aws_iam_role +AwsIamRoleDetails,aws_iam_role_details +AwsIamRolePolicy,aws_iam_role_policy +AwsIamUser,aws_iam_user +AwsIamUserDetails,aws_iam_user_details +AwsIamUserPolicy,aws_iam_user_policy +AwsIdentity,aws_identity +AwsIotAnalyticsParameters,aws_iot_analytics_parameters +AwsJobAbortConfig,aws_job_abort_config +AwsJobAbortCriteria,aws_job_abort_criteria +AwsJobExecutionsRolloutConfig,aws_job_executions_rollout_config +AwsJobExponentialRolloutRate,aws_job_exponential_rollout_rate +AwsJobPresignedUrlConfig,aws_job_presigned_url_config +AwsJobRateIncreaseCriteria,aws_job_rate_increase_criteria +AwsJobTimeoutConfig,aws_job_timeout_config +AwsKinesisStream,aws_kinesis_stream +AwsKinesisStreamDetails,aws_kinesis_stream_details +AwsKinesisStreamStreamEncryptionDetails,aws_kinesis_stream_stream_encryption_details +AwsKmsKey,aws_kms_key +AwsKmsKeyArn,aws_kms_key_arn +AwsKmsKeyDetails,aws_kms_key_details +AwsKmsKeyId,aws_kms_key_id +AwsLambdaFunction,aws_lambda_function +AwsLambdaFunctionCode,aws_lambda_function_code +AwsLambdaFunctionDeadLetterConfig,aws_lambda_function_dead_letter_config +AwsLambdaFunctionDetails,aws_lambda_function_details +AwsLambdaFunctionEnvironment,aws_lambda_function_environment +AwsLambdaFunctionEnvironmentError,aws_lambda_function_environment_error +AwsLambdaFunctionLayer,aws_lambda_function_layer +AwsLambdaFunctionTracingConfig,aws_lambda_function_tracing_config +AwsLambdaFunctionVpcConfig,aws_lambda_function_vpc_config +AwsLambdaLayerVersion,aws_lambda_layer_version +AwsLambdaLayerVersionDetails,aws_lambda_layer_version_details +AwsLambdaTransformation,aws_lambda_transformation +AwsLogSourceConfiguration,aws_log_source_configuration +AwsLogSourceResource,aws_log_source_resource +AwsManaged,aws_managed +AwsManagedHumanLoopRequestSource,aws_managed_human_loop_request_source +AwsManagedResources,aws_managed_resources +AwsMountPoint,aws_mount_point +AwsNetworkFirewallFirewall,aws_network_firewall_firewall +AwsNetworkFirewallFirewallDetails,aws_network_firewall_firewall_details +AwsNetworkFirewallFirewallPolicy,aws_network_firewall_firewall_policy +AwsNetworkFirewallFirewallPolicyDetails,aws_network_firewall_firewall_policy_details +AwsNetworkFirewallFirewallSubnetMappingsDetails,aws_network_firewall_firewall_subnet_mappings_details +AwsNetworkFirewallRuleGroup,aws_network_firewall_rule_group +AwsNetworkFirewallRuleGroupDetails,aws_network_firewall_rule_group_details +AwsOpenSearchServiceDomain,aws_open_search_service_domain +AwsOpenSearchServiceDomainAdvancedSecurityOptionsDetails,aws_open_search_service_domain_advanced_security_options_details +AwsOpenSearchServiceDomainClusterConfigDetails,aws_open_search_service_domain_cluster_config_details +AwsOpenSearchServiceDomainClusterConfigZoneAwarenessConfigDetails,aws_open_search_service_domain_cluster_config_zone_awareness_config_details +AwsOpenSearchServiceDomainDetails,aws_open_search_service_domain_details +AwsOpenSearchServiceDomainDomainEndpointOptionsDetails,aws_open_search_service_domain_domain_endpoint_options_details +AwsOpenSearchServiceDomainEncryptionAtRestOptionsDetails,aws_open_search_service_domain_encryption_at_rest_options_details +AwsOpenSearchServiceDomainLogPublishingOption,aws_open_search_service_domain_log_publishing_option +AwsOpenSearchServiceDomainLogPublishingOptionsDetails,aws_open_search_service_domain_log_publishing_options_details +AwsOpenSearchServiceDomainMasterUserOptionsDetails,aws_open_search_service_domain_master_user_options_details +AwsOpenSearchServiceDomainNodeToNodeEncryptionOptionsDetails,aws_open_search_service_domain_node_to_node_encryption_options_details +AwsOpenSearchServiceDomainServiceSoftwareOptionsDetails,aws_open_search_service_domain_service_software_options_details +AwsOpenSearchServiceDomainVpcOptionsDetails,aws_open_search_service_domain_vpc_options_details +AwsOrg,aws_org +AwsOrganizationsSource,aws_organizations_source +AwsRdsDbCluster,aws_rds_db_cluster +AwsRdsDbClusterAssociatedRole,aws_rds_db_cluster_associated_role +AwsRdsDbClusterDetails,aws_rds_db_cluster_details +AwsRdsDbClusterMember,aws_rds_db_cluster_member +AwsRdsDbClusterOptionGroupMembership,aws_rds_db_cluster_option_group_membership +AwsRdsDbClusterSnapshot,aws_rds_db_cluster_snapshot +AwsRdsDbClusterSnapshotDbClusterSnapshotAttribute,aws_rds_db_cluster_snapshot_db_cluster_snapshot_attribute +AwsRdsDbClusterSnapshotDetails,aws_rds_db_cluster_snapshot_details +AwsRdsDbDomainMembership,aws_rds_db_domain_membership +AwsRdsDbInstance,aws_rds_db_instance +AwsRdsDbInstanceAssociatedRole,aws_rds_db_instance_associated_role +AwsRdsDbInstanceDetails,aws_rds_db_instance_details +AwsRdsDbInstanceEndpoint,aws_rds_db_instance_endpoint +AwsRdsDbInstanceVpcSecurityGroup,aws_rds_db_instance_vpc_security_group +AwsRdsDbOptionGroupMembership,aws_rds_db_option_group_membership +AwsRdsDbParameterGroup,aws_rds_db_parameter_group +AwsRdsDbPendingModifiedValues,aws_rds_db_pending_modified_values +AwsRdsDbProcessorFeature,aws_rds_db_processor_feature +AwsRdsDbSecurityGroup,aws_rds_db_security_group +AwsRdsDbSecurityGroupDetails,aws_rds_db_security_group_details +AwsRdsDbSecurityGroupEc2SecurityGroup,aws_rds_db_security_group_ec2_security_group +AwsRdsDbSecurityGroupIpRange,aws_rds_db_security_group_ip_range +AwsRdsDbSnapshot,aws_rds_db_snapshot +AwsRdsDbSnapshotDetails,aws_rds_db_snapshot_details +AwsRdsDbStatusInfo,aws_rds_db_status_info +AwsRdsDbSubnetGroup,aws_rds_db_subnet_group +AwsRdsDbSubnetGroupSubnet,aws_rds_db_subnet_group_subnet +AwsRdsDbSubnetGroupSubnetAvailabilityZone,aws_rds_db_subnet_group_subnet_availability_zone +AwsRdsEventSubscription,aws_rds_event_subscription +AwsRdsEventSubscriptionDetails,aws_rds_event_subscription_details +AwsRdsPendingCloudWatchLogsExports,aws_rds_pending_cloud_watch_logs_exports +AwsRedshiftCluster,aws_redshift_cluster +AwsRedshiftClusterClusterNode,aws_redshift_cluster_cluster_node +AwsRedshiftClusterClusterParameterGroup,aws_redshift_cluster_cluster_parameter_group +AwsRedshiftClusterClusterParameterStatus,aws_redshift_cluster_cluster_parameter_status +AwsRedshiftClusterClusterSecurityGroup,aws_redshift_cluster_cluster_security_group +AwsRedshiftClusterClusterSnapshotCopyStatus,aws_redshift_cluster_cluster_snapshot_copy_status +AwsRedshiftClusterDeferredMaintenanceWindow,aws_redshift_cluster_deferred_maintenance_window +AwsRedshiftClusterDetails,aws_redshift_cluster_details +AwsRedshiftClusterElasticIpStatus,aws_redshift_cluster_elastic_ip_status +AwsRedshiftClusterEndpoint,aws_redshift_cluster_endpoint +AwsRedshiftClusterHsmStatus,aws_redshift_cluster_hsm_status +AwsRedshiftClusterIamRole,aws_redshift_cluster_iam_role +AwsRedshiftClusterLoggingStatus,aws_redshift_cluster_logging_status +AwsRedshiftClusterPendingModifiedValues,aws_redshift_cluster_pending_modified_values +AwsRedshiftClusterResizeInfo,aws_redshift_cluster_resize_info +AwsRedshiftClusterRestoreStatus,aws_redshift_cluster_restore_status +AwsRedshiftClusterVpcSecurityGroup,aws_redshift_cluster_vpc_security_group +AwsRegion,aws_region +AwsRegions,aws_regions +AwsS3AccountPublicAccessBlock,aws_s3_account_public_access_block +AwsS3AccountPublicAccessBlockDetails,aws_s3_account_public_access_block_details +AwsS3Bucket,aws_s3_bucket +AwsS3BucketBucketLifecycleConfigurationDetails,aws_s3_bucket_bucket_lifecycle_configuration_details +AwsS3BucketBucketLifecycleConfigurationRulesAbortIncompleteMultipartUploadDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_abort_incomplete_multipart_upload_details +AwsS3BucketBucketLifecycleConfigurationRulesDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_operands_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsTagDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_operands_tag_details +AwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateTagDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_tag_details +AwsS3BucketBucketLifecycleConfigurationRulesNoncurrentVersionTransitionsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_noncurrent_version_transitions_details +AwsS3BucketBucketLifecycleConfigurationRulesTransitionsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_transitions_details +AwsS3BucketBucketVersioningConfiguration,aws_s3_bucket_bucket_versioning_configuration +AwsS3BucketDetails,aws_s3_bucket_details +AwsS3BucketLoggingConfiguration,aws_s3_bucket_logging_configuration +AwsS3BucketNotificationConfiguration,aws_s3_bucket_notification_configuration +AwsS3BucketNotificationConfigurationDetail,aws_s3_bucket_notification_configuration_detail +AwsS3BucketNotificationConfigurationFilter,aws_s3_bucket_notification_configuration_filter +AwsS3BucketNotificationConfigurationS3KeyFilter,aws_s3_bucket_notification_configuration_s3_key_filter +AwsS3BucketNotificationConfigurationS3KeyFilterRule,aws_s3_bucket_notification_configuration_s3_key_filter_rule +AwsS3BucketObjectLockConfiguration,aws_s3_bucket_object_lock_configuration +AwsS3BucketObjectLockConfigurationRuleDefaultRetentionDetails,aws_s3_bucket_object_lock_configuration_rule_default_retention_details +AwsS3BucketObjectLockConfigurationRuleDetails,aws_s3_bucket_object_lock_configuration_rule_details +AwsS3BucketServerSideEncryptionByDefault,aws_s3_bucket_server_side_encryption_by_default +AwsS3BucketServerSideEncryptionConfiguration,aws_s3_bucket_server_side_encryption_configuration +AwsS3BucketServerSideEncryptionRule,aws_s3_bucket_server_side_encryption_rule +AwsS3BucketWebsiteConfiguration,aws_s3_bucket_website_configuration +AwsS3BucketWebsiteConfigurationRedirectTo,aws_s3_bucket_website_configuration_redirect_to +AwsS3BucketWebsiteConfigurationRoutingRule,aws_s3_bucket_website_configuration_routing_rule +AwsS3BucketWebsiteConfigurationRoutingRuleCondition,aws_s3_bucket_website_configuration_routing_rule_condition +AwsS3BucketWebsiteConfigurationRoutingRuleRedirect,aws_s3_bucket_website_configuration_routing_rule_redirect +AwsS3Object,aws_s3_object +AwsS3ObjectDetails,aws_s3_object_details +AwsSageMakerNotebookInstance,aws_sage_maker_notebook_instance +AwsSageMakerNotebookInstanceDetails,aws_sage_maker_notebook_instance_details +AwsSageMakerNotebookInstanceMetadataServiceConfigurationDetails,aws_sage_maker_notebook_instance_metadata_service_configuration_details +AwsSecretsManagerSecret,aws_secrets_manager_secret +AwsSecretsManagerSecretDetails,aws_secrets_manager_secret_details +AwsSecretsManagerSecretRotationRules,aws_secrets_manager_secret_rotation_rules +AwsSecurityFinding,aws_security_finding +AwsSecurityFindingFilters,aws_security_finding_filters +AwsSecurityFindingIdentifier,aws_security_finding_identifier +AwsService,aws_service +AwsSnsTopic,aws_sns_topic +AwsSnsTopicDetails,aws_sns_topic_details +AwsSnsTopicSubscription,aws_sns_topic_subscription +AwsSqsQueue,aws_sqs_queue +AwsSqsQueueDetails,aws_sqs_queue_details +AwsSsmComplianceSummary,aws_ssm_compliance_summary +AwsSsmPatch,aws_ssm_patch +AwsSsmPatchCompliance,aws_ssm_patch_compliance +AwsSsmPatchComplianceDetails,aws_ssm_patch_compliance_details +AwsSsoAuthentication,aws_sso_authentication +AwsStepFunctionStateMachine,aws_step_function_state_machine +AwsStepFunctionStateMachineDetails,aws_step_function_state_machine_details +AwsStepFunctionStateMachineLoggingConfigurationDestinationsCloudWatchLogsLogGroupDetails,aws_step_function_state_machine_logging_configuration_destinations_cloud_watch_logs_log_group_details +AwsStepFunctionStateMachineLoggingConfigurationDestinationsDetails,aws_step_function_state_machine_logging_configuration_destinations_details +AwsStepFunctionStateMachineLoggingConfigurationDetails,aws_step_function_state_machine_logging_configuration_details +AwsStepFunctionStateMachineTracingConfigurationDetails,aws_step_function_state_machine_tracing_configuration_details +AwsTagKey,aws_tag_key +AwsTagValue,aws_tag_value +AwsUserPoolsId,aws_user_pools_id +AwsUserPoolsWebClientId,aws_user_pools_web_client_id +AwsVPCSecurityGroupViolation,aws_vpc_security_group_violation +AwsVpcConfiguration,aws_vpc_configuration +AwsWafRateBasedRule,aws_waf_rate_based_rule +AwsWafRateBasedRuleDetails,aws_waf_rate_based_rule_details +AwsWafRateBasedRuleMatchPredicate,aws_waf_rate_based_rule_match_predicate +AwsWafRegionalRateBasedRule,aws_waf_regional_rate_based_rule +AwsWafRegionalRateBasedRuleDetails,aws_waf_regional_rate_based_rule_details +AwsWafRegionalRateBasedRuleMatchPredicate,aws_waf_regional_rate_based_rule_match_predicate +AwsWafRegionalRule,aws_waf_regional_rule +AwsWafRegionalRuleDetails,aws_waf_regional_rule_details +AwsWafRegionalRuleGroup,aws_waf_regional_rule_group +AwsWafRegionalRuleGroupDetails,aws_waf_regional_rule_group_details +AwsWafRegionalRuleGroupRulesActionDetails,aws_waf_regional_rule_group_rules_action_details +AwsWafRegionalRuleGroupRulesDetails,aws_waf_regional_rule_group_rules_details +AwsWafRegionalRulePredicateListDetails,aws_waf_regional_rule_predicate_list_details +AwsWafRegionalWebAcl,aws_waf_regional_web_acl +AwsWafRegionalWebAclDetails,aws_waf_regional_web_acl_details +AwsWafRegionalWebAclRulesListActionDetails,aws_waf_regional_web_acl_rules_list_action_details +AwsWafRegionalWebAclRulesListDetails,aws_waf_regional_web_acl_rules_list_details +AwsWafRegionalWebAclRulesListOverrideActionDetails,aws_waf_regional_web_acl_rules_list_override_action_details +AwsWafRule,aws_waf_rule +AwsWafRuleDetails,aws_waf_rule_details +AwsWafRuleGroup,aws_waf_rule_group +AwsWafRuleGroupDetails,aws_waf_rule_group_details +AwsWafRuleGroupRulesActionDetails,aws_waf_rule_group_rules_action_details +AwsWafRuleGroupRulesDetails,aws_waf_rule_group_rules_details +AwsWafRulePredicateListDetails,aws_waf_rule_predicate_list_details +AwsWafWebAcl,aws_waf_web_acl +AwsWafWebAclDetails,aws_waf_web_acl_details +AwsWafWebAclRule,aws_waf_web_acl_rule +AwsWafv2ActionAllowDetails,aws_wafv2_action_allow_details +AwsWafv2ActionBlockDetails,aws_wafv2_action_block_details +AwsWafv2CustomHttpHeader,aws_wafv2_custom_http_header +AwsWafv2CustomRequestHandlingDetails,aws_wafv2_custom_request_handling_details +AwsWafv2CustomResponseDetails,aws_wafv2_custom_response_details +AwsWafv2RuleGroup,aws_wafv2_rule_group +AwsWafv2RuleGroupDetails,aws_wafv2_rule_group_details +AwsWafv2RulesActionCaptchaDetails,aws_wafv2_rules_action_captcha_details +AwsWafv2RulesActionCountDetails,aws_wafv2_rules_action_count_details +AwsWafv2RulesActionDetails,aws_wafv2_rules_action_details +AwsWafv2RulesDetails,aws_wafv2_rules_details +AwsWafv2VisibilityConfigDetails,aws_wafv2_visibility_config_details +AwsWafv2WebAcl,aws_wafv2_web_acl +AwsWafv2WebAclActionDetails,aws_wafv2_web_acl_action_details +AwsWafv2WebAclCaptchaConfigDetails,aws_wafv2_web_acl_captcha_config_details +AwsWafv2WebAclCaptchaConfigImmunityTimePropertyDetails,aws_wafv2_web_acl_captcha_config_immunity_time_property_details +AwsWafv2WebAclDetails,aws_wafv2_web_acl_details +AwsXrayEncryptionConfig,aws_xray_encryption_config +AwsXrayEncryptionConfigDetails,aws_xray_encryption_config_details +AxesRangeScale,axes_range_scale +AxisBinding,axis_binding +AxisDataOptions,axis_data_options +AxisDisplayMinMaxRange,axis_display_min_max_range +AxisDisplayOptions,axis_display_options +AxisDisplayRange,axis_display_range +AxisLabelOptions,axis_label_options +AxisLabelReferenceOptions,axis_label_reference_options +AxisLineVisibility,axis_line_visibility +AxisLinearScale,axis_linear_scale +AxisLogarithmicScale,axis_logarithmic_scale +AxisOffset,axis_offset +AxisOptions,axis_options +AxisScale,axis_scale +AxisTickLabelOptions,axis_tick_label_options +AzureBlobSasConfiguration,azure_blob_sas_configuration +B,b +BGPPeer,bgp_peer +BS,bs +BabelfishDatabaseName,babelfish_database_name +BackTestAnomalyDetectorRequest,back_test_anomaly_detector_request +BackTestConfiguration,back_test_configuration +BackTestWindowOffset,back_test_window_offset +BackendAPIAppSyncAuthSettings,backend_api_app_sync_auth_settings +BackendAPIAuthType,backend_api_auth_type +BackendAPIConflictResolution,backend_api_conflict_resolution +BackendAPIResourceConfig,backend_api_resource_config +BackendAuthAppleProviderConfig,backend_auth_apple_provider_config +BackendAuthSocialProviderConfig,backend_auth_social_provider_config +BackendConnectionErrors,backend_connection_errors +BackendDefaults,backend_defaults +BackendEnvironment,backend_environment +BackendEnvironmentList,backend_environment_list +BackendEnvironmentName,backend_environment_name +BackendJobRespObj,backend_job_resp_obj +BackendManagerAppId,backend_manager_app_id +BackendServerDescription,backend_server_description +BackendServerDescriptions,backend_server_descriptions +BackendStoragePermissions,backend_storage_permissions +BackfillError,backfill_error +BackfillErrors,backfill_errors +BackfillMode,backfill_mode +Backfilling,backfilling +Background,background +BackgroundColor,background_color +BackgroundOpacity,background_opacity +BackgroundStyle,background_style +BackgroundVisibility,background_visibility +Backint,backint +BackintConfig,backint_config +BackintMode,backint_mode +BacktestResults,backtest_results +BacktrackConsumedChangeRecords,backtrack_consumed_change_records +BacktrackDBClusterMessage,backtrack_db_cluster_message +BacktrackIdentifier,backtrack_identifier +BacktrackRequestCreationTime,backtrack_request_creation_time +BacktrackTo,backtrack_to +BacktrackWindow,backtrack_window +BacktrackedFrom,backtracked_from +Backup,backup +BackupArn,backup_arn +BackupBeingCopied,backup_being_copied +BackupCreationDateTime,backup_creation_date_time +BackupDescription,backup_description +BackupDetails,backup_details +BackupExpiryDateTime,backup_expiry_date_time +BackupFailureDetails,backup_failure_details +BackupId,backup_id +BackupIds,backup_ids +BackupInProgress,backup_in_progress +BackupInUseException,backup_in_use_exception +BackupJob,backup_job +BackupJobId,backup_job_id +BackupJobs,backup_jobs +BackupName,backup_name +BackupNotFound,backup_not_found +BackupNotFoundException,backup_not_found_exception +BackupObject,backup_object +BackupOptions,backup_options +BackupPlan,backup_plan +BackupPlanArn,backup_plan_arn +BackupPlanDocument,backup_plan_document +BackupPlanId,backup_plan_id +BackupPlanInput,backup_plan_input +BackupPlanName,backup_plan_name +BackupPlanRule,backup_plan_rule +BackupPlanTags,backup_plan_tags +BackupPlanTemplateId,backup_plan_template_id +BackupPlanTemplateJson,backup_plan_template_json +BackupPlanTemplateName,backup_plan_template_name +BackupPlanTemplatesList,backup_plan_templates_list +BackupPlanTemplatesListMember,backup_plan_templates_list_member +BackupPlanVersion,backup_plan_version +BackupPlanVersionsList,backup_plan_versions_list +BackupPlansList,backup_plans_list +BackupPlansListMember,backup_plans_list_member +BackupPolicy,backup_policy +BackupPolicyDescription,backup_policy_description +BackupPolicyNotFoundFault,backup_policy_not_found_fault +BackupProgressInMegaBytes,backup_progress_in_mega_bytes +BackupRestoring,backup_restoring +BackupRetentionCount,backup_retention_count +BackupRetentionPeriod,backup_retention_period +BackupRetentionPolicy,backup_retention_policy +BackupRule,backup_rule +BackupRuleId,backup_rule_id +BackupRuleInput,backup_rule_input +BackupSelection,backup_selection +BackupSelectionsList,backup_selections_list +BackupSelectionsListMember,backup_selections_list_member +BackupSizeBytes,backup_size_bytes +BackupSizeInBytes,backup_size_in_bytes +BackupState,backup_state +BackupStatus,backup_status +BackupSummaries,backup_summaries +BackupSummary,backup_summary +BackupTarget,backup_target +BackupType,backup_type +BackupVaultAccountId,backup_vault_account_id +BackupVaultArn,backup_vault_arn +BackupVaultEvents,backup_vault_events +BackupVaultList,backup_vault_list +BackupVaultListMember,backup_vault_list_member +BackupVaultName,backup_vault_name +BackupVaultTags,backup_vault_tags +Backups,backups +BadDocumentException,bad_document_exception +BadGatewayException,bad_gateway_exception +BadRequest,bad_request +BadRequestDetail,bad_request_detail +BadRequestException,bad_request_exception +Badge,badge +Baidu,baidu +BaiduChannelRequest,baidu_channel_request +BaiduChannelResponse,baidu_channel_response +BaiduMessage,baidu_message +BalancingStrategy,balancing_strategy +BandFilter,band_filter +BandMathConfigInput,band_math_config_input +BandName,band_name +Bandwidth,bandwidth +BandwidthRateLimitInterval,bandwidth_rate_limit_interval +BandwidthRateLimitIntervals,bandwidth_rate_limit_intervals +BandwidthReductionFilter,bandwidth_reduction_filter +BandwidthType,bandwidth_type +BannerText,banner_text +BarChartAggregatedFieldWells,bar_chart_aggregated_field_wells +BarChartConfiguration,bar_chart_configuration +BarChartFieldWells,bar_chart_field_wells +BarChartSortConfiguration,bar_chart_sort_configuration +BarChartVisual,bar_chart_visual +BarDataLabels,bar_data_labels +BarValues,bar_values +BareMetal,bare_metal +BarsArrangement,bars_arrangement +Base,base +Base32StringSeed,base32_string_seed +Base64String,base64_string +BaseCanaryRunId,base_canary_run_id +BaseConfigurationItem,base_configuration_item +BaseConfigurationItems,base_configuration_items +BaseDirectory,base_directory +BaseEndpointDnsNames,base_endpoint_dns_names +BaseException,base_exception +BaseImage,base_image +BaseImageArn,base_image_arn +BaseKpiResult,base_kpi_result +BaseLat,base_lat +BaseLensVersion,base_lens_version +BaseLng,base_lng +BaseMapStyle,base_map_style +BaseModelName,base_model_name +BasePath,base_path +BasePathMapping,base_path_mapping +BasePathMappings,base_path_mappings +BasePathUpdate,base_path_update +BaseScore,base_score +BaseScreenshot,base_screenshot +BaseScreenshots,base_screenshots +BaseSeriesSettings,base_series_settings +BaseStationId,base_station_id +BaseThemeId,base_theme_id +BaseUrl,base_url +BaseUrlContent,base_url_content +BaseUrlContent1,base_url_content1 +BaseUrlManifest,base_url_manifest +BaseUrlManifest1,base_url_manifest1 +BaseVector,base_vector +BasedOnSpiceSchedule,based_on_spice_schedule +Baseline,baseline +BaselineBandwidthInGbps,baseline_bandwidth_in_gbps +BaselineBandwidthInMbps,baseline_bandwidth_in_mbps +BaselineConfig,baseline_config +BaselineData,baseline_data +BaselineDescription,baseline_description +BaselineEbsBandwidthMbps,baseline_ebs_bandwidth_mbps +BaselineEbsBandwidthMbpsRequest,baseline_ebs_bandwidth_mbps_request +BaselineId,baseline_id +BaselineIdentities,baseline_identities +BaselineIdentity,baseline_identity +BaselineIops,baseline_iops +BaselineMetric,baseline_metric +BaselineMetrics,baseline_metrics +BaselineName,baseline_name +BaselineOverride,baseline_override +BaselineThroughputInMBps,baseline_throughput_in_m_bps +BaselineUsedForDriftCheckConstraints,baseline_used_for_drift_check_constraints +BaselineUsedForDriftCheckStatistics,baseline_used_for_drift_check_statistics +BaseliningJobName,baselining_job_name +Basepath,basepath +BasicAuthCredentials,basic_auth_credentials +BasicAuthParameters,basic_auth_parameters +BasicAuthSecretId,basic_auth_secret_id +BasicAuthentication,basic_authentication +BasicAuthenticationConfiguration,basic_authentication_configuration +BasicCatalogTarget,basic_catalog_target +BasicLayout,basic_layout +Batch,batch +BatchAcknowledgeAlarmRequest,batch_acknowledge_alarm_request +BatchAcknowledgeAlarmResponse,batch_acknowledge_alarm_response +BatchAddFacetToObject,batch_add_facet_to_object +BatchAlarmActionErrorEntry,batch_alarm_action_error_entry +BatchApplyUpdateActionMessage,batch_apply_update_action_message +BatchArrayProperties,batch_array_properties +BatchAssociateApprovalRuleTemplateWithRepositoriesError,batch_associate_approval_rule_template_with_repositories_error +BatchAssociateApprovalRuleTemplateWithRepositoriesInput,batch_associate_approval_rule_template_with_repositories_input +BatchAssociateApprovalRuleTemplateWithRepositoriesOutput,batch_associate_approval_rule_template_with_repositories_output +BatchAssociateAssessmentReportEvidenceRequest,batch_associate_assessment_report_evidence_request +BatchAssociateAssessmentReportEvidenceResponse,batch_associate_assessment_report_evidence_response +BatchAssociateClientDeviceWithCoreDeviceRequest,batch_associate_client_device_with_core_device_request +BatchAssociateClientDeviceWithCoreDeviceResponse,batch_associate_client_device_with_core_device_response +BatchAssociateProjectAssetsRequest,batch_associate_project_assets_request +BatchAssociateProjectAssetsResponse,batch_associate_project_assets_response +BatchAssociateResourceRequest,batch_associate_resource_request +BatchAssociateResourceResponse,batch_associate_resource_response +BatchAssociateResourcesToCustomLineItemInput,batch_associate_resources_to_custom_line_item_input +BatchAssociateResourcesToCustomLineItemOutput,batch_associate_resources_to_custom_line_item_output +BatchAssociateScramSecretRequest,batch_associate_scram_secret_request +BatchAssociateScramSecretResponse,batch_associate_scram_secret_response +BatchAssociateServiceActionWithProvisioningArtifactInput,batch_associate_service_action_with_provisioning_artifact_input +BatchAssociateServiceActionWithProvisioningArtifactOutput,batch_associate_service_action_with_provisioning_artifact_output +BatchAssociateUserStackRequest,batch_associate_user_stack_request +BatchAssociateUserStackResult,batch_associate_user_stack_result +BatchAttachObject,batch_attach_object +BatchAttachObjectResponse,batch_attach_object_response +BatchAttachPolicy,batch_attach_policy +BatchAttachToIndex,batch_attach_to_index +BatchAttachToIndexResponse,batch_attach_to_index_response +BatchAttachTypedLink,batch_attach_typed_link +BatchAttachTypedLinkResponse,batch_attach_typed_link_response +BatchChannelMemberships,batch_channel_memberships +BatchCheckLayerAvailabilityRequest,batch_check_layer_availability_request +BatchCheckLayerAvailabilityResponse,batch_check_layer_availability_response +BatchContainerOverrides,batch_container_overrides +BatchCount,batch_count +BatchCreateAttendeeRequest,batch_create_attendee_request +BatchCreateAttendeeResponse,batch_create_attendee_response +BatchCreateChannelMembershipError,batch_create_channel_membership_error +BatchCreateChannelMembershipRequest,batch_create_channel_membership_request +BatchCreateChannelMembershipResponse,batch_create_channel_membership_response +BatchCreateCustomVocabularyItemRequest,batch_create_custom_vocabulary_item_request +BatchCreateCustomVocabularyItemResponse,batch_create_custom_vocabulary_item_response +BatchCreateDelegationByAssessmentError,batch_create_delegation_by_assessment_error +BatchCreateDelegationByAssessmentRequest,batch_create_delegation_by_assessment_request +BatchCreateDelegationByAssessmentResponse,batch_create_delegation_by_assessment_response +BatchCreateIndex,batch_create_index +BatchCreateIndexResponse,batch_create_index_response +BatchCreateObject,batch_create_object +BatchCreateObjectResponse,batch_create_object_response +BatchCreatePartitionRequest,batch_create_partition_request +BatchCreatePartitionResponse,batch_create_partition_response +BatchCreateRoomMembershipRequest,batch_create_room_membership_request +BatchCreateRoomMembershipResponse,batch_create_room_membership_response +BatchCreateRumMetricDefinitionsError,batch_create_rum_metric_definitions_error +BatchCreateRumMetricDefinitionsRequest,batch_create_rum_metric_definitions_request +BatchCreateRumMetricDefinitionsResponse,batch_create_rum_metric_definitions_response +BatchCreateTableRowsRequest,batch_create_table_rows_request +BatchCreateTableRowsResult,batch_create_table_rows_result +BatchCreateVariableError,batch_create_variable_error +BatchCreateVariableRequest,batch_create_variable_request +BatchCreateVariableResult,batch_create_variable_result +BatchCreateVehicleRequest,batch_create_vehicle_request +BatchCreateVehicleResponse,batch_create_vehicle_response +BatchDataCaptureConfig,batch_data_capture_config +BatchDeleteAutomationRulesRequest,batch_delete_automation_rules_request +BatchDeleteAutomationRulesResponse,batch_delete_automation_rules_response +BatchDeleteBuildsInput,batch_delete_builds_input +BatchDeleteBuildsOutput,batch_delete_builds_output +BatchDeleteClusterSnapshotsRequest,batch_delete_cluster_snapshots_request +BatchDeleteClusterSnapshotsResult,batch_delete_cluster_snapshots_result +BatchDeleteConnectionRequest,batch_delete_connection_request +BatchDeleteConnectionResponse,batch_delete_connection_response +BatchDeleteCustomVocabularyItemRequest,batch_delete_custom_vocabulary_item_request +BatchDeleteCustomVocabularyItemResponse,batch_delete_custom_vocabulary_item_response +BatchDeleteDelegationByAssessmentError,batch_delete_delegation_by_assessment_error +BatchDeleteDelegationByAssessmentRequest,batch_delete_delegation_by_assessment_request +BatchDeleteDelegationByAssessmentResponse,batch_delete_delegation_by_assessment_response +BatchDeleteDetectorErrorEntry,batch_delete_detector_error_entry +BatchDeleteDetectorRequest,batch_delete_detector_request +BatchDeleteDetectorResponse,batch_delete_detector_response +BatchDeleteDevicePositionHistoryError,batch_delete_device_position_history_error +BatchDeleteDevicePositionHistoryRequest,batch_delete_device_position_history_request +BatchDeleteDevicePositionHistoryResponse,batch_delete_device_position_history_response +BatchDeleteDocumentRequest,batch_delete_document_request +BatchDeleteDocumentResponse,batch_delete_document_response +BatchDeleteDocumentResponseFailedDocument,batch_delete_document_response_failed_document +BatchDeleteFeaturedResultsSetError,batch_delete_featured_results_set_error +BatchDeleteFeaturedResultsSetRequest,batch_delete_featured_results_set_request +BatchDeleteFeaturedResultsSetResponse,batch_delete_featured_results_set_response +BatchDeleteGeofenceError,batch_delete_geofence_error +BatchDeleteGeofenceRequest,batch_delete_geofence_request +BatchDeleteGeofenceResponse,batch_delete_geofence_response +BatchDeleteImageRequest,batch_delete_image_request +BatchDeleteImageResponse,batch_delete_image_response +BatchDeleteImportDataError,batch_delete_import_data_error +BatchDeleteImportDataRequest,batch_delete_import_data_request +BatchDeleteImportDataResponse,batch_delete_import_data_response +BatchDeleteObject,batch_delete_object +BatchDeletePartitionRequest,batch_delete_partition_request +BatchDeletePartitionResponse,batch_delete_partition_response +BatchDeletePhoneNumberRequest,batch_delete_phone_number_request +BatchDeletePhoneNumberResponse,batch_delete_phone_number_response +BatchDeleteReadSetRequest,batch_delete_read_set_request +BatchDeleteReadSetResponse,batch_delete_read_set_response +BatchDeleteRecipeVersionRequest,batch_delete_recipe_version_request +BatchDeleteRecipeVersionResponse,batch_delete_recipe_version_response +BatchDeleteRequest,batch_delete_request +BatchDeleteRequestSizeExceededFault,batch_delete_request_size_exceeded_fault +BatchDeleteResponse,batch_delete_response +BatchDeleteRumMetricDefinitionsError,batch_delete_rum_metric_definitions_error +BatchDeleteRumMetricDefinitionsRequest,batch_delete_rum_metric_definitions_request +BatchDeleteRumMetricDefinitionsResponse,batch_delete_rum_metric_definitions_response +BatchDeleteScheduledActionAnswer,batch_delete_scheduled_action_answer +BatchDeleteScheduledActionType,batch_delete_scheduled_action_type +BatchDeleteTableRequest,batch_delete_table_request +BatchDeleteTableResponse,batch_delete_table_response +BatchDeleteTableRowsRequest,batch_delete_table_rows_request +BatchDeleteTableRowsResult,batch_delete_table_rows_result +BatchDeleteTableVersionRequest,batch_delete_table_version_request +BatchDeleteTableVersionResponse,batch_delete_table_version_response +BatchDeleteWorldsRequest,batch_delete_worlds_request +BatchDeleteWorldsResponse,batch_delete_worlds_response +BatchDescribeMergeConflictsError,batch_describe_merge_conflicts_error +BatchDescribeMergeConflictsInput,batch_describe_merge_conflicts_input +BatchDescribeMergeConflictsOutput,batch_describe_merge_conflicts_output +BatchDescribeModelPackageError,batch_describe_model_package_error +BatchDescribeModelPackageErrorMap,batch_describe_model_package_error_map +BatchDescribeModelPackageInput,batch_describe_model_package_input +BatchDescribeModelPackageOutput,batch_describe_model_package_output +BatchDescribeModelPackageSummary,batch_describe_model_package_summary +BatchDescribeSimulationJobRequest,batch_describe_simulation_job_request +BatchDescribeSimulationJobResponse,batch_describe_simulation_job_response +BatchDescribeTypeConfigurationsError,batch_describe_type_configurations_error +BatchDescribeTypeConfigurationsInput,batch_describe_type_configurations_input +BatchDescribeTypeConfigurationsOutput,batch_describe_type_configurations_output +BatchDetachFromIndex,batch_detach_from_index +BatchDetachFromIndexResponse,batch_detach_from_index_response +BatchDetachObject,batch_detach_object +BatchDetachObjectResponse,batch_detach_object_response +BatchDetachPolicy,batch_detach_policy +BatchDetachTypedLink,batch_detach_typed_link +BatchDetectDominantLanguageItemResult,batch_detect_dominant_language_item_result +BatchDetectDominantLanguageRequest,batch_detect_dominant_language_request +BatchDetectDominantLanguageResponse,batch_detect_dominant_language_response +BatchDetectEntitiesItemResult,batch_detect_entities_item_result +BatchDetectEntitiesRequest,batch_detect_entities_request +BatchDetectEntitiesResponse,batch_detect_entities_response +BatchDetectKeyPhrasesItemResult,batch_detect_key_phrases_item_result +BatchDetectKeyPhrasesRequest,batch_detect_key_phrases_request +BatchDetectKeyPhrasesResponse,batch_detect_key_phrases_response +BatchDetectSentimentItemResult,batch_detect_sentiment_item_result +BatchDetectSentimentRequest,batch_detect_sentiment_request +BatchDetectSentimentResponse,batch_detect_sentiment_response +BatchDetectSyntaxItemResult,batch_detect_syntax_item_result +BatchDetectSyntaxRequest,batch_detect_syntax_request +BatchDetectSyntaxResponse,batch_detect_syntax_response +BatchDetectTargetedSentimentItemResult,batch_detect_targeted_sentiment_item_result +BatchDetectTargetedSentimentRequest,batch_detect_targeted_sentiment_request +BatchDetectTargetedSentimentResponse,batch_detect_targeted_sentiment_response +BatchDisableAlarmRequest,batch_disable_alarm_request +BatchDisableAlarmResponse,batch_disable_alarm_response +BatchDisableStandardsRequest,batch_disable_standards_request +BatchDisableStandardsResponse,batch_disable_standards_response +BatchDisassociateApprovalRuleTemplateFromRepositoriesError,batch_disassociate_approval_rule_template_from_repositories_error +BatchDisassociateApprovalRuleTemplateFromRepositoriesInput,batch_disassociate_approval_rule_template_from_repositories_input +BatchDisassociateApprovalRuleTemplateFromRepositoriesOutput,batch_disassociate_approval_rule_template_from_repositories_output +BatchDisassociateAssessmentReportEvidenceRequest,batch_disassociate_assessment_report_evidence_request +BatchDisassociateAssessmentReportEvidenceResponse,batch_disassociate_assessment_report_evidence_response +BatchDisassociateClientDeviceFromCoreDeviceRequest,batch_disassociate_client_device_from_core_device_request +BatchDisassociateClientDeviceFromCoreDeviceResponse,batch_disassociate_client_device_from_core_device_response +BatchDisassociateProjectAssetsRequest,batch_disassociate_project_assets_request +BatchDisassociateProjectAssetsResponse,batch_disassociate_project_assets_response +BatchDisassociateResourceRequest,batch_disassociate_resource_request +BatchDisassociateResourceResponse,batch_disassociate_resource_response +BatchDisassociateResourcesFromCustomLineItemInput,batch_disassociate_resources_from_custom_line_item_input +BatchDisassociateResourcesFromCustomLineItemOutput,batch_disassociate_resources_from_custom_line_item_output +BatchDisassociateScramSecretRequest,batch_disassociate_scram_secret_request +BatchDisassociateScramSecretResponse,batch_disassociate_scram_secret_response +BatchDisassociateServiceActionFromProvisioningArtifactInput,batch_disassociate_service_action_from_provisioning_artifact_input +BatchDisassociateServiceActionFromProvisioningArtifactOutput,batch_disassociate_service_action_from_provisioning_artifact_output +BatchDisassociateUserStackRequest,batch_disassociate_user_stack_request +BatchDisassociateUserStackResult,batch_disassociate_user_stack_result +BatchEnableAlarmRequest,batch_enable_alarm_request +BatchEnableAlarmResponse,batch_enable_alarm_response +BatchEnableStandardsRequest,batch_enable_standards_request +BatchEnableStandardsResponse,batch_enable_standards_response +BatchEntryIdsNotDistinctException,batch_entry_ids_not_distinct_exception +BatchEnvironmentVariable,batch_environment_variable +BatchError,batch_error +BatchEvaluateFeatureRequest,batch_evaluate_feature_request +BatchEvaluateFeatureResponse,batch_evaluate_feature_response +BatchEvaluateGeofencesError,batch_evaluate_geofences_error +BatchEvaluateGeofencesRequest,batch_evaluate_geofences_request +BatchEvaluateGeofencesResponse,batch_evaluate_geofences_response +BatchExecuteStatementException,batch_execute_statement_exception +BatchExecuteStatementInput,batch_execute_statement_input +BatchExecuteStatementOutput,batch_execute_statement_output +BatchExecuteStatementRequest,batch_execute_statement_request +BatchExecuteStatementResponse,batch_execute_statement_response +BatchFailedResultModel,batch_failed_result_model +BatchGetAccountStatusRequest,batch_get_account_status_request +BatchGetAccountStatusResponse,batch_get_account_status_response +BatchGetAggregateResourceConfigRequest,batch_get_aggregate_resource_config_request +BatchGetAggregateResourceConfigResponse,batch_get_aggregate_resource_config_response +BatchGetApplicationRevisionsInput,batch_get_application_revisions_input +BatchGetApplicationRevisionsOutput,batch_get_application_revisions_output +BatchGetApplicationsInput,batch_get_applications_input +BatchGetApplicationsOutput,batch_get_applications_output +BatchGetAssetPropertyAggregatesEntry,batch_get_asset_property_aggregates_entry +BatchGetAssetPropertyAggregatesErrorEntry,batch_get_asset_property_aggregates_error_entry +BatchGetAssetPropertyAggregatesErrorInfo,batch_get_asset_property_aggregates_error_info +BatchGetAssetPropertyAggregatesRequest,batch_get_asset_property_aggregates_request +BatchGetAssetPropertyAggregatesResponse,batch_get_asset_property_aggregates_response +BatchGetAssetPropertyAggregatesSkippedEntry,batch_get_asset_property_aggregates_skipped_entry +BatchGetAssetPropertyAggregatesSuccessEntry,batch_get_asset_property_aggregates_success_entry +BatchGetAssetPropertyValueEntry,batch_get_asset_property_value_entry +BatchGetAssetPropertyValueErrorEntry,batch_get_asset_property_value_error_entry +BatchGetAssetPropertyValueErrorInfo,batch_get_asset_property_value_error_info +BatchGetAssetPropertyValueHistoryEntry,batch_get_asset_property_value_history_entry +BatchGetAssetPropertyValueHistoryErrorEntry,batch_get_asset_property_value_history_error_entry +BatchGetAssetPropertyValueHistoryErrorInfo,batch_get_asset_property_value_history_error_info +BatchGetAssetPropertyValueHistoryRequest,batch_get_asset_property_value_history_request +BatchGetAssetPropertyValueHistoryResponse,batch_get_asset_property_value_history_response +BatchGetAssetPropertyValueHistorySkippedEntry,batch_get_asset_property_value_history_skipped_entry +BatchGetAssetPropertyValueHistorySuccessEntry,batch_get_asset_property_value_history_success_entry +BatchGetAssetPropertyValueRequest,batch_get_asset_property_value_request +BatchGetAssetPropertyValueResponse,batch_get_asset_property_value_response +BatchGetAssetPropertyValueSkippedEntry,batch_get_asset_property_value_skipped_entry +BatchGetAssetPropertyValueSuccessEntry,batch_get_asset_property_value_success_entry +BatchGetAutomationRulesRequest,batch_get_automation_rules_request +BatchGetAutomationRulesResponse,batch_get_automation_rules_response +BatchGetBlueprintsRequest,batch_get_blueprints_request +BatchGetBlueprintsResponse,batch_get_blueprints_response +BatchGetBuildBatchesInput,batch_get_build_batches_input +BatchGetBuildBatchesOutput,batch_get_build_batches_output +BatchGetBuildsInput,batch_get_builds_input +BatchGetBuildsOutput,batch_get_builds_output +BatchGetChannelRequest,batch_get_channel_request +BatchGetChannelResponse,batch_get_channel_response +BatchGetCodeSnippetRequest,batch_get_code_snippet_request +BatchGetCodeSnippetResponse,batch_get_code_snippet_response +BatchGetCollaborationAnalysisTemplateError,batch_get_collaboration_analysis_template_error +BatchGetCollaborationAnalysisTemplateInput,batch_get_collaboration_analysis_template_input +BatchGetCollaborationAnalysisTemplateOutput,batch_get_collaboration_analysis_template_output +BatchGetCollectionRequest,batch_get_collection_request +BatchGetCollectionResponse,batch_get_collection_response +BatchGetCommitsError,batch_get_commits_error +BatchGetCommitsInput,batch_get_commits_input +BatchGetCommitsOutput,batch_get_commits_output +BatchGetCrawlersRequest,batch_get_crawlers_request +BatchGetCrawlersResponse,batch_get_crawlers_response +BatchGetCustomDataIdentifierSummary,batch_get_custom_data_identifier_summary +BatchGetCustomDataIdentifiersRequest,batch_get_custom_data_identifiers_request +BatchGetCustomDataIdentifiersResponse,batch_get_custom_data_identifiers_response +BatchGetCustomEntityTypesRequest,batch_get_custom_entity_types_request +BatchGetCustomEntityTypesResponse,batch_get_custom_entity_types_response +BatchGetDataQualityResultRequest,batch_get_data_quality_result_request +BatchGetDataQualityResultResponse,batch_get_data_quality_result_response +BatchGetDeploymentGroupsInput,batch_get_deployment_groups_input +BatchGetDeploymentGroupsOutput,batch_get_deployment_groups_output +BatchGetDeploymentInstancesInput,batch_get_deployment_instances_input +BatchGetDeploymentInstancesOutput,batch_get_deployment_instances_output +BatchGetDeploymentTargetsInput,batch_get_deployment_targets_input +BatchGetDeploymentTargetsOutput,batch_get_deployment_targets_output +BatchGetDeploymentsInput,batch_get_deployments_input +BatchGetDeploymentsOutput,batch_get_deployments_output +BatchGetDevEndpointsRequest,batch_get_dev_endpoints_request +BatchGetDevEndpointsResponse,batch_get_dev_endpoints_response +BatchGetDevicePositionError,batch_get_device_position_error +BatchGetDevicePositionRequest,batch_get_device_position_request +BatchGetDevicePositionResponse,batch_get_device_position_response +BatchGetDocumentStatusRequest,batch_get_document_status_request +BatchGetDocumentStatusResponse,batch_get_document_status_response +BatchGetDocumentStatusResponseError,batch_get_document_status_response_error +BatchGetFieldRequest,batch_get_field_request +BatchGetFieldResponse,batch_get_field_response +BatchGetFindingDetailsRequest,batch_get_finding_details_request +BatchGetFindingDetailsResponse,batch_get_finding_details_response +BatchGetFindingsError,batch_get_findings_error +BatchGetFindingsRequest,batch_get_findings_request +BatchGetFindingsResponse,batch_get_findings_response +BatchGetFrameMetricDataRequest,batch_get_frame_metric_data_request +BatchGetFrameMetricDataResponse,batch_get_frame_metric_data_response +BatchGetFreeTrialInfoRequest,batch_get_free_trial_info_request +BatchGetFreeTrialInfoResponse,batch_get_free_trial_info_response +BatchGetGraphMemberDatasourcesRequest,batch_get_graph_member_datasources_request +BatchGetGraphMemberDatasourcesResponse,batch_get_graph_member_datasources_response +BatchGetImageRequest,batch_get_image_request +BatchGetImageResponse,batch_get_image_response +BatchGetItemInput,batch_get_item_input +BatchGetItemOutput,batch_get_item_output +BatchGetJobsRequest,batch_get_jobs_request +BatchGetJobsResponse,batch_get_jobs_response +BatchGetLinkAttributes,batch_get_link_attributes +BatchGetLinkAttributesResponse,batch_get_link_attributes_response +BatchGetMemberEc2DeepInspectionStatusRequest,batch_get_member_ec2_deep_inspection_status_request +BatchGetMemberEc2DeepInspectionStatusResponse,batch_get_member_ec2_deep_inspection_status_response +BatchGetMembershipDatasourcesRequest,batch_get_membership_datasources_request +BatchGetMembershipDatasourcesResponse,batch_get_membership_datasources_response +BatchGetMetricDataQuery,batch_get_metric_data_query +BatchGetMetricDataRequest,batch_get_metric_data_request +BatchGetMetricDataResponse,batch_get_metric_data_response +BatchGetNamedQueryInput,batch_get_named_query_input +BatchGetNamedQueryOutput,batch_get_named_query_output +BatchGetObjectAttributes,batch_get_object_attributes +BatchGetObjectAttributesResponse,batch_get_object_attributes_response +BatchGetObjectInformation,batch_get_object_information +BatchGetObjectInformationResponse,batch_get_object_information_response +BatchGetOnPremisesInstancesInput,batch_get_on_premises_instances_input +BatchGetOnPremisesInstancesOutput,batch_get_on_premises_instances_output +BatchGetPartitionRequest,batch_get_partition_request +BatchGetPartitionResponse,batch_get_partition_response +BatchGetPreparedStatementInput,batch_get_prepared_statement_input +BatchGetPreparedStatementOutput,batch_get_prepared_statement_output +BatchGetProjectsInput,batch_get_projects_input +BatchGetProjectsOutput,batch_get_projects_output +BatchGetQueryExecutionInput,batch_get_query_execution_input +BatchGetQueryExecutionOutput,batch_get_query_execution_output +BatchGetRecordError,batch_get_record_error +BatchGetRecordIdentifier,batch_get_record_identifier +BatchGetRecordRequest,batch_get_record_request +BatchGetRecordResponse,batch_get_record_response +BatchGetRecordResultDetail,batch_get_record_result_detail +BatchGetReportGroupsInput,batch_get_report_groups_input +BatchGetReportGroupsOutput,batch_get_report_groups_output +BatchGetReportsInput,batch_get_reports_input +BatchGetReportsOutput,batch_get_reports_output +BatchGetRepositoriesInput,batch_get_repositories_input +BatchGetRepositoriesOutput,batch_get_repositories_output +BatchGetRepositoryScanningConfigurationRequest,batch_get_repository_scanning_configuration_request +BatchGetRepositoryScanningConfigurationResponse,batch_get_repository_scanning_configuration_response +BatchGetResourceConfigRequest,batch_get_resource_config_request +BatchGetResourceConfigResponse,batch_get_resource_config_response +BatchGetRumMetricDefinitionsRequest,batch_get_rum_metric_definitions_request +BatchGetRumMetricDefinitionsResponse,batch_get_rum_metric_definitions_response +BatchGetSchemaError,batch_get_schema_error +BatchGetSchemaInput,batch_get_schema_input +BatchGetSchemaOutput,batch_get_schema_output +BatchGetSecurityControlsRequest,batch_get_security_controls_request +BatchGetSecurityControlsResponse,batch_get_security_controls_response +BatchGetStandardsControlAssociationsRequest,batch_get_standards_control_associations_request +BatchGetStandardsControlAssociationsResponse,batch_get_standards_control_associations_response +BatchGetStreamKeyRequest,batch_get_stream_key_request +BatchGetStreamKeyResponse,batch_get_stream_key_response +BatchGetTokenBalanceErrorItem,batch_get_token_balance_error_item +BatchGetTokenBalanceInput,batch_get_token_balance_input +BatchGetTokenBalanceInputItem,batch_get_token_balance_input_item +BatchGetTokenBalanceOutput,batch_get_token_balance_output +BatchGetTokenBalanceOutputItem,batch_get_token_balance_output_item +BatchGetTracesRequest,batch_get_traces_request +BatchGetTracesResult,batch_get_traces_result +BatchGetTriggersRequest,batch_get_triggers_request +BatchGetTriggersResponse,batch_get_triggers_response +BatchGetUserAccessTasksRequest,batch_get_user_access_tasks_request +BatchGetUserAccessTasksResponse,batch_get_user_access_tasks_response +BatchGetVariableError,batch_get_variable_error +BatchGetVariableRequest,batch_get_variable_request +BatchGetVariableResult,batch_get_variable_result +BatchGetViewError,batch_get_view_error +BatchGetViewInput,batch_get_view_input +BatchGetViewOutput,batch_get_view_output +BatchGetVpcEndpointRequest,batch_get_vpc_endpoint_request +BatchGetVpcEndpointResponse,batch_get_vpc_endpoint_response +BatchGetWorkflowsRequest,batch_get_workflows_request +BatchGetWorkflowsResponse,batch_get_workflows_response +BatchGrantPermissionsRequest,batch_grant_permissions_request +BatchGrantPermissionsResponse,batch_grant_permissions_response +BatchId,batch_id +BatchImport,batch_import +BatchImportEvidenceToAssessmentControlError,batch_import_evidence_to_assessment_control_error +BatchImportEvidenceToAssessmentControlRequest,batch_import_evidence_to_assessment_control_request +BatchImportEvidenceToAssessmentControlResponse,batch_import_evidence_to_assessment_control_response +BatchImportFindingsRequest,batch_import_findings_request +BatchImportFindingsResponse,batch_import_findings_response +BatchImportMetaDataOnCreate,batch_import_meta_data_on_create +BatchInferenceJob,batch_inference_job +BatchInferenceJobConfig,batch_inference_job_config +BatchInferenceJobInput,batch_inference_job_input +BatchInferenceJobOutput,batch_inference_job_output +BatchInferenceJobSummary,batch_inference_job_summary +BatchItem,batch_item +BatchItemError,batch_item_error +BatchJobDependency,batch_job_dependency +BatchJobExecutionSummary,batch_job_execution_summary +BatchJobParameters,batch_job_parameters +BatchLimitExceededException,batch_limit_exceeded_exception +BatchListAttachedIndices,batch_list_attached_indices +BatchListAttachedIndicesResponse,batch_list_attached_indices_response +BatchListIncomingTypedLinks,batch_list_incoming_typed_links +BatchListIncomingTypedLinksResponse,batch_list_incoming_typed_links_response +BatchListIndex,batch_list_index +BatchListIndexResponse,batch_list_index_response +BatchListObjectAttributes,batch_list_object_attributes +BatchListObjectAttributesResponse,batch_list_object_attributes_response +BatchListObjectChildren,batch_list_object_children +BatchListObjectChildrenResponse,batch_list_object_children_response +BatchListObjectParentPaths,batch_list_object_parent_paths +BatchListObjectParentPathsResponse,batch_list_object_parent_paths_response +BatchListObjectParents,batch_list_object_parents +BatchListObjectParentsResponse,batch_list_object_parents_response +BatchListObjectPolicies,batch_list_object_policies +BatchListObjectPoliciesResponse,batch_list_object_policies_response +BatchListOutgoingTypedLinks,batch_list_outgoing_typed_links +BatchListOutgoingTypedLinksResponse,batch_list_outgoing_typed_links_response +BatchListPolicyAttachments,batch_list_policy_attachments +BatchListPolicyAttachmentsResponse,batch_list_policy_attachments_response +BatchLoadProgressReport,batch_load_progress_report +BatchLoadTask,batch_load_task +BatchLoadTaskDescription,batch_load_task_description +BatchLoadTasks,batch_load_tasks +BatchLookupPolicy,batch_lookup_policy +BatchLookupPolicyResponse,batch_lookup_policy_response +BatchMeterUsageRequest,batch_meter_usage_request +BatchMeterUsageResult,batch_meter_usage_result +BatchModifyClusterSnapshotsLimitExceededFault,batch_modify_cluster_snapshots_limit_exceeded_fault +BatchModifyClusterSnapshotsMessage,batch_modify_cluster_snapshots_message +BatchModifyClusterSnapshotsOutputMessage,batch_modify_cluster_snapshots_output_message +BatchParameters,batch_parameters +BatchPermissionsFailureEntry,batch_permissions_failure_entry +BatchPermissionsRequestEntry,batch_permissions_request_entry +BatchPolicy,batch_policy +BatchPrediction,batch_prediction +BatchPredictionDataSourceId,batch_prediction_data_source_id +BatchPredictionId,batch_prediction_id +BatchPredictionName,batch_prediction_name +BatchPutAssetPropertyError,batch_put_asset_property_error +BatchPutAssetPropertyErrorEntry,batch_put_asset_property_error_entry +BatchPutAssetPropertyValueRequest,batch_put_asset_property_value_request +BatchPutAssetPropertyValueResponse,batch_put_asset_property_value_response +BatchPutDocumentRequest,batch_put_document_request +BatchPutDocumentResponse,batch_put_document_response +BatchPutDocumentResponseFailedDocument,batch_put_document_response_failed_document +BatchPutFieldOptionsRequest,batch_put_field_options_request +BatchPutFieldOptionsResponse,batch_put_field_options_response +BatchPutGeofenceError,batch_put_geofence_error +BatchPutGeofenceRequest,batch_put_geofence_request +BatchPutGeofenceRequestEntry,batch_put_geofence_request_entry +BatchPutGeofenceResponse,batch_put_geofence_response +BatchPutGeofenceSuccess,batch_put_geofence_success +BatchPutMessageErrorEntries,batch_put_message_error_entries +BatchPutMessageErrorEntry,batch_put_message_error_entry +BatchPutMessageRequest,batch_put_message_request +BatchPutMessageResponse,batch_put_message_response +BatchPutMetricsError,batch_put_metrics_error +BatchPutMetricsRequest,batch_put_metrics_request +BatchPutMetricsResponse,batch_put_metrics_response +BatchPutPropertyError,batch_put_property_error +BatchPutPropertyErrorEntry,batch_put_property_error_entry +BatchPutPropertyValuesRequest,batch_put_property_values_request +BatchPutPropertyValuesResponse,batch_put_property_values_response +BatchPutScheduledUpdateGroupActionAnswer,batch_put_scheduled_update_group_action_answer +BatchPutScheduledUpdateGroupActionType,batch_put_scheduled_update_group_action_type +BatchReadException,batch_read_exception +BatchReadOperation,batch_read_operation +BatchReadOperationResponse,batch_read_operation_response +BatchReadRequest,batch_read_request +BatchReadResponse,batch_read_response +BatchReadSuccessfulResponse,batch_read_successful_response +BatchRecordsEndTime,batch_records_end_time +BatchRecordsStartTime,batch_records_start_time +BatchReferenceName,batch_reference_name +BatchRemoveFacetFromObject,batch_remove_facet_from_object +BatchRequestTooLongException,batch_request_too_long_exception +BatchResetAlarmRequest,batch_reset_alarm_request +BatchResetAlarmResponse,batch_reset_alarm_response +BatchResourceRequirement,batch_resource_requirement +BatchRestrictions,batch_restrictions +BatchResultErrorEntry,batch_result_error_entry +BatchRetryStrategy,batch_retry_strategy +BatchRevokePermissionsRequest,batch_revoke_permissions_request +BatchRevokePermissionsResponse,batch_revoke_permissions_response +BatchScheduleActionCreateRequest,batch_schedule_action_create_request +BatchScheduleActionCreateResult,batch_schedule_action_create_result +BatchScheduleActionDeleteRequest,batch_schedule_action_delete_request +BatchScheduleActionDeleteResult,batch_schedule_action_delete_result +BatchSegmentJob,batch_segment_job +BatchSegmentJobInput,batch_segment_job_input +BatchSegmentJobOutput,batch_segment_job_output +BatchSegmentJobSummary,batch_segment_job_summary +BatchSize,batch_size +BatchSizeLimitExceededException,batch_size_limit_exceeded_exception +BatchSnoozeAlarmRequest,batch_snooze_alarm_request +BatchSnoozeAlarmResponse,batch_snooze_alarm_response +BatchStartRecommendationsErrorEntry,batch_start_recommendations_error_entry +BatchStartRecommendationsRequest,batch_start_recommendations_request +BatchStartRecommendationsResponse,batch_start_recommendations_response +BatchStartRequest,batch_start_request +BatchStartResponse,batch_start_response +BatchStartViewerSessionRevocationError,batch_start_viewer_session_revocation_error +BatchStartViewerSessionRevocationRequest,batch_start_viewer_session_revocation_request +BatchStartViewerSessionRevocationResponse,batch_start_viewer_session_revocation_response +BatchStartViewerSessionRevocationViewerSession,batch_start_viewer_session_revocation_viewer_session +BatchStatementError,batch_statement_error +BatchStatementRequest,batch_statement_request +BatchStatementResponse,batch_statement_response +BatchStopJobRunError,batch_stop_job_run_error +BatchStopJobRunRequest,batch_stop_job_run_request +BatchStopJobRunResponse,batch_stop_job_run_response +BatchStopJobRunSuccessfulSubmission,batch_stop_job_run_successful_submission +BatchStopRequest,batch_stop_request +BatchStopResponse,batch_stop_response +BatchStopUpdateActionMessage,batch_stop_update_action_message +BatchStrategy,batch_strategy +BatchSuccessfulResultModel,batch_successful_result_model +BatchSuspendUserRequest,batch_suspend_user_request +BatchSuspendUserResponse,batch_suspend_user_response +BatchTooLarge,batch_too_large +BatchTransformInput,batch_transform_input +BatchUnsuspendUserRequest,batch_unsuspend_user_request +BatchUnsuspendUserResponse,batch_unsuspend_user_response +BatchUpdateAttendeeCapabilitiesExceptRequest,batch_update_attendee_capabilities_except_request +BatchUpdateAutomationRulesRequest,batch_update_automation_rules_request +BatchUpdateAutomationRulesResponse,batch_update_automation_rules_response +BatchUpdateClusterRequest,batch_update_cluster_request +BatchUpdateClusterResponse,batch_update_cluster_response +BatchUpdateCustomVocabularyItemRequest,batch_update_custom_vocabulary_item_request +BatchUpdateCustomVocabularyItemResponse,batch_update_custom_vocabulary_item_response +BatchUpdateDetectorErrorEntry,batch_update_detector_error_entry +BatchUpdateDetectorRequest,batch_update_detector_request +BatchUpdateDetectorResponse,batch_update_detector_response +BatchUpdateDevicePositionError,batch_update_device_position_error +BatchUpdateDevicePositionRequest,batch_update_device_position_request +BatchUpdateDevicePositionResponse,batch_update_device_position_response +BatchUpdateFindingsRequest,batch_update_findings_request +BatchUpdateFindingsResponse,batch_update_findings_response +BatchUpdateFindingsUnprocessedFinding,batch_update_findings_unprocessed_finding +BatchUpdateLinkAttributes,batch_update_link_attributes +BatchUpdateMemberEc2DeepInspectionStatusRequest,batch_update_member_ec2_deep_inspection_status_request +BatchUpdateMemberEc2DeepInspectionStatusResponse,batch_update_member_ec2_deep_inspection_status_response +BatchUpdateObjectAttributes,batch_update_object_attributes +BatchUpdateObjectAttributesResponse,batch_update_object_attributes_response +BatchUpdatePartitionFailureEntry,batch_update_partition_failure_entry +BatchUpdatePartitionRequest,batch_update_partition_request +BatchUpdatePartitionRequestEntry,batch_update_partition_request_entry +BatchUpdatePartitionResponse,batch_update_partition_response +BatchUpdatePhoneNumberRequest,batch_update_phone_number_request +BatchUpdatePhoneNumberResponse,batch_update_phone_number_response +BatchUpdateRecommendationStatusFailedEntry,batch_update_recommendation_status_failed_entry +BatchUpdateRecommendationStatusRequest,batch_update_recommendation_status_request +BatchUpdateRecommendationStatusResponse,batch_update_recommendation_status_response +BatchUpdateRecommendationStatusSuccessfulEntry,batch_update_recommendation_status_successful_entry +BatchUpdateRuleRequest,batch_update_rule_request +BatchUpdateRuleResponse,batch_update_rule_response +BatchUpdateScheduleRequest,batch_update_schedule_request +BatchUpdateScheduleResponse,batch_update_schedule_response +BatchUpdateStandardsControlAssociationsRequest,batch_update_standards_control_associations_request +BatchUpdateStandardsControlAssociationsResponse,batch_update_standards_control_associations_response +BatchUpdateTableRowsRequest,batch_update_table_rows_request +BatchUpdateTableRowsResult,batch_update_table_rows_result +BatchUpdateUserRequest,batch_update_user_request +BatchUpdateUserResponse,batch_update_user_response +BatchUpdateVehicleRequest,batch_update_vehicle_request +BatchUpdateVehicleResponse,batch_update_vehicle_response +BatchUpsertTableRowsRequest,batch_upsert_table_rows_request +BatchUpsertTableRowsResult,batch_upsert_table_rows_result +BatchWindow,batch_window +BatchWriteException,batch_write_exception +BatchWriteItemInput,batch_write_item_input +BatchWriteItemOutput,batch_write_item_output +BatchWriteOperation,batch_write_operation +BatchWriteOperationResponse,batch_write_operation_response +BatchWriteRequest,batch_write_request +BatchWriteResponse,batch_write_response +Batches,batches +BatteryLevel,battery_level +BccAddresses,bcc_addresses +Bcch,bcch +BcpPacketSize,bcp_packet_size +Beaconing,beaconing +Beard,beard +BearerToken,bearer_token +Before,before +BeforeCommitIdAndAfterCommitIdAreSameException,before_commit_id_and_after_commit_id_are_same_exception +BeforeCreationDate,before_creation_date +Begin,begin +BeginMarker,begin_marker +BeginOffset,begin_offset +BeginOffsetChar,begin_offset_char +BeginOffsetMillis,begin_offset_millis +BeginTransactionRequest,begin_transaction_request +BeginTransactionResponse,begin_transaction_response +Behavior,behavior +BehaviorCriteria,behavior_criteria +BehaviorModelTrainingSummary,behavior_model_training_summary +BehaviorOnMXFailure,behavior_on_mx_failure +BehaviorOnMxFailure,behavior_on_mx_failure +BehaviorType,behavior_type +Beneficiary,beneficiary +BenefitsConsidered,benefits_considered +BerkshelfVersion,berkshelf_version +BestCandidate,best_candidate +BestObjectiveNotImproving,best_objective_not_improving +BestPractice,best_practice +BestPractices,best_practices +BestTrainingJob,best_training_job +BgpAsn,bgp_asn +BgpConfigurations,bgp_configurations +BgpOptions,bgp_options +BgpStatus,bgp_status +Bias,bias +BiasPosition,bias_position +BidPrice,bid_price +BidPriceAsPercentageOfOnDemandPrice,bid_price_as_percentage_of_on_demand_price +BillDate,bill_date +BillExpirationException,bill_expiration_exception +BillableTimeInSeconds,billable_time_in_seconds +BillableTrainingTimeInSeconds,billable_training_time_in_seconds +BilledSizeBytes,billed_size_bytes +BillingAddress,billing_address +BillingDetails,billing_details +BillingEntity,billing_entity +BillingGroupArn,billing_group_arn +BillingGroupArns,billing_group_arns +BillingGroupCostReportElement,billing_group_cost_report_element +BillingGroupCostReports,billing_group_cost_reports +BillingGroupListElement,billing_group_list_element +BillingGroupMetadata,billing_group_metadata +BillingGroupProperties,billing_group_properties +BillingGroups,billing_groups +BillingMode,billing_mode +BillingModeOverride,billing_mode_override +BillingModeSummary,billing_mode_summary +BillingPeriod,billing_period +BillingPeriodRange,billing_period_range +BillingProducts,billing_products +BillingRecord,billing_record +BillingRecords,billing_records +BillingSubscriptionId,billing_subscription_id +BillingTagsSource,billing_tags_source +BillingToken,billing_token +BillingViewArn,billing_view_arn +BinCount,bin_count +BinCountLimit,bin_count_limit +BinCountOptions,bin_count_options +BinOptions,bin_options +BinWidth,bin_width +BinWidthOptions,bin_width_options +BinaryColumnStatisticsData,binary_column_statistics_data +BinaryFile,binary_file +BinaryListValues,binary_list_values +BinaryMediaTypes,binary_media_types +BinaryPrefixLocation,binary_prefix_location +BinaryValue,binary_value +BirthDate,birth_date +BisectBatchOnFunctionError,bisect_batch_on_function_error +BitDepth,bit_depth +BitOrder,bit_order +BitRate,bit_rate +Bitbucket,bitbucket +Bitrate,bitrate +BitrateClass,bitrate_class +BitsPerSecond,bits_per_second +BitstreamMode,bitstream_mode +BlackDetectThreshold,black_detect_threshold +BlackFrame,black_frame +BlackFrameMsec,black_frame_msec +Blackhole,blackhole +Blacklist,blacklist +BlacklistEntry,blacklist_entry +BlacklistItemNames,blacklist_item_names +BlacklistReport,blacklist_report +BlackoutSlate,blackout_slate +BlackoutSlateImage,blackout_slate_image +BlankCellFormat,blank_cell_format +Blob,blob +BlobAttributeValue,blob_attribute_value +BlobIdDoesNotExistException,blob_id_does_not_exist_exception +BlobIdRequiredException,blob_id_required_exception +BlobMetadata,blob_metadata +BlobType,blob_type +Block,block +BlockAction,block_action +BlockAddress,block_address +BlockData,block_data +BlockDeviceMapping,block_device_mapping +BlockDeviceMappingSet,block_device_mapping_set +BlockDeviceMappings,block_device_mappings +BlockDurationMinutes,block_duration_minutes +BlockEmail,block_email +BlockId,block_id +BlockIndex,block_index +BlockListSummaryItems,block_list_summary_items +BlockOverrideDnsType,block_override_dns_type +BlockOverrideDomain,block_override_domain +BlockOverrideTtl,block_override_ttl +BlockPublicAccess,block_public_access +BlockPublicAccessConfiguration,block_public_access_configuration +BlockPublicAccessConfigurationMetadata,block_public_access_configuration_metadata +BlockPublicAcls,block_public_acls +BlockPublicPolicy,block_public_policy +BlockPublicSecurityGroupRules,block_public_security_group_rules +BlockReference,block_reference +BlockReferences,block_references +BlockResponse,block_response +BlockSize,block_size +BlockSizeBytes,block_size_bytes +BlockToken,block_token +BlockType,block_type +BlockchainInstant,blockchain_instant +Blocked,blocked +BlockedException,blocked_exception +BlockedIPRangeList,blocked_ip_range_list +BlockedReason,blocked_reason +BlockerDeclaration,blocker_declaration +Blocks,blocks +BlogConfiguration,blog_configuration +BlogFieldMappings,blog_field_mappings +BloomFilterColumns,bloom_filter_columns +BloomFilterFalsePositiveProbability,bloom_filter_false_positive_probability +Blue,blue +BlueGreenDeployment,blue_green_deployment +BlueGreenDeploymentAlreadyExistsFault,blue_green_deployment_already_exists_fault +BlueGreenDeploymentConfiguration,blue_green_deployment_configuration +BlueGreenDeploymentIdentifier,blue_green_deployment_identifier +BlueGreenDeploymentName,blue_green_deployment_name +BlueGreenDeploymentNotFoundFault,blue_green_deployment_not_found_fault +BlueGreenDeploymentTask,blue_green_deployment_task +BlueGreenDeployments,blue_green_deployments +BlueGreenUpdatePolicy,blue_green_update_policy +BlueInstanceTerminationOption,blue_instance_termination_option +BluePrimaryX,blue_primary_x +BluePrimaryY,blue_primary_y +Blueprint,blueprint +BlueprintDetails,blueprint_details +BlueprintLocation,blueprint_location +BlueprintName,blueprint_name +BlueprintRun,blueprint_run +BlueprintRuns,blueprint_runs +BlueprintServiceLocation,blueprint_service_location +Blueprints,blueprints +Body,body +BodyConfig,body_config +BodyContains,body_contains +BodyOverride,body_override +BodyParameters,body_parameters +BodyParts,body_parts +BodySectionConfiguration,body_section_configuration +BodySectionContent,body_section_content +BodySections,body_sections +BonusAmount,bonus_amount +BonusPayment,bonus_payment +BonusPayments,bonus_payments +BookingOptions,booking_options +Bookmarks,bookmarks +BookmarksConfigurations,bookmarks_configurations +BooleanColumnStatisticsData,boolean_column_statistics_data +BooleanFilter,boolean_filter +BooleanValue,boolean_value +BootMode,boot_mode +Booting,booting +BootstrapActionConfig,bootstrap_action_config +BootstrapActionDetail,bootstrap_action_detail +BootstrapActions,bootstrap_actions +BootstrapBrokerString,bootstrap_broker_string +BootstrapBrokerStringPublicSaslIam,bootstrap_broker_string_public_sasl_iam +BootstrapBrokerStringPublicSaslScram,bootstrap_broker_string_public_sasl_scram +BootstrapBrokerStringPublicTls,bootstrap_broker_string_public_tls +BootstrapBrokerStringSaslIam,bootstrap_broker_string_sasl_iam +BootstrapBrokerStringSaslScram,bootstrap_broker_string_sasl_scram +BootstrapBrokerStringTls,bootstrap_broker_string_tls +BootstrapBrokerStringVpcConnectivitySaslIam,bootstrap_broker_string_vpc_connectivity_sasl_iam +BootstrapBrokerStringVpcConnectivitySaslScram,bootstrap_broker_string_vpc_connectivity_sasl_scram +BootstrapBrokerStringVpcConnectivityTls,bootstrap_broker_string_vpc_connectivity_tls +BootstrapServers,bootstrap_servers +Border,border +BorderColor,border_color +BorderRadius,border_radius +BorderStyle,border_style +BorderThickness,border_thickness +BorderVisibility,border_visibility +BorrowConfiguration,borrow_configuration +BorrowCount,borrow_count +Bot,bot +BotAliasHistoryEvent,bot_alias_history_event +BotAliasLocaleSettings,bot_alias_locale_settings +BotAliasMetadata,bot_alias_metadata +BotAliasSummary,bot_alias_summary +BotAliasTestExecutionTarget,bot_alias_test_execution_target +BotAliases,bot_aliases +BotChannelAssociation,bot_channel_association +BotEmail,bot_email +BotExportSpecification,bot_export_specification +BotFilter,bot_filter +BotId,bot_id +BotImportSpecification,bot_import_specification +BotLocaleExportSpecification,bot_locale_export_specification +BotLocaleFilter,bot_locale_filter +BotLocaleHistoryEvent,bot_locale_history_event +BotLocaleImportSpecification,bot_locale_import_specification +BotLocaleSortBy,bot_locale_sort_by +BotLocaleSummary,bot_locale_summary +BotMember,bot_member +BotMetadata,bot_metadata +BotName,bot_name +BotRecommendationResultStatistics,bot_recommendation_result_statistics +BotRecommendationResults,bot_recommendation_results +BotRecommendationSummary,bot_recommendation_summary +BotSortBy,bot_sort_by +BotSummary,bot_summary +BotType,bot_type +BotVersionLocaleDetails,bot_version_locale_details +BotVersionSortBy,bot_version_sort_by +BotVersionSummary,bot_version_summary +Bots,bots +Bottom,bottom +Bounce,bounce +BounceAction,bounce_action +BounceSender,bounce_sender +BounceSenderArn,bounce_sender_arn +BounceSubType,bounce_sub_type +BounceTopic,bounce_topic +BounceType,bounce_type +BouncedRecipientInfo,bounced_recipient_info +BouncedRecipientInfoList,bounced_recipient_info_list +Bounces,bounces +BoundedFiles,bounded_files +BoundedSize,bounded_size +BoundingBox,bounding_box +BoundingBoxCount,bounding_box_count +Bounds,bounds +BoxConfiguration,box_configuration +BoxPlotAggregatedFieldWells,box_plot_aggregated_field_wells +BoxPlotChartConfiguration,box_plot_chart_configuration +BoxPlotFieldWells,box_plot_field_wells +BoxPlotOptions,box_plot_options +BoxPlotSortConfiguration,box_plot_sort_configuration +BoxPlotStyleOptions,box_plot_style_options +BoxPlotVisual,box_plot_visual +Branch,branch +BranchDiff,branch_diff +BranchDiffSourceCodeType,branch_diff_source_code_type +BranchDoesNotExistException,branch_does_not_exist_exception +BranchInfo,branch_info +BranchInterfaceId,branch_interface_id +BranchName,branch_name +BranchNameExistsException,branch_name_exists_exception +BranchNameIsTagNameException,branch_name_is_tag_name_exception +BranchNameRequiredException,branch_name_required_exception +BranchOrder,branch_order +Branches,branches +Brand,brand +BrandName,brand_name +BreachAction,breach_action +BreachThreshold,breach_threshold +BreakdownItemsLimit,breakdown_items_limit +Breakdowns,breakdowns +BreakoutCode,breakout_code +Bridge,bridge +BridgeArn,bridge_arn +BridgeFlowOutput,bridge_flow_output +BridgeFlowSource,bridge_flow_source +BridgeMessages,bridge_messages +BridgeNetworkOutput,bridge_network_output +BridgeNetworkSource,bridge_network_source +BridgeOutput,bridge_output +BridgePlacement,bridge_placement +BridgePorts,bridge_ports +BridgeSource,bridge_source +BridgeState,bridge_state +BridgeType,bridge_type +Bridges,bridges +Brightness,brightness +Broker,broker +BrokerAZDistribution,broker_az_distribution +BrokerArn,broker_arn +BrokerEBSVolumeInfo,broker_ebs_volume_info +BrokerEngineType,broker_engine_type +BrokerEngineTypes,broker_engine_types +BrokerId,broker_id +BrokerIds,broker_ids +BrokerInstance,broker_instance +BrokerInstanceOption,broker_instance_option +BrokerInstanceOptions,broker_instance_options +BrokerInstances,broker_instances +BrokerLogs,broker_logs +BrokerName,broker_name +BrokerNodeGroupInfo,broker_node_group_info +BrokerNodeInfo,broker_node_info +BrokerSoftwareInfo,broker_software_info +BrokerState,broker_state +BrokerSummaries,broker_summaries +BrokerSummary,broker_summary +BrowserSettings,browser_settings +BrowserSettingsSummary,browser_settings_summary +Bsic,bsic +Bucket,bucket +BucketARN,bucket_arn +BucketARNUpdate,bucket_arn_update +BucketAccessLogConfig,bucket_access_log_config +BucketAccessRoleArn,bucket_access_role_arn +BucketAccountId,bucket_account_id +BucketArn,bucket_arn +BucketBundle,bucket_bundle +BucketColumns,bucket_columns +BucketConfiguration,bucket_configuration +BucketCountByEffectivePermission,bucket_count_by_effective_permission +BucketCountByEncryptionType,bucket_count_by_encryption_type +BucketCountBySharedAccessType,bucket_count_by_shared_access_type +BucketCountPolicyAllowsUnencryptedObjectUploads,bucket_count_policy_allows_unencrypted_object_uploads +BucketCriteriaAdditionalProperties,bucket_criteria_additional_properties +BucketFolder,bucket_folder +BucketInfo,bucket_info +BucketKeyEnabled,bucket_key_enabled +BucketLevel,bucket_level +BucketLevelPermissions,bucket_level_permissions +BucketLifecycleConfiguration,bucket_lifecycle_configuration +BucketLoggingConfiguration,bucket_logging_configuration +BucketLoggingStatus,bucket_logging_status +BucketMetadata,bucket_metadata +BucketName,bucket_name +BucketNameFilterRequiredException,bucket_name_filter_required_exception +BucketNotFoundFault,bucket_not_found_fault +BucketNotificationConfiguration,bucket_notification_configuration +BucketOwner,bucket_owner +BucketPermissionConfiguration,bucket_permission_configuration +BucketPolicy,bucket_policy +BucketPrefix,bucket_prefix +BucketPublicAccess,bucket_public_access +BucketRegion,bucket_region +BucketServerSideEncryption,bucket_server_side_encryption +BucketSortCriteria,bucket_sort_criteria +BucketState,bucket_state +BucketStatisticsBySensitivity,bucket_statistics_by_sensitivity +BucketVersioningConfiguration,bucket_versioning_configuration +BucketWebsiteConfiguration,bucket_website_configuration +Buckets,buckets +BucketsAggregationType,buckets_aggregation_type +Budget,budget +BudgetAdjustmentPeriod,budget_adjustment_period +BudgetDetail,budget_detail +BudgetLimit,budget_limit +BudgetName,budget_name +BudgetNotificationsForAccount,budget_notifications_for_account +BudgetPerformanceHistory,budget_performance_history +BudgetType,budget_type +BudgetedAmount,budgeted_amount +BudgetedAndActualAmounts,budgeted_and_actual_amounts +BudgetedAndActualAmountsList,budgeted_and_actual_amounts_list +Budgets,budgets +BufFillPct,buf_fill_pct +BufSize,buf_size +BufferDuration,buffer_duration +BufferModel,buffer_model +BufferMsec,buffer_msec +BufferSegments,buffer_segments +BufferingHints,buffering_hints +BugzillaIds,bugzilla_ids +Build,build +BuildArn,build_arn +BuildArtifacts,build_artifacts +BuildArtifactsObjectKey,build_artifacts_object_key +BuildBatch,build_batch +BuildBatchFilter,build_batch_filter +BuildBatchPhase,build_batch_phase +BuildBotLocaleRequest,build_bot_locale_request +BuildBotLocaleResponse,build_bot_locale_response +BuildCommand,build_command +BuildConfiguration,build_configuration +BuildGroup,build_group +BuildId,build_id +BuildNotDeleted,build_not_deleted +BuildPhase,build_phase +BuildStatusConfig,build_status_config +BuildSuggestersRequest,build_suggesters_request +BuildSuggestersResponse,build_suggesters_response +BuildSummary,build_summary +Builder,builder +Builds,builds +BuiltInIntentSortBy,built_in_intent_sort_by +BuiltInIntentSummary,built_in_intent_summary +BuiltInSlotTypeSortBy,built_in_slot_type_sort_by +BuiltInSlotTypeSummary,built_in_slot_type_summary +BuiltinIntentMetadata,builtin_intent_metadata +BuiltinIntentSlot,builtin_intent_slot +BuiltinSlotTypeMetadata,builtin_slot_type_metadata +BulkDeployment,bulk_deployment +BulkDeploymentArn,bulk_deployment_arn +BulkDeploymentId,bulk_deployment_id +BulkDeploymentMetrics,bulk_deployment_metrics +BulkDeploymentResult,bulk_deployment_result +BulkDeploymentStatus,bulk_deployment_status +BulkDeployments,bulk_deployments +BulkEmailContent,bulk_email_content +BulkEmailDestination,bulk_email_destination +BulkEmailDestinationStatus,bulk_email_destination_status +BulkEmailEntries,bulk_email_entries +BulkEmailEntry,bulk_email_entry +BulkEmailEntryResult,bulk_email_entry_result +BulkEmailEntryResults,bulk_email_entry_results +BulkLoadIdNotFoundException,bulk_load_id_not_found_exception +BulkPublishCompleteTime,bulk_publish_complete_time +BulkPublishRequest,bulk_publish_request +BulkPublishResponse,bulk_publish_response +BulkPublishStartTime,bulk_publish_start_time +BulkPublishStatus,bulk_publish_status +BulletPoints,bullet_points +Bumper,bumper +Bundle,bundle +BundleDescription,bundle_description +BundleDetails,bundle_details +BundleId,bundle_id +BundleIds,bundle_ids +BundleInformation,bundle_information +BundleInstanceRequest,bundle_instance_request +BundleInstanceResult,bundle_instance_result +BundleName,bundle_name +BundleTask,bundle_task +BundleTaskError,bundle_task_error +BundleTasks,bundle_tasks +BundleType,bundle_type +Bundles,bundles +BurnInDestinationSettings,burn_in_destination_settings +BurninDestinationSettings,burnin_destination_settings +BurstablePerformance,burstable_performance +BurstablePerformanceSupported,burstable_performance_supported +BusinessCalling,business_calling +BusinessCallingSettings,business_calling_settings +BusinessEmailAddress,business_email_address +BusinessGoals,business_goals +BusinessName,business_name +BusinessPhoneNumber,business_phone_number +BusinessReport,business_report +BusinessReportContentRange,business_report_content_range +BusinessReportRecurrence,business_report_recurrence +BusinessReportS3Location,business_report_s3_location +BusinessReportSchedule,business_report_schedule +BusinessReportSchedules,business_report_schedules +Button,button +ButtonAction,button_action +ByAccountId,by_account_id +ByBackupPlanId,by_backup_plan_id +ByBackupVaultName,by_backup_vault_name +ByCompleteAfter,by_complete_after +ByCompleteBefore,by_complete_before +ByCreatedAfter,by_created_after +ByCreatedBefore,by_created_before +ByCreationAfter,by_creation_after +ByCreationBefore,by_creation_before +ByDestinationVaultArn,by_destination_vault_arn +ByParentJobId,by_parent_job_id +ByParentRecoveryPointArn,by_parent_recovery_point_arn +ByReportPlanName,by_report_plan_name +ByResourceArn,by_resource_arn +ByResourceType,by_resource_type +ByShared,by_shared +ByState,by_state +ByStatus,by_status +ByVaultType,by_vault_type +ByoipCidr,byoip_cidr +ByoipCidrEvent,byoip_cidr_event +ByoipCidrNotFoundException,byoip_cidr_not_found_exception +ByoipCidrs,byoip_cidrs +BypassGovernanceRetention,bypass_governance_retention +BypassPolicyLockoutCheck,bypass_policy_lockout_check +BypassPolicyLockoutSafetyCheck,bypass_policy_lockout_safety_check +BypassSnaplockEnterpriseRetention,bypass_snaplock_enterprise_retention +ByteMatchSet,byte_match_set +ByteMatchSetId,byte_match_set_id +ByteMatchSetSummary,byte_match_set_summary +ByteMatchSetUpdate,byte_match_set_update +ByteMatchSets,byte_match_sets +ByteMatchStatement,byte_match_statement +ByteMatchTuple,byte_match_tuple +ByteMatchTuples,byte_match_tuples +Bytes,bytes +BytesCompressed,bytes_compressed +BytesConverted,bytes_converted +BytesMetered,bytes_metered +BytesPerHour,bytes_per_hour +BytesPerSecond,bytes_per_second +BytesProcessed,bytes_processed +BytesReturned,bytes_returned +BytesScanned,bytes_scanned +BytesScannedCutoffPerQuery,bytes_scanned_cutoff_per_query +BytesTransferred,bytes_transferred +BytesWritten,bytes_written +CACertificate,ca_certificate +CACertificateDescription,ca_certificate_description +CACertificateIdentifier,ca_certificate_identifier +CAIdentifier,ca_identifier +CFNRegistryException,cfn_registry_exception +CIDRIP,cidrip +CIDRSummary,cidr_summary +CIDRs,cidrs +CNAME,cname +CNAMEAlreadyExists,cname_already_exists +CNAMEPrefix,cname_prefix +CORSConfiguration,cors_configuration +CORSRule,cors_rule +CORSRules,cors_rules +CPU,cpu +CPUUtilization,cpu_utilization +CRLSign,crl_sign +CSS,css +CSSColor,css_color +CSSVersion,css_version +CSV,csv +CSVHeader,csv_header +CSVInput,csv_input +CSVMappingParameters,csv_mapping_parameters +CSVOutput,csv_output +CUSTOM,custom +CVEIds,cve_ids +CWEMonitorEnabled,cwe_monitor_enabled +CaCertificateIdentifier,ca_certificate_identifier +CaEndpoint,ca_endpoint +CaLogs,ca_logs +CacheAllocatedInBytes,cache_allocated_in_bytes +CacheAttributes,cache_attributes +CacheBehavior,cache_behavior +CacheBehaviorPerPath,cache_behavior_per_path +CacheBehaviors,cache_behaviors +CacheCluster,cache_cluster +CacheClusterAlreadyExistsFault,cache_cluster_already_exists_fault +CacheClusterCreateTime,cache_cluster_create_time +CacheClusterEnabled,cache_cluster_enabled +CacheClusterId,cache_cluster_id +CacheClusterIds,cache_cluster_ids +CacheClusterMessage,cache_cluster_message +CacheClusterNotFoundFault,cache_cluster_not_found_fault +CacheClusterSize,cache_cluster_size +CacheClusterStatus,cache_cluster_status +CacheClusters,cache_clusters +CacheControl,cache_control +CacheDataEncrypted,cache_data_encrypted +CacheDirtyPercentage,cache_dirty_percentage +CacheEngineDescription,cache_engine_description +CacheEngineVersion,cache_engine_version +CacheEngineVersionDescription,cache_engine_version_description +CacheEngineVersionMessage,cache_engine_version_message +CacheEngineVersions,cache_engine_versions +CacheFullBehavior,cache_full_behavior +CacheHitPercentage,cache_hit_percentage +CacheHitResult,cache_hit_result +CacheLength,cache_length +CacheMissPercentage,cache_miss_percentage +CacheNode,cache_node +CacheNodeCount,cache_node_count +CacheNodeCreateTime,cache_node_create_time +CacheNodeId,cache_node_id +CacheNodeIdsToReboot,cache_node_ids_to_reboot +CacheNodeIdsToRemove,cache_node_ids_to_remove +CacheNodeStatus,cache_node_status +CacheNodeType,cache_node_type +CacheNodeTypeSpecificParameter,cache_node_type_specific_parameter +CacheNodeTypeSpecificParameters,cache_node_type_specific_parameters +CacheNodeTypeSpecificValue,cache_node_type_specific_value +CacheNodeTypeSpecificValues,cache_node_type_specific_values +CacheNodeUpdateStatus,cache_node_update_status +CacheNodes,cache_nodes +CacheParameterGroup,cache_parameter_group +CacheParameterGroupAlreadyExistsFault,cache_parameter_group_already_exists_fault +CacheParameterGroupDetails,cache_parameter_group_details +CacheParameterGroupFamily,cache_parameter_group_family +CacheParameterGroupName,cache_parameter_group_name +CacheParameterGroupNameMessage,cache_parameter_group_name_message +CacheParameterGroupNotFoundFault,cache_parameter_group_not_found_fault +CacheParameterGroupQuotaExceededFault,cache_parameter_group_quota_exceeded_fault +CacheParameterGroupStatus,cache_parameter_group_status +CacheParameterGroups,cache_parameter_groups +CacheParameterGroupsMessage,cache_parameter_groups_message +CachePeriodInMinutes,cache_period_in_minutes +CachePolicy,cache_policy +CachePolicyAlreadyExists,cache_policy_already_exists +CachePolicyConfig,cache_policy_config +CachePolicyCookiesConfig,cache_policy_cookies_config +CachePolicyHeadersConfig,cache_policy_headers_config +CachePolicyId,cache_policy_id +CachePolicyInUse,cache_policy_in_use +CachePolicyList,cache_policy_list +CachePolicyQueryStringsConfig,cache_policy_query_strings_config +CachePolicySummary,cache_policy_summary +CacheSecurityGroup,cache_security_group +CacheSecurityGroupAlreadyExistsFault,cache_security_group_already_exists_fault +CacheSecurityGroupMembership,cache_security_group_membership +CacheSecurityGroupMessage,cache_security_group_message +CacheSecurityGroupName,cache_security_group_name +CacheSecurityGroupNames,cache_security_group_names +CacheSecurityGroupNotFoundFault,cache_security_group_not_found_fault +CacheSecurityGroupQuotaExceededFault,cache_security_group_quota_exceeded_fault +CacheSecurityGroups,cache_security_groups +CacheSettings,cache_settings +CacheSize,cache_size +CacheStaleTimeoutInSeconds,cache_stale_timeout_in_seconds +CacheSubnetGroup,cache_subnet_group +CacheSubnetGroupAlreadyExistsFault,cache_subnet_group_already_exists_fault +CacheSubnetGroupDescription,cache_subnet_group_description +CacheSubnetGroupInUse,cache_subnet_group_in_use +CacheSubnetGroupMessage,cache_subnet_group_message +CacheSubnetGroupName,cache_subnet_group_name +CacheSubnetGroupNotFoundFault,cache_subnet_group_not_found_fault +CacheSubnetGroupQuotaExceededFault,cache_subnet_group_quota_exceeded_fault +CacheSubnetGroups,cache_subnet_groups +CacheSubnetQuotaExceededFault,cache_subnet_quota_exceeded_fault +CacheTTL,cache_ttl +CacheTtlInSeconds,cache_ttl_in_seconds +CacheUsedPercentage,cache_used_percentage +CachedMethods,cached_methods +CachediSCSIVolume,cachedi_scsi_volume +CachediSCSIVolumes,cachedi_scsi_volumes +CachingConfig,caching_config +CachingEnabled,caching_enabled +CalculateRouteCarModeOptions,calculate_route_car_mode_options +CalculateRouteMatrixRequest,calculate_route_matrix_request +CalculateRouteMatrixResponse,calculate_route_matrix_response +CalculateRouteMatrixSummary,calculate_route_matrix_summary +CalculateRouteRequest,calculate_route_request +CalculateRouteResponse,calculate_route_response +CalculateRouteSummary,calculate_route_summary +CalculateRouteTruckModeOptions,calculate_route_truck_mode_options +CalculatedAttributeName,calculated_attribute_name +CalculatedBaselineConstraints,calculated_baseline_constraints +CalculatedBaselineStatistics,calculated_baseline_statistics +CalculatedColumn,calculated_column +CalculatedField,calculated_field +CalculatedFieldDescription,calculated_field_description +CalculatedFieldName,calculated_field_name +CalculatedFieldSynonyms,calculated_field_synonyms +CalculatedFields,calculated_fields +CalculatedLifecycle,calculated_lifecycle +CalculatedMeasureField,calculated_measure_field +CalculatedSpend,calculated_spend +Calculation,calculation +CalculationConfiguration,calculation_configuration +CalculationExecutionId,calculation_execution_id +CalculationResult,calculation_result +CalculationStatistics,calculation_statistics +CalculationStatus,calculation_status +CalculationSummary,calculation_summary +Calculations,calculations +CalculatorArn,calculator_arn +CalculatorName,calculator_name +CalendarNames,calendar_names +CallAnalyticsEntity,call_analytics_entity +CallAnalyticsItem,call_analytics_item +CallAnalyticsJob,call_analytics_job +CallAnalyticsJobName,call_analytics_job_name +CallAnalyticsJobSettings,call_analytics_job_settings +CallAnalyticsJobStatus,call_analytics_job_status +CallAnalyticsJobSummaries,call_analytics_job_summaries +CallAnalyticsJobSummary,call_analytics_job_summary +CallAnalyticsStreamCategories,call_analytics_stream_categories +CallAnalyticsTranscriptResultStream,call_analytics_transcript_result_stream +CallAs,call_as +CallDetails,call_details +CallInstructionsMessage,call_instructions_message +CallInstructionsMessageType,call_instructions_message_type +CallLeg,call_leg +CallRateLimitExceededException,call_rate_limit_exceeded_exception +Callback,callback +CallbackId,callback_id +CallbackStepMetadata,callback_step_metadata +CallbackToken,callback_token +CallbackURLs,callback_urls +CallerArn,caller_arn +CallerId,caller_id +CallerReference,caller_reference +CallerType,caller_type +CallingCountry,calling_country +CallingName,calling_name +CallingNameStatus,calling_name_status +CallingNameUpdatedTimestamp,calling_name_updated_timestamp +CallingRegions,calling_regions +Campaign,campaign +CampaignConfig,campaign_config +CampaignCustomMessage,campaign_custom_message +CampaignDateRangeKpiResponse,campaign_date_range_kpi_response +CampaignEmailMessage,campaign_email_message +CampaignEventFilter,campaign_event_filter +CampaignFilters,campaign_filters +CampaignHook,campaign_hook +CampaignId,campaign_id +CampaignInAppMessage,campaign_in_app_message +CampaignLimits,campaign_limits +CampaignResponse,campaign_response +CampaignSmsMessage,campaign_sms_message +CampaignState,campaign_state +CampaignStatus,campaign_status +CampaignSummary,campaign_summary +CampaignUpdateSummary,campaign_update_summary +CampaignsResponse,campaigns_response +CanDbcDefinition,can_dbc_definition +CanInterface,can_interface +CanSignal,can_signal +Canaries,canaries +CanariesLastRun,canaries_last_run +Canary,canary +CanaryCodeInput,canary_code_input +CanaryCodeOutput,canary_code_output +CanaryLastRun,canary_last_run +CanaryName,canary_name +CanaryRun,canary_run +CanaryRunConfigInput,canary_run_config_input +CanaryRunConfigOutput,canary_run_config_output +CanaryRunStatus,canary_run_status +CanaryRunTimeline,canary_run_timeline +CanaryRuns,canary_runs +CanaryScheduleInput,canary_schedule_input +CanaryScheduleOutput,canary_schedule_output +CanarySettings,canary_settings +CanarySize,canary_size +CanaryStatus,canary_status +CanaryTimeline,canary_timeline +CancelAnnotationImportRequest,cancel_annotation_import_request +CancelArchivalInput,cancel_archival_input +CancelArchivalOutput,cancel_archival_output +CancelAuditMitigationActionsTaskRequest,cancel_audit_mitigation_actions_task_request +CancelAuditTaskRequest,cancel_audit_task_request +CancelBatchImportJobRequest,cancel_batch_import_job_request +CancelBatchJobExecutionRequest,cancel_batch_job_execution_request +CancelBatchPredictionJobRequest,cancel_batch_prediction_job_request +CancelBundleTaskRequest,cancel_bundle_task_request +CancelBundleTaskResult,cancel_bundle_task_result +CancelCapacityReservationFleetError,cancel_capacity_reservation_fleet_error +CancelCapacityReservationFleetsRequest,cancel_capacity_reservation_fleets_request +CancelCapacityReservationFleetsResult,cancel_capacity_reservation_fleets_result +CancelCapacityReservationInput,cancel_capacity_reservation_input +CancelCapacityReservationRequest,cancel_capacity_reservation_request +CancelCapacityReservationResult,cancel_capacity_reservation_result +CancelCertificateTransferRequest,cancel_certificate_transfer_request +CancelChangeSetRequest,cancel_change_set_request +CancelChangeSetResponse,cancel_change_set_response +CancelClusterRequest,cancel_cluster_request +CancelCommandRequest,cancel_command_request +CancelComponentDeploymentInput,cancel_component_deployment_input +CancelComponentDeploymentOutput,cancel_component_deployment_output +CancelContactRequest,cancel_contact_request +CancelConversionRequest,cancel_conversion_request +CancelDataQualityRuleRecommendationRunRequest,cancel_data_quality_rule_recommendation_run_request +CancelDataQualityRulesetEvaluationRunRequest,cancel_data_quality_ruleset_evaluation_run_request +CancelDataRepositoryTaskRequest,cancel_data_repository_task_request +CancelDataRepositoryTaskResponse,cancel_data_repository_task_response +CancelDeploymentJobRequest,cancel_deployment_job_request +CancelDeploymentRequest,cancel_deployment_request +CancelDeploymentResponse,cancel_deployment_response +CancelDescription,cancel_description +CancelDetectMitigationActionsTaskRequest,cancel_detect_mitigation_actions_task_request +CancelDomainTransferToAnotherAwsAccountRequest,cancel_domain_transfer_to_another_aws_account_request +CancelDomainTransferToAnotherAwsAccountResponse,cancel_domain_transfer_to_another_aws_account_response +CancelElasticsearchServiceSoftwareUpdateRequest,cancel_elasticsearch_service_software_update_request +CancelElasticsearchServiceSoftwareUpdateResponse,cancel_elasticsearch_service_software_update_response +CancelEnvironmentDeploymentInput,cancel_environment_deployment_input +CancelEnvironmentDeploymentOutput,cancel_environment_deployment_output +CancelExportJobRequest,cancel_export_job_request +CancelExportTaskMessage,cancel_export_task_message +CancelExportTaskRequest,cancel_export_task_request +CancelFindingsReportRequest,cancel_findings_report_request +CancelFindingsReportResponse,cancel_findings_report_response +CancelFlowExecutionsRequest,cancel_flow_executions_request +CancelFlowExecutionsResponse,cancel_flow_executions_response +CancelGremlinQueryInput,cancel_gremlin_query_input +CancelGremlinQueryOutput,cancel_gremlin_query_output +CancelHandshakeRequest,cancel_handshake_request +CancelHandshakeResponse,cancel_handshake_response +CancelImageCreationRequest,cancel_image_creation_request +CancelImageCreationResponse,cancel_image_creation_response +CancelImageLaunchPermissionRequest,cancel_image_launch_permission_request +CancelImageLaunchPermissionResult,cancel_image_launch_permission_result +CancelImportTaskRequest,cancel_import_task_request +CancelImportTaskResult,cancel_import_task_result +CancelIngestionRequest,cancel_ingestion_request +CancelIngestionResponse,cancel_ingestion_response +CancelInputDeviceTransferRequest,cancel_input_device_transfer_request +CancelInstanceRefreshAnswer,cancel_instance_refresh_answer +CancelInstanceRefreshType,cancel_instance_refresh_type +CancelJobExecutionRequest,cancel_job_execution_request +CancelJobRequest,cancel_job_request +CancelJobResponse,cancel_job_response +CancelJobRunRequest,cancel_job_run_request +CancelJobRunResponse,cancel_job_run_response +CancelJournalKinesisStreamRequest,cancel_journal_kinesis_stream_request +CancelJournalKinesisStreamResponse,cancel_journal_kinesis_stream_response +CancelKeyDeletionRequest,cancel_key_deletion_request +CancelKeyDeletionResponse,cancel_key_deletion_response +CancelLegalHoldInput,cancel_legal_hold_input +CancelLoaderJobInput,cancel_loader_job_input +CancelLoaderJobOutput,cancel_loader_job_output +CancelMLDataProcessingJobInput,cancel_ml_data_processing_job_input +CancelMLDataProcessingJobOutput,cancel_ml_data_processing_job_output +CancelMLModelTrainingJobInput,cancel_ml_model_training_job_input +CancelMLModelTrainingJobOutput,cancel_ml_model_training_job_output +CancelMLModelTransformJobInput,cancel_ml_model_transform_job_input +CancelMLModelTransformJobOutput,cancel_ml_model_transform_job_output +CancelMLTaskRunRequest,cancel_ml_task_run_request +CancelMLTaskRunResponse,cancel_ml_task_run_response +CancelMailboxExportJobRequest,cancel_mailbox_export_job_request +CancelMaintenanceWindowExecutionRequest,cancel_maintenance_window_execution_request +CancelMaintenanceWindowExecutionResult,cancel_maintenance_window_execution_result +CancelMessageMoveTaskRequest,cancel_message_move_task_request +CancelMessageMoveTaskResult,cancel_message_move_task_result +CancelMulticastGroupSessionRequest,cancel_multicast_group_session_request +CancelOpenCypherQueryInput,cancel_open_cypher_query_input +CancelOpenCypherQueryOutput,cancel_open_cypher_query_output +CancelOrderInput,cancel_order_input +CancelPipelineReprocessingRequest,cancel_pipeline_reprocessing_request +CancelPolicyGenerationRequest,cancel_policy_generation_request +CancelQuantumTaskRequest,cancel_quantum_task_request +CancelQuantumTaskResponse,cancel_quantum_task_response +CancelQueryRequest,cancel_query_request +CancelQueryResponse,cancel_query_response +CancelReason,cancel_reason +CancelReplayRequest,cancel_replay_request +CancelReplayResponse,cancel_replay_response +CancelReplicationTaskAssessmentRunMessage,cancel_replication_task_assessment_run_message +CancelReplicationTaskAssessmentRunResponse,cancel_replication_task_assessment_run_response +CancelReservedInstancesListingRequest,cancel_reserved_instances_listing_request +CancelReservedInstancesListingResult,cancel_reserved_instances_listing_result +CancelResizeMessage,cancel_resize_message +CancelResourceRequestInput,cancel_resource_request_input +CancelResourceRequestOutput,cancel_resource_request_output +CancelRetrievalInput,cancel_retrieval_input +CancelRetrievalOutput,cancel_retrieval_output +CancelRotateSecretRequest,cancel_rotate_secret_request +CancelRotateSecretResponse,cancel_rotate_secret_response +CancelRunRequest,cancel_run_request +CancelSbomExportRequest,cancel_sbom_export_request +CancelSbomExportResponse,cancel_sbom_export_response +CancelSchemaExtensionRequest,cancel_schema_extension_request +CancelServiceInstanceDeploymentInput,cancel_service_instance_deployment_input +CancelServiceInstanceDeploymentOutput,cancel_service_instance_deployment_output +CancelServicePipelineDeploymentInput,cancel_service_pipeline_deployment_input +CancelServicePipelineDeploymentOutput,cancel_service_pipeline_deployment_output +CancelServiceSoftwareUpdateRequest,cancel_service_software_update_request +CancelServiceSoftwareUpdateResponse,cancel_service_software_update_response +CancelSigningProfileRequest,cancel_signing_profile_request +CancelSimulationJobBatchRequest,cancel_simulation_job_batch_request +CancelSimulationJobRequest,cancel_simulation_job_request +CancelSolNetworkOperationInput,cancel_sol_network_operation_input +CancelSpotFleetRequestsError,cancel_spot_fleet_requests_error +CancelSpotFleetRequestsErrorItem,cancel_spot_fleet_requests_error_item +CancelSpotFleetRequestsRequest,cancel_spot_fleet_requests_request +CancelSpotFleetRequestsResponse,cancel_spot_fleet_requests_response +CancelSpotFleetRequestsSuccessItem,cancel_spot_fleet_requests_success_item +CancelSpotInstanceRequestsRequest,cancel_spot_instance_requests_request +CancelSpotInstanceRequestsResult,cancel_spot_instance_requests_result +CancelStatementRequest,cancel_statement_request +CancelStatementResponse,cancel_statement_response +CancelStepsInfo,cancel_steps_info +CancelStepsInfoList,cancel_steps_info_list +CancelStepsInput,cancel_steps_input +CancelStepsOutput,cancel_steps_output +CancelTaskExecutionRequest,cancel_task_execution_request +CancelTaskInput,cancel_task_input +CancelTaskOutput,cancel_task_output +CancelTimerDecisionAttributes,cancel_timer_decision_attributes +CancelTimerFailedEventAttributes,cancel_timer_failed_event_attributes +CancelTransactionRequest,cancel_transaction_request +CancelUpdateStackInput,cancel_update_stack_input +CancelVariantImportRequest,cancel_variant_import_request +CancelWorkflowExecutionDecisionAttributes,cancel_workflow_execution_decision_attributes +CancelWorkflowExecutionFailedEventAttributes,cancel_workflow_execution_failed_event_attributes +CancelWorldExportJobRequest,cancel_world_export_job_request +CancelWorldGenerationJobRequest,cancel_world_generation_job_request +CancelZonalShiftRequest,cancel_zonal_shift_request +Cancellable,cancellable +CancellationDate,cancellation_date +CancellationMessage,cancellation_message +CancellationReason,cancellation_reason +CancellationReasons,cancellation_reasons +CancelledByUserException,cancelled_by_user_exception +CancelledSpotInstanceRequest,cancelled_spot_instance_request +CancelledSpotInstanceRequests,cancelled_spot_instance_requests +CancelledSteps,cancelled_steps +CandidateAddress,candidate_address +CandidateAddressList,candidate_address_list +CandidateArtifactLocations,candidate_artifact_locations +CandidateDefinitionNotebookLocation,candidate_definition_notebook_location +CandidateGenerationConfig,candidate_generation_config +CandidateMetrics,candidate_metrics +CandidateName,candidate_name +CandidateNameEquals,candidate_name_equals +CandidateProperties,candidate_properties +CandidateStatus,candidate_status +CandidateStepArn,candidate_step_arn +CandidateStepName,candidate_step_name +CandidateStepType,candidate_step_type +CandidateSteps,candidate_steps +Candidates,candidates +CannedACL,canned_acl +CannedAccessControlList,canned_access_control_list +CannedAcl,canned_acl +CannedAclForObjects,canned_acl_for_objects +CannotChangeImmutablePublicKeyFields,cannot_change_immutable_public_key_fields +CannotDelegateManagementAccountException,cannot_delegate_management_account_exception +CannotDeleteApprovalRuleFromTemplateException,cannot_delete_approval_rule_from_template_exception +CannotDeleteException,cannot_delete_exception +CannotListParentOfRootException,cannot_list_parent_of_root_exception +CannotModifyApprovalRuleFromTemplateException,cannot_modify_approval_rule_from_template_exception +CanonicalHostedZoneId,canonical_hosted_zone_id +CanonicalHostedZoneName,canonical_hosted_zone_name +CanonicalHostedZoneNameID,canonical_hosted_zone_name_id +CanvasAppSettings,canvas_app_settings +CanvasOrientation,canvas_orientation +CanvasSizeOptions,canvas_size_options +Cap,cap +CapExceeded,cap_exceeded +Capabilities,capabilities +CapabilitiesReason,capabilities_reason +Capacity,capacity +CapacityAllocation,capacity_allocation +CapacityAllocations,capacity_allocations +CapacityAssignment,capacity_assignment +CapacityAssignmentConfiguration,capacity_assignment_configuration +CapacityAssignments,capacity_assignments +CapacityConfiguration,capacity_configuration +CapacityDescription,capacity_description +CapacityExceededException,capacity_exceeded_exception +CapacityForecast,capacity_forecast +CapacityId,capacity_id +CapacityInBytes,capacity_in_bytes +CapacityLimits,capacity_limits +CapacityProvider,capacity_provider +CapacityProviderStrategy,capacity_provider_strategy +CapacityProviderStrategyItem,capacity_provider_strategy_item +CapacityProviders,capacity_providers +CapacityProvisioned,capacity_provisioned +CapacityRebalance,capacity_rebalance +CapacityRegion,capacity_region +CapacityReservation,capacity_reservation +CapacityReservationArn,capacity_reservation_arn +CapacityReservationFleet,capacity_reservation_fleet +CapacityReservationFleetArn,capacity_reservation_fleet_arn +CapacityReservationFleetCancellationState,capacity_reservation_fleet_cancellation_state +CapacityReservationFleetId,capacity_reservation_fleet_id +CapacityReservationFleetIds,capacity_reservation_fleet_ids +CapacityReservationFleets,capacity_reservation_fleets +CapacityReservationGroup,capacity_reservation_group +CapacityReservationGroups,capacity_reservation_groups +CapacityReservationId,capacity_reservation_id +CapacityReservationIds,capacity_reservation_ids +CapacityReservationName,capacity_reservation_name +CapacityReservationOptions,capacity_reservation_options +CapacityReservationOptionsRequest,capacity_reservation_options_request +CapacityReservationPreference,capacity_reservation_preference +CapacityReservationResourceGroupArn,capacity_reservation_resource_group_arn +CapacityReservationSpecification,capacity_reservation_specification +CapacityReservationSpecificationResponse,capacity_reservation_specification_response +CapacityReservationTarget,capacity_reservation_target +CapacityReservationTargetResponse,capacity_reservation_target_response +CapacityReservations,capacity_reservations +CapacitySize,capacity_size +CapacitySpecification,capacity_specification +CapacitySpecificationSummary,capacity_specification_summary +CapacityToRelease,capacity_to_release +CapacityUnits,capacity_units +CapacityUnitsConfiguration,capacity_units_configuration +CapacityUpdate,capacity_update +CapacityUsageSummary,capacity_usage_summary +CapacityUsed,capacity_used +CappedCount,capped_count +Captcha,captcha +CaptchaAction,captcha_action +CaptchaConfig,captcha_config +CaptchaResponse,captcha_response +CaptionChannel,caption_channel +CaptionContainerType,caption_container_type +CaptionData,caption_data +CaptionDescription,caption_description +CaptionDescriptionNames,caption_description_names +CaptionDescriptionPreset,caption_description_preset +CaptionDescriptions,caption_descriptions +CaptionDestinationSettings,caption_destination_settings +CaptionFormat,caption_format +CaptionFormats,caption_formats +CaptionLanguageMapping,caption_language_mapping +CaptionLanguageMappings,caption_language_mappings +CaptionLanguageSetting,caption_language_setting +CaptionRectangle,caption_rectangle +CaptionSegmentLengthControl,caption_segment_length_control +CaptionSelector,caption_selector +CaptionSelectorName,caption_selector_name +CaptionSelectorSettings,caption_selector_settings +CaptionSelectors,caption_selectors +CaptionSource,caption_source +CaptionSourceFramerate,caption_source_framerate +CaptionSourceSettings,caption_source_settings +CaptionSources,caption_sources +Captions,captions +CaptureContentTypeHeader,capture_content_type_header +CaptureDdls,capture_ddls +CaptureInterval,capture_interval +CaptureIntervalUnits,capture_interval_units +CaptureMode,capture_mode +CaptureOption,capture_option +CaptureOptions,capture_options +CaptureStatus,capture_status +CaptureTime,capture_time +CaptureTimeAccuracy,capture_time_accuracy +CarModeOptions,car_mode_options +CardExpiryDate,card_expiry_date +CardHolderVerificationValue,card_holder_verification_value +CardStatusUpdate,card_status_update +CardVerificationValue1,card_verification_value1 +CardVerificationValue2,card_verification_value2 +Cardinality,cardinality +Carrier,carrier +CarrierGateway,carrier_gateway +CarrierGatewayId,carrier_gateway_id +CarrierGatewayIds,carrier_gateway_ids +CarrierGateways,carrier_gateways +CarrierIp,carrier_ip +CartesianCoordinates,cartesian_coordinates +Cascade,cascade +CascadingControlConfiguration,cascading_control_configuration +CascadingControlSource,cascading_control_source +CaseCreationLimitExceeded,case_creation_limit_exceeded +CaseDetails,case_details +CaseEventIncludedData,case_event_included_data +CaseId,case_id +CaseIdNotFound,case_id_not_found +CaseInsensitive,case_insensitive +CaseSensitive,case_sensitive +CaseSensitiveNames,case_sensitive_names +CaseSensitivity,case_sensitivity +CaseSummary,case_summary +CastColumnTypeOperation,cast_column_type_operation +Catalog,catalog +CatalogConfiguration,catalog_configuration +CatalogConfigurationDescription,catalog_configuration_description +CatalogConfigurationUpdate,catalog_configuration_update +CatalogDatabase,catalog_database +CatalogDeltaSource,catalog_delta_source +CatalogEncryptionMode,catalog_encryption_mode +CatalogEntry,catalog_entry +CatalogHudiSource,catalog_hudi_source +CatalogId,catalog_id +CatalogImportStatus,catalog_import_status +CatalogItem,catalog_item +CatalogItemId,catalog_item_id +CatalogItems,catalog_items +CatalogKafkaSource,catalog_kafka_source +CatalogKinesisSource,catalog_kinesis_source +CatalogName,catalog_name +CatalogRedshiftSchema,catalog_redshift_schema +CatalogRedshiftTable,catalog_redshift_table +CatalogSchemaChangePolicy,catalog_schema_change_policy +CatalogSource,catalog_source +CatalogTable,catalog_table +CatalogTarget,catalog_target +CatalogTargets,catalog_targets +CategoricalAggregationFunction,categorical_aggregation_function +CategoricalDimensionField,categorical_dimension_field +CategoricalHyperParameterRange,categorical_hyper_parameter_range +CategoricalMeasureField,categorical_measure_field +CategoricalParameter,categorical_parameter +CategoricalParameterRange,categorical_parameter_range +CategoricalParameterRangeSpecification,categorical_parameter_range_specification +CategoricalParameterRanges,categorical_parameter_ranges +CategoricalValues,categorical_values +Categories,categories +Category,category +CategoryAxis,category_axis +CategoryAxisDisplayOptions,category_axis_display_options +CategoryAxisLabelOptions,category_axis_label_options +CategoryDetails,category_details +CategoryDrillDownFilter,category_drill_down_filter +CategoryEnum,category_enum +CategoryEvent,category_event +CategoryFilter,category_filter +CategoryFilterConfiguration,category_filter_configuration +CategoryFilterFunction,category_filter_function +CategoryFilterType,category_filter_type +CategoryId,category_id +CategoryItemsLimit,category_items_limit +CategoryItemsLimitConfiguration,category_items_limit_configuration +CategoryLabelOptions,category_label_options +CategoryLabelVisibility,category_label_visibility +CategoryList,category_list +CategoryName,category_name +CategoryProperties,category_properties +CategorySort,category_sort +CategoryValue,category_value +CategoryValues,category_values +CategoryWithFindingNum,category_with_finding_num +CausalAnomalyId,causal_anomaly_id +Cause,cause +CausedBy,caused_by +Causes,causes +CausingEntity,causing_entity +CbetCheckDigitString,cbet_check_digit_string +CbetSourceId,cbet_source_id +CbetStepaside,cbet_stepaside +CcAddresses,cc_addresses +CcDescriptor,cc_descriptor +CdcInsertsAndUpdates,cdc_inserts_and_updates +CdcInsertsOnly,cdc_inserts_only +CdcMaxBatchInterval,cdc_max_batch_interval +CdcMinFileSize,cdc_min_file_size +CdcPath,cdc_path +CdcStartPosition,cdc_start_position +CdcStartTime,cdc_start_time +CdcStopPosition,cdc_stop_position +CdiInputSpecification,cdi_input_specification +Cdma,cdma +CdmaChannel,cdma_channel +CdmaLocalId,cdma_local_id +CdmaNmr,cdma_nmr +CdmaNmrObj,cdma_nmr_obj +CdmaObj,cdma_obj +CdnConfiguration,cdn_configuration +CdnIdentifierSecret,cdn_identifier_secret +CdrBucket,cdr_bucket +Celebrities,celebrities +Celebrity,celebrity +CelebrityDetail,celebrity_detail +CelebrityFaces,celebrity_faces +CelebrityRecognition,celebrity_recognition +Cell,cell +CellArn,cell_arn +CellFilters,cell_filters +CellInput,cell_input +CellName,cell_name +CellOutput,cell_output +CellParams,cell_params +CellReference,cell_reference +CellStyle,cell_style +CellTowers,cell_towers +CellType,cell_type +CellValue,cell_value +CellValueSynonym,cell_value_synonym +CellValueSynonyms,cell_value_synonyms +Cells,cells +Center,center +Cents,cents +CertPolicyId,cert_policy_id +Certificate,certificate +CertificateAlreadyExistsException,certificate_already_exists_exception +CertificateArn,certificate_arn +CertificateAssociation,certificate_association +CertificateAssociations,certificate_associations +CertificateAuthentication,certificate_authentication +CertificateAuthenticationRequest,certificate_authentication_request +CertificateAuthorities,certificate_authorities +CertificateAuthority,certificate_authority +CertificateAuthorityArn,certificate_authority_arn +CertificateAuthorityArnList,certificate_authority_arn_list +CertificateAuthorityConfiguration,certificate_authority_configuration +CertificateAuthorityData,certificate_authority_data +CertificateAuthorityExpiryInMilliseconds,certificate_authority_expiry_in_milliseconds +CertificateAuthorityId,certificate_authority_id +CertificateAuthorityPublicKeyIdentifier,certificate_authority_public_key_identifier +CertificateAuthorityType,certificate_authority_type +CertificateBasedAuthProperties,certificate_based_auth_properties +CertificateBody,certificate_body +CertificateChain,certificate_chain +CertificateConfiguration,certificate_configuration +CertificateConflictException,certificate_conflict_exception +CertificateCreationDate,certificate_creation_date +CertificateData,certificate_data +CertificateDescription,certificate_description +CertificateDetail,certificate_detail +CertificateDetails,certificate_details +CertificateDoesNotExistException,certificate_does_not_exist_exception +CertificateEnrollmentPolicyServerEndpoint,certificate_enrollment_policy_server_endpoint +CertificateExpirationTime,certificate_expiration_time +CertificateExpiryInMilliseconds,certificate_expiry_in_milliseconds +CertificateFingerprint,certificate_fingerprint +CertificateId,certificate_id +CertificateIdentifier,certificate_identifier +CertificateIds,certificate_ids +CertificateInUseException,certificate_in_use_exception +CertificateInfo,certificate_info +CertificateLimitExceededException,certificate_limit_exceeded_exception +CertificateList,certificate_list +CertificateMessage,certificate_message +CertificateMismatchException,certificate_mismatch_exception +CertificateMode,certificate_mode +CertificateName,certificate_name +CertificateNotFoundException,certificate_not_found_exception +CertificateNotFoundFault,certificate_not_found_fault +CertificateOptions,certificate_options +CertificateOwner,certificate_owner +CertificatePath,certificate_path +CertificatePem,certificate_pem +CertificatePolicies,certificate_policies +CertificateRevocationList,certificate_revocation_list +CertificateRotationRestart,certificate_rotation_restart +CertificateS3BucketName,certificate_s3_bucket_name +CertificateS3ObjectKey,certificate_s3_object_key +CertificateSerial,certificate_serial +CertificateSource,certificate_source +CertificateStateException,certificate_state_exception +CertificateStatuses,certificate_statuses +CertificateSummary,certificate_summary +CertificateSummaryList,certificate_summary_list +CertificateTransparencyLoggingPreference,certificate_transparency_logging_preference +CertificateType,certificate_type +CertificateUploadDate,certificate_upload_date +CertificateValidationException,certificate_validation_exception +CertificateValidationRecord,certificate_validation_record +CertificateValidationRecords,certificate_validation_records +CertificateValidity,certificate_validity +CertificateWallet,certificate_wallet +Certificates,certificates +CertificatesInfo,certificates_info +Certifications,certifications +CertifyForMarketplace,certify_for_marketplace +Chain,chain +ChainId,chain_id +ChaincodeLogs,chaincode_logs +Challenge,challenge +ChallengeAction,challenge_action +ChallengeCode,challenge_code +ChallengeConfig,challenge_config +ChallengeName,challenge_name +ChallengeParameters,challenge_parameters +ChallengeRequiredOnNewDevice,challenge_required_on_new_device +ChallengeResponse,challenge_response +ChallengeResponseType,challenge_response_type +ChallengeResponses,challenge_responses +Change,change +ChangeBatch,change_batch +ChangeCidrCollectionRequest,change_cidr_collection_request +ChangeCidrCollectionResponse,change_cidr_collection_response +ChangeComputeType,change_compute_type +ChangeDetails,change_details +ChangeDetectingColumns,change_detecting_columns +ChangeId,change_id +ChangeInfo,change_info +ChangeLog,change_log +ChangeMessageVisibilityBatchRequest,change_message_visibility_batch_request +ChangeMessageVisibilityBatchRequestEntry,change_message_visibility_batch_request_entry +ChangeMessageVisibilityBatchResult,change_message_visibility_batch_result +ChangeMessageVisibilityBatchResultEntry,change_message_visibility_batch_result_entry +ChangeMessageVisibilityRequest,change_message_visibility_request +ChangeName,change_name +ChangeOwnershipPrice,change_ownership_price +ChangePasswordRequest,change_password_request +ChangeProgressDetails,change_progress_details +ChangeProgressStage,change_progress_stage +ChangeProgressStages,change_progress_stages +ChangeProgressStatus,change_progress_status +ChangeProgressStatusDetails,change_progress_status_details +ChangeProgressStatuses,change_progress_statuses +ChangeRequest,change_request +ChangeRequestName,change_request_name +ChangeResourceRecordSetsRequest,change_resource_record_sets_request +ChangeResourceRecordSetsResponse,change_resource_record_sets_response +ChangeServerLifeCycleStateRequest,change_server_life_cycle_state_request +ChangeServerLifeCycleStateSourceServerLifecycle,change_server_life_cycle_state_source_server_lifecycle +ChangeSet,change_set +ChangeSetArn,change_set_arn +ChangeSetHook,change_set_hook +ChangeSetHookResourceTargetDetails,change_set_hook_resource_target_details +ChangeSetHookTargetDetails,change_set_hook_target_details +ChangeSetId,change_set_id +ChangeSetName,change_set_name +ChangeSetNotFoundException,change_set_not_found_exception +ChangeSetState,change_set_state +ChangeSetSummary,change_set_summary +ChangeSetSummaryList,change_set_summary_list +ChangeSetSummaryListItem,change_set_summary_list_item +ChangeSetTags,change_set_tags +ChangeSetType,change_set_type +ChangeSeverity,change_severity +ChangeSource,change_source +ChangeSummary,change_summary +ChangeTagsForResourceRequest,change_tags_for_resource_request +ChangeToken,change_token +ChangeTokenStatus,change_token_status +ChangeType,change_type +ChangeableForDays,changeable_for_days +ChangedBlock,changed_block +ChangedBlocks,changed_blocks +ChangedBlocksCount,changed_blocks_count +Changes,changes +ChangesetErrorInfo,changeset_error_info +ChangesetSummary,changeset_summary +Channel,channel +ChannelARN,channel_arn +ChannelARNInvalidException,channel_arn_invalid_exception +ChannelActivity,channel_activity +ChannelAlreadyExistsException,channel_already_exists_exception +ChannelArn,channel_arn +ChannelAssociatedWithFlowSummary,channel_associated_with_flow_summary +ChannelBan,channel_ban +ChannelBanSummary,channel_ban_summary +ChannelBans,channel_bans +ChannelClass,channel_class +ChannelConfiguration,channel_configuration +ChannelCounts,channel_counts +ChannelDefinition,channel_definition +ChannelDefinitions,channel_definitions +ChannelEgressEndpoint,channel_egress_endpoint +ChannelExistsForEDSException,channel_exists_for_eds_exception +ChannelFlow,channel_flow +ChannelFlowArn,channel_flow_arn +ChannelFlowCallbackRequest,channel_flow_callback_request +ChannelFlowCallbackResponse,channel_flow_callback_response +ChannelFlowSummary,channel_flow_summary +ChannelFlows,channel_flows +ChannelGroupListConfiguration,channel_group_list_configuration +ChannelGroupName,channel_group_name +ChannelId,channel_id +ChannelIdentification,channel_identification +ChannelIds,channel_ids +ChannelInfo,channel_info +ChannelInfoList,channel_info_list +ChannelInsufficientPermission,channel_insufficient_permission +ChannelListConfiguration,channel_list_configuration +ChannelMapping,channel_mapping +ChannelMappings,channel_mappings +ChannelMask,channel_mask +ChannelMaxLimitExceededException,channel_max_limit_exceeded_exception +ChannelMembership,channel_membership +ChannelMembershipForAppInstanceUserSummary,channel_membership_for_app_instance_user_summary +ChannelMembershipPreferences,channel_membership_preferences +ChannelMembershipSummary,channel_membership_summary +ChannelMemberships,channel_memberships +ChannelMessage,channel_message +ChannelMessageCallback,channel_message_callback +ChannelMessageStatusStructure,channel_message_status_structure +ChannelMessageSummary,channel_message_summary +ChannelMessages,channel_messages +ChannelModeratedByAppInstanceUserSummary,channel_moderated_by_app_instance_user_summary +ChannelModerator,channel_moderator +ChannelModeratorArn,channel_moderator_arn +ChannelModeratorSummary,channel_moderator_summary +ChannelModerators,channel_moderators +ChannelName,channel_name +ChannelNameCondition,channel_name_condition +ChannelNotBroadcasting,channel_not_broadcasting +ChannelNotFound,channel_not_found +ChannelNotFoundException,channel_not_found_exception +ChannelOrder,channel_order +ChannelResponse,channel_response +ChannelRetentionSettings,channel_retention_settings +ChannelSpecification,channel_specification +ChannelState,channel_state +ChannelStatistics,channel_statistics +ChannelStatus,channel_status +ChannelStorage,channel_storage +ChannelStorageSummary,channel_storage_summary +ChannelSummary,channel_summary +ChannelTag,channel_tag +ChannelTargetInfo,channel_target_info +ChannelType,channel_type +ChannelUnsupportedSchema,channel_unsupported_schema +Channels,channels +ChannelsIn,channels_in +ChannelsOut,channels_out +ChannelsResponse,channels_response +ChapCredentials,chap_credentials +ChapEnabled,chap_enabled +ChapInfo,chap_info +CharLengthSemantics,char_length_semantics +CharacterOffsets,character_offsets +CharacterSet,character_set +CharacterSetDescription,character_set_description +CharacterSetName,character_set_name +Characters,characters +ChargeDetails,charge_details +ChargeValue,charge_value +Charset,charset +ChartAxisLabelOptions,chart_axis_label_options +ChartColor,chart_color +ChartConfiguration,chart_configuration +ChatDurationInMinutes,chat_duration_in_minutes +ChatMessage,chat_message +ChatParticipantRoleConfig,chat_participant_role_config +ChatStreamingConfiguration,chat_streaming_configuration +ChatterFeedConfiguration,chatter_feed_configuration +CheckCapacityRequest,check_capacity_request +CheckCapacityResponse,check_capacity_response +CheckDNSAvailabilityMessage,check_dns_availability_message +CheckDNSAvailabilityResultMessage,check_dns_availability_result_message +CheckDetail,check_detail +CheckDetails,check_details +CheckDigitString,check_digit_string +CheckDomainAvailabilityRequest,check_domain_availability_request +CheckDomainAvailabilityResponse,check_domain_availability_response +CheckDomainTransferabilityRequest,check_domain_transferability_request +CheckDomainTransferabilityResponse,check_domain_transferability_response +CheckExpression,check_expression +CheckIfPhoneNumberIsOptedOutInput,check_if_phone_number_is_opted_out_input +CheckIfPhoneNumberIsOptedOutResponse,check_if_phone_number_is_opted_out_response +CheckInLicenseRequest,check_in_license_request +CheckJobArn,check_job_arn +CheckName,check_name +CheckSchemaVersionValidityInput,check_schema_version_validity_input +CheckSchemaVersionValidityResponse,check_schema_version_validity_response +CheckSummaries,check_summaries +CheckSummary,check_summary +CheckType,check_type +CheckedTime,checked_time +CheckerIpRanges,checker_ip_ranges +CheckoutBorrowLicenseRequest,checkout_borrow_license_request +CheckoutBorrowLicenseResponse,checkout_borrow_license_response +CheckoutLicenseRequest,checkout_license_request +CheckoutLicenseResponse,checkout_license_response +CheckoutMetadata,checkout_metadata +CheckoutType,checkout_type +CheckpointConfig,checkpoint_config +CheckpointConfiguration,checkpoint_configuration +CheckpointConfigurationDescription,checkpoint_configuration_description +CheckpointConfigurationUpdate,checkpoint_configuration_update +CheckpointDelay,checkpoint_delay +CheckpointInterval,checkpoint_interval +CheckpointIntervalUpdate,checkpoint_interval_update +CheckpointPercentages,checkpoint_percentages +CheckpointingEnabled,checkpointing_enabled +CheckpointingEnabledUpdate,checkpointing_enabled_update +Checksum,checksum +ChecksumAggregationMethod,checksum_aggregation_method +ChecksumAlgorithm,checksum_algorithm +ChecksumCRC32,checksum_crc32 +ChecksumCRC32C,checksum_crc32_c +ChecksumMode,checksum_mode +ChecksumSHA1,checksum_sha1 +ChecksumSHA256,checksum_sha256 +ChefConfiguration,chef_configuration +Child,child +ChildBlock,child_block +ChildBlockId,child_block_id +ChildBlocks,child_blocks +ChildComponents,child_components +ChildHealthChecks,child_health_checks +ChildId,child_id +ChildJobsInState,child_jobs_in_state +ChildManifestName,child_manifest_name +ChildNotFoundException,child_not_found_exception +ChildReference,child_reference +ChildShard,child_shard +ChildShards,child_shards +ChildType,child_type +ChildWorkflowExecutionCanceledEventAttributes,child_workflow_execution_canceled_event_attributes +ChildWorkflowExecutionCompletedEventAttributes,child_workflow_execution_completed_event_attributes +ChildWorkflowExecutionFailedEventAttributes,child_workflow_execution_failed_event_attributes +ChildWorkflowExecutionStartedEventAttributes,child_workflow_execution_started_event_attributes +ChildWorkflowExecutionTerminatedEventAttributes,child_workflow_execution_terminated_event_attributes +ChildWorkflowExecutionTimedOutEventAttributes,child_workflow_execution_timed_out_event_attributes +Children,children +ChildrenOfAlarmName,children_of_alarm_name +ChimeBearer,chime_bearer +ChimeSdkMeetingConcatenationConfiguration,chime_sdk_meeting_concatenation_configuration +ChimeSdkMeetingConfiguration,chime_sdk_meeting_configuration +ChimeSdkMeetingLiveConnectorConfiguration,chime_sdk_meeting_live_connector_configuration +Choice,choice +ChoiceAnswer,choice_answer +ChoiceAnswerSummaries,choice_answer_summaries +ChoiceAnswerSummary,choice_answer_summary +ChoiceAnswers,choice_answers +ChoiceContent,choice_content +ChoiceDescription,choice_description +ChoiceId,choice_id +ChoiceImprovementPlan,choice_improvement_plan +ChoiceTitle,choice_title +ChoiceUpdate,choice_update +ChoiceUpdates,choice_updates +Choices,choices +ChromaSampling,chroma_sampling +Chunk,chunk +ChunkChecksum,chunk_checksum +ChunkChecksumAlgorithm,chunk_checksum_algorithm +ChunkIndex,chunk_index +ChunkList,chunk_list +ChunkToken,chunk_token +ChunksCount,chunks_count +Cidr,cidr +CidrAllowList,cidr_allow_list +CidrAllowedList,cidr_allowed_list +CidrAuthorizationContext,cidr_authorization_context +CidrBlock,cidr_block +CidrBlockAssociation,cidr_block_association +CidrBlockAssociationSet,cidr_block_association_set +CidrBlockInUseException,cidr_block_in_use_exception +CidrBlockSet,cidr_block_set +CidrBlockState,cidr_block_state +CidrBlockSummary,cidr_block_summary +CidrBlocks,cidr_blocks +CidrCollection,cidr_collection +CidrCollectionAlreadyExistsException,cidr_collection_already_exists_exception +CidrCollectionChange,cidr_collection_change +CidrCollectionInUseException,cidr_collection_in_use_exception +CidrCollectionVersionMismatchException,cidr_collection_version_mismatch_exception +CidrCollections,cidr_collections +CidrIp,cidr_ip +CidrIps,cidr_ips +CidrIpv4,cidr_ipv4 +CidrIpv6,cidr_ipv6 +CidrList,cidr_list +CidrLocations,cidr_locations +CidrRoutingConfig,cidr_routing_config +Cidrs,cidrs +CifsShareCount,cifs_share_count +Cipher,cipher +CipherText,cipher_text +Ciphers,ciphers +CiphertextBlob,ciphertext_blob +CiphertextForRecipient,ciphertext_for_recipient +Circle,circle +CisaData,cisa_data +City,city +CityName,city_name +Claim,claim +ClaimCode,claim_code +ClaimDeviceRequest,claim_device_request +ClaimDevicesByClaimCodeRequest,claim_devices_by_claim_code_request +ClaimDevicesByClaimCodeResponse,claim_devices_by_claim_code_response +ClaimFilterOption,claim_filter_option +ClaimGameServerInput,claim_game_server_input +ClaimGameServerOutput,claim_game_server_output +ClaimPhoneNumberRequest,claim_phone_number_request +ClaimPhoneNumberResponse,claim_phone_number_response +ClaimRegex,claim_regex +ClaimStatus,claim_status +ClaimedPhoneNumberSummary,claimed_phone_number_summary +ClapAtom,clap_atom +ClarifyCheck,clarify_check +ClarifyCheckStepMetadata,clarify_check_step_metadata +ClarifyExplainerConfig,clarify_explainer_config +ClarifyInferenceConfig,clarify_inference_config +ClarifyShapBaselineConfig,clarify_shap_baseline_config +ClarifyShapConfig,clarify_shap_config +ClarifyTextConfig,clarify_text_config +ClassBTimeout,class_b_timeout +ClassCTimeout,class_c_timeout +ClassName,class_name +Classes,classes +Classic,classic +ClassicLinkDnsSupport,classic_link_dns_support +ClassicLinkDnsSupported,classic_link_dns_supported +ClassicLinkEnabled,classic_link_enabled +ClassicLinkInstance,classic_link_instance +ClassicLinkVPCId,classic_link_vpc_id +ClassicLinkVPCSecurityGroups,classic_link_vpc_security_groups +ClassicLinkVpcId,classic_link_vpc_id +ClassicLinkVpcSecurityGroups,classic_link_vpc_security_groups +ClassicLoadBalancer,classic_load_balancer +ClassicLoadBalancerListener,classic_load_balancer_listener +ClassicLoadBalancers,classic_load_balancers +ClassicLoadBalancersConfig,classic_load_balancers_config +Classification,classification +ClassificationDetails,classification_details +ClassificationExportConfiguration,classification_export_configuration +ClassificationResult,classification_result +ClassificationResultStatus,classification_result_status +ClassificationScopeSummary,classification_scope_summary +ClassificationStatus,classification_status +ClassificationType,classification_type +ClassificationTypeUpdate,classification_type_update +Classifier,classifier +ClassifierEvaluationMetrics,classifier_evaluation_metrics +ClassifierMetadata,classifier_metadata +Classifiers,classifiers +ClassifyDocumentRequest,classify_document_request +ClassifyDocumentResponse,classify_document_response +CleanAmplifyApp,clean_amplify_app +CleanSourceMetadataOnMismatch,clean_source_metadata_on_mismatch +CleansedPhoneNumberE164,cleansed_phone_number_e164 +CleansedPhoneNumberNational,cleansed_phone_number_national +ClearAllocationDefaultNetmaskLength,clear_allocation_default_netmask_length +ClearQuerySuggestionsRequest,clear_query_suggestions_request +ClearTimerAction,clear_timer_action +CliToken,cli_token +ClickFeedback,click_feedback +ClickFeedbackItems,click_feedback_items +ClickTime,click_time +ClientAffinity,client_affinity +ClientArn,client_arn +ClientAssociationMetadata,client_association_metadata +ClientAuthentication,client_authentication +ClientAuthenticationSettingInfo,client_authentication_setting_info +ClientAuthenticationSettingsInfo,client_authentication_settings_info +ClientBroker,client_broker +ClientCache,client_cache +ClientCertAuthSettings,client_cert_auth_settings +ClientCertificate,client_certificate +ClientCertificateId,client_certificate_id +ClientCertificateRevocationListStatus,client_certificate_revocation_list_status +ClientCertificates,client_certificates +ClientCidrBlock,client_cidr_block +ClientConfig,client_config +ClientConfiguration,client_configuration +ClientConfigurationVersion,client_configuration_version +ClientConfigurations,client_configurations +ClientConnectOptions,client_connect_options +ClientConnectResponseOptions,client_connect_response_options +ClientContext,client_context +ClientData,client_data +ClientDownloadLandingPage,client_download_landing_page +ClientException,client_exception +ClientID,client_id +ClientIDList,client_id_list +ClientIP,client_ip +ClientIPPreservationEnabled,client_ip_preservation_enabled +ClientId,client_id +ClientImpacting,client_impacting +ClientIp,client_ip +ClientLimitExceededException,client_limit_exceeded_exception +ClientList,client_list +ClientLoginBannerOptions,client_login_banner_options +ClientLoginBannerResponseOptions,client_login_banner_response_options +ClientMetadata,client_metadata +ClientName,client_name +ClientParameters,client_parameters +ClientPasswordAuthType,client_password_auth_type +ClientPolicy,client_policy +ClientPolicyTls,client_policy_tls +ClientProperties,client_properties +ClientPropertiesList,client_properties_list +ClientPropertiesResult,client_properties_result +ClientPublicKey,client_public_key +ClientRequestId,client_request_id +ClientRequestImpactStatistics,client_request_impact_statistics +ClientRequestToken,client_request_token +ClientRequestTokenRequiredException,client_request_token_required_exception +ClientRootCertificateChain,client_root_certificate_chain +ClientRootCertificateChainArn,client_root_certificate_chain_arn +ClientSdkVersion,client_sdk_version +ClientSecret,client_secret +ClientSessionId,client_session_id +ClientSideTimestamps,client_side_timestamps +ClientSubnet,client_subnet +ClientSubnets,client_subnets +ClientTimeoutException,client_timeout_exception +ClientToken,client_token +ClientTokenConflictException,client_token_conflict_exception +ClientTokenId,client_token_id +ClientTunnelAddress,client_tunnel_address +ClientVersion,client_version +ClientVpcConnection,client_vpc_connection +ClientVpcConnections,client_vpc_connections +ClientVpcIpAddress,client_vpc_ip_address +ClientVpnAuthentication,client_vpn_authentication +ClientVpnAuthenticationRequest,client_vpn_authentication_request +ClientVpnAuthorizationRuleStatus,client_vpn_authorization_rule_status +ClientVpnConnection,client_vpn_connection +ClientVpnConnectionStatus,client_vpn_connection_status +ClientVpnEndpoint,client_vpn_endpoint +ClientVpnEndpointAttributeStatus,client_vpn_endpoint_attribute_status +ClientVpnEndpointId,client_vpn_endpoint_id +ClientVpnEndpointIds,client_vpn_endpoint_ids +ClientVpnEndpointStatus,client_vpn_endpoint_status +ClientVpnEndpoints,client_vpn_endpoints +ClientVpnRoute,client_vpn_route +ClientVpnRouteStatus,client_vpn_route_status +ClientVpnTargetNetworks,client_vpn_target_networks +Clients,clients +Clip,clip +ClipFragmentSelector,clip_fragment_selector +ClipLimits,clip_limits +ClipRange,clip_range +ClipTimestampRange,clip_timestamp_range +ClockRate,clock_rate +ClockSync,clock_sync +Clocks,clocks +CloneAppIds,clone_app_ids +CloneBackendRequest,clone_backend_request +CloneBackendResponse,clone_backend_response +CloneGroupId,clone_group_id +ClonePermissions,clone_permissions +CloneReceiptRuleSetRequest,clone_receipt_rule_set_request +CloneStackRequest,clone_stack_request +CloneStackResult,clone_stack_result +CloseAccountRequest,close_account_request +CloseInstancePublicPortsRequest,close_instance_public_ports_request +CloseInstancePublicPortsResult,close_instance_public_ports_result +CloseStatusFilter,close_status_filter +CloseTime,close_time +CloseTunnelRequest,close_tunnel_request +Closed,closed +ClosedDays,closed_days +ClosedDaysRule,closed_days_rule +CloudComponentStatus,cloud_component_status +CloudFormation,cloud_formation +CloudFormationCollection,cloud_formation_collection +CloudFormationCollectionFilter,cloud_formation_collection_filter +CloudFormationCostEstimationResourceCollectionFilter,cloud_formation_cost_estimation_resource_collection_filter +CloudFormationHealth,cloud_formation_health +CloudFormationOverridePropertyConfiguration,cloud_formation_override_property_configuration +CloudFormationStackARN,cloud_formation_stack_arn +CloudFormationStackArn,cloud_formation_stack_arn +CloudFormationStackRecord,cloud_formation_stack_record +CloudFormationStackRecordSourceInfo,cloud_formation_stack_record_source_info +CloudFormationTarget,cloud_formation_target +CloudFrontDefaultCertificate,cloud_front_default_certificate +CloudFrontDistribution,cloud_front_distribution +CloudFrontDomain,cloud_front_domain +CloudFrontOriginAccessIdentity,cloud_front_origin_access_identity +CloudFrontOriginAccessIdentityAlreadyExists,cloud_front_origin_access_identity_already_exists +CloudFrontOriginAccessIdentityConfig,cloud_front_origin_access_identity_config +CloudFrontOriginAccessIdentityInUse,cloud_front_origin_access_identity_in_use +CloudFrontOriginAccessIdentityList,cloud_front_origin_access_identity_list +CloudFrontOriginAccessIdentitySummary,cloud_front_origin_access_identity_summary +CloudHsmAccessDeniedException,cloud_hsm_access_denied_exception +CloudHsmClusterId,cloud_hsm_cluster_id +CloudHsmClusterInUseException,cloud_hsm_cluster_in_use_exception +CloudHsmClusterInvalidConfigurationException,cloud_hsm_cluster_invalid_configuration_exception +CloudHsmClusterNotActiveException,cloud_hsm_cluster_not_active_exception +CloudHsmClusterNotFoundException,cloud_hsm_cluster_not_found_exception +CloudHsmClusterNotRelatedException,cloud_hsm_cluster_not_related_exception +CloudHsmInternalException,cloud_hsm_internal_exception +CloudHsmInternalFailureException,cloud_hsm_internal_failure_exception +CloudHsmInvalidRequestException,cloud_hsm_invalid_request_exception +CloudHsmResourceNotFoundException,cloud_hsm_resource_not_found_exception +CloudHsmServiceException,cloud_hsm_service_exception +CloudHsmTagException,cloud_hsm_tag_exception +CloudLayout,cloud_layout +CloudOnlyDirectoriesCurrentCount,cloud_only_directories_current_count +CloudOnlyDirectoriesLimit,cloud_only_directories_limit +CloudOnlyDirectoriesLimitReached,cloud_only_directories_limit_reached +CloudOnlyMicrosoftADCurrentCount,cloud_only_microsoft_ad_current_count +CloudOnlyMicrosoftADLimit,cloud_only_microsoft_ad_limit +CloudOnlyMicrosoftADLimitReached,cloud_only_microsoft_ad_limit_reached +CloudRemovalConfigInput,cloud_removal_config_input +CloudTrail,cloud_trail +CloudTrailARNInvalidException,cloud_trail_arn_invalid_exception +CloudTrailAccessNotEnabledException,cloud_trail_access_not_enabled_exception +CloudTrailConfigurationResult,cloud_trail_configuration_result +CloudTrailDetails,cloud_trail_details +CloudTrailEvent,cloud_trail_event +CloudTrailInvalidClientTokenIdException,cloud_trail_invalid_client_token_id_exception +CloudTrailProperties,cloud_trail_properties +CloudWatchAlarmConfiguration,cloud_watch_alarm_configuration +CloudWatchAlarmDefinition,cloud_watch_alarm_definition +CloudWatchConfig,cloud_watch_config +CloudWatchDashboard,cloud_watch_dashboard +CloudWatchDashboards,cloud_watch_dashboards +CloudWatchDestination,cloud_watch_destination +CloudWatchDimensionConfiguration,cloud_watch_dimension_configuration +CloudWatchEncryption,cloud_watch_encryption +CloudWatchEncryptionEnabled,cloud_watch_encryption_enabled +CloudWatchEncryptionMode,cloud_watch_encryption_mode +CloudWatchEventDetailType,cloud_watch_event_detail_type +CloudWatchEventId,cloud_watch_event_id +CloudWatchEventSource,cloud_watch_event_source +CloudWatchEventsExecutionDataDetails,cloud_watch_events_execution_data_details +CloudWatchLogDeliveryOptions,cloud_watch_log_delivery_options +CloudWatchLogDestination,cloud_watch_log_destination +CloudWatchLogGroupARN,cloud_watch_log_group_arn +CloudWatchLogGroupArn,cloud_watch_log_group_arn +CloudWatchLogGroupLogDestination,cloud_watch_log_group_log_destination +CloudWatchLogGroupName,cloud_watch_log_group_name +CloudWatchLogOptions,cloud_watch_log_options +CloudWatchLogOptionsSpecification,cloud_watch_log_options_specification +CloudWatchLoggingConfiguration,cloud_watch_logging_configuration +CloudWatchLoggingOption,cloud_watch_logging_option +CloudWatchLoggingOptionDescription,cloud_watch_logging_option_description +CloudWatchLoggingOptionDescriptions,cloud_watch_logging_option_descriptions +CloudWatchLoggingOptionId,cloud_watch_logging_option_id +CloudWatchLoggingOptionUpdate,cloud_watch_logging_option_update +CloudWatchLoggingOptionUpdates,cloud_watch_logging_option_updates +CloudWatchLoggingOptions,cloud_watch_logging_options +CloudWatchLogs,cloud_watch_logs +CloudWatchLogsConfig,cloud_watch_logs_config +CloudWatchLogsConfiguration,cloud_watch_logs_configuration +CloudWatchLogsConfigurationType,cloud_watch_logs_configuration_type +CloudWatchLogsDeliveryUnavailableException,cloud_watch_logs_delivery_unavailable_exception +CloudWatchLogsDestination,cloud_watch_logs_destination +CloudWatchLogsDestinationConfig,cloud_watch_logs_destination_config +CloudWatchLogsDestinationConfiguration,cloud_watch_logs_destination_configuration +CloudWatchLogsDestinationDetails,cloud_watch_logs_destination_details +CloudWatchLogsDetails,cloud_watch_logs_details +CloudWatchLogsLogDelivery,cloud_watch_logs_log_delivery +CloudWatchLogsLogDeliveryDescription,cloud_watch_logs_log_delivery_description +CloudWatchLogsLogGroup,cloud_watch_logs_log_group +CloudWatchLogsLogGroupArn,cloud_watch_logs_log_group_arn +CloudWatchLogsLogStream,cloud_watch_logs_log_stream +CloudWatchLogsParameters,cloud_watch_logs_parameters +CloudWatchLogsRoleArn,cloud_watch_logs_role_arn +CloudWatchMetrics,cloud_watch_metrics +CloudWatchMetricsDataSummary,cloud_watch_metrics_data_summary +CloudWatchMetricsDetail,cloud_watch_metrics_detail +CloudWatchMetricsDimension,cloud_watch_metrics_dimension +CloudWatchMetricsEnabled,cloud_watch_metrics_enabled +CloudWatchMonitoringConfiguration,cloud_watch_monitoring_configuration +CloudWatchOutputConfig,cloud_watch_output_config +CloudWatchOutputEnabled,cloud_watch_output_enabled +CloudWatchOutputUrl,cloud_watch_output_url +Cloudwatch,cloudwatch +CloudwatchAlarmAction,cloudwatch_alarm_action +CloudwatchLogGroup,cloudwatch_log_group +CloudwatchLogStream,cloudwatch_log_stream +CloudwatchLogsAction,cloudwatch_logs_action +CloudwatchLogsExportConfiguration,cloudwatch_logs_export_configuration +CloudwatchMetricAction,cloudwatch_metric_action +Cluster,cluster +ClusterAlreadyExistsFault,cluster_already_exists_fault +ClusterArn,cluster_arn +ClusterAssociatedToSchedule,cluster_associated_to_schedule +ClusterAvailabilityStatus,cluster_availability_status +ClusterBlockStorageLogicalUsed,cluster_block_storage_logical_used +ClusterBlockStorageSize,cluster_block_storage_size +ClusterBlockStorageUsed,cluster_block_storage_used +ClusterCertificate,cluster_certificate +ClusterCloudStorageUsed,cluster_cloud_storage_used +ClusterConfig,cluster_config +ClusterConfigStatus,cluster_config_status +ClusterConfiguration,cluster_configuration +ClusterContainsContainerInstancesException,cluster_contains_container_instances_exception +ClusterContainsServicesException,cluster_contains_services_exception +ClusterContainsTasksException,cluster_contains_tasks_exception +ClusterCreateTime,cluster_create_time +ClusterCredentials,cluster_credentials +ClusterCsr,cluster_csr +ClusterDbRevision,cluster_db_revision +ClusterDbRevisions,cluster_db_revisions +ClusterDbRevisionsMessage,cluster_db_revisions_message +ClusterDiscoveryEndpoint,cluster_discovery_endpoint +ClusterEnabled,cluster_enabled +ClusterEndpoint,cluster_endpoint +ClusterEndpointEncryptionType,cluster_endpoint_encryption_type +ClusterEndpoints,cluster_endpoints +ClusterExists,cluster_exists +ClusterExtendedCredentials,cluster_extended_credentials +ClusterHealth,cluster_health +ClusterIamRole,cluster_iam_role +ClusterId,cluster_id +ClusterIdentifier,cluster_identifier +ClusterInList,cluster_in_list +ClusterInfo,cluster_info +ClusterInfoList,cluster_info_list +ClusterIssue,cluster_issue +ClusterJDBCURL,cluster_jdbcurl +ClusterLimitExceededException,cluster_limit_exceeded_exception +ClusterListEntries,cluster_list_entries +ClusterListEntry,cluster_list_entry +ClusterLogging,cluster_logging +ClusterMarker,cluster_marker +ClusterMarkerConfiguration,cluster_marker_configuration +ClusterMetadata,cluster_metadata +ClusterMode,cluster_mode +ClusterName,cluster_name +ClusterNameFilter,cluster_name_filter +ClusterNames,cluster_names +ClusterNamespaceArn,cluster_namespace_arn +ClusterNode,cluster_node +ClusterNodes,cluster_nodes +ClusterNotFoundException,cluster_not_found_exception +ClusterNotFoundFault,cluster_not_found_fault +ClusterOnLatestRevisionFault,cluster_on_latest_revision_fault +ClusterOperationArn,cluster_operation_arn +ClusterOperationInfo,cluster_operation_info +ClusterOperationInfoList,cluster_operation_info_list +ClusterOperationStep,cluster_operation_step +ClusterOperationStepInfo,cluster_operation_step_info +ClusterOperationV2,cluster_operation_v2 +ClusterOperationV2Provisioned,cluster_operation_v2_provisioned +ClusterOperationV2Serverless,cluster_operation_v2_serverless +ClusterOperationV2Summary,cluster_operation_v2_summary +ClusterParameterGroup,cluster_parameter_group +ClusterParameterGroupAlreadyExistsFault,cluster_parameter_group_already_exists_fault +ClusterParameterGroupDetails,cluster_parameter_group_details +ClusterParameterGroupFamily,cluster_parameter_group_family +ClusterParameterGroupName,cluster_parameter_group_name +ClusterParameterGroupNameMessage,cluster_parameter_group_name_message +ClusterParameterGroupNotFoundFault,cluster_parameter_group_not_found_fault +ClusterParameterGroupQuotaExceededFault,cluster_parameter_group_quota_exceeded_fault +ClusterParameterGroupStatus,cluster_parameter_group_status +ClusterParameterGroups,cluster_parameter_groups +ClusterParameterGroupsMessage,cluster_parameter_groups_message +ClusterParameterStatus,cluster_parameter_status +ClusterParameterStatusList,cluster_parameter_status_list +ClusterPendingModifiedValues,cluster_pending_modified_values +ClusterPendingUpdates,cluster_pending_updates +ClusterPublicKey,cluster_public_key +ClusterQuotaExceededFault,cluster_quota_exceeded_fault +ClusterQuotaForCustomerExceededFault,cluster_quota_for_customer_exceeded_fault +ClusterRevisionNumber,cluster_revision_number +ClusterRoleArn,cluster_role_arn +ClusterSecurityGroup,cluster_security_group +ClusterSecurityGroupAlreadyExistsFault,cluster_security_group_already_exists_fault +ClusterSecurityGroupMembership,cluster_security_group_membership +ClusterSecurityGroupMessage,cluster_security_group_message +ClusterSecurityGroupName,cluster_security_group_name +ClusterSecurityGroupNotFoundFault,cluster_security_group_not_found_fault +ClusterSecurityGroupQuotaExceededFault,cluster_security_group_quota_exceeded_fault +ClusterSecurityGroups,cluster_security_groups +ClusterServiceConnectDefaults,cluster_service_connect_defaults +ClusterServiceConnectDefaultsRequest,cluster_service_connect_defaults_request +ClusterSetting,cluster_setting +ClusterSettings,cluster_settings +ClusterSnapshot,cluster_snapshot +ClusterSnapshotAlreadyExistsFault,cluster_snapshot_already_exists_fault +ClusterSnapshotCopyStatus,cluster_snapshot_copy_status +ClusterSnapshotInList,cluster_snapshot_in_list +ClusterSnapshotNotFoundFault,cluster_snapshot_not_found_fault +ClusterSnapshotQuotaExceededFault,cluster_snapshot_quota_exceeded_fault +ClusterState,cluster_state +ClusterStateChangeReason,cluster_state_change_reason +ClusterStates,cluster_states +ClusterStatus,cluster_status +ClusterSubnetGroup,cluster_subnet_group +ClusterSubnetGroupAlreadyExistsFault,cluster_subnet_group_already_exists_fault +ClusterSubnetGroupMessage,cluster_subnet_group_message +ClusterSubnetGroupName,cluster_subnet_group_name +ClusterSubnetGroupNotFoundFault,cluster_subnet_group_not_found_fault +ClusterSubnetGroupQuotaExceededFault,cluster_subnet_group_quota_exceeded_fault +ClusterSubnetGroups,cluster_subnet_groups +ClusterSubnetQuotaExceededFault,cluster_subnet_quota_exceeded_fault +ClusterSummary,cluster_summary +ClusterTimeline,cluster_timeline +ClusterType,cluster_type +ClusterTypeFilter,cluster_type_filter +ClusterUuid,cluster_uuid +ClusterVersion,cluster_version +ClusterVersions,cluster_versions +ClusterVersionsMessage,cluster_versions_message +ClusteringKey,clustering_key +Clusters,clusters +ClustersMessage,clusters_message +CmafAdditionalManifest,cmaf_additional_manifest +CmafEncryption,cmaf_encryption +CmafEncryptionMethod,cmaf_encryption_method +CmafEncryptionSettings,cmaf_encryption_settings +CmafGroupSettings,cmaf_group_settings +CmafImageBasedTrickPlaySettings,cmaf_image_based_trick_play_settings +CmafPackage,cmaf_package +CmafPackageCreateOrUpdateParameters,cmaf_package_create_or_update_parameters +CmfcSettings,cmfc_settings +CmkArn,cmk_arn +CmkType,cmk_type +Cname,cname +CoIp,co_ip +Code,code +CodeArtifacts,code_artifacts +CodeBlock,code_block +CodeBuildNotInServiceRegionException,code_build_not_in_service_region_exception +CodeBuildServiceRole,code_build_service_role +CodeCommit,code_commit +CodeCommitCodeDestination,code_commit_code_destination +CodeCommitRepository,code_commit_repository +CodeConfiguration,code_configuration +CodeConfigurationValues,code_configuration_values +CodeContent,code_content +CodeContentDescription,code_content_description +CodeContentType,code_content_type +CodeContentTypeUpdate,code_content_type_update +CodeContentUpdate,code_content_update +CodeCoverage,code_coverage +CodeCoverageReportSummary,code_coverage_report_summary +CodeDeliveryDetails,code_delivery_details +CodeDeliveryDetailsList,code_delivery_details_list +CodeDeliveryDetailsType,code_delivery_details_type +CodeDeliveryFailureException,code_delivery_failure_exception +CodeDeployApplication,code_deploy_application +CodeDeployDeploymentGroup,code_deploy_deployment_group +CodeDeployDeploymentId,code_deploy_deployment_id +CodeDeployInstanceGroupId,code_deploy_instance_group_id +CodeDeployState,code_deploy_state +CodeDestination,code_destination +CodeError,code_error +CodeErrorLocation,code_error_location +CodeFilePath,code_file_path +CodeGenConfigurationNode,code_gen_configuration_node +CodeGenConfigurationNodes,code_gen_configuration_nodes +CodeGenEdge,code_gen_edge +CodeGenNode,code_gen_node +CodeGenNodeArg,code_gen_node_arg +CodeHook,code_hook +CodeHookSpecification,code_hook_specification +CodeLength,code_length +CodeLine,code_line +CodeLineCount,code_line_count +CodeMD5,code_md5 +CodeMismatchException,code_mismatch_exception +CodeRepositories,code_repositories +CodeRepository,code_repository +CodeRepositoryArn,code_repository_arn +CodeRepositoryName,code_repository_name +CodeRepositorySummary,code_repository_summary +CodeRepositorySummaryList,code_repository_summary_list +CodeReview,code_review +CodeReviewArn,code_review_arn +CodeReviewSummaries,code_review_summaries +CodeReviewSummary,code_review_summary +CodeReviewType,code_review_type +CodeSha256,code_sha256 +CodeSigning,code_signing +CodeSigningCertificateChain,code_signing_certificate_chain +CodeSigningConfig,code_signing_config +CodeSigningConfigArn,code_signing_config_arn +CodeSigningConfigId,code_signing_config_id +CodeSigningConfigNotFoundException,code_signing_config_not_found_exception +CodeSigningConfigs,code_signing_configs +CodeSigningPolicies,code_signing_policies +CodeSigningSignature,code_signing_signature +CodeSize,code_size +CodeSizeUnzipped,code_size_unzipped +CodeSizeZipped,code_size_zipped +CodeSnippetError,code_snippet_error +CodeSnippetResult,code_snippet_result +CodeSource,code_source +CodeStar,code_star +CodeStarParameters,code_star_parameters +CodeStorageExceededException,code_storage_exceeded_exception +CodeValidationException,code_validation_exception +CodeVerificationFailedException,code_verification_failed_exception +CodeVulnerabilities,code_vulnerabilities +CodeVulnerabilitiesFilePath,code_vulnerabilities_file_path +CodeVulnerabilityDetails,code_vulnerability_details +Codec,codec +CodecLevel,codec_level +CodecOptions,codec_options +CodecProfile,codec_profile +CodecSettings,codec_settings +CodecSpecification,codec_specification +CodegenDependency,codegen_dependency +CodegenFeatureFlags,codegen_feature_flags +CodegenGenericDataEnum,codegen_generic_data_enum +CodegenGenericDataField,codegen_generic_data_field +CodegenGenericDataModel,codegen_generic_data_model +CodegenGenericDataNonModel,codegen_generic_data_non_model +CodegenGenericDataRelationshipType,codegen_generic_data_relationship_type +CodegenJob,codegen_job +CodegenJobAsset,codegen_job_asset +CodegenJobGenericDataSchema,codegen_job_generic_data_schema +CodegenJobSummary,codegen_job_summary +CodingMode,coding_mode +CognitoConfig,cognito_config +CognitoEnabled,cognito_enabled +CognitoIdentityProvider,cognito_identity_provider +CognitoIdentityProviders,cognito_identity_providers +CognitoMemberDefinition,cognito_member_definition +CognitoOptions,cognito_options +CognitoOptionsStatus,cognito_options_status +CognitoStreams,cognito_streams +CognitoUserPoolConfig,cognito_user_pool_config +CognitoUserPoolConfiguration,cognito_user_pool_configuration +CognitoUserPoolId,cognito_user_pool_id +CohortId,cohort_id +CoipAddressUsage,coip_address_usage +CoipAddressUsages,coip_address_usages +CoipCidr,coip_cidr +CoipPool,coip_pool +CoipPoolId,coip_pool_id +CoipPools,coip_pools +ColdStorageOptions,cold_storage_options +Collaboration,collaboration +CollaborationAnalysisTemplate,collaboration_analysis_template +CollaborationAnalysisTemplateSummary,collaboration_analysis_template_summary +CollaborationSummary,collaboration_summary +CollapseId,collapse_id +CollapseKey,collapse_key +CollapseStateOptions,collapse_state_options +CollapsedRowDimensionsVisibility,collapsed_row_dimensions_visibility +Collection,collection +CollectionARN,collection_arn +CollectionArn,collection_arn +CollectionConfig,collection_config +CollectionConfiguration,collection_configuration +CollectionConfigurations,collection_configurations +CollectionDetail,collection_detail +CollectionDurationMinutes,collection_duration_minutes +CollectionEndpoint,collection_endpoint +CollectionErrorDetail,collection_error_detail +CollectionFilters,collection_filters +CollectionId,collection_id +CollectionIds,collection_ids +CollectionName,collection_name +CollectionParameters,collection_parameters +CollectionSummary,collection_summary +CollectionType,collection_type +CollectionVersion,collection_version +Collections,collections +CollectiveConstant,collective_constant +Collector,collector +CollectorHealthCheck,collector_health_check +CollectorName,collector_name +CollectorNotFoundFault,collector_not_found_fault +CollectorReferencedId,collector_referenced_id +CollectorResponse,collector_response +CollectorShortInfoResponse,collector_short_info_response +CollectorStatus,collector_status +CollectorVersion,collector_version +Collectors,collectors +Color,color +ColorAxis,color_axis +ColorCorrector,color_corrector +ColorFillType,color_fill_type +ColorItemsLimit,color_items_limit +ColorItemsLimitConfiguration,color_items_limit_configuration +ColorLabelOptions,color_label_options +ColorMap,color_map +ColorMetadata,color_metadata +ColorRange,color_range +ColorScale,color_scale +ColorSort,color_sort +ColorSpace,color_space +ColorSpaceConversion,color_space_conversion +ColorSpacePassthroughSettings,color_space_passthrough_settings +ColorSpaceSettings,color_space_settings +ColorSpaceUsage,color_space_usage +Colorimetry,colorimetry +Colors,colors +ColorsConfiguration,colors_configuration +Column,column +ColumnConfiguration,column_configuration +ColumnConfigurations,column_configurations +ColumnDataRole,column_data_role +ColumnDefinition,column_definition +ColumnDepth,column_depth +ColumnDescription,column_description +ColumnError,column_error +ColumnFormat,column_format +ColumnFriendlyName,column_friendly_name +ColumnGeographicRole,column_geographic_role +ColumnGroup,column_group +ColumnGroupColumnSchema,column_group_column_schema +ColumnGroupColumnSchemaList,column_group_column_schema_list +ColumnGroupSchema,column_group_schema +ColumnGroupSchemaList,column_group_schema_list +ColumnGroups,column_groups +ColumnHeaderStyle,column_header_style +ColumnHierarchies,column_hierarchies +ColumnHierarchy,column_hierarchy +ColumnId,column_id +ColumnIdentifier,column_identifier +ColumnImportance,column_importance +ColumnImportances,column_importances +ColumnIndex,column_index +ColumnInfo,column_info +ColumnLFTag,column_lf_tag +ColumnLabelOptions,column_label_options +ColumnLevelPermissionRule,column_level_permission_rule +ColumnLevelPermissionRules,column_level_permission_rules +ColumnLevelPermissionRulesApplied,column_level_permission_rules_applied +ColumnList,column_list +ColumnMetadata,column_metadata +ColumnName,column_name +ColumnNames,column_names +ColumnNamesVisibility,column_names_visibility +ColumnRange,column_range +ColumnRowFilter,column_row_filter +ColumnSchema,column_schema +ColumnSchemaList,column_schema_list +ColumnSelector,column_selector +ColumnSelectors,column_selectors +ColumnSeparator,column_separator +ColumnSort,column_sort +ColumnSpan,column_span +ColumnStatistics,column_statistics +ColumnStatisticsConfiguration,column_statistics_configuration +ColumnStatisticsConfigurations,column_statistics_configurations +ColumnStatisticsData,column_statistics_data +ColumnStatisticsError,column_statistics_error +ColumnStatisticsList,column_statistics_list +ColumnSubtotalOptions,column_subtotal_options +ColumnSynonyms,column_synonyms +ColumnTag,column_tag +ColumnToJsonKeyMappings,column_to_json_key_mappings +ColumnToMatch,column_to_match +ColumnTooltipItem,column_tooltip_item +ColumnTotalOptions,column_total_options +ColumnType,column_type +ColumnWildcard,column_wildcard +Columns,columns +ComboChartAggregatedFieldWells,combo_chart_aggregated_field_wells +ComboChartConfiguration,combo_chart_configuration +ComboChartFieldWells,combo_chart_field_wells +ComboChartSortConfiguration,combo_chart_sort_configuration +ComboChartVisual,combo_chart_visual +Command,command +CommandFilter,command_filter +CommandId,command_id +CommandIds,command_ids +CommandInvocation,command_invocation +CommandInvocations,command_invocations +CommandPlugin,command_plugin +CommandPlugins,command_plugins +Commands,commands +Comment,comment +CommentContent,comment_content +CommentContentRequiredException,comment_content_required_exception +CommentContentSizeLimitExceededException,comment_content_size_limit_exceeded_exception +CommentDeletedException,comment_deleted_exception +CommentDoesNotExistException,comment_does_not_exist_exception +CommentFieldMappings,comment_field_mappings +CommentId,comment_id +CommentIdRequiredException,comment_id_required_exception +CommentMetadata,comment_metadata +CommentNotCreatedByCallerException,comment_not_created_by_caller_exception +CommentStatus,comment_status +Comments,comments +CommentsForComparedCommit,comments_for_compared_commit +CommentsForPullRequest,comments_for_pull_request +Commit,commit +CommitDiff,commit_diff +CommitDiffSourceCodeType,commit_diff_source_code_type +CommitDigest,commit_digest +CommitDoesNotExistException,commit_does_not_exist_exception +CommitId,commit_id +CommitIdDoesNotExistException,commit_id_does_not_exist_exception +CommitIdRequiredException,commit_id_required_exception +CommitIdsLimitExceededException,commit_ids_limit_exceeded_exception +CommitIdsListRequiredException,commit_ids_list_required_exception +CommitMessage,commit_message +CommitMessageLengthExceededException,commit_message_length_exceeded_exception +CommitRequiredException,commit_required_exception +CommitTransaction,commit_transaction +CommitTransactionRequest,commit_transaction_request +CommitTransactionResponse,commit_transaction_response +CommitTransactionResult,commit_transaction_result +Commitment,commitment +CommitmentConfiguration,commitment_configuration +CommitmentInformation,commitment_information +CommonAttributes,common_attributes +CommonName,common_name +CommonPrefix,common_prefix +CommonPrefixes,common_prefixes +CommsProtocol,comms_protocol +Communication,communication +CommunicationTypeOptions,communication_type_options +CompUpdate,comp_update +Company,company +CompanyCode,company_code +CompanyName,company_name +ComparativeOrder,comparative_order +Comparator,comparator +CompareFacesMatch,compare_faces_match +CompareFacesRequest,compare_faces_request +CompareFacesResponse,compare_faces_response +ComparedFace,compared_face +ComparedSourceImageFace,compared_source_image_face +Comparison,comparison +ComparisonConfiguration,comparison_configuration +ComparisonFormat,comparison_format +ComparisonFormatConfiguration,comparison_format_configuration +ComparisonMethod,comparison_method +ComparisonOperator,comparison_operator +ComparisonType,comparison_type +ComparisonValue,comparison_value +ComparisonValues,comparison_values +Compatibility,compatibility +CompatibleArchitecture,compatible_architecture +CompatibleArchitectures,compatible_architectures +CompatibleElasticsearchVersions,compatible_elasticsearch_versions +CompatibleEnvironmentTemplate,compatible_environment_template +CompatibleEnvironmentTemplateInput,compatible_environment_template_input +CompatibleImage,compatible_image +CompatibleImages,compatible_images +CompatibleKafkaVersion,compatible_kafka_version +CompatibleKafkaVersions,compatible_kafka_versions +CompatibleNodes,compatible_nodes +CompatibleRuntime,compatible_runtime +CompatibleRuntimes,compatible_runtimes +CompatibleVersions,compatible_versions +CompatibleVersionsMap,compatible_versions_map +CompilationEndTime,compilation_end_time +CompilationJobArn,compilation_job_arn +CompilationJobName,compilation_job_name +CompilationJobStatus,compilation_job_status +CompilationJobSummaries,compilation_job_summaries +CompilationJobSummary,compilation_job_summary +CompilationStartTime,compilation_start_time +CompilationTargetDevice,compilation_target_device +CompilationTargetPlatformAccelerator,compilation_target_platform_accelerator +CompilationTargetPlatformArch,compilation_target_platform_arch +CompilationTargetPlatformOs,compilation_target_platform_os +CompiledOutputConfig,compiled_output_config +CompilerOptions,compiler_options +Complaint,complaint +ComplaintFeedbackType,complaint_feedback_type +ComplaintSubType,complaint_sub_type +ComplaintTopic,complaint_topic +Complaints,complaints +Complete,complete +CompleteAttachmentUploadRequest,complete_attachment_upload_request +CompleteLayerUploadRequest,complete_layer_upload_request +CompleteLayerUploadResponse,complete_layer_upload_response +CompleteLifecycleActionType,complete_lifecycle_action_type +CompleteMigrationMessage,complete_migration_message +CompleteMigrationResponse,complete_migration_response +CompleteMultipartReadSetUploadRequest,complete_multipart_read_set_upload_request +CompleteMultipartReadSetUploadResponse,complete_multipart_read_set_upload_response +CompleteMultipartUploadInput,complete_multipart_upload_input +CompleteMultipartUploadOutput,complete_multipart_upload_output +CompleteMultipartUploadRequest,complete_multipart_upload_request +CompleteOnConvergence,complete_on_convergence +CompleteReadSetUploadPartListItem,complete_read_set_upload_part_list_item +CompleteSnapshotRequest,complete_snapshot_request +CompleteSnapshotResponse,complete_snapshot_response +CompleteTime,complete_time +CompleteVaultLockInput,complete_vault_lock_input +CompleteWindowMinutes,complete_window_minutes +CompleteWorkflowExecutionDecisionAttributes,complete_workflow_execution_decision_attributes +CompleteWorkflowExecutionFailedEventAttributes,complete_workflow_execution_failed_event_attributes +Completed,completed +CompletedAt,completed_at +CompletedCount,completed_count +CompletedDate,completed_date +CompletedMultipartUpload,completed_multipart_upload +CompletedOn,completed_on +CompletedPart,completed_part +CompletedPieces,completed_pieces +CompletedProperties,completed_properties +CompletedTimestamp,completed_timestamp +CompletionCriteria,completion_criteria +CompletionDate,completion_date +CompletionDateTime,completion_date_time +CompletionMessage,completion_message +CompletionReport,completion_report +CompletionStatus,completion_status +CompletionTime,completion_time +CompletionWindowMinutes,completion_window_minutes +Complexity,complexity +Compliance,compliance +ComplianceAssociatedStandardsId,compliance_associated_standards_id +ComplianceByConfigRule,compliance_by_config_rule +ComplianceByConfigRules,compliance_by_config_rules +ComplianceByResource,compliance_by_resource +ComplianceByResources,compliance_by_resources +ComplianceContributorCount,compliance_contributor_count +ComplianceDetails,compliance_details +ComplianceDrift,compliance_drift +ComplianceExecutionSummary,compliance_execution_summary +ComplianceItem,compliance_item +ComplianceItemEntry,compliance_item_entry +ComplianceItems,compliance_items +ComplianceLevel,compliance_level +ComplianceResourceId,compliance_resource_id +ComplianceResourceIds,compliance_resource_ids +ComplianceResourceType,compliance_resource_type +ComplianceResourceTypes,compliance_resource_types +ComplianceSecurityControlId,compliance_security_control_id +ComplianceSeverity,compliance_severity +ComplianceStatus,compliance_status +ComplianceStringFilter,compliance_string_filter +ComplianceSummariesByResourceType,compliance_summaries_by_resource_type +ComplianceSummary,compliance_summary +ComplianceSummaryByResourceType,compliance_summary_by_resource_type +ComplianceSummaryItem,compliance_summary_item +ComplianceSummaryItems,compliance_summary_items +ComplianceSummaryTimestamp,compliance_summary_timestamp +ComplianceType,compliance_type +ComplianceTypeCountLimitExceededException,compliance_type_count_limit_exceeded_exception +ComplianceTypes,compliance_types +ComplianceViolator,compliance_violator +CompliantConformancePackCount,compliant_conformance_pack_count +CompliantCount,compliant_count +CompliantCriticalCount,compliant_critical_count +CompliantHighCount,compliant_high_count +CompliantInformationalCount,compliant_informational_count +CompliantLowCount,compliant_low_count +CompliantMediumCount,compliant_medium_count +CompliantResourceCount,compliant_resource_count +CompliantRuleCount,compliant_rule_count +CompliantSummary,compliant_summary +CompliantUnspecifiedCount,compliant_unspecified_count +Component,component +ComponentAccount,component_account +ComponentArn,component_arn +ComponentBindingPropertiesValue,component_binding_properties_value +ComponentBindingPropertiesValueProperties,component_binding_properties_value_properties +ComponentCandidate,component_candidate +ComponentChild,component_child +ComponentConditionProperty,component_condition_property +ComponentConfiguration,component_configuration +ComponentConfigurationUpdate,component_configuration_update +ComponentDataConfiguration,component_data_configuration +ComponentDependencyRequirement,component_dependency_requirement +ComponentDeploymentSpecification,component_deployment_specification +ComponentDescription,component_description +ComponentEvent,component_event +ComponentId,component_id +ComponentLatestVersion,component_latest_version +ComponentName,component_name +ComponentParameter,component_parameter +ComponentParameterDetail,component_parameter_detail +ComponentPlatform,component_platform +ComponentProperty,component_property +ComponentPropertyBindingProperties,component_property_binding_properties +ComponentPropertyGroupRequest,component_property_group_request +ComponentPropertyGroupResponse,component_property_group_response +ComponentRecommendation,component_recommendation +ComponentRegion,component_region +ComponentRemarks,component_remarks +ComponentRequest,component_request +ComponentResponse,component_response +ComponentRunWith,component_run_with +ComponentState,component_state +ComponentStatusData,component_status_data +ComponentSummary,component_summary +ComponentTimestampDelimiter,component_timestamp_delimiter +ComponentType,component_type +ComponentTypeSummary,component_type_summary +ComponentUpdateRequest,component_update_request +ComponentVariant,component_variant +ComponentVersion,component_version +ComponentVersionArn,component_version_arn +ComponentVersionListItem,component_version_list_item +Components,components +ComposeEnvironmentsMessage,compose_environments_message +CompositeAlarm,composite_alarm +CompositeAlarms,composite_alarms +CompositeMemberIdentifier,composite_member_identifier +CompositeModelProperty,composite_model_property +CompositePartitionKey,composite_partition_key +CompositeSlotTypeSetting,composite_slot_type_setting +CompositedVideo,composited_video +CompositedVideoArtifactsConfiguration,composited_video_artifacts_configuration +CompositedVideoConcatenationConfiguration,composited_video_concatenation_configuration +Composition,composition +ComprehendMedicalAsyncJobFilter,comprehend_medical_async_job_filter +ComprehendMedicalAsyncJobProperties,comprehend_medical_async_job_properties +ComprehendMedicalAsyncJobPropertiesList,comprehend_medical_async_job_properties_list +Compress,compress +Compressed,compressed +Compression,compression +CompressionFactor,compression_factor +CompressionFormat,compression_format +CompressionType,compression_type +CompromisedCredentialsActionsType,compromised_credentials_actions_type +CompromisedCredentialsDetected,compromised_credentials_detected +CompromisedCredentialsRiskConfiguration,compromised_credentials_risk_configuration +CompromisedCredentialsRiskConfigurationType,compromised_credentials_risk_configuration_type +Computation,computation +ComputationId,computation_id +ComputationPreference,computation_preference +Computations,computations +Compute,compute +ComputeArn,compute_arn +ComputeAttributes,compute_attributes +ComputeCapacity,compute_capacity +ComputeCapacityStatus,compute_capacity_status +ComputeConfig,compute_config +ComputeEnvironmentDetail,compute_environment_detail +ComputeEnvironmentOrder,compute_environment_order +ComputeFarmConfiguration,compute_farm_configuration +ComputeLimits,compute_limits +ComputeList,compute_list +ComputeName,compute_name +ComputeResource,compute_resource +ComputeResourceUpdate,compute_resource_update +ComputeResponse,compute_response +ComputeStatistics,compute_statistics +ComputeStatus,compute_status +ComputeTime,compute_time +ComputeType,compute_type +ComputeTypeName,compute_type_name +ComputeUtilization,compute_utilization +Computer,computer +ComputerAttributes,computer_attributes +ComputerId,computer_id +ComputerName,computer_name +ConcatenationSink,concatenation_sink +ConcatenationSource,concatenation_source +Concurrency,concurrency +ConcurrentAccessException,concurrent_access_exception +ConcurrentDeploymentException,concurrent_deployment_exception +ConcurrentExecutionRatePercentage,concurrent_execution_rate_percentage +ConcurrentExecutions,concurrent_executions +ConcurrentLimitExceededException,concurrent_limit_exceeded_exception +ConcurrentModification,concurrent_modification +ConcurrentModificationException,concurrent_modification_exception +ConcurrentOperationException,concurrent_operation_exception +ConcurrentReferenceUpdateException,concurrent_reference_update_exception +ConcurrentRunsExceededException,concurrent_runs_exceeded_exception +ConcurrentUpdateException,concurrent_update_exception +ConcurrentUpdatingException,concurrent_updating_exception +Condition,condition +ConditionBasedCollectionScheme,condition_based_collection_scheme +ConditionCheck,condition_check +ConditionCheckFailureException,condition_check_failure_exception +ConditionDocumentAttributeKey,condition_document_attribute_key +ConditionExpression,condition_expression +ConditionExpressions,condition_expressions +ConditionKey,condition_key +ConditionOnValue,condition_on_value +ConditionParameter,condition_parameter +ConditionStepMetadata,condition_step_metadata +ConditionType,condition_type +ConditionValue,condition_value +ConditionalBranch,conditional_branch +ConditionalCheckFailedException,conditional_check_failed_exception +ConditionalFormatting,conditional_formatting +ConditionalFormattingColor,conditional_formatting_color +ConditionalFormattingCustomIconCondition,conditional_formatting_custom_icon_condition +ConditionalFormattingCustomIconOptions,conditional_formatting_custom_icon_options +ConditionalFormattingGradientColor,conditional_formatting_gradient_color +ConditionalFormattingIcon,conditional_formatting_icon +ConditionalFormattingIconDisplayConfiguration,conditional_formatting_icon_display_configuration +ConditionalFormattingIconSet,conditional_formatting_icon_set +ConditionalFormattingOptions,conditional_formatting_options +ConditionalFormattingSolidColor,conditional_formatting_solid_color +ConditionalForwarder,conditional_forwarder +ConditionalForwarderIpAddrs,conditional_forwarder_ip_addrs +ConditionalForwarders,conditional_forwarders +ConditionalOperator,conditional_operator +ConditionalSpecification,conditional_specification +ConditionalSplit,conditional_split +ConditionalSplitActivity,conditional_split_activity +ConditionalToken,conditional_token +Conditions,conditions +ConferencePreference,conference_preference +ConferenceProvider,conference_provider +ConferenceProviderArn,conference_provider_arn +ConferenceProviderName,conference_provider_name +ConferenceProviderType,conference_provider_type +ConferenceProviders,conference_providers +Confidence,confidence +ConfidenceScore,confidence_score +Config,config +ConfigCred,config_cred +ConfigDeliveryS3DestinationArn,config_delivery_s3_destination_arn +ConfigExportDeliveryInfo,config_export_delivery_info +ConfigFile,config_file +ConfigFileState,config_file_state +ConfigId,config_id +ConfigIdResponse,config_id_response +ConfigListItem,config_list_item +ConfigParameter,config_parameter +ConfigRecommendation,config_recommendation +ConfigRule,config_rule +ConfigRuleArn,config_rule_arn +ConfigRuleComplianceFilters,config_rule_compliance_filters +ConfigRuleComplianceSummaryFilters,config_rule_compliance_summary_filters +ConfigRuleEvaluationStatus,config_rule_evaluation_status +ConfigRuleId,config_rule_id +ConfigRuleInvokedTime,config_rule_invoked_time +ConfigRuleName,config_rule_name +ConfigRuleNames,config_rule_names +ConfigRuleState,config_rule_state +ConfigRules,config_rules +ConfigRulesEvaluationStatus,config_rules_evaluation_status +ConfigSnapshotDeliveryProperties,config_snapshot_delivery_properties +ConfigStreamDeliveryInfo,config_stream_delivery_info +ConfigType,config_type +ConfigUri,config_uri +Configuration,configuration +ConfigurationAggregator,configuration_aggregator +ConfigurationAggregatorArn,configuration_aggregator_arn +ConfigurationAggregatorName,configuration_aggregator_name +ConfigurationAggregatorNames,configuration_aggregator_names +ConfigurationAggregators,configuration_aggregators +ConfigurationAlias,configuration_alias +ConfigurationAliases,configuration_aliases +ConfigurationArn,configuration_arn +ConfigurationEndpoint,configuration_endpoint +ConfigurationErrorDetails,configuration_error_details +ConfigurationEvent,configuration_event +ConfigurationException,configuration_exception +ConfigurationId,configuration_id +ConfigurationInfo,configuration_info +ConfigurationItem,configuration_item +ConfigurationLocationUri,configuration_location_uri +ConfigurationManager,configuration_manager +ConfigurationManagers,configuration_managers +ConfigurationName,configuration_name +ConfigurationOptionDescription,configuration_option_description +ConfigurationOptionSetting,configuration_option_setting +ConfigurationOptionsDescription,configuration_options_description +ConfigurationOverrides,configuration_overrides +ConfigurationProfile,configuration_profile +ConfigurationProfileId,configuration_profile_id +ConfigurationProfileIdentifier,configuration_profile_identifier +ConfigurationProfileSummary,configuration_profile_summary +ConfigurationProfiles,configuration_profiles +ConfigurationRecorder,configuration_recorder +ConfigurationRecorderName,configuration_recorder_name +ConfigurationRecorderNames,configuration_recorder_names +ConfigurationRecorderStatus,configuration_recorder_status +ConfigurationRecorders,configuration_recorders +ConfigurationRecordersStatus,configuration_recorders_status +ConfigurationRevision,configuration_revision +ConfigurationSchema,configuration_schema +ConfigurationSet,configuration_set +ConfigurationSetAlreadyExistsException,configuration_set_already_exists_exception +ConfigurationSetArn,configuration_set_arn +ConfigurationSetAttributeNames,configuration_set_attribute_names +ConfigurationSetDoesNotExistException,configuration_set_does_not_exist_exception +ConfigurationSetFilter,configuration_set_filter +ConfigurationSetInformation,configuration_set_information +ConfigurationSetName,configuration_set_name +ConfigurationSetNames,configuration_set_names +ConfigurationSetSendingPausedException,configuration_set_sending_paused_exception +ConfigurationSets,configuration_sets +ConfigurationSettings,configuration_settings +ConfigurationSettingsDescription,configuration_settings_description +ConfigurationSettingsDescriptions,configuration_settings_descriptions +ConfigurationSettingsValidationMessages,configuration_settings_validation_messages +ConfigurationSource,configuration_source +ConfigurationStatus,configuration_status +ConfigurationSummary,configuration_summary +ConfigurationSyncStateSummary,configuration_sync_state_summary +ConfigurationSyncStatus,configuration_sync_status +ConfigurationTag,configuration_tag +ConfigurationTemplateQuota,configuration_template_quota +ConfigurationTemplates,configuration_templates +ConfigurationToken,configuration_token +ConfigurationType,configuration_type +ConfigurationTypeUpdate,configuration_type_update +ConfigurationUpdate,configuration_update +ConfigurationUpdates,configuration_updates +ConfigurationVersion,configuration_version +Configurations,configurations +ConfigurationsVersion,configurations_version +Configure,configure +ConfigureAccessPointRequest,configure_access_point_request +ConfigureAccessPointResponse,configure_access_point_response +ConfigureAgentRequest,configure_agent_request +ConfigureAgentResponse,configure_agent_response +ConfigureHealthCheckInput,configure_health_check_input +ConfigureHealthCheckOutput,configure_health_check_output +ConfigureLogsForChannelRequest,configure_logs_for_channel_request +ConfigureLogsForChannelResponse,configure_logs_for_channel_response +ConfigureLogsForPlaybackConfigurationRequest,configure_logs_for_playback_configuration_request +ConfigureLogsForPlaybackConfigurationResponse,configure_logs_for_playback_configuration_response +ConfigureLogsRequest,configure_logs_request +ConfigureLogsResponse,configure_logs_response +ConfigureShard,configure_shard +Configured,configured +ConfiguredDataNodeCount,configured_data_node_count +ConfiguredInput,configured_input +ConfiguredTable,configured_table +ConfiguredTableAnalysisRule,configured_table_analysis_rule +ConfiguredTableAssociation,configured_table_association +ConfiguredTableAssociationSummary,configured_table_association_summary +ConfiguredTableSummary,configured_table_summary +ConfirmConnectionRequest,confirm_connection_request +ConfirmConnectionResponse,confirm_connection_response +ConfirmCustomerAgreementRequest,confirm_customer_agreement_request +ConfirmCustomerAgreementResponse,confirm_customer_agreement_response +ConfirmDeviceRequest,confirm_device_request +ConfirmDeviceResponse,confirm_device_response +ConfirmForgotPasswordRequest,confirm_forgot_password_request +ConfirmPrivateVirtualInterfaceRequest,confirm_private_virtual_interface_request +ConfirmPrivateVirtualInterfaceResponse,confirm_private_virtual_interface_response +ConfirmProductInstanceRequest,confirm_product_instance_request +ConfirmProductInstanceResult,confirm_product_instance_result +ConfirmPublicVirtualInterfaceRequest,confirm_public_virtual_interface_request +ConfirmPublicVirtualInterfaceResponse,confirm_public_virtual_interface_response +ConfirmRemoveSelfBucketAccess,confirm_remove_self_bucket_access +ConfirmSignUpRequest,confirm_sign_up_request +ConfirmSubscriptionInput,confirm_subscription_input +ConfirmSubscriptionResponse,confirm_subscription_response +ConfirmTopicRuleDestinationRequest,confirm_topic_rule_destination_request +ConfirmTransitVirtualInterfaceRequest,confirm_transit_virtual_interface_request +ConfirmTransitVirtualInterfaceResponse,confirm_transit_virtual_interface_response +ConfirmationCode,confirmation_code +ConfirmationRequired,confirmation_required +Conflict,conflict +ConflictErrorException,conflict_error_exception +ConflictException,conflict_exception +ConflictExceptionErrorArgument,conflict_exception_error_argument +ConflictExceptionType,conflict_exception_type +ConflictMetadata,conflict_metadata +ConflictResolution,conflict_resolution +ConflictResolvingModel,conflict_resolving_model +ConflictResource,conflict_resource +ConflictType,conflict_type +ConflictingAlias,conflicting_alias +ConflictingAliasesList,conflicting_aliases_list +ConflictingDomainExists,conflicting_domain_exists +ConflictingItem,conflicting_item +ConflictingItems,conflicting_items +ConflictingOperationException,conflicting_operation_exception +ConflictingPolicyId,conflicting_policy_id +ConflictingPriority,conflicting_priority +ConflictingResourceUpdateException,conflicting_resource_update_exception +ConflictingTypes,conflicting_types +ConfluenceAttachmentConfiguration,confluence_attachment_configuration +ConfluenceAttachmentToIndexFieldMapping,confluence_attachment_to_index_field_mapping +ConfluenceBlogConfiguration,confluence_blog_configuration +ConfluenceBlogToIndexFieldMapping,confluence_blog_to_index_field_mapping +ConfluenceConfiguration,confluence_configuration +ConfluencePageConfiguration,confluence_page_configuration +ConfluencePageToIndexFieldMapping,confluence_page_to_index_field_mapping +ConfluenceSpaceConfiguration,confluence_space_configuration +ConfluenceSpaceToIndexFieldMapping,confluence_space_to_index_field_mapping +ConformancePackArn,conformance_pack_arn +ConformancePackComplianceFilters,conformance_pack_compliance_filters +ConformancePackComplianceScore,conformance_pack_compliance_score +ConformancePackComplianceScores,conformance_pack_compliance_scores +ConformancePackComplianceScoresFilters,conformance_pack_compliance_scores_filters +ConformancePackComplianceStatus,conformance_pack_compliance_status +ConformancePackComplianceSummary,conformance_pack_compliance_summary +ConformancePackComplianceSummaryList,conformance_pack_compliance_summary_list +ConformancePackDetail,conformance_pack_detail +ConformancePackDetails,conformance_pack_details +ConformancePackEvaluationFilters,conformance_pack_evaluation_filters +ConformancePackEvaluationResult,conformance_pack_evaluation_result +ConformancePackId,conformance_pack_id +ConformancePackInputParameter,conformance_pack_input_parameter +ConformancePackInputParameters,conformance_pack_input_parameters +ConformancePackName,conformance_pack_name +ConformancePackNames,conformance_pack_names +ConformancePackRuleCompliance,conformance_pack_rule_compliance +ConformancePackRuleComplianceList,conformance_pack_rule_compliance_list +ConformancePackRuleEvaluationResults,conformance_pack_rule_evaluation_results +ConformancePackState,conformance_pack_state +ConformancePackStatusDetail,conformance_pack_status_detail +ConformancePackStatusDetails,conformance_pack_status_details +ConformancePackStatusReason,conformance_pack_status_reason +ConformancePackTemplateValidationException,conformance_pack_template_validation_exception +ConfusionMatrix,confusion_matrix +ConnectAppAuthorizationRequest,connect_app_authorization_request +ConnectAppAuthorizationResponse,connect_app_authorization_response +ConnectAttachment,connect_attachment +ConnectAttachmentId,connect_attachment_id +ConnectAttachmentOptions,connect_attachment_options +ConnectCampaignArn,connect_campaign_arn +ConnectCampaignExecutionRoleArn,connect_campaign_execution_role_arn +ConnectClientAddIn,connect_client_add_in +ConnectCustomKeyStoreRequest,connect_custom_key_store_request +ConnectDirectoryRequest,connect_directory_request +ConnectDirectoryResult,connect_directory_result +ConnectIps,connect_ips +ConnectParticipant,connect_participant +ConnectPeer,connect_peer +ConnectPeerAssociation,connect_peer_association +ConnectPeerAssociations,connect_peer_associations +ConnectPeerBgpConfiguration,connect_peer_bgp_configuration +ConnectPeerConfiguration,connect_peer_configuration +ConnectPeerId,connect_peer_id +ConnectPeerIds,connect_peer_ids +ConnectPeerState,connect_peer_state +ConnectPeerSummary,connect_peer_summary +ConnectPeers,connect_peers +ConnectSettings,connect_settings +ConnectedAt,connected_at +ConnectedDatabase,connected_database +ConnectedDeviceCount,connected_device_count +ConnectedDeviceId,connected_device_id +ConnectedDirectoriesCurrentCount,connected_directories_current_count +ConnectedDirectoriesLimit,connected_directories_limit +ConnectedDirectoriesLimitReached,connected_directories_limit_reached +ConnectedHome,connected_home +ConnectedHomeForUpdate,connected_home_for_update +ConnectedHomeSettings,connected_home_settings +ConnectedHomeSettingsForUpdate,connected_home_settings_for_update +ConnectedLinkId,connected_link_id +ConnectedToAgentTimestamp,connected_to_agent_timestamp +Connection,connection +ConnectionAlias,connection_alias +ConnectionAliasAssociation,connection_alias_association +ConnectionAliasPermission,connection_alias_permission +ConnectionAliasPermissions,connection_alias_permissions +ConnectionAliases,connection_aliases +ConnectionApiKeyAuthResponseParameters,connection_api_key_auth_response_parameters +ConnectionArn,connection_arn +ConnectionAttempts,connection_attempts +ConnectionAuthResponseParameters,connection_auth_response_parameters +ConnectionBasicAuthResponseParameters,connection_basic_auth_response_parameters +ConnectionBodyParameter,connection_body_parameter +ConnectionBorrowTimeout,connection_borrow_timeout +ConnectionConfiguration,connection_configuration +ConnectionCredentials,connection_credentials +ConnectionDetails,connection_details +ConnectionDirection,connection_direction +ConnectionDraining,connection_draining +ConnectionEndTime,connection_end_time +ConnectionErrorCode,connection_error_code +ConnectionEstablishedTime,connection_established_time +ConnectionEvents,connection_events +ConnectionExpiry,connection_expiry +ConnectionHeaderParameter,connection_header_parameter +ConnectionHealth,connection_health +ConnectionHttpParameters,connection_http_parameters +ConnectionId,connection_id +ConnectionIdentifier,connection_identifier +ConnectionIds,connection_ids +ConnectionInfo,connection_info +ConnectionInput,connection_input +ConnectionLimitExceededException,connection_limit_exceeded_exception +ConnectionList,connection_list +ConnectionLogOptions,connection_log_options +ConnectionLogResponseOptions,connection_log_response_options +ConnectionLost,connection_lost +ConnectionMode,connection_mode +ConnectionName,connection_name +ConnectionNameList,connection_name_list +ConnectionNotification,connection_notification +ConnectionNotificationArn,connection_notification_arn +ConnectionNotificationId,connection_notification_id +ConnectionNotificationIds,connection_notification_ids +ConnectionNotificationSet,connection_notification_set +ConnectionNotificationState,connection_notification_state +ConnectionNotificationType,connection_notification_type +ConnectionOAuthClientResponseParameters,connection_o_auth_client_response_parameters +ConnectionOAuthResponseParameters,connection_o_auth_response_parameters +ConnectionParameters,connection_parameters +ConnectionPasswordEncryption,connection_password_encryption +ConnectionPoolConfig,connection_pool_config +ConnectionPoolConfiguration,connection_pool_configuration +ConnectionPoolConfigurationInfo,connection_pool_configuration_info +ConnectionProperties,connection_properties +ConnectionQueryStringParameter,connection_query_string_parameter +ConnectionRefusedCount,connection_refused_count +ConnectionRetryInterval,connection_retry_interval +ConnectionSettings,connection_settings +ConnectionState,connection_state +ConnectionStateCheckTimestamp,connection_state_check_timestamp +ConnectionStatus,connection_status +ConnectionStatusEventConfiguration,connection_status_event_configuration +ConnectionStatusResourceTypeEventConfiguration,connection_status_resource_type_event_configuration +ConnectionStatusUpdatedTime,connection_status_updated_time +ConnectionStatuses,connection_statuses +ConnectionString,connection_string +ConnectionSummary,connection_summary +ConnectionSummaryList,connection_summary_list +ConnectionTable,connection_table +ConnectionTimeout,connection_timeout +ConnectionToken,connection_token +ConnectionType,connection_type +Connections,connections +ConnectionsList,connections_list +Connectivity,connectivity +ConnectivityInfo,connectivity_info +ConnectivityStatus,connectivity_status +ConnectivityType,connectivity_type +Connector,connector +ConnectorArn,connector_arn +ConnectorAuthenticationException,connector_authentication_exception +ConnectorConfigRequest,connector_config_request +ConnectorConfigResponse,connector_config_response +ConnectorConfiguration,connector_configuration +ConnectorDefinitionId,connector_definition_id +ConnectorDefinitionVersion,connector_definition_version +ConnectorDefinitionVersionArn,connector_definition_version_arn +ConnectorDefinitionVersionId,connector_definition_version_id +ConnectorDetail,connector_detail +ConnectorEntity,connector_entity +ConnectorEntityField,connector_entity_field +ConnectorFailureException,connector_failure_exception +ConnectorId,connector_id +ConnectorMetadata,connector_metadata +ConnectorName,connector_name +ConnectorOAuthRequest,connector_o_auth_request +ConnectorOperator,connector_operator +ConnectorProfile,connector_profile +ConnectorProfileConfig,connector_profile_config +ConnectorProfileCredentials,connector_profile_credentials +ConnectorProfileName,connector_profile_name +ConnectorProfileProperties,connector_profile_properties +ConnectorProvisioningConfig,connector_provisioning_config +ConnectorRuntimeSetting,connector_runtime_setting +ConnectorServerException,connector_server_exception +ConnectorSummary,connector_summary +ConnectorTimeoutException,connector_timeout_exception +ConnectorType,connector_type +Connectors,connectors +Consent,consent +ConsistencyLevel,consistency_level +ConsistentRead,consistent_read +ConsoleAccess,console_access +ConsoleURL,console_url +ConsolidatedReportMetric,consolidated_report_metric +Consolidation,consolidation +ConsolidationKey,consolidation_key +Constant,constant +ConstantBitrate,constant_bitrate +ConstantInitializationVector,constant_initialization_vector +ConstantIv,constant_iv +ConstantType,constant_type +Constraint,constraint +ConstraintDescription,constraint_description +ConstraintDetail,constraint_detail +ConstraintDetails,constraint_details +ConstraintId,constraint_id +ConstraintParameters,constraint_parameters +ConstraintSummaries,constraint_summaries +ConstraintSummary,constraint_summary +ConstraintViolationException,constraint_violation_exception +Constraints,constraints +ConstraintsResource,constraints_resource +ConsumedCapacity,consumed_capacity +ConsumedIOs,consumed_ios +ConsumedLabels,consumed_labels +ConsumedLicenseSummary,consumed_license_summary +ConsumedLicenseSummaryList,consumed_license_summary_list +ConsumedLicenses,consumed_licenses +ConsumedResources,consumed_resources +ConsumedSpiceCapacityInBytes,consumed_spice_capacity_in_bytes +ConsumedStatefulRuleCapacity,consumed_stateful_rule_capacity +ConsumedStatelessRuleCapacity,consumed_stateless_rule_capacity +ConsumedValue,consumed_value +Consumer,consumer +ConsumerARN,consumer_arn +ConsumerArn,consumer_arn +ConsumerArns,consumer_arns +ConsumerCount,consumer_count +ConsumerCreationTimestamp,consumer_creation_timestamp +ConsumerDescription,consumer_description +ConsumerGroupID,consumer_group_id +ConsumerGroupId,consumer_group_id +ConsumerIdentifier,consumer_identifier +ConsumerName,consumer_name +ConsumerRegion,consumer_region +ConsumerStatus,consumer_status +Consumers,consumers +Consumption,consumption +ConsumptionConfiguration,consumption_configuration +Contact,contact +ContactAgentId,contact_agent_id +ContactArn,contact_arn +ContactCenter,contact_center +ContactCenterActivity,contact_center_activity +ContactChannel,contact_channel +ContactChannelAddress,contact_channel_address +ContactChannelArn,contact_channel_arn +ContactChannelId,contact_channel_id +ContactChannels,contact_channels +ContactContent,contact_content +ContactData,contact_data +ContactDetail,contact_detail +ContactEmail,contact_email +ContactFilter,contact_filter +ContactFlow,contact_flow +ContactFlowArn,contact_flow_arn +ContactFlowId,contact_flow_id +ContactFlowModule,contact_flow_module +ContactFlowModuleId,contact_flow_module_id +ContactFlowModuleState,contact_flow_module_state +ContactFlowModuleSummary,contact_flow_module_summary +ContactFlowModulesSummaryList,contact_flow_modules_summary_list +ContactFlowNotPublishedException,contact_flow_not_published_exception +ContactFlowState,contact_flow_state +ContactFlowSummary,contact_flow_summary +ContactFlowSummaryList,contact_flow_summary_list +ContactFlowType,contact_flow_type +ContactFlowTypes,contact_flow_types +ContactId,contact_id +ContactIdResponse,contact_id_response +ContactIds,contact_ids +ContactInformation,contact_information +ContactLanguage,contact_language +ContactList,contact_list +ContactListDestination,contact_list_destination +ContactListImportAction,contact_list_import_action +ContactListName,contact_list_name +ContactLists,contact_lists +ContactMethod,contact_method +ContactName,contact_name +ContactNotFoundException,contact_not_found_exception +ContactNotes,contact_notes +ContactNumber,contact_number +ContactPhoneNumber,contact_phone_number +ContactStates,contact_states +ContactTargetInfo,contact_target_info +ContactType,contact_type +Contacts,contacts +Container,container +ContainerArguments,container_arguments +ContainerConfig,container_config +ContainerConfiguration,container_configuration +ContainerDatasetAction,container_dataset_action +ContainerDefinition,container_definition +ContainerDefinitions,container_definitions +ContainerDependency,container_dependency +ContainerDetail,container_detail +ContainerDetails,container_details +ContainerDistributionConfiguration,container_distribution_configuration +ContainerEntrypoint,container_entrypoint +ContainerFormat,container_format +ContainerHostname,container_hostname +ContainerImage,container_image +ContainerInUseException,container_in_use_exception +ContainerInstance,container_instance +ContainerInstanceHealthStatus,container_instance_health_status +ContainerLevelMetrics,container_level_metrics +ContainerLogRotationConfiguration,container_log_rotation_configuration +ContainerName,container_name +ContainerNotFoundException,container_not_found_exception +ContainerOverride,container_override +ContainerOverrides,container_overrides +ContainerPath,container_path +ContainerPort,container_port +ContainerProperties,container_properties +ContainerProvider,container_provider +ContainerRecipe,container_recipe +ContainerRecipeSummary,container_recipe_summary +ContainerRecommendation,container_recommendation +ContainerRuntime,container_runtime +ContainerService,container_service +ContainerServiceDeployment,container_service_deployment +ContainerServiceDeploymentRequest,container_service_deployment_request +ContainerServiceECRImagePullerRole,container_service_ecr_image_puller_role +ContainerServiceECRImagePullerRoleRequest,container_service_ecr_image_puller_role_request +ContainerServiceEndpoint,container_service_endpoint +ContainerServiceHealthCheckConfig,container_service_health_check_config +ContainerServiceLogEvent,container_service_log_event +ContainerServicePower,container_service_power +ContainerServiceRegistryLogin,container_service_registry_login +ContainerServiceStateDetail,container_service_state_detail +ContainerServicesListResult,container_services_list_result +ContainerSettings,container_settings +ContainerStartupHealthCheckTimeoutInSeconds,container_startup_health_check_timeout_in_seconds +ContainerStateChange,container_state_change +ContainerSummary,container_summary +ContainerType,container_type +ContainerUrl,container_url +Containers,containers +ContainsAll,contains_all +ContainsAny,contains_any +ContainsHeader,contains_header +ContainsLabels,contains_labels +ContainsOldGroupVersions,contains_old_group_versions +ContainsPiiEntitiesRequest,contains_pii_entities_request +ContainsPiiEntitiesResponse,contains_pii_entities_response +Content,content +ContentArtifactsConfiguration,content_artifacts_configuration +ContentCategories,content_categories +ContentClassifiers,content_classifiers +ContentColumn,content_column +ContentConcatenationConfiguration,content_concatenation_configuration +ContentConfig,content_config +ContentCreatedTimestamp,content_created_timestamp +ContentData,content_data +ContentDigest,content_digest +ContentDisposition,content_disposition +ContentEncoding,content_encoding +ContentHandlingStrategy,content_handling_strategy +ContentHash,content_hash +ContentIdentificationType,content_identification_type +ContentLanguage,content_language +ContentLength,content_length +ContentMD5,content_md5 +ContentModerationDetection,content_moderation_detection +ContentModifiedTimestamp,content_modified_timestamp +ContentRange,content_range +ContentRedaction,content_redaction +ContentRedactionOutput,content_redaction_output +ContentRedactionType,content_redaction_type +ContentReference,content_reference +ContentSHA256,content_sha256 +ContentSecurityPolicy,content_security_policy +ContentSegmentUrlPrefix,content_segment_url_prefix +ContentSha256,content_sha256 +ContentShareLayout,content_share_layout +ContentSourceConfiguration,content_source_configuration +ContentSummary,content_summary +ContentTemplate,content_template +ContentTransformation,content_transformation +ContentType,content_type +ContentTypeOptions,content_type_options +ContentTypeProfile,content_type_profile +ContentTypeProfileConfig,content_type_profile_config +ContentTypeProfiles,content_type_profiles +ContentUrl,content_url +Contents,contents +Context,context +ContextArn,context_arn +ContextAssertion,context_assertion +ContextData,context_data +ContextDataType,context_data_type +ContextEntries,context_entries +ContextEntry,context_entry +ContextId,context_id +ContextKeyName,context_key_name +ContextKeyNames,context_key_names +ContextKeyType,context_key_type +ContextKeyValues,context_key_values +ContextName,context_name +ContextScope,context_scope +ContextScopeType,context_scope_type +ContextSource,context_source +ContextSummaries,context_summaries +ContextSummary,context_summary +ContextType,context_type +ContextWords,context_words +ContinentCode,continent_code +ContinentName,continent_name +ContinuationSequenceNumber,continuation_sequence_number +ContinuationToken,continuation_token +ContinueAsNewWorkflowExecutionDecisionAttributes,continue_as_new_workflow_execution_decision_attributes +ContinueAsNewWorkflowExecutionFailedEventAttributes,continue_as_new_workflow_execution_failed_event_attributes +ContinueDeploymentInput,continue_deployment_input +ContinueUpdateRollbackInput,continue_update_rollback_input +ContinuedFromContactId,continued_from_contact_id +ContinuousBackupsDescription,continuous_backups_description +ContinuousBackupsStatus,continuous_backups_status +ContinuousBackupsUnavailableException,continuous_backups_unavailable_exception +ContinuousDeploymentPolicy,continuous_deployment_policy +ContinuousDeploymentPolicyAlreadyExists,continuous_deployment_policy_already_exists +ContinuousDeploymentPolicyConfig,continuous_deployment_policy_config +ContinuousDeploymentPolicyId,continuous_deployment_policy_id +ContinuousDeploymentPolicyInUse,continuous_deployment_policy_in_use +ContinuousDeploymentPolicyList,continuous_deployment_policy_list +ContinuousDeploymentPolicySummary,continuous_deployment_policy_summary +ContinuousDeploymentSingleHeaderConfig,continuous_deployment_single_header_config +ContinuousDeploymentSingleWeightConfig,continuous_deployment_single_weight_config +ContinuousExportDescription,continuous_export_description +ContinuousHyperParameterRange,continuous_hyper_parameter_range +ContinuousParameterRange,continuous_parameter_range +ContinuousParameterRangeSpecification,continuous_parameter_range_specification +ContinuousParameterRanges,continuous_parameter_ranges +Contrast,contrast +ContributingSubnets,contributing_subnets +ContributionAnalysisDefault,contribution_analysis_default +ContributionAnalysisDefaults,contribution_analysis_defaults +ContributionMatrix,contribution_matrix +ContributionPercentage,contribution_percentage +ContributionScore,contribution_score +Contributor,contributor +ContributorDimensions,contributor_dimensions +ContributorId,contributor_id +ContributorInsightsAction,contributor_insights_action +ContributorInsightsRuleList,contributor_insights_rule_list +ContributorInsightsStatus,contributor_insights_status +ContributorInsightsSummaries,contributor_insights_summaries +ContributorInsightsSummary,contributor_insights_summary +Contributors,contributors +Control,control +ControlComment,control_comment +ControlDomainInsights,control_domain_insights +ControlFindingGenerator,control_finding_generator +ControlId,control_id +ControlInputParameter,control_input_parameter +ControlInputParameters,control_input_parameters +ControlInsightsMetadataByAssessmentItem,control_insights_metadata_by_assessment_item +ControlInsightsMetadataItem,control_insights_metadata_item +ControlMappingSource,control_mapping_source +ControlMetadata,control_metadata +ControlName,control_name +ControlOperation,control_operation +ControlPanel,control_panel +ControlPanelArn,control_panel_arn +ControlPanelName,control_panel_name +ControlPanels,control_panels +ControlPlanePlacementRequest,control_plane_placement_request +ControlPlanePlacementResponse,control_plane_placement_response +ControlPlaneTagFilter,control_plane_tag_filter +ControlScope,control_scope +ControlSet,control_set +ControlStatus,control_status +ControlStatusUpdatedAt,control_status_updated_at +ControlTablesFileGroup,control_tables_file_group +Controls,controls +ConvergenceDetected,convergence_detected +ConvergenceDetectedTime,convergence_detected_time +ConversationId,conversation_id +ConversationLevelIntentClassificationResultItem,conversation_level_intent_classification_result_item +ConversationLevelResultDetail,conversation_level_result_detail +ConversationLevelSlotResolutionResultItem,conversation_level_slot_resolution_result_item +ConversationLevelTestResultItem,conversation_level_test_result_item +ConversationLevelTestResults,conversation_level_test_results +ConversationLevelTestResultsFilterBy,conversation_level_test_results_filter_by +ConversationLogSettings,conversation_log_settings +ConversationLogsDataSource,conversation_logs_data_source +ConversationLogsDataSourceFilterBy,conversation_logs_data_source_filter_by +ConversationLogsRequest,conversation_logs_request +ConversationLogsResponse,conversation_logs_response +ConversationRetentionSettings,conversation_retention_settings +ConversionConfiguration,conversion_configuration +ConversionProperties,conversion_properties +ConversionTask,conversion_task +ConversionTaskId,conversion_task_id +ConversionTaskIds,conversion_task_ids +ConversionTasks,conversion_tasks +Convert608To708,convert608_to708 +ConvertDotsInJsonKeysToUnderscores,convert_dots_in_json_keys_to_underscores +ConvertPaintToPop,convert_paint_to_pop +ConvertRecoveryPointToSnapshotRequest,convert_recovery_point_to_snapshot_request +ConvertRecoveryPointToSnapshotResponse,convert_recovery_point_to_snapshot_response +ConvertTimestampWithZoneToUTC,convert_timestamp_with_zone_to_utc +Cookie,cookie +CookieBehavior,cookie_behavior +CookieExpirationPeriod,cookie_expiration_period +CookieMatchPattern,cookie_match_pattern +CookieName,cookie_name +CookieNames,cookie_names +CookieObject,cookie_object +CookiePreference,cookie_preference +CookieSpecification,cookie_specification +CookieSynchronizationConfiguration,cookie_synchronization_configuration +Cookies,cookies +CookiesConfig,cookies_config +CoolDown,cool_down +Cooldown,cooldown +CoolingPeriod,cooling_period +Coordinates,coordinates +CoordinatorDpuSize,coordinator_dpu_size +CopyAction,copy_action +CopyActions,copy_actions +CopyBackupRequest,copy_backup_request +CopyBackupResponse,copy_backup_response +CopyBackupToRegionRequest,copy_backup_to_region_request +CopyBackupToRegionResponse,copy_backup_to_region_response +CopyClusterSnapshotMessage,copy_cluster_snapshot_message +CopyClusterSnapshotResult,copy_cluster_snapshot_result +CopyCommand,copy_command +CopyDBClusterParameterGroupMessage,copy_db_cluster_parameter_group_message +CopyDBClusterParameterGroupResult,copy_db_cluster_parameter_group_result +CopyDBClusterSnapshotMessage,copy_db_cluster_snapshot_message +CopyDBClusterSnapshotResult,copy_db_cluster_snapshot_result +CopyDBParameterGroupMessage,copy_db_parameter_group_message +CopyDBParameterGroupResult,copy_db_parameter_group_result +CopyDBSnapshotMessage,copy_db_snapshot_message +CopyDBSnapshotResult,copy_db_snapshot_result +CopyDestinationImageSet,copy_destination_image_set +CopyDestinationImageSetProperties,copy_destination_image_set_properties +CopyDistributionRequest,copy_distribution_request +CopyDistributionResult,copy_distribution_result +CopyFpgaImageRequest,copy_fpga_image_request +CopyFpgaImageResult,copy_fpga_image_result +CopyImageRequest,copy_image_request +CopyImageResponse,copy_image_response +CopyImageResult,copy_image_result +CopyImageSetInformation,copy_image_set_information +CopyImageSetRequest,copy_image_set_request +CopyImageSetResponse,copy_image_set_response +CopyImageTags,copy_image_tags +CopyJob,copy_job +CopyJobId,copy_job_id +CopyJobs,copy_jobs +CopyObjectOutput,copy_object_output +CopyObjectRequest,copy_object_request +CopyObjectResult,copy_object_result +CopyOptionGroup,copy_option_group +CopyOptionGroupMessage,copy_option_group_message +CopyOptionGroupResult,copy_option_group_result +CopyOptions,copy_options +CopyPackageVersionsRequest,copy_package_versions_request +CopyPackageVersionsResult,copy_package_versions_result +CopyPartResult,copy_part_result +CopyProductInput,copy_product_input +CopyProductOutput,copy_product_output +CopyProductStatus,copy_product_status +CopyProductToken,copy_product_token +CopyProjectVersionRequest,copy_project_version_request +CopyProjectVersionResponse,copy_project_version_response +CopyProtectionAction,copy_protection_action +CopySnapshotMessage,copy_snapshot_message +CopySnapshotRequest,copy_snapshot_request +CopySnapshotResponse,copy_snapshot_response +CopySnapshotResult,copy_snapshot_result +CopySource,copy_source +CopySourceArn,copy_source_arn +CopySourceIfMatch,copy_source_if_match +CopySourceIfModifiedSince,copy_source_if_modified_since +CopySourceIfNoneMatch,copy_source_if_none_match +CopySourceIfUnmodifiedSince,copy_source_if_unmodified_since +CopySourceImageSetInformation,copy_source_image_set_information +CopySourceImageSetProperties,copy_source_image_set_properties +CopySourceRange,copy_source_range +CopySourceSSECustomerAlgorithm,copy_source_sse_customer_algorithm +CopySourceSSECustomerKey,copy_source_sse_customer_key +CopySourceSSECustomerKeyMD5,copy_source_sse_customer_key_md5 +CopySourceTagsToRestoredResource,copy_source_tags_to_restored_resource +CopySourceVersionId,copy_source_version_id +CopyStepDetails,copy_step_details +CopyStrategy,copy_strategy +CopyTags,copy_tags +CopyTagsFromSource,copy_tags_from_source +CopyTagsToBackups,copy_tags_to_backups +CopyTagsToDataRepositoryAssociations,copy_tags_to_data_repository_associations +CopyTagsToSnapshot,copy_tags_to_snapshot +CopyTagsToSnapshots,copy_tags_to_snapshots +CopyTagsToVolumes,copy_tags_to_volumes +CopyTimestamp,copy_timestamp +CopyToRegionDisabledFault,copy_to_region_disabled_fault +CopyWorkspaceImageRequest,copy_workspace_image_request +CopyWorkspaceImageResult,copy_workspace_image_result +CopyableCrossAccount,copyable_cross_account +CopyrightHolder,copyright_holder +Core,core +CoreCount,core_count +CoreDefinitionId,core_definition_id +CoreDefinitionVersion,core_definition_version +CoreDefinitionVersionArn,core_definition_version_arn +CoreDefinitionVersionId,core_definition_version_id +CoreDevice,core_device +CoreDumpConfig,core_dump_config +CoreNetwork,core_network +CoreNetworkAddress,core_network_address +CoreNetworkArn,core_network_arn +CoreNetworkAsn,core_network_asn +CoreNetworkAttachmentArn,core_network_attachment_arn +CoreNetworkAttachmentId,core_network_attachment_id +CoreNetworkChange,core_network_change +CoreNetworkChangeEvent,core_network_change_event +CoreNetworkChangeEventValues,core_network_change_event_values +CoreNetworkChangeEvents,core_network_change_events +CoreNetworkChangeValues,core_network_change_values +CoreNetworkChanges,core_network_changes +CoreNetworkEdge,core_network_edge +CoreNetworkId,core_network_id +CoreNetworkPolicy,core_network_policy +CoreNetworkPolicyError,core_network_policy_error +CoreNetworkPolicyException,core_network_policy_exception +CoreNetworkPolicyVersion,core_network_policy_version +CoreNetworkPolicyVersions,core_network_policy_versions +CoreNetworkSegment,core_network_segment +CoreNetworkSegmentEdge,core_network_segment_edge +CoreNetworkSegmentEdgeIdentifier,core_network_segment_edge_identifier +CoreNetworkSummary,core_network_summary +CoreNetworks,core_networks +Cores,cores +CornerRadius,corner_radius +CorrectedTerm,corrected_term +Correction,correction +CorrectionGateLevel,correction_gate_level +Corrections,corrections +Cors,cors +CorsConfig,cors_config +CorsConfiguration,cors_configuration +CorsPolicy,cors_policy +CorsPolicyNotFoundException,cors_policy_not_found_exception +CorsRule,cors_rule +Cost,cost +CostAllocationTag,cost_allocation_tag +CostAllocationTagStatusEntry,cost_allocation_tag_status_entry +CostAllocationTags,cost_allocation_tags +CostAllocationTagsStatus,cost_allocation_tags_status +CostCategories,cost_categories +CostCategory,cost_category +CostCategoryArn,cost_category_arn +CostCategoryInheritedValueDimension,cost_category_inherited_value_dimension +CostCategoryName,cost_category_name +CostCategoryNames,cost_category_names +CostCategoryProcessingStatus,cost_category_processing_status +CostCategoryReference,cost_category_reference +CostCategoryReferences,cost_category_references +CostCategoryRule,cost_category_rule +CostCategorySplitChargeRule,cost_category_split_charge_rule +CostCategorySplitChargeRuleParameter,cost_category_split_charge_rule_parameter +CostCategoryValues,cost_category_values +CostEstimate,cost_estimate +CostEstimationResourceCollectionFilter,cost_estimation_resource_collection_filter +CostEstimationTimeRange,cost_estimation_time_range +CostFilters,cost_filters +CostPerHour,cost_per_hour +CostPerInference,cost_per_inference +CostTypes,cost_types +Costs,costs +Count,count +CountAction,count_action +CountByCoverageStatus,count_by_coverage_status +CountByResourceType,count_by_resource_type +CountBySeverity,count_by_severity +CountClosedWorkflowExecutionsInput,count_closed_workflow_executions_input +CountDistinct,count_distinct +CountDistinctLong,count_distinct_long +CountLong,count_long +CountNan,count_nan +CountNanLong,count_nan_long +CountNull,count_null +CountNullLong,count_null_long +CountOpenWorkflowExecutionsInput,count_open_workflow_executions_input +CountPendingActivityTasksInput,count_pending_activity_tasks_input +CountPendingDecisionTasksInput,count_pending_decision_tasks_input +CountPercent,count_percent +CountUpdate,count_update +Counters,counters +Country,country +CountryCode,country_code +CountryCodeIso2,country_code_iso2 +CountryCodeNumeric,country_code_numeric +CountryCodes,country_codes +CountryName,country_name +Counts,counts +CountsSummary,counts_summary +County,county +Coverage,coverage +CoverageByTime,coverage_by_time +CoverageCost,coverage_cost +CoverageDateFilter,coverage_date_filter +CoverageEksClusterDetails,coverage_eks_cluster_details +CoverageFilterCondition,coverage_filter_condition +CoverageFilterCriteria,coverage_filter_criteria +CoverageFilterCriterion,coverage_filter_criterion +CoverageHours,coverage_hours +CoverageHoursPercentage,coverage_hours_percentage +CoverageMapFilter,coverage_map_filter +CoverageNormalizedUnits,coverage_normalized_units +CoverageNormalizedUnitsPercentage,coverage_normalized_units_percentage +CoveragePercentage,coverage_percentage +CoverageResource,coverage_resource +CoverageResourceDetails,coverage_resource_details +CoverageSortCriteria,coverage_sort_criteria +CoverageStatistics,coverage_statistics +CoverageStatus,coverage_status +CoverageStringFilter,coverage_string_filter +CoverageTime,coverage_time +CoveragesByTime,coverages_by_time +CoveredNodes,covered_nodes +CoveredResource,covered_resource +CoversBodyPart,covers_body_part +CpsLimit,cps_limit +CpsUri,cps_uri +Cpu,cpu +CpuCredits,cpu_credits +CpuManufacturers,cpu_manufacturers +CpuOptions,cpu_options +CpuOptionsRequest,cpu_options_request +CpuThreshold,cpu_threshold +CpuUtilization,cpu_utilization +Crawl,crawl +CrawlArchivedSpaces,crawl_archived_spaces +CrawlAttachments,crawl_attachments +CrawlBotMessage,crawl_bot_message +CrawlChatRooms,crawl_chat_rooms +CrawlComments,crawl_comments +CrawlDepth,crawl_depth +CrawlElapsedTime,crawl_elapsed_time +CrawlFileComments,crawl_file_comments +CrawlId,crawl_id +CrawlIssue,crawl_issue +CrawlIssueComment,crawl_issue_comment +CrawlIssueCommentAttachment,crawl_issue_comment_attachment +CrawlPersonalSpaces,crawl_personal_spaces +CrawlPullRequest,crawl_pull_request +CrawlPullRequestComment,crawl_pull_request_comment +CrawlPullRequestCommentAttachment,crawl_pull_request_comment_attachment +CrawlRepositoryDocuments,crawl_repository_documents +CrawlState,crawl_state +CrawlSystemFolders,crawl_system_folders +CrawlTasks,crawl_tasks +CrawlWebLinks,crawl_web_links +Crawler,crawler +CrawlerConnection,crawler_connection +CrawlerDetails,crawler_details +CrawlerHistory,crawler_history +CrawlerLineageSettings,crawler_lineage_settings +CrawlerMetrics,crawler_metrics +CrawlerMetricsList,crawler_metrics_list +CrawlerName,crawler_name +CrawlerNameList,crawler_name_list +CrawlerNames,crawler_names +CrawlerNodeDetails,crawler_node_details +CrawlerNotRunningException,crawler_not_running_exception +CrawlerRunningException,crawler_running_exception +CrawlerSecurityConfiguration,crawler_security_configuration +CrawlerStoppingException,crawler_stopping_exception +CrawlerTargets,crawler_targets +Crawlers,crawlers +CrawlersNotFound,crawlers_not_found +Crawls,crawls +CrawlsFilter,crawls_filter +Create,create +CreateACLRequest,create_acl_request +CreateACLResponse,create_acl_response +CreateAPIKeyRequest,create_api_key_request +CreateAPIKeyResponse,create_api_key_response +CreateAcceleratorRequest,create_accelerator_request +CreateAcceleratorResponse,create_accelerator_response +CreateAccessControlConfigurationRequest,create_access_control_configuration_request +CreateAccessControlConfigurationResponse,create_access_control_configuration_response +CreateAccessKeyRequest,create_access_key_request +CreateAccessKeyResponse,create_access_key_response +CreateAccessLogSubscriptionRequest,create_access_log_subscription_request +CreateAccessLogSubscriptionResponse,create_access_log_subscription_response +CreateAccessPointForObjectLambdaRequest,create_access_point_for_object_lambda_request +CreateAccessPointForObjectLambdaResult,create_access_point_for_object_lambda_result +CreateAccessPointInput,create_access_point_input +CreateAccessPointOutput,create_access_point_output +CreateAccessPointRequest,create_access_point_request +CreateAccessPointResult,create_access_point_result +CreateAccessPolicyRequest,create_access_policy_request +CreateAccessPolicyResponse,create_access_policy_response +CreateAccessPreviewRequest,create_access_preview_request +CreateAccessPreviewResponse,create_access_preview_response +CreateAccessRequest,create_access_request +CreateAccessResponse,create_access_response +CreateAccessTokenRequest,create_access_token_request +CreateAccessTokenResponse,create_access_token_response +CreateAccessorInput,create_accessor_input +CreateAccessorOutput,create_accessor_output +CreateAccountAliasRequest,create_account_alias_request +CreateAccountAssignmentRequest,create_account_assignment_request +CreateAccountAssignmentResponse,create_account_assignment_response +CreateAccountCustomizationRequest,create_account_customization_request +CreateAccountCustomizationResponse,create_account_customization_response +CreateAccountRequest,create_account_request +CreateAccountRequestId,create_account_request_id +CreateAccountResponse,create_account_response +CreateAccountStatus,create_account_status +CreateAccountStatusNotFoundException,create_account_status_not_found_exception +CreateAccountStatuses,create_account_statuses +CreateAccountSubscriptionRequest,create_account_subscription_request +CreateAccountSubscriptionResponse,create_account_subscription_response +CreateActionRequest,create_action_request +CreateActionResponse,create_action_response +CreateActionTargetRequest,create_action_target_request +CreateActionTargetResponse,create_action_target_response +CreateActivationRequest,create_activation_request +CreateActivationResult,create_activation_result +CreateActivityInput,create_activity_input +CreateActivityOutput,create_activity_output +CreateAdditionalAssignmentsForHITRequest,create_additional_assignments_for_hit_request +CreateAddonRequest,create_addon_request +CreateAddonResponse,create_addon_response +CreateAddressBookRequest,create_address_book_request +CreateAddressBookResponse,create_address_book_response +CreateAddressRequest,create_address_request +CreateAddressResult,create_address_result +CreateAgentRequest,create_agent_request +CreateAgentResponse,create_agent_response +CreateAgentStatusRequest,create_agent_status_request +CreateAgentStatusResponse,create_agent_status_response +CreateAgreementRequest,create_agreement_request +CreateAgreementResponse,create_agreement_response +CreateAlarmModelRequest,create_alarm_model_request +CreateAlarmModelResponse,create_alarm_model_response +CreateAlertManagerDefinitionRequest,create_alert_manager_definition_request +CreateAlertManagerDefinitionResponse,create_alert_manager_definition_response +CreateAlertRequest,create_alert_request +CreateAlertResponse,create_alert_response +CreateAlgorithmInput,create_algorithm_input +CreateAlgorithmOutput,create_algorithm_output +CreateAliasInput,create_alias_input +CreateAliasOutput,create_alias_output +CreateAliasRequest,create_alias_request +CreateAliasResult,create_alias_result +CreateAllowListRequest,create_allow_list_request +CreateAllowListResponse,create_allow_list_response +CreateAnalysisRequest,create_analysis_request +CreateAnalysisResponse,create_analysis_response +CreateAnalysisTemplateInput,create_analysis_template_input +CreateAnalysisTemplateOutput,create_analysis_template_output +CreateAnalyzerRequest,create_analyzer_request +CreateAnalyzerResponse,create_analyzer_response +CreateAnnotationStoreRequest,create_annotation_store_request +CreateAnnotationStoreResponse,create_annotation_store_response +CreateAnnotationStoreVersionRequest,create_annotation_store_version_request +CreateAnnotationStoreVersionResponse,create_annotation_store_version_response +CreateAnomalyDetectorRequest,create_anomaly_detector_request +CreateAnomalyDetectorResponse,create_anomaly_detector_response +CreateAnomalyMonitorRequest,create_anomaly_monitor_request +CreateAnomalyMonitorResponse,create_anomaly_monitor_response +CreateAnomalySubscriptionRequest,create_anomaly_subscription_request +CreateAnomalySubscriptionResponse,create_anomaly_subscription_response +CreateApiCacheRequest,create_api_cache_request +CreateApiCacheResponse,create_api_cache_response +CreateApiDestinationRequest,create_api_destination_request +CreateApiDestinationResponse,create_api_destination_response +CreateApiKeyRequest,create_api_key_request +CreateApiKeyResponse,create_api_key_response +CreateApiMappingRequest,create_api_mapping_request +CreateApiMappingResponse,create_api_mapping_response +CreateApiRequest,create_api_request +CreateApiResponse,create_api_response +CreateAppAuthorizationRequest,create_app_authorization_request +CreateAppAuthorizationResponse,create_app_authorization_response +CreateAppBlockBuilderRequest,create_app_block_builder_request +CreateAppBlockBuilderResult,create_app_block_builder_result +CreateAppBlockBuilderStreamingURLRequest,create_app_block_builder_streaming_url_request +CreateAppBlockBuilderStreamingURLResult,create_app_block_builder_streaming_url_result +CreateAppBlockRequest,create_app_block_request +CreateAppBlockResult,create_app_block_result +CreateAppBundleRequest,create_app_bundle_request +CreateAppBundleResponse,create_app_bundle_response +CreateAppCookieStickinessPolicyInput,create_app_cookie_stickiness_policy_input +CreateAppImageConfigRequest,create_app_image_config_request +CreateAppImageConfigResponse,create_app_image_config_response +CreateAppInstanceAdminRequest,create_app_instance_admin_request +CreateAppInstanceAdminResponse,create_app_instance_admin_response +CreateAppInstanceBotRequest,create_app_instance_bot_request +CreateAppInstanceBotResponse,create_app_instance_bot_response +CreateAppInstanceRequest,create_app_instance_request +CreateAppInstanceResponse,create_app_instance_response +CreateAppInstanceUserRequest,create_app_instance_user_request +CreateAppInstanceUserResponse,create_app_instance_user_response +CreateAppMonitorRequest,create_app_monitor_request +CreateAppMonitorResponse,create_app_monitor_response +CreateAppRequest,create_app_request +CreateAppResponse,create_app_response +CreateAppResult,create_app_result +CreateAppVersionAppComponentRequest,create_app_version_app_component_request +CreateAppVersionAppComponentResponse,create_app_version_app_component_response +CreateAppVersionResourceRequest,create_app_version_resource_request +CreateAppVersionResourceResponse,create_app_version_resource_response +CreateApplicationInput,create_application_input +CreateApplicationInstanceRequest,create_application_instance_request +CreateApplicationInstanceResponse,create_application_instance_response +CreateApplicationMessage,create_application_message +CreateApplicationOutput,create_application_output +CreateApplicationPresignedUrlRequest,create_application_presigned_url_request +CreateApplicationPresignedUrlResponse,create_application_presigned_url_response +CreateApplicationRequest,create_application_request +CreateApplicationResponse,create_application_response +CreateApplicationResult,create_application_result +CreateApplicationSnapshotRequest,create_application_snapshot_request +CreateApplicationVersionMessage,create_application_version_message +CreateApplicationVersionRequest,create_application_version_request +CreateApplicationVersionResponse,create_application_version_response +CreateApprovalRuleTemplateInput,create_approval_rule_template_input +CreateApprovalRuleTemplateOutput,create_approval_rule_template_output +CreateArchiveRequest,create_archive_request +CreateArchiveResponse,create_archive_response +CreateArchiveRuleRequest,create_archive_rule_request +CreateArtifactRequest,create_artifact_request +CreateArtifactResponse,create_artifact_response +CreateAssessmentFrameworkControl,create_assessment_framework_control +CreateAssessmentFrameworkControlSet,create_assessment_framework_control_set +CreateAssessmentFrameworkRequest,create_assessment_framework_request +CreateAssessmentFrameworkResponse,create_assessment_framework_response +CreateAssessmentReportRequest,create_assessment_report_request +CreateAssessmentReportResponse,create_assessment_report_response +CreateAssessmentRequest,create_assessment_request +CreateAssessmentResponse,create_assessment_response +CreateAssessmentTargetRequest,create_assessment_target_request +CreateAssessmentTargetResponse,create_assessment_target_response +CreateAssessmentTemplateRequest,create_assessment_template_request +CreateAssessmentTemplateResponse,create_assessment_template_response +CreateAssetModelRequest,create_asset_model_request +CreateAssetModelResponse,create_asset_model_response +CreateAssetRequest,create_asset_request +CreateAssetResponse,create_asset_response +CreateAssistantAssociationRequest,create_assistant_association_request +CreateAssistantAssociationResponse,create_assistant_association_response +CreateAssistantRequest,create_assistant_request +CreateAssistantResponse,create_assistant_response +CreateAssociationBatchRequest,create_association_batch_request +CreateAssociationBatchRequestEntry,create_association_batch_request_entry +CreateAssociationBatchResult,create_association_batch_result +CreateAssociationRequest,create_association_request +CreateAssociationResult,create_association_result +CreateAttendeeError,create_attendee_error +CreateAttendeeRequest,create_attendee_request +CreateAttendeeRequestItem,create_attendee_request_item +CreateAttendeeResponse,create_attendee_response +CreateAttributeGroupRequest,create_attribute_group_request +CreateAttributeGroupResponse,create_attribute_group_response +CreateAuditSuppressionRequest,create_audit_suppression_request +CreateAuthChallenge,create_auth_challenge +CreateAuthenticationProfileMessage,create_authentication_profile_message +CreateAuthenticationProfileResult,create_authentication_profile_result +CreateAuthorizerRequest,create_authorizer_request +CreateAuthorizerResponse,create_authorizer_response +CreateAutoMLJobRequest,create_auto_ml_job_request +CreateAutoMLJobResponse,create_auto_ml_job_response +CreateAutoMLJobV2Request,create_auto_ml_job_v2_request +CreateAutoMLJobV2Response,create_auto_ml_job_v2_response +CreateAutoPredictorRequest,create_auto_predictor_request +CreateAutoPredictorResponse,create_auto_predictor_response +CreateAutoScalingConfigurationRequest,create_auto_scaling_configuration_request +CreateAutoScalingConfigurationResponse,create_auto_scaling_configuration_response +CreateAutoScalingGroupType,create_auto_scaling_group_type +CreateAutomationRuleRequest,create_automation_rule_request +CreateAutomationRuleResponse,create_automation_rule_response +CreateAvailabilityConfigurationRequest,create_availability_configuration_request +CreateAwsLogSourceRequest,create_aws_log_source_request +CreateAwsLogSourceResponse,create_aws_log_source_response +CreateBGPPeerRequest,create_bgp_peer_request +CreateBGPPeerResponse,create_bgp_peer_response +CreateBackendAPIRequest,create_backend_api_request +CreateBackendAPIResponse,create_backend_api_response +CreateBackendAuthForgotPasswordConfig,create_backend_auth_forgot_password_config +CreateBackendAuthIdentityPoolConfig,create_backend_auth_identity_pool_config +CreateBackendAuthMFAConfig,create_backend_auth_mfa_config +CreateBackendAuthOAuthConfig,create_backend_auth_o_auth_config +CreateBackendAuthPasswordPolicyConfig,create_backend_auth_password_policy_config +CreateBackendAuthRequest,create_backend_auth_request +CreateBackendAuthResourceConfig,create_backend_auth_resource_config +CreateBackendAuthResponse,create_backend_auth_response +CreateBackendAuthUserPoolConfig,create_backend_auth_user_pool_config +CreateBackendAuthVerificationMessageConfig,create_backend_auth_verification_message_config +CreateBackendConfigRequest,create_backend_config_request +CreateBackendConfigResponse,create_backend_config_response +CreateBackendEnvironmentRequest,create_backend_environment_request +CreateBackendEnvironmentResult,create_backend_environment_result +CreateBackendRequest,create_backend_request +CreateBackendResponse,create_backend_response +CreateBackendStorageRequest,create_backend_storage_request +CreateBackendStorageResourceConfig,create_backend_storage_resource_config +CreateBackendStorageResponse,create_backend_storage_response +CreateBackupInput,create_backup_input +CreateBackupOutput,create_backup_output +CreateBackupPlanInput,create_backup_plan_input +CreateBackupPlanOutput,create_backup_plan_output +CreateBackupRequest,create_backup_request +CreateBackupResponse,create_backup_response +CreateBackupSelectionInput,create_backup_selection_input +CreateBackupSelectionOutput,create_backup_selection_output +CreateBackupVaultInput,create_backup_vault_input +CreateBackupVaultOutput,create_backup_vault_output +CreateBasePathMappingRequest,create_base_path_mapping_request +CreateBatchImportJobRequest,create_batch_import_job_request +CreateBatchInferenceJobRequest,create_batch_inference_job_request +CreateBatchInferenceJobResponse,create_batch_inference_job_response +CreateBatchLoadTaskRequest,create_batch_load_task_request +CreateBatchLoadTaskResponse,create_batch_load_task_response +CreateBatchPredictionInput,create_batch_prediction_input +CreateBatchPredictionJobRequest,create_batch_prediction_job_request +CreateBatchPredictionOutput,create_batch_prediction_output +CreateBatchSegmentJobRequest,create_batch_segment_job_request +CreateBatchSegmentJobResponse,create_batch_segment_job_response +CreateBillingGroupInput,create_billing_group_input +CreateBillingGroupOutput,create_billing_group_output +CreateBillingGroupRequest,create_billing_group_request +CreateBillingGroupResponse,create_billing_group_response +CreateBlueGreenDeploymentRequest,create_blue_green_deployment_request +CreateBlueGreenDeploymentResponse,create_blue_green_deployment_response +CreateBlueprintRequest,create_blueprint_request +CreateBlueprintResponse,create_blueprint_response +CreateBotAliasRequest,create_bot_alias_request +CreateBotAliasResponse,create_bot_alias_response +CreateBotLocaleRequest,create_bot_locale_request +CreateBotLocaleResponse,create_bot_locale_response +CreateBotRequest,create_bot_request +CreateBotResponse,create_bot_response +CreateBotVersionRequest,create_bot_version_request +CreateBotVersionResponse,create_bot_version_response +CreateBranchInput,create_branch_input +CreateBranchRequest,create_branch_request +CreateBranchResult,create_branch_result +CreateBridge420Exception,create_bridge420_exception +CreateBridgeRequest,create_bridge_request +CreateBridgeResponse,create_bridge_response +CreateBrokerRequest,create_broker_request +CreateBrokerResponse,create_broker_response +CreateBrowserSettingsRequest,create_browser_settings_request +CreateBrowserSettingsResponse,create_browser_settings_response +CreateBucketAccessKeyRequest,create_bucket_access_key_request +CreateBucketAccessKeyResult,create_bucket_access_key_result +CreateBucketConfiguration,create_bucket_configuration +CreateBucketOutput,create_bucket_output +CreateBucketRequest,create_bucket_request +CreateBucketResult,create_bucket_result +CreateBudgetActionRequest,create_budget_action_request +CreateBudgetActionResponse,create_budget_action_response +CreateBudgetRequest,create_budget_request +CreateBuildInput,create_build_input +CreateBuildOutput,create_build_output +CreateBulkImportJobRequest,create_bulk_import_job_request +CreateBulkImportJobResponse,create_bulk_import_job_response +CreateBusinessReportScheduleRequest,create_business_report_schedule_request +CreateBusinessReportScheduleResponse,create_business_report_schedule_response +CreateByteMatchSetRequest,create_byte_match_set_request +CreateByteMatchSetResponse,create_byte_match_set_response +CreateCacheClusterMessage,create_cache_cluster_message +CreateCacheClusterResult,create_cache_cluster_result +CreateCacheParameterGroupMessage,create_cache_parameter_group_message +CreateCacheParameterGroupResult,create_cache_parameter_group_result +CreateCachePolicyRequest,create_cache_policy_request +CreateCachePolicyResult,create_cache_policy_result +CreateCacheSecurityGroupMessage,create_cache_security_group_message +CreateCacheSecurityGroupResult,create_cache_security_group_result +CreateCacheSubnetGroupMessage,create_cache_subnet_group_message +CreateCacheSubnetGroupResult,create_cache_subnet_group_result +CreateCachediSCSIVolumeInput,create_cachedi_scsi_volume_input +CreateCachediSCSIVolumeOutput,create_cachedi_scsi_volume_output +CreateCalculatedAttributeDefinitionRequest,create_calculated_attribute_definition_request +CreateCalculatedAttributeDefinitionResponse,create_calculated_attribute_definition_response +CreateCallAnalyticsCategoryRequest,create_call_analytics_category_request +CreateCallAnalyticsCategoryResponse,create_call_analytics_category_response +CreateCampaignRequest,create_campaign_request +CreateCampaignResponse,create_campaign_response +CreateCanaryRequest,create_canary_request +CreateCanaryResponse,create_canary_response +CreateCapacityProviderRequest,create_capacity_provider_request +CreateCapacityProviderResponse,create_capacity_provider_response +CreateCapacityReservationFleetRequest,create_capacity_reservation_fleet_request +CreateCapacityReservationFleetResult,create_capacity_reservation_fleet_result +CreateCapacityReservationInput,create_capacity_reservation_input +CreateCapacityReservationRequest,create_capacity_reservation_request +CreateCapacityReservationResult,create_capacity_reservation_result +CreateCarrierGatewayRequest,create_carrier_gateway_request +CreateCarrierGatewayResult,create_carrier_gateway_result +CreateCaseRequest,create_case_request +CreateCaseResponse,create_case_response +CreateCellRequest,create_cell_request +CreateCellResponse,create_cell_response +CreateCertificateAuthorityAuditReportRequest,create_certificate_authority_audit_report_request +CreateCertificateAuthorityAuditReportResponse,create_certificate_authority_audit_report_response +CreateCertificateAuthorityRequest,create_certificate_authority_request +CreateCertificateAuthorityResponse,create_certificate_authority_response +CreateCertificateFromCsrRequest,create_certificate_from_csr_request +CreateCertificateFromCsrResponse,create_certificate_from_csr_response +CreateCertificateRequest,create_certificate_request +CreateCertificateResult,create_certificate_result +CreateChangeSetInput,create_change_set_input +CreateChangeSetOutput,create_change_set_output +CreateChangesetRequest,create_changeset_request +CreateChangesetResponse,create_changeset_response +CreateChannelBanRequest,create_channel_ban_request +CreateChannelBanResponse,create_channel_ban_response +CreateChannelFlowRequest,create_channel_flow_request +CreateChannelFlowResponse,create_channel_flow_response +CreateChannelGroupRequest,create_channel_group_request +CreateChannelGroupResponse,create_channel_group_response +CreateChannelMembershipRequest,create_channel_membership_request +CreateChannelMembershipResponse,create_channel_membership_response +CreateChannelModeratorRequest,create_channel_moderator_request +CreateChannelModeratorResponse,create_channel_moderator_response +CreateChannelRequest,create_channel_request +CreateChannelResponse,create_channel_response +CreateChatTokenRequest,create_chat_token_request +CreateChatTokenResponse,create_chat_token_response +CreateCidrCollectionRequest,create_cidr_collection_request +CreateCidrCollectionResponse,create_cidr_collection_response +CreateClassificationJobRequest,create_classification_job_request +CreateClassificationJobResponse,create_classification_job_response +CreateClassifierRequest,create_classifier_request +CreateCliTokenRequest,create_cli_token_request +CreateCliTokenResponse,create_cli_token_response +CreateClientVpnEndpointRequest,create_client_vpn_endpoint_request +CreateClientVpnEndpointResult,create_client_vpn_endpoint_result +CreateClientVpnRouteRequest,create_client_vpn_route_request +CreateClientVpnRouteResult,create_client_vpn_route_result +CreateCloudFormationChangeSetRequest,create_cloud_formation_change_set_request +CreateCloudFormationChangeSetResponse,create_cloud_formation_change_set_response +CreateCloudFormationStackRequest,create_cloud_formation_stack_request +CreateCloudFormationStackResult,create_cloud_formation_stack_result +CreateCloudFormationTemplateRequest,create_cloud_formation_template_request +CreateCloudFormationTemplateResponse,create_cloud_formation_template_response +CreateCloudFrontOriginAccessIdentityRequest,create_cloud_front_origin_access_identity_request +CreateCloudFrontOriginAccessIdentityResult,create_cloud_front_origin_access_identity_result +CreateClusterInput,create_cluster_input +CreateClusterMessage,create_cluster_message +CreateClusterOutput,create_cluster_output +CreateClusterParameterGroupMessage,create_cluster_parameter_group_message +CreateClusterParameterGroupResult,create_cluster_parameter_group_result +CreateClusterRequest,create_cluster_request +CreateClusterResponse,create_cluster_response +CreateClusterResult,create_cluster_result +CreateClusterSecurityGroupMessage,create_cluster_security_group_message +CreateClusterSecurityGroupResult,create_cluster_security_group_result +CreateClusterSnapshotInput,create_cluster_snapshot_input +CreateClusterSnapshotMessage,create_cluster_snapshot_message +CreateClusterSnapshotOutput,create_cluster_snapshot_output +CreateClusterSnapshotResult,create_cluster_snapshot_result +CreateClusterSubnetGroupMessage,create_cluster_subnet_group_message +CreateClusterSubnetGroupResult,create_cluster_subnet_group_result +CreateClusterV2Request,create_cluster_v2_request +CreateClusterV2Response,create_cluster_v2_response +CreateCodeRepositoryInput,create_code_repository_input +CreateCodeRepositoryOutput,create_code_repository_output +CreateCodeReviewRequest,create_code_review_request +CreateCodeReviewResponse,create_code_review_response +CreateCodeSigningConfigRequest,create_code_signing_config_request +CreateCodeSigningConfigResponse,create_code_signing_config_response +CreateCoipCidrRequest,create_coip_cidr_request +CreateCoipCidrResult,create_coip_cidr_result +CreateCoipPoolRequest,create_coip_pool_request +CreateCoipPoolResult,create_coip_pool_result +CreateCollaborationInput,create_collaboration_input +CreateCollaborationOutput,create_collaboration_output +CreateCollectionDetail,create_collection_detail +CreateCollectionRequest,create_collection_request +CreateCollectionResponse,create_collection_response +CreateColumn,create_column +CreateColumnsOperation,create_columns_operation +CreateCommentRequest,create_comment_request +CreateCommentResponse,create_comment_response +CreateCommitInput,create_commit_input +CreateCommitOutput,create_commit_output +CreateCompilationJobRequest,create_compilation_job_request +CreateCompilationJobResponse,create_compilation_job_response +CreateComponentData,create_component_data +CreateComponentInput,create_component_input +CreateComponentOutput,create_component_output +CreateComponentRequest,create_component_request +CreateComponentResponse,create_component_response +CreateComponentTypeRequest,create_component_type_request +CreateComponentTypeResponse,create_component_type_response +CreateComponentVersionRequest,create_component_version_request +CreateComponentVersionResponse,create_component_version_response +CreateComputeEnvironmentRequest,create_compute_environment_request +CreateComputeEnvironmentResponse,create_compute_environment_response +CreateComputerRequest,create_computer_request +CreateComputerResult,create_computer_result +CreateConditionalForwarderRequest,create_conditional_forwarder_request +CreateConferenceProviderRequest,create_conference_provider_request +CreateConferenceProviderResponse,create_conference_provider_response +CreateConfigRequest,create_config_request +CreateConfigurationProfileRequest,create_configuration_profile_request +CreateConfigurationRequest,create_configuration_request +CreateConfigurationResponse,create_configuration_response +CreateConfigurationSetEventDestinationRequest,create_configuration_set_event_destination_request +CreateConfigurationSetRequest,create_configuration_set_request +CreateConfigurationSetResult,create_configuration_set_result +CreateConfigurationSetTrackingOptionsRequest,create_configuration_set_tracking_options_request +CreateConfigurationTemplateMessage,create_configuration_template_message +CreateConfiguredTableAnalysisRuleInput,create_configured_table_analysis_rule_input +CreateConfiguredTableAnalysisRuleOutput,create_configured_table_analysis_rule_output +CreateConfiguredTableAssociationInput,create_configured_table_association_input +CreateConfiguredTableAssociationOutput,create_configured_table_association_output +CreateConfiguredTableInput,create_configured_table_input +CreateConfiguredTableOutput,create_configured_table_output +CreateConnectAttachmentRequest,create_connect_attachment_request +CreateConnectAttachmentResponse,create_connect_attachment_response +CreateConnectClientAddInRequest,create_connect_client_add_in_request +CreateConnectClientAddInResult,create_connect_client_add_in_result +CreateConnectPeerRequest,create_connect_peer_request +CreateConnectPeerResponse,create_connect_peer_response +CreateConnectionAliasRequest,create_connection_alias_request +CreateConnectionAliasResult,create_connection_alias_result +CreateConnectionApiKeyAuthRequestParameters,create_connection_api_key_auth_request_parameters +CreateConnectionAuthRequestParameters,create_connection_auth_request_parameters +CreateConnectionBasicAuthRequestParameters,create_connection_basic_auth_request_parameters +CreateConnectionInput,create_connection_input +CreateConnectionOAuthClientRequestParameters,create_connection_o_auth_client_request_parameters +CreateConnectionOAuthRequestParameters,create_connection_o_auth_request_parameters +CreateConnectionOutput,create_connection_output +CreateConnectionRequest,create_connection_request +CreateConnectionResponse,create_connection_response +CreateConnectorDefinitionRequest,create_connector_definition_request +CreateConnectorDefinitionResponse,create_connector_definition_response +CreateConnectorDefinitionVersionRequest,create_connector_definition_version_request +CreateConnectorDefinitionVersionResponse,create_connector_definition_version_response +CreateConnectorProfileRequest,create_connector_profile_request +CreateConnectorProfileResponse,create_connector_profile_response +CreateConnectorRequest,create_connector_request +CreateConnectorResponse,create_connector_response +CreateConstraintInput,create_constraint_input +CreateConstraintOutput,create_constraint_output +CreateContactChannelRequest,create_contact_channel_request +CreateContactChannelResult,create_contact_channel_result +CreateContactFlowModuleRequest,create_contact_flow_module_request +CreateContactFlowModuleResponse,create_contact_flow_module_response +CreateContactFlowRequest,create_contact_flow_request +CreateContactFlowResponse,create_contact_flow_response +CreateContactListRequest,create_contact_list_request +CreateContactMethodRequest,create_contact_method_request +CreateContactMethodResult,create_contact_method_result +CreateContactRequest,create_contact_request +CreateContactResponse,create_contact_response +CreateContactResult,create_contact_result +CreateContainerInput,create_container_input +CreateContainerOutput,create_container_output +CreateContainerRecipeRequest,create_container_recipe_request +CreateContainerRecipeResponse,create_container_recipe_response +CreateContainerServiceDeploymentRequest,create_container_service_deployment_request +CreateContainerServiceDeploymentResult,create_container_service_deployment_result +CreateContainerServiceRegistryLoginResult,create_container_service_registry_login_result +CreateContainerServiceRequest,create_container_service_request +CreateContainerServiceResult,create_container_service_result +CreateContentRequest,create_content_request +CreateContentResponse,create_content_response +CreateContextRequest,create_context_request +CreateContextResponse,create_context_response +CreateContinuousDeploymentPolicyRequest,create_continuous_deployment_policy_request +CreateContinuousDeploymentPolicyResult,create_continuous_deployment_policy_result +CreateControlMappingSource,create_control_mapping_source +CreateControlPanelRequest,create_control_panel_request +CreateControlPanelResponse,create_control_panel_response +CreateControlRequest,create_control_request +CreateControlResponse,create_control_response +CreateCoreDefinitionRequest,create_core_definition_request +CreateCoreDefinitionResponse,create_core_definition_response +CreateCoreDefinitionVersionRequest,create_core_definition_version_request +CreateCoreDefinitionVersionResponse,create_core_definition_version_response +CreateCoreNetworkRequest,create_core_network_request +CreateCoreNetworkResponse,create_core_network_response +CreateCostCategoryDefinitionRequest,create_cost_category_definition_request +CreateCostCategoryDefinitionResponse,create_cost_category_definition_response +CreateCrawlerRequest,create_crawler_request +CreateCrossAccountAuthorizationRequest,create_cross_account_authorization_request +CreateCrossAccountAuthorizationResponse,create_cross_account_authorization_response +CreateCsvClassifierRequest,create_csv_classifier_request +CreateCustomActionTypeInput,create_custom_action_type_input +CreateCustomActionTypeOutput,create_custom_action_type_output +CreateCustomDBEngineVersionFault,create_custom_db_engine_version_fault +CreateCustomDBEngineVersionMessage,create_custom_db_engine_version_message +CreateCustomDataIdentifierRequest,create_custom_data_identifier_request +CreateCustomDataIdentifierResponse,create_custom_data_identifier_response +CreateCustomDomainAssociationMessage,create_custom_domain_association_message +CreateCustomDomainAssociationResult,create_custom_domain_association_result +CreateCustomEntityTypeRequest,create_custom_entity_type_request +CreateCustomEntityTypeResponse,create_custom_entity_type_response +CreateCustomKeyStoreRequest,create_custom_key_store_request +CreateCustomKeyStoreResponse,create_custom_key_store_response +CreateCustomLineItemInput,create_custom_line_item_input +CreateCustomLineItemOutput,create_custom_line_item_output +CreateCustomLogSourceRequest,create_custom_log_source_request +CreateCustomLogSourceResponse,create_custom_log_source_response +CreateCustomMetadataRequest,create_custom_metadata_request +CreateCustomMetricRequest,create_custom_metric_request +CreateCustomMetricResponse,create_custom_metric_response +CreateCustomPluginRequest,create_custom_plugin_request +CreateCustomPluginResponse,create_custom_plugin_response +CreateCustomRoutingAcceleratorRequest,create_custom_routing_accelerator_request +CreateCustomRoutingAcceleratorResponse,create_custom_routing_accelerator_response +CreateCustomRoutingEndpointGroupRequest,create_custom_routing_endpoint_group_request +CreateCustomRoutingEndpointGroupResponse,create_custom_routing_endpoint_group_response +CreateCustomRoutingListenerRequest,create_custom_routing_listener_request +CreateCustomRoutingListenerResponse,create_custom_routing_listener_response +CreateCustomVerificationEmailTemplateRequest,create_custom_verification_email_template_request +CreateCustomerGatewayRequest,create_customer_gateway_request +CreateCustomerGatewayResult,create_customer_gateway_result +CreateDBClusterEndpointMessage,create_db_cluster_endpoint_message +CreateDBClusterEndpointOutput,create_db_cluster_endpoint_output +CreateDBClusterMessage,create_db_cluster_message +CreateDBClusterParameterGroupMessage,create_db_cluster_parameter_group_message +CreateDBClusterParameterGroupResult,create_db_cluster_parameter_group_result +CreateDBClusterResult,create_db_cluster_result +CreateDBClusterSnapshotMessage,create_db_cluster_snapshot_message +CreateDBClusterSnapshotResult,create_db_cluster_snapshot_result +CreateDBInstanceMessage,create_db_instance_message +CreateDBInstanceReadReplicaMessage,create_db_instance_read_replica_message +CreateDBInstanceReadReplicaResult,create_db_instance_read_replica_result +CreateDBInstanceResult,create_db_instance_result +CreateDBParameterGroupMessage,create_db_parameter_group_message +CreateDBParameterGroupResult,create_db_parameter_group_result +CreateDBProxyEndpointRequest,create_db_proxy_endpoint_request +CreateDBProxyEndpointResponse,create_db_proxy_endpoint_response +CreateDBProxyRequest,create_db_proxy_request +CreateDBProxyResponse,create_db_proxy_response +CreateDBSecurityGroupMessage,create_db_security_group_message +CreateDBSecurityGroupResult,create_db_security_group_result +CreateDBSnapshotMessage,create_db_snapshot_message +CreateDBSnapshotResult,create_db_snapshot_result +CreateDBSubnetGroupMessage,create_db_subnet_group_message +CreateDBSubnetGroupResult,create_db_subnet_group_result +CreateDashboardRequest,create_dashboard_request +CreateDashboardResponse,create_dashboard_response +CreateDataCatalogInput,create_data_catalog_input +CreateDataCellsFilterRequest,create_data_cells_filter_request +CreateDataIntegrationRequest,create_data_integration_request +CreateDataIntegrationResponse,create_data_integration_response +CreateDataLakeExceptionSubscriptionRequest,create_data_lake_exception_subscription_request +CreateDataLakeOrganizationConfigurationRequest,create_data_lake_organization_configuration_request +CreateDataLakeRequest,create_data_lake_request +CreateDataLakeResponse,create_data_lake_response +CreateDataProviderMessage,create_data_provider_message +CreateDataProviderResponse,create_data_provider_response +CreateDataQualityJobDefinitionRequest,create_data_quality_job_definition_request +CreateDataQualityJobDefinitionResponse,create_data_quality_job_definition_response +CreateDataQualityRulesetRequest,create_data_quality_ruleset_request +CreateDataQualityRulesetResponse,create_data_quality_ruleset_response +CreateDataRepositoryAssociationRequest,create_data_repository_association_request +CreateDataRepositoryAssociationResponse,create_data_repository_association_response +CreateDataRepositoryTaskRequest,create_data_repository_task_request +CreateDataRepositoryTaskResponse,create_data_repository_task_response +CreateDataSetImportTaskRequest,create_data_set_import_task_request +CreateDataSetImportTaskResponse,create_data_set_import_task_response +CreateDataSetRequest,create_data_set_request +CreateDataSetResponse,create_data_set_response +CreateDataSourceFromRDSInput,create_data_source_from_rds_input +CreateDataSourceFromRDSOutput,create_data_source_from_rds_output +CreateDataSourceFromRedshiftInput,create_data_source_from_redshift_input +CreateDataSourceFromRedshiftOutput,create_data_source_from_redshift_output +CreateDataSourceFromS3Input,create_data_source_from_s3_input +CreateDataSourceFromS3Output,create_data_source_from_s3_output +CreateDataSourceRequest,create_data_source_request +CreateDataSourceResponse,create_data_source_response +CreateDataViewRequest,create_data_view_request +CreateDataViewResponse,create_data_view_response +CreateDatabaseDefaultPermissions,create_database_default_permissions +CreateDatabaseRequest,create_database_request +CreateDatabaseResponse,create_database_response +CreateDataflowEndpointGroupRequest,create_dataflow_endpoint_group_request +CreateDatasetContentRequest,create_dataset_content_request +CreateDatasetContentResponse,create_dataset_content_response +CreateDatasetExportJobRequest,create_dataset_export_job_request +CreateDatasetExportJobResponse,create_dataset_export_job_response +CreateDatasetGroupRequest,create_dataset_group_request +CreateDatasetGroupResponse,create_dataset_group_response +CreateDatasetImportJobRequest,create_dataset_import_job_request +CreateDatasetImportJobResponse,create_dataset_import_job_response +CreateDatasetRequest,create_dataset_request +CreateDatasetResponse,create_dataset_response +CreateDatastoreRequest,create_datastore_request +CreateDatastoreResponse,create_datastore_response +CreateDate,create_date +CreateDecoderManifestRequest,create_decoder_manifest_request +CreateDecoderManifestResponse,create_decoder_manifest_response +CreateDedicatedIpPoolRequest,create_dedicated_ip_pool_request +CreateDefaultSubnetRequest,create_default_subnet_request +CreateDefaultSubnetResult,create_default_subnet_result +CreateDefaultVpcRequest,create_default_vpc_request +CreateDefaultVpcResult,create_default_vpc_result +CreateDelegationRequest,create_delegation_request +CreateDeliverabilityTestReportRequest,create_deliverability_test_report_request +CreateDeliverabilityTestReportResponse,create_deliverability_test_report_response +CreateDeliveryStreamInput,create_delivery_stream_input +CreateDeliveryStreamOutput,create_delivery_stream_output +CreateDeploymentConfigInput,create_deployment_config_input +CreateDeploymentConfigOutput,create_deployment_config_output +CreateDeploymentGroupInput,create_deployment_group_input +CreateDeploymentGroupOutput,create_deployment_group_output +CreateDeploymentInput,create_deployment_input +CreateDeploymentJobRequest,create_deployment_job_request +CreateDeploymentJobResponse,create_deployment_job_response +CreateDeploymentOutput,create_deployment_output +CreateDeploymentRequest,create_deployment_request +CreateDeploymentResponse,create_deployment_response +CreateDeploymentResult,create_deployment_result +CreateDeploymentStrategyRequest,create_deployment_strategy_request +CreateDestinationRequest,create_destination_request +CreateDestinationResponse,create_destination_response +CreateDetectorModelRequest,create_detector_model_request +CreateDetectorModelResponse,create_detector_model_response +CreateDetectorRequest,create_detector_request +CreateDetectorResponse,create_detector_response +CreateDetectorVersionRequest,create_detector_version_request +CreateDetectorVersionResult,create_detector_version_result +CreateDevEndpointRequest,create_dev_endpoint_request +CreateDevEndpointResponse,create_dev_endpoint_response +CreateDevEnvironmentRequest,create_dev_environment_request +CreateDevEnvironmentResponse,create_dev_environment_response +CreateDeviceDefinitionRequest,create_device_definition_request +CreateDeviceDefinitionResponse,create_device_definition_response +CreateDeviceDefinitionVersionRequest,create_device_definition_version_request +CreateDeviceDefinitionVersionResponse,create_device_definition_version_response +CreateDeviceFleetRequest,create_device_fleet_request +CreateDevicePoolRequest,create_device_pool_request +CreateDevicePoolResult,create_device_pool_result +CreateDeviceProfileRequest,create_device_profile_request +CreateDeviceProfileResponse,create_device_profile_response +CreateDeviceRequest,create_device_request +CreateDeviceResponse,create_device_response +CreateDhcpOptionsRequest,create_dhcp_options_request +CreateDhcpOptionsResult,create_dhcp_options_result +CreateDimensionRequest,create_dimension_request +CreateDimensionResponse,create_dimension_response +CreateDirectConnectGatewayAssociationProposalRequest,create_direct_connect_gateway_association_proposal_request +CreateDirectConnectGatewayAssociationProposalResult,create_direct_connect_gateway_association_proposal_result +CreateDirectConnectGatewayAssociationRequest,create_direct_connect_gateway_association_request +CreateDirectConnectGatewayAssociationResult,create_direct_connect_gateway_association_result +CreateDirectConnectGatewayRequest,create_direct_connect_gateway_request +CreateDirectConnectGatewayResult,create_direct_connect_gateway_result +CreateDirectoryConfigRequest,create_directory_config_request +CreateDirectoryConfigResult,create_directory_config_result +CreateDirectoryRegistrationRequest,create_directory_registration_request +CreateDirectoryRegistrationResponse,create_directory_registration_response +CreateDirectoryRequest,create_directory_request +CreateDirectoryResponse,create_directory_response +CreateDirectoryResult,create_directory_result +CreateDiscovererRequest,create_discoverer_request +CreateDiscovererResponse,create_discoverer_response +CreateDiskFromSnapshotRequest,create_disk_from_snapshot_request +CreateDiskFromSnapshotResult,create_disk_from_snapshot_result +CreateDiskRequest,create_disk_request +CreateDiskResult,create_disk_result +CreateDiskSnapshotRequest,create_disk_snapshot_request +CreateDiskSnapshotResult,create_disk_snapshot_result +CreateDistributionConfigurationRequest,create_distribution_configuration_request +CreateDistributionConfigurationResponse,create_distribution_configuration_response +CreateDistributionRequest,create_distribution_request +CreateDistributionResult,create_distribution_result +CreateDistributionWithTagsRequest,create_distribution_with_tags_request +CreateDistributionWithTagsResult,create_distribution_with_tags_result +CreateDocumentClassifierRequest,create_document_classifier_request +CreateDocumentClassifierResponse,create_document_classifier_response +CreateDocumentRequest,create_document_request +CreateDocumentResult,create_document_result +CreateDocumentationPartRequest,create_documentation_part_request +CreateDocumentationVersionRequest,create_documentation_version_request +CreateDomainAssociationRequest,create_domain_association_request +CreateDomainAssociationResult,create_domain_association_result +CreateDomainConfigurationRequest,create_domain_configuration_request +CreateDomainConfigurationResponse,create_domain_configuration_response +CreateDomainEntryRequest,create_domain_entry_request +CreateDomainEntryResult,create_domain_entry_result +CreateDomainNameRequest,create_domain_name_request +CreateDomainNameResponse,create_domain_name_response +CreateDomainRequest,create_domain_request +CreateDomainResponse,create_domain_response +CreateDomainResult,create_domain_result +CreateDynamicThingGroupRequest,create_dynamic_thing_group_request +CreateDynamicThingGroupResponse,create_dynamic_thing_group_response +CreateEdgeDeploymentPlanRequest,create_edge_deployment_plan_request +CreateEdgeDeploymentPlanResponse,create_edge_deployment_plan_response +CreateEdgeDeploymentStageRequest,create_edge_deployment_stage_request +CreateEdgePackagingJobRequest,create_edge_packaging_job_request +CreateEgressOnlyInternetGatewayRequest,create_egress_only_internet_gateway_request +CreateEgressOnlyInternetGatewayResult,create_egress_only_internet_gateway_result +CreateElasticsearchDomainRequest,create_elasticsearch_domain_request +CreateElasticsearchDomainResponse,create_elasticsearch_domain_response +CreateEmailIdentityPolicyRequest,create_email_identity_policy_request +CreateEmailIdentityRequest,create_email_identity_request +CreateEmailIdentityResponse,create_email_identity_response +CreateEmailTemplateRequest,create_email_template_request +CreateEmailTemplateResponse,create_email_template_response +CreateEndOfMeetingReminder,create_end_of_meeting_reminder +CreateEndpointAccessMessage,create_endpoint_access_message +CreateEndpointAccessRequest,create_endpoint_access_request +CreateEndpointAccessResponse,create_endpoint_access_response +CreateEndpointConfigInput,create_endpoint_config_input +CreateEndpointConfigOutput,create_endpoint_config_output +CreateEndpointGroupRequest,create_endpoint_group_request +CreateEndpointGroupResponse,create_endpoint_group_response +CreateEndpointInput,create_endpoint_input +CreateEndpointMessage,create_endpoint_message +CreateEndpointOutput,create_endpoint_output +CreateEndpointRequest,create_endpoint_request +CreateEndpointResponse,create_endpoint_response +CreateEndpointResult,create_endpoint_result +CreateEntitlementRequest,create_entitlement_request +CreateEntitlementResult,create_entitlement_result +CreateEntityRecognizerRequest,create_entity_recognizer_request +CreateEntityRecognizerResponse,create_entity_recognizer_response +CreateEntityRequest,create_entity_request +CreateEntityResponse,create_entity_response +CreateEnvironmentAccountConnectionInput,create_environment_account_connection_input +CreateEnvironmentAccountConnectionOutput,create_environment_account_connection_output +CreateEnvironmentEC2Request,create_environment_ec2_request +CreateEnvironmentEC2Result,create_environment_ec2_result +CreateEnvironmentInput,create_environment_input +CreateEnvironmentMembershipRequest,create_environment_membership_request +CreateEnvironmentMembershipResult,create_environment_membership_result +CreateEnvironmentMessage,create_environment_message +CreateEnvironmentOutput,create_environment_output +CreateEnvironmentRequest,create_environment_request +CreateEnvironmentResponse,create_environment_response +CreateEnvironmentTemplateInput,create_environment_template_input +CreateEnvironmentTemplateOutput,create_environment_template_output +CreateEnvironmentTemplateVersionInput,create_environment_template_version_input +CreateEnvironmentTemplateVersionOutput,create_environment_template_version_output +CreateEphemerisRequest,create_ephemeris_request +CreateEvaluationFormRequest,create_evaluation_form_request +CreateEvaluationFormResponse,create_evaluation_form_response +CreateEvaluationInput,create_evaluation_input +CreateEvaluationOutput,create_evaluation_output +CreateEventActionRequest,create_event_action_request +CreateEventActionResponse,create_event_action_response +CreateEventBusRequest,create_event_bus_request +CreateEventBusResponse,create_event_bus_response +CreateEventDataStoreRequest,create_event_data_store_request +CreateEventDataStoreResponse,create_event_data_store_response +CreateEventDestinationRequest,create_event_destination_request +CreateEventDestinationResult,create_event_destination_result +CreateEventIntegrationRequest,create_event_integration_request +CreateEventIntegrationResponse,create_event_integration_response +CreateEventSourceMappingRequest,create_event_source_mapping_request +CreateEventStreamRequest,create_event_stream_request +CreateEventStreamResponse,create_event_stream_response +CreateEventSubscriptionMessage,create_event_subscription_message +CreateEventSubscriptionResponse,create_event_subscription_response +CreateEventSubscriptionResult,create_event_subscription_result +CreateEventTrackerRequest,create_event_tracker_request +CreateEventTrackerResponse,create_event_tracker_response +CreateExclusionsPreviewRequest,create_exclusions_preview_request +CreateExclusionsPreviewResponse,create_exclusions_preview_response +CreateExperienceRequest,create_experience_request +CreateExperienceResponse,create_experience_response +CreateExperimentRequest,create_experiment_request +CreateExperimentResponse,create_experiment_response +CreateExperimentTemplateActionInput,create_experiment_template_action_input +CreateExperimentTemplateLogConfigurationInput,create_experiment_template_log_configuration_input +CreateExperimentTemplateRequest,create_experiment_template_request +CreateExperimentTemplateResponse,create_experiment_template_response +CreateExperimentTemplateStopConditionInput,create_experiment_template_stop_condition_input +CreateExperimentTemplateTargetInput,create_experiment_template_target_input +CreateExplainabilityExportRequest,create_explainability_export_request +CreateExplainabilityExportResponse,create_explainability_export_response +CreateExplainabilityRequest,create_explainability_request +CreateExplainabilityResponse,create_explainability_response +CreateExportJobRequest,create_export_job_request +CreateExportJobResponse,create_export_job_response +CreateExportRequest,create_export_request +CreateExportResponse,create_export_response +CreateExportTaskRequest,create_export_task_request +CreateExportTaskResponse,create_export_task_response +CreateExtendedSourceServerRequest,create_extended_source_server_request +CreateExtendedSourceServerResponse,create_extended_source_server_response +CreateExtensionAssociationRequest,create_extension_association_request +CreateExtensionRequest,create_extension_request +CreateFHIRDatastoreRequest,create_fhir_datastore_request +CreateFHIRDatastoreResponse,create_fhir_datastore_response +CreateFaceLivenessSessionRequest,create_face_liveness_session_request +CreateFaceLivenessSessionRequestSettings,create_face_liveness_session_request_settings +CreateFaceLivenessSessionResponse,create_face_liveness_session_response +CreateFacetRequest,create_facet_request +CreateFaqRequest,create_faq_request +CreateFaqResponse,create_faq_response +CreateFargateProfileRequest,create_fargate_profile_request +CreateFargateProfileResponse,create_fargate_profile_response +CreateFeatureGroupRequest,create_feature_group_request +CreateFeatureGroupResponse,create_feature_group_response +CreateFeatureRequest,create_feature_request +CreateFeatureResponse,create_feature_response +CreateFeaturedResultsSetRequest,create_featured_results_set_request +CreateFeaturedResultsSetResponse,create_featured_results_set_response +CreateFieldLevelEncryptionConfigRequest,create_field_level_encryption_config_request +CreateFieldLevelEncryptionConfigResult,create_field_level_encryption_config_result +CreateFieldLevelEncryptionProfileRequest,create_field_level_encryption_profile_request +CreateFieldLevelEncryptionProfileResult,create_field_level_encryption_profile_result +CreateFieldRequest,create_field_request +CreateFieldResponse,create_field_response +CreateFileCacheLustreConfiguration,create_file_cache_lustre_configuration +CreateFileCacheRequest,create_file_cache_request +CreateFileCacheResponse,create_file_cache_response +CreateFileSystemFromBackupRequest,create_file_system_from_backup_request +CreateFileSystemFromBackupResponse,create_file_system_from_backup_response +CreateFileSystemLustreConfiguration,create_file_system_lustre_configuration +CreateFileSystemOntapConfiguration,create_file_system_ontap_configuration +CreateFileSystemOpenZFSConfiguration,create_file_system_open_zfs_configuration +CreateFileSystemRequest,create_file_system_request +CreateFileSystemResponse,create_file_system_response +CreateFileSystemWindowsConfiguration,create_file_system_windows_configuration +CreateFilterRequest,create_filter_request +CreateFilterResponse,create_filter_response +CreateFindingAggregatorRequest,create_finding_aggregator_request +CreateFindingAggregatorResponse,create_finding_aggregator_response +CreateFindingsFilterRequest,create_findings_filter_request +CreateFindingsFilterResponse,create_findings_filter_response +CreateFindingsReportRequest,create_findings_report_request +CreateFindingsReportResponse,create_findings_report_response +CreateFirewallDomainListRequest,create_firewall_domain_list_request +CreateFirewallDomainListResponse,create_firewall_domain_list_response +CreateFirewallPolicyRequest,create_firewall_policy_request +CreateFirewallPolicyResponse,create_firewall_policy_response +CreateFirewallRequest,create_firewall_request +CreateFirewallResponse,create_firewall_response +CreateFirewallRuleGroupRequest,create_firewall_rule_group_request +CreateFirewallRuleGroupResponse,create_firewall_rule_group_response +CreateFirewallRuleRequest,create_firewall_rule_request +CreateFirewallRuleResponse,create_firewall_rule_response +CreateFleetAdvisorCollectorRequest,create_fleet_advisor_collector_request +CreateFleetAdvisorCollectorResponse,create_fleet_advisor_collector_response +CreateFleetError,create_fleet_error +CreateFleetInput,create_fleet_input +CreateFleetInstance,create_fleet_instance +CreateFleetLocationsInput,create_fleet_locations_input +CreateFleetLocationsOutput,create_fleet_locations_output +CreateFleetMetricRequest,create_fleet_metric_request +CreateFleetMetricResponse,create_fleet_metric_response +CreateFleetOutput,create_fleet_output +CreateFleetRequest,create_fleet_request +CreateFleetResponse,create_fleet_response +CreateFleetResult,create_fleet_result +CreateFlow420Exception,create_flow420_exception +CreateFlowDefinitionRequest,create_flow_definition_request +CreateFlowDefinitionResponse,create_flow_definition_response +CreateFlowLogsRequest,create_flow_logs_request +CreateFlowLogsResult,create_flow_logs_result +CreateFlowRequest,create_flow_request +CreateFlowResponse,create_flow_response +CreateFlowTemplateRequest,create_flow_template_request +CreateFlowTemplateResponse,create_flow_template_response +CreateFlywheelRequest,create_flywheel_request +CreateFlywheelResponse,create_flywheel_response +CreateFolderMembershipRequest,create_folder_membership_request +CreateFolderMembershipResponse,create_folder_membership_response +CreateFolderRequest,create_folder_request +CreateFolderResponse,create_folder_response +CreateForecastExportJobRequest,create_forecast_export_job_request +CreateForecastExportJobResponse,create_forecast_export_job_response +CreateForecastRequest,create_forecast_request +CreateForecastResponse,create_forecast_response +CreateFormData,create_form_data +CreateFormRequest,create_form_request +CreateFormResponse,create_form_response +CreateFpgaImageRequest,create_fpga_image_request +CreateFpgaImageResult,create_fpga_image_result +CreateFrameworkInput,create_framework_input +CreateFrameworkOutput,create_framework_output +CreateFreeTierConfig,create_free_tier_config +CreateFunctionDefinitionRequest,create_function_definition_request +CreateFunctionDefinitionResponse,create_function_definition_response +CreateFunctionDefinitionVersionRequest,create_function_definition_version_request +CreateFunctionDefinitionVersionResponse,create_function_definition_version_response +CreateFunctionRequest,create_function_request +CreateFunctionResponse,create_function_response +CreateFunctionResult,create_function_result +CreateFunctionUrlConfigRequest,create_function_url_config_request +CreateFunctionUrlConfigResponse,create_function_url_config_response +CreateFuotaTaskRequest,create_fuota_task_request +CreateFuotaTaskResponse,create_fuota_task_response +CreateGUISessionAccessDetailsRequest,create_gui_session_access_details_request +CreateGUISessionAccessDetailsResult,create_gui_session_access_details_result +CreateGameRequest,create_game_request +CreateGameResult,create_game_result +CreateGameServerGroupInput,create_game_server_group_input +CreateGameServerGroupOutput,create_game_server_group_output +CreateGameSessionInput,create_game_session_input +CreateGameSessionOutput,create_game_session_output +CreateGameSessionQueueInput,create_game_session_queue_input +CreateGameSessionQueueOutput,create_game_session_queue_output +CreateGateway420Exception,create_gateway420_exception +CreateGatewayGroupRequest,create_gateway_group_request +CreateGatewayGroupResponse,create_gateway_group_response +CreateGatewayInput,create_gateway_input +CreateGatewayOutput,create_gateway_output +CreateGatewayRequest,create_gateway_request +CreateGatewayResponse,create_gateway_response +CreateGatewayRouteInput,create_gateway_route_input +CreateGatewayRouteOutput,create_gateway_route_output +CreateGeoMatchSetRequest,create_geo_match_set_request +CreateGeoMatchSetResponse,create_geo_match_set_response +CreateGeofenceCollectionRequest,create_geofence_collection_request +CreateGeofenceCollectionResponse,create_geofence_collection_response +CreateGlobalClusterMessage,create_global_cluster_message +CreateGlobalClusterResult,create_global_cluster_result +CreateGlobalNetworkRequest,create_global_network_request +CreateGlobalNetworkResponse,create_global_network_response +CreateGlobalReplicationGroupMessage,create_global_replication_group_message +CreateGlobalReplicationGroupResult,create_global_replication_group_result +CreateGlobalSecondaryIndexAction,create_global_secondary_index_action +CreateGlobalTableInput,create_global_table_input +CreateGlobalTableOutput,create_global_table_output +CreateGovCloudAccountRequest,create_gov_cloud_account_request +CreateGovCloudAccountResponse,create_gov_cloud_account_response +CreateGrantRequest,create_grant_request +CreateGrantResponse,create_grant_response +CreateGrantVersionRequest,create_grant_version_request +CreateGrantVersionResponse,create_grant_version_response +CreateGraphRequest,create_graph_request +CreateGraphResponse,create_graph_response +CreateGraphqlApiRequest,create_graphql_api_request +CreateGraphqlApiResponse,create_graphql_api_response +CreateGrokClassifierRequest,create_grok_classifier_request +CreateGroupCertificateAuthorityRequest,create_group_certificate_authority_request +CreateGroupCertificateAuthorityResponse,create_group_certificate_authority_response +CreateGroupInput,create_group_input +CreateGroupMembershipRequest,create_group_membership_request +CreateGroupMembershipResponse,create_group_membership_response +CreateGroupOutput,create_group_output +CreateGroupRequest,create_group_request +CreateGroupResponse,create_group_response +CreateGroupResult,create_group_result +CreateGroupVersionRequest,create_group_version_request +CreateGroupVersionResponse,create_group_version_response +CreateHITRequest,create_hit_request +CreateHITResponse,create_hit_response +CreateHITTypeRequest,create_hit_type_request +CreateHITTypeResponse,create_hit_type_response +CreateHITWithHITTypeRequest,create_hit_with_hit_type_request +CreateHITWithHITTypeResponse,create_hit_with_hit_type_response +CreateHapgRequest,create_hapg_request +CreateHapgResponse,create_hapg_response +CreateHarvestJobRequest,create_harvest_job_request +CreateHarvestJobResponse,create_harvest_job_response +CreateHealthCheckRequest,create_health_check_request +CreateHealthCheckResponse,create_health_check_response +CreateHlsManifestConfiguration,create_hls_manifest_configuration +CreateHomeRegionControlRequest,create_home_region_control_request +CreateHomeRegionControlResult,create_home_region_control_result +CreateHostInput,create_host_input +CreateHostOutput,create_host_output +CreateHostedConfigurationVersionRequest,create_hosted_configuration_version_request +CreateHostedZoneRequest,create_hosted_zone_request +CreateHostedZoneResponse,create_hosted_zone_response +CreateHoursOfOperationRequest,create_hours_of_operation_request +CreateHoursOfOperationResponse,create_hours_of_operation_response +CreateHsmClientCertificateMessage,create_hsm_client_certificate_message +CreateHsmClientCertificateResult,create_hsm_client_certificate_result +CreateHsmConfigurationMessage,create_hsm_configuration_message +CreateHsmConfigurationResult,create_hsm_configuration_result +CreateHsmRequest,create_hsm_request +CreateHsmResponse,create_hsm_response +CreateHttpNamespaceRequest,create_http_namespace_request +CreateHttpNamespaceResponse,create_http_namespace_response +CreateHubRequest,create_hub_request +CreateHubResponse,create_hub_response +CreateHumanTaskUiRequest,create_human_task_ui_request +CreateHumanTaskUiResponse,create_human_task_ui_response +CreateHyperParameterTuningJobRequest,create_hyper_parameter_tuning_job_request +CreateHyperParameterTuningJobResponse,create_hyper_parameter_tuning_job_response +CreateIAMPolicyAssignmentRequest,create_iam_policy_assignment_request +CreateIAMPolicyAssignmentResponse,create_iam_policy_assignment_response +CreateIPSetRequest,create_ip_set_request +CreateIPSetResponse,create_ip_set_response +CreateIdentityPoolInput,create_identity_pool_input +CreateIdentityProviderRequest,create_identity_provider_request +CreateIdentityProviderResponse,create_identity_provider_response +CreateIdentitySourceInput,create_identity_source_input +CreateIdentitySourceOutput,create_identity_source_output +CreateImageBuilderRequest,create_image_builder_request +CreateImageBuilderResult,create_image_builder_result +CreateImageBuilderStreamingURLRequest,create_image_builder_streaming_url_request +CreateImageBuilderStreamingURLResult,create_image_builder_streaming_url_result +CreateImagePipelineRequest,create_image_pipeline_request +CreateImagePipelineResponse,create_image_pipeline_response +CreateImageRecipeRequest,create_image_recipe_request +CreateImageRecipeResponse,create_image_recipe_response +CreateImageRequest,create_image_request +CreateImageResponse,create_image_response +CreateImageResult,create_image_result +CreateImageVersionRequest,create_image_version_request +CreateImageVersionResponse,create_image_version_response +CreateImpersonationRoleRequest,create_impersonation_role_request +CreateImpersonationRoleResponse,create_impersonation_role_response +CreateImportJobRequest,create_import_job_request +CreateImportJobResponse,create_import_job_response +CreateInAppTemplateRequest,create_in_app_template_request +CreateInAppTemplateResponse,create_in_app_template_response +CreateIndex,create_index +CreateIndexInput,create_index_input +CreateIndexOutput,create_index_output +CreateIndexRequest,create_index_request +CreateIndexResponse,create_index_response +CreateInferenceExperimentRequest,create_inference_experiment_request +CreateInferenceExperimentResponse,create_inference_experiment_response +CreateInferenceRecommendationsJobRequest,create_inference_recommendations_job_request +CreateInferenceRecommendationsJobResponse,create_inference_recommendations_job_response +CreateInferenceSchedulerRequest,create_inference_scheduler_request +CreateInferenceSchedulerResponse,create_inference_scheduler_response +CreateInfrastructureConfigurationRequest,create_infrastructure_configuration_request +CreateInfrastructureConfigurationResponse,create_infrastructure_configuration_response +CreateIngestionDestinationRequest,create_ingestion_destination_request +CreateIngestionDestinationResponse,create_ingestion_destination_response +CreateIngestionRequest,create_ingestion_request +CreateIngestionResponse,create_ingestion_response +CreateInputRequest,create_input_request +CreateInputResponse,create_input_response +CreateInputSecurityGroupRequest,create_input_security_group_request +CreateInputSecurityGroupResponse,create_input_security_group_response +CreateInsightRequest,create_insight_request +CreateInsightResponse,create_insight_response +CreateInstanceAccessControlAttributeConfigurationRequest,create_instance_access_control_attribute_configuration_request +CreateInstanceConnectEndpointRequest,create_instance_connect_endpoint_request +CreateInstanceConnectEndpointResult,create_instance_connect_endpoint_result +CreateInstanceEventWindowRequest,create_instance_event_window_request +CreateInstanceEventWindowResult,create_instance_event_window_result +CreateInstanceExportTaskRequest,create_instance_export_task_request +CreateInstanceExportTaskResult,create_instance_export_task_result +CreateInstanceProfileMessage,create_instance_profile_message +CreateInstanceProfileRequest,create_instance_profile_request +CreateInstanceProfileResponse,create_instance_profile_response +CreateInstanceProfileResult,create_instance_profile_result +CreateInstanceRequest,create_instance_request +CreateInstanceResponse,create_instance_response +CreateInstanceResult,create_instance_result +CreateInstanceSnapshotRequest,create_instance_snapshot_request +CreateInstanceSnapshotResult,create_instance_snapshot_result +CreateInstancesFromSnapshotRequest,create_instances_from_snapshot_request +CreateInstancesFromSnapshotResult,create_instances_from_snapshot_result +CreateInstancesRequest,create_instances_request +CreateInstancesResult,create_instances_result +CreateInstantBooking,create_instant_booking +CreateIntegrationAssociationRequest,create_integration_association_request +CreateIntegrationAssociationResponse,create_integration_association_response +CreateIntegrationRequest,create_integration_request +CreateIntegrationResponseRequest,create_integration_response_request +CreateIntegrationResponseResponse,create_integration_response_response +CreateIntegrationResult,create_integration_result +CreateIntegrationWorkflowRequest,create_integration_workflow_request +CreateIntegrationWorkflowResponse,create_integration_workflow_response +CreateIntentRequest,create_intent_request +CreateIntentResponse,create_intent_response +CreateIntentVersionRequest,create_intent_version_request +CreateIntentVersionResponse,create_intent_version_response +CreateInterconnectRequest,create_interconnect_request +CreateInternetGatewayRequest,create_internet_gateway_request +CreateInternetGatewayResult,create_internet_gateway_result +CreateInvalidationRequest,create_invalidation_request +CreateInvalidationResult,create_invalidation_result +CreateInvitationsRequest,create_invitations_request +CreateInvitationsResponse,create_invitations_response +CreateIpAccessSettingsRequest,create_ip_access_settings_request +CreateIpAccessSettingsResponse,create_ip_access_settings_response +CreateIpGroupRequest,create_ip_group_request +CreateIpGroupResult,create_ip_group_result +CreateIpamPoolRequest,create_ipam_pool_request +CreateIpamPoolResult,create_ipam_pool_result +CreateIpamRequest,create_ipam_request +CreateIpamResourceDiscoveryRequest,create_ipam_resource_discovery_request +CreateIpamResourceDiscoveryResult,create_ipam_resource_discovery_result +CreateIpamResult,create_ipam_result +CreateIpamScopeRequest,create_ipam_scope_request +CreateIpamScopeResult,create_ipam_scope_result +CreateJobForDevicesRequest,create_job_for_devices_request +CreateJobForDevicesResponse,create_job_for_devices_response +CreateJobOutput,create_job_output +CreateJobPlaylist,create_job_playlist +CreateJobQueueRequest,create_job_queue_request +CreateJobQueueResponse,create_job_queue_response +CreateJobRequest,create_job_request +CreateJobResponse,create_job_response +CreateJobResult,create_job_result +CreateJobTemplateRequest,create_job_template_request +CreateJobTemplateResponse,create_job_template_response +CreateJourneyRequest,create_journey_request +CreateJourneyResponse,create_journey_response +CreateJsonClassifierRequest,create_json_classifier_request +CreateKeyGroupRequest,create_key_group_request +CreateKeyGroupResult,create_key_group_result +CreateKeyInput,create_key_input +CreateKeyOutput,create_key_output +CreateKeyPairRequest,create_key_pair_request +CreateKeyPairResult,create_key_pair_result +CreateKeyRequest,create_key_request +CreateKeyResponse,create_key_response +CreateKeySigningKeyRequest,create_key_signing_key_request +CreateKeySigningKeyResponse,create_key_signing_key_response +CreateKeysAndCertificateRequest,create_keys_and_certificate_request +CreateKeysAndCertificateResponse,create_keys_and_certificate_response +CreateKeyspaceRequest,create_keyspace_request +CreateKeyspaceResponse,create_keyspace_response +CreateKnowledgeBaseRequest,create_knowledge_base_request +CreateKnowledgeBaseResponse,create_knowledge_base_response +CreateKxChangesetRequest,create_kx_changeset_request +CreateKxChangesetResponse,create_kx_changeset_response +CreateKxClusterRequest,create_kx_cluster_request +CreateKxClusterResponse,create_kx_cluster_response +CreateKxDatabaseRequest,create_kx_database_request +CreateKxDatabaseResponse,create_kx_database_response +CreateKxEnvironmentRequest,create_kx_environment_request +CreateKxEnvironmentResponse,create_kx_environment_response +CreateKxUserRequest,create_kx_user_request +CreateKxUserResponse,create_kx_user_response +CreateLBCookieStickinessPolicyInput,create_lb_cookie_stickiness_policy_input +CreateLFTagRequest,create_lf_tag_request +CreateLabelGroupRequest,create_label_group_request +CreateLabelGroupResponse,create_label_group_response +CreateLabelRequest,create_label_request +CreateLabelResponse,create_label_response +CreateLabelingJobRequest,create_labeling_job_request +CreateLabelingJobResponse,create_labeling_job_response +CreateLabelsRequest,create_labels_request +CreateLagRequest,create_lag_request +CreateLakeFormationOptInRequest,create_lake_formation_opt_in_request +CreateLanguageModelRequest,create_language_model_request +CreateLanguageModelResponse,create_language_model_response +CreateLaunchConfigurationTemplateRequest,create_launch_configuration_template_request +CreateLaunchConfigurationTemplateResponse,create_launch_configuration_template_response +CreateLaunchConfigurationType,create_launch_configuration_type +CreateLaunchProfileRequest,create_launch_profile_request +CreateLaunchProfileResponse,create_launch_profile_response +CreateLaunchRequest,create_launch_request +CreateLaunchResponse,create_launch_response +CreateLaunchTemplateRequest,create_launch_template_request +CreateLaunchTemplateResult,create_launch_template_result +CreateLaunchTemplateVersionRequest,create_launch_template_version_request +CreateLaunchTemplateVersionResult,create_launch_template_version_result +CreateLayerRequest,create_layer_request +CreateLayerResult,create_layer_result +CreateLayoutRequest,create_layout_request +CreateLayoutResponse,create_layout_response +CreateLedgerRequest,create_ledger_request +CreateLedgerResponse,create_ledger_response +CreateLegalHoldInput,create_legal_hold_input +CreateLegalHoldOutput,create_legal_hold_output +CreateLensShareInput,create_lens_share_input +CreateLensShareOutput,create_lens_share_output +CreateLensVersionInput,create_lens_version_input +CreateLensVersionOutput,create_lens_version_output +CreateLicenseConfigurationRequest,create_license_configuration_request +CreateLicenseConfigurationResponse,create_license_configuration_response +CreateLicenseConversionTaskForResourceRequest,create_license_conversion_task_for_resource_request +CreateLicenseConversionTaskForResourceResponse,create_license_conversion_task_for_resource_response +CreateLicenseManagerReportGeneratorRequest,create_license_manager_report_generator_request +CreateLicenseManagerReportGeneratorResponse,create_license_manager_report_generator_response +CreateLicenseRequest,create_license_request +CreateLicenseResponse,create_license_response +CreateLicenseVersionRequest,create_license_version_request +CreateLicenseVersionResponse,create_license_version_response +CreateLifecyclePolicyRequest,create_lifecycle_policy_request +CreateLifecyclePolicyResponse,create_lifecycle_policy_response +CreateLinkInput,create_link_input +CreateLinkOutput,create_link_output +CreateLinkRequest,create_link_request +CreateLinkResponse,create_link_response +CreateListRequest,create_list_request +CreateListenerInput,create_listener_input +CreateListenerOutput,create_listener_output +CreateListenerRequest,create_listener_request +CreateListenerResponse,create_listener_response +CreateLiveSourceRequest,create_live_source_request +CreateLiveSourceResponse,create_live_source_response +CreateLoadBalancerInput,create_load_balancer_input +CreateLoadBalancerListenerInput,create_load_balancer_listener_input +CreateLoadBalancerOutput,create_load_balancer_output +CreateLoadBalancerPolicyInput,create_load_balancer_policy_input +CreateLoadBalancerRequest,create_load_balancer_request +CreateLoadBalancerResult,create_load_balancer_result +CreateLoadBalancerTlsCertificateRequest,create_load_balancer_tls_certificate_request +CreateLoadBalancerTlsCertificateResult,create_load_balancer_tls_certificate_result +CreateLocalGatewayRouteRequest,create_local_gateway_route_request +CreateLocalGatewayRouteResult,create_local_gateway_route_result +CreateLocalGatewayRouteTableRequest,create_local_gateway_route_table_request +CreateLocalGatewayRouteTableResult,create_local_gateway_route_table_result +CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest,create_local_gateway_route_table_virtual_interface_group_association_request +CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult,create_local_gateway_route_table_virtual_interface_group_association_result +CreateLocalGatewayRouteTableVpcAssociationRequest,create_local_gateway_route_table_vpc_association_request +CreateLocalGatewayRouteTableVpcAssociationResult,create_local_gateway_route_table_vpc_association_result +CreateLocationAzureBlobRequest,create_location_azure_blob_request +CreateLocationAzureBlobResponse,create_location_azure_blob_response +CreateLocationEfsRequest,create_location_efs_request +CreateLocationEfsResponse,create_location_efs_response +CreateLocationFsxLustreRequest,create_location_fsx_lustre_request +CreateLocationFsxLustreResponse,create_location_fsx_lustre_response +CreateLocationFsxOntapRequest,create_location_fsx_ontap_request +CreateLocationFsxOntapResponse,create_location_fsx_ontap_response +CreateLocationFsxOpenZfsRequest,create_location_fsx_open_zfs_request +CreateLocationFsxOpenZfsResponse,create_location_fsx_open_zfs_response +CreateLocationFsxWindowsRequest,create_location_fsx_windows_request +CreateLocationFsxWindowsResponse,create_location_fsx_windows_response +CreateLocationHdfsRequest,create_location_hdfs_request +CreateLocationHdfsResponse,create_location_hdfs_response +CreateLocationInput,create_location_input +CreateLocationNfsRequest,create_location_nfs_request +CreateLocationNfsResponse,create_location_nfs_response +CreateLocationObjectStorageRequest,create_location_object_storage_request +CreateLocationObjectStorageResponse,create_location_object_storage_response +CreateLocationOutput,create_location_output +CreateLocationS3Request,create_location_s3_request +CreateLocationS3Response,create_location_s3_response +CreateLocationSmbRequest,create_location_smb_request +CreateLocationSmbResponse,create_location_smb_response +CreateLogGroupRequest,create_log_group_request +CreateLogPatternRequest,create_log_pattern_request +CreateLogPatternResponse,create_log_pattern_response +CreateLogStreamRequest,create_log_stream_request +CreateLogSubscriptionRequest,create_log_subscription_request +CreateLoggerDefinitionRequest,create_logger_definition_request +CreateLoggerDefinitionResponse,create_logger_definition_response +CreateLoggerDefinitionVersionRequest,create_logger_definition_version_request +CreateLoggerDefinitionVersionResponse,create_logger_definition_version_response +CreateLoggingConfigurationRequest,create_logging_configuration_request +CreateLoggingConfigurationResponse,create_logging_configuration_response +CreateLogicallyAirGappedBackupVaultInput,create_logically_air_gapped_backup_vault_input +CreateLogicallyAirGappedBackupVaultOutput,create_logically_air_gapped_backup_vault_output +CreateLoginProfileRequest,create_login_profile_request +CreateLoginProfileResponse,create_login_profile_response +CreateLongTermPricingRequest,create_long_term_pricing_request +CreateLongTermPricingResult,create_long_term_pricing_result +CreateLowLatencyHlsManifestConfiguration,create_low_latency_hls_manifest_configuration +CreateLunaClientRequest,create_luna_client_request +CreateLunaClientResponse,create_luna_client_response +CreateMLEndpointInput,create_ml_endpoint_input +CreateMLEndpointOutput,create_ml_endpoint_output +CreateMLModelInput,create_ml_model_input +CreateMLModelOutput,create_ml_model_output +CreateMLTransformRequest,create_ml_transform_request +CreateMLTransformResponse,create_ml_transform_response +CreateMaintenanceWindowRequest,create_maintenance_window_request +CreateMaintenanceWindowResult,create_maintenance_window_result +CreateManagedEndpointRequest,create_managed_endpoint_request +CreateManagedEndpointResponse,create_managed_endpoint_response +CreateManagedPrefixListRequest,create_managed_prefix_list_request +CreateManagedPrefixListResult,create_managed_prefix_list_result +CreateMapRequest,create_map_request +CreateMapResponse,create_map_response +CreateMatchingWorkflowInput,create_matching_workflow_input +CreateMatchingWorkflowOutput,create_matching_workflow_output +CreateMatchmakingConfigurationInput,create_matchmaking_configuration_input +CreateMatchmakingConfigurationOutput,create_matchmaking_configuration_output +CreateMatchmakingRuleSetInput,create_matchmaking_rule_set_input +CreateMatchmakingRuleSetOutput,create_matchmaking_rule_set_output +CreateMediaCapturePipelineRequest,create_media_capture_pipeline_request +CreateMediaCapturePipelineResponse,create_media_capture_pipeline_response +CreateMediaConcatenationPipelineRequest,create_media_concatenation_pipeline_request +CreateMediaConcatenationPipelineResponse,create_media_concatenation_pipeline_response +CreateMediaInsightsPipelineConfigurationRequest,create_media_insights_pipeline_configuration_request +CreateMediaInsightsPipelineConfigurationResponse,create_media_insights_pipeline_configuration_response +CreateMediaInsightsPipelineRequest,create_media_insights_pipeline_request +CreateMediaInsightsPipelineResponse,create_media_insights_pipeline_response +CreateMediaLiveConnectorPipelineRequest,create_media_live_connector_pipeline_request +CreateMediaLiveConnectorPipelineResponse,create_media_live_connector_pipeline_response +CreateMediaPipelineKinesisVideoStreamPoolRequest,create_media_pipeline_kinesis_video_stream_pool_request +CreateMediaPipelineKinesisVideoStreamPoolResponse,create_media_pipeline_kinesis_video_stream_pool_response +CreateMediaStreamPipelineRequest,create_media_stream_pipeline_request +CreateMediaStreamPipelineResponse,create_media_stream_pipeline_response +CreateMedicalVocabularyRequest,create_medical_vocabulary_request +CreateMedicalVocabularyResponse,create_medical_vocabulary_response +CreateMeetingDialOutRequest,create_meeting_dial_out_request +CreateMeetingDialOutResponse,create_meeting_dial_out_response +CreateMeetingRequest,create_meeting_request +CreateMeetingResponse,create_meeting_response +CreateMeetingRoomConfiguration,create_meeting_room_configuration +CreateMeetingWithAttendeesRequest,create_meeting_with_attendees_request +CreateMeetingWithAttendeesResponse,create_meeting_with_attendees_response +CreateMemberInput,create_member_input +CreateMemberOutput,create_member_output +CreateMemberRequest,create_member_request +CreateMemberResponse,create_member_response +CreateMembersRequest,create_members_request +CreateMembersResponse,create_members_response +CreateMembershipInput,create_membership_input +CreateMembershipOutput,create_membership_output +CreateMeshInput,create_mesh_input +CreateMeshOutput,create_mesh_output +CreateMetricAttributionRequest,create_metric_attribution_request +CreateMetricAttributionResponse,create_metric_attribution_response +CreateMetricSetRequest,create_metric_set_request +CreateMetricSetResponse,create_metric_set_response +CreateMicrosoftADRequest,create_microsoft_ad_request +CreateMicrosoftADResult,create_microsoft_ad_result +CreateMigrationProjectMessage,create_migration_project_message +CreateMigrationProjectResponse,create_migration_project_response +CreateMigrationWorkflowRequest,create_migration_workflow_request +CreateMigrationWorkflowResponse,create_migration_workflow_response +CreateMilestoneInput,create_milestone_input +CreateMilestoneOutput,create_milestone_output +CreateMissionProfileRequest,create_mission_profile_request +CreateMitigationActionRequest,create_mitigation_action_request +CreateMitigationActionResponse,create_mitigation_action_response +CreateMobileDeviceAccessRuleRequest,create_mobile_device_access_rule_request +CreateMobileDeviceAccessRuleResponse,create_mobile_device_access_rule_response +CreateModelBiasJobDefinitionRequest,create_model_bias_job_definition_request +CreateModelBiasJobDefinitionResponse,create_model_bias_job_definition_response +CreateModelCardExportJobRequest,create_model_card_export_job_request +CreateModelCardExportJobResponse,create_model_card_export_job_response +CreateModelCardRequest,create_model_card_request +CreateModelCardResponse,create_model_card_response +CreateModelCustomizationJobRequest,create_model_customization_job_request +CreateModelCustomizationJobResponse,create_model_customization_job_response +CreateModelExplainabilityJobDefinitionRequest,create_model_explainability_job_definition_request +CreateModelExplainabilityJobDefinitionResponse,create_model_explainability_job_definition_response +CreateModelInput,create_model_input +CreateModelManifestRequest,create_model_manifest_request +CreateModelManifestResponse,create_model_manifest_response +CreateModelOutput,create_model_output +CreateModelPackageGroupInput,create_model_package_group_input +CreateModelPackageGroupOutput,create_model_package_group_output +CreateModelPackageInput,create_model_package_input +CreateModelPackageOutput,create_model_package_output +CreateModelQualityJobDefinitionRequest,create_model_quality_job_definition_request +CreateModelQualityJobDefinitionResponse,create_model_quality_job_definition_response +CreateModelRequest,create_model_request +CreateModelResponse,create_model_response +CreateModelVersionRequest,create_model_version_request +CreateModelVersionResult,create_model_version_result +CreateMonitorInput,create_monitor_input +CreateMonitorOutput,create_monitor_output +CreateMonitorRequest,create_monitor_request +CreateMonitorResponse,create_monitor_response +CreateMonitoringScheduleRequest,create_monitoring_schedule_request +CreateMonitoringScheduleResponse,create_monitoring_schedule_response +CreateMonitoringSubscriptionRequest,create_monitoring_subscription_request +CreateMonitoringSubscriptionResult,create_monitoring_subscription_result +CreateMountTargetRequest,create_mount_target_request +CreateMultiRegionAccessPointInput,create_multi_region_access_point_input +CreateMultiRegionAccessPointRequest,create_multi_region_access_point_request +CreateMultiRegionAccessPointResult,create_multi_region_access_point_result +CreateMulticastGroupRequest,create_multicast_group_request +CreateMulticastGroupResponse,create_multicast_group_response +CreateMultipartReadSetUploadRequest,create_multipart_read_set_upload_request +CreateMultipartReadSetUploadResponse,create_multipart_read_set_upload_response +CreateMultipartUploadOutput,create_multipart_upload_output +CreateMultipartUploadRequest,create_multipart_upload_request +CreateMultiplexProgramRequest,create_multiplex_program_request +CreateMultiplexProgramResponse,create_multiplex_program_response +CreateMultiplexRequest,create_multiplex_request +CreateMultiplexResponse,create_multiplex_response +CreateNFSFileShareInput,create_nfs_file_share_input +CreateNFSFileShareOutput,create_nfs_file_share_output +CreateNamedQueryInput,create_named_query_input +CreateNamedQueryOutput,create_named_query_output +CreateNamespaceRequest,create_namespace_request +CreateNamespaceResponse,create_namespace_response +CreateNatGatewayRequest,create_nat_gateway_request +CreateNatGatewayResult,create_nat_gateway_result +CreateNativeDeltaTable,create_native_delta_table +CreateNetworkAclEntryRequest,create_network_acl_entry_request +CreateNetworkAclRequest,create_network_acl_request +CreateNetworkAclResult,create_network_acl_result +CreateNetworkAnalyzerConfigurationRequest,create_network_analyzer_configuration_request +CreateNetworkAnalyzerConfigurationResponse,create_network_analyzer_configuration_response +CreateNetworkInput,create_network_input +CreateNetworkInsightsAccessScopeRequest,create_network_insights_access_scope_request +CreateNetworkInsightsAccessScopeResult,create_network_insights_access_scope_result +CreateNetworkInsightsPathRequest,create_network_insights_path_request +CreateNetworkInsightsPathResult,create_network_insights_path_result +CreateNetworkInterfacePermissionRequest,create_network_interface_permission_request +CreateNetworkInterfacePermissionResult,create_network_interface_permission_result +CreateNetworkInterfaceRequest,create_network_interface_request +CreateNetworkInterfaceResult,create_network_interface_result +CreateNetworkOutput,create_network_output +CreateNetworkProfileRequest,create_network_profile_request +CreateNetworkProfileResponse,create_network_profile_response +CreateNetworkProfileResult,create_network_profile_result +CreateNetworkRequest,create_network_request +CreateNetworkResponse,create_network_response +CreateNetworkSettingsRequest,create_network_settings_request +CreateNetworkSettingsResponse,create_network_settings_response +CreateNetworkSiteRequest,create_network_site_request +CreateNetworkSiteResponse,create_network_site_response +CreateNewVersion,create_new_version +CreateNodeFromTemplateJobRequest,create_node_from_template_job_request +CreateNodeFromTemplateJobResponse,create_node_from_template_job_response +CreateNodeInput,create_node_input +CreateNodeOutput,create_node_output +CreateNodegroupRequest,create_nodegroup_request +CreateNodegroupResponse,create_nodegroup_response +CreateNotebookInput,create_notebook_input +CreateNotebookInstanceInput,create_notebook_instance_input +CreateNotebookInstanceLifecycleConfigInput,create_notebook_instance_lifecycle_config_input +CreateNotebookInstanceLifecycleConfigOutput,create_notebook_instance_lifecycle_config_output +CreateNotebookInstanceOutput,create_notebook_instance_output +CreateNotebookOutput,create_notebook_output +CreateNotificationRequest,create_notification_request +CreateNotificationRuleRequest,create_notification_rule_request +CreateNotificationRuleResult,create_notification_rule_result +CreateNotificationSubscriptionRequest,create_notification_subscription_request +CreateNotificationSubscriptionResponse,create_notification_subscription_response +CreateOTAUpdateRequest,create_ota_update_request +CreateOTAUpdateResponse,create_ota_update_response +CreateObject,create_object +CreateObjectRequest,create_object_request +CreateObjectResponse,create_object_response +CreateObservabilityConfigurationRequest,create_observability_configuration_request +CreateObservabilityConfigurationResponse,create_observability_configuration_response +CreateOntapVolumeConfiguration,create_ontap_volume_configuration +CreateOpenIDConnectProviderRequest,create_open_id_connect_provider_request +CreateOpenIDConnectProviderResponse,create_open_id_connect_provider_response +CreateOpenZFSOriginSnapshotConfiguration,create_open_zfs_origin_snapshot_configuration +CreateOpenZFSVolumeConfiguration,create_open_zfs_volume_configuration +CreateOpsItemRequest,create_ops_item_request +CreateOpsItemResponse,create_ops_item_response +CreateOpsMetadataRequest,create_ops_metadata_request +CreateOpsMetadataResult,create_ops_metadata_result +CreateOptOutListRequest,create_opt_out_list_request +CreateOptOutListResult,create_opt_out_list_result +CreateOptionGroupMessage,create_option_group_message +CreateOptionGroupResult,create_option_group_result +CreateOrUpdateTagsType,create_or_update_tags_type +CreateOrderInput,create_order_input +CreateOrderOutput,create_order_output +CreateOrganizationRequest,create_organization_request +CreateOrganizationResponse,create_organization_response +CreateOrganizationalUnitRequest,create_organizational_unit_request +CreateOrganizationalUnitResponse,create_organizational_unit_response +CreateOriginAccessControlRequest,create_origin_access_control_request +CreateOriginAccessControlResult,create_origin_access_control_result +CreateOriginEndpointRequest,create_origin_endpoint_request +CreateOriginEndpointResponse,create_origin_endpoint_response +CreateOriginRequestPolicyRequest,create_origin_request_policy_request +CreateOriginRequestPolicyResult,create_origin_request_policy_result +CreateOutboundConnectionRequest,create_outbound_connection_request +CreateOutboundConnectionResponse,create_outbound_connection_response +CreateOutboundCrossClusterSearchConnectionRequest,create_outbound_cross_cluster_search_connection_request +CreateOutboundCrossClusterSearchConnectionResponse,create_outbound_cross_cluster_search_connection_response +CreateOutpostInput,create_outpost_input +CreateOutpostOutput,create_outpost_output +CreateOutpostResolverRequest,create_outpost_resolver_request +CreateOutpostResolverResponse,create_outpost_resolver_response +CreatePackageImportJobRequest,create_package_import_job_request +CreatePackageImportJobResponse,create_package_import_job_response +CreatePackageRequest,create_package_request +CreatePackageResponse,create_package_response +CreatePackageVersionRequest,create_package_version_request +CreatePackageVersionResponse,create_package_version_response +CreatePackagingConfigurationRequest,create_packaging_configuration_request +CreatePackagingConfigurationResponse,create_packaging_configuration_response +CreatePackagingGroupRequest,create_packaging_group_request +CreatePackagingGroupResponse,create_packaging_group_response +CreateParallelDataRequest,create_parallel_data_request +CreateParallelDataResponse,create_parallel_data_response +CreateParameterGroupRequest,create_parameter_group_request +CreateParameterGroupResponse,create_parameter_group_response +CreateParticipantConnectionRequest,create_participant_connection_request +CreateParticipantConnectionResponse,create_participant_connection_response +CreateParticipantRequest,create_participant_request +CreateParticipantResponse,create_participant_response +CreateParticipantTokenRequest,create_participant_token_request +CreateParticipantTokenResponse,create_participant_token_response +CreatePartitionIndexRequest,create_partition_index_request +CreatePartitionRequest,create_partition_request +CreatePartnerEventSourceRequest,create_partner_event_source_request +CreatePartnerEventSourceResponse,create_partner_event_source_response +CreatePartnerInputRequest,create_partner_input_request +CreatePartnerInputResponse,create_partner_input_response +CreatePatchBaselineRequest,create_patch_baseline_request +CreatePatchBaselineResult,create_patch_baseline_result +CreatePerformanceAnalysisReportRequest,create_performance_analysis_report_request +CreatePerformanceAnalysisReportResponse,create_performance_analysis_report_response +CreatePermissionGroupRequest,create_permission_group_request +CreatePermissionGroupResponse,create_permission_group_response +CreatePermissionRequest,create_permission_request +CreatePermissionResponse,create_permission_response +CreatePermissionSetRequest,create_permission_set_request +CreatePermissionSetResponse,create_permission_set_response +CreatePermissionVersionRequest,create_permission_version_request +CreatePermissionVersionResponse,create_permission_version_response +CreatePhoneNumberOrderRequest,create_phone_number_order_request +CreatePhoneNumberOrderResponse,create_phone_number_order_response +CreatePipeRequest,create_pipe_request +CreatePipeResponse,create_pipe_response +CreatePipelineInput,create_pipeline_input +CreatePipelineOutput,create_pipeline_output +CreatePipelineRequest,create_pipeline_request +CreatePipelineResponse,create_pipeline_response +CreatePlaceIndexRequest,create_place_index_request +CreatePlaceIndexResponse,create_place_index_response +CreatePlacementGroupRequest,create_placement_group_request +CreatePlacementGroupResult,create_placement_group_result +CreatePlacementRequest,create_placement_request +CreatePlatformApplicationInput,create_platform_application_input +CreatePlatformApplicationResponse,create_platform_application_response +CreatePlatformEndpointInput,create_platform_endpoint_input +CreatePlatformVersionRequest,create_platform_version_request +CreatePlatformVersionResult,create_platform_version_result +CreatePlayerSessionInput,create_player_session_input +CreatePlayerSessionOutput,create_player_session_output +CreatePlayerSessionsInput,create_player_sessions_input +CreatePlayerSessionsOutput,create_player_sessions_output +CreatePolicyInput,create_policy_input +CreatePolicyOutput,create_policy_output +CreatePolicyRequest,create_policy_request +CreatePolicyResponse,create_policy_response +CreatePolicyStoreInput,create_policy_store_input +CreatePolicyStoreOutput,create_policy_store_output +CreatePolicyTemplateInput,create_policy_template_input +CreatePolicyTemplateOutput,create_policy_template_output +CreatePolicyVersionRequest,create_policy_version_request +CreatePolicyVersionResponse,create_policy_version_response +CreatePoolRequest,create_pool_request +CreatePoolResult,create_pool_result +CreatePortalRequest,create_portal_request +CreatePortalResponse,create_portal_response +CreatePortfolioInput,create_portfolio_input +CreatePortfolioOutput,create_portfolio_output +CreatePortfolioShareInput,create_portfolio_share_input +CreatePortfolioShareOutput,create_portfolio_share_output +CreatePredictorBacktestExportJobRequest,create_predictor_backtest_export_job_request +CreatePredictorBacktestExportJobResponse,create_predictor_backtest_export_job_response +CreatePredictorRequest,create_predictor_request +CreatePredictorResponse,create_predictor_response +CreatePrefetchScheduleRequest,create_prefetch_schedule_request +CreatePrefetchScheduleResponse,create_prefetch_schedule_response +CreatePreparedStatementInput,create_prepared_statement_input +CreatePresetRequest,create_preset_request +CreatePresetResponse,create_preset_response +CreatePresignedDomainUrlRequest,create_presigned_domain_url_request +CreatePresignedDomainUrlResponse,create_presigned_domain_url_response +CreatePresignedNotebookInstanceUrlInput,create_presigned_notebook_instance_url_input +CreatePresignedNotebookInstanceUrlOutput,create_presigned_notebook_instance_url_output +CreatePresignedNotebookUrlRequest,create_presigned_notebook_url_request +CreatePresignedNotebookUrlResponse,create_presigned_notebook_url_response +CreatePricingPlanInput,create_pricing_plan_input +CreatePricingPlanOutput,create_pricing_plan_output +CreatePricingRuleInput,create_pricing_rule_input +CreatePricingRuleOutput,create_pricing_rule_output +CreatePrivateDnsNamespaceRequest,create_private_dns_namespace_request +CreatePrivateDnsNamespaceResponse,create_private_dns_namespace_response +CreatePrivateVirtualInterfaceRequest,create_private_virtual_interface_request +CreateProactiveJoin,create_proactive_join +CreateProcessingJobRequest,create_processing_job_request +CreateProcessingJobResponse,create_processing_job_response +CreateProductInput,create_product_input +CreateProductOutput,create_product_output +CreateProfileInput,create_profile_input +CreateProfileJobRequest,create_profile_job_request +CreateProfileJobResponse,create_profile_job_response +CreateProfileOutput,create_profile_output +CreateProfileRequest,create_profile_request +CreateProfileResponse,create_profile_response +CreateProfileShareInput,create_profile_share_input +CreateProfileShareOutput,create_profile_share_output +CreateProfilingGroupRequest,create_profiling_group_request +CreateProfilingGroupResponse,create_profiling_group_response +CreateProgramRequest,create_program_request +CreateProgramResponse,create_program_response +CreateProgressUpdateStreamRequest,create_progress_update_stream_request +CreateProjectInput,create_project_input +CreateProjectOutput,create_project_output +CreateProjectRequest,create_project_request +CreateProjectResponse,create_project_response +CreateProjectResult,create_project_result +CreateProjectVersionRequest,create_project_version_request +CreateProjectVersionResponse,create_project_version_response +CreatePromptRequest,create_prompt_request +CreatePromptResponse,create_prompt_response +CreateProposalInput,create_proposal_input +CreateProposalOutput,create_proposal_output +CreateProtectionGroupRequest,create_protection_group_request +CreateProtectionRequest,create_protection_request +CreateProtectionResponse,create_protection_response +CreateProvisionedModelThroughputRequest,create_provisioned_model_throughput_request +CreateProvisionedModelThroughputResponse,create_provisioned_model_throughput_response +CreateProvisionedProductPlanInput,create_provisioned_product_plan_input +CreateProvisionedProductPlanOutput,create_provisioned_product_plan_output +CreateProvisioningArtifactInput,create_provisioning_artifact_input +CreateProvisioningArtifactOutput,create_provisioning_artifact_output +CreateProvisioningClaimRequest,create_provisioning_claim_request +CreateProvisioningClaimResponse,create_provisioning_claim_response +CreateProvisioningTemplateRequest,create_provisioning_template_request +CreateProvisioningTemplateResponse,create_provisioning_template_response +CreateProvisioningTemplateVersionRequest,create_provisioning_template_version_request +CreateProvisioningTemplateVersionResponse,create_provisioning_template_version_response +CreateProxySessionRequest,create_proxy_session_request +CreateProxySessionResponse,create_proxy_session_response +CreatePublicDnsNamespaceRequest,create_public_dns_namespace_request +CreatePublicDnsNamespaceResponse,create_public_dns_namespace_response +CreatePublicIpv4PoolRequest,create_public_ipv4_pool_request +CreatePublicIpv4PoolResult,create_public_ipv4_pool_result +CreatePublicKeyRequest,create_public_key_request +CreatePublicKeyResult,create_public_key_result +CreatePublicVirtualInterfaceRequest,create_public_virtual_interface_request +CreatePublishingDestinationRequest,create_publishing_destination_request +CreatePublishingDestinationResponse,create_publishing_destination_response +CreatePullRequestApprovalRuleInput,create_pull_request_approval_rule_input +CreatePullRequestApprovalRuleOutput,create_pull_request_approval_rule_output +CreatePullRequestInput,create_pull_request_input +CreatePullRequestOutput,create_pull_request_output +CreatePullThroughCacheRuleRequest,create_pull_through_cache_rule_request +CreatePullThroughCacheRuleResponse,create_pull_through_cache_rule_response +CreatePushTemplateRequest,create_push_template_request +CreatePushTemplateResponse,create_push_template_response +CreateQualificationTypeRequest,create_qualification_type_request +CreateQualificationTypeResponse,create_qualification_type_response +CreateQuantumTaskRequest,create_quantum_task_request +CreateQuantumTaskResponse,create_quantum_task_response +CreateQueryLoggingConfigRequest,create_query_logging_config_request +CreateQueryLoggingConfigResponse,create_query_logging_config_response +CreateQuerySuggestionsBlockListRequest,create_query_suggestions_block_list_request +CreateQuerySuggestionsBlockListResponse,create_query_suggestions_block_list_response +CreateQueueRequest,create_queue_request +CreateQueueResponse,create_queue_response +CreateQueueResult,create_queue_result +CreateQuickConnectRequest,create_quick_connect_request +CreateQuickConnectResponse,create_quick_connect_response +CreateRateBasedRuleRequest,create_rate_based_rule_request +CreateRateBasedRuleResponse,create_rate_based_rule_response +CreateReadinessCheckRequest,create_readiness_check_request +CreateReadinessCheckResponse,create_readiness_check_response +CreateRealtimeEndpointInput,create_realtime_endpoint_input +CreateRealtimeEndpointOutput,create_realtime_endpoint_output +CreateRealtimeLogConfigRequest,create_realtime_log_config_request +CreateRealtimeLogConfigResult,create_realtime_log_config_result +CreateReceiptFilterRequest,create_receipt_filter_request +CreateReceiptRuleRequest,create_receipt_rule_request +CreateReceiptRuleSetRequest,create_receipt_rule_set_request +CreateRecipeJobRequest,create_recipe_job_request +CreateRecipeJobResponse,create_recipe_job_response +CreateRecipeRequest,create_recipe_request +CreateRecipeResponse,create_recipe_response +CreateRecommendationTemplateRequest,create_recommendation_template_request +CreateRecommendationTemplateResponse,create_recommendation_template_response +CreateRecommenderConfiguration,create_recommender_configuration +CreateRecommenderConfigurationRequest,create_recommender_configuration_request +CreateRecommenderConfigurationResponse,create_recommender_configuration_response +CreateRecommenderConfigurationShape,create_recommender_configuration_shape +CreateRecommenderRequest,create_recommender_request +CreateRecommenderResponse,create_recommender_response +CreateRecordingConfigurationRequest,create_recording_configuration_request +CreateRecordingConfigurationResponse,create_recording_configuration_response +CreateRecoveryGroupRequest,create_recovery_group_request +CreateRecoveryGroupResponse,create_recovery_group_response +CreateReferenceStoreRequest,create_reference_store_request +CreateReferenceStoreResponse,create_reference_store_response +CreateRefreshScheduleRequest,create_refresh_schedule_request +CreateRefreshScheduleResponse,create_refresh_schedule_response +CreateRegexMatchSetRequest,create_regex_match_set_request +CreateRegexMatchSetResponse,create_regex_match_set_response +CreateRegexPatternSetRequest,create_regex_pattern_set_request +CreateRegexPatternSetResponse,create_regex_pattern_set_response +CreateRegistryInput,create_registry_input +CreateRegistryRequest,create_registry_request +CreateRegistryResponse,create_registry_response +CreateRelatedItemRequest,create_related_item_request +CreateRelatedItemResponse,create_related_item_response +CreateRelationalDatabaseFromSnapshotRequest,create_relational_database_from_snapshot_request +CreateRelationalDatabaseFromSnapshotResult,create_relational_database_from_snapshot_result +CreateRelationalDatabaseRequest,create_relational_database_request +CreateRelationalDatabaseResult,create_relational_database_result +CreateRelationalDatabaseSnapshotRequest,create_relational_database_snapshot_request +CreateRelationalDatabaseSnapshotResult,create_relational_database_snapshot_result +CreateRemoteAccessSessionConfiguration,create_remote_access_session_configuration +CreateRemoteAccessSessionRequest,create_remote_access_session_request +CreateRemoteAccessSessionResult,create_remote_access_session_result +CreateReplaceRootVolumeTaskRequest,create_replace_root_volume_task_request +CreateReplaceRootVolumeTaskResult,create_replace_root_volume_task_result +CreateReplicaAction,create_replica_action +CreateReplicationConfigMessage,create_replication_config_message +CreateReplicationConfigResponse,create_replication_config_response +CreateReplicationConfigurationRequest,create_replication_configuration_request +CreateReplicationConfigurationTemplateRequest,create_replication_configuration_template_request +CreateReplicationGroupMemberAction,create_replication_group_member_action +CreateReplicationGroupMessage,create_replication_group_message +CreateReplicationGroupResult,create_replication_group_result +CreateReplicationInstanceMessage,create_replication_instance_message +CreateReplicationInstanceResponse,create_replication_instance_response +CreateReplicationJobRequest,create_replication_job_request +CreateReplicationJobResponse,create_replication_job_response +CreateReplicationSetInput,create_replication_set_input +CreateReplicationSetOutput,create_replication_set_output +CreateReplicationSubnetGroupMessage,create_replication_subnet_group_message +CreateReplicationSubnetGroupResponse,create_replication_subnet_group_response +CreateReplicationTaskMessage,create_replication_task_message +CreateReplicationTaskResponse,create_replication_task_response +CreateReportGroupInput,create_report_group_input +CreateReportGroupOutput,create_report_group_output +CreateReportPlanInput,create_report_plan_input +CreateReportPlanOutput,create_report_plan_output +CreateRepositoryInput,create_repository_input +CreateRepositoryOutput,create_repository_output +CreateRepositoryRequest,create_repository_request +CreateRepositoryResponse,create_repository_response +CreateRepositoryResult,create_repository_result +CreateRequestValidatorRequest,create_request_validator_request +CreateRequireCheckIn,create_require_check_in +CreateRescoreExecutionPlanRequest,create_rescore_execution_plan_request +CreateRescoreExecutionPlanResponse,create_rescore_execution_plan_response +CreateReservedInstancesListingRequest,create_reserved_instances_listing_request +CreateReservedInstancesListingResult,create_reserved_instances_listing_result +CreateResiliencyPolicyRequest,create_resiliency_policy_request +CreateResiliencyPolicyResponse,create_resiliency_policy_response +CreateResolverEndpointRequest,create_resolver_endpoint_request +CreateResolverEndpointResponse,create_resolver_endpoint_response +CreateResolverQueryLogConfigRequest,create_resolver_query_log_config_request +CreateResolverQueryLogConfigResponse,create_resolver_query_log_config_response +CreateResolverRequest,create_resolver_request +CreateResolverResponse,create_resolver_response +CreateResolverRuleRequest,create_resolver_rule_request +CreateResolverRuleResponse,create_resolver_rule_response +CreateResourceDataSyncRequest,create_resource_data_sync_request +CreateResourceDefinitionRequest,create_resource_definition_request +CreateResourceDefinitionResponse,create_resource_definition_response +CreateResourceDefinitionVersionRequest,create_resource_definition_version_request +CreateResourceDefinitionVersionResponse,create_resource_definition_version_response +CreateResourceGroupRequest,create_resource_group_request +CreateResourceGroupResponse,create_resource_group_response +CreateResourceInput,create_resource_input +CreateResourceOutput,create_resource_output +CreateResourcePolicyRequest,create_resource_policy_request +CreateResourcePolicyResponse,create_resource_policy_response +CreateResourcePolicyStatementRequest,create_resource_policy_statement_request +CreateResourcePolicyStatementResponse,create_resource_policy_statement_response +CreateResourceRequest,create_resource_request +CreateResourceResponse,create_resource_response +CreateResourceServerRequest,create_resource_server_request +CreateResourceServerResponse,create_resource_server_response +CreateResourceSetRequest,create_resource_set_request +CreateResourceSetResponse,create_resource_set_response +CreateResourceShareRequest,create_resource_share_request +CreateResourceShareResponse,create_resource_share_response +CreateResponseHeadersPolicyRequest,create_response_headers_policy_request +CreateResponseHeadersPolicyResult,create_response_headers_policy_result +CreateResponsePlanInput,create_response_plan_input +CreateResponsePlanOutput,create_response_plan_output +CreateRestApiRequest,create_rest_api_request +CreateRestoreImageTaskRequest,create_restore_image_task_request +CreateRestoreImageTaskResult,create_restore_image_task_result +CreateRetrainingSchedulerRequest,create_retraining_scheduler_request +CreateRetrainingSchedulerResponse,create_retraining_scheduler_response +CreateReturnShippingLabelRequest,create_return_shipping_label_request +CreateReturnShippingLabelResult,create_return_shipping_label_result +CreateReusableDelegationSetRequest,create_reusable_delegation_set_request +CreateReusableDelegationSetResponse,create_reusable_delegation_set_response +CreateRevisionRequest,create_revision_request +CreateRevisionResponse,create_revision_response +CreateRobotApplicationRequest,create_robot_application_request +CreateRobotApplicationResponse,create_robot_application_response +CreateRobotApplicationVersionRequest,create_robot_application_version_request +CreateRobotApplicationVersionResponse,create_robot_application_version_response +CreateRobotRequest,create_robot_request +CreateRobotResponse,create_robot_response +CreateRoleAliasRequest,create_role_alias_request +CreateRoleAliasResponse,create_role_alias_response +CreateRoleRequest,create_role_request +CreateRoleResponse,create_role_response +CreateRoomMembershipRequest,create_room_membership_request +CreateRoomMembershipResponse,create_room_membership_response +CreateRoomRequest,create_room_request +CreateRoomResponse,create_room_response +CreateRotationOverrideRequest,create_rotation_override_request +CreateRotationOverrideResult,create_rotation_override_result +CreateRotationRequest,create_rotation_request +CreateRotationResult,create_rotation_result +CreateRouteCalculatorRequest,create_route_calculator_request +CreateRouteCalculatorResponse,create_route_calculator_response +CreateRouteInput,create_route_input +CreateRouteOutput,create_route_output +CreateRouteRequest,create_route_request +CreateRouteResponse,create_route_response +CreateRouteResponseRequest,create_route_response_request +CreateRouteResponseResponse,create_route_response_response +CreateRouteResult,create_route_result +CreateRouteTableRequest,create_route_table_request +CreateRouteTableResult,create_route_table_result +CreateRoutingControlRequest,create_routing_control_request +CreateRoutingControlResponse,create_routing_control_response +CreateRoutingProfileRequest,create_routing_profile_request +CreateRoutingProfileResponse,create_routing_profile_response +CreateRowData,create_row_data +CreateRule,create_rule +CreateRuleGroupRequest,create_rule_group_request +CreateRuleGroupResponse,create_rule_group_response +CreateRuleGroupsNamespaceRequest,create_rule_groups_namespace_request +CreateRuleGroupsNamespaceResponse,create_rule_groups_namespace_response +CreateRuleInput,create_rule_input +CreateRuleOutput,create_rule_output +CreateRuleRequest,create_rule_request +CreateRuleResponse,create_rule_response +CreateRuleResult,create_rule_result +CreateRulesetRequest,create_ruleset_request +CreateRulesetResponse,create_ruleset_response +CreateRunGroupRequest,create_run_group_request +CreateRunGroupResponse,create_run_group_response +CreateS3DataAccessFromS3Bucket,create_s3_data_access_from_s3_bucket +CreateS3DataAccessFromS3BucketRequestDetails,create_s3_data_access_from_s3_bucket_request_details +CreateS3DataAccessFromS3BucketResponseDetails,create_s3_data_access_from_s3_bucket_response_details +CreateSAMLProviderRequest,create_saml_provider_request +CreateSAMLProviderResponse,create_saml_provider_response +CreateSMBFileShareInput,create_smb_file_share_input +CreateSMBFileShareOutput,create_smb_file_share_output +CreateSMSSandboxPhoneNumberInput,create_sms_sandbox_phone_number_input +CreateSafetyRuleRequest,create_safety_rule_request +CreateSafetyRuleResponse,create_safety_rule_response +CreateSampleFindingsRequest,create_sample_findings_request +CreateSamplingRuleRequest,create_sampling_rule_request +CreateSamplingRuleResult,create_sampling_rule_result +CreateSavingsPlanRequest,create_savings_plan_request +CreateSavingsPlanResponse,create_savings_plan_response +CreateSbomExportRequest,create_sbom_export_request +CreateSbomExportResponse,create_sbom_export_response +CreateScalingPlanRequest,create_scaling_plan_request +CreateScalingPlanResponse,create_scaling_plan_response +CreateScanRequest,create_scan_request +CreateScanResponse,create_scan_response +CreateSceneRequest,create_scene_request +CreateSceneResponse,create_scene_response +CreateScheduleGroupInput,create_schedule_group_input +CreateScheduleGroupOutput,create_schedule_group_output +CreateScheduleInput,create_schedule_input +CreateScheduleOutput,create_schedule_output +CreateScheduleRequest,create_schedule_request +CreateScheduleResponse,create_schedule_response +CreateScheduledActionMessage,create_scheduled_action_message +CreateScheduledAuditRequest,create_scheduled_audit_request +CreateScheduledAuditResponse,create_scheduled_audit_response +CreateScheduledQueryRequest,create_scheduled_query_request +CreateScheduledQueryResponse,create_scheduled_query_response +CreateSchedulingPolicyRequest,create_scheduling_policy_request +CreateSchedulingPolicyResponse,create_scheduling_policy_response +CreateSchemaInput,create_schema_input +CreateSchemaMappingInput,create_schema_mapping_input +CreateSchemaMappingOutput,create_schema_mapping_output +CreateSchemaRequest,create_schema_request +CreateSchemaResponse,create_schema_response +CreateScriptInput,create_script_input +CreateScriptOutput,create_script_output +CreateScriptRequest,create_script_request +CreateScriptResponse,create_script_response +CreateSecretRequest,create_secret_request +CreateSecretResponse,create_secret_response +CreateSecurityConfigRequest,create_security_config_request +CreateSecurityConfigResponse,create_security_config_response +CreateSecurityConfigurationInput,create_security_configuration_input +CreateSecurityConfigurationOutput,create_security_configuration_output +CreateSecurityConfigurationRequest,create_security_configuration_request +CreateSecurityConfigurationResponse,create_security_configuration_response +CreateSecurityGroupRequest,create_security_group_request +CreateSecurityGroupResult,create_security_group_result +CreateSecurityPolicyRequest,create_security_policy_request +CreateSecurityPolicyResponse,create_security_policy_response +CreateSecurityProfileRequest,create_security_profile_request +CreateSecurityProfileResponse,create_security_profile_response +CreateSegmentRequest,create_segment_request +CreateSegmentResponse,create_segment_response +CreateSequenceStoreRequest,create_sequence_store_request +CreateSequenceStoreResponse,create_sequence_store_response +CreateServerRequest,create_server_request +CreateServerResponse,create_server_response +CreateServiceActionInput,create_service_action_input +CreateServiceActionOutput,create_service_action_output +CreateServiceInput,create_service_input +CreateServiceInstanceInput,create_service_instance_input +CreateServiceInstanceOutput,create_service_instance_output +CreateServiceLinkedRoleRequest,create_service_linked_role_request +CreateServiceLinkedRoleResponse,create_service_linked_role_response +CreateServiceNetworkRequest,create_service_network_request +CreateServiceNetworkResponse,create_service_network_response +CreateServiceNetworkServiceAssociationRequest,create_service_network_service_association_request +CreateServiceNetworkServiceAssociationResponse,create_service_network_service_association_response +CreateServiceNetworkVpcAssociationRequest,create_service_network_vpc_association_request +CreateServiceNetworkVpcAssociationResponse,create_service_network_vpc_association_response +CreateServiceOutput,create_service_output +CreateServicePrincipalNameRequest,create_service_principal_name_request +CreateServiceProfileRequest,create_service_profile_request +CreateServiceProfileResponse,create_service_profile_response +CreateServiceRequest,create_service_request +CreateServiceResponse,create_service_response +CreateServiceSpecificCredentialRequest,create_service_specific_credential_request +CreateServiceSpecificCredentialResponse,create_service_specific_credential_response +CreateServiceSyncConfigInput,create_service_sync_config_input +CreateServiceSyncConfigOutput,create_service_sync_config_output +CreateServiceTemplateInput,create_service_template_input +CreateServiceTemplateOutput,create_service_template_output +CreateServiceTemplateVersionInput,create_service_template_version_input +CreateServiceTemplateVersionOutput,create_service_template_version_output +CreateSessionRequest,create_session_request +CreateSessionResponse,create_session_response +CreateShareRequest,create_share_request +CreateShareResponse,create_share_response +CreateSignalCatalogRequest,create_signal_catalog_request +CreateSignalCatalogResponse,create_signal_catalog_response +CreateSignalingChannelInput,create_signaling_channel_input +CreateSignalingChannelOutput,create_signaling_channel_output +CreateSimulationApplicationRequest,create_simulation_application_request +CreateSimulationApplicationResponse,create_simulation_application_response +CreateSimulationApplicationVersionRequest,create_simulation_application_version_request +CreateSimulationApplicationVersionResponse,create_simulation_application_version_response +CreateSimulationJobRequest,create_simulation_job_request +CreateSimulationJobResponse,create_simulation_job_response +CreateSinkInput,create_sink_input +CreateSinkOutput,create_sink_output +CreateSipMediaApplicationCallRequest,create_sip_media_application_call_request +CreateSipMediaApplicationCallResponse,create_sip_media_application_call_response +CreateSipMediaApplicationRequest,create_sip_media_application_request +CreateSipMediaApplicationResponse,create_sip_media_application_response +CreateSipRuleRequest,create_sip_rule_request +CreateSipRuleResponse,create_sip_rule_response +CreateSiteInput,create_site_input +CreateSiteOutput,create_site_output +CreateSiteRequest,create_site_request +CreateSiteResponse,create_site_response +CreateSiteToSiteVpnAttachmentRequest,create_site_to_site_vpn_attachment_request +CreateSiteToSiteVpnAttachmentResponse,create_site_to_site_vpn_attachment_response +CreateSizeConstraintSetRequest,create_size_constraint_set_request +CreateSizeConstraintSetResponse,create_size_constraint_set_response +CreateSkillGroupRequest,create_skill_group_request +CreateSkillGroupResponse,create_skill_group_response +CreateSlackChannelConfigurationRequest,create_slack_channel_configuration_request +CreateSlotRequest,create_slot_request +CreateSlotResponse,create_slot_response +CreateSlotTypeRequest,create_slot_type_request +CreateSlotTypeResponse,create_slot_type_response +CreateSlotTypeVersionRequest,create_slot_type_version_request +CreateSlotTypeVersionResponse,create_slot_type_version_response +CreateSmsTemplateRequest,create_sms_template_request +CreateSmsTemplateResponse,create_sms_template_response +CreateSnaplockConfiguration,create_snaplock_configuration +CreateSnapshotBeforeSchemaExtension,create_snapshot_before_schema_extension +CreateSnapshotBeforeUpdate,create_snapshot_before_update +CreateSnapshotCopyGrantMessage,create_snapshot_copy_grant_message +CreateSnapshotCopyGrantResult,create_snapshot_copy_grant_result +CreateSnapshotFromVolumeRecoveryPointInput,create_snapshot_from_volume_recovery_point_input +CreateSnapshotFromVolumeRecoveryPointOutput,create_snapshot_from_volume_recovery_point_output +CreateSnapshotInput,create_snapshot_input +CreateSnapshotMessage,create_snapshot_message +CreateSnapshotOutput,create_snapshot_output +CreateSnapshotRequest,create_snapshot_request +CreateSnapshotResponse,create_snapshot_response +CreateSnapshotResult,create_snapshot_result +CreateSnapshotScheduleMessage,create_snapshot_schedule_message +CreateSnapshotsRequest,create_snapshots_request +CreateSnapshotsResult,create_snapshots_result +CreateSoftwareUpdateJobRequest,create_software_update_job_request +CreateSoftwareUpdateJobResponse,create_software_update_job_response +CreateSolFunctionPackageInput,create_sol_function_package_input +CreateSolFunctionPackageOutput,create_sol_function_package_output +CreateSolNetworkInstanceInput,create_sol_network_instance_input +CreateSolNetworkInstanceOutput,create_sol_network_instance_output +CreateSolNetworkPackageInput,create_sol_network_package_input +CreateSolNetworkPackageOutput,create_sol_network_package_output +CreateSolutionRequest,create_solution_request +CreateSolutionResponse,create_solution_response +CreateSolutionVersionRequest,create_solution_version_request +CreateSolutionVersionResponse,create_solution_version_response +CreateSourceLocationRequest,create_source_location_request +CreateSourceLocationResponse,create_source_location_response +CreateSourceNetworkRequest,create_source_network_request +CreateSourceNetworkResponse,create_source_network_response +CreateSourceRepositoryBranchRequest,create_source_repository_branch_request +CreateSourceRepositoryBranchResponse,create_source_repository_branch_response +CreateSourceRepositoryRequest,create_source_repository_request +CreateSourceRepositoryResponse,create_source_repository_response +CreateSpaceRequest,create_space_request +CreateSpaceResponse,create_space_response +CreateSpotDatafeedSubscriptionRequest,create_spot_datafeed_subscription_request +CreateSpotDatafeedSubscriptionResult,create_spot_datafeed_subscription_result +CreateSqlInjectionMatchSetRequest,create_sql_injection_match_set_request +CreateSqlInjectionMatchSetResponse,create_sql_injection_match_set_response +CreateStackInput,create_stack_input +CreateStackInstancesInput,create_stack_instances_input +CreateStackInstancesOutput,create_stack_instances_output +CreateStackOutput,create_stack_output +CreateStackRequest,create_stack_request +CreateStackResult,create_stack_result +CreateStackSetInput,create_stack_set_input +CreateStackSetOutput,create_stack_set_output +CreateStageRequest,create_stage_request +CreateStageResponse,create_stage_response +CreateStageResult,create_stage_result +CreateStandbyWorkspacesRequest,create_standby_workspaces_request +CreateStandbyWorkspacesResult,create_standby_workspaces_result +CreateStateMachineAliasInput,create_state_machine_alias_input +CreateStateMachineAliasOutput,create_state_machine_alias_output +CreateStateMachineInput,create_state_machine_input +CreateStateMachineOutput,create_state_machine_output +CreateStorageLocationResultMessage,create_storage_location_result_message +CreateStorageVirtualMachineRequest,create_storage_virtual_machine_request +CreateStorageVirtualMachineResponse,create_storage_virtual_machine_response +CreateStoreImageTaskRequest,create_store_image_task_request +CreateStoreImageTaskResult,create_store_image_task_result +CreateStorediSCSIVolumeInput,create_storedi_scsi_volume_input +CreateStorediSCSIVolumeOutput,create_storedi_scsi_volume_output +CreateStreamInput,create_stream_input +CreateStreamKeyRequest,create_stream_key_request +CreateStreamKeyResponse,create_stream_key_response +CreateStreamOutput,create_stream_output +CreateStreamProcessorRequest,create_stream_processor_request +CreateStreamProcessorResponse,create_stream_processor_response +CreateStreamRequest,create_stream_request +CreateStreamResponse,create_stream_response +CreateStreamingDistributionRequest,create_streaming_distribution_request +CreateStreamingDistributionResult,create_streaming_distribution_result +CreateStreamingDistributionWithTagsRequest,create_streaming_distribution_with_tags_request +CreateStreamingDistributionWithTagsResult,create_streaming_distribution_with_tags_result +CreateStreamingImageRequest,create_streaming_image_request +CreateStreamingImageResponse,create_streaming_image_response +CreateStreamingSessionRequest,create_streaming_session_request +CreateStreamingSessionResponse,create_streaming_session_response +CreateStreamingSessionStreamRequest,create_streaming_session_stream_request +CreateStreamingSessionStreamResponse,create_streaming_session_stream_response +CreateStreamingURLRequest,create_streaming_url_request +CreateStreamingURLResult,create_streaming_url_result +CreateStudioComponentRequest,create_studio_component_request +CreateStudioComponentResponse,create_studio_component_response +CreateStudioInput,create_studio_input +CreateStudioLifecycleConfigRequest,create_studio_lifecycle_config_request +CreateStudioLifecycleConfigResponse,create_studio_lifecycle_config_response +CreateStudioOutput,create_studio_output +CreateStudioRequest,create_studio_request +CreateStudioResponse,create_studio_response +CreateStudioSessionMappingInput,create_studio_session_mapping_input +CreateSubnetCidrReservationRequest,create_subnet_cidr_reservation_request +CreateSubnetCidrReservationResult,create_subnet_cidr_reservation_result +CreateSubnetGroupRequest,create_subnet_group_request +CreateSubnetGroupResponse,create_subnet_group_response +CreateSubnetRequest,create_subnet_request +CreateSubnetResult,create_subnet_result +CreateSubscriberNotificationRequest,create_subscriber_notification_request +CreateSubscriberNotificationResponse,create_subscriber_notification_response +CreateSubscriberRequest,create_subscriber_request +CreateSubscriberResponse,create_subscriber_response +CreateSubscriptionDefinitionRequest,create_subscription_definition_request +CreateSubscriptionDefinitionResponse,create_subscription_definition_response +CreateSubscriptionDefinitionVersionRequest,create_subscription_definition_version_request +CreateSubscriptionDefinitionVersionResponse,create_subscription_definition_version_response +CreateSuiteDefinitionRequest,create_suite_definition_request +CreateSuiteDefinitionResponse,create_suite_definition_response +CreateSvmActiveDirectoryConfiguration,create_svm_active_directory_configuration +CreateSyncJobRequest,create_sync_job_request +CreateSyncJobResponse,create_sync_job_response +CreateSystemInstanceRequest,create_system_instance_request +CreateSystemInstanceResponse,create_system_instance_response +CreateSystemTemplateRequest,create_system_template_request +CreateSystemTemplateResponse,create_system_template_response +CreateTLSInspectionConfigurationRequest,create_tls_inspection_configuration_request +CreateTLSInspectionConfigurationResponse,create_tls_inspection_configuration_response +CreateTableDefaultPermissions,create_table_default_permissions +CreateTableInput,create_table_input +CreateTableOutput,create_table_output +CreateTableRequest,create_table_request +CreateTableResponse,create_table_response +CreateTagOptionInput,create_tag_option_input +CreateTagOptionOutput,create_tag_option_output +CreateTagsMessage,create_tags_message +CreateTagsRequest,create_tags_request +CreateTapePoolInput,create_tape_pool_input +CreateTapePoolOutput,create_tape_pool_output +CreateTapeWithBarcodeInput,create_tape_with_barcode_input +CreateTapeWithBarcodeOutput,create_tape_with_barcode_output +CreateTapesInput,create_tapes_input +CreateTapesOutput,create_tapes_output +CreateTargetGroupInput,create_target_group_input +CreateTargetGroupOutput,create_target_group_output +CreateTargetGroupRequest,create_target_group_request +CreateTargetGroupResponse,create_target_group_response +CreateTaskInput,create_task_input +CreateTaskOutput,create_task_output +CreateTaskRequest,create_task_request +CreateTaskResponse,create_task_response +CreateTaskSetRequest,create_task_set_request +CreateTaskSetResponse,create_task_set_response +CreateTaskTemplateRequest,create_task_template_request +CreateTaskTemplateResponse,create_task_template_response +CreateTemplateAliasRequest,create_template_alias_request +CreateTemplateAliasResponse,create_template_alias_response +CreateTemplateGroupAccessControlEntryRequest,create_template_group_access_control_entry_request +CreateTemplateMessageBody,create_template_message_body +CreateTemplateRequest,create_template_request +CreateTemplateResponse,create_template_response +CreateTemplateSyncConfigInput,create_template_sync_config_input +CreateTemplateSyncConfigOutput,create_template_sync_config_output +CreateTestGridProjectRequest,create_test_grid_project_request +CreateTestGridProjectResult,create_test_grid_project_result +CreateTestGridUrlRequest,create_test_grid_url_request +CreateTestGridUrlResult,create_test_grid_url_result +CreateTestSetDiscrepancyReportRequest,create_test_set_discrepancy_report_request +CreateTestSetDiscrepancyReportResponse,create_test_set_discrepancy_report_response +CreateThemeAliasRequest,create_theme_alias_request +CreateThemeAliasResponse,create_theme_alias_response +CreateThemeData,create_theme_data +CreateThemeRequest,create_theme_request +CreateThemeResponse,create_theme_response +CreateThesaurusRequest,create_thesaurus_request +CreateThesaurusResponse,create_thesaurus_response +CreateThingGroupRequest,create_thing_group_request +CreateThingGroupResponse,create_thing_group_response +CreateThingRequest,create_thing_request +CreateThingResponse,create_thing_response +CreateThingTypeRequest,create_thing_type_request +CreateThingTypeResponse,create_thing_type_response +CreateThreatIntelSetRequest,create_threat_intel_set_request +CreateThreatIntelSetResponse,create_threat_intel_set_response +CreateTieringInput,create_tiering_input +CreateTime,create_time +CreateTimelineEventInput,create_timeline_event_input +CreateTimelineEventOutput,create_timeline_event_output +CreateTimestamp,create_timestamp +CreateTokenRequest,create_token_request +CreateTokenResponse,create_token_response +CreateTopicInput,create_topic_input +CreateTopicRefreshScheduleRequest,create_topic_refresh_schedule_request +CreateTopicRefreshScheduleResponse,create_topic_refresh_schedule_response +CreateTopicRequest,create_topic_request +CreateTopicResponse,create_topic_response +CreateTopicRuleDestinationRequest,create_topic_rule_destination_request +CreateTopicRuleDestinationResponse,create_topic_rule_destination_response +CreateTopicRuleRequest,create_topic_rule_request +CreateTrackerRequest,create_tracker_request +CreateTrackerResponse,create_tracker_response +CreateTrafficDistributionGroupRequest,create_traffic_distribution_group_request +CreateTrafficDistributionGroupResponse,create_traffic_distribution_group_response +CreateTrafficMirrorFilterRequest,create_traffic_mirror_filter_request +CreateTrafficMirrorFilterResult,create_traffic_mirror_filter_result +CreateTrafficMirrorFilterRuleRequest,create_traffic_mirror_filter_rule_request +CreateTrafficMirrorFilterRuleResult,create_traffic_mirror_filter_rule_result +CreateTrafficMirrorSessionRequest,create_traffic_mirror_session_request +CreateTrafficMirrorSessionResult,create_traffic_mirror_session_result +CreateTrafficMirrorTargetRequest,create_traffic_mirror_target_request +CreateTrafficMirrorTargetResult,create_traffic_mirror_target_result +CreateTrafficPolicyInstanceRequest,create_traffic_policy_instance_request +CreateTrafficPolicyInstanceResponse,create_traffic_policy_instance_response +CreateTrafficPolicyRequest,create_traffic_policy_request +CreateTrafficPolicyResponse,create_traffic_policy_response +CreateTrafficPolicyVersionRequest,create_traffic_policy_version_request +CreateTrafficPolicyVersionResponse,create_traffic_policy_version_response +CreateTrailRequest,create_trail_request +CreateTrailResponse,create_trail_response +CreateTrainingJobRequest,create_training_job_request +CreateTrainingJobResponse,create_training_job_response +CreateTransformJobRequest,create_transform_job_request +CreateTransformJobResponse,create_transform_job_response +CreateTransitGatewayConnectPeerRequest,create_transit_gateway_connect_peer_request +CreateTransitGatewayConnectPeerResult,create_transit_gateway_connect_peer_result +CreateTransitGatewayConnectRequest,create_transit_gateway_connect_request +CreateTransitGatewayConnectRequestOptions,create_transit_gateway_connect_request_options +CreateTransitGatewayConnectResult,create_transit_gateway_connect_result +CreateTransitGatewayMulticastDomainRequest,create_transit_gateway_multicast_domain_request +CreateTransitGatewayMulticastDomainRequestOptions,create_transit_gateway_multicast_domain_request_options +CreateTransitGatewayMulticastDomainResult,create_transit_gateway_multicast_domain_result +CreateTransitGatewayPeeringAttachmentRequest,create_transit_gateway_peering_attachment_request +CreateTransitGatewayPeeringAttachmentRequestOptions,create_transit_gateway_peering_attachment_request_options +CreateTransitGatewayPeeringAttachmentResult,create_transit_gateway_peering_attachment_result +CreateTransitGatewayPeeringRequest,create_transit_gateway_peering_request +CreateTransitGatewayPeeringResponse,create_transit_gateway_peering_response +CreateTransitGatewayPolicyTableRequest,create_transit_gateway_policy_table_request +CreateTransitGatewayPolicyTableResult,create_transit_gateway_policy_table_result +CreateTransitGatewayPrefixListReferenceRequest,create_transit_gateway_prefix_list_reference_request +CreateTransitGatewayPrefixListReferenceResult,create_transit_gateway_prefix_list_reference_result +CreateTransitGatewayRequest,create_transit_gateway_request +CreateTransitGatewayResult,create_transit_gateway_result +CreateTransitGatewayRouteRequest,create_transit_gateway_route_request +CreateTransitGatewayRouteResult,create_transit_gateway_route_result +CreateTransitGatewayRouteTableAnnouncementRequest,create_transit_gateway_route_table_announcement_request +CreateTransitGatewayRouteTableAnnouncementResult,create_transit_gateway_route_table_announcement_result +CreateTransitGatewayRouteTableAttachmentRequest,create_transit_gateway_route_table_attachment_request +CreateTransitGatewayRouteTableAttachmentResponse,create_transit_gateway_route_table_attachment_response +CreateTransitGatewayRouteTableRequest,create_transit_gateway_route_table_request +CreateTransitGatewayRouteTableResult,create_transit_gateway_route_table_result +CreateTransitGatewayVpcAttachmentRequest,create_transit_gateway_vpc_attachment_request +CreateTransitGatewayVpcAttachmentRequestOptions,create_transit_gateway_vpc_attachment_request_options +CreateTransitGatewayVpcAttachmentResult,create_transit_gateway_vpc_attachment_result +CreateTransitVirtualInterfaceRequest,create_transit_virtual_interface_request +CreateTransitVirtualInterfaceResult,create_transit_virtual_interface_result +CreateTrialComponentRequest,create_trial_component_request +CreateTrialComponentResponse,create_trial_component_response +CreateTrialRequest,create_trial_request +CreateTrialResponse,create_trial_response +CreateTriggerRequest,create_trigger_request +CreateTriggerResponse,create_trigger_response +CreateTrustAnchorRequest,create_trust_anchor_request +CreateTrustRequest,create_trust_request +CreateTrustResult,create_trust_result +CreateTrustStoreRequest,create_trust_store_request +CreateTrustStoreResponse,create_trust_store_response +CreateTypeRequest,create_type_request +CreateTypeResponse,create_type_response +CreateTypedLinkFacetRequest,create_typed_link_facet_request +CreateUnreferencedMergeCommitInput,create_unreferenced_merge_commit_input +CreateUnreferencedMergeCommitOutput,create_unreferenced_merge_commit_output +CreateUpdatedImageRequest,create_updated_image_request +CreateUpdatedImageResult,create_updated_image_result +CreateUpdatedWorkspaceImageRequest,create_updated_workspace_image_request +CreateUpdatedWorkspaceImageResult,create_updated_workspace_image_result +CreateUploadRequest,create_upload_request +CreateUploadResult,create_upload_result +CreateUploadUrlRequest,create_upload_url_request +CreateUploadUrlResponse,create_upload_url_response +CreateUsageLimitMessage,create_usage_limit_message +CreateUsageLimitRequest,create_usage_limit_request +CreateUsageLimitResponse,create_usage_limit_response +CreateUsagePlanKeyRequest,create_usage_plan_key_request +CreateUsagePlanRequest,create_usage_plan_request +CreateUsageReportSubscriptionResult,create_usage_report_subscription_result +CreateUseCaseRequest,create_use_case_request +CreateUseCaseResponse,create_use_case_response +CreateUserAccessLoggingSettingsRequest,create_user_access_logging_settings_request +CreateUserAccessLoggingSettingsResponse,create_user_access_logging_settings_response +CreateUserDefinedFunctionRequest,create_user_defined_function_request +CreateUserGroupMessage,create_user_group_message +CreateUserHierarchyGroupRequest,create_user_hierarchy_group_request +CreateUserHierarchyGroupResponse,create_user_hierarchy_group_response +CreateUserImportJobRequest,create_user_import_job_request +CreateUserImportJobResponse,create_user_import_job_response +CreateUserMessage,create_user_message +CreateUserPoolClientRequest,create_user_pool_client_request +CreateUserPoolClientResponse,create_user_pool_client_response +CreateUserPoolDomainRequest,create_user_pool_domain_request +CreateUserPoolDomainResponse,create_user_pool_domain_response +CreateUserPoolRequest,create_user_pool_request +CreateUserPoolResponse,create_user_pool_response +CreateUserProfileRequest,create_user_profile_request +CreateUserProfileResponse,create_user_profile_response +CreateUserProfileResult,create_user_profile_result +CreateUserRequest,create_user_request +CreateUserResponse,create_user_response +CreateUserSettingsRequest,create_user_settings_request +CreateUserSettingsResponse,create_user_settings_response +CreateVPCAssociationAuthorizationRequest,create_vpc_association_authorization_request +CreateVPCAssociationAuthorizationResponse,create_vpc_association_authorization_response +CreateVPCConnectionRequest,create_vpc_connection_request +CreateVPCConnectionResponse,create_vpc_connection_response +CreateVPCEConfigurationRequest,create_vpce_configuration_request +CreateVPCEConfigurationResult,create_vpce_configuration_result +CreateVariableRequest,create_variable_request +CreateVariantStoreRequest,create_variant_store_request +CreateVariantStoreResponse,create_variant_store_response +CreateVaultInput,create_vault_input +CreateVaultOutput,create_vault_output +CreateVehicleError,create_vehicle_error +CreateVehicleRequest,create_vehicle_request +CreateVehicleRequestItem,create_vehicle_request_item +CreateVehicleResponse,create_vehicle_response +CreateVehicleResponseItem,create_vehicle_response_item +CreateVerifiedAccessEndpointEniOptions,create_verified_access_endpoint_eni_options +CreateVerifiedAccessEndpointLoadBalancerOptions,create_verified_access_endpoint_load_balancer_options +CreateVerifiedAccessEndpointRequest,create_verified_access_endpoint_request +CreateVerifiedAccessEndpointResult,create_verified_access_endpoint_result +CreateVerifiedAccessGroupRequest,create_verified_access_group_request +CreateVerifiedAccessGroupResult,create_verified_access_group_result +CreateVerifiedAccessInstanceRequest,create_verified_access_instance_request +CreateVerifiedAccessInstanceResult,create_verified_access_instance_result +CreateVerifiedAccessTrustProviderDeviceOptions,create_verified_access_trust_provider_device_options +CreateVerifiedAccessTrustProviderOidcOptions,create_verified_access_trust_provider_oidc_options +CreateVerifiedAccessTrustProviderRequest,create_verified_access_trust_provider_request +CreateVerifiedAccessTrustProviderResult,create_verified_access_trust_provider_result +CreateViewInput,create_view_input +CreateViewOutput,create_view_output +CreateViewRequest,create_view_request +CreateViewResponse,create_view_response +CreateViewVersionRequest,create_view_version_request +CreateViewVersionResponse,create_view_version_response +CreateVirtualClusterRequest,create_virtual_cluster_request +CreateVirtualClusterResponse,create_virtual_cluster_response +CreateVirtualGatewayInput,create_virtual_gateway_input +CreateVirtualGatewayOutput,create_virtual_gateway_output +CreateVirtualMFADeviceRequest,create_virtual_mfa_device_request +CreateVirtualMFADeviceResponse,create_virtual_mfa_device_response +CreateVirtualNodeInput,create_virtual_node_input +CreateVirtualNodeOutput,create_virtual_node_output +CreateVirtualRouterInput,create_virtual_router_input +CreateVirtualRouterOutput,create_virtual_router_output +CreateVirtualServiceInput,create_virtual_service_input +CreateVirtualServiceOutput,create_virtual_service_output +CreateVocabularyFilterRequest,create_vocabulary_filter_request +CreateVocabularyFilterResponse,create_vocabulary_filter_response +CreateVocabularyRequest,create_vocabulary_request +CreateVocabularyResponse,create_vocabulary_response +CreateVodSourceRequest,create_vod_source_request +CreateVodSourceResponse,create_vod_source_response +CreateVoiceConnectorGroupRequest,create_voice_connector_group_request +CreateVoiceConnectorGroupResponse,create_voice_connector_group_response +CreateVoiceConnectorRequest,create_voice_connector_request +CreateVoiceConnectorResponse,create_voice_connector_response +CreateVoiceProfileDomainRequest,create_voice_profile_domain_request +CreateVoiceProfileDomainResponse,create_voice_profile_domain_response +CreateVoiceProfileRequest,create_voice_profile_request +CreateVoiceProfileResponse,create_voice_profile_response +CreateVoiceTemplateRequest,create_voice_template_request +CreateVoiceTemplateResponse,create_voice_template_response +CreateVolumeFromBackupRequest,create_volume_from_backup_request +CreateVolumeFromBackupResponse,create_volume_from_backup_response +CreateVolumePermission,create_volume_permission +CreateVolumePermissionModifications,create_volume_permission_modifications +CreateVolumePermissions,create_volume_permissions +CreateVolumeRequest,create_volume_request +CreateVolumeResponse,create_volume_response +CreateVpcAttachmentRequest,create_vpc_attachment_request +CreateVpcAttachmentResponse,create_vpc_attachment_response +CreateVpcConnectionRequest,create_vpc_connection_request +CreateVpcConnectionResponse,create_vpc_connection_response +CreateVpcConnectorRequest,create_vpc_connector_request +CreateVpcConnectorResponse,create_vpc_connector_response +CreateVpcEndpointConnectionNotificationRequest,create_vpc_endpoint_connection_notification_request +CreateVpcEndpointConnectionNotificationResult,create_vpc_endpoint_connection_notification_result +CreateVpcEndpointDetail,create_vpc_endpoint_detail +CreateVpcEndpointRequest,create_vpc_endpoint_request +CreateVpcEndpointResponse,create_vpc_endpoint_response +CreateVpcEndpointResult,create_vpc_endpoint_result +CreateVpcEndpointServiceConfigurationRequest,create_vpc_endpoint_service_configuration_request +CreateVpcEndpointServiceConfigurationResult,create_vpc_endpoint_service_configuration_result +CreateVpcIngressConnectionRequest,create_vpc_ingress_connection_request +CreateVpcIngressConnectionResponse,create_vpc_ingress_connection_response +CreateVpcLinkRequest,create_vpc_link_request +CreateVpcLinkResponse,create_vpc_link_response +CreateVpcPeeringAuthorizationInput,create_vpc_peering_authorization_input +CreateVpcPeeringAuthorizationOutput,create_vpc_peering_authorization_output +CreateVpcPeeringConnectionInput,create_vpc_peering_connection_input +CreateVpcPeeringConnectionRequest,create_vpc_peering_connection_request +CreateVpcPeeringConnectionResult,create_vpc_peering_connection_result +CreateVpcRequest,create_vpc_request +CreateVpcResult,create_vpc_result +CreateVpnConnectionRequest,create_vpn_connection_request +CreateVpnConnectionResult,create_vpn_connection_result +CreateVpnConnectionRouteRequest,create_vpn_connection_route_request +CreateVpnGatewayRequest,create_vpn_gateway_request +CreateVpnGatewayResult,create_vpn_gateway_result +CreateWatchlistRequest,create_watchlist_request +CreateWatchlistResponse,create_watchlist_response +CreateWaveRequest,create_wave_request +CreateWebACLMigrationStackRequest,create_web_acl_migration_stack_request +CreateWebACLMigrationStackResponse,create_web_acl_migration_stack_response +CreateWebACLRequest,create_web_acl_request +CreateWebACLResponse,create_web_acl_response +CreateWebLoginTokenRequest,create_web_login_token_request +CreateWebLoginTokenResponse,create_web_login_token_response +CreateWebhookInput,create_webhook_input +CreateWebhookOutput,create_webhook_output +CreateWebhookRequest,create_webhook_request +CreateWebhookResult,create_webhook_result +CreateWhatIfAnalysisRequest,create_what_if_analysis_request +CreateWhatIfAnalysisResponse,create_what_if_analysis_response +CreateWhatIfForecastExportRequest,create_what_if_forecast_export_request +CreateWhatIfForecastExportResponse,create_what_if_forecast_export_response +CreateWhatIfForecastRequest,create_what_if_forecast_request +CreateWhatIfForecastResponse,create_what_if_forecast_response +CreateWirelessDeviceRequest,create_wireless_device_request +CreateWirelessDeviceResponse,create_wireless_device_response +CreateWirelessGatewayRequest,create_wireless_gateway_request +CreateWirelessGatewayResponse,create_wireless_gateway_response +CreateWirelessGatewayTaskDefinitionRequest,create_wireless_gateway_task_definition_request +CreateWirelessGatewayTaskDefinitionResponse,create_wireless_gateway_task_definition_response +CreateWirelessGatewayTaskRequest,create_wireless_gateway_task_request +CreateWirelessGatewayTaskResponse,create_wireless_gateway_task_response +CreateWorkGroupInput,create_work_group_input +CreateWorkerBlockRequest,create_worker_block_request +CreateWorkerConfigurationRequest,create_worker_configuration_request +CreateWorkerConfigurationResponse,create_worker_configuration_response +CreateWorkerFleetRequest,create_worker_fleet_request +CreateWorkerFleetResponse,create_worker_fleet_response +CreateWorkerRequest,create_worker_request +CreateWorkerResponse,create_worker_response +CreateWorkflowRequest,create_workflow_request +CreateWorkflowResponse,create_workflow_response +CreateWorkflowStepGroupRequest,create_workflow_step_group_request +CreateWorkflowStepGroupResponse,create_workflow_step_group_response +CreateWorkflowStepRequest,create_workflow_step_request +CreateWorkflowStepResponse,create_workflow_step_response +CreateWorkforceRequest,create_workforce_request +CreateWorkforceResponse,create_workforce_response +CreateWorkgroupRequest,create_workgroup_request +CreateWorkgroupResponse,create_workgroup_response +CreateWorkloadInput,create_workload_input +CreateWorkloadOutput,create_workload_output +CreateWorkloadShareInput,create_workload_share_input +CreateWorkloadShareOutput,create_workload_share_output +CreateWorkspaceApiKeyRequest,create_workspace_api_key_request +CreateWorkspaceApiKeyResponse,create_workspace_api_key_response +CreateWorkspaceBundleRequest,create_workspace_bundle_request +CreateWorkspaceBundleResult,create_workspace_bundle_result +CreateWorkspaceImageRequest,create_workspace_image_request +CreateWorkspaceImageResult,create_workspace_image_result +CreateWorkspaceRequest,create_workspace_request +CreateWorkspaceResponse,create_workspace_response +CreateWorkspacesRequest,create_workspaces_request +CreateWorkspacesResult,create_workspaces_result +CreateWorkteamRequest,create_workteam_request +CreateWorkteamResponse,create_workteam_response +CreateWorldExportJobRequest,create_world_export_job_request +CreateWorldExportJobResponse,create_world_export_job_response +CreateWorldGenerationJobRequest,create_world_generation_job_request +CreateWorldGenerationJobResponse,create_world_generation_job_response +CreateWorldTemplateRequest,create_world_template_request +CreateWorldTemplateResponse,create_world_template_response +CreateXMLClassifierRequest,create_xml_classifier_request +CreateXssMatchSetRequest,create_xss_match_set_request +CreateXssMatchSetResponse,create_xss_match_set_response +Created,created +CreatedAfter,created_after +CreatedArtifact,created_artifact +CreatedArtifactList,created_artifact_list +CreatedArtifactName,created_artifact_name +CreatedAt,created_at +CreatedAtEndTime,created_at_end_time +CreatedAtStartTime,created_at_start_time +CreatedBefore,created_before +CreatedButModifiedException,created_but_modified_exception +CreatedBy,created_by +CreatedByAccountId,created_by_account_id +CreatedByArn,created_by_arn +CreatedByIamUser,created_by_iam_user +CreatedByService,created_by_service +CreatedDate,created_date +CreatedDateTime,created_date_time +CreatedOn,created_on +CreatedRange,created_range +CreatedResourceArn,created_resource_arn +CreatedRulesetName,created_ruleset_name +CreatedTime,created_time +CreatedTimeStamp,created_time_stamp +CreatedTimestamp,created_timestamp +CreatedUsingAutoPredictor,created_using_auto_predictor +Creates,creates +CreationDate,creation_date +CreationDateTime,creation_date_time +CreationInfo,creation_info +CreationLimitExceededException,creation_limit_exceeded_exception +CreationPath,creation_path +CreationRequestDateTime,creation_request_date_time +CreationStatus,creation_status +CreationTime,creation_time +CreationTimeAfter,creation_time_after +CreationTimeBefore,creation_time_before +CreationTimestamp,creation_timestamp +CreationToken,creation_token +CreatorId,creator_id +CreatorRequestId,creator_request_id +Credential,credential +CredentialPair,credential_pair +CredentialProvider,credential_provider +CredentialReportExpiredException,credential_report_expired_exception +CredentialReportNotPresentException,credential_report_not_present_exception +CredentialReportNotReadyException,credential_report_not_ready_exception +CredentialSummary,credential_summary +CredentialType,credential_type +Credentials,credentials +CredentialsArn,credentials_arn +CredentialsParameter,credentials_parameter +CredentialsSecretName,credentials_secret_name +CredentialsToAddOrUpdate,credentials_to_add_or_update +CredentialsToRemove,credentials_to_remove +CreditSpecification,credit_specification +CreditSpecificationRequest,credit_specification_request +Criteria,criteria +CriteriaBlockForJob,criteria_block_for_job +CriteriaForJob,criteria_for_job +Criterion,criterion +CriterionAdditionalProperties,criterion_additional_properties +CriterionKey,criterion_key +Critical,critical +CriticalCount,critical_count +CriticalNonCompliantCount,critical_non_compliant_count +Criticality,criticality +CrlConfiguration,crl_configuration +CrlDetail,crl_detail +CrlDetailResponse,crl_detail_response +CronExpression,cron_expression +CronExpressionForRecurrence,cron_expression_for_recurrence +Crop,crop +CrossAccount,cross_account +CrossAccountAuthorization,cross_account_authorization +CrossAccountAuthorizations,cross_account_authorizations +CrossAccountClone,cross_account_clone +CrossAccountFilterOption,cross_account_filter_option +CrossAccountModelRegisterRoleArn,cross_account_model_register_role_arn +CrossChannelBehavior,cross_channel_behavior +CrossClusterSearch,cross_cluster_search +CrossClusterSearchConnection,cross_cluster_search_connection +CrossClusterSearchConnectionId,cross_cluster_search_connection_id +CrossClusterSearchConnectionProperties,cross_cluster_search_connection_properties +CrossClusterSearchConnections,cross_cluster_search_connections +CrossDataset,cross_dataset +CrossRealmTrustPrincipalPassword,cross_realm_trust_principal_password +CrossRegionCopy,cross_region_copy +CrossRegionCopyAction,cross_region_copy_action +CrossRegionCopyDeprecateRule,cross_region_copy_deprecate_rule +CrossRegionCopyRetainRule,cross_region_copy_retain_rule +CrossRegionCopyRule,cross_region_copy_rule +CrossRegionCopyRules,cross_region_copy_rules +CrossZoneLoadBalancing,cross_zone_load_balancing +CryptoProviders,crypto_providers +CryptogramVerificationArpcMethod1,cryptogram_verification_arpc_method1 +CryptogramVerificationArpcMethod2,cryptogram_verification_arpc_method2 +Csid,csid +CslgAtom,cslg_atom +Csr,csr +CsrExtensions,csr_extensions +Csv,csv +CsvClassifier,csv_classifier +CsvConfiguration,csv_configuration +CsvContentTypes,csv_content_types +CsvDelimiter,csv_delimiter +CsvFormatDescriptor,csv_format_descriptor +CsvNoSupValue,csv_no_sup_value +CsvNullValue,csv_null_value +CsvOptions,csv_options +CsvOutputOptions,csv_output_options +CsvReport,csv_report +CsvRowDelimiter,csv_row_delimiter +CttsVersion,ctts_version +CumulativeBytesMetered,cumulative_bytes_metered +CumulativeBytesScanned,cumulative_bytes_scanned +Currency,currency +CurrencyCode,currency_code +CurrencyDisplayFormatConfiguration,currency_display_format_configuration +CurrencySymbol,currency_symbol +Current,current +CurrentAction,current_action +CurrentActiveJob,current_active_job +CurrentActiveVersion,current_active_version +CurrentActiveVersionArn,current_active_version_arn +CurrentApplicationVersionId,current_application_version_id +CurrentApplyDate,current_apply_date +CurrentAverageCoverage,current_average_coverage +CurrentAverageHourlyOnDemandSpend,current_average_hourly_on_demand_spend +CurrentBackupRateInMegaBytesPerSecond,current_backup_rate_in_mega_bytes_per_second +CurrentBrokerSoftwareInfo,current_broker_software_info +CurrentCapacity,current_capacity +CurrentCoverage,current_coverage +CurrentDatabaseRevision,current_database_revision +CurrentDefaultVersion,current_default_version +CurrentDeliveryStreamVersionId,current_delivery_stream_version_id +CurrentExpiryYear,current_expiry_year +CurrentFirewallSubnetRouteTable,current_firewall_subnet_route_table +CurrentFleetState,current_fleet_state +CurrentGeneration,current_generation +CurrentInferenceUnits,current_inference_units +CurrentInstance,current_instance +CurrentInstanceBootMode,current_instance_boot_mode +CurrentInstanceCount,current_instance_count +CurrentInstances,current_instances +CurrentInternetGatewayRouteTable,current_internet_gateway_route_table +CurrentIpamScopeId,current_ipam_scope_id +CurrentLensVersion,current_lens_version +CurrentLsn,current_lsn +CurrentMaximumHourlyOnDemandSpend,current_maximum_hourly_on_demand_spend +CurrentMetric,current_metric +CurrentMetricData,current_metric_data +CurrentMetricResult,current_metric_result +CurrentMetricSortCriteria,current_metric_sort_criteria +CurrentMetrics,current_metrics +CurrentMinimumHourlyOnDemandSpend,current_minimum_hourly_on_demand_spend +CurrentNetworkingStatus,current_networking_status +CurrentOnDemandSpend,current_on_demand_spend +CurrentOperationStatus,current_operation_status +CurrentParallelism,current_parallelism +CurrentPassword,current_password +CurrentPerformanceRiskRatings,current_performance_risk_ratings +CurrentPhase,current_phase +CurrentPlayerSessionCount,current_player_session_count +CurrentPolicyDescription,current_policy_description +CurrentProfileVersion,current_profile_version +CurrentRateInMegaBytesPerSecond,current_rate_in_mega_bytes_per_second +CurrentRegionAvailability,current_region_availability +CurrentRestoreRateInMegaBytesPerSecond,current_restore_rate_in_mega_bytes_per_second +CurrentRevision,current_revision +CurrentRole,current_role +CurrentRouteTable,current_route_table +CurrentSamplingPercentage,current_sampling_percentage +CurrentScore,current_score +CurrentServerlessConfig,current_serverless_config +CurrentShardCount,current_shard_count +CurrentShardLevelMetrics,current_shard_level_metrics +CurrentSigningKeyLength,current_signing_key_length +CurrentSoftware,current_software +CurrentSpotFleetRequestState,current_spot_fleet_request_state +CurrentState,current_state +CurrentStatus,current_status +CurrentStepName,current_step_name +CurrentTaskExecutionArn,current_task_execution_arn +CurrentVersion,current_version +CurrentWeight,current_weight +CustSubscriptionId,cust_subscription_id +CustomAction,custom_action +CustomActionFilterOperation,custom_action_filter_operation +CustomActionId,custom_action_id +CustomActionNavigationOperation,custom_action_navigation_operation +CustomActionSetParametersOperation,custom_action_set_parameters_operation +CustomActionURLOperation,custom_action_url_operation +CustomActions,custom_actions +CustomAmi,custom_ami +CustomAmiId,custom_ami_id +CustomAmiList,custom_ami_list +CustomArtifactConfiguration,custom_artifact_configuration +CustomArtifactConfigurationDescription,custom_artifact_configuration_description +CustomArtifactsConfiguration,custom_artifacts_configuration +CustomArtifactsConfigurationDescription,custom_artifacts_configuration_description +CustomArtifactsConfigurationUpdate,custom_artifacts_configuration_update +CustomAttribute,custom_attribute +CustomAttributes,custom_attributes +CustomAuthConfig,custom_auth_config +CustomAuthCredentials,custom_auth_credentials +CustomAvailabilityZoneNotFoundFault,custom_availability_zone_not_found_fault +CustomCertificate,custom_certificate +CustomCname,custom_cname +CustomCnameAssociationFault,custom_cname_association_fault +CustomCode,custom_code +CustomCodeSigning,custom_code_signing +CustomColor,custom_color +CustomColors,custom_colors +CustomCondition,custom_condition +CustomConfig,custom_config +CustomConnector,custom_connector +CustomConnectorDestinationProperties,custom_connector_destination_properties +CustomConnectorProfileCredentials,custom_connector_profile_credentials +CustomConnectorProfileProperties,custom_connector_profile_properties +CustomConnectorSourceProperties,custom_connector_source_properties +CustomContentConfiguration,custom_content_configuration +CustomContentVisual,custom_content_visual +CustomCookbooksSource,custom_cookbooks_source +CustomDBEngineVersionAMI,custom_db_engine_version_ami +CustomDBEngineVersionAlreadyExistsFault,custom_db_engine_version_already_exists_fault +CustomDBEngineVersionManifest,custom_db_engine_version_manifest +CustomDBEngineVersionNotFoundFault,custom_db_engine_version_not_found_fault +CustomDBEngineVersionQuotaExceededFault,custom_db_engine_version_quota_exceeded_fault +CustomDNSServer,custom_dns_server +CustomDataIdentifierSummary,custom_data_identifier_summary +CustomDataIdentifiers,custom_data_identifiers +CustomDataIdentifiersDetections,custom_data_identifiers_detections +CustomDataIdentifiersResult,custom_data_identifiers_result +CustomDatatypeConfigured,custom_datatype_configured +CustomDatatypes,custom_datatypes +CustomDeliveryConfiguration,custom_delivery_configuration +CustomDetection,custom_detection +CustomDnsServers,custom_dns_servers +CustomDocumentEnrichmentConfiguration,custom_document_enrichment_configuration +CustomDomain,custom_domain +CustomDomainAssociationNotFoundFault,custom_domain_association_not_found_fault +CustomDomainAssociationsMessage,custom_domain_associations_message +CustomDomainCertExpiryTime,custom_domain_cert_expiry_time +CustomDomainCertificateArn,custom_domain_certificate_arn +CustomDomainCertificateExpiryDate,custom_domain_certificate_expiry_date +CustomDomainConfig,custom_domain_config +CustomDomainConfigType,custom_domain_config_type +CustomDomainName,custom_domain_name +CustomDomains,custom_domains +CustomEmailLambdaVersionConfigType,custom_email_lambda_version_config_type +CustomEmailSender,custom_email_sender +CustomEndpoint,custom_endpoint +CustomEndpointCertificateArn,custom_endpoint_certificate_arn +CustomEndpointEnabled,custom_endpoint_enabled +CustomEndpointType,custom_endpoint_type +CustomEndpoints,custom_endpoints +CustomEntityType,custom_entity_type +CustomEntityTypes,custom_entity_types +CustomEntityTypesNotFound,custom_entity_types_not_found +CustomEpoch,custom_epoch +CustomErrorResponse,custom_error_response +CustomErrorResponses,custom_error_responses +CustomEventData,custom_event_data +CustomEvents,custom_events +CustomExtension,custom_extension +CustomExtensions,custom_extensions +CustomFederationProviderUrl,custom_federation_provider_url +CustomFilterConfiguration,custom_filter_configuration +CustomFilterListConfiguration,custom_filter_list_configuration +CustomHTTPHeader,custom_http_header +CustomHeaders,custom_headers +CustomHeadersConfig,custom_headers_config +CustomHealthNotFound,custom_health_not_found +CustomIamInstanceProfile,custom_iam_instance_profile +CustomIconContent,custom_icon_content +CustomImage,custom_image +CustomImages,custom_images +CustomIndices,custom_indices +CustomIndicesInput,custom_indices_input +CustomInstanceProfileArn,custom_instance_profile_arn +CustomJson,custom_json +CustomKeyStoreHasCMKsException,custom_key_store_has_cmks_exception +CustomKeyStoreId,custom_key_store_id +CustomKeyStoreInvalidStateException,custom_key_store_invalid_state_exception +CustomKeyStoreName,custom_key_store_name +CustomKeyStoreNameInUseException,custom_key_store_name_in_use_exception +CustomKeyStoreNotFoundException,custom_key_store_not_found_exception +CustomKeyStoreType,custom_key_store_type +CustomKeyStores,custom_key_stores +CustomKeyStoresListEntry,custom_key_stores_list_entry +CustomKeys,custom_keys +CustomKnowledgeArticleTypeConfigurations,custom_knowledge_article_type_configurations +CustomLabel,custom_label +CustomLabelConfiguration,custom_label_configuration +CustomLabels,custom_labels +CustomLanguageCode,custom_language_code +CustomLibraries,custom_libraries +CustomLineItemBillingPeriodRange,custom_line_item_billing_period_range +CustomLineItemChargeDetails,custom_line_item_charge_details +CustomLineItemFlatChargeDetails,custom_line_item_flat_charge_details +CustomLineItemListElement,custom_line_item_list_element +CustomLineItemPercentageChargeDetails,custom_line_item_percentage_charge_details +CustomLineItemVersionListElement,custom_line_item_version_list_element +CustomLineItemVersions,custom_line_item_versions +CustomLineItems,custom_line_items +CustomLogSourceAttributes,custom_log_source_attributes +CustomLogSourceConfiguration,custom_log_source_configuration +CustomLogSourceCrawlerConfiguration,custom_log_source_crawler_configuration +CustomLogSourceProvider,custom_log_source_provider +CustomLogSourceResource,custom_log_source_resource +CustomMessage,custom_message +CustomMessageActivity,custom_message_activity +CustomMetadata,custom_metadata +CustomMetadataLimitExceededException,custom_metadata_limit_exceeded_exception +CustomModelSummary,custom_model_summary +CustomModelTrainingParameters,custom_model_training_parameters +CustomModelTransformParameters,custom_model_transform_parameters +CustomName,custom_name +CustomNarrative,custom_narrative +CustomNarrativeOptions,custom_narrative_options +CustomObjectIdentifier,custom_object_identifier +CustomOriginConfig,custom_origin_config +CustomParameterValues,custom_parameter_values +CustomPatterns,custom_patterns +CustomPayload,custom_payload +CustomPermissionsName,custom_permissions_name +CustomPlatformQuota,custom_platform_quota +CustomPlugin,custom_plugin +CustomPluginDescription,custom_plugin_description +CustomPluginFileDescription,custom_plugin_file_description +CustomPluginLocation,custom_plugin_location +CustomPluginLocationDescription,custom_plugin_location_description +CustomPluginRevisionSummary,custom_plugin_revision_summary +CustomPluginSummary,custom_plugin_summary +CustomPolicyDetails,custom_policy_details +CustomPrivateKey,custom_private_key +CustomRecipes,custom_recipes +CustomRedirectDomain,custom_redirect_domain +CustomRequestHandling,custom_request_handling +CustomResponse,custom_response +CustomResponseBodies,custom_response_bodies +CustomResponseBody,custom_response_body +CustomResponseBodyKey,custom_response_body_key +CustomRoleArn,custom_role_arn +CustomRoutingAccelerator,custom_routing_accelerator +CustomRoutingAcceleratorAttributes,custom_routing_accelerator_attributes +CustomRoutingDestinationConfiguration,custom_routing_destination_configuration +CustomRoutingDestinationDescription,custom_routing_destination_description +CustomRoutingEndpointConfiguration,custom_routing_endpoint_configuration +CustomRoutingEndpointDescription,custom_routing_endpoint_description +CustomRoutingEndpointGroup,custom_routing_endpoint_group +CustomRoutingListener,custom_routing_listener +CustomRule,custom_rule +CustomSMSLambdaVersionConfigType,custom_sms_lambda_version_config_type +CustomSMSSender,custom_sms_sender +CustomSchemaCountLimitExceededException,custom_schema_count_limit_exceeded_exception +CustomSeasonalityValue,custom_seasonality_value +CustomSecurityGroupId,custom_security_group_id +CustomSecurityGroupIds,custom_security_group_ids +CustomSql,custom_sql +CustomStepDetails,custom_step_details +CustomSuffix,custom_suffix +CustomTextContent,custom_text_content +CustomUserData,custom_user_data +CustomValue,custom_value +CustomValues,custom_values +CustomValuesConfiguration,custom_values_configuration +CustomVerificationEmailInvalidContentException,custom_verification_email_invalid_content_exception +CustomVerificationEmailTemplate,custom_verification_email_template +CustomVerificationEmailTemplateAlreadyExistsException,custom_verification_email_template_already_exists_exception +CustomVerificationEmailTemplateDoesNotExistException,custom_verification_email_template_does_not_exist_exception +CustomVerificationEmailTemplateMetadata,custom_verification_email_template_metadata +CustomVerificationEmailTemplateName,custom_verification_email_template_name +CustomVerificationEmailTemplates,custom_verification_email_templates +CustomVocabularyEntryId,custom_vocabulary_entry_id +CustomVocabularyExportSpecification,custom_vocabulary_export_specification +CustomVocabularyImportSpecification,custom_vocabulary_import_specification +CustomVocabularyItem,custom_vocabulary_item +CustomerAWSAccountId,customer_aws_account_id +CustomerAction,customer_action +CustomerAgentInfo,customer_agent_info +CustomerAgentlessCollectorInfo,customer_agentless_collector_info +CustomerAgreement,customer_agreement +CustomerArtifactPaths,customer_artifact_paths +CustomerAvailabilityZone,customer_availability_zone +CustomerAwsId,customer_aws_id +CustomerConnectorInfo,customer_connector_info +CustomerContentEncryptionConfiguration,customer_content_encryption_configuration +CustomerDnsIps,customer_dns_ips +CustomerGateway,customer_gateway +CustomerGatewayArn,customer_gateway_arn +CustomerGatewayArns,customer_gateway_arns +CustomerGatewayAssociation,customer_gateway_association +CustomerGatewayAssociations,customer_gateway_associations +CustomerGatewayConfiguration,customer_gateway_configuration +CustomerGatewayId,customer_gateway_id +CustomerGatewayIds,customer_gateway_ids +CustomerGateways,customer_gateways +CustomerIdentifier,customer_identifier +CustomerManagedChannelS3Storage,customer_managed_channel_s3_storage +CustomerManagedChannelS3StorageSummary,customer_managed_channel_s3_storage_summary +CustomerManagedDatastoreS3Storage,customer_managed_datastore_s3_storage +CustomerManagedDatastoreS3StorageSummary,customer_managed_datastore_s3_storage_summary +CustomerManagedKeyEnabled,customer_managed_key_enabled +CustomerManagedPolicyReference,customer_managed_policy_reference +CustomerManagedPolicyReferences,customer_managed_policy_references +CustomerManagedS3Storage,customer_managed_s3_storage +CustomerMasterKeySpec,customer_master_key_spec +CustomerMeCollectorInfo,customer_me_collector_info +CustomerMetadataProperties,customer_metadata_properties +CustomerMetadataPropertiesToRemove,customer_metadata_properties_to_remove +CustomerNodeEndpoint,customer_node_endpoint +CustomerNodeEndpointList,customer_node_endpoint_list +CustomerNotEntitledException,customer_not_entitled_exception +CustomerOutpostArn,customer_outpost_arn +CustomerOverride,customer_override +CustomerOverrideValidTill,customer_override_valid_till +CustomerOwnedIp,customer_owned_ip +CustomerOwnedIpEnabled,customer_owned_ip_enabled +CustomerOwnedIpv4Pool,customer_owned_ipv4_pool +CustomerProfiles,customer_profiles +CustomerProfilesDestinationProperties,customer_profiles_destination_properties +CustomerResultObject,customer_result_object +CustomerSpeakerId,customer_speaker_id +CustomerStorageMessage,customer_storage_message +CustomerUserName,customer_user_name +CustomizedCapacityMetricSpecification,customized_capacity_metric_specification +CustomizedLoadMetricSpecification,customized_load_metric_specification +CustomizedMetricSpecification,customized_metric_specification +CustomizedScalingMetricSpecification,customized_scaling_metric_specification +Cutoff,cutoff +CutoffBehavior,cutoff_behavior +Cvss,cvss +Cvss2,cvss2 +Cvss3,cvss3 +CvssScore,cvss_score +CvssScoreAdjustment,cvss_score_adjustment +CvssScoreDetails,cvss_score_details +CwLog,cw_log +CwLogEnabled,cw_log_enabled +CwLogGroup,cw_log_group +Cwes,cwes +DASHFragmentSelector,dash_fragment_selector +DASHStreamingSessionURL,dash_streaming_session_url +DASHTimestampRange,dash_timestamp_range +DBCluster,db_cluster +DBClusterAlreadyExistsFault,db_cluster_already_exists_fault +DBClusterArn,db_cluster_arn +DBClusterAutomatedBackup,db_cluster_automated_backup +DBClusterAutomatedBackupMessage,db_cluster_automated_backup_message +DBClusterAutomatedBackupNotFoundFault,db_cluster_automated_backup_not_found_fault +DBClusterAutomatedBackupQuotaExceededFault,db_cluster_automated_backup_quota_exceeded_fault +DBClusterAutomatedBackups,db_cluster_automated_backups +DBClusterAutomatedBackupsArn,db_cluster_automated_backups_arn +DBClusterBacktrack,db_cluster_backtrack +DBClusterBacktrackMessage,db_cluster_backtrack_message +DBClusterBacktrackNotFoundFault,db_cluster_backtrack_not_found_fault +DBClusterBacktracks,db_cluster_backtracks +DBClusterCapacityInfo,db_cluster_capacity_info +DBClusterEndpoint,db_cluster_endpoint +DBClusterEndpointAlreadyExistsFault,db_cluster_endpoint_already_exists_fault +DBClusterEndpointArn,db_cluster_endpoint_arn +DBClusterEndpointIdentifier,db_cluster_endpoint_identifier +DBClusterEndpointMessage,db_cluster_endpoint_message +DBClusterEndpointNotFoundFault,db_cluster_endpoint_not_found_fault +DBClusterEndpointQuotaExceededFault,db_cluster_endpoint_quota_exceeded_fault +DBClusterEndpointResourceIdentifier,db_cluster_endpoint_resource_identifier +DBClusterEndpoints,db_cluster_endpoints +DBClusterIdentifier,db_cluster_identifier +DBClusterIdentifiers,db_cluster_identifiers +DBClusterInstanceClass,db_cluster_instance_class +DBClusterMember,db_cluster_member +DBClusterMembers,db_cluster_members +DBClusterMessage,db_cluster_message +DBClusterNotFoundFault,db_cluster_not_found_fault +DBClusterOptionGroupMemberships,db_cluster_option_group_memberships +DBClusterOptionGroupName,db_cluster_option_group_name +DBClusterOptionGroupStatus,db_cluster_option_group_status +DBClusterParameterGroup,db_cluster_parameter_group +DBClusterParameterGroupArn,db_cluster_parameter_group_arn +DBClusterParameterGroupDetails,db_cluster_parameter_group_details +DBClusterParameterGroupName,db_cluster_parameter_group_name +DBClusterParameterGroupNameMessage,db_cluster_parameter_group_name_message +DBClusterParameterGroupNotFoundFault,db_cluster_parameter_group_not_found_fault +DBClusterParameterGroupStatus,db_cluster_parameter_group_status +DBClusterParameterGroups,db_cluster_parameter_groups +DBClusterParameterGroupsMessage,db_cluster_parameter_groups_message +DBClusterQuotaExceededFault,db_cluster_quota_exceeded_fault +DBClusterRole,db_cluster_role +DBClusterRoleAlreadyExistsFault,db_cluster_role_already_exists_fault +DBClusterRoleNotFoundFault,db_cluster_role_not_found_fault +DBClusterRoleQuotaExceededFault,db_cluster_role_quota_exceeded_fault +DBClusterSnapshot,db_cluster_snapshot +DBClusterSnapshotAlreadyExistsFault,db_cluster_snapshot_already_exists_fault +DBClusterSnapshotArn,db_cluster_snapshot_arn +DBClusterSnapshotAttribute,db_cluster_snapshot_attribute +DBClusterSnapshotAttributes,db_cluster_snapshot_attributes +DBClusterSnapshotAttributesResult,db_cluster_snapshot_attributes_result +DBClusterSnapshotIdentifier,db_cluster_snapshot_identifier +DBClusterSnapshotMessage,db_cluster_snapshot_message +DBClusterSnapshotNotFoundFault,db_cluster_snapshot_not_found_fault +DBClusterSnapshots,db_cluster_snapshots +DBClusters,db_clusters +DBEngineDescription,db_engine_description +DBEngineMediaType,db_engine_media_type +DBEngineVersion,db_engine_version +DBEngineVersionArn,db_engine_version_arn +DBEngineVersionDescription,db_engine_version_description +DBEngineVersionMessage,db_engine_version_message +DBEngineVersions,db_engine_versions +DBInstance,db_instance +DBInstanceAlreadyExistsFault,db_instance_already_exists_fault +DBInstanceArn,db_instance_arn +DBInstanceAutomatedBackup,db_instance_automated_backup +DBInstanceAutomatedBackupMessage,db_instance_automated_backup_message +DBInstanceAutomatedBackupNotFoundFault,db_instance_automated_backup_not_found_fault +DBInstanceAutomatedBackupQuotaExceededFault,db_instance_automated_backup_quota_exceeded_fault +DBInstanceAutomatedBackups,db_instance_automated_backups +DBInstanceAutomatedBackupsArn,db_instance_automated_backups_arn +DBInstanceAutomatedBackupsReplication,db_instance_automated_backups_replication +DBInstanceAutomatedBackupsReplications,db_instance_automated_backups_replications +DBInstanceClass,db_instance_class +DBInstanceCount,db_instance_count +DBInstanceIdentifier,db_instance_identifier +DBInstanceIdentifiers,db_instance_identifiers +DBInstanceMessage,db_instance_message +DBInstanceNotFoundFault,db_instance_not_found_fault +DBInstanceParameterGroupName,db_instance_parameter_group_name +DBInstanceRole,db_instance_role +DBInstanceRoleAlreadyExistsFault,db_instance_role_already_exists_fault +DBInstanceRoleNotFoundFault,db_instance_role_not_found_fault +DBInstanceRoleQuotaExceededFault,db_instance_role_quota_exceeded_fault +DBInstanceStatus,db_instance_status +DBInstanceStatusInfo,db_instance_status_info +DBInstances,db_instances +DBLogFileNotFoundFault,db_log_file_not_found_fault +DBName,db_name +DBParameterGroup,db_parameter_group +DBParameterGroupAlreadyExistsFault,db_parameter_group_already_exists_fault +DBParameterGroupArn,db_parameter_group_arn +DBParameterGroupDetails,db_parameter_group_details +DBParameterGroupFamily,db_parameter_group_family +DBParameterGroupName,db_parameter_group_name +DBParameterGroupNameMessage,db_parameter_group_name_message +DBParameterGroupNotFoundFault,db_parameter_group_not_found_fault +DBParameterGroupQuotaExceededFault,db_parameter_group_quota_exceeded_fault +DBParameterGroupStatus,db_parameter_group_status +DBParameterGroups,db_parameter_groups +DBParameterGroupsMessage,db_parameter_groups_message +DBPortNumber,db_port_number +DBProxies,db_proxies +DBProxy,db_proxy +DBProxyAlreadyExistsFault,db_proxy_already_exists_fault +DBProxyArn,db_proxy_arn +DBProxyEndpoint,db_proxy_endpoint +DBProxyEndpointAlreadyExistsFault,db_proxy_endpoint_already_exists_fault +DBProxyEndpointArn,db_proxy_endpoint_arn +DBProxyEndpointName,db_proxy_endpoint_name +DBProxyEndpointNotFoundFault,db_proxy_endpoint_not_found_fault +DBProxyEndpointQuotaExceededFault,db_proxy_endpoint_quota_exceeded_fault +DBProxyEndpoints,db_proxy_endpoints +DBProxyName,db_proxy_name +DBProxyNotFoundFault,db_proxy_not_found_fault +DBProxyQuotaExceededFault,db_proxy_quota_exceeded_fault +DBProxyTarget,db_proxy_target +DBProxyTargetAlreadyRegisteredFault,db_proxy_target_already_registered_fault +DBProxyTargetGroup,db_proxy_target_group +DBProxyTargetGroupNotFoundFault,db_proxy_target_group_not_found_fault +DBProxyTargetNotFoundFault,db_proxy_target_not_found_fault +DBProxyTargets,db_proxy_targets +DBSecurityGroup,db_security_group +DBSecurityGroupAlreadyExistsFault,db_security_group_already_exists_fault +DBSecurityGroupArn,db_security_group_arn +DBSecurityGroupDescription,db_security_group_description +DBSecurityGroupMembership,db_security_group_membership +DBSecurityGroupMemberships,db_security_group_memberships +DBSecurityGroupMessage,db_security_group_message +DBSecurityGroupName,db_security_group_name +DBSecurityGroupNotFoundFault,db_security_group_not_found_fault +DBSecurityGroupNotSupportedFault,db_security_group_not_supported_fault +DBSecurityGroupQuotaExceededFault,db_security_group_quota_exceeded_fault +DBSecurityGroups,db_security_groups +DBSnapshot,db_snapshot +DBSnapshotAlreadyExistsFault,db_snapshot_already_exists_fault +DBSnapshotArn,db_snapshot_arn +DBSnapshotAttribute,db_snapshot_attribute +DBSnapshotAttributes,db_snapshot_attributes +DBSnapshotAttributesResult,db_snapshot_attributes_result +DBSnapshotIdentifier,db_snapshot_identifier +DBSnapshotMessage,db_snapshot_message +DBSnapshotNotFoundFault,db_snapshot_not_found_fault +DBSnapshots,db_snapshots +DBSubnetGroup,db_subnet_group +DBSubnetGroupAlreadyExistsFault,db_subnet_group_already_exists_fault +DBSubnetGroupArn,db_subnet_group_arn +DBSubnetGroupDescription,db_subnet_group_description +DBSubnetGroupDoesNotCoverEnoughAZs,db_subnet_group_does_not_cover_enough_azs +DBSubnetGroupMessage,db_subnet_group_message +DBSubnetGroupName,db_subnet_group_name +DBSubnetGroupNotAllowedFault,db_subnet_group_not_allowed_fault +DBSubnetGroupNotFoundFault,db_subnet_group_not_found_fault +DBSubnetGroupQuotaExceededFault,db_subnet_group_quota_exceeded_fault +DBSubnetGroups,db_subnet_groups +DBSubnetQuotaExceededFault,db_subnet_quota_exceeded_fault +DBSystemId,db_system_id +DBUpgradeDependencyFailureFault,db_upgrade_dependency_failure_fault +DESIRED,desired +DICOMAccessionNumber,dicom_accession_number +DICOMImportJobProperties,dicom_import_job_properties +DICOMImportJobSummary,dicom_import_job_summary +DICOMNumberOfStudyRelatedInstances,dicom_number_of_study_related_instances +DICOMNumberOfStudyRelatedSeries,dicom_number_of_study_related_series +DICOMPatientBirthDate,dicom_patient_birth_date +DICOMPatientId,dicom_patient_id +DICOMPatientName,dicom_patient_name +DICOMPatientSex,dicom_patient_sex +DICOMStudyDate,dicom_study_date +DICOMStudyDateAndTime,dicom_study_date_and_time +DICOMStudyDescription,dicom_study_description +DICOMStudyId,dicom_study_id +DICOMStudyInstanceUID,dicom_study_instance_uid +DICOMStudyTime,dicom_study_time +DICOMTags,dicom_tags +DICOMUpdates,dicom_updates +DNIS,dnis +DNISEmergencyCallingConfiguration,dnis_emergency_calling_configuration +DNSKEYRecord,dnskey_record +DNSLogs,dns_logs +DNSLogsConfigurationResult,dns_logs_configuration_result +DNSName,dns_name +DNSSECNotFound,dnssec_not_found +DNSSECStatus,dnssec_status +DNSTarget,dns_target +DNSTargetResource,dns_target_resource +DPDTimeoutAction,dpd_timeout_action +DPDTimeoutSeconds,dpd_timeout_seconds +DPUHour,dpu_hour +DPUSeconds,dpu_seconds +DQResultsPublishingOptions,dq_results_publishing_options +DQStopJobOnFailureOptions,dq_stop_job_on_failure_options +DSRecord,ds_record +DTMFInputEvent,dtmf_input_event +DTMFSpecification,dtmf_specification +DagEdges,dag_edges +DagNodes,dag_nodes +DagProcessingLogs,dag_processing_logs +DagS3Path,dag_s3_path +Daily,daily +DailyAutomaticBackupStartTime,daily_automatic_backup_start_time +DailyCap,daily_cap +DailyCommitmentToPurchase,daily_commitment_to_purchase +DailySettings,daily_settings +DailyVolume,daily_volume +DailyVolumes,daily_volumes +DakCertificateMetadata,dak_certificate_metadata +Danger,danger +DangerForeground,danger_foreground +DashAdditionalManifest,dash_additional_manifest +DashConfiguration,dash_configuration +DashConfigurationForPut,dash_configuration_for_put +DashEncryption,dash_encryption +DashIsoEncryptionSettings,dash_iso_encryption_settings +DashIsoGroupSettings,dash_iso_group_settings +DashIsoImageBasedTrickPlaySettings,dash_iso_image_based_trick_play_settings +DashManifest,dash_manifest +DashManifestStyle,dash_manifest_style +DashManifests,dash_manifests +DashPackage,dash_package +DashPlaylistSettings,dash_playlist_settings +DashSignaledSystemIds,dash_signaled_system_ids +Dashboard,dashboard +DashboardArn,dashboard_arn +DashboardAttributes,dashboard_attributes +DashboardBody,dashboard_body +DashboardEnabled,dashboard_enabled +DashboardEntries,dashboard_entries +DashboardEntry,dashboard_entry +DashboardError,dashboard_error +DashboardId,dashboard_id +DashboardInvalidInputError,dashboard_invalid_input_error +DashboardName,dashboard_name +DashboardNamePrefix,dashboard_name_prefix +DashboardNames,dashboard_names +DashboardNotFoundError,dashboard_not_found_error +DashboardOptions,dashboard_options +DashboardPublishOptions,dashboard_publish_options +DashboardSearchFilter,dashboard_search_filter +DashboardSourceEntity,dashboard_source_entity +DashboardSourceTemplate,dashboard_source_template +DashboardSummary,dashboard_summary +DashboardSummaryList,dashboard_summary_list +DashboardValidationMessage,dashboard_validation_message +DashboardValidationMessages,dashboard_validation_messages +DashboardVersion,dashboard_version +DashboardVersionDefinition,dashboard_version_definition +DashboardVersionSummary,dashboard_version_summary +DashboardVersionSummaryList,dashboard_version_summary_list +DashboardVisual,dashboard_visual +DashboardVisualId,dashboard_visual_id +DashboardVisualPublishOptions,dashboard_visual_publish_options +Dashboards,dashboards +Data,data +DataAccessRoleArn,data_access_role_arn +DataAggregation,data_aggregation +DataAlreadyAcceptedException,data_already_accepted_exception +DataAlreadyExistsException,data_already_exists_exception +DataAnalysisEndTime,data_analysis_end_time +DataAnalysisStartTime,data_analysis_start_time +DataAttributes,data_attributes +DataBars,data_bars +DataBarsOptions,data_bars_options +DataCaptureConfig,data_capture_config +DataCaptureConfigSummary,data_capture_config_summary +DataCapturedDestinationS3Uri,data_captured_destination_s3_uri +DataCatalog,data_catalog +DataCatalogConfig,data_catalog_config +DataCatalogEncryptionSettings,data_catalog_encryption_settings +DataCatalogInputDefinition,data_catalog_input_definition +DataCatalogOutput,data_catalog_output +DataCatalogOutputs,data_catalog_outputs +DataCatalogSummary,data_catalog_summary +DataCatalogsSummary,data_catalogs_summary +DataCellsFilter,data_cells_filter +DataCellsFilterResource,data_cells_filter_resource +DataCellsFilters,data_cells_filters +DataChannel,data_channel +DataChannelConcatenationConfiguration,data_channel_concatenation_configuration +DataClassification,data_classification +DataClassificationDetails,data_classification_details +DataCollectionDetails,data_collection_details +DataColor,data_color +DataColorPalette,data_color_palette +DataCompressionType,data_compression_type +DataConfig,data_config +DataConfiguration,data_configuration +DataConnector,data_connector +DataDelayOffsetInMinutes,data_delay_offset_in_minutes +DataDestination,data_destination +DataDistributionType,data_distribution_type +DataDriven,data_driven +DataEncipherment,data_encipherment +DataEncryptionException,data_encryption_exception +DataEncryptionKeyId,data_encryption_key_id +DataEncryptionMetadata,data_encryption_metadata +DataEndTime,data_end_time +DataEndTimeBefore,data_end_time_before +DataEndpoint,data_endpoint +DataExists,data_exists +DataExplorationNotebookLocation,data_exploration_notebook_location +DataExport,data_export +DataFieldSeriesItem,data_field_series_item +DataFormat,data_format +DataFormatConversionConfiguration,data_format_conversion_configuration +DataFrequency,data_frequency +DataId,data_id +DataIngestionJobSummaries,data_ingestion_job_summaries +DataIngestionJobSummary,data_ingestion_job_summary +DataInputConfig,data_input_config +DataInputConfiguration,data_input_configuration +DataIntegrationArn,data_integration_arn +DataIntegrationAssociationArn,data_integration_association_arn +DataIntegrationAssociationSummary,data_integration_association_summary +DataIntegrationAssociations,data_integration_associations +DataIntegrationIdentifier,data_integration_identifier +DataIntegrationSummary,data_integration_summary +DataIntegrations,data_integrations +DataItem,data_item +DataItems,data_items +DataLabelOptions,data_label_options +DataLabelType,data_label_type +DataLabelTypes,data_label_types +DataLabels,data_labels +DataLakeAdmins,data_lake_admins +DataLakeAutoEnableNewAccountConfiguration,data_lake_auto_enable_new_account_configuration +DataLakeConfiguration,data_lake_configuration +DataLakeEncryptionConfiguration,data_lake_encryption_configuration +DataLakeException,data_lake_exception +DataLakeKmsKeyId,data_lake_kms_key_id +DataLakeLifecycleConfiguration,data_lake_lifecycle_configuration +DataLakeLifecycleExpiration,data_lake_lifecycle_expiration +DataLakeLifecycleTransition,data_lake_lifecycle_transition +DataLakePrincipal,data_lake_principal +DataLakePrincipalIdentifier,data_lake_principal_identifier +DataLakeReplicationConfiguration,data_lake_replication_configuration +DataLakeResource,data_lake_resource +DataLakeS3Uri,data_lake_s3_uri +DataLakeSettings,data_lake_settings +DataLakeSource,data_lake_source +DataLakeSourceStatus,data_lake_source_status +DataLakeUpdateException,data_lake_update_exception +DataLakeUpdateStatus,data_lake_update_status +DataLength,data_length +DataLocation,data_location +DataLocationResource,data_location_resource +DataLocationS3,data_location_s3 +DataManifestLocation,data_manifest_location +DataModel,data_model +DataModelConfiguration,data_model_configuration +DataModelS3Configuration,data_model_s3_configuration +DataNodeCount,data_node_count +DataOptions,data_options +DataOutputConfiguration,data_output_configuration +DataPTSControl,data_pts_control +DataPageSize,data_page_size +DataPath,data_path +DataPathColor,data_path_color +DataPathLabelType,data_path_label_type +DataPathList,data_path_list +DataPathOptions,data_path_options +DataPathSort,data_path_sort +DataPathValue,data_path_value +DataPipelineId,data_pipeline_id +DataPoint,data_point +DataPointDrillUpDownOption,data_point_drill_up_down_option +DataPointMenuLabelOption,data_point_menu_label_option +DataPointTooltipOption,data_point_tooltip_option +DataPoints,data_points +DataPolicyCount,data_policy_count +DataPreProcessingConfiguration,data_pre_processing_configuration +DataPreviewOptions,data_preview_options +DataPrivacy,data_privacy +DataProcessing,data_processing +DataProtectionPolicy,data_protection_policy +DataProvider,data_provider +DataProviderArn,data_provider_arn +DataProviderCreationTime,data_provider_creation_time +DataProviderDescriptor,data_provider_descriptor +DataProviderDescriptorDefinition,data_provider_descriptor_definition +DataProviderIdentifier,data_provider_identifier +DataProviderName,data_provider_name +DataProviders,data_providers +DataPullMode,data_pull_mode +DataQualityAppSpecification,data_quality_app_specification +DataQualityBaselineConfig,data_quality_baseline_config +DataQualityEvaluationRunAdditionalRunOptions,data_quality_evaluation_run_additional_run_options +DataQualityJobInput,data_quality_job_input +DataQualityJobOutputConfig,data_quality_job_output_config +DataQualityMetric,data_quality_metric +DataQualityMetricList,data_quality_metric_list +DataQualityResult,data_quality_result +DataQualityResultDescription,data_quality_result_description +DataQualityResultFilterCriteria,data_quality_result_filter_criteria +DataQualityRuleRecommendationRunDescription,data_quality_rule_recommendation_run_description +DataQualityRuleRecommendationRunFilter,data_quality_rule_recommendation_run_filter +DataQualityRuleResult,data_quality_rule_result +DataQualityRulesetEvaluationRunDescription,data_quality_ruleset_evaluation_run_description +DataQualityRulesetEvaluationRunFilter,data_quality_ruleset_evaluation_run_filter +DataQualityRulesetFilterCriteria,data_quality_ruleset_filter_criteria +DataQualityRulesetListDetails,data_quality_ruleset_list_details +DataQualitySummary,data_quality_summary +DataQualityTargetTable,data_quality_target_table +DataQueries,data_queries +DataQuery,data_query +DataRate,data_rate +DataRearrangement,data_rearrangement +DataReplicationCounterpart,data_replication_counterpart +DataReplicationError,data_replication_error +DataReplicationInfo,data_replication_info +DataReplicationInfoReplicatedDisk,data_replication_info_replicated_disk +DataReplicationInitiation,data_replication_initiation +DataReplicationInitiationStep,data_replication_initiation_step +DataReplicationMetadata,data_replication_metadata +DataReplicationMetadataOutput,data_replication_metadata_output +DataReplicationMode,data_replication_mode +DataReplicationPrimaryBrokerArn,data_replication_primary_broker_arn +DataReplicationRole,data_replication_role +DataRepositoryAssociation,data_repository_association +DataRepositoryAssociationIds,data_repository_association_ids +DataRepositoryAssociationNotFound,data_repository_association_not_found +DataRepositoryAssociations,data_repository_associations +DataRepositoryConfiguration,data_repository_configuration +DataRepositoryFailureDetails,data_repository_failure_details +DataRepositoryPath,data_repository_path +DataRepositorySubdirectories,data_repository_subdirectories +DataRepositoryTask,data_repository_task +DataRepositoryTaskEnded,data_repository_task_ended +DataRepositoryTaskExecuting,data_repository_task_executing +DataRepositoryTaskFailureDetails,data_repository_task_failure_details +DataRepositoryTaskFilter,data_repository_task_filter +DataRepositoryTaskNotFound,data_repository_task_not_found +DataRepositoryTaskStatus,data_repository_task_status +DataRepositoryTasks,data_repository_tasks +DataResource,data_resource +DataResources,data_resources +DataResponse,data_response +DataResponses,data_responses +DataRetentionChangeInHours,data_retention_change_in_hours +DataRetentionInHours,data_retention_in_hours +DataRetentionOptIn,data_retention_opt_in +DataRetentionSupport,data_retention_support +DataRetrievalPolicy,data_retrieval_policy +DataRetrievalRule,data_retrieval_rule +DataScannedBytes,data_scanned_bytes +DataScannedInBytes,data_scanned_in_bytes +DataSchema,data_schema +DataSchemaLocationS3,data_schema_location_s3 +DataSchemaUri,data_schema_uri +DataSecurityConfig,data_security_config +DataSet,data_set +DataSetArn,data_set_arn +DataSetArns,data_set_arns +DataSetConfiguration,data_set_configuration +DataSetConfigurations,data_set_configurations +DataSetEntry,data_set_entry +DataSetId,data_set_id +DataSetIdentifier,data_set_identifier +DataSetIdentifierDeclaration,data_set_identifier_declaration +DataSetIdentifierDeclarations,data_set_identifier_declarations +DataSetImportItem,data_set_import_item +DataSetImportSummary,data_set_import_summary +DataSetImportTask,data_set_import_task +DataSetName,data_set_name +DataSetParameterName,data_set_parameter_name +DataSetPlaceholder,data_set_placeholder +DataSetReference,data_set_reference +DataSetReferences,data_set_references +DataSetRefreshProperties,data_set_refresh_properties +DataSetSchema,data_set_schema +DataSetSearchFilter,data_set_search_filter +DataSetSummaries,data_set_summaries +DataSetSummary,data_set_summary +DataSetUsageConfiguration,data_set_usage_configuration +DataSets,data_sets +DataShare,data_share +DataShareArn,data_share_arn +DataShareAssociation,data_share_association +DataShareAssociations,data_share_associations +DataShares,data_shares +DataSharingPreference,data_sharing_preference +DataSharingPreferenceForUpdate,data_sharing_preference_for_update +DataSize,data_size +DataSizeInBytes,data_size_in_bytes +DataSnapshotTime,data_snapshot_time +DataSource,data_source +DataSourceArn,data_source_arn +DataSourceConfig,data_source_config +DataSourceConfiguration,data_source_configuration +DataSourceConfigurations,data_source_configurations +DataSourceConfigurationsResult,data_source_configurations_result +DataSourceCredentials,data_source_credentials +DataSourceErrorCode,data_source_error_code +DataSourceErrorInfo,data_source_error_info +DataSourceFieldName,data_source_field_name +DataSourceFreeTrial,data_source_free_trial +DataSourceGroup,data_source_group +DataSourceGroups,data_source_groups +DataSourceId,data_source_id +DataSourceIds,data_source_ids +DataSourceName,data_source_name +DataSourceParameters,data_source_parameters +DataSourceS3Configuration,data_source_s3_configuration +DataSourceSchema,data_source_schema +DataSourceSearchFilter,data_source_search_filter +DataSourceSummaries,data_source_summaries +DataSourceSummary,data_source_summary +DataSourceSyncJob,data_source_sync_job +DataSourceSyncJobId,data_source_sync_job_id +DataSourceSyncJobMetricTarget,data_source_sync_job_metric_target +DataSourceSyncJobMetrics,data_source_sync_job_metrics +DataSourceToIndexFieldMapping,data_source_to_index_field_mapping +DataSourceVpcConfiguration,data_source_vpc_configuration +DataSources,data_sources +DataSourcesFreeTrial,data_sources_free_trial +DataSpec,data_spec +DataSplitConfig,data_split_config +DataStartTime,data_start_time +DataStartTimeAfter,data_start_time_after +DataStorage,data_storage +DataStorageConfig,data_storage_config +DataTableColumns,data_table_columns +DataTableName,data_table_name +DataTiering,data_tiering +DataTieringEnabled,data_tiering_enabled +DataTraceEnabled,data_trace_enabled +DataTransfer,data_transfer +DataTransferApi,data_transfer_api +DataTransferProgress,data_transfer_progress +DataTransferProgressPercent,data_transfer_progress_percent +DataTransferProtection,data_transfer_protection +DataTransferSubscriberFeePercent,data_transfer_subscriber_fee_percent +DataTransferredInMegaBytes,data_transferred_in_mega_bytes +DataTransforms,data_transforms +DataType,data_type +DataTypeMapping,data_type_mapping +DataUnavailableException,data_unavailable_exception +DataUploadFrequency,data_upload_frequency +DataValidationMetrics,data_validation_metrics +DataValue,data_value +DataViewDestinationTypeParams,data_view_destination_type_params +DataViewErrorInfo,data_view_error_info +DataViewSummary,data_view_summary +DataVolumeKMSKeyId,data_volume_kms_key_id +DataWrites,data_writes +Database,database +DatabaseARN,database_arn +DatabaseARNUpdate,database_arn_update +DatabaseArn,database_arn +DatabaseConfigDetail,database_config_detail +DatabaseConfiguration,database_configuration +DatabaseConnectionException,database_connection_exception +DatabaseCredentials,database_credentials +DatabaseEdition,database_edition +DatabaseEngine,database_engine +DatabaseEngineType,database_engine_type +DatabaseHost,database_host +DatabaseId,database_id +DatabaseIdentifier,database_identifier +DatabaseIds,database_ids +DatabaseInformation,database_information +DatabaseInput,database_input +DatabaseInputDefinition,database_input_definition +DatabaseInstallationFilesS3BucketName,database_installation_files_s3_bucket_name +DatabaseInstallationFilesS3Prefix,database_installation_files_s3_prefix +DatabaseInstance,database_instance +DatabaseInstanceSoftwareDetailsResponse,database_instance_software_details_response +DatabaseIpAddress,database_ip_address +DatabaseLFTagPolicy,database_lf_tag_policy +DatabaseLFTagPolicyAndPermissions,database_lf_tag_policy_and_permissions +DatabaseList,database_list +DatabaseMode,database_mode +DatabaseName,database_name +DatabaseOptions,database_options +DatabaseOutput,database_output +DatabaseOutputMode,database_output_mode +DatabaseOutputs,database_outputs +DatabasePort,database_port +DatabasePreferences,database_preferences +DatabaseResource,database_resource +DatabaseResponse,database_response +DatabaseRevision,database_revision +DatabaseRevisionReleaseDate,database_revision_release_date +DatabaseShortInfoResponse,database_short_info_response +DatabaseSummary,database_summary +DatabaseTableName,database_table_name +DatabaseTableOutputOptions,database_table_output_options +DatabaseType,database_type +DatabaseUserName,database_user_name +DatabaseVersion,database_version +Databases,databases +DatabricksParameters,databricks_parameters +Datadog,datadog +DatadogConnectorProfileCredentials,datadog_connector_profile_credentials +DatadogConnectorProfileProperties,datadog_connector_profile_properties +DatadogSourceProperties,datadog_source_properties +DataflowDetail,dataflow_detail +DataflowEndpoint,dataflow_endpoint +DataflowEndpointConfig,dataflow_endpoint_config +DataflowEndpointGroupIdResponse,dataflow_endpoint_group_id_response +DataflowEndpointListItem,dataflow_endpoint_list_item +Datapoint,datapoint +Datapoints,datapoints +DatapointsToAlarm,datapoints_to_alarm +DatapointsToAlert,datapoints_to_alert +Dataset,dataset +DatasetAction,dataset_action +DatasetActionSummary,dataset_action_summary +DatasetArn,dataset_arn +DatasetArns,dataset_arns +DatasetAugmentedManifestsListItem,dataset_augmented_manifests_list_item +DatasetChanges,dataset_changes +DatasetContentDeliveryDestination,dataset_content_delivery_destination +DatasetContentDeliveryRule,dataset_content_delivery_rule +DatasetContentStatus,dataset_content_status +DatasetContentSummary,dataset_content_summary +DatasetContentVersionValue,dataset_content_version_value +DatasetCount,dataset_count +DatasetDefinition,dataset_definition +DatasetDeletedAfterRequestedSyncCount,dataset_deleted_after_requested_sync_count +DatasetDescription,dataset_description +DatasetDocumentClassifierInputDataConfig,dataset_document_classifier_input_data_config +DatasetEntityRecognizerAnnotations,dataset_entity_recognizer_annotations +DatasetEntityRecognizerDocuments,dataset_entity_recognizer_documents +DatasetEntityRecognizerEntityList,dataset_entity_recognizer_entity_list +DatasetEntityRecognizerInputDataConfig,dataset_entity_recognizer_input_data_config +DatasetEntries,dataset_entries +DatasetEntry,dataset_entry +DatasetExists,dataset_exists +DatasetExportJob,dataset_export_job +DatasetExportJobOutput,dataset_export_job_output +DatasetExportJobSummary,dataset_export_job_summary +DatasetFilter,dataset_filter +DatasetFormat,dataset_format +DatasetGroundTruthManifest,dataset_ground_truth_manifest +DatasetGroup,dataset_group +DatasetGroupArn,dataset_group_arn +DatasetGroupName,dataset_group_name +DatasetGroupSummary,dataset_group_summary +DatasetGroups,dataset_groups +DatasetId,dataset_id +DatasetImageStats,dataset_image_stats +DatasetImportJob,dataset_import_job +DatasetImportJobArn,dataset_import_job_arn +DatasetImportJobArns,dataset_import_job_arns +DatasetImportJobName,dataset_import_job_name +DatasetImportJobSummary,dataset_import_job_summary +DatasetImportJobs,dataset_import_jobs +DatasetInputDataConfig,dataset_input_data_config +DatasetLabelDescription,dataset_label_description +DatasetLabelDescriptions,dataset_label_descriptions +DatasetLabelStats,dataset_label_stats +DatasetMetadata,dataset_metadata +DatasetName,dataset_name +DatasetNameBeginsWith,dataset_name_begins_with +DatasetOwnerInfo,dataset_owner_info +DatasetParameter,dataset_parameter +DatasetParameters,dataset_parameters +DatasetProperties,dataset_properties +DatasetPropertiesList,dataset_properties_list +DatasetRowDateGranularity,dataset_row_date_granularity +DatasetS3Uri,dataset_s3_uri +DatasetSchema,dataset_schema +DatasetSchemaSummary,dataset_schema_summary +DatasetSource,dataset_source +DatasetStatisticsConfiguration,dataset_statistics_configuration +DatasetStats,dataset_stats +DatasetSummaries,dataset_summaries +DatasetSummary,dataset_summary +DatasetSyncCount,dataset_sync_count +DatasetTrigger,dataset_trigger +DatasetType,dataset_type +DatasetUpdateSummary,dataset_update_summary +Datasets,datasets +DatasourcePackageIngestDetail,datasource_package_ingest_detail +DatasourcePackageIngestHistory,datasource_package_ingest_history +DatasourcePackageIngestState,datasource_package_ingest_state +DatasourcePackageIngestStates,datasource_package_ingest_states +DatasourcePackageUsageInfo,datasource_package_usage_info +DatasourcePackages,datasource_packages +Datastore,datastore +DatastoreActivity,datastore_activity +DatastoreArn,datastore_arn +DatastoreEndpoint,datastore_endpoint +DatastoreFilter,datastore_filter +DatastoreId,datastore_id +DatastoreIotSiteWiseMultiLayerStorage,datastore_iot_site_wise_multi_layer_storage +DatastoreIotSiteWiseMultiLayerStorageSummary,datastore_iot_site_wise_multi_layer_storage_summary +DatastoreName,datastore_name +DatastorePartition,datastore_partition +DatastorePartitions,datastore_partitions +DatastoreProperties,datastore_properties +DatastorePropertiesList,datastore_properties_list +DatastoreStatistics,datastore_statistics +DatastoreStatus,datastore_status +DatastoreStorageSummary,datastore_storage_summary +DatastoreSummary,datastore_summary +DatastoreTypeVersion,datastore_type_version +Datatype,datatype +Date,date +DateAggregationFunction,date_aggregation_function +DateArrayOptions,date_array_options +DateAxisOptions,date_axis_options +DateColumnStatisticsData,date_column_statistics_data +DateCreated,date_created +DateDimensionField,date_dimension_field +DateEnabled,date_enabled +DateFieldFormat,date_field_format +DateFilter,date_filter +DateFormat,date_format +DateGranularity,date_granularity +DateImported,date_imported +DateInterval,date_interval +DateMeasureField,date_measure_field +DateModified,date_modified +DateNewProvisioningDataAvailable,date_new_provisioning_data_available +DateOptions,date_options +DatePartitionDelimiter,date_partition_delimiter +DatePartitionEnabled,date_partition_enabled +DatePartitionSequence,date_partition_sequence +DatePartitionTimezone,date_partition_timezone +DateProvisioned,date_provisioned +DateRange,date_range +DateRangeFilter,date_range_filter +DateRangeType,date_range_type +DateReference,date_reference +DateTime,date_time +DateTimeDatasetParameter,date_time_dataset_parameter +DateTimeDatasetParameterDefaultValues,date_time_dataset_parameter_default_values +DateTimeDefaultValues,date_time_default_values +DateTimeFormat,date_time_format +DateTimeFormatConfiguration,date_time_format_configuration +DateTimeHierarchy,date_time_hierarchy +DateTimeParameter,date_time_parameter +DateTimeParameterDeclaration,date_time_parameter_declaration +DateTimeParameters,date_time_parameters +DateTimePicker,date_time_picker +DateTimePickerControlDisplayOptions,date_time_picker_control_display_options +DateTimeRange,date_time_range +DateTimeStaticValues,date_time_static_values +DateTimeValueWhenUnsetConfiguration,date_time_value_when_unset_configuration +DateTimeValues,date_time_values +DateUpdated,date_updated +DateValue,date_value +Datetime,datetime +DatetimeFormat,datetime_format +DatetimeOptions,datetime_options +DatetimeRange,datetime_range +DatetimeTypeFieldName,datetime_type_field_name +Datum,datum +Day,day +DayOfMonth,day_of_month +DayOfTheWeek,day_of_the_week +DayOfWeek,day_of_week +Days,days +DaysAfterInitiation,days_after_initiation +DaysBeforeExpiry,days_before_expiry +DaysOfWeek,days_of_week +DbClusterIdentifier,db_cluster_identifier +DbClusterMembers,db_cluster_members +DbClusterOptionGroupMemberships,db_cluster_option_group_memberships +DbClusterOptionGroupName,db_cluster_option_group_name +DbClusterParameterGroup,db_cluster_parameter_group +DbClusterParameterGroupStatus,db_cluster_parameter_group_status +DbClusterResourceId,db_cluster_resource_id +DbClusterSnapshotAttributes,db_cluster_snapshot_attributes +DbClusterSnapshotIdentifier,db_cluster_snapshot_identifier +DbGroups,db_groups +DbInstanceArn,db_instance_arn +DbInstanceClass,db_instance_class +DbInstanceIdentifier,db_instance_identifier +DbInstancePort,db_instance_port +DbInstanceStatus,db_instance_status +DbName,db_name +DbParameterGroupName,db_parameter_group_name +DbParameterGroups,db_parameter_groups +DbPassword,db_password +DbSecurityGroupArn,db_security_group_arn +DbSecurityGroupDescription,db_security_group_description +DbSecurityGroupName,db_security_group_name +DbSecurityGroups,db_security_groups +DbSnapshotIdentifier,db_snapshot_identifier +DbSubnetGroup,db_subnet_group +DbSubnetGroupArn,db_subnet_group_arn +DbSubnetGroupDescription,db_subnet_group_description +DbSubnetGroupName,db_subnet_group_name +DbUser,db_user +DbiResourceId,dbi_resource_id +DcFilter,dc_filter +DdlArtifactsSchema,ddl_artifacts_schema +Ddls,ddls +DdsHandling,dds_handling +DdsXCoordinate,dds_x_coordinate +DdsYCoordinate,dds_y_coordinate +DeactivateAnomalyDetectorRequest,deactivate_anomaly_detector_request +DeactivateContactChannelRequest,deactivate_contact_channel_request +DeactivateDeviceIdentifierRequest,deactivate_device_identifier_request +DeactivateDeviceIdentifierResponse,deactivate_device_identifier_response +DeactivateEvaluationFormRequest,deactivate_evaluation_form_request +DeactivateEvaluationFormResponse,deactivate_evaluation_form_response +DeactivateEventSourceRequest,deactivate_event_source_request +DeactivateKeySigningKeyRequest,deactivate_key_signing_key_request +DeactivateKeySigningKeyResponse,deactivate_key_signing_key_response +DeactivateMFADeviceRequest,deactivate_mfa_device_request +DeactivatePipelineInput,deactivate_pipeline_input +DeactivateTypeInput,deactivate_type_input +DeactivateUserRequest,deactivate_user_request +DeactivatingLastSystemUserException,deactivating_last_system_user_exception +DeadLetterConfig,dead_letter_config +DeadLetterQueueUrl,dead_letter_queue_url +DeadLetterTargetArn,dead_letter_target_arn +Deadline,deadline +DeauthorizeConnectionRequest,deauthorize_connection_request +DeauthorizeConnectionResponse,deauthorize_connection_response +DeauthorizeDataShareMessage,deauthorize_data_share_message +DeblockFilter,deblock_filter +DebugHookConfig,debug_hook_config +DebugLogDeliveryAccounts,debug_log_delivery_accounts +DebugLogging,debug_logging +DebugRuleConfiguration,debug_rule_configuration +DebugRuleConfigurations,debug_rule_configurations +DebugRuleEvaluationStatus,debug_rule_evaluation_status +DebugRuleEvaluationStatuses,debug_rule_evaluation_statuses +DebugSession,debug_session +DecimalColumnStatisticsData,decimal_column_statistics_data +DecimalDatasetParameter,decimal_dataset_parameter +DecimalDatasetParameterDefaultValues,decimal_dataset_parameter_default_values +DecimalDefaultValues,decimal_default_values +DecimalNumber,decimal_number +DecimalParameter,decimal_parameter +DecimalParameterDeclaration,decimal_parameter_declaration +DecimalParameters,decimal_parameters +DecimalPlaces,decimal_places +DecimalPlacesConfiguration,decimal_places_configuration +DecimalSeparator,decimal_separator +DecimalStaticValues,decimal_static_values +DecimalValueWhenUnsetConfiguration,decimal_value_when_unset_configuration +DecimalValues,decimal_values +DecimalizationTable,decimalization_table +DecipherOnly,decipher_only +Decision,decision +DecisionTask,decision_task +DecisionTaskCompletedEventAttributes,decision_task_completed_event_attributes +DecisionTaskScheduledEventAttributes,decision_task_scheduled_event_attributes +DecisionTaskStartedEventAttributes,decision_task_started_event_attributes +DecisionTaskTimedOutEventAttributes,decision_task_timed_out_event_attributes +Declared,declared +DeclaredTransforms,declared_transforms +DeclineHandshakeRequest,decline_handshake_request +DeclineHandshakeResponse,decline_handshake_response +DeclineInvitationsRequest,decline_invitations_request +DeclineInvitationsResponse,decline_invitations_response +DecodeAuthorizationMessageRequest,decode_authorization_message_request +DecodeAuthorizationMessageResponse,decode_authorization_message_response +DecodeConfig,decode_config +DecodedMessage,decoded_message +DecoderManifestSummary,decoder_manifest_summary +DecoderManifestValidationException,decoder_manifest_validation_exception +DecommissionTimeout,decommission_timeout +DecreaseNodeGroupsInGlobalReplicationGroupMessage,decrease_node_groups_in_global_replication_group_message +DecreaseNodeGroupsInGlobalReplicationGroupResult,decrease_node_groups_in_global_replication_group_result +DecreaseReplicaCountMessage,decrease_replica_count_message +DecreaseReplicaCountResult,decrease_replica_count_result +DecreaseReplicationFactorRequest,decrease_replication_factor_request +DecreaseReplicationFactorResponse,decrease_replication_factor_response +DecreaseStreamRetentionPeriodInput,decrease_stream_retention_period_input +Decrypt,decrypt +DecryptDataInput,decrypt_data_input +DecryptDataOutput,decrypt_data_output +DecryptRequest,decrypt_request +DecryptResponse,decrypt_response +DecryptStepDetails,decrypt_step_details +Decryption,decryption +DecryptionAttributes,decryption_attributes +DecryptionFailure,decryption_failure +DecryptionMode,decryption_mode +DecryptionSettings,decryption_settings +DedicatedHostIds,dedicated_host_ids +DedicatedHostsSupported,dedicated_hosts_supported +DedicatedIp,dedicated_ip +DedicatedIpAutoWarmupEnabled,dedicated_ip_auto_warmup_enabled +DedicatedIpPool,dedicated_ip_pool +DedicatedIpPools,dedicated_ip_pools +DedicatedIps,dedicated_ips +DedicatedMaster,dedicated_master +DedicatedMasterCount,dedicated_master_count +DedicatedMasterEnabled,dedicated_master_enabled +DedicatedMasterType,dedicated_master_type +DedicatedTenancyManagementCidrRange,dedicated_tenancy_management_cidr_range +DedicatedTenancySupport,dedicated_tenancy_support +Default,default +DefaultAction,default_action +DefaultActions,default_actions +DefaultActivity,default_activity +DefaultAdmin,default_admin +DefaultAllocatedStorage,default_allocated_storage +DefaultArguments,default_arguments +DefaultAssociationRouteTable,default_association_route_table +DefaultAuthType,default_auth_type +DefaultAuthenticationMethod,default_authentication_method +DefaultAvailabilityZone,default_availability_zone +DefaultBaseline,default_baseline +DefaultBehavior,default_behavior +DefaultBranchCannotBeDeletedException,default_branch_cannot_be_deleted_exception +DefaultButtonConfiguration,default_button_configuration +DefaultCacheBehavior,default_cache_behavior +DefaultCapacityProviderStrategy,default_capacity_provider_strategy +DefaultCategoricalHyperParameterRange,default_categorical_hyper_parameter_range +DefaultCellWidth,default_cell_width +DefaultCertificateForNewLaunches,default_certificate_for_new_launches +DefaultCharacterSet,default_character_set +DefaultClientBrandingAttributes,default_client_branding_attributes +DefaultClusterParameters,default_cluster_parameters +DefaultCodeRepository,default_code_repository +DefaultCodeRepositoryContains,default_code_repository_contains +DefaultConditionalBranch,default_conditional_branch +DefaultConferenceProviderArn,default_conference_provider_arn +DefaultConfig,default_config +DefaultContent,default_content +DefaultContinuousHyperParameterRange,default_continuous_hyper_parameter_range +DefaultControlPanel,default_control_panel +DefaultCooldown,default_cooldown +DefaultCores,default_cores +DefaultDateColumnName,default_date_column_name +DefaultDetection,default_detection +DefaultDimensionValue,default_dimension_value +DefaultDocumentIdFormat,default_document_id_format +DefaultDomain,default_domain +DefaultEmailCustomizationTemplate,default_email_customization_template +DefaultEmailOption,default_email_option +DefaultEmailTags,default_email_tags +DefaultEncryptionKey,default_encryption_key +DefaultErrorDetails,default_error_details +DefaultExecutorDpuSize,default_executor_dpu_size +DefaultExpirationDays,default_expiration_days +DefaultExportDestination,default_export_destination +DefaultFieldValues,default_field_values +DefaultForAz,default_for_az +DefaultFormatting,default_formatting +DefaultFreeFormLayoutConfiguration,default_free_form_layout_configuration +DefaultGateway,default_gateway +DefaultGid,default_gid +DefaultGridLayoutConfiguration,default_grid_layout_configuration +DefaultHyperParameterRanges,default_hyper_parameter_ranges +DefaultIamRoleArn,default_iam_role_arn +DefaultImportClientBrandingAttributes,default_import_client_branding_attributes +DefaultInstanceName,default_instance_name +DefaultInstanceProfileArn,default_instance_profile_arn +DefaultInstanceWarmup,default_instance_warmup +DefaultIntegerHyperParameterRange,default_integer_hyper_parameter_range +DefaultInteractiveLayoutConfiguration,default_interactive_layout_configuration +DefaultLicense,default_license +DefaultList,default_list +DefaultLists,default_lists +DefaultLogLevel,default_log_level +DefaultMailDomain,default_mail_domain +DefaultMessage,default_message +DefaultMessageType,default_message_type +DefaultNamespace,default_namespace +DefaultNetworkCardIndex,default_network_card_index +DefaultNewSheetConfiguration,default_new_sheet_configuration +DefaultOnly,default_only +DefaultOptionRefId,default_option_ref_id +DefaultOs,default_os +DefaultOu,default_ou +DefaultOutboundQueueId,default_outbound_queue_id +DefaultPaginatedLayoutConfiguration,default_paginated_layout_configuration +DefaultPhoneNumber,default_phone_number +DefaultPort,default_port +DefaultPropagationRouteTable,default_propagation_route_table +DefaultPushNotificationMessage,default_push_notification_message +DefaultPushNotificationTemplate,default_push_notification_template +DefaultRecipes,default_recipes +DefaultRedirectURI,default_redirect_uri +DefaultResourceDiscoveryAssociationId,default_resource_discovery_association_id +DefaultResourceDiscoveryId,default_resource_discovery_id +DefaultResourceSpec,default_resource_spec +DefaultResult,default_result +DefaultRetention,default_retention +DefaultRootDeviceType,default_root_device_type +DefaultRootObject,default_root_object +DefaultRoute,default_route +DefaultRouteInput,default_route_input +DefaultRouteSettings,default_route_settings +DefaultRouteTableAssociation,default_route_table_association +DefaultRouteTablePropagation,default_route_table_propagation +DefaultRunProperties,default_run_properties +DefaultRuntimeContextDevice,default_runtime_context_device +DefaultRuntimeContextDeviceName,default_runtime_context_device_name +DefaultS3Location,default_s3_location +DefaultSectionBasedLayoutConfiguration,default_section_based_layout_configuration +DefaultSecurityGroupNames,default_security_group_names +DefaultSegmentDeliveryConfiguration,default_segment_delivery_configuration +DefaultSelection,default_selection +DefaultSenderId,default_sender_id +DefaultSeriesSettings,default_series_settings +DefaultServerSideEncryption,default_server_side_encryption +DefaultSessionExpiryMinutes,default_session_expiry_minutes +DefaultSizeInspectionLimit,default_size_inspection_limit +DefaultSpaceSettings,default_space_settings +DefaultSshKeyName,default_ssh_key_name +DefaultState,default_state +DefaultStorageClass,default_storage_class +DefaultSubnetId,default_subnet_id +DefaultSubscriptionStatus,default_subscription_status +DefaultSubstitutions,default_substitutions +DefaultTTL,default_ttl +DefaultTags,default_tags +DefaultTargetCapacityType,default_target_capacity_type +DefaultTargetInstance,default_target_instance +DefaultTemplateData,default_template_data +DefaultTheme,default_theme +DefaultThreadsPerCore,default_threads_per_core +DefaultUid,default_uid +DefaultUndefinedFault,default_undefined_fault +DefaultUserAssociatedToUserGroupFault,default_user_associated_to_user_group_fault +DefaultUserRequired,default_user_required +DefaultUserSettings,default_user_settings +DefaultVCpus,default_v_cpus +DefaultValue,default_value +DefaultValueColumn,default_value_column +DefaultValues,default_values +DefaultVersion,default_version +DefaultVersionId,default_version_id +DefaultVersionName,default_version_name +DefaultVersionNumber,default_version_number +DefaultVocabulary,default_vocabulary +DefaultVocabularyList,default_vocabulary_list +DefaultWatchlist,default_watchlist +DefaultWatchlistId,default_watchlist_id +DefaultWorkspaceCreationProperties,default_workspace_creation_properties +Defaults,defaults +DeferActivation,defer_activation +DeferMaintenance,defer_maintenance +DeferMaintenanceDuration,defer_maintenance_duration +DeferMaintenanceEndTime,defer_maintenance_end_time +DeferMaintenanceIdentifier,defer_maintenance_identifier +DeferMaintenanceStartTime,defer_maintenance_start_time +DeferredMaintenanceWindow,deferred_maintenance_window +DeferredMaintenanceWindows,deferred_maintenance_windows +DefineAnalysisSchemeRequest,define_analysis_scheme_request +DefineAnalysisSchemeResponse,define_analysis_scheme_response +DefineAuthChallenge,define_auth_challenge +DefineExpressionRequest,define_expression_request +DefineExpressionResponse,define_expression_response +DefineIndexFieldRequest,define_index_field_request +DefineIndexFieldResponse,define_index_field_response +DefineSegment,define_segment +DefineSuggesterRequest,define_suggester_request +DefineSuggesterResponse,define_suggester_response +Definition,definition +DefinitionArn,definition_arn +DefinitionDocument,definition_document +DefinitionInformation,definition_information +DefinitionName,definition_name +DefinitionTimestamp,definition_timestamp +DefinitionType,definition_type +Definitions,definitions +Degraded,degraded +Deinterlacer,deinterlacer +Delay,delay +DelaySeconds,delay_seconds +DelayUntilElbConnectionsDrained,delay_until_elb_connections_drained +Delegate,delegate +DelegatedAdmin,delegated_admin +DelegatedAdminAccount,delegated_admin_account +DelegatedAdminAccountId,delegated_admin_account_id +DelegatedAdminAccountLimitExceededException,delegated_admin_account_limit_exceeded_exception +DelegatedAdministrator,delegated_administrator +DelegatedAdministrators,delegated_administrators +DelegatedService,delegated_service +DelegatedServices,delegated_services +Delegates,delegates +Delegation,delegation +DelegationEnabledDate,delegation_enabled_date +DelegationMetadata,delegation_metadata +DelegationSet,delegation_set +DelegationSetAlreadyCreated,delegation_set_already_created +DelegationSetAlreadyReusable,delegation_set_already_reusable +DelegationSetId,delegation_set_id +DelegationSetInUse,delegation_set_in_use +DelegationSetNotAvailable,delegation_set_not_available +DelegationSetNotReusable,delegation_set_not_reusable +DelegationSets,delegation_sets +DelegationTime,delegation_time +Delete,delete +DeleteACLRequest,delete_acl_request +DeleteACLResponse,delete_acl_response +DeleteAcceleratorRequest,delete_accelerator_request +DeleteAccessControlConfigurationRequest,delete_access_control_configuration_request +DeleteAccessControlRuleRequest,delete_access_control_rule_request +DeleteAccessKeyRequest,delete_access_key_request +DeleteAccessLogSettingsRequest,delete_access_log_settings_request +DeleteAccessLogSubscriptionRequest,delete_access_log_subscription_request +DeleteAccessPointForObjectLambdaRequest,delete_access_point_for_object_lambda_request +DeleteAccessPointInput,delete_access_point_input +DeleteAccessPointPolicyForObjectLambdaRequest,delete_access_point_policy_for_object_lambda_request +DeleteAccessPointPolicyRequest,delete_access_point_policy_request +DeleteAccessPointRequest,delete_access_point_request +DeleteAccessPolicyRequest,delete_access_policy_request +DeleteAccessRequest,delete_access_request +DeleteAccessTokenRequest,delete_access_token_request +DeleteAccessorInput,delete_accessor_input +DeleteAccountAliasRequest,delete_account_alias_request +DeleteAccountAssignmentRequest,delete_account_assignment_request +DeleteAccountAssignmentResponse,delete_account_assignment_response +DeleteAccountAuditConfigurationRequest,delete_account_audit_configuration_request +DeleteAccountCustomizationRequest,delete_account_customization_request +DeleteAccountCustomizationResponse,delete_account_customization_response +DeleteAccountPolicyRequest,delete_account_policy_request +DeleteAccountRequest,delete_account_request +DeleteAccountSettingRequest,delete_account_setting_request +DeleteAccountSettingResponse,delete_account_setting_response +DeleteAccountSubscriptionRequest,delete_account_subscription_request +DeleteAccountSubscriptionResponse,delete_account_subscription_response +DeleteActionRequest,delete_action_request +DeleteActionResponse,delete_action_response +DeleteActionTargetRequest,delete_action_target_request +DeleteActionTargetResponse,delete_action_target_response +DeleteActivationRequest,delete_activation_request +DeleteActivityInput,delete_activity_input +DeleteAddonRequest,delete_addon_request +DeleteAddonResponse,delete_addon_response +DeleteAddressBookRequest,delete_address_book_request +DeleteAdmChannelRequest,delete_adm_channel_request +DeleteAdmChannelResponse,delete_adm_channel_response +DeleteAfterDays,delete_after_days +DeleteAfterUpload,delete_after_upload +DeleteAgentRequest,delete_agent_request +DeleteAggregationAuthorizationRequest,delete_aggregation_authorization_request +DeleteAgreementRequest,delete_agreement_request +DeleteAlarmModelRequest,delete_alarm_model_request +DeleteAlarmRequest,delete_alarm_request +DeleteAlarmResult,delete_alarm_result +DeleteAlarmsInput,delete_alarms_input +DeleteAlertManagerDefinitionRequest,delete_alert_manager_definition_request +DeleteAlertRequest,delete_alert_request +DeleteAlgorithmInput,delete_algorithm_input +DeleteAliasInput,delete_alias_input +DeleteAliasRequest,delete_alias_request +DeleteAll,delete_all +DeleteAllPolicyResources,delete_all_policy_resources +DeleteAllRevisions,delete_all_revisions +DeleteAllowListRequest,delete_allow_list_request +DeleteAlternateContactRequest,delete_alternate_contact_request +DeleteAnalysisRequest,delete_analysis_request +DeleteAnalysisResponse,delete_analysis_response +DeleteAnalysisSchemeRequest,delete_analysis_scheme_request +DeleteAnalysisSchemeResponse,delete_analysis_scheme_response +DeleteAnalysisTemplateInput,delete_analysis_template_input +DeleteAnalyzerRequest,delete_analyzer_request +DeleteAnnotationStoreRequest,delete_annotation_store_request +DeleteAnnotationStoreResponse,delete_annotation_store_response +DeleteAnnotationStoreVersionsRequest,delete_annotation_store_versions_request +DeleteAnnotationStoreVersionsResponse,delete_annotation_store_versions_response +DeleteAnomalyDetectorInput,delete_anomaly_detector_input +DeleteAnomalyDetectorRequest,delete_anomaly_detector_request +DeleteAnomalyMonitorRequest,delete_anomaly_monitor_request +DeleteAnomalySubscriptionRequest,delete_anomaly_subscription_request +DeleteApiCacheRequest,delete_api_cache_request +DeleteApiDestinationRequest,delete_api_destination_request +DeleteApiKeyRequest,delete_api_key_request +DeleteApiMappingRequest,delete_api_mapping_request +DeleteApiRequest,delete_api_request +DeleteApnsChannelRequest,delete_apns_channel_request +DeleteApnsChannelResponse,delete_apns_channel_response +DeleteApnsSandboxChannelRequest,delete_apns_sandbox_channel_request +DeleteApnsSandboxChannelResponse,delete_apns_sandbox_channel_response +DeleteApnsVoipChannelRequest,delete_apns_voip_channel_request +DeleteApnsVoipChannelResponse,delete_apns_voip_channel_response +DeleteApnsVoipSandboxChannelRequest,delete_apns_voip_sandbox_channel_request +DeleteApnsVoipSandboxChannelResponse,delete_apns_voip_sandbox_channel_response +DeleteAppAssessmentRequest,delete_app_assessment_request +DeleteAppAssessmentResponse,delete_app_assessment_response +DeleteAppAuthorizationRequest,delete_app_authorization_request +DeleteAppBlockBuilderRequest,delete_app_block_builder_request +DeleteAppBlockRequest,delete_app_block_request +DeleteAppBundleRequest,delete_app_bundle_request +DeleteAppImageConfigRequest,delete_app_image_config_request +DeleteAppInput,delete_app_input +DeleteAppInputSourceRequest,delete_app_input_source_request +DeleteAppInputSourceResponse,delete_app_input_source_response +DeleteAppInstanceAdminRequest,delete_app_instance_admin_request +DeleteAppInstanceBotRequest,delete_app_instance_bot_request +DeleteAppInstanceRequest,delete_app_instance_request +DeleteAppInstanceStreamingConfigurationsRequest,delete_app_instance_streaming_configurations_request +DeleteAppInstanceUserRequest,delete_app_instance_user_request +DeleteAppLaunchConfigurationRequest,delete_app_launch_configuration_request +DeleteAppMonitorRequest,delete_app_monitor_request +DeleteAppReplicationConfigurationRequest,delete_app_replication_configuration_request +DeleteAppRequest,delete_app_request +DeleteAppResponse,delete_app_response +DeleteAppResult,delete_app_result +DeleteAppValidationConfigurationRequest,delete_app_validation_configuration_request +DeleteAppVersionAppComponentRequest,delete_app_version_app_component_request +DeleteAppVersionAppComponentResponse,delete_app_version_app_component_response +DeleteAppVersionResourceRequest,delete_app_version_resource_request +DeleteAppVersionResourceResponse,delete_app_version_resource_response +DeleteApplicationCloudWatchLoggingOptionRequest,delete_application_cloud_watch_logging_option_request +DeleteApplicationCloudWatchLoggingOptionResponse,delete_application_cloud_watch_logging_option_response +DeleteApplicationFromEnvironmentRequest,delete_application_from_environment_request +DeleteApplicationInput,delete_application_input +DeleteApplicationInputProcessingConfigurationRequest,delete_application_input_processing_configuration_request +DeleteApplicationInputProcessingConfigurationResponse,delete_application_input_processing_configuration_response +DeleteApplicationMessage,delete_application_message +DeleteApplicationOutputRequest,delete_application_output_request +DeleteApplicationOutputResponse,delete_application_output_response +DeleteApplicationReferenceDataSourceRequest,delete_application_reference_data_source_request +DeleteApplicationReferenceDataSourceResponse,delete_application_reference_data_source_response +DeleteApplicationRequest,delete_application_request +DeleteApplicationResponse,delete_application_response +DeleteApplicationSnapshotRequest,delete_application_snapshot_request +DeleteApplicationVersionMessage,delete_application_version_message +DeleteApplicationVpcConfigurationRequest,delete_application_vpc_configuration_request +DeleteApplicationVpcConfigurationResponse,delete_application_vpc_configuration_response +DeleteApplicationsRequest,delete_applications_request +DeleteApprovalRuleTemplateInput,delete_approval_rule_template_input +DeleteApprovalRuleTemplateOutput,delete_approval_rule_template_output +DeleteAppsListRequest,delete_apps_list_request +DeleteArchiveInput,delete_archive_input +DeleteArchiveRequest,delete_archive_request +DeleteArchiveRuleRequest,delete_archive_rule_request +DeleteArguments,delete_arguments +DeleteArtifactRequest,delete_artifact_request +DeleteArtifactResponse,delete_artifact_response +DeleteAssessmentFrameworkRequest,delete_assessment_framework_request +DeleteAssessmentFrameworkShareRequest,delete_assessment_framework_share_request +DeleteAssessmentReportRequest,delete_assessment_report_request +DeleteAssessmentRequest,delete_assessment_request +DeleteAssessmentRunRequest,delete_assessment_run_request +DeleteAssessmentTargetRequest,delete_assessment_target_request +DeleteAssessmentTemplateRequest,delete_assessment_template_request +DeleteAssetModelRequest,delete_asset_model_request +DeleteAssetModelResponse,delete_asset_model_response +DeleteAssetRequest,delete_asset_request +DeleteAssetResponse,delete_asset_response +DeleteAssistantAssociationRequest,delete_assistant_association_request +DeleteAssistantRequest,delete_assistant_request +DeleteAssociatedConditionalForwarder,delete_associated_conditional_forwarder +DeleteAssociationRequest,delete_association_request +DeleteAssociationResponse,delete_association_response +DeleteAt,delete_at +DeleteAttachmentRequest,delete_attachment_request +DeleteAttachmentResponse,delete_attachment_response +DeleteAttendeeRequest,delete_attendee_request +DeleteAttributeGroupRequest,delete_attribute_group_request +DeleteAttributeGroupResponse,delete_attribute_group_response +DeleteAttributesRequest,delete_attributes_request +DeleteAttributesResponse,delete_attributes_response +DeleteAuditSuppressionRequest,delete_audit_suppression_request +DeleteAuthPolicyRequest,delete_auth_policy_request +DeleteAuthenticationProfileMessage,delete_authentication_profile_message +DeleteAuthenticationProfileResult,delete_authentication_profile_result +DeleteAuthorizerRequest,delete_authorizer_request +DeleteAutoScalingConfigurationRequest,delete_auto_scaling_configuration_request +DeleteAutoScalingConfigurationResponse,delete_auto_scaling_configuration_response +DeleteAutoScalingGroupType,delete_auto_scaling_group_type +DeleteAutoSnapshotRequest,delete_auto_snapshot_request +DeleteAutoSnapshotResult,delete_auto_snapshot_result +DeleteAutomatedBackups,delete_automated_backups +DeleteAutomaticTapeCreationPolicyInput,delete_automatic_tape_creation_policy_input +DeleteAutomaticTapeCreationPolicyOutput,delete_automatic_tape_creation_policy_output +DeleteAvailabilityConfigurationRequest,delete_availability_configuration_request +DeleteAwsLogSourceRequest,delete_aws_log_source_request +DeleteAwsLogSourceResponse,delete_aws_log_source_response +DeleteBGPPeerRequest,delete_bgp_peer_request +DeleteBGPPeerResponse,delete_bgp_peer_response +DeleteBackendAPIRequest,delete_backend_api_request +DeleteBackendAPIResponse,delete_backend_api_response +DeleteBackendAuthRequest,delete_backend_auth_request +DeleteBackendAuthResponse,delete_backend_auth_response +DeleteBackendEnvironmentRequest,delete_backend_environment_request +DeleteBackendEnvironmentResult,delete_backend_environment_result +DeleteBackendRequest,delete_backend_request +DeleteBackendResponse,delete_backend_response +DeleteBackendStorageRequest,delete_backend_storage_request +DeleteBackendStorageResponse,delete_backend_storage_response +DeleteBackupInput,delete_backup_input +DeleteBackupOutput,delete_backup_output +DeleteBackupPlanInput,delete_backup_plan_input +DeleteBackupPlanOutput,delete_backup_plan_output +DeleteBackupRequest,delete_backup_request +DeleteBackupResponse,delete_backup_response +DeleteBackupSelectionInput,delete_backup_selection_input +DeleteBackupVaultAccessPolicyInput,delete_backup_vault_access_policy_input +DeleteBackupVaultInput,delete_backup_vault_input +DeleteBackupVaultLockConfigurationInput,delete_backup_vault_lock_configuration_input +DeleteBackupVaultNotificationsInput,delete_backup_vault_notifications_input +DeleteBaiduChannelRequest,delete_baidu_channel_request +DeleteBaiduChannelResponse,delete_baidu_channel_response +DeleteBandwidthRateLimitInput,delete_bandwidth_rate_limit_input +DeleteBandwidthRateLimitOutput,delete_bandwidth_rate_limit_output +DeleteBasePathMappingRequest,delete_base_path_mapping_request +DeleteBatchImportJobRequest,delete_batch_import_job_request +DeleteBatchPredictionInput,delete_batch_prediction_input +DeleteBatchPredictionJobRequest,delete_batch_prediction_job_request +DeleteBatchPredictionOutput,delete_batch_prediction_output +DeleteBehavior,delete_behavior +DeleteBillingGroupInput,delete_billing_group_input +DeleteBillingGroupOutput,delete_billing_group_output +DeleteBillingGroupRequest,delete_billing_group_request +DeleteBlueGreenDeploymentRequest,delete_blue_green_deployment_request +DeleteBlueGreenDeploymentResponse,delete_blue_green_deployment_response +DeleteBlueprintRequest,delete_blueprint_request +DeleteBlueprintResponse,delete_blueprint_response +DeleteBotAliasRequest,delete_bot_alias_request +DeleteBotAliasResponse,delete_bot_alias_response +DeleteBotChannelAssociationRequest,delete_bot_channel_association_request +DeleteBotLocaleRequest,delete_bot_locale_request +DeleteBotLocaleResponse,delete_bot_locale_response +DeleteBotRequest,delete_bot_request +DeleteBotResponse,delete_bot_response +DeleteBotVersionRequest,delete_bot_version_request +DeleteBotVersionResponse,delete_bot_version_response +DeleteBranchInput,delete_branch_input +DeleteBranchOutput,delete_branch_output +DeleteBranchRequest,delete_branch_request +DeleteBranchResult,delete_branch_result +DeleteBridgeRequest,delete_bridge_request +DeleteBridgeResponse,delete_bridge_response +DeleteBrokerRequest,delete_broker_request +DeleteBrokerResponse,delete_broker_response +DeleteBrowserSettingsRequest,delete_browser_settings_request +DeleteBucketAccessKeyRequest,delete_bucket_access_key_request +DeleteBucketAccessKeyResult,delete_bucket_access_key_result +DeleteBucketAnalyticsConfigurationRequest,delete_bucket_analytics_configuration_request +DeleteBucketCorsRequest,delete_bucket_cors_request +DeleteBucketEncryptionRequest,delete_bucket_encryption_request +DeleteBucketIntelligentTieringConfigurationRequest,delete_bucket_intelligent_tiering_configuration_request +DeleteBucketInventoryConfigurationRequest,delete_bucket_inventory_configuration_request +DeleteBucketLifecycleConfigurationRequest,delete_bucket_lifecycle_configuration_request +DeleteBucketLifecycleRequest,delete_bucket_lifecycle_request +DeleteBucketMetricsConfigurationRequest,delete_bucket_metrics_configuration_request +DeleteBucketOwnershipControlsRequest,delete_bucket_ownership_controls_request +DeleteBucketPolicyRequest,delete_bucket_policy_request +DeleteBucketReplicationRequest,delete_bucket_replication_request +DeleteBucketRequest,delete_bucket_request +DeleteBucketResult,delete_bucket_result +DeleteBucketTaggingRequest,delete_bucket_tagging_request +DeleteBucketWebsiteRequest,delete_bucket_website_request +DeleteBudgetActionRequest,delete_budget_action_request +DeleteBudgetActionResponse,delete_budget_action_response +DeleteBudgetRequest,delete_budget_request +DeleteBuildBatchInput,delete_build_batch_input +DeleteBuildBatchOutput,delete_build_batch_output +DeleteBuildInput,delete_build_input +DeleteBusinessReportScheduleRequest,delete_business_report_schedule_request +DeleteByteMatchSetRequest,delete_byte_match_set_request +DeleteByteMatchSetResponse,delete_byte_match_set_response +DeleteCACertificateRequest,delete_ca_certificate_request +DeleteCacheClusterMessage,delete_cache_cluster_message +DeleteCacheClusterResult,delete_cache_cluster_result +DeleteCacheParameterGroupMessage,delete_cache_parameter_group_message +DeleteCachePolicyRequest,delete_cache_policy_request +DeleteCacheSecurityGroupMessage,delete_cache_security_group_message +DeleteCacheSubnetGroupMessage,delete_cache_subnet_group_message +DeleteCalculatedAttributeDefinitionRequest,delete_calculated_attribute_definition_request +DeleteCallAnalyticsCategoryRequest,delete_call_analytics_category_request +DeleteCallAnalyticsJobRequest,delete_call_analytics_job_request +DeleteCampaignRequest,delete_campaign_request +DeleteCampaignResponse,delete_campaign_response +DeleteCanaryRequest,delete_canary_request +DeleteCapacityProviderRequest,delete_capacity_provider_request +DeleteCapacityProviderResponse,delete_capacity_provider_response +DeleteCapacityReservationInput,delete_capacity_reservation_input +DeleteCarrierGatewayRequest,delete_carrier_gateway_request +DeleteCarrierGatewayResult,delete_carrier_gateway_result +DeleteCellRequest,delete_cell_request +DeleteCertificateAuthorityRequest,delete_certificate_authority_request +DeleteCertificateMessage,delete_certificate_message +DeleteCertificateRequest,delete_certificate_request +DeleteCertificateResponse,delete_certificate_response +DeleteCertificateResult,delete_certificate_result +DeleteChangeSetInput,delete_change_set_input +DeleteChannelBanRequest,delete_channel_ban_request +DeleteChannelFlowRequest,delete_channel_flow_request +DeleteChannelGroupRequest,delete_channel_group_request +DeleteChannelMembershipRequest,delete_channel_membership_request +DeleteChannelMessageRequest,delete_channel_message_request +DeleteChannelModeratorRequest,delete_channel_moderator_request +DeleteChannelPolicyRequest,delete_channel_policy_request +DeleteChannelRequest,delete_channel_request +DeleteChannelResponse,delete_channel_response +DeleteChapCredentialsInput,delete_chap_credentials_input +DeleteChapCredentialsOutput,delete_chap_credentials_output +DeleteCidrCollectionRequest,delete_cidr_collection_request +DeleteClassifierRequest,delete_classifier_request +DeleteClientBrandingRequest,delete_client_branding_request +DeleteClientCertificateRequest,delete_client_certificate_request +DeleteClientVpnEndpointRequest,delete_client_vpn_endpoint_request +DeleteClientVpnEndpointResult,delete_client_vpn_endpoint_result +DeleteClientVpnRouteRequest,delete_client_vpn_route_request +DeleteClientVpnRouteResult,delete_client_vpn_route_result +DeleteClonedVolumes,delete_cloned_volumes +DeleteCloudFrontOriginAccessIdentityRequest,delete_cloud_front_origin_access_identity_request +DeleteClusterInput,delete_cluster_input +DeleteClusterMessage,delete_cluster_message +DeleteClusterOutput,delete_cluster_output +DeleteClusterParameterGroupMessage,delete_cluster_parameter_group_message +DeleteClusterPolicyRequest,delete_cluster_policy_request +DeleteClusterRequest,delete_cluster_request +DeleteClusterResponse,delete_cluster_response +DeleteClusterResult,delete_cluster_result +DeleteClusterSecurityGroupMessage,delete_cluster_security_group_message +DeleteClusterSnapshotInput,delete_cluster_snapshot_input +DeleteClusterSnapshotMessage,delete_cluster_snapshot_message +DeleteClusterSnapshotOutput,delete_cluster_snapshot_output +DeleteClusterSnapshotResult,delete_cluster_snapshot_result +DeleteClusterSubnetGroupMessage,delete_cluster_subnet_group_message +DeleteCodeRepositoryInput,delete_code_repository_input +DeleteCodeSigningConfigRequest,delete_code_signing_config_request +DeleteCoipCidrRequest,delete_coip_cidr_request +DeleteCoipCidrResult,delete_coip_cidr_result +DeleteCoipPoolRequest,delete_coip_pool_request +DeleteCoipPoolResult,delete_coip_pool_result +DeleteCollaborationInput,delete_collaboration_input +DeleteCollectionDetail,delete_collection_detail +DeleteCollectionRequest,delete_collection_request +DeleteCollectionResponse,delete_collection_response +DeleteCollectorRequest,delete_collector_request +DeleteColumnStatisticsForPartitionRequest,delete_column_statistics_for_partition_request +DeleteColumnStatisticsForTableRequest,delete_column_statistics_for_table_request +DeleteCommentContentInput,delete_comment_content_input +DeleteCommentContentOutput,delete_comment_content_output +DeleteCommentRequest,delete_comment_request +DeleteComponentInput,delete_component_input +DeleteComponentOutput,delete_component_output +DeleteComponentRequest,delete_component_request +DeleteComponentResponse,delete_component_response +DeleteComponentTypeRequest,delete_component_type_request +DeleteComponentTypeResponse,delete_component_type_response +DeleteComputeEnvironmentRequest,delete_compute_environment_request +DeleteConditionalForwarderRequest,delete_conditional_forwarder_request +DeleteConferenceProviderRequest,delete_conference_provider_request +DeleteConfigRequest,delete_config_request +DeleteConfigRuleRequest,delete_config_rule_request +DeleteConfigurationAggregatorRequest,delete_configuration_aggregator_request +DeleteConfigurationProfileRequest,delete_configuration_profile_request +DeleteConfigurationRecorderRequest,delete_configuration_recorder_request +DeleteConfigurationRequest,delete_configuration_request +DeleteConfigurationResponse,delete_configuration_response +DeleteConfigurationSetEventDestinationRequest,delete_configuration_set_event_destination_request +DeleteConfigurationSetRequest,delete_configuration_set_request +DeleteConfigurationSetResult,delete_configuration_set_result +DeleteConfigurationSetTrackingOptionsRequest,delete_configuration_set_tracking_options_request +DeleteConfigurationTemplateMessage,delete_configuration_template_message +DeleteConfiguredTableAnalysisRuleInput,delete_configured_table_analysis_rule_input +DeleteConfiguredTableAssociationInput,delete_configured_table_association_input +DeleteConfiguredTableInput,delete_configured_table_input +DeleteConflictException,delete_conflict_exception +DeleteConformancePackRequest,delete_conformance_pack_request +DeleteConnectClientAddInRequest,delete_connect_client_add_in_request +DeleteConnectInstanceConfigRequest,delete_connect_instance_config_request +DeleteConnectPeerRequest,delete_connect_peer_request +DeleteConnectPeerResponse,delete_connect_peer_response +DeleteConnectionAliasRequest,delete_connection_alias_request +DeleteConnectionInput,delete_connection_input +DeleteConnectionMessage,delete_connection_message +DeleteConnectionRequest,delete_connection_request +DeleteConnectionResponse,delete_connection_response +DeleteConnectorDefinitionRequest,delete_connector_definition_request +DeleteConnectorProfileRequest,delete_connector_profile_request +DeleteConnectorRequest,delete_connector_request +DeleteConnectorResponse,delete_connector_response +DeleteConstraintInput,delete_constraint_input +DeleteContactChannelRequest,delete_contact_channel_request +DeleteContactEvaluationRequest,delete_contact_evaluation_request +DeleteContactFlowModuleRequest,delete_contact_flow_module_request +DeleteContactFlowRequest,delete_contact_flow_request +DeleteContactListRequest,delete_contact_list_request +DeleteContactMethodRequest,delete_contact_method_request +DeleteContactMethodResult,delete_contact_method_result +DeleteContactRequest,delete_contact_request +DeleteContainerImageRequest,delete_container_image_request +DeleteContainerInput,delete_container_input +DeleteContainerPolicyInput,delete_container_policy_input +DeleteContainerRecipeRequest,delete_container_recipe_request +DeleteContainerRecipeResponse,delete_container_recipe_response +DeleteContainerServiceRequest,delete_container_service_request +DeleteContentRequest,delete_content_request +DeleteContextRequest,delete_context_request +DeleteContextResponse,delete_context_response +DeleteContinuousDeploymentPolicyRequest,delete_continuous_deployment_policy_request +DeleteControlPanelRequest,delete_control_panel_request +DeleteControlRequest,delete_control_request +DeleteCoreDefinitionRequest,delete_core_definition_request +DeleteCoreDeviceRequest,delete_core_device_request +DeleteCoreNetworkPolicyVersionRequest,delete_core_network_policy_version_request +DeleteCoreNetworkPolicyVersionResponse,delete_core_network_policy_version_response +DeleteCoreNetworkRequest,delete_core_network_request +DeleteCoreNetworkResponse,delete_core_network_response +DeleteCorsConfigurationRequest,delete_cors_configuration_request +DeleteCorsPolicyInput,delete_cors_policy_input +DeleteCostCategoryDefinitionRequest,delete_cost_category_definition_request +DeleteCostCategoryDefinitionResponse,delete_cost_category_definition_response +DeleteCrawlerRequest,delete_crawler_request +DeleteCrossAccountAuthorizationRequest,delete_cross_account_authorization_request +DeleteCustomActionTypeInput,delete_custom_action_type_input +DeleteCustomDBEngineVersionMessage,delete_custom_db_engine_version_message +DeleteCustomDataIdentifierRequest,delete_custom_data_identifier_request +DeleteCustomDomainAssociationMessage,delete_custom_domain_association_message +DeleteCustomEntityTypeRequest,delete_custom_entity_type_request +DeleteCustomEntityTypeResponse,delete_custom_entity_type_response +DeleteCustomKeyStoreRequest,delete_custom_key_store_request +DeleteCustomLineItemInput,delete_custom_line_item_input +DeleteCustomLineItemOutput,delete_custom_line_item_output +DeleteCustomLogSourceRequest,delete_custom_log_source_request +DeleteCustomMetadataRequest,delete_custom_metadata_request +DeleteCustomMetricRequest,delete_custom_metric_request +DeleteCustomModelRequest,delete_custom_model_request +DeleteCustomPluginRequest,delete_custom_plugin_request +DeleteCustomPluginResponse,delete_custom_plugin_response +DeleteCustomRoutingAcceleratorRequest,delete_custom_routing_accelerator_request +DeleteCustomRoutingEndpointGroupRequest,delete_custom_routing_endpoint_group_request +DeleteCustomRoutingListenerRequest,delete_custom_routing_listener_request +DeleteCustomVerificationEmailTemplateRequest,delete_custom_verification_email_template_request +DeleteCustomVocabularyRequest,delete_custom_vocabulary_request +DeleteCustomVocabularyResponse,delete_custom_vocabulary_response +DeleteCustomerGatewayRequest,delete_customer_gateway_request +DeleteDBClusterAutomatedBackupMessage,delete_db_cluster_automated_backup_message +DeleteDBClusterAutomatedBackupResult,delete_db_cluster_automated_backup_result +DeleteDBClusterEndpointMessage,delete_db_cluster_endpoint_message +DeleteDBClusterEndpointOutput,delete_db_cluster_endpoint_output +DeleteDBClusterMessage,delete_db_cluster_message +DeleteDBClusterParameterGroupMessage,delete_db_cluster_parameter_group_message +DeleteDBClusterResult,delete_db_cluster_result +DeleteDBClusterSnapshotMessage,delete_db_cluster_snapshot_message +DeleteDBClusterSnapshotResult,delete_db_cluster_snapshot_result +DeleteDBInstanceAutomatedBackupMessage,delete_db_instance_automated_backup_message +DeleteDBInstanceAutomatedBackupResult,delete_db_instance_automated_backup_result +DeleteDBInstanceMessage,delete_db_instance_message +DeleteDBInstanceResult,delete_db_instance_result +DeleteDBParameterGroupMessage,delete_db_parameter_group_message +DeleteDBProxyEndpointRequest,delete_db_proxy_endpoint_request +DeleteDBProxyEndpointResponse,delete_db_proxy_endpoint_response +DeleteDBProxyRequest,delete_db_proxy_request +DeleteDBProxyResponse,delete_db_proxy_response +DeleteDBSecurityGroupMessage,delete_db_security_group_message +DeleteDBSnapshotMessage,delete_db_snapshot_message +DeleteDBSnapshotResult,delete_db_snapshot_result +DeleteDBSubnetGroupMessage,delete_db_subnet_group_message +DeleteDashboardRequest,delete_dashboard_request +DeleteDashboardResponse,delete_dashboard_response +DeleteDashboardsInput,delete_dashboards_input +DeleteDataCatalogInput,delete_data_catalog_input +DeleteDataCellsFilterRequest,delete_data_cells_filter_request +DeleteDataInFileSystem,delete_data_in_file_system +DeleteDataIntegrationRequest,delete_data_integration_request +DeleteDataLakeOrganizationConfigurationRequest,delete_data_lake_organization_configuration_request +DeleteDataLakeRequest,delete_data_lake_request +DeleteDataProtectionPolicyRequest,delete_data_protection_policy_request +DeleteDataProviderMessage,delete_data_provider_message +DeleteDataProviderResponse,delete_data_provider_response +DeleteDataQualityJobDefinitionRequest,delete_data_quality_job_definition_request +DeleteDataQualityRulesetRequest,delete_data_quality_ruleset_request +DeleteDataRepositoryAssociationRequest,delete_data_repository_association_request +DeleteDataRepositoryAssociationResponse,delete_data_repository_association_response +DeleteDataSetRefreshPropertiesRequest,delete_data_set_refresh_properties_request +DeleteDataSetRefreshPropertiesResponse,delete_data_set_refresh_properties_response +DeleteDataSetRequest,delete_data_set_request +DeleteDataSetResponse,delete_data_set_response +DeleteDataSourceInput,delete_data_source_input +DeleteDataSourceOutput,delete_data_source_output +DeleteDataSourceRequest,delete_data_source_request +DeleteDataSourceResponse,delete_data_source_response +DeleteDatabaseRequest,delete_database_request +DeleteDataflowEndpointGroupRequest,delete_dataflow_endpoint_group_request +DeleteDatasetContentRequest,delete_dataset_content_request +DeleteDatasetGroupRequest,delete_dataset_group_request +DeleteDatasetImportJobRequest,delete_dataset_import_job_request +DeleteDatasetRequest,delete_dataset_request +DeleteDatasetResponse,delete_dataset_response +DeleteDatastoreRequest,delete_datastore_request +DeleteDatastoreResponse,delete_datastore_response +DeleteDecoderManifestRequest,delete_decoder_manifest_request +DeleteDecoderManifestResponse,delete_decoder_manifest_response +DeleteDedicatedIpPoolRequest,delete_dedicated_ip_pool_request +DeleteDefaultMessageTypeRequest,delete_default_message_type_request +DeleteDefaultMessageTypeResult,delete_default_message_type_result +DeleteDefaultSenderIdRequest,delete_default_sender_id_request +DeleteDefaultSenderIdResult,delete_default_sender_id_result +DeleteDeliveryChannelRequest,delete_delivery_channel_request +DeleteDeliveryStreamInput,delete_delivery_stream_input +DeleteDeploymentConfigInput,delete_deployment_config_input +DeleteDeploymentGroupInput,delete_deployment_group_input +DeleteDeploymentGroupOutput,delete_deployment_group_output +DeleteDeploymentInput,delete_deployment_input +DeleteDeploymentOutput,delete_deployment_output +DeleteDeploymentRequest,delete_deployment_request +DeleteDeploymentStrategyRequest,delete_deployment_strategy_request +DeleteDestinationRequest,delete_destination_request +DeleteDetectorModelRequest,delete_detector_model_request +DeleteDetectorRequest,delete_detector_request +DeleteDetectorVersionRequest,delete_detector_version_request +DeleteDevEndpointRequest,delete_dev_endpoint_request +DeleteDevEnvironmentRequest,delete_dev_environment_request +DeleteDevEnvironmentResponse,delete_dev_environment_response +DeleteDeviceDefinitionRequest,delete_device_definition_request +DeleteDeviceFleetRequest,delete_device_fleet_request +DeleteDevicePoolRequest,delete_device_pool_request +DeleteDeviceProfileRequest,delete_device_profile_request +DeleteDeviceRequest,delete_device_request +DeleteDeviceResponse,delete_device_response +DeleteDeviceUsageDataRequest,delete_device_usage_data_request +DeleteDhcpOptionsRequest,delete_dhcp_options_request +DeleteDimensionRequest,delete_dimension_request +DeleteDirectConnectGatewayAssociationProposalRequest,delete_direct_connect_gateway_association_proposal_request +DeleteDirectConnectGatewayAssociationProposalResult,delete_direct_connect_gateway_association_proposal_result +DeleteDirectConnectGatewayAssociationRequest,delete_direct_connect_gateway_association_request +DeleteDirectConnectGatewayAssociationResult,delete_direct_connect_gateway_association_result +DeleteDirectConnectGatewayRequest,delete_direct_connect_gateway_request +DeleteDirectConnectGatewayResult,delete_direct_connect_gateway_result +DeleteDirectory,delete_directory +DeleteDirectoryConfigRequest,delete_directory_config_request +DeleteDirectoryRegistrationRequest,delete_directory_registration_request +DeleteDirectoryRequest,delete_directory_request +DeleteDirectoryResponse,delete_directory_response +DeleteDirectoryResult,delete_directory_result +DeleteDiscovererRequest,delete_discoverer_request +DeleteDiskRequest,delete_disk_request +DeleteDiskResult,delete_disk_result +DeleteDiskSnapshotRequest,delete_disk_snapshot_request +DeleteDiskSnapshotResult,delete_disk_snapshot_result +DeleteDistributionConfigurationRequest,delete_distribution_configuration_request +DeleteDistributionConfigurationResponse,delete_distribution_configuration_response +DeleteDistributionRequest,delete_distribution_request +DeleteDistributionResult,delete_distribution_result +DeleteDocumentClassifierRequest,delete_document_classifier_request +DeleteDocumentRequest,delete_document_request +DeleteDocumentVersionRequest,delete_document_version_request +DeleteDocumentationPartRequest,delete_documentation_part_request +DeleteDocumentationVersionRequest,delete_documentation_version_request +DeleteDomainAssociationRequest,delete_domain_association_request +DeleteDomainAssociationResult,delete_domain_association_result +DeleteDomainConfigurationRequest,delete_domain_configuration_request +DeleteDomainEntryRequest,delete_domain_entry_request +DeleteDomainEntryResult,delete_domain_entry_result +DeleteDomainNameRequest,delete_domain_name_request +DeleteDomainPermissionsPolicyRequest,delete_domain_permissions_policy_request +DeleteDomainPermissionsPolicyResult,delete_domain_permissions_policy_result +DeleteDomainRequest,delete_domain_request +DeleteDomainResponse,delete_domain_response +DeleteDomainResult,delete_domain_result +DeleteDynamicThingGroupRequest,delete_dynamic_thing_group_request +DeleteEarthObservationJobInput,delete_earth_observation_job_input +DeleteEdgeConfigurationInput,delete_edge_configuration_input +DeleteEdgeDeploymentPlanRequest,delete_edge_deployment_plan_request +DeleteEdgeDeploymentStageRequest,delete_edge_deployment_stage_request +DeleteEgressOnlyInternetGatewayRequest,delete_egress_only_internet_gateway_request +DeleteEgressOnlyInternetGatewayResult,delete_egress_only_internet_gateway_result +DeleteElasticIp,delete_elastic_ip +DeleteElasticsearchDomainRequest,delete_elasticsearch_domain_request +DeleteElasticsearchDomainResponse,delete_elasticsearch_domain_response +DeleteEmailChannelRequest,delete_email_channel_request +DeleteEmailChannelResponse,delete_email_channel_response +DeleteEmailIdentityPolicyRequest,delete_email_identity_policy_request +DeleteEmailIdentityRequest,delete_email_identity_request +DeleteEmailMonitoringConfigurationRequest,delete_email_monitoring_configuration_request +DeleteEmailTemplateRequest,delete_email_template_request +DeleteEmailTemplateResponse,delete_email_template_response +DeleteEndpointAccessMessage,delete_endpoint_access_message +DeleteEndpointAccessRequest,delete_endpoint_access_request +DeleteEndpointAccessResponse,delete_endpoint_access_response +DeleteEndpointConfigInput,delete_endpoint_config_input +DeleteEndpointGroupRequest,delete_endpoint_group_request +DeleteEndpointInput,delete_endpoint_input +DeleteEndpointMessage,delete_endpoint_message +DeleteEndpointRequest,delete_endpoint_request +DeleteEndpointResponse,delete_endpoint_response +DeleteEntitlementRequest,delete_entitlement_request +DeleteEntityRecognizerRequest,delete_entity_recognizer_request +DeleteEntityRequest,delete_entity_request +DeleteEntityResponse,delete_entity_response +DeleteEntityTypeRequest,delete_entity_type_request +DeleteEnvironmentAccountConnectionInput,delete_environment_account_connection_input +DeleteEnvironmentAccountConnectionOutput,delete_environment_account_connection_output +DeleteEnvironmentConfigurationMessage,delete_environment_configuration_message +DeleteEnvironmentInput,delete_environment_input +DeleteEnvironmentMembershipRequest,delete_environment_membership_request +DeleteEnvironmentOutput,delete_environment_output +DeleteEnvironmentRequest,delete_environment_request +DeleteEnvironmentResponse,delete_environment_response +DeleteEnvironmentTemplateInput,delete_environment_template_input +DeleteEnvironmentTemplateOutput,delete_environment_template_output +DeleteEnvironmentTemplateVersionInput,delete_environment_template_version_input +DeleteEnvironmentTemplateVersionOutput,delete_environment_template_version_output +DeleteEphemerisRequest,delete_ephemeris_request +DeleteEvaluationFormRequest,delete_evaluation_form_request +DeleteEvaluationInput,delete_evaluation_input +DeleteEvaluationOutput,delete_evaluation_output +DeleteEvaluationResultsRequest,delete_evaluation_results_request +DeleteEventActionRequest,delete_event_action_request +DeleteEventBusRequest,delete_event_bus_request +DeleteEventDataStoreRequest,delete_event_data_store_request +DeleteEventDestinationRequest,delete_event_destination_request +DeleteEventDestinationResult,delete_event_destination_result +DeleteEventIntegrationRequest,delete_event_integration_request +DeleteEventRequest,delete_event_request +DeleteEventSourceMappingRequest,delete_event_source_mapping_request +DeleteEventStreamRequest,delete_event_stream_request +DeleteEventStreamResponse,delete_event_stream_response +DeleteEventSubscriptionMessage,delete_event_subscription_message +DeleteEventSubscriptionResponse,delete_event_subscription_response +DeleteEventSubscriptionResult,delete_event_subscription_result +DeleteEventTrackerRequest,delete_event_tracker_request +DeleteEventTypeRequest,delete_event_type_request +DeleteEventsByEventTypeRequest,delete_events_by_event_type_request +DeleteEventsByEventTypeResult,delete_events_by_event_type_result +DeleteEventsConfigurationRequest,delete_events_configuration_request +DeleteExperienceRequest,delete_experience_request +DeleteExperimentRequest,delete_experiment_request +DeleteExperimentResponse,delete_experiment_response +DeleteExperimentTemplateRequest,delete_experiment_template_request +DeleteExperimentTemplateResponse,delete_experiment_template_response +DeleteExplainabilityExportRequest,delete_explainability_export_request +DeleteExplainabilityRequest,delete_explainability_request +DeleteExportRequest,delete_export_request +DeleteExportResponse,delete_export_response +DeleteExpressionRequest,delete_expression_request +DeleteExpressionResponse,delete_expression_response +DeleteExtensionAssociationRequest,delete_extension_association_request +DeleteExtensionRequest,delete_extension_request +DeleteExternalModelRequest,delete_external_model_request +DeleteFHIRDatastoreRequest,delete_fhir_datastore_request +DeleteFHIRDatastoreResponse,delete_fhir_datastore_response +DeleteFacesRequest,delete_faces_request +DeleteFacesResponse,delete_faces_response +DeleteFacetRequest,delete_facet_request +DeleteFaqRequest,delete_faq_request +DeleteFargateProfileRequest,delete_fargate_profile_request +DeleteFargateProfileResponse,delete_fargate_profile_response +DeleteFeatureGroupRequest,delete_feature_group_request +DeleteFeatureRequest,delete_feature_request +DeleteFieldLevelEncryptionConfigRequest,delete_field_level_encryption_config_request +DeleteFieldLevelEncryptionProfileRequest,delete_field_level_encryption_profile_request +DeleteFileCacheRequest,delete_file_cache_request +DeleteFileCacheResponse,delete_file_cache_response +DeleteFileEntry,delete_file_entry +DeleteFileInput,delete_file_input +DeleteFileOutput,delete_file_output +DeleteFileShareInput,delete_file_share_input +DeleteFileShareOutput,delete_file_share_output +DeleteFileSystemLustreConfiguration,delete_file_system_lustre_configuration +DeleteFileSystemLustreResponse,delete_file_system_lustre_response +DeleteFileSystemOpenZFSConfiguration,delete_file_system_open_zfs_configuration +DeleteFileSystemOpenZFSResponse,delete_file_system_open_zfs_response +DeleteFileSystemPolicyRequest,delete_file_system_policy_request +DeleteFileSystemRequest,delete_file_system_request +DeleteFileSystemResponse,delete_file_system_response +DeleteFileSystemWindowsConfiguration,delete_file_system_windows_configuration +DeleteFileSystemWindowsResponse,delete_file_system_windows_response +DeleteFilterRequest,delete_filter_request +DeleteFilterResponse,delete_filter_response +DeleteFindingAggregatorRequest,delete_finding_aggregator_request +DeleteFindingsFilterRequest,delete_findings_filter_request +DeleteFirewallDomainListRequest,delete_firewall_domain_list_request +DeleteFirewallDomainListResponse,delete_firewall_domain_list_response +DeleteFirewallManagerRuleGroupsRequest,delete_firewall_manager_rule_groups_request +DeleteFirewallManagerRuleGroupsResponse,delete_firewall_manager_rule_groups_response +DeleteFirewallPolicyRequest,delete_firewall_policy_request +DeleteFirewallPolicyResponse,delete_firewall_policy_response +DeleteFirewallRequest,delete_firewall_request +DeleteFirewallResponse,delete_firewall_response +DeleteFirewallRuleGroupRequest,delete_firewall_rule_group_request +DeleteFirewallRuleGroupResponse,delete_firewall_rule_group_response +DeleteFirewallRuleRequest,delete_firewall_rule_request +DeleteFirewallRuleResponse,delete_firewall_rule_response +DeleteFleetAdvisorDatabasesRequest,delete_fleet_advisor_databases_request +DeleteFleetAdvisorDatabasesResponse,delete_fleet_advisor_databases_response +DeleteFleetError,delete_fleet_error +DeleteFleetErrorItem,delete_fleet_error_item +DeleteFleetInput,delete_fleet_input +DeleteFleetLocationsInput,delete_fleet_locations_input +DeleteFleetLocationsOutput,delete_fleet_locations_output +DeleteFleetMetricRequest,delete_fleet_metric_request +DeleteFleetRequest,delete_fleet_request +DeleteFleetResponse,delete_fleet_response +DeleteFleetSuccessItem,delete_fleet_success_item +DeleteFleetsRequest,delete_fleets_request +DeleteFleetsResult,delete_fleets_result +DeleteFlowDefinitionRequest,delete_flow_definition_request +DeleteFlowLogsRequest,delete_flow_logs_request +DeleteFlowLogsResult,delete_flow_logs_result +DeleteFlowRequest,delete_flow_request +DeleteFlowResponse,delete_flow_response +DeleteFlowTemplateRequest,delete_flow_template_request +DeleteFlywheelRequest,delete_flywheel_request +DeleteFolderContentsRequest,delete_folder_contents_request +DeleteFolderMembershipRequest,delete_folder_membership_request +DeleteFolderMembershipResponse,delete_folder_membership_response +DeleteFolderRequest,delete_folder_request +DeleteFolderResponse,delete_folder_response +DeleteForecastExportJobRequest,delete_forecast_export_job_request +DeleteForecastRequest,delete_forecast_request +DeleteFormRequest,delete_form_request +DeleteFpgaImageRequest,delete_fpga_image_request +DeleteFpgaImageResult,delete_fpga_image_result +DeleteFrameworkInput,delete_framework_input +DeleteFraudsterRequest,delete_fraudster_request +DeleteFunctionCodeSigningConfigRequest,delete_function_code_signing_config_request +DeleteFunctionConcurrencyRequest,delete_function_concurrency_request +DeleteFunctionDefinitionRequest,delete_function_definition_request +DeleteFunctionEventInvokeConfigRequest,delete_function_event_invoke_config_request +DeleteFunctionRequest,delete_function_request +DeleteFunctionUrlConfigRequest,delete_function_url_config_request +DeleteFuotaTaskRequest,delete_fuota_task_request +DeleteGameRequest,delete_game_request +DeleteGameServerGroupInput,delete_game_server_group_input +DeleteGameServerGroupOutput,delete_game_server_group_output +DeleteGameSessionQueueInput,delete_game_session_queue_input +DeleteGatewayGroupRequest,delete_gateway_group_request +DeleteGatewayInput,delete_gateway_input +DeleteGatewayOutput,delete_gateway_output +DeleteGatewayRequest,delete_gateway_request +DeleteGatewayResponse,delete_gateway_response +DeleteGatewayResponseRequest,delete_gateway_response_request +DeleteGatewayRouteInput,delete_gateway_route_input +DeleteGatewayRouteOutput,delete_gateway_route_output +DeleteGcmChannelRequest,delete_gcm_channel_request +DeleteGcmChannelResponse,delete_gcm_channel_response +DeleteGeoMatchSetRequest,delete_geo_match_set_request +DeleteGeoMatchSetResponse,delete_geo_match_set_response +DeleteGeofenceCollectionRequest,delete_geofence_collection_request +DeleteGitHubAccountTokenInput,delete_git_hub_account_token_input +DeleteGitHubAccountTokenOutput,delete_git_hub_account_token_output +DeleteGlobalClusterMessage,delete_global_cluster_message +DeleteGlobalClusterResult,delete_global_cluster_result +DeleteGlobalNetworkRequest,delete_global_network_request +DeleteGlobalNetworkResponse,delete_global_network_response +DeleteGlobalReplicationGroupMessage,delete_global_replication_group_message +DeleteGlobalReplicationGroupResult,delete_global_replication_group_result +DeleteGlobalSecondaryIndexAction,delete_global_secondary_index_action +DeleteGrantRequest,delete_grant_request +DeleteGrantResponse,delete_grant_response +DeleteGraphRequest,delete_graph_request +DeleteGraphqlApiRequest,delete_graphql_api_request +DeleteGroupInput,delete_group_input +DeleteGroupMembershipRequest,delete_group_membership_request +DeleteGroupMembershipResponse,delete_group_membership_response +DeleteGroupOutput,delete_group_output +DeleteGroupPolicyRequest,delete_group_policy_request +DeleteGroupRequest,delete_group_request +DeleteGroupResponse,delete_group_response +DeleteHITRequest,delete_hit_request +DeleteHapgRequest,delete_hapg_request +DeleteHapgResponse,delete_hapg_response +DeleteHealthCheckRequest,delete_health_check_request +DeleteHostInput,delete_host_input +DeleteHostKeyRequest,delete_host_key_request +DeleteHostedConfigurationVersionRequest,delete_hosted_configuration_version_request +DeleteHostedZoneRequest,delete_hosted_zone_request +DeleteHostedZoneResponse,delete_hosted_zone_response +DeleteHoursOfOperationRequest,delete_hours_of_operation_request +DeleteHsmClientCertificateMessage,delete_hsm_client_certificate_message +DeleteHsmConfigurationMessage,delete_hsm_configuration_message +DeleteHsmRequest,delete_hsm_request +DeleteHsmResponse,delete_hsm_response +DeleteHubContentRequest,delete_hub_content_request +DeleteHubRequest,delete_hub_request +DeleteHumanLoopRequest,delete_human_loop_request +DeleteHumanTaskUiRequest,delete_human_task_ui_request +DeleteHypervisorInput,delete_hypervisor_input +DeleteHypervisorOutput,delete_hypervisor_output +DeleteIAMPolicyAssignmentRequest,delete_iam_policy_assignment_request +DeleteIAMPolicyAssignmentResponse,delete_iam_policy_assignment_response +DeleteIPSetRequest,delete_ip_set_request +DeleteIPSetResponse,delete_ip_set_response +DeleteIdentitiesInput,delete_identities_input +DeleteIdentitiesResponse,delete_identities_response +DeleteIdentityPolicyRequest,delete_identity_policy_request +DeleteIdentityPoolInput,delete_identity_pool_input +DeleteIdentityProviderRequest,delete_identity_provider_request +DeleteIdentityRequest,delete_identity_request +DeleteIdentitySourceInput,delete_identity_source_input +DeleteImageBuilderRequest,delete_image_builder_request +DeleteImageBuilderResult,delete_image_builder_result +DeleteImagePermissionsRequest,delete_image_permissions_request +DeleteImagePipelineRequest,delete_image_pipeline_request +DeleteImagePipelineResponse,delete_image_pipeline_response +DeleteImageRecipeRequest,delete_image_recipe_request +DeleteImageRecipeResponse,delete_image_recipe_response +DeleteImageRequest,delete_image_request +DeleteImageResponse,delete_image_response +DeleteImageResult,delete_image_result +DeleteImageSetRequest,delete_image_set_request +DeleteImageSetResponse,delete_image_set_response +DeleteImageVersionRequest,delete_image_version_request +DeleteImpersonationRoleRequest,delete_impersonation_role_request +DeleteImportRequest,delete_import_request +DeleteImportResponse,delete_import_response +DeleteImportedKeyMaterialRequest,delete_imported_key_material_request +DeleteInAppTemplateRequest,delete_in_app_template_request +DeleteInAppTemplateResponse,delete_in_app_template_response +DeleteInboundConnectionRequest,delete_inbound_connection_request +DeleteInboundConnectionResponse,delete_inbound_connection_response +DeleteInboundCrossClusterSearchConnectionRequest,delete_inbound_cross_cluster_search_connection_request +DeleteInboundCrossClusterSearchConnectionResponse,delete_inbound_cross_cluster_search_connection_response +DeleteIncidentRecordInput,delete_incident_record_input +DeleteIndexFieldRequest,delete_index_field_request +DeleteIndexFieldResponse,delete_index_field_response +DeleteIndexInput,delete_index_input +DeleteIndexOutput,delete_index_output +DeleteIndexRequest,delete_index_request +DeleteInferenceExperimentRequest,delete_inference_experiment_request +DeleteInferenceExperimentResponse,delete_inference_experiment_response +DeleteInferenceSchedulerRequest,delete_inference_scheduler_request +DeleteInfrastructureConfigurationRequest,delete_infrastructure_configuration_request +DeleteInfrastructureConfigurationResponse,delete_infrastructure_configuration_response +DeleteIngestionDestinationRequest,delete_ingestion_destination_request +DeleteIngestionRequest,delete_ingestion_request +DeleteInlinePolicyFromPermissionSetRequest,delete_inline_policy_from_permission_set_request +DeleteInputRequest,delete_input_request +DeleteInputSecurityGroupRequest,delete_input_security_group_request +DeleteInsightRequest,delete_insight_request +DeleteInsightResponse,delete_insight_response +DeleteInsightRulesInput,delete_insight_rules_input +DeleteInsightRulesOutput,delete_insight_rules_output +DeleteInstanceAccessControlAttributeConfigurationRequest,delete_instance_access_control_attribute_configuration_request +DeleteInstanceConnectEndpointRequest,delete_instance_connect_endpoint_request +DeleteInstanceConnectEndpointResult,delete_instance_connect_endpoint_result +DeleteInstanceEventWindowRequest,delete_instance_event_window_request +DeleteInstanceEventWindowResult,delete_instance_event_window_result +DeleteInstanceOnboardingJobRequest,delete_instance_onboarding_job_request +DeleteInstanceProfileMessage,delete_instance_profile_message +DeleteInstanceProfileRequest,delete_instance_profile_request +DeleteInstanceProfileResponse,delete_instance_profile_response +DeleteInstanceRequest,delete_instance_request +DeleteInstanceResult,delete_instance_result +DeleteInstanceSnapshotRequest,delete_instance_snapshot_request +DeleteInstanceSnapshotResult,delete_instance_snapshot_result +DeleteIntegrationAssociationRequest,delete_integration_association_request +DeleteIntegrationRequest,delete_integration_request +DeleteIntegrationResponse,delete_integration_response +DeleteIntegrationResponseRequest,delete_integration_response_request +DeleteIntentRequest,delete_intent_request +DeleteIntentVersionRequest,delete_intent_version_request +DeleteInterconnectRequest,delete_interconnect_request +DeleteInterconnectResponse,delete_interconnect_response +DeleteIntermediateSnaphots,delete_intermediate_snaphots +DeleteInternetGatewayRequest,delete_internet_gateway_request +DeleteInventoryRequest,delete_inventory_request +DeleteInventoryResult,delete_inventory_result +DeleteInvitationsRequest,delete_invitations_request +DeleteInvitationsResponse,delete_invitations_response +DeleteIpAccessSettingsRequest,delete_ip_access_settings_request +DeleteIpGroupRequest,delete_ip_group_request +DeleteIpamPoolRequest,delete_ipam_pool_request +DeleteIpamPoolResult,delete_ipam_pool_result +DeleteIpamRequest,delete_ipam_request +DeleteIpamResourceDiscoveryRequest,delete_ipam_resource_discovery_request +DeleteIpamResourceDiscoveryResult,delete_ipam_resource_discovery_result +DeleteIpamResult,delete_ipam_result +DeleteIpamScopeRequest,delete_ipam_scope_request +DeleteIpamScopeResult,delete_ipam_scope_result +DeleteItemInput,delete_item_input +DeleteItemOutput,delete_item_output +DeleteJobExecutionRequest,delete_job_execution_request +DeleteJobQueueRequest,delete_job_queue_request +DeleteJobRequest,delete_job_request +DeleteJobResponse,delete_job_response +DeleteJobResult,delete_job_result +DeleteJobTaggingRequest,delete_job_tagging_request +DeleteJobTemplateRequest,delete_job_template_request +DeleteJobTemplateResponse,delete_job_template_response +DeleteJourneyRequest,delete_journey_request +DeleteJourneyResponse,delete_journey_response +DeleteKeyGroupRequest,delete_key_group_request +DeleteKeyInDays,delete_key_in_days +DeleteKeyInput,delete_key_input +DeleteKeyOutput,delete_key_output +DeleteKeyPairRequest,delete_key_pair_request +DeleteKeyPairResult,delete_key_pair_result +DeleteKeyRequest,delete_key_request +DeleteKeySigningKeyRequest,delete_key_signing_key_request +DeleteKeySigningKeyResponse,delete_key_signing_key_response +DeleteKeyspaceRequest,delete_keyspace_request +DeleteKeywordRequest,delete_keyword_request +DeleteKeywordResult,delete_keyword_result +DeleteKnowledgeBaseRequest,delete_knowledge_base_request +DeleteKnownHostKeysRequest,delete_known_host_keys_request +DeleteKnownHostKeysResult,delete_known_host_keys_result +DeleteKxClusterRequest,delete_kx_cluster_request +DeleteKxDatabaseRequest,delete_kx_database_request +DeleteKxEnvironmentRequest,delete_kx_environment_request +DeleteKxUserRequest,delete_kx_user_request +DeleteLFTagRequest,delete_lf_tag_request +DeleteLabelGroupRequest,delete_label_group_request +DeleteLabelRequest,delete_label_request +DeleteLabelsRequest,delete_labels_request +DeleteLagRequest,delete_lag_request +DeleteLakeFormationOptInRequest,delete_lake_formation_opt_in_request +DeleteLambda,delete_lambda +DeleteLanguageModelRequest,delete_language_model_request +DeleteLaunchActionRequest,delete_launch_action_request +DeleteLaunchConfigurationTemplateRequest,delete_launch_configuration_template_request +DeleteLaunchProfileMemberRequest,delete_launch_profile_member_request +DeleteLaunchProfileRequest,delete_launch_profile_request +DeleteLaunchProfileResponse,delete_launch_profile_response +DeleteLaunchRequest,delete_launch_request +DeleteLaunchTemplateRequest,delete_launch_template_request +DeleteLaunchTemplateResult,delete_launch_template_result +DeleteLaunchTemplateVersionsRequest,delete_launch_template_versions_request +DeleteLaunchTemplateVersionsResponseErrorItem,delete_launch_template_versions_response_error_item +DeleteLaunchTemplateVersionsResponseSuccessItem,delete_launch_template_versions_response_success_item +DeleteLaunchTemplateVersionsResult,delete_launch_template_versions_result +DeleteLayerRequest,delete_layer_request +DeleteLayerVersionRequest,delete_layer_version_request +DeleteLedgerRequest,delete_ledger_request +DeleteLensInput,delete_lens_input +DeleteLensShareInput,delete_lens_share_input +DeleteLexiconInput,delete_lexicon_input +DeleteLicenseConfigurationRequest,delete_license_configuration_request +DeleteLicenseManagerReportGeneratorRequest,delete_license_manager_report_generator_request +DeleteLicenseRequest,delete_license_request +DeleteLicenseResponse,delete_license_response +DeleteLifecycleHookType,delete_lifecycle_hook_type +DeleteLifecyclePolicyInput,delete_lifecycle_policy_input +DeleteLifecyclePolicyRequest,delete_lifecycle_policy_request +DeleteLifecyclePolicyResponse,delete_lifecycle_policy_response +DeleteLinkInput,delete_link_input +DeleteLinkRequest,delete_link_request +DeleteLinkResponse,delete_link_response +DeleteListRequest,delete_list_request +DeleteListenerInput,delete_listener_input +DeleteListenerRequest,delete_listener_request +DeleteLiveSourceRequest,delete_live_source_request +DeleteLoadBalancerInput,delete_load_balancer_input +DeleteLoadBalancerListenerInput,delete_load_balancer_listener_input +DeleteLoadBalancerPolicyInput,delete_load_balancer_policy_input +DeleteLoadBalancerRequest,delete_load_balancer_request +DeleteLoadBalancerResult,delete_load_balancer_result +DeleteLoadBalancerTlsCertificateRequest,delete_load_balancer_tls_certificate_request +DeleteLoadBalancerTlsCertificateResult,delete_load_balancer_tls_certificate_result +DeleteLocalGatewayRouteRequest,delete_local_gateway_route_request +DeleteLocalGatewayRouteResult,delete_local_gateway_route_result +DeleteLocalGatewayRouteTableRequest,delete_local_gateway_route_table_request +DeleteLocalGatewayRouteTableResult,delete_local_gateway_route_table_result +DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest,delete_local_gateway_route_table_virtual_interface_group_association_request +DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult,delete_local_gateway_route_table_virtual_interface_group_association_result +DeleteLocalGatewayRouteTableVpcAssociationRequest,delete_local_gateway_route_table_vpc_association_request +DeleteLocalGatewayRouteTableVpcAssociationResult,delete_local_gateway_route_table_vpc_association_result +DeleteLocationInput,delete_location_input +DeleteLocationRequest,delete_location_request +DeleteLogGroupRequest,delete_log_group_request +DeleteLogPatternRequest,delete_log_pattern_request +DeleteLogStreamRequest,delete_log_stream_request +DeleteLogSubscriptionRequest,delete_log_subscription_request +DeleteLoggerDefinitionRequest,delete_logger_definition_request +DeleteLoggingConfigurationRequest,delete_logging_configuration_request +DeleteLoginProfileRequest,delete_login_profile_request +DeleteLunaClientRequest,delete_luna_client_request +DeleteLunaClientResponse,delete_luna_client_response +DeleteMLEndpointInput,delete_ml_endpoint_input +DeleteMLEndpointOutput,delete_ml_endpoint_output +DeleteMLModelInput,delete_ml_model_input +DeleteMLModelOutput,delete_ml_model_output +DeleteMLTransformRequest,delete_ml_transform_request +DeleteMLTransformResponse,delete_ml_transform_response +DeleteMailboxPermissionsRequest,delete_mailbox_permissions_request +DeleteMaintenanceWindowRequest,delete_maintenance_window_request +DeleteMaintenanceWindowResult,delete_maintenance_window_result +DeleteManagedEndpointRequest,delete_managed_endpoint_request +DeleteManagedEndpointResponse,delete_managed_endpoint_response +DeleteManagedPrefixListRequest,delete_managed_prefix_list_request +DeleteManagedPrefixListResult,delete_managed_prefix_list_result +DeleteMapRequest,delete_map_request +DeleteMarker,delete_marker +DeleteMarkerEntry,delete_marker_entry +DeleteMarkerReplication,delete_marker_replication +DeleteMarkerVersionId,delete_marker_version_id +DeleteMarkers,delete_markers +DeleteMatchingWorkflowInput,delete_matching_workflow_input +DeleteMatchingWorkflowOutput,delete_matching_workflow_output +DeleteMatchmakingConfigurationInput,delete_matchmaking_configuration_input +DeleteMatchmakingRuleSetInput,delete_matchmaking_rule_set_input +DeleteMediaCapturePipelineRequest,delete_media_capture_pipeline_request +DeleteMediaInsightsPipelineConfigurationRequest,delete_media_insights_pipeline_configuration_request +DeleteMediaPipelineKinesisVideoStreamPoolRequest,delete_media_pipeline_kinesis_video_stream_pool_request +DeleteMediaPipelineRequest,delete_media_pipeline_request +DeleteMedicalTranscriptionJobRequest,delete_medical_transcription_job_request +DeleteMedicalVocabularyRequest,delete_medical_vocabulary_request +DeleteMeetingRequest,delete_meeting_request +DeleteMemberInput,delete_member_input +DeleteMemberRequest,delete_member_request +DeleteMembersRequest,delete_members_request +DeleteMembersResponse,delete_members_response +DeleteMembershipInput,delete_membership_input +DeleteMeshInput,delete_mesh_input +DeleteMeshOutput,delete_mesh_output +DeleteMessageBatchRequest,delete_message_batch_request +DeleteMessageBatchRequestEntry,delete_message_batch_request_entry +DeleteMessageBatchResult,delete_message_batch_result +DeleteMessageBatchResultEntry,delete_message_batch_result_entry +DeleteMessageRequest,delete_message_request +DeleteMessageResponse,delete_message_response +DeleteMessagingStreamingConfigurationsRequest,delete_messaging_streaming_configurations_request +DeleteMethodRequest,delete_method_request +DeleteMethodResponseRequest,delete_method_response_request +DeleteMetricAttributionRequest,delete_metric_attribution_request +DeleteMetricFilterRequest,delete_metric_filter_request +DeleteMetricPolicyInput,delete_metric_policy_input +DeleteMetricStreamInput,delete_metric_stream_input +DeleteMigrationProjectMessage,delete_migration_project_message +DeleteMigrationProjectResponse,delete_migration_project_response +DeleteMigrationWorkflowRequest,delete_migration_workflow_request +DeleteMigrationWorkflowResponse,delete_migration_workflow_response +DeleteMissionProfileRequest,delete_mission_profile_request +DeleteMitigationActionRequest,delete_mitigation_action_request +DeleteMobileDeviceAccessOverrideRequest,delete_mobile_device_access_override_request +DeleteMobileDeviceAccessRuleRequest,delete_mobile_device_access_rule_request +DeleteModelBiasJobDefinitionRequest,delete_model_bias_job_definition_request +DeleteModelCardRequest,delete_model_card_request +DeleteModelExplainabilityJobDefinitionRequest,delete_model_explainability_job_definition_request +DeleteModelInput,delete_model_input +DeleteModelManifestRequest,delete_model_manifest_request +DeleteModelManifestResponse,delete_model_manifest_response +DeleteModelPackageGroupInput,delete_model_package_group_input +DeleteModelPackageGroupPolicyInput,delete_model_package_group_policy_input +DeleteModelPackageInput,delete_model_package_input +DeleteModelQualityJobDefinitionRequest,delete_model_quality_job_definition_request +DeleteModelRequest,delete_model_request +DeleteModelResponse,delete_model_response +DeleteModelVersionRequest,delete_model_version_request +DeleteMonitorInput,delete_monitor_input +DeleteMonitorRequest,delete_monitor_request +DeleteMonitoringScheduleRequest,delete_monitoring_schedule_request +DeleteMonitoringSubscriptionRequest,delete_monitoring_subscription_request +DeleteMountTargetRequest,delete_mount_target_request +DeleteMultiRegionAccessPointInput,delete_multi_region_access_point_input +DeleteMultiRegionAccessPointRequest,delete_multi_region_access_point_request +DeleteMultiRegionAccessPointResult,delete_multi_region_access_point_result +DeleteMulticastGroupRequest,delete_multicast_group_request +DeleteMultiplexProgramRequest,delete_multiplex_program_request +DeleteMultiplexProgramResponse,delete_multiplex_program_response +DeleteMultiplexRequest,delete_multiplex_request +DeleteMultiplexResponse,delete_multiplex_response +DeleteNamedQueryInput,delete_named_query_input +DeleteNamespaceRequest,delete_namespace_request +DeleteNamespaceResponse,delete_namespace_response +DeleteNatGatewayRequest,delete_nat_gateway_request +DeleteNatGatewayResult,delete_nat_gateway_result +DeleteNetworkAclEntryRequest,delete_network_acl_entry_request +DeleteNetworkAclRequest,delete_network_acl_request +DeleteNetworkAnalyzerConfigurationRequest,delete_network_analyzer_configuration_request +DeleteNetworkInsightsAccessScopeAnalysisRequest,delete_network_insights_access_scope_analysis_request +DeleteNetworkInsightsAccessScopeAnalysisResult,delete_network_insights_access_scope_analysis_result +DeleteNetworkInsightsAccessScopeRequest,delete_network_insights_access_scope_request +DeleteNetworkInsightsAccessScopeResult,delete_network_insights_access_scope_result +DeleteNetworkInsightsAnalysisRequest,delete_network_insights_analysis_request +DeleteNetworkInsightsAnalysisResult,delete_network_insights_analysis_result +DeleteNetworkInsightsPathRequest,delete_network_insights_path_request +DeleteNetworkInsightsPathResult,delete_network_insights_path_result +DeleteNetworkInterfacePermissionRequest,delete_network_interface_permission_request +DeleteNetworkInterfacePermissionResult,delete_network_interface_permission_result +DeleteNetworkInterfaceRequest,delete_network_interface_request +DeleteNetworkProfileRequest,delete_network_profile_request +DeleteNetworkRequest,delete_network_request +DeleteNetworkResponse,delete_network_response +DeleteNetworkSettingsRequest,delete_network_settings_request +DeleteNetworkSiteRequest,delete_network_site_request +DeleteNetworkSiteResponse,delete_network_site_response +DeleteNodeInput,delete_node_input +DeleteNodegroupRequest,delete_nodegroup_request +DeleteNodegroupResponse,delete_nodegroup_response +DeleteNotebookInput,delete_notebook_input +DeleteNotebookInstanceInput,delete_notebook_instance_input +DeleteNotebookInstanceLifecycleConfigInput,delete_notebook_instance_lifecycle_config_input +DeleteNotificationConfigurationType,delete_notification_configuration_type +DeleteNotificationRequest,delete_notification_request +DeleteNotificationRuleRequest,delete_notification_rule_request +DeleteNotificationRuleResult,delete_notification_rule_result +DeleteNotificationSubscriptionRequest,delete_notification_subscription_request +DeleteOTAUpdateRequest,delete_ota_update_request +DeleteObject,delete_object +DeleteObjectInput,delete_object_input +DeleteObjectOutput,delete_object_output +DeleteObjectRequest,delete_object_request +DeleteObjectTaggingOutput,delete_object_tagging_output +DeleteObjectTaggingRequest,delete_object_tagging_request +DeleteObjectsOnCancelRequest,delete_objects_on_cancel_request +DeleteObjectsOutput,delete_objects_output +DeleteObjectsRequest,delete_objects_request +DeleteObservabilityConfigurationRequest,delete_observability_configuration_request +DeleteObservabilityConfigurationResponse,delete_observability_configuration_response +DeleteOnTermination,delete_on_termination +DeleteOpenIDConnectProviderRequest,delete_open_id_connect_provider_request +DeleteOpsMetadataRequest,delete_ops_metadata_request +DeleteOptOutListRequest,delete_opt_out_list_request +DeleteOptOutListResult,delete_opt_out_list_result +DeleteOptedOutNumberRequest,delete_opted_out_number_request +DeleteOptedOutNumberResult,delete_opted_out_number_result +DeleteOption,delete_option +DeleteOptionGroupMessage,delete_option_group_message +DeleteOrganizationConfigRuleRequest,delete_organization_config_rule_request +DeleteOrganizationConformancePackRequest,delete_organization_conformance_pack_request +DeleteOrganizationRequest,delete_organization_request +DeleteOrganizationResponse,delete_organization_response +DeleteOrganizationalUnitRequest,delete_organizational_unit_request +DeleteOriginAccessControlRequest,delete_origin_access_control_request +DeleteOriginEndpointPolicyRequest,delete_origin_endpoint_policy_request +DeleteOriginEndpointRequest,delete_origin_endpoint_request +DeleteOriginRequestPolicyRequest,delete_origin_request_policy_request +DeleteOutboundConnectionRequest,delete_outbound_connection_request +DeleteOutboundConnectionResponse,delete_outbound_connection_response +DeleteOutboundCrossClusterSearchConnectionRequest,delete_outbound_cross_cluster_search_connection_request +DeleteOutboundCrossClusterSearchConnectionResponse,delete_outbound_cross_cluster_search_connection_response +DeleteOutcomeRequest,delete_outcome_request +DeleteOutpostInput,delete_outpost_input +DeleteOutpostResolverRequest,delete_outpost_resolver_request +DeleteOutpostResolverResponse,delete_outpost_resolver_response +DeletePackageRequest,delete_package_request +DeletePackageResponse,delete_package_response +DeletePackageResult,delete_package_result +DeletePackageVersionRequest,delete_package_version_request +DeletePackageVersionsRequest,delete_package_versions_request +DeletePackageVersionsResult,delete_package_versions_result +DeletePackagingConfigurationRequest,delete_packaging_configuration_request +DeletePackagingGroupRequest,delete_packaging_group_request +DeleteParallelDataRequest,delete_parallel_data_request +DeleteParallelDataResponse,delete_parallel_data_response +DeleteParameterGroupRequest,delete_parameter_group_request +DeleteParameterGroupResponse,delete_parameter_group_response +DeleteParameterRequest,delete_parameter_request +DeleteParametersRequest,delete_parameters_request +DeleteParametersResult,delete_parameters_result +DeletePartitionIndexRequest,delete_partition_index_request +DeletePartitionRequest,delete_partition_request +DeletePartnerEventSourceRequest,delete_partner_event_source_request +DeletePatchBaselineRequest,delete_patch_baseline_request +DeletePatchBaselineResult,delete_patch_baseline_result +DeletePeeringRequest,delete_peering_request +DeletePeeringResponse,delete_peering_response +DeletePendingAggregationRequestRequest,delete_pending_aggregation_request_request +DeletePendingTimestamp,delete_pending_timestamp +DeletePerformanceAnalysisReportRequest,delete_performance_analysis_report_request +DeletePermissionGroupRequest,delete_permission_group_request +DeletePermissionGroupResponse,delete_permission_group_response +DeletePermissionPolicyRequest,delete_permission_policy_request +DeletePermissionRequest,delete_permission_request +DeletePermissionResponse,delete_permission_response +DeletePermissionSetRequest,delete_permission_set_request +DeletePermissionVersionRequest,delete_permission_version_request +DeletePermissionVersionResponse,delete_permission_version_response +DeletePermissionsBoundaryFromPermissionSetRequest,delete_permissions_boundary_from_permission_set_request +DeletePhoneNumberRequest,delete_phone_number_request +DeletePipeRequest,delete_pipe_request +DeletePipeResponse,delete_pipe_response +DeletePipelineInput,delete_pipeline_input +DeletePipelineRequest,delete_pipeline_request +DeletePipelineResponse,delete_pipeline_response +DeletePlaceIndexRequest,delete_place_index_request +DeletePlacementGroupRequest,delete_placement_group_request +DeletePlacementRequest,delete_placement_request +DeletePlatformApplicationInput,delete_platform_application_input +DeletePlatformVersionRequest,delete_platform_version_request +DeletePlatformVersionResult,delete_platform_version_result +DeletePlaybackConfigurationRequest,delete_playback_configuration_request +DeletePlaybackKeyPairRequest,delete_playback_key_pair_request +DeletePolicyInput,delete_policy_input +DeletePolicyRequest,delete_policy_request +DeletePolicyStoreInput,delete_policy_store_input +DeletePolicyTemplateInput,delete_policy_template_input +DeletePolicyType,delete_policy_type +DeletePolicyVersionRequest,delete_policy_version_request +DeletePoolRequest,delete_pool_request +DeletePoolResult,delete_pool_result +DeletePortalRequest,delete_portal_request +DeletePortalResponse,delete_portal_response +DeletePortfolioInput,delete_portfolio_input +DeletePortfolioShareInput,delete_portfolio_share_input +DeletePortfolioShareOutput,delete_portfolio_share_output +DeletePredictorBacktestExportJobRequest,delete_predictor_backtest_export_job_request +DeletePredictorRequest,delete_predictor_request +DeletePrefetchScheduleRequest,delete_prefetch_schedule_request +DeletePreparedStatementInput,delete_prepared_statement_input +DeletePresetRequest,delete_preset_request +DeletePricingPlanInput,delete_pricing_plan_input +DeletePricingPlanOutput,delete_pricing_plan_output +DeletePricingRuleInput,delete_pricing_rule_input +DeletePricingRuleOutput,delete_pricing_rule_output +DeletePrincipalMappingRequest,delete_principal_mapping_request +DeletePriorVersions,delete_prior_versions +DeleteProductInput,delete_product_input +DeleteProfileInput,delete_profile_input +DeleteProfileKeyRequest,delete_profile_key_request +DeleteProfileKeyResponse,delete_profile_key_response +DeleteProfileObjectRequest,delete_profile_object_request +DeleteProfileObjectResponse,delete_profile_object_response +DeleteProfileObjectTypeRequest,delete_profile_object_type_request +DeleteProfileObjectTypeResponse,delete_profile_object_type_response +DeleteProfileRequest,delete_profile_request +DeleteProfileResponse,delete_profile_response +DeleteProfileShareInput,delete_profile_share_input +DeleteProfilingGroupRequest,delete_profiling_group_request +DeleteProgramRequest,delete_program_request +DeleteProgressUpdateStreamRequest,delete_progress_update_stream_request +DeleteProjectInput,delete_project_input +DeleteProjectPolicyRequest,delete_project_policy_request +DeleteProjectRequest,delete_project_request +DeleteProjectResponse,delete_project_response +DeleteProjectResult,delete_project_result +DeleteProjectVersionRequest,delete_project_version_request +DeleteProjectVersionResponse,delete_project_version_response +DeletePromptRequest,delete_prompt_request +DeleteProperties,delete_properties +DeletePropertygraphStatisticsOutput,delete_propertygraph_statistics_output +DeleteProtection,delete_protection +DeleteProtectionGroupRequest,delete_protection_group_request +DeleteProtectionRequest,delete_protection_request +DeleteProtocolsListRequest,delete_protocols_list_request +DeleteProvisionedConcurrencyConfigRequest,delete_provisioned_concurrency_config_request +DeleteProvisionedModelThroughputRequest,delete_provisioned_model_throughput_request +DeleteProvisionedProductPlanInput,delete_provisioned_product_plan_input +DeleteProvisioningArtifactInput,delete_provisioning_artifact_input +DeleteProvisioningTemplateRequest,delete_provisioning_template_request +DeleteProvisioningTemplateVersionRequest,delete_provisioning_template_version_request +DeleteProxySessionRequest,delete_proxy_session_request +DeletePublicAccessBlockRequest,delete_public_access_block_request +DeletePublicIpv4PoolRequest,delete_public_ipv4_pool_request +DeletePublicIpv4PoolResult,delete_public_ipv4_pool_result +DeletePublicKeyRequest,delete_public_key_request +DeletePublicKeys,delete_public_keys +DeletePublishingDestinationRequest,delete_publishing_destination_request +DeletePullRequestApprovalRuleInput,delete_pull_request_approval_rule_input +DeletePullRequestApprovalRuleOutput,delete_pull_request_approval_rule_output +DeletePullThroughCacheRuleRequest,delete_pull_through_cache_rule_request +DeletePullThroughCacheRuleResponse,delete_pull_through_cache_rule_response +DeletePushTemplateRequest,delete_push_template_request +DeletePushTemplateResponse,delete_push_template_response +DeleteQualificationTypeRequest,delete_qualification_type_request +DeleteQueryDefinitionRequest,delete_query_definition_request +DeleteQueryDefinitionResponse,delete_query_definition_response +DeleteQueryLoggingConfigRequest,delete_query_logging_config_request +DeleteQuerySuggestionsBlockListRequest,delete_query_suggestions_block_list_request +DeleteQueueRequest,delete_queue_request +DeleteQueuedMessagesRequest,delete_queued_messages_request +DeleteQueuedReservedInstancesError,delete_queued_reserved_instances_error +DeleteQueuedReservedInstancesRequest,delete_queued_reserved_instances_request +DeleteQueuedReservedInstancesResult,delete_queued_reserved_instances_result +DeleteQueuedSavingsPlanRequest,delete_queued_savings_plan_request +DeleteQuickConnectRequest,delete_quick_connect_request +DeleteRate,delete_rate +DeleteRateBasedRuleRequest,delete_rate_based_rule_request +DeleteRateBasedRuleResponse,delete_rate_based_rule_response +DeleteReadinessCheckRequest,delete_readiness_check_request +DeleteRealtimeEndpointInput,delete_realtime_endpoint_input +DeleteRealtimeEndpointOutput,delete_realtime_endpoint_output +DeleteRealtimeLogConfigRequest,delete_realtime_log_config_request +DeleteReceiptFilterRequest,delete_receipt_filter_request +DeleteReceiptRuleRequest,delete_receipt_rule_request +DeleteReceiptRuleSetRequest,delete_receipt_rule_set_request +DeleteRecipeVersionRequest,delete_recipe_version_request +DeleteRecipeVersionResponse,delete_recipe_version_response +DeleteRecommendationPreferencesRequest,delete_recommendation_preferences_request +DeleteRecommendationTemplateRequest,delete_recommendation_template_request +DeleteRecommendationTemplateResponse,delete_recommendation_template_response +DeleteRecommenderConfigurationRequest,delete_recommender_configuration_request +DeleteRecommenderConfigurationResponse,delete_recommender_configuration_response +DeleteRecommenderRequest,delete_recommender_request +DeleteRecordRequest,delete_record_request +DeleteRecordingConfigurationRequest,delete_recording_configuration_request +DeleteRecoveryGroupRequest,delete_recovery_group_request +DeleteRecoveryInstanceRequest,delete_recovery_instance_request +DeleteRecoveryPointInput,delete_recovery_point_input +DeleteReferenceRequest,delete_reference_request +DeleteReferenceStoreRequest,delete_reference_store_request +DeleteRefreshScheduleRequest,delete_refresh_schedule_request +DeleteRefreshScheduleResponse,delete_refresh_schedule_response +DeleteRegexMatchSetRequest,delete_regex_match_set_request +DeleteRegexMatchSetResponse,delete_regex_match_set_response +DeleteRegexPatternSetRequest,delete_regex_pattern_set_request +DeleteRegexPatternSetResponse,delete_regex_pattern_set_response +DeleteRegionAction,delete_region_action +DeleteRegistryInput,delete_registry_input +DeleteRegistryPolicyResponse,delete_registry_policy_response +DeleteRegistryRequest,delete_registry_request +DeleteRegistryResponse,delete_registry_response +DeleteRelationalDatabaseRequest,delete_relational_database_request +DeleteRelationalDatabaseResult,delete_relational_database_result +DeleteRelationalDatabaseSnapshotRequest,delete_relational_database_snapshot_request +DeleteRelationalDatabaseSnapshotResult,delete_relational_database_snapshot_result +DeleteRemediationConfigurationRequest,delete_remediation_configuration_request +DeleteRemediationExceptionsRequest,delete_remediation_exceptions_request +DeleteRemediationExceptionsResponse,delete_remediation_exceptions_response +DeleteRemoteAccessSessionRequest,delete_remote_access_session_request +DeleteReplacedRootVolume,delete_replaced_root_volume +DeleteReplicaAction,delete_replica_action +DeleteReplicationConfigMessage,delete_replication_config_message +DeleteReplicationConfigResponse,delete_replication_config_response +DeleteReplicationConfigurationRequest,delete_replication_configuration_request +DeleteReplicationConfigurationTemplateRequest,delete_replication_configuration_template_request +DeleteReplicationGroupMemberAction,delete_replication_group_member_action +DeleteReplicationGroupMessage,delete_replication_group_message +DeleteReplicationGroupResult,delete_replication_group_result +DeleteReplicationInstanceMessage,delete_replication_instance_message +DeleteReplicationInstanceResponse,delete_replication_instance_response +DeleteReplicationJobRequest,delete_replication_job_request +DeleteReplicationSetInput,delete_replication_set_input +DeleteReplicationSubnetGroupMessage,delete_replication_subnet_group_message +DeleteReplicationTaskAssessmentRunMessage,delete_replication_task_assessment_run_message +DeleteReplicationTaskAssessmentRunResponse,delete_replication_task_assessment_run_response +DeleteReplicationTaskMessage,delete_replication_task_message +DeleteReplicationTaskResponse,delete_replication_task_response +DeleteReportDefinitionRequest,delete_report_definition_request +DeleteReportDefinitionResponse,delete_report_definition_response +DeleteReportDefinitionResult,delete_report_definition_result +DeleteReportGroupInput,delete_report_group_input +DeleteReportInput,delete_report_input +DeleteReportPlanInput,delete_report_plan_input +DeleteRepositoryInput,delete_repository_input +DeleteRepositoryOutput,delete_repository_output +DeleteRepositoryPermissionsPolicyRequest,delete_repository_permissions_policy_request +DeleteRepositoryPermissionsPolicyResult,delete_repository_permissions_policy_result +DeleteRepositoryPolicyRequest,delete_repository_policy_request +DeleteRepositoryPolicyResponse,delete_repository_policy_response +DeleteRepositoryRequest,delete_repository_request +DeleteRepositoryResponse,delete_repository_response +DeleteRepositoryResult,delete_repository_result +DeleteRequest,delete_request +DeleteRequestValidatorRequest,delete_request_validator_request +DeleteRescoreExecutionPlanRequest,delete_rescore_execution_plan_request +DeleteReservationRequest,delete_reservation_request +DeleteReservationResponse,delete_reservation_response +DeleteResiliencyPolicyRequest,delete_resiliency_policy_request +DeleteResiliencyPolicyResponse,delete_resiliency_policy_response +DeleteResolverEndpointRequest,delete_resolver_endpoint_request +DeleteResolverEndpointResponse,delete_resolver_endpoint_response +DeleteResolverQueryLogConfigRequest,delete_resolver_query_log_config_request +DeleteResolverQueryLogConfigResponse,delete_resolver_query_log_config_response +DeleteResolverRequest,delete_resolver_request +DeleteResolverRuleRequest,delete_resolver_rule_request +DeleteResolverRuleResponse,delete_resolver_rule_response +DeleteResource,delete_resource +DeleteResourceConfigRequest,delete_resource_config_request +DeleteResourceDataSyncRequest,delete_resource_data_sync_request +DeleteResourceDefinitionRequest,delete_resource_definition_request +DeleteResourceInput,delete_resource_input +DeleteResourceOutput,delete_resource_output +DeleteResourcePermissionInput,delete_resource_permission_input +DeleteResourcePermissionOutput,delete_resource_permission_output +DeleteResourcePolicyInput,delete_resource_policy_input +DeleteResourcePolicyRequest,delete_resource_policy_request +DeleteResourcePolicyResponse,delete_resource_policy_response +DeleteResourcePolicyStatementRequest,delete_resource_policy_statement_request +DeleteResourcePolicyStatementResponse,delete_resource_policy_statement_response +DeleteResourceRequest,delete_resource_request +DeleteResourceServerRequest,delete_resource_server_request +DeleteResourceSetRequest,delete_resource_set_request +DeleteResourceShareRequest,delete_resource_share_request +DeleteResourceShareResponse,delete_resource_share_response +DeleteResourceTreeRequest,delete_resource_tree_request +DeleteResourcesByExternalIdInput,delete_resources_by_external_id_input +DeleteResponseHeadersPolicyRequest,delete_response_headers_policy_request +DeleteResponsePlanInput,delete_response_plan_input +DeleteRestApiRequest,delete_rest_api_request +DeleteRetentionConfigurationRequest,delete_retention_configuration_request +DeleteRetentionPolicyRequest,delete_retention_policy_request +DeleteRetrainingSchedulerRequest,delete_retraining_scheduler_request +DeleteReusableDelegationSetRequest,delete_reusable_delegation_set_request +DeleteRevisionRequest,delete_revision_request +DeleteRobotApplicationRequest,delete_robot_application_request +DeleteRobotRequest,delete_robot_request +DeleteRoleAliasRequest,delete_role_alias_request +DeleteRolePermissionsBoundaryRequest,delete_role_permissions_boundary_request +DeleteRolePolicyRequest,delete_role_policy_request +DeleteRoleRequest,delete_role_request +DeleteRoomMembershipRequest,delete_room_membership_request +DeleteRoomRequest,delete_room_request +DeleteRoomSkillParameterRequest,delete_room_skill_parameter_request +DeleteRotationOverrideRequest,delete_rotation_override_request +DeleteRotationRequest,delete_rotation_request +DeleteRouteCalculatorRequest,delete_route_calculator_request +DeleteRouteInput,delete_route_input +DeleteRouteOutput,delete_route_output +DeleteRouteRequest,delete_route_request +DeleteRouteRequestParameterRequest,delete_route_request_parameter_request +DeleteRouteResponse,delete_route_response +DeleteRouteResponseRequest,delete_route_response_request +DeleteRouteSettingsRequest,delete_route_settings_request +DeleteRouteTableRequest,delete_route_table_request +DeleteRoutingControlRequest,delete_routing_control_request +DeleteRoutingProfileRequest,delete_routing_profile_request +DeleteRuleGroupRequest,delete_rule_group_request +DeleteRuleGroupResponse,delete_rule_group_response +DeleteRuleGroupsNamespaceRequest,delete_rule_groups_namespace_request +DeleteRuleInput,delete_rule_input +DeleteRuleRequest,delete_rule_request +DeleteRuleResponse,delete_rule_response +DeleteRulesetRequest,delete_ruleset_request +DeleteRulesetResponse,delete_ruleset_response +DeleteRumMetricsDestinationRequest,delete_rum_metrics_destination_request +DeleteRunGroupRequest,delete_run_group_request +DeleteRunRequest,delete_run_request +DeleteSAMLProviderRequest,delete_saml_provider_request +DeleteSMSSandboxPhoneNumberInput,delete_sms_sandbox_phone_number_input +DeleteSSHPublicKeyRequest,delete_ssh_public_key_request +DeleteSafetyRuleRequest,delete_safety_rule_request +DeleteSamplingRuleRequest,delete_sampling_rule_request +DeleteSamplingRuleResult,delete_sampling_rule_result +DeleteScalingPlanRequest,delete_scaling_plan_request +DeleteScalingPolicyInput,delete_scaling_policy_input +DeleteScalingPolicyRequest,delete_scaling_policy_request +DeleteSceneRequest,delete_scene_request +DeleteScheduleGroupInput,delete_schedule_group_input +DeleteScheduleInput,delete_schedule_input +DeleteScheduleRequest,delete_schedule_request +DeleteScheduleResponse,delete_schedule_response +DeleteScheduledActionMessage,delete_scheduled_action_message +DeleteScheduledActionRequest,delete_scheduled_action_request +DeleteScheduledActionType,delete_scheduled_action_type +DeleteScheduledAuditRequest,delete_scheduled_audit_request +DeleteScheduledQueryRequest,delete_scheduled_query_request +DeleteSchedulingPolicyRequest,delete_scheduling_policy_request +DeleteSchemaInput,delete_schema_input +DeleteSchemaMappingInput,delete_schema_mapping_input +DeleteSchemaMappingOutput,delete_schema_mapping_output +DeleteSchemaRequest,delete_schema_request +DeleteSchemaResponse,delete_schema_response +DeleteSchemaVersionRequest,delete_schema_version_request +DeleteSchemaVersionsInput,delete_schema_versions_input +DeleteSchemaVersionsResponse,delete_schema_versions_response +DeleteScriptInput,delete_script_input +DeleteSecretRequest,delete_secret_request +DeleteSecretResponse,delete_secret_response +DeleteSecurityConfigRequest,delete_security_config_request +DeleteSecurityConfigurationInput,delete_security_configuration_input +DeleteSecurityConfigurationRequest,delete_security_configuration_request +DeleteSecurityGroupRequest,delete_security_group_request +DeleteSecurityPolicyRequest,delete_security_policy_request +DeleteSecurityProfileRequest,delete_security_profile_request +DeleteSegmentRequest,delete_segment_request +DeleteSegmentResponse,delete_segment_response +DeleteSequenceStoreRequest,delete_sequence_store_request +DeleteServerCertificateRequest,delete_server_certificate_request +DeleteServerRequest,delete_server_request +DeleteServiceActionInput,delete_service_action_input +DeleteServiceInput,delete_service_input +DeleteServiceLinkedRoleRequest,delete_service_linked_role_request +DeleteServiceLinkedRoleResponse,delete_service_linked_role_response +DeleteServiceNetworkRequest,delete_service_network_request +DeleteServiceNetworkServiceAssociationRequest,delete_service_network_service_association_request +DeleteServiceNetworkServiceAssociationResponse,delete_service_network_service_association_response +DeleteServiceNetworkVpcAssociationRequest,delete_service_network_vpc_association_request +DeleteServiceNetworkVpcAssociationResponse,delete_service_network_vpc_association_response +DeleteServiceOutput,delete_service_output +DeleteServicePrincipalNameRequest,delete_service_principal_name_request +DeleteServiceProfileRequest,delete_service_profile_request +DeleteServiceQuotaIncreaseRequestFromTemplateRequest,delete_service_quota_increase_request_from_template_request +DeleteServiceRequest,delete_service_request +DeleteServiceResponse,delete_service_response +DeleteServiceSpecificCredentialRequest,delete_service_specific_credential_request +DeleteServiceSyncConfigInput,delete_service_sync_config_input +DeleteServiceSyncConfigOutput,delete_service_sync_config_output +DeleteServiceTemplateInput,delete_service_template_input +DeleteServiceTemplateOutput,delete_service_template_output +DeleteServiceTemplateVersionInput,delete_service_template_version_input +DeleteServiceTemplateVersionOutput,delete_service_template_version_output +DeleteSessionRequest,delete_session_request +DeleteSessionResponse,delete_session_response +DeleteShareRequest,delete_share_request +DeleteShareResponse,delete_share_response +DeleteSignalCatalogRequest,delete_signal_catalog_request +DeleteSignalCatalogResponse,delete_signal_catalog_response +DeleteSignalingChannelInput,delete_signaling_channel_input +DeleteSigningCertificateRequest,delete_signing_certificate_request +DeleteSimulationApplicationRequest,delete_simulation_application_request +DeleteSimulationInput,delete_simulation_input +DeleteSinkInput,delete_sink_input +DeleteSipMediaApplicationRequest,delete_sip_media_application_request +DeleteSipRuleRequest,delete_sip_rule_request +DeleteSiteInput,delete_site_input +DeleteSiteRequest,delete_site_request +DeleteSiteResponse,delete_site_response +DeleteSizeConstraintSetRequest,delete_size_constraint_set_request +DeleteSizeConstraintSetResponse,delete_size_constraint_set_response +DeleteSkillAuthorizationRequest,delete_skill_authorization_request +DeleteSkillGroupRequest,delete_skill_group_request +DeleteSlackChannelConfigurationRequest,delete_slack_channel_configuration_request +DeleteSlackWorkspaceConfigurationRequest,delete_slack_workspace_configuration_request +DeleteSlotRequest,delete_slot_request +DeleteSlotTypeRequest,delete_slot_type_request +DeleteSlotTypeVersionRequest,delete_slot_type_version_request +DeleteSmsChannelRequest,delete_sms_channel_request +DeleteSmsChannelResponse,delete_sms_channel_response +DeleteSmsTemplateRequest,delete_sms_template_request +DeleteSmsTemplateResponse,delete_sms_template_response +DeleteSnapshotCopyGrantMessage,delete_snapshot_copy_grant_message +DeleteSnapshotMessage,delete_snapshot_message +DeleteSnapshotRequest,delete_snapshot_request +DeleteSnapshotResponse,delete_snapshot_response +DeleteSnapshotResult,delete_snapshot_result +DeleteSnapshotScheduleInput,delete_snapshot_schedule_input +DeleteSnapshotScheduleMessage,delete_snapshot_schedule_message +DeleteSnapshotScheduleOutput,delete_snapshot_schedule_output +DeleteSolFunctionPackageInput,delete_sol_function_package_input +DeleteSolNetworkInstanceInput,delete_sol_network_instance_input +DeleteSolNetworkPackageInput,delete_sol_network_package_input +DeleteSolutionRequest,delete_solution_request +DeleteSourceBundle,delete_source_bundle +DeleteSourceCredentialsInput,delete_source_credentials_input +DeleteSourceCredentialsOutput,delete_source_credentials_output +DeleteSourceFromS3,delete_source_from_s3 +DeleteSourceLocationRequest,delete_source_location_request +DeleteSourceNetworkRequest,delete_source_network_request +DeleteSourceRepositoryRequest,delete_source_repository_request +DeleteSourceRepositoryResponse,delete_source_repository_response +DeleteSourceServerRequest,delete_source_server_request +DeleteSpaceRequest,delete_space_request +DeleteSpaceResponse,delete_space_response +DeleteSparqlStatisticsOutput,delete_sparql_statistics_output +DeleteSpeakerRequest,delete_speaker_request +DeleteSpotDatafeedSubscriptionRequest,delete_spot_datafeed_subscription_request +DeleteSqlInjectionMatchSetRequest,delete_sql_injection_match_set_request +DeleteSqlInjectionMatchSetResponse,delete_sql_injection_match_set_response +DeleteSshPublicKeyRequest,delete_ssh_public_key_request +DeleteStackInput,delete_stack_input +DeleteStackInstancesInput,delete_stack_instances_input +DeleteStackInstancesOutput,delete_stack_instances_output +DeleteStackRequest,delete_stack_request +DeleteStackSetInput,delete_stack_set_input +DeleteStageRequest,delete_stage_request +DeleteStateMachineAliasInput,delete_state_machine_alias_input +DeleteStateMachineInput,delete_state_machine_input +DeleteStateMachineVersionInput,delete_state_machine_version_input +DeleteStatisticsValueMap,delete_statistics_value_map +DeleteStepDetails,delete_step_details +DeleteStorageConnectors,delete_storage_connectors +DeleteStorageLensConfigurationRequest,delete_storage_lens_configuration_request +DeleteStorageLensConfigurationTaggingRequest,delete_storage_lens_configuration_tagging_request +DeleteStorageVirtualMachineRequest,delete_storage_virtual_machine_request +DeleteStorageVirtualMachineResponse,delete_storage_virtual_machine_response +DeleteStoredQueryRequest,delete_stored_query_request +DeleteStreamInput,delete_stream_input +DeleteStreamKeyRequest,delete_stream_key_request +DeleteStreamProcessorRequest,delete_stream_processor_request +DeleteStreamRequest,delete_stream_request +DeleteStreamingDistributionRequest,delete_streaming_distribution_request +DeleteStreamingImageRequest,delete_streaming_image_request +DeleteStreamingImageResponse,delete_streaming_image_response +DeleteStreamingSessionRequest,delete_streaming_session_request +DeleteStreamingSessionResponse,delete_streaming_session_response +DeleteStudioComponentRequest,delete_studio_component_request +DeleteStudioComponentResponse,delete_studio_component_response +DeleteStudioInput,delete_studio_input +DeleteStudioLifecycleConfigRequest,delete_studio_lifecycle_config_request +DeleteStudioMemberRequest,delete_studio_member_request +DeleteStudioRequest,delete_studio_request +DeleteStudioResponse,delete_studio_response +DeleteStudioSessionMappingInput,delete_studio_session_mapping_input +DeleteSubnetCidrReservationRequest,delete_subnet_cidr_reservation_request +DeleteSubnetCidrReservationResult,delete_subnet_cidr_reservation_result +DeleteSubnetGroupRequest,delete_subnet_group_request +DeleteSubnetGroupResponse,delete_subnet_group_response +DeleteSubnetRequest,delete_subnet_request +DeleteSubscriberNotificationRequest,delete_subscriber_notification_request +DeleteSubscriberRequest,delete_subscriber_request +DeleteSubscriptionDefinitionRequest,delete_subscription_definition_request +DeleteSubscriptionFilterRequest,delete_subscription_filter_request +DeleteSuggesterRequest,delete_suggester_request +DeleteSuggesterResponse,delete_suggester_response +DeleteSuiteDefinitionRequest,delete_suite_definition_request +DeleteSuppressedDestinationRequest,delete_suppressed_destination_request +DeleteSyncJobRequest,delete_sync_job_request +DeleteSyncJobResponse,delete_sync_job_response +DeleteSystemInstanceRequest,delete_system_instance_request +DeleteSystemTemplateRequest,delete_system_template_request +DeleteTLSInspectionConfigurationRequest,delete_tls_inspection_configuration_request +DeleteTLSInspectionConfigurationResponse,delete_tls_inspection_configuration_response +DeleteTableInput,delete_table_input +DeleteTableOutput,delete_table_output +DeleteTableRequest,delete_table_request +DeleteTableVersionRequest,delete_table_version_request +DeleteTagOptionInput,delete_tag_option_input +DeleteTagsForDomainRequest,delete_tags_for_domain_request +DeleteTagsInput,delete_tags_input +DeleteTagsMessage,delete_tags_message +DeleteTagsOutput,delete_tags_output +DeleteTagsRequest,delete_tags_request +DeleteTagsType,delete_tags_type +DeleteTapeArchiveInput,delete_tape_archive_input +DeleteTapeArchiveOutput,delete_tape_archive_output +DeleteTapeInput,delete_tape_input +DeleteTapeOutput,delete_tape_output +DeleteTapePoolInput,delete_tape_pool_input +DeleteTapePoolOutput,delete_tape_pool_output +DeleteTarget,delete_target +DeleteTargetGroupInput,delete_target_group_input +DeleteTargetGroupRequest,delete_target_group_request +DeleteTargetGroupResponse,delete_target_group_response +DeleteTargetRequest,delete_target_request +DeleteTaskDefinitionsRequest,delete_task_definitions_request +DeleteTaskDefinitionsResponse,delete_task_definitions_response +DeleteTaskRequest,delete_task_request +DeleteTaskSetRequest,delete_task_set_request +DeleteTaskSetResponse,delete_task_set_response +DeleteTaskTemplateRequest,delete_task_template_request +DeleteTemplateAliasRequest,delete_template_alias_request +DeleteTemplateAliasResponse,delete_template_alias_response +DeleteTemplateGroupAccessControlEntryRequest,delete_template_group_access_control_entry_request +DeleteTemplateRequest,delete_template_request +DeleteTemplateResponse,delete_template_response +DeleteTemplateSyncConfigInput,delete_template_sync_config_input +DeleteTemplateSyncConfigOutput,delete_template_sync_config_output +DeleteTerminologyRequest,delete_terminology_request +DeleteTestGridProjectRequest,delete_test_grid_project_request +DeleteTestSetRequest,delete_test_set_request +DeleteTextMessageSpendLimitOverrideResult,delete_text_message_spend_limit_override_result +DeleteThemeAliasRequest,delete_theme_alias_request +DeleteThemeAliasResponse,delete_theme_alias_response +DeleteThemeRequest,delete_theme_request +DeleteThemeResponse,delete_theme_response +DeleteThesaurusRequest,delete_thesaurus_request +DeleteThingGroupRequest,delete_thing_group_request +DeleteThingRequest,delete_thing_request +DeleteThingShadowRequest,delete_thing_shadow_request +DeleteThingShadowResponse,delete_thing_shadow_response +DeleteThingTypeRequest,delete_thing_type_request +DeleteThreatIntelSetRequest,delete_threat_intel_set_request +DeleteTime,delete_time +DeleteTimeSeriesRequest,delete_time_series_request +DeleteTimelineEventInput,delete_timeline_event_input +DeleteTimestamp,delete_timestamp +DeleteTokenRequest,delete_token_request +DeleteTokenResponse,delete_token_response +DeleteTopicInput,delete_topic_input +DeleteTopicRefreshScheduleRequest,delete_topic_refresh_schedule_request +DeleteTopicRefreshScheduleResponse,delete_topic_refresh_schedule_response +DeleteTopicRequest,delete_topic_request +DeleteTopicResponse,delete_topic_response +DeleteTopicRuleDestinationRequest,delete_topic_rule_destination_request +DeleteTopicRuleRequest,delete_topic_rule_request +DeleteTrackerRequest,delete_tracker_request +DeleteTrafficDistributionGroupRequest,delete_traffic_distribution_group_request +DeleteTrafficMirrorFilterRequest,delete_traffic_mirror_filter_request +DeleteTrafficMirrorFilterResult,delete_traffic_mirror_filter_result +DeleteTrafficMirrorFilterRuleRequest,delete_traffic_mirror_filter_rule_request +DeleteTrafficMirrorFilterRuleResult,delete_traffic_mirror_filter_rule_result +DeleteTrafficMirrorSessionRequest,delete_traffic_mirror_session_request +DeleteTrafficMirrorSessionResult,delete_traffic_mirror_session_result +DeleteTrafficMirrorTargetRequest,delete_traffic_mirror_target_request +DeleteTrafficMirrorTargetResult,delete_traffic_mirror_target_result +DeleteTrafficPolicyInstanceRequest,delete_traffic_policy_instance_request +DeleteTrafficPolicyRequest,delete_traffic_policy_request +DeleteTrailRequest,delete_trail_request +DeleteTranscriptionJobRequest,delete_transcription_job_request +DeleteTransitGatewayConnectPeerRequest,delete_transit_gateway_connect_peer_request +DeleteTransitGatewayConnectPeerResult,delete_transit_gateway_connect_peer_result +DeleteTransitGatewayConnectRequest,delete_transit_gateway_connect_request +DeleteTransitGatewayConnectResult,delete_transit_gateway_connect_result +DeleteTransitGatewayMulticastDomainRequest,delete_transit_gateway_multicast_domain_request +DeleteTransitGatewayMulticastDomainResult,delete_transit_gateway_multicast_domain_result +DeleteTransitGatewayPeeringAttachmentRequest,delete_transit_gateway_peering_attachment_request +DeleteTransitGatewayPeeringAttachmentResult,delete_transit_gateway_peering_attachment_result +DeleteTransitGatewayPolicyTableRequest,delete_transit_gateway_policy_table_request +DeleteTransitGatewayPolicyTableResult,delete_transit_gateway_policy_table_result +DeleteTransitGatewayPrefixListReferenceRequest,delete_transit_gateway_prefix_list_reference_request +DeleteTransitGatewayPrefixListReferenceResult,delete_transit_gateway_prefix_list_reference_result +DeleteTransitGatewayRequest,delete_transit_gateway_request +DeleteTransitGatewayResult,delete_transit_gateway_result +DeleteTransitGatewayRouteRequest,delete_transit_gateway_route_request +DeleteTransitGatewayRouteResult,delete_transit_gateway_route_result +DeleteTransitGatewayRouteTableAnnouncementRequest,delete_transit_gateway_route_table_announcement_request +DeleteTransitGatewayRouteTableAnnouncementResult,delete_transit_gateway_route_table_announcement_result +DeleteTransitGatewayRouteTableRequest,delete_transit_gateway_route_table_request +DeleteTransitGatewayRouteTableResult,delete_transit_gateway_route_table_result +DeleteTransitGatewayVpcAttachmentRequest,delete_transit_gateway_vpc_attachment_request +DeleteTransitGatewayVpcAttachmentResult,delete_transit_gateway_vpc_attachment_result +DeleteTrialComponentRequest,delete_trial_component_request +DeleteTrialComponentResponse,delete_trial_component_response +DeleteTrialRequest,delete_trial_request +DeleteTrialResponse,delete_trial_response +DeleteTriggerRequest,delete_trigger_request +DeleteTriggerResponse,delete_trigger_response +DeleteTrustRequest,delete_trust_request +DeleteTrustResult,delete_trust_result +DeleteTrustStoreRequest,delete_trust_store_request +DeleteTypeRequest,delete_type_request +DeleteTypedLinkFacetRequest,delete_typed_link_facet_request +DeleteUnusedFMManagedResources,delete_unused_fm_managed_resources +DeleteUploadRequest,delete_upload_request +DeleteUsageLimitMessage,delete_usage_limit_message +DeleteUsageLimitRequest,delete_usage_limit_request +DeleteUsageLimitResponse,delete_usage_limit_response +DeleteUsagePlanKeyRequest,delete_usage_plan_key_request +DeleteUsagePlanRequest,delete_usage_plan_request +DeleteUseCaseRequest,delete_use_case_request +DeleteUserAccessLoggingSettingsRequest,delete_user_access_logging_settings_request +DeleteUserAttributesRequest,delete_user_attributes_request +DeleteUserByPrincipalIdRequest,delete_user_by_principal_id_request +DeleteUserByPrincipalIdResponse,delete_user_by_principal_id_response +DeleteUserDefinedFunctionRequest,delete_user_defined_function_request +DeleteUserEndpointsRequest,delete_user_endpoints_request +DeleteUserEndpointsResponse,delete_user_endpoints_response +DeleteUserGroupMessage,delete_user_group_message +DeleteUserHierarchyGroupRequest,delete_user_hierarchy_group_request +DeleteUserMessage,delete_user_message +DeleteUserPermissionsBoundaryRequest,delete_user_permissions_boundary_request +DeleteUserPolicyRequest,delete_user_policy_request +DeleteUserPoolClientRequest,delete_user_pool_client_request +DeleteUserPoolDomainRequest,delete_user_pool_domain_request +DeleteUserPoolRequest,delete_user_pool_request +DeleteUserProfileRequest,delete_user_profile_request +DeleteUserProfileResult,delete_user_profile_result +DeleteUserRequest,delete_user_request +DeleteUserResponse,delete_user_response +DeleteUserSettingsRequest,delete_user_settings_request +DeleteUtterancesRequest,delete_utterances_request +DeleteV2LoggingLevelRequest,delete_v2_logging_level_request +DeleteVPCAssociationAuthorizationRequest,delete_vpc_association_authorization_request +DeleteVPCConnectionRequest,delete_vpc_connection_request +DeleteVPCConnectionResponse,delete_vpc_connection_response +DeleteVPCEConfigurationRequest,delete_vpce_configuration_request +DeleteVariableRequest,delete_variable_request +DeleteVariantStoreRequest,delete_variant_store_request +DeleteVariantStoreResponse,delete_variant_store_response +DeleteVaultAccessPolicyInput,delete_vault_access_policy_input +DeleteVaultInput,delete_vault_input +DeleteVaultNotificationsInput,delete_vault_notifications_input +DeleteVcenterClientRequest,delete_vcenter_client_request +DeleteVectorEnrichmentJobInput,delete_vector_enrichment_job_input +DeleteVehicleRequest,delete_vehicle_request +DeleteVehicleResponse,delete_vehicle_response +DeleteVerifiedAccessEndpointRequest,delete_verified_access_endpoint_request +DeleteVerifiedAccessEndpointResult,delete_verified_access_endpoint_result +DeleteVerifiedAccessGroupRequest,delete_verified_access_group_request +DeleteVerifiedAccessGroupResult,delete_verified_access_group_result +DeleteVerifiedAccessInstanceRequest,delete_verified_access_instance_request +DeleteVerifiedAccessInstanceResult,delete_verified_access_instance_result +DeleteVerifiedAccessTrustProviderRequest,delete_verified_access_trust_provider_request +DeleteVerifiedAccessTrustProviderResult,delete_verified_access_trust_provider_result +DeleteVerifiedEmailAddressRequest,delete_verified_email_address_request +DeleteViewInput,delete_view_input +DeleteViewOutput,delete_view_output +DeleteViewRequest,delete_view_request +DeleteViewVersionRequest,delete_view_version_request +DeleteVirtualClusterRequest,delete_virtual_cluster_request +DeleteVirtualClusterResponse,delete_virtual_cluster_response +DeleteVirtualGatewayInput,delete_virtual_gateway_input +DeleteVirtualGatewayOutput,delete_virtual_gateway_output +DeleteVirtualInterfaceRequest,delete_virtual_interface_request +DeleteVirtualInterfaceResponse,delete_virtual_interface_response +DeleteVirtualMFADeviceRequest,delete_virtual_mfa_device_request +DeleteVirtualNodeInput,delete_virtual_node_input +DeleteVirtualNodeOutput,delete_virtual_node_output +DeleteVirtualRouterInput,delete_virtual_router_input +DeleteVirtualRouterOutput,delete_virtual_router_output +DeleteVirtualServiceInput,delete_virtual_service_input +DeleteVirtualServiceOutput,delete_virtual_service_output +DeleteVocabularyFilterRequest,delete_vocabulary_filter_request +DeleteVocabularyRequest,delete_vocabulary_request +DeleteVocabularyResponse,delete_vocabulary_response +DeleteVodSourceRequest,delete_vod_source_request +DeleteVoiceChannelRequest,delete_voice_channel_request +DeleteVoiceChannelResponse,delete_voice_channel_response +DeleteVoiceConnectorEmergencyCallingConfigurationRequest,delete_voice_connector_emergency_calling_configuration_request +DeleteVoiceConnectorGroupRequest,delete_voice_connector_group_request +DeleteVoiceConnectorOriginationRequest,delete_voice_connector_origination_request +DeleteVoiceConnectorProxyRequest,delete_voice_connector_proxy_request +DeleteVoiceConnectorRequest,delete_voice_connector_request +DeleteVoiceConnectorStreamingConfigurationRequest,delete_voice_connector_streaming_configuration_request +DeleteVoiceConnectorTerminationCredentialsRequest,delete_voice_connector_termination_credentials_request +DeleteVoiceConnectorTerminationRequest,delete_voice_connector_termination_request +DeleteVoiceMessageSpendLimitOverrideResult,delete_voice_message_spend_limit_override_result +DeleteVoiceProfileDomainRequest,delete_voice_profile_domain_request +DeleteVoiceProfileRequest,delete_voice_profile_request +DeleteVoiceTemplateRequest,delete_voice_template_request +DeleteVoiceTemplateResponse,delete_voice_template_response +DeleteVolumeInput,delete_volume_input +DeleteVolumeOntapConfiguration,delete_volume_ontap_configuration +DeleteVolumeOntapResponse,delete_volume_ontap_response +DeleteVolumeOpenZFSConfiguration,delete_volume_open_zfs_configuration +DeleteVolumeOutput,delete_volume_output +DeleteVolumeRequest,delete_volume_request +DeleteVolumeResponse,delete_volume_response +DeleteVolumes,delete_volumes +DeleteVpcConfig,delete_vpc_config +DeleteVpcConnectionRequest,delete_vpc_connection_request +DeleteVpcConnectionResponse,delete_vpc_connection_response +DeleteVpcConnectorRequest,delete_vpc_connector_request +DeleteVpcConnectorResponse,delete_vpc_connector_response +DeleteVpcEndpointConnectionNotificationsRequest,delete_vpc_endpoint_connection_notifications_request +DeleteVpcEndpointConnectionNotificationsResult,delete_vpc_endpoint_connection_notifications_result +DeleteVpcEndpointDetail,delete_vpc_endpoint_detail +DeleteVpcEndpointRequest,delete_vpc_endpoint_request +DeleteVpcEndpointResponse,delete_vpc_endpoint_response +DeleteVpcEndpointServiceConfigurationsRequest,delete_vpc_endpoint_service_configurations_request +DeleteVpcEndpointServiceConfigurationsResult,delete_vpc_endpoint_service_configurations_result +DeleteVpcEndpointsRequest,delete_vpc_endpoints_request +DeleteVpcEndpointsResult,delete_vpc_endpoints_result +DeleteVpcIngressConnectionRequest,delete_vpc_ingress_connection_request +DeleteVpcIngressConnectionResponse,delete_vpc_ingress_connection_response +DeleteVpcLinkRequest,delete_vpc_link_request +DeleteVpcPeeringAuthorizationInput,delete_vpc_peering_authorization_input +DeleteVpcPeeringConnectionInput,delete_vpc_peering_connection_input +DeleteVpcPeeringConnectionRequest,delete_vpc_peering_connection_request +DeleteVpcPeeringConnectionResult,delete_vpc_peering_connection_result +DeleteVpcRequest,delete_vpc_request +DeleteVpnConnectionRequest,delete_vpn_connection_request +DeleteVpnConnectionRouteRequest,delete_vpn_connection_route_request +DeleteVpnGatewayRequest,delete_vpn_gateway_request +DeleteWarmPoolType,delete_warm_pool_type +DeleteWatchlistRequest,delete_watchlist_request +DeleteWaveRequest,delete_wave_request +DeleteWebACLRequest,delete_web_acl_request +DeleteWebACLResponse,delete_web_acl_response +DeleteWebhookInput,delete_webhook_input +DeleteWebhookRequest,delete_webhook_request +DeleteWebhookResult,delete_webhook_result +DeleteWhatIfAnalysisRequest,delete_what_if_analysis_request +DeleteWhatIfForecastExportRequest,delete_what_if_forecast_export_request +DeleteWhatIfForecastRequest,delete_what_if_forecast_request +DeleteWirelessDeviceImportTaskRequest,delete_wireless_device_import_task_request +DeleteWirelessDeviceRequest,delete_wireless_device_request +DeleteWirelessGatewayRequest,delete_wireless_gateway_request +DeleteWirelessGatewayTaskDefinitionRequest,delete_wireless_gateway_task_definition_request +DeleteWirelessGatewayTaskRequest,delete_wireless_gateway_task_request +DeleteWorkGroupInput,delete_work_group_input +DeleteWorkerBlockRequest,delete_worker_block_request +DeleteWorkerFleetRequest,delete_worker_fleet_request +DeleteWorkerRequest,delete_worker_request +DeleteWorkflowRequest,delete_workflow_request +DeleteWorkflowResponse,delete_workflow_response +DeleteWorkflowStepGroupRequest,delete_workflow_step_group_request +DeleteWorkflowStepRequest,delete_workflow_step_request +DeleteWorkforceRequest,delete_workforce_request +DeleteWorkgroupRequest,delete_workgroup_request +DeleteWorkgroupResponse,delete_workgroup_response +DeleteWorkloadInput,delete_workload_input +DeleteWorkloadShareInput,delete_workload_share_input +DeleteWorkspaceApiKeyRequest,delete_workspace_api_key_request +DeleteWorkspaceApiKeyResponse,delete_workspace_api_key_response +DeleteWorkspaceBundleRequest,delete_workspace_bundle_request +DeleteWorkspaceImageRequest,delete_workspace_image_request +DeleteWorkspaceRequest,delete_workspace_request +DeleteWorkspaceResponse,delete_workspace_response +DeleteWorkteamRequest,delete_workteam_request +DeleteWorkteamResponse,delete_workteam_response +DeleteWorldTemplateRequest,delete_world_template_request +DeleteXssMatchSetRequest,delete_xss_match_set_request +DeleteXssMatchSetResponse,delete_xss_match_set_response +Deleted,deleted +DeletedAt,deleted_at +DeletedDate,deleted_date +DeletedFaces,deleted_faces +DeletedObject,deleted_object +DeletedParameters,deleted_parameters +DeletedSubnetCidrReservation,deleted_subnet_cidr_reservation +Deletes,deletes +DeletionConfig,deletion_config +DeletionDate,deletion_date +DeletionId,deletion_id +DeletionMessage,deletion_message +DeletionMode,deletion_mode +DeletionProtection,deletion_protection +DeletionProtectionEnabled,deletion_protection_enabled +DeletionStartTime,deletion_start_time +DeletionStatus,deletion_status +DeletionSummary,deletion_summary +DeletionTaskFailureReasonType,deletion_task_failure_reason_type +DeletionTaskId,deletion_task_id +DeletionTime,deletion_time +DeletionTimestamp,deletion_timestamp +DelimitedTextImportOptions,delimited_text_import_options +Delimiter,delimiter +DeliverConfigSnapshotRequest,deliver_config_snapshot_request +DeliverConfigSnapshotResponse,deliver_config_snapshot_response +DeliverCrossAccountRole,deliver_cross_account_role +DeliverLogsErrorMessage,deliver_logs_error_message +DeliverLogsPermissionArn,deliver_logs_permission_arn +DeliverLogsStatus,deliver_logs_status +DeliverabilityTestReport,deliverability_test_report +DeliverabilityTestReports,deliverability_test_reports +DeliverabilityTestStatus,deliverability_test_status +DeliveredTimestamp,delivered_timestamp +DeliveryAddress,delivery_address +DeliveryAttempts,delivery_attempts +DeliveryChannel,delivery_channel +DeliveryChannelName,delivery_channel_name +DeliveryChannelNames,delivery_channel_names +DeliveryChannelStatus,delivery_channel_status +DeliveryChannels,delivery_channels +DeliveryChannelsStatus,delivery_channels_status +DeliveryMedium,delivery_medium +DeliveryMethod,delivery_method +DeliveryOptions,delivery_options +DeliveryRestrictions,delivery_restrictions +DeliveryS3Bucket,delivery_s3_bucket +DeliveryS3KeyPrefix,delivery_s3_key_prefix +DeliveryS3Uri,delivery_s3_uri +DeliveryStartTimestamp,delivery_start_timestamp +DeliveryStatus,delivery_status +DeliveryStream,delivery_stream +DeliveryStreamARN,delivery_stream_arn +DeliveryStreamArn,delivery_stream_arn +DeliveryStreamDescription,delivery_stream_description +DeliveryStreamEncryptionConfiguration,delivery_stream_encryption_configuration +DeliveryStreamEncryptionConfigurationInput,delivery_stream_encryption_configuration_input +DeliveryStreamName,delivery_stream_name +DeliveryStreamNames,delivery_stream_names +DeliveryStreamStatus,delivery_stream_status +DeliveryStreamType,delivery_stream_type +DeliveryTime,delivery_time +DeliveryTimedOutCount,delivery_timed_out_count +DeliveryTopic,delivery_topic +DeliveryUri,delivery_uri +DeltaSyncConfig,delta_sync_config +DeltaTables,delta_tables +DeltaTarget,delta_target +DeltaTargets,delta_targets +DeltaTime,delta_time +DeltaTimeSessionWindowConfiguration,delta_time_session_window_configuration +DemodulationConfig,demodulation_config +Demographic,demographic +Denied,denied +DenoiseFilter,denoise_filter +DenyAllIgwTraffic,deny_all_igw_traffic +DenyAllTrafficToEndpoint,deny_all_traffic_to_endpoint +DenyCustomRoutingTrafficRequest,deny_custom_routing_traffic_request +DepartNow,depart_now +Department,department +DeparturePosition,departure_position +DeparturePositions,departure_positions +DepartureTime,departure_time +Dependencies,dependencies +DependencyAccessDeniedException,dependency_access_denied_exception +DependencyCopyPath,dependency_copy_path +DependencyException,dependency_exception +DependencyFailedException,dependency_failed_exception +DependencyFailureException,dependency_failure_exception +DependencyOriginPath,dependency_origin_path +DependencyRevision,dependency_revision +DependencyThrottleException,dependency_throttle_exception +DependencyTimeout,dependency_timeout +DependencyTimeoutException,dependency_timeout_exception +DependentEntities,dependent_entities +DependentEntity,dependent_entity +DependentJobName,dependent_job_name +DependentResourceIds,dependent_resource_ids +DependentService,dependent_service +DependentServiceFailureException,dependent_service_failure_exception +DependentServiceRequestThrottlingFault,dependent_service_request_throttling_fault +DependentServiceUnavailableFault,dependent_service_unavailable_fault +DependentServices,dependent_services +DependsOn,depends_on +Deploy,deploy +DeployAsApplicationConfiguration,deploy_as_application_configuration +DeployAsApplicationConfigurationDescription,deploy_as_application_configuration_description +DeployAsApplicationConfigurationUpdate,deploy_as_application_configuration_update +DeploySystemInstanceRequest,deploy_system_instance_request +DeploySystemInstanceResponse,deploy_system_instance_response +Deployed,deployed +DeployedImage,deployed_image +DeployedImages,deployed_images +DeployedStageName,deployed_stage_name +DeployedVersionSummary,deployed_version_summary +Deployment,deployment +DeploymentAction,deployment_action +DeploymentAlarms,deployment_alarms +DeploymentAlreadyCompletedException,deployment_already_completed_exception +DeploymentApplicationConfig,deployment_application_config +DeploymentArn,deployment_arn +DeploymentCanarySettings,deployment_canary_settings +DeploymentCircuitBreaker,deployment_circuit_breaker +DeploymentCommand,deployment_command +DeploymentComponentUpdatePolicy,deployment_component_update_policy +DeploymentConfig,deployment_config +DeploymentConfigAlreadyExistsException,deployment_config_already_exists_exception +DeploymentConfigDoesNotExistException,deployment_config_does_not_exist_exception +DeploymentConfigInUseException,deployment_config_in_use_exception +DeploymentConfigInfo,deployment_config_info +DeploymentConfigLimitExceededException,deployment_config_limit_exceeded_exception +DeploymentConfigNameRequiredException,deployment_config_name_required_exception +DeploymentConfiguration,deployment_configuration +DeploymentConfigurationValidationPolicy,deployment_configuration_validation_policy +DeploymentController,deployment_controller +DeploymentDoesNotExistException,deployment_does_not_exist_exception +DeploymentDurationInMinutes,deployment_duration_in_minutes +DeploymentEndTime,deployment_end_time +DeploymentEvent,deployment_event +DeploymentGroupAlreadyExistsException,deployment_group_already_exists_exception +DeploymentGroupDoesNotExistException,deployment_group_does_not_exist_exception +DeploymentGroupInfo,deployment_group_info +DeploymentGroupLimitExceededException,deployment_group_limit_exceeded_exception +DeploymentGroupNameRequiredException,deployment_group_name_required_exception +DeploymentId,deployment_id +DeploymentIdRequiredException,deployment_id_required_exception +DeploymentIds,deployment_ids +DeploymentInfo,deployment_info +DeploymentIoTJobConfiguration,deployment_io_t_job_configuration +DeploymentIsNotInReadyStateException,deployment_is_not_in_ready_state_exception +DeploymentJob,deployment_job +DeploymentLaunchConfig,deployment_launch_config +DeploymentLimitExceededException,deployment_limit_exceeded_exception +DeploymentMode,deployment_mode +DeploymentModel,deployment_model +DeploymentModels,deployment_models +DeploymentName,deployment_name +DeploymentNotStartedException,deployment_not_started_exception +DeploymentNumber,deployment_number +DeploymentOption,deployment_option +DeploymentOverview,deployment_overview +DeploymentPolicies,deployment_policies +DeploymentReadyOption,deployment_ready_option +DeploymentRecommendation,deployment_recommendation +DeploymentResult,deployment_result +DeploymentStage,deployment_stage +DeploymentStageStatusSummary,deployment_stage_status_summary +DeploymentStartTime,deployment_start_time +DeploymentState,deployment_state +DeploymentStatus,deployment_status +DeploymentStatusMessage,deployment_status_message +DeploymentStrategies,deployment_strategies +DeploymentStrategy,deployment_strategy +DeploymentStrategyId,deployment_strategy_id +DeploymentStyle,deployment_style +DeploymentSummary,deployment_summary +DeploymentTarget,deployment_target +DeploymentTargetDoesNotExistException,deployment_target_does_not_exist_exception +DeploymentTargetIdRequiredException,deployment_target_id_required_exception +DeploymentTargetListSizeExceededException,deployment_target_list_size_exceeded_exception +DeploymentTargets,deployment_targets +DeploymentTime,deployment_time +DeploymentType,deployment_type +Deployments,deployments +DeprecateActivityTypeInput,deprecate_activity_type_input +DeprecateAt,deprecate_at +DeprecateDomainInput,deprecate_domain_input +DeprecateFlowTemplateRequest,deprecate_flow_template_request +DeprecateRule,deprecate_rule +DeprecateSystemTemplateRequest,deprecate_system_template_request +DeprecateThingTypeRequest,deprecate_thing_type_request +DeprecateWorkflowTypeInput,deprecate_workflow_type_input +DeprecatedStatus,deprecated_status +DeprecationDate,deprecation_date +DeprecationTime,deprecation_time +DeprovisionByoipCidrRequest,deprovision_byoip_cidr_request +DeprovisionByoipCidrResponse,deprovision_byoip_cidr_response +DeprovisionByoipCidrResult,deprovision_byoip_cidr_result +DeprovisionIpamPoolCidrRequest,deprovision_ipam_pool_cidr_request +DeprovisionIpamPoolCidrResult,deprovision_ipam_pool_cidr_result +DeprovisionPublicIpv4PoolCidrRequest,deprovision_public_ipv4_pool_cidr_request +DeprovisionPublicIpv4PoolCidrResult,deprovision_public_ipv4_pool_cidr_result +DeprovisionedAddresses,deprovisioned_addresses +DeregisterAccountResponse,deregister_account_response +DeregisterAppInstanceUserEndpointRequest,deregister_app_instance_user_endpoint_request +DeregisterApplicationInput,deregister_application_input +DeregisterCertificateRequest,deregister_certificate_request +DeregisterClusterRequest,deregister_cluster_request +DeregisterClusterResponse,deregister_cluster_response +DeregisterComputeInput,deregister_compute_input +DeregisterContainerInstanceRequest,deregister_container_instance_request +DeregisterContainerInstanceResponse,deregister_container_instance_response +DeregisterDBProxyTargetsRequest,deregister_db_proxy_targets_request +DeregisterDelegatedAdministratorRequest,deregister_delegated_administrator_request +DeregisterDevicesRequest,deregister_devices_request +DeregisterEcsClusterRequest,deregister_ecs_cluster_request +DeregisterElasticIpRequest,deregister_elastic_ip_request +DeregisterEndPointsInput,deregister_end_points_input +DeregisterEndPointsOutput,deregister_end_points_output +DeregisterEventTopicRequest,deregister_event_topic_request +DeregisterFromWorkMailRequest,deregister_from_work_mail_request +DeregisterGameServerInput,deregister_game_server_input +DeregisterGatewayInstanceRequest,deregister_gateway_instance_request +DeregisterGatewayInstanceResponse,deregister_gateway_instance_response +DeregisterIdentityProviderRequest,deregister_identity_provider_request +DeregisterIdentityProviderResponse,deregister_identity_provider_response +DeregisterImageRequest,deregister_image_request +DeregisterInstanceEventNotificationAttributesRequest,deregister_instance_event_notification_attributes_request +DeregisterInstanceEventNotificationAttributesResult,deregister_instance_event_notification_attributes_result +DeregisterInstanceRequest,deregister_instance_request +DeregisterInstanceResponse,deregister_instance_response +DeregisterInstanceTagAttributeRequest,deregister_instance_tag_attribute_request +DeregisterJobDefinitionRequest,deregister_job_definition_request +DeregisterMailDomainRequest,deregister_mail_domain_request +DeregisterManagedInstanceRequest,deregister_managed_instance_request +DeregisterOnPremisesInstanceInput,deregister_on_premises_instance_input +DeregisterOrganizationAdminAccountRequest,deregister_organization_admin_account_request +DeregisterOrganizationDelegatedAdminRequest,deregister_organization_delegated_admin_request +DeregisterPackageVersionRequest,deregister_package_version_request +DeregisterPatchBaselineForPatchGroupRequest,deregister_patch_baseline_for_patch_group_request +DeregisterPatchBaselineForPatchGroupResult,deregister_patch_baseline_for_patch_group_result +DeregisterRdsDbInstanceRequest,deregister_rds_db_instance_request +DeregisterResourceRequest,deregister_resource_request +DeregisterRobotRequest,deregister_robot_request +DeregisterRobotResponse,deregister_robot_response +DeregisterScalableTargetRequest,deregister_scalable_target_request +DeregisterStreamConsumerInput,deregister_stream_consumer_input +DeregisterTargetFromMaintenanceWindowRequest,deregister_target_from_maintenance_window_request +DeregisterTargetFromMaintenanceWindowResult,deregister_target_from_maintenance_window_result +DeregisterTargetsInput,deregister_targets_input +DeregisterTargetsRequest,deregister_targets_request +DeregisterTargetsResponse,deregister_targets_response +DeregisterTaskDefinitionRequest,deregister_task_definition_request +DeregisterTaskDefinitionResponse,deregister_task_definition_response +DeregisterTaskFromMaintenanceWindowRequest,deregister_task_from_maintenance_window_request +DeregisterTaskFromMaintenanceWindowResult,deregister_task_from_maintenance_window_result +DeregisterTransitGatewayMulticastGroupMembersRequest,deregister_transit_gateway_multicast_group_members_request +DeregisterTransitGatewayMulticastGroupMembersResult,deregister_transit_gateway_multicast_group_members_result +DeregisterTransitGatewayMulticastGroupSourcesRequest,deregister_transit_gateway_multicast_group_sources_request +DeregisterTransitGatewayMulticastGroupSourcesResult,deregister_transit_gateway_multicast_group_sources_result +DeregisterTransitGatewayRequest,deregister_transit_gateway_request +DeregisterTransitGatewayResponse,deregister_transit_gateway_response +DeregisterTypeInput,deregister_type_input +DeregisterVolumeRequest,deregister_volume_request +DeregisterWebhookWithThirdPartyInput,deregister_webhook_with_third_party_input +DeregisterWirelessDeviceRequest,deregister_wireless_device_request +DeregisterWorkspaceDirectoryRequest,deregister_workspace_directory_request +DeregisteredMulticastGroupMembers,deregistered_multicast_group_members +DeregisteredMulticastGroupSources,deregistered_multicast_group_sources +DeregisteredNetworkInterfaceIds,deregistered_network_interface_ids +Deregistering,deregistering +DeregistrationPolicy,deregistration_policy +DeriveKey,derive_key +DerivedDataInputConfig,derived_data_input_config +DerivedInformation,derived_information +DescribeACLsRequest,describe_acls_request +DescribeACLsResponse,describe_acls_response +DescribeAcceleratorAttributesRequest,describe_accelerator_attributes_request +DescribeAcceleratorAttributesResponse,describe_accelerator_attributes_response +DescribeAcceleratorOfferingsRequest,describe_accelerator_offerings_request +DescribeAcceleratorOfferingsResponse,describe_accelerator_offerings_response +DescribeAcceleratorRequest,describe_accelerator_request +DescribeAcceleratorResponse,describe_accelerator_response +DescribeAcceleratorTypesResponse,describe_accelerator_types_response +DescribeAcceleratorsRequest,describe_accelerators_request +DescribeAcceleratorsResponse,describe_accelerators_response +DescribeAccessControlConfigurationRequest,describe_access_control_configuration_request +DescribeAccessControlConfigurationResponse,describe_access_control_configuration_response +DescribeAccessPointsInput,describe_access_points_input +DescribeAccessPointsOutput,describe_access_points_output +DescribeAccessPointsRequest,describe_access_points_request +DescribeAccessPointsResponse,describe_access_points_response +DescribeAccessPolicyRequest,describe_access_policy_request +DescribeAccessPolicyResponse,describe_access_policy_response +DescribeAccessRequest,describe_access_request +DescribeAccessResponse,describe_access_response +DescribeAccountAssignmentCreationStatusRequest,describe_account_assignment_creation_status_request +DescribeAccountAssignmentCreationStatusResponse,describe_account_assignment_creation_status_response +DescribeAccountAssignmentDeletionStatusRequest,describe_account_assignment_deletion_status_request +DescribeAccountAssignmentDeletionStatusResponse,describe_account_assignment_deletion_status_response +DescribeAccountAttributesMessage,describe_account_attributes_message +DescribeAccountAttributesRequest,describe_account_attributes_request +DescribeAccountAttributesResponse,describe_account_attributes_response +DescribeAccountAttributesResult,describe_account_attributes_result +DescribeAccountAuditConfigurationResponse,describe_account_audit_configuration_response +DescribeAccountConfigurationResponse,describe_account_configuration_response +DescribeAccountCustomizationRequest,describe_account_customization_request +DescribeAccountCustomizationResponse,describe_account_customization_response +DescribeAccountHealthResponse,describe_account_health_response +DescribeAccountLimitsAnswer,describe_account_limits_answer +DescribeAccountLimitsInput,describe_account_limits_input +DescribeAccountLimitsOutput,describe_account_limits_output +DescribeAccountLimitsRequest,describe_account_limits_request +DescribeAccountLimitsResult,describe_account_limits_result +DescribeAccountModificationsRequest,describe_account_modifications_request +DescribeAccountModificationsResult,describe_account_modifications_result +DescribeAccountOverviewRequest,describe_account_overview_request +DescribeAccountOverviewResponse,describe_account_overview_response +DescribeAccountPoliciesRequest,describe_account_policies_request +DescribeAccountPoliciesResponse,describe_account_policies_response +DescribeAccountPreferencesRequest,describe_account_preferences_request +DescribeAccountPreferencesResponse,describe_account_preferences_response +DescribeAccountRequest,describe_account_request +DescribeAccountResponse,describe_account_response +DescribeAccountResult,describe_account_result +DescribeAccountSettingsRequest,describe_account_settings_request +DescribeAccountSettingsResponse,describe_account_settings_response +DescribeAccountSubscriptionRequest,describe_account_subscription_request +DescribeAccountSubscriptionResponse,describe_account_subscription_response +DescribeActionRequest,describe_action_request +DescribeActionResponse,describe_action_response +DescribeActionTargetsRequest,describe_action_targets_request +DescribeActionTargetsResponse,describe_action_targets_response +DescribeActivationsFilter,describe_activations_filter +DescribeActivationsRequest,describe_activations_request +DescribeActivationsResult,describe_activations_result +DescribeActiveReceiptRuleSetResponse,describe_active_receipt_rule_set_response +DescribeActivitiesRequest,describe_activities_request +DescribeActivitiesResponse,describe_activities_response +DescribeActivityInput,describe_activity_input +DescribeActivityOutput,describe_activity_output +DescribeActivityTypeInput,describe_activity_type_input +DescribeAddonConfigurationRequest,describe_addon_configuration_request +DescribeAddonConfigurationResponse,describe_addon_configuration_response +DescribeAddonRequest,describe_addon_request +DescribeAddonResponse,describe_addon_response +DescribeAddonVersionsRequest,describe_addon_versions_request +DescribeAddonVersionsResponse,describe_addon_versions_response +DescribeAddressRequest,describe_address_request +DescribeAddressResult,describe_address_result +DescribeAddressTransfersRequest,describe_address_transfers_request +DescribeAddressTransfersResult,describe_address_transfers_result +DescribeAddressesAttributeRequest,describe_addresses_attribute_request +DescribeAddressesAttributeResult,describe_addresses_attribute_result +DescribeAddressesRequest,describe_addresses_request +DescribeAddressesResult,describe_addresses_result +DescribeAdjustmentTypesAnswer,describe_adjustment_types_answer +DescribeAffectedAccountsForOrganizationRequest,describe_affected_accounts_for_organization_request +DescribeAffectedAccountsForOrganizationResponse,describe_affected_accounts_for_organization_response +DescribeAffectedEntitiesForOrganizationRequest,describe_affected_entities_for_organization_request +DescribeAffectedEntitiesForOrganizationResponse,describe_affected_entities_for_organization_response +DescribeAffectedEntitiesRequest,describe_affected_entities_request +DescribeAffectedEntitiesResponse,describe_affected_entities_response +DescribeAgentRequest,describe_agent_request +DescribeAgentResponse,describe_agent_response +DescribeAgentStatusRequest,describe_agent_status_request +DescribeAgentStatusResponse,describe_agent_status_response +DescribeAgentVersionsRequest,describe_agent_versions_request +DescribeAgentVersionsResult,describe_agent_versions_result +DescribeAgentsRequest,describe_agents_request +DescribeAgentsResponse,describe_agents_response +DescribeAggregateComplianceByConfigRulesRequest,describe_aggregate_compliance_by_config_rules_request +DescribeAggregateComplianceByConfigRulesResponse,describe_aggregate_compliance_by_config_rules_response +DescribeAggregateComplianceByConformancePacksRequest,describe_aggregate_compliance_by_conformance_packs_request +DescribeAggregateComplianceByConformancePacksResponse,describe_aggregate_compliance_by_conformance_packs_response +DescribeAggregateIdFormatRequest,describe_aggregate_id_format_request +DescribeAggregateIdFormatResult,describe_aggregate_id_format_result +DescribeAggregationAuthorizationsRequest,describe_aggregation_authorizations_request +DescribeAggregationAuthorizationsResponse,describe_aggregation_authorizations_response +DescribeAgreementRequest,describe_agreement_request +DescribeAgreementResponse,describe_agreement_response +DescribeAlarmHistoryInput,describe_alarm_history_input +DescribeAlarmHistoryOutput,describe_alarm_history_output +DescribeAlarmModelRequest,describe_alarm_model_request +DescribeAlarmModelResponse,describe_alarm_model_response +DescribeAlarmRequest,describe_alarm_request +DescribeAlarmResponse,describe_alarm_response +DescribeAlarmsForMetricInput,describe_alarms_for_metric_input +DescribeAlarmsForMetricOutput,describe_alarms_for_metric_output +DescribeAlarmsInput,describe_alarms_input +DescribeAlarmsOutput,describe_alarms_output +DescribeAlertManagerDefinitionRequest,describe_alert_manager_definition_request +DescribeAlertManagerDefinitionResponse,describe_alert_manager_definition_response +DescribeAlertRequest,describe_alert_request +DescribeAlertResponse,describe_alert_response +DescribeAlgorithmInput,describe_algorithm_input +DescribeAlgorithmOutput,describe_algorithm_output +DescribeAlgorithmRequest,describe_algorithm_request +DescribeAlgorithmResponse,describe_algorithm_response +DescribeAliasInput,describe_alias_input +DescribeAliasOutput,describe_alias_output +DescribeAllManagedProductsRequest,describe_all_managed_products_request +DescribeAllManagedProductsResponse,describe_all_managed_products_response +DescribeAnalysisDefinitionRequest,describe_analysis_definition_request +DescribeAnalysisDefinitionResponse,describe_analysis_definition_response +DescribeAnalysisPermissionsRequest,describe_analysis_permissions_request +DescribeAnalysisPermissionsResponse,describe_analysis_permissions_response +DescribeAnalysisRequest,describe_analysis_request +DescribeAnalysisResponse,describe_analysis_response +DescribeAnalysisSchemesRequest,describe_analysis_schemes_request +DescribeAnalysisSchemesResponse,describe_analysis_schemes_response +DescribeAnomalyDetectionExecutionsRequest,describe_anomaly_detection_executions_request +DescribeAnomalyDetectionExecutionsResponse,describe_anomaly_detection_executions_response +DescribeAnomalyDetectorRequest,describe_anomaly_detector_request +DescribeAnomalyDetectorResponse,describe_anomaly_detector_response +DescribeAnomalyDetectorsInput,describe_anomaly_detectors_input +DescribeAnomalyDetectorsOutput,describe_anomaly_detectors_output +DescribeAnomalyRequest,describe_anomaly_request +DescribeAnomalyResponse,describe_anomaly_response +DescribeApiDestinationRequest,describe_api_destination_request +DescribeApiDestinationResponse,describe_api_destination_response +DescribeAppAssessmentRequest,describe_app_assessment_request +DescribeAppAssessmentResponse,describe_app_assessment_response +DescribeAppBlockBuilderAppBlockAssociationsRequest,describe_app_block_builder_app_block_associations_request +DescribeAppBlockBuilderAppBlockAssociationsResult,describe_app_block_builder_app_block_associations_result +DescribeAppBlockBuildersRequest,describe_app_block_builders_request +DescribeAppBlockBuildersResult,describe_app_block_builders_result +DescribeAppBlocksRequest,describe_app_blocks_request +DescribeAppBlocksResult,describe_app_blocks_result +DescribeAppImageConfigRequest,describe_app_image_config_request +DescribeAppImageConfigResponse,describe_app_image_config_response +DescribeAppInput,describe_app_input +DescribeAppInstanceAdminRequest,describe_app_instance_admin_request +DescribeAppInstanceAdminResponse,describe_app_instance_admin_response +DescribeAppInstanceBotRequest,describe_app_instance_bot_request +DescribeAppInstanceBotResponse,describe_app_instance_bot_response +DescribeAppInstanceRequest,describe_app_instance_request +DescribeAppInstanceResponse,describe_app_instance_response +DescribeAppInstanceUserEndpointRequest,describe_app_instance_user_endpoint_request +DescribeAppInstanceUserEndpointResponse,describe_app_instance_user_endpoint_response +DescribeAppInstanceUserRequest,describe_app_instance_user_request +DescribeAppInstanceUserResponse,describe_app_instance_user_response +DescribeAppOutput,describe_app_output +DescribeAppRequest,describe_app_request +DescribeAppResponse,describe_app_response +DescribeAppVersionAppComponentRequest,describe_app_version_app_component_request +DescribeAppVersionAppComponentResponse,describe_app_version_app_component_response +DescribeAppVersionRequest,describe_app_version_request +DescribeAppVersionResourceRequest,describe_app_version_resource_request +DescribeAppVersionResourceResponse,describe_app_version_resource_response +DescribeAppVersionResourcesResolutionStatusRequest,describe_app_version_resources_resolution_status_request +DescribeAppVersionResourcesResolutionStatusResponse,describe_app_version_resources_resolution_status_response +DescribeAppVersionResponse,describe_app_version_response +DescribeAppVersionTemplateRequest,describe_app_version_template_request +DescribeAppVersionTemplateResponse,describe_app_version_template_response +DescribeApplicableIndividualAssessmentsMessage,describe_applicable_individual_assessments_message +DescribeApplicableIndividualAssessmentsResponse,describe_applicable_individual_assessments_response +DescribeApplicationFleetAssociationsRequest,describe_application_fleet_associations_request +DescribeApplicationFleetAssociationsResult,describe_application_fleet_associations_result +DescribeApplicationInstanceDetailsRequest,describe_application_instance_details_request +DescribeApplicationInstanceDetailsResponse,describe_application_instance_details_response +DescribeApplicationInstanceRequest,describe_application_instance_request +DescribeApplicationInstanceResponse,describe_application_instance_response +DescribeApplicationRequest,describe_application_request +DescribeApplicationResponse,describe_application_response +DescribeApplicationSnapshotRequest,describe_application_snapshot_request +DescribeApplicationSnapshotResponse,describe_application_snapshot_response +DescribeApplicationStateRequest,describe_application_state_request +DescribeApplicationStateResult,describe_application_state_result +DescribeApplicationVersionRequest,describe_application_version_request +DescribeApplicationVersionResponse,describe_application_version_response +DescribeApplicationVersionsMessage,describe_application_versions_message +DescribeApplicationsMessage,describe_applications_message +DescribeApplicationsRequest,describe_applications_request +DescribeApplicationsResult,describe_applications_result +DescribeAppsRequest,describe_apps_request +DescribeAppsResult,describe_apps_result +DescribeArchiveRequest,describe_archive_request +DescribeArchiveResponse,describe_archive_response +DescribeArtifactRequest,describe_artifact_request +DescribeArtifactResponse,describe_artifact_response +DescribeAssessmentRunsRequest,describe_assessment_runs_request +DescribeAssessmentRunsResponse,describe_assessment_runs_response +DescribeAssessmentTargetsRequest,describe_assessment_targets_request +DescribeAssessmentTargetsResponse,describe_assessment_targets_response +DescribeAssessmentTemplatesRequest,describe_assessment_templates_request +DescribeAssessmentTemplatesResponse,describe_assessment_templates_response +DescribeAssetBundleExportJobRequest,describe_asset_bundle_export_job_request +DescribeAssetBundleExportJobResponse,describe_asset_bundle_export_job_response +DescribeAssetBundleImportJobRequest,describe_asset_bundle_import_job_request +DescribeAssetBundleImportJobResponse,describe_asset_bundle_import_job_response +DescribeAssetModelRequest,describe_asset_model_request +DescribeAssetModelResponse,describe_asset_model_response +DescribeAssetPropertyRequest,describe_asset_property_request +DescribeAssetPropertyResponse,describe_asset_property_response +DescribeAssetRequest,describe_asset_request +DescribeAssetResponse,describe_asset_response +DescribeAssociationExecutionTargetsRequest,describe_association_execution_targets_request +DescribeAssociationExecutionTargetsResult,describe_association_execution_targets_result +DescribeAssociationExecutionsRequest,describe_association_executions_request +DescribeAssociationExecutionsResult,describe_association_executions_result +DescribeAssociationRequest,describe_association_request +DescribeAssociationResult,describe_association_result +DescribeAttachmentLimitExceeded,describe_attachment_limit_exceeded +DescribeAttachmentRequest,describe_attachment_request +DescribeAttachmentResponse,describe_attachment_response +DescribeAttackRequest,describe_attack_request +DescribeAttackResponse,describe_attack_response +DescribeAttackStatisticsResponse,describe_attack_statistics_response +DescribeAuditFindingRequest,describe_audit_finding_request +DescribeAuditFindingResponse,describe_audit_finding_response +DescribeAuditMitigationActionsTaskRequest,describe_audit_mitigation_actions_task_request +DescribeAuditMitigationActionsTaskResponse,describe_audit_mitigation_actions_task_response +DescribeAuditStreamConfigurationRequest,describe_audit_stream_configuration_request +DescribeAuditStreamConfigurationResponse,describe_audit_stream_configuration_response +DescribeAuditSuppressionRequest,describe_audit_suppression_request +DescribeAuditSuppressionResponse,describe_audit_suppression_response +DescribeAuditTaskRequest,describe_audit_task_request +DescribeAuditTaskResponse,describe_audit_task_response +DescribeAuthenticationProfilesMessage,describe_authentication_profiles_message +DescribeAuthenticationProfilesResult,describe_authentication_profiles_result +DescribeAuthorizerRequest,describe_authorizer_request +DescribeAuthorizerResponse,describe_authorizer_response +DescribeAutoMLJobRequest,describe_auto_ml_job_request +DescribeAutoMLJobResponse,describe_auto_ml_job_response +DescribeAutoMLJobV2Request,describe_auto_ml_job_v2_request +DescribeAutoMLJobV2Response,describe_auto_ml_job_v2_response +DescribeAutoPredictorRequest,describe_auto_predictor_request +DescribeAutoPredictorResponse,describe_auto_predictor_response +DescribeAutoScalingConfigurationRequest,describe_auto_scaling_configuration_request +DescribeAutoScalingConfigurationResponse,describe_auto_scaling_configuration_response +DescribeAutoScalingInstancesType,describe_auto_scaling_instances_type +DescribeAutoScalingNotificationTypesAnswer,describe_auto_scaling_notification_types_answer +DescribeAutomationExecutionsRequest,describe_automation_executions_request +DescribeAutomationExecutionsResult,describe_automation_executions_result +DescribeAutomationStepExecutionsRequest,describe_automation_step_executions_request +DescribeAutomationStepExecutionsResult,describe_automation_step_executions_result +DescribeAvailabilityMonitorTestInput,describe_availability_monitor_test_input +DescribeAvailabilityMonitorTestOutput,describe_availability_monitor_test_output +DescribeAvailabilityOptionsRequest,describe_availability_options_request +DescribeAvailabilityOptionsResponse,describe_availability_options_response +DescribeAvailabilityZonesRequest,describe_availability_zones_request +DescribeAvailabilityZonesResult,describe_availability_zones_result +DescribeAvailablePatchesRequest,describe_available_patches_request +DescribeAvailablePatchesResult,describe_available_patches_result +DescribeAwsNetworkPerformanceMetricSubscriptionsRequest,describe_aws_network_performance_metric_subscriptions_request +DescribeAwsNetworkPerformanceMetricSubscriptionsResult,describe_aws_network_performance_metric_subscriptions_result +DescribeBackupInput,describe_backup_input +DescribeBackupJobInput,describe_backup_job_input +DescribeBackupJobOutput,describe_backup_job_output +DescribeBackupOutput,describe_backup_output +DescribeBackupPolicyRequest,describe_backup_policy_request +DescribeBackupVaultInput,describe_backup_vault_input +DescribeBackupVaultOutput,describe_backup_vault_output +DescribeBackupsRequest,describe_backups_request +DescribeBackupsResponse,describe_backups_response +DescribeBandwidthRateLimitInput,describe_bandwidth_rate_limit_input +DescribeBandwidthRateLimitOutput,describe_bandwidth_rate_limit_output +DescribeBandwidthRateLimitScheduleInput,describe_bandwidth_rate_limit_schedule_input +DescribeBandwidthRateLimitScheduleOutput,describe_bandwidth_rate_limit_schedule_output +DescribeBatchInferenceJobRequest,describe_batch_inference_job_request +DescribeBatchInferenceJobResponse,describe_batch_inference_job_response +DescribeBatchLoadTaskRequest,describe_batch_load_task_request +DescribeBatchLoadTaskResponse,describe_batch_load_task_response +DescribeBatchPredictionsInput,describe_batch_predictions_input +DescribeBatchPredictionsOutput,describe_batch_predictions_output +DescribeBatchSegmentJobRequest,describe_batch_segment_job_request +DescribeBatchSegmentJobResponse,describe_batch_segment_job_response +DescribeBillingGroupRequest,describe_billing_group_request +DescribeBillingGroupResponse,describe_billing_group_response +DescribeBlueGreenDeploymentsRequest,describe_blue_green_deployments_request +DescribeBlueGreenDeploymentsResponse,describe_blue_green_deployments_response +DescribeBotAliasRequest,describe_bot_alias_request +DescribeBotAliasResponse,describe_bot_alias_response +DescribeBotLocaleRequest,describe_bot_locale_request +DescribeBotLocaleResponse,describe_bot_locale_response +DescribeBotRecommendationRequest,describe_bot_recommendation_request +DescribeBotRecommendationResponse,describe_bot_recommendation_response +DescribeBotRequest,describe_bot_request +DescribeBotResponse,describe_bot_response +DescribeBotVersionRequest,describe_bot_version_request +DescribeBotVersionResponse,describe_bot_version_response +DescribeBridgeRequest,describe_bridge_request +DescribeBridgeResponse,describe_bridge_response +DescribeBrokerEngineTypesRequest,describe_broker_engine_types_request +DescribeBrokerEngineTypesResponse,describe_broker_engine_types_response +DescribeBrokerInstanceOptionsRequest,describe_broker_instance_options_request +DescribeBrokerInstanceOptionsResponse,describe_broker_instance_options_response +DescribeBrokerRequest,describe_broker_request +DescribeBrokerResponse,describe_broker_response +DescribeBucketsRequest,describe_buckets_request +DescribeBucketsResponse,describe_buckets_response +DescribeBudgetActionHistoriesRequest,describe_budget_action_histories_request +DescribeBudgetActionHistoriesResponse,describe_budget_action_histories_response +DescribeBudgetActionRequest,describe_budget_action_request +DescribeBudgetActionResponse,describe_budget_action_response +DescribeBudgetActionsForAccountRequest,describe_budget_actions_for_account_request +DescribeBudgetActionsForAccountResponse,describe_budget_actions_for_account_response +DescribeBudgetActionsForBudgetRequest,describe_budget_actions_for_budget_request +DescribeBudgetActionsForBudgetResponse,describe_budget_actions_for_budget_response +DescribeBudgetNotificationsForAccountRequest,describe_budget_notifications_for_account_request +DescribeBudgetNotificationsForAccountResponse,describe_budget_notifications_for_account_response +DescribeBudgetPerformanceHistoryRequest,describe_budget_performance_history_request +DescribeBudgetPerformanceHistoryResponse,describe_budget_performance_history_response +DescribeBudgetRequest,describe_budget_request +DescribeBudgetResponse,describe_budget_response +DescribeBudgetsRequest,describe_budgets_request +DescribeBudgetsResponse,describe_budgets_response +DescribeBuildInput,describe_build_input +DescribeBuildOutput,describe_build_output +DescribeBulkImportJobRequest,describe_bulk_import_job_request +DescribeBulkImportJobResponse,describe_bulk_import_job_response +DescribeBundleRequest,describe_bundle_request +DescribeBundleResult,describe_bundle_result +DescribeBundleTasksRequest,describe_bundle_tasks_request +DescribeBundleTasksResult,describe_bundle_tasks_result +DescribeByoipCidrsRequest,describe_byoip_cidrs_request +DescribeByoipCidrsResult,describe_byoip_cidrs_result +DescribeCACertificateRequest,describe_ca_certificate_request +DescribeCACertificateResponse,describe_ca_certificate_response +DescribeCacheClustersMessage,describe_cache_clusters_message +DescribeCacheEngineVersionsMessage,describe_cache_engine_versions_message +DescribeCacheInput,describe_cache_input +DescribeCacheOutput,describe_cache_output +DescribeCacheParameterGroupsMessage,describe_cache_parameter_groups_message +DescribeCacheParametersMessage,describe_cache_parameters_message +DescribeCacheSecurityGroupsMessage,describe_cache_security_groups_message +DescribeCacheSubnetGroupsMessage,describe_cache_subnet_groups_message +DescribeCachediSCSIVolumesInput,describe_cachedi_scsi_volumes_input +DescribeCachediSCSIVolumesOutput,describe_cachedi_scsi_volumes_output +DescribeCampaignRequest,describe_campaign_request +DescribeCampaignResponse,describe_campaign_response +DescribeCanariesLastRunRequest,describe_canaries_last_run_request +DescribeCanariesLastRunResponse,describe_canaries_last_run_response +DescribeCanariesRequest,describe_canaries_request +DescribeCanariesResponse,describe_canaries_response +DescribeCapacityProvidersRequest,describe_capacity_providers_request +DescribeCapacityProvidersResponse,describe_capacity_providers_response +DescribeCapacityReservationFleetsRequest,describe_capacity_reservation_fleets_request +DescribeCapacityReservationFleetsResult,describe_capacity_reservation_fleets_result +DescribeCapacityReservationsRequest,describe_capacity_reservations_request +DescribeCapacityReservationsResult,describe_capacity_reservations_result +DescribeCarrierGatewaysRequest,describe_carrier_gateways_request +DescribeCarrierGatewaysResult,describe_carrier_gateways_result +DescribeCasesRequest,describe_cases_request +DescribeCasesResponse,describe_cases_response +DescribeCertificateAuthorityAuditReportRequest,describe_certificate_authority_audit_report_request +DescribeCertificateAuthorityAuditReportResponse,describe_certificate_authority_audit_report_response +DescribeCertificateAuthorityRequest,describe_certificate_authority_request +DescribeCertificateAuthorityResponse,describe_certificate_authority_response +DescribeCertificateRequest,describe_certificate_request +DescribeCertificateResponse,describe_certificate_response +DescribeCertificateResult,describe_certificate_result +DescribeCertificatesMessage,describe_certificates_message +DescribeCertificatesResponse,describe_certificates_response +DescribeChangeSetHooksInput,describe_change_set_hooks_input +DescribeChangeSetHooksOutput,describe_change_set_hooks_output +DescribeChangeSetInput,describe_change_set_input +DescribeChangeSetOutput,describe_change_set_output +DescribeChangeSetRequest,describe_change_set_request +DescribeChangeSetResponse,describe_change_set_response +DescribeChannelBanRequest,describe_channel_ban_request +DescribeChannelBanResponse,describe_channel_ban_response +DescribeChannelFlowRequest,describe_channel_flow_request +DescribeChannelFlowResponse,describe_channel_flow_response +DescribeChannelMembershipForAppInstanceUserRequest,describe_channel_membership_for_app_instance_user_request +DescribeChannelMembershipForAppInstanceUserResponse,describe_channel_membership_for_app_instance_user_response +DescribeChannelMembershipRequest,describe_channel_membership_request +DescribeChannelMembershipResponse,describe_channel_membership_response +DescribeChannelModeratedByAppInstanceUserRequest,describe_channel_moderated_by_app_instance_user_request +DescribeChannelModeratedByAppInstanceUserResponse,describe_channel_moderated_by_app_instance_user_response +DescribeChannelModeratorRequest,describe_channel_moderator_request +DescribeChannelModeratorResponse,describe_channel_moderator_response +DescribeChannelRequest,describe_channel_request +DescribeChannelResponse,describe_channel_response +DescribeChapCredentialsInput,describe_chap_credentials_input +DescribeChapCredentialsOutput,describe_chap_credentials_output +DescribeClassicLinkInstancesRequest,describe_classic_link_instances_request +DescribeClassicLinkInstancesResult,describe_classic_link_instances_result +DescribeClassificationJobRequest,describe_classification_job_request +DescribeClassificationJobResponse,describe_classification_job_response +DescribeClientAuthenticationSettingsRequest,describe_client_authentication_settings_request +DescribeClientAuthenticationSettingsResult,describe_client_authentication_settings_result +DescribeClientBrandingRequest,describe_client_branding_request +DescribeClientBrandingResult,describe_client_branding_result +DescribeClientPropertiesRequest,describe_client_properties_request +DescribeClientPropertiesResult,describe_client_properties_result +DescribeClientVpnAuthorizationRulesRequest,describe_client_vpn_authorization_rules_request +DescribeClientVpnAuthorizationRulesResult,describe_client_vpn_authorization_rules_result +DescribeClientVpnConnectionsRequest,describe_client_vpn_connections_request +DescribeClientVpnConnectionsResult,describe_client_vpn_connections_result +DescribeClientVpnEndpointsRequest,describe_client_vpn_endpoints_request +DescribeClientVpnEndpointsResult,describe_client_vpn_endpoints_result +DescribeClientVpnRoutesRequest,describe_client_vpn_routes_request +DescribeClientVpnRoutesResult,describe_client_vpn_routes_result +DescribeClientVpnTargetNetworksRequest,describe_client_vpn_target_networks_request +DescribeClientVpnTargetNetworksResult,describe_client_vpn_target_networks_result +DescribeClusterDbRevisionsMessage,describe_cluster_db_revisions_message +DescribeClusterInput,describe_cluster_input +DescribeClusterOperationRequest,describe_cluster_operation_request +DescribeClusterOperationResponse,describe_cluster_operation_response +DescribeClusterOperationV2Request,describe_cluster_operation_v2_request +DescribeClusterOperationV2Response,describe_cluster_operation_v2_response +DescribeClusterOutput,describe_cluster_output +DescribeClusterParameterGroupsMessage,describe_cluster_parameter_groups_message +DescribeClusterParametersMessage,describe_cluster_parameters_message +DescribeClusterRequest,describe_cluster_request +DescribeClusterResponse,describe_cluster_response +DescribeClusterResult,describe_cluster_result +DescribeClusterSecurityGroupsMessage,describe_cluster_security_groups_message +DescribeClusterSnapshotsMessage,describe_cluster_snapshots_message +DescribeClusterSubnetGroupsMessage,describe_cluster_subnet_groups_message +DescribeClusterTracksMessage,describe_cluster_tracks_message +DescribeClusterV2Request,describe_cluster_v2_request +DescribeClusterV2Response,describe_cluster_v2_response +DescribeClusterVersionsMessage,describe_cluster_versions_message +DescribeClustersMessage,describe_clusters_message +DescribeClustersRequest,describe_clusters_request +DescribeClustersResponse,describe_clusters_response +DescribeCodeBindingRequest,describe_code_binding_request +DescribeCodeBindingResponse,describe_code_binding_response +DescribeCodeCoveragesInput,describe_code_coverages_input +DescribeCodeCoveragesOutput,describe_code_coverages_output +DescribeCodeRepositoryInput,describe_code_repository_input +DescribeCodeRepositoryOutput,describe_code_repository_output +DescribeCodeReviewRequest,describe_code_review_request +DescribeCodeReviewResponse,describe_code_review_response +DescribeCoipPoolsRequest,describe_coip_pools_request +DescribeCoipPoolsResult,describe_coip_pools_result +DescribeCollectionRequest,describe_collection_request +DescribeCollectionResponse,describe_collection_response +DescribeCommandsRequest,describe_commands_request +DescribeCommandsResult,describe_commands_result +DescribeCommentsRequest,describe_comments_request +DescribeCommentsResponse,describe_comments_response +DescribeCommunicationsRequest,describe_communications_request +DescribeCommunicationsResponse,describe_communications_response +DescribeCompanyNetworkConfigurationRequest,describe_company_network_configuration_request +DescribeCompanyNetworkConfigurationResponse,describe_company_network_configuration_response +DescribeCompilationJobRequest,describe_compilation_job_request +DescribeCompilationJobResponse,describe_compilation_job_response +DescribeComplianceByConfigRuleRequest,describe_compliance_by_config_rule_request +DescribeComplianceByConfigRuleResponse,describe_compliance_by_config_rule_response +DescribeComplianceByResourceRequest,describe_compliance_by_resource_request +DescribeComplianceByResourceResponse,describe_compliance_by_resource_response +DescribeComponentConfigurationRecommendationRequest,describe_component_configuration_recommendation_request +DescribeComponentConfigurationRecommendationResponse,describe_component_configuration_recommendation_response +DescribeComponentConfigurationRequest,describe_component_configuration_request +DescribeComponentConfigurationResponse,describe_component_configuration_response +DescribeComponentRequest,describe_component_request +DescribeComponentResponse,describe_component_response +DescribeComputeEnvironmentsRequest,describe_compute_environments_request +DescribeComputeEnvironmentsResponse,describe_compute_environments_response +DescribeComputeInput,describe_compute_input +DescribeComputeOutput,describe_compute_output +DescribeConditionalForwardersRequest,describe_conditional_forwarders_request +DescribeConditionalForwardersResult,describe_conditional_forwarders_result +DescribeConfigRuleEvaluationStatusRequest,describe_config_rule_evaluation_status_request +DescribeConfigRuleEvaluationStatusResponse,describe_config_rule_evaluation_status_response +DescribeConfigRulesFilters,describe_config_rules_filters +DescribeConfigRulesRequest,describe_config_rules_request +DescribeConfigRulesResponse,describe_config_rules_response +DescribeConfigurationAggregatorSourcesStatusRequest,describe_configuration_aggregator_sources_status_request +DescribeConfigurationAggregatorSourcesStatusResponse,describe_configuration_aggregator_sources_status_response +DescribeConfigurationAggregatorsRequest,describe_configuration_aggregators_request +DescribeConfigurationAggregatorsResponse,describe_configuration_aggregators_response +DescribeConfigurationOptionsMessage,describe_configuration_options_message +DescribeConfigurationRecorderStatusRequest,describe_configuration_recorder_status_request +DescribeConfigurationRecorderStatusResponse,describe_configuration_recorder_status_response +DescribeConfigurationRecordersRequest,describe_configuration_recorders_request +DescribeConfigurationRecordersResponse,describe_configuration_recorders_response +DescribeConfigurationRequest,describe_configuration_request +DescribeConfigurationResponse,describe_configuration_response +DescribeConfigurationRevisionRequest,describe_configuration_revision_request +DescribeConfigurationRevisionResponse,describe_configuration_revision_response +DescribeConfigurationSetRequest,describe_configuration_set_request +DescribeConfigurationSetResponse,describe_configuration_set_response +DescribeConfigurationSetsRequest,describe_configuration_sets_request +DescribeConfigurationSetsResult,describe_configuration_sets_result +DescribeConfigurationSettingsMessage,describe_configuration_settings_message +DescribeConfigurationsRequest,describe_configurations_request +DescribeConfigurationsResponse,describe_configurations_response +DescribeConformancePackComplianceRequest,describe_conformance_pack_compliance_request +DescribeConformancePackComplianceResponse,describe_conformance_pack_compliance_response +DescribeConformancePackStatusRequest,describe_conformance_pack_status_request +DescribeConformancePackStatusResponse,describe_conformance_pack_status_response +DescribeConformancePacksRequest,describe_conformance_packs_request +DescribeConformancePacksResponse,describe_conformance_packs_response +DescribeConnectClientAddInsRequest,describe_connect_client_add_ins_request +DescribeConnectClientAddInsResult,describe_connect_client_add_ins_result +DescribeConnectionAliasPermissionsRequest,describe_connection_alias_permissions_request +DescribeConnectionAliasPermissionsResult,describe_connection_alias_permissions_result +DescribeConnectionAliasesRequest,describe_connection_aliases_request +DescribeConnectionAliasesResult,describe_connection_aliases_result +DescribeConnectionLoaRequest,describe_connection_loa_request +DescribeConnectionLoaResponse,describe_connection_loa_response +DescribeConnectionRequest,describe_connection_request +DescribeConnectionResponse,describe_connection_response +DescribeConnectionsMessage,describe_connections_message +DescribeConnectionsOnInterconnectRequest,describe_connections_on_interconnect_request +DescribeConnectionsRequest,describe_connections_request +DescribeConnectionsResponse,describe_connections_response +DescribeConnectorEntityRequest,describe_connector_entity_request +DescribeConnectorEntityResponse,describe_connector_entity_response +DescribeConnectorProfilesRequest,describe_connector_profiles_request +DescribeConnectorProfilesResponse,describe_connector_profiles_response +DescribeConnectorRequest,describe_connector_request +DescribeConnectorResponse,describe_connector_response +DescribeConnectorsRequest,describe_connectors_request +DescribeConnectorsResponse,describe_connectors_response +DescribeConstraintInput,describe_constraint_input +DescribeConstraintOutput,describe_constraint_output +DescribeContactEvaluationRequest,describe_contact_evaluation_request +DescribeContactEvaluationResponse,describe_contact_evaluation_response +DescribeContactFlowModuleRequest,describe_contact_flow_module_request +DescribeContactFlowModuleResponse,describe_contact_flow_module_response +DescribeContactFlowRequest,describe_contact_flow_request +DescribeContactFlowResponse,describe_contact_flow_response +DescribeContactRequest,describe_contact_request +DescribeContactResponse,describe_contact_response +DescribeContainerInput,describe_container_input +DescribeContainerInstancesRequest,describe_container_instances_request +DescribeContainerInstancesResponse,describe_container_instances_response +DescribeContainerOutput,describe_container_output +DescribeContextRequest,describe_context_request +DescribeContextResponse,describe_context_response +DescribeContinuousBackupsInput,describe_continuous_backups_input +DescribeContinuousBackupsOutput,describe_continuous_backups_output +DescribeContinuousExportsRequest,describe_continuous_exports_request +DescribeContinuousExportsResponse,describe_continuous_exports_response +DescribeContributorInsightsInput,describe_contributor_insights_input +DescribeContributorInsightsOutput,describe_contributor_insights_output +DescribeControlPanelRequest,describe_control_panel_request +DescribeControlPanelResponse,describe_control_panel_response +DescribeConversionConfigurationMessage,describe_conversion_configuration_message +DescribeConversionConfigurationResponse,describe_conversion_configuration_response +DescribeConversionTasksRequest,describe_conversion_tasks_request +DescribeConversionTasksResult,describe_conversion_tasks_result +DescribeCopyJobInput,describe_copy_job_input +DescribeCopyJobOutput,describe_copy_job_output +DescribeCopyProductStatusInput,describe_copy_product_status_input +DescribeCopyProductStatusOutput,describe_copy_product_status_output +DescribeCostCategoryDefinitionRequest,describe_cost_category_definition_request +DescribeCostCategoryDefinitionResponse,describe_cost_category_definition_response +DescribeCreateAccountStatusRequest,describe_create_account_status_request +DescribeCreateAccountStatusResponse,describe_create_account_status_response +DescribeCreateCaseOptionsRequest,describe_create_case_options_request +DescribeCreateCaseOptionsResponse,describe_create_case_options_response +DescribeCrossAccountAccessRoleResponse,describe_cross_account_access_role_response +DescribeCustomDomainAssociationsMessage,describe_custom_domain_associations_message +DescribeCustomDomainsRequest,describe_custom_domains_request +DescribeCustomDomainsResponse,describe_custom_domains_response +DescribeCustomKeyStoresRequest,describe_custom_key_stores_request +DescribeCustomKeyStoresResponse,describe_custom_key_stores_response +DescribeCustomMetricRequest,describe_custom_metric_request +DescribeCustomMetricResponse,describe_custom_metric_response +DescribeCustomPluginRequest,describe_custom_plugin_request +DescribeCustomPluginResponse,describe_custom_plugin_response +DescribeCustomRoutingAcceleratorAttributesRequest,describe_custom_routing_accelerator_attributes_request +DescribeCustomRoutingAcceleratorAttributesResponse,describe_custom_routing_accelerator_attributes_response +DescribeCustomRoutingAcceleratorRequest,describe_custom_routing_accelerator_request +DescribeCustomRoutingAcceleratorResponse,describe_custom_routing_accelerator_response +DescribeCustomRoutingEndpointGroupRequest,describe_custom_routing_endpoint_group_request +DescribeCustomRoutingEndpointGroupResponse,describe_custom_routing_endpoint_group_response +DescribeCustomRoutingListenerRequest,describe_custom_routing_listener_request +DescribeCustomRoutingListenerResponse,describe_custom_routing_listener_response +DescribeCustomVocabularyMetadataRequest,describe_custom_vocabulary_metadata_request +DescribeCustomVocabularyMetadataResponse,describe_custom_vocabulary_metadata_response +DescribeCustomerGatewaysRequest,describe_customer_gateways_request +DescribeCustomerGatewaysResult,describe_customer_gateways_result +DescribeCustomerMetadataResponse,describe_customer_metadata_response +DescribeDBClusterAutomatedBackupsMessage,describe_db_cluster_automated_backups_message +DescribeDBClusterBacktracksMessage,describe_db_cluster_backtracks_message +DescribeDBClusterEndpointsMessage,describe_db_cluster_endpoints_message +DescribeDBClusterParameterGroupsMessage,describe_db_cluster_parameter_groups_message +DescribeDBClusterParametersMessage,describe_db_cluster_parameters_message +DescribeDBClusterSnapshotAttributesMessage,describe_db_cluster_snapshot_attributes_message +DescribeDBClusterSnapshotAttributesResult,describe_db_cluster_snapshot_attributes_result +DescribeDBClusterSnapshotsMessage,describe_db_cluster_snapshots_message +DescribeDBClustersMessage,describe_db_clusters_message +DescribeDBEngineVersionsMessage,describe_db_engine_versions_message +DescribeDBInstanceAutomatedBackupsMessage,describe_db_instance_automated_backups_message +DescribeDBInstancesMessage,describe_db_instances_message +DescribeDBLogFiles,describe_db_log_files +DescribeDBLogFilesDetails,describe_db_log_files_details +DescribeDBLogFilesMessage,describe_db_log_files_message +DescribeDBLogFilesResponse,describe_db_log_files_response +DescribeDBParameterGroupsMessage,describe_db_parameter_groups_message +DescribeDBParametersMessage,describe_db_parameters_message +DescribeDBProxiesRequest,describe_db_proxies_request +DescribeDBProxiesResponse,describe_db_proxies_response +DescribeDBProxyEndpointsRequest,describe_db_proxy_endpoints_request +DescribeDBProxyEndpointsResponse,describe_db_proxy_endpoints_response +DescribeDBProxyTargetGroupsRequest,describe_db_proxy_target_groups_request +DescribeDBProxyTargetGroupsResponse,describe_db_proxy_target_groups_response +DescribeDBProxyTargetsRequest,describe_db_proxy_targets_request +DescribeDBProxyTargetsResponse,describe_db_proxy_targets_response +DescribeDBSecurityGroupsMessage,describe_db_security_groups_message +DescribeDBSnapshotAttributesMessage,describe_db_snapshot_attributes_message +DescribeDBSnapshotAttributesResult,describe_db_snapshot_attributes_result +DescribeDBSnapshotsMessage,describe_db_snapshots_message +DescribeDBSubnetGroupsMessage,describe_db_subnet_groups_message +DescribeDRTAccessResponse,describe_drt_access_response +DescribeDashboardDefinitionRequest,describe_dashboard_definition_request +DescribeDashboardDefinitionResponse,describe_dashboard_definition_response +DescribeDashboardPermissionsRequest,describe_dashboard_permissions_request +DescribeDashboardPermissionsResponse,describe_dashboard_permissions_response +DescribeDashboardRequest,describe_dashboard_request +DescribeDashboardResponse,describe_dashboard_response +DescribeDashboardSnapshotJobRequest,describe_dashboard_snapshot_job_request +DescribeDashboardSnapshotJobResponse,describe_dashboard_snapshot_job_response +DescribeDashboardSnapshotJobResultRequest,describe_dashboard_snapshot_job_result_request +DescribeDashboardSnapshotJobResultResponse,describe_dashboard_snapshot_job_result_response +DescribeDataIngestionJobRequest,describe_data_ingestion_job_request +DescribeDataIngestionJobResponse,describe_data_ingestion_job_response +DescribeDataProvidersMessage,describe_data_providers_message +DescribeDataProvidersResponse,describe_data_providers_response +DescribeDataQualityJobDefinitionRequest,describe_data_quality_job_definition_request +DescribeDataQualityJobDefinitionResponse,describe_data_quality_job_definition_response +DescribeDataRepositoryAssociationsRequest,describe_data_repository_associations_request +DescribeDataRepositoryAssociationsResponse,describe_data_repository_associations_response +DescribeDataRepositoryTasksRequest,describe_data_repository_tasks_request +DescribeDataRepositoryTasksResponse,describe_data_repository_tasks_response +DescribeDataSetPermissionsRequest,describe_data_set_permissions_request +DescribeDataSetPermissionsResponse,describe_data_set_permissions_response +DescribeDataSetRefreshPropertiesRequest,describe_data_set_refresh_properties_request +DescribeDataSetRefreshPropertiesResponse,describe_data_set_refresh_properties_response +DescribeDataSetRequest,describe_data_set_request +DescribeDataSetResponse,describe_data_set_response +DescribeDataSharesForConsumerMessage,describe_data_shares_for_consumer_message +DescribeDataSharesForConsumerResult,describe_data_shares_for_consumer_result +DescribeDataSharesForProducerMessage,describe_data_shares_for_producer_message +DescribeDataSharesForProducerResult,describe_data_shares_for_producer_result +DescribeDataSharesMessage,describe_data_shares_message +DescribeDataSharesResult,describe_data_shares_result +DescribeDataSourcePermissionsRequest,describe_data_source_permissions_request +DescribeDataSourcePermissionsResponse,describe_data_source_permissions_response +DescribeDataSourceRequest,describe_data_source_request +DescribeDataSourceResponse,describe_data_source_response +DescribeDataSourcesInput,describe_data_sources_input +DescribeDataSourcesOutput,describe_data_sources_output +DescribeDatabaseRequest,describe_database_request +DescribeDatabaseResponse,describe_database_response +DescribeDatasetExportJobRequest,describe_dataset_export_job_request +DescribeDatasetExportJobResponse,describe_dataset_export_job_response +DescribeDatasetGroupRequest,describe_dataset_group_request +DescribeDatasetGroupResponse,describe_dataset_group_response +DescribeDatasetImportJobRequest,describe_dataset_import_job_request +DescribeDatasetImportJobResponse,describe_dataset_import_job_response +DescribeDatasetRequest,describe_dataset_request +DescribeDatasetResponse,describe_dataset_response +DescribeDatastoreRequest,describe_datastore_request +DescribeDatastoreResponse,describe_datastore_response +DescribeDefaultAuthorizerResponse,describe_default_authorizer_response +DescribeDefaultClusterParametersMessage,describe_default_cluster_parameters_message +DescribeDefaultClusterParametersResult,describe_default_cluster_parameters_result +DescribeDefaultEncryptionConfigurationResponse,describe_default_encryption_configuration_response +DescribeDefaultParametersRequest,describe_default_parameters_request +DescribeDefaultParametersResponse,describe_default_parameters_response +DescribeDeliveryChannelStatusRequest,describe_delivery_channel_status_request +DescribeDeliveryChannelStatusResponse,describe_delivery_channel_status_response +DescribeDeliveryChannelsRequest,describe_delivery_channels_request +DescribeDeliveryChannelsResponse,describe_delivery_channels_response +DescribeDeliveryStreamInput,describe_delivery_stream_input +DescribeDeliveryStreamOutput,describe_delivery_stream_output +DescribeDeploymentJobRequest,describe_deployment_job_request +DescribeDeploymentJobResponse,describe_deployment_job_response +DescribeDeploymentsRequest,describe_deployments_request +DescribeDeploymentsResult,describe_deployments_result +DescribeDestinationsRequest,describe_destinations_request +DescribeDestinationsResponse,describe_destinations_response +DescribeDetectMitigationActionsTaskRequest,describe_detect_mitigation_actions_task_request +DescribeDetectMitigationActionsTaskResponse,describe_detect_mitigation_actions_task_response +DescribeDetectorModelAnalysisRequest,describe_detector_model_analysis_request +DescribeDetectorModelAnalysisResponse,describe_detector_model_analysis_response +DescribeDetectorModelRequest,describe_detector_model_request +DescribeDetectorModelResponse,describe_detector_model_response +DescribeDetectorRequest,describe_detector_request +DescribeDetectorResponse,describe_detector_response +DescribeDetectorResult,describe_detector_result +DescribeDeviceEc2Input,describe_device_ec2_input +DescribeDeviceEc2Output,describe_device_ec2_output +DescribeDeviceFleetRequest,describe_device_fleet_request +DescribeDeviceFleetResponse,describe_device_fleet_response +DescribeDeviceInput,describe_device_input +DescribeDeviceJobRequest,describe_device_job_request +DescribeDeviceJobResponse,describe_device_job_response +DescribeDeviceOutput,describe_device_output +DescribeDevicePolicyConfigurationRequest,describe_device_policy_configuration_request +DescribeDevicePolicyConfigurationResponse,describe_device_policy_configuration_response +DescribeDeviceRequest,describe_device_request +DescribeDeviceResponse,describe_device_response +DescribeDhcpOptionsRequest,describe_dhcp_options_request +DescribeDhcpOptionsResult,describe_dhcp_options_result +DescribeDimensionKeysRequest,describe_dimension_keys_request +DescribeDimensionKeysResponse,describe_dimension_keys_response +DescribeDimensionRequest,describe_dimension_request +DescribeDimensionResponse,describe_dimension_response +DescribeDirectConnectGatewayAssociationProposalsRequest,describe_direct_connect_gateway_association_proposals_request +DescribeDirectConnectGatewayAssociationProposalsResult,describe_direct_connect_gateway_association_proposals_result +DescribeDirectConnectGatewayAssociationsRequest,describe_direct_connect_gateway_associations_request +DescribeDirectConnectGatewayAssociationsResult,describe_direct_connect_gateway_associations_result +DescribeDirectConnectGatewayAttachmentsRequest,describe_direct_connect_gateway_attachments_request +DescribeDirectConnectGatewayAttachmentsResult,describe_direct_connect_gateway_attachments_result +DescribeDirectConnectGatewaysRequest,describe_direct_connect_gateways_request +DescribeDirectConnectGatewaysResult,describe_direct_connect_gateways_result +DescribeDirectoriesRequest,describe_directories_request +DescribeDirectoriesResult,describe_directories_result +DescribeDirectoryConfigsRequest,describe_directory_configs_request +DescribeDirectoryConfigsResult,describe_directory_configs_result +DescribeDiscovererRequest,describe_discoverer_request +DescribeDiscovererResponse,describe_discoverer_response +DescribeDiscoveryJobRequest,describe_discovery_job_request +DescribeDiscoveryJobResponse,describe_discovery_job_response +DescribeDocumentClassificationJobRequest,describe_document_classification_job_request +DescribeDocumentClassificationJobResponse,describe_document_classification_job_response +DescribeDocumentClassifierRequest,describe_document_classifier_request +DescribeDocumentClassifierResponse,describe_document_classifier_response +DescribeDocumentPermissionRequest,describe_document_permission_request +DescribeDocumentPermissionResponse,describe_document_permission_response +DescribeDocumentRequest,describe_document_request +DescribeDocumentResult,describe_document_result +DescribeDocumentVersionsRequest,describe_document_versions_request +DescribeDocumentVersionsResponse,describe_document_versions_response +DescribeDomainAutoTunesRequest,describe_domain_auto_tunes_request +DescribeDomainAutoTunesResponse,describe_domain_auto_tunes_response +DescribeDomainChangeProgressRequest,describe_domain_change_progress_request +DescribeDomainChangeProgressResponse,describe_domain_change_progress_response +DescribeDomainConfigRequest,describe_domain_config_request +DescribeDomainConfigResponse,describe_domain_config_response +DescribeDomainConfigurationRequest,describe_domain_configuration_request +DescribeDomainConfigurationResponse,describe_domain_configuration_response +DescribeDomainControllersRequest,describe_domain_controllers_request +DescribeDomainControllersResult,describe_domain_controllers_result +DescribeDomainEndpointOptionsRequest,describe_domain_endpoint_options_request +DescribeDomainEndpointOptionsResponse,describe_domain_endpoint_options_response +DescribeDomainHealthRequest,describe_domain_health_request +DescribeDomainHealthResponse,describe_domain_health_response +DescribeDomainInput,describe_domain_input +DescribeDomainNodesRequest,describe_domain_nodes_request +DescribeDomainNodesResponse,describe_domain_nodes_response +DescribeDomainRequest,describe_domain_request +DescribeDomainResponse,describe_domain_response +DescribeDomainResult,describe_domain_result +DescribeDomainsRequest,describe_domains_request +DescribeDomainsResponse,describe_domains_response +DescribeDominantLanguageDetectionJobRequest,describe_dominant_language_detection_job_request +DescribeDominantLanguageDetectionJobResponse,describe_dominant_language_detection_job_response +DescribeDraftAppVersionResourcesImportStatusRequest,describe_draft_app_version_resources_import_status_request +DescribeDraftAppVersionResourcesImportStatusResponse,describe_draft_app_version_resources_import_status_response +DescribeDryRunProgressRequest,describe_dry_run_progress_request +DescribeDryRunProgressResponse,describe_dry_run_progress_response +DescribeEC2InstanceLimitsInput,describe_ec2_instance_limits_input +DescribeEC2InstanceLimitsOutput,describe_ec2_instance_limits_output +DescribeEcsClustersRequest,describe_ecs_clusters_request +DescribeEcsClustersResult,describe_ecs_clusters_result +DescribeEdgeConfigurationInput,describe_edge_configuration_input +DescribeEdgeConfigurationOutput,describe_edge_configuration_output +DescribeEdgeDeploymentPlanRequest,describe_edge_deployment_plan_request +DescribeEdgeDeploymentPlanResponse,describe_edge_deployment_plan_response +DescribeEdgePackagingJobRequest,describe_edge_packaging_job_request +DescribeEdgePackagingJobResponse,describe_edge_packaging_job_response +DescribeEffectiveInstanceAssociationsRequest,describe_effective_instance_associations_request +DescribeEffectiveInstanceAssociationsResult,describe_effective_instance_associations_result +DescribeEffectivePatchesForPatchBaselineRequest,describe_effective_patches_for_patch_baseline_request +DescribeEffectivePatchesForPatchBaselineResult,describe_effective_patches_for_patch_baseline_result +DescribeEffectivePolicyRequest,describe_effective_policy_request +DescribeEffectivePolicyResponse,describe_effective_policy_response +DescribeEgressOnlyInternetGatewaysRequest,describe_egress_only_internet_gateways_request +DescribeEgressOnlyInternetGatewaysResult,describe_egress_only_internet_gateways_result +DescribeElasticGpusRequest,describe_elastic_gpus_request +DescribeElasticGpusResult,describe_elastic_gpus_result +DescribeElasticIpsRequest,describe_elastic_ips_request +DescribeElasticIpsResult,describe_elastic_ips_result +DescribeElasticLoadBalancersRequest,describe_elastic_load_balancers_request +DescribeElasticLoadBalancersResult,describe_elastic_load_balancers_result +DescribeElasticsearchDomainConfigRequest,describe_elasticsearch_domain_config_request +DescribeElasticsearchDomainConfigResponse,describe_elasticsearch_domain_config_response +DescribeElasticsearchDomainRequest,describe_elasticsearch_domain_request +DescribeElasticsearchDomainResponse,describe_elasticsearch_domain_response +DescribeElasticsearchDomainsRequest,describe_elasticsearch_domains_request +DescribeElasticsearchDomainsResponse,describe_elasticsearch_domains_response +DescribeElasticsearchInstanceTypeLimitsRequest,describe_elasticsearch_instance_type_limits_request +DescribeElasticsearchInstanceTypeLimitsResponse,describe_elasticsearch_instance_type_limits_response +DescribeEmailMonitoringConfigurationRequest,describe_email_monitoring_configuration_request +DescribeEmailMonitoringConfigurationResponse,describe_email_monitoring_configuration_response +DescribeEmergencyContactSettingsResponse,describe_emergency_contact_settings_response +DescribeEndPointStateInput,describe_end_point_state_input +DescribeEndPointStateOutput,describe_end_point_state_output +DescribeEndpointAccessMessage,describe_endpoint_access_message +DescribeEndpointAuthorizationMessage,describe_endpoint_authorization_message +DescribeEndpointConfigInput,describe_endpoint_config_input +DescribeEndpointConfigOutput,describe_endpoint_config_output +DescribeEndpointGroupRequest,describe_endpoint_group_request +DescribeEndpointGroupResponse,describe_endpoint_group_response +DescribeEndpointInput,describe_endpoint_input +DescribeEndpointOutput,describe_endpoint_output +DescribeEndpointRequest,describe_endpoint_request +DescribeEndpointResponse,describe_endpoint_response +DescribeEndpointSettingsMessage,describe_endpoint_settings_message +DescribeEndpointSettingsResponse,describe_endpoint_settings_response +DescribeEndpointTypesMessage,describe_endpoint_types_message +DescribeEndpointTypesResponse,describe_endpoint_types_response +DescribeEndpointsMessage,describe_endpoints_message +DescribeEndpointsRequest,describe_endpoints_request +DescribeEndpointsResponse,describe_endpoints_response +DescribeEngagementRequest,describe_engagement_request +DescribeEngagementResult,describe_engagement_result +DescribeEngineDefaultClusterParametersMessage,describe_engine_default_cluster_parameters_message +DescribeEngineDefaultClusterParametersResult,describe_engine_default_cluster_parameters_result +DescribeEngineDefaultParametersMessage,describe_engine_default_parameters_message +DescribeEngineDefaultParametersResult,describe_engine_default_parameters_result +DescribeEngineVersionsMessage,describe_engine_versions_message +DescribeEngineVersionsRequest,describe_engine_versions_request +DescribeEngineVersionsResponse,describe_engine_versions_response +DescribeEntitiesDetectionJobRequest,describe_entities_detection_job_request +DescribeEntitiesDetectionJobResponse,describe_entities_detection_job_response +DescribeEntitiesDetectionV2JobRequest,describe_entities_detection_v2_job_request +DescribeEntitiesDetectionV2JobResponse,describe_entities_detection_v2_job_response +DescribeEntitlementsRequest,describe_entitlements_request +DescribeEntitlementsResult,describe_entitlements_result +DescribeEntityAggregatesForOrganizationRequest,describe_entity_aggregates_for_organization_request +DescribeEntityAggregatesForOrganizationResponse,describe_entity_aggregates_for_organization_response +DescribeEntityAggregatesRequest,describe_entity_aggregates_request +DescribeEntityAggregatesResponse,describe_entity_aggregates_response +DescribeEntityRecognizerRequest,describe_entity_recognizer_request +DescribeEntityRecognizerResponse,describe_entity_recognizer_response +DescribeEntityRequest,describe_entity_request +DescribeEntityResponse,describe_entity_response +DescribeEnvironmentHealthRequest,describe_environment_health_request +DescribeEnvironmentHealthResult,describe_environment_health_result +DescribeEnvironmentManagedActionHistoryRequest,describe_environment_managed_action_history_request +DescribeEnvironmentManagedActionHistoryResult,describe_environment_managed_action_history_result +DescribeEnvironmentManagedActionsRequest,describe_environment_managed_actions_request +DescribeEnvironmentManagedActionsResult,describe_environment_managed_actions_result +DescribeEnvironmentMembershipsRequest,describe_environment_memberships_request +DescribeEnvironmentMembershipsResult,describe_environment_memberships_result +DescribeEnvironmentResourcesMessage,describe_environment_resources_message +DescribeEnvironmentStatusRequest,describe_environment_status_request +DescribeEnvironmentStatusResult,describe_environment_status_result +DescribeEnvironmentsMessage,describe_environments_message +DescribeEnvironmentsRequest,describe_environments_request +DescribeEnvironmentsResult,describe_environments_result +DescribeEphemerisRequest,describe_ephemeris_request +DescribeEphemerisResponse,describe_ephemeris_response +DescribeEvaluationFormRequest,describe_evaluation_form_request +DescribeEvaluationFormResponse,describe_evaluation_form_response +DescribeEvaluationsInput,describe_evaluations_input +DescribeEvaluationsOutput,describe_evaluations_output +DescribeEventAggregatesRequest,describe_event_aggregates_request +DescribeEventAggregatesResponse,describe_event_aggregates_response +DescribeEventBusRequest,describe_event_bus_request +DescribeEventBusResponse,describe_event_bus_response +DescribeEventCategoriesMessage,describe_event_categories_message +DescribeEventCategoriesResponse,describe_event_categories_response +DescribeEventConfigurationsResponse,describe_event_configurations_response +DescribeEventDetailsForOrganizationRequest,describe_event_details_for_organization_request +DescribeEventDetailsForOrganizationResponse,describe_event_details_for_organization_response +DescribeEventDetailsRequest,describe_event_details_request +DescribeEventDetailsResponse,describe_event_details_response +DescribeEventSourceRequest,describe_event_source_request +DescribeEventSourceResponse,describe_event_source_response +DescribeEventSourcesConfigResponse,describe_event_sources_config_response +DescribeEventSubscriptionsMessage,describe_event_subscriptions_message +DescribeEventSubscriptionsResponse,describe_event_subscriptions_response +DescribeEventTopicsRequest,describe_event_topics_request +DescribeEventTopicsResult,describe_event_topics_result +DescribeEventTrackerRequest,describe_event_tracker_request +DescribeEventTrackerResponse,describe_event_tracker_response +DescribeEventTypesRequest,describe_event_types_request +DescribeEventTypesResponse,describe_event_types_response +DescribeEventsDetectionJobRequest,describe_events_detection_job_request +DescribeEventsDetectionJobResponse,describe_events_detection_job_response +DescribeEventsForOrganizationRequest,describe_events_for_organization_request +DescribeEventsForOrganizationResponse,describe_events_for_organization_response +DescribeEventsMessage,describe_events_message +DescribeEventsRequest,describe_events_request +DescribeEventsResponse,describe_events_response +DescribeExclusionsRequest,describe_exclusions_request +DescribeExclusionsResponse,describe_exclusions_response +DescribeExecutionInput,describe_execution_input +DescribeExecutionOutput,describe_execution_output +DescribeExecutionRequest,describe_execution_request +DescribeExecutionResponse,describe_execution_response +DescribeExperienceRequest,describe_experience_request +DescribeExperienceResponse,describe_experience_response +DescribeExperimentRequest,describe_experiment_request +DescribeExperimentResponse,describe_experiment_response +DescribeExplainabilityExportRequest,describe_explainability_export_request +DescribeExplainabilityExportResponse,describe_explainability_export_response +DescribeExplainabilityRequest,describe_explainability_request +DescribeExplainabilityResponse,describe_explainability_response +DescribeExportConfigurationsRequest,describe_export_configurations_request +DescribeExportConfigurationsResponse,describe_export_configurations_response +DescribeExportImageTasksRequest,describe_export_image_tasks_request +DescribeExportImageTasksResult,describe_export_image_tasks_result +DescribeExportInput,describe_export_input +DescribeExportOutput,describe_export_output +DescribeExportRequest,describe_export_request +DescribeExportResponse,describe_export_response +DescribeExportTasksMessage,describe_export_tasks_message +DescribeExportTasksRequest,describe_export_tasks_request +DescribeExportTasksResponse,describe_export_tasks_response +DescribeExportTasksResult,describe_export_tasks_result +DescribeExpressionsRequest,describe_expressions_request +DescribeExpressionsResponse,describe_expressions_response +DescribeExtensionPackAssociationsMessage,describe_extension_pack_associations_message +DescribeExtensionPackAssociationsResponse,describe_extension_pack_associations_response +DescribeFHIRDatastoreRequest,describe_fhir_datastore_request +DescribeFHIRDatastoreResponse,describe_fhir_datastore_response +DescribeFHIRExportJobRequest,describe_fhir_export_job_request +DescribeFHIRExportJobResponse,describe_fhir_export_job_response +DescribeFHIRImportJobRequest,describe_fhir_import_job_request +DescribeFHIRImportJobResponse,describe_fhir_import_job_response +DescribeFaqRequest,describe_faq_request +DescribeFaqResponse,describe_faq_response +DescribeFargateProfileRequest,describe_fargate_profile_request +DescribeFargateProfileResponse,describe_fargate_profile_response +DescribeFastLaunchImagesRequest,describe_fast_launch_images_request +DescribeFastLaunchImagesResult,describe_fast_launch_images_result +DescribeFastLaunchImagesSuccessItem,describe_fast_launch_images_success_item +DescribeFastSnapshotRestoreSuccessItem,describe_fast_snapshot_restore_success_item +DescribeFastSnapshotRestoresRequest,describe_fast_snapshot_restores_request +DescribeFastSnapshotRestoresResult,describe_fast_snapshot_restores_result +DescribeFeatureGroupRequest,describe_feature_group_request +DescribeFeatureGroupResponse,describe_feature_group_response +DescribeFeatureMetadataRequest,describe_feature_metadata_request +DescribeFeatureMetadataResponse,describe_feature_metadata_response +DescribeFeatureTransformationRequest,describe_feature_transformation_request +DescribeFeatureTransformationResponse,describe_feature_transformation_response +DescribeFeaturedResultsSetRequest,describe_featured_results_set_request +DescribeFeaturedResultsSetResponse,describe_featured_results_set_response +DescribeFeedbackRequest,describe_feedback_request +DescribeFeedbackResponse,describe_feedback_response +DescribeFileCachesRequest,describe_file_caches_request +DescribeFileCachesResponse,describe_file_caches_response +DescribeFileSystemAliasesRequest,describe_file_system_aliases_request +DescribeFileSystemAliasesResponse,describe_file_system_aliases_response +DescribeFileSystemAssociationsInput,describe_file_system_associations_input +DescribeFileSystemAssociationsOutput,describe_file_system_associations_output +DescribeFileSystemPolicyRequest,describe_file_system_policy_request +DescribeFileSystemsRequest,describe_file_systems_request +DescribeFileSystemsResponse,describe_file_systems_response +DescribeFilterRequest,describe_filter_request +DescribeFilterResponse,describe_filter_response +DescribeFindingsRequest,describe_findings_request +DescribeFindingsResponse,describe_findings_response +DescribeFirewallPolicyRequest,describe_firewall_policy_request +DescribeFirewallPolicyResponse,describe_firewall_policy_response +DescribeFirewallRequest,describe_firewall_request +DescribeFirewallResponse,describe_firewall_response +DescribeFleetAdvisorCollectorsRequest,describe_fleet_advisor_collectors_request +DescribeFleetAdvisorCollectorsResponse,describe_fleet_advisor_collectors_response +DescribeFleetAdvisorDatabasesRequest,describe_fleet_advisor_databases_request +DescribeFleetAdvisorDatabasesResponse,describe_fleet_advisor_databases_response +DescribeFleetAdvisorLsaAnalysisRequest,describe_fleet_advisor_lsa_analysis_request +DescribeFleetAdvisorLsaAnalysisResponse,describe_fleet_advisor_lsa_analysis_response +DescribeFleetAdvisorSchemaObjectSummaryRequest,describe_fleet_advisor_schema_object_summary_request +DescribeFleetAdvisorSchemaObjectSummaryResponse,describe_fleet_advisor_schema_object_summary_response +DescribeFleetAdvisorSchemasRequest,describe_fleet_advisor_schemas_request +DescribeFleetAdvisorSchemasResponse,describe_fleet_advisor_schemas_response +DescribeFleetAttributesInput,describe_fleet_attributes_input +DescribeFleetAttributesOutput,describe_fleet_attributes_output +DescribeFleetCapacityInput,describe_fleet_capacity_input +DescribeFleetCapacityOutput,describe_fleet_capacity_output +DescribeFleetError,describe_fleet_error +DescribeFleetEventsInput,describe_fleet_events_input +DescribeFleetEventsOutput,describe_fleet_events_output +DescribeFleetHistoryRequest,describe_fleet_history_request +DescribeFleetHistoryResult,describe_fleet_history_result +DescribeFleetInstancesRequest,describe_fleet_instances_request +DescribeFleetInstancesResult,describe_fleet_instances_result +DescribeFleetLocationAttributesInput,describe_fleet_location_attributes_input +DescribeFleetLocationAttributesOutput,describe_fleet_location_attributes_output +DescribeFleetLocationCapacityInput,describe_fleet_location_capacity_input +DescribeFleetLocationCapacityOutput,describe_fleet_location_capacity_output +DescribeFleetLocationUtilizationInput,describe_fleet_location_utilization_input +DescribeFleetLocationUtilizationOutput,describe_fleet_location_utilization_output +DescribeFleetMetadataRequest,describe_fleet_metadata_request +DescribeFleetMetadataResponse,describe_fleet_metadata_response +DescribeFleetMetricRequest,describe_fleet_metric_request +DescribeFleetMetricResponse,describe_fleet_metric_response +DescribeFleetPortSettingsInput,describe_fleet_port_settings_input +DescribeFleetPortSettingsOutput,describe_fleet_port_settings_output +DescribeFleetRequest,describe_fleet_request +DescribeFleetResponse,describe_fleet_response +DescribeFleetUtilizationInput,describe_fleet_utilization_input +DescribeFleetUtilizationOutput,describe_fleet_utilization_output +DescribeFleetsInstances,describe_fleets_instances +DescribeFleetsRequest,describe_fleets_request +DescribeFleetsResult,describe_fleets_result +DescribeFlowDefinitionRequest,describe_flow_definition_request +DescribeFlowDefinitionResponse,describe_flow_definition_response +DescribeFlowExecutionRecordsRequest,describe_flow_execution_records_request +DescribeFlowExecutionRecordsResponse,describe_flow_execution_records_response +DescribeFlowLogsRequest,describe_flow_logs_request +DescribeFlowLogsResult,describe_flow_logs_result +DescribeFlowRequest,describe_flow_request +DescribeFlowResponse,describe_flow_response +DescribeFlywheelIterationRequest,describe_flywheel_iteration_request +DescribeFlywheelIterationResponse,describe_flywheel_iteration_response +DescribeFlywheelRequest,describe_flywheel_request +DescribeFlywheelResponse,describe_flywheel_response +DescribeFolderContentsRequest,describe_folder_contents_request +DescribeFolderContentsResponse,describe_folder_contents_response +DescribeFolderPermissionsRequest,describe_folder_permissions_request +DescribeFolderPermissionsResponse,describe_folder_permissions_response +DescribeFolderRequest,describe_folder_request +DescribeFolderResolvedPermissionsRequest,describe_folder_resolved_permissions_request +DescribeFolderResolvedPermissionsResponse,describe_folder_resolved_permissions_response +DescribeFolderResponse,describe_folder_response +DescribeForecastExportJobRequest,describe_forecast_export_job_request +DescribeForecastExportJobResponse,describe_forecast_export_job_response +DescribeForecastRequest,describe_forecast_request +DescribeForecastResponse,describe_forecast_response +DescribeFpgaImageAttributeRequest,describe_fpga_image_attribute_request +DescribeFpgaImageAttributeResult,describe_fpga_image_attribute_result +DescribeFpgaImagesRequest,describe_fpga_images_request +DescribeFpgaImagesResult,describe_fpga_images_result +DescribeFrameworkInput,describe_framework_input +DescribeFrameworkOutput,describe_framework_output +DescribeFraudsterRegistrationJobRequest,describe_fraudster_registration_job_request +DescribeFraudsterRegistrationJobResponse,describe_fraudster_registration_job_response +DescribeFraudsterRequest,describe_fraudster_request +DescribeFraudsterResponse,describe_fraudster_response +DescribeFunctionRequest,describe_function_request +DescribeFunctionResult,describe_function_result +DescribeGameServerGroupInput,describe_game_server_group_input +DescribeGameServerGroupOutput,describe_game_server_group_output +DescribeGameServerInput,describe_game_server_input +DescribeGameServerInstancesInput,describe_game_server_instances_input +DescribeGameServerInstancesOutput,describe_game_server_instances_output +DescribeGameServerOutput,describe_game_server_output +DescribeGameSessionDetailsInput,describe_game_session_details_input +DescribeGameSessionDetailsOutput,describe_game_session_details_output +DescribeGameSessionPlacementInput,describe_game_session_placement_input +DescribeGameSessionPlacementOutput,describe_game_session_placement_output +DescribeGameSessionQueuesInput,describe_game_session_queues_input +DescribeGameSessionQueuesOutput,describe_game_session_queues_output +DescribeGameSessionsInput,describe_game_sessions_input +DescribeGameSessionsOutput,describe_game_sessions_output +DescribeGatewayCapabilityConfigurationRequest,describe_gateway_capability_configuration_request +DescribeGatewayCapabilityConfigurationResponse,describe_gateway_capability_configuration_response +DescribeGatewayInformationInput,describe_gateway_information_input +DescribeGatewayInformationOutput,describe_gateway_information_output +DescribeGatewayInstanceRequest,describe_gateway_instance_request +DescribeGatewayInstanceResponse,describe_gateway_instance_response +DescribeGatewayRequest,describe_gateway_request +DescribeGatewayResponse,describe_gateway_response +DescribeGatewayRouteInput,describe_gateway_route_input +DescribeGatewayRouteOutput,describe_gateway_route_output +DescribeGeofenceCollectionRequest,describe_geofence_collection_request +DescribeGeofenceCollectionResponse,describe_geofence_collection_response +DescribeGlobalClustersMessage,describe_global_clusters_message +DescribeGlobalNetworksRequest,describe_global_networks_request +DescribeGlobalNetworksResponse,describe_global_networks_response +DescribeGlobalReplicationGroupsMessage,describe_global_replication_groups_message +DescribeGlobalReplicationGroupsResult,describe_global_replication_groups_result +DescribeGlobalSettingsOutput,describe_global_settings_output +DescribeGlobalTableInput,describe_global_table_input +DescribeGlobalTableOutput,describe_global_table_output +DescribeGlobalTableSettingsInput,describe_global_table_settings_input +DescribeGlobalTableSettingsOutput,describe_global_table_settings_output +DescribeGroupMembershipRequest,describe_group_membership_request +DescribeGroupMembershipResponse,describe_group_membership_response +DescribeGroupRequest,describe_group_request +DescribeGroupResponse,describe_group_response +DescribeGroupsRequest,describe_groups_request +DescribeGroupsResponse,describe_groups_response +DescribeHandshakeRequest,describe_handshake_request +DescribeHandshakeResponse,describe_handshake_response +DescribeHapgRequest,describe_hapg_request +DescribeHapgResponse,describe_hapg_response +DescribeHarvestJobRequest,describe_harvest_job_request +DescribeHarvestJobResponse,describe_harvest_job_response +DescribeHealthServiceStatusForOrganizationResponse,describe_health_service_status_for_organization_response +DescribeHomeRegionControlsRequest,describe_home_region_controls_request +DescribeHomeRegionControlsResult,describe_home_region_controls_result +DescribeHostKeyRequest,describe_host_key_request +DescribeHostKeyResponse,describe_host_key_response +DescribeHostReservationOfferingsRequest,describe_host_reservation_offerings_request +DescribeHostReservationOfferingsResult,describe_host_reservation_offerings_result +DescribeHostReservationsRequest,describe_host_reservations_request +DescribeHostReservationsResult,describe_host_reservations_result +DescribeHostedConnectionsRequest,describe_hosted_connections_request +DescribeHostsRequest,describe_hosts_request +DescribeHostsResult,describe_hosts_result +DescribeHoursOfOperationRequest,describe_hours_of_operation_request +DescribeHoursOfOperationResponse,describe_hours_of_operation_response +DescribeHsmClientCertificatesMessage,describe_hsm_client_certificates_message +DescribeHsmConfigurationsMessage,describe_hsm_configurations_message +DescribeHsmRequest,describe_hsm_request +DescribeHsmResponse,describe_hsm_response +DescribeHubContentRequest,describe_hub_content_request +DescribeHubContentResponse,describe_hub_content_response +DescribeHubRequest,describe_hub_request +DescribeHubResponse,describe_hub_response +DescribeHumanLoopRequest,describe_human_loop_request +DescribeHumanLoopResponse,describe_human_loop_response +DescribeHumanTaskUiRequest,describe_human_task_ui_request +DescribeHumanTaskUiResponse,describe_human_task_ui_response +DescribeHyperParameterTuningJobRequest,describe_hyper_parameter_tuning_job_request +DescribeHyperParameterTuningJobResponse,describe_hyper_parameter_tuning_job_response +DescribeIAMPolicyAssignmentRequest,describe_iam_policy_assignment_request +DescribeIAMPolicyAssignmentResponse,describe_iam_policy_assignment_response +DescribeICD10CMInferenceJobRequest,describe_icd10_cm_inference_job_request +DescribeICD10CMInferenceJobResponse,describe_icd10_cm_inference_job_response +DescribeIamInstanceProfileAssociationsRequest,describe_iam_instance_profile_associations_request +DescribeIamInstanceProfileAssociationsResult,describe_iam_instance_profile_associations_result +DescribeIdFormatRequest,describe_id_format_request +DescribeIdFormatResult,describe_id_format_result +DescribeIdentityIdFormatRequest,describe_identity_id_format_request +DescribeIdentityIdFormatResult,describe_identity_id_format_result +DescribeIdentityInput,describe_identity_input +DescribeIdentityPoolInput,describe_identity_pool_input +DescribeIdentityPoolUsageRequest,describe_identity_pool_usage_request +DescribeIdentityPoolUsageResponse,describe_identity_pool_usage_response +DescribeIdentityProviderConfigRequest,describe_identity_provider_config_request +DescribeIdentityProviderConfigResponse,describe_identity_provider_config_response +DescribeIdentityProviderConfigurationRequest,describe_identity_provider_configuration_request +DescribeIdentityProviderConfigurationResponse,describe_identity_provider_configuration_response +DescribeIdentityProviderRequest,describe_identity_provider_request +DescribeIdentityProviderResponse,describe_identity_provider_response +DescribeIdentityUsageRequest,describe_identity_usage_request +DescribeIdentityUsageResponse,describe_identity_usage_response +DescribeImageAttributeRequest,describe_image_attribute_request +DescribeImageBuildersRequest,describe_image_builders_request +DescribeImageBuildersResult,describe_image_builders_result +DescribeImageGenerationConfigurationInput,describe_image_generation_configuration_input +DescribeImageGenerationConfigurationOutput,describe_image_generation_configuration_output +DescribeImagePermissionsRequest,describe_image_permissions_request +DescribeImagePermissionsResult,describe_image_permissions_result +DescribeImageReplicationStatusRequest,describe_image_replication_status_request +DescribeImageReplicationStatusResponse,describe_image_replication_status_response +DescribeImageRequest,describe_image_request +DescribeImageResponse,describe_image_response +DescribeImageScanFindingsRequest,describe_image_scan_findings_request +DescribeImageScanFindingsResponse,describe_image_scan_findings_response +DescribeImageTagsRequest,describe_image_tags_request +DescribeImageTagsResponse,describe_image_tags_response +DescribeImageVersionRequest,describe_image_version_request +DescribeImageVersionResponse,describe_image_version_response +DescribeImagesFilter,describe_images_filter +DescribeImagesRequest,describe_images_request +DescribeImagesResponse,describe_images_response +DescribeImagesResult,describe_images_result +DescribeImportImageTasksRequest,describe_import_image_tasks_request +DescribeImportImageTasksResult,describe_import_image_tasks_result +DescribeImportInput,describe_import_input +DescribeImportOutput,describe_import_output +DescribeImportRequest,describe_import_request +DescribeImportResponse,describe_import_response +DescribeImportSnapshotTasksRequest,describe_import_snapshot_tasks_request +DescribeImportSnapshotTasksResult,describe_import_snapshot_tasks_result +DescribeImportTasksRequest,describe_import_tasks_request +DescribeImportTasksResponse,describe_import_tasks_response +DescribeInboundConnectionsRequest,describe_inbound_connections_request +DescribeInboundConnectionsResponse,describe_inbound_connections_response +DescribeInboundCrossClusterSearchConnectionsRequest,describe_inbound_cross_cluster_search_connections_request +DescribeInboundCrossClusterSearchConnectionsResponse,describe_inbound_cross_cluster_search_connections_response +DescribeInboundDmarcSettingsRequest,describe_inbound_dmarc_settings_request +DescribeInboundDmarcSettingsResponse,describe_inbound_dmarc_settings_response +DescribeIndexFieldsRequest,describe_index_fields_request +DescribeIndexFieldsResponse,describe_index_fields_response +DescribeIndexRequest,describe_index_request +DescribeIndexResponse,describe_index_response +DescribeInferenceExperimentRequest,describe_inference_experiment_request +DescribeInferenceExperimentResponse,describe_inference_experiment_response +DescribeInferenceRecommendationsJobRequest,describe_inference_recommendations_job_request +DescribeInferenceRecommendationsJobResponse,describe_inference_recommendations_job_response +DescribeInferenceSchedulerRequest,describe_inference_scheduler_request +DescribeInferenceSchedulerResponse,describe_inference_scheduler_response +DescribeIngestionRequest,describe_ingestion_request +DescribeIngestionResponse,describe_ingestion_response +DescribeInputDeviceRequest,describe_input_device_request +DescribeInputDeviceResponse,describe_input_device_response +DescribeInputDeviceThumbnailRequest,describe_input_device_thumbnail_request +DescribeInputDeviceThumbnailResponse,describe_input_device_thumbnail_response +DescribeInputRequest,describe_input_request +DescribeInputResponse,describe_input_response +DescribeInputSecurityGroupRequest,describe_input_security_group_request +DescribeInputSecurityGroupResponse,describe_input_security_group_response +DescribeInsightRequest,describe_insight_request +DescribeInsightResponse,describe_insight_response +DescribeInsightRulesInput,describe_insight_rules_input +DescribeInsightRulesOutput,describe_insight_rules_output +DescribeInstanceAccessControlAttributeConfigurationRequest,describe_instance_access_control_attribute_configuration_request +DescribeInstanceAccessControlAttributeConfigurationResponse,describe_instance_access_control_attribute_configuration_response +DescribeInstanceAssociationsStatusRequest,describe_instance_associations_status_request +DescribeInstanceAssociationsStatusResult,describe_instance_associations_status_result +DescribeInstanceAttributeRequest,describe_instance_attribute_request +DescribeInstanceAttributeResponse,describe_instance_attribute_response +DescribeInstanceConnectEndpointsRequest,describe_instance_connect_endpoints_request +DescribeInstanceConnectEndpointsResult,describe_instance_connect_endpoints_result +DescribeInstanceCreditSpecificationsRequest,describe_instance_credit_specifications_request +DescribeInstanceCreditSpecificationsResult,describe_instance_credit_specifications_result +DescribeInstanceEventNotificationAttributesRequest,describe_instance_event_notification_attributes_request +DescribeInstanceEventNotificationAttributesResult,describe_instance_event_notification_attributes_result +DescribeInstanceEventWindowsRequest,describe_instance_event_windows_request +DescribeInstanceEventWindowsResult,describe_instance_event_windows_result +DescribeInstanceInformationRequest,describe_instance_information_request +DescribeInstanceInformationResult,describe_instance_information_result +DescribeInstancePatchStatesForPatchGroupRequest,describe_instance_patch_states_for_patch_group_request +DescribeInstancePatchStatesForPatchGroupResult,describe_instance_patch_states_for_patch_group_result +DescribeInstancePatchStatesRequest,describe_instance_patch_states_request +DescribeInstancePatchStatesResult,describe_instance_patch_states_result +DescribeInstancePatchesRequest,describe_instance_patches_request +DescribeInstancePatchesResult,describe_instance_patches_result +DescribeInstanceProfilesMessage,describe_instance_profiles_message +DescribeInstanceProfilesResponse,describe_instance_profiles_response +DescribeInstanceRefreshesAnswer,describe_instance_refreshes_answer +DescribeInstanceRefreshesType,describe_instance_refreshes_type +DescribeInstanceRequest,describe_instance_request +DescribeInstanceResponse,describe_instance_response +DescribeInstanceStatusRequest,describe_instance_status_request +DescribeInstanceStatusResult,describe_instance_status_result +DescribeInstanceStorageConfigRequest,describe_instance_storage_config_request +DescribeInstanceStorageConfigResponse,describe_instance_storage_config_response +DescribeInstanceTypeLimitsRequest,describe_instance_type_limits_request +DescribeInstanceTypeLimitsResponse,describe_instance_type_limits_response +DescribeInstanceTypeOfferingsRequest,describe_instance_type_offerings_request +DescribeInstanceTypeOfferingsResult,describe_instance_type_offerings_result +DescribeInstanceTypesRequest,describe_instance_types_request +DescribeInstanceTypesResult,describe_instance_types_result +DescribeInstancesHealthRequest,describe_instances_health_request +DescribeInstancesHealthResult,describe_instances_health_result +DescribeInstancesInput,describe_instances_input +DescribeInstancesOutput,describe_instances_output +DescribeInstancesRequest,describe_instances_request +DescribeInstancesResult,describe_instances_result +DescribeIntentRequest,describe_intent_request +DescribeIntentResponse,describe_intent_response +DescribeInterconnectLoaRequest,describe_interconnect_loa_request +DescribeInterconnectLoaResponse,describe_interconnect_loa_response +DescribeInterconnectsRequest,describe_interconnects_request +DescribeInternetGatewaysRequest,describe_internet_gateways_request +DescribeInternetGatewaysResult,describe_internet_gateways_result +DescribeInventoryDeletionsRequest,describe_inventory_deletions_request +DescribeInventoryDeletionsResult,describe_inventory_deletions_result +DescribeIpGroupsRequest,describe_ip_groups_request +DescribeIpGroupsResult,describe_ip_groups_result +DescribeIpRestrictionRequest,describe_ip_restriction_request +DescribeIpRestrictionResponse,describe_ip_restriction_response +DescribeIpamPoolsRequest,describe_ipam_pools_request +DescribeIpamPoolsResult,describe_ipam_pools_result +DescribeIpamResourceDiscoveriesRequest,describe_ipam_resource_discoveries_request +DescribeIpamResourceDiscoveriesResult,describe_ipam_resource_discoveries_result +DescribeIpamResourceDiscoveryAssociationsRequest,describe_ipam_resource_discovery_associations_request +DescribeIpamResourceDiscoveryAssociationsResult,describe_ipam_resource_discovery_associations_result +DescribeIpamScopesRequest,describe_ipam_scopes_request +DescribeIpamScopesResult,describe_ipam_scopes_result +DescribeIpamsRequest,describe_ipams_request +DescribeIpamsResult,describe_ipams_result +DescribeIpv6PoolsRequest,describe_ipv6_pools_request +DescribeIpv6PoolsResult,describe_ipv6_pools_result +DescribeJobDefinitionsRequest,describe_job_definitions_request +DescribeJobDefinitionsResponse,describe_job_definitions_response +DescribeJobExecutionRequest,describe_job_execution_request +DescribeJobExecutionResponse,describe_job_execution_response +DescribeJobFlowsInput,describe_job_flows_input +DescribeJobFlowsOutput,describe_job_flows_output +DescribeJobInput,describe_job_input +DescribeJobLogItemsRequest,describe_job_log_items_request +DescribeJobLogItemsResponse,describe_job_log_items_response +DescribeJobQueuesRequest,describe_job_queues_request +DescribeJobQueuesResponse,describe_job_queues_response +DescribeJobRequest,describe_job_request +DescribeJobResponse,describe_job_response +DescribeJobResult,describe_job_result +DescribeJobRunRequest,describe_job_run_request +DescribeJobRunResponse,describe_job_run_response +DescribeJobTemplateRequest,describe_job_template_request +DescribeJobTemplateResponse,describe_job_template_response +DescribeJobsRequest,describe_jobs_request +DescribeJobsRequestFilters,describe_jobs_request_filters +DescribeJobsResponse,describe_jobs_response +DescribeJournalKinesisStreamRequest,describe_journal_kinesis_stream_request +DescribeJournalKinesisStreamResponse,describe_journal_kinesis_stream_response +DescribeJournalS3ExportRequest,describe_journal_s3_export_request +DescribeJournalS3ExportResponse,describe_journal_s3_export_response +DescribeKeyPairsRequest,describe_key_pairs_request +DescribeKeyPairsResult,describe_key_pairs_result +DescribeKeyPhrasesDetectionJobRequest,describe_key_phrases_detection_job_request +DescribeKeyPhrasesDetectionJobResponse,describe_key_phrases_detection_job_response +DescribeKeyRequest,describe_key_request +DescribeKeyResponse,describe_key_response +DescribeKeywordsRequest,describe_keywords_request +DescribeKeywordsResult,describe_keywords_result +DescribeKinesisStreamingDestinationInput,describe_kinesis_streaming_destination_input +DescribeKinesisStreamingDestinationOutput,describe_kinesis_streaming_destination_output +DescribeLDAPSSettingsRequest,describe_ldaps_settings_request +DescribeLDAPSSettingsResult,describe_ldaps_settings_result +DescribeLabelGroupRequest,describe_label_group_request +DescribeLabelGroupResponse,describe_label_group_response +DescribeLabelRequest,describe_label_request +DescribeLabelResponse,describe_label_response +DescribeLabelingJobRequest,describe_labeling_job_request +DescribeLabelingJobResponse,describe_labeling_job_response +DescribeLagsRequest,describe_lags_request +DescribeLanguageModelRequest,describe_language_model_request +DescribeLanguageModelResponse,describe_language_model_response +DescribeLaunchConfigurationTemplatesRequest,describe_launch_configuration_templates_request +DescribeLaunchConfigurationTemplatesResponse,describe_launch_configuration_templates_response +DescribeLaunchTemplateVersionsRequest,describe_launch_template_versions_request +DescribeLaunchTemplateVersionsResult,describe_launch_template_versions_result +DescribeLaunchTemplatesRequest,describe_launch_templates_request +DescribeLaunchTemplatesResult,describe_launch_templates_result +DescribeLayersRequest,describe_layers_request +DescribeLayersResult,describe_layers_result +DescribeLedgerRequest,describe_ledger_request +DescribeLedgerResponse,describe_ledger_response +DescribeLifecycleConfigurationRequest,describe_lifecycle_configuration_request +DescribeLifecycleHookTypesAnswer,describe_lifecycle_hook_types_answer +DescribeLifecycleHooksAnswer,describe_lifecycle_hooks_answer +DescribeLifecycleHooksType,describe_lifecycle_hooks_type +DescribeLimitsOutput,describe_limits_output +DescribeLineageGroupRequest,describe_lineage_group_request +DescribeLineageGroupResponse,describe_lineage_group_response +DescribeListenerCertificatesInput,describe_listener_certificates_input +DescribeListenerCertificatesOutput,describe_listener_certificates_output +DescribeListenerRequest,describe_listener_request +DescribeListenerResponse,describe_listener_response +DescribeListenersInput,describe_listeners_input +DescribeListenersOutput,describe_listeners_output +DescribeLiveSourceRequest,describe_live_source_request +DescribeLiveSourceResponse,describe_live_source_response +DescribeLoaRequest,describe_loa_request +DescribeLoadBalancerAttributesInput,describe_load_balancer_attributes_input +DescribeLoadBalancerAttributesOutput,describe_load_balancer_attributes_output +DescribeLoadBalancerPoliciesInput,describe_load_balancer_policies_input +DescribeLoadBalancerPoliciesOutput,describe_load_balancer_policies_output +DescribeLoadBalancerPolicyTypesInput,describe_load_balancer_policy_types_input +DescribeLoadBalancerPolicyTypesOutput,describe_load_balancer_policy_types_output +DescribeLoadBalancerTargetGroupsRequest,describe_load_balancer_target_groups_request +DescribeLoadBalancerTargetGroupsResponse,describe_load_balancer_target_groups_response +DescribeLoadBalancersInput,describe_load_balancers_input +DescribeLoadBalancersOutput,describe_load_balancers_output +DescribeLoadBalancersRequest,describe_load_balancers_request +DescribeLoadBalancersResponse,describe_load_balancers_response +DescribeLoadBasedAutoScalingRequest,describe_load_based_auto_scaling_request +DescribeLoadBasedAutoScalingResult,describe_load_based_auto_scaling_result +DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest,describe_local_gateway_route_table_virtual_interface_group_associations_request +DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsResult,describe_local_gateway_route_table_virtual_interface_group_associations_result +DescribeLocalGatewayRouteTableVpcAssociationsRequest,describe_local_gateway_route_table_vpc_associations_request +DescribeLocalGatewayRouteTableVpcAssociationsResult,describe_local_gateway_route_table_vpc_associations_result +DescribeLocalGatewayRouteTablesRequest,describe_local_gateway_route_tables_request +DescribeLocalGatewayRouteTablesResult,describe_local_gateway_route_tables_result +DescribeLocalGatewayVirtualInterfaceGroupsRequest,describe_local_gateway_virtual_interface_groups_request +DescribeLocalGatewayVirtualInterfaceGroupsResult,describe_local_gateway_virtual_interface_groups_result +DescribeLocalGatewayVirtualInterfacesRequest,describe_local_gateway_virtual_interfaces_request +DescribeLocalGatewayVirtualInterfacesResult,describe_local_gateway_virtual_interfaces_result +DescribeLocalGatewaysRequest,describe_local_gateways_request +DescribeLocalGatewaysResult,describe_local_gateways_result +DescribeLocationAzureBlobRequest,describe_location_azure_blob_request +DescribeLocationAzureBlobResponse,describe_location_azure_blob_response +DescribeLocationEfsRequest,describe_location_efs_request +DescribeLocationEfsResponse,describe_location_efs_response +DescribeLocationFsxLustreRequest,describe_location_fsx_lustre_request +DescribeLocationFsxLustreResponse,describe_location_fsx_lustre_response +DescribeLocationFsxOntapRequest,describe_location_fsx_ontap_request +DescribeLocationFsxOntapResponse,describe_location_fsx_ontap_response +DescribeLocationFsxOpenZfsRequest,describe_location_fsx_open_zfs_request +DescribeLocationFsxOpenZfsResponse,describe_location_fsx_open_zfs_response +DescribeLocationFsxWindowsRequest,describe_location_fsx_windows_request +DescribeLocationFsxWindowsResponse,describe_location_fsx_windows_response +DescribeLocationHdfsRequest,describe_location_hdfs_request +DescribeLocationHdfsResponse,describe_location_hdfs_response +DescribeLocationNfsRequest,describe_location_nfs_request +DescribeLocationNfsResponse,describe_location_nfs_response +DescribeLocationObjectStorageRequest,describe_location_object_storage_request +DescribeLocationObjectStorageResponse,describe_location_object_storage_response +DescribeLocationS3Request,describe_location_s3_request +DescribeLocationS3Response,describe_location_s3_response +DescribeLocationSmbRequest,describe_location_smb_request +DescribeLocationSmbResponse,describe_location_smb_response +DescribeLogGroupsRequest,describe_log_groups_request +DescribeLogGroupsResponse,describe_log_groups_response +DescribeLogPatternRequest,describe_log_pattern_request +DescribeLogPatternResponse,describe_log_pattern_response +DescribeLogStreamsRequest,describe_log_streams_request +DescribeLogStreamsResponse,describe_log_streams_response +DescribeLoggingConfigurationRequest,describe_logging_configuration_request +DescribeLoggingConfigurationResponse,describe_logging_configuration_response +DescribeLoggingOptionsResponse,describe_logging_options_response +DescribeLoggingStatusMessage,describe_logging_status_message +DescribeLunaClientRequest,describe_luna_client_request +DescribeLunaClientResponse,describe_luna_client_response +DescribeMLModelsInput,describe_ml_models_input +DescribeMLModelsOutput,describe_ml_models_output +DescribeMailboxExportJobRequest,describe_mailbox_export_job_request +DescribeMailboxExportJobResponse,describe_mailbox_export_job_response +DescribeMaintenanceStartTimeInput,describe_maintenance_start_time_input +DescribeMaintenanceStartTimeOutput,describe_maintenance_start_time_output +DescribeMaintenanceWindowExecutionTaskInvocationsRequest,describe_maintenance_window_execution_task_invocations_request +DescribeMaintenanceWindowExecutionTaskInvocationsResult,describe_maintenance_window_execution_task_invocations_result +DescribeMaintenanceWindowExecutionTasksRequest,describe_maintenance_window_execution_tasks_request +DescribeMaintenanceWindowExecutionTasksResult,describe_maintenance_window_execution_tasks_result +DescribeMaintenanceWindowExecutionsRequest,describe_maintenance_window_executions_request +DescribeMaintenanceWindowExecutionsResult,describe_maintenance_window_executions_result +DescribeMaintenanceWindowScheduleRequest,describe_maintenance_window_schedule_request +DescribeMaintenanceWindowScheduleResult,describe_maintenance_window_schedule_result +DescribeMaintenanceWindowTargetsRequest,describe_maintenance_window_targets_request +DescribeMaintenanceWindowTargetsResult,describe_maintenance_window_targets_result +DescribeMaintenanceWindowTasksRequest,describe_maintenance_window_tasks_request +DescribeMaintenanceWindowTasksResult,describe_maintenance_window_tasks_result +DescribeMaintenanceWindowsForTargetRequest,describe_maintenance_windows_for_target_request +DescribeMaintenanceWindowsForTargetResult,describe_maintenance_windows_for_target_result +DescribeMaintenanceWindowsRequest,describe_maintenance_windows_request +DescribeMaintenanceWindowsResult,describe_maintenance_windows_result +DescribeMalwareScansRequest,describe_malware_scans_request +DescribeMalwareScansResponse,describe_malware_scans_response +DescribeManagedEndpointRequest,describe_managed_endpoint_request +DescribeManagedEndpointResponse,describe_managed_endpoint_response +DescribeManagedJobTemplateRequest,describe_managed_job_template_request +DescribeManagedJobTemplateResponse,describe_managed_job_template_response +DescribeManagedPrefixListsRequest,describe_managed_prefix_lists_request +DescribeManagedPrefixListsResult,describe_managed_prefix_lists_result +DescribeManagedProductsByVendorRequest,describe_managed_products_by_vendor_request +DescribeManagedProductsByVendorResponse,describe_managed_products_by_vendor_response +DescribeManagedRuleGroupRequest,describe_managed_rule_group_request +DescribeManagedRuleGroupResponse,describe_managed_rule_group_response +DescribeMapRequest,describe_map_request +DescribeMapResponse,describe_map_response +DescribeMapRunInput,describe_map_run_input +DescribeMapRunOutput,describe_map_run_output +DescribeMappedResourceConfigurationInput,describe_mapped_resource_configuration_input +DescribeMappedResourceConfigurationOutput,describe_mapped_resource_configuration_output +DescribeMatchmakingConfigurationsInput,describe_matchmaking_configurations_input +DescribeMatchmakingConfigurationsOutput,describe_matchmaking_configurations_output +DescribeMatchmakingInput,describe_matchmaking_input +DescribeMatchmakingOutput,describe_matchmaking_output +DescribeMatchmakingRuleSetsInput,describe_matchmaking_rule_sets_input +DescribeMatchmakingRuleSetsOutput,describe_matchmaking_rule_sets_output +DescribeMediaStorageConfigurationInput,describe_media_storage_configuration_input +DescribeMediaStorageConfigurationOutput,describe_media_storage_configuration_output +DescribeMergeConflictsInput,describe_merge_conflicts_input +DescribeMergeConflictsOutput,describe_merge_conflicts_output +DescribeMeshInput,describe_mesh_input +DescribeMeshOutput,describe_mesh_output +DescribeMetadataModelAssessmentsMessage,describe_metadata_model_assessments_message +DescribeMetadataModelAssessmentsResponse,describe_metadata_model_assessments_response +DescribeMetadataModelConversionsMessage,describe_metadata_model_conversions_message +DescribeMetadataModelConversionsResponse,describe_metadata_model_conversions_response +DescribeMetadataModelExportsAsScriptMessage,describe_metadata_model_exports_as_script_message +DescribeMetadataModelExportsAsScriptResponse,describe_metadata_model_exports_as_script_response +DescribeMetadataModelExportsToTargetMessage,describe_metadata_model_exports_to_target_message +DescribeMetadataModelExportsToTargetResponse,describe_metadata_model_exports_to_target_response +DescribeMetadataModelImportsMessage,describe_metadata_model_imports_message +DescribeMetadataModelImportsResponse,describe_metadata_model_imports_response +DescribeMetricAttributionRequest,describe_metric_attribution_request +DescribeMetricAttributionResponse,describe_metric_attribution_response +DescribeMetricCollectionTypesAnswer,describe_metric_collection_types_answer +DescribeMetricFiltersRequest,describe_metric_filters_request +DescribeMetricFiltersResponse,describe_metric_filters_response +DescribeMetricSetRequest,describe_metric_set_request +DescribeMetricSetResponse,describe_metric_set_response +DescribeMigrationProjectsMessage,describe_migration_projects_message +DescribeMigrationProjectsResponse,describe_migration_projects_response +DescribeMigrationTaskRequest,describe_migration_task_request +DescribeMigrationTaskResult,describe_migration_task_result +DescribeMitigationActionRequest,describe_mitigation_action_request +DescribeMitigationActionResponse,describe_mitigation_action_response +DescribeModelBiasJobDefinitionRequest,describe_model_bias_job_definition_request +DescribeModelBiasJobDefinitionResponse,describe_model_bias_job_definition_response +DescribeModelCardExportJobRequest,describe_model_card_export_job_request +DescribeModelCardExportJobResponse,describe_model_card_export_job_response +DescribeModelCardRequest,describe_model_card_request +DescribeModelCardResponse,describe_model_card_response +DescribeModelExplainabilityJobDefinitionRequest,describe_model_explainability_job_definition_request +DescribeModelExplainabilityJobDefinitionResponse,describe_model_explainability_job_definition_response +DescribeModelInput,describe_model_input +DescribeModelOutput,describe_model_output +DescribeModelPackageGroupInput,describe_model_package_group_input +DescribeModelPackageGroupOutput,describe_model_package_group_output +DescribeModelPackageInput,describe_model_package_input +DescribeModelPackageOutput,describe_model_package_output +DescribeModelPackagingJobRequest,describe_model_packaging_job_request +DescribeModelPackagingJobResponse,describe_model_packaging_job_response +DescribeModelQualityJobDefinitionRequest,describe_model_quality_job_definition_request +DescribeModelQualityJobDefinitionResponse,describe_model_quality_job_definition_response +DescribeModelRequest,describe_model_request +DescribeModelResponse,describe_model_response +DescribeModelVersionRequest,describe_model_version_request +DescribeModelVersionResponse,describe_model_version_response +DescribeModelVersionsRequest,describe_model_versions_request +DescribeModelVersionsResult,describe_model_versions_result +DescribeMonitorRequest,describe_monitor_request +DescribeMonitorResponse,describe_monitor_response +DescribeMonitoringScheduleRequest,describe_monitoring_schedule_request +DescribeMonitoringScheduleResponse,describe_monitoring_schedule_response +DescribeMountTargetSecurityGroupsRequest,describe_mount_target_security_groups_request +DescribeMountTargetSecurityGroupsResponse,describe_mount_target_security_groups_response +DescribeMountTargetsRequest,describe_mount_targets_request +DescribeMountTargetsResponse,describe_mount_targets_response +DescribeMovingAddressesRequest,describe_moving_addresses_request +DescribeMovingAddressesResult,describe_moving_addresses_result +DescribeMultiRegionAccessPointOperationRequest,describe_multi_region_access_point_operation_request +DescribeMultiRegionAccessPointOperationResult,describe_multi_region_access_point_operation_result +DescribeMultiplexProgramRequest,describe_multiplex_program_request +DescribeMultiplexProgramResponse,describe_multiplex_program_response +DescribeMultiplexRequest,describe_multiplex_request +DescribeMultiplexResponse,describe_multiplex_response +DescribeMyUserProfileResult,describe_my_user_profile_result +DescribeNFSFileSharesInput,describe_nfs_file_shares_input +DescribeNFSFileSharesOutput,describe_nfs_file_shares_output +DescribeNamespaceRequest,describe_namespace_request +DescribeNamespaceResponse,describe_namespace_response +DescribeNatGatewaysRequest,describe_nat_gateways_request +DescribeNatGatewaysResult,describe_nat_gateways_result +DescribeNetworkAclsRequest,describe_network_acls_request +DescribeNetworkAclsResult,describe_network_acls_result +DescribeNetworkInsightsAccessScopeAnalysesRequest,describe_network_insights_access_scope_analyses_request +DescribeNetworkInsightsAccessScopeAnalysesResult,describe_network_insights_access_scope_analyses_result +DescribeNetworkInsightsAccessScopesRequest,describe_network_insights_access_scopes_request +DescribeNetworkInsightsAccessScopesResult,describe_network_insights_access_scopes_result +DescribeNetworkInsightsAnalysesRequest,describe_network_insights_analyses_request +DescribeNetworkInsightsAnalysesResult,describe_network_insights_analyses_result +DescribeNetworkInsightsPathsRequest,describe_network_insights_paths_request +DescribeNetworkInsightsPathsResult,describe_network_insights_paths_result +DescribeNetworkInterfaceAttributeRequest,describe_network_interface_attribute_request +DescribeNetworkInterfaceAttributeResult,describe_network_interface_attribute_result +DescribeNetworkInterfacePermissionsRequest,describe_network_interface_permissions_request +DescribeNetworkInterfacePermissionsResult,describe_network_interface_permissions_result +DescribeNetworkInterfacesRequest,describe_network_interfaces_request +DescribeNetworkInterfacesResult,describe_network_interfaces_result +DescribeNodeAssociationStatusRequest,describe_node_association_status_request +DescribeNodeAssociationStatusResponse,describe_node_association_status_response +DescribeNodeConfigurationOptionsMessage,describe_node_configuration_options_message +DescribeNodeFromTemplateJobRequest,describe_node_from_template_job_request +DescribeNodeFromTemplateJobResponse,describe_node_from_template_job_response +DescribeNodeRequest,describe_node_request +DescribeNodeResponse,describe_node_response +DescribeNodegroupRequest,describe_nodegroup_request +DescribeNodegroupResponse,describe_nodegroup_response +DescribeNotebookExecutionInput,describe_notebook_execution_input +DescribeNotebookExecutionOutput,describe_notebook_execution_output +DescribeNotebookInstanceInput,describe_notebook_instance_input +DescribeNotebookInstanceLifecycleConfigInput,describe_notebook_instance_lifecycle_config_input +DescribeNotebookInstanceLifecycleConfigOutput,describe_notebook_instance_lifecycle_config_output +DescribeNotebookInstanceOutput,describe_notebook_instance_output +DescribeNotificationConfigurationInput,describe_notification_configuration_input +DescribeNotificationConfigurationOutput,describe_notification_configuration_output +DescribeNotificationConfigurationsAnswer,describe_notification_configurations_answer +DescribeNotificationConfigurationsType,describe_notification_configurations_type +DescribeNotificationRuleRequest,describe_notification_rule_request +DescribeNotificationRuleResult,describe_notification_rule_result +DescribeNotificationSubscriptionsRequest,describe_notification_subscriptions_request +DescribeNotificationSubscriptionsResponse,describe_notification_subscriptions_response +DescribeNotificationsForBudgetRequest,describe_notifications_for_budget_request +DescribeNotificationsForBudgetResponse,describe_notifications_for_budget_response +DescribeObjectRequest,describe_object_request +DescribeObjectResponse,describe_object_response +DescribeObjectsInput,describe_objects_input +DescribeObjectsOutput,describe_objects_output +DescribeObservabilityConfigurationRequest,describe_observability_configuration_request +DescribeObservabilityConfigurationResponse,describe_observability_configuration_response +DescribeObservationRequest,describe_observation_request +DescribeObservationResponse,describe_observation_response +DescribeOfferingRequest,describe_offering_request +DescribeOfferingResponse,describe_offering_response +DescribeOperatingSystemsResponse,describe_operating_systems_response +DescribeOpsItemsRequest,describe_ops_items_request +DescribeOpsItemsResponse,describe_ops_items_response +DescribeOptOutListsRequest,describe_opt_out_lists_request +DescribeOptOutListsResult,describe_opt_out_lists_result +DescribeOptedOutNumbersRequest,describe_opted_out_numbers_request +DescribeOptedOutNumbersResult,describe_opted_out_numbers_result +DescribeOptionGroupOptionsMessage,describe_option_group_options_message +DescribeOptionGroupsMessage,describe_option_groups_message +DescribeOrderableClusterOptionsMessage,describe_orderable_cluster_options_message +DescribeOrderableDBInstanceOptionsMessage,describe_orderable_db_instance_options_message +DescribeOrderableReplicationInstancesMessage,describe_orderable_replication_instances_message +DescribeOrderableReplicationInstancesResponse,describe_orderable_replication_instances_response +DescribeOrganizationConfigRuleStatusesRequest,describe_organization_config_rule_statuses_request +DescribeOrganizationConfigRuleStatusesResponse,describe_organization_config_rule_statuses_response +DescribeOrganizationConfigRulesRequest,describe_organization_config_rules_request +DescribeOrganizationConfigRulesResponse,describe_organization_config_rules_response +DescribeOrganizationConfigurationRequest,describe_organization_configuration_request +DescribeOrganizationConfigurationResponse,describe_organization_configuration_response +DescribeOrganizationConformancePackStatusesRequest,describe_organization_conformance_pack_statuses_request +DescribeOrganizationConformancePackStatusesResponse,describe_organization_conformance_pack_statuses_response +DescribeOrganizationConformancePacksRequest,describe_organization_conformance_packs_request +DescribeOrganizationConformancePacksResponse,describe_organization_conformance_packs_response +DescribeOrganizationHealthRequest,describe_organization_health_request +DescribeOrganizationHealthResponse,describe_organization_health_response +DescribeOrganizationOverviewRequest,describe_organization_overview_request +DescribeOrganizationOverviewResponse,describe_organization_overview_response +DescribeOrganizationRequest,describe_organization_request +DescribeOrganizationResourceCollectionHealthRequest,describe_organization_resource_collection_health_request +DescribeOrganizationResourceCollectionHealthResponse,describe_organization_resource_collection_health_response +DescribeOrganizationResponse,describe_organization_response +DescribeOrganizationalUnitRequest,describe_organizational_unit_request +DescribeOrganizationalUnitResponse,describe_organizational_unit_response +DescribeOrganizationsAccessInput,describe_organizations_access_input +DescribeOrganizationsAccessOutput,describe_organizations_access_output +DescribeOriginEndpointRequest,describe_origin_endpoint_request +DescribeOriginEndpointResponse,describe_origin_endpoint_response +DescribeOutboundConnectionsRequest,describe_outbound_connections_request +DescribeOutboundConnectionsResponse,describe_outbound_connections_response +DescribeOutboundCrossClusterSearchConnectionsRequest,describe_outbound_cross_cluster_search_connections_request +DescribeOutboundCrossClusterSearchConnectionsResponse,describe_outbound_cross_cluster_search_connections_response +DescribePHIDetectionJobRequest,describe_phi_detection_job_request +DescribePHIDetectionJobResponse,describe_phi_detection_job_response +DescribePackageImportJobRequest,describe_package_import_job_request +DescribePackageImportJobResponse,describe_package_import_job_response +DescribePackageRequest,describe_package_request +DescribePackageResponse,describe_package_response +DescribePackageResult,describe_package_result +DescribePackageVersionRequest,describe_package_version_request +DescribePackageVersionResponse,describe_package_version_response +DescribePackageVersionResult,describe_package_version_result +DescribePackagesFilter,describe_packages_filter +DescribePackagesRequest,describe_packages_request +DescribePackagesResponse,describe_packages_response +DescribePackagingConfigurationRequest,describe_packaging_configuration_request +DescribePackagingConfigurationResponse,describe_packaging_configuration_response +DescribePackagingGroupRequest,describe_packaging_group_request +DescribePackagingGroupResponse,describe_packaging_group_response +DescribePageRequest,describe_page_request +DescribePageResult,describe_page_result +DescribeParameterGroupsRequest,describe_parameter_groups_request +DescribeParameterGroupsResponse,describe_parameter_groups_response +DescribeParametersRequest,describe_parameters_request +DescribeParametersResponse,describe_parameters_response +DescribeParametersResult,describe_parameters_result +DescribePartnerEventSourceRequest,describe_partner_event_source_request +DescribePartnerEventSourceResponse,describe_partner_event_source_response +DescribePartnersInputMessage,describe_partners_input_message +DescribePartnersOutputMessage,describe_partners_output_message +DescribePatchBaselinesRequest,describe_patch_baselines_request +DescribePatchBaselinesResult,describe_patch_baselines_result +DescribePatchGroupStateRequest,describe_patch_group_state_request +DescribePatchGroupStateResult,describe_patch_group_state_result +DescribePatchGroupsRequest,describe_patch_groups_request +DescribePatchGroupsResult,describe_patch_groups_result +DescribePatchPropertiesRequest,describe_patch_properties_request +DescribePatchPropertiesResult,describe_patch_properties_result +DescribePendingAggregationRequestsRequest,describe_pending_aggregation_requests_request +DescribePendingAggregationRequestsResponse,describe_pending_aggregation_requests_response +DescribePendingMaintenanceActionsMessage,describe_pending_maintenance_actions_message +DescribePendingMaintenanceActionsResponse,describe_pending_maintenance_actions_response +DescribePermissionSetProvisioningStatusRequest,describe_permission_set_provisioning_status_request +DescribePermissionSetProvisioningStatusResponse,describe_permission_set_provisioning_status_response +DescribePermissionSetRequest,describe_permission_set_request +DescribePermissionSetResponse,describe_permission_set_response +DescribePermissionsRequest,describe_permissions_request +DescribePermissionsResult,describe_permissions_result +DescribePhoneNumberRequest,describe_phone_number_request +DescribePhoneNumberResponse,describe_phone_number_response +DescribePhoneNumbersRequest,describe_phone_numbers_request +DescribePhoneNumbersResult,describe_phone_numbers_result +DescribePiiEntitiesDetectionJobRequest,describe_pii_entities_detection_job_request +DescribePiiEntitiesDetectionJobResponse,describe_pii_entities_detection_job_response +DescribePipeRequest,describe_pipe_request +DescribePipeResponse,describe_pipe_response +DescribePipelineDefinitionForExecutionRequest,describe_pipeline_definition_for_execution_request +DescribePipelineDefinitionForExecutionResponse,describe_pipeline_definition_for_execution_response +DescribePipelineExecutionRequest,describe_pipeline_execution_request +DescribePipelineExecutionResponse,describe_pipeline_execution_response +DescribePipelineRequest,describe_pipeline_request +DescribePipelineResponse,describe_pipeline_response +DescribePipelinesInput,describe_pipelines_input +DescribePipelinesOutput,describe_pipelines_output +DescribePlaceIndexRequest,describe_place_index_request +DescribePlaceIndexResponse,describe_place_index_response +DescribePlacementGroupsRequest,describe_placement_groups_request +DescribePlacementGroupsResult,describe_placement_groups_result +DescribePlacementRequest,describe_placement_request +DescribePlacementResponse,describe_placement_response +DescribePlatformVersionRequest,describe_platform_version_request +DescribePlatformVersionResult,describe_platform_version_result +DescribePlayerSessionsInput,describe_player_sessions_input +DescribePlayerSessionsOutput,describe_player_sessions_output +DescribePoliciesType,describe_policies_type +DescribePolicyRequest,describe_policy_request +DescribePolicyResponse,describe_policy_response +DescribePoolsRequest,describe_pools_request +DescribePoolsResult,describe_pools_result +DescribePortalRequest,describe_portal_request +DescribePortalResponse,describe_portal_response +DescribePortfolioInput,describe_portfolio_input +DescribePortfolioOutput,describe_portfolio_output +DescribePortfolioShareStatusInput,describe_portfolio_share_status_input +DescribePortfolioShareStatusOutput,describe_portfolio_share_status_output +DescribePortfolioSharesInput,describe_portfolio_shares_input +DescribePortfolioSharesOutput,describe_portfolio_shares_output +DescribePredictorBacktestExportJobRequest,describe_predictor_backtest_export_job_request +DescribePredictorBacktestExportJobResponse,describe_predictor_backtest_export_job_response +DescribePredictorRequest,describe_predictor_request +DescribePredictorResponse,describe_predictor_response +DescribePrefixListsRequest,describe_prefix_lists_request +DescribePrefixListsResult,describe_prefix_lists_result +DescribePrincipalIdFormatRequest,describe_principal_id_format_request +DescribePrincipalIdFormatResult,describe_principal_id_format_result +DescribePrincipalMappingRequest,describe_principal_mapping_request +DescribePrincipalMappingResponse,describe_principal_mapping_response +DescribeProblemObservationsRequest,describe_problem_observations_request +DescribeProblemObservationsResponse,describe_problem_observations_response +DescribeProblemRequest,describe_problem_request +DescribeProblemResponse,describe_problem_response +DescribeProcessingJobRequest,describe_processing_job_request +DescribeProcessingJobResponse,describe_processing_job_response +DescribeProductAsAdminInput,describe_product_as_admin_input +DescribeProductAsAdminOutput,describe_product_as_admin_output +DescribeProductInput,describe_product_input +DescribeProductOutput,describe_product_output +DescribeProductViewInput,describe_product_view_input +DescribeProductViewOutput,describe_product_view_output +DescribeProductsRequest,describe_products_request +DescribeProductsResponse,describe_products_response +DescribeProfileRequest,describe_profile_request +DescribeProfileResponse,describe_profile_response +DescribeProfilingGroupRequest,describe_profiling_group_request +DescribeProfilingGroupResponse,describe_profiling_group_response +DescribeProgramRequest,describe_program_request +DescribeProgramResponse,describe_program_response +DescribeProjectInput,describe_project_input +DescribeProjectOutput,describe_project_output +DescribeProjectRequest,describe_project_request +DescribeProjectResponse,describe_project_response +DescribeProjectResult,describe_project_result +DescribeProjectVersionsRequest,describe_project_versions_request +DescribeProjectVersionsResponse,describe_project_versions_response +DescribeProjectsRequest,describe_projects_request +DescribeProjectsResponse,describe_projects_response +DescribePromptRequest,describe_prompt_request +DescribePromptResponse,describe_prompt_response +DescribeProtectedResourceInput,describe_protected_resource_input +DescribeProtectedResourceOutput,describe_protected_resource_output +DescribeProtectionGroupRequest,describe_protection_group_request +DescribeProtectionGroupResponse,describe_protection_group_response +DescribeProtectionRequest,describe_protection_request +DescribeProtectionResponse,describe_protection_response +DescribeProvisionedProductInput,describe_provisioned_product_input +DescribeProvisionedProductOutput,describe_provisioned_product_output +DescribeProvisionedProductPlanInput,describe_provisioned_product_plan_input +DescribeProvisionedProductPlanOutput,describe_provisioned_product_plan_output +DescribeProvisioningArtifactInput,describe_provisioning_artifact_input +DescribeProvisioningArtifactOutput,describe_provisioning_artifact_output +DescribeProvisioningParametersInput,describe_provisioning_parameters_input +DescribeProvisioningParametersOutput,describe_provisioning_parameters_output +DescribeProvisioningTemplateRequest,describe_provisioning_template_request +DescribeProvisioningTemplateResponse,describe_provisioning_template_response +DescribeProvisioningTemplateVersionRequest,describe_provisioning_template_version_request +DescribeProvisioningTemplateVersionResponse,describe_provisioning_template_version_response +DescribePublicIpv4PoolsRequest,describe_public_ipv4_pools_request +DescribePublicIpv4PoolsResult,describe_public_ipv4_pools_result +DescribePublisherInput,describe_publisher_input +DescribePublisherOutput,describe_publisher_output +DescribePublishingDestinationRequest,describe_publishing_destination_request +DescribePublishingDestinationResponse,describe_publishing_destination_response +DescribePullRequestEventsInput,describe_pull_request_events_input +DescribePullRequestEventsOutput,describe_pull_request_events_output +DescribePullThroughCacheRulesRequest,describe_pull_through_cache_rules_request +DescribePullThroughCacheRulesResponse,describe_pull_through_cache_rules_response +DescribeQueriesRequest,describe_queries_request +DescribeQueriesResponse,describe_queries_response +DescribeQueryDefinitionsRequest,describe_query_definitions_request +DescribeQueryDefinitionsResponse,describe_query_definitions_response +DescribeQueryRequest,describe_query_request +DescribeQueryResponse,describe_query_response +DescribeQuerySuggestionsBlockListRequest,describe_query_suggestions_block_list_request +DescribeQuerySuggestionsBlockListResponse,describe_query_suggestions_block_list_response +DescribeQuerySuggestionsConfigRequest,describe_query_suggestions_config_request +DescribeQuerySuggestionsConfigResponse,describe_query_suggestions_config_response +DescribeQueueRequest,describe_queue_request +DescribeQueueResponse,describe_queue_response +DescribeQuickConnectRequest,describe_quick_connect_request +DescribeQuickConnectResponse,describe_quick_connect_response +DescribeRaidArraysRequest,describe_raid_arrays_request +DescribeRaidArraysResult,describe_raid_arrays_result +DescribeRdsDbInstancesRequest,describe_rds_db_instances_request +DescribeRdsDbInstancesResult,describe_rds_db_instances_result +DescribeReceiptRuleRequest,describe_receipt_rule_request +DescribeReceiptRuleResponse,describe_receipt_rule_response +DescribeReceiptRuleSetRequest,describe_receipt_rule_set_request +DescribeReceiptRuleSetResponse,describe_receipt_rule_set_response +DescribeRecipeRequest,describe_recipe_request +DescribeRecipeResponse,describe_recipe_response +DescribeRecommendationExportJobsRequest,describe_recommendation_export_jobs_request +DescribeRecommendationExportJobsResponse,describe_recommendation_export_jobs_response +DescribeRecommendationFeedbackRequest,describe_recommendation_feedback_request +DescribeRecommendationFeedbackResponse,describe_recommendation_feedback_response +DescribeRecommendationLimitationsRequest,describe_recommendation_limitations_request +DescribeRecommendationLimitationsResponse,describe_recommendation_limitations_response +DescribeRecommendationsRequest,describe_recommendations_request +DescribeRecommendationsResponse,describe_recommendations_response +DescribeRecommenderRequest,describe_recommender_request +DescribeRecommenderResponse,describe_recommender_response +DescribeRecordInput,describe_record_input +DescribeRecordOutput,describe_record_output +DescribeRecoveryInstancesRequest,describe_recovery_instances_request +DescribeRecoveryInstancesRequestFilters,describe_recovery_instances_request_filters +DescribeRecoveryInstancesResponse,describe_recovery_instances_response +DescribeRecoveryPointInput,describe_recovery_point_input +DescribeRecoveryPointOutput,describe_recovery_point_output +DescribeRecoverySnapshotsRequest,describe_recovery_snapshots_request +DescribeRecoverySnapshotsRequestFilters,describe_recovery_snapshots_request_filters +DescribeRecoverySnapshotsResponse,describe_recovery_snapshots_response +DescribeRefreshScheduleRequest,describe_refresh_schedule_request +DescribeRefreshScheduleResponse,describe_refresh_schedule_response +DescribeRefreshSchemasStatusMessage,describe_refresh_schemas_status_message +DescribeRefreshSchemasStatusResponse,describe_refresh_schemas_status_response +DescribeRegionSettingsOutput,describe_region_settings_output +DescribeRegionsRequest,describe_regions_request +DescribeRegionsResult,describe_regions_result +DescribeRegistriesRequest,describe_registries_request +DescribeRegistriesResponse,describe_registries_response +DescribeRegistryRequest,describe_registry_request +DescribeRegistryResponse,describe_registry_response +DescribeReleaseLabelInput,describe_release_label_input +DescribeReleaseLabelOutput,describe_release_label_output +DescribeRemediationConfigurationsRequest,describe_remediation_configurations_request +DescribeRemediationConfigurationsResponse,describe_remediation_configurations_response +DescribeRemediationExceptionsRequest,describe_remediation_exceptions_request +DescribeRemediationExceptionsResponse,describe_remediation_exceptions_response +DescribeRemediationExecutionStatusRequest,describe_remediation_execution_status_request +DescribeRemediationExecutionStatusResponse,describe_remediation_execution_status_response +DescribeReplaceRootVolumeTasksRequest,describe_replace_root_volume_tasks_request +DescribeReplaceRootVolumeTasksResult,describe_replace_root_volume_tasks_result +DescribeReplayRequest,describe_replay_request +DescribeReplayResponse,describe_replay_response +DescribeReplicationConfigsMessage,describe_replication_configs_message +DescribeReplicationConfigsResponse,describe_replication_configs_response +DescribeReplicationConfigurationTemplatesRequest,describe_replication_configuration_templates_request +DescribeReplicationConfigurationTemplatesResponse,describe_replication_configuration_templates_response +DescribeReplicationConfigurationsRequest,describe_replication_configurations_request +DescribeReplicationConfigurationsResponse,describe_replication_configurations_response +DescribeReplicationGroupsMessage,describe_replication_groups_message +DescribeReplicationInstanceTaskLogsMessage,describe_replication_instance_task_logs_message +DescribeReplicationInstanceTaskLogsResponse,describe_replication_instance_task_logs_response +DescribeReplicationInstancesMessage,describe_replication_instances_message +DescribeReplicationInstancesResponse,describe_replication_instances_response +DescribeReplicationSubnetGroupsMessage,describe_replication_subnet_groups_message +DescribeReplicationSubnetGroupsResponse,describe_replication_subnet_groups_response +DescribeReplicationTableStatisticsMessage,describe_replication_table_statistics_message +DescribeReplicationTableStatisticsResponse,describe_replication_table_statistics_response +DescribeReplicationTaskAssessmentResultsMessage,describe_replication_task_assessment_results_message +DescribeReplicationTaskAssessmentResultsResponse,describe_replication_task_assessment_results_response +DescribeReplicationTaskAssessmentRunsMessage,describe_replication_task_assessment_runs_message +DescribeReplicationTaskAssessmentRunsResponse,describe_replication_task_assessment_runs_response +DescribeReplicationTaskIndividualAssessmentsMessage,describe_replication_task_individual_assessments_message +DescribeReplicationTaskIndividualAssessmentsResponse,describe_replication_task_individual_assessments_response +DescribeReplicationTasksMessage,describe_replication_tasks_message +DescribeReplicationTasksResponse,describe_replication_tasks_response +DescribeReplicationsMessage,describe_replications_message +DescribeReplicationsResponse,describe_replications_response +DescribeReportCreationOutput,describe_report_creation_output +DescribeReportDefinitionsRequest,describe_report_definitions_request +DescribeReportDefinitionsResponse,describe_report_definitions_response +DescribeReportJobInput,describe_report_job_input +DescribeReportJobOutput,describe_report_job_output +DescribeReportPlanInput,describe_report_plan_input +DescribeReportPlanOutput,describe_report_plan_output +DescribeRepositoriesRequest,describe_repositories_request +DescribeRepositoriesResponse,describe_repositories_response +DescribeRepositoryAssociationRequest,describe_repository_association_request +DescribeRepositoryAssociationResponse,describe_repository_association_response +DescribeRepositoryRequest,describe_repository_request +DescribeRepositoryResult,describe_repository_result +DescribeRescoreExecutionPlanRequest,describe_rescore_execution_plan_request +DescribeRescoreExecutionPlanResponse,describe_rescore_execution_plan_response +DescribeReservationRequest,describe_reservation_request +DescribeReservationResponse,describe_reservation_response +DescribeReservedCacheNodesMessage,describe_reserved_cache_nodes_message +DescribeReservedCacheNodesOfferingsMessage,describe_reserved_cache_nodes_offerings_message +DescribeReservedDBInstancesMessage,describe_reserved_db_instances_message +DescribeReservedDBInstancesOfferingsMessage,describe_reserved_db_instances_offerings_message +DescribeReservedElasticsearchInstanceOfferingsRequest,describe_reserved_elasticsearch_instance_offerings_request +DescribeReservedElasticsearchInstanceOfferingsResponse,describe_reserved_elasticsearch_instance_offerings_response +DescribeReservedElasticsearchInstancesRequest,describe_reserved_elasticsearch_instances_request +DescribeReservedElasticsearchInstancesResponse,describe_reserved_elasticsearch_instances_response +DescribeReservedInstanceOfferingsRequest,describe_reserved_instance_offerings_request +DescribeReservedInstanceOfferingsResponse,describe_reserved_instance_offerings_response +DescribeReservedInstancesListingsRequest,describe_reserved_instances_listings_request +DescribeReservedInstancesListingsResult,describe_reserved_instances_listings_result +DescribeReservedInstancesModificationsRequest,describe_reserved_instances_modifications_request +DescribeReservedInstancesModificationsResult,describe_reserved_instances_modifications_result +DescribeReservedInstancesOfferingsRequest,describe_reserved_instances_offerings_request +DescribeReservedInstancesOfferingsResult,describe_reserved_instances_offerings_result +DescribeReservedInstancesRequest,describe_reserved_instances_request +DescribeReservedInstancesResponse,describe_reserved_instances_response +DescribeReservedInstancesResult,describe_reserved_instances_result +DescribeReservedNodeExchangeStatusInputMessage,describe_reserved_node_exchange_status_input_message +DescribeReservedNodeExchangeStatusOutputMessage,describe_reserved_node_exchange_status_output_message +DescribeReservedNodeOfferingsMessage,describe_reserved_node_offerings_message +DescribeReservedNodesMessage,describe_reserved_nodes_message +DescribeReservedNodesOfferingsRequest,describe_reserved_nodes_offerings_request +DescribeReservedNodesOfferingsResponse,describe_reserved_nodes_offerings_response +DescribeReservedNodesRequest,describe_reserved_nodes_request +DescribeReservedNodesResponse,describe_reserved_nodes_response +DescribeResiliencyPolicyRequest,describe_resiliency_policy_request +DescribeResiliencyPolicyResponse,describe_resiliency_policy_response +DescribeResizeMessage,describe_resize_message +DescribeResourceCollectionHealthRequest,describe_resource_collection_health_request +DescribeResourceCollectionHealthResponse,describe_resource_collection_health_response +DescribeResourceGroupsRequest,describe_resource_groups_request +DescribeResourceGroupsResponse,describe_resource_groups_response +DescribeResourcePermissionsRequest,describe_resource_permissions_request +DescribeResourcePermissionsResponse,describe_resource_permissions_response +DescribeResourcePoliciesRequest,describe_resource_policies_request +DescribeResourcePoliciesResponse,describe_resource_policies_response +DescribeResourcePolicyRequest,describe_resource_policy_request +DescribeResourcePolicyResponse,describe_resource_policy_response +DescribeResourceRequest,describe_resource_request +DescribeResourceResponse,describe_resource_response +DescribeResourceServerRequest,describe_resource_server_request +DescribeResourceServerResponse,describe_resource_server_response +DescribeRestoreJobInput,describe_restore_job_input +DescribeRestoreJobOutput,describe_restore_job_output +DescribeRetentionConfigurationsRequest,describe_retention_configurations_request +DescribeRetentionConfigurationsResponse,describe_retention_configurations_response +DescribeRetrainingSchedulerRequest,describe_retraining_scheduler_request +DescribeRetrainingSchedulerResponse,describe_retraining_scheduler_response +DescribeReturnShippingLabelRequest,describe_return_shipping_label_request +DescribeReturnShippingLabelResult,describe_return_shipping_label_result +DescribeRiskConfigurationRequest,describe_risk_configuration_request +DescribeRiskConfigurationResponse,describe_risk_configuration_response +DescribeRobotApplicationRequest,describe_robot_application_request +DescribeRobotApplicationResponse,describe_robot_application_response +DescribeRobotRequest,describe_robot_request +DescribeRobotResponse,describe_robot_response +DescribeRoleAliasRequest,describe_role_alias_request +DescribeRoleAliasResponse,describe_role_alias_response +DescribeRootFoldersRequest,describe_root_folders_request +DescribeRootFoldersResponse,describe_root_folders_response +DescribeRouteCalculatorRequest,describe_route_calculator_request +DescribeRouteCalculatorResponse,describe_route_calculator_response +DescribeRouteInput,describe_route_input +DescribeRouteOutput,describe_route_output +DescribeRouteTablesRequest,describe_route_tables_request +DescribeRouteTablesResult,describe_route_tables_result +DescribeRouterConfigurationRequest,describe_router_configuration_request +DescribeRouterConfigurationResponse,describe_router_configuration_response +DescribeRoutingControlRequest,describe_routing_control_request +DescribeRoutingControlResponse,describe_routing_control_response +DescribeRoutingProfileRequest,describe_routing_profile_request +DescribeRoutingProfileResponse,describe_routing_profile_response +DescribeRuleGroupMetadataRequest,describe_rule_group_metadata_request +DescribeRuleGroupMetadataResponse,describe_rule_group_metadata_response +DescribeRuleGroupRequest,describe_rule_group_request +DescribeRuleGroupResponse,describe_rule_group_response +DescribeRuleGroupsNamespaceRequest,describe_rule_groups_namespace_request +DescribeRuleGroupsNamespaceResponse,describe_rule_groups_namespace_response +DescribeRuleRequest,describe_rule_request +DescribeRuleResponse,describe_rule_response +DescribeRulesInput,describe_rules_input +DescribeRulesOutput,describe_rules_output +DescribeRulesPackagesRequest,describe_rules_packages_request +DescribeRulesPackagesResponse,describe_rules_packages_response +DescribeRulesetRequest,describe_ruleset_request +DescribeRulesetResponse,describe_ruleset_response +DescribeRuntimeConfigurationInput,describe_runtime_configuration_input +DescribeRuntimeConfigurationOutput,describe_runtime_configuration_output +DescribeRuntimeVersionsRequest,describe_runtime_versions_request +DescribeRuntimeVersionsResponse,describe_runtime_versions_response +DescribeRxNormInferenceJobRequest,describe_rx_norm_inference_job_request +DescribeRxNormInferenceJobResponse,describe_rx_norm_inference_job_response +DescribeSMBFileSharesInput,describe_smb_file_shares_input +DescribeSMBFileSharesOutput,describe_smb_file_shares_output +DescribeSMBSettingsInput,describe_smb_settings_input +DescribeSMBSettingsOutput,describe_smb_settings_output +DescribeSNOMEDCTInferenceJobRequest,describe_snomedct_inference_job_request +DescribeSNOMEDCTInferenceJobResponse,describe_snomedct_inference_job_response +DescribeSSLPoliciesInput,describe_ssl_policies_input +DescribeSSLPoliciesOutput,describe_ssl_policies_output +DescribeSafetyRuleRequest,describe_safety_rule_request +DescribeSafetyRuleResponse,describe_safety_rule_response +DescribeSavingsPlanRatesRequest,describe_savings_plan_rates_request +DescribeSavingsPlanRatesResponse,describe_savings_plan_rates_response +DescribeSavingsPlansOfferingRatesRequest,describe_savings_plans_offering_rates_request +DescribeSavingsPlansOfferingRatesResponse,describe_savings_plans_offering_rates_response +DescribeSavingsPlansOfferingsRequest,describe_savings_plans_offerings_request +DescribeSavingsPlansOfferingsResponse,describe_savings_plans_offerings_response +DescribeSavingsPlansRequest,describe_savings_plans_request +DescribeSavingsPlansResponse,describe_savings_plans_response +DescribeScalableTargetsRequest,describe_scalable_targets_request +DescribeScalableTargetsResponse,describe_scalable_targets_response +DescribeScalingActivitiesRequest,describe_scaling_activities_request +DescribeScalingActivitiesResponse,describe_scaling_activities_response +DescribeScalingActivitiesType,describe_scaling_activities_type +DescribeScalingParametersRequest,describe_scaling_parameters_request +DescribeScalingParametersResponse,describe_scaling_parameters_response +DescribeScalingPlanResourcesRequest,describe_scaling_plan_resources_request +DescribeScalingPlanResourcesResponse,describe_scaling_plan_resources_response +DescribeScalingPlansRequest,describe_scaling_plans_request +DescribeScalingPlansResponse,describe_scaling_plans_response +DescribeScalingPoliciesInput,describe_scaling_policies_input +DescribeScalingPoliciesOutput,describe_scaling_policies_output +DescribeScalingPoliciesRequest,describe_scaling_policies_request +DescribeScalingPoliciesResponse,describe_scaling_policies_response +DescribeScheduleRequest,describe_schedule_request +DescribeScheduleResponse,describe_schedule_response +DescribeScheduledActionsMessage,describe_scheduled_actions_message +DescribeScheduledActionsRequest,describe_scheduled_actions_request +DescribeScheduledActionsResponse,describe_scheduled_actions_response +DescribeScheduledActionsType,describe_scheduled_actions_type +DescribeScheduledAuditRequest,describe_scheduled_audit_request +DescribeScheduledAuditResponse,describe_scheduled_audit_response +DescribeScheduledInstanceAvailabilityRequest,describe_scheduled_instance_availability_request +DescribeScheduledInstanceAvailabilityResult,describe_scheduled_instance_availability_result +DescribeScheduledInstancesRequest,describe_scheduled_instances_request +DescribeScheduledInstancesResult,describe_scheduled_instances_result +DescribeScheduledQueryRequest,describe_scheduled_query_request +DescribeScheduledQueryResponse,describe_scheduled_query_response +DescribeSchedulingPoliciesRequest,describe_scheduling_policies_request +DescribeSchedulingPoliciesResponse,describe_scheduling_policies_response +DescribeSchemaRequest,describe_schema_request +DescribeSchemaResponse,describe_schema_response +DescribeSchemasMessage,describe_schemas_message +DescribeSchemasResponse,describe_schemas_response +DescribeScriptInput,describe_script_input +DescribeScriptOutput,describe_script_output +DescribeSecretRequest,describe_secret_request +DescribeSecretResponse,describe_secret_response +DescribeSecurityConfigurationInput,describe_security_configuration_input +DescribeSecurityConfigurationOutput,describe_security_configuration_output +DescribeSecurityGroupReferencesRequest,describe_security_group_references_request +DescribeSecurityGroupReferencesResult,describe_security_group_references_result +DescribeSecurityGroupRulesRequest,describe_security_group_rules_request +DescribeSecurityGroupRulesResult,describe_security_group_rules_result +DescribeSecurityGroupsRequest,describe_security_groups_request +DescribeSecurityGroupsResult,describe_security_groups_result +DescribeSecurityPolicyRequest,describe_security_policy_request +DescribeSecurityPolicyResponse,describe_security_policy_response +DescribeSecurityProfileRequest,describe_security_profile_request +DescribeSecurityProfileResponse,describe_security_profile_response +DescribeSenderIdsRequest,describe_sender_ids_request +DescribeSenderIdsResult,describe_sender_ids_result +DescribeSentimentDetectionJobRequest,describe_sentiment_detection_job_request +DescribeSentimentDetectionJobResponse,describe_sentiment_detection_job_response +DescribeServerRequest,describe_server_request +DescribeServerResponse,describe_server_response +DescribeServersRequest,describe_servers_request +DescribeServersResponse,describe_servers_response +DescribeServiceAccessPoliciesRequest,describe_service_access_policies_request +DescribeServiceAccessPoliciesResponse,describe_service_access_policies_response +DescribeServiceActionExecutionParametersInput,describe_service_action_execution_parameters_input +DescribeServiceActionExecutionParametersOutput,describe_service_action_execution_parameters_output +DescribeServiceActionInput,describe_service_action_input +DescribeServiceActionOutput,describe_service_action_output +DescribeServiceErrorsRequest,describe_service_errors_request +DescribeServiceErrorsResult,describe_service_errors_result +DescribeServiceIntegrationResponse,describe_service_integration_response +DescribeServiceRequest,describe_service_request +DescribeServiceResponse,describe_service_response +DescribeServiceUpdatesMessage,describe_service_updates_message +DescribeServiceUpdatesRequest,describe_service_updates_request +DescribeServiceUpdatesResponse,describe_service_updates_response +DescribeServicesRequest,describe_services_request +DescribeServicesResponse,describe_services_response +DescribeSessionsRequest,describe_sessions_request +DescribeSessionsResponse,describe_sessions_response +DescribeSessionsResult,describe_sessions_result +DescribeSettingsRequest,describe_settings_request +DescribeSettingsResult,describe_settings_result +DescribeSeverityLevelsRequest,describe_severity_levels_request +DescribeSeverityLevelsResponse,describe_severity_levels_response +DescribeShardInterval,describe_shard_interval +DescribeSharedDirectoriesRequest,describe_shared_directories_request +DescribeSharedDirectoriesResult,describe_shared_directories_result +DescribeSignalingChannelInput,describe_signaling_channel_input +DescribeSignalingChannelOutput,describe_signaling_channel_output +DescribeSigningJobRequest,describe_signing_job_request +DescribeSigningJobResponse,describe_signing_job_response +DescribeSimulationApplicationRequest,describe_simulation_application_request +DescribeSimulationApplicationResponse,describe_simulation_application_response +DescribeSimulationInput,describe_simulation_input +DescribeSimulationJobBatchRequest,describe_simulation_job_batch_request +DescribeSimulationJobBatchResponse,describe_simulation_job_batch_response +DescribeSimulationJobRequest,describe_simulation_job_request +DescribeSimulationJobResponse,describe_simulation_job_response +DescribeSimulationOutput,describe_simulation_output +DescribeSlotRequest,describe_slot_request +DescribeSlotResponse,describe_slot_response +DescribeSlotTypeRequest,describe_slot_type_request +DescribeSlotTypeResponse,describe_slot_type_response +DescribeSnapshotAttributeRequest,describe_snapshot_attribute_request +DescribeSnapshotAttributeResult,describe_snapshot_attribute_result +DescribeSnapshotCopyGrantsMessage,describe_snapshot_copy_grants_message +DescribeSnapshotScheduleInput,describe_snapshot_schedule_input +DescribeSnapshotScheduleOutput,describe_snapshot_schedule_output +DescribeSnapshotSchedulesMessage,describe_snapshot_schedules_message +DescribeSnapshotSchedulesOutputMessage,describe_snapshot_schedules_output_message +DescribeSnapshotTierStatusRequest,describe_snapshot_tier_status_request +DescribeSnapshotTierStatusResult,describe_snapshot_tier_status_result +DescribeSnapshotsListMessage,describe_snapshots_list_message +DescribeSnapshotsMessage,describe_snapshots_message +DescribeSnapshotsRequest,describe_snapshots_request +DescribeSnapshotsResponse,describe_snapshots_response +DescribeSnapshotsResult,describe_snapshots_result +DescribeSolutionRequest,describe_solution_request +DescribeSolutionResponse,describe_solution_response +DescribeSolutionVersionRequest,describe_solution_version_request +DescribeSolutionVersionResponse,describe_solution_version_response +DescribeSourceLocationRequest,describe_source_location_request +DescribeSourceLocationResponse,describe_source_location_response +DescribeSourceNetworksRequest,describe_source_networks_request +DescribeSourceNetworksRequestFilters,describe_source_networks_request_filters +DescribeSourceNetworksResponse,describe_source_networks_response +DescribeSourceRegionsMessage,describe_source_regions_message +DescribeSourceServersRequest,describe_source_servers_request +DescribeSourceServersRequestFilters,describe_source_servers_request_filters +DescribeSourceServersResponse,describe_source_servers_response +DescribeSpaceRequest,describe_space_request +DescribeSpaceResponse,describe_space_response +DescribeSpeakerEnrollmentJobRequest,describe_speaker_enrollment_job_request +DescribeSpeakerEnrollmentJobResponse,describe_speaker_enrollment_job_response +DescribeSpeakerRequest,describe_speaker_request +DescribeSpeakerResponse,describe_speaker_response +DescribeSpendLimitsRequest,describe_spend_limits_request +DescribeSpendLimitsResult,describe_spend_limits_result +DescribeSpotDatafeedSubscriptionRequest,describe_spot_datafeed_subscription_request +DescribeSpotDatafeedSubscriptionResult,describe_spot_datafeed_subscription_result +DescribeSpotFleetInstancesRequest,describe_spot_fleet_instances_request +DescribeSpotFleetInstancesResponse,describe_spot_fleet_instances_response +DescribeSpotFleetRequestHistoryRequest,describe_spot_fleet_request_history_request +DescribeSpotFleetRequestHistoryResponse,describe_spot_fleet_request_history_response +DescribeSpotFleetRequestsRequest,describe_spot_fleet_requests_request +DescribeSpotFleetRequestsResponse,describe_spot_fleet_requests_response +DescribeSpotInstanceRequestsRequest,describe_spot_instance_requests_request +DescribeSpotInstanceRequestsResult,describe_spot_instance_requests_result +DescribeSpotPriceHistoryRequest,describe_spot_price_history_request +DescribeSpotPriceHistoryResult,describe_spot_price_history_result +DescribeStackDriftDetectionStatusInput,describe_stack_drift_detection_status_input +DescribeStackDriftDetectionStatusOutput,describe_stack_drift_detection_status_output +DescribeStackEventsInput,describe_stack_events_input +DescribeStackEventsOutput,describe_stack_events_output +DescribeStackInstanceInput,describe_stack_instance_input +DescribeStackInstanceOutput,describe_stack_instance_output +DescribeStackProvisioningParametersRequest,describe_stack_provisioning_parameters_request +DescribeStackProvisioningParametersResult,describe_stack_provisioning_parameters_result +DescribeStackResourceDriftsInput,describe_stack_resource_drifts_input +DescribeStackResourceDriftsOutput,describe_stack_resource_drifts_output +DescribeStackResourceInput,describe_stack_resource_input +DescribeStackResourceOutput,describe_stack_resource_output +DescribeStackResourcesInput,describe_stack_resources_input +DescribeStackResourcesOutput,describe_stack_resources_output +DescribeStackSetInput,describe_stack_set_input +DescribeStackSetOperationInput,describe_stack_set_operation_input +DescribeStackSetOperationOutput,describe_stack_set_operation_output +DescribeStackSetOutput,describe_stack_set_output +DescribeStackSummaryRequest,describe_stack_summary_request +DescribeStackSummaryResult,describe_stack_summary_result +DescribeStacksInput,describe_stacks_input +DescribeStacksOutput,describe_stacks_output +DescribeStacksRequest,describe_stacks_request +DescribeStacksResult,describe_stacks_result +DescribeStaleSecurityGroupsRequest,describe_stale_security_groups_request +DescribeStaleSecurityGroupsResult,describe_stale_security_groups_result +DescribeStandardsControlsRequest,describe_standards_controls_request +DescribeStandardsControlsResponse,describe_standards_controls_response +DescribeStandardsRequest,describe_standards_request +DescribeStandardsResponse,describe_standards_response +DescribeStateMachineAliasInput,describe_state_machine_alias_input +DescribeStateMachineAliasOutput,describe_state_machine_alias_output +DescribeStateMachineForExecutionInput,describe_state_machine_for_execution_input +DescribeStateMachineForExecutionOutput,describe_state_machine_for_execution_output +DescribeStateMachineInput,describe_state_machine_input +DescribeStateMachineOutput,describe_state_machine_output +DescribeStatementRequest,describe_statement_request +DescribeStatementResponse,describe_statement_response +DescribeStepInput,describe_step_input +DescribeStepOutput,describe_step_output +DescribeStorageConfigurationResponse,describe_storage_configuration_response +DescribeStorageSystemRequest,describe_storage_system_request +DescribeStorageSystemResourceMetricsRequest,describe_storage_system_resource_metrics_request +DescribeStorageSystemResourceMetricsResponse,describe_storage_system_resource_metrics_response +DescribeStorageSystemResourcesRequest,describe_storage_system_resources_request +DescribeStorageSystemResourcesResponse,describe_storage_system_resources_response +DescribeStorageSystemResponse,describe_storage_system_response +DescribeStorageVirtualMachinesRequest,describe_storage_virtual_machines_request +DescribeStorageVirtualMachinesResponse,describe_storage_virtual_machines_response +DescribeStoreImageTasksRequest,describe_store_image_tasks_request +DescribeStoreImageTasksResult,describe_store_image_tasks_result +DescribeStorediSCSIVolumesInput,describe_storedi_scsi_volumes_input +DescribeStorediSCSIVolumesOutput,describe_storedi_scsi_volumes_output +DescribeStreamConsumerInput,describe_stream_consumer_input +DescribeStreamConsumerOutput,describe_stream_consumer_output +DescribeStreamInput,describe_stream_input +DescribeStreamOutput,describe_stream_output +DescribeStreamProcessorRequest,describe_stream_processor_request +DescribeStreamProcessorResponse,describe_stream_processor_response +DescribeStreamRequest,describe_stream_request +DescribeStreamResponse,describe_stream_response +DescribeStreamSummaryInput,describe_stream_summary_input +DescribeStreamSummaryOutput,describe_stream_summary_output +DescribeStudioInput,describe_studio_input +DescribeStudioLifecycleConfigRequest,describe_studio_lifecycle_config_request +DescribeStudioLifecycleConfigResponse,describe_studio_lifecycle_config_response +DescribeStudioOutput,describe_studio_output +DescribeSubnetGroupsRequest,describe_subnet_groups_request +DescribeSubnetGroupsResponse,describe_subnet_groups_response +DescribeSubnetsRequest,describe_subnets_request +DescribeSubnetsResult,describe_subnets_result +DescribeSubscribedWorkteamRequest,describe_subscribed_workteam_request +DescribeSubscribedWorkteamResponse,describe_subscribed_workteam_response +DescribeSubscribersForNotificationRequest,describe_subscribers_for_notification_request +DescribeSubscribersForNotificationResponse,describe_subscribers_for_notification_response +DescribeSubscriptionFiltersRequest,describe_subscription_filters_request +DescribeSubscriptionFiltersResponse,describe_subscription_filters_response +DescribeSubscriptionResponse,describe_subscription_response +DescribeSuggestersRequest,describe_suggesters_request +DescribeSuggestersResponse,describe_suggesters_response +DescribeSupportedLanguagesRequest,describe_supported_languages_request +DescribeSupportedLanguagesResponse,describe_supported_languages_response +DescribeTLSInspectionConfigurationRequest,describe_tls_inspection_configuration_request +DescribeTLSInspectionConfigurationResponse,describe_tls_inspection_configuration_response +DescribeTableDataImportJobRequest,describe_table_data_import_job_request +DescribeTableDataImportJobResult,describe_table_data_import_job_result +DescribeTableInput,describe_table_input +DescribeTableOutput,describe_table_output +DescribeTableReplicaAutoScalingInput,describe_table_replica_auto_scaling_input +DescribeTableReplicaAutoScalingOutput,describe_table_replica_auto_scaling_output +DescribeTableRequest,describe_table_request +DescribeTableResponse,describe_table_response +DescribeTableRestoreStatusMessage,describe_table_restore_status_message +DescribeTableStatisticsMessage,describe_table_statistics_message +DescribeTableStatisticsResponse,describe_table_statistics_response +DescribeTagOptionInput,describe_tag_option_input +DescribeTagOptionOutput,describe_tag_option_output +DescribeTagsInput,describe_tags_input +DescribeTagsMessage,describe_tags_message +DescribeTagsOutput,describe_tags_output +DescribeTagsRequest,describe_tags_request +DescribeTagsResponse,describe_tags_response +DescribeTagsResult,describe_tags_result +DescribeTagsType,describe_tags_type +DescribeTapeArchivesInput,describe_tape_archives_input +DescribeTapeArchivesOutput,describe_tape_archives_output +DescribeTapeRecoveryPointsInput,describe_tape_recovery_points_input +DescribeTapeRecoveryPointsOutput,describe_tape_recovery_points_output +DescribeTapesInput,describe_tapes_input +DescribeTapesOutput,describe_tapes_output +DescribeTargetGroupAttributesInput,describe_target_group_attributes_input +DescribeTargetGroupAttributesOutput,describe_target_group_attributes_output +DescribeTargetGroupsInput,describe_target_groups_input +DescribeTargetGroupsOutput,describe_target_groups_output +DescribeTargetHealthInput,describe_target_health_input +DescribeTargetHealthOutput,describe_target_health_output +DescribeTargetedSentimentDetectionJobRequest,describe_targeted_sentiment_detection_job_request +DescribeTargetedSentimentDetectionJobResponse,describe_targeted_sentiment_detection_job_response +DescribeTaskDefinitionRequest,describe_task_definition_request +DescribeTaskDefinitionResponse,describe_task_definition_response +DescribeTaskExecutionRequest,describe_task_execution_request +DescribeTaskExecutionResponse,describe_task_execution_response +DescribeTaskInput,describe_task_input +DescribeTaskOutput,describe_task_output +DescribeTaskRequest,describe_task_request +DescribeTaskResponse,describe_task_response +DescribeTaskSetsRequest,describe_task_sets_request +DescribeTaskSetsResponse,describe_task_sets_response +DescribeTasksRequest,describe_tasks_request +DescribeTasksResponse,describe_tasks_response +DescribeTemplateAliasRequest,describe_template_alias_request +DescribeTemplateAliasResponse,describe_template_alias_response +DescribeTemplateDefinitionRequest,describe_template_definition_request +DescribeTemplateDefinitionResponse,describe_template_definition_response +DescribeTemplatePermissionsRequest,describe_template_permissions_request +DescribeTemplatePermissionsResponse,describe_template_permissions_response +DescribeTemplateRequest,describe_template_request +DescribeTemplateResponse,describe_template_response +DescribeTerminationPolicyTypesAnswer,describe_termination_policy_types_answer +DescribeTestCasesInput,describe_test_cases_input +DescribeTestCasesOutput,describe_test_cases_output +DescribeTestExecutionRequest,describe_test_execution_request +DescribeTestExecutionResponse,describe_test_execution_response +DescribeTestSetDiscrepancyReportRequest,describe_test_set_discrepancy_report_request +DescribeTestSetDiscrepancyReportResponse,describe_test_set_discrepancy_report_response +DescribeTestSetGenerationRequest,describe_test_set_generation_request +DescribeTestSetGenerationResponse,describe_test_set_generation_response +DescribeTestSetRequest,describe_test_set_request +DescribeTestSetResponse,describe_test_set_response +DescribeTextTranslationJobRequest,describe_text_translation_job_request +DescribeTextTranslationJobResponse,describe_text_translation_job_response +DescribeThemeAliasRequest,describe_theme_alias_request +DescribeThemeAliasResponse,describe_theme_alias_response +DescribeThemePermissionsRequest,describe_theme_permissions_request +DescribeThemePermissionsResponse,describe_theme_permissions_response +DescribeThemeRequest,describe_theme_request +DescribeThemeResponse,describe_theme_response +DescribeThesaurusRequest,describe_thesaurus_request +DescribeThesaurusResponse,describe_thesaurus_response +DescribeThingGroupRequest,describe_thing_group_request +DescribeThingGroupResponse,describe_thing_group_response +DescribeThingRegistrationTaskRequest,describe_thing_registration_task_request +DescribeThingRegistrationTaskResponse,describe_thing_registration_task_response +DescribeThingRequest,describe_thing_request +DescribeThingResponse,describe_thing_response +DescribeThingTypeRequest,describe_thing_type_request +DescribeThingTypeResponse,describe_thing_type_response +DescribeThumbnailsRequest,describe_thumbnails_request +DescribeThumbnailsResponse,describe_thumbnails_response +DescribeTimeBasedAutoScalingRequest,describe_time_based_auto_scaling_request +DescribeTimeBasedAutoScalingResult,describe_time_based_auto_scaling_result +DescribeTimeSeriesRequest,describe_time_series_request +DescribeTimeSeriesResponse,describe_time_series_response +DescribeTimeToLiveInput,describe_time_to_live_input +DescribeTimeToLiveOutput,describe_time_to_live_output +DescribeTopicPermissionsRequest,describe_topic_permissions_request +DescribeTopicPermissionsResponse,describe_topic_permissions_response +DescribeTopicRefreshRequest,describe_topic_refresh_request +DescribeTopicRefreshResponse,describe_topic_refresh_response +DescribeTopicRefreshScheduleRequest,describe_topic_refresh_schedule_request +DescribeTopicRefreshScheduleResponse,describe_topic_refresh_schedule_response +DescribeTopicRequest,describe_topic_request +DescribeTopicResponse,describe_topic_response +DescribeTopicsDetectionJobRequest,describe_topics_detection_job_request +DescribeTopicsDetectionJobResponse,describe_topics_detection_job_response +DescribeTrackerRequest,describe_tracker_request +DescribeTrackerResponse,describe_tracker_response +DescribeTrafficDistributionGroupRequest,describe_traffic_distribution_group_request +DescribeTrafficDistributionGroupResponse,describe_traffic_distribution_group_response +DescribeTrafficMirrorFiltersRequest,describe_traffic_mirror_filters_request +DescribeTrafficMirrorFiltersResult,describe_traffic_mirror_filters_result +DescribeTrafficMirrorSessionsRequest,describe_traffic_mirror_sessions_request +DescribeTrafficMirrorSessionsResult,describe_traffic_mirror_sessions_result +DescribeTrafficMirrorTargetsRequest,describe_traffic_mirror_targets_request +DescribeTrafficMirrorTargetsResult,describe_traffic_mirror_targets_result +DescribeTrafficSourcesRequest,describe_traffic_sources_request +DescribeTrafficSourcesResponse,describe_traffic_sources_response +DescribeTrailsRequest,describe_trails_request +DescribeTrailsResponse,describe_trails_response +DescribeTrainingJobRequest,describe_training_job_request +DescribeTrainingJobResponse,describe_training_job_response +DescribeTransactionRequest,describe_transaction_request +DescribeTransactionResponse,describe_transaction_response +DescribeTransformJobRequest,describe_transform_job_request +DescribeTransformJobResponse,describe_transform_job_response +DescribeTransitGatewayAttachmentsRequest,describe_transit_gateway_attachments_request +DescribeTransitGatewayAttachmentsResult,describe_transit_gateway_attachments_result +DescribeTransitGatewayConnectPeersRequest,describe_transit_gateway_connect_peers_request +DescribeTransitGatewayConnectPeersResult,describe_transit_gateway_connect_peers_result +DescribeTransitGatewayConnectsRequest,describe_transit_gateway_connects_request +DescribeTransitGatewayConnectsResult,describe_transit_gateway_connects_result +DescribeTransitGatewayMulticastDomainsRequest,describe_transit_gateway_multicast_domains_request +DescribeTransitGatewayMulticastDomainsResult,describe_transit_gateway_multicast_domains_result +DescribeTransitGatewayPeeringAttachmentsRequest,describe_transit_gateway_peering_attachments_request +DescribeTransitGatewayPeeringAttachmentsResult,describe_transit_gateway_peering_attachments_result +DescribeTransitGatewayPolicyTablesRequest,describe_transit_gateway_policy_tables_request +DescribeTransitGatewayPolicyTablesResult,describe_transit_gateway_policy_tables_result +DescribeTransitGatewayRouteTableAnnouncementsRequest,describe_transit_gateway_route_table_announcements_request +DescribeTransitGatewayRouteTableAnnouncementsResult,describe_transit_gateway_route_table_announcements_result +DescribeTransitGatewayRouteTablesRequest,describe_transit_gateway_route_tables_request +DescribeTransitGatewayRouteTablesResult,describe_transit_gateway_route_tables_result +DescribeTransitGatewayVpcAttachmentsRequest,describe_transit_gateway_vpc_attachments_request +DescribeTransitGatewayVpcAttachmentsResult,describe_transit_gateway_vpc_attachments_result +DescribeTransitGatewaysRequest,describe_transit_gateways_request +DescribeTransitGatewaysResult,describe_transit_gateways_result +DescribeTrialComponentRequest,describe_trial_component_request +DescribeTrialComponentResponse,describe_trial_component_response +DescribeTrialRequest,describe_trial_request +DescribeTrialResponse,describe_trial_response +DescribeTrunkInterfaceAssociationsRequest,describe_trunk_interface_associations_request +DescribeTrunkInterfaceAssociationsResult,describe_trunk_interface_associations_result +DescribeTrustedAdvisorCheckRefreshStatusesRequest,describe_trusted_advisor_check_refresh_statuses_request +DescribeTrustedAdvisorCheckRefreshStatusesResponse,describe_trusted_advisor_check_refresh_statuses_response +DescribeTrustedAdvisorCheckResultRequest,describe_trusted_advisor_check_result_request +DescribeTrustedAdvisorCheckResultResponse,describe_trusted_advisor_check_result_response +DescribeTrustedAdvisorCheckSummariesRequest,describe_trusted_advisor_check_summaries_request +DescribeTrustedAdvisorCheckSummariesResponse,describe_trusted_advisor_check_summaries_response +DescribeTrustedAdvisorChecksRequest,describe_trusted_advisor_checks_request +DescribeTrustedAdvisorChecksResponse,describe_trusted_advisor_checks_response +DescribeTrustsRequest,describe_trusts_request +DescribeTrustsResult,describe_trusts_result +DescribeTunnelRequest,describe_tunnel_request +DescribeTunnelResponse,describe_tunnel_response +DescribeTypeInput,describe_type_input +DescribeTypeOutput,describe_type_output +DescribeTypeRegistrationInput,describe_type_registration_input +DescribeTypeRegistrationOutput,describe_type_registration_output +DescribeUpdateActionsMessage,describe_update_actions_message +DescribeUpdateDirectoryRequest,describe_update_directory_request +DescribeUpdateDirectoryResult,describe_update_directory_result +DescribeUpdateRequest,describe_update_request +DescribeUpdateResponse,describe_update_response +DescribeUploadBufferInput,describe_upload_buffer_input +DescribeUploadBufferOutput,describe_upload_buffer_output +DescribeUsageLimitsMessage,describe_usage_limits_message +DescribeUsageReportSubscriptionsRequest,describe_usage_report_subscriptions_request +DescribeUsageReportSubscriptionsResult,describe_usage_report_subscriptions_result +DescribeUserGroupsMessage,describe_user_groups_message +DescribeUserGroupsResult,describe_user_groups_result +DescribeUserHierarchyGroupRequest,describe_user_hierarchy_group_request +DescribeUserHierarchyGroupResponse,describe_user_hierarchy_group_response +DescribeUserHierarchyStructureRequest,describe_user_hierarchy_structure_request +DescribeUserHierarchyStructureResponse,describe_user_hierarchy_structure_response +DescribeUserImportJobRequest,describe_user_import_job_request +DescribeUserImportJobResponse,describe_user_import_job_response +DescribeUserPoolClientRequest,describe_user_pool_client_request +DescribeUserPoolClientResponse,describe_user_pool_client_response +DescribeUserPoolDomainRequest,describe_user_pool_domain_request +DescribeUserPoolDomainResponse,describe_user_pool_domain_response +DescribeUserPoolRequest,describe_user_pool_request +DescribeUserPoolResponse,describe_user_pool_response +DescribeUserProfileRequest,describe_user_profile_request +DescribeUserProfileResponse,describe_user_profile_response +DescribeUserProfileResult,describe_user_profile_result +DescribeUserProfilesRequest,describe_user_profiles_request +DescribeUserProfilesResult,describe_user_profiles_result +DescribeUserRequest,describe_user_request +DescribeUserResponse,describe_user_response +DescribeUserStackAssociationsRequest,describe_user_stack_associations_request +DescribeUserStackAssociationsResult,describe_user_stack_associations_result +DescribeUsersMessage,describe_users_message +DescribeUsersRequest,describe_users_request +DescribeUsersResponse,describe_users_response +DescribeUsersResult,describe_users_result +DescribeVPCConnectionRequest,describe_vpc_connection_request +DescribeVPCConnectionResponse,describe_vpc_connection_response +DescribeVTLDevicesInput,describe_vtl_devices_input +DescribeVTLDevicesOutput,describe_vtl_devices_output +DescribeValidDBInstanceModificationsMessage,describe_valid_db_instance_modifications_message +DescribeValidDBInstanceModificationsResult,describe_valid_db_instance_modifications_result +DescribeVaultInput,describe_vault_input +DescribeVaultOutput,describe_vault_output +DescribeVcenterClientsRequest,describe_vcenter_clients_request +DescribeVcenterClientsResponse,describe_vcenter_clients_response +DescribeVerifiedAccessEndpointsRequest,describe_verified_access_endpoints_request +DescribeVerifiedAccessEndpointsResult,describe_verified_access_endpoints_result +DescribeVerifiedAccessGroupsRequest,describe_verified_access_groups_request +DescribeVerifiedAccessGroupsResult,describe_verified_access_groups_result +DescribeVerifiedAccessInstanceLoggingConfigurationsRequest,describe_verified_access_instance_logging_configurations_request +DescribeVerifiedAccessInstanceLoggingConfigurationsResult,describe_verified_access_instance_logging_configurations_result +DescribeVerifiedAccessInstancesRequest,describe_verified_access_instances_request +DescribeVerifiedAccessInstancesResult,describe_verified_access_instances_result +DescribeVerifiedAccessTrustProvidersRequest,describe_verified_access_trust_providers_request +DescribeVerifiedAccessTrustProvidersResult,describe_verified_access_trust_providers_result +DescribeViewRequest,describe_view_request +DescribeViewResponse,describe_view_response +DescribeVirtualClusterRequest,describe_virtual_cluster_request +DescribeVirtualClusterResponse,describe_virtual_cluster_response +DescribeVirtualGatewayInput,describe_virtual_gateway_input +DescribeVirtualGatewayOutput,describe_virtual_gateway_output +DescribeVirtualInterfacesRequest,describe_virtual_interfaces_request +DescribeVirtualNodeInput,describe_virtual_node_input +DescribeVirtualNodeOutput,describe_virtual_node_output +DescribeVirtualRouterInput,describe_virtual_router_input +DescribeVirtualRouterOutput,describe_virtual_router_output +DescribeVirtualServiceInput,describe_virtual_service_input +DescribeVirtualServiceOutput,describe_virtual_service_output +DescribeVocabularyRequest,describe_vocabulary_request +DescribeVocabularyResponse,describe_vocabulary_response +DescribeVodSourceRequest,describe_vod_source_request +DescribeVodSourceResponse,describe_vod_source_response +DescribeVoicesInput,describe_voices_input +DescribeVoicesOutput,describe_voices_output +DescribeVolumeAttributeRequest,describe_volume_attribute_request +DescribeVolumeAttributeResult,describe_volume_attribute_result +DescribeVolumeStatusRequest,describe_volume_status_request +DescribeVolumeStatusResult,describe_volume_status_result +DescribeVolumesModificationsRequest,describe_volumes_modifications_request +DescribeVolumesModificationsResult,describe_volumes_modifications_result +DescribeVolumesRequest,describe_volumes_request +DescribeVolumesResponse,describe_volumes_response +DescribeVolumesResult,describe_volumes_result +DescribeVpcAttributeRequest,describe_vpc_attribute_request +DescribeVpcAttributeResult,describe_vpc_attribute_result +DescribeVpcClassicLinkDnsSupportRequest,describe_vpc_classic_link_dns_support_request +DescribeVpcClassicLinkDnsSupportResult,describe_vpc_classic_link_dns_support_result +DescribeVpcClassicLinkRequest,describe_vpc_classic_link_request +DescribeVpcClassicLinkResult,describe_vpc_classic_link_result +DescribeVpcConnectionRequest,describe_vpc_connection_request +DescribeVpcConnectionResponse,describe_vpc_connection_response +DescribeVpcConnectorRequest,describe_vpc_connector_request +DescribeVpcConnectorResponse,describe_vpc_connector_response +DescribeVpcEndpointConnectionNotificationsRequest,describe_vpc_endpoint_connection_notifications_request +DescribeVpcEndpointConnectionNotificationsResult,describe_vpc_endpoint_connection_notifications_result +DescribeVpcEndpointConnectionsRequest,describe_vpc_endpoint_connections_request +DescribeVpcEndpointConnectionsResult,describe_vpc_endpoint_connections_result +DescribeVpcEndpointServiceConfigurationsRequest,describe_vpc_endpoint_service_configurations_request +DescribeVpcEndpointServiceConfigurationsResult,describe_vpc_endpoint_service_configurations_result +DescribeVpcEndpointServicePermissionsRequest,describe_vpc_endpoint_service_permissions_request +DescribeVpcEndpointServicePermissionsResult,describe_vpc_endpoint_service_permissions_result +DescribeVpcEndpointServicesRequest,describe_vpc_endpoint_services_request +DescribeVpcEndpointServicesResult,describe_vpc_endpoint_services_result +DescribeVpcEndpointsRequest,describe_vpc_endpoints_request +DescribeVpcEndpointsResponse,describe_vpc_endpoints_response +DescribeVpcEndpointsResult,describe_vpc_endpoints_result +DescribeVpcIngressConnectionRequest,describe_vpc_ingress_connection_request +DescribeVpcIngressConnectionResponse,describe_vpc_ingress_connection_response +DescribeVpcPeeringAuthorizationsOutput,describe_vpc_peering_authorizations_output +DescribeVpcPeeringConnectionsInput,describe_vpc_peering_connections_input +DescribeVpcPeeringConnectionsOutput,describe_vpc_peering_connections_output +DescribeVpcPeeringConnectionsRequest,describe_vpc_peering_connections_request +DescribeVpcPeeringConnectionsResult,describe_vpc_peering_connections_result +DescribeVpcsRequest,describe_vpcs_request +DescribeVpcsResult,describe_vpcs_result +DescribeVpnConnectionsRequest,describe_vpn_connections_request +DescribeVpnConnectionsResult,describe_vpn_connections_result +DescribeVpnGatewaysRequest,describe_vpn_gateways_request +DescribeVpnGatewaysResult,describe_vpn_gateways_result +DescribeWarmPoolAnswer,describe_warm_pool_answer +DescribeWarmPoolType,describe_warm_pool_type +DescribeWatchlistRequest,describe_watchlist_request +DescribeWatchlistResponse,describe_watchlist_response +DescribeWebsiteCertificateAuthorityRequest,describe_website_certificate_authority_request +DescribeWebsiteCertificateAuthorityResponse,describe_website_certificate_authority_response +DescribeWhatIfAnalysisRequest,describe_what_if_analysis_request +DescribeWhatIfAnalysisResponse,describe_what_if_analysis_response +DescribeWhatIfForecastExportRequest,describe_what_if_forecast_export_request +DescribeWhatIfForecastExportResponse,describe_what_if_forecast_export_response +DescribeWhatIfForecastRequest,describe_what_if_forecast_request +DescribeWhatIfForecastResponse,describe_what_if_forecast_response +DescribeWorkerConfigurationRequest,describe_worker_configuration_request +DescribeWorkerConfigurationResponse,describe_worker_configuration_response +DescribeWorkflowExecutionInput,describe_workflow_execution_input +DescribeWorkflowRequest,describe_workflow_request +DescribeWorkflowResponse,describe_workflow_response +DescribeWorkflowTypeInput,describe_workflow_type_input +DescribeWorkforceRequest,describe_workforce_request +DescribeWorkforceResponse,describe_workforce_response +DescribeWorkingStorageInput,describe_working_storage_input +DescribeWorkingStorageOutput,describe_working_storage_output +DescribeWorkloadRequest,describe_workload_request +DescribeWorkloadResponse,describe_workload_response +DescribeWorkspaceAuthenticationRequest,describe_workspace_authentication_request +DescribeWorkspaceAuthenticationResponse,describe_workspace_authentication_response +DescribeWorkspaceBundlesRequest,describe_workspace_bundles_request +DescribeWorkspaceBundlesResult,describe_workspace_bundles_result +DescribeWorkspaceConfigurationRequest,describe_workspace_configuration_request +DescribeWorkspaceConfigurationResponse,describe_workspace_configuration_response +DescribeWorkspaceDirectoriesRequest,describe_workspace_directories_request +DescribeWorkspaceDirectoriesResult,describe_workspace_directories_result +DescribeWorkspaceImagePermissionsRequest,describe_workspace_image_permissions_request +DescribeWorkspaceImagePermissionsResult,describe_workspace_image_permissions_result +DescribeWorkspaceImagesRequest,describe_workspace_images_request +DescribeWorkspaceImagesResult,describe_workspace_images_result +DescribeWorkspaceRequest,describe_workspace_request +DescribeWorkspaceResponse,describe_workspace_response +DescribeWorkspaceSnapshotsRequest,describe_workspace_snapshots_request +DescribeWorkspaceSnapshotsResult,describe_workspace_snapshots_result +DescribeWorkspacesConnectionStatusRequest,describe_workspaces_connection_status_request +DescribeWorkspacesConnectionStatusResult,describe_workspaces_connection_status_result +DescribeWorkspacesRequest,describe_workspaces_request +DescribeWorkspacesResult,describe_workspaces_result +DescribeWorkteamRequest,describe_workteam_request +DescribeWorkteamResponse,describe_workteam_response +DescribeWorldExportJobRequest,describe_world_export_job_request +DescribeWorldExportJobResponse,describe_world_export_job_response +DescribeWorldGenerationJobRequest,describe_world_generation_job_request +DescribeWorldGenerationJobResponse,describe_world_generation_job_response +DescribeWorldRequest,describe_world_request +DescribeWorldResponse,describe_world_response +DescribeWorldTemplateRequest,describe_world_template_request +DescribeWorldTemplateResponse,describe_world_template_response +DescribedAccess,described_access +DescribedAgreement,described_agreement +DescribedCertificate,described_certificate +DescribedConnector,described_connector +DescribedExecution,described_execution +DescribedHostKey,described_host_key +DescribedProfile,described_profile +DescribedSecurityPolicy,described_security_policy +DescribedServer,described_server +DescribedUser,described_user +DescribedWorkflow,described_workflow +Description,description +DescriptionPageUrl,description_page_url +DescriptionRegex,description_regex +DescriptionTooLongException,description_too_long_exception +DescriptiveMentionIndex,descriptive_mention_index +DescriptiveVideoServiceFlag,descriptive_video_service_flag +Deserializer,deserializer +Desired,desired +DesiredCapacity,desired_capacity +DesiredCapacityType,desired_capacity_type +DesiredConfiguration,desired_configuration +DesiredCount,desired_count +DesiredDataAccessRoleArn,desired_data_access_role_arn +DesiredDeliveryMediums,desired_delivery_mediums +DesiredInferenceUnits,desired_inference_units +DesiredInstanceCount,desired_instance_count +DesiredInstanceType,desired_instance_type +DesiredInstances,desired_instances +DesiredModelArn,desired_model_arn +DesiredModelVariants,desired_model_variants +DesiredNumber,desired_number +DesiredNumberOfDomainControllers,desired_number_of_domain_controllers +DesiredPartitionCount,desired_partition_count +DesiredPlayerSession,desired_player_session +DesiredPlayerSessions,desired_player_sessions +DesiredReplicationCount,desired_replication_count +DesiredServerlessConfig,desired_serverless_config +DesiredShardLevelMetrics,desired_shard_level_metrics +DesiredStartTime,desired_start_time +DesiredState,desired_state +DesiredValue,desired_value +DesiredWeight,desired_weight +DesiredWeightAndCapacity,desired_weight_and_capacity +DesiredWeightsAndCapacities,desired_weights_and_capacities +DeskPhoneNumber,desk_phone_number +Destination,destination +Destination608ChannelNumber,destination608_channel_number +Destination708ServiceNumber,destination708_service_number +DestinationAddress,destination_address +DestinationAddresses,destination_addresses +DestinationArn,destination_arn +DestinationBackup,destination_backup +DestinationBackupVaultArn,destination_backup_vault_arn +DestinationBranchName,destination_branch_name +DestinationBucketName,destination_bucket_name +DestinationCidr,destination_cidr +DestinationCidrBlock,destination_cidr_block +DestinationColumn,destination_column +DestinationCommit,destination_commit +DestinationConfig,destination_config +DestinationConfiguration,destination_configuration +DestinationConfigurationRequest,destination_configuration_request +DestinationConfigurations,destination_configurations +DestinationConnectorProperties,destination_connector_properties +DestinationCountryParameters,destination_country_parameters +DestinationDataSharing,destination_data_sharing +DestinationDataSharingType,destination_data_sharing_type +DestinationDescription,destination_description +DestinationDescriptions,destination_descriptions +DestinationDetails,destination_details +DestinationDomain,destination_domain +DestinationDomainInfo,destination_domain_info +DestinationEncryptionAlgorithm,destination_encryption_algorithm +DestinationEncryptionContext,destination_encryption_context +DestinationEnvironmentId,destination_environment_id +DestinationEnvironmentName,destination_environment_name +DestinationField,destination_field +DestinationFieldProperties,destination_field_properties +DestinationFileLocation,destination_file_location +DestinationFilters,destination_filters +DestinationFlowConfig,destination_flow_config +DestinationId,destination_id +DestinationIdentifier,destination_identifier +DestinationIdentity,destination_identity +DestinationImageDescription,destination_image_description +DestinationImageName,destination_image_name +DestinationInfo,destination_info +DestinationIp,destination_ip +DestinationIpV4,destination_ipv4 +DestinationIpV6,destination_ipv6 +DestinationIpamScopeId,destination_ipam_scope_id +DestinationIpv6CidrBlock,destination_ipv6_cidr_block +DestinationItemsLimit,destination_items_limit +DestinationKeyId,destination_key_id +DestinationLicenseContext,destination_license_context +DestinationList,destination_list +DestinationLocationArn,destination_location_arn +DestinationName,destination_name +DestinationNamePrefix,destination_name_prefix +DestinationNetworkInterfaceArns,destination_network_interface_arns +DestinationNotAllowedException,destination_not_allowed_exception +DestinationOptions,destination_options +DestinationOptionsRequest,destination_options_request +DestinationOptionsResponse,destination_options_response +DestinationOutpostArn,destination_outpost_arn +DestinationParameterName,destination_parameter_name +DestinationParameterValueConfiguration,destination_parameter_value_configuration +DestinationParentId,destination_parent_id +DestinationParentNotFoundException,destination_parent_not_found_exception +DestinationPath,destination_path +DestinationPhoneNumber,destination_phone_number +DestinationPoolName,destination_pool_name +DestinationPort,destination_port +DestinationPortMapping,destination_port_mapping +DestinationPortMappings,destination_port_mappings +DestinationPortRange,destination_port_range +DestinationPortRanges,destination_port_ranges +DestinationPorts,destination_ports +DestinationPosition,destination_position +DestinationPositions,destination_positions +DestinationPrefixListId,destination_prefix_list_id +DestinationPrefixLists,destination_prefix_lists +DestinationProjectArn,destination_project_arn +DestinationProperties,destination_properties +DestinationQueue,destination_queue +DestinationRecoveryPointArn,destination_recovery_point_arn +DestinationRefId,destination_ref_id +DestinationRegion,destination_region +DestinationS3Uri,destination_s3_uri +DestinationSchema,destination_schema +DestinationSchemaUpdate,destination_schema_update +DestinationSettings,destination_settings +DestinationSocketAddress,destination_socket_address +DestinationStatus,destination_status +DestinationStatusDescription,destination_status_description +DestinationStreamArn,destination_stream_arn +DestinationSummary,destination_summary +DestinationToCreate,destination_to_create +DestinationTrafficState,destination_traffic_state +DestinationType,destination_type +DestinationUser,destination_user +DestinationUserIdentifier,destination_user_identifier +DestinationVpc,destination_vpc +Destinations,destinations +DetachCertificateFromDistributionRequest,detach_certificate_from_distribution_request +DetachCertificateFromDistributionResult,detach_certificate_from_distribution_result +DetachClassicLinkVpcRequest,detach_classic_link_vpc_request +DetachClassicLinkVpcResult,detach_classic_link_vpc_result +DetachCustomerManagedPolicyReferenceFromPermissionSetRequest,detach_customer_managed_policy_reference_from_permission_set_request +DetachDiskRequest,detach_disk_request +DetachDiskResult,detach_disk_result +DetachElasticLoadBalancerRequest,detach_elastic_load_balancer_request +DetachFromIndex,detach_from_index +DetachFromIndexRequest,detach_from_index_request +DetachFromIndexResponse,detach_from_index_response +DetachGroupPolicyRequest,detach_group_policy_request +DetachInstancesAnswer,detach_instances_answer +DetachInstancesFromLoadBalancerRequest,detach_instances_from_load_balancer_request +DetachInstancesFromLoadBalancerResult,detach_instances_from_load_balancer_result +DetachInstancesQuery,detach_instances_query +DetachInternetGatewayRequest,detach_internet_gateway_request +DetachLoadBalancerFromSubnetsInput,detach_load_balancer_from_subnets_input +DetachLoadBalancerFromSubnetsOutput,detach_load_balancer_from_subnets_output +DetachLoadBalancerTargetGroupsType,detach_load_balancer_target_groups_type +DetachLoadBalancersType,detach_load_balancers_type +DetachManagedPolicyFromPermissionSetRequest,detach_managed_policy_from_permission_set_request +DetachNetworkInterfaceRequest,detach_network_interface_request +DetachObject,detach_object +DetachObjectRequest,detach_object_request +DetachObjectResponse,detach_object_response +DetachPolicy,detach_policy +DetachPolicyRequest,detach_policy_request +DetachPrincipalPolicyRequest,detach_principal_policy_request +DetachRolePolicyRequest,detach_role_policy_request +DetachSecurityProfileRequest,detach_security_profile_request +DetachStaticIpRequest,detach_static_ip_request +DetachStaticIpResult,detach_static_ip_result +DetachThingPrincipalRequest,detach_thing_principal_request +DetachTrafficSourcesType,detach_traffic_sources_type +DetachTypedLink,detach_typed_link +DetachTypedLinkRequest,detach_typed_link_request +DetachUserPolicyRequest,detach_user_policy_request +DetachVerifiedAccessTrustProviderRequest,detach_verified_access_trust_provider_request +DetachVerifiedAccessTrustProviderResult,detach_verified_access_trust_provider_result +DetachVolumeInput,detach_volume_input +DetachVolumeOutput,detach_volume_output +DetachVolumeRequest,detach_volume_request +DetachVpnGatewayRequest,detach_vpn_gateway_request +DetachedObjectIdentifier,detached_object_identifier +Detail,detail +DetailType,detail_type +DetailedError,detailed_error +DetailedErrorCode,detailed_error_code +DetailedErrorMessage,detailed_error_message +DetailedMetricsEnabled,detailed_metrics_enabled +DetailedResultsLocation,detailed_results_location +DetailedStatus,detailed_status +DetailedStatusCodesMetrics,detailed_status_codes_metrics +Details,details +DetailsMap,details_map +DetectAnomaliesRequest,detect_anomalies_request +DetectAnomaliesResponse,detect_anomalies_response +DetectAnomalyResult,detect_anomaly_result +DetectCustomLabelsRequest,detect_custom_labels_request +DetectCustomLabelsResponse,detect_custom_labels_response +DetectDocumentTextModelVersion,detect_document_text_model_version +DetectDocumentTextRequest,detect_document_text_request +DetectDocumentTextResponse,detect_document_text_response +DetectDominantLanguageRequest,detect_dominant_language_request +DetectDominantLanguageResponse,detect_dominant_language_response +DetectEntitiesRequest,detect_entities_request +DetectEntitiesResponse,detect_entities_response +DetectEntitiesV2Request,detect_entities_v2_request +DetectEntitiesV2Response,detect_entities_v2_response +DetectFacesRequest,detect_faces_request +DetectFacesResponse,detect_faces_response +DetectKeyPhrasesRequest,detect_key_phrases_request +DetectKeyPhrasesResponse,detect_key_phrases_response +DetectLabelsImageBackground,detect_labels_image_background +DetectLabelsImageForeground,detect_labels_image_foreground +DetectLabelsImageProperties,detect_labels_image_properties +DetectLabelsImagePropertiesSettings,detect_labels_image_properties_settings +DetectLabelsImageQuality,detect_labels_image_quality +DetectLabelsRequest,detect_labels_request +DetectLabelsResponse,detect_labels_response +DetectLabelsSettings,detect_labels_settings +DetectMetricSetConfigRequest,detect_metric_set_config_request +DetectMetricSetConfigResponse,detect_metric_set_config_response +DetectMitigationActionExecution,detect_mitigation_action_execution +DetectMitigationActionsTaskStatistics,detect_mitigation_actions_task_statistics +DetectMitigationActionsTaskSummary,detect_mitigation_actions_task_summary +DetectMitigationActionsTaskTarget,detect_mitigation_actions_task_target +DetectModerationLabelsRequest,detect_moderation_labels_request +DetectModerationLabelsResponse,detect_moderation_labels_response +DetectPHIRequest,detect_phi_request +DetectPHIResponse,detect_phi_response +DetectPiiEntitiesRequest,detect_pii_entities_request +DetectPiiEntitiesResponse,detect_pii_entities_response +DetectProtectiveEquipmentRequest,detect_protective_equipment_request +DetectProtectiveEquipmentResponse,detect_protective_equipment_response +DetectSchema,detect_schema +DetectSentimentRequest,detect_sentiment_request +DetectSentimentResponse,detect_sentiment_response +DetectStackDriftInput,detect_stack_drift_input +DetectStackDriftOutput,detect_stack_drift_output +DetectStackResourceDriftInput,detect_stack_resource_drift_input +DetectStackResourceDriftOutput,detect_stack_resource_drift_output +DetectStackSetDriftInput,detect_stack_set_drift_input +DetectStackSetDriftOutput,detect_stack_set_drift_output +DetectSyntaxRequest,detect_syntax_request +DetectSyntaxResponse,detect_syntax_response +DetectTargetedSentimentRequest,detect_targeted_sentiment_request +DetectTargetedSentimentResponse,detect_targeted_sentiment_response +DetectTextFilters,detect_text_filters +DetectTextRequest,detect_text_request +DetectTextResponse,detect_text_response +DetectedCsvFormatDescriptor,detected_csv_format_descriptor +DetectedDataDetails,detected_data_details +DetectedField,detected_field +DetectedFileFormatDescriptor,detected_file_format_descriptor +DetectedJsonFormatDescriptor,detected_json_format_descriptor +DetectedLanguageCode,detected_language_code +DetectedLanguageLowConfidenceException,detected_language_low_confidence_exception +DetectedMetricSetConfig,detected_metric_set_config +DetectedMetricSource,detected_metric_source +DetectedProperties,detected_properties +DetectedS3SourceConfig,detected_s3_source_config +DetectedSignature,detected_signature +DetectedSignatures,detected_signatures +DetectedText,detected_text +DetectedWorkload,detected_workload +Detection,detection +DetectionAttributes,detection_attributes +DetectionFilter,detection_filter +DetectionStatus,detection_status +DetectionStatusReason,detection_status_reason +Detections,detections +Detector,detector +DetectorAdditionalConfiguration,detector_additional_configuration +DetectorAdditionalConfigurationResult,detector_additional_configuration_result +DetectorDebugOption,detector_debug_option +DetectorFeatureConfiguration,detector_feature_configuration +DetectorFeatureConfigurationResult,detector_feature_configuration_result +DetectorId,detector_id +DetectorIds,detector_ids +DetectorModel,detector_model +DetectorModelConfiguration,detector_model_configuration +DetectorModelDefinition,detector_model_definition +DetectorModelSummary,detector_model_summary +DetectorModelVersionSummary,detector_model_version_summary +DetectorState,detector_state +DetectorStateDefinition,detector_state_definition +DetectorStateSummary,detector_state_summary +DetectorSummary,detector_summary +DetectorVersionSummary,detector_version_summary +DeterminingPolicyItem,determining_policy_item +DevAddr,dev_addr +DevEndpoint,dev_endpoint +DevEndpointCustomLibraries,dev_endpoint_custom_libraries +DevEndpointNames,dev_endpoint_names +DevEndpoints,dev_endpoints +DevEndpointsNotFound,dev_endpoints_not_found +DevEnvironmentAccessDetails,dev_environment_access_details +DevEnvironmentRepositorySummary,dev_environment_repository_summary +DevEnvironmentSessionConfiguration,dev_environment_session_configuration +DevEnvironmentSessionSummary,dev_environment_session_summary +DevEnvironmentSummary,dev_environment_summary +DevEui,dev_eui +DevEuiEventTopic,dev_eui_event_topic +DevStatusReqFreq,dev_status_req_freq +DeveloperInfo,developer_info +DeveloperName,developer_name +DeveloperOnlyAttribute,developer_only_attribute +DeveloperProviderName,developer_provider_name +DeveloperUserAlreadyRegisteredException,developer_user_already_registered_exception +DeveloperUserIdentifier,developer_user_identifier +DeveloperUserIdentifierList,developer_user_identifier_list +DevelopmentSchemaArn,development_schema_arn +Device,device +DeviceAggregatedStatus,device_aggregated_status +DeviceAggregatedStatusFilter,device_aggregated_status_filter +DeviceArn,device_arn +DeviceAttributes,device_attributes +DeviceCaCertificate,device_ca_certificate +DeviceCertificates,device_certificates +DeviceConfig,device_config +DeviceConfiguration,device_configuration +DeviceConfigurationType,device_configuration_type +DeviceConnectionStatus,device_connection_status +DeviceCreateDate,device_create_date +DeviceCreationFile,device_creation_file +DeviceCreationFileList,device_creation_file_list +DeviceData,device_data +DeviceDefinitionId,device_definition_id +DeviceDefinitionVersion,device_definition_version +DeviceDefinitionVersionArn,device_definition_version_arn +DeviceDefinitionVersionId,device_definition_version_id +DeviceDeploymentStatus,device_deployment_status +DeviceDeploymentStatusMessage,device_deployment_status_message +DeviceDeploymentSummaries,device_deployment_summaries +DeviceDeploymentSummary,device_deployment_summary +DeviceDescription,device_description +DeviceEvent,device_event +DeviceEvents,device_events +DeviceFilter,device_filter +DeviceFleetArn,device_fleet_arn +DeviceFleetName,device_fleet_name +DeviceFleetNameContains,device_fleet_name_contains +DeviceFleetSummaries,device_fleet_summaries +DeviceFleetSummary,device_fleet_summary +DeviceGroupKey,device_group_key +DeviceId,device_id +DeviceIdentifier,device_identifier +DeviceIds,device_ids +DeviceIndex,device_index +DeviceInstance,device_instance +DeviceJob,device_job +DeviceJobConfig,device_job_config +DeviceJobs,device_jobs +DeviceKey,device_key +DeviceLastAuthenticatedDate,device_last_authenticated_date +DeviceLastModifiedDate,device_last_modified_date +DeviceMethod,device_method +DeviceMethodParameters,device_method_parameters +DeviceMethodResponse,device_method_response +DeviceMethods,device_methods +DeviceMinutes,device_minutes +DeviceModel,device_model +DeviceModels,device_models +DeviceName,device_name +DeviceNameContains,device_name_contains +DeviceNames,device_names +DeviceNetworkProfileInfo,device_network_profile_info +DeviceNotRegisteredException,device_not_registered_exception +DeviceOfflineException,device_offline_exception +DeviceOnlyRememberedOnUserPrompt,device_only_remembered_on_user_prompt +DeviceOperatingSystem,device_operating_system +DeviceOperatingSystems,device_operating_systems +DeviceOptions,device_options +DevicePickupId,device_pickup_id +DevicePickupSnsTopicARN,device_pickup_sns_topic_arn +DevicePool,device_pool +DevicePoolCompatibilityResult,device_pool_compatibility_result +DevicePosition,device_position +DevicePositionUpdate,device_position_update +DevicePositionUpdates,device_position_updates +DevicePositions,device_positions +DeviceProfile,device_profile +DeviceProfileId,device_profile_id +DeviceProfileList,device_profile_list +DeviceProfileType,device_profile_type +DeviceQueueInfo,device_queue_info +DeviceRegistration,device_registration +DeviceRegistrationState,device_registration_state +DeviceRegistrationStateEventConfiguration,device_registration_state_event_configuration +DeviceRegistrationStateResourceTypeEventConfiguration,device_registration_state_resource_type_event_configuration +DeviceRegistryEnrichActivity,device_registry_enrich_activity +DeviceRememberedStatus,device_remembered_status +DeviceReportedStatus,device_reported_status +DeviceReportedTime,device_reported_time +DeviceRestrictions,device_restrictions +DeviceRetiredException,device_retired_exception +DeviceSecretVerifierConfig,device_secret_verifier_config +DeviceSecretVerifierConfigType,device_secret_verifier_config_type +DeviceSelectionConfig,device_selection_config +DeviceSelectionConfiguration,device_selection_configuration +DeviceSelectionResult,device_selection_result +DeviceSerialNumber,device_serial_number +DeviceSettingsSyncState,device_settings_sync_state +DeviceShadowEnrichActivity,device_shadow_enrich_activity +DeviceState,device_state +DeviceStats,device_stats +DeviceStatus,device_status +DeviceStatusDetail,device_status_detail +DeviceStatusDetails,device_status_details +DeviceStatusInfo,device_status_info +DeviceStreamLimitExceededException,device_stream_limit_exceeded_exception +DeviceSubsetType,device_subset_type +DeviceSummaries,device_summaries +DeviceSummary,device_summary +DeviceTemplate,device_template +DeviceToken,device_token +DeviceTrustProviderType,device_trust_provider_type +DeviceType,device_type +DeviceTypeAndroid,device_type_android +DeviceTypeChromeOs,device_type_chrome_os +DeviceTypeId,device_type_id +DeviceTypeIos,device_type_ios +DeviceTypeLinux,device_type_linux +DeviceTypeOsx,device_type_osx +DeviceTypeWeb,device_type_web +DeviceTypeWindows,device_type_windows +DeviceTypeZeroClient,device_type_zero_client +DeviceTypes,device_types +DeviceUnderTest,device_under_test +DeviceUpdateStatus,device_update_status +DeviceUsageType,device_usage_type +DeviceUserAgent,device_user_agent +DeviceUserAgents,device_user_agents +DeviceValidationDomain,device_validation_domain +DeviceiSCSIAttributes,devicei_scsi_attributes +Devices,devices +DhcpConfiguration,dhcp_configuration +DhcpConfigurations,dhcp_configurations +DhcpOptions,dhcp_options +DhcpOptionsId,dhcp_options_id +DhcpOptionsIds,dhcp_options_ids +DiagnosticCode,diagnostic_code +Diagnostics,diagnostics +DialRequest,dial_request +Dialnorm,dialnorm +DialogAction,dialog_action +DialogCodeHookInvocationSetting,dialog_code_hook_invocation_setting +DialogCodeHookSettings,dialog_code_hook_settings +DialogState,dialog_state +DialogueIntelligence,dialogue_intelligence +DictPageSizeLimit,dict_page_size_limit +DictionaryKeyThreshold,dictionary_key_threshold +Diff,diff +Difference,difference +DifferenceStatus,difference_status +DifferenceType,difference_type +Digest,digest +DigestAlgorithmMnemonic,digest_algorithm_mnemonic +DigestAlgorithmType,digest_algorithm_type +DigestTipAddress,digest_tip_address +DigestType,digest_type +DigestValue,digest_value +DigitalSignature,digital_signature +DigitalSignatureMethod,digital_signature_method +Dimension,dimension +DimensionConfigurations,dimension_configurations +DimensionContribution,dimension_contribution +DimensionContributionList,dimension_contribution_list +DimensionDetail,dimension_detail +DimensionField,dimension_field +DimensionFilter,dimension_filter +DimensionFilterList,dimension_filter_list +DimensionForeground,dimension_foreground +DimensionGroup,dimension_group +DimensionGroupDetail,dimension_group_detail +DimensionKey,dimension_key +DimensionKeyDescription,dimension_key_description +DimensionKeyDetail,dimension_key_detail +DimensionKeys,dimension_keys +DimensionList,dimension_list +DimensionMapping,dimension_mapping +DimensionMappings,dimension_mappings +DimensionName,dimension_name +DimensionNameValue,dimension_name_value +DimensionType,dimension_type +DimensionValue,dimension_value +DimensionValueAttributes,dimension_value_attributes +DimensionValueContribution,dimension_value_contribution +DimensionValueContributionList,dimension_value_contribution_list +DimensionValueList,dimension_value_list +DimensionValueSource,dimension_value_source +DimensionValueType,dimension_value_type +DimensionValues,dimension_values +DimensionValuesWithAttributes,dimension_values_with_attributes +DimensionalValueCount,dimensional_value_count +Dimensions,dimensions +DirectConnectClientException,direct_connect_client_exception +DirectConnectGateway,direct_connect_gateway +DirectConnectGatewayAssociation,direct_connect_gateway_association +DirectConnectGatewayAssociationProposal,direct_connect_gateway_association_proposal +DirectConnectGatewayAttachment,direct_connect_gateway_attachment +DirectConnectServerException,direct_connect_server_exception +DirectInternetAccess,direct_internet_access +DirectJDBCSource,direct_jdbc_source +DirectKafkaSource,direct_kafka_source +DirectKinesisSource,direct_kinesis_source +DirectMessageConfiguration,direct_message_configuration +DirectPathNoLog,direct_path_no_log +DirectPathParallelLoad,direct_path_parallel_load +DirectPutContent,direct_put_content +DirectSchemaChangePolicy,direct_schema_change_policy +Direction,direction +Directionality,directionality +Directories,directories +Directory,directory +DirectoryAlreadyExistsException,directory_already_exists_exception +DirectoryAlreadyInRegionException,directory_already_in_region_exception +DirectoryAlreadySharedException,directory_already_shared_exception +DirectoryArn,directory_arn +DirectoryConfig,directory_config +DirectoryConfigs,directory_configs +DirectoryConnectSettings,directory_connect_settings +DirectoryConnectSettingsDescription,directory_connect_settings_description +DirectoryDeletedException,directory_deleted_exception +DirectoryDescription,directory_description +DirectoryDescriptions,directory_descriptions +DirectoryDoesNotExistException,directory_does_not_exist_exception +DirectoryId,directory_id +DirectoryIds,directory_ids +DirectoryInDesiredStateException,directory_in_desired_state_exception +DirectoryInUseException,directory_in_use_exception +DirectoryInformation,directory_information +DirectoryLimitExceededException,directory_limit_exceeded_exception +DirectoryLimits,directory_limits +DirectoryMode,directory_mode +DirectoryName,directory_name +DirectoryNameConflictsWithFileNameException,directory_name_conflicts_with_file_name_exception +DirectoryNames,directory_names +DirectoryNotDisabledException,directory_not_disabled_exception +DirectoryNotEnabledException,directory_not_enabled_exception +DirectoryNotSharedException,directory_not_shared_exception +DirectoryPath,directory_path +DirectoryRegistration,directory_registration +DirectoryRegistrationArn,directory_registration_arn +DirectoryRegistrationSummary,directory_registration_summary +DirectoryRegistrations,directory_registrations +DirectoryServiceAuthentication,directory_service_authentication +DirectoryServiceAuthenticationFailedException,directory_service_authentication_failed_exception +DirectoryServiceAuthenticationRequest,directory_service_authentication_request +DirectoryStructure,directory_structure +DirectoryType,directory_type +DirectoryUnavailableException,directory_unavailable_exception +DirectoryUserId,directory_user_id +DirectoryVpcSettings,directory_vpc_settings +DirectoryVpcSettingsDescription,directory_vpc_settings_description +DisableAWSServiceAccessRequest,disable_aws_service_access_request +DisableActionConfiguration,disable_action_configuration +DisableAddOnRequest,disable_add_on_request +DisableAddOnResult,disable_add_on_result +DisableAddressTransferRequest,disable_address_transfer_request +DisableAddressTransferResult,disable_address_transfer_result +DisableAlarmActionRequest,disable_alarm_action_request +DisableAlarmActionsInput,disable_alarm_actions_input +DisableApiStop,disable_api_stop +DisableApiTermination,disable_api_termination +DisableApplicationLayerAutomaticResponseRequest,disable_application_layer_automatic_response_request +DisableAutomatedBackup,disable_automated_backup +DisableAwsNetworkPerformanceMetricSubscriptionRequest,disable_aws_network_performance_metric_subscription_request +DisableAwsNetworkPerformanceMetricSubscriptionResult,disable_aws_network_performance_metric_subscription_result +DisableClientAuthenticationRequest,disable_client_authentication_request +DisableControlInput,disable_control_input +DisableControlOutput,disable_control_output +DisableDelegatedAdminAccountRequest,disable_delegated_admin_account_request +DisableDelegatedAdminAccountResponse,disable_delegated_admin_account_response +DisableDirectoryRequest,disable_directory_request +DisableDirectoryResponse,disable_directory_response +DisableDomain,disable_domain +DisableDomainAutoRenewRequest,disable_domain_auto_renew_request +DisableDomainTransferLockRequest,disable_domain_transfer_lock_request +DisableDomainTransferLockResponse,disable_domain_transfer_lock_response +DisableDynamicScaling,disable_dynamic_scaling +DisableEbsEncryptionByDefaultRequest,disable_ebs_encryption_by_default_request +DisableEbsEncryptionByDefaultResult,disable_ebs_encryption_by_default_result +DisableEmailNotification,disable_email_notification +DisableEnhancedMonitoringInput,disable_enhanced_monitoring_input +DisableExecuteApiEndpoint,disable_execute_api_endpoint +DisableFastLaunchRequest,disable_fast_launch_request +DisableFastLaunchResult,disable_fast_launch_result +DisableFastSnapshotRestoreErrorItem,disable_fast_snapshot_restore_error_item +DisableFastSnapshotRestoreStateError,disable_fast_snapshot_restore_state_error +DisableFastSnapshotRestoreStateErrorItem,disable_fast_snapshot_restore_state_error_item +DisableFastSnapshotRestoreSuccessItem,disable_fast_snapshot_restore_success_item +DisableFastSnapshotRestoresRequest,disable_fast_snapshot_restores_request +DisableFastSnapshotRestoresResult,disable_fast_snapshot_restores_result +DisableGatewayInput,disable_gateway_input +DisableGatewayOutput,disable_gateway_output +DisableGlueTableCreation,disable_glue_table_creation +DisableHostedZoneDNSSECRequest,disable_hosted_zone_dnssec_request +DisableHostedZoneDNSSECResponse,disable_hosted_zone_dnssec_response +DisableImageBlockPublicAccessRequest,disable_image_block_public_access_request +DisableImageBlockPublicAccessResult,disable_image_block_public_access_result +DisableImageDeprecationRequest,disable_image_deprecation_request +DisableImageDeprecationResult,disable_image_deprecation_result +DisableImportFindingsForProductRequest,disable_import_findings_for_product_request +DisableIndexing,disable_indexing +DisableInsightRulesInput,disable_insight_rules_input +DisableInsightRulesOutput,disable_insight_rules_output +DisableIpamOrganizationAdminAccountRequest,disable_ipam_organization_admin_account_request +DisableIpamOrganizationAdminAccountResult,disable_ipam_organization_admin_account_result +DisableKeyRequest,disable_key_request +DisableKeyRotationRequest,disable_key_rotation_request +DisableLDAPSRequest,disable_ldaps_request +DisableLniAtDeviceIndex,disable_lni_at_device_index +DisableLocalGroups,disable_local_groups +DisableLogTypes,disable_log_types +DisableLoggingMessage,disable_logging_message +DisableMetricsCollectionQuery,disable_metrics_collection_query +DisableNetworking,disable_networking +DisableOrganizationAdminAccountRequest,disable_organization_admin_account_request +DisablePolicyTypeRequest,disable_policy_type_request +DisablePolicyTypeResponse,disable_policy_type_response +DisableProfiler,disable_profiler +DisableRadiusRequest,disable_radius_request +DisableRegionRequest,disable_region_request +DisableRemoteControl,disable_remote_control +DisableRequest,disable_request +DisableResponse,disable_response +DisableRollback,disable_rollback +DisableRuleRequest,disable_rule_request +DisableScaleIn,disable_scale_in +DisableSchemaValidation,disable_schema_validation +DisableSerialConsoleAccessRequest,disable_serial_console_access_request +DisableSerialConsoleAccessResult,disable_serial_console_access_result +DisableSnapshotCopyMessage,disable_snapshot_copy_message +DisableSnapshotCopyResult,disable_snapshot_copy_result +DisableSsl,disable_ssl +DisableSsoRequest,disable_sso_request +DisableStageTransitionInput,disable_stage_transition_input +DisableTemplateValidation,disable_template_validation +DisableTopicRuleRequest,disable_topic_rule_request +DisableTransitGatewayRouteTablePropagationRequest,disable_transit_gateway_route_table_propagation_request +DisableTransitGatewayRouteTablePropagationResult,disable_transit_gateway_route_table_propagation_result +DisableUseAsDirectQuerySource,disable_use_as_direct_query_source +DisableUseAsImportedSource,disable_use_as_imported_source +DisableUserRequest,disable_user_request +DisableUserResponse,disable_user_response +DisableValueTrimming,disable_value_trimming +DisableVgwRoutePropagationRequest,disable_vgw_route_propagation_request +DisableVpcClassicLinkDnsSupportRequest,disable_vpc_classic_link_dns_support_request +DisableVpcClassicLinkDnsSupportResult,disable_vpc_classic_link_dns_support_result +DisableVpcClassicLinkRequest,disable_vpc_classic_link_request +DisableVpcClassicLinkResult,disable_vpc_classic_link_result +Disabled,disabled +DisabledApiException,disabled_api_exception +DisabledDate,disabled_date +DisabledException,disabled_exception +DisabledOperationException,disabled_operation_exception +DisabledReason,disabled_reason +DisabledTime,disabled_time +DisablingTime,disabling_time +DisallowedCidrs,disallowed_cidrs +DisassociateAcceleratorTypes,disassociate_accelerator_types +DisassociateAccountsInput,disassociate_accounts_input +DisassociateAccountsOutput,disassociate_accounts_output +DisassociateAdditionalCodeRepositories,disassociate_additional_code_repositories +DisassociateAddressRequest,disassociate_address_request +DisassociateApiRequest,disassociate_api_request +DisassociateAppBlockBuilderAppBlockRequest,disassociate_app_block_builder_app_block_request +DisassociateApplicationFleetRequest,disassociate_application_fleet_request +DisassociateApplicationFromEntitlementRequest,disassociate_application_from_entitlement_request +DisassociateApplicationsRequest,disassociate_applications_request +DisassociateApprovalRuleTemplateFromRepositoryInput,disassociate_approval_rule_template_from_repository_input +DisassociateApprovedOriginRequest,disassociate_approved_origin_request +DisassociateAssessmentReportEvidenceFolderRequest,disassociate_assessment_report_evidence_folder_request +DisassociateAssetsRequest,disassociate_assets_request +DisassociateAttributeGroupRequest,disassociate_attribute_group_request +DisassociateAttributeGroupResponse,disassociate_attribute_group_response +DisassociateAwsAccountFromPartnerAccountRequest,disassociate_aws_account_from_partner_account_request +DisassociateBotRequest,disassociate_bot_request +DisassociateBrowserSettingsRequest,disassociate_browser_settings_request +DisassociateBudgetFromResourceInput,disassociate_budget_from_resource_input +DisassociateCertificateRequest,disassociate_certificate_request +DisassociateChannelFlowRequest,disassociate_channel_flow_request +DisassociateClientDeviceFromCoreDeviceEntry,disassociate_client_device_from_core_device_entry +DisassociateClientDeviceFromCoreDeviceErrorEntry,disassociate_client_device_from_core_device_error_entry +DisassociateClientVpnTargetNetworkRequest,disassociate_client_vpn_target_network_request +DisassociateClientVpnTargetNetworkResult,disassociate_client_vpn_target_network_result +DisassociateConfigurationItemsFromApplicationRequest,disassociate_configuration_items_from_application_request +DisassociateConnectPeerRequest,disassociate_connect_peer_request +DisassociateConnectPeerResponse,disassociate_connect_peer_response +DisassociateConnectionAliasRequest,disassociate_connection_alias_request +DisassociateConnectionFromLagRequest,disassociate_connection_from_lag_request +DisassociateConnectorRequest,disassociate_connector_request +DisassociateContactFromAddressBookRequest,disassociate_contact_from_address_book_request +DisassociateCreatedArtifactRequest,disassociate_created_artifact_request +DisassociateCustomDomainRequest,disassociate_custom_domain_request +DisassociateCustomDomainResponse,disassociate_custom_domain_response +DisassociateCustomerGatewayRequest,disassociate_customer_gateway_request +DisassociateCustomerGatewayResponse,disassociate_customer_gateway_response +DisassociateDRTLogBucketRequest,disassociate_drt_log_bucket_request +DisassociateDataShareConsumerMessage,disassociate_data_share_consumer_message +DisassociateDefaultCodeRepository,disassociate_default_code_repository +DisassociateDelegateFromResourceRequest,disassociate_delegate_from_resource_request +DisassociateDelegationSignerFromDomainRequest,disassociate_delegation_signer_from_domain_request +DisassociateDelegationSignerFromDomainResponse,disassociate_delegation_signer_from_domain_response +DisassociateDeviceFromPlacementRequest,disassociate_device_from_placement_request +DisassociateDeviceFromRoomRequest,disassociate_device_from_room_request +DisassociateDiscoveredResourceRequest,disassociate_discovered_resource_request +DisassociateDomainRequest,disassociate_domain_request +DisassociateElasticIpRequest,disassociate_elastic_ip_request +DisassociateEnclaveCertificateIamRoleRequest,disassociate_enclave_certificate_iam_role_request +DisassociateEnclaveCertificateIamRoleResult,disassociate_enclave_certificate_iam_role_result +DisassociateEntireAccount,disassociate_entire_account +DisassociateEntitiesFromExperienceRequest,disassociate_entities_from_experience_request +DisassociateEntitiesFromExperienceResponse,disassociate_entities_from_experience_response +DisassociateEnvironmentOperationsRoleMessage,disassociate_environment_operations_role_message +DisassociateExternalConnectionRequest,disassociate_external_connection_request +DisassociateExternalConnectionResult,disassociate_external_connection_result +DisassociateFacesRequest,disassociate_faces_request +DisassociateFacesResponse,disassociate_faces_response +DisassociateFileSystemAliasesRequest,disassociate_file_system_aliases_request +DisassociateFileSystemAliasesResponse,disassociate_file_system_aliases_response +DisassociateFileSystemInput,disassociate_file_system_input +DisassociateFileSystemOutput,disassociate_file_system_output +DisassociateFirewallRuleGroupRequest,disassociate_firewall_rule_group_request +DisassociateFirewallRuleGroupResponse,disassociate_firewall_rule_group_response +DisassociateFleetRequest,disassociate_fleet_request +DisassociateFraudsterRequest,disassociate_fraudster_request +DisassociateFraudsterResponse,disassociate_fraudster_response +DisassociateFromAdministratorAccountRequest,disassociate_from_administrator_account_request +DisassociateFromMasterAccountRequest,disassociate_from_master_account_request +DisassociateGatewayFromServerInput,disassociate_gateway_from_server_input +DisassociateGatewayFromServerOutput,disassociate_gateway_from_server_output +DisassociateGlobalReplicationGroupMessage,disassociate_global_replication_group_message +DisassociateGlobalReplicationGroupResult,disassociate_global_replication_group_result +DisassociateHealthCheckRequest,disassociate_health_check_request +DisassociateIamInstanceProfileRequest,disassociate_iam_instance_profile_request +DisassociateIamInstanceProfileResult,disassociate_iam_instance_profile_result +DisassociateIdentityProviderConfigRequest,disassociate_identity_provider_config_request +DisassociateIdentityProviderConfigResponse,disassociate_identity_provider_config_response +DisassociateInstanceEventWindowRequest,disassociate_instance_event_window_request +DisassociateInstanceEventWindowResult,disassociate_instance_event_window_result +DisassociateInstanceStorageConfigRequest,disassociate_instance_storage_config_request +DisassociateIpAccessSettingsRequest,disassociate_ip_access_settings_request +DisassociateIpGroupsRequest,disassociate_ip_groups_request +DisassociateIpamResourceDiscoveryRequest,disassociate_ipam_resource_discovery_request +DisassociateIpamResourceDiscoveryResult,disassociate_ipam_resource_discovery_result +DisassociateKmsKeyRequest,disassociate_kms_key_request +DisassociateLambdaFunctionRequest,disassociate_lambda_function_request +DisassociateLensesInput,disassociate_lenses_input +DisassociateLexBotRequest,disassociate_lex_bot_request +DisassociateLicenseRequest,disassociate_license_request +DisassociateLicenseResponse,disassociate_license_response +DisassociateLifecycleConfig,disassociate_lifecycle_config +DisassociateLinkRequest,disassociate_link_request +DisassociateLinkResponse,disassociate_link_response +DisassociateMacSecKeyRequest,disassociate_mac_sec_key_request +DisassociateMacSecKeyResponse,disassociate_mac_sec_key_response +DisassociateMemberAccountRequest,disassociate_member_account_request +DisassociateMemberFromGroupRequest,disassociate_member_from_group_request +DisassociateMemberRequest,disassociate_member_request +DisassociateMemberResponse,disassociate_member_response +DisassociateMembersRequest,disassociate_members_request +DisassociateMembersResponse,disassociate_members_response +DisassociateMembershipRequest,disassociate_membership_request +DisassociateMergedGraphqlApiRequest,disassociate_merged_graphql_api_request +DisassociateMergedGraphqlApiResponse,disassociate_merged_graphql_api_response +DisassociateMulticastGroupFromFuotaTaskRequest,disassociate_multicast_group_from_fuota_task_request +DisassociateNatGatewayAddressRequest,disassociate_nat_gateway_address_request +DisassociateNatGatewayAddressResult,disassociate_nat_gateway_address_result +DisassociateNetworkSettingsRequest,disassociate_network_settings_request +DisassociateNodeRequest,disassociate_node_request +DisassociateNodeResponse,disassociate_node_response +DisassociateOpsItemRelatedItemRequest,disassociate_ops_item_related_item_request +DisassociateOriginationIdentityRequest,disassociate_origination_identity_request +DisassociateOriginationIdentityResult,disassociate_origination_identity_result +DisassociatePersonasFromEntitiesRequest,disassociate_personas_from_entities_request +DisassociatePersonasFromEntitiesResponse,disassociate_personas_from_entities_response +DisassociatePhoneNumberContactFlowRequest,disassociate_phone_number_contact_flow_request +DisassociatePhoneNumberFromUserRequest,disassociate_phone_number_from_user_request +DisassociatePhoneNumbersFromVoiceConnectorGroupRequest,disassociate_phone_numbers_from_voice_connector_group_request +DisassociatePhoneNumbersFromVoiceConnectorGroupResponse,disassociate_phone_numbers_from_voice_connector_group_response +DisassociatePhoneNumbersFromVoiceConnectorRequest,disassociate_phone_numbers_from_voice_connector_request +DisassociatePhoneNumbersFromVoiceConnectorResponse,disassociate_phone_numbers_from_voice_connector_response +DisassociatePricingRulesInput,disassociate_pricing_rules_input +DisassociatePricingRulesOutput,disassociate_pricing_rules_output +DisassociatePrincipalFromPortfolioInput,disassociate_principal_from_portfolio_input +DisassociateProductFromPortfolioInput,disassociate_product_from_portfolio_input +DisassociateProfilesInput,disassociate_profiles_input +DisassociateQualificationFromWorkerRequest,disassociate_qualification_from_worker_request +DisassociateQueueQuickConnectsRequest,disassociate_queue_quick_connects_request +DisassociateRecoveryPointFromParentInput,disassociate_recovery_point_from_parent_input +DisassociateRecoveryPointInput,disassociate_recovery_point_input +DisassociateRepositoryRequest,disassociate_repository_request +DisassociateRepositoryResponse,disassociate_repository_response +DisassociateResolverEndpointIpAddressRequest,disassociate_resolver_endpoint_ip_address_request +DisassociateResolverEndpointIpAddressResponse,disassociate_resolver_endpoint_ip_address_response +DisassociateResolverQueryLogConfigRequest,disassociate_resolver_query_log_config_request +DisassociateResolverQueryLogConfigResponse,disassociate_resolver_query_log_config_response +DisassociateResolverRuleRequest,disassociate_resolver_rule_request +DisassociateResolverRuleResponse,disassociate_resolver_rule_response +DisassociateResourceRequest,disassociate_resource_request +DisassociateResourceResponse,disassociate_resource_response +DisassociateResourceResponseElement,disassociate_resource_response_element +DisassociateResourceSharePermissionRequest,disassociate_resource_share_permission_request +DisassociateResourceSharePermissionResponse,disassociate_resource_share_permission_response +DisassociateResourceShareRequest,disassociate_resource_share_request +DisassociateResourceShareResponse,disassociate_resource_share_response +DisassociateRoleFromGroupRequest,disassociate_role_from_group_request +DisassociateRoleFromGroupResponse,disassociate_role_from_group_response +DisassociateRouteTableRequest,disassociate_route_table_request +DisassociateRoutingProfileQueuesRequest,disassociate_routing_profile_queues_request +DisassociateS3ResourcesRequest,disassociate_s3_resources_request +DisassociateS3ResourcesResult,disassociate_s3_resources_result +DisassociateSchedule,disassociate_schedule +DisassociateSecurityKeyRequest,disassociate_security_key_request +DisassociateServiceActionFromProvisioningArtifactInput,disassociate_service_action_from_provisioning_artifact_input +DisassociateServiceRoleFromAccountResponse,disassociate_service_role_from_account_response +DisassociateSigninDelegateGroupsFromAccountRequest,disassociate_signin_delegate_groups_from_account_request +DisassociateSkillFromSkillGroupRequest,disassociate_skill_from_skill_group_request +DisassociateSkillFromUsersRequest,disassociate_skill_from_users_request +DisassociateSkillGroupFromRoomRequest,disassociate_skill_group_from_room_request +DisassociateSourceGraphqlApiRequest,disassociate_source_graphql_api_request +DisassociateSourceGraphqlApiResponse,disassociate_source_graphql_api_response +DisassociateSourceServersRequest,disassociate_source_servers_request +DisassociateSubnetCidrBlockRequest,disassociate_subnet_cidr_block_request +DisassociateSubnetCidrBlockResult,disassociate_subnet_cidr_block_result +DisassociateSubnetsRequest,disassociate_subnets_request +DisassociateSubnetsResponse,disassociate_subnets_response +DisassociateTagOptionFromResourceInput,disassociate_tag_option_from_resource_input +DisassociateTeamMemberRequest,disassociate_team_member_request +DisassociateThirdPartyFirewallRequest,disassociate_third_party_firewall_request +DisassociateThirdPartyFirewallResponse,disassociate_third_party_firewall_response +DisassociateTimeSeriesFromAssetPropertyRequest,disassociate_time_series_from_asset_property_request +DisassociateTrackerConsumerRequest,disassociate_tracker_consumer_request +DisassociateTrafficDistributionGroupUserRequest,disassociate_traffic_distribution_group_user_request +DisassociateTransitGatewayConnectPeerRequest,disassociate_transit_gateway_connect_peer_request +DisassociateTransitGatewayConnectPeerResponse,disassociate_transit_gateway_connect_peer_response +DisassociateTransitGatewayMulticastDomainRequest,disassociate_transit_gateway_multicast_domain_request +DisassociateTransitGatewayMulticastDomainResult,disassociate_transit_gateway_multicast_domain_result +DisassociateTransitGatewayPolicyTableRequest,disassociate_transit_gateway_policy_table_request +DisassociateTransitGatewayPolicyTableResult,disassociate_transit_gateway_policy_table_result +DisassociateTransitGatewayRouteTableRequest,disassociate_transit_gateway_route_table_request +DisassociateTransitGatewayRouteTableResult,disassociate_transit_gateway_route_table_result +DisassociateTrialComponentRequest,disassociate_trial_component_request +DisassociateTrialComponentResponse,disassociate_trial_component_response +DisassociateTrunkInterfaceRequest,disassociate_trunk_interface_request +DisassociateTrunkInterfaceResult,disassociate_trunk_interface_result +DisassociateTrustStoreRequest,disassociate_trust_store_request +DisassociateUserAccessLoggingSettingsRequest,disassociate_user_access_logging_settings_request +DisassociateUserFromPermissionGroupRequest,disassociate_user_from_permission_group_request +DisassociateUserFromPermissionGroupResponse,disassociate_user_from_permission_group_response +DisassociateUserRequest,disassociate_user_request +DisassociateUserResponse,disassociate_user_response +DisassociateUserSettingsRequest,disassociate_user_settings_request +DisassociateVPCFromHostedZoneRequest,disassociate_vpc_from_hosted_zone_request +DisassociateVPCFromHostedZoneResponse,disassociate_vpc_from_hosted_zone_response +DisassociateVehicleFleetRequest,disassociate_vehicle_fleet_request +DisassociateVpcCidrBlockRequest,disassociate_vpc_cidr_block_request +DisassociateVpcCidrBlockResult,disassociate_vpc_cidr_block_result +DisassociateWebACLRequest,disassociate_web_acl_request +DisassociateWebsiteAuthorizationProviderRequest,disassociate_website_authorization_provider_request +DisassociateWebsiteCertificateAuthorityRequest,disassociate_website_certificate_authority_request +DisassociateWhenNotFound,disassociate_when_not_found +DisassociateWirelessDeviceFromFuotaTaskRequest,disassociate_wireless_device_from_fuota_task_request +DisassociateWirelessDeviceFromMulticastGroupRequest,disassociate_wireless_device_from_multicast_group_request +DisassociateWirelessDeviceFromThingRequest,disassociate_wireless_device_from_thing_request +DisassociateWirelessGatewayFromCertificateRequest,disassociate_wireless_gateway_from_certificate_request +DisassociateWirelessGatewayFromThingRequest,disassociate_wireless_gateway_from_thing_request +DisassociatedAt,disassociated_at +DisassociatedFace,disassociated_face +DisassociatedFaces,disassociated_faces +DisassociationDate,disassociation_date +DiscardedFiles,discarded_files +DisconnectCustomKeyStoreRequest,disconnect_custom_key_store_request +DisconnectFailures,disconnect_failures +DisconnectFromServiceRequest,disconnect_from_service_request +DisconnectParticipantRequest,disconnect_participant_request +DisconnectPlayerRequest,disconnect_player_request +DisconnectPlayerResult,disconnect_player_result +DisconnectRecoveryInstanceRequest,disconnect_recovery_instance_request +DisconnectSourceServerRequest,disconnect_source_server_request +DisconnectSuccesses,disconnect_successes +DisconnectTimeoutInSeconds,disconnect_timeout_in_seconds +DisconnectTimestamp,disconnect_timestamp +DisconnectUserRequest,disconnect_user_request +DisconnectionEvent,disconnection_event +DiscontinuityMode,discontinuity_mode +DiscontinuityTags,discontinuity_tags +DiscoverDynamicCardVerificationCode,discover_dynamic_card_verification_code +DiscoverInputSchemaRequest,discover_input_schema_request +DiscoverInputSchemaResponse,discover_input_schema_response +DiscoverInstancesRequest,discover_instances_request +DiscoverInstancesResponse,discover_instances_response +DiscoverInstancesRevisionRequest,discover_instances_revision_request +DiscoverInstancesRevisionResponse,discover_instances_revision_response +DiscoverPollEndpointRequest,discover_poll_endpoint_request +DiscoverPollEndpointResponse,discover_poll_endpoint_response +DiscoveredResource,discovered_resource +DiscoveredResourceList,discovered_resource_list +DiscovererArn,discoverer_arn +DiscovererId,discoverer_id +DiscovererIdPrefix,discoverer_id_prefix +DiscovererSummary,discoverer_summary +Discoverers,discoverers +DiscoveryConfig,discovery_config +DiscoveryData,discovery_data +DiscoveryIntegrationStatus,discovery_integration_status +DiscoveryJobArn,discovery_job_arn +DiscoveryJobListEntry,discovery_job_list_entry +DiscoveryJobs,discovery_jobs +DiscoveryRegion,discovery_region +DiscoveryServerConfiguration,discovery_server_configuration +DiscoveryStatus,discovery_status +DiscoveryType,discovery_type +Disk,disk +DiskAllocationResource,disk_allocation_resource +DiskAllocationType,disk_allocation_type +DiskAttributeList,disk_attribute_list +DiskContainer,disk_container +DiskContainers,disk_containers +DiskId,disk_id +DiskIds,disk_ids +DiskImage,disk_image +DiskImageDescription,disk_image_description +DiskImageDetail,disk_image_detail +DiskImageFormat,disk_image_format +DiskImageSize,disk_image_size +DiskImageVolumeDescription,disk_image_volume_description +DiskImages,disk_images +DiskInfo,disk_info +DiskIopsConfiguration,disk_iops_configuration +DiskMap,disk_map +DiskNode,disk_node +DiskPath,disk_path +DiskReadBytesPerSecond,disk_read_bytes_per_second +DiskReadOpsPerSecond,disk_read_ops_per_second +DiskResourceUtilization,disk_resource_utilization +DiskSizeInBytes,disk_size_in_bytes +DiskSnapshot,disk_snapshot +DiskSnapshotInfo,disk_snapshot_info +DiskStatus,disk_status +DiskWriteBytesPerSecond,disk_write_bytes_per_second +DiskWriteOpsPerSecond,disk_write_ops_per_second +Disks,disks +DismissUserContactRequest,dismiss_user_contact_request +DisplayAs,display_as +DisplayAspectRatio,display_aspect_ratio +DisplayConfiguration,display_configuration +DisplayData,display_data +DisplayFormat,display_format +DisplayFormatOptions,display_format_options +DisplayFragmentNumber,display_fragment_number +DisplayFragmentTimestamp,display_fragment_timestamp +DisplayLabel,display_label +DisplayLanguageCode,display_language_code +DisplayMode,display_mode +DisplayName,display_name +DisplayNamePrefix,display_name_prefix +DisplayOptions,display_options +DisplayOrder,display_order +DisplayText,display_text +Displayable,displayable +DisposePackageVersionsRequest,dispose_package_versions_request +DisposePackageVersionsResult,dispose_package_versions_result +DisruptionCompliance,disruption_compliance +DissociateEntityFromThingRequest,dissociate_entity_from_thing_request +DissociatePackageRequest,dissociate_package_request +DissociatePackageResponse,dissociate_package_response +Distance,distance +DistanceUnit,distance_unit +DistinguishedNameQualifier,distinguished_name_qualifier +DistributeDataset,distribute_dataset +DistributeDatasetEntriesRequest,distribute_dataset_entries_request +Distribution,distribution +DistributionAlreadyExists,distribution_already_exists +DistributionBundle,distribution_bundle +DistributionConfig,distribution_config +DistributionConfigWithTags,distribution_config_with_tags +DistributionConfiguration,distribution_configuration +DistributionConfigurationSummary,distribution_configuration_summary +DistributionId,distribution_id +DistributionIdList,distribution_id_list +DistributionList,distribution_list +DistributionNotDisabled,distribution_not_disabled +DistributionSummary,distribution_summary +Distributions,distributions +Distributor,distributor +DistributorId,distributor_id +DistrictOrCounty,district_or_county +DkimAttributes,dkim_attributes +DkimEnabled,dkim_enabled +DkimPercentage,dkim_percentage +DkimSigningAttributes,dkim_signing_attributes +DkimStatus,dkim_status +DkimTokens,dkim_tokens +DkimVerificationStatus,dkim_verification_status +DlBucketSize,dl_bucket_size +DlClass,dl_class +DlDr,dl_dr +DlFreq,dl_freq +DlRate,dl_rate +DlRatePolicy,dl_rate_policy +DlqEventQueueArn,dlq_event_queue_arn +DmsTransferSettings,dms_transfer_settings +Dns,dns +DnsAddresses,dns_addresses +DnsConfig,dns_config +DnsConfigChange,dns_config_change +DnsDuplicateRuleGroupViolation,dns_duplicate_rule_group_violation +DnsEntries,dns_entries +DnsEntry,dns_entry +DnsIpAddr,dns_ip_addr +DnsIpAddresses,dns_ip_addresses +DnsIpAddrs,dns_ip_addrs +DnsIps,dns_ips +DnsLogs,dns_logs +DnsName,dns_name +DnsNameServers,dns_name_servers +DnsOptions,dns_options +DnsOptionsSpecification,dns_options_specification +DnsProperties,dns_properties +DnsRecord,dns_record +DnsRecordCreationState,dns_record_creation_state +DnsRecordIpType,dns_record_ip_type +DnsRecords,dns_records +DnsRequestAction,dns_request_action +DnsResolvers,dns_resolvers +DnsRuleGroupLimitExceededViolation,dns_rule_group_limit_exceeded_violation +DnsRuleGroupPriorityConflictViolation,dns_rule_group_priority_conflict_violation +DnsSearchDomains,dns_search_domains +DnsSec,dns_sec +DnsServers,dns_servers +DnsServersOptionsModifyStructure,dns_servers_options_modify_structure +DnsServiceDiscovery,dns_service_discovery +DnsSupport,dns_support +DnsTargetResource,dns_target_resource +DnssecKey,dnssec_key +DnssecKeys,dnssec_keys +DnssecLimitExceeded,dnssec_limit_exceeded +DnssecSigningAttributes,dnssec_signing_attributes +DocDbDataProviderSettings,doc_db_data_provider_settings +DocDbSettings,doc_db_settings +DocService,doc_service +DockerLabels,docker_labels +DockerSecurityOptions,docker_security_options +DockerVolumeConfiguration,docker_volume_configuration +DocsToInvestigate,docs_to_investigate +Document,document +DocumentAlreadyExists,document_already_exists +DocumentAttribute,document_attribute +DocumentAttributeCondition,document_attribute_condition +DocumentAttributeKey,document_attribute_key +DocumentAttributeTarget,document_attribute_target +DocumentAttributeValue,document_attribute_value +DocumentAttributeValueCountPair,document_attribute_value_count_pair +DocumentAttributeValueCountPairs,document_attribute_value_count_pairs +DocumentAttributeValueType,document_attribute_value_type +DocumentAttributes,document_attributes +DocumentClass,document_class +DocumentClassificationConfig,document_classification_config +DocumentClassificationJobFilter,document_classification_job_filter +DocumentClassificationJobProperties,document_classification_job_properties +DocumentClassificationJobPropertiesList,document_classification_job_properties_list +DocumentClassifierArn,document_classifier_arn +DocumentClassifierDocuments,document_classifier_documents +DocumentClassifierFilter,document_classifier_filter +DocumentClassifierInputDataConfig,document_classifier_input_data_config +DocumentClassifierName,document_classifier_name +DocumentClassifierOutputDataConfig,document_classifier_output_data_config +DocumentClassifierProperties,document_classifier_properties +DocumentClassifierPropertiesList,document_classifier_properties_list +DocumentClassifierSummariesList,document_classifier_summaries_list +DocumentClassifierSummary,document_classifier_summary +DocumentContentDeletion,document_content_deletion +DocumentDBEventSourceConfig,document_db_event_source_config +DocumentDataColumnName,document_data_column_name +DocumentDataFieldName,document_data_field_name +DocumentDefaultVersionDescription,document_default_version_description +DocumentDescription,document_description +DocumentExcerpt,document_excerpt +DocumentFilter,document_filter +DocumentFilterList,document_filter_list +DocumentFormat,document_format +DocumentGroup,document_group +DocumentGroups,document_groups +DocumentHash,document_hash +DocumentHashType,document_hash_type +DocumentId,document_id +DocumentIdColumnName,document_id_column_name +DocumentIdList,document_id_list +DocumentIdOptions,document_id_options +DocumentIdentifier,document_identifier +DocumentIdentifiers,document_identifiers +DocumentIndex,document_index +DocumentInfo,document_info +DocumentInfoList,document_info_list +DocumentKeyValuesFilter,document_key_values_filter +DocumentLabel,document_label +DocumentLibraryFieldMappings,document_library_field_mappings +DocumentLimitExceeded,document_limit_exceeded +DocumentLocation,document_location +DocumentLockedForCommentsException,document_locked_for_comments_exception +DocumentMetadata,document_metadata +DocumentMetadataConfiguration,document_metadata_configuration +DocumentMetadataConfigurationUpdates,document_metadata_configuration_updates +DocumentMetadataConfigurations,document_metadata_configurations +DocumentMetadataResponseInfo,document_metadata_response_info +DocumentName,document_name +DocumentPages,document_pages +DocumentParameter,document_parameter +DocumentPermissionLimit,document_permission_limit +DocumentReadAction,document_read_action +DocumentReadMode,document_read_mode +DocumentReaderConfig,document_reader_config +DocumentRelevanceConfiguration,document_relevance_configuration +DocumentRelevanceOverrideConfigurations,document_relevance_override_configurations +DocumentRequires,document_requires +DocumentReviewCommentSource,document_review_comment_source +DocumentReviewerResponseSource,document_reviewer_response_source +DocumentReviews,document_reviews +DocumentSchemaVersion,document_schema_version +DocumentServiceException,document_service_exception +DocumentServiceWarning,document_service_warning +DocumentSizeInBytes,document_size_in_bytes +DocumentStatus,document_status +DocumentStatusList,document_status_list +DocumentSuggesterOptions,document_suggester_options +DocumentText,document_text +DocumentTitle,document_title +DocumentTitleColumnName,document_title_column_name +DocumentTitleFieldName,document_title_field_name +DocumentTooLargeException,document_too_large_exception +DocumentType,document_type +DocumentTypeListItem,document_type_list_item +DocumentURI,document_uri +DocumentVersion,document_version +DocumentVersionInfo,document_version_info +DocumentVersionLimitExceeded,document_version_limit_exceeded +DocumentVersionMetadata,document_version_metadata +DocumentVersions,document_versions +DocumentationPart,documentation_part +DocumentationPartIds,documentation_part_ids +DocumentationPartLocation,documentation_part_location +DocumentationParts,documentation_parts +DocumentationUrl,documentation_url +DocumentationVersion,documentation_version +DocumentationVersions,documentation_versions +Documents,documents +DocumentsAdded,documents_added +DocumentsDeleted,documents_deleted +DocumentsFailed,documents_failed +DocumentsMetadataConfiguration,documents_metadata_configuration +DocumentsModified,documents_modified +DocumentsScanned,documents_scanned +DocumentsWithErrorsCount,documents_with_errors_count +DoesNotExistException,does_not_exist_exception +DolbyEDecode,dolby_e_decode +DolbyVision,dolby_vision +DolbyVision81Settings,dolby_vision81_settings +DolbyVisionLevel6Metadata,dolby_vision_level6_metadata +DolbyVisionMetadataXml,dolby_vision_metadata_xml +Dollars,dollars +Domain,domain +DomainARN,domain_arn +DomainAlreadyExistsFault,domain_already_exists_fault +DomainArn,domain_arn +DomainAssociation,domain_association +DomainAuthSecretArn,domain_auth_secret_arn +DomainCertificateArn,domain_certificate_arn +DomainConfig,domain_config +DomainConfiguration,domain_configuration +DomainConfigurationSummary,domain_configuration_summary +DomainController,domain_controller +DomainControllerId,domain_controller_id +DomainControllerIds,domain_controller_ids +DomainControllerLimitExceededException,domain_controller_limit_exceeded_exception +DomainControllers,domain_controllers +DomainCount,domain_count +DomainDeliverabilityCampaign,domain_deliverability_campaign +DomainDeliverabilityCampaigns,domain_deliverability_campaigns +DomainDeliverabilityTrackingOption,domain_deliverability_tracking_option +DomainDeprecatedFault,domain_deprecated_fault +DomainDescription,domain_description +DomainDescriptionType,domain_description_type +DomainDetail,domain_detail +DomainDetails,domain_details +DomainDnsIps,domain_dns_ips +DomainEndpoint,domain_endpoint +DomainEndpointOptions,domain_endpoint_options +DomainEndpointOptionsStatus,domain_endpoint_options_status +DomainEndpoints,domain_endpoints +DomainEntry,domain_entry +DomainEntryPoint,domain_entry_point +DomainExecutionRoleArn,domain_execution_role_arn +DomainFileUrl,domain_file_url +DomainFqdn,domain_fqdn +DomainIAMRoleName,domain_iam_role_name +DomainId,domain_id +DomainIdEquals,domain_id_equals +DomainInfo,domain_info +DomainInformation,domain_information +DomainInformationContainer,domain_information_container +DomainInfos,domain_infos +DomainIspPlacement,domain_isp_placement +DomainIspPlacements,domain_isp_placements +DomainJoinInfo,domain_join_info +DomainLimitExceeded,domain_limit_exceeded +DomainMembership,domain_membership +DomainMemberships,domain_memberships +DomainName,domain_name +DomainNameConfig,domain_name_config +DomainNameConfiguration,domain_name_configuration +DomainNameConfigurations,domain_name_configurations +DomainNameStatus,domain_name_status +DomainNameStatusMessage,domain_name_status_message +DomainNames,domain_names +DomainNodesStatus,domain_nodes_status +DomainNodesStatusList,domain_nodes_status_list +DomainNotFoundFault,domain_not_found_fault +DomainNotWhitelistedException,domain_not_whitelisted_exception +DomainOu,domain_ou +DomainPackageDetails,domain_package_details +DomainPackageDetailsList,domain_package_details_list +DomainPackageStatus,domain_package_status +DomainPrefix,domain_prefix +DomainPrice,domain_price +DomainSettings,domain_settings +DomainSettingsForUpdate,domain_settings_for_update +DomainSigningPrivateKey,domain_signing_private_key +DomainSigningSelector,domain_signing_selector +DomainState,domain_state +DomainStats,domain_stats +DomainStatus,domain_status +DomainStatusList,domain_status_list +DomainSuggestion,domain_suggestion +DomainSummaries,domain_summaries +DomainSummary,domain_summary +DomainTransferability,domain_transferability +DomainValidation,domain_validation +DomainValidationOption,domain_validation_option +DomainValidationOptions,domain_validation_options +DomainValidationRecord,domain_validation_record +Domains,domains +DominantColor,dominant_color +DominantColors,dominant_colors +DominantLanguage,dominant_language +DominantLanguageDetectionJobFilter,dominant_language_detection_job_filter +DominantLanguageDetectionJobProperties,dominant_language_detection_job_properties +DominantLanguageDetectionJobPropertiesList,dominant_language_detection_job_properties_list +DonutCenterOptions,donut_center_options +DonutOptions,donut_options +DoubleArrayOptions,double_array_options +DoubleColumnStatisticsData,double_column_statistics_data +DoubleOptions,double_options +DoubleRange,double_range +DoubleValue,double_value +DownScaling,down_scaling +DownlinkFrequency,downlink_frequency +DownlinkMode,downlink_mode +DownlinkQueueMessage,downlink_queue_message +DownlinkQueueMessagesList,downlink_queue_messages_list +DownloadDBLogFilePortionDetails,download_db_log_file_portion_details +DownloadDBLogFilePortionMessage,download_db_log_file_portion_message +DownloadDefaultKeyPairResult,download_default_key_pair_result +DownloadSpeed,download_speed +DownloadUri,download_uri +DownloadUrl,download_url +DownmixControl,downmix_control +DpdTimeoutAction,dpd_timeout_action +DpdTimeoutSeconds,dpd_timeout_seconds +DpuExecutionInMillis,dpu_execution_in_millis +DrMax,dr_max +DrMin,dr_min +DraftUploadOutOfSyncException,draft_upload_out_of_sync_exception +DrcLine,drc_line +DrcProfile,drc_profile +DrcRf,drc_rf +DriftCheckBaselines,drift_check_baselines +DriftCheckBias,drift_check_bias +DriftCheckExplainability,drift_check_explainability +DriftCheckModelDataQuality,drift_check_model_data_quality +DriftCheckModelQuality,drift_check_model_quality +DriftDetectionStatus,drift_detection_status +DriftInformation,drift_information +DriftStatus,drift_status +DriftedStackInstancesCount,drifted_stack_instances_count +DriftedStackResourceCount,drifted_stack_resource_count +DrillDownFilter,drill_down_filter +DrillDownFilters,drill_down_filters +DriveCacheType,drive_cache_type +Driver,driver +DriverOpts,driver_opts +DrmSystems,drm_systems +Drop,drop +DropDownControlDisplayOptions,drop_down_control_display_options +DropDuplicates,drop_duplicates +DropFields,drop_fields +DropFrameTimecode,drop_frame_timecode +DropNullFields,drop_null_fields +Dropdown,dropdown +Dropped,dropped +DryRun,dry_run +DryRunConfig,dry_run_config +DryRunId,dry_run_id +DryRunMode,dry_run_mode +DryRunOperation,dry_run_operation +DryRunOperationException,dry_run_operation_exception +DryRunProgressStatus,dry_run_progress_status +DryRunResults,dry_run_results +DryRunStatus,dry_run_status +DualStackDnsName,dual_stack_dns_name +DukptAttributes,dukpt_attributes +DukptDerivationAttributes,dukpt_derivation_attributes +DukptDerivationType,dukpt_derivation_type +DukptEncryptionAttributes,dukpt_encryption_attributes +DukptKeyDerivationType,dukpt_key_derivation_type +DukptKeyVariant,dukpt_key_variant +DuplicateAccessPointNameException,duplicate_access_point_name_exception +DuplicateAccountException,duplicate_account_exception +DuplicateCertificateException,duplicate_certificate_exception +DuplicateDocumentContent,duplicate_document_content +DuplicateDocumentVersionName,duplicate_document_version_name +DuplicateHandshakeException,duplicate_handshake_exception +DuplicateItemException,duplicate_item_exception +DuplicateListenerException,duplicate_listener_exception +DuplicateLoadBalancerNameException,duplicate_load_balancer_name_exception +DuplicateOperationId,duplicate_operation_id +DuplicateOrganizationalUnitException,duplicate_organizational_unit_exception +DuplicatePolicyAttachmentException,duplicate_policy_attachment_exception +DuplicatePolicyException,duplicate_policy_exception +DuplicatePolicyNameException,duplicate_policy_name_exception +DuplicateProviderException,duplicate_provider_exception +DuplicateRecordException,duplicate_record_exception +DuplicateRegistrationAction,duplicate_registration_action +DuplicateReportNameException,duplicate_report_name_exception +DuplicateRequest,duplicate_request +DuplicateRequestException,duplicate_request_exception +DuplicateResourceException,duplicate_resource_exception +DuplicateSSHPublicKeyException,duplicate_ssh_public_key_exception +DuplicateTagKeysException,duplicate_tag_keys_exception +DuplicateTargetGroupNameException,duplicate_target_group_name_exception +DuplicateTimestamps,duplicate_timestamps +DuplicateUserNameFault,duplicate_user_name_fault +DuplicatedAuditEventId,duplicated_audit_event_id +DuplicatedStopRequestException,duplicated_stop_request_exception +Duration,duration +DurationFrames,duration_frames +DurationHistogram,duration_histogram +DurationInMinutes,duration_in_minutes +DurationInMs,duration_in_ms +DurationInSeconds,duration_in_seconds +DurationInYears,duration_in_years +DurationMillis,duration_millis +DurationMinutes,duration_minutes +DurationMode,duration_mode +DurationRange,duration_range +DurationSMPTE,duration_smpte +DurationSeconds,duration_seconds +DurationSinceLastAccess,duration_since_last_access +DurationUnits,duration_units +DvbNitSettings,dvb_nit_settings +DvbSdtSettings,dvb_sdt_settings +DvbSubDestinationSettings,dvb_sub_destination_settings +DvbSubPids,dvb_sub_pids +DvbSubSourceSettings,dvb_sub_source_settings +DvbTdtSettings,dvb_tdt_settings +DvbTeletextPid,dvb_teletext_pid +DynamicCardVerificationCode,dynamic_card_verification_code +DynamicCardVerificationValue,dynamic_card_verification_value +DynamicConfiguration,dynamic_configuration +DynamicDefaultValue,dynamic_default_value +DynamicPartitioningConfiguration,dynamic_partitioning_configuration +DynamicRangeCompressionLine,dynamic_range_compression_line +DynamicRangeCompressionProfile,dynamic_range_compression_profile +DynamicRangeCompressionRf,dynamic_range_compression_rf +DynamicRangeControl,dynamic_range_control +DynamicRouting,dynamic_routing +DynamicScalingConfiguration,dynamic_scaling_configuration +DynamicScalingInSuspended,dynamic_scaling_in_suspended +DynamicScalingOutSuspended,dynamic_scaling_out_suspended +DynamicSubGop,dynamic_sub_gop +DynamicTransform,dynamic_transform +DynamicValue,dynamic_value +DynamicVariable,dynamic_variable +DynamicVariables,dynamic_variables +DynamoDB,dynamo_db +DynamoDBAction,dynamo_db_action +DynamoDBCatalogSource,dynamo_db_catalog_source +DynamoDBStreamParameters,dynamo_db_stream_parameters +DynamoDBTarget,dynamo_db_target +DynamoDBTargets,dynamo_db_targets +DynamoDBv2Action,dynamo_dbv2_action +DynamoDbSettings,dynamo_db_settings +DynamodbDataSourceConfig,dynamodb_data_source_config +Dynatrace,dynatrace +DynatraceConnectorProfileCredentials,dynatrace_connector_profile_credentials +DynatraceConnectorProfileProperties,dynatrace_connector_profile_properties +DynatraceSourceProperties,dynatrace_source_properties +E164PhoneNumber,e164_phone_number +E164PhoneNumbers,e164_phone_numbers +EBSEnabled,ebs_enabled +EBSFilter,ebs_filter +EBSOptions,ebs_options +EBSOptionsStatus,ebs_options_status +EBSResourceUtilization,ebs_resource_utilization +EBSStorageInfo,ebs_storage_info +EBSUtilizationMetric,ebs_utilization_metric +EC2AccessDeniedException,ec2_access_denied_exception +EC2AssociateRouteTableAction,ec2_associate_route_table_action +EC2Capacities,ec2_capacities +EC2Capacity,ec2_capacity +EC2CopyRouteTableAction,ec2_copy_route_table_action +EC2CreateRouteAction,ec2_create_route_action +EC2CreateRouteTableAction,ec2_create_route_table_action +EC2DeleteRouteAction,ec2_delete_route_action +EC2ErrorCode,ec2_error_code +EC2FamilyFilter,ec2_family_filter +EC2InboundPermissions,ec2_inbound_permissions +EC2InstanceCounts,ec2_instance_counts +EC2InstanceDetails,ec2_instance_details +EC2InstanceId,ec2_instance_id +EC2InstanceIdsToTerminate,ec2_instance_ids_to_terminate +EC2InstanceLimit,ec2_instance_limit +EC2InstanceLimits,ec2_instance_limits +EC2InstanceNotFoundException,ec2_instance_not_found_exception +EC2InstanceStateInvalidException,ec2_instance_state_invalid_exception +EC2InstanceType,ec2_instance_type +EC2InstanceTypeInvalidException,ec2_instance_type_invalid_exception +EC2InstanceUnavailableException,ec2_instance_unavailable_exception +EC2ReplaceRouteAction,ec2_replace_route_action +EC2ReplaceRouteTableAssociationAction,ec2_replace_route_table_association_action +EC2ResourceDetails,ec2_resource_details +EC2ResourceUtilization,ec2_resource_utilization +EC2SecurityGroup,ec2_security_group +EC2SecurityGroupId,ec2_security_group_id +EC2SecurityGroupName,ec2_security_group_name +EC2SecurityGroupOwnerId,ec2_security_group_owner_id +EC2SecurityGroups,ec2_security_groups +EC2Specification,ec2_specification +EC2TagFilter,ec2_tag_filter +EC2TagSet,ec2_tag_set +EC2ThrottledException,ec2_throttled_exception +EC2UnexpectedException,ec2_unexpected_exception +ECSService,ecs_service +ECSServiceMappingLimitExceededException,ecs_service_mapping_limit_exceeded_exception +ECSServiceProjectedMetric,ecs_service_projected_metric +ECSServiceProjectedUtilizationMetric,ecs_service_projected_utilization_metric +ECSServiceRecommendation,ecs_service_recommendation +ECSServiceRecommendationFilter,ecs_service_recommendation_filter +ECSServiceRecommendationOption,ecs_service_recommendation_option +ECSServiceRecommendedOptionProjectedMetric,ecs_service_recommended_option_projected_metric +ECSServiceUtilizationMetric,ecs_service_utilization_metric +ECSTarget,ecs_target +ECSTaskSet,ecs_task_set +EDNS0ClientSubnetIP,edns0_client_subnet_ip +EDNS0ClientSubnetMask,edns0_client_subnet_mask +EFSAuthorizationConfig,efs_authorization_config +EFSIOException,efsio_exception +EFSMountConnectivityException,efs_mount_connectivity_exception +EFSMountFailureException,efs_mount_failure_exception +EFSMountTimeoutException,efs_mount_timeout_exception +EFSVolumeConfiguration,efs_volume_configuration +EKSAnywhereVersion,eks_anywhere_version +EKSOnDeviceService,eks_on_device_service +EKSOnDeviceServiceConfiguration,eks_on_device_service_configuration +ELBInfo,elb_info +EMAIL,email +EMR,emr +EMRStepMetadata,emr_step_metadata +ENILimitReachedException,eni_limit_reached_exception +EQ,eq +ESInstanceDetails,es_instance_details +ETag,e_tag +Eac3AtmosSettings,eac3_atmos_settings +Eac3Settings,eac3_settings +EapMethod,eap_method +Earfcn,earfcn +EarliestBacktrackTime,earliest_backtrack_time +EarliestRestorableDateTime,earliest_restorable_date_time +EarliestRestorableTime,earliest_restorable_time +EarliestTime,earliest_time +EarthObservationJobErrorDetails,earth_observation_job_error_details +EarthObservationJobSummaries,earth_observation_job_summaries +East,east +Ebif,ebif +EbpAudioInterval,ebp_audio_interval +EbpLookaheadMs,ebp_lookahead_ms +EbpPlacement,ebp_placement +Ebs,ebs +EbsBlockDevice,ebs_block_device +EbsBlockDeviceConfig,ebs_block_device_config +EbsBlockDeviceConfigs,ebs_block_device_configs +EbsBlockDevices,ebs_block_devices +EbsCause,ebs_cause +EbsConfiguration,ebs_configuration +EbsEncryptionByDefault,ebs_encryption_by_default +EbsEvent,ebs_event +EbsInfo,ebs_info +EbsInstanceBlockDevice,ebs_instance_block_device +EbsInstanceBlockDeviceSpecification,ebs_instance_block_device_specification +EbsOptimized,ebs_optimized +EbsOptimizedAvailable,ebs_optimized_available +EbsOptimizedByDefault,ebs_optimized_by_default +EbsOptimizedInfo,ebs_optimized_info +EbsOptimizedSupport,ebs_optimized_support +EbsReadBytesPerSecond,ebs_read_bytes_per_second +EbsReadOpsPerSecond,ebs_read_ops_per_second +EbsRequestId,ebs_request_id +EbsResult,ebs_result +EbsRootVolumeSize,ebs_root_volume_size +EbsSnapshotConfiguration,ebs_snapshot_configuration +EbsSnapshotPreservation,ebs_snapshot_preservation +EbsStorageInfo,ebs_storage_info +EbsStorageOnly,ebs_storage_only +EbsVolume,ebs_volume +EbsVolumeDetails,ebs_volume_details +EbsVolumeScanDetails,ebs_volume_scan_details +EbsVolumes,ebs_volumes +EbsVolumesResult,ebs_volumes_result +EbsWriteBytesPerSecond,ebs_write_bytes_per_second +EbsWriteOpsPerSecond,ebs_write_ops_per_second +EbuTtDDestinationSettings,ebu_tt_d_destination_settings +Ec2AmiResource,ec2_ami_resource +Ec2AmiResources,ec2_ami_resources +Ec2AvailabilityZone,ec2_availability_zone +Ec2Config,ec2_config +Ec2Configuration,ec2_configuration +Ec2ImageId,ec2_image_id +Ec2ImagePropertiesNotSupportedFault,ec2_image_properties_not_supported_fault +Ec2InstanceAggregation,ec2_instance_aggregation +Ec2InstanceAggregationResponse,ec2_instance_aggregation_response +Ec2InstanceAttributes,ec2_instance_attributes +Ec2InstanceConnectEndpoint,ec2_instance_connect_endpoint +Ec2InstanceId,ec2_instance_id +Ec2InstanceIds,ec2_instance_ids +Ec2InstanceRegion,ec2_instance_region +Ec2KeyName,ec2_key_name +Ec2Metadata,ec2_metadata +Ec2RecommendationsExportPreferences,ec2_recommendations_export_preferences +Ec2RequestFailedException,ec2_request_failed_exception +Ec2SecurityGroupId,ec2_security_group_id +Ec2SecurityGroupName,ec2_security_group_name +Ec2SecurityGroupOwnerId,ec2_security_group_owner_id +Ec2SecurityGroups,ec2_security_groups +Ec2State,ec2_state +Ec2SubnetId,ec2_subnet_id +Ec2SubnetIds,ec2_subnet_ids +Ec2VolumeId,ec2_volume_id +EchoReduction,echo_reduction +EcmPid,ecm_pid +EcrConfiguration,ecr_configuration +EcrConfigurationState,ecr_configuration_state +EcrContainerImageMetadata,ecr_container_image_metadata +EcrRepositoryConfiguration,ecr_repository_configuration +EcrRepositoryMetadata,ecr_repository_metadata +EcrRescanDurationState,ecr_rescan_duration_state +EcsCluster,ecs_cluster +EcsClusterArn,ecs_cluster_arn +EcsClusterArns,ecs_cluster_arns +EcsClusterDetails,ecs_cluster_details +EcsClusterName,ecs_cluster_name +EcsClusters,ecs_clusters +EcsContainerInstanceArn,ecs_container_instance_arn +EcsContainerOverride,ecs_container_override +EcsEnvironmentFile,ecs_environment_file +EcsEnvironmentVariable,ecs_environment_variable +EcsEphemeralStorage,ecs_ephemeral_storage +EcsInferenceAcceleratorOverride,ecs_inference_accelerator_override +EcsParameters,ecs_parameters +EcsResourceRequirement,ecs_resource_requirement +EcsTaskDetails,ecs_task_details +EcsTaskOverride,ecs_task_override +EcsTaskParameters,ecs_task_parameters +Edge,edge +EdgeAgentStatus,edge_agent_status +EdgeConfig,edge_config +EdgeConfigs,edge_configs +EdgeDeployment,edge_deployment +EdgeDeploymentConfig,edge_deployment_config +EdgeDeploymentFailed,edge_deployment_failed +EdgeDeploymentFailedInStage,edge_deployment_failed_in_stage +EdgeDeploymentModelConfig,edge_deployment_model_config +EdgeDeploymentPending,edge_deployment_pending +EdgeDeploymentPendingInStage,edge_deployment_pending_in_stage +EdgeDeploymentPlanArn,edge_deployment_plan_arn +EdgeDeploymentPlanName,edge_deployment_plan_name +EdgeDeploymentPlanSummaries,edge_deployment_plan_summaries +EdgeDeploymentPlanSummary,edge_deployment_plan_summary +EdgeDeploymentStageStartTime,edge_deployment_stage_start_time +EdgeDeploymentStatus,edge_deployment_status +EdgeDeploymentStatusMessage,edge_deployment_status_message +EdgeDeploymentSuccess,edge_deployment_success +EdgeDeploymentSuccessInStage,edge_deployment_success_in_stage +EdgeLocation,edge_location +EdgeLocations,edge_locations +EdgeMetric,edge_metric +EdgeModel,edge_model +EdgeModelStat,edge_model_stat +EdgeModelSummary,edge_model_summary +EdgeOutputConfig,edge_output_config +EdgePackagingJobArn,edge_packaging_job_arn +EdgePackagingJobName,edge_packaging_job_name +EdgePackagingJobStatus,edge_packaging_job_status +EdgePackagingJobStatusMessage,edge_packaging_job_status_message +EdgePackagingJobSummaries,edge_packaging_job_summaries +EdgePackagingJobSummary,edge_packaging_job_summary +EdgePresetDeploymentOutput,edge_preset_deployment_output +EdgeRetentionInHours,edge_retention_in_hours +EdgeStatistics,edge_statistics +EdgeStructure,edge_structure +EdgeSummaryStatistics,edge_summary_statistics +EdgeType,edge_type +Edges,edges +EdiPartyName,edi_party_name +Edition,edition +EditorId,editor_id +EfaInfo,efa_info +EfaSupported,efa_supported +Effect,effect +EffectiveDate,effective_date +EffectiveDeployment,effective_deployment +EffectiveDeploymentStatusDetails,effective_deployment_status_details +EffectiveEnd,effective_end +EffectiveEngineVersion,effective_engine_version +EffectiveOn,effective_on +EffectivePatch,effective_patch +EffectivePatches,effective_patches +EffectivePermission,effective_permission +EffectivePolicy,effective_policy +EffectivePolicyNotFoundException,effective_policy_not_found_exception +EffectiveRecommendationPreferences,effective_recommendation_preferences +EffectiveStart,effective_start +EfsFileLocation,efs_file_location +EfsFileSystemConfiguration,efs_file_system_configuration +EfsFilesystemArn,efs_filesystem_arn +EfsStorageConfiguration,efs_storage_configuration +EfsVolumeConfiguration,efs_volume_configuration +Egress,egress +EgressAccessLogs,egress_access_logs +EgressBytes,egress_bytes +EgressCidrBlocks,egress_cidr_blocks +EgressConfiguration,egress_configuration +EgressDomain,egress_domain +EgressEndpoint,egress_endpoint +EgressEndpoints,egress_endpoints +EgressFilter,egress_filter +EgressFilterRules,egress_filter_rules +EgressGatewayBridge,egress_gateway_bridge +EgressIp,egress_ip +EgressOnlyInternetGateway,egress_only_internet_gateway +EgressOnlyInternetGatewayId,egress_only_internet_gateway_id +EgressOnlyInternetGatewayIds,egress_only_internet_gateway_ids +EgressOnlyInternetGateways,egress_only_internet_gateways +EgressPackets,egress_packets +EgressType,egress_type +Eirp,eirp +EksAttemptContainerDetail,eks_attempt_container_detail +EksAttemptDetail,eks_attempt_detail +EksClusterDetails,eks_cluster_details +EksConfiguration,eks_configuration +EksContainer,eks_container +EksContainerDetail,eks_container_detail +EksContainerEnvironmentVariable,eks_container_environment_variable +EksContainerOverride,eks_container_override +EksContainerResourceRequirements,eks_container_resource_requirements +EksContainerSecurityContext,eks_container_security_context +EksContainerVolumeMount,eks_container_volume_mount +EksEmptyDir,eks_empty_dir +EksHostPath,eks_host_path +EksInfo,eks_info +EksMetadata,eks_metadata +EksPodProperties,eks_pod_properties +EksPodPropertiesDetail,eks_pod_properties_detail +EksPodPropertiesOverride,eks_pod_properties_override +EksProperties,eks_properties +EksPropertiesDetail,eks_properties_detail +EksPropertiesOverride,eks_properties_override +EksSecret,eks_secret +EksSource,eks_source +EksSourceClusterNamespace,eks_source_cluster_namespace +EksVolume,eks_volume +ElapsedTimeInActiveSeconds,elapsed_time_in_active_seconds +ElapsedTimeInSeconds,elapsed_time_in_seconds +ElapsedTimeMillis,elapsed_time_millis +ElastiCacheInstanceDetails,elasti_cache_instance_details +ElasticBeanstalkServiceException,elastic_beanstalk_service_exception +ElasticChannelConfiguration,elastic_channel_configuration +ElasticGpuAssociation,elastic_gpu_association +ElasticGpuAssociationId,elastic_gpu_association_id +ElasticGpuAssociationState,elastic_gpu_association_state +ElasticGpuAssociationTime,elastic_gpu_association_time +ElasticGpuAssociations,elastic_gpu_associations +ElasticGpuHealth,elastic_gpu_health +ElasticGpuId,elastic_gpu_id +ElasticGpuIds,elastic_gpu_ids +ElasticGpuSet,elastic_gpu_set +ElasticGpuSpecification,elastic_gpu_specification +ElasticGpuSpecificationResponse,elastic_gpu_specification_response +ElasticGpuSpecificationSet,elastic_gpu_specification_set +ElasticGpuSpecifications,elastic_gpu_specifications +ElasticGpuState,elastic_gpu_state +ElasticGpuType,elastic_gpu_type +ElasticGpus,elastic_gpus +ElasticInferenceAccelerator,elastic_inference_accelerator +ElasticInferenceAcceleratorArn,elastic_inference_accelerator_arn +ElasticInferenceAcceleratorAssociation,elastic_inference_accelerator_association +ElasticInferenceAcceleratorAssociationId,elastic_inference_accelerator_association_id +ElasticInferenceAcceleratorAssociationState,elastic_inference_accelerator_association_state +ElasticInferenceAcceleratorAssociationTime,elastic_inference_accelerator_association_time +ElasticInferenceAcceleratorAssociations,elastic_inference_accelerator_associations +ElasticInferenceAcceleratorHealth,elastic_inference_accelerator_health +ElasticInferenceAcceleratorSet,elastic_inference_accelerator_set +ElasticInferenceAccelerators,elastic_inference_accelerators +ElasticIp,elastic_ip +ElasticIpStatus,elastic_ip_status +ElasticIps,elastic_ips +ElasticLoadBalancer,elastic_load_balancer +ElasticLoadBalancerListener,elastic_load_balancer_listener +ElasticLoadBalancerName,elastic_load_balancer_name +ElasticLoadBalancers,elastic_load_balancers +ElasticResizeNumberOfNodeOptions,elastic_resize_number_of_node_options +ElasticsearchAction,elasticsearch_action +ElasticsearchBufferingHints,elasticsearch_buffering_hints +ElasticsearchClusterConfig,elasticsearch_cluster_config +ElasticsearchClusterConfigStatus,elasticsearch_cluster_config_status +ElasticsearchDataSourceConfig,elasticsearch_data_source_config +ElasticsearchDestinationConfiguration,elasticsearch_destination_configuration +ElasticsearchDestinationDescription,elasticsearch_destination_description +ElasticsearchDestinationUpdate,elasticsearch_destination_update +ElasticsearchDomainConfig,elasticsearch_domain_config +ElasticsearchDomainStatus,elasticsearch_domain_status +ElasticsearchInstanceCount,elasticsearch_instance_count +ElasticsearchInstanceType,elasticsearch_instance_type +ElasticsearchInstanceTypes,elasticsearch_instance_types +ElasticsearchRetryOptions,elasticsearch_retry_options +ElasticsearchSettings,elasticsearch_settings +ElasticsearchVersion,elasticsearch_version +ElasticsearchVersionStatus,elasticsearch_version_status +ElasticsearchVersions,elasticsearch_versions +Element,element +ElementId,element_id +ElementName,element_name +ElementPath,element_path +ElementStatuses,element_statuses +ElementType,element_type +Elements,elements +Elevation,elevation +ElicitSubSlot,elicit_sub_slot +ElicitationCodeHookInvocationSetting,elicitation_code_hook_invocation_setting +EligibleForReplication,eligible_for_replication +Email,email +EmailAddress,email_address +EmailAddressInUseException,email_address_in_use_exception +EmailChannelRequest,email_channel_request +EmailChannelResponse,email_channel_response +EmailConfiguration,email_configuration +EmailConfigurationFailure,email_configuration_failure +EmailConfigurationType,email_configuration_type +EmailContent,email_content +EmailField,email_field +EmailForwardingEnabled,email_forwarding_enabled +EmailIdentities,email_identities +EmailIdentity,email_identity +EmailInsights,email_insights +EmailMessage,email_message +EmailMessageActivity,email_message_activity +EmailMessageByLink,email_message_by_link +EmailRecipients,email_recipients +EmailReference,email_reference +EmailSendingAccount,email_sending_account +EmailSettings,email_settings +EmailStatus,email_status +EmailSubject,email_subject +EmailSubjectByLink,email_subject_by_link +EmailTags,email_tags +EmailTemplate,email_template +EmailTemplateContent,email_template_content +EmailTemplateMetadata,email_template_metadata +EmailTemplateRequest,email_template_request +EmailTemplateResponse,email_template_response +EmailVerificationMessage,email_verification_message +EmailVerificationSubject,email_verification_subject +Emails,emails +EmbedHostDomains,embed_host_domains +EmbedUrl,embed_url +EmbeddedDestinationSettings,embedded_destination_settings +EmbeddedPlusScte20DestinationSettings,embedded_plus_scte20_destination_settings +EmbeddedSourceSettings,embedded_source_settings +EmbeddedTimecodeOverride,embedded_timecode_override +EmergencyCallingConfiguration,emergency_calling_configuration +EmergencyContact,emergency_contact +EmergencyContactList,emergency_contact_list +EmergencyPhoneNumber,emergency_phone_number +EmitConsumerLagMetrics,emit_consumer_lag_metrics +EmitInterval,emit_interval +Emotion,emotion +Emotions,emotions +EmptyAsNull,empty_as_null +EmptyBatchRequestException,empty_batch_request_exception +EmptyFillColor,empty_fill_color +EmptyUploadException,empty_upload_exception +EmptyVisual,empty_visual +EmrManagedMasterSecurityGroup,emr_managed_master_security_group +EmrManagedSlaveSecurityGroup,emr_managed_slave_security_group +EnaSrdEnabled,ena_srd_enabled +EnaSrdSpecification,ena_srd_specification +EnaSrdSupported,ena_srd_supported +EnaSrdUdpEnabled,ena_srd_udp_enabled +EnaSrdUdpSpecification,ena_srd_udp_specification +EnaSupport,ena_support +Enable,enable +EnableAWSServiceAccessRequest,enable_aws_service_access_request +EnableAcceleration,enable_acceleration +EnableAcceptEncodingBrotli,enable_accept_encoding_brotli +EnableAcceptEncodingGzip,enable_accept_encoding_gzip +EnableActionConfiguration,enable_action_configuration +EnableAddOnRequest,enable_add_on_request +EnableAddOnResult,enable_add_on_result +EnableAdditionalMetadata,enable_additional_metadata +EnableAddressTransferRequest,enable_address_transfer_request +EnableAddressTransferResult,enable_address_transfer_result +EnableAlarmActionRequest,enable_alarm_action_request +EnableAlarmActionsInput,enable_alarm_actions_input +EnableAllFeaturesResponse,enable_all_features_response +EnableAllOpsDataSources,enable_all_ops_data_sources +EnableAnswerMachineDetection,enable_answer_machine_detection +EnableApplicationLayerAutomaticResponseRequest,enable_application_layer_automatic_response_request +EnableAutoHealing,enable_auto_healing +EnableAwsNetworkPerformanceMetricSubscriptionRequest,enable_aws_network_performance_metric_subscription_request +EnableAwsNetworkPerformanceMetricSubscriptionResult,enable_aws_network_performance_metric_subscription_result +EnableCapture,enable_capture +EnableCaseSensitiveIdentifier,enable_case_sensitive_identifier +EnableChannelIdentification,enable_channel_identification +EnableClientAuthenticationRequest,enable_client_authentication_request +EnableCloudwatchLogsExports,enable_cloudwatch_logs_exports +EnableContinuousBackup,enable_continuous_backup +EnableControlInput,enable_control_input +EnableControlOutput,enable_control_output +EnableCrossAccountsDiscovery,enable_cross_accounts_discovery +EnableCustomerOwnedIp,enable_customer_owned_ip +EnableDate,enable_date +EnableDebugLogDelivery,enable_debug_log_delivery +EnableDefaultInternetAccess,enable_default_internet_access +EnableDefaultStandards,enable_default_standards +EnableDelegatedAdminAccountRequest,enable_delegated_admin_account_request +EnableDelegatedAdminAccountResponse,enable_delegated_admin_account_response +EnableDialOut,enable_dial_out +EnableDictionaryCompression,enable_dictionary_compression +EnableDirectoryRequest,enable_directory_request +EnableDirectoryResponse,enable_directory_response +EnableDns64,enable_dns64 +EnableDnsHostnames,enable_dns_hostnames +EnableDnsSupport,enable_dns_support +EnableDomainAutoRenewRequest,enable_domain_auto_renew_request +EnableDomainTransferLockRequest,enable_domain_transfer_lock_request +EnableDomainTransferLockResponse,enable_domain_transfer_lock_response +EnableDynamicFieldUpdate,enable_dynamic_field_update +EnableECSManagedTags,enable_ecs_managed_tags +EnableEbsEncryptionByDefaultRequest,enable_ebs_encryption_by_default_request +EnableEbsEncryptionByDefaultResult,enable_ebs_encryption_by_default_result +EnableEcsManagedTags,enable_ecs_managed_tags +EnableEnhancedMonitoringInput,enable_enhanced_monitoring_input +EnableExecuteCommand,enable_execute_command +EnableExplanations,enable_explanations +EnableFastLaunchRequest,enable_fast_launch_request +EnableFastLaunchResult,enable_fast_launch_result +EnableFastSnapshotRestoreErrorItem,enable_fast_snapshot_restore_error_item +EnableFastSnapshotRestoreStateError,enable_fast_snapshot_restore_state_error +EnableFastSnapshotRestoreStateErrorItem,enable_fast_snapshot_restore_state_error_item +EnableFastSnapshotRestoreSuccessItem,enable_fast_snapshot_restore_success_item +EnableFastSnapshotRestoresRequest,enable_fast_snapshot_restores_request +EnableFastSnapshotRestoresResult,enable_fast_snapshot_restores_result +EnableGlobalWriteForwarding,enable_global_write_forwarding +EnableHomogenousTablespace,enable_homogenous_tablespace +EnableHostedZoneDNSSECRequest,enable_hosted_zone_dnssec_request +EnableHostedZoneDNSSECResponse,enable_hosted_zone_dnssec_response +EnableHttpEndpoint,enable_http_endpoint +EnableHybrid,enable_hybrid +EnableIAMDatabaseAuthentication,enable_iam_database_authentication +EnableImageBlockPublicAccessRequest,enable_image_block_public_access_request +EnableImageBlockPublicAccessResult,enable_image_block_public_access_result +EnableImageDeprecationRequest,enable_image_deprecation_request +EnableImageDeprecationResult,enable_image_deprecation_result +EnableImportFindingsForProductRequest,enable_import_findings_for_product_request +EnableImportFindingsForProductResponse,enable_import_findings_for_product_response +EnableInsightRulesInput,enable_insight_rules_input +EnableInsightRulesOutput,enable_insight_rules_output +EnableIntegration,enable_integration +EnableInterContainerTrafficEncryption,enable_inter_container_traffic_encryption +EnableInternetAccess,enable_internet_access +EnableInteroperability,enable_interoperability +EnableIoTLoggingParams,enable_io_t_logging_params +EnableIotRoleAlias,enable_iot_role_alias +EnableIpamOrganizationAdminAccountRequest,enable_ipam_organization_admin_account_request +EnableIpamOrganizationAdminAccountResult,enable_ipam_organization_admin_account_result +EnableKeyRequest,enable_key_request +EnableKeyReuseOnNtTokenKeysetStorageFull,enable_key_reuse_on_nt_token_keyset_storage_full +EnableKeyRotationRequest,enable_key_rotation_request +EnableLDAPSRequest,enable_ldaps_request +EnableLniAtDeviceIndex,enable_lni_at_device_index +EnableLocalWriteForwarding,enable_local_write_forwarding +EnableLogFileValidation,enable_log_file_validation +EnableLogTypes,enable_log_types +EnableLoggingMessage,enable_logging_message +EnableMFADeviceRequest,enable_mfa_device_request +EnableMachineLearning,enable_machine_learning +EnableMacieRequest,enable_macie_request +EnableMagneticStoreWrites,enable_magnetic_store_writes +EnableMaintenanceMode,enable_maintenance_mode +EnableManagedSpotTraining,enable_managed_spot_training +EnableManifestOutput,enable_manifest_output +EnableMediaMetricLogs,enable_media_metric_logs +EnableMetricsCollectionQuery,enable_metrics_collection_query +EnableMinimumEncryptionConfiguration,enable_minimum_encryption_configuration +EnableNetworkAddressUsageMetrics,enable_network_address_usage_metrics +EnableNetworkIsolation,enable_network_isolation +EnableNonSecurity,enable_non_security +EnableOnlineStore,enable_online_store +EnableOrganizationAdminAccountRequest,enable_organization_admin_account_request +EnablePadding,enable_padding +EnablePartialResultsStabilization,enable_partial_results_stabilization +EnablePerformanceInsights,enable_performance_insights +EnablePolicyTypeRequest,enable_policy_type_request +EnablePolicyTypeResponse,enable_policy_type_response +EnablePrimaryIpv6,enable_primary_ipv6 +EnablePropagateAdditionalUserContextData,enable_propagate_additional_user_context_data +EnableRadiusRequest,enable_radius_request +EnableReachabilityAnalyzerOrganizationSharingRequest,enable_reachability_analyzer_organization_sharing_request +EnableReachabilityAnalyzerOrganizationSharingResult,enable_reachability_analyzer_organization_sharing_result +EnableRegexInPath,enable_regex_in_path +EnableRegionRequest,enable_region_request +EnableRequest,enable_request +EnableResourceNameDnsAAAARecord,enable_resource_name_dns_aaaa_record +EnableResourceNameDnsAAAARecordOnLaunch,enable_resource_name_dns_aaaa_record_on_launch +EnableResourceNameDnsARecord,enable_resource_name_dns_a_record +EnableResourceNameDnsARecordOnLaunch,enable_resource_name_dns_a_record_on_launch +EnableResponse,enable_response +EnableRuleRequest,enable_rule_request +EnableSIPLogs,enable_sip_logs +EnableSNI,enable_sni +EnableSSMAccess,enable_ssm_access +EnableSageMakerMetricsTimeSeries,enable_sage_maker_metrics_time_series +EnableSamplePath,enable_sample_path +EnableSecurityHubRequest,enable_security_hub_request +EnableSelfService,enable_self_service +EnableSerialConsoleAccessRequest,enable_serial_console_access_request +EnableSerialConsoleAccessResult,enable_serial_console_access_result +EnableSharingWithAwsOrganizationResponse,enable_sharing_with_aws_organization_response +EnableSimpleResponses,enable_simple_responses +EnableSipMediaApplicationMessageLogs,enable_sip_media_application_message_logs +EnableSnapshotCopyMessage,enable_snapshot_copy_message +EnableSnapshotCopyResult,enable_snapshot_copy_result +EnableSoftwareTokenMFAException,enable_software_token_mfa_exception +EnableSsl,enable_ssl +EnableSsoRequest,enable_sso_request +EnableStageTransitionInput,enable_stage_transition_input +EnableStatistics,enable_statistics +EnableTerminationProtection,enable_termination_protection +EnableTokenRevocation,enable_token_revocation +EnableTopicRuleRequest,enable_topic_rule_request +EnableTransitGatewayRouteTablePropagationRequest,enable_transit_gateway_route_table_propagation_request +EnableTransitGatewayRouteTablePropagationResult,enable_transit_gateway_route_table_propagation_result +EnableTunnelLifecycleControl,enable_tunnel_lifecycle_control +EnableUpdateCatalog,enable_update_catalog +EnableUserRequest,enable_user_request +EnableUserResponse,enable_user_response +EnableVgwRoutePropagationRequest,enable_vgw_route_propagation_request +EnableVisualization,enable_visualization +EnableVolumeIORequest,enable_volume_io_request +EnableVpcClassicLinkDnsSupportRequest,enable_vpc_classic_link_dns_support_request +EnableVpcClassicLinkDnsSupportResult,enable_vpc_classic_link_dns_support_result +EnableVpcClassicLinkRequest,enable_vpc_classic_link_request +EnableVpcClassicLinkResult,enable_vpc_classic_link_result +EnableWWWSubdomain,enable_www_subdomain +EnableWorkDocs,enable_work_docs +EnableXRay,enable_x_ray +Enabled,enabled +EnabledByDefault,enabled_by_default +EnabledByMotion,enabled_by_motion +EnabledCloudWatchLogsExports,enabled_cloud_watch_logs_exports +EnabledCloudwatchLogsExports,enabled_cloudwatch_logs_exports +EnabledControlSummary,enabled_control_summary +EnabledDate,enabled_date +EnabledInBroker,enabled_in_broker +EnabledMetric,enabled_metric +EnabledMetrics,enabled_metrics +EnabledProtocols,enabled_protocols +EnabledServicePrincipal,enabled_service_principal +EnabledServicePrincipals,enabled_service_principals +EnabledTime,enabled_time +EnablementType,enablement_type +EnablingTime,enabling_time +EncipherOnly,encipher_only +EnclaveOptions,enclave_options +EnclaveOptionsRequest,enclave_options_request +EncodedData,encoded_data +EncodedKey,encoded_key +EncodedMessage,encoded_message +EncoderProfile,encoder_profile +EncoderSettings,encoder_settings +Encoding,encoding +EncodingName,encoding_name +EncodingParameters,encoding_parameters +EncodingParametersRequest,encoding_parameters_request +EncodingType,encoding_type +Encrypt,encrypt +EncryptDataInput,encrypt_data_input +EncryptDataOutput,encrypt_data_output +EncryptRequest,encrypt_request +EncryptResponse,encrypt_response +Encrypted,encrypted +EncryptedDecryptionKey,encrypted_decryption_key +EncryptedKeyMaterial,encrypted_key_material +EncryptedPinBlock,encrypted_pin_block +EncryptedWithHSM,encrypted_with_hsm +Encryption,encryption +EncryptionAlgorithm,encryption_algorithm +EncryptionAlgorithmOptions,encryption_algorithm_options +EncryptionAlgorithms,encryption_algorithms +EncryptionAtRest,encryption_at_rest +EncryptionAtRestOptions,encryption_at_rest_options +EncryptionAtRestOptionsStatus,encryption_at_rest_options_status +EncryptionAttributes,encryption_attributes +EncryptionConfig,encryption_config +EncryptionConfiguration,encryption_configuration +EncryptionContext,encryption_context +EncryptionContextEquals,encryption_context_equals +EncryptionContextSubset,encryption_context_subset +EncryptionContractConfiguration,encryption_contract_configuration +EncryptionDescription,encryption_description +EncryptionDisabled,encryption_disabled +EncryptionEnabled,encryption_enabled +EncryptionEntities,encryption_entities +EncryptionEntity,encryption_entity +EncryptionFailure,encryption_failure +EncryptionInTransit,encryption_in_transit +EncryptionInTransitSupported,encryption_in_transit_supported +EncryptionInfo,encryption_info +EncryptionIntegrityChecksFailedException,encryption_integrity_checks_failed_exception +EncryptionKey,encryption_key +EncryptionKeyAccessDeniedException,encryption_key_access_denied_exception +EncryptionKeyArn,encryption_key_arn +EncryptionKeyCheckValue,encryption_key_check_value +EncryptionKeyDisabledException,encryption_key_disabled_exception +EncryptionKeyIdentifier,encryption_key_identifier +EncryptionKeyNotFoundException,encryption_key_not_found_exception +EncryptionKeyUnavailableException,encryption_key_unavailable_exception +EncryptionKmsKeyId,encryption_kms_key_id +EncryptionMethod,encryption_method +EncryptionMode,encryption_mode +EncryptionOption,encryption_option +EncryptionOptions,encryption_options +EncryptionPolicyCount,encryption_policy_count +EncryptionSetting,encryption_setting +EncryptionSpecification,encryption_specification +EncryptionStatus,encryption_status +EncryptionSupport,encryption_support +EncryptionType,encryption_type +End,end +EndBillingPeriod,end_billing_period +EndDate,end_date +EndDateTime,end_date_time +EndDateType,end_date_type +EndEventTime,end_event_time +EndFrameNumber,end_frame_number +EndHour,end_hour +EndHourOfDay,end_hour_of_day +EndLine,end_line +EndMarker,end_marker +EndMinuteOfHour,end_minute_of_hour +EndMode,end_mode +EndOfMeetingReminder,end_of_meeting_reminder +EndOffset,end_offset +EndOffsetChar,end_offset_char +EndOffsetMillis,end_offset_millis +EndPercentage,end_percentage +EndPoint,end_point +EndPoints,end_points +EndPosition,end_position +EndSession,end_session +EndSessionResult,end_session_result +EndTime,end_time +EndTimeExclusive,end_time_exclusive +EndTimeOffset,end_time_offset +EndTimeRange,end_time_range +EndTimecode,end_timecode +EndTimecodeSMPTE,end_timecode_smpte +EndTimestamp,end_timestamp +EndTimestampMillis,end_timestamp_millis +EndUrl,end_url +EndUserLicenseAgreement,end_user_license_agreement +EndUserOptedOut,end_user_opted_out +EndValue,end_value +EndWeekDay,end_week_day +EndedAt,ended_at +EndedTimestamp,ended_timestamp +EndingHashKey,ending_hash_key +EndingOffsets,ending_offsets +EndingSequenceNumber,ending_sequence_number +Endpoint,endpoint +EndpointAccess,endpoint_access +EndpointAccessList,endpoint_access_list +EndpointAlreadyExistsException,endpoint_already_exists_exception +EndpointAlreadyExistsFault,endpoint_already_exists_fault +EndpointArn,endpoint_arn +EndpointAttributes,endpoint_attributes +EndpointAuthorization,endpoint_authorization +EndpointAuthorizationAlreadyExistsFault,endpoint_authorization_already_exists_fault +EndpointAuthorizationList,endpoint_authorization_list +EndpointAuthorizationNotFoundFault,endpoint_authorization_not_found_fault +EndpointAuthorizationsPerClusterLimitExceededFault,endpoint_authorizations_per_cluster_limit_exceeded_fault +EndpointBatchItem,endpoint_batch_item +EndpointBatchRequest,endpoint_batch_request +EndpointConfigArn,endpoint_config_arn +EndpointConfigName,endpoint_config_name +EndpointConfigSummary,endpoint_config_summary +EndpointConfigs,endpoint_configs +EndpointConfiguration,endpoint_configuration +EndpointConfigurations,endpoint_configurations +EndpointCount,endpoint_count +EndpointCreateTime,endpoint_create_time +EndpointDemographic,endpoint_demographic +EndpointDescription,endpoint_description +EndpointDescriptions,endpoint_descriptions +EndpointDetails,endpoint_details +EndpointDisabledException,endpoint_disabled_exception +EndpointDomain,endpoint_domain +EndpointDomainPrefix,endpoint_domain_prefix +EndpointEventBus,endpoint_event_bus +EndpointFilter,endpoint_filter +EndpointGroup,endpoint_group +EndpointGroupAlreadyExistsException,endpoint_group_already_exists_exception +EndpointGroupArn,endpoint_group_arn +EndpointGroupNotFoundException,endpoint_group_not_found_exception +EndpointGroupRegion,endpoint_group_region +EndpointGroups,endpoint_groups +EndpointId,endpoint_id +EndpointIdentifier,endpoint_identifier +EndpointIdentifiers,endpoint_identifiers +EndpointIds,endpoint_ids +EndpointInfo,endpoint_info +EndpointInput,endpoint_input +EndpointInputConfiguration,endpoint_input_configuration +EndpointIpAddress,endpoint_ip_address +EndpointIpAddressRange,endpoint_ip_address_range +EndpointItemResponse,endpoint_item_response +EndpointLocation,endpoint_location +EndpointMessageResult,endpoint_message_result +EndpointMetadata,endpoint_metadata +EndpointMetrics,endpoint_metrics +EndpointName,endpoint_name +EndpointNetworkConfiguration,endpoint_network_configuration +EndpointNotFoundException,endpoint_not_found_exception +EndpointNotFoundFault,endpoint_not_found_fault +EndpointOutputConfiguration,endpoint_output_configuration +EndpointPerformance,endpoint_performance +EndpointPerformances,endpoint_performances +EndpointPort,endpoint_port +EndpointProperties,endpoint_properties +EndpointPropertiesList,endpoint_properties_list +EndpointPublicAccess,endpoint_public_access +EndpointReentryCap,endpoint_reentry_cap +EndpointReentryInterval,endpoint_reentry_interval +EndpointRequest,endpoint_request +EndpointResponse,endpoint_response +EndpointResult,endpoint_result +EndpointSendConfiguration,endpoint_send_configuration +EndpointSetting,endpoint_setting +EndpointSettings,endpoint_settings +EndpointState,endpoint_state +EndpointStatus,endpoint_status +EndpointSummary,endpoint_summary +EndpointTemporarilyUnavailableException,endpoint_temporarily_unavailable_exception +EndpointType,endpoint_type +EndpointTypes,endpoint_types +EndpointURL,endpoint_url +EndpointUri,endpoint_uri +EndpointUrl,endpoint_url +EndpointUser,endpoint_user +Endpoints,endpoints +EndpointsPerAuthorizationLimitExceededFault,endpoints_per_authorization_limit_exceeded_fault +EndpointsPerClusterLimitExceededFault,endpoints_per_cluster_limit_exceeded_fault +EndpointsResponse,endpoints_response +EndsWith,ends_with +EnforceConsumerDeletion,enforce_consumer_deletion +EnforceHTTPS,enforce_https +EnforceProvidedLabels,enforce_provided_labels +EnforceSecurityGroupInboundRulesOnPrivateLinkTraffic,enforce_security_group_inbound_rules_on_private_link_traffic +EnforceWorkGroupConfiguration,enforce_work_group_configuration +Enforced,enforced +EnforcedLimit,enforced_limit +EnforcementInRecord,enforcement_in_record +EnforcementStatus,enforcement_status +Engagement,engagement +EngagementArn,engagement_arn +EngagementId,engagement_id +EngagementMetrics,engagement_metrics +Engagements,engagements +Engine,engine +EngineArn,engine_arn +EngineAttribute,engine_attribute +EngineAttributes,engine_attributes +EngineConfiguration,engine_configuration +EngineDefaults,engine_defaults +EngineDisplayName,engine_display_name +EngineEdition,engine_edition +EngineExecutionTimeInMillis,engine_execution_time_in_millis +EngineFamily,engine_family +EngineFullVersion,engine_full_version +EngineMode,engine_mode +EngineModel,engine_model +EngineName,engine_name +EngineNativeAuditFieldsIncluded,engine_native_audit_fields_included +EngineNotSupportedException,engine_not_supported_exception +EnginePatchVersion,engine_patch_version +EngineSecurityGroupId,engine_security_group_id +EngineTranscribeMedicalSettings,engine_transcribe_medical_settings +EngineTranscribeSettings,engine_transcribe_settings +EngineType,engine_type +EngineVersion,engine_version +EngineVersionInfo,engine_version_info +EngineVersions,engine_versions +EngineVersionsSummary,engine_versions_summary +EngineWorkflowResourceIdentifier,engine_workflow_resource_identifier +EnhancedImageScanFinding,enhanced_image_scan_finding +EnhancedMetrics,enhanced_metrics +EnhancedMonitoring,enhanced_monitoring +EnhancedMonitoringOutput,enhanced_monitoring_output +EnhancedMonitoringResourceArn,enhanced_monitoring_resource_arn +EnhancedVpcRouting,enhanced_vpc_routing +EniId,eni_id +EniIp,eni_ip +EniPrivateIpAddress,eni_private_ip_address +EnqueueTimestamp,enqueue_timestamp +Enrichment,enrichment +EnrichmentParameters,enrichment_parameters +Enroll,enroll +EnrollmentConfig,enrollment_config +EnrollmentFilter,enrollment_filter +EnrollmentFlags,enrollment_flags +EnrollmentFlagsV2,enrollment_flags_v2 +EnrollmentFlagsV3,enrollment_flags_v3 +EnrollmentFlagsV4,enrollment_flags_v4 +EnrollmentId,enrollment_id +EnrollmentJobFraudDetectionConfig,enrollment_job_fraud_detection_config +EnrollmentStatus,enrollment_status +EnsureNoBackupInProcess,ensure_no_backup_in_process +EnterStandbyAnswer,enter_standby_answer +EnterStandbyQuery,enter_standby_query +EnterpriseId,enterprise_id +Entities,entities +EntitiesDetectionJobFilter,entities_detection_job_filter +EntitiesDetectionJobProperties,entities_detection_job_properties +EntitiesDetectionJobPropertiesList,entities_detection_job_properties_list +EntitledApplication,entitled_application +EntitledApplications,entitled_applications +Entitlement,entitlement +EntitlementAlreadyExistsException,entitlement_already_exists_exception +EntitlementArn,entitlement_arn +EntitlementAttribute,entitlement_attribute +EntitlementData,entitlement_data +EntitlementName,entitlement_name +EntitlementNotAllowedException,entitlement_not_allowed_exception +EntitlementNotFoundException,entitlement_not_found_exception +EntitlementStatus,entitlement_status +EntitlementUsage,entitlement_usage +EntitlementUsages,entitlement_usages +EntitlementValue,entitlement_value +Entitlements,entitlements +EntitlementsAllowed,entitlements_allowed +Entity,entity +EntityAccountFilter,entity_account_filter +EntityAggregate,entity_aggregate +EntityAlreadyExistsException,entity_already_exists_exception +EntityAlreadyRegisteredException,entity_already_registered_exception +EntityArn,entity_arn +EntityConfiguration,entity_configuration +EntityDescription,entity_description +EntityDetails,entity_details +EntityDetailsList,entity_details_list +EntityDetectorConfiguration,entity_detector_configuration +EntityDisplayData,entity_display_data +EntityDoesNotExistException,entity_does_not_exist_exception +EntityFilter,entity_filter +EntityId,entity_id +EntityIdList,entity_id_list +EntityIdentifier,entity_identifier +EntityIds,entity_ids +EntityInfo,entity_info +EntityItem,entity_item +EntityLabel,entity_label +EntityList,entity_list +EntityName,entity_name +EntityNotExistsException,entity_not_exists_exception +EntityNotFoundException,entity_not_found_exception +EntityPath,entity_path +EntityPersonaConfiguration,entity_persona_configuration +EntityPropertyReference,entity_property_reference +EntityRecognitionConfig,entity_recognition_config +EntityRecognizerAnnotations,entity_recognizer_annotations +EntityRecognizerArn,entity_recognizer_arn +EntityRecognizerDocuments,entity_recognizer_documents +EntityRecognizerEntityList,entity_recognizer_entity_list +EntityRecognizerEvaluationMetrics,entity_recognizer_evaluation_metrics +EntityRecognizerFilter,entity_recognizer_filter +EntityRecognizerInputDataConfig,entity_recognizer_input_data_config +EntityRecognizerMetadata,entity_recognizer_metadata +EntityRecognizerMetadataEntityTypesListItem,entity_recognizer_metadata_entity_types_list_item +EntityRecognizerOutputDataConfig,entity_recognizer_output_data_config +EntityRecognizerProperties,entity_recognizer_properties +EntityRecognizerPropertiesList,entity_recognizer_properties_list +EntityRecognizerSummariesList,entity_recognizer_summaries_list +EntityRecognizerSummary,entity_recognizer_summary +EntitySelectorExpression,entity_selector_expression +EntityStateException,entity_state_exception +EntitySummary,entity_summary +EntitySummaryList,entity_summary_list +EntitySynonyms,entity_synonyms +EntityTags,entity_tags +EntityTemporarilyUnmodifiableException,entity_temporarily_unmodifiable_exception +EntityType,entity_type +EntityTypes,entity_types +EntityTypesEvaluationMetrics,entity_types_evaluation_metrics +EntityTypesListItem,entity_types_list_item +EntityTypesToDetect,entity_types_to_detect +Entries,entries +EntropyEncoding,entropy_encoding +Entry,entry +EntryCount,entry_count +EntryPoint,entry_point +EnumDefinition,enum_definition +EnumValues,enum_values +EnumerationValue,enumeration_value +Environment,environment +EnvironmentAccountConnection,environment_account_connection +EnvironmentAccountConnectionSummary,environment_account_connection_summary +EnvironmentArn,environment_arn +EnvironmentClass,environment_class +EnvironmentDescription,environment_description +EnvironmentDescriptionsMessage,environment_descriptions_message +EnvironmentError,environment_error +EnvironmentFile,environment_file +EnvironmentFiles,environment_files +EnvironmentId,environment_id +EnvironmentIdentifier,environment_identifier +EnvironmentIds,environment_ids +EnvironmentImage,environment_image +EnvironmentInfo,environment_info +EnvironmentInfoDescription,environment_info_description +EnvironmentInformation,environment_information +EnvironmentLanguage,environment_language +EnvironmentLifecycle,environment_lifecycle +EnvironmentLink,environment_link +EnvironmentLinks,environment_links +EnvironmentMember,environment_member +EnvironmentName,environment_name +EnvironmentNames,environment_names +EnvironmentParameter,environment_parameter +EnvironmentParameterRanges,environment_parameter_ranges +EnvironmentParameters,environment_parameters +EnvironmentPlatform,environment_platform +EnvironmentProperties,environment_properties +EnvironmentPropertyDescriptions,environment_property_descriptions +EnvironmentPropertyUpdates,environment_property_updates +EnvironmentQuota,environment_quota +EnvironmentResourceDescription,environment_resource_description +EnvironmentResourceDescriptionsMessage,environment_resource_descriptions_message +EnvironmentResources,environment_resources +EnvironmentResourcesDescription,environment_resources_description +EnvironmentResponse,environment_response +EnvironmentState,environment_state +EnvironmentSummary,environment_summary +EnvironmentSummaryList,environment_summary_list +EnvironmentTemplate,environment_template +EnvironmentTemplateFilter,environment_template_filter +EnvironmentTemplateSummary,environment_template_summary +EnvironmentTemplateVersion,environment_template_version +EnvironmentTemplateVersionSummary,environment_template_version_summary +EnvironmentTier,environment_tier +EnvironmentVariable,environment_variable +EnvironmentVariables,environment_variables +EnvironmentVpc,environment_vpc +EnvironmentVpcList,environment_vpc_list +Environments,environments +EoCloudCover,eo_cloud_cover +EoCloudCoverInput,eo_cloud_cover_input +EphemeralStorage,ephemeral_storage +EphemerisDescription,ephemeris_description +EphemerisIdResponse,ephemeris_id_response +EphemerisItem,ephemeris_item +EphemerisMetaData,ephemeris_meta_data +EpisodeId,episode_id +Epoch,epoch +EpochLockingSettings,epoch_locking_settings +Epss,epss +EpssDetails,epss_details +EpssScore,epss_score +Eq,eq +Equals,equals +EqualsTo,equals_to +EqualsValue,equals_value +Equation,equation +Equipment,equipment +EquipmentDetection,equipment_detection +EquipmentDetections,equipment_detections +Error,error +ErrorArguments,error_arguments +ErrorAttribute,error_attribute +ErrorCachingMinTTL,error_caching_min_ttl +ErrorCategory,error_category +ErrorCause,error_cause +ErrorClearTimeMsec,error_clear_time_msec +ErrorCode,error_code +ErrorCodeReason,error_code_reason +ErrorCount,error_count +ErrorData,error_data +ErrorDescription,error_description +ErrorDetail,error_detail +ErrorDetailList,error_detail_list +ErrorDetails,error_details +ErrorDocument,error_document +ErrorEntries,error_entries +ErrorHandlingConfig,error_handling_config +ErrorId,error_id +ErrorInfo,error_info +ErrorInformation,error_information +ErrorList,error_list +ErrorMessage,error_message +ErrorMetric,error_metric +ErrorMetrics,error_metrics +ErrorName,error_name +ErrorOutputPrefix,error_output_prefix +ErrorPercentage,error_percentage +ErrorReason,error_reason +ErrorReportConfiguration,error_report_configuration +ErrorReportLocation,error_report_location +ErrorResponse,error_response +ErrorRetryDuration,error_retry_duration +ErrorRootCause,error_root_cause +ErrorRootCauseEntity,error_root_cause_entity +ErrorRootCauseService,error_root_cause_service +ErrorRootCauses,error_root_causes +ErrorStatistics,error_statistics +ErrorString,error_string +ErrorTimestamp,error_timestamp +ErrorTopic,error_topic +ErrorType,error_type +ErrorValue,error_value +ErroredActions,errored_actions +Errors,errors +ErrorsListItem,errors_list_item +EsRateInPes,es_rate_in_pes +Esam,esam +EsamManifestConfirmConditionNotification,esam_manifest_confirm_condition_notification +EsamSettings,esam_settings +EsamSignalProcessingNotification,esam_signal_processing_notification +EscapeChar,escape_char +Escaper,escaper +Esps,esps +Essential,essential +Established,established +EstablishedMultiRegionAccessPointPolicy,established_multi_region_access_point_policy +EstimateByTime,estimate_by_time +EstimateTemplateCostInput,estimate_template_cost_input +EstimateTemplateCostOutput,estimate_template_cost_output +Estimated,estimated +EstimatedAverageCoverage,estimated_average_coverage +EstimatedAverageUtilization,estimated_average_utilization +EstimatedBreakEvenInMonths,estimated_break_even_in_months +EstimatedBytesToTransfer,estimated_bytes_to_transfer +EstimatedCompletionTime,estimated_completion_time +EstimatedCoverage,estimated_coverage +EstimatedDataToScanBytes,estimated_data_to_scan_bytes +EstimatedDiskUtilizationPercent,estimated_disk_utilization_percent +EstimatedEvaluationTimeRemainingInMinutes,estimated_evaluation_time_remaining_in_minutes +EstimatedFilesToDelete,estimated_files_to_delete +EstimatedFilesToTransfer,estimated_files_to_transfer +EstimatedInstanceWarmup,estimated_instance_warmup +EstimatedMonthlyCost,estimated_monthly_cost +EstimatedMonthlyOnDemandCost,estimated_monthly_on_demand_cost +EstimatedMonthlySavings,estimated_monthly_savings +EstimatedMonthlySavingsAmount,estimated_monthly_savings_amount +EstimatedMonthlySavingsPercentage,estimated_monthly_savings_percentage +EstimatedMonthlyStorageCost,estimated_monthly_storage_cost +EstimatedNewCommitmentUtilization,estimated_new_commitment_utilization +EstimatedNumberOfUsers,estimated_number_of_users +EstimatedOnDemandCost,estimated_on_demand_cost +EstimatedOnDemandCostWithCurrentCommitment,estimated_on_demand_cost_with_current_commitment +EstimatedProgress,estimated_progress +EstimatedROI,estimated_roi +EstimatedReservationCostForLookbackPeriod,estimated_reservation_cost_for_lookback_period +EstimatedResourceSize,estimated_resource_size +EstimatedSPCost,estimated_sp_cost +EstimatedSavingsAmount,estimated_savings_amount +EstimatedSavingsPercentage,estimated_savings_percentage +EstimatedSecondsToCompletion,estimated_seconds_to_completion +EstimatedTimeRemainingInMinutes,estimated_time_remaining_in_minutes +EstimatedTimeToCompletionInSeconds,estimated_time_to_completion_in_seconds +EstimatedTotalCost,estimated_total_cost +EstimatedTotalMonthlySavingsAmount,estimated_total_monthly_savings_amount +EstimatedUpdateTime,estimated_update_time +EstimatedWaitTime,estimated_wait_time +Etag,etag +Ethereum,ethereum +Ethernet0,ethernet0 +Ethernet0Status,ethernet0_status +Ethernet1,ethernet1 +Ethernet1Status,ethernet1_status +EthernetPayload,ethernet_payload +EthernetStatus,ethernet_status +EtvPlatformPid,etv_platform_pid +EtvSignalPid,etv_signal_pid +Euid,euid +Eula,eula +EulaAcceptance,eula_acceptance +EutranCid,eutran_cid +EvalActionName,eval_action_name +EvalDecision,eval_decision +EvalDecisionDetails,eval_decision_details +EvalResourceDecision,eval_resource_decision +EvalResourceName,eval_resource_name +EvaluateCodeErrorDetail,evaluate_code_error_detail +EvaluateCodeRequest,evaluate_code_request +EvaluateCodeResponse,evaluate_code_response +EvaluateDataQuality,evaluate_data_quality +EvaluateDataQualityMultiFrame,evaluate_data_quality_multi_frame +EvaluateExpressionInput,evaluate_expression_input +EvaluateExpressionOutput,evaluate_expression_output +EvaluateFeatureRequest,evaluate_feature_request +EvaluateFeatureResponse,evaluate_feature_response +EvaluateLowSampleCountPercentile,evaluate_low_sample_count_percentile +EvaluateMappingTemplateRequest,evaluate_mapping_template_request +EvaluateMappingTemplateResponse,evaluate_mapping_template_response +EvaluateOnExit,evaluate_on_exit +EvaluatePullRequestApprovalRulesInput,evaluate_pull_request_approval_rules_input +EvaluatePullRequestApprovalRulesOutput,evaluate_pull_request_approval_rules_output +EvaluateSessionRequest,evaluate_session_request +EvaluateSessionResponse,evaluate_session_response +EvaluateTargetHealth,evaluate_target_health +EvaluatedExternalModel,evaluated_external_model +EvaluatedMetrics,evaluated_metrics +EvaluatedModelArn,evaluated_model_arn +EvaluatedModelMetrics,evaluated_model_metrics +EvaluatedModelVersion,evaluated_model_version +EvaluatedRule,evaluated_rule +Evaluation,evaluation +EvaluationAnswerInput,evaluation_answer_input +EvaluationAnswerOutput,evaluation_answer_output +EvaluationArn,evaluation_arn +EvaluationContext,evaluation_context +EvaluationContextIdentifier,evaluation_context_identifier +EvaluationDataEndTime,evaluation_data_end_time +EvaluationDataSourceId,evaluation_data_source_id +EvaluationDataStartTime,evaluation_data_start_time +EvaluationEndTimestamp,evaluation_end_timestamp +EvaluationErrorItem,evaluation_error_item +EvaluationForm,evaluation_form +EvaluationFormArn,evaluation_form_arn +EvaluationFormContent,evaluation_form_content +EvaluationFormId,evaluation_form_id +EvaluationFormNumericQuestionOption,evaluation_form_numeric_question_option +EvaluationFormNumericQuestionProperties,evaluation_form_numeric_question_properties +EvaluationFormQuestion,evaluation_form_question +EvaluationFormScoringStrategy,evaluation_form_scoring_strategy +EvaluationFormSection,evaluation_form_section +EvaluationFormSingleSelectQuestionAutomation,evaluation_form_single_select_question_automation +EvaluationFormSingleSelectQuestionOption,evaluation_form_single_select_question_option +EvaluationFormSingleSelectQuestionProperties,evaluation_form_single_select_question_properties +EvaluationFormSummary,evaluation_form_summary +EvaluationFormSummaryList,evaluation_form_summary_list +EvaluationFormTitle,evaluation_form_title +EvaluationFormVersion,evaluation_form_version +EvaluationFormVersionSummary,evaluation_form_version_summary +EvaluationFormVersionSummaryList,evaluation_form_version_summary_list +EvaluationId,evaluation_id +EvaluationLimitExceeded,evaluation_limit_exceeded +EvaluationManifest,evaluation_manifest +EvaluationManifestS3Prefix,evaluation_manifest_s3_prefix +EvaluationMessage,evaluation_message +EvaluationMetadata,evaluation_metadata +EvaluationMetrics,evaluation_metrics +EvaluationMode,evaluation_mode +EvaluationModeConfiguration,evaluation_mode_configuration +EvaluationModes,evaluation_modes +EvaluationName,evaluation_name +EvaluationNote,evaluation_note +EvaluationParameters,evaluation_parameters +EvaluationPeriod,evaluation_period +EvaluationPeriods,evaluation_periods +EvaluationRequest,evaluation_request +EvaluationResult,evaluation_result +EvaluationResultIdentifier,evaluation_result_identifier +EvaluationResultQualifier,evaluation_result_qualifier +EvaluationResults,evaluation_results +EvaluationRule,evaluation_rule +EvaluationScore,evaluation_score +EvaluationStartDate,evaluation_start_date +EvaluationStartTimestamp,evaluation_start_timestamp +EvaluationState,evaluation_state +EvaluationStatus,evaluation_status +EvaluationSummary,evaluation_summary +EvaluationSummaryList,evaluation_summary_list +EvaluationTime,evaluation_time +EvaluationTimeout,evaluation_timeout +EvaluationType,evaluation_type +EvaluationWaitTime,evaluation_wait_time +Evaluations,evaluations +EvaluatorArn,evaluator_arn +Event,event +EventAccountFilter,event_account_filter +EventAction,event_action +EventActionArn,event_action_arn +EventActionEntry,event_action_entry +EventActionId,event_action_id +EventActions,event_actions +EventAggregate,event_aggregate +EventArn,event_arn +EventBatchingCondition,event_batching_condition +EventBridge,event_bridge +EventBridgeAction,event_bridge_action +EventBridgeActionDefinition,event_bridge_action_definition +EventBridgeBus,event_bridge_bus +EventBridgeConfiguration,event_bridge_configuration +EventBridgeDataSourceConfig,event_bridge_data_source_config +EventBridgeDestinationProperties,event_bridge_destination_properties +EventBridgeEnabled,event_bridge_enabled +EventBridgeEventBusParameters,event_bridge_event_bus_parameters +EventBridgeParameters,event_bridge_parameters +EventBridgeRuleName,event_bridge_rule_name +EventBus,event_bus +EventBusArn,event_bus_arn +EventBusName,event_bus_name +EventBuses,event_buses +EventCategories,event_categories +EventCategoriesList,event_categories_list +EventCategoriesMap,event_categories_map +EventCategoriesMapList,event_categories_map_list +EventCategoriesMessage,event_categories_message +EventCategory,event_category +EventCategoryGroup,event_category_group +EventCategoryGroupList,event_category_group_list +EventClass,event_class +EventCode,event_code +EventCondition,event_condition +EventConfigurationItem,event_configuration_item +EventConfigurationsList,event_configurations_list +EventContextData,event_context_data +EventContextDataType,event_context_data_type +EventCount,event_count +EventDataStore,event_data_store +EventDataStoreARNInvalidException,event_data_store_arn_invalid_exception +EventDataStoreAlreadyExistsException,event_data_store_already_exists_exception +EventDataStoreArn,event_data_store_arn +EventDataStoreHasOngoingImportException,event_data_store_has_ongoing_import_exception +EventDataStoreMaxLimitExceededException,event_data_store_max_limit_exceeded_exception +EventDataStoreNotFoundException,event_data_store_not_found_exception +EventDataStoreTerminationProtectedException,event_data_store_termination_protected_exception +EventDataStores,event_data_stores +EventDate,event_date +EventDescription,event_description +EventDescriptionsMessage,event_descriptions_message +EventDestination,event_destination +EventDestinationAlreadyExistsException,event_destination_already_exists_exception +EventDestinationDefinition,event_destination_definition +EventDestinationDoesNotExistException,event_destination_does_not_exist_exception +EventDestinationName,event_destination_name +EventDestinations,event_destinations +EventDetail,event_detail +EventDetails,event_details +EventDetailsErrorItem,event_details_error_item +EventDimensions,event_dimensions +EventDurationInSeconds,event_duration_in_seconds +EventEndTime,event_end_time +EventFeedback,event_feedback +EventFeedbackType,event_feedback_type +EventFilter,event_filter +EventFirstSeen,event_first_seen +EventId,event_id +EventIdMode,event_id_mode +EventIncludedData,event_included_data +EventInfo,event_info +EventInfoMap,event_info_map +EventInformation,event_information +EventIngestionUrl,event_ingestion_url +EventIntegration,event_integration +EventIntegrationArn,event_integration_arn +EventIntegrationAssociation,event_integration_association +EventIntegrationAssociationArn,event_integration_association_arn +EventIntegrationAssociationId,event_integration_association_id +EventIntegrationAssociations,event_integration_associations +EventIntegrationName,event_integration_name +EventIntegrations,event_integrations +EventItemResponse,event_item_response +EventLastReplayedTime,event_last_replayed_time +EventLastSeen,event_last_seen +EventList,event_list +EventLog,event_log +EventLogEntry,event_log_entry +EventName,event_name +EventNotificationItemConfigurations,event_notification_item_configurations +EventObject,event_object +EventOrchestration,event_orchestration +EventParameters,event_parameters +EventPattern,event_pattern +EventPayload,event_payload +EventPredictionSummary,event_prediction_summary +EventQueueArn,event_queue_arn +EventResource,event_resource +EventResourceARN,event_resource_arn +EventResourceName,event_resource_name +EventResourceType,event_resource_type +EventResponse,event_response +EventRisk,event_risk +EventRiskType,event_risk_type +EventSelector,event_selector +EventSelectors,event_selectors +EventSource,event_source +EventSourceArn,event_source_arn +EventSourceId,event_source_id +EventSourceMappingConfiguration,event_source_mapping_configuration +EventSourceMappings,event_source_mappings +EventSourceName,event_source_name +EventSourceToken,event_source_token +EventSources,event_sources +EventSourcesConfig,event_sources_config +EventStartCondition,event_start_condition +EventStartTime,event_start_time +EventStatus,event_status +EventStopBehavior,event_stop_behavior +EventStream,event_stream +EventStreamArn,event_stream_arn +EventStreamDestinationDetails,event_stream_destination_details +EventStreamName,event_stream_name +EventStreamSummary,event_stream_summary +EventSubType,event_sub_type +EventSubscription,event_subscription +EventSubscriptionArn,event_subscription_arn +EventSubscriptionQuotaExceededFault,event_subscription_quota_exceeded_fault +EventSubscriptionsList,event_subscriptions_list +EventSubscriptionsMessage,event_subscriptions_message +EventSummary,event_summary +EventTaggingEnabled,event_tagging_enabled +EventThreshold,event_threshold +EventTime,event_time +EventTimeFeatureName,event_time_feature_name +EventTimeRange,event_time_range +EventTopic,event_topic +EventTopics,event_topics +EventTracker,event_tracker +EventTrackerSummary,event_tracker_summary +EventTriggerDefinition,event_trigger_definition +EventTriggers,event_triggers +EventType,event_type +EventTypeFilter,event_type_filter +EventTypeId,event_type_id +EventTypeIds,event_type_ids +EventTypeName,event_type_name +EventTypeSummary,event_type_summary +EventTypes,event_types +EventVariableSummary,event_variable_summary +Events,events +EventsBatch,events_batch +EventsCompleted,events_completed +EventsConfiguration,events_configuration +EventsDetectionJobFilter,events_detection_job_filter +EventsDetectionJobProperties,events_detection_job_properties +EventsDetectionJobPropertiesList,events_detection_job_properties_list +EventsItemResponse,events_item_response +EventsMatched,events_matched +EventsMessage,events_message +EventsPollInterval,events_poll_interval +EventsRequest,events_request +EventsResponse,events_response +EventsScanned,events_scanned +Evidence,evidence +EvidenceFinderEnablement,evidence_finder_enablement +EvidenceInsights,evidence_insights +EwsAvailabilityProvider,ews_availability_provider +EwsEndpoint,ews_endpoint +EwsPassword,ews_password +EwsProvider,ews_provider +EwsUsername,ews_username +ExactCidrMatches,exact_cidr_matches +ExactFramerate,exact_framerate +ExactSettings,exact_settings +Example,example +ExampleError,example_error +ExasolParameters,exasol_parameters +ExceedsLimitException,exceeds_limit_exception +Excel,excel +ExcelOptions,excel_options +ExceptionCause,exception_cause +ExceptionDescription,exception_description +ExceptionName,exception_name +ExceptionResponse,exception_response +ExceptionType,exception_type +Exceptions,exceptions +ExcessCapacityTerminationPolicy,excess_capacity_termination_policy +ExchangeCodeForTokenRequest,exchange_code_for_token_request +ExchangeCodeForTokenRequestBody,exchange_code_for_token_request_body +ExchangeCodeForTokenResponse,exchange_code_for_token_response +ExchangeId,exchange_id +ExchangedReservedNode,exchanged_reserved_node +Exclude,exclude +ExcludeArchived,exclude_archived +ExcludeAttachmentFilePatterns,exclude_attachment_file_patterns +ExcludeBootVolume,exclude_boot_volume +ExcludeCharacters,exclude_characters +ExcludeColumnSchema,exclude_column_schema +ExcludeCompliantResources,exclude_compliant_resources +ExcludeDataVolumeIds,exclude_data_volume_ids +ExcludeDataVolumeTags,exclude_data_volume_tags +ExcludeDevicesDeployedInOtherStage,exclude_devices_deployed_in_other_stage +ExcludeFeaturesAttribute,exclude_features_attribute +ExcludeFilters,exclude_filters +ExcludeLowercase,exclude_lowercase +ExcludeManagementEventSources,exclude_management_event_sources +ExcludeMap,exclude_map +ExcludeMimeTypes,exclude_mime_types +ExcludeNumbers,exclude_numbers +ExcludePaths,exclude_paths +ExcludePeriodConfiguration,exclude_period_configuration +ExcludePunctuation,exclude_punctuation +ExcludeResourceTags,exclude_resource_tags +ExcludeRetainedVariantProperties,exclude_retained_variant_properties +ExcludeSharedDrives,exclude_shared_drives +ExcludeSpaces,exclude_spaces +ExcludeSpecifiedAccounts,exclude_specified_accounts +ExcludeSpecifiedOrganizationalUnits,exclude_specified_organizational_units +ExcludeUppercase,exclude_uppercase +ExcludeUserAccounts,exclude_user_accounts +ExcludeVerboseContent,exclude_verbose_content +ExcludedAccounts,excluded_accounts +ExcludedAttendeeIds,excluded_attendee_ids +ExcludedColumnNames,excluded_column_names +ExcludedCookies,excluded_cookies +ExcludedHeaders,excluded_headers +ExcludedInstanceTypes,excluded_instance_types +ExcludedMembers,excluded_members +ExcludedPages,excluded_pages +ExcludedRule,excluded_rule +ExcludedRules,excluded_rules +ExcludedTimeRanges,excluded_time_ranges +Excludes,excludes +Exclusion,exclusion +ExclusionByResourceTypes,exclusion_by_resource_types +ExclusionFileNamePatterns,exclusion_file_name_patterns +ExclusionFileTypePatterns,exclusion_file_type_patterns +ExclusionFolderNamePatterns,exclusion_folder_name_patterns +ExclusionPatterns,exclusion_patterns +ExclusionPreview,exclusion_preview +Exclusions,exclusions +ExclusiveEndBillingPeriod,exclusive_end_billing_period +ExclusiveEndTime,exclusive_end_time +ExclusiveStartApplicationName,exclusive_start_application_name +ExclusiveStartBackupArn,exclusive_start_backup_arn +ExclusiveStartDeliveryStreamName,exclusive_start_delivery_stream_name +ExclusiveStartDestinationId,exclusive_start_destination_id +ExclusiveStartGlobalTableName,exclusive_start_global_table_name +ExclusiveStartKey,exclusive_start_key +ExclusiveStartShardId,exclusive_start_shard_id +ExclusiveStartStreamArn,exclusive_start_stream_arn +ExclusiveStartStreamName,exclusive_start_stream_name +ExclusiveStartTableName,exclusive_start_table_name +ExclusiveStartTagKey,exclusive_start_tag_key +ExecArgs,exec_args +Executable,executable +ExecutableParameters,executable_parameters +ExecutablePath,executable_path +ExecutableSha256,executable_sha256 +ExecutableUsers,executable_users +ExecuteBudgetActionRequest,execute_budget_action_request +ExecuteBudgetActionResponse,execute_budget_action_response +ExecuteChangeSetInput,execute_change_set_input +ExecuteCommandConfiguration,execute_command_configuration +ExecuteCommandLogConfiguration,execute_command_log_configuration +ExecuteCommandRequest,execute_command_request +ExecuteCommandResponse,execute_command_response +ExecuteCommandSessionConfiguration,execute_command_session_configuration +ExecuteCoreNetworkChangeSetRequest,execute_core_network_change_set_request +ExecuteFastResetInput,execute_fast_reset_input +ExecuteFastResetOutput,execute_fast_reset_output +ExecuteGremlinExplainQueryInput,execute_gremlin_explain_query_input +ExecuteGremlinExplainQueryOutput,execute_gremlin_explain_query_output +ExecuteGremlinProfileQueryInput,execute_gremlin_profile_query_input +ExecuteGremlinProfileQueryOutput,execute_gremlin_profile_query_output +ExecuteGremlinQueryInput,execute_gremlin_query_input +ExecuteGremlinQueryOutput,execute_gremlin_query_output +ExecuteOpenCypherExplainQueryInput,execute_open_cypher_explain_query_input +ExecuteOpenCypherExplainQueryOutput,execute_open_cypher_explain_query_output +ExecuteOpenCypherQueryInput,execute_open_cypher_query_input +ExecuteOpenCypherQueryOutput,execute_open_cypher_query_output +ExecutePolicyType,execute_policy_type +ExecuteProvisionedProductPlanInput,execute_provisioned_product_plan_input +ExecuteProvisionedProductPlanOutput,execute_provisioned_product_plan_output +ExecuteProvisionedProductServiceActionInput,execute_provisioned_product_service_action_input +ExecuteProvisionedProductServiceActionOutput,execute_provisioned_product_service_action_output +ExecuteQueryRequest,execute_query_request +ExecuteQueryResponse,execute_query_response +ExecuteScheduledQueryRequest,execute_scheduled_query_request +ExecuteSqlRequest,execute_sql_request +ExecuteSqlResponse,execute_sql_response +ExecuteStatement,execute_statement +ExecuteStatementException,execute_statement_exception +ExecuteStatementInput,execute_statement_input +ExecuteStatementOutput,execute_statement_output +ExecuteStatementRequest,execute_statement_request +ExecuteStatementResponse,execute_statement_response +ExecuteStatementResult,execute_statement_result +ExecuteTimeout,execute_timeout +ExecuteToken,execute_token +ExecuteTransactionInput,execute_transaction_input +ExecuteTransactionOutput,execute_transaction_output +ExecutedBy,executed_by +ExecutedTime,executed_time +ExecutedVersion,executed_version +Execution,execution +ExecutionAbortedEventDetails,execution_aborted_event_details +ExecutionAlreadyExists,execution_already_exists +ExecutionClass,execution_class +ExecutionConfiguration,execution_configuration +ExecutionControls,execution_controls +ExecutionCount,execution_count +ExecutionDate,execution_date +ExecutionDetails,execution_details +ExecutionDoesNotExist,execution_does_not_exist +ExecutionElapsedTime,execution_elapsed_time +ExecutionEndDateTime,execution_end_date_time +ExecutionEndTime,execution_end_time +ExecutionEngine,execution_engine +ExecutionEngineConfig,execution_engine_config +ExecutionEngineId,execution_engine_id +ExecutionError,execution_error +ExecutionErrorDetails,execution_error_details +ExecutionFailedEventDetails,execution_failed_event_details +ExecutionId,execution_id +ExecutionLimitExceeded,execution_limit_exceeded +ExecutionList,execution_list +ExecutionListItem,execution_list_item +ExecutionMessage,execution_message +ExecutionMetrics,execution_metrics +ExecutionOrder,execution_order +ExecutionParameter,execution_parameter +ExecutionParameters,execution_parameters +ExecutionProperty,execution_property +ExecutionRecord,execution_record +ExecutionResult,execution_result +ExecutionResults,execution_results +ExecutionRole,execution_role +ExecutionRoleArn,execution_role_arn +ExecutionRoleIdentityConfig,execution_role_identity_config +ExecutionRoleName,execution_role_name +ExecutionStartDateTime,execution_start_date_time +ExecutionStartTime,execution_start_time +ExecutionStartedEventDetails,execution_started_event_details +ExecutionStatistics,execution_statistics +ExecutionStats,execution_stats +ExecutionStatus,execution_status +ExecutionStatusDetail,execution_status_detail +ExecutionStepResult,execution_step_result +ExecutionSucceededEventDetails,execution_succeeded_event_details +ExecutionSummary,execution_summary +ExecutionTime,execution_time +ExecutionTimeFilter,execution_time_filter +ExecutionTimeInMillis,execution_time_in_millis +ExecutionTimedOutEventDetails,execution_timed_out_event_details +ExecutionTimeout,execution_timeout +ExecutionTrigger,execution_trigger +ExecutionType,execution_type +Executions,executions +ExecutorConfiguration,executor_configuration +ExecutorId,executor_id +ExecutorSize,executor_size +ExecutorState,executor_state +ExecutorStateFilter,executor_state_filter +ExecutorType,executor_type +ExecutorsSummary,executors_summary +ExistingEnrollmentAction,existing_enrollment_action +ExistingHourlyCommitment,existing_hourly_commitment +ExistingObjectReplication,existing_object_replication +ExistingVersion,existing_version +Exists,exists +ExitCode,exit_code +ExitMessage,exit_message +ExitStandbyAnswer,exit_standby_answer +ExitStandbyQuery,exit_standby_query +Expected,expected +ExpectedAttributeValue,expected_attribute_value +ExpectedBucketOwner,expected_bucket_owner +ExpectedCompletionDate,expected_completion_date +ExpectedCompletionTimeMinutes,expected_completion_time_minutes +ExpectedFirewallEndpoint,expected_firewall_endpoint +ExpectedFirewallSubnetId,expected_firewall_subnet_id +ExpectedFirewallSubnetRoutes,expected_firewall_subnet_routes +ExpectedInternetGatewayRoutes,expected_internet_gateway_routes +ExpectedManifestBucketOwner,expected_manifest_bucket_owner +ExpectedNextSnapshotScheduleTime,expected_next_snapshot_schedule_time +ExpectedNextSnapshotScheduleTimeStatus,expected_next_snapshot_schedule_time_status +ExpectedPolicyDescription,expected_policy_description +ExpectedProperties,expected_properties +ExpectedResourceUtilization,expected_resource_utilization +ExpectedRoute,expected_route +ExpectedRouteTable,expected_route_table +ExpectedRoutes,expected_routes +ExpectedSourceBucketOwner,expected_source_bucket_owner +ExpectedValue,expected_value +ExpenseCurrency,expense_currency +ExpenseDetection,expense_detection +ExpenseDocument,expense_document +ExpenseDocuments,expense_documents +ExpenseField,expense_field +ExpenseGroupProperty,expense_group_property +ExpenseIndex,expense_index +ExpenseType,expense_type +ExperienceConfiguration,experience_configuration +ExperienceEndpoint,experience_endpoint +ExperienceEntitiesSummary,experience_entities_summary +ExperienceScore,experience_score +ExperiencesSummary,experiences_summary +Experiment,experiment +ExperimentAction,experiment_action +ExperimentActionState,experiment_action_state +ExperimentArn,experiment_arn +ExperimentCloudWatchLogsLogConfiguration,experiment_cloud_watch_logs_log_configuration +ExperimentConfig,experiment_config +ExperimentExecution,experiment_execution +ExperimentLogConfiguration,experiment_log_configuration +ExperimentName,experiment_name +ExperimentReport,experiment_report +ExperimentResultsData,experiment_results_data +ExperimentS3LogConfiguration,experiment_s3_log_configuration +ExperimentSchedule,experiment_schedule +ExperimentSource,experiment_source +ExperimentState,experiment_state +ExperimentStopCondition,experiment_stop_condition +ExperimentSummaries,experiment_summaries +ExperimentSummary,experiment_summary +ExperimentTarget,experiment_target +ExperimentTargetFilter,experiment_target_filter +ExperimentTemplate,experiment_template +ExperimentTemplateAction,experiment_template_action +ExperimentTemplateCloudWatchLogsLogConfiguration,experiment_template_cloud_watch_logs_log_configuration +ExperimentTemplateCloudWatchLogsLogConfigurationInput,experiment_template_cloud_watch_logs_log_configuration_input +ExperimentTemplateLogConfiguration,experiment_template_log_configuration +ExperimentTemplateS3LogConfiguration,experiment_template_s3_log_configuration +ExperimentTemplateS3LogConfigurationInput,experiment_template_s3_log_configuration_input +ExperimentTemplateStopCondition,experiment_template_stop_condition +ExperimentTemplateSummary,experiment_template_summary +ExperimentTemplateTarget,experiment_template_target +ExperimentTemplateTargetFilter,experiment_template_target_filter +ExperimentTemplateTargetInputFilter,experiment_template_target_input_filter +Expiration,expiration +ExpirationCriterion,expiration_criterion +ExpirationDate,expiration_date +ExpirationDays,expiration_days +ExpirationInDays,expiration_in_days +ExpirationModel,expiration_model +ExpirationSettings,expiration_settings +ExpirationTime,expiration_time +ExpirationTimeResponse,expiration_time_response +ExpirationTimestamp,expiration_timestamp +ExpireAt,expire_at +ExpirePasswords,expire_passwords +ExpireSessionRequest,expire_session_request +ExpireTime,expire_time +Expired,expired +ExpiredAt,expired_at +ExpiredCodeException,expired_code_exception +ExpiredException,expired_exception +ExpiredImportTokenException,expired_import_token_exception +ExpiredIteratorException,expired_iterator_exception +ExpiredNextTokenException,expired_next_token_exception +ExpiredObjectDeleteMarker,expired_object_delete_marker +ExpiredStreamException,expired_stream_exception +ExpiredTokenException,expired_token_exception +Expires,expires +ExpiresAfter,expires_after +ExpiresAt,expires_at +ExpiresIn,expires_in +ExpiresInSeconds,expires_in_seconds +ExpiringVersion,expiring_version +Expiry,expiry +ExpiryDateTime,expiry_date_time +ExpiryEvents,expiry_events +ExpiryEventsConfiguration,expiry_events_configuration +ExpiryMinutes,expiry_minutes +ExpiryTime,expiry_time +ExpiryTimestamp,expiry_timestamp +ExplainPredictor,explain_predictor +Explainabilities,explainabilities +Explainability,explainability +ExplainabilityArn,explainability_arn +ExplainabilityConfig,explainability_config +ExplainabilityExportArn,explainability_export_arn +ExplainabilityExportName,explainability_export_name +ExplainabilityExportSummary,explainability_export_summary +ExplainabilityExports,explainability_exports +ExplainabilityInfo,explainability_info +ExplainabilityName,explainability_name +ExplainabilitySummary,explainability_summary +ExplainerConfig,explainer_config +Explanation,explanation +ExplanationCode,explanation_code +Explanations,explanations +ExplicitAuthFlows,explicit_auth_flows +ExplicitDeny,explicit_deny +ExplicitHashKey,explicit_hash_key +ExplicitHierarchy,explicit_hierarchy +ExplicitIds,explicit_ids +ExploitAvailable,exploit_available +ExploitObserved,exploit_observed +ExploitabilityDetails,exploitability_details +ExponentialRolloutRate,exponential_rollout_rate +Export,export +ExportApiRequest,export_api_request +ExportApiResponse,export_api_response +ExportArn,export_arn +ExportArtifacts,export_artifacts +ExportAssetToSignedUrl,export_asset_to_signed_url +ExportAssetToSignedUrlRequestDetails,export_asset_to_signed_url_request_details +ExportAssetToSignedUrlResponseDetails,export_asset_to_signed_url_response_details +ExportAssetsToS3,export_assets_to_s3 +ExportAssetsToS3RequestDetails,export_assets_to_s3_request_details +ExportAssetsToS3ResponseDetails,export_assets_to_s3_response_details +ExportAttributeName,export_attribute_name +ExportAutoScalingGroupRecommendationsRequest,export_auto_scaling_group_recommendations_request +ExportAutoScalingGroupRecommendationsResponse,export_auto_scaling_group_recommendations_response +ExportBackupPlanTemplateInput,export_backup_plan_template_input +ExportBackupPlanTemplateOutput,export_backup_plan_template_output +ExportBundleRequest,export_bundle_request +ExportBundleResult,export_bundle_result +ExportCertificateRequest,export_certificate_request +ExportCertificateResponse,export_certificate_response +ExportClientVpnClientCertificateRevocationListRequest,export_client_vpn_client_certificate_revocation_list_request +ExportClientVpnClientCertificateRevocationListResult,export_client_vpn_client_certificate_revocation_list_result +ExportClientVpnClientConfigurationRequest,export_client_vpn_client_configuration_request +ExportClientVpnClientConfigurationResult,export_client_vpn_client_configuration_result +ExportComponentsRequest,export_components_request +ExportComponentsResponse,export_components_response +ExportConfigurationsResponse,export_configurations_response +ExportConflictException,export_conflict_exception +ExportCreationTime,export_creation_time +ExportDataSource,export_data_source +ExportDescription,export_description +ExportDestination,export_destination +ExportEBSVolumeRecommendationsRequest,export_ebs_volume_recommendations_request +ExportEBSVolumeRecommendationsResponse,export_ebs_volume_recommendations_response +ExportEC2InstanceRecommendationsRequest,export_ec2_instance_recommendations_request +ExportEC2InstanceRecommendationsResponse,export_ec2_instance_recommendations_response +ExportECSServiceRecommendationsRequest,export_ecs_service_recommendations_request +ExportECSServiceRecommendationsResponse,export_ecs_service_recommendations_response +ExportEarthObservationJobInput,export_earth_observation_job_input +ExportEarthObservationJobOutput,export_earth_observation_job_output +ExportErrorData,export_error_data +ExportErrorDetails,export_error_details +ExportErrorDetailsOutput,export_error_details_output +ExportFilter,export_filter +ExportFormat,export_format +ExportFormsRequest,export_forms_request +ExportFormsResponse,export_forms_response +ExportFromTime,export_from_time +ExportHiddenFieldsOption,export_hidden_fields_option +ExportId,export_id +ExportImageRequest,export_image_request +ExportImageResult,export_image_result +ExportImageTask,export_image_task +ExportImageTaskId,export_image_task_id +ExportImageTaskIds,export_image_task_ids +ExportImageTasks,export_image_tasks +ExportInfo,export_info +ExportJobProperties,export_job_properties +ExportJobPropertiesList,export_job_properties_list +ExportJobRequest,export_job_request +ExportJobResource,export_job_resource +ExportJobResponse,export_job_response +ExportJobSummary,export_job_summary +ExportJobs,export_jobs +ExportJobsResponse,export_jobs_response +ExportJournalToS3Request,export_journal_to_s3_request +ExportJournalToS3Response,export_journal_to_s3_response +ExportKeyIdentifier,export_key_identifier +ExportKeyInput,export_key_input +ExportKeyOutput,export_key_output +ExportLabelsTaskRunProperties,export_labels_task_run_properties +ExportLambdaFunctionRecommendationsRequest,export_lambda_function_recommendations_request +ExportLambdaFunctionRecommendationsResponse,export_lambda_function_recommendations_response +ExportLensInput,export_lens_input +ExportLensOutput,export_lens_output +ExportLicenseRecommendationsRequest,export_license_recommendations_request +ExportLicenseRecommendationsResponse,export_license_recommendations_response +ExportManifest,export_manifest +ExportMetadataModelAssessmentMessage,export_metadata_model_assessment_message +ExportMetadataModelAssessmentResponse,export_metadata_model_assessment_response +ExportMetadataModelAssessmentResultEntry,export_metadata_model_assessment_result_entry +ExportMetric,export_metric +ExportName,export_name +ExportNotFoundException,export_not_found_exception +ExportNotebookInput,export_notebook_input +ExportNotebookOutput,export_notebook_output +ExportOnly,export_only +ExportPath,export_path +ExportProjectRequest,export_project_request +ExportProjectResult,export_project_result +ExportReadSet,export_read_set +ExportReadSetDetail,export_read_set_detail +ExportReadSetFilter,export_read_set_filter +ExportReadSetJobDetail,export_read_set_job_detail +ExportResourceSpecification,export_resource_specification +ExportResponse,export_response +ExportResults,export_results +ExportRevisionToS3,export_revision_to_s3 +ExportRevisionsToS3,export_revisions_to_s3 +ExportRevisionsToS3RequestDetails,export_revisions_to_s3_request_details +ExportRevisionsToS3ResponseDetails,export_revisions_to_s3_response_details +ExportS3DataInput,export_s3_data_input +ExportSchemaRequest,export_schema_request +ExportSchemaResponse,export_schema_response +ExportServerEngineAttributeRequest,export_server_engine_attribute_request +ExportServerEngineAttributeResponse,export_server_engine_attribute_response +ExportServerSideEncryption,export_server_side_encryption +ExportSnapshotRecord,export_snapshot_record +ExportSnapshotRecordSourceInfo,export_snapshot_record_source_info +ExportSnapshotRequest,export_snapshot_request +ExportSnapshotResult,export_snapshot_result +ExportSortBy,export_sort_by +ExportSourceImages,export_source_images +ExportSourceNetworkCfnTemplateRequest,export_source_network_cfn_template_request +ExportSourceNetworkCfnTemplateResponse,export_source_network_cfn_template_response +ExportSourceType,export_source_type +ExportSqlDetails,export_sql_details +ExportStatistics,export_statistics +ExportStatus,export_status +ExportSummaries,export_summaries +ExportSummary,export_summary +ExportTableToPointInTimeInput,export_table_to_point_in_time_input +ExportTableToPointInTimeOutput,export_table_to_point_in_time_output +ExportTask,export_task +ExportTaskAlreadyExistsFault,export_task_already_exists_fault +ExportTaskError,export_task_error +ExportTaskExecutionInfo,export_task_execution_info +ExportTaskId,export_task_id +ExportTaskIdentifier,export_task_identifier +ExportTaskIds,export_task_ids +ExportTaskNotFoundFault,export_task_not_found_fault +ExportTaskS3Location,export_task_s3_location +ExportTaskS3LocationRequest,export_task_s3_location_request +ExportTaskStatus,export_task_status +ExportTaskSummary,export_task_summary +ExportTasks,export_tasks +ExportTasksMessage,export_tasks_message +ExportThemesRequest,export_themes_request +ExportThemesResponse,export_themes_response +ExportTime,export_time +ExportToCSVOption,export_to_csv_option +ExportToS3Task,export_to_s3_task +ExportToS3TaskSpecification,export_to_s3_task_specification +ExportToTime,export_to_time +ExportToken,export_token +ExportTr31KeyBlock,export_tr31_key_block +ExportTr34KeyBlock,export_tr34_key_block +ExportTransitGatewayRoutesRequest,export_transit_gateway_routes_request +ExportTransitGatewayRoutesResult,export_transit_gateway_routes_result +ExportType,export_type +ExportVectorEnrichmentJobInput,export_vector_enrichment_job_input +ExportVectorEnrichmentJobOutput,export_vector_enrichment_job_output +ExportVectorEnrichmentJobOutputConfig,export_vector_enrichment_job_output_config +ExportVersion,export_version +ExportViewType,export_view_type +ExportWithHiddenFieldsOption,export_with_hidden_fields_option +Exportable,exportable +ExportableKey,exportable_key +ExportableLogTypes,exportable_log_types +Exported,exported +ExportedEnvironmentVariable,exported_environment_variable +ExportedRecordsCount,exported_records_count +ExportingConfig,exporting_config +ExportingLocation,exporting_location +ExportingStackId,exporting_stack_id +Exports,exports +ExposeHeaders,expose_headers +Expression,expression +ExpressionAttributeNames,expression_attribute_names +ExpressionAttributeValues,expression_attribute_values +ExpressionName,expression_name +ExpressionNames,expression_names +ExpressionStatus,expression_status +ExpressionType,expression_type +ExpressionValue,expression_value +ExpressionVariable,expression_variable +Expressions,expressions +ExtendLicenseConsumptionRequest,extend_license_consumption_request +ExtendLicenseConsumptionResponse,extend_license_consumption_response +ExtendTransactionRequest,extend_transaction_request +ExtendedDataServices,extended_data_services +ExtendedKeyUsage,extended_key_usage +ExtendedKeyUsageObjectIdentifier,extended_key_usage_object_identifier +ExtendedKeyUsageType,extended_key_usage_type +ExtendedKeyUsages,extended_key_usages +ExtendedS3DestinationConfiguration,extended_s3_destination_configuration +ExtendedS3DestinationDescription,extended_s3_destination_description +ExtendedS3DestinationUpdate,extended_s3_destination_update +ExtendedStatistic,extended_statistic +ExtendedStatistics,extended_statistics +Extension,extension +ExtensionArn,extension_arn +ExtensionAssociation,extension_association +ExtensionAssociationId,extension_association_id +ExtensionAssociationSummary,extension_association_summary +ExtensionAssociations,extension_associations +ExtensionDetails,extension_details +ExtensionField,extension_field +ExtensionFields,extension_fields +ExtensionId,extension_id +ExtensionIdentifier,extension_identifier +ExtensionSummary,extension_summary +ExtensionVersion,extension_version +ExtensionVersionDetails,extension_version_details +ExtensionVersionNumber,extension_version_number +ExtensionVersions,extension_versions +Extensions,extensions +ExtensionsV2,extensions_v2 +ExtensionsV3,extensions_v3 +ExtensionsV4,extensions_v4 +ExternalAudioFileInput,external_audio_file_input +ExternalDataFilteringAllowList,external_data_filtering_allow_list +ExternalEvaluation,external_evaluation +ExternalEventsDetail,external_events_detail +ExternalId,external_id +ExternalIds,external_ids +ExternalImageId,external_image_id +ExternalLoginFederationProviderType,external_login_federation_provider_type +ExternalLoginFederationProviderUrl,external_login_federation_provider_url +ExternalLoginId,external_login_id +ExternalMeetingId,external_meeting_id +ExternalMetricStatus,external_metric_status +ExternalMetricsPreference,external_metrics_preference +ExternalModel,external_model +ExternalModelOutputs,external_model_outputs +ExternalModelSummary,external_model_summary +ExternalServiceException,external_service_exception +ExternalSourceSetting,external_source_setting +ExternalTableDefinition,external_table_definition +ExternalUrlConfig,external_url_config +ExternalUserId,external_user_id +ExternalUserIds,external_user_ids +ExternalWorkflowExecutionCancelRequestedEventAttributes,external_workflow_execution_cancel_requested_event_attributes +ExternalWorkflowExecutionSignaledEventAttributes,external_workflow_execution_signaled_event_attributes +ExtraArchivedLogDestIds,extra_archived_log_dest_ids +ExtraConnectionAttributes,extra_connection_attributes +ExtraHosts,extra_hosts +ExtraJarsS3Path,extra_jars_s3_path +ExtraParam,extra_param +ExtraParams,extra_params +ExtraPythonLibsS3Path,extra_python_libs_s3_path +ExtractDocId,extract_doc_id +ExtractedCharacters,extracted_characters +ExtractedCharactersListItem,extracted_characters_list_item +Extraction,extraction +Extractions,extractions +EyeDirection,eye_direction +EyeOpen,eye_open +Eyeglasses,eyeglasses +EyesOpen,eyes_open +F1,f1 +F1Score,f1_score +F4vSettings,f4v_settings +FCntStart,f_cnt_start +FIAuthKey,fi_auth_key +FIPSEnabled,fips_enabled +FMSPolicyUpdateFirewallCreationConfigAction,fms_policy_update_firewall_creation_config_action +FNwkSIntKey,f_nwk_s_int_key +FPort,f_port +FPorts,f_ports +FQDN,fqdn +FSxWindowsFileServerAuthorizationConfig,f_sx_windows_file_server_authorization_config +FSxWindowsFileServerVolumeConfiguration,f_sx_windows_file_server_volume_configuration +Fabric,fabric +Face,face +FaceAttributes,face_attributes +FaceCount,face_count +FaceDetail,face_detail +FaceDetails,face_details +FaceDetection,face_detection +FaceId,face_id +FaceIds,face_ids +FaceMatch,face_match +FaceMatchThreshold,face_match_threshold +FaceMatches,face_matches +FaceModelVersion,face_model_version +FaceModelVersions,face_model_versions +FaceOccluded,face_occluded +FaceRecord,face_record +FaceRecords,face_records +FaceSearch,face_search +FaceSearchSettings,face_search_settings +Facebook,facebook +Faces,faces +Facet,facet +FacetAlreadyExistsException,facet_already_exists_exception +FacetAttribute,facet_attribute +FacetAttributeDefinition,facet_attribute_definition +FacetAttributeReference,facet_attribute_reference +FacetAttributeUpdate,facet_attribute_update +FacetEnabled,facet_enabled +FacetFilter,facet_filter +FacetInUseException,facet_in_use_exception +FacetName,facet_name +FacetNames,facet_names +FacetNotFoundException,facet_not_found_exception +FacetResult,facet_result +FacetResults,facet_results +FacetStyle,facet_style +FacetValidationException,facet_validation_exception +Facetable,facetable +Facets,facets +FactoryPresetFreqsList,factory_preset_freqs_list +FactorySupport,factory_support +FadeIn,fade_in +FadeOut,fade_out +Fail,fail +FailOnWarnings,fail_on_warnings +FailStepMetadata,fail_step_metadata +FailTasksOnLobTruncation,fail_tasks_on_lob_truncation +FailWorkflowExecutionDecisionAttributes,fail_workflow_execution_decision_attributes +FailWorkflowExecutionFailedEventAttributes,fail_workflow_execution_failed_event_attributes +Failed,failed +FailedAccount,failed_account +FailedActions,failed_actions +FailedAssociatedResources,failed_associated_resources +FailedBatchItem,failed_batch_item +FailedBatches,failed_batches +FailedCampaignStateResponse,failed_campaign_state_response +FailedCapacityReservationFleetCancellationResult,failed_capacity_reservation_fleet_cancellation_result +FailedCount,failed_count +FailedCreateAssociation,failed_create_association +FailedCreateSimulationJobRequest,failed_create_simulation_job_request +FailedCreateStandbyWorkspacesRequest,failed_create_standby_workspaces_request +FailedCreateWorkspaceRequest,failed_create_workspace_request +FailedCustomVocabularyItem,failed_custom_vocabulary_item +FailedDeleteRemediationExceptionsBatch,failed_delete_remediation_exceptions_batch +FailedDependencyException,failed_dependency_exception +FailedDisassociatedResources,failed_disassociated_resources +FailedDocuments,failed_documents +FailedEntity,failed_entity +FailedEntityList,failed_entity_list +FailedEntries,failed_entries +FailedEntryCount,failed_entry_count +FailedEvaluations,failed_evaluations +FailedFindings,failed_findings +FailedFleetCancellations,failed_fleet_cancellations +FailedImportedDeviceCount,failed_imported_device_count +FailedItem,failed_item +FailedItemDetails,failed_item_details +FailedItems,failed_items +FailedLoginAttempts,failed_login_attempts +FailedMemberAccountEc2DeepInspectionStatusState,failed_member_account_ec2_deep_inspection_status_state +FailedNonRetryableError,failed_non_retryable_error +FailedPieces,failed_pieces +FailedPutCount,failed_put_count +FailedQueuedPurchaseDeletion,failed_queued_purchase_deletion +FailedQueuedPurchaseDeletions,failed_queued_purchase_deletions +FailedReason,failed_reason +FailedRecordCount,failed_record_count +FailedRecordsCount,failed_records_count +FailedRecordsS3Url,failed_records_s3_url +FailedRemediationBatch,failed_remediation_batch +FailedRemediationExceptionBatch,failed_remediation_exception_batch +FailedRequest,failed_request +FailedRequests,failed_requests +FailedResource,failed_resource +FailedResourceAccessException,failed_resource_access_exception +FailedResourcesMap,failed_resources_map +FailedS3Resource,failed_s3_resource +FailedScheduledActions,failed_scheduled_actions +FailedScheduledUpdateGroupActionRequest,failed_scheduled_update_group_action_request +FailedScheduledUpdateGroupActions,failed_scheduled_update_group_actions +FailedServiceActionAssociation,failed_service_action_association +FailedServiceActionAssociations,failed_service_action_associations +FailedStackInstancesCount,failed_stack_instances_count +FailedStandbyRequests,failed_standby_requests +FailedStatusDetails,failed_status_details +FailedSteps,failed_steps +FailedUsers,failed_users +FailedWorkspaceChangeRequest,failed_workspace_change_request +Failover,failover +FailoverCondition,failover_condition +FailoverConditionSettings,failover_condition_settings +FailoverConditions,failover_conditions +FailoverConfig,failover_config +FailoverCriteria,failover_criteria +FailoverDBClusterMessage,failover_db_cluster_message +FailoverDBClusterResult,failover_db_cluster_result +FailoverGlobalClusterMessage,failover_global_cluster_message +FailoverGlobalClusterResult,failover_global_cluster_result +FailoverGlobalReplicationGroupMessage,failover_global_replication_group_message +FailoverGlobalReplicationGroupResult,failover_global_replication_group_result +FailoverMode,failover_mode +FailoverShardRequest,failover_shard_request +FailoverShardResponse,failover_shard_response +FailoverState,failover_state +Failure,failure +FailureAction,failure_action +FailureByQueryException,failure_by_query_exception +FailureCause,failure_cause +FailureCode,failure_code +FailureCodes,failure_codes +FailureDescription,failure_description +FailureDetails,failure_details +FailureException,failure_exception +FailureHandlingPolicy,failure_handling_policy +FailureInfo,failure_info +FailureLocation,failure_location +FailureMessage,failure_message +FailureMessages,failure_messages +FailureMode,failure_mode +FailurePolicy,failure_policy +FailureReason,failure_reason +FailureReasons,failure_reasons +FailureRedirectionURL,failure_redirection_url +FailureResource,failure_resource +FailureRetentionPeriodInDays,failure_retention_period_in_days +FailureStage,failure_stage +FailureStrings,failure_strings +FailureSummary,failure_summary +FailureThreshold,failure_threshold +FailureTime,failure_time +FailureToleranceCount,failure_tolerance_count +FailureTolerancePercentage,failure_tolerance_percentage +FailureType,failure_type +FailureValues,failure_values +Failures,failures +FairsharePolicy,fairshare_policy +FallBackPhoneNumber,fall_back_phone_number +FallbackAction,fallback_action +FallbackBehavior,fallback_behavior +FallbackFont,fallback_font +FalseActivity,false_activity +FalseyCellValue,falsey_cell_value +FalseyCellValueSynonyms,falsey_cell_value_synonyms +Family,family +FamilyName,family_name +FaqIds,faq_ids +FaqStatistics,faq_statistics +FaqSummary,faq_summary +FaqSummaryItems,faq_summary_items +FargatePlatformConfiguration,fargate_platform_configuration +FargateProfile,fargate_profile +FargateProfileSelector,fargate_profile_selector +FastLaunchConfiguration,fast_launch_configuration +FastLaunchImages,fast_launch_images +FastLaunchLaunchTemplateSpecification,fast_launch_launch_template_specification +FastLaunchLaunchTemplateSpecificationRequest,fast_launch_launch_template_specification_request +FastLaunchLaunchTemplateSpecificationResponse,fast_launch_launch_template_specification_response +FastLaunchSnapshotConfiguration,fast_launch_snapshot_configuration +FastLaunchSnapshotConfigurationRequest,fast_launch_snapshot_configuration_request +FastLaunchSnapshotConfigurationResponse,fast_launch_snapshot_configuration_response +FastResetToken,fast_reset_token +FastRestoreRule,fast_restore_rule +FastRestored,fast_restored +FastSnapshotRestoreStateErrors,fast_snapshot_restore_state_errors +FastSnapshotRestores,fast_snapshot_restores +Fault,fault +FaultCode,fault_code +FaultCodes,fault_codes +FaultCount,fault_count +FaultCountHigh,fault_count_high +FaultCountLow,fault_count_low +FaultRootCause,fault_root_cause +FaultRootCauseEntity,fault_root_cause_entity +FaultRootCauseService,fault_root_cause_service +FaultRootCauses,fault_root_causes +FaultStatistics,fault_statistics +FaultTolerance,fault_tolerance +FavoritePages,favorite_pages +Fax,fax +Feature,feature +FeatureActivations,feature_activations +FeatureAdditions,feature_additions +FeatureConfigurations,feature_configurations +FeatureDefinition,feature_definition +FeatureDefinitions,feature_definitions +FeatureGroup,feature_group +FeatureGroupArn,feature_group_arn +FeatureGroupName,feature_group_name +FeatureGroupStatus,feature_group_status +FeatureGroupStatusEquals,feature_group_status_equals +FeatureGroupSummaries,feature_group_summaries +FeatureGroupSummary,feature_group_summary +FeatureHeaders,feature_headers +FeatureMetadata,feature_metadata +FeatureName,feature_name +FeatureNames,feature_names +FeatureNotAvailableException,feature_not_available_exception +FeatureParameter,feature_parameter +FeatureSet,feature_set +FeatureSpecificationS3Uri,feature_specification_s3_uri +FeatureStoreOutput,feature_store_output +FeatureSummary,feature_summary +FeatureTransformation,feature_transformation +FeatureType,feature_type +FeatureTypes,feature_types +FeatureValue,feature_value +FeaturedDocument,featured_document +FeaturedDocumentMissing,featured_document_missing +FeaturedDocumentWithMetadata,featured_document_with_metadata +FeaturedDocuments,featured_documents +FeaturedDocumentsMissing,featured_documents_missing +FeaturedDocumentsWithMetadata,featured_documents_with_metadata +FeaturedResultsConflictException,featured_results_conflict_exception +FeaturedResultsItem,featured_results_item +FeaturedResultsItems,featured_results_items +FeaturedResultsSet,featured_results_set +FeaturedResultsSetId,featured_results_set_id +FeaturedResultsSetIds,featured_results_set_ids +FeaturedResultsSetName,featured_results_set_name +FeaturedResultsSetSummary,featured_results_set_summary +FeaturedResultsSetSummaryItems,featured_results_set_summary_items +Features,features +FeaturesAttribute,features_attribute +Featurization,featurization +FeaturizationConfig,featurization_config +FeaturizationMethod,featurization_method +FeaturizationMethodName,featurization_method_name +FeaturizationMethodParameters,featurization_method_parameters +FeaturizationPipeline,featurization_pipeline +Featurizations,featurizations +Fec,fec +FecOutputSettings,fec_output_settings +FederatedAuthentication,federated_authentication +FederatedAuthenticationRequest,federated_authentication_request +FederatedDatabase,federated_database +FederatedResourceAlreadyExistsException,federated_resource_already_exists_exception +FederatedTable,federated_table +FederatedUser,federated_user +FederatedUserId,federated_user_id +FederationParameters,federation_parameters +FederationSourceErrorCode,federation_source_error_code +FederationSourceException,federation_source_exception +FederationSourceRetryableException,federation_source_retryable_exception +Feedback,feedback +FeedbackDate,feedback_date +FeedbackForwardingAddress,feedback_forwarding_address +FeedbackForwardingEmailAddress,feedback_forwarding_email_address +FeedbackForwardingEmailAddressIdentityArn,feedback_forwarding_email_address_identity_arn +FeedbackForwardingStatus,feedback_forwarding_status +FeedbackId,feedback_id +FeedbackToken,feedback_token +FeedbackURL,feedback_url +FeedbackValue,feedback_value +FetchOwner,fetch_owner +FetchPage,fetch_page +FetchPageRequest,fetch_page_request +FetchPageResult,fetch_page_result +FiberOpticCableType,fiber_optic_cable_type +Field,field +FieldBasedTooltip,field_based_tooltip +FieldConfig,field_config +FieldDataPathValues,field_data_path_values +FieldDelimiter,field_delimiter +FieldEncoding,field_encoding +FieldError,field_error +FieldFolder,field_folder +FieldFolders,field_folders +FieldGroup,field_group +FieldId,field_id +FieldIdentifier,field_identifier +FieldInfo,field_info +FieldInputConfig,field_input_config +FieldItem,field_item +FieldLabelType,field_label_type +FieldLevel,field_level +FieldLevelEncryption,field_level_encryption +FieldLevelEncryptionConfig,field_level_encryption_config +FieldLevelEncryptionConfigAlreadyExists,field_level_encryption_config_already_exists +FieldLevelEncryptionConfigInUse,field_level_encryption_config_in_use +FieldLevelEncryptionId,field_level_encryption_id +FieldLevelEncryptionList,field_level_encryption_list +FieldLevelEncryptionProfile,field_level_encryption_profile +FieldLevelEncryptionProfileAlreadyExists,field_level_encryption_profile_already_exists +FieldLevelEncryptionProfileConfig,field_level_encryption_profile_config +FieldLevelEncryptionProfileInUse,field_level_encryption_profile_in_use +FieldLevelEncryptionProfileList,field_level_encryption_profile_list +FieldLevelEncryptionProfileSizeExceeded,field_level_encryption_profile_size_exceeded +FieldLevelEncryptionProfileSummary,field_level_encryption_profile_summary +FieldLevelEncryptionSummary,field_level_encryption_summary +FieldLevelOptions,field_level_options +FieldList,field_list +FieldLogLevel,field_log_level +FieldMappings,field_mappings +FieldName,field_name +FieldNames,field_names +FieldOption,field_option +FieldOptionError,field_option_error +FieldOptions,field_options +FieldPatterns,field_patterns +FieldSelectors,field_selectors +FieldSeriesItem,field_series_item +FieldSort,field_sort +FieldSortOptions,field_sort_options +FieldSourceProfileIds,field_source_profile_ids +FieldStatistics,field_statistics +FieldStats,field_stats +FieldSummary,field_summary +FieldToMatch,field_to_match +FieldTooltipItem,field_tooltip_item +FieldTypeDetails,field_type_details +FieldValidationConfiguration,field_validation_configuration +FieldValidationMessage,field_validation_message +FieldValue,field_value +FieldWells,field_wells +Fields,fields +File,file +FileAccessAuditLogLevel,file_access_audit_log_level +FileAccessLog,file_access_log +FileBatchJobDefinition,file_batch_job_definition +FileBatchJobIdentifier,file_batch_job_identifier +FileCache,file_cache +FileCacheCreating,file_cache_creating +FileCacheDataRepositoryAssociation,file_cache_data_repository_association +FileCacheFailureDetails,file_cache_failure_details +FileCacheId,file_cache_id +FileCacheIds,file_cache_ids +FileCacheLustreConfiguration,file_cache_lustre_configuration +FileCacheLustreMetadataConfiguration,file_cache_lustre_metadata_configuration +FileCacheNFSConfiguration,file_cache_nfs_configuration +FileCacheNotFound,file_cache_not_found +FileCachePath,file_cache_path +FileCacheType,file_cache_type +FileCacheTypeVersion,file_cache_type_version +FileCaches,file_caches +FileCompression,file_compression +FileConfiguration,file_configuration +FileContentAndSourceFileSpecifiedException,file_content_and_source_file_specified_exception +FileContentRequiredException,file_content_required_exception +FileContentSizeLimitExceededException,file_content_size_limit_exceeded_exception +FileCount,file_count +FileDoesNotExistException,file_does_not_exist_exception +FileEntryRequiredException,file_entry_required_exception +FileFailures,file_failures +FileFieldMappings,file_field_mappings +FileFingerprintLines,file_fingerprint_lines +FileFormat,file_format +FileFormatConfiguration,file_format_configuration +FileFormatDescriptor,file_format_descriptor +FileFormats,file_formats +FileGroupSettings,file_group_settings +FileGroups,file_groups +FileHeaderInfo,file_header_info +FileInformation,file_information +FileInput,file_input +FileKey,file_key +FileKeyUpdate,file_key_update +FileLastWritten,file_last_written +FileLocation,file_location +FileMetadata,file_metadata +FileMode,file_mode +FileModeRequiredException,file_mode_required_exception +FileModes,file_modes +FileName,file_name +FileNameConflictsWithDirectoryNameException,file_name_conflicts_with_directory_name_exception +FileOffset,file_offset +FilePath,file_path +FilePathConflictsWithSubmodulePathException,file_path_conflicts_with_submodule_path_exception +FilePaths,file_paths +FileShareARN,file_share_arn +FileShareARNList,file_share_arn_list +FileShareAccessAuditLogLevel,file_share_access_audit_log_level +FileShareId,file_share_id +FileShareInfo,file_share_info +FileShareInfoList,file_share_info_list +FileShareName,file_share_name +FileShareStatus,file_share_status +FileShareType,file_share_type +FileSharesVisible,file_shares_visible +FileSize,file_size +FileSizeBytes,file_size_bytes +FileSizes,file_sizes +FileSource,file_source +FileSourceSettings,file_source_settings +FileSystem,file_system +FileSystemAccessMode,file_system_access_mode +FileSystemAccessRoleArn,file_system_access_role_arn +FileSystemAdministratorsGroup,file_system_administrators_group +FileSystemAlreadyExists,file_system_already_exists +FileSystemArn,file_system_arn +FileSystemAssociationARN,file_system_association_arn +FileSystemAssociationARNList,file_system_association_arn_list +FileSystemAssociationId,file_system_association_id +FileSystemAssociationInfo,file_system_association_info +FileSystemAssociationInfoList,file_system_association_info_list +FileSystemAssociationStatus,file_system_association_status +FileSystemAssociationStatusDetail,file_system_association_status_detail +FileSystemAssociationStatusDetails,file_system_association_status_details +FileSystemAssociationSummary,file_system_association_summary +FileSystemAssociationSummaryList,file_system_association_summary_list +FileSystemConfig,file_system_config +FileSystemConfigs,file_system_configs +FileSystemDataSource,file_system_data_source +FileSystemDescription,file_system_description +FileSystemEndpoint,file_system_endpoint +FileSystemEndpoints,file_system_endpoints +FileSystemFailureDetails,file_system_failure_details +FileSystemId,file_system_id +FileSystemIds,file_system_ids +FileSystemInUse,file_system_in_use +FileSystemLimitExceeded,file_system_limit_exceeded +FileSystemNotFound,file_system_not_found +FileSystemPath,file_system_path +FileSystemPolicyDescription,file_system_policy_description +FileSystemSize,file_system_size +FileSystemType,file_system_type +FileSystemTypeVersion,file_system_type_version +FileSystems,file_systems +FileTooLargeException,file_too_large_exception +FileTransferUploadStreams,file_transfer_upload_streams +FileUploadURL,file_upload_url +FileUploaderFieldConfig,file_uploader_field_config +FileValidationMessage,file_validation_message +FileVersion,file_version +FilecacheDuration,filecache_duration +FilenameContains,filename_contains +Files,files +FilesCompleted,files_completed +FilesDeleted,files_deleted +FilesLimit,files_limit +FilesSkipped,files_skipped +FilesTransferred,files_transferred +FilesVerified,files_verified +FilesystemId,filesystem_id +FillLineGap,fill_line_gap +FillMissingValues,fill_missing_values +FillPolicy,fill_policy +FillStyle,fill_style +FilledMapAggregatedFieldWells,filled_map_aggregated_field_wells +FilledMapConditionalFormatting,filled_map_conditional_formatting +FilledMapConditionalFormattingOption,filled_map_conditional_formatting_option +FilledMapConfiguration,filled_map_configuration +FilledMapFieldWells,filled_map_field_wells +FilledMapShapeConditionalFormatting,filled_map_shape_conditional_formatting +FilledMapSortConfiguration,filled_map_sort_configuration +FilledMapVisual,filled_map_visual +FilledPath,filled_path +FillerSlate,filler_slate +Filling,filling +FilmGrainSynthesis,film_grain_synthesis +Filter,filter +FilterActivity,filter_activity +FilterArn,filter_arn +FilterArns,filter_arns +FilterAtDestination,filter_at_destination +FilterAtSource,filter_at_source +FilterAttributeRanges,filter_attribute_ranges +FilterBBox,filter_b_box +FilterCategories,filter_categories +FilterClass,filter_class +FilterCondition,filter_condition +FilterConditionList,filter_condition_list +FilterConditions,filter_conditions +FilterConfiguration,filter_configuration +FilterControl,filter_control +FilterControlId,filter_control_id +FilterControls,filter_controls +FilterCountries,filter_countries +FilterCriteria,filter_criteria +FilterCriterion,filter_criterion +FilterDateTimePickerControl,filter_date_time_picker_control +FilterDefinition,filter_definition +FilterDescription,filter_description +FilterDropDownControl,filter_drop_down_control +FilterEnable,filter_enable +FilterExpression,filter_expression +FilterGroup,filter_group +FilterGroupId,filter_group_id +FilterGroups,filter_groups +FilterId,filter_id +FilterInArns,filter_in_arns +FilterKey,filter_key +FilterLimitExceededException,filter_limit_exceeded_exception +FilterList,filter_list +FilterListConfiguration,filter_list_configuration +FilterListControl,filter_list_control +FilterLogEventsRequest,filter_log_events_request +FilterLogEventsResponse,filter_log_events_response +FilterName,filter_name +FilterNames,filter_names +FilterOperation,filter_operation +FilterOperationSelectedFieldsConfiguration,filter_operation_selected_fields_configuration +FilterOperationTargetVisualsConfiguration,filter_operation_target_visuals_configuration +FilterOperator,filter_operator +FilterOption,filter_option +FilterPartialResults,filter_partial_results +FilterPolicyLimitExceededException,filter_policy_limit_exceeded_exception +FilterPortRange,filter_port_range +FilterPredicate,filter_predicate +FilterQuery,filter_query +FilterRelativeDateTimeControl,filter_relative_date_time_control +FilterRule,filter_rule +FilterRules,filter_rules +FilterScopeConfiguration,filter_scope_configuration +FilterSelectableValues,filter_selectable_values +FilterSettings,filter_settings +FilterSliderControl,filter_slider_control +FilterStrength,filter_strength +FilterString,filter_string +FilterSummary,filter_summary +FilterSynonyms,filter_synonyms +FilterTextAreaControl,filter_text_area_control +FilterTextFieldControl,filter_text_field_control +FilterType,filter_type +FilterTypedLink,filter_typed_link +FilterV2,filter_v2 +FilterValue,filter_value +FilterValues,filter_values +FilterVariable,filter_variable +FilteredLogEvent,filtered_log_event +FilteredStatus,filtered_status +Filters,filters +FinalActiveLearningModelArn,final_active_learning_model_arn +FinalAutoMLJobObjectiveMetric,final_auto_ml_job_objective_metric +FinalBackupId,final_backup_id +FinalBackupTags,final_backup_tags +FinalBakeTimeInMinutes,final_bake_time_in_minutes +FinalClusterSnapshotIdentifier,final_cluster_snapshot_identifier +FinalClusterSnapshotRetentionPeriod,final_cluster_snapshot_retention_period +FinalDBSnapshotIdentifier,final_db_snapshot_identifier +FinalHyperParameterTuningJobObjectiveMetric,final_hyper_parameter_tuning_job_objective_metric +FinalMetricDataList,final_metric_data_list +FinalRecipient,final_recipient +FinalSnapshotIdentifier,final_snapshot_identifier +FinalSnapshotName,final_snapshot_name +FinalizeCutoverRequest,finalize_cutover_request +FinalizeDeviceClaimRequest,finalize_device_claim_request +FinalizeDeviceClaimResponse,finalize_device_claim_response +Finalized,finalized +FinalizingOrganizationException,finalizing_organization_exception +FindMatchesMetrics,find_matches_metrics +FindMatchesParameters,find_matches_parameters +FindMatchesTaskRunProperties,find_matches_task_run_properties +Finding,finding +FindingAction,finding_action +FindingActor,finding_actor +FindingAggregationRegion,finding_aggregation_region +FindingAggregator,finding_aggregator +FindingAggregatorArn,finding_aggregator_arn +FindingAggregators,finding_aggregators +FindingComponents,finding_components +FindingCreated,finding_created +FindingCriteria,finding_criteria +FindingDetail,finding_detail +FindingDetailsError,finding_details_error +FindingFieldsUpdate,finding_fields_update +FindingFilter,finding_filter +FindingHistoryRecord,finding_history_record +FindingHistoryUpdate,finding_history_update +FindingHistoryUpdateSource,finding_history_update_source +FindingId,finding_id +FindingIdentifier,finding_identifier +FindingIdentifiers,finding_identifiers +FindingIds,finding_ids +FindingMetricsValuePerSeverity,finding_metrics_value_per_severity +FindingProviderFields,finding_provider_fields +FindingProviderFieldsConfidence,finding_provider_fields_confidence +FindingProviderFieldsCriticality,finding_provider_fields_criticality +FindingProviderFieldsRelatedFindingsId,finding_provider_fields_related_findings_id +FindingProviderFieldsRelatedFindingsProductArn,finding_provider_fields_related_findings_product_arn +FindingProviderFieldsSeverityLabel,finding_provider_fields_severity_label +FindingProviderFieldsSeverityOriginal,finding_provider_fields_severity_original +FindingProviderFieldsTypes,finding_provider_fields_types +FindingProviderSeverity,finding_provider_severity +FindingPublishingFrequency,finding_publishing_frequency +FindingReasonCodes,finding_reason_codes +FindingSource,finding_source +FindingSourceDetail,finding_source_detail +FindingStatisticTypes,finding_statistic_types +FindingStatistics,finding_statistics +FindingStatisticsSortCriteria,finding_statistics_sort_criteria +FindingSummary,finding_summary +FindingTypeAggregation,finding_type_aggregation +FindingTypeAggregationResponse,finding_type_aggregation_response +FindingTypes,finding_types +Findings,findings +FindingsCount,findings_count +FindingsFilterListItem,findings_filter_list_item +FindingsFound,findings_found +FindingsReportSummary,findings_report_summary +FineGrainedAuthorizationEnabled,fine_grained_authorization_enabled +Fingerprint,fingerprint +FinishTime,finish_time +FinishTimeMillis,finish_time_millis +FinishedAt,finished_at +FinishedTime,finished_time +FinishedWorldsSummary,finished_worlds_summary +Fips,fips +FipsDnsName,fips_dns_name +FipsEnabled,fips_enabled +Firehose,firehose +FirehoseAction,firehose_action +FirehoseArn,firehose_arn +FirehoseDestinationConfiguration,firehose_destination_configuration +FirehoseFailureFeedbackRoleArn,firehose_failure_feedback_role_arn +FirehoseLogDelivery,firehose_log_delivery +FirehoseLogDeliveryDescription,firehose_log_delivery_description +FirehoseStream,firehose_stream +FirehoseSuccessFeedbackRoleArn,firehose_success_feedback_role_arn +FirelensConfiguration,firelens_configuration +Firewall,firewall +FirewallArn,firewall_arn +FirewallConfig,firewall_config +FirewallConfigs,firewall_configs +FirewallCreationConfig,firewall_creation_config +FirewallDeploymentModel,firewall_deployment_model +FirewallDomainList,firewall_domain_list +FirewallDomainListId,firewall_domain_list_id +FirewallDomainListMetadata,firewall_domain_list_metadata +FirewallDomainLists,firewall_domain_lists +FirewallEndpoint,firewall_endpoint +FirewallFailOpen,firewall_fail_open +FirewallId,firewall_id +FirewallManagerRuleGroup,firewall_manager_rule_group +FirewallManagerStatement,firewall_manager_statement +FirewallMetadata,firewall_metadata +FirewallName,firewall_name +FirewallPolicies,firewall_policies +FirewallPolicy,firewall_policy +FirewallPolicyArn,firewall_policy_arn +FirewallPolicyChangeProtection,firewall_policy_change_protection +FirewallPolicyDetails,firewall_policy_details +FirewallPolicyId,firewall_policy_id +FirewallPolicyMetadata,firewall_policy_metadata +FirewallPolicyName,firewall_policy_name +FirewallPolicyResponse,firewall_policy_response +FirewallPolicyStatefulRuleGroupReferencesDetails,firewall_policy_stateful_rule_group_references_details +FirewallPolicyStatelessCustomActionsDetails,firewall_policy_stateless_custom_actions_details +FirewallPolicyStatelessRuleGroupReferencesDetails,firewall_policy_stateless_rule_group_references_details +FirewallPolicyStatus,firewall_policy_status +FirewallRule,firewall_rule +FirewallRuleGroup,firewall_rule_group +FirewallRuleGroupAssociation,firewall_rule_group_association +FirewallRuleGroupAssociationId,firewall_rule_group_association_id +FirewallRuleGroupAssociations,firewall_rule_group_associations +FirewallRuleGroupId,firewall_rule_group_id +FirewallRuleGroupMetadata,firewall_rule_group_metadata +FirewallRuleGroupPolicy,firewall_rule_group_policy +FirewallRuleGroups,firewall_rule_groups +FirewallRules,firewall_rules +FirewallStatefulRule,firewall_stateful_rule +FirewallStatelessRule,firewall_stateless_rule +FirewallStatus,firewall_status +FirewallSubnetId,firewall_subnet_id +FirewallSubnetIsOutOfScopeViolation,firewall_subnet_is_out_of_scope_violation +FirewallSubnetMissingVPCEndpointViolation,firewall_subnet_missing_vpc_endpoint_violation +FirewallSubnetRoutes,firewall_subnet_routes +Firewalls,firewalls +FirmwareUpdateImage,firmware_update_image +FirmwareUpdateRole,firmware_update_role +First,first +FirstAccessedTime,first_accessed_time +FirstActivatedTime,first_activated_time +FirstAddress,first_address +FirstBlockToken,first_block_token +FirstEvaluationStarted,first_evaluation_started +FirstExecutionFrom,first_execution_from +FirstName,first_name +FirstObservedAt,first_observed_at +FirstPage,first_page +FirstSchemaVersionNumber,first_schema_version_number +FirstSeen,first_seen +FirstSeenDateTime,first_seen_date_time +FirstSlotStartTime,first_slot_start_time +FirstSlotStartTimeRange,first_slot_start_time_range +FirstSnapshotId,first_snapshot_id +FixAvailable,fix_available +FixedAfd,fixed_afd +FixedGOP,fixed_gop +FixedInVersion,fixed_in_version +FixedModeScheduleActionStartSettings,fixed_mode_schedule_action_start_settings +FixedPrice,fixed_price +FixedRate,fixed_rate +FixedResponseAction,fixed_response_action +FixedResponseActionConfig,fixed_response_action_config +FixedResponseConfig,fixed_response_config +FlacSettings,flac_settings +Flag,flag +FlaggedResources,flagged_resources +Flags,flags +Flat,flat +FlatInvocations,flat_invocations +Fleet,fleet +FleetAdvisorLsaAnalysisResponse,fleet_advisor_lsa_analysis_response +FleetAdvisorSchemaObjectResponse,fleet_advisor_schema_object_response +FleetAdvisorSchemaObjects,fleet_advisor_schema_objects +FleetAdvisorSchemas,fleet_advisor_schemas +FleetArn,fleet_arn +FleetAttributes,fleet_attributes +FleetCapacity,fleet_capacity +FleetCapacityExceededException,fleet_capacity_exceeded_exception +FleetCapacityReservation,fleet_capacity_reservation +FleetCapacityReservations,fleet_capacity_reservations +FleetData,fleet_data +FleetError,fleet_error +FleetErrors,fleet_errors +FleetId,fleet_id +FleetIds,fleet_ids +FleetLaunchTemplateConfig,fleet_launch_template_config +FleetLaunchTemplateConfigRequest,fleet_launch_template_config_request +FleetLaunchTemplateOverrides,fleet_launch_template_overrides +FleetLaunchTemplateOverridesRequest,fleet_launch_template_overrides_request +FleetLaunchTemplateSpecification,fleet_launch_template_specification +FleetLaunchTemplateSpecificationRequest,fleet_launch_template_specification_request +FleetMetricNameAndArn,fleet_metric_name_and_arn +FleetName,fleet_name +FleetSpotCapacityRebalance,fleet_spot_capacity_rebalance +FleetSpotCapacityRebalanceRequest,fleet_spot_capacity_rebalance_request +FleetSpotMaintenanceStrategies,fleet_spot_maintenance_strategies +FleetSpotMaintenanceStrategiesRequest,fleet_spot_maintenance_strategies_request +FleetState,fleet_state +FleetStatus,fleet_status +FleetSummary,fleet_summary +FleetSummaryList,fleet_summary_list +FleetType,fleet_type +FleetUtilization,fleet_utilization +Fleets,fleets +FlexCacheEndpointType,flex_cache_endpoint_type +FlexMatchMode,flex_match_mode +FlexibleTimeWindow,flexible_time_window +FlickerAdaptiveQuantization,flicker_adaptive_quantization +FlickerAq,flicker_aq +FlinkApplicationConfiguration,flink_application_configuration +FlinkApplicationConfigurationDescription,flink_application_configuration_description +FlinkApplicationConfigurationUpdate,flink_application_configuration_update +FlinkRunConfiguration,flink_run_configuration +FlinkRunConfigurationDescription,flink_run_configuration_description +Flow,flow +FlowArn,flow_arn +FlowDefinition,flow_definition +FlowDefinitionArn,flow_definition_arn +FlowDefinitionName,flow_definition_name +FlowDefinitionOutputConfig,flow_definition_output_config +FlowDefinitionStatus,flow_definition_status +FlowDefinitionSummaries,flow_definition_summaries +FlowDefinitionSummary,flow_definition_summary +FlowExecutionMessage,flow_execution_message +FlowExecutionSummary,flow_execution_summary +FlowLog,flow_log +FlowLogId,flow_log_id +FlowLogIds,flow_log_ids +FlowLogStatus,flow_log_status +FlowLogs,flow_logs +FlowLogsConfigurationResult,flow_logs_configuration_result +FlowLogsEnabled,flow_logs_enabled +FlowLogsS3Bucket,flow_logs_s3_bucket +FlowLogsS3Prefix,flow_logs_s3_prefix +FlowName,flow_name +FlowOutput,flow_output +FlowSource,flow_source +FlowSourceArn,flow_source_arn +FlowTemplateDescription,flow_template_description +FlowTemplateFilter,flow_template_filter +FlowTemplateSummary,flow_template_summary +FlowVpcInterfaceAttachment,flow_vpc_interface_attachment +Flows,flows +FlushApiCacheRequest,flush_api_cache_request +FlushStageAuthorizersCacheRequest,flush_stage_authorizers_cache_request +FlushStageCacheRequest,flush_stage_cache_request +FlywheelArn,flywheel_arn +FlywheelFilter,flywheel_filter +FlywheelIterationFilter,flywheel_iteration_filter +FlywheelIterationId,flywheel_iteration_id +FlywheelIterationProperties,flywheel_iteration_properties +FlywheelIterationPropertiesList,flywheel_iteration_properties_list +FlywheelModelEvaluationMetrics,flywheel_model_evaluation_metrics +FlywheelName,flywheel_name +FlywheelProperties,flywheel_properties +FlywheelStatsS3Prefix,flywheel_stats_s3_prefix +FlywheelSummary,flywheel_summary +FlywheelSummaryList,flywheel_summary_list +Fmp4HlsSettings,fmp4_hls_settings +Fmt,fmt +Fmtp,fmtp +FmtpRequest,fmtp_request +Folder,folder +FolderConfiguration,folder_configuration +FolderConfigurations,folder_configurations +FolderContentSizeLimitExceededException,folder_content_size_limit_exceeded_exception +FolderDoesNotExistException,folder_does_not_exist_exception +FolderId,folder_id +FolderIds,folder_ids +FolderList,folder_list +FolderMember,folder_member +FolderMemberList,folder_member_list +FolderMetadata,folder_metadata +FolderPath,folder_path +FolderSearchFilter,folder_search_filter +FolderSummary,folder_summary +FolderSummaryList,folder_summary_list +FolderType,folder_type +Folders,folders +FollowInputIndex,follow_input_index +FollowModeScheduleActionStartSettings,follow_mode_schedule_action_start_settings +FollowPoint,follow_point +FollowUpPrompt,follow_up_prompt +Font,font +FontColor,font_color +FontConfiguration,font_configuration +FontDecoration,font_decoration +FontFamilies,font_families +FontFamily,font_family +FontOpacity,font_opacity +FontResolution,font_resolution +FontScript,font_script +FontSize,font_size +FontStack,font_stack +FontStyle,font_style +FontUnicodeRange,font_unicode_range +FontWeight,font_weight +FooterSections,footer_sections +ForbiddenException,forbidden_exception +Force,force +ForceAliasCreation,force_alias_creation +ForceAssociate,force_associate +ForceCreateJobs,force_create_jobs +ForceDelete,force_delete +ForceDeleteWithoutRecovery,force_delete_without_recovery +ForceDetach,force_detach +ForceFailover,force_failover +ForceFieldPictures,force_field_pictures +ForceIncludeRenditionSize,force_include_rendition_size +ForceIncludeRenditions,force_include_renditions +ForceLobLookup,force_lob_lookup +ForceMove,force_move +ForceOverwriteReplicaSecret,force_overwrite_replica_secret +ForcePlannedFailover,force_planned_failover +ForceTerminate,force_terminate +ForceTsVideoEbpOrder,force_ts_video_ebp_order +ForceUnsubscribeAll,force_unsubscribe_all +ForceUpdate,force_update +ForceUpgradeDate,force_upgrade_date +ForcedApplyDate,forced_apply_date +Forecast,forecast +ForecastArn,forecast_arn +ForecastComputation,forecast_computation +ForecastConfiguration,forecast_configuration +ForecastConfigurations,forecast_configurations +ForecastDataType,forecast_data_type +ForecastDimensions,forecast_dimensions +ForecastExportJobArn,forecast_export_job_arn +ForecastExportJobName,forecast_export_job_name +ForecastExportJobSummary,forecast_export_job_summary +ForecastExportJobs,forecast_export_jobs +ForecastFrequency,forecast_frequency +ForecastHorizon,forecast_horizon +ForecastName,forecast_name +ForecastProperties,forecast_properties +ForecastQuantiles,forecast_quantiles +ForecastResult,forecast_result +ForecastResultsByTime,forecast_results_by_time +ForecastScenario,forecast_scenario +ForecastStatistics,forecast_statistics +ForecastSummary,forecast_summary +ForecastType,forecast_type +ForecastTypes,forecast_types +ForecastedLifetime,forecasted_lifetime +ForecastedSpend,forecasted_spend +Forecasts,forecasts +Foreground,foreground +ForegroundColor,foreground_color +ForgetDeviceRequest,forget_device_request +ForgetSmartHomeAppliancesRequest,forget_smart_home_appliances_request +ForgotPassword,forgot_password +ForgotPasswordLink,forgot_password_link +ForgotPasswordRequest,forgot_password_request +ForgotPasswordResponse,forgot_password_response +Form,form +FormBindingElement,form_binding_element +FormButton,form_button +FormCTA,form_cta +FormDataTypeConfig,form_data_type_config +FormInputBindingPropertiesValue,form_input_binding_properties_value +FormInputBindingPropertiesValueProperties,form_input_binding_properties_value_properties +FormInputValueProperty,form_input_value_property +FormInputValuePropertyBindingProperties,form_input_value_property_binding_properties +FormStyle,form_style +FormSummary,form_summary +Formality,formality +Format,format +FormatConfig,format_config +FormatConfiguration,format_configuration +FormatOptions,format_options +FormatText,format_text +FormatType,format_type +FormatVersion,format_version +Formats,formats +Formatted,formatted +Forward,forward +ForwardAction,forward_action +ForwardActionConfig,forward_action_config +ForwardConfig,forward_config +ForwardPath,forward_path +ForwardPathComponents,forward_path_components +ForwardWhenContentTypeIsUnknown,forward_when_content_type_is_unknown +ForwardWhenQueryArgProfileIsUnknown,forward_when_query_arg_profile_is_unknown +ForwardedIP,forwarded_ip +ForwardedIPConfig,forwarded_ip_config +ForwardedValues,forwarded_values +ForwardingAddressId,forwarding_address_id +ForwardingConfig,forwarding_config +ForwardingEnabled,forwarding_enabled +FoundByItems,found_by_items +FoundByKeyValue,found_by_key_value +FoundationModelDetails,foundation_model_details +FoundationModelSummary,foundation_model_summary +FpgaDeviceInfo,fpga_device_info +FpgaDeviceMemoryInfo,fpga_device_memory_info +FpgaImage,fpga_image +FpgaImageAttribute,fpga_image_attribute +FpgaImageGlobalId,fpga_image_global_id +FpgaImageId,fpga_image_id +FpgaImageIds,fpga_image_ids +FpgaImageState,fpga_image_state +FpgaImages,fpga_images +FpgaInfo,fpga_info +Fpgas,fpgas +Fqdn,fqdn +FractionDigits,fraction_digits +Fragment,fragment +FragmentIntervalMS,fragment_interval_ms +FragmentLength,fragment_length +FragmentLengthControl,fragment_length_control +FragmentLengthInMilliseconds,fragment_length_in_milliseconds +FragmentNumber,fragment_number +FragmentSelector,fragment_selector +FragmentSelectorType,fragment_selector_type +FragmentSizeBytes,fragment_size_bytes +FragmentSizeInBytes,fragment_size_in_bytes +FragmentTime,fragment_time +Fragments,fragments +FrameCaptureCdnSettings,frame_capture_cdn_settings +FrameCaptureGroupSettings,frame_capture_group_settings +FrameCaptureHlsSettings,frame_capture_hls_settings +FrameCaptureOutputSettings,frame_capture_output_settings +FrameCaptureS3Settings,frame_capture_s3_settings +FrameCaptureSettings,frame_capture_settings +FrameHeight,frame_height +FrameMetric,frame_metric +FrameMetricDatum,frame_metric_datum +FrameOption,frame_option +FrameOptions,frame_options +FrameRate,frame_rate +FrameWidth,frame_width +Framerate,framerate +FramerateControl,framerate_control +FramerateConversionAlgorithm,framerate_conversion_algorithm +FramerateDenominator,framerate_denominator +FramerateNumerator,framerate_numerator +Framework,framework +FrameworkArn,framework_arn +FrameworkArns,framework_arns +FrameworkAttributes,framework_attributes +FrameworkConfiguration,framework_configuration +FrameworkControl,framework_control +FrameworkControls,framework_controls +FrameworkDescription,framework_description +FrameworkMetadata,framework_metadata +FrameworkName,framework_name +FrameworkStatus,framework_status +FrameworkTags,framework_tags +FrameworkVersion,framework_version +Frameworks,frameworks +FraudDetectionAction,fraud_detection_action +FraudDetectionConfig,fraud_detection_config +FraudDetectionConfiguration,fraud_detection_configuration +FraudDetectionResult,fraud_detection_result +FraudDetectionResultId,fraud_detection_result_id +FraudRiskDetails,fraud_risk_details +Fraudster,fraudster +FraudsterId,fraudster_id +FraudsterRegistrationJob,fraudster_registration_job +FraudsterRegistrationJobSummary,fraudster_registration_job_summary +FraudsterSimilarityThreshold,fraudster_similarity_threshold +FraudsterSummaries,fraudster_summaries +FraudsterSummary,fraudster_summary +FreeForm,free_form +FreeFormLayout,free_form_layout +FreeFormLayoutCanvasSizeOptions,free_form_layout_canvas_size_options +FreeFormLayoutConfiguration,free_form_layout_configuration +FreeFormLayoutElement,free_form_layout_element +FreeFormLayoutElementBackgroundStyle,free_form_layout_element_background_style +FreeFormLayoutElementBorderStyle,free_form_layout_element_border_style +FreeFormLayoutScreenCanvasSizeOptions,free_form_layout_screen_canvas_size_options +FreeFormSectionLayoutConfiguration,free_form_section_layout_configuration +FreeSpaceBox,free_space_box +FreeTier,free_tier +FreeTierConfig,free_tier_config +FreeTierEligible,free_tier_eligible +FreeTrialAccountInfo,free_trial_account_info +FreeTrialDaysRemaining,free_trial_days_remaining +FreeTrialFeatureConfigurationResult,free_trial_feature_configuration_result +FreeTrialInfo,free_trial_info +FreeTrialInfoError,free_trial_info_error +FreeUntil,free_until +Frequencies,frequencies +Frequency,frequency +FrequencyBandwidth,frequency_bandwidth +FreshStartDate,fresh_start_date +Freshness,freshness +Friday,friday +FriendlyDeviceName,friendly_device_name +FriendlyName,friendly_name +From,from +FromAddress,from_address +FromArn,from_arn +FromDate,from_date +FromDbClusterArn,from_db_cluster_arn +FromEmailAddress,from_email_address +FromEmailAddressIdentityArn,from_email_address_identity_arn +FromEmailAddressNotVerifiedException,from_email_address_not_verified_exception +FromFederationSource,from_federation_source +FromInclusive,from_inclusive +FromPath,from_path +FromPhoneNumber,from_phone_number +FromPort,from_port +FromTime,from_time +FromTimeStamp,from_time_stamp +FromType,from_type +FromValue,from_value +FsxAdminPassword,fsx_admin_password +FsxConfiguration,fsx_configuration +FsxFilesystemArn,fsx_filesystem_arn +FsxProtocol,fsx_protocol +FsxProtocolNfs,fsx_protocol_nfs +FsxProtocolSmb,fsx_protocol_smb +FsxStorageConfiguration,fsx_storage_configuration +FulfilledCapacity,fulfilled_capacity +FulfilledOnDemandCapacity,fulfilled_on_demand_capacity +FulfillmentActivity,fulfillment_activity +FulfillmentCodeHookSettings,fulfillment_code_hook_settings +FulfillmentStartResponseSpecification,fulfillment_start_response_specification +FulfillmentUpdateResponseSpecification,fulfillment_update_response_specification +FulfillmentUpdatesSpecification,fulfillment_updates_specification +FullDocument,full_document +FullLoadCondtnlChkFailedRows,full_load_condtnl_chk_failed_rows +FullLoadEndTime,full_load_end_time +FullLoadErrorPercentage,full_load_error_percentage +FullLoadErrorRows,full_load_error_rows +FullLoadFinishDate,full_load_finish_date +FullLoadProgressPercent,full_load_progress_percent +FullLoadReloaded,full_load_reloaded +FullLoadRows,full_load_rows +FullLoadStartDate,full_load_start_date +FullLoadStartTime,full_load_start_time +FullName,full_name +FullyQualifiedCNAME,fully_qualified_cname +FullyQualifiedDomainName,fully_qualified_domain_name +Function,function +FunctionARN,function_arn +FunctionAlreadyExists,function_already_exists +FunctionArn,function_arn +FunctionArns,function_arns +FunctionArtifactMeta,function_artifact_meta +FunctionAssociation,function_association +FunctionAssociations,function_associations +FunctionCode,function_code +FunctionCodeLocation,function_code_location +FunctionConfig,function_config +FunctionConfiguration,function_configuration +FunctionConfigurationEnvironment,function_configuration_environment +FunctionCount,function_count +FunctionDefaultConfig,function_default_config +FunctionDefaultExecutionConfig,function_default_execution_config +FunctionDefinitionId,function_definition_id +FunctionDefinitionVersion,function_definition_version +FunctionDefinitionVersionArn,function_definition_version_arn +FunctionDefinitionVersionId,function_definition_version_id +FunctionError,function_error +FunctionErrorMessage,function_error_message +FunctionEventInvokeConfig,function_event_invoke_config +FunctionEventInvokeConfigs,function_event_invoke_configs +FunctionExecutionConfig,function_execution_config +FunctionExecutionLogs,function_execution_logs +FunctionInUse,function_in_use +FunctionInput,function_input +FunctionList,function_list +FunctionMetadata,function_metadata +FunctionName,function_name +FunctionOutput,function_output +FunctionPayload,function_payload +FunctionRequest,function_request +FunctionResponse,function_response +FunctionResponseTypes,function_response_types +FunctionRunAsConfig,function_run_as_config +FunctionRuntimeOverride,function_runtime_override +FunctionSizeLimitExceeded,function_size_limit_exceeded +FunctionSummary,function_summary +FunctionUrl,function_url +FunctionUrlAuthType,function_url_auth_type +FunctionUrlConfig,function_url_config +FunctionUrlConfigs,function_url_configs +FunctionVersion,function_version +Functions,functions +FunnelChartAggregatedFieldWells,funnel_chart_aggregated_field_wells +FunnelChartConfiguration,funnel_chart_configuration +FunnelChartDataLabelOptions,funnel_chart_data_label_options +FunnelChartFieldWells,funnel_chart_field_wells +FunnelChartSortConfiguration,funnel_chart_sort_configuration +FunnelChartVisual,funnel_chart_visual +Fuota,fuota +FuotaDeviceStatus,fuota_device_status +FuotaTask,fuota_task +FuotaTaskId,fuota_task_id +FuotaTaskList,fuota_task_list +FuzzyMatching,fuzzy_matching +GATING,gating +GCM,gcm +GCMChannelRequest,gcm_channel_request +GCMChannelResponse,gcm_channel_response +GCMMessage,gcm_message +GE,ge +GPSCoordinates,gps_coordinates +GPSPoint,gps_point +GPSPointDimension,gps_point_dimension +GSTIN,gstin +GT,gt +Gain,gain +Game,game +GameConfiguration,game_configuration +GameConfigurationDetails,game_configuration_details +GameDetails,game_details +GameKey,game_key +GameLiftAwsAccountId,game_lift_aws_account_id +GameLiftServiceSdkEndpoint,game_lift_service_sdk_endpoint +GameLiftVpcId,game_lift_vpc_id +GameName,game_name +GameProperties,game_properties +GameProperty,game_property +GameSdkVersion,game_sdk_version +GameServer,game_server +GameServerData,game_server_data +GameServerGroup,game_server_group +GameServerGroupArn,game_server_group_arn +GameServerGroupAutoScalingPolicy,game_server_group_auto_scaling_policy +GameServerGroupName,game_server_group_name +GameServerGroups,game_server_groups +GameServerId,game_server_id +GameServerInstance,game_server_instance +GameServerInstances,game_server_instances +GameServerProtectionPolicy,game_server_protection_policy +GameServers,game_servers +GameSession,game_session +GameSessionActivationTimeoutSeconds,game_session_activation_timeout_seconds +GameSessionArn,game_session_arn +GameSessionConnectionInfo,game_session_connection_info +GameSessionData,game_session_data +GameSessionDetail,game_session_detail +GameSessionDetails,game_session_details +GameSessionFullException,game_session_full_exception +GameSessionId,game_session_id +GameSessionName,game_session_name +GameSessionPlacement,game_session_placement +GameSessionQueue,game_session_queue +GameSessionQueueArn,game_session_queue_arn +GameSessionQueueArns,game_session_queue_arns +GameSessionQueueDestination,game_session_queue_destination +GameSessionQueueName,game_session_queue_name +GameSessionQueues,game_session_queues +GameSessionRegion,game_session_region +GameSessions,game_sessions +GameSummary,game_summary +Games,games +Gateway,gateway +GatewayARN,gateway_arn +GatewayAdmins,gateway_admins +GatewayArn,gateway_arn +GatewayAssociationState,gateway_association_state +GatewayBridgeSource,gateway_bridge_source +GatewayCapabilitySummary,gateway_capability_summary +GatewayCapacity,gateway_capacity +GatewayDetails,gateway_details +GatewayDisplayName,gateway_display_name +GatewayEui,gateway_eui +GatewayEuiEventTopic,gateway_eui_event_topic +GatewayGroup,gateway_group +GatewayGroupArn,gateway_group_arn +GatewayGroupSummary,gateway_group_summary +GatewayGroups,gateway_groups +GatewayId,gateway_id +GatewayInfo,gateway_info +GatewayInstance,gateway_instance +GatewayInstanceArn,gateway_instance_arn +GatewayList,gateway_list +GatewayListItem,gateway_list_item +GatewayLoadBalancerArns,gateway_load_balancer_arns +GatewayLoadBalancerEndpointId,gateway_load_balancer_endpoint_id +GatewayMessages,gateway_messages +GatewayName,gateway_name +GatewayNetwork,gateway_network +GatewayNetworkInterfaces,gateway_network_interfaces +GatewayOperationalState,gateway_operational_state +GatewayPlatform,gateway_platform +GatewayRegion,gateway_region +GatewayResponse,gateway_response +GatewayResponses,gateway_responses +GatewayRouteData,gateway_route_data +GatewayRouteHostnameMatch,gateway_route_hostname_match +GatewayRouteHostnameRewrite,gateway_route_hostname_rewrite +GatewayRouteRef,gateway_route_ref +GatewayRouteSpec,gateway_route_spec +GatewayRouteStatus,gateway_route_status +GatewayRouteTarget,gateway_route_target +GatewayRouteVirtualService,gateway_route_virtual_service +GatewayState,gateway_state +GatewaySummary,gateway_summary +GatewayTimeoutException,gateway_timeout_exception +GatewayTimezone,gateway_timezone +GatewayType,gateway_type +Gateways,gateways +GatingControls,gating_controls +GatingRule,gating_rule +GatingRuleUpdate,gating_rule_update +GaugeChartArcConditionalFormatting,gauge_chart_arc_conditional_formatting +GaugeChartConditionalFormatting,gauge_chart_conditional_formatting +GaugeChartConditionalFormattingOption,gauge_chart_conditional_formatting_option +GaugeChartConfiguration,gauge_chart_configuration +GaugeChartFieldWells,gauge_chart_field_wells +GaugeChartOptions,gauge_chart_options +GaugeChartPrimaryValueConditionalFormatting,gauge_chart_primary_value_conditional_formatting +GaugeChartVisual,gauge_chart_visual +GcpMySQLSettings,gcp_my_sql_settings +GdgAttributes,gdg_attributes +GdgDetailAttributes,gdg_detail_attributes +GenAppKey,gen_app_key +Gender,gender +GenderString,gender_string +General,general +GeneralFlags,general_flags +GeneralFlagsV2,general_flags_v2 +GeneralFlagsV3,general_flags_v3 +GeneralFlagsV4,general_flags_v4 +GeneralLabels,general_labels +GeneralLabelsSettings,general_labels_settings +GeneralLogGroup,general_log_group +GeneralName,general_name +GeneralServiceException,general_service_exception +Generate,generate +GenerateAccessLogsRequest,generate_access_logs_request +GenerateAccessLogsResult,generate_access_logs_result +GenerateBackendAPIModelsRequest,generate_backend_api_models_request +GenerateBackendAPIModelsResponse,generate_backend_api_models_response +GenerateCandidateDefinitionsOnly,generate_candidate_definitions_only +GenerateCardValidationDataInput,generate_card_validation_data_input +GenerateCardValidationDataOutput,generate_card_validation_data_output +GenerateChangeSetRequest,generate_change_set_request +GenerateChangeSetResponse,generate_change_set_response +GenerateClientCertificateRequest,generate_client_certificate_request +GenerateCredentialReportResponse,generate_credential_report_response +GenerateDataKeyPairRequest,generate_data_key_pair_request +GenerateDataKeyPairResponse,generate_data_key_pair_response +GenerateDataKeyPairWithoutPlaintextRequest,generate_data_key_pair_without_plaintext_request +GenerateDataKeyPairWithoutPlaintextResponse,generate_data_key_pair_without_plaintext_response +GenerateDataKeyRequest,generate_data_key_request +GenerateDataKeyResponse,generate_data_key_response +GenerateDataKeyWithoutPlaintextRequest,generate_data_key_without_plaintext_request +GenerateDataKeyWithoutPlaintextResponse,generate_data_key_without_plaintext_response +GenerateDataSetRequest,generate_data_set_request +GenerateDataSetResult,generate_data_set_result +GenerateEmbedUrlForAnonymousUserRequest,generate_embed_url_for_anonymous_user_request +GenerateEmbedUrlForAnonymousUserResponse,generate_embed_url_for_anonymous_user_response +GenerateEmbedUrlForRegisteredUserRequest,generate_embed_url_for_registered_user_request +GenerateEmbedUrlForRegisteredUserResponse,generate_embed_url_for_registered_user_response +GenerateInferenceId,generate_inference_id +GenerateMacInput,generate_mac_input +GenerateMacOutput,generate_mac_output +GenerateMacRequest,generate_mac_request +GenerateMacResponse,generate_mac_response +GenerateMobileSdkReleaseUrlRequest,generate_mobile_sdk_release_url_request +GenerateMobileSdkReleaseUrlResponse,generate_mobile_sdk_release_url_response +GenerateOrganizationsAccessReportRequest,generate_organizations_access_report_request +GenerateOrganizationsAccessReportResponse,generate_organizations_access_report_response +GeneratePinDataInput,generate_pin_data_input +GeneratePinDataOutput,generate_pin_data_output +GenerateRandomRequest,generate_random_request +GenerateRandomResponse,generate_random_response +GenerateRecommendationsRequest,generate_recommendations_request +GenerateSecret,generate_secret +GenerateServiceLastAccessedDetailsRequest,generate_service_last_accessed_details_request +GenerateServiceLastAccessedDetailsResponse,generate_service_last_accessed_details_response +GenerateTemplateRequest,generate_template_request +GenerateTemplateResponse,generate_template_response +GeneratedBy,generated_by +GeneratedCodeJob,generated_code_job +GeneratedCodeJobDetails,generated_code_job_details +GeneratedCodeJobId,generated_code_job_id +GeneratedCodeJobs,generated_code_jobs +GeneratedFraudsterId,generated_fraudster_id +GeneratedManifestDescriptor,generated_manifest_descriptor +GeneratedManifestEncryption,generated_manifest_encryption +GeneratedPolicy,generated_policy +GeneratedPolicyProperties,generated_policy_properties +GeneratedPolicyResult,generated_policy_result +GeneratedPrefixLocation,generated_prefix_location +GeneratedRulesType,generated_rules_type +GeneratedSpeakerId,generated_speaker_id +GeneratedTime,generated_time +GenerationAttributes,generation_attributes +GenerationCompletionTime,generation_completion_time +GenerationExistsException,generation_exists_exception +GenerationKeyArn,generation_key_arn +GenerationKeyCheckValue,generation_key_check_value +GenerationKeyIdentifier,generation_key_identifier +GenerationQualifier,generation_qualifier +GenerationStartedTime,generation_started_time +GenerationStatus,generation_status +GenerationSummary,generation_summary +GenerationSummaryList,generation_summary_list +GenerationTimestamp,generation_timestamp +Generator,generator +GeneratorDetails,generator_details +GeneratorId,generator_id +GenericAttachment,generic_attachment +GenericKeywords,generic_keywords +GenericRevisionInfo,generic_revision_info +GeoJsonPayload,geo_json_payload +GeoLocation,geo_location +GeoLocationDetails,geo_location_details +GeoLocationDetailsList,geo_location_details_list +GeoMatchConstraint,geo_match_constraint +GeoMatchConstraints,geo_match_constraints +GeoMatchLevel,geo_match_level +GeoMatchParams,geo_match_params +GeoMatchSet,geo_match_set +GeoMatchSetId,geo_match_set_id +GeoMatchSetSummary,geo_match_set_summary +GeoMatchSetUpdate,geo_match_set_update +GeoMatchSets,geo_match_sets +GeoMatchStatement,geo_match_statement +GeoMosaicConfigInput,geo_mosaic_config_input +GeoRestriction,geo_restriction +GeoSpatialColumnGroup,geo_spatial_column_group +GeofenceGeometry,geofence_geometry +GeofenceId,geofence_id +GeofenceIds,geofence_ids +GeofenceProperties,geofence_properties +GeographicRole,geographic_role +GeolocationFormat,geolocation_format +Geometry,geometry +GeometryOffset,geometry_offset +Geospatial,geospatial +GeospatialCoordinateBounds,geospatial_coordinate_bounds +GeospatialHeatmapColorScale,geospatial_heatmap_color_scale +GeospatialHeatmapConfiguration,geospatial_heatmap_configuration +GeospatialHeatmapDataColor,geospatial_heatmap_data_color +GeospatialMapAggregatedFieldWells,geospatial_map_aggregated_field_wells +GeospatialMapConfiguration,geospatial_map_configuration +GeospatialMapFieldWells,geospatial_map_field_wells +GeospatialMapStyleOptions,geospatial_map_style_options +GeospatialMapVisual,geospatial_map_visual +GeospatialPointStyleOptions,geospatial_point_style_options +GeospatialWindowOptions,geospatial_window_options +GeranCid,geran_cid +Get,get +GetAWSDefaultServiceQuotaRequest,get_aws_default_service_quota_request +GetAWSDefaultServiceQuotaResponse,get_aws_default_service_quota_response +GetAWSOrganizationsAccessStatusOutput,get_aws_organizations_access_status_output +GetAccessControlEffectRequest,get_access_control_effect_request +GetAccessControlEffectResponse,get_access_control_effect_response +GetAccessKeyInfoRequest,get_access_key_info_request +GetAccessKeyInfoResponse,get_access_key_info_response +GetAccessKeyLastUsedRequest,get_access_key_last_used_request +GetAccessKeyLastUsedResponse,get_access_key_last_used_response +GetAccessLogSubscriptionRequest,get_access_log_subscription_request +GetAccessLogSubscriptionResponse,get_access_log_subscription_response +GetAccessPointConfigurationForObjectLambdaRequest,get_access_point_configuration_for_object_lambda_request +GetAccessPointConfigurationForObjectLambdaResult,get_access_point_configuration_for_object_lambda_result +GetAccessPointForObjectLambdaRequest,get_access_point_for_object_lambda_request +GetAccessPointForObjectLambdaResult,get_access_point_for_object_lambda_result +GetAccessPointPolicyForObjectLambdaRequest,get_access_point_policy_for_object_lambda_request +GetAccessPointPolicyForObjectLambdaResult,get_access_point_policy_for_object_lambda_result +GetAccessPointPolicyRequest,get_access_point_policy_request +GetAccessPointPolicyResult,get_access_point_policy_result +GetAccessPointPolicyStatusForObjectLambdaRequest,get_access_point_policy_status_for_object_lambda_request +GetAccessPointPolicyStatusForObjectLambdaResult,get_access_point_policy_status_for_object_lambda_result +GetAccessPointPolicyStatusRequest,get_access_point_policy_status_request +GetAccessPointPolicyStatusResult,get_access_point_policy_status_result +GetAccessPointRequest,get_access_point_request +GetAccessPointResult,get_access_point_result +GetAccessPolicyRequest,get_access_policy_request +GetAccessPolicyResponse,get_access_policy_response +GetAccessPreviewRequest,get_access_preview_request +GetAccessPreviewResponse,get_access_preview_response +GetAccessTokenRequest,get_access_token_request +GetAccessTokenResponse,get_access_token_response +GetAccessorInput,get_accessor_input +GetAccessorOutput,get_accessor_output +GetAccountAliasResult,get_account_alias_result +GetAccountAuthorizationDetailsRequest,get_account_authorization_details_request +GetAccountAuthorizationDetailsResponse,get_account_authorization_details_response +GetAccountBalanceResponse,get_account_balance_response +GetAccountConfigurationResponse,get_account_configuration_response +GetAccountLimitRequest,get_account_limit_request +GetAccountLimitResponse,get_account_limit_response +GetAccountPasswordPolicyResponse,get_account_password_policy_response +GetAccountRequest,get_account_request +GetAccountResponse,get_account_response +GetAccountSendingEnabledResponse,get_account_sending_enabled_response +GetAccountSettingsOutput,get_account_settings_output +GetAccountSettingsRequest,get_account_settings_request +GetAccountSettingsResponse,get_account_settings_response +GetAccountSettingsResult,get_account_settings_result +GetAccountStatusResponse,get_account_status_response +GetAccountSummaryResponse,get_account_summary_response +GetAccuracyMetricsRequest,get_accuracy_metrics_request +GetAccuracyMetricsResponse,get_accuracy_metrics_response +GetActionRequest,get_action_request +GetActionResponse,get_action_response +GetActionTypeInput,get_action_type_input +GetActionTypeOutput,get_action_type_output +GetActiveNamesRequest,get_active_names_request +GetActiveNamesResult,get_active_names_result +GetActivityTaskInput,get_activity_task_input +GetActivityTaskOutput,get_activity_task_output +GetAddressBookRequest,get_address_book_request +GetAddressBookResponse,get_address_book_response +GetAdmChannelRequest,get_adm_channel_request +GetAdmChannelResponse,get_adm_channel_response +GetAdminAccountResponse,get_admin_account_response +GetAdminScopeRequest,get_admin_scope_request +GetAdminScopeResponse,get_admin_scope_response +GetAdministratorAccountRequest,get_administrator_account_request +GetAdministratorAccountResponse,get_administrator_account_response +GetAgentConfigurationRequest,get_agent_configuration_request +GetAgentConfigurationResponse,get_agent_configuration_response +GetAggregateComplianceDetailsByConfigRuleRequest,get_aggregate_compliance_details_by_config_rule_request +GetAggregateComplianceDetailsByConfigRuleResponse,get_aggregate_compliance_details_by_config_rule_response +GetAggregateConfigRuleComplianceSummaryRequest,get_aggregate_config_rule_compliance_summary_request +GetAggregateConfigRuleComplianceSummaryResponse,get_aggregate_config_rule_compliance_summary_response +GetAggregateConformancePackComplianceSummaryRequest,get_aggregate_conformance_pack_compliance_summary_request +GetAggregateConformancePackComplianceSummaryResponse,get_aggregate_conformance_pack_compliance_summary_response +GetAggregateDiscoveredResourceCountsRequest,get_aggregate_discovered_resource_counts_request +GetAggregateDiscoveredResourceCountsResponse,get_aggregate_discovered_resource_counts_response +GetAggregateResourceConfigRequest,get_aggregate_resource_config_request +GetAggregateResourceConfigResponse,get_aggregate_resource_config_response +GetAlarmsRequest,get_alarms_request +GetAlarmsResult,get_alarms_result +GetAliasInput,get_alias_input +GetAliasOutput,get_alias_output +GetAliasRequest,get_alias_request +GetAllowListRequest,get_allow_list_request +GetAllowListResponse,get_allow_list_response +GetAlternateContactRequest,get_alternate_contact_request +GetAlternateContactResponse,get_alternate_contact_response +GetAnalysisTemplateInput,get_analysis_template_input +GetAnalysisTemplateOutput,get_analysis_template_output +GetAnalyzedResourceRequest,get_analyzed_resource_request +GetAnalyzedResourceResponse,get_analyzed_resource_response +GetAnalyzerRequest,get_analyzer_request +GetAnalyzerResponse,get_analyzer_response +GetAnnotationImportRequest,get_annotation_import_request +GetAnnotationImportResponse,get_annotation_import_response +GetAnnotationStoreRequest,get_annotation_store_request +GetAnnotationStoreResponse,get_annotation_store_response +GetAnnotationStoreVersionRequest,get_annotation_store_version_request +GetAnnotationStoreVersionResponse,get_annotation_store_version_response +GetAnomaliesRequest,get_anomalies_request +GetAnomaliesResponse,get_anomalies_response +GetAnomalyGroupRequest,get_anomaly_group_request +GetAnomalyGroupResponse,get_anomaly_group_response +GetAnomalyMonitorsRequest,get_anomaly_monitors_request +GetAnomalyMonitorsResponse,get_anomaly_monitors_response +GetAnomalySubscriptionsRequest,get_anomaly_subscriptions_request +GetAnomalySubscriptionsResponse,get_anomaly_subscriptions_response +GetAnswerInput,get_answer_input +GetAnswerOutput,get_answer_output +GetApiAssociationRequest,get_api_association_request +GetApiAssociationResponse,get_api_association_response +GetApiCacheRequest,get_api_cache_request +GetApiCacheResponse,get_api_cache_response +GetApiKeyRequest,get_api_key_request +GetApiKeysRequest,get_api_keys_request +GetApiMappingRequest,get_api_mapping_request +GetApiMappingResponse,get_api_mapping_response +GetApiMappingsRequest,get_api_mappings_request +GetApiMappingsResponse,get_api_mappings_response +GetApiRequest,get_api_request +GetApiResponse,get_api_response +GetApisRequest,get_apis_request +GetApisResponse,get_apis_response +GetApnsChannelRequest,get_apns_channel_request +GetApnsChannelResponse,get_apns_channel_response +GetApnsSandboxChannelRequest,get_apns_sandbox_channel_request +GetApnsSandboxChannelResponse,get_apns_sandbox_channel_response +GetApnsVoipChannelRequest,get_apns_voip_channel_request +GetApnsVoipChannelResponse,get_apns_voip_channel_response +GetApnsVoipSandboxChannelRequest,get_apns_voip_sandbox_channel_request +GetApnsVoipSandboxChannelResponse,get_apns_voip_sandbox_channel_response +GetAppAuthorizationRequest,get_app_authorization_request +GetAppAuthorizationResponse,get_app_authorization_response +GetAppBundleRequest,get_app_bundle_request +GetAppBundleResponse,get_app_bundle_response +GetAppInstanceRetentionSettingsRequest,get_app_instance_retention_settings_request +GetAppInstanceRetentionSettingsResponse,get_app_instance_retention_settings_response +GetAppInstanceStreamingConfigurationsRequest,get_app_instance_streaming_configurations_request +GetAppInstanceStreamingConfigurationsResponse,get_app_instance_streaming_configurations_response +GetAppLaunchConfigurationRequest,get_app_launch_configuration_request +GetAppLaunchConfigurationResponse,get_app_launch_configuration_response +GetAppMonitorDataRequest,get_app_monitor_data_request +GetAppMonitorDataResponse,get_app_monitor_data_response +GetAppMonitorRequest,get_app_monitor_request +GetAppMonitorResponse,get_app_monitor_response +GetAppReplicationConfigurationRequest,get_app_replication_configuration_request +GetAppReplicationConfigurationResponse,get_app_replication_configuration_response +GetAppRequest,get_app_request +GetAppResponse,get_app_response +GetAppResult,get_app_result +GetAppValidationConfigurationRequest,get_app_validation_configuration_request +GetAppValidationConfigurationResponse,get_app_validation_configuration_response +GetAppValidationOutputRequest,get_app_validation_output_request +GetAppValidationOutputResponse,get_app_validation_output_response +GetApplicationComponentDetailsRequest,get_application_component_details_request +GetApplicationComponentDetailsResponse,get_application_component_details_response +GetApplicationComponentStrategiesRequest,get_application_component_strategies_request +GetApplicationComponentStrategiesResponse,get_application_component_strategies_response +GetApplicationDateRangeKpiRequest,get_application_date_range_kpi_request +GetApplicationDateRangeKpiResponse,get_application_date_range_kpi_response +GetApplicationInput,get_application_input +GetApplicationOutput,get_application_output +GetApplicationPolicyRequest,get_application_policy_request +GetApplicationPolicyResponse,get_application_policy_response +GetApplicationRequest,get_application_request +GetApplicationResponse,get_application_response +GetApplicationRevisionInput,get_application_revision_input +GetApplicationRevisionOutput,get_application_revision_output +GetApplicationSettingsRequest,get_application_settings_request +GetApplicationSettingsResponse,get_application_settings_response +GetApplicationVersionRequest,get_application_version_request +GetApplicationVersionResponse,get_application_version_response +GetAppliedSchemaVersionRequest,get_applied_schema_version_request +GetAppliedSchemaVersionResponse,get_applied_schema_version_response +GetApprovalRuleTemplateInput,get_approval_rule_template_input +GetApprovalRuleTemplateOutput,get_approval_rule_template_output +GetAppsListRequest,get_apps_list_request +GetAppsListResponse,get_apps_list_response +GetAppsRequest,get_apps_request +GetAppsResponse,get_apps_response +GetArchitectureRecommendationsRequest,get_architecture_recommendations_request +GetArchitectureRecommendationsResponse,get_architecture_recommendations_response +GetArchiveRuleRequest,get_archive_rule_request +GetArchiveRuleResponse,get_archive_rule_response +GetArtifactUrlRequest,get_artifact_url_request +GetArtifactUrlResult,get_artifact_url_result +GetAssessmentFrameworkRequest,get_assessment_framework_request +GetAssessmentFrameworkResponse,get_assessment_framework_response +GetAssessmentReportRequest,get_assessment_report_request +GetAssessmentReportResponse,get_assessment_report_response +GetAssessmentReportUrlRequest,get_assessment_report_url_request +GetAssessmentReportUrlResponse,get_assessment_report_url_response +GetAssessmentRequest,get_assessment_request +GetAssessmentResponse,get_assessment_response +GetAssetPropertyAggregatesRequest,get_asset_property_aggregates_request +GetAssetPropertyAggregatesResponse,get_asset_property_aggregates_response +GetAssetPropertyValueHistoryRequest,get_asset_property_value_history_request +GetAssetPropertyValueHistoryResponse,get_asset_property_value_history_response +GetAssetPropertyValueRequest,get_asset_property_value_request +GetAssetPropertyValueResponse,get_asset_property_value_response +GetAssetRequest,get_asset_request +GetAssetResponse,get_asset_response +GetAssignmentRequest,get_assignment_request +GetAssignmentResponse,get_assignment_response +GetAssistantAssociationRequest,get_assistant_association_request +GetAssistantAssociationResponse,get_assistant_association_response +GetAssistantRequest,get_assistant_request +GetAssistantResponse,get_assistant_response +GetAssociatedEnclaveCertificateIamRolesRequest,get_associated_enclave_certificate_iam_roles_request +GetAssociatedEnclaveCertificateIamRolesResult,get_associated_enclave_certificate_iam_roles_result +GetAssociatedIpv6PoolCidrsRequest,get_associated_ipv6_pool_cidrs_request +GetAssociatedIpv6PoolCidrsResult,get_associated_ipv6_pool_cidrs_result +GetAssociatedResourceRequest,get_associated_resource_request +GetAssociatedResourceResponse,get_associated_resource_response +GetAssociatedRoleRequest,get_associated_role_request +GetAssociatedRoleResponse,get_associated_role_response +GetAssociationForServiceQuotaTemplateResponse,get_association_for_service_quota_template_response +GetAttachmentRequest,get_attachment_request +GetAttachmentResponse,get_attachment_response +GetAttendeeRequest,get_attendee_request +GetAttendeeResponse,get_attendee_response +GetAttributeGroupRequest,get_attribute_group_request +GetAttributeGroupResponse,get_attribute_group_response +GetAttributeValuesRequest,get_attribute_values_request +GetAttributeValuesResponse,get_attribute_values_response +GetAuthPolicyRequest,get_auth_policy_request +GetAuthPolicyResponse,get_auth_policy_response +GetAuthorizationTokenRequest,get_authorization_token_request +GetAuthorizationTokenResponse,get_authorization_token_response +GetAuthorizationTokenResult,get_authorization_token_result +GetAuthorizerRequest,get_authorizer_request +GetAuthorizerResponse,get_authorizer_response +GetAuthorizersRequest,get_authorizers_request +GetAuthorizersResponse,get_authorizers_response +GetAutoMergingPreviewRequest,get_auto_merging_preview_request +GetAutoMergingPreviewResponse,get_auto_merging_preview_response +GetAutoScalingGroupRecommendationsRequest,get_auto_scaling_group_recommendations_request +GetAutoScalingGroupRecommendationsResponse,get_auto_scaling_group_recommendations_response +GetAutoSnapshotsRequest,get_auto_snapshots_request +GetAutoSnapshotsResult,get_auto_snapshots_result +GetAutoTerminationPolicyInput,get_auto_termination_policy_input +GetAutoTerminationPolicyOutput,get_auto_termination_policy_output +GetAutomatedDiscoveryConfigurationResponse,get_automated_discovery_configuration_response +GetAutomationExecutionRequest,get_automation_execution_request +GetAutomationExecutionResult,get_automation_execution_result +GetAwsNetworkPerformanceDataRequest,get_aws_network_performance_data_request +GetAwsNetworkPerformanceDataResult,get_aws_network_performance_data_result +GetBackendAPIModelsRequest,get_backend_api_models_request +GetBackendAPIModelsResponse,get_backend_api_models_response +GetBackendAPIRequest,get_backend_api_request +GetBackendAPIResponse,get_backend_api_response +GetBackendAuthRequest,get_backend_auth_request +GetBackendAuthResponse,get_backend_auth_response +GetBackendEnvironmentRequest,get_backend_environment_request +GetBackendEnvironmentResult,get_backend_environment_result +GetBackendJobRequest,get_backend_job_request +GetBackendJobResponse,get_backend_job_response +GetBackendRequest,get_backend_request +GetBackendResponse,get_backend_response +GetBackendStorageRequest,get_backend_storage_request +GetBackendStorageResourceConfig,get_backend_storage_resource_config +GetBackendStorageResponse,get_backend_storage_response +GetBackupPlanFromJSONInput,get_backup_plan_from_json_input +GetBackupPlanFromJSONOutput,get_backup_plan_from_json_output +GetBackupPlanFromTemplateInput,get_backup_plan_from_template_input +GetBackupPlanFromTemplateOutput,get_backup_plan_from_template_output +GetBackupPlanInput,get_backup_plan_input +GetBackupPlanOutput,get_backup_plan_output +GetBackupSelectionInput,get_backup_selection_input +GetBackupSelectionOutput,get_backup_selection_output +GetBackupVaultAccessPolicyInput,get_backup_vault_access_policy_input +GetBackupVaultAccessPolicyOutput,get_backup_vault_access_policy_output +GetBackupVaultNotificationsInput,get_backup_vault_notifications_input +GetBackupVaultNotificationsOutput,get_backup_vault_notifications_output +GetBaiduChannelRequest,get_baidu_channel_request +GetBaiduChannelResponse,get_baidu_channel_response +GetBandwidthRateLimitScheduleInput,get_bandwidth_rate_limit_schedule_input +GetBandwidthRateLimitScheduleOutput,get_bandwidth_rate_limit_schedule_output +GetBasePathMappingRequest,get_base_path_mapping_request +GetBasePathMappingsRequest,get_base_path_mappings_request +GetBatchImportJobsRequest,get_batch_import_jobs_request +GetBatchImportJobsResult,get_batch_import_jobs_result +GetBatchJobExecutionRequest,get_batch_job_execution_request +GetBatchJobExecutionResponse,get_batch_job_execution_response +GetBatchPredictionInput,get_batch_prediction_input +GetBatchPredictionJobsRequest,get_batch_prediction_jobs_request +GetBatchPredictionJobsResult,get_batch_prediction_jobs_result +GetBatchPredictionOutput,get_batch_prediction_output +GetBehaviorModelTrainingSummariesRequest,get_behavior_model_training_summaries_request +GetBehaviorModelTrainingSummariesResponse,get_behavior_model_training_summaries_response +GetBlacklistReportsRequest,get_blacklist_reports_request +GetBlacklistReportsResponse,get_blacklist_reports_response +GetBlobInput,get_blob_input +GetBlobOutput,get_blob_output +GetBlockPublicAccessConfigurationOutput,get_block_public_access_configuration_output +GetBlockRequest,get_block_request +GetBlockResponse,get_block_response +GetBlueprintRequest,get_blueprint_request +GetBlueprintResponse,get_blueprint_response +GetBlueprintRunRequest,get_blueprint_run_request +GetBlueprintRunResponse,get_blueprint_run_response +GetBlueprintRunsRequest,get_blueprint_runs_request +GetBlueprintRunsResponse,get_blueprint_runs_response +GetBlueprintsRequest,get_blueprints_request +GetBlueprintsResult,get_blueprints_result +GetBootstrapBrokersRequest,get_bootstrap_brokers_request +GetBootstrapBrokersResponse,get_bootstrap_brokers_response +GetBotAliasRequest,get_bot_alias_request +GetBotAliasResponse,get_bot_alias_response +GetBotAliasesRequest,get_bot_aliases_request +GetBotAliasesResponse,get_bot_aliases_response +GetBotChannelAssociationRequest,get_bot_channel_association_request +GetBotChannelAssociationResponse,get_bot_channel_association_response +GetBotChannelAssociationsRequest,get_bot_channel_associations_request +GetBotChannelAssociationsResponse,get_bot_channel_associations_response +GetBotRequest,get_bot_request +GetBotResponse,get_bot_response +GetBotVersionsRequest,get_bot_versions_request +GetBotVersionsResponse,get_bot_versions_response +GetBotsRequest,get_bots_request +GetBotsResponse,get_bots_response +GetBranchInput,get_branch_input +GetBranchOutput,get_branch_output +GetBranchRequest,get_branch_request +GetBranchResult,get_branch_result +GetBrowserSettingsRequest,get_browser_settings_request +GetBrowserSettingsResponse,get_browser_settings_response +GetBucketAccelerateConfigurationOutput,get_bucket_accelerate_configuration_output +GetBucketAccelerateConfigurationRequest,get_bucket_accelerate_configuration_request +GetBucketAccessKeysRequest,get_bucket_access_keys_request +GetBucketAccessKeysResult,get_bucket_access_keys_result +GetBucketAclOutput,get_bucket_acl_output +GetBucketAclRequest,get_bucket_acl_request +GetBucketAnalyticsConfigurationOutput,get_bucket_analytics_configuration_output +GetBucketAnalyticsConfigurationRequest,get_bucket_analytics_configuration_request +GetBucketBundlesRequest,get_bucket_bundles_request +GetBucketBundlesResult,get_bucket_bundles_result +GetBucketCorsOutput,get_bucket_cors_output +GetBucketCorsRequest,get_bucket_cors_request +GetBucketEncryptionOutput,get_bucket_encryption_output +GetBucketEncryptionRequest,get_bucket_encryption_request +GetBucketIntelligentTieringConfigurationOutput,get_bucket_intelligent_tiering_configuration_output +GetBucketIntelligentTieringConfigurationRequest,get_bucket_intelligent_tiering_configuration_request +GetBucketInventoryConfigurationOutput,get_bucket_inventory_configuration_output +GetBucketInventoryConfigurationRequest,get_bucket_inventory_configuration_request +GetBucketLifecycleConfigurationOutput,get_bucket_lifecycle_configuration_output +GetBucketLifecycleConfigurationRequest,get_bucket_lifecycle_configuration_request +GetBucketLifecycleConfigurationResult,get_bucket_lifecycle_configuration_result +GetBucketLocationOutput,get_bucket_location_output +GetBucketLocationRequest,get_bucket_location_request +GetBucketLoggingOutput,get_bucket_logging_output +GetBucketLoggingRequest,get_bucket_logging_request +GetBucketMetricDataRequest,get_bucket_metric_data_request +GetBucketMetricDataResult,get_bucket_metric_data_result +GetBucketMetricsConfigurationOutput,get_bucket_metrics_configuration_output +GetBucketMetricsConfigurationRequest,get_bucket_metrics_configuration_request +GetBucketNotificationConfigurationRequest,get_bucket_notification_configuration_request +GetBucketOwnershipControlsOutput,get_bucket_ownership_controls_output +GetBucketOwnershipControlsRequest,get_bucket_ownership_controls_request +GetBucketPolicyOutput,get_bucket_policy_output +GetBucketPolicyRequest,get_bucket_policy_request +GetBucketPolicyResult,get_bucket_policy_result +GetBucketPolicyStatusOutput,get_bucket_policy_status_output +GetBucketPolicyStatusRequest,get_bucket_policy_status_request +GetBucketReplicationOutput,get_bucket_replication_output +GetBucketReplicationRequest,get_bucket_replication_request +GetBucketReplicationResult,get_bucket_replication_result +GetBucketRequest,get_bucket_request +GetBucketRequestPaymentOutput,get_bucket_request_payment_output +GetBucketRequestPaymentRequest,get_bucket_request_payment_request +GetBucketResult,get_bucket_result +GetBucketStatisticsRequest,get_bucket_statistics_request +GetBucketStatisticsResponse,get_bucket_statistics_response +GetBucketTaggingOutput,get_bucket_tagging_output +GetBucketTaggingRequest,get_bucket_tagging_request +GetBucketTaggingResult,get_bucket_tagging_result +GetBucketVersioningOutput,get_bucket_versioning_output +GetBucketVersioningRequest,get_bucket_versioning_request +GetBucketVersioningResult,get_bucket_versioning_result +GetBucketWebsiteOutput,get_bucket_website_output +GetBucketWebsiteRequest,get_bucket_website_request +GetBucketsAggregationRequest,get_buckets_aggregation_request +GetBucketsAggregationResponse,get_buckets_aggregation_response +GetBucketsRequest,get_buckets_request +GetBucketsResult,get_buckets_result +GetBuiltinIntentRequest,get_builtin_intent_request +GetBuiltinIntentResponse,get_builtin_intent_response +GetBuiltinIntentsRequest,get_builtin_intents_request +GetBuiltinIntentsResponse,get_builtin_intents_response +GetBuiltinSlotTypesRequest,get_builtin_slot_types_request +GetBuiltinSlotTypesResponse,get_builtin_slot_types_response +GetBulkDeploymentStatusRequest,get_bulk_deployment_status_request +GetBulkDeploymentStatusResponse,get_bulk_deployment_status_response +GetBulkPublishDetailsRequest,get_bulk_publish_details_request +GetBulkPublishDetailsResponse,get_bulk_publish_details_response +GetBundlesRequest,get_bundles_request +GetBundlesResult,get_bundles_result +GetByteMatchSetRequest,get_byte_match_set_request +GetByteMatchSetResponse,get_byte_match_set_response +GetCSVHeaderRequest,get_csv_header_request +GetCSVHeaderResponse,get_csv_header_response +GetCachePolicyConfigRequest,get_cache_policy_config_request +GetCachePolicyConfigResult,get_cache_policy_config_result +GetCachePolicyRequest,get_cache_policy_request +GetCachePolicyResult,get_cache_policy_result +GetCalculatedAttributeDefinitionRequest,get_calculated_attribute_definition_request +GetCalculatedAttributeDefinitionResponse,get_calculated_attribute_definition_response +GetCalculatedAttributeForProfileRequest,get_calculated_attribute_for_profile_request +GetCalculatedAttributeForProfileResponse,get_calculated_attribute_for_profile_response +GetCalculationExecutionCodeRequest,get_calculation_execution_code_request +GetCalculationExecutionCodeResponse,get_calculation_execution_code_response +GetCalculationExecutionRequest,get_calculation_execution_request +GetCalculationExecutionResponse,get_calculation_execution_response +GetCalculationExecutionStatusRequest,get_calculation_execution_status_request +GetCalculationExecutionStatusResponse,get_calculation_execution_status_response +GetCalendarStateRequest,get_calendar_state_request +GetCalendarStateResponse,get_calendar_state_response +GetCallAnalyticsCategoryRequest,get_call_analytics_category_request +GetCallAnalyticsCategoryResponse,get_call_analytics_category_response +GetCallAnalyticsJobRequest,get_call_analytics_job_request +GetCallAnalyticsJobResponse,get_call_analytics_job_response +GetCallerIdentityResponse,get_caller_identity_response +GetCampaignActivitiesRequest,get_campaign_activities_request +GetCampaignActivitiesResponse,get_campaign_activities_response +GetCampaignDateRangeKpiRequest,get_campaign_date_range_kpi_request +GetCampaignDateRangeKpiResponse,get_campaign_date_range_kpi_response +GetCampaignRequest,get_campaign_request +GetCampaignResponse,get_campaign_response +GetCampaignStateBatchRequest,get_campaign_state_batch_request +GetCampaignStateBatchResponse,get_campaign_state_batch_response +GetCampaignStateRequest,get_campaign_state_request +GetCampaignStateResponse,get_campaign_state_response +GetCampaignVersionRequest,get_campaign_version_request +GetCampaignVersionResponse,get_campaign_version_response +GetCampaignVersionsRequest,get_campaign_versions_request +GetCampaignVersionsResponse,get_campaign_versions_response +GetCampaignsRequest,get_campaigns_request +GetCampaignsResponse,get_campaigns_response +GetCanaryRequest,get_canary_request +GetCanaryResponse,get_canary_response +GetCanaryRunsRequest,get_canary_runs_request +GetCanaryRunsResponse,get_canary_runs_response +GetCapacityAssignmentConfigurationInput,get_capacity_assignment_configuration_input +GetCapacityAssignmentConfigurationOutput,get_capacity_assignment_configuration_output +GetCapacityReservationInput,get_capacity_reservation_input +GetCapacityReservationOutput,get_capacity_reservation_output +GetCapacityReservationUsageRequest,get_capacity_reservation_usage_request +GetCapacityReservationUsageResult,get_capacity_reservation_usage_result +GetCardinalityRequest,get_cardinality_request +GetCardinalityResponse,get_cardinality_response +GetCaseEventConfigurationRequest,get_case_event_configuration_request +GetCaseEventConfigurationResponse,get_case_event_configuration_response +GetCaseRequest,get_case_request +GetCaseResponse,get_case_response +GetCatalogImportStatusRequest,get_catalog_import_status_request +GetCatalogImportStatusResponse,get_catalog_import_status_response +GetCatalogItemInput,get_catalog_item_input +GetCatalogItemOutput,get_catalog_item_output +GetCelebrityInfoRequest,get_celebrity_info_request +GetCelebrityInfoResponse,get_celebrity_info_response +GetCelebrityRecognitionRequest,get_celebrity_recognition_request +GetCelebrityRecognitionResponse,get_celebrity_recognition_response +GetCellReadinessSummaryRequest,get_cell_readiness_summary_request +GetCellReadinessSummaryResponse,get_cell_readiness_summary_response +GetCellRequest,get_cell_request +GetCellResponse,get_cell_response +GetCertificateAuthorityCertificateRequest,get_certificate_authority_certificate_request +GetCertificateAuthorityCertificateResponse,get_certificate_authority_certificate_response +GetCertificateAuthorityCsrRequest,get_certificate_authority_csr_request +GetCertificateAuthorityCsrResponse,get_certificate_authority_csr_response +GetCertificateRequest,get_certificate_request +GetCertificateResponse,get_certificate_response +GetCertificatesRequest,get_certificates_request +GetCertificatesResult,get_certificates_result +GetChangeLogsRequest,get_change_logs_request +GetChangeLogsResponse,get_change_logs_response +GetChangeRequest,get_change_request +GetChangeResponse,get_change_response +GetChangeTokenResponse,get_change_token_response +GetChangeTokenStatusRequest,get_change_token_status_request +GetChangeTokenStatusResponse,get_change_token_status_response +GetChangesetRequest,get_changeset_request +GetChangesetResponse,get_changeset_response +GetChannelGroupRequest,get_channel_group_request +GetChannelGroupResponse,get_channel_group_response +GetChannelMembershipPreferencesRequest,get_channel_membership_preferences_request +GetChannelMembershipPreferencesResponse,get_channel_membership_preferences_response +GetChannelMessageRequest,get_channel_message_request +GetChannelMessageResponse,get_channel_message_response +GetChannelMessageStatusRequest,get_channel_message_status_request +GetChannelMessageStatusResponse,get_channel_message_status_response +GetChannelPolicyRequest,get_channel_policy_request +GetChannelPolicyResponse,get_channel_policy_response +GetChannelRequest,get_channel_request +GetChannelResponse,get_channel_response +GetChannelScheduleRequest,get_channel_schedule_request +GetChannelScheduleResponse,get_channel_schedule_response +GetChannelsRequest,get_channels_request +GetChannelsResponse,get_channels_response +GetCheckerIpRangesResponse,get_checker_ip_ranges_response +GetChunkInput,get_chunk_input +GetChunkOutput,get_chunk_output +GetClassificationExportConfigurationResponse,get_classification_export_configuration_response +GetClassificationScopeRequest,get_classification_scope_request +GetClassificationScopeResponse,get_classification_scope_response +GetClassifierRequest,get_classifier_request +GetClassifierResponse,get_classifier_response +GetClassifiersRequest,get_classifiers_request +GetClassifiersResponse,get_classifiers_response +GetClientCertificateRequest,get_client_certificate_request +GetClientCertificatesRequest,get_client_certificates_request +GetClipInput,get_clip_input +GetClipOutput,get_clip_output +GetCloudFormationStackRecordsRequest,get_cloud_formation_stack_records_request +GetCloudFormationStackRecordsResult,get_cloud_formation_stack_records_result +GetCloudFormationTemplateRequest,get_cloud_formation_template_request +GetCloudFormationTemplateResponse,get_cloud_formation_template_response +GetCloudFrontOriginAccessIdentityConfigRequest,get_cloud_front_origin_access_identity_config_request +GetCloudFrontOriginAccessIdentityConfigResult,get_cloud_front_origin_access_identity_config_result +GetCloudFrontOriginAccessIdentityRequest,get_cloud_front_origin_access_identity_request +GetCloudFrontOriginAccessIdentityResult,get_cloud_front_origin_access_identity_result +GetClusterCredentialsMessage,get_cluster_credentials_message +GetClusterCredentialsWithIAMMessage,get_cluster_credentials_with_iam_message +GetClusterInput,get_cluster_input +GetClusterOutput,get_cluster_output +GetClusterPolicyRequest,get_cluster_policy_request +GetClusterPolicyResponse,get_cluster_policy_response +GetClusterSessionCredentialsInput,get_cluster_session_credentials_input +GetClusterSessionCredentialsOutput,get_cluster_session_credentials_output +GetClusterSnapshotInput,get_cluster_snapshot_input +GetClusterSnapshotOutput,get_cluster_snapshot_output +GetCodeBindingSourceRequest,get_code_binding_source_request +GetCodeBindingSourceResponse,get_code_binding_source_response +GetCodeSigningConfigRequest,get_code_signing_config_request +GetCodeSigningConfigResponse,get_code_signing_config_response +GetCodegenJobRequest,get_codegen_job_request +GetCodegenJobResponse,get_codegen_job_response +GetCognitoEventsRequest,get_cognito_events_request +GetCognitoEventsResponse,get_cognito_events_response +GetCoipPoolUsageRequest,get_coip_pool_usage_request +GetCoipPoolUsageResult,get_coip_pool_usage_result +GetCollaborationAnalysisTemplateInput,get_collaboration_analysis_template_input +GetCollaborationAnalysisTemplateOutput,get_collaboration_analysis_template_output +GetCollaborationInput,get_collaboration_input +GetCollaborationOutput,get_collaboration_output +GetColumnStatisticsForPartitionRequest,get_column_statistics_for_partition_request +GetColumnStatisticsForPartitionResponse,get_column_statistics_for_partition_response +GetColumnStatisticsForTableRequest,get_column_statistics_for_table_request +GetColumnStatisticsForTableResponse,get_column_statistics_for_table_response +GetCommandInvocationRequest,get_command_invocation_request +GetCommandInvocationResult,get_command_invocation_result +GetCommentInput,get_comment_input +GetCommentOutput,get_comment_output +GetCommentReactionsInput,get_comment_reactions_input +GetCommentReactionsOutput,get_comment_reactions_output +GetCommentsForComparedCommitInput,get_comments_for_compared_commit_input +GetCommentsForComparedCommitOutput,get_comments_for_compared_commit_output +GetCommentsForPullRequestInput,get_comments_for_pull_request_input +GetCommentsForPullRequestOutput,get_comments_for_pull_request_output +GetCommitInput,get_commit_input +GetCommitOutput,get_commit_output +GetCompatibleElasticsearchVersionsRequest,get_compatible_elasticsearch_versions_request +GetCompatibleElasticsearchVersionsResponse,get_compatible_elasticsearch_versions_response +GetCompatibleKafkaVersionsRequest,get_compatible_kafka_versions_request +GetCompatibleKafkaVersionsResponse,get_compatible_kafka_versions_response +GetCompatibleVersionsRequest,get_compatible_versions_request +GetCompatibleVersionsResponse,get_compatible_versions_response +GetComplianceDetailRequest,get_compliance_detail_request +GetComplianceDetailResponse,get_compliance_detail_response +GetComplianceDetailsByConfigRuleRequest,get_compliance_details_by_config_rule_request +GetComplianceDetailsByConfigRuleResponse,get_compliance_details_by_config_rule_response +GetComplianceDetailsByResourceRequest,get_compliance_details_by_resource_request +GetComplianceDetailsByResourceResponse,get_compliance_details_by_resource_response +GetComplianceSummaryByConfigRuleResponse,get_compliance_summary_by_config_rule_response +GetComplianceSummaryByResourceTypeRequest,get_compliance_summary_by_resource_type_request +GetComplianceSummaryByResourceTypeResponse,get_compliance_summary_by_resource_type_response +GetComplianceSummaryInput,get_compliance_summary_input +GetComplianceSummaryOutput,get_compliance_summary_output +GetComponentInput,get_component_input +GetComponentOutput,get_component_output +GetComponentPolicyRequest,get_component_policy_request +GetComponentPolicyResponse,get_component_policy_response +GetComponentRequest,get_component_request +GetComponentResponse,get_component_response +GetComponentTypeRequest,get_component_type_request +GetComponentTypeResponse,get_component_type_response +GetComponentVersionArtifactRequest,get_component_version_artifact_request +GetComponentVersionArtifactResponse,get_component_version_artifact_response +GetComputeAccessInput,get_compute_access_input +GetComputeAccessOutput,get_compute_access_output +GetComputeAuthTokenInput,get_compute_auth_token_input +GetComputeAuthTokenOutput,get_compute_auth_token_output +GetConferencePreferenceResponse,get_conference_preference_response +GetConferenceProviderRequest,get_conference_provider_request +GetConferenceProviderResponse,get_conference_provider_response +GetConfigRequest,get_config_request +GetConfigResponse,get_config_response +GetConfigurationProfileRequest,get_configuration_profile_request +GetConfigurationRequest,get_configuration_request +GetConfigurationResponse,get_configuration_response +GetConfigurationSetEventDestinationsRequest,get_configuration_set_event_destinations_request +GetConfigurationSetEventDestinationsResponse,get_configuration_set_event_destinations_response +GetConfigurationSetRequest,get_configuration_set_request +GetConfigurationSetResponse,get_configuration_set_response +GetConfiguredTableAnalysisRuleInput,get_configured_table_analysis_rule_input +GetConfiguredTableAnalysisRuleOutput,get_configured_table_analysis_rule_output +GetConfiguredTableAssociationInput,get_configured_table_association_input +GetConfiguredTableAssociationOutput,get_configured_table_association_output +GetConfiguredTableInput,get_configured_table_input +GetConfiguredTableOutput,get_configured_table_output +GetConformancePackComplianceDetailsRequest,get_conformance_pack_compliance_details_request +GetConformancePackComplianceDetailsResponse,get_conformance_pack_compliance_details_response +GetConformancePackComplianceSummaryRequest,get_conformance_pack_compliance_summary_request +GetConformancePackComplianceSummaryResponse,get_conformance_pack_compliance_summary_response +GetConnectAttachmentRequest,get_connect_attachment_request +GetConnectAttachmentResponse,get_connect_attachment_response +GetConnectInstanceConfigRequest,get_connect_instance_config_request +GetConnectInstanceConfigResponse,get_connect_instance_config_response +GetConnectPeerAssociationsRequest,get_connect_peer_associations_request +GetConnectPeerAssociationsResponse,get_connect_peer_associations_response +GetConnectPeerRequest,get_connect_peer_request +GetConnectPeerResponse,get_connect_peer_response +GetConnectionInput,get_connection_input +GetConnectionOutput,get_connection_output +GetConnectionRequest,get_connection_request +GetConnectionResponse,get_connection_response +GetConnectionStatusRequest,get_connection_status_request +GetConnectionStatusResponse,get_connection_status_response +GetConnectionsFilter,get_connections_filter +GetConnectionsRequest,get_connections_request +GetConnectionsResponse,get_connections_response +GetConnectivityInfoRequest,get_connectivity_info_request +GetConnectivityInfoResponse,get_connectivity_info_response +GetConnectorDefinitionRequest,get_connector_definition_request +GetConnectorDefinitionResponse,get_connector_definition_response +GetConnectorDefinitionVersionRequest,get_connector_definition_version_request +GetConnectorDefinitionVersionResponse,get_connector_definition_version_response +GetConnectorRequest,get_connector_request +GetConnectorResponse,get_connector_response +GetConnectorsRequest,get_connectors_request +GetConnectorsResponse,get_connectors_response +GetConsoleOutputRequest,get_console_output_request +GetConsoleOutputResult,get_console_output_result +GetConsoleScreenshotRequest,get_console_screenshot_request +GetConsoleScreenshotResult,get_console_screenshot_result +GetConsolidatedReportInput,get_consolidated_report_input +GetConsolidatedReportOutput,get_consolidated_report_output +GetContactAttributesRequest,get_contact_attributes_request +GetContactAttributesResponse,get_contact_attributes_response +GetContactChannelRequest,get_contact_channel_request +GetContactChannelResult,get_contact_channel_result +GetContactInformationRequest,get_contact_information_request +GetContactInformationResponse,get_contact_information_response +GetContactListRequest,get_contact_list_request +GetContactListResponse,get_contact_list_response +GetContactMethodsRequest,get_contact_methods_request +GetContactMethodsResult,get_contact_methods_result +GetContactPolicyRequest,get_contact_policy_request +GetContactPolicyResult,get_contact_policy_result +GetContactReachabilityStatusRequest,get_contact_reachability_status_request +GetContactReachabilityStatusResponse,get_contact_reachability_status_response +GetContactRequest,get_contact_request +GetContactResponse,get_contact_response +GetContactResult,get_contact_result +GetContainerAPIMetadataResult,get_container_api_metadata_result +GetContainerImagesRequest,get_container_images_request +GetContainerImagesResult,get_container_images_result +GetContainerLogRequest,get_container_log_request +GetContainerLogResult,get_container_log_result +GetContainerPolicyInput,get_container_policy_input +GetContainerPolicyOutput,get_container_policy_output +GetContainerRecipePolicyRequest,get_container_recipe_policy_request +GetContainerRecipePolicyResponse,get_container_recipe_policy_response +GetContainerRecipeRequest,get_container_recipe_request +GetContainerRecipeResponse,get_container_recipe_response +GetContainerServiceDeploymentsRequest,get_container_service_deployments_request +GetContainerServiceDeploymentsResult,get_container_service_deployments_result +GetContainerServiceMetricDataRequest,get_container_service_metric_data_request +GetContainerServiceMetricDataResult,get_container_service_metric_data_result +GetContainerServicePowersResult,get_container_service_powers_result +GetContainerServicesRequest,get_container_services_request +GetContentModerationRequest,get_content_moderation_request +GetContentModerationRequestMetadata,get_content_moderation_request_metadata +GetContentModerationResponse,get_content_moderation_response +GetContentRequest,get_content_request +GetContentResponse,get_content_response +GetContentSummaryRequest,get_content_summary_request +GetContentSummaryResponse,get_content_summary_response +GetContextKeysForCustomPolicyRequest,get_context_keys_for_custom_policy_request +GetContextKeysForPolicyResponse,get_context_keys_for_policy_response +GetContextKeysForPrincipalPolicyRequest,get_context_keys_for_principal_policy_request +GetContinuousDeploymentPolicyConfigRequest,get_continuous_deployment_policy_config_request +GetContinuousDeploymentPolicyConfigResult,get_continuous_deployment_policy_config_result +GetContinuousDeploymentPolicyRequest,get_continuous_deployment_policy_request +GetContinuousDeploymentPolicyResult,get_continuous_deployment_policy_result +GetControlOperationInput,get_control_operation_input +GetControlOperationOutput,get_control_operation_output +GetControlRequest,get_control_request +GetControlResponse,get_control_response +GetCoreDefinitionRequest,get_core_definition_request +GetCoreDefinitionResponse,get_core_definition_response +GetCoreDefinitionVersionRequest,get_core_definition_version_request +GetCoreDefinitionVersionResponse,get_core_definition_version_response +GetCoreDeviceRequest,get_core_device_request +GetCoreDeviceResponse,get_core_device_response +GetCoreNetworkChangeEventsRequest,get_core_network_change_events_request +GetCoreNetworkChangeEventsResponse,get_core_network_change_events_response +GetCoreNetworkChangeSetRequest,get_core_network_change_set_request +GetCoreNetworkChangeSetResponse,get_core_network_change_set_response +GetCoreNetworkPolicyRequest,get_core_network_policy_request +GetCoreNetworkPolicyResponse,get_core_network_policy_response +GetCoreNetworkRequest,get_core_network_request +GetCoreNetworkResponse,get_core_network_response +GetCorsPolicyInput,get_cors_policy_input +GetCorsPolicyOutput,get_cors_policy_output +GetCostAndUsageRequest,get_cost_and_usage_request +GetCostAndUsageResponse,get_cost_and_usage_response +GetCostAndUsageWithResourcesRequest,get_cost_and_usage_with_resources_request +GetCostAndUsageWithResourcesResponse,get_cost_and_usage_with_resources_response +GetCostCategoriesRequest,get_cost_categories_request +GetCostCategoriesResponse,get_cost_categories_response +GetCostEstimateRequest,get_cost_estimate_request +GetCostEstimateResult,get_cost_estimate_result +GetCostEstimationRequest,get_cost_estimation_request +GetCostEstimationResponse,get_cost_estimation_response +GetCostForecastRequest,get_cost_forecast_request +GetCostForecastResponse,get_cost_forecast_response +GetCoverageStatisticsRequest,get_coverage_statistics_request +GetCoverageStatisticsResponse,get_coverage_statistics_response +GetCrawlerMetricsRequest,get_crawler_metrics_request +GetCrawlerMetricsResponse,get_crawler_metrics_response +GetCrawlerRequest,get_crawler_request +GetCrawlerResponse,get_crawler_response +GetCrawlersRequest,get_crawlers_request +GetCrawlersResponse,get_crawlers_response +GetCredentialReportResponse,get_credential_report_response +GetCredentialsForIdentityInput,get_credentials_for_identity_input +GetCredentialsForIdentityResponse,get_credentials_for_identity_response +GetCredentialsRequest,get_credentials_request +GetCredentialsResponse,get_credentials_response +GetCurrentMetricDataRequest,get_current_metric_data_request +GetCurrentMetricDataResponse,get_current_metric_data_response +GetCurrentUserDataRequest,get_current_user_data_request +GetCurrentUserDataResponse,get_current_user_data_response +GetCurrentUserRequest,get_current_user_request +GetCurrentUserResponse,get_current_user_response +GetCustomDataIdentifierRequest,get_custom_data_identifier_request +GetCustomDataIdentifierResponse,get_custom_data_identifier_response +GetCustomEntityTypeRequest,get_custom_entity_type_request +GetCustomEntityTypeResponse,get_custom_entity_type_response +GetCustomModelRequest,get_custom_model_request +GetCustomModelResponse,get_custom_model_response +GetCustomRulePolicyRequest,get_custom_rule_policy_request +GetCustomRulePolicyResponse,get_custom_rule_policy_response +GetCustomVerificationEmailTemplateRequest,get_custom_verification_email_template_request +GetCustomVerificationEmailTemplateResponse,get_custom_verification_email_template_response +GetCustomerGatewayAssociationsRequest,get_customer_gateway_associations_request +GetCustomerGatewayAssociationsResponse,get_customer_gateway_associations_response +GetDASHStreamingSessionURLInput,get_dash_streaming_session_url_input +GetDASHStreamingSessionURLOutput,get_dash_streaming_session_url_output +GetDICOMImportJobRequest,get_dicom_import_job_request +GetDICOMImportJobResponse,get_dicom_import_job_response +GetDNSSECRequest,get_dnssec_request +GetDNSSECResponse,get_dnssec_response +GetDashboardEmbedUrlRequest,get_dashboard_embed_url_request +GetDashboardEmbedUrlResponse,get_dashboard_embed_url_response +GetDashboardForJobRunRequest,get_dashboard_for_job_run_request +GetDashboardForJobRunResponse,get_dashboard_for_job_run_response +GetDashboardInput,get_dashboard_input +GetDashboardOutput,get_dashboard_output +GetDataCatalogEncryptionSettingsRequest,get_data_catalog_encryption_settings_request +GetDataCatalogEncryptionSettingsResponse,get_data_catalog_encryption_settings_response +GetDataCatalogInput,get_data_catalog_input +GetDataCatalogOutput,get_data_catalog_output +GetDataCellsFilterRequest,get_data_cells_filter_request +GetDataCellsFilterResponse,get_data_cells_filter_response +GetDataEndpointInput,get_data_endpoint_input +GetDataEndpointOutput,get_data_endpoint_output +GetDataIntegrationRequest,get_data_integration_request +GetDataIntegrationResponse,get_data_integration_response +GetDataLakeExceptionSubscriptionResponse,get_data_lake_exception_subscription_response +GetDataLakeOrganizationConfigurationResponse,get_data_lake_organization_configuration_response +GetDataLakeSettingsRequest,get_data_lake_settings_request +GetDataLakeSettingsResponse,get_data_lake_settings_response +GetDataLakeSourcesRequest,get_data_lake_sources_request +GetDataLakeSourcesResponse,get_data_lake_sources_response +GetDataProtectionPolicyInput,get_data_protection_policy_input +GetDataProtectionPolicyRequest,get_data_protection_policy_request +GetDataProtectionPolicyResponse,get_data_protection_policy_response +GetDataQualityMetricsRequest,get_data_quality_metrics_request +GetDataQualityMetricsResponse,get_data_quality_metrics_response +GetDataQualityResultRequest,get_data_quality_result_request +GetDataQualityResultResponse,get_data_quality_result_response +GetDataQualityRuleRecommendationRunRequest,get_data_quality_rule_recommendation_run_request +GetDataQualityRuleRecommendationRunResponse,get_data_quality_rule_recommendation_run_response +GetDataQualityRulesetEvaluationRunRequest,get_data_quality_ruleset_evaluation_run_request +GetDataQualityRulesetEvaluationRunResponse,get_data_quality_ruleset_evaluation_run_response +GetDataQualityRulesetRequest,get_data_quality_ruleset_request +GetDataQualityRulesetResponse,get_data_quality_ruleset_response +GetDataRetrievalPolicyInput,get_data_retrieval_policy_input +GetDataRetrievalPolicyOutput,get_data_retrieval_policy_output +GetDataSetDetailsRequest,get_data_set_details_request +GetDataSetDetailsResponse,get_data_set_details_response +GetDataSetImportTaskRequest,get_data_set_import_task_request +GetDataSetImportTaskResponse,get_data_set_import_task_response +GetDataSetRequest,get_data_set_request +GetDataSetResponse,get_data_set_response +GetDataSourceInput,get_data_source_input +GetDataSourceOutput,get_data_source_output +GetDataSourceRequest,get_data_source_request +GetDataSourceResponse,get_data_source_response +GetDataViewRequest,get_data_view_request +GetDataViewResponse,get_data_view_response +GetDatabaseInput,get_database_input +GetDatabaseOutput,get_database_output +GetDatabaseRequest,get_database_request +GetDatabaseResponse,get_database_response +GetDatabasesRequest,get_databases_request +GetDatabasesResponse,get_databases_response +GetDataflowEndpointGroupRequest,get_dataflow_endpoint_group_request +GetDataflowEndpointGroupResponse,get_dataflow_endpoint_group_response +GetDataflowGraphRequest,get_dataflow_graph_request +GetDataflowGraphResponse,get_dataflow_graph_response +GetDatasetContentRequest,get_dataset_content_request +GetDatasetContentResponse,get_dataset_content_response +GetDatasetRequest,get_dataset_request +GetDatasetResponse,get_dataset_response +GetDatastoreRequest,get_datastore_request +GetDatastoreResponse,get_datastore_response +GetDecoderManifestRequest,get_decoder_manifest_request +GetDecoderManifestResponse,get_decoder_manifest_response +GetDecryptedAPIKeyRequest,get_decrypted_api_key_request +GetDecryptedAPIKeyResponse,get_decrypted_api_key_response +GetDedicatedIpPoolRequest,get_dedicated_ip_pool_request +GetDedicatedIpPoolResponse,get_dedicated_ip_pool_response +GetDedicatedIpRequest,get_dedicated_ip_request +GetDedicatedIpResponse,get_dedicated_ip_response +GetDedicatedIpsRequest,get_dedicated_ips_request +GetDedicatedIpsResponse,get_dedicated_ips_response +GetDefaultCreditSpecificationRequest,get_default_credit_specification_request +GetDefaultCreditSpecificationResult,get_default_credit_specification_result +GetDefaultPatchBaselineRequest,get_default_patch_baseline_request +GetDefaultPatchBaselineResult,get_default_patch_baseline_result +GetDefaultRetentionPolicyRequest,get_default_retention_policy_request +GetDefaultRetentionPolicyResponse,get_default_retention_policy_response +GetDefaultViewOutput,get_default_view_output +GetDelegatedAdminAccountResponse,get_delegated_admin_account_response +GetDelegationsRequest,get_delegations_request +GetDelegationsResponse,get_delegations_response +GetDeleteEventsByEventTypeStatusRequest,get_delete_events_by_event_type_status_request +GetDeleteEventsByEventTypeStatusResult,get_delete_events_by_event_type_status_result +GetDeliverabilityDashboardOptionsResponse,get_deliverability_dashboard_options_response +GetDeliverabilityTestReportRequest,get_deliverability_test_report_request +GetDeliverabilityTestReportResponse,get_deliverability_test_report_response +GetDeployablePatchSnapshotForInstanceRequest,get_deployable_patch_snapshot_for_instance_request +GetDeployablePatchSnapshotForInstanceResult,get_deployable_patch_snapshot_for_instance_result +GetDeploymentConfigInput,get_deployment_config_input +GetDeploymentConfigOutput,get_deployment_config_output +GetDeploymentGroupInput,get_deployment_group_input +GetDeploymentGroupOutput,get_deployment_group_output +GetDeploymentInput,get_deployment_input +GetDeploymentInstanceInput,get_deployment_instance_input +GetDeploymentInstanceOutput,get_deployment_instance_output +GetDeploymentOutput,get_deployment_output +GetDeploymentRequest,get_deployment_request +GetDeploymentResponse,get_deployment_response +GetDeploymentStatusRequest,get_deployment_status_request +GetDeploymentStatusResponse,get_deployment_status_response +GetDeploymentStrategyRequest,get_deployment_strategy_request +GetDeploymentTargetInput,get_deployment_target_input +GetDeploymentTargetOutput,get_deployment_target_output +GetDeploymentsRequest,get_deployments_request +GetDeploymentsResponse,get_deployments_response +GetDeploymentsResult,get_deployments_result +GetDestinationRequest,get_destination_request +GetDestinationResponse,get_destination_response +GetDetectorModelAnalysisResultsRequest,get_detector_model_analysis_results_request +GetDetectorModelAnalysisResultsResponse,get_detector_model_analysis_results_response +GetDetectorRequest,get_detector_request +GetDetectorResponse,get_detector_response +GetDetectorVersionRequest,get_detector_version_request +GetDetectorVersionResult,get_detector_version_result +GetDetectorsRequest,get_detectors_request +GetDetectorsResult,get_detectors_result +GetDevEndpointRequest,get_dev_endpoint_request +GetDevEndpointResponse,get_dev_endpoint_response +GetDevEndpointsRequest,get_dev_endpoints_request +GetDevEndpointsResponse,get_dev_endpoints_response +GetDevEnvironmentRequest,get_dev_environment_request +GetDevEnvironmentResponse,get_dev_environment_response +GetDeviceDefinitionRequest,get_device_definition_request +GetDeviceDefinitionResponse,get_device_definition_response +GetDeviceDefinitionVersionRequest,get_device_definition_version_request +GetDeviceDefinitionVersionResponse,get_device_definition_version_response +GetDeviceFleetReportRequest,get_device_fleet_report_request +GetDeviceFleetReportResponse,get_device_fleet_report_response +GetDeviceIdentifierRequest,get_device_identifier_request +GetDeviceIdentifierResponse,get_device_identifier_response +GetDeviceInstanceRequest,get_device_instance_request +GetDeviceInstanceResult,get_device_instance_result +GetDeviceMethodsRequest,get_device_methods_request +GetDeviceMethodsResponse,get_device_methods_response +GetDevicePoolCompatibilityRequest,get_device_pool_compatibility_request +GetDevicePoolCompatibilityResult,get_device_pool_compatibility_result +GetDevicePoolRequest,get_device_pool_request +GetDevicePoolResult,get_device_pool_result +GetDevicePositionHistoryRequest,get_device_position_history_request +GetDevicePositionHistoryResponse,get_device_position_history_response +GetDevicePositionRequest,get_device_position_request +GetDevicePositionResponse,get_device_position_response +GetDeviceProfileRequest,get_device_profile_request +GetDeviceProfileResponse,get_device_profile_response +GetDeviceRegistrationRequest,get_device_registration_request +GetDeviceRegistrationResult,get_device_registration_result +GetDeviceRequest,get_device_request +GetDeviceResponse,get_device_response +GetDeviceResult,get_device_result +GetDevicesInPlacementRequest,get_devices_in_placement_request +GetDevicesInPlacementResponse,get_devices_in_placement_response +GetDevicesRequest,get_devices_request +GetDevicesResponse,get_devices_response +GetDifferencesInput,get_differences_input +GetDifferencesOutput,get_differences_output +GetDigestRequest,get_digest_request +GetDigestResponse,get_digest_response +GetDimensionKeyDetailsRequest,get_dimension_key_details_request +GetDimensionKeyDetailsResponse,get_dimension_key_details_response +GetDimensionValuesRequest,get_dimension_values_request +GetDimensionValuesResponse,get_dimension_values_response +GetDirectoryLimitsResult,get_directory_limits_result +GetDirectoryRegistrationRequest,get_directory_registration_request +GetDirectoryRegistrationResponse,get_directory_registration_response +GetDirectoryRequest,get_directory_request +GetDirectoryResponse,get_directory_response +GetDiscoveredResourceCountsRequest,get_discovered_resource_counts_request +GetDiscoveredResourceCountsResponse,get_discovered_resource_counts_response +GetDiscoveredSchemaRequest,get_discovered_schema_request +GetDiscoveredSchemaResponse,get_discovered_schema_response +GetDiscoverySummaryResponse,get_discovery_summary_response +GetDiskRequest,get_disk_request +GetDiskResult,get_disk_result +GetDiskSnapshotRequest,get_disk_snapshot_request +GetDiskSnapshotResult,get_disk_snapshot_result +GetDiskSnapshotsRequest,get_disk_snapshots_request +GetDiskSnapshotsResult,get_disk_snapshots_result +GetDisksRequest,get_disks_request +GetDisksResult,get_disks_result +GetDistributionBundlesResult,get_distribution_bundles_result +GetDistributionConfigRequest,get_distribution_config_request +GetDistributionConfigResult,get_distribution_config_result +GetDistributionConfigurationRequest,get_distribution_configuration_request +GetDistributionConfigurationResponse,get_distribution_configuration_response +GetDistributionLatestCacheResetRequest,get_distribution_latest_cache_reset_request +GetDistributionLatestCacheResetResult,get_distribution_latest_cache_reset_result +GetDistributionMetricDataRequest,get_distribution_metric_data_request +GetDistributionMetricDataResult,get_distribution_metric_data_result +GetDistributionRequest,get_distribution_request +GetDistributionResult,get_distribution_result +GetDistributionsRequest,get_distributions_request +GetDistributionsResult,get_distributions_result +GetDocumentAnalysisRequest,get_document_analysis_request +GetDocumentAnalysisResponse,get_document_analysis_response +GetDocumentPathRequest,get_document_path_request +GetDocumentPathResponse,get_document_path_response +GetDocumentRequest,get_document_request +GetDocumentResponse,get_document_response +GetDocumentResult,get_document_result +GetDocumentTextDetectionRequest,get_document_text_detection_request +GetDocumentTextDetectionResponse,get_document_text_detection_response +GetDocumentVersionRequest,get_document_version_request +GetDocumentVersionResponse,get_document_version_response +GetDocumentationPartRequest,get_documentation_part_request +GetDocumentationPartsRequest,get_documentation_parts_request +GetDocumentationVersionRequest,get_documentation_version_request +GetDocumentationVersionsRequest,get_documentation_versions_request +GetDomainAssociationRequest,get_domain_association_request +GetDomainAssociationResult,get_domain_association_result +GetDomainDeliverabilityCampaignRequest,get_domain_deliverability_campaign_request +GetDomainDeliverabilityCampaignResponse,get_domain_deliverability_campaign_response +GetDomainDetailRequest,get_domain_detail_request +GetDomainDetailResponse,get_domain_detail_response +GetDomainNameRequest,get_domain_name_request +GetDomainNameResponse,get_domain_name_response +GetDomainNamesRequest,get_domain_names_request +GetDomainNamesResponse,get_domain_names_response +GetDomainPermissionsPolicyRequest,get_domain_permissions_policy_request +GetDomainPermissionsPolicyResult,get_domain_permissions_policy_result +GetDomainRequest,get_domain_request +GetDomainResponse,get_domain_response +GetDomainResult,get_domain_result +GetDomainStatisticsReportRequest,get_domain_statistics_report_request +GetDomainStatisticsReportResponse,get_domain_statistics_report_response +GetDomainSuggestionsRequest,get_domain_suggestions_request +GetDomainSuggestionsResponse,get_domain_suggestions_response +GetDomainsRequest,get_domains_request +GetDomainsResult,get_domains_result +GetDownloadUrlForLayerRequest,get_download_url_for_layer_request +GetDownloadUrlForLayerResponse,get_download_url_for_layer_response +GetEBSVolumeRecommendationsRequest,get_ebs_volume_recommendations_request +GetEBSVolumeRecommendationsResponse,get_ebs_volume_recommendations_response +GetEC2InstanceRecommendationsRequest,get_ec2_instance_recommendations_request +GetEC2InstanceRecommendationsResponse,get_ec2_instance_recommendations_response +GetEC2RecommendationProjectedMetricsRequest,get_ec2_recommendation_projected_metrics_request +GetEC2RecommendationProjectedMetricsResponse,get_ec2_recommendation_projected_metrics_response +GetECSServiceRecommendationProjectedMetricsRequest,get_ecs_service_recommendation_projected_metrics_request +GetECSServiceRecommendationProjectedMetricsResponse,get_ecs_service_recommendation_projected_metrics_response +GetECSServiceRecommendationsRequest,get_ecs_service_recommendations_request +GetECSServiceRecommendationsResponse,get_ecs_service_recommendations_response +GetEarthObservationJobInput,get_earth_observation_job_input +GetEarthObservationJobOutput,get_earth_observation_job_output +GetEbsDefaultKmsKeyIdRequest,get_ebs_default_kms_key_id_request +GetEbsDefaultKmsKeyIdResult,get_ebs_default_kms_key_id_result +GetEbsEncryptionByDefaultRequest,get_ebs_encryption_by_default_request +GetEbsEncryptionByDefaultResult,get_ebs_encryption_by_default_result +GetEc2DeepInspectionConfigurationResponse,get_ec2_deep_inspection_configuration_response +GetEffectivePermissionsForPathRequest,get_effective_permissions_for_path_request +GetEffectivePermissionsForPathResponse,get_effective_permissions_for_path_response +GetEffectivePoliciesRequest,get_effective_policies_request +GetEffectivePoliciesResponse,get_effective_policies_response +GetEffectiveRecommendationPreferencesRequest,get_effective_recommendation_preferences_request +GetEffectiveRecommendationPreferencesResponse,get_effective_recommendation_preferences_response +GetEmailChannelRequest,get_email_channel_request +GetEmailChannelResponse,get_email_channel_response +GetEmailIdentityPoliciesRequest,get_email_identity_policies_request +GetEmailIdentityPoliciesResponse,get_email_identity_policies_response +GetEmailIdentityRequest,get_email_identity_request +GetEmailIdentityResponse,get_email_identity_response +GetEmailTemplateRequest,get_email_template_request +GetEmailTemplateResponse,get_email_template_response +GetEnabledStandardsRequest,get_enabled_standards_request +GetEnabledStandardsResponse,get_enabled_standards_response +GetEncryptionConfigResult,get_encryption_config_result +GetEncryptionConfigurationResponse,get_encryption_configuration_response +GetEncryptionKeyRequest,get_encryption_key_request +GetEncryptionKeyResponse,get_encryption_key_response +GetEndpointAccessRequest,get_endpoint_access_request +GetEndpointAccessResponse,get_endpoint_access_response +GetEndpointAttributesInput,get_endpoint_attributes_input +GetEndpointAttributesResponse,get_endpoint_attributes_response +GetEndpointRequest,get_endpoint_request +GetEndpointResponse,get_endpoint_response +GetEngineStatusOutput,get_engine_status_output +GetEnrollmentStatusResponse,get_enrollment_status_response +GetEnrollmentStatusesForOrganizationRequest,get_enrollment_statuses_for_organization_request +GetEnrollmentStatusesForOrganizationResponse,get_enrollment_statuses_for_organization_response +GetEntitiesRequest,get_entities_request +GetEntitiesResponse,get_entities_response +GetEntitlementsRequest,get_entitlements_request +GetEntitlementsResult,get_entitlements_result +GetEntityRequest,get_entity_request +GetEntityResponse,get_entity_response +GetEntityTypesRequest,get_entity_types_request +GetEntityTypesResult,get_entity_types_result +GetEnvironmentAccountConnectionInput,get_environment_account_connection_input +GetEnvironmentAccountConnectionOutput,get_environment_account_connection_output +GetEnvironmentInput,get_environment_input +GetEnvironmentOutput,get_environment_output +GetEnvironmentRequest,get_environment_request +GetEnvironmentResponse,get_environment_response +GetEnvironmentTemplateInput,get_environment_template_input +GetEnvironmentTemplateOutput,get_environment_template_output +GetEnvironmentTemplateVersionInput,get_environment_template_version_input +GetEnvironmentTemplateVersionOutput,get_environment_template_version_output +GetEulaRequest,get_eula_request +GetEulaResponse,get_eula_response +GetEvaluationInput,get_evaluation_input +GetEvaluationOutput,get_evaluation_output +GetEventActionRequest,get_event_action_request +GetEventActionResponse,get_event_action_response +GetEventConfigurationByResourceTypesResponse,get_event_configuration_by_resource_types_response +GetEventDataStoreRequest,get_event_data_store_request +GetEventDataStoreResponse,get_event_data_store_response +GetEventIntegrationRequest,get_event_integration_request +GetEventIntegrationResponse,get_event_integration_response +GetEventPredictionMetadataRequest,get_event_prediction_metadata_request +GetEventPredictionMetadataResult,get_event_prediction_metadata_result +GetEventPredictionRequest,get_event_prediction_request +GetEventPredictionResult,get_event_prediction_result +GetEventRequest,get_event_request +GetEventResult,get_event_result +GetEventSelectorsRequest,get_event_selectors_request +GetEventSelectorsResponse,get_event_selectors_response +GetEventSourceMappingRequest,get_event_source_mapping_request +GetEventStreamRequest,get_event_stream_request +GetEventStreamResponse,get_event_stream_response +GetEventTypesRequest,get_event_types_request +GetEventTypesResult,get_event_types_result +GetEventsConfigurationRequest,get_events_configuration_request +GetEventsConfigurationResponse,get_events_configuration_response +GetEvidenceByEvidenceFolderRequest,get_evidence_by_evidence_folder_request +GetEvidenceByEvidenceFolderResponse,get_evidence_by_evidence_folder_response +GetEvidenceFileUploadUrlRequest,get_evidence_file_upload_url_request +GetEvidenceFileUploadUrlResponse,get_evidence_file_upload_url_response +GetEvidenceFolderRequest,get_evidence_folder_request +GetEvidenceFolderResponse,get_evidence_folder_response +GetEvidenceFoldersByAssessmentControlRequest,get_evidence_folders_by_assessment_control_request +GetEvidenceFoldersByAssessmentControlResponse,get_evidence_folders_by_assessment_control_response +GetEvidenceFoldersByAssessmentRequest,get_evidence_folders_by_assessment_request +GetEvidenceFoldersByAssessmentResponse,get_evidence_folders_by_assessment_response +GetEvidenceRequest,get_evidence_request +GetEvidenceResponse,get_evidence_response +GetExclusionsPreviewRequest,get_exclusions_preview_request +GetExclusionsPreviewResponse,get_exclusions_preview_response +GetExecutionHistoryInput,get_execution_history_input +GetExecutionHistoryOutput,get_execution_history_output +GetExpenseAnalysisRequest,get_expense_analysis_request +GetExpenseAnalysisResponse,get_expense_analysis_response +GetExperimentRequest,get_experiment_request +GetExperimentResponse,get_experiment_response +GetExperimentResultsRequest,get_experiment_results_request +GetExperimentResultsResponse,get_experiment_results_response +GetExperimentTemplateRequest,get_experiment_template_request +GetExperimentTemplateResponse,get_experiment_template_response +GetExportJobRequest,get_export_job_request +GetExportJobResponse,get_export_job_response +GetExportJobsRequest,get_export_jobs_request +GetExportJobsResponse,get_export_jobs_response +GetExportRequest,get_export_request +GetExportResponse,get_export_response +GetExportSnapshotRecordsRequest,get_export_snapshot_records_request +GetExportSnapshotRecordsResult,get_export_snapshot_records_result +GetExtensionAssociationRequest,get_extension_association_request +GetExtensionRequest,get_extension_request +GetExtensionResult,get_extension_result +GetExtensionVersionRequest,get_extension_version_request +GetExtensionVersionResult,get_extension_version_result +GetExternalDataViewAccessDetailsRequest,get_external_data_view_access_details_request +GetExternalDataViewAccessDetailsResponse,get_external_data_view_access_details_response +GetExternalModelsRequest,get_external_models_request +GetExternalModelsResult,get_external_models_result +GetFaceDetectionRequest,get_face_detection_request +GetFaceDetectionResponse,get_face_detection_response +GetFaceLivenessSessionResultsRequest,get_face_liveness_session_results_request +GetFaceLivenessSessionResultsResponse,get_face_liveness_session_results_response +GetFaceSearchRequest,get_face_search_request +GetFaceSearchResponse,get_face_search_response +GetFacetRequest,get_facet_request +GetFacetResponse,get_facet_response +GetFailbackReplicationConfigurationRequest,get_failback_replication_configuration_request +GetFailbackReplicationConfigurationResponse,get_failback_replication_configuration_response +GetFeatureRequest,get_feature_request +GetFeatureResponse,get_feature_response +GetFederationTokenRequest,get_federation_token_request +GetFederationTokenResponse,get_federation_token_response +GetFeedbackRequest,get_feedback_request +GetFeedbackResponse,get_feedback_response +GetFieldLevelEncryptionConfigRequest,get_field_level_encryption_config_request +GetFieldLevelEncryptionConfigResult,get_field_level_encryption_config_result +GetFieldLevelEncryptionProfileConfigRequest,get_field_level_encryption_profile_config_request +GetFieldLevelEncryptionProfileConfigResult,get_field_level_encryption_profile_config_result +GetFieldLevelEncryptionProfileRequest,get_field_level_encryption_profile_request +GetFieldLevelEncryptionProfileResult,get_field_level_encryption_profile_result +GetFieldLevelEncryptionRequest,get_field_level_encryption_request +GetFieldLevelEncryptionResult,get_field_level_encryption_result +GetFieldResponse,get_field_response +GetFileInput,get_file_input +GetFileOutput,get_file_output +GetFileUploadURLRequest,get_file_upload_url_request +GetFileUploadURLResponse,get_file_upload_url_response +GetFilterRequest,get_filter_request +GetFilterResponse,get_filter_response +GetFindingAggregatorRequest,get_finding_aggregator_request +GetFindingAggregatorResponse,get_finding_aggregator_response +GetFindingHistoryRequest,get_finding_history_request +GetFindingHistoryResponse,get_finding_history_response +GetFindingRequest,get_finding_request +GetFindingResponse,get_finding_response +GetFindingStatisticsRequest,get_finding_statistics_request +GetFindingStatisticsResponse,get_finding_statistics_response +GetFindingsFilterRequest,get_findings_filter_request +GetFindingsFilterResponse,get_findings_filter_response +GetFindingsPublicationConfigurationResponse,get_findings_publication_configuration_response +GetFindingsReportAccountSummaryRequest,get_findings_report_account_summary_request +GetFindingsReportAccountSummaryResponse,get_findings_report_account_summary_response +GetFindingsReportStatusRequest,get_findings_report_status_request +GetFindingsReportStatusResponse,get_findings_report_status_response +GetFindingsRequest,get_findings_request +GetFindingsResponse,get_findings_response +GetFindingsStatisticsRequest,get_findings_statistics_request +GetFindingsStatisticsResponse,get_findings_statistics_response +GetFirewallConfigRequest,get_firewall_config_request +GetFirewallConfigResponse,get_firewall_config_response +GetFirewallDomainListRequest,get_firewall_domain_list_request +GetFirewallDomainListResponse,get_firewall_domain_list_response +GetFirewallRuleGroupAssociationRequest,get_firewall_rule_group_association_request +GetFirewallRuleGroupAssociationResponse,get_firewall_rule_group_association_response +GetFirewallRuleGroupPolicyRequest,get_firewall_rule_group_policy_request +GetFirewallRuleGroupPolicyResponse,get_firewall_rule_group_policy_response +GetFirewallRuleGroupRequest,get_firewall_rule_group_request +GetFirewallRuleGroupResponse,get_firewall_rule_group_response +GetFleetRequest,get_fleet_request +GetFleetResponse,get_fleet_response +GetFlowLogsIntegrationTemplateRequest,get_flow_logs_integration_template_request +GetFlowLogsIntegrationTemplateResult,get_flow_logs_integration_template_result +GetFlowTemplateRequest,get_flow_template_request +GetFlowTemplateResponse,get_flow_template_response +GetFlowTemplateRevisionsRequest,get_flow_template_revisions_request +GetFlowTemplateRevisionsResponse,get_flow_template_revisions_response +GetFolderInput,get_folder_input +GetFolderOutput,get_folder_output +GetFolderPathRequest,get_folder_path_request +GetFolderPathResponse,get_folder_path_response +GetFolderRequest,get_folder_request +GetFolderResponse,get_folder_response +GetFormRequest,get_form_request +GetFormResponse,get_form_response +GetFoundationModelRequest,get_foundation_model_request +GetFoundationModelResponse,get_foundation_model_response +GetFunctionCodeSigningConfigRequest,get_function_code_signing_config_request +GetFunctionCodeSigningConfigResponse,get_function_code_signing_config_response +GetFunctionConcurrencyRequest,get_function_concurrency_request +GetFunctionConcurrencyResponse,get_function_concurrency_response +GetFunctionConfigurationRequest,get_function_configuration_request +GetFunctionDefinitionRequest,get_function_definition_request +GetFunctionDefinitionResponse,get_function_definition_response +GetFunctionDefinitionVersionRequest,get_function_definition_version_request +GetFunctionDefinitionVersionResponse,get_function_definition_version_response +GetFunctionEventInvokeConfigRequest,get_function_event_invoke_config_request +GetFunctionRequest,get_function_request +GetFunctionResponse,get_function_response +GetFunctionResult,get_function_result +GetFunctionUrlConfigRequest,get_function_url_config_request +GetFunctionUrlConfigResponse,get_function_url_config_response +GetFuotaTaskRequest,get_fuota_task_request +GetFuotaTaskResponse,get_fuota_task_response +GetGameConfigurationRequest,get_game_configuration_request +GetGameConfigurationResult,get_game_configuration_result +GetGameRequest,get_game_request +GetGameResult,get_game_result +GetGameSessionLogUrlInput,get_game_session_log_url_input +GetGameSessionLogUrlOutput,get_game_session_log_url_output +GetGatewayGroupRequest,get_gateway_group_request +GetGatewayGroupResponse,get_gateway_group_response +GetGatewayInput,get_gateway_input +GetGatewayOutput,get_gateway_output +GetGatewayRequest,get_gateway_request +GetGatewayResponse,get_gateway_response +GetGatewayResponseRequest,get_gateway_response_request +GetGatewayResponsesRequest,get_gateway_responses_request +GetGcmChannelRequest,get_gcm_channel_request +GetGcmChannelResponse,get_gcm_channel_response +GetGeneratedCodeJobRequest,get_generated_code_job_request +GetGeneratedCodeJobResult,get_generated_code_job_result +GetGeneratedPolicyRequest,get_generated_policy_request +GetGeneratedPolicyResponse,get_generated_policy_response +GetGeoLocationRequest,get_geo_location_request +GetGeoLocationResponse,get_geo_location_response +GetGeoMatchSetRequest,get_geo_match_set_request +GetGeoMatchSetResponse,get_geo_match_set_response +GetGeofenceRequest,get_geofence_request +GetGeofenceResponse,get_geofence_response +GetGlobalSettingsResponse,get_global_settings_response +GetGrantRequest,get_grant_request +GetGrantResponse,get_grant_response +GetGraphqlApiRequest,get_graphql_api_request +GetGraphqlApiResponse,get_graphql_api_response +GetGremlinQueryStatusInput,get_gremlin_query_status_input +GetGremlinQueryStatusOutput,get_gremlin_query_status_output +GetGroupCertificateAuthorityRequest,get_group_certificate_authority_request +GetGroupCertificateAuthorityResponse,get_group_certificate_authority_response +GetGroupCertificateConfigurationRequest,get_group_certificate_configuration_request +GetGroupCertificateConfigurationResponse,get_group_certificate_configuration_response +GetGroupConfigurationInput,get_group_configuration_input +GetGroupConfigurationOutput,get_group_configuration_output +GetGroupIdRequest,get_group_id_request +GetGroupIdResponse,get_group_id_response +GetGroupInput,get_group_input +GetGroupMembershipIdRequest,get_group_membership_id_request +GetGroupMembershipIdResponse,get_group_membership_id_response +GetGroupOutput,get_group_output +GetGroupPolicyRequest,get_group_policy_request +GetGroupPolicyResponse,get_group_policy_response +GetGroupQueryInput,get_group_query_input +GetGroupQueryOutput,get_group_query_output +GetGroupRequest,get_group_request +GetGroupResponse,get_group_response +GetGroupResult,get_group_result +GetGroupVersionRequest,get_group_version_request +GetGroupVersionResponse,get_group_version_response +GetGroupsForCapacityReservationRequest,get_groups_for_capacity_reservation_request +GetGroupsForCapacityReservationResult,get_groups_for_capacity_reservation_result +GetGroupsRequest,get_groups_request +GetGroupsResult,get_groups_result +GetHITRequest,get_hit_request +GetHITResponse,get_hit_response +GetHLSStreamingSessionURLInput,get_hls_streaming_session_url_input +GetHLSStreamingSessionURLOutput,get_hls_streaming_session_url_output +GetHealthCheckCountResponse,get_health_check_count_response +GetHealthCheckLastFailureReasonRequest,get_health_check_last_failure_reason_request +GetHealthCheckLastFailureReasonResponse,get_health_check_last_failure_reason_response +GetHealthCheckRequest,get_health_check_request +GetHealthCheckResponse,get_health_check_response +GetHealthCheckStatusRequest,get_health_check_status_request +GetHealthCheckStatusResponse,get_health_check_status_response +GetHealthEventInput,get_health_event_input +GetHealthEventOutput,get_health_event_output +GetHlsManifestConfiguration,get_hls_manifest_configuration +GetHomeRegionResult,get_home_region_result +GetHostInput,get_host_input +GetHostOutput,get_host_output +GetHostReservationPurchasePreviewRequest,get_host_reservation_purchase_preview_request +GetHostReservationPurchasePreviewResult,get_host_reservation_purchase_preview_result +GetHostedConfigurationVersionRequest,get_hosted_configuration_version_request +GetHostedZoneCountResponse,get_hosted_zone_count_response +GetHostedZoneLimitRequest,get_hosted_zone_limit_request +GetHostedZoneLimitResponse,get_hosted_zone_limit_response +GetHostedZoneRequest,get_hosted_zone_request +GetHostedZoneResponse,get_hosted_zone_response +GetHostnameSuggestionRequest,get_hostname_suggestion_request +GetHostnameSuggestionResult,get_hostname_suggestion_result +GetHypervisorInput,get_hypervisor_input +GetHypervisorOutput,get_hypervisor_output +GetHypervisorPropertyMappingsInput,get_hypervisor_property_mappings_input +GetHypervisorPropertyMappingsOutput,get_hypervisor_property_mappings_output +GetIPSetRequest,get_ip_set_request +GetIPSetResponse,get_ip_set_response +GetIceServerConfigRequest,get_ice_server_config_request +GetIceServerConfigResponse,get_ice_server_config_response +GetIdInput,get_id_input +GetIdResponse,get_id_response +GetIdentityDkimAttributesRequest,get_identity_dkim_attributes_request +GetIdentityDkimAttributesResponse,get_identity_dkim_attributes_response +GetIdentityMailFromDomainAttributesRequest,get_identity_mail_from_domain_attributes_request +GetIdentityMailFromDomainAttributesResponse,get_identity_mail_from_domain_attributes_response +GetIdentityNotificationAttributesRequest,get_identity_notification_attributes_request +GetIdentityNotificationAttributesResponse,get_identity_notification_attributes_response +GetIdentityPoliciesRequest,get_identity_policies_request +GetIdentityPoliciesResponse,get_identity_policies_response +GetIdentityPoolConfigurationRequest,get_identity_pool_configuration_request +GetIdentityPoolConfigurationResponse,get_identity_pool_configuration_response +GetIdentityPoolRolesInput,get_identity_pool_roles_input +GetIdentityPoolRolesResponse,get_identity_pool_roles_response +GetIdentityProviderByIdentifierRequest,get_identity_provider_by_identifier_request +GetIdentityProviderByIdentifierResponse,get_identity_provider_by_identifier_response +GetIdentityProviderRequest,get_identity_provider_request +GetIdentityProviderResponse,get_identity_provider_response +GetIdentityResolutionJobRequest,get_identity_resolution_job_request +GetIdentityResolutionJobResponse,get_identity_resolution_job_response +GetIdentitySourceInput,get_identity_source_input +GetIdentitySourceOutput,get_identity_source_output +GetIdentityVerificationAttributesRequest,get_identity_verification_attributes_request +GetIdentityVerificationAttributesResponse,get_identity_verification_attributes_response +GetImageBlockPublicAccessStateRequest,get_image_block_public_access_state_request +GetImageBlockPublicAccessStateResult,get_image_block_public_access_state_result +GetImageFrameRequest,get_image_frame_request +GetImageFrameResponse,get_image_frame_response +GetImagePipelineRequest,get_image_pipeline_request +GetImagePipelineResponse,get_image_pipeline_response +GetImagePolicyRequest,get_image_policy_request +GetImagePolicyResponse,get_image_policy_response +GetImageRecipePolicyRequest,get_image_recipe_policy_request +GetImageRecipePolicyResponse,get_image_recipe_policy_response +GetImageRecipeRequest,get_image_recipe_request +GetImageRecipeResponse,get_image_recipe_response +GetImageRequest,get_image_request +GetImageResponse,get_image_response +GetImageSetMetadataRequest,get_image_set_metadata_request +GetImageSetMetadataResponse,get_image_set_metadata_response +GetImageSetRequest,get_image_set_request +GetImageSetResponse,get_image_set_response +GetImagesInput,get_images_input +GetImagesOutput,get_images_output +GetImpersonationRoleEffectRequest,get_impersonation_role_effect_request +GetImpersonationRoleEffectResponse,get_impersonation_role_effect_response +GetImpersonationRoleRequest,get_impersonation_role_request +GetImpersonationRoleResponse,get_impersonation_role_response +GetImportFileTaskRequest,get_import_file_task_request +GetImportFileTaskResponse,get_import_file_task_response +GetImportJobRequest,get_import_job_request +GetImportJobResponse,get_import_job_response +GetImportJobsRequest,get_import_jobs_request +GetImportJobsResponse,get_import_jobs_response +GetImportRequest,get_import_request +GetImportResponse,get_import_response +GetInAppMessagesRequest,get_in_app_messages_request +GetInAppMessagesResponse,get_in_app_messages_response +GetInAppTemplateRequest,get_in_app_template_request +GetInAppTemplateResponse,get_in_app_template_response +GetIncidentRecordInput,get_incident_record_input +GetIncidentRecordOutput,get_incident_record_output +GetIndexOutput,get_index_output +GetIndexingConfigurationResponse,get_indexing_configuration_response +GetInfrastructureConfigurationRequest,get_infrastructure_configuration_request +GetInfrastructureConfigurationResponse,get_infrastructure_configuration_response +GetIngestionDestinationRequest,get_ingestion_destination_request +GetIngestionDestinationResponse,get_ingestion_destination_response +GetIngestionRequest,get_ingestion_request +GetIngestionResponse,get_ingestion_response +GetInlinePolicyForPermissionSetRequest,get_inline_policy_for_permission_set_request +GetInlinePolicyForPermissionSetResponse,get_inline_policy_for_permission_set_response +GetInsightEventsRequest,get_insight_events_request +GetInsightEventsResult,get_insight_events_result +GetInsightImpactGraphRequest,get_insight_impact_graph_request +GetInsightImpactGraphResult,get_insight_impact_graph_result +GetInsightRequest,get_insight_request +GetInsightResult,get_insight_result +GetInsightResultsRequest,get_insight_results_request +GetInsightResultsResponse,get_insight_results_response +GetInsightRuleReportInput,get_insight_rule_report_input +GetInsightRuleReportOutput,get_insight_rule_report_output +GetInsightSelectorsRequest,get_insight_selectors_request +GetInsightSelectorsResponse,get_insight_selectors_response +GetInsightSummariesRequest,get_insight_summaries_request +GetInsightSummariesResult,get_insight_summaries_result +GetInsightsByAssessmentRequest,get_insights_by_assessment_request +GetInsightsByAssessmentResponse,get_insights_by_assessment_response +GetInsightsRequest,get_insights_request +GetInsightsResponse,get_insights_response +GetInstanceAccessDetailsRequest,get_instance_access_details_request +GetInstanceAccessDetailsResult,get_instance_access_details_result +GetInstanceAccessInput,get_instance_access_input +GetInstanceAccessOutput,get_instance_access_output +GetInstanceMetricDataRequest,get_instance_metric_data_request +GetInstanceMetricDataResult,get_instance_metric_data_result +GetInstanceOnboardingJobStatusRequest,get_instance_onboarding_job_status_request +GetInstanceOnboardingJobStatusResponse,get_instance_onboarding_job_status_response +GetInstancePortStatesRequest,get_instance_port_states_request +GetInstancePortStatesResult,get_instance_port_states_result +GetInstanceProfileRequest,get_instance_profile_request +GetInstanceProfileResponse,get_instance_profile_response +GetInstanceProfileResult,get_instance_profile_result +GetInstanceRequest,get_instance_request +GetInstanceResponse,get_instance_response +GetInstanceResult,get_instance_result +GetInstanceSnapshotRequest,get_instance_snapshot_request +GetInstanceSnapshotResult,get_instance_snapshot_result +GetInstanceSnapshotsRequest,get_instance_snapshots_request +GetInstanceSnapshotsResult,get_instance_snapshots_result +GetInstanceStateRequest,get_instance_state_request +GetInstanceStateResult,get_instance_state_result +GetInstanceTypesFromInstanceRequirementsRequest,get_instance_types_from_instance_requirements_request +GetInstanceTypesFromInstanceRequirementsResult,get_instance_types_from_instance_requirements_result +GetInstanceUefiDataRequest,get_instance_uefi_data_request +GetInstanceUefiDataResult,get_instance_uefi_data_result +GetInstancesHealthStatusRequest,get_instances_health_status_request +GetInstancesHealthStatusResponse,get_instances_health_status_response +GetInstancesRequest,get_instances_request +GetInstancesResult,get_instances_result +GetIntegrationRequest,get_integration_request +GetIntegrationResponse,get_integration_response +GetIntegrationResponseRequest,get_integration_response_request +GetIntegrationResponseResponse,get_integration_response_response +GetIntegrationResponsesRequest,get_integration_responses_request +GetIntegrationResponsesResponse,get_integration_responses_response +GetIntegrationResult,get_integration_result +GetIntegrationsRequest,get_integrations_request +GetIntegrationsResponse,get_integrations_response +GetIntentRequest,get_intent_request +GetIntentResponse,get_intent_response +GetIntentVersionsRequest,get_intent_versions_request +GetIntentVersionsResponse,get_intent_versions_response +GetIntentsRequest,get_intents_request +GetIntentsResponse,get_intents_response +GetInterpolatedAssetPropertyValuesRequest,get_interpolated_asset_property_values_request +GetInterpolatedAssetPropertyValuesResponse,get_interpolated_asset_property_values_response +GetIntrospectionSchemaRequest,get_introspection_schema_request +GetIntrospectionSchemaResponse,get_introspection_schema_response +GetInvalidationRequest,get_invalidation_request +GetInvalidationResult,get_invalidation_result +GetInventoryRequest,get_inventory_request +GetInventoryResult,get_inventory_result +GetInventorySchemaRequest,get_inventory_schema_request +GetInventorySchemaResult,get_inventory_schema_result +GetInvitationConfigurationResponse,get_invitation_configuration_response +GetInvitationsCountResponse,get_invitations_count_response +GetIpAccessSettingsRequest,get_ip_access_settings_request +GetIpAccessSettingsResponse,get_ip_access_settings_response +GetIpamAddressHistoryRequest,get_ipam_address_history_request +GetIpamAddressHistoryResult,get_ipam_address_history_result +GetIpamDiscoveredAccountsRequest,get_ipam_discovered_accounts_request +GetIpamDiscoveredAccountsResult,get_ipam_discovered_accounts_result +GetIpamDiscoveredResourceCidrsRequest,get_ipam_discovered_resource_cidrs_request +GetIpamDiscoveredResourceCidrsResult,get_ipam_discovered_resource_cidrs_result +GetIpamPoolAllocationsRequest,get_ipam_pool_allocations_request +GetIpamPoolAllocationsResult,get_ipam_pool_allocations_result +GetIpamPoolCidrsRequest,get_ipam_pool_cidrs_request +GetIpamPoolCidrsResult,get_ipam_pool_cidrs_result +GetIpamResourceCidrsRequest,get_ipam_resource_cidrs_request +GetIpamResourceCidrsResult,get_ipam_resource_cidrs_result +GetItemInput,get_item_input +GetItemOutput,get_item_output +GetJobBookmarkRequest,get_job_bookmark_request +GetJobBookmarkResponse,get_job_bookmark_response +GetJobDetailsInput,get_job_details_input +GetJobDetailsOutput,get_job_details_output +GetJobDocumentRequest,get_job_document_request +GetJobDocumentResponse,get_job_document_response +GetJobManifestRequest,get_job_manifest_request +GetJobManifestResult,get_job_manifest_result +GetJobOutputInput,get_job_output_input +GetJobOutputOutput,get_job_output_output +GetJobRequest,get_job_request +GetJobResponse,get_job_response +GetJobResult,get_job_result +GetJobRunRequest,get_job_run_request +GetJobRunResponse,get_job_run_response +GetJobRunsRequest,get_job_runs_request +GetJobRunsResponse,get_job_runs_response +GetJobTaggingRequest,get_job_tagging_request +GetJobTaggingResult,get_job_tagging_result +GetJobTemplateRequest,get_job_template_request +GetJobTemplateResponse,get_job_template_response +GetJobUnlockCodeRequest,get_job_unlock_code_request +GetJobUnlockCodeResult,get_job_unlock_code_result +GetJobsRequest,get_jobs_request +GetJobsResponse,get_jobs_response +GetJourneyDateRangeKpiRequest,get_journey_date_range_kpi_request +GetJourneyDateRangeKpiResponse,get_journey_date_range_kpi_response +GetJourneyExecutionActivityMetricsRequest,get_journey_execution_activity_metrics_request +GetJourneyExecutionActivityMetricsResponse,get_journey_execution_activity_metrics_response +GetJourneyExecutionMetricsRequest,get_journey_execution_metrics_request +GetJourneyExecutionMetricsResponse,get_journey_execution_metrics_response +GetJourneyRequest,get_journey_request +GetJourneyResponse,get_journey_response +GetJourneyRunExecutionActivityMetricsRequest,get_journey_run_execution_activity_metrics_request +GetJourneyRunExecutionActivityMetricsResponse,get_journey_run_execution_activity_metrics_response +GetJourneyRunExecutionMetricsRequest,get_journey_run_execution_metrics_request +GetJourneyRunExecutionMetricsResponse,get_journey_run_execution_metrics_response +GetJourneyRunsRequest,get_journey_runs_request +GetJourneyRunsResponse,get_journey_runs_response +GetKMSEncryptionKeyResult,get_kms_encryption_key_result +GetKeyGroupConfigRequest,get_key_group_config_request +GetKeyGroupConfigResult,get_key_group_config_result +GetKeyGroupRequest,get_key_group_request +GetKeyGroupResult,get_key_group_result +GetKeyInput,get_key_input +GetKeyOutput,get_key_output +GetKeyPairRequest,get_key_pair_request +GetKeyPairResult,get_key_pair_result +GetKeyPairsRequest,get_key_pairs_request +GetKeyPairsResult,get_key_pairs_result +GetKeyPolicyRequest,get_key_policy_request +GetKeyPolicyResponse,get_key_policy_response +GetKeyRotationStatusRequest,get_key_rotation_status_request +GetKeyRotationStatusResponse,get_key_rotation_status_response +GetKeyspaceRequest,get_keyspace_request +GetKeyspaceResponse,get_keyspace_response +GetKnowledgeBaseRequest,get_knowledge_base_request +GetKnowledgeBaseResponse,get_knowledge_base_response +GetKxChangesetRequest,get_kx_changeset_request +GetKxChangesetResponse,get_kx_changeset_response +GetKxClusterRequest,get_kx_cluster_request +GetKxClusterResponse,get_kx_cluster_response +GetKxConnectionStringRequest,get_kx_connection_string_request +GetKxConnectionStringResponse,get_kx_connection_string_response +GetKxDatabaseRequest,get_kx_database_request +GetKxDatabaseResponse,get_kx_database_response +GetKxEnvironmentRequest,get_kx_environment_request +GetKxEnvironmentResponse,get_kx_environment_response +GetKxUserRequest,get_kx_user_request +GetKxUserResponse,get_kx_user_response +GetLFTagRequest,get_lf_tag_request +GetLFTagResponse,get_lf_tag_response +GetLabelDetectionRequest,get_label_detection_request +GetLabelDetectionRequestMetadata,get_label_detection_request_metadata +GetLabelDetectionResponse,get_label_detection_response +GetLabelsRequest,get_labels_request +GetLabelsResult,get_labels_result +GetLambdaFunctionRecommendationsRequest,get_lambda_function_recommendations_request +GetLambdaFunctionRecommendationsResponse,get_lambda_function_recommendations_response +GetLatestAssessmentIdResponse,get_latest_assessment_id_response +GetLatestConfigurationRequest,get_latest_configuration_request +GetLatestConfigurationResponse,get_latest_configuration_response +GetLaunchConfigurationRequest,get_launch_configuration_request +GetLaunchProfileDetailsRequest,get_launch_profile_details_request +GetLaunchProfileDetailsResponse,get_launch_profile_details_response +GetLaunchProfileInitializationRequest,get_launch_profile_initialization_request +GetLaunchProfileInitializationResponse,get_launch_profile_initialization_response +GetLaunchProfileMemberRequest,get_launch_profile_member_request +GetLaunchProfileMemberResponse,get_launch_profile_member_response +GetLaunchProfileRequest,get_launch_profile_request +GetLaunchProfileResponse,get_launch_profile_response +GetLaunchRequest,get_launch_request +GetLaunchResponse,get_launch_response +GetLaunchTemplateDataRequest,get_launch_template_data_request +GetLaunchTemplateDataResult,get_launch_template_data_result +GetLayerVersionByArnRequest,get_layer_version_by_arn_request +GetLayerVersionPolicyRequest,get_layer_version_policy_request +GetLayerVersionPolicyResponse,get_layer_version_policy_response +GetLayerVersionRequest,get_layer_version_request +GetLayerVersionResponse,get_layer_version_response +GetLayoutRequest,get_layout_request +GetLayoutResponse,get_layout_response +GetLegalHoldInput,get_legal_hold_input +GetLegalHoldOutput,get_legal_hold_output +GetLendingAnalysisRequest,get_lending_analysis_request +GetLendingAnalysisResponse,get_lending_analysis_response +GetLendingAnalysisSummaryRequest,get_lending_analysis_summary_request +GetLendingAnalysisSummaryResponse,get_lending_analysis_summary_response +GetLensInput,get_lens_input +GetLensOutput,get_lens_output +GetLensReviewInput,get_lens_review_input +GetLensReviewOutput,get_lens_review_output +GetLensReviewReportInput,get_lens_review_report_input +GetLensReviewReportOutput,get_lens_review_report_output +GetLensVersionDifferenceInput,get_lens_version_difference_input +GetLensVersionDifferenceOutput,get_lens_version_difference_output +GetLexiconInput,get_lexicon_input +GetLexiconOutput,get_lexicon_output +GetLicenseConfigurationRequest,get_license_configuration_request +GetLicenseConfigurationResponse,get_license_configuration_response +GetLicenseConversionTaskRequest,get_license_conversion_task_request +GetLicenseConversionTaskResponse,get_license_conversion_task_response +GetLicenseManagerReportGeneratorRequest,get_license_manager_report_generator_request +GetLicenseManagerReportGeneratorResponse,get_license_manager_report_generator_response +GetLicenseRecommendationsRequest,get_license_recommendations_request +GetLicenseRecommendationsResponse,get_license_recommendations_response +GetLicenseRequest,get_license_request +GetLicenseResponse,get_license_response +GetLicenseUsageRequest,get_license_usage_request +GetLicenseUsageResponse,get_license_usage_response +GetLifecyclePoliciesRequest,get_lifecycle_policies_request +GetLifecyclePoliciesResponse,get_lifecycle_policies_response +GetLifecyclePolicyInput,get_lifecycle_policy_input +GetLifecyclePolicyOutput,get_lifecycle_policy_output +GetLifecyclePolicyPreviewRequest,get_lifecycle_policy_preview_request +GetLifecyclePolicyPreviewResponse,get_lifecycle_policy_preview_response +GetLifecyclePolicyRequest,get_lifecycle_policy_request +GetLifecyclePolicyResponse,get_lifecycle_policy_response +GetLineageGroupPolicyRequest,get_lineage_group_policy_request +GetLineageGroupPolicyResponse,get_lineage_group_policy_response +GetLinkAssociationsRequest,get_link_associations_request +GetLinkAssociationsResponse,get_link_associations_response +GetLinkAttributes,get_link_attributes +GetLinkAttributesRequest,get_link_attributes_request +GetLinkAttributesResponse,get_link_attributes_response +GetLinkInput,get_link_input +GetLinkOutput,get_link_output +GetLinksRequest,get_links_request +GetLinksResponse,get_links_response +GetListElementsRequest,get_list_elements_request +GetListElementsResult,get_list_elements_result +GetListenerRequest,get_listener_request +GetListenerResponse,get_listener_response +GetListsMetadataRequest,get_lists_metadata_request +GetListsMetadataResult,get_lists_metadata_result +GetLoadBalancerMetricDataRequest,get_load_balancer_metric_data_request +GetLoadBalancerMetricDataResult,get_load_balancer_metric_data_result +GetLoadBalancerRequest,get_load_balancer_request +GetLoadBalancerResult,get_load_balancer_result +GetLoadBalancerTlsCertificatesRequest,get_load_balancer_tls_certificates_request +GetLoadBalancerTlsCertificatesResult,get_load_balancer_tls_certificates_result +GetLoadBalancerTlsPoliciesRequest,get_load_balancer_tls_policies_request +GetLoadBalancerTlsPoliciesResult,get_load_balancer_tls_policies_result +GetLoadBalancersRequest,get_load_balancers_request +GetLoadBalancersResult,get_load_balancers_result +GetLoaderJobStatusInput,get_loader_job_status_input +GetLoaderJobStatusOutput,get_loader_job_status_output +GetLogDeliveryConfigurationRequest,get_log_delivery_configuration_request +GetLogDeliveryConfigurationResponse,get_log_delivery_configuration_response +GetLogEventsRequest,get_log_events_request +GetLogEventsResponse,get_log_events_response +GetLogGroupFieldsRequest,get_log_group_fields_request +GetLogGroupFieldsResponse,get_log_group_fields_response +GetLogLevelsByResourceTypesResponse,get_log_levels_by_resource_types_response +GetLogRecordRequest,get_log_record_request +GetLogRecordResponse,get_log_record_response +GetLoggerDefinitionRequest,get_logger_definition_request +GetLoggerDefinitionResponse,get_logger_definition_response +GetLoggerDefinitionVersionRequest,get_logger_definition_version_request +GetLoggerDefinitionVersionResponse,get_logger_definition_version_response +GetLoggingConfigurationRequest,get_logging_configuration_request +GetLoggingConfigurationResponse,get_logging_configuration_response +GetLoggingOptionsResponse,get_logging_options_response +GetLoginProfileRequest,get_login_profile_request +GetLoginProfileResponse,get_login_profile_response +GetLowLatencyHlsManifestConfiguration,get_low_latency_hls_manifest_configuration +GetMFADeviceRequest,get_mfa_device_request +GetMFADeviceResponse,get_mfa_device_response +GetMLDataProcessingJobInput,get_ml_data_processing_job_input +GetMLDataProcessingJobOutput,get_ml_data_processing_job_output +GetMLEndpointInput,get_ml_endpoint_input +GetMLEndpointOutput,get_ml_endpoint_output +GetMLModelInput,get_ml_model_input +GetMLModelOutput,get_ml_model_output +GetMLModelTrainingJobInput,get_ml_model_training_job_input +GetMLModelTrainingJobOutput,get_ml_model_training_job_output +GetMLModelTransformJobInput,get_ml_model_transform_job_input +GetMLModelTransformJobOutput,get_ml_model_transform_job_output +GetMLTaskRunRequest,get_ml_task_run_request +GetMLTaskRunResponse,get_ml_task_run_response +GetMLTaskRunsRequest,get_ml_task_runs_request +GetMLTaskRunsResponse,get_ml_task_runs_response +GetMLTransformRequest,get_ml_transform_request +GetMLTransformResponse,get_ml_transform_response +GetMLTransformsRequest,get_ml_transforms_request +GetMLTransformsResponse,get_ml_transforms_response +GetMacieSessionResponse,get_macie_session_response +GetMailDomainRequest,get_mail_domain_request +GetMailDomainResponse,get_mail_domain_response +GetMailboxDetailsRequest,get_mailbox_details_request +GetMailboxDetailsResponse,get_mailbox_details_response +GetMaintenanceWindowExecutionRequest,get_maintenance_window_execution_request +GetMaintenanceWindowExecutionResult,get_maintenance_window_execution_result +GetMaintenanceWindowExecutionTaskInvocationRequest,get_maintenance_window_execution_task_invocation_request +GetMaintenanceWindowExecutionTaskInvocationResult,get_maintenance_window_execution_task_invocation_result +GetMaintenanceWindowExecutionTaskRequest,get_maintenance_window_execution_task_request +GetMaintenanceWindowExecutionTaskResult,get_maintenance_window_execution_task_result +GetMaintenanceWindowRequest,get_maintenance_window_request +GetMaintenanceWindowResult,get_maintenance_window_result +GetMaintenanceWindowTaskRequest,get_maintenance_window_task_request +GetMaintenanceWindowTaskResult,get_maintenance_window_task_result +GetMalwareScanSettingsRequest,get_malware_scan_settings_request +GetMalwareScanSettingsResponse,get_malware_scan_settings_response +GetManagedEndpointSessionCredentialsRequest,get_managed_endpoint_session_credentials_request +GetManagedEndpointSessionCredentialsResponse,get_managed_endpoint_session_credentials_response +GetManagedPrefixListAssociationsRequest,get_managed_prefix_list_associations_request +GetManagedPrefixListAssociationsResult,get_managed_prefix_list_associations_result +GetManagedPrefixListEntriesRequest,get_managed_prefix_list_entries_request +GetManagedPrefixListEntriesResult,get_managed_prefix_list_entries_result +GetManagedResourceRequest,get_managed_resource_request +GetManagedResourceResponse,get_managed_resource_response +GetManagedRuleSetRequest,get_managed_rule_set_request +GetManagedRuleSetResponse,get_managed_rule_set_response +GetManagedScalingPolicyInput,get_managed_scaling_policy_input +GetManagedScalingPolicyOutput,get_managed_scaling_policy_output +GetMapGlyphsRequest,get_map_glyphs_request +GetMapGlyphsResponse,get_map_glyphs_response +GetMapSpritesRequest,get_map_sprites_request +GetMapSpritesResponse,get_map_sprites_response +GetMapStyleDescriptorRequest,get_map_style_descriptor_request +GetMapStyleDescriptorResponse,get_map_style_descriptor_response +GetMapTileRequest,get_map_tile_request +GetMapTileResponse,get_map_tile_response +GetMappingRequest,get_mapping_request +GetMappingResponse,get_mapping_response +GetMasterAccountRequest,get_master_account_request +GetMasterAccountResponse,get_master_account_response +GetMatchIdInput,get_match_id_input +GetMatchIdOutput,get_match_id_output +GetMatchesRequest,get_matches_request +GetMatchesResponse,get_matches_response +GetMatchingJobInput,get_matching_job_input +GetMatchingJobOutput,get_matching_job_output +GetMatchingWorkflowInput,get_matching_workflow_input +GetMatchingWorkflowOutput,get_matching_workflow_output +GetMediaCapturePipelineRequest,get_media_capture_pipeline_request +GetMediaCapturePipelineResponse,get_media_capture_pipeline_response +GetMediaForFragmentListInput,get_media_for_fragment_list_input +GetMediaForFragmentListOutput,get_media_for_fragment_list_output +GetMediaInput,get_media_input +GetMediaInsightsPipelineConfigurationRequest,get_media_insights_pipeline_configuration_request +GetMediaInsightsPipelineConfigurationResponse,get_media_insights_pipeline_configuration_response +GetMediaOutput,get_media_output +GetMediaPipelineKinesisVideoStreamPoolRequest,get_media_pipeline_kinesis_video_stream_pool_request +GetMediaPipelineKinesisVideoStreamPoolResponse,get_media_pipeline_kinesis_video_stream_pool_response +GetMediaPipelineRequest,get_media_pipeline_request +GetMediaPipelineResponse,get_media_pipeline_response +GetMedicalTranscriptionJobRequest,get_medical_transcription_job_request +GetMedicalTranscriptionJobResponse,get_medical_transcription_job_response +GetMedicalVocabularyRequest,get_medical_vocabulary_request +GetMedicalVocabularyResponse,get_medical_vocabulary_response +GetMeetingRequest,get_meeting_request +GetMeetingResponse,get_meeting_response +GetMemberDetectorsRequest,get_member_detectors_request +GetMemberDetectorsResponse,get_member_detectors_response +GetMemberInput,get_member_input +GetMemberOutput,get_member_output +GetMemberRequest,get_member_request +GetMemberResponse,get_member_response +GetMembersRequest,get_members_request +GetMembersResponse,get_members_response +GetMembershipInput,get_membership_input +GetMembershipOutput,get_membership_output +GetMergeCommitInput,get_merge_commit_input +GetMergeCommitOutput,get_merge_commit_output +GetMergeConflictsInput,get_merge_conflicts_input +GetMergeConflictsOutput,get_merge_conflicts_output +GetMergeOptionsInput,get_merge_options_input +GetMergeOptionsOutput,get_merge_options_output +GetMessageInsightsRequest,get_message_insights_request +GetMessageInsightsResponse,get_message_insights_response +GetMessagingSessionEndpointResponse,get_messaging_session_endpoint_response +GetMessagingStreamingConfigurationsRequest,get_messaging_streaming_configurations_request +GetMessagingStreamingConfigurationsResponse,get_messaging_streaming_configurations_response +GetMetadataRequest,get_metadata_request +GetMetadataResponse,get_metadata_response +GetMethodRequest,get_method_request +GetMethodResponseRequest,get_method_response_request +GetMetricDataInput,get_metric_data_input +GetMetricDataOutput,get_metric_data_output +GetMetricDataRequest,get_metric_data_request +GetMetricDataResponse,get_metric_data_response +GetMetricDataV2Request,get_metric_data_v2_request +GetMetricDataV2Response,get_metric_data_v2_response +GetMetricPolicyInput,get_metric_policy_input +GetMetricPolicyOutput,get_metric_policy_output +GetMetricStatisticsInput,get_metric_statistics_input +GetMetricStatisticsOutput,get_metric_statistics_output +GetMetricStreamInput,get_metric_stream_input +GetMetricStreamOutput,get_metric_stream_output +GetMetricWidgetImageInput,get_metric_widget_image_input +GetMetricWidgetImageOutput,get_metric_widget_image_output +GetMetricsSummaryRequest,get_metrics_summary_request +GetMetricsSummaryResponse,get_metrics_summary_response +GetMigrationRequest,get_migration_request +GetMigrationResponse,get_migration_response +GetMigrationWorkflowRequest,get_migration_workflow_request +GetMigrationWorkflowResponse,get_migration_workflow_response +GetMigrationWorkflowTemplateRequest,get_migration_workflow_template_request +GetMigrationWorkflowTemplateResponse,get_migration_workflow_template_response +GetMigrationsRequest,get_migrations_request +GetMigrationsResponse,get_migrations_response +GetMilestoneInput,get_milestone_input +GetMilestoneOutput,get_milestone_output +GetMinuteUsageRequest,get_minute_usage_request +GetMinuteUsageResponse,get_minute_usage_response +GetMissionProfileRequest,get_mission_profile_request +GetMissionProfileResponse,get_mission_profile_response +GetMobileDeviceAccessEffectRequest,get_mobile_device_access_effect_request +GetMobileDeviceAccessEffectResponse,get_mobile_device_access_effect_response +GetMobileDeviceAccessOverrideRequest,get_mobile_device_access_override_request +GetMobileDeviceAccessOverrideResponse,get_mobile_device_access_override_response +GetMobileSdkReleaseRequest,get_mobile_sdk_release_request +GetMobileSdkReleaseResponse,get_mobile_sdk_release_response +GetModelCustomizationJobRequest,get_model_customization_job_request +GetModelCustomizationJobResponse,get_model_customization_job_response +GetModelInvocationLoggingConfigurationResponse,get_model_invocation_logging_configuration_response +GetModelManifestRequest,get_model_manifest_request +GetModelManifestResponse,get_model_manifest_response +GetModelPackageGroupPolicyInput,get_model_package_group_policy_input +GetModelPackageGroupPolicyOutput,get_model_package_group_policy_output +GetModelRequest,get_model_request +GetModelResponse,get_model_response +GetModelTemplateRequest,get_model_template_request +GetModelTemplateResponse,get_model_template_response +GetModelVersionRequest,get_model_version_request +GetModelVersionResult,get_model_version_result +GetModelsRequest,get_models_request +GetModelsResponse,get_models_response +GetModelsResult,get_models_result +GetMonitorInput,get_monitor_input +GetMonitorOutput,get_monitor_output +GetMonitoringSubscriptionRequest,get_monitoring_subscription_request +GetMonitoringSubscriptionResult,get_monitoring_subscription_result +GetMultiRegionAccessPointPolicyRequest,get_multi_region_access_point_policy_request +GetMultiRegionAccessPointPolicyResult,get_multi_region_access_point_policy_result +GetMultiRegionAccessPointPolicyStatusRequest,get_multi_region_access_point_policy_status_request +GetMultiRegionAccessPointPolicyStatusResult,get_multi_region_access_point_policy_status_result +GetMultiRegionAccessPointRequest,get_multi_region_access_point_request +GetMultiRegionAccessPointResult,get_multi_region_access_point_result +GetMultiRegionAccessPointRoutesRequest,get_multi_region_access_point_routes_request +GetMultiRegionAccessPointRoutesResult,get_multi_region_access_point_routes_result +GetMulticastGroupRequest,get_multicast_group_request +GetMulticastGroupResponse,get_multicast_group_response +GetMulticastGroupSessionRequest,get_multicast_group_session_request +GetMulticastGroupSessionResponse,get_multicast_group_session_response +GetNamedQueryInput,get_named_query_input +GetNamedQueryOutput,get_named_query_output +GetNamespaceDeletionStatusResponse,get_namespace_deletion_status_response +GetNamespaceRequest,get_namespace_request +GetNamespaceResponse,get_namespace_response +GetNetworkAnalyzerConfigurationRequest,get_network_analyzer_configuration_request +GetNetworkAnalyzerConfigurationResponse,get_network_analyzer_configuration_response +GetNetworkInput,get_network_input +GetNetworkInsightsAccessScopeAnalysisFindingsRequest,get_network_insights_access_scope_analysis_findings_request +GetNetworkInsightsAccessScopeAnalysisFindingsResult,get_network_insights_access_scope_analysis_findings_result +GetNetworkInsightsAccessScopeContentRequest,get_network_insights_access_scope_content_request +GetNetworkInsightsAccessScopeContentResult,get_network_insights_access_scope_content_result +GetNetworkOutput,get_network_output +GetNetworkProfileRequest,get_network_profile_request +GetNetworkProfileResponse,get_network_profile_response +GetNetworkProfileResult,get_network_profile_result +GetNetworkRequest,get_network_request +GetNetworkResourceCountsRequest,get_network_resource_counts_request +GetNetworkResourceCountsResponse,get_network_resource_counts_response +GetNetworkResourceRelationshipsRequest,get_network_resource_relationships_request +GetNetworkResourceRelationshipsResponse,get_network_resource_relationships_response +GetNetworkResourceRequest,get_network_resource_request +GetNetworkResourceResponse,get_network_resource_response +GetNetworkResourcesRequest,get_network_resources_request +GetNetworkResourcesResponse,get_network_resources_response +GetNetworkResponse,get_network_response +GetNetworkRoutesRequest,get_network_routes_request +GetNetworkRoutesResponse,get_network_routes_response +GetNetworkSettingsRequest,get_network_settings_request +GetNetworkSettingsResponse,get_network_settings_response +GetNetworkSiteRequest,get_network_site_request +GetNetworkSiteResponse,get_network_site_response +GetNetworkTelemetryRequest,get_network_telemetry_request +GetNetworkTelemetryResponse,get_network_telemetry_response +GetNodeInput,get_node_input +GetNodeOutput,get_node_output +GetNotebookMetadataInput,get_notebook_metadata_input +GetNotebookMetadataOutput,get_notebook_metadata_output +GetNotificationChannelResponse,get_notification_channel_response +GetNotificationConfigurationRequest,get_notification_configuration_request +GetNotificationConfigurationResponse,get_notification_configuration_response +GetOTAUpdateRequest,get_ota_update_request +GetOTAUpdateResponse,get_ota_update_response +GetObjectAclOutput,get_object_acl_output +GetObjectAclRequest,get_object_acl_request +GetObjectAttributes,get_object_attributes +GetObjectAttributesOutput,get_object_attributes_output +GetObjectAttributesParts,get_object_attributes_parts +GetObjectAttributesRequest,get_object_attributes_request +GetObjectAttributesResponse,get_object_attributes_response +GetObjectInformation,get_object_information +GetObjectInformationRequest,get_object_information_request +GetObjectInformationResponse,get_object_information_response +GetObjectLegalHoldOutput,get_object_legal_hold_output +GetObjectLegalHoldRequest,get_object_legal_hold_request +GetObjectLockConfigurationOutput,get_object_lock_configuration_output +GetObjectLockConfigurationRequest,get_object_lock_configuration_request +GetObjectMetadataInput,get_object_metadata_input +GetObjectMetadataOutput,get_object_metadata_output +GetObjectOutput,get_object_output +GetObjectRequest,get_object_request +GetObjectResponse,get_object_response +GetObjectRetentionOutput,get_object_retention_output +GetObjectRetentionRequest,get_object_retention_request +GetObjectTaggingOutput,get_object_tagging_output +GetObjectTaggingRequest,get_object_tagging_request +GetObjectTorrentOutput,get_object_torrent_output +GetObjectTorrentRequest,get_object_torrent_request +GetOfferingStatusRequest,get_offering_status_request +GetOfferingStatusResult,get_offering_status_result +GetOnPremisesInstanceInput,get_on_premises_instance_input +GetOnPremisesInstanceOutput,get_on_premises_instance_output +GetOpenCypherQueryStatusInput,get_open_cypher_query_status_input +GetOpenCypherQueryStatusOutput,get_open_cypher_query_status_output +GetOpenIDConnectProviderRequest,get_open_id_connect_provider_request +GetOpenIDConnectProviderResponse,get_open_id_connect_provider_response +GetOpenIdTokenForDeveloperIdentityInput,get_open_id_token_for_developer_identity_input +GetOpenIdTokenForDeveloperIdentityResponse,get_open_id_token_for_developer_identity_response +GetOpenIdTokenInput,get_open_id_token_input +GetOpenIdTokenResponse,get_open_id_token_response +GetOperationDetailRequest,get_operation_detail_request +GetOperationDetailResponse,get_operation_detail_response +GetOperationInput,get_operation_input +GetOperationOutput,get_operation_output +GetOperationRequest,get_operation_request +GetOperationResponse,get_operation_response +GetOperationResult,get_operation_result +GetOperationsForResourceRequest,get_operations_for_resource_request +GetOperationsForResourceResult,get_operations_for_resource_result +GetOperationsRequest,get_operations_request +GetOperationsResult,get_operations_result +GetOpsItemRequest,get_ops_item_request +GetOpsItemResponse,get_ops_item_response +GetOpsMetadataRequest,get_ops_metadata_request +GetOpsMetadataResult,get_ops_metadata_result +GetOpsSummaryRequest,get_ops_summary_request +GetOpsSummaryResult,get_ops_summary_result +GetOrderInput,get_order_input +GetOrderOutput,get_order_output +GetOrderRequest,get_order_request +GetOrderResponse,get_order_response +GetOrganizationAdminAccountResponse,get_organization_admin_account_response +GetOrganizationConfigRuleDetailedStatusRequest,get_organization_config_rule_detailed_status_request +GetOrganizationConfigRuleDetailedStatusResponse,get_organization_config_rule_detailed_status_response +GetOrganizationConformancePackDetailedStatusRequest,get_organization_conformance_pack_detailed_status_request +GetOrganizationConformancePackDetailedStatusResponse,get_organization_conformance_pack_detailed_status_response +GetOrganizationCustomRulePolicyRequest,get_organization_custom_rule_policy_request +GetOrganizationCustomRulePolicyResponse,get_organization_custom_rule_policy_response +GetOrganizationsAccessReportRequest,get_organizations_access_report_request +GetOrganizationsAccessReportResponse,get_organizations_access_report_response +GetOriginAccessControlConfigRequest,get_origin_access_control_config_request +GetOriginAccessControlConfigResult,get_origin_access_control_config_result +GetOriginAccessControlRequest,get_origin_access_control_request +GetOriginAccessControlResult,get_origin_access_control_result +GetOriginEndpointPolicyRequest,get_origin_endpoint_policy_request +GetOriginEndpointPolicyResponse,get_origin_endpoint_policy_response +GetOriginEndpointRequest,get_origin_endpoint_request +GetOriginEndpointResponse,get_origin_endpoint_response +GetOriginRequestPolicyConfigRequest,get_origin_request_policy_config_request +GetOriginRequestPolicyConfigResult,get_origin_request_policy_config_result +GetOriginRequestPolicyRequest,get_origin_request_policy_request +GetOriginRequestPolicyResult,get_origin_request_policy_result +GetOutcomesRequest,get_outcomes_request +GetOutcomesResult,get_outcomes_result +GetOutpostInput,get_outpost_input +GetOutpostInstanceTypesInput,get_outpost_instance_types_input +GetOutpostInstanceTypesOutput,get_outpost_instance_types_output +GetOutpostOutput,get_outpost_output +GetOutpostResolverRequest,get_outpost_resolver_request +GetOutpostResolverResponse,get_outpost_resolver_response +GetPackageConfigurationResponse,get_package_configuration_response +GetPackageRequest,get_package_request +GetPackageResponse,get_package_response +GetPackageVersionAssetRequest,get_package_version_asset_request +GetPackageVersionAssetResult,get_package_version_asset_result +GetPackageVersionHistoryRequest,get_package_version_history_request +GetPackageVersionHistoryResponse,get_package_version_history_response +GetPackageVersionReadmeRequest,get_package_version_readme_request +GetPackageVersionReadmeResult,get_package_version_readme_result +GetPackageVersionRequest,get_package_version_request +GetPackageVersionResponse,get_package_version_response +GetParallelDataRequest,get_parallel_data_request +GetParallelDataResponse,get_parallel_data_response +GetParameterHistoryRequest,get_parameter_history_request +GetParameterHistoryResult,get_parameter_history_result +GetParameterRequest,get_parameter_request +GetParameterResult,get_parameter_result +GetParametersByPathRequest,get_parameters_by_path_request +GetParametersByPathResult,get_parameters_by_path_result +GetParametersForExportInput,get_parameters_for_export_input +GetParametersForExportOutput,get_parameters_for_export_output +GetParametersForImportInput,get_parameters_for_import_input +GetParametersForImportOutput,get_parameters_for_import_output +GetParametersForImportRequest,get_parameters_for_import_request +GetParametersForImportResponse,get_parameters_for_import_response +GetParametersRequest,get_parameters_request +GetParametersResult,get_parameters_result +GetParticipantRequest,get_participant_request +GetParticipantResponse,get_participant_response +GetPartitionIndexesRequest,get_partition_indexes_request +GetPartitionIndexesResponse,get_partition_indexes_response +GetPartitionRequest,get_partition_request +GetPartitionResponse,get_partition_response +GetPartitionsRequest,get_partitions_request +GetPartitionsResponse,get_partitions_response +GetPartnerAccountRequest,get_partner_account_request +GetPartnerAccountResponse,get_partner_account_response +GetPasswordDataRequest,get_password_data_request +GetPasswordDataResult,get_password_data_result +GetPatchBaselineForPatchGroupRequest,get_patch_baseline_for_patch_group_request +GetPatchBaselineForPatchGroupResult,get_patch_baseline_for_patch_group_result +GetPatchBaselineRequest,get_patch_baseline_request +GetPatchBaselineResult,get_patch_baseline_result +GetPendingJobExecutionsRequest,get_pending_job_executions_request +GetPendingJobExecutionsResponse,get_pending_job_executions_response +GetPercentilesRequest,get_percentiles_request +GetPercentilesResponse,get_percentiles_response +GetPerformanceAnalysisReportRequest,get_performance_analysis_report_request +GetPerformanceAnalysisReportResponse,get_performance_analysis_report_response +GetPermissionGroupRequest,get_permission_group_request +GetPermissionGroupResponse,get_permission_group_response +GetPermissionPolicyRequest,get_permission_policy_request +GetPermissionPolicyResponse,get_permission_policy_response +GetPermissionRequest,get_permission_request +GetPermissionResponse,get_permission_response +GetPermissionsBoundaryForPermissionSetRequest,get_permissions_boundary_for_permission_set_request +GetPermissionsBoundaryForPermissionSetResponse,get_permissions_boundary_for_permission_set_response +GetPersonTrackingRequest,get_person_tracking_request +GetPersonTrackingResponse,get_person_tracking_response +GetPersonalizedRankingRequest,get_personalized_ranking_request +GetPersonalizedRankingResponse,get_personalized_ranking_response +GetPhoneNumberOrderRequest,get_phone_number_order_request +GetPhoneNumberOrderResponse,get_phone_number_order_response +GetPhoneNumberRequest,get_phone_number_request +GetPhoneNumberResponse,get_phone_number_response +GetPhoneNumberSettingsResponse,get_phone_number_settings_response +GetPipelineBlueprintRequest,get_pipeline_blueprint_request +GetPipelineBlueprintResponse,get_pipeline_blueprint_response +GetPipelineChangeProgressRequest,get_pipeline_change_progress_request +GetPipelineChangeProgressResponse,get_pipeline_change_progress_response +GetPipelineDefinitionInput,get_pipeline_definition_input +GetPipelineDefinitionOutput,get_pipeline_definition_output +GetPipelineExecutionInput,get_pipeline_execution_input +GetPipelineExecutionOutput,get_pipeline_execution_output +GetPipelineInput,get_pipeline_input +GetPipelineOutput,get_pipeline_output +GetPipelineRequest,get_pipeline_request +GetPipelineResponse,get_pipeline_response +GetPipelineStateInput,get_pipeline_state_input +GetPipelineStateOutput,get_pipeline_state_output +GetPlaceRequest,get_place_request +GetPlaceResponse,get_place_response +GetPlanRequest,get_plan_request +GetPlanResponse,get_plan_response +GetPlatformApplicationAttributesInput,get_platform_application_attributes_input +GetPlatformApplicationAttributesResponse,get_platform_application_attributes_response +GetPlaybackConfigurationRequest,get_playback_configuration_request +GetPlaybackConfigurationResponse,get_playback_configuration_response +GetPlaybackKeyPairRequest,get_playback_key_pair_request +GetPlaybackKeyPairResponse,get_playback_key_pair_response +GetPlayerConnectionStatusRequest,get_player_connection_status_request +GetPlayerConnectionStatusResult,get_player_connection_status_result +GetPoliciesStatsResponse,get_policies_stats_response +GetPolicyInput,get_policy_input +GetPolicyOutput,get_policy_output +GetPolicyRequest,get_policy_request +GetPolicyResponse,get_policy_response +GetPolicyStoreInput,get_policy_store_input +GetPolicyStoreOutput,get_policy_store_output +GetPolicyTemplateInput,get_policy_template_input +GetPolicyTemplateOutput,get_policy_template_output +GetPolicyVersionRequest,get_policy_version_request +GetPolicyVersionResponse,get_policy_version_response +GetPortalRequest,get_portal_request +GetPortalResponse,get_portal_response +GetPortalServiceProviderMetadataRequest,get_portal_service_provider_metadata_request +GetPortalServiceProviderMetadataResponse,get_portal_service_provider_metadata_response +GetPortfolioPreferencesResponse,get_portfolio_preferences_response +GetPortfolioSummaryResponse,get_portfolio_summary_response +GetPositionConfigurationRequest,get_position_configuration_request +GetPositionConfigurationResponse,get_position_configuration_response +GetPositionEstimateRequest,get_position_estimate_request +GetPositionEstimateResponse,get_position_estimate_response +GetPositionRequest,get_position_request +GetPositionResponse,get_position_response +GetPredictiveScalingForecastAnswer,get_predictive_scaling_forecast_answer +GetPredictiveScalingForecastType,get_predictive_scaling_forecast_type +GetPrefetchScheduleRequest,get_prefetch_schedule_request +GetPrefetchScheduleResponse,get_prefetch_schedule_response +GetPreparedStatementInput,get_prepared_statement_input +GetPreparedStatementOutput,get_prepared_statement_output +GetPresetRequest,get_preset_request +GetPresetResponse,get_preset_response +GetPriceListFileUrlRequest,get_price_list_file_url_request +GetPriceListFileUrlResponse,get_price_list_file_url_response +GetPricingPlanResponse,get_pricing_plan_response +GetPrincipalTagAttributeMapInput,get_principal_tag_attribute_map_input +GetPrincipalTagAttributeMapResponse,get_principal_tag_attribute_map_response +GetProductsRequest,get_products_request +GetProductsResponse,get_products_response +GetProfileInput,get_profile_input +GetProfileObjectTypeRequest,get_profile_object_type_request +GetProfileObjectTypeResponse,get_profile_object_type_response +GetProfileObjectTypeTemplateRequest,get_profile_object_type_template_request +GetProfileObjectTypeTemplateResponse,get_profile_object_type_template_response +GetProfileOutput,get_profile_output +GetProfileRequest,get_profile_request +GetProfileResponse,get_profile_response +GetProfileTemplateOutput,get_profile_template_output +GetProgrammaticAccessCredentialsRequest,get_programmatic_access_credentials_request +GetProgrammaticAccessCredentialsResponse,get_programmatic_access_credentials_response +GetProjectRequest,get_project_request +GetProjectResponse,get_project_response +GetProjectResult,get_project_result +GetPromptFileRequest,get_prompt_file_request +GetPromptFileResponse,get_prompt_file_response +GetPropertyValueHistoryRequest,get_property_value_history_request +GetPropertyValueHistoryResponse,get_property_value_history_response +GetPropertyValueRequest,get_property_value_request +GetPropertyValueResponse,get_property_value_response +GetPropertygraphStatisticsOutput,get_propertygraph_statistics_output +GetPropertygraphStreamInput,get_propertygraph_stream_input +GetPropertygraphStreamOutput,get_propertygraph_stream_output +GetPropertygraphSummaryInput,get_propertygraph_summary_input +GetPropertygraphSummaryOutput,get_propertygraph_summary_output +GetProposalInput,get_proposal_input +GetProposalOutput,get_proposal_output +GetProtectedQueryInput,get_protected_query_input +GetProtectedQueryOutput,get_protected_query_output +GetProtectionStatusRequest,get_protection_status_request +GetProtectionStatusResponse,get_protection_status_response +GetProtocolsListRequest,get_protocols_list_request +GetProtocolsListResponse,get_protocols_list_response +GetProvisionedConcurrencyConfigRequest,get_provisioned_concurrency_config_request +GetProvisionedConcurrencyConfigResponse,get_provisioned_concurrency_config_response +GetProvisionedModelThroughputRequest,get_provisioned_model_throughput_request +GetProvisionedModelThroughputResponse,get_provisioned_model_throughput_response +GetProvisionedProductOutputsInput,get_provisioned_product_outputs_input +GetProvisionedProductOutputsOutput,get_provisioned_product_outputs_output +GetProxySessionRequest,get_proxy_session_request +GetProxySessionResponse,get_proxy_session_response +GetPublicAccessBlockOutput,get_public_access_block_output +GetPublicAccessBlockRequest,get_public_access_block_request +GetPublicKeyCertificateInput,get_public_key_certificate_input +GetPublicKeyCertificateOutput,get_public_key_certificate_output +GetPublicKeyConfigRequest,get_public_key_config_request +GetPublicKeyConfigResult,get_public_key_config_result +GetPublicKeyRequest,get_public_key_request +GetPublicKeyResponse,get_public_key_response +GetPublicKeyResult,get_public_key_result +GetPullRequestApprovalStatesInput,get_pull_request_approval_states_input +GetPullRequestApprovalStatesOutput,get_pull_request_approval_states_output +GetPullRequestInput,get_pull_request_input +GetPullRequestOutput,get_pull_request_output +GetPullRequestOverrideStateInput,get_pull_request_override_state_input +GetPullRequestOverrideStateOutput,get_pull_request_override_state_output +GetPushTemplateRequest,get_push_template_request +GetPushTemplateResponse,get_push_template_response +GetQualificationScoreRequest,get_qualification_score_request +GetQualificationScoreResponse,get_qualification_score_response +GetQualificationTypeRequest,get_qualification_type_request +GetQualificationTypeResponse,get_qualification_type_response +GetQuantumTaskRequest,get_quantum_task_request +GetQuantumTaskResponse,get_quantum_task_response +GetQueryExecutionInput,get_query_execution_input +GetQueryExecutionOutput,get_query_execution_output +GetQueryLoggingConfigRequest,get_query_logging_config_request +GetQueryLoggingConfigResponse,get_query_logging_config_response +GetQueryResultsInput,get_query_results_input +GetQueryResultsOutput,get_query_results_output +GetQueryResultsRequest,get_query_results_request +GetQueryResultsResponse,get_query_results_response +GetQueryRuntimeStatisticsInput,get_query_runtime_statistics_input +GetQueryRuntimeStatisticsOutput,get_query_runtime_statistics_output +GetQueryStateRequest,get_query_state_request +GetQueryStateResponse,get_query_state_response +GetQueryStatisticsRequest,get_query_statistics_request +GetQueryStatisticsResponse,get_query_statistics_response +GetQuerySuggestionsRequest,get_query_suggestions_request +GetQuerySuggestionsResponse,get_query_suggestions_response +GetQueueAttributesRequest,get_queue_attributes_request +GetQueueAttributesResult,get_queue_attributes_result +GetQueueRequest,get_queue_request +GetQueueResponse,get_queue_response +GetQueueUrlRequest,get_queue_url_request +GetQueueUrlResult,get_queue_url_result +GetRDFGraphSummaryInput,get_rdf_graph_summary_input +GetRDFGraphSummaryOutput,get_rdf_graph_summary_output +GetRandomPasswordRequest,get_random_password_request +GetRandomPasswordResponse,get_random_password_response +GetRasterDataCollectionInput,get_raster_data_collection_input +GetRasterDataCollectionOutput,get_raster_data_collection_output +GetRateBasedRuleManagedKeysRequest,get_rate_based_rule_managed_keys_request +GetRateBasedRuleManagedKeysResponse,get_rate_based_rule_managed_keys_response +GetRateBasedRuleRequest,get_rate_based_rule_request +GetRateBasedRuleResponse,get_rate_based_rule_response +GetRateBasedStatementManagedKeysRequest,get_rate_based_statement_managed_keys_request +GetRateBasedStatementManagedKeysResponse,get_rate_based_statement_managed_keys_response +GetRawMessageContentRequest,get_raw_message_content_request +GetRawMessageContentResponse,get_raw_message_content_response +GetReadSetActivationJobRequest,get_read_set_activation_job_request +GetReadSetActivationJobResponse,get_read_set_activation_job_response +GetReadSetExportJobRequest,get_read_set_export_job_request +GetReadSetExportJobResponse,get_read_set_export_job_response +GetReadSetImportJobRequest,get_read_set_import_job_request +GetReadSetImportJobResponse,get_read_set_import_job_response +GetReadSetMetadataRequest,get_read_set_metadata_request +GetReadSetMetadataResponse,get_read_set_metadata_response +GetReadSetRequest,get_read_set_request +GetReadSetResponse,get_read_set_response +GetReadinessCheckRequest,get_readiness_check_request +GetReadinessCheckResourceStatusRequest,get_readiness_check_resource_status_request +GetReadinessCheckResourceStatusResponse,get_readiness_check_resource_status_response +GetReadinessCheckResponse,get_readiness_check_response +GetReadinessCheckStatusRequest,get_readiness_check_status_request +GetReadinessCheckStatusResponse,get_readiness_check_status_response +GetRealtimeLogConfigRequest,get_realtime_log_config_request +GetRealtimeLogConfigResult,get_realtime_log_config_result +GetRecommendationError,get_recommendation_error +GetRecommendationPreferencesRequest,get_recommendation_preferences_request +GetRecommendationPreferencesResponse,get_recommendation_preferences_response +GetRecommendationReportDetailsRequest,get_recommendation_report_details_request +GetRecommendationReportDetailsResponse,get_recommendation_report_details_response +GetRecommendationSummariesRequest,get_recommendation_summaries_request +GetRecommendationSummariesResponse,get_recommendation_summaries_response +GetRecommendationsRequest,get_recommendations_request +GetRecommendationsResponse,get_recommendations_response +GetRecommenderConfigurationRequest,get_recommender_configuration_request +GetRecommenderConfigurationResponse,get_recommender_configuration_response +GetRecommenderConfigurationsRequest,get_recommender_configurations_request +GetRecommenderConfigurationsResponse,get_recommender_configurations_response +GetRecordRequest,get_record_request +GetRecordResponse,get_record_response +GetRecordingConfigurationRequest,get_recording_configuration_request +GetRecordingConfigurationResponse,get_recording_configuration_response +GetRecordsInput,get_records_input +GetRecordsOutput,get_records_output +GetRecoveryGroupReadinessSummaryRequest,get_recovery_group_readiness_summary_request +GetRecoveryGroupReadinessSummaryResponse,get_recovery_group_readiness_summary_response +GetRecoveryGroupRequest,get_recovery_group_request +GetRecoveryGroupResponse,get_recovery_group_response +GetRecoveryPointRequest,get_recovery_point_request +GetRecoveryPointResponse,get_recovery_point_response +GetRecoveryPointRestoreMetadataInput,get_recovery_point_restore_metadata_input +GetRecoveryPointRestoreMetadataOutput,get_recovery_point_restore_metadata_output +GetReferenceImportJobRequest,get_reference_import_job_request +GetReferenceImportJobResponse,get_reference_import_job_response +GetReferenceMetadataRequest,get_reference_metadata_request +GetReferenceMetadataResponse,get_reference_metadata_response +GetReferenceRequest,get_reference_request +GetReferenceResponse,get_reference_response +GetReferenceStoreRequest,get_reference_store_request +GetReferenceStoreResponse,get_reference_store_response +GetRegexMatchSetRequest,get_regex_match_set_request +GetRegexMatchSetResponse,get_regex_match_set_response +GetRegexPatternSetRequest,get_regex_pattern_set_request +GetRegexPatternSetResponse,get_regex_pattern_set_response +GetRegionOptStatusRequest,get_region_opt_status_request +GetRegionOptStatusResponse,get_region_opt_status_response +GetRegionsRequest,get_regions_request +GetRegionsResult,get_regions_result +GetRegisterAccountStatusResponse,get_register_account_status_response +GetRegistrationCodeResponse,get_registration_code_response +GetRegistryCatalogDataResponse,get_registry_catalog_data_response +GetRegistryInput,get_registry_input +GetRegistryPolicyResponse,get_registry_policy_response +GetRegistryResponse,get_registry_response +GetRegistryScanningConfigurationResponse,get_registry_scanning_configuration_response +GetRelationalDatabaseBlueprintsRequest,get_relational_database_blueprints_request +GetRelationalDatabaseBlueprintsResult,get_relational_database_blueprints_result +GetRelationalDatabaseBundlesRequest,get_relational_database_bundles_request +GetRelationalDatabaseBundlesResult,get_relational_database_bundles_result +GetRelationalDatabaseEventsRequest,get_relational_database_events_request +GetRelationalDatabaseEventsResult,get_relational_database_events_result +GetRelationalDatabaseLogEventsRequest,get_relational_database_log_events_request +GetRelationalDatabaseLogEventsResult,get_relational_database_log_events_result +GetRelationalDatabaseLogStreamsRequest,get_relational_database_log_streams_request +GetRelationalDatabaseLogStreamsResult,get_relational_database_log_streams_result +GetRelationalDatabaseMasterUserPasswordRequest,get_relational_database_master_user_password_request +GetRelationalDatabaseMasterUserPasswordResult,get_relational_database_master_user_password_result +GetRelationalDatabaseMetricDataRequest,get_relational_database_metric_data_request +GetRelationalDatabaseMetricDataResult,get_relational_database_metric_data_result +GetRelationalDatabaseParametersRequest,get_relational_database_parameters_request +GetRelationalDatabaseParametersResult,get_relational_database_parameters_result +GetRelationalDatabaseRequest,get_relational_database_request +GetRelationalDatabaseResult,get_relational_database_result +GetRelationalDatabaseSnapshotRequest,get_relational_database_snapshot_request +GetRelationalDatabaseSnapshotResult,get_relational_database_snapshot_result +GetRelationalDatabaseSnapshotsRequest,get_relational_database_snapshots_request +GetRelationalDatabaseSnapshotsResult,get_relational_database_snapshots_result +GetRelationalDatabasesRequest,get_relational_databases_request +GetRelationalDatabasesResult,get_relational_databases_result +GetRemainingFreeTrialDaysRequest,get_remaining_free_trial_days_request +GetRemainingFreeTrialDaysResponse,get_remaining_free_trial_days_response +GetRemoteAccessSessionRequest,get_remote_access_session_request +GetRemoteAccessSessionResult,get_remote_access_session_result +GetReplicationConfigurationRequest,get_replication_configuration_request +GetReplicationJobsRequest,get_replication_jobs_request +GetReplicationJobsResponse,get_replication_jobs_response +GetReplicationRunsRequest,get_replication_runs_request +GetReplicationRunsResponse,get_replication_runs_response +GetReplicationSetInput,get_replication_set_input +GetReplicationSetOutput,get_replication_set_output +GetReportDefinitionRequest,get_report_definition_request +GetReportDefinitionResult,get_report_definition_result +GetReportGroupTrendInput,get_report_group_trend_input +GetReportGroupTrendOutput,get_report_group_trend_output +GetRepositoryCatalogDataRequest,get_repository_catalog_data_request +GetRepositoryCatalogDataResponse,get_repository_catalog_data_response +GetRepositoryEndpointRequest,get_repository_endpoint_request +GetRepositoryEndpointResult,get_repository_endpoint_result +GetRepositoryInput,get_repository_input +GetRepositoryOutput,get_repository_output +GetRepositoryPermissionsPolicyRequest,get_repository_permissions_policy_request +GetRepositoryPermissionsPolicyResult,get_repository_permissions_policy_result +GetRepositoryPolicyRequest,get_repository_policy_request +GetRepositoryPolicyResponse,get_repository_policy_response +GetRepositorySyncStatusInput,get_repository_sync_status_input +GetRepositorySyncStatusOutput,get_repository_sync_status_output +GetRepositoryTriggersInput,get_repository_triggers_input +GetRepositoryTriggersOutput,get_repository_triggers_output +GetRequestMetadata,get_request_metadata +GetRequestValidatorRequest,get_request_validator_request +GetRequestValidatorsRequest,get_request_validators_request +GetRequestedServiceQuotaChangeRequest,get_requested_service_quota_change_request +GetRequestedServiceQuotaChangeResponse,get_requested_service_quota_change_response +GetReservationCoverageRequest,get_reservation_coverage_request +GetReservationCoverageResponse,get_reservation_coverage_response +GetReservationPurchaseRecommendationRequest,get_reservation_purchase_recommendation_request +GetReservationPurchaseRecommendationResponse,get_reservation_purchase_recommendation_response +GetReservationUtilizationRequest,get_reservation_utilization_request +GetReservationUtilizationResponse,get_reservation_utilization_response +GetReservedInstancesExchangeQuoteRequest,get_reserved_instances_exchange_quote_request +GetReservedInstancesExchangeQuoteResult,get_reserved_instances_exchange_quote_result +GetReservedNodeExchangeConfigurationOptionsInputMessage,get_reserved_node_exchange_configuration_options_input_message +GetReservedNodeExchangeConfigurationOptionsOutputMessage,get_reserved_node_exchange_configuration_options_output_message +GetReservedNodeExchangeOfferingsInputMessage,get_reserved_node_exchange_offerings_input_message +GetReservedNodeExchangeOfferingsOutputMessage,get_reserved_node_exchange_offerings_output_message +GetResolverConfigRequest,get_resolver_config_request +GetResolverConfigResponse,get_resolver_config_response +GetResolverDnssecConfigRequest,get_resolver_dnssec_config_request +GetResolverDnssecConfigResponse,get_resolver_dnssec_config_response +GetResolverEndpointRequest,get_resolver_endpoint_request +GetResolverEndpointResponse,get_resolver_endpoint_response +GetResolverQueryLogConfigAssociationRequest,get_resolver_query_log_config_association_request +GetResolverQueryLogConfigAssociationResponse,get_resolver_query_log_config_association_response +GetResolverQueryLogConfigPolicyRequest,get_resolver_query_log_config_policy_request +GetResolverQueryLogConfigPolicyResponse,get_resolver_query_log_config_policy_response +GetResolverQueryLogConfigRequest,get_resolver_query_log_config_request +GetResolverQueryLogConfigResponse,get_resolver_query_log_config_response +GetResolverRequest,get_resolver_request +GetResolverResponse,get_resolver_response +GetResolverRuleAssociationRequest,get_resolver_rule_association_request +GetResolverRuleAssociationResponse,get_resolver_rule_association_response +GetResolverRulePolicyRequest,get_resolver_rule_policy_request +GetResolverRulePolicyResponse,get_resolver_rule_policy_response +GetResolverRuleRequest,get_resolver_rule_request +GetResolverRuleResponse,get_resolver_rule_response +GetResourceCollectionRequest,get_resource_collection_request +GetResourceCollectionResponse,get_resource_collection_response +GetResourceConfigHistoryRequest,get_resource_config_history_request +GetResourceConfigHistoryResponse,get_resource_config_history_response +GetResourceDefinitionRequest,get_resource_definition_request +GetResourceDefinitionResponse,get_resource_definition_response +GetResourceDefinitionVersionRequest,get_resource_definition_version_request +GetResourceDefinitionVersionResponse,get_resource_definition_version_response +GetResourceEvaluationSummaryRequest,get_resource_evaluation_summary_request +GetResourceEvaluationSummaryResponse,get_resource_evaluation_summary_response +GetResourceEventConfigurationRequest,get_resource_event_configuration_request +GetResourceEventConfigurationResponse,get_resource_event_configuration_response +GetResourceInput,get_resource_input +GetResourceLFTagsRequest,get_resource_lf_tags_request +GetResourceLFTagsResponse,get_resource_lf_tags_response +GetResourceLogLevelRequest,get_resource_log_level_request +GetResourceLogLevelResponse,get_resource_log_level_response +GetResourceMetadataRequest,get_resource_metadata_request +GetResourceMetadataResponse,get_resource_metadata_response +GetResourceMetricsRequest,get_resource_metrics_request +GetResourceMetricsResponse,get_resource_metrics_response +GetResourceOutput,get_resource_output +GetResourcePermissionInput,get_resource_permission_input +GetResourcePermissionOutput,get_resource_permission_output +GetResourcePoliciesInput,get_resource_policies_input +GetResourcePoliciesOutput,get_resource_policies_output +GetResourcePoliciesRequest,get_resource_policies_request +GetResourcePoliciesResponse,get_resource_policies_response +GetResourcePoliciesResponseEntry,get_resource_policies_response_entry +GetResourcePoliciesResponseList,get_resource_policies_response_list +GetResourcePolicyInput,get_resource_policy_input +GetResourcePolicyOutput,get_resource_policy_output +GetResourcePolicyRequest,get_resource_policy_request +GetResourcePolicyResponse,get_resource_policy_response +GetResourcePositionRequest,get_resource_position_request +GetResourcePositionResponse,get_resource_position_response +GetResourceProfileRequest,get_resource_profile_request +GetResourceProfileResponse,get_resource_profile_response +GetResourceRequest,get_resource_request +GetResourceRequestStatusInput,get_resource_request_status_input +GetResourceRequestStatusOutput,get_resource_request_status_output +GetResourceSetRequest,get_resource_set_request +GetResourceSetResponse,get_resource_set_response +GetResourceShareAssociationsRequest,get_resource_share_associations_request +GetResourceShareAssociationsResponse,get_resource_share_associations_response +GetResourceShareInvitationsRequest,get_resource_share_invitations_request +GetResourceShareInvitationsResponse,get_resource_share_invitations_response +GetResourceSharesRequest,get_resource_shares_request +GetResourceSharesResponse,get_resource_shares_response +GetResourcesInput,get_resources_input +GetResourcesOutput,get_resources_output +GetResourcesRequest,get_resources_request +GetResourcesResponse,get_resources_response +GetResourcesSummaryOutput,get_resources_summary_output +GetResponseHeadersPolicyConfigRequest,get_response_headers_policy_config_request +GetResponseHeadersPolicyConfigResult,get_response_headers_policy_config_result +GetResponseHeadersPolicyRequest,get_response_headers_policy_request +GetResponseHeadersPolicyResult,get_response_headers_policy_result +GetResponsePlanInput,get_response_plan_input +GetResponsePlanOutput,get_response_plan_output +GetRestApiRequest,get_rest_api_request +GetRestApisRequest,get_rest_apis_request +GetRetainedMessageRequest,get_retained_message_request +GetRetainedMessageResponse,get_retained_message_response +GetRetentionSettingsRequest,get_retention_settings_request +GetRetentionSettingsResponse,get_retention_settings_response +GetReusableDelegationSetLimitRequest,get_reusable_delegation_set_limit_request +GetReusableDelegationSetLimitResponse,get_reusable_delegation_set_limit_response +GetReusableDelegationSetRequest,get_reusable_delegation_set_request +GetReusableDelegationSetResponse,get_reusable_delegation_set_response +GetRevealConfigurationResponse,get_reveal_configuration_response +GetRevisionRequest,get_revision_request +GetRevisionResponse,get_revision_response +GetRevocationStatusRequest,get_revocation_status_request +GetRevocationStatusResponse,get_revocation_status_response +GetRightsizingRecommendationRequest,get_rightsizing_recommendation_request +GetRightsizingRecommendationResponse,get_rightsizing_recommendation_response +GetRoleCredentialsRequest,get_role_credentials_request +GetRoleCredentialsResponse,get_role_credentials_response +GetRolePolicyRequest,get_role_policy_request +GetRolePolicyResponse,get_role_policy_response +GetRoleRequest,get_role_request +GetRoleResponse,get_role_response +GetRoomRequest,get_room_request +GetRoomResponse,get_room_response +GetRoomSkillParameterRequest,get_room_skill_parameter_request +GetRoomSkillParameterResponse,get_room_skill_parameter_response +GetRotationOverrideRequest,get_rotation_override_request +GetRotationOverrideResult,get_rotation_override_result +GetRotationRequest,get_rotation_request +GetRotationResult,get_rotation_result +GetRouteAnalysisRequest,get_route_analysis_request +GetRouteAnalysisResponse,get_route_analysis_response +GetRouteRequest,get_route_request +GetRouteResponse,get_route_response +GetRouteResponseRequest,get_route_response_request +GetRouteResponseResponse,get_route_response_response +GetRouteResponsesRequest,get_route_responses_request +GetRouteResponsesResponse,get_route_responses_response +GetRouteResult,get_route_result +GetRoutesRequest,get_routes_request +GetRoutesResponse,get_routes_response +GetRoutingControlStateRequest,get_routing_control_state_request +GetRoutingControlStateResponse,get_routing_control_state_response +GetRuleGroupRequest,get_rule_group_request +GetRuleGroupResponse,get_rule_group_response +GetRuleRequest,get_rule_request +GetRuleResponse,get_rule_response +GetRulesRequest,get_rules_request +GetRulesResult,get_rules_result +GetRunGroupRequest,get_run_group_request +GetRunGroupResponse,get_run_group_response +GetRunRequest,get_run_request +GetRunResponse,get_run_response +GetRunResult,get_run_result +GetRunTaskRequest,get_run_task_request +GetRunTaskResponse,get_run_task_response +GetRuntimeManagementConfigRequest,get_runtime_management_config_request +GetRuntimeManagementConfigResponse,get_runtime_management_config_response +GetSAMLProviderRequest,get_saml_provider_request +GetSAMLProviderResponse,get_saml_provider_response +GetSMSAttributesInput,get_sms_attributes_input +GetSMSAttributesResponse,get_sms_attributes_response +GetSMSSandboxAccountStatusResult,get_sms_sandbox_account_status_result +GetSSHPublicKeyRequest,get_ssh_public_key_request +GetSSHPublicKeyResponse,get_ssh_public_key_response +GetSagemakerServicecatalogPortfolioStatusOutput,get_sagemaker_servicecatalog_portfolio_status_output +GetSampleDataRequest,get_sample_data_request +GetSampleDataResponse,get_sample_data_response +GetSampledRequestsRequest,get_sampled_requests_request +GetSampledRequestsResponse,get_sampled_requests_response +GetSamplingRulesRequest,get_sampling_rules_request +GetSamplingRulesResult,get_sampling_rules_result +GetSamplingStatisticSummariesRequest,get_sampling_statistic_summaries_request +GetSamplingStatisticSummariesResult,get_sampling_statistic_summaries_result +GetSamplingTargetsRequest,get_sampling_targets_request +GetSamplingTargetsResult,get_sampling_targets_result +GetSatelliteRequest,get_satellite_request +GetSatelliteResponse,get_satellite_response +GetSavingsPlanPurchaseRecommendationDetailsRequest,get_savings_plan_purchase_recommendation_details_request +GetSavingsPlanPurchaseRecommendationDetailsResponse,get_savings_plan_purchase_recommendation_details_response +GetSavingsPlansCoverageRequest,get_savings_plans_coverage_request +GetSavingsPlansCoverageResponse,get_savings_plans_coverage_response +GetSavingsPlansPurchaseRecommendationRequest,get_savings_plans_purchase_recommendation_request +GetSavingsPlansPurchaseRecommendationResponse,get_savings_plans_purchase_recommendation_response +GetSavingsPlansUtilizationDetailsRequest,get_savings_plans_utilization_details_request +GetSavingsPlansUtilizationDetailsResponse,get_savings_plans_utilization_details_response +GetSavingsPlansUtilizationRequest,get_savings_plans_utilization_request +GetSavingsPlansUtilizationResponse,get_savings_plans_utilization_response +GetSbomExportRequest,get_sbom_export_request +GetSbomExportResponse,get_sbom_export_response +GetScalingConfigurationRecommendationRequest,get_scaling_configuration_recommendation_request +GetScalingConfigurationRecommendationResponse,get_scaling_configuration_recommendation_response +GetScalingPlanResourceForecastDataRequest,get_scaling_plan_resource_forecast_data_request +GetScalingPlanResourceForecastDataResponse,get_scaling_plan_resource_forecast_data_response +GetScanRequest,get_scan_request +GetScanResponse,get_scan_response +GetSceneRequest,get_scene_request +GetSceneResponse,get_scene_response +GetScheduleGroupInput,get_schedule_group_input +GetScheduleGroupOutput,get_schedule_group_output +GetScheduleInput,get_schedule_input +GetScheduleOutput,get_schedule_output +GetSchemaAnalysisRuleInput,get_schema_analysis_rule_input +GetSchemaAnalysisRuleOutput,get_schema_analysis_rule_output +GetSchemaAsJsonRequest,get_schema_as_json_request +GetSchemaAsJsonResponse,get_schema_as_json_response +GetSchemaByDefinitionInput,get_schema_by_definition_input +GetSchemaByDefinitionResponse,get_schema_by_definition_response +GetSchemaCreationStatusRequest,get_schema_creation_status_request +GetSchemaCreationStatusResponse,get_schema_creation_status_response +GetSchemaInput,get_schema_input +GetSchemaMappingInput,get_schema_mapping_input +GetSchemaMappingOutput,get_schema_mapping_output +GetSchemaOutput,get_schema_output +GetSchemaResponse,get_schema_response +GetSchemaVersionInput,get_schema_version_input +GetSchemaVersionResponse,get_schema_version_response +GetSchemaVersionsDiffInput,get_schema_versions_diff_input +GetSchemaVersionsDiffResponse,get_schema_versions_diff_response +GetScreenDataRequest,get_screen_data_request +GetScreenDataResult,get_screen_data_result +GetSdkRequest,get_sdk_request +GetSdkTypeRequest,get_sdk_type_request +GetSdkTypesRequest,get_sdk_types_request +GetSearchSuggestionsRequest,get_search_suggestions_request +GetSearchSuggestionsResponse,get_search_suggestions_response +GetSecretValueRequest,get_secret_value_request +GetSecretValueResponse,get_secret_value_response +GetSecurityConfigRequest,get_security_config_request +GetSecurityConfigResponse,get_security_config_response +GetSecurityConfigurationRequest,get_security_configuration_request +GetSecurityConfigurationResponse,get_security_configuration_response +GetSecurityConfigurationsRequest,get_security_configurations_request +GetSecurityConfigurationsResponse,get_security_configurations_response +GetSecurityPolicyRequest,get_security_policy_request +GetSecurityPolicyResponse,get_security_policy_response +GetSegmentDetectionRequest,get_segment_detection_request +GetSegmentDetectionResponse,get_segment_detection_response +GetSegmentExportJobsRequest,get_segment_export_jobs_request +GetSegmentExportJobsResponse,get_segment_export_jobs_response +GetSegmentImportJobsRequest,get_segment_import_jobs_request +GetSegmentImportJobsResponse,get_segment_import_jobs_response +GetSegmentRequest,get_segment_request +GetSegmentResponse,get_segment_response +GetSegmentVersionRequest,get_segment_version_request +GetSegmentVersionResponse,get_segment_version_response +GetSegmentVersionsRequest,get_segment_versions_request +GetSegmentVersionsResponse,get_segment_versions_response +GetSegmentsRequest,get_segments_request +GetSegmentsResponse,get_segments_response +GetSendQuotaResponse,get_send_quota_response +GetSendStatisticsResponse,get_send_statistics_response +GetSensitiveDataOccurrencesAvailabilityRequest,get_sensitive_data_occurrences_availability_request +GetSensitiveDataOccurrencesAvailabilityResponse,get_sensitive_data_occurrences_availability_response +GetSensitiveDataOccurrencesRequest,get_sensitive_data_occurrences_request +GetSensitiveDataOccurrencesResponse,get_sensitive_data_occurrences_response +GetSensitivityInspectionTemplateRequest,get_sensitivity_inspection_template_request +GetSensitivityInspectionTemplateResponse,get_sensitivity_inspection_template_response +GetSequenceStoreRequest,get_sequence_store_request +GetSequenceStoreResponse,get_sequence_store_response +GetSerialConsoleAccessStatusRequest,get_serial_console_access_status_request +GetSerialConsoleAccessStatusResult,get_serial_console_access_status_result +GetServerCertificateRequest,get_server_certificate_request +GetServerCertificateResponse,get_server_certificate_response +GetServerDetailsRequest,get_server_details_request +GetServerDetailsResponse,get_server_details_response +GetServerStrategiesRequest,get_server_strategies_request +GetServerStrategiesResponse,get_server_strategies_response +GetServersRequest,get_servers_request +GetServersResponse,get_servers_response +GetServiceEndpointRequest,get_service_endpoint_request +GetServiceEndpointResponse,get_service_endpoint_response +GetServiceGraphRequest,get_service_graph_request +GetServiceGraphResult,get_service_graph_result +GetServiceInput,get_service_input +GetServiceInstanceInput,get_service_instance_input +GetServiceInstanceOutput,get_service_instance_output +GetServiceInstanceSyncStatusInput,get_service_instance_sync_status_input +GetServiceInstanceSyncStatusOutput,get_service_instance_sync_status_output +GetServiceLastAccessedDetailsRequest,get_service_last_accessed_details_request +GetServiceLastAccessedDetailsResponse,get_service_last_accessed_details_response +GetServiceLastAccessedDetailsWithEntitiesRequest,get_service_last_accessed_details_with_entities_request +GetServiceLastAccessedDetailsWithEntitiesResponse,get_service_last_accessed_details_with_entities_response +GetServiceLinkedRoleDeletionStatusRequest,get_service_linked_role_deletion_status_request +GetServiceLinkedRoleDeletionStatusResponse,get_service_linked_role_deletion_status_response +GetServiceNetworkRequest,get_service_network_request +GetServiceNetworkResponse,get_service_network_response +GetServiceNetworkServiceAssociationRequest,get_service_network_service_association_request +GetServiceNetworkServiceAssociationResponse,get_service_network_service_association_response +GetServiceNetworkVpcAssociationRequest,get_service_network_vpc_association_request +GetServiceNetworkVpcAssociationResponse,get_service_network_vpc_association_response +GetServiceOutput,get_service_output +GetServicePrincipalNameRequest,get_service_principal_name_request +GetServicePrincipalNameResponse,get_service_principal_name_response +GetServiceProfileRequest,get_service_profile_request +GetServiceProfileResponse,get_service_profile_response +GetServiceQuotaIncreaseRequestFromTemplateRequest,get_service_quota_increase_request_from_template_request +GetServiceQuotaIncreaseRequestFromTemplateResponse,get_service_quota_increase_request_from_template_response +GetServiceQuotaRequest,get_service_quota_request +GetServiceQuotaResponse,get_service_quota_response +GetServiceRequest,get_service_request +GetServiceResponse,get_service_response +GetServiceRoleForAccountResponse,get_service_role_for_account_response +GetServiceSettingRequest,get_service_setting_request +GetServiceSettingResult,get_service_setting_result +GetServiceSettingsResponse,get_service_settings_response +GetServiceSyncBlockerSummaryInput,get_service_sync_blocker_summary_input +GetServiceSyncBlockerSummaryOutput,get_service_sync_blocker_summary_output +GetServiceSyncConfigInput,get_service_sync_config_input +GetServiceSyncConfigOutput,get_service_sync_config_output +GetServiceTemplateInput,get_service_template_input +GetServiceTemplateOutput,get_service_template_output +GetServiceTemplateVersionInput,get_service_template_version_input +GetServiceTemplateVersionOutput,get_service_template_version_output +GetServicesInScopeResponse,get_services_in_scope_response +GetSessionEmbedUrlRequest,get_session_embed_url_request +GetSessionEmbedUrlResponse,get_session_embed_url_response +GetSessionRequest,get_session_request +GetSessionResponse,get_session_response +GetSessionStatusRequest,get_session_status_request +GetSessionStatusResponse,get_session_status_response +GetSessionTokenRequest,get_session_token_request +GetSessionTokenResponse,get_session_token_response +GetSettingsRequest,get_settings_request +GetSettingsResponse,get_settings_response +GetShardIteratorInput,get_shard_iterator_input +GetShardIteratorOutput,get_shard_iterator_output +GetShareRequest,get_share_request +GetShareResponse,get_share_response +GetSignalCatalogRequest,get_signal_catalog_request +GetSignalCatalogResponse,get_signal_catalog_response +GetSignalingChannelEndpointInput,get_signaling_channel_endpoint_input +GetSignalingChannelEndpointOutput,get_signaling_channel_endpoint_output +GetSignedBluinsightsUrlResponse,get_signed_bluinsights_url_response +GetSigningCertificateRequest,get_signing_certificate_request +GetSigningCertificateResponse,get_signing_certificate_response +GetSigningPlatformRequest,get_signing_platform_request +GetSigningPlatformResponse,get_signing_platform_response +GetSigningProfileRequest,get_signing_profile_request +GetSigningProfileResponse,get_signing_profile_response +GetSimilarProfilesRequest,get_similar_profiles_request +GetSimilarProfilesResponse,get_similar_profiles_response +GetSinkInput,get_sink_input +GetSinkOutput,get_sink_output +GetSinkPolicyInput,get_sink_policy_input +GetSinkPolicyOutput,get_sink_policy_output +GetSipMediaApplicationAlexaSkillConfigurationRequest,get_sip_media_application_alexa_skill_configuration_request +GetSipMediaApplicationAlexaSkillConfigurationResponse,get_sip_media_application_alexa_skill_configuration_response +GetSipMediaApplicationLoggingConfigurationRequest,get_sip_media_application_logging_configuration_request +GetSipMediaApplicationLoggingConfigurationResponse,get_sip_media_application_logging_configuration_response +GetSipMediaApplicationRequest,get_sip_media_application_request +GetSipMediaApplicationResponse,get_sip_media_application_response +GetSipRuleRequest,get_sip_rule_request +GetSipRuleResponse,get_sip_rule_response +GetSiteAddressInput,get_site_address_input +GetSiteAddressOutput,get_site_address_output +GetSiteInput,get_site_input +GetSiteOutput,get_site_output +GetSiteRequest,get_site_request +GetSiteResponse,get_site_response +GetSiteToSiteVpnAttachmentRequest,get_site_to_site_vpn_attachment_request +GetSiteToSiteVpnAttachmentResponse,get_site_to_site_vpn_attachment_response +GetSitesRequest,get_sites_request +GetSitesResponse,get_sites_response +GetSizeConstraintSetRequest,get_size_constraint_set_request +GetSizeConstraintSetResponse,get_size_constraint_set_response +GetSkillGroupRequest,get_skill_group_request +GetSkillGroupResponse,get_skill_group_response +GetSlotTypeRequest,get_slot_type_request +GetSlotTypeResponse,get_slot_type_response +GetSlotTypeVersionsRequest,get_slot_type_versions_request +GetSlotTypeVersionsResponse,get_slot_type_versions_response +GetSlotTypesRequest,get_slot_types_request +GetSlotTypesResponse,get_slot_types_response +GetSmsChannelRequest,get_sms_channel_request +GetSmsChannelResponse,get_sms_channel_response +GetSmsTemplateRequest,get_sms_template_request +GetSmsTemplateResponse,get_sms_template_response +GetSnapshotBlockRequest,get_snapshot_block_request +GetSnapshotBlockResponse,get_snapshot_block_response +GetSnapshotLimitsRequest,get_snapshot_limits_request +GetSnapshotLimitsResult,get_snapshot_limits_result +GetSnapshotRequest,get_snapshot_request +GetSnapshotResponse,get_snapshot_response +GetSnapshotResult,get_snapshot_result +GetSnapshotsRequest,get_snapshots_request +GetSnapshotsResponse,get_snapshots_response +GetSnowballUsageResult,get_snowball_usage_result +GetSoftwareUpdatesRequest,get_software_updates_request +GetSoftwareUpdatesResult,get_software_updates_result +GetSolFunctionInstanceInput,get_sol_function_instance_input +GetSolFunctionInstanceMetadata,get_sol_function_instance_metadata +GetSolFunctionInstanceOutput,get_sol_function_instance_output +GetSolFunctionPackageContentInput,get_sol_function_package_content_input +GetSolFunctionPackageContentOutput,get_sol_function_package_content_output +GetSolFunctionPackageDescriptorInput,get_sol_function_package_descriptor_input +GetSolFunctionPackageDescriptorOutput,get_sol_function_package_descriptor_output +GetSolFunctionPackageInput,get_sol_function_package_input +GetSolFunctionPackageMetadata,get_sol_function_package_metadata +GetSolFunctionPackageOutput,get_sol_function_package_output +GetSolInstantiatedVnfInfo,get_sol_instantiated_vnf_info +GetSolNetworkInstanceInput,get_sol_network_instance_input +GetSolNetworkInstanceMetadata,get_sol_network_instance_metadata +GetSolNetworkInstanceOutput,get_sol_network_instance_output +GetSolNetworkOperationInput,get_sol_network_operation_input +GetSolNetworkOperationMetadata,get_sol_network_operation_metadata +GetSolNetworkOperationOutput,get_sol_network_operation_output +GetSolNetworkOperationTaskDetails,get_sol_network_operation_task_details +GetSolNetworkPackageContentInput,get_sol_network_package_content_input +GetSolNetworkPackageContentOutput,get_sol_network_package_content_output +GetSolNetworkPackageDescriptorInput,get_sol_network_package_descriptor_input +GetSolNetworkPackageDescriptorOutput,get_sol_network_package_descriptor_output +GetSolNetworkPackageInput,get_sol_network_package_input +GetSolNetworkPackageMetadata,get_sol_network_package_metadata +GetSolNetworkPackageOutput,get_sol_network_package_output +GetSolVnfInfo,get_sol_vnf_info +GetSolVnfcResourceInfo,get_sol_vnfc_resource_info +GetSolVnfcResourceInfoMetadata,get_sol_vnfc_resource_info_metadata +GetSolutionMetricsRequest,get_solution_metrics_request +GetSolutionMetricsResponse,get_solution_metrics_response +GetSourceApiAssociationRequest,get_source_api_association_request +GetSourceApiAssociationResponse,get_source_api_association_response +GetSourceRepositoryCloneUrlsRequest,get_source_repository_clone_urls_request +GetSourceRepositoryCloneUrlsResponse,get_source_repository_clone_urls_response +GetSourceRepositoryRequest,get_source_repository_request +GetSourceRepositoryResponse,get_source_repository_response +GetSpaceRequest,get_space_request +GetSpaceResponse,get_space_response +GetSparqlStatisticsOutput,get_sparql_statistics_output +GetSparqlStreamInput,get_sparql_stream_input +GetSparqlStreamOutput,get_sparql_stream_output +GetSpeakerSearchTaskRequest,get_speaker_search_task_request +GetSpeakerSearchTaskResponse,get_speaker_search_task_response +GetSpeechSynthesisTaskInput,get_speech_synthesis_task_input +GetSpeechSynthesisTaskOutput,get_speech_synthesis_task_output +GetSpotPlacementScoresRequest,get_spot_placement_scores_request +GetSpotPlacementScoresResult,get_spot_placement_scores_result +GetSqlInjectionMatchSetRequest,get_sql_injection_match_set_request +GetSqlInjectionMatchSetResponse,get_sql_injection_match_set_response +GetStackPolicyInput,get_stack_policy_input +GetStackPolicyOutput,get_stack_policy_output +GetStageDeploymentRequest,get_stage_deployment_request +GetStageDeploymentResult,get_stage_deployment_result +GetStageRequest,get_stage_request +GetStageResponse,get_stage_response +GetStageResult,get_stage_result +GetStageSessionRequest,get_stage_session_request +GetStageSessionResponse,get_stage_session_response +GetStagesRequest,get_stages_request +GetStagesResponse,get_stages_response +GetStatementRequest,get_statement_request +GetStatementResponse,get_statement_response +GetStatementResultRequest,get_statement_result_request +GetStatementResultResponse,get_statement_result_response +GetStaticIpRequest,get_static_ip_request +GetStaticIpResult,get_static_ip_result +GetStaticIpsRequest,get_static_ips_request +GetStaticIpsResult,get_static_ips_result +GetStatisticsRequest,get_statistics_request +GetStatisticsResponse,get_statistics_response +GetStorageLensConfigurationRequest,get_storage_lens_configuration_request +GetStorageLensConfigurationResult,get_storage_lens_configuration_result +GetStorageLensConfigurationTaggingRequest,get_storage_lens_configuration_tagging_request +GetStorageLensConfigurationTaggingResult,get_storage_lens_configuration_tagging_result +GetStoredQueryRequest,get_stored_query_request +GetStoredQueryResponse,get_stored_query_response +GetStreamKeyRequest,get_stream_key_request +GetStreamKeyResponse,get_stream_key_response +GetStreamRequest,get_stream_request +GetStreamResponse,get_stream_response +GetStreamSessionRequest,get_stream_session_request +GetStreamSessionResponse,get_stream_session_response +GetStreamingDistributionConfigRequest,get_streaming_distribution_config_request +GetStreamingDistributionConfigResult,get_streaming_distribution_config_result +GetStreamingDistributionRequest,get_streaming_distribution_request +GetStreamingDistributionResult,get_streaming_distribution_result +GetStreamingImageRequest,get_streaming_image_request +GetStreamingImageResponse,get_streaming_image_response +GetStreamingSessionBackupRequest,get_streaming_session_backup_request +GetStreamingSessionBackupResponse,get_streaming_session_backup_response +GetStreamingSessionRequest,get_streaming_session_request +GetStreamingSessionResponse,get_streaming_session_response +GetStreamingSessionStreamRequest,get_streaming_session_stream_request +GetStreamingSessionStreamResponse,get_streaming_session_stream_response +GetStudioComponentRequest,get_studio_component_request +GetStudioComponentResponse,get_studio_component_response +GetStudioMemberRequest,get_studio_member_request +GetStudioMemberResponse,get_studio_member_response +GetStudioRequest,get_studio_request +GetStudioResponse,get_studio_response +GetStudioSessionMappingInput,get_studio_session_mapping_input +GetStudioSessionMappingOutput,get_studio_session_mapping_output +GetSubnetCidrReservationsRequest,get_subnet_cidr_reservations_request +GetSubnetCidrReservationsResult,get_subnet_cidr_reservations_result +GetSubscriberRequest,get_subscriber_request +GetSubscriberResponse,get_subscriber_response +GetSubscriptionAttributesInput,get_subscription_attributes_input +GetSubscriptionAttributesResponse,get_subscription_attributes_response +GetSubscriptionDefinitionRequest,get_subscription_definition_request +GetSubscriptionDefinitionResponse,get_subscription_definition_response +GetSubscriptionDefinitionVersionRequest,get_subscription_definition_version_request +GetSubscriptionDefinitionVersionResponse,get_subscription_definition_version_response +GetSubscriptionRequest,get_subscription_request +GetSubscriptionResponse,get_subscription_response +GetSubscriptionStateResponse,get_subscription_state_response +GetSuiteDefinitionRequest,get_suite_definition_request +GetSuiteDefinitionResponse,get_suite_definition_response +GetSuiteRequest,get_suite_request +GetSuiteResult,get_suite_result +GetSuiteRunReportRequest,get_suite_run_report_request +GetSuiteRunReportResponse,get_suite_run_report_response +GetSuiteRunRequest,get_suite_run_request +GetSuiteRunResponse,get_suite_run_response +GetSupportedResourceTypesOutput,get_supported_resource_types_output +GetSuppressedDestinationRequest,get_suppressed_destination_request +GetSuppressedDestinationResponse,get_suppressed_destination_response +GetSyncJobRequest,get_sync_job_request +GetSyncJobResponse,get_sync_job_response +GetSystemInstanceRequest,get_system_instance_request +GetSystemInstanceResponse,get_system_instance_response +GetSystemTemplateRequest,get_system_template_request +GetSystemTemplateResponse,get_system_template_response +GetSystemTemplateRevisionsRequest,get_system_template_revisions_request +GetSystemTemplateRevisionsResponse,get_system_template_revisions_response +GetTableMetadataInput,get_table_metadata_input +GetTableMetadataOutput,get_table_metadata_output +GetTableObjectsRequest,get_table_objects_request +GetTableObjectsResponse,get_table_objects_response +GetTableRequest,get_table_request +GetTableResponse,get_table_response +GetTableRestoreStatusRequest,get_table_restore_status_request +GetTableRestoreStatusResponse,get_table_restore_status_response +GetTableVersionRequest,get_table_version_request +GetTableVersionResponse,get_table_version_response +GetTableVersionsRequest,get_table_versions_request +GetTableVersionsResponse,get_table_versions_response +GetTablesRequest,get_tables_request +GetTablesResponse,get_tables_response +GetTagKeysInput,get_tag_keys_input +GetTagKeysOutput,get_tag_keys_output +GetTagValuesInput,get_tag_values_input +GetTagValuesOutput,get_tag_values_output +GetTagsInput,get_tags_input +GetTagsOutput,get_tags_output +GetTagsRequest,get_tags_request +GetTagsResponse,get_tags_response +GetTargetGroupRequest,get_target_group_request +GetTargetGroupResponse,get_target_group_response +GetTargetResourceTypeRequest,get_target_resource_type_request +GetTargetResourceTypeResponse,get_target_resource_type_response +GetTaskProtectionRequest,get_task_protection_request +GetTaskProtectionResponse,get_task_protection_response +GetTaskTemplateRequest,get_task_template_request +GetTaskTemplateResponse,get_task_template_response +GetTelemetryMetadataRequest,get_telemetry_metadata_request +GetTelemetryMetadataResponse,get_telemetry_metadata_response +GetTemplateGroupAccessControlEntryRequest,get_template_group_access_control_entry_request +GetTemplateGroupAccessControlEntryResponse,get_template_group_access_control_entry_response +GetTemplateInput,get_template_input +GetTemplateOutput,get_template_output +GetTemplateRequest,get_template_request +GetTemplateResponse,get_template_response +GetTemplateStepGroupRequest,get_template_step_group_request +GetTemplateStepGroupResponse,get_template_step_group_response +GetTemplateStepRequest,get_template_step_request +GetTemplateStepResponse,get_template_step_response +GetTemplateSummaryInput,get_template_summary_input +GetTemplateSummaryOutput,get_template_summary_output +GetTemplateSyncConfigInput,get_template_sync_config_input +GetTemplateSyncConfigOutput,get_template_sync_config_output +GetTemplateSyncStatusInput,get_template_sync_status_input +GetTemplateSyncStatusOutput,get_template_sync_status_output +GetTemporaryGluePartitionCredentialsRequest,get_temporary_glue_partition_credentials_request +GetTemporaryGluePartitionCredentialsResponse,get_temporary_glue_partition_credentials_response +GetTemporaryGlueTableCredentialsRequest,get_temporary_glue_table_credentials_request +GetTemporaryGlueTableCredentialsResponse,get_temporary_glue_table_credentials_response +GetTerminologyRequest,get_terminology_request +GetTerminologyResponse,get_terminology_response +GetTestExecutionArtifactsUrlRequest,get_test_execution_artifacts_url_request +GetTestExecutionArtifactsUrlResponse,get_test_execution_artifacts_url_response +GetTestGridProjectRequest,get_test_grid_project_request +GetTestGridProjectResult,get_test_grid_project_result +GetTestGridSessionRequest,get_test_grid_session_request +GetTestGridSessionResult,get_test_grid_session_result +GetTestRequest,get_test_request +GetTestResult,get_test_result +GetTextDetectionRequest,get_text_detection_request +GetTextDetectionResponse,get_text_detection_response +GetThemeRequest,get_theme_request +GetThemeResponse,get_theme_response +GetThingRuntimeConfigurationRequest,get_thing_runtime_configuration_request +GetThingRuntimeConfigurationResponse,get_thing_runtime_configuration_response +GetThingShadowRequest,get_thing_shadow_request +GetThingShadowResponse,get_thing_shadow_response +GetThirdPartyFirewallAssociationStatusRequest,get_third_party_firewall_association_status_request +GetThirdPartyFirewallAssociationStatusResponse,get_third_party_firewall_association_status_response +GetThirdPartyJobDetailsInput,get_third_party_job_details_input +GetThirdPartyJobDetailsOutput,get_third_party_job_details_output +GetThreatIntelSetRequest,get_threat_intel_set_request +GetThreatIntelSetResponse,get_threat_intel_set_response +GetTileInput,get_tile_input +GetTileOutput,get_tile_output +GetTimeSeriesServiceStatisticsRequest,get_time_series_service_statistics_request +GetTimeSeriesServiceStatisticsResult,get_time_series_service_statistics_result +GetTimelineEventInput,get_timeline_event_input +GetTimelineEventOutput,get_timeline_event_output +GetTokenBalanceInput,get_token_balance_input +GetTokenBalanceOutput,get_token_balance_output +GetTokenRequest,get_token_request +GetTokenResponse,get_token_response +GetTopicAttributesInput,get_topic_attributes_input +GetTopicAttributesResponse,get_topic_attributes_response +GetTopicRuleDestinationRequest,get_topic_rule_destination_request +GetTopicRuleDestinationResponse,get_topic_rule_destination_response +GetTopicRuleRequest,get_topic_rule_request +GetTopicRuleResponse,get_topic_rule_response +GetTraceGraphRequest,get_trace_graph_request +GetTraceGraphResult,get_trace_graph_result +GetTraceSummariesRequest,get_trace_summaries_request +GetTraceSummariesResult,get_trace_summaries_result +GetTrafficDistributionRequest,get_traffic_distribution_request +GetTrafficDistributionResponse,get_traffic_distribution_response +GetTrafficPolicyInstanceCountResponse,get_traffic_policy_instance_count_response +GetTrafficPolicyInstanceRequest,get_traffic_policy_instance_request +GetTrafficPolicyInstanceResponse,get_traffic_policy_instance_response +GetTrafficPolicyRequest,get_traffic_policy_request +GetTrafficPolicyResponse,get_traffic_policy_response +GetTrailRequest,get_trail_request +GetTrailResponse,get_trail_response +GetTrailStatusRequest,get_trail_status_request +GetTrailStatusResponse,get_trail_status_response +GetTransactionInput,get_transaction_input +GetTransactionOutput,get_transaction_output +GetTranscriptRequest,get_transcript_request +GetTranscriptResponse,get_transcript_response +GetTranscriptionJobRequest,get_transcription_job_request +GetTranscriptionJobResponse,get_transcription_job_response +GetTransitGatewayAttachmentPropagationsRequest,get_transit_gateway_attachment_propagations_request +GetTransitGatewayAttachmentPropagationsResult,get_transit_gateway_attachment_propagations_result +GetTransitGatewayConnectPeerAssociationsRequest,get_transit_gateway_connect_peer_associations_request +GetTransitGatewayConnectPeerAssociationsResponse,get_transit_gateway_connect_peer_associations_response +GetTransitGatewayMulticastDomainAssociationsRequest,get_transit_gateway_multicast_domain_associations_request +GetTransitGatewayMulticastDomainAssociationsResult,get_transit_gateway_multicast_domain_associations_result +GetTransitGatewayPeeringRequest,get_transit_gateway_peering_request +GetTransitGatewayPeeringResponse,get_transit_gateway_peering_response +GetTransitGatewayPolicyTableAssociationsRequest,get_transit_gateway_policy_table_associations_request +GetTransitGatewayPolicyTableAssociationsResult,get_transit_gateway_policy_table_associations_result +GetTransitGatewayPolicyTableEntriesRequest,get_transit_gateway_policy_table_entries_request +GetTransitGatewayPolicyTableEntriesResult,get_transit_gateway_policy_table_entries_result +GetTransitGatewayPrefixListReferencesRequest,get_transit_gateway_prefix_list_references_request +GetTransitGatewayPrefixListReferencesResult,get_transit_gateway_prefix_list_references_result +GetTransitGatewayRegistrationsRequest,get_transit_gateway_registrations_request +GetTransitGatewayRegistrationsResponse,get_transit_gateway_registrations_response +GetTransitGatewayRouteTableAssociationsRequest,get_transit_gateway_route_table_associations_request +GetTransitGatewayRouteTableAssociationsResult,get_transit_gateway_route_table_associations_result +GetTransitGatewayRouteTableAttachmentRequest,get_transit_gateway_route_table_attachment_request +GetTransitGatewayRouteTableAttachmentResponse,get_transit_gateway_route_table_attachment_response +GetTransitGatewayRouteTablePropagationsRequest,get_transit_gateway_route_table_propagations_request +GetTransitGatewayRouteTablePropagationsResult,get_transit_gateway_route_table_propagations_result +GetTriggerRequest,get_trigger_request +GetTriggerResponse,get_trigger_response +GetTriggersRequest,get_triggers_request +GetTriggersResponse,get_triggers_response +GetTrustStoreCertificateRequest,get_trust_store_certificate_request +GetTrustStoreCertificateResponse,get_trust_store_certificate_response +GetTrustStoreRequest,get_trust_store_request +GetTrustStoreResponse,get_trust_store_response +GetTypeRequest,get_type_request +GetTypeResponse,get_type_response +GetTypedLinkFacetInformationRequest,get_typed_link_facet_information_request +GetTypedLinkFacetInformationResponse,get_typed_link_facet_information_response +GetUICustomizationRequest,get_ui_customization_request +GetUICustomizationResponse,get_ui_customization_response +GetUnfilteredPartitionMetadataRequest,get_unfiltered_partition_metadata_request +GetUnfilteredPartitionMetadataResponse,get_unfiltered_partition_metadata_response +GetUnfilteredPartitionsMetadataRequest,get_unfiltered_partitions_metadata_request +GetUnfilteredPartitionsMetadataResponse,get_unfiltered_partitions_metadata_response +GetUnfilteredTableMetadataRequest,get_unfiltered_table_metadata_request +GetUnfilteredTableMetadataResponse,get_unfiltered_table_metadata_response +GetUpgradeHistoryRequest,get_upgrade_history_request +GetUpgradeHistoryResponse,get_upgrade_history_response +GetUpgradeStatusRequest,get_upgrade_status_request +GetUpgradeStatusResponse,get_upgrade_status_response +GetUploadRequest,get_upload_request +GetUploadResult,get_upload_result +GetUploadStatusRequest,get_upload_status_request +GetUploadStatusResponse,get_upload_status_response +GetUsageForecastRequest,get_usage_forecast_request +GetUsageForecastResponse,get_usage_forecast_response +GetUsageLimitRequest,get_usage_limit_request +GetUsageLimitResponse,get_usage_limit_response +GetUsagePlanKeyRequest,get_usage_plan_key_request +GetUsagePlanKeysRequest,get_usage_plan_keys_request +GetUsagePlanRequest,get_usage_plan_request +GetUsagePlansRequest,get_usage_plans_request +GetUsageRequest,get_usage_request +GetUsageStatisticsRequest,get_usage_statistics_request +GetUsageStatisticsResponse,get_usage_statistics_response +GetUsageTotalsRequest,get_usage_totals_request +GetUsageTotalsResponse,get_usage_totals_response +GetUserAccessLoggingSettingsRequest,get_user_access_logging_settings_request +GetUserAccessLoggingSettingsResponse,get_user_access_logging_settings_response +GetUserAttributeVerificationCodeRequest,get_user_attribute_verification_code_request +GetUserAttributeVerificationCodeResponse,get_user_attribute_verification_code_response +GetUserDefinedFunctionRequest,get_user_defined_function_request +GetUserDefinedFunctionResponse,get_user_defined_function_response +GetUserDefinedFunctionsRequest,get_user_defined_functions_request +GetUserDefinedFunctionsResponse,get_user_defined_functions_response +GetUserDetailsRequest,get_user_details_request +GetUserDetailsResponse,get_user_details_response +GetUserEndpointsRequest,get_user_endpoints_request +GetUserEndpointsResponse,get_user_endpoints_response +GetUserIdRequest,get_user_id_request +GetUserIdResponse,get_user_id_response +GetUserPolicyRequest,get_user_policy_request +GetUserPolicyResponse,get_user_policy_response +GetUserPoolMfaConfigRequest,get_user_pool_mfa_config_request +GetUserPoolMfaConfigResponse,get_user_pool_mfa_config_response +GetUserRequest,get_user_request +GetUserResponse,get_user_response +GetUserSettingsRequest,get_user_settings_request +GetUserSettingsResponse,get_user_settings_response +GetUtterancesViewRequest,get_utterances_view_request +GetUtterancesViewResponse,get_utterances_view_response +GetV2LoggingOptionsResponse,get_v2_logging_options_response +GetVPCEConfigurationRequest,get_vpce_configuration_request +GetVPCEConfigurationResult,get_vpce_configuration_result +GetVariablesRequest,get_variables_request +GetVariablesResult,get_variables_result +GetVariantImportRequest,get_variant_import_request +GetVariantImportResponse,get_variant_import_response +GetVariantStoreRequest,get_variant_store_request +GetVariantStoreResponse,get_variant_store_response +GetVaultAccessPolicyInput,get_vault_access_policy_input +GetVaultAccessPolicyOutput,get_vault_access_policy_output +GetVaultLockInput,get_vault_lock_input +GetVaultLockOutput,get_vault_lock_output +GetVaultNotificationsInput,get_vault_notifications_input +GetVaultNotificationsOutput,get_vault_notifications_output +GetVectorEnrichmentJobInput,get_vector_enrichment_job_input +GetVectorEnrichmentJobOutput,get_vector_enrichment_job_output +GetVehicleRequest,get_vehicle_request +GetVehicleResponse,get_vehicle_response +GetVehicleStatusRequest,get_vehicle_status_request +GetVehicleStatusResponse,get_vehicle_status_response +GetVerifiedAccessEndpointPolicyRequest,get_verified_access_endpoint_policy_request +GetVerifiedAccessEndpointPolicyResult,get_verified_access_endpoint_policy_result +GetVerifiedAccessGroupPolicyRequest,get_verified_access_group_policy_request +GetVerifiedAccessGroupPolicyResult,get_verified_access_group_policy_result +GetViewInput,get_view_input +GetViewOutput,get_view_output +GetViolationDetailsRequest,get_violation_details_request +GetViolationDetailsResponse,get_violation_details_response +GetVirtualMachineInput,get_virtual_machine_input +GetVirtualMachineOutput,get_virtual_machine_output +GetVocabularyFilterRequest,get_vocabulary_filter_request +GetVocabularyFilterResponse,get_vocabulary_filter_response +GetVocabularyRequest,get_vocabulary_request +GetVocabularyResponse,get_vocabulary_response +GetVoiceChannelRequest,get_voice_channel_request +GetVoiceChannelResponse,get_voice_channel_response +GetVoiceConnectorEmergencyCallingConfigurationRequest,get_voice_connector_emergency_calling_configuration_request +GetVoiceConnectorEmergencyCallingConfigurationResponse,get_voice_connector_emergency_calling_configuration_response +GetVoiceConnectorGroupRequest,get_voice_connector_group_request +GetVoiceConnectorGroupResponse,get_voice_connector_group_response +GetVoiceConnectorLoggingConfigurationRequest,get_voice_connector_logging_configuration_request +GetVoiceConnectorLoggingConfigurationResponse,get_voice_connector_logging_configuration_response +GetVoiceConnectorOriginationRequest,get_voice_connector_origination_request +GetVoiceConnectorOriginationResponse,get_voice_connector_origination_response +GetVoiceConnectorProxyRequest,get_voice_connector_proxy_request +GetVoiceConnectorProxyResponse,get_voice_connector_proxy_response +GetVoiceConnectorRequest,get_voice_connector_request +GetVoiceConnectorResponse,get_voice_connector_response +GetVoiceConnectorStreamingConfigurationRequest,get_voice_connector_streaming_configuration_request +GetVoiceConnectorStreamingConfigurationResponse,get_voice_connector_streaming_configuration_response +GetVoiceConnectorTerminationHealthRequest,get_voice_connector_termination_health_request +GetVoiceConnectorTerminationHealthResponse,get_voice_connector_termination_health_response +GetVoiceConnectorTerminationRequest,get_voice_connector_termination_request +GetVoiceConnectorTerminationResponse,get_voice_connector_termination_response +GetVoiceProfileDomainRequest,get_voice_profile_domain_request +GetVoiceProfileDomainResponse,get_voice_profile_domain_response +GetVoiceProfileRequest,get_voice_profile_request +GetVoiceProfileResponse,get_voice_profile_response +GetVoiceTemplateRequest,get_voice_template_request +GetVoiceTemplateResponse,get_voice_template_response +GetVoiceToneAnalysisTaskRequest,get_voice_tone_analysis_task_request +GetVoiceToneAnalysisTaskResponse,get_voice_tone_analysis_task_response +GetVpcAttachmentRequest,get_vpc_attachment_request +GetVpcAttachmentResponse,get_vpc_attachment_response +GetVpcLinkRequest,get_vpc_link_request +GetVpcLinkResponse,get_vpc_link_response +GetVpcLinksRequest,get_vpc_links_request +GetVpcLinksResponse,get_vpc_links_response +GetVpnConnectionDeviceSampleConfigurationRequest,get_vpn_connection_device_sample_configuration_request +GetVpnConnectionDeviceSampleConfigurationResult,get_vpn_connection_device_sample_configuration_result +GetVpnConnectionDeviceTypesRequest,get_vpn_connection_device_types_request +GetVpnConnectionDeviceTypesResult,get_vpn_connection_device_types_result +GetVpnTunnelReplacementStatusRequest,get_vpn_tunnel_replacement_status_request +GetVpnTunnelReplacementStatusResult,get_vpn_tunnel_replacement_status_result +GetWebACLForResourceRequest,get_web_acl_for_resource_request +GetWebACLForResourceResponse,get_web_acl_for_resource_response +GetWebACLRequest,get_web_acl_request +GetWebACLResponse,get_web_acl_response +GetWebhookRequest,get_webhook_request +GetWebhookResult,get_webhook_result +GetWirelessDeviceImportTaskRequest,get_wireless_device_import_task_request +GetWirelessDeviceImportTaskResponse,get_wireless_device_import_task_response +GetWirelessDeviceRequest,get_wireless_device_request +GetWirelessDeviceResponse,get_wireless_device_response +GetWirelessDeviceStatisticsRequest,get_wireless_device_statistics_request +GetWirelessDeviceStatisticsResponse,get_wireless_device_statistics_response +GetWirelessGatewayCertificateRequest,get_wireless_gateway_certificate_request +GetWirelessGatewayCertificateResponse,get_wireless_gateway_certificate_response +GetWirelessGatewayFirmwareInformationRequest,get_wireless_gateway_firmware_information_request +GetWirelessGatewayFirmwareInformationResponse,get_wireless_gateway_firmware_information_response +GetWirelessGatewayRequest,get_wireless_gateway_request +GetWirelessGatewayResponse,get_wireless_gateway_response +GetWirelessGatewayStatisticsRequest,get_wireless_gateway_statistics_request +GetWirelessGatewayStatisticsResponse,get_wireless_gateway_statistics_response +GetWirelessGatewayTaskDefinitionRequest,get_wireless_gateway_task_definition_request +GetWirelessGatewayTaskDefinitionResponse,get_wireless_gateway_task_definition_response +GetWirelessGatewayTaskRequest,get_wireless_gateway_task_request +GetWirelessGatewayTaskResponse,get_wireless_gateway_task_response +GetWorkGroupInput,get_work_group_input +GetWorkGroupOutput,get_work_group_output +GetWorkUnitResultsRequest,get_work_unit_results_request +GetWorkUnitResultsResponse,get_work_unit_results_response +GetWorkUnitsRequest,get_work_units_request +GetWorkUnitsResponse,get_work_units_response +GetWorkerFleetRequest,get_worker_fleet_request +GetWorkerFleetResponse,get_worker_fleet_response +GetWorkerRequest,get_worker_request +GetWorkerResponse,get_worker_response +GetWorkflowExecutionHistoryInput,get_workflow_execution_history_input +GetWorkflowExecutionRequest,get_workflow_execution_request +GetWorkflowExecutionResponse,get_workflow_execution_response +GetWorkflowRequest,get_workflow_request +GetWorkflowResponse,get_workflow_response +GetWorkflowRunPropertiesRequest,get_workflow_run_properties_request +GetWorkflowRunPropertiesResponse,get_workflow_run_properties_response +GetWorkflowRunRequest,get_workflow_run_request +GetWorkflowRunResponse,get_workflow_run_response +GetWorkflowRunsRequest,get_workflow_runs_request +GetWorkflowRunsResponse,get_workflow_runs_response +GetWorkflowStepExecutionRequest,get_workflow_step_execution_request +GetWorkflowStepExecutionResponse,get_workflow_step_execution_response +GetWorkflowStepGroupRequest,get_workflow_step_group_request +GetWorkflowStepGroupResponse,get_workflow_step_group_response +GetWorkflowStepRequest,get_workflow_step_request +GetWorkflowStepResponse,get_workflow_step_response +GetWorkflowStepsRequest,get_workflow_steps_request +GetWorkflowStepsResponse,get_workflow_steps_response +GetWorkgroupRequest,get_workgroup_request +GetWorkgroupResponse,get_workgroup_response +GetWorkingLocationRequest,get_working_location_request +GetWorkingLocationResponse,get_working_location_response +GetWorkloadInput,get_workload_input +GetWorkloadOutput,get_workload_output +GetWorkspaceRequest,get_workspace_request +GetWorkspaceResponse,get_workspace_response +GetWorldTemplateBodyRequest,get_world_template_body_request +GetWorldTemplateBodyResponse,get_world_template_body_response +GetXssMatchSetRequest,get_xss_match_set_request +GetXssMatchSetResponse,get_xss_match_set_response +Gid,gid +GitCloneDepth,git_clone_depth +GitConfig,git_config +GitConfigForUpdate,git_config_for_update +GitHubAccountTokenDoesNotExistException,git_hub_account_token_does_not_exist_exception +GitHubAccountTokenNameRequiredException,git_hub_account_token_name_required_exception +GitHubCodeDestination,git_hub_code_destination +GitHubCommitConfigurationFieldMappings,git_hub_commit_configuration_field_mappings +GitHubConfiguration,git_hub_configuration +GitHubDocumentCrawlProperties,git_hub_document_crawl_properties +GitHubEnterpriseServer,git_hub_enterprise_server +GitHubIssueAttachmentConfigurationFieldMappings,git_hub_issue_attachment_configuration_field_mappings +GitHubIssueCommentConfigurationFieldMappings,git_hub_issue_comment_configuration_field_mappings +GitHubIssueDocumentConfigurationFieldMappings,git_hub_issue_document_configuration_field_mappings +GitHubLocation,git_hub_location +GitHubPullRequestCommentConfigurationFieldMappings,git_hub_pull_request_comment_configuration_field_mappings +GitHubPullRequestDocumentAttachmentConfigurationFieldMappings,git_hub_pull_request_document_attachment_configuration_field_mappings +GitHubPullRequestDocumentConfigurationFieldMappings,git_hub_pull_request_document_configuration_field_mappings +GitHubRepositoryConfigurationFieldMappings,git_hub_repository_configuration_field_mappings +GitSubmodulesConfig,git_submodules_config +GivenName,given_name +GlacierJobDescription,glacier_job_description +GlacierJobParameters,glacier_job_parameters +GlacierJobTier,glacier_job_tier +Global,global +GlobalCluster,global_cluster +GlobalClusterAlreadyExistsFault,global_cluster_already_exists_fault +GlobalClusterArn,global_cluster_arn +GlobalClusterIdentifier,global_cluster_identifier +GlobalClusterMember,global_cluster_member +GlobalClusterMembers,global_cluster_members +GlobalClusterNotFoundFault,global_cluster_not_found_fault +GlobalClusterQuotaExceededFault,global_cluster_quota_exceeded_fault +GlobalClusterResourceId,global_cluster_resource_id +GlobalClusters,global_clusters +GlobalClustersMessage,global_clusters_message +GlobalConfiguration,global_configuration +GlobalEndpointTokenVersion,global_endpoint_token_version +GlobalFilters,global_filters +GlobalIdentity,global_identity +GlobalNetwork,global_network +GlobalNetworkArn,global_network_arn +GlobalNetworkId,global_network_id +GlobalNetworkIds,global_network_ids +GlobalNetworks,global_networks +GlobalNodeGroup,global_node_group +GlobalNodeGroupId,global_node_group_id +GlobalNodeGroups,global_node_groups +GlobalNodeGroupsToRemove,global_node_groups_to_remove +GlobalNodeGroupsToRetain,global_node_groups_to_retain +GlobalQuota,global_quota +GlobalReplicationGroup,global_replication_group +GlobalReplicationGroupAlreadyExistsFault,global_replication_group_already_exists_fault +GlobalReplicationGroupDescription,global_replication_group_description +GlobalReplicationGroupId,global_replication_group_id +GlobalReplicationGroupIdSuffix,global_replication_group_id_suffix +GlobalReplicationGroupInfo,global_replication_group_info +GlobalReplicationGroupMember,global_replication_group_member +GlobalReplicationGroupMemberRole,global_replication_group_member_role +GlobalReplicationGroupNotFoundFault,global_replication_group_not_found_fault +GlobalReplicationGroups,global_replication_groups +GlobalSecondaryIndex,global_secondary_index +GlobalSecondaryIndexAutoScalingUpdate,global_secondary_index_auto_scaling_update +GlobalSecondaryIndexDescription,global_secondary_index_description +GlobalSecondaryIndexInfo,global_secondary_index_info +GlobalSecondaryIndexOverride,global_secondary_index_override +GlobalSecondaryIndexUpdate,global_secondary_index_update +GlobalSecondaryIndexUpdates,global_secondary_index_updates +GlobalSecondaryIndexes,global_secondary_indexes +GlobalSettings,global_settings +GlobalSignOutRequest,global_sign_out_request +GlobalTable,global_table +GlobalTableAlreadyExistsException,global_table_already_exists_exception +GlobalTableArn,global_table_arn +GlobalTableBillingMode,global_table_billing_mode +GlobalTableBorderOptions,global_table_border_options +GlobalTableDescription,global_table_description +GlobalTableGlobalSecondaryIndexSettingsUpdate,global_table_global_secondary_index_settings_update +GlobalTableName,global_table_name +GlobalTableNotFoundException,global_table_not_found_exception +GlobalTableProvisionedWriteCapacityAutoScalingSettingsUpdate,global_table_provisioned_write_capacity_auto_scaling_settings_update +GlobalTableProvisionedWriteCapacityUnits,global_table_provisioned_write_capacity_units +GlobalTableStatus,global_table_status +GlobalTableVersion,global_table_version +GlobalTables,global_tables +GlobalTimeout,global_timeout +GlobalWriteForwardingRequested,global_write_forwarding_requested +GlobalWriteForwardingStatus,global_write_forwarding_status +GlueCatalogGeneration,glue_catalog_generation +GlueConfiguration,glue_configuration +GlueConnectionName,glue_connection_name +GlueDataCatalogConfig,glue_data_catalog_config +GlueDataCatalogConfiguration,glue_data_catalog_configuration +GlueDataCatalogConfigurationDescription,glue_data_catalog_configuration_description +GlueDataCatalogConfigurationUpdate,glue_data_catalog_configuration_update +GlueEncryptionException,glue_encryption_exception +GlueIps,glue_ips +GluePolicy,glue_policy +GlueSchema,glue_schema +GlueStudioSchemaColumn,glue_studio_schema_column +GlueTable,glue_table +GlueTableReference,glue_table_reference +GlueVersion,glue_version +Gnss,gnss +GoneException,gone_exception +Google,google +GoogleAnalytics,google_analytics +GoogleAnalyticsConnectorProfileCredentials,google_analytics_connector_profile_credentials +GoogleAnalyticsMetadata,google_analytics_metadata +GoogleAnalyticsSourceProperties,google_analytics_source_properties +GoogleDriveConfiguration,google_drive_configuration +GopBReference,gop_b_reference +GopClosedCadence,gop_closed_cadence +GopNumBFrames,gop_num_b_frames +GopSize,gop_size +GopSizeUnits,gop_size_units +GovCloudAccountId,gov_cloud_account_id +GovernedCatalogSource,governed_catalog_source +GovernedCatalogTarget,governed_catalog_target +Gpu,gpu +GpuDeviceInfo,gpu_device_info +GpuDeviceMemoryInfo,gpu_device_memory_info +GpuInfo,gpu_info +Gpus,gpus +Gradient,gradient +GradientColor,gradient_color +GradientOffset,gradient_offset +GradientStop,gradient_stop +GrammarSlotTypeSetting,grammar_slot_type_setting +GrammarSlotTypeSource,grammar_slot_type_source +Grant,grant +GrantAccessRequest,grant_access_request +GrantAccessResult,grant_access_result +GrantArn,grant_arn +GrantArns,grant_arns +GrantConstraints,grant_constraints +GrantEntitlementRequest,grant_entitlement_request +GrantFlowEntitlements420Exception,grant_flow_entitlements420_exception +GrantFlowEntitlementsRequest,grant_flow_entitlements_request +GrantFlowEntitlementsResponse,grant_flow_entitlements_response +GrantFullControl,grant_full_control +GrantId,grant_id +GrantLinkPermissions,grant_link_permissions +GrantListEntry,grant_list_entry +GrantName,grant_name +GrantPermissions,grant_permissions +GrantPermissionsRequest,grant_permissions_request +GrantPoweruserPrivileges,grant_poweruser_privileges +GrantRead,grant_read +GrantReadACP,grant_read_acp +GrantStatus,grant_status +GrantTime,grant_time +GrantToken,grant_token +GrantTokens,grant_tokens +GrantWrite,grant_write +GrantWriteACP,grant_write_acp +GrantedLicense,granted_license +GrantedOperations,granted_operations +Grantee,grantee +GranteeId,grantee_id +GranteePrincipal,grantee_principal +GranteePrincipalArn,grantee_principal_arn +GranteeType,grantee_type +Grantor,grantor +Grants,grants +Granularities,granularities +Granularity,granularity +Graph,graph +GraphArn,graph_arn +GraphArns,graph_arns +GraphList,graph_list +GraphQLRenderConfig,graph_ql_render_config +GraphQLSchemaException,graph_ql_schema_exception +GraphqlApi,graphql_api +GreKey,gre_key +GreaterThan,greater_than +GreaterThanOrEqual,greater_than_or_equal +GreaterThanOrEquals,greater_than_or_equals +Green,green +GreenFleetProvisioningOption,green_fleet_provisioning_option +GreenPrimaryX,green_primary_x +GreenPrimaryY,green_primary_y +Greengrass,greengrass +GreengrassConfiguration,greengrass_configuration +GreengrassOutputDetails,greengrass_output_details +GreengrassV2,greengrass_v2 +GremlinQueryStatus,gremlin_query_status +GremlinQueryStatusAttributes,gremlin_query_status_attributes +Grid,grid +GridLayout,grid_layout +GridLayoutCanvasSizeOptions,grid_layout_canvas_size_options +GridLayoutConfiguration,grid_layout_configuration +GridLayoutElement,grid_layout_element +GridLayoutScreenCanvasSizeOptions,grid_layout_screen_canvas_size_options +GridLineVisibility,grid_line_visibility +GridViewConfiguration,grid_view_configuration +GrokClassifier,grok_classifier +GrokPattern,grok_pattern +GroundStationData,ground_station_data +GroundTruth,ground_truth +GroundTruthManifest,ground_truth_manifest +GroundTruthS3Input,ground_truth_s3_input +Group,group +GroupARN,group_arn +GroupArn,group_arn +GroupAttributeField,group_attribute_field +GroupBy,group_by +GroupByAttribute,group_by_attribute +GroupByAttributeValue,group_by_attribute_value +GroupByKey,group_by_key +GroupCertificateAuthorities,group_certificate_authorities +GroupCertificateAuthorityArn,group_certificate_authority_arn +GroupCertificateAuthorityId,group_certificate_authority_id +GroupCertificateAuthorityProperties,group_certificate_authority_properties +GroupConfiguration,group_configuration +GroupConfigurationItem,group_configuration_item +GroupConfigurationParameter,group_configuration_parameter +GroupCount,group_count +GroupDefinition,group_definition +GroupDefinitions,group_definitions +GroupDesc,group_desc +GroupDetail,group_detail +GroupDetailList,group_detail_list +GroupDisplayName,group_display_name +GroupExistsException,group_exists_exception +GroupFiles,group_files +GroupFilter,group_filter +GroupId,group_id +GroupIdentifier,group_identifier +GroupIdentifiers,group_identifiers +GroupIdentity,group_identity +GroupIds,group_ids +GroupInformation,group_information +GroupIpAddress,group_ip_address +GroupLabelOptions,group_label_options +GroupLifecycleEventsDesiredStatus,group_lifecycle_events_desired_status +GroupLifecycleEventsStatus,group_lifecycle_events_status +GroupLifecycleEventsStatusMessage,group_lifecycle_events_status_message +GroupList,group_list +GroupMember,group_member +GroupMemberList,group_member_list +GroupMembers,group_members +GroupMembership,group_membership +GroupMembershipExistenceResult,group_membership_existence_result +GroupMemberships,group_memberships +GroupMetadata,group_metadata +GroupName,group_name +GroupNameAndArn,group_name_and_arn +GroupNameColumn,group_name_column +GroupNamePrefix,group_name_prefix +GroupNames,group_names +GroupOrderingIdSummaries,group_ordering_id_summaries +GroupOrderingIdSummary,group_ordering_id_summary +GroupOwner,group_owner +GroupOwnerId,group_owner_id +GroupOwnerSetting,group_owner_setting +GroupPermission,group_permission +GroupPolicyList,group_policy_list +GroupProperties,group_properties +GroupQuery,group_query +GroupResourcesInput,group_resources_input +GroupResourcesOutput,group_resources_output +GroupResult,group_result +GroupScore,group_score +GroupSearchFilter,group_search_filter +GroupSecurityIdentifier,group_security_identifier +GroupSize,group_size +GroupSource,group_source +GroupSummary,group_summary +GroupType,group_type +GroupVersion,group_version +GroupVersionId,group_version_id +GroupedBys,grouped_bys +GroupedResourceCount,grouped_resource_count +GroupedResourceCounts,grouped_resource_counts +GroupingAttributeNames,grouping_attribute_names +GroupingSeparator,grouping_separator +GroupingType,grouping_type +Groupings,groupings +Groups,groups +GroupsSummaries,groups_summaries +GrowthFactor,growth_factor +GrowthRate,growth_rate +GrowthRateComputation,growth_rate_computation +GrowthType,growth_type +GrpcCode,grpc_code +GrpcGatewayRoute,grpc_gateway_route +GrpcGatewayRouteAction,grpc_gateway_route_action +GrpcGatewayRouteMatch,grpc_gateway_route_match +GrpcGatewayRouteMetadata,grpc_gateway_route_metadata +GrpcGatewayRouteRewrite,grpc_gateway_route_rewrite +GrpcRetryPolicy,grpc_retry_policy +GrpcRoute,grpc_route +GrpcRouteAction,grpc_route_action +GrpcRouteMatch,grpc_route_match +GrpcRouteMetadata,grpc_route_metadata +GrpcTimeout,grpc_timeout +Gsm,gsm +GsmLocalId,gsm_local_id +GsmNmr,gsm_nmr +GsmNmrObj,gsm_nmr_obj +GsmObj,gsm_obj +GsmTimingAdvance,gsm_timing_advance +Gt,gt +Gte,gte +GuardDutyFindingId,guard_duty_finding_id +GuardianAttributes,guardian_attributes +GuardianOptions,guardian_options +GuessMIMETypeEnabled,guess_mime_type_enabled +GuestRoleArn,guest_role_arn +Guidance,guidance +Gutter,gutter +GutterSpacing,gutter_spacing +GutterStyle,gutter_style +GutterVisibility,gutter_visibility +H264ColorSpaceSettings,h264_color_space_settings +H264FilterSettings,h264_filter_settings +H264QvbrSettings,h264_qvbr_settings +H264Settings,h264_settings +H265ColorSpaceSettings,h265_color_space_settings +H265FilterSettings,h265_filter_settings +H265PackagingType,h265_packaging_type +H265QvbrSettings,h265_qvbr_settings +H265Settings,h265_settings +HECAcknowledgmentTimeoutInSeconds,hec_acknowledgment_timeout_in_seconds +HECEndpoint,hec_endpoint +HECEndpointType,hec_endpoint_type +HECToken,hec_token +HIT,hit +HITGroupId,hit_group_id +HITId,hit_id +HITLayoutId,hit_layout_id +HITLayoutParameter,hit_layout_parameter +HITLayoutParameters,hit_layout_parameters +HITReviewPolicy,hit_review_policy +HITReviewReport,hit_review_report +HITReviewStatus,hit_review_status +HITStatus,hit_status +HITTypeId,hit_type_id +HITs,hits +HLSFragmentSelector,hls_fragment_selector +HLSStreamingSessionURL,hls_streaming_session_url +HLSTimestampRange,hls_timestamp_range +HPOConfig,hpo_config +HPOObjective,hpo_objective +HPOResourceConfig,hpo_resource_config +HTTPCode4XXCount,http_code4_xx_count +HTTPCode5XXCount,http_code5_xx_count +HTTPHeader,http_header +HTTPMethod,http_method +HTTPPort,http_port +HTTPRequest,http_request +HTTPSPort,https_port +HTTPVersion,http_version +HadoopJarStep,hadoop_jar_step +HadoopJarStepConfig,hadoop_jar_step_config +HadoopStepConfig,hadoop_step_config +HadoopVersion,hadoop_version +HammingLoss,hamming_loss +HandOffTime,hand_off_time +Handler,handler +HandlerFailureException,handler_failure_exception +HandlerInternalFailureException,handler_internal_failure_exception +Handshake,handshake +HandshakeAlreadyInStateException,handshake_already_in_state_exception +HandshakeConstraintViolationException,handshake_constraint_violation_exception +HandshakeFilter,handshake_filter +HandshakeId,handshake_id +HandshakeNotFoundException,handshake_not_found_exception +HandshakeParty,handshake_party +HandshakeResource,handshake_resource +Handshakes,handshakes +HapgArn,hapg_arn +HapgList,hapg_list +HapgSerial,hapg_serial +HardExpiry,hard_expiry +HardLimit,hard_limit +HarvestJob,harvest_job +HarvestJobs,harvest_jobs +HasAdditionalSubjectAlternativeNames,has_additional_subject_alternative_names +HasAssociatedService,has_associated_service +HasCredential,has_credential +HasCustomEventSelectors,has_custom_event_selectors +HasDefaultPath,has_default_path +HasError,has_error +HasErrors,has_errors +HasFault,has_fault +HasFcmServiceCredentials,has_fcm_service_credentials +HasInsightSelectors,has_insight_selectors +HasMoreApplications,has_more_applications +HasMoreDeliveryStreams,has_more_delivery_streams +HasMoreDestinations,has_more_destinations +HasMoreShards,has_more_shards +HasMoreStreams,has_more_streams +HasMoreTags,has_more_tags +HasResultSet,has_result_set +HasThrottle,has_throttle +HasTokenKey,has_token_key +Hash,hash +HashAlgorithm,hash_algorithm +HashAlgorithmOptions,hash_algorithm_options +HashKeyRange,hash_key_range +HashType,hash_type +HbbtvCompliance,hbbtv_compliance +HdDeviceSettings,hd_device_settings +HdbVersion,hdb_version +HdfsNameNode,hdfs_name_node +Hdr10Metadata,hdr10_metadata +Hdr10Plus,hdr10_plus +Hdr10Settings,hdr10_settings +HdrToSdrToneMapper,hdr_to_sdr_tone_mapper +HeadBucketRequest,head_bucket_request +HeadObjectOutput,head_object_output +HeadObjectRequest,head_object_request +Header,header +HeaderBehavior,header_behavior +HeaderConfig,header_config +HeaderFooterSectionConfiguration,header_footer_section_configuration +HeaderList,header_list +HeaderMatch,header_match +HeaderMatchPattern,header_match_pattern +HeaderName,header_name +HeaderObject,header_object +HeaderOrder,header_order +HeaderParameters,header_parameters +HeaderRow,header_row +HeaderSections,header_sections +HeaderStyle,header_style +HeaderValue,header_value +HeaderValues,header_values +Headers,headers +HeadersConfig,headers_config +HeadersInBounceNotificationsEnabled,headers_in_bounce_notifications_enabled +HeadersInComplaintNotificationsEnabled,headers_in_complaint_notifications_enabled +HeadersInDeliveryNotificationsEnabled,headers_in_delivery_notifications_enabled +HeadersToInclude,headers_to_include +Health,health +HealthCheck,health_check +HealthCheckAlreadyExists,health_check_already_exists +HealthCheckArn,health_check_arn +HealthCheckConfig,health_check_config +HealthCheckConfiguration,health_check_configuration +HealthCheckCount,health_check_count +HealthCheckCustomConfig,health_check_custom_config +HealthCheckEnabled,health_check_enabled +HealthCheckGracePeriod,health_check_grace_period +HealthCheckGracePeriodSeconds,health_check_grace_period_seconds +HealthCheckId,health_check_id +HealthCheckIds,health_check_ids +HealthCheckInUse,health_check_in_use +HealthCheckIntervalSeconds,health_check_interval_seconds +HealthCheckObservation,health_check_observation +HealthCheckObservations,health_check_observations +HealthCheckPath,health_check_path +HealthCheckPolicy,health_check_policy +HealthCheckPort,health_check_port +HealthCheckProtocol,health_check_protocol +HealthCheckTimeoutSeconds,health_check_timeout_seconds +HealthCheckType,health_check_type +HealthCheckVersion,health_check_version +HealthCheckVersionMismatch,health_check_version_mismatch +HealthChecks,health_checks +HealthEvent,health_event +HealthEventArn,health_event_arn +HealthEventDescription,health_event_description +HealthEventTypeCategory,health_event_type_category +HealthEventTypeCode,health_event_type_code +HealthEvents,health_events +HealthEventsConfig,health_events_config +HealthReason,health_reason +HealthScoreThreshold,health_score_threshold +HealthService,health_service +HealthState,health_state +HealthStatus,health_status +HealthThreshold,health_threshold +HealthUnavailableException,health_unavailable_exception +HealthUrl,health_url +HealthyThreshold,healthy_threshold +HealthyThresholdCount,healthy_threshold_count +HeartbeatEnable,heartbeat_enable +HeartbeatEvent,heartbeat_event +HeartbeatFrequency,heartbeat_frequency +HeartbeatSchema,heartbeat_schema +HeartbeatTimeout,heartbeat_timeout +HeatMapAggregatedFieldWells,heat_map_aggregated_field_wells +HeatMapColumnItemsLimitConfiguration,heat_map_column_items_limit_configuration +HeatMapColumnSort,heat_map_column_sort +HeatMapConfiguration,heat_map_configuration +HeatMapFieldWells,heat_map_field_wells +HeatMapRowItemsLimitConfiguration,heat_map_row_items_limit_configuration +HeatMapRowSort,heat_map_row_sort +HeatMapSortConfiguration,heat_map_sort_configuration +HeatMapVisual,heat_map_visual +HeatmapColor,heatmap_color +HeatmapConfiguration,heatmap_configuration +Height,height +HeightInPx,height_in_px +HeightPixels,height_pixels +HeightTrim,height_trim +HelpfulResource,helpful_resource +HelpfulResourceDisplayText,helpful_resource_display_text +HelpfulResourceUrl,helpful_resource_url +Heterogeneous,heterogeneous +HexCode,hex_code +HexFontColor,hex_font_color +Hibernate,hibernate +HibernationOptions,hibernation_options +HibernationOptionsRequest,hibernation_options_request +HibernationSupported,hibernation_supported +HiddenColumns,hidden_columns +HiddenFromGlobalAddressList,hidden_from_global_address_list +HideDisabled,hide_disabled +HidePassword,hide_password +HierarchicalAccessControlList,hierarchical_access_control_list +HierarchicalPrincipal,hierarchical_principal +HierarchyGroup,hierarchy_group +HierarchyGroupArn,hierarchy_group_arn +HierarchyGroupCondition,hierarchy_group_condition +HierarchyGroupId,hierarchy_group_id +HierarchyGroupMatchType,hierarchy_group_match_type +HierarchyGroupSummary,hierarchy_group_summary +HierarchyGroupSummaryReference,hierarchy_group_summary_reference +HierarchyId,hierarchy_id +HierarchyLevel,hierarchy_level +HierarchyLevelLimitExceededException,hierarchy_level_limit_exceeded_exception +HierarchyLevelUpdate,hierarchy_level_update +HierarchyPath,hierarchy_path +HierarchyPathReference,hierarchy_path_reference +HierarchyStructure,hierarchy_structure +HierarchyStructureUpdate,hierarchy_structure_update +HierarchyTypeMismatchException,hierarchy_type_mismatch_exception +High,high +HighAction,high_action +HighAvailabilityConfig,high_availability_config +HighCount,high_count +HighestSeverityThreatDetails,highest_severity_threat_details +Highlight,highlight +HighlightColor,highlight_color +HighlightEnabled,highlight_enabled +Highlighted,highlighted +Highlights,highlights +HistogramAggregatedFieldWells,histogram_aggregated_field_wells +HistogramBinOptions,histogram_bin_options +HistogramConfiguration,histogram_configuration +HistogramEntry,histogram_entry +HistogramFieldWells,histogram_field_wells +HistogramVisual,histogram_visual +HistoricalDataPathList,historical_data_path_list +HistoricalMetric,historical_metric +HistoricalMetricData,historical_metric_data +HistoricalMetricResult,historical_metric_result +HistoricalMetrics,historical_metrics +HistoricalOptions,historical_options +History,history +HistoryData,history_data +HistoryEvent,history_event +HistoryEventExecutionDataDetails,history_event_execution_data_details +HistoryItemType,history_item_type +HistoryRecord,history_record +HistoryRecordEntry,history_record_entry +HistoryRecords,history_records +HistorySummary,history_summary +Hit,hit +Hits,hits +Hive,hive +HiveCompatiblePartitions,hive_compatible_partitions +HiveJsonSerDe,hive_json_ser_de +HlsAdditionalManifest,hls_additional_manifest +HlsAkamaiSettings,hls_akamai_settings +HlsBasicPutSettings,hls_basic_put_settings +HlsCaptionLanguageMapping,hls_caption_language_mapping +HlsCdnSettings,hls_cdn_settings +HlsConfiguration,hls_configuration +HlsContentProtection,hls_content_protection +HlsEncryption,hls_encryption +HlsEncryptionSettings,hls_encryption_settings +HlsGroupSettings,hls_group_settings +HlsId3SegmentTagging,hls_id3_segment_tagging +HlsId3SegmentTaggingScheduleActionSettings,hls_id3_segment_tagging_schedule_action_settings +HlsId3SegmentTaggingSettings,hls_id3_segment_tagging_settings +HlsImageBasedTrickPlaySettings,hls_image_based_trick_play_settings +HlsIngest,hls_ingest +HlsInputSettings,hls_input_settings +HlsManifest,hls_manifest +HlsManifestCreateOrUpdateParameters,hls_manifest_create_or_update_parameters +HlsManifests,hls_manifests +HlsMediaStoreSettings,hls_media_store_settings +HlsOutputSettings,hls_output_settings +HlsPackage,hls_package +HlsPlaylistSettings,hls_playlist_settings +HlsRenditionGroupSettings,hls_rendition_group_settings +HlsS3Settings,hls_s3_settings +HlsSettings,hls_settings +HlsSignaledSystemIds,hls_signaled_system_ids +HlsTimedMetadataScheduleActionSettings,hls_timed_metadata_schedule_action_settings +HlsTimedMetadataSettings,hls_timed_metadata_settings +HlsWebdavSettings,hls_webdav_settings +Holdout,holdout +HoldoutActivity,holdout_activity +HoldoutPercent,holdout_percent +HolidayConfig,holiday_config +HolidayConfigAttributes,holiday_config_attributes +HomeDirectory,home_directory +HomeDirectoryMapEntry,home_directory_map_entry +HomeDirectoryMappings,home_directory_mappings +HomeDirectoryType,home_directory_type +HomeEfsFileSystem,home_efs_file_system +HomeEfsFileSystemId,home_efs_file_system_id +HomeEfsFileSystemKmsKeyId,home_efs_file_system_kms_key_id +HomeEfsFileSystemUid,home_efs_file_system_uid +HomePageUrl,home_page_url +HomePhoneNumber,home_phone_number +HomeRegion,home_region +HomeRegionControl,home_region_control +HomeRegionControls,home_region_controls +HomeRegionNotSetException,home_region_not_set_exception +HomeRegions,home_regions +Homogeneous,homogeneous +Honeycode,honeycode +HoneycodeConnectorProfileCredentials,honeycode_connector_profile_credentials +HoneycodeDestinationProperties,honeycode_destination_properties +HoneycodeMetadata,honeycode_metadata +HonorCooldown,honor_cooldown +HonorificPrefix,honorific_prefix +HonorificSuffix,honorific_suffix +Hook,hook +HookConfiguration,hook_configuration +HookFailureMode,hook_failure_mode +HookInvocationCount,hook_invocation_count +HookInvocationPoint,hook_invocation_point +HookParameters,hook_parameters +HookStatus,hook_status +HookStatusReason,hook_status_reason +HookType,hook_type +Hooks,hooks +HopDestination,hop_destination +HopDestinations,hop_destinations +Horizontal,horizontal +HorizontalAccuracy,horizontal_accuracy +HorizontalAlign,horizontal_align +HorizontalLayoutConfiguration,horizontal_layout_configuration +HorizontalOffset,horizontal_offset +HorizontalPosition,horizontal_position +HorizontalTextAlignment,horizontal_text_alignment +Horovod,horovod +Host,host +HostAddress,host_address +HostArn,host_arn +HostArnFilter,host_arn_filter +HostEntry,host_entry +HostEnvironment,host_environment +HostEnvironmentId,host_environment_id +HostHeaderConditionConfig,host_header_condition_config +HostHeaderConfig,host_header_config +HostId,host_id +HostIdFilter,host_id_filter +HostIdSet,host_id_set +HostIds,host_ids +HostInstance,host_instance +HostInstanceType,host_instance_type +HostIp,host_ip +HostKey,host_key +HostKeyAttributes,host_key_attributes +HostKeyBody,host_key_body +HostKeyFingerprint,host_key_fingerprint +HostKeyId,host_key_id +HostKeys,host_keys +HostMaintenance,host_maintenance +HostName,host_name +HostNetwork,host_network +HostOffering,host_offering +HostPath,host_path +HostPort,host_port +HostProperties,host_properties +HostRecovery,host_recovery +HostReservation,host_reservation +HostReservationId,host_reservation_id +HostReservationIdSet,host_reservation_id_set +HostReservationSet,host_reservation_set +HostResourceGroupArn,host_resource_group_arn +HostRole,host_role +HostUrl,host_url +HostVPCId,host_vpc_id +HostVolumeProperties,host_volume_properties +HostedConfigurationVersion,hosted_configuration_version +HostedConfigurationVersionSummary,hosted_configuration_version_summary +HostedConfigurationVersions,hosted_configuration_versions +HostedZone,hosted_zone +HostedZoneAlreadyExists,hosted_zone_already_exists +HostedZoneArn,hosted_zone_arn +HostedZoneConfig,hosted_zone_config +HostedZoneCount,hosted_zone_count +HostedZoneId,hosted_zone_id +HostedZoneIdMarker,hosted_zone_id_marker +HostedZoneLimit,hosted_zone_limit +HostedZoneNotEmpty,hosted_zone_not_empty +HostedZoneNotFound,hosted_zone_not_found +HostedZoneNotPrivate,hosted_zone_not_private +HostedZoneOwner,hosted_zone_owner +HostedZonePartiallyDelegated,hosted_zone_partially_delegated +HostedZoneSummaries,hosted_zone_summaries +HostedZoneSummary,hosted_zone_summary +HostedZones,hosted_zones +Hostname,hostname +HostnameTheme,hostname_theme +HostnameType,hostname_type +Hosts,hosts +Hour,hour +HourOfDay,hour_of_day +HourlyCommitmentToPurchase,hourly_commitment_to_purchase +HourlyOnDemandRate,hourly_on_demand_rate +HourlyPrice,hourly_price +Hours,hours +HoursOfOperation,hours_of_operation +HoursOfOperationArn,hours_of_operation_arn +HoursOfOperationConfig,hours_of_operation_config +HoursOfOperationId,hours_of_operation_id +HoursOfOperationSearchCriteria,hours_of_operation_search_criteria +HoursOfOperationSearchFilter,hours_of_operation_search_filter +HoursOfOperationSummary,hours_of_operation_summary +HoursOfOperationSummaryList,hours_of_operation_summary_list +HoursOfOperationTimeSlice,hours_of_operation_time_slice +HoursOfOperations,hours_of_operations +HrAllowed,hr_allowed +HrdBufferFinalFillPercentage,hrd_buffer_final_fill_percentage +HrdBufferInitialFillPercentage,hrd_buffer_initial_fill_percentage +HrdBufferSize,hrd_buffer_size +Href,href +Hsm,hsm +HsmArn,hsm_arn +HsmCertificate,hsm_certificate +HsmClientCertificate,hsm_client_certificate +HsmClientCertificateAlreadyExistsFault,hsm_client_certificate_already_exists_fault +HsmClientCertificateIdentifier,hsm_client_certificate_identifier +HsmClientCertificateMessage,hsm_client_certificate_message +HsmClientCertificateNotFoundFault,hsm_client_certificate_not_found_fault +HsmClientCertificatePublicKey,hsm_client_certificate_public_key +HsmClientCertificateQuotaExceededFault,hsm_client_certificate_quota_exceeded_fault +HsmClientCertificates,hsm_client_certificates +HsmConfiguration,hsm_configuration +HsmConfigurationAlreadyExistsFault,hsm_configuration_already_exists_fault +HsmConfigurationIdentifier,hsm_configuration_identifier +HsmConfigurationMessage,hsm_configuration_message +HsmConfigurationNotFoundFault,hsm_configuration_not_found_fault +HsmConfigurationQuotaExceededFault,hsm_configuration_quota_exceeded_fault +HsmConfigurations,hsm_configurations +HsmId,hsm_id +HsmIpAddress,hsm_ip_address +HsmList,hsm_list +HsmPartitionName,hsm_partition_name +HsmPartitionPassword,hsm_partition_password +HsmSerialNumber,hsm_serial_number +HsmServerPublicCertificate,hsm_server_public_certificate +HsmStatus,hsm_status +HsmType,hsm_type +Hsms,hsms +HsmsLastActionFailed,hsms_last_action_failed +HsmsPendingDeletion,hsms_pending_deletion +HsmsPendingRegistration,hsms_pending_registration +HsrOperationMode,hsr_operation_mode +HsrReplicationMode,hsr_replication_mode +HsrTier,hsr_tier +Html,html +HtmlBody,html_body +HtmlMotionGraphicsSettings,html_motion_graphics_settings +HtmlPart,html_part +Http,http +HttpAction,http_action +HttpActionHeader,http_action_header +HttpAuthorization,http_authorization +HttpCode,http_code +HttpConfiguration,http_configuration +HttpContext,http_context +HttpDataSourceConfig,http_data_source_config +HttpEndpoint,http_endpoint +HttpEndpointBufferingHints,http_endpoint_buffering_hints +HttpEndpointCommonAttribute,http_endpoint_common_attribute +HttpEndpointConfiguration,http_endpoint_configuration +HttpEndpointDescription,http_endpoint_description +HttpEndpointDestinationConfiguration,http_endpoint_destination_configuration +HttpEndpointDestinationDescription,http_endpoint_destination_description +HttpEndpointDestinationUpdate,http_endpoint_destination_update +HttpEndpointEnabled,http_endpoint_enabled +HttpEndpointRequestConfiguration,http_endpoint_request_configuration +HttpEndpointRetryOptions,http_endpoint_retry_options +HttpErrorCodeReturnedEquals,http_error_code_returned_equals +HttpExpiresDate,http_expires_date +HttpFailureFeedbackRoleArn,http_failure_feedback_role_arn +HttpGatewayRoute,http_gateway_route +HttpGatewayRouteAction,http_gateway_route_action +HttpGatewayRouteHeader,http_gateway_route_header +HttpGatewayRouteMatch,http_gateway_route_match +HttpGatewayRoutePathRewrite,http_gateway_route_path_rewrite +HttpGatewayRoutePrefixRewrite,http_gateway_route_prefix_rewrite +HttpGatewayRouteRewrite,http_gateway_route_rewrite +HttpHeader,http_header +HttpHeaderConditionConfig,http_header_condition_config +HttpHeaderConfig,http_header_config +HttpHeaderName,http_header_name +HttpHeaders,http_headers +HttpInputs,http_inputs +HttpInstanceSummary,http_instance_summary +HttpMatch,http_match +HttpMethod,http_method +HttpName,http_name +HttpNamespaceChange,http_namespace_change +HttpPackageConfiguration,http_package_configuration +HttpPackageConfigurations,http_package_configurations +HttpParameters,http_parameters +HttpPathMatch,http_path_match +HttpPort,http_port +HttpProperties,http_properties +HttpProtocolIpv6,http_protocol_ipv6 +HttpPutResponseHopLimit,http_put_response_hop_limit +HttpQueryParameter,http_query_parameter +HttpRedirectCode,http_redirect_code +HttpRequestMethodConditionConfig,http_request_method_condition_config +HttpRequestMethodConfig,http_request_method_config +HttpRetryPolicy,http_retry_policy +HttpRoute,http_route +HttpRouteAction,http_route_action +HttpRouteHeader,http_route_header +HttpRouteMatch,http_route_match +HttpStatus,http_status +HttpSuccessFeedbackRoleArn,http_success_feedback_role_arn +HttpTimeout,http_timeout +HttpTokens,http_tokens +HttpTransferMode,http_transfer_mode +HttpURL,http_url +HttpUrlDestinationConfiguration,http_url_destination_configuration +HttpUrlDestinationProperties,http_url_destination_properties +HttpUrlDestinationSummary,http_url_destination_summary +HttpVersion,http_version +HttpsInputs,https_inputs +HttpsNotificationConfiguration,https_notification_configuration +HttpsPort,https_port +HubArn,hub_arn +HubContentArn,hub_content_arn +HubContentDependencies,hub_content_dependencies +HubContentDependency,hub_content_dependency +HubContentDescription,hub_content_description +HubContentDisplayName,hub_content_display_name +HubContentDocument,hub_content_document +HubContentInfo,hub_content_info +HubContentMarkdown,hub_content_markdown +HubContentName,hub_content_name +HubContentSearchKeywords,hub_content_search_keywords +HubContentStatus,hub_content_status +HubContentSummaries,hub_content_summaries +HubContentType,hub_content_type +HubContentVersion,hub_content_version +HubDescription,hub_description +HubDeviceArn,hub_device_arn +HubDisplayName,hub_display_name +HubInfo,hub_info +HubName,hub_name +HubS3StorageConfig,hub_s3_storage_config +HubSearchKeywords,hub_search_keywords +HubStatus,hub_status +HubSummaries,hub_summaries +HudiTarget,hudi_target +HudiTargets,hudi_targets +Hue,hue +HumanLabeled,human_labeled +HumanLoopActivationConditions,human_loop_activation_conditions +HumanLoopActivationConditionsConfig,human_loop_activation_conditions_config +HumanLoopActivationConditionsEvaluationResults,human_loop_activation_conditions_evaluation_results +HumanLoopActivationConfig,human_loop_activation_config +HumanLoopActivationOutput,human_loop_activation_output +HumanLoopActivationReasons,human_loop_activation_reasons +HumanLoopArn,human_loop_arn +HumanLoopConfig,human_loop_config +HumanLoopDataAttributes,human_loop_data_attributes +HumanLoopInput,human_loop_input +HumanLoopName,human_loop_name +HumanLoopOutput,human_loop_output +HumanLoopQuotaExceededException,human_loop_quota_exceeded_exception +HumanLoopRequestSource,human_loop_request_source +HumanLoopStatus,human_loop_status +HumanLoopSummaries,human_loop_summaries +HumanLoopSummary,human_loop_summary +HumanTaskConfig,human_task_config +HumanTaskUiArn,human_task_ui_arn +HumanTaskUiName,human_task_ui_name +HumanTaskUiStatus,human_task_ui_status +HumanTaskUiSummaries,human_task_ui_summaries +HumanTaskUiSummary,human_task_ui_summary +HwAddress,hw_address +HybridAccessEnabled,hybrid_access_enabled +HybridJobQueueInfo,hybrid_job_queue_info +HyperParameterAlgorithmSpecification,hyper_parameter_algorithm_specification +HyperParameterRanges,hyper_parameter_ranges +HyperParameterSpecification,hyper_parameter_specification +HyperParameterTrainingJobDefinition,hyper_parameter_training_job_definition +HyperParameterTrainingJobSummary,hyper_parameter_training_job_summary +HyperParameterTuningEndTime,hyper_parameter_tuning_end_time +HyperParameterTuningInstanceConfig,hyper_parameter_tuning_instance_config +HyperParameterTuningJob,hyper_parameter_tuning_job +HyperParameterTuningJobArn,hyper_parameter_tuning_job_arn +HyperParameterTuningJobCompletionDetails,hyper_parameter_tuning_job_completion_details +HyperParameterTuningJobConfig,hyper_parameter_tuning_job_config +HyperParameterTuningJobConsumedResources,hyper_parameter_tuning_job_consumed_resources +HyperParameterTuningJobName,hyper_parameter_tuning_job_name +HyperParameterTuningJobObjective,hyper_parameter_tuning_job_objective +HyperParameterTuningJobSearchEntity,hyper_parameter_tuning_job_search_entity +HyperParameterTuningJobStatus,hyper_parameter_tuning_job_status +HyperParameterTuningJobStrategyConfig,hyper_parameter_tuning_job_strategy_config +HyperParameterTuningJobSummaries,hyper_parameter_tuning_job_summaries +HyperParameterTuningJobSummary,hyper_parameter_tuning_job_summary +HyperParameterTuningJobWarmStartConfig,hyper_parameter_tuning_job_warm_start_config +HyperParameterTuningResourceConfig,hyper_parameter_tuning_resource_config +HyperParameters,hyper_parameters +HyperbandStrategyConfig,hyperband_strategy_config +Hypervisor,hypervisor +HypervisorArn,hypervisor_arn +HypervisorDetails,hypervisor_details +HypervisorId,hypervisor_id +Hypervisors,hypervisors +IAMAuth,iam_auth +IAMCertificateId,iam_certificate_id +IAMDatabaseAuthenticationEnabled,iam_database_authentication_enabled +IAMIdentityCenterInstanceArn,iam_identity_center_instance_arn +IAMPolicyAssignment,iam_policy_assignment +IAMPolicyAssignmentSummary,iam_policy_assignment_summary +IAMPolicyAssignments,iam_policy_assignments +IAMRoleARN,iam_role_arn +IAMRoleIdentity,iam_role_identity +IAMRoleName,iam_role_name +IAMUser,iam_user +IAMUserIdentity,iam_user_identity +IBMDb2Settings,ibm_db2_settings +ICD10CMAttribute,icd10_cm_attribute +ICD10CMConcept,icd10_cm_concept +ICD10CMConcepts,icd10_cm_concepts +ICD10CMEntity,icd10_cm_entity +ICD10CMTrait,icd10_cm_trait +ICPRecordalStatus,icp_recordal_status +ID,id +IDLE,idle +IDPCommunicationErrorException,idp_communication_error_exception +IDPRejectedClaimException,idp_rejected_claim_exception +IFrameOnlyManifest,i_frame_only_manifest +IFrameOnlyPlaylists,i_frame_only_playlists +IKEVersions,ike_versions +IKEVersionsListValue,ike_versions_list_value +IKEVersionsRequestListValue,ike_versions_request_list_value +IND,ind +INDTaxDocuments,ind_tax_documents +IOOptimizedNextAllowedModificationTime,io_optimized_next_allowed_modification_time +IOPS,iops +IOS,ios +IOUsage,io_usage +IOWait,io_wait +IP,ip +IPAddress,ip_address +IPAddressBasedRemoteInfo,ip_address_based_remote_info +IPAddressType,ip_address_type +IPAddressVersion,ip_address_version +IPDialIn,ip_dial_in +IPRange,ip_range +IPRanges,ip_ranges +IPSet,ip_set +IPSetDescriptor,ip_set_descriptor +IPSetDescriptors,ip_set_descriptors +IPSetForwardedIPConfig,ip_set_forwarded_ip_config +IPSetId,ip_set_id +IPSetMetadata,ip_set_metadata +IPSetReference,ip_set_reference +IPSetReferenceStatement,ip_set_reference_statement +IPSetReferences,ip_set_references +IPSetSummary,ip_set_summary +IPSetUpdate,ip_set_update +IPSets,ip_sets +IPV4Range,ipv4_range +IPV6Range,ipv6_range +IPv6Address,ipv6_address +IRQ,irq +Iam,iam +IamActionDefinition,iam_action_definition +IamArn,iam_arn +IamArnRequiredException,iam_arn_required_exception +IamAuthEnabled,iam_auth_enabled +IamCertificateId,iam_certificate_id +IamDatabaseAuthenticationEnabled,iam_database_authentication_enabled +IamFleetRole,iam_fleet_role +IamIdentity,iam_identity +IamInstanceProfile,iam_instance_profile +IamInstanceProfileArn,iam_instance_profile_arn +IamInstanceProfileAssociation,iam_instance_profile_association +IamInstanceProfileAssociations,iam_instance_profile_associations +IamInstanceProfileSpecification,iam_instance_profile_specification +IamRegistrationResponse,iam_registration_response +IamResources,iam_resources +IamRole,iam_role +IamRoleArn,iam_role_arn +IamRoleConfiguration,iam_role_configuration +IamRoleId,iam_role_id +IamRoleMissingPermissionsFault,iam_role_missing_permissions_fault +IamRoleName,iam_role_name +IamRoleNotFoundFault,iam_role_not_found_fault +IamRoles,iam_roles +IamSessionArnAlreadyRegisteredException,iam_session_arn_already_registered_exception +IamUser,iam_user +IamUserAccessToBilling,iam_user_access_to_billing +IamUserArn,iam_user_arn +IamUserArnAlreadyRegisteredException,iam_user_arn_already_registered_exception +IamUserArnRequiredException,iam_user_arn_required_exception +IamUserArns,iam_user_arns +IanaProtocolNumber,iana_protocol_number +IatTtL,iat_ttl +Ibm3624NaturalPin,ibm3624_natural_pin +Ibm3624PinFromOffset,ibm3624_pin_from_offset +Ibm3624PinOffset,ibm3624_pin_offset +Ibm3624PinVerification,ibm3624_pin_verification +Ibm3624RandomPin,ibm3624_random_pin +IceServer,ice_server +IceServerList,ice_server_list +IcebergInput,iceberg_input +IcebergTarget,iceberg_target +IcebergTargets,iceberg_targets +IcmpTypeCode,icmp_type_code +Icon,icon +IconDisplayOption,icon_display_option +IconOptions,icon_options +IconReference,icon_reference +IconS3Location,icon_s3_location +IconSet,icon_set +IconSetType,icon_set_type +IconURL,icon_url +IconUrl,icon_url +Id,id +Id3,id3 +Id3Insertion,id3_insertion +Id3Insertions,id3_insertions +IdAttributeName,id_attribute_name +IdFormat,id_format +IdToken,id_token +IdTokenValidity,id_token_validity +Ide,ide +IdeConfiguration,ide_configuration +IdempotencyException,idempotency_exception +IdempotencyParameterMismatchException,idempotency_parameter_mismatch_exception +IdempotencyToken,idempotency_token +IdempotentParameterMismatch,idempotent_parameter_mismatch +IdempotentParameterMismatchException,idempotent_parameter_mismatch_exception +IdentificationExpirationDate,identification_expiration_date +IdentificationHints,identification_hints +IdentificationIssuingOrg,identification_issuing_org +IdentificationNumber,identification_number +IdentifiedLanguageScore,identified_language_score +IdentifiedUserName,identified_user_name +Identifier,identifier +IdentifierPath,identifier_path +IdentifierType,identifier_type +Identifiers,identifiers +IdentifyLanguage,identify_language +IdentifyMultipleLanguages,identify_multiple_languages +Identities,identities +Identity,identity +IdentityAttributeName,identity_attribute_name +IdentityAttributeOrder,identity_attribute_order +IdentityAttributeValues,identity_attribute_values +IdentityDescription,identity_description +IdentityDkimAttributes,identity_dkim_attributes +IdentityDocument,identity_document +IdentityDocumentField,identity_document_field +IdentityDocumentFields,identity_document_fields +IdentityDocuments,identity_documents +IdentityId,identity_id +IdentityIdsToDelete,identity_ids_to_delete +IdentityInfo,identity_info +IdentityMailFromDomainAttributes,identity_mail_from_domain_attributes +IdentityManagementType,identity_management_type +IdentityName,identity_name +IdentityNotificationAttributes,identity_notification_attributes +IdentityPool,identity_pool +IdentityPoolConfigs,identity_pool_configs +IdentityPoolId,identity_pool_id +IdentityPoolName,identity_pool_name +IdentityPoolShortDescription,identity_pool_short_description +IdentityPoolTags,identity_pool_tags +IdentityPoolUsage,identity_pool_usage +IdentityPoolUsages,identity_pool_usages +IdentityPools,identity_pools +IdentityProvider,identity_provider +IdentityProviderConfig,identity_provider_config +IdentityProviderConfigResponse,identity_provider_config_response +IdentityProviderConfiguration,identity_provider_configuration +IdentityProviderDetails,identity_provider_details +IdentityProviderName,identity_provider_name +IdentityProviderOAuthSetting,identity_provider_o_auth_setting +IdentityProviderOAuthSettings,identity_provider_o_auth_settings +IdentityProviderSamlMetadata,identity_provider_saml_metadata +IdentityProviderSummaries,identity_provider_summaries +IdentityProviderSummary,identity_provider_summary +IdentityProviderType,identity_provider_type +IdentityResolutionJob,identity_resolution_job +IdentityResolutionJobsList,identity_resolution_jobs_list +IdentitySource,identity_source +IdentitySourceDetails,identity_source_details +IdentitySourceFilter,identity_source_filter +IdentitySourceItem,identity_source_item +IdentitySourceItemDetails,identity_source_item_details +IdentityStore,identity_store +IdentityStoreId,identity_store_id +IdentityType,identity_type +IdentityTypeNotSupportedException,identity_type_not_supported_exception +IdentityUsage,identity_usage +IdentityValidationExpression,identity_validation_expression +IdentityVerificationAttributes,identity_verification_attributes +Idle,idle +IdleClientTimeout,idle_client_timeout +IdleDisconnectTimeoutInSeconds,idle_disconnect_timeout_in_seconds +IdleSinceDateTime,idle_since_date_time +IdleTTL,idle_ttl +IdleTimeBetweenReadsInMs,idle_time_between_reads_in_ms +IdleTimeout,idle_timeout +IdleTimeoutSeconds,idle_timeout_seconds +IdnLangCode,idn_lang_code +Idp,idp +IdpAuthUrl,idp_auth_url +IdpIdentifier,idp_identifier +IdpIdentifiers,idp_identifiers +IdpLambdaArn,idp_lambda_arn +IdpRelayStateParameterName,idp_relay_state_parameter_name +Ids,ids +IfMatch,if_match +IfModifiedSince,if_modified_since +IfNoneMatch,if_none_match +IfUnmodifiedSince,if_unmodified_since +Igmpv2Support,igmpv2_support +IgnoreCoordinates,ignore_coordinates +IgnoreErrors,ignore_errors +IgnoreHeaderRows,ignore_header_rows +IgnoreMetricsTime,ignore_metrics_time +IgnorePollAlarmFailure,ignore_poll_alarm_failure +IgnorePublicAcls,ignore_public_acls +IgnoreUnsupportedType,ignore_unsupported_type +IkeVersions,ike_versions +IllegalActionException,illegal_action_exception +IllegalArgumentException,illegal_argument_exception +IllegalBlueprintStateException,illegal_blueprint_state_exception +IllegalDelete,illegal_delete +IllegalFieldLevelEncryptionConfigAssociationWithCacheBehavior,illegal_field_level_encryption_config_association_with_cache_behavior +IllegalOriginAccessConfiguration,illegal_origin_access_configuration +IllegalSessionStateException,illegal_session_state_exception +IllegalStatusException,illegal_status_exception +IllegalUpdate,illegal_update +IllegalUserStateException,illegal_user_state_exception +IllegalWorkflowStateException,illegal_workflow_state_exception +Image,image +ImageAggregation,image_aggregation +ImageAlreadyExistsException,image_already_exists_exception +ImageArn,image_arn +ImageAssets,image_assets +ImageAttribute,image_attribute +ImageBasedTrickPlay,image_based_trick_play +ImageBasedTrickPlaySettings,image_based_trick_play_settings +ImageBlockPublicAccessState,image_block_public_access_state +ImageBuilder,image_builder +ImageBuilderErrors,image_builder_errors +ImageBuilderName,image_builder_name +ImageBuilderStateChangeReason,image_builder_state_change_reason +ImageBuilderSupported,image_builder_supported +ImageBuilders,image_builders +ImageClassificationJobConfig,image_classification_job_config +ImageConfig,image_config +ImageConfigError,image_config_error +ImageConfigResponse,image_config_response +ImageConfiguration,image_configuration +ImageConfigurationInput,image_configuration_input +ImageContent,image_content +ImageData,image_data +ImageDescription,image_description +ImageDetail,image_detail +ImageDigest,image_digest +ImageDigestDoesNotMatchException,image_digest_does_not_match_exception +ImageDiskContainer,image_disk_container +ImageErrors,image_errors +ImageFailure,image_failure +ImageFile,image_file +ImageFrameInformation,image_frame_information +ImageGenerationConfiguration,image_generation_configuration +ImageGenerationDestinationConfig,image_generation_destination_config +ImageIconUrl,image_icon_url +ImageId,image_id +ImageIdentifier,image_identifier +ImageIds,image_ids +ImageInserter,image_inserter +ImageInserterInput,image_inserter_input +ImageLayerAggregation,image_layer_aggregation +ImageLayerAggregationResponse,image_layer_aggregation_response +ImageLocation,image_location +ImageMask,image_mask +ImageName,image_name +ImageNotFoundException,image_not_found_exception +ImageOwnerAlias,image_owner_alias +ImagePackage,image_package +ImagePermission,image_permission +ImagePermissions,image_permissions +ImagePipeline,image_pipeline +ImagePipelineAggregation,image_pipeline_aggregation +ImagePrefix,image_prefix +ImageProperties,image_properties +ImagePublishedAt,image_published_at +ImagePullCredentialsType,image_pull_credentials_type +ImageQuality,image_quality +ImageRecipe,image_recipe +ImageRecipeSummary,image_recipe_summary +ImageRecycleBinInfo,image_recycle_bin_info +ImageReplicationStatus,image_replication_status +ImageRepository,image_repository +ImageRepositoryType,image_repository_type +ImageResponseCard,image_response_card +ImageScaling,image_scaling +ImageScanFinding,image_scan_finding +ImageScanFindingAggregation,image_scan_finding_aggregation +ImageScanFindings,image_scan_findings +ImageScanFindingsFilter,image_scan_findings_filter +ImageScanFindingsSummary,image_scan_findings_summary +ImageScanState,image_scan_state +ImageScanStatus,image_scan_status +ImageScanStatuses,image_scan_statuses +ImageScanningConfiguration,image_scanning_configuration +ImageSelectorType,image_selector_type +ImageSetProperties,image_set_properties +ImageSetWorkflowStatus,image_set_workflow_status +ImageSetsMetadataSummary,image_sets_metadata_summary +ImageSmallIconUrl,image_small_icon_url +ImageSource,image_source +ImageSourceBands,image_source_bands +ImageState,image_state +ImageStateChangeReason,image_state_change_reason +ImageStats,image_stats +ImageStatus,image_status +ImageSummary,image_summary +ImageTagAlreadyExistsException,image_tag_already_exists_exception +ImageTagDetail,image_tag_detail +ImageTagMutability,image_tag_mutability +ImageTags,image_tags +ImageTestsConfiguration,image_tests_configuration +ImageTooLargeException,image_too_large_exception +ImageType,image_type +ImageUri,image_uri +ImageUrl,image_url +ImageVersion,image_version +ImageVersionArn,image_version_arn +ImageVersionNumber,image_version_number +ImageVersionStatus,image_version_status +ImageVersions,image_versions +ImageX,image_x +ImageY,image_y +Images,images +ImdsSupport,imds_support +ImmediateModeScheduleActionStartSettings,immediate_mode_schedule_action_start_settings +ImmunityTime,immunity_time +ImmunityTimeProperty,immunity_time_property +Impact,impact +ImpactEndTime,impact_end_time +ImpactLevel,impact_level +ImpactStartTime,impact_start_time +ImpactType,impact_type +ImpactedLocation,impacted_location +ImpactedLocations,impacted_locations +ImpairedSince,impaired_since +ImpersonationMatchedRule,impersonation_matched_rule +ImpersonationRole,impersonation_role +ImpersonationRoleId,impersonation_role_id +ImpersonationRoleIds,impersonation_role_ids +ImpersonationRule,impersonation_rule +ImpersonationRuleId,impersonation_rule_id +ImplicitDeny,implicit_deny +ImportApiKeysRequest,import_api_keys_request +ImportApiRequest,import_api_request +ImportApiResponse,import_api_response +ImportAppCatalogRequest,import_app_catalog_request +ImportApplicationUsageRequest,import_application_usage_request +ImportApplicationUsageResult,import_application_usage_result +ImportArn,import_arn +ImportAsProvisionedProductInput,import_as_provisioned_product_input +ImportAsProvisionedProductOutput,import_as_provisioned_product_output +ImportAssetFromApiGatewayApi,import_asset_from_api_gateway_api +ImportAssetFromApiGatewayApiRequestDetails,import_asset_from_api_gateway_api_request_details +ImportAssetFromApiGatewayApiResponseDetails,import_asset_from_api_gateway_api_response_details +ImportAssetFromSignedUrl,import_asset_from_signed_url +ImportAssetFromSignedUrlJobErrorDetails,import_asset_from_signed_url_job_error_details +ImportAssetFromSignedUrlRequestDetails,import_asset_from_signed_url_request_details +ImportAssetFromSignedUrlResponseDetails,import_asset_from_signed_url_response_details +ImportAssetsFromLakeFormationTagPolicy,import_assets_from_lake_formation_tag_policy +ImportAssetsFromLakeFormationTagPolicyRequestDetails,import_assets_from_lake_formation_tag_policy_request_details +ImportAssetsFromLakeFormationTagPolicyResponseDetails,import_assets_from_lake_formation_tag_policy_response_details +ImportAssetsFromRedshiftDataShares,import_assets_from_redshift_data_shares +ImportAssetsFromRedshiftDataSharesRequestDetails,import_assets_from_redshift_data_shares_request_details +ImportAssetsFromRedshiftDataSharesResponseDetails,import_assets_from_redshift_data_shares_response_details +ImportAssetsFromS3,import_assets_from_s3 +ImportAssetsFromS3JobErrorDetails,import_assets_from_s3_job_error_details +ImportAssetsFromS3RequestDetails,import_assets_from_s3_request_details +ImportAssetsFromS3ResponseDetails,import_assets_from_s3_response_details +ImportBackendAuthRequest,import_backend_auth_request +ImportBackendAuthResponse,import_backend_auth_response +ImportBackendStorageRequest,import_backend_storage_request +ImportBackendStorageResponse,import_backend_storage_response +ImportCatalogToGlueRequest,import_catalog_to_glue_request +ImportCertificateAuthorityCertificateRequest,import_certificate_authority_certificate_request +ImportCertificateMessage,import_certificate_message +ImportCertificateRequest,import_certificate_request +ImportCertificateResponse,import_certificate_response +ImportClientBrandingRequest,import_client_branding_request +ImportClientBrandingResult,import_client_branding_result +ImportClientVpnClientCertificateRevocationListRequest,import_client_vpn_client_certificate_revocation_list_request +ImportClientVpnClientCertificateRevocationListResult,import_client_vpn_client_certificate_revocation_list_result +ImportCompleted,import_completed +ImportComponentRequest,import_component_request +ImportComponentResponse,import_component_response +ImportConflictException,import_conflict_exception +ImportCrlRequest,import_crl_request +ImportDataSource,import_data_source +ImportDataSourceConfig,import_data_source_config +ImportDatasetRequest,import_dataset_request +ImportDatasetResponse,import_dataset_response +ImportDecoderManifestRequest,import_decoder_manifest_request +ImportDecoderManifestResponse,import_decoder_manifest_response +ImportDefinition,import_definition +ImportDestination,import_destination +ImportDestinationType,import_destination_type +ImportDocumentationPartsRequest,import_documentation_parts_request +ImportErrorData,import_error_data +ImportFailureListItem,import_failure_list_item +ImportFileTaskInformation,import_file_task_information +ImportFilter,import_filter +ImportFindingsError,import_findings_error +ImportFirewallDomainsRequest,import_firewall_domains_request +ImportFirewallDomainsResponse,import_firewall_domains_response +ImportGameConfigurationRequest,import_game_configuration_request +ImportGameConfigurationResult,import_game_configuration_result +ImportGameConfigurationSource,import_game_configuration_source +ImportHostKeyRequest,import_host_key_request +ImportHostKeyResponse,import_host_key_response +ImportHubContentRequest,import_hub_content_request +ImportHubContentResponse,import_hub_content_response +ImportHypervisorConfigurationInput,import_hypervisor_configuration_input +ImportHypervisorConfigurationOutput,import_hypervisor_configuration_output +ImportId,import_id +ImportImageLicenseConfigurationRequest,import_image_license_configuration_request +ImportImageLicenseConfigurationResponse,import_image_license_configuration_response +ImportImageRequest,import_image_request +ImportImageResult,import_image_result +ImportImageTask,import_image_task +ImportImageTasks,import_image_tasks +ImportInfo,import_info +ImportInstance,import_instance +ImportInstanceLaunchSpecification,import_instance_launch_specification +ImportInstanceRequest,import_instance_request +ImportInstanceResult,import_instance_result +ImportInstanceTaskDetails,import_instance_task_details +ImportInstanceVolumeDetailItem,import_instance_volume_detail_item +ImportJobEndTime,import_job_end_time +ImportJobProperties,import_job_properties +ImportJobPropertiesList,import_job_properties_list +ImportJobRequest,import_job_request +ImportJobResource,import_job_resource +ImportJobResponse,import_job_response +ImportJobStartTime,import_job_start_time +ImportJobSubmitter,import_job_submitter +ImportJobSummary,import_job_summary +ImportJobs,import_jobs +ImportJobsResponse,import_jobs_response +ImportKeyInput,import_key_input +ImportKeyMaterialRequest,import_key_material_request +ImportKeyOutput,import_key_output +ImportKeyPairRequest,import_key_pair_request +ImportKeyPairResult,import_key_pair_result +ImportLabelsTaskRunProperties,import_labels_task_run_properties +ImportLensInput,import_lens_input +ImportLensOutput,import_lens_output +ImportManifestUrl,import_manifest_url +ImportMigrationTaskRequest,import_migration_task_request +ImportMode,import_mode +ImportModelRequest,import_model_request +ImportModelResponse,import_model_response +ImportModelVersionRequest,import_model_version_request +ImportModelVersionResponse,import_model_version_response +ImportNotFoundException,import_not_found_exception +ImportNotebookInput,import_notebook_input +ImportNotebookOutput,import_notebook_output +ImportOptions,import_options +ImportPath,import_path +ImportPlaybackKeyPairRequest,import_playback_key_pair_request +ImportPlaybackKeyPairResponse,import_playback_key_pair_response +ImportReadSetFilter,import_read_set_filter +ImportReadSetJobItem,import_read_set_job_item +ImportReadSetSourceItem,import_read_set_source_item +ImportReferenceFilter,import_reference_filter +ImportReferenceJobItem,import_reference_job_item +ImportReferenceSourceItem,import_reference_source_item +ImportResourceSpecification,import_resource_specification +ImportResourcesToDraftAppVersionRequest,import_resources_to_draft_app_version_request +ImportResourcesToDraftAppVersionResponse,import_resources_to_draft_app_version_response +ImportRestApiRequest,import_rest_api_request +ImportSignalCatalogRequest,import_signal_catalog_request +ImportSignalCatalogResponse,import_signal_catalog_response +ImportSnapshotRequest,import_snapshot_request +ImportSnapshotResult,import_snapshot_result +ImportSnapshotTask,import_snapshot_task +ImportSnapshotTasks,import_snapshot_tasks +ImportSortBy,import_sort_by +ImportSource,import_source +ImportSourceCredentialsInput,import_source_credentials_input +ImportSourceCredentialsOutput,import_source_credentials_output +ImportSshPublicKeyRequest,import_ssh_public_key_request +ImportSshPublicKeyResponse,import_ssh_public_key_response +ImportStacksToStackSetInput,import_stacks_to_stack_set_input +ImportStacksToStackSetOutput,import_stacks_to_stack_set_output +ImportStatistics,import_statistics +ImportStatus,import_status +ImportSummary,import_summary +ImportSummaryList,import_summary_list +ImportTableDescription,import_table_description +ImportTableInput,import_table_input +ImportTableOutput,import_table_output +ImportTablesCompleted,import_tables_completed +ImportTablesInProgress,import_tables_in_progress +ImportTablesNotStarted,import_tables_not_started +ImportTask,import_task +ImportTaskError,import_task_error +ImportTaskFilter,import_task_filter +ImportTaskId,import_task_id +ImportTaskIds,import_task_ids +ImportTaskSummary,import_task_summary +ImportTaskSummaryApplications,import_task_summary_applications +ImportTaskSummaryServers,import_task_summary_servers +ImportTaskSummaryWaves,import_task_summary_waves +ImportTerminologyRequest,import_terminology_request +ImportTerminologyResponse,import_terminology_response +ImportTime,import_time +ImportToken,import_token +ImportTr31KeyBlock,import_tr31_key_block +ImportTr34KeyBlock,import_tr34_key_block +ImportVmImageRequest,import_vm_image_request +ImportVmImageResponse,import_vm_image_response +ImportVolume,import_volume +ImportVolumeRequest,import_volume_request +ImportVolumeResult,import_volume_result +ImportVolumeTaskDetails,import_volume_task_details +ImportWorkspaceImageRequest,import_workspace_image_request +ImportWorkspaceImageResult,import_workspace_image_result +Importance,importance +Imported,imported +ImportedAt,imported_at +ImportedBy,imported_by +ImportedDataSize,imported_data_size +ImportedDataSizeInBytes,imported_data_size_in_bytes +ImportedFileChunkSize,imported_file_chunk_size +ImportedItemCount,imported_item_count +ImportedRecordCount,imported_record_count +ImportedSidewalkDevice,imported_sidewalk_device +ImportedUsers,imported_users +ImportedWirelessDevice,imported_wireless_device +ImportedWirelessDeviceList,imported_wireless_device_list +Imports,imports +ImportsListItem,imports_list_item +ImprovementPlan,improvement_plan +ImprovementPlanUrl,improvement_plan_url +ImprovementPlans,improvement_plans +ImprovementStatus,improvement_status +ImprovementSummaries,improvement_summaries +ImprovementSummary,improvement_summary +ImputedPath,imputed_path +ImscDestinationSettings,imsc_destination_settings +InAppCampaignSchedule,in_app_campaign_schedule +InAppMessage,in_app_message +InAppMessageBodyConfig,in_app_message_body_config +InAppMessageButton,in_app_message_button +InAppMessageCampaign,in_app_message_campaign +InAppMessageCampaigns,in_app_message_campaigns +InAppMessageContent,in_app_message_content +InAppMessageHeaderConfig,in_app_message_header_config +InAppMessagesResponse,in_app_messages_response +InAppStreamNames,in_app_stream_names +InAppTemplate,in_app_template +InAppTemplateRequest,in_app_template_request +InAppTemplateResponse,in_app_template_response +InCluster,in_cluster +InProgress,in_progress +InProgressInvalidationBatches,in_progress_invalidation_batches +InProgressStackInstancesCount,in_progress_stack_instances_count +InProgressTableRestoreQuotaExceededFault,in_progress_table_restore_quota_exceeded_fault +InSyncStackInstancesCount,in_sync_stack_instances_count +InTransitEncryption,in_transit_encryption +InUse,in_use +InUseBy,in_use_by +InaccessibleEncryptionDateTime,inaccessible_encryption_date_time +InaccessibleKmsKeyDateTime,inaccessible_kms_key_date_time +InactiveDate,inactive_date +InactiveEventDataStoreException,inactive_event_data_store_exception +InactiveQueryException,inactive_query_exception +InboundCall,inbound_call +InboundCalling,inbound_calling +InboundCallsEnabled,inbound_calls_enabled +InboundConnection,inbound_connection +InboundConnectionStatus,inbound_connection_status +InboundCrossClusterSearchConnection,inbound_cross_cluster_search_connection +InboundCrossClusterSearchConnectionStatus,inbound_cross_cluster_search_connection_status +InboundHeader,inbound_header +InboundMMS,inbound_mms +InboundPermissionAuthorizations,inbound_permission_authorizations +InboundPermissionRevocations,inbound_permission_revocations +InboundPermissions,inbound_permissions +InboundSMS,inbound_sms +InboundShipment,inbound_shipment +InboxCount,inbox_count +InboxPercentage,inbox_percentage +InboxPlacementTrackingOption,inbox_placement_tracking_option +InboxRawCount,inbox_raw_count +IncidentId,incident_id +IncidentRecord,incident_record +IncidentRecordSource,incident_record_source +IncidentRecordSummary,incident_record_summary +IncidentTemplate,incident_template +Include,include +IncludeAdditionalDetails,include_additional_details +IncludeAdditionalLanguageCodes,include_additional_language_codes +IncludeAll,include_all +IncludeAllDependencies,include_all_dependencies +IncludeAllInstances,include_all_instances +IncludeAllLinksToEachParent,include_all_links_to_each_parent +IncludeAllTagsOfInstance,include_all_tags_of_instance +IncludeAttachmentFilePatterns,include_attachment_file_patterns +IncludeBlueprint,include_blueprint +IncludeBody,include_body +IncludeChannelId,include_channel_id +IncludeChildPaths,include_child_paths +IncludeComplianceDetails,include_compliance_details +IncludeControlDetails,include_control_details +IncludeCookies,include_cookies +IncludeCredit,include_credit +IncludeCustomMetadata,include_custom_metadata +IncludeDeleted,include_deleted +IncludeDeletedGroups,include_deleted_groups +IncludeDeletedRecords,include_deleted_records +IncludeDeprecated,include_deprecated +IncludeDiscount,include_discount +IncludeDvbSubtitles,include_dvb_subtitles +IncludeEdges,include_edges +IncludeEncoderConfigurationInSegments,include_encoder_configuration_in_segments +IncludeExecutionData,include_execution_data +IncludeExtensions,include_extensions +IncludeFec,include_fec +IncludeFillerNalUnits,include_filler_nal_units +IncludeFilterTypes,include_filter_types +IncludeFilters,include_filters +IncludeFutureRegions,include_future_regions +IncludeGlobalServiceEvents,include_global_service_events +IncludeGraph,include_graph +IncludeHeaders,include_headers +IncludeHidden,include_hidden +IncludeIframeOnlyStream,include_iframe_only_stream +IncludeIframeOnlyStreams,include_iframe_only_streams +IncludeIndirectActivities,include_indirect_activities +IncludeInferenceResponseIn,include_inference_response_in +IncludeLegGeometry,include_leg_geometry +IncludeLinkedAccounts,include_linked_accounts +IncludeLinkedAccountsMetrics,include_linked_accounts_metrics +IncludeManagementEvents,include_management_events +IncludeMap,include_map +IncludeMarketplace,include_marketplace +IncludeMaximum,include_maximum +IncludeMetrics,include_metrics +IncludeMinimum,include_minimum +IncludeNestedStacks,include_nested_stacks +IncludeNotScaledActivities,include_not_scaled_activities +IncludeNullAndEmpty,include_null_and_empty +IncludeNullValue,include_null_value +IncludeOnly,include_only +IncludeOpForFullLoad,include_op_for_full_load +IncludeOtherSubscription,include_other_subscription +IncludeParameterSpec,include_parameter_spec +IncludePartitionValue,include_partition_value +IncludePlannedDeletion,include_planned_deletion +IncludeProvisioningArtifactParameters,include_provisioning_artifact_parameters +IncludePublic,include_public +IncludePublicKey,include_public_key +IncludeQueriesWithoutUserInformation,include_queries_without_user_information +IncludeQuerySpellCheckSuggestions,include_query_spell_check_suggestions +IncludeRecurring,include_recurring +IncludeRefund,include_refund +IncludeRelated,include_related +IncludeReturnPath,include_return_path +IncludeShared,include_shared +IncludeSharedResources,include_shared_resources +IncludeSpace,include_space +IncludeSpaces,include_spaces +IncludeStatus,include_status +IncludeSubdomains,include_subdomains +IncludeSubscription,include_subscription +IncludeSupport,include_support +IncludeSymmetricAlgorithms,include_symmetric_algorithms +IncludeTableAlterOperations,include_table_alter_operations +IncludeTax,include_tax +IncludeTransactionDetails,include_transaction_details +IncludeTrustContext,include_trust_context +IncludeUpfront,include_upfront +IncludedAllocatedStorage,included_allocated_storage +IncludedCookies,included_cookies +IncludedDeletedBackTo,included_deleted_back_to +IncludedHeaders,included_headers +IncludedObjectVersions,included_object_versions +IncludedPages,included_pages +IncludedPaths,included_paths +IncludedProperties,included_properties +IncludedProperty,included_property +IncludedStates,included_states +IncludedStatistics,included_statistics +Includes,includes +InclusionFileNamePatterns,inclusion_file_name_patterns +InclusionFileTypePatterns,inclusion_file_type_patterns +InclusionFilters,inclusion_filters +InclusionFolderNamePatterns,inclusion_folder_name_patterns +InclusionPatterns,inclusion_patterns +InclusionPrefixes,inclusion_prefixes +InclusionProtectionFilters,inclusion_protection_filters +InclusionProtectionGroupFilters,inclusion_protection_group_filters +Inclusive,inclusive +InclusiveStartBillingPeriod,inclusive_start_billing_period +InclusiveStartTime,inclusive_start_time +IncomingDukptAttributes,incoming_dukpt_attributes +IncomingEncryptionAttributes,incoming_encryption_attributes +IncomingKeyIdentifier,incoming_key_identifier +IncomingTranslationAttributes,incoming_translation_attributes +IncompatibilityMessage,incompatibility_message +IncompatibleImageException,incompatible_image_exception +IncompatibleOrderableOptions,incompatible_orderable_options +IncompatibleParameterError,incompatible_parameter_error +IncompatiblePolicyException,incompatible_policy_exception +IncompatibleProtocolsException,incompatible_protocols_exception +IncompatibleRegionForMultiAZ,incompatible_region_for_multi_az +IncompatibleSchemaException,incompatible_schema_exception +IncompatibleSettingsException,incompatible_settings_exception +IncompatibleVersion,incompatible_version +IncompatibleVersionException,incompatible_version_exception +IncompleteSegmentBehavior,incomplete_segment_behavior +InconsistentQuantities,inconsistent_quantities +IncorrectCidrStateException,incorrect_cidr_state_exception +IncorrectFileSystemLifeCycleState,incorrect_file_system_life_cycle_state +IncorrectKeyException,incorrect_key_exception +IncorrectKeyMaterialException,incorrect_key_material_exception +IncorrectMountTargetState,incorrect_mount_target_state +IncorrectTrustAnchorException,incorrect_trust_anchor_exception +IncreaseNodeGroupsInGlobalReplicationGroupMessage,increase_node_groups_in_global_replication_group_message +IncreaseNodeGroupsInGlobalReplicationGroupResult,increase_node_groups_in_global_replication_group_result +IncreaseReplicaCountMessage,increase_replica_count_message +IncreaseReplicaCountResult,increase_replica_count_result +IncreaseReplicationFactorRequest,increase_replication_factor_request +IncreaseReplicationFactorResponse,increase_replication_factor_response +IncreaseStreamRetentionPeriodInput,increase_stream_retention_period_input +IncreaseVolumeSize,increase_volume_size +IncrementalExportSpecification,incremental_export_specification +IncrementalPullConfig,incremental_pull_config +IncrementalRefresh,incremental_refresh +IncrementalRunConfig,incremental_run_config +Index,index +IndexArn,index_arn +IndexAttachment,index_attachment +IndexAttachments,index_attachments +IndexConfigurationSummary,index_configuration_summary +IndexConfigurationSummaryItems,index_configuration_summary_items +IndexDocument,index_document +IndexDocumentSuffix,index_document_suffix +IndexDocumentsRequest,index_documents_request +IndexDocumentsResponse,index_documents_response +IndexFacesModelVersion,index_faces_model_version +IndexFacesRequest,index_faces_request +IndexFacesResponse,index_faces_response +IndexField,index_field +IndexFieldName,index_field_name +IndexFieldStatus,index_field_status +IndexFieldType,index_field_type +IndexFields,index_fields +IndexId,index_id +IndexNSegments,index_n_segments +IndexName,index_name +IndexNotFoundException,index_not_found_exception +IndexNotReadyException,index_not_ready_exception +IndexReference,index_reference +IndexRotationPeriod,index_rotation_period +IndexSizeBytes,index_size_bytes +IndexSlowLogs,index_slow_logs +IndexStatistics,index_statistics +IndexStatus,index_status +IndexedAttributeMissingException,indexed_attribute_missing_exception +IndexedAttributes,indexed_attributes +IndexedQuestionAnswersCount,indexed_question_answers_count +IndexedTextBytes,indexed_text_bytes +IndexedTextDocumentsCount,indexed_text_documents_count +Indexes,indexes +IndexingFilter,indexing_filter +IndividualAssessmentCompletedCount,individual_assessment_completed_count +IndividualAssessmentCount,individual_assessment_count +IndividualAssessmentName,individual_assessment_name +IndividualAssessmentNames,individual_assessment_names +Industry,industry +IndustryType,industry_type +InferICD10CMRequest,infer_icd10_cm_request +InferICD10CMResponse,infer_icd10_cm_response +InferRxNormRequest,infer_rx_norm_request +InferRxNormResponse,infer_rx_norm_response +InferSNOMEDCTRequest,infer_snomedct_request +InferSNOMEDCTResponse,infer_snomedct_response +InferenceAccelerator,inference_accelerator +InferenceAcceleratorInfo,inference_accelerator_info +InferenceAcceleratorOverride,inference_accelerator_override +InferenceAcceleratorOverrides,inference_accelerator_overrides +InferenceAccelerators,inference_accelerators +InferenceAttribute,inference_attribute +InferenceBenchmark,inference_benchmark +InferenceConfig,inference_config +InferenceContainerDefinitions,inference_container_definitions +InferenceContainers,inference_containers +InferenceDataImportStrategy,inference_data_import_strategy +InferenceDeviceInfo,inference_device_info +InferenceDeviceMemoryInfo,inference_device_memory_info +InferenceEventSummaries,inference_event_summaries +InferenceEventSummary,inference_event_summary +InferenceExecutionConfig,inference_execution_config +InferenceExecutionSummaries,inference_execution_summaries +InferenceExecutionSummary,inference_execution_summary +InferenceExperimentArn,inference_experiment_arn +InferenceExperimentDataStorageConfig,inference_experiment_data_storage_config +InferenceExperimentSchedule,inference_experiment_schedule +InferenceExperimentSummary,inference_experiment_summary +InferenceExperiments,inference_experiments +InferenceId,inference_id +InferenceImage,inference_image +InferenceInputConfiguration,inference_input_configuration +InferenceInputNameConfiguration,inference_input_name_configuration +InferenceMetrics,inference_metrics +InferenceOutputConfiguration,inference_output_configuration +InferenceRecommendation,inference_recommendation +InferenceRecommendations,inference_recommendations +InferenceRecommendationsJob,inference_recommendations_job +InferenceRecommendationsJobName,inference_recommendations_job_name +InferenceRecommendationsJobStep,inference_recommendations_job_step +InferenceRecommendationsJobs,inference_recommendations_jobs +InferenceS3InputConfiguration,inference_s3_input_configuration +InferenceS3OutputConfiguration,inference_s3_output_configuration +InferenceSchedulerArn,inference_scheduler_arn +InferenceSchedulerName,inference_scheduler_name +InferenceSchedulerNameBeginsWith,inference_scheduler_name_begins_with +InferenceSchedulerSummaries,inference_scheduler_summaries +InferenceSchedulerSummary,inference_scheduler_summary +InferenceSpecification,inference_specification +InferenceSpecificationName,inference_specification_name +Inferred,inferred +InferredWorkloadSaving,inferred_workload_saving +Info,info +InfoIconLabelOptions,info_icon_label_options +InfoIconText,info_icon_text +InfoType,info_type +InforNexus,infor_nexus +InforNexusConnectorProfileCredentials,infor_nexus_connector_profile_credentials +InforNexusConnectorProfileProperties,infor_nexus_connector_profile_properties +InforNexusSourceProperties,infor_nexus_source_properties +InformationalCount,informational_count +InfrastructureClass,infrastructure_class +InfrastructureConfig,infrastructure_config +InfrastructureConfiguration,infrastructure_configuration +InfrastructureConfigurationSummary,infrastructure_configuration_summary +InfrastructureType,infrastructure_type +IngestConfiguration,ingest_configuration +IngestEndpoint,ingest_endpoint +IngestEndpointId,ingest_endpoint_id +IngestEndpointUrls,ingest_endpoint_urls +IngestEndpoints,ingest_endpoints +IngestIp,ingest_ip +IngestPort,ingest_port +IngestedDataSize,ingested_data_size +IngestedEventStatistics,ingested_event_statistics +IngestedEventsDetail,ingested_events_detail +IngestedEventsTimeWindow,ingested_events_time_window +IngestedFilesSummary,ingested_files_summary +IngestedNumberOfFiles,ingested_number_of_files +Ingestion,ingestion +IngestionArn,ingestion_arn +IngestionDestination,ingestion_destination +IngestionDestinationSummary,ingestion_destination_summary +IngestionId,ingestion_id +IngestionInputConfiguration,ingestion_input_configuration +IngestionJobId,ingestion_job_id +IngestionProcess,ingestion_process +IngestionS3InputConfiguration,ingestion_s3_input_configuration +IngestionSizeInBytes,ingestion_size_in_bytes +IngestionStatus,ingestion_status +IngestionSummary,ingestion_summary +IngestionTimeInSeconds,ingestion_time_in_seconds +IngestionType,ingestion_type +Ingestions,ingestions +Ingress,ingress +IngressAccessLogs,ingress_access_logs +IngressBytes,ingress_bytes +IngressConfiguration,ingress_configuration +IngressFilterRules,ingress_filter_rules +IngressGatewayBridge,ingress_gateway_bridge +IngressPackets,ingress_packets +IngressPortMappings,ingress_port_mappings +IngressRouteTable,ingress_route_table +IngressVpcConfiguration,ingress_vpc_configuration +InheritedValue,inherited_value +InitProcessEnabled,init_process_enabled +InitQuery,init_query +InitialActiveLearningModelArn,initial_active_learning_model_arn +InitialAudioGain,initial_audio_gain +InitialCapacityConfig,initial_capacity_config +InitialClusterSize,initial_cluster_size +InitialConfigurationToken,initial_configuration_token +InitialContactId,initial_contact_id +InitialDashboardId,initial_dashboard_id +InitialDashboardVisualId,initial_dashboard_visual_id +InitialFileLocation,initial_file_location +InitialInstanceCount,initial_instance_count +InitialMessage,initial_message +InitialNumberOfUsers,initial_number_of_users +InitialPath,initial_path +InitialPosition,initial_position +InitialResponseSetting,initial_response_setting +InitialSamplingPercentage,initial_sampling_percentage +InitialTopicId,initial_topic_id +InitialVariantWeight,initial_variant_weight +InitialVersion,initial_version +InitializationConfiguration,initialization_configuration +InitializationVector,initialization_vector +InitializationVectorInManifest,initialization_vector_in_manifest +InitializeClusterRequest,initialize_cluster_request +InitializeClusterResponse,initialize_cluster_response +InitializedImportedDeviceCount,initialized_imported_device_count +Initials,initials +InitiateAuthRequest,initiate_auth_request +InitiateAuthResponse,initiate_auth_response +InitiateDeletionTimestamp,initiate_deletion_timestamp +InitiateDeviceClaimRequest,initiate_device_claim_request +InitiateDeviceClaimResponse,initiate_device_claim_response +InitiateDocumentVersionUploadRequest,initiate_document_version_upload_request +InitiateDocumentVersionUploadResponse,initiate_document_version_upload_response +InitiateJobInput,initiate_job_input +InitiateJobOutput,initiate_job_output +InitiateLayerUploadRequest,initiate_layer_upload_request +InitiateLayerUploadResponse,initiate_layer_upload_response +InitiateMultipartUploadInput,initiate_multipart_upload_input +InitiateMultipartUploadOutput,initiate_multipart_upload_output +InitiateVaultLockInput,initiate_vault_lock_input +InitiateVaultLockOutput,initiate_vault_lock_output +Initiated,initiated +InitiatedBy,initiated_by +InitiationMethod,initiation_method +InitiationTimestamp,initiation_timestamp +Initiator,initiator +InitiatorName,initiator_name +Initiators,initiators +InlineArchiveRule,inline_archive_rule +InlineChunk,inline_chunk +InlineChunkChecksum,inline_chunk_checksum +InlineChunkChecksumAlgorithm,inline_chunk_checksum_algorithm +InlineChunkLength,inline_chunk_length +InlineConfigurations,inline_configurations +InlineCustomDocumentEnrichmentConfiguration,inline_custom_document_enrichment_configuration +InlineDataSchema,inline_data_schema +InlinePolicy,inline_policy +InnerHorizontal,inner_horizontal +InnerVertical,inner_vertical +Input,input +InputArtifact,input_artifact +InputArtifacts,input_artifacts +InputArtifactsToRemove,input_artifacts_to_remove +InputAttachment,input_attachment +InputAttachmentName,input_attachment_name +InputAttachmentNameReference,input_attachment_name_reference +InputAttachments,input_attachments +InputAttributes,input_attributes +InputBucket,input_bucket +InputBytes,input_bytes +InputCaptions,input_captions +InputChannel,input_channel +InputChannelLevel,input_channel_level +InputChannelLevels,input_channel_levels +InputChannels,input_channels +InputChannelsFineTune,input_channels_fine_tune +InputClass,input_class +InputClipping,input_clipping +InputClippingSettings,input_clipping_settings +InputClippings,input_clippings +InputColumn,input_column +InputColumns,input_columns +InputCompressionType,input_compression_type +InputConfig,input_config +InputConfigInput,input_config_input +InputConfigOutput,input_config_output +InputConfiguration,input_configuration +InputConfigurationRequest,input_configuration_request +InputConfigurations,input_configurations +InputContent,input_content +InputContext,input_context +InputDataConfig,input_data_config +InputDataLocationS3,input_data_location_s3 +InputDecryptionSettings,input_decryption_settings +InputDefinition,input_definition +InputDescription,input_description +InputDescriptions,input_descriptions +InputDestination,input_destination +InputDestinationRequest,input_destination_request +InputDestinationVpc,input_destination_vpc +InputDeviceConfigurableSettings,input_device_configurable_settings +InputDeviceHdSettings,input_device_hd_settings +InputDeviceId,input_device_id +InputDeviceMediaConnectConfigurableSettings,input_device_media_connect_configurable_settings +InputDeviceMediaConnectSettings,input_device_media_connect_settings +InputDeviceNetworkSettings,input_device_network_settings +InputDeviceRequest,input_device_request +InputDeviceSettings,input_device_settings +InputDeviceSummary,input_device_summary +InputDeviceTransfers,input_device_transfers +InputDeviceUhdSettings,input_device_uhd_settings +InputDevices,input_devices +InputDocumentsCount,input_documents_count +InputEndAction,input_end_action +InputFileConfig,input_file_config +InputFileLocation,input_file_location +InputFileUri,input_file_uri +InputFilter,input_filter +InputFormat,input_format +InputFormatConfiguration,input_format_configuration +InputFormatOptions,input_format_options +InputId,input_id +InputIdentifier,input_identifier +InputIds,input_ids +InputIp,input_ip +InputKey,input_key +InputLambdaProcessor,input_lambda_processor +InputLambdaProcessorDescription,input_lambda_processor_description +InputLambdaProcessorUpdate,input_lambda_processor_update +InputLocation,input_location +InputLogEvent,input_log_event +InputLossAction,input_loss_action +InputLossBehavior,input_loss_behavior +InputLossFailoverSettings,input_loss_failover_settings +InputLossImageColor,input_loss_image_color +InputLossImageSlate,input_loss_image_slate +InputLossImageType,input_loss_image_type +InputLossSettings,input_loss_settings +InputLossThresholdMsec,input_loss_threshold_msec +InputMode,input_mode +InputName,input_name +InputOrigin,input_origin +InputParallelism,input_parallelism +InputParallelismUpdate,input_parallelism_update +InputParameters,input_parameters +InputPartnerIds,input_partner_ids +InputPath,input_path +InputPathsMap,input_paths_map +InputPort,input_port +InputPreference,input_preference +InputPrepareScheduleActionSettings,input_prepare_schedule_action_settings +InputPrepareScheduleActions,input_prepare_schedule_actions +InputPrepareSettings,input_prepare_settings +InputProcessingConfiguration,input_processing_configuration +InputProcessingConfigurationDescription,input_processing_configuration_description +InputProcessingConfigurationUpdate,input_processing_configuration_update +InputRecordTables,input_record_tables +InputRows,input_rows +InputS3Object,input_s3_object +InputS3Path,input_s3_path +InputScanType,input_scan_type +InputSchema,input_schema +InputSchemaUpdate,input_schema_update +InputSecurityGroup,input_security_group +InputSecurityGroupId,input_security_group_id +InputSecurityGroupIds,input_security_group_ids +InputSecurityGroups,input_security_groups +InputSerialization,input_serialization +InputSessionStateSpecification,input_session_state_specification +InputSettings,input_settings +InputSource,input_source +InputSourceRequest,input_source_request +InputSourceType,input_source_type +InputSpecification,input_specification +InputStartingPosition,input_starting_position +InputStartingPositionConfiguration,input_starting_position_configuration +InputStorageLocation,input_storage_location +InputSummary,input_summary +InputSwitchScheduleActionSettings,input_switch_schedule_action_settings +InputSwitchSettings,input_switch_settings +InputTemplate,input_template +InputTimeZoneOffset,input_time_zone_offset +InputTimecodeSource,input_timecode_source +InputTransformer,input_transformer +InputType,input_type +InputUpdate,input_update +InputUpdates,input_updates +InputVideoGenerator,input_video_generator +InputVpcRequest,input_vpc_request +InputWhitelistRule,input_whitelist_rule +InputWhitelistRuleCidr,input_whitelist_rule_cidr +Inputs,inputs +InsecureSsl,insecure_ssl +InsertHeaders,insert_headers +InsertableImage,insertable_image +InsertableImages,insertable_images +InsertionMode,insertion_mode +Inserts,inserts +InsideCidrBlocks,inside_cidr_blocks +Insight,insight +InsightArn,insight_arn +InsightArns,insight_arns +InsightConfiguration,insight_configuration +InsightData,insight_data +InsightEvent,insight_event +InsightEvents,insight_events +InsightFeedback,insight_feedback +InsightHealth,insight_health +InsightId,insight_id +InsightImpactGraphEdge,insight_impact_graph_edge +InsightImpactGraphService,insight_impact_graph_service +InsightNotEnabledException,insight_not_enabled_exception +InsightResultValue,insight_result_value +InsightResults,insight_results +InsightRule,insight_rule +InsightRuleContributor,insight_rule_contributor +InsightRuleContributorDatapoint,insight_rule_contributor_datapoint +InsightRuleMetricDatapoint,insight_rule_metric_datapoint +InsightRules,insight_rules +InsightSelector,insight_selector +InsightSelectors,insight_selectors +InsightSummaries,insight_summaries +InsightSummary,insight_summary +InsightTimeRange,insight_time_range +InsightType,insight_type +InsightVisual,insight_visual +Insights,insights +InsightsByAssessment,insights_by_assessment +InsightsConfiguration,insights_configuration +InsightsEnabled,insights_enabled +InsightsEvent,insights_event +InsightsTarget,insights_target +InspectionLevel,inspection_level +InspectorScoreDetails,inspector_score_details +InspectorServiceAttributes,inspector_service_attributes +InstallOverrideList,install_override_list +InstallToRemoteAccessSessionRequest,install_to_remote_access_session_request +InstallToRemoteAccessSessionResult,install_to_remote_access_session_result +InstallUpdatesOnBoot,install_updates_on_boot +InstalledComponent,installed_component +InstalledCount,installed_count +InstalledOtherCount,installed_other_count +InstalledPendingReboot,installed_pending_reboot +InstalledPendingRebootCount,installed_pending_reboot_count +InstalledRejectedCount,installed_rejected_count +InstalledTime,installed_time +Instance,instance +InstanceAccess,instance_access +InstanceAccessControlAttributeConfiguration,instance_access_control_attribute_configuration +InstanceAccessDetails,instance_access_details +InstanceAccessUrl,instance_access_url +InstanceAggregatedAssociationOverview,instance_aggregated_association_overview +InstanceAlias,instance_alias +InstanceArn,instance_arn +InstanceAssociation,instance_association +InstanceAssociationOutputLocation,instance_association_output_location +InstanceAssociationOutputUrl,instance_association_output_url +InstanceAssociationStatusAggregatedCount,instance_association_status_aggregated_count +InstanceAssociationStatusInfo,instance_association_status_info +InstanceAssociationStatusInfos,instance_association_status_infos +InstanceAttribute,instance_attribute +InstanceBlockDeviceMapping,instance_block_device_mapping +InstanceBlockDeviceMappingSpecification,instance_block_device_mapping_specification +InstanceCapacity,instance_capacity +InstanceClass,instance_class +InstanceCollectionType,instance_collection_type +InstanceConfig,instance_config +InstanceConfigs,instance_configs +InstanceConfiguration,instance_configuration +InstanceConnectEndpoint,instance_connect_endpoint +InstanceConnectEndpointArn,instance_connect_endpoint_arn +InstanceConnectEndpointId,instance_connect_endpoint_id +InstanceConnectEndpointIds,instance_connect_endpoint_ids +InstanceConnectEndpoints,instance_connect_endpoints +InstanceCount,instance_count +InstanceCountLimits,instance_count_limits +InstanceCounts,instance_counts +InstanceCreateTime,instance_create_time +InstanceCredentials,instance_credentials +InstanceCreditSpecification,instance_credit_specification +InstanceCreditSpecificationRequest,instance_credit_specification_request +InstanceCreditSpecifications,instance_credit_specifications +InstanceDefinition,instance_definition +InstanceDefinitions,instance_definitions +InstanceDetails,instance_details +InstanceDoesNotExistException,instance_does_not_exist_exception +InstanceEntry,instance_entry +InstanceEventId,instance_event_id +InstanceEventWindow,instance_event_window +InstanceEventWindowAssociationRequest,instance_event_window_association_request +InstanceEventWindowAssociationTarget,instance_event_window_association_target +InstanceEventWindowDisassociationRequest,instance_event_window_disassociation_request +InstanceEventWindowId,instance_event_window_id +InstanceEventWindowIds,instance_event_window_ids +InstanceEventWindowState,instance_event_window_state +InstanceEventWindowStateChange,instance_event_window_state_change +InstanceEventWindowTimeRange,instance_event_window_time_range +InstanceEventWindowTimeRangeRequest,instance_event_window_time_range_request +InstanceEventWindows,instance_event_windows +InstanceExportDetails,instance_export_details +InstanceFamilies,instance_families +InstanceFamily,instance_family +InstanceFamilyCreditSpecification,instance_family_credit_specification +InstanceFamilyId,instance_family_id +InstanceFleet,instance_fleet +InstanceFleetConfig,instance_fleet_config +InstanceFleetId,instance_fleet_id +InstanceFleetModifyConfig,instance_fleet_modify_config +InstanceFleetProvisioningSpecifications,instance_fleet_provisioning_specifications +InstanceFleetResizingSpecifications,instance_fleet_resizing_specifications +InstanceFleetStateChangeReason,instance_fleet_state_change_reason +InstanceFleetStatus,instance_fleet_status +InstanceFleetTimeline,instance_fleet_timeline +InstanceFleetType,instance_fleet_type +InstanceFleets,instance_fleets +InstanceGenerations,instance_generations +InstanceGroup,instance_group +InstanceGroupConfig,instance_group_config +InstanceGroupDetail,instance_group_detail +InstanceGroupId,instance_group_id +InstanceGroupIds,instance_group_ids +InstanceGroupModifyConfig,instance_group_modify_config +InstanceGroupName,instance_group_name +InstanceGroupNames,instance_group_names +InstanceGroupStateChangeReason,instance_group_state_change_reason +InstanceGroupStatus,instance_group_status +InstanceGroupTimeline,instance_group_timeline +InstanceGroupType,instance_group_type +InstanceGroupTypes,instance_group_types +InstanceGroups,instance_groups +InstanceHardware,instance_hardware +InstanceHealth,instance_health +InstanceHealthCheckResult,instance_health_check_result +InstanceHealthList,instance_health_list +InstanceHealthSummary,instance_health_summary +InstanceID,instance_id +InstanceId,instance_id +InstanceIdDetail,instance_id_detail +InstanceIdFilter,instance_id_filter +InstanceIdRequiredException,instance_id_required_exception +InstanceIdSet,instance_id_set +InstanceIdentifier,instance_identifier +InstanceIdentity,instance_identity +InstanceIds,instance_ids +InstanceInfo,instance_info +InstanceInformation,instance_information +InstanceInformationFilter,instance_information_filter +InstanceInformationFilterList,instance_information_filter_list +InstanceInformationList,instance_information_list +InstanceInformationStringFilter,instance_information_string_filter +InstanceInitiatedShutdownBehavior,instance_initiated_shutdown_behavior +InstanceInterruptionBehavior,instance_interruption_behavior +InstanceIpv4Prefix,instance_ipv4_prefix +InstanceIpv6Address,instance_ipv6_address +InstanceIpv6AddressRequest,instance_ipv6_address_request +InstanceIpv6Prefix,instance_ipv6_prefix +InstanceLifecycle,instance_lifecycle +InstanceLimit,instance_limit +InstanceLimitExceededException,instance_limit_exceeded_exception +InstanceLimits,instance_limits +InstanceMaintenanceOptions,instance_maintenance_options +InstanceMaintenanceOptionsRequest,instance_maintenance_options_request +InstanceMarketOptions,instance_market_options +InstanceMarketOptionsRequest,instance_market_options_request +InstanceMatchCriteria,instance_match_criteria +InstanceMemory,instance_memory +InstanceMessages,instance_messages +InstanceMetadata,instance_metadata +InstanceMetadataOptions,instance_metadata_options +InstanceMetadataOptionsRequest,instance_metadata_options_request +InstanceMetadataOptionsResponse,instance_metadata_options_response +InstanceMetadataServiceConfiguration,instance_metadata_service_configuration +InstanceMetadataTags,instance_metadata_tags +InstanceMonitoring,instance_monitoring +InstanceMonitorings,instance_monitorings +InstanceName,instance_name +InstanceNameAlreadyRegisteredException,instance_name_already_registered_exception +InstanceNameRequiredException,instance_name_required_exception +InstanceNetworkInterface,instance_network_interface +InstanceNetworkInterfaceAssociation,instance_network_interface_association +InstanceNetworkInterfaceAttachment,instance_network_interface_attachment +InstanceNetworkInterfaceSpecification,instance_network_interface_specification +InstanceNetworking,instance_networking +InstanceNotFound,instance_not_found +InstanceNotRegisteredException,instance_not_registered_exception +InstanceOSUser,instance_os_user +InstanceOnboardingJobStatus,instance_onboarding_job_status +InstanceOwnerId,instance_owner_id +InstancePatchState,instance_patch_state +InstancePatchStateFilter,instance_patch_state_filter +InstancePatchStates,instance_patch_states +InstancePlatform,instance_platform +InstancePoolsToUseCount,instance_pools_to_use_count +InstancePort,instance_port +InstancePortInfo,instance_port_info +InstancePortState,instance_port_state +InstancePrivateIpAddress,instance_private_ip_address +InstanceProfile,instance_profile +InstanceProfileArn,instance_profile_arn +InstanceProfileCreationTime,instance_profile_creation_time +InstanceProfileId,instance_profile_id +InstanceProfileIdentifier,instance_profile_identifier +InstanceProfileList,instance_profile_list +InstanceProfileName,instance_profile_name +InstanceProfiles,instance_profiles +InstanceProperty,instance_property +InstanceProtocol,instance_protocol +InstanceQuotaExceededFault,instance_quota_exceeded_fault +InstanceRecommendation,instance_recommendation +InstanceRecommendationOption,instance_recommendation_option +InstanceRefresh,instance_refresh +InstanceRefreshId,instance_refresh_id +InstanceRefreshIds,instance_refresh_ids +InstanceRefreshInProgressFault,instance_refresh_in_progress_fault +InstanceRefreshLivePoolProgress,instance_refresh_live_pool_progress +InstanceRefreshProgressDetails,instance_refresh_progress_details +InstanceRefreshWarmPoolProgress,instance_refresh_warm_pool_progress +InstanceRefreshes,instance_refreshes +InstanceRequestCount,instance_request_count +InstanceRequirements,instance_requirements +InstanceRequirementsRequest,instance_requirements_request +InstanceRequirementsWithMetadata,instance_requirements_with_metadata +InstanceRequirementsWithMetadataRequest,instance_requirements_with_metadata_request +InstanceResizePolicy,instance_resize_policy +InstanceReusePolicy,instance_reuse_policy +InstanceRole,instance_role +InstanceRoleArn,instance_role_arn +InstanceRunningCount,instance_running_count +InstanceSize,instance_size +InstanceSizingType,instance_sizing_type +InstanceSnapshot,instance_snapshot +InstanceSnapshotInfo,instance_snapshot_info +InstanceSpecification,instance_specification +InstanceState,instance_state +InstanceStateChange,instance_state_change +InstanceStateChangeReason,instance_state_change_reason +InstanceStates,instance_states +InstanceStatus,instance_status +InstanceStatusDetails,instance_status_details +InstanceStatusEvent,instance_status_event +InstanceStatusReason,instance_status_reason +InstanceStatusSummary,instance_status_summary +InstanceStatuses,instance_statuses +InstanceStorageConfig,instance_storage_config +InstanceStorageInfo,instance_storage_info +InstanceStorageSupported,instance_storage_supported +InstanceSummaries,instance_summaries +InstanceSummary,instance_summary +InstanceSummaryList,instance_summary_list +InstanceTagAttribute,instance_tag_attribute +InstanceTagKeys,instance_tag_keys +InstanceTagNotificationAttribute,instance_tag_notification_attribute +InstanceTags,instance_tags +InstanceTarget,instance_target +InstanceTenancy,instance_tenancy +InstanceTerminationTimeout,instance_termination_timeout +InstanceTimeline,instance_timeline +InstanceType,instance_type +InstanceTypeConfig,instance_type_config +InstanceTypeConfigs,instance_type_configs +InstanceTypeDetails,instance_type_details +InstanceTypeInfo,instance_type_info +InstanceTypeInfoFromInstanceRequirements,instance_type_info_from_instance_requirements +InstanceTypeItem,instance_type_item +InstanceTypeOffering,instance_type_offering +InstanceTypeOfferings,instance_type_offerings +InstanceTypeSpecification,instance_type_specification +InstanceTypeSpecifications,instance_type_specifications +InstanceTypes,instance_types +InstanceUsage,instance_usage +InstanceUsages,instance_usages +InstanceUserSummaries,instance_user_summaries +InstanceUserSummary,instance_user_summary +InstanceVcpu,instance_vcpu +InstanceWarmup,instance_warmup +Instances,instances +InstancesCount,instances_count +InstancesDistribution,instances_distribution +InstancesHealth,instances_health +InstancesRevision,instances_revision +InstancesToProtect,instances_to_protect +InstancesToTerminate,instances_to_terminate +InstancesToUpdate,instances_to_update +InstancesToUpdateOnRollback,instances_to_update_on_rollback +InstancesWithCriticalNonCompliantPatches,instances_with_critical_non_compliant_patches +InstancesWithFailedPatches,instances_with_failed_patches +InstancesWithInstalledOtherPatches,instances_with_installed_other_patches +InstancesWithInstalledPatches,instances_with_installed_patches +InstancesWithInstalledPendingRebootPatches,instances_with_installed_pending_reboot_patches +InstancesWithInstalledRejectedPatches,instances_with_installed_rejected_patches +InstancesWithMissingPatches,instances_with_missing_patches +InstancesWithNotApplicablePatches,instances_with_not_applicable_patches +InstancesWithOtherNonCompliantPatches,instances_with_other_non_compliant_patches +InstancesWithSecurityNonCompliantPatches,instances_with_security_non_compliant_patches +InstancesWithUnreportedNotApplicablePatches,instances_with_unreported_not_applicable_patches +InstantBooking,instant_booking +InstantiateSolNetworkInstanceInput,instantiate_sol_network_instance_input +InstantiateSolNetworkInstanceOutput,instantiate_sol_network_instance_output +Instructions,instructions +InsufficientAvailableIPsInSubnetFault,insufficient_available_ips_in_subnet_fault +InsufficientCacheClusterCapacityFault,insufficient_cache_cluster_capacity_fault +InsufficientCapabilitiesException,insufficient_capabilities_exception +InsufficientCapacityException,insufficient_capacity_exception +InsufficientCloudWatchLogsResourcePolicy,insufficient_cloud_watch_logs_resource_policy +InsufficientClusterCapacityFault,insufficient_cluster_capacity_fault +InsufficientDBClusterCapacityFault,insufficient_db_cluster_capacity_fault +InsufficientDBInstanceCapacityFault,insufficient_db_instance_capacity_fault +InsufficientDataActions,insufficient_data_actions +InsufficientDataHealthStatus,insufficient_data_health_status +InsufficientDeliveryPolicyException,insufficient_delivery_policy_exception +InsufficientDependencyServiceAccessPermissionException,insufficient_dependency_service_access_permission_exception +InsufficientEncryptionPolicyException,insufficient_encryption_policy_exception +InsufficientPermissionsException,insufficient_permissions_exception +InsufficientPrivilegesException,insufficient_privileges_exception +InsufficientResourceCapacityFault,insufficient_resource_capacity_fault +InsufficientS3BucketPolicyException,insufficient_s3_bucket_policy_exception +InsufficientS3BucketPolicyFault,insufficient_s3_bucket_policy_fault +InsufficientSensorData,insufficient_sensor_data +InsufficientSnsTopicPolicyException,insufficient_sns_topic_policy_exception +InsufficientStorageClusterCapacityFault,insufficient_storage_cluster_capacity_fault +InsufficientThroughputCapacity,insufficient_throughput_capacity +IntArrayOptions,int_array_options +IntOptions,int_options +IntValueMax,int_value_max +IntValueMin,int_value_min +IntegerDatasetParameter,integer_dataset_parameter +IntegerDatasetParameterDefaultValues,integer_dataset_parameter_default_values +IntegerDefaultValues,integer_default_values +IntegerHyperParameterRange,integer_hyper_parameter_range +IntegerParameter,integer_parameter +IntegerParameterDeclaration,integer_parameter_declaration +IntegerParameterRange,integer_parameter_range +IntegerParameterRangeSpecification,integer_parameter_range_specification +IntegerParameterRanges,integer_parameter_ranges +IntegerParameters,integer_parameters +IntegerRange,integer_range +IntegerStaticValues,integer_static_values +IntegerValue,integer_value +IntegerValueWhenUnsetConfiguration,integer_value_when_unset_configuration +IntegerValues,integer_values +IntegrateServices,integrate_services +Integration,integration +IntegrationArn,integration_arn +IntegrationAssociationArn,integration_association_arn +IntegrationAssociationId,integration_association_id +IntegrationAssociationSummary,integration_association_summary +IntegrationAssociationSummaryList,integration_association_summary_list +IntegrationConfig,integration_config +IntegrationId,integration_id +IntegrationMethod,integration_method +IntegrationResponse,integration_response +IntegrationResponseId,integration_response_id +IntegrationResponseKey,integration_response_key +IntegrationResponseSelectionExpression,integration_response_selection_expression +IntegrationResultS3DestinationArn,integration_result_s3_destination_arn +IntegrationSubtype,integration_subtype +IntegrationType,integration_type +IntegrationTypes,integration_types +IntegrationUri,integration_uri +Integrations,integrations +IntelligentTieringAndOperator,intelligent_tiering_and_operator +IntelligentTieringConfiguration,intelligent_tiering_configuration +IntelligentTieringConfigurationList,intelligent_tiering_configuration_list +IntelligentTieringFilter,intelligent_tiering_filter +IntendedUse,intended_use +Intent,intent +IntentClassificationTestResultItem,intent_classification_test_result_item +IntentClassificationTestResultItemCounts,intent_classification_test_result_item_counts +IntentClassificationTestResults,intent_classification_test_results +IntentClosingSetting,intent_closing_setting +IntentConfidence,intent_confidence +IntentConfirmationSetting,intent_confirmation_setting +IntentFilter,intent_filter +IntentLevelSlotResolutionTestResultItem,intent_level_slot_resolution_test_result_item +IntentLevelSlotResolutionTestResults,intent_level_slot_resolution_test_results +IntentMetadata,intent_metadata +IntentOverride,intent_override +IntentResultEvent,intent_result_event +IntentSortBy,intent_sort_by +IntentStatistics,intent_statistics +IntentSummary,intent_summary +InterMetricImpactDetails,inter_metric_impact_details +InterMetricImpactList,inter_metric_impact_list +Interactive,interactive +InteractiveLayoutConfiguration,interactive_layout_configuration +Intercluster,intercluster +Interconnect,interconnect +Interconnects,interconnects +Interface,interface +InterfaceAssociation,interface_association +InterfaceAssociations,interface_associations +InterfacePermission,interface_permission +InterfaceProtocol,interface_protocol +InterfaceRequest,interface_request +InterfaceType,interface_type +InterlaceMode,interlace_mode +Interlaced,interlaced +InternalDependencyException,internal_dependency_exception +InternalError,internal_error +InternalErrorException,internal_error_exception +InternalException,internal_exception +InternalFailure,internal_failure +InternalFailureException,internal_failure_exception +InternalServerError,internal_server_error +InternalServerErrorException,internal_server_error_exception +InternalServerException,internal_server_exception +InternalServiceError,internal_service_error +InternalServiceErrorException,internal_service_error_exception +InternalServiceException,internal_service_exception +InternalServiceFault,internal_service_fault +InternalStreamFailure,internal_stream_failure +InternalUserDatabaseEnabled,internal_user_database_enabled +InternetGateway,internet_gateway +InternetGatewayAttachment,internet_gateway_attachment +InternetGatewayId,internet_gateway_id +InternetGatewayIds,internet_gateway_ids +InternetGatewayRoutes,internet_gateway_routes +InternetGateways,internet_gateways +InternetHealth,internet_health +InternetKeyExchangeVersion,internet_key_exchange_version +InternetMeasurementsLogDelivery,internet_measurements_log_delivery +InteroperabilityEnabled,interoperability_enabled +Interpolated,interpolated +InterpolatedAssetPropertyValue,interpolated_asset_property_value +InterpolationParameters,interpolation_parameters +InterpolationValue,interpolation_value +Interpretation,interpretation +InterruptionFilter,interruption_filter +Interval,interval +IntervalCadence,interval_cadence +IntervalEndTime,interval_end_time +IntervalInSeconds,interval_in_seconds +IntervalStartTime,interval_start_time +IntervalUnit,interval_unit +IntraDcPrecision,intra_dc_precision +InvalidACLStateFault,invalid_acl_state_fault +InvalidARNFault,invalid_arn_fault +InvalidAccessException,invalid_access_exception +InvalidAccountStatusException,invalid_account_status_exception +InvalidActionDeclarationException,invalid_action_declaration_exception +InvalidActivation,invalid_activation +InvalidActivationId,invalid_activation_id +InvalidActorArnException,invalid_actor_arn_exception +InvalidAddressException,invalid_address_exception +InvalidAggregationException,invalid_aggregation_exception +InvalidAggregatorException,invalid_aggregator_exception +InvalidAlarmConfigException,invalid_alarm_config_exception +InvalidAliasNameException,invalid_alias_name_exception +InvalidAllowedPatternException,invalid_allowed_pattern_exception +InvalidApplicationConfigurationException,invalid_application_configuration_exception +InvalidApplicationNameException,invalid_application_name_exception +InvalidApprovalRuleContentException,invalid_approval_rule_content_exception +InvalidApprovalRuleNameException,invalid_approval_rule_name_exception +InvalidApprovalRuleTemplateContentException,invalid_approval_rule_template_content_exception +InvalidApprovalRuleTemplateDescriptionException,invalid_approval_rule_template_description_exception +InvalidApprovalRuleTemplateNameException,invalid_approval_rule_template_name_exception +InvalidApprovalStateException,invalid_approval_state_exception +InvalidApprovalTokenException,invalid_approval_token_exception +InvalidArgsException,invalid_args_exception +InvalidArgument,invalid_argument +InvalidArgumentException,invalid_argument_exception +InvalidArn,invalid_arn +InvalidArnException,invalid_arn_exception +InvalidAssociation,invalid_association +InvalidAssociationVersion,invalid_association_version +InvalidAttachmentException,invalid_attachment_exception +InvalidAuthenticationCodeException,invalid_authentication_code_exception +InvalidAuthenticationProfileRequestFault,invalid_authentication_profile_request_fault +InvalidAuthorArnException,invalid_author_arn_exception +InvalidAuthorizationMessageException,invalid_authorization_message_exception +InvalidAuthorizationStateFault,invalid_authorization_state_fault +InvalidAutoRollbackConfigException,invalid_auto_rollback_config_exception +InvalidAutoScalingGroupException,invalid_auto_scaling_group_exception +InvalidAutomationExecutionParametersException,invalid_automation_execution_parameters_exception +InvalidAutomationSignalException,invalid_automation_signal_exception +InvalidAutomationStatusUpdateException,invalid_automation_status_update_exception +InvalidBatchEntryIdException,invalid_batch_entry_id_exception +InvalidBlobIdException,invalid_blob_id_exception +InvalidBlockerDeclarationException,invalid_blocker_declaration_exception +InvalidBlueGreenDeploymentConfigurationException,invalid_blue_green_deployment_configuration_exception +InvalidBlueGreenDeploymentStateFault,invalid_blue_green_deployment_state_fault +InvalidBranchNameException,invalid_branch_name_exception +InvalidBucketNameFilterException,invalid_bucket_name_filter_exception +InvalidCacheClusterStateFault,invalid_cache_cluster_state_fault +InvalidCacheParameterGroupStateFault,invalid_cache_parameter_group_state_fault +InvalidCacheSecurityGroupStateFault,invalid_cache_security_group_state_fault +InvalidCampaignStateException,invalid_campaign_state_exception +InvalidCertificateAuthorityException,invalid_certificate_authority_exception +InvalidCertificateException,invalid_certificate_exception +InvalidCertificateFault,invalid_certificate_fault +InvalidChangeBatch,invalid_change_batch +InvalidChangeSetStatusException,invalid_change_set_status_exception +InvalidChannelARN,invalid_channel_arn +InvalidCiphertextException,invalid_ciphertext_exception +InvalidClientAuthStatusException,invalid_client_auth_status_exception +InvalidClientException,invalid_client_exception +InvalidClientMetadataException,invalid_client_metadata_exception +InvalidClientRequestTokenException,invalid_client_request_token_exception +InvalidClientTokenException,invalid_client_token_exception +InvalidCloudWatchDestinationException,invalid_cloud_watch_destination_exception +InvalidCloudWatchLogsLogGroupArnException,invalid_cloud_watch_logs_log_group_arn_exception +InvalidCloudWatchLogsRoleArnException,invalid_cloud_watch_logs_role_arn_exception +InvalidClusterParameterGroupStateFault,invalid_cluster_parameter_group_state_fault +InvalidClusterSecurityGroupStateFault,invalid_cluster_security_group_state_fault +InvalidClusterSnapshotScheduleStateFault,invalid_cluster_snapshot_schedule_state_fault +InvalidClusterSnapshotStateFault,invalid_cluster_snapshot_state_fault +InvalidClusterStateFault,invalid_cluster_state_fault +InvalidClusterSubnetGroupStateFault,invalid_cluster_subnet_group_state_fault +InvalidClusterSubnetStateFault,invalid_cluster_subnet_state_fault +InvalidClusterTrackFault,invalid_cluster_track_fault +InvalidCodeSignatureException,invalid_code_signature_exception +InvalidCodecPrivateDataException,invalid_codec_private_data_exception +InvalidCommentIdException,invalid_comment_id_exception +InvalidCommentOperationException,invalid_comment_operation_exception +InvalidCommitException,invalid_commit_exception +InvalidCommitIdException,invalid_commit_id_exception +InvalidComputePlatformException,invalid_compute_platform_exception +InvalidConfigurationDetail,invalid_configuration_detail +InvalidConfigurationException,invalid_configuration_exception +InvalidConfigurationRecorderNameException,invalid_configuration_recorder_name_exception +InvalidConfigurationRequestException,invalid_configuration_request_exception +InvalidConfigurationSetException,invalid_configuration_set_exception +InvalidConflictDetailLevelException,invalid_conflict_detail_level_exception +InvalidConflictResolutionException,invalid_conflict_resolution_exception +InvalidConflictResolutionStrategyException,invalid_conflict_resolution_strategy_exception +InvalidContactFlowException,invalid_contact_flow_exception +InvalidContactFlowModuleException,invalid_contact_flow_module_exception +InvalidContentLocation,invalid_content_location +InvalidContinuationTokenException,invalid_continuation_token_exception +InvalidCredentialsException,invalid_credentials_exception +InvalidCrossAccountRoleException,invalid_cross_account_role_exception +InvalidCustomDBEngineVersionStateFault,invalid_custom_db_engine_version_state_fault +InvalidCustomSesConfigurationException,invalid_custom_ses_configuration_exception +InvalidCustomerIdentifierException,invalid_customer_identifier_exception +InvalidDBClusterAutomatedBackupStateFault,invalid_db_cluster_automated_backup_state_fault +InvalidDBClusterCapacityFault,invalid_db_cluster_capacity_fault +InvalidDBClusterEndpointStateFault,invalid_db_cluster_endpoint_state_fault +InvalidDBClusterSnapshotStateFault,invalid_db_cluster_snapshot_state_fault +InvalidDBClusterStateFault,invalid_db_cluster_state_fault +InvalidDBInstanceAutomatedBackupStateFault,invalid_db_instance_automated_backup_state_fault +InvalidDBInstanceStateFault,invalid_db_instance_state_fault +InvalidDBParameterGroupStateFault,invalid_db_parameter_group_state_fault +InvalidDBProxyEndpointStateFault,invalid_db_proxy_endpoint_state_fault +InvalidDBProxyStateFault,invalid_db_proxy_state_fault +InvalidDBSecurityGroupStateFault,invalid_db_security_group_state_fault +InvalidDBSnapshotStateFault,invalid_db_snapshot_state_fault +InvalidDBSubnetGroupFault,invalid_db_subnet_group_fault +InvalidDBSubnetGroupStateFault,invalid_db_subnet_group_state_fault +InvalidDBSubnetStateFault,invalid_db_subnet_state_fault +InvalidDataRepositoryType,invalid_data_repository_type +InvalidDataShareFault,invalid_data_share_fault +InvalidDateEntries,invalid_date_entries +InvalidDateRangeException,invalid_date_range_exception +InvalidDefaultRootObject,invalid_default_root_object +InvalidDefinition,invalid_definition +InvalidDeleteInventoryParametersException,invalid_delete_inventory_parameters_exception +InvalidDeletionIdException,invalid_deletion_id_exception +InvalidDeletionParameterException,invalid_deletion_parameter_exception +InvalidDeliveryChannelNameException,invalid_delivery_channel_name_exception +InvalidDeliveryOptionsException,invalid_delivery_options_exception +InvalidDeployedStateFilterException,invalid_deployed_state_filter_exception +InvalidDeploymentConfigNameException,invalid_deployment_config_name_exception +InvalidDeploymentGroupNameException,invalid_deployment_group_name_exception +InvalidDeploymentIdException,invalid_deployment_id_exception +InvalidDeploymentInstanceTypeException,invalid_deployment_instance_type_exception +InvalidDeploymentStatusException,invalid_deployment_status_exception +InvalidDeploymentStyleException,invalid_deployment_style_exception +InvalidDeploymentTargetIdException,invalid_deployment_target_id_exception +InvalidDeploymentWaitTypeException,invalid_deployment_wait_type_exception +InvalidDescriptionException,invalid_description_exception +InvalidDestinationCommitSpecifierException,invalid_destination_commit_specifier_exception +InvalidDestinationKmsKey,invalid_destination_kms_key +InvalidDeviceException,invalid_device_exception +InvalidDocument,invalid_document +InvalidDocumentContent,invalid_document_content +InvalidDocumentOperation,invalid_document_operation +InvalidDocumentSchemaVersion,invalid_document_schema_version +InvalidDocumentType,invalid_document_type +InvalidDocumentVersion,invalid_document_version +InvalidDomainName,invalid_domain_name +InvalidDomainNameForOriginAccessControl,invalid_domain_name_for_origin_access_control +InvalidDomainValidationOptionsException,invalid_domain_validation_options_exception +InvalidEC2TagCombinationException,invalid_ec2_tag_combination_exception +InvalidEC2TagException,invalid_ec2_tag_exception +InvalidECSServiceException,invalid_ecs_service_exception +InvalidElasticIpFault,invalid_elastic_ip_fault +InvalidEmailException,invalid_email_exception +InvalidEmailRoleAccessPolicyException,invalid_email_role_access_policy_exception +InvalidEncodingException,invalid_encoding_exception +InvalidEndPointException,invalid_end_point_exception +InvalidEndpointException,invalid_endpoint_exception +InvalidEndpointRegionException,invalid_endpoint_region_exception +InvalidEndpointStateFault,invalid_endpoint_state_fault +InvalidErrorCode,invalid_error_code +InvalidEventCategoryException,invalid_event_category_exception +InvalidEventDataStoreCategoryException,invalid_event_data_store_category_exception +InvalidEventDataStoreStatusException,invalid_event_data_store_status_exception +InvalidEventPatternException,invalid_event_pattern_exception +InvalidEventSelectorsException,invalid_event_selectors_exception +InvalidEventSubscriptionStateFault,invalid_event_subscription_state_fault +InvalidExecutionInput,invalid_execution_input +InvalidExportOnlyFault,invalid_export_only_fault +InvalidExportPath,invalid_export_path +InvalidExportSourceStateFault,invalid_export_source_state_fault +InvalidExportTaskStateFault,invalid_export_task_state_fault +InvalidExportTimeException,invalid_export_time_exception +InvalidExpressionException,invalid_expression_exception +InvalidExternalIdException,invalid_external_id_exception +InvalidFacetUpdateException,invalid_facet_update_exception +InvalidFallbackBehavior,invalid_fallback_behavior +InvalidFileExistsBehaviorException,invalid_file_exists_behavior_exception +InvalidFileLocationException,invalid_file_location_exception +InvalidFileModeException,invalid_file_mode_exception +InvalidFilePositionException,invalid_file_position_exception +InvalidFilter,invalid_filter +InvalidFilterException,invalid_filter_exception +InvalidFilterOption,invalid_filter_option +InvalidFilterValue,invalid_filter_value +InvalidFirehoseDestinationException,invalid_firehose_destination_exception +InvalidFleetStatusException,invalid_fleet_status_exception +InvalidFormatFault,invalid_format_fault +InvalidForwardCookies,invalid_forward_cookies +InvalidFunctionAssociation,invalid_function_association +InvalidGameSessionStatusException,invalid_game_session_status_exception +InvalidGatewayRequestException,invalid_gateway_request_exception +InvalidGeoRestrictionParameter,invalid_geo_restriction_parameter +InvalidGitHubAccountTokenException,invalid_git_hub_account_token_exception +InvalidGitHubAccountTokenNameException,invalid_git_hub_account_token_name_exception +InvalidGlobalClusterStateFault,invalid_global_cluster_state_fault +InvalidGlobalReplicationGroupStateFault,invalid_global_replication_group_state_fault +InvalidGrantException,invalid_grant_exception +InvalidGrantIdException,invalid_grant_id_exception +InvalidGrantTokenException,invalid_grant_token_exception +InvalidHandshakeTransitionException,invalid_handshake_transition_exception +InvalidHeadersForS3Origin,invalid_headers_for_s3_origin +InvalidHomeRegionException,invalid_home_region_exception +InvalidHsmClientCertificateStateFault,invalid_hsm_client_certificate_state_fault +InvalidHsmConfigurationStateFault,invalid_hsm_configuration_state_fault +InvalidIamSessionArnException,invalid_iam_session_arn_exception +InvalidIamUserArnException,invalid_iam_user_arn_exception +InvalidIdentityPoolConfigurationException,invalid_identity_pool_configuration_exception +InvalidIdentityTokenException,invalid_identity_token_exception +InvalidIfMatchVersion,invalid_if_match_version +InvalidIgnoreApplicationStopFailuresValueException,invalid_ignore_application_stop_failures_value_exception +InvalidImageFormatException,invalid_image_format_exception +InvalidImportPath,invalid_import_path +InvalidImportSourceException,invalid_import_source_exception +InvalidImportTokenException,invalid_import_token_exception +InvalidInput,invalid_input +InvalidInputCombinationException,invalid_input_combination_exception +InvalidInputException,invalid_input_exception +InvalidInputRecords,invalid_input_records +InvalidInsightSelectorsException,invalid_insight_selectors_exception +InvalidInstanceId,invalid_instance_id +InvalidInstanceInformationFilterValue,invalid_instance_information_filter_value +InvalidInstanceNameException,invalid_instance_name_exception +InvalidInstanceStatusException,invalid_instance_status_exception +InvalidInstanceTypeException,invalid_instance_type_exception +InvalidInventoryGroupException,invalid_inventory_group_exception +InvalidInventoryItemContextException,invalid_inventory_item_context_exception +InvalidInventoryRequestException,invalid_inventory_request_exception +InvalidItemContentException,invalid_item_content_exception +InvalidJobException,invalid_job_exception +InvalidJobIdException,invalid_job_id_exception +InvalidJobStateException,invalid_job_state_exception +InvalidKMSArn,invalid_kms_arn +InvalidKMSKeyException,invalid_kms_key_exception +InvalidKMSKeyFault,invalid_kms_key_fault +InvalidKMSResourceException,invalid_kms_resource_exception +InvalidKeyId,invalid_key_id +InvalidKeyPrefixFilterException,invalid_key_prefix_filter_exception +InvalidKeySigningKeyName,invalid_key_signing_key_name +InvalidKeySigningKeyStatus,invalid_key_signing_key_status +InvalidKeyUsageException,invalid_key_usage_exception +InvalidKmsKeyIdException,invalid_kms_key_id_exception +InvalidLDAPSStatusException,invalid_ldaps_status_exception +InvalidLabels,invalid_labels +InvalidLambdaFunctionAssociation,invalid_lambda_function_association +InvalidLambdaFunctionException,invalid_lambda_function_exception +InvalidLambdaFunctionOutputException,invalid_lambda_function_output_exception +InvalidLambdaResponseException,invalid_lambda_response_exception +InvalidLayerException,invalid_layer_exception +InvalidLayerPartException,invalid_layer_part_exception +InvalidLexiconException,invalid_lexicon_exception +InvalidLifecycleEventHookExecutionIdException,invalid_lifecycle_event_hook_execution_id_exception +InvalidLifecycleEventHookExecutionStatusException,invalid_lifecycle_event_hook_execution_status_exception +InvalidLimitException,invalid_limit_exception +InvalidLoadBalancerActionException,invalid_load_balancer_action_exception +InvalidLoadBalancerInfoException,invalid_load_balancer_info_exception +InvalidLocationCode,invalid_location_code +InvalidLoggingConfiguration,invalid_logging_configuration +InvalidLookupAttributesException,invalid_lookup_attributes_exception +InvalidMarkerException,invalid_marker_exception +InvalidMaxConflictFilesException,invalid_max_conflict_files_exception +InvalidMaxMergeHunksException,invalid_max_merge_hunks_exception +InvalidMaxResultsException,invalid_max_results_exception +InvalidMediaFrameException,invalid_media_frame_exception +InvalidMergeOptionException,invalid_merge_option_exception +InvalidMinimumHealthyHostValueException,invalid_minimum_healthy_host_value_exception +InvalidMinimumProtocolVersion,invalid_minimum_protocol_version +InvalidName,invalid_name +InvalidNamespaceFault,invalid_namespace_fault +InvalidNetworkInterface,invalid_network_interface +InvalidNetworkSettings,invalid_network_settings +InvalidNextToken,invalid_next_token +InvalidNextTokenException,invalid_next_token_exception +InvalidNodeException,invalid_node_exception +InvalidNodeStateFault,invalid_node_state_fault +InvalidNonceException,invalid_nonce_exception +InvalidNotificationConfig,invalid_notification_config +InvalidNumericDataException,invalid_numeric_data_exception +InvalidOAuthFlowException,invalid_o_auth_flow_exception +InvalidObjectState,invalid_object_state +InvalidOnPremisesTagCombinationException,invalid_on_premises_tag_combination_exception +InvalidOperationException,invalid_operation_exception +InvalidOperationFault,invalid_operation_fault +InvalidOptionException,invalid_option_exception +InvalidOptionGroupStateFault,invalid_option_group_state_fault +InvalidOrderException,invalid_order_exception +InvalidOrigin,invalid_origin +InvalidOriginAccessControl,invalid_origin_access_control +InvalidOriginAccessIdentity,invalid_origin_access_identity +InvalidOriginKeepaliveTimeout,invalid_origin_keepalive_timeout +InvalidOriginReadTimeout,invalid_origin_read_timeout +InvalidOutput,invalid_output +InvalidOverrideStatusException,invalid_override_status_exception +InvalidPaginationException,invalid_pagination_exception +InvalidPaginationToken,invalid_pagination_token +InvalidPaginationTokenException,invalid_pagination_token_exception +InvalidParameter,invalid_parameter +InvalidParameterCombinationException,invalid_parameter_combination_exception +InvalidParameterDetail,invalid_parameter_detail +InvalidParameterException,invalid_parameter_exception +InvalidParameterGroupStateFault,invalid_parameter_group_state_fault +InvalidParameterValueException,invalid_parameter_value_exception +InvalidParameterValuesException,invalid_parameter_values_exception +InvalidParameters,invalid_parameters +InvalidParametersException,invalid_parameters_exception +InvalidParentCommitIdException,invalid_parent_commit_id_exception +InvalidPasswordException,invalid_password_exception +InvalidPathException,invalid_path_exception +InvalidPerUnitStorageThroughput,invalid_per_unit_storage_throughput +InvalidPermissionType,invalid_permission_type +InvalidPolicyAttributeException,invalid_policy_attribute_exception +InvalidPolicyDocument,invalid_policy_document +InvalidPolicyException,invalid_policy_exception +InvalidPolicyRevisionIdException,invalid_policy_revision_id_exception +InvalidPolicyTypeException,invalid_policy_type_exception +InvalidPortRangeException,invalid_port_range_exception +InvalidProductCodeException,invalid_product_code_exception +InvalidProtocolSettings,invalid_protocol_settings +InvalidPublicKeyException,invalid_public_key_exception +InvalidPublicKeyVersionException,invalid_public_key_version_exception +InvalidPullRequestEventTypeException,invalid_pull_request_event_type_exception +InvalidPullRequestIdException,invalid_pull_request_id_exception +InvalidPullRequestStatusException,invalid_pull_request_status_exception +InvalidPullRequestStatusUpdateException,invalid_pull_request_status_update_exception +InvalidQueryException,invalid_query_exception +InvalidQueryStatementException,invalid_query_statement_exception +InvalidQueryStatusException,invalid_query_status_exception +InvalidQueryStringParameters,invalid_query_string_parameters +InvalidReactionUserArnException,invalid_reaction_user_arn_exception +InvalidReactionValueException,invalid_reaction_value_exception +InvalidRecordCount,invalid_record_count +InvalidRecordingGroupException,invalid_recording_group_exception +InvalidReferenceNameException,invalid_reference_name_exception +InvalidRegion,invalid_region +InvalidRegionException,invalid_region_exception +InvalidRegistrationStatusException,invalid_registration_status_exception +InvalidRelativeFileVersionEnumException,invalid_relative_file_version_enum_exception +InvalidRelativePath,invalid_relative_path +InvalidRenderingParameterException,invalid_rendering_parameter_exception +InvalidReplacementContentException,invalid_replacement_content_exception +InvalidReplacementTypeException,invalid_replacement_type_exception +InvalidReplicationGroupStateFault,invalid_replication_group_state_fault +InvalidRepositoryDescriptionException,invalid_repository_description_exception +InvalidRepositoryNameException,invalid_repository_name_exception +InvalidRepositoryTriggerBranchNameException,invalid_repository_trigger_branch_name_exception +InvalidRepositoryTriggerCustomDataException,invalid_repository_trigger_custom_data_exception +InvalidRepositoryTriggerDestinationArnException,invalid_repository_trigger_destination_arn_exception +InvalidRepositoryTriggerEventsException,invalid_repository_trigger_events_exception +InvalidRepositoryTriggerNameException,invalid_repository_trigger_name_exception +InvalidRepositoryTriggerRegionException,invalid_repository_trigger_region_exception +InvalidRequestContentException,invalid_request_content_exception +InvalidRequestDetail,invalid_request_detail +InvalidRequestException,invalid_request_exception +InvalidRequiredProtocol,invalid_required_protocol +InvalidReservedNodeStateFault,invalid_reserved_node_state_fault +InvalidResourceArnException,invalid_resource_arn_exception +InvalidResourceException,invalid_resource_exception +InvalidResourceFormatException,invalid_resource_format_exception +InvalidResourcePolicyException,invalid_resource_policy_exception +InvalidResourceStateException,invalid_resource_state_exception +InvalidResourceStateFault,invalid_resource_state_fault +InvalidResourceTypeException,invalid_resource_type_exception +InvalidResponseCode,invalid_response_code +InvalidResponseException,invalid_response_exception +InvalidRestoreFault,invalid_restore_fault +InvalidRestoreTimeException,invalid_restore_time_exception +InvalidResultAttributeException,invalid_result_attribute_exception +InvalidResultTokenException,invalid_result_token_exception +InvalidRetentionPeriodFault,invalid_retention_period_fault +InvalidRevisionException,invalid_revision_exception +InvalidRevisionIdException,invalid_revision_id_exception +InvalidRole,invalid_role +InvalidRoleException,invalid_role_exception +InvalidRouteTableId,invalid_route_table_id +InvalidRuleContentSha256Exception,invalid_rule_content_sha256_exception +InvalidRuleException,invalid_rule_exception +InvalidRuntimeException,invalid_runtime_exception +InvalidS3BucketException,invalid_s3_bucket_exception +InvalidS3BucketFault,invalid_s3_bucket_fault +InvalidS3BucketNameException,invalid_s3_bucket_name_exception +InvalidS3BucketNameFault,invalid_s3_bucket_name_fault +InvalidS3ConfigurationException,invalid_s3_configuration_exception +InvalidS3KeyException,invalid_s3_key_exception +InvalidS3KeyPrefixException,invalid_s3_key_prefix_exception +InvalidS3KeyPrefixFault,invalid_s3_key_prefix_fault +InvalidS3KmsKeyArnException,invalid_s3_kms_key_arn_exception +InvalidS3ObjectException,invalid_s3_object_exception +InvalidS3PrefixException,invalid_s3_prefix_exception +InvalidSNSDestinationException,invalid_sns_destination_exception +InvalidSNSTopicARNException,invalid_sns_topic_arn_exception +InvalidSampleRateException,invalid_sample_rate_exception +InvalidSchedule,invalid_schedule +InvalidScheduleFault,invalid_schedule_fault +InvalidScheduledActionFault,invalid_scheduled_action_fault +InvalidSchemaDocException,invalid_schema_doc_exception +InvalidSchemeException,invalid_scheme_exception +InvalidScopeException,invalid_scope_exception +InvalidSecretsManagerResourceException,invalid_secrets_manager_resource_exception +InvalidSecurityException,invalid_security_exception +InvalidSecurityGroupException,invalid_security_group_exception +InvalidSecurityGroupIDException,invalid_security_group_id_exception +InvalidSecurityGroupId,invalid_security_group_id +InvalidSensorData,invalid_sensor_data +InvalidSequenceTokenException,invalid_sequence_token_exception +InvalidServiceLinkedRoleStateException,invalid_service_linked_role_state_exception +InvalidServiceRoleException,invalid_service_role_exception +InvalidSessionException,invalid_session_exception +InvalidSignal,invalid_signal +InvalidSignalDecoder,invalid_signal_decoder +InvalidSignalsException,invalid_signals_exception +InvalidSigningStatus,invalid_signing_status +InvalidSmsRoleAccessPolicyException,invalid_sms_role_access_policy_exception +InvalidSmsRoleTrustRelationshipException,invalid_sms_role_trust_relationship_exception +InvalidSnapshotCopyGrantStateFault,invalid_snapshot_copy_grant_state_fault +InvalidSnapshotStateFault,invalid_snapshot_state_fault +InvalidSnsTopicArnException,invalid_sns_topic_arn_exception +InvalidSnsTopicException,invalid_sns_topic_exception +InvalidSnsTopicNameException,invalid_sns_topic_name_exception +InvalidSortByException,invalid_sort_by_exception +InvalidSortOrderException,invalid_sort_order_exception +InvalidSourceCommitSpecifierException,invalid_source_commit_specifier_exception +InvalidSourceException,invalid_source_exception +InvalidSourceKmsKey,invalid_source_kms_key +InvalidSsmlException,invalid_ssml_exception +InvalidStageDeclarationException,invalid_stage_declaration_exception +InvalidStateException,invalid_state_exception +InvalidStateTransitionException,invalid_state_transition_exception +InvalidStructureException,invalid_structure_exception +InvalidSubnet,invalid_subnet +InvalidSubnetException,invalid_subnet_exception +InvalidSubnetIDException,invalid_subnet_id_exception +InvalidSubnetId,invalid_subnet_id +InvalidSubscriptionStateFault,invalid_subscription_state_fault +InvalidSystemTagUsageException,invalid_system_tag_usage_exception +InvalidTTLOrder,invalid_ttl_order +InvalidTableRestoreArgumentFault,invalid_table_restore_argument_fault +InvalidTag,invalid_tag +InvalidTagException,invalid_tag_exception +InvalidTagFault,invalid_tag_fault +InvalidTagFilterException,invalid_tag_filter_exception +InvalidTagKeysListException,invalid_tag_keys_list_exception +InvalidTagParameterException,invalid_tag_parameter_exception +InvalidTagging,invalid_tagging +InvalidTaggingRequestException,invalid_tagging_request_exception +InvalidTagsException,invalid_tags_exception +InvalidTagsMapException,invalid_tags_map_exception +InvalidTagsToAddException,invalid_tags_to_add_exception +InvalidTarget,invalid_target +InvalidTargetBranchException,invalid_target_branch_exception +InvalidTargetException,invalid_target_exception +InvalidTargetFilterNameException,invalid_target_filter_name_exception +InvalidTargetGroupPairException,invalid_target_group_pair_exception +InvalidTargetInstancesException,invalid_target_instances_exception +InvalidTargetMaps,invalid_target_maps +InvalidTargetsException,invalid_targets_exception +InvalidTaskIdException,invalid_task_id_exception +InvalidTemplateException,invalid_template_exception +InvalidTimeRangeException,invalid_time_range_exception +InvalidTitleException,invalid_title_exception +InvalidToken,invalid_token +InvalidTokenException,invalid_token_exception +InvalidTracingConfiguration,invalid_tracing_configuration +InvalidTrackingOptionsException,invalid_tracking_options_exception +InvalidTrafficPolicyDocument,invalid_traffic_policy_document +InvalidTrafficRoutingConfigurationException,invalid_traffic_routing_configuration_exception +InvalidTrailNameException,invalid_trail_name_exception +InvalidTriggerConfigException,invalid_trigger_config_exception +InvalidTypeException,invalid_type_exception +InvalidTypeNameException,invalid_type_name_exception +InvalidUpdate,invalid_update +InvalidUpdateOutdatedInstancesOnlyValueException,invalid_update_outdated_instances_only_value_exception +InvalidUsageAllocationsException,invalid_usage_allocations_exception +InvalidUsageDimensionException,invalid_usage_dimension_exception +InvalidUsageLimitFault,invalid_usage_limit_fault +InvalidUserGroupStateFault,invalid_user_group_state_fault +InvalidUserList,invalid_user_list +InvalidUserPoolConfigurationException,invalid_user_pool_configuration_exception +InvalidUserStateFault,invalid_user_state_fault +InvalidUserStatusException,invalid_user_status_exception +InvalidUserTypeException,invalid_user_type_exception +InvalidVPCId,invalid_vpc_id +InvalidVPCNetworkStateFault,invalid_vpc_network_state_fault +InvalidValues,invalid_values +InvalidVersionNumberException,invalid_version_number_exception +InvalidViewerCertificate,invalid_viewer_certificate +InvalidWebACLId,invalid_web_acl_id +InvalidWebhookAuthenticationParametersException,invalid_webhook_authentication_parameters_exception +InvalidWebhookFilterPatternException,invalid_webhook_filter_pattern_exception +InvalidZipFileException,invalid_zip_file_exception +InvalidateProjectCacheInput,invalidate_project_cache_input +Invalidation,invalidation +InvalidationBatch,invalidation_batch +InvalidationList,invalidation_list +InvalidationSummary,invalidation_summary +InventoryAggregator,inventory_aggregator +InventoryConfiguration,inventory_configuration +InventoryConfigurationList,inventory_configuration_list +InventoryData,inventory_data +InventoryDeletionStatusItem,inventory_deletion_status_item +InventoryDeletionSummary,inventory_deletion_summary +InventoryDeletionSummaryItem,inventory_deletion_summary_item +InventoryDeletions,inventory_deletions +InventoryDestination,inventory_destination +InventoryEncryption,inventory_encryption +InventoryFilter,inventory_filter +InventoryGroup,inventory_group +InventoryItem,inventory_item +InventoryItemAttribute,inventory_item_attribute +InventoryItemSchema,inventory_item_schema +InventoryResultEntity,inventory_result_entity +InventoryResultItem,inventory_result_item +InventoryRetrievalJobDescription,inventory_retrieval_job_description +InventoryRetrievalJobInput,inventory_retrieval_job_input +InventoryRetrievalParameters,inventory_retrieval_parameters +InventoryS3BucketDestination,inventory_s3_bucket_destination +InventorySchedule,inventory_schedule +InventorySizeInBytes,inventory_size_in_bytes +Inverse,inverse +Inverted,inverted +InvisibleFieldInfo,invisible_field_info +InvisibleFields,invisible_fields +Invitation,invitation +InvitationId,invitation_id +InvitationType,invitation_type +Invitations,invitations +InvitationsCount,invitations_count +Invite,invite +InviteAccountToOrganizationRequest,invite_account_to_organization_request +InviteAccountToOrganizationResponse,invite_account_to_organization_response +InviteAction,invite_action +InviteId,invite_id +InviteMembersRequest,invite_members_request +InviteMembersResponse,invite_members_response +InviteMessageTemplate,invite_message_template +InviteUsersRequest,invite_users_request +InviteUsersResponse,invite_users_response +InvitedAt,invited_at +InvitedBy,invited_by +InvitedOn,invited_on +InvitedTime,invited_time +InviteePrincipalId,invitee_principal_id +Invites,invites +InvocationCondition,invocation_condition +InvocationEndTime,invocation_end_time +InvocationEndpoint,invocation_endpoint +InvocationHttpParameters,invocation_http_parameters +InvocationId,invocation_id +InvocationPhrase,invocation_phrase +InvocationPoint,invocation_point +InvocationRateLimitPerSecond,invocation_rate_limit_per_second +InvocationRequest,invocation_request +InvocationResponse,invocation_response +InvocationRole,invocation_role +InvocationStartTime,invocation_start_time +InvocationTime,invocation_time +InvocationTimeoutSeconds,invocation_timeout_seconds +InvocationType,invocation_type +InvocationsMaxRetries,invocations_max_retries +InvocationsPerInstance,invocations_per_instance +InvocationsTimeoutInSeconds,invocations_timeout_in_seconds +InvoiceId,invoice_id +InvokeArgs,invoke_args +InvokeAsyncRequest,invoke_async_request +InvokeAsyncResponse,invoke_async_response +InvokeDeviceMethodRequest,invoke_device_method_request +InvokeDeviceMethodResponse,invoke_device_method_response +InvokeEndpointAsyncInput,invoke_endpoint_async_input +InvokeEndpointAsyncOutput,invoke_endpoint_async_output +InvokeEndpointInput,invoke_endpoint_input +InvokeEndpointOutput,invoke_endpoint_output +InvokeEndpointWithResponseStreamInput,invoke_endpoint_with_response_stream_input +InvokeEndpointWithResponseStreamOutput,invoke_endpoint_with_response_stream_output +InvokeMode,invoke_mode +InvokeModelRequest,invoke_model_request +InvokeModelResponse,invoke_model_response +InvokeModelWithResponseStreamRequest,invoke_model_with_response_stream_request +InvokeModelWithResponseStreamResponse,invoke_model_with_response_stream_response +InvokeResponseStreamUpdate,invoke_response_stream_update +InvokeScreenAutomationRequest,invoke_screen_automation_request +InvokeScreenAutomationResult,invoke_screen_automation_result +InvokeWithResponseStreamCompleteEvent,invoke_with_response_stream_complete_event +InvokeWithResponseStreamRequest,invoke_with_response_stream_request +InvokeWithResponseStreamResponse,invoke_with_response_stream_response +InvokedBy,invoked_by +InvokedIntentSample,invoked_intent_sample +InvokedProductionVariant,invoked_production_variant +IoPerformance,io_performance +IoTJobAbortConfig,io_t_job_abort_config +IoTJobAbortCriteria,io_t_job_abort_criteria +IoTJobExecutionsRolloutConfig,io_t_job_executions_rollout_config +IoTJobExponentialRolloutRate,io_t_job_exponential_rollout_rate +IoTJobRateIncreaseCriteria,io_t_job_rate_increase_criteria +IoTJobTimeoutConfig,io_t_job_timeout_config +IonBinary,ion_binary +IonText,ion_text +Iops,iops +IopsOther,iops_other +IopsRead,iops_read +IopsToStorageRatio,iops_to_storage_ratio +IopsTotal,iops_total +IopsWrite,iops_write +IosClientBrandingAttributes,ios_client_branding_attributes +IosImportClientBrandingAttributes,ios_import_client_branding_attributes +IotAnalyticsAction,iot_analytics_action +IotCertificateId,iot_certificate_id +IotEventsAction,iot_events_action +IotEventsDestinationConfiguration,iot_events_destination_configuration +IotEventsInputIdentifier,iot_events_input_identifier +IotJobArn,iot_job_arn +IotJobId,iot_job_id +IotRoleAlias,iot_role_alias +IotSiteWiseAction,iot_site_wise_action +IotSiteWiseAssetModelPropertyIdentifier,iot_site_wise_asset_model_property_identifier +IotSiteWiseCustomerManagedDatastoreS3Storage,iot_site_wise_customer_managed_datastore_s3_storage +IotSiteWiseCustomerManagedDatastoreS3StorageSummary,iot_site_wise_customer_managed_datastore_s3_storage_summary +IotSiteWiseInputIdentifier,iot_site_wise_input_identifier +IotThingName,iot_thing_name +IotTopicPublishAction,iot_topic_publish_action +Ip,ip +IpAccessSettings,ip_access_settings +IpAccessSettingsSummary,ip_access_settings_summary +IpAddress,ip_address +IpAddressCount,ip_address_count +IpAddressDetails,ip_address_details +IpAddressFamily,ip_address_family +IpAddressInUse,ip_address_in_use +IpAddressRequest,ip_address_request +IpAddressResponse,ip_address_response +IpAddressType,ip_address_type +IpAddressUpdate,ip_address_update +IpAddressV4,ip_address_v4 +IpAddresses,ip_addresses +IpCity,ip_city +IpCountry,ip_country +IpDiscovery,ip_discovery +IpFamily,ip_family +IpFilter,ip_filter +IpGeoLocation,ip_geo_location +IpId,ip_id +IpOrganizationDetails,ip_organization_details +IpOwner,ip_owner +IpOwnerId,ip_owner_id +IpPermission,ip_permission +IpPermissions,ip_permissions +IpPermissionsEgress,ip_permissions_egress +IpProtocol,ip_protocol +IpRange,ip_range +IpRanges,ip_ranges +IpRestrictionRuleMap,ip_restriction_rule_map +IpRoute,ip_route +IpRouteInfo,ip_route_info +IpRouteLimitExceededException,ip_route_limit_exceeded_exception +IpRouteStatusMsg,ip_route_status_msg +IpRouteStatusReason,ip_route_status_reason +IpRoutes,ip_routes +IpRoutesInfo,ip_routes_info +IpRule,ip_rule +IpRuleItem,ip_rule_item +IpScheme,ip_scheme +IpSet,ip_set +IpSetId,ip_set_id +IpSetIds,ip_set_ids +IpSets,ip_sets +IpUsage,ip_usage +IpV4Addresses,ipv4_addresses +IpV4Cidr,ipv4_cidr +IpV4CidrBlock,ipv4_cidr_block +IpV6Address,ipv6_address +IpV6Addresses,ipv6_addresses +IpV6Cidr,ipv6_cidr +Ipam,ipam +IpamAddressHistoryRecord,ipam_address_history_record +IpamArn,ipam_arn +IpamCidrAuthorizationContext,ipam_cidr_authorization_context +IpamDiscoveredAccount,ipam_discovered_account +IpamDiscoveredAccounts,ipam_discovered_accounts +IpamDiscoveredResourceCidr,ipam_discovered_resource_cidr +IpamDiscoveredResourceCidrs,ipam_discovered_resource_cidrs +IpamDiscoveryFailureReason,ipam_discovery_failure_reason +IpamId,ipam_id +IpamIds,ipam_ids +IpamOperatingRegion,ipam_operating_region +IpamPool,ipam_pool +IpamPoolAllocation,ipam_pool_allocation +IpamPoolAllocationId,ipam_pool_allocation_id +IpamPoolAllocations,ipam_pool_allocations +IpamPoolArn,ipam_pool_arn +IpamPoolCidr,ipam_pool_cidr +IpamPoolCidrFailureReason,ipam_pool_cidr_failure_reason +IpamPoolCidrId,ipam_pool_cidr_id +IpamPoolCidrs,ipam_pool_cidrs +IpamPoolId,ipam_pool_id +IpamPoolIds,ipam_pool_ids +IpamPoolOwner,ipam_pool_owner +IpamPools,ipam_pools +IpamRegion,ipam_region +IpamResourceCidr,ipam_resource_cidr +IpamResourceCidrs,ipam_resource_cidrs +IpamResourceDiscoveries,ipam_resource_discoveries +IpamResourceDiscovery,ipam_resource_discovery +IpamResourceDiscoveryArn,ipam_resource_discovery_arn +IpamResourceDiscoveryAssociation,ipam_resource_discovery_association +IpamResourceDiscoveryAssociationArn,ipam_resource_discovery_association_arn +IpamResourceDiscoveryAssociationId,ipam_resource_discovery_association_id +IpamResourceDiscoveryAssociationIds,ipam_resource_discovery_association_ids +IpamResourceDiscoveryAssociations,ipam_resource_discovery_associations +IpamResourceDiscoveryId,ipam_resource_discovery_id +IpamResourceDiscoveryIds,ipam_resource_discovery_ids +IpamResourceDiscoveryRegion,ipam_resource_discovery_region +IpamResourceTag,ipam_resource_tag +IpamScope,ipam_scope +IpamScopeArn,ipam_scope_arn +IpamScopeId,ipam_scope_id +IpamScopeIds,ipam_scope_ids +IpamScopeType,ipam_scope_type +IpamScopes,ipam_scopes +Ipams,ipams +IpcMode,ipc_mode +Ips,ips +Ipv4,ipv4 +Ipv4Address,ipv4_address +Ipv4AddressesPerInterface,ipv4_addresses_per_interface +Ipv4IpamPoolId,ipv4_ipam_pool_id +Ipv4NetmaskLength,ipv4_netmask_length +Ipv4Prefix,ipv4_prefix +Ipv4PrefixCount,ipv4_prefix_count +Ipv4PrefixSpecification,ipv4_prefix_specification +Ipv4PrefixSpecificationRequest,ipv4_prefix_specification_request +Ipv4PrefixSpecificationResponse,ipv4_prefix_specification_response +Ipv4Prefixes,ipv4_prefixes +Ipv6,ipv6 +Ipv6Address,ipv6_address +Ipv6AddressCount,ipv6_address_count +Ipv6Addresses,ipv6_addresses +Ipv6AddressesPerInterface,ipv6_addresses_per_interface +Ipv6Cidr,ipv6_cidr +Ipv6CidrAssociation,ipv6_cidr_association +Ipv6CidrAssociations,ipv6_cidr_associations +Ipv6CidrBlock,ipv6_cidr_block +Ipv6CidrBlockAssociation,ipv6_cidr_block_association +Ipv6CidrBlockAssociationSet,ipv6_cidr_block_association_set +Ipv6CidrBlockNetworkBorderGroup,ipv6_cidr_block_network_border_group +Ipv6CidrBlockSet,ipv6_cidr_block_set +Ipv6CidrBlockState,ipv6_cidr_block_state +Ipv6IpamPoolId,ipv6_ipam_pool_id +Ipv6Native,ipv6_native +Ipv6NetmaskLength,ipv6_netmask_length +Ipv6Pool,ipv6_pool +Ipv6Pools,ipv6_pools +Ipv6Prefix,ipv6_prefix +Ipv6PrefixCount,ipv6_prefix_count +Ipv6PrefixSpecification,ipv6_prefix_specification +Ipv6PrefixSpecificationRequest,ipv6_prefix_specification_request +Ipv6PrefixSpecificationResponse,ipv6_prefix_specification_response +Ipv6Prefixes,ipv6_prefixes +Ipv6Range,ipv6_range +Ipv6Ranges,ipv6_ranges +Ipv6Support,ipv6_support +Ipv6Supported,ipv6_supported +IrreversibleInstanceRefreshFault,irreversible_instance_refresh_fault +Is64BitsOnly,is64_bits_only +IsActivated,is_activated +IsAdvancedManagedRuleSet,is_advanced_managed_rule_set +IsAlexaForBusinessEnabled,is_alexa_for_business_enabled +IsAnomalous,is_anomalous +IsAnomaly,is_anomaly +IsApplicable,is_applicable +IsArchived,is_archived +IsAttachable,is_attachable +IsAuthorizedInput,is_authorized_input +IsAuthorizedOutput,is_authorized_output +IsAuthorizedWithTokenInput,is_authorized_with_token_input +IsAuthorizedWithTokenOutput,is_authorized_with_token_output +IsAutoPredictor,is_auto_predictor +IsBatchStatement,is_batch_statement +IsBinaryFile,is_binary_file +IsCaller,is_caller +IsClusterWriter,is_cluster_writer +IsCollection,is_collection +IsCritical,is_critical +IsDataLossAllowed,is_data_loss_allowed +IsDataPartial,is_data_partial +IsDefault,is_default +IsDefaultAction,is_default_action +IsDefaultConfiguration,is_default_configuration +IsDefaultVersion,is_default_version +IsEgress,is_egress +IsEmpty,is_empty +IsEnabled,is_enabled +IsEncrypted,is_encrypted +IsEnd,is_end +IsEssential,is_essential +IsGlobal,is_global +IsIPV6Enabled,is_ipv6_enabled +IsImmutable,is_immutable +IsInSandbox,is_in_sandbox +IsIncludedInTopic,is_included_in_topic +IsIndirectActivity,is_indirect_activity +IsLatest,is_latest +IsLatestPatch,is_latest_patch +IsLatestVersion,is_latest_version +IsLocalTime,is_local_time +IsLogging,is_logging +IsLoggingEnabled,is_logging_enabled +IsLongTermPricingAutoRenew,is_long_term_pricing_auto_renew +IsMajorVersion,is_major_version +IsMajorVersionUpgrade,is_major_version_upgrade +IsMaster,is_master +IsMemberInGroupsRequest,is_member_in_groups_request +IsMemberInGroupsResponse,is_member_in_groups_response +IsMfaDeleteEnabled,is_mfa_delete_enabled +IsMiddlebox,is_middlebox +IsModifiable,is_modifiable +IsMultiRegionTrail,is_multi_region_trail +IsNegOne,is_neg_one +IsNewProvisioningAvailable,is_new_provisioning_available +IsNoEcho,is_no_echo +IsNullString,is_null_string +IsOptional,is_optional +IsOrganizationTrail,is_organization_trail +IsOwned,is_owned +IsParent,is_parent +IsPartial,is_partial +IsPaused,is_paused +IsPermanentRestore,is_permanent_restore +IsPrimary,is_primary +IsPrimaryIpv6,is_primary_ipv6 +IsPublic,is_public +IsPubliclyAccessible,is_publicly_accessible +IsRegisteredWithLakeFormation,is_registered_with_lake_formation +IsRequestable,is_requestable +IsRequired,is_required +IsRestoreInProgress,is_restore_in_progress +IsRestricted,is_restricted +IsReviewOwnerUpdateAcknowledged,is_review_owner_update_acknowledged +IsRouteTableUsedInDifferentAZ,is_route_table_used_in_different_az +IsSuccess,is_success +IsTerminal,is_terminal +IsTestDomain,is_test_domain +IsTruncated,is_truncated +IsTunable,is_tunable +IsUnique,is_unique +IsUnstructured,is_unstructured +IsValidExchange,is_valid_exchange +IsValueSecret,is_value_secret +IsVerifiedAuthor,is_verified_author +IsVersioningSupported,is_versioning_supported +IsVpcPeeredResult,is_vpc_peered_result +IsWifiEnabled,is_wifi_enabled +IsWriter,is_writer +Iscsi,iscsi +Iso2CountryCode,iso2_country_code +IsoCountryCode,iso_country_code +IsolationMode,isolation_mode +Isp,isp +IspName,isp_name +IspPlacement,isp_placement +IspPlacements,isp_placements +Issue,issue +IssueCertificateRequest,issue_certificate_request +IssueCertificateResponse,issue_certificate_response +IssueDetected,issue_detected +IssueDetectionConfiguration,issue_detection_configuration +IssueFieldMappings,issue_field_mappings +IssueInfoMap,issue_info_map +IssueSubEntityFilter,issue_sub_entity_filter +IssueType,issue_type +IssuedAt,issued_at +Issuer,issuer +IssuerCertificateIdentifier,issuer_certificate_identifier +IssuerDetails,issuer_details +Issues,issues +IssuesDetected,issues_detected +IssuingAccount,issuing_account +Item,item +ItemClassFilter,item_class_filter +ItemCollectionKey,item_collection_key +ItemCollectionMetrics,item_collection_metrics +ItemCollectionSizeLimitExceededException,item_collection_size_limit_exceeded_exception +ItemContentHash,item_content_hash +ItemContentMismatchException,item_content_mismatch_exception +ItemCount,item_count +ItemIdentifier,item_identifier +ItemIdentifierAttributeName,item_identifier_attribute_name +ItemResponse,item_response +ItemSizeLimitExceededException,item_size_limit_exceeded_exception +ItemSource,item_source +ItemStatus,item_status +ItemizedMetricStats,itemized_metric_stats +ItemizedMetricStatsList,itemized_metric_stats_list +Items,items +ItemsLimit,items_limit +ItemsLimitConfiguration,items_limit_configuration +IvInManifest,iv_in_manifest +IvSource,iv_source +JA3Fingerprint,ja3_fingerprint +JDBCConnectorOptions,jdbc_connector_options +JDBCConnectorSource,jdbc_connector_source +JDBCConnectorTarget,jdbc_connector_target +JSON,json +JSONInput,json_input +JSONMappingParameters,json_mapping_parameters +JSONOutput,json_output +JSONString,json_string +JWTConfiguration,jwt_configuration +JamSyncTime,jam_sync_time +JapaneseTokenizationDictionary,japanese_tokenization_dictionary +Jar,jar +Jdbc,jdbc +JdbcTarget,jdbc_target +JdbcTargets,jdbc_targets +JiraAccountUrl,jira_account_url +JiraConfiguration,jira_configuration +JiraParameters,jira_parameters +JmxExporter,jmx_exporter +JmxExporterInfo,jmx_exporter_info +Job,job +JobAlbumArt,job_album_art +JobArn,job_arn +JobBookmark,job_bookmark +JobBookmarkEntry,job_bookmark_entry +JobBookmarkKeys,job_bookmark_keys +JobBookmarkKeysSortOrder,job_bookmark_keys_sort_order +JobBookmarksEncryption,job_bookmarks_encryption +JobBookmarksEncryptionMode,job_bookmarks_encryption_mode +JobCheckpointConfig,job_checkpoint_config +JobCommand,job_command +JobCompletionDate,job_completion_date +JobCompletionReportURI,job_completion_report_uri +JobConfig,job_config +JobConfiguration,job_configuration +JobCreationDate,job_creation_date +JobData,job_data +JobDefinition,job_definition +JobDefinitionArn,job_definition_arn +JobDefinitionName,job_definition_name +JobDefinitionSummaries,job_definition_summaries +JobDependency,job_dependency +JobDescription,job_description +JobDescriptor,job_descriptor +JobDetail,job_detail +JobDetails,job_details +JobDriver,job_driver +JobDurationInSeconds,job_duration_in_seconds +JobEndTime,job_end_time +JobEntry,job_entry +JobError,job_error +JobEventDetails,job_event_details +JobExecution,job_execution +JobExecutionSettings,job_execution_settings +JobExecutionState,job_execution_state +JobExecutionStatusDetails,job_execution_status_details +JobExecutionSummary,job_execution_summary +JobExecutionSummaryForJob,job_execution_summary_for_job +JobExecutionSummaryForThing,job_execution_summary_for_thing +JobExecutionsRetryConfig,job_executions_retry_config +JobExecutionsRolloutConfig,job_executions_rollout_config +JobExpirationTime,job_expiration_time +JobFailure,job_failure +JobFailureLogURI,job_failure_log_uri +JobFilter,job_filter +JobFlowDetail,job_flow_detail +JobFlowExecutionStatusDetail,job_flow_execution_status_detail +JobFlowId,job_flow_id +JobFlowIds,job_flow_ids +JobFlowInstancesConfig,job_flow_instances_config +JobFlowInstancesDetail,job_flow_instances_detail +JobFlowRole,job_flow_role +JobFlowStates,job_flow_states +JobFlows,job_flows +JobId,job_id +JobIds,job_ids +JobInput,job_input +JobList,job_list +JobListDescriptor,job_list_descriptor +JobListEntries,job_list_entries +JobListEntry,job_list_entry +JobLog,job_log +JobLogEventData,job_log_event_data +JobLogInfo,job_log_info +JobLogs,job_logs +JobManifest,job_manifest +JobManifestGeneratorFilter,job_manifest_generator_filter +JobManifestLocation,job_manifest_location +JobManifestSpec,job_manifest_spec +JobMessages,job_messages +JobMetadata,job_metadata +JobMetrics,job_metrics +JobName,job_name +JobNameContains,job_name_contains +JobNames,job_names +JobNodeDetails,job_node_details +JobNotFoundException,job_not_found_exception +JobOperation,job_operation +JobOutput,job_output +JobOutputDataConfig,job_output_data_config +JobOutputPath,job_output_path +JobParameters,job_parameters +JobPercentComplete,job_percent_complete +JobPlanDescription,job_plan_description +JobPostLaunchActionsLaunchStatus,job_post_launch_actions_launch_status +JobProcessDetails,job_process_details +JobProgress,job_progress +JobProgressSummary,job_progress_summary +JobQueueDetail,job_queue_detail +JobReferenceCode,job_reference_code +JobReferenceCodeContains,job_reference_code_contains +JobReport,job_report +JobResource,job_resource +JobResourceTags,job_resource_tags +JobResources,job_resources +JobRun,job_run +JobRunId,job_run_id +JobRunIds,job_run_ids +JobRunState,job_run_state +JobRunSummary,job_run_summary +JobRuns,job_runs +JobSample,job_sample +JobSchedule,job_schedule +JobScheduleFrequency,job_schedule_frequency +JobScopeTerm,job_scope_term +JobScopingBlock,job_scoping_block +JobSettings,job_settings +JobStartTime,job_start_time +JobState,job_state +JobStatesToNotify,job_states_to_notify +JobStats,job_stats +JobStatus,job_status +JobStatusDetails,job_status_details +JobStatusException,job_status_exception +JobStatuses,job_statuses +JobStoppingCondition,job_stopping_condition +JobSuccessLogURI,job_success_log_uri +JobSummaries,job_summaries +JobSummary,job_summary +JobTag,job_tag +JobTags,job_tags +JobTemplate,job_template +JobTemplateData,job_template_data +JobTemplateSettings,job_template_settings +JobTemplateSummary,job_template_summary +JobTemplates,job_templates +JobTimeout,job_timeout +JobTimers,job_timers +JobTitle,job_title +JobType,job_type +JobUpdate,job_update +JobWatermark,job_watermark +JobWorkerExecutorConfiguration,job_worker_executor_configuration +Jobs,jobs +JobsNotFound,jobs_not_found +Join,join +JoinColumn,join_column +JoinDomainInput,join_domain_input +JoinDomainOutput,join_domain_output +JoinEui,join_eui +JoinEuiFilters,join_eui_filters +JoinEventConfiguration,join_event_configuration +JoinInstruction,join_instruction +JoinKeyProperties,join_key_properties +JoinResourceTypeEventConfiguration,join_resource_type_event_configuration +JoinSource,join_source +JoinStorageSessionInput,join_storage_session_input +JoinToken,join_token +JoinType,join_type +JoinedMethod,joined_method +JoinedTimestamp,joined_timestamp +JournalKinesisStreamDescription,journal_kinesis_stream_description +JournalS3ExportDescription,journal_s3_export_description +JournalS3Exports,journal_s3_exports +JourneyActivityId,journey_activity_id +JourneyChannelSettings,journey_channel_settings +JourneyCustomMessage,journey_custom_message +JourneyDateRangeKpiResponse,journey_date_range_kpi_response +JourneyEmailMessage,journey_email_message +JourneyExecutionActivityMetricsResponse,journey_execution_activity_metrics_response +JourneyExecutionMetricsResponse,journey_execution_metrics_response +JourneyId,journey_id +JourneyLimits,journey_limits +JourneyPushMessage,journey_push_message +JourneyResponse,journey_response +JourneyRunExecutionActivityMetricsResponse,journey_run_execution_activity_metrics_response +JourneyRunExecutionMetricsResponse,journey_run_execution_metrics_response +JourneyRunResponse,journey_run_response +JourneyRunsResponse,journey_runs_response +JourneySMSMessage,journey_sms_message +JourneySchedule,journey_schedule +JourneyStateRequest,journey_state_request +JourneyTimeframeCap,journey_timeframe_cap +JourneysResponse,journeys_response +Json,json +JsonBody,json_body +JsonClassifier,json_classifier +JsonContentTypes,json_content_types +JsonFormatDescriptor,json_format_descriptor +JsonFormatRef,json_format_ref +JsonMatchPattern,json_match_pattern +JsonOptions,json_options +JsonPath,json_path +JsonTokenTypeConfiguration,json_token_type_configuration +JunctionPath,junction_path +JupyterServerAppSettings,jupyter_server_app_settings +JwksUri,jwks_uri +JwtConfiguration,jwt_configuration +JwtTokenTypeConfiguration,jwt_token_type_configuration +KBId,kb_id +KGKeyPairIds,kg_key_pair_ids +KMSAccessDeniedException,kms_access_denied_exception +KMSAccessDeniedFault,kms_access_denied_fault +KMSArn,kms_arn +KMSContext,kms_context +KMSDisabledException,kms_disabled_exception +KMSDisabledFault,kms_disabled_fault +KMSEncrypted,kms_encrypted +KMSEncryptionConfig,kms_encryption_config +KMSEncryptionContext,kms_encryption_context +KMSFault,kms_fault +KMSInternalException,kms_internal_exception +KMSInvalidKeyUsageException,kms_invalid_key_usage_exception +KMSInvalidMacException,kms_invalid_mac_exception +KMSInvalidSignatureException,kms_invalid_signature_exception +KMSInvalidStateException,kms_invalid_state_exception +KMSInvalidStateFault,kms_invalid_state_fault +KMSKey,kms_key +KMSKeyArn,kms_key_arn +KMSKeyDetails,kms_key_details +KMSKeyID,kms_key_id +KMSKeyId,kms_key_id +KMSKeyNotAccessibleFault,kms_key_not_accessible_fault +KMSMasterKeyArn,kms_master_key_arn +KMSMasterKeyID,kms_master_key_id +KMSMasterKeyId,kms_master_key_id +KMSNotFoundException,kms_not_found_exception +KMSNotFoundFault,kms_not_found_fault +KMSOptInRequired,kms_opt_in_required +KMSRequestFailedException,kms_request_failed_exception +KMSServerSideEncryption,kms_server_side_encryption +KMSServerSideEncryptionIntegration,kms_server_side_encryption_integration +KMSServerSideEncryptionIntegrationConfig,kms_server_side_encryption_integration_config +KMSThrottlingException,kms_throttling_exception +KMSThrottlingFault,kms_throttling_fault +KPIActualValueConditionalFormatting,kpi_actual_value_conditional_formatting +KPIComparisonValueConditionalFormatting,kpi_comparison_value_conditional_formatting +KPIConditionalFormatting,kpi_conditional_formatting +KPIConditionalFormattingOption,kpi_conditional_formatting_option +KPIConfiguration,kpi_configuration +KPIFieldWells,kpi_field_wells +KPIOptions,kpi_options +KPIPrimaryValueConditionalFormatting,kpi_primary_value_conditional_formatting +KPIProgressBarConditionalFormatting,kpi_progress_bar_conditional_formatting +KPISortConfiguration,kpi_sort_configuration +KPISparklineOptions,kpi_sparkline_options +KPIVisual,kpi_visual +KPIVisualLayoutOptions,kpi_visual_layout_options +KPIVisualStandardLayout,kpi_visual_standard_layout +KVSStreamStartSelector,kvs_stream_start_selector +KafkaAction,kafka_action +KafkaActionHeader,kafka_action_header +KafkaBrokerNodeId,kafka_broker_node_id +KafkaCluster,kafka_cluster +KafkaClusterClientAuthentication,kafka_cluster_client_authentication +KafkaClusterClientAuthenticationDescription,kafka_cluster_client_authentication_description +KafkaClusterDescription,kafka_cluster_description +KafkaClusterEncryptionInTransit,kafka_cluster_encryption_in_transit +KafkaClusterEncryptionInTransitDescription,kafka_cluster_encryption_in_transit_description +KafkaSettings,kafka_settings +KafkaStreamingSourceOptions,kafka_streaming_source_options +KafkaVersion,kafka_version +KafkaVersions,kafka_versions +KantarLicenseId,kantar_license_id +KantarServerUrl,kantar_server_url +KantarWatermark,kantar_watermark +KantarWatermarkSettings,kantar_watermark_settings +KbNumber,kb_number +KdcAdminPassword,kdc_admin_password +KeepAlivePeriodInSeconds,keep_alive_period_in_seconds +KeepJobFlowAliveWhenNoSteps,keep_job_flow_alive_when_no_steps +KeepSegments,keep_segments +KendraConfiguration,kendra_configuration +KerberosAttributes,kerberos_attributes +KerberosKeytab,kerberos_keytab +KerberosKrb5Conf,kerberos_krb5_conf +KerberosPrincipal,kerberos_principal +Kernel,kernel +KernelCapabilities,kernel_capabilities +KernelGatewayAppSettings,kernel_gateway_app_settings +KernelGatewayImageConfig,kernel_gateway_image_config +KernelId,kernel_id +KernelSpec,kernel_spec +KernelSpecs,kernel_specs +Key,key +KeyARN,key_arn +KeyAgreement,key_agreement +KeyAlgorithm,key_algorithm +KeyArn,key_arn +KeyAttributes,key_attributes +KeyBlockFormat,key_block_format +KeyCertSign,key_cert_sign +KeyCertificate,key_certificate +KeyCertificateChain,key_certificate_chain +KeyCheckValue,key_check_value +KeyCheckValueAlgorithm,key_check_value_algorithm +KeyClass,key_class +KeyConditionExpression,key_condition_expression +KeyConditions,key_conditions +KeyCount,key_count +KeyDetection,key_detection +KeyEncipherment,key_encipherment +KeyEncryptionAlgorithm,key_encryption_algorithm +KeyFingerprint,key_fingerprint +KeyFormat,key_format +KeyFormatVersions,key_format_versions +KeyGroup,key_group +KeyGroupAlreadyExists,key_group_already_exists +KeyGroupConfig,key_group_config +KeyGroupId,key_group_id +KeyGroupList,key_group_list +KeyGroupSummary,key_group_summary +KeyId,key_id +KeyIdentifier,key_identifier +KeyLabels,key_labels +KeyLength,key_length +KeyListEntry,key_list_entry +KeyLocation,key_location +KeyManagementServiceArn,key_management_service_arn +KeyManager,key_manager +KeyMarker,key_marker +KeyMaterial,key_material +KeyMaterialType,key_material_type +KeyMd5,key_md5 +KeyMetadata,key_metadata +KeyModesOfUse,key_modes_of_use +KeyName,key_name +KeyNames,key_names +KeyOrigin,key_origin +KeyPair,key_pair +KeyPairId,key_pair_id +KeyPairIds,key_pair_ids +KeyPairInfo,key_pair_info +KeyPairMismatchException,key_pair_mismatch_exception +KeyPairSpec,key_pair_spec +KeyPairs,key_pairs +KeyPath,key_path +KeyPattern,key_pattern +KeyPhrase,key_phrase +KeyPhrases,key_phrases +KeyPhrasesDetectionJobFilter,key_phrases_detection_job_filter +KeyPhrasesDetectionJobProperties,key_phrases_detection_job_properties +KeyPhrasesDetectionJobPropertiesList,key_phrases_detection_job_properties_list +KeyPrefix,key_prefix +KeyPrefixEquals,key_prefix_equals +KeyPrefixes,key_prefixes +KeyProviderServer,key_provider_server +KeyProviderSettings,key_provider_settings +KeyRange,key_range +KeyRotationEnabled,key_rotation_enabled +KeyRotationIntervalSeconds,key_rotation_interval_seconds +KeyRotationStatus,key_rotation_status +KeySchema,key_schema +KeySchemaElement,key_schema_element +KeySerialNumber,key_serial_number +KeySigningKey,key_signing_key +KeySigningKeyAlreadyExists,key_signing_key_already_exists +KeySigningKeyInParentDSRecord,key_signing_key_in_parent_ds_record +KeySigningKeyInUse,key_signing_key_in_use +KeySigningKeyWithActiveStatusNotFound,key_signing_key_with_active_status_not_found +KeySigningKeys,key_signing_keys +KeySpec,key_spec +KeyState,key_state +KeyStatus,key_status +KeyStoragePolicy,key_storage_policy +KeyStorageSecurityStandard,key_storage_security_standard +KeyStorePassword,key_store_password +KeySummary,key_summary +KeyTag,key_tag +KeyType,key_type +KeyUnavailableException,key_unavailable_exception +KeyUsage,key_usage +KeyUsageFlags,key_usage_flags +KeyUsageProperty,key_usage_property +KeyUsagePropertyFlags,key_usage_property_flags +KeyUsages,key_usages +KeyValue,key_value +KeyValuePair,key_value_pair +KeyValuesPair,key_values_pair +KeyframesMaxDist,keyframes_max_dist +Keys,keys +KeysAndAttributes,keys_and_attributes +KeysToDelete,keys_to_delete +KeysWithNoncompliantValues,keys_with_noncompliant_values +KeyspaceSummary,keyspace_summary +Keyword,keyword +KeywordAction,keyword_action +KeywordFilter,keyword_filter +KeywordInformation,keyword_information +KeywordMatchConfiguration,keyword_match_configuration +KeywordMessage,keyword_message +Keywords,keywords +KinesisAction,kinesis_action +KinesisConfiguration,kinesis_configuration +KinesisDataFirehose,kinesis_data_firehose +KinesisDataStream,kinesis_data_stream +KinesisDataStreamDestination,kinesis_data_stream_destination +KinesisDataStreamDestinations,kinesis_data_stream_destinations +KinesisDataStreamSinkConfiguration,kinesis_data_stream_sink_configuration +KinesisFirehoseConfig,kinesis_firehose_config +KinesisFirehoseDestination,kinesis_firehose_destination +KinesisFirehoseDestinationDetails,kinesis_firehose_destination_details +KinesisFirehoseDetails,kinesis_firehose_details +KinesisFirehoseInput,kinesis_firehose_input +KinesisFirehoseInputDescription,kinesis_firehose_input_description +KinesisFirehoseInputUpdate,kinesis_firehose_input_update +KinesisFirehoseOutput,kinesis_firehose_output +KinesisFirehoseOutputDescription,kinesis_firehose_output_description +KinesisFirehoseOutputUpdate,kinesis_firehose_output_update +KinesisParameters,kinesis_parameters +KinesisSettings,kinesis_settings +KinesisStreamARN,kinesis_stream_arn +KinesisStreamConfig,kinesis_stream_config +KinesisStreamName,kinesis_stream_name +KinesisStreamParameters,kinesis_stream_parameters +KinesisStreamSourceConfiguration,kinesis_stream_source_configuration +KinesisStreamSourceDescription,kinesis_stream_source_description +KinesisStreamingDestinationInput,kinesis_streaming_destination_input +KinesisStreamingDestinationOutput,kinesis_streaming_destination_output +KinesisStreamingSourceOptions,kinesis_streaming_source_options +KinesisStreamsInput,kinesis_streams_input +KinesisStreamsInputDescription,kinesis_streams_input_description +KinesisStreamsInputUpdate,kinesis_streams_input_update +KinesisStreamsOutput,kinesis_streams_output +KinesisStreamsOutputDescription,kinesis_streams_output_description +KinesisStreamsOutputUpdate,kinesis_streams_output_update +KinesisVideoStream,kinesis_video_stream +KinesisVideoStreamConfig,kinesis_video_stream_config +KinesisVideoStreamConfiguration,kinesis_video_stream_configuration +KinesisVideoStreamConfigurationUpdate,kinesis_video_stream_configuration_update +KinesisVideoStreamPoolConfiguration,kinesis_video_stream_pool_configuration +KinesisVideoStreamPoolSummary,kinesis_video_stream_pool_summary +KinesisVideoStreamPools,kinesis_video_stream_pools +KinesisVideoStreamRecordingSourceRuntimeConfiguration,kinesis_video_stream_recording_source_runtime_configuration +KinesisVideoStreamSourceRuntimeConfiguration,kinesis_video_stream_source_runtime_configuration +KinesisVideoStreamSourceTaskConfiguration,kinesis_video_stream_source_task_configuration +KinesisVideoStreamStartSelector,kinesis_video_stream_start_selector +Klv,klv +KlvBehavior,klv_behavior +KlvDataPids,klv_data_pids +KlvMetadata,klv_metadata +KmsArn,kms_arn +KmsDataKeyReusePeriodSeconds,kms_data_key_reuse_period_seconds +KmsEncryptionConfig,kms_encryption_config +KmsEncryptionContext,kms_encryption_context +KmsException,kms_exception +KmsGrantConfiguration,kms_grant_configuration +KmsGrantConstraints,kms_grant_constraints +KmsKey,kms_key +KmsKeyARN,kms_key_arn +KmsKeyArn,kms_key_arn +KmsKeyConfiguration,kms_key_configuration +KmsKeyDisabledException,kms_key_disabled_exception +KmsKeyId,kms_key_id +KmsKeyIdentifier,kms_key_identifier +KmsKeyIds,kms_key_ids +KmsKeyNotFoundException,kms_key_not_found_exception +KmsKeyProviderUri,kms_key_provider_uri +KmsKeyRegion,kms_key_region +KmsKeyToGrant,kms_key_to_grant +KmsKeyValidationException,kms_key_validation_exception +KmsKeysToGrant,kms_keys_to_grant +KmsMasterKeyArn,kms_master_key_arn +KmsMasterKeyId,kms_master_key_id +KnowledgeArticleConfiguration,knowledge_article_configuration +KnowledgeBaseAssociationData,knowledge_base_association_data +KnowledgeBaseData,knowledge_base_data +KnowledgeBaseSummary,knowledge_base_summary +KnownFraudsterRisk,known_fraudster_risk +KnownGender,known_gender +KpiName,kpi_name +KpiResult,kpi_result +Kubernetes,kubernetes +KubernetesApiCallAction,kubernetes_api_call_action +KubernetesAuditLogsConfiguration,kubernetes_audit_logs_configuration +KubernetesAuditLogsConfigurationResult,kubernetes_audit_logs_configuration_result +KubernetesConfiguration,kubernetes_configuration +KubernetesConfigurationResult,kubernetes_configuration_result +KubernetesDataSourceFreeTrial,kubernetes_data_source_free_trial +KubernetesDetails,kubernetes_details +KubernetesNetworkConfigRequest,kubernetes_network_config_request +KubernetesNetworkConfigResponse,kubernetes_network_config_response +KubernetesUserDetails,kubernetes_user_details +KubernetesVersion,kubernetes_version +KubernetesWorkloadDetails,kubernetes_workload_details +KxCacheStorageConfiguration,kx_cache_storage_configuration +KxChangesetListEntry,kx_changeset_list_entry +KxCluster,kx_cluster +KxCommandLineArgument,kx_command_line_argument +KxDatabaseCacheConfiguration,kx_database_cache_configuration +KxDatabaseConfiguration,kx_database_configuration +KxDatabaseListEntry,kx_database_list_entry +KxDeploymentConfiguration,kx_deployment_configuration +KxEnvironment,kx_environment +KxNode,kx_node +KxSavedownStorageConfiguration,kx_savedown_storage_configuration +KxUser,kx_user +L6Metadata,l6_metadata +L6Mode,l6_mode +LBCookieStickinessPolicies,lb_cookie_stickiness_policies +LBCookieStickinessPolicy,lb_cookie_stickiness_policy +LDAPSSettingInfo,ldaps_setting_info +LDAPSSettingsInfo,ldaps_settings_info +LDAPSStatus,ldaps_status +LDAPSStatusReason,ldaps_status_reason +LE,le +LFResourceDetails,lf_resource_details +LFTag,lf_tag +LFTagError,lf_tag_error +LFTagKeyResource,lf_tag_key_resource +LFTagOnDatabase,lf_tag_on_database +LFTagPair,lf_tag_pair +LFTagPolicy,lf_tag_policy +LFTagPolicyDetails,lf_tag_policy_details +LFTagPolicyResource,lf_tag_policy_resource +LFTags,lf_tags +LFTagsOnColumns,lf_tags_on_columns +LFTagsOnTable,lf_tags_on_table +LT,lt +Label,label +LabelAlias,label_alias +LabelAttribute,label_attribute +LabelAttributeName,label_attribute_name +LabelCategory,label_category +LabelCategoryConfigS3Uri,label_category_config_s3_uri +LabelCategoryExclusionFilters,label_category_exclusion_filters +LabelCategoryInclusionFilters,label_category_inclusion_filters +LabelColor,label_color +LabelConfiguration,label_configuration +LabelContent,label_content +LabelCount,label_count +LabelCounters,label_counters +LabelCountersForWorkteam,label_counters_for_workteam +LabelDelimiter,label_delimiter +LabelDetection,label_detection +LabelDetectionSettings,label_detection_settings +LabelExclusionFilters,label_exclusion_filters +LabelFontConfiguration,label_font_configuration +LabelGroupArn,label_group_arn +LabelGroupName,label_group_name +LabelGroupNameBeginsWith,label_group_name_begins_with +LabelGroupSummaries,label_group_summaries +LabelGroupSummary,label_group_summary +LabelHeaders,label_headers +LabelId,label_id +LabelInclusionFilters,label_inclusion_filters +LabelIndex,label_index +LabelMatchStatement,label_match_statement +LabelModelVersion,label_model_version +LabelName,label_name +LabelNameCondition,label_name_condition +LabelNamespace,label_namespace +LabelOptions,label_options +LabelParameterVersionRequest,label_parameter_version_request +LabelParameterVersionResult,label_parameter_version_result +LabelSchema,label_schema +LabelStats,label_stats +LabelSummaries,label_summaries +LabelSummary,label_summary +LabelTemplate,label_template +LabelVisibility,label_visibility +Labeled,labeled +LabeledEntries,labeled_entries +LabelingJobAlgorithmSpecificationArn,labeling_job_algorithm_specification_arn +LabelingJobAlgorithmsConfig,labeling_job_algorithms_config +LabelingJobArn,labeling_job_arn +LabelingJobDataAttributes,labeling_job_data_attributes +LabelingJobDataSource,labeling_job_data_source +LabelingJobForWorkteamSummary,labeling_job_for_workteam_summary +LabelingJobInputConfig,labeling_job_input_config +LabelingJobName,labeling_job_name +LabelingJobOutput,labeling_job_output +LabelingJobOutputConfig,labeling_job_output_config +LabelingJobResourceConfig,labeling_job_resource_config +LabelingJobS3DataSource,labeling_job_s3_data_source +LabelingJobSnsDataSource,labeling_job_sns_data_source +LabelingJobStatus,labeling_job_status +LabelingJobStoppingConditions,labeling_job_stopping_conditions +LabelingJobSummary,labeling_job_summary +LabelingJobSummaryList,labeling_job_summary_list +LabelingSetGenerationTaskRunProperties,labeling_set_generation_task_run_properties +Labels,labels +LabelsInputConfiguration,labels_input_configuration +LabelsS3InputConfiguration,labels_s3_input_configuration +Lac,lac +Lag,lag +Lags,lags +LakeFormationConfiguration,lake_formation_configuration +LakeFormationDataPermissionAsset,lake_formation_data_permission_asset +LakeFormationDataPermissionDetails,lake_formation_data_permission_details +LakeFormationDataPermissionType,lake_formation_data_permission_type +LakeFormationOptInsInfo,lake_formation_opt_ins_info +LakeFormationOptInsInfoList,lake_formation_opt_ins_info_list +Lambda,lambda +LambdaAction,lambda_action +LambdaActivity,lambda_activity +LambdaArn,lambda_arn +LambdaAuthorizerConfig,lambda_authorizer_config +LambdaAvailabilityProvider,lambda_availability_provider +LambdaCodeHook,lambda_code_hook +LambdaConfig,lambda_config +LambdaConfigType,lambda_config_type +LambdaConfiguration,lambda_configuration +LambdaConflictHandlerConfig,lambda_conflict_handler_config +LambdaConnectorProvisioningConfig,lambda_connector_provisioning_config +LambdaContainerParams,lambda_container_params +LambdaDataSourceConfig,lambda_data_source_config +LambdaDetails,lambda_details +LambdaDeviceMount,lambda_device_mount +LambdaEndpoint,lambda_endpoint +LambdaEndpointConfig,lambda_endpoint_config +LambdaEndpointInput,lambda_endpoint_input +LambdaEndpointSummary,lambda_endpoint_summary +LambdaEventSource,lambda_event_source +LambdaExecutionParameters,lambda_execution_parameters +LambdaExecutorConfiguration,lambda_executor_configuration +LambdaFunction,lambda_function +LambdaFunctionARN,lambda_function_arn +LambdaFunctionAggregation,lambda_function_aggregation +LambdaFunctionAggregationResponse,lambda_function_aggregation_response +LambdaFunctionArn,lambda_function_arn +LambdaFunctionAssociation,lambda_function_association +LambdaFunctionAssociations,lambda_function_associations +LambdaFunctionCompletedEventAttributes,lambda_function_completed_event_attributes +LambdaFunctionConfiguration,lambda_function_configuration +LambdaFunctionConfigurations,lambda_function_configurations +LambdaFunctionFailedEventAttributes,lambda_function_failed_event_attributes +LambdaFunctionFailedEventDetails,lambda_function_failed_event_details +LambdaFunctionInfo,lambda_function_info +LambdaFunctionMemoryProjectedMetric,lambda_function_memory_projected_metric +LambdaFunctionMemoryRecommendationOption,lambda_function_memory_recommendation_option +LambdaFunctionMetadata,lambda_function_metadata +LambdaFunctionName,lambda_function_name +LambdaFunctionParameters,lambda_function_parameters +LambdaFunctionRecipeSource,lambda_function_recipe_source +LambdaFunctionRecommendation,lambda_function_recommendation +LambdaFunctionRecommendationFilter,lambda_function_recommendation_filter +LambdaFunctionScheduleFailedEventDetails,lambda_function_schedule_failed_event_details +LambdaFunctionScheduledEventAttributes,lambda_function_scheduled_event_attributes +LambdaFunctionScheduledEventDetails,lambda_function_scheduled_event_details +LambdaFunctionSinkConfiguration,lambda_function_sink_configuration +LambdaFunctionStartFailedEventDetails,lambda_function_start_failed_event_details +LambdaFunctionStartedEventAttributes,lambda_function_started_event_attributes +LambdaFunctionSucceededEventDetails,lambda_function_succeeded_event_details +LambdaFunctionTimedOutEventAttributes,lambda_function_timed_out_event_attributes +LambdaFunctionTimedOutEventDetails,lambda_function_timed_out_event_details +LambdaFunctionUtilizationMetric,lambda_function_utilization_metric +LambdaFunctions,lambda_functions +LambdaInvoke,lambda_invoke +LambdaInvokeOperation,lambda_invoke_operation +LambdaLayerAggregation,lambda_layer_aggregation +LambdaLayerAggregationResponse,lambda_layer_aggregation_response +LambdaLinuxProcessParams,lambda_linux_process_params +LambdaOutput,lambda_output +LambdaOutputDescription,lambda_output_description +LambdaOutputUpdate,lambda_output_update +LambdaProvider,lambda_provider +LambdaResource,lambda_resource +LambdaResources,lambda_resources +LambdaStepMetadata,lambda_step_metadata +LambdaTarget,lambda_target +LambdaThrottledException,lambda_throttled_exception +LambdaVersion,lambda_version +LambdaVolumeMount,lambda_volume_mount +LambdaVpcConfig,lambda_vpc_config +Landmark,landmark +Landmarks,landmarks +LandsatCloudCoverLand,landsat_cloud_cover_land +LandsatCloudCoverLandInput,landsat_cloud_cover_land_input +Lang,lang +Language,language +LanguageCode,language_code +LanguageCodeControl,language_code_control +LanguageCodeItem,language_code_item +LanguageCodes,language_codes +LanguageDescription,language_description +LanguageIdSettings,language_id_settings +LanguageIdentification,language_identification +LanguageModel,language_model +LanguageModelName,language_model_name +LanguageName,language_name +LanguageNotSupportedException,language_not_supported_exception +LanguageOptions,language_options +LanguageSelectionPolicy,language_selection_policy +LanguageWithScore,language_with_score +Languages,languages +LargeTimestampGaps,large_timestamp_gaps +Last,last +LastAccessTime,last_access_time +LastAccessedAt,last_accessed_at +LastAccessedDate,last_accessed_date +LastAccessedEntity,last_accessed_entity +LastAccessedRegion,last_accessed_region +LastAccessedTime,last_accessed_time +LastActivatedBy,last_activated_by +LastActivatedTime,last_activated_time +LastActiveAt,last_active_at +LastActiveDefinition,last_active_definition +LastAddress,last_address +LastAllocation,last_allocation +LastAnalyzedTime,last_analyzed_time +LastAssociationExecutionDate,last_association_execution_date +LastAttemptDate,last_attempt_date +LastAttemptedDiscoveryTime,last_attempted_discovery_time +LastAttemptedExecutionTime,last_attempted_execution_time +LastAuditTimestamp,last_audit_timestamp +LastAuthenticated,last_authenticated +LastAuthenticatedEntity,last_authenticated_entity +LastAuthenticatedRegion,last_authenticated_region +LastAuthenticatedTime,last_authenticated_time +LastAuthorizedTime,last_authorized_time +LastAutoAdjustTime,last_auto_adjust_time +LastBackupDate,last_backup_date +LastBackupTime,last_backup_time +LastBatchTransformJob,last_batch_transform_job +LastBusinessReport,last_business_report +LastChangedDate,last_changed_date +LastCheckTimestamp,last_check_timestamp +LastCheckedTimestamp,last_checked_timestamp +LastClaimTime,last_claim_time +LastClearTime,last_clear_time +LastCollectedTime,last_collected_time +LastCommitId,last_commit_id +LastConnectionTime,last_connection_time +LastCrawl,last_crawl +LastCrawlInfo,last_crawl_info +LastDataReceived,last_data_received +LastDeactivatedTime,last_deactivated_time +LastDebugLogDeliveryStatus,last_debug_log_delivery_status +LastDebugLogDeliveryStatusReason,last_debug_log_delivery_status_reason +LastDebugLogDeliveryTime,last_debug_log_delivery_time +LastDecreaseDateTime,last_decrease_date_time +LastDeliveryChannelDeleteFailedException,last_delivery_channel_delete_failed_exception +LastDeliveryEvent,last_delivery_event +LastDeploymentConfig,last_deployment_config +LastDeploymentInfo,last_deployment_info +LastDeploymentStatusMessage,last_deployment_status_message +LastDriftCheckTimestamp,last_drift_check_timestamp +LastEditedTimestamp,last_edited_timestamp +LastEngagementEvent,last_engagement_event +LastError,last_error +LastErrorCode,last_error_code +LastErrorMessage,last_error_message +LastEvaluatedBackupArn,last_evaluated_backup_arn +LastEvaluatedDate,last_evaluated_date +LastEvaluatedGlobalTableName,last_evaluated_global_table_name +LastEvaluatedKey,last_evaluated_key +LastEvaluatedShardId,last_evaluated_shard_id +LastEvaluatedStreamArn,last_evaluated_stream_arn +LastEvaluatedTableName,last_evaluated_table_name +LastEvaluatedTime,last_evaluated_time +LastEvaluationState,last_evaluation_state +LastEvaluationTime,last_evaluation_time +LastExecutionDate,last_execution_date +LastExecutionTime,last_execution_time +LastFailedEvaluationTime,last_failed_evaluation_time +LastFailedInvocationTime,last_failed_invocation_time +LastFailureMessage,last_failure_message +LastFailureTime,last_failure_time +LastFrameClippingBehavior,last_frame_clipping_behavior +LastFreshStart,last_fresh_start +LastGeneratedReportDate,last_generated_report_date +LastHealthCheckTime,last_health_check_time +LastHealthCheckTimestamp,last_health_check_timestamp +LastIncreaseDateTime,last_increase_date_time +LastIngestStateChange,last_ingest_state_change +LastInventoryDate,last_inventory_date +LastKeyGenerationTimestamp,last_key_generation_timestamp +LastKnownUserConnectionTimestamp,last_known_user_connection_timestamp +LastLaunchedTime,last_launched_time +LastMaintenanceApplied,last_maintenance_applied +LastMessageTimestamp,last_message_timestamp +LastModificationDate,last_modification_date +LastModificationTime,last_modification_time +LastModified,last_modified +LastModifiedAfter,last_modified_after +LastModifiedAt,last_modified_at +LastModifiedBefore,last_modified_before +LastModifiedBy,last_modified_by +LastModifiedDate,last_modified_date +LastModifiedDateCondition,last_modified_date_condition +LastModifiedDateTime,last_modified_date_time +LastModifiedOn,last_modified_on +LastModifiedTime,last_modified_time +LastModifiedTimeAfter,last_modified_time_after +LastModifiedTimeBefore,last_modified_time_before +LastModifiedTimestamp,last_modified_timestamp +LastModifiedUser,last_modified_user +LastMonitoringExecutionSummary,last_monitoring_execution_summary +LastName,last_name +LastNoRebootInstallOperationTime,last_no_reboot_install_operation_time +LastObservedAt,last_observed_at +LastOperationId,last_operation_id +LastPingDateTime,last_ping_date_time +LastProcessingResult,last_processing_result +LastProvisioningRecordId,last_provisioning_record_id +LastPublishedTime,last_published_time +LastRecordId,last_record_id +LastRecorderStatus,last_recorder_status +LastRecurrenceTime,last_recurrence_time +LastRefreshDate,last_refresh_date +LastReplicatedTimestamp,last_replicated_timestamp +LastReportGenerationExecutionError,last_report_generation_execution_error +LastReportGenerationTime,last_report_generation_time +LastReportedAt,last_reported_at +LastRequestedDateTime,last_requested_date_time +LastRestoreTime,last_restore_time +LastRotatedDate,last_rotated_date +LastRuleModification,last_rule_modification +LastRun,last_run +LastRunDetails,last_run_details +LastRunErrorStatus,last_run_error_status +LastRunFailureReason,last_run_failure_reason +LastRunStatus,last_run_status +LastRunSummary,last_run_summary +LastRunTime,last_run_time +LastRuntimeSeconds,last_runtime_seconds +LastSeen,last_seen +LastSeenDateTime,last_seen_date_time +LastSeenTime,last_seen_time +LastServiceErrorId,last_service_error_id +LastSoftwareUpdate,last_software_update +LastStarted,last_started +LastStateChangeAt,last_state_change_at +LastStateChangeReason,last_state_change_reason +LastStatus,last_status +LastStatusChange,last_status_change +LastStatusCheckDate,last_status_check_date +LastStatusMessage,last_status_message +LastStatusUpdateTime,last_status_update_time +LastStopped,last_stopped +LastSuccessfulAllocationTime,last_successful_allocation_time +LastSuccessfulAssociationExecutionDate,last_successful_association_execution_date +LastSuccessfulDeliveryTime,last_successful_delivery_time +LastSuccessfulDiscoveryTime,last_successful_discovery_time +LastSuccessfulEvaluationTime,last_successful_evaluation_time +LastSuccessfulExecutionDate,last_successful_execution_date +LastSuccessfulExecutionTime,last_successful_execution_time +LastSuccessfulInvocationTime,last_successful_invocation_time +LastSuccessfulMetadataSyncTime,last_successful_metadata_sync_time +LastSuccessfulProvisioningRecordId,last_successful_provisioning_record_id +LastSuccessfulSyncProvisioningArtifactId,last_successful_sync_provisioning_artifact_id +LastSuccessfulSyncTime,last_successful_sync_time +LastSuccessfullyAppliedConfigurations,last_successfully_applied_configurations +LastSuccessfullyAppliedConfigurationsVersion,last_successfully_applied_configurations_version +LastSuggestionsBuildTime,last_suggestions_build_time +LastSync,last_sync +LastSyncCount,last_sync_count +LastSyncStatus,last_sync_status +LastSyncStatusMessage,last_sync_status_message +LastSyncTime,last_sync_time +LastTieringOperationStatus,last_tiering_operation_status +LastTieringOperationStatusDetail,last_tiering_operation_status_detail +LastTieringProgress,last_tiering_progress +LastTieringStartTime,last_tiering_start_time +LastUpdate,last_update +LastUpdateAssociationDate,last_update_association_date +LastUpdateCompletedTime,last_update_completed_time +LastUpdateDate,last_update_date +LastUpdateDateTime,last_update_date_time +LastUpdateRequestedTime,last_update_requested_time +LastUpdateStatus,last_update_status +LastUpdateStatusReason,last_update_status_reason +LastUpdateStatusReasonCode,last_update_status_reason_code +LastUpdateTime,last_update_time +LastUpdateTimestamp,last_update_timestamp +LastUpdateToPayPerRequestDateTime,last_update_to_pay_per_request_date_time +LastUpdated,last_updated +LastUpdatedAt,last_updated_at +LastUpdatedBy,last_updated_by +LastUpdatedDate,last_updated_date +LastUpdatedDateTime,last_updated_date_time +LastUpdatedTime,last_updated_time +LastUpdatedTimeStamp,last_updated_time_stamp +LastUpdatedTimestamp,last_updated_timestamp +LastUplinkReceivedAt,last_uplink_received_at +LastUploaderStatus,last_uploader_status +LastUsedDate,last_used_date +LastUserActivityTimestamp,last_user_activity_timestamp +LastVPCAssociation,last_vpc_association +LastWritten,last_written +Lat,lat +LatLonOptions,lat_lon_options +LateDataRule,late_data_rule +LateDataRuleConfiguration,late_data_rule_configuration +Latency,latency +LatencyInMilliseconds,latency_in_milliseconds +LatencyInMs,latency_in_ms +LatencyMs,latency_ms +LatencyOther,latency_other +LatencyRead,latency_read +LatencyWrite,latency_write +Latest,latest +LatestAlternateSoftware,latest_alternate_software +LatestCloudWatchLogsDeliveryError,latest_cloud_watch_logs_delivery_error +LatestCloudWatchLogsDeliveryTime,latest_cloud_watch_logs_delivery_time +LatestDeliveryAttemptSucceeded,latest_delivery_attempt_succeeded +LatestDeliveryAttemptTime,latest_delivery_attempt_time +LatestDeliveryError,latest_delivery_error +LatestDeliveryTime,latest_delivery_time +LatestDeviceJob,latest_device_job +LatestDigestDeliveryError,latest_digest_delivery_error +LatestDigestDeliveryTime,latest_digest_delivery_time +LatestFlywheelIteration,latest_flywheel_iteration +LatestHeartbeat,latest_heartbeat +LatestHeartbeatAfter,latest_heartbeat_after +LatestInference,latest_inference +LatestInferenceResult,latest_inference_result +LatestIngestionAttemptEventID,latest_ingestion_attempt_event_id +LatestIngestionAttemptTime,latest_ingestion_attempt_time +LatestIngestionErrorCode,latest_ingestion_error_code +LatestIngestionSuccessEventID,latest_ingestion_success_event_id +LatestIngestionSuccessTime,latest_ingestion_success_time +LatestLensVersion,latest_lens_version +LatestMatchingVersion,latest_matching_version +LatestMetadataSyncStatus,latest_metadata_sync_status +LatestMetadataSyncStatusMessage,latest_metadata_sync_status_message +LatestNotificationAttemptSucceeded,latest_notification_attempt_succeeded +LatestNotificationAttemptTime,latest_notification_attempt_time +LatestNotificationError,latest_notification_error +LatestNotificationTime,latest_notification_time +LatestOnly,latest_only +LatestProfileVersion,latest_profile_version +LatestPublicVersion,latest_public_version +LatestRestorableDateTime,latest_restorable_date_time +LatestRestorableTime,latest_restorable_time +LatestRevision,latest_revision +LatestSampleTime,latest_sample_time +LatestScheduledRetrainingAvailableDataInDays,latest_scheduled_retraining_available_data_in_days +LatestScheduledRetrainingFailedReason,latest_scheduled_retraining_failed_reason +LatestScheduledRetrainingModelVersion,latest_scheduled_retraining_model_version +LatestScheduledRetrainingStartTime,latest_scheduled_retraining_start_time +LatestScheduledRetrainingStatus,latest_scheduled_retraining_status +LatestSchemaVersion,latest_schema_version +LatestSoftware,latest_software +LatestStreamArn,latest_stream_arn +LatestStreamLabel,latest_stream_label +LatestTime,latest_time +LatestUpdateAttemptAt,latest_update_attempt_at +LatestUpdateAttemptAuxiliaryDataLocation,latest_update_attempt_auxiliary_data_location +LatestUpdateAttemptStatus,latest_update_attempt_status +LatestUsageTimestamp,latest_usage_timestamp +LatestVersion,latest_version +LatestVersionArn,latest_version_arn +LatestVersionCreatedAt,latest_version_created_at +LatestVersionId,latest_version_id +LatestVersionMetadata,latest_version_metadata +LatestVersionName,latest_version_name +LatestVersionNumber,latest_version_number +LatestVersionSize,latest_version_size +LatestVersionStatus,latest_version_status +Latitude,latitude +Launch,launch +LaunchAction,launch_action +LaunchActionParameter,launch_action_parameter +LaunchActionRun,launch_action_run +LaunchActionsRequestFilters,launch_actions_request_filters +LaunchActionsStatus,launch_actions_status +LaunchAppRequest,launch_app_request +LaunchCommands,launch_commands +LaunchConfig,launch_config +LaunchConfiguration,launch_configuration +LaunchConfigurationARN,launch_configuration_arn +LaunchConfigurationName,launch_configuration_name +LaunchConfigurationNameType,launch_configuration_name_type +LaunchConfigurationNames,launch_configuration_names +LaunchConfigurationNamesType,launch_configuration_names_type +LaunchConfigurationTemplate,launch_configuration_template +LaunchConfigurations,launch_configurations +LaunchConfigurationsType,launch_configurations_type +LaunchDate,launch_date +LaunchDetails,launch_details +LaunchExecution,launch_execution +LaunchGroup,launch_group +LaunchGroupConfig,launch_group_config +LaunchOverrides,launch_overrides +LaunchParameters,launch_parameters +LaunchPath,launch_path +LaunchPathSummaries,launch_path_summaries +LaunchPathSummary,launch_path_summary +LaunchPaths,launch_paths +LaunchPermission,launch_permission +LaunchPermissionConfiguration,launch_permission_configuration +LaunchPermissionModifications,launch_permission_modifications +LaunchPermissions,launch_permissions +LaunchProfile,launch_profile +LaunchProfileInitialization,launch_profile_initialization +LaunchProfileInitializationActiveDirectory,launch_profile_initialization_active_directory +LaunchProfileInitializationScript,launch_profile_initialization_script +LaunchProfileMembership,launch_profile_membership +LaunchRoleArn,launch_role_arn +LaunchSpecification,launch_specification +LaunchSpecifications,launch_specifications +LaunchTemplate,launch_template +LaunchTemplateAndOverrides,launch_template_and_overrides +LaunchTemplateAndOverridesResponse,launch_template_and_overrides_response +LaunchTemplateBlockDeviceMapping,launch_template_block_device_mapping +LaunchTemplateBlockDeviceMappingRequest,launch_template_block_device_mapping_request +LaunchTemplateCapacityReservationSpecificationRequest,launch_template_capacity_reservation_specification_request +LaunchTemplateCapacityReservationSpecificationResponse,launch_template_capacity_reservation_specification_response +LaunchTemplateConfig,launch_template_config +LaunchTemplateConfigs,launch_template_configs +LaunchTemplateConfiguration,launch_template_configuration +LaunchTemplateCpuOptions,launch_template_cpu_options +LaunchTemplateCpuOptionsRequest,launch_template_cpu_options_request +LaunchTemplateData,launch_template_data +LaunchTemplateDiskConf,launch_template_disk_conf +LaunchTemplateEbsBlockDevice,launch_template_ebs_block_device +LaunchTemplateEbsBlockDeviceRequest,launch_template_ebs_block_device_request +LaunchTemplateElasticInferenceAccelerator,launch_template_elastic_inference_accelerator +LaunchTemplateElasticInferenceAcceleratorResponse,launch_template_elastic_inference_accelerator_response +LaunchTemplateEnclaveOptions,launch_template_enclave_options +LaunchTemplateEnclaveOptionsRequest,launch_template_enclave_options_request +LaunchTemplateHibernationOptions,launch_template_hibernation_options +LaunchTemplateHibernationOptionsRequest,launch_template_hibernation_options_request +LaunchTemplateIamInstanceProfileSpecification,launch_template_iam_instance_profile_specification +LaunchTemplateIamInstanceProfileSpecificationRequest,launch_template_iam_instance_profile_specification_request +LaunchTemplateId,launch_template_id +LaunchTemplateIds,launch_template_ids +LaunchTemplateInstanceMaintenanceOptions,launch_template_instance_maintenance_options +LaunchTemplateInstanceMaintenanceOptionsRequest,launch_template_instance_maintenance_options_request +LaunchTemplateInstanceMarketOptions,launch_template_instance_market_options +LaunchTemplateInstanceMarketOptionsRequest,launch_template_instance_market_options_request +LaunchTemplateInstanceMetadataOptions,launch_template_instance_metadata_options +LaunchTemplateInstanceMetadataOptionsRequest,launch_template_instance_metadata_options_request +LaunchTemplateInstanceNetworkInterfaceSpecification,launch_template_instance_network_interface_specification +LaunchTemplateInstanceNetworkInterfaceSpecificationRequest,launch_template_instance_network_interface_specification_request +LaunchTemplateLicenseConfiguration,launch_template_license_configuration +LaunchTemplateLicenseConfigurationRequest,launch_template_license_configuration_request +LaunchTemplateName,launch_template_name +LaunchTemplateNames,launch_template_names +LaunchTemplateOverrides,launch_template_overrides +LaunchTemplatePlacement,launch_template_placement +LaunchTemplatePlacementRequest,launch_template_placement_request +LaunchTemplatePrivateDnsNameOptions,launch_template_private_dns_name_options +LaunchTemplatePrivateDnsNameOptionsRequest,launch_template_private_dns_name_options_request +LaunchTemplateSpecification,launch_template_specification +LaunchTemplateSpotMarketOptions,launch_template_spot_market_options +LaunchTemplateSpotMarketOptionsRequest,launch_template_spot_market_options_request +LaunchTemplateTagSpecification,launch_template_tag_specification +LaunchTemplateTagSpecificationRequest,launch_template_tag_specification_request +LaunchTemplateVersion,launch_template_version +LaunchTemplateVersions,launch_template_versions +LaunchTemplates,launch_templates +LaunchTemplatesMonitoring,launch_templates_monitoring +LaunchTemplatesMonitoringRequest,launch_templates_monitoring_request +LaunchTime,launch_time +LaunchType,launch_type +LaunchedAt,launched_at +LaunchedAvailabilityZone,launched_availability_zone +LaunchedInstance,launched_instance +Layer,layer +LayerAlreadyExistsException,layer_already_exists_exception +LayerArn,layer_arn +LayerFailure,layer_failure +LayerId,layer_id +LayerIds,layer_ids +LayerInaccessibleException,layer_inaccessible_exception +LayerName,layer_name +LayerPartTooSmallException,layer_part_too_small_exception +LayerVersionArn,layer_version_arn +LayerVersionContentInput,layer_version_content_input +LayerVersionContentOutput,layer_version_content_output +LayerVersions,layer_versions +LayerVersionsListItem,layer_versions_list_item +Layers,layers +LayersCount,layers_count +LayersListItem,layers_list_item +LayersNotFoundException,layers_not_found_exception +Layout,layout +LayoutConfiguration,layout_configuration +LayoutSections,layout_sections +LayoutSummary,layout_summary +Layouts,layouts +LbCookieStickinessPolicies,lb_cookie_stickiness_policies +LcmOperationInfo,lcm_operation_info +LdPreloadValue,ld_preload_value +LdapServerMetadata,ldap_server_metadata +LdapServerMetadataInput,ldap_server_metadata_input +LdapServerMetadataOutput,ldap_server_metadata_output +LdifContent,ldif_content +LeaseExpirationTime,lease_expiration_time +LeaseId,lease_id +LedgerEncryptionDescription,ledger_encryption_description +LedgerName,ledger_name +LedgerSummary,ledger_summary +Ledgers,ledgers +Left,left +LeftJoinKeyProperties,left_join_key_properties +LeftOffset,left_offset +LeftOperand,left_operand +Leg,leg +LegGeometry,leg_geometry +LegalHold,legal_hold +LegalHoldArn,legal_hold_arn +LegalHoldId,legal_hold_id +LegalHolds,legal_holds +Legend,legend +LegendOptions,legend_options +Legs,legs +LendingDetection,lending_detection +LendingDocument,lending_document +LendingField,lending_field +LendingFields,lending_fields +LendingResult,lending_result +LendingSummary,lending_summary +Length,length +Lens,lens +LensAlias,lens_alias +LensAliases,lens_aliases +LensArn,lens_arn +LensJSON,lens_json +LensMetric,lens_metric +LensName,lens_name +LensNamePrefix,lens_name_prefix +LensNotes,lens_notes +LensReview,lens_review +LensReviewReport,lens_review_report +LensReviewSummaries,lens_review_summaries +LensReviewSummary,lens_review_summary +LensShareSummaries,lens_share_summaries +LensShareSummary,lens_share_summary +LensStatus,lens_status +LensSummaries,lens_summaries +LensSummary,lens_summary +LensType,lens_type +LensUpgradeSummary,lens_upgrade_summary +LensVersion,lens_version +Lenses,lenses +LensesAppliedCount,lenses_applied_count +LessThan,less_than +LessThanOrEqual,less_than_or_equal +LessThanOrEquals,less_than_or_equals +Level,level +LevelFive,level_five +LevelFour,level_four +LevelId,level_id +LevelOne,level_one +LevelThree,level_three +LevelTwo,level_two +Lex,lex +LexBot,lex_bot +LexBotAliasArn,lex_bot_alias_arn +LexBotConfig,lex_bot_config +LexBots,lex_bots +LexConfiguration,lex_configuration +LexRegion,lex_region +LexTranscriptFilter,lex_transcript_filter +LexV2Bot,lex_v2_bot +LexVersion,lex_version +LexemesCount,lexemes_count +Lexicon,lexicon +LexiconArn,lexicon_arn +LexiconAttributes,lexicon_attributes +LexiconDescription,lexicon_description +LexiconNames,lexicon_names +LexiconNotFoundException,lexicon_not_found_exception +LexiconSizeExceededException,lexicon_size_exceeded_exception +Lexicons,lexicons +LfeControl,lfe_control +LfeFilter,lfe_filter +LibraryPath,library_path +License,license +LicenseAcquisitionUrl,license_acquisition_url +LicenseArn,license_arn +LicenseArns,license_arns +LicenseBody,license_body +LicenseConfiguration,license_configuration +LicenseConfigurationArn,license_configuration_arn +LicenseConfigurationArns,license_configuration_arns +LicenseConfigurationAssociation,license_configuration_association +LicenseConfigurationAssociations,license_configuration_associations +LicenseConfigurationId,license_configuration_id +LicenseConfigurationRequest,license_configuration_request +LicenseConfigurationStatus,license_configuration_status +LicenseConfigurationUsage,license_configuration_usage +LicenseConfigurationUsageList,license_configuration_usage_list +LicenseConfigurations,license_configurations +LicenseConsumptionToken,license_consumption_token +LicenseConversionContext,license_conversion_context +LicenseConversionTask,license_conversion_task +LicenseConversionTaskId,license_conversion_task_id +LicenseConversionTasks,license_conversion_tasks +LicenseConversionTime,license_conversion_time +LicenseCount,license_count +LicenseCountHardLimit,license_count_hard_limit +LicenseCountingType,license_counting_type +LicenseInfo,license_info +LicenseManagerReportGeneratorArn,license_manager_report_generator_arn +LicenseManagerResourceShareArn,license_manager_resource_share_arn +LicenseMetadata,license_metadata +LicenseModel,license_model +LicenseName,license_name +LicenseOperationFailure,license_operation_failure +LicenseOperationFailureList,license_operation_failure_list +LicenseRecommendation,license_recommendation +LicenseRecommendationFilter,license_recommendation_filter +LicenseRecommendationOption,license_recommendation_option +LicenseRules,license_rules +LicenseServiceConfiguration,license_service_configuration +LicenseSet,license_set +LicenseSpecification,license_specification +LicenseSpecifications,license_specifications +LicenseType,license_type +LicenseUrl,license_url +LicenseUsage,license_usage +LicenseUsageException,license_usage_exception +Licenses,licenses +Licensing,licensing +LifeCycle,life_cycle +LifeCycleLastCutover,life_cycle_last_cutover +LifeCycleLastCutoverFinalized,life_cycle_last_cutover_finalized +LifeCycleLastCutoverInitiated,life_cycle_last_cutover_initiated +LifeCycleLastCutoverReverted,life_cycle_last_cutover_reverted +LifeCycleLastLaunch,life_cycle_last_launch +LifeCycleLastLaunchInitiated,life_cycle_last_launch_initiated +LifeCycleLastTest,life_cycle_last_test +LifeCycleLastTestFinalized,life_cycle_last_test_finalized +LifeCycleLastTestInitiated,life_cycle_last_test_initiated +LifeCycleLastTestReverted,life_cycle_last_test_reverted +LifeCycleState,life_cycle_state +LifeCycleStatus,life_cycle_status +LifeCycleStatusFilter,life_cycle_status_filter +Lifecycle,lifecycle +LifecycleActionResult,lifecycle_action_result +LifecycleActionToken,lifecycle_action_token +LifecycleConfigArn,lifecycle_config_arn +LifecycleConfigArns,lifecycle_config_arns +LifecycleConfigName,lifecycle_config_name +LifecycleConfiguration,lifecycle_configuration +LifecycleConfigurationDescription,lifecycle_configuration_description +LifecycleEvent,lifecycle_event +LifecycleEventAlreadyCompletedException,lifecycle_event_already_completed_exception +LifecycleEventConfiguration,lifecycle_event_configuration +LifecycleExpiration,lifecycle_expiration +LifecycleHook,lifecycle_hook +LifecycleHookLimitExceededException,lifecycle_hook_limit_exceeded_exception +LifecycleHookName,lifecycle_hook_name +LifecycleHookNames,lifecycle_hook_names +LifecycleHookSpecification,lifecycle_hook_specification +LifecycleHookSpecificationList,lifecycle_hook_specification_list +LifecycleHookTypes,lifecycle_hook_types +LifecycleHooks,lifecycle_hooks +LifecyclePolicies,lifecycle_policies +LifecyclePolicy,lifecycle_policy +LifecyclePolicyNotFoundException,lifecycle_policy_not_found_exception +LifecyclePolicyPreviewFilter,lifecycle_policy_preview_filter +LifecyclePolicyPreviewInProgressException,lifecycle_policy_preview_in_progress_exception +LifecyclePolicyPreviewNotFoundException,lifecycle_policy_preview_not_found_exception +LifecyclePolicyPreviewResult,lifecycle_policy_preview_result +LifecyclePolicyPreviewSummary,lifecycle_policy_preview_summary +LifecyclePolicyRuleAction,lifecycle_policy_rule_action +LifecyclePolicySummary,lifecycle_policy_summary +LifecyclePolicyText,lifecycle_policy_text +LifecycleRule,lifecycle_rule +LifecycleRuleAndOperator,lifecycle_rule_and_operator +LifecycleRuleFilter,lifecycle_rule_filter +LifecycleState,lifecycle_state +LifecycleTransition,lifecycle_transition +LifecycleTransitionReason,lifecycle_transition_reason +LifetimeInSeconds,lifetime_in_seconds +LightsailDistribution,lightsail_distribution +Limit,limit +LimitCode,limit_code +LimitExceeded,limit_exceeded +LimitExceededException,limit_exceeded_exception +LimitExceededFault,limit_exceeded_fault +LimitName,limit_name +LimitPrice,limit_price +LimitType,limit_type +LimitValue,limit_value +LimitValues,limit_values +Limitation,limitation +Limitations,limitations +Limits,limits +LimitsByRole,limits_by_role +LimitsExceeded,limits_exceeded +LimitsExceededException,limits_exceeded_exception +Line,line +LineChartAggregatedFieldWells,line_chart_aggregated_field_wells +LineChartConfiguration,line_chart_configuration +LineChartDefaultSeriesSettings,line_chart_default_series_settings +LineChartFieldWells,line_chart_field_wells +LineChartLineStyleSettings,line_chart_line_style_settings +LineChartMarkerStyleSettings,line_chart_marker_style_settings +LineChartSeriesSettings,line_chart_series_settings +LineChartSortConfiguration,line_chart_sort_configuration +LineChartVisual,line_chart_visual +LineDataLabels,line_data_labels +LineInterpolation,line_interpolation +LineItem,line_item +LineItemAssetInformation,line_item_asset_information +LineItemCountsByStatus,line_item_counts_by_status +LineItemExpenseFields,line_item_expense_fields +LineItemFields,line_item_fields +LineItemFilter,line_item_filter +LineItemFilters,line_item_filters +LineItemGroup,line_item_group +LineItemGroupIndex,line_item_group_index +LineItemGroups,line_item_groups +LineItemId,line_item_id +LineItemRequest,line_item_request +LineItems,line_items +LineNumber,line_number +LineRange,line_range +LineRanges,line_ranges +LineSeriesAxisDisplayOptions,line_series_axis_display_options +LineString,line_string +LineStyle,line_style +LineStyleSettings,line_style_settings +LineTime,line_time +LineValues,line_values +LineVisibility,line_visibility +LineWidth,line_width +Lineage,lineage +LineageConfiguration,lineage_configuration +LineageGroupArn,lineage_group_arn +LineageGroupName,lineage_group_name +LineageGroupSummaries,lineage_group_summaries +LineageGroupSummary,lineage_group_summary +LineageObject,lineage_object +LineageType,lineage_type +LineageTypes,lineage_types +Linear,linear +LinearStepSize,linear_step_size +Link,link +LinkArn,link_arn +LinkAssociation,link_association +LinkAssociationState,link_association_state +LinkAssociations,link_associations +LinkAttributeAction,link_attribute_action +LinkAttributeUpdate,link_attribute_update +LinkConfiguration,link_configuration +LinkId,link_id +LinkIds,link_ids +LinkName,link_name +LinkNameAlreadyInUseException,link_name_already_in_use_exception +LinkSharingConfiguration,link_sharing_configuration +LinkSpecifiers,link_specifiers +LinkToDataSetColumn,link_to_data_set_column +LinkedAccount,linked_account +LinkedAccountIds,linked_account_ids +LinkedAccountName,linked_account_name +LinkedAccounts,linked_accounts +LinkedService,linked_service +Links,links +LinuxParameters,linux_parameters +LinuxSubscriptionsDiscovery,linux_subscriptions_discovery +LinuxSubscriptionsDiscoverySettings,linux_subscriptions_discovery_settings +List,list +ListAPIKeysRequest,list_api_keys_request +ListAPIKeysResponse,list_api_keys_response +ListAWSDefaultServiceQuotasRequest,list_aws_default_service_quotas_request +ListAWSDefaultServiceQuotasResponse,list_aws_default_service_quotas_response +ListAWSServiceAccessForOrganizationRequest,list_aws_service_access_for_organization_request +ListAWSServiceAccessForOrganizationResponse,list_aws_service_access_for_organization_response +ListAcceleratorsRequest,list_accelerators_request +ListAcceleratorsResponse,list_accelerators_response +ListAcceptedPortfolioSharesInput,list_accepted_portfolio_shares_input +ListAcceptedPortfolioSharesOutput,list_accepted_portfolio_shares_output +ListAccessControlConfigurationsRequest,list_access_control_configurations_request +ListAccessControlConfigurationsResponse,list_access_control_configurations_response +ListAccessControlRulesRequest,list_access_control_rules_request +ListAccessControlRulesResponse,list_access_control_rules_response +ListAccessKeysRequest,list_access_keys_request +ListAccessKeysResponse,list_access_keys_response +ListAccessLogSubscriptionsRequest,list_access_log_subscriptions_request +ListAccessLogSubscriptionsResponse,list_access_log_subscriptions_response +ListAccessPointsForObjectLambdaRequest,list_access_points_for_object_lambda_request +ListAccessPointsForObjectLambdaResult,list_access_points_for_object_lambda_result +ListAccessPointsRequest,list_access_points_request +ListAccessPointsResult,list_access_points_result +ListAccessPoliciesRequest,list_access_policies_request +ListAccessPoliciesResponse,list_access_policies_response +ListAccessPreviewFindingsRequest,list_access_preview_findings_request +ListAccessPreviewFindingsResponse,list_access_preview_findings_response +ListAccessPreviewsRequest,list_access_previews_request +ListAccessPreviewsResponse,list_access_previews_response +ListAccessTokensRequest,list_access_tokens_request +ListAccessTokensResponse,list_access_tokens_response +ListAccessesRequest,list_accesses_request +ListAccessesResponse,list_accesses_response +ListAccessorsInput,list_accessors_input +ListAccessorsOutput,list_accessors_output +ListAccountAliasesRequest,list_account_aliases_request +ListAccountAliasesResponse,list_account_aliases_response +ListAccountAssignmentCreationStatusRequest,list_account_assignment_creation_status_request +ListAccountAssignmentCreationStatusResponse,list_account_assignment_creation_status_response +ListAccountAssignmentDeletionStatusRequest,list_account_assignment_deletion_status_request +ListAccountAssignmentDeletionStatusResponse,list_account_assignment_deletion_status_response +ListAccountAssignmentsRequest,list_account_assignments_request +ListAccountAssignmentsResponse,list_account_assignments_response +ListAccountAssociationsFilter,list_account_associations_filter +ListAccountAssociationsInput,list_account_associations_input +ListAccountAssociationsOutput,list_account_associations_output +ListAccountIntegrationsRequest,list_account_integrations_request +ListAccountIntegrationsResponse,list_account_integrations_response +ListAccountPermissionsRequest,list_account_permissions_request +ListAccountPermissionsResponse,list_account_permissions_response +ListAccountRolesRequest,list_account_roles_request +ListAccountRolesResponse,list_account_roles_response +ListAccountSettingsRequest,list_account_settings_request +ListAccountSettingsResponse,list_account_settings_response +ListAccountsForParentRequest,list_accounts_for_parent_request +ListAccountsForParentResponse,list_accounts_for_parent_response +ListAccountsForProvisionedPermissionSetRequest,list_accounts_for_provisioned_permission_set_request +ListAccountsForProvisionedPermissionSetResponse,list_accounts_for_provisioned_permission_set_response +ListAccountsRequest,list_accounts_request +ListAccountsResponse,list_accounts_response +ListActionExecutionsInput,list_action_executions_input +ListActionExecutionsOutput,list_action_executions_output +ListActionTypesInput,list_action_types_input +ListActionTypesOutput,list_action_types_output +ListActionsRequest,list_actions_request +ListActionsResponse,list_actions_response +ListActivatedRulesInRuleGroupRequest,list_activated_rules_in_rule_group_request +ListActivatedRulesInRuleGroupResponse,list_activated_rules_in_rule_group_response +ListActiveViolationsRequest,list_active_violations_request +ListActiveViolationsResponse,list_active_violations_response +ListActivitiesInput,list_activities_input +ListActivitiesOutput,list_activities_output +ListActivityTypesInput,list_activity_types_input +ListAddonsRequest,list_addons_request +ListAddonsResponse,list_addons_response +ListAdminAccountsForOrganizationRequest,list_admin_accounts_for_organization_request +ListAdminAccountsForOrganizationResponse,list_admin_accounts_for_organization_response +ListAdminsManagingAccountRequest,list_admins_managing_account_request +ListAdminsManagingAccountResponse,list_admins_managing_account_response +ListAgentStatusRequest,list_agent_status_request +ListAgentStatusResponse,list_agent_status_response +ListAgentsRequest,list_agents_request +ListAgentsResponse,list_agents_response +ListAggregateDiscoveredResourcesRequest,list_aggregate_discovered_resources_request +ListAggregateDiscoveredResourcesResponse,list_aggregate_discovered_resources_response +ListAggregatedUtterancesRequest,list_aggregated_utterances_request +ListAggregatedUtterancesResponse,list_aggregated_utterances_response +ListAgreementsRequest,list_agreements_request +ListAgreementsResponse,list_agreements_response +ListAlarmModelVersionsRequest,list_alarm_model_versions_request +ListAlarmModelVersionsResponse,list_alarm_model_versions_response +ListAlarmModelsRequest,list_alarm_models_request +ListAlarmModelsResponse,list_alarm_models_response +ListAlarmRecommendationsRequest,list_alarm_recommendations_request +ListAlarmRecommendationsResponse,list_alarm_recommendations_response +ListAlarmsRequest,list_alarms_request +ListAlarmsResponse,list_alarms_response +ListAlertsRequest,list_alerts_request +ListAlertsResponse,list_alerts_response +ListAlgorithmsInput,list_algorithms_input +ListAlgorithmsOutput,list_algorithms_output +ListAliasesInput,list_aliases_input +ListAliasesOutput,list_aliases_output +ListAliasesRequest,list_aliases_request +ListAliasesResponse,list_aliases_response +ListAllowListsRequest,list_allow_lists_request +ListAllowListsResponse,list_allow_lists_response +ListAllowedNodeTypeModificationsMessage,list_allowed_node_type_modifications_message +ListAllowedNodeTypeUpdatesRequest,list_allowed_node_type_updates_request +ListAllowedNodeTypeUpdatesResponse,list_allowed_node_type_updates_response +ListAnalysesRequest,list_analyses_request +ListAnalysesResponse,list_analyses_response +ListAnalysisTemplatesInput,list_analysis_templates_input +ListAnalysisTemplatesOutput,list_analysis_templates_output +ListAnalyzedResourcesRequest,list_analyzed_resources_request +ListAnalyzedResourcesResponse,list_analyzed_resources_response +ListAnalyzersRequest,list_analyzers_request +ListAnalyzersResponse,list_analyzers_response +ListAnnotationImportJobsFilter,list_annotation_import_jobs_filter +ListAnnotationImportJobsRequest,list_annotation_import_jobs_request +ListAnnotationImportJobsResponse,list_annotation_import_jobs_response +ListAnnotationStoreVersionsFilter,list_annotation_store_versions_filter +ListAnnotationStoreVersionsRequest,list_annotation_store_versions_request +ListAnnotationStoreVersionsResponse,list_annotation_store_versions_response +ListAnnotationStoresFilter,list_annotation_stores_filter +ListAnnotationStoresRequest,list_annotation_stores_request +ListAnnotationStoresResponse,list_annotation_stores_response +ListAnomaliesForInsightFilters,list_anomalies_for_insight_filters +ListAnomaliesForInsightRequest,list_anomalies_for_insight_request +ListAnomaliesForInsightResponse,list_anomalies_for_insight_response +ListAnomalousLogGroupsRequest,list_anomalous_log_groups_request +ListAnomalousLogGroupsResponse,list_anomalous_log_groups_response +ListAnomalyDetectorsRequest,list_anomaly_detectors_request +ListAnomalyDetectorsResponse,list_anomaly_detectors_response +ListAnomalyGroupRelatedMetricsRequest,list_anomaly_group_related_metrics_request +ListAnomalyGroupRelatedMetricsResponse,list_anomaly_group_related_metrics_response +ListAnomalyGroupSummariesRequest,list_anomaly_group_summaries_request +ListAnomalyGroupSummariesResponse,list_anomaly_group_summaries_response +ListAnomalyGroupTimeSeriesRequest,list_anomaly_group_time_series_request +ListAnomalyGroupTimeSeriesResponse,list_anomaly_group_time_series_response +ListAnswersInput,list_answers_input +ListAnswersOutput,list_answers_output +ListApiDestinationsRequest,list_api_destinations_request +ListApiDestinationsResponse,list_api_destinations_response +ListApiKeysRequest,list_api_keys_request +ListApiKeysResponse,list_api_keys_response +ListAppAssessmentComplianceDriftsRequest,list_app_assessment_compliance_drifts_request +ListAppAssessmentComplianceDriftsResponse,list_app_assessment_compliance_drifts_response +ListAppAssessmentsRequest,list_app_assessments_request +ListAppAssessmentsResponse,list_app_assessments_response +ListAppAuthorizationsRequest,list_app_authorizations_request +ListAppAuthorizationsResponse,list_app_authorizations_response +ListAppBundlesRequest,list_app_bundles_request +ListAppBundlesResponse,list_app_bundles_response +ListAppComponentCompliancesRequest,list_app_component_compliances_request +ListAppComponentCompliancesResponse,list_app_component_compliances_response +ListAppComponentRecommendationsRequest,list_app_component_recommendations_request +ListAppComponentRecommendationsResponse,list_app_component_recommendations_response +ListAppImageConfigsRequest,list_app_image_configs_request +ListAppImageConfigsResponse,list_app_image_configs_response +ListAppInputSourcesRequest,list_app_input_sources_request +ListAppInputSourcesResponse,list_app_input_sources_response +ListAppInstanceAdminsRequest,list_app_instance_admins_request +ListAppInstanceAdminsResponse,list_app_instance_admins_response +ListAppInstanceBotsRequest,list_app_instance_bots_request +ListAppInstanceBotsResponse,list_app_instance_bots_response +ListAppInstanceUserEndpointsRequest,list_app_instance_user_endpoints_request +ListAppInstanceUserEndpointsResponse,list_app_instance_user_endpoints_response +ListAppInstanceUsersRequest,list_app_instance_users_request +ListAppInstanceUsersResponse,list_app_instance_users_response +ListAppInstancesRequest,list_app_instances_request +ListAppInstancesResponse,list_app_instances_response +ListAppMonitorsRequest,list_app_monitors_request +ListAppMonitorsResponse,list_app_monitors_response +ListAppVersionAppComponentsRequest,list_app_version_app_components_request +ListAppVersionAppComponentsResponse,list_app_version_app_components_response +ListAppVersionResourceMappingsRequest,list_app_version_resource_mappings_request +ListAppVersionResourceMappingsResponse,list_app_version_resource_mappings_response +ListAppVersionResourcesRequest,list_app_version_resources_request +ListAppVersionResourcesResponse,list_app_version_resources_response +ListAppVersionsRequest,list_app_versions_request +ListAppVersionsResponse,list_app_versions_response +ListApplicationComponentsRequest,list_application_components_request +ListApplicationComponentsResponse,list_application_components_response +ListApplicationDPUSizesInput,list_application_dpu_sizes_input +ListApplicationDPUSizesOutput,list_application_dpu_sizes_output +ListApplicationDependenciesRequest,list_application_dependencies_request +ListApplicationDependenciesResponse,list_application_dependencies_response +ListApplicationInstanceDependenciesRequest,list_application_instance_dependencies_request +ListApplicationInstanceDependenciesResponse,list_application_instance_dependencies_response +ListApplicationInstanceNodeInstancesRequest,list_application_instance_node_instances_request +ListApplicationInstanceNodeInstancesResponse,list_application_instance_node_instances_response +ListApplicationInstancesRequest,list_application_instances_request +ListApplicationInstancesResponse,list_application_instances_response +ListApplicationRevisionsInput,list_application_revisions_input +ListApplicationRevisionsOutput,list_application_revisions_output +ListApplicationSnapshotsRequest,list_application_snapshots_request +ListApplicationSnapshotsResponse,list_application_snapshots_response +ListApplicationStatesRequest,list_application_states_request +ListApplicationStatesResult,list_application_states_result +ListApplicationVersionsRequest,list_application_versions_request +ListApplicationVersionsResponse,list_application_versions_response +ListApplicationsInput,list_applications_input +ListApplicationsOutput,list_applications_output +ListApplicationsRequest,list_applications_request +ListApplicationsRequestFilters,list_applications_request_filters +ListApplicationsResponse,list_applications_response +ListAppliedSchemaArnsRequest,list_applied_schema_arns_request +ListAppliedSchemaArnsResponse,list_applied_schema_arns_response +ListApprovalRuleTemplatesInput,list_approval_rule_templates_input +ListApprovalRuleTemplatesOutput,list_approval_rule_templates_output +ListApprovedOriginsRequest,list_approved_origins_request +ListApprovedOriginsResponse,list_approved_origins_response +ListAppsInput,list_apps_input +ListAppsListsRequest,list_apps_lists_request +ListAppsListsResponse,list_apps_lists_response +ListAppsOutput,list_apps_output +ListAppsRequest,list_apps_request +ListAppsResponse,list_apps_response +ListAppsResult,list_apps_result +ListArchiveRulesRequest,list_archive_rules_request +ListArchiveRulesResponse,list_archive_rules_response +ListArchivesRequest,list_archives_request +ListArchivesResponse,list_archives_response +ListArn,list_arn +ListArtifactsRequest,list_artifacts_request +ListArtifactsResponse,list_artifacts_response +ListArtifactsResult,list_artifacts_result +ListAssessmentControlInsightsByControlDomainRequest,list_assessment_control_insights_by_control_domain_request +ListAssessmentControlInsightsByControlDomainResponse,list_assessment_control_insights_by_control_domain_response +ListAssessmentFrameworkShareRequestsRequest,list_assessment_framework_share_requests_request +ListAssessmentFrameworkShareRequestsResponse,list_assessment_framework_share_requests_response +ListAssessmentFrameworksRequest,list_assessment_frameworks_request +ListAssessmentFrameworksResponse,list_assessment_frameworks_response +ListAssessmentReportsRequest,list_assessment_reports_request +ListAssessmentReportsResponse,list_assessment_reports_response +ListAssessmentRunAgentsRequest,list_assessment_run_agents_request +ListAssessmentRunAgentsResponse,list_assessment_run_agents_response +ListAssessmentRunsRequest,list_assessment_runs_request +ListAssessmentRunsResponse,list_assessment_runs_response +ListAssessmentTargetsRequest,list_assessment_targets_request +ListAssessmentTargetsResponse,list_assessment_targets_response +ListAssessmentTemplatesRequest,list_assessment_templates_request +ListAssessmentTemplatesResponse,list_assessment_templates_response +ListAssessmentsRequest,list_assessments_request +ListAssessmentsResponse,list_assessments_response +ListAssetBundleExportJobsRequest,list_asset_bundle_export_jobs_request +ListAssetBundleExportJobsResponse,list_asset_bundle_export_jobs_response +ListAssetBundleImportJobsRequest,list_asset_bundle_import_jobs_request +ListAssetBundleImportJobsResponse,list_asset_bundle_import_jobs_response +ListAssetModelPropertiesRequest,list_asset_model_properties_request +ListAssetModelPropertiesResponse,list_asset_model_properties_response +ListAssetModelsRequest,list_asset_models_request +ListAssetModelsResponse,list_asset_models_response +ListAssetPropertiesRequest,list_asset_properties_request +ListAssetPropertiesResponse,list_asset_properties_response +ListAssetRelationshipsRequest,list_asset_relationships_request +ListAssetRelationshipsResponse,list_asset_relationships_response +ListAssetsInput,list_assets_input +ListAssetsOutput,list_assets_output +ListAssetsRequest,list_assets_request +ListAssetsResponse,list_assets_response +ListAssignmentsForHITRequest,list_assignments_for_hit_request +ListAssignmentsForHITResponse,list_assignments_for_hit_response +ListAssistantAssociationsRequest,list_assistant_associations_request +ListAssistantAssociationsResponse,list_assistant_associations_response +ListAssistantsRequest,list_assistants_request +ListAssistantsResponse,list_assistants_response +ListAssociatedApprovalRuleTemplatesForRepositoryInput,list_associated_approval_rule_templates_for_repository_input +ListAssociatedApprovalRuleTemplatesForRepositoryOutput,list_associated_approval_rule_templates_for_repository_output +ListAssociatedAssetsRequest,list_associated_assets_request +ListAssociatedAssetsResponse,list_associated_assets_response +ListAssociatedAttributeGroupsRequest,list_associated_attribute_groups_request +ListAssociatedAttributeGroupsResponse,list_associated_attribute_groups_response +ListAssociatedFleetsRequest,list_associated_fleets_request +ListAssociatedFleetsResult,list_associated_fleets_result +ListAssociatedGroupsRequest,list_associated_groups_request +ListAssociatedGroupsResponse,list_associated_groups_response +ListAssociatedResourcesRequest,list_associated_resources_request +ListAssociatedResourcesResponse,list_associated_resources_response +ListAssociatedRoute53HealthChecksRequest,list_associated_route53_health_checks_request +ListAssociatedRoute53HealthChecksResponse,list_associated_route53_health_checks_response +ListAssociatedStacksRequest,list_associated_stacks_request +ListAssociatedStacksResult,list_associated_stacks_result +ListAssociationVersionsRequest,list_association_versions_request +ListAssociationVersionsResult,list_association_versions_result +ListAssociationsForLicenseConfigurationRequest,list_associations_for_license_configuration_request +ListAssociationsForLicenseConfigurationResponse,list_associations_for_license_configuration_response +ListAssociationsRequest,list_associations_request +ListAssociationsResponse,list_associations_response +ListAssociationsResult,list_associations_result +ListAttachedGroupPoliciesRequest,list_attached_group_policies_request +ListAttachedGroupPoliciesResponse,list_attached_group_policies_response +ListAttachedIndices,list_attached_indices +ListAttachedIndicesRequest,list_attached_indices_request +ListAttachedIndicesResponse,list_attached_indices_response +ListAttachedLinksInput,list_attached_links_input +ListAttachedLinksItem,list_attached_links_item +ListAttachedLinksOutput,list_attached_links_output +ListAttachedPoliciesRequest,list_attached_policies_request +ListAttachedPoliciesResponse,list_attached_policies_response +ListAttachedRolePoliciesRequest,list_attached_role_policies_request +ListAttachedRolePoliciesResponse,list_attached_role_policies_response +ListAttachedUserPoliciesRequest,list_attached_user_policies_request +ListAttachedUserPoliciesResponse,list_attached_user_policies_response +ListAttachmentsRequest,list_attachments_request +ListAttachmentsResponse,list_attachments_response +ListAttacksRequest,list_attacks_request +ListAttacksResponse,list_attacks_response +ListAttendeeTagsRequest,list_attendee_tags_request +ListAttendeeTagsResponse,list_attendee_tags_response +ListAttendeesRequest,list_attendees_request +ListAttendeesResponse,list_attendees_response +ListAttributeGroupsForApplicationRequest,list_attribute_groups_for_application_request +ListAttributeGroupsForApplicationResponse,list_attribute_groups_for_application_response +ListAttributeGroupsRequest,list_attribute_groups_request +ListAttributeGroupsResponse,list_attribute_groups_response +ListAttributesRequest,list_attributes_request +ListAttributesResponse,list_attributes_response +ListAuditFindingsRequest,list_audit_findings_request +ListAuditFindingsResponse,list_audit_findings_response +ListAuditMitigationActionsExecutionsRequest,list_audit_mitigation_actions_executions_request +ListAuditMitigationActionsExecutionsResponse,list_audit_mitigation_actions_executions_response +ListAuditMitigationActionsTasksRequest,list_audit_mitigation_actions_tasks_request +ListAuditMitigationActionsTasksResponse,list_audit_mitigation_actions_tasks_response +ListAuditSuppressionsRequest,list_audit_suppressions_request +ListAuditSuppressionsResponse,list_audit_suppressions_response +ListAuditTasksRequest,list_audit_tasks_request +ListAuditTasksResponse,list_audit_tasks_response +ListAuthorizersRequest,list_authorizers_request +ListAuthorizersResponse,list_authorizers_response +ListAutoMLJobsRequest,list_auto_ml_jobs_request +ListAutoMLJobsResponse,list_auto_ml_jobs_response +ListAutoScalingConfigurationsRequest,list_auto_scaling_configurations_request +ListAutoScalingConfigurationsResponse,list_auto_scaling_configurations_response +ListAutomaticTapeCreationPoliciesInput,list_automatic_tape_creation_policies_input +ListAutomaticTapeCreationPoliciesOutput,list_automatic_tape_creation_policies_output +ListAutomationRulesRequest,list_automation_rules_request +ListAutomationRulesResponse,list_automation_rules_response +ListAvailabilityConfigurationsRequest,list_availability_configurations_request +ListAvailabilityConfigurationsResponse,list_availability_configurations_response +ListAvailableManagedRuleGroupVersionsRequest,list_available_managed_rule_group_versions_request +ListAvailableManagedRuleGroupVersionsResponse,list_available_managed_rule_group_versions_response +ListAvailableManagedRuleGroupsRequest,list_available_managed_rule_groups_request +ListAvailableManagedRuleGroupsResponse,list_available_managed_rule_groups_response +ListAvailableManagementCidrRangesRequest,list_available_management_cidr_ranges_request +ListAvailableManagementCidrRangesResult,list_available_management_cidr_ranges_result +ListAvailableResourceDimensionsRequest,list_available_resource_dimensions_request +ListAvailableResourceDimensionsResponse,list_available_resource_dimensions_response +ListAvailableResourceMetricsRequest,list_available_resource_metrics_request +ListAvailableResourceMetricsResponse,list_available_resource_metrics_response +ListAvailableSolutionStacksResultMessage,list_available_solution_stacks_result_message +ListAvailableVoiceConnectorRegionsResponse,list_available_voice_connector_regions_response +ListAvailableZonesResponse,list_available_zones_response +ListBackendEnvironmentsRequest,list_backend_environments_request +ListBackendEnvironmentsResult,list_backend_environments_result +ListBackendJobsRequest,list_backend_jobs_request +ListBackendJobsResponse,list_backend_jobs_response +ListBackupJobsInput,list_backup_jobs_input +ListBackupJobsOutput,list_backup_jobs_output +ListBackupPlanTemplatesInput,list_backup_plan_templates_input +ListBackupPlanTemplatesOutput,list_backup_plan_templates_output +ListBackupPlanVersionsInput,list_backup_plan_versions_input +ListBackupPlanVersionsOutput,list_backup_plan_versions_output +ListBackupPlansInput,list_backup_plans_input +ListBackupPlansOutput,list_backup_plans_output +ListBackupSelectionsInput,list_backup_selections_input +ListBackupSelectionsOutput,list_backup_selections_output +ListBackupVaultsInput,list_backup_vaults_input +ListBackupVaultsOutput,list_backup_vaults_output +ListBackupsInput,list_backups_input +ListBackupsOutput,list_backups_output +ListBatchInferenceJobsRequest,list_batch_inference_jobs_request +ListBatchInferenceJobsResponse,list_batch_inference_jobs_response +ListBatchJobDefinitionsRequest,list_batch_job_definitions_request +ListBatchJobDefinitionsResponse,list_batch_job_definitions_response +ListBatchJobExecutionsRequest,list_batch_job_executions_request +ListBatchJobExecutionsResponse,list_batch_job_executions_response +ListBatchLoadTasksRequest,list_batch_load_tasks_request +ListBatchLoadTasksResponse,list_batch_load_tasks_response +ListBatchSegmentJobsRequest,list_batch_segment_jobs_request +ListBatchSegmentJobsResponse,list_batch_segment_jobs_response +ListBillingGroupAccountGrouping,list_billing_group_account_grouping +ListBillingGroupCostReportsFilter,list_billing_group_cost_reports_filter +ListBillingGroupCostReportsInput,list_billing_group_cost_reports_input +ListBillingGroupCostReportsOutput,list_billing_group_cost_reports_output +ListBillingGroupsFilter,list_billing_groups_filter +ListBillingGroupsInput,list_billing_groups_input +ListBillingGroupsOutput,list_billing_groups_output +ListBillingGroupsRequest,list_billing_groups_request +ListBillingGroupsResponse,list_billing_groups_response +ListBlueprintsRequest,list_blueprints_request +ListBlueprintsResponse,list_blueprints_response +ListBonusPaymentsRequest,list_bonus_payments_request +ListBonusPaymentsResponse,list_bonus_payments_response +ListBootstrapActionsInput,list_bootstrap_actions_input +ListBootstrapActionsOutput,list_bootstrap_actions_output +ListBotAliasesRequest,list_bot_aliases_request +ListBotAliasesResponse,list_bot_aliases_response +ListBotLocalesRequest,list_bot_locales_request +ListBotLocalesResponse,list_bot_locales_response +ListBotRecommendationsRequest,list_bot_recommendations_request +ListBotRecommendationsResponse,list_bot_recommendations_response +ListBotVersionsRequest,list_bot_versions_request +ListBotVersionsResponse,list_bot_versions_response +ListBotsRequest,list_bots_request +ListBotsResponse,list_bots_response +ListBranchesInput,list_branches_input +ListBranchesOutput,list_branches_output +ListBranchesRequest,list_branches_request +ListBranchesResult,list_branches_result +ListBridgesRequest,list_bridges_request +ListBridgesResponse,list_bridges_response +ListBrokersRequest,list_brokers_request +ListBrokersResponse,list_brokers_response +ListBrowserSettingsRequest,list_browser_settings_request +ListBrowserSettingsResponse,list_browser_settings_response +ListBucketAnalyticsConfigurationsOutput,list_bucket_analytics_configurations_output +ListBucketAnalyticsConfigurationsRequest,list_bucket_analytics_configurations_request +ListBucketIntelligentTieringConfigurationsOutput,list_bucket_intelligent_tiering_configurations_output +ListBucketIntelligentTieringConfigurationsRequest,list_bucket_intelligent_tiering_configurations_request +ListBucketInventoryConfigurationsOutput,list_bucket_inventory_configurations_output +ListBucketInventoryConfigurationsRequest,list_bucket_inventory_configurations_request +ListBucketMetricsConfigurationsOutput,list_bucket_metrics_configurations_output +ListBucketMetricsConfigurationsRequest,list_bucket_metrics_configurations_request +ListBucketsOutput,list_buckets_output +ListBudgetsForResourceInput,list_budgets_for_resource_input +ListBudgetsForResourceOutput,list_budgets_for_resource_output +ListBuildBatchesForProjectInput,list_build_batches_for_project_input +ListBuildBatchesForProjectOutput,list_build_batches_for_project_output +ListBuildBatchesInput,list_build_batches_input +ListBuildBatchesOutput,list_build_batches_output +ListBuildsForProjectInput,list_builds_for_project_input +ListBuildsForProjectOutput,list_builds_for_project_output +ListBuildsInput,list_builds_input +ListBuildsOutput,list_builds_output +ListBuiltInIntentsRequest,list_built_in_intents_request +ListBuiltInIntentsResponse,list_built_in_intents_response +ListBuiltInSlotTypesRequest,list_built_in_slot_types_request +ListBuiltInSlotTypesResponse,list_built_in_slot_types_response +ListBulkDeploymentDetailedReportsRequest,list_bulk_deployment_detailed_reports_request +ListBulkDeploymentDetailedReportsResponse,list_bulk_deployment_detailed_reports_response +ListBulkDeploymentsRequest,list_bulk_deployments_request +ListBulkDeploymentsResponse,list_bulk_deployments_response +ListBulkImportJobsRequest,list_bulk_import_jobs_request +ListBulkImportJobsResponse,list_bulk_import_jobs_response +ListBundlesRequest,list_bundles_request +ListBundlesResult,list_bundles_result +ListBusinessReportSchedulesRequest,list_business_report_schedules_request +ListBusinessReportSchedulesResponse,list_business_report_schedules_response +ListBy,list_by +ListByoipCidrsRequest,list_byoip_cidrs_request +ListByoipCidrsResponse,list_byoip_cidrs_response +ListByteMatchSetsRequest,list_byte_match_sets_request +ListByteMatchSetsResponse,list_byte_match_sets_response +ListCACertificatesRequest,list_ca_certificates_request +ListCACertificatesResponse,list_ca_certificates_response +ListCachePoliciesRequest,list_cache_policies_request +ListCachePoliciesResult,list_cache_policies_result +ListCalculatedAttributeDefinitionItem,list_calculated_attribute_definition_item +ListCalculatedAttributeDefinitionsRequest,list_calculated_attribute_definitions_request +ListCalculatedAttributeDefinitionsResponse,list_calculated_attribute_definitions_response +ListCalculatedAttributeForProfileItem,list_calculated_attribute_for_profile_item +ListCalculatedAttributesForProfileRequest,list_calculated_attributes_for_profile_request +ListCalculatedAttributesForProfileResponse,list_calculated_attributes_for_profile_response +ListCalculationExecutionsRequest,list_calculation_executions_request +ListCalculationExecutionsResponse,list_calculation_executions_response +ListCallAnalyticsCategoriesRequest,list_call_analytics_categories_request +ListCallAnalyticsCategoriesResponse,list_call_analytics_categories_response +ListCallAnalyticsJobsRequest,list_call_analytics_jobs_request +ListCallAnalyticsJobsResponse,list_call_analytics_jobs_response +ListCampaignsRequest,list_campaigns_request +ListCampaignsResponse,list_campaigns_response +ListCandidatesForAutoMLJobRequest,list_candidates_for_auto_ml_job_request +ListCandidatesForAutoMLJobResponse,list_candidates_for_auto_ml_job_response +ListCapacityReservationsInput,list_capacity_reservations_input +ListCapacityReservationsOutput,list_capacity_reservations_output +ListCasesForContactRequest,list_cases_for_contact_request +ListCasesForContactResponse,list_cases_for_contact_response +ListCatalogItemsInput,list_catalog_items_input +ListCatalogItemsOutput,list_catalog_items_output +ListCellsRequest,list_cells_request +ListCellsResponse,list_cells_response +ListCertificateAuthoritiesRequest,list_certificate_authorities_request +ListCertificateAuthoritiesResponse,list_certificate_authorities_response +ListCertificatesByCARequest,list_certificates_by_ca_request +ListCertificatesByCAResponse,list_certificates_by_ca_response +ListCertificatesRequest,list_certificates_request +ListCertificatesResponse,list_certificates_response +ListCertificatesResult,list_certificates_result +ListChangeSetsInput,list_change_sets_input +ListChangeSetsOutput,list_change_sets_output +ListChangeSetsRequest,list_change_sets_request +ListChangeSetsResponse,list_change_sets_response +ListChangedBlocksRequest,list_changed_blocks_request +ListChangedBlocksResponse,list_changed_blocks_response +ListChangesetsRequest,list_changesets_request +ListChangesetsResponse,list_changesets_response +ListChannelBansRequest,list_channel_bans_request +ListChannelBansResponse,list_channel_bans_response +ListChannelFlowsRequest,list_channel_flows_request +ListChannelFlowsResponse,list_channel_flows_response +ListChannelGroupsRequest,list_channel_groups_request +ListChannelGroupsResponse,list_channel_groups_response +ListChannelMembershipsForAppInstanceUserRequest,list_channel_memberships_for_app_instance_user_request +ListChannelMembershipsForAppInstanceUserResponse,list_channel_memberships_for_app_instance_user_response +ListChannelMembershipsRequest,list_channel_memberships_request +ListChannelMembershipsResponse,list_channel_memberships_response +ListChannelMessagesRequest,list_channel_messages_request +ListChannelMessagesResponse,list_channel_messages_response +ListChannelModeratorsRequest,list_channel_moderators_request +ListChannelModeratorsResponse,list_channel_moderators_response +ListChannelsAssociatedWithChannelFlowRequest,list_channels_associated_with_channel_flow_request +ListChannelsAssociatedWithChannelFlowResponse,list_channels_associated_with_channel_flow_response +ListChannelsModeratedByAppInstanceUserRequest,list_channels_moderated_by_app_instance_user_request +ListChannelsModeratedByAppInstanceUserResponse,list_channels_moderated_by_app_instance_user_response +ListChannelsRequest,list_channels_request +ListChannelsResponse,list_channels_response +ListCheckDetailsInput,list_check_details_input +ListCheckDetailsOutput,list_check_details_output +ListCheckSummariesInput,list_check_summaries_input +ListCheckSummariesOutput,list_check_summaries_output +ListChildrenRequest,list_children_request +ListChildrenResponse,list_children_response +ListChunksInput,list_chunks_input +ListChunksOutput,list_chunks_output +ListCidrBlocksRequest,list_cidr_blocks_request +ListCidrBlocksResponse,list_cidr_blocks_response +ListCidrCollectionsRequest,list_cidr_collections_request +ListCidrCollectionsResponse,list_cidr_collections_response +ListCidrLocationsRequest,list_cidr_locations_request +ListCidrLocationsResponse,list_cidr_locations_response +ListClassificationJobsRequest,list_classification_jobs_request +ListClassificationJobsResponse,list_classification_jobs_response +ListClassificationScopesRequest,list_classification_scopes_request +ListClassificationScopesResponse,list_classification_scopes_response +ListClientDevicesAssociatedWithCoreDeviceRequest,list_client_devices_associated_with_core_device_request +ListClientDevicesAssociatedWithCoreDeviceResponse,list_client_devices_associated_with_core_device_response +ListClientVpcConnectionsRequest,list_client_vpc_connections_request +ListClientVpcConnectionsResponse,list_client_vpc_connections_response +ListClosedWorkflowExecutionsInput,list_closed_workflow_executions_input +ListCloudFrontOriginAccessIdentitiesRequest,list_cloud_front_origin_access_identities_request +ListCloudFrontOriginAccessIdentitiesResult,list_cloud_front_origin_access_identities_result +ListClusterJobsRequest,list_cluster_jobs_request +ListClusterJobsResult,list_cluster_jobs_result +ListClusterOperationsRequest,list_cluster_operations_request +ListClusterOperationsResponse,list_cluster_operations_response +ListClusterOperationsV2Request,list_cluster_operations_v2_request +ListClusterOperationsV2Response,list_cluster_operations_v2_response +ListClusterSnapshotsInput,list_cluster_snapshots_input +ListClusterSnapshotsOutput,list_cluster_snapshots_output +ListClustersInput,list_clusters_input +ListClustersOutput,list_clusters_output +ListClustersRequest,list_clusters_request +ListClustersResponse,list_clusters_response +ListClustersResult,list_clusters_result +ListClustersV2Request,list_clusters_v2_request +ListClustersV2Response,list_clusters_v2_response +ListCodeRepositoriesInput,list_code_repositories_input +ListCodeRepositoriesOutput,list_code_repositories_output +ListCodeReviewsRequest,list_code_reviews_request +ListCodeReviewsResponse,list_code_reviews_response +ListCodeSigningConfigsRequest,list_code_signing_configs_request +ListCodeSigningConfigsResponse,list_code_signing_configs_response +ListCodegenJobsRequest,list_codegen_jobs_request +ListCodegenJobsResponse,list_codegen_jobs_response +ListCollaborationAnalysisTemplatesInput,list_collaboration_analysis_templates_input +ListCollaborationAnalysisTemplatesOutput,list_collaboration_analysis_templates_output +ListCollaborationsInput,list_collaborations_input +ListCollaborationsOutput,list_collaborations_output +ListCollectionsRequest,list_collections_request +ListCollectionsResponse,list_collections_response +ListCollectorsRequest,list_collectors_request +ListCollectorsResponse,list_collectors_response +ListCommandInvocationsRequest,list_command_invocations_request +ListCommandInvocationsResult,list_command_invocations_result +ListCommandsRequest,list_commands_request +ListCommandsResult,list_commands_result +ListCompatibleImagesRequest,list_compatible_images_request +ListCompatibleImagesResult,list_compatible_images_result +ListCompilationJobsRequest,list_compilation_jobs_request +ListCompilationJobsResponse,list_compilation_jobs_response +ListComplianceItemsRequest,list_compliance_items_request +ListComplianceItemsResult,list_compliance_items_result +ListComplianceStatusRequest,list_compliance_status_request +ListComplianceStatusResponse,list_compliance_status_response +ListComplianceSummariesRequest,list_compliance_summaries_request +ListComplianceSummariesResult,list_compliance_summaries_result +ListComponentBuildVersionsRequest,list_component_build_versions_request +ListComponentBuildVersionsResponse,list_component_build_versions_response +ListComponentOutputsInput,list_component_outputs_input +ListComponentOutputsOutput,list_component_outputs_output +ListComponentProvisionedResourcesInput,list_component_provisioned_resources_input +ListComponentProvisionedResourcesOutput,list_component_provisioned_resources_output +ListComponentTypesRequest,list_component_types_request +ListComponentTypesResponse,list_component_types_response +ListComponentVersionsRequest,list_component_versions_request +ListComponentVersionsResponse,list_component_versions_response +ListComponentsInput,list_components_input +ListComponentsOutput,list_components_output +ListComponentsRequest,list_components_request +ListComponentsResponse,list_components_response +ListComputeInput,list_compute_input +ListComputeOutput,list_compute_output +ListConferenceProvidersRequest,list_conference_providers_request +ListConferenceProvidersResponse,list_conference_providers_response +ListConfigsRequest,list_configs_request +ListConfigsResponse,list_configs_response +ListConfigurationHistoryRequest,list_configuration_history_request +ListConfigurationHistoryResponse,list_configuration_history_response +ListConfigurationProfilesRequest,list_configuration_profiles_request +ListConfigurationRevisionsRequest,list_configuration_revisions_request +ListConfigurationRevisionsResponse,list_configuration_revisions_response +ListConfigurationSetsRequest,list_configuration_sets_request +ListConfigurationSetsResponse,list_configuration_sets_response +ListConfigurationsRequest,list_configurations_request +ListConfigurationsResponse,list_configurations_response +ListConfiguredTableAssociationsInput,list_configured_table_associations_input +ListConfiguredTableAssociationsOutput,list_configured_table_associations_output +ListConfiguredTablesInput,list_configured_tables_input +ListConfiguredTablesOutput,list_configured_tables_output +ListConflictingAliasesRequest,list_conflicting_aliases_request +ListConflictingAliasesResult,list_conflicting_aliases_result +ListConformancePackComplianceScoresRequest,list_conformance_pack_compliance_scores_request +ListConformancePackComplianceScoresResponse,list_conformance_pack_compliance_scores_response +ListConnectPeersRequest,list_connect_peers_request +ListConnectPeersResponse,list_connect_peers_response +ListConnectionsInput,list_connections_input +ListConnectionsOutput,list_connections_output +ListConnectionsRequest,list_connections_request +ListConnectionsResponse,list_connections_response +ListConnectorDefinitionVersionsRequest,list_connector_definition_versions_request +ListConnectorDefinitionVersionsResponse,list_connector_definition_versions_response +ListConnectorDefinitionsRequest,list_connector_definitions_request +ListConnectorDefinitionsResponse,list_connector_definitions_response +ListConnectorEntitiesRequest,list_connector_entities_request +ListConnectorEntitiesResponse,list_connector_entities_response +ListConnectorsRequest,list_connectors_request +ListConnectorsResponse,list_connectors_response +ListConstraintsForPortfolioInput,list_constraints_for_portfolio_input +ListConstraintsForPortfolioOutput,list_constraints_for_portfolio_output +ListContactChannelsRequest,list_contact_channels_request +ListContactChannelsResult,list_contact_channels_result +ListContactEvaluationsRequest,list_contact_evaluations_request +ListContactEvaluationsResponse,list_contact_evaluations_response +ListContactFlowModulesRequest,list_contact_flow_modules_request +ListContactFlowModulesResponse,list_contact_flow_modules_response +ListContactFlowsRequest,list_contact_flows_request +ListContactFlowsResponse,list_contact_flows_response +ListContactListsRequest,list_contact_lists_request +ListContactListsResponse,list_contact_lists_response +ListContactReferencesRequest,list_contact_references_request +ListContactReferencesResponse,list_contact_references_response +ListContactsFilter,list_contacts_filter +ListContactsRequest,list_contacts_request +ListContactsResponse,list_contacts_response +ListContactsResult,list_contacts_result +ListContainerInstancesRequest,list_container_instances_request +ListContainerInstancesResponse,list_container_instances_response +ListContainerRecipesRequest,list_container_recipes_request +ListContainerRecipesResponse,list_container_recipes_response +ListContainersInput,list_containers_input +ListContainersOutput,list_containers_output +ListContentsRequest,list_contents_request +ListContentsResponse,list_contents_response +ListContextsRequest,list_contexts_request +ListContextsResponse,list_contexts_response +ListContinuousDeploymentPoliciesRequest,list_continuous_deployment_policies_request +ListContinuousDeploymentPoliciesResult,list_continuous_deployment_policies_result +ListContributorInsightsInput,list_contributor_insights_input +ListContributorInsightsOutput,list_contributor_insights_output +ListControlDisplayOptions,list_control_display_options +ListControlDomainInsightsByAssessmentRequest,list_control_domain_insights_by_assessment_request +ListControlDomainInsightsByAssessmentResponse,list_control_domain_insights_by_assessment_response +ListControlDomainInsightsRequest,list_control_domain_insights_request +ListControlDomainInsightsResponse,list_control_domain_insights_response +ListControlInsightsByControlDomainRequest,list_control_insights_by_control_domain_request +ListControlInsightsByControlDomainResponse,list_control_insights_by_control_domain_response +ListControlPanelsRequest,list_control_panels_request +ListControlPanelsResponse,list_control_panels_response +ListControlSearchOptions,list_control_search_options +ListControlSelectAllOptions,list_control_select_all_options +ListControlsRequest,list_controls_request +ListControlsResponse,list_controls_response +ListCopyJobsInput,list_copy_jobs_input +ListCopyJobsOutput,list_copy_jobs_output +ListCoreDefinitionVersionsRequest,list_core_definition_versions_request +ListCoreDefinitionVersionsResponse,list_core_definition_versions_response +ListCoreDefinitionsRequest,list_core_definitions_request +ListCoreDefinitionsResponse,list_core_definitions_response +ListCoreDevicesRequest,list_core_devices_request +ListCoreDevicesResponse,list_core_devices_response +ListCoreNetworkPolicyVersionsRequest,list_core_network_policy_versions_request +ListCoreNetworkPolicyVersionsResponse,list_core_network_policy_versions_response +ListCoreNetworksRequest,list_core_networks_request +ListCoreNetworksResponse,list_core_networks_response +ListCostAllocationTagsRequest,list_cost_allocation_tags_request +ListCostAllocationTagsResponse,list_cost_allocation_tags_response +ListCostCategoryDefinitionsRequest,list_cost_category_definitions_request +ListCostCategoryDefinitionsResponse,list_cost_category_definitions_response +ListCoverageRequest,list_coverage_request +ListCoverageResponse,list_coverage_response +ListCoverageStatisticsRequest,list_coverage_statistics_request +ListCoverageStatisticsResponse,list_coverage_statistics_response +ListCrawlersRequest,list_crawlers_request +ListCrawlersResponse,list_crawlers_response +ListCrawlsRequest,list_crawls_request +ListCrawlsResponse,list_crawls_response +ListCreateAccountStatusRequest,list_create_account_status_request +ListCreateAccountStatusResponse,list_create_account_status_response +ListCreatedArtifactsRequest,list_created_artifacts_request +ListCreatedArtifactsResult,list_created_artifacts_result +ListCrlsResponse,list_crls_response +ListCrossAccountAuthorizationsRequest,list_cross_account_authorizations_request +ListCrossAccountAuthorizationsResponse,list_cross_account_authorizations_response +ListCuratedEnvironmentImagesOutput,list_curated_environment_images_output +ListCustomDataIdentifiersRequest,list_custom_data_identifiers_request +ListCustomDataIdentifiersResponse,list_custom_data_identifiers_response +ListCustomEntityTypesRequest,list_custom_entity_types_request +ListCustomEntityTypesResponse,list_custom_entity_types_response +ListCustomLineItemChargeDetails,list_custom_line_item_charge_details +ListCustomLineItemFlatChargeDetails,list_custom_line_item_flat_charge_details +ListCustomLineItemPercentageChargeDetails,list_custom_line_item_percentage_charge_details +ListCustomLineItemVersionsBillingPeriodRangeFilter,list_custom_line_item_versions_billing_period_range_filter +ListCustomLineItemVersionsFilter,list_custom_line_item_versions_filter +ListCustomLineItemVersionsInput,list_custom_line_item_versions_input +ListCustomLineItemVersionsOutput,list_custom_line_item_versions_output +ListCustomLineItemsFilter,list_custom_line_items_filter +ListCustomLineItemsInput,list_custom_line_items_input +ListCustomLineItemsOutput,list_custom_line_items_output +ListCustomMetricsRequest,list_custom_metrics_request +ListCustomMetricsResponse,list_custom_metrics_response +ListCustomModelsRequest,list_custom_models_request +ListCustomModelsResponse,list_custom_models_response +ListCustomPluginsRequest,list_custom_plugins_request +ListCustomPluginsResponse,list_custom_plugins_response +ListCustomRoutingAcceleratorsRequest,list_custom_routing_accelerators_request +ListCustomRoutingAcceleratorsResponse,list_custom_routing_accelerators_response +ListCustomRoutingEndpointGroupsRequest,list_custom_routing_endpoint_groups_request +ListCustomRoutingEndpointGroupsResponse,list_custom_routing_endpoint_groups_response +ListCustomRoutingListenersRequest,list_custom_routing_listeners_request +ListCustomRoutingListenersResponse,list_custom_routing_listeners_response +ListCustomRoutingPortMappingsByDestinationRequest,list_custom_routing_port_mappings_by_destination_request +ListCustomRoutingPortMappingsByDestinationResponse,list_custom_routing_port_mappings_by_destination_response +ListCustomRoutingPortMappingsRequest,list_custom_routing_port_mappings_request +ListCustomRoutingPortMappingsResponse,list_custom_routing_port_mappings_response +ListCustomVerificationEmailTemplatesRequest,list_custom_verification_email_templates_request +ListCustomVerificationEmailTemplatesResponse,list_custom_verification_email_templates_response +ListCustomVocabularyItemsRequest,list_custom_vocabulary_items_request +ListCustomVocabularyItemsResponse,list_custom_vocabulary_items_response +ListCustomerManagedPolicyReferencesInPermissionSetRequest,list_customer_managed_policy_references_in_permission_set_request +ListCustomerManagedPolicyReferencesInPermissionSetResponse,list_customer_managed_policy_references_in_permission_set_response +ListDICOMImportJobsRequest,list_dicom_import_jobs_request +ListDICOMImportJobsResponse,list_dicom_import_jobs_response +ListDashboardVersionsRequest,list_dashboard_versions_request +ListDashboardVersionsResponse,list_dashboard_versions_response +ListDashboardsInput,list_dashboards_input +ListDashboardsOutput,list_dashboards_output +ListDashboardsRequest,list_dashboards_request +ListDashboardsResponse,list_dashboards_response +ListDataCatalogsInput,list_data_catalogs_input +ListDataCatalogsOutput,list_data_catalogs_output +ListDataCellsFilterRequest,list_data_cells_filter_request +ListDataCellsFilterResponse,list_data_cells_filter_response +ListDataIngestionJobsRequest,list_data_ingestion_jobs_request +ListDataIngestionJobsResponse,list_data_ingestion_jobs_response +ListDataIntegrationAssociationsRequest,list_data_integration_associations_request +ListDataIntegrationAssociationsResponse,list_data_integration_associations_response +ListDataIntegrationsRequest,list_data_integrations_request +ListDataIntegrationsResponse,list_data_integrations_response +ListDataLakeExceptionsRequest,list_data_lake_exceptions_request +ListDataLakeExceptionsResponse,list_data_lake_exceptions_response +ListDataLakesRequest,list_data_lakes_request +ListDataLakesResponse,list_data_lakes_response +ListDataQualityJobDefinitionsRequest,list_data_quality_job_definitions_request +ListDataQualityJobDefinitionsResponse,list_data_quality_job_definitions_response +ListDataQualityResultsRequest,list_data_quality_results_request +ListDataQualityResultsResponse,list_data_quality_results_response +ListDataQualityRuleRecommendationRunsRequest,list_data_quality_rule_recommendation_runs_request +ListDataQualityRuleRecommendationRunsResponse,list_data_quality_rule_recommendation_runs_response +ListDataQualityRulesetEvaluationRunsRequest,list_data_quality_ruleset_evaluation_runs_request +ListDataQualityRulesetEvaluationRunsResponse,list_data_quality_ruleset_evaluation_runs_response +ListDataQualityRulesetsRequest,list_data_quality_rulesets_request +ListDataQualityRulesetsResponse,list_data_quality_rulesets_response +ListDataSetImportHistoryRequest,list_data_set_import_history_request +ListDataSetImportHistoryResponse,list_data_set_import_history_response +ListDataSetRevisionsRequest,list_data_set_revisions_request +ListDataSetRevisionsResponse,list_data_set_revisions_response +ListDataSetsRequest,list_data_sets_request +ListDataSetsResponse,list_data_sets_response +ListDataSourceSyncJobsRequest,list_data_source_sync_jobs_request +ListDataSourceSyncJobsResponse,list_data_source_sync_jobs_response +ListDataSourcesRequest,list_data_sources_request +ListDataSourcesResponse,list_data_sources_response +ListDataViewsRequest,list_data_views_request +ListDataViewsResponse,list_data_views_response +ListDatabasesInput,list_databases_input +ListDatabasesOutput,list_databases_output +ListDatabasesRequest,list_databases_request +ListDatabasesResponse,list_databases_response +ListDataflowEndpointGroupsRequest,list_dataflow_endpoint_groups_request +ListDataflowEndpointGroupsResponse,list_dataflow_endpoint_groups_response +ListDatasetContentsRequest,list_dataset_contents_request +ListDatasetContentsResponse,list_dataset_contents_response +ListDatasetEntriesRequest,list_dataset_entries_request +ListDatasetEntriesResponse,list_dataset_entries_response +ListDatasetExportJobsRequest,list_dataset_export_jobs_request +ListDatasetExportJobsResponse,list_dataset_export_jobs_response +ListDatasetGroupsRequest,list_dataset_groups_request +ListDatasetGroupsResponse,list_dataset_groups_response +ListDatasetImportJobsRequest,list_dataset_import_jobs_request +ListDatasetImportJobsResponse,list_dataset_import_jobs_response +ListDatasetLabelsRequest,list_dataset_labels_request +ListDatasetLabelsResponse,list_dataset_labels_response +ListDatasetsRequest,list_datasets_request +ListDatasetsResponse,list_datasets_response +ListDatasourcePackagesRequest,list_datasource_packages_request +ListDatasourcePackagesResponse,list_datasource_packages_response +ListDatastoresRequest,list_datastores_request +ListDatastoresResponse,list_datastores_response +ListDeadLetterSourceQueuesRequest,list_dead_letter_source_queues_request +ListDeadLetterSourceQueuesResult,list_dead_letter_source_queues_result +ListDecoderManifestNetworkInterfacesRequest,list_decoder_manifest_network_interfaces_request +ListDecoderManifestNetworkInterfacesResponse,list_decoder_manifest_network_interfaces_response +ListDecoderManifestSignalsRequest,list_decoder_manifest_signals_request +ListDecoderManifestSignalsResponse,list_decoder_manifest_signals_response +ListDecoderManifestsRequest,list_decoder_manifests_request +ListDecoderManifestsResponse,list_decoder_manifests_response +ListDedicatedIpPoolsRequest,list_dedicated_ip_pools_request +ListDedicatedIpPoolsResponse,list_dedicated_ip_pools_response +ListDefaultVocabulariesRequest,list_default_vocabularies_request +ListDefaultVocabulariesResponse,list_default_vocabularies_response +ListDelegatedAdminAccountsRequest,list_delegated_admin_accounts_request +ListDelegatedAdminAccountsResponse,list_delegated_admin_accounts_response +ListDelegatedAdministratorsRequest,list_delegated_administrators_request +ListDelegatedAdministratorsResponse,list_delegated_administrators_response +ListDelegatedServicesForAccountRequest,list_delegated_services_for_account_request +ListDelegatedServicesForAccountResponse,list_delegated_services_for_account_response +ListDeliverabilityTestReportsRequest,list_deliverability_test_reports_request +ListDeliverabilityTestReportsResponse,list_deliverability_test_reports_response +ListDeliveryStreamsInput,list_delivery_streams_input +ListDeliveryStreamsOutput,list_delivery_streams_output +ListDeploymentConfigsInput,list_deployment_configs_input +ListDeploymentConfigsOutput,list_deployment_configs_output +ListDeploymentGroupsInput,list_deployment_groups_input +ListDeploymentGroupsOutput,list_deployment_groups_output +ListDeploymentInstancesInput,list_deployment_instances_input +ListDeploymentInstancesOutput,list_deployment_instances_output +ListDeploymentJobsRequest,list_deployment_jobs_request +ListDeploymentJobsResponse,list_deployment_jobs_response +ListDeploymentStrategiesRequest,list_deployment_strategies_request +ListDeploymentTargetsInput,list_deployment_targets_input +ListDeploymentTargetsOutput,list_deployment_targets_output +ListDeploymentsInput,list_deployments_input +ListDeploymentsOutput,list_deployments_output +ListDeploymentsRequest,list_deployments_request +ListDeploymentsResponse,list_deployments_response +ListDestinationsRequest,list_destinations_request +ListDestinationsResponse,list_destinations_response +ListDetectMitigationActionsExecutionsRequest,list_detect_mitigation_actions_executions_request +ListDetectMitigationActionsExecutionsResponse,list_detect_mitigation_actions_executions_response +ListDetectMitigationActionsTasksRequest,list_detect_mitigation_actions_tasks_request +ListDetectMitigationActionsTasksResponse,list_detect_mitigation_actions_tasks_response +ListDetectorModelVersionsRequest,list_detector_model_versions_request +ListDetectorModelVersionsResponse,list_detector_model_versions_response +ListDetectorModelsRequest,list_detector_models_request +ListDetectorModelsResponse,list_detector_models_response +ListDetectorsRequest,list_detectors_request +ListDetectorsResponse,list_detectors_response +ListDevEndpointsRequest,list_dev_endpoints_request +ListDevEndpointsResponse,list_dev_endpoints_response +ListDevEnvironmentSessionsRequest,list_dev_environment_sessions_request +ListDevEnvironmentSessionsResponse,list_dev_environment_sessions_response +ListDevEnvironmentsRequest,list_dev_environments_request +ListDevEnvironmentsResponse,list_dev_environments_response +ListDevelopmentSchemaArnsRequest,list_development_schema_arns_request +ListDevelopmentSchemaArnsResponse,list_development_schema_arns_response +ListDeviceDefinitionVersionsRequest,list_device_definition_versions_request +ListDeviceDefinitionVersionsResponse,list_device_definition_versions_response +ListDeviceDefinitionsRequest,list_device_definitions_request +ListDeviceDefinitionsResponse,list_device_definitions_response +ListDeviceEventsRequest,list_device_events_request +ListDeviceEventsResponse,list_device_events_response +ListDeviceFleetsRequest,list_device_fleets_request +ListDeviceFleetsResponse,list_device_fleets_response +ListDeviceIdentifiersRequest,list_device_identifiers_request +ListDeviceIdentifiersResponse,list_device_identifiers_response +ListDeviceInstancesRequest,list_device_instances_request +ListDeviceInstancesResult,list_device_instances_result +ListDevicePoolsRequest,list_device_pools_request +ListDevicePoolsResult,list_device_pools_result +ListDevicePositionsRequest,list_device_positions_request +ListDevicePositionsResponse,list_device_positions_response +ListDevicePositionsResponseEntry,list_device_positions_response_entry +ListDeviceProfilesRequest,list_device_profiles_request +ListDeviceProfilesResponse,list_device_profiles_response +ListDeviceResourcesInput,list_device_resources_input +ListDeviceResourcesOutput,list_device_resources_output +ListDevicesForWirelessDeviceImportTaskRequest,list_devices_for_wireless_device_import_task_request +ListDevicesForWirelessDeviceImportTaskResponse,list_devices_for_wireless_device_import_task_response +ListDevicesInput,list_devices_input +ListDevicesJobsRequest,list_devices_jobs_request +ListDevicesJobsResponse,list_devices_jobs_response +ListDevicesOutput,list_devices_output +ListDevicesRequest,list_devices_request +ListDevicesResponse,list_devices_response +ListDevicesResult,list_devices_result +ListDimensionsRequest,list_dimensions_request +ListDimensionsResponse,list_dimensions_response +ListDirectoriesRequest,list_directories_request +ListDirectoriesResponse,list_directories_response +ListDirectoryRegistrationsRequest,list_directory_registrations_request +ListDirectoryRegistrationsResponse,list_directory_registrations_response +ListDiscoveredResourcesRequest,list_discovered_resources_request +ListDiscoveredResourcesResponse,list_discovered_resources_response +ListDiscoveredResourcesResult,list_discovered_resources_result +ListDiscoverersRequest,list_discoverers_request +ListDiscoverersResponse,list_discoverers_response +ListDiscoveryJobsRequest,list_discovery_jobs_request +ListDiscoveryJobsResponse,list_discovery_jobs_response +ListDistributedGrantsRequest,list_distributed_grants_request +ListDistributedGrantsResponse,list_distributed_grants_response +ListDistributionConfigurationsRequest,list_distribution_configurations_request +ListDistributionConfigurationsResponse,list_distribution_configurations_response +ListDistributionsByCachePolicyIdRequest,list_distributions_by_cache_policy_id_request +ListDistributionsByCachePolicyIdResult,list_distributions_by_cache_policy_id_result +ListDistributionsByKeyGroupRequest,list_distributions_by_key_group_request +ListDistributionsByKeyGroupResult,list_distributions_by_key_group_result +ListDistributionsByOriginRequestPolicyIdRequest,list_distributions_by_origin_request_policy_id_request +ListDistributionsByOriginRequestPolicyIdResult,list_distributions_by_origin_request_policy_id_result +ListDistributionsByRealtimeLogConfigRequest,list_distributions_by_realtime_log_config_request +ListDistributionsByRealtimeLogConfigResult,list_distributions_by_realtime_log_config_result +ListDistributionsByResponseHeadersPolicyIdRequest,list_distributions_by_response_headers_policy_id_request +ListDistributionsByResponseHeadersPolicyIdResult,list_distributions_by_response_headers_policy_id_result +ListDistributionsByWebACLIdRequest,list_distributions_by_web_acl_id_request +ListDistributionsByWebACLIdResult,list_distributions_by_web_acl_id_result +ListDistributionsRequest,list_distributions_request +ListDistributionsResult,list_distributions_result +ListDocumentClassificationJobsRequest,list_document_classification_jobs_request +ListDocumentClassificationJobsResponse,list_document_classification_jobs_response +ListDocumentClassifierSummariesRequest,list_document_classifier_summaries_request +ListDocumentClassifierSummariesResponse,list_document_classifier_summaries_response +ListDocumentClassifiersRequest,list_document_classifiers_request +ListDocumentClassifiersResponse,list_document_classifiers_response +ListDocumentMetadataHistoryRequest,list_document_metadata_history_request +ListDocumentMetadataHistoryResponse,list_document_metadata_history_response +ListDocumentVersionsRequest,list_document_versions_request +ListDocumentVersionsResult,list_document_versions_result +ListDocumentsRequest,list_documents_request +ListDocumentsResult,list_documents_result +ListDomainAssociationsRequest,list_domain_associations_request +ListDomainAssociationsResult,list_domain_associations_result +ListDomainConfigurationsRequest,list_domain_configurations_request +ListDomainConfigurationsResponse,list_domain_configurations_response +ListDomainDeliverabilityCampaignsRequest,list_domain_deliverability_campaigns_request +ListDomainDeliverabilityCampaignsResponse,list_domain_deliverability_campaigns_response +ListDomainItem,list_domain_item +ListDomainNamesRequest,list_domain_names_request +ListDomainNamesResponse,list_domain_names_response +ListDomainsForPackageRequest,list_domains_for_package_request +ListDomainsForPackageResponse,list_domains_for_package_response +ListDomainsInput,list_domains_input +ListDomainsRequest,list_domains_request +ListDomainsResponse,list_domains_response +ListDomainsResult,list_domains_result +ListDominantLanguageDetectionJobsRequest,list_dominant_language_detection_jobs_request +ListDominantLanguageDetectionJobsResponse,list_dominant_language_detection_jobs_response +ListEarthObservationJobInput,list_earth_observation_job_input +ListEarthObservationJobOutput,list_earth_observation_job_output +ListEarthObservationJobOutputConfig,list_earth_observation_job_output_config +ListEdgeAgentConfigurationsEdgeConfig,list_edge_agent_configurations_edge_config +ListEdgeAgentConfigurationsInput,list_edge_agent_configurations_input +ListEdgeAgentConfigurationsOutput,list_edge_agent_configurations_output +ListEdgeDeploymentPlansRequest,list_edge_deployment_plans_request +ListEdgeDeploymentPlansResponse,list_edge_deployment_plans_response +ListEdgePackagingJobsRequest,list_edge_packaging_jobs_request +ListEdgePackagingJobsResponse,list_edge_packaging_jobs_response +ListEffectiveDeploymentsRequest,list_effective_deployments_request +ListEffectiveDeploymentsResponse,list_effective_deployments_response +ListElasticsearchInstanceTypesRequest,list_elasticsearch_instance_types_request +ListElasticsearchInstanceTypesResponse,list_elasticsearch_instance_types_response +ListElasticsearchVersionsRequest,list_elasticsearch_versions_request +ListElasticsearchVersionsResponse,list_elasticsearch_versions_response +ListEmailIdentitiesRequest,list_email_identities_request +ListEmailIdentitiesResponse,list_email_identities_response +ListEmailTemplatesRequest,list_email_templates_request +ListEmailTemplatesResponse,list_email_templates_response +ListEnabledControlsInput,list_enabled_controls_input +ListEnabledControlsOutput,list_enabled_controls_output +ListEnabledProductsForImportRequest,list_enabled_products_for_import_request +ListEnabledProductsForImportResponse,list_enabled_products_for_import_response +ListEndpointAccessRequest,list_endpoint_access_request +ListEndpointAccessResponse,list_endpoint_access_response +ListEndpointConfigsInput,list_endpoint_configs_input +ListEndpointConfigsOutput,list_endpoint_configs_output +ListEndpointGroupsRequest,list_endpoint_groups_request +ListEndpointGroupsResponse,list_endpoint_groups_response +ListEndpointsByPlatformApplicationInput,list_endpoints_by_platform_application_input +ListEndpointsByPlatformApplicationResponse,list_endpoints_by_platform_application_response +ListEndpointsInput,list_endpoints_input +ListEndpointsOutput,list_endpoints_output +ListEndpointsRequest,list_endpoints_request +ListEndpointsResponse,list_endpoints_response +ListEndpointsResult,list_endpoints_result +ListEngagementsRequest,list_engagements_request +ListEngagementsResult,list_engagements_result +ListEngineVersionsInput,list_engine_versions_input +ListEngineVersionsOutput,list_engine_versions_output +ListEngineVersionsRequest,list_engine_versions_request +ListEngineVersionsResponse,list_engine_versions_response +ListEntitiesDetectionJobsRequest,list_entities_detection_jobs_request +ListEntitiesDetectionJobsResponse,list_entities_detection_jobs_response +ListEntitiesDetectionV2JobsRequest,list_entities_detection_v2_jobs_request +ListEntitiesDetectionV2JobsResponse,list_entities_detection_v2_jobs_response +ListEntitiesForPolicyRequest,list_entities_for_policy_request +ListEntitiesForPolicyResponse,list_entities_for_policy_response +ListEntitiesRequest,list_entities_request +ListEntitiesResponse,list_entities_response +ListEntitledApplicationsRequest,list_entitled_applications_request +ListEntitledApplicationsResult,list_entitled_applications_result +ListEntitlementsRequest,list_entitlements_request +ListEntitlementsResponse,list_entitlements_response +ListEntityPersonasRequest,list_entity_personas_request +ListEntityPersonasResponse,list_entity_personas_response +ListEntityRecognizerSummariesRequest,list_entity_recognizer_summaries_request +ListEntityRecognizerSummariesResponse,list_entity_recognizer_summaries_response +ListEntityRecognizersRequest,list_entity_recognizers_request +ListEntityRecognizersResponse,list_entity_recognizers_response +ListEnvironmentAccountConnectionsInput,list_environment_account_connections_input +ListEnvironmentAccountConnectionsOutput,list_environment_account_connections_output +ListEnvironmentOutputsInput,list_environment_outputs_input +ListEnvironmentOutputsOutput,list_environment_outputs_output +ListEnvironmentProvisionedResourcesInput,list_environment_provisioned_resources_input +ListEnvironmentProvisionedResourcesOutput,list_environment_provisioned_resources_output +ListEnvironmentTemplateVersionsInput,list_environment_template_versions_input +ListEnvironmentTemplateVersionsOutput,list_environment_template_versions_output +ListEnvironmentTemplatesInput,list_environment_templates_input +ListEnvironmentTemplatesOutput,list_environment_templates_output +ListEnvironmentVpcsRequest,list_environment_vpcs_request +ListEnvironmentVpcsResponse,list_environment_vpcs_response +ListEnvironmentsInput,list_environments_input +ListEnvironmentsOutput,list_environments_output +ListEnvironmentsRequest,list_environments_request +ListEnvironmentsResponse,list_environments_response +ListEnvironmentsResult,list_environments_result +ListEphemeridesRequest,list_ephemerides_request +ListEphemeridesResponse,list_ephemerides_response +ListEulaAcceptancesRequest,list_eula_acceptances_request +ListEulaAcceptancesResponse,list_eula_acceptances_response +ListEulasRequest,list_eulas_request +ListEulasResponse,list_eulas_response +ListEvaluationFormVersionsRequest,list_evaluation_form_versions_request +ListEvaluationFormVersionsResponse,list_evaluation_form_versions_response +ListEvaluationFormsRequest,list_evaluation_forms_request +ListEvaluationFormsResponse,list_evaluation_forms_response +ListEventActionsRequest,list_event_actions_request +ListEventActionsResponse,list_event_actions_response +ListEventBusesRequest,list_event_buses_request +ListEventBusesResponse,list_event_buses_response +ListEventConfigurationsRequest,list_event_configurations_request +ListEventConfigurationsResponse,list_event_configurations_response +ListEventDataStoresRequest,list_event_data_stores_request +ListEventDataStoresResponse,list_event_data_stores_response +ListEventIntegrationAssociationsRequest,list_event_integration_associations_request +ListEventIntegrationAssociationsResponse,list_event_integration_associations_response +ListEventIntegrationsRequest,list_event_integrations_request +ListEventIntegrationsResponse,list_event_integrations_response +ListEventLogsRequest,list_event_logs_request +ListEventLogsResponse,list_event_logs_response +ListEventPredictionsRequest,list_event_predictions_request +ListEventPredictionsResult,list_event_predictions_result +ListEventSourceMappingsRequest,list_event_source_mappings_request +ListEventSourceMappingsResponse,list_event_source_mappings_response +ListEventSourcesRequest,list_event_sources_request +ListEventSourcesResponse,list_event_sources_response +ListEventStreamsRequest,list_event_streams_request +ListEventStreamsResponse,list_event_streams_response +ListEventSubscriptionsRequest,list_event_subscriptions_request +ListEventSubscriptionsResponse,list_event_subscriptions_response +ListEventTrackersRequest,list_event_trackers_request +ListEventTrackersResponse,list_event_trackers_response +ListEventTypesFilter,list_event_types_filter +ListEventTypesRequest,list_event_types_request +ListEventTypesResult,list_event_types_result +ListEventsDetectionJobsRequest,list_events_detection_jobs_request +ListEventsDetectionJobsResponse,list_events_detection_jobs_response +ListEventsFilters,list_events_filters +ListEventsRequest,list_events_request +ListEventsResponse,list_events_response +ListExclusionsRequest,list_exclusions_request +ListExclusionsResponse,list_exclusions_response +ListExecutionsInput,list_executions_input +ListExecutionsOutput,list_executions_output +ListExecutionsRequest,list_executions_request +ListExecutionsResponse,list_executions_response +ListExecutorsRequest,list_executors_request +ListExecutorsResponse,list_executors_response +ListExperienceEntitiesRequest,list_experience_entities_request +ListExperienceEntitiesResponse,list_experience_entities_response +ListExperiencesRequest,list_experiences_request +ListExperiencesResponse,list_experiences_response +ListExperimentTemplatesRequest,list_experiment_templates_request +ListExperimentTemplatesResponse,list_experiment_templates_response +ListExperimentsRequest,list_experiments_request +ListExperimentsResponse,list_experiments_response +ListExplainabilitiesRequest,list_explainabilities_request +ListExplainabilitiesResponse,list_explainabilities_response +ListExplainabilityExportsRequest,list_explainability_exports_request +ListExplainabilityExportsResponse,list_explainability_exports_response +ListExportErrorsRequest,list_export_errors_request +ListExportErrorsResponse,list_export_errors_response +ListExportJobsRequest,list_export_jobs_request +ListExportJobsResponse,list_export_jobs_response +ListExportsInput,list_exports_input +ListExportsOutput,list_exports_output +ListExportsRequest,list_exports_request +ListExportsRequestFilters,list_exports_request_filters +ListExportsResponse,list_exports_response +ListExtensibleSourceServersRequest,list_extensible_source_servers_request +ListExtensibleSourceServersResponse,list_extensible_source_servers_response +ListExtensionAssociationsRequest,list_extension_associations_request +ListExtensionVersionsRequest,list_extension_versions_request +ListExtensionVersionsResult,list_extension_versions_result +ListExtensionsRequest,list_extensions_request +ListExtensionsResult,list_extensions_result +ListFHIRDatastoresRequest,list_fhir_datastores_request +ListFHIRDatastoresResponse,list_fhir_datastores_response +ListFHIRExportJobsRequest,list_fhir_export_jobs_request +ListFHIRExportJobsResponse,list_fhir_export_jobs_response +ListFHIRImportJobsRequest,list_fhir_import_jobs_request +ListFHIRImportJobsResponse,list_fhir_import_jobs_response +ListFacesRequest,list_faces_request +ListFacesResponse,list_faces_response +ListFacetAttributesRequest,list_facet_attributes_request +ListFacetAttributesResponse,list_facet_attributes_response +ListFacetNamesRequest,list_facet_names_request +ListFacetNamesResponse,list_facet_names_response +ListFailuresForLicenseConfigurationOperationsRequest,list_failures_for_license_configuration_operations_request +ListFailuresForLicenseConfigurationOperationsResponse,list_failures_for_license_configuration_operations_response +ListFaqsRequest,list_faqs_request +ListFaqsResponse,list_faqs_response +ListFargateProfilesRequest,list_fargate_profiles_request +ListFargateProfilesResponse,list_fargate_profiles_response +ListFeatureGroupsRequest,list_feature_groups_request +ListFeatureGroupsResponse,list_feature_groups_response +ListFeaturedResultsSetsRequest,list_featured_results_sets_request +ListFeaturedResultsSetsResponse,list_featured_results_sets_response +ListFeaturesRequest,list_features_request +ListFeaturesResponse,list_features_response +ListFieldLevelEncryptionConfigsRequest,list_field_level_encryption_configs_request +ListFieldLevelEncryptionConfigsResult,list_field_level_encryption_configs_result +ListFieldLevelEncryptionProfilesRequest,list_field_level_encryption_profiles_request +ListFieldLevelEncryptionProfilesResult,list_field_level_encryption_profiles_result +ListFieldOptionsRequest,list_field_options_request +ListFieldOptionsResponse,list_field_options_response +ListFieldsRequest,list_fields_request +ListFieldsResponse,list_fields_response +ListFileCommitHistoryRequest,list_file_commit_history_request +ListFileCommitHistoryResponse,list_file_commit_history_response +ListFileSharesInput,list_file_shares_input +ListFileSharesOutput,list_file_shares_output +ListFileSystemAssociationsInput,list_file_system_associations_input +ListFileSystemAssociationsOutput,list_file_system_associations_output +ListFiltersRequest,list_filters_request +ListFiltersResponse,list_filters_response +ListFindingAggregationsRequest,list_finding_aggregations_request +ListFindingAggregationsResponse,list_finding_aggregations_response +ListFindingAggregatorsRequest,list_finding_aggregators_request +ListFindingAggregatorsResponse,list_finding_aggregators_response +ListFindingsFiltersRequest,list_findings_filters_request +ListFindingsFiltersResponse,list_findings_filters_response +ListFindingsMetricsRequest,list_findings_metrics_request +ListFindingsMetricsResponse,list_findings_metrics_response +ListFindingsReportsRequest,list_findings_reports_request +ListFindingsReportsResponse,list_findings_reports_response +ListFindingsRequest,list_findings_request +ListFindingsResponse,list_findings_response +ListFirewallConfigsRequest,list_firewall_configs_request +ListFirewallConfigsResponse,list_firewall_configs_response +ListFirewallDomainListsRequest,list_firewall_domain_lists_request +ListFirewallDomainListsResponse,list_firewall_domain_lists_response +ListFirewallDomainsRequest,list_firewall_domains_request +ListFirewallDomainsResponse,list_firewall_domains_response +ListFirewallPoliciesRequest,list_firewall_policies_request +ListFirewallPoliciesResponse,list_firewall_policies_response +ListFirewallRuleGroupAssociationsRequest,list_firewall_rule_group_associations_request +ListFirewallRuleGroupAssociationsResponse,list_firewall_rule_group_associations_response +ListFirewallRuleGroupsRequest,list_firewall_rule_groups_request +ListFirewallRuleGroupsResponse,list_firewall_rule_groups_response +ListFirewallRulesRequest,list_firewall_rules_request +ListFirewallRulesResponse,list_firewall_rules_response +ListFirewallsRequest,list_firewalls_request +ListFirewallsResponse,list_firewalls_response +ListFleetMetricsRequest,list_fleet_metrics_request +ListFleetMetricsResponse,list_fleet_metrics_response +ListFleetsForVehicleRequest,list_fleets_for_vehicle_request +ListFleetsForVehicleResponse,list_fleets_for_vehicle_response +ListFleetsInput,list_fleets_input +ListFleetsOutput,list_fleets_output +ListFleetsRequest,list_fleets_request +ListFleetsResponse,list_fleets_response +ListFlowDefinitionsRequest,list_flow_definitions_request +ListFlowDefinitionsResponse,list_flow_definitions_response +ListFlowExecutionMessagesRequest,list_flow_execution_messages_request +ListFlowExecutionMessagesResponse,list_flow_execution_messages_response +ListFlowsRequest,list_flows_request +ListFlowsResponse,list_flows_response +ListFlywheelIterationHistoryRequest,list_flywheel_iteration_history_request +ListFlywheelIterationHistoryResponse,list_flywheel_iteration_history_response +ListFlywheelsRequest,list_flywheels_request +ListFlywheelsResponse,list_flywheels_response +ListFolderMembersRequest,list_folder_members_request +ListFolderMembersResponse,list_folder_members_response +ListFoldersRequest,list_folders_request +ListFoldersResponse,list_folders_response +ListForecastExportJobsRequest,list_forecast_export_jobs_request +ListForecastExportJobsResponse,list_forecast_export_jobs_response +ListForecastsRequest,list_forecasts_request +ListForecastsResponse,list_forecasts_response +ListFormsRequest,list_forms_request +ListFormsResponse,list_forms_response +ListFoundationModelsRequest,list_foundation_models_request +ListFoundationModelsResponse,list_foundation_models_response +ListFragmentsInput,list_fragments_input +ListFragmentsOutput,list_fragments_output +ListFrameworksInput,list_frameworks_input +ListFrameworksOutput,list_frameworks_output +ListFraudsterRegistrationJobsRequest,list_fraudster_registration_jobs_request +ListFraudsterRegistrationJobsResponse,list_fraudster_registration_jobs_response +ListFraudstersRequest,list_fraudsters_request +ListFraudstersResponse,list_fraudsters_response +ListFunctionDefinitionVersionsRequest,list_function_definition_versions_request +ListFunctionDefinitionVersionsResponse,list_function_definition_versions_response +ListFunctionDefinitionsRequest,list_function_definitions_request +ListFunctionDefinitionsResponse,list_function_definitions_response +ListFunctionEventInvokeConfigsRequest,list_function_event_invoke_configs_request +ListFunctionEventInvokeConfigsResponse,list_function_event_invoke_configs_response +ListFunctionUrlConfigsRequest,list_function_url_configs_request +ListFunctionUrlConfigsResponse,list_function_url_configs_response +ListFunctionsByCodeSigningConfigRequest,list_functions_by_code_signing_config_request +ListFunctionsByCodeSigningConfigResponse,list_functions_by_code_signing_config_response +ListFunctionsRequest,list_functions_request +ListFunctionsResponse,list_functions_response +ListFunctionsResult,list_functions_result +ListFuotaTasksRequest,list_fuota_tasks_request +ListFuotaTasksResponse,list_fuota_tasks_response +ListGameServerGroupsInput,list_game_server_groups_input +ListGameServerGroupsOutput,list_game_server_groups_output +ListGameServersInput,list_game_servers_input +ListGameServersOutput,list_game_servers_output +ListGamesRequest,list_games_request +ListGamesResult,list_games_result +ListGatewayGroupsRequest,list_gateway_groups_request +ListGatewayGroupsResponse,list_gateway_groups_response +ListGatewayInstancesRequest,list_gateway_instances_request +ListGatewayInstancesResponse,list_gateway_instances_response +ListGatewayRoutesInput,list_gateway_routes_input +ListGatewayRoutesOutput,list_gateway_routes_output +ListGatewaysInput,list_gateways_input +ListGatewaysOutput,list_gateways_output +ListGatewaysRequest,list_gateways_request +ListGatewaysResponse,list_gateways_response +ListGeneratedCodeJobsRequest,list_generated_code_jobs_request +ListGeneratedCodeJobsResult,list_generated_code_jobs_result +ListGeoLocationsRequest,list_geo_locations_request +ListGeoLocationsResponse,list_geo_locations_response +ListGeoMatchSetsRequest,list_geo_match_sets_request +ListGeoMatchSetsResponse,list_geo_match_sets_response +ListGeofenceCollectionsRequest,list_geofence_collections_request +ListGeofenceCollectionsResponse,list_geofence_collections_response +ListGeofenceCollectionsResponseEntry,list_geofence_collections_response_entry +ListGeofenceResponseEntry,list_geofence_response_entry +ListGeofencesRequest,list_geofences_request +ListGeofencesResponse,list_geofences_response +ListGitHubAccountTokenNamesInput,list_git_hub_account_token_names_input +ListGitHubAccountTokenNamesOutput,list_git_hub_account_token_names_output +ListGlobalTablesInput,list_global_tables_input +ListGlobalTablesOutput,list_global_tables_output +ListGrantsRequest,list_grants_request +ListGrantsResponse,list_grants_response +ListGraphqlApisRequest,list_graphql_apis_request +ListGraphqlApisResponse,list_graphql_apis_response +ListGraphsRequest,list_graphs_request +ListGraphsResponse,list_graphs_response +ListGremlinQueriesInput,list_gremlin_queries_input +ListGremlinQueriesOutput,list_gremlin_queries_output +ListGroundStationsRequest,list_ground_stations_request +ListGroundStationsResponse,list_ground_stations_response +ListGroupCertificateAuthoritiesRequest,list_group_certificate_authorities_request +ListGroupCertificateAuthoritiesResponse,list_group_certificate_authorities_response +ListGroupMembersRequest,list_group_members_request +ListGroupMembersResponse,list_group_members_response +ListGroupMembershipsForMemberRequest,list_group_memberships_for_member_request +ListGroupMembershipsForMemberResponse,list_group_memberships_for_member_response +ListGroupMembershipsRequest,list_group_memberships_request +ListGroupMembershipsResponse,list_group_memberships_response +ListGroupPoliciesRequest,list_group_policies_request +ListGroupPoliciesResponse,list_group_policies_response +ListGroupResourcesInput,list_group_resources_input +ListGroupResourcesItem,list_group_resources_item +ListGroupResourcesOutput,list_group_resources_output +ListGroupResourcesRequest,list_group_resources_request +ListGroupResourcesResponse,list_group_resources_response +ListGroupVersionsRequest,list_group_versions_request +ListGroupVersionsResponse,list_group_versions_response +ListGroupsFilters,list_groups_filters +ListGroupsForEntityFilters,list_groups_for_entity_filters +ListGroupsForEntityRequest,list_groups_for_entity_request +ListGroupsForEntityResponse,list_groups_for_entity_response +ListGroupsForUserRequest,list_groups_for_user_request +ListGroupsForUserResponse,list_groups_for_user_response +ListGroupsInput,list_groups_input +ListGroupsOlderThanOrderingIdRequest,list_groups_older_than_ordering_id_request +ListGroupsOlderThanOrderingIdResponse,list_groups_older_than_ordering_id_response +ListGroupsOutput,list_groups_output +ListGroupsRequest,list_groups_request +ListGroupsResponse,list_groups_response +ListHITsForQualificationTypeRequest,list_hits_for_qualification_type_request +ListHITsForQualificationTypeResponse,list_hits_for_qualification_type_response +ListHITsRequest,list_hits_request +ListHITsResponse,list_hits_response +ListHandshakesForAccountRequest,list_handshakes_for_account_request +ListHandshakesForAccountResponse,list_handshakes_for_account_response +ListHandshakesForOrganizationRequest,list_handshakes_for_organization_request +ListHandshakesForOrganizationResponse,list_handshakes_for_organization_response +ListHapgsRequest,list_hapgs_request +ListHapgsResponse,list_hapgs_response +ListHarvestJobsRequest,list_harvest_jobs_request +ListHarvestJobsResponse,list_harvest_jobs_response +ListHealthChecksRequest,list_health_checks_request +ListHealthChecksResponse,list_health_checks_response +ListHealthEventsInput,list_health_events_input +ListHealthEventsOutput,list_health_events_output +ListHlsManifestConfiguration,list_hls_manifest_configuration +ListHostKeysRequest,list_host_keys_request +ListHostKeysResponse,list_host_keys_response +ListHostedConfigurationVersionsRequest,list_hosted_configuration_versions_request +ListHostedZonesByNameRequest,list_hosted_zones_by_name_request +ListHostedZonesByNameResponse,list_hosted_zones_by_name_response +ListHostedZonesByVPCRequest,list_hosted_zones_by_vpc_request +ListHostedZonesByVPCResponse,list_hosted_zones_by_vpc_response +ListHostedZonesRequest,list_hosted_zones_request +ListHostedZonesResponse,list_hosted_zones_response +ListHostsInput,list_hosts_input +ListHostsOutput,list_hosts_output +ListHoursOfOperationsRequest,list_hours_of_operations_request +ListHoursOfOperationsResponse,list_hours_of_operations_response +ListHsmsRequest,list_hsms_request +ListHsmsResponse,list_hsms_response +ListHubContentVersionsRequest,list_hub_content_versions_request +ListHubContentVersionsResponse,list_hub_content_versions_response +ListHubContentsRequest,list_hub_contents_request +ListHubContentsResponse,list_hub_contents_response +ListHubsRequest,list_hubs_request +ListHubsResponse,list_hubs_response +ListHumanLoopsRequest,list_human_loops_request +ListHumanLoopsResponse,list_human_loops_response +ListHumanTaskUisRequest,list_human_task_uis_request +ListHumanTaskUisResponse,list_human_task_uis_response +ListHyperParameterTuningJobsRequest,list_hyper_parameter_tuning_jobs_request +ListHyperParameterTuningJobsResponse,list_hyper_parameter_tuning_jobs_response +ListHypervisorsInput,list_hypervisors_input +ListHypervisorsOutput,list_hypervisors_output +ListIAMPolicyAssignmentsForUserRequest,list_iam_policy_assignments_for_user_request +ListIAMPolicyAssignmentsForUserResponse,list_iam_policy_assignments_for_user_response +ListIAMPolicyAssignmentsRequest,list_iam_policy_assignments_request +ListIAMPolicyAssignmentsResponse,list_iam_policy_assignments_response +ListICD10CMInferenceJobsRequest,list_icd10_cm_inference_jobs_request +ListICD10CMInferenceJobsResponse,list_icd10_cm_inference_jobs_response +ListIPSetsRequest,list_ip_sets_request +ListIPSetsResponse,list_ip_sets_response +ListId,list_id +ListIdentitiesInput,list_identities_input +ListIdentitiesRequest,list_identities_request +ListIdentitiesResponse,list_identities_response +ListIdentityPoliciesRequest,list_identity_policies_request +ListIdentityPoliciesResponse,list_identity_policies_response +ListIdentityPoolUsageRequest,list_identity_pool_usage_request +ListIdentityPoolUsageResponse,list_identity_pool_usage_response +ListIdentityPoolsInput,list_identity_pools_input +ListIdentityPoolsResponse,list_identity_pools_response +ListIdentityProviderConfigsRequest,list_identity_provider_configs_request +ListIdentityProviderConfigsResponse,list_identity_provider_configs_response +ListIdentityProvidersRequest,list_identity_providers_request +ListIdentityProvidersResponse,list_identity_providers_response +ListIdentityResolutionJobsRequest,list_identity_resolution_jobs_request +ListIdentityResolutionJobsResponse,list_identity_resolution_jobs_response +ListIdentitySourcesInput,list_identity_sources_input +ListIdentitySourcesOutput,list_identity_sources_output +ListImageBuildVersionsRequest,list_image_build_versions_request +ListImageBuildVersionsResponse,list_image_build_versions_response +ListImagePackagesRequest,list_image_packages_request +ListImagePackagesResponse,list_image_packages_response +ListImagePipelineImagesRequest,list_image_pipeline_images_request +ListImagePipelineImagesResponse,list_image_pipeline_images_response +ListImagePipelinesRequest,list_image_pipelines_request +ListImagePipelinesResponse,list_image_pipelines_response +ListImageRecipesRequest,list_image_recipes_request +ListImageRecipesResponse,list_image_recipes_response +ListImageScanFindingAggregationsRequest,list_image_scan_finding_aggregations_request +ListImageScanFindingAggregationsResponse,list_image_scan_finding_aggregations_response +ListImageScanFindingsRequest,list_image_scan_findings_request +ListImageScanFindingsResponse,list_image_scan_findings_response +ListImageSetVersionsRequest,list_image_set_versions_request +ListImageSetVersionsResponse,list_image_set_versions_response +ListImageVersionsRequest,list_image_versions_request +ListImageVersionsResponse,list_image_versions_response +ListImagesFilter,list_images_filter +ListImagesInRecycleBinRequest,list_images_in_recycle_bin_request +ListImagesInRecycleBinResult,list_images_in_recycle_bin_result +ListImagesRequest,list_images_request +ListImagesResponse,list_images_response +ListImpersonationRolesRequest,list_impersonation_roles_request +ListImpersonationRolesResponse,list_impersonation_roles_response +ListImportErrorsRequest,list_import_errors_request +ListImportErrorsResponse,list_import_errors_response +ListImportFailuresRequest,list_import_failures_request +ListImportFailuresResponse,list_import_failures_response +ListImportFileTaskRequest,list_import_file_task_request +ListImportFileTaskResponse,list_import_file_task_response +ListImportJobsRequest,list_import_jobs_request +ListImportJobsResponse,list_import_jobs_response +ListImportsInput,list_imports_input +ListImportsOutput,list_imports_output +ListImportsRequest,list_imports_request +ListImportsRequestFilters,list_imports_request_filters +ListImportsResponse,list_imports_response +ListIncidentRecordsInput,list_incident_records_input +ListIncidentRecordsOutput,list_incident_records_output +ListIncomingTypedLinks,list_incoming_typed_links +ListIncomingTypedLinksRequest,list_incoming_typed_links_request +ListIncomingTypedLinksResponse,list_incoming_typed_links_response +ListIndex,list_index +ListIndexRequest,list_index_request +ListIndexResponse,list_index_response +ListIndexesInput,list_indexes_input +ListIndexesOutput,list_indexes_output +ListIndicesRequest,list_indices_request +ListIndicesResponse,list_indices_response +ListInferenceEventsRequest,list_inference_events_request +ListInferenceEventsResponse,list_inference_events_response +ListInferenceExecutionsRequest,list_inference_executions_request +ListInferenceExecutionsResponse,list_inference_executions_response +ListInferenceExperimentsRequest,list_inference_experiments_request +ListInferenceExperimentsResponse,list_inference_experiments_response +ListInferenceRecommendationsJobStepsRequest,list_inference_recommendations_job_steps_request +ListInferenceRecommendationsJobStepsResponse,list_inference_recommendations_job_steps_response +ListInferenceRecommendationsJobsRequest,list_inference_recommendations_jobs_request +ListInferenceRecommendationsJobsResponse,list_inference_recommendations_jobs_response +ListInferenceSchedulersRequest,list_inference_schedulers_request +ListInferenceSchedulersResponse,list_inference_schedulers_response +ListInfrastructureConfigurationsRequest,list_infrastructure_configurations_request +ListInfrastructureConfigurationsResponse,list_infrastructure_configurations_response +ListIngestionDestinationsRequest,list_ingestion_destinations_request +ListIngestionDestinationsResponse,list_ingestion_destinations_response +ListIngestionsRequest,list_ingestions_request +ListIngestionsResponse,list_ingestions_response +ListInputDeviceTransfersRequest,list_input_device_transfers_request +ListInputDeviceTransfersResponse,list_input_device_transfers_response +ListInputDevicesRequest,list_input_devices_request +ListInputDevicesResponse,list_input_devices_response +ListInputRoutingsRequest,list_input_routings_request +ListInputRoutingsResponse,list_input_routings_response +ListInputSecurityGroupsRequest,list_input_security_groups_request +ListInputSecurityGroupsResponse,list_input_security_groups_response +ListInputsRequest,list_inputs_request +ListInputsResponse,list_inputs_response +ListInsightsAnyStatusFilter,list_insights_any_status_filter +ListInsightsClosedStatusFilter,list_insights_closed_status_filter +ListInsightsOngoingStatusFilter,list_insights_ongoing_status_filter +ListInsightsRequest,list_insights_request +ListInsightsResponse,list_insights_response +ListInsightsStatusFilter,list_insights_status_filter +ListInstalledComponentsRequest,list_installed_components_request +ListInstalledComponentsResponse,list_installed_components_response +ListInstanceAttributesRequest,list_instance_attributes_request +ListInstanceAttributesResponse,list_instance_attributes_response +ListInstanceFleetsInput,list_instance_fleets_input +ListInstanceFleetsOutput,list_instance_fleets_output +ListInstanceGroupsInput,list_instance_groups_input +ListInstanceGroupsOutput,list_instance_groups_output +ListInstanceProfileTagsRequest,list_instance_profile_tags_request +ListInstanceProfileTagsResponse,list_instance_profile_tags_response +ListInstanceProfilesForRoleRequest,list_instance_profiles_for_role_request +ListInstanceProfilesForRoleResponse,list_instance_profiles_for_role_response +ListInstanceProfilesRequest,list_instance_profiles_request +ListInstanceProfilesResponse,list_instance_profiles_response +ListInstanceProfilesResult,list_instance_profiles_result +ListInstanceStorageConfigsRequest,list_instance_storage_configs_request +ListInstanceStorageConfigsResponse,list_instance_storage_configs_response +ListInstanceTypeDetailsRequest,list_instance_type_details_request +ListInstanceTypeDetailsResponse,list_instance_type_details_response +ListInstancesInput,list_instances_input +ListInstancesOutput,list_instances_output +ListInstancesRequest,list_instances_request +ListInstancesResponse,list_instances_response +ListIntegrationAssociationsRequest,list_integration_associations_request +ListIntegrationAssociationsResponse,list_integration_associations_response +ListIntegrationItem,list_integration_item +ListIntegrationsRequest,list_integrations_request +ListIntegrationsResponse,list_integrations_response +ListIntentMetricsRequest,list_intent_metrics_request +ListIntentMetricsResponse,list_intent_metrics_response +ListIntentPathsRequest,list_intent_paths_request +ListIntentPathsResponse,list_intent_paths_response +ListIntentStageMetricsRequest,list_intent_stage_metrics_request +ListIntentStageMetricsResponse,list_intent_stage_metrics_response +ListIntentsRequest,list_intents_request +ListIntentsResponse,list_intents_response +ListInvalidationsRequest,list_invalidations_request +ListInvalidationsResult,list_invalidations_result +ListInventoryEntriesRequest,list_inventory_entries_request +ListInventoryEntriesResult,list_inventory_entries_result +ListInvitationsInput,list_invitations_input +ListInvitationsOutput,list_invitations_output +ListInvitationsRequest,list_invitations_request +ListInvitationsResponse,list_invitations_response +ListIpAccessSettingsRequest,list_ip_access_settings_request +ListIpAccessSettingsResponse,list_ip_access_settings_response +ListIpRoutesRequest,list_ip_routes_request +ListIpRoutesResult,list_ip_routes_result +ListItemsRequest,list_items_request +ListItemsResponse,list_items_response +ListJobExecutionsForJobRequest,list_job_executions_for_job_request +ListJobExecutionsForJobResponse,list_job_executions_for_job_response +ListJobExecutionsForThingRequest,list_job_executions_for_thing_request +ListJobExecutionsForThingResponse,list_job_executions_for_thing_response +ListJobRunsRequest,list_job_runs_request +ListJobRunsResponse,list_job_runs_response +ListJobTemplatesRequest,list_job_templates_request +ListJobTemplatesResponse,list_job_templates_response +ListJobsByPipelineRequest,list_jobs_by_pipeline_request +ListJobsByPipelineResponse,list_jobs_by_pipeline_response +ListJobsByStatusRequest,list_jobs_by_status_request +ListJobsByStatusResponse,list_jobs_by_status_response +ListJobsFilterCriteria,list_jobs_filter_criteria +ListJobsFilterTerm,list_jobs_filter_term +ListJobsInput,list_jobs_input +ListJobsOutput,list_jobs_output +ListJobsRequest,list_jobs_request +ListJobsResponse,list_jobs_response +ListJobsResult,list_jobs_result +ListJobsSortCriteria,list_jobs_sort_criteria +ListJournalKinesisStreamsForLedgerRequest,list_journal_kinesis_streams_for_ledger_request +ListJournalKinesisStreamsForLedgerResponse,list_journal_kinesis_streams_for_ledger_response +ListJournalS3ExportsForLedgerRequest,list_journal_s3_exports_for_ledger_request +ListJournalS3ExportsForLedgerResponse,list_journal_s3_exports_for_ledger_response +ListJournalS3ExportsRequest,list_journal_s3_exports_request +ListJournalS3ExportsResponse,list_journal_s3_exports_response +ListJourneysRequest,list_journeys_request +ListJourneysResponse,list_journeys_response +ListKafkaVersionsRequest,list_kafka_versions_request +ListKafkaVersionsResponse,list_kafka_versions_response +ListKeyGroupsRequest,list_key_groups_request +ListKeyGroupsResult,list_key_groups_result +ListKeyPhrasesDetectionJobsRequest,list_key_phrases_detection_jobs_request +ListKeyPhrasesDetectionJobsResponse,list_key_phrases_detection_jobs_response +ListKeyPoliciesRequest,list_key_policies_request +ListKeyPoliciesResponse,list_key_policies_response +ListKeysInput,list_keys_input +ListKeysOutput,list_keys_output +ListKeysRequest,list_keys_request +ListKeysResponse,list_keys_response +ListKeysResponseEntry,list_keys_response_entry +ListKeyspacesRequest,list_keyspaces_request +ListKeyspacesResponse,list_keyspaces_response +ListKeywordsForDataSourceRequest,list_keywords_for_data_source_request +ListKeywordsForDataSourceResponse,list_keywords_for_data_source_response +ListKnowledgeBasesRequest,list_knowledge_bases_request +ListKnowledgeBasesResponse,list_knowledge_bases_response +ListKxChangesetsRequest,list_kx_changesets_request +ListKxChangesetsResponse,list_kx_changesets_response +ListKxClusterNodesRequest,list_kx_cluster_nodes_request +ListKxClusterNodesResponse,list_kx_cluster_nodes_response +ListKxClustersRequest,list_kx_clusters_request +ListKxClustersResponse,list_kx_clusters_response +ListKxDatabasesRequest,list_kx_databases_request +ListKxDatabasesResponse,list_kx_databases_response +ListKxEnvironmentsRequest,list_kx_environments_request +ListKxEnvironmentsResponse,list_kx_environments_response +ListKxUsersRequest,list_kx_users_request +ListKxUsersResponse,list_kx_users_response +ListLFTagsRequest,list_lf_tags_request +ListLFTagsResponse,list_lf_tags_response +ListLabelGroupsRequest,list_label_groups_request +ListLabelGroupsResponse,list_label_groups_response +ListLabelingJobsForWorkteamRequest,list_labeling_jobs_for_workteam_request +ListLabelingJobsForWorkteamResponse,list_labeling_jobs_for_workteam_response +ListLabelingJobsRequest,list_labeling_jobs_request +ListLabelingJobsResponse,list_labeling_jobs_response +ListLabelsRequest,list_labels_request +ListLabelsResponse,list_labels_response +ListLakeFormationOptInsRequest,list_lake_formation_opt_ins_request +ListLakeFormationOptInsResponse,list_lake_formation_opt_ins_response +ListLambdaFunctionsRequest,list_lambda_functions_request +ListLambdaFunctionsResponse,list_lambda_functions_response +ListLanguageModelsRequest,list_language_models_request +ListLanguageModelsResponse,list_language_models_response +ListLanguagesRequest,list_languages_request +ListLanguagesResponse,list_languages_response +ListLaunchActionsRequest,list_launch_actions_request +ListLaunchActionsResponse,list_launch_actions_response +ListLaunchPathsInput,list_launch_paths_input +ListLaunchPathsOutput,list_launch_paths_output +ListLaunchProfileMembersRequest,list_launch_profile_members_request +ListLaunchProfileMembersResponse,list_launch_profile_members_response +ListLaunchProfilesRequest,list_launch_profiles_request +ListLaunchProfilesResponse,list_launch_profiles_response +ListLaunchesRequest,list_launches_request +ListLaunchesResponse,list_launches_response +ListLayerVersionsRequest,list_layer_versions_request +ListLayerVersionsResponse,list_layer_versions_response +ListLayersRequest,list_layers_request +ListLayersResponse,list_layers_response +ListLayoutsRequest,list_layouts_request +ListLayoutsResponse,list_layouts_response +ListLedgersRequest,list_ledgers_request +ListLedgersResponse,list_ledgers_response +ListLegalHoldsInput,list_legal_holds_input +ListLegalHoldsOutput,list_legal_holds_output +ListLensReviewImprovementsInput,list_lens_review_improvements_input +ListLensReviewImprovementsOutput,list_lens_review_improvements_output +ListLensReviewsInput,list_lens_reviews_input +ListLensReviewsOutput,list_lens_reviews_output +ListLensSharesInput,list_lens_shares_input +ListLensSharesOutput,list_lens_shares_output +ListLensesInput,list_lenses_input +ListLensesOutput,list_lenses_output +ListLexBotsRequest,list_lex_bots_request +ListLexBotsResponse,list_lex_bots_response +ListLexiconsInput,list_lexicons_input +ListLexiconsOutput,list_lexicons_output +ListLicenseConfigurationsRequest,list_license_configurations_request +ListLicenseConfigurationsResponse,list_license_configurations_response +ListLicenseConversionTasksRequest,list_license_conversion_tasks_request +ListLicenseConversionTasksResponse,list_license_conversion_tasks_response +ListLicenseManagerReportGeneratorsRequest,list_license_manager_report_generators_request +ListLicenseManagerReportGeneratorsResponse,list_license_manager_report_generators_response +ListLicenseSpecificationsForResourceRequest,list_license_specifications_for_resource_request +ListLicenseSpecificationsForResourceResponse,list_license_specifications_for_resource_response +ListLicenseVersionsRequest,list_license_versions_request +ListLicenseVersionsResponse,list_license_versions_response +ListLicensesRequest,list_licenses_request +ListLicensesResponse,list_licenses_response +ListLineageGroupsRequest,list_lineage_groups_request +ListLineageGroupsResponse,list_lineage_groups_response +ListLinksInput,list_links_input +ListLinksItem,list_links_item +ListLinksOutput,list_links_output +ListLinuxSubscriptionInstancesRequest,list_linux_subscription_instances_request +ListLinuxSubscriptionInstancesResponse,list_linux_subscription_instances_response +ListLinuxSubscriptionsRequest,list_linux_subscriptions_request +ListLinuxSubscriptionsResponse,list_linux_subscriptions_response +ListListenersRequest,list_listeners_request +ListListenersResponse,list_listeners_response +ListLiveSourcesRequest,list_live_sources_request +ListLiveSourcesResponse,list_live_sources_response +ListLoaderJobsInput,list_loader_jobs_input +ListLoaderJobsOutput,list_loader_jobs_output +ListLocalDisksInput,list_local_disks_input +ListLocalDisksOutput,list_local_disks_output +ListLocationsInput,list_locations_input +ListLocationsOutput,list_locations_output +ListLocationsRequest,list_locations_request +ListLocationsResponse,list_locations_response +ListLogPatternSetsRequest,list_log_pattern_sets_request +ListLogPatternSetsResponse,list_log_pattern_sets_response +ListLogPatternsRequest,list_log_patterns_request +ListLogPatternsResponse,list_log_patterns_response +ListLogSourcesRequest,list_log_sources_request +ListLogSourcesResponse,list_log_sources_response +ListLogSubscriptionsRequest,list_log_subscriptions_request +ListLogSubscriptionsResult,list_log_subscriptions_result +ListLoggerDefinitionVersionsRequest,list_logger_definition_versions_request +ListLoggerDefinitionVersionsResponse,list_logger_definition_versions_response +ListLoggerDefinitionsRequest,list_logger_definitions_request +ListLoggerDefinitionsResponse,list_logger_definitions_response +ListLoggingConfigurationsRequest,list_logging_configurations_request +ListLoggingConfigurationsResponse,list_logging_configurations_response +ListLongTermPricingRequest,list_long_term_pricing_request +ListLongTermPricingResult,list_long_term_pricing_result +ListLowLatencyHlsManifestConfiguration,list_low_latency_hls_manifest_configuration +ListLunaClientsRequest,list_luna_clients_request +ListLunaClientsResponse,list_luna_clients_response +ListMFADeviceTagsRequest,list_mfa_device_tags_request +ListMFADeviceTagsResponse,list_mfa_device_tags_response +ListMFADevicesRequest,list_mfa_devices_request +ListMFADevicesResponse,list_mfa_devices_response +ListMLDataProcessingJobsInput,list_ml_data_processing_jobs_input +ListMLDataProcessingJobsOutput,list_ml_data_processing_jobs_output +ListMLEndpointsInput,list_ml_endpoints_input +ListMLEndpointsOutput,list_ml_endpoints_output +ListMLModelTrainingJobsInput,list_ml_model_training_jobs_input +ListMLModelTrainingJobsOutput,list_ml_model_training_jobs_output +ListMLModelTransformJobsInput,list_ml_model_transform_jobs_input +ListMLModelTransformJobsOutput,list_ml_model_transform_jobs_output +ListMLTransformsRequest,list_ml_transforms_request +ListMLTransformsResponse,list_ml_transforms_response +ListMailDomainsRequest,list_mail_domains_request +ListMailDomainsResponse,list_mail_domains_response +ListMailboxExportJobsRequest,list_mailbox_export_jobs_request +ListMailboxExportJobsResponse,list_mailbox_export_jobs_response +ListMailboxPermissionsRequest,list_mailbox_permissions_request +ListMailboxPermissionsResponse,list_mailbox_permissions_response +ListManagedAccountsRequest,list_managed_accounts_request +ListManagedAccountsResponse,list_managed_accounts_response +ListManagedDataIdentifiersRequest,list_managed_data_identifiers_request +ListManagedDataIdentifiersResponse,list_managed_data_identifiers_response +ListManagedEndpointsRequest,list_managed_endpoints_request +ListManagedEndpointsResponse,list_managed_endpoints_response +ListManagedInsightRulesInput,list_managed_insight_rules_input +ListManagedInsightRulesOutput,list_managed_insight_rules_output +ListManagedJobTemplatesRequest,list_managed_job_templates_request +ListManagedJobTemplatesResponse,list_managed_job_templates_response +ListManagedPoliciesInPermissionSetRequest,list_managed_policies_in_permission_set_request +ListManagedPoliciesInPermissionSetResponse,list_managed_policies_in_permission_set_response +ListManagedResourcesRequest,list_managed_resources_request +ListManagedResourcesResponse,list_managed_resources_response +ListManagedRuleSetsRequest,list_managed_rule_sets_request +ListManagedRuleSetsResponse,list_managed_rule_sets_response +ListManagedSchemaArnsRequest,list_managed_schema_arns_request +ListManagedSchemaArnsResponse,list_managed_schema_arns_response +ListManagementOptions,list_management_options +ListMapRunsInput,list_map_runs_input +ListMapRunsOutput,list_map_runs_output +ListMapsRequest,list_maps_request +ListMapsResponse,list_maps_response +ListMapsResponseEntry,list_maps_response_entry +ListMatchingJobsInput,list_matching_jobs_input +ListMatchingJobsOutput,list_matching_jobs_output +ListMatchingWorkflowsInput,list_matching_workflows_input +ListMatchingWorkflowsOutput,list_matching_workflows_output +ListMediaCapturePipelinesRequest,list_media_capture_pipelines_request +ListMediaCapturePipelinesResponse,list_media_capture_pipelines_response +ListMediaInsightsPipelineConfigurationsRequest,list_media_insights_pipeline_configurations_request +ListMediaInsightsPipelineConfigurationsResponse,list_media_insights_pipeline_configurations_response +ListMediaPipelineKinesisVideoStreamPoolsRequest,list_media_pipeline_kinesis_video_stream_pools_request +ListMediaPipelineKinesisVideoStreamPoolsResponse,list_media_pipeline_kinesis_video_stream_pools_response +ListMediaPipelinesRequest,list_media_pipelines_request +ListMediaPipelinesResponse,list_media_pipelines_response +ListMedicalTranscriptionJobsRequest,list_medical_transcription_jobs_request +ListMedicalTranscriptionJobsResponse,list_medical_transcription_jobs_response +ListMedicalVocabulariesRequest,list_medical_vocabularies_request +ListMedicalVocabulariesResponse,list_medical_vocabularies_response +ListMeetingTagsRequest,list_meeting_tags_request +ListMeetingTagsResponse,list_meeting_tags_response +ListMeetingsRequest,list_meetings_request +ListMeetingsResponse,list_meetings_response +ListMemberAccountsRequest,list_member_accounts_request +ListMemberAccountsResponse,list_member_accounts_response +ListMemberAccountsResult,list_member_accounts_result +ListMembersInput,list_members_input +ListMembersOutput,list_members_output +ListMembersRequest,list_members_request +ListMembersResponse,list_members_response +ListMembershipsInput,list_memberships_input +ListMembershipsOutput,list_memberships_output +ListMeshesInput,list_meshes_input +ListMeshesOutput,list_meshes_output +ListMessageMoveTasksRequest,list_message_move_tasks_request +ListMessageMoveTasksResult,list_message_move_tasks_result +ListMessageMoveTasksResultEntry,list_message_move_tasks_result_entry +ListMetricAttributionMetricsRequest,list_metric_attribution_metrics_request +ListMetricAttributionMetricsResponse,list_metric_attribution_metrics_response +ListMetricAttributionsRequest,list_metric_attributions_request +ListMetricAttributionsResponse,list_metric_attributions_response +ListMetricSetsRequest,list_metric_sets_request +ListMetricSetsResponse,list_metric_sets_response +ListMetricStreamsInput,list_metric_streams_input +ListMetricStreamsOutput,list_metric_streams_output +ListMetricValuesRequest,list_metric_values_request +ListMetricValuesResponse,list_metric_values_response +ListMetricsInput,list_metrics_input +ListMetricsOutput,list_metrics_output +ListMigrationTasksRequest,list_migration_tasks_request +ListMigrationTasksResult,list_migration_tasks_result +ListMigrationWorkflowTemplatesRequest,list_migration_workflow_templates_request +ListMigrationWorkflowTemplatesResponse,list_migration_workflow_templates_response +ListMigrationWorkflowsRequest,list_migration_workflows_request +ListMigrationWorkflowsResponse,list_migration_workflows_response +ListMilestonesInput,list_milestones_input +ListMilestonesOutput,list_milestones_output +ListMissionProfilesRequest,list_mission_profiles_request +ListMissionProfilesResponse,list_mission_profiles_response +ListMitigationActionsRequest,list_mitigation_actions_request +ListMitigationActionsResponse,list_mitigation_actions_response +ListMobileDeviceAccessOverridesRequest,list_mobile_device_access_overrides_request +ListMobileDeviceAccessOverridesResponse,list_mobile_device_access_overrides_response +ListMobileDeviceAccessRulesRequest,list_mobile_device_access_rules_request +ListMobileDeviceAccessRulesResponse,list_mobile_device_access_rules_response +ListMobileSdkReleasesRequest,list_mobile_sdk_releases_request +ListMobileSdkReleasesResponse,list_mobile_sdk_releases_response +ListModelBiasJobDefinitionsRequest,list_model_bias_job_definitions_request +ListModelBiasJobDefinitionsResponse,list_model_bias_job_definitions_response +ListModelCardExportJobsRequest,list_model_card_export_jobs_request +ListModelCardExportJobsResponse,list_model_card_export_jobs_response +ListModelCardVersionsRequest,list_model_card_versions_request +ListModelCardVersionsResponse,list_model_card_versions_response +ListModelCardsRequest,list_model_cards_request +ListModelCardsResponse,list_model_cards_response +ListModelCustomizationJobsRequest,list_model_customization_jobs_request +ListModelCustomizationJobsResponse,list_model_customization_jobs_response +ListModelExplainabilityJobDefinitionsRequest,list_model_explainability_job_definitions_request +ListModelExplainabilityJobDefinitionsResponse,list_model_explainability_job_definitions_response +ListModelManifestNodesRequest,list_model_manifest_nodes_request +ListModelManifestNodesResponse,list_model_manifest_nodes_response +ListModelManifestsRequest,list_model_manifests_request +ListModelManifestsResponse,list_model_manifests_response +ListModelMetadataRequest,list_model_metadata_request +ListModelMetadataResponse,list_model_metadata_response +ListModelPackageGroupsInput,list_model_package_groups_input +ListModelPackageGroupsOutput,list_model_package_groups_output +ListModelPackagesInput,list_model_packages_input +ListModelPackagesOutput,list_model_packages_output +ListModelPackagingJobsRequest,list_model_packaging_jobs_request +ListModelPackagingJobsResponse,list_model_packaging_jobs_response +ListModelQualityJobDefinitionsRequest,list_model_quality_job_definitions_request +ListModelQualityJobDefinitionsResponse,list_model_quality_job_definitions_response +ListModelVersionsRequest,list_model_versions_request +ListModelVersionsResponse,list_model_versions_response +ListModelsInput,list_models_input +ListModelsOutput,list_models_output +ListModelsRequest,list_models_request +ListModelsResponse,list_models_response +ListMonitorEvaluationsRequest,list_monitor_evaluations_request +ListMonitorEvaluationsResponse,list_monitor_evaluations_response +ListMonitoredResourcesFilters,list_monitored_resources_filters +ListMonitoredResourcesRequest,list_monitored_resources_request +ListMonitoredResourcesResponse,list_monitored_resources_response +ListMonitoringAlertHistoryRequest,list_monitoring_alert_history_request +ListMonitoringAlertHistoryResponse,list_monitoring_alert_history_response +ListMonitoringAlertsRequest,list_monitoring_alerts_request +ListMonitoringAlertsResponse,list_monitoring_alerts_response +ListMonitoringExecutionsRequest,list_monitoring_executions_request +ListMonitoringExecutionsResponse,list_monitoring_executions_response +ListMonitoringSchedulesRequest,list_monitoring_schedules_request +ListMonitoringSchedulesResponse,list_monitoring_schedules_response +ListMonitorsInput,list_monitors_input +ListMonitorsOutput,list_monitors_output +ListMonitorsRequest,list_monitors_request +ListMonitorsResponse,list_monitors_response +ListMultiRegionAccessPointsRequest,list_multi_region_access_points_request +ListMultiRegionAccessPointsResult,list_multi_region_access_points_result +ListMulticastGroupsByFuotaTaskRequest,list_multicast_groups_by_fuota_task_request +ListMulticastGroupsByFuotaTaskResponse,list_multicast_groups_by_fuota_task_response +ListMulticastGroupsRequest,list_multicast_groups_request +ListMulticastGroupsResponse,list_multicast_groups_response +ListMultipartReadSetUploadsRequest,list_multipart_read_set_uploads_request +ListMultipartReadSetUploadsResponse,list_multipart_read_set_uploads_response +ListMultipartUploadsInput,list_multipart_uploads_input +ListMultipartUploadsOutput,list_multipart_uploads_output +ListMultipartUploadsRequest,list_multipart_uploads_request +ListMultiplexProgramsRequest,list_multiplex_programs_request +ListMultiplexProgramsResponse,list_multiplex_programs_response +ListMultiplexesRequest,list_multiplexes_request +ListMultiplexesResponse,list_multiplexes_response +ListName,list_name +ListNamedQueriesInput,list_named_queries_input +ListNamedQueriesOutput,list_named_queries_output +ListNamedShadowsForThingRequest,list_named_shadows_for_thing_request +ListNamedShadowsForThingResponse,list_named_shadows_for_thing_response +ListNamespacesRequest,list_namespaces_request +ListNamespacesResponse,list_namespaces_response +ListNetworkAnalyzerConfigurationsRequest,list_network_analyzer_configurations_request +ListNetworkAnalyzerConfigurationsResponse,list_network_analyzer_configurations_response +ListNetworkProfilesRequest,list_network_profiles_request +ListNetworkProfilesResult,list_network_profiles_result +ListNetworkResourcesRequest,list_network_resources_request +ListNetworkResourcesResponse,list_network_resources_response +ListNetworkSettingsRequest,list_network_settings_request +ListNetworkSettingsResponse,list_network_settings_response +ListNetworkSitesRequest,list_network_sites_request +ListNetworkSitesResponse,list_network_sites_response +ListNetworksInput,list_networks_input +ListNetworksOutput,list_networks_output +ListNetworksRequest,list_networks_request +ListNetworksResponse,list_networks_response +ListNodeFromTemplateJobsRequest,list_node_from_template_jobs_request +ListNodeFromTemplateJobsResponse,list_node_from_template_jobs_response +ListNodegroupsRequest,list_nodegroups_request +ListNodegroupsResponse,list_nodegroups_response +ListNodesInput,list_nodes_input +ListNodesOutput,list_nodes_output +ListNodesRequest,list_nodes_request +ListNodesResponse,list_nodes_response +ListNotebookExecutionsInput,list_notebook_executions_input +ListNotebookExecutionsOutput,list_notebook_executions_output +ListNotebookInstanceLifecycleConfigsInput,list_notebook_instance_lifecycle_configs_input +ListNotebookInstanceLifecycleConfigsOutput,list_notebook_instance_lifecycle_configs_output +ListNotebookInstancesInput,list_notebook_instances_input +ListNotebookInstancesOutput,list_notebook_instances_output +ListNotebookMetadataInput,list_notebook_metadata_input +ListNotebookMetadataOutput,list_notebook_metadata_output +ListNotebookSessionsRequest,list_notebook_sessions_request +ListNotebookSessionsResponse,list_notebook_sessions_response +ListNotificationChannelsRequest,list_notification_channels_request +ListNotificationChannelsResponse,list_notification_channels_response +ListNotificationRulesFilter,list_notification_rules_filter +ListNotificationRulesRequest,list_notification_rules_request +ListNotificationRulesResult,list_notification_rules_result +ListNotificationsInput,list_notifications_input +ListNotificationsOutput,list_notifications_output +ListNotificationsRequest,list_notifications_request +ListNotificationsResponse,list_notifications_response +ListOTAUpdatesRequest,list_ota_updates_request +ListOTAUpdatesResponse,list_ota_updates_response +ListObjectAttributes,list_object_attributes +ListObjectAttributesRequest,list_object_attributes_request +ListObjectAttributesResponse,list_object_attributes_response +ListObjectChildren,list_object_children +ListObjectChildrenRequest,list_object_children_request +ListObjectChildrenResponse,list_object_children_response +ListObjectParentPaths,list_object_parent_paths +ListObjectParentPathsRequest,list_object_parent_paths_request +ListObjectParentPathsResponse,list_object_parent_paths_response +ListObjectParents,list_object_parents +ListObjectParentsRequest,list_object_parents_request +ListObjectParentsResponse,list_object_parents_response +ListObjectPolicies,list_object_policies +ListObjectPoliciesRequest,list_object_policies_request +ListObjectPoliciesResponse,list_object_policies_response +ListObjectVersionsOutput,list_object_versions_output +ListObjectVersionsRequest,list_object_versions_request +ListObjectsInput,list_objects_input +ListObjectsOutput,list_objects_output +ListObjectsRequest,list_objects_request +ListObjectsV2Output,list_objects_v2_output +ListObjectsV2Request,list_objects_v2_request +ListObservabilityConfigurationsRequest,list_observability_configurations_request +ListObservabilityConfigurationsResponse,list_observability_configurations_response +ListOfTags,list_of_tags +ListOfferingPromotionsRequest,list_offering_promotions_request +ListOfferingPromotionsResult,list_offering_promotions_result +ListOfferingTransactionsRequest,list_offering_transactions_request +ListOfferingTransactionsResult,list_offering_transactions_result +ListOfferingsRequest,list_offerings_request +ListOfferingsResponse,list_offerings_response +ListOfferingsResult,list_offerings_result +ListOnPremisesInstancesInput,list_on_premises_instances_input +ListOnPremisesInstancesOutput,list_on_premises_instances_output +ListOpenCypherQueriesInput,list_open_cypher_queries_input +ListOpenCypherQueriesOutput,list_open_cypher_queries_output +ListOpenIDConnectProviderTagsRequest,list_open_id_connect_provider_tags_request +ListOpenIDConnectProviderTagsResponse,list_open_id_connect_provider_tags_response +ListOpenIDConnectProvidersResponse,list_open_id_connect_providers_response +ListOpenWorkflowExecutionsInput,list_open_workflow_executions_input +ListOperationsInput,list_operations_input +ListOperationsOutput,list_operations_output +ListOperationsRequest,list_operations_request +ListOperationsResponse,list_operations_response +ListOpsItemEventsRequest,list_ops_item_events_request +ListOpsItemEventsResponse,list_ops_item_events_response +ListOpsItemRelatedItemsRequest,list_ops_item_related_items_request +ListOpsItemRelatedItemsResponse,list_ops_item_related_items_response +ListOpsMetadataRequest,list_ops_metadata_request +ListOpsMetadataResult,list_ops_metadata_result +ListOrdersInput,list_orders_input +ListOrdersOutput,list_orders_output +ListOrdersRequest,list_orders_request +ListOrdersResponse,list_orders_response +ListOrganizationAdminAccountsRequest,list_organization_admin_accounts_request +ListOrganizationAdminAccountsResponse,list_organization_admin_accounts_response +ListOrganizationInsightsRequest,list_organization_insights_request +ListOrganizationInsightsResponse,list_organization_insights_response +ListOrganizationPortfolioAccessInput,list_organization_portfolio_access_input +ListOrganizationPortfolioAccessOutput,list_organization_portfolio_access_output +ListOrganizationServiceAccessStatusRequest,list_organization_service_access_status_request +ListOrganizationServiceAccessStatusResponse,list_organization_service_access_status_response +ListOrganizationalUnitsForParentRequest,list_organizational_units_for_parent_request +ListOrganizationalUnitsForParentResponse,list_organizational_units_for_parent_response +ListOrganizationsRequest,list_organizations_request +ListOrganizationsResponse,list_organizations_response +ListOriginAccessControlsRequest,list_origin_access_controls_request +ListOriginAccessControlsResult,list_origin_access_controls_result +ListOriginEndpointsRequest,list_origin_endpoints_request +ListOriginEndpointsResponse,list_origin_endpoints_response +ListOriginRequestPoliciesRequest,list_origin_request_policies_request +ListOriginRequestPoliciesResult,list_origin_request_policies_result +ListOriginationNumbersRequest,list_origination_numbers_request +ListOriginationNumbersResult,list_origination_numbers_result +ListOutgoingCertificatesRequest,list_outgoing_certificates_request +ListOutgoingCertificatesResponse,list_outgoing_certificates_response +ListOutgoingTypedLinks,list_outgoing_typed_links +ListOutgoingTypedLinksRequest,list_outgoing_typed_links_request +ListOutgoingTypedLinksResponse,list_outgoing_typed_links_response +ListOutpostResolversRequest,list_outpost_resolvers_request +ListOutpostResolversResponse,list_outpost_resolvers_response +ListOutpostsInput,list_outposts_input +ListOutpostsOutput,list_outposts_output +ListOutpostsWithS3Request,list_outposts_with_s3_request +ListOutpostsWithS3Result,list_outposts_with_s3_result +ListPHIDetectionJobsRequest,list_phi_detection_jobs_request +ListPHIDetectionJobsResponse,list_phi_detection_jobs_response +ListPackageImportJobsRequest,list_package_import_jobs_request +ListPackageImportJobsResponse,list_package_import_jobs_response +ListPackageVersionAssetsRequest,list_package_version_assets_request +ListPackageVersionAssetsResult,list_package_version_assets_result +ListPackageVersionDependenciesRequest,list_package_version_dependencies_request +ListPackageVersionDependenciesResult,list_package_version_dependencies_result +ListPackageVersionsRequest,list_package_versions_request +ListPackageVersionsResponse,list_package_versions_response +ListPackageVersionsResult,list_package_versions_result +ListPackagesForDomainRequest,list_packages_for_domain_request +ListPackagesForDomainResponse,list_packages_for_domain_response +ListPackagesRequest,list_packages_request +ListPackagesResponse,list_packages_response +ListPackagesResult,list_packages_result +ListPackagingConfigurationsRequest,list_packaging_configurations_request +ListPackagingConfigurationsResponse,list_packaging_configurations_response +ListPackagingGroupsRequest,list_packaging_groups_request +ListPackagingGroupsResponse,list_packaging_groups_response +ListPageReceiptsRequest,list_page_receipts_request +ListPageReceiptsResult,list_page_receipts_result +ListPageResolutionsRequest,list_page_resolutions_request +ListPageResolutionsResult,list_page_resolutions_result +ListPagesByContactRequest,list_pages_by_contact_request +ListPagesByContactResult,list_pages_by_contact_result +ListPagesByEngagementRequest,list_pages_by_engagement_request +ListPagesByEngagementResult,list_pages_by_engagement_result +ListParallelDataRequest,list_parallel_data_request +ListParallelDataResponse,list_parallel_data_response +ListParentsRequest,list_parents_request +ListParentsResponse,list_parents_response +ListParticipantEventsRequest,list_participant_events_request +ListParticipantEventsResponse,list_participant_events_response +ListParticipantsRequest,list_participants_request +ListParticipantsResponse,list_participants_response +ListPartnerAccountsRequest,list_partner_accounts_request +ListPartnerAccountsResponse,list_partner_accounts_response +ListPartnerEventSourceAccountsRequest,list_partner_event_source_accounts_request +ListPartnerEventSourceAccountsResponse,list_partner_event_source_accounts_response +ListPartnerEventSourcesRequest,list_partner_event_sources_request +ListPartnerEventSourcesResponse,list_partner_event_sources_response +ListPartsInput,list_parts_input +ListPartsOutput,list_parts_output +ListPartsRequest,list_parts_request +ListPeeringsRequest,list_peerings_request +ListPeeringsResponse,list_peerings_response +ListPendingInvitationResourcesRequest,list_pending_invitation_resources_request +ListPendingInvitationResourcesResponse,list_pending_invitation_resources_response +ListPerformanceAnalysisReportsRequest,list_performance_analysis_reports_request +ListPerformanceAnalysisReportsResponse,list_performance_analysis_reports_response +ListPermissionAssociationsRequest,list_permission_associations_request +ListPermissionAssociationsResponse,list_permission_associations_response +ListPermissionGroupsByUserRequest,list_permission_groups_by_user_request +ListPermissionGroupsByUserResponse,list_permission_groups_by_user_response +ListPermissionGroupsRequest,list_permission_groups_request +ListPermissionGroupsResponse,list_permission_groups_response +ListPermissionSetProvisioningStatusRequest,list_permission_set_provisioning_status_request +ListPermissionSetProvisioningStatusResponse,list_permission_set_provisioning_status_response +ListPermissionSetsProvisionedToAccountRequest,list_permission_sets_provisioned_to_account_request +ListPermissionSetsProvisionedToAccountResponse,list_permission_sets_provisioned_to_account_response +ListPermissionSetsRequest,list_permission_sets_request +ListPermissionSetsResponse,list_permission_sets_response +ListPermissionVersionsRequest,list_permission_versions_request +ListPermissionVersionsResponse,list_permission_versions_response +ListPermissionsRequest,list_permissions_request +ListPermissionsResponse,list_permissions_response +ListPhoneNumberOrdersRequest,list_phone_number_orders_request +ListPhoneNumberOrdersResponse,list_phone_number_orders_response +ListPhoneNumbersOptedOutInput,list_phone_numbers_opted_out_input +ListPhoneNumbersOptedOutResponse,list_phone_numbers_opted_out_response +ListPhoneNumbersRequest,list_phone_numbers_request +ListPhoneNumbersResponse,list_phone_numbers_response +ListPhoneNumbersSummary,list_phone_numbers_summary +ListPhoneNumbersSummaryList,list_phone_numbers_summary_list +ListPhoneNumbersV2Request,list_phone_numbers_v2_request +ListPhoneNumbersV2Response,list_phone_numbers_v2_response +ListPickupLocationsRequest,list_pickup_locations_request +ListPickupLocationsResult,list_pickup_locations_result +ListPiiEntitiesDetectionJobsRequest,list_pii_entities_detection_jobs_request +ListPiiEntitiesDetectionJobsResponse,list_pii_entities_detection_jobs_response +ListPipelineBlueprintsResponse,list_pipeline_blueprints_response +ListPipelineExecutionStepsRequest,list_pipeline_execution_steps_request +ListPipelineExecutionStepsResponse,list_pipeline_execution_steps_response +ListPipelineExecutionsInput,list_pipeline_executions_input +ListPipelineExecutionsOutput,list_pipeline_executions_output +ListPipelineExecutionsRequest,list_pipeline_executions_request +ListPipelineExecutionsResponse,list_pipeline_executions_response +ListPipelineParametersForExecutionRequest,list_pipeline_parameters_for_execution_request +ListPipelineParametersForExecutionResponse,list_pipeline_parameters_for_execution_response +ListPipelinesInput,list_pipelines_input +ListPipelinesOutput,list_pipelines_output +ListPipelinesRequest,list_pipelines_request +ListPipelinesResponse,list_pipelines_response +ListPipesRequest,list_pipes_request +ListPipesResponse,list_pipes_response +ListPlaceIndexesRequest,list_place_indexes_request +ListPlaceIndexesResponse,list_place_indexes_response +ListPlaceIndexesResponseEntry,list_place_indexes_response_entry +ListPlacementsRequest,list_placements_request +ListPlacementsResponse,list_placements_response +ListPlatformApplicationsInput,list_platform_applications_input +ListPlatformApplicationsResponse,list_platform_applications_response +ListPlatformBranchesRequest,list_platform_branches_request +ListPlatformBranchesResult,list_platform_branches_result +ListPlatformVersionsRequest,list_platform_versions_request +ListPlatformVersionsResult,list_platform_versions_result +ListPlaybackConfigurationsRequest,list_playback_configurations_request +ListPlaybackConfigurationsResponse,list_playback_configurations_response +ListPlaybackKeyPairsRequest,list_playback_key_pairs_request +ListPlaybackKeyPairsResponse,list_playback_key_pairs_response +ListPluginsRequest,list_plugins_request +ListPluginsResponse,list_plugins_response +ListPoliciesForTargetRequest,list_policies_for_target_request +ListPoliciesForTargetResponse,list_policies_for_target_response +ListPoliciesGrantingServiceAccessEntry,list_policies_granting_service_access_entry +ListPoliciesGrantingServiceAccessRequest,list_policies_granting_service_access_request +ListPoliciesGrantingServiceAccessResponse,list_policies_granting_service_access_response +ListPoliciesInput,list_policies_input +ListPoliciesOutput,list_policies_output +ListPoliciesRequest,list_policies_request +ListPoliciesResponse,list_policies_response +ListPolicyAttachments,list_policy_attachments +ListPolicyAttachmentsRequest,list_policy_attachments_request +ListPolicyAttachmentsResponse,list_policy_attachments_response +ListPolicyGenerationsRequest,list_policy_generations_request +ListPolicyGenerationsResponse,list_policy_generations_response +ListPolicyPrincipalsRequest,list_policy_principals_request +ListPolicyPrincipalsResponse,list_policy_principals_response +ListPolicyStoresInput,list_policy_stores_input +ListPolicyStoresOutput,list_policy_stores_output +ListPolicyTagsRequest,list_policy_tags_request +ListPolicyTagsResponse,list_policy_tags_response +ListPolicyTemplatesInput,list_policy_templates_input +ListPolicyTemplatesOutput,list_policy_templates_output +ListPolicyVersionsRequest,list_policy_versions_request +ListPolicyVersionsResponse,list_policy_versions_response +ListPoolOriginationIdentitiesRequest,list_pool_origination_identities_request +ListPoolOriginationIdentitiesResult,list_pool_origination_identities_result +ListPortalsRequest,list_portals_request +ListPortalsResponse,list_portals_response +ListPortfolioAccessInput,list_portfolio_access_input +ListPortfolioAccessOutput,list_portfolio_access_output +ListPortfoliosForProductInput,list_portfolios_for_product_input +ListPortfoliosForProductOutput,list_portfolios_for_product_output +ListPortfoliosInput,list_portfolios_input +ListPortfoliosOutput,list_portfolios_output +ListPositionConfigurationsRequest,list_position_configurations_request +ListPositionConfigurationsResponse,list_position_configurations_response +ListPredictorBacktestExportJobsRequest,list_predictor_backtest_export_jobs_request +ListPredictorBacktestExportJobsResponse,list_predictor_backtest_export_jobs_response +ListPredictorsRequest,list_predictors_request +ListPredictorsResponse,list_predictors_response +ListPrefetchSchedulesRequest,list_prefetch_schedules_request +ListPrefetchSchedulesResponse,list_prefetch_schedules_response +ListPreparedStatementsInput,list_prepared_statements_input +ListPreparedStatementsOutput,list_prepared_statements_output +ListPresetsRequest,list_presets_request +ListPresetsResponse,list_presets_response +ListPreviewRotationShiftsRequest,list_preview_rotation_shifts_request +ListPreviewRotationShiftsResult,list_preview_rotation_shifts_result +ListPriceListsRequest,list_price_lists_request +ListPriceListsResponse,list_price_lists_response +ListPricesRequest,list_prices_request +ListPricesResponse,list_prices_response +ListPricingPlansAssociatedWithPricingRuleInput,list_pricing_plans_associated_with_pricing_rule_input +ListPricingPlansAssociatedWithPricingRuleOutput,list_pricing_plans_associated_with_pricing_rule_output +ListPricingPlansFilter,list_pricing_plans_filter +ListPricingPlansInput,list_pricing_plans_input +ListPricingPlansOutput,list_pricing_plans_output +ListPricingRulesAssociatedToPricingPlanInput,list_pricing_rules_associated_to_pricing_plan_input +ListPricingRulesAssociatedToPricingPlanOutput,list_pricing_rules_associated_to_pricing_plan_output +ListPricingRulesFilter,list_pricing_rules_filter +ListPricingRulesInput,list_pricing_rules_input +ListPricingRulesOutput,list_pricing_rules_output +ListPrincipalPoliciesRequest,list_principal_policies_request +ListPrincipalPoliciesResponse,list_principal_policies_response +ListPrincipalThingsRequest,list_principal_things_request +ListPrincipalThingsResponse,list_principal_things_response +ListPrincipalsForPortfolioInput,list_principals_for_portfolio_input +ListPrincipalsForPortfolioOutput,list_principals_for_portfolio_output +ListPrincipalsRequest,list_principals_request +ListPrincipalsResponse,list_principals_response +ListProblemsRequest,list_problems_request +ListProblemsResponse,list_problems_response +ListProcessingJobsRequest,list_processing_jobs_request +ListProcessingJobsResponse,list_processing_jobs_response +ListProductSubscriptionsRequest,list_product_subscriptions_request +ListProductSubscriptionsResponse,list_product_subscriptions_response +ListProfileNotificationsInput,list_profile_notifications_input +ListProfileNotificationsOutput,list_profile_notifications_output +ListProfileObjectTypeItem,list_profile_object_type_item +ListProfileObjectTypeTemplateItem,list_profile_object_type_template_item +ListProfileObjectTypeTemplatesRequest,list_profile_object_type_templates_request +ListProfileObjectTypeTemplatesResponse,list_profile_object_type_templates_response +ListProfileObjectTypesRequest,list_profile_object_types_request +ListProfileObjectTypesResponse,list_profile_object_types_response +ListProfileObjectsItem,list_profile_objects_item +ListProfileObjectsRequest,list_profile_objects_request +ListProfileObjectsResponse,list_profile_objects_response +ListProfilePermissionsRequest,list_profile_permissions_request +ListProfilePermissionsResponse,list_profile_permissions_response +ListProfileSharesInput,list_profile_shares_input +ListProfileSharesOutput,list_profile_shares_output +ListProfileTimesRequest,list_profile_times_request +ListProfileTimesResponse,list_profile_times_response +ListProfilesInput,list_profiles_input +ListProfilesOutput,list_profiles_output +ListProfilesRequest,list_profiles_request +ListProfilesResponse,list_profiles_response +ListProfilingGroupsRequest,list_profiling_groups_request +ListProfilingGroupsResponse,list_profiling_groups_response +ListProgressUpdateStreamsRequest,list_progress_update_streams_request +ListProgressUpdateStreamsResult,list_progress_update_streams_result +ListProjectAssetsRequest,list_project_assets_request +ListProjectAssetsResponse,list_project_assets_response +ListProjectPoliciesRequest,list_project_policies_request +ListProjectPoliciesResponse,list_project_policies_response +ListProjectsInput,list_projects_input +ListProjectsOutput,list_projects_output +ListProjectsRequest,list_projects_request +ListProjectsResponse,list_projects_response +ListProjectsResult,list_projects_result +ListPromptsRequest,list_prompts_request +ListPromptsResponse,list_prompts_response +ListProposalVotesInput,list_proposal_votes_input +ListProposalVotesOutput,list_proposal_votes_output +ListProposalsInput,list_proposals_input +ListProposalsOutput,list_proposals_output +ListProtectedQueriesInput,list_protected_queries_input +ListProtectedQueriesOutput,list_protected_queries_output +ListProtectedResourcesByBackupVaultInput,list_protected_resources_by_backup_vault_input +ListProtectedResourcesByBackupVaultOutput,list_protected_resources_by_backup_vault_output +ListProtectedResourcesInput,list_protected_resources_input +ListProtectedResourcesOutput,list_protected_resources_output +ListProtectionGroupsRequest,list_protection_groups_request +ListProtectionGroupsResponse,list_protection_groups_response +ListProtectionsRequest,list_protections_request +ListProtectionsResponse,list_protections_response +ListProtocolsListsRequest,list_protocols_lists_request +ListProtocolsListsResponse,list_protocols_lists_response +ListProvisionedCapacityInput,list_provisioned_capacity_input +ListProvisionedCapacityOutput,list_provisioned_capacity_output +ListProvisionedConcurrencyConfigsRequest,list_provisioned_concurrency_configs_request +ListProvisionedConcurrencyConfigsResponse,list_provisioned_concurrency_configs_response +ListProvisionedModelThroughputsRequest,list_provisioned_model_throughputs_request +ListProvisionedModelThroughputsResponse,list_provisioned_model_throughputs_response +ListProvisionedProductPlansInput,list_provisioned_product_plans_input +ListProvisionedProductPlansOutput,list_provisioned_product_plans_output +ListProvisioningArtifactsForServiceActionInput,list_provisioning_artifacts_for_service_action_input +ListProvisioningArtifactsForServiceActionOutput,list_provisioning_artifacts_for_service_action_output +ListProvisioningArtifactsInput,list_provisioning_artifacts_input +ListProvisioningArtifactsOutput,list_provisioning_artifacts_output +ListProvisioningTemplateVersionsRequest,list_provisioning_template_versions_request +ListProvisioningTemplateVersionsResponse,list_provisioning_template_versions_response +ListProvisioningTemplatesRequest,list_provisioning_templates_request +ListProvisioningTemplatesResponse,list_provisioning_templates_response +ListProxySessionsRequest,list_proxy_sessions_request +ListProxySessionsResponse,list_proxy_sessions_response +ListPublicKeysRequest,list_public_keys_request +ListPublicKeysResponse,list_public_keys_response +ListPublicKeysResult,list_public_keys_result +ListPublishedSchemaArnsRequest,list_published_schema_arns_request +ListPublishedSchemaArnsResponse,list_published_schema_arns_response +ListPublishingDestinationsRequest,list_publishing_destinations_request +ListPublishingDestinationsResponse,list_publishing_destinations_response +ListPullRequestsInput,list_pull_requests_input +ListPullRequestsOutput,list_pull_requests_output +ListQualificationRequestsRequest,list_qualification_requests_request +ListQualificationRequestsResponse,list_qualification_requests_response +ListQualificationTypesRequest,list_qualification_types_request +ListQualificationTypesResponse,list_qualification_types_response +ListQueriesRequest,list_queries_request +ListQueriesResponse,list_queries_response +ListQueryExecutionsInput,list_query_executions_input +ListQueryExecutionsOutput,list_query_executions_output +ListQueryLoggingConfigsRequest,list_query_logging_configs_request +ListQueryLoggingConfigsResponse,list_query_logging_configs_response +ListQuerySuggestionsBlockListsRequest,list_query_suggestions_block_lists_request +ListQuerySuggestionsBlockListsResponse,list_query_suggestions_block_lists_response +ListQueueQuickConnectsRequest,list_queue_quick_connects_request +ListQueueQuickConnectsResponse,list_queue_quick_connects_response +ListQueueTagsRequest,list_queue_tags_request +ListQueueTagsResult,list_queue_tags_result +ListQueuedMessagesRequest,list_queued_messages_request +ListQueuedMessagesResponse,list_queued_messages_response +ListQueuesRequest,list_queues_request +ListQueuesResponse,list_queues_response +ListQueuesResult,list_queues_result +ListQuickConnectsRequest,list_quick_connects_request +ListQuickConnectsResponse,list_quick_connects_response +ListRasterDataCollectionsInput,list_raster_data_collections_input +ListRasterDataCollectionsOutput,list_raster_data_collections_output +ListRateBasedRulesRequest,list_rate_based_rules_request +ListRateBasedRulesResponse,list_rate_based_rules_response +ListReadSetActivationJobsRequest,list_read_set_activation_jobs_request +ListReadSetActivationJobsResponse,list_read_set_activation_jobs_response +ListReadSetExportJobsRequest,list_read_set_export_jobs_request +ListReadSetExportJobsResponse,list_read_set_export_jobs_response +ListReadSetImportJobsRequest,list_read_set_import_jobs_request +ListReadSetImportJobsResponse,list_read_set_import_jobs_response +ListReadSetUploadPartsRequest,list_read_set_upload_parts_request +ListReadSetUploadPartsResponse,list_read_set_upload_parts_response +ListReadSetsRequest,list_read_sets_request +ListReadSetsResponse,list_read_sets_response +ListReadinessChecksRequest,list_readiness_checks_request +ListReadinessChecksResponse,list_readiness_checks_response +ListRealtimeContactAnalysisSegmentsRequest,list_realtime_contact_analysis_segments_request +ListRealtimeContactAnalysisSegmentsResponse,list_realtime_contact_analysis_segments_response +ListRealtimeLogConfigsRequest,list_realtime_log_configs_request +ListRealtimeLogConfigsResult,list_realtime_log_configs_result +ListReceiptFiltersResponse,list_receipt_filters_response +ListReceiptRuleSetsRequest,list_receipt_rule_sets_request +ListReceiptRuleSetsResponse,list_receipt_rule_sets_response +ListReceivedGrantsForOrganizationRequest,list_received_grants_for_organization_request +ListReceivedGrantsForOrganizationResponse,list_received_grants_for_organization_response +ListReceivedGrantsRequest,list_received_grants_request +ListReceivedGrantsResponse,list_received_grants_response +ListReceivedLicensesForOrganizationRequest,list_received_licenses_for_organization_request +ListReceivedLicensesForOrganizationResponse,list_received_licenses_for_organization_response +ListReceivedLicensesRequest,list_received_licenses_request +ListReceivedLicensesResponse,list_received_licenses_response +ListRecipeVersionsRequest,list_recipe_versions_request +ListRecipeVersionsResponse,list_recipe_versions_response +ListRecipesRequest,list_recipes_request +ListRecipesResponse,list_recipes_response +ListRecommendationFeedbackRequest,list_recommendation_feedback_request +ListRecommendationFeedbackResponse,list_recommendation_feedback_response +ListRecommendationTemplatesRequest,list_recommendation_templates_request +ListRecommendationTemplatesResponse,list_recommendation_templates_response +ListRecommendationsRequest,list_recommendations_request +ListRecommendationsResponse,list_recommendations_response +ListRecommendedIntentsRequest,list_recommended_intents_request +ListRecommendedIntentsResponse,list_recommended_intents_response +ListRecommenderConfigurationsResponse,list_recommender_configurations_response +ListRecommendersRequest,list_recommenders_request +ListRecommendersResponse,list_recommenders_response +ListRecordHistoryInput,list_record_history_input +ListRecordHistoryOutput,list_record_history_output +ListRecordHistorySearchFilter,list_record_history_search_filter +ListRecordingConfigurationsRequest,list_recording_configurations_request +ListRecordingConfigurationsResponse,list_recording_configurations_response +ListRecordsRequest,list_records_request +ListRecordsResponse,list_records_response +ListRecoveryGroupsRequest,list_recovery_groups_request +ListRecoveryGroupsResponse,list_recovery_groups_response +ListRecoveryPointsByBackupVaultInput,list_recovery_points_by_backup_vault_input +ListRecoveryPointsByBackupVaultOutput,list_recovery_points_by_backup_vault_output +ListRecoveryPointsByLegalHoldInput,list_recovery_points_by_legal_hold_input +ListRecoveryPointsByLegalHoldOutput,list_recovery_points_by_legal_hold_output +ListRecoveryPointsByResourceInput,list_recovery_points_by_resource_input +ListRecoveryPointsByResourceOutput,list_recovery_points_by_resource_output +ListRecoveryPointsRequest,list_recovery_points_request +ListRecoveryPointsResponse,list_recovery_points_response +ListReferenceImportJobsRequest,list_reference_import_jobs_request +ListReferenceImportJobsResponse,list_reference_import_jobs_response +ListReferenceStoresRequest,list_reference_stores_request +ListReferenceStoresResponse,list_reference_stores_response +ListReferencesRequest,list_references_request +ListReferencesResponse,list_references_response +ListRefreshSchedulesRequest,list_refresh_schedules_request +ListRefreshSchedulesResponse,list_refresh_schedules_response +ListRegexMatchSetsRequest,list_regex_match_sets_request +ListRegexMatchSetsResponse,list_regex_match_sets_response +ListRegexPatternSetsRequest,list_regex_pattern_sets_request +ListRegexPatternSetsResponse,list_regex_pattern_sets_response +ListRegionalBucketsRequest,list_regional_buckets_request +ListRegionalBucketsResult,list_regional_buckets_result +ListRegionsRequest,list_regions_request +ListRegionsResponse,list_regions_response +ListRegistriesInput,list_registries_input +ListRegistriesRequest,list_registries_request +ListRegistriesResponse,list_registries_response +ListRelatedItemsInput,list_related_items_input +ListRelatedItemsOutput,list_related_items_output +ListRelatedResourcesForAuditFindingRequest,list_related_resources_for_audit_finding_request +ListRelatedResourcesForAuditFindingResponse,list_related_resources_for_audit_finding_response +ListReleaseLabelsInput,list_release_labels_input +ListReleaseLabelsOutput,list_release_labels_output +ListRemoteAccessSessionsRequest,list_remote_access_sessions_request +ListRemoteAccessSessionsResult,list_remote_access_sessions_result +ListReplacePermissionAssociationsWorkRequest,list_replace_permission_associations_work_request +ListReplacePermissionAssociationsWorkResponse,list_replace_permission_associations_work_response +ListReplaysRequest,list_replays_request +ListReplaysResponse,list_replays_response +ListReplicationSetsInput,list_replication_sets_input +ListReplicationSetsOutput,list_replication_sets_output +ListReportDefinitionsRequest,list_report_definitions_request +ListReportDefinitionsResult,list_report_definitions_result +ListReportGroupsInput,list_report_groups_input +ListReportGroupsOutput,list_report_groups_output +ListReportJobsInput,list_report_jobs_input +ListReportJobsOutput,list_report_jobs_output +ListReportPlansInput,list_report_plans_input +ListReportPlansOutput,list_report_plans_output +ListReportsForReportGroupInput,list_reports_for_report_group_input +ListReportsForReportGroupOutput,list_reports_for_report_group_output +ListReportsInput,list_reports_input +ListReportsOutput,list_reports_output +ListRepositoriesForApprovalRuleTemplateInput,list_repositories_for_approval_rule_template_input +ListRepositoriesForApprovalRuleTemplateOutput,list_repositories_for_approval_rule_template_output +ListRepositoriesInDomainRequest,list_repositories_in_domain_request +ListRepositoriesInDomainResult,list_repositories_in_domain_result +ListRepositoriesInput,list_repositories_input +ListRepositoriesOutput,list_repositories_output +ListRepositoriesRequest,list_repositories_request +ListRepositoriesResult,list_repositories_result +ListRepositoryAssociationsRequest,list_repository_associations_request +ListRepositoryAssociationsResponse,list_repository_associations_response +ListRepositorySyncDefinitionsInput,list_repository_sync_definitions_input +ListRepositorySyncDefinitionsOutput,list_repository_sync_definitions_output +ListRequest,list_request +ListRequestedServiceQuotaChangeHistoryByQuotaRequest,list_requested_service_quota_change_history_by_quota_request +ListRequestedServiceQuotaChangeHistoryByQuotaResponse,list_requested_service_quota_change_history_by_quota_response +ListRequestedServiceQuotaChangeHistoryRequest,list_requested_service_quota_change_history_request +ListRequestedServiceQuotaChangeHistoryResponse,list_requested_service_quota_change_history_response +ListRescoreExecutionPlansRequest,list_rescore_execution_plans_request +ListRescoreExecutionPlansResponse,list_rescore_execution_plans_response +ListReservationsRequest,list_reservations_request +ListReservationsResponse,list_reservations_response +ListResiliencyPoliciesRequest,list_resiliency_policies_request +ListResiliencyPoliciesResponse,list_resiliency_policies_response +ListResolverConfigsRequest,list_resolver_configs_request +ListResolverConfigsResponse,list_resolver_configs_response +ListResolverDnssecConfigsRequest,list_resolver_dnssec_configs_request +ListResolverDnssecConfigsResponse,list_resolver_dnssec_configs_response +ListResolverEndpointIpAddressesRequest,list_resolver_endpoint_ip_addresses_request +ListResolverEndpointIpAddressesResponse,list_resolver_endpoint_ip_addresses_response +ListResolverEndpointsRequest,list_resolver_endpoints_request +ListResolverEndpointsResponse,list_resolver_endpoints_response +ListResolverQueryLogConfigAssociationsRequest,list_resolver_query_log_config_associations_request +ListResolverQueryLogConfigAssociationsResponse,list_resolver_query_log_config_associations_response +ListResolverQueryLogConfigsRequest,list_resolver_query_log_configs_request +ListResolverQueryLogConfigsResponse,list_resolver_query_log_configs_response +ListResolverRuleAssociationsRequest,list_resolver_rule_associations_request +ListResolverRuleAssociationsResponse,list_resolver_rule_associations_response +ListResolverRulesRequest,list_resolver_rules_request +ListResolverRulesResponse,list_resolver_rules_response +ListResolversByFunctionRequest,list_resolvers_by_function_request +ListResolversByFunctionResponse,list_resolvers_by_function_response +ListResolversRequest,list_resolvers_request +ListResolversResponse,list_resolvers_response +ListResourceCatalogsRequest,list_resource_catalogs_request +ListResourceCatalogsResponse,list_resource_catalogs_response +ListResourceComplianceSummariesRequest,list_resource_compliance_summaries_request +ListResourceComplianceSummariesResult,list_resource_compliance_summaries_result +ListResourceDataSyncRequest,list_resource_data_sync_request +ListResourceDataSyncResult,list_resource_data_sync_result +ListResourceDefinitionVersionsRequest,list_resource_definition_versions_request +ListResourceDefinitionVersionsResponse,list_resource_definition_versions_response +ListResourceDefinitionsRequest,list_resource_definitions_request +ListResourceDefinitionsResponse,list_resource_definitions_response +ListResourceDelegatesRequest,list_resource_delegates_request +ListResourceDelegatesResponse,list_resource_delegates_response +ListResourceEvaluationsRequest,list_resource_evaluations_request +ListResourceEvaluationsResponse,list_resource_evaluations_response +ListResourceInventoryRequest,list_resource_inventory_request +ListResourceInventoryResponse,list_resource_inventory_response +ListResourcePoliciesRequest,list_resource_policies_request +ListResourcePoliciesResult,list_resource_policies_result +ListResourceProfileArtifactsRequest,list_resource_profile_artifacts_request +ListResourceProfileArtifactsResponse,list_resource_profile_artifacts_response +ListResourceProfileDetectionsRequest,list_resource_profile_detections_request +ListResourceProfileDetectionsResponse,list_resource_profile_detections_response +ListResourceRecordSetsRequest,list_resource_record_sets_request +ListResourceRecordSetsResponse,list_resource_record_sets_response +ListResourceRequestsInput,list_resource_requests_input +ListResourceRequestsOutput,list_resource_requests_output +ListResourceServersRequest,list_resource_servers_request +ListResourceServersResponse,list_resource_servers_response +ListResourceSetResourcesRequest,list_resource_set_resources_request +ListResourceSetResourcesResponse,list_resource_set_resources_response +ListResourceSetsRequest,list_resource_sets_request +ListResourceSetsResponse,list_resource_sets_response +ListResourceSharePermissionsRequest,list_resource_share_permissions_request +ListResourceSharePermissionsResponse,list_resource_share_permissions_response +ListResourceTagsRequest,list_resource_tags_request +ListResourceTagsResponse,list_resource_tags_response +ListResourceTypesRequest,list_resource_types_request +ListResourceTypesResponse,list_resource_types_response +ListResourcesAssociatedToCustomLineItemFilter,list_resources_associated_to_custom_line_item_filter +ListResourcesAssociatedToCustomLineItemInput,list_resources_associated_to_custom_line_item_input +ListResourcesAssociatedToCustomLineItemOutput,list_resources_associated_to_custom_line_item_output +ListResourcesAssociatedToCustomLineItemResponseElement,list_resources_associated_to_custom_line_item_response_element +ListResourcesFilters,list_resources_filters +ListResourcesForTagOptionInput,list_resources_for_tag_option_input +ListResourcesForTagOptionOutput,list_resources_for_tag_option_output +ListResourcesForWebACLRequest,list_resources_for_web_acl_request +ListResourcesForWebACLResponse,list_resources_for_web_acl_response +ListResourcesInProtectionGroupRequest,list_resources_in_protection_group_request +ListResourcesInProtectionGroupResponse,list_resources_in_protection_group_response +ListResourcesInput,list_resources_input +ListResourcesOutput,list_resources_output +ListResourcesRequest,list_resources_request +ListResourcesResponse,list_resources_response +ListResourcesResult,list_resources_result +ListResponseHeadersPoliciesRequest,list_response_headers_policies_request +ListResponseHeadersPoliciesResult,list_response_headers_policies_result +ListResponsePlansInput,list_response_plans_input +ListResponsePlansOutput,list_response_plans_output +ListRestoreJobsInput,list_restore_jobs_input +ListRestoreJobsOutput,list_restore_jobs_output +ListRetainedMessagesRequest,list_retained_messages_request +ListRetainedMessagesResponse,list_retained_messages_response +ListRetirableGrantsRequest,list_retirable_grants_request +ListRetrainingSchedulersRequest,list_retraining_schedulers_request +ListRetrainingSchedulersResponse,list_retraining_schedulers_response +ListReusableDelegationSetsRequest,list_reusable_delegation_sets_request +ListReusableDelegationSetsResponse,list_reusable_delegation_sets_response +ListReviewPolicyResultsForHITRequest,list_review_policy_results_for_hit_request +ListReviewPolicyResultsForHITResponse,list_review_policy_results_for_hit_response +ListReviewableHITsRequest,list_reviewable_hits_request +ListReviewableHITsResponse,list_reviewable_hits_response +ListRevisionAssetsRequest,list_revision_assets_request +ListRevisionAssetsResponse,list_revision_assets_response +ListRobotApplicationsRequest,list_robot_applications_request +ListRobotApplicationsResponse,list_robot_applications_response +ListRobotsRequest,list_robots_request +ListRobotsResponse,list_robots_response +ListRoleAliasesRequest,list_role_aliases_request +ListRoleAliasesResponse,list_role_aliases_response +ListRolePoliciesRequest,list_role_policies_request +ListRolePoliciesResponse,list_role_policies_response +ListRoleTagsRequest,list_role_tags_request +ListRoleTagsResponse,list_role_tags_response +ListRolesRequest,list_roles_request +ListRolesResponse,list_roles_response +ListRoomMembershipsRequest,list_room_memberships_request +ListRoomMembershipsResponse,list_room_memberships_response +ListRoomsRequest,list_rooms_request +ListRoomsResponse,list_rooms_response +ListRootsRequest,list_roots_request +ListRootsResponse,list_roots_response +ListRotationOverridesRequest,list_rotation_overrides_request +ListRotationOverridesResult,list_rotation_overrides_result +ListRotationShiftsRequest,list_rotation_shifts_request +ListRotationShiftsResult,list_rotation_shifts_result +ListRotationsRequest,list_rotations_request +ListRotationsResult,list_rotations_result +ListRouteCalculatorsRequest,list_route_calculators_request +ListRouteCalculatorsResponse,list_route_calculators_response +ListRouteCalculatorsResponseEntry,list_route_calculators_response_entry +ListRoutesInput,list_routes_input +ListRoutesOutput,list_routes_output +ListRoutesRequest,list_routes_request +ListRoutesResponse,list_routes_response +ListRoutingControlsRequest,list_routing_controls_request +ListRoutingControlsResponse,list_routing_controls_response +ListRoutingProfileQueuesRequest,list_routing_profile_queues_request +ListRoutingProfileQueuesResponse,list_routing_profile_queues_response +ListRoutingProfilesRequest,list_routing_profiles_request +ListRoutingProfilesResponse,list_routing_profiles_response +ListRuleBasedMatchesRequest,list_rule_based_matches_request +ListRuleBasedMatchesResponse,list_rule_based_matches_response +ListRuleGroupsNamespacesRequest,list_rule_groups_namespaces_request +ListRuleGroupsNamespacesResponse,list_rule_groups_namespaces_response +ListRuleGroupsRequest,list_rule_groups_request +ListRuleGroupsResponse,list_rule_groups_response +ListRuleNamesByTargetRequest,list_rule_names_by_target_request +ListRuleNamesByTargetResponse,list_rule_names_by_target_response +ListRulesOutput,list_rules_output +ListRulesPackagesRequest,list_rules_packages_request +ListRulesPackagesResponse,list_rules_packages_response +ListRulesRequest,list_rules_request +ListRulesResponse,list_rules_response +ListRulesetsRequest,list_rulesets_request +ListRulesetsResponse,list_rulesets_response +ListRumMetricsDestinationsRequest,list_rum_metrics_destinations_request +ListRumMetricsDestinationsResponse,list_rum_metrics_destinations_response +ListRunGroupsRequest,list_run_groups_request +ListRunGroupsResponse,list_run_groups_response +ListRunTasksRequest,list_run_tasks_request +ListRunTasksResponse,list_run_tasks_response +ListRunsRequest,list_runs_request +ListRunsResponse,list_runs_response +ListRunsResult,list_runs_result +ListRxNormInferenceJobsRequest,list_rx_norm_inference_jobs_request +ListRxNormInferenceJobsResponse,list_rx_norm_inference_jobs_response +ListS3BucketsRequest,list_s3_buckets_request +ListS3BucketsResponse,list_s3_buckets_response +ListS3ResourcesRequest,list_s3_resources_request +ListS3ResourcesResult,list_s3_resources_result +ListSAMLProviderTagsRequest,list_saml_provider_tags_request +ListSAMLProviderTagsResponse,list_saml_provider_tags_response +ListSAMLProvidersResponse,list_saml_providers_response +ListSMSSandboxPhoneNumbersInput,list_sms_sandbox_phone_numbers_input +ListSMSSandboxPhoneNumbersResult,list_sms_sandbox_phone_numbers_result +ListSNOMEDCTInferenceJobsRequest,list_snomedct_inference_jobs_request +ListSNOMEDCTInferenceJobsResponse,list_snomedct_inference_jobs_response +ListSSHPublicKeysRequest,list_ssh_public_keys_request +ListSSHPublicKeysResponse,list_ssh_public_keys_response +ListSafetyRulesRequest,list_safety_rules_request +ListSafetyRulesResponse,list_safety_rules_response +ListSamplesRequest,list_samples_request +ListSamplesResult,list_samples_result +ListSatellitesRequest,list_satellites_request +ListSatellitesResponse,list_satellites_response +ListSavingsPlansPurchaseRecommendationGenerationRequest,list_savings_plans_purchase_recommendation_generation_request +ListSavingsPlansPurchaseRecommendationGenerationResponse,list_savings_plans_purchase_recommendation_generation_response +ListScansRequest,list_scans_request +ListScansResponse,list_scans_response +ListScenesRequest,list_scenes_request +ListScenesResponse,list_scenes_response +ListScheduleGroupsInput,list_schedule_groups_input +ListScheduleGroupsOutput,list_schedule_groups_output +ListScheduledActionsRequest,list_scheduled_actions_request +ListScheduledActionsResponse,list_scheduled_actions_response +ListScheduledAuditsRequest,list_scheduled_audits_request +ListScheduledAuditsResponse,list_scheduled_audits_response +ListScheduledQueriesRequest,list_scheduled_queries_request +ListScheduledQueriesResponse,list_scheduled_queries_response +ListSchedulesInput,list_schedules_input +ListSchedulesOutput,list_schedules_output +ListSchedulesRequest,list_schedules_request +ListSchedulesResponse,list_schedules_response +ListSchedulingPoliciesRequest,list_scheduling_policies_request +ListSchedulingPoliciesResponse,list_scheduling_policies_response +ListSchemaExtensionsRequest,list_schema_extensions_request +ListSchemaExtensionsResult,list_schema_extensions_result +ListSchemaMappingsInput,list_schema_mappings_input +ListSchemaMappingsOutput,list_schema_mappings_output +ListSchemaVersionsInput,list_schema_versions_input +ListSchemaVersionsRequest,list_schema_versions_request +ListSchemaVersionsResponse,list_schema_versions_response +ListSchemasInput,list_schemas_input +ListSchemasOutput,list_schemas_output +ListSchemasRequest,list_schemas_request +ListSchemasResponse,list_schemas_response +ListScramSecretsRequest,list_scram_secrets_request +ListScramSecretsResponse,list_scram_secrets_response +ListScriptsInput,list_scripts_input +ListScriptsOutput,list_scripts_output +ListSecretVersionIdsRequest,list_secret_version_ids_request +ListSecretVersionIdsResponse,list_secret_version_ids_response +ListSecretsRequest,list_secrets_request +ListSecretsResponse,list_secrets_response +ListSecurityConfigsRequest,list_security_configs_request +ListSecurityConfigsResponse,list_security_configs_response +ListSecurityConfigurationsInput,list_security_configurations_input +ListSecurityConfigurationsOutput,list_security_configurations_output +ListSecurityControlDefinitionsRequest,list_security_control_definitions_request +ListSecurityControlDefinitionsResponse,list_security_control_definitions_response +ListSecurityKeysRequest,list_security_keys_request +ListSecurityKeysResponse,list_security_keys_response +ListSecurityPoliciesRequest,list_security_policies_request +ListSecurityPoliciesResponse,list_security_policies_response +ListSecurityProfileApplicationsRequest,list_security_profile_applications_request +ListSecurityProfileApplicationsResponse,list_security_profile_applications_response +ListSecurityProfilePermissionsRequest,list_security_profile_permissions_request +ListSecurityProfilePermissionsResponse,list_security_profile_permissions_response +ListSecurityProfilesForTargetRequest,list_security_profiles_for_target_request +ListSecurityProfilesForTargetResponse,list_security_profiles_for_target_response +ListSecurityProfilesRequest,list_security_profiles_request +ListSecurityProfilesResponse,list_security_profiles_response +ListSegmentReferencesRequest,list_segment_references_request +ListSegmentReferencesResponse,list_segment_references_response +ListSegmentsRequest,list_segments_request +ListSegmentsResponse,list_segments_response +ListSensitivityInspectionTemplatesRequest,list_sensitivity_inspection_templates_request +ListSensitivityInspectionTemplatesResponse,list_sensitivity_inspection_templates_response +ListSensorStatisticsRequest,list_sensor_statistics_request +ListSensorStatisticsResponse,list_sensor_statistics_response +ListSentimentDetectionJobsRequest,list_sentiment_detection_jobs_request +ListSentimentDetectionJobsResponse,list_sentiment_detection_jobs_response +ListSequenceStoresRequest,list_sequence_stores_request +ListSequenceStoresResponse,list_sequence_stores_response +ListServerCertificateTagsRequest,list_server_certificate_tags_request +ListServerCertificateTagsResponse,list_server_certificate_tags_response +ListServerCertificatesRequest,list_server_certificates_request +ListServerCertificatesResponse,list_server_certificates_response +ListServerNeighborsRequest,list_server_neighbors_request +ListServerNeighborsResponse,list_server_neighbors_response +ListServersRequest,list_servers_request +ListServersResponse,list_servers_response +ListServiceActionsForProvisioningArtifactInput,list_service_actions_for_provisioning_artifact_input +ListServiceActionsForProvisioningArtifactOutput,list_service_actions_for_provisioning_artifact_output +ListServiceActionsInput,list_service_actions_input +ListServiceActionsOutput,list_service_actions_output +ListServiceInstanceOutputsInput,list_service_instance_outputs_input +ListServiceInstanceOutputsOutput,list_service_instance_outputs_output +ListServiceInstanceProvisionedResourcesInput,list_service_instance_provisioned_resources_input +ListServiceInstanceProvisionedResourcesOutput,list_service_instance_provisioned_resources_output +ListServiceInstancesFilter,list_service_instances_filter +ListServiceInstancesInput,list_service_instances_input +ListServiceInstancesOutput,list_service_instances_output +ListServiceNetworkServiceAssociationsRequest,list_service_network_service_associations_request +ListServiceNetworkServiceAssociationsResponse,list_service_network_service_associations_response +ListServiceNetworkVpcAssociationsRequest,list_service_network_vpc_associations_request +ListServiceNetworkVpcAssociationsResponse,list_service_network_vpc_associations_response +ListServiceNetworksRequest,list_service_networks_request +ListServiceNetworksResponse,list_service_networks_response +ListServicePipelineOutputsInput,list_service_pipeline_outputs_input +ListServicePipelineOutputsOutput,list_service_pipeline_outputs_output +ListServicePipelineProvisionedResourcesInput,list_service_pipeline_provisioned_resources_input +ListServicePipelineProvisionedResourcesOutput,list_service_pipeline_provisioned_resources_output +ListServicePrincipalNamesRequest,list_service_principal_names_request +ListServicePrincipalNamesResponse,list_service_principal_names_response +ListServiceProfilesRequest,list_service_profiles_request +ListServiceProfilesResponse,list_service_profiles_response +ListServiceQuotaIncreaseRequestsInTemplateRequest,list_service_quota_increase_requests_in_template_request +ListServiceQuotaIncreaseRequestsInTemplateResponse,list_service_quota_increase_requests_in_template_response +ListServiceQuotasRequest,list_service_quotas_request +ListServiceQuotasResponse,list_service_quotas_response +ListServiceSpecificCredentialsRequest,list_service_specific_credentials_request +ListServiceSpecificCredentialsResponse,list_service_specific_credentials_response +ListServiceTemplateVersionsInput,list_service_template_versions_input +ListServiceTemplateVersionsOutput,list_service_template_versions_output +ListServiceTemplatesInput,list_service_templates_input +ListServiceTemplatesOutput,list_service_templates_output +ListServiceVersionsRequest,list_service_versions_request +ListServiceVersionsResult,list_service_versions_result +ListServicesByNamespaceRequest,list_services_by_namespace_request +ListServicesByNamespaceResponse,list_services_by_namespace_response +ListServicesForAutoScalingConfigurationRequest,list_services_for_auto_scaling_configuration_request +ListServicesForAutoScalingConfigurationResponse,list_services_for_auto_scaling_configuration_response +ListServicesInput,list_services_input +ListServicesOutput,list_services_output +ListServicesRequest,list_services_request +ListServicesResponse,list_services_response +ListSessionAnalyticsDataRequest,list_session_analytics_data_request +ListSessionAnalyticsDataResponse,list_session_analytics_data_response +ListSessionMetricsRequest,list_session_metrics_request +ListSessionMetricsResponse,list_session_metrics_response +ListSessionsRequest,list_sessions_request +ListSessionsResponse,list_sessions_response +ListShardsInput,list_shards_input +ListShardsOutput,list_shards_output +ListShareInvitationsInput,list_share_invitations_input +ListShareInvitationsOutput,list_share_invitations_output +ListSharedEndpointsRequest,list_shared_endpoints_request +ListSharedEndpointsResult,list_shared_endpoints_result +ListSharedProjectsInput,list_shared_projects_input +ListSharedProjectsOutput,list_shared_projects_output +ListSharedReportGroupsInput,list_shared_report_groups_input +ListSharedReportGroupsOutput,list_shared_report_groups_output +ListSharesRequest,list_shares_request +ListSharesResponse,list_shares_response +ListSignalCatalogNodesRequest,list_signal_catalog_nodes_request +ListSignalCatalogNodesResponse,list_signal_catalog_nodes_response +ListSignalCatalogsRequest,list_signal_catalogs_request +ListSignalCatalogsResponse,list_signal_catalogs_response +ListSignalingChannelsInput,list_signaling_channels_input +ListSignalingChannelsOutput,list_signaling_channels_output +ListSigningCertificatesRequest,list_signing_certificates_request +ListSigningCertificatesResponse,list_signing_certificates_response +ListSigningJobsRequest,list_signing_jobs_request +ListSigningJobsResponse,list_signing_jobs_response +ListSigningPlatformsRequest,list_signing_platforms_request +ListSigningPlatformsResponse,list_signing_platforms_response +ListSigningProfilesRequest,list_signing_profiles_request +ListSigningProfilesResponse,list_signing_profiles_response +ListSimulationApplicationsRequest,list_simulation_applications_request +ListSimulationApplicationsResponse,list_simulation_applications_response +ListSimulationJobBatchesRequest,list_simulation_job_batches_request +ListSimulationJobBatchesResponse,list_simulation_job_batches_response +ListSimulationJobsRequest,list_simulation_jobs_request +ListSimulationJobsResponse,list_simulation_jobs_response +ListSimulationsInput,list_simulations_input +ListSimulationsOutput,list_simulations_output +ListSinksInput,list_sinks_input +ListSinksItem,list_sinks_item +ListSinksOutput,list_sinks_output +ListSipMediaApplicationsRequest,list_sip_media_applications_request +ListSipMediaApplicationsResponse,list_sip_media_applications_response +ListSipRulesRequest,list_sip_rules_request +ListSipRulesResponse,list_sip_rules_response +ListSitesInput,list_sites_input +ListSitesOutput,list_sites_output +ListSitesRequest,list_sites_request +ListSitesResponse,list_sites_response +ListSizeConstraintSetsRequest,list_size_constraint_sets_request +ListSizeConstraintSetsResponse,list_size_constraint_sets_response +ListSkillsRequest,list_skills_request +ListSkillsResponse,list_skills_response +ListSkillsStoreCategoriesRequest,list_skills_store_categories_request +ListSkillsStoreCategoriesResponse,list_skills_store_categories_response +ListSkillsStoreSkillsByCategoryRequest,list_skills_store_skills_by_category_request +ListSkillsStoreSkillsByCategoryResponse,list_skills_store_skills_by_category_response +ListSlackChannelConfigurationsRequest,list_slack_channel_configurations_request +ListSlackChannelConfigurationsResult,list_slack_channel_configurations_result +ListSlackWorkspaceConfigurationsRequest,list_slack_workspace_configurations_request +ListSlackWorkspaceConfigurationsResult,list_slack_workspace_configurations_result +ListSlotTypesRequest,list_slot_types_request +ListSlotTypesResponse,list_slot_types_response +ListSlotsRequest,list_slots_request +ListSlotsResponse,list_slots_response +ListSmartHomeAppliancesRequest,list_smart_home_appliances_request +ListSmartHomeAppliancesResponse,list_smart_home_appliances_response +ListSnapshotBlocksRequest,list_snapshot_blocks_request +ListSnapshotBlocksResponse,list_snapshot_blocks_response +ListSnapshotsInRecycleBinRequest,list_snapshots_in_recycle_bin_request +ListSnapshotsInRecycleBinResult,list_snapshots_in_recycle_bin_result +ListSnapshotsRequest,list_snapshots_request +ListSnapshotsResponse,list_snapshots_response +ListSnapshotsResult,list_snapshots_result +ListSolFunctionInstanceInfo,list_sol_function_instance_info +ListSolFunctionInstanceMetadata,list_sol_function_instance_metadata +ListSolFunctionInstancesInput,list_sol_function_instances_input +ListSolFunctionInstancesOutput,list_sol_function_instances_output +ListSolFunctionPackageInfo,list_sol_function_package_info +ListSolFunctionPackageMetadata,list_sol_function_package_metadata +ListSolFunctionPackagesInput,list_sol_function_packages_input +ListSolFunctionPackagesOutput,list_sol_function_packages_output +ListSolNetworkInstanceInfo,list_sol_network_instance_info +ListSolNetworkInstanceMetadata,list_sol_network_instance_metadata +ListSolNetworkInstancesInput,list_sol_network_instances_input +ListSolNetworkInstancesOutput,list_sol_network_instances_output +ListSolNetworkOperationsInfo,list_sol_network_operations_info +ListSolNetworkOperationsInput,list_sol_network_operations_input +ListSolNetworkOperationsMetadata,list_sol_network_operations_metadata +ListSolNetworkOperationsOutput,list_sol_network_operations_output +ListSolNetworkPackageInfo,list_sol_network_package_info +ListSolNetworkPackageMetadata,list_sol_network_package_metadata +ListSolNetworkPackagesInput,list_sol_network_packages_input +ListSolNetworkPackagesOutput,list_sol_network_packages_output +ListSolutionVersionsRequest,list_solution_versions_request +ListSolutionVersionsResponse,list_solution_versions_response +ListSolutionsRequest,list_solutions_request +ListSolutionsResponse,list_solutions_response +ListSopRecommendationsRequest,list_sop_recommendations_request +ListSopRecommendationsResponse,list_sop_recommendations_response +ListSourceApiAssociationsRequest,list_source_api_associations_request +ListSourceApiAssociationsResponse,list_source_api_associations_response +ListSourceCredentialsOutput,list_source_credentials_output +ListSourceLocationsRequest,list_source_locations_request +ListSourceLocationsResponse,list_source_locations_response +ListSourceRepositoriesItem,list_source_repositories_item +ListSourceRepositoriesRequest,list_source_repositories_request +ListSourceRepositoriesResponse,list_source_repositories_response +ListSourceRepositoryBranchesItem,list_source_repository_branches_item +ListSourceRepositoryBranchesRequest,list_source_repository_branches_request +ListSourceRepositoryBranchesResponse,list_source_repository_branches_response +ListSourceServerActionsRequest,list_source_server_actions_request +ListSourceServerActionsResponse,list_source_server_actions_response +ListSpacesRequest,list_spaces_request +ListSpacesResponse,list_spaces_response +ListSpeakerEnrollmentJobsRequest,list_speaker_enrollment_jobs_request +ListSpeakerEnrollmentJobsResponse,list_speaker_enrollment_jobs_response +ListSpeakersRequest,list_speakers_request +ListSpeakersResponse,list_speakers_response +ListSpeechSynthesisTasksInput,list_speech_synthesis_tasks_input +ListSpeechSynthesisTasksOutput,list_speech_synthesis_tasks_output +ListSqlInjectionMatchSetsRequest,list_sql_injection_match_sets_request +ListSqlInjectionMatchSetsResponse,list_sql_injection_match_sets_response +ListStackInstanceResourceDriftsInput,list_stack_instance_resource_drifts_input +ListStackInstanceResourceDriftsOutput,list_stack_instance_resource_drifts_output +ListStackInstancesForProvisionedProductInput,list_stack_instances_for_provisioned_product_input +ListStackInstancesForProvisionedProductOutput,list_stack_instances_for_provisioned_product_output +ListStackInstancesInput,list_stack_instances_input +ListStackInstancesOutput,list_stack_instances_output +ListStackResourcesInput,list_stack_resources_input +ListStackResourcesOutput,list_stack_resources_output +ListStackSetOperationResultsInput,list_stack_set_operation_results_input +ListStackSetOperationResultsOutput,list_stack_set_operation_results_output +ListStackSetOperationsInput,list_stack_set_operations_input +ListStackSetOperationsOutput,list_stack_set_operations_output +ListStackSetsInput,list_stack_sets_input +ListStackSetsOutput,list_stack_sets_output +ListStacksInput,list_stacks_input +ListStacksOutput,list_stacks_output +ListStageDeploymentsRequest,list_stage_deployments_request +ListStageDeploymentsResult,list_stage_deployments_result +ListStageDevicesRequest,list_stage_devices_request +ListStageDevicesResponse,list_stage_devices_response +ListStageSessionsRequest,list_stage_sessions_request +ListStageSessionsResponse,list_stage_sessions_response +ListStagesRequest,list_stages_request +ListStagesResponse,list_stages_response +ListStagesResult,list_stages_result +ListStagingAccountsRequest,list_staging_accounts_request +ListStagingAccountsResponse,list_staging_accounts_response +ListStandardsControlAssociationsRequest,list_standards_control_associations_request +ListStandardsControlAssociationsResponse,list_standards_control_associations_response +ListStateMachineAliasesInput,list_state_machine_aliases_input +ListStateMachineAliasesOutput,list_state_machine_aliases_output +ListStateMachineVersionsInput,list_state_machine_versions_input +ListStateMachineVersionsOutput,list_state_machine_versions_output +ListStateMachinesInput,list_state_machines_input +ListStateMachinesOutput,list_state_machines_output +ListStatementsRequest,list_statements_request +ListStatementsResponse,list_statements_response +ListStepsInput,list_steps_input +ListStepsOutput,list_steps_output +ListStorageLensConfigurationEntry,list_storage_lens_configuration_entry +ListStorageLensConfigurationsRequest,list_storage_lens_configurations_request +ListStorageLensConfigurationsResult,list_storage_lens_configurations_result +ListStorageSystemsRequest,list_storage_systems_request +ListStorageSystemsResponse,list_storage_systems_response +ListStoredQueriesRequest,list_stored_queries_request +ListStoredQueriesResponse,list_stored_queries_response +ListStreamConsumersInput,list_stream_consumers_input +ListStreamConsumersOutput,list_stream_consumers_output +ListStreamKeysRequest,list_stream_keys_request +ListStreamKeysResponse,list_stream_keys_response +ListStreamProcessorsRequest,list_stream_processors_request +ListStreamProcessorsResponse,list_stream_processors_response +ListStreamSessionsRequest,list_stream_sessions_request +ListStreamSessionsResponse,list_stream_sessions_response +ListStreamingDistributionsRequest,list_streaming_distributions_request +ListStreamingDistributionsResult,list_streaming_distributions_result +ListStreamingImagesRequest,list_streaming_images_request +ListStreamingImagesResponse,list_streaming_images_response +ListStreamingSessionBackupsRequest,list_streaming_session_backups_request +ListStreamingSessionBackupsResponse,list_streaming_session_backups_response +ListStreamingSessionsRequest,list_streaming_sessions_request +ListStreamingSessionsResponse,list_streaming_sessions_response +ListStreamsInput,list_streams_input +ListStreamsOutput,list_streams_output +ListStreamsRequest,list_streams_request +ListStreamsResponse,list_streams_response +ListStudioComponentsRequest,list_studio_components_request +ListStudioComponentsResponse,list_studio_components_response +ListStudioLifecycleConfigsRequest,list_studio_lifecycle_configs_request +ListStudioLifecycleConfigsResponse,list_studio_lifecycle_configs_response +ListStudioMembersRequest,list_studio_members_request +ListStudioMembersResponse,list_studio_members_response +ListStudioSessionMappingsInput,list_studio_session_mappings_input +ListStudioSessionMappingsOutput,list_studio_session_mappings_output +ListStudiosInput,list_studios_input +ListStudiosOutput,list_studios_output +ListStudiosRequest,list_studios_request +ListStudiosResponse,list_studios_response +ListSubChannelsRequest,list_sub_channels_request +ListSubChannelsResponse,list_sub_channels_response +ListSubjectsResponse,list_subjects_response +ListSubscribedRuleGroupsRequest,list_subscribed_rule_groups_request +ListSubscribedRuleGroupsResponse,list_subscribed_rule_groups_response +ListSubscribedWorkteamsRequest,list_subscribed_workteams_request +ListSubscribedWorkteamsResponse,list_subscribed_workteams_response +ListSubscribersRequest,list_subscribers_request +ListSubscribersResponse,list_subscribers_response +ListSubscriptionDefinitionVersionsRequest,list_subscription_definition_versions_request +ListSubscriptionDefinitionVersionsResponse,list_subscription_definition_versions_response +ListSubscriptionDefinitionsRequest,list_subscription_definitions_request +ListSubscriptionDefinitionsResponse,list_subscription_definitions_response +ListSubscriptionsByTopicInput,list_subscriptions_by_topic_input +ListSubscriptionsByTopicResponse,list_subscriptions_by_topic_response +ListSubscriptionsInput,list_subscriptions_input +ListSubscriptionsResponse,list_subscriptions_response +ListSuggestedResiliencyPoliciesRequest,list_suggested_resiliency_policies_request +ListSuggestedResiliencyPoliciesResponse,list_suggested_resiliency_policies_response +ListSuiteDefinitionsRequest,list_suite_definitions_request +ListSuiteDefinitionsResponse,list_suite_definitions_response +ListSuiteRunsRequest,list_suite_runs_request +ListSuiteRunsResponse,list_suite_runs_response +ListSuitesRequest,list_suites_request +ListSuitesResult,list_suites_result +ListSupportedCharacterSets,list_supported_character_sets +ListSupportedInstanceTypesInput,list_supported_instance_types_input +ListSupportedInstanceTypesOutput,list_supported_instance_types_output +ListSupportedPhoneNumberCountriesRequest,list_supported_phone_number_countries_request +ListSupportedPhoneNumberCountriesResponse,list_supported_phone_number_countries_response +ListSupportedResourceTypesInput,list_supported_resource_types_input +ListSupportedResourceTypesOutput,list_supported_resource_types_output +ListSupportedTimezones,list_supported_timezones +ListSuppressedDestinationsRequest,list_suppressed_destinations_request +ListSuppressedDestinationsResponse,list_suppressed_destinations_response +ListSyncJobsRequest,list_sync_jobs_request +ListSyncJobsResponse,list_sync_jobs_response +ListSyncResourcesRequest,list_sync_resources_request +ListSyncResourcesResponse,list_sync_resources_response +ListTLSInspectionConfigurationsRequest,list_tls_inspection_configurations_request +ListTLSInspectionConfigurationsResponse,list_tls_inspection_configurations_response +ListTableColumnsRequest,list_table_columns_request +ListTableColumnsResult,list_table_columns_result +ListTableMetadataInput,list_table_metadata_input +ListTableMetadataOutput,list_table_metadata_output +ListTableRestoreStatusRequest,list_table_restore_status_request +ListTableRestoreStatusResponse,list_table_restore_status_response +ListTableRowsRequest,list_table_rows_request +ListTableRowsResult,list_table_rows_result +ListTableStorageOptimizersRequest,list_table_storage_optimizers_request +ListTableStorageOptimizersResponse,list_table_storage_optimizers_response +ListTablesInput,list_tables_input +ListTablesOutput,list_tables_output +ListTablesRequest,list_tables_request +ListTablesResponse,list_tables_response +ListTablesResult,list_tables_result +ListTagOptionsFilters,list_tag_options_filters +ListTagOptionsInput,list_tag_options_input +ListTagOptionsOutput,list_tag_options_output +ListTags,list_tags +ListTagsForCertificateRequest,list_tags_for_certificate_request +ListTagsForCertificateResponse,list_tags_for_certificate_response +ListTagsForDeliveryStreamInput,list_tags_for_delivery_stream_input +ListTagsForDeliveryStreamOutput,list_tags_for_delivery_stream_output +ListTagsForDomainRequest,list_tags_for_domain_request +ListTagsForDomainResponse,list_tags_for_domain_response +ListTagsForProjectRequest,list_tags_for_project_request +ListTagsForProjectResult,list_tags_for_project_result +ListTagsForResourceInput,list_tags_for_resource_input +ListTagsForResourceMessage,list_tags_for_resource_message +ListTagsForResourceOutput,list_tags_for_resource_output +ListTagsForResourceRequest,list_tags_for_resource_request +ListTagsForResourceResponse,list_tags_for_resource_response +ListTagsForResourceResult,list_tags_for_resource_result +ListTagsForResourcesRequest,list_tags_for_resources_request +ListTagsForResourcesResponse,list_tags_for_resources_response +ListTagsForStreamInput,list_tags_for_stream_input +ListTagsForStreamOutput,list_tags_for_stream_output +ListTagsForVaultInput,list_tags_for_vault_input +ListTagsForVaultOutput,list_tags_for_vault_output +ListTagsInput,list_tags_input +ListTagsLogGroupRequest,list_tags_log_group_request +ListTagsLogGroupResponse,list_tags_log_group_response +ListTagsOfResourceInput,list_tags_of_resource_input +ListTagsOfResourceOutput,list_tags_of_resource_output +ListTagsOutput,list_tags_output +ListTagsRequest,list_tags_request +ListTagsResponse,list_tags_response +ListTagsResult,list_tags_result +ListTapePoolsInput,list_tape_pools_input +ListTapePoolsOutput,list_tape_pools_output +ListTapesInput,list_tapes_input +ListTapesOutput,list_tapes_output +ListTargetGroupsRequest,list_target_groups_request +ListTargetGroupsResponse,list_target_groups_response +ListTargetResourceTypesRequest,list_target_resource_types_request +ListTargetResourceTypesResponse,list_target_resource_types_response +ListTargetedSentimentDetectionJobsRequest,list_targeted_sentiment_detection_jobs_request +ListTargetedSentimentDetectionJobsResponse,list_targeted_sentiment_detection_jobs_response +ListTargetsByRuleRequest,list_targets_by_rule_request +ListTargetsByRuleResponse,list_targets_by_rule_response +ListTargetsFilter,list_targets_filter +ListTargetsForPolicyRequest,list_targets_for_policy_request +ListTargetsForPolicyResponse,list_targets_for_policy_response +ListTargetsForSecurityProfileRequest,list_targets_for_security_profile_request +ListTargetsForSecurityProfileResponse,list_targets_for_security_profile_response +ListTargetsRequest,list_targets_request +ListTargetsResponse,list_targets_response +ListTargetsResult,list_targets_result +ListTaskDefinitionFamiliesRequest,list_task_definition_families_request +ListTaskDefinitionFamiliesResponse,list_task_definition_families_response +ListTaskDefinitionsRequest,list_task_definitions_request +ListTaskDefinitionsResponse,list_task_definitions_response +ListTaskExecutionsRequest,list_task_executions_request +ListTaskExecutionsResponse,list_task_executions_response +ListTaskTemplatesRequest,list_task_templates_request +ListTaskTemplatesResponse,list_task_templates_response +ListTasksInput,list_tasks_input +ListTasksOutput,list_tasks_output +ListTasksRequest,list_tasks_request +ListTasksResponse,list_tasks_response +ListTeamMembersRequest,list_team_members_request +ListTeamMembersResult,list_team_members_result +ListTemplateActionsRequest,list_template_actions_request +ListTemplateActionsResponse,list_template_actions_response +ListTemplateAliasesRequest,list_template_aliases_request +ListTemplateAliasesResponse,list_template_aliases_response +ListTemplateGroupAccessControlEntriesRequest,list_template_group_access_control_entries_request +ListTemplateGroupAccessControlEntriesResponse,list_template_group_access_control_entries_response +ListTemplateStepGroupsRequest,list_template_step_groups_request +ListTemplateStepGroupsResponse,list_template_step_groups_response +ListTemplateStepsRequest,list_template_steps_request +ListTemplateStepsResponse,list_template_steps_response +ListTemplateVersionsRequest,list_template_versions_request +ListTemplateVersionsResponse,list_template_versions_response +ListTemplatesRequest,list_templates_request +ListTemplatesResponse,list_templates_response +ListTerminologiesRequest,list_terminologies_request +ListTerminologiesResponse,list_terminologies_response +ListTestExecutionResultItemsRequest,list_test_execution_result_items_request +ListTestExecutionResultItemsResponse,list_test_execution_result_items_response +ListTestExecutionsRequest,list_test_executions_request +ListTestExecutionsResponse,list_test_executions_response +ListTestGridProjectsRequest,list_test_grid_projects_request +ListTestGridProjectsResult,list_test_grid_projects_result +ListTestGridSessionActionsRequest,list_test_grid_session_actions_request +ListTestGridSessionActionsResult,list_test_grid_session_actions_result +ListTestGridSessionArtifactsRequest,list_test_grid_session_artifacts_request +ListTestGridSessionArtifactsResult,list_test_grid_session_artifacts_result +ListTestGridSessionsRequest,list_test_grid_sessions_request +ListTestGridSessionsResult,list_test_grid_sessions_result +ListTestRecommendationsRequest,list_test_recommendations_request +ListTestRecommendationsResponse,list_test_recommendations_response +ListTestSetRecordsRequest,list_test_set_records_request +ListTestSetRecordsResponse,list_test_set_records_response +ListTestSetsRequest,list_test_sets_request +ListTestSetsResponse,list_test_sets_response +ListTestsRequest,list_tests_request +ListTestsResult,list_tests_result +ListTextTranslationJobsRequest,list_text_translation_jobs_request +ListTextTranslationJobsResponse,list_text_translation_jobs_response +ListThemeAliasesRequest,list_theme_aliases_request +ListThemeAliasesResponse,list_theme_aliases_response +ListThemeVersionsRequest,list_theme_versions_request +ListThemeVersionsResponse,list_theme_versions_response +ListThemesRequest,list_themes_request +ListThemesResponse,list_themes_response +ListThesauriRequest,list_thesauri_request +ListThesauriResponse,list_thesauri_response +ListThingGroupsForThingRequest,list_thing_groups_for_thing_request +ListThingGroupsForThingResponse,list_thing_groups_for_thing_response +ListThingGroupsRequest,list_thing_groups_request +ListThingGroupsResponse,list_thing_groups_response +ListThingPrincipalsRequest,list_thing_principals_request +ListThingPrincipalsResponse,list_thing_principals_response +ListThingRegistrationTaskReportsRequest,list_thing_registration_task_reports_request +ListThingRegistrationTaskReportsResponse,list_thing_registration_task_reports_response +ListThingRegistrationTasksRequest,list_thing_registration_tasks_request +ListThingRegistrationTasksResponse,list_thing_registration_tasks_response +ListThingTypesRequest,list_thing_types_request +ListThingTypesResponse,list_thing_types_response +ListThingsInBillingGroupRequest,list_things_in_billing_group_request +ListThingsInBillingGroupResponse,list_things_in_billing_group_response +ListThingsInThingGroupRequest,list_things_in_thing_group_request +ListThingsInThingGroupResponse,list_things_in_thing_group_response +ListThingsRequest,list_things_request +ListThingsResponse,list_things_response +ListThirdPartyFirewallFirewallPoliciesRequest,list_third_party_firewall_firewall_policies_request +ListThirdPartyFirewallFirewallPoliciesResponse,list_third_party_firewall_firewall_policies_response +ListThreatIntelSetsRequest,list_threat_intel_sets_request +ListThreatIntelSetsResponse,list_threat_intel_sets_response +ListTimeSeriesRequest,list_time_series_request +ListTimeSeriesResponse,list_time_series_response +ListTimelineEventsInput,list_timeline_events_input +ListTimelineEventsOutput,list_timeline_events_output +ListTokenBalancesInput,list_token_balances_input +ListTokenBalancesOutput,list_token_balances_output +ListTokensRequest,list_tokens_request +ListTokensResponse,list_tokens_response +ListTopicRefreshSchedulesRequest,list_topic_refresh_schedules_request +ListTopicRefreshSchedulesResponse,list_topic_refresh_schedules_response +ListTopicRuleDestinationsRequest,list_topic_rule_destinations_request +ListTopicRuleDestinationsResponse,list_topic_rule_destinations_response +ListTopicRulesRequest,list_topic_rules_request +ListTopicRulesResponse,list_topic_rules_response +ListTopicsDetectionJobsRequest,list_topics_detection_jobs_request +ListTopicsDetectionJobsResponse,list_topics_detection_jobs_response +ListTopicsInput,list_topics_input +ListTopicsRequest,list_topics_request +ListTopicsResponse,list_topics_response +ListTrackerConsumersRequest,list_tracker_consumers_request +ListTrackerConsumersResponse,list_tracker_consumers_response +ListTrackersRequest,list_trackers_request +ListTrackersResponse,list_trackers_response +ListTrackersResponseEntry,list_trackers_response_entry +ListTrafficDistributionGroupUsersRequest,list_traffic_distribution_group_users_request +ListTrafficDistributionGroupUsersResponse,list_traffic_distribution_group_users_response +ListTrafficDistributionGroupsRequest,list_traffic_distribution_groups_request +ListTrafficDistributionGroupsResponse,list_traffic_distribution_groups_response +ListTrafficPoliciesRequest,list_traffic_policies_request +ListTrafficPoliciesResponse,list_traffic_policies_response +ListTrafficPolicyInstancesByHostedZoneRequest,list_traffic_policy_instances_by_hosted_zone_request +ListTrafficPolicyInstancesByHostedZoneResponse,list_traffic_policy_instances_by_hosted_zone_response +ListTrafficPolicyInstancesByPolicyRequest,list_traffic_policy_instances_by_policy_request +ListTrafficPolicyInstancesByPolicyResponse,list_traffic_policy_instances_by_policy_response +ListTrafficPolicyInstancesRequest,list_traffic_policy_instances_request +ListTrafficPolicyInstancesResponse,list_traffic_policy_instances_response +ListTrafficPolicyVersionsRequest,list_traffic_policy_versions_request +ListTrafficPolicyVersionsResponse,list_traffic_policy_versions_response +ListTrailsRequest,list_trails_request +ListTrailsResponse,list_trails_response +ListTrainingJobsForHyperParameterTuningJobRequest,list_training_jobs_for_hyper_parameter_tuning_job_request +ListTrainingJobsForHyperParameterTuningJobResponse,list_training_jobs_for_hyper_parameter_tuning_job_response +ListTrainingJobsRequest,list_training_jobs_request +ListTrainingJobsResponse,list_training_jobs_response +ListTransactionEventsInput,list_transaction_events_input +ListTransactionEventsOutput,list_transaction_events_output +ListTransactionsInput,list_transactions_input +ListTransactionsOutput,list_transactions_output +ListTransactionsRequest,list_transactions_request +ListTransactionsResponse,list_transactions_response +ListTransactionsSort,list_transactions_sort +ListTranscriptionJobsRequest,list_transcription_jobs_request +ListTranscriptionJobsResponse,list_transcription_jobs_response +ListTransformJobsRequest,list_transform_jobs_request +ListTransformJobsResponse,list_transform_jobs_response +ListTrialComponentsRequest,list_trial_components_request +ListTrialComponentsResponse,list_trial_components_response +ListTrialsRequest,list_trials_request +ListTrialsResponse,list_trials_response +ListTriggersRequest,list_triggers_request +ListTriggersResponse,list_triggers_response +ListTrustAnchorsResponse,list_trust_anchors_response +ListTrustStoreCertificatesRequest,list_trust_store_certificates_request +ListTrustStoreCertificatesResponse,list_trust_store_certificates_response +ListTrustStoresRequest,list_trust_stores_request +ListTrustStoresResponse,list_trust_stores_response +ListTunnelsRequest,list_tunnels_request +ListTunnelsResponse,list_tunnels_response +ListType,list_type +ListTypeRegistrationsInput,list_type_registrations_input +ListTypeRegistrationsOutput,list_type_registrations_output +ListTypeVersionsInput,list_type_versions_input +ListTypeVersionsOutput,list_type_versions_output +ListTypedLinkFacetAttributesRequest,list_typed_link_facet_attributes_request +ListTypedLinkFacetAttributesResponse,list_typed_link_facet_attributes_response +ListTypedLinkFacetNamesRequest,list_typed_link_facet_names_request +ListTypedLinkFacetNamesResponse,list_typed_link_facet_names_response +ListTypesByAssociationRequest,list_types_by_association_request +ListTypesByAssociationResponse,list_types_by_association_response +ListTypesInput,list_types_input +ListTypesOutput,list_types_output +ListTypesRequest,list_types_request +ListTypesResponse,list_types_response +ListUniqueProblemsRequest,list_unique_problems_request +ListUniqueProblemsResult,list_unique_problems_result +ListUnsupportedAppVersionResourcesRequest,list_unsupported_app_version_resources_request +ListUnsupportedAppVersionResourcesResponse,list_unsupported_app_version_resources_response +ListUpdateToken,list_update_token +ListUpdatesRequest,list_updates_request +ListUpdatesResponse,list_updates_response +ListUploadsRequest,list_uploads_request +ListUploadsResult,list_uploads_result +ListUsageForLicenseConfigurationRequest,list_usage_for_license_configuration_request +ListUsageForLicenseConfigurationResponse,list_usage_for_license_configuration_response +ListUsageLimitsRequest,list_usage_limits_request +ListUsageLimitsResponse,list_usage_limits_response +ListUsageTotalsRequest,list_usage_totals_request +ListUsageTotalsResponse,list_usage_totals_response +ListUseCasesRequest,list_use_cases_request +ListUseCasesResponse,list_use_cases_response +ListUserAccessLoggingSettingsRequest,list_user_access_logging_settings_request +ListUserAccessLoggingSettingsResponse,list_user_access_logging_settings_response +ListUserAssociationsRequest,list_user_associations_request +ListUserAssociationsResponse,list_user_associations_response +ListUserGroupsRequest,list_user_groups_request +ListUserGroupsResponse,list_user_groups_response +ListUserHierarchyGroupsRequest,list_user_hierarchy_groups_request +ListUserHierarchyGroupsResponse,list_user_hierarchy_groups_response +ListUserImportJobsRequest,list_user_import_jobs_request +ListUserImportJobsResponse,list_user_import_jobs_response +ListUserPoliciesRequest,list_user_policies_request +ListUserPoliciesResponse,list_user_policies_response +ListUserPoolClientsRequest,list_user_pool_clients_request +ListUserPoolClientsResponse,list_user_pool_clients_response +ListUserPoolsRequest,list_user_pools_request +ListUserPoolsResponse,list_user_pools_response +ListUserProfilesRequest,list_user_profiles_request +ListUserProfilesResponse,list_user_profiles_response +ListUserProfilesResult,list_user_profiles_result +ListUserSettingsRequest,list_user_settings_request +ListUserSettingsResponse,list_user_settings_response +ListUserTagsRequest,list_user_tags_request +ListUserTagsResponse,list_user_tags_response +ListUsersByPermissionGroupRequest,list_users_by_permission_group_request +ListUsersByPermissionGroupResponse,list_users_by_permission_group_response +ListUsersFilters,list_users_filters +ListUsersInGroupRequest,list_users_in_group_request +ListUsersInGroupResponse,list_users_in_group_response +ListUsersRequest,list_users_request +ListUsersResponse,list_users_response +ListUtteranceAnalyticsDataRequest,list_utterance_analytics_data_request +ListUtteranceAnalyticsDataResponse,list_utterance_analytics_data_response +ListUtteranceMetricsRequest,list_utterance_metrics_request +ListUtteranceMetricsResponse,list_utterance_metrics_response +ListV2LoggingLevelsRequest,list_v2_logging_levels_request +ListV2LoggingLevelsResponse,list_v2_logging_levels_response +ListVPCAssociationAuthorizationsRequest,list_vpc_association_authorizations_request +ListVPCAssociationAuthorizationsResponse,list_vpc_association_authorizations_response +ListVPCConnectionsRequest,list_vpc_connections_request +ListVPCConnectionsResponse,list_vpc_connections_response +ListVPCEConfigurationsRequest,list_vpce_configurations_request +ListVPCEConfigurationsResult,list_vpce_configurations_result +ListVariantImportJobsFilter,list_variant_import_jobs_filter +ListVariantImportJobsRequest,list_variant_import_jobs_request +ListVariantImportJobsResponse,list_variant_import_jobs_response +ListVariantStoresFilter,list_variant_stores_filter +ListVariantStoresRequest,list_variant_stores_request +ListVariantStoresResponse,list_variant_stores_response +ListVaultsInput,list_vaults_input +ListVaultsOutput,list_vaults_output +ListVectorEnrichmentJobInput,list_vector_enrichment_job_input +ListVectorEnrichmentJobOutput,list_vector_enrichment_job_output +ListVectorEnrichmentJobOutputConfig,list_vector_enrichment_job_output_config +ListVehiclesInFleetRequest,list_vehicles_in_fleet_request +ListVehiclesInFleetResponse,list_vehicles_in_fleet_response +ListVehiclesRequest,list_vehicles_request +ListVehiclesResponse,list_vehicles_response +ListVerifiedEmailAddressesResponse,list_verified_email_addresses_response +ListVersionsByFunctionRequest,list_versions_by_function_request +ListVersionsByFunctionResponse,list_versions_by_function_response +ListVersionsRequest,list_versions_request +ListVersionsResponse,list_versions_response +ListViewVersionsRequest,list_view_versions_request +ListViewVersionsResponse,list_view_versions_response +ListViewsInput,list_views_input +ListViewsOutput,list_views_output +ListViewsRequest,list_views_request +ListViewsResponse,list_views_response +ListViolationEventsRequest,list_violation_events_request +ListViolationEventsResponse,list_violation_events_response +ListVirtualClustersRequest,list_virtual_clusters_request +ListVirtualClustersResponse,list_virtual_clusters_response +ListVirtualGatewaysInput,list_virtual_gateways_input +ListVirtualGatewaysOutput,list_virtual_gateways_output +ListVirtualInterfaceTestHistoryRequest,list_virtual_interface_test_history_request +ListVirtualInterfaceTestHistoryResponse,list_virtual_interface_test_history_response +ListVirtualMFADevicesRequest,list_virtual_mfa_devices_request +ListVirtualMFADevicesResponse,list_virtual_mfa_devices_response +ListVirtualMachinesInput,list_virtual_machines_input +ListVirtualMachinesOutput,list_virtual_machines_output +ListVirtualNodesInput,list_virtual_nodes_input +ListVirtualNodesOutput,list_virtual_nodes_output +ListVirtualRoutersInput,list_virtual_routers_input +ListVirtualRoutersOutput,list_virtual_routers_output +ListVirtualServicesInput,list_virtual_services_input +ListVirtualServicesOutput,list_virtual_services_output +ListVocabulariesRequest,list_vocabularies_request +ListVocabulariesResponse,list_vocabularies_response +ListVocabularyFiltersRequest,list_vocabulary_filters_request +ListVocabularyFiltersResponse,list_vocabulary_filters_response +ListVodSourcesRequest,list_vod_sources_request +ListVodSourcesResponse,list_vod_sources_response +ListVoiceConnectorGroupsRequest,list_voice_connector_groups_request +ListVoiceConnectorGroupsResponse,list_voice_connector_groups_response +ListVoiceConnectorTerminationCredentialsRequest,list_voice_connector_termination_credentials_request +ListVoiceConnectorTerminationCredentialsResponse,list_voice_connector_termination_credentials_response +ListVoiceConnectorsRequest,list_voice_connectors_request +ListVoiceConnectorsResponse,list_voice_connectors_response +ListVoiceProfileDomainsRequest,list_voice_profile_domains_request +ListVoiceProfileDomainsResponse,list_voice_profile_domains_response +ListVoiceProfilesRequest,list_voice_profiles_request +ListVoiceProfilesResponse,list_voice_profiles_response +ListVolumeInitiatorsInput,list_volume_initiators_input +ListVolumeInitiatorsOutput,list_volume_initiators_output +ListVolumeRecoveryPointsInput,list_volume_recovery_points_input +ListVolumeRecoveryPointsOutput,list_volume_recovery_points_output +ListVolumesInput,list_volumes_input +ListVolumesOutput,list_volumes_output +ListVpcConnectionsRequest,list_vpc_connections_request +ListVpcConnectionsResponse,list_vpc_connections_response +ListVpcConnectorsRequest,list_vpc_connectors_request +ListVpcConnectorsResponse,list_vpc_connectors_response +ListVpcEndpointAccessRequest,list_vpc_endpoint_access_request +ListVpcEndpointAccessResponse,list_vpc_endpoint_access_response +ListVpcEndpointsForDomainRequest,list_vpc_endpoints_for_domain_request +ListVpcEndpointsForDomainResponse,list_vpc_endpoints_for_domain_response +ListVpcEndpointsRequest,list_vpc_endpoints_request +ListVpcEndpointsResponse,list_vpc_endpoints_response +ListVpcIngressConnectionsFilter,list_vpc_ingress_connections_filter +ListVpcIngressConnectionsRequest,list_vpc_ingress_connections_request +ListVpcIngressConnectionsResponse,list_vpc_ingress_connections_response +ListWatchlistsRequest,list_watchlists_request +ListWatchlistsResponse,list_watchlists_response +ListWavesRequest,list_waves_request +ListWavesRequestFilters,list_waves_request_filters +ListWavesResponse,list_waves_response +ListWebACLsRequest,list_web_acls_request +ListWebACLsResponse,list_web_acls_response +ListWebhookItem,list_webhook_item +ListWebhooksInput,list_webhooks_input +ListWebhooksOutput,list_webhooks_output +ListWebhooksRequest,list_webhooks_request +ListWebhooksResult,list_webhooks_result +ListWebsiteAuthorizationProvidersRequest,list_website_authorization_providers_request +ListWebsiteAuthorizationProvidersResponse,list_website_authorization_providers_response +ListWebsiteCertificateAuthoritiesRequest,list_website_certificate_authorities_request +ListWebsiteCertificateAuthoritiesResponse,list_website_certificate_authorities_response +ListWhatIfAnalysesRequest,list_what_if_analyses_request +ListWhatIfAnalysesResponse,list_what_if_analyses_response +ListWhatIfForecastExportsRequest,list_what_if_forecast_exports_request +ListWhatIfForecastExportsResponse,list_what_if_forecast_exports_response +ListWhatIfForecastsRequest,list_what_if_forecasts_request +ListWhatIfForecastsResponse,list_what_if_forecasts_response +ListWirelessDeviceImportTasksRequest,list_wireless_device_import_tasks_request +ListWirelessDeviceImportTasksResponse,list_wireless_device_import_tasks_response +ListWirelessDevicesRequest,list_wireless_devices_request +ListWirelessDevicesResponse,list_wireless_devices_response +ListWirelessGatewayTaskDefinitionsRequest,list_wireless_gateway_task_definitions_request +ListWirelessGatewayTaskDefinitionsResponse,list_wireless_gateway_task_definitions_response +ListWirelessGatewaysRequest,list_wireless_gateways_request +ListWirelessGatewaysResponse,list_wireless_gateways_response +ListWorkGroupsInput,list_work_groups_input +ListWorkGroupsOutput,list_work_groups_output +ListWorkerBlocksRequest,list_worker_blocks_request +ListWorkerBlocksResponse,list_worker_blocks_response +ListWorkerConfigurationsRequest,list_worker_configurations_request +ListWorkerConfigurationsResponse,list_worker_configurations_response +ListWorkerFleetsRequest,list_worker_fleets_request +ListWorkerFleetsResponse,list_worker_fleets_response +ListWorkersRequest,list_workers_request +ListWorkersResponse,list_workers_response +ListWorkersWithQualificationTypeRequest,list_workers_with_qualification_type_request +ListWorkersWithQualificationTypeResponse,list_workers_with_qualification_type_response +ListWorkflowExecutionsRequest,list_workflow_executions_request +ListWorkflowExecutionsResponse,list_workflow_executions_response +ListWorkflowStepExecutionsRequest,list_workflow_step_executions_request +ListWorkflowStepExecutionsResponse,list_workflow_step_executions_response +ListWorkflowStepGroupsRequest,list_workflow_step_groups_request +ListWorkflowStepGroupsResponse,list_workflow_step_groups_response +ListWorkflowStepsRequest,list_workflow_steps_request +ListWorkflowStepsResponse,list_workflow_steps_response +ListWorkflowTypesInput,list_workflow_types_input +ListWorkflowsItem,list_workflows_item +ListWorkflowsRequest,list_workflows_request +ListWorkflowsResponse,list_workflows_response +ListWorkforcesRequest,list_workforces_request +ListWorkforcesResponse,list_workforces_response +ListWorkgroupsRequest,list_workgroups_request +ListWorkgroupsResponse,list_workgroups_response +ListWorkloadSharesInput,list_workload_shares_input +ListWorkloadSharesOutput,list_workload_shares_output +ListWorkloadsInput,list_workloads_input +ListWorkloadsOutput,list_workloads_output +ListWorkloadsRequest,list_workloads_request +ListWorkloadsResponse,list_workloads_response +ListWorkspacesRequest,list_workspaces_request +ListWorkspacesResponse,list_workspaces_response +ListWorkteamsRequest,list_workteams_request +ListWorkteamsResponse,list_workteams_response +ListWorldExportJobsRequest,list_world_export_jobs_request +ListWorldExportJobsResponse,list_world_export_jobs_response +ListWorldGenerationJobsRequest,list_world_generation_jobs_request +ListWorldGenerationJobsResponse,list_world_generation_jobs_response +ListWorldTemplatesRequest,list_world_templates_request +ListWorldTemplatesResponse,list_world_templates_response +ListWorldsRequest,list_worlds_request +ListWorldsResponse,list_worlds_response +ListXssMatchSetsRequest,list_xss_match_sets_request +ListXssMatchSetsResponse,list_xss_match_sets_response +ListZonalShiftsRequest,list_zonal_shifts_request +ListZonalShiftsResponse,list_zonal_shifts_response +ListedAccess,listed_access +ListedAgreement,listed_agreement +ListedBridge,listed_bridge +ListedCertificate,listed_certificate +ListedConnector,listed_connector +ListedEntitlement,listed_entitlement +ListedExecution,listed_execution +ListedFlow,listed_flow +ListedGateway,listed_gateway +ListedGatewayInstance,listed_gateway_instance +ListedHostKey,listed_host_key +ListedProfile,listed_profile +ListedServer,listed_server +ListedUser,listed_user +ListedWorkflow,listed_workflow +Listener,listener +ListenerAddress,listener_address +ListenerArn,listener_arn +ListenerArns,listener_arns +ListenerDescription,listener_description +ListenerDescriptions,listener_descriptions +ListenerEndpoint,listener_endpoint +ListenerNotFoundException,listener_not_found_exception +ListenerPort,listener_port +ListenerSummary,listener_summary +ListenerTls,listener_tls +ListenerTlsAcmCertificate,listener_tls_acm_certificate +ListenerTlsFileCertificate,listener_tls_file_certificate +ListenerTlsSdsCertificate,listener_tls_sds_certificate +ListenerTlsValidationContext,listener_tls_validation_context +Listeners,listeners +ListingId,listing_id +ListingTime,listing_time +LiteralArrayOptions,literal_array_options +LiteralOptions,literal_options +LiveConnectorRTMPConfiguration,live_connector_rtmp_configuration +LiveConnectorSinkConfiguration,live_connector_sink_configuration +LiveConnectorSourceConfiguration,live_connector_source_configuration +LivePoolProgress,live_pool_progress +LivePreRollConfiguration,live_pre_roll_configuration +LiveSimulationState,live_simulation_state +LiveSource,live_source +LiveSourceName,live_source_name +LivenessOutputConfig,liveness_output_config +LoRaWAN,lo_ra_wan +LoRaWANConnectionStatusEventNotificationConfigurations,lo_ra_wan_connection_status_event_notification_configurations +LoRaWANConnectionStatusResourceTypeEventConfiguration,lo_ra_wan_connection_status_resource_type_event_configuration +LoRaWANDevice,lo_ra_wan_device +LoRaWANDeviceMetadata,lo_ra_wan_device_metadata +LoRaWANDeviceProfile,lo_ra_wan_device_profile +LoRaWANFuotaTask,lo_ra_wan_fuota_task +LoRaWANFuotaTaskGetInfo,lo_ra_wan_fuota_task_get_info +LoRaWANGateway,lo_ra_wan_gateway +LoRaWANGatewayCurrentVersion,lo_ra_wan_gateway_current_version +LoRaWANGatewayMetadata,lo_ra_wan_gateway_metadata +LoRaWANGatewayVersion,lo_ra_wan_gateway_version +LoRaWANGetServiceProfileInfo,lo_ra_wan_get_service_profile_info +LoRaWANJoinEventNotificationConfigurations,lo_ra_wan_join_event_notification_configurations +LoRaWANJoinResourceTypeEventConfiguration,lo_ra_wan_join_resource_type_event_configuration +LoRaWANListDevice,lo_ra_wan_list_device +LoRaWANMulticast,lo_ra_wan_multicast +LoRaWANMulticastGet,lo_ra_wan_multicast_get +LoRaWANMulticastMetadata,lo_ra_wan_multicast_metadata +LoRaWANMulticastSession,lo_ra_wan_multicast_session +LoRaWANNetworkServerCertificateId,lo_ra_wan_network_server_certificate_id +LoRaWANSendDataToDevice,lo_ra_wan_send_data_to_device +LoRaWANServiceProfile,lo_ra_wan_service_profile +LoRaWANStartFuotaTask,lo_ra_wan_start_fuota_task +LoRaWANUpdateDevice,lo_ra_wan_update_device +LoRaWANUpdateGatewayTaskCreate,lo_ra_wan_update_gateway_task_create +LoRaWANUpdateGatewayTaskEntry,lo_ra_wan_update_gateway_task_entry +LoRoCenterMixLevel,lo_ro_center_mix_level +LoRoSurroundMixLevel,lo_ro_surround_mix_level +Loa,loa +LoadAverage,load_average +LoadBalancer,load_balancer +LoadBalancerAddress,load_balancer_address +LoadBalancerAddresses,load_balancer_addresses +LoadBalancerArn,load_balancer_arn +LoadBalancerArns,load_balancer_arns +LoadBalancerAttribute,load_balancer_attribute +LoadBalancerAttributeNotFoundException,load_balancer_attribute_not_found_exception +LoadBalancerAttributes,load_balancer_attributes +LoadBalancerDescription,load_balancer_description +LoadBalancerDescriptions,load_balancer_descriptions +LoadBalancerInfo,load_balancer_info +LoadBalancerListenerPort,load_balancer_listener_port +LoadBalancerName,load_balancer_name +LoadBalancerNames,load_balancer_names +LoadBalancerNotFoundException,load_balancer_not_found_exception +LoadBalancerOptions,load_balancer_options +LoadBalancerPort,load_balancer_port +LoadBalancerPorts,load_balancer_ports +LoadBalancerState,load_balancer_state +LoadBalancerTarget,load_balancer_target +LoadBalancerTargetGroup,load_balancer_target_group +LoadBalancerTargetGroupARN,load_balancer_target_group_arn +LoadBalancerTargetGroupState,load_balancer_target_group_state +LoadBalancerTargetGroups,load_balancer_target_groups +LoadBalancerTargetPort,load_balancer_target_port +LoadBalancerTlsCertificate,load_balancer_tls_certificate +LoadBalancerTlsCertificateDnsRecordCreationState,load_balancer_tls_certificate_dns_record_creation_state +LoadBalancerTlsCertificateDomainValidationOption,load_balancer_tls_certificate_domain_validation_option +LoadBalancerTlsCertificateDomainValidationRecord,load_balancer_tls_certificate_domain_validation_record +LoadBalancerTlsCertificateRenewalSummary,load_balancer_tls_certificate_renewal_summary +LoadBalancerTlsCertificateSummary,load_balancer_tls_certificate_summary +LoadBalancerTlsPolicy,load_balancer_tls_policy +LoadBalancerType,load_balancer_type +LoadBalancers,load_balancers +LoadBalancersConfig,load_balancers_config +LoadBasedAutoScalingConfiguration,load_based_auto_scaling_configuration +LoadBasedAutoScalingConfigurations,load_based_auto_scaling_configurations +LoadDryRunConfig,load_dry_run_config +LoadForecast,load_forecast +LoadPermission,load_permission +LoadPermissionModifications,load_permission_modifications +LoadPermissionRequest,load_permission_request +LoadPermissions,load_permissions +LoadSampleData,load_sample_data +LoadThreshold,load_threshold +LoadTimeout,load_timeout +LoadUrlAccessDeniedException,load_url_access_denied_exception +LoaderIdResult,loader_id_result +LoadingAnimation,loading_animation +LocalAddress,local_address +LocalBgpAsn,local_bgp_asn +LocalCollectorS3Access,local_collector_s3_access +LocalConsolePassword,local_console_password +LocalDeviceResourceData,local_device_resource_data +LocalDirectoryPath,local_directory_path +LocalDomainInfo,local_domain_info +LocalGateway,local_gateway +LocalGatewayId,local_gateway_id +LocalGatewayIds,local_gateway_ids +LocalGatewayRoute,local_gateway_route +LocalGatewayRouteTable,local_gateway_route_table +LocalGatewayRouteTableArn,local_gateway_route_table_arn +LocalGatewayRouteTableId,local_gateway_route_table_id +LocalGatewayRouteTableIds,local_gateway_route_table_ids +LocalGatewayRouteTableVirtualInterfaceGroupAssociation,local_gateway_route_table_virtual_interface_group_association +LocalGatewayRouteTableVirtualInterfaceGroupAssociationId,local_gateway_route_table_virtual_interface_group_association_id +LocalGatewayRouteTableVirtualInterfaceGroupAssociationIds,local_gateway_route_table_virtual_interface_group_association_ids +LocalGatewayRouteTableVirtualInterfaceGroupAssociations,local_gateway_route_table_virtual_interface_group_associations +LocalGatewayRouteTableVpcAssociation,local_gateway_route_table_vpc_association +LocalGatewayRouteTableVpcAssociationId,local_gateway_route_table_vpc_association_id +LocalGatewayRouteTableVpcAssociationIds,local_gateway_route_table_vpc_association_ids +LocalGatewayRouteTableVpcAssociations,local_gateway_route_table_vpc_associations +LocalGatewayRouteTables,local_gateway_route_tables +LocalGatewayVirtualInterface,local_gateway_virtual_interface +LocalGatewayVirtualInterfaceGroup,local_gateway_virtual_interface_group +LocalGatewayVirtualInterfaceGroupId,local_gateway_virtual_interface_group_id +LocalGatewayVirtualInterfaceGroupIds,local_gateway_virtual_interface_group_ids +LocalGatewayVirtualInterfaceGroups,local_gateway_virtual_interface_groups +LocalGatewayVirtualInterfaceId,local_gateway_virtual_interface_id +LocalGatewayVirtualInterfaceIds,local_gateway_virtual_interface_ids +LocalGatewayVirtualInterfaces,local_gateway_virtual_interfaces +LocalGateways,local_gateways +LocalHealthEventsConfig,local_health_events_config +LocalIpDetails,local_ip_details +LocalIpv4NetworkCidr,local_ipv4_network_cidr +LocalIpv6NetworkCidr,local_ipv6_network_cidr +LocalMountPath,local_mount_path +LocalNavigationConfiguration,local_navigation_configuration +LocalPath,local_path +LocalPortDetails,local_port_details +LocalProfileId,local_profile_id +LocalSecondaryIndex,local_secondary_index +LocalSecondaryIndexDescription,local_secondary_index_description +LocalSecondaryIndexInfo,local_secondary_index_info +LocalSecondaryIndexOverride,local_secondary_index_override +LocalSecondaryIndexes,local_secondary_indexes +LocalSizeConfig,local_size_config +LocalStorage,local_storage +LocalStorageTypes,local_storage_types +LocalTarget,local_target +LocalTime,local_time +LocalVolumeResourceData,local_volume_resource_data +LocalWriteForwardingStatus,local_write_forwarding_status +Locale,locale +LocaleCode,locale_code +LocaleId,locale_id +LocaleValue,locale_value +LocaleValues,locale_values +Locality,locality +Location,location +LocationARN,location_arn +LocationAction,location_action +LocationArn,location_arn +LocationAttributes,location_attributes +LocationConfiguration,location_configuration +LocationConstraint,location_constraint +LocationFilter,location_filter +LocationListEntry,location_list_entry +LocationModel,location_model +LocationName,location_name +LocationOrder,location_order +LocationState,location_state +LocationStates,location_states +LocationSummary,location_summary +LocationTimestamp,location_timestamp +LocationType,location_type +LocationUri,location_uri +Locations,locations +LockConfiguration,lock_configuration +LockDate,lock_date +LockEndTime,lock_end_time +LockRuleRequest,lock_rule_request +LockRuleResponse,lock_rule_response +LockState,lock_state +LockToken,lock_token +Locked,locked +LockedSubscriptionException,locked_subscription_exception +LockoutPreventedException,lockout_prevented_exception +LockoutPreventionException,lockout_prevention_exception +LogAnomalyClass,log_anomaly_class +LogAnomalyClasses,log_anomaly_classes +LogAnomalyShowcase,log_anomaly_showcase +LogAnomalyShowcases,log_anomaly_showcases +LogAnomalyToken,log_anomaly_token +LogAnomalyType,log_anomaly_type +LogBucket,log_bucket +LogBucketList,log_bucket_list +LogConfig,log_config +LogConfiguration,log_configuration +LogConfigurationForChannel,log_configuration_for_channel +LogConfigurationType,log_configuration_type +LogConfigurations,log_configurations +LogDelivery,log_delivery +LogDeliveryBucket,log_delivery_bucket +LogDeliveryConfiguration,log_delivery_configuration +LogDeliveryConfigurationRequest,log_delivery_configuration_request +LogDeliveryConfigurationType,log_delivery_configuration_type +LogDeliveryConfigurations,log_delivery_configurations +LogDeliveryDescription,log_delivery_description +LogDeliveryStatus,log_delivery_status +LogDestination,log_destination +LogDestinationConfig,log_destination_config +LogDestinationConfigs,log_destination_configs +LogDestinationPermissionException,log_destination_permission_exception +LogDestinationType,log_destination_type +LogDriver,log_driver +LogEnabled,log_enabled +LogEncryptionKmsKeyId,log_encryption_kms_key_id +LogEvent,log_event +LogEventId,log_event_id +LogEventTimestamp,log_event_timestamp +LogExports,log_exports +LogFile,log_file +LogFileData,log_file_data +LogFileName,log_file_name +LogFilePath,log_file_path +LogFilePrefix,log_file_prefix +LogFileValidationEnabled,log_file_validation_enabled +LogFilter,log_filter +LogFormat,log_format +LogGroup,log_group +LogGroupArn,log_group_arn +LogGroupField,log_group_field +LogGroupName,log_group_name +LogGroupSummary,log_group_summary +LogLevel,log_level +LogLevelUpdate,log_level_update +LogOddsMetric,log_odds_metric +LogOptions,log_options +LogOutputFormat,log_output_format +LogPaths,log_paths +LogPattern,log_pattern +LogPatternSets,log_pattern_sets +LogPatterns,log_patterns +LogPublishingConfiguration,log_publishing_configuration +LogPublishingOption,log_publishing_option +LogPublishingOptions,log_publishing_options +LogPublishingOptionsStatus,log_publishing_options_status +LogResult,log_result +LogRoleArn,log_role_arn +LogSettingsRequest,log_settings_request +LogSettingsResponse,log_settings_response +LogSetup,log_setup +LogSource,log_source +LogStream,log_stream +LogStreamARN,log_stream_arn +LogStreamARNUpdate,log_stream_arn_update +LogStreamArn,log_stream_arn +LogStreamName,log_stream_name +LogStreams,log_streams +LogSubscription,log_subscription +LogSubscriptions,log_subscriptions +LogTarget,log_target +LogTargetConfiguration,log_target_configuration +LogText,log_text +LogType,log_type +LogTypes,log_types +LogTypesToDisable,log_types_to_disable +LogTypesToEnable,log_types_to_enable +LogUploadEnabled,log_upload_enabled +LogUri,log_uri +LogUrl,log_url +LogVersion,log_version +Logarithmic,logarithmic +Logger,logger +LoggerDefinitionId,logger_definition_id +LoggerDefinitionVersion,logger_definition_version +LoggerDefinitionVersionArn,logger_definition_version_arn +LoggerDefinitionVersionId,logger_definition_version_id +Loggers,loggers +Logging,logging +LoggingConfig,logging_config +LoggingConfiguration,logging_configuration +LoggingConfigurationInput,logging_configuration_input +LoggingConfigurationMetadata,logging_configuration_metadata +LoggingConfigurationStatus,logging_configuration_status +LoggingConfigurationSummary,logging_configuration_summary +LoggingConfigurations,logging_configurations +LoggingEnabled,logging_enabled +LoggingFilter,logging_filter +LoggingInfo,logging_info +LoggingLevel,logging_level +LoggingOptions,logging_options +LoggingOptionsPayload,logging_options_payload +LoggingRole,logging_role +LoggingStatus,logging_status +Logical,logical +LogicalCapacityUsed,logical_capacity_used +LogicalIdHierarchy,logical_id_hierarchy +LogicalOperator,logical_operator +LogicalResourceId,logical_resource_id +LogicalResourceIds,logical_resource_ids +LogicalTable,logical_table +LogicalTableMap,logical_table_map +LogicalTableSource,logical_table_source +LogicalUsed,logical_used +LoginAttribute,login_attribute +LoginAttributes,login_attributes +LoginAuthConfig,login_auth_config +LoginAuthConfigReqObj,login_auth_config_req_obj +LoginMessage,login_message +LoginPath,login_path +LoginProfile,login_profile +LoginWithAmazon,login_with_amazon +Logins,logins +LoginsToRemove,logins_to_remove +Logo,logo +Logo2x,logo2x +Logo2xUrl,logo2x_url +Logo3x,logo3x +Logo3xUrl,logo3x_url +LogoUrl,logo_url +LogoutEndpoint,logout_endpoint +LogoutRequest,logout_request +LogoutURLs,logout_urls +LogoutUserRequest,logout_user_request +Logref,logref +Logs,logs +LogsAnomalyDetection,logs_anomaly_detection +LogsAnomalyDetectionIntegration,logs_anomaly_detection_integration +LogsAnomalyDetectionIntegrationConfig,logs_anomaly_detection_integration_config +LogsConfig,logs_config +LogsLocation,logs_location +LogsStorageLocation,logs_storage_location +LogsSummary,logs_summary +Lon,lon +LongColumnStatisticsData,long_column_statistics_data +LongDescription,long_description +LongFormatText,long_format_text +LongRangeType,long_range_type +LongTermPricingEndDate,long_term_pricing_end_date +LongTermPricingEntries,long_term_pricing_entries +LongTermPricingId,long_term_pricing_id +LongTermPricingIds,long_term_pricing_ids +LongTermPricingListEntry,long_term_pricing_list_entry +LongTermPricingStartDate,long_term_pricing_start_date +LongTermPricingStatus,long_term_pricing_status +LongTermPricingType,long_term_pricing_type +LongValue,long_value +LongestPrefixMatches,longest_prefix_matches +Longitude,longitude +LookAheadRateControl,look_ahead_rate_control +LookBackAvailablePeriods,look_back_available_periods +LookBackPeriod,look_back_period +LookbackPeriodInDays,lookback_period_in_days +LookbackWindow,lookback_window +LookoutMetrics,lookout_metrics +LookupAttribute,lookup_attribute +LookupAttributes,lookup_attributes +LookupDeveloperIdentityInput,lookup_developer_identity_input +LookupDeveloperIdentityResponse,lookup_developer_identity_response +LookupEventsRequest,lookup_events_request +LookupEventsResponse,lookup_events_response +LookupPolicy,lookup_policy +LookupPolicyRequest,lookup_policy_request +LookupPolicyResponse,lookup_policy_response +LoopDetectedException,loop_detected_exception +LossValue,loss_value +LoudnessLogging,loudness_logging +Low,low +LowAction,low_action +LowCount,low_count +LowLatencyHlsManifests,low_latency_hls_manifests +LowerBound,lower_bound +LowerBoundary,lower_boundary +LsaAnalysisId,lsa_analysis_id +Lt,lt +LtRtCenterMixLevel,lt_rt_center_mix_level +LtRtSurroundMixLevel,lt_rt_surround_mix_level +Lte,lte +LteLocalId,lte_local_id +LteNmr,lte_nmr +LteNmrObj,lte_nmr_obj +LteObj,lte_obj +LteTimingAdvance,lte_timing_advance +LunCount,lun_count +LunNumber,lun_number +LustreConfiguration,lustre_configuration +LustreFileSystemConfiguration,lustre_file_system_configuration +LustreLogConfiguration,lustre_log_configuration +LustreLogCreateConfiguration,lustre_log_create_configuration +LustreResponse,lustre_response +LustreRootSquashConfiguration,lustre_root_squash_configuration +M2tsScte35Esam,m2ts_scte35_esam +M2tsSettings,m2ts_settings +M3u8Settings,m3u8_settings +MAPE,mape +MASE,mase +MAXIMUM,maximum +MD5,md5 +MD5OfBody,md5_of_body +MD5OfMessageAttributes,md5_of_message_attributes +MD5OfMessageBody,md5_of_message_body +MD5OfMessageSystemAttributes,md5_of_message_system_attributes +MFA,mfa +MFADelete,mfa_delete +MFADevice,mfa_device +MFADevices,mfa_devices +MFAMethodNotFoundException,mfa_method_not_found_exception +MFAMode,mfa_mode +MFAOptionType,mfa_option_type +MFAOptions,mfa_options +MINIMUM,minimum +MLFramework,ml_framework +MLModel,ml_model +MLModelId,ml_model_id +MLModelName,ml_model_name +MLModelType,ml_model_type +MLResourceNotFoundException,ml_resource_not_found_exception +MLTransform,ml_transform +MLTransformNotReadyException,ml_transform_not_ready_exception +MLUserDataEncryption,ml_user_data_encryption +MSKClusterARN,msk_cluster_arn +MSKSourceConfiguration,msk_source_configuration +MSKSourceDescription,msk_source_description +Mac,mac +MacAddress,mac_address +MacAddressList,mac_address_list +MacAlgorithm,mac_algorithm +MacAlgorithmDukpt,mac_algorithm_dukpt +MacAlgorithmEmv,mac_algorithm_emv +MacAlgorithms,mac_algorithms +MacLength,mac_length +MacSecKey,mac_sec_key +MacValid,mac_valid +MacVersion,mac_version +MachineLabeled,machine_labeled +MachineLearningDetectionConfig,machine_learning_detection_config +MachineType,machine_type +MagneticDuration,magnetic_duration +MagneticStore,magnetic_store +MagneticStoreRejectedDataLocation,magnetic_store_rejected_data_location +MagneticStoreRetentionPeriodInDays,magnetic_store_retention_period_in_days +MagneticStoreWriteProperties,magnetic_store_write_properties +MailDomainInUseException,mail_domain_in_use_exception +MailDomainNotFoundException,mail_domain_not_found_exception +MailDomainStateException,mail_domain_state_exception +MailDomainSummary,mail_domain_summary +MailDomains,mail_domains +MailFromAttributes,mail_from_attributes +MailFromDomain,mail_from_domain +MailFromDomainAttributes,mail_from_domain_attributes +MailFromDomainNotVerifiedException,mail_from_domain_not_verified_exception +MailFromDomainStatus,mail_from_domain_status +MailType,mail_type +MailboxDeprovisionedDate,mailbox_deprovisioned_date +MailboxExportJob,mailbox_export_job +MailboxProvisionedDate,mailbox_provisioned_date +MailboxQuota,mailbox_quota +MailboxSize,mailbox_size +MailingAddress,mailing_address +Main,main +MainClass,main_class +MainProfileId,main_profile_id +Maintainer,maintainer +Maintenance,maintenance +MaintenanceAutoAppliedAfter,maintenance_auto_applied_after +MaintenanceCreateSettings,maintenance_create_settings +MaintenanceDay,maintenance_day +MaintenanceDeadline,maintenance_deadline +MaintenanceDetails,maintenance_details +MaintenanceOperationsInProgress,maintenance_operations_in_progress +MaintenanceOptions,maintenance_options +MaintenanceSchedule,maintenance_schedule +MaintenanceScheduledDate,maintenance_scheduled_date +MaintenanceSchedules,maintenance_schedules +MaintenanceStartHour,maintenance_start_hour +MaintenanceStartTime,maintenance_start_time +MaintenanceStatus,maintenance_status +MaintenanceStrategies,maintenance_strategies +MaintenanceTrack,maintenance_track +MaintenanceTrackName,maintenance_track_name +MaintenanceTracks,maintenance_tracks +MaintenanceUpdateSettings,maintenance_update_settings +MaintenanceWindow,maintenance_window +MaintenanceWindowAutomationParameters,maintenance_window_automation_parameters +MaintenanceWindowExecution,maintenance_window_execution +MaintenanceWindowExecutionTaskIdentity,maintenance_window_execution_task_identity +MaintenanceWindowExecutionTaskInvocationIdentity,maintenance_window_execution_task_invocation_identity +MaintenanceWindowFilter,maintenance_window_filter +MaintenanceWindowIdentity,maintenance_window_identity +MaintenanceWindowIdentityForTarget,maintenance_window_identity_for_target +MaintenanceWindowLambdaParameters,maintenance_window_lambda_parameters +MaintenanceWindowRunCommandParameters,maintenance_window_run_command_parameters +MaintenanceWindowStartTime,maintenance_window_start_time +MaintenanceWindowStepFunctionsParameters,maintenance_window_step_functions_parameters +MaintenanceWindowTarget,maintenance_window_target +MaintenanceWindowTask,maintenance_window_task +MaintenanceWindowTaskInvocationParameters,maintenance_window_task_invocation_parameters +MaintenanceWindowTaskParameterValueExpression,maintenance_window_task_parameter_value_expression +MajorEngineVersion,major_engine_version +MajorKeyDerivationMode,major_key_derivation_mode +MajorRevision,major_revision +MajorVersion,major_version +Make,make +MalformedArnException,malformed_arn_exception +MalformedCSRException,malformed_csr_exception +MalformedCertificateException,malformed_certificate_exception +MalformedPolicyDocumentException,malformed_policy_document_exception +MalformedPolicyException,malformed_policy_exception +MalformedPolicyTemplateException,malformed_policy_template_exception +MalformedQueryException,malformed_query_exception +Malware,malware +MalwareName,malware_name +MalwarePath,malware_path +MalwareProtection,malware_protection +MalwareProtectionConfiguration,malware_protection_configuration +MalwareProtectionConfigurationResult,malware_protection_configuration_result +MalwareProtectionDataSourceFreeTrial,malware_protection_data_source_free_trial +MalwareState,malware_state +MalwareType,malware_type +ManageBerkshelf,manage_berkshelf +ManageMasterUserPassword,manage_master_user_password +ManagePropertygraphStatisticsInput,manage_propertygraph_statistics_input +ManagePropertygraphStatisticsOutput,manage_propertygraph_statistics_output +ManageSparqlStatisticsInput,manage_sparql_statistics_input +ManageSparqlStatisticsOutput,manage_sparql_statistics_output +ManagedAccount,managed_account +ManagedAction,managed_action +ManagedActionHistoryItem,managed_action_history_item +ManagedActionHistoryItems,managed_action_history_items +ManagedActionInvalidStateException,managed_action_invalid_state_exception +ManagedActions,managed_actions +ManagedAgent,managed_agent +ManagedAgentStateChange,managed_agent_state_change +ManagedBy,managed_by +ManagedByFirewallManager,managed_by_firewall_manager +ManagedDataIdentifierSummary,managed_data_identifier_summary +ManagedExecution,managed_execution +ManagedJobTemplateSummary,managed_job_template_summary +ManagedKeys,managed_keys +ManagedKeysIPV4,managed_keys_ipv4 +ManagedKeysIPV6,managed_keys_ipv6 +ManagedOwnerName,managed_owner_name +ManagedPersistenceMonitoringConfiguration,managed_persistence_monitoring_configuration +ManagedPolicyArn,managed_policy_arn +ManagedPolicyDetail,managed_policy_detail +ManagedPrefixList,managed_prefix_list +ManagedProductDescriptor,managed_product_descriptor +ManagedProducts,managed_products +ManagedResourceSummary,managed_resource_summary +ManagedResourceSummaryList,managed_resource_summary_list +ManagedRule,managed_rule +ManagedRuleDescription,managed_rule_description +ManagedRuleException,managed_rule_exception +ManagedRuleGroupConfig,managed_rule_group_config +ManagedRuleGroupConfigs,managed_rule_group_configs +ManagedRuleGroupStatement,managed_rule_group_statement +ManagedRuleGroupSummary,managed_rule_group_summary +ManagedRuleGroupVersion,managed_rule_group_version +ManagedRuleGroups,managed_rule_groups +ManagedRuleSet,managed_rule_set +ManagedRuleSetName,managed_rule_set_name +ManagedRuleSetSummary,managed_rule_set_summary +ManagedRuleSetVersion,managed_rule_set_version +ManagedRuleSets,managed_rule_sets +ManagedRuleState,managed_rule_state +ManagedRules,managed_rules +ManagedScaling,managed_scaling +ManagedScalingPolicy,managed_scaling_policy +ManagedServiceData,managed_service_data +ManagedStreamingKafkaParameters,managed_streaming_kafka_parameters +ManagedType,managed_type +ManagedbyFirewallManager,managedby_firewall_manager +Management,management +ManagementCidrRangeConstraint,management_cidr_range_constraint +ManagementCidrRanges,management_cidr_ranges +ManagementState,management_state +ManagementType,management_type +ManagesVpcEndpoints,manages_vpc_endpoints +Mandatory,mandatory +Manifest,manifest +ManifestCompression,manifest_compression +ManifestConfirmConditionNotification,manifest_confirm_condition_notification +ManifestDurationFormat,manifest_duration_format +ManifestEncoding,manifest_encoding +ManifestEncryption,manifest_encryption +ManifestEndpointPrefix,manifest_endpoint_prefix +ManifestFileLocation,manifest_file_location +ManifestFilePath,manifest_file_path +ManifestFormat,manifest_format +ManifestGenerator,manifest_generator +ManifestKey,manifest_key +ManifestLayout,manifest_layout +ManifestMetadataSignaling,manifest_metadata_signaling +ManifestName,manifest_name +ManifestNameModifier,manifest_name_modifier +ManifestOutputLocation,manifest_output_location +ManifestOverridesPayload,manifest_overrides_payload +ManifestPayload,manifest_payload +ManifestPrefix,manifest_prefix +ManifestPrefixLocation,manifest_prefix_location +ManifestProcessingRules,manifest_processing_rules +ManifestS3Uri,manifest_s3_uri +ManifestSummary,manifest_summary +ManifestURI,manifest_uri +ManifestWindowSeconds,manifest_window_seconds +Manual,manual +ManualEvidence,manual_evidence +ManualMergeRequiredException,manual_merge_required_exception +ManualSnapshotRemainingDays,manual_snapshot_remaining_days +ManualSnapshotRetentionPeriod,manual_snapshot_retention_period +ManualSnapshotsCurrentCount,manual_snapshots_current_count +ManualSnapshotsLimit,manual_snapshots_limit +ManualSnapshotsLimitReached,manual_snapshots_limit_reached +Manufacturer,manufacturer +ManufacturerHardwareCertificate,manufacturer_hardware_certificate +ManufacturerName,manufacturer_name +MapArn,map_arn +MapBooleanAsBoolean,map_boolean_as_boolean +MapConfiguration,map_configuration +MapConfigurationUpdate,map_configuration_update +MapCustomerOwnedIpOnLaunch,map_customer_owned_ip_on_launch +MapEntries,map_entries +MapEquals,map_equals +MapFilter,map_filter +MapIterationEventDetails,map_iteration_event_details +MapJsonbAsClob,map_jsonb_as_clob +MapLongVarcharAs,map_long_varchar_as +MapMatchingConfig,map_matching_config +MapName,map_name +MapPublicIpOnLaunch,map_public_ip_on_launch +MapRunExecutionCounts,map_run_execution_counts +MapRunFailedEventDetails,map_run_failed_event_details +MapRunItemCounts,map_run_item_counts +MapRunListItem,map_run_list_item +MapRunStartedEventDetails,map_run_started_event_details +MapStateStartedEventDetails,map_state_started_event_details +MapStyleOptions,map_style_options +MapZoomMode,map_zoom_mode +MappedDataSetParameter,mapped_data_set_parameter +MappedDataSetParameters,mapped_data_set_parameters +MappedResourceConfigurationList,mapped_resource_configuration_list +MappedResourceConfigurationListItem,mapped_resource_configuration_list_item +Mapping,mapping +MappingEntry,mapping_entry +MappingParameters,mapping_parameters +MappingRule,mapping_rule +Mappings,mappings +Margin,margin +MarginPercentage,margin_percentage +MarginStyle,margin_style +MariaDbDataProviderSettings,maria_db_data_provider_settings +MariaDbParameters,maria_db_parameters +MarkAsArchivedRequest,mark_as_archived_request +MarkLatest,mark_latest +Marker,marker +MarkerColor,marker_color +MarkerRecordedEventAttributes,marker_recorded_event_attributes +MarkerShape,marker_shape +MarkerSize,marker_size +MarkerStyleSettings,marker_style_settings +MarkerVisibility,marker_visibility +Market,market +MarketType,market_type +Marketo,marketo +MarketoConnectorProfileCredentials,marketo_connector_profile_credentials +MarketoConnectorProfileProperties,marketo_connector_profile_properties +MarketoDestinationProperties,marketo_destination_properties +MarketoSourceProperties,marketo_source_properties +Marketplace,marketplace +MarketplaceCommerceAnalyticsException,marketplace_commerce_analytics_exception +MarketplaceDescription,marketplace_description +MarketplaceInformation,marketplace_information +MarketplaceOnboardingStatus,marketplace_onboarding_status +MarketplaceTitle,marketplace_title +MarketplaceUrl,marketplace_url +MarksNotSupportedForFormatException,marks_not_supported_for_format_exception +Mask,mask +MaskCharacter,mask_character +MaskMode,mask_mode +MaskValue,mask_value +Masks,masks +Master,master +MasterAccountArn,master_account_arn +MasterAccountEmail,master_account_email +MasterAccountId,master_account_id +MasterArn,master_arn +MasterBackendRole,master_backend_role +MasterCannotLeaveOrganizationException,master_cannot_leave_organization_exception +MasterEligibleNodeCount,master_eligible_node_count +MasterId,master_id +MasterInstanceId,master_instance_id +MasterInstanceSecurityGroupId,master_instance_security_group_id +MasterInstanceType,master_instance_type +MasterNode,master_node +MasterPublicDnsName,master_public_dns_name +MasterRegion,master_region +MasterUserARN,master_user_arn +MasterUserArn,master_user_arn +MasterUserName,master_user_name +MasterUserOptions,master_user_options +MasterUserPassword,master_user_password +MasterUserSecret,master_user_secret +MasterUserSecretKmsKeyId,master_user_secret_kms_key_id +MasterUsername,master_username +MasteringMonitorNits,mastering_monitor_nits +Match,match +MatchAllValue,match_all_value +MatchAttributes,match_attributes +MatchConfidence,match_confidence +MatchCriteria,match_criteria +MatchGenerationDate,match_generation_date +MatchId,match_id +MatchIds,match_ids +MatchItem,match_item +MatchOperator,match_operator +MatchOption,match_option +MatchOptions,match_options +MatchPaths,match_paths +MatchPattern,match_pattern +MatchPredicates,match_predicates +MatchRange,match_range +MatchScope,match_scope +MatchType,match_type +MatchedCategories,matched_categories +MatchedDetails,matched_details +MatchedEventTime,matched_event_time +MatchedPlayerSession,matched_player_session +MatchedPlayerSessions,matched_player_sessions +MatchedRules,matched_rules +MatchedStatements,matched_statements +MatchedUser,matched_user +Matcher,matcher +Matches,matches +Matching,matching +MatchingAttributesList,matching_attributes_list +MatchingBucket,matching_bucket +MatchingEventTypes,matching_event_types +MatchingRequest,matching_request +MatchingResource,matching_resource +MatchingResponse,matching_response +MatchingRule,matching_rule +MatchingRules,matching_rules +MatchingWorkflowSummary,matching_workflow_summary +MatchmakerData,matchmaker_data +MatchmakingConfiguration,matchmaking_configuration +MatchmakingRuleSet,matchmaking_rule_set +MatchmakingTicket,matchmaking_ticket +MathActivity,math_activity +MavenReference,maven_reference +MavenReferenceDescription,maven_reference_description +Max,max +Max24HourSend,max24_hour_send +MaxAbrBitrate,max_abr_bitrate +MaxActiveResourcesExceededException,max_active_resources_exceeded_exception +MaxAge,max_age +MaxAgeInDays,max_age_in_days +MaxAgeInMinutes,max_age_in_minutes +MaxAgeRule,max_age_rule +MaxAgeSeconds,max_age_seconds +MaxAggregationInterval,max_aggregation_interval +MaxAllocatedStorage,max_allocated_storage +MaxAllowedRuleLevelForMatching,max_allowed_rule_level_for_matching +MaxAllowedRuleLevelForMerging,max_allowed_rule_level_for_merging +MaxAllowedSignature,max_allowed_signature +MaxAlternatives,max_alternatives +MaxAncDataSize,max_anc_data_size +MaxAssignments,max_assignments +MaxAttempts,max_attempts +MaxAutoMLJobRuntimeInSeconds,max_auto_ml_job_runtime_in_seconds +MaxAverageBitrate,max_average_bitrate +MaxBand,max_band +MaxBitrate,max_bitrate +MaxCandidates,max_candidates +MaxCapacity,max_capacity +MaxCapacityBreachBehavior,max_capacity_breach_behavior +MaxCapacityBuffer,max_capacity_buffer +MaxCapacityUnits,max_capacity_units +MaxCaptures,max_captures +MaxCityNetworksToMonitor,max_city_networks_to_monitor +MaxCll,max_cll +MaxConcurrency,max_concurrency +MaxConcurrentCount,max_concurrent_count +MaxConcurrentDpus,max_concurrent_dpus +MaxConcurrentGameSessionActivations,max_concurrent_game_session_activations +MaxConcurrentInvocationsPerInstance,max_concurrent_invocations_per_instance +MaxConcurrentPercentage,max_concurrent_percentage +MaxConcurrentQueriesException,max_concurrent_queries_exception +MaxConcurrentRuns,max_concurrent_runs +MaxConcurrentSessions,max_concurrent_sessions +MaxConcurrentTaskCount,max_concurrent_task_count +MaxConcurrentTransforms,max_concurrent_transforms +MaxConnections,max_connections +MaxConnectionsPercent,max_connections_percent +MaxContacts,max_contacts +MaxContentLightLevel,max_content_light_level +MaxContentSizePerPageInMegaBytes,max_content_size_per_page_in_mega_bytes +MaxContributorCount,max_contributor_count +MaxContributorValue,max_contributor_value +MaxCount,max_count +MaxCountRule,max_count_rule +MaxCpuUtilizationPercentage,max_cpu_utilization_percentage +MaxDatapoints,max_datapoints +MaxDepth,max_depth +MaxDocumentSizeExceeded,max_document_size_exceeded +MaxDominantColors,max_dominant_colors +MaxDrainDurationSeconds,max_drain_duration_seconds +MaxDuration,max_duration +MaxDurationInSeconds,max_duration_in_seconds +MaxDurationSeconds,max_duration_seconds +MaxDutyCycle,max_duty_cycle +MaxEirp,max_eirp +MaxEntries,max_entries +MaxErrors,max_errors +MaxExpirationTime,max_expiration_time +MaxFaces,max_faces +MaxFall,max_fall +MaxFetchRecordsPerShard,max_fetch_records_per_shard +MaxFetchTimeInMs,max_fetch_time_in_ms +MaxFileSize,max_file_size +MaxFiles,max_files +MaxFilesInBand,max_files_in_band +MaxFrameAverageLightLevel,max_frame_average_light_level +MaxFrameRate,max_frame_rate +MaxGroupPreparedCapacity,max_group_prepared_capacity +MaxHeight,max_height +MaxHumanLabeledObjectCount,max_human_labeled_object_count +MaxIdleConnectionsPercent,max_idle_connections_percent +MaxImpact,max_impact +MaxInferenceUnits,max_inference_units +MaxInstanceCount,max_instance_count +MaxInstanceLifetime,max_instance_lifetime +MaxInvocations,max_invocations +MaxInvocationsPerMinute,max_invocations_per_minute +MaxIopsPerDbInstance,max_iops_per_db_instance +MaxIopsPerGib,max_iops_per_gib +MaxItems,max_items +MaxKBytesPerRead,max_k_bytes_per_read +MaxKeys,max_keys +MaxLabels,max_labels +MaxLatency,max_latency +MaxLength,max_length +MaxLexemeLengthExceededException,max_lexeme_length_exceeded_exception +MaxLexiconsNumberExceededException,max_lexicons_number_exceeded_exception +MaxLimit,max_limit +MaxLinksPerPage,max_links_per_page +MaxLocalMediaSizeInMB,max_local_media_size_in_mb +MaxLuminance,max_luminance +MaxManifestFragmentResults,max_manifest_fragment_results +MaxMediaPlaylistFragmentResults,max_media_playlist_fragment_results +MaxMembers,max_members +MaxMemoryUtilizationPercentage,max_memory_utilization_percentage +MaxModelVersion,max_model_version +MaxModels,max_models +MaxNumberOfAutoScalingGroups,max_number_of_auto_scaling_groups +MaxNumberOfConfigRulesExceededException,max_number_of_config_rules_exceeded_exception +MaxNumberOfConfigurationRecordersExceededException,max_number_of_configuration_recorders_exceeded_exception +MaxNumberOfConformancePacksExceededException,max_number_of_conformance_packs_exceeded_exception +MaxNumberOfDeliveryChannelsExceededException,max_number_of_delivery_channels_exceeded_exception +MaxNumberOfLaunchConfigurations,max_number_of_launch_configurations +MaxNumberOfMessages,max_number_of_messages +MaxNumberOfMessagesPerSecond,max_number_of_messages_per_second +MaxNumberOfOrganizationConfigRulesExceededException,max_number_of_organization_config_rules_exceeded_exception +MaxNumberOfOrganizationConformancePacksExceededException,max_number_of_organization_conformance_packs_exceeded_exception +MaxNumberOfRetentionConfigurationsExceededException,max_number_of_retention_configurations_exceeded_exception +MaxNumberOfTests,max_number_of_tests +MaxNumberOfTrainingJobs,max_number_of_training_jobs +MaxNumberOfTrainingJobsNotImproving,max_number_of_training_jobs_not_improving +MaxOffsetsPerTrigger,max_offsets_per_trigger +MaxOutputFiles,max_output_files +MaxOutputs,max_outputs +MaxP95Performance,max_p95_performance +MaxPaddingBytes,max_padding_bytes +MaxParallelExecutionSteps,max_parallel_execution_steps +MaxParallelLaunches,max_parallel_launches +MaxParallelOfTests,max_parallel_of_tests +MaxParallelTrainingJobs,max_parallel_training_jobs +MaxParts,max_parts +MaxPasswordAge,max_password_age +MaxPayloadInMB,max_payload_in_mb +MaxPcrInterval,max_pcr_interval +MaxPercentageOfInputDatasetLabeled,max_percentage_of_input_dataset_labeled +MaxPixelThreshold,max_pixel_threshold +MaxPrice,max_price +MaxPricePerMinute,max_price_per_minute +MaxProtectionGroups,max_protection_groups +MaxQueryResults,max_query_results +MaxRange,max_range +MaxRecordCount,max_record_count +MaxRecordPerRead,max_record_per_read +MaxRecords,max_records +MaxRenditions,max_renditions +MaxResource,max_resource +MaxResults,max_results +MaxRetentionDays,max_retention_days +MaxRetries,max_retries +MaxRetryCount,max_retry_count +MaxRetryIntervalMs,max_retry_interval_ms +MaxRows,max_rows +MaxRuntimeInSeconds,max_runtime_in_seconds +MaxRuntimePerTrainingJobInSeconds,max_runtime_per_training_job_in_seconds +MaxSchemaVersion,max_schema_version +MaxScore,max_score +MaxSelectedChoices,max_selected_choices +MaxSendRate,max_send_rate +MaxSessionDuration,max_session_duration +MaxSize,max_size +MaxSlotDurationInHours,max_slot_duration_in_hours +MaxSlotsByChannel,max_slots_by_channel +MaxSpeakerLabels,max_speaker_labels +MaxStorageSize,max_storage_size +MaxStorageThroughputPerDbInstance,max_storage_throughput_per_db_instance +MaxStorageThroughputPerIops,max_storage_throughput_per_iops +MaxStorageUtilizationPercentage,max_storage_utilization_percentage +MaxSuggestionsCount,max_suggestions_count +MaxSwap,max_swap +MaxSyncBuffer,max_sync_buffer +MaxTTL,max_ttl +MaxTermDurationInDays,max_term_duration_in_days +MaxTimeToLiveInMinutes,max_time_to_live_in_minutes +MaxTimestampGapInDays,max_timestamp_gap_in_days +MaxTotalPrice,max_total_price +MaxUnits,max_units +MaxUploads,max_uploads +MaxUrlsPerMinuteCrawlRate,max_urls_per_minute_crawl_rate +MaxUserDurationInSeconds,max_user_duration_in_seconds +MaxUsers,max_users +MaxValue,max_value +MaxVersion,max_version +MaxVideoBitsPerSecond,max_video_bits_per_second +MaxVisibleColumns,max_visible_columns +MaxVisibleRows,max_visible_rows +MaxVolumeLimit,max_volume_limit +MaxWaitTimeInSeconds,max_wait_time_in_seconds +MaxWidth,max_width +MaxWorkers,max_workers +Maximum,maximum +MaximumAllowedResources,maximum_allowed_resources +MaximumAutomaticAttempts,maximum_automatic_attempts +MaximumBandwidthInMbps,maximum_bandwidth_in_mbps +MaximumBatchSize,maximum_batch_size +MaximumBatchingWindowInSeconds,maximum_batching_window_in_seconds +MaximumBitrate,maximum_bitrate +MaximumBranchesExceededException,maximum_branches_exceeded_exception +MaximumCapacityUnits,maximum_capacity_units +MaximumConcurrency,maximum_concurrency +MaximumConflictResolutionEntriesExceededException,maximum_conflict_resolution_entries_exceeded_exception +MaximumCoreCapacityUnits,maximum_core_capacity_units +MaximumDuration,maximum_duration +MaximumEfaInterfaces,maximum_efa_interfaces +MaximumEventAgeInSeconds,maximum_event_age_in_seconds +MaximumExecutionFrequency,maximum_execution_frequency +MaximumExecutionTimeoutInSeconds,maximum_execution_timeout_in_seconds +MaximumFileContentToLoadExceededException,maximum_file_content_to_load_exceeded_exception +MaximumFileEntriesExceededException,maximum_file_entries_exceeded_exception +MaximumFramerate,maximum_framerate +MaximumIndividualPlayerLatencyMilliseconds,maximum_individual_player_latency_milliseconds +MaximumInstanceCount,maximum_instance_count +MaximumIops,maximum_iops +MaximumItemsToCompareExceededException,maximum_items_to_compare_exceeded_exception +MaximumLabelType,maximum_label_type +MaximumLength,maximum_length +MaximumMinimum,maximum_minimum +MaximumMinimumComputation,maximum_minimum_computation +MaximumNetworkCards,maximum_network_cards +MaximumNetworkInterfaces,maximum_network_interfaces +MaximumNormalizedUnitsUsedPerHour,maximum_normalized_units_used_per_hour +MaximumNumberOfApprovalsExceededException,maximum_number_of_approvals_exceeded_exception +MaximumNumberOfInstancesUsedPerHour,maximum_number_of_instances_used_per_hour +MaximumNumberOfTrailsExceededException,maximum_number_of_trails_exceeded_exception +MaximumOnDemandCapacityUnits,maximum_on_demand_capacity_units +MaximumOpenPullRequestsExceededException,maximum_open_pull_requests_exceeded_exception +MaximumPartitionCount,maximum_partition_count +MaximumPercent,maximum_percent +MaximumPlayerSessionCount,maximum_player_session_count +MaximumRGBTolerance,maximum_rgb_tolerance +MaximumRecordAgeInSeconds,maximum_record_age_in_seconds +MaximumReplicationCount,maximum_replication_count +MaximumRepositoryNamesExceededException,maximum_repository_names_exceeded_exception +MaximumRepositoryTriggersExceededException,maximum_repository_triggers_exceeded_exception +MaximumResultReturnedException,maximum_result_returned_exception +MaximumRetention,maximum_retention +MaximumRetryAttempts,maximum_retry_attempts +MaximumRuleTemplatesAssociatedWithRepositoryException,maximum_rule_templates_associated_with_repository_exception +MaximumStringLength,maximum_string_length +MaximumSubChannels,maximum_sub_channels +MaximumSupportedWeightLbs,maximum_supported_weight_lbs +MaximumTTL,maximum_ttl +MaximumThroughputInMBps,maximum_throughput_in_m_bps +MaximumTraversalDepth,maximum_traversal_depth +MaximumUnits,maximum_units +MaximumValue,maximum_value +MaximumVideoBufferDelayMilliseconds,maximum_video_buffer_delay_milliseconds +MaximumWindowInMinutes,maximum_window_in_minutes +MaximumYUV,maximum_yuv +McGroupId,mc_group_id +Mcc,mcc +MccXml,mcc_xml +Md5Hash,md5_hash +MdnResponse,mdn_response +MdnSigningAlgorithm,mdn_signing_algorithm +MeanTimeToRecoverInMilliseconds,mean_time_to_recover_in_milliseconds +MeanValue,mean_value +Measure,measure +MeasureAggregationFunction,measure_aggregation_function +MeasureDataLabelStyle,measure_data_label_style +MeasureField,measure_field +MeasureFieldId,measure_field_id +MeasureForeground,measure_foreground +MeasureLabelVisibility,measure_label_visibility +MeasureLatency,measure_latency +MeasureName,measure_name +MeasureNameColumn,measure_name_column +MeasureValue,measure_value +MeasureValueType,measure_value_type +MeasureValues,measure_values +Measurement,measurement +MeasurementProcessingConfig,measurement_processing_config +Media,media +MediaCapturePipeline,media_capture_pipeline +MediaCapturePipelineSourceConfiguration,media_capture_pipeline_source_configuration +MediaCapturePipelineSummary,media_capture_pipeline_summary +MediaCapturePipelines,media_capture_pipelines +MediaConcatenationPipeline,media_concatenation_pipeline +MediaConcurrencies,media_concurrencies +MediaConcurrency,media_concurrency +MediaConnectFlow,media_connect_flow +MediaConnectFlowRequest,media_connect_flow_request +MediaConnectFlows,media_connect_flows +MediaConnectSettings,media_connect_settings +MediaEncoding,media_encoding +MediaFileUri,media_file_uri +MediaFormat,media_format +MediaInsightsConfiguration,media_insights_configuration +MediaInsightsPipeline,media_insights_pipeline +MediaInsightsPipelineConfiguration,media_insights_pipeline_configuration +MediaInsightsPipelineConfigurationArn,media_insights_pipeline_configuration_arn +MediaInsightsPipelineConfigurationElement,media_insights_pipeline_configuration_element +MediaInsightsPipelineConfigurationId,media_insights_pipeline_configuration_id +MediaInsightsPipelineConfigurationName,media_insights_pipeline_configuration_name +MediaInsightsPipelineConfigurationSummary,media_insights_pipeline_configuration_summary +MediaInsightsPipelineConfigurations,media_insights_pipeline_configurations +MediaInsightsPipelineElementStatus,media_insights_pipeline_element_status +MediaInsightsRuntimeMetadata,media_insights_runtime_metadata +MediaLiveConnectorPipeline,media_live_connector_pipeline +MediaLiveInputArn,media_live_input_arn +MediaPackageGroupSettings,media_package_group_settings +MediaPackageOutputDestinationSettings,media_package_output_destination_settings +MediaPackageOutputSettings,media_package_output_settings +MediaPackageSettings,media_package_settings +MediaPipeline,media_pipeline +MediaPipelineArn,media_pipeline_arn +MediaPipelineId,media_pipeline_id +MediaPipelineSummary,media_pipeline_summary +MediaPipelines,media_pipelines +MediaPlacement,media_placement +MediaRegion,media_region +MediaSampleRate,media_sample_rate +MediaSampleRateHertz,media_sample_rate_hertz +MediaSourceConfig,media_source_config +MediaStorageConfiguration,media_storage_configuration +MediaStoreStorageClass,media_store_storage_class +MediaStream,media_stream +MediaStreamAttributes,media_stream_attributes +MediaStreamAttributesRequest,media_stream_attributes_request +MediaStreamId,media_stream_id +MediaStreamName,media_stream_name +MediaStreamOutputConfiguration,media_stream_output_configuration +MediaStreamOutputConfigurationRequest,media_stream_output_configuration_request +MediaStreamOutputConfigurations,media_stream_output_configurations +MediaStreamPipeline,media_stream_pipeline +MediaStreamSink,media_stream_sink +MediaStreamSource,media_stream_source +MediaStreamSourceConfiguration,media_stream_source_configuration +MediaStreamSourceConfigurationRequest,media_stream_source_configuration_request +MediaStreamSourceConfigurations,media_stream_source_configurations +MediaStreamType,media_stream_type +MediaStreams,media_streams +MediaType,media_type +MediaUriSecretArn,media_uri_secret_arn +MediaUriType,media_uri_type +MediaUrl,media_url +MediaconnectSettings,mediaconnect_settings +MedialiveInputArns,medialive_input_arns +MedianRuntimeSeconds,median_runtime_seconds +MedicalAlternative,medical_alternative +MedicalEntity,medical_entity +MedicalItem,medical_item +MedicalResult,medical_result +MedicalTranscript,medical_transcript +MedicalTranscriptEvent,medical_transcript_event +MedicalTranscriptionJob,medical_transcription_job +MedicalTranscriptionJobName,medical_transcription_job_name +MedicalTranscriptionJobSummaries,medical_transcription_job_summaries +MedicalTranscriptionJobSummary,medical_transcription_job_summary +MedicalTranscriptionSetting,medical_transcription_setting +MediumAction,medium_action +MediumChangerType,medium_changer_type +MediumCount,medium_count +Meeting,meeting +MeetingArn,meeting_arn +MeetingEvents,meeting_events +MeetingEventsConcatenationConfiguration,meeting_events_concatenation_configuration +MeetingFeatures,meeting_features +MeetingFeaturesConfiguration,meeting_features_configuration +MeetingHostId,meeting_host_id +MeetingId,meeting_id +MeetingNotificationConfiguration,meeting_notification_configuration +MeetingRoomConfiguration,meeting_room_configuration +MeetingSetting,meeting_setting +Meetings,meetings +Member,member +MemberAccount,member_account +MemberAccountEc2DeepInspectionStatus,member_account_ec2_deep_inspection_status +MemberAccountEc2DeepInspectionStatusState,member_account_ec2_deep_inspection_status_state +MemberAccountId,member_account_id +MemberAccountIds,member_account_ids +MemberAccountLimitReached,member_account_limit_reached +MemberAccountRuleStatus,member_account_rule_status +MemberAccountStatus,member_account_status +MemberAccounts,member_accounts +MemberAdditionalConfiguration,member_additional_configuration +MemberAdditionalConfigurationResult,member_additional_configuration_result +MemberArn,member_arn +MemberArns,member_arns +MemberClusters,member_clusters +MemberClustersOutpostArns,member_clusters_outpost_arns +MemberConfiguration,member_configuration +MemberDataSourceConfiguration,member_data_source_configuration +MemberDataSourceConfigurations,member_data_source_configurations +MemberDatasources,member_datasources +MemberDefinition,member_definition +MemberDefinitions,member_definitions +MemberDetail,member_detail +MemberDetails,member_details +MemberError,member_error +MemberFabricAttributes,member_fabric_attributes +MemberFabricConfiguration,member_fabric_configuration +MemberFabricLogPublishingConfiguration,member_fabric_log_publishing_configuration +MemberFeaturesConfiguration,member_features_configuration +MemberFeaturesConfigurationResult,member_features_configuration_result +MemberFrameworkAttributes,member_framework_attributes +MemberFrameworkConfiguration,member_framework_configuration +MemberGroup,member_group +MemberGroups,member_groups +MemberId,member_id +MemberIdArnPair,member_id_arn_pair +MemberLogPublishingConfiguration,member_log_publishing_configuration +MemberName,member_name +MemberOfServiceLinkedResourceGroup,member_of_service_linked_resource_group +MemberSpecification,member_specification +MemberStatus,member_status +MemberSummary,member_summary +MemberType,member_type +MemberUser,member_user +MemberUsers,member_users +Members,members +Membership,membership +MembershipCount,membership_count +MembershipDatasources,membership_datasources +MembershipExists,membership_exists +MembershipId,membership_id +MembershipItem,membership_item +MembershipItemList,membership_item_list +MembershipProtectedQueryResultConfiguration,membership_protected_query_result_configuration +MembershipSummary,membership_summary +Memory,memory +MemoryDuration,memory_duration +MemoryGB,memory_gb +MemoryGiBPerVCpu,memory_gib_per_v_cpu +MemoryGiBPerVCpuRequest,memory_gib_per_v_cpu_request +MemoryInMB,memory_in_mb +MemoryInfo,memory_info +MemoryLimitExceededException,memory_limit_exceeded_exception +MemoryMiB,memory_mib +MemoryMiBRequest,memory_mib_request +MemoryRegions,memory_regions +MemoryReservation,memory_reservation +MemorySize,memory_size +MemorySizeConfiguration,memory_size_configuration +MemorySizeInMB,memory_size_in_mb +MemoryStore,memory_store +MemoryStoreRetentionPeriodInHours,memory_store_retention_period_in_hours +MemoryThreshold,memory_threshold +MemoryUtilization,memory_utilization +MentionSentiment,mention_sentiment +Mentions,mentions +Merge,merge +MergeAction,merge_action +MergeBaseCommit,merge_base_commit +MergeBranchesByFastForwardInput,merge_branches_by_fast_forward_input +MergeBranchesByFastForwardOutput,merge_branches_by_fast_forward_output +MergeBranchesBySquashInput,merge_branches_by_squash_input +MergeBranchesBySquashOutput,merge_branches_by_squash_output +MergeBranchesByThreeWayInput,merge_branches_by_three_way_input +MergeBranchesByThreeWayOutput,merge_branches_by_three_way_output +MergeClause,merge_clause +MergeDeveloperIdentitiesInput,merge_developer_identities_input +MergeDeveloperIdentitiesResponse,merge_developer_identities_response +MergeHunk,merge_hunk +MergeHunkDetail,merge_hunk_detail +MergeMetadata,merge_metadata +MergeOperations,merge_operations +MergeOptionRequiredException,merge_option_required_exception +MergePolicy,merge_policy +MergeProfilesRequest,merge_profiles_request +MergeProfilesResponse,merge_profiles_response +MergePullRequestByFastForwardInput,merge_pull_request_by_fast_forward_input +MergePullRequestByFastForwardOutput,merge_pull_request_by_fast_forward_output +MergePullRequestBySquashInput,merge_pull_request_by_squash_input +MergePullRequestBySquashOutput,merge_pull_request_by_squash_output +MergePullRequestByThreeWayInput,merge_pull_request_by_three_way_input +MergePullRequestByThreeWayOutput,merge_pull_request_by_three_way_output +MergeShardsInput,merge_shards_input +MergeStrategy,merge_strategy +MergeWhenMatched,merge_when_matched +MergeWhenNotMatched,merge_when_not_matched +MergedDatasetNames,merged_dataset_names +MeshData,mesh_data +MeshRef,mesh_ref +MeshServiceDiscovery,mesh_service_discovery +MeshSpec,mesh_spec +MeshStatus,mesh_status +Message,message +MessageAction,message_action +MessageActivity,message_activity +MessageAttributeNames,message_attribute_names +MessageAttributeValue,message_attribute_value +MessageAttributes,message_attributes +MessageBody,message_body +MessageBodyTextType,message_body_text_type +MessageConfig,message_config +MessageConfiguration,message_configuration +MessageData,message_data +MessageDeduplicationId,message_deduplication_id +MessageDeliveryStatus,message_delivery_status +MessageDeliveryStatusEventConfiguration,message_delivery_status_event_configuration +MessageDeliveryStatusResourceTypeEventConfiguration,message_delivery_status_resource_type_event_configuration +MessageDetail,message_detail +MessageDsn,message_dsn +MessageFieldMappings,message_field_mappings +MessageFormat,message_format +MessageFrozen,message_frozen +MessageGroup,message_group +MessageGroupId,message_group_id +MessageId,message_id +MessageInsightsDataSource,message_insights_data_source +MessageInsightsFilters,message_insights_filters +MessageMaxBytes,message_max_bytes +MessageMetadata,message_metadata +MessagePayload,message_payload +MessagePrefix,message_prefix +MessageRejected,message_rejected +MessageRequest,message_request +MessageResponse,message_response +MessageResult,message_result +MessageReviewHandler,message_review_handler +MessageStructure,message_structure +MessageSubject,message_subject +MessageSystemAttributeValue,message_system_attribute_value +MessageSystemAttributes,message_system_attributes +MessageTag,message_tag +MessageTemplateType,message_template_type +MessageText,message_text +MessageTtlSeconds,message_ttl_seconds +MessageType,message_type +MessageTypes,message_types +Messages,messages +MessagesPerSecond,messages_per_second +MessagingSessionEndpoint,messaging_session_endpoint +MetaData,meta_data +MetaDataKey,meta_data_key +MetaDataValue,meta_data_value +Metadata,metadata +Metadata3,metadata3 +Metadata4,metadata4 +Metadata5,metadata5 +Metadata6,metadata6 +Metadata7,metadata7 +Metadata8,metadata8 +MetadataBlob,metadata_blob +MetadataBlobChecksum,metadata_blob_checksum +MetadataBlobChecksumAlgorithm,metadata_blob_checksum_algorithm +MetadataBlobLength,metadata_blob_length +MetadataCatalogConfig,metadata_catalog_config +MetadataCatalogDetail,metadata_catalog_detail +MetadataConfiguration,metadata_configuration +MetadataContent,metadata_content +MetadataControl,metadata_control +MetadataDestination,metadata_destination +MetadataDirective,metadata_directive +MetadataEntry,metadata_entry +MetadataException,metadata_exception +MetadataInfo,metadata_info +MetadataInfoMap,metadata_info_map +MetadataKey,metadata_key +MetadataKeyValue,metadata_key_value +MetadataKeyValuePair,metadata_key_value_pair +MetadataList,metadata_list +MetadataOperation,metadata_operation +MetadataOptions,metadata_options +MetadataProperties,metadata_properties +MetadataString,metadata_string +MetadataToUpdate,metadata_to_update +MetadataValue,metadata_value +MeterUsageRequest,meter_usage_request +MeterUsageResult,meter_usage_result +MeteredLinesOfCodeCount,metered_lines_of_code_count +MeteringMode,metering_mode +MeteringProfileCount,metering_profile_count +MeteringRecordId,metering_record_id +Method,method +MethodName,method_name +MethodNotAllowedException,method_not_allowed_exception +MethodResponse,method_response +MethodSetting,method_setting +MethodSettings,method_settings +MethodSnapshot,method_snapshot +Methods,methods +Metric,metric +MetricAggregationType,metric_aggregation_type +MetricAlarm,metric_alarm +MetricAlarms,metric_alarms +MetricAttribute,metric_attribute +MetricAttribution,metric_attribution +MetricAttributionOutput,metric_attribution_output +MetricAttributionSummary,metric_attribution_summary +MetricCollectionType,metric_collection_type +MetricComparison,metric_comparison +MetricComparisonComputation,metric_comparison_computation +MetricData,metric_data +MetricDataError,metric_data_error +MetricDataPoint,metric_data_point +MetricDataQueries,metric_data_queries +MetricDataQuery,metric_data_query +MetricDataResult,metric_data_result +MetricDataResults,metric_data_results +MetricDataSummary,metric_data_summary +MetricDataV2,metric_data_v2 +MetricDatapoint,metric_datapoint +MetricDatapoints,metric_datapoints +MetricDatum,metric_datum +MetricDefinition,metric_definition +MetricDefinitionConfig,metric_definition_config +MetricDefinitionId,metric_definition_id +MetricDefinitionIds,metric_definition_ids +MetricDefinitionRequest,metric_definition_request +MetricDefinitions,metric_definitions +MetricDescription,metric_description +MetricDestinationSummary,metric_destination_summary +MetricDimension,metric_dimension +MetricDimensionGroups,metric_dimension_groups +MetricDimensions,metric_dimensions +MetricDisplayName,metric_display_name +MetricFilter,metric_filter +MetricFilterKey,metric_filter_key +MetricFilterMatchRecord,metric_filter_match_record +MetricFilterV2,metric_filter_v2 +MetricFilterValues,metric_filter_values +MetricFilters,metric_filters +MetricGoal,metric_goal +MetricGoalConfig,metric_goal_config +MetricGranularityType,metric_granularity_type +MetricGroups,metric_groups +MetricHeaderCellStyle,metric_header_cell_style +MetricIndex,metric_index +MetricInfo,metric_info +MetricIntervalLowerBound,metric_interval_lower_bound +MetricIntervalUpperBound,metric_interval_upper_bound +MetricKeyDataPoints,metric_key_data_points +MetricLevelImpact,metric_level_impact +MetricLevelImpactList,metric_level_impact_list +MetricList,metric_list +MetricMathAnomalyDetector,metric_math_anomaly_detector +MetricMonitor,metric_monitor +MetricMonitorConfig,metric_monitor_config +MetricName,metric_name +MetricNames,metric_names +MetricNamespace,metric_namespace +MetricPlacement,metric_placement +MetricPoint,metric_point +MetricPoints,metric_points +MetricPolicy,metric_policy +MetricPolicyRule,metric_policy_rule +MetricPolicyRules,metric_policy_rules +MetricProcessingConfig,metric_processing_config +MetricQueries,metric_queries +MetricQuery,metric_query +MetricResult,metric_result +MetricResultV2,metric_result_v2 +MetricResults,metric_results +MetricSetArn,metric_set_arn +MetricSetDataQualityMetric,metric_set_data_quality_metric +MetricSetDataQualityMetricList,metric_set_data_quality_metric_list +MetricSetDescription,metric_set_description +MetricSetDimensionFilter,metric_set_dimension_filter +MetricSetFrequency,metric_set_frequency +MetricSetName,metric_set_name +MetricSetSummary,metric_set_summary +MetricSetSummaryList,metric_set_summary_list +MetricSource,metric_source +MetricSpecification,metric_specification +MetricSpecifications,metric_specifications +MetricStat,metric_stat +MetricStatisticRecommendation,metric_statistic_recommendation +MetricStreamEntry,metric_stream_entry +MetricStreamFilter,metric_stream_filter +MetricStreamStatisticsConfiguration,metric_stream_statistics_configuration +MetricStreamStatisticsMetric,metric_stream_statistics_metric +MetricTimezone,metric_timezone +MetricToRetain,metric_to_retain +MetricTransformation,metric_transformation +MetricType,metric_type +MetricTypes,metric_types +MetricV2,metric_v2 +MetricValue,metric_value +MetricValueList,metric_value_list +MetricWidget,metric_widget +MetricWidgetImage,metric_widget_image +MetricWindow,metric_window +Metrics,metrics +MetricsAnalyzed,metrics_analyzed +MetricsAndOperator,metrics_and_operator +MetricsConfiguration,metrics_configuration +MetricsConfigurationList,metrics_configuration_list +MetricsDataSource,metrics_data_source +MetricsEnabled,metrics_enabled +MetricsLevel,metrics_level +MetricsLevelUpdate,metrics_level_update +MetricsOverLookbackPeriod,metrics_over_lookback_period +MetricsSource,metrics_source +MetricsSummary,metrics_summary +Metro,metro +Mfa,mfa +MfaAuthenticated,mfa_authenticated +MfaConfiguration,mfa_configuration +MfaEmail,mfa_email +MfaTypes,mfa_types +MicroF1Score,micro_f1_score +MicroPrecision,micro_precision +MicroRecall,micro_recall +MicrosoftSQLServerCatalogSource,microsoft_sql_server_catalog_source +MicrosoftSQLServerCatalogTarget,microsoft_sql_server_catalog_target +MicrosoftSQLServerSettings,microsoft_sql_server_settings +MicrosoftSqlServerDataProviderSettings,microsoft_sql_server_data_provider_settings +MiddleName,middle_name +MigrateWorkspaceRequest,migrate_workspace_request +MigrateWorkspaceResult,migrate_workspace_result +MigrationAdmin,migration_admin +MigrationAlert,migration_alert +MigrationErrorReason,migration_error_reason +MigrationErrorType,migration_error_type +MigrationProject,migration_project +MigrationProjectArn,migration_project_arn +MigrationProjectCreationTime,migration_project_creation_time +MigrationProjectIdentifier,migration_project_identifier +MigrationProjectName,migration_project_name +MigrationProjects,migration_projects +MigrationSummary,migration_summary +MigrationTask,migration_task +MigrationTaskName,migration_task_name +MigrationTaskSummary,migration_task_summary +MigrationTaskSummaryList,migration_task_summary_list +MigrationType,migration_type +MigrationWorkflowSummary,migration_workflow_summary +Milestone,milestone +MilestoneName,milestone_name +MilestoneNumber,milestone_number +MilestoneSummaries,milestone_summaries +MilestoneSummary,milestone_summary +MillisBehindLatest,millis_behind_latest +MimeType,mime_type +Min,min +MinAbrBitrate,min_abr_bitrate +MinAdjustmentMagnitude,min_adjustment_magnitude +MinAdjustmentStep,min_adjustment_step +MinAllocatedStorage,min_allocated_storage +MinAllowedConfidenceScoreForMerging,min_allowed_confidence_score_for_merging +MinBottomRenditionSize,min_bottom_rendition_size +MinBoundingBoxHeight,min_bounding_box_height +MinBoundingBoxWidth,min_bounding_box_width +MinBufferTime,min_buffer_time +MinBufferTimeSeconds,min_buffer_time_seconds +MinCapacity,min_capacity +MinCapacityUnits,min_capacity_units +MinConfidence,min_confidence +MinCount,min_count +MinCoveragePercentage,min_coverage_percentage +MinDuration,min_duration +MinEbpInterval,min_ebp_interval +MinFinalSegmentLength,min_final_segment_length +MinGwDiversity,min_gw_diversity +MinHealthyPercentage,min_healthy_percentage +MinIInterval,min_i_interval +MinInferenceUnits,min_inference_units +MinInvocationsPerMinute,min_invocations_per_minute +MinIopsPerDbInstance,min_iops_per_db_instance +MinIopsPerGib,min_iops_per_gib +MinLatency,min_latency +MinLength,min_length +MinLuminance,min_luminance +MinMax,min_max +MinMaxGradient,min_max_gradient +MinModelVersion,min_model_version +MinPartitions,min_partitions +MinPauseBetweenCheckpoints,min_pause_between_checkpoints +MinPauseBetweenCheckpointsUpdate,min_pause_between_checkpoints_update +MinRange,min_range +MinResource,min_resource +MinRetentionDays,min_retention_days +MinSegmentConfidence,min_segment_confidence +MinSegmentLength,min_segment_length +MinSelectedChoices,min_selected_choices +MinSize,min_size +MinSlotDurationInHours,min_slot_duration_in_hours +MinStorageBytesPercentage,min_storage_bytes_percentage +MinStorageSize,min_storage_size +MinStorageThroughputPerDbInstance,min_storage_throughput_per_db_instance +MinStorageThroughputPerIops,min_storage_throughput_per_iops +MinTTL,min_ttl +MinTargetCapacity,min_target_capacity +MinTermDurationInDays,min_term_duration_in_days +MinTopRenditionSize,min_top_rendition_size +MinTrafficImpact,min_traffic_impact +MinUnits,min_units +MinUpdatePeriodSeconds,min_update_period_seconds +MinValue,min_value +MinVersion,min_version +MinVideoBitsPerSecond,min_video_bits_per_second +MinWorkers,min_workers +MinimalKeyLength,minimal_key_length +Minimum,minimum +MinimumBitrate,minimum_bitrate +MinimumCapacityUnits,minimum_capacity_units +MinimumCompressionSize,minimum_compression_size +MinimumEngineVersion,minimum_engine_version +MinimumEngineVersionPerAllowedValue,minimum_engine_version_per_allowed_value +MinimumGranularity,minimum_granularity +MinimumHealthyHosts,minimum_healthy_hosts +MinimumHealthyPercent,minimum_healthy_percent +MinimumInstanceCount,minimum_instance_count +MinimumInstanceMetadataServiceVersion,minimum_instance_metadata_service_version +MinimumLabelType,minimum_label_type +MinimumLength,minimum_length +MinimumMembershipPercentage,minimum_membership_percentage +MinimumNormalizedUnitsUsedPerHour,minimum_normalized_units_used_per_hour +MinimumNumTapes,minimum_num_tapes +MinimumNumberOfInstancesUsedPerHour,minimum_number_of_instances_used_per_hour +MinimumNumberOfQueryingUsers,minimum_number_of_querying_users +MinimumPasswordLength,minimum_password_length +MinimumProtocolVersion,minimum_protocol_version +MinimumQueryCount,minimum_query_count +MinimumRGBTolerance,minimum_rgb_tolerance +MinimumRequiredMinorEngineVersion,minimum_required_minor_engine_version +MinimumRetention,minimum_retention +MinimumUnits,minimum_units +MinimumValue,minimum_value +MinimumYUV,minimum_yuv +MinorRevision,minor_revision +MinorVersion,minor_version +MinuteOfHour,minute_of_hour +Minutes,minutes +MissingAuthenticationToken,missing_authentication_token +MissingBlueprints,missing_blueprints +MissingBody,missing_body +MissingCodecPrivateDataException,missing_codec_private_data_exception +MissingCompleteSensorData,missing_complete_sensor_data +MissingComponent,missing_component +MissingContextValues,missing_context_values +MissingCount,missing_count +MissingDataConfiguration,missing_data_configuration +MissingDataConfigurations,missing_data_configurations +MissingDateVisibility,missing_date_visibility +MissingFileCacheConfiguration,missing_file_cache_configuration +MissingFileSystemConfiguration,missing_file_system_configuration +MissingMeta,missing_meta +MissingOnRds,missing_on_rds +MissingParameterException,missing_parameter_exception +MissingParameterValueException,missing_parameter_value_exception +MissingPercentage,missing_percentage +MissingRenderingAttributeException,missing_rendering_attribute_exception +MissingRequiredParameter,missing_required_parameter +MissingRequiredParameterException,missing_required_parameter_exception +MissingSensorData,missing_sensor_data +MissingValues,missing_values +MissingVersionException,missing_version_exception +MissingVolumeConfiguration,missing_volume_configuration +MissingWorkflows,missing_workflows +MissionProfileIdResponse,mission_profile_id_response +MissionProfileListItem,mission_profile_list_item +Mitigation,mitigation +MitigationAction,mitigation_action +MitigationActionIdentifier,mitigation_action_identifier +MitigationActionParams,mitigation_action_params +MitigationName,mitigation_name +Mitigations,mitigations +Mixed,mixed +MixedInstancesPolicy,mixed_instances_policy +MixedMeasureMapping,mixed_measure_mapping +MixedMeasureMappings,mixed_measure_mappings +MlConfigDefinition,ml_config_definition +MlResourceDefinition,ml_resource_definition +MlUserDataEncryption,ml_user_data_encryption +MlUserDataEncryptionMode,ml_user_data_encryption_mode +Mnc,mnc +Mobile,mobile +MobileDeviceAccessMatchedRule,mobile_device_access_matched_rule +MobileDeviceAccessOverride,mobile_device_access_override +MobileDeviceAccessRule,mobile_device_access_rule +MobileDeviceAccessRuleId,mobile_device_access_rule_id +MobilePhoneNumber,mobile_phone_number +MobileSdkRelease,mobile_sdk_release +Mode,mode +ModeBlock,mode_block +Model,model +ModelApprovalStatus,model_approval_status +ModelArn,model_arn +ModelArtifact,model_artifact +ModelArtifacts,model_artifacts +ModelBiasAppSpecification,model_bias_app_specification +ModelBiasBaselineConfig,model_bias_baseline_config +ModelBiasJobInput,model_bias_job_input +ModelBiasJobOutputConfig,model_bias_job_output_config +ModelCacheSetting,model_cache_setting +ModelCard,model_card +ModelCardArn,model_card_arn +ModelCardExportArtifacts,model_card_export_artifacts +ModelCardExportJobArn,model_card_export_job_arn +ModelCardExportJobName,model_card_export_job_name +ModelCardExportJobNameContains,model_card_export_job_name_contains +ModelCardExportJobSummaries,model_card_export_job_summaries +ModelCardExportJobSummary,model_card_export_job_summary +ModelCardExportOutputConfig,model_card_export_output_config +ModelCardName,model_card_name +ModelCardProcessingStatus,model_card_processing_status +ModelCardSecurityConfig,model_card_security_config +ModelCardStatus,model_card_status +ModelCardSummaries,model_card_summaries +ModelCardSummary,model_card_summary +ModelCardVersion,model_card_version +ModelCardVersionSummary,model_card_version_summary +ModelCardVersionSummaryList,model_card_version_summary_list +ModelClientConfig,model_client_config +ModelConfigs,model_configs +ModelConfiguration,model_configuration +ModelCustomizationJobSummary,model_customization_job_summary +ModelDashboardEndpoint,model_dashboard_endpoint +ModelDashboardIndicator,model_dashboard_indicator +ModelDashboardIndicatorAction,model_dashboard_indicator_action +ModelDashboardModel,model_dashboard_model +ModelDashboardModelCard,model_dashboard_model_card +ModelDashboardMonitoringSchedule,model_dashboard_monitoring_schedule +ModelDataDownloadTimeoutInSeconds,model_data_download_timeout_in_seconds +ModelDataQuality,model_data_quality +ModelDataSource,model_data_source +ModelDataUrl,model_data_url +ModelDeployConfig,model_deploy_config +ModelDeployResult,model_deploy_result +ModelDescription,model_description +ModelDigests,model_digests +ModelEndpointDataBlob,model_endpoint_data_blob +ModelError,model_error +ModelErrorException,model_error_exception +ModelExplainabilityAppSpecification,model_explainability_app_specification +ModelExplainabilityBaselineConfig,model_explainability_baseline_config +ModelExplainabilityJobInput,model_explainability_job_input +ModelExplainabilityJobOutputConfig,model_explainability_job_output_config +ModelHandle,model_handle +ModelId,model_id +ModelInfrastructureConfig,model_infrastructure_config +ModelInput,model_input +ModelInputConfiguration,model_input_configuration +ModelInsights,model_insights +ModelIntrospectionSchema,model_introspection_schema +ModelKmsKeyId,model_kms_key_id +ModelLatency,model_latency +ModelLatencyThreshold,model_latency_threshold +ModelLatencyThresholds,model_latency_thresholds +ModelManifestSummary,model_manifest_summary +ModelMetadata,model_metadata +ModelMetadataFilter,model_metadata_filter +ModelMetadataSearchExpression,model_metadata_search_expression +ModelMetadataSummaries,model_metadata_summaries +ModelMetadataSummary,model_metadata_summary +ModelMetrics,model_metrics +ModelName,model_name +ModelNameBeginsWith,model_name_begins_with +ModelNameContains,model_name_contains +ModelNameEquals,model_name_equals +ModelNotReadyException,model_not_ready_exception +ModelOutputConfiguration,model_output_configuration +ModelPackage,model_package +ModelPackageArn,model_package_arn +ModelPackageArnList,model_package_arn_list +ModelPackageContainerDefinition,model_package_container_definition +ModelPackageDescription,model_package_description +ModelPackageGroup,model_package_group +ModelPackageGroupArn,model_package_group_arn +ModelPackageGroupDescription,model_package_group_description +ModelPackageGroupName,model_package_group_name +ModelPackageGroupStatus,model_package_group_status +ModelPackageGroupSummary,model_package_group_summary +ModelPackageGroupSummaryList,model_package_group_summary_list +ModelPackageName,model_package_name +ModelPackageStatus,model_package_status +ModelPackageStatusDetails,model_package_status_details +ModelPackageStatusItem,model_package_status_item +ModelPackageSummaries,model_package_summaries +ModelPackageSummary,model_package_summary +ModelPackageSummaryList,model_package_summary_list +ModelPackageType,model_package_type +ModelPackageValidationProfile,model_package_validation_profile +ModelPackageValidationSpecification,model_package_validation_specification +ModelPackageVersion,model_package_version +ModelPackageVersionArn,model_package_version_arn +ModelPackageVersionArnEquals,model_package_version_arn_equals +ModelPackagingConfiguration,model_packaging_configuration +ModelPackagingDescription,model_packaging_description +ModelPackagingJobDescription,model_packaging_job_description +ModelPackagingJobMetadata,model_packaging_job_metadata +ModelPackagingJobs,model_packaging_jobs +ModelPackagingMethod,model_packaging_method +ModelPackagingOutputDetails,model_packaging_output_details +ModelPerformance,model_performance +ModelPolicy,model_policy +ModelQuality,model_quality +ModelQualityAppSpecification,model_quality_app_specification +ModelQualityBaselineConfig,model_quality_baseline_config +ModelQualityJobInput,model_quality_job_input +ModelQualityJobOutputConfig,model_quality_job_output_config +ModelRegisterSettings,model_register_settings +ModelScores,model_scores +ModelSelectionExpression,model_selection_expression +ModelSettings,model_settings +ModelSetupTime,model_setup_time +ModelSignature,model_signature +ModelStats,model_stats +ModelStatus,model_status +ModelStepMetadata,model_step_metadata +ModelStreamError,model_stream_error +ModelStreamErrorException,model_stream_error_exception +ModelSummaries,model_summaries +ModelSummary,model_summary +ModelTimeoutException,model_timeout_exception +ModelType,model_type +ModelVariantActions,model_variant_actions +ModelVariantConfig,model_variant_config +ModelVariantConfigSummary,model_variant_config_summary +ModelVariants,model_variants +ModelVersion,model_version +ModelVersionActivatedAt,model_version_activated_at +ModelVersionArn,model_version_arn +ModelVersionDetail,model_version_detail +ModelVersionEvaluation,model_version_evaluation +ModelVersionSummaries,model_version_summaries +ModelVersionSummary,model_version_summary +Models,models +ModerationLabel,moderation_label +ModerationLabels,moderation_labels +ModerationModelVersion,moderation_model_version +Moderator,moderator +ModeratorArns,moderator_arns +ModificationResults,modification_results +ModificationState,modification_state +ModificationStates,modification_states +ModificationTime,modification_time +Modifications,modifications +ModifiedAfter,modified_after +ModifiedAt,modified_at +ModifiedBefore,modified_before +ModifiedDate,modified_date +ModifiedRange,modified_range +ModifiedSinceConstraint,modified_since_constraint +ModifiedTimeAfter,modified_time_after +ModifiedTimeBefore,modified_time_before +ModifiedTimestamp,modified_timestamp +ModifierPercentage,modifier_percentage +ModifyAccountRequest,modify_account_request +ModifyActivityStreamRequest,modify_activity_stream_request +ModifyActivityStreamResponse,modify_activity_stream_response +ModifyAddressAttributeRequest,modify_address_attribute_request +ModifyAddressAttributeResult,modify_address_attribute_result +ModifyAquaInputMessage,modify_aqua_input_message +ModifyAquaOutputMessage,modify_aqua_output_message +ModifyAuthenticationProfileMessage,modify_authentication_profile_message +ModifyAuthenticationProfileResult,modify_authentication_profile_result +ModifyAvailabilityZoneGroupRequest,modify_availability_zone_group_request +ModifyAvailabilityZoneGroupResult,modify_availability_zone_group_result +ModifyBackupAttributesRequest,modify_backup_attributes_request +ModifyBackupAttributesResponse,modify_backup_attributes_response +ModifyCacheClusterMessage,modify_cache_cluster_message +ModifyCacheClusterResult,modify_cache_cluster_result +ModifyCacheParameterGroupMessage,modify_cache_parameter_group_message +ModifyCacheSubnetGroupMessage,modify_cache_subnet_group_message +ModifyCacheSubnetGroupResult,modify_cache_subnet_group_result +ModifyCapacityReservationFleetRequest,modify_capacity_reservation_fleet_request +ModifyCapacityReservationFleetResult,modify_capacity_reservation_fleet_result +ModifyCapacityReservationRequest,modify_capacity_reservation_request +ModifyCapacityReservationResult,modify_capacity_reservation_result +ModifyCertificateBasedAuthPropertiesRequest,modify_certificate_based_auth_properties_request +ModifyCertificatesMessage,modify_certificates_message +ModifyCertificatesResult,modify_certificates_result +ModifyClientPropertiesRequest,modify_client_properties_request +ModifyClientVpnEndpointRequest,modify_client_vpn_endpoint_request +ModifyClientVpnEndpointResult,modify_client_vpn_endpoint_result +ModifyClusterDbRevisionMessage,modify_cluster_db_revision_message +ModifyClusterDbRevisionResult,modify_cluster_db_revision_result +ModifyClusterIamRolesMessage,modify_cluster_iam_roles_message +ModifyClusterIamRolesResult,modify_cluster_iam_roles_result +ModifyClusterInput,modify_cluster_input +ModifyClusterMaintenanceMessage,modify_cluster_maintenance_message +ModifyClusterMaintenanceResult,modify_cluster_maintenance_result +ModifyClusterMessage,modify_cluster_message +ModifyClusterOutput,modify_cluster_output +ModifyClusterParameterGroupMessage,modify_cluster_parameter_group_message +ModifyClusterRequest,modify_cluster_request +ModifyClusterResponse,modify_cluster_response +ModifyClusterResult,modify_cluster_result +ModifyClusterSnapshotMessage,modify_cluster_snapshot_message +ModifyClusterSnapshotResult,modify_cluster_snapshot_result +ModifyClusterSnapshotScheduleMessage,modify_cluster_snapshot_schedule_message +ModifyClusterSubnetGroupMessage,modify_cluster_subnet_group_message +ModifyClusterSubnetGroupResult,modify_cluster_subnet_group_result +ModifyConversionConfigurationMessage,modify_conversion_configuration_message +ModifyConversionConfigurationResponse,modify_conversion_configuration_response +ModifyCurrentDBClusterCapacityMessage,modify_current_db_cluster_capacity_message +ModifyCustomDBEngineVersionMessage,modify_custom_db_engine_version_message +ModifyCustomDomainAssociationMessage,modify_custom_domain_association_message +ModifyCustomDomainAssociationResult,modify_custom_domain_association_result +ModifyDBClusterEndpointMessage,modify_db_cluster_endpoint_message +ModifyDBClusterEndpointOutput,modify_db_cluster_endpoint_output +ModifyDBClusterMessage,modify_db_cluster_message +ModifyDBClusterParameterGroupMessage,modify_db_cluster_parameter_group_message +ModifyDBClusterResult,modify_db_cluster_result +ModifyDBClusterSnapshotAttributeMessage,modify_db_cluster_snapshot_attribute_message +ModifyDBClusterSnapshotAttributeResult,modify_db_cluster_snapshot_attribute_result +ModifyDBInstanceMessage,modify_db_instance_message +ModifyDBInstanceResult,modify_db_instance_result +ModifyDBParameterGroupMessage,modify_db_parameter_group_message +ModifyDBProxyEndpointRequest,modify_db_proxy_endpoint_request +ModifyDBProxyEndpointResponse,modify_db_proxy_endpoint_response +ModifyDBProxyRequest,modify_db_proxy_request +ModifyDBProxyResponse,modify_db_proxy_response +ModifyDBProxyTargetGroupRequest,modify_db_proxy_target_group_request +ModifyDBProxyTargetGroupResponse,modify_db_proxy_target_group_response +ModifyDBSnapshotAttributeMessage,modify_db_snapshot_attribute_message +ModifyDBSnapshotAttributeResult,modify_db_snapshot_attribute_result +ModifyDBSnapshotMessage,modify_db_snapshot_message +ModifyDBSnapshotResult,modify_db_snapshot_result +ModifyDBSubnetGroupMessage,modify_db_subnet_group_message +ModifyDBSubnetGroupResult,modify_db_subnet_group_result +ModifyDataProviderMessage,modify_data_provider_message +ModifyDataProviderResponse,modify_data_provider_response +ModifyDefaultCreditSpecificationRequest,modify_default_credit_specification_request +ModifyDefaultCreditSpecificationResult,modify_default_credit_specification_result +ModifyDocumentPermissionRequest,modify_document_permission_request +ModifyEbsDefaultKmsKeyIdRequest,modify_ebs_default_kms_key_id_request +ModifyEbsDefaultKmsKeyIdResult,modify_ebs_default_kms_key_id_result +ModifyEndpointAccessMessage,modify_endpoint_access_message +ModifyEndpointMessage,modify_endpoint_message +ModifyEndpointResponse,modify_endpoint_response +ModifyEventSubscriptionMessage,modify_event_subscription_message +ModifyEventSubscriptionResponse,modify_event_subscription_response +ModifyEventSubscriptionResult,modify_event_subscription_result +ModifyFleetRequest,modify_fleet_request +ModifyFleetResult,modify_fleet_result +ModifyFpgaImageAttributeRequest,modify_fpga_image_attribute_request +ModifyFpgaImageAttributeResult,modify_fpga_image_attribute_result +ModifyGlobalClusterMessage,modify_global_cluster_message +ModifyGlobalClusterResult,modify_global_cluster_result +ModifyGlobalReplicationGroupMessage,modify_global_replication_group_message +ModifyGlobalReplicationGroupResult,modify_global_replication_group_result +ModifyHapgRequest,modify_hapg_request +ModifyHapgResponse,modify_hapg_response +ModifyHostsRequest,modify_hosts_request +ModifyHostsResult,modify_hosts_result +ModifyHsmRequest,modify_hsm_request +ModifyHsmResponse,modify_hsm_response +ModifyIdFormatRequest,modify_id_format_request +ModifyIdentityIdFormatRequest,modify_identity_id_format_request +ModifyImageAttributeRequest,modify_image_attribute_request +ModifyInstanceAttributeRequest,modify_instance_attribute_request +ModifyInstanceCapacityReservationAttributesRequest,modify_instance_capacity_reservation_attributes_request +ModifyInstanceCapacityReservationAttributesResult,modify_instance_capacity_reservation_attributes_result +ModifyInstanceCreditSpecificationRequest,modify_instance_credit_specification_request +ModifyInstanceCreditSpecificationResult,modify_instance_credit_specification_result +ModifyInstanceEventStartTimeRequest,modify_instance_event_start_time_request +ModifyInstanceEventStartTimeResult,modify_instance_event_start_time_result +ModifyInstanceEventWindowRequest,modify_instance_event_window_request +ModifyInstanceEventWindowResult,modify_instance_event_window_result +ModifyInstanceFleetInput,modify_instance_fleet_input +ModifyInstanceGroupsInput,modify_instance_groups_input +ModifyInstanceMaintenanceOptionsRequest,modify_instance_maintenance_options_request +ModifyInstanceMaintenanceOptionsResult,modify_instance_maintenance_options_result +ModifyInstanceMetadataOptionsRequest,modify_instance_metadata_options_request +ModifyInstanceMetadataOptionsResult,modify_instance_metadata_options_result +ModifyInstancePlacementRequest,modify_instance_placement_request +ModifyInstancePlacementResult,modify_instance_placement_result +ModifyInstanceProfileMessage,modify_instance_profile_message +ModifyInstanceProfileResponse,modify_instance_profile_response +ModifyIpamPoolRequest,modify_ipam_pool_request +ModifyIpamPoolResult,modify_ipam_pool_result +ModifyIpamRequest,modify_ipam_request +ModifyIpamResourceCidrRequest,modify_ipam_resource_cidr_request +ModifyIpamResourceCidrResult,modify_ipam_resource_cidr_result +ModifyIpamResourceDiscoveryRequest,modify_ipam_resource_discovery_request +ModifyIpamResourceDiscoveryResult,modify_ipam_resource_discovery_result +ModifyIpamResult,modify_ipam_result +ModifyIpamScopeRequest,modify_ipam_scope_request +ModifyIpamScopeResult,modify_ipam_scope_result +ModifyLaunchTemplateRequest,modify_launch_template_request +ModifyLaunchTemplateResult,modify_launch_template_result +ModifyListenerInput,modify_listener_input +ModifyListenerOutput,modify_listener_output +ModifyLoadBalancerAttributesInput,modify_load_balancer_attributes_input +ModifyLoadBalancerAttributesOutput,modify_load_balancer_attributes_output +ModifyLocalGatewayRouteRequest,modify_local_gateway_route_request +ModifyLocalGatewayRouteResult,modify_local_gateway_route_result +ModifyLunaClientRequest,modify_luna_client_request +ModifyLunaClientResponse,modify_luna_client_response +ModifyManagedPrefixListRequest,modify_managed_prefix_list_request +ModifyManagedPrefixListResult,modify_managed_prefix_list_result +ModifyMigrationProjectMessage,modify_migration_project_message +ModifyMigrationProjectResponse,modify_migration_project_response +ModifyMountTargetSecurityGroupsRequest,modify_mount_target_security_groups_request +ModifyNetworkInterfaceAttributeRequest,modify_network_interface_attribute_request +ModifyOptionGroupMessage,modify_option_group_message +ModifyOptionGroupResult,modify_option_group_result +ModifyPrivateDnsNameOptionsRequest,modify_private_dns_name_options_request +ModifyPrivateDnsNameOptionsResult,modify_private_dns_name_options_result +ModifyRecommendationDetail,modify_recommendation_detail +ModifyReplicationConfigMessage,modify_replication_config_message +ModifyReplicationConfigResponse,modify_replication_config_response +ModifyReplicationGroupMessage,modify_replication_group_message +ModifyReplicationGroupResult,modify_replication_group_result +ModifyReplicationGroupShardConfigurationMessage,modify_replication_group_shard_configuration_message +ModifyReplicationGroupShardConfigurationResult,modify_replication_group_shard_configuration_result +ModifyReplicationInstanceMessage,modify_replication_instance_message +ModifyReplicationInstanceResponse,modify_replication_instance_response +ModifyReplicationSubnetGroupMessage,modify_replication_subnet_group_message +ModifyReplicationSubnetGroupResponse,modify_replication_subnet_group_response +ModifyReplicationTaskMessage,modify_replication_task_message +ModifyReplicationTaskResponse,modify_replication_task_response +ModifyReportDefinitionRequest,modify_report_definition_request +ModifyReservedInstancesRequest,modify_reserved_instances_request +ModifyReservedInstancesResult,modify_reserved_instances_result +ModifyRuleInput,modify_rule_input +ModifyRuleOutput,modify_rule_output +ModifySamlPropertiesRequest,modify_saml_properties_request +ModifyScheduledActionMessage,modify_scheduled_action_message +ModifySecurityGroupRulesRequest,modify_security_group_rules_request +ModifySecurityGroupRulesResult,modify_security_group_rules_result +ModifySelfservicePermissionsRequest,modify_selfservice_permissions_request +ModifySnapshotAttributeRequest,modify_snapshot_attribute_request +ModifySnapshotCopyRetentionPeriodMessage,modify_snapshot_copy_retention_period_message +ModifySnapshotCopyRetentionPeriodResult,modify_snapshot_copy_retention_period_result +ModifySnapshotScheduleMessage,modify_snapshot_schedule_message +ModifySnapshotTierRequest,modify_snapshot_tier_request +ModifySnapshotTierResult,modify_snapshot_tier_result +ModifySpotFleetRequestRequest,modify_spot_fleet_request_request +ModifySpotFleetRequestResponse,modify_spot_fleet_request_response +ModifyStatus,modify_status +ModifySubnetAttributeRequest,modify_subnet_attribute_request +ModifyTargetGroupAttributesInput,modify_target_group_attributes_input +ModifyTargetGroupAttributesOutput,modify_target_group_attributes_output +ModifyTargetGroupInput,modify_target_group_input +ModifyTargetGroupOutput,modify_target_group_output +ModifyTrafficMirrorFilterNetworkServicesRequest,modify_traffic_mirror_filter_network_services_request +ModifyTrafficMirrorFilterNetworkServicesResult,modify_traffic_mirror_filter_network_services_result +ModifyTrafficMirrorFilterRuleRequest,modify_traffic_mirror_filter_rule_request +ModifyTrafficMirrorFilterRuleResult,modify_traffic_mirror_filter_rule_result +ModifyTrafficMirrorSessionRequest,modify_traffic_mirror_session_request +ModifyTrafficMirrorSessionResult,modify_traffic_mirror_session_result +ModifyTransitGatewayOptions,modify_transit_gateway_options +ModifyTransitGatewayPrefixListReferenceRequest,modify_transit_gateway_prefix_list_reference_request +ModifyTransitGatewayPrefixListReferenceResult,modify_transit_gateway_prefix_list_reference_result +ModifyTransitGatewayRequest,modify_transit_gateway_request +ModifyTransitGatewayResult,modify_transit_gateway_result +ModifyTransitGatewayVpcAttachmentRequest,modify_transit_gateway_vpc_attachment_request +ModifyTransitGatewayVpcAttachmentRequestOptions,modify_transit_gateway_vpc_attachment_request_options +ModifyTransitGatewayVpcAttachmentResult,modify_transit_gateway_vpc_attachment_result +ModifyUsageLimitMessage,modify_usage_limit_message +ModifyUserGroupMessage,modify_user_group_message +ModifyUserMessage,modify_user_message +ModifyVerifiedAccessEndpointEniOptions,modify_verified_access_endpoint_eni_options +ModifyVerifiedAccessEndpointLoadBalancerOptions,modify_verified_access_endpoint_load_balancer_options +ModifyVerifiedAccessEndpointPolicyRequest,modify_verified_access_endpoint_policy_request +ModifyVerifiedAccessEndpointPolicyResult,modify_verified_access_endpoint_policy_result +ModifyVerifiedAccessEndpointRequest,modify_verified_access_endpoint_request +ModifyVerifiedAccessEndpointResult,modify_verified_access_endpoint_result +ModifyVerifiedAccessGroupPolicyRequest,modify_verified_access_group_policy_request +ModifyVerifiedAccessGroupPolicyResult,modify_verified_access_group_policy_result +ModifyVerifiedAccessGroupRequest,modify_verified_access_group_request +ModifyVerifiedAccessGroupResult,modify_verified_access_group_result +ModifyVerifiedAccessInstanceLoggingConfigurationRequest,modify_verified_access_instance_logging_configuration_request +ModifyVerifiedAccessInstanceLoggingConfigurationResult,modify_verified_access_instance_logging_configuration_result +ModifyVerifiedAccessInstanceRequest,modify_verified_access_instance_request +ModifyVerifiedAccessInstanceResult,modify_verified_access_instance_result +ModifyVerifiedAccessTrustProviderOidcOptions,modify_verified_access_trust_provider_oidc_options +ModifyVerifiedAccessTrustProviderRequest,modify_verified_access_trust_provider_request +ModifyVerifiedAccessTrustProviderResult,modify_verified_access_trust_provider_result +ModifyVolumeAttributeRequest,modify_volume_attribute_request +ModifyVolumeRequest,modify_volume_request +ModifyVolumeResult,modify_volume_result +ModifyVpcAttributeRequest,modify_vpc_attribute_request +ModifyVpcEndpointConnectionNotificationRequest,modify_vpc_endpoint_connection_notification_request +ModifyVpcEndpointConnectionNotificationResult,modify_vpc_endpoint_connection_notification_result +ModifyVpcEndpointRequest,modify_vpc_endpoint_request +ModifyVpcEndpointResult,modify_vpc_endpoint_result +ModifyVpcEndpointServiceConfigurationRequest,modify_vpc_endpoint_service_configuration_request +ModifyVpcEndpointServiceConfigurationResult,modify_vpc_endpoint_service_configuration_result +ModifyVpcEndpointServicePayerResponsibilityRequest,modify_vpc_endpoint_service_payer_responsibility_request +ModifyVpcEndpointServicePayerResponsibilityResult,modify_vpc_endpoint_service_payer_responsibility_result +ModifyVpcEndpointServicePermissionsRequest,modify_vpc_endpoint_service_permissions_request +ModifyVpcEndpointServicePermissionsResult,modify_vpc_endpoint_service_permissions_result +ModifyVpcPeeringConnectionOptionsRequest,modify_vpc_peering_connection_options_request +ModifyVpcPeeringConnectionOptionsResult,modify_vpc_peering_connection_options_result +ModifyVpcTenancyRequest,modify_vpc_tenancy_request +ModifyVpcTenancyResult,modify_vpc_tenancy_result +ModifyVpnConnectionOptionsRequest,modify_vpn_connection_options_request +ModifyVpnConnectionOptionsResult,modify_vpn_connection_options_result +ModifyVpnConnectionRequest,modify_vpn_connection_request +ModifyVpnConnectionResult,modify_vpn_connection_result +ModifyVpnTunnelCertificateRequest,modify_vpn_tunnel_certificate_request +ModifyVpnTunnelCertificateResult,modify_vpn_tunnel_certificate_result +ModifyVpnTunnelOptionsRequest,modify_vpn_tunnel_options_request +ModifyVpnTunnelOptionsResult,modify_vpn_tunnel_options_result +ModifyVpnTunnelOptionsSpecification,modify_vpn_tunnel_options_specification +ModifyWorkspaceAccessPropertiesRequest,modify_workspace_access_properties_request +ModifyWorkspaceCreationPropertiesRequest,modify_workspace_creation_properties_request +ModifyWorkspacePropertiesRequest,modify_workspace_properties_request +ModifyWorkspaceStateRequest,modify_workspace_state_request +ModifyingProcess,modifying_process +ModuleFilePath,module_file_path +ModuleInfo,module_info +ModuleLoggingConfiguration,module_logging_configuration +ModuleLoggingConfigurationInput,module_logging_configuration_input +ModuleName,module_name +ModuleSha256,module_sha256 +Monday,monday +MonetaryAmount,monetary_amount +MongoDBTarget,mongo_db_target +MongoDBTargets,mongo_db_targets +MongoDbDataProviderSettings,mongo_db_data_provider_settings +MongoDbSettings,mongo_db_settings +Monitor,monitor +MonitorArn,monitor_arn +MonitorArnList,monitor_arn_list +MonitorConfig,monitor_config +MonitorContactRequest,monitor_contact_request +MonitorContactResponse,monitor_contact_response +MonitorDataSource,monitor_data_source +MonitorDimension,monitor_dimension +MonitorErrorDetails,monitor_error_details +MonitorInfo,monitor_info +MonitorInstancesRequest,monitor_instances_request +MonitorInstancesResult,monitor_instances_result +MonitorName,monitor_name +MonitorSpecification,monitor_specification +MonitorStatus,monitor_status +MonitorSummary,monitor_summary +MonitorType,monitor_type +Monitored,monitored +MonitoredResourceARN,monitored_resource_arn +MonitoredResourceIdentifier,monitored_resource_identifier +MonitoredResourceIdentifiers,monitored_resource_identifiers +MonitoredResourceInfo,monitored_resource_info +MonitoredResourceName,monitored_resource_name +Monitoring,monitoring +MonitoringAlertActions,monitoring_alert_actions +MonitoringAlertHistory,monitoring_alert_history +MonitoringAlertHistorySummary,monitoring_alert_history_summary +MonitoringAlertName,monitoring_alert_name +MonitoringAlertSummaries,monitoring_alert_summaries +MonitoringAlertSummary,monitoring_alert_summary +MonitoringAppSpecification,monitoring_app_specification +MonitoringBaselineConfig,monitoring_baseline_config +MonitoringClusterConfig,monitoring_cluster_config +MonitoringConfiguration,monitoring_configuration +MonitoringConfigurationDescription,monitoring_configuration_description +MonitoringConfigurationUpdate,monitoring_configuration_update +MonitoringConstraintsResource,monitoring_constraints_resource +MonitoringCsvDatasetFormat,monitoring_csv_dataset_format +MonitoringDatasetFormat,monitoring_dataset_format +MonitoringExecutionStatus,monitoring_execution_status +MonitoringExecutionSummaries,monitoring_execution_summaries +MonitoringExecutionSummary,monitoring_execution_summary +MonitoringGroundTruthS3Input,monitoring_ground_truth_s3_input +MonitoringInput,monitoring_input +MonitoringInputs,monitoring_inputs +MonitoringInterval,monitoring_interval +MonitoringJobDefinition,monitoring_job_definition +MonitoringJobDefinitionArn,monitoring_job_definition_arn +MonitoringJobDefinitionName,monitoring_job_definition_name +MonitoringJobDefinitionSummary,monitoring_job_definition_summary +MonitoringJsonDatasetFormat,monitoring_json_dataset_format +MonitoringNetworkConfig,monitoring_network_config +MonitoringOutput,monitoring_output +MonitoringOutputConfig,monitoring_output_config +MonitoringOutputs,monitoring_outputs +MonitoringResources,monitoring_resources +MonitoringRoleArn,monitoring_role_arn +MonitoringS3Output,monitoring_s3_output +MonitoringSchedule,monitoring_schedule +MonitoringScheduleArn,monitoring_schedule_arn +MonitoringScheduleConfig,monitoring_schedule_config +MonitoringScheduleName,monitoring_schedule_name +MonitoringScheduleStatus,monitoring_schedule_status +MonitoringScheduleSummaries,monitoring_schedule_summaries +MonitoringScheduleSummary,monitoring_schedule_summary +MonitoringSchedules,monitoring_schedules +MonitoringStatisticsResource,monitoring_statistics_resource +MonitoringStoppingCondition,monitoring_stopping_condition +MonitoringSubscription,monitoring_subscription +MonitoringSubscriptionAlreadyExists,monitoring_subscription_already_exists +MonitoringTimeInMinutes,monitoring_time_in_minutes +MonitoringType,monitoring_type +MonitoringTypeEquals,monitoring_type_equals +Monitors,monitors +MonotonicValues,monotonic_values +Monotonicity,monotonicity +Month,month +MonthlyCost,monthly_cost +MonthlyLeasingPrice,monthly_leasing_price +MonthlyLimit,monthly_limit +MonthlySchedule,monthly_schedule +MonthlySetting,monthly_setting +MonthlySettings,monthly_settings +MonthlyTransfer,monthly_transfer +MoovPlacement,moov_placement +MostRecent,most_recent +MotionGraphicsActivateScheduleActionSettings,motion_graphics_activate_schedule_action_settings +MotionGraphicsConfiguration,motion_graphics_configuration +MotionGraphicsImageActivateSettings,motion_graphics_image_activate_settings +MotionGraphicsImageDeactivateSettings,motion_graphics_image_deactivate_settings +MotionGraphicsInsertion,motion_graphics_insertion +MotionGraphicsSettings,motion_graphics_settings +MotionImageInserter,motion_image_inserter +MotionImageInsertionFramerate,motion_image_insertion_framerate +MotionImageInsertionOffset,motion_image_insertion_offset +MountName,mount_name +MountOptions,mount_options +MountPath,mount_path +MountPoint,mount_point +MountPoints,mount_points +MountSource,mount_source +MountTarget,mount_target +MountTargetConflict,mount_target_conflict +MountTargetDescription,mount_target_description +MountTargetId,mount_target_id +MountTargetNotFound,mount_target_not_found +MountTargets,mount_targets +MouthOpen,mouth_open +MovSettings,mov_settings +MoveAccountRequest,move_account_request +MoveAddressToVpcRequest,move_address_to_vpc_request +MoveAddressToVpcResult,move_address_to_vpc_result +MoveByoipCidrToIpamRequest,move_byoip_cidr_to_ipam_request +MoveByoipCidrToIpamResult,move_byoip_cidr_to_ipam_result +MoveReplicationTaskMessage,move_replication_task_message +MoveReplicationTaskResponse,move_replication_task_response +MoveStatus,move_status +MoveToColdStorageAfterDays,move_to_cold_storage_after_days +MoveToColdStorageAt,move_to_cold_storage_at +MoveToVersionId,move_to_version_id +MoverSize,mover_size +MovingAddressStatus,moving_address_status +MovingAddressStatuses,moving_address_statuses +Mp2Settings,mp2_settings +Mp3Settings,mp3_settings +Mp4MajorBrand,mp4_major_brand +Mp4Settings,mp4_settings +MpdLocation,mpd_location +MpdManifestBandwidthType,mpd_manifest_bandwidth_type +MpdProfile,mpd_profile +MpdSettings,mpd_settings +Mpeg2FilterSettings,mpeg2_filter_settings +Mpeg2FourCCControl,mpeg2_four_cc_control +Mpeg2Settings,mpeg2_settings +MqttContext,mqtt_context +MqttHeaders,mqtt_headers +Mrap,mrap +MsSmoothAdditionalManifest,ms_smooth_additional_manifest +MsSmoothEncryptionSettings,ms_smooth_encryption_settings +MsSmoothGroupSettings,ms_smooth_group_settings +MsSmoothOutputSettings,ms_smooth_output_settings +MsrcNumber,msrc_number +MsrcSeverity,msrc_severity +MssEncryption,mss_encryption +MssManifest,mss_manifest +MssManifests,mss_manifests +MssPackage,mss_package +Mtime,mtime +MultiAZ,multi_az +MultiAZCapable,multi_az_capable +MultiAZEnabled,multi_az_enabled +MultiAZWithStandbyEnabled,multi_az_with_standby_enabled +MultiAttachEnabled,multi_attach_enabled +MultiAz,multi_az +MultiCondition,multi_condition +MultiConditionalBranch,multi_conditional_branch +MultiConditionalSplitActivity,multi_conditional_split_activity +MultiLayerStorage,multi_layer_storage +MultiLine,multi_line +MultiLineStartPattern,multi_line_start_pattern +MultiMeasureAttributeMapping,multi_measure_attribute_mapping +MultiMeasureAttributeMappings,multi_measure_attribute_mappings +MultiMeasureMappings,multi_measure_mappings +MultiModelConfig,multi_model_config +MultiPolygonGeometryInput,multi_polygon_geometry_input +MultiRegion,multi_region +MultiRegionAccessPointDetails,multi_region_access_point_details +MultiRegionAccessPointPolicyDocument,multi_region_access_point_policy_document +MultiRegionAccessPointRegionalResponse,multi_region_access_point_regional_response +MultiRegionAccessPointReport,multi_region_access_point_report +MultiRegionAccessPointRoute,multi_region_access_point_route +MultiRegionAccessPointsAsyncResponse,multi_region_access_points_async_response +MultiRegionConfiguration,multi_region_configuration +MultiRegionEnabled,multi_region_enabled +MultiRegionKey,multi_region_key +MultiRegionKeyType,multi_region_key_type +MultiValueAnswer,multi_value_answer +Multicast,multicast +MulticastDeviceStatus,multicast_device_status +MulticastDomainAssociations,multicast_domain_associations +MulticastFrameInfo,multicast_frame_info +MulticastGroup,multicast_group +MulticastGroupByFuotaTask,multicast_group_by_fuota_task +MulticastGroupId,multicast_group_id +MulticastGroupList,multicast_group_list +MulticastGroups,multicast_groups +MulticastGroupsToAdd,multicast_groups_to_add +MulticastGroupsToRemove,multicast_groups_to_remove +MulticastIp,multicast_ip +MulticastSupport,multicast_support +MulticastWirelessMetadata,multicast_wireless_metadata +Multiline,multiline +MultipartReadSetUploadListItem,multipart_read_set_upload_list_item +MultipartUpload,multipart_upload +MultipartUploadId,multipart_upload_id +MultipleConflictResolutionEntriesException,multiple_conflict_resolution_entries_exception +MultipleIamArnsProvidedException,multiple_iam_arns_provided_exception +MultipleOperatingModes,multiple_operating_modes +MultipleRepositoriesInPullRequestException,multiple_repositories_in_pull_request_exception +MultipleValuesSetting,multiple_values_setting +Multiplex,multiplex +MultiplexGroupSettings,multiplex_group_settings +MultiplexId,multiplex_id +MultiplexIds,multiplex_ids +MultiplexMediaConnectOutputDestinationSettings,multiplex_media_connect_output_destination_settings +MultiplexOutputDestination,multiplex_output_destination +MultiplexOutputSettings,multiplex_output_settings +MultiplexProgram,multiplex_program +MultiplexProgramChannelDestinationSettings,multiplex_program_channel_destination_settings +MultiplexProgramPacketIdentifiersMap,multiplex_program_packet_identifiers_map +MultiplexProgramPipelineDetail,multiplex_program_pipeline_detail +MultiplexProgramServiceDescriptor,multiplex_program_service_descriptor +MultiplexProgramSettings,multiplex_program_settings +MultiplexProgramSummary,multiplex_program_summary +MultiplexPrograms,multiplex_programs +MultiplexSettings,multiplex_settings +MultiplexSettingsSummary,multiplex_settings_summary +MultiplexStatmuxVideoSettings,multiplex_statmux_video_settings +MultiplexSummary,multiplex_summary +MultiplexVideoSettings,multiplex_video_settings +Multiplexes,multiplexes +Municipality,municipality +MustBeOwnedByCaller,must_be_owned_by_caller +MustBeRequestable,must_be_requestable +Mustache,mustache +Mutable,mutable +MutableClusterInfo,mutable_cluster_info +MutationActionSetStateParameter,mutation_action_set_state_parameter +MutationProtection,mutation_protection +MutualAuthentication,mutual_authentication +MutualTlsAuthentication,mutual_tls_authentication +MutualTlsAuthenticationInput,mutual_tls_authentication_input +MutuallyExclusiveParameters,mutually_exclusive_parameters +MuxType,mux_type +MxfSettings,mxf_settings +MxfXavcProfileSettings,mxf_xavc_profile_settings +MySQLCatalogSource,my_sql_catalog_source +MySQLCatalogTarget,my_sql_catalog_target +MySQLSettings,my_sql_settings +MySqlDataProviderSettings,my_sql_data_provider_settings +MySqlParameters,my_sql_parameters +N,n +NE,ne +NFS,nfs +NFSDataRepositoryConfiguration,nfs_data_repository_configuration +NFSFileShareDefaults,nfs_file_share_defaults +NFSFileShareInfo,nfs_file_share_info +NFSFileShareInfoList,nfs_file_share_info_list +NFSOnDeviceService,nfs_on_device_service +NFSOnDeviceServiceConfiguration,nfs_on_device_service_configuration +NLBResource,nlb_resource +NS,ns +Name,name +NameAlreadyExistsException,name_already_exists_exception +NameAssigner,name_assigner +NameAvailabilityException,name_availability_exception +NameContains,name_contains +NameFilter,name_filter +NameInUseException,name_in_use_exception +NameLengthExceededException,name_length_exceeded_exception +NameModifier,name_modifier +NameNodes,name_nodes +NamePrefix,name_prefix +NamePrefixUpdate,name_prefix_update +NameQualifier,name_qualifier +NameServers,name_servers +NameServersUpdateState,name_servers_update_state +NameStartsWith,name_starts_with +NameTag,name_tag +NameUpdate,name_update +NameValuePair,name_value_pair +NamedEntities,named_entities +NamedEntityDefinition,named_entity_definition +NamedEntityDefinitionMetric,named_entity_definition_metric +NamedQueries,named_queries +NamedQuery,named_query +NamedQueryId,named_query_id +NamedQueryIds,named_query_ids +Names,names +Nameserver,nameserver +Nameservers,nameservers +Namespace,namespace +NamespaceAlreadyExists,namespace_already_exists +NamespaceError,namespace_error +NamespaceFilter,namespace_filter +NamespaceId,namespace_id +NamespaceInfoV2,namespace_info_v2 +NamespaceName,namespace_name +NamespaceNotFound,namespace_not_found +NamespaceNotFoundException,namespace_not_found_exception +NamespacePid,namespace_pid +NamespaceProperties,namespace_properties +NamespaceSummary,namespace_summary +NamespaceType,namespace_type +Namespaces,namespaces +Narrative,narrative +NatGateway,nat_gateway +NatGatewayAddress,nat_gateway_address +NatGatewayAddresses,nat_gateway_addresses +NatGatewayId,nat_gateway_id +NatGatewayIds,nat_gateway_ids +NatGateways,nat_gateways +NativeClientId,native_client_id +NavigationOperation,navigation_operation +NcharCharacterSetName,nchar_character_set_name +NearestModelName,nearest_model_name +Negate,negate +Negated,negated +Negative,negative +NegativeColor,negative_color +NegativeFormat,negative_format +NegativeValueConfiguration,negative_value_configuration +NeighborConnectionDetail,neighbor_connection_detail +Neighborhood,neighborhood +NeoVpcConfig,neo_vpc_config +NeptuneSettings,neptune_settings +Neq,neq +NestedFilters,nested_filters +NestedPropertyName,nested_property_name +NestingLevel,nesting_level +NetAppONTAPCluster,net_app_ontap_cluster +NetAppONTAPClusters,net_app_ontap_clusters +NetAppONTAPSVM,net_app_ontapsvm +NetAppONTAPSVMs,net_app_ontapsvms +NetAppONTAPVolume,net_app_ontap_volume +NetAppONTAPVolumes,net_app_ontap_volumes +NetBiosName,net_bios_name +NetIdFilters,net_id_filters +NetRISavings,net_ri_savings +NetSavings,net_savings +NetmaskLength,netmask_length +Network,network +NetworkACLEntry,network_acl_entry +NetworkAccessConfiguration,network_access_configuration +NetworkAcl,network_acl +NetworkAclAssociation,network_acl_association +NetworkAclAssociationId,network_acl_association_id +NetworkAclEntry,network_acl_entry +NetworkAclId,network_acl_id +NetworkAclIds,network_acl_ids +NetworkAcls,network_acls +NetworkAnalyzerConfigurationList,network_analyzer_configuration_list +NetworkAnalyzerConfigurations,network_analyzer_configurations +NetworkArtifactMeta,network_artifact_meta +NetworkBandwidthGbps,network_bandwidth_gbps +NetworkBandwidthGbpsRequest,network_bandwidth_gbps_request +NetworkBinding,network_binding +NetworkBorderGroup,network_border_group +NetworkCardIndex,network_card_index +NetworkCardInfo,network_card_info +NetworkCards,network_cards +NetworkConfig,network_config +NetworkConfiguration,network_configuration +NetworkConnectionAction,network_connection_action +NetworkDestinationDomain,network_destination_domain +NetworkDestinationIpV4,network_destination_ipv4 +NetworkDestinationIpV6,network_destination_ipv6 +NetworkDestinationPort,network_destination_port +NetworkDirection,network_direction +NetworkEndBlackout,network_end_blackout +NetworkEndBlackoutImage,network_end_blackout_image +NetworkEthereumAttributes,network_ethereum_attributes +NetworkEventType,network_event_type +NetworkFabricAttributes,network_fabric_attributes +NetworkFabricConfiguration,network_fabric_configuration +NetworkFabricType,network_fabric_type +NetworkFailureException,network_failure_exception +NetworkFirewallBlackHoleRouteDetectedViolation,network_firewall_black_hole_route_detected_violation +NetworkFirewallInternetTrafficNotInspectedViolation,network_firewall_internet_traffic_not_inspected_violation +NetworkFirewallInvalidRouteConfigurationViolation,network_firewall_invalid_route_configuration_violation +NetworkFirewallMissingExpectedRTViolation,network_firewall_missing_expected_rt_violation +NetworkFirewallMissingExpectedRoutesViolation,network_firewall_missing_expected_routes_violation +NetworkFirewallMissingFirewallViolation,network_firewall_missing_firewall_violation +NetworkFirewallMissingSubnetViolation,network_firewall_missing_subnet_violation +NetworkFirewallPolicy,network_firewall_policy +NetworkFirewallPolicyDescription,network_firewall_policy_description +NetworkFirewallPolicyModifiedViolation,network_firewall_policy_modified_violation +NetworkFirewallStatefulRuleGroupOverride,network_firewall_stateful_rule_group_override +NetworkFirewallUnexpectedFirewallRoutesViolation,network_firewall_unexpected_firewall_routes_violation +NetworkFirewallUnexpectedGatewayRoutesViolation,network_firewall_unexpected_gateway_routes_violation +NetworkFrameworkAttributes,network_framework_attributes +NetworkFrameworkConfiguration,network_framework_configuration +NetworkHeader,network_header +NetworkId,network_id +NetworkImpairment,network_impairment +NetworkInBytesPerSecond,network_in_bytes_per_second +NetworkInfo,network_info +NetworkInputSettings,network_input_settings +NetworkInsightsAccessScope,network_insights_access_scope +NetworkInsightsAccessScopeAnalyses,network_insights_access_scope_analyses +NetworkInsightsAccessScopeAnalysis,network_insights_access_scope_analysis +NetworkInsightsAccessScopeAnalysisArn,network_insights_access_scope_analysis_arn +NetworkInsightsAccessScopeAnalysisId,network_insights_access_scope_analysis_id +NetworkInsightsAccessScopeAnalysisIds,network_insights_access_scope_analysis_ids +NetworkInsightsAccessScopeArn,network_insights_access_scope_arn +NetworkInsightsAccessScopeContent,network_insights_access_scope_content +NetworkInsightsAccessScopeId,network_insights_access_scope_id +NetworkInsightsAccessScopeIds,network_insights_access_scope_ids +NetworkInsightsAccessScopes,network_insights_access_scopes +NetworkInsightsAnalyses,network_insights_analyses +NetworkInsightsAnalysis,network_insights_analysis +NetworkInsightsAnalysisArn,network_insights_analysis_arn +NetworkInsightsAnalysisId,network_insights_analysis_id +NetworkInsightsAnalysisIds,network_insights_analysis_ids +NetworkInsightsPath,network_insights_path +NetworkInsightsPathArn,network_insights_path_arn +NetworkInsightsPathId,network_insights_path_id +NetworkInsightsPathIds,network_insights_path_ids +NetworkInsightsPaths,network_insights_paths +NetworkInterface,network_interface +NetworkInterfaceAssociation,network_interface_association +NetworkInterfaceAttachment,network_interface_attachment +NetworkInterfaceAttachmentChanges,network_interface_attachment_changes +NetworkInterfaceCount,network_interface_count +NetworkInterfaceCountRequest,network_interface_count_request +NetworkInterfaceDeviceIndex,network_interface_device_index +NetworkInterfaceId,network_interface_id +NetworkInterfaceIds,network_interface_ids +NetworkInterfaceIpv6Address,network_interface_ipv6_address +NetworkInterfaceLimitExceeded,network_interface_limit_exceeded +NetworkInterfaceOptions,network_interface_options +NetworkInterfaceOwnerId,network_interface_owner_id +NetworkInterfacePermission,network_interface_permission +NetworkInterfacePermissionId,network_interface_permission_id +NetworkInterfacePermissionIds,network_interface_permission_ids +NetworkInterfacePermissionState,network_interface_permission_state +NetworkInterfacePermissions,network_interface_permissions +NetworkInterfacePort,network_interface_port +NetworkInterfacePrivateIpAddress,network_interface_private_ip_address +NetworkInterfaceSet,network_interface_set +NetworkInterfaceType,network_interface_type +NetworkInterfaces,network_interfaces +NetworkLoadBalancerArn,network_load_balancer_arn +NetworkLoadBalancerArns,network_load_balancer_arns +NetworkMode,network_mode +NetworkName,network_name +NetworkOrigin,network_origin +NetworkOutBytesPerSecond,network_out_bytes_per_second +NetworkOutput,network_output +NetworkPacketsInPerSecond,network_packets_in_per_second +NetworkPacketsOutPerSecond,network_packets_out_per_second +NetworkPath,network_path +NetworkPathComponent,network_path_component +NetworkPathComponentDetails,network_path_component_details +NetworkPathFound,network_path_found +NetworkPayload,network_payload +NetworkPerformance,network_performance +NetworkPlatform,network_platform +NetworkPolicyCount,network_policy_count +NetworkProfile,network_profile +NetworkProfileArn,network_profile_arn +NetworkProfileData,network_profile_data +NetworkProfileInfo,network_profile_info +NetworkProfileName,network_profile_name +NetworkProfiles,network_profiles +NetworkProtocol,network_protocol +NetworkReachabilityDetails,network_reachability_details +NetworkResource,network_resource +NetworkResourceCount,network_resource_count +NetworkResourceCounts,network_resource_counts +NetworkResourceDefinition,network_resource_definition +NetworkResourceSummary,network_resource_summary +NetworkResourceUtilization,network_resource_utilization +NetworkResources,network_resources +NetworkRoute,network_route +NetworkRouteDestination,network_route_destination +NetworkRoutes,network_routes +NetworkServices,network_services +NetworkSettings,network_settings +NetworkSettingsSummary,network_settings_summary +NetworkSite,network_site +NetworkSource,network_source +NetworkSourceDomain,network_source_domain +NetworkSourceIpV4,network_source_ipv4 +NetworkSourceIpV6,network_source_ipv6 +NetworkSourceMac,network_source_mac +NetworkSourcePort,network_source_port +NetworkStatus,network_status +NetworkSummary,network_summary +NetworkTelemetry,network_telemetry +NetworkType,network_type +NetworkTypeNotSupported,network_type_not_supported +NetworkingConfiguration,networking_configuration +Networks,networks +Neutral,neutral +NeverAggregateInFilter,never_aggregate_in_filter +NeverExpires,never_expires +NewAction,new_action +NewAssertionRule,new_assertion_rule +NewAssociationId,new_association_id +NewAvailabilityZones,new_availability_zones +NewBGPPeer,new_bgp_peer +NewBudget,new_budget +NewClusterIdentifier,new_cluster_identifier +NewColumnName,new_column_name +NewColumnType,new_column_type +NewComponentName,new_component_name +NewContactIds,new_contact_ids +NewCustomKeyStoreName,new_custom_key_store_name +NewCustomVocabularyItem,new_custom_vocabulary_item +NewDBClusterIdentifier,new_db_cluster_identifier +NewDBInstanceIdentifier,new_db_instance_identifier +NewDBProxyEndpointName,new_db_proxy_endpoint_name +NewDBProxyName,new_db_proxy_name +NewDefaultValues,new_default_values +NewDeviceMetadata,new_device_metadata +NewDeviceMetadataType,new_device_metadata_type +NewDhcpConfiguration,new_dhcp_configuration +NewGameSessionProtectionPolicy,new_game_session_protection_policy +NewGameSessionsPerCreator,new_game_sessions_per_creator +NewGatingRule,new_gating_rule +NewGlobalClusterIdentifier,new_global_cluster_identifier +NewGroupName,new_group_name +NewImage,new_image +NewInThisVersionBulletPoints,new_in_this_version_bullet_points +NewInstancesProtectedFromScaleIn,new_instances_protected_from_scale_in +NewLaunchProfileMember,new_launch_profile_member +NewMembers,new_members +NewName,new_name +NewNotification,new_notification +NewObjectMetadata,new_object_metadata +NewObjectTagging,new_object_tagging +NewParameterName,new_parameter_name +NewPassword,new_password +NewPath,new_path +NewPrivateVirtualInterface,new_private_virtual_interface +NewPrivateVirtualInterfaceAllocation,new_private_virtual_interface_allocation +NewPublicVirtualInterface,new_public_virtual_interface +NewPublicVirtualInterfaceAllocation,new_public_virtual_interface_allocation +NewReplicaCount,new_replica_count +NewReplicationFactor,new_replication_factor +NewServerCertificateName,new_server_certificate_name +NewStartingHashKey,new_starting_hash_key +NewStudioMember,new_studio_member +NewSubscriber,new_subscriber +NewSupportedProducts,new_supported_products +NewTableName,new_table_name +NewTransitVirtualInterface,new_transit_virtual_interface +NewTransitVirtualInterfaceAllocation,new_transit_virtual_interface_allocation +NewUserName,new_user_name +NewValue,new_value +NewValues,new_values +NewVersion,new_version +NewerNoncurrentVersions,newer_noncurrent_versions +NexGuardFileMarkerSettings,nex_guard_file_marker_settings +NexguardFileMarkerSettings,nexguard_file_marker_settings +NextActivity,next_activity +NextContinentCode,next_continent_code +NextContinuationToken,next_continuation_token +NextCountryCode,next_country_code +NextDNSName,next_dns_name +NextExecutionTime,next_execution_time +NextHostedZoneId,next_hosted_zone_id +NextInvocationTime,next_invocation_time +NextInvocations,next_invocations +NextKeyMarker,next_key_marker +NextLockToken,next_lock_token +NextMaintenanceWindowStartTime,next_maintenance_window_start_time +NextMarker,next_marker +NextPageMarker,next_page_marker +NextPageToken,next_page_token +NextPartNumberMarker,next_part_number_marker +NextPassword,next_password +NextPollConfigurationToken,next_poll_configuration_token +NextPollIntervalInSeconds,next_poll_interval_in_seconds +NextRecordIdentifier,next_record_identifier +NextRecordName,next_record_name +NextRecordType,next_record_type +NextRefreshTime,next_refresh_time +NextRotationDate,next_rotation_date +NextScheduledRetrainingStartDate,next_scheduled_retraining_start_date +NextSchemaVersion,next_schema_version +NextShardIterator,next_shard_iterator +NextSigningKeyLength,next_signing_key_length +NextSlotStartTime,next_slot_start_time +NextStatus,next_status +NextStep,next_step +NextSubdivisionCode,next_subdivision_code +NextToken,next_token +NextTransitionTime,next_transition_time +NextUpdateAvailabilityDate,next_update_availability_date +NextUpdateAvailabilityTime,next_update_availability_time +NextUpdateSeconds,next_update_seconds +NextUploadIdMarker,next_upload_id_marker +NextVersionIdMarker,next_version_id_marker +NextWebACLLockToken,next_web_acl_lock_token +Nfs,nfs +NfsExported,nfs_exported +NfsExportedVolumes,nfs_exported_volumes +NfsExports,nfs_exports +NfsMountOptions,nfs_mount_options +Nice,nice +NickName,nick_name +NielsenCBET,nielsen_cbet +NielsenCbetSettings,nielsen_cbet_settings +NielsenConfiguration,nielsen_configuration +NielsenDistributionType,nielsen_distribution_type +NielsenId3,nielsen_id3 +NielsenId3Behavior,nielsen_id3_behavior +NielsenNaesIiNw,nielsen_naes_ii_nw +NielsenNaesIiNwSettings,nielsen_naes_ii_nw_settings +NielsenNonLinearWatermark,nielsen_non_linear_watermark +NielsenNonLinearWatermarkSettings,nielsen_non_linear_watermark_settings +NielsenPcmToId3Tagging,nielsen_pcm_to_id3_tagging +NielsenWatermarksSettings,nielsen_watermarks_settings +NitInterval,nit_interval +NitroEnclavesSupport,nitro_enclaves_support +NitroTpmInfo,nitro_tpm_info +NitroTpmSupport,nitro_tpm_support +NlbArn,nlb_arn +NlbName,nlb_name +NoActionEmail,no_action_email +NoAssociatedRoleException,no_associated_role_exception +NoAvailableCertificateException,no_available_certificate_exception +NoAvailableConfigurationRecorderException,no_available_configuration_recorder_exception +NoAvailableDeliveryChannelException,no_available_delivery_channel_exception +NoAvailableOrganizationException,no_available_organization_exception +NoChangeException,no_change_exception +NoConnectorsAvailableException,no_connectors_available_exception +NoData,no_data +NoDataRetentionException,no_data_retention_exception +NoDatabaseMigrationPreference,no_database_migration_preference +NoDevice,no_device +NoEcho,no_echo +NoEncryptionConfig,no_encryption_config +NoEntitlementsAllowedException,no_entitlements_allowed_exception +NoExpiry,no_expiry +NoFreeAddressesInSubnet,no_free_addresses_in_subnet +NoHexPrefix,no_hex_prefix +NoManagementAccountSLRExistsException,no_management_account_slr_exists_exception +NoManagementPreference,no_management_preference +NoOperationFault,no_operation_fault +NoPasswordRequired,no_password_required +NoReboot,no_reboot +NoRegionalBlackoutFlag,no_regional_blackout_flag +NoRestrictions,no_restrictions +NoRunningConfigurationRecorderException,no_running_configuration_recorder_exception +NoScheduleException,no_schedule_exception +NoSecurityExtension,no_security_extension +NoSquashNids,no_squash_nids +NoSuchBucketException,no_such_bucket_exception +NoSuchCachePolicy,no_such_cache_policy +NoSuchChange,no_such_change +NoSuchCidrCollectionException,no_such_cidr_collection_exception +NoSuchCidrLocationException,no_such_cidr_location_exception +NoSuchCloudFrontOriginAccessIdentity,no_such_cloud_front_origin_access_identity +NoSuchCloudWatchLogsLogGroup,no_such_cloud_watch_logs_log_group +NoSuchConfigRuleException,no_such_config_rule_exception +NoSuchConfigRuleInConformancePackException,no_such_config_rule_in_conformance_pack_exception +NoSuchConfigurationAggregatorException,no_such_configuration_aggregator_exception +NoSuchConfigurationRecorderException,no_such_configuration_recorder_exception +NoSuchConformancePackException,no_such_conformance_pack_exception +NoSuchContinuousDeploymentPolicy,no_such_continuous_deployment_policy +NoSuchDelegationSet,no_such_delegation_set +NoSuchDeliveryChannelException,no_such_delivery_channel_exception +NoSuchDistribution,no_such_distribution +NoSuchEntityException,no_such_entity_exception +NoSuchFieldLevelEncryptionConfig,no_such_field_level_encryption_config +NoSuchFieldLevelEncryptionProfile,no_such_field_level_encryption_profile +NoSuchFunctionExists,no_such_function_exists +NoSuchGeoLocation,no_such_geo_location +NoSuchHealthCheck,no_such_health_check +NoSuchHostedZone,no_such_hosted_zone +NoSuchInvalidation,no_such_invalidation +NoSuchKeySigningKey,no_such_key_signing_key +NoSuchMonitoringSubscription,no_such_monitoring_subscription +NoSuchOrganizationConfigRuleException,no_such_organization_config_rule_exception +NoSuchOrganizationConformancePackException,no_such_organization_conformance_pack_exception +NoSuchOrigin,no_such_origin +NoSuchOriginAccessControl,no_such_origin_access_control +NoSuchOriginRequestPolicy,no_such_origin_request_policy +NoSuchPublicAccessBlockConfiguration,no_such_public_access_block_configuration +NoSuchPublicKey,no_such_public_key +NoSuchQueryLoggingConfig,no_such_query_logging_config +NoSuchRealtimeLogConfig,no_such_realtime_log_config +NoSuchRemediationConfigurationException,no_such_remediation_configuration_exception +NoSuchRemediationExceptionException,no_such_remediation_exception_exception +NoSuchResource,no_such_resource +NoSuchResourceException,no_such_resource_exception +NoSuchResponseHeadersPolicy,no_such_response_headers_policy +NoSuchRetentionConfigurationException,no_such_retention_configuration_exception +NoSuchStreamingDistribution,no_such_streaming_distribution +NoSuchTrafficPolicy,no_such_traffic_policy +NoSuchTrafficPolicyInstance,no_such_traffic_policy_instance +NoUpdateAvailableException,no_update_available_exception +NoVoteCount,no_vote_count +Node,node +NodeARN,node_arn +NodeAssociationStatus,node_association_status +NodeAssociationStatusToken,node_association_status_token +NodeConfiguration,node_configuration +NodeConfigurationOption,node_configuration_option +NodeConfigurationOptionList,node_configuration_option_list +NodeConfigurationOptionsFilter,node_configuration_options_filter +NodeConfigurationOptionsMessage,node_configuration_options_message +NodeCount,node_count +NodeCounts,node_counts +NodeCreateTime,node_create_time +NodeDeletionDate,node_deletion_date +NodeDescription,node_description +NodeDetails,node_details +NodeEthereumAttributes,node_ethereum_attributes +NodeExporter,node_exporter +NodeExporterInfo,node_exporter_info +NodeFabricAttributes,node_fabric_attributes +NodeFabricLogPublishingConfiguration,node_fabric_log_publishing_configuration +NodeFrameworkAttributes,node_framework_attributes +NodeFromTemplateJob,node_from_template_job +NodeFromTemplateJobs,node_from_template_jobs +NodeGroup,node_group +NodeGroupConfiguration,node_group_configuration +NodeGroupCount,node_group_count +NodeGroupId,node_group_id +NodeGroupMember,node_group_member +NodeGroupMemberUpdateStatus,node_group_member_update_status +NodeGroupMembers,node_group_members +NodeGroupNotFoundFault,node_group_not_found_fault +NodeGroupUpdateStatus,node_group_update_status +NodeGroups,node_groups +NodeGroupsPerReplicationGroupQuotaExceededFault,node_groups_per_replication_group_quota_exceeded_fault +NodeGroupsToRemove,node_groups_to_remove +NodeGroupsToRetain,node_groups_to_retain +NodeId,node_id +NodeIds,node_ids +NodeIdsToReboot,node_ids_to_reboot +NodeIdsToRemove,node_ids_to_remove +NodeInfo,node_info +NodeInfoList,node_info_list +NodeInputPort,node_input_port +NodeInstance,node_instance +NodeInstanceId,node_instance_id +NodeInstances,node_instances +NodeInterface,node_interface +NodeLogPublishingConfiguration,node_log_publishing_configuration +NodeName,node_name +NodeNotFoundFault,node_not_found_fault +NodeOutputPort,node_output_port +NodeOverrides,node_overrides +NodeProperties,node_properties +NodePropertiesSummary,node_properties_summary +NodePropertyOverride,node_property_override +NodeQuotaForClusterExceededFault,node_quota_for_cluster_exceeded_fault +NodeQuotaForCustomerExceededFault,node_quota_for_customer_exceeded_fault +NodeRangeProperty,node_range_property +NodeRole,node_role +NodeSignal,node_signal +NodeSignals,node_signals +NodeSnapshot,node_snapshot +NodeSnapshots,node_snapshots +NodeStatus,node_status +NodeStructure,node_structure +NodeSummary,node_summary +NodeToNodeEncryptionOptions,node_to_node_encryption_options +NodeToNodeEncryptionOptionsStatus,node_to_node_encryption_options_status +NodeType,node_type +NodeTypeSpecificValue,node_type_specific_value +NodeTypeSpecificValues,node_type_specific_values +NodeUpdateEndDate,node_update_end_date +NodeUpdateInitiatedBy,node_update_initiated_by +NodeUpdateInitiatedDate,node_update_initiated_date +NodeUpdateStartDate,node_update_start_date +NodeUpdateStatus,node_update_status +NodeUpdateStatusModifiedDate,node_update_status_modified_date +Nodegroup,nodegroup +NodegroupHealth,nodegroup_health +NodegroupResources,nodegroup_resources +NodegroupScalingConfig,nodegroup_scaling_config +NodegroupUpdateConfig,nodegroup_update_config +Nodes,nodes +NodesUpdated,nodes_updated +NoiseReducer,noise_reducer +NoiseReducerFilterSettings,noise_reducer_filter_settings +NoiseReducerSpatialFilterSettings,noise_reducer_spatial_filter_settings +NoiseReducerTemporalFilterSettings,noise_reducer_temporal_filter_settings +NonAdditive,non_additive +NonAwsRegions,non_aws_regions +NonCompliantConformancePackCount,non_compliant_conformance_pack_count +NonCompliantCount,non_compliant_count +NonCompliantCriticalCount,non_compliant_critical_count +NonCompliantHighCount,non_compliant_high_count +NonCompliantInformationalCount,non_compliant_informational_count +NonCompliantLowCount,non_compliant_low_count +NonCompliantMediumCount,non_compliant_medium_count +NonCompliantResource,non_compliant_resource +NonCompliantResourceCount,non_compliant_resource_count +NonCompliantResources,non_compliant_resources +NonCompliantRuleCount,non_compliant_rule_count +NonCompliantSummary,non_compliant_summary +NonCompliantUnspecifiedCount,non_compliant_unspecified_count +NonDeletedNetworkInterfaceIds,non_deleted_network_interface_ids +NonKeyAttributes,non_key_attributes +NonOverridableArguments,non_overridable_arguments +NonRepudiation,non_repudiation +NonRetryableError,non_retryable_error +NonTalkTimeFilter,non_talk_time_filter +Nonce,nonce +NoncompliantKeys,noncompliant_keys +NoncurrentDays,noncurrent_days +NoncurrentVersionExpiration,noncurrent_version_expiration +NoncurrentVersionExpirationInDays,noncurrent_version_expiration_in_days +NoncurrentVersionTransition,noncurrent_version_transition +NoncurrentVersionTransitions,noncurrent_version_transitions +None,none +Normal,normal +Normalized,normalized +NormalizedInstanceHours,normalized_instance_hours +NormalizedValue,normalized_value +North,north +Not,not +NotAcceptableException,not_acceptable_exception +NotActions,not_actions +NotAfter,not_after +NotAfterDate,not_after_date +NotAllowedAggregations,not_allowed_aggregations +NotApplicable,not_applicable +NotApplicableCount,not_applicable_count +NotApplicableEnabled,not_applicable_enabled +NotAuthorizedException,not_authorized_exception +NotBefore,not_before +NotBeforeDate,not_before_date +NotBeforeDeadline,not_before_deadline +NotConfiguredException,not_configured_exception +NotDeviceModels,not_device_models +NotDeviceOperatingSystems,not_device_operating_systems +NotDeviceTypes,not_device_types +NotDeviceUserAgents,not_device_user_agents +NotEligibleException,not_eligible_exception +NotEndsWith,not_ends_with +NotEquals,not_equals +NotFilter,not_filter +NotFoundException,not_found_exception +NotImpersonationRoleIds,not_impersonation_role_ids +NotIndexException,not_index_exception +NotIpRanges,not_ip_ranges +NotLatestPipelineExecutionException,not_latest_pipeline_execution_exception +NotNodeException,not_node_exception +NotOrganizationManagementAccountException,not_organization_management_account_exception +NotOrganizationMasterAccountException,not_organization_master_account_exception +NotPolicyException,not_policy_exception +NotReadableInputStreamException,not_readable_input_stream_exception +NotResources,not_resources +NotScaledReason,not_scaled_reason +NotScaledReasons,not_scaled_reasons +NotServiceResourceError,not_service_resource_error +NotStabilizedException,not_stabilized_exception +NotStartsWith,not_starts_with +NotStatement,not_statement +NotSupportedOperationException,not_supported_operation_exception +NotTargetUsers,not_target_users +NotUpdatableException,not_updatable_exception +NotUserIds,not_user_ids +Note,note +NoteText,note_text +NoteUpdate,note_update +NoteUpdatedAt,note_updated_at +NoteUpdatedBy,note_updated_by +NotebookExecution,notebook_execution +NotebookExecutionId,notebook_execution_id +NotebookExecutionName,notebook_execution_name +NotebookExecutionSummary,notebook_execution_summary +NotebookExecutions,notebook_executions +NotebookId,notebook_id +NotebookInstanceArn,notebook_instance_arn +NotebookInstanceLifecycleConfigArn,notebook_instance_lifecycle_config_arn +NotebookInstanceLifecycleConfigName,notebook_instance_lifecycle_config_name +NotebookInstanceLifecycleConfigNameContains,notebook_instance_lifecycle_config_name_contains +NotebookInstanceLifecycleConfigSummary,notebook_instance_lifecycle_config_summary +NotebookInstanceLifecycleConfigs,notebook_instance_lifecycle_configs +NotebookInstanceLifecycleHook,notebook_instance_lifecycle_hook +NotebookInstanceName,notebook_instance_name +NotebookInstanceSecurityGroupId,notebook_instance_security_group_id +NotebookInstanceStatus,notebook_instance_status +NotebookInstanceSummary,notebook_instance_summary +NotebookInstances,notebook_instances +NotebookMetadata,notebook_metadata +NotebookMetadataList,notebook_metadata_list +NotebookOutputOption,notebook_output_option +NotebookParams,notebook_params +NotebookS3Location,notebook_s3_location +NotebookS3LocationForOutput,notebook_s3_location_for_output +NotebookS3LocationFromInput,notebook_s3_location_from_input +NotebookSessionSummary,notebook_session_summary +NotebookSessionsList,notebook_sessions_list +NotebookUrl,notebook_url +NotebookVersion,notebook_version +Notes,notes +Notification,notification +NotificationARNs,notification_arns +NotificationAction,notification_action +NotificationArn,notification_arn +NotificationArns,notification_arns +NotificationAttributes,notification_attributes +NotificationChannel,notification_channel +NotificationChannelConfig,notification_channel_config +NotificationConfig,notification_config +NotificationConfiguration,notification_configuration +NotificationConfigurationFilter,notification_configuration_filter +NotificationConfigurations,notification_configurations +NotificationContext,notification_context +NotificationDestinationConfig,notification_destination_config +NotificationEmail,notification_email +NotificationEvents,notification_events +NotificationFilterConfig,notification_filter_config +NotificationId,notification_id +NotificationMetadata,notification_metadata +NotificationOptions,notification_options +NotificationPolicy,notification_policy +NotificationProperty,notification_property +NotificationRecipientType,notification_recipient_type +NotificationRuleSummary,notification_rule_summary +NotificationRules,notification_rules +NotificationSetting,notification_setting +NotificationSettingDetail,notification_setting_detail +NotificationSettingKey,notification_setting_key +NotificationSpecification,notification_specification +NotificationState,notification_state +NotificationSummaries,notification_summaries +NotificationSummary,notification_summary +NotificationTarget,notification_target +NotificationTargetARN,notification_target_arn +NotificationTargetActions,notification_target_actions +NotificationTopicArn,notification_topic_arn +NotificationTopicStatus,notification_topic_status +NotificationType,notification_type +NotificationTypes,notification_types +NotificationWithSubscribers,notification_with_subscribers +Notifications,notifications +NotificationsConfiguration,notifications_configuration +NotificationsEnabled,notifications_enabled +NotificationsWithSubscribers,notifications_with_subscribers +Notify,notify +NotifyAll,notify_all +NotifyAppValidationOutputRequest,notify_app_validation_output_request +NotifyApplicationStateRequest,notify_application_state_request +NotifyCollaborators,notify_collaborators +NotifyConfiguration,notify_configuration +NotifyConfigurationType,notify_configuration_type +NotifyDelayAfter,notify_delay_after +NotifyEmailType,notify_email_type +NotifyMigrationTaskStateRequest,notify_migration_task_state_request +NotifyObjectCompleteInput,notify_object_complete_input +NotifyObjectCompleteOutput,notify_object_complete_output +NotifyProvisionProductEngineWorkflowResultInput,notify_provision_product_engine_workflow_result_input +NotifyRecommendationsReceivedError,notify_recommendations_received_error +NotifyRecommendationsReceivedRequest,notify_recommendations_received_request +NotifyRecommendationsReceivedResponse,notify_recommendations_received_response +NotifyResourceDeploymentStatusChangeInput,notify_resource_deployment_status_change_input +NotifyTerminateProvisionedProductEngineWorkflowResultInput,notify_terminate_provisioned_product_engine_workflow_result_input +NotifyUpdateProvisionedProductEngineWorkflowResultInput,notify_update_provisioned_product_engine_workflow_result_input +NotifyWhenUploadedInput,notify_when_uploaded_input +NotifyWhenUploadedOutput,notify_when_uploaded_output +NotifyWorkersFailureCode,notify_workers_failure_code +NotifyWorkersFailureMessage,notify_workers_failure_message +NotifyWorkersFailureStatus,notify_workers_failure_status +NotifyWorkersFailureStatuses,notify_workers_failure_statuses +NotifyWorkersRequest,notify_workers_request +NotifyWorkersResponse,notify_workers_response +NrCapable,nr_capable +Ntp,ntp +NtpPayload,ntp_payload +NtpServerName,ntp_server_name +NtpServers,ntp_servers +NtpStatus,ntp_status +NullCheckBoxList,null_check_box_list +NullOption,null_option +NullPacketBitrate,null_packet_bitrate +NullString,null_string +NullTextList,null_text_list +NullValue,null_value +NullValueColor,null_value_color +NullValueField,null_value_field +NullValueFormatConfiguration,null_value_format_configuration +Nullable,nullable +NumCacheClusters,num_cache_clusters +NumCacheNodes,num_cache_nodes +NumFalseNegatives,num_false_negatives +NumFalsePositives,num_false_positives +NumItemsEvaluated,num_items_evaluated +NumNodeGroups,num_node_groups +NumPartitions,num_partitions +NumRecords,num_records +NumRefFrames,num_ref_frames +NumReplicasPerShard,num_replicas_per_shard +NumResults,num_results +NumRetries,num_retries +NumShards,num_shards +NumTapesToCreate,num_tapes_to_create +NumTimeSeries,num_time_series +NumTrueNegatives,num_true_negatives +NumTruePositives,num_true_positives +Number,number +NumberAttributeConstraints,number_attribute_constraints +NumberAttributeConstraintsType,number_attribute_constraints_type +NumberBFramesBetweenReferenceFrames,number_b_frames_between_reference_frames +NumberCapabilities,number_capabilities +NumberDatatypeScale,number_datatype_scale +NumberDisplayFormatConfiguration,number_display_format_configuration +NumberFilter,number_filter +NumberFormatConfiguration,number_format_configuration +NumberOfAdditionalAssignments,number_of_additional_assignments +NumberOfArchives,number_of_archives +NumberOfAssignmentsAvailable,number_of_assignments_available +NumberOfAssignmentsCompleted,number_of_assignments_completed +NumberOfAssignmentsPending,number_of_assignments_pending +NumberOfAssociatedQueues,number_of_associated_queues +NumberOfAssociatedUsers,number_of_associated_users +NumberOfAssociations,number_of_associations +NumberOfAutoScalingGroups,number_of_auto_scaling_groups +NumberOfBacktestWindows,number_of_backtest_windows +NumberOfBrokerNodes,number_of_broker_nodes +NumberOfBuckets,number_of_buckets +NumberOfBytes,number_of_bytes +NumberOfCategory,number_of_category +NumberOfChannels,number_of_channels +NumberOfChildJobs,number_of_child_jobs +NumberOfControls,number_of_controls +NumberOfDatabases,number_of_databases +NumberOfDecreasesToday,number_of_decreases_today +NumberOfDevicesInGroup,number_of_devices_in_group +NumberOfDevicesRequested,number_of_devices_requested +NumberOfDisks,number_of_disks +NumberOfDistinctValues,number_of_distinct_values +NumberOfDocuments,number_of_documents +NumberOfFalses,number_of_falses +NumberOfFiles,number_of_files +NumberOfFrameworks,number_of_frameworks +NumberOfHumanWorkersPerDataObject,number_of_human_workers_per_data_object +NumberOfLabels,number_of_labels +NumberOfLargeTimestampGaps,number_of_large_timestamp_gaps +NumberOfLaunchConfigurations,number_of_launch_configurations +NumberOfLines,number_of_lines +NumberOfLogLinesOccurrences,number_of_log_lines_occurrences +NumberOfLogLinesScanned,number_of_log_lines_scanned +NumberOfMatchesFound,number_of_matches_found +NumberOfMatchesInSample,number_of_matches_in_sample +NumberOfMergesDone,number_of_merges_done +NumberOfMountTargets,number_of_mount_targets +NumberOfNodes,number_of_nodes +NumberOfNodesPerClusterLimitExceededFault,number_of_nodes_per_cluster_limit_exceeded_fault +NumberOfNodesQuotaExceededFault,number_of_nodes_quota_exceeded_fault +NumberOfNulls,number_of_nulls +NumberOfObjects,number_of_objects +NumberOfOnCalls,number_of_on_calls +NumberOfProfilesInSample,number_of_profiles_in_sample +NumberOfProfilesReviewed,number_of_profiles_reviewed +NumberOfProfilesWillBeMerged,number_of_profiles_will_be_merged +NumberOfRecoveryPoints,number_of_recovery_points +NumberOfRuleGroupsAlreadyAssociated,number_of_rule_groups_already_associated +NumberOfRuleTemplatesExceededException,number_of_rule_templates_exceeded_exception +NumberOfRules,number_of_rules +NumberOfRulesExceededException,number_of_rules_exceeded_exception +NumberOfSamples,number_of_samples +NumberOfSchemas,number_of_schemas +NumberOfServicesAccessible,number_of_services_accessible +NumberOfServicesNotAccessed,number_of_services_not_accessed +NumberOfShards,number_of_shards +NumberOfSteps,number_of_steps +NumberOfTasksFailed,number_of_tasks_failed +NumberOfTasksSucceeded,number_of_tasks_succeeded +NumberOfTestDocuments,number_of_test_documents +NumberOfTopics,number_of_topics +NumberOfTrainMentions,number_of_train_mentions +NumberOfTrainedDocuments,number_of_trained_documents +NumberOfTrainingJobsObjectiveNotImproving,number_of_training_jobs_objective_not_improving +NumberOfTrues,number_of_trues +NumberOfVersions,number_of_versions +NumberOfWorkers,number_of_workers +NumberReference,number_reference +NumberReferenceFrames,number_reference_frames +NumberScale,number_scale +NumberSelectionBehavior,number_selection_behavior +NumberType,number_type +NumberValidateRequest,number_validate_request +NumberValidateResponse,number_validate_response +NumericAxisOptions,numeric_axis_options +NumericEqualityDrillDownFilter,numeric_equality_drill_down_filter +NumericEqualityFilter,numeric_equality_filter +NumericFormatConfiguration,numeric_format_configuration +NumericOperator,numeric_operator +NumericQuestionPropertyValueAutomation,numeric_question_property_value_automation +NumericRangeFilter,numeric_range_filter +NumericRangeFilterValue,numeric_range_filter_value +NumericSeparatorConfiguration,numeric_separator_configuration +NumericalAggregationFunction,numerical_aggregation_function +NumericalDimensionField,numerical_dimension_field +NumericalMeasureField,numerical_measure_field +NvmeSupport,nvme_support +NwkGeoLoc,nwk_geo_loc +NwkKey,nwk_key +NwkSEncKey,nwk_s_enc_key +NwkSKey,nwk_s_key +OAuth,o_auth +OAuth2Credentials,o_auth2_credentials +OAuth2CustomParameter,o_auth2_custom_parameter +OAuth2Defaults,o_auth2_defaults +OAuth2Properties,o_auth2_properties +OAuthCredentials,o_auth_credentials +OAuthGrantType,o_auth_grant_type +OAuthHttpParameters,o_auth_http_parameters +OAuthParameters,o_auth_parameters +OAuthProperties,o_auth_properties +OAuthProviderException,o_auth_provider_exception +OAuthScopes,o_auth_scopes +OCSPUrl,ocsp_url +OEMEphemeris,oem_ephemeris +OFIMetricDataPoint,ofi_metric_data_point +OFIModelPerformance,ofi_model_performance +OFITrainingMetricsValue,ofi_training_metrics_value +OID,oid +OIDC,oidc +OId,o_id +OKActions,ok_actions +OS,os +OSInfo,os_info +OSRelease,os_release +OSReleaseLabel,os_release_label +OSUpdateSettings,os_update_settings +OSVersion,os_version +OTAJobConfig,ota_job_config +OTAUpdateFile,ota_update_file +OTAUpdateInfo,ota_update_info +OTAUpdateSummary,ota_update_summary +OU,ou +Oauth2Credential,oauth2_credential +ObdInterface,obd_interface +ObdSignal,obd_signal +ObfuscationSetting,obfuscation_setting +Object,object +ObjectACL,object_acl +ObjectAlreadyDetachedException,object_already_detached_exception +ObjectArn,object_arn +ObjectAttributeAction,object_attribute_action +ObjectAttributeActionType,object_attribute_action_type +ObjectAttributeKey,object_attribute_key +ObjectAttributeList,object_attribute_list +ObjectAttributeRange,object_attribute_range +ObjectAttributeUpdate,object_attribute_update +ObjectAttributeUpdateValue,object_attribute_update_value +ObjectAttributes,object_attributes +ObjectChecksum,object_checksum +ObjectChecksumAlgorithm,object_checksum_algorithm +ObjectConfiguration,object_configuration +ObjectCount,object_count +ObjectCountByEncryptionType,object_count_by_encryption_type +ObjectEncryptionType,object_encryption_type +ObjectFilter,object_filter +ObjectGroup,object_group +ObjectGroupName,object_group_name +ObjectIdentifier,object_identifier +ObjectIdentifierAndLinkNameTuple,object_identifier_and_link_name_tuple +ObjectIdentifiers,object_identifiers +ObjectKey,object_key +ObjectKeyPrefix,object_key_prefix +ObjectLambdaAccessPoint,object_lambda_access_point +ObjectLambdaAccessPointAlias,object_lambda_access_point_alias +ObjectLambdaAccessPointArn,object_lambda_access_point_arn +ObjectLambdaAccessPointList,object_lambda_access_point_list +ObjectLambdaConfiguration,object_lambda_configuration +ObjectLambdaTransformationConfiguration,object_lambda_transformation_configuration +ObjectLevelStatistics,object_level_statistics +ObjectList,object_list +ObjectLockConfiguration,object_lock_configuration +ObjectLockEnabled,object_lock_enabled +ObjectLockEnabledForBucket,object_lock_enabled_for_bucket +ObjectLockLegalHold,object_lock_legal_hold +ObjectLockLegalHoldStatus,object_lock_legal_hold_status +ObjectLockMode,object_lock_mode +ObjectLockRetainUntilDate,object_lock_retain_until_date +ObjectLockRetention,object_lock_retention +ObjectLockRule,object_lock_rule +ObjectName,object_name +ObjectNotDetachedException,object_not_detached_exception +ObjectNotFoundException,object_not_found_exception +ObjectOwnership,object_ownership +ObjectPart,object_part +ObjectParts,object_parts +ObjectReference,object_reference +ObjectReplicationStatuses,object_replication_statuses +ObjectSize,object_size +ObjectSizeGreaterThan,object_size_greater_than +ObjectSizeLessThan,object_size_less_than +ObjectTags,object_tags +ObjectToken,object_token +ObjectType,object_type +ObjectTypeField,object_type_field +ObjectTypeKey,object_type_key +ObjectTypeName,object_type_name +ObjectTypeNames,object_type_names +ObjectTypes,object_types +ObjectURL,object_url +ObjectVersion,object_version +ObjectVersionId,object_version_id +ObjectVersionIds,object_version_ids +ObjectVersionUpdate,object_version_update +ObjectiveStatus,objective_status +ObjectiveStatusCounters,objective_status_counters +Objects,objects +ObjectsTransferred,objects_transferred +ObservabilityConfiguration,observability_configuration +ObservabilityConfigurationArn,observability_configuration_arn +ObservabilityConfigurationName,observability_configuration_name +ObservabilityConfigurationRevision,observability_configuration_revision +ObservabilityConfigurationSummary,observability_configuration_summary +ObservabilityConfigurationSummaryList,observability_configuration_summary_list +ObservabilityEnabled,observability_enabled +Observation,observation +ObservationId,observation_id +ObservationList,observation_list +OccConflictException,occ_conflict_exception +OccurredAt,occurred_at +OccurrenceCount,occurrence_count +OccurrenceDaySet,occurrence_day_set +OccurrenceDays,occurrence_days +OccurrenceRelativeToEnd,occurrence_relative_to_end +OccurrenceUnit,occurrence_unit +Occurrences,occurrences +OcrLanguage,ocr_language +OcspConfiguration,ocsp_configuration +OcspCustomCname,ocsp_custom_cname +OcuLimitExceededException,ocu_limit_exceeded_exception +OffCondition,off_condition +OffPeakWindow,off_peak_window +OffPeakWindowOptions,off_peak_window_options +OffPeakWindowOptionsStatus,off_peak_window_options_status +Offering,offering +OfferingArn,offering_arn +OfferingClass,offering_class +OfferingDescription,offering_description +OfferingId,offering_id +OfferingPromotion,offering_promotion +OfferingSet,offering_set +OfferingStatus,offering_status +OfferingTransaction,offering_transaction +OfferingType,offering_type +Offerings,offerings +Office,office +OfflineDeviceCount,offline_device_count +OfflineEncrypted,offline_encrypted +OfflineStoreConfig,offline_store_config +OfflineStoreStatus,offline_store_status +OfflineStoreStatusEquals,offline_store_status_equals +Offset,offset +OffsetMillis,offset_millis +OffsetRange,offset_range +OffsetRanges,offset_ranges +OidcConfig,oidc_config +OidcConfigForResponse,oidc_config_for_response +OidcIdentityProviderConfig,oidc_identity_provider_config +OidcIdentityProviderConfigRequest,oidc_identity_provider_config_request +OidcMemberDefinition,oidc_member_definition +OidcOptions,oidc_options +Ok,ok +OkActions,ok_actions +OkCount,ok_count +OldAction,old_action +OldImage,old_image +OldKmsKeyId,old_kms_key_id +OldNotification,old_notification +OldPassword,old_password +OldSubscriber,old_subscriber +OldValue,old_value +OnClause,on_clause +OnCreate,on_create +OnDemandAllocationStrategy,on_demand_allocation_strategy +OnDemandBaseCapacity,on_demand_base_capacity +OnDemandCapacityReservationOptions,on_demand_capacity_reservation_options +OnDemandCost,on_demand_cost +OnDemandCostEquivalent,on_demand_cost_equivalent +OnDemandCostOfRIHoursUsed,on_demand_cost_of_ri_hours_used +OnDemandFulfilledCapacity,on_demand_fulfilled_capacity +OnDemandHours,on_demand_hours +OnDemandHoursInLookbackPeriod,on_demand_hours_in_lookback_period +OnDemandMaxPricePercentageOverLowestPrice,on_demand_max_price_percentage_over_lowest_price +OnDemandMaxTotalPrice,on_demand_max_total_price +OnDemandNormalizedUnits,on_demand_normalized_units +OnDemandOptions,on_demand_options +OnDemandOptionsRequest,on_demand_options_request +OnDemandPercentageAboveBaseCapacity,on_demand_percentage_above_base_capacity +OnDemandProvisioningSpecification,on_demand_provisioning_specification +OnDemandResizeSpecification,on_demand_resize_specification +OnDemandResizingSpecification,on_demand_resizing_specification +OnDemandSpecification,on_demand_specification +OnDemandStreamCount,on_demand_stream_count +OnDemandStreamCountLimit,on_demand_stream_count_limit +OnDemandTargetCapacity,on_demand_target_capacity +OnDeviceServiceConfiguration,on_device_service_configuration +OnEnterLifecycle,on_enter_lifecycle +OnExceptionSteps,on_exception_steps +OnExitLifecycle,on_exit_lifecycle +OnFailure,on_failure +OnHoldBalance,on_hold_balance +OnInputLifecycle,on_input_lifecycle +OnPartialBatchItemFailure,on_partial_batch_item_failure +OnPartialUpload,on_partial_upload +OnPremConfig,on_prem_config +OnPremiseConfiguration,on_premise_configuration +OnPremisesTagSet,on_premises_tag_set +OnStackFailure,on_stack_failure +OnStart,on_start +OnSuccess,on_success +OnUnauthenticatedRequest,on_unauthenticated_request +OnUpload,on_upload +OnboardedImportedDeviceCount,onboarded_imported_device_count +OnboardingStatus,onboarding_status +OnboardingStatusReason,onboarding_status_reason +OneClickIdDelay,one_click_id_delay +OneClickPinDelay,one_click_pin_delay +OneDriveConfiguration,one_drive_configuration +OneDriveUserList,one_drive_user_list +OneDriveUserS3Path,one_drive_user_s3_path +OneDriveUsers,one_drive_users +OneTimePassword,one_time_password +Ongoing,ongoing +Online,online +OnlineAbConfig,online_ab_config +OnlineAbDefinition,online_ab_definition +OnlineStoreConfig,online_store_config +OnlineStoreConfigUpdate,online_store_config_update +OnlineStoreSecurityConfig,online_store_security_config +OnlineStoreTotalSizeBytes,online_store_total_size_bytes +OnlyAssociated,only_associated +OnlyAttached,only_attached +OnlyAvailable,only_available +OntapConfiguration,ontap_configuration +OntapFileSystemConfiguration,ontap_file_system_configuration +OntapResponse,ontap_response +OntapVolumeConfiguration,ontap_volume_configuration +OntapVolumeType,ontap_volume_type +Op,op +Opacity,opacity +OpenDate,open_date +OpenHours,open_hours +OpenHoursRule,open_hours_rule +OpenIDAuthTTL,open_id_auth_ttl +OpenIDClientId,open_id_client_id +OpenIDConnectConfig,open_id_connect_config +OpenIDConnectProviderArn,open_id_connect_provider_arn +OpenIDConnectProviderList,open_id_connect_provider_list +OpenIDConnectProviderListEntry,open_id_connect_provider_list_entry +OpenIDIatTTL,open_id_iat_ttl +OpenIDIssueURL,open_id_issue_url +OpenIDProviderName,open_id_provider_name +OpenIdConnectConfig,open_id_connect_config +OpenIdConnectProviderARNs,open_id_connect_provider_arns +OpenInstancePublicPortsRequest,open_instance_public_ports_request +OpenInstancePublicPortsResult,open_instance_public_ports_result +OpenMonitoring,open_monitoring +OpenMonitoringInfo,open_monitoring_info +OpenPortRange,open_port_range +OpenProactiveInsights,open_proactive_insights +OpenReactiveInsights,open_reactive_insights +OpenSearchAction,open_search_action +OpenSearchServiceDataSourceConfig,open_search_service_data_source_config +OpenShardCount,open_shard_count +OpenTableFormatInput,open_table_format_input +OpenTime,open_time +OpenTransactionWindow,open_transaction_window +OpenTunnelRequest,open_tunnel_request +OpenTunnelResponse,open_tunnel_response +OpenXJsonSerDe,open_x_json_ser_de +OpenZFSClientConfiguration,open_zfs_client_configuration +OpenZFSConfiguration,open_zfs_configuration +OpenZFSCreateRootVolumeConfiguration,open_zfs_create_root_volume_configuration +OpenZFSFileSystemConfiguration,open_zfs_file_system_configuration +OpenZFSNfsExport,open_zfs_nfs_export +OpenZFSOriginSnapshotConfiguration,open_zfs_origin_snapshot_configuration +OpenZFSResponse,open_zfs_response +OpenZFSUserOrGroupQuota,open_zfs_user_or_group_quota +OpenZFSVolumeConfiguration,open_zfs_volume_configuration +OpenedBy,opened_by +OperandFieldName,operand_field_name +Operands,operands +OperatingAddress,operating_address +OperatingAddressCity,operating_address_city +OperatingAddressCityFilter,operating_address_city_filter +OperatingAddressCountryCode,operating_address_country_code +OperatingAddressCountryCodeFilter,operating_address_country_code_filter +OperatingAddressStateOrRegion,operating_address_state_or_region +OperatingAddressStateOrRegionFilter,operating_address_state_or_region_filter +OperatingRegions,operating_regions +OperatingSystem,operating_system +OperatingSystemConfigurationManager,operating_system_configuration_manager +OperatingSystemName,operating_system_name +OperatingSystemVersion,operating_system_version +OperatingSystems,operating_systems +Operation,operation +OperationAbortedException,operation_aborted_exception +OperationArn,operation_arn +OperationDisabledException,operation_disabled_exception +OperationEndTime,operation_end_time +OperationFailureException,operation_failure_exception +OperationFilter,operation_filter +OperationId,operation_id +OperationIdAlreadyExistsException,operation_id_already_exists_exception +OperationIds,operation_ids +OperationInProgressException,operation_in_progress_exception +OperationLimitExceeded,operation_limit_exceeded +OperationName,operation_name +OperationNotFound,operation_not_found +OperationNotFoundException,operation_not_found_exception +OperationNotPermittedException,operation_not_permitted_exception +OperationNotPermittedFault,operation_not_permitted_fault +OperationNotSupportedException,operation_not_supported_exception +OperationPreferences,operation_preferences +OperationRequestedBy,operation_requested_by +OperationResultFilter,operation_result_filter +OperationStartTime,operation_start_time +OperationState,operation_state +OperationStatus,operation_status +OperationStatusCheckFailedException,operation_status_check_failed_exception +OperationStatusFilter,operation_status_filter +OperationStatuses,operation_statuses +OperationSteps,operation_steps +OperationSummary,operation_summary +OperationSummaryList,operation_summary_list +OperationTimeoutException,operation_timeout_exception +OperationType,operation_type +OperationalData,operational_data +OperationalDataToDelete,operational_data_to_delete +Operations,operations +OperationsRole,operations_role +Operator,operator +OplocksEnabled,oplocks_enabled +OpsAggregator,ops_aggregator +OpsCenter,ops_center +OpsCenterEnabled,ops_center_enabled +OpsCenterIntegration,ops_center_integration +OpsCenterIntegrationConfig,ops_center_integration_config +OpsEntity,ops_entity +OpsEntityItem,ops_entity_item +OpsFilter,ops_filter +OpsItem,ops_item +OpsItemAccessDeniedException,ops_item_access_denied_exception +OpsItemAlreadyExistsException,ops_item_already_exists_exception +OpsItemArn,ops_item_arn +OpsItemDataValue,ops_item_data_value +OpsItemEventFilter,ops_item_event_filter +OpsItemEventSummary,ops_item_event_summary +OpsItemFilter,ops_item_filter +OpsItemFilters,ops_item_filters +OpsItemId,ops_item_id +OpsItemIdentity,ops_item_identity +OpsItemInvalidParameterException,ops_item_invalid_parameter_exception +OpsItemLimitExceededException,ops_item_limit_exceeded_exception +OpsItemNotFoundException,ops_item_not_found_exception +OpsItemNotification,ops_item_notification +OpsItemRelatedItemAlreadyExistsException,ops_item_related_item_already_exists_exception +OpsItemRelatedItemAssociationNotFoundException,ops_item_related_item_association_not_found_exception +OpsItemRelatedItemSummary,ops_item_related_item_summary +OpsItemRelatedItemsFilter,ops_item_related_items_filter +OpsItemSNSTopicArn,ops_item_sns_topic_arn +OpsItemSummaries,ops_item_summaries +OpsItemSummary,ops_item_summary +OpsItemType,ops_item_type +OpsMetadata,ops_metadata +OpsMetadataAlreadyExistsException,ops_metadata_already_exists_exception +OpsMetadataArn,ops_metadata_arn +OpsMetadataFilter,ops_metadata_filter +OpsMetadataInvalidArgumentException,ops_metadata_invalid_argument_exception +OpsMetadataKeyLimitExceededException,ops_metadata_key_limit_exceeded_exception +OpsMetadataLimitExceededException,ops_metadata_limit_exceeded_exception +OpsMetadataList,ops_metadata_list +OpsMetadataNotFoundException,ops_metadata_not_found_exception +OpsMetadataTooManyUpdatesException,ops_metadata_too_many_updates_exception +OpsResultAttribute,ops_result_attribute +OptIn,opt_in +OptInPhoneNumberInput,opt_in_phone_number_input +OptInRequiredException,opt_in_required_exception +OptInStatus,opt_in_status +OptInType,opt_in_type +OptOut,opt_out +OptOutListArn,opt_out_list_arn +OptOutListInformation,opt_out_list_information +OptOutListName,opt_out_list_name +OptOutListNames,opt_out_list_names +OptOutLists,opt_out_lists +OptOutSpeakerRequest,opt_out_speaker_request +OptOutSpeakerResponse,opt_out_speaker_response +OptedOutException,opted_out_exception +OptedOutFilter,opted_out_filter +OptedOutNumber,opted_out_number +OptedOutNumberInformation,opted_out_number_information +OptedOutNumbers,opted_out_numbers +OptedOutTimestamp,opted_out_timestamp +OpticalStandard,optical_standard +OptimisticLockException,optimistic_lock_exception +OptimizationMetric,optimization_metric +OptimizationObjective,optimization_objective +OptimizationStatus,optimization_status +OptimizeForEndUserLocation,optimize_for_end_user_location +OptimizePerformance,optimize_performance +OptimizedSharedDelivery,optimized_shared_delivery +OptimizedViewPortWidth,optimized_view_port_width +OptimizingTime,optimizing_time +Option,option +OptionConfiguration,option_configuration +OptionDescription,option_description +OptionGroup,option_group +OptionGroupAlreadyExistsFault,option_group_already_exists_fault +OptionGroupArn,option_group_arn +OptionGroupDescription,option_group_description +OptionGroupMembership,option_group_membership +OptionGroupMemberships,option_group_memberships +OptionGroupName,option_group_name +OptionGroupNotFoundFault,option_group_not_found_fault +OptionGroupOption,option_group_option +OptionGroupOptionSetting,option_group_option_setting +OptionGroupOptionSettings,option_group_option_settings +OptionGroupOptionVersions,option_group_option_versions +OptionGroupOptions,option_group_options +OptionGroupOptionsMessage,option_group_options_message +OptionGroupQuotaExceededFault,option_group_quota_exceeded_fault +OptionGroups,option_groups +OptionGroupsList,option_groups_list +OptionName,option_name +OptionRefId,option_ref_id +OptionRestrictionRegex,option_restriction_regex +OptionSetting,option_setting +OptionSettings,option_settings +OptionSpecification,option_specification +OptionStatus,option_status +OptionVersion,option_version +OptionalDeployment,optional_deployment +OptionalFields,optional_fields +OptionalObjectAttributes,optional_object_attributes +OptionalParameters,optional_parameters +Options,options +OptionsConflictsWith,options_conflicts_with +OptionsDependedOn,options_depended_on +OptionsToInclude,options_to_include +OptionsToRemove,options_to_remove +OpusSettings,opus_settings +Or,or +OrAllFilters,or_all_filters +OrConditions,or_conditions +OrStatement,or_statement +OracleDataProviderSettings,oracle_data_provider_settings +OracleParameters,oracle_parameters +OraclePathPrefix,oracle_path_prefix +OracleSQLCatalogSource,oracle_sql_catalog_source +OracleSQLCatalogTarget,oracle_sql_catalog_target +OracleSettings,oracle_settings +OrcSerDe,orc_ser_de +Order,order +OrderBy,order_by +OrderByElement,order_by_element +OrderFulfilledDate,order_fulfilled_date +OrderId,order_id +OrderSubmissionDate,order_submission_date +OrderSummary,order_summary +OrderType,order_type +OrderableClusterOption,orderable_cluster_option +OrderableClusterOptions,orderable_cluster_options +OrderableClusterOptionsMessage,orderable_cluster_options_message +OrderableDBInstanceOption,orderable_db_instance_option +OrderableDBInstanceOptions,orderable_db_instance_options +OrderableDBInstanceOptionsMessage,orderable_db_instance_options_message +OrderableReplicationInstance,orderable_replication_instance +OrderableReplicationInstances,orderable_replication_instances +OrderedBy,ordered_by +OrderedIndexedAttributeList,ordered_indexed_attribute_list +OrderedPhoneNumber,ordered_phone_number +OrderedPhoneNumbers,ordered_phone_numbers +OrderedRemediationActions,ordered_remediation_actions +OrderedResourceDefinition,ordered_resource_definition +OrderingId,ordering_id +OrderingServiceEndpoint,ordering_service_endpoint +OrderingTimestamp,ordering_timestamp +Orders,orders +Org,org +Organization,organization +OrganizationAccessDeniedException,organization_access_denied_exception +OrganizationAdditionalConfiguration,organization_additional_configuration +OrganizationAdditionalConfigurationResult,organization_additional_configuration_result +OrganizationAffectedEntitiesErrorItem,organization_affected_entities_error_item +OrganizationAggregationSource,organization_aggregation_source +OrganizationAllFeaturesNotEnabledException,organization_all_features_not_enabled_exception +OrganizationArn,organization_arn +OrganizationArns,organization_arns +OrganizationAwsServiceAccessStatus,organization_aws_service_access_status +OrganizationConfigRule,organization_config_rule +OrganizationConfigRuleArn,organization_config_rule_arn +OrganizationConfigRuleDetailedStatus,organization_config_rule_detailed_status +OrganizationConfigRuleName,organization_config_rule_name +OrganizationConfigRuleNames,organization_config_rule_names +OrganizationConfigRuleStatus,organization_config_rule_status +OrganizationConfigRuleStatuses,organization_config_rule_statuses +OrganizationConfigRuleTriggerTypes,organization_config_rule_trigger_types +OrganizationConfigRules,organization_config_rules +OrganizationConfiguration,organization_configuration +OrganizationConformancePack,organization_conformance_pack +OrganizationConformancePackArn,organization_conformance_pack_arn +OrganizationConformancePackDetailedStatus,organization_conformance_pack_detailed_status +OrganizationConformancePackDetailedStatuses,organization_conformance_pack_detailed_statuses +OrganizationConformancePackName,organization_conformance_pack_name +OrganizationConformancePackNames,organization_conformance_pack_names +OrganizationConformancePackStatus,organization_conformance_pack_status +OrganizationConformancePackStatuses,organization_conformance_pack_statuses +OrganizationConformancePackTemplateValidationException,organization_conformance_pack_template_validation_exception +OrganizationConformancePacks,organization_conformance_packs +OrganizationCustomPolicyRuleMetadata,organization_custom_policy_rule_metadata +OrganizationCustomPolicyRuleMetadataNoPolicy,organization_custom_policy_rule_metadata_no_policy +OrganizationCustomRuleMetadata,organization_custom_rule_metadata +OrganizationDataSourceConfigurations,organization_data_source_configurations +OrganizationDataSourceConfigurationsResult,organization_data_source_configurations_result +OrganizationEbsVolumes,organization_ebs_volumes +OrganizationEbsVolumesResult,organization_ebs_volumes_result +OrganizationEnabled,organization_enabled +OrganizationEntityAggregate,organization_entity_aggregate +OrganizationEvent,organization_event +OrganizationEventDetails,organization_event_details +OrganizationEventDetailsErrorItem,organization_event_details_error_item +OrganizationEventFilter,organization_event_filter +OrganizationFeatureConfiguration,organization_feature_configuration +OrganizationFeatureConfigurationResult,organization_feature_configuration_result +OrganizationId,organization_id +OrganizationIntegration,organization_integration +OrganizationKubernetesAuditLogsConfiguration,organization_kubernetes_audit_logs_configuration +OrganizationKubernetesAuditLogsConfigurationResult,organization_kubernetes_audit_logs_configuration_result +OrganizationKubernetesConfiguration,organization_kubernetes_configuration +OrganizationKubernetesConfigurationResult,organization_kubernetes_configuration_result +OrganizationMalwareProtectionConfiguration,organization_malware_protection_configuration +OrganizationMalwareProtectionConfigurationResult,organization_malware_protection_configuration_result +OrganizationManagedRuleMetadata,organization_managed_rule_metadata +OrganizationName,organization_name +OrganizationNode,organization_node +OrganizationNodeType,organization_node_type +OrganizationNodeValue,organization_node_value +OrganizationNodes,organization_nodes +OrganizationNotEmptyException,organization_not_empty_exception +OrganizationNotFoundException,organization_not_found_exception +OrganizationNotInAllFeaturesModeException,organization_not_in_all_features_mode_exception +OrganizationParentId,organization_parent_id +OrganizationResourceCollectionType,organization_resource_collection_type +OrganizationResourceDetailedStatusFilters,organization_resource_detailed_status_filters +OrganizationResourceId,organization_resource_id +OrganizationRuleStatus,organization_rule_status +OrganizationS3LogsConfiguration,organization_s3_logs_configuration +OrganizationS3LogsConfigurationResult,organization_s3_logs_configuration_result +OrganizationScanEc2InstanceWithFindings,organization_scan_ec2_instance_with_findings +OrganizationScanEc2InstanceWithFindingsResult,organization_scan_ec2_instance_with_findings_result +OrganizationSharingStatus,organization_sharing_status +OrganizationSourceType,organization_source_type +OrganizationStateException,organization_state_exception +OrganizationStatus,organization_status +OrganizationSummaries,organization_summaries +OrganizationSummary,organization_summary +OrganizationUnits,organization_units +OrganizationalUnit,organizational_unit +OrganizationalUnitArn,organizational_unit_arn +OrganizationalUnitArns,organizational_unit_arns +OrganizationalUnitDistinguishedName,organizational_unit_distinguished_name +OrganizationalUnitDistinguishedNames,organizational_unit_distinguished_names +OrganizationalUnitId,organizational_unit_id +OrganizationalUnitIds,organizational_unit_ids +OrganizationalUnitNotEmptyException,organizational_unit_not_empty_exception +OrganizationalUnitNotFoundException,organizational_unit_not_found_exception +OrganizationalUnitScope,organizational_unit_scope +OrganizationalUnits,organizational_units +OrganizationsDecisionDetail,organizations_decision_detail +OrganizationsException,organizations_exception +OrganizationsNotInUseException,organizations_not_in_use_exception +OrganizationsPolicyId,organizations_policy_id +Orientation,orientation +OrientationCorrection,orientation_correction +Origin,origin +OriginAccessControl,origin_access_control +OriginAccessControlAlreadyExists,origin_access_control_already_exists +OriginAccessControlConfig,origin_access_control_config +OriginAccessControlId,origin_access_control_id +OriginAccessControlInUse,origin_access_control_in_use +OriginAccessControlList,origin_access_control_list +OriginAccessControlOriginType,origin_access_control_origin_type +OriginAccessControlSummary,origin_access_control_summary +OriginAccessIdentity,origin_access_identity +OriginApprovalRuleTemplate,origin_approval_rule_template +OriginCustomHeader,origin_custom_header +OriginDetails,origin_details +OriginEndpoint,origin_endpoint +OriginEndpointId,origin_endpoint_id +OriginEndpointListConfiguration,origin_endpoint_list_configuration +OriginEndpointName,origin_endpoint_name +OriginEndpoints,origin_endpoints +OriginGroup,origin_group +OriginGroupFailoverCriteria,origin_group_failover_criteria +OriginGroupMember,origin_group_member +OriginGroupMembers,origin_group_members +OriginGroups,origin_groups +OriginId,origin_id +OriginKeepaliveTimeout,origin_keepalive_timeout +OriginManifestType,origin_manifest_type +OriginOverride,origin_override +OriginPath,origin_path +OriginProtocolPolicy,origin_protocol_policy +OriginReadTimeout,origin_read_timeout +OriginRequestPolicy,origin_request_policy +OriginRequestPolicyAlreadyExists,origin_request_policy_already_exists +OriginRequestPolicyConfig,origin_request_policy_config +OriginRequestPolicyCookiesConfig,origin_request_policy_cookies_config +OriginRequestPolicyHeadersConfig,origin_request_policy_headers_config +OriginRequestPolicyId,origin_request_policy_id +OriginRequestPolicyInUse,origin_request_policy_in_use +OriginRequestPolicyList,origin_request_policy_list +OriginRequestPolicyQueryStringsConfig,origin_request_policy_query_strings_config +OriginRequestPolicySummary,origin_request_policy_summary +OriginShield,origin_shield +OriginShieldRegion,origin_shield_region +OriginSnapshot,origin_snapshot +OriginSslProtocols,origin_ssl_protocols +Original,original +OriginalCountryCodeIso2,original_country_code_iso2 +OriginalIops,original_iops +OriginalMessage,original_message +OriginalMessageId,original_message_id +OriginalMultiAttachEnabled,original_multi_attach_enabled +OriginalName,original_name +OriginalParent,original_parent +OriginalPhoneNumber,original_phone_number +OriginalRuleSetName,original_rule_set_name +OriginalSchema,original_schema +OriginalScore,original_score +OriginalSize,original_size +OriginalSnapshotCreateTime,original_snapshot_create_time +OriginalSourceFileSystemArn,original_source_file_system_arn +OriginalStatusCode,original_status_code +OriginalTextCharacters,original_text_characters +OriginalThroughput,original_throughput +OriginalTypeArn,original_type_arn +OriginalTypeName,original_type_name +OriginalVolumeType,original_volume_type +Origination,origination +OriginationIdentities,origination_identities +OriginationIdentity,origination_identity +OriginationIdentityArn,origination_identity_arn +OriginationIdentityMetadata,origination_identity_metadata +OriginationNumber,origination_number +OriginationPhoneNumber,origination_phone_number +OriginationRoute,origination_route +Origins,origins +Os,os +OsArchitecture,os_architecture +OsType,os_type +OsVersion,os_version +OtaaV1_0_x,otaa_v1_0_x +OtaaV1_1,otaa_v1_1 +Other,other +OtherCategories,other_categories +OtherCount,other_count +OtherMetadataValueList,other_metadata_value_list +OtherMetadataValueListItem,other_metadata_value_list_item +OtherName,other_name +OtherNonCompliantCount,other_non_compliant_count +OtherPolicies,other_policies +Otp,otp +OutOfCapacityException,out_of_capacity_exception +OutPutS3Location,out_put_s3_location +OutboundCall,outbound_call +OutboundCallConfig,outbound_call_config +OutboundCallerConfig,outbound_caller_config +OutboundCallerIdName,outbound_caller_id_name +OutboundCallerIdNumberId,outbound_caller_id_number_id +OutboundCalling,outbound_calling +OutboundCallsEnabled,outbound_calls_enabled +OutboundConnection,outbound_connection +OutboundConnectionStatus,outbound_connection_status +OutboundContactNotPermittedException,outbound_contact_not_permitted_exception +OutboundCrossClusterSearchConnection,outbound_cross_cluster_search_connection +OutboundCrossClusterSearchConnectionStatus,outbound_cross_cluster_search_connection_status +OutboundEventsHTTPSEndpoint,outbound_events_https_endpoint +OutboundFlowId,outbound_flow_id +OutboundHeader,outbound_header +OutboundHostName,outbound_host_name +OutboundIp,outbound_ip +OutboundMMS,outbound_mms +OutboundSMS,outbound_sms +OutboundShipment,outbound_shipment +Outcome,outcome +OutgoingCertificate,outgoing_certificate +OutgoingDukptAttributes,outgoing_dukpt_attributes +OutgoingEncryptionAttributes,outgoing_encryption_attributes +OutgoingKeyIdentifier,outgoing_key_identifier +OutgoingTranslationAttributes,outgoing_translation_attributes +OutlierDetection,outlier_detection +OutlierVisibility,outlier_visibility +OutlineColor,outline_color +OutlineSize,outline_size +Outpost,outpost +OutpostArn,outpost_arn +OutpostCapable,outpost_capable +OutpostConfigRequest,outpost_config_request +OutpostConfigResponse,outpost_config_response +OutpostId,outpost_id +OutpostIdentifier,outpost_identifier +OutpostIdentifierFilter,outpost_identifier_filter +OutpostMode,outpost_mode +OutpostOfflineException,outpost_offline_exception +OutpostResolver,outpost_resolver +OutpostResolvers,outpost_resolvers +Outposts,outposts +OutpostsId,outposts_id +Output,output +OutputArn,output_arn +OutputArtifact,output_artifact +OutputArtifacts,output_artifacts +OutputArtifactsToRemove,output_artifacts_to_remove +OutputAttribute,output_attribute +OutputBand,output_band +OutputBands,output_bands +OutputBucket,output_bucket +OutputBucketName,output_bucket_name +OutputBytes,output_bytes +OutputChannel,output_channel +OutputChannelMapping,output_channel_mapping +OutputChannels,output_channels +OutputColumn,output_column +OutputColumnName,output_column_name +OutputColumns,output_columns +OutputCompression,output_compression +OutputConfig,output_config +OutputConfigInput,output_config_input +OutputContext,output_context +OutputDataConfig,output_data_config +OutputDataType,output_data_type +OutputDatasetS3Uri,output_dataset_s3_uri +OutputDescription,output_description +OutputDescriptions,output_descriptions +OutputDestination,output_destination +OutputDestinationSettings,output_destination_settings +OutputDetail,output_detail +OutputDetails,output_details +OutputEncryptionKMSKeyId,output_encryption_kms_key_id +OutputFileUriValue,output_file_uri_value +OutputFilter,output_filter +OutputFormat,output_format +OutputFormatConfiguration,output_format_configuration +OutputFormatOptions,output_format_options +OutputGroup,output_group +OutputGroupDetail,output_group_detail +OutputGroupDetails,output_group_details +OutputGroupSettings,output_group_settings +OutputGroups,output_groups +OutputId,output_id +OutputKey,output_key +OutputKeyPrefix,output_key_prefix +OutputKeys,output_keys +OutputLocation,output_location +OutputLocationRef,output_location_ref +OutputLocationType,output_location_type +OutputLockingMode,output_locking_mode +OutputLockingSettings,output_locking_settings +OutputLogEvent,output_log_event +OutputName,output_name +OutputNotebookFormat,output_notebook_format +OutputNotebookS3Location,output_notebook_s3_location +OutputNotebookS3LocationForOutput,output_notebook_s3_location_for_output +OutputNotebookS3LocationFromInput,output_notebook_s3_location_from_input +OutputNotebookURI,output_notebook_uri +OutputPackageName,output_package_name +OutputPackageVersion,output_package_version +OutputParameter,output_parameter +OutputParameters,output_parameters +OutputRectangle,output_rectangle +OutputReservedInstancesWillExpireAt,output_reserved_instances_will_expire_at +OutputResolution,output_resolution +OutputResolutionResamplingInput,output_resolution_resampling_input +OutputResolutionStackInput,output_resolution_stack_input +OutputResources,output_resources +OutputRows,output_rows +OutputS3BucketName,output_s3_bucket_name +OutputS3KeyPrefix,output_s3_key_prefix +OutputS3Location,output_s3_location +OutputS3Object,output_s3_object +OutputS3Path,output_s3_path +OutputS3Region,output_s3_region +OutputS3Uri,output_s3_uri +OutputSchemaVersion,output_schema_version +OutputSchemas,output_schemas +OutputSdt,output_sdt +OutputSelection,output_selection +OutputSerialization,output_serialization +OutputSettings,output_settings +OutputSource,output_source +OutputSourceId,output_source_id +OutputSourceType,output_source_type +OutputStage,output_stage +OutputStartIndex,output_start_index +OutputTimingSource,output_timing_source +OutputType,output_type +OutputUpdate,output_update +OutputUpdates,output_updates +OutputUri,output_uri +OutputUrl,output_url +OutputValue,output_value +OutputVariablesSizeExceededException,output_variables_size_exceeded_exception +Outputs,outputs +OutsideIpAddress,outside_ip_address +OutsideIpAddressType,outside_ip_address_type +OutstandingVoteCount,outstanding_vote_count +Overage,overage +OverallBestTrainingJob,overall_best_training_job +OverallPlacement,overall_placement +OverallSeverity,overall_severity +OverallTestResultItem,overall_test_result_item +OverallTestResults,overall_test_results +OverallVolume,overall_volume +OverflowColumnHeaderVisibility,overflow_column_header_visibility +Overlap,overlap +OverlapStatus,overlap_status +Overridden,overridden +OverriddenAction,overridden_action +OverriddenContactIds,overridden_contact_ids +OverriddenParameters,overridden_parameters +Override,override +OverrideAction,override_action +OverrideAlreadySetException,override_already_set_exception +OverrideArtifactName,override_artifact_name +OverrideButtonConfiguration,override_button_configuration +OverrideDatasetParameterOperation,override_dataset_parameter_operation +OverrideOptions,override_options +OverrideParameters,override_parameters +OverridePullRequestApprovalRulesInput,override_pull_request_approval_rules_input +OverrideRejection,override_rejection +OverrideStatusRequiredException,override_status_required_exception +Overrides,overrides +OversizeHandling,oversize_handling +OversizedConfigurationItemException,oversized_configuration_item_exception +Overview,overview +Overwrite,overwrite +OverwriteExisting,overwrite_existing +OverwriteExtensionPack,overwrite_extension_pack +OverwriteMode,overwrite_mode +Owner,owner +OwnerAccount,owner_account +OwnerAccountId,owner_account_id +OwnerAlias,owner_alias +OwnerDirectoryDescription,owner_directory_description +OwnerDirectoryId,owner_directory_id +OwnerFilter,owner_filter +OwnerGid,owner_gid +OwnerId,owner_id +OwnerIdentifier,owner_identifier +OwnerIds,owner_ids +OwnerInformation,owner_information +OwnerName,owner_name +OwnerSetting,owner_setting +OwnerType,owner_type +OwnerUid,owner_uid +Owners,owners +OwnershipControls,ownership_controls +OwnershipControlsRule,ownership_controls_rule +OwnershipType,ownership_type +OwnershipVerificationCertificateArn,ownership_verification_certificate_arn +OwnershipVerificationStatus,ownership_verification_status +OwningAccount,owning_account +OwningAccountId,owning_account_id +OwningAccounts,owning_accounts +OwningService,owning_service +P10,p10 +P50,p50 +P75,p75 +P85,p85 +P90,p90 +P95,p95 +P95Metrics,p95_metrics +P99,p99 +P999,p999 +PENDING,pending +PIIDetection,pii_detection +PITPolicyRule,pit_policy_rule +PSTNDialIn,pstn_dial_in +PSTNEnabled,pstn_enabled +PUSH,push +PackageAggregation,package_aggregation +PackageAggregationResponse,package_aggregation_response +PackageArn,package_arn +PackageDependency,package_dependency +PackageDescription,package_description +PackageDetails,package_details +PackageDetailsList,package_details_list +PackageFilter,package_filter +PackageID,package_id +PackageId,package_id +PackageImportJob,package_import_job +PackageImportJobInputConfig,package_import_job_input_config +PackageImportJobOutput,package_import_job_output +PackageImportJobOutputConfig,package_import_job_output_config +PackageImportJobs,package_import_jobs +PackageListItem,package_list_item +PackageManager,package_manager +PackageName,package_name +PackageObject,package_object +PackageObjects,package_objects +PackageOriginConfiguration,package_origin_configuration +PackageOriginRestrictions,package_origin_restrictions +PackagePatchVersion,package_patch_version +PackageSource,package_source +PackageStatus,package_status +PackageSummary,package_summary +PackageType,package_type +PackageVersion,package_version +PackageVersionDescription,package_version_description +PackageVersionError,package_version_error +PackageVersionHistory,package_version_history +PackageVersionHistoryList,package_version_history_list +PackageVersionInputConfig,package_version_input_config +PackageVersionOrigin,package_version_origin +PackageVersionOutputConfig,package_version_output_config +PackageVersionSummary,package_version_summary +PackageVulnerabilityDetails,package_vulnerability_details +Packages,packages +Packaging,packaging +PackagingConfiguration,packaging_configuration +PackagingConfigurationId,packaging_configuration_id +PackagingConfigurations,packaging_configurations +PackagingGroup,packaging_group +PackagingGroupId,packaging_group_id +PackagingGroups,packaging_groups +PackagingType,packaging_type +PackedPolicySize,packed_policy_size +PackedPolicyTooLargeException,packed_policy_too_large_exception +PacketField,packet_field +PacketHeaderStatement,packet_header_statement +PacketHeaderStatementRequest,packet_header_statement_request +PacketIdentifiersMap,packet_identifiers_map +PacketLength,packet_length +PacketsPerSecond,packets_per_second +PadVideo,pad_video +Padding,padding +PaddingControl,padding_control +PaddingPolicy,padding_policy +PaddingTolerance,padding_tolerance +PaddingType,padding_type +Page,page +PageArn,page_arn +PageBreakConfiguration,page_break_configuration +PageClassification,page_classification +PageConfiguration,page_configuration +PageFieldMappings,page_field_mappings +PageId,page_id +PageNumber,page_number +PageResolutions,page_resolutions +PageSize,page_size +PageSizeBytes,page_size_bytes +PageToken,page_token +PageType,page_type +PageTypes,page_types +PagerDutyConfiguration,pager_duty_configuration +PagerDutyIncidentConfiguration,pager_duty_incident_configuration +PagerDutyIncidentDetail,pager_duty_incident_detail +Pages,pages +PaginatedLayoutConfiguration,paginated_layout_configuration +PaginatedReportOptions,paginated_report_options +PaginationConfiguration,pagination_configuration +PaginationToken,pagination_token +PaginationTokenExpiredException,pagination_token_expired_exception +PanSequenceNumber,pan_sequence_number +PanelConfiguration,panel_configuration +PanelTitleOptions,panel_title_options +PaperCanvasSizeOptions,paper_canvas_size_options +PaperMargin,paper_margin +PaperOrientation,paper_orientation +PaperSize,paper_size +Par,par +ParControl,par_control +ParDenominator,par_denominator +ParNumerator,par_numerator +ParallelAsmReadThreads,parallel_asm_read_threads +ParallelDataConfig,parallel_data_config +ParallelDataDataLocation,parallel_data_data_location +ParallelDataNames,parallel_data_names +ParallelDataProperties,parallel_data_properties +ParallelDataPropertiesList,parallel_data_properties_list +ParallelLoadThreads,parallel_load_threads +Parallelism,parallelism +ParallelismConfiguration,parallelism_configuration +ParallelismConfigurationDescription,parallelism_configuration_description +ParallelismConfigurationUpdate,parallelism_configuration_update +ParallelismPerKPU,parallelism_per_kpu +ParallelismPerKPUUpdate,parallelism_per_kpu_update +ParallelismUpdate,parallelism_update +ParallelizationFactor,parallelization_factor +Param,param +Parameter,parameter +ParameterAdditions,parameter_additions +ParameterAlreadyExists,parameter_already_exists +ParameterApplyErrorDescription,parameter_apply_error_description +ParameterApplyStatus,parameter_apply_status +ParameterAttribute,parameter_attribute +ParameterConstraints,parameter_constraints +ParameterControl,parameter_control +ParameterControlId,parameter_control_id +ParameterControls,parameter_controls +ParameterDateTimePickerControl,parameter_date_time_picker_control +ParameterDeclaration,parameter_declaration +ParameterDeclarations,parameter_declarations +ParameterDefinition,parameter_definition +ParameterDefinitions,parameter_definitions +ParameterDropDownControl,parameter_drop_down_control +ParameterFilters,parameter_filters +ParameterGroup,parameter_group +ParameterGroupAlreadyExistsFault,parameter_group_already_exists_fault +ParameterGroupFamily,parameter_group_family +ParameterGroupName,parameter_group_name +ParameterGroupNames,parameter_group_names +ParameterGroupNotFoundFault,parameter_group_not_found_fault +ParameterGroupQuotaExceededFault,parameter_group_quota_exceeded_fault +ParameterGroupStatus,parameter_group_status +ParameterGroups,parameter_groups +ParameterHistory,parameter_history +ParameterInlinePolicy,parameter_inline_policy +ParameterKey,parameter_key +ParameterLimitExceeded,parameter_limit_exceeded +ParameterListControl,parameter_list_control +ParameterMapEntry,parameter_map_entry +ParameterMapping,parameter_mapping +ParameterMaxVersionLimitExceeded,parameter_max_version_limit_exceeded +ParameterMetadata,parameter_metadata +ParameterName,parameter_name +ParameterNameValue,parameter_name_value +ParameterNameValues,parameter_name_values +ParameterNames,parameter_names +ParameterNotFound,parameter_not_found +ParameterObject,parameter_object +ParameterOverrides,parameter_overrides +ParameterPatternMismatchException,parameter_pattern_mismatch_exception +ParameterRange,parameter_range +ParameterRanges,parameter_ranges +ParameterRemovals,parameter_removals +ParameterSelectableValues,parameter_selectable_values +ParameterSliderControl,parameter_slider_control +ParameterSpec,parameter_spec +ParameterStringFilter,parameter_string_filter +ParameterTextAreaControl,parameter_text_area_control +ParameterTextFieldControl,parameter_text_field_control +ParameterType,parameter_type +ParameterValue,parameter_value +ParameterValueConfigurations,parameter_value_configurations +ParameterValueType,parameter_value_type +ParameterValues,parameter_values +ParameterVersion,parameter_version +ParameterVersionLabelLimitExceeded,parameter_version_label_limit_exceeded +ParameterVersionNotFound,parameter_version_not_found +ParameterizedStatement,parameterized_statement +Parameters,parameters +ParametersFilter,parameters_filter +ParametersInCacheKeyAndForwardedToOrigin,parameters_in_cache_key_and_forwarded_to_origin +ParametersToDelete,parameters_to_delete +ParametersToRemove,parameters_to_remove +ParametersValidTo,parameters_valid_to +ParametersValidUntilTimestamp,parameters_valid_until_timestamp +ParametricCloudWatchMonitoringConfiguration,parametric_cloud_watch_monitoring_configuration +ParametricConfigurationOverrides,parametric_configuration_overrides +ParametricMonitoringConfiguration,parametric_monitoring_configuration +ParametricS3MonitoringConfiguration,parametric_s3_monitoring_configuration +Pardot,pardot +PardotConnectorProfileCredentials,pardot_connector_profile_credentials +PardotConnectorProfileProperties,pardot_connector_profile_properties +PardotSourceProperties,pardot_source_properties +Parent,parent +ParentArn,parent_arn +ParentAutomationExecutionId,parent_automation_execution_id +ParentBotNetwork,parent_bot_network +ParentChangeSetId,parent_change_set_id +ParentCommitDoesNotExistException,parent_commit_does_not_exist_exception +ParentCommitIdOutdatedException,parent_commit_id_outdated_exception +ParentCommitIdRequiredException,parent_commit_id_required_exception +ParentComponent,parent_component +ParentEntityUpdateRequest,parent_entity_update_request +ParentFolderArn,parent_folder_arn +ParentFolderId,parent_folder_id +ParentGroupId,parent_group_id +ParentHandshakeId,parent_handshake_id +ParentHyperParameterTuningJob,parent_hyper_parameter_tuning_job +ParentHyperParameterTuningJobs,parent_hyper_parameter_tuning_jobs +ParentId,parent_id +ParentJobId,parent_job_id +ParentLinks,parent_links +ParentName,parent_name +ParentNotFoundException,parent_not_found_exception +ParentPid,parent_pid +ParentReadinessScopes,parent_readiness_scopes +ParentRecoveryPointArn,parent_recovery_point_arn +ParentReference,parent_reference +ParentSavingsPlanOffering,parent_savings_plan_offering +ParentShardId,parent_shard_id +ParentShards,parent_shards +ParentSnapshotId,parent_snapshot_id +ParentUuid,parent_uuid +ParentVolumeId,parent_volume_id +ParentZoneId,parent_zone_id +ParentZoneName,parent_zone_name +Parents,parents +ParentsOfAlarmName,parents_of_alarm_name +Parquet,parquet +ParquetConfiguration,parquet_configuration +ParquetSerDe,parquet_ser_de +ParquetTimestampInMillisecond,parquet_timestamp_in_millisecond +ParquetVersion,parquet_version +ParseFailures,parse_failures +ParsedInputRecords,parsed_input_records +ParsingException,parsing_exception +Part,part +PartListElement,part_list_element +PartNumber,part_number +PartNumberMarker,part_number_marker +PartOfSpeech,part_of_speech +PartOfSpeechTag,part_of_speech_tag +PartSizeInBytes,part_size_in_bytes +PartialFailure,partial_failure +PartialFailureMessage,partial_failure_message +PartialFailureReasons,partial_failure_reasons +PartialMatch,partial_match +PartialMatches,partial_matches +PartialResultsStability,partial_results_stability +Participant,participant +ParticipantCredentials,participant_credentials +ParticipantDetails,participant_details +ParticipantDetailsToAdd,participant_details_to_add +ParticipantId,participant_id +ParticipantPhoneNumbers,participant_phone_numbers +ParticipantRole,participant_role +ParticipantSummary,participant_summary +ParticipantTimerConfigList,participant_timer_config_list +ParticipantTimerConfiguration,participant_timer_configuration +ParticipantToken,participant_token +ParticipantTokenConfiguration,participant_token_configuration +ParticipantTokenCredentials,participant_token_credentials +Participants,participants +ParticipatingGateways,participating_gateways +ParticipatingResource,participating_resource +ParticipatingServer,participating_server +Parties,parties +Partition,partition +PartitionBy,partition_by +PartitionColumn,partition_column +PartitionColumns,partition_columns +PartitionCount,partition_count +PartitionEndDate,partition_end_date +PartitionError,partition_error +PartitionIncludeSchemaTable,partition_include_schema_table +PartitionIndex,partition_index +PartitionIndexDescriptor,partition_index_descriptor +PartitionIndexDescriptorList,partition_index_descriptor_list +PartitionIndexes,partition_indexes +PartitionInput,partition_input +PartitionInputList,partition_input_list +PartitionKey,partition_key +PartitionKeyPath,partition_key_path +PartitionKeys,partition_keys +PartitionLoadFrequency,partition_load_frequency +PartitionNumber,partition_number +PartitionObjects,partition_objects +PartitionPredicate,partition_predicate +PartitionSerialList,partition_serial_list +PartitionStartDate,partition_start_date +PartitionValueList,partition_value_list +PartitionValues,partition_values +Partitions,partitions +PartitionsToDelete,partitions_to_delete +PartitionsToGet,partitions_to_get +PartnerAccountId,partner_account_id +PartnerEventSource,partner_event_source +PartnerEventSourceAccount,partner_event_source_account +PartnerEventSourceAccounts,partner_event_source_accounts +PartnerEventSources,partner_event_sources +PartnerIntegrationInfo,partner_integration_info +PartnerIntegrationInfoList,partner_integration_info_list +PartnerIntegrationInputMessage,partner_integration_input_message +PartnerIntegrationOutputMessage,partner_integration_output_message +PartnerName,partner_name +PartnerNotFoundFault,partner_not_found_fault +PartnerProfileId,partner_profile_id +PartnerType,partner_type +PartnerWatermarking,partner_watermarking +Parts,parts +PartsCount,parts_count +PartyName,party_name +PartyType,party_type +PartyTypeString,party_type_string +PassThroughSettings,pass_through_settings +PassiveIp,passive_ip +Passphrase,passphrase +PassthroughBehavior,passthrough_behavior +PassthroughControl,passthrough_control +Password,password +PasswordCount,password_count +PasswordData,password_data +PasswordField,password_field +PasswordLastUsed,password_last_used +PasswordLength,password_length +PasswordParam,password_param +PasswordPolicy,password_policy +PasswordPolicyType,password_policy_type +PasswordPolicyViolationException,password_policy_violation_exception +PasswordResetRequired,password_reset_required +PasswordResetRequiredException,password_reset_required_exception +PasswordReusePrevention,password_reuse_prevention +PasswordVerifier,password_verifier +Passwords,passwords +PatInterval,pat_interval +Patch,patch +PatchBaselineId,patch_baseline_id +PatchBaselineIdentity,patch_baseline_identity +PatchComplianceData,patch_compliance_data +PatchDocument,patch_document +PatchFilter,patch_filter +PatchFilterGroup,patch_filter_group +PatchFilters,patch_filters +PatchGroup,patch_group +PatchGroupPatchBaselineMapping,patch_group_patch_baseline_mapping +PatchGroups,patch_groups +PatchLevel,patch_level +PatchOperation,patch_operation +PatchOrchestratorFilter,patch_orchestrator_filter +PatchRule,patch_rule +PatchRuleGroup,patch_rule_group +PatchRules,patch_rules +PatchSet,patch_set +PatchSource,patch_source +PatchStatus,patch_status +PatchSummary,patch_summary +PatchVersion,patch_version +Patches,patches +Path,path +PathComponent,path_component +PathDoesNotExistException,path_does_not_exist_exception +PathFilter,path_filter +PathFormat,path_format +PathId,path_id +PathLoss,path_loss +PathMatch,path_match +PathName,path_name +PathOptions,path_options +PathParameterValues,path_parameter_values +PathPattern,path_pattern +PathPatternConditionConfig,path_pattern_condition_config +PathPatternConfig,path_pattern_config +PathPrefix,path_prefix +PathRequestFilter,path_request_filter +PathRequiredException,path_required_exception +PathResourceToId,path_resource_to_id +PathStatement,path_statement +PathStatementRequest,path_statement_request +PathToObjectIdentifiers,path_to_object_identifiers +PathToObjectIdentifiersList,path_to_object_identifiers_list +Paths,paths +Pattern,pattern +PatternName,pattern_name +PatternSetName,pattern_set_name +PatternTypeLimits,pattern_type_limits +Patterns,patterns +PauseCampaignRequest,pause_campaign_request +PauseCluster,pause_cluster +PauseClusterMessage,pause_cluster_message +PauseClusterResult,pause_cluster_result +PauseReplicationRequest,pause_replication_request +PauseServiceRequest,pause_service_request +PauseServiceResponse,pause_service_response +PauseStateScheduleActionSettings,pause_state_schedule_action_settings +PauseStateSettings,pause_state_settings +Payer,payer +PayerResponsibility,payer_responsibility +Payload,payload +PayloadConfig,payload_config +PayloadData,payload_data +PayloadFormatVersion,payload_format_version +PayloadPart,payload_part +PayloadTooLargeException,payload_too_large_exception +PayloadType,payload_type +PaymentDue,payment_due +PaymentOption,payment_option +PaymentTerm,payment_term +Pci,pci +PciId,pci_id +PcrControl,pcr_control +PcrPeriod,pcr_period +PcrPid,pcr_pid +PdfReport,pdf_report +PeakBandwidthInGbps,peak_bandwidth_in_gbps +PeakCalculation,peak_calculation +PeakRequestsPerSecond,peak_requests_per_second +PeerAccountId,peer_account_id +PeerAddress,peer_address +PeerAsn,peer_asn +PeerBgpAsn,peer_bgp_asn +PeerCoreNetworkId,peer_core_network_id +PeerEndpoint,peer_endpoint +PeerEventEndpoint,peer_event_endpoint +PeerLogs,peer_logs +PeerOwnerId,peer_owner_id +PeerRegion,peer_region +PeerTransitGatewayId,peer_transit_gateway_id +PeerVpcAwsAccountId,peer_vpc_aws_account_id +PeerVpcId,peer_vpc_id +PeerVpcResult,peer_vpc_result +Peering,peering +PeeringAttachmentId,peering_attachment_id +PeeringAttachmentStatus,peering_attachment_status +PeeringConnectionOptions,peering_connection_options +PeeringConnectionOptionsRequest,peering_connection_options_request +PeeringId,peering_id +PeeringOptions,peering_options +PeeringStatus,peering_status +PeeringTgwInfo,peering_tgw_info +PeeringType,peering_type +Peerings,peerings +PemEncodedCertificate,pem_encoded_certificate +Pending,pending +PendingActions,pending_actions +PendingAggregationRequest,pending_aggregation_request +PendingAggregationRequests,pending_aggregation_requests +PendingAuthenticationStrategy,pending_authentication_strategy +PendingCapacity,pending_capacity +PendingChange,pending_change +PendingChanges,pending_changes +PendingCloudWatchLogsExports,pending_cloud_watch_logs_exports +PendingCloudwatchLogsExports,pending_cloudwatch_logs_exports +PendingCreateStandbyWorkspacesRequest,pending_create_standby_workspaces_request +PendingDataReplicationMetadata,pending_data_replication_metadata +PendingDataReplicationMode,pending_data_replication_mode +PendingDeletion,pending_deletion +PendingDeletionWindowInDays,pending_deletion_window_in_days +PendingDeploymentSummary,pending_deployment_summary +PendingEngineVersion,pending_engine_version +PendingExpirationSubscribedDomains,pending_expiration_subscribed_domains +PendingHostInstanceType,pending_host_instance_type +PendingHuman,pending_human +PendingImportedDeviceCount,pending_imported_device_count +PendingLdapServerMetadata,pending_ldap_server_metadata +PendingLogDeliveryConfiguration,pending_log_delivery_configuration +PendingLogs,pending_logs +PendingMaintenance,pending_maintenance +PendingMaintenanceAction,pending_maintenance_action +PendingMaintenanceActionDetails,pending_maintenance_action_details +PendingMaintenanceActions,pending_maintenance_actions +PendingMaintenanceActionsMessage,pending_maintenance_actions_message +PendingModifiedRelationalDatabaseValues,pending_modified_relational_database_values +PendingModifiedServiceUpdate,pending_modified_service_update +PendingModifiedValues,pending_modified_values +PendingProductionVariantSummary,pending_production_variant_summary +PendingProperties,pending_properties +PendingRequests,pending_requests +PendingResource,pending_resource +PendingReviewVersion,pending_review_version +PendingSecurityGroups,pending_security_groups +PendingStandbyRequests,pending_standby_requests +PendingTaskCount,pending_task_count +PendingUpdates,pending_updates +PendingVerification,pending_verification +PendingWindowInDays,pending_window_in_days +PerHourPartition,per_hour_partition +PerObjectStatus,per_object_status +PerUnitStorageThroughput,per_unit_storage_throughput +PercentComplete,percent_complete +PercentDone,percent_done +PercentEnabled,percent_enabled +PercentOfClientLocationImpacted,percent_of_client_location_impacted +PercentOfGraphUtilization,percent_of_graph_utilization +PercentOfGraphUtilizationUpdatedTime,percent_of_graph_utilization_updated_time +PercentOfTotalTrafficImpacted,percent_of_total_traffic_impacted +PercentPair,percent_pair +PercentProgress,percent_progress +PercentRange,percent_range +PercentTraffic,percent_traffic +PercentVisibleRange,percent_visible_range +Percentage,percentage +PercentageComplete,percentage_complete +PercentageCompleteOnRollback,percentage_complete_on_rollback +PercentageDisplayFormatConfiguration,percentage_display_format_configuration +PercentageValue,percentage_value +Percentile,percentile +PercentileAggregation,percentile_aggregation +PercentileValue,percentile_value +PerformAutoML,perform_auto_ml +PerformCheckOnly,perform_check_only +PerformHPO,perform_hpo +Performance,performance +PerformanceInsightsEnabled,performance_insights_enabled +PerformanceInsightsKMSKeyId,performance_insights_kms_key_id +PerformanceInsightsKmsKeyId,performance_insights_kms_key_id +PerformanceInsightsMetric,performance_insights_metric +PerformanceInsightsMetricDimensionGroup,performance_insights_metric_dimension_group +PerformanceInsightsMetricQuery,performance_insights_metric_query +PerformanceInsightsMetrics,performance_insights_metrics +PerformanceInsightsMetricsDetail,performance_insights_metrics_detail +PerformanceInsightsReferenceComparisonValues,performance_insights_reference_comparison_values +PerformanceInsightsReferenceData,performance_insights_reference_data +PerformanceInsightsReferenceMetric,performance_insights_reference_metric +PerformanceInsightsReferenceScalar,performance_insights_reference_scalar +PerformanceInsightsRetentionPeriod,performance_insights_retention_period +PerformanceInsightsStat,performance_insights_stat +PerformanceLocalHealthEventsConfig,performance_local_health_events_config +PerformanceMeasurement,performance_measurement +PerformanceMetrics,performance_metrics +PerformanceMode,performance_mode +PerformanceScoreThreshold,performance_score_threshold +Period,period +PeriodAlignment,period_alignment +PeriodInSeconds,period_in_seconds +PeriodOverPeriod,period_over_period +PeriodOverPeriodComputation,period_over_period_computation +PeriodSize,period_size +PeriodTimeGranularity,period_time_granularity +PeriodToDate,period_to_date +PeriodToDateComputation,period_to_date_computation +PeriodTriggers,period_triggers +PeriodType,period_type +PeriodUnit,period_unit +PeriodValue,period_value +PeriodsBackward,periods_backward +PeriodsForward,periods_forward +Permanent,permanent +PermanentDeletionTimeInDays,permanent_deletion_time_in_days +PermanentRestore,permanent_restore +Permission,permission +PermissionAlreadyExistsException,permission_already_exists_exception +PermissionConfiguration,permission_configuration +PermissionEntry,permission_entry +PermissionGroup,permission_group +PermissionGroupByUser,permission_group_by_user +PermissionGroupParams,permission_group_params +PermissionInfo,permission_info +PermissionLimitExceededException,permission_limit_exceeded_exception +PermissionModel,permission_model +PermissionPolicy,permission_policy +PermissionSet,permission_set +PermissionSetArn,permission_set_arn +PermissionSetProvisioningStatus,permission_set_provisioning_status +PermissionSetProvisioningStatusMetadata,permission_set_provisioning_status_metadata +PermissionSets,permission_sets +PermissionSetsProvisioningStatus,permission_sets_provisioning_status +PermissionState,permission_state +PermissionType,permission_type +PermissionTypeMismatchException,permission_type_mismatch_exception +PermissionValues,permission_values +PermissionVersionsLimitExceededException,permission_versions_limit_exceeded_exception +Permissions,permissions +PermissionsBoundary,permissions_boundary +PermissionsBoundaryArn,permissions_boundary_arn +PermissionsBoundaryDecisionDetail,permissions_boundary_decision_detail +PermissionsBoundaryPolicyInputList,permissions_boundary_policy_input_list +PermissionsBoundaryType,permissions_boundary_type +PermissionsBoundaryUsageCount,permissions_boundary_usage_count +PermissionsMode,permissions_mode +PermissionsWithGrantOption,permissions_with_grant_option +PermittedFileTypes,permitted_file_types +PermittedPublicSecurityGroupRuleRanges,permitted_public_security_group_rule_ranges +Persistence,persistence +Persistent,persistent +PersistentChat,persistent_chat +PersistentStorage,persistent_storage +PersistentStorageConfiguration,persistent_storage_configuration +Person,person +PersonDetail,person_detail +PersonDetection,person_detection +PersonMatch,person_match +Persona,persona +PersonalEmailAddress,personal_email_address +PersonalPIN,personal_pin +PersonalizationThresholdSeconds,personalization_threshold_seconds +Personas,personas +PersonasSummary,personas_summary +Persons,persons +PersonsIndeterminate,persons_indeterminate +PersonsWithRequiredEquipment,persons_with_required_equipment +PersonsWithoutRequiredEquipment,persons_without_required_equipment +Phase,phase +Phase1DHGroupNumbers,phase1_dh_group_numbers +Phase1DHGroupNumbersListValue,phase1_dh_group_numbers_list_value +Phase1DHGroupNumbersRequestListValue,phase1_dh_group_numbers_request_list_value +Phase1DhGroupNumbers,phase1_dh_group_numbers +Phase1EncryptionAlgorithms,phase1_encryption_algorithms +Phase1EncryptionAlgorithmsListValue,phase1_encryption_algorithms_list_value +Phase1EncryptionAlgorithmsRequestListValue,phase1_encryption_algorithms_request_list_value +Phase1IntegrityAlgorithms,phase1_integrity_algorithms +Phase1IntegrityAlgorithmsListValue,phase1_integrity_algorithms_list_value +Phase1IntegrityAlgorithmsRequestListValue,phase1_integrity_algorithms_request_list_value +Phase1LifetimeSeconds,phase1_lifetime_seconds +Phase2DHGroupNumbers,phase2_dh_group_numbers +Phase2DHGroupNumbersListValue,phase2_dh_group_numbers_list_value +Phase2DHGroupNumbersRequestListValue,phase2_dh_group_numbers_request_list_value +Phase2DhGroupNumbers,phase2_dh_group_numbers +Phase2EncryptionAlgorithms,phase2_encryption_algorithms +Phase2EncryptionAlgorithmsListValue,phase2_encryption_algorithms_list_value +Phase2EncryptionAlgorithmsRequestListValue,phase2_encryption_algorithms_request_list_value +Phase2IntegrityAlgorithms,phase2_integrity_algorithms +Phase2IntegrityAlgorithmsListValue,phase2_integrity_algorithms_list_value +Phase2IntegrityAlgorithmsRequestListValue,phase2_integrity_algorithms_request_list_value +Phase2LifetimeSeconds,phase2_lifetime_seconds +PhaseContext,phase_context +PhaseControl,phase_control +Phases,phases +PhoneConfig,phone_config +PhoneNumber,phone_number +PhoneNumberArn,phone_number_arn +PhoneNumberAssociation,phone_number_association +PhoneNumberCapabilities,phone_number_capabilities +PhoneNumberCountries,phone_number_countries +PhoneNumberCountry,phone_number_country +PhoneNumberCountryCode,phone_number_country_code +PhoneNumberCountryCodes,phone_number_country_codes +PhoneNumberDescription,phone_number_description +PhoneNumberError,phone_number_error +PhoneNumberErrors,phone_number_errors +PhoneNumberField,phone_number_field +PhoneNumberFields,phone_number_fields +PhoneNumberFilter,phone_number_filter +PhoneNumberId,phone_number_id +PhoneNumberIds,phone_number_ids +PhoneNumberInformation,phone_number_information +PhoneNumberOrder,phone_number_order +PhoneNumberOrderId,phone_number_order_id +PhoneNumberOrders,phone_number_orders +PhoneNumberPoolCountries,phone_number_pool_countries +PhoneNumberPrefix,phone_number_prefix +PhoneNumberQuickConnectConfig,phone_number_quick_connect_config +PhoneNumberStatus,phone_number_status +PhoneNumberSummary,phone_number_summary +PhoneNumberSummaryList,phone_number_summary_list +PhoneNumberType,phone_number_type +PhoneNumberTypes,phone_number_types +PhoneNumberValidateRequest,phone_number_validate_request +PhoneNumberValidateResponse,phone_number_validate_response +PhoneNumbers,phone_numbers +PhoneType,phone_type +PhoneTypeCode,phone_type_code +Phrases,phrases +PhysicalConnectionRequirements,physical_connection_requirements +PhysicalId,physical_id +PhysicalNetworkInterface,physical_network_interface +PhysicalResource,physical_resource +PhysicalResourceId,physical_resource_id +PhysicalResourceIdContext,physical_resource_id_context +PhysicalResourceIdContextKeyValuePair,physical_resource_id_context_key_value_pair +PhysicalTableId,physical_table_id +PhysicalTableMap,physical_table_map +PickupDetails,pickup_details +Pid,pid +PidMode,pid_mode +Pids,pids +PieChartAggregatedFieldWells,pie_chart_aggregated_field_wells +PieChartConfiguration,pie_chart_configuration +PieChartFieldWells,pie_chart_field_wells +PieChartSortConfiguration,pie_chart_sort_configuration +PieChartVisual,pie_chart_visual +PiiEntitiesDetectionJobFilter,pii_entities_detection_job_filter +PiiEntitiesDetectionJobProperties,pii_entities_detection_job_properties +PiiEntitiesDetectionJobPropertiesList,pii_entities_detection_job_properties_list +PiiEntity,pii_entity +PiiEntityTypes,pii_entity_types +PiiOutputDataConfig,pii_output_data_config +PiiType,pii_type +PillarDifference,pillar_difference +PillarDifferences,pillar_differences +PillarId,pillar_id +PillarMetric,pillar_metric +PillarName,pillar_name +PillarNotes,pillar_notes +PillarPriorities,pillar_priorities +PillarReviewSummaries,pillar_review_summaries +PillarReviewSummary,pillar_review_summary +Pillars,pillars +PilotPower,pilot_power +PinBlock,pin_block +PinBlockFormat,pin_block_format +PinData,pin_data +PinDataLength,pin_data_length +PinOffset,pin_offset +PinValidationData,pin_validation_data +PinValidationDataPadCharacter,pin_validation_data_pad_character +PinVerificationKeyIndex,pin_verification_key_index +PingResponse,ping_response +PingSlotDr,ping_slot_dr +PingSlotFreq,ping_slot_freq +PingSlotPeriod,ping_slot_period +PingStatus,ping_status +Pinned,pinned +PinnedFieldOptions,pinned_field_options +PinnedLeftFields,pinned_left_fields +PinpointDestination,pinpoint_destination +Pipe,pipe +PipeEnrichmentHttpParameters,pipe_enrichment_http_parameters +PipeEnrichmentParameters,pipe_enrichment_parameters +PipeSourceActiveMQBrokerParameters,pipe_source_active_mq_broker_parameters +PipeSourceDynamoDBStreamParameters,pipe_source_dynamo_db_stream_parameters +PipeSourceKinesisStreamParameters,pipe_source_kinesis_stream_parameters +PipeSourceManagedStreamingKafkaParameters,pipe_source_managed_streaming_kafka_parameters +PipeSourceParameters,pipe_source_parameters +PipeSourceRabbitMQBrokerParameters,pipe_source_rabbit_mq_broker_parameters +PipeSourceSelfManagedKafkaParameters,pipe_source_self_managed_kafka_parameters +PipeSourceSqsQueueParameters,pipe_source_sqs_queue_parameters +PipeTargetBatchJobParameters,pipe_target_batch_job_parameters +PipeTargetCloudWatchLogsParameters,pipe_target_cloud_watch_logs_parameters +PipeTargetEcsTaskParameters,pipe_target_ecs_task_parameters +PipeTargetEventBridgeEventBusParameters,pipe_target_event_bridge_event_bus_parameters +PipeTargetHttpParameters,pipe_target_http_parameters +PipeTargetKinesisStreamParameters,pipe_target_kinesis_stream_parameters +PipeTargetLambdaFunctionParameters,pipe_target_lambda_function_parameters +PipeTargetParameters,pipe_target_parameters +PipeTargetRedshiftDataParameters,pipe_target_redshift_data_parameters +PipeTargetSageMakerPipelineParameters,pipe_target_sage_maker_pipeline_parameters +PipeTargetSqsQueueParameters,pipe_target_sqs_queue_parameters +PipeTargetStateMachineParameters,pipe_target_state_machine_parameters +Pipeline,pipeline +PipelineActivity,pipeline_activity +PipelineArn,pipeline_arn +PipelineBlueprint,pipeline_blueprint +PipelineBlueprintSummary,pipeline_blueprint_summary +PipelineConfig,pipeline_config +PipelineConfigurationBody,pipeline_configuration_body +PipelineContext,pipeline_context +PipelineDeclaration,pipeline_declaration +PipelineDefinition,pipeline_definition +PipelineDefinitionS3Location,pipeline_definition_s3_location +PipelineDeletedException,pipeline_deleted_exception +PipelineDescription,pipeline_description +PipelineDetail,pipeline_detail +PipelineDetails,pipeline_details +PipelineDisplayName,pipeline_display_name +PipelineExecution,pipeline_execution +PipelineExecutionArn,pipeline_execution_arn +PipelineExecutionDescription,pipeline_execution_description +PipelineExecutionDisplayName,pipeline_execution_display_name +PipelineExecutionFailureReason,pipeline_execution_failure_reason +PipelineExecutionNotFoundException,pipeline_execution_not_found_exception +PipelineExecutionNotStoppableException,pipeline_execution_not_stoppable_exception +PipelineExecutionStatus,pipeline_execution_status +PipelineExecutionStep,pipeline_execution_step +PipelineExecutionStepMetadata,pipeline_execution_step_metadata +PipelineExecutionSteps,pipeline_execution_steps +PipelineExecutionSummaries,pipeline_execution_summaries +PipelineExecutionSummary,pipeline_execution_summary +PipelineExperimentConfig,pipeline_experiment_config +PipelineId,pipeline_id +PipelineIdName,pipeline_id_name +PipelineInfo,pipeline_info +PipelineLockingSettings,pipeline_locking_settings +PipelineMetadata,pipeline_metadata +PipelineName,pipeline_name +PipelineNameInUseException,pipeline_name_in_use_exception +PipelineNamePrefix,pipeline_name_prefix +PipelineNotFoundException,pipeline_not_found_exception +PipelineObject,pipeline_object +PipelineOutputConfig,pipeline_output_config +PipelineParameterList,pipeline_parameter_list +PipelineParameters,pipeline_parameters +PipelinePauseStateSettings,pipeline_pause_state_settings +PipelineStatus,pipeline_status +PipelineStatusReason,pipeline_status_reason +PipelineSummaries,pipeline_summaries +PipelineSummary,pipeline_summary +PipelineVersionNotFoundException,pipeline_version_not_found_exception +Pipelines,pipelines +PipelinesRunningCount,pipelines_running_count +Pipes,pipes +Pitch,pitch +PivotFieldSortOptions,pivot_field_sort_options +PivotTableAggregatedFieldWells,pivot_table_aggregated_field_wells +PivotTableCellConditionalFormatting,pivot_table_cell_conditional_formatting +PivotTableConditionalFormatting,pivot_table_conditional_formatting +PivotTableConditionalFormattingOption,pivot_table_conditional_formatting_option +PivotTableConditionalFormattingScope,pivot_table_conditional_formatting_scope +PivotTableConfiguration,pivot_table_configuration +PivotTableDataPathOption,pivot_table_data_path_option +PivotTableFieldCollapseStateOption,pivot_table_field_collapse_state_option +PivotTableFieldCollapseStateTarget,pivot_table_field_collapse_state_target +PivotTableFieldOption,pivot_table_field_option +PivotTableFieldOptions,pivot_table_field_options +PivotTableFieldSubtotalOptions,pivot_table_field_subtotal_options +PivotTableFieldWells,pivot_table_field_wells +PivotTableOptions,pivot_table_options +PivotTablePaginatedReportOptions,pivot_table_paginated_report_options +PivotTableRowsLabelOptions,pivot_table_rows_label_options +PivotTableSortBy,pivot_table_sort_by +PivotTableSortConfiguration,pivot_table_sort_configuration +PivotTableTotalOptions,pivot_table_total_options +PivotTableVisual,pivot_table_visual +PivotTotalOptions,pivot_total_options +PixelAnomaly,pixel_anomaly +PixelPercent,pixel_percent +Place,place +PlaceGeometry,place_geometry +PlaceId,place_id +PlacedPlayerSession,placed_player_session +PlacedPlayerSessions,placed_player_sessions +Placeholder,placeholder +PlaceholderOptions,placeholder_options +Placement,placement +PlacementArn,placement_arn +PlacementConstraint,placement_constraint +PlacementConstraints,placement_constraints +PlacementDescription,placement_description +PlacementGroup,placement_group +PlacementGroupArn,placement_group_arn +PlacementGroupConfig,placement_group_config +PlacementGroupConfigs,placement_group_configs +PlacementGroupInfo,placement_group_info +PlacementGroups,placement_groups +PlacementId,placement_id +PlacementResponse,placement_response +PlacementStatistics,placement_statistics +PlacementStrategies,placement_strategies +PlacementStrategy,placement_strategy +PlacementSummary,placement_summary +PlacementTemplate,placement_template +PlacementTenancy,placement_tenancy +PlacementType,placement_type +PlainText,plain_text +PlainTextMessage,plain_text_message +PlainTextMessageType,plain_text_message_type +Plaintext,plaintext +Plan,plan +PlanId,plan_id +PlanName,plan_name +PlanType,plan_type +PlannedBudgetLimits,planned_budget_limits +PlannedEndTime,planned_end_time +PlannedStartTime,planned_start_time +PlanningStatistics,planning_statistics +PlanningTimeMillis,planning_time_millis +Platform,platform +PlatformApplication,platform_application +PlatformApplicationArn,platform_application_arn +PlatformApplicationDisabledException,platform_application_disabled_exception +PlatformApplications,platform_applications +PlatformArn,platform_arn +PlatformBranchLifecycleState,platform_branch_lifecycle_state +PlatformBranchName,platform_branch_name +PlatformBranchSummary,platform_branch_summary +PlatformBranchSummaryList,platform_branch_summary_list +PlatformCategory,platform_category +PlatformCommand,platform_command +PlatformDefinitionBundle,platform_definition_bundle +PlatformDescription,platform_description +PlatformDetails,platform_details +PlatformDevice,platform_device +PlatformDifferences,platform_differences +PlatformFilter,platform_filter +PlatformFramework,platform_framework +PlatformIdentifier,platform_identifier +PlatformInput,platform_input +PlatformLifecycleState,platform_lifecycle_state +PlatformName,platform_name +PlatformNotSupportedException,platform_not_supported_exception +PlatformOwner,platform_owner +PlatformProgrammingLanguage,platform_programming_language +PlatformScriptKey,platform_script_key +PlatformSoftwareVersion,platform_software_version +PlatformStatus,platform_status +PlatformSummary,platform_summary +PlatformSummaryList,platform_summary_list +PlatformTaskDefinitionIncompatibilityException,platform_task_definition_incompatibility_exception +PlatformType,platform_type +PlatformTypes,platform_types +PlatformUnknownException,platform_unknown_exception +PlatformVersion,platform_version +PlatformVersionStillReferencedException,platform_version_still_referenced_exception +Platforms,platforms +PlayReadyDrm,play_ready_drm +Playback,playback +PlaybackCompletionEvent,playback_completion_event +PlaybackConfiguration,playback_configuration +PlaybackConfigurationArn,playback_configuration_arn +PlaybackConfigurationName,playback_configuration_name +PlaybackDeviceCompatibility,playback_device_compatibility +PlaybackEndpointPrefix,playback_endpoint_prefix +PlaybackInterruptionEvent,playback_interruption_event +PlaybackKeyPair,playback_key_pair +PlaybackKeyPairSummary,playback_key_pair_summary +PlaybackMode,playback_mode +PlaybackUrl,playback_url +Player,player +PlayerAttributes,player_attributes +PlayerData,player_data +PlayerDataMap,player_data_map +PlayerId,player_id +PlayerIds,player_ids +PlayerLatencies,player_latencies +PlayerLatency,player_latency +PlayerLatencyPolicies,player_latency_policies +PlayerLatencyPolicy,player_latency_policy +PlayerSession,player_session +PlayerSessionCreationPolicy,player_session_creation_policy +PlayerSessionId,player_session_id +PlayerSessionStatusFilter,player_session_status_filter +PlayerSessions,player_sessions +Players,players +Playlist,playlist +PlaylistType,playlist_type +PlaylistWindowSeconds,playlist_window_seconds +Playlists,playlists +Plugin,plugin +PluginDescription,plugin_description +PluginName,plugin_name +PluginSummary,plugin_summary +PluginsS3ObjectVersion,plugins_s3_object_version +PluginsS3Path,plugins_s3_path +PmtInterval,pmt_interval +PmtPid,pmt_pid +PnOffset,pn_offset +PoAttributes,po_attributes +PoDetailAttributes,po_detail_attributes +Point,point +PointInTimeRecovery,point_in_time_recovery +PointInTimeRecoveryDescription,point_in_time_recovery_description +PointInTimeRecoveryEnabled,point_in_time_recovery_enabled +PointInTimeRecoverySpecification,point_in_time_recovery_specification +PointInTimeRecoveryStatus,point_in_time_recovery_status +PointInTimeRecoverySummary,point_in_time_recovery_summary +PointInTimeRecoveryUnavailableException,point_in_time_recovery_unavailable_exception +PointInTimeRestoreNotEnabledFault,point_in_time_restore_not_enabled_fault +PointOfInterest,point_of_interest +PointStyleOptions,point_style_options +PointsOfInterest,points_of_interest +PoisEndpoint,pois_endpoint +Policies,policies +PoliciesGrantingServiceAccess,policies_granting_service_access +PoliciesLimitExceededException,policies_limit_exceeded_exception +PoliciesType,policies_type +Policy,policy +PolicyARN,policy_arn +PolicyARNType,policy_arn_type +PolicyArn,policy_arn +PolicyArns,policy_arns +PolicyAttachment,policy_attachment +PolicyAttribute,policy_attribute +PolicyAttributeDescription,policy_attribute_description +PolicyAttributeDescriptions,policy_attribute_descriptions +PolicyAttributeTypeDescription,policy_attribute_type_description +PolicyAttributeTypeDescriptions,policy_attribute_type_descriptions +PolicyAttributes,policy_attributes +PolicyChangesInProgressException,policy_changes_in_progress_exception +PolicyComplianceDetail,policy_compliance_detail +PolicyComplianceStatus,policy_compliance_status +PolicyComplianceStatusList,policy_compliance_status_list +PolicyContent,policy_content +PolicyCountLimitExceededException,policy_count_limit_exceeded_exception +PolicyDescription,policy_description +PolicyDescriptions,policy_descriptions +PolicyDescriptorType,policy_descriptor_type +PolicyDetail,policy_detail +PolicyDetails,policy_details +PolicyDocument,policy_document +PolicyDurationSeconds,policy_duration_seconds +PolicyEnabled,policy_enabled +PolicyEnforcedException,policy_enforced_exception +PolicyErrorException,policy_error_exception +PolicyErrors,policy_errors +PolicyEvaluationException,policy_evaluation_exception +PolicyExistsCondition,policy_exists_condition +PolicyFilter,policy_filter +PolicyGeneration,policy_generation +PolicyGenerationDetails,policy_generation_details +PolicyGrantingServiceAccess,policy_granting_service_access +PolicyGroup,policy_group +PolicyGroups,policy_groups +PolicyHash,policy_hash +PolicyHashCondition,policy_hash_condition +PolicyId,policy_id +PolicyIds,policy_ids +PolicyInJson,policy_in_json +PolicyInUseException,policy_in_use_exception +PolicyInformation,policy_information +PolicyInputList,policy_input_list +PolicyItem,policy_item +PolicyLengthExceededException,policy_length_exceeded_exception +PolicyLevels,policy_levels +PolicyList,policy_list +PolicyName,policy_name +PolicyNames,policy_names +PolicyNotAttachableException,policy_not_attachable_exception +PolicyNotAttachedException,policy_not_attached_exception +PolicyNotFound,policy_not_found +PolicyNotFoundException,policy_not_found_exception +PolicyOption,policy_option +PolicyOwner,policy_owner +PolicyParameter,policy_parameter +PolicyPeriodInMinutes,policy_period_in_minutes +PolicyQualifierId,policy_qualifier_id +PolicyQualifierInfo,policy_qualifier_info +PolicyQualifiers,policy_qualifiers +PolicyReference,policy_reference +PolicyReferenceName,policy_reference_name +PolicyRevisionId,policy_revision_id +PolicyRole,policy_role +PolicyRoles,policy_roles +PolicyRule,policy_rule +PolicyRuleNumber,policy_rule_number +PolicyRuntime,policy_runtime +PolicySchema,policy_schema +PolicySizeLimitExceededException,policy_size_limit_exceeded_exception +PolicySourceArn,policy_source_arn +PolicyStatus,policy_status +PolicyStoreItem,policy_store_item +PolicySummary,policy_summary +PolicyTargetSummary,policy_target_summary +PolicyTemplateItem,policy_template_item +PolicyText,policy_text +PolicyToPath,policy_to_path +PolicyToPathList,policy_to_path_list +PolicyType,policy_type +PolicyTypeAlreadyEnabledException,policy_type_already_enabled_exception +PolicyTypeDescription,policy_type_description +PolicyTypeDescriptions,policy_type_descriptions +PolicyTypeName,policy_type_name +PolicyTypeNames,policy_type_names +PolicyTypeNotAvailableForOrganizationException,policy_type_not_available_for_organization_exception +PolicyTypeNotEnabledException,policy_type_not_enabled_exception +PolicyTypeNotFoundException,policy_type_not_found_exception +PolicyTypeScope,policy_type_scope +PolicyTypeSummary,policy_type_summary +PolicyTypes,policy_types +PolicyUpdateToken,policy_update_token +PolicyUsageFilter,policy_usage_filter +PolicyUser,policy_user +PolicyUsers,policy_users +PolicyValidationPassed,policy_validation_passed +PolicyVariables,policy_variables +PolicyVersion,policy_version +PolicyVersionId,policy_version_id +PolicyVersionIdentifier,policy_version_identifier +PolicyVersionList,policy_version_list +PoliticalView,political_view +PollForActivityTaskInput,poll_for_activity_task_input +PollForDecisionTaskInput,poll_for_decision_task_input +PollForJobsInput,poll_for_jobs_input +PollForJobsOutput,poll_for_jobs_output +PollForTaskInput,poll_for_task_input +PollForTaskOutput,poll_for_task_output +PollForThirdPartyJobsInput,poll_for_third_party_jobs_input +PollForThirdPartyJobsOutput,poll_for_third_party_jobs_output +PollTimeoutMs,poll_timeout_ms +PollingTime,polling_time +Polygon,polygon +PolygonGeometryInput,polygon_geometry_input +PoolARN,pool_arn +PoolARNs,pool_arns +PoolAddressRange,pool_address_range +PoolAddressRanges,pool_address_ranges +PoolArn,pool_arn +PoolCidrBlock,pool_cidr_block +PoolCidrBlocks,pool_cidr_blocks +PoolCidrs,pool_cidrs +PoolCount,pool_count +PoolDepth,pool_depth +PoolEntryDate,pool_entry_date +PoolFilter,pool_filter +PoolId,pool_id +PoolIds,pool_ids +PoolInfo,pool_info +PoolInformation,pool_information +PoolInfos,pool_infos +PoolName,pool_name +PoolOriginationIdentitiesFilter,pool_origination_identities_filter +PoolSize,pool_size +PoolState,pool_state +PoolStatus,pool_status +PoolTagSpecifications,pool_tag_specifications +Pools,pools +PopulationSize,population_size +Port,port +PortForwardingConfig,port_forwarding_config +PortInfo,port_info +PortMapping,port_mapping +PortMappings,port_mappings +PortName,port_name +PortNumber,port_number +PortOverride,port_override +PortOverrides,port_overrides +PortProbeAction,port_probe_action +PortProbeDetail,port_probe_detail +PortProbeDetails,port_probe_details +PortRange,port_range +PortRangeFilter,port_range_filter +PortRangeFromTo,port_range_from_to +PortRanges,port_ranges +PortRequired,port_required +PortSet,port_set +PortSets,port_sets +Portal,portal +PortalResource,portal_resource +PortalStatus,portal_status +PortalSummary,portal_summary +PortfolioDetail,portfolio_detail +PortfolioDetails,portfolio_details +PortfolioId,portfolio_id +PortfolioShareDetail,portfolio_share_detail +PortfolioShareDetails,portfolio_share_details +PortfolioShareToken,portfolio_share_token +PortfolioShareType,portfolio_share_type +Pose,pose +Position,position +PositionConfigurationItem,position_configuration_item +PositionConfigurationList,position_configuration_list +PositionFiltering,position_filtering +PositionProperties,position_properties +PositionSolverConfigurations,position_solver_configurations +PositionSolverDetails,position_solver_details +PositionalAccuracy,positional_accuracy +PositionalConstraint,positional_constraint +Positioning,positioning +Positive,positive +PositiveColor,positive_color +PosixPermissions,posix_permissions +PosixProfile,posix_profile +PosixUser,posix_user +PossibleRemediationAction,possible_remediation_action +PossibleRemediationActions,possible_remediation_actions +PossibleSecurityGroupRemediationActions,possible_security_group_remediation_actions +PostAction,post_action +PostAgentProfileRequest,post_agent_profile_request +PostAnalyticsProcessorSourceUri,post_analytics_processor_source_uri +PostAuthentication,post_authentication +PostAuthenticationLoginBanner,post_authentication_login_banner +PostCallAnalyticsSettings,post_call_analytics_settings +PostCommentForComparedCommitInput,post_comment_for_compared_commit_input +PostCommentForComparedCommitOutput,post_comment_for_compared_commit_output +PostCommentForPullRequestInput,post_comment_for_pull_request_input +PostCommentForPullRequestOutput,post_comment_for_pull_request_output +PostCommentReplyInput,post_comment_reply_input +PostCommentReplyOutput,post_comment_reply_output +PostConfirmation,post_confirmation +PostContentRequest,post_content_request +PostContentResponse,post_content_response +PostDialogCodeHookInvocationSpecification,post_dialog_code_hook_invocation_specification +PostExtractionHookConfiguration,post_extraction_hook_configuration +PostFilterSharpenStrength,post_filter_sharpen_strength +PostFilterSharpening,post_filter_sharpening +PostFulfillmentStatusSpecification,post_fulfillment_status_specification +PostLaunchActions,post_launch_actions +PostLaunchActionsStatus,post_launch_actions_status +PostProcessFirewallManagerRuleGroups,post_process_firewall_manager_rule_groups +PostSetupScriptDetails,post_setup_script_details +PostTemporalSharpening,post_temporal_sharpening +PostTemporalSharpeningStrength,post_temporal_sharpening_strength +PostTextRequest,post_text_request +PostTextResponse,post_text_response +PostToConnectionRequest,post_to_connection_request +PostTrainingConstraints,post_training_constraints +PostTrainingReport,post_training_report +PostalCode,postal_code +PostgreSQLCatalogSource,postgre_sql_catalog_source +PostgreSQLCatalogTarget,postgre_sql_catalog_target +PostgreSQLSettings,postgre_sql_settings +PostgreSqlDataProviderSettings,postgre_sql_data_provider_settings +PostgreSqlParameters,postgre_sql_parameters +PostureComplianceStatuses,posture_compliance_statuses +PotentialMatches,potential_matches +PowerConnector,power_connector +PowerDrawKva,power_draw_kva +PowerFeedDrop,power_feed_drop +PowerKva,power_kva +PowerPhase,power_phase +PrAllowed,pr_allowed +PreAction,pre_action +PreAuthentication,pre_authentication +PreAuthenticationLoginBanner,pre_authentication_login_banner +PreCoPassword,pre_co_password +PreExtractionHookConfiguration,pre_extraction_hook_configuration +PreHumanTaskLambdaArn,pre_human_task_lambda_arn +PreProcessFirewallManagerRuleGroups,pre_process_firewall_manager_rule_groups +PreSharedKey,pre_shared_key +PreSignUp,pre_sign_up +PreSignedLogUrl,pre_signed_log_url +PreSignedUrl,pre_signed_url +PreTokenGeneration,pre_token_generation +PreTrainingConstraints,pre_training_constraints +PreTrainingReport,pre_training_report +Precedence,precedence +Precision,precision +PrecisionRecallTradeoff,precision_recall_tradeoff +PreconditionFailed,precondition_failed +PreconditionFailedException,precondition_failed_exception +PreconditionNotMetException,precondition_not_met_exception +PreconditionsFailedException,preconditions_failed_exception +Predecessor,predecessor +PredecessorRuns,predecessor_runs +PredecessorsIncluded,predecessors_included +Predefined,predefined +PredefinedHierarchy,predefined_hierarchy +PredefinedIndices,predefined_indices +PredefinedLoadMetricSpecification,predefined_load_metric_specification +PredefinedLoadMetricType,predefined_load_metric_type +PredefinedMetricPairSpecification,predefined_metric_pair_specification +PredefinedMetricSpecification,predefined_metric_specification +PredefinedMetricType,predefined_metric_type +PredefinedScalingMetricSpecification,predefined_scaling_metric_specification +PredefinedScalingMetricType,predefined_scaling_metric_type +Predicate,predicate +PredicateList,predicate_list +Predicates,predicates +PredictEndpoint,predict_endpoint +PredictInput,predict_input +PredictOutput,predict_output +PredictedCapacity,predicted_capacity +PredictedIntent,predicted_intent +PredictedItem,predicted_item +Prediction,prediction +PredictionExplanations,prediction_explanations +PredictionInterval,prediction_interval +PredictionIntervalLevel,prediction_interval_level +PredictionIntervalLowerBound,prediction_interval_lower_bound +PredictionIntervalUpperBound,prediction_interval_upper_bound +PredictionTimeRange,prediction_time_range +Predictions,predictions +PredictiveDialerConfig,predictive_dialer_config +PredictiveScalingConfiguration,predictive_scaling_configuration +PredictiveScalingCustomizedCapacityMetric,predictive_scaling_customized_capacity_metric +PredictiveScalingCustomizedLoadMetric,predictive_scaling_customized_load_metric +PredictiveScalingCustomizedScalingMetric,predictive_scaling_customized_scaling_metric +PredictiveScalingMaxCapacityBehavior,predictive_scaling_max_capacity_behavior +PredictiveScalingMaxCapacityBuffer,predictive_scaling_max_capacity_buffer +PredictiveScalingMetricSpecification,predictive_scaling_metric_specification +PredictiveScalingMode,predictive_scaling_mode +PredictiveScalingPredefinedLoadMetric,predictive_scaling_predefined_load_metric +PredictiveScalingPredefinedMetricPair,predictive_scaling_predefined_metric_pair +PredictiveScalingPredefinedScalingMetric,predictive_scaling_predefined_scaling_metric +PredictorArn,predictor_arn +PredictorBacktestExportJobArn,predictor_backtest_export_job_arn +PredictorBacktestExportJobName,predictor_backtest_export_job_name +PredictorBacktestExportJobSummary,predictor_backtest_export_job_summary +PredictorBacktestExportJobs,predictor_backtest_export_jobs +PredictorBaseline,predictor_baseline +PredictorEvaluationResults,predictor_evaluation_results +PredictorEvent,predictor_event +PredictorExecution,predictor_execution +PredictorExecutionDetails,predictor_execution_details +PredictorExecutions,predictor_executions +PredictorMonitorEvaluation,predictor_monitor_evaluation +PredictorMonitorEvaluations,predictor_monitor_evaluations +PredictorName,predictor_name +PredictorNotMountedException,predictor_not_mounted_exception +PredictorSummary,predictor_summary +Predictors,predictors +PrefectureOrDistrict,prefecture_or_district +Preference,preference +Preferences,preferences +Preferred,preferred +PreferredAuthenticationMethod,preferred_authentication_method +PreferredAvailabilityZone,preferred_availability_zone +PreferredAvailabilityZones,preferred_availability_zones +PreferredBackupWindow,preferred_backup_window +PreferredCacheClusterAZs,preferred_cache_cluster_azs +PreferredChannelPipeline,preferred_channel_pipeline +PreferredFileServerIp,preferred_file_server_ip +PreferredInstanceType,preferred_instance_type +PreferredLanguage,preferred_language +PreferredMaintenanceWindow,preferred_maintenance_window +PreferredMfa,preferred_mfa +PreferredMfaSetting,preferred_mfa_setting +PreferredOutpostArn,preferred_outpost_arn +PreferredOutpostArns,preferred_outpost_arns +PreferredProtocol,preferred_protocol +PreferredSubnetId,preferred_subnet_id +PrefetchConsumption,prefetch_consumption +PrefetchRetrieval,prefetch_retrieval +PrefetchSchedule,prefetch_schedule +Prefix,prefix +PrefixConfig,prefix_config +PrefixForAllResources,prefix_for_all_resources +PrefixLevel,prefix_level +PrefixLevelStorageMetrics,prefix_level_storage_metrics +PrefixList,prefix_list +PrefixListArn,prefix_list_arn +PrefixListAssociation,prefix_list_association +PrefixListAssociations,prefix_list_associations +PrefixListEntry,prefix_list_entry +PrefixListId,prefix_list_id +PrefixListIds,prefix_list_ids +PrefixListName,prefix_list_name +PrefixListOwnerId,prefix_list_owner_id +PrefixLists,prefix_lists +PrefixesCompleted,prefixes_completed +PrefixesFound,prefixes_found +Preload,preload +PreloadDataConfig,preload_data_config +PreloadDataType,preload_data_type +PrepareDuration,prepare_duration +PrepareQueryRequest,prepare_query_request +PrepareQueryResponse,prepare_query_response +PrepareStatus,prepare_status +PreparedStatement,prepared_statement +PreparedStatementNames,prepared_statement_names +PreparedStatementSummary,prepared_statement_summary +PreparedStatements,prepared_statements +PresenterOnlyConfiguration,presenter_only_configuration +PresenterPosition,presenter_position +PreserveClientIp,preserve_client_ip +PreserveDeletedFiles,preserve_deleted_files +PreserveDevices,preserve_devices +PreserveExistingData,preserve_existing_data +PreserveTransactions,preserve_transactions +PreservedExistingData,preserved_existing_data +Preset,preset +PresetDeploymentConfig,preset_deployment_config +PresetDeploymentOutput,preset_deployment_output +PresetDeploymentType,preset_deployment_type +PresetId,preset_id +PresetSettings,preset_settings +PresetSpeke20Audio,preset_speke20_audio +PresetSpeke20Video,preset_speke20_video +PresetWatermark,preset_watermark +PresetWatermarkId,preset_watermark_id +Presets,presets +PresignedUrl,presigned_url +PresignedUrlConfig,presigned_url_config +PrestoParameters,presto_parameters +PreventUserExistenceErrors,prevent_user_existence_errors +Preview,preview +PreviewAgentsRequest,preview_agents_request +PreviewAgentsResponse,preview_agents_response +PreviewGenerationInProgressException,preview_generation_in_progress_exception +PreviewNextCidr,preview_next_cidr +PreviewOverride,preview_override +PreviousActiveModelVersion,previous_active_model_version +PreviousActiveModelVersionArn,previous_active_model_version_arn +PreviousActiveVersion,previous_active_version +PreviousActiveVersionArn,previous_active_version_arn +PreviousAppsList,previous_apps_list +PreviousContactId,previous_contact_id +PreviousEarthObservationJobArn,previous_earth_observation_job_arn +PreviousFleetState,previous_fleet_state +PreviousInvocationTime,previous_invocation_time +PreviousLineItemId,previous_line_item_id +PreviousModelVersionActivatedAt,previous_model_version_activated_at +PreviousOrderId,previous_order_id +PreviousPassword,previous_password +PreviousProtocolsList,previous_protocols_list +PreviousRunId,previous_run_id +PreviousSlotEndTime,previous_slot_end_time +PreviousSpotFleetRequestState,previous_spot_fleet_request_state +PreviousState,previous_state +PreviousStatus,previous_status +PreviousValue,previous_value +PreviousValues,previous_values +PreviousVersion,previous_version +Price,price +PriceClass,price_class +PriceList,price_list +PriceListArn,price_list_arn +PriceLists,price_lists +PricePerUnit,price_per_unit +PriceSchedule,price_schedule +PriceScheduleSpecification,price_schedule_specification +PriceSchedules,price_schedules +PriceUnits,price_units +PriceWithCurrency,price_with_currency +Prices,prices +PricingDetail,pricing_detail +PricingDetails,pricing_details +PricingPlan,pricing_plan +PricingPlanArn,pricing_plan_arn +PricingPlanArns,pricing_plan_arns +PricingPlanDataSource,pricing_plan_data_source +PricingPlanListElement,pricing_plan_list_element +PricingPlans,pricing_plans +PricingRuleArn,pricing_rule_arn +PricingRuleArns,pricing_rule_arns +PricingRuleListElement,pricing_rule_list_element +PricingRules,pricing_rules +Primary,primary +PrimaryAccountId,primary_account_id +PrimaryAccountNumber,primary_account_number +PrimaryAvailabilityZone,primary_availability_zone +PrimaryBackground,primary_background +PrimaryBtn,primary_btn +PrimaryClusterId,primary_cluster_id +PrimaryContainer,primary_container +PrimaryDistributionId,primary_distribution_id +PrimaryEmail,primary_email +PrimaryEmailPrefix,primary_email_prefix +PrimaryEndpoint,primary_endpoint +PrimaryForeground,primary_foreground +PrimaryHost,primary_host +PrimaryIpv6,primary_ipv6 +PrimaryKey,primary_key +PrimaryKeyColumnName,primary_key_column_name +PrimaryKeys,primary_keys +PrimaryMeetingId,primary_meeting_id +PrimaryMetricName,primary_metric_name +PrimaryOutpostArn,primary_outpost_arn +PrimaryProvisionedNumber,primary_provisioned_number +PrimaryRegion,primary_region +PrimaryReplicationGroupId,primary_replication_group_id +PrimarySource,primary_source +PrimaryStatus,primary_status +PrimaryValue,primary_value +PrimaryValueDisplayType,primary_value_display_type +PrimaryValueFontConfiguration,primary_value_font_configuration +PrimaryWorkspaceId,primary_workspace_id +PrimaryYAxisDisplayOptions,primary_y_axis_display_options +PrimaryYAxisLabelOptions,primary_y_axis_label_options +Principal,principal +PrincipalARN,principal_arn +PrincipalArn,principal_arn +PrincipalId,principal_id +PrincipalIdFormat,principal_id_format +PrincipalList,principal_list +PrincipalName,principal_name +PrincipalOrgID,principal_org_id +PrincipalOrgIDs,principal_org_ids +PrincipalPermissions,principal_permissions +PrincipalResourcePermissions,principal_resource_permissions +PrincipalTags,principal_tags +PrincipalType,principal_type +Principals,principals +PriorModelMetrics,prior_model_metrics +PriorRequestNotComplete,prior_request_not_complete +PrioritizeBusinessGoals,prioritize_business_goals +PrioritizedRiskCounts,prioritized_risk_counts +Priority,priority +PriorityConfiguration,priority_configuration +PriorityInUseException,priority_in_use_exception +PriorityOrder,priority_order +Privacy,privacy +PrivacyPolicy,privacy_policy +PrivacyProtectAdminContact,privacy_protect_admin_contact +PrivacyProtectRegistrantContact,privacy_protect_registrant_contact +PrivacyProtectTechContact,privacy_protect_tech_contact +PrivateAddress,private_address +PrivateChannelFilter,private_channel_filter +PrivateConnectionProvisioningState,private_connection_provisioning_state +PrivateDefaultScopeId,private_default_scope_id +PrivateDns,private_dns +PrivateDnsDetails,private_dns_details +PrivateDnsEnabled,private_dns_enabled +PrivateDnsHostnameType,private_dns_hostname_type +PrivateDnsHostnameTypeOnLaunch,private_dns_hostname_type_on_launch +PrivateDnsName,private_dns_name +PrivateDnsNameConfiguration,private_dns_name_configuration +PrivateDnsNameOptions,private_dns_name_options +PrivateDnsNameOptionsOnLaunch,private_dns_name_options_on_launch +PrivateDnsNameOptionsRequest,private_dns_name_options_request +PrivateDnsNameOptionsResponse,private_dns_name_options_response +PrivateDnsNameVerificationState,private_dns_name_verification_state +PrivateDnsNames,private_dns_names +PrivateDnsNamespaceChange,private_dns_namespace_change +PrivateDnsNamespaceProperties,private_dns_namespace_properties +PrivateDnsNamespacePropertiesChange,private_dns_namespace_properties_change +PrivateDnsOnlyForInboundResolverEndpoint,private_dns_only_for_inbound_resolver_endpoint +PrivateDnsPropertiesMutable,private_dns_properties_mutable +PrivateDnsPropertiesMutableChange,private_dns_properties_mutable_change +PrivateIPAddress,private_ip_address +PrivateIPv4Address,private_ipv4_address +PrivateIp,private_ip +PrivateIpAddress,private_ip_address +PrivateIpAddressConfigs,private_ip_address_configs +PrivateIpAddressCount,private_ip_address_count +PrivateIpAddressDetails,private_ip_address_details +PrivateIpAddressSpecification,private_ip_address_specification +PrivateIpAddresses,private_ip_addresses +PrivateKey,private_key +PrivateKeyAttributes,private_key_attributes +PrivateKeyAttributesV2,private_key_attributes_v2 +PrivateKeyAttributesV3,private_key_attributes_v3 +PrivateKeyAttributesV4,private_key_attributes_v4 +PrivateKeyCiphertextBlob,private_key_ciphertext_blob +PrivateKeyFlags,private_key_flags +PrivateKeyFlagsV2,private_key_flags_v2 +PrivateKeyFlagsV3,private_key_flags_v3 +PrivateKeyFlagsV4,private_key_flags_v4 +PrivateKeyPlaintext,private_key_plaintext +PrivateKeys,private_keys +PrivateLinkConfig,private_link_config +PrivateLinkEndpoint,private_link_endpoint +PrivateMetadataPid,private_metadata_pid +PrivateRegistryAccess,private_registry_access +PrivateRegistryAccessRequest,private_registry_access_request +PrivateSkillIds,private_skill_ids +PrivateTypeException,private_type_exception +PrivateZone,private_zone +Privileged,privileged +PrivilegedDelete,privileged_delete +PrivilegedMode,privileged_mode +ProactiveAnomalies,proactive_anomalies +ProactiveAnomaly,proactive_anomaly +ProactiveAnomalySummary,proactive_anomaly_summary +ProactiveEngagementStatus,proactive_engagement_status +ProactiveInsight,proactive_insight +ProactiveInsightSummary,proactive_insight_summary +ProactiveInsights,proactive_insights +ProactiveJoin,proactive_join +ProactiveOrganizationInsightSummary,proactive_organization_insight_summary +Prob,prob +ProbabilityAttribute,probability_attribute +ProbabilityIndex,probability_index +ProbabilityThresholdAttribute,probability_threshold_attribute +Problem,problem +ProblemDetail,problem_detail +ProblemDetails,problem_details +ProblemId,problem_id +ProblemList,problem_list +ProblemType,problem_type +Problems,problems +Process,process +ProcessDetails,process_details +ProcessLaunchedAt,process_launched_at +ProcessName,process_name +ProcessParentPid,process_parent_pid +ProcessPath,process_path +ProcessPid,process_pid +ProcessTerminatedAt,process_terminated_at +ProcessType,process_type +ProcessedAutomationRules,processed_automation_rules +ProcessedClusters,processed_clusters +ProcessedFindings,processed_findings +ProcessedInputRecords,processed_input_records +ProcessedItemCount,processed_item_count +ProcessedRecordsCount,processed_records_count +ProcessedSizeBytes,processed_size_bytes +ProcessedUpdateAction,processed_update_action +ProcessedUpdateActions,processed_update_actions +Processes,processes +ProcessesType,processes_type +Processing,processing +ProcessingClusterConfig,processing_cluster_config +ProcessingConfiguration,processing_configuration +ProcessingEndTime,processing_end_time +ProcessingFeatureStoreOutput,processing_feature_store_output +ProcessingInput,processing_input +ProcessingInputs,processing_inputs +ProcessingJob,processing_job +ProcessingJobArn,processing_job_arn +ProcessingJobName,processing_job_name +ProcessingJobStatus,processing_job_status +ProcessingJobStepMetadata,processing_job_step_metadata +ProcessingJobSummaries,processing_job_summaries +ProcessingJobSummary,processing_job_summary +ProcessingOutput,processing_output +ProcessingOutputConfig,processing_output_config +ProcessingResources,processing_resources +ProcessingResult,processing_result +ProcessingS3Input,processing_s3_input +ProcessingS3Output,processing_s3_output +ProcessingStartTime,processing_start_time +ProcessingStatus,processing_status +ProcessingStatusInfo,processing_status_info +ProcessingStoppingCondition,processing_stopping_condition +ProcessingTimeMilliseconds,processing_time_milliseconds +Processor,processor +ProcessorConfiguration,processor_configuration +ProcessorFeature,processor_feature +ProcessorFeatures,processor_features +ProcessorInfo,processor_info +ProcessorParameter,processor_parameter +Processors,processors +ProducerArn,producer_arn +ProducerTimestamp,producer_timestamp +Product,product +ProductARN,product_arn +ProductArn,product_arn +ProductCode,product_code +ProductCodeId,product_code_id +ProductCodeType,product_code_type +ProductCodes,product_codes +ProductDescription,product_description +ProductDescriptions,product_descriptions +ProductFamily,product_family +ProductFields,product_fields +ProductId,product_id +ProductInformation,product_information +ProductInformationFilter,product_information_filter +ProductInformationFilterComparator,product_information_filter_comparator +ProductInformationFilterList,product_information_filter_list +ProductInformationFilterName,product_information_filter_name +ProductInformationFilterValue,product_information_filter_value +ProductInformationList,product_information_list +ProductLink,product_link +ProductListingIds,product_listing_ids +ProductName,product_name +ProductSKU,product_sku +ProductSource,product_source +ProductSubscriptionArn,product_subscription_arn +ProductSubscriptionResourcePolicy,product_subscription_resource_policy +ProductSubscriptions,product_subscriptions +ProductTitle,product_title +ProductType,product_type +ProductUserSummaries,product_user_summaries +ProductUserSummary,product_user_summary +ProductViewAggregationValue,product_view_aggregation_value +ProductViewAggregations,product_view_aggregations +ProductViewDetail,product_view_detail +ProductViewDetails,product_view_details +ProductViewSummaries,product_view_summaries +ProductViewSummary,product_view_summary +ProductionAccessEnabled,production_access_enabled +ProductionAccessNotGrantedException,production_access_not_granted_exception +ProductionBranch,production_branch +ProductionVariant,production_variant +ProductionVariantCoreDumpConfig,production_variant_core_dump_config +ProductionVariantServerlessConfig,production_variant_serverless_config +ProductionVariantServerlessUpdateConfig,production_variant_serverless_update_config +ProductionVariantStatus,production_variant_status +ProductionVariantSummary,production_variant_summary +ProductionVariants,production_variants +Products,products +Profanity,profanity +Profile,profile +ProfileArn,profile_arn +ProfileArns,profile_arns +ProfileChoice,profile_choice +ProfileColumns,profile_columns +ProfileConfiguration,profile_configuration +ProfileCount,profile_count +ProfileData,profile_data +ProfileDescription,profile_description +ProfileDetail,profile_detail +ProfileDetailResponse,profile_detail_response +ProfileId,profile_id +ProfileIds,profile_ids +ProfileIdsToBeMerged,profile_ids_to_be_merged +ProfileName,profile_name +ProfileNamePrefix,profile_name_prefix +ProfileNotificationSummary,profile_notification_summary +ProfileObjectUniqueKey,profile_object_unique_key +ProfileOwnerType,profile_owner_type +ProfileQuestion,profile_question +ProfileQuestionUpdate,profile_question_update +ProfileQuestions,profile_questions +ProfileShareSummaries,profile_share_summaries +ProfileShareSummary,profile_share_summary +ProfileSummaries,profile_summaries +ProfileSummary,profile_summary +ProfileTemplate,profile_template +ProfileTemplateChoice,profile_template_choice +ProfileTemplateQuestion,profile_template_question +ProfileTime,profile_time +ProfileType,profile_type +ProfileUrl,profile_url +ProfileVersion,profile_version +ProfilerConfig,profiler_config +ProfilerConfigForUpdate,profiler_config_for_update +ProfilerRuleConfiguration,profiler_rule_configuration +ProfilerRuleConfigurations,profiler_rule_configurations +ProfilerRuleEvaluationStatus,profiler_rule_evaluation_status +ProfilerRuleEvaluationStatuses,profiler_rule_evaluation_statuses +Profiles,profiles +ProfilingGroupDescription,profiling_group_description +ProfilingIntervalInMilliseconds,profiling_interval_in_milliseconds +ProfilingParameters,profiling_parameters +ProfilingStatus,profiling_status +ProformaCost,proforma_cost +ProgramCount,program_count +ProgramDateTime,program_date_time +ProgramDateTimeClock,program_date_time_clock +ProgramDateTimeIntervalSeconds,program_date_time_interval_seconds +ProgramDateTimePeriod,program_date_time_period +ProgramId,program_id +ProgramName,program_name +ProgramNum,program_num +ProgramNumber,program_number +ProgramSelection,program_selection +ProgrammingLang,programming_lang +ProgrammingLanguages,programming_languages +Progress,progress +ProgressBar,progress_bar +ProgressBarOptions,progress_bar_options +ProgressCounters,progress_counters +ProgressDetail,progress_detail +ProgressDetails,progress_details +ProgressDetailsOnRollback,progress_details_on_rollback +ProgressEvent,progress_event +ProgressInMegaBytes,progress_in_mega_bytes +ProgressPercent,progress_percent +ProgressPercentage,progress_percentage +ProgressReport,progress_report +ProgressStatus,progress_status +ProgressSummary,progress_summary +ProgressUpdateStream,progress_update_stream +ProgressUpdateStreamName,progress_update_stream_name +ProgressUpdateStreamSummary,progress_update_stream_summary +ProgressUpdateStreamSummaryList,progress_update_stream_summary_list +Progressing,progressing +ProgressingJobsCount,progressing_jobs_count +ProgressiveDialerConfig,progressive_dialer_config +ProgressiveWriteHlsManifest,progressive_write_hls_manifest +ProhibitedStateException,prohibited_state_exception +Project,project +ProjectAlreadyExistsException,project_already_exists_exception +ProjectAppConfigResource,project_app_config_resource +ProjectAppConfigResourceConfig,project_app_config_resource_config +ProjectArn,project_arn +ProjectArtifacts,project_artifacts +ProjectBadge,project_badge +ProjectBuildBatchConfig,project_build_batch_config +ProjectCache,project_cache +ProjectConfigurationException,project_configuration_exception +ProjectCreationFailedException,project_creation_failed_exception +ProjectDataDelivery,project_data_delivery +ProjectDataDeliveryConfig,project_data_delivery_config +ProjectDescription,project_description +ProjectDescriptions,project_descriptions +ProjectDetails,project_details +ProjectEnvironment,project_environment +ProjectFieldMappings,project_field_mappings +ProjectFileSystemLocation,project_file_system_location +ProjectId,project_id +ProjectInformation,project_information +ProjectListFilter,project_list_filter +ProjectMetadata,project_metadata +ProjectName,project_name +ProjectNames,project_names +ProjectNotFoundException,project_not_found_exception +ProjectOperation,project_operation +ProjectPolicies,project_policies +ProjectPolicy,project_policy +ProjectResource,project_resource +ProjectSource,project_source +ProjectSourceVersion,project_source_version +ProjectStatus,project_status +ProjectSummary,project_summary +ProjectSummaryList,project_summary_list +ProjectVersionArn,project_version_arn +ProjectVersionDescription,project_version_description +ProjectVersionDescriptions,project_version_descriptions +ProjectedColumns,projected_columns +ProjectedInbox,projected_inbox +ProjectedMetric,projected_metric +ProjectedSpam,projected_spam +ProjectedVolume,projected_volume +Projection,projection +ProjectionExpression,projection_expression +ProjectionType,projection_type +Projects,projects +Prometheus,prometheus +PrometheusInfo,prometheus_info +PromoteMode,promote_mode +PromotePermissionCreatedFromPolicyRequest,promote_permission_created_from_policy_request +PromotePermissionCreatedFromPolicyResponse,promote_permission_created_from_policy_response +PromoteReadReplicaDBClusterMessage,promote_read_replica_db_cluster_message +PromoteReadReplicaDBClusterResult,promote_read_replica_db_cluster_result +PromoteReadReplicaMessage,promote_read_replica_message +PromoteReadReplicaResult,promote_read_replica_result +PromoteRequest,promote_request +PromoteResourceShareCreatedFromPolicyRequest,promote_resource_share_created_from_policy_request +PromoteResourceShareCreatedFromPolicyResponse,promote_resource_share_created_from_policy_response +PromoteResponse,promote_response +Promotion,promotion +PromotionTier,promotion_tier +PromotionalMessagesPerSecond,promotional_messages_per_second +Prompt,prompt +PromptARN,prompt_arn +PromptAttemptSpecification,prompt_attempt_specification +PromptId,prompt_id +PromptPresignedUrl,prompt_presigned_url +PromptSearchCriteria,prompt_search_criteria +PromptSearchFilter,prompt_search_filter +PromptSpecification,prompt_specification +PromptSummary,prompt_summary +PromptSummaryList,prompt_summary_list +Prompts,prompts +Proof,proof +PropagateAtLaunch,propagate_at_launch +PropagateTags,propagate_tags +PropagatingVgw,propagating_vgw +PropagatingVgwSet,propagating_vgw_set +PropagatingVgwSetDetails,propagating_vgw_set_details +PropagatingVgws,propagating_vgws +Propagation,propagation +PropagationDefaultRouteTableId,propagation_default_route_table_id +Properties,properties +PropertiesToDelete,properties_to_delete +PropertiesToRemove,properties_to_remove +Property,property +PropertyDefinitionRequest,property_definition_request +PropertyDefinitionResponse,property_definition_response +PropertyDifference,property_difference +PropertyDifferences,property_differences +PropertyFilter,property_filter +PropertyFilters,property_filters +PropertyGroup,property_group +PropertyGroupDescriptions,property_group_descriptions +PropertyGroupId,property_group_id +PropertyGroupRequest,property_group_request +PropertyGroupResponse,property_group_response +PropertyGroups,property_groups +PropertyLatestValue,property_latest_value +PropertyList,property_list +PropertyMap,property_map +PropertyName,property_name +PropertyNameHint,property_name_hint +PropertyNameQuery,property_name_query +PropertyNameSuggestion,property_name_suggestion +PropertyNameSuggestions,property_name_suggestions +PropertyNotification,property_notification +PropertyPath,property_path +PropertyPredicate,property_predicate +PropertyRequest,property_request +PropertyResponse,property_response +PropertyRole,property_role +PropertyType,property_type +PropertyUsage,property_usage +PropertyValidationException,property_validation_exception +PropertyValidationExceptionProperty,property_validation_exception_property +PropertyValue,property_value +PropertyValueEntry,property_value_entry +PropertyValueHistory,property_value_history +PropertygraphData,propertygraph_data +PropertygraphRecord,propertygraph_record +PropertygraphSummary,propertygraph_summary +PropertygraphSummaryValueMap,propertygraph_summary_value_map +Proposal,proposal +ProposalActions,proposal_actions +ProposalDurationInHours,proposal_duration_in_hours +ProposalId,proposal_id +ProposalSummary,proposal_summary +ProposalVotes,proposal_votes +Proposals,proposals +Proposed,proposed +ProposedByMemberId,proposed_by_member_id +ProposedByMemberName,proposed_by_member_name +ProposedConfiguration,proposed_configuration +ProposedMultiRegionAccessPointPolicy,proposed_multi_region_access_point_policy +ProposedPassword,proposed_password +ProposedSegmentChange,proposed_segment_change +ProprietaryAuthenticationData,proprietary_authentication_data +ProresSettings,prores_settings +ProtectedFromScaleIn,protected_from_scale_in +ProtectedQuery,protected_query +ProtectedQueryError,protected_query_error +ProtectedQueryResult,protected_query_result +ProtectedQueryResultConfiguration,protected_query_result_configuration +ProtectedQueryS3Output,protected_query_s3_output +ProtectedQueryS3OutputConfiguration,protected_query_s3_output_configuration +ProtectedQuerySQLParameters,protected_query_sql_parameters +ProtectedQuerySingleMemberOutput,protected_query_single_member_output +ProtectedQueryStatistics,protected_query_statistics +ProtectedQuerySummary,protected_query_summary +ProtectedResource,protected_resource +ProtectedResourceTypeLimits,protected_resource_type_limits +ProtectedTask,protected_task +Protection,protection +ProtectionArn,protection_arn +ProtectionGroup,protection_group +ProtectionGroupArbitraryPatternLimits,protection_group_arbitrary_pattern_limits +ProtectionGroupArn,protection_group_arn +ProtectionGroupId,protection_group_id +ProtectionGroupIds,protection_group_ids +ProtectionGroupLimits,protection_group_limits +ProtectionGroupPatternTypeLimits,protection_group_pattern_type_limits +ProtectionGroups,protection_groups +ProtectionId,protection_id +ProtectionLimits,protection_limits +ProtectionNames,protection_names +ProtectionPolicy,protection_policy +Protections,protections +ProtectiveEquipmentBodyPart,protective_equipment_body_part +ProtectiveEquipmentModelVersion,protective_equipment_model_version +ProtectiveEquipmentPerson,protective_equipment_person +ProtectiveEquipmentSummarizationAttributes,protective_equipment_summarization_attributes +ProtectiveEquipmentSummary,protective_equipment_summary +Protocol,protocol +ProtocolDetails,protocol_details +ProtocolType,protocol_type +ProtocolVersion,protocol_version +Protocols,protocols +ProtocolsList,protocols_list +ProtocolsListArn,protocols_list_arn +ProtocolsListData,protocols_list_data +ProtocolsListDataSummary,protocols_list_data_summary +ProtocolsLists,protocols_lists +ProvideAnomalyFeedbackRequest,provide_anomaly_feedback_request +ProvideAnomalyFeedbackResponse,provide_anomaly_feedback_response +ProvidedContext,provided_context +ProvidedContexts,provided_contexts +Provider,provider +ProviderArn,provider_arn +ProviderAttributeName,provider_attribute_name +ProviderAttributeValue,provider_attribute_value +ProviderCalendarId,provider_calendar_id +ProviderDescription,provider_description +ProviderDetails,provider_details +ProviderEndpoint,provider_endpoint +ProviderId,provider_id +ProviderName,provider_name +ProviderType,provider_type +ProviderTypeFilter,provider_type_filter +ProviderTypes,provider_types +ProviderUserIdentifierType,provider_user_identifier_type +Providers,providers +Province,province +ProvisionByoipCidrRequest,provision_byoip_cidr_request +ProvisionByoipCidrResponse,provision_byoip_cidr_response +ProvisionByoipCidrResult,provision_byoip_cidr_result +ProvisionData,provision_data +ProvisionDeviceRequest,provision_device_request +ProvisionDeviceResponse,provision_device_response +ProvisionIpamPoolCidrRequest,provision_ipam_pool_cidr_request +ProvisionIpamPoolCidrResult,provision_ipam_pool_cidr_result +ProvisionPermissionSetRequest,provision_permission_set_request +ProvisionPermissionSetRequestId,provision_permission_set_request_id +ProvisionPermissionSetResponse,provision_permission_set_response +ProvisionProductId,provision_product_id +ProvisionProductInput,provision_product_input +ProvisionProductName,provision_product_name +ProvisionProductOutput,provision_product_output +ProvisionPublicIpv4PoolCidrRequest,provision_public_ipv4_pool_cidr_request +ProvisionPublicIpv4PoolCidrResult,provision_public_ipv4_pool_cidr_result +ProvisionState,provision_state +ProvisionTime,provision_time +ProvisionToken,provision_token +ProvisionalConfiguration,provisional_configuration +Provisioned,provisioned +ProvisionedBandwidth,provisioned_bandwidth +ProvisionedCapacity,provisioned_capacity +ProvisionedCapacityDescription,provisioned_capacity_description +ProvisionedCapacityList,provisioned_capacity_list +ProvisionedCapacityUnits,provisioned_capacity_units +ProvisionedCapacityUpdate,provisioned_capacity_update +ProvisionedConcurrency,provisioned_concurrency +ProvisionedConcurrencyConfigListItem,provisioned_concurrency_config_list_item +ProvisionedConcurrencyConfigNotFoundException,provisioned_concurrency_config_not_found_exception +ProvisionedConcurrencyConfigs,provisioned_concurrency_configs +ProvisionedConcurrentExecutions,provisioned_concurrent_executions +ProvisionedIops,provisioned_iops +ProvisionedIopsNotAvailableInAZFault,provisioned_iops_not_available_in_az_fault +ProvisionedModelSummary,provisioned_model_summary +ProvisionedOnDemandCapacity,provisioned_on_demand_capacity +ProvisionedProductAttribute,provisioned_product_attribute +ProvisionedProductDetail,provisioned_product_detail +ProvisionedProductId,provisioned_product_id +ProvisionedProductName,provisioned_product_name +ProvisionedProductPlanDetails,provisioned_product_plan_details +ProvisionedProductPlanSummary,provisioned_product_plan_summary +ProvisionedProductPlans,provisioned_product_plans +ProvisionedProductProperties,provisioned_product_properties +ProvisionedProductStatusMessage,provisioned_product_status_message +ProvisionedProductType,provisioned_product_type +ProvisionedProducts,provisioned_products +ProvisionedReadCapacityAutoScalingSettings,provisioned_read_capacity_auto_scaling_settings +ProvisionedReadCapacityAutoScalingSettingsUpdate,provisioned_read_capacity_auto_scaling_settings_update +ProvisionedReadCapacityAutoScalingUpdate,provisioned_read_capacity_auto_scaling_update +ProvisionedReadCapacityUnits,provisioned_read_capacity_units +ProvisionedRequest,provisioned_request +ProvisionedResource,provisioned_resource +ProvisionedSpotCapacity,provisioned_spot_capacity +ProvisionedStorageThroughput,provisioned_storage_throughput +ProvisionedThroughput,provisioned_throughput +ProvisionedThroughputDescription,provisioned_throughput_description +ProvisionedThroughputExceededException,provisioned_throughput_exceeded_exception +ProvisionedThroughputInMibps,provisioned_throughput_in_mibps +ProvisionedThroughputOverride,provisioned_throughput_override +ProvisionedWriteCapacityAutoScalingSettings,provisioned_write_capacity_auto_scaling_settings +ProvisionedWriteCapacityAutoScalingSettingsUpdate,provisioned_write_capacity_auto_scaling_settings_update +ProvisionedWriteCapacityAutoScalingUpdate,provisioned_write_capacity_auto_scaling_update +ProvisionedWriteCapacityUnits,provisioned_write_capacity_units +ProvisioningArtifact,provisioning_artifact +ProvisioningArtifactDetail,provisioning_artifact_detail +ProvisioningArtifactDetails,provisioning_artifact_details +ProvisioningArtifactId,provisioning_artifact_id +ProvisioningArtifactMetadata,provisioning_artifact_metadata +ProvisioningArtifactName,provisioning_artifact_name +ProvisioningArtifactOutput,provisioning_artifact_output +ProvisioningArtifactOutputKeys,provisioning_artifact_output_keys +ProvisioningArtifactOutputs,provisioning_artifact_outputs +ProvisioningArtifactParameter,provisioning_artifact_parameter +ProvisioningArtifactParameters,provisioning_artifact_parameters +ProvisioningArtifactPreferences,provisioning_artifact_preferences +ProvisioningArtifactProperties,provisioning_artifact_properties +ProvisioningArtifactSummaries,provisioning_artifact_summaries +ProvisioningArtifactSummary,provisioning_artifact_summary +ProvisioningArtifactView,provisioning_artifact_view +ProvisioningArtifactViews,provisioning_artifact_views +ProvisioningArtifacts,provisioning_artifacts +ProvisioningHook,provisioning_hook +ProvisioningParameter,provisioning_parameter +ProvisioningParameters,provisioning_parameters +ProvisioningPreferences,provisioning_preferences +ProvisioningStatus,provisioning_status +ProvisioningTemplateSummary,provisioning_template_summary +ProvisioningTemplateVersionSummary,provisioning_template_version_summary +ProvisioningType,provisioning_type +Proximity,proximity +ProximityEventConfiguration,proximity_event_configuration +ProximityResourceTypeEventConfiguration,proximity_resource_type_event_configuration +Proxy,proxy +ProxyConfiguration,proxy_configuration +ProxyConfigurationProperties,proxy_configuration_properties +ProxyPhoneNumber,proxy_phone_number +ProxySession,proxy_session +ProxySessionId,proxy_session_id +ProxySessions,proxy_sessions +ProxyType,proxy_type +ProxyUrl,proxy_url +PsAttributes,ps_attributes +PsDetailAttributes,ps_detail_attributes +Psc,psc +PseudoTerminal,pseudo_terminal +Pseudonym,pseudonym +PsiControl,psi_control +PtrRecord,ptr_record +PtrRecordUpdate,ptr_record_update +PtrUpdateStatus,ptr_update_status +PtsOffset,pts_offset +PtsOffsetHandlingForBFrames,pts_offset_handling_for_b_frames +PtsOffsetMode,pts_offset_mode +Public,public +PublicAccess,public_access +PublicAccessBlock,public_access_block +PublicAccessBlockConfiguration,public_access_block_configuration +PublicAccessBlockEnabled,public_access_block_enabled +PublicAddress,public_address +PublicAddressAllocationIds,public_address_allocation_ids +PublicBaseImageReleasedDate,public_base_image_released_date +PublicChannelFilter,public_channel_filter +PublicContent,public_content +PublicDefaultScopeId,public_default_scope_id +PublicDns,public_dns +PublicDnsName,public_dns_name +PublicDnsNamespaceChange,public_dns_namespace_change +PublicDnsNamespaceProperties,public_dns_namespace_properties +PublicDnsNamespacePropertiesChange,public_dns_namespace_properties_change +PublicDnsPropertiesMutable,public_dns_properties_mutable +PublicDnsPropertiesMutableChange,public_dns_properties_mutable_change +PublicEndpoint,public_endpoint +PublicIPAddress,public_ip_address +PublicIp,public_ip +PublicIpAddress,public_ip_address +PublicIpSource,public_ip_source +PublicIps,public_ips +PublicIpv4Pool,public_ipv4_pool +PublicIpv4PoolRange,public_ipv4_pool_range +PublicIpv4Pools,public_ipv4_pools +PublicKey,public_key +PublicKeyAlreadyExists,public_key_already_exists +PublicKeyCertificate,public_key_certificate +PublicKeyConfig,public_key_config +PublicKeyId,public_key_id +PublicKeyInUse,public_key_in_use +PublicKeyList,public_key_list +PublicKeyMaterial,public_key_material +PublicKeyRotationTimestamp,public_key_rotation_timestamp +PublicKeySummary,public_key_summary +PublicKeyVersion,public_key_version +PublicKeys,public_keys +PublicPolicyException,public_policy_exception +PublicSharingEnabled,public_sharing_enabled +PublicSubject,public_subject +PublicTypeArn,public_type_arn +PublicVersionNumber,public_version_number +PublicWorkforceTaskPrice,public_workforce_task_price +PublicZoneVPCAssociation,public_zone_vpc_association +Publication,publication +Publications,publications +PubliclyAccessible,publicly_accessible +PubliclyAdvertisable,publicly_advertisable +Publish,publish +PublishAppVersionRequest,publish_app_version_request +PublishAppVersionResponse,publish_app_version_response +PublishBatchInput,publish_batch_input +PublishBatchRequestEntries,publish_batch_request_entries +PublishBatchRequestEntry,publish_batch_request_entry +PublishBatchResponse,publish_batch_response +PublishBatchResultEntry,publish_batch_result_entry +PublishCloudWatchMetricsEnabled,publish_cloud_watch_metrics_enabled +PublishFindingToSnsParams,publish_finding_to_sns_params +PublishFunctionRequest,publish_function_request +PublishFunctionResult,publish_function_result +PublishInput,publish_input +PublishLayerVersionRequest,publish_layer_version_request +PublishLayerVersionResponse,publish_layer_version_response +PublishMetricAction,publish_metric_action +PublishMetricsInput,publish_metrics_input +PublishPackageVersionRequest,publish_package_version_request +PublishPackageVersionResult,publish_package_version_result +PublishRecipeRequest,publish_recipe_request +PublishRecipeResponse,publish_recipe_response +PublishRequest,publish_request +PublishResponse,publish_response +PublishSchemaRequest,publish_schema_request +PublishSchemaResponse,publish_schema_response +PublishStateMachineVersionInput,publish_state_machine_version_input +PublishStateMachineVersionOutput,publish_state_machine_version_output +PublishStatus,publish_status +PublishTimestamp,publish_timestamp +PublishTypeInput,publish_type_input +PublishTypeOutput,publish_type_output +PublishVersionRequest,publish_version_request +PublishedBy,published_by +PublishedDate,published_date +PublishedSchemaArn,published_schema_arn +PublishedVersionNumber,published_version_number +PublishedVersions,published_versions +PublisherId,publisher_id +PublisherIdentity,publisher_identity +PublisherName,publisher_name +PublisherProfile,publisher_profile +PublisherStatus,publisher_status +PublishingFailureStartTimestamp,publishing_failure_start_timestamp +PublishingOptions,publishing_options +PullRequest,pull_request +PullRequestAlreadyClosedException,pull_request_already_closed_exception +PullRequestApprovalRulesNotSatisfiedException,pull_request_approval_rules_not_satisfied_exception +PullRequestCannotBeApprovedByAuthorException,pull_request_cannot_be_approved_by_author_exception +PullRequestCreatedEventMetadata,pull_request_created_event_metadata +PullRequestDoesNotExistException,pull_request_does_not_exist_exception +PullRequestEvent,pull_request_event +PullRequestId,pull_request_id +PullRequestIdRequiredException,pull_request_id_required_exception +PullRequestMergedStateChangedEventMetadata,pull_request_merged_state_changed_event_metadata +PullRequestSourceReferenceUpdatedEventMetadata,pull_request_source_reference_updated_event_metadata +PullRequestStatusChangedEventMetadata,pull_request_status_changed_event_metadata +PullRequestStatusRequiredException,pull_request_status_required_exception +PullRequestTarget,pull_request_target +PullThroughCacheRule,pull_through_cache_rule +PullThroughCacheRuleAlreadyExistsException,pull_through_cache_rule_already_exists_exception +PullThroughCacheRuleNotFoundException,pull_through_cache_rule_not_found_exception +Purchase,purchase +PurchaseHostReservationRequest,purchase_host_reservation_request +PurchaseHostReservationResult,purchase_host_reservation_result +PurchaseOfferingRequest,purchase_offering_request +PurchaseOfferingResponse,purchase_offering_response +PurchaseOfferingResult,purchase_offering_result +PurchaseProvisionedCapacityInput,purchase_provisioned_capacity_input +PurchaseProvisionedCapacityOutput,purchase_provisioned_capacity_output +PurchaseRequest,purchase_request +PurchaseRequests,purchase_requests +PurchaseReservedCacheNodesOfferingMessage,purchase_reserved_cache_nodes_offering_message +PurchaseReservedCacheNodesOfferingResult,purchase_reserved_cache_nodes_offering_result +PurchaseReservedDBInstancesOfferingMessage,purchase_reserved_db_instances_offering_message +PurchaseReservedDBInstancesOfferingResult,purchase_reserved_db_instances_offering_result +PurchaseReservedElasticsearchInstanceOfferingRequest,purchase_reserved_elasticsearch_instance_offering_request +PurchaseReservedElasticsearchInstanceOfferingResponse,purchase_reserved_elasticsearch_instance_offering_response +PurchaseReservedInstanceOfferingRequest,purchase_reserved_instance_offering_request +PurchaseReservedInstanceOfferingResponse,purchase_reserved_instance_offering_response +PurchaseReservedInstancesOfferingRequest,purchase_reserved_instances_offering_request +PurchaseReservedInstancesOfferingResult,purchase_reserved_instances_offering_result +PurchaseReservedNodeOfferingMessage,purchase_reserved_node_offering_message +PurchaseReservedNodeOfferingResult,purchase_reserved_node_offering_result +PurchaseReservedNodesOfferingRequest,purchase_reserved_nodes_offering_request +PurchaseReservedNodesOfferingResponse,purchase_reserved_nodes_offering_response +PurchaseScheduledInstancesRequest,purchase_scheduled_instances_request +PurchaseScheduledInstancesResult,purchase_scheduled_instances_result +PurchaseTime,purchase_time +PurchaseToken,purchase_token +PurchasedAt,purchased_at +PurchasedHours,purchased_hours +PurchasedUnits,purchased_units +PurgeQueueRequest,purge_queue_request +PushDomainRequest,push_domain_request +PushMessageActivity,push_message_activity +PushNotification,push_notification +PushNotificationConfiguration,push_notification_configuration +PushNotificationPreferences,push_notification_preferences +PushNotificationTemplateRequest,push_notification_template_request +PushNotificationTemplateResponse,push_notification_template_response +PushNotifications,push_notifications +PushSync,push_sync +PushTemplate,push_template +Put,put +PutAccessControlRuleRequest,put_access_control_rule_request +PutAccessPointConfigurationForObjectLambdaRequest,put_access_point_configuration_for_object_lambda_request +PutAccessPointPolicyForObjectLambdaRequest,put_access_point_policy_for_object_lambda_request +PutAccessPointPolicyRequest,put_access_point_policy_request +PutAccountAliasRequest,put_account_alias_request +PutAccountConfigurationRequest,put_account_configuration_request +PutAccountDedicatedIpWarmupAttributesRequest,put_account_dedicated_ip_warmup_attributes_request +PutAccountDetailsRequest,put_account_details_request +PutAccountPolicyRequest,put_account_policy_request +PutAccountPolicyResponse,put_account_policy_response +PutAccountPreferencesRequest,put_account_preferences_request +PutAccountPreferencesResponse,put_account_preferences_response +PutAccountSendingAttributesRequest,put_account_sending_attributes_request +PutAccountSettingDefaultRequest,put_account_setting_default_request +PutAccountSettingDefaultResponse,put_account_setting_default_response +PutAccountSettingRequest,put_account_setting_request +PutAccountSettingResponse,put_account_setting_response +PutAccountSuppressionAttributesRequest,put_account_suppression_attributes_request +PutAccountVdmAttributesRequest,put_account_vdm_attributes_request +PutActionRevisionInput,put_action_revision_input +PutActionRevisionOutput,put_action_revision_output +PutAdminAccountRequest,put_admin_account_request +PutAggregationAuthorizationRequest,put_aggregation_authorization_request +PutAggregationAuthorizationResponse,put_aggregation_authorization_response +PutAlarmRequest,put_alarm_request +PutAlarmResult,put_alarm_result +PutAlertManagerDefinitionRequest,put_alert_manager_definition_request +PutAlertManagerDefinitionResponse,put_alert_manager_definition_response +PutAlternateContactRequest,put_alternate_contact_request +PutAnomalyDetectorInput,put_anomaly_detector_input +PutAppInstanceRetentionSettingsRequest,put_app_instance_retention_settings_request +PutAppInstanceRetentionSettingsResponse,put_app_instance_retention_settings_response +PutAppInstanceStreamingConfigurationsRequest,put_app_instance_streaming_configurations_request +PutAppInstanceStreamingConfigurationsResponse,put_app_instance_streaming_configurations_response +PutAppInstanceUserExpirationSettingsRequest,put_app_instance_user_expiration_settings_request +PutAppInstanceUserExpirationSettingsResponse,put_app_instance_user_expiration_settings_response +PutAppLaunchConfigurationRequest,put_app_launch_configuration_request +PutAppReplicationConfigurationRequest,put_app_replication_configuration_request +PutAppValidationConfigurationRequest,put_app_validation_configuration_request +PutApplicationPolicyRequest,put_application_policy_request +PutApplicationPolicyResponse,put_application_policy_response +PutApprovalResultInput,put_approval_result_input +PutApprovalResultOutput,put_approval_result_output +PutAppsListRequest,put_apps_list_request +PutAppsListResponse,put_apps_list_response +PutAssetPropertyValueEntry,put_asset_property_value_entry +PutAttributesRequest,put_attributes_request +PutAttributesResponse,put_attributes_response +PutAuditEventsRequest,put_audit_events_request +PutAuditEventsResponse,put_audit_events_response +PutAuthPolicyRequest,put_auth_policy_request +PutAuthPolicyResponse,put_auth_policy_response +PutAutoScalingPolicyInput,put_auto_scaling_policy_input +PutAutoScalingPolicyOutput,put_auto_scaling_policy_output +PutAutoTerminationPolicyInput,put_auto_termination_policy_input +PutBackupPolicyRequest,put_backup_policy_request +PutBackupVaultAccessPolicyInput,put_backup_vault_access_policy_input +PutBackupVaultLockConfigurationInput,put_backup_vault_lock_configuration_input +PutBackupVaultNotificationsInput,put_backup_vault_notifications_input +PutBandwidthRateLimitScheduleInput,put_bandwidth_rate_limit_schedule_input +PutBandwidthRateLimitScheduleOutput,put_bandwidth_rate_limit_schedule_output +PutBlockPublicAccessConfigurationInput,put_block_public_access_configuration_input +PutBotAliasRequest,put_bot_alias_request +PutBotAliasResponse,put_bot_alias_response +PutBotRequest,put_bot_request +PutBotResponse,put_bot_response +PutBucketAccelerateConfigurationRequest,put_bucket_accelerate_configuration_request +PutBucketAclRequest,put_bucket_acl_request +PutBucketAnalyticsConfigurationRequest,put_bucket_analytics_configuration_request +PutBucketCorsRequest,put_bucket_cors_request +PutBucketEncryptionRequest,put_bucket_encryption_request +PutBucketIntelligentTieringConfigurationRequest,put_bucket_intelligent_tiering_configuration_request +PutBucketInventoryConfigurationRequest,put_bucket_inventory_configuration_request +PutBucketLifecycleConfigurationRequest,put_bucket_lifecycle_configuration_request +PutBucketLoggingRequest,put_bucket_logging_request +PutBucketMetricsConfigurationRequest,put_bucket_metrics_configuration_request +PutBucketNotificationConfigurationRequest,put_bucket_notification_configuration_request +PutBucketOwnershipControlsRequest,put_bucket_ownership_controls_request +PutBucketPolicyRequest,put_bucket_policy_request +PutBucketReplicationRequest,put_bucket_replication_request +PutBucketRequestPaymentRequest,put_bucket_request_payment_request +PutBucketTaggingRequest,put_bucket_tagging_request +PutBucketVersioningRequest,put_bucket_versioning_request +PutBucketWebsiteRequest,put_bucket_website_request +PutCapacityAssignmentConfigurationInput,put_capacity_assignment_configuration_input +PutCaseEventConfigurationRequest,put_case_event_configuration_request +PutChannelExpirationSettingsRequest,put_channel_expiration_settings_request +PutChannelExpirationSettingsResponse,put_channel_expiration_settings_response +PutChannelMembershipPreferencesRequest,put_channel_membership_preferences_request +PutChannelMembershipPreferencesResponse,put_channel_membership_preferences_response +PutChannelPolicyRequest,put_channel_policy_request +PutChunkInput,put_chunk_input +PutChunkOutput,put_chunk_output +PutClassificationExportConfigurationRequest,put_classification_export_configuration_request +PutClassificationExportConfigurationResponse,put_classification_export_configuration_response +PutClusterCapacityProvidersRequest,put_cluster_capacity_providers_request +PutClusterCapacityProvidersResponse,put_cluster_capacity_providers_response +PutClusterPolicyRequest,put_cluster_policy_request +PutClusterPolicyResponse,put_cluster_policy_response +PutCodeBindingRequest,put_code_binding_request +PutCodeBindingResponse,put_code_binding_response +PutCommentReactionInput,put_comment_reaction_input +PutComplianceItemsRequest,put_compliance_items_request +PutComponentPolicyRequest,put_component_policy_request +PutComponentPolicyResponse,put_component_policy_response +PutCompositeAlarmInput,put_composite_alarm_input +PutConferencePreferenceRequest,put_conference_preference_request +PutConfigRuleRequest,put_config_rule_request +PutConfigurationAggregatorRequest,put_configuration_aggregator_request +PutConfigurationAggregatorResponse,put_configuration_aggregator_response +PutConfigurationRecorderRequest,put_configuration_recorder_request +PutConfigurationRequest,put_configuration_request +PutConfigurationSetDeliveryOptionsRequest,put_configuration_set_delivery_options_request +PutConfigurationSetReputationOptionsRequest,put_configuration_set_reputation_options_request +PutConfigurationSetSendingOptionsRequest,put_configuration_set_sending_options_request +PutConfigurationSetSuppressionOptionsRequest,put_configuration_set_suppression_options_request +PutConfigurationSetTrackingOptionsRequest,put_configuration_set_tracking_options_request +PutConfigurationSetVdmOptionsRequest,put_configuration_set_vdm_options_request +PutConformancePackRequest,put_conformance_pack_request +PutConformancePackResponse,put_conformance_pack_response +PutContactInformationRequest,put_contact_information_request +PutContactPolicyRequest,put_contact_policy_request +PutContainerPolicyInput,put_container_policy_input +PutContainerRecipePolicyRequest,put_container_recipe_policy_request +PutContainerRecipePolicyResponse,put_container_recipe_policy_response +PutCoreNetworkPolicyRequest,put_core_network_policy_request +PutCoreNetworkPolicyResponse,put_core_network_policy_response +PutCorsPolicyInput,put_cors_policy_input +PutDashboardInput,put_dashboard_input +PutDashboardOutput,put_dashboard_output +PutDataCatalogEncryptionSettingsRequest,put_data_catalog_encryption_settings_request +PutDataLakeSettingsRequest,put_data_lake_settings_request +PutDataProtectionPolicyInput,put_data_protection_policy_input +PutDataProtectionPolicyRequest,put_data_protection_policy_request +PutDataProtectionPolicyResponse,put_data_protection_policy_response +PutDataSetRefreshPropertiesRequest,put_data_set_refresh_properties_request +PutDataSetRefreshPropertiesResponse,put_data_set_refresh_properties_response +PutDedicatedIpInPoolRequest,put_dedicated_ip_in_pool_request +PutDedicatedIpPoolScalingAttributesRequest,put_dedicated_ip_pool_scaling_attributes_request +PutDedicatedIpWarmupAttributesRequest,put_dedicated_ip_warmup_attributes_request +PutDefaultEncryptionConfigurationRequest,put_default_encryption_configuration_request +PutDefaultEncryptionConfigurationResponse,put_default_encryption_configuration_response +PutDeliverabilityDashboardOptionRequest,put_deliverability_dashboard_option_request +PutDeliveryChannelRequest,put_delivery_channel_request +PutDestinationPolicyRequest,put_destination_policy_request +PutDestinationRequest,put_destination_request +PutDestinationResponse,put_destination_response +PutDetectorRequest,put_detector_request +PutDialRequestBatchRequest,put_dial_request_batch_request +PutDialRequestBatchResponse,put_dial_request_batch_response +PutDomainPermissionsPolicyRequest,put_domain_permissions_policy_request +PutDomainPermissionsPolicyResult,put_domain_permissions_policy_result +PutDraftAppVersionTemplateRequest,put_draft_app_version_template_request +PutDraftAppVersionTemplateResponse,put_draft_app_version_template_response +PutEmailIdentityConfigurationSetAttributesRequest,put_email_identity_configuration_set_attributes_request +PutEmailIdentityDkimAttributesRequest,put_email_identity_dkim_attributes_request +PutEmailIdentityDkimSigningAttributesRequest,put_email_identity_dkim_signing_attributes_request +PutEmailIdentityDkimSigningAttributesResponse,put_email_identity_dkim_signing_attributes_response +PutEmailIdentityFeedbackAttributesRequest,put_email_identity_feedback_attributes_request +PutEmailIdentityMailFromAttributesRequest,put_email_identity_mail_from_attributes_request +PutEmailMonitoringConfigurationRequest,put_email_monitoring_configuration_request +PutEncryptionConfigRequest,put_encryption_config_request +PutEncryptionConfigResult,put_encryption_config_result +PutEncryptionConfigurationRequest,put_encryption_configuration_request +PutEncryptionConfigurationResponse,put_encryption_configuration_response +PutEntityTypeRequest,put_entity_type_request +PutEvaluationsRequest,put_evaluations_request +PutEvaluationsResponse,put_evaluations_response +PutEventSelectorsRequest,put_event_selectors_request +PutEventSelectorsResponse,put_event_selectors_response +PutEventStreamRequest,put_event_stream_request +PutEventStreamResponse,put_event_stream_response +PutEventTypeRequest,put_event_type_request +PutEventsConfigurationRequest,put_events_configuration_request +PutEventsConfigurationResponse,put_events_configuration_response +PutEventsRequest,put_events_request +PutEventsRequestEntry,put_events_request_entry +PutEventsResponse,put_events_response +PutEventsResultEntry,put_events_result_entry +PutExternalEvaluationRequest,put_external_evaluation_request +PutExternalModelRequest,put_external_model_request +PutFeedbackRequest,put_feedback_request +PutFileEntry,put_file_entry +PutFileEntryConflictException,put_file_entry_conflict_exception +PutFileInput,put_file_input +PutFileOutput,put_file_output +PutFileSystemPolicyRequest,put_file_system_policy_request +PutFindingsPublicationConfigurationRequest,put_findings_publication_configuration_request +PutFirewallRuleGroupPolicyRequest,put_firewall_rule_group_policy_request +PutFirewallRuleGroupPolicyResponse,put_firewall_rule_group_policy_response +PutFunctionCodeSigningConfigRequest,put_function_code_signing_config_request +PutFunctionCodeSigningConfigResponse,put_function_code_signing_config_response +PutFunctionConcurrencyRequest,put_function_concurrency_request +PutFunctionEventInvokeConfigRequest,put_function_event_invoke_config_request +PutGatewayResponseRequest,put_gateway_response_request +PutGeofenceRequest,put_geofence_request +PutGeofenceResponse,put_geofence_response +PutGroupConfigurationInput,put_group_configuration_input +PutGroupPolicyRequest,put_group_policy_request +PutHypervisorPropertyMappingsInput,put_hypervisor_property_mappings_input +PutHypervisorPropertyMappingsOutput,put_hypervisor_property_mappings_output +PutIdentityPolicyRequest,put_identity_policy_request +PutImagePolicyRequest,put_image_policy_request +PutImagePolicyResponse,put_image_policy_response +PutImageRecipePolicyRequest,put_image_recipe_policy_request +PutImageRecipePolicyResponse,put_image_recipe_policy_response +PutImageRequest,put_image_request +PutImageResponse,put_image_response +PutImageScanningConfigurationRequest,put_image_scanning_configuration_request +PutImageScanningConfigurationResponse,put_image_scanning_configuration_response +PutImageTagMutabilityRequest,put_image_tag_mutability_request +PutImageTagMutabilityResponse,put_image_tag_mutability_response +PutInboundDmarcSettingsRequest,put_inbound_dmarc_settings_request +PutInlinePolicyToPermissionSetRequest,put_inline_policy_to_permission_set_request +PutInsightRuleInput,put_insight_rule_input +PutInsightSelectorsRequest,put_insight_selectors_request +PutInsightSelectorsResponse,put_insight_selectors_response +PutInstancePublicPortsRequest,put_instance_public_ports_request +PutInstancePublicPortsResult,put_instance_public_ports_result +PutIntegrationRequest,put_integration_request +PutIntegrationResponse,put_integration_response +PutIntegrationResponseRequest,put_integration_response_request +PutIntentRequest,put_intent_request +PutIntentResponse,put_intent_response +PutInventoryRequest,put_inventory_request +PutInventoryResult,put_inventory_result +PutInvitationConfigurationRequest,put_invitation_configuration_request +PutItemInput,put_item_input +PutItemOutput,put_item_output +PutItemsRequest,put_items_request +PutJobFailureResultInput,put_job_failure_result_input +PutJobSuccessResultInput,put_job_success_result_input +PutJobTaggingRequest,put_job_tagging_request +PutKMSEncryptionKeyRequest,put_kms_encryption_key_request +PutKeyPolicyRequest,put_key_policy_request +PutKeywordRequest,put_keyword_request +PutKeywordResult,put_keyword_result +PutLabelRequest,put_label_request +PutLaunchActionRequest,put_launch_action_request +PutLaunchActionResponse,put_launch_action_response +PutLaunchProfileMembersRequest,put_launch_profile_members_request +PutLexiconInput,put_lexicon_input +PutLifecycleConfigurationRequest,put_lifecycle_configuration_request +PutLifecycleEventHookExecutionStatusInput,put_lifecycle_event_hook_execution_status_input +PutLifecycleEventHookExecutionStatusOutput,put_lifecycle_event_hook_execution_status_output +PutLifecycleHookType,put_lifecycle_hook_type +PutLifecyclePolicyInput,put_lifecycle_policy_input +PutLifecyclePolicyRequest,put_lifecycle_policy_request +PutLifecyclePolicyResponse,put_lifecycle_policy_response +PutLogEventsRequest,put_log_events_request +PutLogEventsResponse,put_log_events_response +PutLoggingConfigurationRequest,put_logging_configuration_request +PutLoggingConfigurationResponse,put_logging_configuration_response +PutLoggingOptionsRequest,put_logging_options_request +PutMailboxPermissionsRequest,put_mailbox_permissions_request +PutMaintenanceStartTimeInput,put_maintenance_start_time_input +PutMaintenanceStartTimeOutput,put_maintenance_start_time_output +PutManagedInsightRulesInput,put_managed_insight_rules_input +PutManagedInsightRulesOutput,put_managed_insight_rules_output +PutManagedRuleSetVersionsRequest,put_managed_rule_set_versions_request +PutManagedRuleSetVersionsResponse,put_managed_rule_set_versions_response +PutManagedScalingPolicyInput,put_managed_scaling_policy_input +PutMessagingStreamingConfigurationsRequest,put_messaging_streaming_configurations_request +PutMessagingStreamingConfigurationsResponse,put_messaging_streaming_configurations_response +PutMetadataFlagBody,put_metadata_flag_body +PutMetadataFlagRequest,put_metadata_flag_request +PutMetadataRequest,put_metadata_request +PutMethodRequest,put_method_request +PutMethodResponseRequest,put_method_response_request +PutMetricAlarmInput,put_metric_alarm_input +PutMetricDataInput,put_metric_data_input +PutMetricFilterRequest,put_metric_filter_request +PutMetricPolicyInput,put_metric_policy_input +PutMetricStreamInput,put_metric_stream_input +PutMetricStreamOutput,put_metric_stream_output +PutMobileDeviceAccessOverrideRequest,put_mobile_device_access_override_request +PutModelInvocationLoggingConfigurationRequest,put_model_invocation_logging_configuration_request +PutModelPackageGroupPolicyInput,put_model_package_group_policy_input +PutModelPackageGroupPolicyOutput,put_model_package_group_policy_output +PutMultiRegionAccessPointPolicyInput,put_multi_region_access_point_policy_input +PutMultiRegionAccessPointPolicyRequest,put_multi_region_access_point_policy_request +PutMultiRegionAccessPointPolicyResult,put_multi_region_access_point_policy_result +PutNotificationChannelRequest,put_notification_channel_request +PutNotificationConfigurationType,put_notification_configuration_type +PutNotificationSettingsRequest,put_notification_settings_request +PutNotificationSettingsResponse,put_notification_settings_response +PutObjectAclOutput,put_object_acl_output +PutObjectAclRequest,put_object_acl_request +PutObjectInput,put_object_input +PutObjectLegalHoldOutput,put_object_legal_hold_output +PutObjectLegalHoldRequest,put_object_legal_hold_request +PutObjectLockConfigurationOutput,put_object_lock_configuration_output +PutObjectLockConfigurationRequest,put_object_lock_configuration_request +PutObjectOutput,put_object_output +PutObjectRequest,put_object_request +PutObjectResponse,put_object_response +PutObjectRetentionOutput,put_object_retention_output +PutObjectRetentionRequest,put_object_retention_request +PutObjectTaggingOutput,put_object_tagging_output +PutObjectTaggingRequest,put_object_tagging_request +PutOptedOutNumberRequest,put_opted_out_number_request +PutOptedOutNumberResult,put_opted_out_number_result +PutOrganizationConfigRuleRequest,put_organization_config_rule_request +PutOrganizationConfigRuleResponse,put_organization_config_rule_response +PutOrganizationConformancePackRequest,put_organization_conformance_pack_request +PutOrganizationConformancePackResponse,put_organization_conformance_pack_response +PutOriginEndpointPolicyRequest,put_origin_endpoint_policy_request +PutOutcomeRequest,put_outcome_request +PutPackageOriginConfigurationRequest,put_package_origin_configuration_request +PutPackageOriginConfigurationResult,put_package_origin_configuration_result +PutParameterRequest,put_parameter_request +PutParameterResult,put_parameter_result +PutPartnerEventsRequest,put_partner_events_request +PutPartnerEventsRequestEntry,put_partner_events_request_entry +PutPartnerEventsResponse,put_partner_events_response +PutPartnerEventsResultEntry,put_partner_events_result_entry +PutPermissionPolicyRequest,put_permission_policy_request +PutPermissionRequest,put_permission_request +PutPermissionResponse,put_permission_response +PutPermissionsBoundaryToPermissionSetRequest,put_permissions_boundary_to_permission_set_request +PutPipelineDefinitionInput,put_pipeline_definition_input +PutPipelineDefinitionOutput,put_pipeline_definition_output +PutPlaybackConfigurationRequest,put_playback_configuration_request +PutPlaybackConfigurationResponse,put_playback_configuration_response +PutPolicyRequest,put_policy_request +PutPolicyResponse,put_policy_response +PutPortfolioPreferencesRequest,put_portfolio_preferences_request +PutPositionConfigurationRequest,put_position_configuration_request +PutPrincipalMappingRequest,put_principal_mapping_request +PutProfileObjectRequest,put_profile_object_request +PutProfileObjectResponse,put_profile_object_response +PutProfileObjectTypeRequest,put_profile_object_type_request +PutProfileObjectTypeResponse,put_profile_object_type_response +PutProjectEventsRequest,put_project_events_request +PutProjectEventsResponse,put_project_events_response +PutProjectEventsResultEntry,put_project_events_result_entry +PutProjectPolicyRequest,put_project_policy_request +PutProjectPolicyResponse,put_project_policy_response +PutProtocolsListRequest,put_protocols_list_request +PutProtocolsListResponse,put_protocols_list_response +PutProvisionedConcurrencyConfigRequest,put_provisioned_concurrency_config_request +PutProvisionedConcurrencyConfigResponse,put_provisioned_concurrency_config_response +PutPublicAccessBlockRequest,put_public_access_block_request +PutQueryDefinitionRequest,put_query_definition_request +PutQueryDefinitionResponse,put_query_definition_response +PutRawMessageContentRequest,put_raw_message_content_request +PutRecommendationFeedbackRequest,put_recommendation_feedback_request +PutRecommendationPreferencesRequest,put_recommendation_preferences_request +PutRecordBatchInput,put_record_batch_input +PutRecordBatchOutput,put_record_batch_output +PutRecordBatchResponseEntry,put_record_batch_response_entry +PutRecordInput,put_record_input +PutRecordOutput,put_record_output +PutRecordRequest,put_record_request +PutRecordsInput,put_records_input +PutRecordsOutput,put_records_output +PutRecordsRequestEntry,put_records_request_entry +PutRecordsResultEntry,put_records_result_entry +PutRegistryCatalogDataRequest,put_registry_catalog_data_request +PutRegistryCatalogDataResponse,put_registry_catalog_data_response +PutRegistryPolicyRequest,put_registry_policy_request +PutRegistryPolicyResponse,put_registry_policy_response +PutRegistryScanningConfigurationRequest,put_registry_scanning_configuration_request +PutRegistryScanningConfigurationResponse,put_registry_scanning_configuration_response +PutRemediationConfigurationsRequest,put_remediation_configurations_request +PutRemediationConfigurationsResponse,put_remediation_configurations_response +PutRemediationExceptionsRequest,put_remediation_exceptions_request +PutRemediationExceptionsResponse,put_remediation_exceptions_response +PutReplicationConfigurationRequest,put_replication_configuration_request +PutReplicationConfigurationResponse,put_replication_configuration_response +PutReportDefinitionRequest,put_report_definition_request +PutReportDefinitionResult,put_report_definition_result +PutRepositoryCatalogDataRequest,put_repository_catalog_data_request +PutRepositoryCatalogDataResponse,put_repository_catalog_data_response +PutRepositoryPermissionsPolicyRequest,put_repository_permissions_policy_request +PutRepositoryPermissionsPolicyResult,put_repository_permissions_policy_result +PutRepositoryTriggersInput,put_repository_triggers_input +PutRepositoryTriggersOutput,put_repository_triggers_output +PutRequest,put_request +PutResolverQueryLogConfigPolicyRequest,put_resolver_query_log_config_policy_request +PutResolverQueryLogConfigPolicyResponse,put_resolver_query_log_config_policy_response +PutResolverRulePolicyRequest,put_resolver_rule_policy_request +PutResolverRulePolicyResponse,put_resolver_rule_policy_response +PutResourceAttributesRequest,put_resource_attributes_request +PutResourceConfigRequest,put_resource_config_request +PutResourceLogLevelRequest,put_resource_log_level_request +PutResourcePermissionInput,put_resource_permission_input +PutResourcePermissionOutput,put_resource_permission_output +PutResourcePolicyInput,put_resource_policy_input +PutResourcePolicyOutput,put_resource_policy_output +PutResourcePolicyRequest,put_resource_policy_request +PutResourcePolicyResponse,put_resource_policy_response +PutResourcePolicyResult,put_resource_policy_result +PutResourceSetRequest,put_resource_set_request +PutResourceSetResponse,put_resource_set_response +PutRestApiRequest,put_rest_api_request +PutRetentionConfigurationRequest,put_retention_configuration_request +PutRetentionConfigurationResponse,put_retention_configuration_response +PutRetentionPolicyRequest,put_retention_policy_request +PutRetentionSettingsRequest,put_retention_settings_request +PutRetentionSettingsResponse,put_retention_settings_response +PutRolePermissionsBoundaryRequest,put_role_permissions_boundary_request +PutRolePolicyRequest,put_role_policy_request +PutRoomSkillParameterRequest,put_room_skill_parameter_request +PutRuleGroupsNamespaceRequest,put_rule_groups_namespace_request +PutRuleGroupsNamespaceResponse,put_rule_groups_namespace_response +PutRuleRequest,put_rule_request +PutRuleResponse,put_rule_response +PutRumEventsRequest,put_rum_events_request +PutRumMetricsDestinationRequest,put_rum_metrics_destination_request +PutRuntimeManagementConfigRequest,put_runtime_management_config_request +PutRuntimeManagementConfigResponse,put_runtime_management_config_response +PutScalingPolicyInput,put_scaling_policy_input +PutScalingPolicyOutput,put_scaling_policy_output +PutScalingPolicyRequest,put_scaling_policy_request +PutScalingPolicyResponse,put_scaling_policy_response +PutScalingPolicyType,put_scaling_policy_type +PutScheduledActionRequest,put_scheduled_action_request +PutScheduledUpdateGroupActionType,put_scheduled_update_group_action_type +PutSchemaFromJsonRequest,put_schema_from_json_request +PutSchemaFromJsonResponse,put_schema_from_json_response +PutSchemaInput,put_schema_input +PutSchemaOutput,put_schema_output +PutSchemaVersionMetadataInput,put_schema_version_metadata_input +PutSchemaVersionMetadataResponse,put_schema_version_metadata_response +PutSecretValueRequest,put_secret_value_request +PutSecretValueResponse,put_secret_value_response +PutServiceQuotaIncreaseRequestIntoTemplateRequest,put_service_quota_increase_request_into_template_request +PutServiceQuotaIncreaseRequestIntoTemplateResponse,put_service_quota_increase_request_into_template_response +PutSessionRequest,put_session_request +PutSessionResponse,put_session_response +PutSigningProfileRequest,put_signing_profile_request +PutSigningProfileResponse,put_signing_profile_response +PutSinkPolicyInput,put_sink_policy_input +PutSinkPolicyOutput,put_sink_policy_output +PutSipMediaApplicationAlexaSkillConfigurationRequest,put_sip_media_application_alexa_skill_configuration_request +PutSipMediaApplicationAlexaSkillConfigurationResponse,put_sip_media_application_alexa_skill_configuration_response +PutSipMediaApplicationLoggingConfigurationRequest,put_sip_media_application_logging_configuration_request +PutSipMediaApplicationLoggingConfigurationResponse,put_sip_media_application_logging_configuration_response +PutSkillAuthorizationRequest,put_skill_authorization_request +PutSlotTypeRequest,put_slot_type_request +PutSlotTypeResponse,put_slot_type_response +PutSnapshotBlockRequest,put_snapshot_block_request +PutSnapshotBlockResponse,put_snapshot_block_response +PutSolFunctionPackageContentInput,put_sol_function_package_content_input +PutSolFunctionPackageContentMetadata,put_sol_function_package_content_metadata +PutSolFunctionPackageContentOutput,put_sol_function_package_content_output +PutSolNetworkPackageContentInput,put_sol_network_package_content_input +PutSolNetworkPackageContentMetadata,put_sol_network_package_content_metadata +PutSolNetworkPackageContentOutput,put_sol_network_package_content_output +PutSourceServerActionRequest,put_source_server_action_request +PutStorageConfigurationRequest,put_storage_configuration_request +PutStorageConfigurationResponse,put_storage_configuration_response +PutStorageLensConfigurationRequest,put_storage_lens_configuration_request +PutStorageLensConfigurationTaggingRequest,put_storage_lens_configuration_tagging_request +PutStoredQueryRequest,put_stored_query_request +PutStoredQueryResponse,put_stored_query_response +PutStudioMembersRequest,put_studio_members_request +PutSubscriptionFilterRequest,put_subscription_filter_request +PutSuppressedDestinationRequest,put_suppressed_destination_request +PutTargetsRequest,put_targets_request +PutTargetsResponse,put_targets_response +PutTargetsResultEntry,put_targets_result_entry +PutTelemetryRecordsRequest,put_telemetry_records_request +PutTemplateActionRequest,put_template_action_request +PutThirdPartyJobFailureResultInput,put_third_party_job_failure_result_input +PutThirdPartyJobSuccessResultInput,put_third_party_job_success_result_input +PutTraceSegmentsRequest,put_trace_segments_request +PutTraceSegmentsResult,put_trace_segments_result +PutUserPermissionsBoundaryRequest,put_user_permissions_boundary_request +PutUserPolicyRequest,put_user_policy_request +PutUserStatusRequest,put_user_status_request +PutUsersRequest,put_users_request +PutVerificationStateOnViolationRequest,put_verification_state_on_violation_request +PutVoiceConnectorEmergencyCallingConfigurationRequest,put_voice_connector_emergency_calling_configuration_request +PutVoiceConnectorEmergencyCallingConfigurationResponse,put_voice_connector_emergency_calling_configuration_response +PutVoiceConnectorLoggingConfigurationRequest,put_voice_connector_logging_configuration_request +PutVoiceConnectorLoggingConfigurationResponse,put_voice_connector_logging_configuration_response +PutVoiceConnectorOriginationRequest,put_voice_connector_origination_request +PutVoiceConnectorOriginationResponse,put_voice_connector_origination_response +PutVoiceConnectorProxyRequest,put_voice_connector_proxy_request +PutVoiceConnectorProxyResponse,put_voice_connector_proxy_response +PutVoiceConnectorStreamingConfigurationRequest,put_voice_connector_streaming_configuration_request +PutVoiceConnectorStreamingConfigurationResponse,put_voice_connector_streaming_configuration_response +PutVoiceConnectorTerminationCredentialsRequest,put_voice_connector_termination_credentials_request +PutVoiceConnectorTerminationRequest,put_voice_connector_termination_request +PutVoiceConnectorTerminationResponse,put_voice_connector_termination_response +PutWarmPoolType,put_warm_pool_type +PutWebhookInput,put_webhook_input +PutWebhookOutput,put_webhook_output +PutWorkflowRunPropertiesRequest,put_workflow_run_properties_request +Pwd,pwd +PythonScript,python_script +PythonVersion,python_version +QRCodePNG,qr_code_png +QSearchBar,q_search_bar +QopConfiguration,qop_configuration +Qualification,qualification +QualificationRequest,qualification_request +QualificationRequestId,qualification_request_id +QualificationRequests,qualification_requests +QualificationRequirement,qualification_requirement +QualificationRequirements,qualification_requirements +QualificationStatus,qualification_status +QualificationType,qualification_type +QualificationTypeId,qualification_type_id +QualificationTypeStatus,qualification_type_status +QualificationTypes,qualification_types +Qualifications,qualifications +Qualifier,qualifier +Quality,quality +QualityCheck,quality_check +QualityCheckStepMetadata,quality_check_step_metadata +QualityFilter,quality_filter +QualityLevel,quality_level +QualityTuningLevel,quality_tuning_level +Quantile,quantile +Quantity,quantity +QuantumTaskQueueInfo,quantum_task_queue_info +QuantumTaskSummary,quantum_task_summary +Queries,queries +QueriesConfig,queries_config +Query,query +QueryAlias,query_alias +QueryArg,query_arg +QueryArgProfile,query_arg_profile +QueryArgProfileConfig,query_arg_profile_config +QueryArgProfileEmpty,query_arg_profile_empty +QueryArgProfiles,query_arg_profiles +QueryArgument,query_argument +QueryArn,query_arn +QueryAsOfTime,query_as_of_time +QueryAssistantRequest,query_assistant_request +QueryAssistantResponse,query_assistant_response +QueryCapacityUnits,query_capacity_units +QueryCompileError,query_compile_error +QueryCompileErrorLocation,query_compile_error_location +QueryDefinition,query_definition +QueryEndDate,query_end_date +QueryError,query_error +QueryErrors,query_errors +QueryEvalStats,query_eval_stats +QueryExecution,query_execution +QueryExecutionContext,query_execution_context +QueryExecutionException,query_execution_exception +QueryExecutionId,query_execution_id +QueryExecutionIds,query_execution_ids +QueryExecutionStatistics,query_execution_statistics +QueryExecutionStatus,query_execution_status +QueryExecutions,query_executions +QueryFilter,query_filter +QueryFilters,query_filters +QueryForecastRequest,query_forecast_request +QueryForecastResponse,query_forecast_response +QueryId,query_id +QueryIdNotFoundException,query_id_not_found_exception +QueryIdentifiersEnclosingOption,query_identifiers_enclosing_option +QueryInfo,query_info +QueryInput,query_input +QueryLanguageVersion,query_language_version +QueryLimitExceededException,query_limit_exceeded_exception +QueryLimitException,query_limit_exception +QueryLineageRequest,query_lineage_request +QueryLineageResponse,query_lineage_response +QueryLogLookBackWindowInDays,query_log_look_back_window_in_days +QueryLoggingConfig,query_logging_config +QueryLoggingConfigAlreadyExists,query_logging_config_already_exists +QueryLoggingConfigs,query_logging_configs +QueryName,query_name +QueryObjectsInput,query_objects_input +QueryObjectsOutput,query_objects_output +QueryOutput,query_output +QueryParameterMatch,query_parameter_match +QueryParameters,query_parameters +QueryPlanningContext,query_planning_context +QueryPlanningTimeInMillis,query_planning_time_in_millis +QueryQueueTimeInMillis,query_queue_time_in_millis +QueryRecommendationTriggerData,query_recommendation_trigger_data +QueryRequest,query_request +QueryResponse,query_response +QueryResult,query_result +QueryResultItem,query_result_item +QueryResultRows,query_result_rows +QueryResultTypeFilter,query_result_type_filter +QueryRuntimeStatistics,query_runtime_statistics +QueryRuntimeStatisticsRows,query_runtime_statistics_rows +QueryRuntimeStatisticsTimeline,query_runtime_statistics_timeline +QuerySchemaVersionMetadataInput,query_schema_version_metadata_input +QuerySchemaVersionMetadataResponse,query_schema_version_metadata_response +QueryScopes,query_scopes +QuerySingleAlwaysOnNode,query_single_always_on_node +QueryStage,query_stage +QueryStagePlan,query_stage_plan +QueryStagePlanNode,query_stage_plan_node +QueryStartDate,query_start_date +QueryStatement,query_statement +QueryStatistics,query_statistics +QueryStatisticsForDescribeQuery,query_statistics_for_describe_query +QueryStatus,query_status +QueryString,query_string +QueryStringBehavior,query_string_behavior +QueryStringCacheKeys,query_string_cache_keys +QueryStringConditionConfig,query_string_condition_config +QueryStringConfig,query_string_config +QueryStringKeyValuePair,query_string_key_value_pair +QueryStringNames,query_string_names +QueryStringObject,query_string_object +QueryStringParameters,query_string_parameters +QueryStrings,query_strings +QueryStringsConfig,query_strings_config +QuerySubmissionTime,query_submission_time +QuerySuggestionsBlockListSummary,query_suggestions_block_list_summary +QuerySuggestionsId,query_suggestions_id +QueryTableRowsRequest,query_table_rows_request +QueryTableRowsResult,query_table_rows_result +QueryText,query_text +QueryTexts,query_texts +QueryTimeoutException,query_timeout_exception +QueryTooLargeException,query_too_large_exception +QueryWhatIfForecastRequest,query_what_if_forecast_request +QueryWhatIfForecastResponse,query_what_if_forecast_response +Question,question +QuestionChoices,question_choices +QuestionDescription,question_description +QuestionDifference,question_difference +QuestionDifferences,question_differences +QuestionId,question_id +QuestionIdentifier,question_identifier +QuestionMetric,question_metric +QuestionPriority,question_priority +QuestionTitle,question_title +QuestionType,question_type +QuestionTypeProperties,question_type_properties +Questions,questions +Queue,queue +QueueArn,queue_arn +QueueConfig,queue_config +QueueConfigs,queue_configs +QueueConfiguration,queue_configuration +QueueConfigurations,queue_configurations +QueueId,queue_id +QueueInfo,queue_info +QueueName,queue_name +QueueNamePrefix,queue_name_prefix +QueueOwnerAWSAccountId,queue_owner_aws_account_id +QueueQuickConnectConfig,queue_quick_connect_config +QueueReference,queue_reference +QueueReferences,queue_references +QueueSearchCriteria,queue_search_criteria +QueueSearchFilter,queue_search_filter +QueueSummary,queue_summary +QueueSummaryList,queue_summary_list +QueueTimeMillis,queue_time_millis +QueueTransition,queue_transition +QueueTransitions,queue_transitions +QueueType,queue_type +QueueTypeCondition,queue_type_condition +QueueTypes,queue_types +QueueUrl,queue_url +QueueUrls,queue_urls +QueuedIngestion,queued_ingestion +Queues,queues +QuickConnect,quick_connect +QuickConnectARN,quick_connect_arn +QuickConnectConfig,quick_connect_config +QuickConnectId,quick_connect_id +QuickConnectIds,quick_connect_ids +QuickConnectSearchCriteria,quick_connect_search_criteria +QuickConnectSearchFilter,quick_connect_search_filter +QuickConnectSummary,quick_connect_summary +QuickConnectSummaryList,quick_connect_summary_list +QuickConnectType,quick_connect_type +QuickConnectTypes,quick_connect_types +QuickConnects,quick_connects +QuickSightConsole,quick_sight_console +QuickSightUserNotFoundException,quick_sight_user_not_found_exception +Quiet,quiet +QuietTime,quiet_time +QuipConfiguration,quip_configuration +Quota,quota +QuotaAppliedAtLevel,quota_applied_at_level +QuotaArn,quota_arn +QuotaCode,quota_code +QuotaContext,quota_context +QuotaContextInfo,quota_context_info +QuotaExceededException,quota_exceeded_exception +QuotaName,quota_name +QuotaPeriod,quota_period +QuotaRequestedAtLevel,quota_requested_at_level +QuotaSettings,quota_settings +Quotas,quotas +QuoteChar,quote_char +QuoteCharacter,quote_character +QuoteEscapeCharacter,quote_escape_character +QuoteFields,quote_fields +QuoteSymbol,quote_symbol +QvbrQualityLevel,qvbr_quality_level +QvbrQualityLevelFineTune,qvbr_quality_level_fine_tune +QvbrSettings,qvbr_settings +R53HostedZoneDeletionState,r53_hosted_zone_deletion_state +R53Resource,r53_resource +R53ResourceRecord,r53_resource_record +RDFGraphSummary,rdf_graph_summary +RDFGraphSummaryValueMap,rdf_graph_summary_value_map +RDSData,rds_data +RDSDataSpec,rds_data_spec +RDSDatabase,rds_database +RDSDatabaseCredentials,rds_database_credentials +RDSInstanceDetails,rds_instance_details +RDSMetadata,rds_metadata +RDSSourceConfig,rds_source_config +RICostForUnusedHours,ri_cost_for_unused_hours +RMSE,rmse +RSessionAppSettings,r_session_app_settings +RStudioConnectUrl,r_studio_connect_url +RStudioPackageManagerUrl,r_studio_package_manager_url +RStudioServerProAppSettings,r_studio_server_pro_app_settings +RStudioServerProDomainSettings,r_studio_server_pro_domain_settings +RStudioServerProDomainSettingsForUpdate,r_studio_server_pro_domain_settings_for_update +RTMPConfiguration,rtmp_configuration +RaAllowed,ra_allowed +RabbitMQBrokerParameters,rabbit_mq_broker_parameters +RackElevation,rack_elevation +RackId,rack_id +RackPhysicalProperties,rack_physical_properties +RadarChartAggregatedFieldWells,radar_chart_aggregated_field_wells +RadarChartAreaStyleSettings,radar_chart_area_style_settings +RadarChartConfiguration,radar_chart_configuration +RadarChartFieldWells,radar_chart_field_wells +RadarChartSeriesSettings,radar_chart_series_settings +RadarChartSortConfiguration,radar_chart_sort_configuration +RadarChartVisual,radar_chart_visual +Radios,radios +Radius,radius +RadiusPort,radius_port +RadiusRetries,radius_retries +RadiusServers,radius_servers +RadiusSettings,radius_settings +RadiusStatus,radius_status +RadiusTimeout,radius_timeout +RaidArray,raid_array +RaidArrayId,raid_array_id +RaidArrayIds,raid_array_ids +RaidArrays,raid_arrays +RaidLevel,raid_level +RamDiskId,ram_disk_id +Ramdisk,ramdisk +RamdiskId,ramdisk_id +RandomNonce,random_nonce +RandomPassword,random_password +RandomSeed,random_seed +RandomSplit,random_split +RandomSplitActivity,random_split_activity +RandomSplitEntry,random_split_entry +Range,range +RangeConstant,range_constant +RangeEndsLabelType,range_ends_label_type +RangeInBytes,range_in_bytes +RangeInKilometers,range_in_kilometers +RangeMaximum,range_maximum +RangeMaximumValue,range_maximum_value +RangeMinimum,range_minimum +RangeMinimumValue,range_minimum_value +RangeNotSatisfiableException,range_not_satisfiable_exception +RangedConnectionDetails,ranged_connection_details +RangedSocketAddress,ranged_socket_address +RangesOnIndexedValues,ranges_on_indexed_values +Rank,rank +RankOrder,rank_order +RasterDataCollectionArn,raster_data_collection_arn +RasterDataCollectionMetadata,raster_data_collection_metadata +RasterDataCollectionName,raster_data_collection_name +RasterDataCollectionQuery,raster_data_collection_query +RasterDataCollectionQueryInput,raster_data_collection_query_input +RasterDataCollectionQueryOutput,raster_data_collection_query_output +RasterDataCollectionQueryWithBandFilterInput,raster_data_collection_query_with_band_filter_input +RasterDataCollectionSummaries,raster_data_collection_summaries +RateBasedRule,rate_based_rule +RateBasedStatement,rate_based_statement +RateBasedStatementCustomKey,rate_based_statement_custom_key +RateBasedStatementManagedKeysIPSet,rate_based_statement_managed_keys_ip_set +RateControlMode,rate_control_mode +RateExceededException,rate_exceeded_exception +RateIncreaseCriteria,rate_increase_criteria +RateKey,rate_key +RateLimit,rate_limit +RateLimitCookie,rate_limit_cookie +RateLimitExceededException,rate_limit_exceeded_exception +RateLimitHeader,rate_limit_header +RateLimitLabelNamespace,rate_limit_label_namespace +RateLimitQueryArgument,rate_limit_query_argument +RateLimitQueryString,rate_limit_query_string +RateLimitUriPath,rate_limit_uri_path +RateMode,rate_mode +Rating,rating +Raw,raw +RawContent,raw_content +RawEmail,raw_email +RawFormat,raw_format +RawInputRecords,raw_input_records +RawMessage,raw_message +RawMessageContent,raw_message_content +RawMetricData,raw_metric_data +RawSecretAccessKey,raw_secret_access_key +RawSettings,raw_settings +RawString,raw_string +RblName,rbl_name +RdsConfiguration,rds_configuration +RdsDbClusterSnapshotConfiguration,rds_db_cluster_snapshot_configuration +RdsDbInstance,rds_db_instance +RdsDbInstanceArn,rds_db_instance_arn +RdsDbInstanceArns,rds_db_instance_arns +RdsDbInstanceDetails,rds_db_instance_details +RdsDbInstances,rds_db_instances +RdsDbSnapshotConfiguration,rds_db_snapshot_configuration +RdsDbUserDetails,rds_db_user_details +RdsEngine,rds_engine +RdsEventCategories,rds_event_categories +RdsEventMessage,rds_event_message +RdsHttpEndpointConfig,rds_http_endpoint_config +RdsLoginAttemptAction,rds_login_attempt_action +RdsParameters,rds_parameters +RdsRecommendation,rds_recommendation +RdsRequirements,rds_requirements +RdsResourceId,rds_resource_id +ReEncryptDataInput,re_encrypt_data_input +ReEncryptDataOutput,re_encrypt_data_output +ReEncryptRequest,re_encrypt_request +ReEncryptResponse,re_encrypt_response +ReactStartCodegenJobData,react_start_codegen_job_data +ReactionForComment,reaction_for_comment +ReactionLimitExceededException,reaction_limit_exceeded_exception +ReactionValueFormats,reaction_value_formats +ReactionValueRequiredException,reaction_value_required_exception +Reactions,reactions +ReactiveAnomalies,reactive_anomalies +ReactiveAnomaly,reactive_anomaly +ReactiveAnomalySummary,reactive_anomaly_summary +ReactiveInsight,reactive_insight +ReactiveInsightSummary,reactive_insight_summary +ReactiveInsights,reactive_insights +ReactiveOrganizationInsightSummary,reactive_organization_insight_summary +Read,read +ReadAccessPrincipalArns,read_access_principal_arns +ReadAheadBlocks,read_ahead_blocks +ReadAttributes,read_attributes +ReadBackupOnly,read_backup_only +ReadCapacityUnits,read_capacity_units +ReadDeleteRate,read_delete_rate +ReadEndpoint,read_endpoint +ReadIOs,read_ios +ReadJobRequest,read_job_request +ReadJobResponse,read_job_response +ReadMarkerTimestamp,read_marker_timestamp +ReadOnly,read_only +ReadOnlyAdmins,read_only_admins +ReadOnlyFieldInfo,read_only_field_info +ReadOnlyFields,read_only_fields +ReadOnlyViolationException,read_only_violation_exception +ReadOptions,read_options +ReadPipelineRequest,read_pipeline_request +ReadPipelineResponse,read_pipeline_response +ReadPresetRequest,read_preset_request +ReadPresetResponse,read_preset_response +ReadRate,read_rate +ReadRatePercent,read_rate_percent +ReadReplicaCapable,read_replica_capable +ReadReplicaDBClusterIdentifiers,read_replica_db_cluster_identifiers +ReadReplicaDBInstanceIdentifiers,read_replica_db_instance_identifiers +ReadReplicaIdentifiers,read_replica_identifiers +ReadReplicaSourceDBClusterIdentifier,read_replica_source_db_cluster_identifier +ReadReplicaSourceDBInstanceIdentifier,read_replica_source_db_instance_identifier +ReadSetBatchError,read_set_batch_error +ReadSetFiles,read_set_files +ReadSetFilter,read_set_filter +ReadSetListItem,read_set_list_item +ReadSetUploadPartListFilter,read_set_upload_part_list_filter +ReadSetUploadPartListItem,read_set_upload_part_list_item +ReadTableSpaceName,read_table_space_name +ReadTime,read_time +ReadTimestamp,read_timestamp +ReadWriteType,read_write_type +ReaderEndpoint,reader_endpoint +ReaderGroup,reader_group +Readers,readers +Readiness,readiness +ReadinessCheckArn,readiness_check_arn +ReadinessCheckName,readiness_check_name +ReadinessCheckOutput,readiness_check_output +ReadinessCheckSummary,readiness_check_summary +ReadinessChecks,readiness_checks +ReadinessScopes,readiness_scopes +ReadmeBody,readme_body +ReadmeUrl,readme_url +ReadonlyRootFilesystem,readonly_root_filesystem +Ready,ready +ReadyDateTime,ready_date_time +RealTimeAlertConfiguration,real_time_alert_configuration +RealTimeAlertRule,real_time_alert_rule +RealTimeInferenceConfig,real_time_inference_config +RealTimeInferenceRecommendation,real_time_inference_recommendation +RealTimeInferenceRecommendations,real_time_inference_recommendations +RealizedSavings,realized_savings +Realm,realm +RealtimeContactAnalysisSegment,realtime_contact_analysis_segment +RealtimeEndpointInfo,realtime_endpoint_info +RealtimeLogConfig,realtime_log_config +RealtimeLogConfigAlreadyExists,realtime_log_config_already_exists +RealtimeLogConfigArn,realtime_log_config_arn +RealtimeLogConfigInUse,realtime_log_config_in_use +RealtimeLogConfigName,realtime_log_config_name +RealtimeLogConfigOwnerMismatch,realtime_log_config_owner_mismatch +RealtimeLogConfigs,realtime_log_configs +RealtimeMetricsSubscriptionConfig,realtime_metrics_subscription_config +RealtimeMetricsSubscriptionStatus,realtime_metrics_subscription_status +Reason,reason +ReasonCode,reason_code +ReasonCodeSummary,reason_code_summary +ReasonCodes,reason_codes +ReasonContext,reason_context +ReasonForNewProvisioningData,reason_for_new_provisioning_data +ReasonMessage,reason_message +Reasons,reasons +RebalanceSlotsInGlobalReplicationGroupMessage,rebalance_slots_in_global_replication_group_message +RebalanceSlotsInGlobalReplicationGroupResult,rebalance_slots_in_global_replication_group_result +RebootBrokerRequest,reboot_broker_request +RebootBrokerResponse,reboot_broker_response +RebootCacheClusterMessage,reboot_cache_cluster_message +RebootCacheClusterResult,reboot_cache_cluster_result +RebootClusterMessage,reboot_cluster_message +RebootClusterResult,reboot_cluster_result +RebootDBClusterMessage,reboot_db_cluster_message +RebootDBClusterResult,reboot_db_cluster_result +RebootDBInstanceMessage,reboot_db_instance_message +RebootDBInstanceResult,reboot_db_instance_result +RebootInputDeviceRequest,reboot_input_device_request +RebootInstanceRequest,reboot_instance_request +RebootInstanceResult,reboot_instance_result +RebootInstancesRequest,reboot_instances_request +RebootNodeRequest,reboot_node_request +RebootNodeResponse,reboot_node_response +RebootOption,reboot_option +RebootRelationalDatabaseRequest,reboot_relational_database_request +RebootRelationalDatabaseResult,reboot_relational_database_result +RebootReplicationInstanceMessage,reboot_replication_instance_message +RebootReplicationInstanceResponse,reboot_replication_instance_response +RebootRequest,reboot_request +RebootWorkspaceRequests,reboot_workspace_requests +RebootWorkspacesRequest,reboot_workspaces_request +RebootWorkspacesResult,reboot_workspaces_result +Rebooting,rebooting +RebuildEnvironmentMessage,rebuild_environment_message +RebuildRequest,rebuild_request +RebuildSnapshots,rebuild_snapshots +RebuildWorkspace,rebuild_workspace +RebuildWorkspaceRequests,rebuild_workspace_requests +RebuildWorkspacesRequest,rebuild_workspaces_request +RebuildWorkspacesResult,rebuild_workspaces_result +Rec601Settings,rec601_settings +Rec709Settings,rec709_settings +Recall,recall +Receipt,receipt +ReceiptAction,receipt_action +ReceiptFilter,receipt_filter +ReceiptHandle,receipt_handle +ReceiptInfo,receipt_info +ReceiptIpFilter,receipt_ip_filter +ReceiptRule,receipt_rule +ReceiptRuleSetMetadata,receipt_rule_set_metadata +ReceiptTime,receipt_time +ReceiptType,receipt_type +Receipts,receipts +ReceiveMessageRequest,receive_message_request +ReceiveMessageResult,receive_message_result +ReceiveRequestAttemptId,receive_request_attempt_id +ReceivedAt,received_at +ReceivedEventAgeHistogram,received_event_age_histogram +ReceivedMetadata,received_metadata +ReceivedStatus,received_status +ReceivedStatusReason,received_status_reason +ReceivedTime,received_time +Recency,recency +RecencyDimension,recency_dimension +RecencyType,recency_type +RecentCaseCommunications,recent_case_communications +RecentlyActive,recently_active +RecentlyFailedRuns,recently_failed_runs +Recipe,recipe +RecipeAction,recipe_action +RecipeArn,recipe_arn +RecipeName,recipe_name +RecipeReference,recipe_reference +RecipeStep,recipe_step +RecipeSummary,recipe_summary +RecipeUri,recipe_uri +RecipeVersion,recipe_version +RecipeVersionErrorDetail,recipe_version_error_detail +RecipeVersions,recipe_versions +Recipes,recipes +Recipient,recipient +RecipientArn,recipient_arn +RecipientDetail,recipient_detail +RecipientDsnFields,recipient_dsn_fields +RecipientId,recipient_id +RecipientInfo,recipient_info +RecipientParticipantId,recipient_participant_id +Recipients,recipients +RecognizeCelebritiesRequest,recognize_celebrities_request +RecognizeCelebritiesResponse,recognize_celebrities_response +RecognizeTextRequest,recognize_text_request +RecognizeTextResponse,recognize_text_response +RecognizeUtteranceRequest,recognize_utterance_request +RecognizeUtteranceResponse,recognize_utterance_response +RecognizedBotMember,recognized_bot_member +RecognizerMetadata,recognizer_metadata +RecognizerName,recognizer_name +Recommendation,recommendation +RecommendationCategory,recommendation_category +RecommendationData,recommendation_data +RecommendationDescription,recommendation_description +RecommendationDetailData,recommendation_detail_data +RecommendationDetailHourlyMetrics,recommendation_detail_hourly_metrics +RecommendationDetailId,recommendation_detail_id +RecommendationDetails,recommendation_details +RecommendationDisruptionCompliance,recommendation_disruption_compliance +RecommendationExportJob,recommendation_export_job +RecommendationFeedback,recommendation_feedback +RecommendationFeedbackSummaries,recommendation_feedback_summaries +RecommendationFeedbackSummary,recommendation_feedback_summary +RecommendationId,recommendation_id +RecommendationIds,recommendation_ids +RecommendationItem,recommendation_item +RecommendationJobCompiledOutputConfig,recommendation_job_compiled_output_config +RecommendationJobContainerConfig,recommendation_job_container_config +RecommendationJobInferenceBenchmark,recommendation_job_inference_benchmark +RecommendationJobInputConfig,recommendation_job_input_config +RecommendationJobOutputConfig,recommendation_job_output_config +RecommendationJobPayloadConfig,recommendation_job_payload_config +RecommendationJobResourceLimit,recommendation_job_resource_limit +RecommendationJobStoppingConditions,recommendation_job_stopping_conditions +RecommendationJobVpcConfig,recommendation_job_vpc_config +RecommendationMetrics,recommendation_metrics +RecommendationPreferences,recommendation_preferences +RecommendationPreferencesDetail,recommendation_preferences_detail +RecommendationProviderIdType,recommendation_provider_id_type +RecommendationProviderRoleArn,recommendation_provider_role_arn +RecommendationProviderUri,recommendation_provider_uri +RecommendationRelatedAnomaly,recommendation_related_anomaly +RecommendationRelatedAnomalyResource,recommendation_related_anomaly_resource +RecommendationRelatedAnomalySourceDetail,recommendation_related_anomaly_source_detail +RecommendationRelatedCloudWatchMetricsSourceDetail,recommendation_related_cloud_watch_metrics_source_detail +RecommendationRelatedEvent,recommendation_related_event +RecommendationRelatedEventResource,recommendation_related_event_resource +RecommendationReportDetails,recommendation_report_details +RecommendationRunId,recommendation_run_id +RecommendationSet,recommendation_set +RecommendationSettings,recommendation_settings +RecommendationSource,recommendation_source +RecommendationStatus,recommendation_status +RecommendationSummaries,recommendation_summaries +RecommendationSummary,recommendation_summary +RecommendationTarget,recommendation_target +RecommendationTemplate,recommendation_template +RecommendationText,recommendation_text +RecommendationTransformerUri,recommendation_transformer_uri +RecommendationTrigger,recommendation_trigger +RecommendationType,recommendation_type +Recommendations,recommendations +RecommendationsDisplayName,recommendations_display_name +RecommendationsPerMessage,recommendations_per_message +RecommendedIntentSummary,recommended_intent_summary +RecommendedNormalizedUnitsToPurchase,recommended_normalized_units_to_purchase +RecommendedNumberOfInstancesToPurchase,recommended_number_of_instances_to_purchase +RecommendedOptionProjectedMetric,recommended_option_projected_metric +RecommendedRuleset,recommended_ruleset +RecommendedVersion,recommended_version +Recommender,recommender +RecommenderConfig,recommender_config +RecommenderConfigurationResponse,recommender_configuration_response +RecommenderId,recommender_id +RecommenderSummary,recommender_summary +RecommenderUpdateSummary,recommender_update_summary +ReconfigurationType,reconfiguration_type +ReconnectEnabled,reconnect_enabled +Record,record +RecordActivityTaskHeartbeatInput,record_activity_task_heartbeat_input +RecordColumn,record_column +RecordColumnDelimiter,record_column_delimiter +RecordColumnUpdates,record_column_updates +RecordColumns,record_columns +RecordData,record_data +RecordDelimiter,record_delimiter +RecordDetail,record_detail +RecordDetails,record_details +RecordEncoding,record_encoding +RecordEncodingUpdate,record_encoding_update +RecordError,record_error +RecordErrors,record_errors +RecordFormat,record_format +RecordFormatType,record_format_type +RecordFormatUpdate,record_format_update +RecordHandlerProgressInput,record_handler_progress_input +RecordId,record_id +RecordIdentifierFeatureName,record_identifier_feature_name +RecordIdentifierValueAsString,record_identifier_value_as_string +RecordIdentifiersValueAsString,record_identifiers_value_as_string +RecordIndex,record_index +RecordIngestionFailures,record_ingestion_failures +RecordLength,record_length +RecordLifecycleActionHeartbeatType,record_lifecycle_action_heartbeat_type +RecordMarkerDecisionAttributes,record_marker_decision_attributes +RecordMarkerFailedEventAttributes,record_marker_failed_event_attributes +RecordName,record_name +RecordOutput,record_output +RecordOutputs,record_outputs +RecordPatch,record_patch +RecordPatches,record_patches +RecordPollingLimit,record_polling_limit +RecordPreprocessorSourceUri,record_preprocessor_source_uri +RecordRowDelimiter,record_row_delimiter +RecordRowPath,record_row_path +RecordSetId,record_set_id +RecordSizeKiB,record_size_kib +RecordState,record_state +RecordTag,record_tag +RecordTags,record_tags +RecordType,record_type +RecordVersion,record_version +RecordWrapperType,record_wrapper_type +RecordedAt,recorded_at +RecorderConfig,recorder_config +RecorderStatus,recorder_status +RecordingConfiguration,recording_configuration +RecordingConfigurationSummary,recording_configuration_summary +RecordingFileFormat,recording_file_format +RecordingGroup,recording_group +RecordingStrategy,recording_strategy +RecordingStreamConfiguration,recording_stream_configuration +Records,records +RecordsEvent,records_event +RecordsIngested,records_ingested +RecordsProcessed,records_processed +RecoveryCheckpoint,recovery_checkpoint +RecoveryGroupArn,recovery_group_arn +RecoveryGroupName,recovery_group_name +RecoveryGroupOutput,recovery_group_output +RecoveryGroups,recovery_groups +RecoveryInstance,recovery_instance +RecoveryInstanceDataReplicationError,recovery_instance_data_replication_error +RecoveryInstanceDataReplicationInfo,recovery_instance_data_replication_info +RecoveryInstanceDataReplicationInfoReplicatedDisk,recovery_instance_data_replication_info_replicated_disk +RecoveryInstanceDataReplicationInitiation,recovery_instance_data_replication_initiation +RecoveryInstanceDataReplicationInitiationStep,recovery_instance_data_replication_initiation_step +RecoveryInstanceDisk,recovery_instance_disk +RecoveryInstanceFailback,recovery_instance_failback +RecoveryInstanceProperties,recovery_instance_properties +RecoveryLifeCycle,recovery_life_cycle +RecoveryMechanisms,recovery_mechanisms +RecoveryOptionType,recovery_option_type +RecoveryPoint,recovery_point +RecoveryPointArn,recovery_point_arn +RecoveryPointByBackupVault,recovery_point_by_backup_vault +RecoveryPointByResource,recovery_point_by_resource +RecoveryPointCreator,recovery_point_creator +RecoveryPointMember,recovery_point_member +RecoveryPointSelection,recovery_point_selection +RecoveryPointTags,recovery_point_tags +RecoveryPoints,recovery_points +RecoverySnapshot,recovery_snapshot +RecoveryWindow,recovery_window +RecoveryWindowInDays,recovery_window_in_days +RecrawlBehavior,recrawl_behavior +RecrawlPolicy,recrawl_policy +Rectangle,rectangle +Recurrence,recurrence +RecurrenceInHours,recurrence_in_hours +RecurrenceMultiplier,recurrence_multiplier +RecurrenceSettings,recurrence_settings +RecurringCharge,recurring_charge +RecurringChargeAmount,recurring_charge_amount +RecurringChargeFrequency,recurring_charge_frequency +RecurringCharges,recurring_charges +RecurringCount,recurring_count +RecurringStandardMonthlyCost,recurring_standard_monthly_cost +Recurse,recurse +Recursive,recursive +RecursiveDeleteOption,recursive_delete_option +RecursiveInvocationException,recursive_invocation_exception +RecycleBinEnterTime,recycle_bin_enter_time +RecycleBinExitTime,recycle_bin_exit_time +RecycleBinFolderId,recycle_bin_folder_id +Red,red +RedPrimaryX,red_primary_x +RedPrimaryY,red_primary_y +RedactChannelMessageRequest,redact_channel_message_request +RedactChannelMessageResponse,redact_channel_message_response +RedactConversationMessageRequest,redact_conversation_message_request +RedactRoomMessageRequest,redact_room_message_request +Redacted,redacted +RedactedEwsAvailabilityProvider,redacted_ews_availability_provider +RedactedFields,redacted_fields +RedactedMediaFileUri,redacted_media_file_uri +RedactedTranscriptFileUri,redacted_transcript_file_uri +RedactionConfig,redaction_config +RedactionOutput,redaction_output +RedactionType,redaction_type +Redirect,redirect +RedirectActionConfig,redirect_action_config +RedirectAllRequestsTo,redirect_all_requests_to +RedirectConfig,redirect_config +RedirectException,redirect_exception +RedirectLocation,redirect_location +RedirectSignInURIs,redirect_sign_in_uris +RedirectSignOutURIs,redirect_sign_out_uris +RedirectURL,redirect_url +RedisSettings,redis_settings +Redshift,redshift +RedshiftConnectorProfileCredentials,redshift_connector_profile_credentials +RedshiftConnectorProfileProperties,redshift_connector_profile_properties +RedshiftDataParameters,redshift_data_parameters +RedshiftDataProviderSettings,redshift_data_provider_settings +RedshiftDataShareAsset,redshift_data_share_asset +RedshiftDataShareAssetSourceEntry,redshift_data_share_asset_source_entry +RedshiftDataSpec,redshift_data_spec +RedshiftDatabase,redshift_database +RedshiftDatabaseCredentials,redshift_database_credentials +RedshiftDatasetDefinition,redshift_dataset_definition +RedshiftDestinationConfiguration,redshift_destination_configuration +RedshiftDestinationDescription,redshift_destination_description +RedshiftDestinationProperties,redshift_destination_properties +RedshiftDestinationUpdate,redshift_destination_update +RedshiftInstanceDetails,redshift_instance_details +RedshiftMetadata,redshift_metadata +RedshiftParameters,redshift_parameters +RedshiftPid,redshift_pid +RedshiftQueryId,redshift_query_id +RedshiftRetryOptions,redshift_retry_options +RedshiftSettings,redshift_settings +RedshiftSource,redshift_source +RedshiftSourceConfig,redshift_source_config +RedshiftTarget,redshift_target +RedshiftTmpDir,redshift_tmp_dir +RedundancyPercent,redundancy_percent +RedundantManifest,redundant_manifest +ReenrollAllCertificateHolders,reenroll_all_certificate_holders +RefId,ref_id +RefResource,ref_resource +Reference,reference +ReferenceActionName,reference_action_name +ReferenceArn,reference_arn +ReferenceData,reference_data +ReferenceDataSource,reference_data_source +ReferenceDataSourceDescription,reference_data_source_description +ReferenceDataSourceDescriptions,reference_data_source_descriptions +ReferenceDataSourceUpdate,reference_data_source_update +ReferenceDataSourceUpdates,reference_data_source_updates +ReferenceDataSources,reference_data_sources +ReferenceDoesNotExistException,reference_does_not_exist_exception +ReferenceFiles,reference_files +ReferenceFilter,reference_filter +ReferenceId,reference_id +ReferenceImage,reference_image +ReferenceLine,reference_line +ReferenceLineCustomLabelConfiguration,reference_line_custom_label_configuration +ReferenceLineDataConfiguration,reference_line_data_configuration +ReferenceLineDynamicDataConfiguration,reference_line_dynamic_data_configuration +ReferenceLineLabelConfiguration,reference_line_label_configuration +ReferenceLineStaticDataConfiguration,reference_line_static_data_configuration +ReferenceLineStyleConfiguration,reference_line_style_configuration +ReferenceLineValueLabelConfiguration,reference_line_value_label_configuration +ReferenceLines,reference_lines +ReferenceListItem,reference_list_item +ReferenceMetric,reference_metric +ReferenceNameRequiredException,reference_name_required_exception +ReferencePath,reference_path +ReferencePredictorArn,reference_predictor_arn +ReferencePredictorSummary,reference_predictor_summary +ReferenceRoleARN,reference_role_arn +ReferenceRoleARNUpdate,reference_role_arn_update +ReferenceScalar,reference_scalar +ReferenceSchema,reference_schema +ReferenceSchemaUpdate,reference_schema_update +ReferenceSets,reference_sets +ReferenceStoreDetail,reference_store_detail +ReferenceStoreFilter,reference_store_filter +ReferenceSummaryList,reference_summary_list +ReferenceTypeNotSupportedException,reference_type_not_supported_exception +ReferenceTypes,reference_types +ReferenceUrls,reference_urls +ReferencedBy,referenced_by +ReferencedByResources,referenced_by_resources +ReferencedGroupId,referenced_group_id +ReferencedGroupInfo,referenced_group_info +ReferencedImageDetail,referenced_image_detail +ReferencedImagesNotFoundException,referenced_images_not_found_exception +ReferencedSecurityGroup,referenced_security_group +References,references +ReferencingVpcId,referencing_vpc_id +ReferrerPolicy,referrer_policy +Refresh,refresh +RefreshArn,refresh_arn +RefreshCacheInput,refresh_cache_input +RefreshCacheOutput,refresh_cache_output +RefreshClosedReports,refresh_closed_reports +RefreshConfiguration,refresh_configuration +RefreshDetails,refresh_details +RefreshFrequency,refresh_frequency +RefreshId,refresh_id +RefreshOnDay,refresh_on_day +RefreshOnSegmentUpdate,refresh_on_segment_update +RefreshPreferences,refresh_preferences +RefreshSchedule,refresh_schedule +RefreshSchedules,refresh_schedules +RefreshSchemasMessage,refresh_schemas_message +RefreshSchemasResponse,refresh_schemas_response +RefreshSchemasStatus,refresh_schemas_status +RefreshStatisticsIdMap,refresh_statistics_id_map +RefreshStatus,refresh_status +RefreshToken,refresh_token +RefreshTokenExpiration,refresh_token_expiration +RefreshTokenRequest,refresh_token_request +RefreshTokenRequestBody,refresh_token_request_body +RefreshTokenResponse,refresh_token_response +RefreshTokenValidity,refresh_token_validity +RefreshTrustedAdvisorCheckRequest,refresh_trusted_advisor_check_request +RefreshTrustedAdvisorCheckResponse,refresh_trusted_advisor_check_response +RefreshType,refresh_type +RefreshedAt,refreshed_at +RegParamsRevision,reg_params_revision +RegenerateSecurityTokenRequest,regenerate_security_token_request +RegenerateSecurityTokenResponse,regenerate_security_token_response +Regex,regex +RegexMatchSet,regex_match_set +RegexMatchSetId,regex_match_set_id +RegexMatchSetSummary,regex_match_set_summary +RegexMatchSetUpdate,regex_match_set_update +RegexMatchSets,regex_match_sets +RegexMatchStatement,regex_match_statement +RegexMatchTuple,regex_match_tuple +RegexMatchTuples,regex_match_tuples +RegexPatternSet,regex_pattern_set +RegexPatternSetId,regex_pattern_set_id +RegexPatternSetReferenceStatement,regex_pattern_set_reference_statement +RegexPatternSetSummary,regex_pattern_set_summary +RegexPatternSetUpdate,regex_pattern_set_update +RegexPatternSets,regex_pattern_sets +RegexPatternString,regex_pattern_string +RegexPatternStrings,regex_pattern_strings +RegexString,regex_string +Region,region +RegionCode,region_code +RegionConcurrencyType,region_concurrency_type +RegionDescription,region_description +RegionDisabledException,region_disabled_exception +RegionFilters,region_filters +RegionIdentifier,region_identifier +RegionInfo,region_info +RegionLimitExceededException,region_limit_exceeded_exception +RegionLinkingMode,region_linking_mode +RegionMapInputValue,region_map_input_value +RegionName,region_name +RegionNames,region_names +RegionOfInterest,region_of_interest +RegionOptStatus,region_opt_status +RegionOptStatusContains,region_opt_status_contains +RegionOrder,region_order +RegionReport,region_report +RegionScope,region_scope +RegionType,region_type +RegionalBucket,regional_bucket +RegionalBucketList,regional_bucket_list +RegionalConfiguration,regional_configuration +RegionalConfigurations,regional_configurations +Regions,regions +RegionsDescription,regions_description +RegionsInfo,regions_info +RegionsOfInterest,regions_of_interest +RegionsOfInterestForUpdate,regions_of_interest_for_update +RegisterAVSDeviceRequest,register_avs_device_request +RegisterAVSDeviceResponse,register_avs_device_response +RegisterAccountRequest,register_account_request +RegisterAccountResponse,register_account_response +RegisterActivityTypeInput,register_activity_type_input +RegisterAgentRequest,register_agent_request +RegisterAgentResponse,register_agent_response +RegisterAppInstanceUserEndpointRequest,register_app_instance_user_endpoint_request +RegisterAppInstanceUserEndpointResponse,register_app_instance_user_endpoint_response +RegisterApplicationInput,register_application_input +RegisterApplicationOutput,register_application_output +RegisterApplicationRevisionInput,register_application_revision_input +RegisterCACertificateRequest,register_ca_certificate_request +RegisterCACertificateResponse,register_ca_certificate_response +RegisterCertificateRequest,register_certificate_request +RegisterCertificateResponse,register_certificate_response +RegisterCertificateResult,register_certificate_result +RegisterCertificateWithoutCARequest,register_certificate_without_ca_request +RegisterCertificateWithoutCAResponse,register_certificate_without_ca_response +RegisterClientRequest,register_client_request +RegisterClientResponse,register_client_response +RegisterClusterRequest,register_cluster_request +RegisterClusterResponse,register_cluster_response +RegisterComputeInput,register_compute_input +RegisterComputeOutput,register_compute_output +RegisterConnectorRequest,register_connector_request +RegisterConnectorResponse,register_connector_response +RegisterContainerImageRequest,register_container_image_request +RegisterContainerImageResult,register_container_image_result +RegisterContainerInstanceRequest,register_container_instance_request +RegisterContainerInstanceResponse,register_container_instance_response +RegisterCrossAccountAccessRoleRequest,register_cross_account_access_role_request +RegisterDBProxyTargetsRequest,register_db_proxy_targets_request +RegisterDBProxyTargetsResponse,register_db_proxy_targets_response +RegisterDataLakeDelegatedAdministratorRequest,register_data_lake_delegated_administrator_request +RegisterDefaultPatchBaselineRequest,register_default_patch_baseline_request +RegisterDefaultPatchBaselineResult,register_default_patch_baseline_result +RegisterDelegatedAdministratorRequest,register_delegated_administrator_request +RegisterDeviceRequest,register_device_request +RegisterDeviceResponse,register_device_response +RegisterDevicesRequest,register_devices_request +RegisterDomainInput,register_domain_input +RegisterDomainRequest,register_domain_request +RegisterDomainResponse,register_domain_response +RegisterEcsClusterRequest,register_ecs_cluster_request +RegisterEcsClusterResult,register_ecs_cluster_result +RegisterElasticIpRequest,register_elastic_ip_request +RegisterElasticIpResult,register_elastic_ip_result +RegisterEndPointsInput,register_end_points_input +RegisterEndPointsOutput,register_end_points_output +RegisterEndpoints,register_endpoints +RegisterEventTopicRequest,register_event_topic_request +RegisterGameServerInput,register_game_server_input +RegisterGameServerOutput,register_game_server_output +RegisterIdentityProviderRequest,register_identity_provider_request +RegisterIdentityProviderResponse,register_identity_provider_response +RegisterImageRequest,register_image_request +RegisterImageResult,register_image_result +RegisterInstanceEventNotificationAttributesRequest,register_instance_event_notification_attributes_request +RegisterInstanceEventNotificationAttributesResult,register_instance_event_notification_attributes_result +RegisterInstanceRequest,register_instance_request +RegisterInstanceResponse,register_instance_response +RegisterInstanceResult,register_instance_result +RegisterInstanceTagAttributeRequest,register_instance_tag_attribute_request +RegisterJobDefinitionRequest,register_job_definition_request +RegisterJobDefinitionResponse,register_job_definition_response +RegisterMailDomainRequest,register_mail_domain_request +RegisterModel,register_model +RegisterModelStepMetadata,register_model_step_metadata +RegisterNewBaseline,register_new_baseline +RegisterOnPremisesInstanceInput,register_on_premises_instance_input +RegisterOrganizationAdminAccountRequest,register_organization_admin_account_request +RegisterOrganizationAdminAccountResponse,register_organization_admin_account_response +RegisterOrganizationDelegatedAdminRequest,register_organization_delegated_admin_request +RegisterPackageVersionRequest,register_package_version_request +RegisterPatchBaselineForPatchGroupRequest,register_patch_baseline_for_patch_group_request +RegisterPatchBaselineForPatchGroupResult,register_patch_baseline_for_patch_group_result +RegisterPublisherInput,register_publisher_input +RegisterPublisherOutput,register_publisher_output +RegisterRdsDbInstanceRequest,register_rds_db_instance_request +RegisterResourceRequest,register_resource_request +RegisterRobotRequest,register_robot_request +RegisterRobotResponse,register_robot_response +RegisterScalableTargetRequest,register_scalable_target_request +RegisterScalableTargetResponse,register_scalable_target_response +RegisterSchemaVersionInput,register_schema_version_input +RegisterSchemaVersionResponse,register_schema_version_response +RegisterSlackWorkspaceForOrganizationRequest,register_slack_workspace_for_organization_request +RegisterSlackWorkspaceForOrganizationResult,register_slack_workspace_for_organization_result +RegisterStreamConsumerInput,register_stream_consumer_input +RegisterStreamConsumerOutput,register_stream_consumer_output +RegisterTargetWithMaintenanceWindowRequest,register_target_with_maintenance_window_request +RegisterTargetWithMaintenanceWindowResult,register_target_with_maintenance_window_result +RegisterTargetsInput,register_targets_input +RegisterTargetsRequest,register_targets_request +RegisterTargetsResponse,register_targets_response +RegisterTaskDefinitionRequest,register_task_definition_request +RegisterTaskDefinitionResponse,register_task_definition_response +RegisterTaskWithMaintenanceWindowRequest,register_task_with_maintenance_window_request +RegisterTaskWithMaintenanceWindowResult,register_task_with_maintenance_window_result +RegisterThingRequest,register_thing_request +RegisterThingResponse,register_thing_response +RegisterToWorkMailRequest,register_to_work_mail_request +RegisterTransitGatewayMulticastGroupMembersRequest,register_transit_gateway_multicast_group_members_request +RegisterTransitGatewayMulticastGroupMembersResult,register_transit_gateway_multicast_group_members_result +RegisterTransitGatewayMulticastGroupSourcesRequest,register_transit_gateway_multicast_group_sources_request +RegisterTransitGatewayMulticastGroupSourcesResult,register_transit_gateway_multicast_group_sources_result +RegisterTransitGatewayRequest,register_transit_gateway_request +RegisterTransitGatewayResponse,register_transit_gateway_response +RegisterTypeInput,register_type_input +RegisterTypeOutput,register_type_output +RegisterUsageRequest,register_usage_request +RegisterUsageResult,register_usage_result +RegisterUserRequest,register_user_request +RegisterUserResponse,register_user_response +RegisterVolumeRequest,register_volume_request +RegisterVolumeResult,register_volume_result +RegisterWebhookWithThirdPartyInput,register_webhook_with_third_party_input +RegisterWorkflowTypeInput,register_workflow_type_input +RegisterWorkspaceDirectoryRequest,register_workspace_directory_request +Registered,registered +RegisteredAt,registered_at +RegisteredBy,registered_by +RegisteredContainerInstancesCount,registered_container_instances_count +RegisteredDate,registered_date +RegisteredDateTime,registered_date_time +RegisteredDeviceCount,registered_device_count +RegisteredDomainDelegationInfo,registered_domain_delegation_info +RegisteredGatewayArn,registered_gateway_arn +RegisteredId,registered_id +RegisteredMulticastGroupMembers,registered_multicast_group_members +RegisteredMulticastGroupSources,registered_multicast_group_sources +RegisteredNetworkInterfaceIds,registered_network_interface_ids +RegisteredOn,registered_on +RegisteredTime,registered_time +RegisteredUserConsoleFeatureConfigurations,registered_user_console_feature_configurations +RegisteredUserDashboardEmbeddingConfiguration,registered_user_dashboard_embedding_configuration +RegisteredUserDashboardFeatureConfigurations,registered_user_dashboard_feature_configurations +RegisteredUserDashboardVisualEmbeddingConfiguration,registered_user_dashboard_visual_embedding_configuration +RegisteredUserEmbeddingExperienceConfiguration,registered_user_embedding_experience_configuration +RegisteredUserQSearchBarEmbeddingConfiguration,registered_user_q_search_bar_embedding_configuration +RegisteredUserQuickSightConsoleEmbeddingConfiguration,registered_user_quick_sight_console_embedding_configuration +Registering,registering +RegistrantContact,registrant_contact +RegistrantPrivacy,registrant_privacy +RegistrarName,registrar_name +RegistrarUrl,registrar_url +RegistrationCode,registration_code +RegistrationCodeValidationException,registration_code_validation_exception +RegistrationConfig,registration_config +RegistrationDate,registration_date +RegistrationId,registration_id +RegistrationLimit,registration_limit +RegistrationMetadata,registration_metadata +RegistrationMetadataItem,registration_metadata_item +RegistrationOutput,registration_output +RegistrationPagePath,registration_page_path +RegistrationPrice,registration_price +RegistrationStatusFilter,registration_status_filter +RegistrationTime,registration_time +RegistrationToken,registration_token +RegistrationTokenList,registration_token_list +RegistrationZone,registration_zone +RegistrationsCount,registrations_count +Registries,registries +Registry,registry +RegistryAlias,registry_alias +RegistryArn,registry_arn +RegistryCatalogData,registry_catalog_data +RegistryCredential,registry_credential +RegistryDomainId,registry_domain_id +RegistryId,registry_id +RegistryListItem,registry_list_item +RegistryName,registry_name +RegistryNamePrefix,registry_name_prefix +RegistryNotFoundException,registry_not_found_exception +RegistryPolicyNotFoundException,registry_policy_not_found_exception +RegistryScanningConfiguration,registry_scanning_configuration +RegistryScanningRule,registry_scanning_rule +RegistrySummary,registry_summary +RegularExpressionList,regular_expression_list +RehydrationType,rehydration_type +ReimportApiRequest,reimport_api_request +ReimportApiResponse,reimport_api_response +RejectAssignmentRequest,reject_assignment_request +RejectAttachmentRequest,reject_attachment_request +RejectAttachmentResponse,reject_attachment_response +RejectCertificateTransferRequest,reject_certificate_transfer_request +RejectClientVpcConnectionRequest,reject_client_vpc_connection_request +RejectDataShareMessage,reject_data_share_message +RejectDomainTransferFromAnotherAwsAccountRequest,reject_domain_transfer_from_another_aws_account_request +RejectDomainTransferFromAnotherAwsAccountResponse,reject_domain_transfer_from_another_aws_account_response +RejectEnvironmentAccountConnectionInput,reject_environment_account_connection_input +RejectEnvironmentAccountConnectionOutput,reject_environment_account_connection_output +RejectGrantRequest,reject_grant_request +RejectGrantResponse,reject_grant_response +RejectInboundConnectionRequest,reject_inbound_connection_request +RejectInboundConnectionResponse,reject_inbound_connection_response +RejectInboundCrossClusterSearchConnectionRequest,reject_inbound_cross_cluster_search_connection_request +RejectInboundCrossClusterSearchConnectionResponse,reject_inbound_cross_cluster_search_connection_response +RejectInputDeviceTransferRequest,reject_input_device_transfer_request +RejectInvitationInput,reject_invitation_input +RejectInvitationRequest,reject_invitation_request +RejectPortfolioShareInput,reject_portfolio_share_input +RejectQualificationRequestRequest,reject_qualification_request_request +RejectResourceShareInvitationRequest,reject_resource_share_invitation_request +RejectResourceShareInvitationResponse,reject_resource_share_invitation_response +RejectSharedDirectoryRequest,reject_shared_directory_request +RejectSharedDirectoryResult,reject_shared_directory_result +RejectSkillRequest,reject_skill_request +RejectTransitGatewayMulticastDomainAssociationsRequest,reject_transit_gateway_multicast_domain_associations_request +RejectTransitGatewayMulticastDomainAssociationsResult,reject_transit_gateway_multicast_domain_associations_result +RejectTransitGatewayPeeringAttachmentRequest,reject_transit_gateway_peering_attachment_request +RejectTransitGatewayPeeringAttachmentResult,reject_transit_gateway_peering_attachment_result +RejectTransitGatewayVpcAttachmentRequest,reject_transit_gateway_vpc_attachment_request +RejectTransitGatewayVpcAttachmentResult,reject_transit_gateway_vpc_attachment_result +RejectVpcEndpointConnectionsRequest,reject_vpc_endpoint_connections_request +RejectVpcEndpointConnectionsResult,reject_vpc_endpoint_connections_result +RejectVpcPeeringConnectionRequest,reject_vpc_peering_connection_request +RejectVpcPeeringConnectionResult,reject_vpc_peering_connection_result +RejectedLogEventsInfo,rejected_log_events_info +RejectedPatches,rejected_patches +RejectedPatchesAction,rejected_patches_action +RejectedRecord,rejected_record +RejectedRecords,rejected_records +RejectedRecordsException,rejected_records_exception +RejectionTime,rejection_time +Rejects,rejects +RekeyFuzzPercentage,rekey_fuzz_percentage +RekeyMarginTimeSeconds,rekey_margin_time_seconds +RelatedAnomalies,related_anomalies +RelatedColumnName,related_column_name +RelatedContactId,related_contact_id +RelatedDeployments,related_deployments +RelatedEvents,related_events +RelatedFinding,related_finding +RelatedFindings,related_findings +RelatedFindingsId,related_findings_id +RelatedFindingsProductArn,related_findings_product_arn +RelatedItem,related_item +RelatedItemEventIncludedData,related_item_event_included_data +RelatedObservations,related_observations +RelatedOpsItem,related_ops_item +RelatedOpsItems,related_ops_items +RelatedRequirements,related_requirements +RelatedResource,related_resource +RelatedResourceArns,related_resource_arns +RelatedVulnerabilities,related_vulnerabilities +RelatedWorkspaceProperties,related_workspace_properties +RelatedWorkspaces,related_workspaces +RelationType,relation_type +RelationalCatalogSource,relational_catalog_source +RelationalDatabase,relational_database +RelationalDatabaseBlueprint,relational_database_blueprint +RelationalDatabaseBundle,relational_database_bundle +RelationalDatabaseDataSourceConfig,relational_database_data_source_config +RelationalDatabaseEndpoint,relational_database_endpoint +RelationalDatabaseEvent,relational_database_event +RelationalDatabaseHardware,relational_database_hardware +RelationalDatabaseParameter,relational_database_parameter +RelationalDatabaseSnapshot,relational_database_snapshot +RelationalTable,relational_table +Relationship,relationship +RelationshipScore,relationship_score +RelationshipStatus,relationship_status +RelationshipType,relationship_type +RelationshipTypeFilter,relationship_type_filter +RelationshipValue,relationship_value +Relationships,relationships +RelationshipsListItem,relationships_list_item +Relative,relative +RelativeAggregationDuration,relative_aggregation_duration +RelativeDateFilter,relative_date_filter +RelativeDateFilterFunction,relative_date_filter_function +RelativeDateTime,relative_date_time +RelativeDateTimeControlDisplayOptions,relative_date_time_control_display_options +RelativeDateType,relative_date_type +RelativeDateValue,relative_date_value +RelativeDatesFilter,relative_dates_filter +RelativePath,relative_path +RelativePosition,relative_position +RelativeProgram,relative_program +RelativeTimeRange,relative_time_range +RelayState,relay_state +RelayStateParameterName,relay_state_parameter_name +Release,release +ReleaseAddressRequest,release_address_request +ReleaseAfterMinutes,release_after_minutes +ReleaseAgentPath,release_agent_path +ReleaseConfiguration,release_configuration +ReleaseDate,release_date +ReleaseFileSystemNfsV3LocksRequest,release_file_system_nfs_v3_locks_request +ReleaseFileSystemNfsV3LocksResponse,release_file_system_nfs_v3_locks_response +ReleaseHostsRequest,release_hosts_request +ReleaseHostsResult,release_hosts_result +ReleaseIpamPoolAllocationRequest,release_ipam_pool_allocation_request +ReleaseIpamPoolAllocationResult,release_ipam_pool_allocation_result +ReleaseLabel,release_label +ReleaseLabelFilter,release_label_filter +ReleaseLabels,release_labels +ReleaseNotes,release_notes +ReleasePhoneNumberRequest,release_phone_number_request +ReleasePhoneNumberResult,release_phone_number_result +ReleaseStaticIpRequest,release_static_ip_request +ReleaseStaticIpResult,release_static_ip_result +ReleaseStatus,release_status +ReleaseSummaries,release_summaries +ReleaseSummary,release_summary +ReleaseTime,release_time +ReleaseVersion,release_version +ReleasedCapacity,released_capacity +Relevance,relevance +RelevanceFeedback,relevance_feedback +RelevanceFeedbackItems,relevance_feedback_items +RelevanceValue,relevance_value +ReloadOption,reload_option +ReloadReplicationTablesMessage,reload_replication_tables_message +ReloadReplicationTablesResponse,reload_replication_tables_response +ReloadTablesMessage,reload_tables_message +ReloadTablesResponse,reload_tables_response +RemainingCount,remaining_count +RemainingLife,remaining_life +RemainingTotalValue,remaining_total_value +RemainingUpfrontValue,remaining_upfront_value +Remarks,remarks +Remediation,remediation +RemediationAction,remediation_action +RemediationActionType,remediation_action_type +RemediationActionWithOrder,remediation_action_with_order +RemediationConfiguration,remediation_configuration +RemediationConfigurations,remediation_configurations +RemediationEnabled,remediation_enabled +RemediationException,remediation_exception +RemediationExceptionResourceKey,remediation_exception_resource_key +RemediationExceptions,remediation_exceptions +RemediationExecutionStatus,remediation_execution_status +RemediationExecutionStatuses,remediation_execution_statuses +RemediationExecutionStep,remediation_execution_step +RemediationInProgressException,remediation_in_progress_exception +RemediationParameterValue,remediation_parameter_value +RemediationRecommendation,remediation_recommendation +RemediationResult,remediation_result +RemediationUrl,remediation_url +ReminderAtMinutes,reminder_at_minutes +ReminderType,reminder_type +RemixSettings,remix_settings +Remote,remote +RemoteAccessConfig,remote_access_config +RemoteAccessSession,remote_access_session +RemoteAccountDetails,remote_account_details +RemoteAdministrationEndpoint,remote_administration_endpoint +RemoteDirectoryPath,remote_directory_path +RemoteDomainInfo,remote_domain_info +RemoteDomainName,remote_domain_name +RemoteDomainNames,remote_domain_names +RemoteId,remote_id +RemoteIpDetails,remote_ip_details +RemoteIpv4NetworkCidr,remote_ipv4_network_cidr +RemoteIpv6NetworkCidr,remote_ipv6_network_cidr +RemoteManagement,remote_management +RemoteMta,remote_mta +RemotePortDetails,remote_port_details +RemoteSourceCodeAnalysisServerInfo,remote_source_code_analysis_server_info +RemoteSources,remote_sources +Removals,removals +Remove,remove +RemoveAccountFromOrganizationRequest,remove_account_from_organization_request +RemoveAclConfiguration,remove_acl_configuration +RemoveAction,remove_action +RemoveAllBackendsRequest,remove_all_backends_request +RemoveAllBackendsResponse,remove_all_backends_response +RemoveAllPermissions,remove_all_permissions +RemoveAllResourcePermissionsRequest,remove_all_resource_permissions_request +RemoveAllocationResourceTags,remove_allocation_resource_tags +RemoveAllowedPrincipals,remove_allowed_principals +RemoveApplicationInstanceRequest,remove_application_instance_request +RemoveAttributesActivity,remove_attributes_activity +RemoveAttributesFromFindingsRequest,remove_attributes_from_findings_request +RemoveAttributesFromFindingsResponse,remove_attributes_from_findings_response +RemoveAttributesRequest,remove_attributes_request +RemoveAttributesResponse,remove_attributes_response +RemoveAutoScalingPolicyInput,remove_auto_scaling_policy_input +RemoveAutoTerminationPolicyInput,remove_auto_termination_policy_input +RemoveAvailabilityZonesInput,remove_availability_zones_input +RemoveAvailabilityZonesOutput,remove_availability_zones_output +RemoveBackendConfigRequest,remove_backend_config_request +RemoveBackendConfigResponse,remove_backend_config_response +RemoveBridgeOutputRequest,remove_bridge_output_request +RemoveBridgeOutputResponse,remove_bridge_output_response +RemoveBridgeSourceRequest,remove_bridge_source_request +RemoveBridgeSourceResponse,remove_bridge_source_response +RemoveBytesScannedCutoffPerQuery,remove_bytes_scanned_cutoff_per_query +RemoveClientIDFromOpenIDConnectProviderRequest,remove_client_id_from_open_id_connect_provider_request +RemoveCustomRoutingEndpointsRequest,remove_custom_routing_endpoints_request +RemoveCustomerContentEncryptionConfiguration,remove_customer_content_encryption_configuration +RemoveCustomerOverride,remove_customer_override +RemoveDraftAppVersionResourceMappingsRequest,remove_draft_app_version_resource_mappings_request +RemoveDraftAppVersionResourceMappingsResponse,remove_draft_app_version_resource_mappings_response +RemoveEncryptionConfiguration,remove_encryption_configuration +RemoveEndDate,remove_end_date +RemoveEndpointsRequest,remove_endpoints_request +RemoveEntries,remove_entries +RemoveExpectedBucketOwner,remove_expected_bucket_owner +RemoveFacetFromObject,remove_facet_from_object +RemoveFacetFromObjectRequest,remove_facet_from_object_request +RemoveFields,remove_fields +RemoveFlowMediaStreamRequest,remove_flow_media_stream_request +RemoveFlowMediaStreamResponse,remove_flow_media_stream_response +RemoveFlowOutputRequest,remove_flow_output_request +RemoveFlowOutputResponse,remove_flow_output_response +RemoveFlowSourceRequest,remove_flow_source_request +RemoveFlowSourceResponse,remove_flow_source_response +RemoveFlowVpcInterfaceRequest,remove_flow_vpc_interface_request +RemoveFlowVpcInterfaceResponse,remove_flow_vpc_interface_response +RemoveFromGlobalClusterMessage,remove_from_global_cluster_message +RemoveFromGlobalClusterResult,remove_from_global_cluster_result +RemoveFromVersionId,remove_from_version_id +RemoveGatewayLoadBalancerArns,remove_gateway_load_balancer_arns +RemoveHeadersConfig,remove_headers_config +RemoveIamRoles,remove_iam_roles +RemoveInvalidCertificateFromPersonalStore,remove_invalid_certificate_from_personal_store +RemoveIpRoutesRequest,remove_ip_routes_request +RemoveIpamOperatingRegion,remove_ipam_operating_region +RemoveKnowledgeBaseTemplateUriRequest,remove_knowledge_base_template_uri_request +RemoveLFTagsFromResourceRequest,remove_lf_tags_from_resource_request +RemoveLFTagsFromResourceResponse,remove_lf_tags_from_resource_response +RemoveLayerVersionPermissionRequest,remove_layer_version_permission_request +RemoveLicenseSpecifications,remove_license_specifications +RemoveListenerCertificatesInput,remove_listener_certificates_input +RemoveManagedScalingPolicyInput,remove_managed_scaling_policy_input +RemoveNetworkLoadBalancerArns,remove_network_load_balancer_arns +RemoveNetworkServices,remove_network_services +RemoveNotificationChannelRequest,remove_notification_channel_request +RemoveNotificationChannelResponse,remove_notification_channel_response +RemoveOperatingRegions,remove_operating_regions +RemoveOutputLocation,remove_output_location +RemovePermissionInput,remove_permission_input +RemovePermissionRequest,remove_permission_request +RemovePermissionResponse,remove_permission_response +RemovePrefixListEntry,remove_prefix_list_entry +RemovePrivateDnsName,remove_private_dns_name +RemoveProfilePermissionRequest,remove_profile_permission_request +RemoveProfilePermissionResponse,remove_profile_permission_response +RemoveQuotes,remove_quotes +RemoveRegionRequest,remove_region_request +RemoveRegionsFromReplicationRequest,remove_regions_from_replication_request +RemoveRegionsFromReplicationResponse,remove_regions_from_replication_response +RemoveReplicaRegions,remove_replica_regions +RemoveResourcePermissionRequest,remove_resource_permission_request +RemoveRoleFromDBClusterMessage,remove_role_from_db_cluster_message +RemoveRoleFromDBInstanceMessage,remove_role_from_db_instance_message +RemoveRoleFromInstanceProfileRequest,remove_role_from_instance_profile_request +RemoveRouteTableIds,remove_route_table_ids +RemoveSNSTopic,remove_sns_topic +RemoveSchemaVersionMetadataInput,remove_schema_version_metadata_input +RemoveSchemaVersionMetadataResponse,remove_schema_version_metadata_response +RemoveSecurityGroupIds,remove_security_group_ids +RemoveSourceIdentifierFromSubscriptionMessage,remove_source_identifier_from_subscription_message +RemoveSourceIdentifierFromSubscriptionResult,remove_source_identifier_from_subscription_result +RemoveSourceServerActionRequest,remove_source_server_action_request +RemoveStorageSystemRequest,remove_storage_system_request +RemoveSubnetArns,remove_subnet_arns +RemoveSubnetIds,remove_subnet_ids +RemoveSubnets,remove_subnets +RemoveSupportedIpAddressTypes,remove_supported_ip_address_types +RemoveTagKeys,remove_tag_keys +RemoveTags,remove_tags +RemoveTagsFromCertificateRequest,remove_tags_from_certificate_request +RemoveTagsFromOnPremisesInstancesInput,remove_tags_from_on_premises_instances_input +RemoveTagsFromResourceInput,remove_tags_from_resource_input +RemoveTagsFromResourceMessage,remove_tags_from_resource_message +RemoveTagsFromResourceOutput,remove_tags_from_resource_output +RemoveTagsFromResourceRequest,remove_tags_from_resource_request +RemoveTagsFromResourceResponse,remove_tags_from_resource_response +RemoveTagsFromStreamInput,remove_tags_from_stream_input +RemoveTagsFromVaultInput,remove_tags_from_vault_input +RemoveTagsInput,remove_tags_input +RemoveTagsRequest,remove_tags_request +RemoveTargetsRequest,remove_targets_request +RemoveTargetsResponse,remove_targets_response +RemoveTargetsResultEntry,remove_targets_result_entry +RemoveTemplateActionRequest,remove_template_action_request +RemoveThingFromBillingGroupRequest,remove_thing_from_billing_group_request +RemoveThingFromThingGroupRequest,remove_thing_from_thing_group_request +RemoveTransitGatewayCidrBlocks,remove_transit_gateway_cidr_blocks +RemoveUserFromGroupRequest,remove_user_from_group_request +RemoveUserGroups,remove_user_groups +RemoveWorkloadRequest,remove_workload_request +RemovedLabels,removed_labels +RenameColumnOperation,rename_column_operation +RenameField,rename_field +RenderUiTemplateRequest,render_ui_template_request +RenderUiTemplateResponse,render_ui_template_response +RenderableTask,renderable_task +RenderedContent,rendered_content +RenderedTemplate,rendered_template +RenderingConfiguration,rendering_configuration +RenderingEngine,rendering_engine +RenderingError,rendering_error +RenderingRules,rendering_rules +RenditionConfiguration,rendition_configuration +RenditionGroupId,rendition_group_id +RenditionLanguageCode,rendition_language_code +RenditionName,rendition_name +RenewCertificateRequest,renew_certificate_request +RenewDomainRequest,renew_domain_request +RenewDomainResponse,renew_domain_response +RenewOfferingRequest,renew_offering_request +RenewOfferingResult,renew_offering_result +RenewType,renew_type +RenewalCount,renewal_count +RenewalEligibility,renewal_eligibility +RenewalPeriod,renewal_period +RenewalPrice,renewal_price +RenewalSettings,renewal_settings +RenewalStatus,renewal_status +RenewalStatusReason,renewal_status_reason +RenewalSummary,renewal_summary +RenewalType,renewal_type +ReorderReceiptRuleSetRequest,reorder_receipt_rule_set_request +RepInterval,rep_interval +RepeatAt,repeat_at +RepeatExtXKey,repeat_ext_x_key +RepeatFrameMsec,repeat_frame_msec +RepeatPps,repeat_pps +Replace,replace +ReplaceAllLabels,replace_all_labels +ReplaceChars,replace_chars +ReplaceContentEntry,replace_content_entry +ReplaceDefaultPolicyVersionParams,replace_default_policy_version_params +ReplaceIamInstanceProfileAssociationRequest,replace_iam_instance_profile_association_request +ReplaceIamInstanceProfileAssociationResult,replace_iam_instance_profile_association_result +ReplaceInvalidChars,replace_invalid_chars +ReplaceKeyPrefixWith,replace_key_prefix_with +ReplaceKeyWith,replace_key_with +ReplaceNetworkAclAssociationRequest,replace_network_acl_association_request +ReplaceNetworkAclAssociationResult,replace_network_acl_association_result +ReplaceNetworkAclEntryRequest,replace_network_acl_entry_request +ReplacePathPrefix,replace_path_prefix +ReplacePermissionAssociationsRequest,replace_permission_associations_request +ReplacePermissionAssociationsResponse,replace_permission_associations_response +ReplacePermissionAssociationsWork,replace_permission_associations_work +ReplaceRootVolumeTask,replace_root_volume_task +ReplaceRootVolumeTaskId,replace_root_volume_task_id +ReplaceRootVolumeTaskIds,replace_root_volume_task_ids +ReplaceRootVolumeTasks,replace_root_volume_tasks +ReplaceRouteRequest,replace_route_request +ReplaceRouteTableAssociationRequest,replace_route_table_association_request +ReplaceRouteTableAssociationResult,replace_route_table_association_result +ReplaceTopicRuleRequest,replace_topic_rule_request +ReplaceTransitGatewayRouteRequest,replace_transit_gateway_route_request +ReplaceTransitGatewayRouteResult,replace_transit_gateway_route_result +ReplaceUnhealthyInstances,replace_unhealthy_instances +ReplaceVpnTunnelRequest,replace_vpn_tunnel_request +ReplaceVpnTunnelResult,replace_vpn_tunnel_result +Replacement,replacement +ReplacementContentRequiredException,replacement_content_required_exception +ReplacementEmailContent,replacement_email_content +ReplacementJob,replacement_job +ReplacementStrategy,replacement_strategy +ReplacementTags,replacement_tags +ReplacementTemplate,replacement_template +ReplacementTemplateData,replacement_template_data +ReplacementTypeRequiredException,replacement_type_required_exception +Replay,replay +ReplayArn,replay_arn +ReplayDestination,replay_destination +ReplayEndTime,replay_end_time +ReplayName,replay_name +ReplayStartTime,replay_start_time +ReplayWindowSize,replay_window_size +Replays,replays +Replica,replica +ReplicaAlias,replica_alias +ReplicaAlreadyExistsException,replica_already_exists_exception +ReplicaAutoScalingDescription,replica_auto_scaling_description +ReplicaAutoScalingUpdate,replica_auto_scaling_update +ReplicaAvailabilityZones,replica_availability_zones +ReplicaBillingModeSummary,replica_billing_mode_summary +ReplicaConfiguration,replica_configuration +ReplicaConfigurationRequest,replica_configuration_request +ReplicaCount,replica_count +ReplicaDescription,replica_description +ReplicaGlobalSecondaryIndex,replica_global_secondary_index +ReplicaGlobalSecondaryIndexAutoScalingDescription,replica_global_secondary_index_auto_scaling_description +ReplicaGlobalSecondaryIndexAutoScalingUpdate,replica_global_secondary_index_auto_scaling_update +ReplicaGlobalSecondaryIndexDescription,replica_global_secondary_index_description +ReplicaGlobalSecondaryIndexSettings,replica_global_secondary_index_settings +ReplicaGlobalSecondaryIndexSettingsDescription,replica_global_secondary_index_settings_description +ReplicaGlobalSecondaryIndexSettingsUpdate,replica_global_secondary_index_settings_update +ReplicaGlobalSecondaryIndexUpdates,replica_global_secondary_index_updates +ReplicaInaccessibleDateTime,replica_inaccessible_date_time +ReplicaKeyMetadata,replica_key_metadata +ReplicaKeys,replica_keys +ReplicaKmsKeyID,replica_kms_key_id +ReplicaMode,replica_mode +ReplicaModifications,replica_modifications +ReplicaNotFoundException,replica_not_found_exception +ReplicaOutpostArns,replica_outpost_arns +ReplicaPolicy,replica_policy +ReplicaProvisionedReadCapacityAutoScalingSettings,replica_provisioned_read_capacity_auto_scaling_settings +ReplicaProvisionedReadCapacityAutoScalingSettingsUpdate,replica_provisioned_read_capacity_auto_scaling_settings_update +ReplicaProvisionedReadCapacityAutoScalingUpdate,replica_provisioned_read_capacity_auto_scaling_update +ReplicaProvisionedReadCapacityUnits,replica_provisioned_read_capacity_units +ReplicaProvisionedWriteCapacityAutoScalingSettings,replica_provisioned_write_capacity_auto_scaling_settings +ReplicaProvisionedWriteCapacityUnits,replica_provisioned_write_capacity_units +ReplicaRegion,replica_region +ReplicaRegionType,replica_region_type +ReplicaSettings,replica_settings +ReplicaSettingsDescription,replica_settings_description +ReplicaSettingsUpdate,replica_settings_update +ReplicaStatus,replica_status +ReplicaStatusDescription,replica_status_description +ReplicaStatusPercentProgress,replica_status_percent_progress +ReplicaTableClass,replica_table_class +ReplicaTableClassSummary,replica_table_class_summary +ReplicaTags,replica_tags +ReplicaUpdate,replica_update +ReplicaUpdates,replica_updates +Replicas,replicas +ReplicasPerNodeGroup,replicas_per_node_group +ReplicasToRemove,replicas_to_remove +ReplicateInstanceRequest,replicate_instance_request +ReplicateInstanceResponse,replicate_instance_response +ReplicateKeyRequest,replicate_key_request +ReplicateKeyResponse,replicate_key_response +ReplicateSecretToRegionsRequest,replicate_secret_to_regions_request +ReplicateSecretToRegionsResponse,replicate_secret_to_regions_response +ReplicateShardCollections,replicate_shard_collections +ReplicateTo,replicate_to +ReplicatingFrom,replicating_from +ReplicatingTo,replicating_to +Replication,replication +ReplicationConfig,replication_config +ReplicationConfigArn,replication_config_arn +ReplicationConfigCreateTime,replication_config_create_time +ReplicationConfigIdentifier,replication_config_identifier +ReplicationConfigUpdateTime,replication_config_update_time +ReplicationConfigs,replication_configs +ReplicationConfiguration,replication_configuration +ReplicationConfigurationDescription,replication_configuration_description +ReplicationConfigurationReplicatedDisk,replication_configuration_replicated_disk +ReplicationConfigurationTemplate,replication_configuration_template +ReplicationCreateTime,replication_create_time +ReplicationDestination,replication_destination +ReplicationDetails,replication_details +ReplicationFactor,replication_factor +ReplicationGroup,replication_group +ReplicationGroupAlreadyExistsFault,replication_group_already_exists_fault +ReplicationGroupAlreadyUnderMigrationFault,replication_group_already_under_migration_fault +ReplicationGroupCreateTime,replication_group_create_time +ReplicationGroupDescription,replication_group_description +ReplicationGroupId,replication_group_id +ReplicationGroupIds,replication_group_ids +ReplicationGroupLogDeliveryEnabled,replication_group_log_delivery_enabled +ReplicationGroupMessage,replication_group_message +ReplicationGroupNotFoundFault,replication_group_not_found_fault +ReplicationGroupNotUnderMigrationFault,replication_group_not_under_migration_fault +ReplicationGroupPendingModifiedValues,replication_group_pending_modified_values +ReplicationGroupRegion,replication_group_region +ReplicationGroupUpdate,replication_group_update +ReplicationGroups,replication_groups +ReplicationInstance,replication_instance +ReplicationInstanceArn,replication_instance_arn +ReplicationInstanceClass,replication_instance_class +ReplicationInstanceEngineMinimumVersion,replication_instance_engine_minimum_version +ReplicationInstanceIdentifier,replication_instance_identifier +ReplicationInstanceIpv6Addresses,replication_instance_ipv6_addresses +ReplicationInstancePrivateIpAddress,replication_instance_private_ip_address +ReplicationInstancePrivateIpAddresses,replication_instance_private_ip_addresses +ReplicationInstancePublicIpAddress,replication_instance_public_ip_address +ReplicationInstancePublicIpAddresses,replication_instance_public_ip_addresses +ReplicationInstanceStatus,replication_instance_status +ReplicationInstanceTaskLog,replication_instance_task_log +ReplicationInstanceTaskLogSize,replication_instance_task_log_size +ReplicationInstanceTaskLogs,replication_instance_task_logs +ReplicationInstances,replication_instances +ReplicationJob,replication_job +ReplicationJobAlreadyExistsException,replication_job_already_exists_exception +ReplicationJobNotFoundException,replication_job_not_found_exception +ReplicationLastStopTime,replication_last_stop_time +ReplicationNotFound,replication_not_found +ReplicationPendingModifiedValues,replication_pending_modified_values +ReplicationRule,replication_rule +ReplicationRuleAndOperator,replication_rule_and_operator +ReplicationRuleFilter,replication_rule_filter +ReplicationRun,replication_run +ReplicationRunLimitExceededException,replication_run_limit_exceeded_exception +ReplicationRunStageDetails,replication_run_stage_details +ReplicationScope,replication_scope +ReplicationSet,replication_set +ReplicationSettings,replication_settings +ReplicationSourceIdentifier,replication_source_identifier +ReplicationSpecification,replication_specification +ReplicationStats,replication_stats +ReplicationStatus,replication_status +ReplicationStatusType,replication_status_type +ReplicationSubnetGroup,replication_subnet_group +ReplicationSubnetGroupDescription,replication_subnet_group_description +ReplicationSubnetGroupDoesNotCoverEnoughAZs,replication_subnet_group_does_not_cover_enough_azs +ReplicationSubnetGroupId,replication_subnet_group_id +ReplicationSubnetGroupIdentifier,replication_subnet_group_identifier +ReplicationSubnetGroups,replication_subnet_groups +ReplicationTableStatistics,replication_table_statistics +ReplicationTask,replication_task +ReplicationTaskArn,replication_task_arn +ReplicationTaskAssessmentResult,replication_task_assessment_result +ReplicationTaskAssessmentResults,replication_task_assessment_results +ReplicationTaskAssessmentRun,replication_task_assessment_run +ReplicationTaskAssessmentRunArn,replication_task_assessment_run_arn +ReplicationTaskAssessmentRunCreationDate,replication_task_assessment_run_creation_date +ReplicationTaskAssessmentRunProgress,replication_task_assessment_run_progress +ReplicationTaskAssessmentRuns,replication_task_assessment_runs +ReplicationTaskCreationDate,replication_task_creation_date +ReplicationTaskIdentifier,replication_task_identifier +ReplicationTaskIndividualAssessment,replication_task_individual_assessment +ReplicationTaskIndividualAssessmentArn,replication_task_individual_assessment_arn +ReplicationTaskIndividualAssessmentStartDate,replication_task_individual_assessment_start_date +ReplicationTaskIndividualAssessments,replication_task_individual_assessments +ReplicationTaskLastAssessmentDate,replication_task_last_assessment_date +ReplicationTaskName,replication_task_name +ReplicationTaskSettings,replication_task_settings +ReplicationTaskStartDate,replication_task_start_date +ReplicationTaskStats,replication_task_stats +ReplicationTasks,replication_tasks +ReplicationTime,replication_time +ReplicationTimeValue,replication_time_value +ReplicationType,replication_type +ReplicationUpdateTime,replication_update_time +ReplicationUser,replication_user +Replications,replications +ReplyTo,reply_to +ReplyToAddresses,reply_to_addresses +ReplyToEmailAddress,reply_to_email_address +RepoPrefixLocation,repo_prefix_location +RepoUpgradeOnBoot,repo_upgrade_on_boot +Report,report +ReportConfiguration,report_configuration +ReportContext,report_context +ReportCreatorAccount,report_creator_account +ReportDefinition,report_definition +ReportDefinitions,report_definitions +ReportDeliveryChannel,report_delivery_channel +ReportDestination,report_destination +ReportDestinationS3,report_destination_s3 +ReportDevStatusBattery,report_dev_status_battery +ReportDevStatusMargin,report_dev_status_margin +ReportExportConfig,report_export_config +ReportFilter,report_filter +ReportFormat,report_format +ReportFrequency,report_frequency +ReportGenerated,report_generated +ReportGenerationLimitExceededException,report_generation_limit_exceeded_exception +ReportGenerator,report_generator +ReportGeneratorName,report_generator_name +ReportGenerators,report_generators +ReportGroup,report_group +ReportGroupTrendStats,report_group_trend_stats +ReportId,report_id +ReportInstanceStatusRequest,report_instance_status_request +ReportJob,report_job +ReportJobId,report_job_id +ReportJobs,report_jobs +ReportLevel,report_level +ReportLimitReachedException,report_limit_reached_exception +ReportName,report_name +ReportOverride,report_override +ReportOverrides,report_overrides +ReportPlan,report_plan +ReportPlanArn,report_plan_arn +ReportPlanDescription,report_plan_description +ReportPlanName,report_plan_name +ReportPlanTags,report_plan_tags +ReportPlans,report_plans +ReportResult,report_result +ReportS3Configuration,report_s3_configuration +ReportScope,report_scope +ReportSetting,report_setting +ReportTaskProgressInput,report_task_progress_input +ReportTaskProgressOutput,report_task_progress_output +ReportTaskRunnerHeartbeatInput,report_task_runner_heartbeat_input +ReportTaskRunnerHeartbeatOutput,report_task_runner_heartbeat_output +ReportTemplate,report_template +ReportType,report_type +ReportUri,report_uri +ReportVersioning,report_versioning +ReportWithRawData,report_with_raw_data +ReportedAgentVersion,reported_agent_version +ReportedName,reported_name +ReportedOs,reported_os +ReportedRuntimeContextState,reported_runtime_context_state +ReportedVersion,reported_version +ReportingMta,reporting_mta +Repository,repository +RepositoryAccessMode,repository_access_mode +RepositoryAggregation,repository_aggregation +RepositoryAggregationResponse,repository_aggregation_response +RepositoryAlreadyExistsException,repository_already_exists_exception +RepositoryAnalysis,repository_analysis +RepositoryAssociation,repository_association +RepositoryAssociationArn,repository_association_arn +RepositoryAssociationSummaries,repository_association_summaries +RepositoryAssociationSummary,repository_association_summary +RepositoryAuthConfig,repository_auth_config +RepositoryBranch,repository_branch +RepositoryBranchInput,repository_branch_input +RepositoryCatalogData,repository_catalog_data +RepositoryCatalogDataInput,repository_catalog_data_input +RepositoryCatalogDataNotFoundException,repository_catalog_data_not_found_exception +RepositoryCredentials,repository_credentials +RepositoryCredentialsProviderArn,repository_credentials_provider_arn +RepositoryDescription,repository_description +RepositoryDoesNotExistException,repository_does_not_exist_exception +RepositoryExternalConnectionInfo,repository_external_connection_info +RepositoryFilter,repository_filter +RepositoryHead,repository_head +RepositoryHeadSourceCodeType,repository_head_source_code_type +RepositoryInput,repository_input +RepositoryLimitExceededException,repository_limit_exceeded_exception +RepositoryMetadata,repository_metadata +RepositoryName,repository_name +RepositoryNameExistsException,repository_name_exists_exception +RepositoryNameIdPair,repository_name_id_pair +RepositoryNameRequiredException,repository_name_required_exception +RepositoryNames,repository_names +RepositoryNamesRequiredException,repository_names_required_exception +RepositoryNotAssociatedWithPullRequestException,repository_not_associated_with_pull_request_exception +RepositoryNotEmptyException,repository_not_empty_exception +RepositoryNotFoundException,repository_not_found_exception +RepositoryOwner,repository_owner +RepositoryPolicyNotFoundException,repository_policy_not_found_exception +RepositoryPolicyText,repository_policy_text +RepositoryScanningConfiguration,repository_scanning_configuration +RepositoryScanningConfigurationFailure,repository_scanning_configuration_failure +RepositorySummary,repository_summary +RepositorySyncAttempt,repository_sync_attempt +RepositorySyncDefinition,repository_sync_definition +RepositorySyncEvent,repository_sync_event +RepositoryTrigger,repository_trigger +RepositoryTriggerBranchNameListRequiredException,repository_trigger_branch_name_list_required_exception +RepositoryTriggerDestinationArnRequiredException,repository_trigger_destination_arn_required_exception +RepositoryTriggerEventsListRequiredException,repository_trigger_events_list_required_exception +RepositoryTriggerExecutionFailure,repository_trigger_execution_failure +RepositoryTriggerNameRequiredException,repository_trigger_name_required_exception +RepositoryTriggersListRequiredException,repository_triggers_list_required_exception +RepositoryType,repository_type +RepositoryUrl,repository_url +ReprocessingSummary,reprocessing_summary +RepublishAction,republish_action +ReputationMetricsEnabled,reputation_metrics_enabled +ReputationOptions,reputation_options +Request,request +RequestAlreadyInProgressException,request_already_in_progress_exception +RequestAlreadyProcessedException,request_already_processed_exception +RequestBody,request_body +RequestBodyAssociatedResourceTypeConfig,request_body_associated_resource_type_config +RequestCancelActivityTaskDecisionAttributes,request_cancel_activity_task_decision_attributes +RequestCancelActivityTaskFailedEventAttributes,request_cancel_activity_task_failed_event_attributes +RequestCancelExternalWorkflowExecutionDecisionAttributes,request_cancel_external_workflow_execution_decision_attributes +RequestCancelExternalWorkflowExecutionFailedEventAttributes,request_cancel_external_workflow_execution_failed_event_attributes +RequestCancelExternalWorkflowExecutionInitiatedEventAttributes,request_cancel_external_workflow_execution_initiated_event_attributes +RequestCancelWorkflowExecutionInput,request_cancel_workflow_execution_input +RequestCertificateRequest,request_certificate_request +RequestCertificateResponse,request_certificate_response +RequestChangedException,request_changed_exception +RequestCharacters,request_characters +RequestCharged,request_charged +RequestCompletionTime,request_completion_time +RequestConfiguration,request_configuration +RequestCount,request_count +RequestDetailedStatus,request_detailed_status +RequestDetails,request_details +RequestEntityTooLargeException,request_entity_too_large_exception +RequestEntry,request_entry +RequestEnvironmentInfoMessage,request_environment_info_message +RequestError,request_error +RequestFailedException,request_failed_exception +RequestFilterPortRange,request_filter_port_range +RequestHeaders,request_headers +RequestHeadersInserted,request_headers_inserted +RequestID,request_id +RequestId,request_id +RequestIdentifier,request_identifier +RequestImpactStatistics,request_impact_statistics +RequestInProgressException,request_in_progress_exception +RequestInspection,request_inspection +RequestInspectionACFP,request_inspection_acfp +RequestInterval,request_interval +RequestIpamResourceTag,request_ipam_resource_tag +RequestItems,request_items +RequestLaunchTemplateData,request_launch_template_data +RequestLimitExceeded,request_limit_exceeded +RequestLimitExceededException,request_limit_exceeded_exception +RequestMetadata,request_metadata +RequestModels,request_models +RequestOrigin,request_origin +RequestOutputItem,request_output_item +RequestParameterKey,request_parameter_key +RequestParameters,request_parameters +RequestPayer,request_payer +RequestPaymentConfiguration,request_payment_configuration +RequestPhoneNumberRequest,request_phone_number_request +RequestPhoneNumberResult,request_phone_number_result +RequestProgress,request_progress +RequestResponses,request_responses +RequestRoute,request_route +RequestServiceQuotaIncreaseRequest,request_service_quota_increase_request +RequestServiceQuotaIncreaseResponse,request_service_quota_increase_response +RequestSource,request_source +RequestSpotFleetRequest,request_spot_fleet_request +RequestSpotFleetResponse,request_spot_fleet_response +RequestSpotInstancesRequest,request_spot_instances_request +RequestSpotInstancesResult,request_spot_instances_result +RequestSpotLaunchSpecification,request_spot_launch_specification +RequestStatus,request_status +RequestStatusMessage,request_status_message +RequestTTLSeconds,request_ttl_seconds +RequestTemplates,request_templates +RequestThrottledException,request_throttled_exception +RequestTime,request_time +RequestTimeoutException,request_timeout_exception +RequestTimeoutSeconds,request_timeout_seconds +RequestToken,request_token +RequestTokenARN,request_token_arn +RequestTokenNotFoundException,request_token_not_found_exception +RequestTooLargeException,request_too_large_exception +RequestType,request_type +RequestUploadCredentialsInput,request_upload_credentials_input +RequestUploadCredentialsOutput,request_upload_credentials_output +RequestUri,request_uri +RequestValidator,request_validator +RequestValidators,request_validators +Requested,requested +RequestedAmiVersion,requested_ami_version +RequestedColumns,requested_columns +RequestedDateTime,requested_date_time +RequestedDimensions,requested_dimensions +RequestedDocumentAttributes,requested_document_attributes +RequestedEc2AvailabilityZones,requested_ec2_availability_zones +RequestedEc2SubnetIds,requested_ec2_subnet_ids +RequestedEntityTooLargeException,requested_entity_too_large_exception +RequestedInstanceCount,requested_instance_count +RequestedJobStatus,requested_job_status +RequestedProvisionedConcurrentExecutions,requested_provisioned_concurrent_executions +RequestedQuota,requested_quota +RequestedQuotas,requested_quotas +RequestedRangeNotSatisfiableException,requested_range_not_satisfiable_exception +RequestedServiceQuotaChange,requested_service_quota_change +RequestedTime,requested_time +RequestedTimestamp,requested_timestamp +RequestedValue,requested_value +Requester,requester +RequesterAccountId,requester_account_id +RequesterAnnotation,requester_annotation +RequesterAwsRegion,requester_aws_region +RequesterCharged,requester_charged +RequesterFeedback,requester_feedback +RequesterId,requester_id +RequesterManaged,requester_managed +RequesterPays,requester_pays +RequesterPaysEnabled,requester_pays_enabled +RequesterPeeringConnectionOptions,requester_peering_connection_options +RequesterTgwInfo,requester_tgw_info +RequesterVpcInfo,requester_vpc_info +Requests,requests +RequestsPerSecond,requests_per_second +RequireAlternateSignatureAlgorithm,require_alternate_signature_algorithm +RequireAuthorizationForCacheControl,require_authorization_for_cache_control +RequireCheckIn,require_check_in +RequireCommonName,require_common_name +RequireDirectoryPath,require_directory_path +RequireDnsAsCn,require_dns_as_cn +RequireEachIncludedType,require_each_included_type +RequireEmail,require_email +RequireEncryption,require_encryption +RequireHibernateSupport,require_hibernate_support +RequireLowercase,require_lowercase +RequireLowercaseCharacters,require_lowercase_characters +RequireNumbers,require_numbers +RequirePin,require_pin +RequireSameKeyRenewal,require_same_key_renewal +RequireSymbols,require_symbols +RequireTLS,require_tls +RequireType,require_type +RequireUppercase,require_uppercase +RequireUppercaseCharacters,require_uppercase_characters +Required,required +RequiredActivatedType,required_activated_type +RequiredActivatedTypes,required_activated_types +RequiredBehavior,required_behavior +RequiredCapabilities,required_capabilities +RequiredEquipmentTypes,required_equipment_types +RequiredField,required_field +RequiredFieldInfo,required_field_info +RequiredFields,required_fields +RequiredMinimumPollIntervalInSeconds,required_minimum_poll_interval_in_seconds +RequiredParameters,required_parameters +RequiredSignUpAttributes,required_sign_up_attributes +RequiredTenancy,required_tenancy +RequiredToPreview,required_to_preview +Requirement,requirement +RequirementsS3ObjectVersion,requirements_s3_object_version +RequirementsS3Path,requirements_s3_path +RequirementsToTarget,requirements_to_target +Requires,requires +RequiresAutoMinorEngineVersionUpgrade,requires_auto_minor_engine_version_upgrade +RequiresCompatibilities,requires_compatibilities +RequiresIndexDocuments,requires_index_documents +RequiresRecreation,requires_recreation +ResamplingConfigInput,resampling_config_input +RescoreCapacityUnits,rescore_capacity_units +RescoreExecutionPlanId,rescore_execution_plan_id +RescoreExecutionPlanSummary,rescore_execution_plan_summary +RescoreId,rescore_id +RescoreRequest,rescore_request +RescoreResult,rescore_result +RescoreResultItem,rescore_result_item +Reseller,reseller +ResendConfirmationCodeRequest,resend_confirmation_code_request +ResendConfirmationCodeResponse,resend_confirmation_code_response +ResendContactReachabilityEmailRequest,resend_contact_reachability_email_request +ResendContactReachabilityEmailResponse,resend_contact_reachability_email_response +ResendOperationAuthorizationRequest,resend_operation_authorization_request +ResendValidationEmailRequest,resend_validation_email_request +Reservation,reservation +ReservationARN,reservation_arn +ReservationAggregates,reservation_aggregates +ReservationArn,reservation_arn +ReservationCoverageGroup,reservation_coverage_group +ReservationCoveredHoursInLookbackPeriod,reservation_covered_hours_in_lookback_period +ReservationFleetInstanceSpecification,reservation_fleet_instance_specification +ReservationId,reservation_id +ReservationName,reservation_name +ReservationPlan,reservation_plan +ReservationPlanSettings,reservation_plan_settings +ReservationPurchaseRecommendation,reservation_purchase_recommendation +ReservationPurchaseRecommendationDetail,reservation_purchase_recommendation_detail +ReservationPurchaseRecommendationMetadata,reservation_purchase_recommendation_metadata +ReservationPurchaseRecommendationSummary,reservation_purchase_recommendation_summary +ReservationResourceSpecification,reservation_resource_specification +ReservationState,reservation_state +ReservationType,reservation_type +ReservationUtilizationGroup,reservation_utilization_group +ReservationValue,reservation_value +Reservations,reservations +ReserveContactRequest,reserve_contact_request +ReserveRange,reserve_range +Reserved,reserved +ReservedBitrate,reserved_bitrate +ReservedCacheNode,reserved_cache_node +ReservedCacheNodeAlreadyExistsFault,reserved_cache_node_already_exists_fault +ReservedCacheNodeId,reserved_cache_node_id +ReservedCacheNodeMessage,reserved_cache_node_message +ReservedCacheNodeNotFoundFault,reserved_cache_node_not_found_fault +ReservedCacheNodeQuotaExceededFault,reserved_cache_node_quota_exceeded_fault +ReservedCacheNodes,reserved_cache_nodes +ReservedCacheNodesOffering,reserved_cache_nodes_offering +ReservedCacheNodesOfferingId,reserved_cache_nodes_offering_id +ReservedCacheNodesOfferingMessage,reserved_cache_nodes_offering_message +ReservedCacheNodesOfferingNotFoundFault,reserved_cache_nodes_offering_not_found_fault +ReservedCacheNodesOfferings,reserved_cache_nodes_offerings +ReservedConcurrentExecutions,reserved_concurrent_executions +ReservedDBInstance,reserved_db_instance +ReservedDBInstanceAlreadyExistsFault,reserved_db_instance_already_exists_fault +ReservedDBInstanceArn,reserved_db_instance_arn +ReservedDBInstanceId,reserved_db_instance_id +ReservedDBInstanceMessage,reserved_db_instance_message +ReservedDBInstanceNotFoundFault,reserved_db_instance_not_found_fault +ReservedDBInstanceQuotaExceededFault,reserved_db_instance_quota_exceeded_fault +ReservedDBInstances,reserved_db_instances +ReservedDBInstancesOffering,reserved_db_instances_offering +ReservedDBInstancesOfferingId,reserved_db_instances_offering_id +ReservedDBInstancesOfferingMessage,reserved_db_instances_offering_message +ReservedDBInstancesOfferingNotFoundFault,reserved_db_instances_offering_not_found_fault +ReservedDBInstancesOfferings,reserved_db_instances_offerings +ReservedElasticsearchInstance,reserved_elasticsearch_instance +ReservedElasticsearchInstanceId,reserved_elasticsearch_instance_id +ReservedElasticsearchInstanceOffering,reserved_elasticsearch_instance_offering +ReservedElasticsearchInstanceOfferingId,reserved_elasticsearch_instance_offering_id +ReservedElasticsearchInstanceOfferings,reserved_elasticsearch_instance_offerings +ReservedElasticsearchInstances,reserved_elasticsearch_instances +ReservedHours,reserved_hours +ReservedInstance,reserved_instance +ReservedInstanceId,reserved_instance_id +ReservedInstanceIds,reserved_instance_ids +ReservedInstanceLimitPrice,reserved_instance_limit_price +ReservedInstanceOffering,reserved_instance_offering +ReservedInstanceOfferingId,reserved_instance_offering_id +ReservedInstanceOfferings,reserved_instance_offerings +ReservedInstanceOptions,reserved_instance_options +ReservedInstanceReservationValue,reserved_instance_reservation_value +ReservedInstanceValueRollup,reserved_instance_value_rollup +ReservedInstanceValueSet,reserved_instance_value_set +ReservedInstances,reserved_instances +ReservedInstancesConfiguration,reserved_instances_configuration +ReservedInstancesId,reserved_instances_id +ReservedInstancesIds,reserved_instances_ids +ReservedInstancesListing,reserved_instances_listing +ReservedInstancesListingId,reserved_instances_listing_id +ReservedInstancesListings,reserved_instances_listings +ReservedInstancesModification,reserved_instances_modification +ReservedInstancesModificationId,reserved_instances_modification_id +ReservedInstancesModificationIds,reserved_instances_modification_ids +ReservedInstancesModificationResult,reserved_instances_modification_result +ReservedInstancesModifications,reserved_instances_modifications +ReservedInstancesOffering,reserved_instances_offering +ReservedInstancesOfferingId,reserved_instances_offering_id +ReservedInstancesOfferingIds,reserved_instances_offering_ids +ReservedInstancesOfferings,reserved_instances_offerings +ReservedNameException,reserved_name_exception +ReservedNode,reserved_node +ReservedNodeAlreadyExistsFault,reserved_node_already_exists_fault +ReservedNodeAlreadyMigratedFault,reserved_node_already_migrated_fault +ReservedNodeConfigurationOption,reserved_node_configuration_option +ReservedNodeConfigurationOptionList,reserved_node_configuration_option_list +ReservedNodeExchangeNotFoundFault,reserved_node_exchange_not_found_fault +ReservedNodeExchangeRequestId,reserved_node_exchange_request_id +ReservedNodeExchangeStatus,reserved_node_exchange_status +ReservedNodeExchangeStatusDetails,reserved_node_exchange_status_details +ReservedNodeId,reserved_node_id +ReservedNodeNotFoundFault,reserved_node_not_found_fault +ReservedNodeOffering,reserved_node_offering +ReservedNodeOfferingId,reserved_node_offering_id +ReservedNodeOfferingNotFoundFault,reserved_node_offering_not_found_fault +ReservedNodeOfferingType,reserved_node_offering_type +ReservedNodeOfferings,reserved_node_offerings +ReservedNodeOfferingsMessage,reserved_node_offerings_message +ReservedNodeQuotaExceededFault,reserved_node_quota_exceeded_fault +ReservedNodes,reserved_nodes +ReservedNodesMessage,reserved_nodes_message +ReservedNodesOffering,reserved_nodes_offering +ReservedNodesOfferingId,reserved_nodes_offering_id +ReservedNodesOfferingNotFoundFault,reserved_nodes_offering_not_found_fault +ReservedNodesOfferings,reserved_nodes_offerings +ReservedNormalizedUnits,reserved_normalized_units +ReservedSlots,reserved_slots +ReservedStreamCapacity,reserved_stream_capacity +ReservoirQuota,reservoir_quota +ReservoirQuotaTTL,reservoir_quota_ttl +ReservoirSize,reservoir_size +ResetActionConfiguration,reset_action_configuration +ResetAddressAttributeRequest,reset_address_attribute_request +ResetAddressAttributeResult,reset_address_attribute_result +ResetAlarmActionRequest,reset_alarm_action_request +ResetAllParameters,reset_all_parameters +ResetAuthorizersCacheRequest,reset_authorizers_cache_request +ResetCacheInput,reset_cache_input +ResetCacheOutput,reset_cache_output +ResetCacheParameterGroupMessage,reset_cache_parameter_group_message +ResetClusterParameterGroupMessage,reset_cluster_parameter_group_message +ResetConnectorMetadataCacheRequest,reset_connector_metadata_cache_request +ResetDBClusterParameterGroupMessage,reset_db_cluster_parameter_group_message +ResetDBParameterGroupMessage,reset_db_parameter_group_message +ResetDeploymentsRequest,reset_deployments_request +ResetDeploymentsResponse,reset_deployments_response +ResetDisabled,reset_disabled +ResetDistributionCacheRequest,reset_distribution_cache_request +ResetDistributionCacheResult,reset_distribution_cache_result +ResetEbsDefaultKmsKeyIdRequest,reset_ebs_default_kms_key_id_request +ResetEbsDefaultKmsKeyIdResult,reset_ebs_default_kms_key_id_result +ResetElements,reset_elements +ResetEncryptionKeyRequest,reset_encryption_key_request +ResetFpgaImageAttributeRequest,reset_fpga_image_attribute_request +ResetFpgaImageAttributeResult,reset_fpga_image_attribute_result +ResetImageAttributeRequest,reset_image_attribute_request +ResetInstanceAttributeRequest,reset_instance_attribute_request +ResetJobBookmarkRequest,reset_job_bookmark_request +ResetJobBookmarkResponse,reset_job_bookmark_response +ResetNetworkInterfaceAttributeRequest,reset_network_interface_attribute_request +ResetNotificationSettingsRequest,reset_notification_settings_request +ResetNotificationSettingsResponse,reset_notification_settings_response +ResetOrderNumber,reset_order_number +ResetParameterGroupRequest,reset_parameter_group_request +ResetParameterGroupResponse,reset_parameter_group_response +ResetPasswordRequest,reset_password_request +ResetPersonalPINRequest,reset_personal_pin_request +ResetPersonalPINResponse,reset_personal_pin_response +ResetPolicy,reset_policy +ResetResourceLogLevelRequest,reset_resource_log_level_request +ResetServiceSettingRequest,reset_service_setting_request +ResetServiceSettingResult,reset_service_setting_result +ResetServiceSpecificCredentialRequest,reset_service_specific_credential_request +ResetServiceSpecificCredentialResponse,reset_service_specific_credential_response +ResetSnapshotAttributeRequest,reset_snapshot_attribute_request +ResetTimerAction,reset_timer_action +ResetUserPasswordRequest,reset_user_password_request +ResetUserPasswordResponse,reset_user_password_response +Resharding,resharding +ReshardingConfiguration,resharding_configuration +ReshardingStatus,resharding_status +Resilience,resilience +ResiliencyPolicy,resiliency_policy +ResiliencyScore,resiliency_score +ResizeCluster,resize_cluster +ResizeClusterMessage,resize_cluster_message +ResizeClusterResult,resize_cluster_result +ResizeInfo,resize_info +ResizeNotFoundFault,resize_not_found_fault +ResizeOption,resize_option +ResizeProgressMessage,resize_progress_message +ResizeSpecifications,resize_specifications +ResizeType,resize_type +Resolution,resolution +ResolutionContact,resolution_contact +ResolutionMethod,resolution_method +ResolutionStrategy,resolution_strategy +ResolutionTechniques,resolution_techniques +ResolutionTime,resolution_time +ResolveAlias,resolve_alias +ResolveAliasInput,resolve_alias_input +ResolveAliasOutput,resolve_alias_output +ResolveAppVersionResourcesRequest,resolve_app_version_resources_request +ResolveAppVersionResourcesResponse,resolve_app_version_resources_response +ResolveCaseRequest,resolve_case_request +ResolveCaseResponse,resolve_case_response +ResolveComponentCandidatesRequest,resolve_component_candidates_request +ResolveComponentCandidatesResponse,resolve_component_candidates_response +ResolveCustomerRequest,resolve_customer_request +ResolveCustomerResult,resolve_customer_result +ResolveRoomRequest,resolve_room_request +ResolveRoomResponse,resolve_room_response +Resolved,resolved +ResolvedArtifact,resolved_artifact +ResolvedAttributes,resolved_attributes +ResolvedCIDRCount,resolved_cidr_count +ResolvedComponentVersion,resolved_component_version +ResolvedImage,resolved_image +ResolvedImageUri,resolved_image_uri +ResolvedOutputS3Uri,resolved_output_s3_uri +ResolvedTargets,resolved_targets +ResolvedValue,resolved_value +Resolver,resolver +ResolverConfig,resolver_config +ResolverConfigs,resolver_configs +ResolverDNSSECConfig,resolver_dnssec_config +ResolverDnssecConfig,resolver_dnssec_config +ResolverDnssecConfigs,resolver_dnssec_configs +ResolverEndpoint,resolver_endpoint +ResolverEndpointId,resolver_endpoint_id +ResolverEndpointType,resolver_endpoint_type +ResolverEndpoints,resolver_endpoints +ResolverIP,resolver_ip +ResolverQueryLogConfig,resolver_query_log_config +ResolverQueryLogConfigAssociation,resolver_query_log_config_association +ResolverQueryLogConfigAssociationId,resolver_query_log_config_association_id +ResolverQueryLogConfigAssociations,resolver_query_log_config_associations +ResolverQueryLogConfigId,resolver_query_log_config_id +ResolverQueryLogConfigPolicy,resolver_query_log_config_policy +ResolverQueryLogConfigs,resolver_query_log_configs +ResolverRule,resolver_rule +ResolverRuleAssociation,resolver_rule_association +ResolverRuleAssociationId,resolver_rule_association_id +ResolverRuleAssociations,resolver_rule_associations +ResolverRuleConfig,resolver_rule_config +ResolverRuleId,resolver_rule_id +ResolverRulePolicy,resolver_rule_policy +ResolverRules,resolver_rules +Resource,resource +ResourceARN,resource_arn +ResourceARNDetail,resource_arn_detail +ResourceARNList,resource_arn_list +ResourceARNNotValidException,resource_arn_not_valid_exception +ResourceARNUpdate,resource_arn_update +ResourceARNs,resource_arns +ResourceAccessPolicies,resource_access_policies +ResourceAccessPolicy,resource_access_policy +ResourceAccessRoleArn,resource_access_role_arn +ResourceAction,resource_action +ResourceAlreadyCheckedOutException,resource_already_checked_out_exception +ResourceAlreadyExistException,resource_already_exist_exception +ResourceAlreadyExistsException,resource_already_exists_exception +ResourceAlreadyExistsFault,resource_already_exists_fault +ResourceArn,resource_arn +ResourceArnList,resource_arn_list +ResourceArnNotFoundException,resource_arn_not_found_exception +ResourceArnRequiredException,resource_arn_required_exception +ResourceArns,resource_arns +ResourceAssociatedException,resource_associated_exception +ResourceAttribute,resource_attribute +ResourceAttributeList,resource_attribute_list +ResourceAwsEc2InstanceIamInstanceProfileArn,resource_aws_ec2_instance_iam_instance_profile_arn +ResourceAwsEc2InstanceImageId,resource_aws_ec2_instance_image_id +ResourceAwsEc2InstanceIpV4Addresses,resource_aws_ec2_instance_ipv4_addresses +ResourceAwsEc2InstanceIpV6Addresses,resource_aws_ec2_instance_ipv6_addresses +ResourceAwsEc2InstanceKeyName,resource_aws_ec2_instance_key_name +ResourceAwsEc2InstanceLaunchedAt,resource_aws_ec2_instance_launched_at +ResourceAwsEc2InstanceSubnetId,resource_aws_ec2_instance_subnet_id +ResourceAwsEc2InstanceType,resource_aws_ec2_instance_type +ResourceAwsEc2InstanceVpcId,resource_aws_ec2_instance_vpc_id +ResourceAwsIamAccessKeyCreatedAt,resource_aws_iam_access_key_created_at +ResourceAwsIamAccessKeyPrincipalName,resource_aws_iam_access_key_principal_name +ResourceAwsIamAccessKeyStatus,resource_aws_iam_access_key_status +ResourceAwsIamAccessKeyUserName,resource_aws_iam_access_key_user_name +ResourceAwsIamUserUserName,resource_aws_iam_user_user_name +ResourceAwsS3BucketOwnerId,resource_aws_s3_bucket_owner_id +ResourceAwsS3BucketOwnerName,resource_aws_s3_bucket_owner_name +ResourceBudgetEstimate,resource_budget_estimate +ResourceCatalog,resource_catalog +ResourceCatalogArn,resource_catalog_arn +ResourceCatalogName,resource_catalog_name +ResourceCatalogs,resource_catalogs +ResourceChange,resource_change +ResourceChangeDetail,resource_change_detail +ResourceChanges,resource_changes +ResourceCidr,resource_cidr +ResourceCollection,resource_collection +ResourceCollectionFilter,resource_collection_filter +ResourceCollectionType,resource_collection_type +ResourceComplianceStatus,resource_compliance_status +ResourceComplianceSummaryItem,resource_compliance_summary_item +ResourceComplianceSummaryItems,resource_compliance_summary_items +ResourceConcurrentModificationException,resource_concurrent_modification_exception +ResourceConfig,resource_config +ResourceConfigForUpdate,resource_config_for_update +ResourceConfiguration,resource_configuration +ResourceConfigurationSchemaType,resource_configuration_schema_type +ResourceConflict,resource_conflict +ResourceConflictException,resource_conflict_exception +ResourceContainerImageId,resource_container_image_id +ResourceContainerImageName,resource_container_image_name +ResourceContainerLaunchedAt,resource_container_launched_at +ResourceContainerName,resource_container_name +ResourceContentionFault,resource_contention_fault +ResourceCount,resource_count +ResourceCountByStatus,resource_count_by_status +ResourceCountFilters,resource_count_filters +ResourceCountsSummary,resource_counts_summary +ResourceCreationFailedException,resource_creation_failed_exception +ResourceCreationLimitPolicy,resource_creation_limit_policy +ResourceDataContainer,resource_data_container +ResourceDataSyncAlreadyExistsException,resource_data_sync_already_exists_exception +ResourceDataSyncAwsOrganizationsSource,resource_data_sync_aws_organizations_source +ResourceDataSyncConflictException,resource_data_sync_conflict_exception +ResourceDataSyncCountExceededException,resource_data_sync_count_exceeded_exception +ResourceDataSyncDestinationDataSharing,resource_data_sync_destination_data_sharing +ResourceDataSyncInvalidConfigurationException,resource_data_sync_invalid_configuration_exception +ResourceDataSyncItem,resource_data_sync_item +ResourceDataSyncItems,resource_data_sync_items +ResourceDataSyncNotFoundException,resource_data_sync_not_found_exception +ResourceDataSyncOrganizationalUnit,resource_data_sync_organizational_unit +ResourceDataSyncS3Destination,resource_data_sync_s3_destination +ResourceDataSyncSource,resource_data_sync_source +ResourceDataSyncSourceWithState,resource_data_sync_source_with_state +ResourceDefinitionId,resource_definition_id +ResourceDefinitionVersion,resource_definition_version +ResourceDefinitionVersionArn,resource_definition_version_arn +ResourceDefinitionVersionId,resource_definition_version_id +ResourceDependencyException,resource_dependency_exception +ResourceDescription,resource_description +ResourceDescriptions,resource_descriptions +ResourceDetail,resource_detail +ResourceDetails,resource_details +ResourceDetailsOther,resource_details_other +ResourceDiscoveryAssociationCount,resource_discovery_association_count +ResourceDiscoveryStatus,resource_discovery_status +ResourceDoesNotSupportTagging,resource_does_not_support_tagging +ResourceDownloadOwnerSetting,resource_download_owner_setting +ResourceEndpoint,resource_endpoint +ResourceEndpointList,resource_endpoint_list +ResourceEndpointListItem,resource_endpoint_list_item +ResourceError,resource_error +ResourceErrorsDetails,resource_errors_details +ResourceEvaluation,resource_evaluation +ResourceEvaluationFilters,resource_evaluation_filters +ResourceEvaluationId,resource_evaluation_id +ResourceEvaluations,resource_evaluations +ResourceExistsException,resource_exists_exception +ResourceFilter,resource_filter +ResourceFilterCriteria,resource_filter_criteria +ResourceFilters,resource_filters +ResourceGroup,resource_group +ResourceGroupName,resource_group_name +ResourceGroupTag,resource_group_tag +ResourceHandlingOption,resource_handling_option +ResourceHours,resource_hours +ResourceId,resource_id +ResourceIdList,resource_id_list +ResourceIdOverrideConfiguration,resource_id_override_configuration +ResourceIdPreference,resource_id_preference +ResourceIdScope,resource_id_scope +ResourceIdType,resource_id_type +ResourceIdentifier,resource_identifier +ResourceIdentifierSummaries,resource_identifier_summaries +ResourceIdentifierSummary,resource_identifier_summary +ResourceIdentifiers,resource_identifiers +ResourceIds,resource_ids +ResourceInUse,resource_in_use +ResourceInUseException,resource_in_use_exception +ResourceInUseFault,resource_in_use_fault +ResourceInfo,resource_info +ResourceInfoList,resource_info_list +ResourceIntegrations,resource_integrations +ResourceInventory,resource_inventory +ResourceInventoryList,resource_inventory_list +ResourceKey,resource_key +ResourceKeys,resource_keys +ResourceLabel,resource_label +ResourceLifecycleConfig,resource_lifecycle_config +ResourceLimit,resource_limit +ResourceLimitExceeded,resource_limit_exceeded +ResourceLimitExceededException,resource_limit_exceeded_exception +ResourceLimits,resource_limits +ResourceList,resource_list +ResourceLocation,resource_location +ResourceLocations,resource_locations +ResourceLockedException,resource_locked_exception +ResourceMapFilter,resource_map_filter +ResourceMapping,resource_mapping +ResourceMetadata,resource_metadata +ResourceMetrics,resource_metrics +ResourceModel,resource_model +ResourceName,resource_name +ResourceNotAvailableException,resource_not_available_exception +ResourceNotDiscoveredException,resource_not_discovered_exception +ResourceNotFound,resource_not_found +ResourceNotFoundException,resource_not_found_exception +ResourceNotFoundFault,resource_not_found_fault +ResourceNotReadyException,resource_not_ready_exception +ResourceNotSupportedException,resource_not_supported_exception +ResourceNumberLimitExceededException,resource_number_limit_exceeded_exception +ResourceOverlapStatus,resource_overlap_status +ResourceOwner,resource_owner +ResourceOwnerCheckException,resource_owner_check_exception +ResourceOwnerId,resource_owner_id +ResourceOwningAccountId,resource_owning_account_id +ResourcePartition,resource_partition +ResourcePath,resource_path +ResourcePathComponent,resource_path_component +ResourcePendingMaintenanceActions,resource_pending_maintenance_actions +ResourcePermission,resource_permission +ResourcePolicies,resource_policies +ResourcePolicy,resource_policy +ResourcePolicyConflictException,resource_policy_conflict_exception +ResourcePolicyInvalidParameterException,resource_policy_invalid_parameter_exception +ResourcePolicyLimitExceededException,resource_policy_limit_exceeded_exception +ResourcePolicyNotFoundException,resource_policy_not_found_exception +ResourcePolicyNotValidException,resource_policy_not_valid_exception +ResourcePolicySummary,resource_policy_summary +ResourcePreconditionNotMetException,resource_precondition_not_met_exception +ResourceProfileArtifact,resource_profile_artifact +ResourcePropagationDelayException,resource_propagation_delay_exception +ResourceProperties,resource_properties +ResourceProperty,resource_property +ResourceProvisionedThroughputExceededException,resource_provisioned_throughput_exceeded_exception +ResourceQuery,resource_query +ResourceQuota,resource_quota +ResourceQuotaExceededException,resource_quota_exceeded_exception +ResourceQuotaExceededFault,resource_quota_exceeded_fault +ResourceQuotas,resource_quotas +ResourceReceivingAccess,resource_receiving_access +ResourceRecord,resource_record +ResourceRecordSet,resource_record_set +ResourceRecordSetCount,resource_record_set_count +ResourceRecordSets,resource_record_sets +ResourceRecords,resource_records +ResourceReference,resource_reference +ResourceRegion,resource_region +ResourceRegistrationFailureException,resource_registration_failure_exception +ResourceRequestStatusFilter,resource_request_status_filter +ResourceRequestStatusSummaries,resource_request_status_summaries +ResourceRequirement,resource_requirement +ResourceRequirements,resource_requirements +ResourceResult,resource_result +ResourceRetainedBillableTimeInSeconds,resource_retained_billable_time_in_seconds +ResourceRole,resource_role +ResourceScanMetadata,resource_scan_metadata +ResourceServer,resource_server +ResourceServerScopeType,resource_server_scope_type +ResourceServerType,resource_server_type +ResourceServers,resource_servers +ResourceSet,resource_set +ResourceSetArn,resource_set_arn +ResourceSetIdentifier,resource_set_identifier +ResourceSetIds,resource_set_ids +ResourceSetName,resource_set_name +ResourceSetOutput,resource_set_output +ResourceSetStatus,resource_set_status +ResourceSetSummary,resource_set_summary +ResourceSetType,resource_set_type +ResourceSets,resource_sets +ResourceShare,resource_share +ResourceShareAssociation,resource_share_association +ResourceShareInvitation,resource_share_invitation +ResourceShareInvitationAlreadyAcceptedException,resource_share_invitation_already_accepted_exception +ResourceShareInvitationAlreadyRejectedException,resource_share_invitation_already_rejected_exception +ResourceShareInvitationArnNotFoundException,resource_share_invitation_arn_not_found_exception +ResourceShareInvitationExpiredException,resource_share_invitation_expired_exception +ResourceShareLimitExceededException,resource_share_limit_exceeded_exception +ResourceSharePermissionDetail,resource_share_permission_detail +ResourceSharePermissionSummary,resource_share_permission_summary +ResourceShareType,resource_share_type +ResourceSpec,resource_spec +ResourceSpecificResult,resource_specific_result +ResourceSpecificResults,resource_specific_results +ResourceSpecification,resource_specification +ResourceState,resource_state +ResourceStatement,resource_statement +ResourceStatementRequest,resource_statement_request +ResourceStatistics,resource_statistics +ResourceStatus,resource_status +ResourceStatusReason,resource_status_reason +ResourceStringFilter,resource_string_filter +ResourceSummary,resource_summary +ResourceSyncAttempt,resource_sync_attempt +ResourceSyncEvent,resource_sync_event +ResourceTag,resource_tag +ResourceTagKey,resource_tag_key +ResourceTagKeys,resource_tag_keys +ResourceTagList,resource_tag_list +ResourceTagMapping,resource_tag_mapping +ResourceTagMappingList,resource_tag_mapping_list +ResourceTagSet,resource_tag_set +ResourceTagSets,resource_tag_sets +ResourceTagValue,resource_tag_value +ResourceTags,resource_tags +ResourceTagsDescriptionMessage,resource_tags_description_message +ResourceTagsSearchCriteria,resource_tags_search_criteria +ResourceTargetDefinition,resource_target_definition +ResourceTargetDetails,resource_target_details +ResourceToImport,resource_to_import +ResourceType,resource_type +ResourceTypeFilters,resource_type_filters +ResourceTypeList,resource_type_list +ResourceTypeManagementPreference,resource_type_management_preference +ResourceTypeNotFound,resource_type_not_found +ResourceTypeNotSupportedException,resource_type_not_supported_exception +ResourceTypeOptInPreference,resource_type_opt_in_preference +ResourceTypes,resource_types +ResourceTypesScope,resource_types_scope +ResourceUnavailableException,resource_unavailable_exception +ResourceUri,resource_uri +ResourceUris,resource_uris +ResourceUtilization,resource_utilization +ResourceValidationException,resource_validation_exception +ResourceValue,resource_value +ResourceViolation,resource_violation +ResourceViolations,resource_violations +Resources,resources +ResourcesAffected,resources_affected +ResourcesPerPage,resources_per_page +ResourcesSupported,resources_supported +ResourcesToAdd,resources_to_add +ResourcesToImport,resources_to_import +ResourcesToRemove,resources_to_remove +ResourcesToSkip,resources_to_skip +ResourcesVpcConfig,resources_vpc_config +RespondActivityTaskCanceledInput,respond_activity_task_canceled_input +RespondActivityTaskCompletedInput,respond_activity_task_completed_input +RespondActivityTaskFailedInput,respond_activity_task_failed_input +RespondDecisionTaskCompletedInput,respond_decision_task_completed_input +RespondToAfd,respond_to_afd +RespondToAuthChallengeRequest,respond_to_auth_challenge_request +RespondToAuthChallengeResponse,respond_to_auth_challenge_response +RespondsTo,responds_to +Response,response +ResponseAction,response_action +ResponseCacheControl,response_cache_control +ResponseCard,response_card +ResponseCode,response_code +ResponseCodeSent,response_code_sent +ResponseContentDisposition,response_content_disposition +ResponseContentEncoding,response_content_encoding +ResponseContentLanguage,response_content_language +ResponseContentType,response_content_type +ResponseDetails,response_details +ResponseError,response_error +ResponseExpires,response_expires +ResponseFinishDateTime,response_finish_date_time +ResponseHeaders,response_headers +ResponseHeadersPolicy,response_headers_policy +ResponseHeadersPolicyAccessControlAllowHeaders,response_headers_policy_access_control_allow_headers +ResponseHeadersPolicyAccessControlAllowMethods,response_headers_policy_access_control_allow_methods +ResponseHeadersPolicyAccessControlAllowOrigins,response_headers_policy_access_control_allow_origins +ResponseHeadersPolicyAccessControlExposeHeaders,response_headers_policy_access_control_expose_headers +ResponseHeadersPolicyAlreadyExists,response_headers_policy_already_exists +ResponseHeadersPolicyConfig,response_headers_policy_config +ResponseHeadersPolicyContentSecurityPolicy,response_headers_policy_content_security_policy +ResponseHeadersPolicyContentTypeOptions,response_headers_policy_content_type_options +ResponseHeadersPolicyCorsConfig,response_headers_policy_cors_config +ResponseHeadersPolicyCustomHeader,response_headers_policy_custom_header +ResponseHeadersPolicyCustomHeadersConfig,response_headers_policy_custom_headers_config +ResponseHeadersPolicyFrameOptions,response_headers_policy_frame_options +ResponseHeadersPolicyId,response_headers_policy_id +ResponseHeadersPolicyInUse,response_headers_policy_in_use +ResponseHeadersPolicyList,response_headers_policy_list +ResponseHeadersPolicyReferrerPolicy,response_headers_policy_referrer_policy +ResponseHeadersPolicyRemoveHeader,response_headers_policy_remove_header +ResponseHeadersPolicyRemoveHeadersConfig,response_headers_policy_remove_headers_config +ResponseHeadersPolicySecurityHeadersConfig,response_headers_policy_security_headers_config +ResponseHeadersPolicyServerTimingHeadersConfig,response_headers_policy_server_timing_headers_config +ResponseHeadersPolicyStrictTransportSecurity,response_headers_policy_strict_transport_security +ResponseHeadersPolicySummary,response_headers_policy_summary +ResponseHeadersPolicyXSSProtection,response_headers_policy_xss_protection +ResponseInspection,response_inspection +ResponseInspectionBodyContains,response_inspection_body_contains +ResponseInspectionHeader,response_inspection_header +ResponseInspectionJson,response_inspection_json +ResponseInspectionStatusCode,response_inspection_status_code +ResponseItem,response_item +ResponseLaunchTemplateData,response_launch_template_data +ResponseMessage,response_message +ResponseModels,response_models +ResponseOutputItem,response_output_item +ResponsePagePath,response_page_path +ResponseParameters,response_parameters +ResponsePartitionKey,response_partition_key +ResponsePlanSummary,response_plan_summary +ResponseResourceMetric,response_resource_metric +ResponseResourceMetricKey,response_resource_metric_key +ResponseSignalPreroll,response_signal_preroll +ResponseSpecification,response_specification +ResponseStartDateTime,response_start_date_time +ResponseStreamContentType,response_stream_content_type +ResponseTemplates,response_templates +ResponseTime,response_time +ResponseTimeHistogram,response_time_histogram +ResponseTimeRootCause,response_time_root_cause +ResponseTimeRootCauseEntity,response_time_root_cause_entity +ResponseTimeRootCauseService,response_time_root_cause_service +ResponseTimeRootCauses,response_time_root_causes +Responses,responses +RestApi,rest_api +RestApis,rest_apis +RestartAppServerMessage,restart_app_server_message +RestartDelay,restart_delay +RestartSimulationJobRequest,restart_simulation_job_request +RestartWorkspace,restart_workspace +RestorableByUserIds,restorable_by_user_ids +RestorableNodeTypes,restorable_node_types +RestorableUntil,restorable_until +RestorationPrice,restoration_price +Restore,restore +RestoreAddressToClassicRequest,restore_address_to_classic_request +RestoreAddressToClassicResult,restore_address_to_classic_result +RestoreAnalysisRequest,restore_analysis_request +RestoreAnalysisResponse,restore_analysis_response +RestoreBackupRequest,restore_backup_request +RestoreBackupResponse,restore_backup_response +RestoreCertificateAuthorityRequest,restore_certificate_authority_request +RestoreClusterFromSnapshotInput,restore_cluster_from_snapshot_input +RestoreClusterFromSnapshotOutput,restore_cluster_from_snapshot_output +RestoreCoreNetworkPolicyVersionRequest,restore_core_network_policy_version_request +RestoreCoreNetworkPolicyVersionResponse,restore_core_network_policy_version_response +RestoreDBClusterFromS3Message,restore_db_cluster_from_s3_message +RestoreDBClusterFromS3Result,restore_db_cluster_from_s3_result +RestoreDBClusterFromSnapshotMessage,restore_db_cluster_from_snapshot_message +RestoreDBClusterFromSnapshotResult,restore_db_cluster_from_snapshot_result +RestoreDBClusterToPointInTimeMessage,restore_db_cluster_to_point_in_time_message +RestoreDBClusterToPointInTimeResult,restore_db_cluster_to_point_in_time_result +RestoreDBInstanceFromDBSnapshotMessage,restore_db_instance_from_db_snapshot_message +RestoreDBInstanceFromDBSnapshotResult,restore_db_instance_from_db_snapshot_result +RestoreDBInstanceFromS3Message,restore_db_instance_from_s3_message +RestoreDBInstanceFromS3Result,restore_db_instance_from_s3_result +RestoreDBInstanceToPointInTimeMessage,restore_db_instance_to_point_in_time_message +RestoreDBInstanceToPointInTimeResult,restore_db_instance_to_point_in_time_result +RestoreDateTime,restore_date_time +RestoreDocumentVersionsRequest,restore_document_versions_request +RestoreDomainAccessRequest,restore_domain_access_request +RestoreDuration,restore_duration +RestoreEventDataStoreRequest,restore_event_data_store_request +RestoreEventDataStoreResponse,restore_event_data_store_response +RestoreExpiryDate,restore_expiry_date +RestoreExpiryTime,restore_expiry_time +RestoreFromClusterSnapshotMessage,restore_from_cluster_snapshot_message +RestoreFromClusterSnapshotResult,restore_from_cluster_snapshot_result +RestoreFromRecoveryPointRequest,restore_from_recovery_point_request +RestoreFromRecoveryPointResponse,restore_from_recovery_point_response +RestoreFromSnapshotRequest,restore_from_snapshot_request +RestoreFromSnapshotResponse,restore_from_snapshot_response +RestoreImageFromRecycleBinRequest,restore_image_from_recycle_bin_request +RestoreImageFromRecycleBinResult,restore_image_from_recycle_bin_result +RestoreInProgress,restore_in_progress +RestoreJobId,restore_job_id +RestoreJobs,restore_jobs +RestoreJobsListMember,restore_jobs_list_member +RestoreKeyInput,restore_key_input +RestoreKeyOutput,restore_key_output +RestoreManagedPrefixListVersionRequest,restore_managed_prefix_list_version_request +RestoreManagedPrefixListVersionResult,restore_managed_prefix_list_version_result +RestoreMetadata,restore_metadata +RestoreObjectOutput,restore_object_output +RestoreObjectRequest,restore_object_request +RestoreOutputPath,restore_output_path +RestorePhoneNumberRequest,restore_phone_number_request +RestorePhoneNumberResponse,restore_phone_number_response +RestoreRequest,restore_request +RestoreSecretRequest,restore_secret_request +RestoreSecretResponse,restore_secret_response +RestoreServerRequest,restore_server_request +RestoreServerResponse,restore_server_response +RestoreSnapshotFromRecycleBinRequest,restore_snapshot_from_recycle_bin_request +RestoreSnapshotFromRecycleBinResult,restore_snapshot_from_recycle_bin_result +RestoreSnapshotTierRequest,restore_snapshot_tier_request +RestoreSnapshotTierResult,restore_snapshot_tier_result +RestoreSnapshots,restore_snapshots +RestoreStartTime,restore_start_time +RestoreStatus,restore_status +RestoreSummary,restore_summary +RestoreTableFromBackupInput,restore_table_from_backup_input +RestoreTableFromBackupOutput,restore_table_from_backup_output +RestoreTableFromClusterSnapshotMessage,restore_table_from_cluster_snapshot_message +RestoreTableFromClusterSnapshotResult,restore_table_from_cluster_snapshot_result +RestoreTableFromSnapshotRequest,restore_table_from_snapshot_request +RestoreTableFromSnapshotResponse,restore_table_from_snapshot_response +RestoreTableRequest,restore_table_request +RestoreTableResponse,restore_table_response +RestoreTableToPointInTimeInput,restore_table_to_point_in_time_input +RestoreTableToPointInTimeOutput,restore_table_to_point_in_time_output +RestoreTime,restore_time +RestoreToSnapshot,restore_to_snapshot +RestoreToTime,restore_to_time +RestoreType,restore_type +RestoreVolumeFromSnapshotRequest,restore_volume_from_snapshot_request +RestoreVolumeFromSnapshotResponse,restore_volume_from_snapshot_response +RestoreWindow,restore_window +RestoreWorkspaceRequest,restore_workspace_request +RestrictPublicBuckets,restrict_public_buckets +RestrictedPackageName,restricted_package_name +RestrictedSourceFileException,restricted_source_file_exception +RestrictionType,restriction_type +Restrictions,restrictions +Result,result +ResultAttribute,result_attribute +ResultAttributes,result_attributes +ResultBBox,result_b_box +ResultByTime,result_by_time +ResultCode,result_code +ResultConfiguration,result_configuration +ResultConfigurationUpdates,result_configuration_updates +ResultData,result_data +ResultEncryptionMode,result_encryption_mode +ResultErrorEntry,result_error_entry +ResultField,result_field +ResultFrame,result_frame +ResultId,result_id +ResultIds,result_ids +ResultItems,result_items +ResultKmsKeyArn,result_kms_key_arn +ResultList,result_list +ResultLocationBucket,result_location_bucket +ResultLocationFolder,result_location_folder +ResultRecordedTime,result_recorded_time +ResultReuseByAgeConfiguration,result_reuse_by_age_configuration +ResultReuseConfiguration,result_reuse_configuration +ResultReuseInformation,result_reuse_information +ResultRow,result_row +ResultRowValue,result_row_value +ResultRows,result_rows +ResultS3Uri,result_s3_uri +ResultSet,result_set +ResultSetMetadata,result_set_metadata +ResultSetOptions,result_set_options +ResultSize,result_size +ResultStream,result_stream +ResultToken,result_token +ResultType,result_type +ResultValues,result_values +Results,results +ResultsByTime,results_by_time +ResultsCount,results_count +ResultsNotFound,results_not_found +ResultsPublishingEnabled,results_publishing_enabled +ResultsS3Prefix,results_s3_prefix +ResumableUntil,resumable_until +ResumeActions,resume_actions +ResumeBatchLoadTaskRequest,resume_batch_load_task_request +ResumeCampaignRequest,resume_campaign_request +ResumeCluster,resume_cluster +ResumeClusterMessage,resume_cluster_message +ResumeClusterResult,resume_cluster_result +ResumeContactRecordingRequest,resume_contact_recording_request +ResumeFullAutomationModeMinutes,resume_full_automation_mode_minutes +ResumeFullAutomationModeTime,resume_full_automation_mode_time +ResumeGameServerGroupInput,resume_game_server_group_input +ResumeGameServerGroupOutput,resume_game_server_group_output +ResumeReplicationRequest,resume_replication_request +ResumeResourceRequest,resume_resource_request +ResumeServiceRequest,resume_service_request +ResumeServiceResponse,resume_service_response +ResumeSessionRequest,resume_session_request +ResumeSessionResponse,resume_session_response +ResumeWorkflowRunRequest,resume_workflow_run_request +ResumeWorkflowRunResponse,resume_workflow_run_response +ResyncMFADeviceRequest,resync_mfa_device_request +RetainAllVariantProperties,retain_all_variant_properties +RetainDeploymentConfig,retain_deployment_config +RetainExceptOnCreate,retain_except_on_create +RetainPhysicalResources,retain_physical_resources +RetainPrimaryCluster,retain_primary_cluster +RetainPrimaryReplicationGroup,retain_primary_replication_group +RetainRecordInDays,retain_record_in_days +RetainRecordUntil,retain_record_until +RetainResources,retain_resources +RetainRule,retain_rule +RetainStacks,retain_stacks +RetainStacksOnAccountRemoval,retain_stacks_on_account_removal +RetainUntilDate,retain_until_date +RetainedMessageSummary,retained_message_summary +Retention,retention +RetentionArchiveTier,retention_archive_tier +RetentionConfiguration,retention_configuration +RetentionConfigurationName,retention_configuration_name +RetentionConfigurationNames,retention_configuration_names +RetentionConfigurations,retention_configurations +RetentionDays,retention_days +RetentionLockTimeInDays,retention_lock_time_in_days +RetentionLockType,retention_lock_type +RetentionPeriod,retention_period +RetentionPeriodHours,retention_period_hours +RetentionPeriodInDays,retention_period_in_days +RetentionPeriodUnit,retention_period_unit +RetentionPeriodValue,retention_period_value +RetentionPolicy,retention_policy +RetentionProperties,retention_properties +RetentionSettings,retention_settings +RetentionStartDate,retention_start_date +RetireGrantRequest,retire_grant_request +RetiringPrincipal,retiring_principal +RetrainingAvailableDataInDays,retraining_available_data_in_days +RetrainingFrequency,retraining_frequency +RetrainingSchedulerStatus,retraining_scheduler_status +RetrainingSchedulerSummaries,retraining_scheduler_summaries +RetrainingSchedulerSummary,retraining_scheduler_summary +RetrainingStartDate,retraining_start_date +Retries,retries +Retrieval,retrieval +RetrievalByteRange,retrieval_byte_range +RetrievalRoleArn,retrieval_role_arn +RetrieveAZs,retrieve_azs +RetrieveActions,retrieve_actions +RetrieveDomainAuthCodeRequest,retrieve_domain_auth_code_request +RetrieveDomainAuthCodeResponse,retrieve_domain_auth_code_response +RetrieveEnvironmentInfoMessage,retrieve_environment_info_message +RetrieveEnvironmentInfoResultMessage,retrieve_environment_info_result_message +RetrieveFilePaths,retrieve_file_paths +RetrieveRequest,retrieve_request +RetrieveResult,retrieve_result +RetrieveResultItem,retrieve_result_item +RetrieveResults,retrieve_results +RetrieveTapeArchiveInput,retrieve_tape_archive_input +RetrieveTapeArchiveOutput,retrieve_tape_archive_output +RetrieveTapeRecoveryPointInput,retrieve_tape_recovery_point_input +RetrieveTapeRecoveryPointOutput,retrieve_tape_recovery_point_output +RetrievedTo,retrieved_to +RetryAfter,retry_after +RetryAfterSeconds,retry_after_seconds +RetryAttemptSeconds,retry_attempt_seconds +RetryAttempts,retry_attempts +RetryBuildBatchInput,retry_build_batch_input +RetryBuildBatchOutput,retry_build_batch_output +RetryBuildInput,retry_build_input +RetryBuildOutput,retry_build_output +RetryCount,retry_count +RetryCriteria,retry_criteria +RetryDataReplicationRequest,retry_data_replication_request +RetryDelayInSeconds,retry_delay_in_seconds +RetryInterval,retry_interval +RetryIntervalInMinutes,retry_interval_in_minutes +RetryIntervalMs,retry_interval_ms +RetryOptions,retry_options +RetryPipelineExecutionRequest,retry_pipeline_execution_request +RetryPipelineExecutionResponse,retry_pipeline_execution_response +RetryPolicy,retry_policy +RetryPolicyConfiguration,retry_policy_configuration +RetryPolicyExecution,retry_policy_execution +RetryStageExecutionInput,retry_stage_execution_input +RetryStageExecutionOutput,retry_stage_execution_output +RetryStrategy,retry_strategy +RetryWorkflowStepRequest,retry_workflow_step_request +RetryWorkflowStepResponse,retry_workflow_step_response +Retryable,retryable +RetryableConflictException,retryable_conflict_exception +RetryableError,retryable_error +RetryableException,retryable_exception +Return,return +ReturnCode,return_code +ReturnConnectionPasswordEncrypted,return_connection_password_encrypted +ReturnConsumedCapacity,return_consumed_capacity +ReturnData,return_data +ReturnEnabled,return_enabled +ReturnInformation,return_information +ReturnItemCollectionMetrics,return_item_collection_metrics +ReturnPath,return_path +ReturnPathArn,return_path_arn +ReturnPathComponents,return_path_components +ReturnShippingLabelAlreadyExistsException,return_shipping_label_already_exists_exception +ReturnShippingLabelURI,return_shipping_label_uri +ReturnSize,return_size +ReturnSubscriptionArn,return_subscription_arn +ReturnValue,return_value +ReturnValues,return_values +ReturnValuesOnConditionCheckFailure,return_values_on_condition_check_failure +ReusableDelegationSetLimit,reusable_delegation_set_limit +ReuseOnScaleIn,reuse_on_scale_in +ReusedByJob,reused_by_job +ReusedPreviousResult,reused_previous_result +RevealConfiguration,reveal_configuration +ReverseGeocodingConfig,reverse_geocoding_config +ReverseOrder,reverse_order +ReverseReplicationRequest,reverse_replication_request +ReverseReplicationResponse,reverse_replication_response +Revert,revert +ReviewActionDetail,review_action_detail +ReviewActions,review_actions +ReviewDetails,review_details +ReviewInformation,review_information +ReviewOwner,review_owner +ReviewPolicy,review_policy +ReviewReport,review_report +ReviewRestrictionDate,review_restriction_date +ReviewResultDetail,review_result_detail +ReviewResults,review_results +ReviewStatus,review_status +ReviewedTime,reviewed_time +Reviewer,reviewer +ReviewerResponse,reviewer_response +Reviews,reviews +Revision,revision +RevisionDestination,revision_destination +RevisionDestinationEntry,revision_destination_entry +RevisionDestinations,revision_destinations +RevisionDoesNotExistException,revision_does_not_exist_exception +RevisionEntry,revision_entry +RevisionId,revision_id +RevisionIdRequiredException,revision_id_required_exception +RevisionInfo,revision_info +RevisionLocation,revision_location +RevisionNotCurrentException,revision_not_current_exception +RevisionPublished,revision_published +RevisionRequiredException,revision_required_exception +RevisionTarget,revision_target +RevisionTargets,revision_targets +Revisions,revisions +RevocationComment,revocation_comment +RevocationConfiguration,revocation_configuration +RevocationReason,revocation_reason +RevokeAllGroups,revoke_all_groups +RevokeCacheSecurityGroupIngressMessage,revoke_cache_security_group_ingress_message +RevokeCacheSecurityGroupIngressResult,revoke_cache_security_group_ingress_result +RevokeCertificateRequest,revoke_certificate_request +RevokeClientVpnIngressRequest,revoke_client_vpn_ingress_request +RevokeClientVpnIngressResult,revoke_client_vpn_ingress_result +RevokeClusterSecurityGroupIngressMessage,revoke_cluster_security_group_ingress_message +RevokeClusterSecurityGroupIngressResult,revoke_cluster_security_group_ingress_result +RevokeDBSecurityGroupIngressMessage,revoke_db_security_group_ingress_message +RevokeDBSecurityGroupIngressResult,revoke_db_security_group_ingress_result +RevokeDomainAccessRequest,revoke_domain_access_request +RevokeEndpointAccessMessage,revoke_endpoint_access_message +RevokeFlowEntitlementRequest,revoke_flow_entitlement_request +RevokeFlowEntitlementResponse,revoke_flow_entitlement_response +RevokeGrantRequest,revoke_grant_request +RevokeInvitationRequest,revoke_invitation_request +RevokeIpRulesRequest,revoke_ip_rules_request +RevokeLinkPermissions,revoke_link_permissions +RevokePermissions,revoke_permissions +RevokePermissionsRequest,revoke_permissions_request +RevokeRevisionRequest,revoke_revision_request +RevokeRevisionResponse,revoke_revision_response +RevokeSecurityGroupEgressRequest,revoke_security_group_egress_request +RevokeSecurityGroupEgressResult,revoke_security_group_egress_result +RevokeSecurityGroupIngressRequest,revoke_security_group_ingress_request +RevokeSecurityGroupIngressResult,revoke_security_group_ingress_result +RevokeSignatureRequest,revoke_signature_request +RevokeSigningProfileRequest,revoke_signing_profile_request +RevokeSnapshotAccessMessage,revoke_snapshot_access_message +RevokeSnapshotAccessResult,revoke_snapshot_access_result +RevokeTokenRequest,revoke_token_request +RevokeVpcEndpointAccessRequest,revoke_vpc_endpoint_access_request +Revoked,revoked +RevokedAt,revoked_at +Reward,reward +RfRegion,rf_region +Rfc4180,rfc4180 +Rfc822Name,rfc822_name +RichText,rich_text +Right,right +RightJoinKeyProperties,right_join_key_properties +RightOperand,right_operand +RightsizingRecommendation,rightsizing_recommendation +RightsizingRecommendationConfiguration,rightsizing_recommendation_configuration +RightsizingRecommendationMetadata,rightsizing_recommendation_metadata +RightsizingRecommendationSummary,rightsizing_recommendation_summary +RightsizingRecommendations,rightsizing_recommendations +RightsizingType,rightsizing_type +Risk,risk +RiskConfiguration,risk_configuration +RiskConfigurationType,risk_configuration_type +RiskCounts,risk_counts +RiskDecision,risk_decision +RiskDetails,risk_details +RiskExceptionConfiguration,risk_exception_configuration +RiskExceptionConfigurationType,risk_exception_configuration_type +RiskLevel,risk_level +RiskRating,risk_rating +RiskScore,risk_score +RiskThreshold,risk_threshold +Robot,robot +RobotApplicationConfig,robot_application_config +RobotApplicationSummary,robot_application_summary +RobotDeployment,robot_deployment +RobotSoftwareSuite,robot_software_suite +Role,role +RoleARN,role_arn +RoleARNUpdate,role_arn_update +RoleAliasDescription,role_alias_description +RoleArn,role_arn +RoleArns,role_arns +RoleBase,role_base +RoleCredentials,role_credentials +RoleDetail,role_detail +RoleDetailList,role_detail_list +RoleId,role_id +RoleInfo,role_info +RoleLastUsed,role_last_used +RoleLevel,role_level +RoleMapping,role_mapping +RoleMappings,role_mappings +RoleName,role_name +RolePolicyList,role_policy_list +RoleRequiredException,role_required_exception +RoleSearchMatching,role_search_matching +RoleSearchSubtree,role_search_subtree +RoleSessionName,role_session_name +RoleStatus,role_status +RoleUsageList,role_usage_list +RoleUsageType,role_usage_type +RoleValues,role_values +Roles,roles +RolesKey,roles_key +Roll,roll +Rollback,rollback +RollbackApplicationRequest,rollback_application_request +RollbackApplicationResponse,rollback_application_response +RollbackConfiguration,rollback_configuration +RollbackDetails,rollback_details +RollbackErrorMessage,rollback_error_message +RollbackErrors,rollback_errors +RollbackFailureReason,rollback_failure_reason +RollbackInfo,rollback_info +RollbackInstanceRefreshAnswer,rollback_instance_refresh_answer +RollbackInstanceRefreshType,rollback_instance_refresh_type +RollbackMaximumBatchSize,rollback_maximum_batch_size +RollbackOnDisable,rollback_on_disable +RollbackReason,rollback_reason +RollbackStackInput,rollback_stack_input +RollbackStackOutput,rollback_stack_output +RollbackStartTime,rollback_start_time +RollbackTransactionRequest,rollback_transaction_request +RollbackTransactionResponse,rollback_transaction_response +RollbackTrigger,rollback_trigger +RollbackTriggers,rollback_triggers +RollingDate,rolling_date +RollingDateConfiguration,rolling_date_configuration +RollingUpdatePolicy,rolling_update_policy +RolloverInterval,rollover_interval +Room,room +RoomArn,room_arn +RoomData,room_data +RoomFilters,room_filters +RoomId,room_id +RoomMembership,room_membership +RoomMemberships,room_memberships +RoomName,room_name +RoomRetentionSettings,room_retention_settings +RoomSkillParameter,room_skill_parameter +RoomSkillParameters,room_skill_parameters +RoomSummary,room_summary +RoomUtilizationMetricsEnabled,room_utilization_metrics_enabled +Rooms,rooms +Root,root +RootAccess,root_access +RootCause,root_cause +RootCauseException,root_cause_exception +RootCauseServiceId,root_cause_service_id +RootCauseServiceRequestImpactStatistics,root_cause_service_request_impact_statistics +RootCauses,root_causes +RootCertificatePublicKey,root_certificate_public_key +RootChangeSetId,root_change_set_id +RootDeviceName,root_device_name +RootDeviceType,root_device_type +RootDeviceVolumeId,root_device_volume_id +RootDirectory,root_directory +RootFolderId,root_folder_id +RootId,root_id +RootNotFoundException,root_not_found_exception +RootSquash,root_squash +RootSquashConfiguration,root_squash_configuration +RootStorage,root_storage +RootVolumeConfiguration,root_volume_configuration +RootVolumeEncryptionEnabled,root_volume_encryption_enabled +RootVolumeId,root_volume_id +RootVolumeSecurityStyle,root_volume_security_style +RootVolumeSizeGib,root_volume_size_gib +Roots,roots +Rotate,rotate +RotateChannelCredentialsRequest,rotate_channel_credentials_request +RotateChannelCredentialsResponse,rotate_channel_credentials_response +RotateEncryptionKeyMessage,rotate_encryption_key_message +RotateEncryptionKeyResult,rotate_encryption_key_result +RotateImmediately,rotate_immediately +RotateIngestEndpointCredentialsRequest,rotate_ingest_endpoint_credentials_request +RotateIngestEndpointCredentialsResponse,rotate_ingest_endpoint_credentials_response +RotateMasterUserPassword,rotate_master_user_password +RotateSecretRequest,rotate_secret_request +RotateSecretResponse,rotate_secret_response +RotateTunnelAccessTokenRequest,rotate_tunnel_access_token_request +RotateTunnelAccessTokenResponse,rotate_tunnel_access_token_response +Rotation,rotation +RotationAngle,rotation_angle +RotationArn,rotation_arn +RotationEnabled,rotation_enabled +RotationId,rotation_id +RotationIds,rotation_ids +RotationLambdaARN,rotation_lambda_arn +RotationLambdaArn,rotation_lambda_arn +RotationNamePrefix,rotation_name_prefix +RotationOccurredWithinFrequency,rotation_occurred_within_frequency +RotationOverride,rotation_override +RotationOverrideId,rotation_override_id +RotationOverrides,rotation_overrides +RotationRules,rotation_rules +RotationRulesType,rotation_rules_type +RotationShift,rotation_shift +RotationShifts,rotation_shifts +RotationStartTime,rotation_start_time +Rotations,rotations +RoundTripTime,round_trip_time +Route,route +RouteAnalysis,route_analysis +RouteAnalysisCompletion,route_analysis_completion +RouteAnalysisEndpointOptions,route_analysis_endpoint_options +RouteAnalysisEndpointOptionsSpecification,route_analysis_endpoint_options_specification +RouteAnalysisId,route_analysis_id +RouteAnalysisPath,route_analysis_path +RouteBBox,route_b_box +RouteCount,route_count +RouteData,route_data +RouteFilterPrefix,route_filter_prefix +RouteHasOutOfScopeEndpointViolation,route_has_out_of_scope_endpoint_violation +RouteId,route_id +RouteIdentifier,route_identifier +RouteKey,route_key +RouteMatrix,route_matrix +RouteMatrixEntry,route_matrix_entry +RouteMatrixEntryError,route_matrix_entry_error +RouteOrigin,route_origin +RouteRef,route_ref +RouteResponse,route_response +RouteResponseId,route_response_id +RouteResponseKey,route_response_key +RouteResponseSelectionExpression,route_response_selection_expression +RouteSelectionExpression,route_selection_expression +RouteSet,route_set +RouteSetDetails,route_set_details +RouteSettings,route_settings +RouteSpec,route_spec +RouteStatus,route_status +RouteSummary,route_summary +RouteSummaryList,route_summary_list +RouteTable,route_table +RouteTableArn,route_table_arn +RouteTableAssociation,route_table_association +RouteTableAssociationId,route_table_association_id +RouteTableAssociationState,route_table_association_state +RouteTableId,route_table_id +RouteTableIdentifier,route_table_identifier +RouteTableIds,route_table_ids +RouteTableRoute,route_table_route +RouteTableTimestamp,route_table_timestamp +RouteTableType,route_table_type +RouteTables,route_tables +RouteType,route_type +RouteUpdates,route_updates +RoutedResource,routed_resource +RouterType,router_type +Routes,routes +RoutingConfig,routing_config +RoutingConfigurationListItem,routing_configuration_list_item +RoutingControl,routing_control +RoutingControlArn,routing_control_arn +RoutingControlCount,routing_control_count +RoutingControlName,routing_control_name +RoutingControlState,routing_control_state +RoutingControls,routing_controls +RoutingPolicy,routing_policy +RoutingProfile,routing_profile +RoutingProfileArn,routing_profile_arn +RoutingProfileId,routing_profile_id +RoutingProfileQueueConfig,routing_profile_queue_config +RoutingProfileQueueConfigSummary,routing_profile_queue_config_summary +RoutingProfileQueueConfigSummaryList,routing_profile_queue_config_summary_list +RoutingProfileQueueReference,routing_profile_queue_reference +RoutingProfileReference,routing_profile_reference +RoutingProfileSearchCriteria,routing_profile_search_criteria +RoutingProfileSearchFilter,routing_profile_search_filter +RoutingProfileSummary,routing_profile_summary +RoutingProfileSummaryList,routing_profile_summary_list +RoutingProfiles,routing_profiles +RoutingRule,routing_rule +RoutingRules,routing_rules +RoutingStrategy,routing_strategy +RoutingStrategyType,routing_strategy_type +Row,row +RowAlternateColorOptions,row_alternate_color_options +RowAlternateColors,row_alternate_colors +RowColumnInfo,row_column_info +RowFieldNamesStyle,row_field_names_style +RowFilter,row_filter +RowFilterExpression,row_filter_expression +RowGroupLength,row_group_length +RowHeaderStyle,row_header_style +RowIndex,row_index +RowIndexStride,row_index_stride +RowInfo,row_info +RowLabelOptions,row_label_options +RowLength,row_length +RowLevelPermissionDataSet,row_level_permission_data_set +RowLevelPermissionTagConfiguration,row_level_permission_tag_configuration +RowLevelPermissionTagConfigurationApplied,row_level_permission_tag_configuration_applied +RowLevelPermissionTagKeys,row_level_permission_tag_keys +RowLevelPermissionTagRule,row_level_permission_tag_rule +RowLevelPermissionTags,row_level_permission_tags +RowRange,row_range +RowSort,row_sort +RowSpan,row_span +RowSubtotalOptions,row_subtotal_options +RowTag,row_tag +RowTotalOptions,row_total_options +RowValue,row_value +Rows,rows +RowsDropped,rows_dropped +RowsIngested,rows_ingested +RowsLabelOptions,rows_label_options +RowsLayout,rows_layout +RpcProtection,rpc_protection +RsaPublicKey,rsa_public_key +RsaPublicKeyFingerprint,rsa_public_key_fingerprint +Rscp,rscp +Rsrp,rsrp +Rsrq,rsrq +Rss,rss +Rssi,rssi +RtmpCaptionInfoDestinationSettings,rtmp_caption_info_destination_settings +RtmpGroupSettings,rtmp_group_settings +RtmpOutputSettings,rtmp_output_settings +Rule,rule +RuleARN,rule_arn +RuleAction,rule_action +RuleActionOverride,rule_action_override +RuleActionOverrides,rule_action_overrides +RuleArn,rule_arn +RuleArns,rule_arns +RuleBasedMatching,rule_based_matching +RuleBasedMatchingRequest,rule_based_matching_request +RuleBasedMatchingResponse,rule_based_matching_response +RuleBasedProperties,rule_based_properties +RuleCondition,rule_condition +RuleConfig,rule_config +RuleConfigurationName,rule_configuration_name +RuleCount,rule_count +RuleDefinition,rule_definition +RuleDescription,rule_description +RuleDetail,rule_detail +RuleDoesNotExistException,rule_does_not_exist_exception +RuleEvaluation,rule_evaluation +RuleEvaluationJobArn,rule_evaluation_job_arn +RuleEvaluationStatus,rule_evaluation_status +RuleEvaluatorImage,rule_evaluator_image +RuleGroup,rule_group +RuleGroupArn,rule_group_arn +RuleGroupDetails,rule_group_details +RuleGroupId,rule_group_id +RuleGroupMetadata,rule_group_metadata +RuleGroupName,rule_group_name +RuleGroupReferenceStatement,rule_group_reference_statement +RuleGroupResponse,rule_group_response +RuleGroupRuleName,rule_group_rule_name +RuleGroupRuleOptionsPair,rule_group_rule_options_pair +RuleGroupRuleOptionsPairs,rule_group_rule_options_pairs +RuleGroupSource,rule_group_source +RuleGroupSourceCustomActionsDetails,rule_group_source_custom_actions_details +RuleGroupSourceListDetails,rule_group_source_list_details +RuleGroupSourceStatefulRulesDetails,rule_group_source_stateful_rules_details +RuleGroupSourceStatefulRulesHeaderDetails,rule_group_source_stateful_rules_header_details +RuleGroupSourceStatefulRulesOptionsDetails,rule_group_source_stateful_rules_options_details +RuleGroupSourceStatelessRuleDefinition,rule_group_source_stateless_rule_definition +RuleGroupSourceStatelessRuleMatchAttributes,rule_group_source_stateless_rule_match_attributes +RuleGroupSourceStatelessRuleMatchAttributesDestinationPorts,rule_group_source_stateless_rule_match_attributes_destination_ports +RuleGroupSourceStatelessRuleMatchAttributesDestinations,rule_group_source_stateless_rule_match_attributes_destinations +RuleGroupSourceStatelessRuleMatchAttributesSourcePorts,rule_group_source_stateless_rule_match_attributes_source_ports +RuleGroupSourceStatelessRuleMatchAttributesSources,rule_group_source_stateless_rule_match_attributes_sources +RuleGroupSourceStatelessRuleMatchAttributesTcpFlags,rule_group_source_stateless_rule_match_attributes_tcp_flags +RuleGroupSourceStatelessRulesAndCustomActionsDetails,rule_group_source_stateless_rules_and_custom_actions_details +RuleGroupSourceStatelessRulesDetails,rule_group_source_stateless_rules_details +RuleGroupStatus,rule_group_status +RuleGroupSummary,rule_group_summary +RuleGroupType,rule_group_type +RuleGroupTypePair,rule_group_type_pair +RuleGroupTypePairs,rule_group_type_pairs +RuleGroupUpdate,rule_group_update +RuleGroupVariables,rule_group_variables +RuleGroupVariablesIpSetsDetails,rule_group_variables_ip_sets_details +RuleGroupVariablesPortSetsDetails,rule_group_variables_port_sets_details +RuleGroups,rule_groups +RuleGroupsNamespaceDescription,rule_groups_namespace_description +RuleGroupsNamespaceStatus,rule_groups_namespace_status +RuleGroupsNamespaceSummary,rule_groups_namespace_summary +RuleId,rule_id +RuleIdentifier,rule_identifier +RuleLabels,rule_labels +RuleLevel,rule_level +RuleLimitExceededException,rule_limit_exceeded_exception +RuleMetadata,rule_metadata +RuleMetricName,rule_metric_name +RuleName,rule_name +RuleNameWithinRuleGroup,rule_name_within_rule_group +RuleNames,rule_names +RuleNotFoundException,rule_not_found_exception +RuleNumber,rule_number +RuleOption,rule_option +RuleOptions,rule_options +RuleOrder,rule_order +RuleParameters,rule_parameters +RulePriorities,rule_priorities +RulePriorityPair,rule_priority_pair +RuleResult,rule_result +RuleResults,rule_results +RuleSet,rule_set +RuleSetArn,rule_set_arn +RuleSetBody,rule_set_body +RuleSetDoesNotExistException,rule_set_does_not_exist_exception +RuleSetName,rule_set_name +RuleSets,rule_sets +RuleState,rule_state +RuleStatus,rule_status +RuleSummary,rule_summary +RuleSummaryList,rule_summary_list +RuleTags,rule_tags +RuleTriggerEventSource,rule_trigger_event_source +RuleType,rule_type +RuleUpdate,rule_update +RuleUpdateFailure,rule_update_failure +RuleUpdateSuccess,rule_update_success +RuleVariables,rule_variables +RuleVersion,rule_version +RuleWithinRuleGroup,rule_within_rule_group +Rules,rules +RulesConfiguration,rules_configuration +RulesConfigurationType,rules_configuration_type +RulesList,rules_list +RulesPackage,rules_package +RulesSource,rules_source +RulesSourceList,rules_source_list +RulesString,rules_string +Ruleset,ruleset +RulesetArn,ruleset_arn +RulesetEvaluationRunId,ruleset_evaluation_run_id +RulesetItem,ruleset_item +RulesetName,ruleset_name +RulesetNames,ruleset_names +Rulesets,rulesets +RumEvent,rum_event +RumEvents,rum_events +Run,run +RunAs,run_as +RunBackTestMode,run_back_test_mode +RunCommand,run_command +RunCommandParameters,run_command_parameters +RunCommandTarget,run_command_target +RunCommandTargets,run_command_targets +RunConfig,run_config +RunConfiguration,run_configuration +RunConfigurationDescription,run_configuration_description +RunConfigurationUpdate,run_configuration_update +RunFleetAdvisorLsaAnalysisResponse,run_fleet_advisor_lsa_analysis_response +RunGroupListItem,run_group_list_item +RunId,run_id +RunInstancesMonitoringEnabled,run_instances_monitoring_enabled +RunInstancesRequest,run_instances_request +RunJobFlowInput,run_job_flow_input +RunJobFlowOutput,run_job_flow_output +RunListItem,run_list_item +RunName,run_name +RunPipelineActivityRequest,run_pipeline_activity_request +RunPipelineActivityResponse,run_pipeline_activity_response +RunProperties,run_properties +RunScheduledInstancesRequest,run_scheduled_instances_request +RunScheduledInstancesResult,run_scheduled_instances_result +RunStatementRequest,run_statement_request +RunStatementResponse,run_statement_response +RunStatus,run_status +RunTaskRequest,run_task_request +RunTaskResponse,run_task_response +Runbook,runbook +Runbooks,runbooks +RuncBinaryPath,runc_binary_path +Running,running +RunningActions,running_actions +RunningAmiVersion,running_ami_version +RunningBridgeCount,running_bridge_count +RunningInstanceCount,running_instance_count +RunningMode,running_mode +RunningModeAutoStopTimeoutInMinutes,running_mode_auto_stop_timeout_in_minutes +RunningSetup,running_setup +RunningTasksCount,running_tasks_count +Runs,runs +Runtime,runtime +RuntimeConfiguration,runtime_configuration +RuntimeContext,runtime_context +RuntimeContextName,runtime_context_name +RuntimeContextStates,runtime_context_states +RuntimeDetails,runtime_details +RuntimeEnvironment,runtime_environment +RuntimeEnvironmentSecrets,runtime_environment_secrets +RuntimeEnvironmentVariables,runtime_environment_variables +RuntimeHintDetails,runtime_hint_details +RuntimeHintValue,runtime_hint_value +RuntimeHints,runtime_hints +RuntimeInSeconds,runtime_in_seconds +RuntimePlatform,runtime_platform +RuntimeRoleArn,runtime_role_arn +RuntimeVersion,runtime_version +RuntimeVersionArn,runtime_version_arn +RuntimeVersionConfig,runtime_version_config +RuntimeVersionError,runtime_version_error +RuntimeVersions,runtime_versions +RxDataRate2,rx_data_rate2 +RxDelay1,rx_delay1 +RxDrOffset1,rx_dr_offset1 +RxFreq2,rx_freq2 +RxLevel,rx_level +RxNormAttribute,rx_norm_attribute +RxNormConcept,rx_norm_concept +RxNormConcepts,rx_norm_concepts +RxNormEntity,rx_norm_entity +RxNormTrait,rx_norm_trait +S,s +S3,s3 +S3AccessControlList,s3_access_control_list +S3AccessControlPolicy,s3_access_control_policy +S3AccessDeniedFault,s3_access_denied_fault +S3AccessPointAlias,s3_access_point_alias +S3AccessPointArn,s3_access_point_arn +S3AccessPointConfiguration,s3_access_point_configuration +S3AclOption,s3_acl_option +S3Action,s3_action +S3ApplicationCodeLocationDescription,s3_application_code_location_description +S3ArtifactLocation,s3_artifact_location +S3ArtifactPath,s3_artifact_path +S3BackupConfiguration,s3_backup_configuration +S3BackupDescription,s3_backup_description +S3BackupMode,s3_backup_mode +S3BackupUpdate,s3_backup_update +S3Bucket,s3_bucket +S3BucketAccessRoleArn,s3_bucket_access_role_arn +S3BucketAclGrantConfiguration,s3_bucket_acl_grant_configuration +S3BucketArn,s3_bucket_arn +S3BucketConfiguration,s3_bucket_configuration +S3BucketCriteriaForJob,s3_bucket_criteria_for_job +S3BucketDefinitionForJob,s3_bucket_definition_for_job +S3BucketDestination,s3_bucket_destination +S3BucketDetail,s3_bucket_detail +S3BucketDetails,s3_bucket_details +S3BucketDoesNotExistException,s3_bucket_does_not_exist_exception +S3BucketFolder,s3_bucket_folder +S3BucketInfo,s3_bucket_info +S3BucketLogDestination,s3_bucket_log_destination +S3BucketName,s3_bucket_name +S3BucketOwner,s3_bucket_owner +S3BucketPath,s3_bucket_path +S3BucketPrefix,s3_bucket_prefix +S3BucketRegion,s3_bucket_region +S3BucketRepository,s3_bucket_repository +S3BucketRoleArn,s3_bucket_role_arn +S3BucketSinkConfiguration,s3_bucket_sink_configuration +S3BucketSource,s3_bucket_source +S3BucketTranscriptSource,s3_bucket_transcript_source +S3CanonicalUserId,s3_canonical_user_id +S3CatalogDeltaSource,s3_catalog_delta_source +S3CatalogHudiSource,s3_catalog_hudi_source +S3CatalogSource,s3_catalog_source +S3CatalogTarget,s3_catalog_target +S3ClassificationScope,s3_classification_scope +S3ClassificationScopeExclusion,s3_classification_scope_exclusion +S3ClassificationScopeExclusionUpdate,s3_classification_scope_exclusion_update +S3ClassificationScopeUpdate,s3_classification_scope_update +S3CompressionType,s3_compression_type +S3Config,s3_config +S3Configuration,s3_configuration +S3ContentBaseLocation,s3_content_base_location +S3ContentBaseLocationDescription,s3_content_base_location_description +S3ContentBaseLocationUpdate,s3_content_base_location_update +S3ContentLocation,s3_content_location +S3ContentLocationDescription,s3_content_location_description +S3ContentLocationUpdate,s3_content_location_update +S3CopyObjectOperation,s3_copy_object_operation +S3CsvSource,s3_csv_source +S3Data,s3_data +S3DataAccessAsset,s3_data_access_asset +S3DataAccessAssetSourceEntry,s3_data_access_asset_source_entry +S3DataConfig,s3_data_config +S3DataDistributionType,s3_data_distribution_type +S3DataRepositoryConfiguration,s3_data_repository_configuration +S3DataSize,s3_data_size +S3DataSource,s3_data_source +S3DataSourceConfiguration,s3_data_source_configuration +S3DataSpec,s3_data_spec +S3DataType,s3_data_type +S3DataUrl,s3_data_url +S3DeleteObjectTagging,s3_delete_object_tagging +S3DeltaCatalogTarget,s3_delta_catalog_target +S3DeltaDirectTarget,s3_delta_direct_target +S3DeltaSource,s3_delta_source +S3Destination,s3_destination +S3DestinationAccessControl,s3_destination_access_control +S3DestinationConfig,s3_destination_config +S3DestinationConfiguration,s3_destination_configuration +S3DestinationDescription,s3_destination_description +S3DestinationProperties,s3_destination_properties +S3DestinationSettings,s3_destination_settings +S3DestinationUpdate,s3_destination_update +S3Destinations,s3_destinations +S3DirectSourceAdditionalOptions,s3_direct_source_additional_options +S3DirectTarget,s3_direct_target +S3Encryption,s3_encryption +S3EncryptionConfig,s3_encryption_config +S3EncryptionConfiguration,s3_encryption_configuration +S3EncryptionEnabled,s3_encryption_enabled +S3EncryptionMode,s3_encryption_mode +S3EncryptionSettings,s3_encryption_settings +S3EventName,s3_event_name +S3Exception,s3_exception +S3ExportArtifacts,s3_export_artifacts +S3ExportConfiguration,s3_export_configuration +S3ExportLocation,s3_export_location +S3Exporting,s3_exporting +S3ExportingConfig,s3_exporting_config +S3ExportingLocation,s3_exporting_location +S3FailurePath,s3_failure_path +S3FileLocation,s3_file_location +S3GeneratedManifestDescriptor,s3_generated_manifest_descriptor +S3GlueParquetTarget,s3_glue_parquet_target +S3Grant,s3_grant +S3Grantee,s3_grantee +S3HudiCatalogTarget,s3_hudi_catalog_target +S3HudiDirectTarget,s3_hudi_direct_target +S3HudiSource,s3_hudi_source +S3ImportSource,s3_import_source +S3IngestionRoleArn,s3_ingestion_role_arn +S3InitiateRestoreObject,s3_initiate_restore_object +S3InitiateRestoreObjectOperation,s3_initiate_restore_object_operation +S3Input,s3_input +S3InputConfiguration,s3_input_configuration +S3InputDefinition,s3_input_definition +S3InputFileLocation,s3_input_file_location +S3InputFormatConfig,s3_input_format_config +S3InputMode,s3_input_mode +S3Inputs,s3_inputs +S3JobDefinition,s3_job_definition +S3JobManifestGenerator,s3_job_manifest_generator +S3JsonSource,s3_json_source +S3Key,s3_key +S3KeyFilter,s3_key_filter +S3KeyName,s3_key_name +S3KeyOutput,s3_key_output +S3KeyPrefix,s3_key_prefix +S3Keys,s3_keys +S3KmsKeyId,s3_kms_key_id +S3Location,s3_location +S3LocationDescription,s3_location_description +S3LocationNotInServiceRegionException,s3_location_not_in_service_region_exception +S3LocationUri,s3_location_uri +S3LogDelivery,s3_log_delivery +S3LogDeliveryDescription,s3_log_delivery_description +S3LogUrl,s3_log_url +S3Logs,s3_logs +S3LogsConfig,s3_logs_config +S3LogsConfiguration,s3_logs_configuration +S3LogsConfigurationResult,s3_logs_configuration_result +S3MachineLearningModelResourceData,s3_machine_learning_model_resource_data +S3ManifestOutputLocation,s3_manifest_output_location +S3ModelArtifacts,s3_model_artifacts +S3ModelDataSource,s3_model_data_source +S3MonitoringConfiguration,s3_monitoring_configuration +S3Object,s3_object +S3ObjectAcl,s3_object_acl +S3ObjectKey,s3_object_key +S3ObjectLockLegalHold,s3_object_lock_legal_hold +S3ObjectMetadata,s3_object_metadata +S3ObjectOwner,s3_object_owner +S3ObjectSource,s3_object_source +S3ObjectTag,s3_object_tag +S3ObjectTags,s3_object_tags +S3ObjectUrl,s3_object_url +S3ObjectVersion,s3_object_version +S3OnDeviceService,s3_on_device_service +S3OnDeviceServiceConfiguration,s3_on_device_service_configuration +S3Options,s3_options +S3Origin,s3_origin +S3OriginConfig,s3_origin_config +S3Output,s3_output +S3OutputConfiguration,s3_output_configuration +S3OutputFormatConfig,s3_output_format_config +S3OutputLocation,s3_output_location +S3OutputPath,s3_output_path +S3OutputUri,s3_output_uri +S3OutputUrl,s3_output_url +S3Parameters,s3_parameters +S3ParquetSource,s3_parquet_source +S3Path,s3_path +S3PathforGroupMembers,s3_pathfor_group_members +S3Prefix,s3_prefix +S3PublicAccessBlockConfiguration,s3_public_access_block_configuration +S3PutObjectAcl,s3_put_object_acl +S3PutObjectCopy,s3_put_object_copy +S3PutObjectLegalHold,s3_put_object_legal_hold +S3PutObjectRetention,s3_put_object_retention +S3PutObjectTagging,s3_put_object_tagging +S3RecordingConfig,s3_recording_config +S3RecordingDetails,s3_recording_details +S3RecordingSinkConfiguration,s3_recording_sink_configuration +S3RecordingSinkRuntimeConfiguration,s3_recording_sink_runtime_configuration +S3Reference,s3_reference +S3ReferenceDataSource,s3_reference_data_source +S3ReferenceDataSourceDescription,s3_reference_data_source_description +S3ReferenceDataSourceUpdate,s3_reference_data_source_update +S3Region,s3_region +S3ReplicateObject,s3_replicate_object +S3ReportExportConfig,s3_report_export_config +S3ReportLocation,s3_report_location +S3Repository,s3_repository +S3RepositoryDetails,s3_repository_details +S3Resource,s3_resource +S3ResourceClassification,s3_resource_classification +S3ResourceClassificationUpdate,s3_resource_classification_update +S3ResourceNotFoundFault,s3_resource_not_found_fault +S3Resources,s3_resources +S3Results,s3_results +S3ResultsPath,s3_results_path +S3Retention,s3_retention +S3SetObjectAclOperation,s3_set_object_acl_operation +S3SetObjectLegalHoldOperation,s3_set_object_legal_hold_operation +S3SetObjectRetentionOperation,s3_set_object_retention_operation +S3SetObjectTaggingOperation,s3_set_object_tagging_operation +S3Settings,s3_settings +S3SignedObject,s3_signed_object +S3SnapshotAsset,s3_snapshot_asset +S3Source,s3_source +S3SourceAdditionalOptions,s3_source_additional_options +S3SourceConfig,s3_source_config +S3SourceProperties,s3_source_properties +S3SseAlgorithm,s3_sse_algorithm +S3SseKmsKeyId,s3_sse_kms_key_id +S3StagingLocation,s3_staging_location +S3Storage,s3_storage +S3StorageClass,s3_storage_class +S3StorageConfig,s3_storage_config +S3SubscriptionRequiredException,s3_subscription_required_exception +S3TableOutputOptions,s3_table_output_options +S3Tag,s3_tag +S3Target,s3_target +S3Targets,s3_targets +S3Update,s3_update +S3UploadMode,s3_upload_mode +S3Uri,s3_uri +S3Url,s3_url +S3UrlPrefix,s3_url_prefix +S3UrlSignerRole,s3_url_signer_role +S3Version,s3_version +S3WordsList,s3_words_list +S3objectKey,s3object_key +SAMLAssertion,saml_assertion +SAMLIdp,saml_idp +SAMLMetadataDocument,saml_metadata_document +SAMLOptions,saml_options +SAMLOptionsInput,saml_options_input +SAMLOptionsOutput,saml_options_output +SAMLProviderArn,saml_provider_arn +SAMLProviderList,saml_provider_list +SAMLProviderListEntry,saml_provider_list_entry +SAPOData,sapo_data +SAPODataConnectorProfileCredentials,sapo_data_connector_profile_credentials +SAPODataConnectorProfileProperties,sapo_data_connector_profile_properties +SAPODataDestinationProperties,sapo_data_destination_properties +SAPODataPaginationConfig,sapo_data_pagination_config +SAPODataParallelismConfig,sapo_data_parallelism_config +SAPODataSourceProperties,sapo_data_source_properties +SCApplicationAttributes,sc_application_attributes +SDM,sdm +SHA256TreeHash,sha256_tree_hash +SL,sl +SLRDeploymentStatus,slr_deployment_status +SMB,smb +SMBACLEnabled,smbacl_enabled +SMBFileShareInfo,smb_file_share_info +SMBFileShareInfoList,smb_file_share_info_list +SMBGuestPasswordSet,smb_guest_password_set +SMBLocalGroups,smb_local_groups +SMBSecurityStrategy,smb_security_strategy +SMS,sms +SMSChannelRequest,sms_channel_request +SMSChannelResponse,sms_channel_response +SMSConfiguration,sms_configuration +SMSMessage,sms_message +SMSMessageActivity,sms_message_activity +SMSMfaSettings,sms_mfa_settings +SMSMfaSettingsType,sms_mfa_settings_type +SMSSandboxPhoneNumber,sms_sandbox_phone_number +SMSTemplate,sms_template +SMSTemplateRequest,sms_template_request +SMSTemplateResponse,sms_template_response +SNOMEDCTAttribute,snomedct_attribute +SNOMEDCTConcept,snomedct_concept +SNOMEDCTConcepts,snomedct_concepts +SNOMEDCTDetails,snomedct_details +SNOMEDCTEntity,snomedct_entity +SNOMEDCTTrait,snomedct_trait +SNSAction,sns_action +SNSConfiguration,sns_configuration +SNSDestination,sns_destination +SNSInvalidTopicFault,sns_invalid_topic_fault +SNSNoAuthorizationFault,sns_no_authorization_fault +SNSTopic,sns_topic +SNSTopicArn,sns_topic_arn +SNSTopicArnNotFoundFault,sns_topic_arn_not_found_fault +SNSTopicPublishAction,sns_topic_publish_action +SNwkSIntKey,s_nwk_s_int_key +SOA,soa +SOAChange,soa_change +SQLPort,sql_port +SS,ss +SSEAlgorithm,sse_algorithm +SSEAwsKmsKeyId,sse_aws_kms_key_id +SSECustomerAlgorithm,sse_customer_algorithm +SSECustomerKey,sse_customer_key +SSECustomerKeyMD5,sse_customer_key_md5 +SSEDescription,sse_description +SSEKMS,ssekms +SSEKMSEncryption,ssekms_encryption +SSEKMSEncryptionContext,ssekms_encryption_context +SSEKMSKeyId,ssekms_key_id +SSES3,sses3 +SSESpecification,sse_specification +SSESpecificationOverride,sse_specification_override +SSEType,sse_type +SSHPublicKey,ssh_public_key +SSHPublicKeyBody,ssh_public_key_body +SSHPublicKeyId,ssh_public_key_id +SSHPublicKeyMetadata,ssh_public_key_metadata +SSHPublicKeys,ssh_public_keys +SSLCertificateId,ssl_certificate_id +SSLPolicyNotFoundException,ssl_policy_not_found_exception +SSLSupportMethod,ssl_support_method +SSMLMessage,ssml_message +SSMLMessageType,ssml_message_type +SSMOutput,ssm_output +SSMValidationParameters,ssm_validation_parameters +SSOIdentity,sso_identity +SaaSConfiguration,saa_s_configuration +Safe,safe +SafeguardPolicy,safeguard_policy +SafetyRuleArn,safety_rule_arn +SafetyRules,safety_rules +SafetyRulesToOverride,safety_rules_to_override +SageMakerImageArn,sage_maker_image_arn +SageMakerImageVersionAliases,sage_maker_image_version_aliases +SageMakerImageVersionArn,sage_maker_image_version_arn +SageMakerJobArn,sage_maker_job_arn +SageMakerMachineLearningModelResourceData,sage_maker_machine_learning_model_resource_data +SageMakerPipelineParameter,sage_maker_pipeline_parameter +SageMakerPipelineParameters,sage_maker_pipeline_parameters +Salesforce,salesforce +SalesforceAction,salesforce_action +SalesforceChatterFeedConfiguration,salesforce_chatter_feed_configuration +SalesforceConfiguration,salesforce_configuration +SalesforceConnectorProfileCredentials,salesforce_connector_profile_credentials +SalesforceConnectorProfileProperties,salesforce_connector_profile_properties +SalesforceCustomKnowledgeArticleTypeConfiguration,salesforce_custom_knowledge_article_type_configuration +SalesforceDestinationProperties,salesforce_destination_properties +SalesforceKnowledgeArticleConfiguration,salesforce_knowledge_article_configuration +SalesforceMetadata,salesforce_metadata +SalesforceSourceProperties,salesforce_source_properties +SalesforceStandardKnowledgeArticleTypeConfiguration,salesforce_standard_knowledge_article_type_configuration +SalesforceStandardObjectAttachmentConfiguration,salesforce_standard_object_attachment_configuration +SalesforceStandardObjectConfiguration,salesforce_standard_object_configuration +Salt,salt +SameFileContentException,same_file_content_exception +SamePathRequestException,same_path_request_exception +SameSheetTargetVisualConfiguration,same_sheet_target_visual_configuration +SamlAuthentication,saml_authentication +SamlConfigCount,saml_config_count +SamlConfigOptions,saml_config_options +SamlConfiguration,saml_configuration +SamlProperties,saml_properties +SamlProviderARNs,saml_provider_arns +SamlProviderArn,saml_provider_arn +Sample,sample +SampleAdaptiveOffsetFilterMode,sample_adaptive_offset_filter_mode +SampleChannelDataRequest,sample_channel_data_request +SampleChannelDataResponse,sample_channel_data_response +SampleCount,sample_count +SampleDataS3SourceConfig,sample_data_s3_source_config +SampleFraction,sample_fraction +SamplePath,sample_path +SamplePayloadUrl,sample_payload_url +SampleQuery,sample_query +SampleRange,sample_range +SampleRangeConversion,sample_range_conversion +SampleRate,sample_rate +SampleRows,sample_rows +SampleSize,sample_size +SampleTime,sample_time +SampleTimestamp,sample_timestamp +SampleUtterance,sample_utterance +SampleUtterances,sample_utterances +SampleValue,sample_value +SampleWeightAttributeName,sample_weight_attribute_name +SampledCount,sampled_count +SampledEndTime,sampled_end_time +SampledHTTPRequest,sampled_http_request +SampledRequests,sampled_requests +SampledRequestsEnabled,sampled_requests_enabled +SampledStartTime,sampled_start_time +Sampling,sampling +SamplingDeviceCount,sampling_device_count +SamplingInterval,sampling_interval +SamplingPercentage,sampling_percentage +SamplingRate,sampling_rate +SamplingRule,sampling_rule +SamplingRuleRecord,sampling_rule_record +SamplingRuleRecords,sampling_rule_records +SamplingRuleUpdate,sampling_rule_update +SamplingStatisticSummaries,sampling_statistic_summaries +SamplingStatisticSummary,sampling_statistic_summary +SamplingStatisticsDocument,sampling_statistics_document +SamplingStatisticsDocuments,sampling_statistics_documents +SamplingStrategy,sampling_strategy +SamplingTargetDocument,sampling_target_document +SamplingTargetDocuments,sampling_target_documents +SanRequireDirectoryGuid,san_require_directory_guid +SanRequireDns,san_require_dns +SanRequireDomainDns,san_require_domain_dns +SanRequireEmail,san_require_email +SanRequireSpn,san_require_spn +SanRequireUpn,san_require_upn +SanitizationWarning,sanitization_warning +SankeyDiagramAggregatedFieldWells,sankey_diagram_aggregated_field_wells +SankeyDiagramChartConfiguration,sankey_diagram_chart_configuration +SankeyDiagramFieldWells,sankey_diagram_field_wells +SankeyDiagramSortConfiguration,sankey_diagram_sort_configuration +SankeyDiagramVisual,sankey_diagram_visual +SapHostname,sap_hostname +SapInstanceNumber,sap_instance_number +SapKernelVersion,sap_kernel_version +SasConfiguration,sas_configuration +Sasl,sasl +SaslMechanism,sasl_mechanism +SaslPassword,sasl_password +SaslUsername,sasl_username +SatelliteListItem,satellite_list_item +Saturation,saturation +Saturday,saturday +Savings,savings +SavingsCurrencyCode,savings_currency_code +SavingsOpportunity,savings_opportunity +SavingsPercentage,savings_percentage +SavingsPlan,savings_plan +SavingsPlanArn,savings_plan_arn +SavingsPlanFilter,savings_plan_filter +SavingsPlanOffering,savings_plan_offering +SavingsPlanOfferingFilterElement,savings_plan_offering_filter_element +SavingsPlanOfferingProperty,savings_plan_offering_property +SavingsPlanOfferingRate,savings_plan_offering_rate +SavingsPlanOfferingRateFilterElement,savings_plan_offering_rate_filter_element +SavingsPlanOfferingRateProperty,savings_plan_offering_rate_property +SavingsPlanRate,savings_plan_rate +SavingsPlanRateFilter,savings_plan_rate_filter +SavingsPlanRateProperty,savings_plan_rate_property +SavingsPlansAmortizedCommitment,savings_plans_amortized_commitment +SavingsPlansCoverage,savings_plans_coverage +SavingsPlansCoverageData,savings_plans_coverage_data +SavingsPlansCoverages,savings_plans_coverages +SavingsPlansCoveredHoursInLookbackPeriod,savings_plans_covered_hours_in_lookback_period +SavingsPlansDetails,savings_plans_details +SavingsPlansPurchaseRecommendation,savings_plans_purchase_recommendation +SavingsPlansPurchaseRecommendationDetail,savings_plans_purchase_recommendation_detail +SavingsPlansPurchaseRecommendationDetails,savings_plans_purchase_recommendation_details +SavingsPlansPurchaseRecommendationMetadata,savings_plans_purchase_recommendation_metadata +SavingsPlansPurchaseRecommendationSummary,savings_plans_purchase_recommendation_summary +SavingsPlansSavings,savings_plans_savings +SavingsPlansType,savings_plans_type +SavingsPlansUtilization,savings_plans_utilization +SavingsPlansUtilizationAggregates,savings_plans_utilization_aggregates +SavingsPlansUtilizationByTime,savings_plans_utilization_by_time +SavingsPlansUtilizationDetail,savings_plans_utilization_detail +SavingsPlansUtilizationDetails,savings_plans_utilization_details +SavingsPlansUtilizationsByTime,savings_plans_utilizations_by_time +ScalaCode,scala_code +ScalableDimension,scalable_dimension +ScalableTarget,scalable_target +ScalableTargetARN,scalable_target_arn +ScalableTargetAction,scalable_target_action +ScalableTargets,scalable_targets +ScalarCrlRequest,scalar_crl_request +ScalarProfileRequest,scalar_profile_request +ScalarSubjectRequest,scalar_subject_request +ScalarTrustAnchorRequest,scalar_trust_anchor_request +ScalarType,scalar_type +ScalarValue,scalar_value +Scale,scale +ScaleDownBehavior,scale_down_behavior +ScaleDownModifications,scale_down_modifications +ScaleDownNodeTypes,scale_down_node_types +ScaleInCooldown,scale_in_cooldown +ScaleInPolicy,scale_in_policy +ScaleInPolicyDescription,scale_in_policy_description +ScaleInPolicyUpdate,scale_in_policy_update +ScaleInProtectedInstances,scale_in_protected_instances +ScaleOutCooldown,scale_out_cooldown +ScaleOutPolicy,scale_out_policy +ScaleOutPolicyDescription,scale_out_policy_description +ScaleOutPolicyUpdate,scale_out_policy_update +ScaleUpModifications,scale_up_modifications +ScaleUpNodeTypes,scale_up_node_types +ScalingAction,scaling_action +ScalingActivities,scaling_activities +ScalingActivity,scaling_activity +ScalingActivityInProgressFault,scaling_activity_in_progress_fault +ScalingAdjustment,scaling_adjustment +ScalingAdjustmentType,scaling_adjustment_type +ScalingBehavior,scaling_behavior +ScalingConfig,scaling_config +ScalingConfiguration,scaling_configuration +ScalingConfigurationInfo,scaling_configuration_info +ScalingConstraints,scaling_constraints +ScalingInstruction,scaling_instruction +ScalingInstructions,scaling_instructions +ScalingMode,scaling_mode +ScalingParameters,scaling_parameters +ScalingParametersStatus,scaling_parameters_status +ScalingPlan,scaling_plan +ScalingPlanName,scaling_plan_name +ScalingPlanNames,scaling_plan_names +ScalingPlanResource,scaling_plan_resource +ScalingPlanResources,scaling_plan_resources +ScalingPlanVersion,scaling_plan_version +ScalingPlans,scaling_plans +ScalingPolicies,scaling_policies +ScalingPolicy,scaling_policy +ScalingPolicyMetric,scaling_policy_metric +ScalingPolicyObjective,scaling_policy_objective +ScalingPolicyUpdate,scaling_policy_update +ScalingPolicyUpdateBehavior,scaling_policy_update_behavior +ScalingProcessQuery,scaling_process_query +ScalingProcesses,scaling_processes +ScalingRule,scaling_rule +ScalingStatusCode,scaling_status_code +ScalingStatusMessage,scaling_status_message +ScalingTrigger,scaling_trigger +ScalingType,scaling_type +Scan,scan +ScanAll,scan_all +ScanBy,scan_by +ScanCompletedAt,scan_completed_at +ScanCondition,scan_condition +ScanConditionPair,scan_condition_pair +ScanDetections,scan_detections +ScanDirection,scan_direction +ScanEc2InstanceWithFindings,scan_ec2_instance_with_findings +ScanEc2InstanceWithFindingsResult,scan_ec2_instance_with_findings_result +ScanEnabled,scan_enabled +ScanEndTime,scan_end_time +ScanFilePath,scan_file_path +ScanFilter,scan_filter +ScanId,scan_id +ScanIndexForward,scan_index_forward +ScanInput,scan_input +ScanMode,scan_mode +ScanNameWithFindingNum,scan_name_with_finding_num +ScanNotFoundException,scan_not_found_exception +ScanOnPush,scan_on_push +ScanOutput,scan_output +ScanProvisionedProductsInput,scan_provisioned_products_input +ScanProvisionedProductsOutput,scan_provisioned_products_output +ScanRange,scan_range +ScanResourceCriteria,scan_resource_criteria +ScanResult,scan_result +ScanResultDetails,scan_result_details +ScanStartTime,scan_start_time +ScanStartedAt,scan_started_at +ScanStatus,scan_status +ScanSummary,scan_summary +ScanThreatName,scan_threat_name +ScanType,scan_type +ScanTypeConversionMode,scan_type_conversion_mode +ScannedCount,scanned_count +ScannedItemCount,scanned_item_count +ScannedVolumeDetails,scanned_volume_details +ScanningRepositoryFilter,scanning_repository_filter +Scans,scans +ScatterPlotCategoricallyAggregatedFieldWells,scatter_plot_categorically_aggregated_field_wells +ScatterPlotConfiguration,scatter_plot_configuration +ScatterPlotFieldWells,scatter_plot_field_wells +ScatterPlotUnaggregatedFieldWells,scatter_plot_unaggregated_field_wells +ScatterPlotVisual,scatter_plot_visual +SccDestinationSettings,scc_destination_settings +SccXml,scc_xml +Scenario,scenario +SceneChangeDetect,scene_change_detect +SceneError,scene_error +SceneSummary,scene_summary +Schedule,schedule +ScheduleAction,schedule_action +ScheduleActionSettings,schedule_action_settings +ScheduleActionStartSettings,schedule_action_start_settings +ScheduleActions,schedule_actions +ScheduleActivityTaskDecisionAttributes,schedule_activity_task_decision_attributes +ScheduleActivityTaskFailedEventAttributes,schedule_activity_task_failed_event_attributes +ScheduleAdBreak,schedule_ad_break +ScheduleAdBreaks,schedule_ad_breaks +ScheduleArn,schedule_arn +ScheduleAssociationState,schedule_association_state +ScheduleAt,schedule_at +ScheduleConfig,schedule_config +ScheduleConfiguration,schedule_configuration +ScheduleDefinitionTypeUnsupportedFault,schedule_definition_type_unsupported_fault +ScheduleDefinitions,schedule_definitions +ScheduleDescription,schedule_description +ScheduleEndTime,schedule_end_time +ScheduleEntry,schedule_entry +ScheduleEntryType,schedule_entry_type +ScheduleExpression,schedule_expression +ScheduleExpressionTimezone,schedule_expression_timezone +ScheduleFrequency,schedule_frequency +ScheduleGroupArn,schedule_group_arn +ScheduleGroupSummary,schedule_group_summary +ScheduleGroups,schedule_groups +ScheduleId,schedule_id +ScheduleIdentifier,schedule_identifier +ScheduleKeyDeletionRequest,schedule_key_deletion_request +ScheduleKeyDeletionResponse,schedule_key_deletion_response +ScheduleLambdaFunctionDecisionAttributes,schedule_lambda_function_decision_attributes +ScheduleLambdaFunctionFailedEventAttributes,schedule_lambda_function_failed_event_attributes +ScheduleName,schedule_name +ScheduleOffset,schedule_offset +ScheduleRefreshOnEntity,schedule_refresh_on_entity +ScheduleRunConfiguration,schedule_run_configuration +ScheduleRunRequest,schedule_run_request +ScheduleRunResult,schedule_run_result +ScheduleRunTest,schedule_run_test +ScheduleStartTime,schedule_start_time +ScheduleSummary,schedule_summary +ScheduleTimezone,schedule_timezone +Scheduled,scheduled +ScheduledAction,scheduled_action +ScheduledActionARN,scheduled_action_arn +ScheduledActionAlreadyExistsFault,scheduled_action_already_exists_fault +ScheduledActionBufferTime,scheduled_action_buffer_time +ScheduledActionDescription,scheduled_action_description +ScheduledActionFilter,scheduled_action_filter +ScheduledActionName,scheduled_action_name +ScheduledActionNames,scheduled_action_names +ScheduledActionNotFoundFault,scheduled_action_not_found_fault +ScheduledActionQuotaExceededFault,scheduled_action_quota_exceeded_fault +ScheduledActionType,scheduled_action_type +ScheduledActionTypeUnsupportedFault,scheduled_action_type_unsupported_fault +ScheduledActions,scheduled_actions +ScheduledActionsMessage,scheduled_actions_message +ScheduledActionsType,scheduled_actions_type +ScheduledAuditMetadata,scheduled_audit_metadata +ScheduledAutoTuneDetails,scheduled_auto_tune_details +ScheduledBy,scheduled_by +ScheduledEndTime,scheduled_end_time +ScheduledInstance,scheduled_instance +ScheduledInstanceAvailability,scheduled_instance_availability +ScheduledInstanceAvailabilitySet,scheduled_instance_availability_set +ScheduledInstanceId,scheduled_instance_id +ScheduledInstanceIds,scheduled_instance_ids +ScheduledInstanceRecurrence,scheduled_instance_recurrence +ScheduledInstanceRecurrenceRequest,scheduled_instance_recurrence_request +ScheduledInstanceSet,scheduled_instance_set +ScheduledInstancesBlockDeviceMapping,scheduled_instances_block_device_mapping +ScheduledInstancesEbs,scheduled_instances_ebs +ScheduledInstancesIamInstanceProfile,scheduled_instances_iam_instance_profile +ScheduledInstancesIpv6Address,scheduled_instances_ipv6_address +ScheduledInstancesLaunchSpecification,scheduled_instances_launch_specification +ScheduledInstancesMonitoring,scheduled_instances_monitoring +ScheduledInstancesNetworkInterface,scheduled_instances_network_interface +ScheduledInstancesPlacement,scheduled_instances_placement +ScheduledInstancesPrivateIpAddressConfig,scheduled_instances_private_ip_address_config +ScheduledJobRollout,scheduled_job_rollout +ScheduledQueries,scheduled_queries +ScheduledQuery,scheduled_query +ScheduledQueryArn,scheduled_query_arn +ScheduledQueryDescription,scheduled_query_description +ScheduledQueryExecutionRoleArn,scheduled_query_execution_role_arn +ScheduledQueryRunSummary,scheduled_query_run_summary +ScheduledScalingSuspended,scheduled_scaling_suspended +ScheduledSplit,scheduled_split +ScheduledSplitConfig,scheduled_split_config +ScheduledSplitsLaunchConfig,scheduled_splits_launch_config +ScheduledSplitsLaunchDefinition,scheduled_splits_launch_definition +ScheduledStart,scheduled_start +ScheduledStartTime,scheduled_start_time +ScheduledStartTimeMillis,scheduled_start_time_millis +ScheduledTime,scheduled_time +ScheduledTimeAfter,scheduled_time_after +ScheduledTimeBefore,scheduled_time_before +ScheduledTimestamp,scheduled_timestamp +ScheduledTriggerProperties,scheduled_trigger_properties +ScheduledUpdateGroupAction,scheduled_update_group_action +ScheduledUpdateGroupActionRequest,scheduled_update_group_action_request +ScheduledUpdateGroupActions,scheduled_update_group_actions +ScheduledWindowExecution,scheduled_window_execution +ScheduledWindowExecutions,scheduled_window_executions +SchedulerLogs,scheduler_logs +SchedulerNotRunningException,scheduler_not_running_exception +SchedulerRunningException,scheduler_running_exception +SchedulerTransitioningException,scheduler_transitioning_exception +Schedulers,schedulers +Schedules,schedules +SchedulingBufferTime,scheduling_buffer_time +SchedulingConfig,scheduling_config +SchedulingPolicyDetail,scheduling_policy_detail +SchedulingPolicyListingDetail,scheduling_policy_listing_detail +SchedulingStrategy,scheduling_strategy +Schema,schema +SchemaAlreadyExistsException,schema_already_exists_exception +SchemaAlreadyPublishedException,schema_already_published_exception +SchemaArn,schema_arn +SchemaArns,schema_arns +SchemaAttribute,schema_attribute +SchemaAttributeType,schema_attribute_type +SchemaAttributes,schema_attributes +SchemaChangePolicy,schema_change_policy +SchemaCheckpoint,schema_checkpoint +SchemaColumn,schema_column +SchemaConfiguration,schema_configuration +SchemaConversionApplicationAttributes,schema_conversion_application_attributes +SchemaConversionRequest,schema_conversion_request +SchemaDefinition,schema_definition +SchemaDeleteOption,schema_delete_option +SchemaDiffType,schema_diff_type +SchemaError,schema_error +SchemaExtensionId,schema_extension_id +SchemaExtensionInfo,schema_extension_info +SchemaExtensionStatus,schema_extension_status +SchemaExtensionStatusReason,schema_extension_status_reason +SchemaExtensionsInfo,schema_extensions_info +SchemaFacet,schema_facet +SchemaFacets,schema_facets +SchemaHandlerPackage,schema_handler_package +SchemaId,schema_id +SchemaInputAttribute,schema_input_attribute +SchemaListItem,schema_list_item +SchemaMappingSummary,schema_mapping_summary +SchemaName,schema_name +SchemaNamePrefix,schema_name_prefix +SchemaPattern,schema_pattern +SchemaReference,schema_reference +SchemaResponse,schema_response +SchemaS3Location,schema_s3_location +SchemaShortInfoResponse,schema_short_info_response +SchemaStatus,schema_status +SchemaSummary,schema_summary +SchemaUnion,schema_union +SchemaVersion,schema_version +SchemaVersionErrorItem,schema_version_error_item +SchemaVersionErrors,schema_version_errors +SchemaVersionId,schema_version_id +SchemaVersionListItem,schema_version_list_item +SchemaVersionNumber,schema_version_number +SchemaVersionStatus,schema_version_status +SchemaVersionSummary,schema_version_summary +SchemaVersions,schema_versions +Schemas,schemas +Scheme,scheme +Scope,scope +ScopeConfiguration,scope_configuration +ScopeCount,scope_count +ScopeDescription,scope_description +ScopeDoesNotExistException,scope_does_not_exist_exception +ScopeDownStatement,scope_down_statement +ScopeName,scope_name +Scopes,scopes +Scoping,scoping +Score,score +ScoreAttributes,score_attributes +ScoreConfidence,score_confidence +ScoreDetails,score_details +ScoreThreshold,score_threshold +ScoreThresholdLastUpdatedAt,score_threshold_last_updated_at +Scores,scores +ScoringStrategy,scoring_strategy +ScpActionDefinition,scp_action_definition +Scram,scram +ScreenCanvasSizeOptions,screen_canvas_size_options +ScreenDataUrl,screen_data_url +ScreenSharingUrl,screen_sharing_url +ScreenViewingUrl,screen_viewing_url +ScreenshotName,screenshot_name +Script,script +ScriptArn,script_arn +ScriptBatchJobDefinition,script_batch_job_definition +ScriptBatchJobIdentifier,script_batch_job_identifier +ScriptBootstrapAction,script_bootstrap_action +ScriptBootstrapActionConfig,script_bootstrap_action_config +ScriptDetails,script_details +ScriptId,script_id +ScriptLocation,script_location +ScriptModeConfig,script_mode_config +ScriptParameterKeyValue,script_parameter_key_value +ScriptPath,script_path +ScriptS3Location,script_s3_location +Scripts,scripts +ScrollBarOptions,scroll_bar_options +ScrollStatus,scroll_status +ScrollbarOptions,scrollbar_options +Scte,scte +Scte20Detection,scte20_detection +Scte20PlusEmbeddedDestinationSettings,scte20_plus_embedded_destination_settings +Scte20SourceSettings,scte20_source_settings +Scte27DestinationSettings,scte27_destination_settings +Scte27Pids,scte27_pids +Scte27SourceSettings,scte27_source_settings +Scte35Behavior,scte35_behavior +Scte35Control,scte35_control +Scte35DeliveryRestrictions,scte35_delivery_restrictions +Scte35Descriptor,scte35_descriptor +Scte35DescriptorSettings,scte35_descriptor_settings +Scte35Descriptors,scte35_descriptors +Scte35Esam,scte35_esam +Scte35EsamPid,scte35_esam_pid +Scte35InputScheduleActionSettings,scte35_input_schedule_action_settings +Scte35InputSettings,scte35_input_settings +Scte35Pid,scte35_pid +Scte35PrerollPullupMilliseconds,scte35_preroll_pullup_milliseconds +Scte35ReturnToNetworkScheduleActionSettings,scte35_return_to_network_schedule_action_settings +Scte35ReturnToNetworkSettings,scte35_return_to_network_settings +Scte35SegmentationDescriptor,scte35_segmentation_descriptor +Scte35Source,scte35_source +Scte35SpliceInsert,scte35_splice_insert +Scte35SpliceInsertScheduleActionSettings,scte35_splice_insert_schedule_action_settings +Scte35SpliceInsertSettings,scte35_splice_insert_settings +Scte35TimeSignalApos,scte35_time_signal_apos +Scte35TimeSignalScheduleActionSettings,scte35_time_signal_schedule_action_settings +Scte35TimeSignalSettings,scte35_time_signal_settings +ScteFilter,scte_filter +ScteHls,scte_hls +ScteMarkersSource,scte_markers_source +SdkConfigurationProperty,sdk_configuration_property +SdkName,sdk_name +SdkResponse,sdk_response +SdkType,sdk_type +SdkTypes,sdk_types +SdrReferenceWhiteLevel,sdr_reference_white_level +SdtInterval,sdt_interval +Search,search +SearchAddressBooksRequest,search_address_books_request +SearchAddressBooksResponse,search_address_books_response +SearchAnalysesRequest,search_analyses_request +SearchAnalysesResponse,search_analyses_response +SearchAssociatedTranscriptsRequest,search_associated_transcripts_request +SearchAssociatedTranscriptsResponse,search_associated_transcripts_response +SearchAvailablePhoneNumbersRequest,search_available_phone_numbers_request +SearchAvailablePhoneNumbersResponse,search_available_phone_numbers_response +SearchCasesRequest,search_cases_request +SearchCasesResponse,search_cases_response +SearchCasesResponseItem,search_cases_response_item +SearchChannelsRequest,search_channels_request +SearchChannelsResponse,search_channels_response +SearchCollectionTypes,search_collection_types +SearchContactsRequest,search_contacts_request +SearchContactsResponse,search_contacts_response +SearchContentRequest,search_content_request +SearchContentResponse,search_content_response +SearchCriteria,search_criteria +SearchDashboardsRequest,search_dashboards_request +SearchDashboardsResponse,search_dashboards_response +SearchDataSetsRequest,search_data_sets_request +SearchDataSetsResponse,search_data_sets_response +SearchDataSourcesRequest,search_data_sources_request +SearchDataSourcesResponse,search_data_sources_response +SearchDatabasesByLFTagsRequest,search_databases_by_lf_tags_request +SearchDatabasesByLFTagsResponse,search_databases_by_lf_tags_response +SearchDevicesFilter,search_devices_filter +SearchDevicesRequest,search_devices_request +SearchDevicesResponse,search_devices_response +SearchEnabled,search_enabled +SearchEntitiesRequest,search_entities_request +SearchEntitiesResponse,search_entities_response +SearchException,search_exception +SearchExpression,search_expression +SearchFacesByImageRequest,search_faces_by_image_request +SearchFacesByImageResponse,search_faces_by_image_response +SearchFacesRequest,search_faces_request +SearchFacesResponse,search_faces_response +SearchField,search_field +SearchFilter,search_filter +SearchFlowExecutionsRequest,search_flow_executions_request +SearchFlowExecutionsResponse,search_flow_executions_response +SearchFlowTemplatesRequest,search_flow_templates_request +SearchFlowTemplatesResponse,search_flow_templates_response +SearchFoldersRequest,search_folders_request +SearchFoldersResponse,search_folders_response +SearchForPositionResult,search_for_position_result +SearchForSuggestionsResult,search_for_suggestions_result +SearchForTextResult,search_for_text_result +SearchGameSessionsInput,search_game_sessions_input +SearchGameSessionsOutput,search_game_sessions_output +SearchGroupsRequest,search_groups_request +SearchGroupsResponse,search_groups_response +SearchHoursOfOperationsRequest,search_hours_of_operations_request +SearchHoursOfOperationsResponse,search_hours_of_operations_response +SearchImageSetsRequest,search_image_sets_request +SearchImageSetsResponse,search_image_sets_response +SearchIndexRequest,search_index_request +SearchIndexResponse,search_index_response +SearchInput,search_input +SearchInsightsFilters,search_insights_filters +SearchInsightsRequest,search_insights_request +SearchInsightsResponse,search_insights_response +SearchInstanceCount,search_instance_count +SearchInstanceType,search_instance_type +SearchJobsFilter,search_jobs_filter +SearchJobsRequest,search_jobs_request +SearchJobsResponse,search_jobs_response +SearchKey,search_key +SearchLocalGatewayRoutesRequest,search_local_gateway_routes_request +SearchLocalGatewayRoutesResult,search_local_gateway_routes_result +SearchNetworkProfilesRequest,search_network_profiles_request +SearchNetworkProfilesResponse,search_network_profiles_response +SearchOptions,search_options +SearchOrganizationInsightsFilters,search_organization_insights_filters +SearchOrganizationInsightsRequest,search_organization_insights_request +SearchOrganizationInsightsResponse,search_organization_insights_response +SearchOutput,search_output +SearchPartitionCount,search_partition_count +SearchPlaceIndexForPositionRequest,search_place_index_for_position_request +SearchPlaceIndexForPositionResponse,search_place_index_for_position_response +SearchPlaceIndexForPositionSummary,search_place_index_for_position_summary +SearchPlaceIndexForSuggestionsRequest,search_place_index_for_suggestions_request +SearchPlaceIndexForSuggestionsResponse,search_place_index_for_suggestions_response +SearchPlaceIndexForSuggestionsSummary,search_place_index_for_suggestions_summary +SearchPlaceIndexForTextRequest,search_place_index_for_text_request +SearchPlaceIndexForTextResponse,search_place_index_for_text_response +SearchPlaceIndexForTextSummary,search_place_index_for_text_summary +SearchPrincipalType,search_principal_type +SearchProductsAsAdminInput,search_products_as_admin_input +SearchProductsAsAdminOutput,search_products_as_admin_output +SearchProductsInput,search_products_input +SearchProductsOutput,search_products_output +SearchProfilesRequest,search_profiles_request +SearchProfilesResponse,search_profiles_response +SearchPromptsRequest,search_prompts_request +SearchPromptsResponse,search_prompts_response +SearchProvisionedProductsInput,search_provisioned_products_input +SearchProvisionedProductsOutput,search_provisioned_products_output +SearchQuantumTasksFilter,search_quantum_tasks_filter +SearchQuantumTasksRequest,search_quantum_tasks_request +SearchQuantumTasksResponse,search_quantum_tasks_response +SearchQuery,search_query +SearchQueuesRequest,search_queues_request +SearchQueuesResponse,search_queues_response +SearchQuickConnectsRequest,search_quick_connects_request +SearchQuickConnectsResponse,search_quick_connects_response +SearchRasterDataCollectionInput,search_raster_data_collection_input +SearchRasterDataCollectionOutput,search_raster_data_collection_output +SearchRecord,search_record +SearchRelatedItemsRequest,search_related_items_request +SearchRelatedItemsResponse,search_related_items_response +SearchRelatedItemsResponseItem,search_related_items_response_item +SearchRequest,search_request +SearchResourceTagsRequest,search_resource_tags_request +SearchResourceTagsResponse,search_resource_tags_response +SearchResourcesBucketCriteria,search_resources_bucket_criteria +SearchResourcesCriteria,search_resources_criteria +SearchResourcesCriteriaBlock,search_resources_criteria_block +SearchResourcesInput,search_resources_input +SearchResourcesOutput,search_resources_output +SearchResourcesRequest,search_resources_request +SearchResourcesResponse,search_resources_response +SearchResourcesSimpleCriterion,search_resources_simple_criterion +SearchResourcesSortCriteria,search_resources_sort_criteria +SearchResourcesTagCriterion,search_resources_tag_criterion +SearchResourcesTagCriterionPair,search_resources_tag_criterion_pair +SearchResponse,search_response +SearchRoomsRequest,search_rooms_request +SearchRoomsResponse,search_rooms_response +SearchRoutingProfilesRequest,search_routing_profiles_request +SearchRoutingProfilesResponse,search_routing_profiles_response +SearchSchemaSummary,search_schema_summary +SearchSchemaVersionSummary,search_schema_version_summary +SearchSchemasRequest,search_schemas_request +SearchSchemasResponse,search_schemas_response +SearchSecurityProfilesRequest,search_security_profiles_request +SearchSecurityProfilesResponse,search_security_profiles_response +SearchService,search_service +SearchSessionsRequest,search_sessions_request +SearchSessionsResponse,search_sessions_response +SearchSkillGroupsRequest,search_skill_groups_request +SearchSkillGroupsResponse,search_skill_groups_response +SearchSlowLogs,search_slow_logs +SearchSortResult,search_sort_result +SearchStatus,search_status +SearchString,search_string +SearchSystemInstancesRequest,search_system_instances_request +SearchSystemInstancesResponse,search_system_instances_response +SearchSystemTemplatesRequest,search_system_templates_request +SearchSystemTemplatesResponse,search_system_templates_response +SearchTablesByLFTagsRequest,search_tables_by_lf_tags_request +SearchTablesByLFTagsResponse,search_tables_by_lf_tags_response +SearchTablesRequest,search_tables_request +SearchTablesResponse,search_tables_response +SearchText,search_text +SearchThingsRequest,search_things_request +SearchThingsResponse,search_things_response +SearchTransitGatewayMulticastGroupsRequest,search_transit_gateway_multicast_groups_request +SearchTransitGatewayMulticastGroupsResult,search_transit_gateway_multicast_groups_result +SearchTransitGatewayRoutesRequest,search_transit_gateway_routes_request +SearchTransitGatewayRoutesResult,search_transit_gateway_routes_result +SearchUsersByImageRequest,search_users_by_image_request +SearchUsersByImageResponse,search_users_by_image_response +SearchUsersRequest,search_users_request +SearchUsersResponse,search_users_response +SearchValue,search_value +SearchVocabulariesRequest,search_vocabularies_request +SearchVocabulariesResponse,search_vocabularies_response +SearchVulnerabilitiesFilterCriteria,search_vulnerabilities_filter_criteria +SearchVulnerabilitiesRequest,search_vulnerabilities_request +SearchVulnerabilitiesResponse,search_vulnerabilities_response +Searchable,searchable +SearchedFace,searched_face +SearchedFaceBoundingBox,searched_face_bounding_box +SearchedFaceConfidence,searched_face_confidence +SearchedFaceDetails,searched_face_details +SearchedFaceId,searched_face_id +SearchedLogStream,searched_log_stream +SearchedUser,searched_user +Seasonality,seasonality +SecondBlockToken,second_block_token +SecondSchemaVersionNumber,second_schema_version_number +SecondSnapshotId,second_snapshot_id +Secondary,secondary +SecondaryAllocationIds,secondary_allocation_ids +SecondaryArtifacts,secondary_artifacts +SecondaryAvailabilityZone,secondary_availability_zone +SecondaryBackground,secondary_background +SecondaryBtn,secondary_btn +SecondaryEmail,secondary_email +SecondaryForeground,secondary_foreground +SecondaryGids,secondary_gids +SecondaryInputId,secondary_input_id +SecondaryPrivateIpAddressCount,secondary_private_ip_address_count +SecondaryPrivateIpAddresses,secondary_private_ip_addresses +SecondaryStatus,secondary_status +SecondaryStatusTransition,secondary_status_transition +SecondaryStatusTransitions,secondary_status_transitions +SecondaryValue,secondary_value +SecondaryValueFontConfiguration,secondary_value_font_configuration +SecondaryValueOptions,secondary_value_options +SecondaryYAxisDisplayOptions,secondary_y_axis_display_options +SecondaryYAxisLabelOptions,secondary_y_axis_label_options +SecondsBeforeTimeout,seconds_before_timeout +SecondsUntilAutoPause,seconds_until_auto_pause +Secret,secret +SecretAccessKey,secret_access_key +SecretArn,secret_arn +SecretArnList,secret_arn_list +SecretBinary,secret_binary +SecretCode,secret_code +SecretHash,secret_hash +SecretId,secret_id +SecretKey,secret_key +SecretList,secret_list +SecretListEntry,secret_list_entry +SecretManagerArn,secret_manager_arn +SecretOptions,secret_options +SecretStatus,secret_status +SecretString,secret_string +SecretStringKey,secret_string_key +SecretToAuthenticateInitiator,secret_to_authenticate_initiator +SecretToAuthenticateTarget,secret_to_authenticate_target +SecretToken,secret_token +SecretVersionsListEntry,secret_versions_list_entry +SecretVersionsToStages,secret_versions_to_stages +Secrets,secrets +SecretsManagerAccessRoleArn,secrets_manager_access_role_arn +SecretsManagerAccessTokenConfiguration,secrets_manager_access_token_configuration +SecretsManagerArn,secrets_manager_arn +SecretsManagerOracleAsmAccessRoleArn,secrets_manager_oracle_asm_access_role_arn +SecretsManagerOracleAsmSecretId,secrets_manager_oracle_asm_secret_id +SecretsManagerSecretConfiguration,secrets_manager_secret_configuration +SecretsManagerSecretId,secrets_manager_secret_id +SecretsManagerSecretResourceData,secrets_manager_secret_resource_data +SecretsManagerSecurityDbEncryptionAccessRoleArn,secrets_manager_security_db_encryption_access_role_arn +SecretsManagerSecurityDbEncryptionSecretId,secrets_manager_security_db_encryption_secret_id +SecretsRoleArn,secrets_role_arn +Section,section +SectionAfterPageBreak,section_after_page_break +SectionBased,section_based +SectionBasedLayout,section_based_layout +SectionBasedLayoutCanvasSizeOptions,section_based_layout_canvas_size_options +SectionBasedLayoutConfiguration,section_based_layout_configuration +SectionBasedLayoutPaperCanvasSizeOptions,section_based_layout_paper_canvas_size_options +SectionId,section_id +SectionLayoutConfiguration,section_layout_configuration +SectionModification,section_modification +SectionPageBreakConfiguration,section_page_break_configuration +SectionStyle,section_style +SectionalElement,sectional_element +Sections,sections +Secure,secure +SecurityConfig,security_config +SecurityConfigDetail,security_config_detail +SecurityConfigStats,security_config_stats +SecurityConfigSummary,security_config_summary +SecurityConfiguration,security_configuration +SecurityConfigurationSummary,security_configuration_summary +SecurityConfigurations,security_configurations +SecurityContext,security_context +SecurityControl,security_control +SecurityControlArn,security_control_arn +SecurityControlDefinition,security_control_definition +SecurityControlDefinitions,security_control_definitions +SecurityControlId,security_control_id +SecurityControlIds,security_control_ids +SecurityControlStatus,security_control_status +SecurityControls,security_controls +SecurityDbEncryption,security_db_encryption +SecurityDbEncryptionName,security_db_encryption_name +SecurityDescriptorCopyFlags,security_descriptor_copy_flags +SecurityDetails,security_details +SecurityGroup,security_group +SecurityGroupArns,security_group_arns +SecurityGroupId,security_group_id +SecurityGroupIdForDomainBoundary,security_group_id_for_domain_boundary +SecurityGroupIdList,security_group_id_list +SecurityGroupIdSet,security_group_id_set +SecurityGroupIdUpdates,security_group_id_updates +SecurityGroupIdentifier,security_group_identifier +SecurityGroupIds,security_group_ids +SecurityGroupLimitExceeded,security_group_limit_exceeded +SecurityGroupMembership,security_group_membership +SecurityGroupNotFound,security_group_not_found +SecurityGroupReference,security_group_reference +SecurityGroupReferenceSet,security_group_reference_set +SecurityGroupRemediationAction,security_group_remediation_action +SecurityGroupRule,security_group_rule +SecurityGroupRuleDescription,security_group_rule_description +SecurityGroupRuleDescriptions,security_group_rule_descriptions +SecurityGroupRuleId,security_group_rule_id +SecurityGroupRuleIds,security_group_rule_ids +SecurityGroupRuleRequest,security_group_rule_request +SecurityGroupRuleUpdate,security_group_rule_update +SecurityGroupRules,security_group_rules +SecurityGroupSet,security_group_set +SecurityGroups,security_groups +SecurityHeadersConfig,security_headers_config +SecurityHubConfiguration,security_hub_configuration +SecurityKey,security_key +SecurityKeys,security_keys +SecurityNonCompliantCount,security_non_compliant_count +SecurityPolicy,security_policy +SecurityPolicyDetail,security_policy_detail +SecurityPolicyName,security_policy_name +SecurityPolicyNames,security_policy_names +SecurityPolicyStats,security_policy_stats +SecurityPolicySummary,security_policy_summary +SecurityProfile,security_profile +SecurityProfileArn,security_profile_arn +SecurityProfileId,security_profile_id +SecurityProfileIdentifier,security_profile_identifier +SecurityProfileIds,security_profile_ids +SecurityProfileName,security_profile_name +SecurityProfileSearchCriteria,security_profile_search_criteria +SecurityProfileSearchSummary,security_profile_search_summary +SecurityProfileSummary,security_profile_summary +SecurityProfileSummaryList,security_profile_summary_list +SecurityProfileTarget,security_profile_target +SecurityProfileTargetMapping,security_profile_target_mapping +SecurityProfiles,security_profiles +SecurityProfilesSearchFilter,security_profiles_search_filter +SecurityProtocol,security_protocol +SecurityServicePolicyData,security_service_policy_data +SecurityServiceType,security_service_type +SecurityStyle,security_style +SecurityToken,security_token +SecurityType,security_type +Seed,seed +SeedUrlConfiguration,seed_url_configuration +SeedUrls,seed_urls +Segment,segment +SegmentBehaviors,segment_behaviors +SegmentCondition,segment_condition +SegmentControl,segment_control +SegmentDeliveryConfiguration,segment_delivery_configuration +SegmentDeliveryConfigurations,segment_delivery_configurations +SegmentDemographics,segment_demographics +SegmentDetection,segment_detection +SegmentDimensions,segment_dimensions +SegmentDuration,segment_duration +SegmentDurationSeconds,segment_duration_seconds +SegmentGroup,segment_group +SegmentGroupList,segment_group_list +SegmentGroups,segment_groups +SegmentId,segment_id +SegmentImportResource,segment_import_resource +SegmentLength,segment_length +SegmentLengthControl,segment_length_control +SegmentLocation,segment_location +SegmentModifier,segment_modifier +SegmentName,segment_name +SegmentNum,segment_num +SegmentNumber,segment_number +SegmentOverride,segment_override +SegmentPrefix,segment_prefix +SegmentReference,segment_reference +SegmentResponse,segment_response +SegmentStartCondition,segment_start_condition +SegmentTemplateFormat,segment_template_format +SegmentType,segment_type +SegmentTypeInfo,segment_type_info +SegmentTypes,segment_types +SegmentVersion,segment_version +SegmentationCancelIndicator,segmentation_cancel_indicator +SegmentationDescriptor,segmentation_descriptor +SegmentationDescriptorScte35DescriptorSettings,segmentation_descriptor_scte35_descriptor_settings +SegmentationDescriptors,segmentation_descriptors +SegmentationDuration,segmentation_duration +SegmentationEventId,segmentation_event_id +SegmentationMarkers,segmentation_markers +SegmentationMode,segmentation_mode +SegmentationStyle,segmentation_style +SegmentationTime,segmentation_time +SegmentationTypeId,segmentation_type_id +SegmentationUpid,segmentation_upid +SegmentationUpidType,segmentation_upid_type +Segments,segments +SegmentsExpected,segments_expected +SegmentsPerSubdirectory,segments_per_subdirectory +SegmentsReceivedCount,segments_received_count +SegmentsRejectedCount,segments_rejected_count +SegmentsResponse,segments_response +SegmentsSentCount,segments_sent_count +SegmentsSpilloverCount,segments_spillover_count +Select,select +SelectAggregateResourceConfigRequest,select_aggregate_resource_config_request +SelectAggregateResourceConfigResponse,select_aggregate_resource_config_response +SelectAllOptions,select_all_options +SelectAllValueOptions,select_all_value_options +SelectAttributesActivity,select_attributes_activity +SelectColumn,select_column +SelectFields,select_fields +SelectFromCollection,select_from_collection +SelectObjectContentOutput,select_object_content_output +SelectObjectContentRequest,select_object_content_request +SelectParameters,select_parameters +SelectResourceConfigRequest,select_resource_config_request +SelectResourceConfigResponse,select_resource_config_response +SelectSqlQuery,select_sql_query +SelectableValues,selectable_values +SelectedBinType,selected_bin_type +SelectedBorderStyle,selected_border_style +SelectedChoiceIds,selected_choice_ids +SelectedChoices,selected_choices +SelectedColumns,selected_columns +SelectedEngineVersion,selected_engine_version +SelectedFieldOptions,selected_field_options +SelectedFields,selected_fields +SelectedFieldsConfiguration,selected_fields_configuration +SelectedOutputs,selected_outputs +SelectedPointStyle,selected_point_style +SelectedSegmentTypes,selected_segment_types +SelectedSheets,selected_sheets +SelectedSheetsFilterScopeConfiguration,selected_sheets_filter_scope_configuration +SelectedStep,selected_step +SelectedSteps,selected_steps +SelectedTooltipType,selected_tooltip_type +SelectedVideoStreams,selected_video_streams +SelectionCriteria,selection_criteria +SelectionId,selection_id +SelectionName,selection_name +SelectionRules,selection_rules +SelectionScope,selection_scope +SelectionStatus,selection_status +SelectiveAuth,selective_auth +SelectiveExecutionConfig,selective_execution_config +SelectiveExecutionResult,selective_execution_result +Selector,selector +SelectorSettings,selector_settings +SelectorType,selector_type +Selectors,selectors +SelfManageResources,self_manage_resources +SelfManagedActiveDirectoryAttributes,self_managed_active_directory_attributes +SelfManagedActiveDirectoryConfiguration,self_managed_active_directory_configuration +SelfManagedActiveDirectoryConfigurationUpdates,self_managed_active_directory_configuration_updates +SelfManagedEventSource,self_managed_event_source +SelfManagedKafkaAccessConfigurationVpc,self_managed_kafka_access_configuration_vpc +SelfManagedKafkaEventSourceConfig,self_managed_kafka_event_source_config +SelfManagedKafkaParameters,self_managed_kafka_parameters +SelfManagedOptOutsEnabled,self_managed_opt_outs_enabled +SelfServicePortal,self_service_portal +SelfServicePortalUrl,self_service_portal_url +SelfServiceSAMLProviderArn,self_service_saml_provider_arn +SelfServiceSamlProviderArn,self_service_saml_provider_arn +SelfUserProfile,self_user_profile +SelfservicePermissions,selfservice_permissions +SellerName,seller_name +SemanticEntityType,semantic_entity_type +SemanticType,semantic_type +SemanticVersion,semantic_version +SemtechGnss,semtech_gnss +SemtechGnssConfiguration,semtech_gnss_configuration +SemtechGnssDetail,semtech_gnss_detail +SendActivationCodeRequest,send_activation_code_request +SendAlexaOfferToMasterRequest,send_alexa_offer_to_master_request +SendAlexaOfferToMasterResponse,send_alexa_offer_to_master_response +SendAnnouncementRequest,send_announcement_request +SendAnnouncementResponse,send_announcement_response +SendApiAssetRequest,send_api_asset_request +SendApiAssetResponse,send_api_asset_response +SendAutomationSignalRequest,send_automation_signal_request +SendBonusRequest,send_bonus_request +SendBounceRequest,send_bounce_request +SendBounceResponse,send_bounce_response +SendBulkEmailRequest,send_bulk_email_request +SendBulkEmailResponse,send_bulk_email_response +SendBulkTemplatedEmailRequest,send_bulk_templated_email_request +SendBulkTemplatedEmailResponse,send_bulk_templated_email_response +SendChannelMessageRequest,send_channel_message_request +SendChannelMessageResponse,send_channel_message_response +SendCommandRequest,send_command_request +SendCommandResult,send_command_result +SendContactMethodVerificationRequest,send_contact_method_verification_request +SendContactMethodVerificationResult,send_contact_method_verification_result +SendCustomVerificationEmailRequest,send_custom_verification_email_request +SendCustomVerificationEmailResponse,send_custom_verification_email_response +SendDataPoint,send_data_point +SendDataPoints,send_data_points +SendDataToMulticastGroupRequest,send_data_to_multicast_group_request +SendDataToMulticastGroupResponse,send_data_to_multicast_group_response +SendDataToWirelessDeviceRequest,send_data_to_wireless_device_request +SendDataToWirelessDeviceResponse,send_data_to_wireless_device_response +SendDelayMs,send_delay_ms +SendDiagnosticInterruptRequest,send_diagnostic_interrupt_request +SendEmail,send_email +SendEmailNotification,send_email_notification +SendEmailRequest,send_email_request +SendEmailResponse,send_email_response +SendEventRequest,send_event_request +SendEventResponse,send_event_response +SendFilePaths,send_file_paths +SendHeartbeatRequest,send_heartbeat_request +SendInvitationRequest,send_invitation_request +SendMessageBatchRequest,send_message_batch_request +SendMessageBatchRequestEntry,send_message_batch_request_entry +SendMessageBatchResult,send_message_batch_result +SendMessageBatchResultEntry,send_message_batch_result_entry +SendMessageRequest,send_message_request +SendMessageResponse,send_message_response +SendMessageResult,send_message_result +SendMessagesRequest,send_messages_request +SendMessagesResponse,send_messages_response +SendNotification,send_notification +SendNotificationAction,send_notification_action +SendNotificationActionDefinition,send_notification_action_definition +SendOTPMessageRequest,send_otp_message_request +SendOTPMessageRequestParameters,send_otp_message_request_parameters +SendOTPMessageResponse,send_otp_message_response +SendPipelineExecutionStepFailureRequest,send_pipeline_execution_step_failure_request +SendPipelineExecutionStepFailureResponse,send_pipeline_execution_step_failure_response +SendPipelineExecutionStepSuccessRequest,send_pipeline_execution_step_success_request +SendPipelineExecutionStepSuccessResponse,send_pipeline_execution_step_success_response +SendProjectSessionActionRequest,send_project_session_action_request +SendProjectSessionActionResponse,send_project_session_action_response +SendQuota,send_quota +SendRawEmailRequest,send_raw_email_request +SendRawEmailResponse,send_raw_email_response +SendSSHPublicKeyRequest,send_ssh_public_key_request +SendSSHPublicKeyResponse,send_ssh_public_key_response +SendSerialConsoleSSHPublicKeyRequest,send_serial_console_ssh_public_key_request +SendSerialConsoleSSHPublicKeyResponse,send_serial_console_ssh_public_key_response +SendTaskFailureInput,send_task_failure_input +SendTaskHeartbeatInput,send_task_heartbeat_input +SendTaskSuccessInput,send_task_success_input +SendTemplatedEmailRequest,send_templated_email_request +SendTemplatedEmailResponse,send_templated_email_response +SendTestEventNotificationRequest,send_test_event_notification_request +SendTextMessageRequest,send_text_message_request +SendTextMessageResult,send_text_message_result +SendUsersMessageRequest,send_users_message_request +SendUsersMessageResponse,send_users_message_response +SendUsersMessagesRequest,send_users_messages_request +SendUsersMessagesResponse,send_users_messages_response +SendVoiceMessageRequest,send_voice_message_request +SendVoiceMessageResponse,send_voice_message_response +SendVoiceMessageResult,send_voice_message_result +SendWorkflowStepStateRequest,send_workflow_step_state_request +Sender,sender +SenderClientId,sender_client_id +SenderControlPort,sender_control_port +SenderFault,sender_fault +SenderId,sender_id +SenderIdAndCountry,sender_id_and_country +SenderIdArn,sender_id_arn +SenderIdFilter,sender_id_filter +SenderIdInformation,sender_id_information +SenderIds,sender_ids +SenderIpAddress,sender_ip_address +SendingEnabled,sending_enabled +SendingIps,sending_ips +SendingOptions,sending_options +SendingPausedException,sending_paused_exception +SendingPoolName,sending_pool_name +SendingSchedule,sending_schedule +Sensitive,sensitive +SensitiveData,sensitive_data +SensitiveDataDetections,sensitive_data_detections +SensitiveDataItem,sensitive_data_item +SensitiveDataResult,sensitive_data_result +SensitivityAggregations,sensitivity_aggregations +SensitivityInspectionTemplateExcludes,sensitivity_inspection_template_excludes +SensitivityInspectionTemplateIncludes,sensitivity_inspection_template_includes +SensitivityInspectionTemplatesEntry,sensitivity_inspection_templates_entry +SensitivityLevel,sensitivity_level +SensitivityThreshold,sensitivity_threshold +Sensor,sensor +SensorName,sensor_name +SensorStatisticsSummaries,sensor_statistics_summaries +SensorStatisticsSummary,sensor_statistics_summary +SensorsWithShortDateRange,sensors_with_short_date_range +SentLast24Hours,sent_last24_hours +SentTime,sent_time +Sentiment,sentiment +SentimentAnalysisSettings,sentiment_analysis_settings +SentimentConfiguration,sentiment_configuration +SentimentDetectionJobFilter,sentiment_detection_job_filter +SentimentDetectionJobProperties,sentiment_detection_job_properties +SentimentDetectionJobPropertiesList,sentiment_detection_job_properties_list +SentimentFilter,sentiment_filter +SentimentResponse,sentiment_response +SentimentScore,sentiment_score +SentimentType,sentiment_type +Sentiments,sentiments +Separator,separator +SeparatorConfiguration,separator_configuration +Seq,seq +Sequence,sequence +SequenceInformation,sequence_information +SequenceNumber,sequence_number +SequenceNumberForOrdering,sequence_number_for_ordering +SequenceNumberRange,sequence_number_range +SequenceStoreDetail,sequence_store_detail +SequenceStoreFilter,sequence_store_filter +SerDeInfo,ser_de_info +Serde,serde +SerdeInfo,serde_info +Serial,serial +SerialConsoleAccessDisabledException,serial_console_access_disabled_exception +SerialConsoleAccessEnabled,serial_console_access_enabled +SerialConsoleSessionLimitExceededException,serial_console_session_limit_exceeded_exception +SerialConsoleSessionUnavailableException,serial_console_session_unavailable_exception +SerialNumber,serial_number +SerialPort,serial_port +SerializationLibrary,serialization_library +Serializer,serializer +Series,series +SeriesItem,series_item +ServeSignature,serve_signature +Server,server +ServerArn,server_arn +ServerCannotBeReplicatedException,server_cannot_be_replicated_exception +ServerCertLastUpdated,server_cert_last_updated +ServerCertUri,server_cert_uri +ServerCertificate,server_certificate +ServerCertificateArn,server_certificate_arn +ServerCertificateConfiguration,server_certificate_configuration +ServerCertificateConfigurations,server_certificate_configurations +ServerCertificateId,server_certificate_id +ServerCertificateMetadata,server_certificate_metadata +ServerCertificateMetadataList,server_certificate_metadata_list +ServerCertificateName,server_certificate_name +ServerCertificateScope,server_certificate_scope +ServerCertificateSummary,server_certificate_summary +ServerCertificates,server_certificates +ServerConfiguration,server_configuration +ServerDetail,server_detail +ServerEndpoint,server_endpoint +ServerError,server_error +ServerEvent,server_event +ServerEvents,server_events +ServerException,server_exception +ServerGroup,server_group +ServerGroupLaunchConfiguration,server_group_launch_configuration +ServerGroupReplicationConfiguration,server_group_replication_configuration +ServerGroupValidationConfiguration,server_group_validation_configuration +ServerHostname,server_hostname +ServerId,server_id +ServerInternalErrorException,server_internal_error_exception +ServerInternalException,server_internal_exception +ServerLaunchConfiguration,server_launch_configuration +ServerLaunchParameters,server_launch_parameters +ServerLaunchPath,server_launch_path +ServerName,server_name +ServerNameToVerify,server_name_to_verify +ServerOsType,server_os_type +ServerPath,server_path +ServerPort,server_port +ServerProcess,server_process +ServerProcesses,server_processes +ServerProperties,server_properties +ServerProtocol,server_protocol +ServerPublicKey,server_public_key +ServerReplicationConfiguration,server_replication_configuration +ServerReplicationParameters,server_replication_parameters +ServerRootCaCertificate,server_root_ca_certificate +ServerSdkVersion,server_sdk_version +ServerShortInfoResponse,server_short_info_response +ServerShutdownException,server_shutdown_exception +ServerSideEncryption,server_side_encryption +ServerSideEncryptionByDefault,server_side_encryption_by_default +ServerSideEncryptionConfiguration,server_side_encryption_configuration +ServerSideEncryptionKmsKeyId,server_side_encryption_kms_key_id +ServerSideEncryptionRule,server_side_encryption_rule +ServerSideEncryptionUpdateDetails,server_side_encryption_update_details +ServerSideKmsKeyId,server_side_kms_key_id +ServerSideTokenCheck,server_side_token_check +ServerStatusSummary,server_status_summary +ServerStrategy,server_strategy +ServerSummary,server_summary +ServerTimestamp,server_timestamp +ServerTimezone,server_timezone +ServerTimingHeadersConfig,server_timing_headers_config +ServerTrust,server_trust +ServerTunnelAddress,server_tunnel_address +ServerUrl,server_url +ServerValidation,server_validation +ServerValidationConfiguration,server_validation_configuration +ServerValidationOutput,server_validation_output +Serverless,serverless +ServerlessClientAuthentication,serverless_client_authentication +ServerlessConfig,serverless_config +ServerlessRequest,serverless_request +ServerlessSasl,serverless_sasl +ServerlessUpdateConfig,serverless_update_config +ServerlessV2ScalingConfiguration,serverless_v2_scaling_configuration +ServerlessV2ScalingConfigurationInfo,serverless_v2_scaling_configuration_info +Servers,servers +Service,service +ServiceAccessRoleArn,service_access_role_arn +ServiceAccessSecurityGroup,service_access_security_group +ServiceAccountCredentials,service_account_credentials +ServiceAccountException,service_account_exception +ServiceAccountPassword,service_account_password +ServiceAccountUsername,service_account_username +ServiceActionAssociation,service_action_association +ServiceActionAssociations,service_action_associations +ServiceActionDetail,service_action_detail +ServiceActionId,service_action_id +ServiceActionParameters,service_action_parameters +ServiceActionSummaries,service_action_summaries +ServiceActionSummary,service_action_summary +ServiceAdditionalInfo,service_additional_info +ServiceAlreadyExists,service_already_exists +ServiceArn,service_arn +ServiceArnList,service_arn_list +ServiceCatalogConfiguration,service_catalog_configuration +ServiceCatalogProvisionedProductDetails,service_catalog_provisioned_product_details +ServiceCatalogProvisioningDetails,service_catalog_provisioning_details +ServiceCatalogProvisioningUpdateDetails,service_catalog_provisioning_update_details +ServiceChange,service_change +ServiceCode,service_code +ServiceCollection,service_collection +ServiceConfiguration,service_configuration +ServiceConfigurations,service_configurations +ServiceConnectClientAlias,service_connect_client_alias +ServiceConnectConfiguration,service_connect_configuration +ServiceConnectService,service_connect_service +ServiceConnectServiceResource,service_connect_service_resource +ServiceCount,service_count +ServiceDescriptor,service_descriptor +ServiceDetail,service_detail +ServiceDetails,service_details +ServiceEndpoint,service_endpoint +ServiceError,service_error +ServiceErrorId,service_error_id +ServiceErrorIds,service_error_ids +ServiceErrors,service_errors +ServiceEvent,service_event +ServiceException,service_exception +ServiceExecutionRole,service_execution_role +ServiceExecutionRoleUpdate,service_execution_role_update +ServiceFailureException,service_failure_exception +ServiceFault,service_fault +ServiceFilter,service_filter +ServiceForecastStatistics,service_forecast_statistics +ServiceGraphEndTime,service_graph_end_time +ServiceGraphStartTime,service_graph_start_time +ServiceHealth,service_health +ServiceId,service_id +ServiceIdentifier,service_identifier +ServiceIds,service_ids +ServiceInfo,service_info +ServiceInsightHealth,service_insight_health +ServiceInstance,service_instance +ServiceInstanceState,service_instance_state +ServiceInstanceSummary,service_instance_summary +ServiceIntegration,service_integration +ServiceIntegrationConfig,service_integration_config +ServiceInternalErrorException,service_internal_error_exception +ServiceInternalException,service_internal_exception +ServiceJson,service_json +ServiceLastAccessed,service_last_accessed +ServiceLimit,service_limit +ServiceLimitExceeded,service_limit_exceeded +ServiceLimitExceededException,service_limit_exceeded_exception +ServiceLinkedRoleARN,service_linked_role_arn +ServiceLinkedRoleFailure,service_linked_role_failure +ServiceLinkedRoleLockClientException,service_linked_role_lock_client_exception +ServiceLinkedRoleNotFoundFault,service_linked_role_not_found_fault +ServiceLocation,service_location +ServiceMetadata,service_metadata +ServiceName,service_name +ServiceNameAndResourceType,service_name_and_resource_type +ServiceNames,service_names +ServiceNamespace,service_namespace +ServiceNamespaces,service_namespaces +ServiceNetworkServiceAssociationSummary,service_network_service_association_summary +ServiceNetworkSummary,service_network_summary +ServiceNetworkVpcAssociationSummary,service_network_vpc_association_summary +ServiceNotActiveException,service_not_active_exception +ServiceNotFound,service_not_found +ServiceNotFoundException,service_not_found_exception +ServiceNotSupportedException,service_not_supported_exception +ServiceNow,service_now +ServiceNowBuildVersion,service_now_build_version +ServiceNowConfiguration,service_now_configuration +ServiceNowConnectorProfileCredentials,service_now_connector_profile_credentials +ServiceNowConnectorProfileProperties,service_now_connector_profile_properties +ServiceNowKnowledgeArticleConfiguration,service_now_knowledge_article_configuration +ServiceNowParameters,service_now_parameters +ServiceNowServiceCatalogConfiguration,service_now_service_catalog_configuration +ServiceNowSourceProperties,service_now_source_properties +ServiceObservabilityConfiguration,service_observability_configuration +ServicePack,service_pack +ServicePassword,service_password +ServicePermissionId,service_permission_id +ServicePipeline,service_pipeline +ServicePipelineState,service_pipeline_state +ServicePrincipal,service_principal +ServicePrincipalName,service_principal_name +ServicePrincipalNameSummary,service_principal_name_summary +ServicePrincipalNames,service_principal_names +ServiceProcessingTimeInMillis,service_processing_time_in_millis +ServiceProfile,service_profile +ServiceProfileId,service_profile_id +ServiceProfileList,service_profile_list +ServiceProviderName,service_provider_name +ServiceProviderSamlMetadata,service_provider_saml_metadata +ServiceQuota,service_quota +ServiceQuotaExceededException,service_quota_exceeded_exception +ServiceQuotaIncreaseRequestInTemplate,service_quota_increase_request_in_template +ServiceQuotaIncreaseRequestInTemplateList,service_quota_increase_request_in_template_list +ServiceQuotaTemplateAssociationStatus,service_quota_template_association_status +ServiceQuotaTemplateNotInUseException,service_quota_template_not_in_use_exception +ServiceRegistries,service_registries +ServiceRegistry,service_registry +ServiceResourceCost,service_resource_cost +ServiceRole,service_role +ServiceRoleArn,service_role_arn +ServiceSetting,service_setting +ServiceSettingNotFound,service_setting_not_found +ServiceSize,service_size +ServiceSoftwareOptions,service_software_options +ServiceSpecificCredential,service_specific_credential +ServiceSpecificCredentialId,service_specific_credential_id +ServiceSpecificCredentialMetadata,service_specific_credential_metadata +ServiceSpecificCredentials,service_specific_credentials +ServiceSpecification,service_specification +ServiceState,service_state +ServiceStatistics,service_statistics +ServiceSummary,service_summary +ServiceSummaryList,service_summary_list +ServiceSummaryStatistics,service_summary_statistics +ServiceSyncBlockerSummary,service_sync_blocker_summary +ServiceSyncConfig,service_sync_config +ServiceTemplate,service_template +ServiceTemplateSummary,service_template_summary +ServiceTemplateVersion,service_template_version +ServiceTemplateVersionSummary,service_template_version_summary +ServiceTemporarilyUnavailableException,service_temporarily_unavailable_exception +ServiceType,service_type +ServiceTypeDetail,service_type_detail +ServiceUnavailable,service_unavailable +ServiceUnavailableError,service_unavailable_error +ServiceUnavailableException,service_unavailable_exception +ServiceUpdate,service_update +ServiceUpdateDescription,service_update_description +ServiceUpdateEndDate,service_update_end_date +ServiceUpdateName,service_update_name +ServiceUpdateNameToApply,service_update_name_to_apply +ServiceUpdateNotFoundFault,service_update_not_found_fault +ServiceUpdateRecommendedApplyByDate,service_update_recommended_apply_by_date +ServiceUpdateReleaseDate,service_update_release_date +ServiceUpdateRequest,service_update_request +ServiceUpdateSeverity,service_update_severity +ServiceUpdateStatus,service_update_status +ServiceUpdateTimeRange,service_update_time_range +ServiceUpdateType,service_update_type +ServiceUpdates,service_updates +ServiceUpdatesMessage,service_updates_message +ServiceUrl,service_url +ServiceUserName,service_user_name +ServiceVersion,service_version +ServiceVersions,service_versions +Services,services +ServicesLastAccessed,services_last_accessed +Session,session +SessionAlreadyExistsException,session_already_exists_exception +SessionArn,session_arn +SessionCap,session_cap +SessionCommand,session_command +SessionConfiguration,session_configuration +SessionContext,session_context +SessionContextAttributes,session_context_attributes +SessionCookieName,session_cookie_name +SessionData,session_data +SessionDataSortBy,session_data_sort_by +SessionDuration,session_duration +SessionExpirationDurationInSeconds,session_expiration_duration_in_seconds +SessionExpiredException,session_expired_exception +SessionFilter,session_filter +SessionId,session_id +SessionIdleTimeoutInMinutes,session_idle_timeout_in_minutes +SessionInitializationEndpointPrefix,session_initialization_endpoint_prefix +SessionIntegrationConfiguration,session_integration_configuration +SessionIssuer,session_issuer +SessionKeyAmex,session_key_amex +SessionKeyDerivationAttributes,session_key_derivation_attributes +SessionKeyDerivationMode,session_key_derivation_mode +SessionKeyDerivationValue,session_key_derivation_value +SessionKeyEmv2000,session_key_emv2000 +SessionKeyEmvCommon,session_key_emv_common +SessionKeyMastercard,session_key_mastercard +SessionKeyVisa,session_key_visa +SessionKeys,session_keys +SessionKeysAbpV1_0_x,session_keys_abp_v1_0_x +SessionKeysAbpV1_1,session_keys_abp_v1_1 +SessionLifetimeInMinutes,session_lifetime_in_minutes +SessionLifetimeInMinutesInvalidException,session_lifetime_in_minutes_invalid_exception +SessionManagerOutputUrl,session_manager_output_url +SessionMapping,session_mapping +SessionMappingDetail,session_mapping_detail +SessionMappingSummary,session_mapping_summary +SessionMappings,session_mappings +SessionName,session_name +SessionNameOrId,session_name_or_id +SessionNotFoundException,session_not_found_exception +SessionNumber,session_number +SessionPinningFilters,session_pinning_filters +SessionPolicyArn,session_policy_arn +SessionSampleRate,session_sample_rate +SessionScriptS3Location,session_script_s3_location +SessionSpecification,session_specification +SessionStartTime,session_start_time +SessionState,session_state +SessionStatistics,session_statistics +SessionStatus,session_status +SessionStickinessConfig,session_stickiness_config +SessionSummary,session_summary +SessionTag,session_tag +SessionTags,session_tags +SessionTimeout,session_timeout +SessionTimeoutHours,session_timeout_hours +SessionTimeoutMinutes,session_timeout_minutes +SessionToken,session_token +Sessions,sessions +Set,set +SetActiveReceiptRuleSetRequest,set_active_receipt_rule_set_request +SetAlarmStateInput,set_alarm_state_input +SetAsDefault,set_as_default +SetCognitoEventsRequest,set_cognito_events_request +SetDataCaptureChanges,set_data_capture_changes +SetDataRetrievalPolicyInput,set_data_retrieval_policy_input +SetDefaultAuthorizerRequest,set_default_authorizer_request +SetDefaultAuthorizerResponse,set_default_authorizer_response +SetDefaultMessageTypeRequest,set_default_message_type_request +SetDefaultMessageTypeResult,set_default_message_type_result +SetDefaultPermissionVersionRequest,set_default_permission_version_request +SetDefaultPermissionVersionResponse,set_default_permission_version_response +SetDefaultPolicyVersionRequest,set_default_policy_version_request +SetDefaultSenderIdRequest,set_default_sender_id_request +SetDefaultSenderIdResult,set_default_sender_id_result +SetDesiredCapacityType,set_desired_capacity_type +SetDimension,set_dimension +SetEndpointAttributesInput,set_endpoint_attributes_input +SetFileModeEntry,set_file_mode_entry +SetGatewayBridgeSourceRequest,set_gateway_bridge_source_request +SetId,set_id +SetIdentifier,set_identifier +SetIdentityDkimEnabledRequest,set_identity_dkim_enabled_request +SetIdentityFeedbackForwardingEnabledRequest,set_identity_feedback_forwarding_enabled_request +SetIdentityHeadersInNotificationsEnabledRequest,set_identity_headers_in_notifications_enabled_request +SetIdentityMailFromDomainRequest,set_identity_mail_from_domain_request +SetIdentityNotificationTopicRequest,set_identity_notification_topic_request +SetIdentityPoolConfigurationRequest,set_identity_pool_configuration_request +SetIdentityPoolConfigurationResponse,set_identity_pool_configuration_response +SetIdentityPoolRolesInput,set_identity_pool_roles_input +SetInstanceHealthQuery,set_instance_health_query +SetInstanceProtectionQuery,set_instance_protection_query +SetIpAddressTypeInput,set_ip_address_type_input +SetIpAddressTypeOutput,set_ip_address_type_output +SetIpAddressTypeRequest,set_ip_address_type_request +SetIpAddressTypeResult,set_ip_address_type_result +SetLoadBalancerListenerSSLCertificateInput,set_load_balancer_listener_ssl_certificate_input +SetLoadBalancerPoliciesForBackendServerInput,set_load_balancer_policies_for_backend_server_input +SetLoadBalancerPoliciesOfListenerInput,set_load_balancer_policies_of_listener_input +SetLoadBasedAutoScalingRequest,set_load_based_auto_scaling_request +SetLocalConsolePasswordInput,set_local_console_password_input +SetLocalConsolePasswordOutput,set_local_console_password_output +SetLogDeliveryConfigurationRequest,set_log_delivery_configuration_request +SetLogDeliveryConfigurationResponse,set_log_delivery_configuration_response +SetLoggingOptionsRequest,set_logging_options_request +SetName,set_name +SetParameterValueConfiguration,set_parameter_value_configuration +SetParametersOperation,set_parameters_operation +SetPermissionRequest,set_permission_request +SetPlatformApplicationAttributesInput,set_platform_application_attributes_input +SetPrincipalTagAttributeMapInput,set_principal_tag_attribute_map_input +SetPrincipalTagAttributeMapResponse,set_principal_tag_attribute_map_response +SetQueueAttributesRequest,set_queue_attributes_request +SetReceiptRulePositionRequest,set_receipt_rule_position_request +SetRepositoryPolicyRequest,set_repository_policy_request +SetRepositoryPolicyResponse,set_repository_policy_response +SetResourceAccessForBucketRequest,set_resource_access_for_bucket_request +SetResourceAccessForBucketResult,set_resource_access_for_bucket_result +SetRiskConfigurationRequest,set_risk_configuration_request +SetRiskConfigurationResponse,set_risk_configuration_response +SetRulePrioritiesInput,set_rule_priorities_input +SetRulePrioritiesOutput,set_rule_priorities_output +SetSMBGuestPasswordInput,set_smb_guest_password_input +SetSMBGuestPasswordOutput,set_smb_guest_password_output +SetSMSAttributesInput,set_sms_attributes_input +SetSecurityGroupsInput,set_security_groups_input +SetSecurityGroupsOutput,set_security_groups_output +SetSecurityTokenServicePreferencesRequest,set_security_token_service_preferences_request +SetSourceRequest,set_source_request +SetStackPolicyInput,set_stack_policy_input +SetStatOption,set_stat_option +SetStatusInput,set_status_input +SetSubnetsInput,set_subnets_input +SetSubnetsOutput,set_subnets_output +SetSubscriptionAttributesInput,set_subscription_attributes_input +SetTagsForResourceRequest,set_tags_for_resource_request +SetTaskStatusInput,set_task_status_input +SetTerminationProtectionInput,set_termination_protection_input +SetTextMessageSpendLimitOverrideRequest,set_text_message_spend_limit_override_request +SetTextMessageSpendLimitOverrideResult,set_text_message_spend_limit_override_result +SetTimeBasedAutoScalingRequest,set_time_based_auto_scaling_request +SetTimerAction,set_timer_action +SetTopicAttributesInput,set_topic_attributes_input +SetTypeConfigurationInput,set_type_configuration_input +SetTypeConfigurationOutput,set_type_configuration_output +SetTypeDefaultVersionInput,set_type_default_version_input +SetUICustomizationRequest,set_ui_customization_request +SetUICustomizationResponse,set_ui_customization_response +SetUserMFAPreferenceRequest,set_user_mfa_preference_request +SetUserPoolMfaConfigRequest,set_user_pool_mfa_config_request +SetUserPoolMfaConfigResponse,set_user_pool_mfa_config_response +SetUserSettingsRequest,set_user_settings_request +SetV2LoggingLevelRequest,set_v2_logging_level_request +SetV2LoggingOptionsRequest,set_v2_logging_options_request +SetVariableAction,set_variable_action +SetVaultAccessPolicyInput,set_vault_access_policy_input +SetVaultNotificationsInput,set_vault_notifications_input +SetVisibleToAllUsersInput,set_visible_to_all_users_input +SetVoiceMessageSpendLimitOverrideRequest,set_voice_message_spend_limit_override_request +SetVoiceMessageSpendLimitOverrideResult,set_voice_message_spend_limit_override_result +Setting,setting +SettingDescription,setting_description +SettingEntries,setting_entries +SettingEntry,setting_entry +SettingId,setting_id +SettingName,setting_name +SettingValue,setting_value +Settings,settings +SettingsForUpdate,settings_for_update +SettingsGroup,settings_group +Setup,setup +SetupFailed,setup_failed +SetupModeDisabled,setup_mode_disabled +SetupScriptDetails,setup_script_details +Severe,severe +Severities,severities +Severity,severity +SeverityCounts,severity_counts +SeverityLabel,severity_label +SeverityLevel,severity_level +SeverityNormalized,severity_normalized +SeverityProduct,severity_product +SeverityRating,severity_rating +SeveritySummary,severity_summary +SeverityUpdate,severity_update +SftpAuthenticationMethods,sftp_authentication_methods +SftpConfig,sftp_config +SftpConnectorConfig,sftp_connector_config +Sha1,sha1 +ShadowColor,shadow_color +ShadowModeConfig,shadow_mode_config +ShadowModelVariantConfig,shadow_model_variant_config +ShadowModelVariantName,shadow_model_variant_name +ShadowModelVariants,shadow_model_variants +ShadowOpacity,shadow_opacity +ShadowProductionVariants,shadow_production_variants +ShadowXOffset,shadow_x_offset +ShadowYOffset,shadow_y_offset +ShapBaseline,shap_baseline +ShapBaselineConfig,shap_baseline_config +ShapBaselineUri,shap_baseline_uri +ShapConfig,shap_config +Shape,shape +ShapeConditionalFormat,shape_conditional_format +Shard,shard +ShardConfiguration,shard_configuration +ShardConfigurationRequest,shard_configuration_request +ShardCount,shard_count +ShardDetail,shard_detail +ShardFilter,shard_filter +ShardId,shard_id +ShardIterator,shard_iterator +ShardIteratorType,shard_iterator_type +ShardLevelMetrics,shard_level_metrics +ShardLimit,shard_limit +ShardName,shard_name +ShardNotFoundFault,shard_not_found_fault +ShardToMerge,shard_to_merge +ShardToSplit,shard_to_split +Shards,shards +ShardsPerClusterQuotaExceededFault,shards_per_cluster_quota_exceeded_fault +ShareAttributes,share_attributes +ShareDetails,share_details +ShareDirectoryRequest,share_directory_request +ShareDirectoryResult,share_directory_result +ShareError,share_error +ShareErrors,share_errors +ShareId,share_id +ShareInvitation,share_invitation +ShareInvitationAction,share_invitation_action +ShareInvitationId,share_invitation_id +ShareInvitationSummaries,share_invitation_summaries +ShareInvitationSummary,share_invitation_summary +ShareLimitExceededException,share_limit_exceeded_exception +ShareMethod,share_method +ShareNotes,share_notes +SharePointConfiguration,share_point_configuration +SharePointVersion,share_point_version +SharePrincipal,share_principal +SharePrincipals,share_principals +ShareResourceType,share_resource_type +ShareResult,share_result +ShareResults,share_results +ShareRule,share_rule +ShareRules,share_rules +ShareStatus,share_status +ShareTagOptions,share_tag_options +ShareTarget,share_target +SharedAccountId,shared_account_id +SharedAwsAccountIds,shared_aws_account_ids +SharedBy,shared_by +SharedDirectories,shared_directories +SharedDirectory,shared_directory +SharedDirectoryId,shared_directory_id +SharedDirectoryIds,shared_directory_ids +SharedDocumentVersion,shared_document_version +SharedFileSystemConfiguration,shared_file_system_configuration +SharedImagePermissions,shared_image_permissions +SharedImagePermissionsList,shared_image_permissions_list +SharedMemorySize,shared_memory_size +SharedRoutesEnabled,shared_routes_enabled +SharedSecret,shared_secret +SharedSegments,shared_segments +SharedSnapshotQuotaExceededFault,shared_snapshot_quota_exceeded_fault +SharedWith,shared_with +SharedWithPrefix,shared_with_prefix +SharingModel,sharing_model +SharingSettings,sharing_settings +Sharpening,sharpening +Sharpness,sharpness +Sheet,sheet +SheetContentType,sheet_content_type +SheetControlInfoIconLabelOptions,sheet_control_info_icon_label_options +SheetControlLayout,sheet_control_layout +SheetControlLayoutConfiguration,sheet_control_layout_configuration +SheetControlLayouts,sheet_control_layouts +SheetControlsOption,sheet_controls_option +SheetDefinition,sheet_definition +SheetElementConfigurationOverrides,sheet_element_configuration_overrides +SheetElementRenderingRule,sheet_element_rendering_rule +SheetId,sheet_id +SheetIndexes,sheet_indexes +SheetLayoutElementMaximizationOption,sheet_layout_element_maximization_option +SheetNames,sheet_names +SheetSelections,sheet_selections +SheetStyle,sheet_style +SheetTextBox,sheet_text_box +SheetTextBoxId,sheet_text_box_id +SheetVisualScopingConfiguration,sheet_visual_scoping_configuration +SheetVisualScopingConfigurations,sheet_visual_scoping_configurations +Sheets,sheets +ShellHistoryFilePath,shell_history_file_path +ShellVersion,shell_version +ShiftCoverages,shift_coverages +ShiftDetails,shift_details +Shipment,shipment +ShipmentCarrier,shipment_carrier +ShipmentInformation,shipment_information +ShipmentState,shipment_state +ShipmentTrackingNumber,shipment_tracking_number +ShippingAddress,shipping_address +ShippingDetails,shipping_details +ShippingOption,shipping_option +ShortCode,short_code +ShortDescription,short_description +ShortFormatText,short_format_text +ShortName,short_name +Shortened,shortened +Shortname,shortname +ShotFilter,shot_filter +ShotSegment,shot_segment +ShouldDecrementDesiredCapacity,should_decrement_desired_capacity +ShouldRespectGracePeriod,should_respect_grace_period +Show,show +ShowAlternatives,show_alternatives +ShowAssignedLFTags,show_assigned_lf_tags +ShowCacheClustersNotInReplicationGroups,show_cache_clusters_not_in_replication_groups +ShowCacheNodeInfo,show_cache_node_info +ShowDetail,show_detail +ShowMemberInfo,show_member_info +ShowNodeGroupConfig,show_node_group_config +ShowNodeLevelUpdateStatus,show_node_level_update_status +ShowShardDetails,show_shard_details +ShowSpeakerLabel,show_speaker_label +ShowSpeakerLabels,show_speaker_labels +ShrinkPolicy,shrink_policy +ShuffleConfig,shuffle_config +Shutdown,shutdown +ShutdownEventConfiguration,shutdown_event_configuration +ShutdownGatewayInput,shutdown_gateway_input +ShutdownGatewayOutput,shutdown_gateway_output +ShuttingDown,shutting_down +Sid,sid +SideSpecificBorder,side_specific_border +Sidewalk,sidewalk +SidewalkAccountInfo,sidewalk_account_info +SidewalkAccountInfoWithFingerprint,sidewalk_account_info_with_fingerprint +SidewalkCreateWirelessDevice,sidewalk_create_wireless_device +SidewalkDevice,sidewalk_device +SidewalkDeviceMetadata,sidewalk_device_metadata +SidewalkEventNotificationConfigurations,sidewalk_event_notification_configurations +SidewalkGetDeviceProfile,sidewalk_get_device_profile +SidewalkGetStartImportInfo,sidewalk_get_start_import_info +SidewalkId,sidewalk_id +SidewalkListDevice,sidewalk_list_device +SidewalkManufacturingSn,sidewalk_manufacturing_sn +SidewalkResourceTypeEventConfiguration,sidewalk_resource_type_event_configuration +SidewalkSendDataToDevice,sidewalk_send_data_to_device +SidewalkSingleStartImportInfo,sidewalk_single_start_import_info +SidewalkStartImportInfo,sidewalk_start_import_info +SidewalkUpdateAccount,sidewalk_update_account +SidewalkUpdateImportInfo,sidewalk_update_import_info +SigKeyCrc,sig_key_crc +SigV4Authorization,sigv4_authorization +Sign,sign +SignInConfig,sign_in_config +SignInDistribution,sign_in_distribution +SignInMethod,sign_in_method +SignInUrl,sign_in_url +SignInWithApple,sign_in_with_apple +SignKey,sign_key +SignOutUserRequest,sign_out_user_request +SignPayloadRequest,sign_payload_request +SignPayloadResponse,sign_payload_response +SignRequest,sign_request +SignResponse,sign_response +SignUpRequest,sign_up_request +SignUpResponse,sign_up_response +Signal,signal +SignalApplicationInstanceNodeInstancesRequest,signal_application_instance_node_instances_request +SignalApplicationInstanceNodeInstancesResponse,signal_application_instance_node_instances_response +SignalCatalogSummary,signal_catalog_summary +SignalDecoder,signal_decoder +SignalExternalWorkflowExecutionDecisionAttributes,signal_external_workflow_execution_decision_attributes +SignalExternalWorkflowExecutionFailedEventAttributes,signal_external_workflow_execution_failed_event_attributes +SignalExternalWorkflowExecutionInitiatedEventAttributes,signal_external_workflow_execution_initiated_event_attributes +SignalInformation,signal_information +SignalProcessingNotification,signal_processing_notification +SignalResourceInput,signal_resource_input +SignalType,signal_type +SignalWorkflowExecutionInput,signal_workflow_execution_input +SignalingUrl,signaling_url +Signature,signature +SignatureAlgorithm,signature_algorithm +SignatureDetection,signature_detection +SignatureDetections,signature_detections +SignatureValid,signature_valid +SignatureValidityPeriod,signature_validity_period +Signed,signed +SignedCert,signed_cert +SignedHeaders,signed_headers +SignedObject,signed_object +SignedToken,signed_token +SignedUrl,signed_url +SignedUrlExpiresAt,signed_url_expires_at +Signer,signer +SigninDelegateGroup,signin_delegate_group +SigninDelegateGroups,signin_delegate_groups +SigningAlg,signing_alg +SigningAlgorithm,signing_algorithm +SigningAlgorithmMnemonic,signing_algorithm_mnemonic +SigningAlgorithmType,signing_algorithm_type +SigningAlgorithms,signing_algorithms +SigningAttributes,signing_attributes +SigningAttributesOrigin,signing_attributes_origin +SigningBehavior,signing_behavior +SigningCertificate,signing_certificate +SigningConfiguration,signing_configuration +SigningConfigurationOverrides,signing_configuration_overrides +SigningEnabled,signing_enabled +SigningImageFormat,signing_image_format +SigningJob,signing_job +SigningJobArn,signing_job_arn +SigningJobRevocationRecord,signing_job_revocation_record +SigningKeyAlgorithm,signing_key_algorithm +SigningKeyCertificate,signing_key_certificate +SigningKeyCertificateChain,signing_key_certificate_chain +SigningMaterial,signing_material +SigningPlatform,signing_platform +SigningPlatformOverrides,signing_platform_overrides +SigningProfile,signing_profile +SigningProfileParameter,signing_profile_parameter +SigningProfileRevocationRecord,signing_profile_revocation_record +SigningProfileVersionArn,signing_profile_version_arn +SigningProfileVersionArns,signing_profile_version_arns +SigningProtocol,signing_protocol +SignupResponse,signup_response +SilentPush,silent_push +Similarity,similarity +SimilarityThreshold,similarity_threshold +Simple,simple +SimpleAddress,simple_address +SimpleAttributeAggregation,simple_attribute_aggregation +SimpleClusterMarker,simple_cluster_marker +SimpleCondition,simple_condition +SimpleCriterionForJob,simple_criterion_for_job +SimpleEmail,simple_email +SimpleEmailPart,simple_email_part +SimpleNumericalAggregation,simple_numerical_aggregation +SimpleRule,simple_rule +SimpleRuleEvaluation,simple_rule_evaluation +SimpleScalingPolicyConfiguration,simple_scaling_policy_configuration +SimpleScopeTerm,simple_scope_term +SimpleUser,simple_user +SimplifiedApplication,simplified_application +SimplifiedColor,simplified_color +SimulateCustomPolicyRequest,simulate_custom_policy_request +SimulatePolicyResponse,simulate_policy_response +SimulatePrincipalPolicyRequest,simulate_principal_policy_request +SimulateReservedQueue,simulate_reserved_queue +Simulation,simulation +SimulationAppEndpointInfo,simulation_app_endpoint_info +SimulationAppMetadata,simulation_app_metadata +SimulationAppPortMapping,simulation_app_port_mapping +SimulationApplicationConfig,simulation_application_config +SimulationApplicationSummary,simulation_application_summary +SimulationClock,simulation_clock +SimulationJob,simulation_job +SimulationJobBatchSummary,simulation_job_batch_summary +SimulationJobRequest,simulation_job_request +SimulationJobSummary,simulation_job_summary +SimulationMetadata,simulation_metadata +SimulationSoftwareSuite,simulation_software_suite +Simulations,simulations +SinceCrawlDate,since_crawl_date +SingleAvailabilityZone,single_availability_zone +SingleHeader,single_header +SingleHeaderConfig,single_header_config +SingleInstanceHealth,single_instance_health +SingleInstanceType,single_instance_type +SingleMasterChannelEndpointConfiguration,single_master_channel_endpoint_configuration +SingleMasterConfiguration,single_master_configuration +SingleMetricAnomalyDetector,single_metric_anomaly_detector +SingleMetricVisibility,single_metric_visibility +SingleQueryArgument,single_query_argument +SingleSelectOptions,single_select_options +SingleSelectQuestionRuleCategoryAutomation,single_select_question_rule_category_automation +SingleSignOnManagedApplicationInstanceId,single_sign_on_managed_application_instance_id +SingleSignOnUserIdentifier,single_sign_on_user_identifier +SingleSignOnUserValue,single_sign_on_user_value +SingleWeightConfig,single_weight_config +Singular,singular +SingularConnectorProfileCredentials,singular_connector_profile_credentials +SingularConstant,singular_constant +SingularSourceProperties,singular_source_properties +SinkArn,sink_arn +SinkId,sink_id +SinkIdentifier,sink_identifier +SinkType,sink_type +Sinks,sinks +SipAddress,sip_address +SipAddresses,sip_addresses +SipHeaders,sip_headers +SipMediaApplication,sip_media_application +SipMediaApplicationAlexaSkillConfiguration,sip_media_application_alexa_skill_configuration +SipMediaApplicationArn,sip_media_application_arn +SipMediaApplicationCall,sip_media_application_call +SipMediaApplicationEndpoint,sip_media_application_endpoint +SipMediaApplicationId,sip_media_application_id +SipMediaApplicationLoggingConfiguration,sip_media_application_logging_configuration +SipMediaApplications,sip_media_applications +SipRule,sip_rule +SipRuleId,sip_rule_id +SipRuleTargetApplication,sip_rule_target_application +SipRules,sip_rules +Site,site +SiteArn,site_arn +SiteBaseUrl,site_base_url +SiteId,site_id +SiteIds,site_ids +SiteMaps,site_maps +SiteMapsConfiguration,site_maps_configuration +SitePlan,site_plan +SiteToSiteVpnAttachment,site_to_site_vpn_attachment +SiteUrl,site_url +Sites,sites +Size,size +SizeBytes,size_bytes +SizeClassified,size_classified +SizeConstraint,size_constraint +SizeConstraintSet,size_constraint_set +SizeConstraintSetId,size_constraint_set_id +SizeConstraintSetSummary,size_constraint_set_summary +SizeConstraintSetUpdate,size_constraint_set_update +SizeConstraintSets,size_constraint_sets +SizeConstraintStatement,size_constraint_statement +SizeConstraints,size_constraints +SizeEstimateRangeGB,size_estimate_range_gb +SizeFlexEligible,size_flex_eligible +SizeInBytes,size_in_bytes +SizeInGB,size_in_gb +SizeInMBs,size_in_mbs +SizeInMegabytes,size_in_megabytes +SizeInMiB,size_in_mib +SizeLabelOptions,size_label_options +SizeOnDisk,size_on_disk +SizePercent,size_percent +SizeRange,size_range +SizeUnit,size_unit +Sizes,sizes +SizingOptions,sizing_options +SizingPolicy,sizing_policy +SkewedColumnNames,skewed_column_names +SkewedColumnValueLocationMaps,skewed_column_value_location_maps +SkewedColumnValues,skewed_column_values +SkewedInfo,skewed_info +SkillDetails,skill_details +SkillGroup,skill_group +SkillGroupArn,skill_group_arn +SkillGroupData,skill_group_data +SkillGroupName,skill_group_name +SkillGroups,skill_groups +SkillId,skill_id +SkillName,skill_name +SkillNotLinkedException,skill_not_linked_exception +SkillSummaries,skill_summaries +SkillSummary,skill_summary +SkillType,skill_type +SkillTypes,skill_types +SkillsStoreSkill,skills_store_skill +SkillsStoreSkills,skills_store_skills +SkipArchive,skip_archive +SkipCheck,skip_check +SkipDestinationValidation,skip_destination_validation +SkipFinalBackup,skip_final_backup +SkipFinalClusterSnapshot,skip_final_cluster_snapshot +SkipFinalSnapshot,skip_final_snapshot +SkipFirst,skip_first +SkipMatching,skip_matching +SkipModelValidation,skip_model_validation +SkipTunnelReplacement,skip_tunnel_replacement +SkipUnavailable,skip_unavailable +SkipWaitTimeForInstanceTerminationInput,skip_wait_time_for_instance_termination_input +Skipped,skipped +SkippedIPRangeList,skipped_ip_range_list +SkippedRecordCount,skipped_record_count +SkippedTermCount,skipped_term_count +SkippedUsers,skipped_users +SkippedVolumeDetails,skipped_volume_details +Sku,sku +SlaMet,sla_met +Slack,slack +SlackChannelConfiguration,slack_channel_configuration +SlackConfiguration,slack_configuration +SlackConnectorProfileCredentials,slack_connector_profile_credentials +SlackConnectorProfileProperties,slack_connector_profile_properties +SlackEntityList,slack_entity_list +SlackMetadata,slack_metadata +SlackSourceProperties,slack_source_properties +SlackWorkspaceConfiguration,slack_workspace_configuration +Slate,slate +SlateAdUrl,slate_ad_url +SlateSource,slate_source +SlaveInstanceType,slave_instance_type +Slices,slices +Slider,slider +SliderControlDisplayOptions,slider_control_display_options +Slot,slot +SlotCaptureSetting,slot_capture_setting +SlotDateTimeRangeRequest,slot_date_time_range_request +SlotDefaultValue,slot_default_value +SlotDefaultValueSpec,slot_default_value_spec +SlotDefaultValueSpecification,slot_default_value_specification +SlotDurationInHours,slot_duration_in_hours +SlotFilter,slot_filter +SlotMigration,slot_migration +SlotName,slot_name +SlotNotAvailableException,slot_not_available_exception +SlotPriority,slot_priority +SlotResolutionTestResultItem,slot_resolution_test_result_item +SlotResolutionTestResultItemCounts,slot_resolution_test_result_item_counts +SlotSortBy,slot_sort_by +SlotStartTimeRange,slot_start_time_range +SlotStartTimeRangeRequest,slot_start_time_range_request +SlotSuggestions,slot_suggestions +SlotSummary,slot_summary +SlotTypeConfiguration,slot_type_configuration +SlotTypeFilter,slot_type_filter +SlotTypeMetadata,slot_type_metadata +SlotTypeRegexConfiguration,slot_type_regex_configuration +SlotTypeSortBy,slot_type_sort_by +SlotTypeStatistics,slot_type_statistics +SlotTypeSummary,slot_type_summary +SlotTypeValue,slot_type_value +SlotValue,slot_value +SlotValueElicitationSetting,slot_value_elicitation_setting +SlotValueOverride,slot_value_override +SlotValueRegexFilter,slot_value_regex_filter +SlotValueSelectionSetting,slot_value_selection_setting +Slots,slots +SlowDownException,slow_down_exception +SlowPal,slow_pal +SmallImageIconUrl,small_image_icon_url +SmallMultiples,small_multiples +SmallMultiplesAxisProperties,small_multiples_axis_properties +SmallMultiplesLimitConfiguration,small_multiples_limit_configuration +SmallMultiplesOptions,small_multiples_options +SmallMultiplesSort,small_multiples_sort +SmartHomeAppliance,smart_home_appliance +SmartHomeAppliances,smart_home_appliances +Smb,smb +SmbMountOptions,smb_mount_options +Smile,smile +SmoothStreaming,smooth_streaming +SmoothingLatency,smoothing_latency +Smpte2038DataPreference,smpte2038_data_preference +SmpteTtDestinationSettings,smpte_tt_destination_settings +SmsAuthenticationMessage,sms_authentication_message +SmsConfiguration,sms_configuration +SmsConfigurationFailure,sms_configuration_failure +SmsConfigurationType,sms_configuration_type +SmsMessage,sms_message +SmsMfaConfigType,sms_mfa_config_type +SmsMfaConfiguration,sms_mfa_configuration +SmsSettings,sms_settings +SmsVerificationMessage,sms_verification_message +SmtpReplyCode,smtp_reply_code +SnapShotTimeFilter,snap_shot_time_filter +SnapStart,snap_start +SnapStartException,snap_start_exception +SnapStartNotReadyException,snap_start_not_ready_exception +SnapStartResponse,snap_start_response +SnapStartTimeoutException,snap_start_timeout_exception +SnaplockConfiguration,snaplock_configuration +SnaplockRetentionPeriod,snaplock_retention_period +SnaplockType,snaplock_type +SnappedDeparturePositions,snapped_departure_positions +SnappedDestinationPositions,snapped_destination_positions +Snapshot,snapshot +SnapshotARN,snapshot_arn +SnapshotAlreadyExistsFault,snapshot_already_exists_fault +SnapshotAnonymousUser,snapshot_anonymous_user +SnapshotAnonymousUserRedacted,snapshot_anonymous_user_redacted +SnapshotArn,snapshot_arn +SnapshotArns,snapshot_arns +SnapshotCapacityUsed,snapshot_capacity_used +SnapshotClusterIdentifier,snapshot_cluster_identifier +SnapshotConfiguration,snapshot_configuration +SnapshotCopyAlreadyDisabledFault,snapshot_copy_already_disabled_fault +SnapshotCopyAlreadyEnabledFault,snapshot_copy_already_enabled_fault +SnapshotCopyDisabledFault,snapshot_copy_disabled_fault +SnapshotCopyGrant,snapshot_copy_grant +SnapshotCopyGrantAlreadyExistsFault,snapshot_copy_grant_already_exists_fault +SnapshotCopyGrantMessage,snapshot_copy_grant_message +SnapshotCopyGrantName,snapshot_copy_grant_name +SnapshotCopyGrantNotFoundFault,snapshot_copy_grant_not_found_fault +SnapshotCopyGrantQuotaExceededFault,snapshot_copy_grant_quota_exceeded_fault +SnapshotCopyGrants,snapshot_copy_grants +SnapshotCreateTime,snapshot_create_time +SnapshotCreationTime,snapshot_creation_time +SnapshotCreationTimestamp,snapshot_creation_timestamp +SnapshotDatabaseTime,snapshot_database_time +SnapshotDescription,snapshot_description +SnapshotDestinationConfiguration,snapshot_destination_configuration +SnapshotDetail,snapshot_detail +SnapshotDetails,snapshot_details +SnapshotDiskContainer,snapshot_disk_container +SnapshotDownloadUrl,snapshot_download_url +SnapshotErrorMessage,snapshot_error_message +SnapshotFeatureNotSupportedFault,snapshot_feature_not_supported_fault +SnapshotFile,snapshot_file +SnapshotFileGroup,snapshot_file_group +SnapshotFileSheetSelection,snapshot_file_sheet_selection +SnapshotFilter,snapshot_filter +SnapshotId,snapshot_id +SnapshotIdentifier,snapshot_identifier +SnapshotIdentifierList,snapshot_identifier_list +SnapshotIds,snapshot_ids +SnapshotInfo,snapshot_info +SnapshotJobErrorInfo,snapshot_job_error_info +SnapshotJobId,snapshot_job_id +SnapshotJobResult,snapshot_job_result +SnapshotJobResultErrorInfo,snapshot_job_result_error_info +SnapshotJobResultFileGroup,snapshot_job_result_file_group +SnapshotJobS3Result,snapshot_job_s3_result +SnapshotLimitExceededException,snapshot_limit_exceeded_exception +SnapshotLimits,snapshot_limits +SnapshotMessage,snapshot_message +SnapshotName,snapshot_name +SnapshotNotFound,snapshot_not_found +SnapshotNotFoundFault,snapshot_not_found_fault +SnapshotOptions,snapshot_options +SnapshotOptionsStatus,snapshot_options_status +SnapshotOwner,snapshot_owner +SnapshotPolicy,snapshot_policy +SnapshotQuotaExceededFault,snapshot_quota_exceeded_fault +SnapshotRecycleBinInfo,snapshot_recycle_bin_info +SnapshotRetentionLimit,snapshot_retention_limit +SnapshotRetentionStartTime,snapshot_retention_start_time +SnapshotS3DestinationConfiguration,snapshot_s3_destination_configuration +SnapshotS3Location,snapshot_s3_location +SnapshotSchedule,snapshot_schedule +SnapshotScheduleAlreadyExistsFault,snapshot_schedule_already_exists_fault +SnapshotScheduleIdentifier,snapshot_schedule_identifier +SnapshotScheduleNotFoundFault,snapshot_schedule_not_found_fault +SnapshotScheduleQuotaExceededFault,snapshot_schedule_quota_exceeded_fault +SnapshotScheduleState,snapshot_schedule_state +SnapshotScheduleUpdateInProgressFault,snapshot_schedule_update_in_progress_fault +SnapshotSchedules,snapshot_schedules +SnapshotSizeInMegaBytes,snapshot_size_in_mega_bytes +SnapshotSortingEntity,snapshot_sorting_entity +SnapshotSource,snapshot_source +SnapshotStatus,snapshot_status +SnapshotSummaries,snapshot_summaries +SnapshotSummary,snapshot_summary +SnapshotTarget,snapshot_target +SnapshotTaskDetail,snapshot_task_detail +SnapshotTierStatus,snapshot_tier_status +SnapshotTierStatuses,snapshot_tier_statuses +SnapshotTime,snapshot_time +SnapshotType,snapshot_type +SnapshotUserConfiguration,snapshot_user_configuration +SnapshotUserConfigurationRedacted,snapshot_user_configuration_redacted +SnapshotVersion,snapshot_version +SnapshotWindow,snapshot_window +Snapshots,snapshots +SnapshotsData,snapshots_data +SnapshotsDataHeader,snapshots_data_header +SnapshotsEnabled,snapshots_enabled +SnapshotsEnabledUpdate,snapshots_enabled_update +SnapshottingClusterId,snapshotting_cluster_id +SnoozeActionConfiguration,snooze_action_configuration +SnoozeAlarmActionRequest,snooze_alarm_action_request +SnowballAmiId,snowball_ami_id +SnowballCapacityPreference,snowball_capacity_preference +SnowballId,snowball_id +SnowballLimit,snowball_limit +SnowballType,snowball_type +SnowballsInUse,snowballs_in_use +SnowconeDeviceConfiguration,snowcone_device_configuration +Snowflake,snowflake +SnowflakeConnectorProfileCredentials,snowflake_connector_profile_credentials +SnowflakeConnectorProfileProperties,snowflake_connector_profile_properties +SnowflakeDestinationProperties,snowflake_destination_properties +SnowflakeMetadata,snowflake_metadata +SnowflakeNodeData,snowflake_node_data +SnowflakeParameters,snowflake_parameters +SnowflakeSource,snowflake_source +SnowflakeTarget,snowflake_target +Snr,snr +Sns,sns +SnsAction,sns_action +SnsCallerArn,sns_caller_arn +SnsChannelConfig,sns_channel_config +SnsConfiguration,sns_configuration +SnsDataSource,sns_data_source +SnsDestination,sns_destination +SnsFormat,sns_format +SnsRegion,sns_region +SnsRoleName,sns_role_name +SnsTopic,sns_topic +SnsTopicARN,sns_topic_arn +SnsTopicArn,sns_topic_arn +SnsTopicConfiguration,sns_topic_configuration +SnsTopicName,sns_topic_name +SnsTopicSinkConfiguration,sns_topic_sink_configuration +SnsTopicStatus,sns_topic_status +SocialProviderSettings,social_provider_settings +SocketAddress,socket_address +SocketPath,socket_path +Sockets,sockets +SoftIRQ,soft_irq +SoftLimit,soft_limit +Softness,softness +Software,software +SoftwareDetails,software_details +SoftwareInformation,software_information +SoftwarePackage,software_package +SoftwareToUpdate,software_to_update +SoftwareTokenMFANotFoundException,software_token_mfa_not_found_exception +SoftwareTokenMfaConfigType,software_token_mfa_config_type +SoftwareTokenMfaConfiguration,software_token_mfa_configuration +SoftwareTokenMfaSettings,software_token_mfa_settings +SoftwareTokenMfaSettingsType,software_token_mfa_settings_type +SoftwareUpdateOptions,software_update_options +SoftwareUpdateOptionsStatus,software_update_options_status +SoftwareUpdatesEndDate,software_updates_end_date +SoftwareVersion,software_version +Solid,solid +Solution,solution +SolutionConfig,solution_config +SolutionStackDescription,solution_stack_description +SolutionStackDetails,solution_stack_details +SolutionStackName,solution_stack_name +SolutionStacks,solution_stacks +SolutionSummary,solution_summary +SolutionVersion,solution_version +SolutionVersionSummary,solution_version_summary +SolveTimestamp,solve_timestamp +SolverProvider,solver_provider +SolverType,solver_type +SolverVersion,solver_version +Solvers,solvers +SopRecommendation,sop_recommendation +Sort,sort +SortAscending,sort_ascending +SortBy,sort_by +SortByMetric,sort_by_metric +SortColumns,sort_columns +SortCondition,sort_condition +SortConfiguration,sort_configuration +SortCriteria,sort_criteria +SortCriterion,sort_criterion +SortDefinition,sort_definition +SortDirection,sort_direction +SortEnabled,sort_enabled +SortExpression,sort_expression +SortIconVisibility,sort_icon_visibility +SortKey,sort_key +SortOrder,sort_order +SortPaths,sort_paths +SortProperty,sort_property +Sortable,sortable +SortingConfiguration,sorting_configuration +SortingEntities,sorting_entities +Sound,sound +Source,source +Source608ChannelNumber,source608_channel_number +Source608TrackNumber,source608_track_number +SourceARN,source_arn +SourceAccessConfiguration,source_access_configuration +SourceAccessConfigurations,source_access_configurations +SourceAccount,source_account +SourceAccountId,source_account_id +SourceAddress,source_address +SourceAddresses,source_addresses +SourceAlgorithm,source_algorithm +SourceAlgorithmSpecification,source_algorithm_specification +SourceAlgorithms,source_algorithms +SourceAnalysis,source_analysis +SourceAncillaryChannelNumber,source_ancillary_channel_number +SourceAndDestinationAreSameException,source_and_destination_are_same_exception +SourceApiAssociation,source_api_association +SourceApiAssociationConfig,source_api_association_config +SourceApiAssociationSummary,source_api_association_summary +SourceApplicationName,source_application_name +SourceApplicationUrl,source_application_url +SourceArn,source_arn +SourceArnPrefix,source_arn_prefix +SourceAuth,source_auth +SourceBackup,source_backup +SourceBackupArn,source_backup_arn +SourceBackupId,source_backup_id +SourceBackupRegion,source_backup_region +SourceBackupUnavailable,source_backup_unavailable +SourceBackupVaultArn,source_backup_vault_arn +SourceBackupVaultName,source_backup_vault_name +SourceBranchName,source_branch_name +SourceBucket,source_bucket +SourceBucketArn,source_bucket_arn +SourceBuildInformation,source_build_information +SourceBundle,source_bundle +SourceBundleDeletionException,source_bundle_deletion_exception +SourceCacheNodeId,source_cache_node_id +SourceCidrBlock,source_cidr_block +SourceCloudProperties,source_cloud_properties +SourceCluster,source_cluster +SourceClusterInfo,source_cluster_info +SourceClusterNotSupportedFault,source_cluster_not_supported_fault +SourceCode,source_code +SourceCodeArchiveUrl,source_code_archive_url +SourceCodeArtifactsObjectKey,source_code_artifacts_object_key +SourceCodeRepository,source_code_repository +SourceCodeType,source_code_type +SourceCodeUrl,source_code_url +SourceCodeVersion,source_code_version +SourceColumn,source_column +SourceCommit,source_commit +SourceConfig,source_config +SourceConfiguration,source_configuration +SourceConnection,source_connection +SourceConnectionDetail,source_connection_detail +SourceConnectionParameters,source_connection_parameters +SourceConnectorProperties,source_connector_properties +SourceConnectorType,source_connector_type +SourceContactId,source_contact_id +SourceContainer,source_container +SourceControlDetails,source_control_details +SourceControls,source_controls +SourceCredentialsInfo,source_credentials_info +SourceCustomDbEngineVersionIdentifier,source_custom_db_engine_version_identifier +SourceDBClusterIdentifier,source_db_cluster_identifier +SourceDBClusterParameterGroupIdentifier,source_db_cluster_parameter_group_identifier +SourceDBClusterSnapshotArn,source_db_cluster_snapshot_arn +SourceDBClusterSnapshotIdentifier,source_db_cluster_snapshot_identifier +SourceDBInstanceArn,source_db_instance_arn +SourceDBInstanceAutomatedBackupsArn,source_db_instance_automated_backups_arn +SourceDBInstanceIdentifier,source_db_instance_identifier +SourceDBParameterGroupIdentifier,source_db_parameter_group_identifier +SourceDBSnapshotIdentifier,source_db_snapshot_identifier +SourceDataColumnProperties,source_data_column_properties +SourceDataProviderDescriptors,source_data_provider_descriptors +SourceDatabaseName,source_database_name +SourceDatabaseNotSupportedFault,source_database_not_supported_fault +SourceDatasetArn,source_dataset_arn +SourceDbClusterResourceId,source_db_cluster_resource_id +SourceDbSnapshotIdentifier,source_db_snapshot_identifier +SourceDbiResourceId,source_dbi_resource_id +SourceDescription,source_description +SourceDestCheck,source_dest_check +SourceDetail,source_detail +SourceDetails,source_details +SourceDirectory,source_directory +SourceDocument,source_document +SourceDocuments,source_documents +SourceDocumentsS3Uri,source_documents_s3_uri +SourceDomain,source_domain +SourceDomainInfo,source_domain_info +SourceEncryptionAlgorithm,source_encryption_algorithm +SourceEncryptionContext,source_encryption_context +SourceEndBehavior,source_end_behavior +SourceEndpointArn,source_endpoint_arn +SourceEngine,source_engine +SourceEngineName,source_engine_name +SourceEngineVersion,source_engine_version +SourceEntity,source_entity +SourceEntityArn,source_entity_arn +SourceEnvironmentId,source_environment_id +SourceEnvironmentName,source_environment_name +SourceFailoverConfig,source_failover_config +SourceField,source_field +SourceFieldProperties,source_field_properties +SourceFields,source_fields +SourceFile,source_file +SourceFileLocation,source_file_location +SourceFileOrContentRequiredException,source_file_or_content_required_exception +SourceFileSpecifier,source_file_specifier +SourceFileSystemArn,source_file_system_arn +SourceFileSystemId,source_file_system_id +SourceFileSystemRegion,source_file_system_region +SourceFiles,source_files +SourceFilterId,source_filter_id +SourceFlowConfig,source_flow_config +SourceFpgaImageId,source_fpga_image_id +SourceGroup,source_group +SourceId,source_id +SourceIdType,source_id_type +SourceIdentifier,source_identifier +SourceIdentity,source_identity +SourceIds,source_ids +SourceIdsList,source_ids_list +SourceImage,source_image +SourceImageFace,source_image_face +SourceImageId,source_image_id +SourceImageName,source_image_name +SourceImageOrientationCorrection,source_image_orientation_correction +SourceIp,source_ip +SourceIpConditionConfig,source_ip_condition_config +SourceIpConfig,source_ip_config +SourceIpV4,source_ipv4 +SourceIpV6,source_ipv6 +SourceIpamPoolId,source_ipam_pool_id +SourceIps,source_ips +SourceItemsLimit,source_items_limit +SourceKeyId,source_key_id +SourceKeyword,source_keyword +SourceLanguageCode,source_language_code +SourceLastUpdatedTimestampFormat,source_last_updated_timestamp_format +SourceLayerArn,source_layer_arn +SourceLayerHash,source_layer_hash +SourceLicenseContext,source_license_context +SourceListenerAddress,source_listener_address +SourceListenerPort,source_listener_port +SourceLocation,source_location +SourceLocationArn,source_location_arn +SourceLocationName,source_location_name +SourceMac,source_mac +SourceMember,source_member +SourceMetadata,source_metadata +SourceModelArn,source_model_arn +SourceModelVariantName,source_model_variant_name +SourceModelVersionArn,source_model_version_arn +SourceName,source_name +SourceNetwork,source_network +SourceNetworkData,source_network_data +SourceNetworkInterfaceArns,source_network_interface_arns +SourceNotFoundFault,source_not_found_fault +SourceObject,source_object +SourceObjectReference,source_object_reference +SourceOptionGroup,source_option_group +SourceOptionGroupIdentifier,source_option_group_identifier +SourceParameterName,source_parameter_name +SourceParameters,source_parameters +SourceParentId,source_parent_id +SourceParentNotFoundException,source_parent_not_found_exception +SourcePath,source_path +SourcePhoneNumber,source_phone_number +SourcePipelineExecutionArn,source_pipeline_execution_arn +SourcePolicyId,source_policy_id +SourcePolicyType,source_policy_type +SourcePort,source_port +SourcePortRange,source_port_range +SourcePortRanges,source_port_ranges +SourcePortfolioId,source_portfolio_id +SourcePorts,source_ports +SourcePrefix,source_prefix +SourcePrefixLists,source_prefix_lists +SourcePriority,source_priority +SourceProductArn,source_product_arn +SourceProjectArn,source_project_arn +SourceProjectVersionArn,source_project_version_arn +SourceProperties,source_properties +SourceProvisioningArtifactIdentifiers,source_provisioning_artifact_identifiers +SourceQueue,source_queue +SourceRecoveryPointArn,source_recovery_point_arn +SourceRefContains,source_ref_contains +SourceRegion,source_region +SourceRegionMessage,source_region_message +SourceRegions,source_regions +SourceRepository,source_repository +SourceReservedNode,source_reserved_node +SourceReservedNodeCount,source_reserved_node_count +SourceReservedNodeId,source_reserved_node_id +SourceReservedNodeType,source_reserved_node_type +SourceResourceArn,source_resource_arn +SourceResourceName,source_resource_name +SourceResourceType,source_resource_type +SourceResult,source_result +SourceRevision,source_revision +SourceRoleArn,source_role_arn +SourceS3Location,source_s3_location +SourceS3Path,source_s3_path +SourceSchema,source_schema +SourceSchemaName,source_schema_name +SourceSecurityGroup,source_security_group +SourceSecurityGroupName,source_security_group_name +SourceSecurityGroupOwnerId,source_security_group_owner_id +SourceSegments,source_segments +SourceSelectionCriteria,source_selection_criteria +SourceServer,source_server +SourceServerActionDocument,source_server_action_document +SourceServerActionsRequestFilters,source_server_actions_request_filters +SourceSettings,source_settings +SourceSheetControlId,source_sheet_control_id +SourceSnapshotClusterIdentifier,source_snapshot_cluster_identifier +SourceSnapshotId,source_snapshot_id +SourceSnapshotIdentifier,source_snapshot_identifier +SourceSnapshotIds,source_snapshot_ids +SourceSnapshotName,source_snapshot_name +SourceStackId,source_stack_id +SourceTable,source_table +SourceTableArn,source_table_arn +SourceTableDetails,source_table_details +SourceTableFeatureDetails,source_table_feature_details +SourceTableName,source_table_name +SourceTemplate,source_template +SourceText,source_text +SourceType,source_type +SourceTypes,source_types +SourceURI,source_uri +SourceUpdateToken,source_update_token +SourceUri,source_uri +SourceUrl,source_url +SourceUser,source_user +SourceUserIdentifier,source_user_identifier +SourceVersion,source_version +SourceVolume,source_volume +SourceVolumeARN,source_volume_arn +SourceVpc,source_vpc +SourceWatermarkStatus,source_watermark_status +SourceWorkspaceId,source_workspace_id +Sources,sources +South,south +Space,space +SpaceArn,space_arn +SpaceConfiguration,space_configuration +SpaceDetails,space_details +SpaceFieldMappings,space_field_mappings +SpaceName,space_name +SpaceNameContains,space_name_contains +SpaceNameEquals,space_name_equals +SpaceSettings,space_settings +SpaceSummary,space_summary +Spaces,spaces +Spacing,spacing +SpamCount,spam_count +SpamPercentage,spam_percentage +SpamRawCount,spam_raw_count +Span,span +SparkConnectorSource,spark_connector_source +SparkConnectorTarget,spark_connector_target +SparkParameters,spark_parameters +SparkProperties,spark_properties +SparkSQL,spark_sql +SparkSqlJobDriver,spark_sql_job_driver +SparkSubmit,spark_submit +SparkSubmitJobDriver,spark_submit_job_driver +Sparkline,sparkline +SparqlData,sparql_data +SparqlRecord,sparql_record +SparseTrackType,sparse_track_type +SpatialAdaptiveQuantization,spatial_adaptive_quantization +SpatialAq,spatial_aq +SpatialDataOptionToGeoJsonFunctionName,spatial_data_option_to_geo_json_function_name +SpatialFilterSettings,spatial_filter_settings +SpawnRate,spawn_rate +SpdxLicenseId,spdx_license_id +Speaker,speaker +SpeakerEnrollmentJob,speaker_enrollment_job +SpeakerEnrollmentJobSummary,speaker_enrollment_job_summary +SpeakerId,speaker_id +SpeakerSearchDetails,speaker_search_details +SpeakerSearchResult,speaker_search_result +SpeakerSearchStatus,speaker_search_status +SpeakerSearchTask,speaker_search_task +SpeakerSearchTaskId,speaker_search_task_id +SpeakerSearchTaskStatus,speaker_search_task_status +SpeakerSummaries,speaker_summaries +SpeakerSummary,speaker_summary +Spec,spec +SpecialFeature,special_feature +SpecialValue,special_value +Specialty,specialty +SpecifedOrder,specifed_order +Specification,specification +Specifications,specifications +SpecifiedImage,specified_image +SpectrumConfig,spectrum_config +SpeechMarkTypes,speech_mark_types +SpeechThreshold,speech_threshold +Speed,speed +SpekeKeyProvider,speke_key_provider +SpekeKeyProviderCmaf,speke_key_provider_cmaf +SpellCorrectedQueries,spell_corrected_queries +SpellCorrectedQuery,spell_corrected_query +SpellCorrectionConfiguration,spell_correction_configuration +Spend,spend +SpendCoveredBySavingsPlans,spend_covered_by_savings_plans +SpendLimit,spend_limit +SpendLimits,spend_limits +SpfPercentage,spf_percentage +Spigot,spigot +SpliceEventId,splice_event_id +SpliceInsertMessage,splice_insert_message +Split,split +SplitChargeRules,split_charge_rules +SplitDocument,split_document +SplitDocuments,split_documents +SplitFields,split_fields +SplitShardInput,split_shard_input +SplitTunnel,split_tunnel +SplitType,split_type +SplunkDestinationConfiguration,splunk_destination_configuration +SplunkDestinationDescription,splunk_destination_description +SplunkDestinationUpdate,splunk_destination_update +SplunkRetryOptions,splunk_retry_options +SpotAllocationStrategy,spot_allocation_strategy +SpotCapacityRebalance,spot_capacity_rebalance +SpotDatafeedSubscription,spot_datafeed_subscription +SpotFleetLaunchSpecification,spot_fleet_launch_specification +SpotFleetMonitoring,spot_fleet_monitoring +SpotFleetRequestConfig,spot_fleet_request_config +SpotFleetRequestConfigData,spot_fleet_request_config_data +SpotFleetRequestConfigs,spot_fleet_request_configs +SpotFleetRequestId,spot_fleet_request_id +SpotFleetRequestIds,spot_fleet_request_ids +SpotFleetRequestState,spot_fleet_request_state +SpotFleetTagSpecification,spot_fleet_tag_specification +SpotInstancePools,spot_instance_pools +SpotInstanceRequest,spot_instance_request +SpotInstanceRequestId,spot_instance_request_id +SpotInstanceRequestIds,spot_instance_request_ids +SpotInstanceRequests,spot_instance_requests +SpotInstanceStateFault,spot_instance_state_fault +SpotInstanceStatus,spot_instance_status +SpotInstanceType,spot_instance_type +SpotMaintenanceStrategies,spot_maintenance_strategies +SpotMarketOptions,spot_market_options +SpotMaxPrice,spot_max_price +SpotMaxPricePercentageOverLowestPrice,spot_max_price_percentage_over_lowest_price +SpotMaxTotalPrice,spot_max_total_price +SpotOptions,spot_options +SpotOptionsRequest,spot_options_request +SpotPlacement,spot_placement +SpotPlacementScore,spot_placement_score +SpotPlacementScores,spot_placement_scores +SpotPrice,spot_price +SpotPriceHistory,spot_price_history +SpotProvisioningSpecification,spot_provisioning_specification +SpotResizeSpecification,spot_resize_specification +SpotResizingSpecification,spot_resizing_specification +SpotSpecification,spot_specification +SpotTargetCapacity,spot_target_capacity +SpreadDomain,spread_domain +SpreadLevel,spread_level +Sql,sql +SqlAlias,sql_alias +SqlAliases,sql_aliases +SqlApplicationConfiguration,sql_application_configuration +SqlApplicationConfigurationDescription,sql_application_configuration_description +SqlApplicationConfigurationUpdate,sql_application_configuration_update +SqlConfiguration,sql_configuration +SqlEndpointPath,sql_endpoint_path +SqlInjectionMatchSet,sql_injection_match_set +SqlInjectionMatchSetId,sql_injection_match_set_id +SqlInjectionMatchSetSummary,sql_injection_match_set_summary +SqlInjectionMatchSetUpdate,sql_injection_match_set_update +SqlInjectionMatchSets,sql_injection_match_sets +SqlInjectionMatchTuple,sql_injection_match_tuple +SqlInjectionMatchTuples,sql_injection_match_tuples +SqlParameter,sql_parameter +SqlParseException,sql_parse_exception +SqlQuery,sql_query +SqlQueryDatasetAction,sql_query_dataset_action +SqlRunConfiguration,sql_run_configuration +SqlRunConfigurations,sql_run_configurations +SqlServerParameters,sql_server_parameters +SqlStatementResult,sql_statement_result +SqlType,sql_type +SqliMatchStatement,sqli_match_statement +Sqls,sqls +SqsAction,sqs_action +SqsFailureFeedbackRoleArn,sqs_failure_feedback_role_arn +SqsParameters,sqs_parameters +SqsQueueArn,sqs_queue_arn +SqsQueueConfiguration,sqs_queue_configuration +SqsQueueParameters,sqs_queue_parameters +SqsQueueSinkConfiguration,sqs_queue_sink_configuration +SqsQueueUrl,sqs_queue_url +SqsSuccessFeedbackRoleArn,sqs_success_feedback_role_arn +Squash,squash +SriovNetSupport,sriov_net_support +SrtDestinationSettings,srt_destination_settings +SseAwsKmsKeyId,sse_aws_kms_key_id +SseConfig,sse_config +SseConfiguration,sse_configuration +SseDescription,sse_description +SseKmsEncryptedObjects,sse_kms_encrypted_objects +SseSpecification,sse_specification +SseType,sse_type +SshCiphers,ssh_ciphers +SshHostDsaKeyFingerprint,ssh_host_dsa_key_fingerprint +SshHostRsaKeyFingerprint,ssh_host_rsa_key_fingerprint +SshKexs,ssh_kexs +SshKey,ssh_key +SshKeyLastUpdated,ssh_key_last_updated +SshKeyName,ssh_key_name +SshMacs,ssh_macs +SshPublicKey,ssh_public_key +SshPublicKeyBody,ssh_public_key_body +SshPublicKeyCount,ssh_public_key_count +SshPublicKeyId,ssh_public_key_id +SshPublicKeys,ssh_public_keys +SshUsername,ssh_username +Ssid,ssid +Ssl,ssl +SslCaCertificateArn,ssl_ca_certificate_arn +SslCertificateId,ssl_certificate_id +SslCertificateS3Path,ssl_certificate_s3_path +SslClientCertificateArn,ssl_client_certificate_arn +SslClientKeyArn,ssl_client_key_arn +SslClientKeyPassword,ssl_client_key_password +SslConfiguration,ssl_configuration +SslEndpointIdentificationAlgorithm,ssl_endpoint_identification_algorithm +SslMode,ssl_mode +SslPolicies,ssl_policies +SslPolicy,ssl_policy +SslProperties,ssl_properties +SslProtocols,ssl_protocols +SslSecurityProtocol,ssl_security_protocol +SslSupportMethod,ssl_support_method +SsmActionDefinition,ssm_action_definition +SsmAutomation,ssm_automation +SsmControls,ssm_controls +SsmDocument,ssm_document +SsmOpsItemId,ssm_ops_item_id +SsmParameterStoreParameter,ssm_parameter_store_parameter +Ssml,ssml +SsmlList,ssml_list +SsmlMarksNotSupportedForTextTypeException,ssml_marks_not_supported_for_text_type_exception +SsoEnabled,sso_enabled +Stable,stable +Stack,stack +StackArn,stack_arn +StackConfigInput,stack_config_input +StackConfigurationManager,stack_configuration_manager +StackDriftDetectionId,stack_drift_detection_id +StackDriftInformation,stack_drift_information +StackDriftInformationSummary,stack_drift_information_summary +StackDriftStatus,stack_drift_status +StackError,stack_error +StackErrors,stack_errors +StackEvent,stack_event +StackEvents,stack_events +StackId,stack_id +StackIds,stack_ids +StackIdsUrl,stack_ids_url +StackInstance,stack_instance +StackInstanceAccount,stack_instance_account +StackInstanceComprehensiveStatus,stack_instance_comprehensive_status +StackInstanceFilter,stack_instance_filter +StackInstanceNotFoundException,stack_instance_not_found_exception +StackInstanceRegion,stack_instance_region +StackInstanceResourceDriftStatuses,stack_instance_resource_drift_statuses +StackInstanceResourceDriftsSummary,stack_instance_resource_drifts_summary +StackInstanceStatus,stack_instance_status +StackInstanceSummary,stack_instance_summary +StackInstances,stack_instances +StackName,stack_name +StackNames,stack_names +StackNotFoundException,stack_not_found_exception +StackPolicyBody,stack_policy_body +StackPolicyDuringUpdateBody,stack_policy_during_update_body +StackPolicyDuringUpdateURL,stack_policy_during_update_url +StackPolicyURL,stack_policy_url +StackResource,stack_resource +StackResourceDetail,stack_resource_detail +StackResourceDrift,stack_resource_drift +StackResourceDriftInformation,stack_resource_drift_information +StackResourceDriftInformationSummary,stack_resource_drift_information_summary +StackResourceDriftStatus,stack_resource_drift_status +StackResourceDriftStatusFilters,stack_resource_drift_status_filters +StackResourceDrifts,stack_resource_drifts +StackResourceSummaries,stack_resource_summaries +StackResourceSummary,stack_resource_summary +StackResources,stack_resources +StackSet,stack_set +StackSetARN,stack_set_arn +StackSetAccounts,stack_set_accounts +StackSetDriftDetectionDetails,stack_set_drift_detection_details +StackSetFailureToleranceCount,stack_set_failure_tolerance_count +StackSetFailureTolerancePercentage,stack_set_failure_tolerance_percentage +StackSetId,stack_set_id +StackSetMaxConcurrencyCount,stack_set_max_concurrency_count +StackSetMaxConcurrencyPercentage,stack_set_max_concurrency_percentage +StackSetName,stack_set_name +StackSetNotEmptyException,stack_set_not_empty_exception +StackSetNotFoundException,stack_set_not_found_exception +StackSetOperation,stack_set_operation +StackSetOperationPreferences,stack_set_operation_preferences +StackSetOperationResultSummary,stack_set_operation_result_summary +StackSetOperationStatusDetails,stack_set_operation_status_details +StackSetOperationSummary,stack_set_operation_summary +StackSetOperationType,stack_set_operation_type +StackSetRegions,stack_set_regions +StackSetSummary,stack_set_summary +StackStatus,stack_status +StackStatusFilter,stack_status_filter +StackStatusReason,stack_status_reason +StackSummaries,stack_summaries +StackSummary,stack_summary +Stacks,stacks +Stage,stage +StageContext,stage_context +StageDeclaration,stage_declaration +StageDeployment,stage_deployment +StageDeploymentDetails,stage_deployment_details +StageDeploymentSummary,stage_deployment_summary +StageDeployments,stage_deployments +StageDetails,stage_details +StageExecution,stage_execution +StageId,stage_id +StageIndex,stage_index +StageKey,stage_key +StageLastUpdatedDateTime,stage_last_updated_date_time +StageName,stage_name +StageNotFoundException,stage_not_found_exception +StageNotRetryableException,stage_not_retryable_exception +StageReason,stage_reason +StageSession,stage_session +StageSessionSummary,stage_session_summary +StageState,stage_state +StageStatus,stage_status +StageSummary,stage_summary +StageVariableOverrides,stage_variable_overrides +StageVariables,stage_variables +Stages,stages +StagesAvailable,stages_available +Staging,staging +StagingArea,staging_area +StagingDistributionDnsNames,staging_distribution_dns_names +StagingDistributionId,staging_distribution_id +StagingDistributionInUse,staging_distribution_in_use +StagingSourceServer,staging_source_server +StagingTable,staging_table +Stairs,stairs +StaleIpPermission,stale_ip_permission +StaleIpPermissions,stale_ip_permissions +StaleIpPermissionsEgress,stale_ip_permissions_egress +StaleRequestException,stale_request_exception +StaleSecurityGroup,stale_security_group +StaleSecurityGroupSet,stale_security_group_set +StaleTagException,stale_tag_exception +StandByAvailabilityZoneCount,stand_by_availability_zone_count +Standard,standard +StandardErrorContent,standard_error_content +StandardErrorUrl,standard_error_url +StandardHlsSettings,standard_hls_settings +StandardIdentifiers,standard_identifiers +StandardKnowledgeArticleTypeConfiguration,standard_knowledge_article_type_configuration +StandardLayout,standard_layout +StandardMessages,standard_messages +StandardMetricName,standard_metric_name +StandardObjectAttachmentConfiguration,standard_object_attachment_configuration +StandardObjectConfigurations,standard_object_configurations +StandardOutputContent,standard_output_content +StandardOutputUrl,standard_output_url +Standards,standards +StandardsArn,standards_arn +StandardsControl,standards_control +StandardsControlArn,standards_control_arn +StandardsControlArns,standards_control_arns +StandardsControlAssociationDetail,standards_control_association_detail +StandardsControlAssociationDetails,standards_control_association_details +StandardsControlAssociationId,standards_control_association_id +StandardsControlAssociationIds,standards_control_association_ids +StandardsControlAssociationSummaries,standards_control_association_summaries +StandardsControlAssociationSummary,standards_control_association_summary +StandardsControlAssociationUpdate,standards_control_association_update +StandardsControlAssociationUpdates,standards_control_association_updates +StandardsControlDescription,standards_control_description +StandardsControlTitle,standards_control_title +StandardsId,standards_id +StandardsInput,standards_input +StandardsManagedBy,standards_managed_by +StandardsStatus,standards_status +StandardsStatusReason,standards_status_reason +StandardsSubscription,standards_subscription +StandardsSubscriptionArn,standards_subscription_arn +StandardsSubscriptionArns,standards_subscription_arns +StandardsSubscriptionRequest,standards_subscription_request +StandardsSubscriptionRequests,standards_subscription_requests +StandardsSubscriptions,standards_subscriptions +StandbyDelayTime,standby_delay_time +StandbyInstances,standby_instances +StandbyWorkspace,standby_workspace +StandbyWorkspaceRequest,standby_workspace_request +StandbyWorkspaces,standby_workspaces +Start,start +StartAccessLoggingInput,start_access_logging_input +StartActivity,start_activity +StartActivityStreamRequest,start_activity_stream_request +StartActivityStreamResponse,start_activity_stream_response +StartAfter,start_after +StartAfterDateTime,start_after_date_time +StartAngle,start_angle +StartAnnotationImportRequest,start_annotation_import_request +StartAnnotationImportResponse,start_annotation_import_response +StartAppAssessmentRequest,start_app_assessment_request +StartAppAssessmentResponse,start_app_assessment_response +StartAppBlockBuilderRequest,start_app_block_builder_request +StartAppBlockBuilderResult,start_app_block_builder_result +StartAppInput,start_app_input +StartAppOutput,start_app_output +StartAppReplicationRequest,start_app_replication_request +StartApplicationRefreshInput,start_application_refresh_input +StartApplicationRefreshOutput,start_application_refresh_output +StartApplicationRequest,start_application_request +StartArns,start_arns +StartAssessmentFrameworkShareRequest,start_assessment_framework_share_request +StartAssessmentFrameworkShareResponse,start_assessment_framework_share_response +StartAssessmentRequest,start_assessment_request +StartAssessmentResponse,start_assessment_response +StartAssessmentRunRequest,start_assessment_run_request +StartAssessmentRunResponse,start_assessment_run_response +StartAssetBundleExportJobRequest,start_asset_bundle_export_job_request +StartAssetBundleExportJobResponse,start_asset_bundle_export_job_response +StartAssetBundleImportJobRequest,start_asset_bundle_import_job_request +StartAssetBundleImportJobResponse,start_asset_bundle_import_job_response +StartAssociationsOnceRequest,start_associations_once_request +StartAt,start_at +StartAttachmentUploadRequest,start_attachment_upload_request +StartAttachmentUploadResponse,start_attachment_upload_response +StartAuditMitigationActionsTaskRequest,start_audit_mitigation_actions_task_request +StartAuditMitigationActionsTaskResponse,start_audit_mitigation_actions_task_response +StartAutomationExecutionRequest,start_automation_execution_request +StartAutomationExecutionResult,start_automation_execution_result +StartAvailabilityMonitorTestInput,start_availability_monitor_test_input +StartAvailabilityMonitorTestOutput,start_availability_monitor_test_output +StartBackupJobInput,start_backup_job_input +StartBackupJobOutput,start_backup_job_output +StartBatchJobRequest,start_batch_job_request +StartBatchJobResponse,start_batch_job_response +StartBgpFailoverTestRequest,start_bgp_failover_test_request +StartBgpFailoverTestResponse,start_bgp_failover_test_response +StartBillingPeriod,start_billing_period +StartBlueprintRunRequest,start_blueprint_run_request +StartBlueprintRunResponse,start_blueprint_run_response +StartBotRecommendationRequest,start_bot_recommendation_request +StartBotRecommendationResponse,start_bot_recommendation_response +StartBuildBatchInput,start_build_batch_input +StartBuildBatchOutput,start_build_batch_output +StartBuildInput,start_build_input +StartBuildOutput,start_build_output +StartBulkAssociateWirelessDeviceWithMulticastGroupRequest,start_bulk_associate_wireless_device_with_multicast_group_request +StartBulkDeploymentRequest,start_bulk_deployment_request +StartBulkDeploymentResponse,start_bulk_deployment_response +StartBulkDisassociateWirelessDeviceFromMulticastGroupRequest,start_bulk_disassociate_wireless_device_from_multicast_group_request +StartBy,start_by +StartCalculationExecutionRequest,start_calculation_execution_request +StartCalculationExecutionResponse,start_calculation_execution_response +StartCallAnalyticsJobRequest,start_call_analytics_job_request +StartCallAnalyticsJobResponse,start_call_analytics_job_response +StartCallAnalyticsStreamTranscriptionRequest,start_call_analytics_stream_transcription_request +StartCallAnalyticsStreamTranscriptionResponse,start_call_analytics_stream_transcription_response +StartCampaignRequest,start_campaign_request +StartCanaryRequest,start_canary_request +StartCelebrityRecognitionRequest,start_celebrity_recognition_request +StartCelebrityRecognitionResponse,start_celebrity_recognition_response +StartChangeRequestExecutionRequest,start_change_request_execution_request +StartChangeRequestExecutionResult,start_change_request_execution_result +StartChangeSetRequest,start_change_set_request +StartChangeSetResponse,start_change_set_response +StartChannelRequest,start_channel_request +StartChannelResponse,start_channel_response +StartChatContactRequest,start_chat_contact_request +StartChatContactResponse,start_chat_contact_response +StartChildWorkflowExecutionDecisionAttributes,start_child_workflow_execution_decision_attributes +StartChildWorkflowExecutionFailedEventAttributes,start_child_workflow_execution_failed_event_attributes +StartChildWorkflowExecutionInitiatedEventAttributes,start_child_workflow_execution_initiated_event_attributes +StartClockInput,start_clock_input +StartCodegenJobData,start_codegen_job_data +StartCodegenJobRequest,start_codegen_job_request +StartCodegenJobResponse,start_codegen_job_response +StartColumn,start_column +StartColumnIndex,start_column_index +StartCommand,start_command +StartCondition,start_condition +StartConfigRulesEvaluationRequest,start_config_rules_evaluation_request +StartConfigurationRecorderRequest,start_configuration_recorder_request +StartConfigurationSessionRequest,start_configuration_session_request +StartConfigurationSessionResponse,start_configuration_session_response +StartConnectionRequest,start_connection_request +StartConnectionResponse,start_connection_response +StartContactEvaluationRequest,start_contact_evaluation_request +StartContactEvaluationResponse,start_contact_evaluation_response +StartContactRecordingRequest,start_contact_recording_request +StartContactStreamingRequest,start_contact_streaming_request +StartContactStreamingResponse,start_contact_streaming_response +StartContentModerationRequest,start_content_moderation_request +StartContentModerationResponse,start_content_moderation_response +StartContentUploadRequest,start_content_upload_request +StartContentUploadResponse,start_content_upload_response +StartContinentCode,start_continent_code +StartContinuousExportResponse,start_continuous_export_response +StartConversationRequest,start_conversation_request +StartConversationResponse,start_conversation_response +StartCopyJobInput,start_copy_job_input +StartCopyJobOutput,start_copy_job_output +StartCostEstimationRequest,start_cost_estimation_request +StartCountryCode,start_country_code +StartCrawlerRequest,start_crawler_request +StartCrawlerScheduleRequest,start_crawler_schedule_request +StartCutoverRequest,start_cutover_request +StartCutoverResponse,start_cutover_response +StartDBClusterMessage,start_db_cluster_message +StartDBClusterResult,start_db_cluster_result +StartDBInstanceAutomatedBackupsReplicationMessage,start_db_instance_automated_backups_replication_message +StartDBInstanceAutomatedBackupsReplicationResult,start_db_instance_automated_backups_replication_result +StartDBInstanceMessage,start_db_instance_message +StartDBInstanceResult,start_db_instance_result +StartDICOMImportJobRequest,start_dicom_import_job_request +StartDICOMImportJobResponse,start_dicom_import_job_response +StartDashboardSnapshotJobRequest,start_dashboard_snapshot_job_request +StartDashboardSnapshotJobResponse,start_dashboard_snapshot_job_response +StartDataCollectionByAgentIdsRequest,start_data_collection_by_agent_ids_request +StartDataCollectionByAgentIdsResponse,start_data_collection_by_agent_ids_response +StartDataIngestionJobRequest,start_data_ingestion_job_request +StartDataIngestionJobResponse,start_data_ingestion_job_response +StartDataQualityRuleRecommendationRunRequest,start_data_quality_rule_recommendation_run_request +StartDataQualityRuleRecommendationRunResponse,start_data_quality_rule_recommendation_run_response +StartDataQualityRulesetEvaluationRunRequest,start_data_quality_ruleset_evaluation_run_request +StartDataQualityRulesetEvaluationRunResponse,start_data_quality_ruleset_evaluation_run_response +StartDataSourceSyncJobRequest,start_data_source_sync_job_request +StartDataSourceSyncJobResponse,start_data_source_sync_job_response +StartDate,start_date +StartDateTime,start_date_time +StartDeliveryStreamEncryptionInput,start_delivery_stream_encryption_input +StartDeploymentRequest,start_deployment_request +StartDeploymentResponse,start_deployment_response +StartDeploymentResult,start_deployment_result +StartDetectMitigationActionsTaskRequest,start_detect_mitigation_actions_task_request +StartDetectMitigationActionsTaskResponse,start_detect_mitigation_actions_task_response +StartDetectorModelAnalysisRequest,start_detector_model_analysis_request +StartDetectorModelAnalysisResponse,start_detector_model_analysis_response +StartDevEnvironmentRequest,start_dev_environment_request +StartDevEnvironmentResponse,start_dev_environment_response +StartDevEnvironmentSessionRequest,start_dev_environment_session_request +StartDevEnvironmentSessionResponse,start_dev_environment_session_response +StartDeviceAuthorizationRequest,start_device_authorization_request +StartDeviceAuthorizationResponse,start_device_authorization_response +StartDeviceSyncRequest,start_device_sync_request +StartDiscovererRequest,start_discoverer_request +StartDiscovererResponse,start_discoverer_response +StartDiscoveryJobRequest,start_discovery_job_request +StartDiscoveryJobResponse,start_discovery_job_response +StartDocumentAnalysisRequest,start_document_analysis_request +StartDocumentAnalysisResponse,start_document_analysis_response +StartDocumentClassificationJobRequest,start_document_classification_job_request +StartDocumentClassificationJobResponse,start_document_classification_job_response +StartDocumentTextDetectionRequest,start_document_text_detection_request +StartDocumentTextDetectionResponse,start_document_text_detection_response +StartDominantLanguageDetectionJobRequest,start_dominant_language_detection_job_request +StartDominantLanguageDetectionJobResponse,start_dominant_language_detection_job_response +StartEarthObservationJobInput,start_earth_observation_job_input +StartEarthObservationJobOutput,start_earth_observation_job_output +StartEdgeConfigurationUpdateInput,start_edge_configuration_update_input +StartEdgeConfigurationUpdateOutput,start_edge_configuration_update_output +StartEdgeDeploymentStageRequest,start_edge_deployment_stage_request +StartElasticsearchServiceSoftwareUpdateRequest,start_elasticsearch_service_software_update_request +StartElasticsearchServiceSoftwareUpdateResponse,start_elasticsearch_service_software_update_response +StartEngagementRequest,start_engagement_request +StartEngagementResult,start_engagement_result +StartEntitiesDetectionJobRequest,start_entities_detection_job_request +StartEntitiesDetectionJobResponse,start_entities_detection_job_response +StartEntitiesDetectionV2JobRequest,start_entities_detection_v2_job_request +StartEntitiesDetectionV2JobResponse,start_entities_detection_v2_job_response +StartError,start_error +StartEventDataStoreIngestionRequest,start_event_data_store_ingestion_request +StartEventTime,start_event_time +StartEventsDetectionJobRequest,start_events_detection_job_request +StartEventsDetectionJobResponse,start_events_detection_job_response +StartExecutionInput,start_execution_input +StartExecutionOutput,start_execution_output +StartExpenseAnalysisRequest,start_expense_analysis_request +StartExpenseAnalysisResponse,start_expense_analysis_response +StartExperimentRequest,start_experiment_request +StartExperimentResponse,start_experiment_response +StartExportLabelsTaskRunRequest,start_export_labels_task_run_request +StartExportLabelsTaskRunResponse,start_export_labels_task_run_response +StartExportRequest,start_export_request +StartExportResponse,start_export_response +StartExportTaskMessage,start_export_task_message +StartExportTaskRequest,start_export_task_request +StartExportTaskResponse,start_export_task_response +StartExtensionPackAssociationMessage,start_extension_pack_association_message +StartExtensionPackAssociationResponse,start_extension_pack_association_response +StartFHIRExportJobRequest,start_fhir_export_job_request +StartFHIRExportJobResponse,start_fhir_export_job_response +StartFHIRImportJobRequest,start_fhir_import_job_request +StartFHIRImportJobResponse,start_fhir_import_job_response +StartFaceDetectionRequest,start_face_detection_request +StartFaceDetectionResponse,start_face_detection_response +StartFaceSearchRequest,start_face_search_request +StartFaceSearchResponse,start_face_search_response +StartFailbackLaunchRequest,start_failback_launch_request +StartFailbackLaunchResponse,start_failback_launch_response +StartFailed,start_failed +StartFileTransferRequest,start_file_transfer_request +StartFileTransferResponse,start_file_transfer_response +StartFleetActionsInput,start_fleet_actions_input +StartFleetActionsOutput,start_fleet_actions_output +StartFleetRequest,start_fleet_request +StartFlowRequest,start_flow_request +StartFlowResponse,start_flow_response +StartFlywheelIterationRequest,start_flywheel_iteration_request +StartFlywheelIterationResponse,start_flywheel_iteration_response +StartFrameNumber,start_frame_number +StartFraudsterRegistrationJobRequest,start_fraudster_registration_job_request +StartFraudsterRegistrationJobResponse,start_fraudster_registration_job_response +StartFromRow,start_from_row +StartFuotaTaskRequest,start_fuota_task_request +StartGUISessionRequest,start_gui_session_request +StartGUISessionResult,start_gui_session_result +StartGameSessionPlacementInput,start_game_session_placement_input +StartGameSessionPlacementOutput,start_game_session_placement_output +StartGatewayInput,start_gateway_input +StartGatewayOutput,start_gateway_output +StartGeneratedCodeJobRequest,start_generated_code_job_request +StartGeneratedCodeJobResult,start_generated_code_job_result +StartHour,start_hour +StartHourOfDay,start_hour_of_day +StartHumanLoopRequest,start_human_loop_request +StartHumanLoopResponse,start_human_loop_response +StartICD10CMInferenceJobRequest,start_icd10_cm_inference_job_request +StartICD10CMInferenceJobResponse,start_icd10_cm_inference_job_response +StartImageBuilderRequest,start_image_builder_request +StartImageBuilderResult,start_image_builder_result +StartImagePipelineExecutionRequest,start_image_pipeline_execution_request +StartImagePipelineExecutionResponse,start_image_pipeline_execution_response +StartImageScanRequest,start_image_scan_request +StartImageScanResponse,start_image_scan_response +StartImportFileTaskRequest,start_import_file_task_request +StartImportFileTaskResponse,start_import_file_task_response +StartImportLabelsTaskRunRequest,start_import_labels_task_run_request +StartImportLabelsTaskRunResponse,start_import_labels_task_run_response +StartImportRequest,start_import_request +StartImportResponse,start_import_response +StartImportTaskRequest,start_import_task_request +StartImportTaskResponse,start_import_task_response +StartIncidentInput,start_incident_input +StartIncidentOutput,start_incident_output +StartInferenceExperimentRequest,start_inference_experiment_request +StartInferenceExperimentResponse,start_inference_experiment_response +StartInferenceSchedulerRequest,start_inference_scheduler_request +StartInferenceSchedulerResponse,start_inference_scheduler_response +StartIngestion,start_ingestion +StartIngestionRequest,start_ingestion_request +StartInputDeviceMaintenanceWindowRequest,start_input_device_maintenance_window_request +StartInputDeviceRequest,start_input_device_request +StartInstanceOnboardingJobRequest,start_instance_onboarding_job_request +StartInstanceOnboardingJobResponse,start_instance_onboarding_job_response +StartInstanceRefreshAnswer,start_instance_refresh_answer +StartInstanceRefreshType,start_instance_refresh_type +StartInstanceRequest,start_instance_request +StartInstanceResult,start_instance_result +StartInstancesRequest,start_instances_request +StartInstancesResult,start_instances_result +StartJobRequest,start_job_request +StartJobResult,start_job_result +StartJobRunRequest,start_job_run_request +StartJobRunResponse,start_job_run_response +StartKeyPhrasesDetectionJobRequest,start_key_phrases_detection_job_request +StartKeyPhrasesDetectionJobResponse,start_key_phrases_detection_job_response +StartKeyUsageInput,start_key_usage_input +StartKeyUsageOutput,start_key_usage_output +StartLabelDetectionRequest,start_label_detection_request +StartLabelDetectionResponse,start_label_detection_response +StartLambdaFunctionFailedEventAttributes,start_lambda_function_failed_event_attributes +StartLaunchRequest,start_launch_request +StartLaunchResponse,start_launch_response +StartLendingAnalysisRequest,start_lending_analysis_request +StartLendingAnalysisResponse,start_lending_analysis_response +StartLifecyclePolicyPreviewRequest,start_lifecycle_policy_preview_request +StartLifecyclePolicyPreviewResponse,start_lifecycle_policy_preview_response +StartLine,start_line +StartLoaderJobInput,start_loader_job_input +StartLoaderJobOutput,start_loader_job_output +StartLoggingRequest,start_logging_request +StartLoggingTime,start_logging_time +StartMLDataProcessingJobInput,start_ml_data_processing_job_input +StartMLDataProcessingJobOutput,start_ml_data_processing_job_output +StartMLEvaluationTaskRunRequest,start_ml_evaluation_task_run_request +StartMLEvaluationTaskRunResponse,start_ml_evaluation_task_run_response +StartMLLabelingSetGenerationTaskRunRequest,start_ml_labeling_set_generation_task_run_request +StartMLLabelingSetGenerationTaskRunResponse,start_ml_labeling_set_generation_task_run_response +StartMLModelTrainingJobInput,start_ml_model_training_job_input +StartMLModelTrainingJobOutput,start_ml_model_training_job_output +StartMLModelTransformJobInput,start_ml_model_transform_job_input +StartMLModelTransformJobOutput,start_ml_model_transform_job_output +StartMailboxExportJobRequest,start_mailbox_export_job_request +StartMailboxExportJobResponse,start_mailbox_export_job_response +StartMaintenanceRequest,start_maintenance_request +StartMaintenanceResponse,start_maintenance_response +StartMalwareScanRequest,start_malware_scan_request +StartMalwareScanResponse,start_malware_scan_response +StartMatchBackfillInput,start_match_backfill_input +StartMatchBackfillOutput,start_match_backfill_output +StartMatchingJobInput,start_matching_job_input +StartMatchingJobOutput,start_matching_job_output +StartMatchmakingInput,start_matchmaking_input +StartMatchmakingOutput,start_matchmaking_output +StartMedicalStreamTranscriptionRequest,start_medical_stream_transcription_request +StartMedicalStreamTranscriptionResponse,start_medical_stream_transcription_response +StartMedicalTranscriptionJobRequest,start_medical_transcription_job_request +StartMedicalTranscriptionJobResponse,start_medical_transcription_job_response +StartMeetingTranscriptionRequest,start_meeting_transcription_request +StartMessageMoveTaskRequest,start_message_move_task_request +StartMessageMoveTaskResult,start_message_move_task_result +StartMetadataModelAssessmentMessage,start_metadata_model_assessment_message +StartMetadataModelAssessmentResponse,start_metadata_model_assessment_response +StartMetadataModelConversionMessage,start_metadata_model_conversion_message +StartMetadataModelConversionResponse,start_metadata_model_conversion_response +StartMetadataModelExportAsScriptMessage,start_metadata_model_export_as_script_message +StartMetadataModelExportAsScriptResponse,start_metadata_model_export_as_script_response +StartMetadataModelExportToTargetMessage,start_metadata_model_export_to_target_message +StartMetadataModelExportToTargetResponse,start_metadata_model_export_to_target_response +StartMetadataModelImportMessage,start_metadata_model_import_message +StartMetadataModelImportResponse,start_metadata_model_import_response +StartMetricStreamsInput,start_metric_streams_input +StartMigrationMessage,start_migration_message +StartMigrationRequest,start_migration_request +StartMigrationResponse,start_migration_response +StartMigrationWorkflowRequest,start_migration_workflow_request +StartMigrationWorkflowResponse,start_migration_workflow_response +StartMinuteOfHour,start_minute_of_hour +StartMode,start_mode +StartModelPackagingJobRequest,start_model_packaging_job_request +StartModelPackagingJobResponse,start_model_packaging_job_response +StartModelRequest,start_model_request +StartModelResponse,start_model_response +StartMonitoringMemberRequest,start_monitoring_member_request +StartMonitoringMembersRequest,start_monitoring_members_request +StartMonitoringMembersResponse,start_monitoring_members_response +StartMonitoringScheduleRequest,start_monitoring_schedule_request +StartMulticastGroupSessionRequest,start_multicast_group_session_request +StartMultiplexRequest,start_multiplex_request +StartMultiplexResponse,start_multiplex_response +StartNetworkInsightsAccessScopeAnalysisRequest,start_network_insights_access_scope_analysis_request +StartNetworkInsightsAccessScopeAnalysisResult,start_network_insights_access_scope_analysis_result +StartNetworkInsightsAnalysisRequest,start_network_insights_analysis_request +StartNetworkInsightsAnalysisResult,start_network_insights_analysis_result +StartNetworkResourceUpdateRequest,start_network_resource_update_request +StartNetworkResourceUpdateResponse,start_network_resource_update_response +StartNextPendingJobExecutionRequest,start_next_pending_job_execution_request +StartNextPendingJobExecutionResponse,start_next_pending_job_execution_response +StartNotebookExecutionInput,start_notebook_execution_input +StartNotebookExecutionOutput,start_notebook_execution_output +StartNotebookInstanceInput,start_notebook_instance_input +StartObjectInput,start_object_input +StartObjectOutput,start_object_output +StartOnCreation,start_on_creation +StartOnDemandAppReplicationRequest,start_on_demand_app_replication_request +StartOnDemandAuditTaskRequest,start_on_demand_audit_task_request +StartOnDemandAuditTaskResponse,start_on_demand_audit_task_response +StartOnDemandReplicationRunRequest,start_on_demand_replication_run_request +StartOnDemandReplicationRunResponse,start_on_demand_replication_run_response +StartOrganizationServiceAccessUpdateRequest,start_organization_service_access_update_request +StartOrganizationServiceAccessUpdateResponse,start_organization_service_access_update_response +StartOutboundVoiceContactRequest,start_outbound_voice_contact_request +StartOutboundVoiceContactResponse,start_outbound_voice_contact_response +StartPHIDetectionJobRequest,start_phi_detection_job_request +StartPHIDetectionJobResponse,start_phi_detection_job_response +StartPercentage,start_percentage +StartPeriod,start_period +StartPersonTrackingRequest,start_person_tracking_request +StartPersonTrackingResponse,start_person_tracking_response +StartPiiEntitiesDetectionJobRequest,start_pii_entities_detection_job_request +StartPiiEntitiesDetectionJobResponse,start_pii_entities_detection_job_response +StartPipeRequest,start_pipe_request +StartPipeResponse,start_pipe_response +StartPipelineExecutionInput,start_pipeline_execution_input +StartPipelineExecutionOutput,start_pipeline_execution_output +StartPipelineExecutionRequest,start_pipeline_execution_request +StartPipelineExecutionResponse,start_pipeline_execution_response +StartPipelineReprocessingRequest,start_pipeline_reprocessing_request +StartPipelineReprocessingResponse,start_pipeline_reprocessing_response +StartPipelineRequest,start_pipeline_request +StartPipelineResponse,start_pipeline_response +StartPolicyGenerationRequest,start_policy_generation_request +StartPolicyGenerationResponse,start_policy_generation_response +StartPosition,start_position +StartProductSubscriptionRequest,start_product_subscription_request +StartProductSubscriptionResponse,start_product_subscription_response +StartProjectSessionRequest,start_project_session_request +StartProjectSessionResponse,start_project_session_response +StartProjectVersionRequest,start_project_version_request +StartProjectVersionResponse,start_project_version_response +StartProtectedQueryInput,start_protected_query_input +StartProtectedQueryOutput,start_protected_query_output +StartQueryExecutionInput,start_query_execution_input +StartQueryExecutionOutput,start_query_execution_output +StartQueryPlanningRequest,start_query_planning_request +StartQueryPlanningResponse,start_query_planning_response +StartQueryRequest,start_query_request +StartQueryResponse,start_query_response +StartReadSetActivationJobRequest,start_read_set_activation_job_request +StartReadSetActivationJobResponse,start_read_set_activation_job_response +StartReadSetActivationJobSourceItem,start_read_set_activation_job_source_item +StartReadSetExportJobRequest,start_read_set_export_job_request +StartReadSetExportJobResponse,start_read_set_export_job_response +StartReadSetImportJobRequest,start_read_set_import_job_request +StartReadSetImportJobResponse,start_read_set_import_job_response +StartReadSetImportJobSourceItem,start_read_set_import_job_source_item +StartRecommendationReportGenerationRequest,start_recommendation_report_generation_request +StartRecommendationReportGenerationResponse,start_recommendation_report_generation_response +StartRecommendationsRequest,start_recommendations_request +StartRecommendationsRequestEntry,start_recommendations_request_entry +StartRecommenderRequest,start_recommender_request +StartRecommenderResponse,start_recommender_response +StartRecordIdentifier,start_record_identifier +StartRecordName,start_record_name +StartRecordType,start_record_type +StartRecoveryRequest,start_recovery_request +StartRecoveryRequestSourceServer,start_recovery_request_source_server +StartRecoveryResponse,start_recovery_response +StartReferenceImportJobRequest,start_reference_import_job_request +StartReferenceImportJobResponse,start_reference_import_job_response +StartReferenceImportJobSourceItem,start_reference_import_job_source_item +StartRelationalDatabaseRequest,start_relational_database_request +StartRelationalDatabaseResult,start_relational_database_result +StartRemediationExecutionRequest,start_remediation_execution_request +StartRemediationExecutionResponse,start_remediation_execution_response +StartReplayRequest,start_replay_request +StartReplayResponse,start_replay_response +StartReplicationMessage,start_replication_message +StartReplicationRequest,start_replication_request +StartReplicationResponse,start_replication_response +StartReplicationTaskAssessmentMessage,start_replication_task_assessment_message +StartReplicationTaskAssessmentResponse,start_replication_task_assessment_response +StartReplicationTaskAssessmentRunMessage,start_replication_task_assessment_run_message +StartReplicationTaskAssessmentRunResponse,start_replication_task_assessment_run_response +StartReplicationTaskMessage,start_replication_task_message +StartReplicationTaskResponse,start_replication_task_response +StartReplicationTaskType,start_replication_task_type +StartReplicationType,start_replication_type +StartReportCreationInput,start_report_creation_input +StartReportJobInput,start_report_job_input +StartReportJobOutput,start_report_job_output +StartRequest,start_request +StartResourceEvaluationRequest,start_resource_evaluation_request +StartResourceEvaluationResponse,start_resource_evaluation_response +StartResourceScanRequest,start_resource_scan_request +StartRestoreJobInput,start_restore_job_input +StartRestoreJobOutput,start_restore_job_output +StartRetrainingSchedulerRequest,start_retraining_scheduler_request +StartRetrainingSchedulerResponse,start_retraining_scheduler_response +StartRouteAnalysisRequest,start_route_analysis_request +StartRouteAnalysisResponse,start_route_analysis_response +StartRowIndex,start_row_index +StartRunRequest,start_run_request +StartRunResponse,start_run_response +StartRxNormInferenceJobRequest,start_rx_norm_inference_job_request +StartRxNormInferenceJobResponse,start_rx_norm_inference_job_response +StartSNOMEDCTInferenceJobRequest,start_snomedct_inference_job_request +StartSNOMEDCTInferenceJobResponse,start_snomedct_inference_job_response +StartSavingsPlansPurchaseRecommendationGenerationResponse,start_savings_plans_purchase_recommendation_generation_response +StartSchemaCreationRequest,start_schema_creation_request +StartSchemaCreationResponse,start_schema_creation_response +StartSchemaExtensionRequest,start_schema_extension_request +StartSchemaExtensionResult,start_schema_extension_result +StartSchemaMergeRequest,start_schema_merge_request +StartSchemaMergeResponse,start_schema_merge_response +StartSegmentDetectionFilters,start_segment_detection_filters +StartSegmentDetectionRequest,start_segment_detection_request +StartSegmentDetectionResponse,start_segment_detection_response +StartSelector,start_selector +StartSelectorType,start_selector_type +StartSentimentDetectionJobRequest,start_sentiment_detection_job_request +StartSentimentDetectionJobResponse,start_sentiment_detection_job_response +StartServerRequest,start_server_request +StartServiceSoftwareUpdateRequest,start_service_software_update_request +StartServiceSoftwareUpdateResponse,start_service_software_update_response +StartSession,start_session +StartSessionRequest,start_session_request +StartSessionResponse,start_session_response +StartSessionResult,start_session_result +StartShotDetectionFilter,start_shot_detection_filter +StartSigningJobParameter,start_signing_job_parameter +StartSigningJobRequest,start_signing_job_request +StartSigningJobResponse,start_signing_job_response +StartSimulationInput,start_simulation_input +StartSimulationJobBatchRequest,start_simulation_job_batch_request +StartSimulationJobBatchResponse,start_simulation_job_batch_response +StartSimulationOutput,start_simulation_output +StartSingleWirelessDeviceImportTaskRequest,start_single_wireless_device_import_task_request +StartSingleWirelessDeviceImportTaskResponse,start_single_wireless_device_import_task_response +StartSmartHomeApplianceDiscoveryRequest,start_smart_home_appliance_discovery_request +StartSnapshotRequest,start_snapshot_request +StartSnapshotResponse,start_snapshot_response +StartSourceNetworkRecoveryRequest,start_source_network_recovery_request +StartSourceNetworkRecoveryRequestNetworkEntry,start_source_network_recovery_request_network_entry +StartSourceNetworkRecoveryResponse,start_source_network_recovery_response +StartSourceNetworkReplicationRequest,start_source_network_replication_request +StartSourceNetworkReplicationResponse,start_source_network_replication_response +StartSpeakerEnrollmentJobRequest,start_speaker_enrollment_job_request +StartSpeakerEnrollmentJobResponse,start_speaker_enrollment_job_response +StartSpeakerSearchTaskRequest,start_speaker_search_task_request +StartSpeakerSearchTaskResponse,start_speaker_search_task_response +StartSpeechSynthesisTaskInput,start_speech_synthesis_task_input +StartSpeechSynthesisTaskOutput,start_speech_synthesis_task_output +StartStackRequest,start_stack_request +StartStageDeploymentRequest,start_stage_deployment_request +StartStageDeploymentResult,start_stage_deployment_result +StartStreamEncryptionInput,start_stream_encryption_input +StartStreamProcessorRequest,start_stream_processor_request +StartStreamProcessorResponse,start_stream_processor_response +StartStreamTranscriptionRequest,start_stream_transcription_request +StartStreamTranscriptionResponse,start_stream_transcription_response +StartStreamingSessionRequest,start_streaming_session_request +StartStreamingSessionResponse,start_streaming_session_response +StartStudioSSOConfigurationRepairRequest,start_studio_sso_configuration_repair_request +StartStudioSSOConfigurationRepairResponse,start_studio_sso_configuration_repair_response +StartSubdivisionCode,start_subdivision_code +StartSuiteRunRequest,start_suite_run_request +StartSuiteRunResponse,start_suite_run_response +StartSupportDataExportRequest,start_support_data_export_request +StartSupportDataExportResult,start_support_data_export_result +StartSyncExecutionInput,start_sync_execution_input +StartSyncExecutionOutput,start_sync_execution_output +StartTableDataImportJobRequest,start_table_data_import_job_request +StartTableDataImportJobResult,start_table_data_import_job_result +StartTargetedSentimentDetectionJobRequest,start_targeted_sentiment_detection_job_request +StartTargetedSentimentDetectionJobResponse,start_targeted_sentiment_detection_job_response +StartTaskContactRequest,start_task_contact_request +StartTaskContactResponse,start_task_contact_response +StartTaskExecutionRequest,start_task_execution_request +StartTaskExecutionResponse,start_task_execution_response +StartTaskRequest,start_task_request +StartTaskResponse,start_task_response +StartTechnicalCueDetectionFilter,start_technical_cue_detection_filter +StartTestExecutionRequest,start_test_execution_request +StartTestExecutionResponse,start_test_execution_response +StartTestRequest,start_test_request +StartTestResponse,start_test_response +StartTestSetGenerationRequest,start_test_set_generation_request +StartTestSetGenerationResponse,start_test_set_generation_response +StartTextDetectionFilters,start_text_detection_filters +StartTextDetectionRequest,start_text_detection_request +StartTextDetectionResponse,start_text_detection_response +StartTextTranslationJobRequest,start_text_translation_job_request +StartTextTranslationJobResponse,start_text_translation_job_response +StartThingRegistrationTaskRequest,start_thing_registration_task_request +StartThingRegistrationTaskResponse,start_thing_registration_task_response +StartTime,start_time +StartTimeFilter,start_time_filter +StartTimeInclusive,start_time_inclusive +StartTimeMillis,start_time_millis +StartTimeOffset,start_time_offset +StartTimeRange,start_time_range +StartTimecode,start_timecode +StartTimecodeSMPTE,start_timecode_smpte +StartTimeout,start_timeout +StartTimerDecisionAttributes,start_timer_decision_attributes +StartTimerFailedEventAttributes,start_timer_failed_event_attributes +StartTimestamp,start_timestamp +StartTimestampMillis,start_timestamp_millis +StartTopicsDetectionJobRequest,start_topics_detection_job_request +StartTopicsDetectionJobResponse,start_topics_detection_job_response +StartTransaction,start_transaction +StartTransactionRequest,start_transaction_request +StartTransactionResponse,start_transaction_response +StartTransactionResult,start_transaction_result +StartTranscriptionJobRequest,start_transcription_job_request +StartTranscriptionJobResponse,start_transcription_job_response +StartTriggerRequest,start_trigger_request +StartTriggerResponse,start_trigger_response +StartUrl,start_url +StartUserAccessTasksRequest,start_user_access_tasks_request +StartUserAccessTasksResponse,start_user_access_tasks_response +StartUserImportJobRequest,start_user_import_job_request +StartUserImportJobResponse,start_user_import_job_response +StartValue,start_value +StartVariantImportRequest,start_variant_import_request +StartVariantImportResponse,start_variant_import_response +StartVectorEnrichmentJobInput,start_vector_enrichment_job_input +StartVectorEnrichmentJobOutput,start_vector_enrichment_job_output +StartViewerSessionRevocationRequest,start_viewer_session_revocation_request +StartVirtualMachinesMetadataSyncInput,start_virtual_machines_metadata_sync_input +StartVirtualMachinesMetadataSyncOutput,start_virtual_machines_metadata_sync_output +StartVoiceToneAnalysisTaskRequest,start_voice_tone_analysis_task_request +StartVoiceToneAnalysisTaskResponse,start_voice_tone_analysis_task_response +StartVpcEndpointServicePrivateDnsVerificationRequest,start_vpc_endpoint_service_private_dns_verification_request +StartVpcEndpointServicePrivateDnsVerificationResult,start_vpc_endpoint_service_private_dns_verification_result +StartWeekDay,start_week_day +StartWindowMinutes,start_window_minutes +StartWirelessDeviceImportTaskRequest,start_wireless_device_import_task_request +StartWirelessDeviceImportTaskResponse,start_wireless_device_import_task_response +StartWorkflowExecutionInput,start_workflow_execution_input +StartWorkflowRunRequest,start_workflow_run_request +StartWorkflowRunResponse,start_workflow_run_response +StartWorkspaceRequests,start_workspace_requests +StartWorkspacesRequest,start_workspaces_request +StartWorkspacesResult,start_workspaces_result +StartZonalShiftRequest,start_zonal_shift_request +Started,started +StartedAfter,started_after +StartedAt,started_at +StartedBefore,started_before +StartedBy,started_by +StartedOn,started_on +StartedTimestamp,started_timestamp +StartingAt,starting_at +StartingBlockIndex,starting_block_index +StartingEventBatchCondition,starting_event_batch_condition +StartingHashKey,starting_hash_key +StartingInstances,starting_instances +StartingObjectName,starting_object_name +StartingObjectPrefix,starting_object_prefix +StartingOffsets,starting_offsets +StartingPosition,starting_position +StartingPositionTimestamp,starting_position_timestamp +StartingSequenceNumber,starting_sequence_number +StartingTimestamp,starting_timestamp +StartoverWindowSeconds,startover_window_seconds +StartsWith,starts_with +StartupAction,startup_action +StartupScriptS3ObjectVersion,startup_script_s3_object_version +StartupScriptS3Path,startup_script_s3_path +Stat,stat +State,state +StateChangeConfiguration,state_change_configuration +StateChangeReason,state_change_reason +StateDB,state_db +StateDescription,state_description +StateEnteredEventDetails,state_entered_event_details +StateEquals,state_equals +StateExitedEventDetails,state_exited_event_details +StateFilter,state_filter +StateInfo,state_info +StateLastUpdatedDateTime,state_last_updated_date_time +StateMachineAliasListItem,state_machine_alias_list_item +StateMachineAlreadyExists,state_machine_already_exists +StateMachineArn,state_machine_arn +StateMachineDeleting,state_machine_deleting +StateMachineDoesNotExist,state_machine_does_not_exist +StateMachineLimitExceeded,state_machine_limit_exceeded +StateMachineListItem,state_machine_list_item +StateMachineTypeNotSupported,state_machine_type_not_supported +StateMachineVersionListItem,state_machine_version_list_item +StateMessage,state_message +StateOrProvince,state_or_province +StateOrRegion,state_or_region +StatePersistence,state_persistence +StatePersistenceConfigurations,state_persistence_configurations +StatePersistenceEnabled,state_persistence_enabled +StateReason,state_reason +StateReasonCode,state_reason_code +StateReasonData,state_reason_data +StateStartTimestamp,state_start_timestamp +StateTransitionReason,state_transition_reason +StateTransitionTime,state_transition_time +StateTransitionedTimestamp,state_transitioned_timestamp +StateUpdatedTimestamp,state_updated_timestamp +StateValue,state_value +StatefulDefaultActions,stateful_default_actions +StatefulEngineOptions,stateful_engine_options +StatefulRule,stateful_rule +StatefulRuleGroup,stateful_rule_group +StatefulRuleGroupOverride,stateful_rule_group_override +StatefulRuleGroupReference,stateful_rule_group_reference +StatefulRuleGroupReferences,stateful_rule_group_references +StatefulRuleGroups,stateful_rule_groups +StatefulRuleOptions,stateful_rule_options +StatefulRules,stateful_rules +StatelessCustomActionDefinition,stateless_custom_action_definition +StatelessCustomActions,stateless_custom_actions +StatelessCustomPublishMetricAction,stateless_custom_publish_metric_action +StatelessCustomPublishMetricActionDimension,stateless_custom_publish_metric_action_dimension +StatelessDefaultActions,stateless_default_actions +StatelessFragmentDefaultActions,stateless_fragment_default_actions +StatelessRule,stateless_rule +StatelessRuleGroup,stateless_rule_group +StatelessRuleGroupReference,stateless_rule_group_reference +StatelessRuleGroupReferences,stateless_rule_group_references +StatelessRuleGroups,stateless_rule_groups +StatelessRules,stateless_rules +StatelessRulesAndCustomActions,stateless_rules_and_custom_actions +Statement,statement +StatementData,statement_data +StatementId,statement_id +StatementName,statement_name +StatementOutput,statement_output +StatementOutputData,statement_output_data +StatementTimeoutException,statement_timeout_exception +StatementType,statement_type +Statements,statements +States,states +StatesArn,states_arn +StatesExecutionArn,states_execution_arn +StatesInput,states_input +StatesStatus,states_status +StaticColumn,static_column +StaticConfiguration,static_configuration +StaticHyperParameters,static_hyper_parameters +StaticImageActivateScheduleActionSettings,static_image_activate_schedule_action_settings +StaticImageActivateSettings,static_image_activate_settings +StaticImageDeactivateScheduleActionSettings,static_image_deactivate_schedule_action_settings +StaticImageDeactivateSettings,static_image_deactivate_settings +StaticIp,static_ip +StaticIpConnectionInfo,static_ip_connection_info +StaticKeyProvider,static_key_provider +StaticKeySettings,static_key_settings +StaticKeyValue,static_key_value +StaticMembers,static_members +StaticPolicyDefinition,static_policy_definition +StaticPolicyDefinitionDetail,static_policy_definition_detail +StaticPolicyDefinitionItem,static_policy_definition_item +StaticRoutesOnly,static_routes_only +StaticSourcesSupport,static_sources_support +StaticValue,static_value +StaticValues,static_values +Station,station +Statistic,statistic +StatisticOverride,statistic_override +StatisticSet,statistic_set +StatisticValues,statistic_values +StatisticalThreshold,statistical_threshold +Statistics,statistics +StatisticsConfiguration,statistics_configuration +StatisticsConfigurations,statistics_configurations +StatisticsData,statistics_data +StatisticsNotAvailableException,statistics_not_available_exception +StatisticsNotReadyYetException,statistics_not_ready_yet_exception +StatisticsResource,statistics_resource +StatisticsSummary,statistics_summary +StatisticsType,statistics_type +StatmuxSettings,statmux_settings +Stats,stats +StatsAtAnomaly,stats_at_anomaly +StatsAtBaseline,stats_at_baseline +StatsEvent,stats_event +Status,status +Status2xx,status2xx +Status3xx,status3xx +Status4xx,status4xx +Status5xx,status5xx +StatusArn,status_arn +StatusChangeDate,status_change_date +StatusCode,status_code +StatusCodes,status_codes +StatusDescription,status_description +StatusDetail,status_detail +StatusDetailFilters,status_detail_filters +StatusDetails,status_details +StatusEquals,status_equals +StatusFilter,status_filter +StatusFlag,status_flag +StatusInformation,status_information +StatusInfos,status_infos +StatusLastUpdatedDateTime,status_last_updated_date_time +StatusList,status_list +StatusMessage,status_message +StatusMessageCode,status_message_code +StatusName,status_name +StatusReason,status_reason +StatusReasonCode,status_reason_code +StatusReasons,status_reasons +StatusReport,status_report +StatusStartTime,status_start_time +StatusStartTimestamp,status_start_timestamp +StatusType,status_type +StatusUpdateInterval,status_update_interval +StatusUpdateReason,status_update_reason +Statuses,statuses +StdDev,std_dev +StdErrorS3Uri,std_error_s3_uri +StdEvent,std_event +StdOutS3Uri,std_out_s3_uri +Stddev,stddev +StemmingDictionary,stemming_dictionary +Step,step +StepAdjustment,step_adjustment +StepAdjustments,step_adjustments +StepAutomationConfiguration,step_automation_configuration +StepCancellationOption,step_cancellation_option +StepConcurrencyLevel,step_concurrency_level +StepConfig,step_config +StepCount,step_count +StepDescription,step_description +StepDetail,step_detail +StepDetails,step_details +StepDisplayName,step_display_name +StepExecution,step_execution +StepExecutionFilter,step_execution_filter +StepExecutionId,step_execution_id +StepExecutionStatusDetail,step_execution_status_detail +StepExecutions,step_executions +StepExecutionsTruncated,step_executions_truncated +StepFunctionStateMachineParameters,step_function_state_machine_parameters +StepFunctions,step_functions +StepFunctionsAction,step_functions_action +StepId,step_id +StepIds,step_ids +StepIndex,step_index +StepInfo,step_info +StepName,step_name +StepOutput,step_output +StepScalingPolicyConfiguration,step_scaling_policy_configuration +StepSize,step_size +StepStateChangeReason,step_state_change_reason +StepStates,step_states +StepStatus,step_status +StepSummary,step_summary +StepTimeline,step_timeline +StepType,step_type +Steps,steps +StepsCompleted,steps_completed +StepsList,steps_list +StereoDownmix,stereo_downmix +StillContainsLinksException,still_contains_links_exception +StillEstimating,still_estimating +StillWaitingResponseSpecification,still_waiting_response_specification +StopAccessLoggingInput,stop_access_logging_input +StopAction,stop_action +StopActivityStreamRequest,stop_activity_stream_request +StopActivityStreamResponse,stop_activity_stream_response +StopAppBlockBuilderRequest,stop_app_block_builder_request +StopAppBlockBuilderResult,stop_app_block_builder_result +StopAppInput,stop_app_input +StopAppReplicationRequest,stop_app_replication_request +StopApplicationRequest,stop_application_request +StopAssessmentRequest,stop_assessment_request +StopAssessmentRunRequest,stop_assessment_run_request +StopAutoMLJobRequest,stop_auto_ml_job_request +StopAutomationExecutionRequest,stop_automation_execution_request +StopBackupJobInput,stop_backup_job_input +StopBgpFailoverTestRequest,stop_bgp_failover_test_request +StopBgpFailoverTestResponse,stop_bgp_failover_test_response +StopBotRecommendationRequest,stop_bot_recommendation_request +StopBotRecommendationResponse,stop_bot_recommendation_response +StopBuildBatchInput,stop_build_batch_input +StopBuildBatchOutput,stop_build_batch_output +StopBuildInput,stop_build_input +StopBuildOutput,stop_build_output +StopBulkDeploymentRequest,stop_bulk_deployment_request +StopCalculationExecutionRequest,stop_calculation_execution_request +StopCalculationExecutionResponse,stop_calculation_execution_response +StopCampaignRequest,stop_campaign_request +StopCanaryRequest,stop_canary_request +StopChannelRequest,stop_channel_request +StopChannelResponse,stop_channel_response +StopClockInput,stop_clock_input +StopCompilationJobRequest,stop_compilation_job_request +StopConfigurationRecorderRequest,stop_configuration_recorder_request +StopContactRecordingRequest,stop_contact_recording_request +StopContactRequest,stop_contact_request +StopContactStreamingRequest,stop_contact_streaming_request +StopContinuousExportRequest,stop_continuous_export_request +StopContinuousExportResponse,stop_continuous_export_response +StopCrawlerRequest,stop_crawler_request +StopCrawlerScheduleRequest,stop_crawler_schedule_request +StopDBClusterMessage,stop_db_cluster_message +StopDBClusterResult,stop_db_cluster_result +StopDBInstanceAutomatedBackupsReplicationMessage,stop_db_instance_automated_backups_replication_message +StopDBInstanceAutomatedBackupsReplicationResult,stop_db_instance_automated_backups_replication_result +StopDBInstanceMessage,stop_db_instance_message +StopDBInstanceResult,stop_db_instance_result +StopDataCollectionByAgentIdsRequest,stop_data_collection_by_agent_ids_request +StopDataCollectionByAgentIdsResponse,stop_data_collection_by_agent_ids_response +StopDataSourceSyncJobRequest,stop_data_source_sync_job_request +StopDate,stop_date +StopDeliveryStreamEncryptionInput,stop_delivery_stream_encryption_input +StopDeploymentInput,stop_deployment_input +StopDeploymentOutput,stop_deployment_output +StopDeploymentRequest,stop_deployment_request +StopDevEnvironmentRequest,stop_dev_environment_request +StopDevEnvironmentResponse,stop_dev_environment_response +StopDevEnvironmentSessionRequest,stop_dev_environment_session_request +StopDevEnvironmentSessionResponse,stop_dev_environment_session_response +StopDiscovererRequest,stop_discoverer_request +StopDiscovererResponse,stop_discoverer_response +StopDiscoveryJobRequest,stop_discovery_job_request +StopDominantLanguageDetectionJobRequest,stop_dominant_language_detection_job_request +StopDominantLanguageDetectionJobResponse,stop_dominant_language_detection_job_response +StopEarthObservationJobInput,stop_earth_observation_job_input +StopEdgeDeploymentStageRequest,stop_edge_deployment_stage_request +StopEdgePackagingJobRequest,stop_edge_packaging_job_request +StopEngagementRequest,stop_engagement_request +StopEntitiesDetectionJobRequest,stop_entities_detection_job_request +StopEntitiesDetectionJobResponse,stop_entities_detection_job_response +StopEntitiesDetectionV2JobRequest,stop_entities_detection_v2_job_request +StopEntitiesDetectionV2JobResponse,stop_entities_detection_v2_job_response +StopEventDataStoreIngestionRequest,stop_event_data_store_ingestion_request +StopEventsDetectionJobRequest,stop_events_detection_job_request +StopEventsDetectionJobResponse,stop_events_detection_job_response +StopExecutionInput,stop_execution_input +StopExecutionOutput,stop_execution_output +StopExecutionTrigger,stop_execution_trigger +StopExperimentRequest,stop_experiment_request +StopExperimentResponse,stop_experiment_response +StopFailbackRequest,stop_failback_request +StopFailed,stop_failed +StopFleetActionsInput,stop_fleet_actions_input +StopFleetActionsOutput,stop_fleet_actions_output +StopFleetRequest,stop_fleet_request +StopFlowRequest,stop_flow_request +StopFlowResponse,stop_flow_response +StopGUISessionRequest,stop_gui_session_request +StopGUISessionResult,stop_gui_session_result +StopGameSessionPlacementInput,stop_game_session_placement_input +StopGameSessionPlacementOutput,stop_game_session_placement_output +StopHumanLoopRequest,stop_human_loop_request +StopHyperParameterTuningJobRequest,stop_hyper_parameter_tuning_job_request +StopICD10CMInferenceJobRequest,stop_icd10_cm_inference_job_request +StopICD10CMInferenceJobResponse,stop_icd10_cm_inference_job_response +StopImageBuilderRequest,stop_image_builder_request +StopImageBuilderResult,stop_image_builder_result +StopImportRequest,stop_import_request +StopImportResponse,stop_import_response +StopInferenceExperimentRequest,stop_inference_experiment_request +StopInferenceExperimentResponse,stop_inference_experiment_response +StopInferenceRecommendationsJobRequest,stop_inference_recommendations_job_request +StopInferenceSchedulerRequest,stop_inference_scheduler_request +StopInferenceSchedulerResponse,stop_inference_scheduler_response +StopIngestionRequest,stop_ingestion_request +StopInputDeviceRequest,stop_input_device_request +StopInstanceOnIdleRequest,stop_instance_on_idle_request +StopInstanceRequest,stop_instance_request +StopInstanceResult,stop_instance_result +StopInstancesRequest,stop_instances_request +StopInstancesResult,stop_instances_result +StopJobOnFailureOptions,stop_job_on_failure_options +StopJobOnFailureTiming,stop_job_on_failure_timing +StopJobRequest,stop_job_request +StopJobResult,stop_job_result +StopJobRunRequest,stop_job_run_request +StopJobRunResponse,stop_job_run_response +StopKeyPhrasesDetectionJobRequest,stop_key_phrases_detection_job_request +StopKeyPhrasesDetectionJobResponse,stop_key_phrases_detection_job_response +StopKeyUsageInput,stop_key_usage_input +StopKeyUsageOutput,stop_key_usage_output +StopLabelingJobRequest,stop_labeling_job_request +StopLaunchRequest,stop_launch_request +StopLaunchResponse,stop_launch_response +StopLoggingRequest,stop_logging_request +StopLoggingTime,stop_logging_time +StopMatchmakingInput,stop_matchmaking_input +StopMeetingTranscriptionRequest,stop_meeting_transcription_request +StopMetricStreamsInput,stop_metric_streams_input +StopMigrationWorkflowRequest,stop_migration_workflow_request +StopMigrationWorkflowResponse,stop_migration_workflow_response +StopModelCustomizationJobRequest,stop_model_customization_job_request +StopModelRequest,stop_model_request +StopModelResponse,stop_model_response +StopMonitoringMembersRequest,stop_monitoring_members_request +StopMonitoringMembersResponse,stop_monitoring_members_response +StopMonitoringScheduleRequest,stop_monitoring_schedule_request +StopMultiplexRequest,stop_multiplex_request +StopMultiplexResponse,stop_multiplex_response +StopNotebookExecutionInput,stop_notebook_execution_input +StopNotebookInstanceInput,stop_notebook_instance_input +StopPHIDetectionJobRequest,stop_phi_detection_job_request +StopPHIDetectionJobResponse,stop_phi_detection_job_response +StopPiiEntitiesDetectionJobRequest,stop_pii_entities_detection_job_request +StopPiiEntitiesDetectionJobResponse,stop_pii_entities_detection_job_response +StopPipeRequest,stop_pipe_request +StopPipeResponse,stop_pipe_response +StopPipelineExecutionInput,stop_pipeline_execution_input +StopPipelineExecutionOutput,stop_pipeline_execution_output +StopPipelineExecutionRequest,stop_pipeline_execution_request +StopPipelineExecutionResponse,stop_pipeline_execution_response +StopPipelineRequest,stop_pipeline_request +StopPipelineResponse,stop_pipeline_response +StopProcessingJobRequest,stop_processing_job_request +StopProductSubscriptionRequest,stop_product_subscription_request +StopProductSubscriptionResponse,stop_product_subscription_response +StopProjectVersionRequest,stop_project_version_request +StopProjectVersionResponse,stop_project_version_response +StopQueryExecutionInput,stop_query_execution_input +StopQueryRequest,stop_query_request +StopQueryResponse,stop_query_response +StopReason,stop_reason +StopRecommenderRequest,stop_recommender_request +StopRecommenderResponse,stop_recommender_response +StopRelationalDatabaseRequest,stop_relational_database_request +StopRelationalDatabaseResult,stop_relational_database_result +StopRemoteAccessSessionRequest,stop_remote_access_session_request +StopRemoteAccessSessionResult,stop_remote_access_session_result +StopReplicationMessage,stop_replication_message +StopReplicationRequest,stop_replication_request +StopReplicationResponse,stop_replication_response +StopReplicationTaskMessage,stop_replication_task_message +StopReplicationTaskResponse,stop_replication_task_response +StopReplicationToReplicaRequest,stop_replication_to_replica_request +StopReplicationToReplicaResponse,stop_replication_to_replica_response +StopRequest,stop_request +StopResourceRequest,stop_resource_request +StopRetrainingSchedulerRequest,stop_retraining_scheduler_request +StopRetrainingSchedulerResponse,stop_retraining_scheduler_response +StopRunRequest,stop_run_request +StopRunResult,stop_run_result +StopRxNormInferenceJobRequest,stop_rx_norm_inference_job_request +StopRxNormInferenceJobResponse,stop_rx_norm_inference_job_response +StopSNOMEDCTInferenceJobRequest,stop_snomedct_inference_job_request +StopSNOMEDCTInferenceJobResponse,stop_snomedct_inference_job_response +StopSelector,stop_selector +StopSentimentDetectionJobRequest,stop_sentiment_detection_job_request +StopSentimentDetectionJobResponse,stop_sentiment_detection_job_response +StopServerRequest,stop_server_request +StopSessionRequest,stop_session_request +StopSessionResponse,stop_session_response +StopSimulationInput,stop_simulation_input +StopSolutionVersionCreationRequest,stop_solution_version_creation_request +StopSourceNetworkReplicationRequest,stop_source_network_replication_request +StopSourceNetworkReplicationResponse,stop_source_network_replication_response +StopSpeakerSearchTaskRequest,stop_speaker_search_task_request +StopStackRequest,stop_stack_request +StopStackSetOperationInput,stop_stack_set_operation_input +StopStreamEncryptionInput,stop_stream_encryption_input +StopStreamProcessorRequest,stop_stream_processor_request +StopStreamRequest,stop_stream_request +StopStreamingSessionRequest,stop_streaming_session_request +StopStreamingSessionResponse,stop_streaming_session_response +StopSuiteRunRequest,stop_suite_run_request +StopTargetedSentimentDetectionJobRequest,stop_targeted_sentiment_detection_job_request +StopTargetedSentimentDetectionJobResponse,stop_targeted_sentiment_detection_job_response +StopTaskRequest,stop_task_request +StopTaskResponse,stop_task_response +StopTextTranslationJobRequest,stop_text_translation_job_request +StopTextTranslationJobResponse,stop_text_translation_job_response +StopThingRegistrationTaskRequest,stop_thing_registration_task_request +StopTime,stop_time +StopTimecode,stop_timecode +StopTimeout,stop_timeout +StopTimestamp,stop_timestamp +StopTrainingDocumentClassifierRequest,stop_training_document_classifier_request +StopTrainingEntityRecognizerRequest,stop_training_entity_recognizer_request +StopTrainingJobRequest,stop_training_job_request +StopTransformJobRequest,stop_transform_job_request +StopTriggerRequest,stop_trigger_request +StopTriggerResponse,stop_trigger_response +StopUserImportJobRequest,stop_user_import_job_request +StopUserImportJobResponse,stop_user_import_job_response +StopVectorEnrichmentJobInput,stop_vector_enrichment_job_input +StopVoiceToneAnalysisTaskRequest,stop_voice_tone_analysis_task_request +StopWorkflowRunRequest,stop_workflow_run_request +StopWorkspaceRequests,stop_workspace_requests +StopWorkspacesRequest,stop_workspaces_request +StopWorkspacesResult,stop_workspaces_result +Stopped,stopped +StoppedActions,stopped_actions +StoppedSince,stopped_since +Stopping,stopping +StoppingCondition,stopping_condition +StoppingConditions,stopping_conditions +StoppingInstances,stopping_instances +Stops,stops +Stopwords,stopwords +Storage,storage +StorageAllocatedInBytes,storage_allocated_in_bytes +StorageCapacity,storage_capacity +StorageCapacityQuotaGiB,storage_capacity_quota_gib +StorageCapacityReservationGiB,storage_capacity_reservation_gib +StorageCapacityUnits,storage_capacity_units +StorageClass,storage_class +StorageClassAnalysis,storage_class_analysis +StorageClassAnalysisDataExport,storage_class_analysis_data_export +StorageConfig,storage_config +StorageConfigs,storage_configs +StorageConfiguration,storage_configuration +StorageConnector,storage_connector +StorageConnectors,storage_connectors +StorageDescriptor,storage_descriptor +StorageEfficiencyEnabled,storage_efficiency_enabled +StorageEncrypted,storage_encrypted +StorageGB,storage_gb +StorageGatewayError,storage_gateway_error +StorageInfo,storage_info +StorageIops,storage_iops +StorageJobId,storage_job_id +StorageLensArn,storage_lens_arn +StorageLensAwsOrg,storage_lens_aws_org +StorageLensConfiguration,storage_lens_configuration +StorageLensConfigurationList,storage_lens_configuration_list +StorageLensDataExport,storage_lens_data_export +StorageLensDataExportEncryption,storage_lens_data_export_encryption +StorageLensTag,storage_lens_tag +StorageLimit,storage_limit +StorageLimitExceededException,storage_limit_exceeded_exception +StorageLimitWillExceedException,storage_limit_will_exceed_exception +StorageLocation,storage_location +StorageMetrics,storage_metrics +StorageMode,storage_mode +StorageOptimizer,storage_optimizer +StorageOptimizerConfig,storage_optimizer_config +StorageOptimizerList,storage_optimizer_list +StorageOptimizerType,storage_optimizer_type +StorageQuotaExceededFault,storage_quota_exceeded_fault +StorageResolution,storage_resolution +StorageRule,storage_rule +StorageRuleType,storage_rule_type +StorageSize,storage_size +StorageSubTypeName,storage_sub_type_name +StorageSystemArn,storage_system_arn +StorageSystemListEntry,storage_system_list_entry +StorageSystems,storage_systems +StorageThroughput,storage_throughput +StorageThroughputToIopsRatio,storage_throughput_to_iops_ratio +StorageTier,storage_tier +StorageType,storage_type +StorageTypeLimit,storage_type_limit +StorageTypeLimits,storage_type_limits +StorageTypeName,storage_type_name +StorageTypeNotAvailableFault,storage_type_not_available_fault +StorageTypeNotSupportedFault,storage_type_not_supported_fault +StorageTypes,storage_types +StorageUnit,storage_unit +StorageUtilizedInBytes,storage_utilized_in_bytes +StorageVirtualMachine,storage_virtual_machine +StorageVirtualMachineArn,storage_virtual_machine_arn +StorageVirtualMachineFilter,storage_virtual_machine_filter +StorageVirtualMachineId,storage_virtual_machine_id +StorageVirtualMachineIds,storage_virtual_machine_ids +StorageVirtualMachineNotFound,storage_virtual_machine_not_found +StorageVirtualMachineRoot,storage_virtual_machine_root +StorageVirtualMachines,storage_virtual_machines +StorageVolumeType,storage_volume_type +StoreImageTaskResult,store_image_task_result +StoreImageTaskResults,store_image_task_results +StoreTaskFailureReason,store_task_failure_reason +StoreTaskState,store_task_state +StoredAsSubDirectories,stored_as_sub_directories +StoredQuery,stored_query +StoredQueryMetadata,stored_query_metadata +StorediSCSIVolume,storedi_scsi_volume +StorediSCSIVolumes,storedi_scsi_volumes +Strategy,strategy +StrategyConfig,strategy_config +StrategyOnFullSize,strategy_on_full_size +StrategyOption,strategy_option +StrategySummary,strategy_summary +Stream,stream +StreamARN,stream_arn +StreamArn,stream_arn +StreamChannelDefinition,stream_channel_definition +StreamConfiguration,stream_configuration +StreamConfigurationCreate,stream_configuration_create +StreamConfigurationSessionBackup,stream_configuration_session_backup +StreamConfigurationSessionStorage,stream_configuration_session_storage +StreamCreationTimestamp,stream_creation_timestamp +StreamDescription,stream_description +StreamDescriptionSummary,stream_description_summary +StreamEdgeConfigurationNotFoundException,stream_edge_configuration_not_found_exception +StreamEnabled,stream_enabled +StreamEncryption,stream_encryption +StreamEvent,stream_event +StreamExceptionPolicy,stream_exception_policy +StreamFile,stream_file +StreamFilters,stream_filters +StreamId,stream_id +StreamInfResolution,stream_inf_resolution +StreamInfo,stream_info +StreamInfoList,stream_info_list +StreamJournalToKinesisRequest,stream_journal_to_kinesis_request +StreamJournalToKinesisResponse,stream_journal_to_kinesis_response +StreamKey,stream_key +StreamKeySummary,stream_key_summary +StreamLabel,stream_label +StreamManifestBehavior,stream_manifest_behavior +StreamMode,stream_mode +StreamModeDetails,stream_mode_details +StreamName,stream_name +StreamNameCondition,stream_name_condition +StreamNames,stream_names +StreamOrder,stream_order +StreamProcessingStartSelector,stream_processing_start_selector +StreamProcessingStopSelector,stream_processing_stop_selector +StreamProcessor,stream_processor +StreamProcessorArn,stream_processor_arn +StreamProcessorDataSharingPreference,stream_processor_data_sharing_preference +StreamProcessorInput,stream_processor_input +StreamProcessorNotificationChannel,stream_processor_notification_channel +StreamProcessorOutput,stream_processor_output +StreamProcessorSettings,stream_processor_settings +StreamProcessorSettingsForUpdate,stream_processor_settings_for_update +StreamProcessors,stream_processors +StreamRecord,stream_record +StreamRecordsNotFoundException,stream_records_not_found_exception +StreamSelection,stream_selection +StreamSession,stream_session +StreamSessionSummary,stream_session_summary +StreamSpecification,stream_specification +StreamStatus,stream_status +StreamSummaries,stream_summaries +StreamSummary,stream_summary +StreamType,stream_type +StreamUnavailable,stream_unavailable +StreamUrl,stream_url +StreamView,stream_view +StreamViewType,stream_view_type +StreamingConfiguration,streaming_configuration +StreamingConfigurations,streaming_configurations +StreamingDataPreviewOptions,streaming_data_preview_options +StreamingDistribution,streaming_distribution +StreamingDistributionAlreadyExists,streaming_distribution_already_exists +StreamingDistributionConfig,streaming_distribution_config +StreamingDistributionConfigWithTags,streaming_distribution_config_with_tags +StreamingDistributionList,streaming_distribution_list +StreamingDistributionNotDisabled,streaming_distribution_not_disabled +StreamingDistributionSummary,streaming_distribution_summary +StreamingEndpointArn,streaming_endpoint_arn +StreamingExperienceSettings,streaming_experience_settings +StreamingId,streaming_id +StreamingImage,streaming_image +StreamingImageEncryptionConfiguration,streaming_image_encryption_configuration +StreamingLoggingConfig,streaming_logging_config +StreamingNotificationTarget,streaming_notification_target +StreamingNotificationTargets,streaming_notification_targets +StreamingOptions,streaming_options +StreamingSession,streaming_session +StreamingSessionBackup,streaming_session_backup +StreamingSessionStorageRoot,streaming_session_storage_root +StreamingSessionStream,streaming_session_stream +StreamingStatus,streaming_status +StreamingURL,streaming_url +Streams,streams +Street,street +Street1,street1 +Street2,street2 +Street3,street3 +StreetAddress,street_address +StreetInfo,street_info +StreetNumber,street_number +Strength,strength +StrictTransportSecurity,strict_transport_security +StringAttributeConstraints,string_attribute_constraints +StringAttributeConstraintsType,string_attribute_constraints_type +StringColumnStatisticsData,string_column_statistics_data +StringCondition,string_condition +StringDatasetParameter,string_dataset_parameter +StringDatasetParameterDefaultValues,string_dataset_parameter_default_values +StringDefaultValues,string_default_values +StringEquals,string_equals +StringFilter,string_filter +StringFormatConfiguration,string_format_configuration +StringLike,string_like +StringListValue,string_list_value +StringListValues,string_list_values +StringNotEquals,string_not_equals +StringNotLike,string_not_like +StringParameter,string_parameter +StringParameterDeclaration,string_parameter_declaration +StringParameters,string_parameters +StringReference,string_reference +StringStaticValues,string_static_values +StringValue,string_value +StringValueList,string_value_list +StringValueWhenUnsetConfiguration,string_value_when_unset_configuration +StringValues,string_values +StripeSizeBytes,stripe_size_bytes +StrongKeyProtectionRequired,strong_key_protection_required +StructValue,struct_value +StructuredLogDestinations,structured_log_destinations +Studio,studio +StudioArn,studio_arn +StudioComponent,studio_component +StudioComponentInitializationScript,studio_component_initialization_script +StudioComponentSummary,studio_component_summary +StudioEncryptionConfiguration,studio_encryption_configuration +StudioId,studio_id +StudioLifecycleConfigAppType,studio_lifecycle_config_app_type +StudioLifecycleConfigArn,studio_lifecycle_config_arn +StudioLifecycleConfigContent,studio_lifecycle_config_content +StudioLifecycleConfigDetails,studio_lifecycle_config_details +StudioLifecycleConfigName,studio_lifecycle_config_name +StudioLifecycleConfigs,studio_lifecycle_configs +StudioMembership,studio_membership +StudioSummary,studio_summary +Studios,studios +Style,style +StyleConfiguration,style_configuration +StyleControl,style_control +StyleOptions,style_options +StylePassthrough,style_passthrough +StyleTargets,style_targets +SubBands,sub_bands +SubChannelId,sub_channel_id +SubChannelSummary,sub_channel_summary +SubChannels,sub_channels +SubDomain,sub_domain +SubDomainSetting,sub_domain_setting +SubErrorCode,sub_error_code +SubErrorCodeReason,sub_error_code_reason +SubExpressions,sub_expressions +SubJobMetadata,sub_job_metadata +SubModule,sub_module +SubRegion,sub_region +SubResourceSummary,sub_resource_summary +SubResources,sub_resources +SubSegmentNum,sub_segment_num +SubSegmentsExpected,sub_segments_expected +SubSlotSetting,sub_slot_setting +SubSlotTypeComposition,sub_slot_type_composition +SubSlotValueElicitationSetting,sub_slot_value_elicitation_setting +SubStages,sub_stages +SubStatementData,sub_statement_data +SubStatements,sub_statements +SubType,sub_type +SubTypeCountLimitExceededException,sub_type_count_limit_exceeded_exception +SubTypeName,sub_type_name +Subdirectory,subdirectory +Subdivision,subdivision +SubdivisionCode,subdivision_code +SubdivisionName,subdivision_name +SubgopLength,subgop_length +Subject,subject +SubjectAlternativeNameMatchers,subject_alternative_name_matchers +SubjectAlternativeNameSummaries,subject_alternative_name_summaries +SubjectAlternativeNames,subject_alternative_names +SubjectDetail,subject_detail +SubjectDetailResponse,subject_detail_response +SubjectFromWebIdentityToken,subject_from_web_identity_token +SubjectId,subject_id +SubjectInformationAccess,subject_information_access +SubjectKey,subject_key +SubjectNameFlags,subject_name_flags +SubjectNameFlagsV2,subject_name_flags_v2 +SubjectNameFlagsV3,subject_name_flags_v3 +SubjectNameFlagsV4,subject_name_flags_v4 +SubjectPart,subject_part +SubjectStructure,subject_structure +SubjectSummary,subject_summary +SubjectType,subject_type +SubmissionDateTime,submission_date_time +SubmitAttachmentStateChangesRequest,submit_attachment_state_changes_request +SubmitAttachmentStateChangesResponse,submit_attachment_state_changes_response +SubmitContactEvaluationRequest,submit_contact_evaluation_request +SubmitContactEvaluationResponse,submit_contact_evaluation_response +SubmitContainerStateChangeRequest,submit_container_state_change_request +SubmitContainerStateChangeResponse,submit_container_state_change_response +SubmitFeedbackRequest,submit_feedback_request +SubmitJobRequest,submit_job_request +SubmitJobResponse,submit_job_response +SubmitMultiRegionAccessPointRoutesRequest,submit_multi_region_access_point_routes_request +SubmitTaskStateChangeRequest,submit_task_state_change_request +SubmitTaskStateChangeResponse,submit_task_state_change_response +SubmitTime,submit_time +SubmitTimeAfter,submit_time_after +SubmitTimeBefore,submit_time_before +SubmitTimeMillis,submit_time_millis +SubmittedAfter,submitted_after +SubmittedAfterTime,submitted_after_time +SubmittedAt,submitted_at +SubmittedBefore,submitted_before +SubmittedBeforeTime,submitted_before_time +SubmittedDate,submitted_date +SubmittedJobsCount,submitted_jobs_count +SubmittedSince,submitted_since +SubmittedTime,submitted_time +Subnet,subnet +SubnetAlreadyInUse,subnet_already_in_use +SubnetArn,subnet_arn +SubnetArns,subnet_arns +SubnetAssociation,subnet_association +SubnetAvailabilityZone,subnet_availability_zone +SubnetAvailabilityZoneId,subnet_availability_zone_id +SubnetChangeProtection,subnet_change_protection +SubnetCidrBlockState,subnet_cidr_block_state +SubnetCidrReservation,subnet_cidr_reservation +SubnetCidrReservationId,subnet_cidr_reservation_id +SubnetConfiguration,subnet_configuration +SubnetConfigurations,subnet_configurations +SubnetGroup,subnet_group +SubnetGroupAlreadyExistsFault,subnet_group_already_exists_fault +SubnetGroupIdentifier,subnet_group_identifier +SubnetGroupInUseFault,subnet_group_in_use_fault +SubnetGroupName,subnet_group_name +SubnetGroupNames,subnet_group_names +SubnetGroupNotFoundFault,subnet_group_not_found_fault +SubnetGroupQuotaExceededFault,subnet_group_quota_exceeded_fault +SubnetGroupStatus,subnet_group_status +SubnetGroups,subnet_groups +SubnetIPAddressLimitReachedException,subnet_ip_address_limit_reached_exception +SubnetId,subnet_id +SubnetIdList,subnet_id_list +SubnetIdUpdates,subnet_id_updates +SubnetIdentifier,subnet_identifier +SubnetIds,subnet_ids +SubnetInUse,subnet_in_use +SubnetIpv4CidrReservations,subnet_ipv4_cidr_reservations +SubnetIpv6CidrBlockAssociation,subnet_ipv6_cidr_block_association +SubnetIpv6CidrReservations,subnet_ipv6_cidr_reservations +SubnetMapping,subnet_mapping +SubnetMappings,subnet_mappings +SubnetMask,subnet_mask +SubnetNotAllowedFault,subnet_not_allowed_fault +SubnetNotFound,subnet_not_found +SubnetNotFoundException,subnet_not_found_exception +SubnetOfMatches,subnet_of_matches +SubnetOutpost,subnet_outpost +SubnetOutpostArn,subnet_outpost_arn +SubnetQuotaExceededFault,subnet_quota_exceeded_fault +SubnetRouteTable,subnet_route_table +SubnetStatus,subnet_status +Subnets,subnets +SubscribeInput,subscribe_input +SubscribePattern,subscribe_pattern +SubscribeRequest,subscribe_request +SubscribeResponse,subscribe_response +SubscribeResult,subscribe_result +SubscribeToDatasetRequest,subscribe_to_dataset_request +SubscribeToEventRequest,subscribe_to_event_request +SubscribeToShardEvent,subscribe_to_shard_event +SubscribeToShardInput,subscribe_to_shard_input +SubscribeToShardOutput,subscribe_to_shard_output +SubscribedAt,subscribed_at +SubscribedDomain,subscribed_domain +SubscribedDomains,subscribed_domains +SubscribedRuleGroupSummary,subscribed_rule_group_summary +SubscribedWorkteam,subscribed_workteam +SubscribedWorkteams,subscribed_workteams +Subscriber,subscriber +SubscriberResource,subscriber_resource +Subscribers,subscribers +Subscription,subscription +SubscriptionAlreadyExistFault,subscription_already_exist_fault +SubscriptionArn,subscription_arn +SubscriptionArnList,subscription_arn_list +SubscriptionCategoryNotFoundFault,subscription_category_not_found_fault +SubscriptionCreatedDateTime,subscription_created_date_time +SubscriptionCreationTime,subscription_creation_time +SubscriptionDefinitionId,subscription_definition_id +SubscriptionDefinitionVersion,subscription_definition_version +SubscriptionDefinitionVersionArn,subscription_definition_version_arn +SubscriptionDefinitionVersionId,subscription_definition_version_id +SubscriptionEndDate,subscription_end_date +SubscriptionErrors,subscription_errors +SubscriptionEventIdNotFoundFault,subscription_event_id_not_found_fault +SubscriptionExpiryDate,subscription_expiry_date +SubscriptionFilter,subscription_filter +SubscriptionId,subscription_id +SubscriptionLimitExceededException,subscription_limit_exceeded_exception +SubscriptionLimits,subscription_limits +SubscriptionName,subscription_name +SubscriptionNotFoundFault,subscription_not_found_fault +SubscriptionSeverityNotFoundFault,subscription_severity_not_found_fault +SubscriptionStartDate,subscription_start_date +SubscriptionState,subscription_state +SubscriptionStatus,subscription_status +SubscriptionType,subscription_type +Subscriptions,subscriptions +SubstatementType,substatement_type +SubstitutionMap,substitution_map +Substitutions,substitutions +Substring,substring +SubsystemId,subsystem_id +SubsystemVendorId,subsystem_vendor_id +Subtitle,subtitle +SubtitleFileUris,subtitle_file_uris +Subtitles,subtitles +SubtitlesOutput,subtitles_output +SubtitlingType,subtitling_type +SubtotalOptions,subtotal_options +Subtype,subtype +Succeeded,succeeded +SucceededActions,succeeded_actions +SucceededCount,succeeded_count +Success,success +SuccessCodes,success_codes +SuccessCount,success_count +SuccessForeground,success_foreground +SuccessRedirectionURL,success_redirection_url +SuccessResponseHandlingConfig,success_response_handling_config +SuccessRetentionPeriodInDays,success_retention_period_in_days +SuccessSteps,success_steps +SuccessStrings,success_strings +SuccessTopic,success_topic +SuccessValues,success_values +Successes,successes +Successful,successful +SuccessfulCampaignStateResponse,successful_campaign_state_response +SuccessfulEndpointCount,successful_endpoint_count +SuccessfulFleetCancellations,successful_fleet_cancellations +SuccessfulFleetDeletions,successful_fleet_deletions +SuccessfulFleetRequests,successful_fleet_requests +SuccessfulInstanceCreditSpecificationItem,successful_instance_credit_specification_item +SuccessfulInstanceCreditSpecifications,successful_instance_credit_specifications +SuccessfulLoginAttempts,successful_login_attempts +SuccessfulPackageVersionInfo,successful_package_version_info +SuccessfulQueuedPurchaseDeletion,successful_queued_purchase_deletion +SuccessfulQueuedPurchaseDeletions,successful_queued_purchase_deletions +SuccessfulRequest,successful_request +SuccessfulResponse,successful_response +SuccessfulShares,successful_shares +SuccessfulSubmissions,successful_submissions +SuccessfullyAssociatedResources,successfully_associated_resources +SuccessfullyDeletedLaunchTemplateVersions,successfully_deleted_launch_template_versions +SuccessfullyDisassociatedResources,successfully_disassociated_resources +Suffix,suffix +SuggestModel,suggest_model +SuggestRequest,suggest_request +SuggestResponse,suggest_response +SuggestStatus,suggest_status +Suggestable,suggestable +SuggestableConfig,suggestable_config +SuggestableConfigList,suggestable_config_list +SuggestedAccounts,suggested_accounts +SuggestedFix,suggested_fix +SuggestedPresentationDelaySeconds,suggested_presentation_delay_seconds +SuggestedQueryText,suggested_query_text +Suggester,suggester +SuggesterName,suggester_name +SuggesterNames,suggester_names +SuggesterStatus,suggester_status +Suggesters,suggesters +Suggestion,suggestion +SuggestionAttributes,suggestion_attributes +SuggestionCount,suggestion_count +SuggestionHighlight,suggestion_highlight +SuggestionMatch,suggestion_match +SuggestionQuery,suggestion_query +SuggestionTextWithHighlights,suggestion_text_with_highlights +SuggestionTypes,suggestion_types +SuggestionValue,suggestion_value +Suggestions,suggestions +SuggestionsList,suggestions_list +Suite,suite +SuiteDefinitionConfiguration,suite_definition_configuration +SuiteDefinitionInformation,suite_definition_information +SuiteRunConfiguration,suite_run_configuration +SuiteRunInformation,suite_run_information +Sum,sum +SumByAccount,sum_by_account +SumByDataSource,sum_by_data_source +SumByFeature,sum_by_feature +SumByResource,sum_by_resource +Summaries,summaries +SummarizationAttributes,summarization_attributes +SummarizedAttackVector,summarized_attack_vector +SummarizedCounter,summarized_counter +Summary,summary +SummaryFields,summary_fields +SummaryItems,summary_items +SummaryList,summary_list +SummaryMap,summary_map +SummaryStatistics,summary_statistics +Sunday,sunday +Sunglasses,sunglasses +SupernetOfMatches,supernet_of_matches +SupersededTemplates,superseded_templates +SuperuserParameters,superuser_parameters +SupplementalCategories,supplemental_categories +SupplementalImps,supplemental_imps +SupplementalSettings,supplemental_settings +SupplementaryFeature,supplementary_feature +SupplementaryFeatures,supplementary_features +SupportDescription,support_description +SupportEmail,support_email +SupportLevel,support_level +SupportLink,support_link +SupportLowFramerateInputs,support_low_framerate_inputs +SupportUrl,support_url +Supported,supported +SupportedActivityStreamModes,supported_activity_stream_modes +SupportedAddonList,supported_addon_list +SupportedArchitectures,supported_architectures +SupportedBootModes,supported_boot_modes +SupportedCACertificateIdentifiers,supported_ca_certificate_identifiers +SupportedCharacterSets,supported_character_sets +SupportedCompressionTypes,supported_compression_types +SupportedContentTypes,supported_content_types +SupportedDPUSizes,supported_dpu_sizes +SupportedDeploymentModes,supported_deployment_modes +SupportedEndpointType,supported_endpoint_type +SupportedEndpointTypes,supported_endpoint_types +SupportedEngineModes,supported_engine_modes +SupportedEngineVersions,supported_engine_versions +SupportedEngines,supported_engines +SupportedFeatureNames,supported_feature_names +SupportedFeatures,supported_features +SupportedFieldTypeDetails,supported_field_type_details +SupportedFilters,supported_filters +SupportedGatewayCapacities,supported_gateway_capacities +SupportedHardwareType,supported_hardware_type +SupportedHour,supported_hour +SupportedHyperParameters,supported_hyper_parameters +SupportedIdentityProviders,supported_identity_providers +SupportedInputModes,supported_input_modes +SupportedInstanceType,supported_instance_type +SupportedInstanceTypes,supported_instance_types +SupportedIpAddressTypes,supported_ip_address_types +SupportedLanguage,supported_language +SupportedLicenses,supported_licenses +SupportedLoadBalancerTypes,supported_load_balancer_types +SupportedLoginProviders,supported_login_providers +SupportedMajorVersions,supported_major_versions +SupportedMessagingContentTypes,supported_messaging_content_types +SupportedNcharCharacterSets,supported_nchar_character_sets +SupportedNetworkTypes,supported_network_types +SupportedOperation,supported_operation +SupportedOperations,supported_operations +SupportedPermissionTypes,supported_permission_types +SupportedPhoneNumberTypes,supported_phone_number_types +SupportedPlatform,supported_platform +SupportedPlatforms,supported_platforms +SupportedProductConfig,supported_product_config +SupportedProducts,supported_products +SupportedRealtimeInferenceInstanceTypes,supported_realtime_inference_instance_types +SupportedResourceType,supported_resource_type +SupportedResponseMIMETypes,supported_response_mime_types +SupportedRootDeviceTypes,supported_root_device_types +SupportedStorage,supported_storage +SupportedStorageFilter,supported_storage_filter +SupportedStrategies,supported_strategies +SupportedTierList,supported_tier_list +SupportedTimezones,supported_timezones +SupportedTrainingInstanceTypes,supported_training_instance_types +SupportedTransformInstanceTypes,supported_transform_instance_types +SupportedTuningJobObjectiveMetrics,supported_tuning_job_objective_metrics +SupportedUplinkGbps,supported_uplink_gbps +SupportedUsageClasses,supported_usage_classes +SupportedVersions,supported_versions +SupportedVirtualizationTypes,supported_virtualization_types +SupportingAccessPoint,supporting_access_point +SupportingInsights,supporting_insights +Supports32BitFCnt,supports32_bit_f_cnt +SupportsBabelfish,supports_babelfish +SupportsCDC,supports_cdc +SupportsCertificateRotationWithoutRestart,supports_certificate_rotation_without_restart +SupportsClassB,supports_class_b +SupportsClassC,supports_class_c +SupportsClusters,supports_clusters +SupportsDBInstanceAutomatedBackupsReplication,supports_db_instance_automated_backups_replication +SupportsDistributedTraining,supports_distributed_training +SupportsEnhancedMonitoring,supports_enhanced_monitoring +SupportsGlobalDatabases,supports_global_databases +SupportsIAMDatabaseAuthentication,supports_iam_database_authentication +SupportsIops,supports_iops +SupportsJoin,supports_join +SupportsKerberosAuthentication,supports_kerberos_authentication +SupportsLinking,supports_linking +SupportsLocalWriteForwarding,supports_local_write_forwarding +SupportsLogExportsToCloudwatchLogs,supports_log_exports_to_cloudwatch_logs +SupportsOptionVersionDowngrade,supports_option_version_downgrade +SupportsParallelQuery,supports_parallel_query +SupportsPerformanceInsights,supports_performance_insights +SupportsReadReplica,supports_read_replica +SupportsStorageAutoscaling,supports_storage_autoscaling +SupportsStorageEncryption,supports_storage_encryption +SupportsStorageThroughput,supports_storage_throughput +SuppressDataIdentifier,suppress_data_identifier +SuppressedDestination,suppressed_destination +SuppressedDestinationAttributes,suppressed_destination_attributes +SuppressedDestinationSummaries,suppressed_destination_summaries +SuppressedDestinationSummary,suppressed_destination_summary +SuppressedLinesOfCodeCount,suppressed_lines_of_code_count +SuppressedReasons,suppressed_reasons +SuppressionAttributes,suppression_attributes +SuppressionListDestination,suppression_list_destination +SuppressionListImportAction,suppression_list_import_action +SuppressionOptions,suppression_options +Surname,surname +SurroundExMode,surround_ex_mode +SurroundMode,surround_mode +SurroundTrim,surround_trim +SuspendActions,suspend_actions +SuspendContactRecordingRequest,suspend_contact_recording_request +SuspendGameServerGroupInput,suspend_game_server_group_input +SuspendGameServerGroupOutput,suspend_game_server_group_output +SuspendedActions,suspended_actions +SuspendedCause,suspended_cause +SuspendedDate,suspended_date +SuspendedProcess,suspended_process +SuspendedProcesses,suspended_processes +SuspendedState,suspended_state +SuspensionReason,suspension_reason +SustainedClockSpeedInGhz,sustained_clock_speed_in_ghz +SvmActiveDirectoryConfiguration,svm_active_directory_configuration +SvmAdminPassword,svm_admin_password +SvmEndpoint,svm_endpoint +SvmEndpoints,svm_endpoints +SvmName,svm_name +SvmUuid,svm_uuid +SwapEnvironmentCNAMEsMessage,swap_environment_cnames_message +Swappiness,swappiness +SwitchRunningMode,switch_running_mode +Switchover,switchover +SwitchoverBlueGreenDeploymentRequest,switchover_blue_green_deployment_request +SwitchoverBlueGreenDeploymentResponse,switchover_blue_green_deployment_response +SwitchoverDetail,switchover_detail +SwitchoverDetails,switchover_details +SwitchoverGlobalClusterMessage,switchover_global_cluster_message +SwitchoverGlobalClusterResult,switchover_global_cluster_result +SwitchoverReadReplicaMessage,switchover_read_replica_message +SwitchoverReadReplicaResult,switchover_read_replica_result +SwitchoverTimeout,switchover_timeout +SybaseSettings,sybase_settings +Symbol,symbol +SymbolicLink,symbolic_link +SymmetricEncryptionAttributes,symmetric_encryption_attributes +SyncBlocker,sync_blocker +SyncBlockerContext,sync_blocker_context +SyncCompliance,sync_compliance +SyncConfig,sync_config +SyncCount,sync_count +SyncCreatedTime,sync_created_time +SyncDeploymentJobRequest,sync_deployment_job_request +SyncDeploymentJobResponse,sync_deployment_job_response +SyncFormat,sync_format +SyncJobStatus,sync_job_status +SyncJobSummary,sync_job_summary +SyncLastModifiedTime,sync_last_modified_time +SyncName,sync_name +SyncResourceRequest,sync_resource_request +SyncResourceResponse,sync_resource_response +SyncResourceStatus,sync_resource_status +SyncResourceSummary,sync_resource_summary +SyncSessionToken,sync_session_token +SyncSessionsCount,sync_sessions_count +SyncShadow,sync_shadow +SyncSource,sync_source +SyncState,sync_state +SyncStates,sync_states +SyncStatus,sync_status +SyncThreshold,sync_threshold +SyncType,sync_type +SynchronizationStatus,synchronization_status +SynonymRuleCount,synonym_rule_count +Synonyms,synonyms +Syntax,syntax +SyntaxToken,syntax_token +SyntaxTokens,syntax_tokens +SynthesisTask,synthesis_task +SynthesisTaskNotFoundException,synthesis_task_not_found_exception +SynthesisTasks,synthesis_tasks +SynthesizeSpeechInput,synthesize_speech_input +SynthesizeSpeechOutput,synthesize_speech_output +SyslogIp,syslog_ip +System,system +SystemControl,system_control +SystemControls,system_controls +SystemEvent,system_event +SystemId,system_id +SystemIds,system_ids +SystemInfo,system_info +SystemInstanceDescription,system_instance_description +SystemInstanceFilter,system_instance_filter +SystemInstanceSummary,system_instance_summary +SystemResourceLimits,system_resource_limits +SystemStatus,system_status +SystemSuggestedValue,system_suggested_value +SystemTemplateDescription,system_template_description +SystemTemplateFilter,system_template_filter +SystemTemplateSummary,system_template_summary +SystemType,system_type +SystemsManagerAgent,systems_manager_agent +TCPFlagField,tcp_flag_field +TCPFlags,tcp_flags +TERMINATING,terminating +TFIMetricDataPoint,tfi_metric_data_point +TFIModelPerformance,tfi_model_performance +TFITrainingMetricsValue,tfi_training_metrics_value +TGWOnDeviceService,tgw_on_device_service +TGWOnDeviceServiceConfiguration,tgw_on_device_service_configuration +TLDRulesViolation,tld_rules_violation +TLEData,tle_data +TLEEphemeris,tle_ephemeris +TLSEnabled,tls_enabled +TLSInspectionConfiguration,tls_inspection_configuration +TLSInspectionConfigurationArn,tls_inspection_configuration_arn +TLSInspectionConfigurationId,tls_inspection_configuration_id +TLSInspectionConfigurationMetadata,tls_inspection_configuration_metadata +TLSInspectionConfigurationName,tls_inspection_configuration_name +TLSInspectionConfigurationResponse,tls_inspection_configuration_response +TLSInspectionConfigurationStatus,tls_inspection_configuration_status +TLSInspectionConfigurations,tls_inspection_configurations +TLSSecurityPolicy,tls_security_policy +TTL,ttl +Table,table +TableAggregatedFieldWells,table_aggregated_field_wells +TableAlreadyExistsException,table_already_exists_exception +TableArn,table_arn +TableAutoScalingDescription,table_auto_scaling_description +TableBorderOptions,table_border_options +TableCatalogId,table_catalog_id +TableCell,table_cell +TableCellConditionalFormatting,table_cell_conditional_formatting +TableCellImageScalingConfiguration,table_cell_image_scaling_configuration +TableCellImageSizingConfiguration,table_cell_image_sizing_configuration +TableCellStyle,table_cell_style +TableClass,table_class +TableClassOverride,table_class_override +TableClassSummary,table_class_summary +TableColumn,table_column +TableConditionalFormatting,table_conditional_formatting +TableConditionalFormattingOption,table_conditional_formatting_option +TableConfiguration,table_configuration +TableCount,table_count +TableCreationDateTime,table_creation_date_time +TableCreationParameters,table_creation_parameters +TableData,table_data +TableDataImportJobMetadata,table_data_import_job_metadata +TableDescription,table_description +TableError,table_error +TableExcerpt,table_excerpt +TableFieldCustomIconContent,table_field_custom_icon_content +TableFieldCustomTextContent,table_field_custom_text_content +TableFieldImageConfiguration,table_field_image_configuration +TableFieldLinkConfiguration,table_field_link_configuration +TableFieldLinkContentConfiguration,table_field_link_content_configuration +TableFieldOption,table_field_option +TableFieldOptions,table_field_options +TableFieldURLConfiguration,table_field_url_configuration +TableFieldWells,table_field_wells +TableFormat,table_format +TableId,table_id +TableIdentifier,table_identifier +TableInUseException,table_in_use_exception +TableInlineVisualization,table_inline_visualization +TableInlineVisualizations,table_inline_visualizations +TableInput,table_input +TableLFTagPolicy,table_lf_tag_policy +TableLFTagPolicyAndPermissions,table_lf_tag_policy_and_permissions +TableLimitExceededFault,table_limit_exceeded_fault +TableList,table_list +TableLocation,table_location +TableMappings,table_mappings +TableMaxReadCapacityUnits,table_max_read_capacity_units +TableMaxWriteCapacityUnits,table_max_write_capacity_units +TableMember,table_member +TableMetadata,table_metadata +TableMetadataList,table_metadata_list +TableName,table_name +TableNameUpdate,table_name_update +TableNames,table_names +TableNotFoundException,table_not_found_exception +TableObject,table_object +TableOptions,table_options +TablePaginatedReportOptions,table_paginated_report_options +TablePattern,table_pattern +TablePinnedFieldOptions,table_pinned_field_options +TablePrefix,table_prefix +TableResource,table_resource +TableRestoreNotFoundFault,table_restore_not_found_fault +TableRestoreRequestId,table_restore_request_id +TableRestoreStatus,table_restore_status +TableRestoreStatusDetails,table_restore_status_details +TableRestoreStatusMessage,table_restore_status_message +TableRow,table_row +TableRowConditionalFormatting,table_row_conditional_formatting +TableSchema,table_schema +TableSideBorderOptions,table_side_border_options +TableSizeBytes,table_size_bytes +TableSortConfiguration,table_sort_configuration +TableState,table_state +TableStatistics,table_statistics +TableStatus,table_status +TableStyleTarget,table_style_target +TableSummary,table_summary +TableToReload,table_to_reload +TableType,table_type +TableUnaggregatedFieldWells,table_unaggregated_field_wells +TableVersion,table_version +TableVersionError,table_version_error +TableVersions,table_versions +TableVisual,table_visual +TableWildcard,table_wildcard +TableWithColumns,table_with_columns +TableWithColumnsResource,table_with_columns_resource +Tables,tables +TablesCreated,tables_created +TablesDeleted,tables_deleted +TablesErrored,tables_errored +TablesLoaded,tables_loaded +TablesLoading,tables_loading +TablesQueued,tables_queued +TablesToDelete,tables_to_delete +TablesToReload,tables_to_reload +TablesUpdated,tables_updated +TabularConditions,tabular_conditions +TabularJobConfig,tabular_job_config +TabularResolvedAttributes,tabular_resolved_attributes +Tac,tac +Tag,tag +TagAttendeeRequest,tag_attendee_request +TagCertificateAuthorityRequest,tag_certificate_authority_request +TagCollection,tag_collection +TagCollectionFilter,tag_collection_filter +TagColumnOperation,tag_column_operation +TagCondition,tag_condition +TagCostEstimationResourceCollectionFilter,tag_cost_estimation_resource_collection_filter +TagCount,tag_count +TagCriterionForJob,tag_criterion_for_job +TagCriterionPairForJob,tag_criterion_pair_for_job +TagDeliveryStreamInput,tag_delivery_stream_input +TagDescription,tag_description +TagDescriptions,tag_descriptions +TagException,tag_exception +TagFilter,tag_filter +TagFilters,tag_filters +TagHealth,tag_health +TagInfoForResource,tag_info_for_resource +TagInput,tag_input +TagInstanceProfileRequest,tag_instance_profile_request +TagKey,tag_key +TagKeyFilters,tag_key_filters +TagKeyList,tag_key_list +TagKeyOnly,tag_key_only +TagKeyScope,tag_key_scope +TagKeys,tag_keys +TagKeysListRequiredException,tag_keys_list_required_exception +TagLimitExceededException,tag_limit_exceeded_exception +TagLimitExceededFault,tag_limit_exceeded_fault +TagList,tag_list +TagListEntry,tag_list_entry +TagListMessage,tag_list_message +TagLogGroupRequest,tag_log_group_request +TagMFADeviceRequest,tag_mfa_device_request +TagMeetingRequest,tag_meeting_request +TagMultiValueDelimiter,tag_multi_value_delimiter +TagNames,tag_names +TagNotFoundFault,tag_not_found_fault +TagOpenIDConnectProviderRequest,tag_open_id_connect_provider_request +TagOperationException,tag_operation_exception +TagOptionDetail,tag_option_detail +TagOptionDetails,tag_option_details +TagOptionId,tag_option_id +TagOptionNotMigratedException,tag_option_not_migrated_exception +TagOptionSummary,tag_option_summary +TagOptions,tag_options +TagOutput,tag_output +TagPolicyException,tag_policy_exception +TagPolicyRequest,tag_policy_request +TagPolicyViolationException,tag_policy_violation_exception +TagProjectRequest,tag_project_request +TagProjectResult,tag_project_result +TagQueryConfiguration,tag_query_configuration +TagQueueRequest,tag_queue_request +TagQuotaPerResourceExceeded,tag_quota_per_resource_exceeded +TagRef,tag_ref +TagRequiredException,tag_required_exception +TagResourceInput,tag_resource_input +TagResourceOutput,tag_resource_output +TagResourceRequest,tag_resource_request +TagResourceResponse,tag_resource_response +TagResourceResult,tag_resource_result +TagResourcesInput,tag_resources_input +TagResourcesOutput,tag_resources_output +TagRestrictedResources,tag_restricted_resources +TagRoleRequest,tag_role_request +TagRuleConfigurations,tag_rule_configurations +TagRules,tag_rules +TagSAMLProviderRequest,tag_saml_provider_request +TagScopeTerm,tag_scope_term +TagSearchCondition,tag_search_condition +TagServerCertificateRequest,tag_server_certificate_request +TagSet,tag_set +TagSetListLimitExceededException,tag_set_list_limit_exceeded_exception +TagSpecification,tag_specification +TagSpecifications,tag_specifications +TagStepDetails,tag_step_details +TagStreamInput,tag_stream_input +TagUserRequest,tag_user_request +TagValue,tag_value +TagValuePair,tag_value_pair +TagValueScope,tag_value_scope +TagValues,tag_values +TagValuesToAdd,tag_values_to_add +TagValuesToDelete,tag_values_to_delete +TaggedDatabase,tagged_database +TaggedResource,tagged_resource +TaggedResourceListMessage,tagged_resource_list_message +TaggedResources,tagged_resources +TaggedTable,tagged_table +Tagging,tagging +TaggingDirective,tagging_directive +TaggingFailedException,tagging_failed_exception +Tags,tags +TagsAlreadyExistException,tags_already_exist_exception +TagsLimitExceededException,tags_limit_exceeded_exception +TagsList,tags_list +TagsMapRequiredException,tags_map_required_exception +TagsModel,tags_model +TagsPerPage,tags_per_page +TagsPerResourceExceededLimitException,tags_per_resource_exceeded_limit_exception +TagsToAdd,tags_to_add +TagsToDelete,tags_to_delete +TagsToRemove,tags_to_remove +TagsToUpdate,tags_to_update +TagsType,tags_type +Taint,taint +Tape,tape +TapeARN,tape_arn +TapeARNs,tape_arns +TapeArchive,tape_archive +TapeArchives,tape_archives +TapeBarcode,tape_barcode +TapeBarcodePrefix,tape_barcode_prefix +TapeCreatedDate,tape_created_date +TapeDriveType,tape_drive_type +TapeInfo,tape_info +TapeInfos,tape_infos +TapeRecoveryPointInfo,tape_recovery_point_info +TapeRecoveryPointInfos,tape_recovery_point_infos +TapeRecoveryPointTime,tape_recovery_point_time +TapeSizeInBytes,tape_size_in_bytes +TapeStatus,tape_status +TapeUsedInBytes,tape_used_in_bytes +Tapes,tapes +Target,target +TargetARN,target_arn +TargetAccounts,target_accounts +TargetAction,target_action +TargetActionType,target_action_type +TargetAddress,target_address +TargetApplications,target_applications +TargetArn,target_arn +TargetAttributeName,target_attribute_name +TargetBackupVault,target_backup_vault +TargetBackupVaultName,target_backup_vault_name +TargetBands,target_bands +TargetBrokerEBSVolumeInfo,target_broker_ebs_volume_info +TargetBucket,target_bucket +TargetCapacity,target_capacity +TargetCapacitySpecification,target_capacity_specification +TargetCapacitySpecificationRequest,target_capacity_specification_request +TargetCapacityUnitType,target_capacity_unit_type +TargetClusterArn,target_cluster_arn +TargetClusterInfo,target_cluster_info +TargetClusterType,target_cluster_type +TargetColumn,target_column +TargetConfiguration,target_configuration +TargetConfigurationRequest,target_configuration_request +TargetConfigurationValueRollup,target_configuration_value_rollup +TargetConfigurationValueSet,target_configuration_value_set +TargetConfigurations,target_configurations +TargetContainerHostname,target_container_hostname +TargetContainerRepository,target_container_repository +TargetControls,target_controls +TargetCount,target_count +TargetCpuUtilizationPerCore,target_cpu_utilization_per_core +TargetCustomAvailabilityZone,target_custom_availability_zone +TargetCustomerId,target_customer_id +TargetDBClusterParameterGroupDescription,target_db_cluster_parameter_group_description +TargetDBClusterParameterGroupIdentifier,target_db_cluster_parameter_group_identifier +TargetDBClusterParameterGroupName,target_db_cluster_parameter_group_name +TargetDBClusterSnapshotIdentifier,target_db_cluster_snapshot_identifier +TargetDBInstanceIdentifier,target_db_instance_identifier +TargetDBParameterGroupDescription,target_db_parameter_group_description +TargetDBParameterGroupIdentifier,target_db_parameter_group_identifier +TargetDBParameterGroupName,target_db_parameter_group_name +TargetDBSnapshotIdentifier,target_db_snapshot_identifier +TargetDataProviderDescriptors,target_data_provider_descriptors +TargetDatabase,target_database +TargetDatabaseName,target_database_name +TargetDbClusterIdentifier,target_db_cluster_identifier +TargetDbType,target_db_type +TargetDescription,target_description +TargetDestination,target_destination +TargetDetails,target_details +TargetDevice,target_device +TargetDistributionId,target_distribution_id +TargetDocumentAttributeKey,target_document_attribute_key +TargetDocumentAttributeValue,target_document_attribute_value +TargetDocumentAttributeValueDeletion,target_document_attribute_value_deletion +TargetDpus,target_dpus +TargetDurationCompatibilityMode,target_duration_compatibility_mode +TargetEncryptionType,target_encryption_type +TargetEndpointArn,target_endpoint_arn +TargetEngineName,target_engine_name +TargetEngineVersion,target_engine_version +TargetEnvironment,target_environment +TargetEnvironmentName,target_environment_name +TargetEventTypes,target_event_types +TargetFacetName,target_facet_name +TargetFailure,target_failure +TargetFileSystemValues,target_file_system_values +TargetGrant,target_grant +TargetGrants,target_grants +TargetGroup,target_group +TargetGroupARNs,target_group_arns +TargetGroupArn,target_group_arn +TargetGroupArns,target_group_arns +TargetGroupAssociationLimitException,target_group_association_limit_exception +TargetGroupAttribute,target_group_attribute +TargetGroupConfig,target_group_config +TargetGroupInfo,target_group_info +TargetGroupName,target_group_name +TargetGroupNotFoundException,target_group_not_found_exception +TargetGroupPairInfo,target_group_pair_info +TargetGroupStickinessConfig,target_group_stickiness_config +TargetGroupSummary,target_group_summary +TargetGroupTuple,target_group_tuple +TargetGroups,target_groups +TargetGroupsConfig,target_groups_config +TargetHealth,target_health +TargetHealthDescription,target_health_description +TargetHealthDescriptions,target_health_descriptions +TargetId,target_id +TargetIdFilters,target_id_filters +TargetIdType,target_id_type +TargetIds,target_ids +TargetImage,target_image +TargetImageOrientationCorrection,target_image_orientation_correction +TargetInUseException,target_in_use_exception +TargetInstance,target_instance +TargetInstanceType,target_instance_type +TargetInstances,target_instances +TargetIops,target_iops +TargetIps,target_ips +TargetKafkaVersion,target_kafka_version +TargetKeyId,target_key_id +TargetKeyPrefix,target_key_prefix +TargetLabelColumn,target_label_column +TargetLanguageCode,target_language_code +TargetLanguageCodes,target_language_codes +TargetLensVersion,target_lens_version +TargetLkfs,target_lkfs +TargetLocation,target_location +TargetLocationAlarmConfiguration,target_location_alarm_configuration +TargetLocationMaxConcurrency,target_location_max_concurrency +TargetLocationMaxErrors,target_location_max_errors +TargetLocations,target_locations +TargetMaps,target_maps +TargetMeasureName,target_measure_name +TargetMember,target_member +TargetMembershipsPerSubChannel,target_memberships_per_sub_channel +TargetModel,target_model +TargetMonitorNits,target_monitor_nits +TargetMultiAttachEnabled,target_multi_attach_enabled +TargetMultiMeasureAttributeName,target_multi_measure_attribute_name +TargetMultiMeasureName,target_multi_measure_name +TargetName,target_name +TargetNetwork,target_network +TargetNetworkCidr,target_network_cidr +TargetNetworkId,target_network_id +TargetNodeType,target_node_type +TargetNotConnected,target_not_connected +TargetNotConnectedException,target_not_connected_exception +TargetNotFoundException,target_not_found_exception +TargetNumberOfBrokerNodes,target_number_of_broker_nodes +TargetNumberOfNodes,target_number_of_nodes +TargetObjectReference,target_object_reference +TargetObjectiveMetricValue,target_objective_metric_value +TargetOnDemandCapacity,target_on_demand_capacity +TargetOnDeviceService,target_on_device_service +TargetOnDeviceServices,target_on_device_services +TargetOptionGroupDescription,target_option_group_description +TargetOptionGroupIdentifier,target_option_group_identifier +TargetOriginId,target_origin_id +TargetParameter,target_parameter +TargetParameterName,target_parameter_name +TargetParameters,target_parameters +TargetPath,target_path +TargetPer,target_per +TargetPlatform,target_platform +TargetPrefix,target_prefix +TargetProcess,target_process +TargetProductId,target_product_id +TargetProductName,target_product_name +TargetReference,target_reference +TargetRegion,target_region +TargetReplicationInstanceArn,target_replication_instance_arn +TargetRequiredException,target_required_exception +TargetReservationValue,target_reservation_value +TargetReservedNodeCount,target_reserved_node_count +TargetReservedNodeOffering,target_reserved_node_offering +TargetReservedNodeOfferingId,target_reserved_node_offering_id +TargetReservedNodeType,target_reserved_node_type +TargetResource,target_resource +TargetResourceCount,target_resource_count +TargetResourceType,target_resource_type +TargetResourceTypeParameter,target_resource_type_parameter +TargetResourceTypeSummary,target_resource_type_summary +TargetRole,target_role +TargetRouteTableId,target_route_table_id +TargetSamplingRate,target_sampling_rate +TargetSchemaName,target_schema_name +TargetShardCount,target_shard_count +TargetSheetId,target_sheet_id +TargetSize,target_size +TargetSnapshotIdentifier,target_snapshot_identifier +TargetSnapshotName,target_snapshot_name +TargetSnapshotValues,target_snapshot_values +TargetSpotCapacity,target_spot_capacity +TargetStatus,target_status +TargetStores,target_stores +TargetString,target_string +TargetSubnet,target_subnet +TargetSummary,target_summary +TargetTable,target_table +TargetTableName,target_table_name +TargetTags,target_tags +TargetText,target_text +TargetThroughput,target_throughput +TargetTrackingConfiguration,target_tracking_configuration +TargetTrackingConfigurations,target_tracking_configurations +TargetTrackingMetric,target_tracking_metric +TargetTrackingMetricDataQuery,target_tracking_metric_data_query +TargetTrackingMetricDimension,target_tracking_metric_dimension +TargetTrackingMetricStat,target_tracking_metric_stat +TargetTrackingScalingPolicyConfiguration,target_tracking_scaling_policy_configuration +TargetType,target_type +TargetTypes,target_types +TargetUser,target_user +TargetUsers,target_users +TargetValue,target_value +TargetValues,target_values +TargetVariant,target_variant +TargetVersion,target_version +TargetVersions,target_versions +TargetViolationReason,target_violation_reason +TargetViolationReasons,target_violation_reasons +TargetVisualOptions,target_visual_options +TargetVisuals,target_visuals +TargetVisualsConfiguration,target_visuals_configuration +TargetVolumeType,target_volume_type +TargetVolumeValues,target_volume_values +TargetVpcSubnetId,target_vpc_subnet_id +TargetWorkspaceId,target_workspace_id +TargetedMessages,targeted_messages +TargetedSentimentDetectionJobFilter,targeted_sentiment_detection_job_filter +TargetedSentimentDetectionJobProperties,targeted_sentiment_detection_job_properties +TargetedSentimentDetectionJobPropertiesList,targeted_sentiment_detection_job_properties_list +TargetedSentimentEntity,targeted_sentiment_entity +TargetedSentimentMention,targeted_sentiment_mention +Targets,targets +TargetsRequiredException,targets_required_exception +Task,task +TaskAction,task_action +TaskActionDefinition,task_action_definition +TaskAlreadyExistsException,task_already_exists_exception +TaskArn,task_arn +TaskAvailabilityLifetimeInSeconds,task_availability_lifetime_in_seconds +TaskConfig,task_config +TaskCount,task_count +TaskCreatedAt,task_created_at +TaskCredentials,task_credentials +TaskData,task_data +TaskDefinition,task_definition +TaskDefinitionArn,task_definition_arn +TaskDefinitionPlacementConstraint,task_definition_placement_constraint +TaskDefinitionType,task_definition_type +TaskDefinitions,task_definitions +TaskDescription,task_description +TaskDetails,task_details +TaskDoesNotExist,task_does_not_exist +TaskEndTime,task_end_time +TaskError,task_error +TaskExecutionArn,task_execution_arn +TaskExecutionId,task_execution_id +TaskExecutionListEntry,task_execution_list_entry +TaskExecutionResultDetail,task_execution_result_detail +TaskExecutions,task_executions +TaskFailedEventDetails,task_failed_event_details +TaskFieldMappings,task_field_mappings +TaskFilter,task_filter +TaskHandle,task_handle +TaskId,task_id +TaskIds,task_ids +TaskInvocationParameters,task_invocation_parameters +TaskKeywords,task_keywords +TaskList,task_list +TaskListEntry,task_list_entry +TaskListItem,task_list_item +TaskLogs,task_logs +TaskNotFoundException,task_not_found_exception +TaskObject,task_object +TaskOverride,task_override +TaskParameters,task_parameters +TaskProperties,task_properties +TaskQueueing,task_queueing +TaskReportConfig,task_report_config +TaskRoleArn,task_role_arn +TaskRun,task_run +TaskRunFilterCriteria,task_run_filter_criteria +TaskRunId,task_run_id +TaskRunProperties,task_run_properties +TaskRunSecurityConfigurationName,task_run_security_configuration_name +TaskRunSortCriteria,task_run_sort_criteria +TaskRunType,task_run_type +TaskRuns,task_runs +TaskSchedule,task_schedule +TaskScheduledEventDetails,task_scheduled_event_details +TaskSet,task_set +TaskSetNotFoundException,task_set_not_found_exception +TaskStartFailedEventDetails,task_start_failed_event_details +TaskStartTime,task_start_time +TaskStartedEventDetails,task_started_event_details +TaskState,task_state +TaskStatistics,task_statistics +TaskStatisticsForAuditCheck,task_statistics_for_audit_check +TaskStatus,task_status +TaskStatusReason,task_status_reason +TaskSubmitFailedEventDetails,task_submit_failed_event_details +TaskSubmittedEventDetails,task_submitted_event_details +TaskSucceededEventDetails,task_succeeded_event_details +TaskSummary,task_summary +TaskTemplateConstraints,task_template_constraints +TaskTemplateDefaultFieldValue,task_template_default_field_value +TaskTemplateDefaults,task_template_defaults +TaskTemplateField,task_template_field +TaskTemplateFieldIdentifier,task_template_field_identifier +TaskTemplateId,task_template_id +TaskTemplateMetadata,task_template_metadata +TaskTemplates,task_templates +TaskTimeLimitInSeconds,task_time_limit_in_seconds +TaskTimedOut,task_timed_out +TaskTimedOutEventDetails,task_timed_out_event_details +TaskTitle,task_title +TaskType,task_type +Tasks,tasks +TaxDocuments,tax_documents +TcpFlags,tcp_flags +TcpRoute,tcp_route +TcpRouteAction,tcp_route_action +TcpRouteMatch,tcp_route_match +TcpTimeout,tcp_timeout +Tcs,tcs +TdeCredentialArn,tde_credential_arn +TdeCredentialPassword,tde_credential_password +Tdscdma,tdscdma +TdscdmaLocalId,tdscdma_local_id +TdscdmaNmr,tdscdma_nmr +TdscdmaNmrObj,tdscdma_nmr_obj +TdscdmaObj,tdscdma_obj +TdscdmaTimingAdvance,tdscdma_timing_advance +TdtInterval,tdt_interval +Team,team +TeamId,team_id +TeamMember,team_member +TeamMemberAlreadyAssociatedException,team_member_already_associated_exception +TeamMemberNotFoundException,team_member_not_found_exception +TechContact,tech_contact +TechPrivacy,tech_privacy +TechnicalCueFilter,technical_cue_filter +TechnicalCueSegment,technical_cue_segment +Telecine,telecine +Telemetries,telemetries +Telemetry,telemetry +TelemetryConfiguration,telemetry_configuration +TelemetryConfigurationUpdate,telemetry_configuration_update +TelemetryMetadata,telemetry_metadata +TelemetryRecord,telemetry_record +TelemetryRecords,telemetry_records +Telephone,telephone +Telephony,telephony +TelephonyConfig,telephony_config +TelephonySettings,telephony_settings +TeletextDestinationSettings,teletext_destination_settings +TeletextGridControl,teletext_grid_control +TeletextSourceSettings,teletext_source_settings +TeletextSpacing,teletext_spacing +TempDir,temp_dir +TempDirectory,temp_directory +TemperatureUnit,temperature_unit +Template,template +TemplateActionDocument,template_action_document +TemplateActionsRequestFilters,template_actions_request_filters +TemplateActiveVersionRequest,template_active_version_request +TemplateAlias,template_alias +TemplateAliasList,template_alias_list +TemplateArn,template_arn +TemplateBody,template_body +TemplateConfiguration,template_configuration +TemplateContent,template_content +TemplateCreateMessageBody,template_create_message_body +TemplateData,template_data +TemplateDescription,template_description +TemplateDoesNotExistException,template_does_not_exist_exception +TemplateError,template_error +TemplateId,template_id +TemplateInput,template_input +TemplateLinkedPolicyDefinition,template_linked_policy_definition +TemplateLinkedPolicyDefinitionDetail,template_linked_policy_definition_detail +TemplateLinkedPolicyDefinitionItem,template_linked_policy_definition_item +TemplateLocation,template_location +TemplateMetadata,template_metadata +TemplateName,template_name +TemplateParameter,template_parameter +TemplateParameterConfiguration,template_parameter_configuration +TemplateParameters,template_parameters +TemplateQuestions,template_questions +TemplateResponse,template_response +TemplateRevision,template_revision +TemplateS3Uri,template_s3_uri +TemplateSSMDocumentDetails,template_ssm_document_details +TemplateSelectionExpression,template_selection_expression +TemplateSourceAnalysis,template_source_analysis +TemplateSourceEntity,template_source_entity +TemplateSourceTemplate,template_source_template +TemplateStage,template_stage +TemplateStepGroupSummary,template_step_group_summary +TemplateStepSummary,template_step_summary +TemplateSubject,template_subject +TemplateSummary,template_summary +TemplateSummaryConfig,template_summary_config +TemplateSummaryList,template_summary_list +TemplateSyncConfig,template_sync_config +TemplateType,template_type +TemplateURL,template_url +TemplateUrl,template_url +TemplateV2,template_v2 +TemplateV3,template_v3 +TemplateV4,template_v4 +TemplateVersion,template_version +TemplateVersionDefinition,template_version_definition +TemplateVersionNumber,template_version_number +TemplateVersionResponse,template_version_response +TemplateVersionSummary,template_version_summary +TemplateVersionSummaryList,template_version_summary_list +TemplateVersionsResponse,template_versions_response +TemplatedPathList,templated_path_list +Templates,templates +TemplatesMetadata,templates_metadata +TemplatesNotAvailableInRegionException,templates_not_available_in_region_exception +TemplatesResponse,templates_response +TemporalAdaptiveQuantization,temporal_adaptive_quantization +TemporalAq,temporal_aq +TemporalFilterSettings,temporal_filter_settings +TemporalIds,temporal_ids +TemporalStatisticsConfigInput,temporal_statistics_config_input +TemporaryCredential,temporary_credential +TemporaryPassword,temporary_password +TemporaryPasswordValidityDays,temporary_password_validity_days +TemporaryRestoreDays,temporary_restore_days +Tenancy,tenancy +Tenant,tenant +TenantDomain,tenant_domain +TenantId,tenant_id +TenantIds,tenant_ids +TensorBoardAppSettings,tensor_board_app_settings +TensorBoardOutputConfig,tensor_board_output_config +TenthFractionsOfACent,tenth_fractions_of_a_cent +TeradataParameters,teradata_parameters +Term,term +TermCount,term_count +TermEndDate,term_end_date +TermInYears,term_in_years +TermStartDate,term_start_date +TerminalRoutingStrategyException,terminal_routing_strategy_exception +TerminalStateException,terminal_state_exception +TerminateAppRequest,terminate_app_request +TerminateCaptions,terminate_captions +TerminateClientVpnConnectionsRequest,terminate_client_vpn_connections_request +TerminateClientVpnConnectionsResult,terminate_client_vpn_connections_result +TerminateConnectionStatus,terminate_connection_status +TerminateEnvByForce,terminate_env_by_force +TerminateEnvironmentMessage,terminate_environment_message +TerminateInstanceInAutoScalingGroupType,terminate_instance_in_auto_scaling_group_type +TerminateInstances,terminate_instances +TerminateInstancesRequest,terminate_instances_request +TerminateInstancesResult,terminate_instances_result +TerminateInstancesWithExpiration,terminate_instances_with_expiration +TerminateJobFlowsInput,terminate_job_flows_input +TerminateJobRequest,terminate_job_request +TerminateProvisionedProductInput,terminate_provisioned_product_input +TerminateProvisionedProductOutput,terminate_provisioned_product_output +TerminateRecommendationDetail,terminate_recommendation_detail +TerminateRecoveryInstancesRequest,terminate_recovery_instances_request +TerminateRecoveryInstancesResponse,terminate_recovery_instances_response +TerminateRequest,terminate_request +TerminateResources,terminate_resources +TerminateSessionRequest,terminate_session_request +TerminateSessionResponse,terminate_session_response +TerminateSolNetworkInstanceInput,terminate_sol_network_instance_input +TerminateSolNetworkInstanceOutput,terminate_sol_network_instance_output +TerminateTargetInstancesRequest,terminate_target_instances_request +TerminateTargetInstancesResponse,terminate_target_instances_response +TerminateToken,terminate_token +TerminateWorkflowExecutionInput,terminate_workflow_execution_input +TerminateWorkspaceRequests,terminate_workspace_requests +TerminateWorkspacesRequest,terminate_workspaces_request +TerminateWorkspacesResult,terminate_workspaces_result +Terminated,terminated +TerminatedAt,terminated_at +Terminating,terminating +TerminatingInstances,terminating_instances +Termination,termination +TerminationDate,termination_date +TerminationDateTime,termination_date_time +TerminationDelay,termination_delay +TerminationHealth,termination_health +TerminationPolicies,termination_policies +TerminationPolicyTypes,termination_policy_types +TerminationProtected,termination_protected +TerminationProtectionEnabled,termination_protection_enabled +TerminationTime,termination_time +TerminationWaitInSeconds,termination_wait_in_seconds +TerminologyData,terminology_data +TerminologyDataFormat,terminology_data_format +TerminologyDataLocation,terminology_data_location +TerminologyNames,terminology_names +TerminologyProperties,terminology_properties +TerminologyPropertiesList,terminology_properties_list +Terms,terms +TermsAggregation,terms_aggregation +TerraformSource,terraform_source +Test,test +TestAlarmRequest,test_alarm_request +TestAlarmResult,test_alarm_result +TestAuthorizationRequest,test_authorization_request +TestAuthorizationResponse,test_authorization_response +TestAvailabilityConfigurationRequest,test_availability_configuration_request +TestAvailabilityConfigurationResponse,test_availability_configuration_response +TestCase,test_case +TestCaseFilter,test_case_filter +TestCaseRun,test_case_run +TestCaseScenario,test_case_scenario +TestConnectionMessage,test_connection_message +TestConnectionRequest,test_connection_request +TestConnectionResponse,test_connection_response +TestCustomDataIdentifierRequest,test_custom_data_identifier_request +TestCustomDataIdentifierResponse,test_custom_data_identifier_response +TestDNSAnswerRequest,test_dns_answer_request +TestDNSAnswerResponse,test_dns_answer_response +TestDurationInSeconds,test_duration_in_seconds +TestEventPatternRequest,test_event_pattern_request +TestEventPatternResponse,test_event_pattern_response +TestEventType,test_event_type +TestExecutionResultFilterBy,test_execution_result_filter_by +TestExecutionResultItems,test_execution_result_items +TestExecutionSortBy,test_execution_sort_by +TestExecutionSummary,test_execution_summary +TestExecutionTarget,test_execution_target +TestFailoverMessage,test_failover_message +TestFailoverNotAvailableFault,test_failover_not_available_fault +TestFailoverResult,test_failover_result +TestFunctionFailed,test_function_failed +TestFunctionRequest,test_function_request +TestFunctionResult,test_function_result +TestGridProject,test_grid_project +TestGridSession,test_grid_session +TestGridSessionAction,test_grid_session_action +TestGridSessionArtifact,test_grid_session_artifact +TestGridVpcConfig,test_grid_vpc_config +TestHypervisorConfigurationInput,test_hypervisor_configuration_input +TestIdentityProviderRequest,test_identity_provider_request +TestIdentityProviderResponse,test_identity_provider_response +TestInvokeAuthorizerRequest,test_invoke_authorizer_request +TestInvokeAuthorizerResponse,test_invoke_authorizer_response +TestInvokeMethodRequest,test_invoke_method_request +TestInvokeMethodResponse,test_invoke_method_response +TestMetricFilterRequest,test_metric_filter_request +TestMetricFilterResponse,test_metric_filter_response +TestMigrationMessage,test_migration_message +TestMigrationResponse,test_migration_response +TestMode,test_mode +TestPassed,test_passed +TestPhoneNumber,test_phone_number +TestRecommendation,test_recommendation +TestRenderEmailTemplateRequest,test_render_email_template_request +TestRenderEmailTemplateResponse,test_render_email_template_response +TestRenderTemplateRequest,test_render_template_request +TestRenderTemplateResponse,test_render_template_response +TestReportSummary,test_report_summary +TestRepositoryTriggersInput,test_repository_triggers_input +TestRepositoryTriggersOutput,test_repository_triggers_output +TestResult,test_result +TestRoleRequest,test_role_request +TestRoleResponse,test_role_response +TestS3Uri,test_s3_uri +TestSegmentPatternRequest,test_segment_pattern_request +TestSegmentPatternResponse,test_segment_pattern_response +TestSetDiscrepancyErrors,test_set_discrepancy_errors +TestSetDiscrepancyReportBotAliasTarget,test_set_discrepancy_report_bot_alias_target +TestSetDiscrepancyReportResourceTarget,test_set_discrepancy_report_resource_target +TestSetExportSpecification,test_set_export_specification +TestSetGenerationDataSource,test_set_generation_data_source +TestSetImportInputLocation,test_set_import_input_location +TestSetImportResourceSpecification,test_set_import_resource_specification +TestSetIntentDiscrepancyItem,test_set_intent_discrepancy_item +TestSetSlotDiscrepancyItem,test_set_slot_discrepancy_item +TestSetSortBy,test_set_sort_by +TestSetStorageLocation,test_set_storage_location +TestSetSummary,test_set_summary +TestSetTurnRecord,test_set_turn_record +TestSetTurnResult,test_set_turn_result +TestTypeInput,test_type_input +TestTypeOutput,test_type_output +TestWindowEnd,test_window_end +TestWindowStart,test_window_start +TestWindowSummary,test_window_summary +TestWindows,test_windows +TestWirelessDeviceRequest,test_wireless_device_request +TestWirelessDeviceResponse,test_wireless_device_response +TestingData,testing_data +TestingDataResult,testing_data_result +Text,text +TextArea,text_area +TextAreaControlDisplayOptions,text_area_control_display_options +TextArrayOptions,text_array_options +TextBody,text_body +TextBoxes,text_boxes +TextClassificationJobConfig,text_classification_job_config +TextColor,text_color +TextConditionalFormat,text_conditional_format +TextConfig,text_config +TextContent,text_content +TextContentUpdate,text_content_update +TextControlPlaceholderOptions,text_control_placeholder_options +TextDetection,text_detection +TextDetectionResult,text_detection_result +TextDetections,text_detections +TextDocumentStatistics,text_document_statistics +TextField,text_field +TextFieldControlDisplayOptions,text_field_control_display_options +TextFormat,text_format +TextInputEvent,text_input_event +TextInputSpecification,text_input_specification +TextLengthExceededException,text_length_exceeded_exception +TextList,text_list +TextLocales,text_locales +TextLogDestination,text_log_destination +TextLogSetting,text_log_setting +TextModelVersion,text_model_version +TextOptions,text_options +TextPart,text_part +TextPlain,text_plain +TextQualifier,text_qualifier +TextResponseEvent,text_response_event +TextSizeLimitExceededException,text_size_limit_exceeded_exception +TextTransformation,text_transformation +TextTransformations,text_transformations +TextTranslationJobFilter,text_translation_job_filter +TextTranslationJobProperties,text_translation_job_properties +TextTranslationJobPropertiesList,text_translation_job_properties_list +TextType,text_type +TextWithHighlights,text_with_highlights +TextWithHighlightsValue,text_with_highlights_value +TextWrap,text_wrap +Theme,theme +ThemeAlias,theme_alias +ThemeAliasList,theme_alias_list +ThemeArn,theme_arn +ThemeConfiguration,theme_configuration +ThemeError,theme_error +ThemeId,theme_id +ThemeSummary,theme_summary +ThemeSummaryList,theme_summary_list +ThemeValue,theme_value +ThemeValues,theme_values +ThemeVersion,theme_version +ThemeVersionNumber,theme_version_number +ThemeVersionSummary,theme_version_summary +ThemeVersionSummaryList,theme_version_summary_list +Themes,themes +ThesaurusSummary,thesaurus_summary +ThesaurusSummaryItems,thesaurus_summary_items +Thickness,thickness +Thing,thing +ThingArn,thing_arn +ThingAttribute,thing_attribute +ThingConnectivity,thing_connectivity +ThingDocument,thing_document +ThingGroupDocument,thing_group_document +ThingGroupIndexingConfiguration,thing_group_indexing_configuration +ThingGroupMetadata,thing_group_metadata +ThingGroupProperties,thing_group_properties +ThingIndexingConfiguration,thing_indexing_configuration +ThingName,thing_name +ThingTypeDefinition,thing_type_definition +ThingTypeMetadata,thing_type_metadata +ThingTypeProperties,thing_type_properties +ThirdPartyFirewall,third_party_firewall +ThirdPartyFirewallFirewallPolicies,third_party_firewall_firewall_policies +ThirdPartyFirewallFirewallPolicy,third_party_firewall_firewall_policy +ThirdPartyFirewallMissingExpectedRouteTableViolation,third_party_firewall_missing_expected_route_table_violation +ThirdPartyFirewallMissingFirewallViolation,third_party_firewall_missing_firewall_violation +ThirdPartyFirewallMissingSubnetViolation,third_party_firewall_missing_subnet_violation +ThirdPartyFirewallPolicy,third_party_firewall_policy +ThirdPartyFirewallStatus,third_party_firewall_status +ThirdPartyJob,third_party_job +ThirdPartyJobData,third_party_job_data +ThirdPartyJobDetails,third_party_job_details +ThirdPartySourceRepository,third_party_source_repository +ThousandSeparatorOptions,thousand_separator_options +ThousandsSeparator,thousands_separator +ThreadFieldMappings,thread_field_mappings +ThreadId,thread_id +ThreadsPerCore,threads_per_core +Threat,threat +ThreatDetectedByName,threat_detected_by_name +ThreatIntelIndicator,threat_intel_indicator +ThreatIntelIndicatorCategory,threat_intel_indicator_category +ThreatIntelIndicatorLastObservedAt,threat_intel_indicator_last_observed_at +ThreatIntelIndicatorSource,threat_intel_indicator_source +ThreatIntelIndicatorSourceUrl,threat_intel_indicator_source_url +ThreatIntelIndicatorType,threat_intel_indicator_type +ThreatIntelIndicatorValue,threat_intel_indicator_value +ThreatIntelIndicators,threat_intel_indicators +ThreatIntelSetId,threat_intel_set_id +ThreatIntelSetIds,threat_intel_set_ids +ThreatIntelligenceDetail,threat_intelligence_detail +ThreatIntelligenceDetails,threat_intelligence_details +ThreatListName,threat_list_name +ThreatName,threat_name +ThreatNames,threat_names +Threats,threats +ThreatsDetectedItemCount,threats_detected_item_count +Threshold,threshold +ThresholdComparator,threshold_comparator +ThresholdCount,threshold_count +ThresholdExpression,threshold_expression +ThresholdFraction,threshold_fraction +ThresholdMetricId,threshold_metric_id +ThresholdPercentage,threshold_percentage +ThresholdType,threshold_type +ThresholdV2,threshold_v2 +ThresholdValue,threshold_value +ThresholdsWaitTime,thresholds_wait_time +ThrottleCount,throttle_count +ThrottleSettings,throttle_settings +ThrottledClientException,throttled_client_exception +ThrottledException,throttled_exception +ThrottlingBurstLimit,throttling_burst_limit +ThrottlingException,throttling_exception +ThrottlingRateLimit,throttling_rate_limit +ThroughResources,through_resources +ThroughResourcesStatement,through_resources_statement +ThroughResourcesStatementRequest,through_resources_statement_request +Throughput,throughput +ThroughputCapacity,throughput_capacity +ThroughputLimitExceeded,throughput_limit_exceeded +ThroughputMode,throughput_mode +ThroughputOther,throughput_other +ThroughputRead,throughput_read +ThroughputTotal,throughput_total +ThroughputWrite,throughput_write +ThrowOnDuplicate,throw_on_duplicate +Thumbnail,thumbnail +ThumbnailConfig,thumbnail_config +ThumbnailConfiguration,thumbnail_configuration +ThumbnailDetail,thumbnail_detail +ThumbnailDetails,thumbnail_details +ThumbnailEncryption,thumbnail_encryption +ThumbnailHeight,thumbnail_height +ThumbnailInterval,thumbnail_interval +ThumbnailPattern,thumbnail_pattern +ThumbnailType,thumbnail_type +ThumbnailWidth,thumbnail_width +Thumbnails,thumbnails +Thumbprint,thumbprint +ThumbprintList,thumbprint_list +Thursday,thursday +TicServerUrl,tic_server_url +TickLabelOptions,tick_label_options +TicketId,ticket_id +TicketIds,ticket_ids +TicketList,ticket_list +Tier,tier +Tiering,tiering +TieringPolicy,tiering_policy +TieringStartTime,tiering_start_time +Tierings,tierings +Tile,tile +TileAspectRatio,tile_aspect_ratio +TileCount,tile_count +TileHeight,tile_height +TileLayout,tile_layout +TileLayoutStyle,tile_layout_style +TileOrder,tile_order +TilePosition,tile_position +TileStyle,tile_style +TileWidth,tile_width +Tiles,tiles +Time,time +TimeAlignmentBoundary,time_alignment_boundary +TimeBasedAutoScalingConfiguration,time_based_auto_scaling_configuration +TimeBasedAutoScalingConfigurations,time_based_auto_scaling_configurations +TimeBasedCanary,time_based_canary +TimeBasedCollectionScheme,time_based_collection_scheme +TimeBasedForecastProperties,time_based_forecast_properties +TimeBasedLinear,time_based_linear +TimeColumn,time_column +TimeCommitmentInSeconds,time_commitment_in_seconds +TimeCreated,time_created +TimeDelaySeconds,time_delay_seconds +TimeDelta,time_delta +TimeDeltaUnits,time_delta_units +TimeEqualityFilter,time_equality_filter +TimeFormat,time_format +TimeGranularity,time_granularity +TimeInNanos,time_in_nanos +TimeLeftSeconds,time_left_seconds +TimeLimitExceededException,time_limit_exceeded_exception +TimeLoggingStarted,time_logging_started +TimeLoggingStopped,time_logging_stopped +TimeOfDay,time_of_day +TimeOfTheDay,time_of_the_day +TimeOffset,time_offset +TimePeriod,time_period +TimePointGranularity,time_point_granularity +TimeRange,time_range +TimeRangeDrillDownFilter,time_range_drill_down_filter +TimeRangeFilter,time_range_filter +TimeRangeFilterInput,time_range_filter_input +TimeRangeFilterOutput,time_range_filter_output +TimeRangeFilterValue,time_range_filter_value +TimeRangeLowerBound,time_range_lower_bound +TimeRangeType,time_range_type +TimeRangeUpperBound,time_range_upper_bound +TimeRangeValue,time_range_value +TimeRanges,time_ranges +TimeSeries,time_series +TimeSeriesCondition,time_series_condition +TimeSeriesConditions,time_series_conditions +TimeSeriesConfig,time_series_config +TimeSeriesDataPoint,time_series_data_point +TimeSeriesFeedback,time_series_feedback +TimeSeriesForecastingJobConfig,time_series_forecasting_job_config +TimeSeriesForecastingSettings,time_series_forecasting_settings +TimeSeriesGranularity,time_series_granularity +TimeSeriesId,time_series_id +TimeSeriesIdentifiers,time_series_identifiers +TimeSeriesList,time_series_list +TimeSeriesMeasureValueColumnInfo,time_series_measure_value_column_info +TimeSeriesReplacementsDataSource,time_series_replacements_data_source +TimeSeriesSelector,time_series_selector +TimeSeriesServiceStatistics,time_series_service_statistics +TimeSeriesSummaries,time_series_summaries +TimeSeriesSummary,time_series_summary +TimeSeriesTransformation,time_series_transformation +TimeSeriesTransformations,time_series_transformations +TimeSeriesValue,time_series_value +TimeSignalMessage,time_signal_message +TimeSpan,time_span +TimeStamp,time_stamp +TimeToLive,time_to_live +TimeToLiveDescription,time_to_live_description +TimeToLiveInSeconds,time_to_live_in_seconds +TimeToLiveSpecification,time_to_live_specification +TimeToLiveStatus,time_to_live_status +TimeUnit,time_unit +TimeWindow,time_window +TimeZone,time_zone +TimeZoneId,time_zone_id +Timecode,timecode +TimecodeBurnin,timecode_burnin +TimecodeBurninSettings,timecode_burnin_settings +TimecodeConfig,timecode_config +TimecodeInsertion,timecode_insertion +TimecodeSource,timecode_source +TimecodeStart,timecode_start +TimedMetadata,timed_metadata +TimedMetadataBehavior,timed_metadata_behavior +TimedMetadataBoxVersion,timed_metadata_box_version +TimedMetadataId3Frame,timed_metadata_id3_frame +TimedMetadataId3Period,timed_metadata_id3_period +TimedMetadataInsertion,timed_metadata_insertion +TimedMetadataPid,timed_metadata_pid +TimedMetadataSchemeIdUri,timed_metadata_scheme_id_uri +TimedMetadataValue,timed_metadata_value +TimedOutSteps,timed_out_steps +TimeframeCap,timeframe_cap +Timeline,timeline +TimelineEvent,timeline_event +Timeout,timeout +TimeoutAction,timeout_action +TimeoutActions,timeout_actions +TimeoutConfig,timeout_config +TimeoutCount,timeout_count +TimeoutDurationMinutes,timeout_duration_minutes +TimeoutInMillis,timeout_in_millis +TimeoutInMinutes,timeout_in_minutes +TimeoutInSeconds,timeout_in_seconds +TimeoutSeconds,timeout_seconds +Timer,timer +TimerCanceledEventAttributes,timer_canceled_event_attributes +TimerDefinition,timer_definition +TimerFiredEventAttributes,timer_fired_event_attributes +TimerStartedEventAttributes,timer_started_event_attributes +TimerType,timer_type +TimerValue,timer_value +Timers,timers +Times,times +Timestamp,timestamp +TimestampAttributeName,timestamp_attribute_name +TimestampColumn,timestamp_column +TimestampColumnName,timestamp_column_name +TimestampDeltaMilliseconds,timestamp_delta_milliseconds +TimestampForCollection,timestamp_for_collection +TimestampFormat,timestamp_format +TimestampFormats,timestamp_formats +TimestampList,timestamp_list +TimestampMetricValuePair,timestamp_metric_value_pair +TimestampMetricValuePairList,timestamp_metric_value_pair_list +TimestampOffset,timestamp_offset +TimestampOffsetMode,timestamp_offset_mode +TimestampOutOfBoundsException,timestamp_out_of_bounds_exception +TimestampPartition,timestamp_partition +TimestampRange,timestamp_range +TimestampRanges,timestamp_ranges +TimestampStructure,timestamp_structure +TimestampValue,timestamp_value +Timestamps,timestamps +TimestreamAction,timestream_action +TimestreamConfig,timestream_config +TimestreamConfiguration,timestream_configuration +TimestreamDestination,timestream_destination +TimestreamDimension,timestream_dimension +TimestreamRegistrationResponse,timestream_registration_response +TimestreamResources,timestream_resources +TimestreamSettings,timestream_settings +TimestreamTimestamp,timestream_timestamp +Timezone,timezone +TimezoneEstimationMethods,timezone_estimation_methods +TimezoneName,timezone_name +TimezoneOffset,timezone_offset +TimezonesCompletedCount,timezones_completed_count +TimezonesTotalCount,timezones_total_count +Timing,timing +TimingInformation,timing_information +TipOfSourceReferenceIsDifferentException,tip_of_source_reference_is_different_exception +TipsDivergenceExceededException,tips_divergence_exceeded_exception +Title,title +TitleAggregation,title_aggregation +TitleAggregationResponse,title_aggregation_response +TitleOptions,title_options +TitleOverride,title_override +TitleRequiredException,title_required_exception +Tld,tld +TlogAccessMode,tlog_access_mode +Tls,tls +TlsCertificate,tls_certificate +TlsCertificateData,tls_certificate_data +TlsCiphers,tls_ciphers +TlsConfig,tls_config +TlsConfigInput,tls_config_input +TlsContext,tls_context +TlsPolicy,tls_policy +TlsSessionResumptionMode,tls_session_resumption_mode +TlsValidationContext,tls_validation_context +TlsValidationContextAcmTrust,tls_validation_context_acm_trust +TlsValidationContextFileTrust,tls_validation_context_file_trust +TlsValidationContextSdsTrust,tls_validation_context_sds_trust +TmpDirIAMRole,tmp_dir_iam_role +Tmpfs,tmpfs +To,to +ToAddresses,to_addresses +ToDate,to_date +ToDbClusterArn,to_db_cluster_arn +ToExclusive,to_exclusive +ToKey,to_key +ToPhoneNumber,to_phone_number +ToPort,to_port +ToTime,to_time +ToTimeStamp,to_time_stamp +ToType,to_type +ToggleButtonsVisibility,toggle_buttons_visibility +Token,token +TokenAlreadyExistsException,token_already_exists_exception +TokenBalance,token_balance +TokenCode,token_code +TokenData,token_data +TokenDomains,token_domains +TokenDuration,token_duration +TokenEndpoint,token_endpoint +TokenFilter,token_filter +TokenId,token_id +TokenIdentifier,token_identifier +TokenIds,token_ids +TokenKey,token_key +TokenKeyId,token_key_id +TokenProperties,token_properties +TokenType,token_type +TokenValidityUnits,token_validity_units +TokenValidityUnitsType,token_validity_units_type +TokenValue,token_value +TokenizedBody,tokenized_body +TokenizedTitle,tokenized_title +Tokens,tokens +TollFreePrefix,toll_free_prefix +TooLongCSPInResponseHeadersPolicy,too_long_csp_in_response_headers_policy +TooManyAccessPointsException,too_many_access_points_exception +TooManyActionsException,too_many_actions_exception +TooManyApplicationVersionsException,too_many_application_versions_exception +TooManyApplicationsException,too_many_applications_exception +TooManyBucketsException,too_many_buckets_exception +TooManyCacheBehaviors,too_many_cache_behaviors +TooManyCachePolicies,too_many_cache_policies +TooManyCertificates,too_many_certificates +TooManyCertificatesException,too_many_certificates_exception +TooManyCloudFrontOriginAccessIdentities,too_many_cloud_front_origin_access_identities +TooManyConfigurationTemplatesException,too_many_configuration_templates_exception +TooManyContinuousDeploymentPolicies,too_many_continuous_deployment_policies +TooManyCookieNamesInWhiteList,too_many_cookie_names_in_white_list +TooManyCookiesInCachePolicy,too_many_cookies_in_cache_policy +TooManyCookiesInOriginRequestPolicy,too_many_cookies_in_origin_request_policy +TooManyCustomHeadersInResponseHeadersPolicy,too_many_custom_headers_in_response_headers_policy +TooManyDistributionCNAMEs,too_many_distribution_cnames +TooManyDistributions,too_many_distributions +TooManyDistributionsAssociatedToCachePolicy,too_many_distributions_associated_to_cache_policy +TooManyDistributionsAssociatedToFieldLevelEncryptionConfig,too_many_distributions_associated_to_field_level_encryption_config +TooManyDistributionsAssociatedToKeyGroup,too_many_distributions_associated_to_key_group +TooManyDistributionsAssociatedToOriginAccessControl,too_many_distributions_associated_to_origin_access_control +TooManyDistributionsAssociatedToOriginRequestPolicy,too_many_distributions_associated_to_origin_request_policy +TooManyDistributionsAssociatedToResponseHeadersPolicy,too_many_distributions_associated_to_response_headers_policy +TooManyDistributionsWithFunctionAssociations,too_many_distributions_with_function_associations +TooManyDistributionsWithLambdaAssociations,too_many_distributions_with_lambda_associations +TooManyDistributionsWithSingleFunctionARN,too_many_distributions_with_single_function_arn +TooManyEntriesInBatchRequestException,too_many_entries_in_batch_request_exception +TooManyEnvironmentsException,too_many_environments_exception +TooManyFailedAttemptsException,too_many_failed_attempts_exception +TooManyFieldLevelEncryptionConfigs,too_many_field_level_encryption_configs +TooManyFieldLevelEncryptionContentTypeProfiles,too_many_field_level_encryption_content_type_profiles +TooManyFieldLevelEncryptionEncryptionEntities,too_many_field_level_encryption_encryption_entities +TooManyFieldLevelEncryptionFieldPatterns,too_many_field_level_encryption_field_patterns +TooManyFieldLevelEncryptionProfiles,too_many_field_level_encryption_profiles +TooManyFieldLevelEncryptionQueryArgProfiles,too_many_field_level_encryption_query_arg_profiles +TooManyFunctionAssociations,too_many_function_associations +TooManyFunctions,too_many_functions +TooManyHeadersInCachePolicy,too_many_headers_in_cache_policy +TooManyHeadersInForwardedValues,too_many_headers_in_forwarded_values +TooManyHeadersInOriginRequestPolicy,too_many_headers_in_origin_request_policy +TooManyHealthChecks,too_many_health_checks +TooManyHostedZones,too_many_hosted_zones +TooManyInvalidationsInProgress,too_many_invalidations_in_progress +TooManyKeyGroups,too_many_key_groups +TooManyKeyGroupsAssociatedToDistribution,too_many_key_groups_associated_to_distribution +TooManyKeySigningKeys,too_many_key_signing_keys +TooManyLabelsException,too_many_labels_exception +TooManyLambdaFunctionAssociations,too_many_lambda_function_associations +TooManyListenersException,too_many_listeners_exception +TooManyLoadBalancersException,too_many_load_balancers_exception +TooManyOriginAccessControls,too_many_origin_access_controls +TooManyOriginCustomHeaders,too_many_origin_custom_headers +TooManyOriginGroupsPerDistribution,too_many_origin_groups_per_distribution +TooManyOriginRequestPolicies,too_many_origin_request_policies +TooManyOrigins,too_many_origins +TooManyPlatformsException,too_many_platforms_exception +TooManyPoliciesException,too_many_policies_exception +TooManyPublicKeys,too_many_public_keys +TooManyPublicKeysInKeyGroup,too_many_public_keys_in_key_group +TooManyQueryStringParameters,too_many_query_string_parameters +TooManyQueryStringsInCachePolicy,too_many_query_strings_in_cache_policy +TooManyQueryStringsInOriginRequestPolicy,too_many_query_strings_in_origin_request_policy +TooManyRealtimeLogConfigs,too_many_realtime_log_configs +TooManyRegistrationsForTargetIdException,too_many_registrations_for_target_id_exception +TooManyRemoveHeadersInResponseHeadersPolicy,too_many_remove_headers_in_response_headers_policy +TooManyRequests,too_many_requests +TooManyRequestsException,too_many_requests_exception +TooManyResponseHeadersPolicies,too_many_response_headers_policies +TooManyRulesException,too_many_rules_exception +TooManyStreamingDistributionCNAMEs,too_many_streaming_distribution_cnames +TooManyStreamingDistributions,too_many_streaming_distributions +TooManySubscriptionsException,too_many_subscriptions_exception +TooManyTagKeysException,too_many_tag_keys_exception +TooManyTags,too_many_tags +TooManyTagsException,too_many_tags_exception +TooManyTagsFault,too_many_tags_fault +TooManyTargetGroupsException,too_many_target_groups_exception +TooManyTargetsException,too_many_targets_exception +TooManyTrafficPolicies,too_many_traffic_policies +TooManyTrafficPolicyInstances,too_many_traffic_policy_instances +TooManyTrafficPolicyVersionsForCurrentPolicy,too_many_traffic_policy_versions_for_current_policy +TooManyTrustedSigners,too_many_trusted_signers +TooManyUniqueTargetGroupsPerLoadBalancerException,too_many_unique_target_groups_per_load_balancer_exception +TooManyUpdates,too_many_updates +TooManyVPCAssociationAuthorizations,too_many_vpc_association_authorizations +Tool,tool +Toolchain,toolchain +ToolchainSource,toolchain_source +ToolsVersion,tools_version +Tooltip,tooltip +TooltipFields,tooltip_fields +TooltipItem,tooltip_item +TooltipOptions,tooltip_options +TooltipTitleType,tooltip_title_type +TooltipVisibility,tooltip_visibility +Top,top +TopAnomalousServices,top_anomalous_services +TopAnswer,top_answer +TopBottomFilter,top_bottom_filter +TopBottomMovers,top_bottom_movers +TopBottomMoversComputation,top_bottom_movers_computation +TopBottomRanked,top_bottom_ranked +TopBottomRankedComputation,top_bottom_ranked_computation +TopContributors,top_contributors +TopOffset,top_offset +TopResources,top_resources +Topic,topic +TopicARN,topic_arn +TopicArn,topic_arn +TopicCalculatedField,topic_calculated_field +TopicCategoryFilter,topic_category_filter +TopicCategoryFilterConstant,topic_category_filter_constant +TopicColumn,topic_column +TopicConfiguration,topic_configuration +TopicConfigurations,topic_configurations +TopicDateRangeFilter,topic_date_range_filter +TopicDefaultPreferences,topic_default_preferences +TopicDetails,topic_details +TopicFilter,topic_filter +TopicId,topic_id +TopicLimitExceededException,topic_limit_exceeded_exception +TopicName,topic_name +TopicNamedEntity,topic_named_entity +TopicNames,topic_names +TopicNumericEqualityFilter,topic_numeric_equality_filter +TopicNumericRangeFilter,topic_numeric_range_filter +TopicPreference,topic_preference +TopicPreferences,topic_preferences +TopicRangeFilterConstant,topic_range_filter_constant +TopicRefreshDetails,topic_refresh_details +TopicRefreshSchedule,topic_refresh_schedule +TopicRefreshScheduleSummary,topic_refresh_schedule_summary +TopicRelativeDateFilter,topic_relative_date_filter +TopicRule,topic_rule +TopicRuleDestination,topic_rule_destination +TopicRuleDestinationConfiguration,topic_rule_destination_configuration +TopicRuleDestinationSummary,topic_rule_destination_summary +TopicRuleListItem,topic_rule_list_item +TopicRulePayload,topic_rule_payload +TopicScheduleType,topic_schedule_type +TopicSingularFilterConstant,topic_singular_filter_constant +TopicStatus,topic_status +TopicSummary,topic_summary +Topics,topics +TopicsDetectionJobFilter,topics_detection_job_filter +TopicsDetectionJobProperties,topics_detection_job_properties +TopicsDetectionJobPropertiesList,topics_detection_job_properties_list +TopicsSummaries,topics_summaries +Topk,topk +ToscaOverride,tosca_override +Total,total +TotalActions,total_actions +TotalActualHours,total_actual_hours +TotalActualSpend,total_actual_spend +TotalActualUnits,total_actual_units +TotalAddressCount,total_address_count +TotalAggregation,total_aggregation +TotalAggregationComputation,total_aggregation_computation +TotalAmortizedCommitment,total_amortized_commitment +TotalAmortizedFee,total_amortized_fee +TotalAuthenticatedEntities,total_authenticated_entities +TotalAvailableAddressCount,total_available_address_count +TotalBackupSizeInMegaBytes,total_backup_size_in_mega_bytes +TotalBarLabel,total_bar_label +TotalBytes,total_bytes +TotalCap,total_cap +TotalCapacity,total_capacity +TotalCapacityProvisioned,total_capacity_provisioned +TotalCapacityUsed,total_capacity_used +TotalCellStyle,total_cell_style +TotalCodeSize,total_code_size +TotalCommitment,total_commitment +TotalCost,total_cost +TotalCount,total_count +TotalDataInMegaBytes,total_data_in_mega_bytes +TotalDiscoveredResources,total_discovered_resources +TotalDuration,total_duration +TotalEndpointCount,total_endpoint_count +TotalEntries,total_entries +TotalEstimatedMonthlySavingsAmount,total_estimated_monthly_savings_amount +TotalEstimatedMonthlySavingsPercentage,total_estimated_monthly_savings_percentage +TotalExecutionTimeInMillis,total_execution_time_in_millis +TotalExpectedSpend,total_expected_spend +TotalExtractedDataInGB,total_extracted_data_in_gb +TotalFailures,total_failures +TotalFilteredCount,total_filtered_count +TotalFpgaMemoryInMiB,total_fpga_memory_in_mib +TotalFulfilledCapacity,total_fulfilled_capacity +TotalGb,total_gb +TotalGpuMemoryInMiB,total_gpu_memory_in_mib +TotalHourlyPrice,total_hourly_price +TotalImpact,total_impact +TotalImpactFilter,total_impact_filter +TotalImpactPercentage,total_impact_percentage +TotalInferenceMemoryInMiB,total_inference_memory_in_mib +TotalInstanceCount,total_instance_count +TotalLabeled,total_labeled +TotalLabels,total_labels +TotalLocalStorageGB,total_local_storage_gb +TotalLocalStorageGBRequest,total_local_storage_gb_request +TotalLogicalCapacityUsed,total_logical_capacity_used +TotalNodes,total_nodes +TotalNumRows,total_num_rows +TotalNumberOfDuplicateTimestamps,total_number_of_duplicate_timestamps +TotalNumberOfFiles,total_number_of_files +TotalNumberOfInvalidValues,total_number_of_invalid_values +TotalNumberOfMissingValues,total_number_of_missing_values +TotalNumberOfResults,total_number_of_results +TotalNumberOfRows,total_number_of_rows +TotalNumberOfStages,total_number_of_stages +TotalNumberOfTasks,total_number_of_tasks +TotalNumberOfUnsupportedTimestamps,total_number_of_unsupported_timestamps +TotalNumberOfUsers,total_number_of_users +TotalObjects,total_objects +TotalOptions,total_options +TotalPartsCount,total_parts_count +TotalPercentageArea,total_percentage_area +TotalPieces,total_pieces +TotalPolicyCount,total_policy_count +TotalPotentialRISavings,total_potential_ri_savings +TotalProcessed,total_processed +TotalProvisionedStorageInMegaBytes,total_provisioned_storage_in_mega_bytes +TotalRecommendationCount,total_recommendation_count +TotalRecordCount,total_record_count +TotalResizeDataInMegaBytes,total_resize_data_in_mega_bytes +TotalResourceUtilization,total_resource_utilization +TotalResources,total_resources +TotalResponseTime,total_response_time +TotalResultsCount,total_results_count +TotalRowsInDataset,total_rows_in_dataset +TotalRuleCount,total_rule_count +TotalRunningHours,total_running_hours +TotalRunningHoursInLookbackPeriod,total_running_hours_in_lookback_period +TotalRunningNormalizedUnits,total_running_normalized_units +TotalScheduledInstanceHours,total_scheduled_instance_hours +TotalSegments,total_segments +TotalShards,total_shards +TotalSize,total_size +TotalSizeInGB,total_size_in_gb +TotalSizeLimitExceededException,total_size_limit_exceeded_exception +TotalSnapshotCapacityUsed,total_snapshot_capacity_used +TotalStackInstancesCount,total_stack_instances_count +TotalSteps,total_steps +TotalStorageCapacityInMegaBytes,total_storage_capacity_in_mega_bytes +TotalSuggestionsCount,total_suggestions_count +TotalTargetCapacity,total_target_capacity +TotalUnAssignedShards,total_un_assigned_shards +TotalUpfrontPrice,total_upfront_price +TotalVCpus,total_v_cpus +TotalsVisibility,totals_visibility +ToxicityCategories,toxicity_categories +ToxicityDetection,toxicity_detection +ToxicityDetectionSettings,toxicity_detection_settings +TpmSupport,tpm_support +Trace,trace +TraceConfiguration,trace_configuration +TraceContent,trace_content +TraceHeader,trace_header +TraceId,trace_id +TraceIds,trace_ids +TraceOutput,trace_output +TraceSegmentDocuments,trace_segment_documents +TraceSummaries,trace_summaries +TraceSummary,trace_summary +TraceUser,trace_user +Traceback,traceback +Traces,traces +TracesProcessedCount,traces_processed_count +TracingConfig,tracing_config +TracingConfigResponse,tracing_config_response +TracingConfiguration,tracing_configuration +TracingEnabled,tracing_enabled +Track,track +TrackData,track_data +TrackListMessage,track_list_message +TrackNumber,track_number +TrackSourceSettings,track_source_settings +TrackedActionLastAccessed,tracked_action_last_accessed +TrackedActionsLastAccessed,tracked_actions_last_accessed +TrackedClusterId,tracked_cluster_id +TrackedIsps,tracked_isps +TrackerArn,tracker_arn +TrackerName,tracker_name +TrackingConfig,tracking_config +TrackingInformation,tracking_information +TrackingNumber,tracking_number +TrackingOptions,tracking_options +TrackingOptionsAlreadyExistsException,tracking_options_already_exists_exception +TrackingOptionsDoesNotExistException,tracking_options_does_not_exist_exception +Tracks,tracks +TrafficConfig,traffic_config +TrafficDialPercentage,traffic_dial_percentage +TrafficDirection,traffic_direction +TrafficDistributionGroup,traffic_distribution_group +TrafficDistributionGroupId,traffic_distribution_group_id +TrafficDistributionGroupSummary,traffic_distribution_group_summary +TrafficDistributionGroupSummaryList,traffic_distribution_group_summary_list +TrafficDistributionGroupUserSummary,traffic_distribution_group_user_summary +TrafficDistributionGroupUserSummaryList,traffic_distribution_group_user_summary_list +TrafficMirrorFilter,traffic_mirror_filter +TrafficMirrorFilterId,traffic_mirror_filter_id +TrafficMirrorFilterIds,traffic_mirror_filter_ids +TrafficMirrorFilterRule,traffic_mirror_filter_rule +TrafficMirrorFilterRuleId,traffic_mirror_filter_rule_id +TrafficMirrorFilters,traffic_mirror_filters +TrafficMirrorPortRange,traffic_mirror_port_range +TrafficMirrorPortRangeRequest,traffic_mirror_port_range_request +TrafficMirrorSession,traffic_mirror_session +TrafficMirrorSessionId,traffic_mirror_session_id +TrafficMirrorSessionIds,traffic_mirror_session_ids +TrafficMirrorSessions,traffic_mirror_sessions +TrafficMirrorTarget,traffic_mirror_target +TrafficMirrorTargetId,traffic_mirror_target_id +TrafficMirrorTargetIds,traffic_mirror_target_ids +TrafficMirrorTargets,traffic_mirror_targets +TrafficPattern,traffic_pattern +TrafficPercentageToMonitor,traffic_percentage_to_monitor +TrafficPolicies,traffic_policies +TrafficPolicy,traffic_policy +TrafficPolicyAlreadyExists,traffic_policy_already_exists +TrafficPolicyCount,traffic_policy_count +TrafficPolicyId,traffic_policy_id +TrafficPolicyIdMarker,traffic_policy_id_marker +TrafficPolicyInUse,traffic_policy_in_use +TrafficPolicyInstance,traffic_policy_instance +TrafficPolicyInstanceAlreadyExists,traffic_policy_instance_already_exists +TrafficPolicyInstanceCount,traffic_policy_instance_count +TrafficPolicyInstanceId,traffic_policy_instance_id +TrafficPolicyInstanceNameMarker,traffic_policy_instance_name_marker +TrafficPolicyInstanceTypeMarker,traffic_policy_instance_type_marker +TrafficPolicyInstances,traffic_policy_instances +TrafficPolicySummaries,traffic_policy_summaries +TrafficPolicySummary,traffic_policy_summary +TrafficPolicyType,traffic_policy_type +TrafficPolicyVersion,traffic_policy_version +TrafficPolicyVersionMarker,traffic_policy_version_marker +TrafficRoute,traffic_route +TrafficRoutingConfig,traffic_routing_config +TrafficRoutingConfiguration,traffic_routing_configuration +TrafficSource,traffic_source +TrafficSourceIdentifier,traffic_source_identifier +TrafficSourceState,traffic_source_state +TrafficSourceType,traffic_source_type +TrafficSources,traffic_sources +TrafficType,traffic_type +Trail,trail +TrailARN,trail_arn +TrailAlreadyExistsException,trail_already_exists_exception +TrailArn,trail_arn +TrailInfo,trail_info +TrailName,trail_name +TrailNotFoundException,trail_not_found_exception +TrailNotProvidedException,trail_not_provided_exception +TrailProperties,trail_properties +Trails,trails +TrainedModelArn,trained_model_arn +TrainedModelMetrics,trained_model_metrics +TrainingChannels,training_channels +TrainingData,training_data +TrainingDataConfig,training_data_config +TrainingDataEndTime,training_data_end_time +TrainingDataResult,training_data_result +TrainingDataSchema,training_data_schema +TrainingDataSourceId,training_data_source_id +TrainingDataStartTime,training_data_start_time +TrainingEndTime,training_end_time +TrainingEndTimestamp,training_end_timestamp +TrainingExecutionEndTime,training_execution_end_time +TrainingExecutionStartTime,training_execution_start_time +TrainingImage,training_image +TrainingImageConfig,training_image_config +TrainingImageDigest,training_image_digest +TrainingInputMode,training_input_mode +TrainingJob,training_job +TrainingJobArn,training_job_arn +TrainingJobDefinition,training_job_definition +TrainingJobDefinitionName,training_job_definition_name +TrainingJobDefinitions,training_job_definitions +TrainingJobEarlyStoppingType,training_job_early_stopping_type +TrainingJobName,training_job_name +TrainingJobStatus,training_job_status +TrainingJobStatusCounters,training_job_status_counters +TrainingJobStepMetadata,training_job_step_metadata +TrainingJobSummaries,training_job_summaries +TrainingJobSummary,training_job_summary +TrainingMetrics,training_metrics +TrainingMetricsV2,training_metrics_v2 +TrainingParameters,training_parameters +TrainingRepositoryAccessMode,training_repository_access_mode +TrainingRepositoryAuthConfig,training_repository_auth_config +TrainingRepositoryCredentialsProviderArn,training_repository_credentials_provider_arn +TrainingResult,training_result +TrainingResultV2,training_result_v2 +TrainingSpecification,training_specification +TrainingStartTime,training_start_time +TrainingTimeInSeconds,training_time_in_seconds +Trait,trait +TraitDiffRule,trait_diff_rule +Traits,traits +TransactGetItem,transact_get_item +TransactGetItemsInput,transact_get_items_input +TransactGetItemsOutput,transact_get_items_output +TransactItems,transact_items +TransactStatements,transact_statements +TransactWriteItem,transact_write_item +TransactWriteItemsInput,transact_write_items_input +TransactWriteItemsOutput,transact_write_items_output +Transaction,transaction +TransactionCanceledException,transaction_canceled_exception +TransactionCommitInProgressException,transaction_commit_in_progress_exception +TransactionCommittedException,transaction_committed_exception +TransactionConflictException,transaction_conflict_exception +TransactionData,transaction_data +TransactionDescription,transaction_description +TransactionEndTime,transaction_end_time +TransactionEvent,transaction_event +TransactionId,transaction_id +TransactionInProgressException,transaction_in_progress_exception +TransactionOutputItem,transaction_output_item +TransactionStartTime,transaction_start_time +TransactionStatus,transaction_status +TransactionType,transaction_type +TransactionalMessagesPerSecond,transactional_messages_per_second +Transactions,transactions +TranscodeProfileName,transcode_profile_name +Transcript,transcript +TranscriptEvent,transcript_event +TranscriptFileUri,transcript_file_uri +TranscriptFilter,transcript_filter +TranscriptFilterType,transcript_filter_type +TranscriptResultStream,transcript_result_stream +TranscriptSourceSetting,transcript_source_setting +TranscriptionConfiguration,transcription_configuration +TranscriptionJob,transcription_job +TranscriptionJobName,transcription_job_name +TranscriptionJobStatus,transcription_job_status +TranscriptionJobSummaries,transcription_job_summaries +TranscriptionJobSummary,transcription_job_summary +TranscriptionMessages,transcription_messages +TranscriptionMessagesConcatenationConfiguration,transcription_messages_concatenation_configuration +TransferAccountId,transfer_account_id +TransferAlreadyCompletedException,transfer_already_completed_exception +TransferCertificateRequest,transfer_certificate_request +TransferCertificateResponse,transfer_certificate_response +TransferConflictException,transfer_conflict_exception +TransferContactRequest,transfer_contact_request +TransferContactResponse,transfer_contact_response +TransferData,transfer_data +TransferDomainRequest,transfer_domain_request +TransferDomainResponse,transfer_domain_response +TransferDomainToAnotherAwsAccountRequest,transfer_domain_to_another_aws_account_request +TransferDomainToAnotherAwsAccountResponse,transfer_domain_to_another_aws_account_response +TransferDuration,transfer_duration +TransferId,transfer_id +TransferInputDeviceRequest,transfer_input_device_request +TransferLock,transfer_lock +TransferMessage,transfer_message +TransferMode,transfer_mode +TransferOfferAcceptedTimestamp,transfer_offer_accepted_timestamp +TransferOfferExpirationTimestamp,transfer_offer_expiration_timestamp +TransferOption,transfer_option +TransferPrice,transfer_price +TransferStatus,transfer_status +TransferType,transfer_type +Transferability,transferability +Transferable,transferable +Transferred,transferred +TransferringInputDeviceSummary,transferring_input_device_summary +Transform,transform +TransformConfigParameter,transform_config_parameter +TransformDataSource,transform_data_source +TransformEncryption,transform_encryption +TransformEndTime,transform_end_time +TransformFilterCriteria,transform_filter_criteria +TransformId,transform_id +TransformIds,transform_ids +TransformInput,transform_input +TransformJob,transform_job +TransformJobArn,transform_job_arn +TransformJobDefinition,transform_job_definition +TransformJobName,transform_job_name +TransformJobStatus,transform_job_status +TransformJobStepMetadata,transform_job_step_metadata +TransformJobSummaries,transform_job_summaries +TransformJobSummary,transform_job_summary +TransformName,transform_name +TransformOutput,transform_output +TransformParameters,transform_parameters +TransformProcessingConfig,transform_processing_config +TransformResources,transform_resources +TransformS3DataSource,transform_s3_data_source +TransformSchema,transform_schema +TransformSortCriteria,transform_sort_criteria +TransformStartTime,transform_start_time +TransformType,transform_type +TransformationConfigurations,transformation_configurations +TransformationRules,transformation_rules +TransformationTool,transformation_tool +Transformations,transformations +Transforms,transforms +TransitEncryption,transit_encryption +TransitEncryptionEnabled,transit_encryption_enabled +TransitEncryptionMode,transit_encryption_mode +TransitEncryptionPort,transit_encryption_port +TransitGateway,transit_gateway +TransitGatewayAddress,transit_gateway_address +TransitGatewayArn,transit_gateway_arn +TransitGatewayArns,transit_gateway_arns +TransitGatewayAsn,transit_gateway_asn +TransitGatewayAssociation,transit_gateway_association +TransitGatewayAttachment,transit_gateway_attachment +TransitGatewayAttachmentArn,transit_gateway_attachment_arn +TransitGatewayAttachmentAssociation,transit_gateway_attachment_association +TransitGatewayAttachmentBgpConfiguration,transit_gateway_attachment_bgp_configuration +TransitGatewayAttachmentId,transit_gateway_attachment_id +TransitGatewayAttachmentIds,transit_gateway_attachment_ids +TransitGatewayAttachmentPropagation,transit_gateway_attachment_propagation +TransitGatewayAttachmentPropagations,transit_gateway_attachment_propagations +TransitGatewayAttachments,transit_gateway_attachments +TransitGatewayCidrBlocks,transit_gateway_cidr_blocks +TransitGatewayConfiguration,transit_gateway_configuration +TransitGatewayConnect,transit_gateway_connect +TransitGatewayConnectOptions,transit_gateway_connect_options +TransitGatewayConnectPeer,transit_gateway_connect_peer +TransitGatewayConnectPeerArn,transit_gateway_connect_peer_arn +TransitGatewayConnectPeerArns,transit_gateway_connect_peer_arns +TransitGatewayConnectPeerAssociation,transit_gateway_connect_peer_association +TransitGatewayConnectPeerAssociations,transit_gateway_connect_peer_associations +TransitGatewayConnectPeerConfiguration,transit_gateway_connect_peer_configuration +TransitGatewayConnectPeerId,transit_gateway_connect_peer_id +TransitGatewayConnectPeerIds,transit_gateway_connect_peer_ids +TransitGatewayConnectPeers,transit_gateway_connect_peers +TransitGatewayConnectRequestBgpOptions,transit_gateway_connect_request_bgp_options +TransitGatewayConnects,transit_gateway_connects +TransitGatewayId,transit_gateway_id +TransitGatewayIds,transit_gateway_ids +TransitGatewayMulticastDeregisteredGroupMembers,transit_gateway_multicast_deregistered_group_members +TransitGatewayMulticastDeregisteredGroupSources,transit_gateway_multicast_deregistered_group_sources +TransitGatewayMulticastDomain,transit_gateway_multicast_domain +TransitGatewayMulticastDomainArn,transit_gateway_multicast_domain_arn +TransitGatewayMulticastDomainAssociation,transit_gateway_multicast_domain_association +TransitGatewayMulticastDomainAssociations,transit_gateway_multicast_domain_associations +TransitGatewayMulticastDomainId,transit_gateway_multicast_domain_id +TransitGatewayMulticastDomainIds,transit_gateway_multicast_domain_ids +TransitGatewayMulticastDomainOptions,transit_gateway_multicast_domain_options +TransitGatewayMulticastDomains,transit_gateway_multicast_domains +TransitGatewayMulticastGroup,transit_gateway_multicast_group +TransitGatewayMulticastRegisteredGroupMembers,transit_gateway_multicast_registered_group_members +TransitGatewayMulticastRegisteredGroupSources,transit_gateway_multicast_registered_group_sources +TransitGatewayOptions,transit_gateway_options +TransitGatewayOwnerId,transit_gateway_owner_id +TransitGatewayPeering,transit_gateway_peering +TransitGatewayPeeringAttachment,transit_gateway_peering_attachment +TransitGatewayPeeringAttachmentId,transit_gateway_peering_attachment_id +TransitGatewayPeeringAttachmentOptions,transit_gateway_peering_attachment_options +TransitGatewayPeeringAttachments,transit_gateway_peering_attachments +TransitGatewayPolicyRule,transit_gateway_policy_rule +TransitGatewayPolicyRuleMetaData,transit_gateway_policy_rule_meta_data +TransitGatewayPolicyTable,transit_gateway_policy_table +TransitGatewayPolicyTableAssociation,transit_gateway_policy_table_association +TransitGatewayPolicyTableEntries,transit_gateway_policy_table_entries +TransitGatewayPolicyTableEntry,transit_gateway_policy_table_entry +TransitGatewayPolicyTableId,transit_gateway_policy_table_id +TransitGatewayPolicyTableIds,transit_gateway_policy_table_ids +TransitGatewayPolicyTables,transit_gateway_policy_tables +TransitGatewayPrefixListAttachment,transit_gateway_prefix_list_attachment +TransitGatewayPrefixListReference,transit_gateway_prefix_list_reference +TransitGatewayPrefixListReferences,transit_gateway_prefix_list_references +TransitGatewayPropagation,transit_gateway_propagation +TransitGatewayRegistration,transit_gateway_registration +TransitGatewayRegistrationStateReason,transit_gateway_registration_state_reason +TransitGatewayRegistrations,transit_gateway_registrations +TransitGatewayRequestOptions,transit_gateway_request_options +TransitGatewayRoute,transit_gateway_route +TransitGatewayRouteAttachment,transit_gateway_route_attachment +TransitGatewayRouteTable,transit_gateway_route_table +TransitGatewayRouteTableAnnouncement,transit_gateway_route_table_announcement +TransitGatewayRouteTableAnnouncementId,transit_gateway_route_table_announcement_id +TransitGatewayRouteTableAnnouncementIds,transit_gateway_route_table_announcement_ids +TransitGatewayRouteTableAnnouncements,transit_gateway_route_table_announcements +TransitGatewayRouteTableArn,transit_gateway_route_table_arn +TransitGatewayRouteTableAssociation,transit_gateway_route_table_association +TransitGatewayRouteTableAttachment,transit_gateway_route_table_attachment +TransitGatewayRouteTableId,transit_gateway_route_table_id +TransitGatewayRouteTableIds,transit_gateway_route_table_ids +TransitGatewayRouteTablePropagation,transit_gateway_route_table_propagation +TransitGatewayRouteTablePropagations,transit_gateway_route_table_propagations +TransitGatewayRouteTableRoute,transit_gateway_route_table_route +TransitGatewayRouteTables,transit_gateway_route_tables +TransitGatewayVpcAttachment,transit_gateway_vpc_attachment +TransitGatewayVpcAttachmentOptions,transit_gateway_vpc_attachment_options +TransitGatewayVpcAttachments,transit_gateway_vpc_attachments +TransitGateways,transit_gateways +Transition,transition +TransitionEvent,transition_event +TransitionState,transition_state +TransitionToIA,transition_to_ia +TransitionToPrimaryStorageClass,transition_to_primary_storage_class +Transitions,transitions +TransitiveTagKeys,transitive_tag_keys +TranslateDocumentRequest,translate_document_request +TranslateDocumentResponse,translate_document_response +TranslatePinDataInput,translate_pin_data_input +TranslatePinDataOutput,translate_pin_data_output +TranslateTextRequest,translate_text_request +TranslateTextResponse,translate_text_response +TranslatedDocument,translated_document +TranslatedDocumentsCount,translated_documents_count +TranslatedText,translated_text +TranslationPinDataIsoFormat034,translation_pin_data_iso_format034 +TranslationSettings,translation_settings +TransmissionInterval,transmission_interval +TransmitMode,transmit_mode +Transport,transport +TransportAttachmentId,transport_attachment_id +TransportProtocol,transport_protocol +TransportStreamBitrate,transport_stream_bitrate +TransportStreamId,transport_stream_id +TransportStreamReservedBitrate,transport_stream_reserved_bitrate +TransportTransitGatewayAttachmentId,transport_transit_gateway_attachment_id +TravelMode,travel_mode +TreatMissingData,treat_missing_data +TreatUndefinedSpecifiedValues,treat_undefined_specified_values +TreatUnrecognizedResourceTypesAsWarnings,treat_unrecognized_resource_types_as_warnings +Treatment,treatment +TreatmentConfig,treatment_config +TreatmentDescription,treatment_description +TreatmentId,treatment_id +TreatmentName,treatment_name +TreatmentOption,treatment_option +TreatmentResource,treatment_resource +TreeMapAggregatedFieldWells,tree_map_aggregated_field_wells +TreeMapConfiguration,tree_map_configuration +TreeMapFieldWells,tree_map_field_wells +TreeMapGroupItemsLimitConfiguration,tree_map_group_items_limit_configuration +TreeMapSort,tree_map_sort +TreeMapSortConfiguration,tree_map_sort_configuration +TreeMapVisual,tree_map_visual +TrendArrowOptions,trend_arrow_options +TrendArrows,trend_arrows +TrendGroupSort,trend_group_sort +TrendGroups,trend_groups +Trendmicro,trendmicro +TrendmicroConnectorProfileCredentials,trendmicro_connector_profile_credentials +TrendmicroSourceProperties,trendmicro_source_properties +Trial,trial +TrialArn,trial_arn +TrialComponent,trial_component +TrialComponentArn,trial_component_arn +TrialComponentArtifact,trial_component_artifact +TrialComponentDisplayName,trial_component_display_name +TrialComponentMetricSummary,trial_component_metric_summary +TrialComponentName,trial_component_name +TrialComponentSimpleSummary,trial_component_simple_summary +TrialComponentSource,trial_component_source +TrialComponentSourceDetail,trial_component_source_detail +TrialComponentStatus,trial_component_status +TrialComponentSummaries,trial_component_summaries +TrialComponentSummary,trial_component_summary +TrialMinutes,trial_minutes +TrialName,trial_name +TrialSource,trial_source +TrialSummaries,trial_summaries +TrialSummary,trial_summary +Trigger,trigger +TriggerConfig,trigger_config +TriggerDetails,trigger_details +TriggerEventSource,trigger_event_source +TriggerFindingId,trigger_finding_id +TriggerName,trigger_name +TriggerNames,trigger_names +TriggerNodeDetails,trigger_node_details +TriggerProperties,trigger_properties +TriggerTargetsLimitExceededException,trigger_targets_limit_exceeded_exception +TriggerTime,trigger_time +TriggerType,trigger_type +TriggerUpdate,trigger_update +TriggerValue,trigger_value +TriggeredAlarms,triggered_alarms +TriggeredBy,triggered_by +TriggeringDataset,triggering_dataset +Triggers,triggers +TriggersNotFound,triggers_not_found +TrimBlanks,trim_blanks +TrimSpaceInChar,trim_space_in_char +TrimWhiteSpace,trim_white_space +TrimmedDataAccessException,trimmed_data_access_exception +TruckDimensions,truck_dimensions +TruckModeOptions,truck_mode_options +TruckWeight,truck_weight +TrueActivity,true_activity +TruePeakLimiterThreshold,true_peak_limiter_threshold +TruncateColumns,truncate_columns +Truncated,truncated +TrunkInterfaceAssociation,trunk_interface_association +TrunkInterfaceId,trunk_interface_id +Trust,trust +TrustAnchor,trust_anchor +TrustAnchorCertificate,trust_anchor_certificate +TrustAnchorDetail,trust_anchor_detail +TrustAnchorDetailResponse,trust_anchor_detail_response +TrustAnchors,trust_anchors +TrustDirection,trust_direction +TrustId,trust_id +TrustIds,trust_ids +TrustPassword,trust_password +TrustProviderType,trust_provider_type +TrustState,trust_state +TrustStateReason,trust_state_reason +TrustStore,trust_store +TrustStoreSummary,trust_store_summary +TrustType,trust_type +TrustedAdvisorCategorySpecificSummary,trusted_advisor_category_specific_summary +TrustedAdvisorCheckDescription,trusted_advisor_check_description +TrustedAdvisorCheckRefreshStatus,trusted_advisor_check_refresh_status +TrustedAdvisorCheckResult,trusted_advisor_check_result +TrustedAdvisorCheckSummary,trusted_advisor_check_summary +TrustedAdvisorCostOptimizingSummary,trusted_advisor_cost_optimizing_summary +TrustedAdvisorIntegrationStatus,trusted_advisor_integration_status +TrustedAdvisorResourceDetail,trusted_advisor_resource_detail +TrustedAdvisorResourcesSummary,trusted_advisor_resources_summary +TrustedCertificatePublicKey,trusted_certificate_public_key +TrustedHostKeys,trusted_host_keys +TrustedKeyGroupDoesNotExist,trusted_key_group_does_not_exist +TrustedKeyGroups,trusted_key_groups +TrustedResourceOwners,trusted_resource_owners +TrustedSignerDoesNotExist,trusted_signer_does_not_exist +TrustedSigners,trusted_signers +Trusts,trusts +TruststoreUri,truststore_uri +TruststoreVersion,truststore_version +TruststoreWarnings,truststore_warnings +TruthyCellValue,truthy_cell_value +TruthyCellValueSynonyms,truthy_cell_value_synonyms +TsEncryptionMethod,ts_encryption_method +TsFileMode,ts_file_mode +TsIncludeDvbSubtitles,ts_include_dvb_subtitles +TsUseAudioRenditionGroup,ts_use_audio_rendition_group +TsvOptions,tsv_options +TsvStoreOptions,tsv_store_options +TsvVersionOptions,tsv_version_options +Ttl,ttl +TtlDuration,ttl_duration +TtmlDestinationSettings,ttml_destination_settings +Tuesday,tuesday +TumblingWindow,tumbling_window +TumblingWindowInSeconds,tumbling_window_in_seconds +TunedHPOParams,tuned_hpo_params +TunedHyperParameters,tuned_hyper_parameters +TuningDataS3Uri,tuning_data_s3_uri +TuningJob,tuning_job +TuningJobArn,tuning_job_arn +TuningJobCompletionCriteria,tuning_job_completion_criteria +TuningJobCompletionDetails,tuning_job_completion_details +TuningJobName,tuning_job_name +TuningJobStepMetaData,tuning_job_step_meta_data +TuningObjective,tuning_objective +Tunnel,tunnel +TunnelInsideCidr,tunnel_inside_cidr +TunnelInsideIpVersion,tunnel_inside_ip_version +TunnelInsideIpv6Cidr,tunnel_inside_ipv6_cidr +TunnelOption,tunnel_option +TunnelOptions,tunnel_options +TunnelSummary,tunnel_summary +TurkErrorCode,turk_error_code +TurnControlUrl,turn_control_url +TurnSpecification,turn_specification +TwitterParameters,twitter_parameters +TwoWayChannelArn,two_way_channel_arn +TwoWayEnabled,two_way_enabled +Type,type +TypeAlreadyExistsFault,type_already_exists_fault +TypeArn,type_arn +TypeConfigurationAlias,type_configuration_alias +TypeConfigurationArn,type_configuration_arn +TypeConfigurationDetails,type_configuration_details +TypeConfigurationIdentifier,type_configuration_identifier +TypeConfigurationIdentifiers,type_configuration_identifiers +TypeConfigurationNotFoundException,type_configuration_not_found_exception +TypeConfigurationVersionId,type_configuration_version_id +TypeConfigurations,type_configurations +TypeDeprecatedFault,type_deprecated_fault +TypeFilters,type_filters +TypeHierarchy,type_hierarchy +TypeId,type_id +TypeIdentifier,type_identifier +TypeName,type_name +TypeNameAlias,type_name_alias +TypeNamePrefix,type_name_prefix +TypeNotFoundException,type_not_found_exception +TypeParameters,type_parameters +TypeSummaries,type_summaries +TypeSummary,type_summary +TypeTestsStatus,type_tests_status +TypeTestsStatusDescription,type_tests_status_description +TypeVersionArn,type_version_arn +TypeVersionId,type_version_id +TypeVersionSummaries,type_version_summaries +TypeVersionSummary,type_version_summary +TypedAttributeValueRange,typed_attribute_value_range +TypedLinkAttributeDefinition,typed_link_attribute_definition +TypedLinkAttributeRange,typed_link_attribute_range +TypedLinkFacet,typed_link_facet +TypedLinkFacetAttributeUpdate,typed_link_facet_attribute_update +TypedLinkName,typed_link_name +TypedLinkSchemaAndFacetName,typed_link_schema_and_facet_name +TypedLinkSpecifier,typed_link_specifier +TypedLinkSpecifiers,typed_link_specifiers +Types,types +Typography,typography +UIColorPalette,ui_color_palette +UICustomization,ui_customization +UICustomizationType,ui_customization_type +URI,uri +URL,url +URLOperation,url_operation +URLPath,url_path +URLStyling,url_styling +URLTarget,url_target +URLTemplate,url_template +USD,usd +UUID,uuid +Uarfcn,uarfcn +Uarfcndl,uarfcndl +UdpContainerSettings,udp_container_settings +UdpGroupSettings,udp_group_settings +UdpOutputSettings,udp_output_settings +UefiData,uefi_data +UhdDeviceSettings,uhd_device_settings +UiConfig,ui_config +UiTemplate,ui_template +UiTemplateInfo,ui_template_info +UiTemplateS3Uri,ui_template_s3_uri +Uid,uid +UlBucketSize,ul_bucket_size +UlRate,ul_rate +UlRatePolicy,ul_rate_policy +Ulimit,ulimit +Ulimits,ulimits +UnAuthenticated,un_authenticated +UnModifiedSinceConstraint,un_modified_since_constraint +UnableToDetectSchemaException,unable_to_detect_schema_exception +UnaggregatedField,unaggregated_field +UnapplyCustomPermissions,unapply_custom_permissions +UnarchiveApplicationRequest,unarchive_application_request +UnarchiveFindingsRequest,unarchive_findings_request +UnarchiveWaveRequest,unarchive_wave_request +UnassignInstanceRequest,unassign_instance_request +UnassignIpv6AddressesRequest,unassign_ipv6_addresses_request +UnassignIpv6AddressesResult,unassign_ipv6_addresses_result +UnassignPrivateIpAddressesRequest,unassign_private_ip_addresses_request +UnassignPrivateNatGatewayAddressRequest,unassign_private_nat_gateway_address_request +UnassignPrivateNatGatewayAddressResult,unassign_private_nat_gateway_address_result +UnassignVolumeRequest,unassign_volume_request +UnassignedIpv6Addresses,unassigned_ipv6_addresses +UnassignedIpv6Prefixes,unassigned_ipv6_prefixes +Unassigning,unassigning +Unauthenticated,unauthenticated +UnauthenticatedException,unauthenticated_exception +UnauthenticatedLogin,unauthenticated_login +UnauthorizedCacheControlHeaderStrategy,unauthorized_cache_control_header_strategy +UnauthorizedClientException,unauthorized_client_exception +UnauthorizedException,unauthorized_exception +UnauthorizedOperation,unauthorized_operation +UnauthorizedOperationException,unauthorized_operation_exception +UnauthorizedPartnerIntegrationFault,unauthorized_partner_integration_fault +UnauthorizedResourceAccessException,unauthorized_resource_access_exception +UnavailablePriorities,unavailable_priorities +UncertaintyRange,uncertainty_range +UnclaimDeviceRequest,unclaim_device_request +UnclaimDeviceResponse,unclaim_device_response +Undeploy,undeploy +UndeploySystemInstanceRequest,undeploy_system_instance_request +UndeploySystemInstanceResponse,undeploy_system_instance_response +UndeprecateActivityTypeInput,undeprecate_activity_type_input +UndeprecateDomainInput,undeprecate_domain_input +UndeprecateWorkflowTypeInput,undeprecate_workflow_type_input +UnderlayIpAddress,underlay_ip_address +UndetectedDocumentTypes,undetected_document_types +UndetectedSignature,undetected_signature +UndetectedSignatures,undetected_signatures +UndoRedoDisabled,undo_redo_disabled +UnexpectedLambdaException,unexpected_lambda_exception +UnfilteredPartition,unfiltered_partition +UnfilteredPartitions,unfiltered_partitions +UngroupResourcesInput,ungroup_resources_input +UngroupResourcesOutput,ungroup_resources_output +UnhealthySince,unhealthy_since +UnhealthyThreshold,unhealthy_threshold +UnhealthyThresholdCount,unhealthy_threshold_count +UnicodeIcon,unicode_icon +UniformBorder,uniform_border +UniformResourceIdentifier,uniform_resource_identifier +UnindexedFace,unindexed_face +UnindexedFaces,unindexed_faces +UninitializedAccountException,uninitialized_account_exception +Union,union +UnionType,union_type +UniqueAccountIdentifier,unique_account_identifier +UniqueAttribute,unique_attribute +UniqueContributors,unique_contributors +UniqueId,unique_id +UniqueKey,unique_key +UniqueProblem,unique_problem +UniqueProgramId,unique_program_id +UniqueRequestToken,unique_request_token +UniqueTag,unique_tag +UniqueTagResourceIdentifier,unique_tag_resource_identifier +UniqueThreatNameCount,unique_threat_name_count +UniqueTicPerAudioTrack,unique_tic_per_audio_track +UniqueValues,unique_values +UniqueValuesComputation,unique_values_computation +Unit,unit +UnitCost,unit_cost +UnitLabel,unit_label +UnitNumber,unit_number +UnitScaler,unit_scaler +UnitType,unit_type +Units,units +Unknown,unknown +UnknownHostCount,unknown_host_count +UnknownIpPermissions,unknown_ip_permissions +UnknownMonitorException,unknown_monitor_exception +UnknownResourceException,unknown_resource_exception +UnknownResourceFault,unknown_resource_fault +UnknownSnapshotCopyRegionFault,unknown_snapshot_copy_region_fault +UnknownSubscriptionException,unknown_subscription_exception +UnlabelParameterVersionRequest,unlabel_parameter_version_request +UnlabelParameterVersionResult,unlabel_parameter_version_result +Unlabeled,unlabeled +UnlinkDeveloperIdentityInput,unlink_developer_identity_input +UnlinkIdentityInput,unlink_identity_input +UnlockCode,unlock_code +UnlockDelay,unlock_delay +UnlockDelayUnit,unlock_delay_unit +UnlockDelayValue,unlock_delay_value +UnlockRuleRequest,unlock_rule_request +UnlockRuleResponse,unlock_rule_response +UnmappedAttribute,unmapped_attribute +UnmappedAttributes,unmapped_attributes +UnmatchedFaces,unmatched_faces +UnmatchedPolicyPermissionException,unmatched_policy_permission_exception +UnmodifiableEntityException,unmodifiable_entity_exception +UnmonitorInstancesRequest,unmonitor_instances_request +UnmonitorInstancesResult,unmonitor_instances_result +UnpeerVpcResult,unpeer_vpc_result +UnpredictableNumber,unpredictable_number +UnprocessableEntityException,unprocessable_entity_exception +UnprocessedAccount,unprocessed_account +UnprocessedAccounts,unprocessed_accounts +UnprocessedAssociationUpdates,unprocessed_association_updates +UnprocessedAssociations,unprocessed_associations +UnprocessedAutomationRule,unprocessed_automation_rule +UnprocessedAutomationRules,unprocessed_automation_rules +UnprocessedCluster,unprocessed_cluster +UnprocessedClusters,unprocessed_clusters +UnprocessedDataSources,unprocessed_data_sources +UnprocessedDataSourcesResult,unprocessed_data_sources_result +UnprocessedFindings,unprocessed_findings +UnprocessedGraph,unprocessed_graph +UnprocessedGraphs,unprocessed_graphs +UnprocessedIdentifiers,unprocessed_identifiers +UnprocessedIdentityId,unprocessed_identity_id +UnprocessedIdentityIds,unprocessed_identity_ids +UnprocessedIds,unprocessed_ids +UnprocessedItems,unprocessed_items +UnprocessedKeys,unprocessed_keys +UnprocessedNamedQueryId,unprocessed_named_query_id +UnprocessedNamedQueryIds,unprocessed_named_query_ids +UnprocessedPreparedStatementName,unprocessed_prepared_statement_name +UnprocessedPreparedStatementNames,unprocessed_prepared_statement_names +UnprocessedQueryExecutionId,unprocessed_query_execution_id +UnprocessedQueryExecutionIds,unprocessed_query_execution_ids +UnprocessedRecords,unprocessed_records +UnprocessedResourceIdentifiers,unprocessed_resource_identifiers +UnprocessedScramSecret,unprocessed_scram_secret +UnprocessedScramSecrets,unprocessed_scram_secrets +UnprocessedSecurityControl,unprocessed_security_control +UnprocessedStandardsControlAssociation,unprocessed_standards_control_association +UnprocessedStandardsControlAssociationUpdate,unprocessed_standards_control_association_update +UnprocessedStatistics,unprocessed_statistics +UnprocessedTraceIds,unprocessed_trace_ids +UnprocessedTraceSegment,unprocessed_trace_segment +UnprocessedTraceSegments,unprocessed_trace_segments +UnprocessedTypeConfigurations,unprocessed_type_configurations +UnprocessedUpdateAction,unprocessed_update_action +UnprocessedUpdateActions,unprocessed_update_actions +UnrealizedSavings,unrealized_savings +UnrecognizedClientException,unrecognized_client_exception +UnrecognizedFaces,unrecognized_faces +UnrecognizedPublicKeyEncodingException,unrecognized_public_key_encoding_exception +UnrecognizedResourceTypes,unrecognized_resource_types +UnregisterConnectorRequest,unregister_connector_request +UnregisteredSeiTimecode,unregistered_sei_timecode +UnreportedNotApplicableCount,unreported_not_applicable_count +UnreservedConcurrentExecutions,unreserved_concurrent_executions +UnresolvableUsageUnitException,unresolvable_usage_unit_exception +UnscaledValue,unscaled_value +UnsearchedFace,unsearched_face +UnsearchedFaces,unsearched_faces +UnshareApplicationRequest,unshare_application_request +UnshareDirectoryRequest,unshare_directory_request +UnshareDirectoryResult,unshare_directory_result +UnshareInterval,unshare_interval +UnshareIntervalUnit,unshare_interval_unit +UnshareTarget,unshare_target +UnspecifiedCount,unspecified_count +UnsubscribeAll,unsubscribe_all +UnsubscribeFromDatasetRequest,unsubscribe_from_dataset_request +UnsubscribeFromEventRequest,unsubscribe_from_event_request +UnsubscribeInput,unsubscribe_input +UnsubscribeRequest,unsubscribe_request +UnsubscribeResult,unsubscribe_result +Unsuccessful,unsuccessful +UnsuccessfulFaceAssociation,unsuccessful_face_association +UnsuccessfulFaceAssociations,unsuccessful_face_associations +UnsuccessfulFaceDeletion,unsuccessful_face_deletion +UnsuccessfulFaceDeletions,unsuccessful_face_deletions +UnsuccessfulFaceDisassociation,unsuccessful_face_disassociation +UnsuccessfulFaceDisassociations,unsuccessful_face_disassociations +UnsuccessfulFleetDeletions,unsuccessful_fleet_deletions +UnsuccessfulFleetRequests,unsuccessful_fleet_requests +UnsuccessfulInstanceCreditSpecificationItem,unsuccessful_instance_credit_specification_item +UnsuccessfulInstanceCreditSpecificationItemError,unsuccessful_instance_credit_specification_item_error +UnsuccessfulInstanceCreditSpecifications,unsuccessful_instance_credit_specifications +UnsuccessfulItem,unsuccessful_item +UnsuccessfulItemError,unsuccessful_item_error +UnsuccessfullyDeletedLaunchTemplateVersions,unsuccessfully_deleted_launch_template_versions +UnsupportedAPIEndpointException,unsupported_api_endpoint_exception +UnsupportedActionException,unsupported_action_exception +UnsupportedActionForDeploymentTypeException,unsupported_action_for_deployment_type_exception +UnsupportedAddressException,unsupported_address_exception +UnsupportedAvailabilityZone,unsupported_availability_zone +UnsupportedAvailabilityZoneException,unsupported_availability_zone_exception +UnsupportedCalendarException,unsupported_calendar_exception +UnsupportedCommandException,unsupported_command_exception +UnsupportedDigitalSignatureMethodException,unsupported_digital_signature_method_exception +UnsupportedDisplayLanguageCodeException,unsupported_display_language_code_exception +UnsupportedDocumentEncodingException,unsupported_document_encoding_exception +UnsupportedDocumentException,unsupported_document_exception +UnsupportedFeatureException,unsupported_feature_exception +UnsupportedFeatureRequiredException,unsupported_feature_required_exception +UnsupportedGrantTypeException,unsupported_grant_type_exception +UnsupportedIdentityProviderException,unsupported_identity_provider_exception +UnsupportedImageTypeException,unsupported_image_type_exception +UnsupportedIndexTypeException,unsupported_index_type_exception +UnsupportedInventoryItemContextException,unsupported_inventory_item_context_exception +UnsupportedInventorySchemaVersionException,unsupported_inventory_schema_version_exception +UnsupportedLanguageException,unsupported_language_exception +UnsupportedLanguagePairException,unsupported_language_pair_exception +UnsupportedLocale,unsupported_locale +UnsupportedMediaTypeException,unsupported_media_type_exception +UnsupportedNetworkConfigurationException,unsupported_network_configuration_exception +UnsupportedOperatingSystem,unsupported_operating_system +UnsupportedOperation,unsupported_operation +UnsupportedOperationException,unsupported_operation_exception +UnsupportedOperationFault,unsupported_operation_fault +UnsupportedOptionFault,unsupported_option_fault +UnsupportedParameterType,unsupported_parameter_type +UnsupportedPlatformType,unsupported_platform_type +UnsupportedPlsAlphabetException,unsupported_pls_alphabet_exception +UnsupportedPlsLanguageException,unsupported_pls_language_exception +UnsupportedPricingPlanException,unsupported_pricing_plan_exception +UnsupportedProtocolException,unsupported_protocol_exception +UnsupportedRegionException,unsupported_region_exception +UnsupportedResource,unsupported_resource +UnsupportedSettingsException,unsupported_settings_exception +UnsupportedStreamMediaTypeException,unsupported_stream_media_type_exception +UnsupportedTLD,unsupported_tld +UnsupportedTimestamps,unsupported_timestamps +UnsupportedTokenTypeException,unsupported_token_type_exception +UnsupportedUpstreamRegistryException,unsupported_upstream_registry_exception +UnsupportedUserEditionException,unsupported_user_edition_exception +UnsupportedUserStateException,unsupported_user_state_exception +UnsupportedWorkspaceConfigurationException,unsupported_workspace_configuration_exception +UntagAttendeeRequest,untag_attendee_request +UntagCertificateAuthorityRequest,untag_certificate_authority_request +UntagColumnOperation,untag_column_operation +UntagDeliveryStreamInput,untag_delivery_stream_input +UntagInput,untag_input +UntagInstanceProfileRequest,untag_instance_profile_request +UntagLogGroupRequest,untag_log_group_request +UntagMFADeviceRequest,untag_mfa_device_request +UntagMeetingRequest,untag_meeting_request +UntagOpenIDConnectProviderRequest,untag_open_id_connect_provider_request +UntagOutput,untag_output +UntagPolicyRequest,untag_policy_request +UntagProjectRequest,untag_project_request +UntagQueueRequest,untag_queue_request +UntagResourceInput,untag_resource_input +UntagResourceOutput,untag_resource_output +UntagResourceRequest,untag_resource_request +UntagResourceResponse,untag_resource_response +UntagResourceResult,untag_resource_result +UntagResourcesInput,untag_resources_input +UntagResourcesOutput,untag_resources_output +UntagRoleRequest,untag_role_request +UntagSAMLProviderRequest,untag_saml_provider_request +UntagServerCertificateRequest,untag_server_certificate_request +UntagStreamInput,untag_stream_input +UntagUserRequest,untag_user_request +UntrustedArtifactOnDeployment,untrusted_artifact_on_deployment +UnusedAccountValidityDays,unused_account_validity_days +UnusedCommitment,unused_commitment +UnusedHours,unused_hours +UnusedUnits,unused_units +Unwrap,unwrap +UpScaling,up_scaling +Update,update +UpdateACLRequest,update_acl_request +UpdateACLResponse,update_acl_response +UpdateAbpV1_0_x,update_abp_v1_0_x +UpdateAbpV1_1,update_abp_v1_1 +UpdateAcceleratorAttributesRequest,update_accelerator_attributes_request +UpdateAcceleratorAttributesResponse,update_accelerator_attributes_response +UpdateAcceleratorRequest,update_accelerator_request +UpdateAcceleratorResponse,update_accelerator_response +UpdateAccessControlConfigurationRequest,update_access_control_configuration_request +UpdateAccessKeyRequest,update_access_key_request +UpdateAccessLogSubscriptionRequest,update_access_log_subscription_request +UpdateAccessLogSubscriptionResponse,update_access_log_subscription_response +UpdateAccessPolicyRequest,update_access_policy_request +UpdateAccessPolicyResponse,update_access_policy_response +UpdateAccessRequest,update_access_request +UpdateAccessResponse,update_access_response +UpdateAccountAuditConfigurationRequest,update_account_audit_configuration_request +UpdateAccountConfigurationRequest,update_account_configuration_request +UpdateAccountConfigurationResponse,update_account_configuration_response +UpdateAccountCustomizationRequest,update_account_customization_request +UpdateAccountCustomizationResponse,update_account_customization_response +UpdateAccountPasswordPolicyRequest,update_account_password_policy_request +UpdateAccountRequest,update_account_request +UpdateAccountResponse,update_account_response +UpdateAccountSendingEnabledRequest,update_account_sending_enabled_request +UpdateAccountSettingsInput,update_account_settings_input +UpdateAccountSettingsOutput,update_account_settings_output +UpdateAccountSettingsRequest,update_account_settings_request +UpdateAccountSettingsResponse,update_account_settings_response +UpdateAction,update_action +UpdateActionAvailableDate,update_action_available_date +UpdateActionRequest,update_action_request +UpdateActionResponse,update_action_response +UpdateActionResultsMessage,update_action_results_message +UpdateActionStatus,update_action_status +UpdateActionStatusModifiedDate,update_action_status_modified_date +UpdateActionTargetRequest,update_action_target_request +UpdateActionTypeInput,update_action_type_input +UpdateActions,update_actions +UpdateActionsMessage,update_actions_message +UpdateActiveModelVersionRequest,update_active_model_version_request +UpdateActiveModelVersionResponse,update_active_model_version_response +UpdateActivities,update_activities +UpdateAddonRequest,update_addon_request +UpdateAddonResponse,update_addon_response +UpdateAddress,update_address +UpdateAddressBookRequest,update_address_book_request +UpdateAdmChannelRequest,update_adm_channel_request +UpdateAdmChannelResponse,update_adm_channel_response +UpdateAgentLogLevel,update_agent_log_level +UpdateAgentRequest,update_agent_request +UpdateAgentStatusRequest,update_agent_status_request +UpdateAgentStatusResponse,update_agent_status_response +UpdateAgreementRequest,update_agreement_request +UpdateAgreementResponse,update_agreement_response +UpdateAlarmModelRequest,update_alarm_model_request +UpdateAlarmModelResponse,update_alarm_model_response +UpdateAlertRequest,update_alert_request +UpdateAlertResponse,update_alert_response +UpdateAliasInput,update_alias_input +UpdateAliasOutput,update_alias_output +UpdateAliasRequest,update_alias_request +UpdateAllowListRequest,update_allow_list_request +UpdateAllowListResponse,update_allow_list_response +UpdateAnalysisPermissionsRequest,update_analysis_permissions_request +UpdateAnalysisPermissionsResponse,update_analysis_permissions_response +UpdateAnalysisRequest,update_analysis_request +UpdateAnalysisResponse,update_analysis_response +UpdateAnalysisTemplateInput,update_analysis_template_input +UpdateAnalysisTemplateOutput,update_analysis_template_output +UpdateAnnotationStoreRequest,update_annotation_store_request +UpdateAnnotationStoreResponse,update_annotation_store_response +UpdateAnnotationStoreVersionRequest,update_annotation_store_version_request +UpdateAnnotationStoreVersionResponse,update_annotation_store_version_response +UpdateAnomalyDetectorRequest,update_anomaly_detector_request +UpdateAnomalyDetectorResponse,update_anomaly_detector_response +UpdateAnomalyMonitorRequest,update_anomaly_monitor_request +UpdateAnomalyMonitorResponse,update_anomaly_monitor_response +UpdateAnomalySubscriptionRequest,update_anomaly_subscription_request +UpdateAnomalySubscriptionResponse,update_anomaly_subscription_response +UpdateAnswerInput,update_answer_input +UpdateAnswerOutput,update_answer_output +UpdateApiCacheRequest,update_api_cache_request +UpdateApiCacheResponse,update_api_cache_response +UpdateApiDestinationRequest,update_api_destination_request +UpdateApiDestinationResponse,update_api_destination_response +UpdateApiKeyRequest,update_api_key_request +UpdateApiKeyResponse,update_api_key_response +UpdateApiMappingRequest,update_api_mapping_request +UpdateApiMappingResponse,update_api_mapping_response +UpdateApiRequest,update_api_request +UpdateApiResponse,update_api_response +UpdateApnsChannelRequest,update_apns_channel_request +UpdateApnsChannelResponse,update_apns_channel_response +UpdateApnsSandboxChannelRequest,update_apns_sandbox_channel_request +UpdateApnsSandboxChannelResponse,update_apns_sandbox_channel_response +UpdateApnsVoipChannelRequest,update_apns_voip_channel_request +UpdateApnsVoipChannelResponse,update_apns_voip_channel_response +UpdateApnsVoipSandboxChannelRequest,update_apns_voip_sandbox_channel_request +UpdateApnsVoipSandboxChannelResponse,update_apns_voip_sandbox_channel_response +UpdateAppAuthorizationRequest,update_app_authorization_request +UpdateAppAuthorizationResponse,update_app_authorization_response +UpdateAppBlockBuilderRequest,update_app_block_builder_request +UpdateAppBlockBuilderResult,update_app_block_builder_result +UpdateAppImageConfigRequest,update_app_image_config_request +UpdateAppImageConfigResponse,update_app_image_config_response +UpdateAppInstanceBotRequest,update_app_instance_bot_request +UpdateAppInstanceBotResponse,update_app_instance_bot_response +UpdateAppInstanceRequest,update_app_instance_request +UpdateAppInstanceResponse,update_app_instance_response +UpdateAppInstanceUserEndpointRequest,update_app_instance_user_endpoint_request +UpdateAppInstanceUserEndpointResponse,update_app_instance_user_endpoint_response +UpdateAppInstanceUserRequest,update_app_instance_user_request +UpdateAppInstanceUserResponse,update_app_instance_user_response +UpdateAppMonitorRequest,update_app_monitor_request +UpdateAppRequest,update_app_request +UpdateAppResponse,update_app_response +UpdateAppResult,update_app_result +UpdateAppVersionAppComponentRequest,update_app_version_app_component_request +UpdateAppVersionAppComponentResponse,update_app_version_app_component_response +UpdateAppVersionRequest,update_app_version_request +UpdateAppVersionResourceRequest,update_app_version_resource_request +UpdateAppVersionResourceResponse,update_app_version_resource_response +UpdateAppVersionResponse,update_app_version_response +UpdateApplicationComponentConfigRequest,update_application_component_config_request +UpdateApplicationInput,update_application_input +UpdateApplicationLayerAutomaticResponseRequest,update_application_layer_automatic_response_request +UpdateApplicationMaintenanceConfigurationRequest,update_application_maintenance_configuration_request +UpdateApplicationMaintenanceConfigurationResponse,update_application_maintenance_configuration_response +UpdateApplicationMessage,update_application_message +UpdateApplicationRequest,update_application_request +UpdateApplicationResourceLifecycleMessage,update_application_resource_lifecycle_message +UpdateApplicationResponse,update_application_response +UpdateApplicationResult,update_application_result +UpdateApplicationSettingsInput,update_application_settings_input +UpdateApplicationSettingsOutput,update_application_settings_output +UpdateApplicationSettingsRequest,update_application_settings_request +UpdateApplicationSettingsResponse,update_application_settings_response +UpdateApplicationVersionMessage,update_application_version_message +UpdateApprovalRuleTemplateContentInput,update_approval_rule_template_content_input +UpdateApprovalRuleTemplateContentOutput,update_approval_rule_template_content_output +UpdateApprovalRuleTemplateDescriptionInput,update_approval_rule_template_description_input +UpdateApprovalRuleTemplateDescriptionOutput,update_approval_rule_template_description_output +UpdateApprovalRuleTemplateNameInput,update_approval_rule_template_name_input +UpdateApprovalRuleTemplateNameOutput,update_approval_rule_template_name_output +UpdateArchiveRequest,update_archive_request +UpdateArchiveResponse,update_archive_response +UpdateArchiveRuleRequest,update_archive_rule_request +UpdateArtifactRequest,update_artifact_request +UpdateArtifactResponse,update_artifact_response +UpdateAssessmentControlRequest,update_assessment_control_request +UpdateAssessmentControlResponse,update_assessment_control_response +UpdateAssessmentControlSetStatusRequest,update_assessment_control_set_status_request +UpdateAssessmentControlSetStatusResponse,update_assessment_control_set_status_response +UpdateAssessmentFrameworkControlSet,update_assessment_framework_control_set +UpdateAssessmentFrameworkRequest,update_assessment_framework_request +UpdateAssessmentFrameworkResponse,update_assessment_framework_response +UpdateAssessmentFrameworkShareRequest,update_assessment_framework_share_request +UpdateAssessmentFrameworkShareResponse,update_assessment_framework_share_response +UpdateAssessmentRequest,update_assessment_request +UpdateAssessmentResponse,update_assessment_response +UpdateAssessmentStatusRequest,update_assessment_status_request +UpdateAssessmentStatusResponse,update_assessment_status_response +UpdateAssessmentTargetRequest,update_assessment_target_request +UpdateAssetModelRequest,update_asset_model_request +UpdateAssetModelResponse,update_asset_model_response +UpdateAssetPropertyRequest,update_asset_property_request +UpdateAssetRequest,update_asset_request +UpdateAssetResponse,update_asset_response +UpdateAssociationRequest,update_association_request +UpdateAssociationResult,update_association_result +UpdateAssociationStatusRequest,update_association_status_request +UpdateAssociationStatusResult,update_association_status_result +UpdateAssumeRolePolicyRequest,update_assume_role_policy_request +UpdateAttendeeCapabilitiesRequest,update_attendee_capabilities_request +UpdateAttendeeCapabilitiesResponse,update_attendee_capabilities_response +UpdateAttributeGroupRequest,update_attribute_group_request +UpdateAttributeGroupResponse,update_attribute_group_response +UpdateAttributesRequest,update_attributes_request +UpdateAuditStreamConfigurationRequest,update_audit_stream_configuration_request +UpdateAuditSuppressionRequest,update_audit_suppression_request +UpdateAuthEventFeedbackRequest,update_auth_event_feedback_request +UpdateAuthorizerRequest,update_authorizer_request +UpdateAuthorizerResponse,update_authorizer_response +UpdateAutoScalingGroupType,update_auto_scaling_group_type +UpdateAutomatedDiscoveryConfigurationRequest,update_automated_discovery_configuration_request +UpdateAutomaticTapeCreationPolicyInput,update_automatic_tape_creation_policy_input +UpdateAutomaticTapeCreationPolicyOutput,update_automatic_tape_creation_policy_output +UpdateAutomationRulesRequestItem,update_automation_rules_request_item +UpdateAutomationRulesRequestItems,update_automation_rules_request_items +UpdateAvailabilityConfigurationRequest,update_availability_configuration_request +UpdateAvailabilityOptionsRequest,update_availability_options_request +UpdateAvailabilityOptionsResponse,update_availability_options_response +UpdateAvailable,update_available +UpdateBackendAPIRequest,update_backend_api_request +UpdateBackendAPIResponse,update_backend_api_response +UpdateBackendAuthForgotPasswordConfig,update_backend_auth_forgot_password_config +UpdateBackendAuthIdentityPoolConfig,update_backend_auth_identity_pool_config +UpdateBackendAuthMFAConfig,update_backend_auth_mfa_config +UpdateBackendAuthOAuthConfig,update_backend_auth_o_auth_config +UpdateBackendAuthPasswordPolicyConfig,update_backend_auth_password_policy_config +UpdateBackendAuthRequest,update_backend_auth_request +UpdateBackendAuthResourceConfig,update_backend_auth_resource_config +UpdateBackendAuthResponse,update_backend_auth_response +UpdateBackendAuthUserPoolConfig,update_backend_auth_user_pool_config +UpdateBackendAuthVerificationMessageConfig,update_backend_auth_verification_message_config +UpdateBackendConfigRequest,update_backend_config_request +UpdateBackendConfigResponse,update_backend_config_response +UpdateBackendJobRequest,update_backend_job_request +UpdateBackendJobResponse,update_backend_job_response +UpdateBackendStorageRequest,update_backend_storage_request +UpdateBackendStorageResourceConfig,update_backend_storage_resource_config +UpdateBackendStorageResponse,update_backend_storage_response +UpdateBackupPlanInput,update_backup_plan_input +UpdateBackupPlanOutput,update_backup_plan_output +UpdateBaiduChannelRequest,update_baidu_channel_request +UpdateBaiduChannelResponse,update_baidu_channel_response +UpdateBandwidthRateLimitInput,update_bandwidth_rate_limit_input +UpdateBandwidthRateLimitOutput,update_bandwidth_rate_limit_output +UpdateBandwidthRateLimitScheduleInput,update_bandwidth_rate_limit_schedule_input +UpdateBandwidthRateLimitScheduleOutput,update_bandwidth_rate_limit_schedule_output +UpdateBasePathMappingRequest,update_base_path_mapping_request +UpdateBatchPredictionInput,update_batch_prediction_input +UpdateBatchPredictionOutput,update_batch_prediction_output +UpdateBehavior,update_behavior +UpdateBillingGroupAccountGrouping,update_billing_group_account_grouping +UpdateBillingGroupInput,update_billing_group_input +UpdateBillingGroupOutput,update_billing_group_output +UpdateBillingGroupRequest,update_billing_group_request +UpdateBillingGroupResponse,update_billing_group_response +UpdateBlueprintRequest,update_blueprint_request +UpdateBlueprintResponse,update_blueprint_response +UpdateBotAliasRequest,update_bot_alias_request +UpdateBotAliasResponse,update_bot_alias_response +UpdateBotLocaleRequest,update_bot_locale_request +UpdateBotLocaleResponse,update_bot_locale_response +UpdateBotRecommendationRequest,update_bot_recommendation_request +UpdateBotRecommendationResponse,update_bot_recommendation_response +UpdateBotRequest,update_bot_request +UpdateBotResponse,update_bot_response +UpdateBranchRequest,update_branch_request +UpdateBranchResult,update_branch_result +UpdateBridgeFlowSourceRequest,update_bridge_flow_source_request +UpdateBridgeNetworkOutputRequest,update_bridge_network_output_request +UpdateBridgeNetworkSourceRequest,update_bridge_network_source_request +UpdateBridgeOutputRequest,update_bridge_output_request +UpdateBridgeOutputResponse,update_bridge_output_response +UpdateBridgeRequest,update_bridge_request +UpdateBridgeResponse,update_bridge_response +UpdateBridgeSourceRequest,update_bridge_source_request +UpdateBridgeSourceResponse,update_bridge_source_response +UpdateBridgeStateRequest,update_bridge_state_request +UpdateBridgeStateResponse,update_bridge_state_response +UpdateBrokerCountRequest,update_broker_count_request +UpdateBrokerCountResponse,update_broker_count_response +UpdateBrokerRequest,update_broker_request +UpdateBrokerResponse,update_broker_response +UpdateBrokerStorageRequest,update_broker_storage_request +UpdateBrokerStorageResponse,update_broker_storage_response +UpdateBrokerTypeRequest,update_broker_type_request +UpdateBrokerTypeResponse,update_broker_type_response +UpdateBrowserSettingsRequest,update_browser_settings_request +UpdateBrowserSettingsResponse,update_browser_settings_response +UpdateBucketBundleRequest,update_bucket_bundle_request +UpdateBucketBundleResult,update_bucket_bundle_result +UpdateBucketRequest,update_bucket_request +UpdateBucketResult,update_bucket_result +UpdateBudgetActionRequest,update_budget_action_request +UpdateBudgetActionResponse,update_budget_action_response +UpdateBudgetRequest,update_budget_request +UpdateBuildInput,update_build_input +UpdateBuildOutput,update_build_output +UpdateBusinessReportScheduleRequest,update_business_report_schedule_request +UpdateByteMatchSetRequest,update_byte_match_set_request +UpdateByteMatchSetResponse,update_byte_match_set_response +UpdateCACertificateParams,update_ca_certificate_params +UpdateCACertificateRequest,update_ca_certificate_request +UpdateCachePolicyRequest,update_cache_policy_request +UpdateCachePolicyResult,update_cache_policy_result +UpdateCalculatedAttributeDefinitionRequest,update_calculated_attribute_definition_request +UpdateCalculatedAttributeDefinitionResponse,update_calculated_attribute_definition_response +UpdateCallAnalyticsCategoryRequest,update_call_analytics_category_request +UpdateCallAnalyticsCategoryResponse,update_call_analytics_category_response +UpdateCampaignDialerConfigRequest,update_campaign_dialer_config_request +UpdateCampaignNameRequest,update_campaign_name_request +UpdateCampaignOutboundCallConfigRequest,update_campaign_outbound_call_config_request +UpdateCampaignRequest,update_campaign_request +UpdateCampaignResponse,update_campaign_response +UpdateCanaryRequest,update_canary_request +UpdateCapacityProviderRequest,update_capacity_provider_request +UpdateCapacityProviderResponse,update_capacity_provider_response +UpdateCapacityReservationInput,update_capacity_reservation_input +UpdateCaseRequest,update_case_request +UpdateCellRequest,update_cell_request +UpdateCellResponse,update_cell_response +UpdateCertificateAuthorityRequest,update_certificate_authority_request +UpdateCertificateOptionsRequest,update_certificate_options_request +UpdateCertificateRequest,update_certificate_request +UpdateCertificateResponse,update_certificate_response +UpdateChangesetRequest,update_changeset_request +UpdateChangesetResponse,update_changeset_response +UpdateChannelClassRequest,update_channel_class_request +UpdateChannelClassResponse,update_channel_class_response +UpdateChannelFlowRequest,update_channel_flow_request +UpdateChannelFlowResponse,update_channel_flow_response +UpdateChannelGroupRequest,update_channel_group_request +UpdateChannelGroupResponse,update_channel_group_response +UpdateChannelMessageRequest,update_channel_message_request +UpdateChannelMessageResponse,update_channel_message_response +UpdateChannelReadMarkerRequest,update_channel_read_marker_request +UpdateChannelReadMarkerResponse,update_channel_read_marker_response +UpdateChannelRequest,update_channel_request +UpdateChannelResponse,update_channel_response +UpdateChapCredentialsInput,update_chap_credentials_input +UpdateChapCredentialsOutput,update_chap_credentials_output +UpdateClassificationJobRequest,update_classification_job_request +UpdateClassificationScopeRequest,update_classification_scope_request +UpdateClassifierRequest,update_classifier_request +UpdateClientCertificateRequest,update_client_certificate_request +UpdateCloudFormationCollectionFilter,update_cloud_formation_collection_filter +UpdateCloudFrontOriginAccessIdentityRequest,update_cloud_front_origin_access_identity_request +UpdateCloudFrontOriginAccessIdentityResult,update_cloud_front_origin_access_identity_result +UpdateClusterConfigRequest,update_cluster_config_request +UpdateClusterConfigResponse,update_cluster_config_response +UpdateClusterConfigurationRequest,update_cluster_configuration_request +UpdateClusterConfigurationResponse,update_cluster_configuration_response +UpdateClusterInput,update_cluster_input +UpdateClusterKafkaVersionRequest,update_cluster_kafka_version_request +UpdateClusterKafkaVersionResponse,update_cluster_kafka_version_response +UpdateClusterOutput,update_cluster_output +UpdateClusterRequest,update_cluster_request +UpdateClusterResponse,update_cluster_response +UpdateClusterSettingsRequest,update_cluster_settings_request +UpdateClusterSettingsResponse,update_cluster_settings_response +UpdateClusterVersionRequest,update_cluster_version_request +UpdateClusterVersionResponse,update_cluster_version_response +UpdateCodeRepositoryInput,update_code_repository_input +UpdateCodeRepositoryOutput,update_code_repository_output +UpdateCodeSigningConfigRequest,update_code_signing_config_request +UpdateCodeSigningConfigResponse,update_code_signing_config_response +UpdateCognitoUserPoolConfiguration,update_cognito_user_pool_configuration +UpdateCollaborationInput,update_collaboration_input +UpdateCollaborationOutput,update_collaboration_output +UpdateCollectionDetail,update_collection_detail +UpdateCollectionRequest,update_collection_request +UpdateCollectionResponse,update_collection_response +UpdateColumnStatisticsForPartitionRequest,update_column_statistics_for_partition_request +UpdateColumnStatisticsForPartitionResponse,update_column_statistics_for_partition_response +UpdateColumnStatisticsForTableRequest,update_column_statistics_for_table_request +UpdateColumnStatisticsForTableResponse,update_column_statistics_for_table_response +UpdateCommentInput,update_comment_input +UpdateCommentOutput,update_comment_output +UpdateCompanyNetworkConfigurationRequest,update_company_network_configuration_request +UpdateComponentConfigurationRequest,update_component_configuration_request +UpdateComponentData,update_component_data +UpdateComponentInput,update_component_input +UpdateComponentOutput,update_component_output +UpdateComponentRequest,update_component_request +UpdateComponentResponse,update_component_response +UpdateComponentTypeRequest,update_component_type_request +UpdateComponentTypeResponse,update_component_type_response +UpdateComputeEnvironmentRequest,update_compute_environment_request +UpdateComputeEnvironmentResponse,update_compute_environment_response +UpdateConditionalForwarderRequest,update_conditional_forwarder_request +UpdateConferenceProviderRequest,update_conference_provider_request +UpdateConfigRequest,update_config_request +UpdateConfigurationProfileRequest,update_configuration_profile_request +UpdateConfigurationRequest,update_configuration_request +UpdateConfigurationResponse,update_configuration_response +UpdateConfigurationSetEventDestinationRequest,update_configuration_set_event_destination_request +UpdateConfigurationSetReputationMetricsEnabledRequest,update_configuration_set_reputation_metrics_enabled_request +UpdateConfigurationSetSendingEnabledRequest,update_configuration_set_sending_enabled_request +UpdateConfigurationSetTrackingOptionsRequest,update_configuration_set_tracking_options_request +UpdateConfigurationTemplateMessage,update_configuration_template_message +UpdateConfiguredTableAnalysisRuleInput,update_configured_table_analysis_rule_input +UpdateConfiguredTableAnalysisRuleOutput,update_configured_table_analysis_rule_output +UpdateConfiguredTableAssociationInput,update_configured_table_association_input +UpdateConfiguredTableAssociationOutput,update_configured_table_association_output +UpdateConfiguredTableInput,update_configured_table_input +UpdateConfiguredTableOutput,update_configured_table_output +UpdateConnectClientAddInRequest,update_connect_client_add_in_request +UpdateConnectionAliasPermissionRequest,update_connection_alias_permission_request +UpdateConnectionApiKeyAuthRequestParameters,update_connection_api_key_auth_request_parameters +UpdateConnectionAuthRequestParameters,update_connection_auth_request_parameters +UpdateConnectionBasicAuthRequestParameters,update_connection_basic_auth_request_parameters +UpdateConnectionOAuthClientRequestParameters,update_connection_o_auth_client_request_parameters +UpdateConnectionOAuthRequestParameters,update_connection_o_auth_request_parameters +UpdateConnectionRequest,update_connection_request +UpdateConnectionResponse,update_connection_response +UpdateConnectivityInfoRequest,update_connectivity_info_request +UpdateConnectivityInfoResponse,update_connectivity_info_response +UpdateConnectivityRequest,update_connectivity_request +UpdateConnectivityResponse,update_connectivity_response +UpdateConnectorDefinitionRequest,update_connector_definition_request +UpdateConnectorProfileRequest,update_connector_profile_request +UpdateConnectorProfileResponse,update_connector_profile_response +UpdateConnectorRegistrationRequest,update_connector_registration_request +UpdateConnectorRegistrationResponse,update_connector_registration_response +UpdateConnectorRequest,update_connector_request +UpdateConnectorResponse,update_connector_response +UpdateConstraintInput,update_constraint_input +UpdateConstraintOutput,update_constraint_output +UpdateContactAttributesRequest,update_contact_attributes_request +UpdateContactChannelRequest,update_contact_channel_request +UpdateContactEvaluationRequest,update_contact_evaluation_request +UpdateContactEvaluationResponse,update_contact_evaluation_response +UpdateContactFlowContentRequest,update_contact_flow_content_request +UpdateContactFlowMetadataRequest,update_contact_flow_metadata_request +UpdateContactFlowModuleContentRequest,update_contact_flow_module_content_request +UpdateContactFlowModuleMetadataRequest,update_contact_flow_module_metadata_request +UpdateContactFlowNameRequest,update_contact_flow_name_request +UpdateContactListRequest,update_contact_list_request +UpdateContactRequest,update_contact_request +UpdateContactScheduleRequest,update_contact_schedule_request +UpdateContainerAgentRequest,update_container_agent_request +UpdateContainerAgentResponse,update_container_agent_response +UpdateContainerInstancesStateRequest,update_container_instances_state_request +UpdateContainerInstancesStateResponse,update_container_instances_state_response +UpdateContainerServiceRequest,update_container_service_request +UpdateContainerServiceResult,update_container_service_result +UpdateContentRequest,update_content_request +UpdateContentResponse,update_content_response +UpdateContextRequest,update_context_request +UpdateContextResponse,update_context_response +UpdateContinuousBackupsInput,update_continuous_backups_input +UpdateContinuousBackupsOutput,update_continuous_backups_output +UpdateContinuousDeploymentPolicyRequest,update_continuous_deployment_policy_request +UpdateContinuousDeploymentPolicyResult,update_continuous_deployment_policy_result +UpdateContributorInsightsInput,update_contributor_insights_input +UpdateContributorInsightsOutput,update_contributor_insights_output +UpdateControlPanelRequest,update_control_panel_request +UpdateControlPanelResponse,update_control_panel_response +UpdateControlRequest,update_control_request +UpdateControlResponse,update_control_response +UpdateCoreDefinitionRequest,update_core_definition_request +UpdateCoreNetworkRequest,update_core_network_request +UpdateCoreNetworkResponse,update_core_network_response +UpdateCostAllocationTagsStatusError,update_cost_allocation_tags_status_error +UpdateCostAllocationTagsStatusRequest,update_cost_allocation_tags_status_request +UpdateCostAllocationTagsStatusResponse,update_cost_allocation_tags_status_response +UpdateCostCategoryDefinitionRequest,update_cost_category_definition_request +UpdateCostCategoryDefinitionResponse,update_cost_category_definition_response +UpdateCount,update_count +UpdateCrawlerRequest,update_crawler_request +UpdateCrawlerScheduleRequest,update_crawler_schedule_request +UpdateCrlRequest,update_crl_request +UpdateCsvClassifierRequest,update_csv_classifier_request +UpdateCustomKeyStoreRequest,update_custom_key_store_request +UpdateCustomLineItemChargeDetails,update_custom_line_item_charge_details +UpdateCustomLineItemFlatChargeDetails,update_custom_line_item_flat_charge_details +UpdateCustomLineItemInput,update_custom_line_item_input +UpdateCustomLineItemOutput,update_custom_line_item_output +UpdateCustomLineItemPercentageChargeDetails,update_custom_line_item_percentage_charge_details +UpdateCustomMetricRequest,update_custom_metric_request +UpdateCustomMetricResponse,update_custom_metric_response +UpdateCustomRoutingAcceleratorAttributesRequest,update_custom_routing_accelerator_attributes_request +UpdateCustomRoutingAcceleratorAttributesResponse,update_custom_routing_accelerator_attributes_response +UpdateCustomRoutingAcceleratorRequest,update_custom_routing_accelerator_request +UpdateCustomRoutingAcceleratorResponse,update_custom_routing_accelerator_response +UpdateCustomRoutingListenerRequest,update_custom_routing_listener_request +UpdateCustomRoutingListenerResponse,update_custom_routing_listener_response +UpdateCustomVerificationEmailTemplateRequest,update_custom_verification_email_template_request +UpdateDashboardPermissionsRequest,update_dashboard_permissions_request +UpdateDashboardPermissionsResponse,update_dashboard_permissions_response +UpdateDashboardPublishedVersionRequest,update_dashboard_published_version_request +UpdateDashboardPublishedVersionResponse,update_dashboard_published_version_response +UpdateDashboardRequest,update_dashboard_request +UpdateDashboardResponse,update_dashboard_response +UpdateDataCatalogInput,update_data_catalog_input +UpdateDataCellsFilterRequest,update_data_cells_filter_request +UpdateDataIntegrationRequest,update_data_integration_request +UpdateDataLakeExceptionSubscriptionRequest,update_data_lake_exception_subscription_request +UpdateDataLakeRequest,update_data_lake_request +UpdateDataLakeResponse,update_data_lake_response +UpdateDataQualityRulesetRequest,update_data_quality_ruleset_request +UpdateDataQualityRulesetResponse,update_data_quality_ruleset_response +UpdateDataRepositoryAssociationRequest,update_data_repository_association_request +UpdateDataRepositoryAssociationResponse,update_data_repository_association_response +UpdateDataRetentionInput,update_data_retention_input +UpdateDataRole,update_data_role +UpdateDataSecurityConfig,update_data_security_config +UpdateDataSetPermissionsRequest,update_data_set_permissions_request +UpdateDataSetPermissionsResponse,update_data_set_permissions_response +UpdateDataSetRequest,update_data_set_request +UpdateDataSetResponse,update_data_set_response +UpdateDataSource,update_data_source +UpdateDataSourceInput,update_data_source_input +UpdateDataSourceOutput,update_data_source_output +UpdateDataSourcePermissionsRequest,update_data_source_permissions_request +UpdateDataSourcePermissionsResponse,update_data_source_permissions_response +UpdateDataSourceRequest,update_data_source_request +UpdateDataSourceResponse,update_data_source_response +UpdateDatabaseRequest,update_database_request +UpdateDatabaseResponse,update_database_response +UpdateDatasetEntriesRequest,update_dataset_entries_request +UpdateDatasetEntriesResponse,update_dataset_entries_response +UpdateDatasetGroupRequest,update_dataset_group_request +UpdateDatasetRequest,update_dataset_request +UpdateDatasetResponse,update_dataset_response +UpdateDatasourcePackagesRequest,update_datasource_packages_request +UpdateDatastoreRequest,update_datastore_request +UpdateDate,update_date +UpdateDateTime,update_date_time +UpdateDecoderManifestRequest,update_decoder_manifest_request +UpdateDecoderManifestResponse,update_decoder_manifest_response +UpdateDefaultAutoScalingConfigurationRequest,update_default_auto_scaling_configuration_request +UpdateDefaultAutoScalingConfigurationResponse,update_default_auto_scaling_configuration_response +UpdateDefaultBranchInput,update_default_branch_input +UpdateDefaultMailDomainRequest,update_default_mail_domain_request +UpdateDeletionProtectionInput,update_deletion_protection_input +UpdateDeploymentGroupInput,update_deployment_group_input +UpdateDeploymentGroupOutput,update_deployment_group_output +UpdateDeploymentRequest,update_deployment_request +UpdateDeploymentResponse,update_deployment_response +UpdateDeploymentStrategyRequest,update_deployment_strategy_request +UpdateDestinationInput,update_destination_input +UpdateDestinationRequest,update_destination_request +UpdateDestinationResponse,update_destination_response +UpdateDetectorModelRequest,update_detector_model_request +UpdateDetectorModelResponse,update_detector_model_response +UpdateDetectorRequest,update_detector_request +UpdateDetectorVersionMetadataRequest,update_detector_version_metadata_request +UpdateDetectorVersionRequest,update_detector_version_request +UpdateDetectorVersionStatusRequest,update_detector_version_status_request +UpdateDevEndpointRequest,update_dev_endpoint_request +UpdateDevEnvironmentRequest,update_dev_environment_request +UpdateDevEnvironmentResponse,update_dev_environment_response +UpdateDeviceCertificateParams,update_device_certificate_params +UpdateDeviceDefinitionRequest,update_device_definition_request +UpdateDeviceFleetRequest,update_device_fleet_request +UpdateDeviceInstanceRequest,update_device_instance_request +UpdateDeviceInstanceResult,update_device_instance_result +UpdateDeviceMetadataRequest,update_device_metadata_request +UpdateDeviceMetadataResponse,update_device_metadata_response +UpdateDevicePolicyConfigurationRequest,update_device_policy_configuration_request +UpdateDevicePoolRequest,update_device_pool_request +UpdateDevicePoolResult,update_device_pool_result +UpdateDeviceRequest,update_device_request +UpdateDeviceResponse,update_device_response +UpdateDeviceStateRequest,update_device_state_request +UpdateDeviceStatusRequest,update_device_status_request +UpdateDevicesRequest,update_devices_request +UpdateDimensionRequest,update_dimension_request +UpdateDimensionResponse,update_dimension_response +UpdateDirectConnectGatewayAssociationRequest,update_direct_connect_gateway_association_request +UpdateDirectConnectGatewayAssociationResult,update_direct_connect_gateway_association_result +UpdateDirectConnectGatewayRequest,update_direct_connect_gateway_request +UpdateDirectConnectGatewayResponse,update_direct_connect_gateway_response +UpdateDirectoryConfigRequest,update_directory_config_request +UpdateDirectoryConfigResult,update_directory_config_result +UpdateDirectorySetupRequest,update_directory_setup_request +UpdateDiscovererRequest,update_discoverer_request +UpdateDiscovererResponse,update_discoverer_response +UpdateDiscoveryJobRequest,update_discovery_job_request +UpdateDistributionBundleRequest,update_distribution_bundle_request +UpdateDistributionBundleResult,update_distribution_bundle_result +UpdateDistributionConfigurationRequest,update_distribution_configuration_request +UpdateDistributionConfigurationResponse,update_distribution_configuration_response +UpdateDistributionRequest,update_distribution_request +UpdateDistributionResult,update_distribution_result +UpdateDistributionWithStagingConfigRequest,update_distribution_with_staging_config_request +UpdateDistributionWithStagingConfigResult,update_distribution_with_staging_config_result +UpdateDocumentDefaultVersionRequest,update_document_default_version_request +UpdateDocumentDefaultVersionResult,update_document_default_version_result +UpdateDocumentMetadataRequest,update_document_metadata_request +UpdateDocumentRequest,update_document_request +UpdateDocumentResult,update_document_result +UpdateDocumentVersionRequest,update_document_version_request +UpdateDocumentationPartRequest,update_documentation_part_request +UpdateDocumentationVersionRequest,update_documentation_version_request +UpdateDomainAssociationRequest,update_domain_association_request +UpdateDomainAssociationResult,update_domain_association_result +UpdateDomainConfigRequest,update_domain_config_request +UpdateDomainConfigResponse,update_domain_config_response +UpdateDomainConfigurationRequest,update_domain_configuration_request +UpdateDomainConfigurationResponse,update_domain_configuration_response +UpdateDomainContactPrivacyRequest,update_domain_contact_privacy_request +UpdateDomainContactPrivacyResponse,update_domain_contact_privacy_response +UpdateDomainContactRequest,update_domain_contact_request +UpdateDomainContactResponse,update_domain_contact_response +UpdateDomainEndpointOptionsRequest,update_domain_endpoint_options_request +UpdateDomainEndpointOptionsResponse,update_domain_endpoint_options_response +UpdateDomainEntryRequest,update_domain_entry_request +UpdateDomainEntryResult,update_domain_entry_result +UpdateDomainMetadataRequest,update_domain_metadata_request +UpdateDomainNameRequest,update_domain_name_request +UpdateDomainNameResponse,update_domain_name_response +UpdateDomainNameserversRequest,update_domain_nameservers_request +UpdateDomainNameserversResponse,update_domain_nameservers_response +UpdateDomainRequest,update_domain_request +UpdateDomainResponse,update_domain_response +UpdateDynamicThingGroupRequest,update_dynamic_thing_group_request +UpdateDynamicThingGroupResponse,update_dynamic_thing_group_response +UpdateEc2DeepInspectionConfigurationRequest,update_ec2_deep_inspection_configuration_request +UpdateEc2DeepInspectionConfigurationResponse,update_ec2_deep_inspection_configuration_response +UpdateEgressGatewayBridgeRequest,update_egress_gateway_bridge_request +UpdateElasticIpRequest,update_elastic_ip_request +UpdateElasticsearchDomainConfigRequest,update_elasticsearch_domain_config_request +UpdateElasticsearchDomainConfigResponse,update_elasticsearch_domain_config_response +UpdateEmailChannelRequest,update_email_channel_request +UpdateEmailChannelResponse,update_email_channel_response +UpdateEmailIdentityPolicyRequest,update_email_identity_policy_request +UpdateEmailTemplateRequest,update_email_template_request +UpdateEmailTemplateResponse,update_email_template_response +UpdateEmergencyContactSettingsRequest,update_emergency_contact_settings_request +UpdateEncryption,update_encryption +UpdateEncryptionKeyRequest,update_encryption_key_request +UpdateEndOfMeetingReminder,update_end_of_meeting_reminder +UpdateEndpointAccessRequest,update_endpoint_access_request +UpdateEndpointAccessResponse,update_endpoint_access_response +UpdateEndpointGroupRequest,update_endpoint_group_request +UpdateEndpointGroupResponse,update_endpoint_group_response +UpdateEndpointInput,update_endpoint_input +UpdateEndpointOutput,update_endpoint_output +UpdateEndpointRequest,update_endpoint_request +UpdateEndpointResponse,update_endpoint_response +UpdateEndpointWeightsAndCapacitiesInput,update_endpoint_weights_and_capacities_input +UpdateEndpointWeightsAndCapacitiesOutput,update_endpoint_weights_and_capacities_output +UpdateEndpointsBatchRequest,update_endpoints_batch_request +UpdateEndpointsBatchResponse,update_endpoints_batch_response +UpdateEnrollmentStatusRequest,update_enrollment_status_request +UpdateEnrollmentStatusResponse,update_enrollment_status_response +UpdateEntitlementRequest,update_entitlement_request +UpdateEntitlementResult,update_entitlement_result +UpdateEntityRequest,update_entity_request +UpdateEntityResponse,update_entity_response +UpdateEnvironmentAccountConnectionInput,update_environment_account_connection_input +UpdateEnvironmentAccountConnectionOutput,update_environment_account_connection_output +UpdateEnvironmentInput,update_environment_input +UpdateEnvironmentMembershipRequest,update_environment_membership_request +UpdateEnvironmentMembershipResult,update_environment_membership_result +UpdateEnvironmentMessage,update_environment_message +UpdateEnvironmentOutput,update_environment_output +UpdateEnvironmentRequest,update_environment_request +UpdateEnvironmentResponse,update_environment_response +UpdateEnvironmentTemplateInput,update_environment_template_input +UpdateEnvironmentTemplateOutput,update_environment_template_output +UpdateEnvironmentTemplateVersionInput,update_environment_template_version_input +UpdateEnvironmentTemplateVersionOutput,update_environment_template_version_output +UpdateEphemerisRequest,update_ephemeris_request +UpdateError,update_error +UpdateEtlLibraries,update_etl_libraries +UpdateEvaluationFormRequest,update_evaluation_form_request +UpdateEvaluationFormResponse,update_evaluation_form_response +UpdateEvaluationInput,update_evaluation_input +UpdateEvaluationOutput,update_evaluation_output +UpdateEventActionRequest,update_event_action_request +UpdateEventActionResponse,update_event_action_response +UpdateEventConfigurationByResourceTypesRequest,update_event_configuration_by_resource_types_request +UpdateEventConfigurationsRequest,update_event_configurations_request +UpdateEventDataStoreRequest,update_event_data_store_request +UpdateEventDataStoreResponse,update_event_data_store_response +UpdateEventDestinationRequest,update_event_destination_request +UpdateEventDestinationResult,update_event_destination_result +UpdateEventIntegrationRequest,update_event_integration_request +UpdateEventLabelRequest,update_event_label_request +UpdateEventSourceMappingRequest,update_event_source_mapping_request +UpdateEventSourcesConfigRequest,update_event_sources_config_request +UpdateExperienceRequest,update_experience_request +UpdateExperimentRequest,update_experiment_request +UpdateExperimentResponse,update_experiment_response +UpdateExperimentTemplateActionInputItem,update_experiment_template_action_input_item +UpdateExperimentTemplateLogConfigurationInput,update_experiment_template_log_configuration_input +UpdateExperimentTemplateRequest,update_experiment_template_request +UpdateExperimentTemplateResponse,update_experiment_template_response +UpdateExperimentTemplateStopConditionInput,update_experiment_template_stop_condition_input +UpdateExperimentTemplateTargetInput,update_experiment_template_target_input +UpdateExpirationForHITRequest,update_expiration_for_hit_request +UpdateExportRequest,update_export_request +UpdateExportResponse,update_export_response +UpdateExpression,update_expression +UpdateExtensionAssociationRequest,update_extension_association_request +UpdateExtensionRequest,update_extension_request +UpdateFPorts,update_f_ports +UpdateFacetRequest,update_facet_request +UpdateFailbackReplicationConfigurationRequest,update_failback_replication_configuration_request +UpdateFailoverConfig,update_failover_config +UpdateFeatureGroupRequest,update_feature_group_request +UpdateFeatureGroupResponse,update_feature_group_response +UpdateFeatureMetadataRequest,update_feature_metadata_request +UpdateFeatureRequest,update_feature_request +UpdateFeatureResponse,update_feature_response +UpdateFeaturedResultsSetRequest,update_featured_results_set_request +UpdateFeaturedResultsSetResponse,update_featured_results_set_response +UpdateFieldLevelEncryptionConfigRequest,update_field_level_encryption_config_request +UpdateFieldLevelEncryptionConfigResult,update_field_level_encryption_config_result +UpdateFieldLevelEncryptionProfileRequest,update_field_level_encryption_profile_request +UpdateFieldLevelEncryptionProfileResult,update_field_level_encryption_profile_result +UpdateFieldRequest,update_field_request +UpdateFileCacheLustreConfiguration,update_file_cache_lustre_configuration +UpdateFileCacheRequest,update_file_cache_request +UpdateFileCacheResponse,update_file_cache_response +UpdateFileSystemAssociationInput,update_file_system_association_input +UpdateFileSystemAssociationOutput,update_file_system_association_output +UpdateFileSystemLustreConfiguration,update_file_system_lustre_configuration +UpdateFileSystemOntapConfiguration,update_file_system_ontap_configuration +UpdateFileSystemOpenZFSConfiguration,update_file_system_open_zfs_configuration +UpdateFileSystemRequest,update_file_system_request +UpdateFileSystemResponse,update_file_system_response +UpdateFileSystemWindowsConfiguration,update_file_system_windows_configuration +UpdateFilterRequest,update_filter_request +UpdateFilterResponse,update_filter_response +UpdateFindingAggregatorRequest,update_finding_aggregator_request +UpdateFindingAggregatorResponse,update_finding_aggregator_response +UpdateFindingsFeedbackRequest,update_findings_feedback_request +UpdateFindingsFilterRequest,update_findings_filter_request +UpdateFindingsFilterResponse,update_findings_filter_response +UpdateFindingsRequest,update_findings_request +UpdateFirewallConfigRequest,update_firewall_config_request +UpdateFirewallConfigResponse,update_firewall_config_response +UpdateFirewallDeleteProtectionRequest,update_firewall_delete_protection_request +UpdateFirewallDeleteProtectionResponse,update_firewall_delete_protection_response +UpdateFirewallDescriptionRequest,update_firewall_description_request +UpdateFirewallDescriptionResponse,update_firewall_description_response +UpdateFirewallDomainsRequest,update_firewall_domains_request +UpdateFirewallDomainsResponse,update_firewall_domains_response +UpdateFirewallEncryptionConfigurationRequest,update_firewall_encryption_configuration_request +UpdateFirewallEncryptionConfigurationResponse,update_firewall_encryption_configuration_response +UpdateFirewallPolicyChangeProtectionRequest,update_firewall_policy_change_protection_request +UpdateFirewallPolicyChangeProtectionResponse,update_firewall_policy_change_protection_response +UpdateFirewallPolicyRequest,update_firewall_policy_request +UpdateFirewallPolicyResponse,update_firewall_policy_response +UpdateFirewallRuleGroupAssociationRequest,update_firewall_rule_group_association_request +UpdateFirewallRuleGroupAssociationResponse,update_firewall_rule_group_association_response +UpdateFirewallRuleRequest,update_firewall_rule_request +UpdateFirewallRuleResponse,update_firewall_rule_response +UpdateFleetAttributesInput,update_fleet_attributes_input +UpdateFleetAttributesOutput,update_fleet_attributes_output +UpdateFleetCapacityInput,update_fleet_capacity_input +UpdateFleetCapacityOutput,update_fleet_capacity_output +UpdateFleetMetadataRequest,update_fleet_metadata_request +UpdateFleetMetricRequest,update_fleet_metric_request +UpdateFleetPortSettingsInput,update_fleet_port_settings_input +UpdateFleetPortSettingsOutput,update_fleet_port_settings_output +UpdateFleetRequest,update_fleet_request +UpdateFleetResponse,update_fleet_response +UpdateFleetResult,update_fleet_result +UpdateFlowEntitlementRequest,update_flow_entitlement_request +UpdateFlowEntitlementResponse,update_flow_entitlement_response +UpdateFlowMediaStreamRequest,update_flow_media_stream_request +UpdateFlowMediaStreamResponse,update_flow_media_stream_response +UpdateFlowOutputRequest,update_flow_output_request +UpdateFlowOutputResponse,update_flow_output_response +UpdateFlowRequest,update_flow_request +UpdateFlowResponse,update_flow_response +UpdateFlowSourceRequest,update_flow_source_request +UpdateFlowSourceResponse,update_flow_source_response +UpdateFlowTemplateRequest,update_flow_template_request +UpdateFlowTemplateResponse,update_flow_template_response +UpdateFlywheelRequest,update_flywheel_request +UpdateFlywheelResponse,update_flywheel_response +UpdateFolderPermissionsRequest,update_folder_permissions_request +UpdateFolderPermissionsResponse,update_folder_permissions_response +UpdateFolderRequest,update_folder_request +UpdateFolderResponse,update_folder_response +UpdateFormData,update_form_data +UpdateFormRequest,update_form_request +UpdateFormResponse,update_form_response +UpdateFrameworkInput,update_framework_input +UpdateFrameworkOutput,update_framework_output +UpdateFreeTierConfig,update_free_tier_config +UpdateFunctionCodeRequest,update_function_code_request +UpdateFunctionConfigurationRequest,update_function_configuration_request +UpdateFunctionDefinitionRequest,update_function_definition_request +UpdateFunctionEventInvokeConfigRequest,update_function_event_invoke_config_request +UpdateFunctionRequest,update_function_request +UpdateFunctionResponse,update_function_response +UpdateFunctionResult,update_function_result +UpdateFunctionUrlConfigRequest,update_function_url_config_request +UpdateFunctionUrlConfigResponse,update_function_url_config_response +UpdateFuotaTaskRequest,update_fuota_task_request +UpdateGameConfigurationRequest,update_game_configuration_request +UpdateGameConfigurationResult,update_game_configuration_result +UpdateGameRequest,update_game_request +UpdateGameResult,update_game_result +UpdateGameServerGroupInput,update_game_server_group_input +UpdateGameServerGroupOutput,update_game_server_group_output +UpdateGameServerInput,update_game_server_input +UpdateGameServerOutput,update_game_server_output +UpdateGameSessionInput,update_game_session_input +UpdateGameSessionOutput,update_game_session_output +UpdateGameSessionQueueInput,update_game_session_queue_input +UpdateGameSessionQueueOutput,update_game_session_queue_output +UpdateGatewayBridgeSourceRequest,update_gateway_bridge_source_request +UpdateGatewayCapabilityConfigurationRequest,update_gateway_capability_configuration_request +UpdateGatewayCapabilityConfigurationResponse,update_gateway_capability_configuration_response +UpdateGatewayGroupRequest,update_gateway_group_request +UpdateGatewayInformationInput,update_gateway_information_input +UpdateGatewayInformationOutput,update_gateway_information_output +UpdateGatewayInstanceRequest,update_gateway_instance_request +UpdateGatewayInstanceResponse,update_gateway_instance_response +UpdateGatewayRequest,update_gateway_request +UpdateGatewayResponseRequest,update_gateway_response_request +UpdateGatewayRouteInput,update_gateway_route_input +UpdateGatewayRouteOutput,update_gateway_route_output +UpdateGatewaySoftwareNowInput,update_gateway_software_now_input +UpdateGatewaySoftwareNowOutput,update_gateway_software_now_output +UpdateGcmChannelRequest,update_gcm_channel_request +UpdateGcmChannelResponse,update_gcm_channel_response +UpdateGeoMatchSetRequest,update_geo_match_set_request +UpdateGeoMatchSetResponse,update_geo_match_set_response +UpdateGeofenceCollectionRequest,update_geofence_collection_request +UpdateGeofenceCollectionResponse,update_geofence_collection_response +UpdateGlobalNetworkRequest,update_global_network_request +UpdateGlobalNetworkResponse,update_global_network_response +UpdateGlobalSecondaryIndexAction,update_global_secondary_index_action +UpdateGlobalSettingsInput,update_global_settings_input +UpdateGlobalSettingsRequest,update_global_settings_request +UpdateGlobalTableInput,update_global_table_input +UpdateGlobalTableOutput,update_global_table_output +UpdateGlobalTableSettingsInput,update_global_table_settings_input +UpdateGlobalTableSettingsOutput,update_global_table_settings_output +UpdateGraphqlApiRequest,update_graphql_api_request +UpdateGraphqlApiResponse,update_graphql_api_response +UpdateGrokClassifierRequest,update_grok_classifier_request +UpdateGroupCertificateConfigurationRequest,update_group_certificate_configuration_request +UpdateGroupCertificateConfigurationResponse,update_group_certificate_configuration_response +UpdateGroupInput,update_group_input +UpdateGroupOutput,update_group_output +UpdateGroupQueryInput,update_group_query_input +UpdateGroupQueryOutput,update_group_query_output +UpdateGroupRequest,update_group_request +UpdateGroupResponse,update_group_response +UpdateGroupResult,update_group_result +UpdateHITReviewStatusRequest,update_hit_review_status_request +UpdateHITTypeOfHITRequest,update_hit_type_of_hit_request +UpdateHealthCheckRequest,update_health_check_request +UpdateHealthCheckResponse,update_health_check_response +UpdateHostInput,update_host_input +UpdateHostKeyRequest,update_host_key_request +UpdateHostKeyResponse,update_host_key_response +UpdateHostedZoneCommentRequest,update_hosted_zone_comment_request +UpdateHostedZoneCommentResponse,update_hosted_zone_comment_response +UpdateHoursOfOperationRequest,update_hours_of_operation_request +UpdateHttpNamespaceRequest,update_http_namespace_request +UpdateHttpNamespaceResponse,update_http_namespace_response +UpdateHubRequest,update_hub_request +UpdateHubResponse,update_hub_response +UpdateHypervisorInput,update_hypervisor_input +UpdateHypervisorOutput,update_hypervisor_output +UpdateIAMPolicyAssignmentRequest,update_iam_policy_assignment_request +UpdateIAMPolicyAssignmentResponse,update_iam_policy_assignment_response +UpdateIPSetRequest,update_ip_set_request +UpdateIPSetResponse,update_ip_set_response +UpdateIdentityProviderConfigurationRequest,update_identity_provider_configuration_request +UpdateIdentityProviderRequest,update_identity_provider_request +UpdateIdentityProviderResponse,update_identity_provider_response +UpdateIdentityProviderSettingsRequest,update_identity_provider_settings_request +UpdateIdentityProviderSettingsResponse,update_identity_provider_settings_response +UpdateIdentitySourceInput,update_identity_source_input +UpdateIdentitySourceOutput,update_identity_source_output +UpdateImageGenerationConfigurationInput,update_image_generation_configuration_input +UpdateImagePermissionsRequest,update_image_permissions_request +UpdateImagePipelineRequest,update_image_pipeline_request +UpdateImagePipelineResponse,update_image_pipeline_response +UpdateImageRequest,update_image_request +UpdateImageResponse,update_image_response +UpdateImageSetMetadataRequest,update_image_set_metadata_request +UpdateImageSetMetadataResponse,update_image_set_metadata_response +UpdateImageVersionRequest,update_image_version_request +UpdateImageVersionResponse,update_image_version_response +UpdateImpersonationRoleRequest,update_impersonation_role_request +UpdateInAppTemplateRequest,update_in_app_template_request +UpdateInAppTemplateResponse,update_in_app_template_response +UpdateInProgressException,update_in_progress_exception +UpdateIncidentRecordInput,update_incident_record_input +UpdateIndexRequest,update_index_request +UpdateIndexTypeInput,update_index_type_input +UpdateIndexTypeOutput,update_index_type_output +UpdateIndexingConfigurationRequest,update_indexing_configuration_request +UpdateInferenceExperimentRequest,update_inference_experiment_request +UpdateInferenceExperimentResponse,update_inference_experiment_response +UpdateInferenceSchedulerRequest,update_inference_scheduler_request +UpdateInfoEntry,update_info_entry +UpdateInfrastructureConfigurationRequest,update_infrastructure_configuration_request +UpdateInfrastructureConfigurationResponse,update_infrastructure_configuration_response +UpdateIngestionDestinationRequest,update_ingestion_destination_request +UpdateIngestionDestinationResponse,update_ingestion_destination_response +UpdateIngressGatewayBridgeRequest,update_ingress_gateway_bridge_request +UpdateInputDeviceRequest,update_input_device_request +UpdateInputDeviceResponse,update_input_device_response +UpdateInputRequest,update_input_request +UpdateInputResponse,update_input_response +UpdateInputSecurityGroupRequest,update_input_security_group_request +UpdateInputSecurityGroupResponse,update_input_security_group_response +UpdateInsightRequest,update_insight_request +UpdateInstanceAccessControlAttributeConfigurationRequest,update_instance_access_control_attribute_configuration_request +UpdateInstanceAttributeRequest,update_instance_attribute_request +UpdateInstanceCustomHealthStatusRequest,update_instance_custom_health_status_request +UpdateInstanceMetadataOptionsRequest,update_instance_metadata_options_request +UpdateInstanceMetadataOptionsResult,update_instance_metadata_options_result +UpdateInstanceProfileRequest,update_instance_profile_request +UpdateInstanceProfileResult,update_instance_profile_result +UpdateInstanceRequest,update_instance_request +UpdateInstanceStorageConfigRequest,update_instance_storage_config_request +UpdateInstantBooking,update_instant_booking +UpdateInstruction,update_instruction +UpdateIntegrationRequest,update_integration_request +UpdateIntegrationResponseRequest,update_integration_response_request +UpdateIntegrationResponseResponse,update_integration_response_response +UpdateIntegrationResult,update_integration_result +UpdateIntentRequest,update_intent_request +UpdateIntentResponse,update_intent_response +UpdateIpAccessSettingsRequest,update_ip_access_settings_request +UpdateIpAccessSettingsResponse,update_ip_access_settings_response +UpdateIpAddress,update_ip_address +UpdateIpAddresses,update_ip_addresses +UpdateIpRestrictionRequest,update_ip_restriction_request +UpdateIpRestrictionResponse,update_ip_restriction_response +UpdateItemInput,update_item_input +UpdateItemOutput,update_item_output +UpdateJobExecutionRequest,update_job_execution_request +UpdateJobExecutionResponse,update_job_execution_response +UpdateJobFromSourceControlRequest,update_job_from_source_control_request +UpdateJobFromSourceControlResponse,update_job_from_source_control_response +UpdateJobPriorityRequest,update_job_priority_request +UpdateJobPriorityResult,update_job_priority_result +UpdateJobQueueRequest,update_job_queue_request +UpdateJobQueueResponse,update_job_queue_response +UpdateJobRequest,update_job_request +UpdateJobResponse,update_job_response +UpdateJobShipmentStateRequest,update_job_shipment_state_request +UpdateJobStatusRequest,update_job_status_request +UpdateJobStatusResult,update_job_status_result +UpdateJobTemplateRequest,update_job_template_request +UpdateJobTemplateResponse,update_job_template_response +UpdateJourneyRequest,update_journey_request +UpdateJourneyResponse,update_journey_response +UpdateJourneyStateRequest,update_journey_state_request +UpdateJourneyStateResponse,update_journey_state_response +UpdateJsonClassifierRequest,update_json_classifier_request +UpdateKeyDescriptionRequest,update_key_description_request +UpdateKeyGroupRequest,update_key_group_request +UpdateKeyGroupResult,update_key_group_result +UpdateKeyRequest,update_key_request +UpdateKeyResponse,update_key_response +UpdateKnowledgeBaseTemplateUriRequest,update_knowledge_base_template_uri_request +UpdateKnowledgeBaseTemplateUriResponse,update_knowledge_base_template_uri_response +UpdateKxClusterDatabasesRequest,update_kx_cluster_databases_request +UpdateKxDatabaseRequest,update_kx_database_request +UpdateKxDatabaseResponse,update_kx_database_response +UpdateKxEnvironmentNetworkRequest,update_kx_environment_network_request +UpdateKxEnvironmentNetworkResponse,update_kx_environment_network_response +UpdateKxEnvironmentRequest,update_kx_environment_request +UpdateKxEnvironmentResponse,update_kx_environment_response +UpdateKxUserRequest,update_kx_user_request +UpdateKxUserResponse,update_kx_user_response +UpdateLFTagRequest,update_lf_tag_request +UpdateLabelGroupRequest,update_label_group_request +UpdateLabelsPayload,update_labels_payload +UpdateLagRequest,update_lag_request +UpdateLaunchConfigurationRequest,update_launch_configuration_request +UpdateLaunchConfigurationTemplateRequest,update_launch_configuration_template_request +UpdateLaunchConfigurationTemplateResponse,update_launch_configuration_template_response +UpdateLaunchProfileMemberRequest,update_launch_profile_member_request +UpdateLaunchProfileMemberResponse,update_launch_profile_member_response +UpdateLaunchProfileRequest,update_launch_profile_request +UpdateLaunchProfileResponse,update_launch_profile_response +UpdateLaunchRequest,update_launch_request +UpdateLaunchResponse,update_launch_response +UpdateLayerRequest,update_layer_request +UpdateLayoutRequest,update_layout_request +UpdateLedgerPermissionsModeRequest,update_ledger_permissions_mode_request +UpdateLedgerPermissionsModeResponse,update_ledger_permissions_mode_response +UpdateLedgerRequest,update_ledger_request +UpdateLedgerResponse,update_ledger_response +UpdateLensReviewInput,update_lens_review_input +UpdateLensReviewOutput,update_lens_review_output +UpdateLicenseConfigurationRequest,update_license_configuration_request +UpdateLicenseManagerReportGeneratorRequest,update_license_manager_report_generator_request +UpdateLicenseSpecificationsForResourceRequest,update_license_specifications_for_resource_request +UpdateLifecyclePolicyRequest,update_lifecycle_policy_request +UpdateLinkAttributes,update_link_attributes +UpdateLinkAttributesRequest,update_link_attributes_request +UpdateLinkInput,update_link_input +UpdateLinkOutput,update_link_output +UpdateLinkRequest,update_link_request +UpdateLinkResponse,update_link_response +UpdateListRequest,update_list_request +UpdateListenerRequest,update_listener_request +UpdateListenerResponse,update_listener_response +UpdateLiveSourceRequest,update_live_source_request +UpdateLiveSourceResponse,update_live_source_response +UpdateLoadBalancerAttributeRequest,update_load_balancer_attribute_request +UpdateLoadBalancerAttributeResult,update_load_balancer_attribute_result +UpdateLocationAzureBlobRequest,update_location_azure_blob_request +UpdateLocationHdfsRequest,update_location_hdfs_request +UpdateLocationNfsRequest,update_location_nfs_request +UpdateLocationObjectStorageRequest,update_location_object_storage_request +UpdateLocationSmbRequest,update_location_smb_request +UpdateLogLevelsByResourceTypesRequest,update_log_levels_by_resource_types_request +UpdateLogPatternRequest,update_log_pattern_request +UpdateLogPatternResponse,update_log_pattern_response +UpdateLoggerDefinitionRequest,update_logger_definition_request +UpdateLoggingConfigurationRequest,update_logging_configuration_request +UpdateLoggingConfigurationResponse,update_logging_configuration_response +UpdateLoginProfileRequest,update_login_profile_request +UpdateLongTermPricingRequest,update_long_term_pricing_request +UpdateMLModelInput,update_ml_model_input +UpdateMLModelOutput,update_ml_model_output +UpdateMLTransformRequest,update_ml_transform_request +UpdateMLTransformResponse,update_ml_transform_response +UpdateMacieSessionRequest,update_macie_session_request +UpdateMailboxQuotaRequest,update_mailbox_quota_request +UpdateMaintenance,update_maintenance +UpdateMaintenanceStartTimeInput,update_maintenance_start_time_input +UpdateMaintenanceStartTimeOutput,update_maintenance_start_time_output +UpdateMaintenanceWindowRequest,update_maintenance_window_request +UpdateMaintenanceWindowResult,update_maintenance_window_result +UpdateMaintenanceWindowTargetRequest,update_maintenance_window_target_request +UpdateMaintenanceWindowTargetResult,update_maintenance_window_target_result +UpdateMaintenanceWindowTaskRequest,update_maintenance_window_task_request +UpdateMaintenanceWindowTaskResult,update_maintenance_window_task_result +UpdateMalwareScanSettingsRequest,update_malware_scan_settings_request +UpdateManagedInstanceRoleRequest,update_managed_instance_role_request +UpdateManagedRuleSetVersionExpiryDateRequest,update_managed_rule_set_version_expiry_date_request +UpdateManagedRuleSetVersionExpiryDateResponse,update_managed_rule_set_version_expiry_date_response +UpdateMapRequest,update_map_request +UpdateMapResponse,update_map_response +UpdateMapRunInput,update_map_run_input +UpdateMatchingWorkflowInput,update_matching_workflow_input +UpdateMatchingWorkflowOutput,update_matching_workflow_output +UpdateMatchmakingConfigurationInput,update_matchmaking_configuration_input +UpdateMatchmakingConfigurationOutput,update_matchmaking_configuration_output +UpdateMediaInsightsPipelineConfigurationRequest,update_media_insights_pipeline_configuration_request +UpdateMediaInsightsPipelineConfigurationResponse,update_media_insights_pipeline_configuration_response +UpdateMediaInsightsPipelineStatusRequest,update_media_insights_pipeline_status_request +UpdateMediaPipelineKinesisVideoStreamPoolRequest,update_media_pipeline_kinesis_video_stream_pool_request +UpdateMediaPipelineKinesisVideoStreamPoolResponse,update_media_pipeline_kinesis_video_stream_pool_response +UpdateMediaStorageConfigurationInput,update_media_storage_configuration_input +UpdateMedicalVocabularyRequest,update_medical_vocabulary_request +UpdateMedicalVocabularyResponse,update_medical_vocabulary_response +UpdateMeetingRoomConfiguration,update_meeting_room_configuration +UpdateMemberDetectorsRequest,update_member_detectors_request +UpdateMemberDetectorsResponse,update_member_detectors_response +UpdateMemberInput,update_member_input +UpdateMemberSessionRequest,update_member_session_request +UpdateMembershipInput,update_membership_input +UpdateMembershipOutput,update_membership_output +UpdateMeshInput,update_mesh_input +UpdateMeshOutput,update_mesh_output +UpdateMethodRequest,update_method_request +UpdateMethodResponseRequest,update_method_response_request +UpdateMetricAttributionRequest,update_metric_attribution_request +UpdateMetricAttributionResponse,update_metric_attribution_response +UpdateMetricSetRequest,update_metric_set_request +UpdateMetricSetResponse,update_metric_set_response +UpdateMigrationWorkflowRequest,update_migration_workflow_request +UpdateMigrationWorkflowResponse,update_migration_workflow_response +UpdateMissionProfileRequest,update_mission_profile_request +UpdateMitigationActionRequest,update_mitigation_action_request +UpdateMitigationActionResponse,update_mitigation_action_response +UpdateMobileDeviceAccessRuleRequest,update_mobile_device_access_rule_request +UpdateModelCardRequest,update_model_card_request +UpdateModelCardResponse,update_model_card_response +UpdateModelManifestRequest,update_model_manifest_request +UpdateModelManifestResponse,update_model_manifest_response +UpdateModelPackageInput,update_model_package_input +UpdateModelPackageOutput,update_model_package_output +UpdateModelRequest,update_model_request +UpdateModelResponse,update_model_response +UpdateModelVersionRequest,update_model_version_request +UpdateModelVersionResult,update_model_version_result +UpdateModelVersionStatusRequest,update_model_version_status_request +UpdateMonitorInput,update_monitor_input +UpdateMonitorOutput,update_monitor_output +UpdateMonitoringAlertRequest,update_monitoring_alert_request +UpdateMonitoringAlertResponse,update_monitoring_alert_response +UpdateMonitoringRequest,update_monitoring_request +UpdateMonitoringResponse,update_monitoring_response +UpdateMonitoringScheduleRequest,update_monitoring_schedule_request +UpdateMonitoringScheduleResponse,update_monitoring_schedule_response +UpdateMulticastGroupRequest,update_multicast_group_request +UpdateMultiplexProgramRequest,update_multiplex_program_request +UpdateMultiplexProgramResponse,update_multiplex_program_response +UpdateMultiplexRequest,update_multiplex_request +UpdateMultiplexResponse,update_multiplex_response +UpdateMyUserProfileRequest,update_my_user_profile_request +UpdateNFSFileShareInput,update_nfs_file_share_input +UpdateNFSFileShareOutput,update_nfs_file_share_output +UpdateNamedQueryInput,update_named_query_input +UpdateNamespaceRequest,update_namespace_request +UpdateNamespaceResponse,update_namespace_response +UpdateNetworkAnalyzerConfigurationRequest,update_network_analyzer_configuration_request +UpdateNetworkConfigurationInput,update_network_configuration_input +UpdateNetworkProfileRequest,update_network_profile_request +UpdateNetworkProfileResult,update_network_profile_result +UpdateNetworkResourceMetadataRequest,update_network_resource_metadata_request +UpdateNetworkResourceMetadataResponse,update_network_resource_metadata_response +UpdateNetworkSettingsRequest,update_network_settings_request +UpdateNetworkSettingsResponse,update_network_settings_response +UpdateNetworkSitePlanRequest,update_network_site_plan_request +UpdateNetworkSiteRequest,update_network_site_request +UpdateNetworkSiteResponse,update_network_site_response +UpdateNodeInput,update_node_input +UpdateNodegroupConfigRequest,update_nodegroup_config_request +UpdateNodegroupConfigResponse,update_nodegroup_config_response +UpdateNodegroupVersionRequest,update_nodegroup_version_request +UpdateNodegroupVersionResponse,update_nodegroup_version_response +UpdateNotebookInput,update_notebook_input +UpdateNotebookInstanceInput,update_notebook_instance_input +UpdateNotebookInstanceLifecycleConfigInput,update_notebook_instance_lifecycle_config_input +UpdateNotebookMetadataInput,update_notebook_metadata_input +UpdateNotificationConfigurationInput,update_notification_configuration_input +UpdateNotificationRequest,update_notification_request +UpdateNotificationRuleRequest,update_notification_rule_request +UpdateNotificationSettingsRequest,update_notification_settings_request +UpdateNumberOfDomainControllersRequest,update_number_of_domain_controllers_request +UpdateObjectAttributes,update_object_attributes +UpdateObjectAttributesRequest,update_object_attributes_request +UpdateObjectAttributesResponse,update_object_attributes_response +UpdateOntapVolumeConfiguration,update_ontap_volume_configuration +UpdateOpenIDConnectProviderThumbprintRequest,update_open_id_connect_provider_thumbprint_request +UpdateOpenZFSVolumeConfiguration,update_open_zfs_volume_configuration +UpdateOpsItemRequest,update_ops_item_request +UpdateOpsMetadataRequest,update_ops_metadata_request +UpdateOpsMetadataResult,update_ops_metadata_result +UpdateOrgEc2DeepInspectionConfigurationRequest,update_org_ec2_deep_inspection_configuration_request +UpdateOrganizationConfigurationRequest,update_organization_configuration_request +UpdateOrganizationConfigurationResponse,update_organization_configuration_response +UpdateOrganizationalUnitRequest,update_organizational_unit_request +UpdateOrganizationalUnitResponse,update_organizational_unit_response +UpdateOriginAccessControlRequest,update_origin_access_control_request +UpdateOriginAccessControlResult,update_origin_access_control_result +UpdateOriginEndpointRequest,update_origin_endpoint_request +UpdateOriginEndpointResponse,update_origin_endpoint_response +UpdateOriginRequestPolicyRequest,update_origin_request_policy_request +UpdateOriginRequestPolicyResult,update_origin_request_policy_result +UpdateOutpostInput,update_outpost_input +UpdateOutpostOutput,update_outpost_output +UpdateOutpostResolverRequest,update_outpost_resolver_request +UpdateOutpostResolverResponse,update_outpost_resolver_response +UpdatePackageConfigurationRequest,update_package_configuration_request +UpdatePackageRequest,update_package_request +UpdatePackageResponse,update_package_response +UpdatePackageVersionRequest,update_package_version_request +UpdatePackageVersionsStatusRequest,update_package_versions_status_request +UpdatePackageVersionsStatusResult,update_package_versions_status_result +UpdatePackagingGroupRequest,update_packaging_group_request +UpdatePackagingGroupResponse,update_packaging_group_response +UpdateParallelDataRequest,update_parallel_data_request +UpdateParallelDataResponse,update_parallel_data_response +UpdateParam,update_param +UpdateParameterGroupRequest,update_parameter_group_request +UpdateParameterGroupResponse,update_parameter_group_response +UpdateParticipantRoleConfigRequest,update_participant_role_config_request +UpdatePartitionRequest,update_partition_request +UpdatePartnerAccountRequest,update_partner_account_request +UpdatePartnerStatusInputMessage,update_partner_status_input_message +UpdatePatchBaselineRequest,update_patch_baseline_request +UpdatePatchBaselineResult,update_patch_baseline_result +UpdatePermissionGroupRequest,update_permission_group_request +UpdatePermissionGroupResponse,update_permission_group_response +UpdatePermissionSetRequest,update_permission_set_request +UpdatePermissionsRequest,update_permissions_request +UpdatePermissionsResponse,update_permissions_response +UpdatePhoneNumberRequest,update_phone_number_request +UpdatePhoneNumberRequestItem,update_phone_number_request_item +UpdatePhoneNumberRequestItems,update_phone_number_request_items +UpdatePhoneNumberResponse,update_phone_number_response +UpdatePhoneNumberResult,update_phone_number_result +UpdatePhoneNumberSettingsRequest,update_phone_number_settings_request +UpdatePipeRequest,update_pipe_request +UpdatePipeResponse,update_pipe_response +UpdatePipeSourceActiveMQBrokerParameters,update_pipe_source_active_mq_broker_parameters +UpdatePipeSourceDynamoDBStreamParameters,update_pipe_source_dynamo_db_stream_parameters +UpdatePipeSourceKinesisStreamParameters,update_pipe_source_kinesis_stream_parameters +UpdatePipeSourceManagedStreamingKafkaParameters,update_pipe_source_managed_streaming_kafka_parameters +UpdatePipeSourceParameters,update_pipe_source_parameters +UpdatePipeSourceRabbitMQBrokerParameters,update_pipe_source_rabbit_mq_broker_parameters +UpdatePipeSourceSelfManagedKafkaParameters,update_pipe_source_self_managed_kafka_parameters +UpdatePipeSourceSqsQueueParameters,update_pipe_source_sqs_queue_parameters +UpdatePipelineExecutionRequest,update_pipeline_execution_request +UpdatePipelineExecutionResponse,update_pipeline_execution_response +UpdatePipelineInput,update_pipeline_input +UpdatePipelineNotificationsRequest,update_pipeline_notifications_request +UpdatePipelineNotificationsResponse,update_pipeline_notifications_response +UpdatePipelineOutput,update_pipeline_output +UpdatePipelineRequest,update_pipeline_request +UpdatePipelineResponse,update_pipeline_response +UpdatePipelineStatusRequest,update_pipeline_status_request +UpdatePipelineStatusResponse,update_pipeline_status_response +UpdatePlaceIndexRequest,update_place_index_request +UpdatePlaceIndexResponse,update_place_index_response +UpdatePlacementRequest,update_placement_request +UpdatePolicy,update_policy +UpdatePolicyInput,update_policy_input +UpdatePolicyOutput,update_policy_output +UpdatePolicyRequest,update_policy_request +UpdatePolicyResponse,update_policy_response +UpdatePolicyStoreInput,update_policy_store_input +UpdatePolicyStoreOutput,update_policy_store_output +UpdatePolicyTemplateInput,update_policy_template_input +UpdatePolicyTemplateOutput,update_policy_template_output +UpdatePoolRequest,update_pool_request +UpdatePoolResult,update_pool_result +UpdatePortalRequest,update_portal_request +UpdatePortalResponse,update_portal_response +UpdatePortfolioInput,update_portfolio_input +UpdatePortfolioOutput,update_portfolio_output +UpdatePortfolioShareInput,update_portfolio_share_input +UpdatePortfolioShareOutput,update_portfolio_share_output +UpdatePositionRequest,update_position_request +UpdatePreparedStatementInput,update_prepared_statement_input +UpdatePresetRequest,update_preset_request +UpdatePresetResponse,update_preset_response +UpdatePricingPlanInput,update_pricing_plan_input +UpdatePricingPlanOutput,update_pricing_plan_output +UpdatePricingPlanRequest,update_pricing_plan_request +UpdatePricingPlanResponse,update_pricing_plan_response +UpdatePricingRuleInput,update_pricing_rule_input +UpdatePricingRuleOutput,update_pricing_rule_output +UpdatePrimaryEmailAddressRequest,update_primary_email_address_request +UpdatePrimaryRegionRequest,update_primary_region_request +UpdatePrivateDnsNamespaceRequest,update_private_dns_namespace_request +UpdatePrivateDnsNamespaceResponse,update_private_dns_namespace_response +UpdateProactiveJoin,update_proactive_join +UpdateProblemRequest,update_problem_request +UpdateProductInput,update_product_input +UpdateProductOutput,update_product_output +UpdateProfileInput,update_profile_input +UpdateProfileJobRequest,update_profile_job_request +UpdateProfileJobResponse,update_profile_job_response +UpdateProfileOutput,update_profile_output +UpdateProfileRequest,update_profile_request +UpdateProfileResponse,update_profile_response +UpdateProfilingGroupRequest,update_profiling_group_request +UpdateProfilingGroupResponse,update_profiling_group_response +UpdateProgramRequest,update_program_request +UpdateProgramResponse,update_program_response +UpdateProgramScheduleConfiguration,update_program_schedule_configuration +UpdateProgramTransition,update_program_transition +UpdateProjectDataDeliveryRequest,update_project_data_delivery_request +UpdateProjectDataDeliveryResponse,update_project_data_delivery_response +UpdateProjectInput,update_project_input +UpdateProjectOutput,update_project_output +UpdateProjectRequest,update_project_request +UpdateProjectResponse,update_project_response +UpdateProjectResult,update_project_result +UpdateProjectVisibilityInput,update_project_visibility_input +UpdateProjectVisibilityOutput,update_project_visibility_output +UpdatePromptRequest,update_prompt_request +UpdatePromptResponse,update_prompt_response +UpdateProtectedQueryInput,update_protected_query_input +UpdateProtectedQueryOutput,update_protected_query_output +UpdateProtectionGroupRequest,update_protection_group_request +UpdateProvisionedModelThroughputRequest,update_provisioned_model_throughput_request +UpdateProvisionedProductInput,update_provisioned_product_input +UpdateProvisionedProductOutput,update_provisioned_product_output +UpdateProvisionedProductPropertiesInput,update_provisioned_product_properties_input +UpdateProvisionedProductPropertiesOutput,update_provisioned_product_properties_output +UpdateProvisioningArtifactInput,update_provisioning_artifact_input +UpdateProvisioningArtifactOutput,update_provisioning_artifact_output +UpdateProvisioningParameter,update_provisioning_parameter +UpdateProvisioningPreferences,update_provisioning_preferences +UpdateProvisioningTemplateRequest,update_provisioning_template_request +UpdateProxySessionRequest,update_proxy_session_request +UpdateProxySessionResponse,update_proxy_session_response +UpdatePublicDnsNamespaceRequest,update_public_dns_namespace_request +UpdatePublicDnsNamespaceResponse,update_public_dns_namespace_response +UpdatePublicKeyRequest,update_public_key_request +UpdatePublicKeyResult,update_public_key_result +UpdatePublicSharingSettingsRequest,update_public_sharing_settings_request +UpdatePublicSharingSettingsResponse,update_public_sharing_settings_response +UpdatePublishingDestinationRequest,update_publishing_destination_request +UpdatePullRequestApprovalRuleContentInput,update_pull_request_approval_rule_content_input +UpdatePullRequestApprovalRuleContentOutput,update_pull_request_approval_rule_content_output +UpdatePullRequestApprovalStateInput,update_pull_request_approval_state_input +UpdatePullRequestDescriptionInput,update_pull_request_description_input +UpdatePullRequestDescriptionOutput,update_pull_request_description_output +UpdatePullRequestStatusInput,update_pull_request_status_input +UpdatePullRequestStatusOutput,update_pull_request_status_output +UpdatePullRequestTitleInput,update_pull_request_title_input +UpdatePullRequestTitleOutput,update_pull_request_title_output +UpdatePushTemplateRequest,update_push_template_request +UpdatePushTemplateResponse,update_push_template_response +UpdateQualificationTypeRequest,update_qualification_type_request +UpdateQualificationTypeResponse,update_qualification_type_response +UpdateQuerySuggestionsBlockListRequest,update_query_suggestions_block_list_request +UpdateQuerySuggestionsConfigRequest,update_query_suggestions_config_request +UpdateQueueHoursOfOperationRequest,update_queue_hours_of_operation_request +UpdateQueueMaxContactsRequest,update_queue_max_contacts_request +UpdateQueueNameRequest,update_queue_name_request +UpdateQueueOutboundCallerConfigRequest,update_queue_outbound_caller_config_request +UpdateQueueRequest,update_queue_request +UpdateQueueResponse,update_queue_response +UpdateQueueStatusRequest,update_queue_status_request +UpdateQuickConnectConfigRequest,update_quick_connect_config_request +UpdateQuickConnectNameRequest,update_quick_connect_name_request +UpdateRadiusRequest,update_radius_request +UpdateRateBasedRuleRequest,update_rate_based_rule_request +UpdateRateBasedRuleResponse,update_rate_based_rule_response +UpdateRdsDbInstanceRequest,update_rds_db_instance_request +UpdateReadinessCheckRequest,update_readiness_check_request +UpdateReadinessCheckResponse,update_readiness_check_response +UpdateRealtimeLogConfigRequest,update_realtime_log_config_request +UpdateRealtimeLogConfigResult,update_realtime_log_config_result +UpdateReceiptRuleRequest,update_receipt_rule_request +UpdateRecipeJobRequest,update_recipe_job_request +UpdateRecipeJobResponse,update_recipe_job_response +UpdateRecipeRequest,update_recipe_request +UpdateRecipeResponse,update_recipe_response +UpdateRecommendationStatusItem,update_recommendation_status_item +UpdateRecommendationStatusRequestEntry,update_recommendation_status_request_entry +UpdateRecommenderConfiguration,update_recommender_configuration +UpdateRecommenderConfigurationRequest,update_recommender_configuration_request +UpdateRecommenderConfigurationResponse,update_recommender_configuration_response +UpdateRecommenderConfigurationShape,update_recommender_configuration_shape +UpdateRecommenderRequest,update_recommender_request +UpdateRecommenderResponse,update_recommender_response +UpdateRecordsRequest,update_records_request +UpdateRecordsResponse,update_records_response +UpdateRecoveryGroupRequest,update_recovery_group_request +UpdateRecoveryGroupResponse,update_recovery_group_response +UpdateRecoveryPointLifecycleInput,update_recovery_point_lifecycle_input +UpdateRecoveryPointLifecycleOutput,update_recovery_point_lifecycle_output +UpdateRefreshScheduleRequest,update_refresh_schedule_request +UpdateRefreshScheduleResponse,update_refresh_schedule_response +UpdateRegexMatchSetRequest,update_regex_match_set_request +UpdateRegexMatchSetResponse,update_regex_match_set_response +UpdateRegexPatternSetRequest,update_regex_pattern_set_request +UpdateRegexPatternSetResponse,update_regex_pattern_set_response +UpdateRegionSettingsInput,update_region_settings_input +UpdateRegistryInput,update_registry_input +UpdateRegistryRequest,update_registry_request +UpdateRegistryResponse,update_registry_response +UpdateRelatedItemsInput,update_related_items_input +UpdateRelationalDatabaseParametersRequest,update_relational_database_parameters_request +UpdateRelationalDatabaseParametersResult,update_relational_database_parameters_result +UpdateRelationalDatabaseRequest,update_relational_database_request +UpdateRelationalDatabaseResult,update_relational_database_result +UpdateReplicationConfigurationRequest,update_replication_configuration_request +UpdateReplicationConfigurationTemplateRequest,update_replication_configuration_template_request +UpdateReplicationGroupMemberAction,update_replication_group_member_action +UpdateReplicationJobRequest,update_replication_job_request +UpdateReplicationSetInput,update_replication_set_input +UpdateReportDefinitionRequest,update_report_definition_request +UpdateReportDefinitionResult,update_report_definition_result +UpdateReportGroupInput,update_report_group_input +UpdateReportGroupOutput,update_report_group_output +UpdateReportPlanInput,update_report_plan_input +UpdateReportPlanOutput,update_report_plan_output +UpdateRepositoryDescriptionInput,update_repository_description_input +UpdateRepositoryNameInput,update_repository_name_input +UpdateRepositoryRequest,update_repository_request +UpdateRepositoryResult,update_repository_result +UpdateRequestValidatorRequest,update_request_validator_request +UpdateRequireCheckIn,update_require_check_in +UpdateRescoreExecutionPlanRequest,update_rescore_execution_plan_request +UpdateReservationRequest,update_reservation_request +UpdateReservationResponse,update_reservation_response +UpdateResiliencyPolicyRequest,update_resiliency_policy_request +UpdateResiliencyPolicyResponse,update_resiliency_policy_response +UpdateResolverConfigRequest,update_resolver_config_request +UpdateResolverConfigResponse,update_resolver_config_response +UpdateResolverDnssecConfigRequest,update_resolver_dnssec_config_request +UpdateResolverDnssecConfigResponse,update_resolver_dnssec_config_response +UpdateResolverEndpointRequest,update_resolver_endpoint_request +UpdateResolverEndpointResponse,update_resolver_endpoint_response +UpdateResolverRequest,update_resolver_request +UpdateResolverResponse,update_resolver_response +UpdateResolverRuleRequest,update_resolver_rule_request +UpdateResolverRuleResponse,update_resolver_rule_response +UpdateResourceCollectionFilter,update_resource_collection_filter +UpdateResourceCollectionRequest,update_resource_collection_request +UpdateResourceDataSyncRequest,update_resource_data_sync_request +UpdateResourceDefinitionRequest,update_resource_definition_request +UpdateResourceEventConfigurationRequest,update_resource_event_configuration_request +UpdateResourceInput,update_resource_input +UpdateResourceOutput,update_resource_output +UpdateResourcePolicyRequest,update_resource_policy_request +UpdateResourcePolicyResponse,update_resource_policy_response +UpdateResourcePositionRequest,update_resource_position_request +UpdateResourceProfileDetectionsRequest,update_resource_profile_detections_request +UpdateResourceProfileRequest,update_resource_profile_request +UpdateResourceRequest,update_resource_request +UpdateResourceServerRequest,update_resource_server_request +UpdateResourceServerResponse,update_resource_server_response +UpdateResourceSetRequest,update_resource_set_request +UpdateResourceSetResponse,update_resource_set_response +UpdateResourceShareRequest,update_resource_share_request +UpdateResourceShareResponse,update_resource_share_response +UpdateResponseHeadersPolicyRequest,update_response_headers_policy_request +UpdateResponseHeadersPolicyResult,update_response_headers_policy_result +UpdateResponsePlanInput,update_response_plan_input +UpdateRestApiRequest,update_rest_api_request +UpdateResult,update_result +UpdateRetrainingSchedulerRequest,update_retraining_scheduler_request +UpdateRevealConfigurationRequest,update_reveal_configuration_request +UpdateRevealConfigurationResponse,update_reveal_configuration_response +UpdateRevisionRequest,update_revision_request +UpdateRevisionResponse,update_revision_response +UpdateRobotApplicationRequest,update_robot_application_request +UpdateRobotApplicationResponse,update_robot_application_response +UpdateRoleAliasRequest,update_role_alias_request +UpdateRoleAliasResponse,update_role_alias_response +UpdateRoleDescriptionRequest,update_role_description_request +UpdateRoleDescriptionResponse,update_role_description_response +UpdateRoleRequest,update_role_request +UpdateRoomMembershipRequest,update_room_membership_request +UpdateRoomMembershipResponse,update_room_membership_response +UpdateRoomRequest,update_room_request +UpdateRoomResponse,update_room_response +UpdateRotationRequest,update_rotation_request +UpdateRouteCalculatorRequest,update_route_calculator_request +UpdateRouteCalculatorResponse,update_route_calculator_response +UpdateRouteInput,update_route_input +UpdateRouteOutput,update_route_output +UpdateRouteRequest,update_route_request +UpdateRouteResponse,update_route_response +UpdateRouteResponseRequest,update_route_response_request +UpdateRouteResponseResponse,update_route_response_response +UpdateRouteResult,update_route_result +UpdateRoutingControlRequest,update_routing_control_request +UpdateRoutingControlResponse,update_routing_control_response +UpdateRoutingControlStateEntries,update_routing_control_state_entries +UpdateRoutingControlStateEntry,update_routing_control_state_entry +UpdateRoutingControlStateRequest,update_routing_control_state_request +UpdateRoutingControlStatesRequest,update_routing_control_states_request +UpdateRoutingProfileAgentAvailabilityTimerRequest,update_routing_profile_agent_availability_timer_request +UpdateRoutingProfileConcurrencyRequest,update_routing_profile_concurrency_request +UpdateRoutingProfileDefaultOutboundQueueRequest,update_routing_profile_default_outbound_queue_request +UpdateRoutingProfileNameRequest,update_routing_profile_name_request +UpdateRoutingProfileQueuesRequest,update_routing_profile_queues_request +UpdateRowData,update_row_data +UpdateRuleGroupRequest,update_rule_group_request +UpdateRuleGroupResponse,update_rule_group_response +UpdateRuleMetadataRequest,update_rule_metadata_request +UpdateRuleRequest,update_rule_request +UpdateRuleResponse,update_rule_response +UpdateRuleVersionRequest,update_rule_version_request +UpdateRuleVersionResult,update_rule_version_result +UpdateRulesOfIpGroupRequest,update_rules_of_ip_group_request +UpdateRulesetRequest,update_ruleset_request +UpdateRulesetResponse,update_ruleset_response +UpdateRumMetricDefinitionRequest,update_rum_metric_definition_request +UpdateRunGroupRequest,update_run_group_request +UpdateRuntimeConfigurationInput,update_runtime_configuration_input +UpdateRuntimeConfigurationOutput,update_runtime_configuration_output +UpdateRuntimeOn,update_runtime_on +UpdateS3ResourcesRequest,update_s3_resources_request +UpdateS3ResourcesResult,update_s3_resources_result +UpdateSAMLProviderRequest,update_saml_provider_request +UpdateSAMLProviderResponse,update_saml_provider_response +UpdateSMBFileShareInput,update_smb_file_share_input +UpdateSMBFileShareOutput,update_smb_file_share_output +UpdateSMBFileShareVisibilityInput,update_smb_file_share_visibility_input +UpdateSMBFileShareVisibilityOutput,update_smb_file_share_visibility_output +UpdateSMBLocalGroupsInput,update_smb_local_groups_input +UpdateSMBLocalGroupsOutput,update_smb_local_groups_output +UpdateSMBSecurityStrategyInput,update_smb_security_strategy_input +UpdateSMBSecurityStrategyOutput,update_smb_security_strategy_output +UpdateSSHPublicKeyRequest,update_ssh_public_key_request +UpdateSafetyRuleRequest,update_safety_rule_request +UpdateSafetyRuleResponse,update_safety_rule_response +UpdateSamplingRuleRequest,update_sampling_rule_request +UpdateSamplingRuleResult,update_sampling_rule_result +UpdateScalingParametersRequest,update_scaling_parameters_request +UpdateScalingParametersResponse,update_scaling_parameters_response +UpdateScalingPlanRequest,update_scaling_plan_request +UpdateSceneRequest,update_scene_request +UpdateSceneResponse,update_scene_response +UpdateScheduleInput,update_schedule_input +UpdateScheduleOutput,update_schedule_output +UpdateScheduleRequest,update_schedule_request +UpdateScheduleResponse,update_schedule_response +UpdateScheduledActionRequest,update_scheduled_action_request +UpdateScheduledActionResponse,update_scheduled_action_response +UpdateScheduledAuditRequest,update_scheduled_audit_request +UpdateScheduledAuditResponse,update_scheduled_audit_response +UpdateScheduledQueryRequest,update_scheduled_query_request +UpdateSchedulingPolicyRequest,update_scheduling_policy_request +UpdateSchemaInput,update_schema_input +UpdateSchemaRequest,update_schema_request +UpdateSchemaResponse,update_schema_response +UpdateScriptInput,update_script_input +UpdateScriptOutput,update_script_output +UpdateSecretRequest,update_secret_request +UpdateSecretResponse,update_secret_response +UpdateSecretVersionStageRequest,update_secret_version_stage_request +UpdateSecretVersionStageResponse,update_secret_version_stage_response +UpdateSecurityConfigRequest,update_security_config_request +UpdateSecurityConfigResponse,update_security_config_response +UpdateSecurityGroupForDirectoryControllers,update_security_group_for_directory_controllers +UpdateSecurityGroupRuleDescriptionsEgressRequest,update_security_group_rule_descriptions_egress_request +UpdateSecurityGroupRuleDescriptionsEgressResult,update_security_group_rule_descriptions_egress_result +UpdateSecurityGroupRuleDescriptionsIngressRequest,update_security_group_rule_descriptions_ingress_request +UpdateSecurityGroupRuleDescriptionsIngressResult,update_security_group_rule_descriptions_ingress_result +UpdateSecurityHubConfigurationRequest,update_security_hub_configuration_request +UpdateSecurityPolicyRequest,update_security_policy_request +UpdateSecurityPolicyResponse,update_security_policy_response +UpdateSecurityProfileRequest,update_security_profile_request +UpdateSecurityProfileResponse,update_security_profile_response +UpdateSecurityRequest,update_security_request +UpdateSecurityResponse,update_security_response +UpdateSegmentRequest,update_segment_request +UpdateSegmentResponse,update_segment_response +UpdateSensitivityInspectionTemplateRequest,update_sensitivity_inspection_template_request +UpdateServerCertificateRequest,update_server_certificate_request +UpdateServerConfigRequest,update_server_config_request +UpdateServerEngineAttributesRequest,update_server_engine_attributes_request +UpdateServerEngineAttributesResponse,update_server_engine_attributes_response +UpdateServerRequest,update_server_request +UpdateServerResponse,update_server_response +UpdateServiceAccessPoliciesRequest,update_service_access_policies_request +UpdateServiceAccessPoliciesResponse,update_service_access_policies_response +UpdateServiceActionInput,update_service_action_input +UpdateServiceActionOutput,update_service_action_output +UpdateServiceInput,update_service_input +UpdateServiceInstanceInput,update_service_instance_input +UpdateServiceInstanceOutput,update_service_instance_output +UpdateServiceIntegrationConfig,update_service_integration_config +UpdateServiceIntegrationRequest,update_service_integration_request +UpdateServiceNetworkRequest,update_service_network_request +UpdateServiceNetworkResponse,update_service_network_response +UpdateServiceNetworkVpcAssociationRequest,update_service_network_vpc_association_request +UpdateServiceNetworkVpcAssociationResponse,update_service_network_vpc_association_response +UpdateServiceOutput,update_service_output +UpdateServicePipelineInput,update_service_pipeline_input +UpdateServicePipelineOutput,update_service_pipeline_output +UpdateServicePrimaryTaskSetRequest,update_service_primary_task_set_request +UpdateServicePrimaryTaskSetResponse,update_service_primary_task_set_response +UpdateServiceRequest,update_service_request +UpdateServiceResponse,update_service_response +UpdateServiceSettingRequest,update_service_setting_request +UpdateServiceSettingsRequest,update_service_settings_request +UpdateServiceSettingsResponse,update_service_settings_response +UpdateServiceSpecificCredentialRequest,update_service_specific_credential_request +UpdateServiceSyncBlockerInput,update_service_sync_blocker_input +UpdateServiceSyncBlockerOutput,update_service_sync_blocker_output +UpdateServiceSyncConfigInput,update_service_sync_config_input +UpdateServiceSyncConfigOutput,update_service_sync_config_output +UpdateServiceTemplateInput,update_service_template_input +UpdateServiceTemplateOutput,update_service_template_output +UpdateServiceTemplateVersionInput,update_service_template_version_input +UpdateServiceTemplateVersionOutput,update_service_template_version_output +UpdateSettings,update_settings +UpdateSettingsRequest,update_settings_request +UpdateSettingsResponse,update_settings_response +UpdateSettingsResult,update_settings_result +UpdateShardCountInput,update_shard_count_input +UpdateShardCountOutput,update_shard_count_output +UpdateShareInvitationInput,update_share_invitation_input +UpdateShareInvitationOutput,update_share_invitation_output +UpdateSignalCatalogRequest,update_signal_catalog_request +UpdateSignalCatalogResponse,update_signal_catalog_response +UpdateSignalingChannelInput,update_signaling_channel_input +UpdateSignature,update_signature +UpdateSigningCertificateRequest,update_signing_certificate_request +UpdateSimulationApplicationRequest,update_simulation_application_request +UpdateSimulationApplicationResponse,update_simulation_application_response +UpdateSipMediaApplicationCallRequest,update_sip_media_application_call_request +UpdateSipMediaApplicationCallResponse,update_sip_media_application_call_response +UpdateSipMediaApplicationRequest,update_sip_media_application_request +UpdateSipMediaApplicationResponse,update_sip_media_application_response +UpdateSipRuleRequest,update_sip_rule_request +UpdateSipRuleResponse,update_sip_rule_response +UpdateSiteAddressInput,update_site_address_input +UpdateSiteAddressOutput,update_site_address_output +UpdateSiteInput,update_site_input +UpdateSiteOutput,update_site_output +UpdateSiteRackPhysicalPropertiesInput,update_site_rack_physical_properties_input +UpdateSiteRackPhysicalPropertiesOutput,update_site_rack_physical_properties_output +UpdateSiteRequest,update_site_request +UpdateSiteResponse,update_site_response +UpdateSizeConstraintSetRequest,update_size_constraint_set_request +UpdateSizeConstraintSetResponse,update_size_constraint_set_response +UpdateSkillGroupRequest,update_skill_group_request +UpdateSlackChannelConfigurationRequest,update_slack_channel_configuration_request +UpdateSlackChannelConfigurationResult,update_slack_channel_configuration_result +UpdateSlotRequest,update_slot_request +UpdateSlotResponse,update_slot_response +UpdateSlotTypeRequest,update_slot_type_request +UpdateSlotTypeResponse,update_slot_type_response +UpdateSmsChannelRequest,update_sms_channel_request +UpdateSmsChannelResponse,update_sms_channel_response +UpdateSmsTemplateRequest,update_sms_template_request +UpdateSmsTemplateResponse,update_sms_template_response +UpdateSnaplockConfiguration,update_snaplock_configuration +UpdateSnapshotRequest,update_snapshot_request +UpdateSnapshotResponse,update_snapshot_response +UpdateSnapshotResult,update_snapshot_result +UpdateSnapshotScheduleInput,update_snapshot_schedule_input +UpdateSnapshotScheduleOutput,update_snapshot_schedule_output +UpdateSolFunctionPackageInput,update_sol_function_package_input +UpdateSolFunctionPackageOutput,update_sol_function_package_output +UpdateSolNetworkInstanceInput,update_sol_network_instance_input +UpdateSolNetworkInstanceOutput,update_sol_network_instance_output +UpdateSolNetworkModify,update_sol_network_modify +UpdateSolNetworkPackageInput,update_sol_network_package_input +UpdateSolNetworkPackageOutput,update_sol_network_package_output +UpdateSource,update_source +UpdateSourceApiAssociationRequest,update_source_api_association_request +UpdateSourceApiAssociationResponse,update_source_api_association_response +UpdateSourceControlFromJobRequest,update_source_control_from_job_request +UpdateSourceControlFromJobResponse,update_source_control_from_job_response +UpdateSourceLocationRequest,update_source_location_request +UpdateSourceLocationResponse,update_source_location_response +UpdateSourceServerReplicationTypeRequest,update_source_server_replication_type_request +UpdateSpaceRequest,update_space_request +UpdateSpaceResponse,update_space_response +UpdateSqlInjectionMatchSetRequest,update_sql_injection_match_set_request +UpdateSqlInjectionMatchSetResponse,update_sql_injection_match_set_response +UpdateStackInput,update_stack_input +UpdateStackInstancesInput,update_stack_instances_input +UpdateStackInstancesOutput,update_stack_instances_output +UpdateStackOutput,update_stack_output +UpdateStackRequest,update_stack_request +UpdateStackResult,update_stack_result +UpdateStackSetInput,update_stack_set_input +UpdateStackSetOutput,update_stack_set_output +UpdateStageRequest,update_stage_request +UpdateStageResponse,update_stage_response +UpdateStageResult,update_stage_result +UpdateStandardsControlRequest,update_standards_control_request +UpdateStateMachineAliasInput,update_state_machine_alias_input +UpdateStateMachineAliasOutput,update_state_machine_alias_output +UpdateStateMachineInput,update_state_machine_input +UpdateStateMachineOutput,update_state_machine_output +UpdateStaticPolicyDefinition,update_static_policy_definition +UpdateStatus,update_status +UpdateStorageRequest,update_storage_request +UpdateStorageResponse,update_storage_response +UpdateStorageSystemRequest,update_storage_system_request +UpdateStorageVirtualMachineRequest,update_storage_virtual_machine_request +UpdateStorageVirtualMachineResponse,update_storage_virtual_machine_response +UpdateStreamInput,update_stream_input +UpdateStreamModeInput,update_stream_mode_input +UpdateStreamProcessorRequest,update_stream_processor_request +UpdateStreamRequest,update_stream_request +UpdateStreamResponse,update_stream_response +UpdateStreamingDistributionRequest,update_streaming_distribution_request +UpdateStreamingDistributionResult,update_streaming_distribution_result +UpdateStreamingImageRequest,update_streaming_image_request +UpdateStreamingImageResponse,update_streaming_image_response +UpdateStudioComponentRequest,update_studio_component_request +UpdateStudioComponentResponse,update_studio_component_response +UpdateStudioInput,update_studio_input +UpdateStudioRequest,update_studio_request +UpdateStudioResponse,update_studio_response +UpdateStudioSessionMappingInput,update_studio_session_mapping_input +UpdateSubnetChangeProtectionRequest,update_subnet_change_protection_request +UpdateSubnetChangeProtectionResponse,update_subnet_change_protection_response +UpdateSubnetGroupRequest,update_subnet_group_request +UpdateSubnetGroupResponse,update_subnet_group_response +UpdateSubscriberNotificationRequest,update_subscriber_notification_request +UpdateSubscriberNotificationResponse,update_subscriber_notification_response +UpdateSubscriberRequest,update_subscriber_request +UpdateSubscriberResponse,update_subscriber_response +UpdateSubscriptionDefinitionRequest,update_subscription_definition_request +UpdateSubscriptionRequest,update_subscription_request +UpdateSubscriptionsToEventBridgeMessage,update_subscriptions_to_event_bridge_message +UpdateSubscriptionsToEventBridgeResponse,update_subscriptions_to_event_bridge_response +UpdateSuiteDefinitionRequest,update_suite_definition_request +UpdateSuiteDefinitionResponse,update_suite_definition_response +UpdateSvmActiveDirectoryConfiguration,update_svm_active_directory_configuration +UpdateSystemTemplateRequest,update_system_template_request +UpdateSystemTemplateResponse,update_system_template_response +UpdateTLSInspectionConfigurationRequest,update_tls_inspection_configuration_request +UpdateTLSInspectionConfigurationResponse,update_tls_inspection_configuration_response +UpdateTableInput,update_table_input +UpdateTableObjectsRequest,update_table_objects_request +UpdateTableOutput,update_table_output +UpdateTableReplicaAutoScalingInput,update_table_replica_auto_scaling_input +UpdateTableReplicaAutoScalingOutput,update_table_replica_auto_scaling_output +UpdateTableRequest,update_table_request +UpdateTableResponse,update_table_response +UpdateTableStorageOptimizerRequest,update_table_storage_optimizer_request +UpdateTableStorageOptimizerResponse,update_table_storage_optimizer_response +UpdateTagCollectionFilter,update_tag_collection_filter +UpdateTagOptionInput,update_tag_option_input +UpdateTagOptionOutput,update_tag_option_output +UpdateTagsForDomainRequest,update_tags_for_domain_request +UpdateTagsForResourceMessage,update_tags_for_resource_message +UpdateTaintsPayload,update_taints_payload +UpdateTarget,update_target +UpdateTargetGroupRequest,update_target_group_request +UpdateTargetGroupResponse,update_target_group_response +UpdateTargets,update_targets +UpdateTargetsArchitecture,update_targets_architecture +UpdateTargetsOperatingSystem,update_targets_operating_system +UpdateTaskExecutionRequest,update_task_execution_request +UpdateTaskProtectionRequest,update_task_protection_request +UpdateTaskProtectionResponse,update_task_protection_response +UpdateTaskRequest,update_task_request +UpdateTaskSetRequest,update_task_set_request +UpdateTaskSetResponse,update_task_set_response +UpdateTaskTemplateRequest,update_task_template_request +UpdateTaskTemplateResponse,update_task_template_response +UpdateTeamMemberRequest,update_team_member_request +UpdateTeamMemberResult,update_team_member_result +UpdateTemplateActiveVersionRequest,update_template_active_version_request +UpdateTemplateActiveVersionResponse,update_template_active_version_response +UpdateTemplateAliasRequest,update_template_alias_request +UpdateTemplateAliasResponse,update_template_alias_response +UpdateTemplateGroupAccessControlEntryRequest,update_template_group_access_control_entry_request +UpdateTemplatePermissionsRequest,update_template_permissions_request +UpdateTemplatePermissionsResponse,update_template_permissions_response +UpdateTemplateRequest,update_template_request +UpdateTemplateResponse,update_template_response +UpdateTemplateSyncConfigInput,update_template_sync_config_input +UpdateTemplateSyncConfigOutput,update_template_sync_config_output +UpdateTerminationProtectionInput,update_termination_protection_input +UpdateTerminationProtectionOutput,update_termination_protection_output +UpdateTestGridProjectRequest,update_test_grid_project_request +UpdateTestGridProjectResult,update_test_grid_project_result +UpdateTestSetRequest,update_test_set_request +UpdateTestSetResponse,update_test_set_response +UpdateThemeAliasRequest,update_theme_alias_request +UpdateThemeAliasResponse,update_theme_alias_response +UpdateThemeData,update_theme_data +UpdateThemePermissionsRequest,update_theme_permissions_request +UpdateThemePermissionsResponse,update_theme_permissions_response +UpdateThemeRequest,update_theme_request +UpdateThemeResponse,update_theme_response +UpdateThesaurusRequest,update_thesaurus_request +UpdateThingGroupRequest,update_thing_group_request +UpdateThingGroupResponse,update_thing_group_response +UpdateThingGroupsForThingRequest,update_thing_groups_for_thing_request +UpdateThingRequest,update_thing_request +UpdateThingRuntimeConfigurationRequest,update_thing_runtime_configuration_request +UpdateThingShadowRequest,update_thing_shadow_request +UpdateThingShadowResponse,update_thing_shadow_response +UpdateThreatIntelSetRequest,update_threat_intel_set_request +UpdateTieringInput,update_tiering_input +UpdateTime,update_time +UpdateTimeToLiveInput,update_time_to_live_input +UpdateTimeToLiveOutput,update_time_to_live_output +UpdateTimelineEventInput,update_timeline_event_input +UpdateToken,update_token +UpdateTopicPermissionsRequest,update_topic_permissions_request +UpdateTopicPermissionsResponse,update_topic_permissions_response +UpdateTopicRefreshScheduleRequest,update_topic_refresh_schedule_request +UpdateTopicRefreshScheduleResponse,update_topic_refresh_schedule_response +UpdateTopicRequest,update_topic_request +UpdateTopicResponse,update_topic_response +UpdateTopicRuleDestinationRequest,update_topic_rule_destination_request +UpdateTrackerRequest,update_tracker_request +UpdateTrackerResponse,update_tracker_response +UpdateTrafficDistributionRequest,update_traffic_distribution_request +UpdateTrafficPolicyCommentRequest,update_traffic_policy_comment_request +UpdateTrafficPolicyCommentResponse,update_traffic_policy_comment_response +UpdateTrafficPolicyInstanceRequest,update_traffic_policy_instance_request +UpdateTrafficPolicyInstanceResponse,update_traffic_policy_instance_response +UpdateTrailRequest,update_trail_request +UpdateTrailResponse,update_trail_response +UpdateTrainingJobRequest,update_training_job_request +UpdateTrainingJobResponse,update_training_job_response +UpdateTrialComponentRequest,update_trial_component_request +UpdateTrialComponentResponse,update_trial_component_response +UpdateTrialRequest,update_trial_request +UpdateTrialResponse,update_trial_response +UpdateTriggerRequest,update_trigger_request +UpdateTriggerResponse,update_trigger_response +UpdateTrustAnchorRequest,update_trust_anchor_request +UpdateTrustRequest,update_trust_request +UpdateTrustResult,update_trust_result +UpdateTrustStoreRequest,update_trust_store_request +UpdateTrustStoreResponse,update_trust_store_response +UpdateType,update_type +UpdateTypeRequest,update_type_request +UpdateTypeResponse,update_type_response +UpdateTypedLinkFacetRequest,update_typed_link_facet_request +UpdateUploadRequest,update_upload_request +UpdateUploadResult,update_upload_result +UpdateUsageLimitRequest,update_usage_limit_request +UpdateUsageLimitResponse,update_usage_limit_response +UpdateUsagePlanRequest,update_usage_plan_request +UpdateUsageRequest,update_usage_request +UpdateUserAccessLoggingSettingsRequest,update_user_access_logging_settings_request +UpdateUserAccessLoggingSettingsResponse,update_user_access_logging_settings_response +UpdateUserAttributesRequest,update_user_attributes_request +UpdateUserAttributesResponse,update_user_attributes_response +UpdateUserDefinedFunctionRequest,update_user_defined_function_request +UpdateUserHierarchyGroupNameRequest,update_user_hierarchy_group_name_request +UpdateUserHierarchyRequest,update_user_hierarchy_request +UpdateUserHierarchyStructureRequest,update_user_hierarchy_structure_request +UpdateUserIdentityInfoRequest,update_user_identity_info_request +UpdateUserPhoneConfigRequest,update_user_phone_config_request +UpdateUserPoolClientRequest,update_user_pool_client_request +UpdateUserPoolClientResponse,update_user_pool_client_response +UpdateUserPoolDomainRequest,update_user_pool_domain_request +UpdateUserPoolDomainResponse,update_user_pool_domain_response +UpdateUserPoolRequest,update_user_pool_request +UpdateUserProfileRequest,update_user_profile_request +UpdateUserProfileResponse,update_user_profile_response +UpdateUserProfileResult,update_user_profile_result +UpdateUserRequest,update_user_request +UpdateUserRequestItem,update_user_request_item +UpdateUserRequestItems,update_user_request_items +UpdateUserResponse,update_user_response +UpdateUserRoutingProfileRequest,update_user_routing_profile_request +UpdateUserSecurityProfilesRequest,update_user_security_profiles_request +UpdateUserSettingsRequest,update_user_settings_request +UpdateUserSettingsResponse,update_user_settings_response +UpdateVPCConnectionRequest,update_vpc_connection_request +UpdateVPCConnectionResponse,update_vpc_connection_response +UpdateVPCEConfigurationRequest,update_vpce_configuration_request +UpdateVPCEConfigurationResult,update_vpce_configuration_result +UpdateVTLDeviceTypeInput,update_vtl_device_type_input +UpdateVTLDeviceTypeOutput,update_vtl_device_type_output +UpdateValue,update_value +UpdateVariableRequest,update_variable_request +UpdateVariantStoreRequest,update_variant_store_request +UpdateVariantStoreResponse,update_variant_store_response +UpdateVehicleError,update_vehicle_error +UpdateVehicleRequest,update_vehicle_request +UpdateVehicleRequestItem,update_vehicle_request_item +UpdateVehicleResponse,update_vehicle_response +UpdateVehicleResponseItem,update_vehicle_response_item +UpdateVersion,update_version +UpdateViewContentRequest,update_view_content_request +UpdateViewContentResponse,update_view_content_response +UpdateViewInput,update_view_input +UpdateViewMetadataRequest,update_view_metadata_request +UpdateViewOutput,update_view_output +UpdateVirtualGatewayInput,update_virtual_gateway_input +UpdateVirtualGatewayOutput,update_virtual_gateway_output +UpdateVirtualInterfaceAttributesRequest,update_virtual_interface_attributes_request +UpdateVirtualNodeInput,update_virtual_node_input +UpdateVirtualNodeOutput,update_virtual_node_output +UpdateVirtualRouterInput,update_virtual_router_input +UpdateVirtualRouterOutput,update_virtual_router_output +UpdateVirtualServiceInput,update_virtual_service_input +UpdateVirtualServiceOutput,update_virtual_service_output +UpdateVocabularyFilterRequest,update_vocabulary_filter_request +UpdateVocabularyFilterResponse,update_vocabulary_filter_response +UpdateVocabularyRequest,update_vocabulary_request +UpdateVocabularyResponse,update_vocabulary_response +UpdateVodSourceRequest,update_vod_source_request +UpdateVodSourceResponse,update_vod_source_response +UpdateVoiceChannelRequest,update_voice_channel_request +UpdateVoiceChannelResponse,update_voice_channel_response +UpdateVoiceConnectorGroupRequest,update_voice_connector_group_request +UpdateVoiceConnectorGroupResponse,update_voice_connector_group_response +UpdateVoiceConnectorRequest,update_voice_connector_request +UpdateVoiceConnectorResponse,update_voice_connector_response +UpdateVoiceProfileDomainRequest,update_voice_profile_domain_request +UpdateVoiceProfileDomainResponse,update_voice_profile_domain_response +UpdateVoiceProfileRequest,update_voice_profile_request +UpdateVoiceProfileResponse,update_voice_profile_response +UpdateVoiceTemplateRequest,update_voice_template_request +UpdateVoiceTemplateResponse,update_voice_template_response +UpdateVolumeRequest,update_volume_request +UpdateVolumeResponse,update_volume_response +UpdateVpcAttachmentRequest,update_vpc_attachment_request +UpdateVpcAttachmentResponse,update_vpc_attachment_response +UpdateVpcEndpointDetail,update_vpc_endpoint_detail +UpdateVpcEndpointRequest,update_vpc_endpoint_request +UpdateVpcEndpointResponse,update_vpc_endpoint_response +UpdateVpcIngressConnectionRequest,update_vpc_ingress_connection_request +UpdateVpcIngressConnectionResponse,update_vpc_ingress_connection_response +UpdateVpcLinkRequest,update_vpc_link_request +UpdateVpcLinkResponse,update_vpc_link_response +UpdateWatchlistRequest,update_watchlist_request +UpdateWatchlistResponse,update_watchlist_response +UpdateWaveRequest,update_wave_request +UpdateWebACLRequest,update_web_acl_request +UpdateWebACLResponse,update_web_acl_response +UpdateWebhookInput,update_webhook_input +UpdateWebhookOutput,update_webhook_output +UpdateWebhookRequest,update_webhook_request +UpdateWebhookResult,update_webhook_result +UpdateWirelessDeviceImportTaskRequest,update_wireless_device_import_task_request +UpdateWirelessDeviceRequest,update_wireless_device_request +UpdateWirelessGatewayRequest,update_wireless_gateway_request +UpdateWirelessGatewayTaskCreate,update_wireless_gateway_task_create +UpdateWirelessGatewayTaskEntry,update_wireless_gateway_task_entry +UpdateWorkGroupInput,update_work_group_input +UpdateWorkerFleetRequest,update_worker_fleet_request +UpdateWorkerFleetResponse,update_worker_fleet_response +UpdateWorkerRequest,update_worker_request +UpdateWorkerResponse,update_worker_response +UpdateWorkflowRequest,update_workflow_request +UpdateWorkflowResponse,update_workflow_response +UpdateWorkflowStepGroupRequest,update_workflow_step_group_request +UpdateWorkflowStepGroupResponse,update_workflow_step_group_response +UpdateWorkflowStepRequest,update_workflow_step_request +UpdateWorkflowStepResponse,update_workflow_step_response +UpdateWorkforceRequest,update_workforce_request +UpdateWorkforceResponse,update_workforce_response +UpdateWorkgroupRequest,update_workgroup_request +UpdateWorkgroupResponse,update_workgroup_response +UpdateWorkloadInput,update_workload_input +UpdateWorkloadOutput,update_workload_output +UpdateWorkloadRequest,update_workload_request +UpdateWorkloadResponse,update_workload_response +UpdateWorkloadShareInput,update_workload_share_input +UpdateWorkloadShareOutput,update_workload_share_output +UpdateWorkspaceAliasRequest,update_workspace_alias_request +UpdateWorkspaceAuthenticationRequest,update_workspace_authentication_request +UpdateWorkspaceAuthenticationResponse,update_workspace_authentication_response +UpdateWorkspaceBundleRequest,update_workspace_bundle_request +UpdateWorkspaceConfigurationRequest,update_workspace_configuration_request +UpdateWorkspaceImagePermissionRequest,update_workspace_image_permission_request +UpdateWorkspaceRequest,update_workspace_request +UpdateWorkspaceResponse,update_workspace_response +UpdateWorkteamRequest,update_workteam_request +UpdateWorkteamResponse,update_workteam_response +UpdateWorldTemplateRequest,update_world_template_request +UpdateWorldTemplateResponse,update_world_template_response +UpdateXMLClassifierRequest,update_xml_classifier_request +UpdateXssMatchSetRequest,update_xss_match_set_request +UpdateXssMatchSetResponse,update_xss_match_set_response +UpdateZonalShiftRequest,update_zonal_shift_request +UpdatedAt,updated_at +UpdatedBy,updated_by +UpdatedDate,updated_date +UpdatedField,updated_field +UpdatedLatestPatchVersion,updated_latest_patch_version +UpdatedReason,updated_reason +UpdatedTime,updated_time +UpdatedTimestamp,updated_timestamp +UpdatedToken,updated_token +UpdaterRequestId,updater_request_id +Updates,updates +UpdatesURI,updates_uri +UpfrontCost,upfront_cost +UpfrontPrice,upfront_price +UpgradeAppliedSchemaRequest,upgrade_applied_schema_request +UpgradeAppliedSchemaResponse,upgrade_applied_schema_response +UpgradeAvailability,upgrade_availability +UpgradeDependencyFailureFault,upgrade_dependency_failure_fault +UpgradeDomainRequest,upgrade_domain_request +UpgradeDomainResponse,upgrade_domain_response +UpgradeElasticsearchDomainRequest,upgrade_elasticsearch_domain_request +UpgradeElasticsearchDomainResponse,upgrade_elasticsearch_domain_response +UpgradeHistories,upgrade_histories +UpgradeHistory,upgrade_history +UpgradeId,upgrade_id +UpgradeLensReviewInput,upgrade_lens_review_input +UpgradeName,upgrade_name +UpgradeProcessing,upgrade_processing +UpgradeProfileVersionInput,upgrade_profile_version_input +UpgradePublishedSchemaRequest,upgrade_published_schema_request +UpgradePublishedSchemaResponse,upgrade_published_schema_response +UpgradeStatus,upgrade_status +UpgradeStep,upgrade_step +UpgradeStepItem,upgrade_step_item +UpgradeStepStatus,upgrade_step_status +UpgradeTarget,upgrade_target +UpgradedSchemaArn,upgraded_schema_arn +UplinkCount,uplink_count +UplinkEchoConfig,uplink_echo_config +UplinkGbps,uplink_gbps +UplinkSpectrumConfig,uplink_spectrum_config +Upload,upload +UploadArchiveInput,upload_archive_input +UploadAvailability,upload_availability +UploadBufferAllocatedInBytes,upload_buffer_allocated_in_bytes +UploadBufferUsedInBytes,upload_buffer_used_in_bytes +UploadConfiguration,upload_configuration +UploadCredentials,upload_credentials +UploadDate,upload_date +UploadDocumentsRequest,upload_documents_request +UploadDocumentsResponse,upload_documents_response +UploadEnd,upload_end +UploadEntityDefinitionsRequest,upload_entity_definitions_request +UploadEntityDefinitionsResponse,upload_entity_definitions_response +UploadId,upload_id +UploadIdMarker,upload_id_marker +UploadLayerPartRequest,upload_layer_part_request +UploadLayerPartResponse,upload_layer_part_response +UploadListElement,upload_list_element +UploadMetadata,upload_metadata +UploadMultipartPartInput,upload_multipart_part_input +UploadMultipartPartOutput,upload_multipart_part_output +UploadNotFoundException,upload_not_found_exception +UploadPartCopyOutput,upload_part_copy_output +UploadPartCopyRequest,upload_part_copy_request +UploadPartOutput,upload_part_output +UploadPartRequest,upload_part_request +UploadPolicy,upload_policy +UploadPolicySignature,upload_policy_signature +UploadReadSetPartRequest,upload_read_set_part_request +UploadReadSetPartResponse,upload_read_set_part_response +UploadSSHPublicKeyRequest,upload_ssh_public_key_request +UploadSSHPublicKeyResponse,upload_ssh_public_key_response +UploadServerCertificateRequest,upload_server_certificate_request +UploadServerCertificateResponse,upload_server_certificate_response +UploadSettings,upload_settings +UploadSigningCertificateRequest,upload_signing_certificate_request +UploadSigningCertificateResponse,upload_signing_certificate_response +UploadSize,upload_size +UploadSpeed,upload_speed +UploadStart,upload_start +UploadType,upload_type +UploadUrl,upload_url +UploaderConfig,uploader_config +UploaderStatus,uploader_status +Uploads,uploads +UploadsList,uploads_list +UpperBound,upper_bound +UpperBoundary,upper_boundary +Upsert,upsert +UpsertKeys,upsert_keys +UpsertRedshiftOptions,upsert_redshift_options +UpsertRedshiftTargetOptions,upsert_redshift_target_options +UpsertRowData,upsert_row_data +UpsertRowsResult,upsert_rows_result +Upsolver,upsolver +UpsolverDestinationProperties,upsolver_destination_properties +UpsolverS3OutputFormatConfig,upsolver_s3_output_format_config +UpstreamRepository,upstream_repository +UpstreamRepositoryInfo,upstream_repository_info +Uri,uri +UriEndpoint,uri_endpoint +UriPath,uri_path +UriPathRoute,uri_path_route +UriPathRouteInput,uri_path_route_input +Uris,uris +Url,url +UrlEndpoint,url_endpoint +UrlEndpointConfig,url_endpoint_config +UrlEndpointInput,url_endpoint_input +UrlEndpointSummary,url_endpoint_summary +UrlExclusionPatterns,url_exclusion_patterns +UrlExpiry,url_expiry +UrlInclusionPatterns,url_inclusion_patterns +UrlPath,url_path +UrlReference,url_reference +UrlType,url_type +Urls,urls +Usage,usage +UsageAccountResult,usage_account_result +UsageAllocation,usage_allocation +UsageAllocations,usage_allocations +UsageByAccount,usage_by_account +UsageCriteria,usage_criteria +UsageDataSourceResult,usage_data_source_result +UsageDimension,usage_dimension +UsageFeatureResult,usage_feature_result +UsageFlags,usage_flags +UsageInstruction,usage_instruction +UsageInstructions,usage_instructions +UsageLimit,usage_limit +UsageLimitAlreadyExistsFault,usage_limit_already_exists_fault +UsageLimitId,usage_limit_id +UsageLimitList,usage_limit_list +UsageLimitNotFoundFault,usage_limit_not_found_fault +UsageLimits,usage_limits +UsageMetric,usage_metric +UsageMetricBasis,usage_metric_basis +UsageMode,usage_mode +UsageOperation,usage_operation +UsageOperationUpdateTime,usage_operation_update_time +UsagePlan,usage_plan +UsagePlanKey,usage_plan_key +UsagePlanKeys,usage_plan_keys +UsagePlans,usage_plans +UsagePrice,usage_price +UsageQuantity,usage_quantity +UsageRecord,usage_record +UsageRecordResult,usage_record_result +UsageRecords,usage_records +UsageReportSubscription,usage_report_subscription +UsageReportSubscriptions,usage_report_subscriptions +UsageResourceResult,usage_resource_result +UsageStartTimestamp,usage_start_timestamp +UsageStatisticType,usage_statistic_type +UsageStatistics,usage_statistics +UsageStatisticsFilter,usage_statistics_filter +UsageStatisticsSortBy,usage_statistics_sort_by +UsageStopTimestamp,usage_stop_timestamp +UsageStrategy,usage_strategy +UsageTotal,usage_total +UsageType,usage_type +UsbDeviceFilterStrings,usb_device_filter_strings +Use2DSolver,use2_d_solver +UseAlternateFolderForOnline,use_alternate_folder_for_online +UseAmortized,use_amortized +UseAudioRenditionGroup,use_audio_rendition_group +UseAwsOwnedKey,use_aws_owned_key +UseAwsProvidedLatestImage,use_aws_provided_latest_image +UseBFile,use_b_file +UseBcpFullLoad,use_bcp_full_load +UseBlankCellFormat,use_blank_cell_format +UseBlended,use_blended +UseCase,use_case +UseCaseArn,use_case_arn +UseCaseDescription,use_case_description +UseCaseId,use_case_id +UseCaseSummaryList,use_case_summary_list +UseCaseType,use_case_type +UseChangeLog,use_change_log +UseCsvNoSupValue,use_csv_no_sup_value +UseCustomCookbooks,use_custom_cookbooks +UseDefaultIfPreferenceUnavailable,use_default_if_preference_unavailable +UseDefaultProcessorFeatures,use_default_processor_features +UseDefaults,use_defaults +UseDirectPathFullLoad,use_direct_path_full_load +UseEarliestTimeOnPointInTimeUnavailable,use_earliest_time_on_point_in_time_unavailable +UseEbsOptimizedInstances,use_ebs_optimized_instances +UseExistingClientSecret,use_existing_client_secret +UseGeolocationForTimeZone,use_geolocation_for_time_zone +UseGrouping,use_grouping +UseLakeFormationCredentials,use_lake_formation_credentials +UseLatestRestorableTime,use_latest_restorable_time +UseLegacyProvider,use_legacy_provider +UseLogit,use_logit +UseLogminerReader,use_logminer_reader +UseLongIds,use_long_ids +UseLongIdsAggregated,use_long_ids_aggregated +UseMiddleboxes,use_middleboxes +UseNewMappingType,use_new_mapping_type +UseOffPeakWindow,use_off_peak_window +UseOpsworksSecurityGroups,use_opsworks_security_groups +UseOrdering,use_ordering +UsePathPrefix,use_path_prefix +UsePreviousTemplate,use_previous_template +UsePreviousValue,use_previous_value +UsePrimaryBackgroundColor,use_primary_background_color +UseSameUsername,use_same_username +UseServiceLinkedRole,use_service_linked_role +UseStageCache,use_stage_cache +UseTaskStartTimeForFullLoadTimestamp,use_task_start_time_for_full_load_timestamp +UseThirdPartyBackupDevice,use_third_party_backup_device +UseUpdateLookUp,use_update_look_up +Used,used +UsedCommitment,used_commitment +UsedInstanceCount,used_instance_count +User,user +UserAccessLoggingSettings,user_access_logging_settings +UserAccessLoggingSettingsSummary,user_access_logging_settings_summary +UserAccessResultItem,user_access_result_item +UserAccessTaskItem,user_access_task_item +UserAccessUrl,user_access_url +UserActivities,user_activities +UserAgent,user_agent +UserAlreadyExistsFault,user_already_exists_fault +UserAndGroupQuotas,user_and_group_quotas +UserArn,user_arn +UserArnSession,user_arn_session +UserAttributeNames,user_attribute_names +UserAttributeUpdateSettings,user_attribute_update_settings +UserAttributeUpdateSettingsType,user_attribute_update_settings_type +UserAttributes,user_attributes +UserAuthConfig,user_auth_config +UserAuthConfigInfo,user_auth_config_info +UserBase,user_base +UserBucket,user_bucket +UserBucketDetails,user_bucket_details +UserByPermissionGroup,user_by_permission_group +UserCode,user_code +UserConfig,user_config +UserConfiguration,user_configuration +UserConfirmationNecessary,user_confirmation_necessary +UserConfirmed,user_confirmed +UserContext,user_context +UserContextData,user_context_data +UserContextDataType,user_context_data_type +UserContextPolicy,user_context_policy +UserCount,user_count +UserCreateDate,user_create_date +UserData,user_data +UserDataFilters,user_data_filters +UserDataList,user_data_list +UserDataShared,user_data_shared +UserDataValidationParameters,user_data_validation_parameters +UserDefined,user_defined +UserDefinedFields,user_defined_fields +UserDefinedFunction,user_defined_function +UserDefinedFunctionInput,user_defined_function_input +UserDefinedFunctions,user_defined_functions +UserDetail,user_detail +UserDetailList,user_detail_list +UserDetails,user_details +UserDoesNotExistException,user_does_not_exist_exception +UserEmail,user_email +UserEmailList,user_email_list +UserEnabledAsLocalAdministrator,user_enabled_as_local_administrator +UserError,user_error +UserErrorException,user_error_exception +UserErrors,user_errors +UserFeedback,user_feedback +UserGroup,user_group +UserGroupAlreadyExistsFault,user_group_already_exists_fault +UserGroupId,user_group_id +UserGroupIds,user_group_ids +UserGroupIdsToAdd,user_group_ids_to_add +UserGroupIdsToRemove,user_group_ids_to_remove +UserGroupNotFoundFault,user_group_not_found_fault +UserGroupPendingChanges,user_group_pending_changes +UserGroupQuotaExceededFault,user_group_quota_exceeded_fault +UserGroupResolutionConfiguration,user_group_resolution_configuration +UserGroupResolutionMode,user_group_resolution_mode +UserGroups,user_groups +UserGroupsUpdateStatus,user_groups_update_status +UserHierarchyGroupSummaryList,user_hierarchy_group_summary_list +UserHierarchyGroups,user_hierarchy_groups +UserId,user_id +UserIdGroupPair,user_id_group_pair +UserIdGroupPairs,user_id_group_pairs +UserIdList,user_id_list +UserIdentity,user_identity +UserIdentityConfiguration,user_identity_configuration +UserIdentityInfo,user_identity_info +UserIdentityInfoLite,user_identity_info_lite +UserIdentityRoot,user_identity_root +UserIds,user_ids +UserIdsToAdd,user_ids_to_add +UserIdsToRemove,user_ids_to_remove +UserImportInProgressException,user_import_in_progress_exception +UserImportJob,user_import_job +UserImportJobType,user_import_job_type +UserImportJobs,user_import_jobs +UserInfo,user_info +UserInfoEndpoint,user_info_endpoint +UserInteractionRequired,user_interaction_required +UserInvitationStatus,user_invitation_status +UserInvitationUrl,user_invitation_url +UserLambdaValidationException,user_lambda_validation_exception +UserLastModifiedDate,user_last_modified_date +UserList,user_list +UserMFASettingList,user_mfa_setting_list +UserMatch,user_match +UserMatchThreshold,user_match_threshold +UserMatches,user_matches +UserMetadata,user_metadata +UserMigration,user_migration +UserName,user_name +UserNameAttributeField,user_name_attribute_field +UserNameColumn,user_name_column +UserNames,user_names +UserNamesToAdd,user_names_to_add +UserNamesToRemove,user_names_to_remove +UserNotConfirmedException,user_not_confirmed_exception +UserNotFoundException,user_not_found_exception +UserNotFoundFault,user_not_found_fault +UserPassword,user_password +UserPausedDetails,user_paused_details +UserPendingChanges,user_pending_changes +UserPhoneConfig,user_phone_config +UserPolicyList,user_policy_list +UserPool,user_pool +UserPoolAddOnNotEnabledException,user_pool_add_on_not_enabled_exception +UserPoolAddOns,user_pool_add_ons +UserPoolAddOnsType,user_pool_add_ons_type +UserPoolArn,user_pool_arn +UserPoolClient,user_pool_client +UserPoolClientDescription,user_pool_client_description +UserPoolClientId,user_pool_client_id +UserPoolClientType,user_pool_client_type +UserPoolClients,user_pool_clients +UserPoolConfig,user_pool_config +UserPoolConfigs,user_pool_configs +UserPoolDescriptionType,user_pool_description_type +UserPoolDomain,user_pool_domain +UserPoolId,user_pool_id +UserPoolName,user_pool_name +UserPoolPolicyType,user_pool_policy_type +UserPoolTaggingException,user_pool_tagging_exception +UserPoolTags,user_pool_tags +UserPoolType,user_pool_type +UserPools,user_pools +UserProfile,user_profile +UserProfileAlreadyExistsException,user_profile_already_exists_exception +UserProfileArn,user_profile_arn +UserProfileDetails,user_profile_details +UserProfileName,user_profile_name +UserProfileNameContains,user_profile_name_contains +UserProfileNameEquals,user_profile_name_equals +UserProfileNotFoundException,user_profile_not_found_exception +UserProfileSummary,user_profile_summary +UserProfiles,user_profiles +UserProperty,user_property +UserQuickConnectConfig,user_quick_connect_config +UserQuotaExceededFault,user_quota_exceeded_fault +UserReference,user_reference +UserRegistrationStatus,user_registration_status +UserRole,user_role +UserRoleName,user_role_name +UserRules,user_rules +UserSearchCriteria,user_search_criteria +UserSearchFilter,user_search_filter +UserSearchMatching,user_search_matching +UserSearchSubtree,user_search_subtree +UserSearchSummary,user_search_summary +UserSecretId,user_secret_id +UserSetting,user_setting +UserSettings,user_settings +UserSettingsSummary,user_settings_summary +UserStackAssociation,user_stack_association +UserStackAssociationError,user_stack_association_error +UserStackAssociations,user_stack_associations +UserStatus,user_status +UserStorage,user_storage +UserStorageMetadata,user_storage_metadata +UserSub,user_sub +UserSummary,user_summary +UserSummaryList,user_summary_list +UserTags,user_tags +UserTokenConfiguration,user_token_configuration +UserTokenConfigurations,user_token_configurations +UserTrustProviderType,user_trust_provider_type +UserTurnInputSpecification,user_turn_input_specification +UserTurnIntentOutput,user_turn_intent_output +UserTurnOutputSpecification,user_turn_output_specification +UserTurnResult,user_turn_result +UserTurnSlotOutput,user_turn_slot_output +UserTurnSpecification,user_turn_specification +UserType,user_type +UserVolumeEncryptionEnabled,user_volume_encryption_enabled +UserVolumeSizeGib,user_volume_size_gib +Username,username +UsernameAttributes,username_attributes +UsernameConfiguration,username_configuration +UsernameConfigurationType,username_configuration_type +UsernameExistsException,username_exists_exception +UsernameField,username_field +UsernamePassword,username_password +UsernamePrefix,username_prefix +Usernames,usernames +Users,users +UsersPerStep,users_per_step +UtcTiming,utc_timing +UtcTimingUri,utc_timing_uri +Utilization,utilization +UtilizationByTime,utilization_by_time +UtilizationMetric,utilization_metric +UtilizationPercentage,utilization_percentage +UtilizationPercentageInUnits,utilization_percentage_in_units +UtilizationStatus,utilization_status +UtilizationsByTime,utilizations_by_time +UtilizedCIDRCount,utilized_cidr_count +UtranCid,utran_cid +UtteranceAggregationDuration,utterance_aggregation_duration +UtteranceAudioInputSpecification,utterance_audio_input_specification +UtteranceBotResponse,utterance_bot_response +UtteranceData,utterance_data +UtteranceDataSortBy,utterance_data_sort_by +UtteranceEvent,utterance_event +UtteranceId,utterance_id +UtteranceInputSpecification,utterance_input_specification +UtteranceLevelTestResultItem,utterance_level_test_result_item +UtteranceLevelTestResults,utterance_level_test_results +UtteranceList,utterance_list +UtteranceSpecification,utterance_specification +Uuid,uuid +VCPU,vcpu +VCpuCount,v_cpu_count +VCpuCountRange,v_cpu_count_range +VCpuCountRangeRequest,v_cpu_count_range_request +VCpuCountRequest,v_cpu_count_request +VCpuInfo,v_cpu_info +VOICE,voice +VPC,vpc +VPCAssociationAuthorizationNotFound,vpc_association_authorization_not_found +VPCAssociationNotFound,vpc_association_not_found +VPCConfig,vpc_config +VPCConfigResponse,vpc_config_response +VPCConnection,vpc_connection +VPCConnectionId,vpc_connection_id +VPCConnectionSummaries,vpc_connection_summaries +VPCConnectionSummary,vpc_connection_summary +VPCConnections,vpc_connections +VPCDerivedInfo,vpc_derived_info +VPCDerivedInfoStatus,vpc_derived_info_status +VPCEConfiguration,vpce_configuration +VPCEndpoint,vpc_endpoint +VPCEndpointDNSName,vpc_endpoint_dns_name +VPCId,vpc_id +VPCOptions,vpc_options +VPCRegion,vpc_region +VPCSettings,vpc_settings +VPCZoneIdentifier,vpc_zone_identifier +VPCs,vpcs +VTLDevice,vtl_device +VTLDeviceARN,vtl_device_arn +VTLDeviceARNs,vtl_device_arns +VTLDeviceProductIdentifier,vtl_device_product_identifier +VTLDeviceType,vtl_device_type +VTLDeviceVendor,vtl_device_vendor +VTLDevices,vtl_devices +Valid,valid +ValidCores,valid_cores +ValidDBInstanceModificationsMessage,valid_db_instance_modifications_message +ValidForInMinutes,valid_for_in_minutes +ValidFrom,valid_from +ValidFromDate,valid_from_date +ValidNextSteps,valid_next_steps +ValidProcessorFeatures,valid_processor_features +ValidStorageOptions,valid_storage_options +ValidThreadsPerCore,valid_threads_per_core +ValidTill,valid_till +ValidTo,valid_to +ValidToDate,valid_to_date +ValidUntil,valid_until +ValidUpgradeTarget,valid_upgrade_target +ValidUserList,valid_user_list +ValidateAssessmentReportIntegrityRequest,validate_assessment_report_integrity_request +ValidateAssessmentReportIntegrityResponse,validate_assessment_report_integrity_response +ValidateConfigurationRequest,validate_configuration_request +ValidateConfigurationSettingsMessage,validate_configuration_settings_message +ValidateE911AddressRequest,validate_e911_address_request +ValidateE911AddressResponse,validate_e911_address_response +ValidateMatchmakingRuleSetInput,validate_matchmaking_rule_set_input +ValidateMatchmakingRuleSetOutput,validate_matchmaking_rule_set_output +ValidateOnly,validate_only +ValidatePipelineDefinitionInput,validate_pipeline_definition_input +ValidatePipelineDefinitionOutput,validate_pipeline_definition_output +ValidatePipelineRequest,validate_pipeline_request +ValidatePipelineResponse,validate_pipeline_response +ValidatePolicyFinding,validate_policy_finding +ValidatePolicyRequest,validate_policy_request +ValidatePolicyResponse,validate_policy_response +ValidateResourcePolicyRequest,validate_resource_policy_request +ValidateResourcePolicyResponse,validate_resource_policy_response +ValidateSecurityProfileBehaviorsRequest,validate_security_profile_behaviors_request +ValidateSecurityProfileBehaviorsResponse,validate_security_profile_behaviors_response +ValidateSolFunctionPackageContentInput,validate_sol_function_package_content_input +ValidateSolFunctionPackageContentMetadata,validate_sol_function_package_content_metadata +ValidateSolFunctionPackageContentOutput,validate_sol_function_package_content_output +ValidateSolNetworkPackageContentInput,validate_sol_network_package_content_input +ValidateSolNetworkPackageContentMetadata,validate_sol_network_package_content_metadata +ValidateSolNetworkPackageContentOutput,validate_sol_network_package_content_output +ValidateTemplateInput,validate_template_input +ValidateTemplateOutput,validate_template_output +Validation,validation +ValidationConfiguration,validation_configuration +ValidationConfigurations,validation_configurations +ValidationData,validation_data +ValidationDataConfig,validation_data_config +ValidationDataLength,validation_data_length +ValidationDomain,validation_domain +ValidationEmails,validation_emails +ValidationError,validation_error +ValidationErrors,validation_errors +ValidationErrorsEntry,validation_errors_entry +ValidationException,validation_exception +ValidationExceptionErrorArgument,validation_exception_error_argument +ValidationExceptionField,validation_exception_field +ValidationExceptionType,validation_exception_type +ValidationFailedRecords,validation_failed_records +ValidationFailure,validation_failure +ValidationFailureReason,validation_failure_reason +ValidationFailures,validation_failures +ValidationFraction,validation_fraction +ValidationIssue,validation_issue +ValidationMessage,validation_message +ValidationMethod,validation_method +ValidationMode,validation_mode +ValidationOutput,validation_output +ValidationPendingRecords,validation_pending_records +ValidationProfiles,validation_profiles +ValidationResult,validation_result +ValidationRole,validation_role +ValidationRule,validation_rule +ValidationSettings,validation_settings +ValidationSpecification,validation_specification +ValidationState,validation_state +ValidationStateDetails,validation_state_details +ValidationStatus,validation_status +ValidationStatuses,validation_statuses +ValidationSuspendedRecords,validation_suspended_records +ValidationWarning,validation_warning +Validator,validator +ValidatorMetric,validator_metric +ValidatorTypes,validator_types +Validators,validators +Validity,validity +ValidityEndTime,validity_end_time +ValidityNotBefore,validity_not_before +ValidityPeriod,validity_period +ValidityStartTime,validity_start_time +Value,value +ValueAsString,value_as_string +ValueAsStringList,value_as_string_list +ValueAxis,value_axis +ValueCellStyle,value_cell_style +ValueDetection,value_detection +ValueDetections,value_detections +ValueForMultipleValues,value_for_multiple_values +ValueFrom,value_from +ValueHint,value_hint +ValueHolder,value_holder +ValueImportanceMap,value_importance_map +ValueInIA,value_in_ia +ValueInMilliseconds,value_in_milliseconds +ValueInStandard,value_in_standard +ValueKey,value_key +ValueLabelConfiguration,value_label_configuration +ValueLabelOptions,value_label_options +ValueList,value_list +ValueMapping,value_mapping +ValueMappings,value_mappings +ValueOptions,value_options +ValueType,value_type +ValueWhenUnset,value_when_unset +ValueWhenUnsetOption,value_when_unset_option +ValueWithServiceIds,value_with_service_ids +Values,values +ValuesMap,values_map +ValuesToAdd,values_to_add +ValuesToRemove,values_to_remove +VarCharValue,var_char_value +Variable,variable +VariableDefinition,variable_definition +VariableEntry,variable_entry +VariableImpactExplanation,variable_impact_explanation +VariableImportanceMetrics,variable_importance_metrics +VariableTags,variable_tags +VariableValue,variable_value +Variables,variables +Variant,variant +VariantImportItemDetail,variant_import_item_detail +VariantImportItemSource,variant_import_item_source +VariantImportJobItem,variant_import_job_item +VariantName,variant_name +VariantProperty,variant_property +VariantPropertyType,variant_property_type +VariantStatus,variant_status +VariantStoreItem,variant_store_item +Variation,variation +VariationConfig,variation_config +VaultARN,vault_arn +VaultAccessPolicy,vault_access_policy +VaultList,vault_list +VaultLockPolicy,vault_lock_policy +VaultName,vault_name +VaultNames,vault_names +VaultNotificationConfig,vault_notification_config +VaultState,vault_state +VaultType,vault_type +VbrQuality,vbr_quality +Vc3Class,vc3_class +Vc3Settings,vc3_settings +VcenterBasedRemoteInfo,vcenter_based_remote_info +VcenterClient,vcenter_client +VcfOptions,vcf_options +VchipAction,vchip_action +Vcpu,vcpu +VdmAttributes,vdm_attributes +VdmEnabled,vdm_enabled +VdmOptions,vdm_options +VectorConfig,vector_config +VectorCounters,vector_counters +VectorEnrichmentJobErrorDetails,vector_enrichment_job_error_details +VectorEnrichmentJobExportErrorDetails,vector_enrichment_job_export_error_details +VectorEnrichmentJobInputConfig,vector_enrichment_job_input_config +VectorEnrichmentJobS3Data,vector_enrichment_job_s3_data +VectorEnrichmentJobSummaries,vector_enrichment_job_summaries +VectorType,vector_type +Veeva,veeva +VeevaConnectorProfileCredentials,veeva_connector_profile_credentials +VeevaConnectorProfileProperties,veeva_connector_profile_properties +VeevaSourceProperties,veeva_source_properties +VehicleStatus,vehicle_status +VehicleSummary,vehicle_summary +Vendor,vendor +VendorCreatedAt,vendor_created_at +VendorGuidance,vendor_guidance +VendorId,vendor_id +VendorName,vendor_name +VendorProperties,vendor_properties +VendorSeverity,vendor_severity +VendorUpdatedAt,vendor_updated_at +Verb,verb +Verbose,verbose +VerificationAttributes,verification_attributes +VerificationException,verification_exception +VerificationFailedException,verification_failed_exception +VerificationKeyArn,verification_key_arn +VerificationKeyCheckValue,verification_key_check_value +VerificationKeyIdentifier,verification_key_identifier +VerificationMessage,verification_message +VerificationMessageTemplate,verification_message_template +VerificationMessageTemplateType,verification_message_template_type +VerificationResponse,verification_response +VerificationState,verification_state +VerificationStatus,verification_status +VerificationToken,verification_token +VerificationValue,verification_value +Verified,verified +VerifiedAccessEndpoint,verified_access_endpoint +VerifiedAccessEndpointEniOptions,verified_access_endpoint_eni_options +VerifiedAccessEndpointId,verified_access_endpoint_id +VerifiedAccessEndpointIds,verified_access_endpoint_ids +VerifiedAccessEndpointLoadBalancerOptions,verified_access_endpoint_load_balancer_options +VerifiedAccessEndpointStatus,verified_access_endpoint_status +VerifiedAccessEndpoints,verified_access_endpoints +VerifiedAccessGroup,verified_access_group +VerifiedAccessGroupArn,verified_access_group_arn +VerifiedAccessGroupId,verified_access_group_id +VerifiedAccessGroupIds,verified_access_group_ids +VerifiedAccessGroups,verified_access_groups +VerifiedAccessInstance,verified_access_instance +VerifiedAccessInstanceId,verified_access_instance_id +VerifiedAccessInstanceIds,verified_access_instance_ids +VerifiedAccessInstanceLoggingConfiguration,verified_access_instance_logging_configuration +VerifiedAccessInstances,verified_access_instances +VerifiedAccessLogCloudWatchLogsDestination,verified_access_log_cloud_watch_logs_destination +VerifiedAccessLogCloudWatchLogsDestinationOptions,verified_access_log_cloud_watch_logs_destination_options +VerifiedAccessLogDeliveryStatus,verified_access_log_delivery_status +VerifiedAccessLogKinesisDataFirehoseDestination,verified_access_log_kinesis_data_firehose_destination +VerifiedAccessLogKinesisDataFirehoseDestinationOptions,verified_access_log_kinesis_data_firehose_destination_options +VerifiedAccessLogOptions,verified_access_log_options +VerifiedAccessLogS3Destination,verified_access_log_s3_destination +VerifiedAccessLogS3DestinationOptions,verified_access_log_s3_destination_options +VerifiedAccessLogs,verified_access_logs +VerifiedAccessSseSpecificationRequest,verified_access_sse_specification_request +VerifiedAccessSseSpecificationResponse,verified_access_sse_specification_response +VerifiedAccessTrustProvider,verified_access_trust_provider +VerifiedAccessTrustProviderCondensed,verified_access_trust_provider_condensed +VerifiedAccessTrustProviderId,verified_access_trust_provider_id +VerifiedAccessTrustProviderIds,verified_access_trust_provider_ids +VerifiedAccessTrustProviders,verified_access_trust_providers +VerifiedAuthorUrl,verified_author_url +VerifiedEmailAddresses,verified_email_addresses +VerifiedForSendingStatus,verified_for_sending_status +Verify,verify +VerifyAuthChallengeResponse,verify_auth_challenge_response +VerifyAuthRequestCryptogramInput,verify_auth_request_cryptogram_input +VerifyAuthRequestCryptogramOutput,verify_auth_request_cryptogram_output +VerifyCardValidationDataInput,verify_card_validation_data_input +VerifyCardValidationDataOutput,verify_card_validation_data_output +VerifyDomainDkimRequest,verify_domain_dkim_request +VerifyDomainDkimResponse,verify_domain_dkim_response +VerifyDomainIdentityRequest,verify_domain_identity_request +VerifyDomainIdentityResponse,verify_domain_identity_response +VerifyDuration,verify_duration +VerifyEmailAddressRequest,verify_email_address_request +VerifyEmailIdentityRequest,verify_email_identity_request +VerifyMacInput,verify_mac_input +VerifyMacOutput,verify_mac_output +VerifyMacRequest,verify_mac_request +VerifyMacResponse,verify_mac_response +VerifyMode,verify_mode +VerifyOTPMessageRequest,verify_otp_message_request +VerifyOTPMessageRequestParameters,verify_otp_message_request_parameters +VerifyOTPMessageResponse,verify_otp_message_response +VerifyPinDataInput,verify_pin_data_input +VerifyPinDataOutput,verify_pin_data_output +VerifyRequest,verify_request +VerifyResponse,verify_response +VerifySMSSandboxPhoneNumberInput,verify_sms_sandbox_phone_number_input +VerifySessionResponse,verify_session_response +VerifySoftwareTokenRequest,verify_software_token_request +VerifySoftwareTokenResponse,verify_software_token_response +VerifyStatus,verify_status +VerifyTrustRequest,verify_trust_request +VerifyTrustResult,verify_trust_result +VerifyUserAttributeRequest,verify_user_attribute_request +Version,version +VersionArn,version_arn +VersionBump,version_bump +VersionConflictException,version_conflict_exception +VersionControlInfo,version_control_info +VersionCount,version_count +VersionCreatedDate,version_created_date +VersionDate,version_date +VersionDeleteError,version_delete_error +VersionDescription,version_description +VersionDifferences,version_differences +VersionId,version_id +VersionIdMarker,version_id_marker +VersionIds,version_ids +VersionIdsToStages,version_ids_to_stages +VersionInfo,version_info +VersionInformation,version_information +VersionLabel,version_label +VersionLabels,version_labels +VersionLifecycleConfig,version_lifecycle_config +VersionMismatchException,version_mismatch_exception +VersionName,version_name +VersionNames,version_names +VersionNumber,version_number +VersionStage,version_stage +VersionStages,version_stages +VersionStatus,version_status +VersionSummary,version_summary +VersionToExpire,version_to_expire +VersionToPublish,version_to_publish +VersionUpdateByJobsConfig,version_update_by_jobs_config +VersioningConfiguration,versioning_configuration +VersioningSupported,versioning_supported +Versions,versions +VersionsLimitExceededException,versions_limit_exceeded_exception +VersionsToPublish,versions_to_publish +Vertex,vertex +VerticalAccuracy,vertical_accuracy +VerticalAlign,vertical_align +VerticalLayoutConfiguration,vertical_layout_configuration +VerticalOffset,vertical_offset +VerticalOverflowVisibility,vertical_overflow_visibility +VerticalPosition,vertical_position +VerticalTextAlignment,vertical_text_alignment +Vertices,vertices +VgwTelemetry,vgw_telemetry +Video,video +VideoArtifactsConfiguration,video_artifacts_configuration +VideoAttribute,video_attribute +VideoBlackFailoverSettings,video_black_failover_settings +VideoBlackSettings,video_black_settings +VideoBlackThresholdMsec,video_black_threshold_msec +VideoCodecSettings,video_codec_settings +VideoCompositionOffsets,video_composition_offsets +VideoConcatenationConfiguration,video_concatenation_configuration +VideoConfiguration,video_configuration +VideoContentSourceUrl,video_content_source_url +VideoDescription,video_description +VideoDescriptionName,video_description_name +VideoDescriptions,video_descriptions +VideoDetail,video_detail +VideoDetails,video_details +VideoFormat,video_format +VideoGenerator,video_generator +VideoMetadata,video_metadata +VideoParameters,video_parameters +VideoPid,video_pid +VideoPreprocessor,video_preprocessor +VideoPreprocessors,video_preprocessors +VideoQuality,video_quality +VideoSelector,video_selector +VideoSelectorColorSpaceSettings,video_selector_color_space_settings +VideoSelectorPid,video_selector_pid +VideoSelectorProgramId,video_selector_program_id +VideoSelectorSettings,video_selector_settings +VideoSettings,video_settings +VideoTooLargeException,video_too_large_exception +View,view +ViewArn,view_arn +ViewArns,view_arns +ViewBillingRequest,view_billing_request +ViewBillingResponse,view_billing_response +ViewContent,view_content +ViewContentSha256,view_content_sha256 +ViewExpandedText,view_expanded_text +ViewFrame,view_frame +ViewId,view_id +ViewInputContent,view_input_content +ViewName,view_name +ViewOffNadir,view_off_nadir +ViewOffNadirInput,view_off_nadir_input +ViewOriginalText,view_original_text +ViewSummary,view_summary +ViewSunAzimuth,view_sun_azimuth +ViewSunAzimuthInput,view_sun_azimuth_input +ViewSunElevation,view_sun_elevation +ViewSunElevationInput,view_sun_elevation_input +ViewToken,view_token +ViewVersion,view_version +ViewVersionSummary,view_version_summary +ViewVersionSummaryList,view_version_summary_list +ViewerCertificate,viewer_certificate +ViewerProtocolPolicy,viewer_protocol_policy +Views,views +ViewsSummaryList,views_summary_list +ViolatedEntities,violated_entities +ViolatingRoute,violating_route +ViolatingRoutes,violating_routes +ViolatingSecurityGroups,violating_security_groups +ViolationDetail,violation_detail +ViolationEvent,violation_event +ViolationEventAdditionalInfo,violation_event_additional_info +ViolationEventOccurrenceRange,violation_event_occurrence_range +ViolationReason,violation_reason +ViolationReport,violation_report +ViolationTarget,violation_target +ViolationTargetDescription,violation_target_description +ViolatorCount,violator_count +Violators,violators +VirtualCluster,virtual_cluster +VirtualGateway,virtual_gateway +VirtualGatewayBackendDefaults,virtual_gateway_backend_defaults +VirtualGatewayClientPolicy,virtual_gateway_client_policy +VirtualGatewayClientPolicyTls,virtual_gateway_client_policy_tls +VirtualGatewayData,virtual_gateway_data +VirtualGatewayFileAccessLog,virtual_gateway_file_access_log +VirtualGatewayGrpcConnectionPool,virtual_gateway_grpc_connection_pool +VirtualGatewayHealthCheckPolicy,virtual_gateway_health_check_policy +VirtualGatewayHttp2ConnectionPool,virtual_gateway_http2_connection_pool +VirtualGatewayHttpConnectionPool,virtual_gateway_http_connection_pool +VirtualGatewayListener,virtual_gateway_listener +VirtualGatewayListenerTls,virtual_gateway_listener_tls +VirtualGatewayListenerTlsAcmCertificate,virtual_gateway_listener_tls_acm_certificate +VirtualGatewayListenerTlsFileCertificate,virtual_gateway_listener_tls_file_certificate +VirtualGatewayListenerTlsSdsCertificate,virtual_gateway_listener_tls_sds_certificate +VirtualGatewayListenerTlsValidationContext,virtual_gateway_listener_tls_validation_context +VirtualGatewayLogging,virtual_gateway_logging +VirtualGatewayPortMapping,virtual_gateway_port_mapping +VirtualGatewayRef,virtual_gateway_ref +VirtualGatewaySpec,virtual_gateway_spec +VirtualGatewayStatus,virtual_gateway_status +VirtualGatewayTlsValidationContext,virtual_gateway_tls_validation_context +VirtualGatewayTlsValidationContextAcmTrust,virtual_gateway_tls_validation_context_acm_trust +VirtualGatewayTlsValidationContextFileTrust,virtual_gateway_tls_validation_context_file_trust +VirtualGatewayTlsValidationContextSdsTrust,virtual_gateway_tls_validation_context_sds_trust +VirtualGateways,virtual_gateways +VirtualHost,virtual_host +VirtualInterface,virtual_interface +VirtualInterfaceTestHistory,virtual_interface_test_history +VirtualInterfaces,virtual_interfaces +VirtualMFADevice,virtual_mfa_device +VirtualMFADeviceName,virtual_mfa_device_name +VirtualMFADevices,virtual_mfa_devices +VirtualMachine,virtual_machine +VirtualMachineDetails,virtual_machine_details +VirtualMachines,virtual_machines +VirtualName,virtual_name +VirtualNetworkId,virtual_network_id +VirtualNodeData,virtual_node_data +VirtualNodeGrpcConnectionPool,virtual_node_grpc_connection_pool +VirtualNodeHttp2ConnectionPool,virtual_node_http2_connection_pool +VirtualNodeHttpConnectionPool,virtual_node_http_connection_pool +VirtualNodeRef,virtual_node_ref +VirtualNodeServiceProvider,virtual_node_service_provider +VirtualNodeSpec,virtual_node_spec +VirtualNodeStatus,virtual_node_status +VirtualNodeTcpConnectionPool,virtual_node_tcp_connection_pool +VirtualObject,virtual_object +VirtualRouterData,virtual_router_data +VirtualRouterListener,virtual_router_listener +VirtualRouterRef,virtual_router_ref +VirtualRouterServiceProvider,virtual_router_service_provider +VirtualRouterSpec,virtual_router_spec +VirtualRouterStatus,virtual_router_status +VirtualServiceBackend,virtual_service_backend +VirtualServiceData,virtual_service_data +VirtualServiceRef,virtual_service_ref +VirtualServiceSpec,virtual_service_spec +VirtualServiceStatus,virtual_service_status +VirtualizationType,virtualization_type +VirtualizationTypes,virtualization_types +VisaPin,visa_pin +VisaPinVerification,visa_pin_verification +VisaPinVerificationValue,visa_pin_verification_value +Visibility,visibility +VisibilityConfig,visibility_config +VisibilityState,visibility_state +VisibilityTimeout,visibility_timeout +VisibleRange,visible_range +VisibleRangeOptions,visible_range_options +VisibleToAllUsers,visible_to_all_users +VisitorId,visitor_id +Visual,visual +VisualAxisSortOption,visual_axis_sort_option +VisualCustomAction,visual_custom_action +VisualCustomActionOperation,visual_custom_action_operation +VisualId,visual_id +VisualIds,visual_ids +VisualLayoutOptions,visual_layout_options +VisualMenuOption,visual_menu_option +VisualPalette,visual_palette +VisualPublishOptions,visual_publish_options +VisualReference,visual_reference +VisualReferenceInput,visual_reference_input +VisualReferenceOutput,visual_reference_output +VisualSubtitleLabelOptions,visual_subtitle_label_options +VisualTitleLabelOptions,visual_title_label_options +Visuals,visuals +Vlan,vlan +VlanId,vlan_id +VmServer,vm_server +VmServerAddress,vm_server_address +VmwareCategory,vmware_category +VmwareTag,vmware_tag +VmwareTagDescription,vmware_tag_description +VmwareTagName,vmware_tag_name +VmwareTags,vmware_tags +VmwareToAwsTagMapping,vmware_to_aws_tag_mapping +VmwareToAwsTagMappings,vmware_to_aws_tag_mappings +Vocabularies,vocabularies +Vocabulary,vocabulary +VocabularyArn,vocabulary_arn +VocabularyFileUri,vocabulary_file_uri +VocabularyFilterFileUri,vocabulary_filter_file_uri +VocabularyFilterInfo,vocabulary_filter_info +VocabularyFilterMatch,vocabulary_filter_match +VocabularyFilterMethod,vocabulary_filter_method +VocabularyFilterName,vocabulary_filter_name +VocabularyFilterNames,vocabulary_filter_names +VocabularyFilters,vocabulary_filters +VocabularyId,vocabulary_id +VocabularyInfo,vocabulary_info +VocabularyName,vocabulary_name +VocabularyNames,vocabulary_names +VocabularyState,vocabulary_state +VocabularySummary,vocabulary_summary +VocabularySummaryList,vocabulary_summary_list +VodSource,vod_source +VodSourceName,vod_source_name +Voice,voice +VoiceAnalyticsProcessorConfiguration,voice_analytics_processor_configuration +VoiceChannelRequest,voice_channel_request +VoiceChannelResponse,voice_channel_response +VoiceConnector,voice_connector +VoiceConnectorArn,voice_connector_arn +VoiceConnectorGroup,voice_connector_group +VoiceConnectorGroupArn,voice_connector_group_arn +VoiceConnectorGroupId,voice_connector_group_id +VoiceConnectorGroups,voice_connector_groups +VoiceConnectorId,voice_connector_id +VoiceConnectorItem,voice_connector_item +VoiceConnectorItems,voice_connector_items +VoiceConnectorRegions,voice_connector_regions +VoiceConnectorSettings,voice_connector_settings +VoiceConnectors,voice_connectors +VoiceEnhancementSinkConfiguration,voice_enhancement_sink_configuration +VoiceId,voice_id +VoiceMessage,voice_message +VoiceMessageContent,voice_message_content +VoiceProfile,voice_profile +VoiceProfileArn,voice_profile_arn +VoiceProfileDomain,voice_profile_domain +VoiceProfileDomainArn,voice_profile_domain_arn +VoiceProfileDomainId,voice_profile_domain_id +VoiceProfileDomainSummary,voice_profile_domain_summary +VoiceProfileDomains,voice_profile_domains +VoiceProfileId,voice_profile_id +VoiceProfileSummary,voice_profile_summary +VoiceProfiles,voice_profiles +VoiceRecordingConfiguration,voice_recording_configuration +VoiceRecordingTrack,voice_recording_track +VoiceSettings,voice_settings +VoiceSpoofingRisk,voice_spoofing_risk +VoiceTemplate,voice_template +VoiceTemplateRequest,voice_template_request +VoiceTemplateResponse,voice_template_response +VoiceToneAnalysisStatus,voice_tone_analysis_status +VoiceToneAnalysisTask,voice_tone_analysis_task +VoiceToneAnalysisTaskId,voice_tone_analysis_task_id +VoiceToneAnalysisTaskStatus,voice_tone_analysis_task_status +VoiceprintGenerationStatus,voiceprint_generation_status +Voices,voices +VoipDeviceToken,voip_device_token +Volume,volume +VolumeARN,volume_arn +VolumeARNs,volume_arns +VolumeAppendModeEnabled,volume_append_mode_enabled +VolumeArn,volume_arn +VolumeAttachment,volume_attachment +VolumeAttachmentStatus,volume_attachment_status +VolumeConfiguration,volume_configuration +VolumeConfigurations,volume_configurations +VolumeDetail,volume_detail +VolumeDiskId,volume_disk_id +VolumeEncryptionKey,volume_encryption_key +VolumeFilter,volume_filter +VolumeFrom,volume_from +VolumeId,volume_id +VolumeIds,volume_ids +VolumeInfo,volume_info +VolumeInfos,volume_infos +VolumeKmsKeyId,volume_kms_key_id +VolumeModification,volume_modification +VolumeMount,volume_mount +VolumeMounts,volume_mounts +VolumeName,volume_name +VolumeNotFound,volume_not_found +VolumePath,volume_path +VolumeProgress,volume_progress +VolumeRecommendation,volume_recommendation +VolumeRecommendationOption,volume_recommendation_option +VolumeRecoveryPointInfo,volume_recovery_point_info +VolumeRecoveryPointInfos,volume_recovery_point_infos +VolumeRecoveryPointTime,volume_recovery_point_time +VolumeScanStatus,volume_scan_status +VolumeSize,volume_size +VolumeSizeGB,volume_size_gb +VolumeSizeInBytes,volume_size_in_bytes +VolumeSizeInGB,volume_size_in_gb +VolumeSpecification,volume_specification +VolumeStatistics,volume_statistics +VolumeStatus,volume_status +VolumeStatusAction,volume_status_action +VolumeStatusAttachmentStatus,volume_status_attachment_status +VolumeStatusDetails,volume_status_details +VolumeStatusEvent,volume_status_event +VolumeStatusInfo,volume_status_info +VolumeStatusItem,volume_status_item +VolumeStatuses,volume_statuses +VolumeThroughput,volume_throughput +VolumeType,volume_type +VolumeUsageByDatasourcePackage,volume_usage_by_datasource_package +VolumeUsageInBytes,volume_usage_in_bytes +VolumeUsageUpdateTime,volume_usage_update_time +VolumeUsageUpdatedTime,volume_usage_updated_time +VolumeUsedInBytes,volume_used_in_bytes +VolumeiSCSIAttributes,volumei_scsi_attributes +Volumes,volumes +VolumesFrom,volumes_from +VolumesModifications,volumes_modifications +VolumesPerInstance,volumes_per_instance +VorbisSettings,vorbis_settings +Vote,vote +VoteOnProposalInput,vote_on_proposal_input +VoteSummary,vote_summary +VoterMemberId,voter_member_id +VotingPolicy,voting_policy +Vp8Settings,vp8_settings +Vp9Settings,vp9_settings +Vpc,vpc +VpcArn,vpc_arn +VpcAttachment,vpc_attachment +VpcAttachments,vpc_attachments +VpcCidrBlockAssociation,vpc_cidr_block_association +VpcCidrBlockState,vpc_cidr_block_state +VpcClassicLink,vpc_classic_link +VpcConfig,vpc_config +VpcConfigInput,vpc_config_input +VpcConfigOutput,vpc_config_output +VpcConfigRequest,vpc_config_request +VpcConfigResponse,vpc_config_response +VpcConfigs,vpc_configs +VpcConfiguration,vpc_configuration +VpcConfigurationDescription,vpc_configuration_description +VpcConfigurationDescriptions,vpc_configuration_descriptions +VpcConfigurationId,vpc_configuration_id +VpcConfigurationUpdate,vpc_configuration_update +VpcConfigurationUpdates,vpc_configuration_updates +VpcConfigurations,vpc_configurations +VpcConnection,vpc_connection +VpcConnectionArn,vpc_connection_arn +VpcConnectionInfo,vpc_connection_info +VpcConnectionInfoServerless,vpc_connection_info_serverless +VpcConnectionProperties,vpc_connection_properties +VpcConnections,vpc_connections +VpcConnectivity,vpc_connectivity +VpcConnectivityClientAuthentication,vpc_connectivity_client_authentication +VpcConnectivityIam,vpc_connectivity_iam +VpcConnectivitySasl,vpc_connectivity_sasl +VpcConnectivityScram,vpc_connectivity_scram +VpcConnectivityTls,vpc_connectivity_tls +VpcConnector,vpc_connector +VpcConnectorArn,vpc_connector_arn +VpcConnectorName,vpc_connector_name +VpcConnectorRevision,vpc_connector_revision +VpcConnectors,vpc_connectors +VpcDNSTarget,vpc_dns_target +VpcDNSTargets,vpc_dns_targets +VpcDescription,vpc_description +VpcDestinationConfiguration,vpc_destination_configuration +VpcDestinationProperties,vpc_destination_properties +VpcDestinationSummary,vpc_destination_summary +VpcEndpoint,vpc_endpoint +VpcEndpointConnection,vpc_endpoint_connection +VpcEndpointConnectionId,vpc_endpoint_connection_id +VpcEndpointConnections,vpc_endpoint_connections +VpcEndpointDetail,vpc_endpoint_detail +VpcEndpointError,vpc_endpoint_error +VpcEndpointErrorDetail,vpc_endpoint_error_detail +VpcEndpointErrors,vpc_endpoint_errors +VpcEndpointFilters,vpc_endpoint_filters +VpcEndpointId,vpc_endpoint_id +VpcEndpointIds,vpc_endpoint_ids +VpcEndpointOwner,vpc_endpoint_owner +VpcEndpointPolicySupported,vpc_endpoint_policy_supported +VpcEndpointService,vpc_endpoint_service +VpcEndpointServiceName,vpc_endpoint_service_name +VpcEndpointState,vpc_endpoint_state +VpcEndpointSummary,vpc_endpoint_summary +VpcEndpointSummaryList,vpc_endpoint_summary_list +VpcEndpointType,vpc_endpoint_type +VpcEndpoints,vpc_endpoints +VpcId,vpc_id +VpcIds,vpc_ids +VpcInfoCidrBlockSetDetails,vpc_info_cidr_block_set_details +VpcInfoIpv6CidrBlockSetDetails,vpc_info_ipv6_cidr_block_set_details +VpcInfoPeeringOptionsDetails,vpc_info_peering_options_details +VpcInformation,vpc_information +VpcIngressConnection,vpc_ingress_connection +VpcIngressConnectionArn,vpc_ingress_connection_arn +VpcIngressConnectionName,vpc_ingress_connection_name +VpcIngressConnectionSummary,vpc_ingress_connection_summary +VpcIngressConnectionSummaryList,vpc_ingress_connection_summary_list +VpcInterface,vpc_interface +VpcInterfaceAttachment,vpc_interface_attachment +VpcInterfaceName,vpc_interface_name +VpcInterfaceRequest,vpc_interface_request +VpcInterfaces,vpc_interfaces +VpcIpv6CidrBlockAssociation,vpc_ipv6_cidr_block_association +VpcLink,vpc_link +VpcLinkId,vpc_link_id +VpcLinkStatus,vpc_link_status +VpcLinkStatusMessage,vpc_link_status_message +VpcLinkVersion,vpc_link_version +VpcLinks,vpc_links +VpcName,vpc_name +VpcOnly,vpc_only +VpcOptions,vpc_options +VpcOutputSettings,vpc_output_settings +VpcOutputSettingsDescription,vpc_output_settings_description +VpcOwnerId,vpc_owner_id +VpcPeeringAuthorization,vpc_peering_authorization +VpcPeeringAuthorizations,vpc_peering_authorizations +VpcPeeringConnection,vpc_peering_connection +VpcPeeringConnectionId,vpc_peering_connection_id +VpcPeeringConnectionIds,vpc_peering_connection_ids +VpcPeeringConnectionOptionsDescription,vpc_peering_connection_options_description +VpcPeeringConnectionStateReason,vpc_peering_connection_state_reason +VpcPeeringConnectionStatus,vpc_peering_connection_status +VpcPeeringConnectionVpcInfo,vpc_peering_connection_vpc_info +VpcPeeringConnections,vpc_peering_connections +VpcSecurityGroupId,vpc_security_group_id +VpcSecurityGroupIds,vpc_security_group_ids +VpcSecurityGroupMembership,vpc_security_group_membership +VpcSecurityGroupMemberships,vpc_security_group_memberships +VpcSecurityGroups,vpc_security_groups +VpcSettings,vpc_settings +VpcSubnetIds,vpc_subnet_ids +VpcSubnets,vpc_subnets +VpceId,vpce_id +Vpcs,vpcs +VpnConnection,vpn_connection +VpnConnectionArn,vpn_connection_arn +VpnConnectionDeviceSampleConfiguration,vpn_connection_device_sample_configuration +VpnConnectionDeviceType,vpn_connection_device_type +VpnConnectionDeviceTypeId,vpn_connection_device_type_id +VpnConnectionDeviceTypes,vpn_connection_device_types +VpnConnectionId,vpn_connection_id +VpnConnectionIds,vpn_connection_ids +VpnConnectionOptions,vpn_connection_options +VpnConnectionOptionsSpecification,vpn_connection_options_specification +VpnConnections,vpn_connections +VpnEcmpSupport,vpn_ecmp_support +VpnGateway,vpn_gateway +VpnGatewayId,vpn_gateway_id +VpnGatewayIds,vpn_gateway_ids +VpnGateways,vpn_gateways +VpnPort,vpn_port +VpnProtocol,vpn_protocol +VpnStaticRoute,vpn_static_route +VpnTunnelLogOptions,vpn_tunnel_log_options +VpnTunnelLogOptionsSpecification,vpn_tunnel_log_options_specification +VpnTunnelOptionsSpecification,vpn_tunnel_options_specification +VpnTunnelOutsideIpAddress,vpn_tunnel_outside_ip_address +VsamAttributes,vsam_attributes +VsamDetailAttributes,vsam_detail_attributes +Vulnerabilities,vulnerabilities +Vulnerability,vulnerability +VulnerabilityCodeVulnerabilities,vulnerability_code_vulnerabilities +VulnerabilityIdAggregation,vulnerability_id_aggregation +VulnerabilityVendor,vulnerability_vendor +VulnerablePackage,vulnerable_package +VulnerablePackages,vulnerable_packages +WAFAssociatedItemException,waf_associated_item_exception +WAFBadRequestException,waf_bad_request_exception +WAFConfigurationWarningException,waf_configuration_warning_exception +WAFDisallowedNameException,waf_disallowed_name_exception +WAFDuplicateItemException,waf_duplicate_item_exception +WAFEntityMigrationException,waf_entity_migration_exception +WAFExpiredManagedRuleGroupVersionException,waf_expired_managed_rule_group_version_exception +WAFInternalErrorException,waf_internal_error_exception +WAFInvalidOperationException,waf_invalid_operation_exception +WAFInvalidParameterException,waf_invalid_parameter_exception +WAFInvalidPermissionPolicyException,waf_invalid_permission_policy_exception +WAFInvalidRegexPatternException,waf_invalid_regex_pattern_exception +WAFInvalidResourceException,waf_invalid_resource_exception +WAFLimitsExceededException,waf_limits_exceeded_exception +WAFLogDestinationPermissionIssueException,waf_log_destination_permission_issue_exception +WAFNonEmptyEntityException,waf_non_empty_entity_exception +WAFNonexistentContainerException,waf_nonexistent_container_exception +WAFNonexistentItemException,waf_nonexistent_item_exception +WAFOptimisticLockException,waf_optimistic_lock_exception +WAFReferencedItemException,waf_referenced_item_exception +WAFServiceLinkedRoleErrorException,waf_service_linked_role_error_exception +WAFStaleDataException,waf_stale_data_exception +WAFSubscriptionNotFoundException,waf_subscription_not_found_exception +WAFTagOperationException,waf_tag_operation_exception +WAFTagOperationInternalErrorException,waf_tag_operation_internal_error_exception +WAFUnavailableEntityException,waf_unavailable_entity_exception +WAFUnsupportedAggregateKeyTypeException,waf_unsupported_aggregate_key_type_exception +WAPE,wape +WafAction,waf_action +WafExcludedRule,waf_excluded_rule +WafOverrideAction,waf_override_action +WafWebAclArn,waf_web_acl_arn +Wait,wait +WaitActivity,wait_activity +WaitAndContinueSpecification,wait_and_continue_specification +WaitFor,wait_for +WaitForQuietTime,wait_for_quiet_time +WaitIntervalInSeconds,wait_interval_in_seconds +WaitMinutes,wait_minutes +WaitPeriodMs,wait_period_ms +WaitTime,wait_time +WaitTimeSeconds,wait_time_seconds +WaitUntil,wait_until +WaitingActions,waiting_actions +WaitingOnIngestion,waiting_on_ingestion +WakeUp,wake_up +WakeWord,wake_word +Warehouse,warehouse +WarmCount,warm_count +WarmEnabled,warm_enabled +WarmNodeCount,warm_node_count +WarmPoolConfiguration,warm_pool_configuration +WarmPoolProgress,warm_pool_progress +WarmPoolSize,warm_pool_size +WarmPoolStatus,warm_pool_status +WarmPoolStatusEquals,warm_pool_status_equals +WarmStartConfig,warm_start_config +WarmStartType,warm_start_type +WarmType,warm_type +WarmupPercentage,warmup_percentage +WarmupStatus,warmup_status +WarnCode,warn_code +WarnMessage,warn_message +Warning,warning +WarningForeground,warning_foreground +WarningGroup,warning_group +WarningMessage,warning_message +Warnings,warnings +WarningsListItem,warnings_list_item +Watchlist,watchlist +WatchlistDetails,watchlist_details +WatchlistId,watchlist_id +WatchlistIds,watchlist_ids +WatchlistSummaries,watchlist_summaries +WatchlistSummary,watchlist_summary +WaterfallChartAggregatedFieldWells,waterfall_chart_aggregated_field_wells +WaterfallChartConfiguration,waterfall_chart_configuration +WaterfallChartFieldWells,waterfall_chart_field_wells +WaterfallChartOptions,waterfall_chart_options +WaterfallChartSortConfiguration,waterfall_chart_sort_configuration +WaterfallVisual,waterfall_visual +Watermarks,watermarks +WavSettings,wav_settings +Wave,wave +WaveAggregatedStatus,wave_aggregated_status +WaypointPositions,waypoint_positions +Wcdma,wcdma +WcdmaLocalId,wcdma_local_id +WcdmaNmr,wcdma_nmr +WcdmaNmrObj,wcdma_nmr_obj +WcdmaObj,wcdma_obj +Web,web +WebACL,web_acl +WebACLArn,web_acl_arn +WebACLId,web_acl_id +WebACLLockToken,web_acl_lock_token +WebACLName,web_acl_name +WebACLSummary,web_acl_summary +WebACLUpdate,web_acl_update +WebACLs,web_acls +WebAclArn,web_acl_arn +WebAclId,web_acl_id +WebClientId,web_client_id +WebCollectorGrantedRoleBasedAccess,web_collector_granted_role_based_access +WebCollectorS3Access,web_collector_s3_access +WebCrawlerConfiguration,web_crawler_configuration +WebCrawlerMode,web_crawler_mode +WebDeliveryAllowedFlag,web_delivery_allowed_flag +WebIdentityToken,web_identity_token +WebLinkFieldMappings,web_link_field_mappings +WebServerHostname,web_server_hostname +WebSocketEndpoint,web_socket_endpoint +WebToken,web_token +WebUrl,web_url +Webhook,webhook +WebhookAuthConfiguration,webhook_auth_configuration +WebhookDefinition,webhook_definition +WebhookFilter,webhook_filter +WebhookFilterRule,webhook_filter_rule +WebserverAccessMode,webserver_access_mode +WebserverLogs,webserver_logs +WebserverUrl,webserver_url +WebsiteAuthorizationProviderSummary,website_authorization_provider_summary +WebsiteAuthorizationProviders,website_authorization_providers +WebsiteCaId,website_ca_id +WebsiteCaSummary,website_ca_summary +WebsiteCertificateAuthorities,website_certificate_authorities +WebsiteConfiguration,website_configuration +WebsiteRedirectLocation,website_redirect_location +WebsiteURL,website_url +WebsiteUrl,website_url +Websocket,websocket +WebvttDestinationSettings,webvtt_destination_settings +WebvttHlsSourceSettings,webvtt_hls_source_settings +Wednesday,wednesday +WeeklyAutoScalingSchedule,weekly_auto_scaling_schedule +WeeklyMaintenanceStartTime,weekly_maintenance_start_time +WeeklyMaintenanceWindowStart,weekly_maintenance_window_start +WeeklySchedule,weekly_schedule +WeeklySetting,weekly_setting +WeeklySettings,weekly_settings +WeeklyStartTime,weekly_start_time +Weight,weight +WeightLbs,weight_lbs +WeightSort,weight_sort +WeightedCapacity,weighted_capacity +WeightedQuantileLoss,weighted_quantile_loss +WeightedQuantileLosses,weighted_quantile_losses +WeightedTarget,weighted_target +WeightedTargetGroup,weighted_target_group +WelcomeIntent,welcome_intent +West,west +WhatIfAnalyses,what_if_analyses +WhatIfAnalysisArn,what_if_analysis_arn +WhatIfAnalysisName,what_if_analysis_name +WhatIfAnalysisSummary,what_if_analysis_summary +WhatIfForecastArn,what_if_forecast_arn +WhatIfForecastArns,what_if_forecast_arns +WhatIfForecastExportArn,what_if_forecast_export_arn +WhatIfForecastExportName,what_if_forecast_export_name +WhatIfForecastExportSummary,what_if_forecast_export_summary +WhatIfForecastExports,what_if_forecast_exports +WhatIfForecastName,what_if_forecast_name +WhatIfForecastSummary,what_if_forecast_summary +WhatIfForecasts,what_if_forecasts +WhatIfPointScenario,what_if_point_scenario +WhatIfRangeScenario,what_if_range_scenario +WhitePointX,white_point_x +WhitePointY,white_point_y +Whitelist,whitelist +WhitelistCidr,whitelist_cidr +WhitelistRules,whitelist_rules +WhitelistedNames,whitelisted_names +WhoIsServer,who_is_server +WiFiAccessPoint,wi_fi_access_point +WiFiAccessPoints,wi_fi_access_points +Width,width +WidthInPx,width_in_px +WidthPixels,width_pixels +WikiFieldMappings,wiki_field_mappings +WindowEndDatetime,window_end_datetime +WindowExecutionId,window_execution_id +WindowExecutionTaskIdentities,window_execution_task_identities +WindowExecutionTaskInvocationIdentities,window_execution_task_invocation_identities +WindowExecutions,window_executions +WindowId,window_id +WindowIdentities,window_identities +WindowOptions,window_options +WindowSize,window_size +WindowStartDatetime,window_start_datetime +WindowStartTime,window_start_time +WindowSummary,window_summary +WindowTargetId,window_target_id +WindowTaskId,window_task_id +WindowsAuditLogConfiguration,windows_audit_log_configuration +WindowsAuditLogCreateConfiguration,windows_audit_log_create_configuration +WindowsConfiguration,windows_configuration +WindowsFileSystemConfiguration,windows_file_system_configuration +WindowsResponse,windows_response +WirelessConnection,wireless_connection +WirelessDeviceEventLogOption,wireless_device_event_log_option +WirelessDeviceEventTopic,wireless_device_event_topic +WirelessDeviceFrameInfo,wireless_device_frame_info +WirelessDeviceId,wireless_device_id +WirelessDeviceIdEventTopic,wireless_device_id_event_topic +WirelessDeviceImportTask,wireless_device_import_task +WirelessDeviceImportTaskList,wireless_device_import_task_list +WirelessDeviceList,wireless_device_list +WirelessDeviceLogOption,wireless_device_log_option +WirelessDeviceLogOptions,wireless_device_log_options +WirelessDeviceStatistics,wireless_device_statistics +WirelessDeviceType,wireless_device_type +WirelessDevices,wireless_devices +WirelessDevicesToAdd,wireless_devices_to_add +WirelessDevicesToRemove,wireless_devices_to_remove +WirelessGatewayEventLogOption,wireless_gateway_event_log_option +WirelessGatewayEventTopic,wireless_gateway_event_topic +WirelessGatewayId,wireless_gateway_id +WirelessGatewayIdEventTopic,wireless_gateway_id_event_topic +WirelessGatewayList,wireless_gateway_list +WirelessGatewayLogOption,wireless_gateway_log_option +WirelessGatewayLogOptions,wireless_gateway_log_options +WirelessGatewayStatistics,wireless_gateway_statistics +WirelessGatewayTaskDefinitionId,wireless_gateway_task_definition_id +WirelessGateways,wireless_gateways +WirelessGatewaysToAdd,wireless_gateways_to_add +WirelessGatewaysToRemove,wireless_gateways_to_remove +WirelessMetadata,wireless_metadata +WisdomInfo,wisdom_info +WithDecryption,with_decryption +WithEvent,with_event +WithFederation,with_federation +WithHeader,with_header +WithdrawByoipCidrRequest,withdraw_byoip_cidr_request +WithdrawByoipCidrResponse,withdraw_byoip_cidr_response +WithdrawByoipCidrResult,withdraw_byoip_cidr_result +WithoutSettings,without_settings +WordCasing,word_casing +WordCloudAggregatedFieldWells,word_cloud_aggregated_field_wells +WordCloudChartConfiguration,word_cloud_chart_configuration +WordCloudFieldWells,word_cloud_field_wells +WordCloudOptions,word_cloud_options +WordCloudSortConfiguration,word_cloud_sort_configuration +WordCloudVisual,word_cloud_visual +WordFilter,word_filter +WordOrientation,word_orientation +WordPadding,word_padding +WordScaling,word_scaling +Words,words +WorkDocsConfiguration,work_docs_configuration +WorkGroup,work_group +WorkGroupConfiguration,work_group_configuration +WorkGroupConfigurationUpdates,work_group_configuration_updates +WorkGroupName,work_group_name +WorkGroupNames,work_group_names +WorkGroupSummary,work_group_summary +WorkGroups,work_groups +WorkLogFieldMappings,work_log_field_mappings +WorkRequesterAccountId,work_requester_account_id +WorkUnitId,work_unit_id +WorkUnitIdMax,work_unit_id_max +WorkUnitIdMin,work_unit_id_min +WorkUnitRange,work_unit_range +WorkUnitRanges,work_unit_ranges +WorkUnitToken,work_unit_token +WorkUnitsExecutedCount,work_units_executed_count +WorkUnitsGeneratedCount,work_units_generated_count +WorkUnitsNotReadyYetException,work_units_not_ready_yet_exception +Worker,worker +WorkerBlock,worker_block +WorkerBlocks,worker_blocks +WorkerConfiguration,worker_configuration +WorkerConfigurationDescription,worker_configuration_description +WorkerConfigurationRevisionDescription,worker_configuration_revision_description +WorkerConfigurationRevisionSummary,worker_configuration_revision_summary +WorkerConfigurationSummary,worker_configuration_summary +WorkerFleet,worker_fleet +WorkerId,worker_id +WorkerIds,worker_ids +WorkerLogDelivery,worker_log_delivery +WorkerLogDeliveryDescription,worker_log_delivery_description +WorkerLogs,worker_logs +WorkerResourceConfig,worker_resource_config +WorkerType,worker_type +WorkerTypeSpecification,worker_type_specification +WorkerTypeSpecificationInput,worker_type_specification_input +Workflow,workflow +WorkflowAttributes,workflow_attributes +WorkflowDetail,workflow_detail +WorkflowDetails,workflow_details +WorkflowExecution,workflow_execution +WorkflowExecutionAlreadyStartedFault,workflow_execution_already_started_fault +WorkflowExecutionCancelRequestedEventAttributes,workflow_execution_cancel_requested_event_attributes +WorkflowExecutionCanceledEventAttributes,workflow_execution_canceled_event_attributes +WorkflowExecutionCompletedEventAttributes,workflow_execution_completed_event_attributes +WorkflowExecutionConfiguration,workflow_execution_configuration +WorkflowExecutionContinuedAsNewEventAttributes,workflow_execution_continued_as_new_event_attributes +WorkflowExecutionCount,workflow_execution_count +WorkflowExecutionDetail,workflow_execution_detail +WorkflowExecutionFailedEventAttributes,workflow_execution_failed_event_attributes +WorkflowExecutionFilter,workflow_execution_filter +WorkflowExecutionInfo,workflow_execution_info +WorkflowExecutionInfos,workflow_execution_infos +WorkflowExecutionMetadata,workflow_execution_metadata +WorkflowExecutionOpenCounts,workflow_execution_open_counts +WorkflowExecutionSignaledEventAttributes,workflow_execution_signaled_event_attributes +WorkflowExecutionStartedEventAttributes,workflow_execution_started_event_attributes +WorkflowExecutionTerminatedEventAttributes,workflow_execution_terminated_event_attributes +WorkflowExecutionTimedOutEventAttributes,workflow_execution_timed_out_event_attributes +WorkflowGraph,workflow_graph +WorkflowId,workflow_id +WorkflowListItem,workflow_list_item +WorkflowMetrics,workflow_metrics +WorkflowName,workflow_name +WorkflowParameter,workflow_parameter +WorkflowRun,workflow_run +WorkflowRunId,workflow_run_id +WorkflowRunProperties,workflow_run_properties +WorkflowRunStatistics,workflow_run_statistics +WorkflowState,workflow_state +WorkflowStatus,workflow_status +WorkflowStep,workflow_step +WorkflowStepAutomationConfiguration,workflow_step_automation_configuration +WorkflowStepGroupSummary,workflow_step_group_summary +WorkflowStepItem,workflow_step_item +WorkflowStepMetadata,workflow_step_metadata +WorkflowStepOutput,workflow_step_output +WorkflowStepSummary,workflow_step_summary +WorkflowToken,workflow_token +WorkflowType,workflow_type +WorkflowTypeConfiguration,workflow_type_configuration +WorkflowTypeDetail,workflow_type_detail +WorkflowTypeFilter,workflow_type_filter +WorkflowTypeInfo,workflow_type_info +WorkflowTypeInfos,workflow_type_infos +WorkflowUpdate,workflow_update +Workflows,workflows +Workforce,workforce +WorkforceArn,workforce_arn +WorkforceName,workforce_name +WorkforceVpcConfig,workforce_vpc_config +WorkforceVpcConfigRequest,workforce_vpc_config_request +WorkforceVpcConfigResponse,workforce_vpc_config_response +Workforces,workforces +Workgroup,workgroup +WorkgroupName,workgroup_name +WorkingDirectory,working_directory +WorkingStorageAllocatedInBytes,working_storage_allocated_in_bytes +WorkingStorageUsedInBytes,working_storage_used_in_bytes +Workload,workload +WorkloadArn,workload_arn +WorkloadConfiguration,workload_configuration +WorkloadDiscoveryConfig,workload_discovery_config +WorkloadId,workload_id +WorkloadList,workload_list +WorkloadName,workload_name +WorkloadNamePrefix,workload_name_prefix +WorkloadProfile,workload_profile +WorkloadRemarks,workload_remarks +WorkloadResourceDefinition,workload_resource_definition +WorkloadShare,workload_share +WorkloadShareSummaries,workload_share_summaries +WorkloadShareSummary,workload_share_summary +WorkloadSummaries,workload_summaries +WorkloadSummary,workload_summary +WorkloadType,workload_type +WorkmailAction,workmail_action +Workspace,workspace +WorkspaceAccessProperties,workspace_access_properties +WorkspaceBundle,workspace_bundle +WorkspaceConnectionStatus,workspace_connection_status +WorkspaceCreationProperties,workspace_creation_properties +WorkspaceDescription,workspace_description +WorkspaceDirectory,workspace_directory +WorkspaceId,workspace_id +WorkspaceIds,workspace_ids +WorkspaceImage,workspace_image +WorkspaceProperties,workspace_properties +WorkspaceRequest,workspace_request +WorkspaceSecurityGroupId,workspace_security_group_id +WorkspaceSettings,workspace_settings +WorkspaceState,workspace_state +WorkspaceStatus,workspace_status +WorkspaceSummary,workspace_summary +Workspaces,workspaces +WorkspacesConnectionStatus,workspaces_connection_status +WorkspacesDefaultRoleNotFoundException,workspaces_default_role_not_found_exception +WorkspacesIpGroup,workspaces_ip_group +Workteam,workteam +WorkteamArn,workteam_arn +WorkteamName,workteam_name +Workteams,workteams +WorldConfig,world_config +WorldCount,world_count +WorldExportJobSummary,world_export_job_summary +WorldFailure,world_failure +WorldGenerationJobSummary,world_generation_job_summary +WorldSummary,world_summary +Worm,worm +Wrap,wrap +WrappedKey,wrapped_key +WrappedKeyBlock,wrapped_key_block +WrappedKeyMaterialFormat,wrapped_key_material_format +WrappingAlgorithm,wrapping_algorithm +WrappingKeyAlgorithm,wrapping_key_algorithm +WrappingKeyArn,wrapping_key_arn +WrappingKeyCertificate,wrapping_key_certificate +WrappingKeyCertificateChain,wrapping_key_certificate_chain +WrappingKeyIdentifier,wrapping_key_identifier +WrappingKeySpec,wrapping_key_spec +Write,write +WriteAccessPrincipalArns,write_access_principal_arns +WriteApplicationSettingsRequest,write_application_settings_request +WriteAttributes,write_attributes +WriteBufferSize,write_buffer_size +WriteCampaignRequest,write_campaign_request +WriteCapacityUnits,write_capacity_units +WriteDashManifest,write_dash_manifest +WriteEventStream,write_event_stream +WriteGetObjectResponseRequest,write_get_object_response_request +WriteHeader,write_header +WriteHlsManifest,write_hls_manifest +WriteIOs,write_ios +WriteJourneyRequest,write_journey_request +WriteManifest,write_manifest +WriteMp4PackagingType,write_mp4_packaging_type +WriteOperation,write_operation +WriteOperations,write_operations +WriteRecordsRequest,write_records_request +WriteRecordsResponse,write_records_response +WriteRequest,write_request +WriteSegmentRequest,write_segment_request +WriteSegmentTimelineInRepresentation,write_segment_timeline_in_representation +WriteTreatmentResource,write_treatment_resource +WriterVersion,writer_version +X,x +XAttributeName,x_attribute_name +XAxis,x_axis +XAxisDisplayOptions,x_axis_display_options +XAxisLabelOptions,x_axis_label_options +XAxisLocation,x_axis_location +XMLClassifier,xml_classifier +XPosition,x_position +XRayErrorPercent,x_ray_error_percent +XRayFaultPercent,x_ray_fault_percent +XRayNodeName,x_ray_node_name +XRayNodeType,x_ray_node_type +XRayRequestAverageLatency,x_ray_request_average_latency +XRayRequestCount,x_ray_request_count +XRayThrottlePercent,x_ray_throttle_percent +XSSProtection,xss_protection +Xavc4kIntraCbgProfileSettings,xavc4k_intra_cbg_profile_settings +Xavc4kIntraVbrProfileSettings,xavc4k_intra_vbr_profile_settings +Xavc4kProfileSettings,xavc4k_profile_settings +XavcClass,xavc_class +XavcHdIntraCbgProfileSettings,xavc_hd_intra_cbg_profile_settings +XavcHdProfileSettings,xavc_hd_profile_settings +XavcProfileSettings,xavc_profile_settings +XavcSettings,xavc_settings +XksKeyAlreadyInUseException,xks_key_already_in_use_exception +XksKeyConfiguration,xks_key_configuration +XksKeyConfigurationType,xks_key_configuration_type +XksKeyId,xks_key_id +XksKeyInvalidConfigurationException,xks_key_invalid_configuration_exception +XksKeyNotFoundException,xks_key_not_found_exception +XksProxyAuthenticationCredential,xks_proxy_authentication_credential +XksProxyAuthenticationCredentialType,xks_proxy_authentication_credential_type +XksProxyConfiguration,xks_proxy_configuration +XksProxyConfigurationType,xks_proxy_configuration_type +XksProxyConnectivity,xks_proxy_connectivity +XksProxyIncorrectAuthenticationCredentialException,xks_proxy_incorrect_authentication_credential_exception +XksProxyInvalidConfigurationException,xks_proxy_invalid_configuration_exception +XksProxyInvalidResponseException,xks_proxy_invalid_response_exception +XksProxyUriEndpoint,xks_proxy_uri_endpoint +XksProxyUriEndpointInUseException,xks_proxy_uri_endpoint_in_use_exception +XksProxyUriInUseException,xks_proxy_uri_in_use_exception +XksProxyUriPath,xks_proxy_uri_path +XksProxyUriUnreachableException,xks_proxy_uri_unreachable_exception +XksProxyVpcEndpointServiceInUseException,xks_proxy_vpc_endpoint_service_in_use_exception +XksProxyVpcEndpointServiceInvalidConfigurationException,xks_proxy_vpc_endpoint_service_invalid_configuration_exception +XksProxyVpcEndpointServiceName,xks_proxy_vpc_endpoint_service_name +XksProxyVpcEndpointServiceNotFoundException,xks_proxy_vpc_endpoint_service_not_found_exception +XrayEnabled,xray_enabled +XssMatchSet,xss_match_set +XssMatchSetId,xss_match_set_id +XssMatchSetSummary,xss_match_set_summary +XssMatchSetUpdate,xss_match_set_update +XssMatchSets,xss_match_sets +XssMatchStatement,xss_match_statement +XssMatchTuple,xss_match_tuple +XssMatchTuples,xss_match_tuples +Y,y +YAttributeName,y_attribute_name +YAxis,y_axis +YAxisDisplayOptions,y_axis_display_options +YAxisLabelOptions,y_axis_label_options +YAxisLocation,y_axis_location +YPosition,y_position +YarnEndpointAddress,yarn_endpoint_address +Yaw,yaw +Years,years +YesVoteCount,yes_vote_count +Z,z +Zendesk,zendesk +ZendeskConnectorProfileCredentials,zendesk_connector_profile_credentials +ZendeskConnectorProfileProperties,zendesk_connector_profile_properties +ZendeskDestinationProperties,zendesk_destination_properties +ZendeskMetadata,zendesk_metadata +ZendeskSourceProperties,zendesk_source_properties +ZeppelinApplicationConfiguration,zeppelin_application_configuration +ZeppelinApplicationConfigurationDescription,zeppelin_application_configuration_description +ZeppelinApplicationConfigurationUpdate,zeppelin_application_configuration_update +ZeppelinMonitoringConfiguration,zeppelin_monitoring_configuration +ZeppelinMonitoringConfigurationDescription,zeppelin_monitoring_configuration_description +ZeppelinMonitoringConfigurationUpdate,zeppelin_monitoring_configuration_update +ZeppelinRemoteSparkInterpreterPort,zeppelin_remote_spark_interpreter_port +ZipCode,zip_code +ZipFile,zip_file +ZipFileContent,zip_file_content +ZipFileContentUpdate,zip_file_content_update +ZonalShift,zonal_shift +ZonalShiftInResource,zonal_shift_in_resource +ZonalShiftSummary,zonal_shift_summary +ZonalStatisticsConfigInput,zonal_statistics_config_input +Zone,zone +ZoneAwarenessConfig,zone_awareness_config +ZoneAwarenessEnabled,zone_awareness_enabled +ZoneId,zone_id +ZoneIdentity,zone_identity +ZoneIds,zone_ids +ZoneName,zone_name +ZoneNames,zone_names +ZoneS3Path,zone_s3_path +ZoneS3PathKmsKeyId,zone_s3_path_kms_key_id +ZoneStatus,zone_status +ZoneType,zone_type +ZookeeperConnectString,zookeeper_connect_string +ZookeeperConnectStringTls,zookeeper_connect_string_tls +ZookeeperId,zookeeper_id +ZookeeperNodeInfo,zookeeper_node_info +ZookeeperVersion,zookeeper_version +abandon,abandon +abilities,abilities +ableToUpdateBundle,able_to_update_bundle +abortConfig,abort_config +abortCriteriaList,abort_criteria_list +abortStatement,abort_statement +aborted,aborted +aboutText,about_text +absolutePath,absolute_path +acceleratorHealth,accelerator_health +acceleratorId,accelerator_id +acceleratorIds,accelerator_ids +acceleratorSet,accelerator_set +acceleratorType,accelerator_type +acceleratorTypeName,accelerator_type_name +acceleratorTypeOfferings,accelerator_type_offerings +acceleratorTypes,accelerator_types +accelerators,accelerators +accept,accept +acceptDate,accept_date +acceptRanges,accept_ranges +acceptedAt,accepted_at +acceptedBy,accepted_by +acceptedFileTypes,accepted_file_types +acceptedMediaTypes,accepted_media_types +acceptedQueryCount,accepted_query_count +accepteeId,acceptee_id +accepts,accepts +access,access +accessControlList,access_control_list +accessDetails,access_details +accessDirection,access_direction +accessFrom,access_from +accessKey,access_key +accessKeyId,access_key_id +accessKeys,access_keys +accessLevel,access_level +accessLog,access_log +accessLogConfig,access_log_config +accessLogSettings,access_log_settings +accessLogSubscriptionIdentifier,access_log_subscription_identifier +accessPoint,access_point +accessPointAccount,access_point_account +accessPointArn,access_point_arn +accessPointId,access_point_id +accessPointPolicy,access_point_policy +accessPoints,access_points +accessPolicy,access_policy +accessPolicyArn,access_policy_arn +accessPolicyCreationDate,access_policy_creation_date +accessPolicyDetail,access_policy_detail +accessPolicyId,access_policy_id +accessPolicyIdentity,access_policy_identity +accessPolicyLastUpdateDate,access_policy_last_update_date +accessPolicyPermission,access_policy_permission +accessPolicyResource,access_policy_resource +accessPolicySummaries,access_policy_summaries +accessPreview,access_preview +accessPreviewId,access_preview_id +accessPreviews,access_previews +accessRole,access_role +accessRules,access_rules +accessToken,access_token +accessTokenId,access_token_id +accessType,access_type +accessTypes,access_types +account,account +accountAccessType,account_access_type +accountAggregation,account_aggregation +accountAlias,account_alias +accountEnrollmentStatuses,account_enrollment_statuses +accountID,account_id +accountId,account_id +accountIdentifiers,account_identifiers +accountIds,account_ids +accountLevelBpaSync,account_level_bpa_sync +accountLevelPermissions,account_level_permissions +accountList,account_list +accountName,account_name +accountPolicies,account_policies +accountPolicy,account_policy +accountSettings,account_settings +accountSettingsDetail,account_settings_detail +accountStatus,account_status +accountType,account_type +accounts,accounts +accountsCleanup,accounts_cleanup +accountsWithProvisionedRestoreAccess,accounts_with_provisioned_restore_access +accountsWithRestoreAccess,accounts_with_restore_access +achievableRpoInSecs,achievable_rpo_in_secs +achievableRtoInSecs,achievable_rto_in_secs +acknowledgeActionConfiguration,acknowledge_action_configuration +acknowledgeActionRequests,acknowledge_action_requests +acknowledgeFlow,acknowledge_flow +acknowledgment,acknowledgment +acknowledgmentStatus,acknowledgment_status +action,action +actionArn,action_arn +actionCode,action_code +actionConfiguration,action_configuration +actionConfigurationProperties,action_configuration_properties +actionExecutionDetails,action_execution_details +actionExecutionId,action_execution_id +actionGroup,action_group +actionID,action_id +actionIDs,action_ids +actionId,action_id +actionIdentifiers,action_identifiers +actionIds,action_ids +actionName,action_name +actionOnTimeout,action_on_timeout +actionOwnerFilter,action_owner_filter +actionParams,action_params +actionPlanInstructions,action_plan_instructions +actionPlanTitle,action_plan_title +actionRevision,action_revision +actionStates,action_states +actionStatus,action_status +actionTaken,action_taken +actionType,action_type +actionTypeId,action_type_id +actionTypes,action_types +actionVersion,action_version +actions,actions +actionsDefinition,actions_definition +actionsExecuted,actions_executed +actionsExecutions,actions_executions +actionsFailed,actions_failed +actionsSkipped,actions_skipped +activateCaseSensitiveIdentifier,activate_case_sensitive_identifier +activateDeepInspection,activate_deep_inspection +activationCode,activation_code +activationExpiry,activation_expiry +activationId,activation_id +activationJobs,activation_jobs +active,active +activeAgentlessCollectors,active_agentless_collectors +activeAgents,active_agents +activeAssessmentsCount,active_assessments_count +activeConnectors,active_connectors +activeContexts,active_contexts +activeDirectory,active_directory +activeDirectoryUser,active_directory_user +activeExperimentCount,active_experiment_count +activeFromTimestamp,active_from_timestamp +activeJobId,active_job_id +activeLaunchCount,active_launch_count +activeMeCollectors,active_me_collectors +activeNames,active_names +activeServicesCount,active_services_count +activeSessionId,active_session_id +activeUntilTimestamp,active_until_timestamp +activeViolations,active_violations +activities,activities +activityArn,activity_arn +activityFailedEventDetails,activity_failed_event_details +activityId,activity_id +activityScheduleFailedEventDetails,activity_schedule_failed_event_details +activityScheduledEventDetails,activity_scheduled_event_details +activityStartedEventDetails,activity_started_event_details +activitySucceededEventDetails,activity_succeeded_event_details +activityTaskCancelRequestedEventAttributes,activity_task_cancel_requested_event_attributes +activityTaskCanceledEventAttributes,activity_task_canceled_event_attributes +activityTaskCompletedEventAttributes,activity_task_completed_event_attributes +activityTaskFailedEventAttributes,activity_task_failed_event_attributes +activityTaskScheduledEventAttributes,activity_task_scheduled_event_attributes +activityTaskStartedEventAttributes,activity_task_started_event_attributes +activityTaskTimedOutEventAttributes,activity_task_timed_out_event_attributes +activityTimedOutEventDetails,activity_timed_out_event_details +activityType,activity_type +actor,actor +actorArn,actor_arn +actualAgentPrompt,actual_agent_prompt +actualCapacity,actual_capacity +actualElicitedSlot,actual_elicited_slot +actualIncrementalBackupSizeInMegaBytes,actual_incremental_backup_size_in_mega_bytes +actualIntent,actual_intent +actualOutput,actual_output +actualReferenceId,actual_reference_id +actualValue,actual_value +add,add +addAllowedPrefixesToDirectConnectGateway,add_allowed_prefixes_to_direct_connect_gateway +addAttributes,add_attributes +addColumns,add_columns +addGroupOwner,add_group_owner +addMetrics,add_metrics +addOnRequest,add_on_request +addOnType,add_on_type +addOns,add_ons +addOrUpdateLabels,add_or_update_labels +addOrUpdateTaints,add_or_update_taints +addOrUpdateVariations,add_or_update_variations +addSecurityGroupIds,add_security_group_ids +addSubnetIds,add_subnet_ids +addThingsToThingGroupParams,add_things_to_thing_group_params +addedToServiceDateTime,added_to_service_date_time +additionalAllowedHeaders,additional_allowed_headers +additionalAttributeNames,additional_attribute_names +additionalAuthenticationProviders,additional_authentication_providers +additionalContext,additional_context +additionalData,additional_data +additionalDeploymentStatusInfo,additional_deployment_status_info +additionalEncryptionContext,additional_encryption_context +additionalExposedHeaders,additional_exposed_headers +additionalFixedProperties,additional_fixed_properties +additionalInfo,additional_info +additionalInstanceConfiguration,additional_instance_configuration +additionalMessage,additional_message +additionalMetricsToRetain,additional_metrics_to_retain +additionalMetricsToRetainV2,additional_metrics_to_retain_v2 +additionalOccurrences,additional_occurrences +additionalParameters,additional_parameters +additionalParamsForNs,additional_params_for_ns +additionalTransientProperties,additional_transient_properties +addon,addon +addonArn,addon_arn +addonName,addon_name +addonVersion,addon_version +addonVersions,addon_versions +addons,addons +address,address +addressFamily,address_family +adds,adds +adjustedCvss,adjusted_cvss +adjustments,adjustments +admin,admin +adminAccountId,admin_account_id +adminAccounts,admin_accounts +adminRoleArn,admin_role_arn +adminUserName,admin_user_name +adminUserPassword,admin_user_password +adminUsername,admin_username +administrator,administrator +administratorAccount,administrator_account +administratorAccountId,administrator_account_id +adr,adr +adsApplicationConfigurationId,ads_application_configuration_id +adsApplicationConfigurationName,ads_application_configuration_name +adsApplicationName,ads_application_name +advancedRecognitionSetting,advanced_recognition_setting +affectedAccounts,affected_accounts +affectedImages,affected_images +affectedInstances,affected_instances +afterBlob,after_blob +afterBlobId,after_blob_id +afterCommitId,after_commit_id +afterCommitSpecifier,after_commit_specifier +afterPath,after_path +afterTime,after_time +agent,agent +agentConnected,agent_connected +agentCpuCores,agent_cpu_cores +agentDetails,agent_details +agentHash,agent_hash +agentHealth,agent_health +agentHealthCode,agent_health_code +agentHealthCodes,agent_health_codes +agentHealthDetails,agent_health_details +agentHealths,agent_healths +agentId,agent_id +agentIds,agent_ids +agentLastSeenByServiceDateTime,agent_last_seen_by_service_date_time +agentNetworkInfoList,agent_network_info_list +agentOrchestrationConfig,agent_orchestration_config +agentParameters,agent_parameters +agentPreviews,agent_previews +agentProfile,agent_profile +agentPrompt,agent_prompt +agentStatus,agent_status +agentSummary,agent_summary +agentTurn,agent_turn +agentType,agent_type +agentUpdateStatus,agent_update_status +agentVersion,agent_version +agentlessCollectorSummary,agentless_collector_summary +agents,agents +agentsConfigurationStatus,agents_configuration_status +agentsInfo,agents_info +agentsTruncated,agents_truncated +aggregateColumns,aggregate_columns +aggregateField,aggregate_field +aggregateStatus,aggregate_status +aggregateTypes,aggregate_types +aggregateValue,aggregate_value +aggregatedUtterancesSummaries,aggregated_utterances_summaries +aggregatedValues,aggregated_values +aggregatedVariablesImpactExplanations,aggregated_variables_impact_explanations +aggregatedVariablesImportance,aggregated_variables_importance +aggregatedVariablesImportanceMetrics,aggregated_variables_importance_metrics +aggregationConfig,aggregation_config +aggregationDuration,aggregation_duration +aggregationField,aggregation_field +aggregationLastRefreshedDateTime,aggregation_last_refreshed_date_time +aggregationRequest,aggregation_request +aggregationType,aggregation_type +aggregationWindowEndTime,aggregation_window_end_time +aggregationWindowStartTime,aggregation_window_start_time +agreementName,agreement_name +agreements,agreements +alarm,alarm +alarmActions,alarm_actions +alarmCapabilities,alarm_capabilities +alarmConfiguration,alarm_configuration +alarmEventActions,alarm_event_actions +alarmModelArn,alarm_model_arn +alarmModelDescription,alarm_model_description +alarmModelName,alarm_model_name +alarmModelSummaries,alarm_model_summaries +alarmModelVersion,alarm_model_version +alarmModelVersionSummaries,alarm_model_version_summaries +alarmName,alarm_name +alarmNames,alarm_names +alarmNotification,alarm_notification +alarmRecommendations,alarm_recommendations +alarmRoleArn,alarm_role_arn +alarmRule,alarm_rule +alarmState,alarm_state +alarmSummaries,alarm_summaries +alarms,alarms +alertManagerDefinition,alert_manager_definition +alertTargetArn,alert_target_arn +alertTargets,alert_targets +alerts,alerts +algorithm,algorithm +algorithmArn,algorithm_arn +algorithmHyperParameterRanges,algorithm_hyper_parameter_ranges +algorithmHyperParameters,algorithm_hyper_parameters +algorithmImage,algorithm_image +algorithmSpecification,algorithm_specification +alias,alias +aliasPrefix,alias_prefix +aliases,aliases +alignment,alignment +all,all +allColumns,all_columns +allMatchesCount,all_matches_count +allMatchesSum,all_matches_sum +allRegions,all_regions +allSupported,all_supported +allocationStrategy,allocation_strategy +allowAudioInput,allow_audio_input +allowAuthorizerOverride,allow_authorizer_override +allowAutoRegistration,allow_auto_registration +allowCleartext,allow_cleartext +allowConstraintErrors,allow_constraint_errors +allowDTMFInput,allow_dtmf_input +allowDuplicates,allow_duplicates +allowExternalPrincipals,allow_external_principals +allowFleet,allow_fleet +allowImageBuilder,allow_image_builder +allowInterrupt,allow_interrupt +allowJoinsOnColumnsWithDifferentNames,allow_joins_on_columns_with_different_names +allowListIds,allow_list_ids +allowLists,allow_lists +allowMultipleValues,allow_multiple_values +allowOrganizationMemberAccount,allow_organization_member_account +allowOverwrite,allow_overwrite +allowPublicOverrides,allow_public_overrides +allowed,allowed +allowedAccounts,allowed_accounts +allowedAnalyses,allowed_analyses +allowedAnalysisProviders,allowed_analysis_providers +allowedColumns,allowed_columns +allowedHTTPMethods,allowed_http_methods +allowedInputTypes,allowed_input_types +allowedJoinOperators,allowed_join_operators +allowedOrganizations,allowed_organizations +allowedPrefixesToDirectConnectGateway,allowed_prefixes_to_direct_connect_gateway +allowedValues,allowed_values +allowlist,allowlist +allowsHostedConnections,allows_hosted_connections +allowsPublicReadAccess,allows_public_read_access +allowsPublicWriteAccess,allows_public_write_access +allowsUnencryptedObjectUploads,allows_unencrypted_object_uploads +alreadyImplemented,already_implemented +alternateKeys,alternate_keys +alternativeDomainNames,alternative_domain_names +alternativeIntents,alternative_intents +amazonAddress,amazon_address +amazonSideAsn,amazon_side_asn +ami,ami +amiDistributionConfiguration,ami_distribution_configuration +amiId,ami_id +amiLaunchIndex,ami_launch_index +amiTags,ami_tags +amiType,ami_type +amis,amis +amount,amount +amznErrorType,amzn_error_type +analysisCompleteTime,analysis_complete_time +analysisId,analysis_id +analysisMethod,analysis_method +analysisParameters,analysis_parameters +analysisResults,analysis_results +analysisRule,analysis_rule +analysisRulePolicy,analysis_rule_policy +analysisRuleType,analysis_rule_type +analysisRuleTypes,analysis_rule_types +analysisStatus,analysis_status +analysisTemplate,analysis_template +analysisTemplateArn,analysis_template_arn +analysisTemplateArns,analysis_template_arns +analysisTemplateIdentifier,analysis_template_identifier +analysisTemplateSummaries,analysis_template_summaries +analysisType,analysis_type +analyzedAt,analyzed_at +analyzedResources,analyzed_resources +analyzer,analyzer +analyzerArn,analyzer_arn +analyzerName,analyzer_name +analyzers,analyzers +anchor,anchor +and,and +androidPaths,android_paths +annotationFields,annotation_fields +annotationImportJobs,annotation_import_jobs +annotationStoreVersions,annotation_store_versions +annotationStores,annotation_stores +annotationType,annotation_type +anomalies,anomalies +anomalyInstanceId,anomaly_instance_id +answerMachineDetectionConfig,answer_machine_detection_config +antennaUplinkConfigArn,antenna_uplink_config_arn +antiPatternReportS3Object,anti_pattern_report_s3_object +antipatternReportResultList,antipattern_report_result_list +antipatternReportS3Object,antipattern_report_s3_object +antipatternReportStatus,antipattern_report_status +antipatternReportStatusMessage,antipattern_report_status_message +apacheKafkaCluster,apache_kafka_cluster +api,api +apiAccess,api_access +apiAccessPrincipalArn,api_access_principal_arn +apiAssociation,api_association +apiCache,api_cache +apiCachingBehavior,api_caching_behavior +apiCallDateTime,api_call_date_time +apiCallDetails,api_call_details +apiConfiguration,api_configuration +apiId,api_id +apiKey,api_key +apiKeyRequired,api_key_required +apiKeySource,api_key_source +apiKeyVersion,api_key_version +apiKeys,api_keys +apiMode,api_mode +apiSecretKey,api_secret_key +apiServiceName,api_service_name +apiStages,api_stages +apiSummary,api_summary +apiToken,api_token +apiType,api_type +apiVersion,api_version +app,app +appArn,app_arn +appAuthorization,app_authorization +appAuthorizationArn,app_authorization_arn +appAuthorizationIdentifier,app_authorization_identifier +appAuthorizationSummary,app_authorization_summary +appAuthorizationSummaryList,app_authorization_summary_list +appBundle,app_bundle +appBundleArn,app_bundle_arn +appBundleIdentifier,app_bundle_identifier +appBundleSummaryList,app_bundle_summary_list +appCategory,app_category +appComponent,app_component +appComponentName,app_component_name +appComponentNames,app_component_names +appComponents,app_components +appConfigResource,app_config_resource +appId,app_id +appIdClientRegex,app_id_client_regex +appIds,app_ids +appInputSource,app_input_source +appInputSources,app_input_sources +appIntegrationArn,app_integration_arn +appPackagesCleanup,app_packages_cleanup +appProtocol,app_protocol +appRegistryAppName,app_registry_app_name +appRegistryAppNames,app_registry_app_names +appSpecContent,app_spec_content +appSummaries,app_summaries +appSummary,app_summary +appTemplateBody,app_template_body +appType,app_type +appUnitError,app_unit_error +appUnitErrorCategory,app_unit_error_category +appUpload,app_upload +appValidationConfigurations,app_validation_configurations +appValidationOutput,app_validation_output +appValidationStrategy,app_validation_strategy +appVersion,app_version +appVersions,app_versions +application,application +applicationAggregatedStatus,application_aggregated_status +applicationArn,application_arn +applicationCallBackURL,application_call_back_url +applicationComponentCriteria,application_component_criteria +applicationComponentDetail,application_component_detail +applicationComponentId,application_component_id +applicationComponentInfos,application_component_infos +applicationComponentStrategies,application_component_strategies +applicationComponentStrategySummary,application_component_strategy_summary +applicationConfiguration,application_configuration +applicationConfigurationId,application_configuration_id +applicationCreationDate,application_creation_date +applicationDescription,application_description +applicationHostUrl,application_host_url +applicationID,application_id +applicationIDs,application_ids +applicationId,application_id +applicationImportFailure,application_import_failure +applicationImportSuccess,application_import_success +applicationKey,application_key +applicationLastUpdateDate,application_last_update_date +applicationMode,application_mode +applicationName,application_name +applicationNames,application_names +applicationPermissions,application_permissions +applicationPort,application_port +applicationPreferences,application_preferences +applicationServicePath,application_service_path +applicationState,application_state +applicationSummaries,application_summaries +applicationType,application_type +applicationUrl,application_url +applicationVersion,application_version +applicationVersions,application_versions +applications,applications +applicationsCount,applications_count +applicationsInfo,applications_info +appliedRulePriority,applied_rule_priority +appliedScanFilters,applied_scan_filters +appliedStatus,applied_status +appliedWeights,applied_weights +applyDuringMaintenanceWindow,apply_during_maintenance_window +applyImmediately,apply_immediately +applyMethod,apply_method +applyNormalization,apply_normalization +applyType,apply_type +approvalRule,approval_rule +approvalRuleContent,approval_rule_content +approvalRuleEventMetadata,approval_rule_event_metadata +approvalRuleId,approval_rule_id +approvalRuleName,approval_rule_name +approvalRuleOverriddenEventMetadata,approval_rule_overridden_event_metadata +approvalRuleTemplate,approval_rule_template +approvalRuleTemplateContent,approval_rule_template_content +approvalRuleTemplateDescription,approval_rule_template_description +approvalRuleTemplateId,approval_rule_template_id +approvalRuleTemplateName,approval_rule_template_name +approvalRuleTemplateNames,approval_rule_template_names +approvalRules,approval_rules +approvalRulesNotSatisfied,approval_rules_not_satisfied +approvalRulesSatisfied,approval_rules_satisfied +approvalState,approval_state +approvalStateChangedEventMetadata,approval_state_changed_event_metadata +approvalStatus,approval_status +approvals,approvals +approved,approved +approvedAt,approved_at +approximateNumberOfObjectsToProcess,approximate_number_of_objects_to_process +approximateSecondsBeforeTimedOut,approximate_seconds_before_timed_out +apps,apps +appsyncDomainName,appsync_domain_name +arch,arch +architecture,architecture +architectures,architectures +archiveDescription,archive_description +archiveId,archive_id +archiveRule,archive_rule +archiveRules,archive_rules +archiveSize,archive_size +archived,archived +args,args +arguments,arguments +arn,arn +arns,arns +arrayBaseColumnType,array_base_column_type +arrayJobId,array_job_id +arrayProperties,array_properties +artifactCredentials,artifact_credentials +artifactFileName,artifact_file_name +artifactId,artifact_id +artifactIdentifier,artifact_identifier +artifactMediaType,artifact_media_type +artifactName,artifact_name +artifactRevisions,artifact_revisions +artifactStore,artifact_store +artifactStores,artifact_stores +artifactUrl,artifact_url +artifacts,artifacts +artifactsOverride,artifacts_override +artifactsUrl,artifacts_url +asOfTimestamp,as_of_timestamp +ascendingOrder,ascending_order +asi,asi +asn,asn +asnOrg,asn_org +assertionAttributes,assertion_attributes +assessment,assessment +assessmentArn,assessment_arn +assessmentControlsCountByNoncompliantEvidence,assessment_controls_count_by_noncompliant_evidence +assessmentDescription,assessment_description +assessmentFrameworkShareRequest,assessment_framework_share_request +assessmentFrameworkShareRequests,assessment_framework_share_requests +assessmentId,assessment_id +assessmentMetadata,assessment_metadata +assessmentName,assessment_name +assessmentReport,assessment_report +assessmentReportEvidenceCount,assessment_report_evidence_count +assessmentReportId,assessment_report_id +assessmentReportSelection,assessment_report_selection +assessmentReportSelectionCount,assessment_report_selection_count +assessmentReports,assessment_reports +assessmentReportsDestination,assessment_reports_destination +assessmentRunAgents,assessment_run_agents +assessmentRunArn,assessment_run_arn +assessmentRunArns,assessment_run_arns +assessmentRunArnsTruncated,assessment_run_arns_truncated +assessmentRunCount,assessment_run_count +assessmentRunName,assessment_run_name +assessmentRuns,assessment_runs +assessmentSchedule,assessment_schedule +assessmentStatus,assessment_status +assessmentSummaries,assessment_summaries +assessmentSummary,assessment_summary +assessmentTargetArn,assessment_target_arn +assessmentTargetArns,assessment_target_arns +assessmentTargetName,assessment_target_name +assessmentTargetNamePattern,assessment_target_name_pattern +assessmentTargets,assessment_targets +assessmentTemplateArn,assessment_template_arn +assessmentTemplateArns,assessment_template_arns +assessmentTemplateName,assessment_template_name +assessmentTemplates,assessment_templates +asset,asset +assetArn,asset_arn +assetAttributes,asset_attributes +assetCompositeModelId,asset_composite_model_id +assetCompositeModels,asset_composite_models +assetContent,asset_content +assetCreationDate,asset_creation_date +assetDescription,asset_description +assetHierarchies,asset_hierarchies +assetId,asset_id +assetIds,asset_ids +assetLastUpdateDate,asset_last_update_date +assetModelArn,asset_model_arn +assetModelCompositeModelId,asset_model_composite_model_id +assetModelCompositeModels,asset_model_composite_models +assetModelCreationDate,asset_model_creation_date +assetModelDescription,asset_model_description +assetModelHierarchies,asset_model_hierarchies +assetModelId,asset_model_id +assetModelLastUpdateDate,asset_model_last_update_date +assetModelName,asset_model_name +assetModelProperties,asset_model_properties +assetModelPropertySummaries,asset_model_property_summaries +assetModelStatus,asset_model_status +assetModelSummaries,asset_model_summaries +assetName,asset_name +assetProperties,asset_properties +assetProperty,asset_property +assetPropertySummaries,asset_property_summaries +assetPropertyValue,asset_property_value +assetPropertyValueHistory,asset_property_value_history +assetRelationshipSummaries,asset_relationship_summaries +assetSHA256,asset_sha256 +assetSizeBytes,asset_size_bytes +assetStatus,asset_status +assetSummaries,asset_summaries +assetType,asset_type +assets,assets +assignPublicIp,assign_public_ip +assignedLabel,assigned_label +assignedValue,assigned_value +assistant,assistant +assistantArn,assistant_arn +assistantAssociation,assistant_association +assistantAssociationArn,assistant_association_arn +assistantAssociationId,assistant_association_id +assistantAssociationSummaries,assistant_association_summaries +assistantId,assistant_id +assistantSummaries,assistant_summaries +associateDefaultSecurityGroup,associate_default_security_group +associatePublicIpAddress,associate_public_ip_address +associatedApplications,associated_applications +associatedAt,associated_at +associatedClientDevices,associated_client_devices +associatedEntity,associated_entity +associatedFields,associated_fields +associatedGateway,associated_gateway +associatedGatewayId,associated_gateway_id +associatedGatewayOwnerAccount,associated_gateway_owner_account +associatedIntentName,associated_intent_name +associatedOn,associated_on +associatedPortalArns,associated_portal_arns +associatedRepositoryNames,associated_repository_names +associatedResourceCount,associated_resource_count +associatedResources,associated_resources +associatedS3Resources,associated_s3_resources +associatedServerId,associated_server_id +associatedServerIds,associated_server_ids +associatedSlotName,associated_slot_name +associatedTranscripts,associated_transcripts +associatedTranscriptsPassword,associated_transcripts_password +associatedTranscriptsUrl,associated_transcripts_url +associatedWithJob,associated_with_job +association,association +associationArn,association_arn +associationBehavior,association_behavior +associationData,association_data +associationId,association_id +associationState,association_state +associationStatus,association_status +associationTime,association_time +associationTimestamp,association_timestamp +associationType,association_type +assumedRole,assumed_role +atBlockchainInstant,at_blockchain_instant +atRestEncryptionEnabled,at_rest_encryption_enabled +ati,ati +atigData,atig_data +atodr,atodr +attachTime,attach_time +attachedDiskMapping,attached_disk_mapping +attachedObjectIdentifier,attached_object_identifier +attachedResource,attached_resource +attachedTo,attached_to +attachment,attachment +attachmentArn,attachment_arn +attachmentId,attachment_id +attachmentLinkUrl,attachment_link_url +attachmentNetworkAclConfiguration,attachment_network_acl_configuration +attachmentSet,attachment_set +attachmentSetId,attachment_set_id +attachmentState,attachment_state +attachmentType,attachment_type +attachments,attachments +attachmentsStatus,attachments_status +attemptDurationSeconds,attempt_duration_seconds +attemptId,attempt_id +attempts,attempts +attribute,attribute +attributeGroup,attribute_group +attributeGroupArn,attribute_group_arn +attributeGroups,attribute_groups +attributeGroupsDetails,attribute_groups_details +attributeKeys,attribute_keys +attributeMap,attribute_map +attributeMatchingModel,attribute_matching_model +attributeName,attribute_name +attributePartition,attribute_partition +attributePayload,attribute_payload +attributeResults,attribute_results +attributeUpdateMode,attribute_update_mode +attributeValue,attribute_value +attributes,attributes +auc,auc +audio,audio +audioAndDTMFInputSpecification,audio_and_dtmf_input_specification +audioChunk,audio_chunk +audioFileS3Location,audio_file_s3_location +audioInput,audio_input +audioLogSettings,audio_log_settings +audioRecognitionStrategy,audio_recognition_strategy +audioSpecification,audio_specification +audioStream,audio_stream +audioVoiceDurationMillis,audio_voice_duration_millis +auditCheckConfigurations,audit_check_configurations +auditCheckToActionsMapping,audit_check_to_actions_mapping +auditCheckToReasonCodeFilter,audit_check_to_reason_code_filter +auditDetails,audit_details +auditEvents,audit_events +auditNotificationTargetConfigurations,audit_notification_target_configurations +auditResults,audit_results +auditTaskId,audit_task_id +auth,auth +authCode,auth_code +authCodeUrl,auth_code_url +authCodeUrls,auth_code_urls +authDecision,auth_decision +authDefinition,auth_definition +authInfo,auth_info +authInfos,auth_infos +authKey,auth_key +authParameters,auth_parameters +authRequest,auth_request +authResults,auth_results +authTTL,auth_ttl +authType,auth_type +authUrl,auth_url +authentication,authentication +authenticationConfig,authentication_config +authenticationConfiguration,authentication_configuration +authenticationMethod,authentication_method +authenticationProviders,authentication_providers +authenticationType,authentication_type +author,author +authorArn,author_arn +authorName,author_name +authorization,authorization +authorizationApiKeyName,authorization_api_key_name +authorizationApiKeyValue,authorization_api_key_value +authorizationConfig,authorization_config +authorizationData,authorization_data +authorizationEndpoint,authorization_endpoint +authorizationScopes,authorization_scopes +authorizationToken,authorization_token +authorizationType,authorization_type +authorized,authorized +authorizerArn,authorizer_arn +authorizerConfig,authorizer_config +authorizerCredentials,authorizer_credentials +authorizerDescription,authorizer_description +authorizerFunctionArn,authorizer_function_arn +authorizerId,authorizer_id +authorizerName,authorizer_name +authorizerResultTtlInSeconds,authorizer_result_ttl_in_seconds +authorizerUri,authorizer_uri +authorizers,authorizers +autoBranchCreationConfig,auto_branch_creation_config +autoBranchCreationPatterns,auto_branch_creation_patterns +autoCompute,auto_compute +autoEnable,auto_enable +autoEnableNewAccount,auto_enable_new_account +autoGenerateForms,auto_generate_forms +autoLaunch,auto_launch +autoMLConfig,auto_ml_config +autoMLResult,auto_ml_result +autoMountStatus,auto_mount_status +autoMounting,auto_mounting +autoRegistrationStatus,auto_registration_status +autoReplicateNewDisks,auto_replicate_new_disks +autoResolve,auto_resolve +autoRollbackConfiguration,auto_rollback_configuration +autoRollbackEnabled,auto_rollback_enabled +autoScaling,auto_scaling +autoScalingConfiguration,auto_scaling_configuration +autoScalingGroup,auto_scaling_group +autoScalingGroupArn,auto_scaling_group_arn +autoScalingGroupArns,auto_scaling_group_arns +autoScalingGroupName,auto_scaling_group_name +autoScalingGroupProvider,auto_scaling_group_provider +autoScalingGroupRecommendations,auto_scaling_group_recommendations +autoScalingGroups,auto_scaling_groups +autoScalingMetric,auto_scaling_metric +autoSnapshotAddOnRequest,auto_snapshot_add_on_request +autoSnapshots,auto_snapshots +autoStartConfiguration,auto_start_configuration +autoStopConfiguration,auto_stop_configuration +autoSubDomainCreationPatterns,auto_sub_domain_creation_patterns +autoSubDomainIAMRole,auto_sub_domain_iam_role +autoUpdate,auto_update +autoUpdateOutdatedInstancesDeploymentIds,auto_update_outdated_instances_deployment_ids +autoUpdateOutdatedInstancesRootDeploymentId,auto_update_outdated_instances_root_deployment_id +automatedDiscoveryFreeTrialStartDate,automated_discovery_free_trial_start_date +automaticRenewal,automatic_renewal +automaticStopTimeMinutes,automatic_stop_time_minutes +automaticTerminationMode,automatic_termination_mode +automationExecutions,automation_executions +autoprovision,autoprovision +autotrack,autotrack +auxiliaryApps,auxiliary_apps +availability,availability +availabilityZone,availability_zone +availabilityZoneId,availability_zone_id +availabilityZoneIds,availability_zone_ids +availabilityZones,availability_zones +available,available +availableMacSecPortSpeeds,available_mac_sec_port_speeds +availablePlatforms,available_platforms +availablePortSpeeds,available_port_speeds +availableProviders,available_providers +avcLevel,avc_level +avcProfile,avc_profile +average,average +awayFrom,away_from +awsAccount,aws_account +awsAccountId,aws_account_id +awsAccountIds,aws_account_ids +awsAccountName,aws_account_name +awsAccountNumber,aws_account_number +awsAccounts,aws_accounts +awsDevice,aws_device +awsDeviceV2,aws_device_v2 +awsEc2Instance,aws_ec2_instance +awsEcrContainerImage,aws_ecr_container_image +awsGroundStationAgentEndpoint,aws_ground_station_agent_endpoint +awsIamConfig,aws_iam_config +awsInstanceID,aws_instance_id +awsIotJobArn,aws_iot_job_arn +awsIotJobId,aws_iot_job_id +awsIotSqlVersion,aws_iot_sql_version +awsJobAbortConfig,aws_job_abort_config +awsJobExecutionsRolloutConfig,aws_job_executions_rollout_config +awsJobPresignedUrlConfig,aws_job_presigned_url_config +awsJobTimeoutConfig,aws_job_timeout_config +awsLambdaFunction,aws_lambda_function +awsLogicalDeviceId,aws_logical_device_id +awsOrganization,aws_organization +awsRegion,aws_region +awsSecretStoreArn,aws_secret_store_arn +awsService,aws_service +awsServices,aws_services +awsSignerJobId,aws_signer_job_id +awsSso,aws_sso +awsvpcConfiguration,awsvpc_configuration +azMode,az_mode +backendDefaults,backend_defaults +backendEnvironment,backend_environment +backendEnvironmentArn,backend_environment_arn +backendEnvironments,backend_environments +backends,backends +backfillStatus,backfill_status +backloggedStorageBytes,backlogged_storage_bytes +backupId,backup_id +backupMode,backup_mode +backupProgressInMegaBytes,backup_progress_in_mega_bytes +backupRetentionEnabled,backup_retention_enabled +badge,badge +badgeEnabled,badge_enabled +badgeRequestUrl,badge_request_url +balance,balance +bandwidth,bandwidth +bandwidthAllocation,bandwidth_allocation +bandwidthThrottling,bandwidth_throttling +base,base +baseCapacity,base_capacity +baseCommitId,base_commit_id +baseConfigurationItems,base_configuration_items +baseEjectionDuration,base_ejection_duration +baseModelArn,base_model_arn +baseModelArnEquals,base_model_arn_equals +baseModelIdentifier,base_model_identifier +baseModelName,base_model_name +basePath,base_path +baseProcessingInstanceType,base_processing_instance_type +baseProcessingInstanceVolumeSizeInGB,base_processing_instance_volume_size_in_gb +baseProcessingJob,base_processing_job +baseRatePerMinute,base_rate_per_minute +baseScore,base_score +baseStat,base_stat +baseTableTTL,base_table_ttl +basic,basic +basicAuthCredentials,basic_auth_credentials +batch,batch +batchDeleteDetectorErrorEntries,batch_delete_detector_error_entries +batchImports,batch_imports +batchInferenceJob,batch_inference_job +batchInferenceJobArn,batch_inference_job_arn +batchInferenceJobConfig,batch_inference_job_config +batchInferenceJobs,batch_inference_jobs +batchItemId,batch_item_id +batchJobDefinitions,batch_job_definitions +batchJobExecutions,batch_job_executions +batchJobIdentifier,batch_job_identifier +batchMode,batch_mode +batchPolicy,batch_policy +batchPredictions,batch_predictions +batchPutMessageErrorEntries,batch_put_message_error_entries +batchReportMode,batch_report_mode +batchSegmentJob,batch_segment_job +batchSegmentJobArn,batch_segment_job_arn +batchSegmentJobs,batch_segment_jobs +batchSize,batch_size +batchUpdateDetectorErrorEntries,batch_update_detector_error_entries +beforeBlob,before_blob +beforeBlobId,before_blob_id +beforeCommitId,before_commit_id +beforeCommitSpecifier,before_commit_specifier +beforePath,before_path +beforeTime,before_time +begin,begin +beginDate,begin_date +beginInclusive,begin_inclusive +beginOffsetInclusive,begin_offset_inclusive +behavior,behavior +behaviorCriteriaType,behavior_criteria_type +behaviorName,behavior_name +behaviors,behaviors +behindMajor,behind_major +behindMinor,behind_minor +belongsToFieldOnRelatedModel,belongs_to_field_on_related_model +bestRecipeArn,best_recipe_arn +bgpPeerId,bgp_peer_id +bgpPeerState,bgp_peer_state +bgpPeers,bgp_peers +bgpStatus,bgp_status +bidPercentage,bid_percentage +billableDuration,billable_duration +billableEntityCount,billable_entity_count +billedDurationInMilliseconds,billed_duration_in_milliseconds +billedMemoryUsedInMB,billed_memory_used_in_mb +billedResourceUtilization,billed_resource_utilization +billingDetails,billing_details +billingGroupArn,billing_group_arn +billingGroupDescription,billing_group_description +billingGroupId,billing_group_id +billingGroupMetadata,billing_group_metadata +billingGroupName,billing_group_name +billingGroupProperties,billing_group_properties +billingGroups,billing_groups +billingMethod,billing_method +billingMinutes,billing_minutes +binBy,bin_by +binKeys,bin_keys +binaryMediaTypes,binary_media_types +bindIP,bind_ip +bindingEvent,binding_event +bindingProperties,binding_properties +bindings,bindings +bitMaskLength,bit_mask_length +bitRightShift,bit_right_shift +blackListedAgents,black_listed_agents +blackListedConnectors,black_listed_connectors +blobId,blob_id +blockDeviceMappings,block_device_mappings +blockHash,block_hash +blockNumber,block_number +blockPublicAccess,block_public_access +blockPublicAcls,block_public_acls +blockPublicPolicy,block_public_policy +blockers,blockers +blocklist,blocklist +blocksize,blocksize +blueGreenDeploymentConfiguration,blue_green_deployment_configuration +blueprintId,blueprint_id +blueprintName,blueprint_name +blueprints,blueprints +bluetooth,bluetooth +body,body +booleanValue,boolean_value +bootMode,boot_mode +bootstrapServers,bootstrap_servers +botAlias,bot_alias +botAliasHistoryEvents,bot_alias_history_events +botAliasId,bot_alias_id +botAliasLocaleSettings,bot_alias_locale_settings +botAliasName,bot_alias_name +botAliasStatus,bot_alias_status +botAliasSummaries,bot_alias_summaries +botAliasTarget,bot_alias_target +botChannelAssociations,bot_channel_associations +botConfiguration,bot_configuration +botExportSpecification,bot_export_specification +botId,bot_id +botImportSpecification,bot_import_specification +botLocaleExportPassword,bot_locale_export_password +botLocaleExportSpecification,bot_locale_export_specification +botLocaleExportUrl,bot_locale_export_url +botLocaleHistoryEvents,bot_locale_history_events +botLocaleImportSpecification,bot_locale_import_specification +botLocaleStatus,bot_locale_status +botLocaleSummaries,bot_locale_summaries +botMemberAliasId,bot_member_alias_id +botMemberAliasName,bot_member_alias_name +botMemberId,bot_member_id +botMemberName,bot_member_name +botMemberVersion,bot_member_version +botMembers,bot_members +botName,bot_name +botRecommendationId,bot_recommendation_id +botRecommendationResults,bot_recommendation_results +botRecommendationStatus,bot_recommendation_status +botRecommendationSummaries,bot_recommendation_summaries +botResponseAudioVoiceId,bot_response_audio_voice_id +botResponses,bot_responses +botStatus,bot_status +botSummaries,bot_summaries +botTags,bot_tags +botType,bot_type +botVersion,bot_version +botVersionLocaleSpecification,bot_version_locale_specification +botVersionSummaries,bot_version_summaries +botVersions,bot_versions +bots,bots +bpaImpactsLightsail,bpa_impacts_lightsail +branch,branch +branchArn,branch_arn +branchCoveragePercentage,branch_coverage_percentage +branchFilter,branch_filter +branchName,branch_name +branches,branches +branchesCovered,branches_covered +branchesMissed,branches_missed +breachAction,breach_action +breakingChanges,breaking_changes +browserPolicy,browser_policy +browserSettings,browser_settings +browserSettingsArn,browser_settings_arn +browserType,browser_type +bucket,bucket +bucketAclGrants,bucket_acl_grants +bucketArn,bucket_arn +bucketCount,bucket_count +bucketCountByEffectivePermission,bucket_count_by_effective_permission +bucketCountByEncryptionType,bucket_count_by_encryption_type +bucketCountByObjectEncryptionRequirement,bucket_count_by_object_encryption_requirement +bucketCountBySharedAccessType,bucket_count_by_shared_access_type +bucketCreatedAt,bucket_created_at +bucketCriteria,bucket_criteria +bucketDefinitions,bucket_definitions +bucketKey,bucket_key +bucketLevelPermissions,bucket_level_permissions +bucketName,bucket_name +bucketNames,bucket_names +bucketOwner,bucket_owner +bucketOwnerAccess,bucket_owner_access +bucketPolicy,bucket_policy +bucketPrefix,bucket_prefix +bucketPublicAccessBlock,bucket_public_access_block +bucketStatisticsBySensitivity,bucket_statistics_by_sensitivity +buckets,buckets +bucketsAggregationType,buckets_aggregation_type +build,build +buildBatch,build_batch +buildBatchArn,build_batch_arn +buildBatchConfig,build_batch_config +buildBatchConfigOverride,build_batch_config_override +buildBatchNumber,build_batch_number +buildBatchStatus,build_batch_status +buildBatches,build_batches +buildBatchesNotFound,build_batches_not_found +buildComplete,build_complete +buildGroups,build_groups +buildNumber,build_number +buildSpec,build_spec +buildStatus,build_status +buildStatusConfig,build_status_config +buildStatusConfigOverride,build_status_config_override +buildTimeoutInMinutes,build_timeout_in_minutes +buildTimeoutInMinutesOverride,build_timeout_in_minutes_override +buildType,build_type +builds,builds +buildsDeleted,builds_deleted +buildsNotDeleted,builds_not_deleted +buildsNotFound,builds_not_found +buildspec,buildspec +buildspecOverride,buildspec_override +builtInIntentSummaries,built_in_intent_summaries +builtInSlotTypeSummaries,built_in_slot_type_summaries +bundleId,bundle_id +bundleInformation,bundle_information +bundleList,bundle_list +bundleNames,bundle_names +bundleType,bundle_type +bundles,bundles +burstLimit,burst_limit +businessGoals,business_goals +businessUnitId,business_unit_id +buttons,buttons +byCustomizationType,by_customization_type +byInferenceType,by_inference_type +byName,by_name +byOutputModality,by_output_modality +byProvider,by_provider +byteBuffer,byte_buffer +byteLength,byte_length +bytes,bytes +bytesProcessed,bytes_processed +bytesReceived,bytes_received +bytesScanned,bytes_scanned +bytesSent,bytes_sent +bytesWritten,bytes_written +caCertificate,ca_certificate +caCertificateId,ca_certificate_id +caCertificateIdentifier,ca_certificate_identifier +caCertificatePem,ca_certificate_pem +cache,cache +cacheAtStartup,cache_at_startup +cacheBehaviorSettings,cache_behavior_settings +cacheBehaviors,cache_behaviors +cacheClusterEnabled,cache_cluster_enabled +cacheClusterSize,cache_cluster_size +cacheClusterStatus,cache_cluster_status +cacheConfigurations,cache_configurations +cacheDataEncrypted,cache_data_encrypted +cacheKeyParameters,cache_key_parameters +cacheNamespace,cache_namespace +cacheOverride,cache_override +cacheStorageConfigurations,cache_storage_configurations +cacheTtlInSeconds,cache_ttl_in_seconds +cacheType,cache_type +cachedHTTPMethods,cached_http_methods +cachingConfig,caching_config +cachingEnabled,caching_enabled +cachingKeys,caching_keys +cak,cak +callbackOverrides,callback_overrides +callerReactions,caller_reactions +campaign,campaign +campaignArn,campaign_arn +campaignConfig,campaign_config +campaignId,campaign_id +campaignIds,campaign_ids +campaignName,campaign_name +campaignSummaries,campaign_summaries +campaignSummaryList,campaign_summary_list +campaigns,campaigns +canDbcFiles,can_dbc_files +canInterface,can_interface +canRetry,can_retry +canSignal,can_signal +canUnlinkAssociatedModel,can_unlink_associated_model +canUpdateImage,can_update_image +canUseAsDestination,can_use_as_destination +canUseAsSource,can_use_as_source +canaryInterval,canary_interval +canaryPercentage,canary_percentage +canarySettings,canary_settings +cancel,cancel +cancelActive,cancel_active +cancelRequested,cancel_requested +cancelTimerDecisionAttributes,cancel_timer_decision_attributes +cancelTimerFailedEventAttributes,cancel_timer_failed_event_attributes +cancelWorkflowExecutionDecisionAttributes,cancel_workflow_execution_decision_attributes +cancelWorkflowExecutionFailedEventAttributes,cancel_workflow_execution_failed_event_attributes +canceled,canceled +canceledChecks,canceled_checks +canceledFindingsCount,canceled_findings_count +cancellationStatus,cancellation_status +cancelled,cancelled +cannedAcl,canned_acl +capabilities,capabilities +capabilityArn,capability_arn +capabilityArns,capability_arns +capabilityConfiguration,capability_configuration +capabilityList,capability_list +capabilityNamespace,capability_namespace +capabilitySyncStatus,capability_sync_status +capacity,capacity +capacityConfiguration,capacity_configuration +capacityId,capacity_id +capacityLimits,capacity_limits +capacityProvider,capacity_provider +capacityProviderArn,capacity_provider_arn +capacityProviderName,capacity_provider_name +capacityProviderStrategy,capacity_provider_strategy +capacityProviders,capacity_providers +capacitySpecification,capacity_specification +capacitySpecificationOverride,capacity_specification_override +capacityType,capacity_type +captureConditional,capture_conditional +captureNextStep,capture_next_step +captureResponse,capture_response +cardinality,cardinality +carrier,carrier +caseArn,case_arn +caseData,case_data +caseId,case_id +caseIdList,case_id_list +caseSensitive,case_sensitive +cases,cases +catalogData,catalog_data +catalogType,catalog_type +categoricalHyperParameterRanges,categorical_hyper_parameter_ranges +categories,categories +categoriesWithMostFindings,categories_with_most_findings +category,category +categoryCode,category_code +categoryName,category_name +categorySpecificSummary,category_specific_summary +cause,cause +causedBy,caused_by +causedByEventId,caused_by_event_id +ccEmailAddresses,cc_email_addresses +cellReference,cell_reference +cells,cells +cellsToCreate,cells_to_create +cellsToUpdate,cells_to_update +centerFrequency,center_frequency +certKey,cert_key +certificate,certificate +certificateAlternativeNames,certificate_alternative_names +certificateArn,certificate_arn +certificateAuthority,certificate_authority +certificateAuthorityArn,certificate_authority_arn +certificateAuthorityArns,certificate_authority_arns +certificateBody,certificate_body +certificateChain,certificate_chain +certificateData,certificate_data +certificateDescription,certificate_description +certificateDetail,certificate_detail +certificateDomainName,certificate_domain_name +certificateHashes,certificate_hashes +certificateId,certificate_id +certificateList,certificate_list +certificateMode,certificate_mode +certificateName,certificate_name +certificateOverride,certificate_override +certificatePathOnDevice,certificate_path_on_device +certificatePem,certificate_pem +certificatePrivateKey,certificate_private_key +certificateSigningRequest,certificate_signing_request +certificateStatuses,certificate_statuses +certificateUploadDate,certificate_upload_date +certificateVerificationDNSRecord,certificate_verification_dns_record +certificates,certificates +certificatesToAdd,certificates_to_add +certificatesToDelete,certificates_to_delete +cfnStackName,cfn_stack_name +change,change +changeDescription,change_description +changeIdentifier,change_identifier +changeLogs,change_logs +changeRequests,change_requests +changeType,change_type +changesetArn,changeset_arn +changesetFormat,changeset_format +changesetId,changeset_id +changesets,changesets +channel,channel +channelArn,channel_arn +channelId,channel_id +channelMessages,channel_messages +channelName,channel_name +channelRoleArn,channel_role_arn +channelStorage,channel_storage +channelSummaries,channel_summaries +channels,channels +chatChannel,chat_channel +checkCompliant,check_compliant +checkId,check_id +checkIds,check_ids +checkName,check_name +checkRunStatus,check_run_status +checkpointConfig,checkpoint_config +checkpointLabel,checkpoint_label +checkpointLabelFilter,checkpoint_label_filter +checks,checks +checksum,checksum +childAssetId,child_asset_id +childAssetModelId,child_asset_model_id +childConnectionTags,child_connection_tags +childDirected,child_directed +childPolicy,child_policy +childWorkflowExecutionCanceledEventAttributes,child_workflow_execution_canceled_event_attributes +childWorkflowExecutionCompletedEventAttributes,child_workflow_execution_completed_event_attributes +childWorkflowExecutionFailedEventAttributes,child_workflow_execution_failed_event_attributes +childWorkflowExecutionStartedEventAttributes,child_workflow_execution_started_event_attributes +childWorkflowExecutionTerminatedEventAttributes,child_workflow_execution_terminated_event_attributes +childWorkflowExecutionTimedOutEventAttributes,child_workflow_execution_timed_out_event_attributes +children,children +chop,chop +chronologicalOrder,chronological_order +cidr,cidr +cidrBlock,cidr_block +cidrListAliases,cidr_list_aliases +cidrs,cidrs +ciphers,ciphers +ciphertext,ciphertext +cisaData,cisa_data +city,city +ckn,ckn +claims,claims +clarificationPrompt,clarification_prompt +className,class_name +classes,classes +classifiableObjectCount,classifiable_object_count +classifiableSizeInBytes,classifiable_size_in_bytes +classification,classification +classificationDetails,classification_details +classificationError,classification_error +classificationResultStatus,classification_result_status +classificationScopeId,classification_scope_id +classificationScopes,classification_scopes +classificationType,classification_type +classificationTypeUpdate,classification_type_update +clean,clean +clear,clear +clearMaxDevices,clear_max_devices +clearResiliencyPolicyArn,clear_resiliency_policy_arn +clearTimer,clear_timer +clientAliases,client_aliases +clientCertificateId,client_certificate_id +clientCredentialsArn,client_credentials_arn +clientId,client_id +clientIdIssuedAt,client_id_issued_at +clientIds,client_ids +clientMode,client_mode +clientName,client_name +clientNumber,client_number +clientPolicy,client_policy +clientProperties,client_properties +clientRequestToken,client_request_token +clientSecret,client_secret +clientSecretExpiresAt,client_secret_expires_at +clientSideTimestamps,client_side_timestamps +clientStatus,client_status +clientTimestampMillis,client_timestamp_millis +clientToken,client_token +clientType,client_type +clipboardMode,clipboard_mode +clock,clock +cloneFrom,clone_from +cloneUrlHttp,clone_url_http +cloneUrlSsh,clone_url_ssh +closeStatus,close_status +closeStatusFilter,close_status_filter +closeTimeFilter,close_time_filter +closeTimestamp,close_timestamp +closedFindings,closed_findings +closingResponse,closing_response +cloudFormationStackRecords,cloud_formation_stack_records +cloudFormationTarget,cloud_formation_target +cloudMetricEnabled,cloud_metric_enabled +cloudTrailArn,cloud_trail_arn +cloudTrailDetails,cloud_trail_details +cloudTrailProperties,cloud_trail_properties +cloudWatch,cloud_watch +cloudWatchConfig,cloud_watch_config +cloudWatchEncryptionEnabled,cloud_watch_encryption_enabled +cloudWatchLogDelivery,cloud_watch_log_delivery +cloudWatchLogGroupArn,cloud_watch_log_group_arn +cloudWatchLogGroupName,cloud_watch_log_group_name +cloudWatchLoggingConfiguration,cloud_watch_logging_configuration +cloudWatchLogs,cloud_watch_logs +cloudWatchLogsArn,cloud_watch_logs_arn +cloudWatchLogsConfiguration,cloud_watch_logs_configuration +cloudWatchLogsLogGroup,cloud_watch_logs_log_group +cloudWatchLogsRoleArn,cloud_watch_logs_role_arn +cloudWatchMonitoringConfiguration,cloud_watch_monitoring_configuration +cloudwatchAlarm,cloudwatch_alarm +cloudwatchLogUrl,cloudwatch_log_url +cloudwatchLogs,cloudwatch_logs +cloudwatchMetric,cloudwatch_metric +cloudwatchRoleArn,cloudwatch_role_arn +cluster,cluster +clusterArn,cluster_arn +clusterArns,cluster_arns +clusterCreationTime,cluster_creation_time +clusterDescription,cluster_description +clusterEndpoint,cluster_endpoint +clusterIdentifier,cluster_identifier +clusterLogging,cluster_logging +clusterName,cluster_name +clusterSecurityGroupId,cluster_security_group_id +clusterType,cluster_type +clusterVersion,cluster_version +clusteringKeys,clustering_keys +clusters,clusters +code,code +codeArtifactId,code_artifact_id +codeCommit,code_commit +codeCoverageSummary,code_coverage_summary +codeCoverages,code_coverages +codeErrors,code_errors +codeHook,code_hook +codeHookInterfaceVersion,code_hook_interface_version +codeHookSpecification,code_hook_specification +codeSha256,code_sha256 +codeSigning,code_signing +codeSnippet,code_snippet +codeSnippetResults,code_snippet_results +codeVulnerabilityDetails,code_vulnerability_details +codeVulnerabilityDetectorName,code_vulnerability_detector_name +codeVulnerabilityDetectorTags,code_vulnerability_detector_tags +codeVulnerabilityFilePath,code_vulnerability_file_path +codebuildRoleArn,codebuild_role_arn +codec,codec +codegenJobToCreate,codegen_job_to_create +cognitoIdentityPoolId,cognito_identity_pool_id +collaboration,collaboration +collaborationAnalysisTemplate,collaboration_analysis_template +collaborationAnalysisTemplateSummaries,collaboration_analysis_template_summaries +collaborationAnalysisTemplates,collaboration_analysis_templates +collaborationArn,collaboration_arn +collaborationCreatorAccountId,collaboration_creator_account_id +collaborationCreatorDisplayName,collaboration_creator_display_name +collaborationId,collaboration_id +collaborationIdentifier,collaboration_identifier +collaborationList,collaboration_list +collaborationName,collaboration_name +collectionBindingProperties,collection_binding_properties +collectionDetails,collection_details +collectionEndpoint,collection_endpoint +collectionErrorDetails,collection_error_details +collectionFilters,collection_filters +collectionProperties,collection_properties +collectionScheme,collection_scheme +collectionStatus,collection_status +collectionSummaries,collection_summaries +collectorHealth,collector_health +collectorId,collector_id +collectorVersion,collector_version +column,column +columnCount,column_count +columnDefault,column_default +columnDescription,column_description +columnDescriptions,column_descriptions +columnIds,column_ids +columnIndex,column_index +columnMap,column_map +columnMetadata,column_metadata +columnName,column_name +columnNames,column_names +columns,columns +combineArtifacts,combine_artifacts +command,command +commandLineArguments,command_line_arguments +comment,comment +commentBody,comment_body +commentId,comment_id +comments,comments +commentsForComparedCommitData,comments_for_compared_commit_data +commentsForPullRequestData,comments_for_pull_request_data +commit,commit +commitId,commit_id +commitIds,commit_ids +commitMessage,commit_message +commitNum,commit_num +commitSpecifier,commit_specifier +commitTime,commit_time +commitTimestampInMillis,commit_timestamp_in_millis +commitment,commitment +commitmentConfiguration,commitment_configuration +commitmentDuration,commitment_duration +commitmentExpirationTime,commitment_expiration_time +commitmentInformation,commitment_information +commitmentLength,commitment_length +commits,commits +committer,committer +commonName,common_name +communicationBody,communication_body +communicationTypes,communication_types +communications,communications +company,company +comparator,comparator +comparison,comparison +comparisonOperator,comparison_operator +compatibilities,compatibilities +compatible,compatible +compatibleDevices,compatible_devices +compatibleEnvironmentTemplates,compatible_environment_templates +compatibleNamespaceVersion,compatible_namespace_version +complete,complete +completeTime,complete_time +completeWorkflowExecutionDecisionAttributes,complete_workflow_execution_decision_attributes +completeWorkflowExecutionFailedEventAttributes,complete_workflow_execution_failed_event_attributes +completed,completed +completedAt,completed_at +completedJobs,completed_jobs +completedOn,completed_on +completedSteps,completed_steps +completedTime,completed_time +completionStatus,completion_status +completionTime,completion_time +completionTimeRange,completion_time_range +compliance,compliance +complianceCheck,compliance_check +complianceDrifts,compliance_drifts +complianceStatus,compliance_status +complianceType,compliance_type +compliantChecks,compliant_checks +compliantEvidenceCount,compliant_evidence_count +component,component +componentArn,component_arn +componentBuildVersionArn,component_build_version_arn +componentCandidates,component_candidates +componentCompliances,component_compliances +componentDependencies,component_dependencies +componentId,component_id +componentLambdaParameters,component_lambda_parameters +componentName,component_name +componentPlatforms,component_platforms +componentRecommendations,component_recommendations +componentRoleArn,component_role_arn +componentState,component_state +componentStatuses,component_statuses +componentSummaryList,component_summary_list +componentToCreate,component_to_create +componentType,component_type +componentTypeId,component_type_id +componentTypeName,component_type_name +componentTypeSummaries,component_type_summaries +componentUpdatePolicy,component_update_policy +componentUpdates,component_updates +componentVersion,component_version +componentVersionArn,component_version_arn +componentVersionList,component_version_list +componentVersions,component_versions +components,components +compositeModel,composite_model +compositeSlotTypeSetting,composite_slot_type_setting +compressed,compressed +compression,compression +compressionType,compression_type +compute,compute +computeEnvironment,compute_environment +computeEnvironmentArn,compute_environment_arn +computeEnvironmentName,compute_environment_name +computeEnvironmentOrder,compute_environment_order +computeEnvironments,compute_environments +computeLocation,compute_location +computePlatform,compute_platform +computeReservation,compute_reservation +computeResources,compute_resources +computeType,compute_type +computeTypeOverride,compute_type_override +computeTypesAllowed,compute_types_allowed +computedDesiredCount,computed_desired_count +computerAttributes,computer_attributes +concat,concat +conclusionStatement,conclusion_statement +concurrentBuildLimit,concurrent_build_limit +concurrentDeploymentPercentage,concurrent_deployment_percentage +condition,condition +conditionLanguageVersion,condition_language_version +conditional,conditional +conditionalBranches,conditional_branches +confidence,confidence +confidenceLevel,confidence_level +config,config +configArn,config_arn +configData,config_data +configDetails,config_details +configFileName,config_file_name +configHistoryDeliveryInfo,config_history_delivery_info +configId,config_id +configList,config_list +configParameters,config_parameters +configRecommendations,config_recommendations +configSnapshotDeliveryInfo,config_snapshot_delivery_info +configSnapshotDeliveryProperties,config_snapshot_delivery_properties +configSnapshotId,config_snapshot_id +configStreamDeliveryInfo,config_stream_delivery_info +configType,config_type +configVersion,config_version +configuration,configuration +configurationId,configuration_id +configurationIds,configuration_ids +configurationItemCaptureTime,configuration_item_capture_time +configurationItemMD5Hash,configuration_item_md5_hash +configurationItemStatus,configuration_item_status +configurationItems,configuration_items +configurationOptions,configuration_options +configurationOverrides,configuration_overrides +configurationProfileId,configuration_profile_id +configurationProperties,configuration_properties +configurationSchema,configuration_schema +configurationStateId,configuration_state_id +configurationStatus,configuration_status +configurationSummary,configuration_summary +configurationType,configuration_type +configurationUpdate,configuration_update +configurationUrl,configuration_url +configurationValidationPolicy,configuration_validation_policy +configurationValues,configuration_values +configurations,configurations +configurationsDownloadUrl,configurations_download_url +configureOnly,configure_only +configureScript,configure_script +configureScriptType,configure_script_type +configured,configured +configuredBy,configured_by +configuredTable,configured_table +configuredTableArn,configured_table_arn +configuredTableAssociation,configured_table_association +configuredTableAssociationIdentifier,configured_table_association_identifier +configuredTableAssociationSummaries,configured_table_association_summaries +configuredTableId,configured_table_id +configuredTableIdentifier,configured_table_identifier +configuredTableSummaries,configured_table_summaries +confirmationConditional,confirmation_conditional +confirmationNextStep,confirmation_next_step +confirmationPrompt,confirmation_prompt +confirmationResponse,confirmation_response +confirmationState,confirmation_state +confirmationStatus,confirmation_status +confirmationToken,confirmation_token +confirmationUrl,confirmation_url +conflictDetailLevel,conflict_detail_level +conflictDetection,conflict_detection +conflictHandler,conflict_handler +conflictMetadata,conflict_metadata +conflictMetadataList,conflict_metadata_list +conflictResolution,conflict_resolution +conflictResolutionStrategy,conflict_resolution_strategy +conflicts,conflicts +connectContactFlowId,connect_contact_flow_id +connectInstanceConfig,connect_instance_config +connectInstanceId,connect_instance_id +connectInstanceOnboardingJobStatus,connect_instance_onboarding_job_status +connectQueueId,connect_queue_id +connectSourcePhoneNumber,connect_source_phone_number +connected,connected +connectedToSystemTime,connected_to_system_time +connectionArn,connection_arn +connectionId,connection_id +connectionMode,connection_mode +connectionName,connection_name +connectionPool,connection_pool +connectionState,connection_state +connectionType,connection_type +connections,connections +connectionsBandwidth,connections_bandwidth +connectionsCount,connections_count +connectivity,connectivity +connectivityAt,connectivity_at +connectivityInfo,connectivity_info +connectorArn,connector_arn +connectorConfig,connector_config +connectorConfiguration,connector_configuration +connectorConfigurations,connector_configurations +connectorDescription,connector_description +connectorEntityFields,connector_entity_fields +connectorEntityMap,connector_entity_map +connectorEntityName,connector_entity_name +connectorId,connector_id +connectorLabel,connector_label +connectorList,connector_list +connectorMetadata,connector_metadata +connectorModes,connector_modes +connectorName,connector_name +connectorNamePrefix,connector_name_prefix +connectorOperator,connector_operator +connectorOwner,connector_owner +connectorProfileArn,connector_profile_arn +connectorProfileConfig,connector_profile_config +connectorProfileCredentials,connector_profile_credentials +connectorProfileDetails,connector_profile_details +connectorProfileName,connector_profile_name +connectorProfileNames,connector_profile_names +connectorProfileProperties,connector_profile_properties +connectorProvisioningConfig,connector_provisioning_config +connectorProvisioningType,connector_provisioning_type +connectorRuntimeSettings,connector_runtime_settings +connectorState,connector_state +connectorSummary,connector_summary +connectorSuppliedValueOptions,connector_supplied_value_options +connectorSuppliedValues,connector_supplied_values +connectorType,connector_type +connectorTypes,connector_types +connectorVersion,connector_version +connectors,connectors +consecutiveDatapointsToAlarm,consecutive_datapoints_to_alarm +consecutiveDatapointsToClear,consecutive_datapoints_to_clear +consoleUrl,console_url +constraints,constraints +contactArn,contact_arn +contactEndpoint,contact_endpoint +contactId,contact_id +contactList,contact_list +contactMethods,contact_methods +contactPostPassDurationSeconds,contact_post_pass_duration_seconds +contactPrePassDurationSeconds,contact_pre_pass_duration_seconds +contactProtocols,contact_protocols +contactStatus,contact_status +container,container +containerAction,container_action +containerArn,container_arn +containerConfigurations,container_configurations +containerDefinitions,container_definitions +containerDistributionConfiguration,container_distribution_configuration +containerImage,container_image +containerImages,container_images +containerInstance,container_instance +containerInstanceArn,container_instance_arn +containerInstanceArns,container_instance_arns +containerInstances,container_instances +containerLogRotationConfiguration,container_log_rotation_configuration +containerName,container_name +containerOrchestrationType,container_orchestration_type +containerOverrides,container_overrides +containerParams,container_params +containerPath,container_path +containerPort,container_port +containerPortRange,container_port_range +containerProperties,container_properties +containerProvider,container_provider +containerProviderId,container_provider_id +containerProviderType,container_provider_type +containerRecipe,container_recipe +containerRecipeArn,container_recipe_arn +containerRecipeSummaryList,container_recipe_summary_list +containerRecommendations,container_recommendations +containerService,container_service +containerServiceName,container_service_name +containerServices,container_services +containerTags,container_tags +containerType,container_type +containers,containers +contains,contains +containsDataFromDeletedResources,contains_data_from_deleted_resources +content,content +contentArn,content_arn +contentConflict,content_conflict +contentDeliveryRules,content_delivery_rules +contentDisposition,content_disposition +contentEncoding,content_encoding +contentExpression,content_expression +contentHandling,content_handling +contentId,content_id +contentLength,content_length +contentLocation,content_location +contentRange,content_range +contentReference,content_reference +contentSummaries,content_summaries +contentSummary,content_summary +contentType,content_type +contents,contents +context,context +contextAttributes,context_attributes +contextRowId,context_row_id +contexts,contexts +continentCode,continent_code +continuationToken,continuation_token +continueAfterTimeout,continue_after_timeout +continueAsNewWorkflowExecutionDecisionAttributes,continue_as_new_workflow_execution_decision_attributes +continueAsNewWorkflowExecutionFailedEventAttributes,continue_as_new_workflow_execution_failed_event_attributes +continueResponse,continue_response +continuedExecutionRunId,continued_execution_run_id +continuous,continuous +continuousHyperParameterRanges,continuous_hyper_parameter_ranges +contractAddress,contract_address +control,control +controlDomainId,control_domain_id +controlDomainInsights,control_domain_insights +controlId,control_id +controlIdentifier,control_identifier +controlInsightsByAssessment,control_insights_by_assessment +controlInsightsMetadata,control_insights_metadata +controlMappingSources,control_mapping_sources +controlMetadataList,control_metadata_list +controlName,control_name +controlOperation,control_operation +controlPlaneInstanceType,control_plane_instance_type +controlPlanePlacement,control_plane_placement +controlSet,control_set +controlSetId,control_set_id +controlSetName,control_set_name +controlSets,control_sets +controlSetsCount,control_sets_count +controlSources,control_sources +controlStatus,control_status +controlTreatmentName,control_treatment_name +controlType,control_type +controls,controls +controlsCount,controls_count +controlsCountByNoncompliantEvidence,controls_count_by_noncompliant_evidence +conversationDurationSeconds,conversation_duration_seconds +conversationEndState,conversation_end_state +conversationEndTime,conversation_end_time +conversationId,conversation_id +conversationLevelResult,conversation_level_result +conversationLevelTestResults,conversation_level_test_results +conversationLevelTestResultsFilterBy,conversation_level_test_results_filter_by +conversationLogSettings,conversation_log_settings +conversationLogs,conversation_logs +conversationLogsDataSource,conversation_logs_data_source +conversationMode,conversation_mode +conversationStartTime,conversation_start_time +conversionProperties,conversion_properties +conversionServerID,conversion_server_id +cookieSynchronizationConfiguration,cookie_synchronization_configuration +cookiesAllowList,cookies_allow_list +copyAllowed,copy_allowed +copyImageSetInformation,copy_image_set_information +copyPrivateIp,copy_private_ip +copyTags,copy_tags +coreCount,core_count +coreDeviceExecutionStatus,core_device_execution_status +coreDeviceThingName,core_device_thing_name +coreDevices,core_devices +coreVersion,core_version +cores,cores +correlationData,correlation_data +cors,cors +cost,cost +costEstimates,cost_estimates +costOptimizing,cost_optimizing +count,count +counters,counters +countersToAggregate,counters_to_aggregate +country,country +countryCode,country_code +counts,counts +countsByGroup,counts_by_group +coveredResources,covered_resources +cpiSecretKey,cpi_secret_key +cpiUserId,cpi_user_id +cpiUserPassword,cpi_user_password +cpiUsername,cpi_username +cpu,cpu +cpuArchitecture,cpu_architecture +cpuCount,cpu_count +cpuOptions,cpu_options +cpuPerformanceMetricBasis,cpu_performance_metric_basis +cpuUtilizationPercentage,cpu_utilization_percentage +cpuVendorArchitectures,cpu_vendor_architectures +cpus,cpus +cr,cr +crawlerArn,crawler_arn +crawlerConfiguration,crawler_configuration +createCollectionDetail,create_collection_detail +createDate,create_date +createDelegationRequest,create_delegation_request +createDelegationRequests,create_delegation_requests +createPublicIP,create_public_ip +createSimulationJobRequests,create_simulation_job_requests +createStatus,create_status +createTime,create_time +createTimeRange,create_time_range +createTimestamp,create_timestamp +createVersion,create_version +createVpcEndpointDetail,create_vpc_endpoint_detail +created,created +createdAfter,created_after +createdAt,created_at +createdAtAfter,created_at_after +createdAtBefore,created_at_before +createdBefore,created_before +createdBy,created_by +createdCount,created_count +createdDate,created_date +createdOn,created_on +createdReason,created_reason +createdRequestCount,created_request_count +createdRequests,created_requests +createdRows,created_rows +createdTime,created_time +createdTimeStamp,created_time_stamp +createdTimestamp,created_timestamp +creationDate,creation_date +creationDateTime,creation_date_time +creationTime,creation_time +creationTimeAfter,creation_time_after +creationTimeBefore,creation_time_before +creationTimeInMillis,creation_time_in_millis +creationTimeRange,creation_time_range +creationTimestamp,creation_timestamp +creationType,creation_type +creator,creator +creatorAccountId,creator_account_id +creatorDisplayName,creator_display_name +creatorId,creator_id +creatorMemberAbilities,creator_member_abilities +credential,credential +credentialDurationSeconds,credential_duration_seconds +credentialProvider,credential_provider +credentialSpecs,credential_specs +credentialType,credential_type +credentials,credentials +credentialsArn,credentials_arn +credentialsMap,credentials_map +credentialsParameter,credentials_parameter +criteria,criteria +criteriaList,criteria_list +criterion,criterion +critical,critical +crl,crl +crlArn,crl_arn +crlData,crl_data +crlId,crl_id +crls,crls +crossAccountRoleArns,cross_account_role_arns +csv,csv +csvIndexToVariableMap,csv_index_to_variable_map +csvInputTemplate,csv_input_template +cta,cta +cumulativeGasUsed,cumulative_gas_used +currencies,currencies +currency,currency +currencyCode,currency_code +current,current +currentApplicationVersion,current_application_version +currentApplyDate,current_apply_date +currentAttemptCount,current_attempt_count +currentBackupRateInMegaBytesPerSecond,current_backup_rate_in_mega_bytes_per_second +currentBuildSummary,current_build_summary +currentConfiguration,current_configuration +currentDeployment,current_deployment +currentDeploymentGroupName,current_deployment_group_name +currentEphemeris,current_ephemeris +currentInstanceGpuInfo,current_instance_gpu_info +currentInstanceType,current_instance_type +currentLabel,current_label +currentLicenseConfiguration,current_license_configuration +currentMemorySize,current_memory_size +currentPerformanceRisk,current_performance_risk +currentPerformanceRiskRatings,current_performance_risk_ratings +currentPhase,current_phase +currentPlan,current_plan +currentPricingPlan,current_pricing_plan +currentProgress,current_progress +currentRevision,current_revision +currentRevisionId,current_revision_id +currentRpoInSecs,current_rpo_in_secs +currentRtoInSecs,current_rto_in_secs +currentServiceConfiguration,current_service_configuration +currentVersion,current_version +cursor,cursor +custom,custom +customAuthConfigs,custom_auth_configs +customAuthenticationType,custom_authentication_type +customCodeSigning,custom_code_signing +customControlsCount,custom_controls_count +customDNSConfiguration,custom_dns_configuration +customDNSServerIP,custom_dns_server_ip +customDNSServerName,custom_dns_server_name +customData,custom_data +customDataIdentifierId,custom_data_identifier_id +customDataIdentifierIds,custom_data_identifier_ids +customDataIdentifiers,custom_data_identifiers +customDomainName,custom_domain_name +customDomains,custom_domains +customFields,custom_fields +customHeaders,custom_headers +customImageName,custom_image_name +customModelArn,custom_model_arn +customModelKmsKeyId,custom_model_kms_key_id +customModelName,custom_model_name +customModelTags,custom_model_tags +customModelTrainingParameters,custom_model_training_parameters +customModelTransformParameters,custom_model_transform_parameters +customPayload,custom_payload +customPlugin,custom_plugin +customPluginArn,custom_plugin_arn +customPluginState,custom_plugin_state +customPlugins,custom_plugins +customProperties,custom_properties +customRules,custom_rules +customVocabularyExportSpecification,custom_vocabulary_export_specification +customVocabularyImportSpecification,custom_vocabulary_import_specification +customVocabularyItemList,custom_vocabulary_item_list +customVocabularyItems,custom_vocabulary_items +customVocabularyStatus,custom_vocabulary_status +customerAccountId,customer_account_id +customerAction,customer_action +customerAddress,customer_address +customerArtifactPaths,customer_artifact_paths +customerDefinedValues,customer_defined_values +customerId,customer_id +customerManaged,customer_managed +customerManagedKey,customer_managed_key +customerManagedKeyArn,customer_managed_key_arn +customerManagedKeyIdentifier,customer_managed_key_identifier +customerManagedS3,customer_managed_s3 +customerManagedS3Storage,customer_managed_s3_storage +customerRouterConfig,customer_router_config +customerVersion,customer_version +customizationsSupported,customizations_supported +cvss,cvss +cvss2,cvss2 +cvss3,cvss3 +cvssSource,cvss_source +cwes,cwes +dailyReportsOnly,daily_reports_only +dailySchedule,daily_schedule +dashboardArn,dashboard_arn +dashboardCreationDate,dashboard_creation_date +dashboardDefinition,dashboard_definition +dashboardDescription,dashboard_description +dashboardEndpoint,dashboard_endpoint +dashboardId,dashboard_id +dashboardLastUpdateDate,dashboard_last_update_date +dashboardName,dashboard_name +dashboardSummaries,dashboard_summaries +dashboardValidationMessages,dashboard_validation_messages +data,data +dataAccessRoleArn,data_access_role_arn +dataApiRoleArn,data_api_role_arn +dataBundles,data_bundles +dataCharacterEncoding,data_character_encoding +dataCollected,data_collected +dataCollectionDetails,data_collection_details +dataCollectionStatus,data_collection_status +dataDelivery,data_delivery +dataDestinationConfigs,data_destination_configs +dataEncryptionMetadata,data_encryption_metadata +dataExtraDimensions,data_extra_dimensions +dataFormat,data_format +dataItems,data_items +dataLakeArn,data_lake_arn +dataLakeSources,data_lake_sources +dataLakes,data_lakes +dataLocation,data_location +dataLocationConstraint,data_location_constraint +dataPlaneRouting,data_plane_routing +dataPrivacy,data_privacy +dataProcessingJobId,data_processing_job_id +dataProtectionStatus,data_protection_status +dataPullEndTime,data_pull_end_time +dataPullMode,data_pull_mode +dataPullStartTime,data_pull_start_time +dataReplicationError,data_replication_error +dataReplicationInfo,data_replication_info +dataReplicationInitiation,data_replication_initiation +dataReplicationState,data_replication_state +dataSet,data_set +dataSetImportTasks,data_set_import_tasks +dataSetName,data_set_name +dataSetOrg,data_set_org +dataSetPublicationDate,data_set_publication_date +dataSetRequestId,data_set_request_id +dataSetType,data_set_type +dataSets,data_sets +dataSize,data_size +dataSource,data_source +dataSourceArn,data_source_arn +dataSourceConfig,data_source_config +dataSourceName,data_source_name +dataSourceNames,data_source_names +dataSourceType,data_source_type +dataSourceUrl,data_source_url +dataSources,data_sources +dataTimestamp,data_timestamp +dataTraceEnabled,data_trace_enabled +dataTransferApi,data_transfer_api +dataTransferApis,data_transfer_apis +dataType,data_type +dataTypeName,data_type_name +dataTypeSpec,data_type_spec +dataTypeValue,data_type_value +dataURI,data_uri +dataValidationMetrics,data_validation_metrics +dataViewArn,data_view_arn +dataViewId,data_view_id +dataViews,data_views +database,database +databaseArn,database_arn +databaseConfigDetail,database_config_detail +databaseManagementPreference,database_management_preference +databaseMigrationPreference,database_migration_preference +databaseName,database_name +databasePreferences,database_preferences +databaseUrl,database_url +databases,databases +datacenterName,datacenter_name +dataflowDestinationRegion,dataflow_destination_region +dataflowEdges,dataflow_edges +dataflowEndpointGroupArn,dataflow_endpoint_group_arn +dataflowEndpointGroupId,dataflow_endpoint_group_id +dataflowEndpointGroupList,dataflow_endpoint_group_list +dataflowEndpointName,dataflow_endpoint_name +dataflowEndpointRegion,dataflow_endpoint_region +dataflowId,dataflow_id +dataflowList,dataflow_list +dataflowSourceRegion,dataflow_source_region +datakey,datakey +datapointsCollectionPercentage,datapoints_collection_percentage +datapointsToAlarm,datapoints_to_alarm +dataset,dataset +datasetArn,dataset_arn +datasetContentSummaries,dataset_content_summaries +datasetContentVersionValue,dataset_content_version_value +datasetDescription,dataset_description +datasetExportJob,dataset_export_job +datasetExportJobArn,dataset_export_job_arn +datasetExportJobs,dataset_export_jobs +datasetGroup,dataset_group +datasetGroupArn,dataset_group_arn +datasetGroups,dataset_groups +datasetId,dataset_id +datasetImportJob,dataset_import_job +datasetImportJobArn,dataset_import_job_arn +datasetImportJobs,dataset_import_jobs +datasetName,dataset_name +datasetOrg,dataset_org +datasetPermissions,dataset_permissions +datasetSummaries,dataset_summaries +datasetTitle,dataset_title +datasetType,dataset_type +datasets,datasets +datastore,datastore +datastoreArn,datastore_arn +datastoreId,datastore_id +datastoreName,datastore_name +datastorePartitions,datastore_partitions +datastoreProperties,datastore_properties +datastoreStatus,datastore_status +datastoreStorage,datastore_storage +datastoreSummaries,datastore_summaries +datasyncErrorCode,datasync_error_code +date,date +dateAdded,date_added +dateCreated,date_created +dateDue,date_due +dateLastRun,date_last_run +dateNextRun,date_next_run +dateRangeFilter,date_range_filter +dateUpdated,date_updated +datesWithoutSupport,dates_without_support +datetimeTypeFieldName,datetime_type_field_name +dayOfMonth,day_of_month +dayOfWeek,day_of_week +days,days +dbClusterIdentifier,db_cluster_identifier +dbClusterOrInstanceArn,db_cluster_or_instance_arn +dbConnectionId,db_connection_id +dbEngineVersion,db_engine_version +dbName,db_name +dbPassword,db_password +dbPath,db_path +dbPaths,db_paths +dbUser,db_user +debugSession,debug_session +debugSessionEnabled,debug_session_enabled +decimalReturnType,decimal_return_type +decision,decision +decisionTaskCompletedEventAttributes,decision_task_completed_event_attributes +decisionTaskCompletedEventId,decision_task_completed_event_id +decisionTaskScheduledEventAttributes,decision_task_scheduled_event_attributes +decisionTaskStartedEventAttributes,decision_task_started_event_attributes +decisionTaskTimedOutEventAttributes,decision_task_timed_out_event_attributes +decisionType,decision_type +decisions,decisions +declinationConditional,declination_conditional +declinationNextStep,declination_next_step +declinationResponse,declination_response +decodeConfig,decode_config +decoderManifestArn,decoder_manifest_arn +decryptionError,decryption_error +dedicatedServiceAccountId,dedicated_service_account_id +dedupeString,dedupe_string +deepLink,deep_link +defaultAction,default_action +defaultAssessmentReportsDestination,default_assessment_reports_destination +defaultAttributes,default_attributes +defaultAuthorizerName,default_authorizer_name +defaultBranch,default_branch +defaultBranchName,default_branch_name +defaultCacheBehavior,default_cache_behavior +defaultCapacityProviderStrategy,default_capacity_provider_strategy +defaultChecked,default_checked +defaultChildPolicy,default_child_policy +defaultClientId,default_client_id +defaultCountryCode,default_country_code +defaultDevices,default_devices +defaultDisplayVersion,default_display_version +defaultDomain,default_domain +defaultExecutionStartToCloseTimeout,default_execution_start_to_close_timeout +defaultExportDestination,default_export_destination +defaultFormat,default_format +defaultGateway,default_gateway +defaultHyperParameterRanges,default_hyper_parameter_ranges +defaultHyperParameters,default_hyper_parameters +defaultIamRoleArn,default_iam_role_arn +defaultJobTimeoutMinutes,default_job_timeout_minutes +defaultLambdaRole,default_lambda_role +defaultLargeStagingDiskType,default_large_staging_disk_type +defaultLayout,default_layout +defaultLogLevel,default_log_level +defaultParameters,default_parameters +defaultPrefix,default_prefix +defaultProcessOwners,default_process_owners +defaultRegistryAlias,default_registry_alias +defaultResourceConfig,default_resource_config +defaultResponse,default_response +defaultResultConfiguration,default_result_configuration +defaultServerSideEncryption,default_server_side_encryption +defaultTTL,default_ttl +defaultTargetHostname,default_target_hostname +defaultTaskHeartbeatTimeout,default_task_heartbeat_timeout +defaultTaskList,default_task_list +defaultTaskPriority,default_task_priority +defaultTaskScheduleToCloseTimeout,default_task_schedule_to_close_timeout +defaultTaskScheduleToStartTimeout,default_task_schedule_to_start_timeout +defaultTaskStartToCloseTimeout,default_task_start_to_close_timeout +defaultTimeToLive,default_time_to_live +defaultValue,default_value +defaultValueList,default_value_list +defaultValueSpec,default_value_spec +defaultValueSpecification,default_value_specification +defaultVariation,default_variation +defaultVersion,default_version +defaultVersionId,default_version_id +defaultVersionName,default_version_name +definedIn,defined_in +definition,definition +definitionContent,definition_content +definitionUri,definition_uri +definitionZip,definition_zip +delayInSeconds,delay_in_seconds +delegatedAdmin,delegated_admin +delegatedAdminAccount,delegated_admin_account +delegatedAdminAccountId,delegated_admin_account_id +delegatedAdminAccounts,delegated_admin_accounts +delegationId,delegation_id +delegationIds,delegation_ids +delegations,delegations +delete,delete +deleteAdditionalMetricsToRetain,delete_additional_metrics_to_retain +deleteAlertTargets,delete_alert_targets +deleteAuditHistory,delete_audit_history +deleteBehaviors,delete_behaviors +deleteCollectionDetail,delete_collection_detail +deleteFiles,delete_files +deleteOnTermination,delete_on_termination +deletePipelineProvisioningRepository,delete_pipeline_provisioning_repository +deleteReports,delete_reports +deleteResources,delete_resources +deleteScheduledAudits,delete_scheduled_audits +deleteStack,delete_stack +deleteStream,delete_stream +deleteVpcEndpointDetail,delete_vpc_endpoint_detail +deleted,deleted +deletedAt,deleted_at +deletedBranch,deleted_branch +deletedPackage,deleted_package +deletedResources,deleted_resources +deletes,deletes +deletionCharacter,deletion_character +deletionProtected,deletion_protected +delimitedTextOptions,delimited_text_options +delimiter,delimiter +deliveryChannelName,delivery_channel_name +deliveryFrequency,delivery_frequency +deliveryStream,delivery_stream +deliveryStreamName,delivery_stream_name +deltaSyncConfig,delta_sync_config +deltaSyncTableName,delta_sync_table_name +deltaSyncTableTTL,delta_sync_table_ttl +deltaTime,delta_time +deltaTimeSessionWindowConfiguration,delta_time_session_window_configuration +demodulationConfig,demodulation_config +denied,denied +deniesUnencryptedObjectUploads,denies_unencrypted_object_uploads +denyListedAgentlessCollectors,deny_listed_agentless_collectors +denyListedMeCollectors,deny_listed_me_collectors +dependencies,dependencies +dependencyType,dependency_type +dependsOn,depends_on +dependsOnAlarms,depends_on_alarms +deployAsNew,deploy_as_new +deployed,deployed +deployedVersion,deployed_version +deployment,deployment +deploymentApplicationConfigs,deployment_application_configs +deploymentArtifacts,deployment_artifacts +deploymentCircuitBreaker,deployment_circuit_breaker +deploymentConfig,deployment_config +deploymentConfigId,deployment_config_id +deploymentConfigInfo,deployment_config_info +deploymentConfigName,deployment_config_name +deploymentConfigsList,deployment_configs_list +deploymentConfiguration,deployment_configuration +deploymentController,deployment_controller +deploymentDetail,deployment_detail +deploymentFinishTime,deployment_finish_time +deploymentGroupId,deployment_group_id +deploymentGroupInfo,deployment_group_info +deploymentGroupName,deployment_group_name +deploymentGroupNames,deployment_group_names +deploymentGroups,deployment_groups +deploymentGroupsInfo,deployment_groups_info +deploymentId,deployment_id +deploymentIds,deployment_ids +deploymentInfo,deployment_info +deploymentJobs,deployment_jobs +deploymentName,deployment_name +deploymentOption,deployment_option +deploymentOverview,deployment_overview +deploymentPolicies,deployment_policies +deploymentReadyOption,deployment_ready_option +deploymentStartTime,deployment_start_time +deploymentStatus,deployment_status +deploymentStatusMessage,deployment_status_message +deploymentStatusMessages,deployment_status_messages +deploymentStrategy,deployment_strategy +deploymentStyle,deployment_style +deploymentTarget,deployment_target +deploymentTargetType,deployment_target_type +deploymentTargets,deployment_targets +deploymentType,deployment_type +deploymentWaitType,deployment_wait_type +deployments,deployments +deploymentsInfo,deployments_info +deprecateExistingEntities,deprecate_existing_entities +deprecated,deprecated +deprecationDate,deprecation_date +deprecationMessage,deprecation_message +deregisterTime,deregister_time +deregisteredAt,deregistered_at +deregistrationPolicy,deregistration_policy +descending,descending +description,description +descriptions,descriptions +descriptiveText,descriptive_text +desiredCapacity,desired_capacity +desiredChange,desired_change +desiredCount,desired_count +desiredModelArn,desired_model_arn +desiredModelId,desired_model_id +desiredModelUnits,desired_model_units +desiredProvisionedModelName,desired_provisioned_model_name +desiredSize,desired_size +desiredState,desired_state +desiredStatus,desired_status +desiredvCpus,desiredv_cpus +destination,destination +destinationAccessToken,destination_access_token +destinationAccount,destination_account +destinationArn,destination_arn +destinationBranch,destination_branch +destinationCommit,destination_commit +destinationCommitId,destination_commit_id +destinationCommitSpecifier,destination_commit_specifier +destinationConfig,destination_config +destinationConfiguration,destination_configuration +destinationConnectionState,destination_connection_state +destinationConnectorLabel,destination_connector_label +destinationConnectorProperties,destination_connector_properties +destinationConnectorType,destination_connector_type +destinationField,destination_field +destinationFlowConfigList,destination_flow_config_list +destinationImageSet,destination_image_set +destinationImageSetProperties,destination_image_set_properties +destinationInfo,destination_info +destinationName,destination_name +destinationOptions,destination_options +destinationPackageVersions,destination_package_versions +destinationPath,destination_path +destinationPort,destination_port +destinationPrefix,destination_prefix +destinationProperties,destination_properties +destinationReference,destination_reference +destinationRegion,destination_region +destinationRepository,destination_repository +destinationS3BucketName,destination_s3_bucket_name +destinationS3Location,destination_s3_location +destinationS3Prefix,destination_s3_prefix +destinationServerId,destination_server_id +destinationSummaries,destination_summaries +destinationTableId,destination_table_id +destinationType,destination_type +destinationTypeParams,destination_type_params +destinationTypeProperties,destination_type_properties +destinations,destinations +detachedObjectIdentifier,detached_object_identifier +detail,detail +detailedMessage,detailed_message +detailedResultsLocation,detailed_results_location +details,details +detailsMap,details_map +detectSentiment,detect_sentiment +detectionPlatforms,detection_platforms +detections,detections +detector,detector +detectorDebugOptions,detector_debug_options +detectorId,detector_id +detectorModel,detector_model +detectorModelArn,detector_model_arn +detectorModelConfiguration,detector_model_configuration +detectorModelDefinition,detector_model_definition +detectorModelDescription,detector_model_description +detectorModelName,detector_model_name +detectorModelSummaries,detector_model_summaries +detectorModelVersion,detector_model_version +detectorModelVersionSummaries,detector_model_version_summaries +detectorName,detector_name +detectorSummaries,detector_summaries +detectorTags,detector_tags +detectorVersion,detector_version +detectorVersionId,detector_version_id +detectorVersionStatus,detector_version_status +detectorVersionSummaries,detector_version_summaries +detectors,detectors +determiningPolicies,determining_policies +devEnvironmentId,dev_environment_id +device,device +deviceArn,device_arn +deviceCapabilities,device_capabilities +deviceCapacities,device_capacities +deviceCertificateArn,device_certificate_arn +deviceCertificateId,device_certificate_id +deviceCode,device_code +deviceConfig,device_config +deviceDefender,device_defender +deviceDefenderIndexingMode,device_defender_indexing_mode +deviceHostPaths,device_host_paths +deviceId,device_id +deviceIdentifier,device_identifier +deviceIdentifierArn,device_identifier_arn +deviceIdentifiers,device_identifiers +deviceInstance,device_instance +deviceInstances,device_instances +deviceMinutes,device_minutes +deviceName,device_name +deviceParameters,device_parameters +devicePermissionRoleArn,device_permission_role_arn +devicePool,device_pool +devicePoolArn,device_pool_arn +devicePools,device_pools +deviceQueueInfo,device_queue_info +deviceRegistryEnrich,device_registry_enrich +deviceRoleArn,device_role_arn +deviceSelectionConfiguration,device_selection_configuration +deviceSelectionResult,device_selection_result +deviceShadowEnrich,device_shadow_enrich +deviceState,device_state +deviceStatus,device_status +deviceTemplateName,device_template_name +deviceTemplates,device_templates +deviceType,device_type +deviceUdid,device_udid +devices,devices +dfeQueryEngine,dfe_query_engine +diagnostics,diagnostics +diagnosticsMode,diagnostics_mode +dialRequests,dial_requests +dialerConfig,dialer_config +dialingCapacity,dialing_capacity +dialogAction,dialog_action +dialogActionType,dialog_action_type +dialogCodeHook,dialog_code_hook +dialogState,dialog_state +diffType,diff_type +differences,differences +digest,digest +dimensionColumns,dimension_columns +dimensionName,dimension_name +dimensionNames,dimension_names +dimensionValueOperator,dimension_value_operator +dimensions,dimensions +directConnectGateway,direct_connect_gateway +directConnectGatewayAssociation,direct_connect_gateway_association +directConnectGatewayAssociationProposal,direct_connect_gateway_association_proposal +directConnectGatewayAssociationProposals,direct_connect_gateway_association_proposals +directConnectGatewayAssociations,direct_connect_gateway_associations +directConnectGatewayAttachments,direct_connect_gateway_attachments +directConnectGatewayId,direct_connect_gateway_id +directConnectGatewayName,direct_connect_gateway_name +directConnectGatewayOwnerAccount,direct_connect_gateway_owner_account +directConnectGatewayState,direct_connect_gateway_state +directConnectGateways,direct_connect_gateways +direction,direction +directory,directory +directoryId,directory_id +directoryName,directory_name +directoryType,directory_type +disableActionConfiguration,disable_action_configuration +disableActionRequests,disable_action_requests +disableAllLogs,disable_all_logs +disableBackupRetention,disable_backup_retention +disableEmailNotification,disable_email_notification +disableExecuteApiEndpoint,disable_execute_api_endpoint +disableNetworking,disable_networking +disablePlayback,disable_playback +disableSSO,disable_sso +disabledAt,disabled_at +disabledOnInitialization,disabled_on_initialization +disabledReason,disabled_reason +disassociatedAt,disassociated_at +disassociatedDataStorage,disassociated_data_storage +disassociatedRepositoryNames,disassociated_repository_names +disconnectAfterInSeconds,disconnect_after_in_seconds +disconnectReason,disconnect_reason +disconnectTimeoutInMinutes,disconnect_timeout_in_minutes +discoveredIntentCount,discovered_intent_count +discoveredSlotTypeCount,discovered_slot_type_count +discoveryArn,discovery_arn +discoveryData,discovery_data +discoveryName,discovery_name +discoveryUrl,discovery_url +disk,disk +diskImageFormat,disk_image_format +diskName,disk_name +diskPath,disk_path +diskSize,disk_size +diskSizeInGb,disk_size_in_gb +diskSnapshot,disk_snapshot +diskSnapshotInfo,disk_snapshot_info +diskSnapshotName,disk_snapshot_name +diskSnapshots,disk_snapshots +disks,disks +display,display +displayAs,display_as +displayId,display_id +displayName,display_name +displayValue,display_value +disruptionScore,disruption_score +distinctOutgoingEdgeLabels,distinct_outgoing_edge_labels +distinctUsers,distinct_users +distribution,distribution +distributionConfiguration,distribution_configuration +distributionConfigurationArn,distribution_configuration_arn +distributionConfigurationSummaryList,distribution_configuration_summary_list +distributionDomainName,distribution_domain_name +distributionHostedZoneId,distribution_hosted_zone_id +distributionName,distribution_name +distributions,distributions +dns,dns +dnsEntry,dns_entry +dnsIpAddresses,dns_ip_addresses +dnsName,dns_name +dnsPolicy,dns_policy +dnsRecord,dns_record +dnsRecordCreationState,dns_record_creation_state +dnsSearchDomains,dns_search_domains +dnsServers,dns_servers +dnsStatus,dns_status +dockerLabels,docker_labels +dockerSecurityOptions,docker_security_options +dockerURI,docker_uri +dockerVersion,docker_version +dockerVolumeConfiguration,docker_volume_configuration +dockerfileTemplateData,dockerfile_template_data +dockerfileTemplateUri,dockerfile_template_uri +docs,docs +document,document +documentIdentifier,document_identifier +documentName,document_name +documentParameters,document_parameters +documentSource,document_source +documentType,document_type +documentVersion,document_version +documentation,documentation +documentationPartId,documentation_part_id +documentationVersion,documentation_version +documents,documents +domain,domain +domainArn,domain_arn +domainAssociation,domain_association +domainAssociationArn,domain_association_arn +domainAssociations,domain_associations +domainConfigurationArn,domain_configuration_arn +domainConfigurationName,domain_configuration_name +domainConfigurationStatus,domain_configuration_status +domainConfigurations,domain_configurations +domainDetails,domain_details +domainEntries,domain_entries +domainEntry,domain_entry +domainEntryPoint,domain_entry_point +domainId,domain_id +domainInfo,domain_info +domainInfos,domain_infos +domainName,domain_name +domainNameConfig,domain_name_config +domainNameConfigs,domain_name_configs +domainNameStatus,domain_name_status +domainNameStatusMessage,domain_name_status_message +domainOwner,domain_owner +domainStatus,domain_status +domainType,domain_type +domainValidationOptions,domain_validation_options +domainValidationRecords,domain_validation_records +domains,domains +doubleValue,double_value +downlinkBandwidthBits,downlink_bandwidth_bits +downlinkDelayMs,downlink_delay_ms +downlinkJitterMs,downlink_jitter_ms +downlinkLossPercent,downlink_loss_percent +downloadAllowed,download_allowed +downloadArtifactsUrl,download_artifacts_url +downloadConditionFile,download_condition_file +downloadUrl,download_url +driftStatus,drift_status +driftType,drift_type +driver,driver +driverOpts,driver_opts +drop,drop +dryRun,dry_run +dtcRequestIntervalSeconds,dtc_request_interval_seconds +dtmfSpecification,dtmf_specification +duration,duration +durationExpression,duration_expression +durationInMinutes,duration_in_minutes +durationInNanoSeconds,duration_in_nano_seconds +durationInSeconds,duration_in_seconds +durationRange,duration_range +durationSeconds,duration_seconds +durations,durations +dynamicParameters,dynamic_parameters +dynamoDB,dynamo_db +dynamoDBv2,dynamo_dbv2 +dynamodb,dynamodb +dynamodbConfig,dynamodb_config +eTag,e_tag +earlierTime,earlier_time +earliestRestorableTimestamp,earliest_restorable_timestamp +ebs,ebs +ebsEncryption,ebs_encryption +ebsEncryptionKeyArn,ebs_encryption_key_arn +ebsSnapshots,ebs_snapshots +ebsVolumeID,ebs_volume_id +ec2,ec2 +ec2Configuration,ec2_configuration +ec2ImageId,ec2_image_id +ec2InstanceFamily,ec2_instance_family +ec2InstanceID,ec2_instance_id +ec2InstanceId,ec2_instance_id +ec2InstanceImageId,ec2_instance_image_id +ec2InstanceState,ec2_instance_state +ec2InstanceSubnetId,ec2_instance_subnet_id +ec2InstanceTags,ec2_instance_tags +ec2InstanceType,ec2_instance_type +ec2InstanceTypes,ec2_instance_types +ec2InstanceVpcId,ec2_instance_vpc_id +ec2KeyName,ec2_key_name +ec2KeyPair,ec2_key_pair +ec2LaunchTemplateID,ec2_launch_template_id +ec2ScanStatus,ec2_scan_status +ec2SecurityGroupIds,ec2_security_group_ids +ec2SshKey,ec2_ssh_key +ec2SubnetIds,ec2_subnet_ids +ec2TagFilters,ec2_tag_filters +ec2TagSet,ec2_tag_set +ec2TagSetList,ec2_tag_set_list +ecr,ecr +ecrConfiguration,ecr_configuration +ecrImage,ecr_image +ecrImageArchitecture,ecr_image_architecture +ecrImageHash,ecr_image_hash +ecrImagePullerRole,ecr_image_puller_role +ecrImagePushedAt,ecr_image_pushed_at +ecrImageRegistry,ecr_image_registry +ecrImageRepositoryName,ecr_image_repository_name +ecrImageTags,ecr_image_tags +ecrRepository,ecr_repository +ecrRepositoryName,ecr_repository_name +ecrRepositoryPrefix,ecr_repository_prefix +ecrRepositoryPrefixes,ecr_repository_prefixes +ecsClusterArn,ecs_cluster_arn +ecsServiceRecommendations,ecs_service_recommendations +ecsServices,ecs_services +ecsTarget,ecs_target +edgeLabels,edge_labels +edgeProperties,edge_properties +edgeStructures,edge_structures +editContent,edit_content +editor,editor +effect,effect +effectiveDateTime,effective_date_time +effectiveDeployments,effective_deployments +effectiveGasPrice,effective_gas_price +effectiveOn,effective_on +effectivePermission,effective_permission +effectivePolicies,effective_policies +effectiveRecommendationPreferences,effective_recommendation_preferences +effectiveSettings,effective_settings +effectiveTime,effective_time +efsVolumeConfiguration,efs_volume_configuration +egressAddress,egress_address +egressFilter,egress_filter +eksAttempts,eks_attempts +eksClusterArn,eks_cluster_arn +eksConfiguration,eks_configuration +eksProperties,eks_properties +eksPropertiesOverride,eks_properties_override +eksSourceClusterNamespace,eks_source_cluster_namespace +eksSourceName,eks_source_name +eksSourceNames,eks_source_names +eksSources,eks_sources +elapsed,elapsed +elapsedReplicationDuration,elapsed_replication_duration +elapsedTimeInSeconds,elapsed_time_in_seconds +elasticsearch,elasticsearch +elasticsearchConfig,elasticsearch_config +elbInfoList,elb_info_list +element,element +elements,elements +elevation,elevation +elevationReference,elevation_reference +elevationUnit,elevation_unit +elicitationCodeHook,elicitation_code_hook +eligibleToRenew,eligible_to_renew +else,else +email,email +emailAddress,email_address +emailConfigurations,email_configurations +embed,embed +embeddingDataDeliveryEnabled,embedding_data_delivery_enabled +emoji,emoji +emptyDir,empty_dir +enable,enable +enableActionConfiguration,enable_action_configuration +enableActionRequests,enable_action_requests +enableAnswerMachineDetection,enable_answer_machine_detection +enableAutoBranchCreation,enable_auto_branch_creation +enableAutoBuild,enable_auto_build +enableAutoSubDomain,enable_auto_sub_domain +enableBackupRetention,enable_backup_retention +enableBasicAuth,enable_basic_auth +enableBranchAutoBuild,enable_branch_auto_build +enableBranchAutoDeletion,enable_branch_auto_deletion +enableCachingForHttp,enable_caching_for_http +enableCodeHookInvocation,enable_code_hook_invocation +enableDynamicFieldUpdate,enable_dynamic_field_update +enableECSManagedTags,enable_ecs_managed_tags +enableExecuteCommand,enable_execute_command +enableIoTLoggingParams,enable_io_t_logging_params +enableManagedSpotTraining,enable_managed_spot_training +enableMapAutoTagging,enable_map_auto_tagging +enableModelImprovements,enable_model_improvements +enableNotification,enable_notification +enableObjectVersioning,enable_object_versioning +enableOnPublicIp,enable_on_public_ip +enablePerformanceMode,enable_performance_mode +enablePullRequestPreview,enable_pull_request_preview +enableSiteLink,enable_site_link +enabled,enabled +enabledControls,enabled_controls +enablementStatus,enablement_status +encodedInputTranscript,encoded_input_transcript +encodedMessage,encoded_message +encoder,encoder +encoding,encoding +encodings,encodings +encrypted,encrypted +encryptionAlgorithm,encryption_algorithm +encryptionAlgorithmOptions,encryption_algorithm_options +encryptionConfig,encryption_config +encryptionConfiguration,encryption_configuration +encryptionContextEquals,encryption_context_equals +encryptionContextSubset,encryption_context_subset +encryptionDisabled,encryption_disabled +encryptionKey,encryption_key +encryptionKeyArn,encryption_key_arn +encryptionKeyOverride,encryption_key_override +encryptionMode,encryption_mode +encryptionSetting,encryption_setting +encryptionSpecification,encryption_specification +encryptionSpecificationOverride,encryption_specification_override +encryptionStatus,encryption_status +encryptionType,encryption_type +end,end +endAt,end_at +endBehavior,end_behavior +endCharOffset,end_char_offset +endCharacter,end_character +endDate,end_date +endDateTime,end_date_time +endInclusive,end_inclusive +endLine,end_line +endOffsetExclusive,end_offset_exclusive +endTime,end_time +endTimeAfter,end_time_after +endTimeBefore,end_time_before +endTimeInSeconds,end_time_in_seconds +endTimeOffsetInNanos,end_time_offset_in_nanos +endTimeoutMs,end_timeout_ms +endTimes,end_times +endToEndResult,end_to_end_result +endToEndResultCounts,end_to_end_result_counts +ended,ended +endedAt,ended_at +endedTime,ended_time +endpoint,endpoint +endpointAddress,endpoint_address +endpointArn,endpoint_arn +endpointConfig,endpoint_config +endpointConfiguration,endpoint_configuration +endpointCreateTime,endpoint_create_time +endpointDetails,endpoint_details +endpointIdentifier,endpoint_identifier +endpointName,endpoint_name +endpointPrivateAccess,endpoint_private_access +endpointPublicAccess,endpoint_public_access +endpointStatus,endpoint_status +endpointType,endpoint_type +endpoints,endpoints +endpointsDetails,endpoints_details +enforce,enforce +engagements,engagements +engine,engine +engineDescription,engine_description +engineType,engine_type +engineVersion,engine_version +engineVersionDescription,engine_version_description +engineVersions,engine_versions +enhancedFindings,enhanced_findings +enhancedImageMetadataEnabled,enhanced_image_metadata_enabled +enhancedInfrastructureMetrics,enhanced_infrastructure_metrics +enhancedVpcRouting,enhanced_vpc_routing +entities,entities +entitiesPath,entities_path +entity,entity +entityAggregates,entity_aggregates +entityArn,entity_arn +entityArns,entity_arns +entityId,entity_id +entityIdKey,entity_id_key +entityName,entity_name +entityOverrides,entity_overrides +entityPropertyReference,entity_property_reference +entitySummaries,entity_summaries +entityType,entity_type +entityTypes,entity_types +entityUrl,entity_url +entityUrlTemplate,entity_url_template +entityValue,entity_value +entityValues,entity_values +entries,entries +entry,entry +entryId,entry_id +entryName,entry_name +entryPoint,entry_point +entryPointArguments,entry_point_arguments +enumerationValues,enumeration_values +enums,enums +env,env +environment,environment +environmentAccountConnection,environment_account_connection +environmentAccountConnectionId,environment_account_connection_id +environmentAccountConnections,environment_account_connections +environmentAccountId,environment_account_id +environmentArn,environment_arn +environmentFiles,environment_files +environmentId,environment_id +environmentIds,environment_ids +environmentName,environment_name +environmentTemplate,environment_template +environmentTemplateVersion,environment_template_version +environmentTemplates,environment_templates +environmentTypeOverride,environment_type_override +environmentUrl,environment_url +environmentVariables,environment_variables +environmentVariablesOverride,environment_variables_override +environments,environments +ephemeralStorage,ephemeral_storage +ephemerides,ephemerides +ephemeris,ephemeris +ephemerisData,ephemeris_data +ephemerisId,ephemeris_id +epoch,epoch +epss,epss +epssScore,epss_score +eq,eq +eqExactMatch,eq_exact_match +error,error +errorAction,error_action +errorCategory,error_category +errorCode,error_code +errorData,error_data +errorDateTime,error_date_time +errorDescription,error_description +errorDetails,error_details +errorEntries,error_entries +errorHandlingConfig,error_handling_config +errorId,error_id +errorInfo,error_info +errorInformation,error_information +errorMessage,error_message +errorName,error_name +errorReason,error_reason +errorReportLocation,error_report_location +errorStack,error_stack +errorStackTrace,error_stack_trace +errorTimestamp,error_timestamp +errorType,error_type +errorTypes,error_types +error_description,error_description +errored,errored +errors,errors +errorsAndFailedEntriesZip,errors_and_failed_entries_zip +errorsPerPage,errors_per_page +escape,escape +escapeQuotes,escape_quotes +essential,essential +estimatedCost,estimated_cost +estimatedCostTier,estimated_cost_tier +estimatedMinutesRemaining,estimated_minutes_remaining +estimatedMonthlyCost,estimated_monthly_cost +estimatedMonthlySavings,estimated_monthly_savings +estimatedOn,estimated_on +estimatedPercentMonthlySavings,estimated_percent_monthly_savings +estimatedSecondsToCompletion,estimated_seconds_to_completion +estimatedSizeInBytes,estimated_size_in_bytes +estimatedTimeRemainingSeconds,estimated_time_remaining_seconds +etaDateTime,eta_date_time +etag,etag +eula,eula +eulaAcceptanceId,eula_acceptance_id +eulaAcceptances,eula_acceptances +eulaId,eula_id +eulaIds,eula_ids +eulas,eulas +evaluateExpressions,evaluate_expressions +evaluateOnExit,evaluate_on_exit +evaluated,evaluated +evaluatedExpression,evaluated_expression +evaluatedExternalModels,evaluated_external_models +evaluatedModelVersions,evaluated_model_versions +evaluation,evaluation +evaluationContext,evaluation_context +evaluationMethod,evaluation_method +evaluationOrder,evaluation_order +evaluationPeriods,evaluation_periods +evaluationResult,evaluation_result +evaluationRules,evaluation_rules +evaluationScore,evaluation_score +evaluationStrategy,evaluation_strategy +evaluations,evaluations +event,event +eventAggregates,event_aggregates +eventArn,event_arn +eventArns,event_arns +eventAttributionSource,event_attribution_source +eventBridge,event_bridge +eventBridgeConfig,event_bridge_config +eventBridgeEnabled,event_bridge_enabled +eventBusArn,event_bus_arn +eventCategories,event_categories +eventCategory,event_category +eventClasses,event_classes +eventConfigurations,event_configurations +eventCount,event_count +eventData,event_data +eventDataChecksum,event_data_checksum +eventDataSizeInBytes,event_data_size_in_bytes +eventDataStoreArn,event_data_store_arn +eventDate,event_date +eventDescription,event_description +eventID,event_id +eventId,event_id +eventIngestion,event_ingestion +eventList,event_list +eventMessage,event_message +eventMetadata,event_metadata +eventName,event_name +eventNumber,event_number +eventOrchestration,event_orchestration +eventPattern,event_pattern +eventPredictionSummaries,event_prediction_summaries +eventPublishers,event_publishers +eventReason,event_reason +eventReferences,event_references +eventResourceData,event_resource_data +eventResults,event_results +eventScopeCode,event_scope_code +eventSource,event_source +eventSources,event_sources +eventStatusCodes,event_status_codes +eventSubscriptions,event_subscriptions +eventSummaries,event_summaries +eventTime,event_time +eventTimestamp,event_timestamp +eventTracker,event_tracker +eventTrackerArn,event_tracker_arn +eventTrackers,event_trackers +eventType,event_type +eventTypeCategories,event_type_categories +eventTypeCategory,event_type_category +eventTypeCode,event_type_code +eventTypeCodes,event_type_codes +eventTypeName,event_type_name +eventTypes,event_types +eventUpdatedTime,event_updated_time +eventValue,event_value +eventValueThreshold,event_value_threshold +eventVariableName,event_variable_name +eventVariableNames,event_variable_names +eventVariables,event_variables +eventVersion,event_version +events,events +eventsDeletionStatus,events_deletion_status +evidence,evidence +evidenceAwsAccountId,evidence_aws_account_id +evidenceAwsServiceSourceCount,evidence_aws_service_source_count +evidenceByType,evidence_by_type +evidenceByTypeComplianceCheckCount,evidence_by_type_compliance_check_count +evidenceByTypeComplianceCheckIssuesCount,evidence_by_type_compliance_check_issues_count +evidenceByTypeConfigurationDataCount,evidence_by_type_configuration_data_count +evidenceByTypeManualCount,evidence_by_type_manual_count +evidenceByTypeUserActivityCount,evidence_by_type_user_activity_count +evidenceCount,evidence_count +evidenceDetail,evidence_detail +evidenceFileName,evidence_file_name +evidenceFinderEnabled,evidence_finder_enabled +evidenceFinderEnablement,evidence_finder_enablement +evidenceFolder,evidence_folder +evidenceFolderId,evidence_folder_id +evidenceFolders,evidence_folders +evidenceId,evidence_id +evidenceIds,evidence_ids +evidenceInsights,evidence_insights +evidenceResourcesIncludedCount,evidence_resources_included_count +evidenceRule,evidence_rule +evidenceSources,evidence_sources +evidences,evidences +exact,exact +example,example +exampleReference,example_reference +exception,exception +exceptionMessage,exception_message +exceptionName,exception_name +exceptionTimeToLive,exception_time_to_live +exceptions,exceptions +excerpt,excerpt +excludeAppPackagesFromCleanup,exclude_app_packages_from_cleanup +excludeMatchedPattern,exclude_matched_pattern +excludeProperties,exclude_properties +excludeReason,exclude_reason +excludeVerboseContent,exclude_verbose_content +excluded,excluded +excludedDatasetColumns,excluded_dataset_columns +excludedInstanceTypes,excluded_instance_types +excludes,excludes +exclusionArns,exclusion_arns +exclusionByResourceTypes,exclusion_by_resource_types +exclusionPreviews,exclusion_previews +exclusions,exclusions +execArgs,exec_args +executeCommandConfiguration,execute_command_configuration +executeCommandSessionConfiguration,execute_command_session_configuration +execution,execution +executionAbortedEventDetails,execution_aborted_event_details +executionArn,execution_arn +executionConfiguration,execution_configuration +executionContext,execution_context +executionCounts,execution_counts +executionDetails,execution_details +executionEndDate,execution_end_date +executionFailedEventDetails,execution_failed_event_details +executionFilter,execution_filter +executionID,execution_id +executionId,execution_id +executionIds,execution_ids +executionInfo,execution_info +executionInfos,execution_infos +executionMessage,execution_message +executionNamePrefix,execution_name_prefix +executionNumber,execution_number +executionResult,execution_result +executionRole,execution_role +executionRoleArn,execution_role_arn +executionStartDate,execution_start_date +executionStartToCloseTimeout,execution_start_to_close_timeout +executionStartedEventDetails,execution_started_event_details +executionState,execution_state +executionStatus,execution_status +executionStoppedAt,execution_stopped_at +executionSucceededEventDetails,execution_succeeded_event_details +executionSummaries,execution_summaries +executionTimedOutEventDetails,execution_timed_out_event_details +executionTimeoutMinutes,execution_timeout_minutes +executionTimeoutSeconds,execution_timeout_seconds +executionUrlTemplate,execution_url_template +executions,executions +executor,executor +existingAllowedPrefixesToDirectConnectGateway,existing_allowed_prefixes_to_direct_connect_gateway +existingFindingId,existing_finding_id +existingFindingStatus,existing_finding_status +existingImageName,existing_image_name +existingRuleContentSha256,existing_rule_content_sha256 +exists,exists +exitBehavior,exit_behavior +exitCode,exit_code +expected,expected +expectedAgentPrompt,expected_agent_prompt +expectedComplianceStatus,expected_compliance_status +expectedFingerprint,expected_fingerprint +expectedOutput,expected_output +expectedReferenceId,expected_reference_id +expectedRevisionId,expected_revision_id +expectedRpoDescription,expected_rpo_description +expectedRpoInSecs,expected_rpo_in_secs +expectedRtoDescription,expected_rto_description +expectedRtoInSecs,expected_rto_in_secs +expectedSequenceToken,expected_sequence_token +expectedStatus,expected_status +expectedTimestamp,expected_timestamp +expectedValue,expected_value +expectedVersion,expected_version +experiment,experiment +experimentCount,experiment_count +experimentTemplate,experiment_template +experimentTemplateId,experiment_template_id +experimentTemplates,experiment_templates +experiments,experiments +expiration,expiration +expirationDate,expiration_date +expirationInSeconds,expiration_in_seconds +expirationTime,expiration_time +expired,expired +expiredLogEventEndIndex,expired_log_event_end_index +expires,expires +expiresAt,expires_at +expiresIn,expires_in +expiresInMinutes,expires_in_minutes +expiresInSec,expires_in_sec +expiresInSeconds,expires_in_seconds +expiresOn,expires_on +expiresTime,expires_time +expiringImageTotalCount,expiring_image_total_count +expiryTime,expiry_time +explainMode,explain_mode +explicitDeny,explicit_deny +exploitAvailable,exploit_available +exploitObserved,exploit_observed +exploitabilityDetails,exploitability_details +exponentialRate,exponential_rate +export,export +exportBucketArn,export_bucket_arn +exportConfig,export_config +exportConfigType,export_config_type +exportDataFormat,export_data_format +exportID,export_id +exportIDs,export_ids +exportId,export_id +exportIds,export_ids +exportJobs,export_jobs +exportRequestTime,export_request_time +exportSnapshotRecords,export_snapshot_records +exportStatus,export_status +exportSummaries,export_summaries +exportTask,export_task +exportTasks,export_tasks +exportType,export_type +exportedEnvironmentVariables,exported_environment_variables +exportsInfo,exports_info +expr,expr +expression,expression +expressionString,expression_string +expressionWithValues,expression_with_values +exprs,exprs +extendedKeyUsage,extended_key_usage +extendsFrom,extends_from +extension,extension +external,external +externalConnection,external_connection +externalConnectionName,external_connection_name +externalConnections,external_connections +externalEventsDetail,external_events_detail +externalExecutionId,external_execution_id +externalExecutionSummary,external_execution_summary +externalExecutionUrl,external_execution_url +externalId,external_id +externalIdProperty,external_id_property +externalInitiatedEventId,external_initiated_event_id +externalLocation,external_location +externalMetricStatus,external_metric_status +externalMetricsPreference,external_metrics_preference +externalModel,external_model +externalModelEndpointDataBlobs,external_model_endpoint_data_blobs +externalModelEndpoints,external_model_endpoints +externalModelOutputs,external_model_outputs +externalModels,external_models +externalParameters,external_parameters +externalSourceSetting,external_source_setting +externalWorkflowExecution,external_workflow_execution +externalWorkflowExecutionCancelRequestedEventAttributes,external_workflow_execution_cancel_requested_event_attributes +externalWorkflowExecutionSignaledEventAttributes,external_workflow_execution_signaled_event_attributes +extraDataPackageArn,extra_data_package_arn +extraHosts,extra_hosts +extractedValues,extracted_values +facet,facet +facets,facets +fact,fact +factor,factor +facts,facts +failOnError,fail_on_error +failOnFirstDestinationError,fail_on_first_destination_error +failOnWarnings,fail_on_warnings +failWhenMissing,fail_when_missing +failWorkflowExecutionDecisionAttributes,fail_workflow_execution_decision_attributes +failWorkflowExecutionFailedEventAttributes,fail_workflow_execution_failed_event_attributes +failback,failback +failbackClientID,failback_client_id +failbackClientLastSeenByServiceDateTime,failback_client_last_seen_by_service_date_time +failbackInitiationTime,failback_initiation_time +failbackJobID,failback_job_id +failbackLaunchType,failback_launch_type +failbackToOriginalServer,failback_to_original_server +failed,failed +failedAccountIds,failed_account_ids +failedAccounts,failed_accounts +failedAt,failed_at +failedBatchItems,failed_batch_items +failedChecks,failed_checks +failedEntries,failed_entries +failedEventCount,failed_event_count +failedExecutions,failed_executions +failedFindings,failed_findings +failedFindingsCount,failed_findings_count +failedItem,failed_item +failedItems,failed_items +failedRecordsCount,failed_records_count +failedRequestCount,failed_request_count +failedRequests,failed_requests +failedS3Resources,failed_s3_resources +failedSet,failed_set +failedTasks,failed_tasks +failedVersions,failed_versions +failedWorldCount,failed_world_count +failure,failure +failureBehavior,failure_behavior +failureCause,failure_cause +failureCode,failure_code +failureConditional,failure_conditional +failureCount,failure_count +failureDetails,failure_details +failureHandlingPolicy,failure_handling_policy +failureMessage,failure_message +failureNextStep,failure_next_step +failureReason,failure_reason +failureReasons,failure_reasons +failureResource,failure_resource +failureResponse,failure_response +failureSummary,failure_summary +failureThresholdPercentage,failure_threshold_percentage +failureType,failure_type +failures,failures +fairsharePolicy,fairshare_policy +fallbackLocation,fallback_location +fallbackResult,fallback_result +families,families +family,family +familyPrefix,family_prefix +fargatePlatformConfiguration,fargate_platform_configuration +fargateProfile,fargate_profile +fargateProfileArn,fargate_profile_arn +fargateProfileName,fargate_profile_name +fargateProfileNames,fargate_profile_names +fastLaunchConfigurations,fast_launch_configurations +feature,feature +featureCount,feature_count +featureName,feature_name +featureSet,feature_set +featureTransformation,feature_transformation +featureTransformationArn,feature_transformation_arn +featureTransformationParameters,feature_transformation_parameters +featureVariations,feature_variations +features,features +federatedUser,federated_user +federationMode,federation_mode +federationParameters,federation_parameters +federationProviderName,federation_provider_name +federationURN,federation_urn +fetchSubmodules,fetch_submodules +field,field +fieldArn,field_arn +fieldId,field_id +fieldLengthRange,field_length_range +fieldLevelMessages,field_level_messages +fieldList,field_list +fieldLogLevel,field_log_level +fieldName,field_name +fieldType,field_type +fieldValueRange,field_value_range +fields,fields +fieldsToExport,fields_to_export +file,file +fileContent,file_content +fileDescription,file_description +fileExistsBehavior,file_exists_behavior +fileFormat,file_format +fileFormatConfiguration,file_format_configuration +fileFormatType,file_format_type +fileId,file_id +fileKey,file_key +fileLevelMessages,file_level_messages +fileLocation,file_location +fileMap,file_map +fileMd5,file_md5 +fileMode,file_mode +fileModeConflict,file_mode_conflict +fileModes,file_modes +fileName,file_name +filePassword,file_password +filePath,file_path +filePaths,file_paths +filePosition,file_position +fileSize,file_size +fileSizes,file_sizes +fileSystemId,file_system_id +fileSystemLocations,file_system_locations +fileSystemPolicy,file_system_policy +fileSystemType,file_system_type +fileType,file_type +fileUploadUrls,file_upload_urls +fileUploaderConfig,file_uploader_config +fileVersion,file_version +filename,filename +files,files +filesAdded,files_added +filesDeleted,files_deleted +filesUpdated,files_updated +filter,filter +filterArn,filter_arn +filterBy,filter_by +filterByName,filter_by_name +filterByPublished,filter_by_published +filterByRecordingConfigurationArn,filter_by_recording_configuration_arn +filterByState,filter_by_state +filterByUserId,filter_by_user_id +filterCriteria,filter_criteria +filterExpression,filter_expression +filterFormula,filter_formula +filterGroups,filter_groups +filterName,filter_name +filterNamePrefix,filter_name_prefix +filterOperators,filter_operators +filterPattern,filter_pattern +filterQuery,filter_query +filterType,filter_type +filterValue,filter_value +filterValues,filter_values +filters,filters +finalCaseStatus,final_case_status +finalRelationalDatabaseSnapshotName,final_relational_database_snapshot_name +finalSnapshotName,final_snapshot_name +finalSnapshotRetentionPeriod,final_snapshot_retention_period +finalized,finalized +finding,finding +findingArn,finding_arn +findingArns,finding_arns +findingCounts,finding_counts +findingCriteria,finding_criteria +findingDetails,finding_details +findingId,finding_id +findingIdentifiers,finding_identifiers +findingIds,finding_ids +findingNumber,finding_number +findingPublishingFrequency,finding_publishing_frequency +findingReasonCodes,finding_reason_codes +findingSeverityCounts,finding_severity_counts +findingStatus,finding_status +findingTime,finding_time +findingType,finding_type +findingTypes,finding_types +findings,findings +findingsFilterListItems,findings_filter_list_items +findingsMetrics,findings_metrics +findingsReportSummaries,findings_report_summaries +fingerprint,fingerprint +fingerprintSHA1,fingerprint_sha1 +fingerprintSHA256,fingerprint_sha256 +finishedAt,finished_at +finishedCount,finished_count +finishedWorldsSummary,finished_worlds_summary +firehose,firehose +firelensConfiguration,firelens_configuration +firstBoot,first_boot +firstByteDateTime,first_byte_date_time +firstEnabledAt,first_enabled_at +firstEventTimestamp,first_event_timestamp +firstExecutionFrom,first_execution_from +firstJoinTime,first_join_time +firstName,first_name +firstObservedAt,first_observed_at +firstSeen,first_seen +firstUsedTime,first_used_time +firstUtteredDate,first_uttered_date +fixAvailable,fix_available +fixedInVersion,fixed_in_version +flaggedResources,flagged_resources +flatten,flatten +fleet,fleet +fleetArn,fleet_arn +fleetDetails,fleet_details +fleetId,fleet_id +fleetInstanceId,fleet_instance_id +fleetMetrics,fleet_metrics +fleetName,fleet_name +fleetSummaries,fleet_summaries +fleetType,fleet_type +fleets,fleets +floorplanCount,floorplan_count +flowActionsRoleArn,flow_actions_role_arn +flowArn,flow_arn +flowErrorDeactivationThreshold,flow_error_deactivation_threshold +flowExecutionId,flow_execution_id +flowExecutions,flow_executions +flowName,flow_name +flowStatus,flow_status +flowStatusMessage,flow_status_message +flowTemplateId,flow_template_id +flows,flows +folderPath,folder_path +followUpPrompt,follow_up_prompt +force,force +forceCanceled,force_canceled +forceDelete,force_delete +forceDeleteAWSJob,force_delete_aws_job +forceDeleteAddOns,force_delete_add_ons +forceNewDeployment,force_new_deployment +forceStop,force_stop +forceStopAppReplication,force_stop_app_replication +forceTerminateApp,force_terminate_app +forceUefi,force_uefi +forceUpdate,force_update +form,form +formActionType,form_action_type +formFactor,form_factor +formToCreate,form_to_create +format,format +formatOptions,format_options +formatParams,format_params +formatRecordsAs,format_records_as +formatToHeader,format_to_header +formattedRecords,formatted_records +formattedValue,formatted_value +formattedValues,formatted_values +formula,formula +forwardedCookies,forwarded_cookies +forwardedHeaders,forwarded_headers +forwardedQueryStrings,forwarded_query_strings +forwardingConfig,forwarding_config +found,found +foundationModelArn,foundation_model_arn +foundationModelArnEquals,foundation_model_arn_equals +fpr,fpr +fqdn,fqdn +fqdnForActionFramework,fqdn_for_action_framework +fragmentsFilePath,fragments_file_path +frameAddress,frame_address +frameMetric,frame_metric +frameMetricData,frame_metric_data +frameMetrics,frame_metrics +frameName,frame_name +framework,framework +frameworkDescription,framework_description +frameworkId,framework_id +frameworkMetadataList,framework_metadata_list +frameworkName,framework_name +frameworkType,framework_type +freeTrialConsumed,free_trial_consumed +freeTrialExpiration,free_trial_expiration +freeTrialInfo,free_trial_info +freeTrialStartDate,free_trial_start_date +frequency,frequency +frequencyInSeconds,frequency_in_seconds +friendlyName,friendly_name +from,from +fromAttachedDisks,from_attached_disks +fromBlockchainInstant,from_blockchain_instant +fromBlueprintId,from_blueprint_id +fromBundleId,from_bundle_id +fromDate,from_date +fromDateTime,from_date_time +fromDiskArn,from_disk_arn +fromDiskInfo,from_disk_info +fromDiskName,from_disk_name +fromInstanceArn,from_instance_arn +fromInstanceName,from_instance_name +fromPermissionArn,from_permission_arn +fromPermissionVersion,from_permission_version +fromPort,from_port +fromRelationalDatabaseArn,from_relational_database_arn +fromRelationalDatabaseBlueprintId,from_relational_database_blueprint_id +fromRelationalDatabaseBundleId,from_relational_database_bundle_id +fromRelationalDatabaseName,from_relational_database_name +fromResourceArn,from_resource_arn +fromResourceName,from_resource_name +fsxWindowsFileServerVolumeConfiguration,fsx_windows_file_server_volume_configuration +fulfillmentActivity,fulfillment_activity +fulfillmentCodeHook,fulfillment_code_hook +fulfillmentState,fulfillment_state +fulfillmentUpdatesSpecification,fulfillment_updates_specification +fullString,full_string +fullyQualifiedName,fully_qualified_name +function,function +functionAlias,function_alias +functionArn,function_arn +functionArns,function_arns +functionConfiguration,function_configuration +functionId,function_id +functionInstances,function_instances +functionName,function_name +functionNames,function_names +functionPackages,function_packages +functionTags,function_tags +functionVersion,function_version +functions,functions +gasUsed,gas_used +gatewayArn,gateway_arn +gatewayCapabilitySummaries,gateway_capability_summaries +gatewayId,gateway_id +gatewayName,gateway_name +gatewayPlatform,gateway_platform +gatewayRoute,gateway_route +gatewayRouteName,gateway_route_name +gatewayRoutes,gateway_routes +gatewaySummaries,gateway_summaries +gbInUse,gb_in_use +gbPerMonthAllocated,gb_per_month_allocated +generateDistinctId,generate_distinct_id +generatedFields,generated_fields +generatedFrom,generated_from +generatedId,generated_id +generatedPolicies,generated_policies +generatedPolicyResult,generated_policy_result +generatedSceneMetadata,generated_scene_metadata +generationDataSource,generation_data_source +generationId,generation_id +generationJob,generation_job +generatorId,generator_id +genericAttachments,generic_attachments +genericDataSchema,generic_data_schema +genericRevisionInfo,generic_revision_info +getObject,get_object +getTokenBalanceInputs,get_token_balance_inputs +gitCloneDepth,git_clone_depth +gitCloneDepthOverride,git_clone_depth_override +gitHub,git_hub +gitHubAccountName,git_hub_account_name +gitHubLocation,git_hub_location +gitSubmodulesConfig,git_submodules_config +gitSubmodulesConfigOverride,git_submodules_config_override +global,global +glueConfiguration,glue_configuration +glueDataCatalog,glue_data_catalog +gps,gps +gpuCount,gpu_count +gpuIds,gpu_ids +gpuMemorySizeInMiB,gpu_memory_size_in_mib +gpuUnitLimit,gpu_unit_limit +gpus,gpus +grafanaVersion,grafana_version +grafanaVersions,grafana_versions +grammarSlotTypeSetting,grammar_slot_type_setting +grantType,grant_type +grantee,grantee +granteePrincipal,grantee_principal +grants,grants +graphSummary,graph_summary +graphqlApi,graphql_api +graphqlApis,graphql_apis +greenFleetProvisioningOption,green_fleet_provisioning_option +greenGrassGroupId,green_grass_group_id +greengrass,greengrass +greengrassDeploymentId,greengrass_deployment_id +greengrassGroupId,greengrass_group_id +greengrassGroupName,greengrass_group_name +greengrassGroupVersionId,greengrass_group_version_id +greengrassV2,greengrass_v2 +gremlin,gremlin +gremlinQuery,gremlin_query +groundStation,ground_station +groundStationId,ground_station_id +groundStationList,ground_station_list +groundStationName,ground_station_name +groundStations,ground_stations +group,group +groupArn,group_arn +groupAttribute,group_attribute +groupBy,group_by +groupByKeys,group_by_keys +groupDesc,group_desc +groupId,group_id +groupIdFilter,group_id_filter +groupKey,group_key +groupName,group_name +groupNumber,group_number +groupType,group_type +groupWeights,group_weights +groups,groups +groupsClaim,groups_claim +groupsPrefix,groups_prefix +grpcRetryEvents,grpc_retry_events +grpcRoute,grpc_route +gt,gt +gte,gte +haArchitecture,ha_architecture +hardLimit,hard_limit +hardware,hardware +hardwareId,hardware_id +hasChildEntities,has_child_entities +hasErrorEvent,has_error_event +hasFlaggedResources,has_flagged_resources +hasHeaderRow,has_header_row +hasLogicalRedundancy,has_logical_redundancy +hasMoreErrors,has_more_errors +hasMoreResults,has_more_results +hasNestedEntities,has_nested_entities +hasTransmissionEcu,has_transmission_ecu +hashAlgorithm,hash_algorithm +hashAlgorithmOptions,hash_algorithm_options +hashKeyField,hash_key_field +hashKeyType,hash_key_type +hashKeyValue,hash_key_value +hashed,hashed +hashes,hashes +headCommitId,head_commit_id +header,header +headerMatches,header_matches +headerName,header_name +headerValue,header_value +headers,headers +headersAllowList,headers_allow_list +headersToInclude,headers_to_include +health,health +healthCheck,health_check +healthCheckGracePeriodSeconds,health_check_grace_period_seconds +healthCheckIntervalSeconds,health_check_interval_seconds +healthCheckPath,health_check_path +healthCheckTimeoutSeconds,health_check_timeout_seconds +healthReasons,health_reasons +healthServiceAccessStatusForOrganization,health_service_access_status_for_organization +healthStatus,health_status +healthyAgentlessCollectors,healthy_agentless_collectors +healthyAgents,healthy_agents +healthyConnectors,healthy_connectors +healthyMeCollectors,healthy_me_collectors +healthyThreshold,healthy_threshold +healthyThresholdCount,healthy_threshold_count +heapSize,heap_size +heartbeatInSeconds,heartbeat_in_seconds +heartbeatTimeout,heartbeat_timeout +height,height +helmChart,helm_chart +hierarchies,hierarchies +hierarchyId,hierarchy_id +hierarchyInfo,hierarchy_info +high,high +highAvailabilityConfig,high_availability_config +highlight,highlight +highlights,highlights +historyFilter,history_filter +hit,hit +hitCount,hit_count +hits,hits +homePage,home_page +homeRegion,home_region +hook,hook +hooksNotCleanedUp,hooks_not_cleaned_up +horizontalGap,horizontal_gap +host,host +hostAddress,host_address +hostKeys,host_keys +hostName,host_name +hostNetwork,host_network +hostPath,host_path +hostPort,host_port +hostPortRange,host_port_range +hostPrefix,host_prefix +hostedZoneId,hosted_zone_id +hostname,hostname +hpoConfig,hpo_config +hpoJob,hpo_job +hpoObjective,hpo_objective +hpoResourceConfig,hpo_resource_config +http,http +http2Route,http2_route +httpApiKeyAuth,http_api_key_auth +httpConfig,http_config +httpContext,http_context +httpEndpoint,http_endpoint +httpMethod,http_method +httpProtocolIpv6,http_protocol_ipv6 +httpPutResponseHopLimit,http_put_response_hop_limit +httpRetryEvents,http_retry_events +httpRoute,http_route +httpTokens,http_tokens +httpUrlConfiguration,http_url_configuration +httpUrlProperties,http_url_properties +httpUrlSummary,http_url_summary +https,https +httpsRedirectionEnabled,https_redirection_enabled +hunkContent,hunk_content +hyperParameters,hyper_parameters +hyperlinkName,hyperlink_name +iam,iam +iamArn,iam_arn +iamId,iam_id +iamInstanceProfileArn,iam_instance_profile_arn +iamInstanceProfileName,iam_instance_profile_name +iamRegistrationResponse,iam_registration_response +iamResources,iam_resources +iamRole,iam_role +iamRoleArn,iam_role_arn +iamRoles,iam_roles +iamServiceRoleArn,iam_service_role_arn +iamSessionArn,iam_session_arn +iamUser,iam_user +iamUserArn,iam_user_arn +iatTTL,iat_ttl +iccid,iccid +icmpTypeCode,icmp_type_code +iconUrl,icon_url +id,id +idFieldNames,id_field_names +idRef,id_ref +idToken,id_token +idempotencyToken,idempotency_token +identifer,identifer +identificationHints,identification_hints +identifier,identifier +identifiers,identifiers +identity,identity +identityId,identity_id +identityProvider,identity_provider +identityProviderArn,identity_provider_arn +identityProviderConfig,identity_provider_config +identityProviderConfigArn,identity_provider_config_arn +identityProviderConfigName,identity_provider_config_name +identityProviderConfigs,identity_provider_configs +identityProviderDetails,identity_provider_details +identityProviderName,identity_provider_name +identityProviderType,identity_provider_type +identityProviders,identity_providers +identitySource,identity_source +identitySourceId,identity_source_id +identitySources,identity_sources +identityStoreId,identity_store_id +identityToken,identity_token +identityType,identity_type +identityValidationExpression,identity_validation_expression +ides,ides +idle,idle +idleDisconnectTimeoutInMinutes,idle_disconnect_timeout_in_minutes +idleSessionTTLInSeconds,idle_session_ttl_in_seconds +idleTimeoutMinutes,idle_timeout_minutes +idpMetadata,idp_metadata +ids,ids +ignoreApplicationStopFailures,ignore_application_stop_failures +ignoreEmptyRows,ignore_empty_rows +ignoreFailure,ignore_failure +ignoreFilterField,ignore_filter_field +ignoreJobChecks,ignore_job_checks +ignorePollAlarmFailure,ignore_poll_alarm_failure +ignorePublicAcls,ignore_public_acls +ignoreQualField,ignore_qual_field +ignoreWords,ignore_words +image,image +imageAggregation,image_aggregation +imageArn,image_arn +imageBuildVersionArn,image_build_version_arn +imageConfiguration,image_configuration +imageDataDeliveryEnabled,image_data_delivery_enabled +imageDetail,image_detail +imageDetails,image_details +imageDigest,image_digest +imageFrameBlob,image_frame_blob +imageFrameId,image_frame_id +imageFrameInformation,image_frame_information +imageHash,image_hash +imageId,image_id +imageIdOverride,image_id_override +imageIds,image_ids +imageKubernetesVersion,image_kubernetes_version +imageManifest,image_manifest +imageManifestMediaType,image_manifest_media_type +imageOsVersionOverride,image_os_version_override +imageOverride,image_override +imagePackageList,image_package_list +imagePermissions,image_permissions +imagePipeline,image_pipeline +imagePipelineAggregation,image_pipeline_aggregation +imagePipelineArn,image_pipeline_arn +imagePipelineList,image_pipeline_list +imagePullCredentialsType,image_pull_credentials_type +imagePullCredentialsTypeOverride,image_pull_credentials_type_override +imagePullPolicy,image_pull_policy +imagePushedAt,image_pushed_at +imageRecipe,image_recipe +imageRecipeArn,image_recipe_arn +imageRecipeSummaryList,image_recipe_summary_list +imageResponseCard,image_response_card +imageScanCompletedAt,image_scan_completed_at +imageScanFindings,image_scan_findings +imageScanFindingsSummary,image_scan_findings_summary +imageScanStatus,image_scan_status +imageScanningConfiguration,image_scanning_configuration +imageScanningEnabled,image_scanning_enabled +imageSetArn,image_set_arn +imageSetId,image_set_id +imageSetMetadataBlob,image_set_metadata_blob +imageSetPropertiesList,image_set_properties_list +imageSetState,image_set_state +imageSetWorkflowStatus,image_set_workflow_status +imageSetsMetadataSummaries,image_sets_metadata_summaries +imageSha,image_sha +imageShas,image_shas +imageSizeInBytes,image_size_in_bytes +imageSource,image_source +imageSummaryList,image_summary_list +imageTag,image_tag +imageTagDetails,image_tag_details +imageTagMutability,image_tag_mutability +imageTags,image_tags +imageTestsConfiguration,image_tests_configuration +imageTestsEnabled,image_tests_enabled +imageType,image_type +imageUri,image_uri +imageUris,image_uris +imageUrl,image_url +imageVersionArn,image_version_arn +imageVersionList,image_version_list +images,images +impact,impact +implementedBy,implemented_by +implicitDeny,implicit_deny +importCompletionTime,import_completion_time +importConfig,import_config +importDeletedTime,import_deleted_time +importID,import_id +importIDs,import_ids +importId,import_id +importInputLocation,import_input_location +importJobs,import_jobs +importMode,import_mode +importName,import_name +importOptions,import_options +importRequestTime,import_request_time +importStatus,import_status +importStrategy,import_strategy +importSummaries,import_summaries +importTask,import_task +importTaskId,import_task_id +importTaskIds,import_task_ids +importType,import_type +importUrl,import_url +importedAppId,imported_app_id +importedResourceId,imported_resource_id +importedResourceName,imported_resource_name +importedResourceType,imported_resource_type +importedValue,imported_value +impression,impression +imsi,imsi +in,in +inProgress,in_progress +inProgressChecks,in_progress_checks +inProgressJobs,in_progress_jobs +inProgressTimeoutInMinutes,in_progress_timeout_in_minutes +inReplyTo,in_reply_to +inUseResourceCount,in_use_resource_count +inactivityTimeoutMinutes,inactivity_timeout_minutes +inboundExecution,inbound_execution +inboundTransitionState,inbound_transition_state +incidentRecord,incident_record +incidentRecordArn,incident_record_arn +incidentRecordSource,incident_record_source +incidentRecordSummaries,incident_record_summaries +incidentTags,incident_tags +incidentTemplate,incident_template +incidentTemplateDedupeString,incident_template_dedupe_string +incidentTemplateImpact,incident_template_impact +incidentTemplateNotificationTargets,incident_template_notification_targets +incidentTemplateSummary,incident_template_summary +incidentTemplateTags,incident_template_tags +incidentTemplateTitle,incident_template_title +include,include +includeAllVersions,include_all_versions +includeAvailabilityZones,include_availability_zones +includeCanceled,include_canceled +includeCertificateDetails,include_certificate_details +includeCommunications,include_communications +includeConnectedResources,include_connected_resources +includeContent,include_content +includeDefaultKeyPair,include_default_key_pair +includeDeletedRecords,include_deleted_records +includeDeletedResources,include_deleted_resources +includeDeprecated,include_deprecated +includeDescription,include_description +includeDirectives,include_directives +includeExecutionData,include_execution_data +includeFromUpstream,include_from_upstream +includeGlobalResourceTypes,include_global_resource_types +includeInactive,include_inactive +includeJobDocument,include_job_document +includeJobExecutionState,include_job_execution_state +includeLinkedAccounts,include_linked_accounts +includeMemberAccounts,include_member_accounts +includeOnlyActiveViolations,include_only_active_violations +includeOnlyStatuses,include_only_statuses +includeQueuedLoads,include_queued_loads +includeRelationalDatabaseAvailabilityZones,include_relational_database_availability_zones +includeRenditions,include_renditions +includeResolvedCases,include_resolved_cases +includeResourcePlaceholders,include_resource_placeholders +includeResultMetadata,include_result_metadata +includeServiceLevelTemplate,include_service_level_template +includeShadowTrails,include_shadow_trails +includeSourceFiles,include_source_files +includeStatistics,include_statistics +includeSuppressedAlerts,include_suppressed_alerts +includeValue,include_value +includeValues,include_values +includeWaiting,include_waiting +included,included +includedData,included_data +includes,includes +inclusionStatus,inclusion_status +incompatibilityMessages,incompatibility_messages +incompatibleDevices,incompatible_devices +inconclusiveEvidenceCount,inconclusive_evidence_count +incrementFactor,increment_factor +incrementalPullConfig,incremental_pull_config +incrementalRunConfig,incremental_run_config +incrementalRunType,incremental_run_type +index,index +indexName,index_name +indexNames,index_names +indexOps,index_ops +indexStatus,index_status +indicatorOfCompromise,indicator_of_compromise +inferenceAcceleratorOverrides,inference_accelerator_overrides +inferenceAccelerators,inference_accelerators +inferenceTypesSupported,inference_types_supported +inferredWorkloadSavings,inferred_workload_savings +inferredWorkloadTypes,inferred_workload_types +info,info +infrastructureConfiguration,infrastructure_configuration +infrastructureConfigurationArn,infrastructure_configuration_arn +infrastructureConfigurationSummaryList,infrastructure_configuration_summary_list +ingestConfiguration,ingest_configuration +ingestEndpoint,ingest_endpoint +ingestedEventStatistics,ingested_event_statistics +ingestedEventsDetail,ingested_events_detail +ingestedEventsTimeWindow,ingested_events_time_window +ingestion,ingestion +ingestionArn,ingestion_arn +ingestionDestination,ingestion_destination +ingestionDestinationIdentifier,ingestion_destination_identifier +ingestionDestinations,ingestion_destinations +ingestionIdentifier,ingestion_identifier +ingestionMode,ingestion_mode +ingestionTime,ingestion_time +ingestionType,ingestion_type +ingestions,ingestions +ingressAddress,ingress_address +ingressPortOverride,ingress_port_override +inheritedProperties,inherited_properties +initProcessEnabled,init_process_enabled +initQueryFile,init_query_file +initialCapacity,initial_capacity +initialCaseStatus,initial_case_status +initialResponse,initial_response +initialResponseSetting,initial_response_setting +initialRevision,initial_revision +initialRun,initial_run +initialState,initial_state +initialStateName,initial_state_name +initializationConfiguration,initialization_configuration +initializationScript,initialization_script +initializationScripts,initialization_scripts +initiated,initiated +initiatedBy,initiated_by +initiatedEventId,initiated_event_id +initiator,initiator +inlineDocument,inline_document +inlineRecipe,inline_recipe +inlineSourceMap,inline_source_map +input,input +inputArn,input_arn +inputArtifactDetails,input_artifact_details +inputArtifacts,input_artifacts +inputCharacter,input_character +inputConfiguration,input_configuration +inputContexts,input_contexts +inputDataConfig,input_data_config +inputDataS3Location,input_data_s3_location +inputDefinition,input_definition +inputDescription,input_description +inputDetails,input_details +inputFileBucket,input_file_bucket +inputFileKey,input_file_key +inputIdentifier,input_identifier +inputList,input_list +inputModalities,input_modalities +inputMode,input_mode +inputName,input_name +inputParameters,input_parameters +inputPath,input_path +inputPayloadEncodingType,input_payload_encoding_type +inputProperty,input_property +inputPropertyValue,input_property_value +inputRecords,input_records +inputS3Bucket,input_s3_bucket +inputS3Key,input_s3_key +inputS3Uri,input_s3_uri +inputSourceARN,input_source_arn +inputSourceConfig,input_source_config +inputStream,input_stream +inputSummaries,input_summaries +inputText,input_text +inputToken,input_token +inputTranscript,input_transcript +inputType,input_type +inputVariables,input_variables +inputs,inputs +insecureIngest,insecure_ingest +insecureSkipVerification,insecure_skip_verification +insecureSsl,insecure_ssl +insecureSslOverride,insecure_ssl_override +insights,insights +inspectorScore,inspector_score +inspectorScoreDetails,inspector_score_details +installState,install_state +installedComponents,installed_components +installedVersion,installed_version +installingVersion,installing_version +instance,instance +instanceArn,instance_arn +instanceArns,instance_arns +instanceConfig,instance_config +instanceConfiguration,instance_configuration +instanceCount,instance_count +instanceGpuInfo,instance_gpu_info +instanceHealth,instance_health +instanceHealthReason,instance_health_reason +instanceHealthSummary,instance_health_summary +instanceId,instance_id +instanceIdFilter,instance_id_filter +instanceIdentity,instance_identity +instanceIdentityDocument,instance_identity_document +instanceIdentityDocumentSignature,instance_identity_document_signature +instanceIds,instance_ids +instanceInfo,instance_info +instanceInfos,instance_infos +instanceLabel,instance_label +instanceMetadataOptions,instance_metadata_options +instanceName,instance_name +instanceNames,instance_names +instancePort,instance_port +instanceProfile,instance_profile +instanceProfileName,instance_profile_name +instanceProfiles,instance_profiles +instanceProperties,instance_properties +instanceRecommendations,instance_recommendations +instanceRole,instance_role +instanceSnapshot,instance_snapshot +instanceSnapshotInfo,instance_snapshot_info +instanceSnapshotName,instance_snapshot_name +instanceSnapshots,instance_snapshots +instanceState,instance_state +instanceStatusFilter,instance_status_filter +instanceSummary,instance_summary +instanceTags,instance_tags +instanceTarget,instance_target +instanceTerminationWaitTimeStarted,instance_termination_wait_time_started +instanceType,instance_type +instanceTypeFilter,instance_type_filter +instanceTypes,instance_types +instanceUrl,instance_url +instanceWarmupPeriod,instance_warmup_period +instances,instances +instancesList,instances_list +instancesSummary,instances_summary +instantiatedVnfInfo,instantiated_vnf_info +instantiationState,instantiation_state +integerHyperParameterRanges,integer_hyper_parameter_ranges +integerValue,integer_value +integrationConfiguration,integration_configuration +integrationHttpMethod,integration_http_method +integrationResponses,integration_responses +integrations,integrations +intendedForQualification,intended_for_qualification +intent,intent +intentClassificationResults,intent_classification_results +intentClassificationTestResults,intent_classification_test_results +intentClosingSetting,intent_closing_setting +intentConfirmationSetting,intent_confirmation_setting +intentCount,intent_count +intentDiscrepancies,intent_discrepancies +intentId,intent_id +intentLevel,intent_level +intentLevelSlotResolutionTestResults,intent_level_slot_resolution_test_results +intentMatchResult,intent_match_result +intentMatchResultCounts,intent_match_result_counts +intentName,intent_name +intentPath,intent_path +intentSignature,intent_signature +intentState,intent_state +intentSummaries,intent_summaries +intentVersion,intent_version +intents,intents +intentsCount,intents_count +interactionMode,interaction_mode +interactive,interactive +interconnectId,interconnect_id +interconnectName,interconnect_name +interconnectState,interconnect_state +interconnects,interconnects +interfaceId,interface_id +interfaceName,interface_name +interiorCountPerFloorplan,interior_count_per_floorplan +interleaved,interleaved +intermediateBucketName,intermediate_bucket_name +internal,internal +internalDeviceName,internal_device_name +interpolatedAssetPropertyValues,interpolated_asset_property_values +interpolation,interpolation +interpolationType,interpolation_type +interpretations,interpretations +interpretedValue,interpreted_value +interval,interval +intervalInSeconds,interval_in_seconds +intervalMillis,interval_millis +intervalSeconds,interval_seconds +intervalWindowInSeconds,interval_window_in_seconds +invalidExecutions,invalid_executions +invalidNetworkInterfaces,invalid_network_interfaces +invalidNodes,invalid_nodes +invalidReason,invalid_reason +invalidSignals,invalid_signals +invert,invert +invitationId,invitation_id +invitationTimestamp,invitation_timestamp +invitations,invitations +invitationsCount,invitations_count +invitedAt,invited_at +invocationLabel,invocation_label +invokeModelEndpointRoleArn,invoke_model_endpoint_role_arn +invokedBy,invoked_by +invokedIntentSamples,invoked_intent_samples +invoker,invoker +invokerRoleName,invoker_role_name +iops,iops +iosPaths,ios_paths +iotAnalytics,iot_analytics +iotEvents,iot_events +iotEventsDestinationConfiguration,iot_events_destination_configuration +iotEventsInputIdentifier,iot_events_input_identifier +iotJobArn,iot_job_arn +iotJobConfiguration,iot_job_configuration +iotJobId,iot_job_id +iotSiteWise,iot_site_wise +iotSiteWiseAssetModelPropertyIdentifier,iot_site_wise_asset_model_property_identifier +iotSiteWiseInputIdentifier,iot_site_wise_input_identifier +iotSiteWiseMultiLayerStorage,iot_site_wise_multi_layer_storage +iotTopicPublish,iot_topic_publish +ipAccessSettings,ip_access_settings +ipAccessSettingsArn,ip_access_settings_arn +ipAddress,ip_address +ipAddressAssignment,ip_address_assignment +ipAddressBasedRemoteInfoList,ip_address_based_remote_info_list +ipAddressConfigurationTimeStamp,ip_address_configuration_time_stamp +ipAddressDetails,ip_address_details +ipAddressType,ip_address_type +ipAddressV4,ip_address_v4 +ipCity,ip_city +ipCountry,ip_country +ipFamily,ip_family +ipGeoLocation,ip_geo_location +ipGroupIds,ip_group_ids +ipOwner,ip_owner +ipPreference,ip_preference +ipRange,ip_range +ipRule,ip_rule +ipRules,ip_rules +ipV4Addresses,ipv4_addresses +ipV6Addresses,ipv6_addresses +ipcMode,ipc_mode +ips,ips +ipv4Address,ipv4_address +ipv4Addresses,ipv4_addresses +ipv6Address,ipv6_address +ipv6Addresses,ipv6_addresses +ipv6Cidrs,ipv6_cidrs +isAbstract,is_abstract +isActive,is_active +isAlias,is_alias +isAlreadyVerified,is_already_verified +isApiKeyAuthSupported,is_api_key_auth_supported +isArchived,is_archived +isArray,is_array +isAttached,is_attached +isAuthenticated,is_authenticated +isAutoIncrement,is_auto_increment +isAwsOrgEnabled,is_aws_org_enabled +isBasicAuthSupported,is_basic_auth_supported +isBigEndian,is_big_endian +isBinaryFile,is_binary_file +isBootDisk,is_boot_disk +isCancelled,is_cancelled +isCaseSensitive,is_case_sensitive +isComplete,is_complete +isConcurrent,is_concurrent +isConflict,is_conflict +isCreatable,is_creatable +isCurrency,is_currency +isCustomAuthSupported,is_custom_auth_supported +isDefault,is_default +isDefaultVersion,is_default_version +isDefaultedOnCreate,is_defaulted_on_create +isDefinedInJob,is_defined_in_job +isDeprecated,is_deprecated +isDisabled,is_disabled +isDrill,is_drill +isEnabled,is_enabled +isEncrypted,is_encrypted +isEngineDefault,is_engine_default +isExternalId,is_external_id +isFinal,is_final +isFromAutoSnapshot,is_from_auto_snapshot +isHasManyIndex,is_has_many_index +isImported,is_imported +isInherited,is_inherited +isJoinTable,is_join_table +isLastOp,is_last_op +isLatestForTarget,is_latest_for_target +isLongDurationTest,is_long_duration_test +isMainNode,is_main_node +isMerged,is_merged +isModifiable,is_modifiable +isMonitoredByJob,is_monitored_by_job +isMove,is_move +isNative,is_native +isNonModelSupported,is_non_model_supported +isNullable,is_nullable +isOAuth2Supported,is_o_auth2_supported +isOptedOut,is_opted_out +isPeered,is_peered +isPreferred,is_preferred +isPrimary,is_primary +isPrimaryKey,is_primary_key +isPrivateLinkEnabled,is_private_link_enabled +isPrivateLinkEndpointUrlRequired,is_private_link_endpoint_url_required +isPublic,is_public +isQueryable,is_queryable +isRecursive,is_recursive +isRedshiftServerless,is_redshift_serverless +isRelationshipSupported,is_relationship_supported +isRequired,is_required +isRequiredInEntity,is_required_in_entity +isReservedMinutesCustomer,is_reserved_minutes_customer +isResourceTypeDefault,is_resource_type_default +isResumable,is_resumable +isRetrievable,is_retrievable +isRevoked,is_revoked +isRoot,is_root +isSandboxEnvironment,is_sandbox_environment +isSchemaInitialized,is_schema_initialized +isSemVer,is_sem_ver +isSensitiveField,is_sensitive_field +isServiceLimited,is_service_limited +isSigned,is_signed +isSingleton,is_singleton +isStaticIp,is_static_ip +isStoredExternally,is_stored_externally +isSuppressed,is_suppressed +isSystemDisk,is_system_disk +isTerminal,is_terminal +isTerminated,is_terminated +isTimeSeries,is_time_series +isTimestampFieldForIncrementalQueries,is_timestamp_field_for_incremental_queries +isTruncated,is_truncated +isTunable,is_tunable +isUpdatable,is_updatable +isUpsertable,is_upsertable +isValid,is_valid +isolationMode,isolation_mode +isp,isp +issueCode,issue_code +issueType,issue_type +issuedAt,issued_at +issuer,issuer +issuerCA,issuer_ca +issuerCertificateIdentifier,issuer_certificate_identifier +issuerCertificateSerialNumber,issuer_certificate_serial_number +issuerCertificateSubject,issuer_certificate_subject +issuerId,issuer_id +issuerUrl,issuer_url +issues,issues +issuesEnabled,issues_enabled +issuingAccount,issuing_account +item,item +itemAttribute,item_attribute +itemCount,item_count +itemCounts,item_counts +itemExplorationConfig,item_exploration_config +itemId,item_id +itemList,item_list +items,items +iteratorType,iterator_type +job,job +jobArn,job_arn +jobConfiguration,job_configuration +jobCreationDate,job_creation_date +jobDefinition,job_definition +jobDefinitionArn,job_definition_arn +jobDefinitionName,job_definition_name +jobDefinitions,job_definitions +jobDetails,job_details +jobDocument,job_document +jobDriver,job_driver +jobError,job_error +jobExecutionSummary,job_execution_summary +jobExecutionTimeoutMinutes,job_execution_timeout_minutes +jobExecutionsRetryConfig,job_executions_retry_config +jobExecutionsRolloutConfig,job_executions_rollout_config +jobExpiresAt,job_expires_at +jobID,job_id +jobIDs,job_ids +jobId,job_id +jobIdentifier,job_identifier +jobIds,job_ids +jobImminentExpirationHealthEventArn,job_imminent_expiration_health_event_arn +jobInput,job_input +jobInvoker,job_invoker +jobLastUpdateDate,job_last_update_date +jobMetadata,job_metadata +jobName,job_name +jobOutput,job_output +jobOutputPath,job_output_path +jobOwner,job_owner +jobParameters,job_parameters +jobParams,job_params +jobPausedAt,job_paused_at +jobPort,job_port +jobProcessDetails,job_process_details +jobProperties,job_properties +jobQueue,job_queue +jobQueueArn,job_queue_arn +jobQueueName,job_queue_name +jobQueues,job_queues +jobReason,job_reason +jobRoleArn,job_role_arn +jobRun,job_run +jobRunId,job_run_id +jobRuns,job_runs +jobStatus,job_status +jobSummaries,job_summaries +jobSummary,job_summary +jobSummaryList,job_summary_list +jobTags,job_tags +jobTemplate,job_template +jobTemplateArn,job_template_arn +jobTemplateData,job_template_data +jobTemplateId,job_template_id +jobTemplateParameters,job_template_parameters +jobTemplates,job_templates +jobTimeout,job_timeout +jobTimeoutMinutes,job_timeout_minutes +jobToken,job_token +jobType,job_type +jobUser,job_user +jobWorkerExecutorConfiguration,job_worker_executor_configuration +jobs,jobs +joinColumns,join_columns +joinRequired,join_required +jsonConfiguration,json_configuration +jsonInputTemplate,json_input_template +jsonKeyToVariableMap,json_key_to_variable_map +jsonPath,json_path +jumboFrameCapable,jumbo_frame_capable +jwtToken,jwt_token +kafka,kafka +kafkaCluster,kafka_cluster +kafkaClusterClientAuthentication,kafka_cluster_client_authentication +kafkaClusterEncryptionInTransit,kafka_cluster_encryption_in_transit +kafkaConnectVersion,kafka_connect_version +keepEmptyFolders,keep_empty_folders +kendraConfiguration,kendra_configuration +kendraIndex,kendra_index +kernelVersion,kernel_version +key,key +keyAlgorithm,key_algorithm +keyArn,key_arn +keyId,key_id +keyName,key_name +keyPair,key_pair +keyPairName,key_pair_name +keyPairs,key_pairs +keyPolicies,key_policies +keyPrefix,key_prefix +keyRole,key_role +keyTemplate,key_template +keyType,key_type +keyTypes,key_types +keyUsage,key_usage +keyValue,key_value +keyspaceName,keyspace_name +keyspaces,keyspaces +keyword,keyword +keywordInputType,keyword_input_type +keywordValue,keyword_value +keywords,keywords +kind,kind +kinesis,kinesis +kinesisStreamArn,kinesis_stream_arn +kmsArn,kms_arn +kmsEncryptionKeyArn,kms_encryption_key_arn +kmsError,kms_error +kmsKey,kms_key +kmsKeyArn,kms_key_arn +kmsKeyId,kms_key_id +kmsKeyIdentifier,kms_key_identifier +kmsManaged,kms_managed +kmsMasterKeyId,kms_master_key_id +knowledgeBase,knowledge_base +knowledgeBaseArn,knowledge_base_arn +knowledgeBaseId,knowledge_base_id +knowledgeBaseSummaries,knowledge_base_summaries +knowledgeBaseType,knowledge_base_type +knownDependencyCount,known_dependency_count +kubernetesNamespace,kubernetes_namespace +kubernetesNetworkConfig,kubernetes_network_config +kubernetesVersion,kubernetes_version +kxChangesets,kx_changesets +kxClusterSummaries,kx_cluster_summaries +kxDatabases,kx_databases +labMode,lab_mode +label,label +labelDecorator,label_decorator +labelMapper,label_mapper +labelSchema,label_schema +labelTimestamp,label_timestamp +labels,labels +lagDuration,lag_duration +lagId,lag_id +lagName,lag_name +lagState,lag_state +lags,lags +lambda,lambda +lambdaARN,lambda_arn +lambdaAction,lambda_action +lambdaArn,lambda_arn +lambdaAuthorizerConfig,lambda_authorizer_config +lambdaCode,lambda_code +lambdaCodeHook,lambda_code_hook +lambdaConfig,lambda_config +lambdaConflictHandlerArn,lambda_conflict_handler_arn +lambdaConflictHandlerConfig,lambda_conflict_handler_config +lambdaEventStructureVersion,lambda_event_structure_version +lambdaExecutorConfiguration,lambda_executor_configuration +lambdaFunction,lambda_function +lambdaFunctionArn,lambda_function_arn +lambdaFunctionCompletedEventAttributes,lambda_function_completed_event_attributes +lambdaFunctionExecutionRoleArn,lambda_function_execution_role_arn +lambdaFunctionFailedEventAttributes,lambda_function_failed_event_attributes +lambdaFunctionFailedEventDetails,lambda_function_failed_event_details +lambdaFunctionInfo,lambda_function_info +lambdaFunctionLastModifiedAt,lambda_function_last_modified_at +lambdaFunctionLayers,lambda_function_layers +lambdaFunctionName,lambda_function_name +lambdaFunctionRecommendations,lambda_function_recommendations +lambdaFunctionRuntime,lambda_function_runtime +lambdaFunctionScheduleFailedEventDetails,lambda_function_schedule_failed_event_details +lambdaFunctionScheduledEventAttributes,lambda_function_scheduled_event_attributes +lambdaFunctionScheduledEventDetails,lambda_function_scheduled_event_details +lambdaFunctionStartFailedEventDetails,lambda_function_start_failed_event_details +lambdaFunctionStartedEventAttributes,lambda_function_started_event_attributes +lambdaFunctionSucceededEventDetails,lambda_function_succeeded_event_details +lambdaFunctionTags,lambda_function_tags +lambdaFunctionTimedOutEventAttributes,lambda_function_timed_out_event_attributes +lambdaFunctionTimedOutEventDetails,lambda_function_timed_out_event_details +lambdaName,lambda_name +lambdaRole,lambda_role +lambdaTags,lambda_tags +lambdaTarget,lambda_target +language,language +languageAvailability,language_availability +languages,languages +largeDataDeliveryS3Config,large_data_delivery_s3_config +largeVolumeConf,large_volume_conf +lastAccess,last_access +lastActivityDate,last_activity_date +lastActivityTimeStamp,last_activity_time_stamp +lastAnalyzedTimestamp,last_analyzed_timestamp +lastAppComplianceEvaluationTime,last_app_compliance_evaluation_time +lastAssessmentRunArn,last_assessment_run_arn +lastAttemptTime,last_attempt_time +lastAttemptedDeployment,last_attempted_deployment +lastAttemptedDeploymentId,last_attempted_deployment_id +lastAutomatedDiscoveryTime,last_automated_discovery_time +lastBuildSubmittedDateTime,last_build_submitted_date_time +lastByteReceived,last_byte_received +lastChangedAt,last_changed_at +lastChangedBy,last_changed_by +lastClientRequestToken,last_client_request_token +lastCompletedChangesetId,last_completed_changeset_id +lastContentModificationTime,last_content_modification_time +lastCutover,last_cutover +lastDeployTime,last_deploy_time +lastDeploymentAttemptedAt,last_deployment_attempted_at +lastDeploymentJob,last_deployment_job +lastDeploymentStatus,last_deployment_status +lastDeploymentSucceededAt,last_deployment_succeeded_at +lastDeploymentTime,last_deployment_time +lastDisabledTime,last_disabled_time +lastDriftEvaluationTime,last_drift_evaluation_time +lastEnabledTime,last_enabled_time +lastErrorCode,last_error_code +lastErrorMessage,last_error_message +lastEvaluatedAt,last_evaluated_at +lastEventId,last_event_id +lastEventTimestamp,last_event_timestamp +lastHealthPingTime,last_health_ping_time +lastHeartbeatTime,last_heartbeat_time +lastIngestionTime,last_ingestion_time +lastInstallationSource,last_installation_source +lastJobId,last_job_id +lastJobRunTime,last_job_run_time +lastKnownExploitAt,last_known_exploit_at +lastLaunch,last_launch +lastLaunchResult,last_launch_result +lastLoginTime,last_login_time +lastMessageArrivalTime,last_message_arrival_time +lastModelRefreshDate,last_model_refresh_date +lastModificationTime,last_modification_time +lastModified,last_modified +lastModifiedAt,last_modified_at +lastModifiedBy,last_modified_by +lastModifiedDate,last_modified_date +lastModifiedDateTime,last_modified_date_time +lastModifiedOn,last_modified_on +lastModifiedSecret,last_modified_secret +lastModifiedTime,last_modified_time +lastModifiedTimestamp,last_modified_timestamp +lastModifiedUser,last_modified_user +lastName,last_name +lastObservedAt,last_observed_at +lastReachedOutAt,last_reached_out_at +lastRecordedPullTime,last_recorded_pull_time +lastRecovery,last_recovery +lastRecoveryResult,last_recovery_result +lastReferencedTime,last_referenced_time +lastRefreshTimestamp,last_refresh_timestamp +lastReportedTimestamp,last_reported_timestamp +lastResiliencyScoreEvaluationTime,last_resiliency_score_evaluation_time +lastResourceAnalyzed,last_resource_analyzed +lastResourceAnalyzedAt,last_resource_analyzed_at +lastRunErrorStatus,last_run_error_status +lastRunExecutionDetails,last_run_execution_details +lastRunMetadataCatalogDetails,last_run_metadata_catalog_details +lastRunTime,last_run_time +lastScannedAt,last_scanned_at +lastSeen,last_seen +lastSeenAt,last_seen_at +lastSeenByServiceDateTime,last_seen_by_service_date_time +lastSeenDatetime,last_seen_datetime +lastSnapshotDateTime,last_snapshot_date_time +lastStartTime,last_start_time +lastStartedAt,last_started_at +lastStatisticsComputationTime,last_statistics_computation_time +lastStatus,last_status +lastStatusChange,last_status_change +lastStatusChangeDate,last_status_change_date +lastStatusChangeTime,last_status_change_time +lastStatusChangeTimestamp,last_status_change_timestamp +lastStatusUpdateTimestamp,last_status_update_timestamp +lastStopTime,last_stop_time +lastSucceededDeploymentId,last_succeeded_deployment_id +lastSuccessfulComponentDeploymentIds,last_successful_component_deployment_ids +lastSuccessfulDeployment,last_successful_deployment +lastSuccessfulEnvironmentDeploymentId,last_successful_environment_deployment_id +lastSuccessfulMergeDate,last_successful_merge_date +lastSuccessfulServicePipelineDeploymentId,last_successful_service_pipeline_deployment_id +lastSuccessfulTime,last_successful_time +lastSyncedAt,last_synced_at +lastTest,last_test +lastTriggered,last_triggered +lastTrxTimestampInMillis,last_trx_timestamp_in_millis +lastUpdateDate,last_update_date +lastUpdateDateTime,last_update_date_time +lastUpdateTime,last_update_time +lastUpdateToPayPerRequestTimestamp,last_update_to_pay_per_request_timestamp +lastUpdated,last_updated +lastUpdatedAt,last_updated_at +lastUpdatedBy,last_updated_by +lastUpdatedDataTime,last_updated_data_time +lastUpdatedDate,last_updated_date +lastUpdatedDateTime,last_updated_date_time +lastUpdatedOn,last_updated_on +lastUpdatedTime,last_updated_time +lastUpdatedTimes,last_updated_times +lastUpdatedTimestamp,last_updated_timestamp +lastUsed,last_used +lastUsedDate,last_used_date +lastUsedIntent,last_used_intent +lastUsedTime,last_used_time +lastUtteredDate,last_uttered_date +lastValidByteReceived,last_valid_byte_received +lastViolationTime,last_violation_time +lastViolationValue,last_violation_value +lat,lat +lateDataRules,late_data_rules +latency,latency +latencyMode,latency_mode +laterTime,later_time +latestActivityTaskTimestamp,latest_activity_task_timestamp +latestAgentOrchestratedAt,latest_agent_orchestrated_at +latestAgentProfileReportedAt,latest_agent_profile_reported_at +latestAggregatedProfile,latest_aggregated_profile +latestAmiId,latest_ami_id +latestBlockers,latest_blockers +latestBotVersion,latest_bot_version +latestCampaignUpdate,latest_campaign_update +latestCancelRequestedEventId,latest_cancel_requested_event_id +latestDatasetUpdate,latest_dataset_update +latestDate,latest_date +latestDescription,latest_description +latestExecution,latest_execution +latestExecutionContext,latest_execution_context +latestLaunchTime,latest_launch_time +latestRecommenderUpdate,latest_recommender_update +latestReplicationTime,latest_replication_time +latestRestorableTime,latest_restorable_time +latestRevision,latest_revision +latestSolutionVersion,latest_solution_version +latestSuccessfulSync,latest_successful_sync +latestSync,latest_sync +latestValidationTime,latest_validation_time +latestVersion,latest_version +latestVersionId,latest_version_id +latitude,latitude +launch,launch +launchActionsStatus,launch_actions_status +launchConfig,launch_config +launchConfigurationStatus,launch_configuration_status +launchConfigurationTemplate,launch_configuration_template +launchConfigurationTemplateID,launch_configuration_template_id +launchConfigurationTemplateIDs,launch_configuration_template_ids +launchCount,launch_count +launchDetails,launch_details +launchDisposition,launch_disposition +launchFile,launch_file +launchOrder,launch_order +launchPermission,launch_permission +launchProfile,launch_profile +launchProfileId,launch_profile_id +launchProfileInitialization,launch_profile_initialization +launchProfileProtocolVersion,launch_profile_protocol_version +launchProfileProtocolVersions,launch_profile_protocol_versions +launchProfiles,launch_profiles +launchPurpose,launch_purpose +launchStatus,launch_status +launchStatusMessage,launch_status_message +launchTemplate,launch_template +launchTemplateConfigurations,launch_template_configurations +launchTemplateId,launch_template_id +launchTemplateName,launch_template_name +launchTemplateVersion,launch_template_version +launchTime,launch_time +launchType,launch_type +launchedAt,launched_at +launchedEc2InstanceID,launched_ec2_instance_id +launchedInstance,launched_instance +launchedVpcID,launched_vpc_id +launches,launches +layerArn,layer_arn +layerArns,layer_arns +layerAvailability,layer_availability +layerDigest,layer_digest +layerDigests,layer_digests +layerHash,layer_hash +layerHashes,layer_hashes +layerPartBlob,layer_part_blob +layerSize,layer_size +layers,layers +layoutArn,layout_arn +layoutConfiguration,layout_configuration +layoutId,layout_id +layouts,layouts +lcmOpInfo,lcm_op_info +lcmOperationType,lcm_operation_type +learnMoreLink,learn_more_link +leastRecentEvent,least_recent_event +length,length +level,level +lexTranscriptFilter,lex_transcript_filter +licenseConfigurationArns,license_configuration_arns +licenseCostReduction,license_cost_reduction +licenseEdition,license_edition +licenseExpiration,license_expiration +licenseModel,license_model +licenseName,license_name +licenseRecommendationOptions,license_recommendation_options +licenseRecommendations,license_recommendations +licenseType,license_type +licenseUrl,license_url +licenseVersion,license_version +licenses,licenses +licensing,licensing +lifeCycle,life_cycle +lifeCycleStates,life_cycle_states +lifecycle,lifecycle +lifecycleConfiguration,lifecycle_configuration +lifecycleEventHookExecutionId,lifecycle_event_hook_execution_id +lifecycleEventName,lifecycle_event_name +lifecycleEvents,lifecycle_events +lifecyclePolicyText,lifecycle_policy_text +lifecycleState,lifecycle_state +lifecycleStateDetails,lifecycle_state_details +lifecycleStatusCodes,lifecycle_status_codes +limit,limit +limitCode,limit_code +limits,limits +line,line +lineCoveragePercentage,line_coverage_percentage +lineNumber,line_number +lineRange,line_range +lineRanges,line_ranges +lineSep,line_sep +linearInterval,linear_interval +linearPercentage,linear_percentage +linesCovered,lines_covered +linesMissed,lines_missed +link,link +linkOutUri,link_out_uri +linkedToGitHub,linked_to_git_hub +links,links +linux,linux +linuxMountPoint,linux_mount_point +linuxParameters,linux_parameters +linuxProcessParams,linux_process_params +listAntipatternSeveritySummary,list_antipattern_severity_summary +listApplicationComponentStatusSummary,list_application_component_status_summary +listApplicationComponentStrategySummary,list_application_component_strategy_summary +listApplicationComponentSummary,list_application_component_summary +listColumns,list_columns +listServerStatusSummary,list_server_status_summary +listServerStrategySummary,list_server_strategy_summary +listServerSummary,list_server_summary +listSuppressedAlerts,list_suppressed_alerts +listSuppressedFindings,list_suppressed_findings +listValue,list_value +listenerArns,listener_arns +listenerIdentifier,listener_identifier +listenerPorts,listener_ports +listeners,listeners +lists,lists +loa,loa +loaContent,loa_content +loaContentType,loa_content_type +loaIssueTime,loa_issue_time +loadBalancer,load_balancer +loadBalancerArn,load_balancer_arn +loadBalancerDnsName,load_balancer_dns_name +loadBalancerInfo,load_balancer_info +loadBalancerName,load_balancer_name +loadBalancers,load_balancers +loadId,load_id +loadIds,load_ids +localPath,local_path +localTraits,local_traits +locale,locale +localeId,locale_id +localeName,locale_name +location,location +locationCode,location_code +locationName,location_name +locationStatus,location_status +locationType,location_type +locations,locations +lockId,lock_id +log,log +logConfig,log_config +logConfiguration,log_configuration +logContext,log_context +logDateTime,log_date_time +logDelivery,log_delivery +logDriver,log_driver +logEventMessages,log_event_messages +logEvents,log_events +logExports,log_exports +logGroup,log_group +logGroupArn,log_group_arn +logGroupFields,log_group_fields +logGroupIdentifier,log_group_identifier +logGroupIdentifiers,log_group_identifiers +logGroupName,log_group_name +logGroupNamePattern,log_group_name_pattern +logGroupNamePrefix,log_group_name_prefix +logGroupNames,log_group_names +logGroups,log_groups +logLevel,log_level +logOddsImpact,log_odds_impact +logOddsMetrics,log_odds_metrics +logPrefix,log_prefix +logRecord,log_record +logRecordPointer,log_record_pointer +logResult,log_result +logSchemaVersion,log_schema_version +logSettings,log_settings +logStream,log_stream +logStreamName,log_stream_name +logStreamNamePrefix,log_stream_name_prefix +logStreamNames,log_stream_names +logStreams,log_streams +logTail,log_tail +logTarget,log_target +logTargetConfigurations,log_target_configurations +logType,log_type +logTypes,log_types +logUri,log_uri +logUrl,log_url +logging,logging +loggingConfig,logging_config +loggingConfiguration,logging_configuration +loggingConfigurationIdentifier,logging_configuration_identifier +loggingConfigurationIdentifiers,logging_configuration_identifiers +loggingConfigurations,logging_configurations +loggingLevel,logging_level +loggingOptions,logging_options +loggingOptionsPayload,logging_options_payload +logicalId,logical_id +logicalResourceId,logical_resource_id +logicalStackName,logical_stack_name +logicalStackNames,logical_stack_names +login,login +loginValidityDuration,login_validity_duration +logo,logo +logoImageBlob,logo_image_blob +logoURL,logo_url +logoUrl,logo_url +logonLanguage,logon_language +logs,logs +logsConfig,logs_config +logsConfigOverride,logs_config_override +lon,lon +longReturnType,long_return_type +longValue,long_value +longitude,longitude +lookBackPeriodInDays,look_back_period_in_days +lookbackPeriodInDays,lookback_period_in_days +low,low +lowerBoundValue,lower_bound_value +lowerBoundValues,lower_bound_values +lowerInclusive,lower_inclusive +lt,lt +lte,lte +macAddress,mac_address +macSecCapable,mac_sec_capable +macSecKeys,mac_sec_keys +main,main +mainNode,main_node +maintenanceWindows,maintenance_windows +majorVersion,major_version +majorVersionNumber,major_version_number +managedAgentName,managed_agent_name +managedAgents,managed_agents +managedCredentialsAction,managed_credentials_action +managedCredentialsStatus,managed_credentials_status +managedDataIdentifierIds,managed_data_identifier_ids +managedDataIdentifierSelector,managed_data_identifier_selector +managedDeviceArn,managed_device_arn +managedDeviceId,managed_device_id +managedFields,managed_fields +managedJobTemplates,managed_job_templates +managedPersistenceMonitoringConfiguration,managed_persistence_monitoring_configuration +managedPolicyArns,managed_policy_arns +managedScaling,managed_scaling +managedTerminationProtection,managed_termination_protection +managementAccountId,management_account_id +managementPreference,management_preference +manifest,manifest +manualEvidence,manual_evidence +manualEvidenceCount,manual_evidence_count +manufacturer,manufacturer +mapAutoTaggingMpeID,map_auto_tagging_mpe_id +mapIterationAbortedEventDetails,map_iteration_aborted_event_details +mapIterationFailedEventDetails,map_iteration_failed_event_details +mapIterationStartedEventDetails,map_iteration_started_event_details +mapIterationSucceededEventDetails,map_iteration_succeeded_event_details +mapRunArn,map_run_arn +mapRunFailedEventDetails,map_run_failed_event_details +mapRunStartedEventDetails,map_run_started_event_details +mapRuns,map_runs +mapStateStartedEventDetails,map_state_started_event_details +mapValue,map_value +mappedInputFields,mapped_input_fields +mappingType,mapping_type +marker,marker +markerName,marker_name +markerRecordedEventAttributes,marker_recorded_event_attributes +marketplaceCertified,marketplace_certified +marketplaceInformation,marketplace_information +master,master +masterAccount,master_account +masterAccountId,master_account_id +masterDatabaseName,master_database_name +masterEndpoint,master_endpoint +masterUserPassword,master_user_password +masterUsername,master_username +match,match +matchCount,match_count +matchEquals,match_equals +matchIDs,match_ids +matchId,match_id +matchKey,match_key +matchResult,match_result +matched,matched +matchedDevicesCount,matched_devices_count +matcher,matcher +matches,matches +matchingBucket,matching_bucket +matchingKeys,matching_keys +matchingResources,matching_resources +math,math +max,max +maxAccountLimitReached,max_account_limit_reached +maxAge,max_age +maxAttempts,max_attempts +maxBackupsToRetain,max_backups_to_retain +maxBatchSize,max_batch_size +maxBuckets,max_buckets +maxConcurrency,max_concurrency +maxConflictFiles,max_conflict_files +maxConnections,max_connections +maxCpus,max_cpus +maxDepth,max_depth +maxDevices,max_devices +maxDuration,max_duration +maxEjectionPercent,max_ejection_percent +maxFileCount,max_file_count +maxFilesToKeep,max_files_to_keep +maxGpus,max_gpus +maxHPONumberOfTrainingJobs,max_hpo_number_of_training_jobs +maxHPOParallelTrainingJobs,max_hpo_parallel_training_jobs +maxIdleTimeInSeconds,max_idle_time_in_seconds +maxIndexingCapacityInOCU,max_indexing_capacity_in_ocu +maxInstancesCount,max_instances_count +maxItems,max_items +maxJobDurationInSeconds,max_job_duration_in_seconds +maxJobTimeoutMinutes,max_job_timeout_minutes +maxLength,max_length +maxLengthMs,max_length_ms +maxLifetimeTimeoutMinutes,max_lifetime_timeout_minutes +maxLineCoveragePercentage,max_line_coverage_percentage +maxMergeHunks,max_merge_hunks +maxMessages,max_messages +maxNodeCount,max_node_count +maxNumberOfTrainingJobs,max_number_of_training_jobs +maxPageSize,max_page_size +maxParallelLaunches,max_parallel_launches +maxParallelTrainingJobs,max_parallel_training_jobs +maxParallelism,max_parallelism +maxPendingRequests,max_pending_requests +maxQueueSize,max_queue_size +maxRequests,max_requests +maxResult,max_result +maxResults,max_results +maxRetries,max_retries +maxRuns,max_runs +maxRuntimeInSeconds,max_runtime_in_seconds +maxSampleCount,max_sample_count +maxSearchCapacityInOCU,max_search_capacity_in_ocu +maxSeconds,max_seconds +maxServerErrors,max_server_errors +maxSessionLengthInMinutes,max_session_length_in_minutes +maxSize,max_size +maxSizeInMB,max_size_in_mb +maxSlots,max_slots +maxStoppedSessionLengthInMinutes,max_stopped_session_length_in_minutes +maxSwap,max_swap +maxUnavailable,max_unavailable +maxUnavailablePercentage,max_unavailable_percentage +maxValue,max_value +maxVersions,max_versions +maxWorkerCount,max_worker_count +maximum,maximum +maximumBuildsAllowed,maximum_builds_allowed +maximumCapacity,maximum_capacity +maximumCount,maximum_count +maximumElevation,maximum_elevation +maximumMatchDistance,maximum_match_distance +maximumMessageLength,maximum_message_length +maximumMessageRatePerSecond,maximum_message_rate_per_second +maximumPageSize,maximum_page_size +maximumPerMinute,maximum_per_minute +maximumPercent,maximum_percent +maximumScalingStepSize,maximum_scaling_step_size +maximumTTL,maximum_ttl +maxvCpus,maxv_cpus +mcuCount,mcu_count +md5,md5 +md5sum,md5_sum +meCollectorSummary,me_collector_summary +mean,mean +meanTimeToClose,mean_time_to_close +measurement,measurement +mediaType,media_type +medium,medium +member,member +memberAbilities,member_abilities +memberAccountId,member_account_id +memberAccounts,member_accounts +memberAccountsEnrolled,member_accounts_enrolled +memberFileExtensions,member_file_extensions +memberStatus,member_status +memberSummaries,member_summaries +members,members +membership,membership +membershipArn,membership_arn +membershipId,membership_id +membershipIdentifier,membership_identifier +membershipStatus,membership_status +membershipSummaries,membership_summaries +memberships,memberships +memory,memory +memoryGBHour,memory_gb_hour +memoryInfo,memory_info +memoryReservation,memory_reservation +memorySize,memory_size +memorySizeConfiguration,memory_size_configuration +memorySizeInKB,memory_size_in_kb +memorySizeRecommendationOptions,memory_size_recommendation_options +merge,merge +mergeBase,merge_base +mergeCommitId,merge_commit_id +mergeHunks,merge_hunks +mergeMetadata,merge_metadata +mergeOperations,merge_operations +mergeOption,merge_option +mergeOptions,merge_options +mergeStrategy,merge_strategy +mergeType,merge_type +mergeable,mergeable +mergedApiArn,merged_api_arn +mergedApiExecutionRoleArn,merged_api_execution_role_arn +mergedApiId,merged_api_id +mergedApiIdentifier,merged_api_identifier +mergedBy,merged_by +mergedCommitId,merged_commit_id +mesh,mesh +meshName,mesh_name +meshOwner,mesh_owner +meshes,meshes +message,message +messageContent,message_content +messageExpiry,message_expiry +messageFormat,message_format +messageGroups,message_groups +messageId,message_id +messageReviewHandler,message_review_handler +messageReviewHandlerUri,message_review_handler_uri +messageSelectionStrategy,message_selection_strategy +messageType,message_type +messageVersion,message_version +messages,messages +meta,meta +metaStoreManagerRoleArn,meta_store_manager_role_arn +metadata,metadata +metadataCatalogConfig,metadata_catalog_config +metadataCatalogDetails,metadata_catalog_details +metadataKey,metadata_key +metadataOptions,metadata_options +metered,metered +method,method +methodIntegration,method_integration +methodName,method_name +methodResponses,method_responses +methodSettings,method_settings +metric,metric +metricArn,metric_arn +metricAttribution,metric_attribution +metricAttributionArn,metric_attribution_arn +metricAttributions,metric_attributions +metricData,metric_data +metricDataPoints,metric_data_points +metricDatumList,metric_datum_list +metricDefinition,metric_definition +metricDimension,metric_dimension +metricFilterCount,metric_filter_count +metricFilters,metric_filters +metricGoals,metric_goals +metricMonitors,metric_monitors +metricName,metric_name +metricNames,metric_names +metricNamespace,metric_namespace +metricRegex,metric_regex +metricRuleRoleArn,metric_rule_role_arn +metricTarget,metric_target +metricTimestamp,metric_timestamp +metricTransformations,metric_transformations +metricType,metric_type +metricUnit,metric_unit +metricValue,metric_value +metrics,metrics +metricsConfiguration,metrics_configuration +metricsEnabled,metrics_enabled +metricsOutputConfig,metrics_output_config +metricsResults,metrics_results +metricsSource,metrics_source +metricsSummary,metrics_summary +mfaAuthenticated,mfa_authenticated +migrationEffort,migration_effort +migrationId,migration_id +migrationStatus,migration_status +migrationStatusEquals,migration_status_equals +migrationStrategy,migration_strategy +migrationSummaries,migration_summaries +migrationTimestamp,migration_timestamp +migrationWorkflowSummary,migration_workflow_summary +millisUntilNextRefreshable,millis_until_next_refreshable +mimeType,mime_type +min,min +minLineCoveragePercentage,min_line_coverage_percentage +minNodeCount,min_node_count +minNumberOfExecutedThings,min_number_of_executed_things +minPower,min_power +minProvisionedTPS,min_provisioned_tps +minRecommendationRequestsPerSecond,min_recommendation_requests_per_second +minSeconds,min_seconds +minSize,min_size +minValue,min_value +minWorkerCount,min_worker_count +minimum,minimum +minimumCompressionSize,minimum_compression_size +minimumCount,minimum_count +minimumHealthyHosts,minimum_healthy_hosts +minimumHealthyPercent,minimum_healthy_percent +minimumLinks,minimum_links +minimumSamplingIntervalMs,minimum_sampling_interval_ms +minimumScalingStepSize,minimum_scaling_step_size +minimumTTL,minimum_ttl +minimumTriggerIntervalMs,minimum_trigger_interval_ms +minimumViableContactDurationSeconds,minimum_viable_contact_duration_seconds +minorVersion,minor_version +minvCpus,minv_cpus +missedCount,missed_count +missing,missing +missingContextValues,missing_context_values +missionProfileArn,mission_profile_arn +missionProfileId,mission_profile_id +missionProfileList,mission_profile_list +mixed,mixed +mixin,mixin +mlDetectionConfig,ml_detection_config +mlModelTrainingJobId,ml_model_training_job_id +mlModelTransformJobId,ml_model_transform_job_id +mlModels,ml_models +modality,modality +mode,mode +model,model +modelArn,model_arn +modelArnEquals,model_arn_equals +modelCustomizationJobSummaries,model_customization_job_summaries +modelDetails,model_details +modelEndpoint,model_endpoint +modelEndpointStatus,model_endpoint_status +modelId,model_id +modelIdentifier,model_identifier +modelKmsKeyArn,model_kms_key_arn +modelManifestArn,model_manifest_arn +modelMetrics,model_metrics +modelName,model_name +modelPerformance,model_performance +modelScores,model_scores +modelSource,model_source +modelStatus,model_status +modelSummaries,model_summaries +modelTransformJob,model_transform_job +modelTransformOutputS3Location,model_transform_output_s3_location +modelType,model_type +modelUnits,model_units +modelVariables,model_variables +modelVersion,model_version +modelVersionDetails,model_version_details +modelVersionNumber,model_version_number +modelVersions,model_versions +models,models +modernizeInfrastructureWithCloudNativeTechnologies,modernize_infrastructure_with_cloud_native_technologies +modes,modes +modified,modified +modifiedAt,modified_at +modifiedCount,modified_count +modifiedTimestamp,modified_timestamp +modifyVnfInfoData,modify_vnf_info_data +module,module +monitoredResourceInfo,monitored_resource_info +monitoredResourceName,monitored_resource_name +monitoringConfiguration,monitoring_configuration +month,month +monthlySchedule,monthly_schedule +monthlyTransfer,monthly_transfer +moreApplicationResource,more_application_resource +moreInfo,more_info +moreServerAssociationExists,more_server_association_exists +mostRecentEvent,most_recent_event +mostRecentExecutionMessage,most_recent_execution_message +mostRecentExecutionStatus,most_recent_execution_status +mostRecentExecutionTime,most_recent_execution_time +mountOptions,mount_options +mountPath,mount_path +mountPoint,mount_point +mountPoints,mount_points +mountROSysfs,mount_ro_sysfs +mqttContext,mqtt_context +mqttTopic,mqtt_topic +mtu,mtu +multiLayerStorage,multi_layer_storage +multiNodeJobId,multi_node_job_id +multiTurnConversation,multi_turn_conversation +multiValueHeaders,multi_value_headers +multipleValuesSetting,multiple_values_setting +mustSucceedForCutover,must_succeed_for_cutover +mutationsFilePath,mutations_file_path +mutualTlsAuthentication,mutual_tls_authentication +name,name +nameContains,name_contains +namePattern,name_pattern +namePrefixFilter,name_prefix_filter +nameQuery,name_query +nameServersUpdateState,name_servers_update_state +namedShadowIndexingMode,named_shadow_indexing_mode +namedShadowNames,named_shadow_names +names,names +namespace,namespace +namespaceArn,namespace_arn +namespaceId,namespace_id +namespaceName,namespace_name +namespaceType,namespace_type +namespaceVersion,namespace_version +namespaces,namespaces +needsReplacements,needs_replacements +negative,negative +neighborConfigurationIds,neighbor_configuration_ids +neighbors,neighbors +neptuneIamRoleArn,neptune_iam_role_arn +neq,neq +nestedType,nested_type +netMask,net_mask +netmask,netmask +network,network +networkAccessControl,network_access_control +networkArn,network_arn +networkBindings,network_bindings +networkConfiguration,network_configuration +networkFileDefinitions,network_file_definitions +networkFindings,network_findings +networkInfoList,network_info_list +networkInstances,network_instances +networkInterface,network_interface +networkInterfaceId,network_interface_id +networkInterfaces,network_interfaces +networkInterfacesToAdd,network_interfaces_to_add +networkInterfacesToRemove,network_interfaces_to_remove +networkInterfacesToUpdate,network_interfaces_to_update +networkMode,network_mode +networkName,network_name +networkOperations,network_operations +networkOrigin,network_origin +networkPackages,network_packages +networkPath,network_path +networkProfile,network_profile +networkProfileArn,network_profile_arn +networkProfiles,network_profiles +networkProtocol,network_protocol +networkReachabilityDetails,network_reachability_details +networkResource,network_resource +networkResourceArn,network_resource_arn +networkResources,network_resources +networkSettings,network_settings +networkSettingsArn,network_settings_arn +networkSite,network_site +networkSiteArn,network_site_arn +networkSiteName,network_site_name +networkSites,network_sites +networking,networking +networks,networks +neutral,neutral +newApplicationName,new_application_name +newApprovalRuleTemplateName,new_approval_rule_template_name +newAutoRegistrationStatus,new_auto_registration_status +newBGPPeer,new_bgp_peer +newDeploymentGroupName,new_deployment_group_name +newDirectConnectGatewayName,new_direct_connect_gateway_name +newDiskName,new_disk_name +newExecutionRunId,new_execution_run_id +newFindings,new_findings +newImageDescription,new_image_description +newImageDisplayName,new_image_display_name +newImageName,new_image_name +newImageTags,new_image_tags +newName,new_name +newPrivateVirtualInterface,new_private_virtual_interface +newPrivateVirtualInterfaceAllocation,new_private_virtual_interface_allocation +newPublicVirtualInterface,new_public_virtual_interface +newPublicVirtualInterfaceAllocation,new_public_virtual_interface_allocation +newRevision,new_revision +newRuleContent,new_rule_content +newStatus,new_status +newTableName,new_table_name +newTransitVirtualInterface,new_transit_virtual_interface +newTransitVirtualInterfaceAllocation,new_transit_virtual_interface_allocation +newValue,new_value +next,next +nextAttemptDateTime,next_attempt_date_time +nextBackwardToken,next_backward_token +nextDeliveryTime,next_delivery_time +nextDeployment,next_deployment +nextForwardToken,next_forward_token +nextIndex,next_index +nextMarker,next_marker +nextPageCount,next_page_count +nextPageToken,next_page_token +nextPeriod,next_period +nextRefreshTime,next_refresh_time +nextReplicationRunStartTime,next_replication_run_start_time +nextSequenceToken,next_sequence_token +nextSnapshotTimeOfDay,next_snapshot_time_of_day +nextState,next_state +nextStep,next_step +nextToken,next_token +nfc,nfc +nluConfidence,nlu_confidence +nluIntentConfidence,nlu_intent_confidence +nluIntentConfidenceThreshold,nlu_intent_confidence_threshold +nniPartnerType,nni_partner_type +noDevice,no_device +noEcho,no_echo +noInlineDocumentSupport,no_inline_document_support +noOfSrvCompleted,no_of_srv_completed +noOfSrvFailed,no_of_srv_failed +nodeCount,node_count +nodeCounts,node_counts +nodeDetails,node_details +nodeGroup,node_group +nodeId,node_id +nodeIndex,node_index +nodeLabels,node_labels +nodeName,node_name +nodeOverrides,node_overrides +nodeProperties,node_properties +nodePropertyOverrides,node_property_overrides +nodeRangeProperties,node_range_properties +nodeRole,node_role +nodeStructures,node_structures +nodeSummaries,node_summaries +nodeType,node_type +nodegroup,nodegroup +nodegroupArn,nodegroup_arn +nodegroupName,nodegroup_name +nodegroups,nodegroups +nodes,nodes +nodesToAdd,nodes_to_add +nodesToRemove,nodes_to_remove +nodesToUpdate,nodes_to_update +nonCompliantChecks,non_compliant_checks +nonCompliantResource,non_compliant_resource +nonCompliantResourcesCount,non_compliant_resources_count +nonModels,non_models +nonce,nonce +noncompliantEvidenceCount,noncompliant_evidence_count +noradSatelliteID,norad_satellite_id +notAfter,not_after +notBefore,not_before +notClassified,not_classified +notFoundIdentifierIds,not_found_identifier_ids +notSensitive,not_sensitive +notShared,not_shared +notValidAfter,not_valid_after +notValidBefore,not_valid_before +note,note +notification,notification +notificationActions,notification_actions +notificationConfiguration,notification_configuration +notificationContext,notification_context +notificationDestinations,notification_destinations +notificationEnabled,notification_enabled +notificationEndpoint,notification_endpoint +notificationLambdaArn,notification_lambda_arn +notificationSenderEmail,notification_sender_email +notificationSettingKeys,notification_setting_keys +notificationSettings,notification_settings +notificationTargets,notification_targets +notificationTriggers,notification_triggers +notifications,notifications +notifyOnAddCorrespondenceToCase,notify_on_add_correspondence_to_case +notifyOnCaseSeverity,notify_on_case_severity +notifyOnCreateOrReopenCase,notify_on_create_or_reopen_case +notifyOnResolveCase,notify_on_resolve_case +nsDescription,ns_description +nsInstanceDescription,ns_instance_description +nsInstanceId,ns_instance_id +nsInstanceName,ns_instance_name +nsLcmOpOccId,ns_lcm_op_occ_id +nsName,ns_name +nsState,ns_state +nsd,nsd +nsdContent,nsd_content +nsdDesigner,nsd_designer +nsdId,nsd_id +nsdInfoId,nsd_info_id +nsdInvariantId,nsd_invariant_id +nsdName,nsd_name +nsdOnboardingState,nsd_onboarding_state +nsdOperationalState,nsd_operational_state +nsdUsageState,nsd_usage_state +nsdVersion,nsd_version +nullable,nullable +numBytes,num_bytes +numChangesets,num_changesets +numClasses,num_classes +numDistinctPredicates,num_distinct_predicates +numDistinctSubjects,num_distinct_subjects +numEdgeLabels,num_edge_labels +numEdgeProperties,num_edge_properties +numEdges,num_edges +numFiles,num_files +numNodeLabels,num_node_labels +numNodeProperties,num_node_properties +numNodes,num_nodes +numOfReports,num_of_reports +numParallelProcesses,num_parallel_processes +numQuads,num_quads +numResults,num_results +numTurns,num_turns +numValues,num_values +numVersions,num_versions +number,number +numberOfApplicationComponents,number_of_application_components +numberOfAssociatedServices,number_of_associated_services +numberOfAssociatedVPCs,number_of_associated_vpcs +numberOfCanceledThings,number_of_canceled_things +numberOfConflicts,number_of_conflicts +numberOfConnections,number_of_connections +numberOfCores,number_of_cores +numberOfDays,number_of_days +numberOfEvents,number_of_events +numberOfFailedThings,number_of_failed_things +numberOfInProgressThings,number_of_in_progress_things +numberOfInvocations,number_of_invocations +numberOfMemberAccountsOptedIn,number_of_member_accounts_opted_in +numberOfNotifiedThings,number_of_notified_things +numberOfQueuedThings,number_of_queued_things +numberOfRecentAmisToKeep,number_of_recent_amis_to_keep +numberOfRecordsFailed,number_of_records_failed +numberOfRecordsSuccess,number_of_records_success +numberOfRecordsUpdated,number_of_records_updated +numberOfRejectedThings,number_of_rejected_things +numberOfRemovedThings,number_of_removed_things +numberOfRetries,number_of_retries +numberOfRevisions,number_of_revisions +numberOfRuns,number_of_runs +numberOfSucceededThings,number_of_succeeded_things +numberOfTimedOutThings,number_of_timed_out_things +numberOfTransactions,number_of_transactions +numberOfTurns,number_of_turns +numbers,numbers +numericSeverity,numeric_severity +oAuth2Credentials,o_auth2_credentials +oAuth2Defaults,o_auth2_defaults +oAuth2GrantType,o_auth2_grant_type +oAuth2Properties,o_auth2_properties +oAuthCredentials,o_auth_credentials +oAuthProperties,o_auth_properties +oAuthRequest,o_auth_request +oAuthScopes,o_auth_scopes +oauth2,oauth2 +oauth2CustomProperties,oauth2_custom_properties +oauth2GrantTypesSupported,oauth2_grant_types_supported +oauthScopes,oauth_scopes +oauthToken,oauth_token +obdInterface,obd_interface +obdSignal,obd_signal +obdStandard,obd_standard +obfuscate,obfuscate +obfuscationSetting,obfuscation_setting +obfuscationSettingType,obfuscation_setting_type +object,object +objectCount,object_count +objectCountByEncryptionType,object_count_by_encryption_type +objectFields,object_fields +objectId,object_id +objectIds,object_ids +objectKey,object_key +objectName,object_name +objectPath,object_path +objectPrefixes,object_prefixes +objectType,object_type +objectTypeConflict,object_type_conflict +objectTypeName,object_type_name +objectTypes,object_types +objectVersion,object_version +objectVersioning,object_versioning +objectiveSensitivity,objective_sensitivity +objects,objects +occurrences,occurrences +occurrencesThreshold,occurrences_threshold +oemData,oem_data +offering,offering +offeringClass,offering_class +offeringId,offering_id +offeringIds,offering_ids +offeringPromotionId,offering_promotion_id +offeringPromotions,offering_promotions +offeringStatus,offering_status +offeringTransaction,offering_transaction +offeringTransactions,offering_transactions +offerings,offerings +offset,offset +offsetInNanos,offset_in_nanos +offsetRange,offset_range +offsetRanges,offset_ranges +offsetSeconds,offset_seconds +ofi,ofi +oidc,oidc +oldApprovalRuleTemplateName,old_approval_rule_template_name +oldName,old_name +oldestDate,oldest_date +onEnter,on_enter +onExit,on_exit +onExitCode,on_exit_code +onFailure,on_failure +onInput,on_input +onPremisesInstanceTagFilters,on_premises_instance_tag_filters +onPremisesTagSet,on_premises_tag_set +onPremisesTagSetList,on_premises_tag_set_list +onReason,on_reason +onStatusReason,on_status_reason +onboardingState,onboarding_state +oneTime,one_time +onlineAbConfig,online_ab_config +onlineAbDefinition,online_ab_definition +onlyActiveViolationsIncluded,only_active_violations_included +onlyAssociated,only_associated +op,op +opNum,op_num +openActivityTasks,open_activity_tasks +openChildWorkflowExecutions,open_child_workflow_executions +openCounts,open_counts +openCypherQuery,open_cypher_query +openDecisionTasks,open_decision_tasks +openFindings,open_findings +openIDConnectConfig,open_id_connect_config +openIdIssuer,open_id_issuer +openLambdaFunctions,open_lambda_functions +openPortRange,open_port_range +openSearch,open_search +openSearchServiceConfig,open_search_service_config +openTimers,open_timers +opencypher,opencypher +operand,operand +operandType,operand_type +operatingSystem,operating_system +operatingSystemFamily,operating_system_family +operatingSystems,operating_systems +operation,operation +operationDetails,operation_details +operationId,operation_id +operationIdentifier,operation_identifier +operationName,operation_name +operationState,operation_state +operationSucceeded,operation_succeeded +operationType,operation_type +operationalState,operational_state +operations,operations +operator,operator +optimizationObjective,optimization_objective +optimizationType,optimization_type +optimizedStagingDiskType,optimized_staging_disk_type +option,option +optional,optional +options,options +or,or +order,order +orderArn,order_arn +orderBy,order_by +orderByTime,order_by_time +orderedResources,ordered_resources +orders,orders +org,org +orgPackagePaths,org_package_paths +organizationArns,organization_arns +organizationEntityAccountFilters,organization_entity_account_filters +organizationEntityAggregates,organization_entity_aggregates +organizationEntityFilters,organization_entity_filters +organizationEventDetailFilters,organization_event_detail_filters +organizationId,organization_id +organizationRoleName,organization_role_name +organizationalUnitArns,organizational_unit_arns +organizationalUnitDistinguishedName,organizational_unit_distinguished_name +organizationalUnits,organizational_units +orientation,orientation +origin,origin +originAccountID,origin_account_id +originApprovalRuleTemplate,origin_approval_rule_template +originAvailabilityZone,origin_availability_zone +originConfiguration,origin_configuration +originEnvironment,origin_environment +originPublicDNS,origin_public_dns +originRegion,origin_region +originType,origin_type +originalDiskPath,original_disk_path +originalMessage,original_message +originalStatusCode,original_status_code +originalValue,original_value +originatingRequestId,originating_request_id +orphanedResources,orphaned_resources +os,os +osByol,os_byol +osDriver,os_driver +osInfo,os_info +osType,os_type +osVersion,os_version +otaUpdateArn,ota_update_arn +otaUpdateFiles,ota_update_files +otaUpdateId,ota_update_id +otaUpdateInfo,ota_update_info +otaUpdateStatus,ota_update_status +otaUpdates,ota_updates +outboundCallConfig,outbound_call_config +outcomes,outcomes +outdatedInstancesStrategy,outdated_instances_strategy +outerPadding,outer_padding +outgoingCertificates,outgoing_certificates +outlierDetection,outlier_detection +outpostArns,outpost_arns +outpostConfig,outpost_config +output,output +outputArtifactDetails,output_artifact_details +outputArtifacts,output_artifacts +outputConfiguration,output_configuration +outputConstraints,output_constraints +outputContexts,output_contexts +outputDataConfig,output_data_config +outputDetails,output_details +outputFileUriValue,output_file_uri_value +outputFormat,output_format +outputLocation,output_location +outputModalities,output_modalities +outputModelArn,output_model_arn +outputModelKmsKeyArn,output_model_kms_key_arn +outputModelName,output_model_name +outputNode,output_node +outputPath,output_path +outputResources,output_resources +outputS3Bucket,output_s3_bucket +outputS3BucketName,output_s3_bucket_name +outputS3Directory,output_s3_directory +outputS3KeyPrefix,output_s3_key_prefix +outputS3Path,output_s3_path +outputS3Uri,output_s3_uri +outputSourceConfig,output_source_config +outputToken,output_token +outputType,output_type +outputUri,output_uri +outputVariableName,output_variable_name +outputVariables,output_variables +outputs,outputs +overallStatus,overall_status +overallTestResults,overall_test_results +overridden,overridden +overrideAlarmConfiguration,override_alarm_configuration +overrideAllowedPrefixesToDirectConnectGateway,override_allowed_prefixes_to_direct_connect_gateway +overrideArtifactName,override_artifact_name +overrideDynamicGroups,override_dynamic_groups +overrideFormat,override_format +overrideLinkOutUri,override_link_out_uri +overrideStatus,override_status +overrider,overrider +overrides,overrides +ownedBy,owned_by +owner,owner +ownerAccount,owner_account +ownerArn,owner_arn +ownerContact,owner_contact +ownerFilter,owner_filter +ownerId,owner_id +ownerIdentifier,owner_identifier +ownerInfo,owner_info +owners,owners +ownershipVerificationCertificateArn,ownership_verification_certificate_arn +owningAccountId,owning_account_id +package,package +packageArn,package_arn +packageCleanup,package_cleanup +packageContent,package_content +packageFormat,package_format +packageManager,package_manager +packageName,package_name +packageNames,package_names +packagePaths,package_paths +packagePrefix,package_prefix +packageSummaries,package_summaries +packageType,package_type +packageVersion,package_version +packageVersionArn,package_version_arn +packageVersionRevision,package_version_revision +packageVersionSummaries,package_version_summaries +packageVulnerabilityDetails,package_vulnerability_details +packages,packages +packaging,packaging +packetsDropped,packets_dropped +page,page +pageNumber,page_number +pageSize,page_size +pageToken,page_token +pagerDutyIncidentConfiguration,pager_duty_incident_configuration +pages,pages +paginated,paginated +paginationConfig,pagination_config +parallelRun,parallel_run +parallelism,parallelism +parallelismConfig,parallelism_config +parameter,parameter +parameterApplyStatus,parameter_apply_status +parameterConfiguration,parameter_configuration +parameterKey,parameter_key +parameterName,parameter_name +parameterObjects,parameter_objects +parameterSets,parameter_sets +parameterTemplate,parameter_template +parameterType,parameter_type +parameterValue,parameter_value +parameterValues,parameter_values +parameters,parameters +params,params +parent,parent +parentAssetId,parent_asset_id +parentBotNetworks,parent_bot_networks +parentCommitId,parent_commit_id +parentConnectionId,parent_connection_id +parentEntityId,parent_entity_id +parentEntityUpdate,parent_entity_update +parentGroup,parent_group +parentGroupName,parent_group_name +parentGroupNames,parent_group_names +parentId,parent_id +parentIdentifier,parent_identifier +parentImage,parent_image +parentInitiatedEventId,parent_initiated_event_id +parentIntentSignature,parent_intent_signature +parentResourceName,parent_resource_name +parentSlotTypeSignature,parent_slot_type_signature +parentTargetArn,parent_target_arn +parentWorkflowExecution,parent_workflow_execution +parents,parents +parquetConfiguration,parquet_configuration +parserConfiguration,parser_configuration +parsingResultUrl,parsing_result_url +partFirstByte,part_first_byte +partLastByte,part_last_byte +partNumber,part_number +partSize,part_size +partSource,part_source +partial,partial +participant,participant +participantId,participant_id +participantToken,participant_token +participantTokenConfigurations,participant_token_configurations +participantTokens,participant_tokens +participants,participants +participatingResourceID,participating_resource_id +participatingResources,participating_resources +participatingServers,participating_servers +partition,partition +partitionColumns,partition_columns +partitionKey,partition_key +partitionKeys,partition_keys +partitionRegistrationOutput,partition_registration_output +partitions,partitions +partner,partner +partnerName,partner_name +parts,parts +passed,passed +passthroughBehavior,passthrough_behavior +password,password +passwordData,password_data +passwordVersion,password_version +pasteAllowed,paste_allowed +patchOperations,patch_operations +path,path +pathFormat,path_format +pathMatch,path_match +pathPart,path_part +pathPrefixHierarchy,path_prefix_hierarchy +pathWithQueryString,path_with_query_string +pattern,pattern +payload,payload +payloadField,payload_field +payloadFormat,payload_format +payloadFormatIndicator,payload_format_indicator +payloadSize,payload_size +payloadUrl,payload_url +payloadVersion,payload_version +payloads,payloads +paymentOption,payment_option +paymentOptions,payment_options +pemEncodedCertificate,pem_encoded_certificate +pending,pending +pendingCount,pending_count +pendingMaintenance,pending_maintenance +pendingMaintenanceActions,pending_maintenance_actions +pendingModifiedValues,pending_modified_values +pendingPlan,pending_plan +pendingPricingPlan,pending_pricing_plan +pendingRequestCount,pending_request_count +pendingRequests,pending_requests +pendingTasksCount,pending_tasks_count +perRequest,per_request +perRetryTimeout,per_retry_timeout +percent,percent +percentComplete,percent_complete +percentDone,percent_done +percentPromotedItems,percent_promoted_items +percentTraffic,percent_traffic +percentageAdjust,percentage_adjust +percentageComplete,percentage_complete +percentageProgress,percentage_progress +percentiles,percentiles +percents,percents +performAutoML,perform_auto_ml +performHPO,perform_hpo +performanceRisk,performance_risk +period,period +periodInSeconds,period_in_seconds +periodMs,period_ms +permission,permission +permissionArn,permission_arn +permissionArns,permission_arns +permissionConfiguration,permission_configuration +permissionGroup,permission_group +permissionGroupId,permission_group_id +permissionGroupParams,permission_group_params +permissionGroups,permission_groups +permissionModel,permission_model +permissionStatus,permission_status +permissionType,permission_type +permissionVersion,permission_version +permissions,permissions +persistentAppUI,persistent_app_ui +persistentStorage,persistent_storage +persona,persona +personalizedRanking,personalized_ranking +phaseStatus,phase_status +phaseType,phase_type +phases,phases +phoneNumber,phone_number +phoneNumbers,phone_numbers +phrase,phrase +physicalConnectorType,physical_connector_type +physicalNetworkInterfaceId,physical_network_interface_id +physicalNetworkInterfaces,physical_network_interfaces +physicalResource,physical_resource +physicalResourceId,physical_resource_id +physicalResources,physical_resources +pid,pid +pidMode,pid_mode +pidRequestIntervalSeconds,pid_request_interval_seconds +pidResponseLength,pid_response_length +pinned,pinned +pipeline,pipeline +pipelineActivities,pipeline_activities +pipelineActivity,pipeline_activity +pipelineArn,pipeline_arn +pipelineCodebuildRoleArn,pipeline_codebuild_role_arn +pipelineConfig,pipeline_config +pipelineConfigurationTimeStamp,pipeline_configuration_time_stamp +pipelineContext,pipeline_context +pipelineDescriptionList,pipeline_description_list +pipelineExecution,pipeline_execution +pipelineExecutionId,pipeline_execution_id +pipelineExecutionStartCondition,pipeline_execution_start_condition +pipelineExecutionSummaries,pipeline_execution_summaries +pipelineId,pipeline_id +pipelineIdList,pipeline_id_list +pipelineIds,pipeline_ids +pipelineInfoList,pipeline_info_list +pipelineName,pipeline_name +pipelineObjects,pipeline_objects +pipelineProvisioning,pipeline_provisioning +pipelineProvisioningRepository,pipeline_provisioning_repository +pipelineServiceRoleArn,pipeline_service_role_arn +pipelineSummaries,pipeline_summaries +pipelineType,pipeline_type +pipelineVersion,pipeline_version +pipelines,pipelines +pitPolicy,pit_policy +placeholder,placeholder +placement,placement +placementConstraints,placement_constraints +placementGroup,placement_group +placementName,placement_name +placementStrategy,placement_strategy +placementTemplate,placement_template +placements,placements +plainTextMessage,plain_text_message +planDescription,plan_description +planType,plan_type +planTypes,plan_types +platform,platform +platformCapabilities,platform_capabilities +platformDevices,platform_devices +platformDifferences,platform_differences +platformDisplayName,platform_display_name +platformFamily,platform_family +platformId,platform_id +platformOverride,platform_override +platformVersion,platform_version +platformVersions,platform_versions +platforms,platforms +playbackUrl,playback_url +pluginId,plugin_id +plugins,plugins +podExecutionRoleArn,pod_execution_role_arn +podName,pod_name +podProperties,pod_properties +pointInTimeRecovery,point_in_time_recovery +pointInTimeRecoveryOverride,point_in_time_recovery_override +pointInTimeSnapshotDateTime,point_in_time_snapshot_date_time +polarization,polarization +policies,policies +policy,policy +policyArn,policy_arn +policyDescription,policy_description +policyDetails,policy_details +policyDocument,policy_document +policyDocuments,policy_documents +policyGenerationDetails,policy_generation_details +policyGenerations,policy_generations +policyId,policy_id +policyName,policy_name +policyNamesToAdd,policy_names_to_add +policyNamesToSkip,policy_names_to_skip +policyRevision,policy_revision +policySizeBytes,policy_size_bytes +policyStatementsTemplate,policy_statements_template +policyStoreId,policy_store_id +policyStores,policy_stores +policyTemplate,policy_template +policyTemplateId,policy_template_id +policyTemplates,policy_templates +policyText,policy_text +policyType,policy_type +policyVersion,policy_version +policyVersionId,policy_version_id +policyVersionIdentifier,policy_version_identifier +policyVersions,policy_versions +pollingAccounts,polling_accounts +pollingDisabledAt,polling_disabled_at +pollingServicePrincipals,polling_service_principals +port,port +portEncryptionStatus,port_encryption_status +portForwardingConfig,port_forwarding_config +portInfo,port_info +portInfoSource,port_info_source +portInformationNeeded,port_information_needed +portInfos,port_infos +portMapping,port_mapping +portMappings,port_mappings +portName,port_name +portNumber,port_number +portRange,port_range +portStates,port_states +portal,portal +portalArn,portal_arn +portalAuthMode,portal_auth_mode +portalClientId,portal_client_id +portalContactEmail,portal_contact_email +portalCreationDate,portal_creation_date +portalDescription,portal_description +portalEndpoint,portal_endpoint +portalId,portal_id +portalLastUpdateDate,portal_last_update_date +portalLogoImage,portal_logo_image +portalLogoImageFile,portal_logo_image_file +portalLogoImageLocation,portal_logo_image_location +portalName,portal_name +portalStartUrl,portal_start_url +portalStatus,portal_status +portalSummaries,portal_summaries +portals,portals +ports,ports +position,position +positive,positive +posixUser,posix_user +postCodeHookSpecification,post_code_hook_specification +postDirectional,post_directional +postFulfillmentStatusSpecification,post_fulfillment_status_specification +postLaunchActions,post_launch_actions +postLaunchActionsLaunchStatusList,post_launch_actions_launch_status_list +postLaunchActionsStatus,post_launch_actions_status +postLaunchEnabled,post_launch_enabled +postLaunchFile,post_launch_file +postPassEndTime,post_pass_end_time +postTriggerCollectionDuration,post_trigger_collection_duration +postalCode,postal_code +postalCodePlus4,postal_code_plus4 +postedDate,posted_date +power,power +powerId,power_id +powers,powers +preDirectional,pre_directional +preLaunchFile,pre_launch_file +prePassStartTime,pre_pass_start_time +preProvisioningHook,pre_provisioning_hook +preSignedUrl,pre_signed_url +precision,precision +predicate,predicate +predicateCount,predicate_count +predicates,predicates +predictedLabel,predicted_label +predictedScores,predicted_scores +predictedValue,predicted_value +predictionExplanations,prediction_explanations +predictionTimeRange,prediction_time_range +predictionTimestamp,prediction_timestamp +preferences,preferences +preferredBackupWindow,preferred_backup_window +preferredMaintenanceWindow,preferred_maintenance_window +preferredRegion,preferred_region +prefix,prefix +prefixConfig,prefix_config +prefixFormat,prefix_format +prefixListIds,prefix_list_ids +prefixType,prefix_type +prerequisite,prerequisite +preserve,preserve +preserveNulls,preserve_nulls +preserveSourceDataTyping,preserve_source_data_typing +preset,preset +presignedUrlConfig,presigned_url_config +previewAgentsArn,preview_agents_arn +previewResults,preview_results +previewStatus,preview_status +previewToken,preview_token +previous,previous +previousDataProcessingJobId,previous_data_processing_job_id +previousEventId,previous_event_id +previousModelTrainingJobId,previous_model_training_job_id +previousOwnedBy,previous_owned_by +previousRevision,previous_revision +previousStartedEventId,previous_started_event_id +price,price +pricingMode,pricing_mode +pricingTier,pricing_tier +pricingUnit,pricing_unit +primaryArtifact,primary_artifact +primaryDevice,primary_device +primaryEmail,primary_email +primaryKey,primary_key +primaryKeyColumns,primary_key_columns +primaryKeys,primary_keys +primaryRegistryAlias,primary_registry_alias +primaryTaskSet,primary_task_set +principal,principal +principalArn,principal_arn +principalEntityType,principal_entity_type +principalId,principal_id +principalSubscriber,principal_subscriber +principals,principals +printAllowed,print_allowed +priorBuildSummaryList,prior_build_summary_list +prioritizeBusinessGoals,prioritize_business_goals +priority,priority +privateConnectionProvisioningState,private_connection_provisioning_state +privateDnsName,private_dns_name +privateDomainName,private_domain_name +privateIpAddress,private_ip_address +privateIpAddresses,private_ip_addresses +privateIpv4Address,private_ipv4_address +privateKey,private_key +privateKeyBase64,private_key_base64 +privateLinkServiceName,private_link_service_name +privateRegistryAccess,private_registry_access +privateRepository,private_repository +privileged,privileged +privilegedMode,privileged_mode +privilegedModeOverride,privileged_mode_override +problems,problems +processBehavior,process_behavior +processedDataS3Location,processed_data_s3_location +processedRecordsCount,processed_records_count +processingConfig,processing_config +processingConfiguration,processing_configuration +processingInstanceType,processing_instance_type +processingInstanceVolumeSizeInGB,processing_instance_volume_size_in_gb +processingJob,processing_job +processingTargets,processing_targets +processingTimeOutInSeconds,processing_time_out_in_seconds +prodTrafficRoute,prod_traffic_route +productCode,product_code +productId,product_id +productType,product_type +productTypes,product_types +productUrl,product_url +productionBranch,production_branch +products,products +profile,profile +profileArn,profile_arn +profileEndTime,profile_end_time +profileId,profile_id +profileName,profile_name +profileOwner,profile_owner +profileProperties,profile_properties +profileStartTime,profile_start_time +profileTimes,profile_times +profileToken,profile_token +profileUpdatedAt,profile_updated_at +profileVersion,profile_version +profileVersionArn,profile_version_arn +profiles,profiles +profilingEnabled,profiling_enabled +profilingGroup,profiling_group +profilingGroupName,profiling_group_name +profilingGroupNames,profiling_group_names +profilingGroups,profiling_groups +profilingStatus,profiling_status +progress,progress +progressDetail,progress_detail +progressInMegaBytes,progress_in_mega_bytes +progressPercentage,progress_percentage +progressStatus,progress_status +project,project +projectArn,project_arn +projectCreationDate,project_creation_date +projectDescription,project_description +projectId,project_id +projectInformation,project_information +projectLastUpdateDate,project_last_update_date +projectName,project_name +projectRole,project_role +projectSummaries,project_summaries +projectTemplateId,project_template_id +projectVisibility,project_visibility +projectedMetrics,projected_metrics +projectedUtilizationMetrics,projected_utilization_metrics +projects,projects +projectsNotFound,projects_not_found +prometheusEndpoint,prometheus_endpoint +promotionName,promotion_name +promotions,promotions +prompt,prompt +promptAttemptsSpecification,prompt_attempts_specification +promptSpecification,prompt_specification +propagateTags,propagate_tags +properties,properties +propertiesFileContent,properties_file_content +property,property +propertyAlias,property_alias +propertyDefinitions,property_definitions +propertyFilters,property_filters +propertyGroupName,property_group_name +propertyGroupUpdates,property_group_updates +propertyGroups,property_groups +propertyId,property_id +propertyName,property_name +propertyNames,property_names +propertyNotificationState,property_notification_state +propertyReference,property_reference +propertyUnit,property_unit +propertyUpdates,property_updates +propertyValue,property_value +propertyValues,property_values +proposalId,proposal_id +proposalState,proposal_state +protectedQueries,protected_queries +protectedQuery,protected_query +protectedQueryIdentifier,protected_query_identifier +protectedTasks,protected_tasks +protectionEnabled,protection_enabled +protocol,protocol +protocolDefinition,protocol_definition +protocolName,protocol_name +protocolPolicy,protocol_policy +protocolVersion,protocol_version +protocols,protocols +protonServiceRoleArn,proton_service_role_arn +provider,provider +providerARNs,provider_arns +providerArn,provider_arn +providerIdentity,provider_identity +providerName,provider_name +providers,providers +provisionedCapacity,provisioned_capacity +provisionedModelArn,provisioned_model_arn +provisionedModelId,provisioned_model_id +provisionedModelName,provisioned_model_name +provisionedModelSummaries,provisioned_model_summaries +provisionedResources,provisioned_resources +provisioning,provisioning +provisioningEngine,provisioning_engine +provisioningRepository,provisioning_repository +provisioningRoleArn,provisioning_role_arn +proxyConfiguration,proxy_configuration +proxyEndpoint,proxy_endpoint +pseudoTerminal,pseudo_terminal +publicAccess,public_access +publicAccessBlock,public_access_block +publicAccessCidrs,public_access_cidrs +publicDnsName,public_dns_name +publicDomainNames,public_domain_names +publicEndpoint,public_endpoint +publicIp,public_ip +publicIpAddress,public_ip_address +publicIpAddresses,public_ip_addresses +publicKey,public_key +publicKeyBase64,public_key_base64 +publicKeyMaterial,public_key_material +publicPorts,public_ports +publicProjectAlias,public_project_alias +publiclyAccessible,publicly_accessible +publiclyAccessibleCount,publicly_accessible_count +publiclyReadable,publicly_readable +publiclyWritable,publicly_writable +publish,publish +publishAttributionMetricsToS3,publish_attribution_metrics_to_s3 +publishClassificationFindings,publish_classification_findings +publishFindingToSnsParams,publish_finding_to_sns_params +publishPolicyFindings,publish_policy_findings +published,published +publishedTime,published_time +publisher,publisher +publishers,publishers +pullRequest,pull_request +pullRequestCreatedEventMetadata,pull_request_created_event_metadata +pullRequestEnvironmentName,pull_request_environment_name +pullRequestEventType,pull_request_event_type +pullRequestEvents,pull_request_events +pullRequestId,pull_request_id +pullRequestIds,pull_request_ids +pullRequestMergedStateChangedEventMetadata,pull_request_merged_state_changed_event_metadata +pullRequestSourceReferenceUpdatedEventMetadata,pull_request_source_reference_updated_event_metadata +pullRequestStatus,pull_request_status +pullRequestStatusChangedEventMetadata,pull_request_status_changed_event_metadata +pullRequestTargets,pull_request_targets +pullStartedAt,pull_started_at +pullStoppedAt,pull_stopped_at +pullThroughCacheRules,pull_through_cache_rules +purchaseTime,purchase_time +purchasingOption,purchasing_option +pushedAt,pushed_at +putAssetPropertyValueEntries,put_asset_property_value_entries +putFailuresCount,put_failures_count +putFiles,put_files +putItem,put_item +qos,qos +qualificationReportDownloadUrl,qualification_report_download_url +qualities,qualities +quality,quality +quantity,quantity +quantumTaskArn,quantum_task_arn +quantumTasks,quantum_tasks +queries,queries +queriesFilePath,queries_file_path +query,query +queryAction,query_action +queryCompileError,query_compile_error +queryDefinitionId,query_definition_id +queryDefinitionNamePrefix,query_definition_name_prefix +queryDefinitions,query_definitions +queryEvalStats,query_eval_stats +queryFilterString,query_filter_string +queryFilterStringEnabled,query_filter_string_enabled +queryId,query_id +queryLogStatus,query_log_status +queryOptions,query_options +queryParam,query_param +queryParameters,query_parameters +queryParser,query_parser +queryStatement,query_statement +queryString,query_string +queryStringsAllowList,query_strings_allow_list +queryText,query_text +queryVersion,query_version +queryable,queryable +queue,queue +queueInfo,queue_info +queuePolicy,queue_policy +queuePriority,queue_priority +queueRequest,queue_request +queueSize,queue_size +queueUrl,queue_url +queueUrls,queue_urls +queuedAt,queued_at +queuedJobs,queued_jobs +queuedTimeoutInMinutes,queued_timeout_in_minutes +queuedTimeoutInMinutesOverride,queued_timeout_in_minutes_override +quota,quota +quotaCode,quota_code +quotaName,quota_name +quotaValue,quota_value +quote,quote +quoteAll,quote_all +r53HostedZoneDeletionState,r53_hosted_zone_deletion_state +radio,radio +radios,radios +ramBytes,ram_bytes +ramPerformanceMetricBasis,ram_performance_metric_basis +ramResourceShareRegion,ram_resource_share_region +ramSizeInGb,ram_size_in_gb +randomizationSalt,randomization_salt +range,range +rangeKeyField,range_key_field +rangeKeyType,range_key_type +rangeKeyValue,range_key_value +rank,rank +rate,rate +rateIncreaseCriteria,rate_increase_criteria +rateLimit,rate_limit +rawData,raw_data +rawError,raw_error +rawValue,raw_value +rdsHttpEndpointConfig,rds_http_endpoint_config +reaction,reaction +reactionCounts,reaction_counts +reactionUserArn,reaction_user_arn +reactionUsers,reaction_users +reactionValue,reaction_value +reactionsForComment,reactions_for_comment +reactionsFromDeletedUsersCount,reactions_from_deleted_users_count +readCapacityUnits,read_capacity_units +readOnly,read_only +readOnlyRootFilesystem,read_only_root_filesystem +readOptions,read_options +readSetId,read_set_id +readSets,read_sets +readme,readme +readonlyAccessAccounts,readonly_access_accounts +readonlyRootFilesystem,readonly_root_filesystem +reason,reason +reasonCode,reason_code +reasonCodeSummaries,reason_code_summaries +reasonForNonCompliance,reason_for_non_compliance +reasonForNonComplianceCode,reason_for_non_compliance_code +reasons,reasons +rebootAfterUse,reboot_after_use +receiverAccountId,receiver_account_id +receiverArn,receiver_arn +recentCommunications,recent_communications +recentIntentSummaryView,recent_intent_summary_view +recipe,recipe +recipeArn,recipe_arn +recipeList,recipe_list +recipeOutputFormat,recipe_output_format +recipeProvider,recipe_provider +recipeType,recipe_type +recipes,recipes +recipients,recipients +recognizedBotMember,recognized_bot_member +recommendation,recommendation +recommendationCompliance,recommendation_compliance +recommendationExportJobs,recommendation_export_jobs +recommendationId,recommendation_id +recommendationIds,recommendation_ids +recommendationOptions,recommendation_options +recommendationPreferenceNames,recommendation_preference_names +recommendationPreferences,recommendation_preferences +recommendationPreferencesDetails,recommendation_preferences_details +recommendationReportDetails,recommendation_report_details +recommendationResourceType,recommendation_resource_type +recommendationSet,recommendation_set +recommendationSourceArn,recommendation_source_arn +recommendationSourceType,recommendation_source_type +recommendationSources,recommendation_sources +recommendationStatus,recommendation_status +recommendationSummaries,recommendation_summaries +recommendationTemplate,recommendation_template +recommendationTemplateArn,recommendation_template_arn +recommendationTemplates,recommendation_templates +recommendationTypes,recommendation_types +recommendations,recommendations +recommended,recommended +recommendedActions,recommended_actions +recommendedCpuUnits,recommended_cpu_units +recommendedInstanceType,recommended_instance_type +recommendedMemorySize,recommended_memory_size +recommendedMinorVersion,recommended_minor_version +recommendedOptionProjectedMetrics,recommended_option_projected_metrics +recommendedVersion,recommended_version +recommender,recommender +recommenderArn,recommender_arn +recommenderConfig,recommender_config +recommenders,recommenders +record,record +recordAllRosTopics,record_all_ros_topics +recordFormat,record_format +recordIndex,record_index +recordLength,record_length +recordMarkerDecisionAttributes,record_marker_decision_attributes +recordMarkerFailedEventAttributes,record_marker_failed_event_attributes +recordNumber,record_number +recording,recording +recordingConfiguration,recording_configuration +recordingConfigurationArn,recording_configuration_arn +recordingConfigurations,recording_configurations +recordingGroup,recording_group +recordingMode,recording_mode +recordingReconnectWindowSeconds,recording_reconnect_window_seconds +recordingStrategy,recording_strategy +records,records +recordsMatched,records_matched +recordsNotProcessed,records_not_processed +recordsProcessed,records_processed +recordsScanned,records_scanned +recoveryInstanceID,recovery_instance_id +recoveryInstanceIDs,recovery_instance_ids +recoveryInstanceId,recovery_instance_id +recoveryInstanceProperties,recovery_instance_properties +recoveryPoint,recovery_point +recoveryPointCreateTime,recovery_point_create_time +recoveryPointId,recovery_point_id +recoveryPoints,recovery_points +recoverySnapshotID,recovery_snapshot_id +recurringCharges,recurring_charges +recurringPaymentAmount,recurring_payment_amount +recursive,recursive +redirectUri,redirect_uri +reduceOperationalOverheadWithManagedServices,reduce_operational_overhead_with_managed_services +ref,ref +refValue,ref_value +reference,reference +referenceArn,reference_arn +referenceId,reference_id +referenceStoreId,reference_store_id +referenceStores,reference_stores +referenceType,reference_type +referenceURLs,reference_urls +referenceUrls,reference_urls +referencedBy,referenced_by +referencedTables,referenced_tables +references,references +refreshAfterInSeconds,refresh_after_in_seconds +refreshToken,refresh_token +refreshTokenBody,refresh_token_body +regex,regex +regexConfiguration,regex_configuration +regexFilter,regex_filter +region,region +regionFilter,region_filter +regionList,region_list +regionMap,region_map +regionName,region_name +regionalCertificateArn,regional_certificate_arn +regionalCertificateName,regional_certificate_name +regionalDomainName,regional_domain_name +regionalHostedZoneId,regional_hosted_zone_id +regions,regions +registerAccountStatus,register_account_status +registerTime,register_time +registeredAt,registered_at +registeredBy,registered_by +registeredContainerInstancesCount,registered_container_instances_count +registeredDomainDelegationInfo,registered_domain_delegation_info +registeredResources,registered_resources +registeredTime,registered_time +registeredTimeStamp,registered_time_stamp +registrationCode,registration_code +registrationConfig,registration_config +registrationStatus,registration_status +registries,registries +registry,registry +registryArn,registry_arn +registryCatalogData,registry_catalog_data +registryCredential,registry_credential +registryCredentialOverride,registry_credential_override +registryId,registry_id +registryIds,registry_ids +registryLogin,registry_login +registryScanningConfiguration,registry_scanning_configuration +registryUri,registry_uri +rejectDate,reject_date +rejectReason,reject_reason +rejectedLogEventsInfo,rejected_log_events_info +rejectionStatement,rejection_statement +rel,rel +relatedDeployments,related_deployments +relatedEvents,related_events +relatedItemArn,related_item_arn +relatedItemData,related_item_data +relatedItemId,related_item_id +relatedItems,related_items +relatedItemsUpdate,related_items_update +relatedJoinFieldName,related_join_field_name +relatedJoinTableName,related_join_table_name +relatedModelFields,related_model_fields +relatedModelName,related_model_name +relatedResources,related_resources +relatedVulnerabilities,related_vulnerabilities +relationalDatabase,relational_database +relationalDatabaseAvailabilityZones,relational_database_availability_zones +relationalDatabaseBlueprintId,relational_database_blueprint_id +relationalDatabaseBundleId,relational_database_bundle_id +relationalDatabaseConfig,relational_database_config +relationalDatabaseEvents,relational_database_events +relationalDatabaseName,relational_database_name +relationalDatabaseSnapshot,relational_database_snapshot +relationalDatabaseSnapshotName,relational_database_snapshot_name +relationalDatabaseSnapshots,relational_database_snapshots +relationalDatabaseSourceType,relational_database_source_type +relationalDatabases,relational_databases +relationship,relationship +relationshipName,relationship_name +relationshipStatus,relationship_status +relationshipType,relationship_type +relationshipValue,relationship_value +relationships,relationships +relativeAggregationDuration,relative_aggregation_duration +relativeFileVersion,relative_file_version +relativeImpact,relative_impact +relativePath,relative_path +release,release +releaseLabel,release_label +releaseVersion,release_version +relevanceLevel,relevance_level +relevanceScore,relevance_score +remaining,remaining +remainingResources,remaining_resources +remediation,remediation +remoteAccess,remote_access +remoteAccessAllowed,remote_access_allowed +remoteAccessEnabled,remote_access_enabled +remoteAccessSecurityGroup,remote_access_security_group +remoteAccessSession,remote_access_session +remoteAccessSessionArn,remote_access_session_arn +remoteAccessSessions,remote_access_sessions +remoteDebugEnabled,remote_debug_enabled +remoteModelTransformJob,remote_model_transform_job +remoteParticipantId,remote_participant_id +remoteRecordAppArn,remote_record_app_arn +remoteRecordEnabled,remote_record_enabled +remoteSourceCodeAnalysisServerConfigurationTimestamp,remote_source_code_analysis_server_configuration_timestamp +remoteSourceCodeAnalysisServerInfo,remote_source_code_analysis_server_info +removableAttributes,removable_attributes +removeAllowedPrefixesToDirectConnectGateway,remove_allowed_prefixes_to_direct_connect_gateway +removeAttributes,remove_attributes +removeAuthorizerConfig,remove_authorizer_config +removeAutoRegistration,remove_auto_registration +removeLabels,remove_labels +removeMetrics,remove_metrics +removeNetworkAccessConfiguration,remove_network_access_configuration +removeOverrideLinkOutUri,remove_override_link_out_uri +removePreProvisioningHook,remove_pre_provisioning_hook +removeSecurityGroupIds,remove_security_group_ids +removeSegment,remove_segment +removeSubnetIds,remove_subnet_ids +removeTaints,remove_taints +removeThingType,remove_thing_type +removeVariations,remove_variations +removeVpcConfiguration,remove_vpc_configuration +renderConfig,render_config +renderTypeDeclarations,render_type_declarations +rendererType,renderer_type +renderingConfiguration,rendering_configuration +renderingEngine,rendering_engine +renditionConfiguration,rendition_configuration +renditionSelection,rendition_selection +renditions,renditions +renewalStatus,renewal_status +renewalStatusReason,renewal_status_reason +renewalSummary,renewal_summary +replace,replace +replaceContents,replace_contents +replaceDefaultPolicyVersionParams,replace_default_policy_version_params +replacePermissionAssociationsWork,replace_permission_associations_work +replacePermissionAssociationsWorks,replace_permission_associations_works +replacementOrderArn,replacement_order_arn +replacementType,replacement_type +replicated,replicated +replicatedDisks,replicated_disks +replicatedExternally,replicated_externally +replicatedStorageBytes,replicated_storage_bytes +replicationAccounts,replication_accounts +replicationConfiguration,replication_configuration +replicationConfigurationStatus,replication_configuration_status +replicationConfigurationTemplateID,replication_configuration_template_id +replicationConfigurationTemplateIDs,replication_configuration_template_ids +replicationDetails,replication_details +replicationDirection,replication_direction +replicationJob,replication_job +replicationJobId,replication_job_id +replicationJobList,replication_job_list +replicationJobTerminated,replication_job_terminated +replicationRegions,replication_regions +replicationRunId,replication_run_id +replicationRunList,replication_run_list +replicationServerInstanceType,replication_server_instance_type +replicationServersSecurityGroupsIDs,replication_servers_security_groups_ids +replicationSet,replication_set +replicationSetArns,replication_set_arns +replicationSpecification,replication_specification +replicationStartedDateTime,replication_started_date_time +replicationStatus,replication_status +replicationStatusDetails,replication_status_details +replicationStatusMessage,replication_status_message +replicationStatuses,replication_statuses +replicationStrategy,replication_strategy +replicationType,replication_type +replicationTypes,replication_types +reportARN,report_arn +reportArn,report_arn +reportArns,report_arns +reportBuildBatchStatusOverride,report_build_batch_status_override +reportBuildStatus,report_build_status +reportBuildStatusOverride,report_build_status_override +reportDefinitions,report_definitions +reportDescription,report_description +reportFileFormat,report_file_format +reportFormat,report_format +reportFrequency,report_frequency +reportGroup,report_group +reportGroupArn,report_group_arn +reportGroupArns,report_group_arns +reportGroups,report_groups +reportGroupsNotFound,report_groups_not_found +reportId,report_id +reportName,report_name +reportNames,report_names +reportSummaries,report_summaries +reportType,report_type +reports,reports +reportsNotFound,reports_not_found +repositories,repositories +repositoriesNotFound,repositories_not_found +repository,repository +repositoryArn,repository_arn +repositoryCloneMethod,repository_clone_method +repositoryConnectionArn,repository_connection_arn +repositoryCount,repository_count +repositoryCredentials,repository_credentials +repositoryDescription,repository_description +repositoryEndpoint,repository_endpoint +repositoryFilters,repository_filters +repositoryId,repository_id +repositoryMetadata,repository_metadata +repositoryName,repository_name +repositoryNames,repository_names +repositoryPolicy,repository_policy +repositoryPrefix,repository_prefix +repositoryProvider,repository_provider +repositoryUri,repository_uri +reprocessingId,reprocessing_id +reprocessingSummaries,reprocessing_summaries +republish,republish +request,request +requestAttributes,request_attributes +requestCancelActivityTaskDecisionAttributes,request_cancel_activity_task_decision_attributes +requestCancelActivityTaskFailedEventAttributes,request_cancel_activity_task_failed_event_attributes +requestCancelExternalWorkflowExecutionDecisionAttributes,request_cancel_external_workflow_execution_decision_attributes +requestCancelExternalWorkflowExecutionFailedEventAttributes,request_cancel_external_workflow_execution_failed_event_attributes +requestCancelExternalWorkflowExecutionInitiatedEventAttributes,request_cancel_external_workflow_execution_initiated_event_attributes +requestCompression,request_compression +requestContentType,request_content_type +requestEntries,request_entries +requestEventStream,request_event_stream +requestFailureReason,request_failure_reason +requestHeaders,request_headers +requestId,request_id +requestMACSec,request_mac_sec +requestMappingTemplate,request_mapping_template +requestMessageId,request_message_id +requestMethod,request_method +requestModels,request_models +requestParameters,request_parameters +requestPayload,request_payload +requestTemplates,request_templates +requestTime,request_time +requestType,request_type +requestValidatorId,request_validator_id +requestedAllowedPrefixesToDirectConnectGateway,requested_allowed_prefixes_to_direct_connect_gateway +requestedAt,requested_at +requestedBy,requested_by +requestedEndTime,requested_end_time +requestedOn,requested_on +requestedStartTime,requested_start_time +requests,requests +requireAuthorizationForCacheControl,require_authorization_for_cache_control +requireInstanceProperties,require_instance_properties +required,required +requiredClaims,required_claims +requiredFields,required_fields +requiredProperties,required_properties +requiresAttributes,requires_attributes +requiresCompatibilities,requires_compatibilities +requiresConfiguration,requires_configuration +rescanDuration,rescan_duration +rescanDurationState,rescan_duration_state +rescannedStorageBytes,rescanned_storage_bytes +reservedCpuCores,reserved_cpu_cores +reservedInstanceOptions,reserved_instance_options +reset,reset +resetActionConfiguration,reset_action_configuration +resetActionRequests,reset_action_requests +resetTimer,reset_timer +resiliencyPolicies,resiliency_policies +resiliencyScore,resiliency_score +resolution,resolution +resolutionId,resolution_id +resolutionSteps,resolution_steps +resolutionStrategy,resolution_strategy +resolutionTechniques,resolution_techniques +resolutionType,resolution_type +resolveConflicts,resolve_conflicts +resolvedAt,resolved_at +resolvedComponentVersions,resolved_component_versions +resolvedConfiguration,resolved_configuration +resolvedImageDigest,resolved_image_digest +resolvedReason,resolved_reason +resolvedSourceVersion,resolved_source_version +resolvedTime,resolved_time +resolvedValues,resolved_values +resolver,resolver +resolverArn,resolver_arn +resolvers,resolvers +resource,resource +resourceARN,resource_arn +resourceAccessRole,resource_access_role +resourceArn,resource_arn +resourceArns,resource_arns +resourceConfiguration,resource_configuration +resourceCount,resource_count +resourceCounts,resource_counts +resourceCreationTime,resource_creation_time +resourceDefinitions,resource_definitions +resourceDeletionTime,resource_deletion_time +resourceDetails,resource_details +resourceDigests,resource_digests +resourceErrors,resource_errors +resourceErrorsDetails,resource_errors_details +resourceFilterCriteria,resource_filter_criteria +resourceGroup,resource_group +resourceGroupArn,resource_group_arn +resourceGroupArns,resource_group_arns +resourceGroupName,resource_group_name +resourceGroupNames,resource_group_names +resourceGroupTags,resource_group_tags +resourceGroups,resource_groups +resourceId,resource_id +resourceIdentifier,resource_identifier +resourceIdentifiers,resource_identifiers +resourceIds,resource_ids +resourceKeys,resource_keys +resourceLinks,resource_links +resourceLogEvents,resource_log_events +resourceMappings,resource_mappings +resourceMetadata,resource_metadata +resourceMethods,resource_methods +resourceName,resource_name +resourceNames,resource_names +resourceOwner,resource_owner +resourceOwnerAccount,resource_owner_account +resourcePolicies,resource_policies +resourcePolicy,resource_policy +resourcePrefix,resource_prefix +resourceRecord,resource_record +resourceRegionScope,resource_region_scope +resourceRequirements,resource_requirements +resourceShare,resource_share +resourceShareArn,resource_share_arn +resourceShareArns,resource_share_arns +resourceShareAssociations,resource_share_associations +resourceShareInvitation,resource_share_invitation +resourceShareInvitationArn,resource_share_invitation_arn +resourceShareInvitationArns,resource_share_invitation_arns +resourceShareInvitations,resource_share_invitations +resourceShareName,resource_share_name +resourceShareStatus,resource_share_status +resourceShares,resource_shares +resourceSpecification,resource_specification +resourceState,resource_state +resourceStatus,resource_status +resourceSubType,resource_sub_type +resourceTags,resource_tags +resourceType,resource_type +resourceTypes,resource_types +resources,resources +resourcesAffected,resources_affected +resourcesBudgetEstimate,resources_budget_estimate +resourcesFlagged,resources_flagged +resourcesIgnored,resources_ignored +resourcesIncluded,resources_included +resourcesProcessed,resources_processed +resourcesReceivingAccess,resources_receiving_access +resourcesSummary,resources_summary +resourcesSuppressed,resources_suppressed +resourcesVpcConfig,resources_vpc_config +response,response +responseCard,response_card +responseContentType,response_content_type +responseEventStream,response_event_stream +responseMappingTemplate,response_mapping_template +responseModels,response_models +responseParameters,response_parameters +responsePayload,response_payload +responsePlanArn,response_plan_arn +responsePlanSummaries,response_plan_summaries +responseStreamingSupported,response_streaming_supported +responseTemplates,response_templates +responseTopic,response_topic +responseType,response_type +responses,responses +restApiId,rest_api_id +restoreDate,restore_date +restoreTime,restore_time +restoreTimestamp,restore_timestamp +restoredTableARN,restored_table_arn +restrictPublicBuckets,restrict_public_buckets +restrictions,restrictions +result,result +resultCode,result_code +resultConfiguration,result_configuration +resultCounts,result_counts +resultFilterBy,result_filter_by +resultFormat,result_format +resultFrame,result_frame +resultId,result_id +resultList,result_list +resultSetMetadata,result_set_metadata +resultSetOptions,result_set_options +resultStat,result_stat +resultStats,result_stats +resultStatus,result_status +resultTypeFilter,result_type_filter +results,results +resultsByTime,results_by_time +resultsData,results_data +resultsWritten,results_written +retain,retain +retainedTopics,retained_topics +retentionDuration,retention_duration +retentionInDays,retention_in_days +retentionMode,retention_mode +retentionPeriod,retention_period +retiringPrincipal,retiring_principal +retries,retries +retryAfter,retry_after +retryAfterSeconds,retry_after_seconds +retryAttempt,retry_attempt +retryMode,retry_mode +retryPolicy,retry_policy +retryPolicyConfiguration,retry_policy_configuration +retryPolicyExecution,retry_policy_execution +retryStrategy,retry_strategy +retryType,retry_type +retryable,retryable +return,return +returnCode,return_code +returnInformation,return_information +returnReason,return_reason +returnValue,return_value +reverseOrder,reverse_order +reversedDirectionSourceServerArn,reversed_direction_source_server_arn +reverted,reverted +revision,revision +revisionChangeId,revision_change_id +revisionChangeIdentifier,revision_change_identifier +revisionChildren,revision_children +revisionDag,revision_dag +revisionId,revision_id +revisionInfo,revision_info +revisionLocation,revision_location +revisionNumber,revision_number +revisionSummary,revision_summary +revisionType,revision_type +revisionUrl,revision_url +revisionUrlTemplate,revision_url_template +revisions,revisions +revocationEffectiveFrom,revocation_effective_from +revocationReason,revocation_reason +revocationRecord,revocation_record +revocationSupported,revocation_supported +revokedAt,revoked_at +revokedBy,revoked_by +revokedEntities,revoked_entities +rewrite,rewrite +rid,rid +risk,risk +riskScore,risk_score +robot,robot +robotApplicationNames,robot_application_names +robotApplicationSummaries,robot_application_summaries +robotApplications,robot_applications +robotDeploymentSummary,robot_deployment_summary +robotDeploymentTimeoutInSeconds,robot_deployment_timeout_in_seconds +robotSoftwareSuite,robot_software_suite +robots,robots +role,role +roleARN,role_arn +roleAlias,role_alias +roleAliasArn,role_alias_arn +roleAliasDescription,role_alias_description +roleAliases,role_aliases +roleArn,role_arn +roleArnForLogging,role_arn_for_logging +roleArns,role_arns +roleCredentials,role_credentials +roleList,role_list +roleName,role_name +roleNameArn,role_name_arn +roleType,role_type +roleValues,role_values +roles,roles +rollDisposition,roll_disposition +rollback,rollback +rollbackDeploymentId,rollback_deployment_id +rollbackInfo,rollback_info +rollbackMessage,rollback_message +rollbackStatus,rollback_status +rollbackTriggeringDeploymentId,rollback_triggering_deployment_id +rollingBackTrxCount,rolling_back_trx_count +rollingBackTrxEarliestStartTime,rolling_back_trx_earliest_start_time +rolloutState,rollout_state +rolloutStateReason,rollout_state_reason +roomIdentifier,room_identifier +rooms,rooms +root,root +rootDeviceName,root_device_name +rootDirectory,root_directory +rootGroup,root_group +rootResourceId,root_resource_id +rootToParentThingGroups,root_to_parent_thing_groups +rootVolume,root_volume +rootVolumeName,root_volume_name +rotateMasterUserPassword,rotate_master_user_password +rotateSecret,rotate_secret +rotationSize,rotation_size +routableCIDRSpace,routable_cidr_space +route,route +routeFilterPrefixes,route_filter_prefixes +routeName,route_name +routedResources,routed_resources +router,router +routerTypeIdentifier,router_type_identifier +routes,routes +routingConfiguration,routing_configuration +row,row +rowData,row_data +rowId,row_id +rowIds,row_ids +rowIdsNotFound,row_ids_not_found +rowNumber,row_number +rows,rows +rowsToCreate,rows_to_create +rowsToUpdate,rows_to_update +rowsToUpsert,rows_to_upsert +rpoDescription,rpo_description +rpoInSecs,rpo_in_secs +rpoReferenceId,rpo_reference_id +rtoDescription,rto_description +rtoInSecs,rto_in_secs +rtoReferenceId,rto_reference_id +rule,rule +ruleAction,rule_action +ruleArn,rule_arn +ruleBasedProperties,rule_based_properties +ruleConfiguration,rule_configuration +ruleContentSha256,rule_content_sha256 +ruleDesc,rule_desc +ruleDetails,rule_details +ruleDisabled,rule_disabled +ruleEvaluation,rule_evaluation +ruleExecutionMode,rule_execution_mode +ruleGroupsNamespace,rule_groups_namespace +ruleGroupsNamespaces,rule_groups_namespaces +ruleID,rule_id +ruleId,rule_id +ruleIdentifier,rule_identifier +ruleName,rule_name +ruleNames,rule_names +ruleNumber,rule_number +ruleResults,rule_results +ruleVersion,rule_version +rules,rules +rulesPackageArn,rules_package_arn +rulesPackageArns,rules_package_arns +rulesPackages,rules_packages +run,run +runAsGroup,run_as_group +runAsNonRoot,run_as_non_root +runAsUser,run_as_user +runContext,run_context +runEnvironment,run_environment +runGroupId,run_group_id +runId,run_id +runLeftNormalization,run_left_normalization +runOnce,run_once +runOrder,run_order +runTimeAssessmentStatus,run_time_assessment_status +runWith,run_with +running,running +runningCount,running_count +runningQueryCount,running_query_count +runningTasksCount,running_tasks_count +runs,runs +runtime,runtime +runtimeConfiguration,runtime_configuration +runtimeHintValues,runtime_hint_values +runtimeHints,runtime_hints +runtimeId,runtime_id +runtimePlatform,runtime_platform +runtimeRoleArn,runtime_role_arn +runtimeStatus,runtime_status +runtimeStatusMessage,runtime_status_message +runtimeVersion,runtime_version +runtimes,runtimes +s3,s3 +s3Bucket,s3_bucket +s3BucketArn,s3_bucket_arn +s3BucketName,s3_bucket_name +s3BucketOwner,s3_bucket_owner +s3BucketRegion,s3_bucket_region +s3BucketSource,s3_bucket_source +s3BucketTranscriptSource,s3_bucket_transcript_source +s3Config,s3_config +s3Configuration,s3_configuration +s3DataDestination,s3_data_destination +s3DataSource,s3_data_source +s3DeepLink,s3_deep_link +s3Destination,s3_destination +s3DestinationConfig,s3_destination_config +s3DestinationConfiguration,s3_destination_configuration +s3DestinationExportFileFormat,s3_destination_export_file_format +s3DestinationExportFileFormatOptions,s3_destination_export_file_format_options +s3DestinationUrl,s3_destination_url +s3EncryptionEnabled,s3_encryption_enabled +s3Etags,s3_etags +s3ExportConfiguration,s3_export_configuration +s3InputFileType,s3_input_file_type +s3InputFormatConfig,s3_input_format_config +s3JobDefinition,s3_job_definition +s3Key,s3_key +s3KeyPrefix,s3_key_prefix +s3Keys,s3_keys +s3KmsKeyArn,s3_kms_key_arn +s3Location,s3_location +s3LogBucket,s3_log_bucket +s3Logs,s3_logs +s3LogsArn,s3_logs_arn +s3Managed,s3_managed +s3MonitoringConfiguration,s3_monitoring_configuration +s3Object,s3_object +s3ObjectKey,s3_object_key +s3ObjectVersion,s3_object_version +s3OutputEncryptionKMSKey,s3_output_encryption_kms_key +s3OutputFormatConfig,s3_output_format_config +s3OutputKeyPrefix,s3_output_key_prefix +s3Path,s3_path +s3Paths,s3_paths +s3Prefix,s3_prefix +s3Reference,s3_reference +s3RelativePath,s3_relative_path +s3ResourceArn,s3_resource_arn +s3ResourcePath,s3_resource_path +s3Resources,s3_resources +s3ResourcesUpdate,s3_resources_update +s3StateFileUrl,s3_state_file_url +s3Uri,s3_uri +s3Url,s3_url +s3WordsList,s3_words_list +s3bucketForAnalysisData,s3bucket_for_analysis_data +s3bucketForReportData,s3bucket_for_report_data +s3key,s3_key +s3location,s3_location +sageMakerStudioDomainUrl,sage_maker_studio_domain_url +sagemakerIamRoleArn,sagemaker_iam_role_arn +salesforce,salesforce +saml,saml +samlConfiguration,saml_configuration +samlConfigurationStatus,saml_configuration_status +samlMetadataDocument,saml_metadata_document +samlMetadataURL,saml_metadata_url +samlOptions,saml_options +sample,sample +sampleCount,sample_count +sampleFailureReason,sample_failure_reason +sampleId,sample_id +sampleRate,sample_rate +sampleText,sample_text +sampleUtterances,sample_utterances +sampleUtterancesCount,sample_utterances_count +sampleValue,sample_value +samples,samples +samplingPercentage,sampling_percentage +samplingRate,sampling_rate +satelliteArn,satellite_arn +satelliteId,satellite_id +satellites,satellites +savedownStorageConfiguration,savedown_storage_configuration +savingsOpportunity,savings_opportunity +savingsOpportunityPercentage,savings_opportunity_percentage +savingsPlanArn,savings_plan_arn +savingsPlanArns,savings_plan_arns +savingsPlanId,savings_plan_id +savingsPlanIds,savings_plan_ids +savingsPlanOffering,savings_plan_offering +savingsPlanOfferingId,savings_plan_offering_id +savingsPlanOfferingIds,savings_plan_offering_ids +savingsPlanPaymentOptions,savings_plan_payment_options +savingsPlanType,savings_plan_type +savingsPlanTypes,savings_plan_types +savingsPlans,savings_plans +scalarFunctions,scalar_functions +scale,scale +scaleInCooldownSeconds,scale_in_cooldown_seconds +scaleInPolicy,scale_in_policy +scaleOutCooldownSeconds,scale_out_cooldown_seconds +scaleOutPolicy,scale_out_policy +scaling,scaling +scalingConfig,scaling_config +scanAll,scan_all +scanFrequency,scan_frequency +scanName,scan_name +scanNameArn,scan_name_arn +scanOnPush,scan_on_push +scanRate,scan_rate +scanState,scan_state +scanStatus,scan_status +scanStatusCode,scan_status_code +scanStatusReason,scan_status_reason +scanType,scan_type +scanningConfiguration,scanning_configuration +scanningConfigurations,scanning_configurations +scansWithMostOpenCriticalFindings,scans_with_most_open_critical_findings +scansWithMostOpenFindings,scans_with_most_open_findings +sceneId,scene_id +sceneMetadata,scene_metadata +sceneSummaries,scene_summaries +schedule,schedule +scheduleActivityTaskDecisionAttributes,schedule_activity_task_decision_attributes +scheduleActivityTaskFailedEventAttributes,schedule_activity_task_failed_event_attributes +scheduleEndTime,schedule_end_time +scheduleExpression,schedule_expression +scheduleFrequency,schedule_frequency +scheduleLambdaFunctionDecisionAttributes,schedule_lambda_function_decision_attributes +scheduleLambdaFunctionFailedEventAttributes,schedule_lambda_function_failed_event_attributes +scheduleOffset,schedule_offset +scheduleStartTime,schedule_start_time +scheduleTime,schedule_time +scheduleToCloseTimeout,schedule_to_close_timeout +scheduleToStartTimeout,schedule_to_start_timeout +scheduledAuditArn,scheduled_audit_arn +scheduledAuditName,scheduled_audit_name +scheduledAudits,scheduled_audits +scheduledBefore,scheduled_before +scheduledEventId,scheduled_event_id +scheduledJobRollouts,scheduled_job_rollouts +scheduledOnOrAfter,scheduled_on_or_after +scheduledSplitsConfig,scheduled_splits_config +scheduledSplitsDefinition,scheduled_splits_definition +scheduledStartTime,scheduled_start_time +schedulingConfig,scheduling_config +schedulingPolicies,scheduling_policies +schedulingPolicyArn,scheduling_policy_arn +schedulingPriority,scheduling_priority +schedulingPriorityOverride,scheduling_priority_override +schedulingStrategy,scheduling_strategy +schema,schema +schemaArn,schema_arn +schemaDefinition,schema_definition +schemaList,schema_list +schemaName,schema_name +schemaStorageConfig,schema_storage_config +schemaSummaries,schema_summaries +schemaType,schema_type +schemaVersion,schema_version +schemas,schemas +scheme,scheme +scope,scope +scopes,scopes +scoping,scoping +score,score +scoreDetails,score_details +scoreSource,score_source +scores,scores +scoringVector,scoring_vector +screenAutomationId,screen_automation_id +screenId,screen_id +screenshots,screenshots +script,script +scriptLocation,script_location +scriptLocationS3Bucket,script_location_s3_bucket +scriptLocationS3Key,script_location_s3_key +scriptModeConfig,script_mode_config +scriptName,script_name +scriptOutputLocation,script_output_location +scriptParameters,script_parameters +scriptType,script_type +sdkType,sdk_type +searchCriteria,search_criteria +searchExpression,search_expression +searchOrder,search_order +searchResults,search_results +searchTerm,search_term +searchableAttributes,searchable_attributes +searchedCompletely,searched_completely +searchedLogStreams,searched_log_streams +secondaryArtifacts,secondary_artifacts +secondaryArtifactsOverride,secondary_artifacts_override +secondaryAvailabilityZone,secondary_availability_zone +secondarySourceVersions,secondary_source_versions +secondarySources,secondary_sources +secondarySourcesOverride,secondary_sources_override +secondarySourcesVersionOverride,secondary_sources_version_override +seconds,seconds +secondsToLive,seconds_to_live +secret,secret +secretARN,secret_arn +secretAccessKey,secret_access_key +secretArn,secret_arn +secretId,secret_id +secretKey,secret_key +secretName,secret_name +secretOptions,secret_options +secretPolicy,secret_policy +secrets,secrets +secretsManagerKey,secrets_manager_key +sectionalElements,sectional_elements +sections,sections +secureInitializationRoleArn,secure_initialization_role_arn +securityConfigDetail,security_config_detail +securityConfigSummaries,security_config_summaries +securityContext,security_context +securityDetails,security_details +securityGroup,security_group +securityGroupIds,security_group_ids +securityGroups,security_groups +securityHubConfiguration,security_hub_configuration +securityPolicy,security_policy +securityPolicyDetail,security_policy_detail +securityPolicySummaries,security_policy_summaries +securityProfileArn,security_profile_arn +securityProfileDescription,security_profile_description +securityProfileIdentifier,security_profile_identifier +securityProfileIdentifiers,security_profile_identifiers +securityProfileName,security_profile_name +securityProfileTargetArn,security_profile_target_arn +securityProfileTargetMappings,security_profile_target_mappings +securityProfileTargets,security_profile_targets +seed,seed +seedReplicationTime,seed_replication_time +seedTime,seed_time +seenAt,seen_at +segment,segment +segmentOverrides,segment_overrides +segments,segments +selectAttributes,select_attributes +selectedProperties,selected_properties +selectedTestList,selected_test_list +selectionMode,selection_mode +selectionPattern,selection_pattern +selector,selector +selectors,selectors +seleniumProperties,selenium_properties +semanticVersion,semantic_version +senderAccountId,sender_account_id +senderId,sender_id +sensitive,sensitive +sensitiveData,sensitive_data +sensitiveDataOccurrences,sensitive_data_occurrences +sensitivityInspectionTemplateId,sensitivity_inspection_template_id +sensitivityInspectionTemplates,sensitivity_inspection_templates +sensitivityScore,sensitivity_score +sensitivityScoreOverridden,sensitivity_score_overridden +sensitivityScoreOverride,sensitivity_score_override +sentAt,sent_at +sentiment,sentiment +sentimentAnalysisSettings,sentiment_analysis_settings +sentimentLabel,sentiment_label +sentimentResponse,sentiment_response +sentimentScore,sentiment_score +sep,sep +separator,separator +sequenceInformation,sequence_information +sequenceStoreId,sequence_store_id +sequenceStores,sequence_stores +sequenceToken,sequence_token +serial,serial +serialNumber,serial_number +serializer,serializer +server,server +serverCatalogStatus,server_catalog_status +serverCertificateArn,server_certificate_arn +serverCertificateArns,server_certificate_arns +serverCertificateStatus,server_certificate_status +serverCertificateStatusDetail,server_certificate_status_detail +serverCertificates,server_certificates +serverCriteria,server_criteria +serverDetail,server_detail +serverError,server_error +serverErrorCategory,server_error_category +serverGroupId,server_group_id +serverGroupLaunchConfigurations,server_group_launch_configurations +serverGroupReplicationConfigurations,server_group_replication_configurations +serverGroupValidationConfigurations,server_group_validation_configurations +serverGroups,server_groups +serverId,server_id +serverImportFailure,server_import_failure +serverImportSuccess,server_import_success +serverInfos,server_infos +serverLaunchConfigurations,server_launch_configurations +serverList,server_list +serverName,server_name +serverReplicationConfigurations,server_replication_configurations +serverReplicationParameters,server_replication_parameters +serverSideEncryption,server_side_encryption +serverSideEncryptionConfiguration,server_side_encryption_configuration +serverStrategies,server_strategies +serverType,server_type +serverUrl,server_url +serverValidationConfigurations,server_validation_configurations +serverValidationOutput,server_validation_output +serverValidationStrategy,server_validation_strategy +servers,servers +serversCount,servers_count +serversMappedToApplications,servers_mapped_to_applications +serversMappedtoTags,servers_mappedto_tags +service,service +serviceAccountName,service_account_name +serviceAccountRoleArn,service_account_role_arn +serviceArn,service_arn +serviceArns,service_arns +serviceAttributes,service_attributes +serviceCode,service_code +serviceCodeList,service_code_list +serviceCodes,service_codes +serviceConnectConfiguration,service_connect_configuration +serviceConnectDefaults,service_connect_defaults +serviceConnectEndpoint,service_connect_endpoint +serviceConnectResources,service_connect_resources +serviceDiscovery,service_discovery +serviceDnsName,service_dns_name +serviceExecutionRoleArn,service_execution_role_arn +serviceId,service_id +serviceIdentifier,service_identifier +serviceInstance,service_instance +serviceInstanceName,service_instance_name +serviceInstances,service_instances +serviceIpv4Cidr,service_ipv4_cidr +serviceIpv6Cidr,service_ipv6_cidr +serviceLimit,service_limit +serviceLinkedRoleArn,service_linked_role_arn +serviceManagedS3,service_managed_s3 +serviceMetadata,service_metadata +serviceMode,service_mode +serviceName,service_name +serviceNetworkArn,service_network_arn +serviceNetworkId,service_network_id +serviceNetworkIdentifier,service_network_identifier +serviceNetworkName,service_network_name +serviceNetworkServiceAssociationIdentifier,service_network_service_association_identifier +serviceNetworkVpcAssociationIdentifier,service_network_vpc_association_identifier +serviceProviderSamlMetadata,service_provider_saml_metadata +serviceRecommendationOptions,service_recommendation_options +serviceRegistries,service_registries +serviceRole,service_role +serviceRoleArn,service_role_arn +serviceRoleOverride,service_role_override +serviceSpec,service_spec +serviceSyncBlocker,service_sync_blocker +serviceSyncBlockerSummary,service_sync_blocker_summary +serviceSyncConfig,service_sync_config +serviceTemplate,service_template +serviceTemplateVersion,service_template_version +serviceTemplates,service_templates +serviceType,service_type +services,services +session,session +sessionArn,session_arn +sessionAttributes,session_attributes +sessionBackup,session_backup +sessionConfiguration,session_configuration +sessionContext,session_context +sessionDurationInMinutes,session_duration_in_minutes +sessionEnabled,session_enabled +sessionExpirationTime,session_expiration_time +sessionId,session_id +sessionIds,session_ids +sessionIssuer,session_issuer +sessionPersistenceMode,session_persistence_mode +sessionPolicy,session_policy +sessionState,session_state +sessionStorage,session_storage +sessionSummaries,session_summaries +sessionTarget,session_target +sessionTimeout,session_timeout +sessionToken,session_token +sessionType,session_type +sessions,sessions +set,set +setAsActive,set_as_active +setAsDefault,set_as_default +setDefaultVersion,set_default_version +setFileModes,set_file_modes +setTimer,set_timer +setVariable,set_variable +setting,setting +settings,settings +severities,severities +severity,severity +severityCode,severity_code +severityCounts,severity_counts +severityLevels,severity_levels +sha,sha +sha256,sha256 +sha256sum,sha256_sum +shadow,shadow +shadowName,shadow_name +shape,shape +shapeId,shape_id +shardCapacity,shard_capacity +shardCount,shard_count +share,share +shareDecaySeconds,share_decay_seconds +shareDistribution,share_distribution +shareId,share_id +shareIdentifier,share_identifier +shareName,share_name +shareUrl,share_url +sharedAccess,shared_access +sharedAccountId,shared_account_id +sharedMemorySize,shared_memory_size +sharedVia,shared_via +shares,shares +shippingAddress,shipping_address +shippingLabel,shipping_label +shortCode,short_code +shots,shots +shouldOverwrite,should_overwrite +shouldProfile,should_profile +showThumbnails,show_thumbnails +shutdownAgentlessCollectors,shutdown_agentless_collectors +shutdownAgents,shutdown_agents +shutdownConnectors,shutdown_connectors +shutdownMeCollectors,shutdown_me_collectors +sid,sid +signalCatalogArn,signal_catalog_arn +signalDecoders,signal_decoders +signalDecodersToAdd,signal_decoders_to_add +signalDecodersToRemove,signal_decoders_to_remove +signalDecodersToUpdate,signal_decoders_to_update +signalExternalWorkflowExecutionDecisionAttributes,signal_external_workflow_execution_decision_attributes +signalExternalWorkflowExecutionFailedEventAttributes,signal_external_workflow_execution_failed_event_attributes +signalExternalWorkflowExecutionInitiatedEventAttributes,signal_external_workflow_execution_initiated_event_attributes +signalName,signal_name +signalsMap,signals_map +signalsToCollect,signals_to_collect +signature,signature +signatureAlgorithm,signature_algorithm +signatureContains,signature_contains +signatureCount,signature_count +signatureDateTime,signature_date_time +signatureExpiresAfter,signature_expires_after +signatureExpiresAt,signature_expires_at +signatureExpiresBefore,signature_expires_before +signatureInfo,signature_info +signatureKeyId,signature_key_id +signatureMap,signature_map +signatureR,signature_r +signatureS,signature_s +signatureTimestamp,signature_timestamp +signatureV,signature_v +signatureValid,signature_valid +signatureValidityPeriod,signature_validity_period +signedBiUrl,signed_bi_url +signedConnectionString,signed_connection_string +signedObject,signed_object +signingConfiguration,signing_configuration +signingDisabled,signing_disabled +signingImageFormat,signing_image_format +signingMaterial,signing_material +signingParameters,signing_parameters +signingProfileName,signing_profile_name +signingProfileParameter,signing_profile_parameter +signingRegion,signing_region +signingServiceName,signing_service_name +sigv4,sigv4 +silent,silent +simpleCriterion,simple_criterion +simpleRule,simple_rule +simpleRuleEvaluation,simple_rule_evaluation +simpleScopeTerm,simple_scope_term +simulationApplicationNames,simulation_application_names +simulationApplicationSummaries,simulation_application_summaries +simulationApplications,simulation_applications +simulationJobBatchSummaries,simulation_job_batch_summaries +simulationJobSummaries,simulation_job_summaries +simulationSoftwareSuite,simulation_software_suite +simulationTimeMillis,simulation_time_millis +simulationUnitLimit,simulation_unit_limit +since,since +site,site +siteLinkEnabled,site_link_enabled +sites,sites +size,size +sizeClassified,size_classified +sizeInBytes,size_in_bytes +sizeInBytesCompressed,size_in_bytes_compressed +sizeInGb,size_in_gb +sizeInGiB,size_in_gib +sizeInMiB,size_in_mib +sizeLimit,size_limit +skipAppResign,skip_app_resign +skipFinalSnapshot,skip_final_snapshot +skipResourceInUseCheck,skip_resource_in_use_check +skipped,skipped +skippedEntries,skipped_entries +skippedFindingsCount,skipped_findings_count +slackChannelConfigurations,slack_channel_configurations +slackWorkspaceConfigurations,slack_workspace_configurations +slotCaptureSetting,slot_capture_setting +slotConstraint,slot_constraint +slotDiscrepancies,slot_discrepancies +slotElicitationStyle,slot_elicitation_style +slotHints,slot_hints +slotId,slot_id +slotMatchResult,slot_match_result +slotMatchResultCounts,slot_match_result_counts +slotName,slot_name +slotPriorities,slot_priorities +slotResolutionResults,slot_resolution_results +slotSpecifications,slot_specifications +slotSummaries,slot_summaries +slotToElicit,slot_to_elicit +slotType,slot_type +slotTypeCategory,slot_type_category +slotTypeConfigurations,slot_type_configurations +slotTypeId,slot_type_id +slotTypeName,slot_type_name +slotTypeSignature,slot_type_signature +slotTypeSummaries,slot_type_summaries +slotTypeValues,slot_type_values +slotTypeVersion,slot_type_version +slotTypes,slot_types +slotTypesCount,slot_types_count +slots,slots +slotsFilledInSession,slots_filled_in_session +smallVolumeConf,small_volume_conf +smallVolumeMaxSize,small_volume_max_size +smsConfigurations,sms_configurations +snapshot,snapshot +snapshotArn,snapshot_arn +snapshotConfiguration,snapshot_configuration +snapshotCreateTime,snapshot_create_time +snapshotCreationTime,snapshot_creation_time +snapshotID,snapshot_id +snapshotId,snapshot_id +snapshotName,snapshot_name +snapshotRemainingDays,snapshot_remaining_days +snapshotRetentionPeriod,snapshot_retention_period +snapshotRetentionStartTime,snapshot_retention_start_time +snapshotTimeOfDay,snapshot_time_of_day +snapshots,snapshots +snoozeActionConfiguration,snooze_action_configuration +snoozeActionRequests,snooze_action_requests +snoozeDuration,snooze_duration +sns,sns +snsPublishStatusCode,sns_publish_status_code +snsTopic,sns_topic +snsTopicARN,sns_topic_arn +snsTopicArn,sns_topic_arn +socketAddress,socket_address +softLimit,soft_limit +software,software +solution,solution +solutionArn,solution_arn +solutionConfig,solution_config +solutionVersion,solution_version +solutionVersionArn,solution_version_arn +solutionVersions,solution_versions +solutions,solutions +sopRecommendations,sop_recommendations +sort,sort +sortBy,sort_by +sortByAttribute,sort_by_attribute +sortByOrder,sort_by_order +sortColumns,sort_columns +sortCriteria,sort_criteria +sortOrder,sort_order +sorts,sorts +source,source +source1,source1 +source2,source2 +sourceAccessToken,source_access_token +sourceAccount,source_account +sourceAccountID,source_account_id +sourceApiArn,source_api_arn +sourceApiAssociation,source_api_association +sourceApiAssociationConfig,source_api_association_config +sourceApiAssociationStatus,source_api_association_status +sourceApiAssociationStatusDetail,source_api_association_status_detail +sourceApiAssociationSummaries,source_api_association_summaries +sourceApiId,source_api_id +sourceApiIdentifier,source_api_identifier +sourceArn,source_arn +sourceArns,source_arns +sourceAuthOverride,source_auth_override +sourceBotVersion,source_bot_version +sourceBranch,source_branch +sourceCloudProperties,source_cloud_properties +sourceCode,source_code +sourceCodeList,source_code_list +sourceCodeRepositories,source_code_repositories +sourceCodeRepository,source_code_repository +sourceCommit,source_commit +sourceCommitId,source_commit_id +sourceCommitSpecifier,source_commit_specifier +sourceConfiguration,source_configuration +sourceConnectionState,source_connection_state +sourceConnectorLabel,source_connector_label +sourceConnectorProperties,source_connector_properties +sourceConnectorType,source_connector_type +sourceContainer,source_container +sourceCredentialsInfos,source_credentials_infos +sourceData,source_data +sourceDatabaseName,source_database_name +sourceDescription,source_description +sourceDiskName,source_disk_name +sourceFields,source_fields +sourceFile,source_file +sourceFileType,source_file_type +sourceFiles,source_files +sourceFlowConfig,source_flow_config +sourceFrequency,source_frequency +sourceId,source_id +sourceIdentifier,source_identifier +sourceImageSet,source_image_set +sourceImageSetId,source_image_set_id +sourceImageSetProperties,source_image_set_properties +sourceInfo,source_info +sourceInstanceName,source_instance_name +sourceIpAddress,source_ip_address +sourceKeyspaceName,source_keyspace_name +sourceKeyword,source_keyword +sourceLambdaLayerArn,source_lambda_layer_arn +sourceLayerHash,source_layer_hash +sourceLocationOverride,source_location_override +sourceName,source_name +sourceNetwork,source_network +sourceNetworkID,source_network_id +sourceNetworkIDs,source_network_ids +sourceNetworks,source_networks +sourceParams,source_params +sourcePath,source_path +sourcePipelineArn,source_pipeline_arn +sourcePipelineName,source_pipeline_name +sourceProperties,source_properties +sourceReference,source_reference +sourceRegion,source_region +sourceRelationalDatabaseName,source_relational_database_name +sourceRepository,source_repository +sourceRepositoryName,source_repository_name +sourceResourceName,source_resource_name +sourceRevisions,source_revisions +sourceS3DirectoryPath,source_s3_directory_path +sourceS3Location,source_s3_location +sourceS3Object,source_s3_object +sourceSchemaName,source_schema_name +sourceSecurityGroups,source_security_groups +sourceServer,source_server +sourceServerArn,source_server_arn +sourceServerID,source_server_id +sourceServerIDs,source_server_ids +sourceServerId,source_server_id +sourceServerTags,source_server_tags +sourceServers,source_servers +sourceSetUpOption,source_set_up_option +sourceSnapshotName,source_snapshot_name +sourceStatuses,source_statuses +sourceTableName,source_table_name +sourceType,source_type +sourceTypeOverride,source_type_override +sourceUrl,source_url +sourceVersion,source_version +sourceVolume,source_volume +sourceVpc,source_vpc +sourceVpcID,source_vpc_id +sources,sources +spaceName,space_name +span,span +sparkSqlJobDriver,spark_sql_job_driver +sparkSqlParameters,spark_sql_parameters +sparkSubmitJobDriver,spark_submit_job_driver +sparkSubmitParameters,spark_submit_parameters +sparql,sparql +spec,spec +spectrumConfig,spectrum_config +speechTranscriptionResult,speech_transcription_result +speechTranscriptionResultCounts,speech_transcription_result_counts +speedOfMigration,speed_of_migration +sphere,sphere +spoolingMode,spooling_mode +spotIamFleetRole,spot_iam_fleet_role +sql,sql +sqlParameters,sql_parameters +sqlQuery,sql_query +sqlStatementResults,sql_statement_results +sqlStatements,sql_statements +sqs,sqs +srcCodeOrDbAnalysisStatus,src_code_or_db_analysis_status +sseConfig,sse_config +sseKmsKeyId,sse_kms_key_id +sshKeyName,ssh_key_name +sshPublicKey,ssh_public_key +ssmAgentDiscoveryDatetime,ssm_agent_discovery_datetime +ssmDocument,ssm_document +ssmDocumentName,ssm_document_name +ssmDocumentType,ssm_document_type +ssmDocuments,ssm_documents +ssmOutput,ssm_output +ssmValidationParameters,ssm_validation_parameters +ssmlMessage,ssml_message +ssoApplicationId,sso_application_id +ssoClientId,sso_client_id +ssoIdentity,sso_identity +stabilityStatus,stability_status +stabilityStatusAt,stability_status_at +stackId,stack_id +stackName,stack_name +stackParameters,stack_parameters +stackSetName,stack_set_name +stage,stage +stageArn,stage_arn +stageDescription,stage_description +stageDetails,stage_details +stageKeys,stage_keys +stageName,stage_name +stageProgress,stage_progress +stageSession,stage_session +stageSessions,stage_sessions +stageStates,stage_states +stageVariableOverrides,stage_variable_overrides +stageVariables,stage_variables +stages,stages +stagingAccountID,staging_account_id +stagingAccountIDs,staging_account_ids +stagingArea,staging_area +stagingAreaSubnetId,staging_area_subnet_id +stagingAreaTags,staging_area_tags +stagingAvailabilityZone,staging_availability_zone +stagingDiskType,staging_disk_type +stagingSourceServerArn,staging_source_server_arn +standardControlsCount,standard_controls_count +standardDeviation,standard_deviation +start,start +startAfter,start_after +startAt,start_at +startAtPreviousStartedEvent,start_at_previous_started_event +startBit,start_bit +startByte,start_byte +startCharOffset,start_char_offset +startChildWorkflowExecutionDecisionAttributes,start_child_workflow_execution_decision_attributes +startChildWorkflowExecutionFailedEventAttributes,start_child_workflow_execution_failed_event_attributes +startChildWorkflowExecutionInitiatedEventAttributes,start_child_workflow_execution_initiated_event_attributes +startColumn,start_column +startDate,start_date +startDateTime,start_date_time +startFromHead,start_from_head +startInclusive,start_inclusive +startLambdaFunctionFailedEventAttributes,start_lambda_function_failed_event_attributes +startLine,start_line +startOn,start_on +startPeriod,start_period +startResponse,start_response +startSigningJobParameter,start_signing_job_parameter +startTime,start_time +startTimeFilter,start_time_filter +startTimeInSeconds,start_time_in_seconds +startTimeOffsetInNanos,start_time_offset_in_nanos +startTimeRange,start_time_range +startTimeout,start_timeout +startTimeoutMs,start_timeout_ms +startTimerDecisionAttributes,start_timer_decision_attributes +startTimerFailedEventAttributes,start_timer_failed_event_attributes +startTimes,start_times +startTimestamp,start_timestamp +startToCloseTimeout,start_to_close_timeout +startToFireTimeout,start_to_fire_timeout +startToken,start_token +startUrl,start_url +started,started +startedAfter,started_after +startedAt,started_at +startedBefore,started_before +startedBy,started_by +startedEventId,started_event_id +startedFromBackupId,started_from_backup_id +startedOn,started_on +startedTime,started_time +startingToken,starting_token +stat,stat +state,state +stateChangeConfiguration,state_change_configuration +stateChangeError,state_change_error +stateChangeTimeRange,state_change_time_range +stateChangedAt,state_changed_at +stateChanges,state_changes +stateDescription,state_description +stateDetail,state_detail +stateDetails,state_details +stateEnteredEventDetails,state_entered_event_details +stateExitedEventDetails,state_exited_event_details +stateMachineAliasArn,state_machine_alias_arn +stateMachineAliases,state_machine_aliases +stateMachineArn,state_machine_arn +stateMachineName,state_machine_name +stateMachineVersionArn,state_machine_version_arn +stateMachineVersions,state_machine_versions +stateMachines,state_machines +stateName,state_name +stateOrProvince,state_or_province +stateReason,state_reason +stateValue,state_value +statement,statement +statementId,statement_id +states,states +staticColumns,static_columns +staticIp,static_ip +staticIpName,static_ip_name +staticIps,static_ips +statistic,statistic +statisticalThreshold,statistical_threshold +statistics,statistics +statisticsId,statistics_id +stats,stats +status,status +statusChangeTime,status_change_time +statusChangedAt,status_changed_at +statusCode,status_code +statusCodes,status_codes +statusCounts,status_counts +statusDetail,status_detail +statusDetails,status_details +statusEquals,status_equals +statusFilter,status_filter +statusList,status_list +statusMessage,status_message +statusReason,status_reason +statusReportS3Bucket,status_report_s3_bucket +statusReportS3Key,status_report_s3_key +statusSummary,status_summary +statusTimeoutInSeconds,status_timeout_in_seconds +statusType,status_type +statusUpdateDateTime,status_update_date_time +statuscode,statuscode +statuses,statuses +stdDeviation,std_deviation +stddev,stddev +step,step +stepActionType,step_action_type +stepAutomationConfiguration,step_automation_configuration +stepExecutionId,step_execution_id +stepFunctions,step_functions +stepGroupId,step_group_id +stepId,step_id +stepName,step_name +stepTarget,step_target +stepTargets,step_targets +stepTimeoutInMinutes,step_timeout_in_minutes +steps,steps +stillWaitingResponse,still_waiting_response +stmt,stmt +stopAction,stop_action +stopAt,stop_at +stopCode,stop_code +stopConditions,stop_conditions +stopDate,stop_date +stopInstanceOnIdleRequest,stop_instance_on_idle_request +stopTime,stop_time +stopTimeout,stop_timeout +stopTrigger,stop_trigger +stopped,stopped +stoppedAt,stopped_at +stoppedBy,stopped_by +stoppedReason,stopped_reason +stoppingAt,stopping_at +stoppingCondition,stopping_condition +storage,storage +storageCapacity,storage_capacity +storageClass,storage_class +storageCompressionFormat,storage_compression_format +storageConfigurations,storage_configurations +storageGBHour,storage_gb_hour +storageLocation,storage_location +storagePerMonthInGb,storage_per_month_in_gb +storageType,storage_type +storeArn,store_arn +storeFormat,store_format +storeId,store_id +storeName,store_name +storeOptions,store_options +storeSizeBytes,store_size_bytes +storedBytes,stored_bytes +strValues,str_values +strategy,strategy +strategyOption,strategy_option +stream,stream +streamArn,stream_arn +streamConfiguration,stream_configuration +streamId,stream_id +streamInfo,stream_info +streamKey,stream_key +streamKeys,stream_keys +streamName,stream_name +streamOutputToCloudWatch,stream_output_to_cloud_watch +streamSession,stream_session +streamSessions,stream_sessions +streamUI,stream_ui +streamUrl,stream_url +streamVersion,stream_version +streamingImage,streaming_image +streamingImageId,streaming_image_id +streamingImageIds,streaming_image_ids +streamingImages,streaming_images +streamingSessionBackup,streaming_session_backup +streamingSessionBackups,streaming_session_backups +streams,streams +streamsKmsKey,streams_kms_key +streamsKmsRole,streams_kms_role +street1,street1 +street2,street2 +street3,street3 +streetInfo,street_info +streetName,street_name +streetNumber,street_number +streetSuffix,street_suffix +string,string +stringSetValue,string_set_value +stringValue,string_value +stringValues,string_values +strings,strings +structurallyExclusive,structurally_exclusive +studio,studio +studioComponent,studio_component +studioComponentId,studio_component_id +studioComponentIds,studio_component_ids +studioComponentName,studio_component_name +studioComponentSummaries,studio_component_summaries +studioComponents,studio_components +studioEncryptionConfiguration,studio_encryption_configuration +studioId,studio_id +studioName,studio_name +studioUrl,studio_url +studios,studios +style,style +subDomainSetting,sub_domain_setting +subDomainSettings,sub_domain_settings +subDomains,sub_domains +subFolders,sub_folders +subModules,sub_modules +subResourceId,sub_resource_id +subSlotHints,sub_slot_hints +subSlotSetting,sub_slot_setting +subSlotToElicit,sub_slot_to_elicit +subSlots,sub_slots +subTitle,sub_title +subdirectory,subdirectory +subject,subject +subjectAlternativeNames,subject_alternative_names +subjectArn,subject_arn +subjectId,subject_id +subjectStructures,subject_structures +subjects,subjects +submit,submit +submitTime,submit_time +submittedAt,submitted_at +submittedBy,submitted_by +submitter,submitter +subnet,subnet +subnetId,subnet_id +subnetIds,subnet_ids +subnets,subnets +subqueries,subqueries +subscribedAt,subscribed_at +subscriber,subscriber +subscriberArn,subscriber_arn +subscriberDescription,subscriber_description +subscriberEndpoint,subscriber_endpoint +subscriberId,subscriber_id +subscriberIdentity,subscriber_identity +subscriberName,subscriber_name +subscriberStatus,subscriber_status +subscribers,subscribers +subscriptionFilters,subscription_filters +subscriptionProtocol,subscription_protocol +subscriptionType,subscription_type +subscriptions,subscriptions +subscriptionsFilePath,subscriptions_file_path +subtitle,subtitle +subtype,subtype +succeeded,succeeded +succeededFindingsCount,succeeded_findings_count +succeededWorldCount,succeeded_world_count +succeededWorlds,succeeded_worlds +success,success +successCodes,success_codes +successConditional,success_conditional +successCount,success_count +successEntries,success_entries +successNextStep,success_next_step +successResponse,success_response +successResponseHandlingConfig,success_response_handling_config +successful,successful +successfulEntries,successful_entries +successfulExecutions,successful_executions +successfulRequests,successful_requests +successfulSet,successful_set +successfulVersions,successful_versions +suffix,suffix +suggest,suggest +suggestedChanges,suggested_changes +suggestedFixes,suggested_fixes +suggester,suggester +suggestion,suggestion +suggestions,suggestions +suite,suite +suiteDefinitionArn,suite_definition_arn +suiteDefinitionConfiguration,suite_definition_configuration +suiteDefinitionId,suite_definition_id +suiteDefinitionInformationList,suite_definition_information_list +suiteDefinitionName,suite_definition_name +suiteDefinitionVersion,suite_definition_version +suiteRunArn,suite_run_arn +suiteRunConfiguration,suite_run_configuration +suiteRunId,suite_run_id +suiteRunsList,suite_runs_list +suites,suites +sum,sum +sumOfSquares,sum_of_squares +summaries,summaries +summary,summary +summaryList,summary_list +superuserParameters,superuser_parameters +supplementaryConfiguration,supplementary_configuration +suppliedData,supplied_data +supportCode,support_code +supportedApiVersions,supported_api_versions +supportedAppCategories,supported_app_categories +supportedComponentSources,supported_component_sources +supportedDataTransferApis,supported_data_transfer_apis +supportedDataTransferTypes,supported_data_transfer_types +supportedDateFormat,supported_date_format +supportedDestinationConnectors,supported_destination_connectors +supportedFieldTypeDetails,supported_field_type_details +supportedFormats,supported_formats +supportedHours,supported_hours +supportedLanguages,supported_languages +supportedLocales,supported_locales +supportedOperators,supported_operators +supportedOsVersions,supported_os_versions +supportedPlatforms,supported_platforms +supportedRegions,supported_regions +supportedSchedulingFrequencies,supported_scheduling_frequencies +supportedTriggerTypes,supported_trigger_types +supportedValues,supported_values +supportedVersion,supported_version +supportedWriteOperations,supported_write_operations +supportsNitroInstances,supports_nitro_instances +suppressAlerts,suppress_alerts +suppressDataIdentifiers,suppress_data_identifiers +suppressIndefinitely,suppress_indefinitely +suppressNextMessage,suppress_next_message +suppressed,suppressed +suppressedAlertsIncluded,suppressed_alerts_included +suppressedNonCompliantResourcesCount,suppressed_non_compliant_resources_count +suppressions,suppressions +swappiness,swappiness +symbolicLinks,symbolic_links +syncConfig,sync_config +syncDefinitions,sync_definitions +syncFromResources,sync_from_resources +syncJobSummaries,sync_job_summaries +syncResources,sync_resources +syncRole,sync_role +syncSource,sync_source +syncType,sync_type +syncWithPublicNamespace,sync_with_public_namespace +synonyms,synonyms +systemControls,system_controls +systemEvent,system_event +systemEvidenceCount,system_evidence_count +systemInfo,system_info +systemInitializationScripts,system_initialization_scripts +systemInstanceId,system_instance_id +systemMessage,system_message +systemResourceLimits,system_resource_limits +systemsManagerAgent,systems_manager_agent +tableArn,table_arn +tableColumnId,table_column_id +tableColumnName,table_column_name +tableColumns,table_columns +tableId,table_id +tableName,table_name +tablePrefix,table_prefix +tableReference,table_reference +tableRegistrationOutput,table_registration_output +tableRestoreRequestId,table_restore_request_id +tableRestoreStatus,table_restore_status +tableRestoreStatuses,table_restore_statuses +tables,tables +tabularConditions,tabular_conditions +tabularPropertyValues,tabular_property_values +tabularSchemaConfig,tabular_schema_config +tag,tag +tagCriterion,tag_criterion +tagFilter,tag_filter +tagFilters,tag_filters +tagKey,tag_key +tagKeyComparisonType,tag_key_comparison_type +tagKeys,tag_keys +tagList,tag_list +tagQueryConfiguration,tag_query_configuration +tagScopeTerm,tag_scope_term +tagStatus,tag_status +tagValue,tag_value +tagValueComparisonType,tag_value_comparison_type +tagValues,tag_values +tags,tags +tagsOverride,tags_override +taints,taints +target,target +targetAccount,target_account +targetAccountId,target_account_id +targetAccountIds,target_account_ids +targetAction,target_action +targetArn,target_arn +targetArns,target_arns +targetAwsAccount,target_aws_account +targetBitrate,target_bitrate +targetBranch,target_branch +targetCapacity,target_capacity +targetCheckNames,target_check_names +targetComponentName,target_component_name +targetComponentTypeId,target_component_type_id +targetDatabaseEngine,target_database_engine +targetDatabaseName,target_database_name +targetDestination,target_destination +targetEirp,target_eirp +targetEntityId,target_entity_id +targetFileSize,target_file_size +targetFilters,target_filters +targetFramerate,target_framerate +targetFrames,target_frames +targetFramesIndex,target_frames_index +targetGroup,target_group +targetGroupArn,target_group_arn +targetGroupArns,target_group_arns +targetGroupIdentifier,target_group_identifier +targetGroupInfoList,target_group_info_list +targetGroupPairInfoList,target_group_pair_info_list +targetGroupType,target_group_type +targetGroups,target_groups +targetId,target_id +targetIdentifier,target_identifier +targetIds,target_ids +targetInstanceID,target_instance_id +targetInstanceTypeRightSizingMethod,target_instance_type_right_sizing_method +targetInstances,target_instances +targetIntervalSeconds,target_interval_seconds +targetKeyspaceName,target_keyspace_name +targetName,target_name +targetNodes,target_nodes +targetPipeline,target_pipeline +targetRegion,target_region +targetRepository,target_repository +targetResolution,target_resolution +targetResource,target_resource +targetResourceCount,target_resource_count +targetResourceCreatedAt,target_resource_created_at +targetResourceType,target_resource_type +targetResourceTypes,target_resource_types +targetRevision,target_revision +targetRoleArn,target_role_arn +targetSchemaName,target_schema_name +targetSelection,target_selection +targetSnapshotName,target_snapshot_name +targetState,target_state +targetStatus,target_status +targetTableName,target_table_name +targetType,target_type +targetUrl,target_url +targetVersion,target_version +targetVersionWeight,target_version_weight +targetVpc,target_vpc +targets,targets +task,task +taskArn,task_arn +taskArns,task_arns +taskContext,task_context +taskCredentials,task_credentials +taskDefinition,task_definition +taskDefinitionArn,task_definition_arn +taskDefinitionArns,task_definition_arns +taskDefinitions,task_definitions +taskEndTime,task_end_time +taskError,task_error +taskErrorDetails,task_error_details +taskFailedEventDetails,task_failed_event_details +taskId,task_id +taskIdList,task_id_list +taskIds,task_ids +taskInfos,task_infos +taskList,task_list +taskListScheduleToStartTimeout,task_list_schedule_to_start_timeout +taskName,task_name +taskObject,task_object +taskPriority,task_priority +taskProperties,task_properties +taskRoleArn,task_role_arn +taskScheduledEventDetails,task_scheduled_event_details +taskSet,task_set +taskSetArn,task_set_arn +taskSetLabel,task_set_label +taskSets,task_sets +taskSetsInfo,task_sets_info +taskStartFailedEventDetails,task_start_failed_event_details +taskStartTime,task_start_time +taskStartToCloseTimeout,task_start_to_close_timeout +taskStartedEventDetails,task_started_event_details +taskStatistics,task_statistics +taskStatus,task_status +taskSubmitFailedEventDetails,task_submit_failed_event_details +taskSubmittedEventDetails,task_submitted_event_details +taskSucceededEventDetails,task_succeeded_event_details +taskSummary,task_summary +taskTimedOutEventDetails,task_timed_out_event_details +taskToken,task_token +taskType,task_type +taskingDocument,tasking_document +taskrunnerId,taskrunner_id +tasks,tasks +tcpRetryEvents,tcp_retry_events +tcpRoute,tcp_route +teamId,team_id +teamMembers,team_members +teamName,team_name +telemetryEndpoint,telemetry_endpoint +telemetryMetadata,telemetry_metadata +template,template +templateArn,template_arn +templateBody,template_body +templateFile,template_file +templateFormat,template_format +templateId,template_id +templateLocation,template_location +templateMajorVersion,template_major_version +templateMinorVersion,template_minor_version +templateName,template_name +templateStepGroupSummary,template_step_group_summary +templateStepSummaryList,template_step_summary_list +templateSummaries,template_summaries +templateSummary,template_summary +templateSyncConfig,template_sync_config +templateType,template_type +templateUri,template_uri +templateVersion,template_version +templateVersions,template_versions +templates,templates +templatesLocation,templates_location +temporaryPassword,temporary_password +tenancy,tenancy +tenant,tenant +tenantDisplayName,tenant_display_name +tenantId,tenant_id +tenantIdentifier,tenant_identifier +termDurationInSeconds,term_duration_in_seconds +termLength,term_length +terminate,terminate +terminateAt,terminate_at +terminateBlueInstancesOnDeploymentSuccess,terminate_blue_instances_on_deployment_success +terminateInstanceOnFailure,terminate_instance_on_failure +terminateJobsOnUpdate,terminate_jobs_on_update +terminationWaitTimeInMinutes,termination_wait_time_in_minutes +termsAggregation,terms_aggregation +terraformSource,terraform_source +terraformSourceName,terraform_source_name +terraformSourceNames,terraform_source_names +terraformSources,terraform_sources +test,test +testArtifactsUrl,test_artifacts_url +testBotAliasTags,test_bot_alias_tags +testCaseDefinitionId,test_case_definition_id +testCaseDefinitionName,test_case_definition_name +testCaseRunId,test_case_run_id +testCaseScenarioId,test_case_scenario_id +testCaseScenarioType,test_case_scenario_type +testCases,test_cases +testConfigUrl,test_config_url +testDurationInMinutes,test_duration_in_minutes +testExecutionId,test_execution_id +testExecutionModality,test_execution_modality +testExecutionResults,test_execution_results +testExecutionStatus,test_execution_status +testExecutions,test_executions +testGridProject,test_grid_project +testGridProjects,test_grid_projects +testGridSession,test_grid_session +testGridSessions,test_grid_sessions +testId,test_id +testPackageArn,test_package_arn +testRawDataPath,test_raw_data_path +testRecommendations,test_recommendations +testResult,test_result +testScenarios,test_scenarios +testSetDiscrepancyRawOutputUrl,test_set_discrepancy_raw_output_url +testSetDiscrepancyReportId,test_set_discrepancy_report_id +testSetDiscrepancyReportStatus,test_set_discrepancy_report_status +testSetDiscrepancyTopErrors,test_set_discrepancy_top_errors +testSetExportSpecification,test_set_export_specification +testSetGenerationId,test_set_generation_id +testSetGenerationStatus,test_set_generation_status +testSetId,test_set_id +testSetImportResourceSpecification,test_set_import_resource_specification +testSetName,test_set_name +testSetRecords,test_set_records +testSetTags,test_set_tags +testSets,test_sets +testSpecArn,test_spec_arn +testSummary,test_summary +testTrafficRoute,test_traffic_route +testType,test_type +testingInformation,testing_information +tests,tests +text,text +textDataDeliveryEnabled,text_data_delivery_enabled +textInput,text_input +textInputSpecification,text_input_specification +textLogSettings,text_log_settings +textResponse,text_response +tfi,tfi +tgwStatus,tgw_status +theme,theme +themeToCreate,theme_to_create +then,then +thingArn,thing_arn +thingConnectivityIndexingMode,thing_connectivity_indexing_mode +thingGroupArn,thing_group_arn +thingGroupDescription,thing_group_description +thingGroupId,thing_group_id +thingGroupIndexingConfiguration,thing_group_indexing_configuration +thingGroupIndexingMode,thing_group_indexing_mode +thingGroupMetadata,thing_group_metadata +thingGroupName,thing_group_name +thingGroupNames,thing_group_names +thingGroupProperties,thing_group_properties +thingGroups,thing_groups +thingGroupsToAdd,thing_groups_to_add +thingGroupsToRemove,thing_groups_to_remove +thingId,thing_id +thingIndexingConfiguration,thing_indexing_configuration +thingIndexingMode,thing_indexing_mode +thingName,thing_name +thingTypeArn,thing_type_arn +thingTypeDescription,thing_type_description +thingTypeId,thing_type_id +thingTypeMetadata,thing_type_metadata +thingTypeName,thing_type_name +thingTypeProperties,thing_type_properties +thingTypes,thing_types +things,things +thirdPartyConfigurationUrl,third_party_configuration_url +threadStates,thread_states +threadsPerCore,threads_per_core +threshold,threshold +thresholdBreachValue,threshold_breach_value +thresholdPercent,threshold_percent +thresholdPercentage,threshold_percentage +thresholdValue,threshold_value +throttle,throttle +throttleSettings,throttle_settings +throttling,throttling +throttlingBurstLimit,throttling_burst_limit +throttlingRateLimit,throttling_rate_limit +throughput,throughput +throughputInfo,throughput_info +throughputMode,throughput_mode +thumbnailConfiguration,thumbnail_configuration +thumbnailUrl,thumbnail_url +thumbprint,thumbprint +tier,tier +time,time +timeBasedCanary,time_based_canary +timeBasedLinear,time_based_linear +timeCreated,time_created +timeDimension,time_dimension +timeExpression,time_expression +timeInMillis,time_in_millis +timeInSeconds,time_in_seconds +timeOfCreation,time_of_creation +timeOfEvent,time_of_event +timeOrdering,time_ordering +timePeriod,time_period +timeRange,time_range +timeSeriesArn,time_series_arn +timeSeriesCreationDate,time_series_creation_date +timeSeriesId,time_series_id +timeSeriesLastUpdateDate,time_series_last_update_date +timeSeriesType,time_series_type +timeToLive,time_to_live +timeToLiveInSeconds,time_to_live_in_seconds +timeValue,time_value +timedOut,timed_out +timems,timems +timeout,timeout +timeoutConditional,timeout_conditional +timeoutConfig,timeout_config +timeoutInMillis,timeout_in_millis +timeoutInMins,timeout_in_mins +timeoutInMinutes,timeout_in_minutes +timeoutInMinutesOverride,timeout_in_minutes_override +timeoutInSeconds,timeout_in_seconds +timeoutMillis,timeout_millis +timeoutMinutes,timeout_minutes +timeoutNextStep,timeout_next_step +timeoutResponse,timeout_response +timeoutSeconds,timeout_seconds +timeoutType,timeout_type +timerCanceledEventAttributes,timer_canceled_event_attributes +timerFiredEventAttributes,timer_fired_event_attributes +timerId,timer_id +timerName,timer_name +timerStartedEventAttributes,timer_started_event_attributes +timers,timers +timestamp,timestamp +timestampFormat,timestamp_format +timestampPartition,timestamp_partition +timestamps,timestamps +timestream,timestream +timestreamDatabaseArn,timestream_database_arn +timestreamDatabaseName,timestream_database_name +timestreamRegistrationResponse,timestream_registration_response +timestreamResources,timestream_resources +timestreamTableArn,timestream_table_arn +timestreamTableName,timestream_table_name +timezone,timezone +tip,tip +title,title +titles,titles +tleData,tle_data +tleLine1,tle_line1 +tleLine2,tle_line2 +tls,tls +tlsCertificateSummaries,tls_certificate_summaries +tlsCertificates,tls_certificates +tlsConfig,tls_config +tlsContext,tls_context +tlsPolicies,tls_policies +tlsPolicyName,tls_policy_name +tmpfs,tmpfs +to,to +toBlockchainInstant,to_blockchain_instant +toDate,to_date +toDateTime,to_date_time +toPermissionArn,to_permission_arn +toPermissionVersion,to_permission_version +toPort,to_port +token,token +tokenBalances,token_balances +tokenEndpoint,token_endpoint +tokenExpirationTime,token_expiration_time +tokenFilter,token_filter +tokenId,token_id +tokenIdentifier,token_identifier +tokenKeyName,token_key_name +tokenName,token_name +tokenNameList,token_name_list +tokenSignature,token_signature +tokenSigningPublicKeys,token_signing_public_keys +tokenType,token_type +tokenUrl,token_url +tokenUrlCustomProperties,token_url_custom_properties +tokenUrls,token_urls +tokenValue,token_value +toleratedFailureCount,tolerated_failure_count +toleratedFailurePercentage,tolerated_failure_percentage +tooNewLogEventStartIndex,too_new_log_event_start_index +tooOldLogEventEndIndex,too_old_log_event_end_index +toolName,tool_name +toolchain,toolchain +tools,tools +topMatches,top_matches +topPanel,top_panel +topic,topic +topicArn,topic_arn +topicIntegrationArn,topic_integration_arn +topicPattern,topic_pattern +topicPolicy,topic_policy +topicRuleDestination,topic_rule_destination +topicRulePayload,topic_rule_payload +topologyFilter,topology_filter +total,total +totalActuators,total_actuators +totalAgentlessCollectors,total_agentless_collectors +totalAgents,total_agents +totalApplications,total_applications +totalAssessmentControlsCount,total_assessment_controls_count +totalAttributes,total_attributes +totalBackupSizeInMegaBytes,total_backup_size_in_mega_bytes +totalBaseCount,total_base_count +totalBranches,total_branches +totalBytesClassified,total_bytes_classified +totalChecks,total_checks +totalConnectors,total_connectors +totalControlsCount,total_controls_count +totalCount,total_count +totalCounts,total_counts +totalDataInMegaBytes,total_data_in_mega_bytes +totalDetections,total_detections +totalDetectionsSuppressed,total_detections_suppressed +totalDiscoveredResources,total_discovered_resources +totalDurationInMillis,total_duration_in_millis +totalEdgePropertyValues,total_edge_property_values +totalEvidence,total_evidence +totalExecutionDurationSeconds,total_execution_duration_seconds +totalFailureCount,total_failure_count +totalFindingsCount,total_findings_count +totalItemsClassified,total_items_classified +totalItemsSensitive,total_items_sensitive +totalItemsSkipped,total_items_skipped +totalItemsSkippedInvalidEncryption,total_items_skipped_invalid_encryption +totalItemsSkippedInvalidKms,total_items_skipped_invalid_kms +totalItemsSkippedPermissionDenied,total_items_skipped_permission_denied +totalJobs,total_jobs +totalMeCollectors,total_me_collectors +totalNoOfSrv,total_no_of_srv +totalNodePropertyValues,total_node_property_values +totalNodes,total_nodes +totalNumberOfFindings,total_number_of_findings +totalNumberOfJobs,total_number_of_jobs +totalParts,total_parts +totalReadCount,total_read_count +totalRecords,total_records +totalRecordsCount,total_records_count +totalRecordsProcessed,total_records_processed +totalReservedMinuteAllocation,total_reserved_minute_allocation +totalResourceUtilization,total_resource_utilization +totalResources,total_resources +totalResourcesCount,total_resources_count +totalResultCount,total_result_count +totalResults,total_results +totalScheduledMinutes,total_scheduled_minutes +totalSensors,total_sensors +totalServerGroups,total_server_groups +totalServers,total_servers +totalSizeInBytes,total_size_in_bytes +totalSizeInMegaBytes,total_size_in_mega_bytes +totalSourceServers,total_source_servers +totalStepCount,total_step_count +totalSteps,total_steps +totalStepsFailed,total_steps_failed +totalStepsSkipped,total_steps_skipped +totalStepsSucceeded,total_steps_succeeded +totalStorageBytes,total_storage_bytes +totals,totals +tpr,tpr +traceHeader,trace_header +tracingConfiguration,tracing_configuration +tracingEnabled,tracing_enabled +trackerName,tracker_name +trackingConfigArn,tracking_config_arn +trackingId,tracking_id +trackingInformation,tracking_information +trackingNamespaceName,tracking_namespace_name +trackingNamespaceVersion,tracking_namespace_version +trackingNumber,tracking_number +trafficGroupArn,traffic_group_arn +trafficRoutingConfig,traffic_routing_config +trafficWeight,traffic_weight +trailList,trail_list +trailNameList,trail_name_list +trailProperties,trail_properties +trails,trails +trainModelS3Location,train_model_s3_location +trainingDataCollectionStartDate,training_data_collection_start_date +trainingDataConfig,training_data_config +trainingDataSchema,training_data_schema +trainingDataSource,training_data_source +trainingEntryPointScript,training_entry_point_script +trainingHours,training_hours +trainingInputMode,training_input_mode +trainingInstanceType,training_instance_type +trainingInstanceVolumeSizeInGB,training_instance_volume_size_in_gb +trainingJobName,training_job_name +trainingLoss,training_loss +trainingMetrics,training_metrics +trainingMetricsV2,training_metrics_v2 +trainingMode,training_mode +trainingResult,training_result +trainingResultV2,training_result_v2 +trainingTimeOutInSeconds,training_time_out_in_seconds +trait,trait +traits,traits +tranformationToolInstallationLink,tranformation_tool_installation_link +transaction,transaction +transactionFee,transaction_fee +transactionHash,transaction_hash +transactionId,transaction_id +transactionIndex,transaction_index +transactionStatus,transaction_status +transactionTimestamp,transaction_timestamp +transactions,transactions +transcript,transcript +transcriptFilter,transcript_filter +transcriptFormat,transcript_format +transcriptSourceSetting,transcript_source_setting +transferData,transfer_data +transferDate,transfer_date +transferMessage,transfer_message +transferPerMonthInGb,transfer_per_month_in_gb +transferredCertificateArn,transferred_certificate_arn +transferredTo,transferred_to +transform,transform +transformEntryPointScript,transform_entry_point_script +transformationTool,transformation_tool +transitEncryption,transit_encryption +transitEncryptionEnabled,transit_encryption_enabled +transitEncryptionPort,transit_encryption_port +transitGatewayConfiguration,transit_gateway_configuration +transitGatewayID,transit_gateway_id +transitionEvents,transition_events +transitionType,transition_type +transitions,transitions +transmitDisabled,transmit_disabled +transportProtocol,transport_protocol +traversalDirection,traversal_direction +traversalType,traversal_type +treatMissingData,treat_missing_data +treatmentName,treatment_name +treatmentNames,treatment_names +treatmentWeights,treatment_weights +treatments,treatments +treeId,tree_id +trendField,trend_field +trialMinutes,trial_minutes +trigger,trigger +triggerArn,trigger_arn +triggerConfig,trigger_config +triggerConfigurations,trigger_configurations +triggerDetail,trigger_detail +triggerDetails,trigger_details +triggerEvents,trigger_events +triggerMode,trigger_mode +triggerName,trigger_name +triggerProperties,trigger_properties +triggerTargetArn,trigger_target_arn +triggerType,trigger_type +triggers,triggers +troubleshootingText,troubleshooting_text +truncated,truncated +truncatedEvents,truncated_events +trust,trust +trustAnchor,trust_anchor +trustAnchorArn,trust_anchor_arn +trustAnchorId,trust_anchor_id +trustAnchors,trust_anchors +trustPolicy,trust_policy +trustStore,trust_store +trustStoreArn,trust_store_arn +trustStores,trust_stores +truststoreUri,truststore_uri +truststoreVersion,truststore_version +truststoreWarnings,truststore_warnings +ttl,ttl +ttps,ttps +tumbling,tumbling +tunedHPOParams,tuned_hpo_params +tunnel,tunnel +tunnelArn,tunnel_arn +tunnelId,tunnel_id +tunnelSummaries,tunnel_summaries +turnNumber,turn_number +turnResult,turn_result +turnSpecification,turn_specification +turnsToLive,turns_to_live +type,type +typeFilter,type_filter +typeHint,type_hint +typeInfo,type_info +typeInfos,type_infos +typeName,type_name +types,types +typesFilePath,types_file_path +udid,udid +uid,uid +ulimits,ulimits +unauthorizedCacheControlHeaderStrategy,unauthorized_cache_control_header_strategy +uncertaintyRange,uncertainty_range +unclassifiableObjectCount,unclassifiable_object_count +unclassifiableObjectSizeInBytes,unclassifiable_object_size_in_bytes +undoDeprecate,undo_deprecate +unencrypted,unencrypted +unfinished,unfinished +unhealthyAgentlessCollectors,unhealthy_agentless_collectors +unhealthyAgents,unhealthy_agents +unhealthyConnectors,unhealthy_connectors +unhealthyMeCollectors,unhealthy_me_collectors +unhealthyThreshold,unhealthy_threshold +unhealthyThresholdCount,unhealthy_threshold_count +unicode,unicode +uninstallAfterBuild,uninstall_after_build +uniqueId,unique_id +uniqueProblems,unique_problems +unit,unit +unitLabel,unit_label +unitOfMeasure,unit_of_measure +units,units +unknown,unknown +unknownAgentlessCollectors,unknown_agentless_collectors +unknownAgents,unknown_agents +unknownConnectors,unknown_connectors +unknownMeCollectors,unknown_me_collectors +unlabeledEventsTreatment,unlabeled_events_treatment +unlimited,unlimited +unmanagedvCpus,unmanagedv_cpus +unmask,unmask +unmetered,unmetered +unmeteredDevices,unmetered_devices +unmeteredRemoteAccessDevices,unmetered_remote_access_devices +unprocessedAccounts,unprocessed_accounts +unprocessedEndTimes,unprocessed_end_times +unprocessedJobs,unprocessed_jobs +unprocessedResourceKeys,unprocessed_resource_keys +unprocessedWorlds,unprocessed_worlds +unsetDefaultVersion,unset_default_version +unsuccessful,unsuccessful +unsupportedResourceStatus,unsupported_resource_status +unsupportedResources,unsupported_resources +unvalidatedJSON,unvalidated_json +upToDate,up_to_date +upcomingMinutesScheduled,upcoming_minutes_scheduled +updatableAttributes,updatable_attributes +update,update +updateCACertificateParams,update_ca_certificate_params +updateCollectionDetail,update_collection_detail +updateConfig,update_config +updateConfiguration,update_configuration +updateDate,update_date +updateDateTime,update_date_time +updateDeviceCertificateParams,update_device_certificate_params +updateId,update_id +updateIds,update_ids +updateImageSetMetadataUpdates,update_image_set_metadata_updates +updateInstructionBatch,update_instruction_batch +updateMode,update_mode +updateOutdatedInstancesOnly,update_outdated_instances_only +updatePolicy,update_policy +updateReason,update_reason +updateResponse,update_response +updateResults,update_results +updateSingleCardinalityProperties,update_single_cardinality_properties +updateStatus,update_status +updateStatusReason,update_status_reason +updateTime,update_time +updateTimestamp,update_timestamp +updateToLatestImageVersion,update_to_latest_image_version +updateType,update_type +updated,updated +updatedAt,updated_at +updatedBy,updated_by +updatedByChangesetId,updated_by_changeset_id +updatedComponent,updated_component +updatedDate,updated_date +updatedForm,updated_form +updatedTheme,updated_theme +updatedTime,updated_time +updatesChangesetId,updates_changeset_id +upfrontPaymentAmount,upfront_payment_amount +uplinkBandwidthBits,uplink_bandwidth_bits +uplinkDelayMs,uplink_delay_ms +uplinkJitterMs,uplink_jitter_ms +uplinkLossPercent,uplink_loss_percent +upload,upload +uploadAllowed,upload_allowed +uploadBehavior,upload_behavior +uploadConfigurations,upload_configurations +uploadId,upload_id +uploadSequenceToken,upload_sequence_token +uploadStatus,upload_status +uploadUrl,upload_url +uploads,uploads +upperBoundValue,upper_bound_value +upperBoundValues,upper_bound_values +upperInclusive,upper_inclusive +upsertAction,upsert_action +upstream,upstream +upstreamRegistryUrl,upstream_registry_url +upstreams,upstreams +uri,uri +uris,uris +url,url +urlExpiry,url_expiry +urls,urls +usage,usage +usageCost,usage_cost +usageLimit,usage_limit +usageLimitArn,usage_limit_arn +usageLimitId,usage_limit_id +usageLimits,usage_limits +usagePlanId,usage_plan_id +usageState,usage_state +usageText,usage_text +usageTotals,usage_totals +usageType,usage_type +usageTypes,usage_types +useBase64,use_base64 +useCallerCredentials,use_caller_credentials +useDedicatedReplicationServer,use_dedicated_replication_server +useDefaultApplications,use_default_applications +useDefaultTools,use_default_tools +useDefaultUploadConfigurations,use_default_upload_configurations +useEventVariables,use_event_variables +useExtendedIds,use_extended_ids +useFipsEndpoint,use_fips_endpoint +useLatestRestorableAutoSnapshot,use_latest_restorable_auto_snapshot +useLatestRestorableTime,use_latest_restorable_time +useOnly,use_only +usePrefixAttributeValue,use_prefix_attribute_value +usePrivateIP,use_private_ip +usePrivateLinkForMetadataAndAuthorization,use_private_link_for_metadata_and_authorization +useStageCache,use_stage_cache +used,used +user,user +userAccessLoggingSettings,user_access_logging_settings +userAccessLoggingSettingsArn,user_access_logging_settings_arn +userAccessResultsList,user_access_results_list +userAccessTasksList,user_access_tasks_list +userAgent,user_agent +userArn,user_arn +userAttribute,user_attribute +userAttributes,user_attributes +userAttributesForFindings,user_attributes_for_findings +userCode,user_code +userData,user_data +userDataOverride,user_data_override +userDataValidationParameters,user_data_validation_parameters +userFeedback,user_feedback +userFirstName,user_first_name +userFullName,user_full_name +userGroups,user_groups +userId,user_id +userIdentity,user_identity +userIds,user_ids +userInitializationScripts,user_initialization_scripts +userLastName,user_last_name +userLoginName,user_login_name +userName,user_name +userPausedDetails,user_paused_details +userPoolArn,user_pool_arn +userPoolConfig,user_pool_config +userPoolId,user_pool_id +userProfiles,user_profiles +userProperties,user_properties +userProvidedEdgeIds,user_provided_edge_ids +userProvidedID,user_provided_id +userRole,user_role +userRoleArn,user_role_arn +userRules,user_rules +userSettings,user_settings +userSettingsArn,user_settings_arn +userStatus,user_status +userTurn,user_turn +userType,user_type +username,username +usernameClaim,username_claim +usernamePrefix,username_prefix +users,users +utilizationMetrics,utilization_metrics +utterance,utterance +utteranceFirstRecordedInAggregationDuration,utterance_first_recorded_in_aggregation_duration +utteranceInput,utterance_input +utteranceLastRecordedInAggregationDuration,utterance_last_recorded_in_aggregation_duration +utteranceLevelTestResults,utterance_level_test_results +utteranceRequestId,utterance_request_id +utteranceString,utterance_string +utteranceTimestamp,utterance_timestamp +utteranceUnderstood,utterance_understood +utterances,utterances +uuid,uuid +v1,v1 +v1BotLocale,v1_bot_locale +v1BotName,v1_bot_name +v1BotNameContains,v1_bot_name_contains +v1BotVersion,v1_bot_version +v2BotId,v2_bot_id +v2BotName,v2_bot_name +v2BotRole,v2_bot_role +vCPUHour,v_cpu_hour +valid,valid +validTimeRange,valid_time_range +validZones,valid_zones +validatePolicyResourceType,validate_policy_resource_type +validateRequestBody,validate_request_body +validateRequestParameters,validate_request_parameters +validatedDependencyRevisions,validated_dependency_revisions +validatedNamespaceVersion,validated_namespace_version +validation,validation +validationCertificateArn,validation_certificate_arn +validationDataConfig,validation_data_config +validationErrors,validation_errors +validationId,validation_id +validationLoss,validation_loss +validationMessage,validation_message +validationMetrics,validation_metrics +validationOutputList,validation_output_list +validationResults,validation_results +validationSettings,validation_settings +validationStatus,validation_status +validationWarnings,validation_warnings +validations,validations +validators,validators +validity,validity +value,value +valueElicitationPrompt,value_elicitation_prompt +valueElicitationPromptSpecification,value_elicitation_prompt_specification +valueElicitationSetting,value_elicitation_setting +valueFrom,value_from +valueKey,value_key +valueMappings,value_mappings +valueRegexPattern,value_regex_pattern +valueSelectionSetting,value_selection_setting +valueSelectionStrategy,value_selection_strategy +valueSet,value_set +valueString,value_string +valueType,value_type +values,values +variableEntries,variable_entries +variableImpactExplanations,variable_impact_explanations +variableImportance,variable_importance +variableImportanceMetrics,variable_importance_metrics +variableName,variable_name +variableNames,variable_names +variableType,variable_type +variables,variables +variance,variance +variantImportJobs,variant_import_jobs +variantStores,variant_stores +variantValues,variant_values +variants,variants +variation,variation +variations,variations +vaultName,vault_name +vaultNotificationConfig,vault_notification_config +vcenterBasedRemoteInfoList,vcenter_based_remote_info_list +vcenterClientID,vcenter_client_id +vcenterConfigurationTimeStamp,vcenter_configuration_time_stamp +vcenterUUID,vcenter_uuid +vcpus,vcpus +vehicleName,vehicle_name +vehicleSummaries,vehicle_summaries +vehicles,vehicles +vendor,vendor +vendorAdditionalFixedProperties,vendor_additional_fixed_properties +vendorAdditionalTransientProperties,vendor_additional_transient_properties +vendorCreatedAt,vendor_created_at +vendorGuidance,vendor_guidance +vendorGuidanceMessage,vendor_guidance_message +vendorProperties,vendor_properties +vendorSeverity,vendor_severity +vendorUpdatedAt,vendor_updated_at +vendorWorkerId,vendor_worker_id +vendorWorkerIpAddress,vendor_worker_ip_address +verificationCertificate,verification_certificate +verificationState,verification_state +verificationStateDescription,verification_state_description +verificationUri,verification_uri +verificationUriComplete,verification_uri_complete +verified,verified +version,version +versionArn,version_arn +versionCode,version_code +versionControl,version_control +versionControlConfigurationTimeStamp,version_control_configuration_time_stamp +versionControlInfoList,version_control_info_list +versionControlType,version_control_type +versionDescription,version_description +versionId,version_id +versionInfo,version_info +versionName,version_name +versionNumber,version_number +versionOptions,version_options +versionOrAlias,version_or_alias +versionQualifier,version_qualifier +versionRequirement,version_requirement +versionRequirements,version_requirements +versionRevision,version_revision +versionRevisions,version_revisions +versionSizeBytes,version_size_bytes +versionStatus,version_status +versionUpdateByJobsConfig,version_update_by_jobs_config +versioned,versioned +versioning,versioning +versioningConfiguration,versioning_configuration +versions,versions +verticalGap,vertical_gap +veryLow,very_low +video,video +videoCapture,video_capture +videoEndpoint,video_endpoint +videoHeight,video_height +videoWidth,video_width +viewerCount,viewer_count +viewerId,viewer_id +viewerSessionVersionsLessThanOrEqualTo,viewer_session_versions_less_than_or_equal_to +viewerSessions,viewer_sessions +violationEventAdditionalInfo,violation_event_additional_info +violationEventOccurrenceRange,violation_event_occurrence_range +violationEventTime,violation_event_time +violationEventType,violation_event_type +violationEvents,violation_events +violationId,violation_id +violationIds,violation_ids +violationStartTime,violation_start_time +virtualCluster,virtual_cluster +virtualClusterId,virtual_cluster_id +virtualClusterIdentifier,virtual_cluster_identifier +virtualClusters,virtual_clusters +virtualGateway,virtual_gateway +virtualGatewayId,virtual_gateway_id +virtualGatewayName,virtual_gateway_name +virtualGatewayOwnerAccount,virtual_gateway_owner_account +virtualGatewayRegion,virtual_gateway_region +virtualGatewayState,virtual_gateway_state +virtualGateways,virtual_gateways +virtualInterface,virtual_interface +virtualInterfaceId,virtual_interface_id +virtualInterfaceName,virtual_interface_name +virtualInterfaceOwnerAccount,virtual_interface_owner_account +virtualInterfaceRegion,virtual_interface_region +virtualInterfaceState,virtual_interface_state +virtualInterfaceTest,virtual_interface_test +virtualInterfaceTestHistory,virtual_interface_test_history +virtualInterfaceType,virtual_interface_type +virtualInterfaces,virtual_interfaces +virtualName,virtual_name +virtualNode,virtual_node +virtualNodeName,virtual_node_name +virtualNodes,virtual_nodes +virtualRouter,virtual_router +virtualRouterName,virtual_router_name +virtualRouters,virtual_routers +virtualService,virtual_service +virtualServiceName,virtual_service_name +virtualServices,virtual_services +visibility,visibility +vlan,vlan +vmId,vm_id +vmImportTaskId,vm_import_task_id +vmManagerId,vm_manager_id +vmManagerName,vm_manager_name +vmManagerType,vm_manager_type +vmName,vm_name +vmPath,vm_path +vmServer,vm_server +vmServerAddress,vm_server_address +vmServerAddressList,vm_server_address_list +vmWareUuid,vm_ware_uuid +vnfConfigurableProperties,vnf_configurable_properties +vnfInstanceId,vnf_instance_id +vnfPkgId,vnf_pkg_id +vnfPkgIds,vnf_pkg_ids +vnfPkgName,vnf_pkg_name +vnfProductName,vnf_product_name +vnfProvider,vnf_provider +vnfState,vnf_state +vnfcResourceInfo,vnfc_resource_info +vnfd,vnfd +vnfdId,vnfd_id +vnfdVersion,vnfd_version +voiceId,voice_id +voiceSettings,voice_settings +volumeArn,volume_arn +volumeArns,volume_arns +volumeBaselineIOPS,volume_baseline_iops +volumeBaselineThroughput,volume_baseline_throughput +volumeBurstIOPS,volume_burst_iops +volumeBurstThroughput,volume_burst_throughput +volumeConfiguration,volume_configuration +volumeEncryptionKMSKey,volume_encryption_kms_key +volumeId,volume_id +volumeMounts,volume_mounts +volumeRecommendationOptions,volume_recommendation_options +volumeRecommendations,volume_recommendations +volumeRetentionMode,volume_retention_mode +volumeSize,volume_size +volumeSizeInGB,volume_size_in_gb +volumeSizeInGb,volume_size_in_gb +volumeToConversionMap,volume_to_conversion_map +volumeToVolumeSize,volume_to_volume_size +volumeType,volume_type +volumes,volumes +volumesFrom,volumes_from +voutIndex,vout_index +vpc,vpc +vpcConfig,vpc_config +vpcConfiguration,vpc_configuration +vpcDestinationSummary,vpc_destination_summary +vpcEndpoint,vpc_endpoint +vpcEndpointDetails,vpc_endpoint_details +vpcEndpointErrorDetails,vpc_endpoint_error_details +vpcEndpointFilters,vpc_endpoint_filters +vpcEndpointId,vpc_endpoint_id +vpcEndpointIds,vpc_endpoint_ids +vpcEndpointSummaries,vpc_endpoint_summaries +vpcEndpoints,vpc_endpoints +vpcID,vpc_id +vpcId,vpc_id +vpcIdentifier,vpc_identifier +vpcLinkId,vpc_link_id +vpcProperties,vpc_properties +vpcSecurityGroupId,vpc_security_group_id +vpcSecurityGroupIds,vpc_security_group_ids +vpcSecurityGroups,vpc_security_groups +vpceConfiguration,vpce_configuration +vpceConfigurationArns,vpce_configuration_arns +vpceConfigurationDescription,vpce_configuration_description +vpceConfigurationName,vpce_configuration_name +vpceConfigurations,vpce_configurations +vpceIds,vpce_ids +vpceServiceName,vpce_service_name +vss,vss +vulnerabilities,vulnerabilities +vulnerability,vulnerability +vulnerabilityId,vulnerability_id +vulnerabilityIdAggregation,vulnerability_id_aggregation +vulnerabilityIds,vulnerability_ids +vulnerabilitySource,vulnerability_source +vulnerabilitySourceUpdatedAt,vulnerability_source_updated_at +vulnerablePackages,vulnerable_packages +wafWebAclArn,waf_web_acl_arn +waitAndContinueSpecification,wait_and_continue_specification +waitTimeInMinutes,wait_time_in_minutes +waitTimeSeconds,wait_time_seconds +waited,waited +waitingForDataCollectionChecks,waiting_for_data_collection_checks +waitingResponse,waiting_response +warehouse,warehouse +warned,warned +warnings,warnings +waveAggregatedStatus,wave_aggregated_status +waveID,wave_id +waveIDs,wave_ids +waves,waves +wavesCount,waves_count +webAclArn,web_acl_arn +webUrl,web_url +webhook,webhook +webhookArn,webhook_arn +webhookId,webhook_id +webhookName,webhook_name +webhookUrl,webhook_url +webhooks,webhooks +weeklySchedule,weekly_schedule +weight,weight +weightFactor,weight_factor +weightedTargets,weighted_targets +weights,weights +welcomeMessages,welcome_messages +width,width +wifi,wifi +window,window +windows,windows +windowsMountDrive,windows_mount_drive +windowsUser,windows_user +witnessedAt,witnessed_at +workIds,work_ids +workbookCursor,workbook_cursor +workbookId,workbook_id +workerConfiguration,worker_configuration +workerConfigurationArn,worker_configuration_arn +workerConfigurations,worker_configurations +workerCount,worker_count +workerFleets,worker_fleets +workerGroup,worker_group +workerLogDelivery,worker_log_delivery +workerName,worker_name +workerTypeSpecifications,worker_type_specifications +workers,workers +workflowArn,workflow_arn +workflowBucket,workflow_bucket +workflowBuildVersionArn,workflow_build_version_arn +workflowExecution,workflow_execution +workflowExecutionCancelRequestedEventAttributes,workflow_execution_cancel_requested_event_attributes +workflowExecutionCanceledEventAttributes,workflow_execution_canceled_event_attributes +workflowExecutionCompletedEventAttributes,workflow_execution_completed_event_attributes +workflowExecutionContinuedAsNewEventAttributes,workflow_execution_continued_as_new_event_attributes +workflowExecutionFailedEventAttributes,workflow_execution_failed_event_attributes +workflowExecutionId,workflow_execution_id +workflowExecutionRetentionPeriodInDays,workflow_execution_retention_period_in_days +workflowExecutionSignaledEventAttributes,workflow_execution_signaled_event_attributes +workflowExecutionStartedEventAttributes,workflow_execution_started_event_attributes +workflowExecutionTerminatedEventAttributes,workflow_execution_terminated_event_attributes +workflowExecutionTimedOutEventAttributes,workflow_execution_timed_out_event_attributes +workflowExecutions,workflow_executions +workflowId,workflow_id +workflowInputs,workflow_inputs +workflowName,workflow_name +workflowStepAutomationConfiguration,workflow_step_automation_configuration +workflowStepGroupsSummary,workflow_step_groups_summary +workflowStepsSummary,workflow_steps_summary +workflowSummaries,workflow_summaries +workflowType,workflow_type +workflowTypeVersion,workflow_type_version +workgroup,workgroup +workgroupArn,workgroup_arn +workgroupId,workgroup_id +workgroupName,workgroup_name +workgroups,workgroups +workingDirectory,working_directory +workspace,workspace +workspaceDataSources,workspace_data_sources +workspaceDescription,workspace_description +workspaceId,workspace_id +workspaceName,workspace_name +workspaceNotificationDestinations,workspace_notification_destinations +workspaceOrganizationalUnits,workspace_organizational_units +workspaceRoleArn,workspace_role_arn +workspaceSummaries,workspace_summaries +workspaces,workspaces +world,world +worldConfigs,world_configs +worldCount,world_count +worldDescriptionBody,world_description_body +worldExportJobSummaries,world_export_job_summaries +worldGenerationJobSummaries,world_generation_job_summaries +worldSummaries,world_summaries +worldTags,world_tags +worlds,worlds +writeCapacityUnits,write_capacity_units +writeOperationType,write_operation_type +x,x +x509CertificateData,x509_certificate_data +x509Subject,x509_subject +xAmzErrorType,x_amz_error_type +xmlNamespace,xml_namespace +xrayEnabled,xray_enabled +xsltTemplateName,xslt_template_name +xsltTemplateNameForMacSec,xslt_template_name_for_mac_sec +y,y +year,year +z,z +zipUploadUrl,zip_upload_url +zonalShiftId,zonal_shift_id +zonalShifts,zonal_shifts +zoneName,zone_name diff --git a/codegen-server-test/build.gradle.kts b/codegen-server-test/build.gradle.kts index c4b2f00dbad..c0bd373b4ed 100644 --- a/codegen-server-test/build.gradle.kts +++ b/codegen-server-test/build.gradle.kts @@ -71,7 +71,7 @@ val allCodegenTests = "../codegen-core/common-test-models".let { commonModels -> "aws.protocoltests.restjson.validation#RestJsonValidation", "rest_json_validation", // `@range` trait is used on floating point shapes, which we deliberately don't want to support. - // See https://github.com/awslabs/smithy-rs/issues/1401. + // See https://github.com/smithy-lang/smithy-rs/issues/1401. extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """, ), CodegenTest("aws.protocoltests.json10#JsonRpc10", "json_rpc10"), @@ -98,13 +98,13 @@ val allCodegenTests = "../codegen-core/common-test-models".let { commonModels -> project.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests) project.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir) -project.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir)) +project.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile) tasks["smithyBuildJar"].dependsOn("generateSmithyBuild") tasks["assemble"].finalizedBy("generateCargoWorkspace", "generateCargoConfigToml") project.registerModifyMtimeTask() -project.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir), defaultRustDocFlags) +project.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile, defaultRustDocFlags) tasks["test"].finalizedBy(cargoCommands(properties).map { it.toString }) diff --git a/codegen-server-test/python/build.gradle.kts b/codegen-server-test/python/build.gradle.kts index 469e0e6bd7c..52f55a8dfe8 100644 --- a/codegen-server-test/python/build.gradle.kts +++ b/codegen-server-test/python/build.gradle.kts @@ -16,12 +16,13 @@ plugins { val smithyVersion: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) +val buildDir = layout.buildDirectory.get().asFile val pluginName = "rust-server-codegen-python" val workingDirUnderBuildDir = "smithyprojections/codegen-server-test-python/" configure { - outputDirectory = file("$buildDir/$workingDirUnderBuildDir") + outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile } buildscript { @@ -67,12 +68,12 @@ val allCodegenTests = "../../codegen-core/common-test-models".let { commonModels "rest_json_extras", imports = listOf("$commonModels/rest-json-extras.smithy"), ), - // TODO(https://github.com/awslabs/smithy-rs/issues/2477) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2477) // CodegenTest( // "aws.protocoltests.restjson.validation#RestJsonValidation", // "rest_json_validation", // // `@range` trait is used on floating point shapes, which we deliberately don't want to support. - // // See https://github.com/awslabs/smithy-rs/issues/1401. + // // See https://github.com/smithy-lang/smithy-rs/issues/1401. // extraConfig = """, "codegen": { "ignoreUnsupportedConstraints": true } """, // ), CodegenTest( @@ -111,7 +112,7 @@ tasks.register("stubs") { doLast { allCodegenTests.forEach { test -> - val crateDir = "$buildDir/$workingDirUnderBuildDir/${test.module}/$pluginName" + val crateDir = layout.buildDirectory.dir("$workingDirUnderBuildDir/${test.module}/$pluginName").get().asFile.path val moduleName = test.module.replace("-", "_") exec { commandLine("bash", "$crateDir/stubgen.sh", moduleName, "$crateDir/Cargo.toml", "$crateDir/python/$moduleName") diff --git a/codegen-server-test/typescript/build.gradle.kts b/codegen-server-test/typescript/build.gradle.kts index 8b65d53239b..6ccc03fb508 100644 --- a/codegen-server-test/typescript/build.gradle.kts +++ b/codegen-server-test/typescript/build.gradle.kts @@ -16,12 +16,13 @@ plugins { val smithyVersion: String by project val defaultRustDocFlags: String by project val properties = PropertyRetriever(rootProject, project) +val buildDir = layout.buildDirectory.get().asFile val pluginName = "rust-server-codegen-typescript" val workingDirUnderBuildDir = "smithyprojections/codegen-server-test-typescript/" configure { - outputDirectory = file("$buildDir/$workingDirUnderBuildDir") + outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile } buildscript { diff --git a/codegen-server-test/typescript/model/pokemon.smithy b/codegen-server-test/typescript/model/pokemon.smithy index 06e46906e71..7874a4f3225 100644 --- a/codegen-server-test/typescript/model/pokemon.smithy +++ b/codegen-server-test/typescript/model/pokemon.smithy @@ -1,4 +1,4 @@ -/// TODO(https://github.com/awslabs/smithy-rs/issues/1508) +/// TODO(https://github.com/smithy-lang/smithy-rs/issues/1508) /// reconcile this model with the main one living inside codegen-server-test/model/pokemon.smithy /// once the Typescript implementation supports Streaming and Union shapes. $version: "1.0" diff --git a/codegen-server/README.md b/codegen-server/README.md index 952ac21307d..1fbb21886ab 100644 --- a/codegen-server/README.md +++ b/codegen-server/README.md @@ -4,7 +4,7 @@ Server-side Smithy code generator ** This is a work in progress and generates serialization/de-serialization code that is probably unusable for the time being. ** -[Design documentation (WIP)](https://awslabs.github.io/smithy-rs/) +[Design documentation (WIP)](https://smithy-lang.github.io/smithy-rs/) ## Project Layout diff --git a/codegen-server/build.gradle.kts b/codegen-server/build.gradle.kts index f5b2f5bc29a..be9709471ed 100644 --- a/codegen-server/build.gradle.kts +++ b/codegen-server/build.gradle.kts @@ -85,5 +85,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-server/python/build.gradle.kts b/codegen-server/python/build.gradle.kts index ac792966a92..337d099bccb 100644 --- a/codegen-server/python/build.gradle.kts +++ b/codegen-server/python/build.gradle.kts @@ -85,5 +85,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt index 96ecbfe75cc..9b05d22434a 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt @@ -218,7 +218,7 @@ class PythonApplicationGenerator( } rustTemplate( """ - let mut service = #{tower}::util::BoxCloneService::new(builder.build().expect("one or more operations do not have a registered handler; this is a bug in the Python code generator, please file a bug report under https://github.com/awslabs/smithy-rs/issues")); + let mut service = #{tower}::util::BoxCloneService::new(builder.build().expect("one or more operations do not have a registered handler; this is a bug in the Python code generator, please file a bug report under https://github.com/smithy-lang/smithy-rs/issues")); { use #{tower}::Layer; diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt index 8594d703c11..d6d7c5bbf99 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt @@ -85,6 +85,7 @@ class PythonServerEventStreamWrapperGenerator( "MarshallMessage" to RuntimeType.smithyEventStream(runtimeConfig).resolve("frame::MarshallMessage"), "SignMessage" to RuntimeType.smithyEventStream(runtimeConfig).resolve("frame::SignMessage"), "MessageStreamAdapter" to RuntimeType.smithyHttp(runtimeConfig).resolve("event_stream::MessageStreamAdapter"), + "SdkError" to RuntimeType.sdkError(runtimeConfig), ) fun render(writer: RustWriter) { @@ -227,7 +228,7 @@ class PythonServerEventStreamWrapperGenerator( match next { Ok(Some(data)) => Ok(#{PyO3}::Python::with_gil(|py| #{PyO3}::IntoPy::into_py(data, py))), Ok(None) => Err(#{PyO3}::exceptions::PyStopAsyncIteration::new_err("stream exhausted")), - Err(#{SmithyHttp}::result::SdkError::ServiceError(service_err)) => Err(service_err.into_err().into()), + Err(#{SdkError}::ServiceError(service_err)) => Err(service_err.into_err().into()), Err(err) => Err(#{PyO3}::exceptions::PyRuntimeError::new_err(err.to_string())), } })?; diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt index 577999a7242..cbec0b8551c 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt @@ -237,7 +237,7 @@ class PythonServerModuleGenerator( // Render the codegeneration version as module attribute. private fun RustWriter.renderCodegenVersion() { - rust("""m.add("CODEGEN_VERSION", "${Version.crateVersion()}")?;""") + rust("""m.add("CODEGEN_VERSION", "${Version.stableCrateVersion()}")?;""") } // Convert to symbol and check the namespace to figure out where they should be imported from. diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt index d9ab006b0d5..53b82c2d293 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt @@ -54,7 +54,7 @@ class PythonServerOperationHandlerGenerator( val operationName = symbolProvider.toSymbol(operation).name val input = "crate::input::${operationName.toPascalCase()}Input" val output = "crate::output::${operationName.toPascalCase()}Output" - // TODO(https://github.com/awslabs/smithy-rs/issues/2552) - Use to pascalCase for error shapes. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2552) - Use to pascalCase for error shapes. val error = "crate::error::${operationName}Error" val fnName = RustReservedWords.escapeIfNeeded(symbolProvider.toSymbol(operation).name.toSnakeCase()) diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt index d9d2df8cc2f..9357383e6b2 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt @@ -40,7 +40,7 @@ class PythonServerStructureGenerator( private val codegenContext: ServerCodegenContext, private val writer: RustWriter, private val shape: StructureShape, -) : StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList()) { +) : StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList(), codegenContext.structSettings()) { private val symbolProvider = codegenContext.symbolProvider private val libName = codegenContext.settings.moduleName.toSnakeCase() diff --git a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt index f84d35e7cb7..dbfa9e029dc 100644 --- a/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt +++ b/codegen-server/python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt @@ -61,6 +61,7 @@ class PythonServerAfterDeserializedMemberServerHttpBoundCustomization() : is ServerHttpBoundProtocolSection.AfterTimestampDeserializedMember -> writable { rust(".into()") } + else -> emptySection } } @@ -78,6 +79,23 @@ class PythonServerAfterDeserializedMemberHttpBindingCustomization(private val ru } } +/** + * Customization class used to determine how serialized stream payload should be rendered for the Python server. + * + * In this customization, we do not need to wrap the payload in a new-type wrapper to enable the + * `futures_core::stream::Stream` trait since the payload in question has a type + * `aws_smithy_http_server_python::types::ByteStream` which already implements the `Stream` trait. + */ +class PythonServerStreamPayloadSerializerCustomization() : ServerHttpBoundProtocolCustomization() { + override fun section(section: ServerHttpBoundProtocolSection): Writable = when (section) { + is ServerHttpBoundProtocolSection.WrapStreamPayload -> writable { + section.params.payloadGenerator.generatePayload(this, section.params.shapeName, section.params.shape) + } + + else -> emptySection + } +} + class PythonServerProtocolLoader( private val supportedProtocols: ProtocolMap, ) : ProtocolLoader(supportedProtocols) { @@ -91,6 +109,7 @@ class PythonServerProtocolLoader( ), additionalServerHttpBoundProtocolCustomizations = listOf( PythonServerAfterDeserializedMemberServerHttpBoundCustomization(), + PythonServerStreamPayloadSerializerCustomization(), ), additionalHttpBindingCustomizations = listOf( PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig), @@ -103,6 +122,7 @@ class PythonServerProtocolLoader( ), additionalServerHttpBoundProtocolCustomizations = listOf( PythonServerAfterDeserializedMemberServerHttpBoundCustomization(), + PythonServerStreamPayloadSerializerCustomization(), ), additionalHttpBindingCustomizations = listOf( PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig), @@ -115,6 +135,7 @@ class PythonServerProtocolLoader( ), additionalServerHttpBoundProtocolCustomizations = listOf( PythonServerAfterDeserializedMemberServerHttpBoundCustomization(), + PythonServerStreamPayloadSerializerCustomization(), ), additionalHttpBindingCustomizations = listOf( PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig), diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt index 2c7b4f1fc5a..df933eb657d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt @@ -50,7 +50,7 @@ class ConstrainedShapeSymbolMetadataProvider( // We should _always_ be able to `#[derive(Debug)]`: all constrained shapes' types are simply tuple newtypes // wrapping a single type which always implements `Debug`. - // The wrapped type may not _derive_ `Debug` though, hence why this line is required; see https://github.com/awslabs/smithy-rs/issues/2582. + // The wrapped type may not _derive_ `Debug` though, hence why this line is required; see https://github.com/smithy-lang/smithy-rs/issues/2582. derives += RuntimeType.Debug val visibility = Visibility.publicIf(constrainedTypes, Visibility.PUBCRATE) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt index fb1a1acac7c..0dfda68d1eb 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt @@ -77,7 +77,7 @@ open class ConstrainedShapeSymbolProvider( override fun toSymbol(shape: Shape): Symbol { return when (shape) { is MemberShape -> { - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Member shapes can have constraint traits + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Member shapes can have constraint traits // (constraint trait precedence). val target = model.expectShape(shape.target) val targetSymbol = this.toSymbol(target) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt index 8152272a1c3..5d0313e132c 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt @@ -88,7 +88,7 @@ val supportedCollectionConstraintTraits = setOf( */ fun Shape.isDirectlyConstrained(symbolProvider: SymbolProvider): Boolean = when (this) { is StructureShape -> { - // TODO(https://github.com/awslabs/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): // The only reason why the functions in this file have // to take in a `SymbolProvider` is because non-`required` blob streaming members are interpreted as // `required`, so we can't use `member.isOptional` here. @@ -111,7 +111,7 @@ fun Shape.isTransitivelyButNotDirectlyConstrained(model: Model, symbolProvider: fun Shape.canReachConstrainedShape(model: Model, symbolProvider: SymbolProvider): Boolean = if (this is MemberShape) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Constraint traits on member shapes are not implemented + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not implemented // yet. Also, note that a walker over a member shape can, perhaps counterintuitively, reach the _containing_ shape, // so we can't simply delegate to the `else` branch when we implement them. this.targetCanReachConstrainedShape(model, symbolProvider) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProvider.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProvider.kt new file mode 100644 index 00000000000..74fc48ce5e0 --- /dev/null +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProvider.kt @@ -0,0 +1,26 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy + +import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.node.Node +import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.model.traits.AnnotationTrait +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider +import software.amazon.smithy.rust.codegen.core.util.getTrait + +class SyntheticCustomShapeTrait(val ID: ShapeId, val symbol: Symbol) : AnnotationTrait(ID, Node.objectNode()) + +/** + * This SymbolProvider honors [`SyntheticCustomShapeTrait`] and returns this trait's symbol when available. + */ +class CustomShapeSymbolProvider(private val base: RustSymbolProvider) : WrappingSymbolProvider(base) { + override fun toSymbol(shape: Shape): Symbol { + return shape.getTrait()?.symbol ?: base.toSymbol(shape) + } +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt index 7b54ff48b00..a26dff9e36c 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt @@ -42,7 +42,7 @@ class PatternTraitEscapedSpecialCharsValidator : AbstractValidator() { """ Non-escaped special characters used inside `@pattern`. You must escape them: `@pattern($replacement)`. - See https://github.com/awslabs/smithy-rs/issues/2508 for more details. + See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details. """.trimIndent() return error(shape, pattern, message) } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt index aa310ccc710..2672bbe9f3d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt @@ -93,5 +93,7 @@ class RustServerCodegenPlugin : ServerDecoratableBuildPlugin() { .let { RustReservedWordSymbolProvider(it, ServerReservedWords) } // Allows decorators to inject a custom symbol provider .let { codegenDecorator.symbolProvider(it) } + // Inject custom symbols. + .let { CustomShapeSymbolProvider(it) } } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt index 956a88ecf2a..779fcb16863 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt @@ -22,6 +22,7 @@ object ServerCargoDependency { val Nom: CargoDependency = CargoDependency("nom", CratesIo("7")) val OnceCell: CargoDependency = CargoDependency("once_cell", CratesIo("1.13")) val PinProjectLite: CargoDependency = CargoDependency("pin-project-lite", CratesIo("0.2")) + val ThisError: CargoDependency = CargoDependency("thiserror", CratesIo("1.0")) val Tower: CargoDependency = CargoDependency("tower", CratesIo("0.4")) val TokioDev: CargoDependency = CargoDependency("tokio", CratesIo("1.23.1"), scope = DependencyScope.Dev) val Regex: CargoDependency = CargoDependency("regex", CratesIo("1.5.5")) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt index d5c2a7084ad..d952a7771b0 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt @@ -12,6 +12,9 @@ import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator +import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderInstantiator +import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.returnSymbolToParseFn /** * [ServerCodegenContext] contains code-generation context that is _specific_ to the [RustServerCodegenPlugin] plugin @@ -35,4 +38,8 @@ data class ServerCodegenContext( val pubCrateConstrainedShapeSymbolProvider: PubCrateConstrainedShapeSymbolProvider, ) : CodegenContext( model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.SERVER, -) +) { + override fun builderInstantiator(): BuilderInstantiator { + return ServerBuilderInstantiator(symbolProvider, returnSymbolToParseFn(this)) + } +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt index 0c6d27f564b..9e9ce5c598d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt @@ -32,6 +32,7 @@ import software.amazon.smithy.model.traits.LengthTrait import software.amazon.smithy.model.transform.ModelTransformer import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.implBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings import software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker @@ -41,11 +42,12 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplGenerator +import software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory import software.amazon.smithy.rust.codegen.core.smithy.transformers.EventStreamNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.getTrait import software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember import software.amazon.smithy.rust.codegen.core.util.hasTrait @@ -73,10 +75,12 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerRootGe import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerRuntimeTypesReExportsGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerServiceGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerStructureConstrainedTraitImpl +import software.amazon.smithy.rust.codegen.server.smithy.generators.ServiceConfigGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedCollectionGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedMapGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedUnionGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator +import software.amazon.smithy.rust.codegen.server.smithy.generators.isBuilderFallible import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolTestGenerator @@ -237,11 +241,14 @@ open class ServerCodegenVisitor( validateUnsupportedConstraints(model, service, codegenContext.settings.codegenConfig), )) { for (logMessage in validationResult.messages) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1756): These are getting duplicated. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1756): These are getting duplicated. logger.log(logMessage.level, logMessage.message) } if (validationResult.shouldAbort) { - throw CodegenException("Unsupported constraints feature used; see error messages above for resolution", validationResult) + throw CodegenException( + "Unsupported constraints feature used; see error messages above for resolution", + validationResult, + ) } } @@ -258,7 +265,7 @@ open class ServerCodegenVisitor( model, codegenDecorator.crateManifestCustomizations(codegenContext), codegenDecorator.libRsCustomizations(codegenContext, listOf()), - // TODO(https://github.com/awslabs/smithy-rs/issues/1287): Remove once the server codegen is far enough along. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1287): Remove once the server codegen is far enough along. requireDocs = false, ) try { @@ -266,7 +273,7 @@ open class ServerCodegenVisitor( fileManifest.baseDir, timeout = settings.codegenConfig.formatTimeoutSeconds.toLong(), ) - } catch (err: CommandFailed) { + } catch (err: CommandError) { logger.info( "[rust-server-codegen] Failed to run cargo fmt: [${service.id}]\n${err.output}", ) @@ -294,6 +301,7 @@ open class ServerCodegenVisitor( this, shape, codegenDecorator.structureCustomizations(codegenContext, emptyList()), + structSettings = codegenContext.structSettings(), ).render() shape.getTrait()?.also { errorTrait -> @@ -325,7 +333,8 @@ open class ServerCodegenVisitor( serverBuilderGenerator.render(rustCrate, writer) if (codegenContext.settings.codegenConfig.publicConstrainedTypes) { - writer.implBlock(codegenContext.symbolProvider.toSymbol(shape)) { + val lifetimes = shape.lifetimeDeclaration(codegenContext.symbolProvider) + writer.rustBlock("impl $lifetimes ${codegenContext.symbolProvider.toSymbol(shape).name} $lifetimes") { serverBuilderGenerator.renderConvenienceMethod(this) } } @@ -369,7 +378,11 @@ open class ServerCodegenVisitor( if (renderUnconstrainedList) { logger.info("[rust-server-codegen] Generating an unconstrained type for collection shape $shape") - rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.UnconstrainedModule, shape, codegenContext) { + rustCrate.withModuleOrWithStructureBuilderModule( + ServerRustModule.UnconstrainedModule, + shape, + codegenContext, + ) { UnconstrainedCollectionGenerator( codegenContext, rustCrate.createInlineModuleCreator(), @@ -379,7 +392,11 @@ open class ServerCodegenVisitor( if (!isDirectlyConstrained) { logger.info("[rust-server-codegen] Generating a constrained type for collection shape $shape") - rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.ConstrainedModule, shape, codegenContext) { + rustCrate.withModuleOrWithStructureBuilderModule( + ServerRustModule.ConstrainedModule, + shape, + codegenContext, + ) { PubCrateConstrainedCollectionGenerator( codegenContext, rustCrate.createInlineModuleCreator(), @@ -424,7 +441,11 @@ open class ServerCodegenVisitor( if (renderUnconstrainedMap) { logger.info("[rust-server-codegen] Generating an unconstrained type for map $shape") - rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.UnconstrainedModule, shape, codegenContext) { + rustCrate.withModuleOrWithStructureBuilderModule( + ServerRustModule.UnconstrainedModule, + shape, + codegenContext, + ) { UnconstrainedMapGenerator( codegenContext, rustCrate.createInlineModuleCreator(), @@ -434,7 +455,11 @@ open class ServerCodegenVisitor( if (!isDirectlyConstrained) { logger.info("[rust-server-codegen] Generating a constrained type for map $shape") - rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.ConstrainedModule, shape, codegenContext) { + rustCrate.withModuleOrWithStructureBuilderModule( + ServerRustModule.ConstrainedModule, + shape, + codegenContext, + ) { PubCrateConstrainedMapGenerator( codegenContext, rustCrate.createInlineModuleCreator(), @@ -572,7 +597,9 @@ open class ServerCodegenVisitor( */ open fun protocolTests() { rustCrate.withModule(ServerRustModule.Operation) { - ServerProtocolTestGenerator(codegenContext, protocolGeneratorFactory.support(), protocolGenerator).render(this) + ServerProtocolTestGenerator(codegenContext, protocolGeneratorFactory.support(), protocolGenerator).render( + this, + ) } } @@ -589,31 +616,41 @@ open class ServerCodegenVisitor( logger.info("[rust-server-codegen] Generating a service $shape") val serverProtocol = protocolGeneratorFactory.protocol(codegenContext) as ServerProtocol - // Generate root + val configMethods = codegenDecorator.configMethods(codegenContext) + val isConfigBuilderFallible = configMethods.isBuilderFallible() + + // Generate root. rustCrate.lib { ServerRootGenerator( serverProtocol, codegenContext, + isConfigBuilderFallible, ).render(this) } - // Generate server re-exports + // Generate server re-exports. rustCrate.withModule(ServerRustModule.Server) { ServerRuntimeTypesReExportsGenerator(codegenContext).render(this) } - // Generate protocol tests + // Generate protocol tests. protocolTests() - // Generate service module + // Generate service module. rustCrate.withModule(ServerRustModule.Service) { ServerServiceGenerator( codegenContext, serverProtocol, + isConfigBuilderFallible, ).render(this) + ServiceConfigGenerator(codegenContext, configMethods).render(this) + ScopeMacroGenerator(codegenContext).render(this) } + + codegenDecorator.postprocessServiceGenerateAdditionalStructures(shape) + .forEach { structureShape -> this.structureShape(structureShape) } } /** @@ -621,6 +658,7 @@ open class ServerCodegenVisitor( * - Operations ser/de * - Errors via `ServerOperationErrorGenerator` * - OperationShapes via `ServerOperationGenerator` + * - Additional structure shapes via `postprocessGenerateAdditionalStructures` */ override fun operationShape(shape: OperationShape) { // Generate errors. @@ -637,6 +675,9 @@ open class ServerCodegenVisitor( rustCrate.withModule(ServerRustModule.Operation) { protocolGenerator.renderOperation(this, shape) } + + codegenDecorator.postprocessOperationGenerateAdditionalStructures(shape) + .forEach { structureShape -> this.structureShape(structureShape) } } override fun blobShape(shape: BlobShape) { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt index 67fbea91cd6..7b0ba87e611 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt @@ -86,7 +86,7 @@ data class ServerCodegenConfig( /** * A flag to enable _experimental_ support for custom validation exceptions via the * [CustomValidationExceptionWithReasonDecorator] decorator. - * TODO(https://github.com/awslabs/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be + * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be * able to define the converters in their Rust application code. */ val experimentalCustomValidationExceptionWithReasonPleaseDoNotUse: String? = defaultExperimentalCustomValidationExceptionWithReasonPleaseDoNotUse, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt index 711f35e462f..488c9347a20 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt @@ -171,7 +171,7 @@ class UnconstrainedShapeSymbolProvider( } else { base.toSymbol(shape) } - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Constraint traits on member shapes are not + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not // implemented yet. } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt index 192facc2ba3..abee410b5b0 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt @@ -34,7 +34,7 @@ import software.amazon.smithy.rust.codegen.core.util.orNull import java.util.logging.Level private sealed class UnsupportedConstraintMessageKind { - private val constraintTraitsUberIssue = "https://github.com/awslabs/smithy-rs/issues/1401" + private val constraintTraitsUberIssue = "https://github.com/smithy-lang/smithy-rs/issues/1401" fun intoLogMessage(ignoreUnsupportedConstraints: Boolean): LogMessage { fun buildMessage(intro: String, willSupport: Boolean, trackingIssue: String? = null, canBeIgnored: Boolean = true): String { @@ -61,10 +61,11 @@ private sealed class UnsupportedConstraintMessageKind { shape: Shape, constraintTrait: Trait, trackingIssue: String, + willSupport: Boolean = true, ) = buildMessage( "The ${shape.type} shape `${shape.id}` has the constraint trait `${constraintTrait.toShapeId()}` attached.", - willSupport = true, + willSupport, trackingIssue, ) @@ -104,7 +105,12 @@ private sealed class UnsupportedConstraintMessageKind { is UnsupportedRangeTraitOnShape -> LogMessage( level, - buildMessageShapeHasUnsupportedConstraintTrait(shape, rangeTrait, constraintTraitsUberIssue), + buildMessageShapeHasUnsupportedConstraintTrait( + shape, + rangeTrait, + willSupport = false, + trackingIssue = "https://github.com/smithy-lang/smithy-rs/issues/2007", + ), ) is UnsupportedUniqueItemsTraitOnShape -> LogMessage( @@ -166,8 +172,8 @@ fun validateOperationsWithConstrainedInputHaveValidationExceptionAttached( validationExceptionShapeId: ShapeId, ): ValidationResult { // Traverse the model and error out if an operation uses constrained input, but it does not have - // `ValidationException` attached in `errors`. https://github.com/awslabs/smithy-rs/pull/1199#discussion_r809424783 - // TODO(https://github.com/awslabs/smithy-rs/issues/1401): This check will go away once we add support for + // `ValidationException` attached in `errors`. https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783 + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This check will go away once we add support for // `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors. val walker = DirectedWalker(model) val operationsWithConstrainedInputWithoutValidationExceptionSet = walker.walkShapes(service) @@ -250,7 +256,7 @@ fun validateUnsupportedConstraints( unsupportedConstraintOnNonErrorShapeReachableViaAnEventStreamSet + unsupportedConstraintErrorShapeReachableViaAnEventStreamSet // 3. Range trait used on unsupported shapes. - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2007) val unsupportedRangeTraitOnShapeSet = walker .walkShapes(service) .asSequence() diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt index 9a0778b41a2..b2b2aa0b992 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt @@ -44,7 +44,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage * The shape definition is in [CustomValidationExceptionWithReasonDecoratorTest]. * * This is just an example to showcase experimental support for custom validation exceptions. - * TODO(https://github.com/awslabs/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be + * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be * able to define the converters in their Rust application code. */ class CustomValidationExceptionWithReasonDecorator : ServerCodegenDecorator { @@ -80,7 +80,7 @@ class ValidationExceptionWithReasonConversionGenerator(private val codegenContex }; Self::ConstraintViolation( crate::protocol_serde::shape_validation_exception::ser_validation_exception_error(&validation_exception) - .expect("validation exceptions should never fail to serialize; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("validation exceptions should never fail to serialize; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt index ceba38691bf..7823c53326d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt @@ -6,10 +6,11 @@ package software.amazon.smithy.rust.codegen.server.smithy.customizations import software.amazon.smithy.rust.codegen.core.rustlang.Feature +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.customizations.AllowLintsCustomization import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization -import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyErrorTypes import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext @@ -34,12 +35,26 @@ class ServerRequiredCustomizations : ServerCodegenDecorator { baseCustomizations + AllowLintsCustomization() override fun extras(codegenContext: ServerCodegenContext, rustCrate: RustCrate) { + val rc = codegenContext.runtimeConfig + // Add rt-tokio feature for `ByteStream::from_path` - rustCrate.mergeFeature(Feature("rt-tokio", true, listOf("aws-smithy-http/rt-tokio"))) + rustCrate.mergeFeature( + Feature( + "rt-tokio", + true, + listOf("aws-smithy-types/rt-tokio"), + ), + ) rustCrate.withModule(ServerRustModule.Types) { - pubUseSmithyPrimitives(codegenContext, codegenContext.model)(this) - pubUseSmithyErrorTypes(codegenContext)(this) + pubUseSmithyPrimitives(codegenContext, codegenContext.model, rustCrate)(this) + rustTemplate( + """ + pub use #{DisplayErrorContext}; + """, + "Response" to RuntimeType.smithyHttp(rc).resolve("operation::Response"), + "DisplayErrorContext" to RuntimeType.smithyTypes(rc).resolve("error::display::DisplayErrorContext"), + ) } rustCrate.withModule(ServerRustModule.root) { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt index e30c537c7c2..f9124f7f778 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt @@ -44,7 +44,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage * * [0]: https://github.com/awslabs/smithy/tree/main/smithy-validation-model * - * TODO(https://github.com/awslabs/smithy-rs/pull/2053): once the RFC is implemented, consider moving this back into the + * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): once the RFC is implemented, consider moving this back into the * generators. */ class SmithyValidationExceptionDecorator : ServerCodegenDecorator { @@ -78,7 +78,7 @@ class SmithyValidationExceptionConversionGenerator(private val codegenContext: S }; Self::ConstraintViolation( crate::protocol_serde::shape_validation_exception::ser_validation_exception_error(&validation_exception) - .expect("validation exceptions should never fail to serialize; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("validation exceptions should never fail to serialize; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt index 2522024efcb..22df729e5ae 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt @@ -6,13 +6,17 @@ package software.amazon.smithy.rust.codegen.server.smithy.customize import software.amazon.smithy.build.PluginContext +import software.amazon.smithy.model.shapes.OperationShape +import software.amazon.smithy.model.shapes.ServiceShape import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.smithy.customize.CombinedCoreCodegenDecorator import software.amazon.smithy.rust.codegen.core.smithy.customize.CoreCodegenDecorator import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext import software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings import software.amazon.smithy.rust.codegen.server.smithy.ValidationResult +import software.amazon.smithy.rust.codegen.server.smithy.generators.ConfigMethod import software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator import java.util.logging.Logger @@ -31,6 +35,28 @@ interface ServerCodegenDecorator : CoreCodegenDecorator = emptyList() + + /** + * For each service, this hook allows decorators to return a collection of structure shapes that will additionally be generated. + * If a structure shape is in the service's closure, note that returning it here will cause for it to be generated more than once, + * making the resulting crate not compile (since it will contain more than one struct with the same name). + * Therefore, ensure that all the structure shapes returned by this method are not in the service's closure. + */ + fun postprocessServiceGenerateAdditionalStructures(serviceShape: ServiceShape): List = emptyList() + + /** + * Configuration methods that should be injected into the `${serviceName}Config` struct to allow users to configure + * pre-applied layers and plugins. + */ + fun configMethods(codegenContext: ServerCodegenContext): List = emptyList() } /** @@ -38,7 +64,7 @@ interface ServerCodegenDecorator : CoreCodegenDecorator) : +class CombinedServerCodegenDecorator(decorators: List) : CombinedCoreCodegenDecorator(decorators), ServerCodegenDecorator { @@ -64,6 +90,15 @@ class CombinedServerCodegenDecorator(private val decorators: List = + orderedDecorators.flatMap { it.postprocessOperationGenerateAdditionalStructures(operationShape) } + + override fun postprocessServiceGenerateAdditionalStructures(serviceShape: ServiceShape): List = + orderedDecorators.flatMap { it.postprocessServiceGenerateAdditionalStructures(serviceShape) } + + override fun configMethods(codegenContext: ServerCodegenContext): List = + orderedDecorators.flatMap { it.configMethods(codegenContext) } + companion object { fun fromClasspath( context: PluginContext, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt index b04eaa2f93b..77ebf832ee2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt @@ -69,7 +69,7 @@ class CollectionConstraintViolationGenerator( } } - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) We should really have two `ConstraintViolation` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) We should really have two `ConstraintViolation` // types here. One will just have variants for each constraint trait on the collection shape, for use by the user. // The other one will have variants if the shape's member is directly or transitively constrained, // and is for use by the framework. diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt index 3e61ab6804f..7ab164b39bf 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt @@ -285,7 +285,7 @@ data class Pattern(val symbol: Symbol, val patternTrait: PatternTrait, val isSen private fun renderValidationFunction(constraintViolation: Symbol, unconstrainedTypeName: String): Writable { val pattern = patternTrait.pattern val errorMessageForUnsupportedRegex = - """The regular expression $pattern is not supported by the `regex` crate; feel free to file an issue under https://github.com/awslabs/smithy-rs/issues for support""" + """The regular expression $pattern is not supported by the `regex` crate; feel free to file an issue under https://github.com/smithy-lang/smithy-rs/issues for support""" return { rustTemplate( diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt index 4c1025a0d2a..38917b14776 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt @@ -70,7 +70,7 @@ class MapConstraintViolationGenerator( } inlineModuleCreator(constraintViolationSymbol) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) We should really have two `ConstraintViolation` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) We should really have two `ConstraintViolation` // types here. One will just have variants for each constraint trait on the map shape, for use by the user. // The other one will have variants if the shape's key or value is directly or transitively constrained, // and is for use by the framework. diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt index 1a563c25b98..016da351773 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt @@ -34,7 +34,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.typeNameContainsNonPubl * traits' enforcement, this type is converted into the regular `Vec` the user * sees via the generated converters. * - * TODO(https://github.com/awslabs/smithy-rs/issues/1401) If the collection + * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) If the collection * shape is _directly_ constrained, use [ConstrainedCollectionGenerator] * instead. */ diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt index bb31a55d262..7c3acff6ab2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt @@ -11,7 +11,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.util.toPascalCase -import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext @@ -60,7 +59,7 @@ class ScopeMacroGenerator( }; """ } - val crateName = codegenContext.moduleName.toSnakeCase() + val crateName = codegenContext.moduleUseName() // If we have a second operation we can perform further checks val otherOperationName: String? = operations.toList().getOrNull(1)?.let { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt index 1ecb71d8785..d91176c0f8f 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt @@ -102,7 +102,7 @@ class ServerBuilderConstraintViolations( */ fun forMember(member: MemberShape): ConstraintViolation? { check(members.contains(member)) - // TODO(https://github.com/awslabs/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above. return if (symbolProvider.toSymbol(member).isOptional() || member.hasNonNullDefault()) { null } else { @@ -110,7 +110,7 @@ class ServerBuilderConstraintViolations( } } - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) This impl does not take into account the `sensitive` trait. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) This impl does not take into account the `sensitive` trait. // When constraint violation error messages are adjusted to match protocol tests, we should ensure it's honored. private fun renderImplDisplayConstraintViolation(writer: RustWriter) { writer.rustBlock("impl #T for ConstraintViolation", RuntimeType.Display) { @@ -210,7 +210,7 @@ data class ConstraintViolation(val forMember: MemberShape, val kind: ConstraintV val structureSymbol = symbolProvider.toSymbol(model.expectShape(forMember.container)) return when (kind) { ConstraintViolationKind.MISSING_MEMBER -> "`$memberName` was not provided but it is required when building `${structureSymbol.name}`" - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Nest errors. Adjust message following protocol tests. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Nest errors. Adjust message following protocol tests. ConstraintViolationKind.CONSTRAINED_SHAPE_FAILURE -> "constraint violation occurred building member `$memberName` when building `${structureSymbol.name}`" } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt index e35f2389bb2..b8c74b9c5c1 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt @@ -31,6 +31,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata +import software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed import software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained @@ -147,6 +148,7 @@ class ServerBuilderGenerator( private val isBuilderFallible = hasFallibleBuilder(shape, model, symbolProvider, takeInUnconstrainedTypes) private val serverBuilderConstraintViolations = ServerBuilderConstraintViolations(codegenContext, shape, takeInUnconstrainedTypes, customValidationExceptionWithReasonConversionGenerator) + private val lifetime = shape.lifetimeDeclaration(symbolProvider) private val codegenScope = arrayOf( "RequestRejection" to protocol.requestRejection(codegenContext.runtimeConfig), @@ -196,11 +198,11 @@ class ServerBuilderGenerator( it == RuntimeType.Debug || it == RuntimeType.Clone } + RuntimeType.Default Attribute(derive(builderDerives)).render(writer) - writer.rustBlock("${visibility.toRustQualifier()} struct Builder") { + writer.rustBlock("${visibility.toRustQualifier()} struct Builder$lifetime") { members.forEach { renderBuilderMember(this, it) } } - writer.rustBlock("impl Builder") { + writer.rustBlock("impl $lifetime Builder $lifetime") { for (member in members) { if (publicConstrainedTypes) { renderBuilderMemberFn(this, member) @@ -262,7 +264,7 @@ class ServerBuilderGenerator( self.build_enforcing_all_constraints() } """, - "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol), + "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime), ) renderBuildEnforcingAllConstraintsFn(implBlockWriter) } @@ -270,7 +272,7 @@ class ServerBuilderGenerator( private fun renderBuildEnforcingAllConstraintsFn(implBlockWriter: RustWriter) { implBlockWriter.rustBlockTemplate( "fn build_enforcing_all_constraints(self) -> #{ReturnType:W}", - "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol), + "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime), ) { conditionalBlock("Ok(", ")", conditional = isBuilderFallible) { coreBuilder(this) @@ -280,7 +282,7 @@ class ServerBuilderGenerator( fun renderConvenienceMethod(implBlock: RustWriter) { implBlock.docs("Creates a new builder-style object to manufacture #D.", structureSymbol) - implBlock.rustBlock("pub fn builder() -> #T", builderSymbol) { + implBlock.rustBlock("pub fn builder() -> #T $lifetime", builderSymbol) { write("#T::default()", builderSymbol) } } @@ -383,7 +385,7 @@ class ServerBuilderGenerator( val builderMemberSymbol = builderMemberSymbol(member) val inputType = builderMemberSymbol.rustType().stripOuter().implInto() .letIf( - // TODO(https://github.com/awslabs/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): // The only reason why this condition can't simply be `member.isOptional` // is because non-`required` blob streaming members are interpreted as // `required`, so we can't use `member.isOptional` here. @@ -397,7 +399,7 @@ class ServerBuilderGenerator( rust( """ self.$memberName = ${ - // TODO(https://github.com/awslabs/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above. if (symbolProvider.toSymbol(member).isOptional()) { "input.map(|v| v.into())" } else { @@ -413,10 +415,10 @@ class ServerBuilderGenerator( private fun renderTryFromBuilderImpl(writer: RustWriter) { writer.rustTemplate( """ - impl #{TryFrom} for #{Structure} { + impl #{TryFrom} for #{Structure}$lifetime { type Error = ConstraintViolation; - fn try_from(builder: Builder) -> Result { + fn try_from(builder: Builder $lifetime) -> Result { builder.build() } } @@ -428,7 +430,7 @@ class ServerBuilderGenerator( private fun renderFromBuilderImpl(writer: RustWriter) { writer.rustTemplate( """ - impl #{From} for #{Structure} { + impl #{From} for #{Structure} $lifetime { fn from(builder: Builder) -> Self { builder.build() } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt index 389f0dc173e..4912d9eb314 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt @@ -57,11 +57,11 @@ import software.amazon.smithy.rust.codegen.server.smithy.hasPublicConstrainedWra /** * Returns a writable to render the return type of the server builders' `build()` method. */ -fun buildFnReturnType(isBuilderFallible: Boolean, structureSymbol: Symbol) = writable { +fun buildFnReturnType(isBuilderFallible: Boolean, structureSymbol: Symbol, lifetime: String) = writable { if (isBuilderFallible) { - rust("Result<#T, ConstraintViolation>", structureSymbol) + rust("Result<#T $lifetime, ConstraintViolation>", structureSymbol) } else { - rust("#T", structureSymbol) + rust("#T $lifetime", structureSymbol) } } @@ -84,7 +84,7 @@ fun generateFallbackCodeToDefaultValue( if (member.isStreaming(model)) { writer.rust(".unwrap_or_default()") } else if (targetShape.hasPublicConstrainedWrapperTupleType(model, publicConstrainedTypes)) { - // TODO(https://github.com/awslabs/smithy-rs/issues/2134): Instead of panicking here, which will ungracefully + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2134): Instead of panicking here, which will ungracefully // shut down the service, perform the `try_into()` check _once_ at service startup time, perhaps // storing the result in a `OnceCell` that could be reused. writer.rustTemplate( @@ -92,7 +92,7 @@ fun generateFallbackCodeToDefaultValue( .unwrap_or_else(|| #{DefaultValue:W} .try_into() - .expect("this check should have failed at generation time; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("this check should have failed at generation time; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") ) """, "DefaultValue" to defaultValue, @@ -125,7 +125,7 @@ fun defaultValue( val types = ServerCargoDependency.smithyTypes(runtimeConfig).toType() // Define the exception once for DRYness. val unsupportedDefaultValueException = - CodegenException("Default value $node for member shape ${member.id} is unsupported or cannot exist; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + CodegenException("Default value $node for member shape ${member.id} is unsupported or cannot exist; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") when (val target = model.expectShape(member.target)) { is EnumShape, is IntEnumShape -> { val value = when (target) { @@ -169,7 +169,7 @@ fun defaultValue( rustTemplate( """ #{SmithyTypes}::DateTime::from_str("$value", #{SmithyTypes}::date_time::Format::DateTime) - .expect("default value `$value` cannot be parsed into a valid date time; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("default value `$value` cannot be parsed into a valid date time; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") """, "SmithyTypes" to types, ) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt index 013034921b5..7589a761c08 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt @@ -25,6 +25,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.withBlock import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata +import software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.makeOptional import software.amazon.smithy.rust.codegen.core.smithy.module @@ -84,6 +85,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( private val isBuilderFallible = hasFallibleBuilder(shape, symbolProvider) private val serverBuilderConstraintViolations = ServerBuilderConstraintViolations(codegenContext, shape, builderTakesInUnconstrainedTypes = false, validationExceptionConversionGenerator) + private val lifetime = shape.lifetimeDeclaration(symbolProvider) private val codegenScope = arrayOf( "RequestRejection" to protocol.requestRejection(codegenContext.runtimeConfig), @@ -152,7 +154,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( self.build_enforcing_required_and_enum_traits() } """, - "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol), + "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime), ) renderBuildEnforcingRequiredAndEnumTraitsFn(implBlockWriter) } @@ -160,7 +162,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( private fun renderBuildEnforcingRequiredAndEnumTraitsFn(implBlockWriter: RustWriter) { implBlockWriter.rustBlockTemplate( "fn build_enforcing_required_and_enum_traits(self) -> #{ReturnType:W}", - "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol), + "ReturnType" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime), ) { conditionalBlock("Ok(", ")", conditional = isBuilderFallible) { coreBuilder(this) @@ -199,7 +201,7 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( fun renderConvenienceMethod(implBlock: RustWriter) { implBlock.docs("Creates a new builder-style object to manufacture #D.", structureSymbol) - implBlock.rustBlock("pub fn builder() -> #T", builderSymbol) { + implBlock.rustBlock("pub fn builder() -> #T $lifetime", builderSymbol) { write("#T::default()", builderSymbol) } } @@ -237,10 +239,10 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( private fun renderTryFromBuilderImpl(writer: RustWriter) { writer.rustTemplate( """ - impl #{TryFrom} for #{Structure} { + impl #{TryFrom} for #{Structure}$lifetime { type Error = ConstraintViolation; - fn try_from(builder: Builder) -> Result { + fn try_from(builder: Builder $lifetime) -> Result { builder.build() } } @@ -252,8 +254,8 @@ class ServerBuilderGeneratorWithoutPublicConstrainedTypes( private fun renderFromBuilderImpl(writer: RustWriter) { writer.rustTemplate( """ - impl #{From} for #{Structure} { - fn from(builder: Builder) -> Self { + impl #{From} for #{Structure}$lifetime { + fn from(builder: Builder $lifetime) -> Self { builder.build() } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt index 64d35e0a8fc..f0ca507db16 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt @@ -16,14 +16,14 @@ import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext -// TODO(https://github.com/awslabs/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder` +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder` fun StructureShape.serverBuilderSymbol(codegenContext: ServerCodegenContext): Symbol = this.serverBuilderSymbol( codegenContext.symbolProvider, !codegenContext.settings.codegenConfig.publicConstrainedTypes, ) -// TODO(https://github.com/awslabs/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.moduleForBuilder` +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.moduleForBuilder` fun StructureShape.serverBuilderModule(symbolProvider: SymbolProvider, pubCrate: Boolean): RustModule.LeafModule { val structureSymbol = symbolProvider.toSymbol(this) val builderNamespace = RustReservedWords.escapeIfNeeded(structureSymbol.name.toSnakeCase()) + @@ -45,7 +45,7 @@ fun StructureShape.serverBuilderModule(symbolProvider: SymbolProvider, pubCrate: ) } -// TODO(https://github.com/awslabs/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder` +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder` fun StructureShape.serverBuilderSymbol(symbolProvider: SymbolProvider, pubCrate: Boolean): Symbol { val builderModule = serverBuilderModule(symbolProvider, pubCrate) val rustType = RustType.Opaque("Builder", builderModule.fullyQualifiedPath()) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt index 0163f094f5f..0347013de5c 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt @@ -314,7 +314,7 @@ data class MakeFmt( * These closures are provided to `RequestFmt` and `ResponseFmt` constructors, which in turn are provided to * `InstrumentedOperation` to configure logging. These structures can be found in `aws_smithy_http_server::instrumentation`. * - * See [Logging in the Presence of Sensitive Data](https://github.com/awslabs/smithy-rs/blob/main/design/src/rfcs/rfc0018_logging_sensitive.md) + * See [Logging in the Presence of Sensitive Data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/rfcs/rfc0018_logging_sensitive.md) * for more details. */ class ServerHttpSensitivityGenerator( diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt index 3d3105f9c70..fade448863b 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt @@ -5,33 +5,25 @@ package software.amazon.smithy.rust.codegen.server.smithy.generators -import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext +import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.InstantiatorCustomization import software.amazon.smithy.rust.codegen.core.smithy.generators.InstantiatorSection import software.amazon.smithy.rust.codegen.core.smithy.isOptional +import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.ReturnSymbolToParse import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext import software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained import software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput -/** - * Server enums do not have an `Unknown` variant like client enums do, so constructing an enum from - * a string is a fallible operation (hence `try_from`). It's ok to panic here if construction fails, - * since this is only used in protocol tests. - */ -private fun enumFromStringFn(enumSymbol: Symbol, data: String): Writable = writable { - rust( - """#T::try_from($data).expect("this is only used in tests")""", - enumSymbol, - ) -} - class ServerAfterInstantiatingValueConstrainItIfNecessary(val codegenContext: CodegenContext) : InstantiatorCustomization() { @@ -76,13 +68,48 @@ class ServerBuilderKindBehavior(val codegenContext: CodegenContext) : Instantiat codegenContext.symbolProvider.toSymbol(memberShape).isOptional() } -fun serverInstantiator(codegenContext: CodegenContext) = +class ServerInstantiator(codegenContext: CodegenContext, customWritable: CustomWritable = NoCustomWritable()) : Instantiator( codegenContext.symbolProvider, codegenContext.model, codegenContext.runtimeConfig, ServerBuilderKindBehavior(codegenContext), - ::enumFromStringFn, defaultsForRequiredFields = true, customizations = listOf(ServerAfterInstantiatingValueConstrainItIfNecessary(codegenContext)), + constructPattern = InstantiatorConstructPattern.DIRECT, + customWritable = customWritable, ) + +class ServerBuilderInstantiator( + private val symbolProvider: RustSymbolProvider, + private val symbolParseFn: (Shape) -> ReturnSymbolToParse, +) : BuilderInstantiator { + override fun setField(builder: String, value: Writable, field: MemberShape): Writable { + // Server builders have the ability to have non-optional fields. When one of these fields is used, + // we need to use `if let(...)` to only set the field when it is present. + return if (!symbolProvider.toSymbol(field).isOptional()) { + writable { + val n = safeName() + rustTemplate( + """ + if let Some($n) = #{value} { + #{setter} + } + """, + "value" to value, "setter" to setFieldWithSetter(builder, writable(n), field), + ) + } + } else { + setFieldWithSetter(builder, value, field) + } + } + + override fun finalizeBuilder(builder: String, shape: StructureShape, mapErr: Writable?): Writable = writable { + val returnSymbolToParse = symbolParseFn(shape) + if (returnSymbolToParse.isUnconstrained) { + rust(builder) + } else { + rust("$builder.build()") + } + } +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt index c8c1dd8450a..63f55954da2 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt @@ -31,6 +31,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Output open class ServerRootGenerator( val protocol: ServerProtocol, private val codegenContext: ServerCodegenContext, + private val isConfigBuilderFallible: Boolean, ) { private val index = TopDownIndex.of(codegenContext.model) private val operations = index.getContainedOperations(codegenContext.serviceShape).toSortedSet( @@ -57,6 +58,8 @@ open class ServerRootGenerator( } .join("//!\n") + val unwrapConfigBuilder = if (isConfigBuilderFallible) ".expect(\"config failed to build\")" else "" + writer.rustTemplate( """ //! A fast and customizable Rust implementation of the $serviceName Smithy service. @@ -73,9 +76,12 @@ open class ServerRootGenerator( //! ```rust,no_run //! ## use std::net::SocketAddr; //! ## async fn dummy() { - //! use $crateName::$serviceName; + //! use $crateName::{$serviceName, ${serviceName}Config}; //! - //! ## let app = $serviceName::builder_without_plugins().build_unchecked(); + //! ## let app = $serviceName::builder( + //! ## ${serviceName}Config::builder() + //! ## .build()$unwrapConfigBuilder + //! ## ).build_unchecked(); //! let server = app.into_make_service(); //! let bind: SocketAddr = "127.0.0.1:6969".parse() //! .expect("unable to parse the server bind address and port"); @@ -92,7 +98,10 @@ open class ServerRootGenerator( //! use $crateName::$serviceName; //! //! ## async fn dummy() { - //! ## let app = $serviceName::builder_without_plugins().build_unchecked(); + //! ## let app = $serviceName::builder( + //! ## ${serviceName}Config::builder() + //! ## .build()$unwrapConfigBuilder + //! ## ).build_unchecked(); //! let handler = LambdaHandler::new(app); //! lambda_http::run(handler).await.unwrap(); //! ## } @@ -100,27 +109,26 @@ open class ServerRootGenerator( //! //! ## Building the $serviceName //! - //! To construct [`$serviceName`] we use [`$builderName`] returned by [`$serviceName::builder_without_plugins`] - //! or [`$serviceName::builder_with_plugins`]. + //! To construct [`$serviceName`] we use [`$builderName`] returned by [`$serviceName::builder`]. //! //! #### Plugins //! - //! The [`$serviceName::builder_with_plugins`] method, returning [`$builderName`], - //! accepts a [`Plugin`](aws_smithy_http_server::plugin::Plugin). + //! The [`$serviceName::builder`] method, returning [`$builderName`], + //! accepts a config object on which plugins can be registered. //! Plugins allow you to build middleware which is aware of the operation it is being applied to. //! - //! ```rust - //! ## use #{SmithyHttpServer}::plugin::IdentityPlugin; + //! ```rust,no_run //! ## use #{SmithyHttpServer}::plugin::IdentityPlugin as LoggingPlugin; //! ## use #{SmithyHttpServer}::plugin::IdentityPlugin as MetricsPlugin; //! ## use #{Hyper}::Body; - //! use #{SmithyHttpServer}::plugin::PluginPipeline; - //! use $crateName::{$serviceName, $builderName}; + //! use #{SmithyHttpServer}::plugin::HttpPlugins; + //! use $crateName::{$serviceName, ${serviceName}Config, $builderName}; //! - //! let plugins = PluginPipeline::new() + //! let http_plugins = HttpPlugins::new() //! .push(LoggingPlugin) //! .push(MetricsPlugin); - //! let builder: $builderName = $serviceName::builder_with_plugins(plugins, IdentityPlugin); + //! let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder; + //! let builder: $builderName = $serviceName::builder(config); //! ``` //! //! Check out [`#{SmithyHttpServer}::plugin`] to learn more about plugins. @@ -135,7 +143,7 @@ open class ServerRootGenerator( //! * A `Result` if your operation has modeled errors, or //! * An `Output` otherwise. //! - //! ```rust + //! ```rust,no_run //! ## struct Input; //! ## struct Output; //! ## struct Error; @@ -146,7 +154,7 @@ open class ServerRootGenerator( //! //! Handlers can accept up to 8 extractors: //! - //! ```rust + //! ```rust,no_run //! ## struct Input; //! ## struct Output; //! ## struct Error; @@ -184,13 +192,14 @@ open class ServerRootGenerator( //! //! ## Example //! - //! ```rust + //! ```rust,no_run //! ## use std::net::SocketAddr; - //! use $crateName::$serviceName; + //! use $crateName::{$serviceName, ${serviceName}Config}; //! //! ##[#{Tokio}::main] //! pub async fn main() { - //! let app = $serviceName::builder_without_plugins() + //! let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder; + //! let app = $serviceName::builder(config) ${builderFieldNames.values.joinToString("\n") { "//! .$it($it)" }} //! .build() //! .expect("failed to build an instance of $serviceName"); @@ -236,6 +245,23 @@ open class ServerRootGenerator( fun render(rustWriter: RustWriter) { documentation(rustWriter) - rustWriter.rust("pub use crate::service::{$serviceName, ${serviceName}Builder, MissingOperationsError};") + // Only export config builder error if fallible. + val configErrorReExport = if (isConfigBuilderFallible) { + "${serviceName}ConfigError," + } else { + "" + } + rustWriter.rust( + """ + pub use crate::service::{ + $serviceName, + ${serviceName}Config, + ${serviceName}ConfigBuilder, + $configErrorReExport + ${serviceName}Builder, + MissingOperationsError + }; + """, + ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt index 85a95076484..a6f62246d87 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt @@ -9,14 +9,12 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency -import software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType class ServerRuntimeTypesReExportsGenerator( codegenContext: CodegenContext, ) { private val runtimeConfig = codegenContext.runtimeConfig private val codegenScope = arrayOf( - "Router" to ServerRuntimeType.router(runtimeConfig), "SmithyHttpServer" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(), ) @@ -30,8 +28,11 @@ class ServerRuntimeTypesReExportsGenerator( pub use #{SmithyHttpServer}::operation::OperationShape; } pub mod plugin { + pub use #{SmithyHttpServer}::plugin::HttpPlugins; + pub use #{SmithyHttpServer}::plugin::ModelPlugins; + pub use #{SmithyHttpServer}::plugin::HttpMarker; + pub use #{SmithyHttpServer}::plugin::ModelMarker; pub use #{SmithyHttpServer}::plugin::Plugin; - pub use #{SmithyHttpServer}::plugin::PluginPipeline; pub use #{SmithyHttpServer}::plugin::PluginStack; } pub mod request { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt index 2852734b3fa..8eaec006a71 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt @@ -33,6 +33,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Output class ServerServiceGenerator( private val codegenContext: ServerCodegenContext, private val protocol: ServerProtocol, + private val isConfigBuilderFallible: Boolean, ) { private val runtimeConfig = codegenContext.runtimeConfig private val smithyHttpServer = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType() @@ -53,7 +54,6 @@ class ServerServiceGenerator( private val serviceId = service.id private val serviceName = serviceId.name.toPascalCase() private val builderName = "${serviceName}Builder" - private val builderBodyGenericTypeName = "Body" /** Calculate all `operationShape`s contained within the `ServiceShape`. */ private val index = TopDownIndex.of(codegenContext.model) @@ -108,6 +108,11 @@ class ServerServiceGenerator( val docHandler = DocHandlerGenerator(codegenContext, operationShape, "handler", "///") val handler = docHandler.docSignature() val handlerFixed = docHandler.docFixedSignature() + val unwrapConfigBuilder = if (isConfigBuilderFallible) { + ".expect(\"config failed to build\")" + } else { + "" + } rustTemplate( """ /// Sets the [`$structName`](crate::operation_shape::$structName) operation. @@ -118,49 +123,50 @@ class ServerServiceGenerator( /// ## Example /// /// ```no_run - /// use $crateName::$serviceName; + /// use $crateName::{$serviceName, ${serviceName}Config}; /// #{HandlerImports:W} /// #{Handler:W} /// - /// let app = $serviceName::builder_without_plugins() + /// let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder; + /// let app = $serviceName::builder(config) /// .$fieldName(handler) /// /* Set other handlers */ /// .build() /// .unwrap(); - /// ## let app: $serviceName<#{SmithyHttpServer}::routing::Route<#{SmithyHttp}::body::SdkBody>> = app; + /// ## let app: $serviceName<#{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route>, #{Protocol}>> = app; /// ``` /// pub fn $fieldName(self, handler: HandlerType) -> Self where HandlerType: #{SmithyHttpServer}::operation::Handler, - ModelPlugin: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + ModelPl: #{SmithyHttpServer}::plugin::Plugin< + $serviceName, crate::operation_shape::$structName, #{SmithyHttpServer}::operation::IntoService >, #{SmithyHttpServer}::operation::UpgradePlugin::: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, - ModelPlugin::Output + ModelPl::Output >, - HttpPlugin: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + HttpPl: #{SmithyHttpServer}::plugin::Plugin< + $serviceName, crate::operation_shape::$structName, < #{SmithyHttpServer}::operation::UpgradePlugin:: as #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, - ModelPlugin::Output + ModelPl::Output > >::Output >, - HttpPlugin::Output: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static, - >>::Future: Send + 'static, + HttpPl::Output: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static, + >>::Future: Send + 'static, { use #{SmithyHttpServer}::operation::OperationShapeExt; @@ -180,50 +186,51 @@ class ServerServiceGenerator( /// ## Example /// /// ```no_run - /// use $crateName::$serviceName; + /// use $crateName::{$serviceName, ${serviceName}Config}; /// #{HandlerImports:W} /// #{HandlerFixed:W} /// + /// let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder; /// let svc = #{Tower}::util::service_fn(handler); - /// let app = $serviceName::builder_without_plugins() + /// let app = $serviceName::builder(config) /// .${fieldName}_service(svc) /// /* Set other handlers */ /// .build() /// .unwrap(); - /// ## let app: $serviceName<#{SmithyHttpServer}::routing::Route<#{SmithyHttp}::body::SdkBody>> = app; + /// ## let app: $serviceName<#{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route>, #{Protocol}>> = app; /// ``` /// pub fn ${fieldName}_service(self, service: S) -> Self where S: #{SmithyHttpServer}::operation::OperationService, - ModelPlugin: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + ModelPl: #{SmithyHttpServer}::plugin::Plugin< + $serviceName, crate::operation_shape::$structName, #{SmithyHttpServer}::operation::Normalize >, #{SmithyHttpServer}::operation::UpgradePlugin::: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, - ModelPlugin::Output + ModelPl::Output >, - HttpPlugin: #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + HttpPl: #{SmithyHttpServer}::plugin::Plugin< + $serviceName, crate::operation_shape::$structName, < #{SmithyHttpServer}::operation::UpgradePlugin:: as #{SmithyHttpServer}::plugin::Plugin< - $serviceName, + $serviceName, crate::operation_shape::$structName, - ModelPlugin::Output + ModelPl::Output > >::Output >, - HttpPlugin::Output: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static, - >>::Future: Send + 'static, + HttpPl::Output: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static, + >>::Future: Send + 'static, { use #{SmithyHttpServer}::operation::OperationShapeExt; @@ -246,6 +253,7 @@ class ServerServiceGenerator( self } """, + "Router" to protocol.routerType(), "Protocol" to protocol.markerStruct(), "Handler" to handler, "HandlerFixed" to handlerFixed, @@ -294,8 +302,18 @@ class ServerServiceGenerator( /// Forgetting to register a handler for one or more operations will result in an error. /// /// Check out [`$builderName::build_unchecked`] if you'd prefer the service to return status code 500 when an - /// unspecified route requested. - pub fn build(self) -> Result<$serviceName<#{SmithyHttpServer}::routing::Route<$builderBodyGenericTypeName>>, MissingOperationsError> + /// unspecified route is requested. + pub fn build(self) -> Result< + $serviceName< + #{SmithyHttpServer}::routing::RoutingService< + #{Router}, + #{Protocol}, + >, + >, + MissingOperationsError, + > + where + L: #{Tower}::Layer<#{SmithyHttpServer}::routing::Route>, { let router = { use #{SmithyHttpServer}::operation::OperationShape; @@ -306,21 +324,22 @@ class ServerServiceGenerator( operation_names2setter_methods: $missingOperationsVariableName, }); } - let $expectMessageVariableName = "this should never panic since we are supposed to check beforehand that a handler has been registered for this operation; please file a bug report under https://github.com/awslabs/smithy-rs/issues"; + let $expectMessageVariableName = "this should never panic since we are supposed to check beforehand that a handler has been registered for this operation; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"; #{PatternInitializations:W} #{Router}::from_iter([#{RoutesArrayElements:W}]) }; - Ok($serviceName { - router: #{SmithyHttpServer}::routing::RoutingService::new(router), - }) + let svc = #{SmithyHttpServer}::routing::RoutingService::new(router); + let svc = svc.map(|s| s.layer(self.layer)); + Ok($serviceName { svc }) } """, + *codegenScope, + "Protocol" to protocol.markerStruct(), "Router" to protocol.routerType(), "NullabilityChecks" to nullabilityChecks, "RoutesArrayElements" to routesArrayElements, - "SmithyHttpServer" to smithyHttpServer, "PatternInitializations" to patternInitializations(), ) } @@ -376,34 +395,40 @@ class ServerServiceGenerator( /// /// Check out [`$builderName::build`] if you'd prefer the builder to fail if one or more operations do /// not have a registered handler. - pub fn build_unchecked(self) -> $serviceName<#{SmithyHttpServer}::routing::Route<$builderBodyGenericTypeName>> + pub fn build_unchecked(self) -> $serviceName where - $builderBodyGenericTypeName: Send + 'static + Body: Send + 'static, + L: #{Tower}::Layer< + #{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route>, #{Protocol}> + > { let router = #{Router}::from_iter([#{Pairs:W}]); - $serviceName { - router: #{SmithyHttpServer}::routing::RoutingService::new(router), - } + let svc = self + .layer + .layer(#{SmithyHttpServer}::routing::RoutingService::new(router)); + $serviceName { svc } } """, + *codegenScope, + "Protocol" to protocol.markerStruct(), "Router" to protocol.routerType(), "Pairs" to pairs, - "SmithyHttpServer" to smithyHttpServer, ) } /** Returns a `Writable` containing the builder struct definition and its implementations. */ private fun builder(): Writable = writable { - val builderGenerics = listOf(builderBodyGenericTypeName, "HttpPlugin", "ModelPlugin").joinToString(", ") + val builderGenerics = listOf("Body", "L", "HttpPl", "ModelPl").joinToString(", ") rustTemplate( """ /// The service builder for [`$serviceName`]. /// - /// Constructed via [`$serviceName::builder_with_plugins`] or [`$serviceName::builder_without_plugins`]. + /// Constructed via [`$serviceName::builder`]. pub struct $builderName<$builderGenerics> { ${builderFields.joinToString(", ")}, - http_plugin: HttpPlugin, - model_plugin: ModelPlugin + layer: L, + http_plugin: HttpPl, + model_plugin: ModelPl } impl<$builderGenerics> $builderName<$builderGenerics> { @@ -445,14 +470,14 @@ class ServerServiceGenerator( } /** Returns a `Writable` comma delimited sequence of `builder_field: None`. */ - private val notSetFields = builderFieldNames.values.map { + private fun notSetFields(): Writable = builderFieldNames.values.map { writable { rustTemplate( "$it: None", *codegenScope, ) } - } + }.join(", ") /** Returns a `Writable` containing the service struct definition and its implementations. */ private fun serviceStruct(): Writable = writable { @@ -463,21 +488,63 @@ class ServerServiceGenerator( /// /// See the [root](crate) documentation for more information. ##[derive(Clone)] - pub struct $serviceName { - router: #{SmithyHttpServer}::routing::RoutingService<#{Router}, #{Protocol}>, + pub struct $serviceName< + S = #{SmithyHttpServer}::routing::RoutingService< + #{Router}< + #{SmithyHttpServer}::routing::Route< + #{SmithyHttpServer}::body::BoxBody + >, + >, + #{Protocol}, + > + > { + // This is the router wrapped by layers. + svc: S, } impl $serviceName<()> { + /// Constructs a builder for [`$serviceName`]. + /// You must specify a configuration object holding any plugins and layers that should be applied + /// to the operations in this service. + pub fn builder< + Body, + L, + HttpPl: #{SmithyHttpServer}::plugin::HttpMarker, + ModelPl: #{SmithyHttpServer}::plugin::ModelMarker, + >( + config: ${serviceName}Config, + ) -> $builderName { + $builderName { + #{NotSetFields1:W}, + layer: config.layers, + http_plugin: config.http_plugins, + model_plugin: config.model_plugins, + } + } + /// Constructs a builder for [`$serviceName`]. /// You must specify what plugins should be applied to the operations in this service. /// /// Use [`$serviceName::builder_without_plugins`] if you don't need to apply plugins. /// - /// Check out [`PluginPipeline`](#{SmithyHttpServer}::plugin::PluginPipeline) if you need to apply + /// Check out [`HttpPlugins`](#{SmithyHttpServer}::plugin::HttpPlugins) and + /// [`ModelPlugins`](#{SmithyHttpServer}::plugin::ModelPlugins) if you need to apply /// multiple plugins. - pub fn builder_with_plugins(http_plugin: HttpPlugin, model_plugin: ModelPlugin) -> $builderName { + ##[deprecated( + since = "0.57.0", + note = "please use the `builder` constructor and register plugins on the `${serviceName}Config` object instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096" + )] + pub fn builder_with_plugins< + Body, + HttpPl: #{SmithyHttpServer}::plugin::HttpMarker, + ModelPl: #{SmithyHttpServer}::plugin::ModelMarker + >( + http_plugin: HttpPl, + model_plugin: ModelPl + ) -> $builderName { $builderName { - #{NotSetFields:W}, + #{NotSetFields2:W}, + layer: #{Tower}::layer::util::Identity::new(), http_plugin, model_plugin } @@ -486,7 +553,16 @@ class ServerServiceGenerator( /// Constructs a builder for [`$serviceName`]. /// /// Use [`$serviceName::builder_with_plugins`] if you need to specify plugins. - pub fn builder_without_plugins() -> $builderName { + ##[deprecated( + since = "0.57.0", + note = "please use the `builder` constructor instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096" + )] + pub fn builder_without_plugins() -> $builderName< + Body, + #{Tower}::layer::util::Identity, + #{SmithyHttpServer}::plugin::IdentityPlugin, + #{SmithyHttpServer}::plugin::IdentityPlugin + > { Self::builder_with_plugins(#{SmithyHttpServer}::plugin::IdentityPlugin, #{SmithyHttpServer}::plugin::IdentityPlugin) } } @@ -502,53 +578,85 @@ class ServerServiceGenerator( pub fn into_make_service_with_connect_info(self) -> #{SmithyHttpServer}::routing::IntoMakeServiceWithConnectInfo { #{SmithyHttpServer}::routing::IntoMakeServiceWithConnectInfo::new(self) } + } + impl + $serviceName< + #{SmithyHttpServer}::routing::RoutingService< + #{Router}, + #{Protocol}, + >, + > + { /// Applies a [`Layer`](#{Tower}::Layer) uniformly to all routes. - pub fn layer(self, layer: &L) -> $serviceName + ##[deprecated( + since = "0.57.0", + note = "please add layers to the `${serviceName}Config` object instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096" + )] + pub fn layer( + self, + layer: &L, + ) -> $serviceName< + #{SmithyHttpServer}::routing::RoutingService< + #{Router}, + #{Protocol}, + >, + > where - L: #{Tower}::Layer + L: #{Tower}::Layer, { $serviceName { - router: self.router.map(|s| s.layer(layer)) + svc: self.svc.map(|s| s.layer(layer)), } } /// Applies [`Route::new`](#{SmithyHttpServer}::routing::Route::new) to all routes. /// - /// This has the effect of erasing all types accumulated via [`layer`]($serviceName::layer). - pub fn boxed(self) -> $serviceName<#{SmithyHttpServer}::routing::Route> + /// This has the effect of erasing all types accumulated via layers. + pub fn boxed( + self, + ) -> $serviceName< + #{SmithyHttpServer}::routing::RoutingService< + #{Router}< + #{SmithyHttpServer}::routing::Route, + >, + #{Protocol}, + >, + > where S: #{Tower}::Service< #{Http}::Request, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, - Error = std::convert::Infallible>, + Error = std::convert::Infallible, + >, S: Clone + Send + 'static, S::Future: Send + 'static, { - self.layer(&#{Tower}::layer::layer_fn(#{SmithyHttpServer}::routing::Route::new)) + self.layer(&::tower::layer::layer_fn( + #{SmithyHttpServer}::routing::Route::new, + )) } } - impl #{Tower}::Service<#{Http}::Request> for $serviceName + impl #{Tower}::Service for $serviceName where - S: #{Tower}::Service<#{Http}::Request, Response = #{Http}::Response> + Clone, - RespB: #{HttpBody}::Body + Send + 'static, - RespB::Error: Into> + S: #{Tower}::Service, { - type Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>; + type Response = S::Response; type Error = S::Error; - type Future = #{SmithyHttpServer}::routing::RoutingFuture; + type Future = S::Future; fn poll_ready(&mut self, cx: &mut std::task::Context) -> std::task::Poll> { - self.router.poll_ready(cx) + self.svc.poll_ready(cx) } - fn call(&mut self, request: #{Http}::Request) -> Self::Future { - self.router.call(request) + fn call(&mut self, request: R) -> Self::Future { + self.svc.call(request) } } """, - "NotSetFields" to notSetFields.join(", "), + "NotSetFields1" to notSetFields(), + "NotSetFields2" to notSetFields(), "Router" to protocol.routerType(), "Protocol" to protocol.markerStruct(), *codegenScope, @@ -597,7 +705,7 @@ class ServerServiceGenerator( val version = codegenContext.serviceShape.version?.let { "Some(\"$it\")" } ?: "None" rustTemplate( """ - impl #{SmithyHttpServer}::service::ServiceShape for $serviceName { + impl #{SmithyHttpServer}::service::ServiceShape for $serviceName { const ID: #{SmithyHttpServer}::shape_id::ShapeId = #{SmithyHttpServer}::shape_id::ShapeId::new("$absolute", "$namespace", "$name"); const VERSION: Option<&'static str> = $version; @@ -650,7 +758,9 @@ class ServerServiceGenerator( for ((_, value) in operationStructNames) { rustTemplate( """ - impl #{SmithyHttpServer}::service::ContainsOperation for $serviceName { + impl #{SmithyHttpServer}::service::ContainsOperation + for $serviceName + { const VALUE: Operation = Operation::$value; } """, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt new file mode 100644 index 00000000000..525487968fa --- /dev/null +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt @@ -0,0 +1,445 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy.generators + +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock +import software.amazon.smithy.rust.codegen.core.rustlang.docs +import software.amazon.smithy.rust.codegen.core.rustlang.join +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope +import software.amazon.smithy.rust.codegen.core.util.toPascalCase +import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency +import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext + +fun List.isBuilderFallible() = this.any { it.isRequired } + +/** + * Contains all data necessary to render a method on the config builder object to apply arbitrary layers, HTTP plugins, + * and model plugins. + */ +data class ConfigMethod( + /** The name of the method. **/ + val name: String, + /** The Rust docs for the method. **/ + val docs: String, + /** The parameters of the method. **/ + val params: List, + /** In case the method is fallible, the error type it returns. **/ + val errorType: RuntimeType?, + /** The code block inside the method. **/ + val initializer: Initializer, + /** Whether the user must invoke the method or not. **/ + val isRequired: Boolean, +) { + /** The name of the flag on the config builder object that tracks whether the _required_ method has already been invoked or not. **/ + fun requiredBuilderFlagName(): String { + check(isRequired) { + "Config method is not required so it shouldn't need a field in the builder tracking whether it has been configured" + } + return "${name}_configured" + } + + /** The name of the enum variant on the config builder's error struct for a _required_ method. **/ + fun requiredErrorVariant(): String { + check(isRequired) { + "Config method is not required so it shouldn't need an error variant" + } + return "${name.toPascalCase()}NotConfigured" + } +} + +/** + * Represents the code block inside the method that initializes and configures a set of layers, HTTP plugins, and/or model + * plugins. + */ +data class Initializer( + /** + * The code itself that initializes and configures the layers, HTTP plugins, and/or model plugins. This should be + * a set of [Rust statements] that, after execution, defines one variable binding per layer/HTTP plugin/model plugin + * that it has configured and wants to apply. The code may use the method's input arguments (see [params] in + * [ConfigMethod]) to perform checks and initialize the bindings. + * + * For example, the following code performs checks on the `authorizer` and `auth_spec` input arguments, returning + * an error (see [errorType] in [ConfigMethod]) in case these checks fail, and leaves two plugins defined in two + * variable bindings, `authn_plugin` and `authz_plugin`. + * + * ```rust + * if authorizer != 69 { + * return Err(std::io::Error::new(std::io::ErrorKind::Other, "failure 1")); + * } + + * if auth_spec.len() != 69 { + * return Err(std::io::Error::new(std::io::ErrorKind::Other, "failure 2")); + * } + * let authn_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin; + * let authz_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin; + * ``` + * + * [Rust statements]: https://doc.rust-lang.org/reference/statements.html + */ + val code: Writable, + /** Ordered list of layers that should be applied. Layers are executed in the order they appear in the list. **/ + val layerBindings: List, + /** Ordered list of HTTP plugins that should be applied. Http plugins are executed in the order they appear in the list. **/ + val httpPluginBindings: List, + /** Ordered list of model plugins that should be applied. Model plugins are executed in the order they appear in the list. **/ + val modelPluginBindings: List, +) + +/** + * Represents a variable binding. For example, the following Rust code: + * + * ```rust + * fn foo(bar: String) { + * let baz: u64 = 69; + * } + * + * has two variable bindings. The `bar` name is bound to a `String` variable and the `baz` name is bound to a + * `u64` variable. + * ``` + */ +data class Binding( + /** The name of the variable. */ + val name: String, + /** The type of the variable. */ + val ty: RuntimeType, +) + +class ServiceConfigGenerator( + codegenContext: ServerCodegenContext, + private val configMethods: List, +) { + private val crateName = codegenContext.moduleUseName() + private val smithyHttpServer = ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType() + private val codegenScope = arrayOf( + *preludeScope, + "Debug" to RuntimeType.Debug, + "SmithyHttpServer" to smithyHttpServer, + "PluginStack" to smithyHttpServer.resolve("plugin::PluginStack"), + "ModelMarker" to smithyHttpServer.resolve("plugin::ModelMarker"), + "HttpMarker" to smithyHttpServer.resolve("plugin::HttpMarker"), + "Tower" to RuntimeType.Tower, + "Stack" to RuntimeType.Tower.resolve("layer::util::Stack"), + ) + private val serviceName = codegenContext.serviceShape.id.name.toPascalCase() + + fun render(writer: RustWriter) { + val unwrapConfigBuilder = if (isBuilderFallible) { + """ + /// .expect("config failed to build"); + """ + } else { + ";" + } + + writer.rustTemplate( + """ + /// Configuration for the [`$serviceName`]. This is the central place where to register and + /// configure [`#{Tower}::Layer`]s, HTTP plugins, and model plugins. + /// + /// ```rust,no_run + /// ## use $crateName::${serviceName}Config; + /// ## use #{SmithyHttpServer}::plugin::IdentityPlugin; + /// ## use #{Tower}::layer::util::Identity; + /// ## let authentication_plugin = IdentityPlugin; + /// ## let authorization_plugin = IdentityPlugin; + /// ## let server_request_id_provider_layer = Identity::new(); + /// let config = ${serviceName}Config::builder() + /// // Layers get executed first... + /// .layer(server_request_id_provider_layer) + /// // ...then HTTP plugins... + /// .http_plugin(authentication_plugin) + /// // ...and right after deserialization, model plugins. + /// .model_plugin(authorization_plugin) + /// .build()$unwrapConfigBuilder + /// ``` + /// + /// See the [`plugin`] system for details. + /// + /// [`plugin`]: #{SmithyHttpServer}::plugin + ##[derive(#{Debug})] + pub struct ${serviceName}Config { + layers: L, + http_plugins: H, + model_plugins: M, + } + + impl ${serviceName}Config<(), (), ()> { + /// Returns a builder to construct the configuration. + pub fn builder() -> ${serviceName}ConfigBuilder< + #{Tower}::layer::util::Identity, + #{SmithyHttpServer}::plugin::IdentityPlugin, + #{SmithyHttpServer}::plugin::IdentityPlugin, + > { + ${serviceName}ConfigBuilder { + layers: #{Tower}::layer::util::Identity::new(), + http_plugins: #{SmithyHttpServer}::plugin::IdentityPlugin, + model_plugins: #{SmithyHttpServer}::plugin::IdentityPlugin, + #{BuilderRequiredMethodFlagsInit:W} + } + } + } + + /// Builder returned by [`${serviceName}Config::builder()`]. + ##[derive(#{Debug})] + pub struct ${serviceName}ConfigBuilder { + pub(crate) layers: L, + pub(crate) http_plugins: H, + pub(crate) model_plugins: M, + #{BuilderRequiredMethodFlagDefinitions:W} + } + + #{BuilderRequiredMethodError:W} + + impl ${serviceName}ConfigBuilder { + #{InjectedMethods:W} + + /// Add a [`#{Tower}::Layer`] to the service. + pub fn layer(self, layer: NewLayer) -> ${serviceName}ConfigBuilder<#{Stack}, H, M> { + ${serviceName}ConfigBuilder { + layers: #{Stack}::new(layer, self.layers), + http_plugins: self.http_plugins, + model_plugins: self.model_plugins, + #{BuilderRequiredMethodFlagsMove1:W} + } + } + + /// Add a HTTP [plugin] to the service. + /// + /// [plugin]: #{SmithyHttpServer}::plugin + // We eagerly require `NewPlugin: HttpMarker`, despite not really needing it, because compiler + // errors get _substantially_ better if the user makes a mistake. + pub fn http_plugin( + self, + http_plugin: NewPlugin, + ) -> ${serviceName}ConfigBuilder, M> { + ${serviceName}ConfigBuilder { + layers: self.layers, + http_plugins: #{PluginStack}::new(http_plugin, self.http_plugins), + model_plugins: self.model_plugins, + #{BuilderRequiredMethodFlagsMove2:W} + } + } + + /// Add a model [plugin] to the service. + /// + /// [plugin]: #{SmithyHttpServer}::plugin + // We eagerly require `NewPlugin: ModelMarker`, despite not really needing it, because compiler + // errors get _substantially_ better if the user makes a mistake. + pub fn model_plugin( + self, + model_plugin: NewPlugin, + ) -> ${serviceName}ConfigBuilder> { + ${serviceName}ConfigBuilder { + layers: self.layers, + http_plugins: self.http_plugins, + model_plugins: #{PluginStack}::new(model_plugin, self.model_plugins), + #{BuilderRequiredMethodFlagsMove3:W} + } + } + + #{BuilderBuildMethod:W} + } + """, + *codegenScope, + "BuilderRequiredMethodFlagsInit" to builderRequiredMethodFlagsInit(), + "BuilderRequiredMethodFlagDefinitions" to builderRequiredMethodFlagsDefinitions(), + "BuilderRequiredMethodError" to builderRequiredMethodError(), + "InjectedMethods" to injectedMethods(), + "BuilderRequiredMethodFlagsMove1" to builderRequiredMethodFlagsMove(), + "BuilderRequiredMethodFlagsMove2" to builderRequiredMethodFlagsMove(), + "BuilderRequiredMethodFlagsMove3" to builderRequiredMethodFlagsMove(), + "BuilderBuildMethod" to builderBuildMethod(), + ) + } + + private val isBuilderFallible = configMethods.isBuilderFallible() + + private fun builderBuildRequiredMethodChecks() = configMethods.filter { it.isRequired }.map { + writable { + rustTemplate( + """ + if !self.${it.requiredBuilderFlagName()} { + return #{Err}(${serviceName}ConfigError::${it.requiredErrorVariant()}); + } + """, + *codegenScope, + ) + } + }.join("\n") + + private fun builderRequiredMethodFlagsDefinitions() = configMethods.filter { it.isRequired }.map { + writable { rust("pub(crate) ${it.requiredBuilderFlagName()}: bool,") } + }.join("\n") + + private fun builderRequiredMethodFlagsInit() = configMethods.filter { it.isRequired }.map { + writable { rust("${it.requiredBuilderFlagName()}: false,") } + }.join("\n") + + private fun builderRequiredMethodFlagsMove() = configMethods.filter { it.isRequired }.map { + writable { rust("${it.requiredBuilderFlagName()}: self.${it.requiredBuilderFlagName()},") } + }.join("\n") + + private fun builderRequiredMethodError() = writable { + if (isBuilderFallible) { + val variants = configMethods.filter { it.isRequired }.map { + writable { + rust( + """ + ##[error("service is not fully configured; invoke `${it.name}` on the config builder")] + ${it.requiredErrorVariant()}, + """, + ) + } + } + rustTemplate( + """ + ##[derive(Debug, #{ThisError}::Error)] + pub enum ${serviceName}ConfigError { + #{Variants:W} + } + """, + "ThisError" to ServerCargoDependency.ThisError.toType(), + "Variants" to variants.join("\n"), + ) + } + } + + private fun injectedMethods() = configMethods.map { + writable { + val paramBindings = it.params.map { binding -> + writable { rustTemplate("${binding.name}: #{BindingTy},", "BindingTy" to binding.ty) } + }.join("\n") + + // This produces a nested type like: "S>", where + // - "S" denotes a "stack type" with two generic type parameters: the first is the "inner" part of the stack + // and the second is the "outer" part of the stack. The outer part gets executed first. For an example, + // see `aws_smithy_http_server::plugin::PluginStack`. + // - "A", "B" are the types of the "things" that are added. + // - "T" is the generic type variable name used in the enclosing impl block. + fun List.stackReturnType(genericTypeVarName: String, stackType: RuntimeType): Writable = + this.fold(writable { rust(genericTypeVarName) }) { acc, next -> + writable { + rustTemplate( + "#{StackType}<#{Ty}, #{Acc:W}>", + "StackType" to stackType, + "Ty" to next.ty, + "Acc" to acc, + ) + } + } + + val layersReturnTy = + it.initializer.layerBindings.stackReturnType("L", RuntimeType.Tower.resolve("layer::util::Stack")) + val httpPluginsReturnTy = + it.initializer.httpPluginBindings.stackReturnType("H", smithyHttpServer.resolve("plugin::PluginStack")) + val modelPluginsReturnTy = + it.initializer.modelPluginBindings.stackReturnType("M", smithyHttpServer.resolve("plugin::PluginStack")) + + val configBuilderReturnTy = writable { + rustTemplate( + """ + ${serviceName}ConfigBuilder< + #{LayersReturnTy:W}, + #{HttpPluginsReturnTy:W}, + #{ModelPluginsReturnTy:W}, + > + """, + "LayersReturnTy" to layersReturnTy, + "HttpPluginsReturnTy" to httpPluginsReturnTy, + "ModelPluginsReturnTy" to modelPluginsReturnTy, + ) + } + + val returnTy = if (it.errorType != null) { + writable { + rustTemplate( + "#{Result}<#{T:W}, #{E}>", + "T" to configBuilderReturnTy, + "E" to it.errorType, + *codegenScope, + ) + } + } else { + configBuilderReturnTy + } + + docs(it.docs) + rustBlockTemplate( + """ + pub fn ${it.name}( + ##[allow(unused_mut)] + mut self, + #{ParamBindings:W} + ) -> #{ReturnTy:W} + """, + "ReturnTy" to returnTy, + "ParamBindings" to paramBindings, + ) { + rustTemplate("#{InitializerCode:W}", "InitializerCode" to it.initializer.code) + + check(it.initializer.layerBindings.size + it.initializer.httpPluginBindings.size + it.initializer.modelPluginBindings.size > 0) { + "This method's initializer does not register any layers, HTTP plugins, or model plugins. It must register at least something!" + } + + if (it.isRequired) { + rust("self.${it.requiredBuilderFlagName()} = true;") + } + conditionalBlock("Ok(", ")", conditional = it.errorType != null) { + val registrations = ( + it.initializer.layerBindings.map { ".layer(${it.name})" } + + it.initializer.httpPluginBindings.map { ".http_plugin(${it.name})" } + + it.initializer.modelPluginBindings.map { ".model_plugin(${it.name})" } + ).joinToString("") + rust("self$registrations") + } + } + } + }.join("\n\n") + + private fun builderBuildReturnType() = writable { + val t = "super::${serviceName}Config" + + if (isBuilderFallible) { + rustTemplate("#{Result}<$t, ${serviceName}ConfigError>", *codegenScope) + } else { + rust(t) + } + } + + private fun builderBuildMethod() = writable { + rustBlockTemplate( + """ + /// Build the configuration. + pub fn build(self) -> #{BuilderBuildReturnTy:W} + """, + "BuilderBuildReturnTy" to builderBuildReturnType(), + ) { + rustTemplate( + "#{BuilderBuildRequiredMethodChecks:W}", + "BuilderBuildRequiredMethodChecks" to builderBuildRequiredMethodChecks(), + ) + + conditionalBlock("Ok(", ")", isBuilderFallible) { + rust( + """ + super::${serviceName}Config { + layers: self.layers, + http_plugins: self.http_plugins, + model_plugins: self.model_plugins, + } + """, + ) + } + } + } +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt index b5c0cd052b8..b43eb582e60 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt @@ -35,7 +35,7 @@ class RestRequestSpecGenerator( it to requestSpecModule.resolve(it) }.toTypedArray() - // TODO(https://github.com/awslabs/smithy-rs/issues/950): Support the `endpoint` trait. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/950): Support the `endpoint` trait. val pathSegmentsVec = writable { withBlock("vec![", "]") { for (segment in httpTrait.uri.segments) { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt index 77ba711fd25..f86c547da19 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt @@ -132,7 +132,12 @@ class ServerAwsJsonProtocol( } override fun structuredDataParser(): StructuredDataParserGenerator = - jsonParserGenerator(serverCodegenContext, httpBindingResolver, ::awsJsonFieldName, additionalParserCustomizations) + jsonParserGenerator( + serverCodegenContext, + httpBindingResolver, + ::awsJsonFieldName, + additionalParserCustomizations, + ) override fun structuredDataSerializer(): StructuredDataSerializerGenerator = ServerAwsJsonSerializerGenerator(serverCodegenContext, httpBindingResolver, awsJsonVersion) @@ -171,9 +176,11 @@ class ServerAwsJsonProtocol( override fun requestRejection(runtimeConfig: RuntimeConfig): RuntimeType = ServerCargoDependency.smithyHttpServer(runtimeConfig) .toType().resolve("protocol::aws_json::rejection::RequestRejection") + override fun responseRejection(runtimeConfig: RuntimeConfig): RuntimeType = ServerCargoDependency.smithyHttpServer(runtimeConfig) .toType().resolve("protocol::aws_json::rejection::ResponseRejection") + override fun runtimeError(runtimeConfig: RuntimeConfig): RuntimeType = ServerCargoDependency.smithyHttpServer(runtimeConfig) .toType().resolve("protocol::aws_json::runtime_error::RuntimeError") @@ -192,7 +199,12 @@ class ServerRestJsonProtocol( override val protocolModulePath: String = "rest_json_1" override fun structuredDataParser(): StructuredDataParserGenerator = - jsonParserGenerator(serverCodegenContext, httpBindingResolver, ::restJsonFieldName, additionalParserCustomizations) + jsonParserGenerator( + serverCodegenContext, + httpBindingResolver, + ::restJsonFieldName, + additionalParserCustomizations, + ) override fun structuredDataSerializer(): StructuredDataSerializerGenerator = ServerRestJsonSerializerGenerator(serverCodegenContext, httpBindingResolver) @@ -257,6 +269,7 @@ class ServerRequestBeforeBoxingDeserializedMemberConvertToMaybeConstrainedJsonPa rust(".map(|x| x.into())") } } + else -> emptySection } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index 7288de89421..968f87ea3a0 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -54,7 +54,7 @@ import software.amazon.smithy.rust.codegen.core.util.toPascalCase import software.amazon.smithy.rust.codegen.core.util.toSnakeCase import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency import software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType -import software.amazon.smithy.rust.codegen.server.smithy.generators.serverInstantiator +import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerInstantiator import java.util.logging.Logger import kotlin.reflect.KFunction1 @@ -94,7 +94,7 @@ class ServerProtocolTestGenerator( inputT to outputT } - private val instantiator = serverInstantiator(codegenContext) + private val instantiator = ServerInstantiator(codegenContext) private val codegenScope = arrayOf( "Bytes" to RuntimeType.Bytes, @@ -230,26 +230,6 @@ class ServerProtocolTestGenerator( // not been written with a server-side perspective in mind. private fun List.fixBroken(): List = this.map { when (it) { - is TestCase.RequestTest -> { - val howToFixIt = BrokenRequestTests[Pair(codegenContext.serviceShape.id.toString(), it.id)] - if (howToFixIt == null) { - it - } else { - val fixed = howToFixIt(it.testCase, it.operationShape) - TestCase.RequestTest(fixed, it.operationShape) - } - } - - is TestCase.ResponseTest -> { - val howToFixIt = BrokenResponseTests[Pair(codegenContext.serviceShape.id.toString(), it.id)] - if (howToFixIt == null) { - it - } else { - val fixed = howToFixIt(it.testCase) - TestCase.ResponseTest(fixed, it.targetShape) - } - } - is TestCase.MalformedRequestTest -> { val howToFixIt = BrokenMalformedRequestTests[Pair(codegenContext.serviceShape.id.toString(), it.id)] if (howToFixIt == null) { @@ -259,6 +239,7 @@ class ServerProtocolTestGenerator( TestCase.MalformedRequestTest(fixed) } } + else -> it } } @@ -486,7 +467,8 @@ class ServerProtocolTestGenerator( """ ##[allow(unused_mut)] let (sender, mut receiver) = #{Tokio}::sync::mpsc::channel(1); - let service = crate::service::$serviceName::builder_without_plugins::<#{Hyper}::body::Body>() + let config = crate::service::${serviceName}Config::builder().build(); + let service = crate::service::$serviceName::builder::<#{Hyper}::body::Body, _, _, _>(config) .$operationName(move |input: $inputT| { let sender = sender.clone(); async move { @@ -544,7 +526,7 @@ class ServerProtocolTestGenerator( (target is DoubleShape) || (target is FloatShape) } - // TODO(https://github.com/awslabs/smithy-rs/issues/1147) Handle the case of nested floating point members. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1147) Handle the case of nested floating point members. if (hasFloatingPointMembers) { for (member in inputShape.members()) { val memberName = codegenContext.symbolProvider.toMemberName(member) @@ -580,14 +562,14 @@ class ServerProtocolTestGenerator( private fun checkResponse(rustWriter: RustWriter, testCase: HttpResponseTestCase) { checkStatusCode(rustWriter, testCase.code) - checkHeaders(rustWriter, "&http_response.headers()", testCase.headers) - checkForbidHeaders(rustWriter, "&http_response.headers()", testCase.forbidHeaders) - checkRequiredHeaders(rustWriter, "&http_response.headers()", testCase.requireHeaders) + checkHeaders(rustWriter, "http_response.headers()", testCase.headers) + checkForbidHeaders(rustWriter, "http_response.headers()", testCase.forbidHeaders) + checkRequiredHeaders(rustWriter, "http_response.headers()", testCase.requireHeaders) // We can't check that the `OperationExtension` is set in the response, because it is set in the implementation // of the operation `Handler` trait, a code path that does not get exercised when we don't have a request to // invoke it with (like in the case of an `httpResponseTest` test case). - // In https://github.com/awslabs/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()` + // In https://github.com/smithy-lang/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()` // the operation handler trait implementation instead of directly calling `from_request()`. // If no request body is defined, then no assertions are made about the body of the message. @@ -598,12 +580,12 @@ class ServerProtocolTestGenerator( private fun checkResponse(rustWriter: RustWriter, testCase: HttpMalformedResponseDefinition) { checkStatusCode(rustWriter, testCase.code) - checkHeaders(rustWriter, "&http_response.headers()", testCase.headers) + checkHeaders(rustWriter, "http_response.headers()", testCase.headers) // We can't check that the `OperationExtension` is set in the response, because it is set in the implementation // of the operation `Handler` trait, a code path that does not get exercised when we don't have a request to // invoke it with (like in the case of an `httpResponseTest` test case). - // In https://github.com/awslabs/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()` + // In https://github.com/smithy-lang/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()` // the operation handler trait implementation instead of directly calling `from_request()`. // If no request body is defined, then no assertions are made about the body of the message. @@ -762,19 +744,19 @@ class ServerProtocolTestGenerator( private const val RestJson = "aws.protocoltests.restjson#RestJson" private const val RestJsonValidation = "aws.protocoltests.restjson.validation#RestJsonValidation" private val ExpectFail: Set = setOf( - // Endpoint trait is not implemented yet, see https://github.com/awslabs/smithy-rs/issues/950. + // Endpoint trait is not implemented yet, see https://github.com/smithy-lang/smithy-rs/issues/950. FailingTest(RestJson, "RestJsonEndpointTrait", TestType.Request), FailingTest(RestJson, "RestJsonEndpointTraitWithHostLabel", TestType.Request), FailingTest(RestJson, "RestJsonOmitsEmptyListQueryValues", TestType.Request), // Tests involving `@range` on floats. - // Pending resolution from the Smithy team, see https://github.com/awslabs/smithy-rs/issues/2007. + // Pending resolution from the Smithy team, see https://github.com/smithy-lang/smithy-rs/issues/2007. FailingTest(RestJsonValidation, "RestJsonMalformedRangeFloat_case0", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeFloat_case1", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeMaxFloat", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeMinFloat", TestType.MalformedRequest), - // Tests involving floating point shapes and the `@range` trait; see https://github.com/awslabs/smithy-rs/issues/2007 + // Tests involving floating point shapes and the `@range` trait; see https://github.com/smithy-lang/smithy-rs/issues/2007 FailingTest(RestJsonValidation, "RestJsonMalformedRangeFloatOverride_case0", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeFloatOverride_case1", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedRangeMaxFloatOverride", TestType.MalformedRequest), @@ -789,6 +771,7 @@ class ServerProtocolTestGenerator( FailingTest("com.amazonaws.s3#AmazonS3", "S3VirtualHostAccelerateAddressing", TestType.Request), FailingTest("com.amazonaws.s3#AmazonS3", "S3VirtualHostDualstackAccelerateAddressing", TestType.Request), FailingTest("com.amazonaws.s3#AmazonS3", "S3OperationAddressingPreferred", TestType.Request), + FailingTest("com.amazonaws.s3#AmazonS3", "S3OperationNoErrorWrappingResponse", TestType.Response), // AwsJson1.0 failing tests. FailingTest("aws.protocoltests.json10#JsonRpc10", "AwsJson10EndpointTraitWithHostLabel", TestType.Request), @@ -827,7 +810,7 @@ class ServerProtocolTestGenerator( FailingTest(RestJsonValidation, "RestJsonMalformedUniqueItemsUnionList_case0", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedUniqueItemsUnionList_case1", TestType.MalformedRequest), - // TODO(https://github.com/awslabs/smithy-rs/issues/2472): We don't respect the `@internal` trait + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2472): We don't respect the `@internal` trait FailingTest(RestJsonValidation, "RestJsonMalformedEnumList_case0", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedEnumList_case1", TestType.MalformedRequest), FailingTest(RestJsonValidation, "RestJsonMalformedEnumMapKey_case0", TestType.MalformedRequest), @@ -847,7 +830,25 @@ class ServerProtocolTestGenerator( // These tests are not even attempted to be generated, either because they will not compile // or because they are flaky - private val DisableTests = setOf() + private val DisableTests = setOf( + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2891): Implement support for `@requestCompression` + "SDKAppendedGzipAfterProvidedEncoding_restJson1", + "SDKAppendedGzipAfterProvidedEncoding_restXml", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_0", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_1", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsQuery", + "SDKAppendsGzipAndIgnoresHttpProvidedEncoding_ec2Query", + "SDKAppliedContentEncoding_awsJson1_0", + "SDKAppliedContentEncoding_awsJson1_1", + "SDKAppliedContentEncoding_awsQuery", + "SDKAppliedContentEncoding_ec2Query", + "SDKAppliedContentEncoding_restJson1", + "SDKAppliedContentEncoding_restXml", + + // RestXml S3 tests that fail to compile + "S3EscapeObjectKeyInUriLabel", + "S3EscapePathObjectKeyInUriLabel", + ) private fun fixRestJsonAllQueryStringTypes( testCase: HttpRequestTestCase, @@ -903,33 +904,6 @@ class ServerProtocolTestGenerator( ).asObjectNode().get(), ).build() - private fun fixRestJsonQueryStringEscaping( - testCase: HttpRequestTestCase, - @Suppress("UNUSED_PARAMETER") - operationShape: OperationShape, - ): HttpRequestTestCase = - testCase.toBuilder().params( - Node.parse( - """ - { - "queryString": "%:/?#[]@!${'$'}&'()*+,;=😹", - "queryParamsMapOfStringList": { - "String": ["%:/?#[]@!${'$'}&'()*+,;=😹"] - } - } - """.trimMargin(), - ).asObjectNode().get(), - ).build() - - private fun fixRestJsonInvalidGreetingError(testCase: HttpResponseTestCase): HttpResponseTestCase = - testCase.toBuilder().putHeader("X-Amzn-Errortype", "aws.protocoltests.restjson#InvalidGreeting").build() - - private fun fixRestJsonEmptyComplexErrorWithNoMessage(testCase: HttpResponseTestCase): HttpResponseTestCase = - testCase.toBuilder().putHeader("X-Amzn-Errortype", "aws.protocoltests.restjson#ComplexError").build() - - private fun fixRestJsonComplexErrorWithNoMessage(testCase: HttpResponseTestCase): HttpResponseTestCase = - testCase.toBuilder().putHeader("X-Amzn-Errortype", "aws.protocoltests.restjson#ComplexError").build() - // TODO(https://github.com/awslabs/smithy/issues/1506) private fun fixRestJsonMalformedPatternReDOSString(testCase: HttpMalformedRequestTestCase): HttpMalformedRequestTestCase { val brokenResponse = testCase.response @@ -951,24 +925,11 @@ class ServerProtocolTestGenerator( .build() } - // These are tests whose definitions in the `awslabs/smithy` repository are wrong. - // This is because they have not been written from a server perspective, and as such the expected `params` field is incomplete. - // TODO(https://github.com/awslabs/smithy-rs/issues/1288): Contribute a PR to fix them upstream. - private val BrokenRequestTests = mapOf( - // TODO(https://github.com/awslabs/smithy/pull/1564) - // Pair(RestJson, "RestJsonAllQueryStringTypes") to ::fixRestJsonAllQueryStringTypes, - // TODO(https://github.com/awslabs/smithy/pull/1562) - Pair(RestJson, "RestJsonQueryStringEscaping") to ::fixRestJsonQueryStringEscaping, - ) - - private val BrokenResponseTests: Map, KFunction1> = - // TODO(https://github.com/awslabs/smithy/issues/1494) - mapOf( - Pair(RestJson, "RestJsonInvalidGreetingError") to ::fixRestJsonInvalidGreetingError, - Pair(RestJson, "RestJsonEmptyComplexErrorWithNoMessage") to ::fixRestJsonEmptyComplexErrorWithNoMessage, - Pair(RestJson, "RestJsonComplexErrorWithNoMessage") to ::fixRestJsonComplexErrorWithNoMessage, - ) - + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1288): Move the fixed versions into + // `rest-json-extras.smithy` and put the unfixed ones in `ExpectFail`: this has the + // advantage that once our upstream PRs get merged and we upgrade to the next Smithy release, our build will + // fail and we will take notice to remove the fixes from `rest-json-extras.smithy`. This is exactly what the + // client does. private val BrokenMalformedRequestTests: Map, KFunction1> = // TODO(https://github.com/awslabs/smithy/issues/1506) mapOf( diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt index 920813e34d7..549ca88b1ee 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt @@ -68,6 +68,14 @@ class ServerAwsJsonFactory( /** * AwsJson requires errors to be serialized in server responses with an additional `__type` field. This * customization writes the right field depending on the version of the AwsJson protocol. + * + * From the specs: + * - https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html#operation-error-serialization + * - https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html#operation-error-serialization + * + * > Error responses in the protocol are serialized identically to standard responses with one additional + * > component to distinguish which error is contained. New server-side protocol implementations SHOULD use a body + * > field named __type */ class ServerAwsJsonError(private val awsJsonVersion: AwsJsonVersion) : JsonSerializerCustomization() { override fun section(section: JsonSerializerSection): Writable = when (section) { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt index 6e22828a1c5..49ddcb03349 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt @@ -44,6 +44,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization import software.amazon.smithy.rust.codegen.core.smithy.customize.Section import software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization @@ -57,7 +58,6 @@ import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBoundProtoc import software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation import software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions -import software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson import software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator import software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait import software.amazon.smithy.rust.codegen.core.smithy.transformers.operationErrors @@ -82,11 +82,28 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.Ser import software.amazon.smithy.rust.codegen.server.smithy.generators.serverBuilderSymbol import java.util.logging.Logger +data class StreamPayloadSerializerParams( + val codegenContext: ServerCodegenContext, + val payloadGenerator: ServerHttpBoundProtocolPayloadGenerator, + val shapeName: String, + val shape: OperationShape, +) + /** * Class describing a ServerHttpBoundProtocol section that can be used in a customization. */ sealed class ServerHttpBoundProtocolSection(name: String) : Section(name) { data class AfterTimestampDeserializedMember(val shape: MemberShape) : ServerHttpBoundProtocolSection("AfterTimestampDeserializedMember") + + /** + * Represent a section for rendering the serialized stream payload. + * + * If the payload does not implement the `futures_core::stream::Stream`, which is the case for + * `aws_smithy_types::byte_stream::ByteStream`, the section needs to be overridden and renders a new-type wrapper + * around the payload to enable the `Stream` trait. + */ + data class WrapStreamPayload(val params: StreamPayloadSerializerParams) : + ServerHttpBoundProtocolSection("WrapStreamPayload") } /** @@ -173,8 +190,8 @@ class ServerHttpBoundProtocolTraitImplGenerator( "OnceCell" to RuntimeType.OnceCell, "PercentEncoding" to RuntimeType.PercentEncoding, "Regex" to RuntimeType.Regex, - "SmithyHttp" to RuntimeType.smithyHttp(runtimeConfig), "SmithyHttpServer" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(), + "SmithyTypes" to RuntimeType.smithyTypes(runtimeConfig), "RuntimeError" to protocol.runtimeError(runtimeConfig), "RequestRejection" to protocol.requestRejection(runtimeConfig), "ResponseRejection" to protocol.responseRejection(runtimeConfig), @@ -234,6 +251,11 @@ class ServerHttpBoundProtocolTraitImplGenerator( rustTemplate(init, *codegenScope) } } + // This checks for the expected `Content-Type` header if the `@httpPayload` trait is present, as dictated by + // the core Smithy library, which _does not_ require deserializing the payload. + // If no members have `@httpPayload`, the expected `Content-Type` header as dictated _by the protocol_ is + // checked later on for non-streaming operations, in `serverRenderShapeParser`: that check _does_ require at + // least buffering the entire payload, since the check must only be performed if the payload is empty. val verifyRequestContentTypeHeader = writable { operationShape .inputShape(model) @@ -242,11 +264,15 @@ class ServerHttpBoundProtocolTraitImplGenerator( ?.let { payload -> val target = model.expectShape(payload.target) if (!target.isBlobShape || target.hasTrait()) { - val expectedRequestContentType = httpBindingResolver.requestContentType(operationShape) - ?.let { "Some(${it.dq()})" } ?: "None" + // `null` is only returned by Smithy when there are no members, but we know there's at least + // the one with `@httpPayload`, so `!!` is safe here. + val expectedRequestContentType = httpBindingResolver.requestContentType(operationShape)!! rustTemplate( """ - #{SmithyHttpServer}::protocol::content_type_header_classifier(request.headers(), $expectedRequestContentType)?; + #{SmithyHttpServer}::protocol::content_type_header_classifier_http( + request.headers(), + Some("$expectedRequestContentType"), + )?; """, *codegenScope, ) @@ -256,7 +282,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( // Implement `from_request` trait for input types. val inputFuture = "${inputSymbol.name}Future" - // TODO(https://github.com/awslabs/smithy-rs/issues/2238): Remove the `Pin>` and replace with thin wrapper around `Collect`. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2238): Remove the `Pin>` and replace with thin wrapper around `Collect`. rustTemplate( """ #{verifyAcceptHeaderStaticContentTypeInit:W} @@ -532,7 +558,18 @@ class ServerHttpBoundProtocolTraitImplGenerator( operationShape.outputShape(model).findStreamingMember(model)?.let { val payloadGenerator = ServerHttpBoundProtocolPayloadGenerator(codegenContext, protocol) withBlockTemplate("let body = #{SmithyHttpServer}::body::boxed(#{SmithyHttpServer}::body::Body::wrap_stream(", "));", *codegenScope) { - payloadGenerator.generatePayload(this, "output", operationShape) + for (customization in customizations) { + customization.section( + ServerHttpBoundProtocolSection.WrapStreamPayload( + StreamPayloadSerializerParams( + codegenContext, + payloadGenerator, + "output", + operationShape, + ), + ), + )(this) + } } } ?: run { val payloadGenerator = ServerHttpBoundProtocolPayloadGenerator(codegenContext, protocol) @@ -686,33 +723,36 @@ class ServerHttpBoundProtocolTraitImplGenerator( inputShape.serverBuilderSymbol(codegenContext), ) Attribute.AllowUnusedVariables.render(this) - rust("let (parts, body) = request.into_parts();") + rustTemplate( + """ + let #{RequestParts} { uri, headers, body, .. } = #{Request}::try_from(request)?.into_parts(); + """, + *preludeScope, + "ParseError" to RuntimeType.smithyHttp(runtimeConfig).resolve("header::ParseError"), + "Request" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("http::Request"), + "RequestParts" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("http::RequestParts"), + ) val parser = structuredDataParser.serverInputParser(operationShape) val noInputs = model.expectShape(operationShape.inputShape).expectTrait().originalId == null + if (parser != null) { - rustTemplate( - """ - let bytes = #{Hyper}::body::to_bytes(body).await?; - if !bytes.is_empty() { - """, - *codegenScope, - ) - if (protocol is RestJson) { + // `null` is only returned by Smithy when there are no members, but we know there's at least one, since + // there's something to parse (i.e. `parser != null`), so `!!` is safe here. + val expectedRequestContentType = httpBindingResolver.requestContentType(operationShape)!! + rustTemplate("let bytes = #{Hyper}::body::to_bytes(body).await?;", *codegenScope) + rustBlock("if !bytes.is_empty()") { rustTemplate( """ - #{SmithyHttpServer}::protocol::content_type_header_classifier(&parts.headers, Some("application/json"))?; + #{SmithyHttpServer}::protocol::content_type_header_classifier_smithy( + &headers, + Some("$expectedRequestContentType"), + )?; + input = #{parser}(bytes.as_ref(), input)?; """, *codegenScope, + "parser" to parser, ) } - rustTemplate( - """ - input = #{parser}(bytes.as_ref(), input)?; - } - """, - *codegenScope, - "parser" to parser, - ) } for (binding in bindings) { val member = binding.member @@ -742,7 +782,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( conditionalBlock("if body.is_empty() {", "}", conditional = parser != null) { rustTemplate( """ - #{SmithyHttpServer}::protocol::content_type_header_empty_body_no_modeled_input(&parts.headers)?; + #{SmithyHttpServer}::protocol::content_type_header_empty_body_no_modeled_input(&headers)?; """, *codegenScope, ) @@ -855,7 +895,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( } } .joinToString( - // TODO(https://github.com/awslabs/smithy-rs/issues/1289): Note we're limited to 21 labels because of `tuple`. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1289): Note we're limited to 21 labels because of `tuple`. prefix = if (segments.size > 1) "#{Nom}::sequence::tuple::<_, _, #{Nom}::error::Error<&str>, _>((" else "", postfix = if (segments.size > 1) "))" else "", transform = { parser -> @@ -865,7 +905,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( }, ) with(writer) { - rustTemplate("let input_string = parts.uri.path();") + rustTemplate("let input_string = uri.path();") if (greedyLabelIndex >= 0 && greedyLabelIndex + 1 < httpTrait.uri.segments.size) { rustTemplate( """ @@ -950,7 +990,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( with(writer) { rustTemplate( """ - let query_string = parts.uri.query().unwrap_or(""); + let query_string = uri.query().unwrap_or(""); let pairs = #{FormUrlEncoded}::parse(query_string.as_bytes()); """.trimIndent(), *codegenScope, @@ -959,7 +999,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( if (queryParamsBinding != null) { val target = model.expectShape(queryParamsBinding.member.target, MapShape::class.java) val hasConstrainedTarget = target.canReachConstrainedShape(model, symbolProvider) - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Here we only check the target shape; + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Here we only check the target shape; // constraint traits on member shapes are not implemented yet. val targetSymbol = unconstrainedShapeSymbolProvider.toSymbol(target) withBlock("let mut query_params: #T = ", ";", targetSymbol) { @@ -1044,7 +1084,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( if (queryParamsBinding != null) { val target = model.expectShape(queryParamsBinding.member.target, MapShape::class.java) - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Here we only check the target shape; + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Here we only check the target shape; // constraint traits on member shapes are not implemented yet. val hasConstrainedTarget = target.canReachConstrainedShape(model, symbolProvider) when (queryParamsBinding.queryParamsBindingTargetMapValueType()) { @@ -1085,7 +1125,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( } } queryBindingsTargetingCollection.forEach { binding -> - // TODO(https://github.com/awslabs/smithy-rs/issues/1401) Constraint traits on member shapes are not + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not // implemented yet. val hasConstrainedTarget = model.expectShape(binding.member.target, CollectionShape::class.java).canReachConstrainedShape(model, symbolProvider) @@ -1121,7 +1161,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( val deserializer = httpBindingGenerator.generateDeserializeHeaderFn(binding) writer.rustTemplate( """ - #{deserializer}(&parts.headers)? + #{deserializer}(&headers)? """.trimIndent(), "deserializer" to deserializer, *codegenScope, @@ -1135,7 +1175,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( val deserializer = httpBindingGenerator.generateDeserializePrefixHeadersFn(binding) writer.rustTemplate( """ - #{deserializer}(&parts.headers)? + #{deserializer}(&headers)? """.trimIndent(), "deserializer" to deserializer, *codegenScope, @@ -1238,7 +1278,7 @@ class ServerHttpBoundProtocolTraitImplGenerator( private fun streamingBodyTraitBounds(operationShape: OperationShape) = if (operationShape.inputShape(model).hasStreamingMember(model)) { - "\n B: Into<#{SmithyHttp}::byte_stream::ByteStream>," + "\n B: Into<#{SmithyTypes}::byte_stream::ByteStream>," } else { "" } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt index e52d9e3a3bc..a72ad201c0d 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt @@ -9,21 +9,68 @@ import software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait import software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait import software.amazon.smithy.aws.traits.protocols.RestJson1Trait import software.amazon.smithy.aws.traits.protocols.RestXmlTrait +import software.amazon.smithy.rust.codegen.core.rustlang.Writable +import software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType import software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJsonVersion import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolLoader import software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap +import software.amazon.smithy.rust.codegen.core.util.isOutputEventStream import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator +class StreamPayloadSerializerCustomization() : ServerHttpBoundProtocolCustomization() { + override fun section(section: ServerHttpBoundProtocolSection): Writable = when (section) { + is ServerHttpBoundProtocolSection.WrapStreamPayload -> writable { + if (section.params.shape.isOutputEventStream(section.params.codegenContext.model)) { + // Event stream payload, of type `aws_smithy_http::event_stream::MessageStreamAdapter`, already + // implements the `Stream` trait, so no need to wrap it in the new-type. + section.params.payloadGenerator.generatePayload(this, section.params.shapeName, section.params.shape) + } else { + // Otherwise, the stream payload is `aws_smithy_types::byte_stream::ByteStream`. We wrap it in the + // new-type to enable the `Stream` trait. + withBlockTemplate( + "#{FuturesStreamCompatByteStream}::new(", + ")", + "FuturesStreamCompatByteStream" to RuntimeType.futuresStreamCompatByteStream(section.params.codegenContext.runtimeConfig), + ) { + section.params.payloadGenerator.generatePayload( + this, + section.params.shapeName, + section.params.shape, + ) + } + } + } + + else -> emptySection + } +} + class ServerProtocolLoader(supportedProtocols: ProtocolMap) : ProtocolLoader(supportedProtocols) { companion object { val DefaultProtocols = mapOf( - RestJson1Trait.ID to ServerRestJsonFactory(), - RestXmlTrait.ID to ServerRestXmlFactory(), - AwsJson1_0Trait.ID to ServerAwsJsonFactory(AwsJsonVersion.Json10), - AwsJson1_1Trait.ID to ServerAwsJsonFactory(AwsJsonVersion.Json11), + RestJson1Trait.ID to ServerRestJsonFactory( + additionalServerHttpBoundProtocolCustomizations = listOf( + StreamPayloadSerializerCustomization(), + ), + ), + RestXmlTrait.ID to ServerRestXmlFactory( + additionalServerHttpBoundProtocolCustomizations = listOf( + StreamPayloadSerializerCustomization(), + ), + ), + AwsJson1_0Trait.ID to ServerAwsJsonFactory( + AwsJsonVersion.Json10, + additionalServerHttpBoundProtocolCustomizations = listOf(StreamPayloadSerializerCustomization()), + ), + AwsJson1_1Trait.ID to ServerAwsJsonFactory( + AwsJsonVersion.Json11, + additionalServerHttpBoundProtocolCustomizations = listOf(StreamPayloadSerializerCustomization()), + ), ) } } diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt index f5b3be454fe..9207c56046e 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt @@ -15,11 +15,17 @@ import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.Ser * RestXml server-side protocol factory. This factory creates the [ServerHttpProtocolGenerator] * with RestXml specific configurations. */ -class ServerRestXmlFactory : ProtocolGeneratorFactory { +class ServerRestXmlFactory( + private val additionalServerHttpBoundProtocolCustomizations: List = listOf(), +) : ProtocolGeneratorFactory { override fun protocol(codegenContext: ServerCodegenContext): Protocol = ServerRestXmlProtocol(codegenContext) override fun buildProtocolGenerator(codegenContext: ServerCodegenContext): ServerHttpBoundProtocolGenerator = - ServerHttpBoundProtocolGenerator(codegenContext, ServerRestXmlProtocol(codegenContext)) + ServerHttpBoundProtocolGenerator( + codegenContext, + ServerRestXmlProtocol(codegenContext), + additionalServerHttpBoundProtocolCustomizations, + ) override fun support(): ProtocolSupport { return ProtocolSupport( diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt index 82b8af20eac..f161282242a 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt @@ -17,6 +17,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig import software.amazon.smithy.rust.codegen.core.smithy.RustCrate import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.testutil.TestModuleDocProvider import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig @@ -27,6 +28,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.ServerModuleProvider import software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings import software.amazon.smithy.rust.codegen.server.smithy.ServerSymbolProviders import software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator +import software.amazon.smithy.rust.codegen.server.smithy.customize.CombinedServerCodegenDecorator import software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator import software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderGenerator import software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol @@ -46,15 +48,11 @@ private fun testServiceShapeFor(model: Model) = fun serverTestSymbolProvider(model: Model, serviceShape: ServiceShape? = null) = serverTestSymbolProviders(model, serviceShape).symbolProvider -private class ServerTestCodegenDecorator : ServerCodegenDecorator { - override val name = "test" - override val order: Byte = 0 -} - fun serverTestSymbolProviders( model: Model, serviceShape: ServiceShape? = null, settings: ServerRustSettings? = null, + decorators: List = emptyList(), ) = ServerSymbolProviders.from( serverTestRustSettings(), @@ -66,7 +64,7 @@ fun serverTestSymbolProviders( (serviceShape ?: testServiceShapeFor(model)).id, ) ).codegenConfig.publicConstrainedTypes, - ServerTestCodegenDecorator(), + CombinedServerCodegenDecorator(decorators), RustServerCodegenPlugin::baseSymbolProvider, ) @@ -101,6 +99,7 @@ fun serverTestCodegenContext( serviceShape: ServiceShape? = null, settings: ServerRustSettings = serverTestRustSettings(), protocolShapeId: ShapeId? = null, + decorators: List = emptyList(), ): ServerCodegenContext { val service = serviceShape ?: testServiceShapeFor(model) val protocol = protocolShapeId ?: ShapeId.from("test#Protocol") @@ -110,7 +109,7 @@ fun serverTestCodegenContext( service, ServerTestRustSymbolProviderConfig, settings.codegenConfig.publicConstrainedTypes, - ServerTestCodegenDecorator(), + CombinedServerCodegenDecorator(decorators), RustServerCodegenPlugin::baseSymbolProvider, ) @@ -145,7 +144,7 @@ fun StructureShape.serverRenderWithModelBuilder( writer: RustWriter, protocol: ServerProtocol? = null, ) { - StructureGenerator(model, symbolProvider, writer, this, emptyList()).render() + StructureGenerator(model, symbolProvider, writer, this, emptyList(), StructSettings(false)).render() val serverCodegenContext = serverTestCodegenContext(model) // Note that this always uses `ServerBuilderGenerator` and _not_ `ServerBuilderGeneratorWithoutPublicConstrainedTypes`, // regardless of the `publicConstrainedTypes` setting. diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputsInAllowList.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputsInAllowList.kt index 68840bde201..93bc55df128 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputsInAllowList.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputsInAllowList.kt @@ -26,9 +26,9 @@ import software.amazon.smithy.rust.codegen.server.smithy.hasConstraintTrait * Until we implement said mode, we manually attach the error to build these models, since we don't own them (they're * either actual AWS service model excerpts, or they come from the `awslabs/smithy` library. * - * [1]: https://github.com/awslabs/smithy-rs/pull/1199#discussion_r809424783 + * [1]: https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783 * - * TODO(https://github.com/awslabs/smithy-rs/issues/1401): This transformer will go away once we add support for + * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This transformer will go away once we add support for * `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors. */ object AttachValidationExceptionToConstrainedOperationInputsInAllowList { diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt index d2e41ead36a..fc938aab7a1 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt @@ -63,7 +63,7 @@ object RecursiveConstraintViolationBoxer { * Places where constraint violations are handled (like where unconstrained types are converted to constrained * types) must account for the scenario where they now are or need to be boxed. * - * [0] https://github.com/awslabs/smithy-rs/pull/2040 + * [0] https://github.com/smithy-lang/smithy-rs/pull/2040 */ fun transform(model: Model): Model = RecursiveShapeBoxer( containsIndirectionPredicate = ::constraintViolationLoopContainsIndirection, diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt index d4c6feaed64..114ffceae05 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt @@ -24,10 +24,10 @@ import software.amazon.smithy.rust.codegen.core.util.orNull * [AttachValidationExceptionToConstrainedOperationInputsInAllowList], ensures that it is replaced by * `smithy.framework#ValidationException`. * - * [0]: https://github.com/awslabs/smithy-rs/blob/274adf155042cde49251a0e6b8842d6f56cd5b6d/codegen-core/common-test-models/ebs.json#L1270-L1288 - * [1]: https://github.com/awslabs/smithy-rs/pull/1199#discussion_r809424783 + * [0]: https://github.com/smithy-lang/smithy-rs/blob/274adf155042cde49251a0e6b8842d6f56cd5b6d/codegen-core/common-test-models/ebs.json#L1270-L1288 + * [1]: https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783 * - * TODO(https://github.com/awslabs/smithy-rs/issues/1401): This transformer will go away once we implement + * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This transformer will go away once we implement * `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors. */ object RemoveEbsModelValidationException { diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProviderTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProviderTest.kt new file mode 100644 index 00000000000..ea5d63ab2c0 --- /dev/null +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProviderTest.kt @@ -0,0 +1,63 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy + +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test +import software.amazon.smithy.codegen.core.Symbol +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.model.shapes.Shape +import software.amazon.smithy.model.shapes.ShapeId +import software.amazon.smithy.model.transform.ModelTransformer +import software.amazon.smithy.rust.codegen.core.rustlang.RustType +import software.amazon.smithy.rust.codegen.core.smithy.rustType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.util.lookup +import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider + +class CustomShapeSymbolProviderTest { + private val baseModel = + """ + namespace test + + service TestService { + version: "1" + operations: [TestOperation] + } + + operation TestOperation { + input: TestInputOutput + output: TestInputOutput + } + + structure TestInputOutput { + myString: String, + } + """.asSmithyModel(smithyVersion = "2.0") + private val serviceShape = baseModel.lookup("test#TestService") + private val rustType = RustType.Opaque("fake-type") + private val symbol = Symbol.builder() + .name("fake-symbol") + .rustType(rustType) + .build() + private val model = ModelTransformer.create() + .mapShapes(baseModel) { + if (it is MemberShape) { + it.toBuilder().addTrait(SyntheticCustomShapeTrait(ShapeId.from("some#id"), symbol)).build() + } else { + it + } + } + private val symbolProvider = serverTestSymbolProvider(baseModel, serviceShape) + .let { CustomShapeSymbolProvider(it) } + + @Test + fun `override with custom symbol`() { + val shape = model.lookup("test#TestInputOutput\$myString") + symbolProvider.toSymbol(shape) shouldBe symbol + } +} diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt index 042aba71595..7a54849c208 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt @@ -20,7 +20,7 @@ class PatternTraitEscapedSpecialCharsValidatorTest { val exception = shouldThrow { """ namespace test - + @pattern("\t") string MyString """.asSmithyModel(smithyVersion = "2") @@ -32,7 +32,7 @@ class PatternTraitEscapedSpecialCharsValidatorTest { events[0].message shouldBe """ Non-escaped special characters used inside `@pattern`. You must escape them: `@pattern("\\t")`. - See https://github.com/awslabs/smithy-rs/issues/2508 for more details. + See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details. """.trimIndent() } @@ -41,7 +41,7 @@ class PatternTraitEscapedSpecialCharsValidatorTest { val exception = shouldThrow { """ namespace test - + @pattern("[.\n\\r]+") string MyString """.asSmithyModel(smithyVersion = "2") @@ -53,7 +53,7 @@ class PatternTraitEscapedSpecialCharsValidatorTest { events[0].message shouldBe """ Non-escaped special characters used inside `@pattern`. You must escape them: `@pattern("[.\\n\\r]+")`. - See https://github.com/awslabs/smithy-rs/issues/2508 for more details. + See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details. """.trimIndent() } @@ -62,16 +62,16 @@ class PatternTraitEscapedSpecialCharsValidatorTest { val exception = shouldThrow { """ namespace test - + @pattern("\b") string MyString - + @pattern("^\n$") string MyString2 - + @pattern("^[\n]+$") string MyString3 - + @pattern("^[\r\t]$") string MyString4 """.asSmithyModel(smithyVersion = "2") @@ -85,10 +85,10 @@ class PatternTraitEscapedSpecialCharsValidatorTest { val exception = shouldThrow { """ namespace test - + @pattern("\t") string MyString - + structure MyStructure { @pattern("\b") field: String @@ -109,10 +109,10 @@ class PatternTraitEscapedSpecialCharsValidatorTest { @pattern("\\t") string MyString - + @pattern("[.\\n\\r]+") string MyString2 - + @pattern("\\b\\f\\n\\r\\t") string MyString3 diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt index 5f47e10779a..edb4d9a6fc9 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt @@ -98,6 +98,6 @@ class UnconstrainedShapeSymbolProviderTest { val structureBShape = model.lookup("test#StructureB") unconstrainedShapeSymbolProvider.toSymbol(structureBShape).rustType().render() shouldBe "crate::model::StructureB" - unconstrainedShapeSymbolProvider.toSymbol(listAShape).rustType().render() shouldBe "::std::vec::Vec" + unconstrainedShapeSymbolProvider.toSymbol(listAShape).rustType().render() shouldBe "::std::vec::Vec::" } } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt index 3b9e0d4a7bf..444d75d2ad5 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt @@ -179,7 +179,7 @@ class ConstrainedCollectionGeneratorTest { project.withModule(ServerRustModule.Model) { render(codegenContext, this, shape) - val instantiator = serverInstantiator(codegenContext) + val instantiator = ServerInstantiator(codegenContext) for ((idx, validList) in testCase.validLists.withIndex()) { val shapeNameIdx = "${shapeName}_$idx" val buildValidFnName = "build_valid_$shapeNameIdx" diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt index cd833361242..d475ccbd37e 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt @@ -81,7 +81,7 @@ class ConstrainedMapGeneratorTest { project.withModule(ServerRustModule.Model) { render(codegenContext, this, constrainedMapShape) - val instantiator = serverInstantiator(codegenContext) + val instantiator = ServerInstantiator(codegenContext) rustBlock("##[cfg(test)] fn build_valid_map() -> std::collections::HashMap") { instantiator.render(this, constrainedMapShape, testCase.validMap) } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt index eb0ba5ed342..5e2f828e1b4 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt @@ -20,7 +20,7 @@ import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest import software.amazon.smithy.rust.codegen.core.testutil.unitTest -import software.amazon.smithy.rust.codegen.core.util.CommandFailed +import software.amazon.smithy.rust.codegen.core.util.CommandError import software.amazon.smithy.rust.codegen.core.util.lookup import software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule import software.amazon.smithy.rust.codegen.server.smithy.createTestInlineModuleCreator @@ -237,7 +237,7 @@ class ConstrainedStringGeneratorTest { ).render() } - assertThrows { + assertThrows { project.compileAndTest() } } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt index 1f685909f38..f36976e715e 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt @@ -11,7 +11,7 @@ import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrat class ServerBuilderConstraintViolationsTest { - // This test exists not to regress on [this](https://github.com/awslabs/smithy-rs/issues/2343) issue. + // This test exists not to regress on [this](https://github.com/smithy-lang/smithy-rs/issues/2343) issue. // We generated constraint violation variants, pointing to a structure (StructWithInnerDefault below), // but the structure was not constrained, because the structure's member have a default value // and default values are validated at generation time from the model. diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt index e8021ad9e74..966426f948d 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt @@ -53,7 +53,7 @@ class ServerBuilderDefaultValuesTest { "Float" to "0.5", "Double" to "0.55", "Timestamp" to "1985-04-12T23:20:50.52Z".dq(), - // "BigInteger" to "55555", "BigDecimal" to "0.555", // TODO(https://github.com/awslabs/smithy-rs/issues/312) + // "BigInteger" to "55555", "BigDecimal" to "0.555", // TODO(https://github.com/smithy-lang/smithy-rs/issues/312) "StringList" to "[]", "IntegerMap" to "{}", "Language" to "en".dq(), @@ -77,7 +77,7 @@ class ServerBuilderDefaultValuesTest { "Float" to "0.6", "Double" to "0.66", "Timestamp" to "2022-11-25T17:30:50.00Z".dq(), - // "BigInteger" to "55555", "BigDecimal" to "0.555", // TODO(https://github.com/awslabs/smithy-rs/issues/312) + // "BigInteger" to "55555", "BigDecimal" to "0.555", // TODO(https://github.com/smithy-lang/smithy-rs/issues/312) "StringList" to "[]", "IntegerMap" to "{}", "Language" to "fr".dq(), @@ -197,7 +197,7 @@ class ServerBuilderDefaultValuesTest { model.lookup("com.test#Language"), SmithyValidationExceptionConversionGenerator(codegenContext), ).render(writer) - StructureGenerator(model, symbolProvider, writer, struct, emptyList()).render() + StructureGenerator(model, symbolProvider, writer, struct, emptyList(), codegenContext.structSettings()).render() } private fun writeServerBuilderGenerator(rustCrate: RustCrate, writer: RustWriter, model: Model, symbolProvider: RustSymbolProvider) { @@ -220,7 +220,7 @@ class ServerBuilderDefaultValuesTest { model.lookup("com.test#Language"), SmithyValidationExceptionConversionGenerator(codegenContext), ).render(writer) - StructureGenerator(model, symbolProvider, writer, struct, emptyList()).render() + StructureGenerator(model, symbolProvider, writer, struct, emptyList(), codegenContext.structSettings()).render() } private fun structSetters(values: Map, optional: Boolean) = writable { diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt index 0ddbc1c5427..27e45c373c1 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt @@ -45,7 +45,7 @@ class ServerBuilderGeneratorTest { val writer = this val shape = model.lookup("test#Credentials") - StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList()).render() + StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList(), codegenContext.structSettings()).render() val builderGenerator = ServerBuilderGenerator( codegenContext, shape, diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt index 03555df93e4..5a6f9791518 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt @@ -5,19 +5,28 @@ package software.amazon.smithy.rust.codegen.server.smithy.generators +import io.kotest.matchers.string.shouldNotContain import org.junit.jupiter.api.Test import software.amazon.smithy.model.node.Node +import software.amazon.smithy.model.node.ObjectNode +import software.amazon.smithy.model.shapes.MemberShape +import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.core.rustlang.RustModule +import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter +import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.withBlock +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator import software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest +import software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder import software.amazon.smithy.rust.codegen.core.testutil.unitTest import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.lookup @@ -78,11 +87,13 @@ class ServerInstantiatorTest { int: Integer } + integer MyInteger + structure NestedStruct { @required str: String, @required - num: Integer + num: MyInteger } structure MyStructRequired { @@ -136,7 +147,7 @@ class ServerInstantiatorTest { val inner = model.lookup("com.test#Inner") val nestedStruct = model.lookup("com.test#NestedStruct") val union = model.lookup("com.test#NestedUnion") - val sut = serverInstantiator(codegenContext) + val sut = ServerInstantiator(codegenContext) val data = Node.parse("{}") val project = TestWorkspace.testProject() @@ -191,7 +202,7 @@ class ServerInstantiatorTest { @Test fun `generate named enums`() { val shape = model.lookup("com.test#NamedEnum") - val sut = serverInstantiator(codegenContext) + val sut = ServerInstantiator(codegenContext) val data = Node.parse("t2.nano".dq()) val project = TestWorkspace.testProject() @@ -214,7 +225,7 @@ class ServerInstantiatorTest { @Test fun `generate unnamed enums`() { val shape = model.lookup("com.test#UnnamedEnum") - val sut = serverInstantiator(codegenContext) + val sut = ServerInstantiator(codegenContext) val data = Node.parse("t2.nano".dq()) val project = TestWorkspace.testProject() @@ -233,4 +244,100 @@ class ServerInstantiatorTest { } project.compileAndTest() } + + @Test + fun `use direct instantiation and not the builder`() { + val shape = model.lookup("com.test#MyStruct") + val sut = ServerInstantiator(codegenContext) + val data = Node.parse("""{ "foo": "hello", "bar": 1, "baz": 42, "ts": 0, "byteValue": 0 }""") + + val writer = RustWriter.forModule(ServerRustModule.Model.name) + sut.render(writer, shape, data) + writer.toString() shouldNotContain "builder()" + } + + @Test + fun `uses writable for shapes`() { + val nestedStruct = model.lookup("com.test#NestedStruct") + val inner = model.lookup("com.test#Inner") + + val project = TestWorkspace.testProject(model) + nestedStruct.renderWithModelBuilder(model, symbolProvider, project) + inner.renderWithModelBuilder(model, symbolProvider, project) + project.moduleFor(nestedStruct) { + val nestedUnion = model.lookup("com.test#NestedUnion") + UnionGenerator(model, symbolProvider, this, nestedUnion).render() + + unitTest("writable_for_shapes") { + val sut = ServerInstantiator( + codegenContext, + customWritable = object : Instantiator.CustomWritable { + override fun generate(shape: Shape): Writable? = + if (model.lookup("com.test#NestedStruct\$num") == shape) { + writable("40 + 2") + } else { + null + } + }, + ) + val data = Node.parse("""{ "str": "hello", "num": 1 }""") + withBlock("let result = ", ";") { + sut.render(this, model.lookup("com.test#NestedStruct"), data as ObjectNode) + } + rust( + """ + assert_eq!(result.num, 42); + assert_eq!(result.str, "hello"); + """, + ) + } + + unitTest("writable_for_nested_inner_members") { + val map = model.lookup("com.test#Inner\$map") + val sut = ServerInstantiator( + codegenContext, + customWritable = object : Instantiator.CustomWritable { + private var n: Int = 0 + override fun generate(shape: Shape): Writable? = + if (shape != map) { + null + } else if (n != 2) { + n += 1 + null + } else { + n += 1 + writable("None") + } + }, + ) + val data = Node.parse( + """ + { + "map": { + "k1": { + "map": { + "k2": { + "map": { + "never": {} + } + } + } + } + } + } + """, + ) + + withBlock("let result = ", ";") { + sut.render(this, inner, data as ObjectNode) + } + rust( + """ + assert_eq!(result.map().unwrap().get("k1").unwrap().map().unwrap().get("k2").unwrap().map(), None); + """, + ) + } + } + project.compileAndTest(runClippy = true) + } } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt new file mode 100644 index 00000000000..6e110f96416 --- /dev/null +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt @@ -0,0 +1,39 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy.generators + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.testModule +import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest +import java.io.File + +internal class ServerServiceGeneratorTest { + /** + * See . + */ + @Test + fun `one should be able to return a built service from a function`() { + val model = File("../codegen-core/common-test-models/simple.smithy").readText().asSmithyModel() + + serverIntegrationTest(model) { _, rustCrate -> + rustCrate.testModule { + // No actual tests: we just want to check that this compiles. + rust( + """ + fn _build_service() -> crate::SimpleService { + let config = crate::SimpleServiceConfig::builder().build(); + let service = crate::SimpleService::builder(config).build_unchecked(); + + service.boxed() + } + """, + ) + } + } + } +} diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGeneratorTest.kt new file mode 100644 index 00000000000..c2c568b291c --- /dev/null +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGeneratorTest.kt @@ -0,0 +1,231 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy.generators + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.rust +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.rustlang.writable +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.testModule +import software.amazon.smithy.rust.codegen.core.testutil.unitTest +import software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency +import software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext +import software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator +import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest +import java.io.File + +internal class ServiceConfigGeneratorTest { + @Test + fun `it should inject an aws_auth method that configures an HTTP plugin and a model plugin`() { + val model = File("../codegen-core/common-test-models/simple.smithy").readText().asSmithyModel() + + val decorator = object : ServerCodegenDecorator { + override val name: String + get() = "AWSAuth pre-applied middleware decorator" + override val order: Byte + get() = -69 + + override fun configMethods(codegenContext: ServerCodegenContext): List { + val smithyHttpServer = ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType() + val codegenScope = arrayOf( + "SmithyHttpServer" to smithyHttpServer, + ) + return listOf( + ConfigMethod( + name = "aws_auth", + docs = "Docs", + params = listOf( + Binding("auth_spec", RuntimeType.String), + Binding("authorizer", RuntimeType.U64), + ), + errorType = RuntimeType.std.resolve("io::Error"), + initializer = Initializer( + code = writable { + rustTemplate( + """ + if authorizer != 69 { + return Err(std::io::Error::new(std::io::ErrorKind::Other, "failure 1")); + } + + if auth_spec.len() != 69 { + return Err(std::io::Error::new(std::io::ErrorKind::Other, "failure 2")); + } + let authn_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin; + let authz_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin; + """, + *codegenScope, + ) + }, + layerBindings = emptyList(), + httpPluginBindings = listOf( + Binding( + "authn_plugin", + smithyHttpServer.resolve("plugin::IdentityPlugin"), + ), + ), + modelPluginBindings = listOf( + Binding( + "authz_plugin", + smithyHttpServer.resolve("plugin::IdentityPlugin"), + ), + ), + ), + isRequired = true, + ), + ) + } + } + + serverIntegrationTest(model, additionalDecorators = listOf(decorator)) { _, rustCrate -> + rustCrate.testModule { + rust( + """ + use crate::{SimpleServiceConfig, SimpleServiceConfigError}; + use aws_smithy_http_server::plugin::IdentityPlugin; + use crate::server::plugin::PluginStack; + """, + ) + + unitTest("successful_config_initialization") { + rust( + """ + let _: SimpleServiceConfig< + tower::layer::util::Identity, + // One HTTP plugin has been applied. + PluginStack, + // One model plugin has been applied. + PluginStack, + > = SimpleServiceConfig::builder() + .aws_auth("a".repeat(69).to_owned(), 69) + .expect("failed to configure aws_auth") + .build() + .unwrap(); + """, + ) + } + + unitTest("wrong_aws_auth_auth_spec") { + rust( + """ + let actual_err = SimpleServiceConfig::builder() + .aws_auth("a".to_owned(), 69) + .unwrap_err(); + let expected = std::io::Error::new(std::io::ErrorKind::Other, "failure 2").to_string(); + assert_eq!(actual_err.to_string(), expected); + """, + ) + } + + unitTest("wrong_aws_auth_authorizer") { + rust( + """ + let actual_err = SimpleServiceConfig::builder() + .aws_auth("a".repeat(69).to_owned(), 6969) + .unwrap_err(); + let expected = std::io::Error::new(std::io::ErrorKind::Other, "failure 1").to_string(); + assert_eq!(actual_err.to_string(), expected); + """, + ) + } + + unitTest("aws_auth_not_configured") { + rust( + """ + let actual_err = SimpleServiceConfig::builder().build().unwrap_err(); + let expected = SimpleServiceConfigError::AwsAuthNotConfigured.to_string(); + assert_eq!(actual_err.to_string(), expected); + """, + ) + } + } + } + } + + @Test + fun `it should inject an method that applies three non-required layers`() { + val model = File("../codegen-core/common-test-models/simple.smithy").readText().asSmithyModel() + + val decorator = object : ServerCodegenDecorator { + override val name: String + get() = "ApplyThreeNonRequiredLayers" + override val order: Byte + get() = 69 + + override fun configMethods(codegenContext: ServerCodegenContext): List { + val identityLayer = RuntimeType.Tower.resolve("layer::util::Identity") + val codegenScope = arrayOf( + "Identity" to identityLayer, + ) + return listOf( + ConfigMethod( + name = "three_non_required_layers", + docs = "Docs", + params = emptyList(), + errorType = null, + initializer = Initializer( + code = writable { + rustTemplate( + """ + let layer1 = #{Identity}::new(); + let layer2 = #{Identity}::new(); + let layer3 = #{Identity}::new(); + """, + *codegenScope, + ) + }, + layerBindings = listOf( + Binding("layer1", identityLayer), + Binding("layer2", identityLayer), + Binding("layer3", identityLayer), + ), + httpPluginBindings = emptyList(), + modelPluginBindings = emptyList(), + ), + isRequired = false, + ), + ) + } + } + + serverIntegrationTest(model, additionalDecorators = listOf(decorator)) { _, rustCrate -> + rustCrate.testModule { + unitTest("successful_config_initialization_applying_the_three_layers") { + rust( + """ + let _: crate::SimpleServiceConfig< + // Three Tower layers have been applied. + tower::layer::util::Stack< + tower::layer::util::Identity, + tower::layer::util::Stack< + tower::layer::util::Identity, + tower::layer::util::Stack< + tower::layer::util::Identity, + tower::layer::util::Identity, + >, + >, + >, + aws_smithy_http_server::plugin::IdentityPlugin, + aws_smithy_http_server::plugin::IdentityPlugin, + > = crate::SimpleServiceConfig::builder() + .three_non_required_layers() + .build(); + """, + ) + } + + unitTest("successful_config_initialization_without_applying_the_three_layers") { + rust( + """ + crate::SimpleServiceConfig::builder().build(); + """, + ) + } + } + } + } +} diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt index 26f76db187f..d870d8c1b04 100644 --- a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt @@ -16,7 +16,7 @@ class ServerEventStreamUnmarshallerGeneratorTest { @ParameterizedTest @ArgumentsSource(TestCasesProvider::class) fun test(testCase: TestCase) { - // TODO(https://github.com/awslabs/smithy-rs/issues/1442): Enable tests for `publicConstrainedTypes = false` + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1442): Enable tests for `publicConstrainedTypes = false` // by deleting this if/return if (!testCase.publicConstrainedTypes) { return diff --git a/codegen-server/typescript/build.gradle.kts b/codegen-server/typescript/build.gradle.kts index b6dfa39a8f1..81f543c2220 100644 --- a/codegen-server/typescript/build.gradle.kts +++ b/codegen-server/typescript/build.gradle.kts @@ -82,5 +82,5 @@ publishing { artifact(sourcesJar) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt index 850af7b51af..885bac4a9a0 100644 --- a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt +++ b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt @@ -62,7 +62,7 @@ class NapiPackageJsonDecorator : ServerCodegenDecorator { val name = codegenContext.settings.moduleName.toSnakeCase() val version = codegenContext.settings.moduleVersion - // TODO(https://github.com/awslabs/smithy-rs/issues/2317): we should probably use a real JSON writer, but I did not want to add + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2317): we should probably use a real JSON writer, but I did not want to add // other external libraries at this stage. rustCrate.withFile("package.json") { val content = """{ diff --git a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt index 6384c5c07c3..88974f76d28 100644 --- a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt +++ b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt @@ -29,7 +29,7 @@ class TsServerOperationErrorGenerator( renderFromTsErr(writer) } - // TODO(https://github.com/awslabs/smithy-rs/issues/2317): match the Ts error type and return the right one. + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2317): match the Ts error type and return the right one. private fun renderFromTsErr(writer: RustWriter) { writer.rustTemplate( """ diff --git a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt index 87d8300ca73..cf08892bc9b 100644 --- a/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt +++ b/codegen-server/typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt @@ -13,6 +13,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rustInlineTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider +import software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings import software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.server.typescript.smithy.TsServerCargoDependency @@ -27,7 +28,7 @@ class TsServerStructureGenerator( private val symbolProvider: RustSymbolProvider, private val writer: RustWriter, private val shape: StructureShape, -) : StructureGenerator(model, symbolProvider, writer, shape, listOf()) { +) : StructureGenerator(model, symbolProvider, writer, shape, listOf(), StructSettings(flattenVecAccessors = false)) { private val napiDerive = TsServerCargoDependency.NapiDerive.toType() diff --git a/design/README.md b/design/README.md index 16778f2c90e..92940811eb5 100644 --- a/design/README.md +++ b/design/README.md @@ -1,4 +1,4 @@ -Design docs are hosted [here](https://awslabs.github.io/smithy-rs/design/). +Design docs are hosted [here](https://smithy-lang.github.io/smithy-rs/design/). To render design docs locally: ``` diff --git a/design/src/SUMMARY.md b/design/src/SUMMARY.md index ea3bcb65c96..5022659593f 100644 --- a/design/src/SUMMARY.md +++ b/design/src/SUMMARY.md @@ -6,6 +6,7 @@ - [Transport](transport/overview.md) - [HTTP Operations](transport/operation.md) - [HTTP Middleware](transport/middleware.md) + - [TLS Connector](transport/connector.md) - [Smithy](./smithy/overview.md) - [Simple Shapes](./smithy/simple_shapes.md) @@ -60,6 +61,12 @@ - [RFC-0032: Better Constraint Violations](./rfcs/rfc0032_better_constraint_violations.md) - [RFC-0033: Improving access to request IDs in SDK clients](./rfcs/rfc0033_improve_sdk_request_id_access.md) - [RFC-0034: Smithy Orchestrator](./rfcs/rfc0034_smithy_orchestrator.md) + - [RFC-0035: Collection Defaults](./rfcs/rfc0035_collection_defaults.md) + - [RFC-0036: HTTP Dependency Exposure](./rfcs/rfc0036_http_dep_elimination.md) + - [RFC-0037: The HTTP Wrapper](./rfcs/rfc0037_http_wrapper.md) + - [RFC-0038: User-configurable retry classification](./rfcs/rfc0038_retry_classifier_customization.md) + - [RFC-0039: Forward Compatible Errors](./rfcs/rfc0039_forward_compatible_errors.md) + - [RFC-0040: Behavior Versions](./rfcs/rfc0040_behavior_versions.md) - [Contributing](./contributing/overview.md) - [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md) diff --git a/design/src/client/identity_and_auth.md b/design/src/client/identity_and_auth.md index 87aa8b9c668..f7c69b6fd1e 100644 --- a/design/src/client/identity_and_auth.md +++ b/design/src/client/identity_and_auth.md @@ -34,17 +34,17 @@ There are two stages to identity and auth: First, let's establish the aspects of auth that can be configured from the model at codegen time. - **Data** - - **AuthOptionResolverParams:** parameters required to resolve auth options. These parameters are allowed + - **AuthSchemeOptionResolverParams:** parameters required to resolve auth scheme options. These parameters are allowed to come from both the client config and the operation input structs. - - **HttpAuthSchemes:** a list of auth schemes that can be used to sign HTTP requests. This information + - **AuthSchemes:** a list of auth schemes that can be used to sign HTTP requests. This information comes directly from the service model. - **AuthSchemeProperties:** configuration from the auth scheme for the signer. - **IdentityResolvers:** list of available identity resolvers. - **Implementations** - **IdentityResolver:** resolves an identity for use in authentication. There can be multiple identity resolvers that need to be selected from. - - **HttpRequestSigner:** a signing implementation that signs a HTTP request. - - **AuthOptionResolver:** resolves a list of auth options for a given operation and its inputs. + - **Signer:** a signing implementation that signs a HTTP request. + - **ResolveAuthSchemeOptions:** resolves a list of auth scheme options for a given operation and its inputs. As it is undocumented (at time of writing), this document assumes that the code generator creates one service-level runtime plugin, and an operation-level runtime plugin per operation, hence @@ -52,34 +52,34 @@ referred to as the service runtime plugin and operation runtime plugin. The code generator emits code to add identity resolvers and HTTP auth schemes to the config bag in the service runtime plugin. It then emits code to register an interceptor in the operation runtime -plugin that reads the operation input to generate the auth option resolver params (which also get added +plugin that reads the operation input to generate the auth scheme option resolver params (which also get added to the config bag). ### The execution stage At a high-level, the process of resolving an identity and signing a request looks as follows: -1. Retrieve the `AuthOptionResolverParams` from the config bag. The `AuthOptionResolverParams` allow client -config and operation inputs to play a role in which auth option is selected. -2. Retrieve the `AuthOptionResolver` from the config bag, and use it to resolve the auth options available -with the `AuthOptionResolverParams`. The returned auth options are in priority order. +1. Retrieve the `AuthSchemeOptionResolverParams` from the config bag. The `AuthSchemeOptionResolverParams` allow client +config and operation inputs to play a role in which auth scheme option is selected. +2. Retrieve the `ResolveAuthSchemeOptions` impl from the config bag, and use it to resolve the auth scheme options available +with the `AuthSchemeOptionResolverParams`. The returned auth scheme options are in priority order. 3. Retrieve the `IdentityResolvers` list from the config bag. -4. For each auth option: - 1. Attempt to find an HTTP auth scheme for that auth option in the config bag (from the `HttpAuthSchemes` list). +4. For each auth scheme option: + 1. Attempt to find an HTTP auth scheme for that auth scheme option in the config bag (from the `AuthSchemes` list). 2. If an auth scheme is found: 1. Use the auth scheme to extract the correct identity resolver from the `IdentityResolvers` list. - 2. Retrieve the `HttpRequestSigner` implementation from the auth scheme. + 2. Retrieve the `Signer` implementation from the auth scheme. 3. Use the `IdentityResolver` to resolve the identity needed for signing. 4. Sign the request with the identity, and break out of the loop from step #4. -In general, it is assumed that if an HTTP auth scheme exists for an auth option, then an identity resolver -also exists for that auth option. Otherwise, the auth option was configured incorrectly during codegen. +In general, it is assumed that if an HTTP auth scheme exists for an auth scheme option, then an identity resolver +also exists for that auth scheme option. Otherwise, the auth option was configured incorrectly during codegen. How this looks in Rust ---------------------- The client will use trait objects and dynamic dispatch for the `IdentityResolver`, -`HttpRequestSigner`, and `AuthOptionResolver` implementations. Generics could potentially be used, +`Signer`, and `AuthSchemeOptionResolver` implementations. Generics could potentially be used, but the number of generic arguments and trait bounds in the orchestrator would balloon to unmaintainable levels if each configurable implementation in it was made generic. @@ -87,38 +87,37 @@ These traits look like this: ```rust,ignore #[derive(Clone, Debug)] -pub struct HttpAuthOption { +pub struct AuthSchemeId { scheme_id: &'static str, - properties: Arc, } -pub trait AuthOptionResolver: Send + Sync + Debug { - fn resolve_auth_options<'a>( +pub trait ResolveAuthSchemeOptions: Send + Sync + Debug { + fn resolve_auth_scheme_options<'a>( &'a self, - params: &AuthOptionResolverParams, - ) -> Result, BoxError>; + params: &AuthSchemeOptionResolverParams, + ) -> Result, BoxError>; } pub trait IdentityResolver: Send + Sync + Debug { - // `identity_properties` come from `HttpAuthOption::properties` - fn resolve_identity(&self, identity_properties: &PropertyBag) -> BoxFallibleFut; + fn resolve_identity(&self, config: &ConfigBag) -> BoxFallibleFut; } -pub trait HttpRequestSigner: Send + Sync + Debug { +pub trait Signer: Send + Sync + Debug { /// Return a signed version of the given request using the given identity. /// /// If the provided identity is incompatible with this signer, an error must be returned. - fn sign_request( + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, - // `signing_properties` come from `HttpAuthOption::properties` - signing_properties: &PropertyBag, + auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, + config_bag: &ConfigBag, ) -> Result<(), BoxError>; } ``` -`IdentityResolver` and `HttpRequestSigner` implementations are both given an `Identity`, but +`IdentityResolver` and `Signer` implementations are both given an `Identity`, but will need to understand what the concrete data type underlying that identity is. The `Identity` struct uses a `Arc` to represent the actual identity data so that generics are not needed in the traits: @@ -137,11 +136,13 @@ will use downcasting to access the identity data types they understand. For exam it might look like the following: ```rust,ignore -fn sign_request( +fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, - signing_properties: &PropertyBag + auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, + config_bag: &ConfigBag, ) -> Result<(), BoxError> { let aws_credentials = identity.data::() .ok_or_else(|| "The SigV4 signer requires AWS credentials")?; @@ -181,8 +182,8 @@ The `expiration` field is a special case that is allowed onto the `Identity` str cache implementations will always need to be aware of this piece of information, and having it as an `Option` still allows for non-expiring identities. -Ultimately, this design constrains `HttpRequestSigner` implementations to concrete types. There is no world -where an `HttpRequestSigner` can operate across multiple unknown identity data types via trait, and that +Ultimately, this design constrains `Signer` implementations to concrete types. There is no world +where an `Signer` can operate across multiple unknown identity data types via trait, and that should be OK since the signer implementation can always be wrapped with an implementation that is aware of the concrete type provided by the identity resolver, and can do any necessary conversions. diff --git a/design/src/client/orchestrator.md b/design/src/client/orchestrator.md index d0330905bd6..a6f8cb1b8c0 100644 --- a/design/src/client/orchestrator.md +++ b/design/src/client/orchestrator.md @@ -206,6 +206,6 @@ Because RFCs become outdated as designs evolve. It is our intention to keep this [dynamic dispatch]: https://doc.rust-lang.org/book/ch17-02-trait-objects.html#trait-objects-perform-dynamic-dispatch [TypeId]: https://doc.rust-lang.org/stable/std/any/struct.TypeId.html [downcast]: https://en.wikipedia.org/wiki/Downcasting -[orchestrate-impl]: https://github.com/awslabs/smithy-rs/blob/8bc93fc04dd8c8d7447bfe3f5196a75cba0b10ba/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs#L23 -[aws-smithy-runtime]: https://github.com/awslabs/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime -[aws-smithy-runtime-api]: https://github.com/awslabs/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime-api +[orchestrate-impl]: https://github.com/smithy-lang/smithy-rs/blob/8bc93fc04dd8c8d7447bfe3f5196a75cba0b10ba/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs#L23 +[aws-smithy-runtime]: https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime +[aws-smithy-runtime-api]: https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime-api diff --git a/design/src/rfcs/overview.md b/design/src/rfcs/overview.md index e388ec49299..11d036d5354 100644 --- a/design/src/rfcs/overview.md +++ b/design/src/rfcs/overview.md @@ -43,3 +43,10 @@ - [RFC-0031: Providing Fallback Credentials on Timeout](./rfc0031_providing_fallback_credentials_on_timeout.md) - [RFC-0032: Better Constraint Violations](./rfc0032_better_constraint_violations.md) - [RFC-0033: Improving access to request IDs in SDK clients](./rfc0033_improve_sdk_request_id_access.md) +- [RFC-0034: The Orchestrator Architecture](./rfc0034_smithy_orchestrator.md) +- [RFC-0035: Sensible Defaults for Collection Values](./rfc0035_collection_defaults.md) +- [RFC-0036: Enabling HTTP crate upgrades in the future](./rfc0036_http_dep_elimination.md) +- [RFC-0037: The HTTP wrapper type](./rfc0037_http_wrapper.md) +- [RFC-0038: Retry Classifier Customization](./rfc0038_retry_classifier_customization.md) +- [RFC-0039: Forward Compatible Errors](./rfc0039_forward_compatible_errors.md) +- [RFC-0040: Behavior Versions](./rfc0040_behavior_versions.md) diff --git a/design/src/rfcs/rfc0003_presigning_api.md b/design/src/rfcs/rfc0003_presigning_api.md index c75230751c9..707c317c3aa 100644 --- a/design/src/rfcs/rfc0003_presigning_api.md +++ b/design/src/rfcs/rfc0003_presigning_api.md @@ -193,7 +193,7 @@ look for this synthetic trait when creating the fluent builders and inputs to kn If a presignable operation input has a member named `presigned`, then there will be a name collision with the function to generate a presigned URL. To mitigate this, `RustReservedWords` will be updated to rename the `presigned` member to `presigned_value` -[similar to how `send` is renamed](https://github.com/awslabs/smithy-rs/blob/3d61226b5d446f4cc20bf4969f0e56d106cf478b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L28). +[similar to how `send` is renamed](https://github.com/smithy-lang/smithy-rs/blob/3d61226b5d446f4cc20bf4969f0e56d106cf478b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L28). Changes Checklist ----------------- diff --git a/design/src/rfcs/rfc0004_retry_behavior.md b/design/src/rfcs/rfc0004_retry_behavior.md index 3da28afdc79..82f1914c017 100644 --- a/design/src/rfcs/rfc0004_retry_behavior.md +++ b/design/src/rfcs/rfc0004_retry_behavior.md @@ -174,7 +174,7 @@ Changes checklist ----------------- - [x] Create new Kotlin decorator `RetryConfigDecorator` - - Based on [RegionDecorator.kt](https://github.com/awslabs/smithy-rs/blob/main/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt) + - Based on [RegionDecorator.kt](https://github.com/smithy-lang/smithy-rs/blob/main/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt) - This decorator will live in the `codegen` project because it has relevance outside the SDK - [x] **Breaking changes:** - [x] Rename `aws_smithy_client::retry::Config` to `StandardRetryConfig` diff --git a/design/src/rfcs/rfc0006_service_specific_middleware.md b/design/src/rfcs/rfc0006_service_specific_middleware.md index a9c2a98c4d6..7f7670d5a7b 100644 --- a/design/src/rfcs/rfc0006_service_specific_middleware.md +++ b/design/src/rfcs/rfc0006_service_specific_middleware.md @@ -1,7 +1,7 @@ RFC: Service-specific middleware ================================ -> Status: [Implemented](https://github.com/awslabs/smithy-rs/pull/959) +> Status: [Implemented](https://github.com/smithy-lang/smithy-rs/pull/959) For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. diff --git a/design/src/rfcs/rfc0007_split_release_process.md b/design/src/rfcs/rfc0007_split_release_process.md index 368ed34e6fe..dfffe848cf7 100644 --- a/design/src/rfcs/rfc0007_split_release_process.md +++ b/design/src/rfcs/rfc0007_split_release_process.md @@ -1,7 +1,7 @@ RFC: Split Release Process ========================== -> Status: Implemented in [smithy-rs#986](https://github.com/awslabs/smithy-rs/pull/986) and [aws-sdk-rust#351](https://github.com/awslabs/aws-sdk-rust/pull/351) +> Status: Implemented in [smithy-rs#986](https://github.com/smithy-lang/smithy-rs/pull/986) and [aws-sdk-rust#351](https://github.com/awslabs/aws-sdk-rust/pull/351) At the time of writing, the `aws-sdk-rust` repository is used exclusively for the entire release process of both the Rust runtime crates from `smithy-rs` as diff --git a/design/src/rfcs/rfc0009_example_consolidation.md b/design/src/rfcs/rfc0009_example_consolidation.md index 296151b4041..207265e763c 100644 --- a/design/src/rfcs/rfc0009_example_consolidation.md +++ b/design/src/rfcs/rfc0009_example_consolidation.md @@ -5,7 +5,7 @@ RFC: Examples Consolidation Currently, the AWS Rust SDK's examples are duplicated across [`awslabs/aws-sdk-rust`](https://github.com/awslabs/aws-sdk-rust), -[`awslabs/smithy-rs`](https://github.com/awslabs/smithy-rs), +[`smithy-lang/smithy-rs`](https://github.com/smithy-lang/smithy-rs), and [`awsdocs/aws-doc-sdk-examples`](https://github.com/awsdocs/aws-doc-sdk-examples). The `smithy-rs` repository was formerly the source of truth for examples, with the examples being copied over to `aws-sdk-rust` as part of the release diff --git a/design/src/rfcs/rfc0010_waiters.md b/design/src/rfcs/rfc0010_waiters.md index 3d0f80b2918..24886d52de5 100644 --- a/design/src/rfcs/rfc0010_waiters.md +++ b/design/src/rfcs/rfc0010_waiters.md @@ -184,4 +184,4 @@ Changes Checklist - [ ] Codegen `classify_result()` functions based on JMESPath expressions in Smithy model [Smithy waiter specification]: https://awslabs.github.io/smithy/1.0/spec/waiters.html -[default `RetryHandler` uses in `aws-smithy-client`]: https://github.com/awslabs/smithy-rs/blob/main/rust-runtime/aws-smithy-client/src/retry.rs#L252-L292 +[default `RetryHandler` uses in `aws-smithy-client`]: https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-client/src/retry.rs#L252-L292 diff --git a/design/src/rfcs/rfc0011_crates_io_alpha_publishing.md b/design/src/rfcs/rfc0011_crates_io_alpha_publishing.md index 967d19f1e39..b5e9e73eea2 100644 --- a/design/src/rfcs/rfc0011_crates_io_alpha_publishing.md +++ b/design/src/rfcs/rfc0011_crates_io_alpha_publishing.md @@ -114,8 +114,8 @@ The new release process would be: ### Short-term Changes Checklist -- [x] Prepare runtime crate manifests for publication to crates.io (https://github.com/awslabs/smithy-rs/pull/755) -- [x] Update SDK generator to set correct crate versions (https://github.com/awslabs/smithy-rs/pull/755) +- [x] Prepare runtime crate manifests for publication to crates.io (https://github.com/smithy-lang/smithy-rs/pull/755) +- [x] Update SDK generator to set correct crate versions (https://github.com/smithy-lang/smithy-rs/pull/755) - [x] Write bulk publish script - [x] Write bulk yank script - [x] Write automation to sync smithy-rs to aws-sdk-rust diff --git a/design/src/rfcs/rfc0012_independent_crate_versioning.md b/design/src/rfcs/rfc0012_independent_crate_versioning.md index b64dc2b88ac..d0c0241714b 100644 --- a/design/src/rfcs/rfc0012_independent_crate_versioning.md +++ b/design/src/rfcs/rfc0012_independent_crate_versioning.md @@ -222,4 +222,4 @@ per semver. At that point, no further API breaking changes can be made without a [aws-sdk-rust]: https://github.com/awslabs/aws-sdk-rust [rust-semverver]: https://github.com/rust-lang/rust-semverver [semver]: https://semver.org/ -[smithy-rs]: https://github.com/awslabs/smithy-rs +[smithy-rs]: https://github.com/smithy-lang/smithy-rs diff --git a/design/src/rfcs/rfc0013_body_callback_apis.md b/design/src/rfcs/rfc0013_body_callback_apis.md index ea9b024c1d6..93eedb3f7b7 100644 --- a/design/src/rfcs/rfc0013_body_callback_apis.md +++ b/design/src/rfcs/rfc0013_body_callback_apis.md @@ -292,5 +292,5 @@ In order to use this in a request, we'd modify codegen for that request's servic - (if streaming) we'd set the checksum callback on the request body object - (if non-streaming) we'd immediately read the body and call `BodyCallback::update` manually. Once all data was read, we'd get the checksum by calling `trailers` and insert that data as a request header. -[ByteStream impls]: https://github.com/awslabs/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/byte_stream.rs#L205 -[SdkBody impls]: https://github.com/awslabs/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/body.rs#L71 +[ByteStream impls]: https://github.com/smithy-lang/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/byte_stream.rs#L205 +[SdkBody impls]: https://github.com/smithy-lang/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/body.rs#L71 diff --git a/design/src/rfcs/rfc0014_timeout_config.md b/design/src/rfcs/rfc0014_timeout_config.md index 52b1496ec0f..776c60104a3 100644 --- a/design/src/rfcs/rfc0014_timeout_config.md +++ b/design/src/rfcs/rfc0014_timeout_config.md @@ -261,12 +261,12 @@ Changes are broken into to sections: [hjr3/hyper-timeout]: https://github.com/hjr3/hyper-timeout [sfackler/tokio-io-timeout]: https://github.com/sfackler/tokio-io-timeout [tower_service::Service]: https://docs.rs/tower-service/0.3.1/tower_service/trait.Service.html -[AwsMiddleware]: https://github.com/awslabs/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/aws/rust-runtime/aws-hyper/src/lib.rs#L29 -[MapRequest]: https://github.com/awslabs/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L122 -[AsyncMapRequest]: https://github.com/awslabs/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L42 -[ParseResponse]: https://github.com/awslabs/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/parse_response.rs#L27 -[DynConnect]: https://github.com/awslabs/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/rust-runtime/aws-smithy-client/src/erase.rs#L139 +[AwsMiddleware]: https://github.com/smithy-lang/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/aws/rust-runtime/aws-hyper/src/lib.rs#L29 +[MapRequest]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L122 +[AsyncMapRequest]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L42 +[ParseResponse]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/parse_response.rs#L27 +[DynConnect]: https://github.com/smithy-lang/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/rust-runtime/aws-smithy-client/src/erase.rs#L139 [Connect]: https://docs.rs/hyper/0.14.14/hyper/client/connect/trait.Connect.html [tower::layer::util::Stack]: https://docs.rs/tower/0.4.10/tower/layer/util/struct.Stack.html -[aws_smithy_client::Client::call_raw]: https://github.com/awslabs/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-client/src/lib.rs#L175 -[Layers can produce compiler errors]: https://github.com/awslabs/smithy-rs/issues/634 +[aws_smithy_client::Client::call_raw]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-client/src/lib.rs#L175 +[Layers can produce compiler errors]: https://github.com/smithy-lang/smithy-rs/issues/634 diff --git a/design/src/rfcs/rfc0015_using_features_responsibly.md b/design/src/rfcs/rfc0015_using_features_responsibly.md index 336b25ca80f..3afd19e4e71 100644 --- a/design/src/rfcs/rfc0015_using_features_responsibly.md +++ b/design/src/rfcs/rfc0015_using_features_responsibly.md @@ -80,7 +80,7 @@ impl ClientBuilder<(), M, R> { Both features can now be enabled at once without creating a conflict. Since both methods have different names, it's now Ok for them to have different return types. -[*This is real code, see it in context*](https://github.com/awslabs/smithy-rs/blob/2e7ed943513203f1472f2490866dc4fb8a392bd3/rust-runtime/aws-smithy-client/src/hyper_ext.rs#L303) +[*This is real code, see it in context*](https://github.com/smithy-lang/smithy-rs/blob/2e7ed943513203f1472f2490866dc4fb8a392bd3/rust-runtime/aws-smithy-client/src/hyper_ext.rs#L303) ### We should avoid using `#[cfg(not(feature = "some-feature"))]` @@ -130,12 +130,12 @@ For an example: Say you have a crate with features `a`, `b`, `c` that all provid - [Mutually exclusive features are present in profiling-procmacros][profiling#32] - [Clang-sys features not additive][clang-sys#128] -[aws-sigv4]: https://github.com/awslabs/smithy-rs/blob/5a1990791d727652587df51b77df4d1df9058252/aws/rust-runtime/aws-sigv4/Cargo.toml +[aws-sigv4]: https://github.com/smithy-lang/smithy-rs/blob/5a1990791d727652587df51b77df4d1df9058252/aws/rust-runtime/aws-sigv4/Cargo.toml [aws-sdk-s3]: https://github.com/awslabs/aws-sdk-rust/blob/f2b4361b004ee822960ea9791f566fd4eb6d1aba/sdk/s3/Cargo.toml [Cargo Book section on features]: https://doc.rust-lang.org/cargo/reference/features.html [SemVer-incompatible change]: https://doc.rust-lang.org/cargo/reference/features.html#semver-compatibility [remove rustls from crate graph]: https://github.com/awslabs/aws-sdk-rust/issues/304 -[remove default features from runtime crates]: https://github.com/awslabs/smithy-rs/pull/935 +[remove default features from runtime crates]: https://github.com/smithy-lang/smithy-rs/pull/935 [cfg! macro]: https://doc.rust-lang.org/rust-by-example/attribute/cfg.html [How to tell what "features" are available per crate?]: https://stackoverflow.com/questions/59761045/how-to-tell-what-features-are-available-per-crate [How do I 'pass down' feature flags to subdependencies in Cargo?]: https://stackoverflow.com/questions/40021555/how-do-i-pass-down-feature-flags-to-subdependencies-in-cargo @@ -144,4 +144,4 @@ For an example: Say you have a crate with features `a`, `b`, `c` that all provid [profiling#32]: https://github.com/aclysma/profiling/issues/32 [clang-sys#128]: https://github.com/KyleMayes/clang-sys/issues/128 [compile-time errors]: https://doc.rust-lang.org/stable/std/macro.compile_error.html -[native-tls example]: https://github.com/awslabs/smithy-rs/tree/bc316a0b81b75a00c389f6281a66eb0f5357172a/aws/sdk/examples/using_native_tls_instead_of_rustls +[native-tls example]: https://github.com/smithy-lang/smithy-rs/tree/bc316a0b81b75a00c389f6281a66eb0f5357172a/aws/sdk/examples/using_native_tls_instead_of_rustls diff --git a/design/src/rfcs/rfc0018_logging_sensitive.md b/design/src/rfcs/rfc0018_logging_sensitive.md index 9598c823c4a..27f94f1a1da 100644 --- a/design/src/rfcs/rfc0018_logging_sensitive.md +++ b/design/src/rfcs/rfc0018_logging_sensitive.md @@ -8,7 +8,7 @@ Smithy provides a [sensitive trait](https://awslabs.github.io/smithy/1.0/spec/co This RFC is concerned with solving the problem of honouring this specification in the context of logging. -Progress has been made towards this goal in the form of the [Sensitive Trait PR](https://github.com/awslabs/smithy-rs/pull/229), which uses code generation to remove sensitive fields from `Debug` implementations. +Progress has been made towards this goal in the form of the [Sensitive Trait PR](https://github.com/smithy-lang/smithy-rs/pull/229), which uses code generation to remove sensitive fields from `Debug` implementations. The problem remains open due to the existence of HTTP binding traits and a lack of clearly defined user guidelines which customers may follow to honour the specification. @@ -222,7 +222,7 @@ These wrappers should be provided alongside the `Sensitive` struct described in ### Middleware Position -This logging middleware should be applied outside of the [OperationHandler](https://github.com/awslabs/smithy-rs/blob/cd0563020abcde866a741fa123e3f2e18e1be1c9/rust-runtime/inlineable/src/server_operation_handler_trait.rs#L17-L21) after its construction in the (generated) `operation_registry.rs` file. The middleware should preserve the associated types of the `OperationHandler` (`Response = Response`, `Error = Infallible`) to cause minimal disruption. +This logging middleware should be applied outside of the [OperationHandler](https://github.com/smithy-lang/smithy-rs/blob/cd0563020abcde866a741fa123e3f2e18e1be1c9/rust-runtime/inlineable/src/server_operation_handler_trait.rs#L17-L21) after its construction in the (generated) `operation_registry.rs` file. The middleware should preserve the associated types of the `OperationHandler` (`Response = Response`, `Error = Infallible`) to cause minimal disruption. An easy position to apply the logging middleware is illustrated below in the form of `Logging{Operation}::new`: @@ -238,7 +238,7 @@ let routes = vec![ let router = aws_smithy_http_server::routing::Router::new_rest_json_router(routes); ``` -Although an acceptable first step, putting logging middleware here is suboptimal - the `Router` allows a `tower::Layer` to be applied to the operation by using the [Router::layer](https://github.com/awslabs/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L146) method. This middleware will be applied _outside_ of the logging middleware and, as a result, will not be subject to the span of any middleware. Therefore, the `Router` must be changed to allow for middleware to be applied within the logging middleware rather than outside of it. +Although an acceptable first step, putting logging middleware here is suboptimal - the `Router` allows a `tower::Layer` to be applied to the operation by using the [Router::layer](https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L146) method. This middleware will be applied _outside_ of the logging middleware and, as a result, will not be subject to the span of any middleware. Therefore, the `Router` must be changed to allow for middleware to be applied within the logging middleware rather than outside of it. This is a general problem, not specific to this proposal. For example, [Use Request Extensions](#use-request-extensions) must also solve this problem. @@ -255,7 +255,7 @@ In the case of AWS JSON 1.0 and 1.1 protocols, the request URI is always `/`, pu A guideline should be made available, which includes: - The [HTTP bindings traits](#http-binding-traits) and why they are of concern in the presence of `@sensitive`. -- The [Debug implementation](https://github.com/awslabs/smithy-rs/pull/229) on structures. +- The [Debug implementation](https://github.com/smithy-lang/smithy-rs/pull/229) on structures. - How to use the `Sensitive` struct, HTTP wrappers, and the `unredacted-logging` feature flag described in [Debug Logging](#debug-logging) and [HTTP Debug/Display Wrappers](#http-debugdisplay-wrappers). - A warning against the two potential leaks described in [Scope and Guidelines](#scope-and-guidelines): - Sensitive data leaking from third-party dependencies. @@ -395,12 +395,12 @@ Code generation would be need to be used in order to produce the filtering crite ## Changes Checklist - [x] Implement and integrate code generated logging middleware. - - + - - [x] Add logging to `Router` implementation. - - + - - [x] Write developer guideline. - - + - - [x] Refactor `Router` to allow for better positioning described in [Middleware Position](#middleware-position). - - - - - - + - + - + - diff --git a/design/src/rfcs/rfc0019_event_streams_errors.md b/design/src/rfcs/rfc0019_event_streams_errors.md index 83311d902e7..78fd98228e4 100644 --- a/design/src/rfcs/rfc0019_event_streams_errors.md +++ b/design/src/rfcs/rfc0019_event_streams_errors.md @@ -46,7 +46,7 @@ In order to implement this feature: * Errors need to be marshalled and unmarshalled * `Receiver` must treat any error coming from the other end as terminal -The code examples below have been generated using the [following model](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server-test/model/pokemon.smithy#L27): +The code examples below have been generated using the [following model](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server-test/model/pokemon.smithy#L27): ```smithy @http(uri: "/capture-pokemon-event/{region}", method: "POST") operation CapturePokemonOperation { @@ -148,18 +148,18 @@ pub enum AttemptCapturingPokemonEventError { } ``` -Both are modeled as normal errors, where the [name](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) comes from `Error` with a prefix of the union's name. -In fact, both the [client](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L71) and [server](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L46) +Both are modeled as normal errors, where the [name](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) comes from `Error` with a prefix of the union's name. +In fact, both the [client](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L71) and [server](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L46) generate operation errors and event stream errors the same way. -Event stream errors have their own [marshaller](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt#L39). +Event stream errors have their own [marshaller](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt#L39). To make it work for users to stream errors, `EventStreamSender<>`, in addition to the union type `T`, takes an error type `E`; that is, the `AttemptCapturingPokemonEventError` in the example. -This means that an error from the stream is [marshalled and sent](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L137) as a data structure similarly to the union's non-error members. +This means that an error from the stream is [marshalled and sent](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L137) as a data structure similarly to the union's non-error members. -On the other side, the `Receiver<>` needs to terminate the stream upon [receiving any error](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L249). -A terminated stream has [no more data](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L38) and will always be a [bug](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L54) to use it. +On the other side, the `Receiver<>` needs to terminate the stream upon [receiving any error](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L249). +A terminated stream has [no more data](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L38) and will always be a [bug](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L54) to use it. -An example of how errors can be used on clients, extracted from [this test](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http-server/examples/pokemon_service/tests/simple_integration_test.rs#L100): +An example of how errors can be used on clients, extracted from [this test](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http-server/examples/pokemon_service/tests/simple_integration_test.rs#L100): ```rust,ignore yield Err(AttemptCapturingPokemonEventError::new( AttemptCapturingPokemonEventErrorKind::MasterBallUnsuccessful(MasterBallUnsuccessful::builder().build()), diff --git a/design/src/rfcs/rfc0020_service_builder.md b/design/src/rfcs/rfc0020_service_builder.md index c6e18b9c102..fb9cad79cbb 100644 --- a/design/src/rfcs/rfc0020_service_builder.md +++ b/design/src/rfcs/rfc0020_service_builder.md @@ -79,7 +79,7 @@ pub trait Handler { Its purpose is to provide an even interface over closures of the form `FnOnce({Operation}Input) -> impl Future` and `FnOnce({Operation}Input, State) -> impl Future`. It's this abstraction which allows the customers to supply both `async fn handler(input: {Operation}Input) -> {Operation}Output` and `async fn handler(input: {Operation}Input, state: Extension) -> {Operation}Output` to the service builder. -We generate `Handler` implementations for said closures in [ServerOperationHandlerGenerator.kt](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt): +We generate `Handler` implementations for said closures in [ServerOperationHandlerGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt): ```rust,ignore impl Handler<(), Operation0Input> for Fun @@ -116,7 +116,7 @@ where } ``` -Creating `{Operation}Input` from a `http::Request` and `http::Response` from a `{Operation}Output` involves protocol aware serialization/deserialization, for example, it can involve the [HTTP binding traits](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html). The [RuntimeError](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/runtime_error.rs#L53-L5) enumerates error cases such as serialization/deserialization failures, `extensions().get::()` failures, etc. We omit error handling in the snippet above, but, in full, it also involves protocol aware conversions from the `RuntimeError` to `http::Response`. The reader should make note of the influence of the model on the different sections of this procedure. +Creating `{Operation}Input` from a `http::Request` and `http::Response` from a `{Operation}Output` involves protocol aware serialization/deserialization, for example, it can involve the [HTTP binding traits](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html). The [RuntimeError](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/runtime_error.rs#L53-L5) enumerates error cases such as serialization/deserialization failures, `extensions().get::()` failures, etc. We omit error handling in the snippet above, but, in full, it also involves protocol aware conversions from the `RuntimeError` to `http::Response`. The reader should make note of the influence of the model on the different sections of this procedure. The `request.extensions().get::()` present in the `Fun: FnOnce(Operation0Input, Extension) -> Fut` implementation is the current approach to injecting state into handlers. The customer is required to apply a [AddExtensionLayer](https://docs.rs/tower-http/latest/tower_http/add_extension/struct.AddExtensionLayer.html) to the output of the service builder so that, when the request reaches the handler, the `extensions().get::()` will succeed. @@ -147,7 +147,7 @@ where ### Builder -The service builder we provide to the customer is the `OperationRegistryBuilder`, generated from [ServerOperationRegistryGenerator.kt](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt). +The service builder we provide to the customer is the `OperationRegistryBuilder`, generated from [ServerOperationRegistryGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt). Currently, the reference model would generate the following `OperationRegistryBuilder` and `OperationRegistry`: @@ -221,7 +221,7 @@ where ### Router -The [aws_smithy_http::routing::Router](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L58-L60) provides the protocol aware routing of requests to their target , it exists as +The [aws_smithy_http::routing::Router](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L58-L60) provides the protocol aware routing of requests to their target , it exists as ```rust,ignore pub struct Route { @@ -739,7 +739,7 @@ Recall the form of the `Service::call` method, given in [Router](#router), which Two downsides of modelling `Router` in this way are: - `Router` is larger and has more branches than a protocol specific implementation. -- If a third-party wanted to extend `smithy-rs` to additional protocols `Routes` would have to be extended. A synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/awslabs/smithy-rs/issues/1606) issue. +- If a third-party wanted to extend `smithy-rs` to additional protocols `Routes` would have to be extended. A synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/smithy-lang/smithy-rs/issues/1606) issue. After taking the [Switch `From for Router` to an `OperationRegistry::build` method](#switch-fromoperationregistry-for-router-to-an-operationregistrybuild-method) transform, code generation is free to switch between return types based on the model. This allows for a scenario where a `@restJson1` causes the service builder to output a specific `RestJson1Router`. @@ -747,17 +747,17 @@ After taking the [Switch `From for Router` to an `OperationRe Currently, protocol specific routing errors are either: -- Converted to `RuntimeError`s and then `http::Response` (see [unknown_operation](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L106-L118)). -- Converted directly to a `http::Response` (see [method_not_allowed](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L121-L127)). This is an outlier to the common pattern. +- Converted to `RuntimeError`s and then `http::Response` (see [unknown_operation](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L106-L118)). +- Converted directly to a `http::Response` (see [method_not_allowed](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L121-L127)). This is an outlier to the common pattern. -The `from_request` functions yield protocol specific errors which are converted to `RequestRejection`s then `RuntimeError`s (see [ServerHttpBoundProtocolGenerator.kt](https://github.com/awslabs/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L194-L210)). +The `from_request` functions yield protocol specific errors which are converted to `RequestRejection`s then `RuntimeError`s (see [ServerHttpBoundProtocolGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L194-L210)). In these scenarios protocol specific errors are converted into `RuntimeError` before being converted to a `http::Response` via `into_response` method. Two downsides of this are: - `RuntimeError` enumerates all possible errors across all existing protocols, so is larger than modelling the errors for a specific protocol. -- If a third-party wanted to extend `smithy-rs` to additional protocols with differing failure modes `RuntimeError` would have to be extended. As in [Protocol specific Errors](#protocol-specific-errors), a synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/awslabs/smithy-rs/issues/1606) issue. +- If a third-party wanted to extend `smithy-rs` to additional protocols with differing failure modes `RuntimeError` would have to be extended. As in [Protocol specific Errors](#protocol-specific-errors), a synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/smithy-lang/smithy-rs/issues/1606) issue. Switching from using `RuntimeError` to protocol specific errors which satisfy a common interface, `IntoResponse`, would resolve these problem. @@ -857,11 +857,11 @@ A toy implementation of the combined proposal is presented in [this PR](https:// ## Changes Checklist - [x] Add protocol specific routers to `rust-runtime/aws-smithy-http-server`. - - + - - [x] Add middleware primitives and error types to `rust-runtime/aws-smithy-http-server`. - - + - - [x] Add code generation which outputs new service builder. - - + - - [x] Deprecate `OperationRegistryBuilder`, `OperationRegistry` and `Router`. - - - - + - + - diff --git a/design/src/rfcs/rfc0023_refine_builder.md b/design/src/rfcs/rfc0023_refine_builder.md index 1c0b6f9786d..59e2808352c 100644 --- a/design/src/rfcs/rfc0023_refine_builder.md +++ b/design/src/rfcs/rfc0023_refine_builder.md @@ -782,13 +782,13 @@ The API proposed in this RFC has been manually implemented for the Pokemon servi ## Changes checklist - [x] Update `codegen-server` to generate the proposed service builder API - - + - - [x] Implement `Pluggable` for `PluginStack` - - + - - [x] Evaluate the introduction of a `PluginBuilder` as the primary API to compose multiple plugins (instead of `PluginStack::new(IdentityPlugin, IdentityPlugin).apply(...)`) - - + - [RFC 20]: rfc0020_service_builder.md -[Pokemon service]: https://github.com/awslabs/smithy-rs/blob/c7ddb164b28b920313432789cfe05d8112a035cc/codegen-core/common-test-models/pokemon.smithy +[Pokemon service]: https://github.com/smithy-lang/smithy-rs/blob/c7ddb164b28b920313432789cfe05d8112a035cc/codegen-core/common-test-models/pokemon.smithy [typestate builder pattern]: https://www.greyblake.com/blog/builder-with-typestate-in-rust/ [^further-dev-productivity-improvements]: The impact of a runtime error on developer productivity can be further minimised by encouraging adoption of integration testing; this can be achieved, among other options, by authoring guides that highlight its benefits and provide implementation guidance. diff --git a/design/src/rfcs/rfc0025_constraint_traits.md b/design/src/rfcs/rfc0025_constraint_traits.md index e3aaa323190..f6b446c0f46 100644 --- a/design/src/rfcs/rfc0025_constraint_traits.md +++ b/design/src/rfcs/rfc0025_constraint_traits.md @@ -10,8 +10,8 @@ RFC: Constraint traits > > See the uber [tracking issue] for pending work. -[builders-of-builders]: https://github.com/awslabs/smithy-rs/pull/1342 -[tracking issue]: https://github.com/awslabs/smithy-rs/issues/1401 +[builders-of-builders]: https://github.com/smithy-lang/smithy-rs/pull/1342 +[tracking issue]: https://github.com/smithy-lang/smithy-rs/issues/1401 [Constraint traits] are used to constrain the values that can be provided for a shape. @@ -74,7 +74,7 @@ The only constraint trait enforcement that is generated by smithy-rs clients should be and is the `enum` trait, which renders Rust `enum`s. The `required` trait is already and only enforced by smithy-rs servers since -[#1148](https://github.com/awslabs/smithy-rs/pull/1148). +[#1148](https://github.com/smithy-lang/smithy-rs/pull/1148). That leaves 4 traits: `length`, `pattern`, `range`, and `uniqueItems`. @@ -293,7 +293,7 @@ We will enforce this by copying _references_ to the `Vec`'s elements into a [`aws_smithy_types::Blob`]: https://docs.rs/aws-smithy-types/latest/aws_smithy_types/struct.Blob.html [`aws_smithy_http_server::rejection::SmithyRejection`]: https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/rejection/enum.SmithyRejection.html [`aws_smithy_http_server::rejection::Deserialize`]: https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/rejection/struct.Deserialize.html -[#1187]: https://github.com/awslabs/smithy-rs/issues/1187 +[#1187]: https://github.com/smithy-lang/smithy-rs/issues/1187 [`once_cell`]: https://docs.rs/once_cell/latest/once_cell/ Trait precedence and naming of the tuple struct @@ -359,7 +359,7 @@ Unresolved questions - UPDATE: We decided to punt on this until users express interest. [`NonZeroU64`]: https://doc.rust-lang.org/std/num/struct.NonZeroU64.html -[Better Constraint Violations]: https://github.com/awslabs/smithy-rs/pull/2040 +[Better Constraint Violations]: https://github.com/smithy-lang/smithy-rs/pull/2040 Alternative design ------------------ diff --git a/design/src/rfcs/rfc0027_endpoints_20.md b/design/src/rfcs/rfc0027_endpoints_20.md index 90739d347bb..b936c07aadc 100644 --- a/design/src/rfcs/rfc0027_endpoints_20.md +++ b/design/src/rfcs/rfc0027_endpoints_20.md @@ -474,7 +474,7 @@ class EndpointParamsDecorator( #### Loading values for builtIns The fundamental point of builtIn values is enabling _other_ code generators to define where these values come from. -Because of that, we will need to expose the ability to customize builtIns. One way to do this is with a new +Because of that, we will need to expose the ability to customize AwsBuiltIns. One way to do this is with a new customization type, `EndpointCustomization`: ```kotlin diff --git a/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md b/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md index 719f2ef9fd3..d197d8bac74 100644 --- a/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md +++ b/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md @@ -1,7 +1,7 @@ RFC: SDK Credential Cache Type Safety ===================================== -> Status: Implemented in [smithy-rs#2122](https://github.com/awslabs/smithy-rs/pull/2122) +> Status: Implemented in [smithy-rs#2122](https://github.com/smithy-lang/smithy-rs/pull/2122) > > Applies to: AWS SDK for Rust diff --git a/design/src/rfcs/rfc0029_new_home_for_cred_types.md b/design/src/rfcs/rfc0029_new_home_for_cred_types.md index e864bd7d5bc..ab0b638b3a1 100644 --- a/design/src/rfcs/rfc0029_new_home_for_cred_types.md +++ b/design/src/rfcs/rfc0029_new_home_for_cred_types.md @@ -1,11 +1,11 @@ RFC: Finding New Home for Credential Types =================================================== -> Status: Implemented in [smithy-rs#2108](https://github.com/awslabs/smithy-rs/pull/2108) +> Status: Implemented in [smithy-rs#2108](https://github.com/smithy-lang/smithy-rs/pull/2108) > > Applies to: clients -This RFC supplements [RFC 28](https://github.com/awslabs/smithy-rs/blob/main/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md) and discusses for the selected design where to place the types for credentials providers, credentials caching, and everything else that comes with them. +This RFC supplements [RFC 28](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md) and discusses for the selected design where to place the types for credentials providers, credentials caching, and everything else that comes with them. It is assumed that the primary motivation behind the introduction of type safe credentials caching remains the same as the preceding RFC. diff --git a/design/src/rfcs/rfc0030_serialization_and_deserialization.md b/design/src/rfcs/rfc0030_serialization_and_deserialization.md index 46ad1a4cb6f..58aeaaf38ab 100644 --- a/design/src/rfcs/rfc0030_serialization_and_deserialization.md +++ b/design/src/rfcs/rfc0030_serialization_and_deserialization.md @@ -38,7 +38,7 @@ Lastly, we emphasize that this RFC does NOT aim to serialize the entire response Users have requested `serde` traits to be implemented on data types implemented in rust SDK. We have created this RFC with the following use cases in mind. 1. [[request]: Serialize/Deserialize of models for Lambda events #269](https://github.com/awslabs/aws-sdk-rust/issues/269) -2. [Tests](https://awslabs.github.io/smithy-rs/design/faq.html#why-dont-the-sdk-service-crates-implement-serdeserialize-or-serdedeserialize-for-any-types) as suggested in the design FAQ. +2. [Tests](https://smithy-lang.github.io/smithy-rs/design/faq.html#why-dont-the-sdk-service-crates-implement-serdeserialize-or-serdedeserialize-for-any-types) as suggested in the design FAQ. 3. Building tools # Feature Gate diff --git a/design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md b/design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md index f6e76e87a8e..a02aa68b502 100644 --- a/design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md +++ b/design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md @@ -1,6 +1,6 @@ RFC: Providing fallback credentials on external timeout ======================================================= -> Status: Implemented in [smithy-rs#2246](https://github.com/awslabs/smithy-rs/pull/2246) +> Status: Implemented in [smithy-rs#2246](https://github.com/smithy-lang/smithy-rs/pull/2246) > > Applies to: client diff --git a/design/src/rfcs/rfc0032_better_constraint_violations.md b/design/src/rfcs/rfc0032_better_constraint_violations.md index 6b44d27835c..4c7b777541d 100644 --- a/design/src/rfcs/rfc0032_better_constraint_violations.md +++ b/design/src/rfcs/rfc0032_better_constraint_violations.md @@ -21,9 +21,9 @@ Note: code snippets from generated SDKs in this document are abridged so as to be didactic and relevant to the point being made. They are accurate with regards to commit [`2226fe`]. -[constraint-traits-rfc]: https://github.com/awslabs/smithy-rs/pull/1199 -[builders-of-builders-pr]: https://github.com/awslabs/smithy-rs/pull/1342 -[`2226fe`]: https://github.com/awslabs/smithy-rs/tree/2226feff8f7fa884204f81a50d7e016386912acc +[constraint-traits-rfc]: https://github.com/smithy-lang/smithy-rs/pull/1199 +[builders-of-builders-pr]: https://github.com/smithy-lang/smithy-rs/pull/1342 +[`2226fe`]: https://github.com/smithy-lang/smithy-rs/tree/2226feff8f7fa884204f81a50d7e016386912acc [constraint traits]: https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html Terminology @@ -244,7 +244,7 @@ docs, nor have to `match` on these variants when handling errors. Note: [this comment] alludes to the problem described above. -[this comment]: https://github.com/awslabs/smithy-rs/blob/27020be3421fb93e35692803f9a795f92feb1d19/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt#L66-L69 +[this comment]: https://github.com/smithy-lang/smithy-rs/blob/27020be3421fb93e35692803f9a795f92feb1d19/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt#L66-L69 ### Solution proposal @@ -276,7 +276,7 @@ pub mod length_map { ``` Note that, to some extent, the spirit of this approach is [already currently -present](https://github.com/awslabs/smithy-rs/blob/9a4c1f304f6f5237d480cfb56dad2951d927d424/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt#L78-L81) +present](https://github.com/smithy-lang/smithy-rs/blob/9a4c1f304f6f5237d480cfb56dad2951d927d424/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt#L78-L81) in the case of builder types when `publicConstrainedTypes` is set to `false`: 1. [`ServerBuilderGenerator.kt`] renders the usual builder type that enforces @@ -286,8 +286,8 @@ in the case of builder types when `publicConstrainedTypes` is set to `false`: builder type the user is exposed to: this builder does not take in constrained types and does not enforce all modeled constraints. -[`ServerBuilderGenerator.kt`]: https://github.com/awslabs/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt -[`ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt`]: https://github.com/awslabs/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt +[`ServerBuilderGenerator.kt`]: https://github.com/smithy-lang/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt +[`ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt`]: https://github.com/smithy-lang/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt Collecting constraint violations -------------------------------- @@ -342,7 +342,7 @@ list ValidationExceptionFieldList { ``` It was mentioned in the [constraint traits -RFC](https://github.com/awslabs/smithy-rs/pull/1199#discussion_r809300673), and +RFC](https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809300673), and implicit in the definition of Smithy's [`smithy.framework.ValidationException`](https://github.com/awslabs/smithy/blob/main/smithy-validation-model/model/smithy.framework.validation.smithy) shape, that server frameworks should respond with a _complete_ collection of @@ -392,7 +392,7 @@ impl LengthPatternString { pub fn compile_regex() -> &'static regex::Regex { static REGEX: once_cell::sync::Lazy = once_cell::sync::Lazy::new(|| { - regex::Regex::new(r#"[a-f0-5]*"#).expect(r#"The regular expression [a-f0-5]* is not supported by the `regex` crate; feel free to file an issue under https://github.com/awslabs/smithy-rs/issues for support"#) + regex::Regex::new(r#"[a-f0-5]*"#).expect(r#"The regular expression [a-f0-5]* is not supported by the `regex` crate; feel free to file an issue under https://github.com/smithy-lang/smithy-rs/issues for support"#) }); ®EX @@ -518,7 +518,7 @@ due to performance concerns. This RFC advocates for implementing the first option, arguing that [it's fair to say that the framework should return an error that is as informative as possible, but it doesn't necessarily have to be -complete](https://github.com/awslabs/smithy-rs/pull/2040#discussion_r1036226762). +complete](https://github.com/smithy-lang/smithy-rs/pull/2040#discussion_r1036226762). However, we will also write a layer, applied by default to all server SDKs, that bounds a request body's size to a reasonable (yet high) default. Relying on users to manually apply the layer is dangerous, since such a configuration diff --git a/design/src/rfcs/rfc0033_improve_sdk_request_id_access.md b/design/src/rfcs/rfc0033_improve_sdk_request_id_access.md index 9ec673248c5..488b5f324de 100644 --- a/design/src/rfcs/rfc0033_improve_sdk_request_id_access.md +++ b/design/src/rfcs/rfc0033_improve_sdk_request_id_access.md @@ -1,7 +1,7 @@ RFC: Improving access to request IDs in SDK clients =================================================== -> Status: Implemented in [#2129](https://github.com/awslabs/smithy-rs/pull/2129) +> Status: Implemented in [#2129](https://github.com/smithy-lang/smithy-rs/pull/2129) > > Applies to: AWS SDK clients diff --git a/design/src/rfcs/rfc0035_collection_defaults.md b/design/src/rfcs/rfc0035_collection_defaults.md new file mode 100644 index 00000000000..2237c02b2b2 --- /dev/null +++ b/design/src/rfcs/rfc0035_collection_defaults.md @@ -0,0 +1,82 @@ + +RFC: Collection Defaults +============= + + +> Status: Implemented +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC proposes a **breaking change** to how generated clients automatically provide default values for collections. Currently the SDK generated fields for `List` generate optional values: +```rust,ignore + ///

Container for elements related to a particular part. + pub fn parts(&self) -> Option<&[crate::types::Part]> { + self.parts.as_deref() + } +``` +This is _almost never_ what users want and leads to code noise when using collections: +```rust,ignore +async fn get_builds() { + let project = codebuild + .list_builds_for_project() + .project_name(build_project) + .send() + .await?; + let build_ids = project + .ids() + .unwrap_or_default(); + // ^^^^^^^^^^^^^^^^^^ this is pure noise +} +``` + +This RFC proposes unwrapping into default values in our accessor methods. + + +Terminology +----------- + +- **Accessor**: The Rust SDK defines accessor methods on modeled structures for fields to make them more convenient for users +- **Struct field**: The accessors point to concrete fields on the struct itself. + + +The user experience if this RFC is implemented +---------------------------------------------- + +In the current version of the SDK, users must call `.unwrap_or_default()` frequently. +Once this RFC is implemented, users will be able to use these accessors directly. In the rare case where users need to +distinguish be `None` and `[]`, we will direct users towards `model..is_some()`. + +```rust,ignore +async fn get_builds() { + let project = codebuild + .list_builds_for_project() + .project_name(build_project) + .send() + .await?; + let build_ids = project.ids(); + // Goodbye to this line: + // .unwrap_or_default(); +} +``` + + +How to actually implement this RFC +---------------------------------- + +In order to implement this feature, we need update the code generate accessors for lists and maps to add `.unwrap_or_default()`. Because we are returning slices `unwrap_or_default()` does not produce any additional allocations for empty collection. + +### Could this be implemented for `HashMap`? +This works for lists because we are returning a slice (allowing a statically owned `&[]` to be returned.) If we want to support HashMaps in the future this _is_ possible by using `OnceCell` to create empty HashMaps for requisite types. This would allow us to return references to those empty maps. + +### Isn't this handled by the default trait? +No, many existing APIs don't have the default trait. + +Changes checklist +----------------- +Estimated total work: 2 days +- [x] Update accessor method generation to auto flatten lists +- [x] Update docs for accessors to guide users to `.field.is_some()` if they MUST determine if the field was set. diff --git a/design/src/rfcs/rfc0036_http_dep_elimination.md b/design/src/rfcs/rfc0036_http_dep_elimination.md new file mode 100644 index 00000000000..5c47d680fa5 --- /dev/null +++ b/design/src/rfcs/rfc0036_http_dep_elimination.md @@ -0,0 +1,120 @@ + +RFC: Eliminating Public `http` dependencies +============= + +> Status: Accepted +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC defines how we plan to refactor the SDK to allow the SDK to consume a `1.0` version of `hyper`, `http-body`, +and `http` at a later date. Currently, `hyper` is `0.14.x` and a `1.0` release candidate series is in progress. However, +there are [open questions](https://github.com/orgs/hyperium/projects/1/views/4) that may significantly delay the launch +of +these three crates. We do not want to tie the `1.0` of the Rust SDK to these crates. + + +Terminology +----------- + +- **http-body**: A crate (and trait) defining how HTTP bodies work. Notably, the change from `0.*` to `1.0` changes `http-body` + to operate on frames instead of having separate methods. +- `http` (crate): a low level crate of `http` primitives (no logic, just requests and responses) +- ossified dependency: An ossified dependency describes a dependency that, when a new version is released, cannot be utilized without breaking changes. For example, if the `mutate_request` function on every operation operates on `&mut http::Request` where `http = 0.2`, that dependency is "ossified." Compare this to a function that offers the ability to convert something into an `http = 0.2` request—since http=1 and http=0.2 are largely equivalent, the + existence of this function does not prevent us from using http = 1 in the future. In general terms, **functions that operate on references are much more likely to ossify**—There is no practical way for someone to mutate an `http = 0.2` request if you have an `http = 1` request other than a time-consuming clone, and reconversion process. + + + +## Why is this important? + +**Performance**: +At some point in the Future, `hyper = 1`, `http = 1` and `http-body = 1` will be released. It takes ~1-2 microseconds to rebuild an HTTP request. If we assume that `hyper = 1` will only operate on `http = 1` requests, then if we can't use `http = 1` requests internally, our only way of supporting `hyper = 1` will be to convert the HTTP request at dispatch time. Besides pinning us to a potentially unsupported version of the HTTP crate, this will prevent us from directly dispatching requests in an efficient manner. With a total overhead of 20µs for the SDK, 1µs is not insignificant. Furthermore, it grows as the number of request headers grow. A benchmark should be run for a realistic HTTP request e.g. one that we send to S3. + +**Hyper Upgrade**: +Hyper 1 is significantly more flexible than Hyper 0.14.x, especially WRT to connection management & pooling. If we don't make these changes, the upgrade to Hyper 1.x could be significantly more challenging. + +**Security Fixes**: +If we're still on `http = 0.*` and a vulnerability is identified, we may end up needing to manually contribute the patch. The `http` crate is not trivial and contains parsing logic and optimized code (including a non-trivial amount of `unsafe`). [See this GitHub issue](https://github.com/hyperium/http/issues/412). Notable is that one issue may be unsound and result in changing the public API. + +**API Friendliness** +If we ship with an API that public exposes customers to `http = 0.*`, we have the API forever. We have to consider that we aren't shipping the Rust SDK for this month or even this year but probably the Rust SDK for the next 5-10 years. + +**Future CRT Usage** +If we make this change, we enable a future where we can use the CRT HTTP request type natively without needing a last minute conversion to the CRT HTTP Request type. +```rust,ignore +struct HttpRequest { + inner: Inner +} + +enum Inner { + Httpv0(http_0::Request), + Httpv1(http_1::Request), + Crt(aws_crt_http::Request) +} +``` + +The user experience if this RFC is implemented +---------------------------------------------- +Customers are impacted in 3 main locations: +1. HTTP types in Interceptors +2. HTTP types in `customize(...)` +3. HTTP types in Connectors + +In all three of these cases, users would interact with our `http` wrapper types instead. + + +In the current version of the SDK, we expose public dependencies on the `http` crate in several key places: + +1. The `sigv4` crate. The `sigv4` crate currently operates directly on many types from the `http` crate. This is unnecessary and actually makes the crate more difficult to use. Although `http` may be used internally, `http` will be removed from the public API of this crate. +2. Interceptor Context: `interceptor`s can mutate the HTTP request through an unshielded interface. This requires creating a [wrapper layer around `http::Request`](#http-request-wrapper) and updating already written interceptors. +3. `aws-config`: `http::Response` and `uri` +4. A long tail of exposed requests and responses in the runtime crates. Many of these crates will be removed post-orchestrator so this can be temporarily delayed. + + +How to actually implement this RFC +---------------------------------- + +### Enabling API evolution +One key mechanism that we SHOULD use for allowing our APIs to evolve in the future is usage of `~` version bounds for the runtime crates after releasing 1.0. + +### Http Request Wrapper + +In order to enable HTTP evolution, we will create a set of wrapper structures around `http::Request` and `http::Response`. These will use `http = 0` internally. Since the HTTP crate itself is quite small, including private dependencies on both versions of the crate is a workable solution. In general, we will aim for an API that is close to drop-in compatible to the HTTP crate while ensuring that a different crate could be used as the backing storage. + +```rust,ignore +// since it's our type, we can default `SdkBody` +pub struct Request { + // this uses the http = 0.2 request. In the future, we can make an internal enum to allow storing an http = 1 + http_0: http::Request +} +``` + +**Conversion to/from `http::Request`** +One key property here is that although converting to/from an `http::Request` **can** be expensive, this is *not* ossification of the API. This is because the API can support converting from/to both `http = 0` and `http = 1` in the future—because it offers mutation of the request via a unified interface, the request would only need to be converted once for dispatch if there was a mismatch (instead of repeatedly). At some point in the future, the `http = 0` representation could be deprecated and removed or feature gated. + +**Challenges** +1. Creating an HTTP API which is forwards compatible, idiomatic and "truthful" without relying on existing types from Hyper—e.g. when adding a header, we need to account for the possibility that a header is invalid. +2. Allow for future forwards-compatible evolution in the API—A lot of thought went into the `http` crate API w.r.t method parameters, types, and generics. Although we can aim for a simpler solution in some cases (e.g. accepting `&str` instead of `HeaderName`), we need to be careful that we do so while allowing API evolution. + +### Removing the SigV4 HTTP dependency +The SigV4 crate signs a number of `HTTP` types directly. We should change it to accept strings, and when appropriate, iterators of strings for headers. + +### Removing the HTTP dependency from generated clients +Generated clients currently include a public HTTP dependency in `customize`. This should be changed to accept our `HTTP` wrapper type instead or be restricted to a subset of operations (e.g. `add_header`) while forcing users to add an interceptor if they need full control. + + + +Changes checklist +----------------- + +- [ ] Create the `http::Request` wrapper. Carefully audit for compatibility without breaking changes. 5 Days. +- [ ] Refactor currently written interceptors to use the wrapper: 2 days. +- [ ] Refactor the SigV4 crate to remove the HTTP dependency from the public interface: 2 days. +- [ ] Add / validate support for SdkBody `http-body = 1.0rc.2` either in a PR or behind a feature gate. Test this to + ensure it works with Hyper. Some previous work here exists: 1 week +- [ ] Remove `http::Response` and `Uri` from the public exposed types in `aws-config`: 1-4 days. +- [ ] Long tail of other usages: 1 week +- [ ] Implement `~` versions for SDK Crate => runtime crate dependencies: 1 week diff --git a/design/src/rfcs/rfc0037_http_wrapper.md b/design/src/rfcs/rfc0037_http_wrapper.md new file mode 100644 index 00000000000..6c1e1ac14c3 --- /dev/null +++ b/design/src/rfcs/rfc0037_http_wrapper.md @@ -0,0 +1,111 @@ + +RFC: The HTTP Wrapper Type +============= + + +> Status: RFC +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC defines the API of our wrapper types around `http::Request` and `http::Response`. For more information about why we are wrapping these types, see [RFC 0036: The HTTP Dependency](./rfc0036_http_dep_elimination.md). + + +Terminology +----------- +- `Extensions` / "Request Extensions": The `http` crate Request/Response types include a typed property bag to store additional metadata along with the request. + + +The user experience if this RFC is implemented +---------------------------------------------- + +In the current version of the SDK, external customers and internal code interacts directly with the [`http`](https://crates.io/crates/http) crate. Once this RFC is implemented, interactions at the **public** API level will occur with our own `http` types instead. + +Our types aim to be nearly drop-in-compatible for types in the `http` crate, however: +1. We will not expose existing HTTP types in public APIs in ways that are ossified. +2. When possible, we aim to simplify the APIs to make them easier to use. +3. We will add SDK specific helper functionality when appropriate, e.g. first-level support for applying an endpoint to a request. + + +How to actually implement this RFC +---------------------------------- + +We will need to add two types, `HttpRequest` and `HttpResponse`. + +#### To string or not to String +Our header library restricts header names and values to `String`s (UTF-8). + +Although the `http` library is very precise in its representation—it allows for `HeaderValue`s that are both a super and subset of `String`—a superset because headers support arbitrary binary data but a subset because headers cannot contain control characters like `\n`. + +Although technically allowed, headers containing arbitrary binary data are not widely supported. Generally, Smithy protocols will use base-64 encoding when storing binary data in headers. + +Finally, it's nicer for users if they can stay in "string land". Because of this, HttpRequest and Response expose header names and values as strings. Internally, the current design uses `HeaderName` and `HeaderValue`, however, there is a gate on construction that enforces that values are valid UTF-8. + +**This is a one way door because `.as_str()` would panic in the future if we allow non-string values into headers.** + +#### Where should these types live? +These types will be used by all orchestrator functionality, so they will be housed in `aws-smithy-runtime-api` + +#### What's in and what's out? +At the onset, these types focus on supporting the most ossified usages: `&mut` modification of HTTP types. They **do not** +support construction of HTTP types, other than `impl From` and `From`. We will also make it +possible to use `http::HeaderName` / `http::HeaderValue` in a zero-cost way. + +#### The `AsHeaderComponent` trait +All header insertion methods accept `impl AsHeaderComponent`. This allows us to provide a nice user experience while taking +advantage of zero-cost usage of `'static str`. We will seal this trait to prevent external usage. We will have separate implementation for: +- `&'static str` +- `String` +- http02x::HeaderName + +#### Additional Functionality +Our wrapper type will add the following additional functionality: + +1. Support for `self.try_clone()` +2. Support for `&mut self.apply_endpoint(...)` + +#### Handling failure +There is no stdlib type that cleanly defines what may be placed into headers—String is too broad (even if we restrict to ASCII). This RFC proposes moving fallibility to the APIs: +```rust,ignore +impl HeadersMut<'_> { + pub fn try_insert( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Result, BoxError> { + // ... + } +} +``` + +This allows us to offer user-friendly types while still avoiding runtime panics. We also offer `insert` and `append` which panic on invalid values. + +#### Request Extensions +There is ongoing work which MAY restrict HTTP extensions to clone types. We will preempt that by: +1. Preventing `Extensions` from being present when initially constructing our HTTP request wrapper. +2. Forbidding non-clone extensions from being inserted into the wrapped request. + +This also enables supporting request extensions for different downstream providers by allowing cloning into different extension types. + +#### Proposed Implementation +

+Proposed Implementation of `request` + +```rust,ignore +{{#include ../../../rust-runtime/aws-smithy-runtime-api/src/client/http/request.rs}} +``` +
+ +### Future Work +Currently, the only way to construct `Request` is from a compatible type (e.g. `http02x::Request`) + +Changes checklist +----------------- +- [x] Implement initial implementation and test it against the SDK as written +- [ ] Add test suite of `HTTP` wrapper +- [ ] External design review +- [x] Update the SigV4 crate to remove `http` API dependency +- [ ] Update the SDK to use the new type (breaking change) diff --git a/design/src/rfcs/rfc0038_retry_classifier_customization.md b/design/src/rfcs/rfc0038_retry_classifier_customization.md new file mode 100644 index 00000000000..ecbbbd3ad52 --- /dev/null +++ b/design/src/rfcs/rfc0038_retry_classifier_customization.md @@ -0,0 +1,429 @@ +# RFC: User-configurable retry classification + +> Status: Implemented +> +> Applies to: client + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + +This RFC defines the user experience and implementation of user-configurable +retry classification. Custom retry classifiers enable users to change what +responses are retried while still allowing them to rely on defaults set by SDK +authors when desired. +## Terminology + +- **Smithy Service**: An HTTP service, whose API is modeled with the [Smithy + IDL](https://www.smithy.io). +- **Smithy Client**: An HTTP client generated by smithy-rs from a `.smithy` + model file. +- **AWS SDK**: A **smithy client** that's specifically configured to work with + an AWS service. +- **Operation**: A modeled interaction with a service, defining the proper input + and expected output shapes, as well as important metadata related to request + construction. "Sending" an operation implies sending one or more HTTP requests + to a **Smithy service**, and then receiving an output or error in response. +- **Orchestrator**: The client code which manages the request/response pipeline. + The orchestrator is responsible for: + - Constructing, serializing, and sending requests. + - Receiving, deserializing, and (optionally) retrying requests. + - Running interceptors *(not covered in this RFC)* and handling errors. +- **Runtime Component**: A part of the orchestrator responsible for a specific + function. Runtime components are used by the orchestrator itself, may depend + on specific configuration, and must not be changed by interceptors. Examples + include the endpoint resolver, retry strategy, and request signer. +- **Runtime Plugin**: Code responsible for setting and **runtime components** + and related configuration. Runtime plugins defined by codegen are responsible + for setting default configuration and altering the behavior of **Smithy + clients** including the **AWS SDKs**. + +## How the orchestrator should model retries + +A **Retry Strategy** is the process by which the orchestrator determines when +and how to retry failed requests. Only one retry strategy may be set at any +given time. During its operation, the retry strategy relies on a series of +**Retry Classifiers** to determine if and how a failed request should be +retried. Retry classifiers each have a **Retry Classifier Priority** so that +regardless of whether they are set during config or operation construction, +they'll always run in a consistent order. + +Classifiers are each run in turn by the retry strategy: + +```rust,ignore +pub fn run_classifiers_on_ctx( + classifiers: impl Iterator, + ctx: &InterceptorContext, +) -> RetryAction { + // By default, don't retry + let mut result = RetryAction::NoActionIndicated; + + for classifier in classifiers { + let new_result = classifier.classify_retry(ctx); + + // If the result is `NoActionIndicated`, continue to the next classifier + // without overriding any previously-set result. + if new_result == RetryAction::NoActionIndicated { + continue; + } + + // Otherwise, set the result to the new result. + tracing::trace!( + "Classifier '{}' set the result of classification to '{}'", + classifier.name(), + new_result + ); + result = new_result; + + // If the result is `RetryForbidden`, stop running classifiers. + if result == RetryAction::RetryForbidden { + tracing::trace!("retry classification ending early because a `RetryAction::RetryForbidden` was emitted",); + break; + } + } + + result +} +``` + +*NOTE: User-defined retry strategies are responsible for calling `run_classifiers_on_ctx`.* + +Lower-priority classifiers run first, but the retry actions they return may be +overridden by higher-priority classifiers. Classification stops immediately if +any classifier returns `RetryAction::RetryForbidden`. + +## The user experience if this RFC is implemented + +In the current version of the SDK, users are unable to configure retry +classification, except by defining a custom retry strategy. Once this RFC is +implemented, users will be able to define and set their own classifiers. + +### Defining a custom classifier + +```rust,ignore +#[derive(Debug)] +struct CustomRetryClassifier; + +impl ClassifyRetry for CustomRetryClassifier { + fn classify_retry( + &self, + ctx: &InterceptorContext, + ) -> Option { + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + let error = match output_or_error { + // Typically, when the response is OK or unset + // then `RetryAction::NoActionIndicated` is returned. + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + todo!("inspect the error to determine if a retry attempt should be made.") + } + + fn name(&self) -> &'static str { "my custom retry classifier" } + + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::default() + } +} +``` + +#### Choosing a retry classifier priority + +Sticking with the default priority is often the best choice. Classifiers should +restrict the number of cases they can handle in order to avoid having to compete +with other classifiers. When two classifiers would classify a response in two +different ways, the priority system gives us the ability to decide which +classifier should be respected. + +Internally, priority is implemented with a simple numeric system. In order to +give the smithy-rs team the flexibility to make future changes, this numeric +system is private and inaccessible to users. Instead, users may set the priority +of classifiers relative to one another with the `with_lower_priority_than` and +`with_higher_priority_than` methods: + +```rust,ignore +impl RetryClassifierPriority { + /// Create a new `RetryClassifierPriority` with lower priority than the given priority. + pub fn with_lower_priority_than(other: Self) -> Self { ... } + + /// Create a new `RetryClassifierPriority` with higher priority than the given priority. + pub fn with_higher_priority_than(other: Self) -> Self { ... } +} +``` + +For example, if it was important for our `CustomRetryClassifier` in the previous +example to run *before* the default `HttpStatusCodeClassifier`, a user would +define the `CustomRetryClassifier` priority like this: + +```rust,ignore +impl ClassifyRetry for CustomRetryClassifier { + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::run_before(RetryClassifierPriority::http_status_code_classifier()) + } +} +``` + +The priorities of the three default retry classifiers +(`HttpStatusCodeClassifier`, `ModeledAsRetryableClassifier`, and +`TransientErrorClassifier`) are all public for this purpose. Users may **ONLY** +set a retry priority relative to an existing retry priority. + + +#### `RetryAction` and `RetryReason` + +Retry classifiers communicate to the retry strategy by emitting `RetryAction`s: + +```rust,ignore +/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`]. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug, Default)] +pub enum RetryAction { + /// When a classifier can't run or has no opinion, this action is returned. + /// + /// For example, if a classifier requires a parsed response and response parsing failed, + /// this action is returned. If all classifiers return this action, no retry should be + /// attempted. + #[default] + NoActionIndicated, + /// When a classifier runs and thinks a response should be retried, this action is returned. + RetryIndicated(RetryReason), + /// When a classifier runs and decides a response must not be retried, this action is returned. + /// + /// This action stops retry classification immediately, skipping any following classifiers. + RetryForbidden, +} +``` + +When a retry is indicated by a classifier, the action will contain a `RetryReason`: + +```rust,ignore +/// The reason for a retry. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum RetryReason { + /// When an error is received that should be retried, this reason is returned. + RetryableError { + /// The kind of error. + kind: ErrorKind, + /// A server may tell us to retry only after a specific time has elapsed. + retry_after: Option, + }, +} +``` + +*NOTE: `RetryReason` currently only has a single variant, but it's defined as an `enum` for [forward compatibility] purposes.* + +`RetryAction`'s `impl` defines several convenience methods: + +```rust,ignore +impl RetryAction { + /// Create a new `RetryAction` indicating that a retry is necessary. + pub fn retryable_error(kind: ErrorKind) -> Self { + Self::RetryIndicated(RetryReason::RetryableError { + kind, + retry_after: None, + }) + } + + /// Create a new `RetryAction` indicating that a retry is necessary after an explicit delay. + pub fn retryable_error_with_explicit_delay(kind: ErrorKind, retry_after: Duration) -> Self { + Self::RetryIndicated(RetryReason::RetryableError { + kind, + retry_after: Some(retry_after), + }) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a transient error. + pub fn transient_error() -> Self { + Self::retryable_error(ErrorKind::TransientError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a throttling error. + pub fn throttling_error() -> Self { + Self::retryable_error(ErrorKind::ThrottlingError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a server error. + pub fn server_error() -> Self { + Self::retryable_error(ErrorKind::ServerError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a client error. + pub fn client_error() -> Self { + Self::retryable_error(ErrorKind::ClientError) + } +} +``` + +### Setting classifiers + +The interface for setting classifiers is very similar to the interface of +settings interceptors: + +```rust,ignore +// All service configs support these setters. Operations support a nearly identical API. +impl ServiceConfigBuilder { + /// Add type implementing ClassifyRetry that will be used by the RetryStrategy + /// to determine what responses should be retried. + /// + /// A retry classifier configured by this method will run according to its priority. + pub fn retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { + self.push_retry_classifier(SharedRetryClassifier::new(retry_classifier)); + self + } + + /// Add a SharedRetryClassifier that will be used by the RetryStrategy to + /// determine what responses should be retried. + /// + /// A retry classifier configured by this method will run according to its priority. + pub fn push_retry_classifier(&mut self, retry_classifier: SharedRetryClassifier) -> &mut Self { + self.runtime_components.push_retry_classifier(retry_classifier); + self + } + + /// Set SharedRetryClassifiers for the builder, replacing any that were + /// previously set. + pub fn set_retry_classifiers(&mut self, retry_classifiers: impl IntoIterator) -> &mut Self { + self.runtime_components.set_retry_classifiers(retry_classifiers.into_iter()); + self + } +} +``` + +### Default classifiers + +Smithy clients have three classifiers enabled by default: + +- `ModeledAsRetryableClassifier`: Checks for errors that are marked as retryable + in the smithy model. If one is encountered, returns + `RetryAction::RetryIndicated`. Requires a parsed response. +- `TransientErrorClassifier`: Checks for timeout, IO, and connector errors. If + one is encountered, returns `RetryAction::RetryIndicated`. Requires a parsed + response. +- `HttpStatusCodeClassifier`: Checks the HTTP response's status code. By + default, this classifies `500`, `502`, `503`, and `504` errors as + `RetryAction::RetryIndicated`. The list of retryable status codes may be + customized when creating this classifier with the + `HttpStatusCodeClassifier::new_from_codes` method. + +AWS clients enable the three smithy classifiers as well as one more by default: + +- `AwsErrorCodeClassifier`: Checks for errors with AWS error codes marking them + as either transient or throttling errors. If one is encountered, returns + `RetryAction::RetryIndicated`. Requires a parsed response. This classifier + will also check the HTTP response for an `x-amz-retry-after` header. If one is + set, then the returned `RetryAction` will include the explicit delay. + +The priority order of these classifiers is as follows: + +1. *(highest priority)* `TransientErrorClassifier` +2. `ModeledAsRetryableClassifier` +3. `AwsErrorCodeClassifier` +4. *(lowest priority)* `HttpStatusCodeClassifier` + +The priority order of the default classifiers is not configurable. However, it's +possible to wrap a default classifier in a newtype and set your desired priority +when implementing the `ClassifyRetry` trait, delegating the `classify_retry` and +`name` fields to the inner classifier. + +#### Disable default classifiers + +Disabling the default classifiers is possible, but not easy. They are set at +different points during config and operation construction, and must be unset at +each of those places. A far simpler solution is to implement your own classifier +that has the highest priority. + +Still, if completely removing the other classifiers is desired, use the +`set_retry_classifiers` method on the config to replace the config-level +defaults and then set a config override on the operation that does the same. + +## How to actually implement this RFC + +In order to implement this feature, we must: +- Update the current retry classification system so that individual classifiers + as well as collections of classifiers can be easily composed together. +- Create two new configuration mechanisms for users that allow them to customize + retry classification at the service level and at the operation level. +- Update retry classifiers so that they may 'short-circuit' the chain, ending + retry classification immediately. + +### The `RetryClassifier` trait + +```rust,ignore +/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`]. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum RetryAction { + /// When an error is received that should be retried, this action is returned. + Retry(ErrorKind), + /// When the server tells us to retry after a specific time has elapsed, this action is returned. + RetryAfter(Duration), + /// When a response should not be retried, this action is returned. + NoRetry, +} + +/// Classifies what kind of retry is needed for a given [`InterceptorContext`]. +pub trait ClassifyRetry: Send + Sync + fmt::Debug { + /// Run this classifier on the [`InterceptorContext`] to determine if the previous request + /// should be retried. If the classifier makes a decision, `Some(RetryAction)` is returned. + /// Classifiers may also return `None`, signifying that they have no opinion of whether or + /// not a request should be retried. + fn classify_retry( + &self, + ctx: &InterceptorContext, + preceding_action: Option, + ) -> Option; + + /// The name of this retry classifier. + /// + /// Used for debugging purposes. + fn name(&self) -> &'static str; + + /// The priority of this retry classifier. Classifiers with a higher priority will run before + /// classifiers with a lower priority. Classifiers with equal priorities make no guarantees + /// about which will run first. + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::default() + } +} +``` + +### Resolving the correct order of multiple retry classifiers + +Because each classifier has a defined priority, and because +`RetryClassifierPriority` implements `PartialOrd` and `Ord`, the standard +library's [sort] method may be used to correctly arrange classifiers. The +`RuntimeComponents` struct is responsible for storing classifiers, so it's also +responsible for sorting them whenever a new classifier is added. Thus, when a +retry strategy fetches the list of classifiers, they'll already be in the +expected order. + +## Questions and answers + +- **Q:** Should retry classifiers be fallible? + - **A:** I think no, because of the added complexity. If we make them fallible + then we'll have to decide what happens when classifiers fail. Do we skip + them or does classification end? The retry strategy is responsible for + calling the classifiers, so it be responsible for deciding how to handle a + classifier error. I don't foresee a use case where an error returned by a + classifier would be interpreted either by classifiers following the failed + classifier or the retry strategy. + +## Changes checklist + +- [x] Add retry classifiers field and setters to `RuntimeComponents` and `RuntimeComponentsBuilder`. + - [x] Add unit tests ensuring that classifier priority is respected by `RuntimeComponents::retry_classifiers`, especially when multiple layers of config are in play. +- [x] Add codegen customization allowing users to set retry classifiers on service configs. +- [x] Add codegen for setting default classifiers at the service level. + - [x] Add integration tests for setting classifiers at the service level. +- [x] Add codegen for settings default classifiers that require knowledge of operation error types at the operation level. + - [x] Add integration tests for setting classifiers at the operation level. +- [x] Implement retry classifier priority. + - [x] Add unit tests for retry classifier priority. +- [x] Update existing tests that would fail for lack of a retry classifier. + + + +[sort]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.sort +[forward compatibility]: https://en.wikipedia.org/wiki/Forward_compatibility diff --git a/design/src/rfcs/rfc0039_forward_compatible_errors.md b/design/src/rfcs/rfc0039_forward_compatible_errors.md new file mode 100644 index 00000000000..9b69b6d7b30 --- /dev/null +++ b/design/src/rfcs/rfc0039_forward_compatible_errors.md @@ -0,0 +1,131 @@ + +RFC: Forward Compatible Errors +============= + + +> Status: RFC +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC defines an approach for making it forwards-compatible to convert **unmodeled** `Unhandled` errors into modeled ones. This occurs as servers update their models to include errors that were previously unmodeled. + +Currently, SDK errors are **not** forward compatible in this way. If a customer matches `Unhandled` in addition to the `_` branch and a new variant is added, **they will fail to match the new variant**. We currently handle this issue with enums by prevent useful information from being readable from the `Unknown` variant. + +This is related to ongoing work on the [`non_exhaustive_omitted_patterns` lint](https://github.com/rust-lang/rust/issues/89554) which would produce a compiler warning when a new variant was added even when `_` was used. + + +Terminology +----------- + +For purposes of discussion, consider the following error: +```rust,ignore +#[non_exhaustive] +pub enum AbortMultipartUploadError { + NoSuchUpload(NoSuchUpload), + Unhandled(Unhandled), +} +``` + +- **Modeled Error**: An error with an named variant, e.g. `NoSuchUpload` above +- **Unmodeled Error**: Any other error, e.g. if the server returned `ValidationException` for the above operation. +- **Error code**: All errors across all protocols provide a `code`, a unique method to identify an error across the service closure. + + +The user experience if this RFC is implemented +---------------------------------------------- + +In the current version of the SDK, users match the `Unhandled` variant. They can then read the code from the `Unhandled` variant because [`Unhandled`](https://docs.rs/aws-smithy-types/0.56.1/aws_smithy_types/error/struct.Unhandled.html) implements the `ProvideErrorMetadata` trait as well as the standard-library `std::error::Error` trait. + +> Note: It's possible to write correct code today because the operation-level and service-level errors already expose `code()` via `ProvideErrorMetadata`. This RFC describes mechanisms to guide customers to write forward-compatible code. + +```rust,ignore +# fn docs() { + match client.get_object().send().await { + Ok(obj) => { ... }, + Err(e) => match e.into_service_error() { + GetObjectError::NotFound => { ... }, + GetObjectError::Unhandled(err) if err.code() == "ValidationException" => { ... } + other => { /** do something with this variant */ } + } + } +# } +``` + +We must instead guide customers into the following pattern: +```rust,ignore +# fn docs() { + match client.get_object().send().await { + Ok(obj) => { ... }, + Err(e) => match e.into_service_error() { + GetObjectError::NotFound => { ... }, + err if err.code() == "ValidationException" => { ... }, + err => warn!("{}", err.code()), + } + } +# } +``` + +In this example, because customers are _not_ matching on the `Unhandled` variant explicitly this code is forward compatible for `ValidationException` being introduced in the future. + +**Guiding Customers to this Pattern** +There are two areas we need to handle: +1. Prevent customers from extracting useful information from `Unhandled` +2. Alert customers _currently_ using unhandled what to use instead. For example, the following code is still problematic: + ```rust,ignore + match err { + GetObjectError::NotFound => { ... }, + err @ GetObject::Unhandled(_) if err.code() == Some("ValidationException") => { ... } + } + ``` + +For `1`, we need to remove the `ProvideErrorMetadata` trait implementation from `Unhandled`. We would expose this isntead through a layer of indirection to enable code generated to code to still read the data. + +For `2`, we would deprecate the `Unhandled` variants with a message clearly indicating how this code should be written. + +How to actually implement this RFC +---------------------------------- + +### Locking down `Unhandled` +In order to prevent accidental matching on `Unhandled`, we need to make it hard to extract useful information from `Unhandled` itself. We will do this by removing the `ProvideErrorMetadata` trait implementation and exposing the following method: + +```rust,ignore +#[doc(hidden)] +/// Introspect the error metadata of this error. +/// +/// This method should NOT be used from external code because matching on `Unhandled` directly is a backwards-compatibility +/// hazard. See `RFC-0039` for more information. +pub fn introspect(&self) -> impl ProvideErrorMetadata + '_ { + struct Introspected<'a>(&'a Unhandled); + impl ProvideErrorMetadata for Introspected { ... } + Introspected(self) +} +``` + +Generated code would this use `introspect` when supporting **top-level** `ErrorMetadata` (e.g. for [`aws_sdk_s3::Error`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/enum.Error.html)). + +### Deprecating the Variant +The `Unhandled` variant will be deprecated to prevent users from matching on it inadvertently. + +```rust,ignore +enum GetObjectError { + NotFound(NotFound), + #[deprecated("Matching on `Unhandled` directly is a backwards compatibility hazard. Use `err if err.error_code() == ...` instead. See [here]() for more information.")] + Unhandled(Unhandled) +} +``` + +### + + +Changes checklist +----------------- + +- [ ] Generate code to deprecate unhandled variants. Determine the best way to allow `Unhandled` to continue to be constructed in client code +- [ ] Generate code to deprecate the `Unhandled` variant for the service meta-error. Consider how this interacts with non-service errors. +- [ ] Update `Unhandled` to make it useless on its own and expose information via an `Introspect` doc hidden struct. +- [ ] Update developer guide to address this issue. +- [ ] Changelog & Upgrade Guidance diff --git a/design/src/rfcs/rfc0040_behavior_versions.md b/design/src/rfcs/rfc0040_behavior_versions.md new file mode 100644 index 00000000000..599540673f1 --- /dev/null +++ b/design/src/rfcs/rfc0040_behavior_versions.md @@ -0,0 +1,86 @@ + +RFC: Behavior Versions +============= + + +> Status: RFC +> +> Applies to: client + + +For a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section. + + +This RFC describes "Behavior Versions," a mechanism to allow SDKs to ship breaking behavioral changes like a new retry strategy, while allowing customers who rely on extremely consistent behavior to evolve at their own pace. + +By adding behavior major versions (BMV) to the Rust SDK, we will make it possible to ship new secure/recommended defaults to new customers without impacting legacy customers. + +The fundamental issue stems around our inability to communicate and decouple releases of service updates and behavior within a single major version. + +Both legacy and new SDKs have the need to alter their SDKs default. Historically, this caused new customers on legacy SDKs to be subject to legacy defaults, even when a better alternative existed. + +For new SDKs, a GA cutline presents difficult choices around timeline and features that can’t be added later without altering behavior. + +Both of these use cases are addressed by Behavior Versions. + + +The user experience if this RFC is implemented +---------------------------------------------- + +In the current version of the SDK, users can construct clients without indicating any sort of behavior major version. +Once this RFC is implemented, there will be two ways to set a behavior major version: + +1. In code via `aws_config::defaults(BehaviorVersion::latest())` and `::Config::builder().behavior_version(...)`. This will also work for `config_override`. +2. By enabling `behavior-version-latest` in either `aws-config` (which brings back `from_env`) OR a specific generated SDK crate + +```toml +# Cargo.toml +[dependencies] +aws-config = { version = "1", features = ["behavior-version-latest"] } +# OR +aws-sdk-s3 = { version = "1", features = ["behavior-version-latest"] } +``` + +If no `BehaviorVersion` is set, the client will panic during construction. + +`BehaviorVersion` is an opaque struct with initializers like `::latest()`, `::v2023_11_09()`. Downstream code can check the version by calling methods like `::supports_v1()` + +When new BMV are added, the previous version constructor will be marked as `deprecated`. This serves as a mechanism to alert customers that a new BMV exists to allow them to upgrade. + +How to actually implement this RFC +---------------------------------- + +In order to implement this feature, we need to create a `BehaviorVersion` struct, add config options to `SdkConfig` and `aws-config`, and wire it throughout the stack. +```rust +/// Behavior major-version of the client +/// +/// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards +/// compatible. For example, a change which introduces new default timeouts or a new retry-mode for +/// all operations might be the ideal behavior but could break existing applications. +#[derive(Debug, Clone)] +pub struct BehaviorVersion { + // currently there is only 1 MV so we don't actually need anything in here. +} +``` + +To help customers migrate, we are including `from_env` hooks that set `behavior-version-latest` that are _deprecated_. This allows customers to see that they are missing the required cargo feature and add it to remove the deprecation warning. + +Internally, `BehaviorVersion` will become an additional field on `::Config`. It is _not_ ever stored in the `ConfigBag` or in `RuntimePlugins`. + +When constructing the set of "default runtime plugins," the default runtime plugin parameters will be passed the `BehaviorVersion`. This will select the correct runtime plugin. Logging will clearly indicate which plugin was selected. + +Design Alternatives Considered +------------------------------ + +An original design was also considered that made BMV optional and relied on documentation to steer customers in the right direction. This was +deemed too weak of a mechanism to ensure that customers aren't broken by unexpected changes. + +Changes checklist +----------------- + +- [x] Create `BehaviorVersion` and the BMV runtime plugin +- [x] Add BMV as a required runtime component +- [x] Wire up setters throughout the stack +- [x] Add tests of BMV (set via aws-config, cargo features & code params) +- [x] ~Remove `aws_config::from_env` deprecation stand-ins~ We decided to persist these deprecations +- [x] Update generated usage examples diff --git a/design/src/server/anatomy.md b/design/src/server/anatomy.md index bc7a550c95d..47ace208270 100644 --- a/design/src/server/anatomy.md +++ b/design/src/server/anatomy.md @@ -4,7 +4,7 @@ What is [Smithy](https://awslabs.github.io/smithy/2.0/index.html)? At a high-lev This survey is disinterested in the actual Kotlin implementation of the code generator, and instead focuses on the structure of the generated Rust code and how it relates to the Smithy model. The intended audience is new contributors and users interested in internal details. -During the survey we will use the [`pokemon.smithy`](https://github.com/awslabs/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) model as a reference: +During the survey we will use the [`pokemon.smithy`](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) model as a reference: ```smithy /// A Pokémon species forms the basis for at least one Pokémon. @@ -41,24 +41,27 @@ service PokemonService { Smithy Rust will use this model to produce the following API: -```rust +```rust,no_run # extern crate pokemon_service_server_sdk; # extern crate aws_smithy_http_server; -# use pokemon_service_server_sdk::{input::*, output::*, error::*, operation_shape::*, PokemonService}; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; +# use pokemon_service_server_sdk::{input::*, output::*, error::*, operation_shape::*, PokemonServiceConfig, PokemonService}; // A handler for the `GetPokemonSpecies` operation (the `PokemonSpecies` resource). async fn get_pokemon_species(input: GetPokemonSpeciesInput) -> Result { todo!() } +let config = PokemonServiceConfig::builder().build(); + // Use the service builder to create `PokemonService`. -let pokemon_service = PokemonService::builder_without_plugins() +let pokemon_service = PokemonService::builder(config) // Pass the handler directly to the service builder... .get_pokemon_species(get_pokemon_species) /* other operation setters */ .build() - # ; Result::<(), ()>::Ok(()) .expect("failed to create an instance of the Pokémon service"); -# let pokemon_service: Result, _> = pokemon_service; +# let pokemon_service: PokemonService, RestJson1>> = pokemon_service; ``` ## Operations @@ -225,7 +228,7 @@ To summarize a _model service_ constructed can be constructed from a `Handler` o ## Serialization and Deserialization -A [Smithy protocol](https://awslabs.github.io/smithy/2.0/spec/protocol-traits.html#serialization-and-protocol-traits) specifies the serialization/deserialization scheme - how a HTTP request is transformed into a modelled input and a modelled output to a HTTP response. The is formalized using the [`FromRequest`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/trait.FromRequest.html) and [`IntoResponse`](https://github.com/awslabs/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/response.rs#L40-L44) traits: +A [Smithy protocol](https://awslabs.github.io/smithy/2.0/spec/protocol-traits.html#serialization-and-protocol-traits) specifies the serialization/deserialization scheme - how a HTTP request is transformed into a modelled input and a modelled output to a HTTP response. The is formalized using the [`FromRequest`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/trait.FromRequest.html) and [`IntoResponse`](https://github.com/smithy-lang/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/response.rs#L40-L44) traits: ```rust # extern crate aws_smithy_http_server; @@ -442,7 +445,7 @@ pub trait Plugin { # } ``` -An example `Plugin` implementation can be found in [/examples/pokemon-service/src/plugin.rs](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs). +An example `Plugin` implementation can be found in [/examples/pokemon-service/src/plugin.rs](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs). Plugins can be applied in two places: @@ -463,43 +466,45 @@ stateDiagram-v2 S --> [*]: HTTP Response ``` -The service builder API requires plugins to be specified upfront - they must be passed as an argument to `builder_with_plugins` and cannot be modified afterwards. +The service builder API requires plugins to be specified upfront - they must be +registered in the config object, which is passed as an argument to `builder`. +Plugins cannot be modified afterwards. You might find yourself wanting to apply _multiple_ plugins to your service. -This can be accommodated via [`PluginPipeline`]. +This can be accommodated via [`HttpPlugins`] and [`ModelPlugins`]. ```rust # extern crate aws_smithy_http_server; -use aws_smithy_http_server::plugin::PluginPipeline; +use aws_smithy_http_server::plugin::HttpPlugins; # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; -let pipeline = PluginPipeline::new().push(LoggingPlugin).push(MetricsPlugin); +let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin); ``` The plugins' runtime logic is executed in registration order. In the example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last. -If you are vending a plugin, you can leverage `PluginPipeline` as an extension point: you can add custom methods to it using an extension trait. +If you are vending a plugin, you can leverage `HttpPlugins` or `ModelPlugins` as an extension point: you can add custom methods to it using an extension trait. For example: ```rust # extern crate aws_smithy_http_server; -use aws_smithy_http_server::plugin::{PluginPipeline, PluginStack}; +use aws_smithy_http_server::plugin::{HttpPlugins, PluginStack}; # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin; pub trait AuthPluginExt { - fn with_auth(self) -> PluginPipeline>; + fn with_auth(self) -> HttpPlugins>; } -impl AuthPluginExt for PluginPipeline { - fn with_auth(self) -> PluginPipeline> { +impl AuthPluginExt for HttpPlugins { + fn with_auth(self) -> HttpPlugins> { self.push(AuthPlugin) } } -let pipeline = PluginPipeline::new() +let http_plugins = HttpPlugins::new() .push(LoggingPlugin) // Our custom method! .with_auth(); @@ -510,7 +515,7 @@ let pipeline = PluginPipeline::new() The service builder is the primary public API, generated for every [Smithy Service](https://awslabs.github.io/smithy/2.0/spec/service-types.html). At a high-level, the service builder takes as input a function for each Smithy Operation and returns a single HTTP service. The signature of each function, also known as _handlers_, must match the constraints of the corresponding Smithy model. -You can create an instance of a service builder by calling either `builder_without_plugins` or `builder_with_plugins` on the corresponding service struct. +You can create an instance of a service builder by calling `builder` on the corresponding service struct. ```rust # extern crate aws_smithy_http_server; @@ -518,15 +523,15 @@ You can create an instance of a service builder by calling either `builder_witho /// The service builder for [`PokemonService`]. /// /// Constructed via [`PokemonService::builder`]. -pub struct PokemonServiceBuilder { +pub struct PokemonServiceBuilder { capture_pokemon_operation: Option>, empty_operation: Option>, get_pokemon_species: Option>, get_server_statistics: Option>, get_storage: Option>, health_check_operation: Option>, - http_plugin: HttpPlugin, - model_plugin: ModelPlugin + http_plugin: HttpPl, + model_plugin: ModelPl, } ``` @@ -537,7 +542,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g where HandlerType:Handler, - ModelPlugin: Plugin< + ModelPl: Plugin< PokemonService, GetPokemonSpecies, IntoService @@ -547,7 +552,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g GetPokemonSpecies, ModelPlugin::Output >, - HttpPlugin: Plugin< + HttpPl: Plugin< PokemonService, GetPokemonSpecies, UpgradePlugin::::Output @@ -565,7 +570,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g where S: OperationService, - ModelPlugin: Plugin< + ModelPl: Plugin< PokemonService, GetPokemonSpecies, Normalize @@ -575,7 +580,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g GetPokemonSpecies, ModelPlugin::Output >, - HttpPlugin: Plugin< + HttpPl: Plugin< PokemonService, GetPokemonSpecies, UpgradePlugin::::Output @@ -597,7 +602,7 @@ The builder has two setter methods for each [Smithy Operation](https://awslabs.g } ``` -Handlers and operations are upgraded to a [`Route`](https://github.com/awslabs/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/routing/route.rs#L49-L52) as soon as they are registered against the service builder. You can think of `Route` as a boxing layer in disguise. +Handlers and operations are upgraded to a [`Route`](https://github.com/smithy-lang/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/routing/route.rs#L49-L52) as soon as they are registered against the service builder. You can think of `Route` as a boxing layer in disguise. You can transform a builder instance into a complete service (`PokemonService`) using one of the following methods: diff --git a/design/src/server/code_generation.md b/design/src/server/code_generation.md index f65c08d2f1d..e1f0f2dfd39 100644 --- a/design/src/server/code_generation.md +++ b/design/src/server/code_generation.md @@ -72,29 +72,29 @@ in which all dependencies are written into their modules and `lib.rs` is generat `execute()` ends by running [cargo fmt][26], to avoid having to format correctly Rust in `Writer`s and to be sure the generated code follows the styling rules. -[1]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/CargoDependency.kt#L95-L95 +[1]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/CargoDependency.kt#L95-L95 [2]: https://docs.rs/aws-smithy-eventstream -[3]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L34 +[3]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L34 [4]: https://github.com/awslabs/smithy/tree/main/smithy-build [5]: https://github.com/awslabs/smithy [6]: https://awslabs.github.io/smithy/1.0/guides/building-models/gradle-plugin.html -[7]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt#L45 -[8]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L115-L115 -[9]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L44 -[10]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt#L363-L363 -[11]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustTypes.kt#L25-L25 -[12]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RuntimeTypes.kt#L113-L113 +[7]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt#L45 +[8]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L115-L115 +[9]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L44 +[10]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt#L363-L363 +[11]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustTypes.kt#L25-L25 +[12]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RuntimeTypes.kt#L113-L113 [13]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#shape-id -[14]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L65-L65 -[15]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/StreamingTraitSymbolProvider.kt#L26-L26 -[16]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L62-L62 -[17]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L26-L26 -[18]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L38-L38 -[19]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/OperationNormalizer.kt#L52-L52 -[20]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L119-L119 -[21]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L150-L150 -[22]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L172-L172 -[23]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L119-L126 -[24]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L42-L42 -[25]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L96-L107 -[26]: https://github.com/awslabs/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L133-L133 +[14]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L65-L65 +[15]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/StreamingTraitSymbolProvider.kt#L26-L26 +[16]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L62-L62 +[17]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L26-L26 +[18]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L38-L38 +[19]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/OperationNormalizer.kt#L52-L52 +[20]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L119-L119 +[21]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L150-L150 +[22]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L172-L172 +[23]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L119-L126 +[24]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L42-L42 +[25]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L96-L107 +[26]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L133-L133 diff --git a/design/src/server/instrumentation.md b/design/src/server/instrumentation.md index dfb5ee52520..ac5c2c56a44 100644 --- a/design/src/server/instrumentation.md +++ b/design/src/server/instrumentation.md @@ -66,17 +66,20 @@ This is enabled via the `instrument` method provided by the `aws_smithy_http_ser # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; use aws_smithy_http_server::{ instrumentation::InstrumentExt, - plugin::{IdentityPlugin, PluginPipeline} + plugin::{IdentityPlugin, HttpPlugins} }; -use pokemon_service_server_sdk::PokemonService; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; +use pokemon_service_server_sdk::{PokemonServiceConfig, PokemonService}; -let http_plugins = PluginPipeline::new().instrument(); -let app = PokemonService::builder_with_plugins(http_plugins, IdentityPlugin) +let http_plugins = HttpPlugins::new().instrument(); +let config = PokemonServiceConfig::builder().http_plugin(http_plugins).build(); +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; ``` diff --git a/design/src/server/middleware.md b/design/src/server/middleware.md index 409c8700fab..67802317bcf 100644 --- a/design/src/server/middleware.md +++ b/design/src/server/middleware.md @@ -2,7 +2,7 @@ The following document provides a brief survey of the various positions middleware can be inserted in Smithy Rust. -We use the [Pokémon service](https://github.com/awslabs/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) as a reference model throughout. +We use the [Pokémon service](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) as a reference model throughout. ```smithy /// A Pokémon species forms the basis for at least one Pokémon. @@ -147,16 +147,20 @@ The output of the Smithy service builder provides the user with a `Service Layer for TimeoutLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } } # use pokemon_service_server_sdk::{input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; -use pokemon_service_server_sdk::PokemonService; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; +use pokemon_service_server_sdk::{PokemonServiceConfig, PokemonService}; use tower::Layer; +let config = PokemonServiceConfig::builder().build(); + // This is a HTTP `Service`. -let app /* : PokemonService> */ = PokemonService::builder_without_plugins() +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; // Construct `TimeoutLayer`. let timeout_layer = TimeoutLayer::new(Duration::from_secs(3)); @@ -167,7 +171,9 @@ let app = timeout_layer.layer(app); ### B. Route Middleware -A _single_ layer can be applied to _all_ routes inside the `Router`. This exists as a method on the output of the service builder. +A _single_ layer can be applied to _all_ routes inside the `Router`. This +exists as a method on the `PokemonServiceConfig` builder object, which is passed into the +service builder. ```rust,no_run # extern crate tower; @@ -175,25 +181,26 @@ A _single_ layer can be applied to _all_ routes inside the `Router`. This exists # extern crate aws_smithy_http_server; # use tower::{util::service_fn, Layer}; # use std::time::Duration; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; # use pokemon_service_server_sdk::{input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; # struct MetricsLayer; # impl MetricsLayer { pub fn new() -> Self { Self } } # impl Layer for MetricsLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } } -use pokemon_service_server_sdk::PokemonService; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; // Construct `MetricsLayer`. let metrics_layer = MetricsLayer::new(); -let app /* : PokemonService> */ = PokemonService::builder_without_plugins() +let config = PokemonServiceConfig::builder().layer(metrics_layer).build(); + +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() - .unwrap() - # ; let app: PokemonService = app; - # app - // Apply HTTP logging after routing. - .layer(&metrics_layer); + .unwrap(); +# let app: PokemonService, RestJson1>> = app; ``` Note that requests pass through this middleware immediately _after_ routing succeeds and therefore will _not_ be encountered if routing fails. This means that the [TraceLayer](https://docs.rs/tower-http/latest/tower_http/trace/struct.TraceLayer.html) in the example above does _not_ provide logs unless routing has completed. This contrasts to [middleware A](#a-outer-middleware), which _all_ requests/responses pass through when entering/leaving the service. @@ -209,12 +216,14 @@ A "HTTP layer" can be applied to specific operations. # use tower::{util::service_fn, Layer}; # use std::time::Duration; # use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*}; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; # use aws_smithy_http_server::{operation::OperationShapeExt, plugin::*, operation::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; # struct LoggingLayer; # impl LoggingLayer { pub fn new() -> Self { Self } } # impl Layer for LoggingLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } } -use pokemon_service_server_sdk::{PokemonService, scope}; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig, scope}; scope! { /// Only log on `GetPokemonSpecies` and `GetStorage` @@ -226,14 +235,16 @@ scope! { // Construct `LoggingLayer`. let logging_plugin = LayerPlugin(LoggingLayer::new()); let logging_plugin = Scoped::new::(logging_plugin); -let http_plugins = PluginPipeline::new().push(logging_plugin); +let http_plugins = HttpPlugins::new().push(logging_plugin); -let app /* : PokemonService> */ = PokemonService::builder_with_plugins(http_plugins, IdentityPlugin) +let config = PokemonServiceConfig::builder().http_plugin(http_plugins).build(); + +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; ``` This middleware transforms the operations HTTP requests and responses. @@ -250,10 +261,12 @@ A "model layer" can be applied to specific operations. # use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; # use aws_smithy_http_server::{operation::*, plugin::*}; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; # struct BufferLayer; # impl BufferLayer { pub fn new(size: usize) -> Self { Self } } # impl Layer for BufferLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } } -use pokemon_service_server_sdk::{PokemonService, scope}; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig, scope}; scope! { /// Only buffer on `GetPokemonSpecies` and `GetStorage` @@ -265,14 +278,14 @@ scope! { // Construct `BufferLayer`. let buffer_plugin = LayerPlugin(BufferLayer::new(3)); let buffer_plugin = Scoped::new::(buffer_plugin); -let model_plugins = PluginPipeline::new().push(buffer_plugin); +let config = PokemonServiceConfig::builder().model_plugin(buffer_plugin).build(); -let app /* : PokemonService> */ = PokemonService::builder_with_plugins(IdentityPlugin, model_plugins) +let app = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; ``` In contrast to [position C](#c-operation-specific-http-middleware), this middleware transforms the operations modelled inputs to modelled outputs. @@ -283,7 +296,7 @@ Suppose we want to apply a different `Layer` to every operation. In this case, p Consider the following middleware: -```rust +```rust,no_run # extern crate aws_smithy_http_server; # extern crate tower; use aws_smithy_http_server::shape_id::ShapeId; @@ -320,7 +333,7 @@ The plugin system provides a way to construct then apply `Layer`s in position [C An example of a `PrintPlugin` which prints the operation name: -```rust +```rust,no_run # extern crate aws_smithy_http_server; # use aws_smithy_http_server::shape_id::ShapeId; # pub struct PrintService { inner: S, operation_id: ShapeId, service_id: ShapeId } @@ -347,23 +360,24 @@ where } ``` -You can provide a custom method to add your plugin to a `PluginPipeline` via an extension trait: +You can provide a custom method to add your plugin to a collection of `HttpPlugins` or `ModelPlugins` via an extension trait. For example, for `HttpPlugins`: -```rust +```rust,no_run # extern crate aws_smithy_http_server; # pub struct PrintPlugin; -use aws_smithy_http_server::plugin::{PluginPipeline, PluginStack}; +# impl aws_smithy_http_server::plugin::HttpMarker for PrintPlugin { } +use aws_smithy_http_server::plugin::{HttpPlugins, PluginStack}; -/// This provides a [`print`](PrintExt::print) method on [`PluginPipeline`]. +/// This provides a [`print`](PrintExt::print) method on [`HttpPlugins`]. pub trait PrintExt { /// Causes all operations to print the operation name when called. /// /// This works by applying the [`PrintPlugin`]. - fn print(self) -> PluginPipeline>; + fn print(self) -> HttpPlugins>; } -impl PrintExt for PluginPipeline { - fn print(self) -> PluginPipeline> { +impl PrintExt for HttpPlugins { + fn print(self) -> HttpPlugins> { self.push(PrintPlugin) } } @@ -377,24 +391,28 @@ This allows for: # use aws_smithy_http_server::plugin::{PluginStack, Plugin}; # struct PrintPlugin; # impl Plugin for PrintPlugin { type Output = T; fn apply(&self, svc: T) -> Self::Output { svc }} -# trait PrintExt { fn print(self) -> PluginPipeline>; } -# impl PrintExt for PluginPipeline { fn print(self) -> PluginPipeline> { self.push(PrintPlugin) }} +# impl aws_smithy_http_server::plugin::HttpMarker for PrintPlugin { } +# trait PrintExt { fn print(self) -> HttpPlugins>; } +# impl PrintExt for HttpPlugins { fn print(self) -> HttpPlugins> { self.push(PrintPlugin) }} # use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*}; # let handler = |req: GetPokemonSpeciesInput| async { Result::::Ok(todo!()) }; -use aws_smithy_http_server::plugin::{IdentityPlugin, PluginPipeline}; -use pokemon_service_server_sdk::PokemonService; +# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter}; +# use aws_smithy_http_server::routing::{Route, RoutingService}; +use aws_smithy_http_server::plugin::{IdentityPlugin, HttpPlugins}; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; -let http_plugins = PluginPipeline::new() +let http_plugins = HttpPlugins::new() // [..other plugins..] // The custom method! .print(); -let app /* : PokemonService> */ = PokemonService::builder_with_plugins(http_plugins, IdentityPlugin) +let config = PokemonServiceConfig::builder().http_plugin(http_plugins).build(); +let app /* : PokemonService> */ = PokemonService::builder(config) .get_pokemon_species(handler) /* ... */ .build() .unwrap(); -# let app: PokemonService = app; +# let app: PokemonService, RestJson1>> = app; ``` The custom `print` method hides the details of the `Plugin` trait from the average consumer. -They interact with the utility methods on `PluginPipeline` and enjoy the self-contained documentation. +They interact with the utility methods on `HttpPlugins` and enjoy the self-contained documentation. diff --git a/design/src/smithy/aggregate_shapes.md b/design/src/smithy/aggregate_shapes.md index 0dafac77f9e..41569107dc7 100644 --- a/design/src/smithy/aggregate_shapes.md +++ b/design/src/smithy/aggregate_shapes.md @@ -8,7 +8,7 @@ | [Structure](#structure) | `struct` | | [Union](#union) | `enum` | -Most generated types are controlled by [SymbolVisitor](https://github.com/awslabs/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). +Most generated types are controlled by [SymbolVisitor](https://github.com/smithy-lang/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). ## List List objects in Smithy are transformed into vectors in Rust. Based on the output of the [NullableIndex](https://awslabs.github.io/smithy/javadoc/1.5.1/software/amazon/smithy/model/knowledge/NullableIndex.html), the generated list may be `Vec` or `Vec>`. @@ -121,7 +121,7 @@ impl IoUsage { Smithy `Union` is modeled as `enum` in Rust. 1. Generated `enum`s must be marked `#[non_exhaustive]`. -2. Generated `enum`s must provide an `Unknown` variant. If parsing receives an unknown input that doesn't match any of the given union variants, `Unknown` should be constructed. [Tracking Issue](https://github.com/awslabs/smithy-rs/issues/185). +2. Generated `enum`s must provide an `Unknown` variant. If parsing receives an unknown input that doesn't match any of the given union variants, `Unknown` should be constructed. [Tracking Issue](https://github.com/smithy-lang/smithy-rs/issues/185). 3. Union members (enum variants) are **not** nullable, because Smithy union members cannot contain null values. 4. When union members contain references to other shapes, we generate a wrapping variant (see below). 5. Union members do not require `#[non_exhaustive]`, because changing the shape targeted by a union member is not backwards compatible. diff --git a/design/src/smithy/event_streams.md b/design/src/smithy/event_streams.md index 47d08d6836e..c2b77d98fb1 100644 --- a/design/src/smithy/event_streams.md +++ b/design/src/smithy/event_streams.md @@ -14,7 +14,7 @@ This document describes: The user experience ---------------------------------------------- -Let us take [the following model](https://github.com/awslabs/smithy-rs/pull/1479/files#diff-ae332acd4a848e840d018d3b8616e40031f9e8f96ed89777dea69eb1f51a89a4R25) as an example: +Let us take [the following model](https://github.com/smithy-lang/smithy-rs/pull/1479/files#diff-ae332acd4a848e840d018d3b8616e40031f9e8f96ed89777dea69eb1f51a89a4R25) as an example: ```smithy @http(uri: "/capture-pokemon-event/{region}", method: "POST") operation CapturePokemonOperation { @@ -197,7 +197,7 @@ pub struct CapturePokemonOperationInput { } ``` Note they are similar, but the client uses an `EventStreamSender` (this is an input structure) and the server a `Receiver` (the server receives the input). -Sender is [chosen according](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L58) to if the +Sender is [chosen according](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L58) to if the generation target is the client and the union is in an input structure; or if this is a server sending from an operation's output. The error structs are generated as any operation error, where the union shape is treated as an operation: @@ -216,7 +216,7 @@ pub enum AttemptCapturingPokemonEventError { MasterBallUnsuccessful(crate::error::MasterBallUnsuccessful), } ``` -The errors are similar to any operation error, but their [name](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) is `Error` prefixed by the name of the union. +The errors are similar to any operation error, but their [name](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) is `Error` prefixed by the name of the union. The reason for splitting up errors and non-errors in the event stream union is to give a more Rust-like experience to customers, where they can `yield` and `match` on errors `Err(UnionError::Variant)` as a result of the event stream communication, rather than matching on the specific variant, `Ok(Union::Variant) => /* handle error */`. @@ -238,8 +238,8 @@ aws_smithy_http::event_stream::Receiver< ``` and errors propagated as such to terminate the stream. -An [EventStreamSender](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L18) wraps an input stream -into a [MessageStreamAdapter](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L132), which implements +An [EventStreamSender](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L18) wraps an input stream +into a [MessageStreamAdapter](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L132), which implements the [Stream](https://docs.rs/futures-core/0.3.21/futures_core/stream/trait.Stream.html) trait. At a high level, `poll_next` works by: 1. Polling the customer stream 2. If there is an event: @@ -248,13 +248,13 @@ the [Stream](https://docs.rs/futures-core/0.3.21/futures_core/stream/trait.Strea 3. Sign the marshalled data and return it 3. Otherwise, signal to poll back later -Similarly, the [Receiver](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L125) handles the receiving side of the stream. +Similarly, the [Receiver](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L125) handles the receiving side of the stream. The `Receiver` has more logic to handle buffering data and possibly errors. Server and client serialize similarly. Serializing for `CapturePokemonOperation` on the server, with `serialize_capture_pokemon_operation_response`: 1. Sets the `content-type` HTTP header to `application/vnd.amazon.eventstream` 2. Converts the `EventStreamSender` in the event stream structure into a `MessageStreamAdapter` with a marshaller for the error and data types - 1. [This](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L511) is where it is generated + 1. [This](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L511) is where it is generated 3. Gives the body back to hyper ```rust let body = @@ -269,13 +269,13 @@ let body = adapter })); ``` -The signer signs the message to be sent. [NoOpSigner](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L37) returns the message as is, `SigV4Signer` signs using the AWS SigV4 protocol. SigV4 requires an empty-payload signed message to be sent before effectively terminating the stream; to keep the same interface, `SignMessage::sign_empty` returns an `Option` to signal whether signing this last empty message is required. +The signer signs the message to be sent. [NoOpSigner](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L37) returns the message as is, `SigV4Signer` signs using the AWS SigV4 protocol. SigV4 requires an empty-payload signed message to be sent before effectively terminating the stream; to keep the same interface, `SignMessage::sign_empty` returns an `Option` to signal whether signing this last empty message is required. -The marshallers set header and payload in a [Message](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L368) structure: `Message` is a structure with a vector, the headers; and bytes, the payload. +The marshallers set header and payload in a [Message](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L368) structure: `Message` is a structure with a vector, the headers; and bytes, the payload. The headers are the values targeted by the `@eventHeader` trait and the payload by `@eventPayload`. At the end of the marshalling and signing processes, `MessageStreamAdapter` takes the `Message` built by the marshaller and signer -and [writes](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L224) it as bytes into a `Vec`, +and [writes](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L224) it as bytes into a `Vec`, in a format of a sequence of bytes: `` where `type` indicates if the `data` is a bool, integer and so on for all types. Headers that are sent are: @@ -288,10 +288,10 @@ The way errors are marshalled, unmarshalled and signed is the same as above. #### Generating errors Event stream errors in unions are generated in the same way for operation errors: -In fact, the implementation uses the same [render](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L47) functions; +In fact, the implementation uses the same [render](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L47) functions; the only difference between client and server is that the server does not generate anything unless the structure has errors, while the client always generates a structure for forward compatibility with at least a `Unhandled` error kind. -This is also the reason for the default [MessageStreamError](https://github.com/awslabs/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L52) for servers. +This is also the reason for the default [MessageStreamError](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L52) for servers. The main differences between the EventStreamErrorMarshallerGenerator and EventStreamMarshallerGenerator are that the former: * takes into account the differences between client and server in how error symbols are laid out (with a `kind` member or `Kind` suffix) diff --git a/design/src/smithy/overview.md b/design/src/smithy/overview.md index 128ce256267..f894c7e9d01 100644 --- a/design/src/smithy/overview.md +++ b/design/src/smithy/overview.md @@ -7,8 +7,8 @@ Design documentation here covers both our implementation of Smithy Primitives (e Smithy introduces a few concepts that are defined here: 1. Shape: The core Smithy primitive. A smithy model is composed of nested shapes defining an API. -2. `Symbol`: A Representation of a type including namespaces and any dependencies required to use a type. A shape can be converted into a symbol by a `SymbolVisitor`. A `SymbolVisitor` maps shapes to types in your programming language (e.g. Rust). In the Rust SDK, see [SymbolVisitor.kt](https://github.com/awslabs/smithy-rs/blob/c049a37f8cba5f9bec2e96c28db83e7efb2edc53/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). Symbol visitors are composable—many specific behaviors are mixed in via small & focused symbol providers, e.g. support for the streaming trait is mixed in separately. -3. `Writer`: Writers are code generation primitives that collect code prior to being written to a file. Writers enable language specific helpers to be added to simplify codegen for a given language. For example, `smithy-rs` adds `rustBlock` to [`RustWriter`](https://github.com/awslabs/smithy-rs/blob/908dec558e26bbae6fe4b7d9d1c221dd81699b59/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustWriter.kt) to create a "Rust block" of code. +2. `Symbol`: A Representation of a type including namespaces and any dependencies required to use a type. A shape can be converted into a symbol by a `SymbolVisitor`. A `SymbolVisitor` maps shapes to types in your programming language (e.g. Rust). In the Rust SDK, see [SymbolVisitor.kt](https://github.com/smithy-lang/smithy-rs/blob/c049a37f8cba5f9bec2e96c28db83e7efb2edc53/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). Symbol visitors are composable—many specific behaviors are mixed in via small & focused symbol providers, e.g. support for the streaming trait is mixed in separately. +3. `Writer`: Writers are code generation primitives that collect code prior to being written to a file. Writers enable language specific helpers to be added to simplify codegen for a given language. For example, `smithy-rs` adds `rustBlock` to [`RustWriter`](https://github.com/smithy-lang/smithy-rs/blob/908dec558e26bbae6fe4b7d9d1c221dd81699b59/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustWriter.kt) to create a "Rust block" of code. ```kotlin writer.rustBlock("struct Model") { model.fields.forEach { diff --git a/design/src/smithy/recursive_shapes.md b/design/src/smithy/recursive_shapes.md index 1697fb0ddbe..8dfac6d23dd 100644 --- a/design/src/smithy/recursive_shapes.md +++ b/design/src/smithy/recursive_shapes.md @@ -23,7 +23,7 @@ struct IntermediateStructure { = help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `main::TopStructure` representable ``` -This occurs because Rust types must be a size known at compile time. The way around this, as the message suggests, is to Box the offending type. `smithy-rs` implements this design in [RecursiveShapeBoxer.kt](https://github.com/awslabs/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/RecursiveShapeBoxer.kt) +This occurs because Rust types must be a size known at compile time. The way around this, as the message suggests, is to Box the offending type. `smithy-rs` implements this design in [RecursiveShapeBoxer.kt](https://github.com/smithy-lang/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/RecursiveShapeBoxer.kt) To support this, as the message suggests, we must "`Box`" the offending type. There is a touch of trickiness—only one element in the cycle needs to be boxed, but we need to select it deterministically such that we always pick the same element between multiple codegen runs. To do this the Rust SDK will: diff --git a/design/src/smithy/simple_shapes.md b/design/src/smithy/simple_shapes.md index 9e2c99b434d..45177c4021e 100644 --- a/design/src/smithy/simple_shapes.md +++ b/design/src/smithy/simple_shapes.md @@ -12,8 +12,8 @@ | double | `f64` | | [bigInteger](#big-numbers) | `BigInteger` (Not implemented yet) | | [bigDecimal](#big-numbers) | `BigDecimal` (Not implemented yet) | -| [timestamp](#timestamps) | [`DateTime`](https://github.com/awslabs/smithy-rs/blob/main/rust-runtime/aws-smithy-types/src/date_time/mod.rs) | -| [document](#documents) | [`Document`](https://github.com/awslabs/smithy-rs/blob/v0.14/rust-runtime/aws-smithy-types/src/lib.rs#L38-L52) | +| [timestamp](#timestamps) | [`DateTime`](https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-types/src/date_time/mod.rs) | +| [document](#documents) | [`Document`](https://github.com/smithy-lang/smithy-rs/blob/v0.14/rust-runtime/aws-smithy-types/src/lib.rs#L38-L52) | ### Big Numbers Rust currently has no standard library or universally accepted large-number crate. Until one is stabilized, a string representation is a reasonable compromise: @@ -25,7 +25,7 @@ pub struct BigDecimal(String); This will enable us to add helpers over time as requested. Users will also be able to define their own conversions into their preferred large-number libraries. -As of 5/23/2021 BigInteger / BigDecimal are not included in AWS models. Implementation is tracked [here](https://github.com/awslabs/smithy-rs/issues/312). +As of 5/23/2021 BigInteger / BigDecimal are not included in AWS models. Implementation is tracked [here](https://github.com/smithy-lang/smithy-rs/issues/312). ### Timestamps [chrono](https://github.com/chronotope/chrono) is the current de facto library for datetime in Rust, but it is pre-1.0. DateTimes are represented by an SDK defined structure modeled on `std::time::Duration` from the Rust standard library. diff --git a/design/src/transport/connector.md b/design/src/transport/connector.md index cadbcb6dd5f..edb50d4412d 100644 --- a/design/src/transport/connector.md +++ b/design/src/transport/connector.md @@ -1,39 +1,7 @@ -The Smithy client provides a default TLS connector, but a custom one can be plugged in. -`rustls` is enabled with the feature flag `rustls`. +The Smithy client provides a default TLS connector, but a custom one can be +plugged in. `rustls` is enabled with the feature flag `rustls`. -The client had previously supported `native-tls`. You can use your custom connector like this. - -Create your connector: - -```rust -/// A `hyper` connector that uses the `native-tls` crate for TLS. To use this in a smithy client, -/// wrap it in a [hyper_ext::Adapter](crate::hyper_ext::Adapter). -pub type NativeTls = hyper_tls::HttpsConnector; - -pub fn native_tls() -> NativeTls { - let mut tls = hyper_tls::native_tls::TlsConnector::builder(); - let tls = tls - .min_protocol_version(Some(hyper_tls::native_tls::Protocol::Tlsv12)) - .build() - .unwrap_or_else(|e| panic!("Error while creating TLS connector: {}", e)); - let mut http = hyper::client::HttpConnector::new(); - http.enforce_http(false); - hyper_tls::HttpsConnector::from((http, tls.into())) -} -``` - -Plug the connector in the client: -```rust -let mut builder = hyper::client::Builder::default(); -builder.pool_max_idle_per_host(70); -let connector = aws_smithy_client::erase::DynConnector::new( - aws_smithy_client::hyper_ext::Adapter::builder() - .hyper_builder(builder) - .connector_settings(std::default::Default::default()) - .build(native_tls()), -); -let raw_client = aws_smithy_client::builder::Builder::new() - .connector(connector) - .middleware_fn(...) - .build_dyn(); -``` +The client had previously (prior to version 0.56.0) supported `native-tls`. You +can continue to use a client whose TLS implementation is backed by `native-tls` +by passing in a custom connector. Check out the `custom_connectors.rs` tests in +the `pokemon-service-tls` example crate. diff --git a/examples/BENCHMARKS.md b/examples/BENCHMARKS.md index bbc33c7b976..8caf3a74b06 100644 --- a/examples/BENCHMARKS.md +++ b/examples/BENCHMARKS.md @@ -14,7 +14,7 @@ using [wrk](https://github.com/wg/wrk). -## [2022-03-04](https://github.com/awslabs/smithy-rs/commit/d823f61156577ab42590709627906d1dc35a5f49) +## [2022-03-04](https://github.com/smithy-lang/smithy-rs/commit/d823f61156577ab42590709627906d1dc35a5f49) The benchmark runs against the `empty_operation()` operation, which is just returning an empty output and can be used to stress test the framework overhead. diff --git a/examples/Cargo.toml b/examples/Cargo.toml index 33c374bbcb9..9d38f8d778c 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -6,7 +6,9 @@ members = [ "pokemon-service-tls", "pokemon-service-lambda", "pokemon-service-server-sdk", - "pokemon-service-client" + "pokemon-service-client", + "pokemon-service-client-usage", + ] [profile.release] diff --git a/examples/README.md b/examples/README.md index f179bc1a443..37ea375b7a9 100644 --- a/examples/README.md +++ b/examples/README.md @@ -14,8 +14,8 @@ These servers, and their clients, are generated using smithy-rs. You're invited to benchmark the performance of these servers to see whether smithy-rs might be a suitable choice for implementing your web service. -[middleware]: https://awslabs.github.io/smithy-rs/design/server/middleware.html -[extractors]: https://awslabs.github.io/smithy-rs/design/server/from_parts.html +[middleware]: https://smithy-lang.github.io/smithy-rs/design/server/middleware.html +[extractors]: https://smithy-lang.github.io/smithy-rs/design/server/from_parts.html ## Pre-requisites diff --git a/examples/pokemon-service-client-usage/Cargo.toml b/examples/pokemon-service-client-usage/Cargo.toml new file mode 100644 index 00000000000..dc1acaeaf42 --- /dev/null +++ b/examples/pokemon-service-client-usage/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "pokemon-service-client-usage" +version = "0.1.0" +edition = "2021" +publish = false + +[features] + + +[dependencies] +# The generated client utilizes types defined in other crates, such as `aws_smithy_types` +# and `aws_smithy_http`. However, most of these types are re-exported by the generated client, +# eliminating the need to directly depend on the crates that provide them. In rare instances, +# you may still need to include one of these crates as a dependency. Examples that require this +# are specifically noted in comments above the corresponding dependency in this file. +pokemon-service-client = { path = "../pokemon-service-client/", features = ["behavior-version-latest"] } + +# Required for getting the operation name from the `Metadata`. +aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http/" } + +# Required for `Storable` and `StoreReplace` in `response-header-interceptor` example. +aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types/" } + +# Required for `HyperClientBuilder` in `client-connector` example. +aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime/", features=["test-util"] } + + + +hyper = { version = "0.14.25", features = ["client", "full"] } +tokio = {version = "1.26.0", features=["full"]} +tracing = "0.1.37" +tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } +rustls = "0.21.8" +hyper-rustls = "0.24.1" +http = "0.2.9" +uuid = {version="1.4.1", features = ["v4"]} +thiserror = "1.0.49" diff --git a/examples/pokemon-service-client-usage/README.md b/examples/pokemon-service-client-usage/README.md new file mode 100644 index 00000000000..08021c37e82 --- /dev/null +++ b/examples/pokemon-service-client-usage/README.md @@ -0,0 +1,49 @@ +# smithy-rs Client Examples + +This package contains some examples on how to use the Smithy Client to communicate +with a Smithy-based service. + +## Pre-requisites + +1. Build the `pokemon-service-client` and `pokemon-service` by invoking `make` in the + [examples](https://github.com/smithy-lang/smithy-rs/tree/main/examples) folder. + +```console +make +``` + +2. Run the Pokemon service locally by issuing the following command from the + [examples](https://github.com/smithy-lang/smithy-rs/tree/main/examples) folder. This + will launch the Smithy-Rs based service on TCP port 13734. + +```console +cargo run --bin pokemon-service +``` + +## Running the examples + +You can view a list of examples by running `cargo run --example` from the +[pokemon-service-client-usage](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage) +folder. To run an example, pass its name to the `cargo run --example` command, e.g.: + +```console +cargo run --example simple-client +``` + +## List of examples + +| Rust Example | Description | +|--------------------------------|-------------------------------------------------------------------------| +| simple-client | Creates a Smithy Client and calls an operation on it. | +| endpoint-resolver | How to set a custom endpoint resolver. | +| handling-errors | How to send an input parameter to an operation, and to handle errors. | +| custom-header | How to add headers to a request. | +| custom-header-using-interceptor| How to access operation name being called in an interceptor. | +| response-header-interceptor | How to get operation name and access response before it is deserialized.| +| use-config-bag | How to use the property bag to pass data across interceptors. | +| retries-customize | Customize retry settings. | +| retries-disable | How to disable retries. | +| timeout-config | How to configure timeouts. | +| mock-request | Use a custom HttpConnector / Client to generate mock responses. | +| trace-serialize | Trace request and response as they are serialized / deserialized. | +| client-connector | Shows how to change TLS related configuration. | diff --git a/examples/pokemon-service-client-usage/examples/client-connector.rs b/examples/pokemon-service-client-usage/examples/client-connector.rs new file mode 100644 index 00000000000..b1a7ecef846 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/client-connector.rs @@ -0,0 +1,74 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to set connector settings. For example, how to set +/// trusted root certificates to use for HTTPs communication. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example client-connector`. +/// +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +use hyper_rustls::ConfigBuilderExt; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon +/// service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + let tls_config = rustls::ClientConfig::builder() + .with_safe_defaults() + // `with_native_roots()`: Load platform trusted root certificates. + // `with_webpki_roots()`: Load Mozilla’s set of trusted roots. + .with_native_roots() + // To use client side certificates, you can use + // `.with_client_auth_cert(client_cert, client_key)` instead of `.with_no_client_auth()` + .with_no_client_auth(); + + let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() + .with_tls_config(tls_config) + // This can be changed to `.https_only()` to ensure that the client always uses HTTPs + .https_or_http() + .enable_http1() + .enable_http2() + .build(); + + // Create a hyper-based HTTP client that uses this TLS connector. + let http_client = HyperClientBuilder::new().build(tls_connector); + + // Pass the smithy connector to the Client::ConfigBuilder + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .http_client(http_client) + .build(); + + // Instantiate a client by applying the configuration. + pokemon_service_client::Client::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(?response, "Response from service") +} diff --git a/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs b/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs new file mode 100644 index 00000000000..997cce306e3 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs @@ -0,0 +1,158 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// In this example, a custom header `x-amzn-client-ttl-seconds` is set for all outgoing requests. +/// It serves as a demonstration of how an operation name can be retrieved and utilized within +/// the interceptor. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example custom-header-using-interceptor`. +/// +use std::{collections::HashMap, time::Duration}; + +use pokemon_service_client::config::{ConfigBag, Intercept}; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client::{ + config::{interceptors::BeforeTransmitInterceptorContextMut, RuntimeComponents}, + error::BoxError, +}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +// The `TtlHeaderInterceptor` keeps a map of operation specific value to send +// in the header for each Request. +#[derive(Debug)] +pub struct TtlHeaderInterceptor { + /// Default time-to-live for an operation. + default_ttl: hyper::http::HeaderValue, + /// Operation specific time-to-live. + operation_ttl: HashMap<&'static str, hyper::http::HeaderValue>, +} + +// Helper function to format duration as fractional seconds. +fn format_ttl_value(ttl: Duration) -> String { + format!("{:.2}", ttl.as_secs_f64()) +} + +impl TtlHeaderInterceptor { + fn new(default_ttl: Duration) -> Self { + let duration_str = format_ttl_value(default_ttl); + let default_ttl_value = hyper::http::HeaderValue::from_str(duration_str.as_str()) + .expect("could not create a header value for the default ttl"); + + Self { + default_ttl: default_ttl_value, + operation_ttl: Default::default(), + } + } + + /// Adds an operation name specific timeout value that needs to be set in the header. + fn add_operation_ttl(&mut self, operation_name: &'static str, ttl: Duration) { + let duration_str = format_ttl_value(ttl); + + self.operation_ttl.insert( + operation_name, + hyper::http::HeaderValue::from_str(duration_str.as_str()) + .expect("cannot create header value for the given ttl duration"), + ); + } +} + +/// Appends the header `x-amzn-client-ttl-seconds` using either the default time-to-live value +/// or an operation-specific value if it was set earlier using `add_operation_ttl`. +//impl aws_smithy_runtime_api::client::interceptors::Interceptor for TtlHeaderInterceptor { +impl Intercept for TtlHeaderInterceptor { + fn name(&self) -> &'static str { + "TtlHeaderInterceptor" + } + + /// Before the request is signed, add the header to the outgoing request. + fn modify_before_signing( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + // Metadata in the ConfigBag has the operation name. + let metadata = cfg + .load::() + .expect("metadata should exist"); + let operation_name = metadata.name(); + + // Get operation specific or default HeaderValue to set for the header key. + let ttl = self + .operation_ttl + .get(operation_name) + .unwrap_or(&self.default_ttl); + + context + .request_mut() + .headers_mut() + .insert("x-amzn-client-ttl-seconds", ttl.clone()); + + tracing::info!("{operation_name} header set to {ttl:?}"); + + Ok(()) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // By default set the value of all operations to 6 seconds. + const DEFAULT_TTL: Duration = Duration::from_secs(6); + + // Set up the interceptor to add an operation specific value of 3.5 seconds to be added + // for GetStorage operation. + let mut ttl_headers_interceptor = TtlHeaderInterceptor::new(DEFAULT_TTL); + ttl_headers_interceptor.add_operation_ttl("GetStorage", Duration::from_millis(3500)); + + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .interceptor(ttl_headers_interceptor) + .build(); + + pokemon_service_client::Client::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response for get_server_statistics()"); + + // Call the operation `get_storage` on the Pokémon service. The `TtlHeaderInterceptor` + // interceptor will add a specific header name / value pair for this operation. + let response = client + .get_storage() + .user("ash") + .passcode("pikachu123") + .send() + .await + .expect("operation failed"); + + // Print the response received from the service. + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/custom-header.rs b/examples/pokemon-service-client-usage/examples/custom-header.rs new file mode 100644 index 00000000000..d84432f68c2 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/custom-header.rs @@ -0,0 +1,62 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to create a `smithy-rs` client, and call an operation with custom +/// headers in the request. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example custom-header` +/// +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon +/// service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .build(); + + // Apply the configuration on the client, and return that. + pokemon_service_client::Client::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .customize() + .mutate_request(|req| { + // For demonstration purposes, add a header `x-ttl-seconds` to the outgoing request. + let headers = req.headers_mut(); + headers.insert( + hyper::header::HeaderName::from_static("x-ttl-seconds"), + hyper::header::HeaderValue::from(30), + ); + }) + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs b/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs new file mode 100644 index 00000000000..565efb18acd --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/endpoint-resolver.rs @@ -0,0 +1,102 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how a custom `ResolveEndpoint` can be implemented for resolving +/// endpoint of a request. Additionally, it shows how a header can be added using the endpoint +/// builder. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example endpoint-resolver`. +/// +use pokemon_service_client::config::endpoint::{Endpoint, EndpointFuture, Params, ResolveEndpoint}; +use pokemon_service_client::primitives::{DateTime, DateTimeFormat}; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::setup_tracing_subscriber; + +use std::time::SystemTime; + +// This struct, provided as an example, constructs the URL that should be set on each request during initialization. +// It also implements the `ResolveEndpoint` trait, enabling it to be assigned as the endpoint_resolver in the `Config`. +#[derive(Debug)] +struct RegionalEndpoint { + url_to_use: String, +} + +impl RegionalEndpoint { + fn new(regional_url: &str, port: u16) -> Self { + let url_to_use = format!("{}:{}", regional_url, port); + RegionalEndpoint { url_to_use } + } +} + +impl ResolveEndpoint for RegionalEndpoint { + fn resolve_endpoint<'a>(&'a self, _params: &'a Params) -> EndpointFuture<'a> { + // Construct an endpoint using the Endpoint::Builder. Set the URL and, + // optionally, any headers to be sent with the request. For this example, + // we'll set the 'x-amz-date' header to the current date for all outgoing requests. + // `DateTime` can be used for formatting an RFC 3339 date time. + let now = SystemTime::now(); + let date_time = DateTime::from(now); + + let endpoint = Endpoint::builder() + .url(self.url_to_use.clone()) + .header( + "x-amz-date", + date_time + .fmt(DateTimeFormat::DateTimeWithOffset) + .expect("Could not create a date in UTC format"), + ) + .build(); + tracing::info!(?endpoint, "Resolving endpoint"); + EndpointFuture::ready(Ok(endpoint)) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + const DEFAULT_PORT: u16 = 13734; + + // Use the environment variable `REGIONAL_URL` for the URL. + let resolver = RegionalEndpoint::new( + std::env::var("REGIONAL_URL") + .as_deref() + .unwrap_or("http://localhost"), + DEFAULT_PORT, + ); + + let config = pokemon_service_client::Config::builder() + .endpoint_resolver(resolver) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/handling-errors.rs b/examples/pokemon-service-client-usage/examples/handling-errors.rs new file mode 100644 index 00000000000..dfcebda6109 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/handling-errors.rs @@ -0,0 +1,130 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! This example demonstrates how to handle service generated errors. +//! +//! The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +//! Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +//! file for instructions on how to launch the service locally. +//! +//! The example can be run using `cargo run --example handling-errors`. + +use pokemon_service_client::error::DisplayErrorContext; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client::{error::SdkError, operation::get_storage::GetStorageError}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // The following example sends an incorrect passcode to the operation `get_storage`, + // which will return + // [StorageAccessNotAuthorized](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy#L48) + let response_result = client + .get_storage() + .user("ash") + // Give a wrong password to generate a service error. + .passcode("pkachu123") + .send() + .await; + + // All errors are consolidated into an `SdkError` + match response_result { + Ok(response) => { + tracing::info!(?response, "Response from service") + } + Err(SdkError::ServiceError(se)) => { + // When an error response is received from the service, it is modeled + // as a `SdkError::ServiceError`. + match se.err() { + // Not authorized to access Pokémon storage. + GetStorageError::StorageAccessNotAuthorized(_) => { + tracing::error!("You do not have access to this resource."); + } + GetStorageError::ResourceNotFoundError(rnfe) => { + let message = rnfe.message(); + tracing::error!(error = %message, + "Given Pikachu does not exist on the server." + ) + } + GetStorageError::ValidationError(ve) => { + tracing::error!(error = %ve, "A required field has not been set."); + } + // The SdkError is marked as `#[non_exhaustive]`. Therefore, a catch-all pattern is required to handle + // potential future variants introduced in SdkError. + _ => { + tracing::error!(error = %DisplayErrorContext(se.err()), "Some other error has occurred on the server") + } + } + } + Err(SdkError::TimeoutError(_)) => { + tracing::error!("The request timed out and could not be completed"); + } + Err(SdkError::ResponseError(re)) => { + // Raw response received from the service can be retrieved using + // the `raw()` method. + tracing::error!( + "An unparsable response was received. Raw response: {:?}", + re.raw() + ); + } + Err(sdk_error) => { + // To retrieve the `source()` of an error within the following match statements, + // we work with the parent `SdkError` type, as individual variants don't directly provide it. + // Converting the parent error to its source transfers ownership of the variable. + match sdk_error { + SdkError::DispatchFailure(ref failure) => { + if failure.is_io() { + tracing::error!("An I/O error occurred"); + } else if failure.is_timeout() { + tracing::error!("Request timed out"); + } else if failure.is_user() { + tracing::error!("An invalid HTTP request has been provided"); + } else { + tracing::error!("Some other dispatch error occurred."); + }; + + if let Ok(source) = sdk_error.into_source() { + tracing::error!(%source, "Error source"); + } + } + SdkError::ConstructionFailure(_) => { + if let Ok(source) = sdk_error.into_source() { + tracing::error!(%source, "Request could not be constructed."); + } else { + tracing::error!("Request could not be constructed for unknown reasons"); + } + } + _ => { + tracing::error!("An unknown error has occurred"); + } + } + } + } +} diff --git a/examples/pokemon-service-client-usage/examples/mock-request.rs b/examples/pokemon-service-client-usage/examples/mock-request.rs new file mode 100644 index 00000000000..5afafdaee14 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/mock-request.rs @@ -0,0 +1,76 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to use a mock connector with `capture_request`. This allows for +/// responding with a static `Response` while capturing the incoming request. The captured request +/// can later be asserted to verify that the correct headers and body were sent to the server. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example mock-request`. +/// +use aws_smithy_runtime::client::http::test_util::capture_request; +use pokemon_service_client::primitives::SdkBody; +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Build a response that should be sent when the operation is called. + let response = http::Response::builder() + .status(200) + .body(SdkBody::from(r#"{"calls_count":100}"#)) + .expect("response could not be constructed"); + + // Call `capture_request` to obtain a HTTP connector and a request receiver. + // The request receiver captures the incoming request, while the connector can be passed + // to `Config::builder().http_client`. + let (http_client, captured_request) = capture_request(Some(response)); + + // Pass the `http_client` connector to `Config::builder`. The connector won't send + // the request over the network; instead, it will return the static response provided + // during its initialization. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .http_client(http_client) + .build(); + + // Instantiate a client by applying the configuration. + let client = PokemonClient::from_conf(config); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .customize() + .mutate_request(|req| { + // For demonstration, send an extra header that can be verified to confirm + // that the client actually sends it. + let headers = req.headers_mut(); + headers.insert( + hyper::header::HeaderName::from_static("user-agent"), + hyper::header::HeaderName::from_static("sample-client"), + ); + }) + .send() + .await + .expect("operation failed"); + + // Print the response received from the service. + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); + + // The captured request can be verified to have certain headers. + let req = captured_request.expect_request(); + assert_eq!(req.headers().get("user-agent"), Some("sample-client")); + + // As an example, you can verify the URL matches. + assert_eq!(req.uri(), "http://localhost:13734/stats"); + + // You can convert the captured body into a &str and use assert! + // on it if you want to verify the contents of the request body. + // let str_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap(); +} diff --git a/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs new file mode 100644 index 00000000000..a1ec2501979 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/response-header-interceptor.rs @@ -0,0 +1,163 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how response headers can be examined before they are deserialized +/// into the output type. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example response-header-interceptor`. +/// +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use pokemon_service_client::{ + config::{ + interceptors::{ + BeforeDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, + }, + ConfigBag, Intercept, RuntimeComponents, + }, + error::BoxError, + Client as PokemonClient, +}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use uuid::Uuid; + +#[derive(Debug, Clone)] +struct RequestId { + client_id: String, + server_id: Option, +} + +impl Storable for RequestId { + type Storer = StoreReplace; +} + +#[derive(Debug, thiserror::Error)] +enum RequestIdError { + /// Client side + #[error("Client side request ID has not been set")] + ClientRequestIdMissing(), +} + +#[derive(Debug, Default)] +pub struct ResponseHeaderLoggingInterceptor; + +impl ResponseHeaderLoggingInterceptor { + /// Creates a new `ResponseHeaderLoggingInterceptor` + pub fn new() -> Self { + Self::default() + } +} + +impl Intercept for ResponseHeaderLoggingInterceptor { + fn name(&self) -> &'static str { + "ResponseHeaderLoggingInterceptor" + } + + /// Before the request is signed, add the header to the outgoing request. + fn modify_before_signing( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let client_id = Uuid::new_v4().to_string(); + + let request_id = hyper::header::HeaderValue::from_str(&client_id) + .expect("failed to construct a header value from UUID"); + context + .request_mut() + .headers_mut() + .insert("x-amzn-requestid", request_id); + + cfg.interceptor_state().store_put(RequestId { + client_id, + server_id: None, + }); + + Ok(()) + } + + fn read_before_deserialization( + &self, + context: &BeforeDeserializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + // `Metadata` in the `ConfigBag` has the operation name in it. + let metadata = cfg + .load::() + .expect("metadata should exist"); + let operation_name = metadata.name().to_string(); + + // Get the server side request ID and set it in the RequestID data type + // that is in the ConfigBag. This way any other interceptor that requires the mapping + // can easily find it from the bag. + let response = context.response(); + let header_received = response + .headers() + .iter() + .find(|(header_name, _)| *header_name == "x-request-id"); + + if let Some((_, server_id)) = header_received { + let request_details = cfg + .get_mut::() + .ok_or_else(|| Box::new(RequestIdError::ClientRequestIdMissing()))?; + + tracing::info!(operation = %operation_name, + "RequestID Mapping: {} = {server_id}", + request_details.client_id, + ); + + request_details.server_id = Some(server_id.into()); + } else { + tracing::info!(operation = %operation_name, "Server RequestID missing in response"); + } + + Ok(()) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon +/// service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .interceptor(ResponseHeaderLoggingInterceptor) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + // If you need to access the `RequestIdError` raised by the interceptor, + // you can convert `SdkError::DispatchFailure` to a `ConnectorError` + // and then use `downcast_ref` on its source to get a `RequestIdError`. + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/retry-classifier.rs b/examples/pokemon-service-client-usage/examples/retry-classifier.rs new file mode 100644 index 00000000000..b5754a5fba1 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/retry-classifier.rs @@ -0,0 +1,112 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how a custom RetryClassifier can be written to decide +/// which error conditions should be retried. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example retry-classifier`. +/// +use http::StatusCode; +use pokemon_service_client::{ + config::{ + interceptors::InterceptorContext, + retry::{ClassifyRetry, RetryAction, RetryConfig}, + }, + operation::get_server_statistics::GetServerStatisticsError, +}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use std::time::Duration; + +use pokemon_service_client::Client as PokemonClient; + +#[derive(Debug)] +struct SampleRetryClassifier; + +// By default, the generated client uses the `aws_http::retry::AwsResponseRetryClassifier` +// to determine whether an error should be retried. To use a custom retry classifier, +// implement the `ClassifyRetry` trait and pass it to the retry_classifier method +// of the `Config::builder`. +impl ClassifyRetry for SampleRetryClassifier { + fn name(&self) -> &'static str { + "SampleRetryClassifier" + } + + // For this example, the classifier should retry in case the error is GetServerStatisticsError + // and the status code is 503. + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Get the output or error that has been deserialized from the response. + let output_or_error = ctx.output_or_error(); + + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + // Retry in case the error returned is GetServerStatisticsError and StatusCode is 503. + if let Some(_err) = error + .as_operation_error() + .and_then(|err| err.downcast_ref::()) + { + if let Some(response) = ctx.response() { + if response.status() == StatusCode::SERVICE_UNAVAILABLE.into() { + return RetryAction::server_error(); + } + } + } + + // Let other classifiers run and decide if the request should be retried. + // Returning RetryAction::RetryForbidden will forbid any retries. + RetryAction::NoActionIndicated + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // By default the Smithy client uses RetryConfig::standard() strategy, with 3 retries, and + // an initial exponential back off of 1 second. To turn it off use RetryConfig::disabled(). + let retry_config = RetryConfig::standard() + .with_initial_backoff(Duration::from_secs(3)) + .with_max_attempts(5); + + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .retry_config(retry_config) + // Add the retry classifier. + .retry_classifier(SampleRetryClassifier {}) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/retry-customize.rs b/examples/pokemon-service-client-usage/examples/retry-customize.rs new file mode 100644 index 00000000000..13c67af4655 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/retry-customize.rs @@ -0,0 +1,60 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to customize retry settings on a Smithy client. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example retry-customize`. +/// +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use std::time::Duration; + +use pokemon_service_client::{config::retry::RetryConfig, Client as PokemonClient}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // By default the Smithy client uses `RetryConfig::standard()` strategy, with 3 retries, and + // an initial exponential back off of 1 second. To turn it off use `RetryConfig::disabled()`. + let retry_config = RetryConfig::standard() + .with_initial_backoff(Duration::from_secs(3)) + .with_max_attempts(5); + + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .retry_config(retry_config) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/simple-client.rs b/examples/pokemon-service-client-usage/examples/simple-client.rs new file mode 100644 index 00000000000..dbc7303386a --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/simple-client.rs @@ -0,0 +1,53 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to create a `smithy-rs` Client and call an +/// [operation](https://smithy.io/2.0/spec/idl.html?highlight=operation#operation-shape). +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example simple-client`. +/// +use pokemon_service_client::Client as PokemonClient; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon +/// service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client contains a type `config::Builder` for constructing a `Config` instance. + // This enables configuration of endpoint resolvers, timeouts, retries, etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .build(); + + // Instantiate a client by applying the configuration. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + // Print the response received from the service. + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/timeout-config.rs b/examples/pokemon-service-client-usage/examples/timeout-config.rs new file mode 100644 index 00000000000..717961fb96a --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/timeout-config.rs @@ -0,0 +1,64 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how to create a `smithy-rs` Client and set connection +/// and operation related timeouts on the client. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example timeout-config` +/// +use std::time::Duration; + +use pokemon_service_client::{config::timeout::TimeoutConfig, Client as PokemonClient}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // Different type of timeouts can be set on the client. These are: + // operation_attempt_timeout - If retries are enabled, this represents the timeout + // for each individual operation attempt. + // operation_timeout - Overall timeout for the operation to complete. + // connect timeout - The amount of time allowed for a connection to be established. + let timeout_config = TimeoutConfig::builder() + .operation_attempt_timeout(Duration::from_secs(1)) + .operation_timeout(Duration::from_secs(5)) + .connect_timeout(Duration::from_millis(500)) + .build(); + + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .timeout_config(timeout_config) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("Pokemon service does not seem to be running on localhost:13734"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/trace-serialize.rs b/examples/pokemon-service-client-usage/examples/trace-serialize.rs new file mode 100644 index 00000000000..c5dc8f206f1 --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/trace-serialize.rs @@ -0,0 +1,126 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +use aws_smithy_runtime::client::http::connection_poisoning::CaptureSmithyConnection; +/// This example demonstrates how an interceptor can be written to trace what is being +/// serialized / deserialized on the wire. +/// +/// Please beware that this may log sensitive information! This example is meant for pedagogical +/// purposes and may be useful in debugging scenarios. Please don't use this as-is in production. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example trace-serialize`. +/// +use http::StatusCode; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use std::str; + +use pokemon_service_client::{ + config::{ + interceptors::{ + BeforeDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextRef, + }, + ConfigBag, Intercept, RuntimeComponents, + }, + error::BoxError, + Client as PokemonClient, +}; + +/// An example interceptor that logs the request and response as they're sent and received. +#[derive(Debug, Default)] +pub struct WireFormatInterceptor; + +impl Intercept for WireFormatInterceptor { + fn name(&self) -> &'static str { + "WireFormatInterceptor" + } + + // Called after the operation input has been serialized but before it's dispatched over the wire. + fn read_after_serialization( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + // Get the request type from the context. + let request = context.request(); + // Print the request to the debug tracing log. + tracing::debug!(?request); + + Ok(()) + } + + // Called after the operation's response has been received but before it's deserialized into the + // operation's output type. + fn read_before_deserialization( + &self, + context: &BeforeDeserializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + // Get the response type from the context. + let response = context.response(); + // Print the response. + if response.status().as_u16() == StatusCode::OK.as_u16() { + tracing::info!(?response, "Response received:"); + } else { + tracing::error!(?response); + } + + // Print the connection information + let captured_connection = cfg.load::().cloned(); + if let Some(captured_connection) = captured_connection.and_then(|conn| conn.get()) { + tracing::info!( + remote_addr = ?captured_connection.remote_addr(), + local_addr = ?captured_connection.local_addr(), + "Captured connection info" + ); + } else { + tracing::warn!("Connection info is missing!"); + } + + Ok(()) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .interceptor(WireFormatInterceptor {}) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("operation failed"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/examples/use-config-bag.rs b/examples/pokemon-service-client-usage/examples/use-config-bag.rs new file mode 100644 index 00000000000..9452051a6da --- /dev/null +++ b/examples/pokemon-service-client-usage/examples/use-config-bag.rs @@ -0,0 +1,140 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +/// This example demonstrates how different interceptor can use a property bag to pass +/// state from one interceptor to the next. +/// +/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734. +/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md) +/// file for instructions on how to launch the service locally. +/// +/// The example can be run using `cargo run --example use-config-bag`. +/// +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL}; +use std::time::Instant; + +use pokemon_service_client::{ + config::{ + interceptors::{ + BeforeDeserializationInterceptorContextRef, FinalizerInterceptorContextRef, + }, + ConfigBag, Intercept, RuntimeComponents, + }, + error::BoxError, + Client as PokemonClient, +}; + +#[derive(Debug)] +struct RequestTimestamp(Instant); + +impl Storable for RequestTimestamp { + type Storer = StoreReplace; +} + +#[derive(Debug, Default)] +pub struct SetTimeInterceptor; + +/// Note: This is merely an example demonstrating how state can +/// be shared between two different interceptors. In a practical +/// scenario, there wouldn't be a need to write two interceptors +/// merely to display the duration from the start of the lifecycle +/// to the receipt of the response. This task can be accomplished +/// within a single interceptor by overriding both +/// read_before_execution and read_before_deserialization. +impl Intercept for SetTimeInterceptor { + fn name(&self) -> &'static str { + "SetTimeInterceptor" + } + + fn read_before_execution( + &self, + _context: &pokemon_service_client::config::interceptors::BeforeSerializationInterceptorContextRef<'_>, + cfg: &mut aws_smithy_types::config_bag::ConfigBag, + ) -> Result<(), pokemon_service_client::error::BoxError> { + cfg.interceptor_state() + .store_put(RequestTimestamp(Instant::now())); + Ok(()) + } +} + +#[derive(Debug, Default)] +pub struct GetTimeInterceptor; + +impl Intercept for GetTimeInterceptor { + fn name(&self) -> &'static str { + "GetTimeInterceptor" + } + + fn read_before_deserialization( + &self, + _context: &BeforeDeserializationInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let stop_watch = cfg + .load::() + .expect("StopWatch not found in the ConfigBag"); + + let time_taken = stop_watch.0.elapsed(); + tracing::info!(time_taken = %time_taken.as_micros(), "Microseconds:"); + + Ok(()) + } + + fn read_after_execution( + &self, + _context: &FinalizerInterceptorContextRef<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), pokemon_service_client::error::BoxError> { + let timestamp = cfg + .load::() + .expect("RequestTimeStamp not found in the ConfigBag"); + + let time_taken = timestamp.0.elapsed(); + tracing::info!(time_taken = %time_taken.as_micros(), "Microseconds:"); + + Ok(()) + } +} + +/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734. +/// +/// # Examples +/// +/// Basic usage: +/// +/// ``` +/// let client = create_client(); +/// ``` +fn create_client() -> PokemonClient { + // The generated client has a type `Config::Builder` that can be used to build a `Config`, which + // allows configuring endpoint-resolver, timeouts, retries etc. + let config = pokemon_service_client::Config::builder() + .endpoint_url(POKEMON_SERVICE_URL) + .interceptor(SetTimeInterceptor) + .interceptor(GetTimeInterceptor) + .build(); + + // Apply the configuration on the client, and return that. + PokemonClient::from_conf(config) +} + +#[tokio::main] +async fn main() { + setup_tracing_subscriber(); + + // Create a configured `smithy-rs` client. + let client = create_client(); + + // Call an operation `get_server_statistics` on the Pokémon service. + let response = client + .get_server_statistics() + .send() + .await + .expect("Pokemon service does not seem to be running on localhost:13734"); + + tracing::info!(%POKEMON_SERVICE_URL, ?response, "Response received"); +} diff --git a/examples/pokemon-service-client-usage/src/lib.rs b/examples/pokemon-service-client-usage/src/lib.rs new file mode 100644 index 00000000000..6612ddb4c4c --- /dev/null +++ b/examples/pokemon-service-client-usage/src/lib.rs @@ -0,0 +1,19 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +pub static POKEMON_SERVICE_URL: &str = "http://localhost:13734"; + +/// Sets up the tracing subscriber to print `tracing::info!` and `tracing::error!` messages on the console. +pub fn setup_tracing_subscriber() { + // Add a tracing subscriber that uses the environment variable RUST_LOG + // to figure out which log level should be emitted. By default use `tracing::info!` + // as the logging level. + let filter = tracing_subscriber::EnvFilter::builder() + .with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into()) + .from_env_lossy(); + + tracing_subscriber::fmt::fmt() + .with_env_filter(filter) + .init(); +} diff --git a/examples/pokemon-service-common/Cargo.toml b/examples/pokemon-service-common/Cargo.toml index d0012e178b2..3121fcb11ad 100644 --- a/examples/pokemon-service-common/Cargo.toml +++ b/examples/pokemon-service-common/Cargo.toml @@ -16,8 +16,11 @@ tokio = { version = "1", default-features = false, features = ["time"] } tower = "0.4" # Local paths -aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client" } -aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http" } +aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } +aws-smithy-runtime-api = { path = "../../rust-runtime/aws-smithy-runtime-api", features = ["client"] } aws-smithy-http-server = { path = "../../rust-runtime/aws-smithy-http-server" } pokemon-service-client = { path = "../pokemon-service-client" } pokemon-service-server-sdk = { path = "../pokemon-service-server-sdk" } + +[dev-dependencies] +aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["test-util"] } diff --git a/examples/pokemon-service-common/src/lib.rs b/examples/pokemon-service-common/src/lib.rs index d8618e0cce3..72f18605498 100644 --- a/examples/pokemon-service-common/src/lib.rs +++ b/examples/pokemon-service-common/src/lib.rs @@ -15,18 +15,17 @@ use std::{ }; use async_stream::stream; -use aws_smithy_client::{conns, hyper_ext::Adapter}; -use aws_smithy_http::{body::SdkBody, byte_stream::ByteStream, operation::Request}; use aws_smithy_http_server::Extension; -use http::{ - uri::{Authority, Scheme}, - Uri, -}; +use aws_smithy_runtime::client::http::hyper_014::HyperConnector; +use aws_smithy_runtime_api::client::http::HttpConnector; +use http::Uri; use pokemon_service_server_sdk::{ - error, input, model, model::CapturingPayload, output, types::Blob, + error, input, model, + model::CapturingPayload, + output, + types::{Blob, ByteStream, SdkBody}, }; use rand::{seq::SliceRandom, Rng}; -use tower::Service; use tracing_subscriber::{prelude::*, EnvFilter}; const PIKACHU_ENGLISH_FLAVOR_TEXT: &str = @@ -38,21 +37,6 @@ const PIKACHU_ITALIAN_FLAVOR_TEXT: &str = const PIKACHU_JAPANESE_FLAVOR_TEXT: &str = "ほっぺたの りょうがわに ちいさい でんきぶくろを もつ。ピンチのときに ほうでんする。"; -/// Rewrites the base URL of a request -pub fn rewrite_base_url( - scheme: Scheme, - authority: Authority, -) -> impl Fn(Request) -> Request + Clone { - move |mut req| { - let http_req = req.http_mut(); - let mut uri_parts = http_req.uri().clone().into_parts(); - uri_parts.authority = Some(authority.clone()); - uri_parts.scheme = Some(scheme.clone()); - *http_req.uri_mut() = Uri::from_parts(uri_parts).expect("failed to create uri from parts"); - req - } -} - /// Kills [`Child`] process when dropped. #[derive(Debug)] #[must_use] @@ -344,12 +328,14 @@ pub async fn stream_pokemon_radio( .parse::() .expect("Invalid url in `RADIO_STREAMS`"); - let mut connector = Adapter::builder().build(conns::https()); + let connector = HyperConnector::builder().build_https(); let result = connector .call( http::Request::builder() .uri(radio_stream_url) .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap(), ) .await diff --git a/examples/pokemon-service-common/tests/plugins_execution_order.rs b/examples/pokemon-service-common/tests/plugins_execution_order.rs index de9f2632f1e..be50b50a045 100644 --- a/examples/pokemon-service-common/tests/plugins_execution_order.rs +++ b/examples/pokemon-service-common/tests/plugins_execution_order.rs @@ -10,45 +10,41 @@ use std::{ task::{Context, Poll}, }; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http_server::plugin::{IdentityPlugin, Plugin, PluginPipeline}; +use aws_smithy_http_server::plugin::{HttpMarker, HttpPlugins, Plugin}; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; use tower::{Layer, Service}; -use pokemon_service_client::{operation::do_nothing::DoNothingInput, Config}; +use aws_smithy_runtime::client::http::test_util::capture_request; +use pokemon_service_client::{Client, Config}; use pokemon_service_common::do_nothing; -trait OperationExt { - /// Convert an SDK operation into an `http::Request`. - fn into_http(self) -> http::Request; -} - -impl OperationExt for aws_smithy_http::operation::Operation { - fn into_http(self) -> http::Request { - self.into_request_response().0.into_parts().0 - } -} - #[tokio::test] async fn plugin_layers_are_executed_in_registration_order() { // Each plugin layer will push its name into this vector when it gets invoked. // We can then check the vector content to verify the invocation order let output = Arc::new(Mutex::new(Vec::new())); - let pipeline = PluginPipeline::new() + let http_plugins = HttpPlugins::new() .push(SentinelPlugin::new("first", output.clone())) .push(SentinelPlugin::new("second", output.clone())); - let mut app = - pokemon_service_server_sdk::PokemonService::builder_with_plugins(pipeline, IdentityPlugin) - .do_nothing(do_nothing) - .build_unchecked(); - let request = DoNothingInput::builder() - .build() - .unwrap() - .make_operation(&Config::builder().build()) - .await - .unwrap() - .into_http(); - app.call(request).await.unwrap(); + let config = PokemonServiceConfig::builder() + .http_plugin(http_plugins) + .build(); + let mut app = PokemonService::builder(config) + .do_nothing(do_nothing) + .build_unchecked(); + + let request = { + let (http_client, rcvr) = capture_request(None); + let config = Config::builder() + .http_client(http_client) + .endpoint_url("http://localhost:1234") + .build(); + Client::from_conf(config).do_nothing().send().await.unwrap(); + rcvr.expect_request() + }; + + app.call(request.try_into_http02x().unwrap()).await.unwrap(); let output_guard = output.lock().unwrap(); assert_eq!(output_guard.deref(), &vec!["first", "second"]); @@ -77,7 +73,8 @@ impl Plugin for SentinelPlugin { } } -/// A [`Service`] that adds a print log. +impl HttpMarker for SentinelPlugin {} + #[derive(Clone, Debug)] pub struct SentinelService { inner: S, @@ -103,7 +100,6 @@ where } } -/// A [`Layer`] which constructs the [`PrintService`]. #[derive(Debug)] pub struct SentinelLayer { name: &'static str, diff --git a/examples/pokemon-service-lambda/src/main.rs b/examples/pokemon-service-lambda/src/main.rs index 2f08e072b56..6f581158660 100644 --- a/examples/pokemon-service-lambda/src/main.rs +++ b/examples/pokemon-service-lambda/src/main.rs @@ -12,13 +12,17 @@ use pokemon_service_common::{ setup_tracing, stream_pokemon_radio, State, }; use pokemon_service_lambda::get_storage_lambda; -use pokemon_service_server_sdk::PokemonService; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; #[tokio::main] pub async fn main() { setup_tracing(); - let app = PokemonService::builder_without_plugins() + let config = PokemonServiceConfig::builder() + // Set up shared state and middlewares. + .layer(AddExtensionLayer::new(Arc::new(State::default()))) + .build(); + let app = PokemonService::builder(config) // Build a registry containing implementations to all the operations in the service. These // are async functions or async closures that take as input the operation's input and // return the operation's output. @@ -30,9 +34,7 @@ pub async fn main() { .check_health(check_health) .stream_pokemon_radio(stream_pokemon_radio) .build() - .expect("failed to build an instance of PokemonService") - // Set up shared state and middlewares. - .layer(&AddExtensionLayer::new(Arc::new(State::default()))); + .expect("failed to build an instance of PokemonService"); let handler = LambdaHandler::new(app); let lambda = lambda_http::run(handler); diff --git a/examples/pokemon-service-tls/Cargo.toml b/examples/pokemon-service-tls/Cargo.toml index e1c3b3a0824..566afcfc0a7 100644 --- a/examples/pokemon-service-tls/Cargo.toml +++ b/examples/pokemon-service-tls/Cargo.toml @@ -26,11 +26,12 @@ pokemon-service-common = { path = "../pokemon-service-common/" } assert_cmd = "2.0" serial_test = "1.0.0" -# This dependency is only required for testing the `pokemon-service-tls` program. +# These dependencies are only required for testing the `pokemon-service-tls` program. hyper-rustls = { version = "0.24", features = ["http2"] } +hyper-tls = { version = "0.5" } # Local paths -aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client/", features = ["rustls"] } aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http/" } +aws-smithy-runtime = { path = "../../rust-runtime/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types/" } pokemon-service-client = { path = "../pokemon-service-client/" } diff --git a/examples/pokemon-service-tls/src/main.rs b/examples/pokemon-service-tls/src/main.rs index a67d1450422..45d6964686b 100644 --- a/examples/pokemon-service-tls/src/main.rs +++ b/examples/pokemon-service-tls/src/main.rs @@ -36,7 +36,7 @@ use pokemon_service_common::{ capture_pokemon, check_health, do_nothing, get_pokemon_species, get_server_statistics, get_storage, setup_tracing, stream_pokemon_radio, State, }; -use pokemon_service_server_sdk::PokemonService; +use pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig}; use pokemon_service_tls::{DEFAULT_ADDRESS, DEFAULT_PORT, DEFAULT_TEST_CERT, DEFAULT_TEST_KEY}; #[derive(Parser, Debug)] @@ -61,7 +61,11 @@ pub async fn main() { let args = Args::parse(); setup_tracing(); - let app = PokemonService::builder_without_plugins() + let config = PokemonServiceConfig::builder() + // Set up shared state and middlewares. + .layer(AddExtensionLayer::new(Arc::new(State::default()))) + .build(); + let app = PokemonService::builder(config) // Build a registry containing implementations to all the operations in the service. These // are async functions or async closures that take as input the operation's input and // return the operation's output. @@ -73,9 +77,7 @@ pub async fn main() { .check_health(check_health) .stream_pokemon_radio(stream_pokemon_radio) .build() - .expect("failed to build an instance of PokemonService") - // Set up shared state and middlewares. - .layer(&AddExtensionLayer::new(Arc::new(State::default()))); + .expect("failed to build an instance of PokemonService"); let addr: SocketAddr = format!("{}:{}", args.address, args.port) .parse() diff --git a/examples/pokemon-service-tls/tests/common/mod.rs b/examples/pokemon-service-tls/tests/common/mod.rs index 5eb9d804bae..8954365a205 100644 --- a/examples/pokemon-service-tls/tests/common/mod.rs +++ b/examples/pokemon-service-tls/tests/common/mod.rs @@ -3,18 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -use std::{fs::File, io::BufReader, process::Command, str::FromStr, time::Duration}; +use std::{fs::File, io::BufReader, process::Command, time::Duration}; use assert_cmd::prelude::*; -use aws_smithy_client::{ - erase::{DynConnector, DynMiddleware}, - hyper_ext::Adapter, -}; -use hyper::http::uri::{Authority, Scheme}; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; use tokio::time::sleep; -use pokemon_service_client::{Builder, Client, Config}; -use pokemon_service_common::{rewrite_base_url, ChildDrop}; +use pokemon_service_client::{Client, Config}; +use pokemon_service_common::ChildDrop; use pokemon_service_tls::{DEFAULT_DOMAIN, DEFAULT_PORT, DEFAULT_TEST_CERT}; pub async fn run_server() -> ChildDrop { @@ -28,7 +24,7 @@ pub async fn run_server() -> ChildDrop { // Returns a client that only talks through https and http2 connections. // It is useful in testing whether our server can talk to http2. -pub fn client_http2_only() -> Client> { +pub fn client_http2_only() -> Client { // Create custom cert store and add our test certificate to prevent unknown cert issues. let mut reader = BufReader::new(File::open(DEFAULT_TEST_CERT).expect("could not open certificate")); @@ -47,12 +43,39 @@ pub fn client_http2_only() -> Client> .enable_http2() .build(); - let authority = Authority::from_str(&format!("{DEFAULT_DOMAIN}:{DEFAULT_PORT}")) - .expect("could not parse authority"); - let raw_client = Builder::new() - .connector(DynConnector::new(Adapter::builder().build(connector))) - .middleware_fn(rewrite_base_url(Scheme::HTTPS, authority)) - .build_dyn(); - let config = Config::builder().build(); - Client::with_config(raw_client, config) + let config = Config::builder() + .http_client(HyperClientBuilder::new().build(connector)) + .endpoint_url(format!("https://{DEFAULT_DOMAIN}:{DEFAULT_PORT}")) + .build(); + Client::from_conf(config) +} + +/// A `hyper` connector that uses the `native-tls` crate for TLS. To use this in a Smithy client, +/// wrap with a [`HyperClientBuilder`]. +pub type NativeTlsConnector = hyper_tls::HttpsConnector; + +fn native_tls_connector() -> NativeTlsConnector { + let cert = hyper_tls::native_tls::Certificate::from_pem( + std::fs::read_to_string(DEFAULT_TEST_CERT) + .expect("could not open certificate") + .as_bytes(), + ) + .expect("could not parse certificate"); + + let tls_connector = hyper_tls::native_tls::TlsConnector::builder() + .min_protocol_version(Some(hyper_tls::native_tls::Protocol::Tlsv12)) + .add_root_certificate(cert) + .build() + .unwrap_or_else(|e| panic!("error while creating TLS connector: {}", e)); + let mut http_connector = hyper::client::HttpConnector::new(); + http_connector.enforce_http(false); + hyper_tls::HttpsConnector::from((http_connector, tls_connector.into())) +} + +pub fn native_tls_client() -> Client { + let config = Config::builder() + .http_client(HyperClientBuilder::new().build(native_tls_connector())) + .endpoint_url(format!("https://{DEFAULT_DOMAIN}:{DEFAULT_PORT}")) + .build(); + Client::from_conf(config) } diff --git a/examples/pokemon-service-tls/tests/custom_connectors.rs b/examples/pokemon-service-tls/tests/custom_connectors.rs new file mode 100644 index 00000000000..12c82d55cbc --- /dev/null +++ b/examples/pokemon-service-tls/tests/custom_connectors.rs @@ -0,0 +1,29 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +pub mod common; + +use serial_test::serial; + +#[tokio::test] +#[serial] +// This test invokes an operation with a client that can only send HTTP2 requests and whose TLS +// implementation is backed by `rustls`. +async fn test_check_health_http2_rustls_connector() { + let _child = common::run_server().await; + let client = common::client_http2_only(); + + let _check_health = client.check_health().send().await.unwrap(); +} + +#[tokio::test] +#[serial] +// This test invokes an operation with a client whose TLS implementation is backed by `native_tls`. +async fn test_check_health_native_tls_connector() { + let _child = common::run_server().await; + let client = common::native_tls_client(); + + let _check_health = client.check_health().send().await.unwrap(); +} diff --git a/examples/pokemon-service-tls/tests/http2.rs b/examples/pokemon-service-tls/tests/http2.rs deleted file mode 100644 index 32c0fba08c7..00000000000 --- a/examples/pokemon-service-tls/tests/http2.rs +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -pub mod common; - -#[tokio::test] -async fn test_check_health_http2() { - let _child = common::run_server().await; - let client = common::client_http2_only(); - - let _check_health = client.check_health().send().await.unwrap(); -} diff --git a/examples/pokemon-service/Cargo.toml b/examples/pokemon-service/Cargo.toml index d3bc81ea0b6..8af48fa141d 100644 --- a/examples/pokemon-service/Cargo.toml +++ b/examples/pokemon-service/Cargo.toml @@ -8,6 +8,7 @@ description = "A smithy Rust service to retrieve information about Pokémon." [dependencies] clap = { version = "4.1.11", features = ["derive"] } +http = "0.2" hyper = { version = "0.14.26", features = ["server"] } tokio = "1.26.0" tower = "0.4" @@ -31,7 +32,5 @@ hyper = { version = "0.14.26", features = ["server", "client"] } hyper-rustls = { version = "0.24", features = ["http2"] } # Local paths -aws-smithy-client = { path = "../../rust-runtime/aws-smithy-client/", features = ["rustls"] } aws-smithy-http = { path = "../../rust-runtime/aws-smithy-http/" } -aws-smithy-types = { path = "../../rust-runtime/aws-smithy-types/" } pokemon-service-client = { path = "../pokemon-service-client/" } diff --git a/examples/pokemon-service/src/authz.rs b/examples/pokemon-service/src/authz.rs new file mode 100644 index 00000000000..348a22f47e8 --- /dev/null +++ b/examples/pokemon-service/src/authz.rs @@ -0,0 +1,219 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! This file showcases a rather minimal model plugin that is agnostic over the operation that it +//! is applied to. +//! +//! It is interesting because it is not trivial to figure out how to write one. As the +//! documentation for [`aws_smithy_http_server::plugin::ModelMarker`] calls out, most model +//! plugins' implementation are _operation-specific_, which are simpler. + +use std::{marker::PhantomData, pin::Pin}; + +use aws_smithy_http_server::{ + body::BoxBody, + operation::OperationShape, + plugin::{ModelMarker, Plugin}, +}; +use pokemon_service_server_sdk::server::response::IntoResponse; +use tower::Service; + +pub struct AuthorizationPlugin { + // Private so that users are forced to use the `new` constructor. + _private: (), +} + +impl AuthorizationPlugin { + pub fn new() -> Self { + Self { _private: () } + } +} + +/// `T` is the inner service this plugin is applied to. +/// See the documentation for [`Plugin`] for details. +impl Plugin for AuthorizationPlugin { + type Output = AuthorizeService; + + fn apply(&self, input: T) -> Self::Output { + AuthorizeService { + inner: input, + authorizer: Authorizer::new(), + } + } +} + +impl ModelMarker for AuthorizationPlugin {} + +pub struct AuthorizeService { + inner: S, + authorizer: Authorizer, +} + +/// We manually implement `Clone` instead of adding `#[derive(Clone)]` because we don't require +/// `Op` to be cloneable. +impl Clone for AuthorizeService +where + S: Clone, +{ + fn clone(&self) -> Self { + Self { + inner: self.inner.clone(), + authorizer: self.authorizer.clone(), + } + } +} + +/// The error returned by [`AuthorizeService`]. +pub enum AuthorizeServiceError { + /// Authorization was successful, but the inner service yielded an error. + InnerServiceError(E), + /// Authorization was not successful. + AuthorizeError { message: String }, +} + +// Only the _outermost_ model plugin needs to apply a `Service` whose error type implements +// `IntoResponse` for the protocol the service uses (this requirement comes from the `Service` +// implementation of [`aws_smithy_http_server::operation::Upgrade`]). So if the model plugin is +// meant to be applied in any position, and to any Smithy service, one should implement +// `IntoResponse` for all protocols. +// +// Having model plugins apply a `Service` that has a `Service::Response` type or a `Service::Error` +// type that is different from those returned by the inner service hence diminishes the reusability +// of the plugin because it makes the plugin less composable. Most plugins should instead work with +// the inner service's types, and _at most_ require that those be `Op::Input` and `Op::Error`, for +// maximum composability: +// +// ``` +// ... +// where +// S: Service<(Op::Input, ($($var,)*)), Error = Op::Error> +// ... +// { +// type Response = S::Response; +// type Error = S::Error; +// type Future = Pin> + Send>>; +// } +// +// ``` +// +// This plugin still exemplifies how changing a type can be done to make it more interesting. + +impl IntoResponse

for AuthorizeServiceError +where + E: IntoResponse

, +{ + fn into_response(self) -> http::Response { + match self { + AuthorizeServiceError::InnerServiceError(e) => e.into_response(), + AuthorizeServiceError::AuthorizeError { message } => http::Response::builder() + .status(http::StatusCode::UNAUTHORIZED) + .body(aws_smithy_http_server::body::to_boxed(message)) + .expect("attempted to build an invalid HTTP response; please file a bug report"), + } + } +} + +macro_rules! impl_service { + ($($var:ident),*) => { + impl Service<(Op::Input, ($($var,)*))> for AuthorizeService + where + S: Service<(Op::Input, ($($var,)*)), Error = Op::Error> + Clone + Send + 'static, + S::Future: Send, + Op: OperationShape + Send + Sync + 'static, + Op::Input: Send + Sync + 'static, + $($var: Send + 'static,)* + { + type Response = S::Response; + type Error = AuthorizeServiceError; + type Future = + Pin> + Send>>; + + fn poll_ready( + &mut self, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.inner + .poll_ready(cx) + .map_err(|e| Self::Error::InnerServiceError(e)) + } + + fn call(&mut self, req: (Op::Input, ($($var,)*))) -> Self::Future { + let (input, exts) = req; + + // Replacing the service is necessary to avoid readiness problems. + // https://docs.rs/tower/latest/tower/trait.Service.html#be-careful-when-cloning-inner-services + let service = self.inner.clone(); + let mut service = std::mem::replace(&mut self.inner, service); + + let authorizer = self.authorizer.clone(); + + let fut = async move { + let is_authorized = authorizer.authorize(&input).await; + if !is_authorized { + return Err(Self::Error::AuthorizeError { + message: "Not authorized!".to_owned(), + }); + } + + service + .call((input, exts)) + .await + .map_err(|e| Self::Error::InnerServiceError(e)) + }; + Box::pin(fut) + } + } + }; +} + +struct Authorizer { + operation: PhantomData, +} + +/// We manually implement `Clone` instead of adding `#[derive(Clone)]` because we don't require +/// `Op` to be cloneable. +impl Clone for Authorizer { + fn clone(&self) -> Self { + Self { + operation: PhantomData, + } + } +} + +impl Authorizer { + fn new() -> Self { + Self { + operation: PhantomData, + } + } + + async fn authorize(&self, _input: &Op::Input) -> bool + where + Op: OperationShape, + { + // We'd perform the actual authorization here. + // We would likely need to add bounds on `Op::Input`, `Op::Error`, if we wanted to do + // anything useful. + true + } +} + +// If we want our plugin to be as reusable as possible, the service it applies should work with +// inner services (i.e. operation handlers) that take a variable number of parameters. A Rust macro +// is helpful in providing those implementations concisely. +// Each handler function registered must accept the operation's input type (if there is one). +// Additionally, it can take up to 7 different parameters, each of which must implement the +// `FromParts` trait. To ensure that this `AuthorizeService` works with any of those inner +// services, we must implement it to handle up to +// 7 different types. Therefore, we invoke the `impl_service` macro 8 times. + +impl_service!(); +impl_service!(T1); +impl_service!(T1, T2); +impl_service!(T1, T2, T3); +impl_service!(T1, T2, T3, T4); +impl_service!(T1, T2, T3, T4, T5); +impl_service!(T1, T2, T3, T4, T5, T6); +impl_service!(T1, T2, T3, T4, T5, T6, T7); diff --git a/examples/pokemon-service/src/main.rs b/examples/pokemon-service/src/main.rs index b3aa767f50c..97d93378ff1 100644 --- a/examples/pokemon-service/src/main.rs +++ b/examples/pokemon-service/src/main.rs @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +mod authz; mod plugin; use std::{net::SocketAddr, sync::Arc}; @@ -10,7 +11,8 @@ use std::{net::SocketAddr, sync::Arc}; use aws_smithy_http_server::{ extension::OperationExtensionExt, instrumentation::InstrumentExt, - plugin::{alb_health_check::AlbHealthCheckLayer, IdentityPlugin, PluginPipeline, Scoped}, + layer::alb_health_check::AlbHealthCheckLayer, + plugin::{HttpPlugins, ModelPlugins, Scoped}, request::request_id::ServerRequestIdProviderLayer, AddExtensionLayer, }; @@ -26,7 +28,9 @@ use pokemon_service_common::{ capture_pokemon, check_health, get_pokemon_species, get_server_statistics, setup_tracing, stream_pokemon_radio, State, }; -use pokemon_service_server_sdk::{scope, PokemonService}; +use pokemon_service_server_sdk::{scope, PokemonService, PokemonServiceConfig}; + +use crate::authz::AuthorizationPlugin; #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] @@ -45,15 +49,15 @@ pub async fn main() { setup_tracing(); scope! { - /// A scope containing `GetPokemonSpecies` and `GetStorage` + /// A scope containing `GetPokemonSpecies` and `GetStorage`. struct PrintScope { includes: [GetPokemonSpecies, GetStorage] } } - // Scope the `PrintPlugin`, defined in `plugin.rs`, to `PrintScope` - let print_plugin = Scoped::new::(PluginPipeline::new().print()); + // Scope the `PrintPlugin`, defined in `plugin.rs`, to `PrintScope`. + let print_plugin = Scoped::new::(HttpPlugins::new().print()); - let plugins = PluginPipeline::new() + let http_plugins = HttpPlugins::new() // Apply the scoped `PrintPlugin` .push(print_plugin) // Apply the `OperationExtensionPlugin` defined in `aws_smithy_http_server::extension`. This allows other @@ -61,13 +65,25 @@ pub async fn main() { // `Response::extensions`, or infer routing failure when it's missing. .insert_operation_extension() // Adds `tracing` spans and events to the request lifecycle. - .instrument() + .instrument(); + + let authz_plugin = AuthorizationPlugin::new(); + let model_plugins = ModelPlugins::new().push(authz_plugin); + + let config = PokemonServiceConfig::builder() + // Set up shared state and middlewares. + .layer(AddExtensionLayer::new(Arc::new(State::default()))) // Handle `/ping` health check requests. .layer(AlbHealthCheckLayer::from_handler("/ping", |_req| async { StatusCode::OK - })); + })) + // Add server request IDs. + .layer(ServerRequestIdProviderLayer::new()) + .http_plugin(http_plugins) + .model_plugin(model_plugins) + .build(); - let app = PokemonService::builder_with_plugins(plugins, IdentityPlugin) + let app = PokemonService::builder(config) // Build a registry containing implementations to all the operations in the service. These // are async functions or async closures that take as input the operation's input and // return the operation's output. @@ -81,12 +97,6 @@ pub async fn main() { .build() .expect("failed to build an instance of PokemonService"); - let app = app - // Setup shared state and middlewares. - .layer(&AddExtensionLayer::new(Arc::new(State::default()))) - // Add request IDs - .layer(&ServerRequestIdProviderLayer::new()); - // Using `into_make_service_with_connect_info`, rather than `into_make_service`, to adjoin the `SocketAddr` // connection info. let make_app = app.into_make_service_with_connect_info::(); diff --git a/examples/pokemon-service/src/plugin.rs b/examples/pokemon-service/src/plugin.rs index e030d3a4727..971aebb0156 100644 --- a/examples/pokemon-service/src/plugin.rs +++ b/examples/pokemon-service/src/plugin.rs @@ -7,7 +7,7 @@ use aws_smithy_http_server::{ operation::OperationShape, - plugin::{Plugin, PluginPipeline, PluginStack}, + plugin::{HttpMarker, HttpPlugins, Plugin, PluginStack}, service::ServiceShape, shape_id::ShapeId, }; @@ -63,16 +63,19 @@ where } } } -/// This provides a [`print`](PrintExt::print) method on [`PluginPipeline`]. + +impl HttpMarker for PrintPlugin {} + +/// This provides a [`print`](PrintExt::print) method on [`HttpPlugins`]. pub trait PrintExt { /// Causes all operations to print the operation name when called. /// /// This works by applying the [`PrintPlugin`]. - fn print(self) -> PluginPipeline>; + fn print(self) -> HttpPlugins>; } -impl PrintExt for PluginPipeline { - fn print(self) -> PluginPipeline> { +impl PrintExt for HttpPlugins { + fn print(self) -> HttpPlugins> { self.push(PrintPlugin) } } diff --git a/examples/pokemon-service/tests/common/mod.rs b/examples/pokemon-service/tests/common/mod.rs index d10430bfbd7..2d58f4a975a 100644 --- a/examples/pokemon-service/tests/common/mod.rs +++ b/examples/pokemon-service/tests/common/mod.rs @@ -3,16 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -use std::{process::Command, str::FromStr, time::Duration}; +use std::{process::Command, time::Duration}; use assert_cmd::prelude::*; -use aws_smithy_client::erase::{DynConnector, DynMiddleware}; -use hyper::http::uri::{Authority, Scheme}; use tokio::time::sleep; use pokemon_service::{DEFAULT_ADDRESS, DEFAULT_PORT}; -use pokemon_service_client::{Builder, Client, Config}; -use pokemon_service_common::{rewrite_base_url, ChildDrop}; +use pokemon_service_client::{Client, Config}; +use pokemon_service_common::ChildDrop; pub async fn run_server() -> ChildDrop { let crate_name = std::env::var("CARGO_PKG_NAME").unwrap(); @@ -27,13 +25,9 @@ pub fn base_url() -> String { format!("http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}") } -pub fn client() -> Client> { - let authority = Authority::from_str(&format!("{DEFAULT_ADDRESS}:{DEFAULT_PORT}")) - .expect("could not parse authority"); - let raw_client = Builder::new() - .rustls_connector(Default::default()) - .middleware_fn(rewrite_base_url(Scheme::HTTP, authority)) - .build_dyn(); - let config = Config::builder().build(); - Client::with_config(raw_client, config) +pub fn client() -> Client { + let config = Config::builder() + .endpoint_url(format!("http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}")) + .build(); + Client::from_conf(config) } diff --git a/examples/pokemon-service/tests/simple.rs b/examples/pokemon-service/tests/simple.rs index af03bfee30d..dc9f88d0b53 100644 --- a/examples/pokemon-service/tests/simple.rs +++ b/examples/pokemon-service/tests/simple.rs @@ -19,7 +19,7 @@ async fn simple_integration_test() { let client = common::client(); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(0, service_statistics_out.calls_count.unwrap()); + assert_eq!(0, service_statistics_out.calls_count); let pokemon_species_output = client .get_pokemon_species() @@ -27,10 +27,10 @@ async fn simple_integration_test() { .send() .await .unwrap(); - assert_eq!("pikachu", pokemon_species_output.name().unwrap()); + assert_eq!("pikachu", pokemon_species_output.name()); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(1, service_statistics_out.calls_count.unwrap()); + assert_eq!(1, service_statistics_out.calls_count); let storage_err = client .get_storage() @@ -56,12 +56,12 @@ async fn simple_integration_test() { .await .unwrap(); assert_eq!( - Some(vec![ + vec![ "bulbasaur".to_string(), "charmander".to_string(), "squirtle".to_string(), "pikachu".to_string() - ]), + ], storage_out.collection ); @@ -80,7 +80,7 @@ async fn simple_integration_test() { ); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(2, service_statistics_out.calls_count.unwrap()); + assert_eq!(2, service_statistics_out.calls_count); let hyper_client = hyper::Client::new(); let health_check_url = format!("{}/ping", common::base_url()); @@ -89,3 +89,31 @@ async fn simple_integration_test() { assert_eq!(result.status(), 200); } + +#[tokio::test] +#[serial] +async fn health_check() { + let _child = common::run_server().await; + + use pokemon_service::{DEFAULT_ADDRESS, DEFAULT_PORT}; + let url = format!("http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}/ping"); + let uri = url.parse::().expect("invalid URL"); + + // Since the `/ping` route is not modeled in Smithy, we use a regular + // Hyper HTTP client to make a request to it. + let request = hyper::Request::builder() + .uri(uri) + .body(hyper::Body::empty()) + .expect("failed to build request"); + + let response = hyper::Client::new() + .request(request) + .await + .expect("failed to get response"); + + assert_eq!(response.status(), hyper::StatusCode::OK); + let body = hyper::body::to_bytes(response.into_body()) + .await + .expect("failed to read response body"); + assert!(body.is_empty()); +} diff --git a/examples/python/pokemon-service-test/Cargo.toml b/examples/python/pokemon-service-test/Cargo.toml index b4084185c25..74d87864ba5 100644 --- a/examples/python/pokemon-service-test/Cargo.toml +++ b/examples/python/pokemon-service-test/Cargo.toml @@ -17,7 +17,7 @@ tokio-rustls = "0.24.0" hyper-rustls = { version = "0.24", features = ["http2"] } # Local paths -aws-smithy-client = { path = "../../../rust-runtime/aws-smithy-client/", features = ["rustls"] } +aws-smithy-runtime = { path = "../../../rust-runtime/aws-smithy-runtime/", features = ["client", "connector-hyper-0-14-x"] } aws-smithy-http = { path = "../../../rust-runtime/aws-smithy-http/" } aws-smithy-types = { path = "../../../rust-runtime/aws-smithy-types/" } -pokemon-service-client = { path = "../pokemon-service-client/" } +pokemon-service-client = { path = "../pokemon-service-client/", features = ["behavior-version-latest"] } diff --git a/examples/python/pokemon-service-test/tests/helpers.rs b/examples/python/pokemon-service-test/tests/helpers.rs index 23050a3da3a..53064e34024 100644 --- a/examples/python/pokemon-service-test/tests/helpers.rs +++ b/examples/python/pokemon-service-test/tests/helpers.rs @@ -8,19 +8,15 @@ use std::io::BufReader; use std::process::Command; use std::time::Duration; -use aws_smithy_client::{erase::DynConnector, hyper_ext::Adapter}; -use aws_smithy_http::operation::Request; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; use command_group::{CommandGroup, GroupChild}; -use pokemon_service_client::{Builder, Client, Config}; +use pokemon_service_client::{Client, Config}; use tokio::time; const TEST_KEY: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/testdata/localhost.key"); const TEST_CERT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/testdata/localhost.crt"); -pub type PokemonClient = Client< - aws_smithy_client::erase::DynConnector, - aws_smithy_client::erase::DynMiddleware, ->; +pub type PokemonClient = Client; enum PokemonServiceVariant { Http, @@ -94,12 +90,8 @@ impl Drop for PokemonService { #[allow(dead_code)] pub fn client() -> PokemonClient { let base_url = PokemonServiceVariant::Http.base_url(); - let raw_client = Builder::new() - .rustls_connector(Default::default()) - .middleware_fn(rewrite_base_url(base_url)) - .build_dyn(); - let config = Config::builder().build(); - Client::with_config(raw_client, config) + let config = Config::builder().endpoint_url(base_url).build(); + Client::from_conf(config) } #[allow(dead_code)] @@ -110,7 +102,7 @@ pub fn http2_client() -> PokemonClient { let mut roots = tokio_rustls::rustls::RootCertStore::empty(); roots.add_parsable_certificates(&certs); - let connector = hyper_rustls::HttpsConnectorBuilder::new() + let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() .with_tls_config( tokio_rustls::rustls::ClientConfig::builder() .with_safe_defaults() @@ -122,19 +114,9 @@ pub fn http2_client() -> PokemonClient { .build(); let base_url = PokemonServiceVariant::Http2.base_url(); - let raw_client = Builder::new() - .connector(DynConnector::new(Adapter::builder().build(connector))) - .middleware_fn(rewrite_base_url(base_url)) - .build_dyn(); - let config = Config::builder().build(); - Client::with_config(raw_client, config) -} - -fn rewrite_base_url(base_url: &'static str) -> impl Fn(Request) -> Request + Clone { - move |mut req| { - let http_req = req.http_mut(); - let uri = format!("{base_url}{}", http_req.uri().path()); - *http_req.uri_mut() = uri.parse().unwrap(); - req - } + let config = Config::builder() + .http_client(HyperClientBuilder::new().build(tls_connector)) + .endpoint_url(base_url) + .build(); + Client::from_conf(config) } diff --git a/examples/python/pokemon-service-test/tests/simple_integration_test.rs b/examples/python/pokemon-service-test/tests/simple_integration_test.rs index 39f979e9a34..0c928fa0d7e 100644 --- a/examples/python/pokemon-service-test/tests/simple_integration_test.rs +++ b/examples/python/pokemon-service-test/tests/simple_integration_test.rs @@ -36,7 +36,7 @@ async fn simple_integration_test_http2() { async fn simple_integration_test_with_client(client: PokemonClient) { let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(0, service_statistics_out.calls_count.unwrap()); + assert_eq!(0, service_statistics_out.calls_count); let pokemon_species_output = client .get_pokemon_species() @@ -44,10 +44,10 @@ async fn simple_integration_test_with_client(client: PokemonClient) { .send() .await .unwrap(); - assert_eq!("pikachu", pokemon_species_output.name().unwrap()); + assert_eq!("pikachu", pokemon_species_output.name()); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(1, service_statistics_out.calls_count.unwrap()); + assert_eq!(1, service_statistics_out.calls_count); let pokemon_species_error = client .get_pokemon_species() @@ -64,7 +64,7 @@ async fn simple_integration_test_with_client(client: PokemonClient) { ); let service_statistics_out = client.get_server_statistics().send().await.unwrap(); - assert_eq!(2, service_statistics_out.calls_count.unwrap()); + assert_eq!(2, service_statistics_out.calls_count); let _health_check = client.check_health().send().await.unwrap(); } diff --git a/examples/python/pokemon_service.py b/examples/python/pokemon_service.py index eeb6445eb3d..8eb1255f877 100644 --- a/examples/python/pokemon_service.py +++ b/examples/python/pokemon_service.py @@ -50,7 +50,14 @@ # Logging can bee setup using standard Python tooling. We provide # fast logging handler, Tracingandler based on Rust tracing crate. -logging.basicConfig(handlers=[TracingHandler(level=logging.DEBUG).handler()]) +logging.basicConfig( + handlers=[ + TracingHandler( + level=logging.DEBUG, + format="pretty", # You can also use "json" or "compact" (default) + ).handler() + ] +) class SafeCounter: @@ -169,8 +176,8 @@ def get_random_radio_stream(self) -> str: @app.middleware async def check_content_type_header(request: Request, next: Next) -> Response: content_type = request.headers.get("content-type") - if content_type == "application/json": - logging.debug("found valid `application/json` content type") + if content_type in ["application/json", "application/vnd.amazon.eventstream"]: + logging.debug("found valid `%s` content type", content_type) else: logging.warning( "invalid content type %s, dumping headers: %s", @@ -196,7 +203,7 @@ async def add_x_amzn_answer_header(request: Request, next: Next) -> Response: async def check_x_amzn_answer_header(request: Request, next: Next) -> Response: # Check that `x-amzn-answer` is 42. if request.headers.get("x-amzn-answer") != "42": - # Return an HTTP 401 Unauthorized if the content type is not JSON. + # Return an HTTP 401 Unauthorized. raise MiddlewareException("Invalid answer", 401) return await next(request) diff --git a/gradle.properties b/gradle.properties index aa791db007e..ed4fedc5e4a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,21 +4,24 @@ # # Rust MSRV (entered into the generated README) -rust.msrv=1.68.2 +rust.msrv=1.70.0 # To enable debug, swap out the two lines below. # When changing this value, be sure to run `./gradlew --stop` to kill the Gradle daemon. # org.gradle.jvmargs=-Xmx1024M -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5006 org.gradle.jvmargs=-Xmx1024M -# Version number to use for the generated runtime crates -smithy.rs.runtime.crate.version=0.0.0-smithy-rs-head +# Version number to use for the generated stable runtime crates +smithy.rs.runtime.crate.stable.version=1.0.3 + +# Version number to use for the generated unstable runtime crates +smithy.rs.runtime.crate.unstable.version=0.60.0 kotlin.code.style=official # codegen -smithyGradlePluginVersion=0.6.0 -smithyVersion=1.29.0 +smithyGradlePluginVersion=0.7.0 +smithyVersion=1.40.0 # kotlin kotlinVersion=1.7.21 @@ -29,7 +32,7 @@ kotestVersion=5.2.3 # Avoid registering dependencies/plugins/tasks that are only used for testing purposes isTestingEnabled=true -# TODO(https://github.com/awslabs/smithy-rs/issues/1068): Once doc normalization +# TODO(https://github.com/smithy-lang/smithy-rs/issues/1068): Once doc normalization # is completed, warnings can be prohibited in rustdoc. # # defaultRustDocFlags=-D warnings diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae..7f93135c49b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fceae6..ac72c34e8ac 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787337f..0adc8e1a532 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +198,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -205,6 +214,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f9382..6689b85beec 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/rust-runtime/Cargo.toml b/rust-runtime/Cargo.toml index 4f1555345ac..52cf0a5ed25 100644 --- a/rust-runtime/Cargo.toml +++ b/rust-runtime/Cargo.toml @@ -1,6 +1,4 @@ [workspace] - - members = [ "inlineable", "aws-smithy-async", diff --git a/rust-runtime/aws-smithy-async/Cargo.toml b/rust-runtime/aws-smithy-async/Cargo.toml index ca703aaf654..6e1a5f3c436 100644 --- a/rust-runtime/aws-smithy-async/Cargo.toml +++ b/rust-runtime/aws-smithy-async/Cargo.toml @@ -5,25 +5,35 @@ authors = ["AWS Rust SDK Team ", "John DiSanti -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-async/additional-ci b/rust-runtime/aws-smithy-async/additional-ci index fde542e9fc1..2e342db6fac 100755 --- a/rust-runtime/aws-smithy-async/additional-ci +++ b/rust-runtime/aws-smithy-async/additional-ci @@ -8,6 +8,9 @@ set -e +echo '### Checking compilation under WASM' +cargo check --target wasm32-unknown-unknown + echo "### Checking for duplicate dependency versions in the normal dependency graph with all features enabled" cargo tree -d --edges normal --all-features diff --git a/rust-runtime/aws-smithy-async/external-types.toml b/rust-runtime/aws-smithy-async/external-types.toml index dee6e8bb309..464456a2dca 100644 --- a/rust-runtime/aws-smithy-async/external-types.toml +++ b/rust-runtime/aws-smithy-async/external-types.toml @@ -2,10 +2,4 @@ allowed_external_types = [ "aws_smithy_types::config_bag::storable::Storable", "aws_smithy_types::config_bag::storable::StoreReplace", "aws_smithy_types::config_bag::storable::Storer", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Switch to AsyncIterator once standardized - "futures_core::stream::Stream", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose `SendError` - "tokio::sync::mpsc::error::SendError", ] diff --git a/rust-runtime/aws-smithy-async/src/future/fn_stream.rs b/rust-runtime/aws-smithy-async/src/future/fn_stream.rs deleted file mode 100644 index 804b08f6bbf..00000000000 --- a/rust-runtime/aws-smithy-async/src/future/fn_stream.rs +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Utility to drive a stream with an async function and a channel. - -use crate::future::rendezvous; -use futures_util::StreamExt; -use pin_project_lite::pin_project; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tokio_stream::{Iter, Once, Stream}; - -pin_project! { - /// Utility to drive a stream with an async function and a channel. - /// - /// The closure is passed a reference to a `Sender` which acts as a rendezvous channel. Messages - /// sent to the sender will be emitted to the stream. Because the stream is 1-bounded, the function - /// will not proceed until the stream is read. - /// - /// This utility is used by generated paginators to generate a stream of paginated results. - /// - /// If `tx.send` returns an error, the function MUST return immediately. - /// - /// # Examples - /// ```no_run - /// use tokio_stream::StreamExt; - /// # async fn docs() { - /// use aws_smithy_async::future::fn_stream::FnStream; - /// let stream = FnStream::new(|tx| Box::pin(async move { - /// if let Err(_) = tx.send("Hello!").await { - /// return; - /// } - /// if let Err(_) = tx.send("Goodbye!").await { - /// return; - /// } - /// })); - /// assert_eq!(stream.collect::>().await, vec!["Hello!", "Goodbye!"]); - /// # } - pub struct FnStream { - #[pin] - rx: rendezvous::Receiver, - #[pin] - generator: Option, - } -} - -impl FnStream { - /// Creates a new function based stream driven by `generator`. - /// - /// For examples, see the documentation for [`FnStream`] - pub fn new(generator: T) -> Self - where - T: FnOnce(rendezvous::Sender) -> F, - { - let (tx, rx) = rendezvous::channel::(); - Self { - rx, - generator: Some(generator(tx)), - } - } -} - -impl Stream for FnStream -where - F: Future, -{ - type Item = Item; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let mut me = self.project(); - match me.rx.poll_recv(cx) { - Poll::Ready(item) => Poll::Ready(item), - Poll::Pending => { - if let Some(generator) = me.generator.as_mut().as_pin_mut() { - if generator.poll(cx).is_ready() { - // if the generator returned ready we MUST NOT poll it again—doing so - // will cause a panic. - me.generator.set(None); - } - } - Poll::Pending - } - } - } -} - -/// Utility wrapper to flatten paginated results -/// -/// When flattening paginated results, it's most convenient to produce an iterator where the `Result` -/// is present in each item. This provides `items()` which can wrap an stream of `Result` -/// and produce a stream of `Result`. -#[derive(Debug)] -pub struct TryFlatMap(I); - -impl TryFlatMap { - /// Create a `TryFlatMap` that wraps the input - pub fn new(i: I) -> Self { - Self(i) - } - - /// Produce a new [`Stream`] by mapping this stream with `map` then flattening the result - pub fn flat_map(self, map: M) -> impl Stream> - where - I: Stream>, - M: Fn(Page) -> Iter, - Iter: IntoIterator, - { - self.0.flat_map(move |page| match page { - Ok(page) => OnceOrMany::Many { - many: tokio_stream::iter(map(page).into_iter().map(Ok)), - }, - Err(e) => OnceOrMany::Once { - once: tokio_stream::once(Err(e)), - }, - }) - } -} - -pin_project! { - /// Helper enum to to support returning `Once` and `Iter` from `Items::items` - #[project = OnceOrManyProj] - enum OnceOrMany { - Many { #[pin] many: Iter }, - Once { #[pin] once: Once }, - } -} - -impl Stream for OnceOrMany -where - Iter: Iterator, -{ - type Item = Item; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let me = self.project(); - match me { - OnceOrManyProj::Many { many } => many.poll_next(cx), - OnceOrManyProj::Once { once } => once.poll_next(cx), - } - } -} - -#[cfg(test)] -mod test { - use crate::future::fn_stream::{FnStream, TryFlatMap}; - use std::sync::{Arc, Mutex}; - use std::time::Duration; - use tokio_stream::StreamExt; - - /// basic test of FnStream functionality - #[tokio::test] - async fn fn_stream_returns_results() { - tokio::time::pause(); - let mut stream = FnStream::new(|tx| { - Box::pin(async move { - tx.send("1").await.expect("failed to send"); - tokio::time::sleep(Duration::from_secs(1)).await; - tokio::time::sleep(Duration::from_secs(1)).await; - tx.send("2").await.expect("failed to send"); - tokio::time::sleep(Duration::from_secs(1)).await; - tx.send("3").await.expect("failed to send"); - }) - }); - let mut out = vec![]; - while let Some(value) = stream.next().await { - out.push(value); - } - assert_eq!(out, vec!["1", "2", "3"]); - } - - // smithy-rs#1902: there was a bug where we could continue to poll the generator after it - // had returned Poll::Ready. This test case leaks the tx half so that the channel stays open - // but the send side generator completes. By calling `poll` multiple times on the resulting future, - // we can trigger the bug and validate the fix. - #[tokio::test] - async fn fn_stream_doesnt_poll_after_done() { - let mut stream = FnStream::new(|tx| { - Box::pin(async move { - assert!(tx.send("blah").await.is_ok()); - Box::leak(Box::new(tx)); - }) - }); - assert_eq!(stream.next().await, Some("blah")); - let mut test_stream = tokio_test::task::spawn(stream); - assert!(test_stream.poll_next().is_pending()); - assert!(test_stream.poll_next().is_pending()); - } - - /// Tests that the generator will not advance until demand exists - #[tokio::test] - async fn waits_for_reader() { - let progress = Arc::new(Mutex::new(0)); - let mut stream = FnStream::new(|tx| { - let progress = progress.clone(); - Box::pin(async move { - *progress.lock().unwrap() = 1; - tx.send("1").await.expect("failed to send"); - *progress.lock().unwrap() = 2; - tx.send("2").await.expect("failed to send"); - *progress.lock().unwrap() = 3; - tx.send("3").await.expect("failed to send"); - *progress.lock().unwrap() = 4; - }) - }); - assert_eq!(*progress.lock().unwrap(), 0); - stream.next().await.expect("ready"); - assert_eq!(*progress.lock().unwrap(), 1); - - assert_eq!(stream.next().await.expect("ready"), "2"); - assert_eq!(*progress.lock().unwrap(), 2); - - let _ = stream.next().await.expect("ready"); - assert_eq!(*progress.lock().unwrap(), 3); - assert_eq!(stream.next().await, None); - assert_eq!(*progress.lock().unwrap(), 4); - } - - #[tokio::test] - async fn generator_with_errors() { - let mut stream = FnStream::new(|tx| { - Box::pin(async move { - for i in 0..5 { - if i != 2 { - if tx.send(Ok(i)).await.is_err() { - return; - } - } else { - tx.send(Err(i)).await.unwrap(); - return; - } - } - }) - }); - let mut out = vec![]; - while let Some(Ok(value)) = stream.next().await { - out.push(value); - } - assert_eq!(out, vec![0, 1]); - } - - #[tokio::test] - async fn flatten_items_ok() { - #[derive(Debug)] - struct Output { - items: Vec, - } - let stream = FnStream::new(|tx| { - Box::pin(async move { - tx.send(Ok(Output { - items: vec![1, 2, 3], - })) - .await - .unwrap(); - tx.send(Ok(Output { - items: vec![4, 5, 6], - })) - .await - .unwrap(); - }) - }); - assert_eq!( - TryFlatMap(stream) - .flat_map(|output| output.items.into_iter()) - .collect::, &str>>() - .await, - Ok(vec![1, 2, 3, 4, 5, 6]) - ) - } - - #[tokio::test] - async fn flatten_items_error() { - #[derive(Debug)] - struct Output { - items: Vec, - } - let stream = FnStream::new(|tx| { - Box::pin(async move { - tx.send(Ok(Output { - items: vec![1, 2, 3], - })) - .await - .unwrap(); - tx.send(Err("bummer")).await.unwrap(); - }) - }); - assert_eq!( - TryFlatMap(stream) - .flat_map(|output| output.items.into_iter()) - .collect::, &str>>() - .await, - Err("bummer") - ) - } -} diff --git a/rust-runtime/aws-smithy-async/src/future/mod.rs b/rust-runtime/aws-smithy-async/src/future/mod.rs index 1e99bdc3044..2fe1afa38ec 100644 --- a/rust-runtime/aws-smithy-async/src/future/mod.rs +++ b/rust-runtime/aws-smithy-async/src/future/mod.rs @@ -5,8 +5,14 @@ //! Useful runtime-agnostic future implementations. -pub mod fn_stream; +use futures_util::Future; +use std::pin::Pin; + pub mod never; pub mod now_or_later; +pub mod pagination_stream; pub mod rendezvous; pub mod timeout; + +/// A boxed future that outputs a `Result`. +pub type BoxFuture<'a, T, E> = Pin> + Send + 'a>>; diff --git a/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs b/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs new file mode 100644 index 00000000000..a5454108af7 --- /dev/null +++ b/rust-runtime/aws-smithy-async/src/future/pagination_stream.rs @@ -0,0 +1,302 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Provides types to support stream-like operations for paginators. + +use crate::future::pagination_stream::collect::sealed::Collectable; +use std::future::Future; +use std::pin::Pin; +pub mod collect; +pub mod fn_stream; +use fn_stream::FnStream; + +/// Stream specifically made to support paginators. +/// +/// `PaginationStream` provides two primary mechanisms for accessing stream of data. +/// 1. With [`.next()`](PaginationStream::next) (or [`try_next()`](PaginationStream::try_next)): +/// +/// ```no_run +/// # async fn docs() { +/// # use aws_smithy_async::future::pagination_stream::PaginationStream; +/// # fn operation_to_yield_paginator() -> PaginationStream { +/// # todo!() +/// # } +/// # struct Page; +/// let mut stream: PaginationStream = operation_to_yield_paginator(); +/// while let Some(page) = stream.next().await { +/// // process `page` +/// } +/// # } +/// ``` +/// 2. With [`.collect()`](PaginationStream::collect) (or [`try_collect()`](PaginationStream::try_collect)): +/// +/// ```no_run +/// # async fn docs() { +/// # use aws_smithy_async::future::pagination_stream::PaginationStream; +/// # fn operation_to_yield_paginator() -> PaginationStream { +/// # todo!() +/// # } +/// # struct Page; +/// let mut stream: PaginationStream = operation_to_yield_paginator(); +/// let result = stream.collect::>().await; +/// # } +/// ``` +/// +/// [`PaginationStream`] is implemented in terms of [`FnStream`], but the latter is meant to be +/// used internally and not by external users. +#[derive(Debug)] +pub struct PaginationStream(FnStream); + +impl PaginationStream { + /// Creates a `PaginationStream` from the given [`FnStream`]. + pub fn new(stream: FnStream) -> Self { + Self(stream) + } + + /// Consumes and returns the next `Item` from this stream. + pub async fn next(&mut self) -> Option { + self.0.next().await + } + + /// Consumes this stream and gathers elements into a collection. + pub async fn collect>(self) -> T { + self.0.collect().await + } +} + +impl PaginationStream> { + /// Yields the next item in the stream or returns an error if an error is encountered. + pub async fn try_next(&mut self) -> Result, E> { + self.next().await.transpose() + } + + /// Convenience method for `.collect::, _>()`. + pub async fn try_collect(self) -> Result, E> { + self.collect::, E>>().await + } +} + +/// Utility wrapper to flatten paginated results +/// +/// When flattening paginated results, it's most convenient to produce an iterator where the `Result` +/// is present in each item. This provides `items()` which can wrap an stream of `Result` +/// and produce a stream of `Result`. +#[derive(Debug)] +pub struct TryFlatMap(PaginationStream>); + +impl TryFlatMap { + /// Creates a `TryFlatMap` that wraps the input. + pub fn new(stream: PaginationStream>) -> Self { + Self(stream) + } + + /// Produces a new [`PaginationStream`] by mapping this stream with `map` then flattening the result. + pub fn flat_map(mut self, map: M) -> PaginationStream> + where + Page: Send + 'static, + Err: Send + 'static, + M: Fn(Page) -> Iter + Send + 'static, + Item: Send + 'static, + Iter: IntoIterator + Send, + ::IntoIter: Send, + { + PaginationStream::new(FnStream::new(|tx| { + Box::pin(async move { + while let Some(page) = self.0.next().await { + match page { + Ok(page) => { + let mapped = map(page); + for item in mapped.into_iter() { + let _ = tx.send(Ok(item)).await; + } + } + Err(e) => { + let _ = tx.send(Err(e)).await; + break; + } + } + } + }) as Pin + Send>> + })) + } +} + +#[cfg(test)] +mod test { + use crate::future::pagination_stream::{FnStream, PaginationStream, TryFlatMap}; + use std::sync::{Arc, Mutex}; + use std::time::Duration; + + /// basic test of FnStream functionality + #[tokio::test] + async fn fn_stream_returns_results() { + tokio::time::pause(); + let mut stream = FnStream::new(|tx| { + Box::pin(async move { + tx.send("1").await.expect("failed to send"); + tokio::time::sleep(Duration::from_secs(1)).await; + tokio::time::sleep(Duration::from_secs(1)).await; + tx.send("2").await.expect("failed to send"); + tokio::time::sleep(Duration::from_secs(1)).await; + tx.send("3").await.expect("failed to send"); + }) + }); + let mut out = vec![]; + while let Some(value) = stream.next().await { + out.push(value); + } + assert_eq!(vec!["1", "2", "3"], out); + } + + #[tokio::test] + async fn fn_stream_try_next() { + tokio::time::pause(); + let mut stream = FnStream::new(|tx| { + Box::pin(async move { + tx.send(Ok(1)).await.unwrap(); + tx.send(Ok(2)).await.unwrap(); + tx.send(Err("err")).await.unwrap(); + }) + }); + let mut out = vec![]; + while let Ok(value) = stream.try_next().await { + out.push(value); + } + assert_eq!(vec![Some(1), Some(2)], out); + } + + // smithy-rs#1902: there was a bug where we could continue to poll the generator after it + // had returned Poll::Ready. This test case leaks the tx half so that the channel stays open + // but the send side generator completes. By calling `poll` multiple times on the resulting future, + // we can trigger the bug and validate the fix. + #[tokio::test] + async fn fn_stream_doesnt_poll_after_done() { + let mut stream = FnStream::new(|tx| { + Box::pin(async move { + assert!(tx.send("blah").await.is_ok()); + Box::leak(Box::new(tx)); + }) + }); + assert_eq!(Some("blah"), stream.next().await); + let mut test_stream = tokio_test::task::spawn(stream); + // `tokio_test::task::Spawn::poll_next` can only be invoked when the wrapped + // type implements the `Stream` trait. Here, `FnStream` does not implement it, + // so we work around it by using the `enter` method. + test_stream.enter(|ctx, pin| { + let polled = pin.poll_next(ctx); + assert!(polled.is_pending()); + }); + test_stream.enter(|ctx, pin| { + let polled = pin.poll_next(ctx); + assert!(polled.is_pending()); + }); + } + + /// Tests that the generator will not advance until demand exists + #[tokio::test] + async fn waits_for_reader() { + let progress = Arc::new(Mutex::new(0)); + let mut stream = FnStream::new(|tx| { + let progress = progress.clone(); + Box::pin(async move { + *progress.lock().unwrap() = 1; + tx.send("1").await.expect("failed to send"); + *progress.lock().unwrap() = 2; + tx.send("2").await.expect("failed to send"); + *progress.lock().unwrap() = 3; + tx.send("3").await.expect("failed to send"); + *progress.lock().unwrap() = 4; + }) + }); + assert_eq!(*progress.lock().unwrap(), 0); + stream.next().await.expect("ready"); + assert_eq!(*progress.lock().unwrap(), 1); + + assert_eq!("2", stream.next().await.expect("ready")); + assert_eq!(2, *progress.lock().unwrap()); + + let _ = stream.next().await.expect("ready"); + assert_eq!(3, *progress.lock().unwrap()); + assert_eq!(None, stream.next().await); + assert_eq!(4, *progress.lock().unwrap()); + } + + #[tokio::test] + async fn generator_with_errors() { + let mut stream = FnStream::new(|tx| { + Box::pin(async move { + for i in 0..5 { + if i != 2 { + if tx.send(Ok(i)).await.is_err() { + return; + } + } else { + tx.send(Err(i)).await.unwrap(); + return; + } + } + }) + }); + let mut out = vec![]; + while let Some(Ok(value)) = stream.next().await { + out.push(value); + } + assert_eq!(vec![0, 1], out); + } + + #[tokio::test] + async fn flatten_items_ok() { + #[derive(Debug)] + struct Output { + items: Vec, + } + let stream: FnStream> = FnStream::new(|tx| { + Box::pin(async move { + tx.send(Ok(Output { + items: vec![1, 2, 3], + })) + .await + .unwrap(); + tx.send(Ok(Output { + items: vec![4, 5, 6], + })) + .await + .unwrap(); + }) + }); + assert_eq!( + Ok(vec![1, 2, 3, 4, 5, 6]), + TryFlatMap::new(PaginationStream::new(stream)) + .flat_map(|output| output.items.into_iter()) + .try_collect() + .await, + ); + } + + #[tokio::test] + async fn flatten_items_error() { + #[derive(Debug)] + struct Output { + items: Vec, + } + let stream = FnStream::new(|tx| { + Box::pin(async move { + tx.send(Ok(Output { + items: vec![1, 2, 3], + })) + .await + .unwrap(); + tx.send(Err("bummer")).await.unwrap(); + }) + }); + assert_eq!( + Err("bummer"), + TryFlatMap::new(PaginationStream::new(stream)) + .flat_map(|output| output.items.into_iter()) + .try_collect() + .await + ) + } +} diff --git a/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs b/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs new file mode 100644 index 00000000000..b74e08f7356 --- /dev/null +++ b/rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs @@ -0,0 +1,74 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Module to extend the functionality of types in `patination_stream` module to allow for +//! collecting elements of the stream into collection. +//! +//! Majority of the code is borrowed from +//! + +pub(crate) mod sealed { + /// A trait that signifies that elements can be collected into `T`. + /// + /// Currently the trait may not be implemented by clients so we can make changes in the future + /// without breaking code depending on it. + pub trait Collectable { + type Collection; + + fn initialize() -> Self::Collection; + + fn extend(collection: &mut Self::Collection, item: T) -> bool; + + fn finalize(collection: Self::Collection) -> Self; + } +} + +impl sealed::Collectable for Vec { + type Collection = Self; + + fn initialize() -> Self::Collection { + Vec::default() + } + + fn extend(collection: &mut Self::Collection, item: T) -> bool { + collection.push(item); + true + } + + fn finalize(collection: Self::Collection) -> Self { + collection + } +} + +impl sealed::Collectable> for Result +where + U: sealed::Collectable, +{ + type Collection = Result; + + fn initialize() -> Self::Collection { + Ok(U::initialize()) + } + + fn extend(collection: &mut Self::Collection, item: Result) -> bool { + match item { + Ok(item) => { + let collection = collection.as_mut().ok().expect("invalid state"); + U::extend(collection, item) + } + Err(e) => { + *collection = Err(e); + false + } + } + } + + fn finalize(collection: Self::Collection) -> Self { + match collection { + Ok(collection) => Ok(U::finalize(collection)), + err @ Err(_) => Err(err.map(drop).unwrap_err()), + } + } +} diff --git a/rust-runtime/aws-smithy-async/src/future/pagination_stream/fn_stream.rs b/rust-runtime/aws-smithy-async/src/future/pagination_stream/fn_stream.rs new file mode 100644 index 00000000000..260bfb9e870 --- /dev/null +++ b/rust-runtime/aws-smithy-async/src/future/pagination_stream/fn_stream.rs @@ -0,0 +1,124 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Module to define utility to drive a stream with an async function and a channel. + +use crate::future::pagination_stream::collect::sealed::Collectable; +use crate::future::rendezvous; +use pin_project_lite::pin_project; +use std::fmt; +use std::future::poll_fn; +use std::future::Future; +use std::pin::Pin; +use std::task::{Context, Poll}; + +pin_project! { + /// The closure is passed a reference to a `Sender` which acts as a rendezvous channel. Messages + /// sent to the sender will be emitted to the stream. Because the stream is 1-bounded, the function + /// will not proceed until the stream is read. + /// + /// This utility is used by generated paginators to generate a stream of paginated results. + /// + /// If `tx.send` returns an error, the function MUST return immediately. + /// + /// Note `FnStream` is only `Send` but not `Sync` because `generator` is a boxed future that + /// is `Send` and returns `()` as output when it is done. + /// + /// # Examples + /// ```no_run + /// # async fn docs() { + /// use aws_smithy_async::future::pagination_stream::fn_stream::FnStream; + /// let mut stream = FnStream::new(|tx| Box::pin(async move { + /// if let Err(_) = tx.send("Hello!").await { + /// return; + /// } + /// if let Err(_) = tx.send("Goodbye!").await { + /// return; + /// } + /// })); + /// assert_eq!(stream.collect::>().await, vec!["Hello!", "Goodbye!"]); + /// # } + pub struct FnStream { + #[pin] + rx: rendezvous::Receiver, + generator: Option + Send + 'static>>>, + } +} + +impl fmt::Debug for FnStream { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let item_typename = std::any::type_name::(); + write!(f, "FnStream<{item_typename}>") + } +} + +impl FnStream { + /// Creates a new function based stream driven by `generator`. + /// + /// For examples, see the documentation for [`FnStream`] + pub fn new(generator: T) -> Self + where + T: FnOnce(rendezvous::Sender) -> Pin + Send + 'static>>, + { + let (tx, rx) = rendezvous::channel::(); + Self { + rx, + generator: Some(Box::pin(generator(tx))), + } + } + + /// Consumes and returns the next `Item` from this stream. + pub async fn next(&mut self) -> Option + where + Self: Unpin, + { + let mut me = Pin::new(self); + poll_fn(|cx| me.as_mut().poll_next(cx)).await + } + + /// Attempts to pull out the next value of this stream, returning `None` if the stream is + /// exhausted. + pub(crate) fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let mut me = self.project(); + match me.rx.poll_recv(cx) { + Poll::Ready(item) => Poll::Ready(item), + Poll::Pending => { + if let Some(generator) = me.generator { + if generator.as_mut().poll(cx).is_ready() { + // `generator` keeps writing items to `tx` and will not be `Poll::Ready` + // until it is done writing to `tx`. Once it is done, it returns `()` + // as output and is `Poll::Ready`, at which point we MUST NOT poll it again + // since doing so will cause a panic. + *me.generator = None; + } + } + Poll::Pending + } + } + } + + /// Consumes this stream and gathers elements into a collection. + pub async fn collect>(mut self) -> T { + let mut collection = T::initialize(); + while let Some(item) = self.next().await { + if !T::extend(&mut collection, item) { + break; + } + } + T::finalize(collection) + } +} + +impl FnStream> { + /// Yields the next item in the stream or returns an error if an error is encountered. + pub async fn try_next(&mut self) -> Result, E> { + self.next().await.transpose() + } + + /// Convenience method for `.collect::, _>()`. + pub async fn try_collect(self) -> Result, E> { + self.collect::, E>>().await + } +} diff --git a/rust-runtime/aws-smithy-async/src/future/rendezvous.rs b/rust-runtime/aws-smithy-async/src/future/rendezvous.rs index b501efc85b6..78762866e23 100644 --- a/rust-runtime/aws-smithy-async/src/future/rendezvous.rs +++ b/rust-runtime/aws-smithy-async/src/future/rendezvous.rs @@ -10,11 +10,11 @@ //! and coordinate with the receiver. //! //! Rendezvous channels should be used with care—it's inherently easy to deadlock unless they're being -//! used from separate tasks or an a coroutine setup (e.g. [`crate::future::fn_stream::FnStream`]) +//! used from separate tasks or an a coroutine setup (e.g. [`crate::future::pagination_stream::fn_stream::FnStream`]) +use std::future::poll_fn; use std::sync::Arc; use std::task::{Context, Poll}; -use tokio::sync::mpsc::error::SendError; use tokio::sync::Semaphore; /// Create a new rendezvous channel @@ -38,6 +38,36 @@ pub fn channel() -> (Sender, Receiver) { ) } +/// Errors for rendezvous channel +pub mod error { + use std::fmt; + use tokio::sync::mpsc::error::SendError as TokioSendError; + + /// Error when [crate::future::rendezvous::Sender] fails to send a value to the associated `Receiver` + #[derive(Debug)] + pub struct SendError { + source: TokioSendError, + } + + impl SendError { + pub(crate) fn tokio_send_error(source: TokioSendError) -> Self { + Self { source } + } + } + + impl fmt::Display for SendError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "failed to send value to the receiver") + } + } + + impl std::error::Error for SendError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + Some(&self.source) + } + } +} + #[derive(Debug)] /// Sender-half of a channel pub struct Sender { @@ -50,7 +80,7 @@ impl Sender { /// /// Unlike something like `tokio::sync::mpsc::Channel` where sending a value will be buffered until /// demand exists, a rendezvous sender will wait until matching demand exists before this function will return. - pub async fn send(&self, item: T) -> Result<(), SendError> { + pub async fn send(&self, item: T) -> Result<(), error::SendError> { let result = self.chan.send(item).await; // If this is an error, the rx half has been dropped. We will never get demand. if result.is_ok() { @@ -61,7 +91,7 @@ impl Sender { .expect("semaphore is never closed") .forget(); } - result + result.map_err(error::SendError::tokio_send_error) } } @@ -75,7 +105,11 @@ pub struct Receiver { impl Receiver { /// Polls to receive an item from the channel - pub fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll> { + pub async fn recv(&mut self) -> Option { + poll_fn(|cx| self.poll_recv(cx)).await + } + + pub(crate) fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll> { // This uses `needs_permit` to track whether this is the first poll since we last returned an item. // If it is, we will grant a permit to the semaphore. Otherwise, we'll just forward the response through. let resp = self.chan.poll_recv(cx); @@ -95,13 +129,8 @@ impl Receiver { #[cfg(test)] mod test { - use crate::future::rendezvous::{channel, Receiver}; + use crate::future::rendezvous::channel; use std::sync::{Arc, Mutex}; - use tokio::macros::support::poll_fn; - - async fn recv(rx: &mut Receiver) -> Option { - poll_fn(|cx| rx.poll_recv(cx)).await - } #[tokio::test] async fn send_blocks_caller() { @@ -116,11 +145,11 @@ mod test { *idone.lock().unwrap() = 3; }); assert_eq!(*done.lock().unwrap(), 0); - assert_eq!(recv(&mut rx).await, Some(0)); + assert_eq!(rx.recv().await, Some(0)); assert_eq!(*done.lock().unwrap(), 1); - assert_eq!(recv(&mut rx).await, Some(1)); + assert_eq!(rx.recv().await, Some(1)); assert_eq!(*done.lock().unwrap(), 2); - assert_eq!(recv(&mut rx).await, None); + assert_eq!(rx.recv().await, None); assert_eq!(*done.lock().unwrap(), 3); let _ = send.await; } diff --git a/rust-runtime/aws-smithy-async/src/rt/sleep.rs b/rust-runtime/aws-smithy-async/src/rt/sleep.rs index 6776790ee0a..b71c90a4e69 100644 --- a/rust-runtime/aws-smithy-async/src/rt/sleep.rs +++ b/rust-runtime/aws-smithy-async/src/rt/sleep.rs @@ -6,7 +6,6 @@ //! Provides an [`AsyncSleep`] trait that returns a future that sleeps for a given duration, //! and implementations of `AsyncSleep` for different async runtimes. -use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::fmt::{Debug, Formatter}; use std::future::Future; use std::pin::Pin; @@ -69,10 +68,6 @@ impl AsyncSleep for SharedAsyncSleep { } } -impl Storable for SharedAsyncSleep { - type Storer = StoreReplace; -} - #[cfg(feature = "rt-tokio")] /// Returns a default sleep implementation based on the features enabled pub fn default_async_sleep() -> Option { @@ -88,7 +83,7 @@ pub fn default_async_sleep() -> Option { /// Future returned by [`AsyncSleep`]. #[non_exhaustive] #[must_use] -pub struct Sleep(Pin + Send + 'static>>); +pub struct Sleep(Pin + Send + Sync + 'static>>); impl Debug for Sleep { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { @@ -100,7 +95,7 @@ impl Sleep { /// Create a new [`Sleep`] future /// /// The provided future will be Boxed. - pub fn new(future: impl Future + Send + 'static) -> Sleep { + pub fn new(future: impl Future + Send + Sync + 'static) -> Sleep { Sleep(Box::pin(future)) } } diff --git a/rust-runtime/aws-smithy-async/src/test_util.rs b/rust-runtime/aws-smithy-async/src/test_util.rs index fa1dfe300b5..dd7eacfd895 100644 --- a/rust-runtime/aws-smithy-async/src/test_util.rs +++ b/rust-runtime/aws-smithy-async/src/test_util.rs @@ -22,7 +22,6 @@ pub struct ManualTimeSource { log: Arc>>, } -#[cfg(feature = "test-util")] impl ManualTimeSource { /// Get the number of seconds since the UNIX Epoch as an f64. /// @@ -35,11 +34,43 @@ impl ManualTimeSource { .unwrap() .as_secs_f64() } + + /// Creates a new [`ManualTimeSource`] + pub fn new(start_time: SystemTime) -> ManualTimeSource { + Self { + start_time, + log: Default::default(), + } + } + + /// Advances the time of this time source by `duration`. + pub fn advance(&self, duration: Duration) -> SystemTime { + let mut log = self.log.lock().unwrap(); + log.push(duration); + self._now(&log) + } + + fn _now(&self, log: &[Duration]) -> SystemTime { + self.start_time + log.iter().sum::() + } + + /// Sets the `time` of this manual time source. + /// + /// # Panics + /// This function panics if `time` < `now()` + pub fn set_time(&self, time: SystemTime) { + let mut log = self.log.lock().unwrap(); + let now = self._now(&log); + if time < now { + panic!("Cannot move time backwards!"); + } + log.push(time.duration_since(now).unwrap()); + } } impl TimeSource for ManualTimeSource { fn now(&self) -> SystemTime { - self.start_time + self.log.lock().unwrap().iter().sum::() + self._now(&self.log.lock().unwrap()) } } @@ -107,6 +138,13 @@ impl InstantSleep { Self { log } } + /// Create an `InstantSleep` without passing in a shared log. + pub fn unlogged() -> Self { + Self { + log: Default::default(), + } + } + /// Return the sleep durations that were logged by this `InstantSleep`. pub fn logs(&self) -> Vec { self.log.lock().unwrap().iter().cloned().collect() diff --git a/rust-runtime/aws-smithy-async/src/time.rs b/rust-runtime/aws-smithy-async/src/time.rs index 0b43a0af741..77e1ef05855 100644 --- a/rust-runtime/aws-smithy-async/src/time.rs +++ b/rust-runtime/aws-smithy-async/src/time.rs @@ -4,10 +4,9 @@ */ //! Time source abstraction to support WASM and testing -use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::fmt::Debug; use std::sync::Arc; -use std::time::SystemTime; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; /// Trait with a `now()` function returning the current time pub trait TimeSource: Debug + Send + Sync { @@ -29,6 +28,8 @@ impl SystemTimeSource { impl TimeSource for SystemTimeSource { fn now(&self) -> SystemTime { + // this is the one OK usage + #[allow(clippy::disallowed_methods)] SystemTime::now() } } @@ -50,6 +51,11 @@ impl StaticTimeSource { pub fn new(time: SystemTime) -> Self { Self { time } } + + /// Creates a new static time source from the provided number of seconds since the UNIX epoch + pub fn from_secs(epoch_secs: u64) -> Self { + Self::new(UNIX_EPOCH + Duration::from_secs(epoch_secs)) + } } impl TimeSource for StaticTimeSource { @@ -87,7 +93,3 @@ impl TimeSource for SharedTimeSource { self.0.now() } } - -impl Storable for SharedTimeSource { - type Storer = StoreReplace; -} diff --git a/rust-runtime/aws-smithy-checksums/Cargo.toml b/rust-runtime/aws-smithy-checksums/Cargo.toml index b02b34cc092..2485412d72d 100644 --- a/rust-runtime/aws-smithy-checksums/Cargo.toml +++ b/rust-runtime/aws-smithy-checksums/Cargo.toml @@ -8,7 +8,7 @@ authors = [ description = "Checksum calculation and verification callbacks" edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/rust-runtime/aws-smithy-checksums/README.md b/rust-runtime/aws-smithy-checksums/README.md index 3ad53131f6c..94909aa8bef 100644 --- a/rust-runtime/aws-smithy-checksums/README.md +++ b/rust-runtime/aws-smithy-checksums/README.md @@ -1,7 +1,7 @@ # aws-smithy-checksum-callbacks -Checksum calculation and verification callbacks for HTTP request and response bodies sent by service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs). +Checksum calculation and verification callbacks for HTTP request and response bodies sent by service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs). -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-checksums/external-types.toml b/rust-runtime/aws-smithy-checksums/external-types.toml index 4ef87d4af8b..dbd4b4eee20 100644 --- a/rust-runtime/aws-smithy-checksums/external-types.toml +++ b/rust-runtime/aws-smithy-checksums/external-types.toml @@ -1,5 +1,5 @@ allowed_external_types = [ - "aws_smithy_http::*", + "aws_smithy_types::body::SdkBody", "bytes::bytes::Bytes", "http::header::map::HeaderMap", "http::header::name::HeaderName", diff --git a/rust-runtime/aws-smithy-checksums/src/body/calculate.rs b/rust-runtime/aws-smithy-checksums/src/body/calculate.rs index 746ee04cd39..8c9fcb368b0 100644 --- a/rust-runtime/aws-smithy-checksums/src/body/calculate.rs +++ b/rust-runtime/aws-smithy-checksums/src/body/calculate.rs @@ -7,8 +7,8 @@ use crate::http::HttpChecksum; -use aws_smithy_http::body::SdkBody; use aws_smithy_http::header::append_merge_header_maps; +use aws_smithy_types::body::SdkBody; use http::HeaderMap; use http_body::SizeHint; @@ -38,7 +38,7 @@ impl ChecksumBody { impl http_body::Body for ChecksumBody { type Data = bytes::Bytes; - type Error = aws_smithy_http::body::Error; + type Error = aws_smithy_types::body::Error; fn poll_data( self: Pin<&mut Self>, @@ -99,8 +99,8 @@ impl http_body::Body for ChecksumBody { mod tests { use super::ChecksumBody; use crate::{http::CRC_32_HEADER_NAME, ChecksumAlgorithm, CRC_32_NAME}; - use aws_smithy_http::body::SdkBody; use aws_smithy_types::base64; + use aws_smithy_types::body::SdkBody; use bytes::Buf; use bytes_utils::SegmentedBuf; use http_body::Body; @@ -145,7 +145,7 @@ mod tests { .expect("checksum generation was without error") .expect("trailers were set"); let checksum_trailer = trailers - .get(&CRC_32_HEADER_NAME) + .get(CRC_32_HEADER_NAME) .expect("trailers contain crc32 checksum"); let checksum_trailer = header_value_as_checksum_string(checksum_trailer); diff --git a/rust-runtime/aws-smithy-checksums/src/body/validate.rs b/rust-runtime/aws-smithy-checksums/src/body/validate.rs index 5af263bf02b..cf15815772e 100644 --- a/rust-runtime/aws-smithy-checksums/src/body/validate.rs +++ b/rust-runtime/aws-smithy-checksums/src/body/validate.rs @@ -8,7 +8,7 @@ use crate::http::HttpChecksum; -use aws_smithy_http::body::SdkBody; +use aws_smithy_types::body::SdkBody; use bytes::Bytes; use http::{HeaderMap, HeaderValue}; @@ -48,7 +48,7 @@ impl ChecksumBody { fn poll_inner( self: Pin<&mut Self>, cx: &mut Context<'_>, - ) -> Poll>> { + ) -> Poll>> { use http_body::Body; let this = self.project(); @@ -126,7 +126,7 @@ impl std::error::Error for Error {} impl http_body::Body for ChecksumBody { type Data = Bytes; - type Error = aws_smithy_http::body::Error; + type Error = aws_smithy_types::body::Error; fn poll_data( self: Pin<&mut Self>, @@ -155,7 +155,7 @@ impl http_body::Body for ChecksumBody { mod tests { use crate::body::validate::{ChecksumBody, Error}; use crate::ChecksumAlgorithm; - use aws_smithy_http::body::SdkBody; + use aws_smithy_types::body::SdkBody; use bytes::{Buf, Bytes}; use bytes_utils::SegmentedBuf; use http_body::Body; diff --git a/rust-runtime/aws-smithy-checksums/src/http.rs b/rust-runtime/aws-smithy-checksums/src/http.rs index 648e120110d..fbccd246f49 100644 Binary files a/rust-runtime/aws-smithy-checksums/src/http.rs and b/rust-runtime/aws-smithy-checksums/src/http.rs differ diff --git a/rust-runtime/aws-smithy-checksums/src/lib.rs b/rust-runtime/aws-smithy-checksums/src/lib.rs index 9edda514ec0..372bc467e43 100644 --- a/rust-runtime/aws-smithy-checksums/src/lib.rs +++ b/rust-runtime/aws-smithy-checksums/src/lib.rs @@ -319,7 +319,7 @@ mod tests { let mut checksum = Crc32::default(); checksum.update(TEST_DATA.as_bytes()); let checksum_result = Box::new(checksum).headers(); - let encoded_checksum = checksum_result.get(&CRC_32_HEADER_NAME).unwrap(); + let encoded_checksum = checksum_result.get(CRC_32_HEADER_NAME).unwrap(); let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum); let expected_checksum = "0xD308AEB2"; @@ -328,14 +328,14 @@ mod tests { } // TODO(https://github.com/zowens/crc32c/issues/34) - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))] #[test] fn test_crc32c_checksum() { let mut checksum = Crc32c::default(); checksum.update(TEST_DATA.as_bytes()); let checksum_result = Box::new(checksum).headers(); - let encoded_checksum = checksum_result.get(&CRC_32_C_HEADER_NAME).unwrap(); + let encoded_checksum = checksum_result.get(CRC_32_C_HEADER_NAME).unwrap(); let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum); let expected_checksum = "0x3379B4CA"; @@ -348,7 +348,7 @@ mod tests { let mut checksum = Sha1::default(); checksum.update(TEST_DATA.as_bytes()); let checksum_result = Box::new(checksum).headers(); - let encoded_checksum = checksum_result.get(&SHA_1_HEADER_NAME).unwrap(); + let encoded_checksum = checksum_result.get(SHA_1_HEADER_NAME).unwrap(); let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum); let expected_checksum = "0xF48DD853820860816C75D54D0F584DC863327A7C"; @@ -361,7 +361,7 @@ mod tests { let mut checksum = Sha256::default(); checksum.update(TEST_DATA.as_bytes()); let checksum_result = Box::new(checksum).headers(); - let encoded_checksum = checksum_result.get(&SHA_256_HEADER_NAME).unwrap(); + let encoded_checksum = checksum_result.get(SHA_256_HEADER_NAME).unwrap(); let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum); let expected_checksum = @@ -375,7 +375,7 @@ mod tests { let mut checksum = Md5::default(); checksum.update(TEST_DATA.as_bytes()); let checksum_result = Box::new(checksum).headers(); - let encoded_checksum = checksum_result.get(&MD5_HEADER_NAME).unwrap(); + let encoded_checksum = checksum_result.get(MD5_HEADER_NAME).unwrap(); let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum); let expected_checksum = "0xEB733A00C0C9D336E65691A37AB54293"; diff --git a/rust-runtime/aws-smithy-client/Cargo.toml b/rust-runtime/aws-smithy-client/Cargo.toml index 8d6ac25eaf0..a480618b617 100644 --- a/rust-runtime/aws-smithy-client/Cargo.toml +++ b/rust-runtime/aws-smithy-client/Cargo.toml @@ -2,62 +2,13 @@ name = "aws-smithy-client" version = "0.0.0-smithy-rs-head" authors = ["AWS Rust SDK Team ", "Russell Cohen "] -description = "Client for smithy-rs." +description = "This crate is no longer used by smithy-rs and is deprecated." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" - -[features] -rt-tokio = ["aws-smithy-async/rt-tokio"] -test-util = ["dep:aws-smithy-protocol-test", "dep:hyper", "hyper?/server", "hyper?/h2", "dep:serde", "dep:serde_json", "serde?/derive", "rustls", "tokio/full"] -native-tls = [] -allow-compilation = [] # our tests use `cargo test --all-features` and native-tls breaks CI -rustls = ["dep:hyper-rustls", "dep:lazy_static", "dep:rustls", "client-hyper", "rt-tokio"] -client-hyper = ["dep:hyper"] -hyper-webpki-doctest-only = ["dep:hyper-rustls", "hyper-rustls?/webpki-roots"] - -[dependencies] -aws-smithy-async = { path = "../aws-smithy-async" } -aws-smithy-http = { path = "../aws-smithy-http" } -aws-smithy-http-tower = { path = "../aws-smithy-http-tower" } -aws-smithy-protocol-test = { path = "../aws-smithy-protocol-test", optional = true } -aws-smithy-types = { path = "../aws-smithy-types" } -bytes = "1" -fastrand = "1.4.0" -http = "0.2.3" -http-body = "0.4.4" -hyper = { version = "0.14.26", features = ["client", "http2", "http1", "tcp"], optional = true } -# cargo does not support optional test dependencies, so to completely disable rustls -# we need to add the webpki-roots feature here. -# https://github.com/rust-lang/cargo/issues/1596 -hyper-rustls = { version = "0.24", optional = true, features = ["rustls-native-certs", "http2"] } -hyper-tls = { version = "0.5.0", optional = true } -rustls = { version = "0.21.1", optional = true } -lazy_static = { version = "1", optional = true } -pin-project-lite = "0.2.7" -serde = { version = "1", features = ["derive"], optional = true } -serde_json = { version = "1", optional = true } -tokio = { version = "1.13.1" } -tower = { version = "0.4.6", features = ["util", "retry"] } -tracing = "0.1" - -[dev-dependencies] -aws-smithy-async = { path = "../aws-smithy-async", features = ["rt-tokio"] } -hyper-tls = { version = "0.5.0" } -serde = { version = "1", features = ["derive"] } -serde_json = "1" -tokio = { version = "1.23.1", features = ["full", "test-util"] } -tower-test = "0.4.0" -tracing-subscriber = "0.3.16" -tracing-test = "0.2.4" - +repository = "https://github.com/smithy-lang/smithy-rs" [package.metadata.docs.rs] all-features = true targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata - -[[test]] -name = "e2e_test" -required-features = ["test-util", "rt-tokio"] diff --git a/rust-runtime/aws-smithy-client/README.md b/rust-runtime/aws-smithy-client/README.md index b1deae09be3..a598a26abdc 100644 --- a/rust-runtime/aws-smithy-client/README.md +++ b/rust-runtime/aws-smithy-client/README.md @@ -1,13 +1,7 @@ # aws-smithy-client -`aws-smithy-client` defines a Tower-based client that implements functionality that exists across all service clients -generated by [smithy-rs](https://github.com/awslabs/smithy-rs) including: - -- Retries -- Connector, request attempt, and multi-request timeouts -- Configurable middleware -- HTTPS implementations +This crate is no longer used by smithy-rs and is deprecated. Its equivalent logic is now in aws-smithy-runtime-api and aws-smithy-runtime. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-client/external-types.toml b/rust-runtime/aws-smithy-client/external-types.toml index 0ca50284169..7fa182b39d1 100644 --- a/rust-runtime/aws-smithy-client/external-types.toml +++ b/rust-runtime/aws-smithy-client/external-types.toml @@ -1,42 +1 @@ -allowed_external_types = [ - "aws_smithy_async::*", - "aws_smithy_http::*", - "aws_smithy_http_tower::*", - "aws_smithy_types::*", - "aws_smithy_protocol_test::MediaType", - "http::header::name::HeaderName", - "http::request::Request", - "http::response::Response", - "http::uri::Uri", - "tower::retry::policy::Policy", - "tower_service::Service", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Move `rustls` feature into separate crates - "hyper::client::connect::http::HttpConnector", - "hyper_rustls::connector::HttpsConnector", - "hyper_tls::client::HttpsConnector", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `client-hyper` feature - "hyper::client::client::Builder", - "hyper::client::connect::Connection", - "tokio::io::async_read::AsyncRead", - "tokio::io::async_write::AsyncWrite", - - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-utils` feature - "bytes::bytes::Bytes", - "serde::ser::Serialize", - "serde::de::Deserialize", - "hyper::client::connect::dns::Name", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if we want to continue exposing tower_layer - "tower_layer::Layer", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate middleware_fn and service_fn, or remove them if they're unused - "tower::util::map_request::MapRequestLayer", - "tower::util::service_fn::ServiceFn", - "tower_util::MapRequestLayer", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose on `tower::BoxError` - "tower::BoxError", -] +allowed_external_types = [] diff --git a/rust-runtime/aws-smithy-client/src/bounds.rs b/rust-runtime/aws-smithy-client/src/bounds.rs deleted file mode 100644 index e0abf9e4dfc..00000000000 --- a/rust-runtime/aws-smithy-client/src/bounds.rs +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! This module holds convenient short-hands for the otherwise fairly extensive trait bounds -//! required for `call` and friends. -//! -//! The short-hands will one day be true [trait aliases], but for now they are traits with blanket -//! implementations. Also, due to [compiler limitations], the bounds repeat a number of associated -//! types with bounds so that those bounds [do not need to be repeated] at the call site. It's a -//! bit of a mess to define, but _should_ be invisible to callers. -//! -//! [trait aliases]: https://rust-lang.github.io/rfcs/1733-trait-alias.html -//! [compiler limitations]: https://github.com/rust-lang/rust/issues/20671 -//! [do not need to be repeated]: https://github.com/rust-lang/rust/issues/20671#issuecomment-529752828 - -use crate::erase::DynConnector; -use crate::http_connector::HttpConnector; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation::{self, Operation}; -use aws_smithy_http::response::ParseHttpResponse; -use aws_smithy_http::result::{ConnectorError, SdkError, SdkSuccess}; -use aws_smithy_http::retry::ClassifyRetry; -use tower::{Layer, Service}; - -/// A service that has parsed a raw Smithy response. -pub type Parsed = - aws_smithy_http_tower::parse_response::ParseResponseService; - -/// A low-level Smithy connector that maps from [`http::Request`] to [`http::Response`]. -/// -/// This trait has a blanket implementation for all compatible types, and should never be -/// implemented. -pub trait SmithyConnector: - Service< - http::Request, - Response = http::Response, - Error = ::Error, - Future = ::Future, - > + Send - + Sync - + Clone - + 'static -{ - /// Forwarding type to `::Error` for bound inference. - /// - /// See module-level docs for details. - type Error: Into + Send + Sync + 'static; - - /// Forwarding type to `::Future` for bound inference. - /// - /// See module-level docs for details. - type Future: Send + 'static; -} - -impl SmithyConnector for T -where - T: Service, Response = http::Response> - + Send - + Sync - + Clone - + 'static, - T::Error: Into + Send + Sync + 'static, - T::Future: Send + 'static, -{ - type Error = T::Error; - type Future = T::Future; -} - -impl From for HttpConnector -where - E: Into + Send + Sync + 'static, - F: Send + 'static, - T: SmithyConnector>, -{ - fn from(smithy_connector: T) -> Self { - HttpConnector::Prebuilt(Some(DynConnector::new(smithy_connector))) - } -} - -/// A Smithy middleware service that adjusts [`aws_smithy_http::operation::Request`](operation::Request)s. -/// -/// This trait has a blanket implementation for all compatible types, and should never be -/// implemented. -pub trait SmithyMiddlewareService: - Service< - operation::Request, - Response = operation::Response, - Error = aws_smithy_http_tower::SendOperationError, - Future = ::Future, -> -{ - /// Forwarding type to `::Future` for bound inference. - /// - /// See module-level docs for details. - type Future: Send + 'static; -} - -impl SmithyMiddlewareService for T -where - T: Service< - operation::Request, - Response = operation::Response, - Error = aws_smithy_http_tower::SendOperationError, - >, - T::Future: Send + 'static, -{ - type Future = T::Future; -} - -/// A Smithy middleware layer (i.e., factory). -/// -/// This trait has a blanket implementation for all compatible types, and should never be -/// implemented. -pub trait SmithyMiddleware: - Layer< - aws_smithy_http_tower::dispatch::DispatchService, - Service = >::Service, -> -{ - /// Forwarding type to `::Service` for bound inference. - /// - /// See module-level docs for details. - type Service: SmithyMiddlewareService + Send + Sync + Clone + 'static; -} - -impl SmithyMiddleware for T -where - T: Layer>, - T::Service: SmithyMiddlewareService + Send + Sync + Clone + 'static, -{ - type Service = T::Service; -} - -/// A Smithy retry policy. -/// -/// This trait has a blanket implementation for all compatible types, and should never be -/// implemented. -pub trait SmithyRetryPolicy: - tower::retry::Policy, SdkSuccess, SdkError> + Clone -{ - /// Forwarding type to `O` for bound inference. - /// - /// See module-level docs for details. - type O: ParseHttpResponse> + Send + Sync + Clone + 'static; - /// Forwarding type to `E` for bound inference. - /// - /// See module-level docs for details. - type E: std::error::Error; - - /// Forwarding type to `Retry` for bound inference. - /// - /// See module-level docs for details. - type Retry: ClassifyRetry, SdkError>; -} - -impl SmithyRetryPolicy for R -where - R: tower::retry::Policy, SdkSuccess, SdkError> + Clone, - O: ParseHttpResponse> + Send + Sync + Clone + 'static, - E: std::error::Error, - Retry: ClassifyRetry, SdkError>, -{ - type O = O; - type E = E; - type Retry = Retry; -} diff --git a/rust-runtime/aws-smithy-client/src/builder.rs b/rust-runtime/aws-smithy-client/src/builder.rs deleted file mode 100644 index 5602c330f5c..00000000000 --- a/rust-runtime/aws-smithy-client/src/builder.rs +++ /dev/null @@ -1,567 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::{bounds, erase, retry, Client}; -use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_types::retry::ReconnectMode; -use aws_smithy_types::timeout::{OperationTimeoutConfig, TimeoutConfig}; - -#[derive(Clone, Debug)] -struct MaybeRequiresSleep { - requires_sleep: bool, - implementation: I, -} - -impl MaybeRequiresSleep { - fn new(requires_sleep: bool, implementation: I) -> Self { - Self { - requires_sleep, - implementation, - } - } -} - -/// A builder that provides more customization options when constructing a [`Client`]. -/// -/// To start, call [`Builder::new`]. Then, chain the method calls to configure the `Builder`. -/// When configured to your liking, call [`Builder::build`]. The individual methods have additional -/// documentation. -#[derive(Clone, Debug)] -pub struct Builder { - connector: MaybeRequiresSleep, - middleware: M, - retry_policy: MaybeRequiresSleep, - operation_timeout_config: Option, - sleep_impl: Option, - reconnect_mode: Option, -} - -/// transitional default: disable this behavior by default -const fn default_reconnect_mode() -> ReconnectMode { - ReconnectMode::ReuseAllConnections -} - -impl Default for Builder -where - C: Default, - M: Default, -{ - fn default() -> Self { - let default_retry_config = retry::Config::default(); - Self { - connector: MaybeRequiresSleep::new(false, Default::default()), - middleware: Default::default(), - retry_policy: MaybeRequiresSleep::new( - default_retry_config.has_retry(), - retry::Standard::new(default_retry_config), - ), - operation_timeout_config: None, - sleep_impl: default_async_sleep(), - reconnect_mode: Some(default_reconnect_mode()), - } - } -} - -// It'd be nice to include R where R: Default here, but then the caller ends up always having to -// specify R explicitly since type parameter defaults (like the one for R) aren't picked up when R -// cannot be inferred. This is, arguably, a compiler bug/missing language feature, but is -// complicated: https://github.com/rust-lang/rust/issues/27336. -// -// For the time being, we stick with just for ::new. Those can usually be inferred since we -// only implement .constructor and .middleware when C and M are () respectively. Users who really -// need a builder for a custom R can use ::default instead. -impl Builder -where - C: Default, - M: Default, -{ - /// Construct a new builder. This does not specify a [connector](Builder::connector) - /// or [middleware](Builder::middleware). - /// It uses the [standard retry mechanism](retry::Standard). - pub fn new() -> Self { - Self::default() - } -} - -#[cfg(feature = "rustls")] -use crate::erase::DynConnector; -#[cfg(feature = "rustls")] -use crate::http_connector::ConnectorSettings; -#[cfg(feature = "rustls")] -use crate::hyper_ext::Adapter as HyperAdapter; - -#[cfg(all(feature = "native-tls", not(feature = "allow-compilation")))] -compile_error!("Feature native-tls has been removed. For upgrade instructions, see: https://awslabs.github.io/smithy-rs/design/transport/connector.html"); - -/// Max idle connections is not standardized across SDKs. Java V1 and V2 use 50, and Go V2 uses 100. -/// The number below was chosen arbitrarily between those two reference points, and should allow -/// for 14 separate SDK clients in a Lambda where the max file handles is 1024. -#[cfg(feature = "rustls")] -const DEFAULT_MAX_IDLE_CONNECTIONS: usize = 70; - -/// Returns default HTTP client settings for hyper. -#[cfg(feature = "rustls")] -fn default_hyper_builder() -> hyper::client::Builder { - let mut builder = hyper::client::Builder::default(); - builder.pool_max_idle_per_host(DEFAULT_MAX_IDLE_CONNECTIONS); - builder -} - -#[cfg(feature = "rustls")] -impl Builder<(), M, R> { - /// Connect to the service over HTTPS using Rustls using dynamic dispatch. - pub fn rustls_connector( - self, - connector_settings: ConnectorSettings, - ) -> Builder { - self.connector(DynConnector::new( - HyperAdapter::builder() - .hyper_builder(default_hyper_builder()) - .connector_settings(connector_settings) - .build(crate::conns::https()), - )) - } -} - -#[cfg(feature = "rustls")] -impl Builder<(), M, R> { - /// Create a Smithy client builder with an HTTPS connector and the [standard retry - /// policy](crate::retry::Standard) over the default middleware implementation. - /// - /// For convenience, this constructor type-erases the concrete TLS connector backend used using - /// dynamic dispatch. This comes at a slight runtime performance cost. See - /// [`DynConnector`](crate::erase::DynConnector) for details. To avoid that overhead, use - /// [`Builder::rustls_connector`] instead. - #[cfg(feature = "rustls")] - pub fn dyn_https_connector( - self, - connector_settings: ConnectorSettings, - ) -> Builder { - let with_https = |b: Builder<_, M, R>| b.rustls_connector(connector_settings); - with_https(self) - } -} - -impl Builder<(), M, R> { - /// Specify the connector for the eventual client to use. - /// - /// The connector dictates how requests are turned into responses. Normally, this would entail - /// sending the request to some kind of remote server, but in certain settings it's useful to - /// be able to use a custom connector instead, such as to mock the network for tests. - /// - /// If you just want to specify a function from request to response instead, use - /// [`Builder::connector_fn`]. - pub fn connector(self, connector: C) -> Builder { - Builder { - connector: MaybeRequiresSleep::new(false, connector), - middleware: self.middleware, - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Use a function that directly maps each request to a response as a connector. - /// - /// ```no_run - /// use aws_smithy_client::Builder; - /// use aws_smithy_http::body::SdkBody; - /// let client = Builder::new() - /// # /* - /// .middleware(..) - /// # */ - /// # .middleware(tower::layer::util::Identity::new()) - /// .connector_fn(|req: http::Request| { - /// async move { - /// Ok(http::Response::new(SdkBody::empty())) - /// } - /// }) - /// .build(); - /// # client.check(); - /// ``` - pub fn connector_fn(self, map: F) -> Builder, M, R> - where - F: Fn(http::Request) -> FF + Send, - FF: std::future::Future, ConnectorError>>, - // NOTE: The extra bound here is to help the type checker give better errors earlier. - tower::util::ServiceFn: bounds::SmithyConnector, - { - self.connector(tower::service_fn(map)) - } -} - -impl Builder { - /// Specify the middleware for the eventual client ot use. - /// - /// The middleware adjusts requests before they are dispatched to the connector. It is - /// responsible for filling in any request parameters that aren't specified by the Smithy - /// protocol definition, such as those used for routing (like the URL), authentication, and - /// authorization. - /// - /// The middleware takes the form of a [`tower::Layer`] that wraps the actual connection for - /// each request. The [`tower::Service`] that the middleware produces must accept requests of - /// the type [`aws_smithy_http::operation::Request`] and return responses of the type - /// [`http::Response`], most likely by modifying the provided request in place, - /// passing it to the inner service, and then ultimately returning the inner service's - /// response. - /// - /// If your requests are already ready to be sent and need no adjustment, you can use - /// [`tower::layer::util::Identity`] as your middleware. - pub fn middleware(self, middleware: M) -> Builder { - Builder { - connector: self.connector, - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - middleware, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Use a function-like middleware that directly maps each request. - /// - /// ```no_run - /// use aws_smithy_client::Builder; - /// use aws_smithy_client::erase::DynConnector; - /// use aws_smithy_client::never::NeverConnector; - /// use aws_smithy_http::body::SdkBody; - /// let my_connector = DynConnector::new( - /// // Your own connector here or use `dyn_https_connector()` - /// # NeverConnector::new() - /// ); - /// let client = Builder::new() - /// .connector(my_connector) - /// .middleware_fn(|req: aws_smithy_http::operation::Request| { - /// req - /// }) - /// .build(); - /// # client.check(); - /// ``` - pub fn middleware_fn(self, map: F) -> Builder, R> - where - F: Fn(aws_smithy_http::operation::Request) -> aws_smithy_http::operation::Request - + Clone - + Send - + Sync - + 'static, - { - self.middleware(tower::util::MapRequestLayer::new(map)) - } -} - -impl Builder { - /// Specify the retry policy for the eventual client to use. - /// - /// By default, the Smithy client uses a standard retry policy that works well in most - /// settings. You can use this method to override that policy with a custom one. A new policy - /// instance will be instantiated for each request using [`retry::NewRequestPolicy`]. Each - /// policy instance must implement [`tower::retry::Policy`]. - /// - /// If you just want to modify the policy _configuration_ for the standard retry policy, use - /// [`Builder::set_retry_config`]. - pub fn retry_policy(self, retry_policy: R) -> Builder { - Builder { - connector: self.connector, - retry_policy: MaybeRequiresSleep::new(false, retry_policy), - operation_timeout_config: self.operation_timeout_config, - middleware: self.middleware, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } -} - -impl Builder { - /// Set the standard retry policy's configuration. When `config` is `None`, - /// the default retry policy will be used. - pub fn set_retry_config(&mut self, config: Option) -> &mut Self { - let config = config.unwrap_or_default(); - self.retry_policy = - MaybeRequiresSleep::new(config.has_retry(), retry::Standard::new(config)); - self - } - - /// Set the standard retry policy's configuration. - pub fn retry_config(mut self, config: retry::Config) -> Self { - self.set_retry_config(Some(config)); - self - } - - /// Set operation timeout config for the client. If `operation_timeout_config` is - /// `None`, timeouts will be disabled. - pub fn set_operation_timeout_config( - &mut self, - operation_timeout_config: Option, - ) -> &mut Self { - self.operation_timeout_config = operation_timeout_config; - self - } - - /// Set operation timeout config for the client. - pub fn operation_timeout_config( - mut self, - operation_timeout_config: OperationTimeoutConfig, - ) -> Self { - self.operation_timeout_config = Some(operation_timeout_config); - self - } - - /// Set [`aws_smithy_async::rt::sleep::SharedAsyncSleep`] that the [`Client`] will use to create things like timeout futures. - pub fn set_sleep_impl(&mut self, async_sleep: Option) -> &mut Self { - self.sleep_impl = async_sleep; - self - } - - /// Set [`aws_smithy_async::rt::sleep::SharedAsyncSleep`] that the [`Client`] will use to create things like timeout futures. - pub fn sleep_impl(mut self, async_sleep: SharedAsyncSleep) -> Self { - self.set_sleep_impl(Some(async_sleep)); - self - } -} - -impl Builder { - /// Use a connector that wraps the current connector. - pub fn map_connector(self, map: F) -> Builder - where - F: FnOnce(C) -> C2, - { - Builder { - connector: MaybeRequiresSleep::new( - self.connector.requires_sleep, - map(self.connector.implementation), - ), - middleware: self.middleware, - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Use a middleware that wraps the current middleware. - pub fn map_middleware(self, map: F) -> Builder - where - F: FnOnce(M) -> M2, - { - Builder { - connector: self.connector, - middleware: map(self.middleware), - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Set the [`ReconnectMode`] for the retry strategy - /// - /// By default, no reconnection occurs. - /// - /// When enabled and a transient error is encountered, the connection in use will be poisoned. - /// This prevents reusing a connection to a potentially bad host. - pub fn reconnect_mode(mut self, reconnect_mode: ReconnectMode) -> Self { - self.set_reconnect_mode(Some(reconnect_mode)); - self - } - - /// Set the [`ReconnectMode`] for the retry strategy - /// - /// By default, no reconnection occurs. - /// - /// When enabled and a transient error is encountered, the connection in use will be poisoned. - /// This prevents reusing a connection to a potentially bad host. - pub fn set_reconnect_mode(&mut self, reconnect_mode: Option) -> &mut Self { - self.reconnect_mode = reconnect_mode; - self - } - - /// Enable reconnection on transient errors - /// - /// By default, when a transient error is encountered, the connection in use will be poisoned. - /// This prevents reusing a connection to a potentially bad host but may increase the load on - /// the server. - pub fn reconnect_on_transient_errors(self) -> Self { - self.reconnect_mode(ReconnectMode::ReconnectOnTransientError) - } - - /// Build a Smithy service [`Client`]. - pub fn build(self) -> Client { - let operation_timeout_config = self - .operation_timeout_config - .unwrap_or_else(|| TimeoutConfig::disabled().into()); - if self.sleep_impl.is_none() { - const ADDITIONAL_HELP: &str = - "Either disable retry by setting max attempts to one, or pass in a `sleep_impl`. \ - If you're not using Tokio, then an implementation of the `AsyncSleep` trait from \ - the `aws-smithy-async` crate is required for your async runtime. If you are using \ - Tokio, then make sure the `rt-tokio` feature is enabled to have its sleep \ - implementation set automatically."; - if self.connector.requires_sleep { - panic!("Socket-level retries for the default connector require a `sleep_impl`, but none was passed into the builder. {ADDITIONAL_HELP}"); - } - if self.retry_policy.requires_sleep { - panic!("Retries require a `sleep_impl`, but none was passed into the builder. {ADDITIONAL_HELP}"); - } - if operation_timeout_config.has_timeouts() { - panic!("Operation timeouts require a `sleep_impl`, but none was passed into the builder. {ADDITIONAL_HELP}"); - } - } - Client { - connector: self.connector.implementation, - retry_policy: self.retry_policy.implementation, - middleware: self.middleware, - operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode.unwrap_or(default_reconnect_mode()), - } - } -} - -impl Builder -where - C: bounds::SmithyConnector, - M: bounds::SmithyMiddleware + Send + Sync + 'static, - R: retry::NewRequestPolicy, -{ - /// Build a type-erased Smithy service [`Client`]. - /// - /// Note that if you're using the standard retry mechanism, [`retry::Standard`], `DynClient` - /// is equivalent to [`Client`] with no type arguments. - /// - /// ```no_run - /// # #[cfg(feature = "https")] - /// # fn not_main() { - /// use aws_smithy_client::{Builder, Client}; - /// struct MyClient { - /// client: aws_smithy_client::Client, - /// } - /// - /// let client = Builder::new() - /// .https() - /// .middleware(tower::layer::util::Identity::new()) - /// .build_dyn(); - /// let client = MyClient { client }; - /// # client.client.check(); - /// # } - pub fn build_dyn(self) -> erase::DynClient { - self.build().into_dyn() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::never::NeverConnector; - use aws_smithy_async::rt::sleep::{AsyncSleep, Sleep}; - use std::panic::{self, AssertUnwindSafe}; - use std::time::Duration; - - #[derive(Clone, Debug)] - struct StubSleep; - impl AsyncSleep for StubSleep { - fn sleep(&self, _duration: Duration) -> Sleep { - todo!() - } - } - - #[test] - fn defaults_dont_panic() { - let builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - - let _ = builder.build(); - } - - #[test] - fn defaults_panic_if_default_tokio_sleep_not_available() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - builder.set_sleep_impl(None); - - let result = panic::catch_unwind(AssertUnwindSafe(move || { - let _ = builder.build(); - })); - assert!(result.is_err()); - } - - #[test] - fn timeouts_without_sleep_panics() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - builder.set_sleep_impl(None); - - let timeout_config = TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .build(); - assert!(timeout_config.has_timeouts()); - builder.set_operation_timeout_config(Some(timeout_config.into())); - - let result = panic::catch_unwind(AssertUnwindSafe(move || { - let _ = builder.build(); - })); - assert!(result.is_err()); - } - - #[test] - fn retry_without_sleep_panics() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - builder.set_sleep_impl(None); - - let retry_config = retry::Config::default(); - assert!(retry_config.has_retry()); - builder.set_retry_config(Some(retry_config)); - - let result = panic::catch_unwind(AssertUnwindSafe(move || { - let _ = builder.build(); - })); - assert!(result.is_err()); - } - - #[test] - fn custom_retry_policy_without_sleep_doesnt_panic() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()) - // Using standard retry here as a shortcut in the test; someone setting - // a custom retry policy would manually implement the required traits - .retry_policy(retry::Standard::default()); - builder.set_sleep_impl(None); - let _ = builder.build(); - } - - #[test] - fn no_panics_when_sleep_given() { - let mut builder = Builder::new() - .connector(NeverConnector::new()) - .middleware(tower::layer::util::Identity::new()); - - let timeout_config = TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .build(); - assert!(timeout_config.has_timeouts()); - builder.set_operation_timeout_config(Some(timeout_config.into())); - - let retry_config = retry::Config::default(); - assert!(retry_config.has_retry()); - builder.set_retry_config(Some(retry_config)); - - let _ = builder.build(); - } - - #[test] - fn builder_connection_helpers_are_dyn() { - #[cfg(feature = "rustls")] - let _builder: Builder = - Builder::new().rustls_connector(Default::default()); - } -} diff --git a/rust-runtime/aws-smithy-client/src/conns.rs b/rust-runtime/aws-smithy-client/src/conns.rs deleted file mode 100644 index d4e25c45aa8..00000000000 --- a/rust-runtime/aws-smithy-client/src/conns.rs +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Type aliases for standard connection types. - -use crate::erase::DynConnector; - -#[cfg(feature = "rustls")] -/// A `hyper` connector that uses the `rustls` crate for TLS. To use this in a smithy client, -/// wrap it in a [hyper_ext::Adapter](crate::hyper_ext::Adapter). -pub type Https = hyper_rustls::HttpsConnector; - -#[cfg(feature = "rustls")] -/// A smithy connector that uses the `rustls` crate for TLS. -pub type Rustls = crate::hyper_ext::Adapter; - -#[cfg(feature = "rustls")] -use hyper_rustls::ConfigBuilderExt; - -// Creating a `with_native_roots` HTTP client takes 300ms on OS X. Cache this so that we -// don't need to repeatedly incur that cost. -#[cfg(feature = "rustls")] -lazy_static::lazy_static! { - static ref HTTPS_NATIVE_ROOTS: Https = { - hyper_rustls::HttpsConnectorBuilder::new() - .with_tls_config( - rustls::ClientConfig::builder() - .with_cipher_suites(&[ - // TLS1.3 suites - rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, - // TLS1.2 suites - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, - rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, - ]) - .with_safe_default_kx_groups() - .with_safe_default_protocol_versions() - .expect("Error with the TLS configuration. Please file a bug report under https://github.com/awslabs/smithy-rs/issues.") - .with_native_roots() - .with_no_client_auth() - ) - .https_or_http() - .enable_http1() - .enable_http2() - .build() - }; -} - -mod default_connector { - use crate::erase::DynConnector; - use crate::http_connector::ConnectorSettings; - use aws_smithy_async::rt::sleep::SharedAsyncSleep; - - #[cfg(feature = "rustls")] - fn base( - settings: &ConnectorSettings, - sleep: Option, - ) -> crate::hyper_ext::Builder { - let mut hyper = crate::hyper_ext::Adapter::builder().connector_settings(settings.clone()); - if let Some(sleep) = sleep { - hyper = hyper.sleep_impl(sleep); - } - hyper - } - - /// Given `ConnectorSettings` and an `SharedAsyncSleep`, create a `DynConnector` from defaults depending on what cargo features are activated. - pub fn default_connector( - settings: &ConnectorSettings, - sleep: Option, - ) -> Option { - #[cfg(feature = "rustls")] - { - tracing::trace!(settings = ?settings, sleep = ?sleep, "creating a new default connector"); - let hyper = base(settings, sleep).build(super::https()); - Some(DynConnector::new(hyper)) - } - #[cfg(not(feature = "rustls"))] - { - tracing::trace!(settings = ?settings, sleep = ?sleep, "no default connector available"); - None - } - } -} -pub use default_connector::default_connector; - -/// Error that indicates a connector is required. -#[non_exhaustive] -#[derive(Debug, Default)] -pub struct ConnectorRequiredError; - -impl std::fmt::Display for ConnectorRequiredError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str("No HTTP connector was available. Enable the `rustls` crate feature or set a connector to fix this.") - } -} - -impl std::error::Error for ConnectorRequiredError {} - -/// Converts an optional connector to a result. -pub fn require_connector( - connector: Option, -) -> Result { - connector.ok_or(ConnectorRequiredError) -} - -#[cfg(feature = "rustls")] -/// Return a default HTTPS connector backed by the `rustls` crate. -/// -/// It requires a minimum TLS version of 1.2. -/// It allows you to connect to both `http` and `https` URLs. -pub fn https() -> Https { - HTTPS_NATIVE_ROOTS.clone() -} - -#[cfg(all(test, feature = "rustls"))] -mod tests { - use crate::erase::DynConnector; - use crate::hyper_ext::Adapter; - use aws_smithy_http::body::SdkBody; - use http::{Method, Request, Uri}; - use tower::{Service, ServiceBuilder}; - - async fn send_request_and_assert_success(conn: DynConnector, uri: &Uri) { - let mut svc = ServiceBuilder::new().service(conn); - let req = Request::builder() - .uri(uri) - .method(Method::GET) - .body(SdkBody::empty()) - .unwrap(); - let res = svc.call(req).await.unwrap(); - assert!(res.status().is_success()); - } - - #[cfg(feature = "rustls")] - mod rustls_tests { - use super::super::https; - use super::*; - - #[tokio::test] - async fn test_rustls_connector_can_make_http_requests() { - let conn = Adapter::builder().build(https()); - let conn = DynConnector::new(conn); - let http_uri: Uri = "http://example.com/".parse().unwrap(); - - send_request_and_assert_success(conn, &http_uri).await; - } - - #[tokio::test] - async fn test_rustls_connector_can_make_https_requests() { - let conn = Adapter::builder().build(https()); - let conn = DynConnector::new(conn); - let https_uri: Uri = "https://example.com/".parse().unwrap(); - - send_request_and_assert_success(conn, &https_uri).await; - } - } -} - -#[cfg(test)] -mod custom_tls_tests { - use crate::erase::DynConnector; - use crate::hyper_ext::Adapter; - use aws_smithy_http::body::SdkBody; - use http::{Method, Request, Uri}; - use tower::{Service, ServiceBuilder}; - - type NativeTls = hyper_tls::HttpsConnector; - - fn native_tls() -> NativeTls { - let mut tls = hyper_tls::native_tls::TlsConnector::builder(); - let tls = tls - .min_protocol_version(Some(hyper_tls::native_tls::Protocol::Tlsv12)) - .build() - .unwrap_or_else(|e| panic!("Error while creating TLS connector: {}", e)); - let mut http = hyper::client::HttpConnector::new(); - http.enforce_http(false); - hyper_tls::HttpsConnector::from((http, tls.into())) - } - - #[tokio::test] - async fn test_native_tls_connector_can_make_http_requests() { - let conn = Adapter::builder().build(native_tls()); - let conn = DynConnector::new(conn); - let http_uri: Uri = "http://example.com/".parse().unwrap(); - - send_request_and_assert_success(conn, &http_uri).await; - } - - #[tokio::test] - async fn test_native_tls_connector_can_make_https_requests() { - let conn = Adapter::builder().build(native_tls()); - let conn = DynConnector::new(conn); - let https_uri: Uri = "https://example.com/".parse().unwrap(); - - send_request_and_assert_success(conn, &https_uri).await; - } - - async fn send_request_and_assert_success(conn: DynConnector, uri: &Uri) { - let mut svc = ServiceBuilder::new().service(conn); - let req = Request::builder() - .uri(uri) - .method(Method::GET) - .body(SdkBody::empty()) - .unwrap(); - let res = svc.call(req).await.unwrap(); - assert!(res.status().is_success()); - } -} diff --git a/rust-runtime/aws-smithy-client/src/erase.rs b/rust-runtime/aws-smithy-client/src/erase.rs deleted file mode 100644 index d966664b3b5..00000000000 --- a/rust-runtime/aws-smithy-client/src/erase.rs +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Type-erased variants of [`Client`] and friends. - -use std::fmt; - -use tower::{Layer, Service, ServiceExt}; - -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use boxclone::*; - -use crate::{bounds, retry, Client}; - -// These types are technically public in that they're reachable from the public trait impls on -// DynMiddleware, but no-one should ever look at them or use them. -#[doc(hidden)] -pub mod boxclone; - -/// A [`Client`] whose connector and middleware types have been erased. -/// -/// Mainly useful if you need to name `R` in a type-erased client. If you do not, you can instead -/// just use `Client` with no type parameters, which ends up being the same type. -pub type DynClient = Client, R>; - -impl Client -where - C: bounds::SmithyConnector, - M: bounds::SmithyMiddleware + Send + Sync + 'static, - R: retry::NewRequestPolicy, -{ - /// Erase the middleware type from the client type signature. - /// - /// This makes the final client type easier to name, at the cost of a marginal increase in - /// runtime performance. See [`DynMiddleware`] for details. - /// - /// In practice, you'll use this method once you've constructed a client to your liking: - /// - /// ```no_run - /// # #[cfg(feature = "https")] - /// # fn not_main() { - /// use aws_smithy_client::{Builder, Client}; - /// struct MyClient { - /// client: Client, - /// } - /// - /// let client = Builder::new() - /// .https() - /// .middleware(tower::layer::util::Identity::new()) - /// .build(); - /// let client = MyClient { client: client.into_dyn_middleware() }; - /// # client.client.check(); - /// # } - pub fn into_dyn_middleware(self) -> Client, R> { - Client { - connector: self.connector, - middleware: DynMiddleware::new(self.middleware), - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } -} - -impl Client -where - C: bounds::SmithyConnector, - M: bounds::SmithyMiddleware + Send + Sync + 'static, - R: retry::NewRequestPolicy, -{ - /// Erase the connector type from the client type signature. - /// - /// This makes the final client type easier to name, at the cost of a marginal increase in - /// runtime performance. See [`DynConnector`] for details. - /// - /// In practice, you'll use this method once you've constructed a client to your liking: - /// - /// ```no_run - /// # #[cfg(feature = "https")] - /// # fn not_main() { - /// # type MyMiddleware = aws_smithy_client::DynMiddleware; - /// use aws_smithy_client::{Builder, Client}; - /// struct MyClient { - /// client: Client, - /// } - /// - /// let client = Builder::new() - /// .https() - /// .middleware(tower::layer::util::Identity::new()) - /// .build(); - /// let client = MyClient { client: client.into_dyn_connector() }; - /// # client.client.check(); - /// # } - pub fn into_dyn_connector(self) -> Client { - Client { - connector: DynConnector::new(self.connector), - middleware: self.middleware, - retry_policy: self.retry_policy, - operation_timeout_config: self.operation_timeout_config, - sleep_impl: self.sleep_impl, - reconnect_mode: self.reconnect_mode, - } - } - - /// Erase the connector and middleware types from the client type signature. - /// - /// This makes the final client type easier to name, at the cost of a marginal increase in - /// runtime performance. See [`DynConnector`] and [`DynMiddleware`] for details. - /// - /// Note that if you're using the standard retry mechanism, [`retry::Standard`], `DynClient` - /// is equivalent to `Client` with no type arguments. - /// - /// In practice, you'll use this method once you've constructed a client to your liking: - /// - /// ```no_run - /// # #[cfg(feature = "https")] - /// # fn not_main() { - /// use aws_smithy_client::{Builder, Client}; - /// struct MyClient { - /// client: aws_smithy_client::Client, - /// } - /// - /// let client = Builder::new() - /// .https() - /// .middleware(tower::layer::util::Identity::new()) - /// .build(); - /// let client = MyClient { client: client.into_dyn() }; - /// # client.client.check(); - /// # } - pub fn into_dyn(self) -> DynClient { - self.into_dyn_connector().into_dyn_middleware() - } -} - -/// A Smithy connector that uses dynamic dispatch. -/// -/// This type allows you to pay a small runtime cost to avoid having to name the exact connector -/// you're using anywhere you want to hold a [`Client`]. Specifically, this will use `Box` to -/// enable dynamic dispatch for every request that goes through the connector, which increases -/// memory pressure and suffers an additional vtable indirection for each request, but is unlikely -/// to matter in all but the highest-performance settings. -#[non_exhaustive] -#[derive(Clone)] -pub struct DynConnector( - BoxCloneService, http::Response, ConnectorError>, -); - -impl fmt::Debug for DynConnector { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("DynConnector").finish() - } -} - -impl DynConnector { - /// Construct a new dynamically-dispatched Smithy middleware. - pub fn new(connector: C) -> Self - where - C: bounds::SmithyConnector + Send + 'static, - E: Into, - { - Self(BoxCloneService::new(connector.map_err(|e| e.into()))) - } - - #[doc(hidden)] - pub fn call_lite( - &mut self, - req: http::Request, - ) -> BoxFuture, Box> - { - let future = Service::call(self, req); - Box::pin(async move { future.await.map_err(|err| Box::new(err) as _) }) - } -} - -impl Service> for DynConnector { - type Response = http::Response; - type Error = ConnectorError; - type Future = BoxFuture; - - fn poll_ready( - &mut self, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll> { - self.0.poll_ready(cx) - } - - fn call(&mut self, req: http::Request) -> Self::Future { - self.0.call(req) - } -} - -/// A Smithy middleware that uses dynamic dispatch. -/// -/// This type allows you to pay a small runtime cost to avoid having to name the exact middleware -/// you're using anywhere you want to hold a [`Client`]. Specifically, this will use `Box` to -/// enable dynamic dispatch for every request that goes through the middleware, which increases -/// memory pressure and suffers an additional vtable indirection for each request, but is unlikely -/// to matter in all but the highest-performance settings. -#[non_exhaustive] -pub struct DynMiddleware( - ArcCloneLayer< - aws_smithy_http_tower::dispatch::DispatchService, - aws_smithy_http::operation::Request, - aws_smithy_http::operation::Response, - aws_smithy_http_tower::SendOperationError, - >, -); - -impl Clone for DynMiddleware { - fn clone(&self) -> Self { - Self(self.0.clone()) - } -} - -impl fmt::Debug for DynMiddleware { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("DynMiddleware").finish() - } -} - -impl DynMiddleware { - /// Construct a new dynamically-dispatched Smithy middleware. - pub fn new + Send + Sync + 'static>(middleware: M) -> Self { - Self(ArcCloneLayer::new(middleware)) - } -} - -impl Layer> for DynMiddleware { - type Service = BoxCloneService< - aws_smithy_http::operation::Request, - aws_smithy_http::operation::Response, - aws_smithy_http_tower::SendOperationError, - >; - - fn layer(&self, inner: aws_smithy_http_tower::dispatch::DispatchService) -> Self::Service { - self.0.layer(inner) - } -} diff --git a/rust-runtime/aws-smithy-client/src/erase/boxclone.rs b/rust-runtime/aws-smithy-client/src/erase/boxclone.rs deleted file mode 100644 index 1604d448b98..00000000000 --- a/rust-runtime/aws-smithy-client/src/erase/boxclone.rs +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// This is an adaptation of tower::util::{BoxLayer, BoxService} that includes Clone and doesn't -// include Sync. - -use std::fmt; -use std::future::Future; -use std::pin::Pin; -use std::sync::Arc; -use std::task::{Context, Poll}; - -use tower::layer::{layer_fn, Layer}; -use tower::Service; - -pub(super) struct ArcCloneLayer { - inner: Arc> + Send + Sync>, -} - -impl Clone for ArcCloneLayer { - fn clone(&self) -> Self { - Self { - inner: self.inner.clone(), - } - } -} - -impl ArcCloneLayer { - /// Create a new [`BoxLayer`]. - pub(crate) fn new(inner_layer: L) -> Self - where - L: Layer + Send + Sync + 'static, - L::Service: Service + Clone + Send + Sync + 'static, - >::Future: Send + 'static, - { - let layer = layer_fn(move |inner: In| { - let out = inner_layer.layer(inner); - BoxCloneService::new(out) - }); - - Self { - inner: Arc::new(layer), - } - } -} - -impl Layer for ArcCloneLayer { - type Service = BoxCloneService; - - fn layer(&self, inner: In) -> Self::Service { - self.inner.layer(inner) - } -} - -impl fmt::Debug for ArcCloneLayer { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("ArcCloneLayer").finish() - } -} - -trait CloneService: Service { - fn clone_box( - &self, - ) -> Box< - dyn CloneService - + Send - + Sync - + 'static, - >; -} - -impl CloneService for T -where - T: Service + Clone + Send + Sync + 'static, -{ - fn clone_box( - &self, - ) -> Box< - dyn CloneService< - Request, - Response = Self::Response, - Error = Self::Error, - Future = Self::Future, - > - + 'static - + Send - + Sync, - > { - Box::new(self.clone()) - } -} - -pub type BoxFuture = Pin> + Send>>; -pub struct BoxCloneService { - inner: Box< - dyn CloneService> - + Send - + Sync - + 'static, - >, -} - -#[derive(Debug, Clone)] -struct Boxed { - inner: S, -} - -impl BoxCloneService { - #[allow(missing_docs)] - pub fn new(inner: S) -> Self - where - S: Service + Send + Sync + 'static + Clone, - S::Future: Send + 'static, - { - let inner = Box::new(Boxed { inner }); - BoxCloneService { inner } - } -} - -impl Clone for BoxCloneService -where - T: 'static, - U: 'static, - E: 'static, -{ - fn clone(&self) -> Self { - Self { - inner: self.inner.clone_box(), - } - } -} - -impl Service for BoxCloneService { - type Response = U; - type Error = E; - type Future = BoxFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, request: T) -> BoxFuture { - self.inner.call(request) - } -} - -impl fmt::Debug for BoxCloneService { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("BoxCloneService").finish() - } -} - -impl Service for Boxed -where - S: Service + 'static, - S::Future: Send + 'static, -{ - type Response = S::Response; - type Error = S::Error; - - #[allow(clippy::type_complexity)] - type Future = Pin> + Send>>; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, request: Request) -> Self::Future { - Box::pin(self.inner.call(request)) - } -} diff --git a/rust-runtime/aws-smithy-client/src/http_connector.rs b/rust-runtime/aws-smithy-client/src/http_connector.rs deleted file mode 100644 index eaac5805c6b..00000000000 --- a/rust-runtime/aws-smithy-client/src/http_connector.rs +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Default connectors based on what TLS features are active. Also contains HTTP-related abstractions -//! that enable passing HTTP connectors around. - -use crate::erase::DynConnector; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -use aws_smithy_types::timeout::TimeoutConfig; -use std::time::Duration; -use std::{fmt::Debug, sync::Arc}; - -/// Type alias for a Connector factory function. -pub type MakeConnectorFn = - dyn Fn(&ConnectorSettings, Option) -> Option + Send + Sync; - -/// Enum for describing the two "kinds" of HTTP Connectors in smithy-rs. -#[derive(Clone)] -pub enum HttpConnector { - /// A `DynConnector` to be used for all requests. - Prebuilt(Option), - /// A factory function that will be used to create new `DynConnector`s whenever one is needed. - ConnectorFn(Arc), -} - -impl Debug for HttpConnector { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::Prebuilt(Some(connector)) => { - write!(f, "Prebuilt({:?})", connector) - } - Self::Prebuilt(None) => { - write!(f, "Prebuilt(None)") - } - Self::ConnectorFn(_) => { - write!(f, "ConnectorFn()") - } - } - } -} - -impl Storable for HttpConnector { - type Storer = StoreReplace; -} - -impl HttpConnector { - /// If `HttpConnector` is `Prebuilt`, return a clone of that connector. - /// If `HttpConnector` is `ConnectorFn`, generate a new connector from settings and return it. - pub fn connector( - &self, - settings: &ConnectorSettings, - sleep: Option, - ) -> Option { - match self { - HttpConnector::Prebuilt(conn) => conn.clone(), - HttpConnector::ConnectorFn(func) => func(settings, sleep), - } - } -} - -/// Builder for [`ConnectorSettings`]. -#[non_exhaustive] -#[derive(Default, Debug)] -pub struct ConnectorSettingsBuilder { - connect_timeout: Option, - read_timeout: Option, -} - -impl ConnectorSettingsBuilder { - /// Creates a new builder. - pub fn new() -> Self { - Default::default() - } - - /// Sets the connect timeout that should be used. - /// - /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. - pub fn connect_timeout(mut self, connect_timeout: Duration) -> Self { - self.connect_timeout = Some(connect_timeout); - self - } - - /// Sets the connect timeout that should be used. - /// - /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. - pub fn set_connect_timeout(&mut self, connect_timeout: Option) -> &mut Self { - self.connect_timeout = connect_timeout; - self - } - - /// Sets the read timeout that should be used. - /// - /// The read timeout is the limit on the amount of time it takes to read the first byte of a response - /// from the time the request is initiated. - pub fn read_timeout(mut self, read_timeout: Duration) -> Self { - self.read_timeout = Some(read_timeout); - self - } - - /// Sets the read timeout that should be used. - /// - /// The read timeout is the limit on the amount of time it takes to read the first byte of a response - /// from the time the request is initiated. - pub fn set_read_timeout(&mut self, read_timeout: Option) -> &mut Self { - self.read_timeout = read_timeout; - self - } - - /// Builds the [`ConnectorSettings`]. - pub fn build(self) -> ConnectorSettings { - ConnectorSettings { - connect_timeout: self.connect_timeout, - read_timeout: self.read_timeout, - } - } -} - -/// Settings for HTTP Connectors -#[non_exhaustive] -#[derive(Clone, Default, Debug)] -pub struct ConnectorSettings { - connect_timeout: Option, - read_timeout: Option, -} - -impl ConnectorSettings { - /// Returns a builder for `ConnectorSettings`. - pub fn builder() -> ConnectorSettingsBuilder { - Default::default() - } - - /// Returns the connect timeout that should be used. - /// - /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. - pub fn connect_timeout(&self) -> Option { - self.connect_timeout - } - - /// Returns the read timeout that should be used. - /// - /// The read timeout is the limit on the amount of time it takes to read the first byte of a response - /// from the time the request is initiated. - pub fn read_timeout(&self) -> Option { - self.read_timeout - } - - // This function may be removed/refactored in the future if other non-timeout - // properties are added to the `ConnectorSettings` struct. - #[doc(hidden)] - pub fn from_timeout_config(timeout_config: &TimeoutConfig) -> Self { - Self { - connect_timeout: timeout_config.connect_timeout(), - read_timeout: timeout_config.read_timeout(), - } - } -} diff --git a/rust-runtime/aws-smithy-client/src/hyper_ext.rs b/rust-runtime/aws-smithy-client/src/hyper_ext.rs deleted file mode 100644 index be1e5679d2a..00000000000 --- a/rust-runtime/aws-smithy-client/src/hyper_ext.rs +++ /dev/null @@ -1,753 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Implementation of [`SmithyConnector`](crate::bounds::SmithyConnector) for Hyper -//! -//! The module provides [`Adapter`] which enables using a [`hyper::Client`] as the connector for a Smithy -//! [`Client`](crate::Client). For most use cases, this shouldn't need to be used directly, but it is -//! available as an option. -//! -//! # Examples -//! -//! ### Construct a Smithy Client with Hyper and Rustls -//! -//! In the basic case, customers should not need to use this module. A default implementation of Hyper -//! with `rustls` will be constructed during client creation. However, if you are creating a Smithy -//! [`Client`](crate::Client), directly, use the `dyn_https_https()` method to match that default behavior: -//! -#![cfg_attr( - not(all(feature = "rustls", feature = "client-hyper")), - doc = "```no_run,ignore" -)] -#![cfg_attr(all(feature = "rustls", feature = "client-hyper"), doc = "```no_run")] -//! use aws_smithy_client::Client; -//! -//! let client = Client::builder() -//! .dyn_https_connector(Default::default()) -//! .middleware( -//! // Replace this with your middleware type -//! tower::layer::util::Identity::default() -//! ) -//! .build(); -//! ``` -//! -//! ### Use a Hyper client that uses WebPKI roots -//! -//! A use case for where you may want to use the [`Adapter`] is when settings Hyper client settings -//! that aren't otherwise exposed by the `Client` builder interface. -//! -#![cfg_attr( - not(all(feature = "rustls", feature = "client-hyper")), - doc = "```no_run,ignore" -)] -#![cfg_attr( - all( - feature = "rustls", - feature = "client-hyper", - feature = "hyper-webpki-doctest-only" - ), - doc = "```no_run" -)] -//! use std::time::Duration; -//! use aws_smithy_client::{Client, conns, hyper_ext}; -//! use aws_smithy_client::erase::DynConnector; -//! use aws_smithy_client::http_connector::ConnectorSettings; -//! -//! let https_connector = hyper_rustls::HttpsConnectorBuilder::new() -//! .with_webpki_roots() -//! .https_only() -//! .enable_http1() -//! .enable_http2() -//! .build(); -//! let smithy_connector = hyper_ext::Adapter::builder() -//! // Optionally set things like timeouts as well -//! .connector_settings( -//! ConnectorSettings::builder() -//! .connect_timeout(Duration::from_secs(5)) -//! .build() -//! ) -//! .build(https_connector); -//! -//! // Once you have a Smithy connector, use it to construct a Smithy client: -//! let client = Client::builder() -//! .connector(smithy_connector) -//! .middleware(tower::layer::util::Identity::default()) -//! .build(); -//! ``` - -use crate::http_connector::ConnectorSettings; -use crate::hyper_ext::timeout_middleware::{ConnectTimeout, HttpReadTimeout, HttpTimeoutError}; -use crate::never::stream::EmptyStream; -use aws_smithy_async::future::timeout::TimedOutError; -use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep}; -use aws_smithy_http::body::SdkBody; - -use aws_smithy_http::result::ConnectorError; -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_smithy_types::retry::ErrorKind; -use http::{Extensions, Uri}; -use hyper::client::connect::{ - capture_connection, CaptureConnection, Connected, Connection, HttpInfo, -}; - -use std::error::Error; -use std::fmt::Debug; - -use crate::erase::boxclone::BoxFuture; -use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; -use tokio::io::{AsyncRead, AsyncWrite}; -use tower::{BoxError, Service}; - -/// Adapter from a [`hyper::Client`](hyper::Client) to a connector usable by a Smithy [`Client`](crate::Client). -/// -/// This adapter also enables TCP `CONNECT` and HTTP `READ` timeouts via [`Adapter::builder`]. For examples -/// see [the module documentation](crate::hyper_ext). -#[derive(Clone, Debug)] -pub struct Adapter { - client: HttpReadTimeout, SdkBody>>, -} - -/// Extract a smithy connection from a hyper CaptureConnection -fn extract_smithy_connection(capture_conn: &CaptureConnection) -> Option { - let capture_conn = capture_conn.clone(); - if let Some(conn) = capture_conn.clone().connection_metadata().as_ref() { - let mut extensions = Extensions::new(); - conn.get_extras(&mut extensions); - let http_info = extensions.get::(); - let smithy_connection = ConnectionMetadata::new( - conn.is_proxied(), - http_info.map(|info| info.remote_addr()), - move || match capture_conn.connection_metadata().as_ref() { - Some(conn) => conn.poison(), - None => tracing::trace!("no connection existed to poison"), - }, - ); - Some(smithy_connection) - } else { - None - } -} - -impl Service> for Adapter -where - C: Clone + Send + Sync + 'static, - C: Service, - C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, - C::Future: Unpin + Send + 'static, - C::Error: Into, -{ - type Response = http::Response; - type Error = ConnectorError; - - type Future = BoxFuture; - - fn poll_ready( - &mut self, - cx: &mut std::task::Context<'_>, - ) -> std::task::Poll> { - self.client.poll_ready(cx).map_err(downcast_error) - } - - fn call(&mut self, mut req: http::Request) -> Self::Future { - let capture_connection = capture_connection(&mut req); - if let Some(capture_smithy_connection) = req.extensions().get::() { - capture_smithy_connection - .set_connection_retriever(move || extract_smithy_connection(&capture_connection)); - } - let fut = self.client.call(req); - Box::pin(async move { Ok(fut.await.map_err(downcast_error)?.map(SdkBody::from)) }) - } -} - -impl Adapter<()> { - /// Builder for a Hyper Adapter - /// - /// Generally, end users should not need to construct an [`Adapter`] manually: a hyper adapter - /// will be constructed automatically during client creation. - pub fn builder() -> Builder { - Builder::default() - } -} - -/// Downcast errors coming out of hyper into an appropriate `ConnectorError` -fn downcast_error(err: BoxError) -> ConnectorError { - // is a `TimedOutError` (from aws_smithy_async::timeout) in the chain? if it is, this is a timeout - if find_source::(err.as_ref()).is_some() { - return ConnectorError::timeout(err); - } - // is the top of chain error actually already a `ConnectorError`? return that directly - let err = match err.downcast::() { - Ok(connector_error) => return *connector_error, - Err(box_error) => box_error, - }; - // generally, the top of chain will probably be a hyper error. Go through a set of hyper specific - // error classifications - let err = match err.downcast::() { - Ok(hyper_error) => return to_connector_error(*hyper_error), - Err(box_error) => box_error, - }; - - // otherwise, we have no idea! - ConnectorError::other(err, None) -} - -/// Convert a [`hyper::Error`] into a [`ConnectorError`] -fn to_connector_error(err: hyper::Error) -> ConnectorError { - if err.is_timeout() || find_source::(&err).is_some() { - ConnectorError::timeout(err.into()) - } else if err.is_user() { - ConnectorError::user(err.into()) - } else if err.is_closed() || err.is_canceled() || find_source::(&err).is_some() - { - ConnectorError::io(err.into()) - } - // We sometimes receive this from S3: hyper::Error(IncompleteMessage) - else if err.is_incomplete_message() { - ConnectorError::other(err.into(), Some(ErrorKind::TransientError)) - } else { - tracing::warn!(err = %DisplayErrorContext(&err), "unrecognized error from Hyper. If this error should be retried, please file an issue."); - ConnectorError::other(err.into(), None) - } -} - -fn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option<&'a E> { - let mut next = Some(err); - while let Some(err) = next { - if let Some(matching_err) = err.downcast_ref::() { - return Some(matching_err); - } - next = err.source(); - } - None -} - -/// Builder for [`hyper_ext::Adapter`](Adapter) -/// -/// Unlike a Smithy client, the [`Service`] inside a [`hyper_ext::Adapter`](Adapter) is actually a service that -/// accepts a `Uri` and returns a TCP stream. One default implementation of this is provided, -/// that encrypts the stream with `rustls`. -/// -/// # Examples -/// Construct a HyperAdapter with the default HTTP implementation (rustls). This can be useful when you want to share a Hyper connector -/// between multiple Smithy clients. -/// -#[cfg_attr( - not(all(feature = "rustls", feature = "client-hyper")), - doc = "```no_run,ignore" -)] -#[cfg_attr(all(feature = "rustls", feature = "client-hyper"), doc = "```no_run")] -/// use tower::layer::util::Identity; -/// use aws_smithy_client::{conns, hyper_ext}; -/// use aws_smithy_client::erase::DynConnector; -/// -/// let hyper_connector = hyper_ext::Adapter::builder().build(conns::https()); -/// // this client can then be used when constructing a Smithy Client -/// // Replace `Identity` with your middleware implementation: -/// let client = aws_smithy_client::Client::::new(DynConnector::new(hyper_connector)); -/// ``` -#[derive(Default, Debug)] -pub struct Builder { - connector_settings: Option, - sleep_impl: Option, - client_builder: Option, -} - -impl Builder { - /// Create a HyperAdapter from this builder and a given connector - pub fn build(self, connector: C) -> Adapter - where - C: Clone + Send + Sync + 'static, - C: Service, - C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, - C::Future: Unpin + Send + 'static, - C::Error: Into, - { - let client_builder = self.client_builder.unwrap_or_default(); - let sleep_impl = self.sleep_impl.or_else(default_async_sleep); - let (connect_timeout, read_timeout) = self - .connector_settings - .map(|c| (c.connect_timeout(), c.read_timeout())) - .unwrap_or((None, None)); - - // if we are using Hyper, Tokio must already be enabled so we can fallback to Tokio. - let connector = match connect_timeout { - Some(duration) => ConnectTimeout::new( - connector, - sleep_impl - .clone() - .expect("a sleep impl must be provided in order to have a connect timeout"), - duration, - ), - None => ConnectTimeout::no_timeout(connector), - }; - let base = client_builder.build(connector); - let read_timeout = match read_timeout { - Some(duration) => HttpReadTimeout::new( - base, - sleep_impl.expect("a sleep impl must be provided in order to have a read timeout"), - duration, - ), - None => HttpReadTimeout::no_timeout(base), - }; - Adapter { - client: read_timeout, - } - } - - /// Set the async sleep implementation used for timeouts - /// - /// Calling this is only necessary for testing or to use something other than - /// [`default_async_sleep`]. - pub fn sleep_impl(mut self, sleep_impl: SharedAsyncSleep) -> Self { - self.sleep_impl = Some(sleep_impl); - self - } - - /// Set the async sleep implementation used for timeouts - /// - /// Calling this is only necessary for testing or to use something other than - /// [`default_async_sleep`]. - pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { - self.sleep_impl = sleep_impl; - self - } - - /// Configure the HTTP settings for the `HyperAdapter` - pub fn connector_settings(mut self, connector_settings: ConnectorSettings) -> Self { - self.connector_settings = Some(connector_settings); - self - } - - /// Configure the HTTP settings for the `HyperAdapter` - pub fn set_connector_settings( - &mut self, - connector_settings: Option, - ) -> &mut Self { - self.connector_settings = connector_settings; - self - } - - /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. - /// - /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. - pub fn hyper_builder(mut self, hyper_builder: hyper::client::Builder) -> Self { - self.client_builder = Some(hyper_builder); - self - } - - /// Override the Hyper client [`Builder`](hyper::client::Builder) used to construct this client. - /// - /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. - pub fn set_hyper_builder( - &mut self, - hyper_builder: Option, - ) -> &mut Self { - self.client_builder = hyper_builder; - self - } -} - -mod timeout_middleware { - use std::error::Error; - use std::fmt::Formatter; - use std::future::Future; - use std::pin::Pin; - use std::task::{Context, Poll}; - use std::time::Duration; - - use http::Uri; - use pin_project_lite::pin_project; - use tower::BoxError; - - use aws_smithy_async::future::timeout::{TimedOutError, Timeout}; - use aws_smithy_async::rt::sleep::Sleep; - use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; - - #[derive(Debug)] - pub(crate) struct HttpTimeoutError { - kind: &'static str, - duration: Duration, - } - - impl std::fmt::Display for HttpTimeoutError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!( - f, - "{} timeout occurred after {:?}", - self.kind, self.duration - ) - } - } - - impl Error for HttpTimeoutError { - // We implement the `source` function as returning a `TimedOutError` because when `downcast_error` - // or `find_source` is called with an `HttpTimeoutError` (or another error wrapping an `HttpTimeoutError`) - // this method will be checked to determine if it's a timeout-related error. - fn source(&self) -> Option<&(dyn Error + 'static)> { - Some(&TimedOutError) - } - } - - /// Timeout wrapper that will timeout on the initial TCP connection - /// - /// # Stability - /// This interface is unstable. - #[derive(Clone, Debug)] - pub(super) struct ConnectTimeout { - inner: I, - timeout: Option<(SharedAsyncSleep, Duration)>, - } - - impl ConnectTimeout { - /// Create a new `ConnectTimeout` around `inner`. - /// - /// Typically, `I` will implement [`hyper::client::connect::Connect`]. - pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { - Self { - inner, - timeout: Some((sleep, timeout)), - } - } - - pub(crate) fn no_timeout(inner: I) -> Self { - Self { - inner, - timeout: None, - } - } - } - - #[derive(Clone, Debug)] - pub(crate) struct HttpReadTimeout { - inner: I, - timeout: Option<(SharedAsyncSleep, Duration)>, - } - - impl HttpReadTimeout { - /// Create a new `HttpReadTimeout` around `inner`. - /// - /// Typically, `I` will implement [`tower::Service>`]. - pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { - Self { - inner, - timeout: Some((sleep, timeout)), - } - } - - pub(crate) fn no_timeout(inner: I) -> Self { - Self { - inner, - timeout: None, - } - } - } - - pin_project! { - /// Timeout future for Tower services - /// - /// Timeout future to handle timing out, mapping errors, and the possibility of not timing out - /// without incurring an additional allocation for each timeout layer. - #[project = MaybeTimeoutFutureProj] - pub enum MaybeTimeoutFuture { - Timeout { - #[pin] - timeout: Timeout, - error_type: &'static str, - duration: Duration, - }, - NoTimeout { - #[pin] - future: F - } - } - } - - impl Future for MaybeTimeoutFuture - where - F: Future>, - E: Into, - { - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let (timeout_future, kind, &mut duration) = match self.project() { - MaybeTimeoutFutureProj::NoTimeout { future } => { - return future.poll(cx).map_err(|err| err.into()); - } - MaybeTimeoutFutureProj::Timeout { - timeout, - error_type, - duration, - } => (timeout, error_type, duration), - }; - match timeout_future.poll(cx) { - Poll::Ready(Ok(response)) => Poll::Ready(response.map_err(|err| err.into())), - Poll::Ready(Err(_timeout)) => { - Poll::Ready(Err(HttpTimeoutError { kind, duration }.into())) - } - Poll::Pending => Poll::Pending, - } - } - } - - impl tower::Service for ConnectTimeout - where - I: tower::Service, - I::Error: Into, - { - type Response = I::Response; - type Error = BoxError; - type Future = MaybeTimeoutFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx).map_err(|err| err.into()) - } - - fn call(&mut self, req: Uri) -> Self::Future { - match &self.timeout { - Some((sleep, duration)) => { - let sleep = sleep.sleep(*duration); - MaybeTimeoutFuture::Timeout { - timeout: Timeout::new(self.inner.call(req), sleep), - error_type: "HTTP connect", - duration: *duration, - } - } - None => MaybeTimeoutFuture::NoTimeout { - future: self.inner.call(req), - }, - } - } - } - - impl tower::Service> for HttpReadTimeout - where - I: tower::Service, Error = hyper::Error>, - { - type Response = I::Response; - type Error = BoxError; - type Future = MaybeTimeoutFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx).map_err(|err| err.into()) - } - - fn call(&mut self, req: http::Request) -> Self::Future { - match &self.timeout { - Some((sleep, duration)) => { - let sleep = sleep.sleep(*duration); - MaybeTimeoutFuture::Timeout { - timeout: Timeout::new(self.inner.call(req), sleep), - error_type: "HTTP read", - duration: *duration, - } - } - None => MaybeTimeoutFuture::NoTimeout { - future: self.inner.call(req), - }, - } - } - } - - #[cfg(test)] - mod test { - use crate::http_connector::ConnectorSettings; - use crate::hyper_ext::Adapter; - use crate::never::{NeverConnected, NeverReplies}; - use aws_smithy_async::assert_elapsed; - use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_types::error::display::DisplayErrorContext; - use aws_smithy_types::timeout::TimeoutConfig; - use std::time::Duration; - use tower::Service; - - #[allow(unused)] - fn connect_timeout_is_correct() { - is_send_sync::>(); - } - - #[allow(unused)] - fn is_send_sync() {} - - #[tokio::test] - async fn http_connect_timeout_works() { - let inner = NeverConnected::new(); - let connector_settings = ConnectorSettings::from_timeout_config( - &TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .build(), - ); - let mut hyper = Adapter::builder() - .connector_settings(connector_settings) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .build(inner); - let now = tokio::time::Instant::now(); - tokio::time::pause(); - let resp = hyper - .call( - http::Request::builder() - .uri("http://foo.com") - .body(SdkBody::empty()) - .unwrap(), - ) - .await - .unwrap_err(); - assert!( - resp.is_timeout(), - "expected resp.is_timeout() to be true but it was false, resp == {:?}", - resp - ); - let message = DisplayErrorContext(&resp).to_string(); - let expected = - "timeout: error trying to connect: HTTP connect timeout occurred after 1s"; - assert!( - message.contains(expected), - "expected '{message}' to contain '{expected}'" - ); - assert_elapsed!(now, Duration::from_secs(1)); - } - - #[tokio::test] - async fn http_read_timeout_works() { - let inner = NeverReplies::new(); - let connector_settings = ConnectorSettings::from_timeout_config( - &TimeoutConfig::builder() - .connect_timeout(Duration::from_secs(1)) - .read_timeout(Duration::from_secs(2)) - .build(), - ); - let mut hyper = Adapter::builder() - .connector_settings(connector_settings) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .build(inner); - let now = tokio::time::Instant::now(); - tokio::time::pause(); - let resp = hyper - .call( - http::Request::builder() - .uri("http://foo.com") - .body(SdkBody::empty()) - .unwrap(), - ) - .await - .unwrap_err(); - assert!( - resp.is_timeout(), - "expected resp.is_timeout() to be true but it was false, resp == {:?}", - resp - ); - let message = format!("{}", DisplayErrorContext(&resp)); - let expected = "timeout: HTTP read timeout occurred after 2s"; - assert!( - message.contains(expected), - "expected '{message}' to contain '{expected}'" - ); - assert_elapsed!(now, Duration::from_secs(2)); - } - } -} - -/// Make `EmptyStream` compatible with Hyper -impl Connection for EmptyStream { - fn connected(&self) -> Connected { - Connected::new() - } -} - -#[cfg(test)] -mod test { - use crate::hyper_ext::Adapter; - use aws_smithy_http::body::SdkBody; - use http::Uri; - use hyper::client::connect::{Connected, Connection}; - use std::io::{Error, ErrorKind}; - use std::pin::Pin; - use std::task::{Context, Poll}; - use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; - use tower::BoxError; - - #[tokio::test] - async fn hyper_io_error() { - let connector = TestConnection { - inner: HangupStream, - }; - let mut adapter = Adapter::builder().build(connector); - use tower::Service; - let err = adapter - .call( - http::Request::builder() - .uri("http://amazon.com") - .body(SdkBody::empty()) - .unwrap(), - ) - .await - .expect_err("socket hangup"); - assert!(err.is_io(), "{:?}", err); - } - - // ---- machinery to make a Hyper connector that responds with an IO Error - #[derive(Clone)] - struct HangupStream; - - impl Connection for HangupStream { - fn connected(&self) -> Connected { - Connected::new() - } - } - - impl AsyncRead for HangupStream { - fn poll_read( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &mut ReadBuf<'_>, - ) -> Poll> { - Poll::Ready(Err(Error::new( - ErrorKind::ConnectionReset, - "connection reset", - ))) - } - } - - impl AsyncWrite for HangupStream { - fn poll_write( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &[u8], - ) -> Poll> { - Poll::Pending - } - - fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Pending - } - - fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Pending - } - } - - #[derive(Clone)] - struct TestConnection { - inner: T, - } - - impl tower::Service for TestConnection - where - T: Clone + Connection, - { - type Response = T; - type Error = BoxError; - type Future = std::future::Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, _req: Uri) -> Self::Future { - std::future::ready(Ok(self.inner.clone())) - } - } -} diff --git a/rust-runtime/aws-smithy-client/src/lib.rs b/rust-runtime/aws-smithy-client/src/lib.rs index 935dddd2f0c..32e46abdb4b 100644 --- a/rust-runtime/aws-smithy-client/src/lib.rs +++ b/rust-runtime/aws-smithy-client/src/lib.rs @@ -3,260 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! A Hyper-based Smithy service client. -//! -//! | Feature | Description | -//! |-------------------|-------------| -//! | `event-stream` | Provides Sender/Receiver implementations for Event Stream codegen. | -//! | `rt-tokio` | Run async code with the `tokio` runtime | -//! | `test-util` | Include various testing utils | -//! | `rustls` | Use `rustls` as the HTTP client's TLS implementation | -//! | `client-hyper` | Use `hyper` to handle HTTP requests | +//! This crate is no longer used by smithy-rs and is deprecated. -#![allow(clippy::derive_partial_eq_without_eq)] #![warn( missing_docs, rustdoc::missing_crate_level_docs, unreachable_pub, rust_2018_idioms )] - -pub mod bounds; -pub mod erase; -pub mod http_connector; -pub mod never; -mod poison; -pub mod retry; -pub mod timeout; - -// https://github.com/rust-lang/rust/issues/72081 -#[allow(rustdoc::private_doc_tests)] -mod builder; -pub use builder::Builder; - -#[cfg(feature = "test-util")] -pub mod dvr; -#[cfg(feature = "test-util")] -pub mod test_connection; - -#[cfg(feature = "client-hyper")] -pub mod conns; -#[cfg(feature = "client-hyper")] -pub mod hyper_ext; - -// The types in this module are only used to write the bounds in [`Client::check`]. Customers will -// not need them. But the module and its types must be public so that we can call `check` from -// doc-tests. -#[doc(hidden)] -pub mod static_tests; - -use crate::poison::PoisonLayer; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; - -use aws_smithy_http::operation::Operation; -use aws_smithy_http::response::ParseHttpResponse; -pub use aws_smithy_http::result::{SdkError, SdkSuccess}; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_http_tower::dispatch::DispatchLayer; -use aws_smithy_http_tower::parse_response::ParseResponseLayer; -use aws_smithy_types::error::display::DisplayErrorContext; -use aws_smithy_types::retry::{ProvideErrorKind, ReconnectMode}; -use aws_smithy_types::timeout::OperationTimeoutConfig; -use timeout::ClientTimeoutParams; -pub use timeout::TimeoutLayer; -use tower::{Service, ServiceBuilder, ServiceExt}; -use tracing::{debug_span, field, Instrument}; - -/// Smithy service client. -/// -/// The service client is customizable in a number of ways (see [`Builder`]), but most customers -/// can stick with the standard constructor provided by [`Client::new`]. It takes only a single -/// argument, which is the middleware that fills out the [`http::Request`] for each higher-level -/// operation so that it can ultimately be sent to the remote host. The middleware is responsible -/// for filling in any request parameters that aren't specified by the Smithy protocol definition, -/// such as those used for routing (like the URL), authentication, and authorization. -/// -/// The middleware takes the form of a [`tower::Layer`] that wraps the actual connection for each -/// request. The [`tower::Service`](Service) that the middleware produces must accept requests of the type -/// [`aws_smithy_http::operation::Request`] and return responses of the type -/// [`http::Response`], most likely by modifying the provided request in place, passing it -/// to the inner service, and then ultimately returning the inner service's response. -/// -/// With the `hyper` feature enabled, you can construct a `Client` directly from a -/// `hyper::Client` using `hyper_ext::Adapter::builder`. You can also enable the `rustls` -/// feature to construct a Client against a standard HTTPS endpoint using `Builder::rustls_connector`. -#[derive(Debug)] -pub struct Client< - Connector = erase::DynConnector, - Middleware = erase::DynMiddleware, - RetryPolicy = retry::Standard, -> { - connector: Connector, - middleware: Middleware, - retry_policy: RetryPolicy, - reconnect_mode: ReconnectMode, - operation_timeout_config: OperationTimeoutConfig, - sleep_impl: Option, -} - -impl Client<(), (), ()> { - /// Returns a client builder - pub fn builder() -> Builder { - Builder::new() - } -} - -// Quick-create for people who just want "the default". -impl Client -where - M: Default, -{ - /// Create a Smithy client from the given `connector`, a middleware default, the - /// [standard retry policy](retry::Standard), and the - /// [`default_async_sleep`](aws_smithy_async::rt::sleep::default_async_sleep) sleep implementation. - pub fn new(connector: C) -> Self { - Builder::new() - .connector(connector) - .middleware(M::default()) - .build() - } -} - -fn check_send_sync(t: T) -> T { - t -} - -impl Client -where - C: bounds::SmithyConnector, - M: bounds::SmithyMiddleware, - R: retry::NewRequestPolicy, -{ - /// Dispatch this request to the network - /// - /// For ergonomics, this does not include the raw response for successful responses. To - /// access the raw response use `call_raw`. - pub async fn call(&self, op: Operation) -> Result> - where - O: Send + Sync, - E: std::error::Error + Send + Sync + 'static, - Retry: Send + Sync, - R::Policy: bounds::SmithyRetryPolicy, - Retry: ClassifyRetry, SdkError>, - bounds::Parsed<>::Service, O, Retry>: - Service, Response = SdkSuccess, Error = SdkError> + Clone, - { - self.call_raw(op).await.map(|res| res.parsed) - } - - /// Dispatch this request to the network - /// - /// The returned result contains the raw HTTP response which can be useful for debugging or - /// implementing unsupported features. - pub async fn call_raw( - &self, - op: Operation, - ) -> Result, SdkError> - where - O: Send + Sync, - E: std::error::Error + Send + Sync + 'static, - Retry: Send + Sync, - R::Policy: bounds::SmithyRetryPolicy, - Retry: ClassifyRetry, SdkError>, - // This bound is not _technically_ inferred by all the previous bounds, but in practice it - // is because _we_ know that there is only implementation of Service for Parsed - // (ParsedResponseService), and it will apply as long as the bounds on C, M, and R hold, - // and will produce (as expected) Response = SdkSuccess, Error = SdkError. But Rust - // doesn't know that -- there _could_ theoretically be other implementations of Service for - // Parsed that don't return those same types. So, we must give the bound. - bounds::Parsed<>::Service, O, Retry>: - Service, Response = SdkSuccess, Error = SdkError> + Clone, - { - let connector = self.connector.clone(); - - let timeout_params = - ClientTimeoutParams::new(&self.operation_timeout_config, self.sleep_impl.clone()); - - let svc = ServiceBuilder::new() - .layer(TimeoutLayer::new(timeout_params.operation_timeout)) - .retry( - self.retry_policy - .new_request_policy(self.sleep_impl.clone()), - ) - .layer(PoisonLayer::new(self.reconnect_mode)) - .layer(TimeoutLayer::new(timeout_params.operation_attempt_timeout)) - .layer(ParseResponseLayer::::new()) - // These layers can be considered as occurring in order. That is, first invoke the - // customer-provided middleware, then dispatch dispatch over the wire. - .layer(&self.middleware) - .layer(DispatchLayer::new()) - .service(connector); - - // send_operation records the full request-response lifecycle. - // NOTE: For operations that stream output, only the setup is captured in this span. - let span = debug_span!( - "send_operation", - operation = field::Empty, - service = field::Empty, - status = field::Empty, - message = field::Empty - ); - let (mut req, parts) = op.into_request_response(); - if let Some(metadata) = &parts.metadata { - // Clippy has a bug related to needless borrows so we need to allow them here - // https://github.com/rust-lang/rust-clippy/issues/9782 - #[allow(clippy::needless_borrow)] - { - span.record("operation", &metadata.name()); - span.record("service", &metadata.service()); - } - // This will clone two `Cow::<&'static str>::Borrow`s in the vast majority of cases - req.properties_mut().insert(metadata.clone()); - } - let op = Operation::from_parts(req, parts); - - let result = async move { check_send_sync(svc).ready().await?.call(op).await } - .instrument(span.clone()) - .await; - #[allow(clippy::needless_borrow)] - match &result { - Ok(_) => { - span.record("status", &"ok"); - } - Err(err) => { - span.record( - "status", - &match err { - SdkError::ConstructionFailure(_) => "construction_failure", - SdkError::DispatchFailure(_) => "dispatch_failure", - SdkError::ResponseError(_) => "response_error", - SdkError::ServiceError(_) => "service_error", - SdkError::TimeoutError(_) => "timeout_error", - _ => "error", - }, - ) - .record("message", &field::display(DisplayErrorContext(err))); - } - } - result - } - - /// Statically check the validity of a `Client` without a request to send. - /// - /// This will make sure that all the bounds hold that would be required by `call` and - /// `call_raw` (modulo those that relate to the specific `Operation` type). Comes in handy to - /// ensure (statically) that all the various constructors actually produce "useful" types. - #[doc(hidden)] - pub fn check(&self) - where - R::Policy: tower::retry::Policy< - static_tests::ValidTestOperation, - SdkSuccess<()>, - SdkError, - > + Clone, - { - let _ = |o: static_tests::ValidTestOperation| { - drop(self.call_raw(o)); - }; - } -} diff --git a/rust-runtime/aws-smithy-client/src/never.rs b/rust-runtime/aws-smithy-client/src/never.rs deleted file mode 100644 index b6dcc07ea20..00000000000 --- a/rust-runtime/aws-smithy-client/src/never.rs +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Test connectors that never return data - -use std::marker::PhantomData; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; -use std::task::{Context, Poll}; - -use http::Uri; -use tower::BoxError; - -use aws_smithy_async::future::never::Never; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; - -use crate::erase::boxclone::BoxFuture; - -/// A service that will never return whatever it is you want -/// -/// Returned futures will return Pending forever -#[non_exhaustive] -#[derive(Debug)] -pub struct NeverService { - _resp: PhantomData<(Req, Resp, Err)>, - invocations: Arc, -} - -impl Clone for NeverService { - fn clone(&self) -> Self { - Self { - _resp: Default::default(), - invocations: self.invocations.clone(), - } - } -} - -impl Default for NeverService { - fn default() -> Self { - Self::new() - } -} - -impl NeverService { - /// Create a new NeverService - pub fn new() -> Self { - NeverService { - _resp: Default::default(), - invocations: Default::default(), - } - } - - /// Returns the number of invocations made to this service - pub fn num_calls(&self) -> usize { - self.invocations.load(Ordering::SeqCst) - } -} - -/// A Connector that can be use with [`Client`](crate::Client) that never returns a response. -pub type NeverConnector = - NeverService, http::Response, ConnectorError>; - -/// A service where the underlying TCP connection never connects. -pub type NeverConnected = NeverService; - -/// Streams that never return data -pub(crate) mod stream { - use std::io::Error; - use std::pin::Pin; - use std::task::{Context, Poll}; - - use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; - - /// A stream that will never return or accept any data - #[non_exhaustive] - #[derive(Debug, Default)] - pub struct EmptyStream; - - impl EmptyStream { - pub fn new() -> Self { - Self - } - } - - impl AsyncRead for EmptyStream { - fn poll_read( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &mut ReadBuf<'_>, - ) -> Poll> { - Poll::Pending - } - } - - impl AsyncWrite for EmptyStream { - fn poll_write( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - _buf: &[u8], - ) -> Poll> { - Poll::Pending - } - - fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Pending - } - - fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { - Poll::Pending - } - } -} - -/// A service that will connect but never send any data -#[derive(Clone, Debug, Default)] -pub struct NeverReplies; -impl NeverReplies { - /// Create a new NeverReplies service - pub fn new() -> Self { - Self - } -} - -impl tower::Service for NeverReplies { - type Response = stream::EmptyStream; - type Error = BoxError; - type Future = std::future::Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, _req: Uri) -> Self::Future { - std::future::ready(Ok(stream::EmptyStream::new())) - } -} - -impl tower::Service for NeverService { - type Response = Resp; - type Error = Err; - type Future = BoxFuture; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, _req: Req) -> Self::Future { - self.invocations.fetch_add(1, Ordering::SeqCst); - Box::pin(async move { - Never::new().await; - unreachable!() - }) - } -} diff --git a/rust-runtime/aws-smithy-client/src/poison.rs b/rust-runtime/aws-smithy-client/src/poison.rs deleted file mode 100644 index ffbaaf8abc1..00000000000 --- a/rust-runtime/aws-smithy-client/src/poison.rs +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Connection Poisoning -//! -//! The client supports behavior where on transient errors (e.g. timeouts, 503, etc.) it will ensure -//! that the offending connection is not reused. This happens to ensure that in the case where the -//! connection itself is broken (e.g. connected to a bad host) we don't reuse it for other requests. -//! -//! This relies on a series of mechanisms: -//! 1. [`CaptureSmithyConnection`] is a container which exists in the operation property bag. It is -//! inserted by this layer before the request is sent. -//! 2. The [`DispatchLayer`](aws_smithy_http_tower::dispatch::DispatchLayer) copies the field from operation extensions HTTP request extensions. -//! 3. The HTTP layer (e.g. Hyper) sets [`ConnectionMetadata`](aws_smithy_http::connection::ConnectionMetadata) -//! when it is available. -//! 4. When the response comes back, if indicated, this layer invokes -//! [`ConnectionMetadata::poison`](aws_smithy_http::connection::ConnectionMetadata::poison). -//! -//! ### Why isn't this integrated into `retry.rs`? -//! If the request has a streaming body, we won't attempt to retry because [`Operation::try_clone()`] will -//! return `None`. Therefore, we need to handle this inside of the retry loop. - -use std::future::Future; - -use aws_smithy_http::operation::Operation; -use aws_smithy_http::result::{SdkError, SdkSuccess}; -use aws_smithy_http::retry::ClassifyRetry; - -use aws_smithy_http::connection::CaptureSmithyConnection; -use aws_smithy_types::retry::{ErrorKind, ReconnectMode, RetryKind}; -use pin_project_lite::pin_project; -use std::marker::PhantomData; -use std::pin::Pin; -use std::task::{Context, Poll}; - -/// PoisonLayer that poisons connections depending on the error kind -pub(crate) struct PoisonLayer { - inner: PhantomData, - mode: ReconnectMode, -} - -impl PoisonLayer { - pub(crate) fn new(mode: ReconnectMode) -> Self { - Self { - inner: Default::default(), - mode, - } - } -} - -impl Clone for PoisonLayer { - fn clone(&self) -> Self { - Self { - inner: Default::default(), - mode: self.mode, - } - } -} - -impl tower::Layer for PoisonLayer { - type Service = PoisonService; - - fn layer(&self, inner: S) -> Self::Service { - PoisonService { - inner, - mode: self.mode, - } - } -} - -#[derive(Clone)] -pub(crate) struct PoisonService { - inner: S, - mode: ReconnectMode, -} - -impl tower::Service> for PoisonService -where - R: ClassifyRetry, SdkError>, - S: tower::Service, Response = SdkSuccess, Error = SdkError>, -{ - type Response = S::Response; - type Error = S::Error; - type Future = PoisonServiceFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, mut req: Operation) -> Self::Future { - let classifier = req.retry_classifier().clone(); - let capture_smithy_connection = CaptureSmithyConnection::new(); - req.properties_mut() - .insert(capture_smithy_connection.clone()); - PoisonServiceFuture { - inner: self.inner.call(req), - conn: capture_smithy_connection, - mode: self.mode, - classifier, - } - } -} - -pin_project! { - pub struct PoisonServiceFuture { - #[pin] - inner: F, - classifier: R, - conn: CaptureSmithyConnection, - mode: ReconnectMode - } -} - -impl Future for PoisonServiceFuture -where - F: Future, SdkError>>, - R: ClassifyRetry, SdkError>, -{ - type Output = F::Output; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let this = self.project(); - match this.inner.poll(cx) { - Poll::Ready(resp) => { - let retry_kind = this.classifier.classify_retry(resp.as_ref()); - if this.mode == &ReconnectMode::ReconnectOnTransientError - && retry_kind == RetryKind::Error(ErrorKind::TransientError) - { - if let Some(smithy_conn) = this.conn.get() { - tracing::info!("poisoning connection: {:?}", smithy_conn); - smithy_conn.poison(); - } else { - tracing::trace!("No smithy connection found! The underlying HTTP connection never set a connection."); - } - } - Poll::Ready(resp) - } - Poll::Pending => Poll::Pending, - } - } -} diff --git a/rust-runtime/aws-smithy-client/src/retry.rs b/rust-runtime/aws-smithy-client/src/retry.rs deleted file mode 100644 index 8c2fdc246c3..00000000000 --- a/rust-runtime/aws-smithy-client/src/retry.rs +++ /dev/null @@ -1,614 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Retry support -//! -//! Components: -//! - [`Standard`]: Top level manager, intended to be associated with a [`Client`](crate::Client). -//! Its sole purpose in life is to create a [`RetryHandler`] for individual requests. -//! - [`RetryHandler`]: A request-scoped retry policy, backed by request-local state and shared -//! state contained within [`Standard`]. -//! - [`Config`]: Static configuration (max attempts, max backoff etc.) - -use std::future::Future; -use std::pin::Pin; -use std::sync::{Arc, Mutex}; -use std::time::Duration; - -use tracing::Instrument; - -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; - -use aws_smithy_http::operation::Operation; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_types::retry::{ErrorKind, RetryKind}; - -use crate::{SdkError, SdkSuccess}; - -/// A policy instantiator. -/// -/// Implementors are essentially "policy factories" that can produce a new instance of a retry -/// policy mechanism for each request, which allows both shared global state _and_ per-request -/// local state. -pub trait NewRequestPolicy -where - Self::Policy: Send + Sync, -{ - /// The type of the per-request policy mechanism. - type Policy; - - /// Create a new policy mechanism instance. - fn new_request_policy(&self, sleep_impl: Option) -> Self::Policy; -} - -/// Retry Policy Configuration -/// -/// Without specific use cases, users should generally rely on the default values set -/// by [`Config::default`](Config::default). -/// -/// Currently these fields are private and no setters provided. As needed, this configuration -/// will become user-modifiable in the future. -#[derive(Clone, Debug)] -pub struct Config { - initial_retry_tokens: usize, - retry_cost: usize, - no_retry_increment: usize, - timeout_retry_cost: usize, - max_attempts: u32, - initial_backoff: Duration, - max_backoff: Duration, - base: fn() -> f64, -} - -impl Config { - /// Override `b` in the exponential backoff computation - /// - /// By default, `base` is a randomly generated value between 0 and 1. In tests, it can - /// be helpful to override this: - /// ```no_run - /// use aws_smithy_client::retry::Config; - /// let conf = Config::default().with_base(||1_f64); - /// ``` - pub fn with_base(mut self, base: fn() -> f64) -> Self { - self.base = base; - self - } - - /// Override the maximum number of attempts - /// - /// `max_attempts` must be set to a value of at least `1` (indicating that retries are disabled). - pub fn with_max_attempts(mut self, max_attempts: u32) -> Self { - self.max_attempts = max_attempts; - self - } - - /// Override the default backoff multiplier of 1 second. - /// - /// ## Example - /// - /// For a request that gets retried 3 times, when initial_backoff is 1 second: - /// - the first retry will occur after 0 to 1 seconds - /// - the second retry will occur after 0 to 2 seconds - /// - the third retry will occur after 0 to 4 seconds - /// - /// For a request that gets retried 3 times, when initial_backoff is 30 milliseconds: - /// - the first retry will occur after 0 to 30 milliseconds - /// - the second retry will occur after 0 to 60 milliseconds - /// - the third retry will occur after 0 to 120 milliseconds - pub fn with_initial_backoff(mut self, initial_backoff: Duration) -> Self { - self.initial_backoff = initial_backoff; - self - } - - /// Returns true if retry is enabled with this config - pub fn has_retry(&self) -> bool { - self.max_attempts > 1 - } -} - -impl Default for Config { - fn default() -> Self { - Self { - initial_retry_tokens: INITIAL_RETRY_TOKENS, - retry_cost: RETRY_COST, - no_retry_increment: 1, - timeout_retry_cost: 10, - max_attempts: MAX_ATTEMPTS, - max_backoff: Duration::from_secs(20), - // by default, use a random base for exponential backoff - base: fastrand::f64, - initial_backoff: Duration::from_secs(1), - } - } -} - -impl From for Config { - fn from(conf: aws_smithy_types::retry::RetryConfig) -> Self { - Self::default() - .with_max_attempts(conf.max_attempts()) - .with_initial_backoff(conf.initial_backoff()) - } -} - -const MAX_ATTEMPTS: u32 = 3; -const INITIAL_RETRY_TOKENS: usize = 500; -const RETRY_COST: usize = 5; - -/// Manage retries for a service -/// -/// An implementation of the `standard` AWS retry strategy. A `Strategy` is scoped to a client. -/// For an individual request, call [`Standard::new_request_policy()`](Standard::new_request_policy) -#[derive(Debug, Clone)] -pub struct Standard { - config: Config, - shared_state: CrossRequestRetryState, -} - -impl Standard { - /// Construct a new standard retry policy from the given policy configuration. - pub fn new(config: Config) -> Self { - Self { - shared_state: CrossRequestRetryState::new(config.initial_retry_tokens), - config, - } - } - - /// Set the configuration for this retry policy. - pub fn with_config(&mut self, config: Config) -> &mut Self { - self.config = config; - self - } -} - -impl NewRequestPolicy for Standard { - type Policy = RetryHandler; - - fn new_request_policy(&self, sleep_impl: Option) -> Self::Policy { - RetryHandler { - local: RequestLocalRetryState::new(), - shared: self.shared_state.clone(), - config: self.config.clone(), - sleep_impl, - } - } -} - -impl Default for Standard { - fn default() -> Self { - Self::new(Config::default()) - } -} - -#[derive(Clone, Debug)] -struct RequestLocalRetryState { - attempts: u32, - last_quota_usage: Option, -} - -impl Default for RequestLocalRetryState { - fn default() -> Self { - Self { - // Starts at one to account for the initial request that failed and warranted a retry - attempts: 1, - last_quota_usage: None, - } - } -} - -impl RequestLocalRetryState { - fn new() -> Self { - Self::default() - } -} - -/* TODO(retries) -/// RetryPartition represents a scope for cross request retry state -/// -/// For example, a retry partition could be the id of a service. This would give each service a separate retry budget. -struct RetryPartition(Cow<'static, str>); */ - -/// Shared state between multiple requests to the same client. -#[derive(Clone, Debug)] -struct CrossRequestRetryState { - quota_available: Arc>, -} - -// clippy is upset that we didn't use AtomicUsize here, but doing so makes the code -// significantly more complicated for negligible benefit. -#[allow(clippy::mutex_atomic)] -impl CrossRequestRetryState { - fn new(initial_quota: usize) -> Self { - Self { - quota_available: Arc::new(Mutex::new(initial_quota)), - } - } - - fn quota_release(&self, value: Option, config: &Config) { - let mut quota = self.quota_available.lock().unwrap(); - *quota += value.unwrap_or(config.no_retry_increment); - } - - /// Attempt to acquire retry quota for `ErrorKind` - /// - /// If quota is available, the amount of quota consumed is returned - /// If no quota is available, `None` is returned. - fn quota_acquire(&self, err: &ErrorKind, config: &Config) -> Option { - let mut quota = self.quota_available.lock().unwrap(); - let retry_cost = if err == &ErrorKind::TransientError { - config.timeout_retry_cost - } else { - config.retry_cost - }; - if retry_cost > *quota { - None - } else { - *quota -= retry_cost; - Some(retry_cost) - } - } -} - -type BoxFuture = Pin + Send>>; - -/// RetryHandler -/// -/// Implement retries for an individual request. -/// It is intended to be used as a [Tower Retry Policy](tower::retry::Policy) for use in tower-based -/// middleware stacks. -#[derive(Clone, Debug)] -pub struct RetryHandler { - local: RequestLocalRetryState, - shared: CrossRequestRetryState, - config: Config, - sleep_impl: Option, -} - -#[cfg(test)] -impl RetryHandler { - fn retry_quota(&self) -> usize { - *self.shared.quota_available.lock().unwrap() - } -} - -/// For a request that gets retried 3 times, when base is 1 and initial_backoff is 2 seconds: -/// - the first retry will occur after 0 to 2 seconds -/// - the second retry will occur after 0 to 4 seconds -/// - the third retry will occur after 0 to 8 seconds -/// -/// For a request that gets retried 3 times, when base is 1 and initial_backoff is 30 milliseconds: -/// - the first retry will occur after 0 to 30 milliseconds -/// - the second retry will occur after 0 to 60 milliseconds -/// - the third retry will occur after 0 to 120 milliseconds -fn calculate_exponential_backoff(base: f64, initial_backoff: f64, retry_attempts: u32) -> f64 { - base * initial_backoff * 2_u32.pow(retry_attempts) as f64 -} - -impl RetryHandler { - /// Determine the correct response given `retry_kind` - /// - /// If a retry is specified, this function returns `(next, backoff_duration)` - /// If no retry is specified, this function returns None - fn should_retry_error(&self, error_kind: &ErrorKind) -> Option<(Self, Duration)> { - let quota_used = { - if self.local.attempts == self.config.max_attempts { - tracing::trace!( - attempts = self.local.attempts, - max_attempts = self.config.max_attempts, - "not retrying becuase we are out of attempts" - ); - return None; - } - match self.shared.quota_acquire(error_kind, &self.config) { - Some(quota) => quota, - None => { - tracing::trace!(state = ?self.shared, "not retrying because no quota is available"); - return None; - } - } - }; - let backoff = calculate_exponential_backoff( - // Generate a random base multiplier to create jitter - (self.config.base)(), - // Get the backoff time multiplier in seconds (with fractional seconds) - self.config.initial_backoff.as_secs_f64(), - // `self.local.attempts` tracks number of requests made including the initial request - // The initial attempt shouldn't count towards backoff calculations so we subtract it - self.local.attempts - 1, - ); - let backoff = Duration::from_secs_f64(backoff).min(self.config.max_backoff); - let next = RetryHandler { - local: RequestLocalRetryState { - attempts: self.local.attempts + 1, - last_quota_usage: Some(quota_used), - }, - shared: self.shared.clone(), - config: self.config.clone(), - sleep_impl: self.sleep_impl.clone(), - }; - - Some((next, backoff)) - } - - fn should_retry(&self, retry_kind: &RetryKind) -> Option<(Self, Duration)> { - match retry_kind { - RetryKind::Explicit(dur) => Some((self.clone(), *dur)), - RetryKind::UnretryableFailure => None, - RetryKind::Unnecessary => { - self.shared - .quota_release(self.local.last_quota_usage, &self.config); - None - } - RetryKind::Error(err) => self.should_retry_error(err), - _ => None, - } - } - - fn retry_for(&self, retry_kind: RetryKind) -> Option> { - let retry = self.should_retry(&retry_kind); - tracing::trace!(retry=?retry, retry_kind = ?retry_kind, "retry action"); - let (next, dur) = retry?; - - let sleep = match &self.sleep_impl { - Some(sleep) => sleep, - None => { - if retry_kind != RetryKind::UnretryableFailure { - tracing::debug!("cannot retry because no sleep implementation exists"); - } - return None; - } - }; - - tracing::debug!( - "attempt {} failed with {:?}; retrying after {:?}", - self.local.attempts, - retry_kind, - dur - ); - let sleep_future = sleep.sleep(dur); - let fut = async move { - sleep_future.await; - next - } - .instrument(tracing::debug_span!("retry", kind = &debug(retry_kind))); - Some(check_send(Box::pin(fut))) - } -} - -impl tower::retry::Policy, SdkSuccess, SdkError> - for RetryHandler -where - Handler: Clone, - R: ClassifyRetry, SdkError>, -{ - type Future = BoxFuture; - - fn retry( - &self, - req: &Operation, - result: Result<&SdkSuccess, &SdkError>, - ) -> Option { - let classifier = req.retry_classifier(); - let retry_kind = classifier.classify_retry(result); - tracing::trace!(retry_kind = ?retry_kind, "retry classification"); - self.retry_for(retry_kind) - } - - fn clone_request(&self, req: &Operation) -> Option> { - req.try_clone() - } -} - -fn check_send(t: T) -> T { - t -} - -#[cfg(test)] -mod test { - use super::{calculate_exponential_backoff, Config, NewRequestPolicy, RetryHandler, Standard}; - - use aws_smithy_types::retry::{ErrorKind, RetryKind}; - - use std::time::Duration; - - fn test_config() -> Config { - Config::default().with_base(|| 1_f64) - } - - #[test] - fn retry_handler_send_sync() { - fn must_be_send_sync() {} - - must_be_send_sync::() - } - - #[test] - fn eventual_success() { - let policy = Standard::new(test_config()).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 495); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(2)); - assert_eq!(policy.retry_quota(), 490); - - let no_retry = policy.should_retry(&RetryKind::Unnecessary); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 495); - } - - #[test] - fn no_more_attempts() { - let policy = Standard::new(test_config()).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 495); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(2)); - assert_eq!(policy.retry_quota(), 490); - - let no_retry = policy.should_retry(&RetryKind::Error(ErrorKind::ServerError)); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 490); - } - - #[test] - fn no_quota() { - let mut conf = test_config(); - conf.initial_retry_tokens = 5; - let policy = Standard::new(conf).new_request_policy(None); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 0); - - let no_retry = policy.should_retry(&RetryKind::Error(ErrorKind::ServerError)); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 0); - } - - #[test] - fn quota_replenishes_on_success() { - let mut conf = test_config(); - conf.initial_retry_tokens = 100; - let policy = Standard::new(conf).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::TransientError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 90); - - let (policy, dur) = policy - .should_retry(&RetryKind::Explicit(Duration::from_secs(1))) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!( - policy.retry_quota(), - 90, - "explicit retry should not subtract from quota" - ); - - assert!( - policy.should_retry(&RetryKind::Unnecessary).is_none(), - "it should not retry success" - ); - let available = policy.shared.quota_available.lock().unwrap(); - assert_eq!(100, *available, "successful request should replenish quota"); - } - - #[test] - fn backoff_timing() { - let mut conf = test_config(); - conf.max_attempts = 5; - let policy = Standard::new(conf).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 495); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(2)); - assert_eq!(policy.retry_quota(), 490); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(4)); - assert_eq!(policy.retry_quota(), 485); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(8)); - assert_eq!(policy.retry_quota(), 480); - - let no_retry = policy.should_retry(&RetryKind::Error(ErrorKind::ServerError)); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 480); - } - - #[test] - fn max_backoff_time() { - let mut conf = test_config(); - conf.max_attempts = 5; - conf.initial_backoff = Duration::from_secs(1); - conf.max_backoff = Duration::from_secs(3); - let policy = Standard::new(conf).new_request_policy(None); - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(1)); - assert_eq!(policy.retry_quota(), 495); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(2)); - assert_eq!(policy.retry_quota(), 490); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(3)); - assert_eq!(policy.retry_quota(), 485); - - let (policy, dur) = policy - .should_retry(&RetryKind::Error(ErrorKind::ServerError)) - .expect("should retry"); - assert_eq!(dur, Duration::from_secs(3)); - assert_eq!(policy.retry_quota(), 480); - - let no_retry = policy.should_retry(&RetryKind::Error(ErrorKind::ServerError)); - assert!(no_retry.is_none()); - assert_eq!(policy.retry_quota(), 480); - } - - #[test] - fn calculate_exponential_backoff_where_initial_backoff_is_one() { - let initial_backoff = 1.0; - - for (attempt, expected_backoff) in [initial_backoff, 2.0, 4.0].into_iter().enumerate() { - let actual_backoff = - calculate_exponential_backoff(1.0, initial_backoff, attempt as u32); - assert_eq!(expected_backoff, actual_backoff); - } - } - - #[test] - fn calculate_exponential_backoff_where_initial_backoff_is_greater_than_one() { - let initial_backoff = 3.0; - - for (attempt, expected_backoff) in [initial_backoff, 6.0, 12.0].into_iter().enumerate() { - let actual_backoff = - calculate_exponential_backoff(1.0, initial_backoff, attempt as u32); - assert_eq!(expected_backoff, actual_backoff); - } - } - - #[test] - fn calculate_exponential_backoff_where_initial_backoff_is_less_than_one() { - let initial_backoff = 0.03; - - for (attempt, expected_backoff) in [initial_backoff, 0.06, 0.12].into_iter().enumerate() { - let actual_backoff = - calculate_exponential_backoff(1.0, initial_backoff, attempt as u32); - assert_eq!(expected_backoff, actual_backoff); - } - } -} diff --git a/rust-runtime/aws-smithy-client/src/static_tests.rs b/rust-runtime/aws-smithy-client/src/static_tests.rs deleted file mode 100644 index a8cd503022c..00000000000 --- a/rust-runtime/aws-smithy-client/src/static_tests.rs +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ -//! This module provides types useful for static tests. -#![allow(missing_docs, missing_debug_implementations)] - -use crate::{Builder, Operation, ParseHttpResponse, ProvideErrorKind}; -use aws_smithy_http::operation; -use aws_smithy_http::retry::DefaultResponseRetryClassifier; - -#[derive(Debug)] -#[non_exhaustive] -pub struct TestOperationError; -impl std::fmt::Display for TestOperationError { - fn fmt(&self, _: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - unreachable!("only used for static tests") - } -} -impl std::error::Error for TestOperationError {} -impl ProvideErrorKind for TestOperationError { - fn retryable_error_kind(&self) -> Option { - unreachable!("only used for static tests") - } - - fn code(&self) -> Option<&str> { - unreachable!("only used for static tests") - } -} -#[derive(Clone)] -#[non_exhaustive] -pub struct TestOperation; -impl ParseHttpResponse for TestOperation { - type Output = Result<(), TestOperationError>; - - fn parse_unloaded(&self, _: &mut operation::Response) -> Option { - unreachable!("only used for static tests") - } - - fn parse_loaded(&self, _response: &http::Response) -> Self::Output { - unreachable!("only used for static tests") - } -} -pub type ValidTestOperation = Operation; - -// Statically check that a standard retry can actually be used to build a Client. -#[allow(dead_code)] -#[cfg(test)] -fn sanity_retry() { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .check(); -} - -// Statically check that a hyper client can actually be used to build a Client. -#[allow(dead_code)] -#[cfg(all(test, feature = "hyper"))] -fn sanity_hyper(hc: crate::hyper_ext::Adapter) { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector(hc) - .build() - .check(); -} - -// Statically check that a type-erased middleware client is actually a valid Client. -#[allow(dead_code)] -fn sanity_erase_middleware() { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .into_dyn_middleware() - .check(); -} - -// Statically check that a type-erased connector client is actually a valid Client. -#[allow(dead_code)] -fn sanity_erase_connector() { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .into_dyn_connector() - .check(); -} - -// Statically check that a fully type-erased client is actually a valid Client. -#[allow(dead_code)] -fn sanity_erase_full() { - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .into_dyn() - .check(); -} - -fn is_send_sync(_: T) {} -fn noarg_is_send_sync() {} - -// Statically check that a fully type-erased client is still Send + Sync. -#[allow(dead_code)] -fn erased_is_send_sync() { - noarg_is_send_sync::(); - noarg_is_send_sync::>(); - is_send_sync( - Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector_fn(|_| async { unreachable!() }) - .build() - .into_dyn(), - ); -} diff --git a/rust-runtime/aws-smithy-client/src/test_connection.rs b/rust-runtime/aws-smithy-client/src/test_connection.rs deleted file mode 100644 index 86466944df0..00000000000 --- a/rust-runtime/aws-smithy-client/src/test_connection.rs +++ /dev/null @@ -1,727 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ -//! Module with client connectors useful for testing. - -// TODO(docs) -#![allow(missing_docs)] - -use std::fmt::{Debug, Formatter}; -use std::future::Ready; -use std::ops::Deref; -use std::sync::{Arc, Mutex}; -use std::task::{Context, Poll}; - -use http::header::{HeaderName, CONTENT_TYPE}; -use http::Request; -use tokio::sync::oneshot; - -use crate::erase::DynConnector; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; - -#[doc(inline)] -pub use crate::never; - -/// Test Connection to capture a single request -#[derive(Debug, Clone)] -pub struct CaptureRequestHandler(Arc>); - -#[derive(Debug)] -struct Inner { - response: Option>, - sender: Option>>, -} - -/// Receiver for [`CaptureRequestHandler`](CaptureRequestHandler) -#[derive(Debug)] -pub struct CaptureRequestReceiver { - receiver: oneshot::Receiver>, -} - -impl CaptureRequestReceiver { - /// Expect that a request was sent. Returns the captured request. - /// - /// # Panics - /// If no request was received - #[track_caller] - pub fn expect_request(mut self) -> http::Request { - self.receiver.try_recv().expect("no request was received") - } - - /// Expect that no request was captured. Panics if a request was received. - /// - /// # Panics - /// If a request was received - #[track_caller] - pub fn expect_no_request(mut self) { - self.receiver - .try_recv() - .expect_err("expected no request to be received!"); - } -} - -impl tower::Service> for CaptureRequestHandler { - type Response = http::Response; - type Error = ConnectorError; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: Request) -> Self::Future { - let mut inner = self.0.lock().unwrap(); - inner - .sender - .take() - .expect("already sent") - .send(req) - .expect("channel not ready"); - std::future::ready(Ok(inner - .response - .take() - .expect("could not handle second request"))) - } -} - -/// Test connection used to capture a single request -/// -/// If response is `None`, it will reply with a 200 response with an empty body -/// -/// Example: -/// ```compile_fail -/// let (server, request) = capture_request(None); -/// let conf = aws_sdk_sts::Config::builder() -/// .http_connector(server) -/// .build(); -/// let client = aws_sdk_sts::Client::from_conf(conf); -/// let _ = client.assume_role_with_saml().send().await; -/// // web identity should be unsigned -/// assert_eq!( -/// request.expect_request().headers().get("AUTHORIZATION"), -/// None -/// ); -/// ``` -pub fn capture_request( - response: Option>, -) -> (CaptureRequestHandler, CaptureRequestReceiver) { - let (tx, rx) = oneshot::channel(); - ( - CaptureRequestHandler(Arc::new(Mutex::new(Inner { - response: Some(response.unwrap_or_else(|| { - http::Response::builder() - .status(200) - .body(SdkBody::empty()) - .expect("unreachable") - })), - sender: Some(tx), - }))), - CaptureRequestReceiver { receiver: rx }, - ) -} - -type ConnectVec = Vec<(http::Request, http::Response)>; - -#[derive(Debug)] -pub struct ValidateRequest { - pub expected: http::Request, - pub actual: http::Request, -} - -impl ValidateRequest { - pub fn assert_matches(&self, ignore_headers: &[HeaderName]) { - let (actual, expected) = (&self.actual, &self.expected); - assert_eq!(actual.uri(), expected.uri()); - for (name, value) in expected.headers() { - if !ignore_headers.contains(name) { - let actual_header = actual - .headers() - .get(name) - .unwrap_or_else(|| panic!("Header {:?} missing", name)); - assert_eq!( - actual_header.to_str().unwrap(), - value.to_str().unwrap(), - "Header mismatch for {:?}", - name - ); - } - } - let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[])); - let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[])); - let media_type = if actual - .headers() - .get(CONTENT_TYPE) - .map(|v| v.to_str().unwrap().contains("json")) - .unwrap_or(false) - { - MediaType::Json - } else { - MediaType::Other("unknown".to_string()) - }; - match (actual_str, expected_str) { - (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), - _ => assert_eq!(actual.body().bytes(), expected.body().bytes()), - }; - } -} - -/// TestConnection for use with a [`Client`](crate::Client). -/// -/// A basic test connection. It will: -/// - Respond to requests with a preloaded series of responses -/// - Record requests for future examination -/// -/// The generic parameter `B` is the type of the response body. -/// For more complex use cases, see [Tower Test](https://docs.rs/tower-test/0.4.0/tower_test/) -/// Usage example: -/// ```no_run -/// use aws_smithy_client::test_connection::TestConnection; -/// use aws_smithy_http::body::SdkBody; -/// let events = vec![( -/// http::Request::new(SdkBody::from("request body")), -/// http::Response::builder() -/// .status(200) -/// .body("response body") -/// .unwrap(), -/// )]; -/// let conn = TestConnection::new(events); -/// let client = aws_smithy_client::Client::from(conn); -/// ``` -#[derive(Debug)] -pub struct TestConnection { - data: Arc>>, - requests: Arc>>, -} - -// Need a clone impl that ignores `B` -impl Clone for TestConnection { - fn clone(&self) -> Self { - TestConnection { - data: self.data.clone(), - requests: self.requests.clone(), - } - } -} - -impl TestConnection { - pub fn new(mut data: ConnectVec) -> Self { - data.reverse(); - TestConnection { - data: Arc::new(Mutex::new(data)), - requests: Default::default(), - } - } - - pub fn requests(&self) -> impl Deref> + '_ { - self.requests.lock().unwrap() - } - - #[track_caller] - pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { - for req in self.requests().iter() { - req.assert_matches(ignore_headers) - } - let remaining_requests = self.data.lock().unwrap().len(); - let actual_requests = self.requests().len(); - assert_eq!( - remaining_requests, 0, - "Expected {} additional requests ({} were made)", - remaining_requests, actual_requests - ); - } -} - -impl tower::Service> for TestConnection -where - SdkBody: From, -{ - type Response = http::Response; - type Error = ConnectorError; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, actual: Request) -> Self::Future { - // todo: validate request - if let Some((expected, resp)) = self.data.lock().unwrap().pop() { - self.requests - .lock() - .unwrap() - .push(ValidateRequest { expected, actual }); - std::future::ready(Ok(resp.map(SdkBody::from))) - } else { - std::future::ready(Err(ConnectorError::other("No more data".into(), None))) - } - } -} - -impl From> for crate::Client, tower::layer::util::Identity> -where - B: Send + 'static, - SdkBody: From, -{ - fn from(tc: TestConnection) -> Self { - crate::Builder::new() - .middleware(tower::layer::util::Identity::new()) - .connector(tc) - .build() - } -} - -/// Create a DynConnector from `Fn(http:Request) -> http::Response` -/// -/// # Examples -/// -/// ```rust -/// use aws_smithy_client::test_connection::infallible_connection_fn; -/// let connector = infallible_connection_fn(|_req|http::Response::builder().status(200).body("OK!").unwrap()); -/// ``` -pub fn infallible_connection_fn( - f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, -) -> DynConnector -where - B: Into, -{ - ConnectionFn::infallible(f) -} - -#[derive(Clone)] -struct ConnectionFn { - #[allow(clippy::type_complexity)] - response: Arc< - dyn Fn(http::Request) -> Result, ConnectorError> - + Send - + Sync, - >, -} - -impl Debug for ConnectionFn { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("ConnectionFn").finish() - } -} - -impl ConnectionFn { - fn infallible>( - f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, - ) -> DynConnector { - DynConnector::new(Self { - response: Arc::new(move |request| Ok(f(request).map(|b| b.into()))), - }) - } -} - -impl tower::Service> for ConnectionFn { - type Response = http::Response; - type Error = ConnectorError; - type Future = Ready>; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: Request) -> Self::Future { - std::future::ready((self.response)(req)) - } -} - -/// [`wire_mock`] contains utilities for mocking at the socket level -/// -/// Other tools in this module actually operate at the `http::Request` / `http::Response` level. This -/// is useful, but it shortcuts the HTTP implementation (e.g. Hyper). [`wire_mock::WireLevelTestConnection`] binds -/// to an actual socket on the host -/// -/// # Examples -/// ``` -/// use tower::layer::util::Identity; -/// use aws_smithy_client::http_connector::ConnectorSettings; -/// use aws_smithy_client::{match_events, ev}; -/// use aws_smithy_client::test_connection::wire_mock::check_matches; -/// # async fn example() { -/// use aws_smithy_client::test_connection::wire_mock::{ReplayedEvent, WireLevelTestConnection}; -/// // This connection binds to a local address -/// let mock = WireLevelTestConnection::spinup(vec![ -/// ReplayedEvent::status(503), -/// ReplayedEvent::status(200) -/// ]).await; -/// let client = aws_smithy_client::Client::builder() -/// .connector(mock.http_connector().connector(&ConnectorSettings::default(), None).unwrap()) -/// .middleware(Identity::new()) -/// .build(); -/// /* do something with */ -/// // assert that you got the events you expected -/// match_events!(ev!(dns), ev!(connect), ev!(http(200)))(&mock.events()); -/// # } -/// ``` -pub mod wire_mock { - use bytes::Bytes; - use http::{Request, Response}; - use hyper::client::connect::dns::Name; - use hyper::server::conn::AddrStream; - use hyper::service::{make_service_fn, service_fn}; - use hyper::{Body, Server}; - use std::collections::HashSet; - use std::convert::Infallible; - use std::error::Error; - - use hyper::client::HttpConnector as HyperHttpConnector; - use std::iter; - use std::iter::Once; - use std::net::{SocketAddr, TcpListener}; - use std::sync::{Arc, Mutex}; - use std::task::{Context, Poll}; - - use tokio::spawn; - use tower::Service; - - /// An event recorded by [`WireLevelTestConnection`] - #[derive(Debug, Clone)] - pub enum RecordedEvent { - DnsLookup(String), - NewConnection, - Response(ReplayedEvent), - } - - type Matcher = ( - Box Result<(), Box>>, - &'static str, - ); - - /// This method should only be used by the macro - #[doc(hidden)] - pub fn check_matches(events: &[RecordedEvent], matchers: &[Matcher]) { - let mut events_iter = events.iter(); - let mut matcher_iter = matchers.iter(); - let mut idx = -1; - loop { - idx += 1; - let bail = |err: Box| panic!("failed on event {}:\n {}", idx, err); - match (events_iter.next(), matcher_iter.next()) { - (Some(event), Some((matcher, _msg))) => matcher(event).unwrap_or_else(bail), - (None, None) => return, - (Some(event), None) => { - bail(format!("got {:?} but no more events were expected", event).into()) - } - (None, Some((_expect, msg))) => { - bail(format!("expected {:?} but no more events were expected", msg).into()) - } - } - } - } - - #[macro_export] - macro_rules! matcher { - ($expect:tt) => { - ( - Box::new( - |event: &::aws_smithy_client::test_connection::wire_mock::RecordedEvent| { - if !matches!(event, $expect) { - return Err(format!( - "expected `{}` but got {:?}", - stringify!($expect), - event - ) - .into()); - } - Ok(()) - }, - ), - stringify!($expect), - ) - }; - } - - /// Helper macro to generate a series of test expectations - #[macro_export] - macro_rules! match_events { - ($( $expect:pat),*) => { - |events| { - check_matches(events, &[$( ::aws_smithy_client::matcher!($expect) ),*]); - } - }; - } - - /// Helper to generate match expressions for events - #[macro_export] - macro_rules! ev { - (http($status:expr)) => { - ::aws_smithy_client::test_connection::wire_mock::RecordedEvent::Response( - ReplayedEvent::HttpResponse { - status: $status, - .. - }, - ) - }; - (dns) => { - ::aws_smithy_client::test_connection::wire_mock::RecordedEvent::DnsLookup(_) - }; - (connect) => { - ::aws_smithy_client::test_connection::wire_mock::RecordedEvent::NewConnection - }; - (timeout) => { - ::aws_smithy_client::test_connection::wire_mock::RecordedEvent::Response( - ReplayedEvent::Timeout, - ) - }; - } - - pub use {ev, match_events, matcher}; - - #[derive(Clone, Debug, PartialEq, Eq)] - pub enum ReplayedEvent { - Timeout, - HttpResponse { status: u16, body: Bytes }, - } - - impl ReplayedEvent { - pub fn ok() -> Self { - Self::HttpResponse { - status: 200, - body: Bytes::new(), - } - } - - pub fn with_body(body: &str) -> Self { - Self::HttpResponse { - status: 200, - body: Bytes::copy_from_slice(body.as_ref()), - } - } - - pub fn status(status: u16) -> Self { - Self::HttpResponse { - status, - body: Bytes::new(), - } - } - } - - use crate::erase::boxclone::BoxFuture; - use crate::http_connector::HttpConnector; - use crate::hyper_ext; - use aws_smithy_async::future::never::Never; - use tokio::sync::oneshot; - - /// Test connection that starts a server bound to 0.0.0.0 - /// - /// See the [module docs](crate::test_connection::wire_mock) for a usage example. - /// - /// Usage: - /// - Call [`WireLevelTestConnection::spinup`] to start the server - /// - Use [`WireLevelTestConnection::http_connector`] or [`dns_resolver`](WireLevelTestConnection::dns_resolver) to configure your client. - /// - Make requests to [`endpoint_url`](WireLevelTestConnection::endpoint_url). - /// - Once the test is complete, retrieve a list of events from [`WireLevelTestConnection::events`] - #[derive(Debug)] - pub struct WireLevelTestConnection { - event_log: Arc>>, - bind_addr: SocketAddr, - // when the sender is dropped, that stops the server - shutdown_hook: oneshot::Sender<()>, - } - - impl WireLevelTestConnection { - pub async fn spinup(mut response_events: Vec) -> Self { - let listener = TcpListener::bind("127.0.0.1:0").unwrap(); - let (tx, rx) = oneshot::channel(); - let listener_addr = listener.local_addr().unwrap(); - response_events.reverse(); - let response_events = Arc::new(Mutex::new(response_events)); - let handler_events = response_events; - let wire_events = Arc::new(Mutex::new(vec![])); - let wire_log_for_service = wire_events.clone(); - let poisoned_conns: Arc>> = Default::default(); - let make_service = make_service_fn(move |connection: &AddrStream| { - let poisoned_conns = poisoned_conns.clone(); - let events = handler_events.clone(); - let wire_log = wire_log_for_service.clone(); - let remote_addr = connection.remote_addr(); - tracing::info!("established connection: {:?}", connection); - wire_log.lock().unwrap().push(RecordedEvent::NewConnection); - async move { - Ok::<_, Infallible>(service_fn(move |_: Request| { - if poisoned_conns.lock().unwrap().contains(&remote_addr) { - tracing::error!("poisoned connection {:?} was reused!", &remote_addr); - panic!("poisoned connection was reused!"); - } - let next_event = events.clone().lock().unwrap().pop(); - let wire_log = wire_log.clone(); - let poisoned_conns = poisoned_conns.clone(); - async move { - let next_event = next_event - .unwrap_or_else(|| panic!("no more events! Log: {:?}", wire_log)); - wire_log - .lock() - .unwrap() - .push(RecordedEvent::Response(next_event.clone())); - if next_event == ReplayedEvent::Timeout { - tracing::info!("{} is poisoned", remote_addr); - poisoned_conns.lock().unwrap().insert(remote_addr); - } - tracing::debug!("replying with {:?}", next_event); - let event = generate_response_event(next_event).await; - dbg!(event) - } - })) - } - }); - let server = Server::from_tcp(listener) - .unwrap() - .serve(make_service) - .with_graceful_shutdown(async { - rx.await.ok(); - tracing::info!("server shutdown!"); - }); - spawn(async move { server.await }); - Self { - event_log: wire_events, - bind_addr: listener_addr, - shutdown_hook: tx, - } - } - - /// Retrieve the events recorded by this connection - pub fn events(&self) -> Vec { - self.event_log.lock().unwrap().clone() - } - - fn bind_addr(&self) -> SocketAddr { - self.bind_addr - } - - pub fn dns_resolver(&self) -> LoggingDnsResolver { - let event_log = self.event_log.clone(); - let bind_addr = self.bind_addr; - LoggingDnsResolver { - log: event_log, - socket_addr: bind_addr, - } - } - - /// Prebuilt HTTP connector with correctly wired DNS resolver - /// - /// **Note**: This must be used in tandem with [`Self::dns_resolver`] - pub fn http_connector(&self) -> HttpConnector { - let http_connector = HyperHttpConnector::new_with_resolver(self.dns_resolver()); - hyper_ext::Adapter::builder().build(http_connector).into() - } - - /// Endpoint to use when connecting - /// - /// This works in tandem with the [`Self::dns_resolver`] to bind to the correct local IP Address - pub fn endpoint_url(&self) -> String { - format!( - "http://this-url-is-converted-to-localhost.com:{}", - self.bind_addr().port() - ) - } - - pub fn shutdown(self) { - let _ = self.shutdown_hook.send(()); - } - } - - async fn generate_response_event(event: ReplayedEvent) -> Result, Infallible> { - let resp = match event { - ReplayedEvent::HttpResponse { status, body } => http::Response::builder() - .status(status) - .body(hyper::Body::from(body)) - .unwrap(), - ReplayedEvent::Timeout => { - Never::new().await; - unreachable!() - } - }; - Ok::<_, Infallible>(resp) - } - - /// DNS resolver that keeps a log of all lookups - /// - /// Regardless of what hostname is requested, it will always return the same socket address. - #[derive(Clone, Debug)] - pub struct LoggingDnsResolver { - log: Arc>>, - socket_addr: SocketAddr, - } - - impl Service for LoggingDnsResolver { - type Response = Once; - type Error = Infallible; - type Future = BoxFuture; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, req: Name) -> Self::Future { - let sock_addr = self.socket_addr; - let log = self.log.clone(); - Box::pin(async move { - println!("looking up {:?}, replying with {:?}", req, sock_addr); - log.lock() - .unwrap() - .push(RecordedEvent::DnsLookup(req.to_string())); - Ok(iter::once(sock_addr)) - }) - } - } -} - -#[cfg(test)] -mod tests { - use hyper::service::Service; - - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::result::ConnectorError; - - use crate::bounds::SmithyConnector; - use crate::test_connection::{capture_request, never::NeverService, TestConnection}; - use crate::Client; - - fn is_send_sync(_: T) {} - - #[test] - fn construct_test_client() { - let test_conn = TestConnection::::new(vec![]); - let client: Client<_, _, _> = test_conn.into(); - is_send_sync(client); - } - - fn is_a_connector(_: &T) - where - T: SmithyConnector, - { - } - - fn quacks_like_a_connector(_: &T) - where - T: Service, Response = http::Response> - + Send - + Sync - + Clone - + 'static, - T::Error: Into + Send + Sync + 'static, - T::Future: Send + 'static, - { - } - - #[test] - fn oneshot_client() { - let (tx, _rx) = capture_request(None); - quacks_like_a_connector(&tx); - is_a_connector(&tx) - } - - #[test] - fn never_test() { - is_a_connector(&NeverService::< - http::Request, - http::Response, - ConnectorError, - >::new()) - } -} diff --git a/rust-runtime/aws-smithy-client/src/timeout.rs b/rust-runtime/aws-smithy-client/src/timeout.rs deleted file mode 100644 index f9a03a41f67..00000000000 --- a/rust-runtime/aws-smithy-client/src/timeout.rs +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Timeout Configuration - -use crate::SdkError; -use aws_smithy_async::future::timeout::Timeout; -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_http::operation::Operation; -use aws_smithy_types::timeout::OperationTimeoutConfig; -use pin_project_lite::pin_project; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; -use std::time::Duration; -use tower::Layer; - -#[derive(Debug)] -struct RequestTimeoutError { - kind: &'static str, - duration: Duration, -} - -impl RequestTimeoutError { - fn new(kind: &'static str, duration: Duration) -> Self { - Self { kind, duration } - } -} - -impl std::fmt::Display for RequestTimeoutError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{} occurred after {:?}", self.kind, self.duration) - } -} - -impl std::error::Error for RequestTimeoutError {} - -#[derive(Clone, Debug)] -/// A struct containing everything needed to create a new [`TimeoutService`] -pub struct TimeoutServiceParams { - /// The duration of timeouts created from these params - duration: Duration, - /// The kind of timeouts created from these params - kind: &'static str, - /// The AsyncSleep impl that will be used to create time-limited futures - async_sleep: SharedAsyncSleep, -} - -#[derive(Clone, Debug, Default)] -/// A struct of structs containing everything needed to create new [`TimeoutService`]s -pub(crate) struct ClientTimeoutParams { - /// Params used to create a new API call [`TimeoutService`] - pub(crate) operation_timeout: Option, - /// Params used to create a new API call attempt [`TimeoutService`] - pub(crate) operation_attempt_timeout: Option, -} - -impl ClientTimeoutParams { - pub(crate) fn new( - timeout_config: &OperationTimeoutConfig, - async_sleep: Option, - ) -> Self { - if let Some(async_sleep) = async_sleep { - Self { - operation_timeout: timeout_config.operation_timeout().map(|duration| { - TimeoutServiceParams { - duration, - kind: "operation timeout (all attempts including retries)", - async_sleep: async_sleep.clone(), - } - }), - operation_attempt_timeout: timeout_config.operation_attempt_timeout().map( - |duration| TimeoutServiceParams { - duration, - kind: "operation attempt timeout (single attempt)", - async_sleep: async_sleep.clone(), - }, - ), - } - } else { - Default::default() - } - } -} - -/// A service that wraps another service, adding the ability to set a timeout for requests -/// handled by the inner service. -#[derive(Clone, Debug)] -pub struct TimeoutService { - inner: S, - params: Option, -} - -impl TimeoutService { - /// Create a new `TimeoutService` that will timeout after the duration specified in `params` elapses - pub fn new(inner: S, params: Option) -> Self { - Self { inner, params } - } - - /// Create a new `TimeoutService` that will never timeout - pub fn no_timeout(inner: S) -> Self { - Self { - inner, - params: None, - } - } -} - -/// A layer that wraps services in a timeout service -#[non_exhaustive] -#[derive(Debug)] -pub struct TimeoutLayer(Option); - -impl TimeoutLayer { - /// Create a new `TimeoutLayer` - pub fn new(params: Option) -> Self { - TimeoutLayer(params) - } -} - -impl Layer for TimeoutLayer { - type Service = TimeoutService; - - fn layer(&self, inner: S) -> Self::Service { - TimeoutService { - inner, - params: self.0.clone(), - } - } -} - -pin_project! { - #[non_exhaustive] - #[must_use = "futures do nothing unless you `.await` or poll them"] - // This allow is needed because otherwise Clippy will get mad we didn't document the - // generated TimeoutServiceFutureProj - #[allow(missing_docs)] - #[project = TimeoutServiceFutureProj] - /// A future generated by a [`TimeoutService`] that may or may not have a timeout depending on - /// whether or not one was set. Because `TimeoutService` can be used at multiple levels of the - /// service stack, a `kind` can be set so that when a timeout occurs, you can know which kind of - /// timeout it was. - pub enum TimeoutServiceFuture { - /// A wrapper around an inner future that will output an [`SdkError`] if it runs longer than - /// the given duration - Timeout { - #[pin] - future: Timeout, - kind: &'static str, - duration: Duration, - }, - /// A thin wrapper around an inner future that will never time out - NoTimeout { - #[pin] - future: F - } - } -} - -impl TimeoutServiceFuture { - /// Given a `future`, an implementor of `AsyncSleep`, a `kind` for this timeout, and a `duration`, - /// wrap the `future` inside a [`Timeout`] future and create a new [`TimeoutServiceFuture`] that - /// will output an [`SdkError`] if `future` doesn't complete before `duration` has elapsed. - pub fn new(future: F, params: &TimeoutServiceParams) -> Self { - Self::Timeout { - future: Timeout::new(future, params.async_sleep.sleep(params.duration)), - kind: params.kind, - duration: params.duration, - } - } - - /// Create a [`TimeoutServiceFuture`] that will never time out. - pub fn no_timeout(future: F) -> Self { - Self::NoTimeout { future } - } -} - -impl Future for TimeoutServiceFuture -where - InnerFuture: Future>>, -{ - type Output = Result>; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - let (future, kind, duration) = match self.project() { - TimeoutServiceFutureProj::NoTimeout { future } => return future.poll(cx), - TimeoutServiceFutureProj::Timeout { - future, - kind, - duration, - } => (future, kind, duration), - }; - match future.poll(cx) { - Poll::Ready(Ok(response)) => Poll::Ready(response), - Poll::Ready(Err(_timeout)) => Poll::Ready(Err(SdkError::timeout_error( - RequestTimeoutError::new(kind, *duration), - ))), - Poll::Pending => Poll::Pending, - } - } -} - -impl tower::Service> for TimeoutService -where - InnerService: tower::Service, Error = SdkError>, -{ - type Response = InnerService::Response; - type Error = SdkError; - type Future = TimeoutServiceFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, req: Operation) -> Self::Future { - let future = self.inner.call(req); - - if let Some(params) = &self.params { - Self::Future::new(future, params) - } else { - Self::Future::no_timeout(future) - } - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::never::NeverService; - use crate::{SdkError, TimeoutLayer}; - use aws_smithy_async::assert_elapsed; - use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::operation::{Operation, Request}; - use aws_smithy_types::timeout::TimeoutConfig; - use std::time::Duration; - use tower::{Service, ServiceBuilder, ServiceExt}; - - #[tokio::test] - async fn test_timeout_service_ends_request_that_never_completes() { - let req = Request::new(http::Request::new(SdkBody::empty())); - let op = Operation::new(req, ()); - let never_service: NeverService<_, (), _> = NeverService::new(); - let timeout_config = OperationTimeoutConfig::from( - TimeoutConfig::builder() - .operation_timeout(Duration::from_secs_f32(0.25)) - .build(), - ); - let sleep_impl = SharedAsyncSleep::new(TokioSleep::new()); - let timeout_service_params = ClientTimeoutParams::new(&timeout_config, Some(sleep_impl)); - let mut svc = ServiceBuilder::new() - .layer(TimeoutLayer::new(timeout_service_params.operation_timeout)) - .service(never_service); - - let now = tokio::time::Instant::now(); - tokio::time::pause(); - - let err: SdkError> = - svc.ready().await.unwrap().call(op).await.unwrap_err(); - - assert_eq!(format!("{:?}", err), "TimeoutError(TimeoutError { source: RequestTimeoutError { kind: \"operation timeout (all attempts including retries)\", duration: 250ms } })"); - assert_elapsed!(now, Duration::from_secs_f32(0.25)); - } -} diff --git a/rust-runtime/aws-smithy-client/tests/e2e_test.rs b/rust-runtime/aws-smithy-client/tests/e2e_test.rs deleted file mode 100644 index f18a084bb5d..00000000000 --- a/rust-runtime/aws-smithy-client/tests/e2e_test.rs +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -mod test_operation; -use crate::test_operation::{TestOperationParser, TestRetryClassifier}; -use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; -use aws_smithy_client::test_connection::TestConnection; -use aws_smithy_client::Client; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_http::result::SdkError; -use std::time::Duration; -use tower::layer::util::Identity; - -fn test_operation() -> Operation { - let req = operation::Request::new( - http::Request::builder() - .uri("https://test-service.test-region.amazonaws.com/") - .body(SdkBody::from("request body")) - .unwrap(), - ); - Operation::new(req, TestOperationParser).with_retry_classifier(TestRetryClassifier) -} - -#[tokio::test] -async fn end_to_end_retry_test() { - fn req() -> http::Request { - http::Request::builder() - .body(SdkBody::from("request body")) - .unwrap() - } - - fn ok() -> http::Response<&'static str> { - http::Response::builder() - .status(200) - .body("Hello!") - .unwrap() - } - - fn err() -> http::Response<&'static str> { - http::Response::builder() - .status(500) - .body("This was an error") - .unwrap() - } - // 1 failing response followed by 1 successful response - let events = vec![ - // First operation - (req(), err()), - (req(), err()), - (req(), ok()), - // Second operation - (req(), err()), - (req(), ok()), - // Third operation will fail, only errors - (req(), err()), - (req(), err()), - (req(), err()), - (req(), err()), - ]; - let conn = TestConnection::new(events); - let retry_config = aws_smithy_client::retry::Config::default() - .with_max_attempts(4) - // This is the default, just setting it to be explicit - .with_initial_backoff(Duration::from_secs(1)) - .with_base(|| 1_f64); - let client = Client::builder() - .connector(conn.clone()) - .middleware(Identity::new()) - .retry_config(retry_config) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .build(); - tokio::time::pause(); - let initial = tokio::time::Instant::now(); - let resp = client - .call(test_operation()) - .await - .expect("successful operation"); - assert_time_passed(initial, Duration::from_secs(3)); - assert_eq!(resp, "Hello!"); - // 3 requests should have been made, 2 failing & one success - assert_eq!(conn.requests().len(), 3); - - let initial = tokio::time::Instant::now(); - client - .call(test_operation()) - .await - .expect("successful operation"); - assert_time_passed(initial, Duration::from_secs(1)); - assert_eq!(conn.requests().len(), 5); - let initial = tokio::time::Instant::now(); - let err = client - .call(test_operation()) - .await - .expect_err("all responses failed"); - // 4 more tries followed by failure - assert_eq!(conn.requests().len(), 9); - assert!(matches!(err, SdkError::ServiceError { .. })); - assert_time_passed(initial, Duration::from_secs(7)); -} - -/// Validate that time has passed with a 5ms tolerance -/// -/// This is to account for some non-determinism in the Tokio timer -fn assert_time_passed(initial: tokio::time::Instant, passed: Duration) { - let now = tokio::time::Instant::now(); - let delta = now - initial; - if (delta.as_millis() as i128 - passed.as_millis() as i128).abs() > 5 { - assert_eq!(delta, passed) - } -} diff --git a/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs deleted file mode 100644 index 3fc0fe133ab..00000000000 --- a/rust-runtime/aws-smithy-client/tests/reconnect_on_transient_error.rs +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -#![cfg(feature = "test-util")] - -mod test_operation; - -use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; -use aws_smithy_client::test_connection::wire_mock; -use aws_smithy_client::test_connection::wire_mock::{check_matches, RecordedEvent, ReplayedEvent}; -use aws_smithy_client::{hyper_ext, Builder}; -use aws_smithy_client::{match_events, Client}; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_types::retry::ReconnectMode; -use aws_smithy_types::timeout::{OperationTimeoutConfig, TimeoutConfig}; -use http::Uri; -use http_body::combinators::BoxBody; -use hyper::client::{Builder as HyperBuilder, HttpConnector}; -use std::convert::Infallible; -use std::time::Duration; -use test_operation::{TestOperationParser, TestRetryClassifier}; -use tower::layer::util::Identity; -use wire_mock::ev; - -fn end_of_test() -> &'static str { - "end_of_test" -} - -fn test_operation( - uri: Uri, - retryable: bool, -) -> Operation { - let mut req = operation::Request::new( - http::Request::builder() - .uri(uri) - .body(SdkBody::from("request body")) - .unwrap(), - ); - if !retryable { - req = req - .augment(|req, _conf| { - Ok::<_, Infallible>( - req.map(|_| SdkBody::from_dyn(BoxBody::new(SdkBody::from("body")))), - ) - }) - .unwrap(); - } - Operation::new(req, TestOperationParser).with_retry_classifier(TestRetryClassifier) -} - -async fn h1_and_h2(events: Vec, match_clause: impl Fn(&[RecordedEvent])) { - wire_level_test(events.clone(), |_b| {}, |b| b, &match_clause).await; - wire_level_test( - events, - |b| { - b.http2_only(true); - }, - |b| b, - match_clause, - ) - .await; - println!("h2 ok!"); -} - -/// Repeatedly send test operation until `end_of_test` is received -/// -/// When the test is over, match_clause is evaluated -async fn wire_level_test( - events: Vec, - hyper_builder_settings: impl Fn(&mut HyperBuilder), - client_builder_settings: impl Fn(Builder) -> Builder, - match_clause: impl Fn(&[RecordedEvent]), -) { - let connection = wire_mock::WireLevelTestConnection::spinup(events).await; - - let http_connector = HttpConnector::new_with_resolver(connection.dns_resolver()); - let mut hyper_builder = hyper::Client::builder(); - hyper_builder_settings(&mut hyper_builder); - let hyper_adapter = hyper_ext::Adapter::builder() - .hyper_builder(hyper_builder) - .build(http_connector); - let client = client_builder_settings( - Client::builder().reconnect_mode(ReconnectMode::ReconnectOnTransientError), - ) - .connector(hyper_adapter) - .middleware(Identity::new()) - .operation_timeout_config(OperationTimeoutConfig::from( - &TimeoutConfig::builder() - .operation_attempt_timeout(Duration::from_millis(100)) - .build(), - )) - .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) - .build(); - loop { - match client - .call(test_operation( - connection.endpoint_url().parse().unwrap(), - false, - )) - .await - { - Ok(resp) => { - tracing::info!("response: {:?}", resp); - if resp == end_of_test() { - break; - } - } - Err(e) => tracing::info!("error: {:?}", e), - } - } - let events = connection.events(); - match_clause(&events); -} - -#[tokio::test] -async fn non_transient_errors_no_reconect() { - h1_and_h2( - vec![ - ReplayedEvent::status(400), - ReplayedEvent::with_body(end_of_test()), - ], - match_events!(ev!(dns), ev!(connect), ev!(http(400)), ev!(http(200))), - ) - .await -} - -#[tokio::test] -async fn reestablish_dns_on_503() { - h1_and_h2( - vec![ - ReplayedEvent::status(503), - ReplayedEvent::status(503), - ReplayedEvent::status(503), - ReplayedEvent::with_body(end_of_test()), - ], - match_events!( - // first request - ev!(dns), - ev!(connect), - ev!(http(503)), - // second request - ev!(dns), - ev!(connect), - ev!(http(503)), - // third request - ev!(dns), - ev!(connect), - ev!(http(503)), - // all good - ev!(dns), - ev!(connect), - ev!(http(200)) - ), - ) - .await; -} - -#[tokio::test] -async fn connection_shared_on_success() { - h1_and_h2( - vec![ - ReplayedEvent::ok(), - ReplayedEvent::ok(), - ReplayedEvent::status(503), - ReplayedEvent::with_body(end_of_test()), - ], - match_events!( - ev!(dns), - ev!(connect), - ev!(http(200)), - ev!(http(200)), - ev!(http(503)), - ev!(dns), - ev!(connect), - ev!(http(200)) - ), - ) - .await; -} - -#[tokio::test] -async fn no_reconnect_when_disabled() { - use wire_mock::ev; - wire_level_test( - vec![ - ReplayedEvent::status(503), - ReplayedEvent::with_body(end_of_test()), - ], - |_b| {}, - |b| b.reconnect_mode(ReconnectMode::ReuseAllConnections), - match_events!(ev!(dns), ev!(connect), ev!(http(503)), ev!(http(200))), - ) - .await; -} - -#[tokio::test] -async fn connection_reestablished_after_timeout() { - use wire_mock::ev; - h1_and_h2( - vec![ - ReplayedEvent::ok(), - ReplayedEvent::Timeout, - ReplayedEvent::ok(), - ReplayedEvent::Timeout, - ReplayedEvent::with_body(end_of_test()), - ], - match_events!( - // first connection - ev!(dns), - ev!(connect), - ev!(http(200)), - // reuse but got a timeout - ev!(timeout), - // so we reconnect - ev!(dns), - ev!(connect), - ev!(http(200)), - ev!(timeout), - ev!(dns), - ev!(connect), - ev!(http(200)) - ), - ) - .await; -} diff --git a/rust-runtime/aws-smithy-client/tests/test_operation/mod.rs b/rust-runtime/aws-smithy-client/tests/test_operation/mod.rs deleted file mode 100644 index db193e4bd9b..00000000000 --- a/rust-runtime/aws-smithy-client/tests/test_operation/mod.rs +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_http::operation; -use aws_smithy_http::response::ParseHttpResponse; -use aws_smithy_http::result::SdkError; -use aws_smithy_http::retry::ClassifyRetry; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; -use bytes::Bytes; -use std::error::Error; -use std::fmt::{self, Debug, Display, Formatter}; -use std::str; - -#[derive(Clone)] -pub(super) struct TestOperationParser; - -#[derive(Debug)] -pub(super) struct OperationError(ErrorKind); - -impl Display for OperationError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{:?}", self) - } -} - -impl Error for OperationError {} - -impl ProvideErrorKind for OperationError { - fn retryable_error_kind(&self) -> Option { - Some(self.0) - } - - fn code(&self) -> Option<&str> { - None - } -} - -impl ParseHttpResponse for TestOperationParser { - type Output = Result; - - fn parse_unloaded(&self, response: &mut operation::Response) -> Option { - tracing::debug!("got response: {:?}", response); - match response.http().status() { - s if s.is_success() => None, - s if s.is_client_error() => Some(Err(OperationError(ErrorKind::ServerError))), - s if s.is_server_error() => Some(Err(OperationError(ErrorKind::TransientError))), - _ => panic!("unexpected status: {}", response.http().status()), - } - } - - fn parse_loaded(&self, response: &http::Response) -> Self::Output { - Ok(str::from_utf8(response.body().as_ref()) - .unwrap() - .to_string()) - } -} - -#[derive(Clone)] -pub(super) struct TestRetryClassifier; - -impl ClassifyRetry> for TestRetryClassifier -where - E: ProvideErrorKind + Debug, - T: Debug, -{ - fn classify_retry(&self, err: Result<&T, &SdkError>) -> RetryKind { - tracing::info!("got response: {:?}", err); - let kind = match err { - Err(SdkError::ServiceError(context)) => context.err().retryable_error_kind(), - Err(SdkError::DispatchFailure(err)) if err.is_timeout() => { - Some(ErrorKind::TransientError) - } - Err(SdkError::TimeoutError(_)) => Some(ErrorKind::TransientError), - Ok(_) => return RetryKind::Unnecessary, - _ => panic!("test handler only handles modeled errors got: {:?}", err), - }; - match kind { - Some(kind) => RetryKind::Error(kind), - None => RetryKind::UnretryableFailure, - } - } -} diff --git a/rust-runtime/aws-smithy-eventstream/Cargo.toml b/rust-runtime/aws-smithy-eventstream/Cargo.toml index c6a3e6782f1..6923fb9d7a1 100644 --- a/rust-runtime/aws-smithy-eventstream/Cargo.toml +++ b/rust-runtime/aws-smithy-eventstream/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "John DiSanti -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-eventstream/external-types.toml b/rust-runtime/aws-smithy-eventstream/external-types.toml index 2e54673ff5d..b6185a2ebf0 100644 --- a/rust-runtime/aws-smithy-eventstream/external-types.toml +++ b/rust-runtime/aws-smithy-eventstream/external-types.toml @@ -4,6 +4,6 @@ allowed_external_types = [ "bytes::buf::buf_mut::BufMut", "bytes::bytes::Bytes", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `derive-arbitrary` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `derive-arbitrary` feature "arbitrary::Arbitrary", ] diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs index 56ffed401bc..4a29be7ecf8 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs @@ -5,7 +5,7 @@ #![no_main] -use aws_smithy_eventstream::frame::Message; +use aws_smithy_eventstream::frame::read_message_from; use bytes::BufMut; use crc32fast::Hasher as Crc; use libfuzzer_sys::fuzz_target; @@ -30,7 +30,7 @@ fuzz_target!(|input: Input| { message.put_u32(crc(&message)); let mut data = &mut &message[..]; - let _ = Message::read_from(&mut data); + let _ = read_message_from(&mut data); }); fn crc(input: &[u8]) -> u32 { diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs index a39f1697ab6..c688da2c2df 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs @@ -5,7 +5,8 @@ #![no_main] -use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; +use aws_smithy_eventstream::frame::{read_message_from, write_message_to}; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use aws_smithy_types::DateTime; use bytes::{Buf, BufMut}; use crc32fast::Hasher as Crc; @@ -18,7 +19,7 @@ use libfuzzer_sys::{fuzz_mutator, fuzz_target}; // so that the fuzzer can actually explore the header parsing logic. fn mutate(data: &mut [u8], size: usize, max_size: usize) -> usize { let input = &mut &data[..size]; - let message = if let Ok(message) = Message::read_from(input) { + let message = if let Ok(message) = read_message_from(input) { message } else { Message::new(&b"some payload"[..]) @@ -44,7 +45,7 @@ fn mutate(data: &mut [u8], size: usize, max_size: usize) -> usize { }; let mut bytes = Vec::new(); - message.write_to(&mut bytes).unwrap(); + write_message_to(&message, &mut bytes).unwrap(); let headers_len = (&bytes[4..8]).get_u32(); let non_header_len = bytes.len() - headers_len as usize; @@ -72,7 +73,7 @@ fuzz_mutator!( fuzz_target!(|data: &[u8]| { let mut message = data; - let _ = Message::read_from(&mut message); + let _ = read_message_from(&mut message); }); fn crc(input: &[u8]) -> u32 { diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs index fde6f224d79..9c6810f2022 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs @@ -5,7 +5,8 @@ #![no_main] -use aws_smithy_eventstream::frame::{Header, HeaderValue, Message}; +use aws_smithy_eventstream::frame::{read_message_from, write_message_to}; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use bytes::{Buf, BufMut}; use crc32fast::Hasher as Crc; use libfuzzer_sys::fuzz_target; @@ -22,7 +23,7 @@ fuzz_target!(|input: Input| { .add_header(Header::new("str", HeaderValue::String("some str".into()))); let mut bytes = Vec::new(); - message.write_to(&mut bytes).unwrap(); + write_message_to(&message, &mut bytes).unwrap(); let headers_len = (&bytes[4..8]).get_u32(); let headers = &bytes[12..(12 + headers_len as usize)]; @@ -35,7 +36,7 @@ fuzz_target!(|input: Input| { mutated.put_slice(message.payload()); mutated.put_u32(crc(&mutated)); - let _ = Message::read_from(&mut &mutated[..]); + let _ = read_message_from(&mut &mutated[..]); }); fn crc(input: &[u8]) -> u32 { diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs index 3db2ca7d378..83979e9d109 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs @@ -5,10 +5,10 @@ #![no_main] -use aws_smithy_eventstream::frame::Message; +use aws_smithy_eventstream::frame::read_message_from; use libfuzzer_sys::fuzz_target; fuzz_target!(|data: &[u8]| { let mut message = data; - let _ = Message::read_from(&mut message); + let _ = read_message_from(&mut message); }); diff --git a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs index 2294985a0ac..9b754addbb0 100644 --- a/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs +++ b/rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs @@ -4,25 +4,23 @@ */ #![no_main] -use aws_smithy_eventstream::error::Error; -use aws_smithy_eventstream::frame::Message; +use aws_smithy_eventstream::arbitrary::ArbMessage; +use aws_smithy_eventstream::frame::{read_message_from, write_message_to}; use libfuzzer_sys::fuzz_target; -fuzz_target!(|message: Message| { +fuzz_target!(|message: ArbMessage| { + let message = message.into(); let mut buffer = Vec::new(); - match message.write_to(&mut buffer) { - Err( - Error::HeadersTooLong - | Error::PayloadTooLong - | Error::MessageTooLong - | Error::InvalidHeaderNameLength - | Error::TimestampValueTooLarge(_), - ) => {} - Err(err) => panic!("unexpected error on write: {}", err), + match write_message_to(&message, &mut buffer) { Ok(_) => { let mut data = &buffer[..]; - let parsed = Message::read_from(&mut data).unwrap(); + let parsed = read_message_from(&mut data).unwrap(); assert_eq!(message, parsed); } + Err(err) => { + if !err.is_invalid_message() { + panic!("unexpected error on write: {}", err), + } + } } }); diff --git a/rust-runtime/aws-smithy-eventstream/src/arbitrary.rs b/rust-runtime/aws-smithy-eventstream/src/arbitrary.rs new file mode 100644 index 00000000000..604c032c25d --- /dev/null +++ b/rust-runtime/aws-smithy-eventstream/src/arbitrary.rs @@ -0,0 +1,97 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Defines new-types wrapping inner types from `aws_smithy_types` to enable the `Arbitrary` trait +//! for fuzz testing. + +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; +use aws_smithy_types::str_bytes::StrBytes; +use aws_smithy_types::DateTime; +use bytes::Bytes; + +#[derive(Clone, Debug, PartialEq)] +pub struct ArbHeaderValue(HeaderValue); + +impl<'a> arbitrary::Arbitrary<'a> for ArbHeaderValue { + fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { + let value_type: u8 = unstruct.int_in_range(0..=9)?; + let header_value = match value_type { + crate::frame::TYPE_TRUE => HeaderValue::Bool(true), + crate::frame::TYPE_FALSE => HeaderValue::Bool(false), + crate::frame::TYPE_BYTE => HeaderValue::Byte(i8::arbitrary(unstruct)?), + crate::frame::TYPE_INT16 => HeaderValue::Int16(i16::arbitrary(unstruct)?), + crate::frame::TYPE_INT32 => HeaderValue::Int32(i32::arbitrary(unstruct)?), + crate::frame::TYPE_INT64 => HeaderValue::Int64(i64::arbitrary(unstruct)?), + crate::frame::TYPE_BYTE_ARRAY => { + HeaderValue::ByteArray(Bytes::from(Vec::::arbitrary(unstruct)?)) + } + crate::frame::TYPE_STRING => { + HeaderValue::String(StrBytes::from(String::arbitrary(unstruct)?)) + } + crate::frame::TYPE_TIMESTAMP => { + HeaderValue::Timestamp(DateTime::from_secs(i64::arbitrary(unstruct)?)) + } + crate::frame::TYPE_UUID => HeaderValue::Uuid(u128::arbitrary(unstruct)?), + _ => unreachable!(), + }; + Ok(ArbHeaderValue(header_value)) + } +} + +impl From for HeaderValue { + fn from(header_value: ArbHeaderValue) -> Self { + header_value.0 + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct ArbStrBytes(StrBytes); + +#[cfg(feature = "derive-arbitrary")] +impl<'a> arbitrary::Arbitrary<'a> for ArbStrBytes { + fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { + Ok(ArbStrBytes(String::arbitrary(unstruct)?.into())) + } +} + +impl From for StrBytes { + fn from(str_bytes: ArbStrBytes) -> Self { + str_bytes.0 + } +} + +#[derive(Clone, Debug, PartialEq, derive_arbitrary::Arbitrary)] +pub struct ArbHeader { + name: ArbStrBytes, + value: ArbHeaderValue, +} + +impl From for Header { + fn from(header: ArbHeader) -> Self { + Self::new(header.name, header.value) + } +} + +#[derive(Clone, Debug, PartialEq)] +pub struct ArbMessage(Message); + +impl<'a> arbitrary::Arbitrary<'a> for ArbMessage { + fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { + let headers: Vec = unstruct + .arbitrary_iter()? + .collect::>()?; + let message = Message::new_from_parts( + headers.into_iter().map(Into::into).collect(), + Bytes::from(Vec::::arbitrary(unstruct)?), + ); + Ok(ArbMessage(message)) + } +} + +impl From for Message { + fn from(message: ArbMessage) -> Self { + message.0 + } +} diff --git a/rust-runtime/aws-smithy-eventstream/src/error.rs b/rust-runtime/aws-smithy-eventstream/src/error.rs index bda5ff900d7..99cb4ba759f 100644 --- a/rust-runtime/aws-smithy-eventstream/src/error.rs +++ b/rust-runtime/aws-smithy-eventstream/src/error.rs @@ -51,6 +51,20 @@ impl Error { kind: ErrorKind::Unmarshalling(message.into()), } } + + /// Returns true if the error is one generated during serialization + pub fn is_invalid_message(&self) -> bool { + use ErrorKind::*; + matches!( + self.kind, + HeadersTooLong + | PayloadTooLong + | MessageTooLong + | InvalidHeaderNameLength + | TimestampValueTooLarge(_) + | Marshalling(_) + ) + } } impl From for Error { diff --git a/rust-runtime/aws-smithy-eventstream/src/frame.rs b/rust-runtime/aws-smithy-eventstream/src/frame.rs index 202e410827a..eb2bb1707c5 100644 --- a/rust-runtime/aws-smithy-eventstream/src/frame.rs +++ b/rust-runtime/aws-smithy-eventstream/src/frame.rs @@ -8,8 +8,11 @@ use crate::buf::count::CountBuf; use crate::buf::crc::{CrcBuf, CrcBufMut}; use crate::error::{Error, ErrorKind}; -use crate::str_bytes::StrBytes; -use bytes::{Buf, BufMut, Bytes}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; +use aws_smithy_types::str_bytes::StrBytes; +use aws_smithy_types::DateTime; +use bytes::{Buf, BufMut}; use std::convert::{TryFrom, TryInto}; use std::error::Error as StdError; use std::fmt; @@ -22,6 +25,17 @@ const MESSAGE_CRC_LENGTH_BYTES: u32 = size_of::() as u32; const MAX_HEADER_NAME_LEN: usize = 255; const MIN_HEADER_LEN: usize = 2; +pub(crate) const TYPE_TRUE: u8 = 0; +pub(crate) const TYPE_FALSE: u8 = 1; +pub(crate) const TYPE_BYTE: u8 = 2; +pub(crate) const TYPE_INT16: u8 = 3; +pub(crate) const TYPE_INT32: u8 = 4; +pub(crate) const TYPE_INT64: u8 = 5; +pub(crate) const TYPE_BYTE_ARRAY: u8 = 6; +pub(crate) const TYPE_STRING: u8 = 7; +pub(crate) const TYPE_TIMESTAMP: u8 = 8; +pub(crate) const TYPE_UUID: u8 = 9; + pub type SignMessageError = Box; /// Signs an Event Stream message. @@ -168,451 +182,242 @@ pub trait UnmarshallMessage: fmt::Debug { ) -> Result, Error>; } -mod value { - use crate::error::{Error, ErrorKind}; - use crate::frame::checked; - use crate::str_bytes::StrBytes; - use aws_smithy_types::DateTime; - use bytes::{Buf, BufMut, Bytes}; - use std::convert::TryInto; - use std::mem::size_of; - - const TYPE_TRUE: u8 = 0; - const TYPE_FALSE: u8 = 1; - const TYPE_BYTE: u8 = 2; - const TYPE_INT16: u8 = 3; - const TYPE_INT32: u8 = 4; - const TYPE_INT64: u8 = 5; - const TYPE_BYTE_ARRAY: u8 = 6; - const TYPE_STRING: u8 = 7; - const TYPE_TIMESTAMP: u8 = 8; - const TYPE_UUID: u8 = 9; - - /// Event Stream frame header value. - #[non_exhaustive] - #[derive(Clone, Debug, PartialEq)] - pub enum HeaderValue { - Bool(bool), - Byte(i8), - Int16(i16), - Int32(i32), - Int64(i64), - ByteArray(Bytes), - String(StrBytes), - Timestamp(DateTime), - Uuid(u128), - } - - impl HeaderValue { - pub fn as_bool(&self) -> Result { - match self { - HeaderValue::Bool(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_byte(&self) -> Result { - match self { - HeaderValue::Byte(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_int16(&self) -> Result { - match self { - HeaderValue::Int16(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_int32(&self) -> Result { - match self { - HeaderValue::Int32(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_int64(&self) -> Result { - match self { - HeaderValue::Int64(value) => Ok(*value), - _ => Err(self), - } - } - - pub fn as_byte_array(&self) -> Result<&Bytes, &Self> { - match self { - HeaderValue::ByteArray(value) => Ok(value), - _ => Err(self), - } - } - - pub fn as_string(&self) -> Result<&StrBytes, &Self> { - match self { - HeaderValue::String(value) => Ok(value), - _ => Err(self), - } - } - - pub fn as_timestamp(&self) -> Result { - match self { - HeaderValue::Timestamp(value) => Ok(*value), - _ => Err(self), - } +macro_rules! read_value { + ($buf:ident, $typ:ident, $size_typ:ident, $read_fn:ident) => { + if $buf.remaining() >= size_of::<$size_typ>() { + Ok(HeaderValue::$typ($buf.$read_fn())) + } else { + Err(ErrorKind::InvalidHeaderValue.into()) } + }; +} - pub fn as_uuid(&self) -> Result { - match self { - HeaderValue::Uuid(value) => Ok(*value), - _ => Err(self), +fn read_header_value_from(mut buffer: B) -> Result { + let value_type = buffer.get_u8(); + match value_type { + TYPE_TRUE => Ok(HeaderValue::Bool(true)), + TYPE_FALSE => Ok(HeaderValue::Bool(false)), + TYPE_BYTE => read_value!(buffer, Byte, i8, get_i8), + TYPE_INT16 => read_value!(buffer, Int16, i16, get_i16), + TYPE_INT32 => read_value!(buffer, Int32, i32, get_i32), + TYPE_INT64 => read_value!(buffer, Int64, i64, get_i64), + TYPE_BYTE_ARRAY | TYPE_STRING => { + if buffer.remaining() > size_of::() { + let len = buffer.get_u16() as usize; + if buffer.remaining() < len { + return Err(ErrorKind::InvalidHeaderValue.into()); + } + let bytes = buffer.copy_to_bytes(len); + if value_type == TYPE_STRING { + Ok(HeaderValue::String( + bytes.try_into().map_err(|_| ErrorKind::InvalidUtf8String)?, + )) + } else { + Ok(HeaderValue::ByteArray(bytes)) + } + } else { + Err(ErrorKind::InvalidHeaderValue.into()) } } - } - - macro_rules! read_value { - ($buf:ident, $typ:ident, $size_typ:ident, $read_fn:ident) => { - if $buf.remaining() >= size_of::<$size_typ>() { - Ok(HeaderValue::$typ($buf.$read_fn())) + TYPE_TIMESTAMP => { + if buffer.remaining() >= size_of::() { + let epoch_millis = buffer.get_i64(); + Ok(HeaderValue::Timestamp(DateTime::from_millis(epoch_millis))) } else { Err(ErrorKind::InvalidHeaderValue.into()) } - }; + } + TYPE_UUID => read_value!(buffer, Uuid, u128, get_u128), + _ => Err(ErrorKind::InvalidHeaderValueType(value_type).into()), } +} - impl HeaderValue { - pub(super) fn read_from(mut buffer: B) -> Result { - let value_type = buffer.get_u8(); - match value_type { - TYPE_TRUE => Ok(HeaderValue::Bool(true)), - TYPE_FALSE => Ok(HeaderValue::Bool(false)), - TYPE_BYTE => read_value!(buffer, Byte, i8, get_i8), - TYPE_INT16 => read_value!(buffer, Int16, i16, get_i16), - TYPE_INT32 => read_value!(buffer, Int32, i32, get_i32), - TYPE_INT64 => read_value!(buffer, Int64, i64, get_i64), - TYPE_BYTE_ARRAY | TYPE_STRING => { - if buffer.remaining() > size_of::() { - let len = buffer.get_u16() as usize; - if buffer.remaining() < len { - return Err(ErrorKind::InvalidHeaderValue.into()); - } - let bytes = buffer.copy_to_bytes(len); - if value_type == TYPE_STRING { - Ok(HeaderValue::String( - bytes.try_into().map_err(|_| ErrorKind::InvalidUtf8String)?, - )) - } else { - Ok(HeaderValue::ByteArray(bytes)) - } - } else { - Err(ErrorKind::InvalidHeaderValue.into()) - } - } - TYPE_TIMESTAMP => { - if buffer.remaining() >= size_of::() { - let epoch_millis = buffer.get_i64(); - Ok(HeaderValue::Timestamp(DateTime::from_millis(epoch_millis))) - } else { - Err(ErrorKind::InvalidHeaderValue.into()) - } - } - TYPE_UUID => read_value!(buffer, Uuid, u128, get_u128), - _ => Err(ErrorKind::InvalidHeaderValueType(value_type).into()), - } +fn write_header_value_to(value: &HeaderValue, mut buffer: B) -> Result<(), Error> { + use HeaderValue::*; + match value { + Bool(val) => buffer.put_u8(if *val { TYPE_TRUE } else { TYPE_FALSE }), + Byte(val) => { + buffer.put_u8(TYPE_BYTE); + buffer.put_i8(*val); + } + Int16(val) => { + buffer.put_u8(TYPE_INT16); + buffer.put_i16(*val); + } + Int32(val) => { + buffer.put_u8(TYPE_INT32); + buffer.put_i32(*val); + } + Int64(val) => { + buffer.put_u8(TYPE_INT64); + buffer.put_i64(*val); + } + ByteArray(val) => { + buffer.put_u8(TYPE_BYTE_ARRAY); + buffer.put_u16(checked(val.len(), ErrorKind::HeaderValueTooLong.into())?); + buffer.put_slice(&val[..]); + } + String(val) => { + buffer.put_u8(TYPE_STRING); + buffer.put_u16(checked( + val.as_bytes().len(), + ErrorKind::HeaderValueTooLong.into(), + )?); + buffer.put_slice(&val.as_bytes()[..]); + } + Timestamp(time) => { + buffer.put_u8(TYPE_TIMESTAMP); + buffer.put_i64( + time.to_millis() + .map_err(|_| ErrorKind::TimestampValueTooLarge(*time))?, + ); } - - pub(super) fn write_to(&self, mut buffer: B) -> Result<(), Error> { - use HeaderValue::*; - match self { - Bool(val) => buffer.put_u8(if *val { TYPE_TRUE } else { TYPE_FALSE }), - Byte(val) => { - buffer.put_u8(TYPE_BYTE); - buffer.put_i8(*val); - } - Int16(val) => { - buffer.put_u8(TYPE_INT16); - buffer.put_i16(*val); - } - Int32(val) => { - buffer.put_u8(TYPE_INT32); - buffer.put_i32(*val); - } - Int64(val) => { - buffer.put_u8(TYPE_INT64); - buffer.put_i64(*val); - } - ByteArray(val) => { - buffer.put_u8(TYPE_BYTE_ARRAY); - buffer.put_u16(checked(val.len(), ErrorKind::HeaderValueTooLong.into())?); - buffer.put_slice(&val[..]); - } - String(val) => { - buffer.put_u8(TYPE_STRING); - buffer.put_u16(checked( - val.as_bytes().len(), - ErrorKind::HeaderValueTooLong.into(), - )?); - buffer.put_slice(&val.as_bytes()[..]); - } - Timestamp(time) => { - buffer.put_u8(TYPE_TIMESTAMP); - buffer.put_i64( - time.to_millis() - .map_err(|_| ErrorKind::TimestampValueTooLarge(*time))?, - ); - } - Uuid(val) => { - buffer.put_u8(TYPE_UUID); - buffer.put_u128(*val); - } - } - Ok(()) + Uuid(val) => { + buffer.put_u8(TYPE_UUID); + buffer.put_u128(*val); } - } - - #[cfg(feature = "derive-arbitrary")] - impl<'a> arbitrary::Arbitrary<'a> for HeaderValue { - fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { - let value_type: u8 = unstruct.int_in_range(0..=9)?; - Ok(match value_type { - TYPE_TRUE => HeaderValue::Bool(true), - TYPE_FALSE => HeaderValue::Bool(false), - TYPE_BYTE => HeaderValue::Byte(i8::arbitrary(unstruct)?), - TYPE_INT16 => HeaderValue::Int16(i16::arbitrary(unstruct)?), - TYPE_INT32 => HeaderValue::Int32(i32::arbitrary(unstruct)?), - TYPE_INT64 => HeaderValue::Int64(i64::arbitrary(unstruct)?), - TYPE_BYTE_ARRAY => { - HeaderValue::ByteArray(Bytes::from(Vec::::arbitrary(unstruct)?)) - } - TYPE_STRING => HeaderValue::String(StrBytes::from(String::arbitrary(unstruct)?)), - TYPE_TIMESTAMP => { - HeaderValue::Timestamp(DateTime::from_secs(i64::arbitrary(unstruct)?)) - } - TYPE_UUID => HeaderValue::Uuid(u128::arbitrary(unstruct)?), - _ => unreachable!(), - }) + _ => { + panic!("matched on unexpected variant in `aws_smithy_types::event_stream::HeaderValue`") } } + Ok(()) } -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -pub use value::HeaderValue; - -/// Event Stream header. -#[non_exhaustive] -#[derive(Clone, Debug, PartialEq)] -#[cfg_attr(feature = "derive-arbitrary", derive(derive_arbitrary::Arbitrary))] -pub struct Header { - name: StrBytes, - value: HeaderValue, -} - -impl Header { - /// Creates a new header with the given `name` and `value`. - pub fn new(name: impl Into, value: HeaderValue) -> Header { - Header { - name: name.into(), - value, - } - } - - /// Returns the header name. - pub fn name(&self) -> &StrBytes { - &self.name +/// Reads a header from the given `buffer`. +fn read_header_from(mut buffer: B) -> Result<(Header, usize), Error> { + if buffer.remaining() < MIN_HEADER_LEN { + return Err(ErrorKind::InvalidHeadersLength.into()); } - /// Returns the header value. - pub fn value(&self) -> &HeaderValue { - &self.value + let mut counting_buf = CountBuf::new(&mut buffer); + let name_len = counting_buf.get_u8(); + if name_len as usize >= counting_buf.remaining() { + return Err(ErrorKind::InvalidHeaderNameLength.into()); } - /// Reads a header from the given `buffer`. - fn read_from(mut buffer: B) -> Result<(Header, usize), Error> { - if buffer.remaining() < MIN_HEADER_LEN { - return Err(ErrorKind::InvalidHeadersLength.into()); - } - - let mut counting_buf = CountBuf::new(&mut buffer); - let name_len = counting_buf.get_u8(); - if name_len as usize >= counting_buf.remaining() { - return Err(ErrorKind::InvalidHeaderNameLength.into()); - } + let name: StrBytes = counting_buf + .copy_to_bytes(name_len as usize) + .try_into() + .map_err(|_| ErrorKind::InvalidUtf8String)?; + let value = read_header_value_from(&mut counting_buf)?; + Ok((Header::new(name, value), counting_buf.into_count())) +} - let name: StrBytes = counting_buf - .copy_to_bytes(name_len as usize) - .try_into() - .map_err(|_| ErrorKind::InvalidUtf8String)?; - let value = HeaderValue::read_from(&mut counting_buf)?; - Ok((Header::new(name, value), counting_buf.into_count())) +/// Writes the header to the given `buffer`. +fn write_header_to(header: &Header, mut buffer: B) -> Result<(), Error> { + if header.name().as_bytes().len() > MAX_HEADER_NAME_LEN { + return Err(ErrorKind::InvalidHeaderNameLength.into()); } - /// Writes the header to the given `buffer`. - fn write_to(&self, mut buffer: B) -> Result<(), Error> { - if self.name.as_bytes().len() > MAX_HEADER_NAME_LEN { - return Err(ErrorKind::InvalidHeaderNameLength.into()); - } - - buffer.put_u8(u8::try_from(self.name.as_bytes().len()).expect("bounds check above")); - buffer.put_slice(&self.name.as_bytes()[..]); - self.value.write_to(buffer) - } + buffer.put_u8(u8::try_from(header.name().as_bytes().len()).expect("bounds check above")); + buffer.put_slice(&header.name().as_bytes()[..]); + write_header_value_to(header.value(), buffer) } /// Writes the given `headers` to a `buffer`. pub fn write_headers_to(headers: &[Header], mut buffer: B) -> Result<(), Error> { for header in headers { - header.write_to(&mut buffer)?; + write_header_to(header, &mut buffer)?; } Ok(()) } -/// Event Stream message. -#[non_exhaustive] -#[derive(Clone, Debug, PartialEq)] -pub struct Message { - headers: Vec

, - payload: Bytes, -} - -impl Message { - /// Creates a new message with the given `payload`. Headers can be added later. - pub fn new(payload: impl Into) -> Message { - Message { - headers: Vec::new(), - payload: payload.into(), - } - } +// Returns (total_len, header_len) +fn read_prelude_from(mut buffer: B) -> Result<(u32, u32), Error> { + let mut crc_buffer = CrcBuf::new(&mut buffer); - /// Creates a message with the given `headers` and `payload`. - pub fn new_from_parts(headers: Vec
, payload: impl Into) -> Self { - Self { - headers, - payload: payload.into(), - } + // If the buffer doesn't have the entire, then error + let total_len = crc_buffer.get_u32(); + if crc_buffer.remaining() + size_of::() < total_len as usize { + return Err(ErrorKind::InvalidMessageLength.into()); } - /// Adds a header to the message. - pub fn add_header(mut self, header: Header) -> Self { - self.headers.push(header); - self + // Validate the prelude + let header_len = crc_buffer.get_u32(); + let (expected_crc, prelude_crc) = (crc_buffer.into_crc(), buffer.get_u32()); + if expected_crc != prelude_crc { + return Err(ErrorKind::PreludeChecksumMismatch(expected_crc, prelude_crc).into()); } - - /// Returns all headers. - pub fn headers(&self) -> &[Header] { - &self.headers + // The header length can be 0 or >= 2, but must fit within the frame size + if header_len == 1 || header_len > max_header_len(total_len)? { + return Err(ErrorKind::InvalidHeadersLength.into()); } + Ok((total_len, header_len)) +} - /// Returns the payload bytes. - pub fn payload(&self) -> &Bytes { - &self.payload +/// Reads a message from the given `buffer`. For streaming use cases, use +/// the [`MessageFrameDecoder`] instead of this. +pub fn read_message_from(mut buffer: B) -> Result { + if buffer.remaining() < PRELUDE_LENGTH_BYTES_USIZE { + return Err(ErrorKind::InvalidMessageLength.into()); } - // Returns (total_len, header_len) - fn read_prelude_from(mut buffer: B) -> Result<(u32, u32), Error> { - let mut crc_buffer = CrcBuf::new(&mut buffer); + // Calculate a CRC as we go and read the prelude + let mut crc_buffer = CrcBuf::new(&mut buffer); + let (total_len, header_len) = read_prelude_from(&mut crc_buffer)?; - // If the buffer doesn't have the entire, then error - let total_len = crc_buffer.get_u32(); - if crc_buffer.remaining() + size_of::() < total_len as usize { - return Err(ErrorKind::InvalidMessageLength.into()); - } - - // Validate the prelude - let header_len = crc_buffer.get_u32(); - let (expected_crc, prelude_crc) = (crc_buffer.into_crc(), buffer.get_u32()); - if expected_crc != prelude_crc { - return Err(ErrorKind::PreludeChecksumMismatch(expected_crc, prelude_crc).into()); - } - // The header length can be 0 or >= 2, but must fit within the frame size - if header_len == 1 || header_len > max_header_len(total_len)? { - return Err(ErrorKind::InvalidHeadersLength.into()); - } - Ok((total_len, header_len)) + // Verify we have the full frame before continuing + let remaining_len = total_len + .checked_sub(PRELUDE_LENGTH_BYTES) + .ok_or_else(|| Error::from(ErrorKind::InvalidMessageLength))?; + if crc_buffer.remaining() < remaining_len as usize { + return Err(ErrorKind::InvalidMessageLength.into()); } - /// Reads a message from the given `buffer`. For streaming use cases, use - /// the [`MessageFrameDecoder`] instead of this. - pub fn read_from(mut buffer: B) -> Result { - if buffer.remaining() < PRELUDE_LENGTH_BYTES_USIZE { - return Err(ErrorKind::InvalidMessageLength.into()); - } - - // Calculate a CRC as we go and read the prelude - let mut crc_buffer = CrcBuf::new(&mut buffer); - let (total_len, header_len) = Self::read_prelude_from(&mut crc_buffer)?; - - // Verify we have the full frame before continuing - let remaining_len = total_len - .checked_sub(PRELUDE_LENGTH_BYTES) - .ok_or_else(|| Error::from(ErrorKind::InvalidMessageLength))?; - if crc_buffer.remaining() < remaining_len as usize { - return Err(ErrorKind::InvalidMessageLength.into()); - } - - // Read headers - let mut header_bytes_read = 0; - let mut headers = Vec::new(); - while header_bytes_read < header_len as usize { - let (header, bytes_read) = Header::read_from(&mut crc_buffer)?; - header_bytes_read += bytes_read; - if header_bytes_read > header_len as usize { - return Err(ErrorKind::InvalidHeaderValue.into()); - } - headers.push(header); - } - - // Read payload - let payload_len = payload_len(total_len, header_len)?; - let payload = crc_buffer.copy_to_bytes(payload_len as usize); - - let expected_crc = crc_buffer.into_crc(); - let message_crc = buffer.get_u32(); - if expected_crc != message_crc { - return Err(ErrorKind::MessageChecksumMismatch(expected_crc, message_crc).into()); + // Read headers + let mut header_bytes_read = 0; + let mut headers = Vec::new(); + while header_bytes_read < header_len as usize { + let (header, bytes_read) = read_header_from(&mut crc_buffer)?; + header_bytes_read += bytes_read; + if header_bytes_read > header_len as usize { + return Err(ErrorKind::InvalidHeaderValue.into()); } - - Ok(Message { headers, payload }) + headers.push(header); } - /// Writes the message to the given `buffer`. - pub fn write_to(&self, buffer: &mut dyn BufMut) -> Result<(), Error> { - let mut headers = Vec::new(); - for header in &self.headers { - header.write_to(&mut headers)?; - } + // Read payload + let payload_len = payload_len(total_len, header_len)?; + let payload = crc_buffer.copy_to_bytes(payload_len as usize); - let headers_len = checked(headers.len(), ErrorKind::HeadersTooLong.into())?; - let payload_len = checked(self.payload.len(), ErrorKind::PayloadTooLong.into())?; - let message_len = [ - PRELUDE_LENGTH_BYTES, - headers_len, - payload_len, - MESSAGE_CRC_LENGTH_BYTES, - ] - .iter() - .try_fold(0u32, |acc, v| { - acc.checked_add(*v) - .ok_or_else(|| Error::from(ErrorKind::MessageTooLong)) - })?; - - let mut crc_buffer = CrcBufMut::new(buffer); - crc_buffer.put_u32(message_len); - crc_buffer.put_u32(headers_len); - crc_buffer.put_crc(); - crc_buffer.put(&headers[..]); - crc_buffer.put(&self.payload[..]); - crc_buffer.put_crc(); - Ok(()) + let expected_crc = crc_buffer.into_crc(); + let message_crc = buffer.get_u32(); + if expected_crc != message_crc { + return Err(ErrorKind::MessageChecksumMismatch(expected_crc, message_crc).into()); } + + Ok(Message::new_from_parts(headers, payload)) } -#[cfg(feature = "derive-arbitrary")] -impl<'a> arbitrary::Arbitrary<'a> for Message { - fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { - let headers: arbitrary::Result> = unstruct.arbitrary_iter()?.collect(); - Ok(Message { - headers: headers?, - payload: Bytes::from(Vec::::arbitrary(unstruct)?), - }) - } +/// Writes the `message` to the given `buffer`. +pub fn write_message_to(message: &Message, buffer: &mut dyn BufMut) -> Result<(), Error> { + let mut headers = Vec::new(); + for header in message.headers() { + write_header_to(header, &mut headers)?; + } + + let headers_len = checked(headers.len(), ErrorKind::HeadersTooLong.into())?; + let payload_len = checked(message.payload().len(), ErrorKind::PayloadTooLong.into())?; + let message_len = [ + PRELUDE_LENGTH_BYTES, + headers_len, + payload_len, + MESSAGE_CRC_LENGTH_BYTES, + ] + .iter() + .try_fold(0u32, |acc, v| { + acc.checked_add(*v) + .ok_or_else(|| Error::from(ErrorKind::MessageTooLong)) + })?; + + let mut crc_buffer = CrcBufMut::new(buffer); + crc_buffer.put_u32(message_len); + crc_buffer.put_u32(headers_len); + crc_buffer.put_crc(); + crc_buffer.put(&headers[..]); + crc_buffer.put(&message.payload()[..]); + crc_buffer.put_crc(); + Ok(()) } fn checked, U>(from: U, err: Error) -> Result { @@ -637,14 +442,15 @@ fn payload_len(total_len: u32, header_len: u32) -> Result { #[cfg(test)] mod message_tests { + use super::read_message_from; use crate::error::ErrorKind; - use crate::frame::{Header, HeaderValue, Message}; + use crate::frame::{write_message_to, Header, HeaderValue, Message}; use aws_smithy_types::DateTime; use bytes::Bytes; macro_rules! read_message_expect_err { ($bytes:expr, $err:pat) => { - let result = Message::read_from(&mut Bytes::from_static($bytes)); + let result = read_message_from(&mut Bytes::from_static($bytes)); let result = result.as_ref(); assert!(result.is_err(), "Expected error, got {:?}", result); assert!( @@ -702,11 +508,11 @@ mod message_tests { 0x36, ]; - let result = Message::read_from(&mut Bytes::from_static(data)).unwrap(); + let result = read_message_from(&mut Bytes::from_static(data)).unwrap(); assert_eq!(result.headers(), Vec::new()); let expected_payload = b"{'foo':'bar'}"; - assert_eq!(expected_payload, result.payload.as_ref()); + assert_eq!(expected_payload, result.payload().as_ref()); } #[test] @@ -721,7 +527,7 @@ mod message_tests { 0x7d, 0x8D, 0x9C, 0x08, 0xB1, ]; - let result = Message::read_from(&mut Bytes::from_static(data)).unwrap(); + let result = read_message_from(&mut Bytes::from_static(data)).unwrap(); assert_eq!( result.headers(), vec![Header::new( @@ -731,13 +537,13 @@ mod message_tests { ); let expected_payload = b"{'foo':'bar'}"; - assert_eq!(expected_payload, result.payload.as_ref()); + assert_eq!(expected_payload, result.payload().as_ref()); } #[test] fn read_all_headers_and_payload() { let message = include_bytes!("../test_data/valid_with_all_headers_and_payload"); - let result = Message::read_from(&mut Bytes::from_static(message)).unwrap(); + let result = read_message_from(&mut Bytes::from_static(message)).unwrap(); assert_eq!( result.headers(), vec![ @@ -763,7 +569,7 @@ mod message_tests { ] ); - assert_eq!(b"some payload", result.payload.as_ref()); + assert_eq!(b"some payload", result.payload().as_ref()); } #[test] @@ -790,14 +596,14 @@ mod message_tests { )); let mut actual = Vec::new(); - message.write_to(&mut actual).unwrap(); + write_message_to(&message, &mut actual).unwrap(); let expected = include_bytes!("../test_data/valid_with_all_headers_and_payload").to_vec(); assert_eq!(expected, actual); - let result = Message::read_from(&mut Bytes::from(actual)).unwrap(); + let result = read_message_from(&mut Bytes::from(actual)).unwrap(); assert_eq!(message.headers(), result.headers()); - assert_eq!(message.payload().as_ref(), result.payload.as_ref()); + assert_eq!(message.payload().as_ref(), result.payload().as_ref()); } } @@ -866,7 +672,7 @@ impl MessageFrameDecoder { if let Some(remaining_len) = self.remaining_bytes_if_frame_available(&buffer)? { let mut message_buf = (&self.prelude[..]).chain(buffer.take(remaining_len)); - let result = Message::read_from(&mut message_buf).map(DecodedFrame::Complete); + let result = read_message_from(&mut message_buf).map(DecodedFrame::Complete); self.reset(); return result; } @@ -878,7 +684,7 @@ impl MessageFrameDecoder { #[cfg(test)] mod message_frame_decoder_tests { use super::{DecodedFrame, MessageFrameDecoder}; - use crate::frame::Message; + use crate::frame::read_message_from; use bytes::Bytes; use bytes_utils::SegmentedBuf; @@ -899,7 +705,7 @@ mod message_frame_decoder_tests { match decoder.decode_frame(&mut segmented).unwrap() { DecodedFrame::Incomplete => panic!("frame should be complete now"), DecodedFrame::Complete(actual) => { - let expected = Message::read_from(&mut Bytes::from_static(message)).unwrap(); + let expected = read_message_from(&mut Bytes::from_static(message)).unwrap(); assert_eq!(expected, actual); } } @@ -926,9 +732,9 @@ mod message_frame_decoder_tests { } } - let expected1 = Message::read_from(&mut Bytes::from_static(message1)).unwrap(); - let expected2 = Message::read_from(&mut Bytes::from_static(message2)).unwrap(); - let expected3 = Message::read_from(&mut Bytes::from_static(message3)).unwrap(); + let expected1 = read_message_from(&mut Bytes::from_static(message1)).unwrap(); + let expected2 = read_message_from(&mut Bytes::from_static(message2)).unwrap(); + let expected3 = read_message_from(&mut Bytes::from_static(message3)).unwrap(); assert_eq!(3, decoded.len()); assert_eq!(expected1, decoded[0]); assert_eq!(expected2, decoded[1]); diff --git a/rust-runtime/aws-smithy-eventstream/src/lib.rs b/rust-runtime/aws-smithy-eventstream/src/lib.rs index 0d060b914e3..5171471d2f2 100644 --- a/rust-runtime/aws-smithy-eventstream/src/lib.rs +++ b/rust-runtime/aws-smithy-eventstream/src/lib.rs @@ -13,8 +13,9 @@ //! AWS Event Stream frame serialization/deserialization implementation. +#[cfg(feature = "derive-arbitrary")] +pub mod arbitrary; mod buf; pub mod error; pub mod frame; pub mod smithy; -pub mod str_bytes; diff --git a/rust-runtime/aws-smithy-eventstream/src/smithy.rs b/rust-runtime/aws-smithy-eventstream/src/smithy.rs index 3a076d7eb20..d939602533c 100644 --- a/rust-runtime/aws-smithy-eventstream/src/smithy.rs +++ b/rust-runtime/aws-smithy-eventstream/src/smithy.rs @@ -4,8 +4,8 @@ */ use crate::error::{Error, ErrorKind}; -use crate::frame::{Header, HeaderValue, Message}; -use crate::str_bytes::StrBytes; +use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; +use aws_smithy_types::str_bytes::StrBytes; use aws_smithy_types::{Blob, DateTime}; macro_rules! expect_shape_fn { @@ -125,7 +125,7 @@ pub fn parse_response_headers(message: &Message) -> Result, #[cfg(test)] mod tests { use super::parse_response_headers; - use crate::frame::{Header, HeaderValue, Message}; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; #[test] fn normal_message() { diff --git a/rust-runtime/aws-smithy-http-auth/Cargo.toml b/rust-runtime/aws-smithy-http-auth/Cargo.toml index 0d70b25eec7..67de7ed7e1e 100644 --- a/rust-runtime/aws-smithy-http-auth/Cargo.toml +++ b/rust-runtime/aws-smithy-http-auth/Cargo.toml @@ -5,13 +5,12 @@ authors = [ "AWS Rust SDK Team ", "Eduardo Rodrigues <16357187+eduardomourar@users.noreply.github.com>", ] -description = "Smithy HTTP logic for smithy-rs." +description = "This crate is no longer used by smithy-rs and is deprecated." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [dependencies] -zeroize = "1" [package.metadata.docs.rs] all-features = true diff --git a/rust-runtime/aws-smithy-http-auth/README.md b/rust-runtime/aws-smithy-http-auth/README.md index 1d963cafce0..719b5202d37 100644 --- a/rust-runtime/aws-smithy-http-auth/README.md +++ b/rust-runtime/aws-smithy-http-auth/README.md @@ -1,7 +1,7 @@ # aws-smithy-http-auth -HTTP Auth implementation for service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs). +This crate is no longer used by smithy-rs and is deprecated. Its equivalent logic is now in aws-smithy-runtime-api and aws-smithy-runtime. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-auth/src/api_key.rs b/rust-runtime/aws-smithy-http-auth/src/api_key.rs deleted file mode 100644 index bb2ab65b3c5..00000000000 --- a/rust-runtime/aws-smithy-http-auth/src/api_key.rs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Auth API Key - -use std::cmp::PartialEq; -use std::fmt::Debug; -use std::sync::Arc; -use zeroize::Zeroizing; - -/// Authentication configuration to connect to a Smithy Service -#[derive(Clone, Eq, PartialEq)] -pub struct AuthApiKey(Arc); - -#[derive(Clone, Eq, PartialEq)] -struct Inner { - api_key: Zeroizing, -} - -impl Debug for AuthApiKey { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let mut auth_api_key = f.debug_struct("AuthApiKey"); - auth_api_key.field("api_key", &"** redacted **").finish() - } -} - -impl AuthApiKey { - /// Constructs a new API key. - pub fn new(api_key: impl Into) -> Self { - Self(Arc::new(Inner { - api_key: Zeroizing::new(api_key.into()), - })) - } - - /// Returns the underlying api key. - pub fn api_key(&self) -> &str { - &self.0.api_key - } -} - -impl From<&str> for AuthApiKey { - fn from(api_key: &str) -> Self { - Self::from(api_key.to_owned()) - } -} - -impl From for AuthApiKey { - fn from(api_key: String) -> Self { - Self(Arc::new(Inner { - api_key: Zeroizing::new(api_key), - })) - } -} - -#[cfg(test)] -mod tests { - use super::AuthApiKey; - - #[test] - fn api_key_is_equal() { - let api_key_a: AuthApiKey = "some-api-key".into(); - let api_key_b = AuthApiKey::new("some-api-key"); - assert_eq!(api_key_a, api_key_b); - } - - #[test] - fn api_key_is_different() { - let api_key_a = AuthApiKey::new("some-api-key"); - let api_key_b: AuthApiKey = String::from("another-api-key").into(); - assert_ne!(api_key_a, api_key_b); - } -} diff --git a/rust-runtime/aws-smithy-http-auth/src/definition.rs b/rust-runtime/aws-smithy-http-auth/src/definition.rs deleted file mode 100644 index 918f6aae8f3..00000000000 --- a/rust-runtime/aws-smithy-http-auth/src/definition.rs +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Auth Definition - -use crate::location::HttpAuthLocation; -use std::cmp::PartialEq; -use std::fmt::Debug; - -/// A HTTP-specific authentication scheme that sends an arbitrary -/// auth value in a header or query string parameter. -// As described in the Smithy documentation: -// https://github.com/awslabs/smithy/blob/main/smithy-model/src/main/resources/software/amazon/smithy/model/loader/prelude.smithy -#[derive(Clone, Debug, Default, PartialEq)] -pub struct HttpAuthDefinition { - /// Defines the location of where the Auth is serialized. - location: HttpAuthLocation, - - /// Defines the name of the HTTP header or query string parameter - /// that contains the Auth. - name: String, - - /// Defines the security scheme to use on the `Authorization` header value. - /// This can only be set if the "location" property is set to [`HttpAuthLocation::Header`]. - scheme: Option, -} - -impl HttpAuthDefinition { - /// Returns a builder for `HttpAuthDefinition`. - pub fn builder() -> http_auth_definition::Builder { - http_auth_definition::Builder::default() - } - - /// Constructs a new HTTP auth definition in header. - pub fn header(header_name: N, scheme: S) -> Self - where - N: Into, - S: Into>, - { - let mut builder = Self::builder() - .location(HttpAuthLocation::Header) - .name(header_name); - let scheme: Option = scheme.into(); - if scheme.is_some() { - builder.set_scheme(scheme); - } - builder.build() - } - - /// Constructs a new HTTP auth definition following the RFC 2617 for Basic Auth. - pub fn basic_auth() -> Self { - Self::builder() - .location(HttpAuthLocation::Header) - .name("Authorization".to_owned()) - .scheme("Basic".to_owned()) - .build() - } - - /// Constructs a new HTTP auth definition following the RFC 2617 for Digest Auth. - pub fn digest_auth() -> Self { - Self::builder() - .location(HttpAuthLocation::Header) - .name("Authorization".to_owned()) - .scheme("Digest".to_owned()) - .build() - } - - /// Constructs a new HTTP auth definition following the RFC 6750 for Bearer Auth. - pub fn bearer_auth() -> Self { - Self::builder() - .location(HttpAuthLocation::Header) - .name("Authorization".to_owned()) - .scheme("Bearer".to_owned()) - .build() - } - - /// Constructs a new HTTP auth definition in query string. - pub fn query(name: impl Into) -> Self { - Self::builder() - .location(HttpAuthLocation::Query) - .name(name.into()) - .build() - } - - /// Returns the HTTP auth location. - pub fn location(&self) -> HttpAuthLocation { - self.location - } - - /// Returns the HTTP auth name. - pub fn name(&self) -> &str { - &self.name - } - - /// Returns the HTTP auth scheme. - pub fn scheme(&self) -> Option<&str> { - self.scheme.as_deref() - } -} - -/// Types associated with [`HttpAuthDefinition`]. -pub mod http_auth_definition { - use super::HttpAuthDefinition; - use crate::{ - definition::HttpAuthLocation, - error::{AuthError, AuthErrorKind}, - }; - - /// A builder for [`HttpAuthDefinition`]. - #[derive(Debug, Default)] - pub struct Builder { - location: Option, - name: Option, - scheme: Option, - } - - impl Builder { - /// Sets the HTTP auth location. - pub fn location(mut self, location: HttpAuthLocation) -> Self { - self.location = Some(location); - self - } - - /// Sets the HTTP auth location. - pub fn set_location(&mut self, location: Option) -> &mut Self { - self.location = location; - self - } - - /// Sets the the HTTP auth name. - pub fn name(mut self, name: impl Into) -> Self { - self.name = Some(name.into()); - self - } - - /// Sets the the HTTP auth name. - pub fn set_name(&mut self, name: Option) -> &mut Self { - self.name = name; - self - } - - /// Sets the HTTP auth scheme. - pub fn scheme(mut self, scheme: impl Into) -> Self { - self.scheme = Some(scheme.into()); - self - } - - /// Sets the HTTP auth scheme. - pub fn set_scheme(&mut self, scheme: Option) -> &mut Self { - self.scheme = scheme; - self - } - - /// Constructs a [`HttpAuthDefinition`] from the builder. - pub fn build(self) -> HttpAuthDefinition { - if self.scheme.is_some() - && self - .name - .as_deref() - .map_or("".to_string(), |s| s.to_ascii_lowercase()) - != "authorization" - { - // Stop execution because the Smithy model should not contain such combination. - // Otherwise, this would cause unexpected behavior in the SDK. - panic!("{}", AuthError::from(AuthErrorKind::SchemeNotAllowed)); - } - HttpAuthDefinition { - location: self.location.unwrap_or_else(|| { - panic!( - "{}", - AuthError::from(AuthErrorKind::MissingRequiredField("location")) - ) - }), - name: self.name.unwrap_or_else(|| { - panic!( - "{}", - AuthError::from(AuthErrorKind::MissingRequiredField("name")) - ) - }), - scheme: self.scheme, - } - } - } -} - -#[cfg(test)] -mod tests { - use super::HttpAuthDefinition; - use crate::location::HttpAuthLocation; - - #[test] - fn definition_for_header_without_scheme() { - let definition = HttpAuthDefinition::header("Header", None); - assert_eq!(definition.location, HttpAuthLocation::Header); - assert_eq!(definition.name, "Header"); - assert_eq!(definition.scheme, None); - } - - #[test] - fn definition_for_authorization_header_with_scheme() { - let definition = HttpAuthDefinition::header("authorization", "Scheme".to_owned()); - assert_eq!(definition.location(), HttpAuthLocation::Header); - assert_eq!(definition.name(), "authorization"); - assert_eq!(definition.scheme(), Some("Scheme")); - } - - #[test] - #[should_panic] - fn definition_fails_with_scheme_not_allowed() { - let _ = HttpAuthDefinition::header("Invalid".to_owned(), "Scheme".to_owned()); - } - - #[test] - fn definition_for_basic() { - let definition = HttpAuthDefinition::basic_auth(); - assert_eq!( - definition, - HttpAuthDefinition { - location: HttpAuthLocation::Header, - name: "Authorization".to_owned(), - scheme: Some("Basic".to_owned()), - } - ); - } - - #[test] - fn definition_for_digest() { - let definition = HttpAuthDefinition::digest_auth(); - assert_eq!(definition.location(), HttpAuthLocation::Header); - assert_eq!(definition.name(), "Authorization"); - assert_eq!(definition.scheme(), Some("Digest")); - } - - #[test] - fn definition_for_bearer_token() { - let definition = HttpAuthDefinition::bearer_auth(); - assert_eq!(definition.location(), HttpAuthLocation::Header); - assert_eq!(definition.name(), "Authorization"); - assert_eq!(definition.scheme(), Some("Bearer")); - } - - #[test] - fn definition_for_query() { - let definition = HttpAuthDefinition::query("query_key"); - assert_eq!(definition.location(), HttpAuthLocation::Query); - assert_eq!(definition.name(), "query_key"); - assert_eq!(definition.scheme(), None); - } -} diff --git a/rust-runtime/aws-smithy-http-auth/src/error.rs b/rust-runtime/aws-smithy-http-auth/src/error.rs deleted file mode 100644 index 227dbe1cf29..00000000000 --- a/rust-runtime/aws-smithy-http-auth/src/error.rs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Auth Error - -use std::cmp::PartialEq; -use std::fmt::Debug; - -#[derive(Debug, Eq, PartialEq)] -pub(crate) enum AuthErrorKind { - InvalidLocation, - MissingRequiredField(&'static str), - SchemeNotAllowed, -} - -/// Error for Smithy authentication -#[derive(Debug, Eq, PartialEq)] -pub struct AuthError { - kind: AuthErrorKind, -} - -impl std::fmt::Display for AuthError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - use AuthErrorKind::*; - match &self.kind { - InvalidLocation => write!(f, "invalid location: expected `header` or `query`"), - MissingRequiredField(field) => write!(f, "missing required field: {}", field), - SchemeNotAllowed => write!( - f, - "scheme only allowed when it is set into the `Authorization` header" - ), - } - } -} - -impl From for AuthError { - fn from(kind: AuthErrorKind) -> Self { - Self { kind } - } -} diff --git a/rust-runtime/aws-smithy-http-auth/src/lib.rs b/rust-runtime/aws-smithy-http-auth/src/lib.rs index 8f5f956ced6..f54985f0c9c 100644 --- a/rust-runtime/aws-smithy-http-auth/src/lib.rs +++ b/rust-runtime/aws-smithy-http-auth/src/lib.rs @@ -3,11 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -// TODO(enableNewSmithyRuntimeCleanup): The contents of this crate are moving into aws-smithy-runtime. -// This crate is kept to continue sorting the middleware implementation until it is removed. -// When removing the old implementation, clear out this crate and deprecate it. - -#![allow(clippy::derive_partial_eq_without_eq)] #![warn( missing_docs, rustdoc::missing_crate_level_docs, @@ -15,9 +10,4 @@ rust_2018_idioms )] -//! Smithy HTTP Auth Types - -pub mod api_key; -pub mod definition; -pub mod error; -pub mod location; +//! This crate is no longer used by smithy-rs and is deprecated. diff --git a/rust-runtime/aws-smithy-http-auth/src/location.rs b/rust-runtime/aws-smithy-http-auth/src/location.rs deleted file mode 100644 index 5b044cf904e..00000000000 --- a/rust-runtime/aws-smithy-http-auth/src/location.rs +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Auth Location - -use std::cmp::PartialEq; -use std::fmt::Debug; - -use crate::error::{AuthError, AuthErrorKind}; - -/// Enum for describing where the HTTP Auth can be placed. -#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)] -pub enum HttpAuthLocation { - /// In the HTTP header. - #[default] - Header, - /// In the query string of the URL. - Query, -} - -impl HttpAuthLocation { - fn as_str(&self) -> &'static str { - match self { - Self::Header => "header", - Self::Query => "query", - } - } -} - -impl TryFrom<&str> for HttpAuthLocation { - type Error = AuthError; - fn try_from(value: &str) -> Result { - match value { - "header" => Ok(Self::Header), - "query" => Ok(Self::Query), - _ => Err(AuthError::from(AuthErrorKind::InvalidLocation)), - } - } -} - -impl TryFrom for HttpAuthLocation { - type Error = AuthError; - fn try_from(value: String) -> Result { - Self::try_from(value.as_str()) - } -} - -impl AsRef for HttpAuthLocation { - fn as_ref(&self) -> &str { - self.as_str() - } -} - -impl std::fmt::Display for HttpAuthLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(&self.as_str(), f) - } -} - -#[cfg(test)] -mod tests { - use super::HttpAuthLocation; - use crate::error::{AuthError, AuthErrorKind}; - - #[test] - fn fails_if_location_is_invalid() { - let actual = HttpAuthLocation::try_from("invalid").unwrap_err(); - let expected = AuthError::from(AuthErrorKind::InvalidLocation); - assert_eq!(actual, expected); - } -} diff --git a/rust-runtime/aws-smithy-http-server-python/Cargo.toml b/rust-runtime/aws-smithy-http-server-python/Cargo.toml index b454eab6260..188d5f5af2d 100644 --- a/rust-runtime/aws-smithy-http-server-python/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server-python/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.0-smithy-rs-head" authors = ["Smithy Rust Server "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" keywords = ["smithy", "framework", "web", "api", "aws"] categories = ["asynchronous", "web-programming", "api-bindings"] description = """ @@ -16,7 +16,7 @@ publish = true aws-smithy-http = { path = "../aws-smithy-http" } aws-smithy-http-server = { path = "../aws-smithy-http-server", features = ["aws-lambda"] } aws-smithy-json = { path = "../aws-smithy-json" } -aws-smithy-types = { path = "../aws-smithy-types" } +aws-smithy-types = { path = "../aws-smithy-types", features = ["byte-stream-poll-next", "http-body-0-4-x"] } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1.2" futures = "0.3" @@ -38,7 +38,7 @@ tokio = { version = "1.20.1", features = ["full"] } tokio-stream = "0.1" tower = { version = "0.4.13", features = ["util"] } tracing = "0.1.36" -tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } +tracing-subscriber = { version = "0.3.15", features = ["json", "env-filter"] } tracing-appender = { version = "0.2.2"} [dev-dependencies] diff --git a/rust-runtime/aws-smithy-http-server-python/README.md b/rust-runtime/aws-smithy-http-server-python/README.md index da3dc2c1316..723a1b38aad 100644 --- a/rust-runtime/aws-smithy-http-server-python/README.md +++ b/rust-runtime/aws-smithy-http-server-python/README.md @@ -3,5 +3,5 @@ Server libraries for smithy-rs generated servers, targeting pure Python business logic. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-server-python/src/error.rs b/rust-runtime/aws-smithy-http-server-python/src/error.rs index 2cc308fea57..020bee15c19 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/error.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/error.rs @@ -86,7 +86,7 @@ impl IntoResponse for PyMiddlewareException { .header("Content-Type", "application/json") .header("X-Amzn-Errortype", "MiddlewareException") .body(to_boxed(self.json_body())) - .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } @@ -96,7 +96,7 @@ impl IntoResponse for PyMiddlewareException { .status(self.status_code) .header("Content-Type", "application/xml") .body(to_boxed(self.xml_body())) - .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } @@ -107,7 +107,7 @@ impl IntoResponse for PyMiddlewareException { .header("Content-Type", "application/x-amz-json-1.0") // See https://awslabs.github.io/smithy/1.0/spec/aws/aws-json-1_0-protocol.html#empty-body-serialization .body(to_boxed(self.json_body())) - .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } @@ -118,7 +118,7 @@ impl IntoResponse for PyMiddlewareException { .header("Content-Type", "application/x-amz-json-1.1") // See https://awslabs.github.io/smithy/1.0/spec/aws/aws-json-1_1-protocol.html#empty-body-serialization .body(to_boxed(self.json_body())) - .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + .expect("invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } diff --git a/rust-runtime/aws-smithy-http-server-python/src/logging.rs b/rust-runtime/aws-smithy-http-server-python/src/logging.rs index 80d4966ac0b..57fa2873aa2 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/logging.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/logging.rs @@ -4,7 +4,8 @@ */ //! Rust `tracing` and Python `logging` setup and utilities. -use std::path::PathBuf; + +use std::{path::PathBuf, str::FromStr}; use pyo3::prelude::*; #[cfg(not(test))] @@ -15,15 +16,49 @@ use tracing_subscriber::{ fmt::{self, writer::MakeWriterExt}, layer::SubscriberExt, util::SubscriberInitExt, + Layer, }; use crate::error::PyException; +#[derive(Debug, Default)] +enum Format { + Json, + Pretty, + #[default] + Compact, +} + +#[derive(Debug, PartialEq, Eq)] +struct InvalidFormatError; + +impl FromStr for Format { + type Err = InvalidFormatError; + + fn from_str(s: &str) -> Result { + match s { + "pretty" => Ok(Self::Pretty), + "json" => Ok(Self::Json), + "compact" => Ok(Self::Compact), + _ => Err(InvalidFormatError), + } + } +} + /// Setup tracing-subscriber to log on console or to a hourly rolling file. fn setup_tracing_subscriber( level: Option, logfile: Option, + format: Option, ) -> PyResult> { + let format = match format { + Some(format) => Format::from_str(&format).unwrap_or_else(|_| { + tracing::error!("unknown format '{format}', falling back to default formatter"); + Format::default() + }), + None => Format::default(), + }; + let appender = match logfile { Some(logfile) => { let parent = logfile.parent().ok_or_else(|| { @@ -54,27 +89,27 @@ fn setup_tracing_subscriber( _ => Level::TRACE, }; + let formatter = fmt::Layer::new().with_line_number(true).with_level(true); + match appender { Some((appender, guard)) => { - let layer = Some( - fmt::Layer::new() - .with_writer(appender.with_max_level(tracing_level)) - .with_ansi(true) - .with_line_number(true) - .with_level(true), - ); - tracing_subscriber::registry().with(layer).init(); + let formatter = formatter.with_writer(appender.with_max_level(tracing_level)); + let formatter = match format { + Format::Json => formatter.json().boxed(), + Format::Compact => formatter.compact().boxed(), + Format::Pretty => formatter.pretty().boxed(), + }; + tracing_subscriber::registry().with(formatter).init(); Ok(Some(guard)) } None => { - let layer = Some( - fmt::Layer::new() - .with_writer(std::io::stdout.with_max_level(tracing_level)) - .with_ansi(true) - .with_line_number(true) - .with_level(true), - ); - tracing_subscriber::registry().with(layer).init(); + let formatter = formatter.with_writer(std::io::stdout.with_max_level(tracing_level)); + let formatter = match format { + Format::Json => formatter.json().boxed(), + Format::Compact => formatter.compact().boxed(), + Format::Pretty => formatter.pretty().boxed(), + }; + tracing_subscriber::registry().with(formatter).init(); Ok(None) } } @@ -89,9 +124,10 @@ fn setup_tracing_subscriber( /// /// :param level typing.Optional\[int\]: /// :param logfile typing.Optional\[pathlib.Path\]: +/// :param format typing.Optional\[typing.Literal\['compact', 'pretty', 'json'\]\]: /// :rtype None: #[pyclass(name = "TracingHandler")] -#[pyo3(text_signature = "($self, level=None, logfile=None)")] +#[pyo3(text_signature = "($self, level=None, logfile=None, format=None)")] #[derive(Debug)] pub struct PyTracingHandler { _guard: Option, @@ -100,8 +136,13 @@ pub struct PyTracingHandler { #[pymethods] impl PyTracingHandler { #[new] - fn newpy(py: Python, level: Option, logfile: Option) -> PyResult { - let _guard = setup_tracing_subscriber(level, logfile)?; + fn newpy( + py: Python, + level: Option, + logfile: Option, + format: Option, + ) -> PyResult { + let _guard = setup_tracing_subscriber(level, logfile, format)?; let logging = py.import("logging")?; let root = logging.getattr("root")?; root.setattr("level", level)?; @@ -190,7 +231,7 @@ mod tests { fn tracing_handler_is_injected_in_python() { crate::tests::initialize(); Python::with_gil(|py| { - let handler = PyTracingHandler::newpy(py, Some(10), None).unwrap(); + let handler = PyTracingHandler::newpy(py, Some(10), None, None).unwrap(); let kwargs = PyDict::new(py); kwargs .set_item("handlers", vec![handler.handler(py).unwrap()]) diff --git a/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs b/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs index cf6cb2d0952..ead40320adf 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs @@ -141,7 +141,14 @@ async def middleware(request, next): body = bytes(await request.body).decode() body_reversed = body[::-1] request.body = body_reversed.encode() + # Add a new header request.headers["X-From-Middleware"] = "yes" + # Change an existing header. + request.headers["X-Existing"] = "changed" + # Delete an existing header. + del request.headers["X-To-Delete"] + # Change the URI. + request.uri = "/changed_uri" return await next(request) "#, ); @@ -149,7 +156,10 @@ async def middleware(request, next): let th = tokio::spawn(async move { let (req, send_response) = handle.next_request().await.unwrap(); - assert_eq!(&"yes", req.headers().get("X-From-Middleware").unwrap()); + assert_eq!("yes", req.headers().get("X-From-Middleware").unwrap()); + assert_eq!("changed", req.headers().get("X-Existing").unwrap()); + assert!(req.headers().get("X-To-Delete").is_none()); + assert_eq!("/changed_uri", req.uri()); let req_body = hyper::body::to_bytes(req.into_body()).await.unwrap(); assert_eq!(req_body, "hello server".chars().rev().collect::()); send_response.send_response( @@ -159,7 +169,13 @@ async def middleware(request, next): ); }); - let request = simple_request("hello server"); + let mut request = simple_request("hello server"); + assert_ne!(request.uri(), "/changed_uri"); + // Add a header that the middleware should modify. + let headers_mut = request.headers_mut(); + headers_mut.insert("X-Existing", http::HeaderValue::from_static("yes")); + // Add a header that the middleware should remove. + headers_mut.insert("X-To-Delete", http::HeaderValue::from_static("delete-this")); let response = service.call(request); assert_body(response.await?, "hello client").await; diff --git a/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs b/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs index be5d85f8c93..63a560a7bb4 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs @@ -6,7 +6,7 @@ use aws_smithy_http_server_python::PyRequest; use http::{Request, Version}; use hyper::Body; -use pyo3::{prelude::*, py_run}; +use pyo3::{exceptions::PyValueError, prelude::*, py_run}; #[pyo3_asyncio::tokio::test] async fn accessing_request_properties() -> PyResult<()> { @@ -71,3 +71,51 @@ async def handler(req): Ok(()) } + +#[pyo3_asyncio::tokio::test] +async fn accessing_and_changing_request_uri() -> PyResult<()> { + let request = Request::builder() + .uri("/op1") + .body(Body::from("hello world")) + .expect("could not build request"); + let py_request = PyRequest::new(request); + + // Call an async Python method to change the URI and return it. + let modified_req = Python::with_gil(|py| { + let module = PyModule::from_code( + py, + r#" +async def handler(req): + assert req.uri == "/op1" + # add a trailing slash to the uri + req.uri = "/op1/" + assert req.uri == "/op1/" + return req +"#, + "", + "", + )?; + + let req_ref = PyCell::new(py, py_request)?; + let handler = module.getattr("handler")?; + let output = handler.call1((req_ref,))?; + + Ok::<_, PyErr>(pyo3_asyncio::tokio::into_future(output)) + })?? + .await?; + + // Confirm that the URI has been changed when the modified PyRequest instance + // from Python is converted into a http::Request<> instance. + Python::with_gil(|py| { + let request_cell: &PyCell = modified_req.downcast(py)?; + let mut request = request_cell.borrow_mut(); + let http_request = request + .take_inner() + .ok_or_else(|| PyValueError::new_err("inner http request has already been consumed"))?; + assert_eq!(http_request.uri(), "/op1/"); + + Ok::<_, PyErr>(()) + })?; + + Ok(()) +} diff --git a/rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs b/rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs index d1eff86e002..5e73b106652 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs @@ -10,7 +10,10 @@ use std::sync::Arc; use aws_smithy_http_server::body::Body; use http::{request::Parts, Request}; -use pyo3::{exceptions::PyRuntimeError, prelude::*}; +use pyo3::{ + exceptions::{PyRuntimeError, PyValueError}, + prelude::*, +}; use tokio::sync::Mutex; use super::{PyHeaderMap, PyMiddlewareError}; @@ -76,6 +79,25 @@ impl PyRequest { .ok_or_else(|| PyMiddlewareError::RequestGone.into()) } + /// Sets the URI of this request. + /// + /// :type str: + #[setter] + fn set_uri(&mut self, uri_str: String) -> PyResult<()> { + self.parts.as_mut().map_or_else( + || Err(PyMiddlewareError::RequestGone.into()), + |parts| { + parts.uri = uri_str.parse().map_err(|e: http::uri::InvalidUri| { + PyValueError::new_err(format!( + "URI `{}` cannot be parsed. Error: {}", + uri_str, e + )) + })?; + Ok(()) + }, + ) + } + /// Return the HTTP version of this request. /// /// :type str: diff --git a/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs b/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs index 30cc997e760..0f15f5177e2 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs @@ -10,8 +10,8 @@ use futures_util::stream; use hyper::Body; use pyo3::{prelude::*, py_run}; -use aws_smithy_http::body::SdkBody; use aws_smithy_http_server_python::types::ByteStream; +use aws_smithy_types::body::SdkBody; #[pyo3_asyncio::tokio::test] fn consuming_stream_on_python_synchronously() -> PyResult<()> { @@ -147,5 +147,5 @@ async def handler(bytestream): fn streaming_bytestream_from_vec(chunks: Vec<&'static str>) -> ByteStream { let stream = stream::iter(chunks.into_iter().map(Ok::<_, io::Error>)); let body = Body::wrap_stream(stream); - ByteStream::new(SdkBody::from(body)) + ByteStream::new(SdkBody::from_body_0_4(body)) } diff --git a/rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs b/rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs index fb3aa7ac91b..9e6dbed364a 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs @@ -144,7 +144,7 @@ mod tests { assert!(response .unwrap_err() .to_string() - .contains("invalid peer certificate: UnknownIssuer")); + .contains("invalid peer certificate")); } { diff --git a/rust-runtime/aws-smithy-http-server-python/src/types.rs b/rust-runtime/aws-smithy-http-server-python/src/types.rs index a2fa3085122..1af75dbd27d 100644 --- a/rust-runtime/aws-smithy-http-server-python/src/types.rs +++ b/rust-runtime/aws-smithy-http-server-python/src/types.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! Python wrapped types from aws-smithy-types and aws-smithy-http. +//! Python wrapped types from aws-smithy-types. //! //! ## `Deref` hacks for Json serializer //! [aws_smithy_json::serialize::JsonValueWriter] expects references to the types @@ -31,7 +31,6 @@ use pyo3::{ prelude::*, }; use tokio::{runtime::Handle, sync::Mutex}; -use tokio_stream::StreamExt; use crate::PyError; @@ -302,11 +301,11 @@ impl Deref for DateTime { } } -/// Python Wrapper for [aws_smithy_http::byte_stream::ByteStream]. +/// Python Wrapper for [aws_smithy_types::byte_stream::ByteStream]. /// /// ByteStream provides misuse-resistant primitives to make it easier to handle common patterns with streaming data. /// -/// On the Rust side, The Python implementation wraps the original [ByteStream](aws_smithy_http::byte_stream::ByteStream) +/// On the Rust side, The Python implementation wraps the original [ByteStream](aws_smithy_types::byte_stream::ByteStream) /// in a clonable structure and implements the [Stream](futures::stream::Stream) trait for it to /// allow Rust to handle the type transparently. /// @@ -333,17 +332,17 @@ impl Deref for DateTime { /// effectively maintaining the asyncronous behavior that Rust exposes, while the sync one is blocking the Tokio runtime to be able /// to await one chunk at a time. /// -/// The original Rust [ByteStream](aws_smithy_http::byte_stream::ByteStream) is wrapped inside a `Arc` to allow the type to be +/// The original Rust [ByteStream](aws_smithy_types::byte_stream::ByteStream) is wrapped inside a `Arc` to allow the type to be /// [Clone] (required by PyO3) and to allow internal mutability, required to fetch the next chunk of data. /// /// :param input bytes: /// :rtype None: #[pyclass] #[derive(Debug, Clone)] -pub struct ByteStream(Arc>); +pub struct ByteStream(Arc>); impl futures::stream::Stream for ByteStream { - type Item = Result; + type Item = Result; fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { let stream = self.0.lock(); @@ -357,7 +356,7 @@ impl futures::stream::Stream for ByteStream { /// Return a new data chunk from the stream. async fn yield_data_chunk( - body: Arc>, + body: Arc>, ) -> PyResult> { let mut stream = body.lock().await; stream @@ -368,37 +367,37 @@ async fn yield_data_chunk( } impl ByteStream { - /// Construct a new [ByteStream](aws_smithy_http::byte_stream::ByteStream) from a - /// [SdkBody](aws_smithy_http::body::SdkBody). + /// Construct a new [`ByteStream`](aws_smithy_types::byte_stream::ByteStream) from a + /// [`SdkBody`](aws_smithy_types::body::SdkBody). /// /// This method is available only to Rust and it is required to comply with the /// interface required by the code generator. - pub fn new(body: aws_smithy_http::body::SdkBody) -> Self { + pub fn new(body: aws_smithy_types::body::SdkBody) -> Self { Self(Arc::new(Mutex::new( - aws_smithy_http::byte_stream::ByteStream::new(body), + aws_smithy_types::byte_stream::ByteStream::new(body), ))) } } impl Default for ByteStream { fn default() -> Self { - Self::new(aws_smithy_http::body::SdkBody::from("")) + Self::new(aws_smithy_types::body::SdkBody::from("")) } } #[pymethods] impl ByteStream { - /// Create a new [ByteStream](aws_smithy_http::byte_stream::ByteStream) from a slice of bytes. + /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a slice of bytes. #[new] pub fn newpy(input: &[u8]) -> Self { Self(Arc::new(Mutex::new( - aws_smithy_http::byte_stream::ByteStream::new(aws_smithy_http::body::SdkBody::from( + aws_smithy_types::byte_stream::ByteStream::new(aws_smithy_types::body::SdkBody::from( input, )), ))) } - /// Create a new [ByteStream](aws_smithy_http::byte_stream::ByteStream) from a path, without + /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a path, without /// requiring Python to await this method. /// /// **NOTE:** This method will block the Rust event loop when it is running. @@ -408,7 +407,7 @@ impl ByteStream { #[staticmethod] pub fn from_path_blocking(py: Python, path: String) -> PyResult> { let byte_stream = Handle::current().block_on(async { - aws_smithy_http::byte_stream::ByteStream::from_path(path) + aws_smithy_types::byte_stream::ByteStream::from_path(path) .await .map_err(|e| PyRuntimeError::new_err(e.to_string())) })?; @@ -416,7 +415,7 @@ impl ByteStream { Ok(result.into_py(py)) } - /// Create a new [ByteStream](aws_smithy_http::byte_stream::ByteStream) from a path, forcing + /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a path, forcing /// Python to await this coroutine. /// /// :param path str: @@ -424,7 +423,7 @@ impl ByteStream { #[staticmethod] pub fn from_path(py: Python, path: String) -> PyResult<&PyAny> { pyo3_asyncio::tokio::future_into_py(py, async move { - let byte_stream = aws_smithy_http::byte_stream::ByteStream::from_path(path) + let byte_stream = aws_smithy_types::byte_stream::ByteStream::from_path(path) .await .map_err(|e| PyRuntimeError::new_err(e.to_string()))?; Ok(Self(Arc::new(Mutex::new(byte_stream)))) @@ -441,7 +440,7 @@ impl ByteStream { /// Return the next item from the iterator. If there are no further items, raise the StopIteration exception. /// PyO3 allows to raise the correct exception using the enum [IterNextOutput](pyo3::pyclass::IterNextOutput). /// - /// To get tnext value of the iterator, the `Arc` inner stream is cloned and the Rust call to `next()` is executed + /// To get the next value of the iterator, the `Arc` inner stream is cloned and the Rust call to `next()` is executed /// inside a call blocking the Tokio runtime. /// /// More info: `` diff --git a/rust-runtime/aws-smithy-http-server-typescript/Cargo.toml b/rust-runtime/aws-smithy-http-server-typescript/Cargo.toml index 1147d0da983..ba1fa436df2 100644 --- a/rust-runtime/aws-smithy-http-server-typescript/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server-typescript/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.0-smithy-rs-head" authors = ["Smithy Rust Server "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" keywords = ["smithy", "framework", "web", "api", "aws", "typescript"] categories = ["asynchronous", "web-programming", "api-bindings"] description = """ diff --git a/rust-runtime/aws-smithy-http-server-typescript/README.md b/rust-runtime/aws-smithy-http-server-typescript/README.md index b5d516d1c2b..aa2fe18f6a3 100644 --- a/rust-runtime/aws-smithy-http-server-typescript/README.md +++ b/rust-runtime/aws-smithy-http-server-typescript/README.md @@ -3,5 +3,5 @@ Server libraries for smithy-rs generated servers, targeting pure Typescript business logic. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-server/Cargo.toml b/rust-runtime/aws-smithy-http-server/Cargo.toml index f1cd62c2d46..fbfcd899989 100644 --- a/rust-runtime/aws-smithy-http-server/Cargo.toml +++ b/rust-runtime/aws-smithy-http-server/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.0-smithy-rs-head" authors = ["Smithy Rust Server "] edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" keywords = ["smithy", "framework", "web", "api", "aws"] categories = ["asynchronous", "web-programming", "api-bindings"] description = """ @@ -21,7 +21,8 @@ request-id = ["dep:uuid"] async-trait = "0.1" aws-smithy-http = { path = "../aws-smithy-http", features = ["rt-tokio"] } aws-smithy-json = { path = "../aws-smithy-json" } -aws-smithy-types = { path = "../aws-smithy-types" } +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["http-02x"] } +aws-smithy-types = { path = "../aws-smithy-types", features = ["http-body-0-4-x", "hyper-0-14-x"] } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1.1" futures-util = { version = "0.3.16", default-features = false } diff --git a/rust-runtime/aws-smithy-http-server/README.md b/rust-runtime/aws-smithy-http-server/README.md index 2e0ddc8860c..eaed6915b3b 100644 --- a/rust-runtime/aws-smithy-http-server/README.md +++ b/rust-runtime/aws-smithy-http-server/README.md @@ -3,5 +3,5 @@ Server libraries for smithy-rs generated servers. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-server/src/extension.rs b/rust-runtime/aws-smithy-http-server/src/extension.rs index a2a54affb2b..17ff01e9619 100644 --- a/rust-runtime/aws-smithy-http-server/src/extension.rs +++ b/rust-runtime/aws-smithy-http-server/src/extension.rs @@ -28,7 +28,7 @@ use thiserror::Error; use tower::Service; use crate::operation::OperationShape; -use crate::plugin::{Plugin, PluginPipeline, PluginStack}; +use crate::plugin::{HttpMarker, HttpPlugins, Plugin, PluginStack}; use crate::shape_id::ShapeId; pub use crate::request::extension::{Extension, MissingExtension}; @@ -128,16 +128,18 @@ where } } -/// An extension trait on [`PluginPipeline`] allowing the application of [`OperationExtensionPlugin`]. +impl HttpMarker for OperationExtensionPlugin {} + +/// An extension trait on [`HttpPlugins`] allowing the application of [`OperationExtensionPlugin`]. /// /// See [`module`](crate::extension) documentation for more info. pub trait OperationExtensionExt { /// Apply the [`OperationExtensionPlugin`], which inserts the [`OperationExtension`] into every [`http::Response`]. - fn insert_operation_extension(self) -> PluginPipeline>; + fn insert_operation_extension(self) -> HttpPlugins>; } -impl OperationExtensionExt for PluginPipeline { - fn insert_operation_extension(self) -> PluginPipeline> { +impl OperationExtensionExt for HttpPlugins { + fn insert_operation_extension(self) -> HttpPlugins> { self.push(OperationExtensionPlugin) } } @@ -221,7 +223,7 @@ mod tests { } // Apply `Plugin`. - let plugins = PluginPipeline::new().insert_operation_extension(); + let plugins = HttpPlugins::new().insert_operation_extension(); // Apply `Plugin`s `Layer`. let layer = PluginLayer::new::(plugins); diff --git a/rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs b/rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs index ee88555d731..f2dcca9cac1 100644 --- a/rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs +++ b/rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::plugin::{PluginPipeline, PluginStack}; +use crate::plugin::{HttpMarker, HttpPlugins, PluginStack}; use crate::{operation::OperationShape, plugin::Plugin}; use super::sensitivity::Sensitivity; @@ -27,17 +27,19 @@ where } } +impl HttpMarker for InstrumentPlugin {} + /// An extension trait for applying [`InstrumentPlugin`]. pub trait InstrumentExt { /// Applies an [`InstrumentOperation`] to every operation, respecting the [@sensitive] trait given on the input and /// output models. See [`InstrumentOperation`](super::InstrumentOperation) for more information. /// /// [@sensitive]: https://awslabs.github.io/smithy/2.0/spec/documentation-traits.html#sensitive-trait - fn instrument(self) -> PluginPipeline>; + fn instrument(self) -> HttpPlugins>; } -impl InstrumentExt for PluginPipeline { - fn instrument(self) -> PluginPipeline> { +impl InstrumentExt for HttpPlugins { + fn instrument(self) -> HttpPlugins> { self.push(InstrumentPlugin) } } diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs b/rust-runtime/aws-smithy-http-server/src/layer/alb_health_check.rs similarity index 86% rename from rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs rename to rust-runtime/aws-smithy-http-server/src/layer/alb_health_check.rs index c87e86619cd..8c76bf1a9f3 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/alb_health_check.rs +++ b/rust-runtime/aws-smithy-http-server/src/layer/alb_health_check.rs @@ -9,14 +9,17 @@ //! # Example //! //! ```no_run -//! # use aws_smithy_http_server::{body, plugin::{PluginPipeline, alb_health_check::AlbHealthCheckLayer}}; -//! # use hyper::{Body, Response, StatusCode}; -//! let plugins = PluginPipeline::new() -//! // Handle all `/ping` health check requests by returning a `200 OK`. -//! .layer(AlbHealthCheckLayer::from_handler("/ping", |_req| async { -//! StatusCode::OK -//! })); +//! use aws_smithy_http_server::layer::alb_health_check::AlbHealthCheckLayer; +//! use hyper::StatusCode; +//! use tower::Layer; //! +//! // Handle all `/ping` health check requests by returning a `200 OK`. +//! let ping_layer = AlbHealthCheckLayer::from_handler("/ping", |_req| async { +//! StatusCode::OK +//! }); +//! # async fn handle() { } +//! let app = tower::service_fn(handle); +//! let app = ping_layer.layer(app); //! ``` use std::borrow::Cow; @@ -31,8 +34,8 @@ use tower::{service_fn, util::Oneshot, Layer, Service, ServiceExt}; use crate::body::BoxBody; -use super::either::EitherProj; -use super::Either; +use crate::plugin::either::Either; +use crate::plugin::either::EitherProj; /// A [`tower::Layer`] used to apply [`AlbHealthCheckService`]. #[derive(Clone, Debug)] @@ -96,9 +99,7 @@ where H: Service, Response = StatusCode, Error = Infallible> + Clone, { type Response = S::Response; - type Error = S::Error; - type Future = AlbHealthCheckFuture; fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { @@ -133,7 +134,11 @@ pin_project! { } } -impl, Response = StatusCode>, S: Service>> AlbHealthCheckFuture { +impl AlbHealthCheckFuture +where + H: Service, Response = StatusCode>, + S: Service>, +{ fn handler_future(handler_future: Oneshot>) -> Self { Self { inner: Either::Left { value: handler_future }, @@ -147,10 +152,10 @@ impl, Response = StatusCode>, S: Service> } } -impl< - H: Service, Response = StatusCode, Error = Infallible>, - S: Service, Response = Response>, - > Future for AlbHealthCheckFuture +impl Future for AlbHealthCheckFuture +where + H: Service, Response = StatusCode, Error = Infallible>, + S: Service, Response = Response>, { type Output = Result; diff --git a/rust-runtime/aws-smithy-http-server/src/layer/mod.rs b/rust-runtime/aws-smithy-http-server/src/layer/mod.rs new file mode 100644 index 00000000000..fcbce76f44c --- /dev/null +++ b/rust-runtime/aws-smithy-http-server/src/layer/mod.rs @@ -0,0 +1,9 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! This module hosts [`Layer`](tower::Layer)s that are generally meant to be applied _around_ the +//! [`Router`](crate::routing::Router), so they are enacted before a request is routed. + +pub mod alb_health_check; diff --git a/rust-runtime/aws-smithy-http-server/src/lib.rs b/rust-runtime/aws-smithy-http-server/src/lib.rs index 7b32c507362..a7a78733b29 100644 --- a/rust-runtime/aws-smithy-http-server/src/lib.rs +++ b/rust-runtime/aws-smithy-http-server/src/lib.rs @@ -16,6 +16,7 @@ pub mod body; pub(crate) mod error; pub mod extension; pub mod instrumentation; +pub mod layer; pub mod operation; pub mod plugin; #[doc(hidden)] diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/either.rs b/rust-runtime/aws-smithy-http-server/src/plugin/either.rs index b2da9cc5f0b..d0c2da70953 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/either.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/either.rs @@ -15,6 +15,8 @@ use tower::{Layer, Service}; use super::Plugin; +// TODO(https://github.com/smithy-lang/smithy-rs/pull/2441#pullrequestreview-1331345692): Seems like +// this type should land in `tower-0.5`. pin_project! { /// Combine two different [`Futures`](std::future::Future)/[`Services`](tower::Service)/ /// [`Layers`](tower::Layer)/[`Plugins`](super::Plugin) into a single type. diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/filter.rs b/rust-runtime/aws-smithy-http-server/src/plugin/filter.rs index 0e4a195e6dc..f29fac8e505 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/filter.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/filter.rs @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -use super::{either::Either, IdentityPlugin}; +use super::{either::Either, IdentityPlugin, ModelMarker}; use crate::operation::OperationShape; use crate::service::ContainsOperation; -use super::Plugin; +use super::{HttpMarker, Plugin}; /// Filters the application of an inner [`Plugin`] using a predicate over the /// [`ServiceShape::Operations`](crate::service::ServiceShape::Operations). @@ -41,11 +41,14 @@ where } } +impl HttpMarker for FilterByOperation where Inner: HttpMarker {} +impl ModelMarker for FilterByOperation where Inner: ModelMarker {} + /// Filters the application of an inner [`Plugin`] using a predicate over the /// [`ServiceShape::Operations`](crate::service::ServiceShape::Operations). /// -/// Users should prefer [`Scoped`](crate::plugin::Scoped) and fallback to [`filter_by_operation`] in cases where -/// [`Plugin`] application must be decided at runtime. +/// Users should prefer [`Scoped`](crate::plugin::Scoped) and fallback to [`filter_by_operation`] +/// in cases where [`Plugin`] application must be decided at runtime. /// /// # Example /// diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/pipeline.rs b/rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs similarity index 50% rename from rust-runtime/aws-smithy-http-server/src/plugin/pipeline.rs rename to rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs index acac792c3b8..c8369a66bf4 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/pipeline.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs @@ -3,25 +3,26 @@ * SPDX-License-Identifier: Apache-2.0 */ +// If you make any updates to this file (including Rust docs), make sure you make them to +// `model_plugins.rs` too! + use crate::plugin::{IdentityPlugin, Plugin, PluginStack}; -use super::LayerPlugin; +use super::{HttpMarker, LayerPlugin}; -/// A wrapper struct for composing [`Plugin`]s. -/// It is used as input for the `builder_with_plugins` method on the generate service struct -/// (e.g. `PokemonService::builder_with_plugins`). +/// A wrapper struct for composing HTTP plugins. /// /// ## Applying plugins in a sequence /// -/// You can use the [`push`](PluginPipeline::push) method to apply a new plugin after the ones that +/// You can use the [`push`](HttpPlugins::push) method to apply a new HTTP plugin after the ones that /// have already been registered. /// /// ```rust -/// use aws_smithy_http_server::plugin::PluginPipeline; +/// use aws_smithy_http_server::plugin::HttpPlugins; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; /// -/// let pipeline = PluginPipeline::new().push(LoggingPlugin).push(MetricsPlugin); +/// let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin); /// ``` /// /// The plugins' runtime logic is executed in registration order. @@ -32,13 +33,14 @@ use super::LayerPlugin; /// From time to time, you might have a need to transform the entire pipeline that has been built /// so far - e.g. you only want to apply those plugins for a specific operation. /// -/// `PluginPipeline` is itself a [`Plugin`]: you can apply any transformation that expects a -/// [`Plugin`] to an entire pipeline. In this case, we want to use -/// [`filter_by_operation`](crate::plugin::filter_by_operation) to limit the scope of -/// the logging and metrics plugins to the `CheckHealth` operation: +/// `HttpPlugins` is itself a [`Plugin`]: you can apply any transformation that expects a +/// [`Plugin`] to an entire pipeline. In this case, we could use a [scoped +/// plugin](crate::plugin::Scoped) to limit the scope of the logging and metrics plugins to the +/// `CheckHealth` operation: /// /// ```rust -/// use aws_smithy_http_server::plugin::{filter_by_operation, PluginPipeline}; +/// use aws_smithy_http_server::scope; +/// use aws_smithy_http_server::plugin::{HttpPlugins, Scoped}; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin; @@ -49,91 +51,101 @@ use super::LayerPlugin; /// # impl CheckHealth { const ID: ShapeId = ShapeId::new("namespace#MyName", "namespace", "MyName"); } /// /// // The logging and metrics plugins will only be applied to the `CheckHealth` operation. -/// let plugin = PluginPipeline::new() -/// .push(LoggingPlugin) -/// .push(MetricsPlugin); -/// let filtered_plugin = filter_by_operation(plugin, |operation: Operation| operation == Operation::CheckHealth); -/// let pipeline = PluginPipeline::new() +/// let plugin = HttpPlugins::new() +/// .push(LoggingPlugin) +/// .push(MetricsPlugin); +/// +/// scope! { +/// struct OnlyCheckHealth { +/// includes: [CheckHealth], +/// excludes: [/* The rest of the operations go here */] +/// } +/// } +/// +/// let filtered_plugin = Scoped::new::(&plugin); +/// let http_plugins = HttpPlugins::new() /// .push(filtered_plugin) -/// // The auth plugin will be applied to all operations +/// // The auth plugin will be applied to all operations. /// .push(AuthPlugin); /// ``` /// -/// ## Concatenating two plugin pipelines +/// ## Concatenating two collections of HTTP plugins /// -/// `PluginPipeline` is a good way to bundle together multiple plugins, ensuring they are all +/// `HttpPlugins` is a good way to bundle together multiple plugins, ensuring they are all /// registered in the correct order. /// -/// Since `PluginPipeline` is itself a [`Plugin`], you can use the [`push`](PluginPipeline::push) to -/// append, at once, all the plugins in another pipeline to the current pipeline: +/// Since `HttpPlugins` is itself a HTTP plugin (it implements the `HttpMarker` trait), you can use +/// the [`push`](HttpPlugins::push) to append, at once, all the HTTP plugins in another +/// `HttpPlugins` to the current `HttpPlugins`: /// /// ```rust -/// use aws_smithy_http_server::plugin::{IdentityPlugin, PluginPipeline, PluginStack}; +/// use aws_smithy_http_server::plugin::{IdentityPlugin, HttpPlugins, PluginStack}; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin; /// -/// pub fn get_bundled_pipeline() -> PluginPipeline>> { -/// PluginPipeline::new().push(LoggingPlugin).push(MetricsPlugin) +/// pub fn get_bundled_http_plugins() -> HttpPlugins>> { +/// HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin) /// } /// -/// let pipeline = PluginPipeline::new() +/// let http_plugins = HttpPlugins::new() /// .push(AuthPlugin) -/// .push(get_bundled_pipeline()); +/// .push(get_bundled_http_plugins()); /// ``` /// -/// ## Providing custom methods on `PluginPipeline` +/// ## Providing custom methods on `HttpPlugins` /// -/// You use an **extension trait** to add custom methods on `PluginPipeline`. +/// You use an **extension trait** to add custom methods on `HttpPlugins`. /// /// This is a simple example using `AuthPlugin`: /// /// ```rust -/// use aws_smithy_http_server::plugin::{PluginPipeline, PluginStack}; +/// use aws_smithy_http_server::plugin::{HttpPlugins, PluginStack}; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin; /// /// pub trait AuthPluginExt { -/// fn with_auth(self) -> PluginPipeline>; +/// fn with_auth(self) -> HttpPlugins>; /// } /// -/// impl AuthPluginExt for PluginPipeline { -/// fn with_auth(self) -> PluginPipeline> { +/// impl AuthPluginExt for HttpPlugins { +/// fn with_auth(self) -> HttpPlugins> { /// self.push(AuthPlugin) /// } /// } /// -/// let pipeline = PluginPipeline::new() +/// let http_plugins = HttpPlugins::new() /// .push(LoggingPlugin) /// // Our custom method! /// .with_auth(); /// ``` -pub struct PluginPipeline

(pub(crate) P); +#[derive(Debug)] +pub struct HttpPlugins

(pub(crate) P); -impl Default for PluginPipeline { +impl Default for HttpPlugins { fn default() -> Self { Self(IdentityPlugin) } } -impl PluginPipeline { - /// Create an empty [`PluginPipeline`]. +impl HttpPlugins { + /// Create an empty [`HttpPlugins`]. /// - /// You can use [`PluginPipeline::push`] to add plugins to it. + /// You can use [`HttpPlugins::push`] to add plugins to it. pub fn new() -> Self { Self::default() } } -impl

PluginPipeline

{ - /// Apply a new plugin after the ones that have already been registered. +impl

HttpPlugins

{ + /// Apply a new HTTP plugin after the ones that have already been registered. /// /// ```rust - /// use aws_smithy_http_server::plugin::PluginPipeline; + /// use aws_smithy_http_server::plugin::HttpPlugins; /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; /// - /// let pipeline = PluginPipeline::new().push(LoggingPlugin).push(MetricsPlugin); + /// let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin); /// ``` /// /// The plugins' runtime logic is executed in registration order. @@ -163,18 +175,19 @@ impl

PluginPipeline

{ /// } /// } /// ``` - /// - pub fn push(self, new_plugin: NewPlugin) -> PluginPipeline> { - PluginPipeline(PluginStack::new(new_plugin, self.0)) + // We eagerly require `NewPlugin: HttpMarker`, despite not really needing it, because compiler + // errors get _substantially_ better if the user makes a mistake. + pub fn push(self, new_plugin: NewPlugin) -> HttpPlugins> { + HttpPlugins(PluginStack::new(new_plugin, self.0)) } /// Applies a single [`tower::Layer`] to all operations _before_ they are deserialized. - pub fn layer(self, layer: L) -> PluginPipeline, P>> { - PluginPipeline(PluginStack::new(LayerPlugin(layer), self.0)) + pub fn layer(self, layer: L) -> HttpPlugins, P>> { + HttpPlugins(PluginStack::new(LayerPlugin(layer), self.0)) } } -impl Plugin for PluginPipeline +impl Plugin for HttpPlugins where InnerPlugin: Plugin, { @@ -184,3 +197,5 @@ where self.0.apply(input) } } + +impl HttpMarker for HttpPlugins where InnerPlugin: HttpMarker {} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/identity.rs b/rust-runtime/aws-smithy-http-server/src/plugin/identity.rs index affbd9f6b90..6ec684a5326 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/identity.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/identity.rs @@ -3,9 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -use super::Plugin; +use super::{HttpMarker, ModelMarker, Plugin}; /// A [`Plugin`] that maps a service to itself. +#[derive(Debug)] pub struct IdentityPlugin; impl Plugin for IdentityPlugin { @@ -15,3 +16,6 @@ impl Plugin for IdentityPlugin { svc } } + +impl ModelMarker for IdentityPlugin {} +impl HttpMarker for IdentityPlugin {} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/layer.rs b/rust-runtime/aws-smithy-http-server/src/plugin/layer.rs index b1a025b4cb8..0a2f31bc485 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/layer.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/layer.rs @@ -7,7 +7,7 @@ use std::marker::PhantomData; use tower::Layer; -use super::Plugin; +use super::{HttpMarker, ModelMarker, Plugin}; /// A [`Plugin`] which acts as a [`Layer`] `L`. pub struct LayerPlugin(pub L); @@ -23,6 +23,12 @@ where } } +// Without more information about what the layer `L` does, we can't know whether it's appropriate +// to run this plugin as a HTTP plugin or a model plugin, so we implement both marker traits. + +impl HttpMarker for LayerPlugin {} +impl ModelMarker for LayerPlugin {} + /// A [`Layer`] which acts as a [`Plugin`] `Pl` for specific protocol `P` and operation `Op`. pub struct PluginLayer { plugin: Pl, diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs index 106dc9200c7..533dbee00ed 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/mod.rs @@ -5,13 +5,42 @@ //! The plugin system allows you to build middleware with an awareness of the operation it is applied to. //! -//! The system centers around the [`Plugin`] trait. In addition, this module provides helpers for composing and -//! combining [`Plugin`]s. +//! The system centers around the [`Plugin`], [`HttpMarker`], and [`ModelMarker`] traits. In +//! addition, this module provides helpers for composing and combining [`Plugin`]s. +//! +//! # HTTP plugins vs model plugins +//! +//! Plugins come in two flavors: _HTTP_ plugins and _model_ plugins. The key difference between +//! them is _when_ they run: +//! +//! - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response +//! after it is serialized. +//! - A model plugin acts on the modeled operation input after it is deserialized, and acts on the +//! modeled operation output or the modeled operation error before it is serialized. +//! +//! See the relevant section in [the book], which contains an illustrative diagram. +//! +//! Both kinds of plugins implement the [`Plugin`] trait, but only HTTP plugins implement the +//! [`HttpMarker`] trait and only model plugins implement the [`ModelMarker`] trait. There is no +//! difference in how an HTTP plugin or a model plugin is applied, so both the [`HttpMarker`] trait +//! and the [`ModelMarker`] trait are _marker traits_, they carry no behavior. Their only purpose +//! is to mark a plugin, at the type system leve, as allowed to run at a certain time. A plugin can be +//! _both_ a HTTP plugin and a model plugin by implementing both traits; in this case, when the +//! plugin runs is decided by you when you register it in your application. [`IdentityPlugin`], +//! [`Scoped`], and [`LayerPlugin`] are examples of plugins that implement both traits. +//! +//! In practice, most plugins are HTTP plugins. Since HTTP plugins run before a request has been +//! correctly deserialized, HTTP plugins should be fast and lightweight. Only use model plugins if +//! you absolutely require your middleware to run after deserialization, or to act on particular +//! fields of your deserialized operation's input/output/errors. +//! +//! [the book]: https://smithy-lang.github.io/smithy-rs/design/server/anatomy.html //! //! # Filtered application of a HTTP [`Layer`](tower::Layer) //! //! ``` //! # use aws_smithy_http_server::plugin::*; +//! # use aws_smithy_http_server::scope; //! # use aws_smithy_http_server::shape_id::ShapeId; //! # let layer = (); //! # #[derive(PartialEq)] @@ -21,8 +50,18 @@ //! // Create a `Plugin` from a HTTP `Layer` //! let plugin = LayerPlugin(layer); //! -//! // Only apply the layer to operations with name "GetPokemonSpecies" -//! let plugin = filter_by_operation(plugin, |operation: Operation| operation == Operation::GetPokemonSpecies); +//! scope! { +//! struct OnlyGetPokemonSpecies { +//! includes: [GetPokemonSpecies], +//! excludes: [/* The rest of the operations go here */] +//! } +//! } +//! +//! // Only apply the layer to operations with name "GetPokemonSpecies". +//! let filtered_plugin = Scoped::new::(&plugin); +//! +//! // The same effect can be achieved at runtime. +//! let filtered_plugin = filter_by_operation(&plugin, |operation: Operation| operation == Operation::GetPokemonSpecies); //! ``` //! //! # Construct a [`Plugin`] from a closure that takes as input the operation name @@ -68,25 +107,35 @@ //! //! # Combine [`Plugin`]s //! -//! ``` +//! ```no_run //! # use aws_smithy_http_server::plugin::*; -//! # let a = (); let b = (); -//! // Combine `Plugin`s `a` and `b` -//! let plugin = PluginPipeline::new() +//! # struct Foo; +//! # impl HttpMarker for Foo { } +//! # let a = Foo; let b = Foo; +//! // Combine `Plugin`s `a` and `b`. Both need to implement `HttpMarker`. +//! let plugin = HttpPlugins::new() //! .push(a) //! .push(b); //! ``` //! -//! As noted in the [`PluginPipeline`] documentation, the plugins' runtime logic is executed in registration order, +//! As noted in the [`HttpPlugins`] documentation, the plugins' runtime logic is executed in registration order, //! meaning that `a` is run _before_ `b` in the example above. //! -//! # Example Implementation +//! Similarly, you can use [`ModelPlugins`] to combine model plugins. //! -//! ```rust +//! # Example implementation of a [`Plugin`] +//! +//! The following is an example implementation of a [`Plugin`] that prints out the service's name +//! and the name of the operation that was hit every time it runs. Since it doesn't act on the HTTP +//! request nor the modeled operation input/output/errors, this plugin can be both an HTTP plugin +//! and a model plugin. In practice, however, you'd only want to register it once, as either an +//! HTTP plugin or a model plugin. +//! +//! ```no_run //! use aws_smithy_http_server::{ //! operation::OperationShape, //! service::ServiceShape, -//! plugin::{Plugin, PluginPipeline, PluginStack}, +//! plugin::{Plugin, HttpMarker, HttpPlugins, ModelMarker}, //! shape_id::ShapeId, //! }; //! # use tower::{layer::util::Stack, Layer, Service}; @@ -137,16 +186,21 @@ //! } //! } //! } -//! ``` //! +//! // This plugin could be registered as an HTTP plugin and a model plugin, so we implement both +//! // marker traits. +//! +//! impl HttpMarker for PrintPlugin { } +//! impl ModelMarker for PrintPlugin { } +//! ``` -pub mod alb_health_check; mod closure; -mod either; +pub(crate) mod either; mod filter; +mod http_plugins; mod identity; mod layer; -mod pipeline; +mod model_plugins; #[doc(hidden)] pub mod scoped; mod stack; @@ -154,9 +208,10 @@ mod stack; pub use closure::{plugin_from_operation_fn, OperationFn}; pub use either::Either; pub use filter::{filter_by_operation, FilterByOperation}; +pub use http_plugins::HttpPlugins; pub use identity::IdentityPlugin; pub use layer::{LayerPlugin, PluginLayer}; -pub use pipeline::PluginPipeline; +pub use model_plugins::ModelPlugins; pub use scoped::Scoped; pub use stack::PluginStack; @@ -188,3 +243,223 @@ where >::apply(self, inner) } } + +/// A HTTP plugin is a plugin that acts on the HTTP request before it is deserialized, and acts on +/// the HTTP response after it is serialized. +/// +/// This trait is a _marker_ trait to indicate that a plugin can be registered as an HTTP plugin. +/// +/// Compare with [`ModelMarker`] in the [module](crate::plugin) documentation, which contains an +/// example implementation too. +pub trait HttpMarker {} +impl<'a, Pl> HttpMarker for &'a Pl where Pl: HttpMarker {} + +/// A model plugin is a plugin that acts on the modeled operation input after it is deserialized, +/// and acts on the modeled operation output or the modeled operation error before it is +/// serialized. +/// +/// This trait is a _marker_ trait to indicate that a plugin can be registered as a model plugin. +/// +/// Compare with [`HttpMarker`] in the [module](crate::plugin) documentation. +/// +/// # Example implementation of a model plugin +/// +/// Model plugins are most useful when you really need to rely on the actual shape of your modeled +/// operation input, operation output, and/or operation errors. For this reason, most (but not all) +/// model plugins are _operation-specific_: somewhere in the type signature of their definition, +/// they'll rely on a particular operation shape's types. It is therefore important that you scope +/// application of model plugins to the operations they are meant to work on, via +/// [`Scoped`](crate::plugin::Scoped) or +/// [`filter_by_operation`](crate::plugin::filter_by_operation). +/// +/// Below is an example implementation of a model plugin that can only be applied to the +/// `CheckHealth` operation: note how in the `Service` trait implementation, we require access to +/// the operation's input, where we log the `health_info` field. +/// +/// ```no_run +/// use std::marker::PhantomData; +/// +/// use aws_smithy_http_server::{operation::OperationShape, plugin::{ModelMarker, Plugin}}; +/// use tower::Service; +/// # pub struct SimpleService; +/// # pub struct CheckHealth; +/// # pub struct CheckHealthInput { +/// # health_info: (), +/// # } +/// # pub struct CheckHealthOutput; +/// # impl aws_smithy_http_server::operation::OperationShape for CheckHealth { +/// # const ID: aws_smithy_http_server::shape_id::ShapeId = aws_smithy_http_server::shape_id::ShapeId::new( +/// # "com.amazonaws.simple#CheckHealth", +/// # "com.amazonaws.simple", +/// # "CheckHealth", +/// # ); +/// # type Input = CheckHealthInput; +/// # type Output = CheckHealthOutput; +/// # type Error = std::convert::Infallible; +/// # } +/// +/// /// A model plugin that can only be applied to the `CheckHealth` operation. +/// pub struct CheckHealthPlugin { +/// pub _exts: PhantomData, +/// } +/// +/// impl CheckHealthPlugin { +/// pub fn new() -> Self { +/// Self { _exts: PhantomData } +/// } +/// } +/// +/// impl Plugin for CheckHealthPlugin { +/// type Output = CheckHealthService; +/// +/// fn apply(&self, input: T) -> Self::Output { +/// CheckHealthService { +/// inner: input, +/// _exts: PhantomData, +/// } +/// } +/// } +/// +/// impl ModelMarker for CheckHealthPlugin { } +/// +/// #[derive(Clone)] +/// pub struct CheckHealthService { +/// inner: S, +/// _exts: PhantomData, +/// } +/// +/// impl Service<(::Input, Exts)> for CheckHealthService +/// where +/// S: Service<(::Input, Exts)>, +/// { +/// type Response = S::Response; +/// type Error = S::Error; +/// type Future = S::Future; +/// +/// fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll> { +/// self.inner.poll_ready(cx) +/// } +/// +/// fn call(&mut self, req: (::Input, Exts)) -> Self::Future { +/// let (input, _exts) = &req; +/// +/// // We have access to `CheckHealth`'s modeled operation input! +/// dbg!(&input.health_info); +/// +/// self.inner.call(req) +/// } +/// } +/// +/// // In `main.rs` or wherever we register plugins, we have to make sure we only apply this plugin +/// // to the the only operation it can be applied to, the `CheckHealth` operation. If we apply the +/// // plugin to other operations, we will get a compilation error. +/// +/// use aws_smithy_http_server::plugin::Scoped; +/// use aws_smithy_http_server::scope; +/// +/// pub fn main() { +/// scope! { +/// struct OnlyCheckHealth { +/// includes: [CheckHealth], +/// excludes: [/* The rest of the operations go here */] +/// } +/// } +/// +/// let model_plugin = CheckHealthPlugin::new(); +/// # _foo(&model_plugin); +/// +/// // Scope the plugin to the `CheckHealth` operation. +/// let scoped_plugin = Scoped::new::(model_plugin); +/// # fn _foo(model_plugin: &CheckHealthPlugin<()>) {} +/// } +/// ``` +/// +/// If you are a service owner and don't care about giving a name to the model plugin, you can +/// simplify this down to: +/// +/// ```no_run +/// use std::marker::PhantomData; +/// +/// use aws_smithy_http_server::operation::OperationShape; +/// use tower::Service; +/// # pub struct SimpleService; +/// # pub struct CheckHealth; +/// # pub struct CheckHealthInput { +/// # health_info: (), +/// # } +/// # pub struct CheckHealthOutput; +/// # impl aws_smithy_http_server::operation::OperationShape for CheckHealth { +/// # const ID: aws_smithy_http_server::shape_id::ShapeId = aws_smithy_http_server::shape_id::ShapeId::new( +/// # "com.amazonaws.simple#CheckHealth", +/// # "com.amazonaws.simple", +/// # "CheckHealth", +/// # ); +/// # type Input = CheckHealthInput; +/// # type Output = CheckHealthOutput; +/// # type Error = std::convert::Infallible; +/// # } +/// +/// #[derive(Clone)] +/// pub struct CheckHealthService { +/// inner: S, +/// _exts: PhantomData, +/// } +/// +/// impl Service<(::Input, Exts)> for CheckHealthService +/// where +/// S: Service<(::Input, Exts)>, +/// { +/// type Response = S::Response; +/// type Error = S::Error; +/// type Future = S::Future; +/// +/// fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll> { +/// self.inner.poll_ready(cx) +/// } +/// +/// fn call(&mut self, req: (::Input, Exts)) -> Self::Future { +/// let (input, _exts) = &req; +/// +/// // We have access to `CheckHealth`'s modeled operation input! +/// dbg!(&input.health_info); +/// +/// self.inner.call(req) +/// } +/// } +/// +/// // In `main.rs`: +/// +/// use aws_smithy_http_server::plugin::LayerPlugin; +/// use aws_smithy_http_server::plugin::Scoped; +/// use aws_smithy_http_server::scope; +/// +/// fn new_check_health_service(inner: S) -> CheckHealthService { +/// CheckHealthService { +/// inner, +/// _exts: PhantomData, +/// } +/// } +/// +/// pub fn main() { +/// scope! { +/// struct OnlyCheckHealth { +/// includes: [CheckHealth], +/// excludes: [/* The rest of the operations go here */] +/// } +/// } +/// +/// # fn new_check_health_service(inner: ()) -> CheckHealthService<(), ()> { +/// # CheckHealthService { +/// # inner, +/// # _exts: PhantomData, +/// # } +/// # } +/// let layer = tower::layer::layer_fn(new_check_health_service); +/// let model_plugin = LayerPlugin(layer); +/// +/// // Scope the plugin to the `CheckHealth` operation. +/// let scoped_plugin = Scoped::new::(model_plugin); +/// } +/// ``` +pub trait ModelMarker {} +impl<'a, Pl> ModelMarker for &'a Pl where Pl: ModelMarker {} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/model_plugins.rs b/rust-runtime/aws-smithy-http-server/src/plugin/model_plugins.rs new file mode 100644 index 00000000000..05dc8568d70 --- /dev/null +++ b/rust-runtime/aws-smithy-http-server/src/plugin/model_plugins.rs @@ -0,0 +1,94 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +// If you make any updates to this file (including Rust docs), make sure you make them to +// `http_plugins.rs` too! + +use crate::plugin::{IdentityPlugin, Plugin, PluginStack}; + +use super::{LayerPlugin, ModelMarker}; + +/// A wrapper struct for composing model plugins. +/// It operates identically to [`HttpPlugins`](crate::plugin::HttpPlugins); see its documentation. +#[derive(Debug)] +pub struct ModelPlugins

(pub(crate) P); + +impl Default for ModelPlugins { + fn default() -> Self { + Self(IdentityPlugin) + } +} + +impl ModelPlugins { + /// Create an empty [`ModelPlugins`]. + /// + /// You can use [`ModelPlugins::push`] to add plugins to it. + pub fn new() -> Self { + Self::default() + } +} + +impl

ModelPlugins

{ + /// Apply a new model plugin after the ones that have already been registered. + /// + /// ```rust + /// use aws_smithy_http_server::plugin::ModelPlugins; + /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin; + /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin; + /// + /// let model_plugins = ModelPlugins::new().push(LoggingPlugin).push(MetricsPlugin); + /// ``` + /// + /// The plugins' runtime logic is executed in registration order. + /// In our example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last. + /// + /// ## Implementation notes + /// + /// Plugins are applied to the underlying [`Service`](tower::Service) in opposite order compared + /// to their registration order. + /// + /// As an example: + /// + /// ```rust,compile_fail + /// #[derive(Debug)] + /// pub struct PrintPlugin; + /// + /// impl Plugin for PrintPlugin + /// // [...] + /// { + /// // [...] + /// fn apply(&self, inner: T) -> Self::Service { + /// PrintService { + /// inner, + /// service_id: Ser::ID, + /// operation_id: Op::ID + /// } + /// } + /// } + /// ``` + // We eagerly require `NewPlugin: ModelMarker`, despite not really needing it, because compiler + // errors get _substantially_ better if the user makes a mistake. + pub fn push(self, new_plugin: NewPlugin) -> ModelPlugins> { + ModelPlugins(PluginStack::new(new_plugin, self.0)) + } + + /// Applies a single [`tower::Layer`] to all operations _before_ they are deserialized. + pub fn layer(self, layer: L) -> ModelPlugins, P>> { + ModelPlugins(PluginStack::new(LayerPlugin(layer), self.0)) + } +} + +impl Plugin for ModelPlugins +where + InnerPlugin: Plugin, +{ + type Output = InnerPlugin::Output; + + fn apply(&self, input: T) -> Self::Output { + self.0.apply(input) + } +} + +impl ModelMarker for ModelPlugins where InnerPlugin: ModelMarker {} diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs b/rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs index a3761b2b1ab..d4b7e82e517 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs @@ -5,7 +5,7 @@ use std::marker::PhantomData; -use super::Plugin; +use super::{HttpMarker, ModelMarker, Plugin}; /// Marker struct for `true`. /// @@ -102,12 +102,15 @@ where } } +impl HttpMarker for Scoped where Pl: HttpMarker {} +impl ModelMarker for Scoped where Pl: ModelMarker {} + /// A macro to help with scoping [plugins](crate::plugin) to a subset of all operations. /// /// The scope must partition _all_ operations, that is, each and every operation must be included or excluded, but not /// both. /// -/// The generated server SDK exports a similar `scope` macro which is aware of a services operations and can complete +/// The generated server SDK exports a similar `scope` macro which is aware of a service's operations and can complete /// underspecified scopes automatically. /// /// # Example diff --git a/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs b/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs index 63f8e448656..c42462ec52f 100644 --- a/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs +++ b/rust-runtime/aws-smithy-http-server/src/plugin/stack.rs @@ -3,13 +3,18 @@ * SPDX-License-Identifier: Apache-2.0 */ -use super::Plugin; +use super::{HttpMarker, ModelMarker, Plugin}; +use std::fmt::Debug; /// A wrapper struct which composes an `Inner` and an `Outer` [`Plugin`]. /// /// The `Inner::map` is run _then_ the `Outer::map`. /// -/// Note that the primary tool for composing plugins is [`PluginPipeline`](crate::plugin::PluginPipeline). +/// Note that the primary tool for composing HTTP plugins is +/// [`HttpPlugins`](crate::plugin::HttpPlugins), and the primary tool for composing HTTP plugins is +/// [`ModelPlugins`](crate::plugin::ModelPlugins); if you are an application writer, you should +/// prefer composing plugins using these. +#[derive(Debug)] pub struct PluginStack { inner: Inner, outer: Outer, @@ -34,3 +39,17 @@ where self.outer.apply(svc) } } + +impl HttpMarker for PluginStack +where + Inner: HttpMarker, + Outer: HttpMarker, +{ +} + +impl ModelMarker for PluginStack +where + Inner: ModelMarker, + Outer: ModelMarker, +{ +} diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs index 491e865dd6a..b3bc24fae25 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs @@ -4,12 +4,13 @@ */ use crate::rejection::MissingContentTypeReason; +use aws_smithy_runtime_api::http::HttpError; use thiserror::Error; #[derive(Debug, Error)] pub enum ResponseRejection { #[error("error serializing JSON-encoded body: {0}")] - Serialization(#[from] aws_smithy_http::operation::error::SerializationError), + Serialization(#[from] aws_smithy_types::error::operation::SerializationError), #[error("error building HTTP response: {0}")] HttpBuild(#[from] http::Error), } @@ -26,6 +27,10 @@ pub enum RequestRejection { JsonDeserialize(#[from] aws_smithy_json::deserialize::error::DeserializeError), #[error("request does not adhere to modeled constraints: {0}")] ConstraintViolation(String), + + /// Typically happens when the request has headers that are not valid UTF-8. + #[error("failed to convert request: {0}")] + HttpConversion(#[from] HttpError), } impl From for RequestRejection { diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs index 2cd48f8e612..cba990ffbf3 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs @@ -38,7 +38,7 @@ pub enum Error { // This constant determines when the `TinyMap` implementation switches from being a `Vec` to a // `HashMap`. This is chosen to be 15 as a result of the discussion around -// https://github.com/awslabs/smithy-rs/pull/1429#issuecomment-1147516546 +// https://github.com/smithy-lang/smithy-rs/pull/1429#issuecomment-1147516546 const ROUTE_CUTOFF: usize = 15; /// A [`Router`] supporting [`AWS JSON 1.0`] and [`AWS JSON 1.1`] protocols. diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs index f3093685e2e..30a28d6255a 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs @@ -23,7 +23,7 @@ impl IntoResponse for Error { UNKNOWN_OPERATION_EXCEPTION.to_string(), )) .body(empty()) - .expect("invalid HTTP response for AWS JSON 1.0 routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues"), + .expect("invalid HTTP response for AWS JSON 1.0 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"), } } } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs index 898d8c29af0..5ebd1002f28 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs @@ -23,7 +23,7 @@ impl IntoResponse for Error { UNKNOWN_OPERATION_EXCEPTION.to_string(), )) .body(empty()) - .expect("invalid HTTP response for AWS JSON 1.1 routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues"), + .expect("invalid HTTP response for AWS JSON 1.1 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"), } } } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs b/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs index 004d32a38b9..0b3faf0136e 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/mod.rs @@ -11,7 +11,9 @@ pub mod rest_json_1; pub mod rest_xml; use crate::rejection::MissingContentTypeReason; -use http::HeaderMap; +use aws_smithy_runtime_api::http::Headers as SmithyHeaders; +use http::header::CONTENT_TYPE; +use http::{HeaderMap, HeaderValue}; #[cfg(test)] pub mod test_helpers { @@ -37,12 +39,25 @@ pub mod test_helpers { } } +#[allow(clippy::result_large_err)] +fn parse_mime(content_type: &str) -> Result { + content_type + .parse::() + .map_err(MissingContentTypeReason::MimeParseError) +} + /// When there are no modeled inputs, /// a request body is empty and the content-type request header must not be set #[allow(clippy::result_large_err)] -pub fn content_type_header_empty_body_no_modeled_input(headers: &HeaderMap) -> Result<(), MissingContentTypeReason> { +pub fn content_type_header_empty_body_no_modeled_input( + headers: &SmithyHeaders, +) -> Result<(), MissingContentTypeReason> { if headers.contains_key(http::header::CONTENT_TYPE) { - let found_mime = parse_content_type(headers)?; + let found_mime = headers + .get(http::header::CONTENT_TYPE) + .unwrap() // The header is present, `unwrap` will not panic. + .parse::() + .map_err(MissingContentTypeReason::MimeParseError)?; Err(MissingContentTypeReason::UnexpectedMimeType { expected_mime: None, found_mime: Some(found_mime), @@ -52,34 +67,46 @@ pub fn content_type_header_empty_body_no_modeled_input(headers: &HeaderMap) -> R } } +/// Checks that the `content-type` header is valid from a Smithy `Headers`. #[allow(clippy::result_large_err)] -fn parse_content_type(headers: &HeaderMap) -> Result { - headers - .get(http::header::CONTENT_TYPE) - .unwrap() // The header is present, `unwrap` will not panic. - .to_str() - .map_err(MissingContentTypeReason::ToStrError)? - .parse::() - .map_err(MissingContentTypeReason::MimeParseError) +pub fn content_type_header_classifier_smithy( + headers: &SmithyHeaders, + expected_content_type: Option<&'static str>, +) -> Result<(), MissingContentTypeReason> { + match headers.get(CONTENT_TYPE) { + Some(content_type) => content_type_header_classifier(content_type, expected_content_type), + None => Ok(()), + } } -/// Checks that the `content-type` header is valid. +/// Checks that the `content-type` header is valid from a `http::HeaderMap`. #[allow(clippy::result_large_err)] -pub fn content_type_header_classifier( - headers: &HeaderMap, +pub fn content_type_header_classifier_http( + headers: &HeaderMap, expected_content_type: Option<&'static str>, ) -> Result<(), MissingContentTypeReason> { - if !headers.contains_key(http::header::CONTENT_TYPE) { - return Ok(()); + if let Some(content_type) = headers.get(http::header::CONTENT_TYPE) { + let content_type = content_type.to_str().map_err(MissingContentTypeReason::ToStrError)?; + content_type_header_classifier(content_type, expected_content_type) + } else { + Ok(()) } - let found_mime = parse_content_type(headers)?; +} + +/// Checks that the `content-type` header is valid. +#[allow(clippy::result_large_err)] +fn content_type_header_classifier( + content_type: &str, + expected_content_type: Option<&'static str>, +) -> Result<(), MissingContentTypeReason> { + let found_mime = parse_mime(content_type)?; // There is a `content-type` header. // If there is an implied content type, they must match. if let Some(expected_content_type) = expected_content_type { let expected_mime = expected_content_type .parse::() // `expected_content_type` comes from the codegen. - .expect("BUG: MIME parsing failed, `expected_content_type` is not valid. Please file a bug report under https://github.com/awslabs/smithy-rs/issues"); + .expect("BUG: MIME parsing failed, `expected_content_type` is not valid. Please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"); if expected_content_type != found_mime { return Err(MissingContentTypeReason::UnexpectedMimeType { expected_mime: Some(expected_mime), @@ -133,6 +160,7 @@ pub fn accept_header_classifier(headers: &HeaderMap, content_type: &mime::Mime) #[cfg(test)] mod tests { use super::*; + use aws_smithy_runtime_api::http::Headers; use http::header::{HeaderValue, ACCEPT, CONTENT_TYPE}; fn req_content_type(content_type: &'static str) -> HeaderMap { @@ -151,13 +179,14 @@ mod tests { #[test] fn check_content_type_header_empty_body_no_modeled_input() { - assert!(content_type_header_empty_body_no_modeled_input(&HeaderMap::new()).is_ok()); + assert!(content_type_header_empty_body_no_modeled_input(&Headers::new()).is_ok()); } #[test] fn check_invalid_content_type_header_empty_body_no_modeled_input() { - let valid_request = req_content_type("application/json"); - let result = content_type_header_empty_body_no_modeled_input(&valid_request).unwrap_err(); + let mut valid = Headers::new(); + valid.insert(CONTENT_TYPE, "application/json"); + let result = content_type_header_empty_body_no_modeled_input(&valid).unwrap_err(); assert!(matches!( result, MissingContentTypeReason::UnexpectedMimeType { @@ -171,40 +200,50 @@ mod tests { fn check_invalid_content_type() { let invalid = vec!["application/jason", "text/xml"]; for invalid_mime in invalid { - let request = req_content_type(invalid_mime); - let result = content_type_header_classifier(&request, EXPECTED_MIME_APPLICATION_JSON); + let headers = req_content_type(invalid_mime); + let mut results = Vec::new(); + results.push(content_type_header_classifier_http( + &headers, + EXPECTED_MIME_APPLICATION_JSON, + )); + results.push(content_type_header_classifier_smithy( + &Headers::try_from(headers).unwrap(), + EXPECTED_MIME_APPLICATION_JSON, + )); // Validates the rejection type since we cannot implement `PartialEq` // for `MissingContentTypeReason`. - match result { - Ok(()) => panic!("Content-type validation is expected to fail"), - Err(e) => match e { - MissingContentTypeReason::UnexpectedMimeType { - expected_mime, - found_mime, - } => { - assert_eq!( - expected_mime.unwrap(), - "application/json".parse::().unwrap() - ); - assert_eq!(found_mime, invalid_mime.parse::().ok()); - } - _ => panic!("Unexpected `MissingContentTypeReason`: {}", e), - }, + for result in results { + match result { + Ok(()) => panic!("Content-type validation is expected to fail"), + Err(e) => match e { + MissingContentTypeReason::UnexpectedMimeType { + expected_mime, + found_mime, + } => { + assert_eq!( + expected_mime.unwrap(), + "application/json".parse::().unwrap() + ); + assert_eq!(found_mime, invalid_mime.parse::().ok()); + } + _ => panic!("Unexpected `MissingContentTypeReason`: {}", e), + }, + } } } } #[test] fn check_missing_content_type_is_allowed() { - let result = content_type_header_classifier(&HeaderMap::new(), EXPECTED_MIME_APPLICATION_JSON); + let result = content_type_header_classifier_http(&HeaderMap::new(), EXPECTED_MIME_APPLICATION_JSON); assert!(result.is_ok()); } #[test] fn check_not_parsable_content_type() { let request = req_content_type("123"); - let result = content_type_header_classifier(&request, EXPECTED_MIME_APPLICATION_JSON); + let result = content_type_header_classifier_http(&request, EXPECTED_MIME_APPLICATION_JSON); assert!(matches!( result.unwrap_err(), MissingContentTypeReason::MimeParseError(_) @@ -214,7 +253,7 @@ mod tests { #[test] fn check_non_ascii_visible_characters_content_type() { let request = req_content_type("application/💩"); - let result = content_type_header_classifier(&request, EXPECTED_MIME_APPLICATION_JSON); + let result = content_type_header_classifier_http(&request, EXPECTED_MIME_APPLICATION_JSON); assert!(matches!(result.unwrap_err(), MissingContentTypeReason::ToStrError(_))); } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs index e931f31052e..f843c6209fd 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs @@ -48,6 +48,7 @@ //! Consult `crate::protocol::$protocolName::rejection` for rejection types for other protocols. use crate::rejection::MissingContentTypeReason; +use aws_smithy_runtime_api::http::HttpError; use std::num::TryFromIntError; use thiserror::Error; @@ -67,7 +68,7 @@ pub enum ResponseRejection { /// `httpHeader` or `httpPrefixHeaders`. /// Used when failing to serialize an `httpPayload`-bound struct into an HTTP response body. #[error("error building HTTP response: {0}")] - Build(#[from] aws_smithy_http::operation::error::BuildError), + Build(#[from] aws_smithy_types::error::operation::BuildError), /// Used when failing to serialize a struct into a `String` for the JSON-encoded HTTP response /// body. @@ -76,7 +77,7 @@ pub enum ResponseRejection { /// supplied timestamp is outside of the valid range when formatting using RFC-3339, i.e. a /// date outside the `0001-01-01T00:00:00.000Z`-`9999-12-31T23:59:59.999Z` range is supplied. #[error("error serializing JSON-encoded body: {0}")] - Serialization(#[from] aws_smithy_http::operation::error::SerializationError), + Serialization(#[from] aws_smithy_types::error::operation::SerializationError), /// Used when consuming an [`http::response::Builder`] into the constructed [`http::Response`] /// when calling [`http::response::Builder::body`]. @@ -115,6 +116,8 @@ pub enum RequestRejection { NotAcceptable, /// Used when checking the `Content-Type` header. + /// This is bubbled up in the generated SDK when calling + /// [`crate::protocol::content_type_header_classifier_smithy`] in `from_request`. #[error("expected `Content-Type` header not found: {0}")] MissingContentType(#[from] MissingContentTypeReason), @@ -161,6 +164,10 @@ pub enum RequestRejection { // This rejection is constructed directly in the code-generated SDK instead of in this crate. #[error("request does not adhere to modeled constraints: {0}")] ConstraintViolation(String), + + /// Typically happens when the request has headers that are not valid UTF-8. + #[error("failed to convert request: {0}")] + HttpConversion(#[from] HttpError), } // Consider a conversion between `T` and `U` followed by a bubbling up of the conversion error diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs index 76d3d692778..023b43031c8 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs @@ -23,7 +23,7 @@ impl IntoResponse for Error { UNKNOWN_OPERATION_EXCEPTION.to_string(), )) .body(crate::body::to_boxed("{}")) - .expect("invalid HTTP response for REST JSON 1 routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues"), + .expect("invalid HTTP response for REST JSON 1 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"), Error::MethodNotAllowed => method_disallowed(), } } diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs index 5faf3ea8cf1..9b2a7b21e77 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs @@ -47,6 +47,9 @@ pub enum RuntimeError { InternalFailure(crate::Error), /// Request contained an `Accept` header with a MIME type, and the server cannot return a response /// body adhering to that MIME type. + /// This is returned directly (i.e. without going through a [`RequestRejection`] first) in the + /// generated SDK when calling [`crate::protocol::accept_header_classifier`] in + /// `from_request`. NotAcceptable, /// The request does not contain the expected `Content-Type` header value. UnsupportedMediaType, diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs index 3e1bed00ca3..75af5c76916 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs @@ -8,6 +8,7 @@ //! [`RequestRejection::XmlDeserialize`]. use crate::rejection::MissingContentTypeReason; +use aws_smithy_runtime_api::http::HttpError; use std::num::TryFromIntError; use thiserror::Error; @@ -16,9 +17,9 @@ pub enum ResponseRejection { #[error("invalid bound HTTP status code; status codes must be inside the 100-999 range: {0}")] InvalidHttpStatusCode(TryFromIntError), #[error("error building HTTP response: {0}")] - Build(#[from] aws_smithy_http::operation::error::BuildError), + Build(#[from] aws_smithy_types::error::operation::BuildError), #[error("error serializing XML-encoded body: {0}")] - Serialization(#[from] aws_smithy_http::operation::error::SerializationError), + Serialization(#[from] aws_smithy_types::error::operation::SerializationError), #[error("error building HTTP response: {0}")] HttpBuild(#[from] http::Error), } @@ -58,6 +59,10 @@ pub enum RequestRejection { #[error("request does not adhere to modeled constraints: {0}")] ConstraintViolation(String), + + /// Typically happens when the request has headers that are not valid UTF-8. + #[error("failed to convert request: {0}")] + HttpConversion(#[from] HttpError), } impl From for RequestRejection { diff --git a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs index d8a0905a7f7..529a3d19a2a 100644 --- a/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs +++ b/rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs @@ -24,7 +24,7 @@ impl IntoResponse for Error { UNKNOWN_OPERATION_EXCEPTION.to_string(), )) .body(empty()) - .expect("invalid HTTP response for REST XML routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues"), + .expect("invalid HTTP response for REST XML routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"), Error::MethodNotAllowed => method_disallowed(), } } diff --git a/rust-runtime/aws-smithy-http-server/src/request/connect_info.rs b/rust-runtime/aws-smithy-http-server/src/request/connect_info.rs index 7a48e704216..92a35e40173 100644 --- a/rust-runtime/aws-smithy-http-server/src/request/connect_info.rs +++ b/rust-runtime/aws-smithy-http-server/src/request/connect_info.rs @@ -7,7 +7,7 @@ //! [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo) is used. [`ConnectInfo`]'s //! [`FromParts`] implementation allows it to be extracted from the [`http::Request`]. //! -//! The [`example service`](https://github.com/awslabs/smithy-rs/blob/main/examples/pokemon-service/src/main.rs) +//! The [`example service`](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/main.rs) //! illustrates the use of [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo) //! and [`ConnectInfo`] with a service builder. diff --git a/rust-runtime/aws-smithy-http-server/src/request/mod.rs b/rust-runtime/aws-smithy-http-server/src/request/mod.rs index be507b804fc..c33b151ef9a 100644 --- a/rust-runtime/aws-smithy-http-server/src/request/mod.rs +++ b/rust-runtime/aws-smithy-http-server/src/request/mod.rs @@ -34,7 +34,7 @@ //! Types and traits for extracting data from requests. //! -//! See [Accessing Un-modelled data](https://github.com/awslabs/smithy-rs/blob/main/design/src/server/from_parts.md) +//! See [Accessing Un-modelled data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md) //! a comprehensive overview. //! //! The following implementations exist: diff --git a/rust-runtime/aws-smithy-http-server/src/request/request_id.rs b/rust-runtime/aws-smithy-http-server/src/request/request_id.rs index 7d6ee70ab71..a97288841cc 100644 --- a/rust-runtime/aws-smithy-http-server/src/request/request_id.rs +++ b/rust-runtime/aws-smithy-http-server/src/request/request_id.rs @@ -32,13 +32,14 @@ //! todo!() //! } //! -//! let app = Service::builder_without_plugins() +//! let config = ServiceConfig::builder() +//! // Generate a server request ID and add it to the response header. +//! .layer(ServerRequestIdProviderLayer::new_with_response_header(HeaderName::from_static("x-request-id"))) +//! .build(); +//! let app = Service::builder(config) //! .operation(handler) //! .build().unwrap(); //! -//! let app = app -//! .layer(&ServerRequestIdProviderLayer::new_with_response_header(HeaderName::from_static("x-request-id"))); /* Generate a server request ID and add it to the response header */ -//! //! let bind: std::net::SocketAddr = format!("{}:{}", args.address, args.port) //! .parse() //! .expect("unable to parse the server bind address and port"); diff --git a/rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs b/rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs index 44704e2dd14..5c44b01ebd4 100644 --- a/rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs +++ b/rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs @@ -51,7 +51,7 @@ where } /// Converts a `lambda_http::Request` into a `http::Request` -/// Issue: +/// Issue: /// /// While converting the event the [API Gateway Stage] portion of the URI /// is removed from the uri that gets returned as a new `http::Request`. diff --git a/rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs b/rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs index 3ae722f5fd6..472f66873fe 100644 --- a/rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs +++ b/rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs @@ -67,7 +67,7 @@ pub struct UriSpec { } impl UriSpec { - // TODO(https://github.com/awslabs/smithy-rs/issues/950): When we add support for the endpoint + // TODO(https://github.com/smithy-lang/smithy-rs/issues/950): When we add support for the endpoint // trait, this constructor will take in a first argument `host_prefix`. pub fn new(path_and_query: PathAndQuerySpec) -> Self { UriSpec { @@ -115,7 +115,7 @@ impl From<&PathSpec> for Regex { .fold(String::new(), |a, b| a + sep + &b) }; - Regex::new(&format!("^{}$", re)).expect("invalid `Regex` from `PathSpec`; please file a bug report under https://github.com/awslabs/smithy-rs/issues") + Regex::new(&format!("^{}$", re)).expect("invalid `Regex` from `PathSpec`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues") } } @@ -150,7 +150,7 @@ impl RequestSpec { /// kind of conflicts. However, the Smithy CLI does allow _other_ conflicting patterns to /// coexist, e.g. `/` and `/{label}`. We therefore have to take a stance on (1), since if we /// route arbitrarily [we render basic usage - /// impossible](https://github.com/awslabs/smithy-rs/issues/1009). + /// impossible](https://github.com/smithy-lang/smithy-rs/issues/1009). /// So this ranking of routes implements some basic pattern conflict disambiguation with some /// common sense. It's also the same behavior that [the TypeScript sSDK is implementing]. /// diff --git a/rust-runtime/aws-smithy-http-server/src/runtime_error.rs b/rust-runtime/aws-smithy-http-server/src/runtime_error.rs index 7348f5d628f..86350fe4c90 100644 --- a/rust-runtime/aws-smithy-http-server/src/runtime_error.rs +++ b/rust-runtime/aws-smithy-http-server/src/runtime_error.rs @@ -10,4 +10,4 @@ /// [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`] variant. pub struct InternalFailureException; -pub const INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE: &str = "invalid HTTP response for `RuntimeError`; please file a bug report under https://github.com/awslabs/smithy-rs/issues"; +pub const INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE: &str = "invalid HTTP response for `RuntimeError`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues"; diff --git a/rust-runtime/aws-smithy-http-tower/Cargo.toml b/rust-runtime/aws-smithy-http-tower/Cargo.toml index 048a96f922f..f661b1283b5 100644 --- a/rust-runtime/aws-smithy-http-tower/Cargo.toml +++ b/rust-runtime/aws-smithy-http-tower/Cargo.toml @@ -2,24 +2,10 @@ name = "aws-smithy-http-tower" version = "0.0.0-smithy-rs-head" authors = ["AWS Rust SDK Team ", "Russell Cohen "] -description = "Tower-compatible shims for smithy-rs middleware." +description = "This crate is no longer used by smithy-rs and is deprecated." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" - -[dependencies] -aws-smithy-types = { path = "../aws-smithy-types" } -aws-smithy-http = { path = "../aws-smithy-http" } -tower = { version = "0.4.4" } -pin-project-lite = "0.2.9" -http = "0.2.3" -bytes = "1" -http-body = "0.4.4" -tracing = "0.1" - -[dev-dependencies] -tower = { version = "0.4.4", features = ["util"] } -tokio = { version = "1.23.1", features = ["full"]} +repository = "https://github.com/smithy-lang/smithy-rs" [package.metadata.docs.rs] all-features = true diff --git a/rust-runtime/aws-smithy-http-tower/README.md b/rust-runtime/aws-smithy-http-tower/README.md index a8ce891921d..49463a84202 100644 --- a/rust-runtime/aws-smithy-http-tower/README.md +++ b/rust-runtime/aws-smithy-http-tower/README.md @@ -1,7 +1,7 @@ # aws-smithy-http-tower -Bindings between the framework-agnostic traits in `aws-smithy-http` and Tower. +This crate is no longer used by smithy-rs and is deprecated. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http-tower/external-types.toml b/rust-runtime/aws-smithy-http-tower/external-types.toml index 552b7f76eb3..7fa182b39d1 100644 --- a/rust-runtime/aws-smithy-http-tower/external-types.toml +++ b/rust-runtime/aws-smithy-http-tower/external-types.toml @@ -1,12 +1 @@ -allowed_external_types = [ - "aws_smithy_http::*", - "http::request::Request", - "http::response::Response", - "tower_service::Service", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose on `tower::BoxError` - "tower::BoxError", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide if we want to continue exposing tower_layer - "tower_layer::Layer", -] +allowed_external_types = [] diff --git a/rust-runtime/aws-smithy-http-tower/src/dispatch.rs b/rust-runtime/aws-smithy-http-tower/src/dispatch.rs deleted file mode 100644 index a10693a62b5..00000000000 --- a/rust-runtime/aws-smithy-http-tower/src/dispatch.rs +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::SendOperationError; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::connection::CaptureSmithyConnection; -use aws_smithy_http::operation; -use aws_smithy_http::result::ConnectorError; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tower::{Layer, Service}; -use tracing::{debug_span, trace, Instrument}; - -/// Connects Operation driven middleware to an HTTP implementation. -/// -/// It will also wrap the error type in OperationError to enable operation middleware -/// reporting specific errors -#[derive(Clone)] -pub struct DispatchService { - inner: S, -} - -type BoxedResultFuture = Pin> + Send>>; - -impl Service for DispatchService -where - S: Service, Response = http::Response> + Clone + Send + 'static, - S::Error: Into, - S::Future: Send + 'static, -{ - type Response = operation::Response; - type Error = SendOperationError; - type Future = BoxedResultFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner - .poll_ready(cx) - .map_err(|e| SendOperationError::RequestDispatchError(e.into())) - } - - fn call(&mut self, req: operation::Request) -> Self::Future { - let (mut req, property_bag) = req.into_parts(); - // copy the smithy connection - if let Some(smithy_conn) = property_bag.acquire().get::() { - req.extensions_mut().insert(smithy_conn.clone()); - } else { - println!("nothing to copy!"); - } - let mut inner = self.inner.clone(); - let future = async move { - trace!(request = ?req, "dispatching request"); - inner - .call(req) - .await - .map(|resp| operation::Response::from_parts(resp, property_bag)) - .map_err(|e| SendOperationError::RequestDispatchError(e.into())) - } - .instrument(debug_span!("dispatch")); - Box::pin(future) - } -} - -#[derive(Clone, Default)] -#[non_exhaustive] -pub struct DispatchLayer; - -impl DispatchLayer { - pub fn new() -> Self { - DispatchLayer - } -} - -impl Layer for DispatchLayer -where - S: Service>, -{ - type Service = DispatchService; - - fn layer(&self, inner: S) -> Self::Service { - DispatchService { inner } - } -} diff --git a/rust-runtime/aws-smithy-http-tower/src/lib.rs b/rust-runtime/aws-smithy-http-tower/src/lib.rs index 8a417961140..32e46abdb4b 100644 --- a/rust-runtime/aws-smithy-http-tower/src/lib.rs +++ b/rust-runtime/aws-smithy-http-tower/src/lib.rs @@ -3,130 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -#![allow(clippy::derive_partial_eq_without_eq)] +//! This crate is no longer used by smithy-rs and is deprecated. + #![warn( - // missing_docs, - // rustdoc::missing_crate_level_docs, + missing_docs, + rustdoc::missing_crate_level_docs, unreachable_pub, rust_2018_idioms )] - -pub mod dispatch; -pub mod map_request; -pub mod parse_response; - -use aws_smithy_http::result::{ConnectorError, SdkError}; -use tower::BoxError; - -/// An Error Occurred During the process of sending an Operation -/// -/// The variants are split to enable the final [SdkError](`aws_smithy_http::result::SdkError`) to differentiate -/// between two types of errors: -/// 1. [`RequestConstructionError`](SendOperationError::RequestConstructionError): Errors where the -/// SDK never attempted to dispatch the underlying `http::Request`. These represent errors that -/// occurred during the request construction pipeline. These generally stem from configuration issues. -/// 2. [`RequestDispatchError`](SendOperationError::RequestDispatchError): Errors where the inner -/// tower service failed (e.g. because the hostname couldn't be resolved, connection errors, -/// socket hangup etc.). In this case, we don't know how much of the request was _actually_ sent -/// to the client. We only know that we never got back an `http::Response` (and instead got an error). -/// -/// `SendOperationError` is currently defined only in `aws-smithy-http-tower` because it may be removed -/// or replaced with `SdkError` in the future. -/// -/// `SendOperationError` MAY be moved to a private module in the future. -#[derive(Debug)] -pub enum SendOperationError { - /// The request could not be constructed - /// - /// These errors usually stem from configuration issues (e.g. no region, bad credential provider, etc.) - RequestConstructionError(BoxError), - - /// The request could not be dispatched - RequestDispatchError(ConnectorError), -} - -/// Convert a `SendOperationError` into an `SdkError` -impl From for SdkError { - fn from(err: SendOperationError) -> Self { - match err { - SendOperationError::RequestDispatchError(e) => { - aws_smithy_http::result::SdkError::dispatch_failure(e) - } - SendOperationError::RequestConstructionError(e) => { - aws_smithy_http::result::SdkError::construction_failure(e) - } - } - } -} - -#[cfg(test)] -mod tests { - use crate::dispatch::DispatchLayer; - use crate::map_request::MapRequestLayer; - use crate::parse_response::ParseResponseLayer; - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::middleware::MapRequest; - use aws_smithy_http::operation; - use aws_smithy_http::operation::{Operation, Request}; - use aws_smithy_http::response::ParseStrictResponse; - use aws_smithy_http::result::ConnectorError; - use aws_smithy_http::retry::DefaultResponseRetryClassifier; - use bytes::Bytes; - use http::Response; - use std::convert::{Infallible, TryInto}; - use tower::{service_fn, Service, ServiceBuilder}; - - /// Creates a stubbed service stack and runs it to validate that all the types line up & - /// everything is properly wired - #[tokio::test] - async fn service_stack() { - #[derive(Clone)] - struct AddHeader; - impl MapRequest for AddHeader { - type Error = Infallible; - - fn name(&self) -> &'static str { - "add_header" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|mut req, _| { - req.headers_mut() - .insert("X-Test", "Value".try_into().unwrap()); - Ok(req) - }) - } - } - - struct TestParseResponse; - impl ParseStrictResponse for TestParseResponse { - type Output = Result; - - fn parse(&self, _response: &Response) -> Self::Output { - Ok("OK".to_string()) - } - } - - let http_layer = service_fn(|_request: http::Request| async move { - if _request.headers().contains_key("X-Test") { - Ok(http::Response::new(SdkBody::from("ok"))) - } else { - Err(ConnectorError::user("header not set".into())) - } - }); - - let mut svc = ServiceBuilder::new() - .layer(ParseResponseLayer::< - TestParseResponse, - DefaultResponseRetryClassifier, - >::new()) - .layer(MapRequestLayer::for_mapper(AddHeader)) - .layer(DispatchLayer) - .service(http_layer); - let req = http::Request::new(SdkBody::from("hello")); - let req = operation::Request::new(req); - let req = Operation::new(req, TestParseResponse); - let resp = svc.call(req).await.expect("Response should succeed"); - assert_eq!(resp.parsed, "OK".to_string()) - } -} diff --git a/rust-runtime/aws-smithy-http-tower/src/map_request.rs b/rust-runtime/aws-smithy-http-tower/src/map_request.rs deleted file mode 100644 index 5dd72a0c89d..00000000000 --- a/rust-runtime/aws-smithy-http-tower/src/map_request.rs +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::SendOperationError; -use aws_smithy_http::middleware::{AsyncMapRequest, MapRequest}; -use aws_smithy_http::operation; -use pin_project_lite::pin_project; -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tower::{Layer, Service}; -use tracing::{debug_span, Instrument}; - -#[derive(Debug)] -pub struct AsyncMapRequestLayer { - mapper: M, -} - -impl AsyncMapRequestLayer { - pub fn for_mapper(mapper: M) -> Self { - AsyncMapRequestLayer { mapper } - } -} - -impl Layer for AsyncMapRequestLayer -where - M: Clone, -{ - type Service = AsyncMapRequestService; - - fn layer(&self, inner: S) -> Self::Service { - AsyncMapRequestService { - inner, - mapper: self.mapper.clone(), - } - } -} - -/// Tower service for [`AsyncMapRequest`](aws_smithy_http::middleware::AsyncMapRequest) -#[derive(Clone)] -pub struct AsyncMapRequestService { - inner: S, - mapper: M, -} - -type BoxFuture = Pin + Send>>; - -impl Service for AsyncMapRequestService -where - S: Service + Clone + Send + 'static, - M: AsyncMapRequest, - S::Future: Send + 'static, -{ - type Response = S::Response; - type Error = S::Error; - type Future = BoxFuture>; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, req: operation::Request) -> Self::Future { - let mapper_name = self.mapper.name(); - let mut inner = self.inner.clone(); - let future = self.mapper.apply(req); - Box::pin(async move { - let span = debug_span!("async_map_request", name = mapper_name); - let mapped_request = future - .instrument(span) - .await - .map_err(|e| SendOperationError::RequestConstructionError(e.into()))?; - inner.call(mapped_request).await - }) - } -} - -#[derive(Debug, Default)] -pub struct MapRequestLayer { - mapper: M, -} - -impl MapRequestLayer { - pub fn for_mapper(mapper: M) -> Self { - MapRequestLayer { mapper } - } -} - -impl Layer for MapRequestLayer -where - M: Clone, -{ - type Service = MapRequestService; - - fn layer(&self, inner: S) -> Self::Service { - MapRequestService { - inner, - mapper: self.mapper.clone(), - } - } -} - -pin_project! { - #[project = EnumProj] - pub enum MapRequestFuture { - Inner { - #[pin] - inner: F - }, - Ready { inner: Option }, - } -} - -impl Future for MapRequestFuture -where - F: Future>, -{ - type Output = Result; - - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - match self.project() { - EnumProj::Inner { inner: f } => f.poll(cx), - EnumProj::Ready { inner: e } => Poll::Ready(Err(e.take().unwrap())), - } - } -} - -/// Tower service for [`MapRequest`](aws_smithy_http::middleware::MapRequest) -#[derive(Clone)] -pub struct MapRequestService { - inner: S, - mapper: M, -} - -impl Service for MapRequestService -where - S: Service, - M: MapRequest, -{ - type Response = S::Response; - type Error = S::Error; - type Future = MapRequestFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, req: operation::Request) -> Self::Future { - let span = debug_span!("map_request", name = self.mapper.name()); - let mapper = &self.mapper; - match span - .in_scope(|| mapper.apply(req)) - .map_err(|e| SendOperationError::RequestConstructionError(e.into())) - { - Err(e) => MapRequestFuture::Ready { inner: Some(e) }, - Ok(req) => MapRequestFuture::Inner { - inner: self.inner.call(req), - }, - } - } -} diff --git a/rust-runtime/aws-smithy-http-tower/src/parse_response.rs b/rust-runtime/aws-smithy-http-tower/src/parse_response.rs deleted file mode 100644 index 1f6767c661c..00000000000 --- a/rust-runtime/aws-smithy-http-tower/src/parse_response.rs +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::SendOperationError; -use aws_smithy_http::middleware::load_response; -use aws_smithy_http::operation; -use aws_smithy_http::operation::Operation; -use aws_smithy_http::response::ParseHttpResponse; -use aws_smithy_http::result::{SdkError, SdkSuccess}; -use std::future::Future; -use std::marker::PhantomData; -use std::pin::Pin; -use std::task::{Context, Poll}; -use tower::{Layer, Service}; -use tracing::{debug_span, Instrument}; - -/// `ParseResponseService` dispatches [`Operation`](aws_smithy_http::operation::Operation)s and parses them. -/// -/// `ParseResponseService` is intended to wrap a `DispatchService` which will handle the interface between -/// services that operate on [`operation::Request`](operation::Request) and services that operate -/// on [`http::Request`](http::Request). -#[derive(Clone)] -pub struct ParseResponseService { - inner: S, - _output_type: PhantomData<(O, R)>, -} - -#[derive(Default)] -pub struct ParseResponseLayer { - _output_type: PhantomData<(O, R)>, -} - -/// `ParseResponseLayer` dispatches [`Operation`](aws_smithy_http::operation::Operation)s and parses them. -impl ParseResponseLayer { - pub fn new() -> Self { - ParseResponseLayer { - _output_type: Default::default(), - } - } -} - -impl Layer for ParseResponseLayer -where - S: Service, -{ - type Service = ParseResponseService; - - fn layer(&self, inner: S) -> Self::Service { - ParseResponseService { - inner, - _output_type: Default::default(), - } - } -} - -type BoxedResultFuture = Pin> + Send>>; - -/// ParseResponseService -/// -/// Generic Parameter Listing: -/// `S`: The inner service -/// `O`: The type of the response parser whose output type is `Result` -/// `T`: The happy path return of the response parser -/// `E`: The error path return of the response parser -/// `R`: The type of the retry policy -impl - Service> - for ParseResponseService -where - InnerService: - Service, - InnerService::Future: Send + 'static, - ResponseHandler: ParseHttpResponse> - + Send - + Sync - + 'static, - FailureResponse: std::error::Error + 'static, -{ - type Response = SdkSuccess; - type Error = SdkError; - type Future = BoxedResultFuture; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx).map_err(|err| err.into()) - } - - fn call(&mut self, req: Operation) -> Self::Future { - let (req, parts) = req.into_request_response(); - let handler = parts.response_handler; - let resp = self.inner.call(req); - Box::pin(async move { - match resp.await { - Err(e) => Err(e.into()), - Ok(resp) => { - load_response(resp, &handler) - // load_response contains reading the body as far as is required & parsing the response - .instrument(debug_span!("load_response")) - .await - } - } - }) - } -} diff --git a/rust-runtime/aws-smithy-http/Cargo.toml b/rust-runtime/aws-smithy-http/Cargo.toml index 0238f5dfc6a..2517342b794 100644 --- a/rust-runtime/aws-smithy-http/Cargo.toml +++ b/rust-runtime/aws-smithy-http/Cargo.toml @@ -8,15 +8,16 @@ authors = [ description = "Smithy HTTP logic for smithy-rs." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] -rt-tokio = ["dep:tokio-util", "dep:tokio", "tokio?/rt", "tokio?/fs", "tokio?/io-util", "tokio-util?/io"] event-stream = ["aws-smithy-eventstream"] +rt-tokio = ["aws-smithy-types/rt-tokio"] [dependencies] aws-smithy-eventstream = { path = "../aws-smithy-eventstream", optional = true } -aws-smithy-types = { path = "../aws-smithy-types" } +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["client", "http-02x"] } +aws-smithy-types = { path = "../aws-smithy-types", features = ["byte-stream-poll-next", "http-body-0-4-x"] } bytes = "1" bytes-utils = "0.1" http = "0.2.3" @@ -27,30 +28,19 @@ pin-project-lite = "0.2.9" pin-utils = "0.1.0" tracing = "0.1" -# We are using hyper for our streaming body implementation, but this is an internal detail. -hyper = "0.14.26" - -# ByteStream internals +# For an adapter to enable the `Stream` trait for `aws_smithy_types::byte_stream::ByteStream` futures-core = "0.3.14" -tokio = { version = "1.23.1", optional = true } -tokio-util = { version = "0.7", optional = true } [dev-dependencies] async-stream = "0.3" futures-util = { version = "0.3.16", default-features = false } hyper = { version = "0.14.26", features = ["stream"] } -pretty_assertions = "1.3" proptest = "1" tokio = { version = "1.23.1", features = [ "macros", "rt", "rt-multi-thread", - "fs", - "io-util", ] } -tokio-stream = "0.1.5" -tempfile = "3.2.0" -tracing-test = "0.2.1" [package.metadata.docs.rs] all-features = true diff --git a/rust-runtime/aws-smithy-http/README.md b/rust-runtime/aws-smithy-http/README.md index 43b690a7993..0631f8a788c 100644 --- a/rust-runtime/aws-smithy-http/README.md +++ b/rust-runtime/aws-smithy-http/README.md @@ -1,6 +1,6 @@ # aws-smithy-http -Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs) including: +Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs) including: - HTTP Body implementation - Endpoint support - HTTP header deserialization @@ -8,5 +8,5 @@ Core HTTP primitives for service clients generated by [smithy-rs](https://github - `ByteStream`: _(supported on crate feature `rt-tokio` only)_ a misuse-resistant abstraction for streaming binary data -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-http/external-types.toml b/rust-runtime/aws-smithy-http/external-types.toml index b06231e92f5..1e95ac80514 100644 --- a/rust-runtime/aws-smithy-http/external-types.toml +++ b/rust-runtime/aws-smithy-http/external-types.toml @@ -1,6 +1,6 @@ allowed_external_types = [ + "aws_smithy_runtime_api::*", "aws_smithy_types::*", - "bytes::buf::buf_impl::Buf", "bytes::bytes::Bytes", "http::error::Error", "http::header::map::HeaderMap", @@ -12,26 +12,10 @@ allowed_external_types = [ "http::response::Builder", "http::response::Response", "http::uri::Uri", - "http::version::Version", - "http_body::Body", - "http_body::combinators::box_body::BoxBody", - "hyper::body::body::Body", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate Tokio `AsyncRead` - "tokio::io::async_read::AsyncRead", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Switch to AsyncIterator once standardized + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "futures_core::stream::Stream", - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Feature gate references to Tokio `File` - "tokio::fs::file::File", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose `once_cell` in public API - "once_cell::sync::Lazy", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature "aws_smithy_eventstream::*", - - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Decide whether to expose this type or not - "bytes_utils::segmented::SegmentedBuf", ] diff --git a/rust-runtime/aws-smithy-http/src/connection.rs b/rust-runtime/aws-smithy-http/src/connection.rs deleted file mode 100644 index eb81f636876..00000000000 --- a/rust-runtime/aws-smithy-http/src/connection.rs +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Types related to connection monitoring and management. - -use std::fmt::{Debug, Formatter}; -use std::net::SocketAddr; -use std::sync::{Arc, Mutex}; - -/// Metadata that tracks the state of an active connection. -#[derive(Clone)] -pub struct ConnectionMetadata { - is_proxied: bool, - remote_addr: Option, - poison_fn: Arc, -} - -impl ConnectionMetadata { - /// Poison this connection, ensuring that it won't be reused. - pub fn poison(&self) { - tracing::info!("smithy connection was poisoned"); - (self.poison_fn)() - } - - /// Create a new [`ConnectionMetadata`]. - pub fn new( - is_proxied: bool, - remote_addr: Option, - poison: impl Fn() + Send + Sync + 'static, - ) -> Self { - Self { - is_proxied, - remote_addr, - poison_fn: Arc::new(poison), - } - } - - /// Get the remote address for this connection, if one is set. - pub fn remote_addr(&self) -> Option { - self.remote_addr - } -} - -impl Debug for ConnectionMetadata { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("SmithyConnection") - .field("is_proxied", &self.is_proxied) - .field("remote_addr", &self.remote_addr) - .finish() - } -} - -type LoaderFn = dyn Fn() -> Option + Send + Sync; - -/// State for a middleware that will monitor and manage connections. -#[allow(missing_debug_implementations)] -#[derive(Clone, Default)] -pub struct CaptureSmithyConnection { - loader: Arc>>>, -} - -impl CaptureSmithyConnection { - /// Create a new connection monitor. - pub fn new() -> Self { - Self { - loader: Default::default(), - } - } - - /// Set the retriever that will capture the `hyper` connection. - pub fn set_connection_retriever(&self, f: F) - where - F: Fn() -> Option + Send + Sync + 'static, - { - *self.loader.lock().unwrap() = Some(Box::new(f)); - } - - /// Get the associated connection metadata. - pub fn get(&self) -> Option { - match self.loader.lock().unwrap().as_ref() { - Some(loader) => loader(), - None => { - println!("no loader was set :-/"); - None - } - } - } -} - -#[cfg(test)] -mod test { - use crate::connection::{CaptureSmithyConnection, ConnectionMetadata}; - - #[test] - fn retrieve_connection_metadata() { - let retriever = CaptureSmithyConnection::new(); - let retriever_clone = retriever.clone(); - assert!(retriever.get().is_none()); - retriever.set_connection_retriever(|| Some(ConnectionMetadata::new(true, None, || {}))); - - assert!(retriever.get().is_some()); - assert!(retriever_clone.get().is_some()); - } -} diff --git a/rust-runtime/aws-smithy-http/src/endpoint.rs b/rust-runtime/aws-smithy-http/src/endpoint.rs index 3a4939434e5..ce7c79900f3 100644 --- a/rust-runtime/aws-smithy-http/src/endpoint.rs +++ b/rust-runtime/aws-smithy-http/src/endpoint.rs @@ -5,115 +5,35 @@ //! Code for resolving an endpoint (URI) that a request should be sent to -use crate::endpoint::error::InvalidEndpointError; -use crate::operation::error::BuildError; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -use http::uri::{Authority, Uri}; use std::borrow::Cow; -use std::fmt::{Debug, Formatter}; +use std::fmt::Debug; use std::result::Result as StdResult; use std::str::FromStr; -use std::sync::Arc; -pub mod error; -pub mod middleware; +use http::uri::{Authority, Uri}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; pub use error::ResolveEndpointError; -/// An endpoint-resolution-specific Result. Contains either an [`Endpoint`](aws_smithy_types::endpoint::Endpoint) or a [`ResolveEndpointError`]. -pub type Result = std::result::Result; - -/// Implementors of this trait can resolve an endpoint that will be applied to a request. -pub trait ResolveEndpoint: Send + Sync { - /// Given some endpoint parameters, resolve an endpoint or return an error when resolution is - /// impossible. - fn resolve_endpoint(&self, params: &Params) -> Result; -} - -impl ResolveEndpoint for &'static str { - fn resolve_endpoint(&self, _params: &T) -> Result { - Ok(aws_smithy_types::endpoint::Endpoint::builder() - .url(*self) - .build()) - } -} - -/// Endpoint Resolver wrapper that may be shared -#[derive(Clone)] -pub struct SharedEndpointResolver(Arc>); - -impl Debug for SharedEndpointResolver { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("SharedEndpointResolver").finish() - } -} - -impl SharedEndpointResolver { - /// Create a new `SharedEndpointResolver` from `ResolveEndpoint` - pub fn new(resolve_endpoint: impl ResolveEndpoint + 'static) -> Self { - Self(Arc::new(resolve_endpoint)) - } -} - -impl AsRef> for SharedEndpointResolver { - fn as_ref(&self) -> &(dyn ResolveEndpoint + 'static) { - self.0.as_ref() - } -} - -impl From>> for SharedEndpointResolver { - fn from(resolve_endpoint: Arc>) -> Self { - SharedEndpointResolver(resolve_endpoint) - } -} - -impl Storable for SharedEndpointResolver { - type Storer = StoreReplace>; -} - -impl ResolveEndpoint for SharedEndpointResolver { - fn resolve_endpoint(&self, params: &T) -> Result { - self.0.resolve_endpoint(params) - } -} - -/// API Endpoint -/// -/// This implements an API endpoint as specified in the -/// [Smithy Endpoint Specification](https://awslabs.github.io/smithy/1.0/spec/core/endpoint-traits.html) -#[derive(Clone, Debug)] -#[deprecated(note = "Use `.endpoint_url(...)` directly instead")] -pub struct Endpoint { - uri: http::Uri, +use crate::endpoint::error::InvalidEndpointError; - /// If true, endpointPrefix does ignored when setting the endpoint on a request - immutable: bool, -} +pub mod error; -#[allow(deprecated)] -/// This allows customers that use `Endpoint` to override the endpoint to continue to do so -impl ResolveEndpoint for Endpoint { - fn resolve_endpoint(&self, _params: &T) -> Result { - Ok(aws_smithy_types::endpoint::Endpoint::builder() - .url(self.uri.to_string()) - .build()) - } -} +/// An endpoint-resolution-specific Result. Contains either an [`Endpoint`](aws_smithy_types::endpoint::Endpoint) or a [`ResolveEndpointError`]. +pub type Result = std::result::Result; /// A special type that adds support for services that have special URL-prefixing rules. #[derive(Clone, Debug, Eq, PartialEq)] pub struct EndpointPrefix(String); impl EndpointPrefix { /// Create a new endpoint prefix from an `impl Into`. If the prefix argument is invalid, - /// a [`BuildError`] will be returned. - pub fn new(prefix: impl Into) -> StdResult { + /// a [`InvalidEndpointError`] will be returned. + pub fn new(prefix: impl Into) -> StdResult { let prefix = prefix.into(); match Authority::from_str(&prefix) { Ok(_) => Ok(EndpointPrefix(prefix)), - Err(err) => Err(BuildError::invalid_uri( - prefix, - "invalid prefix".into(), - err, + Err(err) => Err(InvalidEndpointError::failed_to_construct_authority( + prefix, err, )), } } @@ -143,11 +63,13 @@ pub fn apply_endpoint( .map(|auth| auth.as_str()) .unwrap_or(""); let authority = if !prefix.is_empty() { - Authority::from_str(&format!("{}{}", prefix, authority)) + Cow::Owned(format!("{}{}", prefix, authority)) } else { - Authority::from_str(authority) - } - .map_err(InvalidEndpointError::failed_to_construct_authority)?; + Cow::Borrowed(authority) + }; + let authority = Authority::from_str(&authority).map_err(|err| { + InvalidEndpointError::failed_to_construct_authority(authority.into_owned(), err) + })?; let scheme = *endpoint .scheme() .as_ref() @@ -162,95 +84,6 @@ pub fn apply_endpoint( Ok(()) } -#[allow(deprecated)] -impl Endpoint { - /// Create a new endpoint from a URI - /// - /// Certain services will augment the endpoint with additional metadata. For example, - /// S3 can prefix the host with the bucket name. If your endpoint does not support this, - /// (for example, when communicating with localhost), use [`Endpoint::immutable`]. - pub fn mutable_uri(uri: Uri) -> StdResult { - Ok(Endpoint { - uri: Self::validate_endpoint(uri)?, - immutable: false, - }) - } - - /// Create a new endpoint from a URI string - /// - /// Certain services will augment the endpoint with additional metadata. For example, - /// S3 can prefix the host with the bucket name. If your endpoint does not support this, - /// (for example, when communicating with localhost), use [`Endpoint::immutable`]. - pub fn mutable(uri: impl AsRef) -> StdResult { - Self::mutable_uri( - Uri::try_from(uri.as_ref()).map_err(InvalidEndpointError::failed_to_construct_uri)?, - ) - } - - /// Returns the URI of this endpoint - pub fn uri(&self) -> &Uri { - &self.uri - } - - /// Create a new immutable endpoint from a URI - /// - /// ```rust - /// # use aws_smithy_http::endpoint::Endpoint; - /// use http::Uri; - /// let uri = Uri::from_static("http://localhost:8000"); - /// let endpoint = Endpoint::immutable_uri(uri); - /// ``` - /// - /// Certain services will augment the endpoint with additional metadata. For example, - /// S3 can prefix the host with the bucket name. This constructor creates an endpoint which will - /// ignore those mutations. If you want an endpoint which will obey mutation requests, use - /// [`Endpoint::mutable`] instead. - pub fn immutable_uri(uri: Uri) -> StdResult { - Ok(Endpoint { - uri: Self::validate_endpoint(uri)?, - immutable: true, - }) - } - - /// Create a new immutable endpoint from a URI string - /// - /// ```rust - /// # use aws_smithy_http::endpoint::Endpoint; - /// let endpoint = Endpoint::immutable("http://localhost:8000"); - /// ``` - /// - /// Certain services will augment the endpoint with additional metadata. For example, - /// S3 can prefix the host with the bucket name. This constructor creates an endpoint which will - /// ignore those mutations. If you want an endpoint which will obey mutation requests, use - /// [`Endpoint::mutable`] instead. - pub fn immutable(uri: impl AsRef) -> StdResult { - Self::immutable_uri( - Uri::try_from(uri.as_ref()).map_err(InvalidEndpointError::failed_to_construct_uri)?, - ) - } - - /// Sets the endpoint on `uri`, potentially applying the specified `prefix` in the process. - pub fn set_endpoint( - &self, - uri: &mut http::Uri, - prefix: Option<&EndpointPrefix>, - ) -> StdResult<(), InvalidEndpointError> { - let prefix = match self.immutable { - true => None, - false => prefix, - }; - apply_endpoint(uri, &self.uri, prefix) - } - - fn validate_endpoint(endpoint: Uri) -> StdResult { - if endpoint.scheme().is_none() { - Err(InvalidEndpointError::endpoint_must_have_scheme()) - } else { - Ok(endpoint) - } - } -} - fn merge_paths<'a>(endpoint: &'a Uri, uri: &'a Uri) -> Cow<'a, str> { if let Some(query) = endpoint.path_and_query().and_then(|pq| pq.query()) { tracing::warn!(query = %query, "query specified in endpoint will be ignored during endpoint resolution"); @@ -267,103 +100,3 @@ fn merge_paths<'a>(endpoint: &'a Uri, uri: &'a Uri) -> Cow<'a, str> { Cow::Owned(format!("{}/{}", ep_no_slash, uri_path_no_slash)) } } - -#[cfg(test)] -#[allow(deprecated)] -mod test { - use crate::endpoint::error::{InvalidEndpointError, InvalidEndpointErrorKind}; - use crate::endpoint::{Endpoint, EndpointPrefix}; - use http::Uri; - - #[test] - fn prefix_endpoint() { - let ep = Endpoint::mutable("https://us-east-1.dynamo.amazonaws.com").unwrap(); - let mut uri = Uri::from_static("/list_tables?k=v"); - ep.set_endpoint( - &mut uri, - Some(&EndpointPrefix::new("subregion.").expect("valid prefix")), - ) - .unwrap(); - assert_eq!( - uri, - Uri::from_static("https://subregion.us-east-1.dynamo.amazonaws.com/list_tables?k=v") - ); - } - - #[test] - fn prefix_endpoint_custom_port() { - let ep = Endpoint::mutable("https://us-east-1.dynamo.amazonaws.com:6443").unwrap(); - let mut uri = Uri::from_static("/list_tables?k=v"); - ep.set_endpoint( - &mut uri, - Some(&EndpointPrefix::new("subregion.").expect("valid prefix")), - ) - .unwrap(); - assert_eq!( - uri, - Uri::from_static( - "https://subregion.us-east-1.dynamo.amazonaws.com:6443/list_tables?k=v" - ) - ); - } - - #[test] - fn prefix_immutable_endpoint() { - let ep = Endpoint::immutable("https://us-east-1.dynamo.amazonaws.com").unwrap(); - let mut uri = Uri::from_static("/list_tables?k=v"); - ep.set_endpoint( - &mut uri, - Some(&EndpointPrefix::new("subregion.").expect("valid prefix")), - ) - .unwrap(); - assert_eq!( - uri, - Uri::from_static("https://us-east-1.dynamo.amazonaws.com/list_tables?k=v") - ); - } - - #[test] - fn endpoint_with_path() { - for uri in &[ - // check that trailing slashes are properly normalized - "https://us-east-1.dynamo.amazonaws.com/private", - "https://us-east-1.dynamo.amazonaws.com/private/", - ] { - let ep = Endpoint::immutable(uri).unwrap(); - let mut uri = Uri::from_static("/list_tables?k=v"); - ep.set_endpoint( - &mut uri, - Some(&EndpointPrefix::new("subregion.").expect("valid prefix")), - ) - .unwrap(); - assert_eq!( - uri, - Uri::from_static("https://us-east-1.dynamo.amazonaws.com/private/list_tables?k=v") - ); - } - } - - #[test] - fn set_endpoint_empty_path() { - let ep = Endpoint::immutable("http://localhost:8000").unwrap(); - let mut uri = Uri::from_static("/"); - ep.set_endpoint(&mut uri, None).unwrap(); - assert_eq!(uri, Uri::from_static("http://localhost:8000/")) - } - - #[test] - fn endpoint_construction_missing_scheme() { - assert!(matches!( - Endpoint::mutable("localhost:8000"), - Err(InvalidEndpointError { - kind: InvalidEndpointErrorKind::EndpointMustHaveScheme - }) - )); - assert!(matches!( - Endpoint::immutable("localhost:8000"), - Err(InvalidEndpointError { - kind: InvalidEndpointErrorKind::EndpointMustHaveScheme - }) - )); - } -} diff --git a/rust-runtime/aws-smithy-http/src/endpoint/error.rs b/rust-runtime/aws-smithy-http/src/endpoint/error.rs index bab0f93ac66..eeb703523c1 100644 --- a/rust-runtime/aws-smithy-http/src/endpoint/error.rs +++ b/rust-runtime/aws-smithy-http/src/endpoint/error.rs @@ -54,6 +54,7 @@ impl Error for ResolveEndpointError { pub(super) enum InvalidEndpointErrorKind { EndpointMustHaveScheme, FailedToConstructAuthority { + authority: String, source: Box, }, FailedToConstructUri { @@ -69,23 +70,28 @@ pub struct InvalidEndpointError { } impl InvalidEndpointError { - pub(super) fn endpoint_must_have_scheme() -> Self { + /// Construct a build error for a missing scheme + pub fn endpoint_must_have_scheme() -> Self { Self { kind: InvalidEndpointErrorKind::EndpointMustHaveScheme, } } - pub(super) fn failed_to_construct_authority( + /// Construct a build error for an invalid authority + pub fn failed_to_construct_authority( + authority: impl Into, source: impl Into>, ) -> Self { Self { kind: InvalidEndpointErrorKind::FailedToConstructAuthority { + authority: authority.into(), source: source.into(), }, } } - pub(super) fn failed_to_construct_uri( + /// Construct a build error for an invalid URI + pub fn failed_to_construct_uri( source: impl Into>, ) -> Self { Self { @@ -105,11 +111,11 @@ impl From for InvalidEndpointError { impl fmt::Display for InvalidEndpointError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use InvalidEndpointErrorKind as ErrorKind; - match self.kind { + match &self.kind { ErrorKind::EndpointMustHaveScheme => write!(f, "endpoint must contain a valid scheme"), - ErrorKind::FailedToConstructAuthority { .. } => write!( + ErrorKind::FailedToConstructAuthority { authority, source: _ } => write!( f, - "endpoint must contain a valid authority when combined with endpoint prefix" + "endpoint must contain a valid authority when combined with endpoint prefix: {authority}" ), ErrorKind::FailedToConstructUri { .. } => write!(f, "failed to construct URI"), } @@ -120,8 +126,11 @@ impl Error for InvalidEndpointError { fn source(&self) -> Option<&(dyn Error + 'static)> { use InvalidEndpointErrorKind as ErrorKind; match &self.kind { - ErrorKind::FailedToConstructUri { source } - | ErrorKind::FailedToConstructAuthority { source } => Some(source.as_ref()), + ErrorKind::FailedToConstructUri { source } => Some(source.as_ref()), + ErrorKind::FailedToConstructAuthority { + authority: _, + source, + } => Some(source.as_ref()), ErrorKind::EndpointMustHaveScheme => None, } } diff --git a/rust-runtime/aws-smithy-http/src/endpoint/middleware.rs b/rust-runtime/aws-smithy-http/src/endpoint/middleware.rs deleted file mode 100644 index 1fbb099b117..00000000000 --- a/rust-runtime/aws-smithy-http/src/endpoint/middleware.rs +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! [`MapRequest`]-based middleware for resolving and applying a request's endpoint. - -use crate::endpoint; -use crate::endpoint::{apply_endpoint, EndpointPrefix, ResolveEndpointError}; -use crate::middleware::MapRequest; -use crate::operation::Request; -use http::header::HeaderName; -use http::{HeaderValue, Uri}; -use std::str::FromStr; - -// TODO(enableNewSmithyRuntimeCleanup): Delete this module - -/// Middleware to apply an HTTP endpoint to the request -/// -/// This middleware reads [`aws_smithy_types::endpoint::Endpoint`] out of the request properties and applies -/// it to the HTTP request. -#[non_exhaustive] -#[derive(Default, Debug, Clone)] -pub struct SmithyEndpointStage; -impl SmithyEndpointStage { - /// Create a new `SmithyEndpointStage`. - pub fn new() -> Self { - Self::default() - } -} - -impl MapRequest for SmithyEndpointStage { - type Error = ResolveEndpointError; - - fn name(&self) -> &'static str { - "resolve_endpoint" - } - - fn apply(&self, request: Request) -> Result { - request.augment(|mut http_req, props| { - // we need to do a little dance so that this works with retries. - // the first pass through, we convert the result into just an endpoint, early returning - // the error. Put the endpoint back in the bag in case this request gets retried. - // - // the next pass through, there is no result, so in that case, we'll look for the - // endpoint directly. - // - // In an ideal world, we would do this in make_operation, but it's much easier for - // certain protocol tests if we allow requests with invalid endpoint to be constructed. - if let Some(endpoint) = props.remove::().transpose()? { - props.insert(endpoint); - }; - let endpoint = props.get::(); - let endpoint = - endpoint.ok_or_else(|| ResolveEndpointError::message("no endpoint present"))?; - - let uri: Uri = endpoint.url().parse().map_err(|err| { - ResolveEndpointError::from_source("endpoint did not have a valid uri", err) - })?; - apply_endpoint(http_req.uri_mut(), &uri, props.get::()).map_err( - |err| { - ResolveEndpointError::message(format!( - "failed to apply endpoint `{:?}` to request `{:?}`", - uri, http_req - )) - .with_source(Some(err.into())) - }, - )?; - for (header_name, header_values) in endpoint.headers() { - http_req.headers_mut().remove(header_name); - for value in header_values { - http_req.headers_mut().insert( - HeaderName::from_str(header_name).map_err(|err| { - ResolveEndpointError::message("invalid header name") - .with_source(Some(err.into())) - })?, - HeaderValue::from_str(value).map_err(|err| { - ResolveEndpointError::message("invalid header value") - .with_source(Some(err.into())) - })?, - ); - } - } - Ok(http_req) - }) - } -} diff --git a/rust-runtime/aws-smithy-http/src/event_stream.rs b/rust-runtime/aws-smithy-http/src/event_stream.rs index 0b95bb2d1ec..3d4bab78ff1 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream.rs @@ -17,4 +17,4 @@ pub type BoxError = Box; pub use sender::{EventStreamSender, MessageStreamAdapter, MessageStreamError}; #[doc(inline)] -pub use receiver::{RawMessage, Receiver, ReceiverError}; +pub use receiver::{Receiver, ReceiverError}; diff --git a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs index aa7f9142234..6d94194511e 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs @@ -3,15 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::body::SdkBody; -use crate::result::{ConnectorError, SdkError}; use aws_smithy_eventstream::frame::{ - DecodedFrame, Message, MessageFrameDecoder, UnmarshallMessage, UnmarshalledMessage, + DecodedFrame, MessageFrameDecoder, UnmarshallMessage, UnmarshalledMessage, }; +use aws_smithy_runtime_api::client::result::{ConnectorError, SdkError}; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::event_stream::{Message, RawMessage}; use bytes::Buf; use bytes::Bytes; use bytes_utils::SegmentedBuf; -use hyper::body::HttpBody; +use http_body::Body; use std::error::Error as StdError; use std::fmt; use std::marker::PhantomData; @@ -86,23 +87,6 @@ impl RecvBuf { } } -/// Raw message from a [`Receiver`] when a [`SdkError::ResponseError`] is returned. -#[derive(Debug)] -#[non_exhaustive] -pub enum RawMessage { - /// Message was decoded into a valid frame, but failed to unmarshall into a modeled type. - Decoded(Message), - /// Message failed to be decoded into a valid frame. The raw bytes may not be available in the - /// case where decoding consumed the buffer. - Invalid(Option), -} - -impl From<&mut SegmentedBuf> for RawMessage { - fn from(buf: &mut SegmentedBuf) -> Self { - Self::Invalid(Some(buf.copy_to_bytes(buf.remaining()))) - } -} - #[derive(Debug)] enum ReceiverErrorKind { /// The stream ended before a complete message frame was received. @@ -209,11 +193,12 @@ impl Receiver { } if self.buffer.has_data() { trace!(remaining_data = ?self.buffer, "data left over in the event stream response stream"); + let buf = self.buffer.buffered(); return Err(SdkError::response_error( ReceiverError { kind: ReceiverErrorKind::UnexpectedEndOfStream, }, - self.buffer.buffered().into(), + RawMessage::invalid(Some(buf.copy_to_bytes(buf.remaining()))), )); } Ok(None) @@ -276,10 +261,11 @@ impl Receiver { #[cfg(test)] mod tests { use super::{Receiver, UnmarshallMessage}; - use crate::body::SdkBody; - use crate::result::SdkError; use aws_smithy_eventstream::error::Error as EventStreamError; - use aws_smithy_eventstream::frame::{Header, HeaderValue, Message, UnmarshalledMessage}; + use aws_smithy_eventstream::frame::{write_message_to, UnmarshalledMessage}; + use aws_smithy_runtime_api::client::result::SdkError; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::event_stream::{Header, HeaderValue, Message}; use bytes::Bytes; use hyper::body::Body; use std::error::Error as StdError; @@ -287,7 +273,7 @@ mod tests { fn encode_initial_response() -> Bytes { let mut buffer = Vec::new(); - Message::new(Bytes::new()) + let message = Message::new(Bytes::new()) .add_header(Header::new( ":message-type", HeaderValue::String("event".into()), @@ -295,17 +281,15 @@ mod tests { .add_header(Header::new( ":event-type", HeaderValue::String("initial-response".into()), - )) - .write_to(&mut buffer) - .unwrap(); + )); + write_message_to(&message, &mut buffer).unwrap(); buffer.into() } fn encode_message(message: &str) -> Bytes { let mut buffer = Vec::new(); - Message::new(Bytes::copy_from_slice(message.as_bytes())) - .write_to(&mut buffer) - .unwrap(); + let message = Message::new(Bytes::copy_from_slice(message.as_bytes())); + write_message_to(&message, &mut buffer).unwrap(); buffer.into() } @@ -342,7 +326,7 @@ mod tests { let chunks: Vec> = vec![Ok(encode_message("one")), Ok(encode_message("two"))]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -363,7 +347,7 @@ mod tests { Ok(Bytes::from_static(&[])), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -384,7 +368,7 @@ mod tests { Ok(encode_message("three").split_to(10)), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -410,7 +394,7 @@ mod tests { )), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -463,7 +447,7 @@ mod tests { ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); for payload in &["one", "two", "three", "four", "five", "six", "seven", "eight"] { assert_eq!( @@ -483,7 +467,7 @@ mod tests { Err(IOError::new(ErrorKind::ConnectionReset, FakeError)), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -504,7 +488,7 @@ mod tests { Ok(Bytes::from_static(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])), ]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert_eq!( TestMessage("one".into()), @@ -521,7 +505,7 @@ mod tests { let chunks: Vec> = vec![Ok(encode_initial_response()), Ok(encode_message("one"))]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert!(receiver.try_recv_initial().await.unwrap().is_some()); assert_eq!( @@ -535,7 +519,7 @@ mod tests { let chunks: Vec> = vec![Ok(encode_message("one")), Ok(encode_message("two"))]; let chunk_stream = futures_util::stream::iter(chunks); - let body = SdkBody::from(Body::wrap_stream(chunk_stream)); + let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream)); let mut receiver = Receiver::::new(Unmarshaller, body); assert!(receiver.try_recv_initial().await.unwrap().is_none()); assert_eq!( diff --git a/rust-runtime/aws-smithy-http/src/event_stream/sender.rs b/rust-runtime/aws-smithy-http/src/event_stream/sender.rs index d19690e7272..c822da96e1b 100644 --- a/rust-runtime/aws-smithy-http/src/event_stream/sender.rs +++ b/rust-runtime/aws-smithy-http/src/event_stream/sender.rs @@ -3,8 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::result::SdkError; -use aws_smithy_eventstream::frame::{MarshallMessage, SignMessage}; +use aws_smithy_eventstream::frame::{write_message_to, MarshallMessage, SignMessage}; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_types::error::ErrorMetadata; use bytes::Bytes; use futures_core::Stream; use std::error::Error as StdError; @@ -55,7 +56,7 @@ where #[derive(Debug)] pub struct MessageStreamError { kind: MessageStreamErrorKind, - pub(crate) meta: aws_smithy_types::Error, + pub(crate) meta: ErrorMetadata, } #[derive(Debug)] @@ -72,8 +73,8 @@ impl MessageStreamError { } } - /// Creates the `MessageStreamError::Unhandled` variant from a `aws_smithy_types::Error`. - pub fn generic(err: aws_smithy_types::Error) -> Self { + /// Creates the `MessageStreamError::Unhandled` variant from an [`ErrorMetadata`]. + pub fn generic(err: ErrorMetadata) -> Self { Self { meta: err.clone(), kind: MessageStreamErrorKind::Unhandled(err.into()), @@ -82,7 +83,7 @@ impl MessageStreamError { /// Returns error metadata, which includes the error code, message, /// request ID, and potentially additional information. - pub fn meta(&self) -> &aws_smithy_types::Error { + pub fn meta(&self) -> &ErrorMetadata { &self.meta } } @@ -140,7 +141,8 @@ impl MessageStreamAdapter { } impl Stream for MessageStreamAdapter { - type Item = Result>; + type Item = + Result>; fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { match self.stream.as_mut().poll_next(cx) { @@ -164,8 +166,7 @@ impl Stream for MessageStreamAdapter Stream for MessageStreamAdapter { - sign.map_err(SdkError::construction_failure)? - .write_to(&mut buffer) + let message = sign.map_err(SdkError::construction_failure)?; + write_message_to(&message, &mut buffer) .map_err(SdkError::construction_failure)?; trace!(signed_message = ?buffer, "sending signed empty message to terminate the event stream"); Poll::Ready(Some(Ok(Bytes::from(buffer)))) @@ -195,12 +196,13 @@ impl Stream for MessageStreamAdapter Result { - Err(Message::read_from(&b""[..]).expect_err("this should always fail")) + Err(read_message_from(&b""[..]).expect_err("this should always fail")) } } @@ -251,7 +253,7 @@ mod tests { impl SignMessage for TestSigner { fn sign(&mut self, message: Message) -> Result { let mut buffer = Vec::new(); - message.write_to(&mut buffer).unwrap(); + write_message_to(&message, &mut buffer).unwrap(); Ok(Message::new(buffer).add_header(Header::new("signed", HeaderValue::Bool(true)))) } @@ -298,14 +300,14 @@ mod tests { )); let mut sent_bytes = adapter.next().await.unwrap().unwrap(); - let sent = Message::read_from(&mut sent_bytes).unwrap(); + let sent = read_message_from(&mut sent_bytes).unwrap(); assert_eq!("signed", sent.headers()[0].name().as_str()); assert_eq!(&HeaderValue::Bool(true), sent.headers()[0].value()); - let inner = Message::read_from(&mut (&sent.payload()[..])).unwrap(); + let inner = read_message_from(&mut (&sent.payload()[..])).unwrap(); assert_eq!(&b"test"[..], &inner.payload()[..]); let mut end_signal_bytes = adapter.next().await.unwrap().unwrap(); - let end_signal = Message::read_from(&mut end_signal_bytes).unwrap(); + let end_signal = read_message_from(&mut end_signal_bytes).unwrap(); assert_eq!("signed", end_signal.headers()[0].name().as_str()); assert_eq!(&HeaderValue::Bool(true), end_signal.headers()[0].value()); assert_eq!(0, end_signal.payload().len()); diff --git a/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs b/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs new file mode 100644 index 00000000000..74b1adb144a --- /dev/null +++ b/rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs @@ -0,0 +1,62 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::byte_stream::error::Error as ByteStreamError; +use aws_smithy_types::byte_stream::ByteStream; +use bytes::Bytes; +use futures_core::stream::Stream; +use std::pin::Pin; +use std::task::{Context, Poll}; + +/// A new-type wrapper to enable the impl of the `futures_core::stream::Stream` trait +/// +/// [`ByteStream`] no longer implements `futures_core::stream::Stream` so we wrap it in the +/// new-type to enable the trait when it is required. +/// +/// This is meant to be used by codegen code, and users should not need to use it directly. +#[derive(Debug)] +pub struct FuturesStreamCompatByteStream(ByteStream); + +impl FuturesStreamCompatByteStream { + /// Creates a new `FuturesStreamCompatByteStream` by wrapping `stream`. + pub fn new(stream: ByteStream) -> Self { + Self(stream) + } + + /// Returns [`SdkBody`] of the wrapped [`ByteStream`]. + pub fn into_inner(self) -> SdkBody { + self.0.into_inner() + } +} + +impl Stream for FuturesStreamCompatByteStream { + type Item = Result; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.0).poll_next(cx) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use futures_core::stream::Stream; + + fn check_compatible_with_hyper_wrap_stream(stream: S) -> S + where + S: Stream> + Send + 'static, + O: Into + 'static, + E: Into> + 'static, + { + stream + } + + #[test] + fn test_byte_stream_stream_can_be_made_compatible_with_hyper_wrap_stream() { + let stream = ByteStream::from_static(b"Hello world"); + check_compatible_with_hyper_wrap_stream(FuturesStreamCompatByteStream::new(stream)); + } +} diff --git a/rust-runtime/aws-smithy-http/src/header.rs b/rust-runtime/aws-smithy-http/src/header.rs index b77edbdce0b..558fe13e014 100644 --- a/rust-runtime/aws-smithy-http/src/header.rs +++ b/rust-runtime/aws-smithy-http/src/header.rs @@ -8,7 +8,7 @@ use aws_smithy_types::date_time::Format; use aws_smithy_types::primitive::Parse; use aws_smithy_types::DateTime; -use http::header::{HeaderMap, HeaderName, HeaderValue, ValueIter}; +use http::header::{HeaderMap, HeaderName, HeaderValue}; use std::borrow::Cow; use std::convert::TryFrom; use std::error::Error; @@ -31,7 +31,8 @@ impl ParseError { } } - fn with_source(self, source: impl Into>) -> Self { + /// Attach a source to this error. + pub fn with_source(self, source: impl Into>) -> Self { Self { source: Some(source.into()), ..self @@ -55,15 +56,13 @@ impl Error for ParseError { /// /// This is separate from `read_many` below because we need to invoke `DateTime::read` to take advantage /// of comma-aware parsing -pub fn many_dates( - values: ValueIter<'_, HeaderValue>, +pub fn many_dates<'a>( + values: impl Iterator, format: Format, ) -> Result, ParseError> { let mut out = vec![]; for header in values { - let mut header = header - .to_str() - .map_err(|_| ParseError::new("header was not valid utf-8 string"))?; + let mut header = header; while !header.is_empty() { let (v, next) = DateTime::read(header, format, ',').map_err(|err| { ParseError::new(format!("header could not be parsed as date: {}", err)) @@ -78,19 +77,18 @@ pub fn many_dates( /// Returns an iterator over pairs where the first element is the unprefixed header name that /// starts with the input `key` prefix, and the second element is the full header name. pub fn headers_for_prefix<'a>( - headers: &'a http::HeaderMap, + header_names: impl Iterator, key: &'a str, -) -> impl Iterator { +) -> impl Iterator { let lower_key = key.to_ascii_lowercase(); - headers - .keys() - .filter(move |k| k.as_str().starts_with(&lower_key)) - .map(move |h| (&h.as_str()[key.len()..], h)) + header_names + .filter(move |k| k.starts_with(&lower_key)) + .map(move |k| (&k[key.len()..], k)) } /// Convert a `HeaderValue` into a `Vec` where `T: FromStr` -pub fn read_many_from_str( - values: ValueIter<'_, HeaderValue>, +pub fn read_many_from_str<'a, T: FromStr>( + values: impl Iterator, ) -> Result, ParseError> where T::Err: Error + Send + Sync + 'static, @@ -103,8 +101,8 @@ where } /// Convert a `HeaderValue` into a `Vec` where `T: Parse` -pub fn read_many_primitive( - values: ValueIter<'_, HeaderValue>, +pub fn read_many_primitive<'a, T: Parse>( + values: impl Iterator, ) -> Result, ParseError> { read_many(values, |v: &str| { T::parse_smithy_primitive(v) @@ -113,8 +111,8 @@ pub fn read_many_primitive( } /// Read many comma / header delimited values from HTTP headers for `FromStr` types -fn read_many( - values: ValueIter<'_, HeaderValue>, +fn read_many<'a, T>( + values: impl Iterator, f: impl Fn(&str) -> Result, ) -> Result, ParseError> { let mut out = vec![]; @@ -132,8 +130,8 @@ fn read_many( /// Read exactly one or none from a headers iterator /// /// This function does not perform comma splitting like `read_many` -pub fn one_or_none( - mut values: ValueIter<'_, HeaderValue>, +pub fn one_or_none<'a, T: FromStr>( + mut values: impl Iterator, ) -> Result, ParseError> where T::Err: Error + Send + Sync + 'static, @@ -142,10 +140,8 @@ where Some(v) => v, None => return Ok(None), }; - let value = - std::str::from_utf8(first.as_bytes()).map_err(|_| ParseError::new("invalid utf-8"))?; match values.next() { - None => T::from_str(value.trim()) + None => T::from_str(first.trim()) .map_err(|err| ParseError::new("failed to parse string").with_source(err)) .map(Some), Some(_) => Err(ParseError::new( @@ -348,6 +344,7 @@ mod test { }; use super::quote_header_value; + use aws_smithy_runtime_api::http::Request; use aws_smithy_types::error::display::DisplayErrorContext; #[test] @@ -396,15 +393,27 @@ mod test { .body(()) .unwrap(); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Float-Multi").iter()) - .expect("valid"), + read_many_primitive::( + test_request + .headers() + .get_all("X-Float-Multi") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .expect("valid"), vec![0.0, f32::INFINITY, f32::NEG_INFINITY, 5555.5] ); let message = format!( "{}", DisplayErrorContext( - read_many_primitive::(test_request.headers().get_all("X-Float-Error").iter()) - .expect_err("invalid") + read_many_primitive::( + test_request + .headers() + .get_all("X-Float-Error") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .expect_err("invalid") ) ); let expected = "output failed to parse in headers: failed reading a list of primitives: failed to parse input as f32"; @@ -428,7 +437,14 @@ mod test { .body(()) .unwrap(); let read = |name: &str, format: Format| { - many_dates(test_request.headers().get_all(name).iter(), format) + many_dates( + test_request + .headers() + .get_all(name) + .iter() + .map(|v| v.to_str().unwrap()), + format, + ) }; let read_valid = |name: &str, format: Format| read(name, format).expect("valid"); assert_eq!( @@ -478,8 +494,15 @@ mod test { .header("EscapedSlashesInQuotes", "foo, \"(foo\\\\bar)\"") .body(()) .unwrap(); - let read = - |name: &str| read_many_from_str::(test_request.headers().get_all(name).iter()); + let read = |name: &str| { + read_many_from_str::( + test_request + .headers() + .get_all(name) + .iter() + .map(|v| v.to_str().unwrap()), + ) + }; let read_valid = |name: &str| read(name).expect("valid"); assert_eq!(read_valid("Empty"), Vec::::new()); assert_eq!(read_valid("Foo"), vec!["foo"]); @@ -515,27 +538,58 @@ mod test { .body(()) .unwrap(); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Bool-Multi").iter()) - .expect("valid"), + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool-Multi") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .expect("valid"), vec![true, false, true] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Bool").iter()).unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![true] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Bool-Single").iter()) - .unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool-Single") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![true, false, true, true] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Bool-Quoted").iter()) - .unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool-Quoted") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![true, false, true, true] ); - read_many_primitive::(test_request.headers().get_all("X-Bool-Invalid").iter()) - .expect_err("invalid"); + read_many_primitive::( + test_request + .headers() + .get_all("X-Bool-Invalid") + .iter() + .map(|v| v.to_str().unwrap()), + ) + .expect_err("invalid"); } #[test] @@ -550,43 +604,77 @@ mod test { .body(()) .unwrap(); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Multi").iter()) - .expect("valid"), + read_many_primitive::( + test_request + .headers() + .get_all("X-Multi") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .expect("valid"), vec![123, 456, 789] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Num").iter()).unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Num") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![777] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Num-Single").iter()) - .unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Num-Single") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![1, 2, 3, -4, 5] ); assert_eq!( - read_many_primitive::(test_request.headers().get_all("X-Num-Quoted").iter()) - .unwrap(), + read_many_primitive::( + test_request + .headers() + .get_all("X-Num-Quoted") + .iter() + .map(|v| v.to_str().unwrap()) + ) + .unwrap(), vec![1, 2, 3, -4, 5] ); - read_many_primitive::(test_request.headers().get_all("X-Num-Invalid").iter()) - .expect_err("invalid"); + read_many_primitive::( + test_request + .headers() + .get_all("X-Num-Invalid") + .iter() + .map(|v| v.to_str().unwrap()), + ) + .expect_err("invalid"); } #[test] fn test_prefix_headers() { - let test_request = http::Request::builder() - .header("X-Prefix-A", "123,456") - .header("X-Prefix-B", "789") - .header("X-Prefix-C", "777") - .header("X-Prefix-C", "777") - .body(()) - .unwrap(); + let test_request = Request::try_from( + http::Request::builder() + .header("X-Prefix-A", "123,456") + .header("X-Prefix-B", "789") + .header("X-Prefix-C", "777") + .header("X-Prefix-C", "777") + .body(()) + .unwrap(), + ) + .unwrap(); let resp: Result>, ParseError> = - headers_for_prefix(test_request.headers(), "X-Prefix-") + headers_for_prefix(test_request.headers().iter().map(|h| h.0), "X-Prefix-") .map(|(key, header_name)| { let values = test_request.headers().get_all(header_name); - read_many_primitive(values.iter()).map(|v| (key.to_string(), v)) + read_many_primitive(values).map(|v| (key.to_string(), v)) }) .collect(); let resp = resp.expect("valid"); diff --git a/rust-runtime/aws-smithy-http/src/http.rs b/rust-runtime/aws-smithy-http/src/http.rs deleted file mode 100644 index ad77e951c3f..00000000000 --- a/rust-runtime/aws-smithy-http/src/http.rs +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Types for abstracting over HTTP requests and responses. - -use http::{HeaderMap, HeaderValue}; - -/// Trait for accessing HTTP headers. -/// -/// Useful for generic impls so that they can access headers via trait bounds. -pub trait HttpHeaders { - /// Returns a reference to the associated header map. - fn http_headers(&self) -> &HeaderMap; - - /// Returns a mutable reference to the associated header map. - fn http_headers_mut(&mut self) -> &mut HeaderMap; -} - -impl HttpHeaders for http::Response { - fn http_headers(&self) -> &HeaderMap { - self.headers() - } - - fn http_headers_mut(&mut self) -> &mut HeaderMap { - self.headers_mut() - } -} - -impl HttpHeaders for crate::operation::Response { - fn http_headers(&self) -> &HeaderMap { - self.http().http_headers() - } - - fn http_headers_mut(&mut self) -> &mut HeaderMap { - self.http_mut().http_headers_mut() - } -} diff --git a/rust-runtime/aws-smithy-http/src/http_versions.rs b/rust-runtime/aws-smithy-http/src/http_versions.rs deleted file mode 100644 index 4f4373589f1..00000000000 --- a/rust-runtime/aws-smithy-http/src/http_versions.rs +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP Version-related code - -use http::Version as HttpVersion; -use once_cell::sync::Lazy; - -/// A list of supported or desired HttpVersions. Typically use when requesting an HTTP Client from a -/// client cache. -pub type HttpVersionList = Vec; - -/// The default list of desired HTTP protocol versions to use when making requests -pub static DEFAULT_HTTP_VERSION_LIST: Lazy = - Lazy::new(|| vec![HttpVersion::HTTP_11]); diff --git a/rust-runtime/aws-smithy-http/src/lib.rs b/rust-runtime/aws-smithy-http/src/lib.rs index ad53e37f9c0..618f51ed315 100644 --- a/rust-runtime/aws-smithy-http/src/lib.rs +++ b/rust-runtime/aws-smithy-http/src/lib.rs @@ -10,12 +10,11 @@ rust_2018_idioms )] -//! Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs) including: +//! Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs) including: //! - HTTP Body implementation //! - Endpoint support //! - HTTP header deserialization //! - Event streams -//! - [`ByteStream`](byte_stream::ByteStream): a misuse-resistant abstraction for streaming binary data //! //! | Feature | Description | //! |----------------|-------------| @@ -25,26 +24,21 @@ #![allow(clippy::derive_partial_eq_without_eq)] #![cfg_attr(docsrs, feature(doc_cfg))] -pub mod body; pub mod endpoint; +// Marked as `doc(hidden)` because a type in the module is used both by this crate and by the code +// generator, but not by external users. Also, by the module being `doc(hidden)` instead of it being +// in `rust-runtime/inlineable`, each user won't have to pay the cost of running the module's tests +// when compiling their generated SDK. +#[doc(hidden)] +pub mod futures_stream_adapter; pub mod header; -pub mod http; -pub mod http_versions; pub mod label; -pub mod middleware; pub mod operation; -pub mod property_bag; pub mod query; #[doc(hidden)] pub mod query_writer; -pub mod response; -pub mod result; -pub mod retry; #[cfg(feature = "event-stream")] pub mod event_stream; -pub mod byte_stream; - -pub mod connection; mod urlencode; diff --git a/rust-runtime/aws-smithy-http/src/middleware.rs b/rust-runtime/aws-smithy-http/src/middleware.rs deleted file mode 100644 index d3da9dac2d5..00000000000 --- a/rust-runtime/aws-smithy-http/src/middleware.rs +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! This modules defines the core, framework agnostic, HTTP middleware interface -//! used by the SDK -//! -//! smithy-middleware-tower provides Tower-specific middleware utilities (todo) - -use crate::body::SdkBody; -use crate::operation; -use crate::response::ParseHttpResponse; -use crate::result::{SdkError, SdkSuccess}; -use bytes::{Buf, Bytes}; -use http_body::Body; -use pin_utils::pin_mut; -use std::error::Error; -use std::future::Future; -use tracing::{debug_span, trace, Instrument}; - -type BoxError = Box; - -const LOG_SENSITIVE_BODIES: &str = "LOG_SENSITIVE_BODIES"; - -/// [`AsyncMapRequest`] defines an asynchronous middleware that transforms an [`operation::Request`]. -/// -/// Typically, these middleware will read configuration from the `PropertyBag` and use it to -/// augment the request. -/// -/// Most fundamental middleware is expressed as `AsyncMapRequest`'s synchronous cousin, `MapRequest`, -/// including signing & endpoint resolution. `AsyncMapRequest` is used for async credential -/// retrieval (e.g., from AWS STS's AssumeRole operation). -pub trait AsyncMapRequest { - /// The type returned when this [`AsyncMapRequest`] encounters an error. - type Error: Into + 'static; - /// The type returned when [`AsyncMapRequest::apply`] is called. - type Future: Future> + Send + 'static; - - /// Returns the name of this map request operation for inclusion in a tracing span. - fn name(&self) -> &'static str; - - /// Call this middleware, returning a future that resolves to a request or an error. - fn apply(&self, request: operation::Request) -> Self::Future; -} - -/// [`MapRequest`] defines a synchronous middleware that transforms an [`operation::Request`]. -/// -/// Typically, these middleware will read configuration from the `PropertyBag` and use it to -/// augment the request. Most fundamental middleware is expressed as `MapRequest`, including -/// signing & endpoint resolution. -/// -/// ## Examples -/// -/// ```rust -/// # use aws_smithy_http::middleware::MapRequest; -/// # use std::convert::Infallible; -/// # use aws_smithy_http::operation; -/// use http::header::{HeaderName, HeaderValue}; -/// -/// /// Signaling struct added to the request property bag if a header should be added -/// struct NeedsHeader; -/// -/// struct AddHeader(HeaderName, HeaderValue); -/// -/// impl MapRequest for AddHeader { -/// type Error = Infallible; -/// -/// fn name(&self) -> &'static str { -/// "add_header" -/// } -/// -/// fn apply(&self, request: operation::Request) -> Result { -/// request.augment(|mut request, properties| { -/// if properties.get::().is_some() { -/// request.headers_mut().append(self.0.clone(), self.1.clone()); -/// } -/// Ok(request) -/// }) -/// } -/// } -/// ``` -pub trait MapRequest { - /// The Error type returned by this operation. - /// - /// If this middleware never fails use [std::convert::Infallible] or similar. - type Error: Into; - - /// Returns the name of this map request operation for inclusion in a tracing span. - fn name(&self) -> &'static str; - - /// Apply this middleware to a request. - /// - /// Typically, implementations will use [`request.augment`](crate::operation::Request::augment) - /// to be able to transform an owned `http::Request`. - fn apply(&self, request: operation::Request) -> Result; -} - -/// Load a response using `handler` to parse the results. -/// -/// This function is intended to be used on the response side of a middleware chain. -/// -/// Success and failure will be split and mapped into `SdkSuccess` and `SdkError`. -/// Generic Parameters: -/// - `O`: The Http response handler that returns `Result` -/// - `T`/`E`: `Result` returned by `handler`. -pub async fn load_response( - mut response: operation::Response, - handler: &O, -) -> Result, SdkError> -where - O: ParseHttpResponse>, -{ - if let Some(parsed_response) = - debug_span!("parse_unloaded").in_scope(&mut || handler.parse_unloaded(&mut response)) - { - trace!(response = ?response, "read HTTP headers for streaming response"); - return sdk_result(parsed_response, response); - } - - let (http_response, properties) = response.into_parts(); - let (parts, body) = http_response.into_parts(); - let body = match read_body(body).instrument(debug_span!("read_body")).await { - Ok(body) => body, - Err(err) => { - return Err(SdkError::response_error( - err, - operation::Response::from_parts( - http::Response::from_parts(parts, SdkBody::taken()), - properties, - ), - )); - } - }; - - let http_response = http::Response::from_parts(parts, Bytes::from(body)); - if !handler.sensitive() - || std::env::var(LOG_SENSITIVE_BODIES) - .map(|v| v.eq_ignore_ascii_case("true")) - .unwrap_or_default() - { - trace!(http_response = ?http_response, "read HTTP response body"); - } else { - trace!(http_response = "** REDACTED **. To print, set LOG_SENSITIVE_BODIES=true") - } - debug_span!("parse_loaded").in_scope(move || { - let parsed = handler.parse_loaded(&http_response); - sdk_result( - parsed, - operation::Response::from_parts(http_response.map(SdkBody::from), properties), - ) - }) -} - -async fn read_body(body: B) -> Result, B::Error> { - let mut output = Vec::new(); - pin_mut!(body); - while let Some(buf) = body.data().await { - let mut buf = buf?; - while buf.has_remaining() { - output.extend_from_slice(buf.chunk()); - buf.advance(buf.chunk().len()) - } - } - Ok(output) -} - -/// Convert a `Result` into an `SdkResult` that includes the operation response -fn sdk_result( - parsed: Result, - raw: operation::Response, -) -> Result, SdkError> { - match parsed { - Ok(parsed) => Ok(SdkSuccess { raw, parsed }), - Err(err) => Err(SdkError::service_error(err, raw)), - } -} diff --git a/rust-runtime/aws-smithy-http/src/operation.rs b/rust-runtime/aws-smithy-http/src/operation.rs index dadc22b282d..cba50828712 100644 --- a/rust-runtime/aws-smithy-http/src/operation.rs +++ b/rust-runtime/aws-smithy-http/src/operation.rs @@ -6,15 +6,10 @@ //! Types for representing the interaction between a service an a client, referred to as an "operation" in smithy. //! Clients "send" operations to services, which are composed of 1 or more HTTP requests. -use crate::body::SdkBody; -use crate::property_bag::{PropertyBag, SharedPropertyBag}; -use crate::retry::DefaultResponseRetryClassifier; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; use std::borrow::Cow; -use std::ops::{Deref, DerefMut}; -pub mod error; - -/// Metadata attached to an [`Operation`] that identifies the API being called. +/// Metadata added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) that identifies the API being called. #[derive(Clone, Debug)] pub struct Metadata { operation: Cow<'static, str>, @@ -44,308 +39,6 @@ impl Metadata { } } -/// Non-request parts of an [`Operation`]. -/// -/// Generics: -/// - `H`: Response handler -/// - `R`: Implementation of `ClassifyRetry` -#[non_exhaustive] -#[derive(Clone, Debug)] -pub struct Parts { - /// The response deserializer that will convert the connector's response into an `operation::Response` - pub response_handler: H, - /// The classifier that will determine if an HTTP response indicates that a request failed for a retryable reason. - pub retry_classifier: R, - /// Metadata describing this operation and the service it relates to. - pub metadata: Option, -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete `operation::Operation` when cleaning up middleware -/// An [`Operation`] is a request paired with a response handler, retry classifier, -/// and metadata that identifies the API being called. -/// -/// Generics: -/// - `H`: Response handler -/// - `R`: Implementation of `ClassifyRetry` -#[derive(Debug)] -pub struct Operation { - request: Request, - parts: Parts, -} - -impl Operation { - /// Converts this operation into its parts. - pub fn into_request_response(self) -> (Request, Parts) { - (self.request, self.parts) - } - - /// Constructs an [`Operation`] from a request and [`Parts`] - pub fn from_parts(request: Request, parts: Parts) -> Self { - Self { request, parts } - } - - /// Returns a mutable reference to the request's property bag. - pub fn properties_mut(&mut self) -> impl DerefMut + '_ { - self.request.properties_mut() - } - - /// Returns an immutable reference to the request's property bag. - pub fn properties(&self) -> impl Deref + '_ { - self.request.properties() - } - - /// Gives mutable access to the underlying HTTP request. - pub fn request_mut(&mut self) -> &mut http::Request { - self.request.http_mut() - } - - /// Gives readonly access to the underlying HTTP request. - pub fn request(&self) -> &http::Request { - self.request.http() - } - - /// Attaches metadata to the operation. - pub fn with_metadata(mut self, metadata: Metadata) -> Self { - self.parts.metadata = Some(metadata); - self - } - - /// Replaces the retry classifier on the operation. - pub fn with_retry_classifier(self, retry_classifier: R2) -> Operation { - Operation { - request: self.request, - parts: Parts { - response_handler: self.parts.response_handler, - retry_classifier, - metadata: self.parts.metadata, - }, - } - } - - /// Returns the retry classifier for this operation. - pub fn retry_classifier(&self) -> &R { - &self.parts.retry_classifier - } - - /// Attempts to clone the operation. - /// - /// Will return `None` if the request body is already consumed and can't be replayed. - pub fn try_clone(&self) -> Option - where - H: Clone, - R: Clone, - { - let request = self.request.try_clone()?; - Some(Self { - request, - parts: self.parts.clone(), - }) - } -} - -impl Operation { - /// Creates a new [`Operation`]. - pub fn new( - request: Request, - response_handler: H, - ) -> Operation { - Operation { - request, - parts: Parts { - response_handler, - retry_classifier: DefaultResponseRetryClassifier::new(), - metadata: None, - }, - } - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete `operation::Request` when cleaning up middleware -/// Operation request type that associates a property bag with an underlying HTTP request. -/// This type represents the request in the Tower `Service` in middleware so that middleware -/// can share information with each other via the properties. -#[derive(Debug)] -pub struct Request { - /// The underlying HTTP Request - inner: http::Request, - - /// Property bag of configuration options - /// - /// Middleware can read and write from the property bag and use its - /// contents to augment the request (see [`Request::augment`](Request::augment)) - properties: SharedPropertyBag, -} - -impl Request { - /// Creates a new operation `Request` with the given `inner` HTTP request. - pub fn new(inner: http::Request) -> Self { - Request { - inner, - properties: SharedPropertyBag::new(), - } - } - - /// Creates a new operation `Request` from its parts. - pub fn from_parts(inner: http::Request, properties: SharedPropertyBag) -> Self { - Request { inner, properties } - } - - /// Allows modification of the HTTP request and associated properties with a fallible closure. - pub fn augment( - self, - f: impl FnOnce(http::Request, &mut PropertyBag) -> Result, T>, - ) -> Result { - let inner = { - let properties: &mut PropertyBag = &mut self.properties.acquire_mut(); - f(self.inner, properties)? - }; - Ok(Request { - inner, - properties: self.properties, - }) - } - - /// Gives mutable access to the properties. - pub fn properties_mut(&mut self) -> impl DerefMut + '_ { - self.properties.acquire_mut() - } - - /// Gives readonly access to the properties. - pub fn properties(&self) -> impl Deref + '_ { - self.properties.acquire() - } - - /// Gives mutable access to the underlying HTTP request. - pub fn http_mut(&mut self) -> &mut http::Request { - &mut self.inner - } - - /// Gives readonly access to the underlying HTTP request. - pub fn http(&self) -> &http::Request { - &self.inner - } - - /// Attempts to clone the operation `Request`. This can fail if the - /// request body can't be cloned, such as if it is being streamed and the - /// stream can't be recreated. - pub fn try_clone(&self) -> Option { - let cloned_body = self.inner.body().try_clone()?; - let mut cloned_request = http::Request::builder() - .uri(self.inner.uri().clone()) - .method(self.inner.method()); - *cloned_request - .headers_mut() - .expect("builder has not been modified, headers must be valid") = - self.inner.headers().clone(); - let inner = cloned_request - .body(cloned_body) - .expect("a clone of a valid request should be a valid request"); - Some(Request { - inner, - properties: self.properties.clone(), - }) - } - - /// Consumes the operation `Request` and returns the underlying HTTP request and properties. - pub fn into_parts(self) -> (http::Request, SharedPropertyBag) { - (self.inner, self.properties) - } -} - -// TODO(enableNewSmithyRuntimeCleanup): Delete `operation::Response` when cleaning up middleware -/// Operation response type that associates a property bag with an underlying HTTP response. -/// This type represents the response in the Tower `Service` in middleware so that middleware -/// can share information with each other via the properties. -#[derive(Debug)] -pub struct Response { - /// The underlying HTTP Response - inner: http::Response, - - /// Property bag of configuration options - properties: SharedPropertyBag, -} - -impl Response { - /// Creates a new operation `Response` with the given `inner` HTTP response. - pub fn new(inner: http::Response) -> Self { - Response { - inner, - properties: SharedPropertyBag::new(), - } - } - - /// Gives mutable access to the properties. - pub fn properties_mut(&mut self) -> impl DerefMut + '_ { - self.properties.acquire_mut() - } - - /// Gives readonly access to the properties. - pub fn properties(&self) -> impl Deref + '_ { - self.properties.acquire() - } - - /// Gives mutable access to the underlying HTTP response. - pub fn http_mut(&mut self) -> &mut http::Response { - &mut self.inner - } - - /// Gives readonly access to the underlying HTTP response. - pub fn http(&self) -> &http::Response { - &self.inner - } - - /// Consumes the operation `Request` and returns the underlying HTTP response and properties. - pub fn into_parts(self) -> (http::Response, SharedPropertyBag) { - (self.inner, self.properties) - } - - /// Return mutable references to the response and property bag contained within this `operation::Response` - pub fn parts_mut( - &mut self, - ) -> ( - &mut http::Response, - impl DerefMut + '_, - ) { - (&mut self.inner, self.properties.acquire_mut()) - } - - /// Creates a new operation `Response` from an HTTP response and property bag. - pub fn from_parts(inner: http::Response, properties: SharedPropertyBag) -> Self { - Response { inner, properties } - } -} - -#[cfg(test)] -mod test { - use crate::body::SdkBody; - use crate::operation::Request; - use http::header::{AUTHORIZATION, CONTENT_LENGTH}; - use http::Uri; - - #[test] - fn try_clone_clones_all_data() { - let mut request = Request::new( - http::Request::builder() - .uri(Uri::from_static("http://www.amazon.com")) - .method("POST") - .header(CONTENT_LENGTH, 456) - .header(AUTHORIZATION, "Token: hello") - .body(SdkBody::from("hello world!")) - .expect("valid request"), - ); - request.properties_mut().insert("hello"); - let cloned = request.try_clone().expect("request is cloneable"); - - let (request, config) = cloned.into_parts(); - assert_eq!(request.uri(), &Uri::from_static("http://www.amazon.com")); - assert_eq!(request.method(), "POST"); - assert_eq!(request.headers().len(), 2); - assert_eq!( - request.headers().get(AUTHORIZATION).unwrap(), - "Token: hello" - ); - assert_eq!(request.headers().get(CONTENT_LENGTH).unwrap(), "456"); - assert_eq!(request.body().bytes().unwrap(), "hello world!".as_bytes()); - assert_eq!(config.acquire().get::<&str>(), Some(&"hello")); - } +impl Storable for Metadata { + type Storer = StoreReplace; } diff --git a/rust-runtime/aws-smithy-http/src/property_bag.rs b/rust-runtime/aws-smithy-http/src/property_bag.rs deleted file mode 100644 index 1ac6adc989f..00000000000 --- a/rust-runtime/aws-smithy-http/src/property_bag.rs +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! A typemap used to store configuration for smithy operations. -//! -//! This code is functionally equivalent to `Extensions` in the `http` crate. Examples -//! have been updated to be more relevant for smithy use, the interface has been made public, -//! and the doc comments have been updated to reflect how the property bag is used in the SDK. -//! Additionally, optimizations around the HTTP use case have been removed in favor or simpler code. - -use std::any::{Any, TypeId}; -use std::collections::HashMap; -use std::fmt; -use std::fmt::{Debug, Formatter}; -use std::hash::{BuildHasherDefault, Hasher}; -use std::ops::{Deref, DerefMut}; -use std::sync::{Arc, Mutex}; - -type AnyMap = HashMap>; - -struct NamedType { - name: &'static str, - value: Box, -} - -impl NamedType { - fn as_mut(&mut self) -> Option<&mut T> { - self.value.downcast_mut() - } - - fn as_ref(&self) -> Option<&T> { - self.value.downcast_ref() - } - - fn assume(self) -> Option { - self.value.downcast().map(|t| *t).ok() - } - - fn new(value: T) -> Self { - Self { - name: std::any::type_name::(), - value: Box::new(value), - } - } -} - -// With TypeIds as keys, there's no need to hash them. They are already hashes -// themselves, coming from the compiler. The IdHasher just holds the u64 of -// the TypeId, and then returns it, instead of doing any bit fiddling. -#[derive(Default)] -struct IdHasher(u64); - -impl Hasher for IdHasher { - #[inline] - fn finish(&self) -> u64 { - self.0 - } - - fn write(&mut self, _: &[u8]) { - unreachable!("TypeId calls write_u64"); - } - - #[inline] - fn write_u64(&mut self, id: u64) { - self.0 = id; - } -} - -/// A type-map of configuration data. -/// -/// `PropertyBag` can be used by `Request` and `Response` to store -/// data used to configure the SDK request pipeline. -#[derive(Default)] -pub struct PropertyBag { - // In http where this property bag is usually empty, this makes sense. We will almost always put - // something in the bag, so we could consider removing the layer of indirection. - map: AnyMap, -} - -impl PropertyBag { - /// Create an empty `PropertyBag`. - #[inline] - pub fn new() -> PropertyBag { - PropertyBag { - map: AnyMap::default(), - } - } - - /// Insert a type into this `PropertyBag`. - /// - /// If a value of this type already existed, it will be returned. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// - /// #[derive(Debug, Eq, PartialEq)] - /// struct Endpoint(&'static str); - /// assert!(props.insert(Endpoint("dynamo.amazon.com")).is_none()); - /// assert_eq!( - /// props.insert(Endpoint("kinesis.amazon.com")), - /// Some(Endpoint("dynamo.amazon.com")) - /// ); - /// ``` - pub fn insert(&mut self, val: T) -> Option { - self.map - .insert(TypeId::of::(), NamedType::new(val)) - .and_then(|val| val.assume()) - } - - /// Get a reference to a type previously inserted on this `PropertyBag`. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// assert!(props.get::().is_none()); - /// props.insert(5i32); - /// - /// assert_eq!(props.get::(), Some(&5i32)); - /// ``` - pub fn get(&self) -> Option<&T> { - self.map - .get(&TypeId::of::()) - .and_then(|val| val.as_ref()) - } - - /// Returns an iterator of the types contained in this PropertyBag - /// - /// # Stability - /// This method is unstable and may be removed or changed in a future release. The exact - /// format of the returned types may also change. - pub fn contents(&self) -> impl Iterator + '_ { - self.map.values().map(|tpe| tpe.name) - } - - /// Get a mutable reference to a type previously inserted on this `PropertyBag`. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// props.insert(String::from("Hello")); - /// props.get_mut::().unwrap().push_str(" World"); - /// - /// assert_eq!(props.get::().unwrap(), "Hello World"); - /// ``` - pub fn get_mut(&mut self) -> Option<&mut T> { - self.map - .get_mut(&TypeId::of::()) - .map(|val| val.as_mut().expect("type mismatch!")) - } - - /// Remove a type from this `PropertyBag`. - /// - /// If a value of this type existed, it will be returned. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// props.insert(5i32); - /// assert_eq!(props.remove::(), Some(5i32)); - /// assert!(props.get::().is_none()); - /// ``` - pub fn remove(&mut self) -> Option { - self.map.remove(&TypeId::of::()).and_then(|tpe| { - (tpe.value as Box) - .downcast() - .ok() - .map(|boxed| *boxed) - }) - } - - /// Clear the `PropertyBag` of all inserted extensions. - /// - /// # Examples - /// - /// ``` - /// # use aws_smithy_http::property_bag::PropertyBag; - /// let mut props = PropertyBag::new(); - /// props.insert(5i32); - /// props.clear(); - /// - /// assert!(props.get::().is_none()); - #[inline] - pub fn clear(&mut self) { - self.map.clear(); - } -} - -impl fmt::Debug for PropertyBag { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut fmt = f.debug_struct("PropertyBag"); - - struct Contents<'a>(&'a PropertyBag); - impl<'a> Debug for Contents<'a> { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - f.debug_list().entries(self.0.contents()).finish() - } - } - fmt.field("contents", &Contents(self)); - fmt.finish() - } -} - -/// A wrapper of [`PropertyBag`] that can be safely shared across threads and cheaply cloned. -/// -/// To access properties, use either `acquire` or `acquire_mut`. This can be one line for -/// single property accesses, for example: -/// ```rust -/// # use aws_smithy_http::property_bag::SharedPropertyBag; -/// # let properties = SharedPropertyBag::new(); -/// let my_string = properties.acquire().get::(); -/// ``` -/// -/// For multiple accesses, the acquire result should be stored as a local since calling -/// acquire repeatedly will be slower than calling it once: -/// ```rust -/// # use aws_smithy_http::property_bag::SharedPropertyBag; -/// # let properties = SharedPropertyBag::new(); -/// let props = properties.acquire(); -/// let my_string = props.get::(); -/// let my_vec = props.get::>(); -/// ``` -/// -/// Use `acquire_mut` to insert properties into the bag: -/// ```rust -/// # use aws_smithy_http::property_bag::SharedPropertyBag; -/// # let properties = SharedPropertyBag::new(); -/// properties.acquire_mut().insert("example".to_string()); -/// ``` -#[derive(Clone, Debug, Default)] -pub struct SharedPropertyBag(Arc>); - -impl SharedPropertyBag { - /// Create an empty `SharedPropertyBag`. - pub fn new() -> Self { - SharedPropertyBag(Arc::new(Mutex::new(PropertyBag::new()))) - } - - /// Acquire an immutable reference to the property bag. - pub fn acquire(&self) -> impl Deref + '_ { - self.0.lock().unwrap() - } - - /// Acquire a mutable reference to the property bag. - pub fn acquire_mut(&self) -> impl DerefMut + '_ { - self.0.lock().unwrap() - } -} - -impl From for SharedPropertyBag { - fn from(bag: PropertyBag) -> Self { - SharedPropertyBag(Arc::new(Mutex::new(bag))) - } -} - -#[cfg(test)] -mod test { - use crate::property_bag::PropertyBag; - - #[test] - fn test_extensions() { - #[derive(Debug, PartialEq)] - struct MyType(i32); - - let mut property_bag = PropertyBag::new(); - - property_bag.insert(5i32); - property_bag.insert(MyType(10)); - - assert_eq!(property_bag.get(), Some(&5i32)); - assert_eq!(property_bag.get_mut(), Some(&mut 5i32)); - - assert_eq!(property_bag.remove::(), Some(5i32)); - assert!(property_bag.get::().is_none()); - - assert_eq!(property_bag.get::(), None); - assert_eq!(property_bag.get(), Some(&MyType(10))); - assert_eq!( - format!("{:?}", property_bag), - r#"PropertyBag { contents: ["aws_smithy_http::property_bag::test::test_extensions::MyType"] }"# - ); - } -} diff --git a/rust-runtime/aws-smithy-http/src/query_writer.rs b/rust-runtime/aws-smithy-http/src/query_writer.rs index d3251143f45..3daf56f668f 100644 --- a/rust-runtime/aws-smithy-http/src/query_writer.rs +++ b/rust-runtime/aws-smithy-http/src/query_writer.rs @@ -4,6 +4,7 @@ */ use crate::query::fmt_string as percent_encode_query; +use http::uri::InvalidUri; use http::Uri; /// Utility for updating the query string in a [`Uri`]. @@ -15,6 +16,11 @@ pub struct QueryWriter { } impl QueryWriter { + /// Creates a new `QueryWriter` from a string + pub fn new_from_string(uri: &str) -> Result { + Ok(Self::new(&Uri::try_from(uri)?)) + } + /// Creates a new `QueryWriter` based off the given `uri`. pub fn new(uri: &Uri) -> Self { let new_path_and_query = uri diff --git a/rust-runtime/aws-smithy-http/src/response.rs b/rust-runtime/aws-smithy-http/src/response.rs deleted file mode 100644 index 7ba039f4198..00000000000 --- a/rust-runtime/aws-smithy-http/src/response.rs +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Types for response parsing. - -use crate::operation; -use bytes::Bytes; - -/// `ParseHttpResponse` is a generic trait for parsing structured data from HTTP responses. -/// -/// It is designed to be nearly infinitely flexible, because `Output` is unconstrained, it can be used to support -/// event streams, S3 streaming responses, regular request-response style operations, as well -/// as any other HTTP-based protocol that we manage to come up with. -/// -/// The split between `parse_unloaded` and `parse_loaded` enables keeping the parsing code pure and sync -/// whenever possible and delegating the process of actually reading the HTTP response to the caller when -/// the required behavior is simply "read to the end." -/// -/// It also enables this critical and core trait to avoid being async, and it makes code that uses -/// the trait easier to test. -pub trait ParseHttpResponse { - /// Output type of the HttpResponse. - /// - /// For request/response style operations, this is typically something like: - /// `Result` - /// - /// For streaming operations, this is something like: - /// `Result, TranscribeStreamingError>` - type Output; - - /// Parse an HTTP request without reading the body. If the body must be provided to proceed, - /// return `None` - /// - /// This exists to serve APIs like S3::GetObject where the body is passed directly into the - /// response and consumed by the client. However, even in the case of S3::GetObject, errors - /// require reading the entire body. - /// - /// This also facilitates `EventStream` and other streaming HTTP protocols by enabling the - /// handler to take ownership of the HTTP response directly. - /// - /// Currently `parse_unloaded` operates on a borrowed HTTP request to enable - /// the caller to provide a raw HTTP response to the caller for inspection after the response is - /// returned. For EventStream-like use cases, the caller can use `mem::swap` to replace - /// the streaming body with an empty body as long as the body implements default. - /// - /// We should consider if this is too limiting & if this should take an owned response instead. - fn parse_unloaded(&self, response: &mut operation::Response) -> Option; - - /// Parse an HTTP request from a fully loaded body. This is for standard request/response style - /// APIs like AwsJson 1.0/1.1 and the error path of most streaming APIs - /// - /// Using an explicit body type of Bytes here is a conscious decision—If you _really_ need - /// to precisely control how the data is loaded into memory (e.g. by using `bytes::Buf`), implement - /// your handler in `parse_unloaded`. - /// - /// Production code will never call `parse_loaded` without first calling `parse_unloaded`. However, - /// in tests it may be easier to use `parse_loaded` directly. It is OK to panic in `parse_loaded` - /// if `parse_unloaded` will never return `None`, however, it may make your code easier to test if an - /// implementation is provided. - fn parse_loaded(&self, response: &http::Response) -> Self::Output; - - /// Returns whether the contents of this response are sensitive - /// - /// When this is set to true, wire logging will be disabled - fn sensitive(&self) -> bool { - false - } -} - -/// Convenience Trait for non-streaming APIs -/// -/// `ParseStrictResponse` enables operations that _never_ need to stream the body incrementally to -/// have cleaner implementations. There is a blanket implementation -pub trait ParseStrictResponse { - /// The type returned by this parser. - type Output; - - /// Parse an [`http::Response`] into `Self::Output`. - fn parse(&self, response: &http::Response) -> Self::Output; - - /// Returns whether the contents of this response are sensitive - /// - /// When this is set to true, wire logging will be disabled - fn sensitive(&self) -> bool { - false - } -} - -impl ParseHttpResponse for T { - type Output = T::Output; - - fn parse_unloaded(&self, _response: &mut operation::Response) -> Option { - None - } - - fn parse_loaded(&self, response: &http::Response) -> Self::Output { - self.parse(response) - } - - fn sensitive(&self) -> bool { - ParseStrictResponse::sensitive(self) - } -} - -#[cfg(test)] -mod test { - use crate::body::SdkBody; - use crate::operation; - use crate::response::ParseHttpResponse; - use bytes::Bytes; - use std::mem; - - #[test] - fn supports_streaming_body() { - struct S3GetObject { - _body: SdkBody, - } - - struct S3GetObjectParser; - - impl ParseHttpResponse for S3GetObjectParser { - type Output = S3GetObject; - - fn parse_unloaded(&self, response: &mut operation::Response) -> Option { - // For responses that pass on the body, use mem::take to leave behind an empty body - let body = mem::replace(response.http_mut().body_mut(), SdkBody::taken()); - Some(S3GetObject { _body: body }) - } - - fn parse_loaded(&self, _response: &http::Response) -> Self::Output { - unimplemented!() - } - } - } -} diff --git a/rust-runtime/aws-smithy-http/src/retry.rs b/rust-runtime/aws-smithy-http/src/retry.rs deleted file mode 100644 index 30c86549267..00000000000 --- a/rust-runtime/aws-smithy-http/src/retry.rs +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! HTTP specific retry behaviors -//! -//! For protocol agnostic retries, see `aws_smithy_types::Retry`. - -use crate::operation::Response; -use crate::result::SdkError; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; - -/// Classifies what kind of retry is needed for a given `response`. -pub trait ClassifyRetry: Clone { - /// Run this classifier against a response to determine if it should be retried. - fn classify_retry(&self, response: Result<&T, &E>) -> RetryKind; -} - -const TRANSIENT_ERROR_STATUS_CODES: &[u16] = &[500, 502, 503, 504]; - -/// The default implementation of [`ClassifyRetry`] for generated clients. -#[derive(Clone, Debug, Default)] -pub struct DefaultResponseRetryClassifier; - -impl DefaultResponseRetryClassifier { - /// Creates a new `DefaultResponseRetryClassifier` - pub fn new() -> Self { - Default::default() - } - - /// Matches on the given `result` and, if possible, returns the underlying cause and the operation response - /// that can be used for further classification logic. Otherwise, it returns a `RetryKind` that should be used - /// for the result. - // - // IMPORTANT: This function is used by the AWS SDK in `aws-http` for the SDK's own response classification logic - #[doc(hidden)] - pub fn try_extract_err_response<'a, T, E>( - result: Result<&T, &'a SdkError>, - ) -> Result<(&'a E, &'a Response), RetryKind> { - match result { - Ok(_) => Err(RetryKind::Unnecessary), - Err(SdkError::ServiceError(context)) => Ok((context.err(), context.raw())), - Err(SdkError::TimeoutError(_err)) => Err(RetryKind::Error(ErrorKind::TransientError)), - Err(SdkError::DispatchFailure(err)) => { - if err.is_timeout() || err.is_io() { - Err(RetryKind::Error(ErrorKind::TransientError)) - } else if let Some(ek) = err.is_other() { - Err(RetryKind::Error(ek)) - } else { - Err(RetryKind::UnretryableFailure) - } - } - Err(SdkError::ResponseError { .. }) => Err(RetryKind::Error(ErrorKind::TransientError)), - Err(SdkError::ConstructionFailure(_)) => Err(RetryKind::UnretryableFailure), - } - } -} - -impl ClassifyRetry> for DefaultResponseRetryClassifier -where - E: ProvideErrorKind, -{ - fn classify_retry(&self, result: Result<&T, &SdkError>) -> RetryKind { - let (err, response) = match Self::try_extract_err_response(result) { - Ok(extracted) => extracted, - Err(retry_kind) => return retry_kind, - }; - if let Some(kind) = err.retryable_error_kind() { - return RetryKind::Error(kind); - }; - if TRANSIENT_ERROR_STATUS_CODES.contains(&response.http().status().as_u16()) { - return RetryKind::Error(ErrorKind::TransientError); - }; - RetryKind::UnretryableFailure - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::body::SdkBody; - use crate::operation; - use crate::result::{SdkError, SdkSuccess}; - use crate::retry::ClassifyRetry; - use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, RetryKind}; - use std::fmt; - - #[derive(Debug)] - struct UnmodeledError; - impl fmt::Display for UnmodeledError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "UnmodeledError") - } - } - impl std::error::Error for UnmodeledError {} - - struct CodedError { - code: &'static str, - } - - impl ProvideErrorKind for UnmodeledError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - None - } - } - - impl ProvideErrorKind for CodedError { - fn retryable_error_kind(&self) -> Option { - None - } - - fn code(&self) -> Option<&str> { - Some(self.code) - } - } - - fn make_err( - err: E, - raw: http::Response<&'static str>, - ) -> Result, SdkError> { - Err(SdkError::service_error( - err, - operation::Response::new(raw.map(SdkBody::from)), - )) - } - - #[test] - fn not_an_error() { - let policy = DefaultResponseRetryClassifier::new(); - let test_response = http::Response::new("OK"); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_response).as_ref()), - RetryKind::UnretryableFailure - ); - } - - #[test] - fn classify_by_response_status() { - let policy = DefaultResponseRetryClassifier::new(); - let test_resp = http::Response::builder() - .status(500) - .body("error!") - .unwrap(); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_resp).as_ref()), - RetryKind::Error(ErrorKind::TransientError) - ); - } - - #[test] - fn classify_by_response_status_not_retryable() { - let policy = DefaultResponseRetryClassifier::new(); - let test_resp = http::Response::builder() - .status(408) - .body("error!") - .unwrap(); - assert_eq!( - policy.classify_retry(make_err(UnmodeledError, test_resp).as_ref()), - RetryKind::UnretryableFailure - ); - } - - #[test] - fn classify_by_error_kind() { - struct ModeledRetries; - let test_response = http::Response::new("OK"); - impl ProvideErrorKind for ModeledRetries { - fn retryable_error_kind(&self) -> Option { - Some(ErrorKind::ClientError) - } - - fn code(&self) -> Option<&str> { - // code should not be called when `error_kind` is provided - unimplemented!() - } - } - - let policy = DefaultResponseRetryClassifier::new(); - - assert_eq!( - policy.classify_retry(make_err(ModeledRetries, test_response).as_ref()), - RetryKind::Error(ErrorKind::ClientError) - ); - } - - #[test] - fn classify_response_error() { - let policy = DefaultResponseRetryClassifier::new(); - assert_eq!( - policy.classify_retry( - Result::, SdkError>::Err(SdkError::response_error( - UnmodeledError, - operation::Response::new(http::Response::new("OK").map(SdkBody::from)), - )) - .as_ref() - ), - RetryKind::Error(ErrorKind::TransientError) - ); - } - - #[test] - fn test_timeout_error() { - let policy = DefaultResponseRetryClassifier::new(); - let err: Result<(), SdkError> = Err(SdkError::timeout_error("blah")); - assert_eq!( - policy.classify_retry(err.as_ref()), - RetryKind::Error(ErrorKind::TransientError) - ); - } -} diff --git a/rust-runtime/aws-smithy-json/Cargo.toml b/rust-runtime/aws-smithy-json/Cargo.toml index 3ad4d2225f6..44745d6c44a 100644 --- a/rust-runtime/aws-smithy-json/Cargo.toml +++ b/rust-runtime/aws-smithy-json/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "John DiSanti -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-protocol-test/Cargo.toml b/rust-runtime/aws-smithy-protocol-test/Cargo.toml index 8d67abb2a57..ad120f78775 100644 --- a/rust-runtime/aws-smithy-protocol-test/Cargo.toml +++ b/rust-runtime/aws-smithy-protocol-test/Cargo.toml @@ -5,17 +5,18 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-protocol-test/src/lib.rs b/rust-runtime/aws-smithy-protocol-test/src/lib.rs index d110272ceab..92d9f5c4f3d 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/lib.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/lib.rs @@ -13,9 +13,12 @@ mod urlencoded; mod xml; +use crate::sealed::GetNormalizedHeader; use crate::xml::try_xml_equivalent; use assert_json_diff::assert_json_eq_no_panic; -use http::{header::HeaderMap, Request, Uri}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::http::Headers; +use http::{HeaderMap, Uri}; use pretty_assertions::Comparison; use std::collections::HashSet; use std::fmt::{self, Debug}; @@ -122,18 +125,18 @@ impl<'a> QueryParam<'a> { } } -fn extract_params(uri: &Uri) -> HashSet<&str> { - uri.query().unwrap_or_default().split('&').collect() +fn extract_params(uri: &str) -> HashSet<&str> { + let query = uri.rsplit_once('?').map(|s| s.1).unwrap_or_default(); + query.split('&').collect() } #[track_caller] -pub fn assert_uris_match(left: &Uri, right: &Uri) { +pub fn assert_uris_match(left: impl AsRef, right: impl AsRef) { + let left = left.as_ref(); + let right = right.as_ref(); if left == right { return; } - assert_eq!(left.authority(), right.authority()); - assert_eq!(left.scheme(), right.scheme()); - assert_eq!(left.path(), right.path()); assert_eq!( extract_params(left), extract_params(right), @@ -141,10 +144,15 @@ pub fn assert_uris_match(left: &Uri, right: &Uri) { left, right ); + let left: Uri = left.parse().expect("left is not a valid URI"); + let right: Uri = right.parse().expect("left is not a valid URI"); + assert_eq!(left.authority(), right.authority()); + assert_eq!(left.scheme(), right.scheme()); + assert_eq!(left.path(), right.path()); } -pub fn validate_query_string( - request: &Request, +pub fn validate_query_string( + request: &HttpRequest, expected_params: &[&str], ) -> Result<(), ProtocolTestFailure> { let actual_params = extract_params(request.uri()); @@ -159,8 +167,8 @@ pub fn validate_query_string( Ok(()) } -pub fn forbid_query_params( - request: &Request, +pub fn forbid_query_params( + request: &HttpRequest, forbid_params: &[&str], ) -> Result<(), ProtocolTestFailure> { let actual_params: HashSet> = extract_params(request.uri()) @@ -186,8 +194,8 @@ pub fn forbid_query_params( Ok(()) } -pub fn require_query_params( - request: &Request, +pub fn require_query_params( + request: &HttpRequest, require_keys: &[&str], ) -> Result<(), ProtocolTestFailure> { let actual_keys: HashSet<&str> = extract_params(request.uri()) @@ -204,14 +212,46 @@ pub fn require_query_params( Ok(()) } +mod sealed { + pub trait GetNormalizedHeader { + fn get_header(&self, key: &str) -> Option; + } +} + +impl<'a> GetNormalizedHeader for &'a Headers { + fn get_header(&self, key: &str) -> Option { + if !self.contains_key(key) { + None + } else { + Some(self.get_all(key).collect::>().join(", ")) + } + } +} + +impl<'a> GetNormalizedHeader for &'a HeaderMap { + fn get_header(&self, key: &str) -> Option { + if !self.contains_key(key) { + None + } else { + Some( + self.get_all(key) + .iter() + .map(|value| std::str::from_utf8(value.as_bytes()).expect("invalid utf-8")) + .collect::>() + .join(", "), + ) + } + } +} + pub fn validate_headers<'a>( - actual_headers: &HeaderMap, + actual_headers: impl GetNormalizedHeader, expected_headers: impl IntoIterator + 'a, impl AsRef + 'a)>, ) -> Result<(), ProtocolTestFailure> { for (key, expected_value) in expected_headers { let key = key.as_ref(); let expected_value = expected_value.as_ref(); - match normalized_header(actual_headers, key) { + match actual_headers.get_header(key) { None => { return Err(ProtocolTestFailure::MissingHeader { expected: key.to_string(), @@ -230,28 +270,13 @@ pub fn validate_headers<'a>( Ok(()) } -fn normalized_header(headers: &HeaderMap, key: &str) -> Option { - if !headers.contains_key(key) { - None - } else { - Some( - headers - .get_all(key) - .iter() - .map(|hv| hv.to_str().unwrap()) - .collect::>() - .join(", "), - ) - } -} - pub fn forbid_headers( - headers: &HeaderMap, + headers: impl GetNormalizedHeader, forbidden_headers: &[&str], ) -> Result<(), ProtocolTestFailure> { for key in forbidden_headers { // Protocol tests store header lists as comma-delimited - if let Some(value) = normalized_header(headers, key) { + if let Some(value) = headers.get_header(key) { return Err(ProtocolTestFailure::ForbiddenHeader { forbidden: key.to_string(), found: format!("{}: {}", key, value), @@ -262,12 +287,12 @@ pub fn forbid_headers( } pub fn require_headers( - headers: &HeaderMap, + headers: impl GetNormalizedHeader, required_headers: &[&str], ) -> Result<(), ProtocolTestFailure> { for key in required_headers { // Protocol tests store header lists as comma-delimited - if normalized_header(headers, key).is_none() { + if headers.get_header(key).is_none() { return Err(ProtocolTestFailure::MissingHeader { expected: key.to_string(), }); @@ -307,8 +332,8 @@ pub fn validate_body>( ) -> Result<(), ProtocolTestFailure> { let body_str = std::str::from_utf8(actual_body.as_ref()); match (media_type, body_str) { - (MediaType::Json, Ok(actual_body)) => try_json_eq(actual_body, expected_body), - (MediaType::Xml, Ok(actual_body)) => try_xml_equivalent(actual_body, expected_body), + (MediaType::Json, Ok(actual_body)) => try_json_eq(expected_body, actual_body), + (MediaType::Xml, Ok(actual_body)) => try_xml_equivalent(expected_body, actual_body), (MediaType::Json, Err(_)) => Err(ProtocolTestFailure::InvalidBodyFormat { expected: "json".to_owned(), found: "input was not valid UTF-8".to_owned(), @@ -318,7 +343,7 @@ pub fn validate_body>( found: "input was not valid UTF-8".to_owned(), }), (MediaType::UrlEncodedForm, Ok(actual_body)) => { - try_url_encoded_form_equivalent(actual_body, expected_body) + try_url_encoded_form_equivalent(expected_body, actual_body) } (MediaType::UrlEncodedForm, Err(_)) => Err(ProtocolTestFailure::InvalidBodyFormat { expected: "x-www-form-urlencoded".to_owned(), @@ -327,7 +352,7 @@ pub fn validate_body>( (MediaType::Other(media_type), Ok(actual_body)) => { if actual_body != expected_body { Err(ProtocolTestFailure::BodyDidNotMatch { - comparison: pretty_comparison(actual_body, expected_body), + comparison: pretty_comparison(expected_body, actual_body), hint: format!("media type: {}", media_type), }) } else { @@ -358,25 +383,25 @@ impl Debug for PrettyString { } } -fn pretty_comparison(left: &str, right: &str) -> PrettyString { +fn pretty_comparison(expected: &str, actual: &str) -> PrettyString { PrettyString(format!( "{}", - Comparison::new(&PrettyStr(left), &PrettyStr(right)) + Comparison::new(&PrettyStr(expected), &PrettyStr(actual)) )) } -fn try_json_eq(actual: &str, expected: &str) -> Result<(), ProtocolTestFailure> { +fn try_json_eq(expected: &str, actual: &str) -> Result<(), ProtocolTestFailure> { + let expected_json: serde_json::Value = + serde_json::from_str(expected).expect("expected value must be valid JSON"); let actual_json: serde_json::Value = serde_json::from_str(actual).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { expected: "json".to_owned(), found: e.to_string() + actual, })?; - let expected_json: serde_json::Value = - serde_json::from_str(expected).expect("expected value must be valid JSON"); match assert_json_eq_no_panic(&actual_json, &expected_json) { Ok(()) => Ok(()), Err(message) => Err(ProtocolTestFailure::BodyDidNotMatch { - comparison: pretty_comparison(actual, expected), + comparison: pretty_comparison(expected, actual), hint: message, }), } @@ -388,21 +413,25 @@ mod tests { forbid_headers, forbid_query_params, require_headers, require_query_params, validate_body, validate_headers, validate_query_string, FloatEquals, MediaType, ProtocolTestFailure, }; - use http::{header::HeaderMap, Request}; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_runtime_api::http::Headers; + + fn make_request(uri: &str) -> HttpRequest { + let mut req = HttpRequest::empty(); + req.set_uri(uri).unwrap(); + req + } #[test] fn test_validate_empty_query_string() { - let request = Request::builder().uri("/foo").body(()).unwrap(); + let request = HttpRequest::empty(); validate_query_string(&request, &[]).expect("no required params should pass"); validate_query_string(&request, &["a"]).expect_err("no params provided"); } #[test] fn test_validate_query_string() { - let request = Request::builder() - .uri("/foo?a=b&c&d=efg&hello=a%20b") - .body(()) - .unwrap(); + let request = make_request("/foo?a=b&c&d=efg&hello=a%20b"); validate_query_string(&request, &["a=b"]).expect("a=b is in the query string"); validate_query_string(&request, &["c", "a=b"]) .expect("both params are in the query string"); @@ -418,10 +447,7 @@ mod tests { #[test] fn test_forbid_query_param() { - let request = Request::builder() - .uri("/foo?a=b&c&d=efg&hello=a%20b") - .body(()) - .unwrap(); + let request = make_request("/foo?a=b&c&d=efg&hello=a%20b"); forbid_query_params(&request, &["a"]).expect_err("a is a query param"); forbid_query_params(&request, &["not_included"]).expect("query param not included"); forbid_query_params(&request, &["a=b"]).expect_err("if there is an `=`, match against KV"); @@ -431,10 +457,7 @@ mod tests { #[test] fn test_require_query_param() { - let request = Request::builder() - .uri("/foo?a=b&c&d=efg&hello=a%20b") - .body(()) - .unwrap(); + let request = make_request("/foo?a=b&c&d=efg&hello=a%20b"); require_query_params(&request, &["a"]).expect("a is a query param"); require_query_params(&request, &["not_included"]).expect_err("query param not included"); require_query_params(&request, &["a=b"]).expect_err("should be matching against keys"); @@ -443,11 +466,11 @@ mod tests { #[test] fn test_validate_headers() { - let mut headers = HeaderMap::new(); - headers.append("X-Foo", "foo".parse().unwrap()); - headers.append("X-Foo-List", "foo".parse().unwrap()); - headers.append("X-Foo-List", "bar".parse().unwrap()); - headers.append("X-Inline", "inline, other".parse().unwrap()); + let mut headers = Headers::new(); + headers.append("x-foo", "foo"); + headers.append("x-foo-list", "foo"); + headers.append("x-foo-list", "bar"); + headers.append("x-inline", "inline, other"); validate_headers(&headers, [("X-Foo", "foo")]).expect("header present"); validate_headers(&headers, [("X-Foo", "Foo")]).expect_err("case sensitive"); @@ -466,30 +489,24 @@ mod tests { #[test] fn test_forbidden_headers() { - let request = Request::builder() - .uri("/") - .header("X-Foo", "foo") - .body(()) - .unwrap(); + let mut headers = Headers::new(); + headers.append("x-foo", "foo"); assert_eq!( - forbid_headers(request.headers(), &["X-Foo"]).expect_err("should be error"), + forbid_headers(&headers, &["X-Foo"]).expect_err("should be error"), ProtocolTestFailure::ForbiddenHeader { forbidden: "X-Foo".to_string(), found: "X-Foo: foo".to_string() } ); - forbid_headers(request.headers(), &["X-Bar"]).expect("header not present"); + forbid_headers(&headers, &["X-Bar"]).expect("header not present"); } #[test] fn test_required_headers() { - let request = Request::builder() - .uri("/") - .header("X-Foo", "foo") - .body(()) - .unwrap(); - require_headers(request.headers(), &["X-Foo"]).expect("header present"); - require_headers(request.headers(), &["X-Bar"]).expect_err("header not present"); + let mut headers = Headers::new(); + headers.append("x-foo", "foo"); + require_headers(&headers, &["X-Foo"]).expect("header present"); + require_headers(&headers, &["X-Bar"]).expect_err("header not present"); } #[test] @@ -528,6 +545,12 @@ mod tests { .expect("inputs matched exactly") } + #[test] + fn test_validate_headers_http0x() { + let request = http::Request::builder().header("a", "b").body(()).unwrap(); + validate_headers(request.headers(), [("a", "b")]).unwrap() + } + #[test] fn test_float_equals() { let a = f64::NAN; diff --git a/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs b/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs index 83c64e777b2..d1ab5f5f4e5 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs @@ -4,7 +4,7 @@ */ use crate::{pretty_comparison, ProtocolTestFailure}; -use regex::Regex; +use regex_lite::Regex; fn rewrite_url_encoded_map_keys(input: &str) -> (String, String) { let mut itr = input.split('='); @@ -41,16 +41,16 @@ fn rewrite_url_encoded_body(input: &str) -> String { } pub(crate) fn try_url_encoded_form_equivalent( - actual: &str, expected: &str, + actual: &str, ) -> Result<(), ProtocolTestFailure> { - let actual = rewrite_url_encoded_body(actual); let expected = rewrite_url_encoded_body(expected); + let actual = rewrite_url_encoded_body(actual); if actual == expected { Ok(()) } else { Err(ProtocolTestFailure::BodyDidNotMatch { - comparison: pretty_comparison(&actual, &expected), + comparison: pretty_comparison(&expected, &actual), hint: "".into(), }) } @@ -71,30 +71,30 @@ mod tests { ); assert!(try_url_encoded_form_equivalent( - "Action=Something&Version=test&Property=foo", "Action=Something&Version=test&Property=bar", + "Action=Something&Version=test&Property=foo", ) .is_err()); assert!(try_url_encoded_form_equivalent( - "Action=Something&Version=test&WrongProperty=foo", "Action=Something&Version=test&Property=foo", + "Action=Something&Version=test&WrongProperty=foo", ) .is_err()); assert_eq!( Ok(()), try_url_encoded_form_equivalent( - "Action=Something&Version=test\ - &SomeMap.1.key=foo\ - &SomeMap.1.value=Foo\ - &SomeMap.2.key=bar\ - &SomeMap.2.value=Bar", "Action=Something&Version=test\ &SomeMap.1.key=bar\ &SomeMap.1.value=Bar\ &SomeMap.2.key=foo\ &SomeMap.2.value=Foo", + "Action=Something&Version=test\ + &SomeMap.1.key=foo\ + &SomeMap.1.value=Foo\ + &SomeMap.2.key=bar\ + &SomeMap.2.value=Bar", ) ); } diff --git a/rust-runtime/aws-smithy-protocol-test/src/xml.rs b/rust-runtime/aws-smithy-protocol-test/src/xml.rs index a27420e36bb..054bf4b7c15 100644 --- a/rust-runtime/aws-smithy-protocol-test/src/xml.rs +++ b/rust-runtime/aws-smithy-protocol-test/src/xml.rs @@ -11,23 +11,25 @@ use std::fmt::Write; /// /// This will normalize documents and attempts to determine if it is OK to sort members or not by /// using a heuristic to determine if the tag represents a list (which should not be reordered) -pub(crate) fn try_xml_equivalent(actual: &str, expected: &str) -> Result<(), ProtocolTestFailure> { - if actual == expected { +pub(crate) fn try_xml_equivalent(expected: &str, actual: &str) -> Result<(), ProtocolTestFailure> { + if expected == actual { return Ok(()); } - let norm_1 = normalize_xml(actual).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { - expected: "actual document to be valid XML".to_string(), - found: format!("{}\n{}", e, actual), - })?; - let norm_2 = normalize_xml(expected).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { - expected: "expected document to be valid XML".to_string(), - found: format!("{}", e), - })?; - if norm_1 == norm_2 { + let norm_expected = + normalize_xml(expected).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { + expected: "expected document to be valid XML".to_string(), + found: format!("{}", e), + })?; + let norm_actual = + normalize_xml(actual).map_err(|e| ProtocolTestFailure::InvalidBodyFormat { + expected: "actual document to be valid XML".to_string(), + found: format!("{}\n{}", e, actual), + })?; + if norm_expected == norm_actual { Ok(()) } else { Err(ProtocolTestFailure::BodyDidNotMatch { - comparison: pretty_comparison(&norm_1, &norm_2), + comparison: pretty_comparison(&norm_expected, &norm_actual), hint: "".to_string(), }) } diff --git a/rust-runtime/aws-smithy-query/Cargo.toml b/rust-runtime/aws-smithy-query/Cargo.toml index a4f517ae2a2..552c024feb3 100644 --- a/rust-runtime/aws-smithy-query/Cargo.toml +++ b/rust-runtime/aws-smithy-query/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "John DiSanti -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-runtime-api/Cargo.toml b/rust-runtime/aws-smithy-runtime-api/Cargo.toml index ec17790c1c9..93f88c0cd68 100644 --- a/rust-runtime/aws-smithy-runtime-api/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime-api/Cargo.toml @@ -5,27 +5,39 @@ authors = ["AWS Rust SDK Team ", "Zelda Hessler -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-runtime-api/additional-ci b/rust-runtime/aws-smithy-runtime-api/additional-ci index b44c6c05be7..c27a031c393 100755 --- a/rust-runtime/aws-smithy-runtime-api/additional-ci +++ b/rust-runtime/aws-smithy-runtime-api/additional-ci @@ -8,5 +8,10 @@ set -e +# NOTE: (rcoh) This seems to be pulling in workspace settings that pull in this dependency, but it passes if +# no other crates enable this dependency +# echo "### Checking external types w/ HTTP feature disabled" +# RUSTDOCFLAGS="" cargo +"${RUST_NIGHTLY_VERSION}" check-external-types --config external-types-no-http.toml --no-default-features + echo "### Testing every combination of features (excluding --all-features)" cargo hack test --feature-powerset --exclude-all-features diff --git a/rust-runtime/aws-smithy-runtime-api/external-types-no-http.toml b/rust-runtime/aws-smithy-runtime-api/external-types-no-http.toml new file mode 100644 index 00000000000..a58f0caeda0 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/external-types-no-http.toml @@ -0,0 +1,6 @@ +allowed_external_types = [ + "aws_smithy_async::*", + "aws_smithy_types::*", + + "bytes::bytes::Bytes", +] diff --git a/rust-runtime/aws-smithy-runtime-api/external-types.toml b/rust-runtime/aws-smithy-runtime-api/external-types.toml index 91e6e35f0c3..8d49ecdb570 100644 --- a/rust-runtime/aws-smithy-runtime-api/external-types.toml +++ b/rust-runtime/aws-smithy-runtime-api/external-types.toml @@ -1,11 +1,13 @@ allowed_external_types = [ "aws_smithy_async::*", "aws_smithy_types::*", - "aws_smithy_http::*", "bytes::bytes::Bytes", + "http::header::map::HeaderMap", + "http::header::value::HeaderValue", "http::request::Request", "http::response::Response", + "http::status::StatusCode", "http::uri::Uri", ] diff --git a/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_base_client_config.md b/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_base_client_config.md new file mode 100644 index 00000000000..4ac61d51b02 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_base_client_config.md @@ -0,0 +1,9 @@ +Validate the base client configuration. + +This gets called upon client construction. The full config may not be available at +this time (hence why it has [`RuntimeComponentsBuilder`] as an argument rather +than [`RuntimeComponents`]). Any error returned here will become a panic +in the client constructor. + +[`RuntimeComponentsBuilder`]: crate::client::runtime_components::RuntimeComponentsBuilder +[`RuntimeComponents`]: crate::client::runtime_components::RuntimeComponents diff --git a/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_final_config.md b/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_final_config.md new file mode 100644 index 00000000000..768bda5dd59 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/rustdoc/validate_final_config.md @@ -0,0 +1,7 @@ +Validate the final client configuration. + +This gets called immediately after the [`Intercept::read_before_execution`] trait hook +when the final configuration has been resolved. Any error returned here will +cause the operation to return that error. + +[`Intercept::read_before_execution`]: crate::client::interceptors::Intercept::read_before_execution diff --git a/rust-runtime/aws-smithy-runtime-api/src/client.rs b/rust-runtime/aws-smithy-runtime-api/src/client.rs index cdcfb847a5e..cb5a4395229 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client.rs @@ -3,33 +3,121 @@ * SPDX-License-Identifier: Apache-2.0 */ -/// Client orchestrator configuration accessors for the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag). -pub mod config_bag_accessors; +/// Declares a new-type for a future that is returned from an async trait (prior to stable async trait). +/// +/// To declare a future with a static lifetime: +/// ```ignore +/// new_type_future! { +/// doc = "some rustdoc for the future's struct", +/// pub struct NameOfFuture<'static, OutputType, ErrorType>; +/// } +/// ``` +/// +/// To declare a future with a non-static lifetime: +/// ```ignore +/// new_type_future! { +/// doc = "some rustdoc for the future's struct", +/// pub struct NameOfFuture<'a, OutputType, ErrorType>; +/// } +/// ``` +macro_rules! new_type_future { + ( + #[doc = $type_docs:literal] + pub struct $future_name:ident<'static, $output:ty, $err:ty>; + ) => { + new_type_future!(@internal, $type_docs, $future_name, $output, $err, 'static,); + }; + ( + #[doc = $type_docs:literal] + pub struct $future_name:ident<$lifetime:lifetime, $output:ty, $err:ty>; + ) => { + new_type_future!(@internal, $type_docs, $future_name, $output, $err, $lifetime, <$lifetime>); + }; + (@internal, $type_docs:literal, $future_name:ident, $output:ty, $err:ty, $lifetime:lifetime, $($decl_lifetime:tt)*) => { + pin_project_lite::pin_project! { + #[allow(clippy::type_complexity)] + #[doc = $type_docs] + pub struct $future_name$($decl_lifetime)* { + #[pin] + inner: aws_smithy_async::future::now_or_later::NowOrLater< + Result<$output, $err>, + aws_smithy_async::future::BoxFuture<$lifetime, $output, $err> + >, + } + } + + impl$($decl_lifetime)* $future_name$($decl_lifetime)* { + #[doc = concat!("Create a new `", stringify!($future_name), "` with the given future.")] + pub fn new(future: F) -> Self + where + F: std::future::Future> + Send + $lifetime, + { + Self { + inner: aws_smithy_async::future::now_or_later::NowOrLater::new(Box::pin(future)), + } + } + + #[doc = concat!(" + Create a new `", stringify!($future_name), "` with the given boxed future. + + Use this if you already have a boxed future to avoid double boxing it. + ")] + pub fn new_boxed( + future: std::pin::Pin< + Box> + Send + $lifetime>, + >, + ) -> Self { + Self { + inner: aws_smithy_async::future::now_or_later::NowOrLater::new(future), + } + } + + #[doc = concat!("Create a `", stringify!($future_name), "` that is immediately ready with the given result.")] + pub fn ready(result: Result<$output, $err>) -> Self { + Self { + inner: aws_smithy_async::future::now_or_later::NowOrLater::ready(result), + } + } + } + + impl$($decl_lifetime)* std::future::Future for $future_name$($decl_lifetime)* { + type Output = Result<$output, $err>; + + fn poll(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll { + let this = self.project(); + this.inner.poll(cx) + } + } + }; +} + +pub mod auth; + +pub mod connection; + +pub mod dns; + +pub mod endpoint; + +pub mod http; /// Smithy identity used by auth and signing. pub mod identity; -/// Smithy interceptors for smithy clients. -/// -/// Interceptors are lifecycle hooks that can read/modify requests and responses. pub mod interceptors; pub mod orchestrator; -/// Smithy code related to retry handling and token bucket. -/// -/// This code defines when and how failed requests should be retried. It also defines the behavior -/// used to limit the rate that requests are sent. +pub mod result; + pub mod retries; -/// Runtime plugin type definitions. +pub mod runtime_components; + pub mod runtime_plugin; -/// Smithy auth runtime plugins -pub mod auth; +pub mod behavior_version; -/// A type to track the number of requests sent by the orchestrator for a given operation. -pub mod request_attempts; +pub mod ser_de; -/// Smithy connectors and related code. -pub mod connectors; +pub mod stalled_stream_protection; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs index 517e5a47e0a..3c435ae7e4b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth.rs @@ -3,22 +3,33 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! APIs for request authentication. + use crate::box_error::BoxError; -use crate::client::identity::{Identity, IdentityResolvers, SharedIdentityResolver}; +use crate::client::identity::{Identity, SharedIdentityResolver}; use crate::client::orchestrator::HttpRequest; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreAppend, StoreReplace}; -use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; +use crate::client::runtime_components::sealed::ValidateConfig; +use crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; +use crate::impl_shared_conversions; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; +use aws_smithy_types::type_erasure::TypeErasedBox; use aws_smithy_types::Document; use std::borrow::Cow; use std::fmt; use std::sync::Arc; +/// Auth schemes for the HTTP `Authorization` header. #[cfg(feature = "http-auth")] pub mod http; -pub mod option_resolver; +/// Static auth scheme option resolver. +pub mod static_resolver; /// New type around an auth scheme ID. +/// +/// Each auth scheme must have a unique string identifier associated with it, +/// which is used to refer to auth schemes by the auth scheme option resolver, and +/// also used to select an identity resolver to use. #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] pub struct AuthSchemeId { scheme_id: &'static str, @@ -42,176 +53,186 @@ impl From<&'static str> for AuthSchemeId { } } +/// Parameters needed to resolve auth scheme options. +/// +/// Most generated clients will use the [`StaticAuthSchemeOptionResolver`](static_resolver::StaticAuthSchemeOptionResolver), +/// which doesn't require any parameters for resolution (and has its own empty params struct). +/// +/// However, more complex auth scheme resolvers may need modeled parameters in order to resolve +/// the auth scheme options. For those, this params struct holds a type erased box so that any +/// kind of parameters can be contained within, and type casted by the auth scheme option resolver +/// implementation. #[derive(Debug)] -pub struct AuthOptionResolverParams(TypeErasedBox); +pub struct AuthSchemeOptionResolverParams(TypeErasedBox); -impl AuthOptionResolverParams { +impl AuthSchemeOptionResolverParams { + /// Creates a new [`AuthSchemeOptionResolverParams`]. pub fn new(params: T) -> Self { - Self(TypedBox::new(params).erase()) + Self(TypeErasedBox::new(params)) } + /// Returns the underlying parameters as the type `T` if they are that type. pub fn get(&self) -> Option<&T> { self.0.downcast_ref() } } -impl Storable for AuthOptionResolverParams { +impl Storable for AuthSchemeOptionResolverParams { type Storer = StoreReplace; } -pub trait AuthOptionResolver: Send + Sync + fmt::Debug { - fn resolve_auth_options( +/// Resolver for auth scheme options. +/// +/// The orchestrator needs to select an auth scheme to sign requests with, and potentially +/// from several different available auth schemes. Smithy models have a number of ways +/// to specify which operations can use which auth schemes under which conditions, as +/// documented in the [Smithy spec](https://smithy.io/2.0/spec/authentication-traits.html). +/// +/// The orchestrator uses the auth scheme option resolver runtime component to resolve +/// an ordered list of options that are available to choose from for a given request. +/// This resolver can be a simple static list, such as with the +/// [`StaticAuthSchemeOptionResolver`](static_resolver::StaticAuthSchemeOptionResolver), +/// or it can be a complex code generated resolver that incorporates parameters from both +/// the model and the resolved endpoint. +pub trait ResolveAuthSchemeOptions: Send + Sync + fmt::Debug { + /// Returns a list of available auth scheme options to choose from. + fn resolve_auth_scheme_options( &self, - params: &AuthOptionResolverParams, + params: &AuthSchemeOptionResolverParams, ) -> Result, BoxError>; } -#[derive(Debug)] -pub struct DynAuthOptionResolver(Box); +/// A shared auth scheme option resolver. +#[derive(Clone, Debug)] +pub struct SharedAuthSchemeOptionResolver(Arc); -impl DynAuthOptionResolver { - pub fn new(auth_option_resolver: impl AuthOptionResolver + 'static) -> Self { - Self(Box::new(auth_option_resolver)) +impl SharedAuthSchemeOptionResolver { + /// Creates a new [`SharedAuthSchemeOptionResolver`]. + pub fn new(auth_scheme_option_resolver: impl ResolveAuthSchemeOptions + 'static) -> Self { + Self(Arc::new(auth_scheme_option_resolver)) } } -impl Storable for DynAuthOptionResolver { - type Storer = StoreReplace; -} - -impl AuthOptionResolver for DynAuthOptionResolver { - fn resolve_auth_options( +impl ResolveAuthSchemeOptions for SharedAuthSchemeOptionResolver { + fn resolve_auth_scheme_options( &self, - params: &AuthOptionResolverParams, + params: &AuthSchemeOptionResolverParams, ) -> Result, BoxError> { - (*self.0).resolve_auth_options(params) + (*self.0).resolve_auth_scheme_options(params) } } -pub trait HttpAuthScheme: Send + Sync + fmt::Debug { +impl_shared_conversions!( + convert SharedAuthSchemeOptionResolver + from ResolveAuthSchemeOptions + using SharedAuthSchemeOptionResolver::new +); + +/// An auth scheme. +/// +/// Auth schemes have unique identifiers (the `scheme_id`), +/// and provide an identity resolver and a signer. +pub trait AuthScheme: Send + Sync + fmt::Debug { + /// Returns the unique identifier associated with this auth scheme. + /// + /// This identifier is used to refer to this auth scheme from the + /// [`ResolveAuthSchemeOptions`], and is also associated with + /// identity resolvers in the config. fn scheme_id(&self) -> AuthSchemeId; + /// Returns the identity resolver that can resolve an identity for this scheme, if one is available. + /// + /// The [`AuthScheme`] doesn't actually own an identity resolver. Rather, identity resolvers + /// are configured as runtime components. The auth scheme merely chooses a compatible identity + /// resolver from the runtime components via the [`GetIdentityResolver`] trait. The trait is + /// given rather than the full set of runtime components to prevent complex resolution logic + /// involving multiple components from taking place in this function, since that's not the + /// intended use of this design. fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option; - fn request_signer(&self) -> &dyn HttpRequestSigner; + /// Returns the signing implementation for this auth scheme. + fn signer(&self) -> &dyn Sign; } -/// Container for a shared HTTP auth scheme implementation. +/// Container for a shared auth scheme implementation. #[derive(Clone, Debug)] -pub struct SharedHttpAuthScheme(Arc); +pub struct SharedAuthScheme(Arc); -impl SharedHttpAuthScheme { - /// Creates a new [`SharedHttpAuthScheme`] from the given auth scheme. - pub fn new(auth_scheme: impl HttpAuthScheme + 'static) -> Self { +impl SharedAuthScheme { + /// Creates a new [`SharedAuthScheme`] from the given auth scheme. + pub fn new(auth_scheme: impl AuthScheme + 'static) -> Self { Self(Arc::new(auth_scheme)) } } -impl HttpAuthScheme for SharedHttpAuthScheme { +impl AuthScheme for SharedAuthScheme { fn scheme_id(&self) -> AuthSchemeId { self.0.scheme_id() } fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { self.0.identity_resolver(identity_resolvers) } - fn request_signer(&self) -> &dyn HttpRequestSigner { - self.0.request_signer() + fn signer(&self) -> &dyn Sign { + self.0.signer() } } -impl Storable for SharedHttpAuthScheme { - type Storer = StoreAppend; -} +impl ValidateConfig for SharedAuthScheme {} + +impl_shared_conversions!(convert SharedAuthScheme from AuthScheme using SharedAuthScheme::new); -pub trait HttpRequestSigner: Send + Sync + fmt::Debug { - /// Return a signed version of the given request using the given identity. +/// Signing implementation for an auth scheme. +pub trait Sign: Send + Sync + fmt::Debug { + /// Sign the given request with the given identity, components, and config. /// /// If the provided identity is incompatible with this signer, an error must be returned. - fn sign_request( + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + runtime_components: &RuntimeComponents, config_bag: &ConfigBag, ) -> Result<(), BoxError>; } /// Endpoint configuration for the selected auth scheme. /// +/// The configuration held by this struct originates from the endpoint rule set in the service model. +/// /// This struct gets added to the request state by the auth orchestrator. #[non_exhaustive] #[derive(Clone, Debug)] pub struct AuthSchemeEndpointConfig<'a>(Option<&'a Document>); impl<'a> AuthSchemeEndpointConfig<'a> { - /// Creates a new [`AuthSchemeEndpointConfig`]. - pub fn new(config: Option<&'a Document>) -> Self { - Self(config) - } - - /// Creates an empty AuthSchemeEndpointConfig. + /// Creates an empty [`AuthSchemeEndpointConfig`]. pub fn empty() -> Self { Self(None) } - pub fn config(&self) -> Option<&'a Document> { + /// Returns the endpoint configuration as a [`Document`]. + pub fn as_document(&self) -> Option<&'a Document> { self.0 } } -#[cfg(test)] -mod tests { - use super::*; - use aws_smithy_types::config_bag::{ConfigBag, Layer}; - - #[test] - fn test_shared_http_auth_scheme_configuration() { - #[derive(Debug)] - struct TestHttpAuthScheme(&'static str); - impl HttpAuthScheme for TestHttpAuthScheme { - fn scheme_id(&self) -> AuthSchemeId { - AuthSchemeId::new(self.0) - } - - fn identity_resolver(&self, _: &IdentityResolvers) -> Option { - unreachable!("this shouldn't get called in this test") - } - - fn request_signer(&self) -> &dyn HttpRequestSigner { - unreachable!("this shouldn't get called in this test") - } - } - - let mut config_bag = ConfigBag::base(); - - let mut layer = Layer::new("first"); - layer.store_append(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_1"))); - config_bag.push_layer(layer); - - let mut layer = Layer::new("second"); - layer.store_append(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_2"))); - layer.store_append(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_3"))); - config_bag.push_layer(layer); - - let auth_schemes = config_bag.load::(); - let encountered_scheme_ids: Vec = - auth_schemes.map(|s| s.scheme_id()).collect(); - - assert_eq!( - vec![ - AuthSchemeId::new("scheme_3"), - AuthSchemeId::new("scheme_2"), - AuthSchemeId::new("scheme_1") - ], - encountered_scheme_ids - ); +impl<'a> From> for AuthSchemeEndpointConfig<'a> { + fn from(value: Option<&'a Document>) -> Self { + Self(value) + } +} + +impl<'a> From<&'a Document> for AuthSchemeEndpointConfig<'a> { + fn from(value: &'a Document) -> Self { + Self(Some(value)) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs index a4583c6e0af..bb6ee4cc494 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs @@ -5,7 +5,14 @@ use crate::client::auth::AuthSchemeId; +/// Auth scheme ID for HTTP API key based authentication. pub const HTTP_API_KEY_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("http-api-key-auth"); + +/// Auth scheme ID for HTTP Basic Auth. pub const HTTP_BASIC_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("http-basic-auth"); + +/// Auth scheme ID for HTTP Bearer Auth. pub const HTTP_BEARER_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("http-bearer-auth"); + +/// Auth scheme ID for HTTP Digest Auth. pub const HTTP_DIGEST_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("http-digest-auth"); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth/option_resolver.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth/option_resolver.rs deleted file mode 100644 index bf973bf6a44..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/auth/option_resolver.rs +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::box_error::BoxError; -use crate::client::auth::{AuthOptionResolver, AuthOptionResolverParams, AuthSchemeId}; -use std::borrow::Cow; - -/// New-type around a `Vec` that implements `AuthOptionResolver`. -/// -/// This is useful for clients that don't require `AuthOptionResolverParams` to resolve auth options. -#[derive(Debug)] -pub struct StaticAuthOptionResolver { - auth_options: Vec, -} - -impl StaticAuthOptionResolver { - /// Creates a new instance of `StaticAuthOptionResolver`. - pub fn new(auth_options: Vec) -> Self { - Self { auth_options } - } -} - -impl AuthOptionResolver for StaticAuthOptionResolver { - fn resolve_auth_options( - &self, - _params: &AuthOptionResolverParams, - ) -> Result, BoxError> { - Ok(Cow::Borrowed(&self.auth_options)) - } -} - -/// Empty params to be used with [`StaticAuthOptionResolver`]. -#[derive(Debug)] -pub struct StaticAuthOptionResolverParams; - -impl StaticAuthOptionResolverParams { - /// Creates a new `StaticAuthOptionResolverParams`. - pub fn new() -> Self { - Self - } -} - -impl From for AuthOptionResolverParams { - fn from(params: StaticAuthOptionResolverParams) -> Self { - AuthOptionResolverParams::new(params) - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs b/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs new file mode 100644 index 00000000000..46ee35aad48 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs @@ -0,0 +1,49 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::box_error::BoxError; +use crate::client::auth::{AuthSchemeId, AuthSchemeOptionResolverParams, ResolveAuthSchemeOptions}; +use std::borrow::Cow; + +/// New-type around a `Vec` that implements `ResolveAuthSchemeOptions`. +#[derive(Debug)] +pub struct StaticAuthSchemeOptionResolver { + auth_scheme_options: Vec, +} + +impl StaticAuthSchemeOptionResolver { + /// Creates a new instance of `StaticAuthSchemeOptionResolver`. + pub fn new(auth_scheme_options: Vec) -> Self { + Self { + auth_scheme_options, + } + } +} + +impl ResolveAuthSchemeOptions for StaticAuthSchemeOptionResolver { + fn resolve_auth_scheme_options( + &self, + _params: &AuthSchemeOptionResolverParams, + ) -> Result, BoxError> { + Ok(Cow::Borrowed(&self.auth_scheme_options)) + } +} + +/// Empty params to be used with [`StaticAuthSchemeOptionResolver`]. +#[derive(Debug)] +pub struct StaticAuthSchemeOptionResolverParams; + +impl StaticAuthSchemeOptionResolverParams { + /// Creates a new `StaticAuthSchemeOptionResolverParams`. + pub fn new() -> Self { + Self + } +} + +impl From for AuthSchemeOptionResolverParams { + fn from(params: StaticAuthSchemeOptionResolverParams) -> Self { + AuthSchemeOptionResolverParams::new(params) + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs b/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs new file mode 100644 index 00000000000..c44043fe739 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs @@ -0,0 +1,37 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Behavior Major version of the client + +/// Behavior major-version of the client +/// +/// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards +/// compatible. For example, a change which introduces new default timeouts or a new retry-mode for +/// all operations might be the ideal behavior but could break existing applications. +#[derive(Debug, Clone)] +pub struct BehaviorVersion {} + +impl BehaviorVersion { + /// This method will always return the latest major version. + /// + /// This is the recommend choice for customers who aren't reliant on extremely specific behavior + /// characteristics. For example, if you are writing a CLI app, the latest behavior major version + /// is probably the best setting for you. + /// + /// If, however, you're writing a service that is very latency sensitive, or that has written + /// code to tune Rust SDK behaviors, consider pinning to a specific major version. + /// + /// The latest version is currently [`BehaviorVersion::v2023_11_09`] + pub fn latest() -> Self { + Self {} + } + + /// This method returns the behavior configuration for November 9th, 2023 + /// + /// When a new behavior major version is released, this method will be deprecated. + pub fn v2023_11_09() -> Self { + Self {} + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs deleted file mode 100644 index 54832acf808..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/config_bag_accessors.rs +++ /dev/null @@ -1,443 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::client::auth::{ - AuthOptionResolver, AuthOptionResolverParams, AuthSchemeId, DynAuthOptionResolver, - SharedHttpAuthScheme, -}; -use crate::client::connectors::{Connector, DynConnector}; -use crate::client::identity::{ - ConfiguredIdentityResolver, IdentityResolvers, SharedIdentityResolver, -}; -use crate::client::orchestrator::{ - DynEndpointResolver, DynResponseDeserializer, EndpointResolver, EndpointResolverParams, - LoadedRequestBody, ResponseDeserializer, SharedRequestSerializer, NOT_NEEDED, -}; -use crate::client::retries::{DynRetryStrategy, RetryClassifiers, RetryStrategy}; -use aws_smithy_async::rt::sleep::SharedAsyncSleep; -use aws_smithy_async::time::{SharedTimeSource, TimeSource}; -use aws_smithy_types::config_bag::{AppendItemIter, CloneableLayer, ConfigBag, FrozenLayer, Layer}; -use std::fmt::Debug; - -// Place traits in a private module so that they can be used in the public API without being a part of the public API. -mod internal { - use aws_smithy_types::config_bag::{ - CloneableLayer, ConfigBag, FrozenLayer, Layer, Storable, Store, StoreAppend, StoreReplace, - }; - use std::fmt::Debug; - - pub trait Settable { - fn unset(&mut self); - - fn store_put(&mut self, value: T) - where - T: Storable>; - - fn store_append(&mut self, item: T) - where - T: Storable>; - } - - impl Settable for Layer { - fn unset(&mut self) { - Layer::unset::(self); - } - - fn store_put(&mut self, value: T) - where - T: Storable>, - { - Layer::store_put(self, value); - } - - fn store_append(&mut self, item: T) - where - T: Storable>, - { - Layer::store_append(self, item); - } - } - - pub trait CloneableSettable { - fn store_put(&mut self, value: T) - where - T: Storable> + Clone; - - fn store_append(&mut self, item: T) - where - T: Storable> + Clone; - } - - impl CloneableSettable for S - where - S: Settable, - { - fn store_put(&mut self, value: T) - where - T: Storable> + Clone, - { - Settable::store_put(self, value); - } - - fn store_append(&mut self, item: T) - where - T: Storable> + Clone, - { - Settable::store_append(self, item); - } - } - - impl CloneableSettable for CloneableLayer { - fn store_put(&mut self, value: T) - where - T: Storable> + Clone, - { - CloneableLayer::store_put(self, value); - } - - fn store_append(&mut self, item: T) - where - T: Storable> + Clone, - { - CloneableLayer::store_append(self, item); - } - } - - pub trait Gettable { - fn load(&self) -> ::ReturnedType<'_>; - } - - impl Gettable for ConfigBag { - fn load(&self) -> ::ReturnedType<'_> { - ConfigBag::load::(self) - } - } - - impl Gettable for CloneableLayer { - fn load(&self) -> ::ReturnedType<'_> { - Layer::load::(self) - } - } - - impl Gettable for Layer { - fn load(&self) -> ::ReturnedType<'_> { - Layer::load::(self) - } - } - - impl Gettable for FrozenLayer { - fn load(&self) -> ::ReturnedType<'_> { - Layer::load::(self) - } - } -} - -use internal::{CloneableSettable, Gettable, Settable}; - -pub trait ConfigBagAccessors { - fn auth_option_resolver_params(&self) -> &AuthOptionResolverParams - where - Self: Gettable, - { - self.load::() - .expect("auth option resolver params must be set") - } - fn set_auth_option_resolver_params( - &mut self, - auth_option_resolver_params: AuthOptionResolverParams, - ) where - Self: Settable, - { - self.store_put::(auth_option_resolver_params); - } - - fn auth_option_resolver(&self) -> &dyn AuthOptionResolver - where - Self: Gettable, - { - self.load::() - .expect("an auth option resolver must be set") - } - - fn set_auth_option_resolver(&mut self, auth_option_resolver: DynAuthOptionResolver) - where - Self: Settable, - { - self.store_put::(auth_option_resolver); - } - - fn endpoint_resolver_params(&self) -> &EndpointResolverParams - where - Self: Gettable, - { - self.load::() - .expect("endpoint resolver params must be set") - } - - fn set_endpoint_resolver_params(&mut self, endpoint_resolver_params: EndpointResolverParams) - where - Self: Settable, - { - self.store_put::(endpoint_resolver_params); - } - - fn endpoint_resolver(&self) -> &dyn EndpointResolver - where - Self: Gettable, - { - self.load::() - .expect("an endpoint resolver must be set") - } - - fn set_endpoint_resolver(&mut self, endpoint_resolver: DynEndpointResolver) - where - Self: Settable, - { - self.store_put::(endpoint_resolver); - } - - /// Returns the configured identity resolvers. - fn identity_resolvers(&self) -> IdentityResolvers - where - Self: Gettable, - { - IdentityResolvers::new(self.load::()) - } - - /// Adds an identity resolver to the config. - fn push_identity_resolver( - &mut self, - auth_scheme_id: AuthSchemeId, - identity_resolver: SharedIdentityResolver, - ) where - Self: CloneableSettable, - { - self.store_append::(ConfiguredIdentityResolver::new( - auth_scheme_id, - identity_resolver, - )); - } - - fn connector(&self) -> &dyn Connector - where - Self: Gettable, - { - self.load::().expect("missing connector") - } - - fn set_connector(&mut self, connection: DynConnector) - where - Self: Settable, - { - self.store_put::(connection); - } - - /// Returns the configured HTTP auth schemes. - fn http_auth_schemes(&self) -> HttpAuthSchemes<'_> - where - Self: Gettable, - { - HttpAuthSchemes::new(self.load::()) - } - - /// Adds a HTTP auth scheme to the config. - fn push_http_auth_scheme(&mut self, auth_scheme: SharedHttpAuthScheme) - where - Self: Settable, - { - self.store_append::(auth_scheme); - } - - fn request_serializer(&self) -> SharedRequestSerializer - where - Self: Gettable, - { - self.load::() - .expect("missing request serializer") - .clone() - } - fn set_request_serializer(&mut self, request_serializer: SharedRequestSerializer) - where - Self: Settable, - { - self.store_put::(request_serializer); - } - - fn response_deserializer(&self) -> &dyn ResponseDeserializer - where - Self: Gettable, - { - self.load::() - .expect("missing response deserializer") - } - fn set_response_deserializer(&mut self, response_deserializer: DynResponseDeserializer) - where - Self: Settable, - { - self.store_put::(response_deserializer); - } - - fn retry_classifiers(&self) -> &RetryClassifiers - where - Self: Gettable, - { - self.load::() - .expect("retry classifiers must be set") - } - fn set_retry_classifiers(&mut self, retry_classifiers: RetryClassifiers) - where - Self: Settable, - { - self.store_put::(retry_classifiers); - } - - fn retry_strategy(&self) -> Option<&dyn RetryStrategy> - where - Self: Gettable, - { - self.load::().map(|rs| rs as _) - } - fn set_retry_strategy(&mut self, retry_strategy: DynRetryStrategy) - where - Self: Settable, - { - self.store_put::(retry_strategy); - } - - fn request_time(&self) -> Option - where - Self: Gettable, - { - self.load::().cloned() - } - fn set_request_time(&mut self, time_source: impl TimeSource + 'static) - where - Self: Settable, - { - self.store_put::(SharedTimeSource::new(time_source)); - } - - fn sleep_impl(&self) -> Option - where - Self: Gettable, - { - self.load::().cloned() - } - fn set_sleep_impl(&mut self, async_sleep: Option) - where - Self: Settable, - { - if let Some(sleep_impl) = async_sleep { - self.store_put::(sleep_impl); - } else { - self.unset::(); - } - } - - fn loaded_request_body(&self) -> &LoadedRequestBody - where - Self: Gettable, - { - self.load::().unwrap_or(&NOT_NEEDED) - } - fn set_loaded_request_body(&mut self, loaded_request_body: LoadedRequestBody) - where - Self: Settable, - { - self.store_put::(loaded_request_body); - } -} - -impl ConfigBagAccessors for ConfigBag {} -impl ConfigBagAccessors for FrozenLayer {} -impl ConfigBagAccessors for CloneableLayer {} -impl ConfigBagAccessors for Layer {} - -/// Accessor for HTTP auth schemes. -#[derive(Debug)] -pub struct HttpAuthSchemes<'a> { - inner: AppendItemIter<'a, SharedHttpAuthScheme>, -} - -impl<'a> HttpAuthSchemes<'a> { - pub(crate) fn new(inner: AppendItemIter<'a, SharedHttpAuthScheme>) -> Self { - Self { inner } - } - - /// Returns the HTTP auth scheme with the given ID, if there is one. - pub fn scheme(mut self, scheme_id: AuthSchemeId) -> Option { - use crate::client::auth::HttpAuthScheme; - self.inner - .find(|&scheme| scheme.scheme_id() == scheme_id) - .cloned() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::client::auth::{HttpAuthScheme, HttpRequestSigner}; - use crate::client::config_bag_accessors::ConfigBagAccessors; - use aws_smithy_types::config_bag::{ConfigBag, Layer}; - - #[test] - fn test_shared_http_auth_scheme_configuration() { - #[derive(Debug)] - struct TestHttpAuthScheme(&'static str); - impl HttpAuthScheme for TestHttpAuthScheme { - fn scheme_id(&self) -> AuthSchemeId { - AuthSchemeId::new(self.0) - } - - fn identity_resolver(&self, _: &IdentityResolvers) -> Option { - unreachable!("this shouldn't get called in this test") - } - - fn request_signer(&self) -> &dyn HttpRequestSigner { - unreachable!("this shouldn't get called in this test") - } - } - - let mut config_bag = ConfigBag::base(); - - let mut layer = Layer::new("first"); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_1"))); - config_bag.push_layer(layer); - - let mut layer = Layer::new("second"); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_2"))); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(TestHttpAuthScheme("scheme_3"))); - config_bag.push_layer(layer); - - assert!(config_bag - .http_auth_schemes() - .scheme(AuthSchemeId::new("does-not-exist")) - .is_none()); - assert_eq!( - AuthSchemeId::new("scheme_1"), - config_bag - .http_auth_schemes() - .scheme(AuthSchemeId::new("scheme_1")) - .unwrap() - .scheme_id() - ); - assert_eq!( - AuthSchemeId::new("scheme_2"), - config_bag - .http_auth_schemes() - .scheme(AuthSchemeId::new("scheme_2")) - .unwrap() - .scheme_id() - ); - assert_eq!( - AuthSchemeId::new("scheme_3"), - config_bag - .http_auth_schemes() - .scheme(AuthSchemeId::new("scheme_3")) - .unwrap() - .scheme_id() - ); - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs new file mode 100644 index 00000000000..293e27dcb80 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/connection.rs @@ -0,0 +1,257 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Types related to connection monitoring and management. + +use std::fmt::{Debug, Formatter}; +use std::net::SocketAddr; +use std::sync::Arc; + +/// Metadata that tracks the state of an active connection. +#[derive(Clone)] +pub struct ConnectionMetadata { + is_proxied: bool, + remote_addr: Option, + local_addr: Option, + poison_fn: Arc, +} + +impl ConnectionMetadata { + /// Poison this connection, ensuring that it won't be reused. + pub fn poison(&self) { + tracing::info!("smithy connection was poisoned"); + (self.poison_fn)() + } + + /// Create a new [`ConnectionMetadata`]. + #[deprecated( + since = "1.1.0", + note = "`ConnectionMetadata::new` is deprecated in favour of `ConnectionMetadata::builder`." + )] + pub fn new( + is_proxied: bool, + remote_addr: Option, + poison: impl Fn() + Send + Sync + 'static, + ) -> Self { + Self { + is_proxied, + remote_addr, + // need to use builder to set this field + local_addr: None, + poison_fn: Arc::new(poison), + } + } + + /// Builder for this connection metadata + pub fn builder() -> ConnectionMetadataBuilder { + ConnectionMetadataBuilder::new() + } + + /// Get the remote address for this connection, if one is set. + pub fn remote_addr(&self) -> Option { + self.remote_addr + } + + /// Get the local address for this connection, if one is set. + pub fn local_addr(&self) -> Option { + self.local_addr + } +} + +impl Debug for ConnectionMetadata { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("SmithyConnection") + .field("is_proxied", &self.is_proxied) + .field("remote_addr", &self.remote_addr) + .field("local_addr", &self.local_addr) + .finish() + } +} + +/// Builder type that is used to construct a [`ConnectionMetadata`] value. +#[derive(Default)] +pub struct ConnectionMetadataBuilder { + is_proxied: Option, + remote_addr: Option, + local_addr: Option, + poison_fn: Option>, +} + +impl Debug for ConnectionMetadataBuilder { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ConnectionMetadataBuilder") + .field("is_proxied", &self.is_proxied) + .field("remote_addr", &self.remote_addr) + .field("local_addr", &self.local_addr) + .finish() + } +} + +impl ConnectionMetadataBuilder { + /// Creates a new builder. + pub fn new() -> Self { + Self::default() + } + + /// Set whether or not the associated connection is to an HTTP proxy. + pub fn proxied(mut self, proxied: bool) -> Self { + self.set_proxied(Some(proxied)); + self + } + + /// Set whether or not the associated connection is to an HTTP proxy. + pub fn set_proxied(&mut self, proxied: Option) -> &mut Self { + self.is_proxied = proxied; + self + } + + /// Set the remote address of the connection used. + pub fn remote_addr(mut self, remote_addr: SocketAddr) -> Self { + self.set_remote_addr(Some(remote_addr)); + self + } + + /// Set the remote address of the connection used. + pub fn set_remote_addr(&mut self, remote_addr: Option) -> &mut Self { + self.remote_addr = remote_addr; + self + } + + /// Set the local address of the connection used. + pub fn local_addr(mut self, local_addr: SocketAddr) -> Self { + self.set_local_addr(Some(local_addr)); + self + } + + /// Set the local address of the connection used. + pub fn set_local_addr(&mut self, local_addr: Option) -> &mut Self { + self.local_addr = local_addr; + self + } + + /// Set a closure which will poison the associated connection. + /// + /// A poisoned connection will not be reused for subsequent requests by the pool + pub fn poison_fn(mut self, poison_fn: impl Fn() + Send + Sync + 'static) -> Self { + self.set_poison_fn(Some(poison_fn)); + self + } + + /// Set a closure which will poison the associated connection. + /// + /// A poisoned connection will not be reused for subsequent requests by the pool + pub fn set_poison_fn( + &mut self, + poison_fn: Option, + ) -> &mut Self { + self.poison_fn = + poison_fn.map(|poison_fn| Arc::new(poison_fn) as Arc); + self + } + + /// Build a [`ConnectionMetadata`] value. + /// + /// # Panics + /// + /// If either the `is_proxied` or `poison_fn` has not been set, then this method will panic + pub fn build(self) -> ConnectionMetadata { + ConnectionMetadata { + is_proxied: self + .is_proxied + .expect("is_proxied should be set for ConnectionMetadata"), + remote_addr: self.remote_addr, + local_addr: self.local_addr, + poison_fn: self + .poison_fn + .expect("poison_fn should be set for ConnectionMetadata"), + } + } +} + +#[cfg(test)] +mod tests { + use std::{ + net::{IpAddr, Ipv6Addr}, + sync::Mutex, + }; + + use super::*; + + const TEST_SOCKET_ADDR: SocketAddr = SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), 100); + + #[test] + #[should_panic] + fn builder_panic_missing_proxied() { + ConnectionMetadataBuilder::new() + .poison_fn(|| {}) + .local_addr(TEST_SOCKET_ADDR) + .remote_addr(TEST_SOCKET_ADDR) + .build(); + } + + #[test] + #[should_panic] + fn builder_panic_missing_poison_fn() { + ConnectionMetadataBuilder::new() + .proxied(true) + .local_addr(TEST_SOCKET_ADDR) + .remote_addr(TEST_SOCKET_ADDR) + .build(); + } + + #[test] + fn builder_all_fields_successful() { + let mutable_flag = Arc::new(Mutex::new(false)); + + let connection_metadata = ConnectionMetadataBuilder::new() + .proxied(true) + .local_addr(TEST_SOCKET_ADDR) + .remote_addr(TEST_SOCKET_ADDR) + .poison_fn({ + let mutable_flag = Arc::clone(&mutable_flag); + move || { + let mut guard = mutable_flag.lock().unwrap(); + *guard = !*guard; + } + }) + .build(); + + assert_eq!(connection_metadata.is_proxied, true); + assert_eq!(connection_metadata.remote_addr(), Some(TEST_SOCKET_ADDR)); + assert_eq!(connection_metadata.local_addr(), Some(TEST_SOCKET_ADDR)); + assert_eq!(*mutable_flag.lock().unwrap(), false); + connection_metadata.poison(); + assert_eq!(*mutable_flag.lock().unwrap(), true); + } + + #[test] + fn builder_optional_fields_translate() { + let metadata1 = ConnectionMetadataBuilder::new() + .proxied(true) + .poison_fn(|| {}) + .build(); + + assert_eq!(metadata1.local_addr(), None); + assert_eq!(metadata1.remote_addr(), None); + + let metadata2 = ConnectionMetadataBuilder::new() + .proxied(true) + .poison_fn(|| {}) + .local_addr(TEST_SOCKET_ADDR) + .build(); + + assert_eq!(metadata2.local_addr(), Some(TEST_SOCKET_ADDR)); + assert_eq!(metadata2.remote_addr(), None); + + let metadata3 = ConnectionMetadataBuilder::new() + .proxied(true) + .poison_fn(|| {}) + .remote_addr(TEST_SOCKET_ADDR) + .build(); + + assert_eq!(metadata3.local_addr(), None); + assert_eq!(metadata3.remote_addr(), Some(TEST_SOCKET_ADDR)); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs deleted file mode 100644 index fd63eea38c9..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/connectors.rs +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use crate::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; -use aws_smithy_types::config_bag::{Storable, StoreReplace}; -use std::fmt; - -pub trait Connector: Send + Sync + fmt::Debug { - fn call(&self, request: HttpRequest) -> BoxFuture; -} - -#[derive(Debug)] -pub struct DynConnector(Box); - -impl DynConnector { - pub fn new(connection: impl Connector + 'static) -> Self { - Self(Box::new(connection)) - } -} - -impl Connector for DynConnector { - fn call(&self, request: HttpRequest) -> BoxFuture { - (*self.0).call(request) - } -} - -impl Storable for DynConnector { - type Storer = StoreReplace; -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs b/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs new file mode 100644 index 00000000000..41706e73370 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/dns.rs @@ -0,0 +1,81 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Interfaces for resolving DNS + +use crate::box_error::BoxError; +use crate::impl_shared_conversions; +use std::error::Error as StdError; +use std::fmt; +use std::net::IpAddr; +use std::sync::Arc; + +/// Error that occurs when failing to perform a DNS lookup. +#[derive(Debug)] +pub struct ResolveDnsError { + source: BoxError, +} + +impl ResolveDnsError { + /// Creates a new `DnsLookupFailed` error. + pub fn new(source: impl Into) -> Self { + ResolveDnsError { + source: source.into(), + } + } +} + +impl fmt::Display for ResolveDnsError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "failed to perform DNS lookup") + } +} + +impl StdError for ResolveDnsError { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + Some(&*self.source as _) + } +} + +new_type_future! { + #[doc = "New-type for the future returned by the [`ResolveDns`] trait."] + pub struct DnsFuture<'a, Vec, ResolveDnsError>; +} + +/// Trait for resolving domain names +pub trait ResolveDns: fmt::Debug + Send + Sync { + /// Asynchronously resolve the given domain name + fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a>; +} + +/// Shared instance of [`ResolveDns`]. +#[derive(Clone, Debug)] +pub struct SharedDnsResolver(Arc); + +impl SharedDnsResolver { + /// Create a new `SharedDnsResolver`. + pub fn new(resolver: impl ResolveDns + 'static) -> Self { + Self(Arc::new(resolver)) + } +} + +impl ResolveDns for SharedDnsResolver { + fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> { + self.0.resolve_dns(name) + } +} + +impl_shared_conversions!(convert SharedDnsResolver from ResolveDns using SharedDnsResolver::new); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn check_send() { + fn is_send() {} + is_send::>(); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs new file mode 100644 index 00000000000..13e9880a4a5 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs @@ -0,0 +1,73 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! APIs needed to configure endpoint resolution for clients. + +use crate::box_error::BoxError; +use crate::client::runtime_components::sealed::ValidateConfig; +use crate::impl_shared_conversions; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use aws_smithy_types::endpoint::Endpoint; +use aws_smithy_types::type_erasure::TypeErasedBox; +use std::fmt; +use std::sync::Arc; + +new_type_future! { + #[doc = "Future for [`EndpointResolver::resolve_endpoint`]."] + pub struct EndpointFuture<'a, Endpoint, BoxError>; +} + +/// Parameters originating from the Smithy endpoint ruleset required for endpoint resolution. +/// +/// The actual endpoint parameters are code generated from the Smithy model, and thus, +/// are not known to the runtime crates. Hence, this struct is really a new-type around +/// a [`TypeErasedBox`] that holds the actual concrete parameters in it. +#[derive(Debug)] +pub struct EndpointResolverParams(TypeErasedBox); + +impl EndpointResolverParams { + /// Creates a new [`EndpointResolverParams`] from a concrete parameters instance. + pub fn new(params: T) -> Self { + Self(TypeErasedBox::new(params)) + } + + /// Attempts to downcast the underlying concrete parameters to `T` and return it as a reference. + pub fn get(&self) -> Option<&T> { + self.0.downcast_ref() + } +} + +impl Storable for EndpointResolverParams { + type Storer = StoreReplace; +} + +/// Configurable endpoint resolver implementation. +pub trait ResolveEndpoint: Send + Sync + fmt::Debug { + /// Asynchronously resolves an endpoint to use from the given endpoint parameters. + fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a>; +} + +/// Shared endpoint resolver. +/// +/// This is a simple shared ownership wrapper type for the [`ResolveEndpoint`] trait. +#[derive(Clone, Debug)] +pub struct SharedEndpointResolver(Arc); + +impl SharedEndpointResolver { + /// Creates a new [`SharedEndpointResolver`]. + pub fn new(endpoint_resolver: impl ResolveEndpoint + 'static) -> Self { + Self(Arc::new(endpoint_resolver)) + } +} + +impl ResolveEndpoint for SharedEndpointResolver { + fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a> { + self.0.resolve_endpoint(params) + } +} + +impl ValidateConfig for SharedEndpointResolver {} + +impl_shared_conversions!(convert SharedEndpointResolver from ResolveEndpoint using SharedEndpointResolver::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs new file mode 100644 index 00000000000..aa66f796992 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/http.rs @@ -0,0 +1,301 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! HTTP clients and connectors +//! +//! # What is a connector? +//! +//! When we talk about connectors, we are referring to the [`HttpConnector`] trait, and implementations of +//! that trait. This trait simply takes a HTTP request, and returns a future with the response for that +//! request. +//! +//! This is slightly different from what a connector is in other libraries such as +//! [`hyper`]. In hyper 0.x, the connector is a [`tower`] `Service` that takes a `Uri` and returns +//! a future with something that implements `AsyncRead + AsyncWrite`. +//! +//! The [`HttpConnector`] is designed to be a layer on top of +//! whole HTTP libraries, such as hyper, which allows Smithy clients to be agnostic to the underlying HTTP +//! transport layer. This also makes it easy to write tests with a fake HTTP connector, and several +//! such test connector implementations are available in [`aws-smithy-runtime`] +//! with the `test-util` feature enabled. +//! +//! # Responsibilities of a connector +//! +//! A connector primarily makes HTTP requests, but is also the place where connect and read timeouts are +//! implemented. The `HyperConnector` in [`aws-smithy-runtime`] is an example where timeouts are implemented +//! as part of the connector. +//! +//! Connectors are also responsible for DNS lookup, TLS, connection reuse, pooling, and eviction. +//! The Smithy clients have no knowledge of such concepts. +//! +//! # The [`HttpClient`] trait +//! +//! Connectors allow us to make requests, but we need a layer on top of connectors so that we can handle +//! varying connector settings. For example, say we configure some default HTTP connect/read timeouts on +//! Client, and then configure some override connect/read timeouts for a specific operation. These timeouts +//! ultimately are part of the connector, so the same connector can't be reused for the two different sets +//! of timeouts. Thus, the [`HttpClient`] implementation is responsible for managing multiple connectors +//! with varying config. Some example configs that can impact which connector is used: +//! +//! - HTTP protocol versions +//! - TLS settings +//! - Timeouts +//! +//! Some of these aren't implemented yet, but they will appear in the [`HttpConnectorSettings`] struct +//! once they are. +//! +//! [`hyper`]: https://crates.io/crates/hyper +//! [`tower`]: https://crates.io/crates/tower +//! [`aws-smithy-runtime`]: https://crates.io/crates/aws-smithy-runtime + +use crate::box_error::BoxError; +use crate::client::orchestrator::{HttpRequest, HttpResponse}; +use crate::client::result::ConnectorError; +use crate::client::runtime_components::sealed::ValidateConfig; +use crate::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder}; +use crate::impl_shared_conversions; +use aws_smithy_types::config_bag::ConfigBag; +use std::fmt; +use std::sync::Arc; +use std::time::Duration; + +new_type_future! { + #[doc = "Future for [`HttpConnector::call`]."] + pub struct HttpConnectorFuture<'static, HttpResponse, ConnectorError>; +} + +/// Trait with a `call` function that asynchronously converts a request into a response. +/// +/// Ordinarily, a connector would use an underlying HTTP library such as [hyper](https://crates.io/crates/hyper), +/// and any associated HTTPS implementation alongside it to service requests. +/// +/// However, it can also be useful to create fake/mock connectors implementing this trait +/// for testing. +pub trait HttpConnector: Send + Sync + fmt::Debug { + /// Asynchronously converts a request into a response. + fn call(&self, request: HttpRequest) -> HttpConnectorFuture; +} + +/// A shared [`HttpConnector`] implementation. +#[derive(Clone, Debug)] +pub struct SharedHttpConnector(Arc); + +impl SharedHttpConnector { + /// Returns a new [`SharedHttpConnector`]. + pub fn new(connection: impl HttpConnector + 'static) -> Self { + Self(Arc::new(connection)) + } +} + +impl HttpConnector for SharedHttpConnector { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + (*self.0).call(request) + } +} + +impl_shared_conversions!(convert SharedHttpConnector from HttpConnector using SharedHttpConnector::new); + +/// Returns a [`SharedHttpClient`] that calls the given `connector` function to select a HTTP connector. +pub fn http_client_fn(connector: F) -> SharedHttpClient +where + F: Fn(&HttpConnectorSettings, &RuntimeComponents) -> SharedHttpConnector + + Send + + Sync + + 'static, +{ + struct ConnectorFn(T); + impl fmt::Debug for ConnectorFn { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("ConnectorFn") + } + } + impl HttpClient for ConnectorFn + where + T: (Fn(&HttpConnectorSettings, &RuntimeComponents) -> SharedHttpConnector) + Send + Sync, + { + fn http_connector( + &self, + settings: &HttpConnectorSettings, + components: &RuntimeComponents, + ) -> SharedHttpConnector { + (self.0)(settings, components) + } + } + + SharedHttpClient::new(ConnectorFn(connector)) +} + +/// HTTP client abstraction. +/// +/// A HTTP client implementation must apply connect/read timeout settings, +/// and must maintain a connection pool. +pub trait HttpClient: Send + Sync + fmt::Debug { + /// Returns a HTTP connector based on the requested connector settings. + /// + /// The settings include connector timeouts, which should be incorporated + /// into the connector. The `HttpClient` is responsible for caching + /// the connector across requests. + /// + /// In the future, the settings may have additional parameters added, + /// such as HTTP version, or TLS certificate paths. + fn http_connector( + &self, + settings: &HttpConnectorSettings, + components: &RuntimeComponents, + ) -> SharedHttpConnector; + + #[doc = include_str!("../../rustdoc/validate_base_client_config.md")] + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } + + #[doc = include_str!("../../rustdoc/validate_final_config.md")] + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } +} + +/// Shared HTTP client for use across multiple clients and requests. +#[derive(Clone, Debug)] +pub struct SharedHttpClient { + selector: Arc, +} + +impl SharedHttpClient { + /// Creates a new `SharedHttpClient` + pub fn new(selector: impl HttpClient + 'static) -> Self { + Self { + selector: Arc::new(selector), + } + } +} + +impl HttpClient for SharedHttpClient { + fn http_connector( + &self, + settings: &HttpConnectorSettings, + components: &RuntimeComponents, + ) -> SharedHttpConnector { + self.selector.http_connector(settings, components) + } +} + +impl ValidateConfig for SharedHttpClient { + fn validate_base_client_config( + &self, + runtime_components: &super::runtime_components::RuntimeComponentsBuilder, + cfg: &aws_smithy_types::config_bag::ConfigBag, + ) -> Result<(), crate::box_error::BoxError> { + self.selector + .validate_base_client_config(runtime_components, cfg) + } + + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &aws_smithy_types::config_bag::ConfigBag, + ) -> Result<(), crate::box_error::BoxError> { + self.selector.validate_final_config(runtime_components, cfg) + } +} + +impl_shared_conversions!(convert SharedHttpClient from HttpClient using SharedHttpClient::new); + +/// Builder for [`HttpConnectorSettings`]. +#[non_exhaustive] +#[derive(Default, Debug)] +pub struct HttpConnectorSettingsBuilder { + connect_timeout: Option, + read_timeout: Option, +} + +impl HttpConnectorSettingsBuilder { + /// Creates a new builder. + pub fn new() -> Self { + Default::default() + } + + /// Sets the connect timeout that should be used. + /// + /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. + pub fn connect_timeout(mut self, connect_timeout: Duration) -> Self { + self.connect_timeout = Some(connect_timeout); + self + } + + /// Sets the connect timeout that should be used. + /// + /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. + pub fn set_connect_timeout(&mut self, connect_timeout: Option) -> &mut Self { + self.connect_timeout = connect_timeout; + self + } + + /// Sets the read timeout that should be used. + /// + /// The read timeout is the limit on the amount of time it takes to read the first byte of a response + /// from the time the request is initiated. + pub fn read_timeout(mut self, read_timeout: Duration) -> Self { + self.read_timeout = Some(read_timeout); + self + } + + /// Sets the read timeout that should be used. + /// + /// The read timeout is the limit on the amount of time it takes to read the first byte of a response + /// from the time the request is initiated. + pub fn set_read_timeout(&mut self, read_timeout: Option) -> &mut Self { + self.read_timeout = read_timeout; + self + } + + /// Builds the [`HttpConnectorSettings`]. + pub fn build(self) -> HttpConnectorSettings { + HttpConnectorSettings { + connect_timeout: self.connect_timeout, + read_timeout: self.read_timeout, + } + } +} + +/// Settings for HTTP Connectors +#[non_exhaustive] +#[derive(Clone, Default, Debug)] +pub struct HttpConnectorSettings { + connect_timeout: Option, + read_timeout: Option, +} + +impl HttpConnectorSettings { + /// Returns a builder for `HttpConnectorSettings`. + pub fn builder() -> HttpConnectorSettingsBuilder { + Default::default() + } + + /// Returns the connect timeout that should be used. + /// + /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection. + pub fn connect_timeout(&self) -> Option { + self.connect_timeout + } + + /// Returns the read timeout that should be used. + /// + /// The read timeout is the limit on the amount of time it takes to read the first byte of a response + /// from the time the request is initiated. + pub fn read_timeout(&self) -> Option { + self.read_timeout + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs index a8ab993960e..3632029e7b1 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs @@ -3,40 +3,200 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::box_error::BoxError; use crate::client::auth::AuthSchemeId; -use crate::client::orchestrator::Future; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreAppend, StoreReplace}; +use crate::client::runtime_components::sealed::ValidateConfig; +use crate::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder}; +use crate::impl_shared_conversions; +use aws_smithy_types::config_bag::ConfigBag; use std::any::Any; use std::fmt; use std::fmt::Debug; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::time::SystemTime; #[cfg(feature = "http-auth")] pub mod http; -/// Resolves an identity for a request. -pub trait IdentityResolver: Send + Sync + Debug { - fn resolve_identity(&self, config_bag: &ConfigBag) -> Future; +new_type_future! { + #[doc = "Future for [`IdentityResolver::resolve_identity`]."] + pub struct IdentityFuture<'a, Identity, BoxError>; +} + +static NEXT_CACHE_PARTITION: AtomicUsize = AtomicUsize::new(0); + +/// Cache partition key for identity caching. +/// +/// Identities need cache partitioning because a single identity cache is used across +/// multiple identity providers across multiple auth schemes. In addition, a single auth scheme +/// may have many different identity providers due to operation-level config overrides. +/// +/// This partition _must_ be respected when retrieving from the identity cache and _should_ +/// be part of the cache key. +/// +/// Calling [`IdentityCachePartition::new`] will create a new globally unique cache partition key, +/// and the [`SharedIdentityResolver`] will automatically create and store a partion on construction. +/// Thus, every configured identity resolver will be assigned a unique partition. +#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] +pub struct IdentityCachePartition(usize); + +impl IdentityCachePartition { + /// Create a new globally unique cache partition key. + pub fn new() -> Self { + Self(NEXT_CACHE_PARTITION.fetch_add(1, Ordering::Relaxed)) + } + + /// Helper for unit tests to create an identity cache partition with a known value. + #[cfg(feature = "test-util")] + pub fn new_for_tests(value: usize) -> IdentityCachePartition { + Self(value) + } +} + +/// Caching resolver for identities. +pub trait ResolveCachedIdentity: fmt::Debug + Send + Sync { + /// Returns a cached identity, or resolves an identity and caches it if its not already cached. + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a>; + + #[doc = include_str!("../../rustdoc/validate_base_client_config.md")] + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } + + #[doc = include_str!("../../rustdoc/validate_final_config.md")] + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } +} + +/// Shared identity cache. +#[derive(Clone, Debug)] +pub struct SharedIdentityCache(Arc); + +impl SharedIdentityCache { + /// Creates a new [`SharedIdentityCache`] from the given cache implementation. + pub fn new(cache: impl ResolveCachedIdentity + 'static) -> Self { + Self(Arc::new(cache)) + } +} + +impl ResolveCachedIdentity for SharedIdentityCache { + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + self.0 + .resolve_cached_identity(resolver, runtime_components, config_bag) + } +} + +impl ValidateConfig for SharedIdentityCache { + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + self.0.validate_base_client_config(runtime_components, cfg) + } + + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + self.0.validate_final_config(runtime_components, cfg) + } +} + +impl_shared_conversions!(convert SharedIdentityCache from ResolveCachedIdentity using SharedIdentityCache::new); + +/// Resolver for identities. +/// +/// Every [`AuthScheme`](crate::client::auth::AuthScheme) has one or more compatible +/// identity resolvers, which are selected from runtime components by the auth scheme +/// implementation itself. +/// +/// The identity resolver must return an [`IdentityFuture`] with the resolved identity, or an error +/// if resolution failed. There is no optionality for identity resolvers. The identity either +/// resolves successfully, or it fails. The orchestrator will choose exactly one auth scheme +/// to use, and thus, its chosen identity resolver is the only identity resolver that runs. +/// There is no fallback to other auth schemes in the absence of an identity. +pub trait ResolveIdentity: Send + Sync + Debug { + /// Asynchronously resolves an identity for a request using the given config. + fn resolve_identity<'a>( + &'a self, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a>; + + /// Returns a fallback identity. + /// + /// This method should be used as a fallback plan, i.e., when a call to `resolve_identity` + /// is interrupted by a timeout and its future fails to complete. + /// + /// The fallback identity should be set aside and ready to be returned + /// immediately. Therefore, a new identity should NOT be fetched + /// within this method, which might cause a long-running operation. + fn fallback_on_interrupt(&self) -> Option { + None + } } /// Container for a shared identity resolver. #[derive(Clone, Debug)] -pub struct SharedIdentityResolver(Arc); +pub struct SharedIdentityResolver { + inner: Arc, + cache_partition: IdentityCachePartition, +} impl SharedIdentityResolver { /// Creates a new [`SharedIdentityResolver`] from the given resolver. - pub fn new(resolver: impl IdentityResolver + 'static) -> Self { - Self(Arc::new(resolver)) + pub fn new(resolver: impl ResolveIdentity + 'static) -> Self { + Self { + inner: Arc::new(resolver), + cache_partition: IdentityCachePartition::new(), + } + } + + /// Returns the globally unique cache partition key for this identity resolver. + /// + /// See the [`IdentityCachePartition`] docs for more information on what this is used for + /// and why. + pub fn cache_partition(&self) -> IdentityCachePartition { + self.cache_partition } } -impl IdentityResolver for SharedIdentityResolver { - fn resolve_identity(&self, config_bag: &ConfigBag) -> Future { - self.0.resolve_identity(config_bag) +impl ResolveIdentity for SharedIdentityResolver { + fn resolve_identity<'a>( + &'a self, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + self.inner.resolve_identity(runtime_components, config_bag) } } +impl_shared_conversions!(convert SharedIdentityResolver from ResolveIdentity using SharedIdentityResolver::new); + /// An identity resolver paired with an auth scheme ID that it resolves for. #[derive(Clone, Debug)] pub(crate) struct ConfiguredIdentityResolver { @@ -67,36 +227,19 @@ impl ConfiguredIdentityResolver { } } -impl Storable for ConfiguredIdentityResolver { - type Storer = StoreAppend; -} - -#[derive(Clone, Debug, Default)] -pub struct IdentityResolvers { - identity_resolvers: Vec, -} - -impl Storable for IdentityResolvers { - type Storer = StoreReplace; -} - -impl IdentityResolvers { - pub(crate) fn new<'a>(resolvers: impl Iterator) -> Self { - let identity_resolvers: Vec<_> = resolvers.cloned().collect(); - if identity_resolvers.is_empty() { - tracing::warn!("no identity resolvers available for this request"); - } - Self { identity_resolvers } - } - - pub fn identity_resolver(&self, scheme_id: AuthSchemeId) -> Option { - self.identity_resolvers - .iter() - .find(|pair| pair.scheme_id() == scheme_id) - .map(|pair| pair.identity_resolver()) - } -} +impl ValidateConfig for ConfiguredIdentityResolver {} +/// An identity that can be used for authentication. +/// +/// The [`Identity`] is a container for any arbitrary identity data that may be used +/// by a [`Sign`](crate::client::auth::Sign) implementation. Under the hood, it +/// has an `Arc`, and it is the responsibility of the signer to downcast +/// to the appropriate data type using the `data()` function. +/// +/// The `Identity` also holds an optional expiration time, which may duplicate +/// an expiration time on the identity data. This is because an `Arc` +/// can't be downcast to any arbitrary trait, and expiring identities are +/// common enough to be built-in. #[derive(Clone)] pub struct Identity { data: Arc, @@ -106,6 +249,7 @@ pub struct Identity { } impl Identity { + /// Creates a new identity with the given data and expiration time. pub fn new(data: T, expiration: Option) -> Self where T: Any + Debug + Send + Sync, @@ -117,16 +261,18 @@ impl Identity { } } + /// Returns the raw identity data. pub fn data(&self) -> Option<&T> { self.data.downcast_ref() } - pub fn expiration(&self) -> Option<&SystemTime> { - self.expiration.as_ref() + /// Returns the expiration time for this identity, if any. + pub fn expiration(&self) -> Option { + self.expiration } } -impl fmt::Debug for Identity { +impl Debug for Identity { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("Identity") .field("data", (self.data_debug)(&self.data)) @@ -138,6 +284,7 @@ impl fmt::Debug for Identity { #[cfg(test)] mod tests { use super::*; + use aws_smithy_async::time::{SystemTimeSource, TimeSource}; #[test] fn check_send_sync() { @@ -153,7 +300,8 @@ mod tests { last: String, } - let expiration = SystemTime::now(); + let ts = SystemTimeSource::new(); + let expiration = ts.now(); let identity = Identity::new( MyIdentityData { first: "foo".into(), @@ -164,6 +312,6 @@ mod tests { assert_eq!("foo", identity.data::().unwrap().first); assert_eq!("bar", identity.data::().unwrap().last); - assert_eq!(Some(&expiration), identity.expiration()); + assert_eq!(Some(expiration), identity.expiration()); } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs index 878943c545a..5ec332cf3e3 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs @@ -5,8 +5,8 @@ //! Identity types for HTTP auth -use crate::client::identity::{Identity, IdentityResolver}; -use crate::client::orchestrator::Future; +use crate::client::identity::{Identity, IdentityFuture, ResolveIdentity}; +use crate::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use std::fmt::Debug; use std::sync::Arc; @@ -64,9 +64,13 @@ impl From for Token { } } -impl IdentityResolver for Token { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { - Future::ready(Ok(Identity::new(self.clone(), self.0.expiration))) +impl ResolveIdentity for Token { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } } @@ -123,8 +127,12 @@ impl Login { } } -impl IdentityResolver for Login { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { - Future::ready(Ok(Identity::new(self.clone(), self.0.expiration))) +impl ResolveIdentity for Login { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration))) } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs index 5d93c645660..e4fde15ad47 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs @@ -3,41 +3,53 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Interceptors for clients. +//! +//! Interceptors are operation lifecycle hooks that can read/modify requests and responses. + use crate::box_error::BoxError; use crate::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut, BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut, BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut, - FinalizerInterceptorContextRef, InterceptorContext, + FinalizerInterceptorContextRef, }; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreAppend, StoreReplace}; -use aws_smithy_types::error::display::DisplayErrorContext; -use context::{Error, Input, Output}; +use crate::client::runtime_components::sealed::ValidateConfig; +use crate::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; use std::fmt; use std::marker::PhantomData; -use std::ops::Deref; use std::sync::Arc; pub mod context; pub mod error; +use crate::impl_shared_conversions; pub use error::InterceptorError; macro_rules! interceptor_trait_fn { ($name:ident, $phase:ident, $docs:tt) => { #[doc = $docs] - fn $name(&self, context: &$phase<'_>, cfg: &mut ConfigBag) -> Result<(), BoxError> { - let _ctx = context; - let _cfg = cfg; + fn $name( + &self, + context: &$phase<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } }; (mut $name:ident, $phase:ident, $docs:tt) => { #[doc = $docs] - fn $name(&self, context: &mut $phase<'_>, cfg: &mut ConfigBag) -> Result<(), BoxError> { - let _ctx = context; - let _cfg = cfg; + fn $name( + &self, + context: &mut $phase<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } }; @@ -53,30 +65,35 @@ macro_rules! interceptor_trait_fn { /// of the SDK ’s request execution pipeline. Hooks are either "read" hooks, which make it possible /// to read in-flight request or response messages, or "read/write" hooks, which make it possible /// to modify in-flight request or output messages. -pub trait Interceptor: fmt::Debug { - interceptor_trait_fn!( - read_before_execution, - BeforeSerializationInterceptorContextRef, - " - A hook called at the start of an execution, before the SDK - does anything else. - - **When:** This will **ALWAYS** be called once per execution. The duration - between invocation of this hook and `after_execution` is very close - to full duration of the execution. +pub trait Intercept: fmt::Debug + Send + Sync { + /// The name of this interceptor, used in error messages for debugging. + fn name(&self) -> &'static str; - **Available Information:** The [InterceptorContext::input()] is - **ALWAYS** available. Other information **WILL NOT** be available. - - **Error Behavior:** Errors raised by this hook will be stored - until all interceptors have had their `before_execution` invoked. - Other hooks will then be skipped and execution will jump to - `modify_before_completion` with the raised error as the - [InterceptorContext::output_or_error()]. If multiple - `before_execution` methods raise errors, the latest - will be used and earlier ones will be logged and dropped. - " - ); + /// A hook called at the start of an execution, before the SDK + /// does anything else. + /// + /// **When:** This will **ALWAYS** be called once per execution. The duration + /// between invocation of this hook and `after_execution` is very close + /// to full duration of the execution. + /// + /// **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input) + /// is **ALWAYS** available. Other information **WILL NOT** be available. + /// + /// **Error Behavior:** Errors raised by this hook will be stored + /// until all interceptors have had their `before_execution` invoked. + /// Other hooks will then be skipped and execution will jump to + /// `modify_before_completion` with the raised error as the + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). If multiple + /// `before_execution` methods raise errors, the latest + /// will be used and earlier ones will be logged and dropped. + fn read_before_execution( + &self, + context: &BeforeSerializationInterceptorContextRef<'_>, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let (_ctx, _cfg) = (context, cfg); + Ok(()) + } interceptor_trait_fn!( mut modify_before_serialization, @@ -90,15 +107,14 @@ pub trait Interceptor: fmt::Debug { **When:** This will **ALWAYS** be called once per execution, except when a failure occurs earlier in the request pipeline. - **Available Information:** The [InterceptorContext::input()] is + **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input) is **ALWAYS** available. This request may have been modified by earlier `modify_before_serialization` hooks, and may be modified further by later hooks. Other information **WILL NOT** be available. **Error Behavior:** If errors are raised by this hook, - execution will jump to `modify_before_completion` with the raised - error as the [InterceptorContext::output_or_error()]. + error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The input message returned by this hook MUST be the same type of input message passed into this hook. @@ -119,12 +135,12 @@ pub trait Interceptor: fmt::Debug { duration between invocation of this hook and `after_serialization` is very close to the amount of time spent marshalling the request. - **Available Information:** The [InterceptorContext::input()] is + **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input) is **ALWAYS** available. Other information **WILL NOT** be available. **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_completion` with the raised - error as the [InterceptorContext::output_or_error()]. + error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -132,21 +148,20 @@ pub trait Interceptor: fmt::Debug { read_after_serialization, BeforeTransmitInterceptorContextRef, " - /// A hook called after the input message is marshalled into - /// a transport message. - /// - /// **When:** This will **ALWAYS** be called once per execution, except when a - /// failure occurs earlier in the request pipeline. The duration - /// between invocation of this hook and `before_serialization` is very - /// close to the amount of time spent marshalling the request. - /// - /// **Available Information:** The [InterceptorContext::input()] - /// and [InterceptorContext::request()] are **ALWAYS** available. - /// Other information **WILL NOT** be available. - /// - /// **Error Behavior:** If errors are raised by this hook, - /// execution will jump to `modify_before_completion` with the raised - /// error as the [InterceptorContext::output_or_error()]. + A hook called after the input message is marshalled into + a transport message. + + **When:** This will **ALWAYS** be called once per execution, except when a + failure occurs earlier in the request pipeline. The duration + between invocation of this hook and `before_serialization` is very + close to the amount of time spent marshalling the request. + + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. Other information **WILL NOT** be available. + + **Error Behavior:** If errors are raised by this hook, + execution will jump to `modify_before_completion` with the raised + error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -158,13 +173,12 @@ pub trait Interceptor: fmt::Debug { has the ability to modify and return a new transport request message of the same type, except when a failure occurs earlier in the request pipeline. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. - Other information **WILL NOT** be available. + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. Other information **WILL NOT** be available. **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_completion` with the raised - error as the [InterceptorContext::output_or_error()]. + error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The transport request message returned by this hook MUST be the same type of request message passed into this hook @@ -183,9 +197,8 @@ pub trait Interceptor: fmt::Debug { failure occurs earlier in the request pipeline. This method will be called multiple times in the event of retries. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. - Other information **WILL NOT** be available. In the event of retries, + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). @@ -193,7 +206,7 @@ pub trait Interceptor: fmt::Debug { until all interceptors have had their `before_attempt` invoked. Other hooks will then be skipped and execution will jump to `modify_before_attempt_completion` with the raised error as the - [InterceptorContext::output_or_error()]. If multiple + [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). If multiple `before_attempt` methods raise errors, the latest will be used and earlier ones will be logged and dropped. " @@ -211,18 +224,16 @@ pub trait Interceptor: fmt::Debug { failure occurs earlier in the request pipeline. This method may be called multiple times in the event of retries. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. - The `http::Request` may have been modified by earlier + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. The `http::Request` may have been modified by earlier `modify_before_signing` hooks, and may be modified further by later hooks. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made - in previous attempts - (e.g. by request signers or other interceptors). + in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The transport request message returned by this hook MUST be the same type of request message passed into this hook @@ -243,15 +254,14 @@ pub trait Interceptor: fmt::Debug { invocation of this hook and `after_signing` is very close to the amount of time spent signing the request. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -267,15 +277,14 @@ pub trait Interceptor: fmt::Debug { invocation of this hook and `before_signing` is very close to the amount of time spent signing the request. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -283,26 +292,25 @@ pub trait Interceptor: fmt::Debug { mut modify_before_transmit, BeforeTransmitInterceptorContextMut, " - /// A hook called before the transport request message is sent to the - /// service. This method has the ability to modify and return - /// a new transport request message of the same type. - /// - /// **When:** This will **ALWAYS** be called once per attempt, except when a - /// failure occurs earlier in the request pipeline. This method may be - /// called multiple times in the event of retries. - /// - /// **Available Information:** The [InterceptorContext::input()] - /// and [InterceptorContext::request()] are **ALWAYS** available. - /// The `http::Request` may have been modified by earlier - /// `modify_before_transmit` hooks, and may be modified further by later - /// hooks. Other information **WILL NOT** be available. - /// In the event of retries, the `InterceptorContext` will not include - /// changes made in previous attempts (e.g. by request signers or + A hook called before the transport request message is sent to the + service. This method has the ability to modify and return + a new transport request message of the same type. + + **When:** This will **ALWAYS** be called once per attempt, except when a + failure occurs earlier in the request pipeline. This method may be + called multiple times in the event of retries. + + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. The `http::Request` may have been modified by earlier + `modify_before_transmit` hooks, and may be modified further by later + hooks. Other information **WILL NOT** be available. + In the event of retries, the `InterceptorContext` will not include + changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The transport request message returned by this hook MUST be the same type of request message passed into this hook @@ -326,16 +334,15 @@ pub trait Interceptor: fmt::Debug { Depending on the protocol, the duration may not include the time spent reading the response data. - **Available Information:** The [InterceptorContext::input()] - and [InterceptorContext::request()] are **ALWAYS** available. - Other information **WILL NOT** be available. In the event of retries, + **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) + is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -354,16 +361,14 @@ pub trait Interceptor: fmt::Debug { Depending on the protocol, the duration may not include the time spent reading the response data. - **Available Information:** The [InterceptorContext::input()], - [InterceptorContext::request()] and - [InterceptorContext::response()] are **ALWAYS** available. - Other information **WILL NOT** be available. In the event of retries, + **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response) + is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -379,10 +384,8 @@ pub trait Interceptor: fmt::Debug { failure occurs earlier in the request pipeline. This method may be called multiple times in the event of retries. - **Available Information:** The [InterceptorContext::input()], - [InterceptorContext::request()] and - [InterceptorContext::response()] are **ALWAYS** available. - The transmit_response may have been modified by earlier + **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response) + is **ALWAYS** available. The transmit_response may have been modified by earlier `modify_before_deserialization` hooks, and may be modified further by later hooks. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in @@ -391,7 +394,7 @@ pub trait Interceptor: fmt::Debug { **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with the raised error as the - [InterceptorContext::output_or_error()]. + [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). **Return Constraints:** The transport response message returned by this hook MUST be the same type of response message passed into @@ -413,16 +416,14 @@ pub trait Interceptor: fmt::Debug { Depending on the protocol and operation, the duration may include the time spent downloading the response data. - **Available Information:** The [InterceptorContext::input()], - [InterceptorContext::request()] and - [InterceptorContext::response()] are **ALWAYS** available. - Other information **WILL NOT** be available. In the event of retries, + **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response) + is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` - with the raised error as the [InterceptorContext::output_or_error()]. + with the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -440,16 +441,14 @@ pub trait Interceptor: fmt::Debug { the duration may include the time spent downloading the response data. - **Available Information:** The [InterceptorContext::input()], - [InterceptorContext::request()], - [InterceptorContext::response()] and - [InterceptorContext::output_or_error()] are **ALWAYS** available. In the event - of retries, the `InterceptorContext` will not include changes made + **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response) + and [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) + are **ALWAYS** available. In the event of retries, the `InterceptorContext` will not include changes made in previous attempts (e.g. by request signers or other interceptors). **Error Behavior:** If errors are raised by this hook, execution will jump to `modify_before_attempt_completion` with - the raised error as the [InterceptorContext::output_or_error()]. + the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). " ); @@ -461,16 +460,19 @@ pub trait Interceptor: fmt::Debug { /// failure occurs before `before_attempt`. This method may /// be called multiple times in the event of retries. /// - /// **Available Information:** The [InterceptorContext::input()], - /// [InterceptorContext::request()], - /// [InterceptorContext::response()] and - /// [InterceptorContext::output_or_error()] are **ALWAYS** available. In the event - /// of retries, the `InterceptorContext` will not include changes made + /// **Available Information:** + /// The [`InterceptorContext::input`](context::InterceptorContext::input), + /// [`InterceptorContext::request`](context::InterceptorContext::request), + /// [`InterceptorContext::response`](context::InterceptorContext::response), or + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available. + /// If the operation succeeded, the `output` will be available. Otherwise, any of the other + /// pieces of information may be available depending on where in the operation lifecycle it failed. + /// In the event of retries, the `InterceptorContext` will not include changes made /// in previous attempts (e.g. by request signers or other interceptors). /// /// **Error Behavior:** If errors are raised by this /// hook, execution will jump to `after_attempt` with - /// the raised error as the [InterceptorContext::output_or_error()]. + /// the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). /// /// **Return Constraints:** Any output message returned by this /// hook MUST match the operation being invoked. Any error type can be @@ -478,10 +480,10 @@ pub trait Interceptor: fmt::Debug { fn modify_before_attempt_completion( &self, context: &mut FinalizerInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } @@ -490,14 +492,15 @@ pub trait Interceptor: fmt::Debug { /// **When:** This will **ALWAYS** be called once per attempt, as long as /// `before_attempt` has been executed. /// - /// **Available Information:** The [InterceptorContext::input()], - /// [InterceptorContext::request()] and - /// [InterceptorContext::output_or_error()] are **ALWAYS** available. - /// The [InterceptorContext::response()] is available if a - /// response was received by the service for this attempt. - /// In the event of retries, the `InterceptorContext` will not include - /// changes made in previous attempts (e.g. by request signers or other - /// interceptors). + /// **Available Information:** + /// The [`InterceptorContext::input`](context::InterceptorContext::input), + /// [`InterceptorContext::request`](context::InterceptorContext::request), + /// [`InterceptorContext::response`](context::InterceptorContext::response), or + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available. + /// If the operation succeeded, the `output` will be available. Otherwise, any of the other + /// pieces of information may be available depending on where in the operation lifecycle it failed. + /// In the event of retries, the `InterceptorContext` will not include changes made + /// in previous attempts (e.g. by request signers or other interceptors). /// /// **Error Behavior:** Errors raised by this hook will be stored /// until all interceptors have had their `after_attempt` invoked. @@ -506,14 +509,14 @@ pub trait Interceptor: fmt::Debug { /// retry strategy determines that the execution is retryable, /// execution will then jump to `before_attempt`. Otherwise, /// execution will jump to `modify_before_attempt_completion` with the - /// raised error as the [InterceptorContext::output_or_error()]. + /// raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). fn read_after_attempt( &self, context: &FinalizerInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } @@ -524,15 +527,19 @@ pub trait Interceptor: fmt::Debug { /// /// **When:** This will **ALWAYS** be called once per execution. /// - /// **Available Information:** The [InterceptorContext::input()] - /// and [InterceptorContext::output_or_error()] are **ALWAYS** available. The - /// [InterceptorContext::request()] - /// and [InterceptorContext::response()] are available if the - /// execution proceeded far enough for them to be generated. + /// **Available Information:** + /// The [`InterceptorContext::input`](context::InterceptorContext::input), + /// [`InterceptorContext::request`](context::InterceptorContext::request), + /// [`InterceptorContext::response`](context::InterceptorContext::response), or + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available. + /// If the operation succeeded, the `output` will be available. Otherwise, any of the other + /// pieces of information may be available depending on where in the operation lifecycle it failed. + /// In the event of retries, the `InterceptorContext` will not include changes made + /// in previous attempts (e.g. by request signers or other interceptors). /// /// **Error Behavior:** If errors are raised by this /// hook , execution will jump to `after_attempt` with - /// the raised error as the [InterceptorContext::output_or_error()]. + /// the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). /// /// **Return Constraints:** Any output message returned by this /// hook MUST match the operation being invoked. Any error type can be @@ -540,10 +547,10 @@ pub trait Interceptor: fmt::Debug { fn modify_before_completion( &self, context: &mut FinalizerInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } @@ -553,25 +560,29 @@ pub trait Interceptor: fmt::Debug { /// between invocation of this hook and `before_execution` is very /// close to the full duration of the execution. /// - /// **Available Information:** The [InterceptorContext::input()] - /// and [InterceptorContext::output_or_error()] are **ALWAYS** available. The - /// [InterceptorContext::request()] and - /// [InterceptorContext::response()] are available if the - /// execution proceeded far enough for them to be generated. + /// **Available Information:** + /// The [`InterceptorContext::input`](context::InterceptorContext::input), + /// [`InterceptorContext::request`](context::InterceptorContext::request), + /// [`InterceptorContext::response`](context::InterceptorContext::response), or + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available. + /// If the operation succeeded, the `output` will be available. Otherwise, any of the other + /// pieces of information may be available depending on where in the operation lifecycle it failed. + /// In the event of retries, the `InterceptorContext` will not include changes made + /// in previous attempts (e.g. by request signers or other interceptors). /// /// **Error Behavior:** Errors raised by this hook will be stored /// until all interceptors have had their `after_execution` invoked. /// The error will then be treated as the - /// [InterceptorContext::output_or_error()] to the customer. If multiple - /// `after_execution` methods raise errors , the latest will be + /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) + /// to the customer. If multiple `after_execution` methods raise errors , the latest will be /// used and earlier ones will be logged and dropped. fn read_after_execution( &self, context: &FinalizerInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { - let _ctx = context; - let _cfg = cfg; + let (_ctx, _rc, _cfg) = (context, runtime_components, cfg); Ok(()) } } @@ -579,7 +590,7 @@ pub trait Interceptor: fmt::Debug { /// Interceptor wrapper that may be shared #[derive(Clone)] pub struct SharedInterceptor { - interceptor: Arc, + interceptor: Arc, check_enabled: Arc bool + Send + Sync>, } @@ -592,8 +603,8 @@ impl fmt::Debug for SharedInterceptor { } impl SharedInterceptor { - /// Create a new `SharedInterceptor` from `Interceptor` - pub fn new(interceptor: T) -> Self { + /// Create a new `SharedInterceptor` from `Interceptor`. + pub fn new(interceptor: T) -> Self { Self { interceptor: Arc::new(interceptor), check_enabled: Arc::new(|conf: &ConfigBag| { @@ -602,394 +613,232 @@ impl SharedInterceptor { } } - fn enabled(&self, conf: &ConfigBag) -> bool { + /// Checks if this interceptor is enabled in the given config. + pub fn enabled(&self, conf: &ConfigBag) -> bool { (self.check_enabled)(conf) } } -/// A interceptor wrapper to conditionally enable the interceptor based on [`DisableInterceptor`] -struct ConditionallyEnabledInterceptor<'a>(&'a SharedInterceptor); -impl ConditionallyEnabledInterceptor<'_> { - fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Interceptor> { - if self.0.enabled(cfg) { - Some(self.0.as_ref()) - } else { - None - } - } -} +impl ValidateConfig for SharedInterceptor {} -impl AsRef for SharedInterceptor { - fn as_ref(&self) -> &(dyn Interceptor + 'static) { - self.interceptor.as_ref() +impl Intercept for SharedInterceptor { + fn name(&self) -> &'static str { + self.interceptor.name() } -} -impl Deref for SharedInterceptor { - type Target = Arc; - fn deref(&self) -> &Self::Target { - &self.interceptor + fn modify_before_attempt_completion( + &self, + context: &mut FinalizerInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_attempt_completion(context, runtime_components, cfg) } -} -impl Storable for SharedInterceptor { - type Storer = StoreAppend; -} - -/// Collection of [`SharedInterceptor`] that allows for only registration -#[derive(Debug, Clone, Default)] -pub struct InterceptorRegistrar { - interceptors: Vec, -} - -impl InterceptorRegistrar { - /// Register an interceptor with this `InterceptorRegistrar`. - /// - /// When this `InterceptorRegistrar` is passed to an orchestrator, the orchestrator will run the - /// registered interceptor for all the "hooks" that it implements. - pub fn register(&mut self, interceptor: SharedInterceptor) { - self.interceptors.push(interceptor); + fn modify_before_completion( + &self, + context: &mut FinalizerInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_completion(context, runtime_components, cfg) } -} -impl Extend for InterceptorRegistrar { - fn extend>(&mut self, iter: T) { - for interceptor in iter { - self.register(interceptor); - } + fn modify_before_deserialization( + &self, + context: &mut BeforeDeserializationInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_deserialization(context, runtime_components, cfg) } -} -#[derive(Debug, Clone, Default)] -pub struct Interceptors { - client_interceptors: InterceptorRegistrar, - operation_interceptors: InterceptorRegistrar, -} - -macro_rules! interceptor_impl_fn { - (mut $interceptor:ident) => { - pub fn $interceptor( - &self, - ctx: &mut InterceptorContext, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!(concat!( - "running `", - stringify!($interceptor), - "` interceptors" - )); - let mut result: Result<(), BoxError> = Ok(()); - let mut ctx = ctx.into(); - for interceptor in self.interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.$interceptor(&mut ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::$interceptor) - } - }; - (ref $interceptor:ident) => { - pub fn $interceptor( - &self, - ctx: &InterceptorContext, - cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - let mut result: Result<(), BoxError> = Ok(()); - let ctx = ctx.into(); - for interceptor in self.interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.$interceptor(&ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::$interceptor) - } - }; -} + fn modify_before_retry_loop( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_retry_loop(context, runtime_components, cfg) + } -/// Generalized interceptor disabling interface -/// -/// RuntimePlugins can disable interceptors by inserting [`DisableInterceptor`](DisableInterceptor) into the config bag -#[must_use] -#[derive(Debug)] -pub struct DisableInterceptor { - _t: PhantomData, - #[allow(unused)] - cause: &'static str, -} + fn modify_before_serialization( + &self, + context: &mut BeforeSerializationInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_serialization(context, runtime_components, cfg) + } -impl Storable for DisableInterceptor -where - T: fmt::Debug + Send + Sync + 'static, -{ - type Storer = StoreReplace; -} + fn modify_before_signing( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_signing(context, runtime_components, cfg) + } -/// Disable an interceptor with a given cause -pub fn disable_interceptor(cause: &'static str) -> DisableInterceptor { - DisableInterceptor { - _t: PhantomData::default(), - cause, + fn modify_before_transmit( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .modify_before_transmit(context, runtime_components, cfg) } -} -impl Interceptors { - pub fn new() -> Self { - Self::default() + fn read_after_attempt( + &self, + context: &FinalizerInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_attempt(context, runtime_components, cfg) } - fn interceptors(&self) -> impl Iterator> { - self.client_interceptors() - .chain(self.operation_interceptors()) + fn read_after_deserialization( + &self, + context: &AfterDeserializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_deserialization(context, runtime_components, cfg) } - fn client_interceptors(&self) -> impl Iterator> { - self.client_interceptors - .interceptors - .iter() - .map(ConditionallyEnabledInterceptor) + fn read_after_execution( + &self, + context: &FinalizerInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_execution(context, runtime_components, cfg) } - fn operation_interceptors(&self) -> impl Iterator> { - self.operation_interceptors - .interceptors - .iter() - .map(ConditionallyEnabledInterceptor) + fn read_after_serialization( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_serialization(context, runtime_components, cfg) } - pub fn client_interceptors_mut(&mut self) -> &mut InterceptorRegistrar { - &mut self.client_interceptors + fn read_after_signing( + &self, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_signing(context, runtime_components, cfg) } - pub fn operation_interceptors_mut(&mut self) -> &mut InterceptorRegistrar { - &mut self.operation_interceptors + fn read_after_transmit( + &self, + context: &BeforeDeserializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + self.interceptor + .read_after_transmit(context, runtime_components, cfg) } - pub fn client_read_before_execution( + fn read_before_attempt( &self, - ctx: &InterceptorContext, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `client_read_before_execution` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.client_interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::read_before_execution) + ) -> Result<(), BoxError> { + self.interceptor + .read_before_attempt(context, runtime_components, cfg) } - pub fn operation_read_before_execution( + fn read_before_deserialization( &self, - ctx: &InterceptorContext, + context: &BeforeDeserializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `operation_read_before_execution` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.operation_interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::read_before_execution) + ) -> Result<(), BoxError> { + self.interceptor + .read_before_deserialization(context, runtime_components, cfg) } - interceptor_impl_fn!(mut modify_before_serialization); - interceptor_impl_fn!(ref read_before_serialization); - interceptor_impl_fn!(ref read_after_serialization); - interceptor_impl_fn!(mut modify_before_retry_loop); - interceptor_impl_fn!(ref read_before_attempt); - interceptor_impl_fn!(mut modify_before_signing); - interceptor_impl_fn!(ref read_before_signing); - interceptor_impl_fn!(ref read_after_signing); - interceptor_impl_fn!(mut modify_before_transmit); - interceptor_impl_fn!(ref read_before_transmit); - interceptor_impl_fn!(ref read_after_transmit); - interceptor_impl_fn!(mut modify_before_deserialization); - interceptor_impl_fn!(ref read_before_deserialization); - interceptor_impl_fn!(ref read_after_deserialization); - - pub fn modify_before_attempt_completion( + fn read_before_execution( &self, - ctx: &mut InterceptorContext, + context: &BeforeSerializationInterceptorContextRef<'_>, cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `modify_before_attempt_completion` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); - for interceptor in self.interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.modify_before_attempt_completion(&mut ctx, cfg) - { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::modify_before_attempt_completion) + ) -> Result<(), BoxError> { + self.interceptor.read_before_execution(context, cfg) } - pub fn read_after_attempt( + fn read_before_serialization( &self, - ctx: &InterceptorContext, + context: &BeforeSerializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `read_after_attempt` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.read_after_attempt(&ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::read_after_attempt) + ) -> Result<(), BoxError> { + self.interceptor + .read_before_serialization(context, runtime_components, cfg) } - pub fn modify_before_completion( + fn read_before_signing( &self, - ctx: &mut InterceptorContext, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `modify_before_completion` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); - for interceptor in self.interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.modify_before_completion(&mut ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::modify_before_completion) + ) -> Result<(), BoxError> { + self.interceptor + .read_before_signing(context, runtime_components, cfg) } - pub fn read_after_execution( + fn read_before_transmit( &self, - ctx: &InterceptorContext, + context: &BeforeTransmitInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, - ) -> Result<(), InterceptorError> { - tracing::trace!("running `read_after_execution` interceptors"); - let mut result: Result<(), BoxError> = Ok(()); - let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); - for interceptor in self.interceptors() { - if let Some(interceptor) = interceptor.if_enabled(cfg) { - if let Err(new_error) = interceptor.read_after_execution(&ctx, cfg) { - if let Err(last_error) = result { - tracing::debug!("{}", DisplayErrorContext(&*last_error)); - } - result = Err(new_error); - } - } - } - result.map_err(InterceptorError::read_after_execution) + ) -> Result<(), BoxError> { + self.interceptor + .read_before_transmit(context, runtime_components, cfg) } } -#[cfg(test)] -mod tests { - use crate::client::interceptors::context::Input; - use crate::client::interceptors::{ - disable_interceptor, BeforeTransmitInterceptorContextRef, BoxError, Interceptor, - InterceptorContext, InterceptorRegistrar, Interceptors, SharedInterceptor, - }; - use aws_smithy_types::config_bag::ConfigBag; +impl_shared_conversions!(convert SharedInterceptor from Intercept using SharedInterceptor::new); - #[derive(Debug)] - struct TestInterceptor; - impl Interceptor for TestInterceptor {} - - #[test] - fn register_interceptor() { - let mut registrar = InterceptorRegistrar::default(); - registrar.register(SharedInterceptor::new(TestInterceptor)); - assert_eq!(1, registrar.interceptors.len()); - } +/// Generalized interceptor disabling interface +/// +/// RuntimePlugins can disable interceptors by inserting [`DisableInterceptor`](DisableInterceptor) into the config bag +#[must_use] +#[derive(Debug)] +pub struct DisableInterceptor { + _t: PhantomData, + #[allow(unused)] + cause: &'static str, +} - #[test] - fn bulk_register_interceptors() { - let mut registrar = InterceptorRegistrar::default(); - let number_of_interceptors = 3; - let interceptors = vec![SharedInterceptor::new(TestInterceptor); number_of_interceptors]; - registrar.extend(interceptors); - assert_eq!(number_of_interceptors, registrar.interceptors.len()); - } +impl Storable for DisableInterceptor +where + T: fmt::Debug + Send + Sync + 'static, +{ + type Storer = StoreReplace; +} - #[test] - fn test_disable_interceptors() { - #[derive(Debug)] - struct PanicInterceptor; - impl Interceptor for PanicInterceptor { - fn read_before_transmit( - &self, - _context: &BeforeTransmitInterceptorContextRef<'_>, - _cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - Err("boom".into()) - } - } - let mut interceptors = Interceptors::new(); - let interceptors_vec = vec![ - SharedInterceptor::new(PanicInterceptor), - SharedInterceptor::new(TestInterceptor), - ]; - interceptors - .client_interceptors_mut() - .extend(interceptors_vec); - let mut cfg = ConfigBag::base(); - assert_eq!( - interceptors - .interceptors() - .filter(|i| i.if_enabled(&cfg).is_some()) - .count(), - 2 - ); - interceptors - .read_before_transmit(&InterceptorContext::new(Input::new(5)), &mut cfg) - .expect_err("interceptor returns error"); - cfg.interceptor_state() - .store_put(disable_interceptor::("test")); - assert_eq!( - interceptors - .interceptors() - .filter(|i| i.if_enabled(&cfg).is_some()) - .count(), - 1 - ); - // shouldn't error because interceptors won't run - interceptors - .read_before_transmit(&InterceptorContext::new(Input::new(5)), &mut cfg) - .expect("interceptor is now disabled"); +/// Disable an interceptor with a given cause +pub fn disable_interceptor(cause: &'static str) -> DisableInterceptor { + DisableInterceptor { + _t: PhantomData::default(), + cause, } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs index a33b62db633..5d406bf846c 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs @@ -28,7 +28,7 @@ //! Use the [`ConfigBag`] instead. use crate::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError}; -use aws_smithy_http::result::SdkError; +use crate::client::result::SdkError; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError}; use phase::Phase; @@ -36,9 +36,66 @@ use std::fmt::Debug; use std::{fmt, mem}; use tracing::{debug, error, trace}; -pub type Input = TypeErasedBox; -pub type Output = TypeErasedBox; -pub type Error = TypeErasedError; +macro_rules! new_type_box { + ($name:ident, $doc:literal) => { + new_type_box!($name, TypeErasedBox, $doc, Send, Sync, fmt::Debug,); + }; + ($name:ident, $underlying:ident, $doc:literal, $($additional_bound:path,)*) => { + #[doc = $doc] + #[derive(Debug)] + pub struct $name($underlying); + + impl $name { + #[doc = concat!("Creates a new `", stringify!($name), "` with the provided concrete input value.")] + pub fn erase(input: T) -> Self { + Self($underlying::new(input)) + } + + #[doc = concat!("Downcasts to the concrete input value.")] + pub fn downcast_ref(&self) -> Option<&T> { + self.0.downcast_ref() + } + + #[doc = concat!("Downcasts to the concrete input value.")] + pub fn downcast_mut(&mut self) -> Option<&mut T> { + self.0.downcast_mut() + } + + #[doc = concat!("Downcasts to the concrete input value.")] + pub fn downcast(self) -> Result { + self.0.downcast::().map(|v| *v).map_err(Self) + } + + #[doc = concat!("Returns a `", stringify!($name), "` with a fake/test value with the expectation that it won't be downcast in the test.")] + #[cfg(feature = "test-util")] + pub fn doesnt_matter() -> Self { + Self($underlying::doesnt_matter()) + } + } + }; +} + +new_type_box!(Input, "Type-erased operation input."); +new_type_box!(Output, "Type-erased operation output."); +new_type_box!( + Error, + TypeErasedError, + "Type-erased operation error.", + std::error::Error, +); + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(&self.0, f) + } +} +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + self.0.source() + } +} + +/// Type-erased result for an operation. pub type OutputOrError = Result>; type Request = HttpRequest; @@ -88,107 +145,113 @@ impl InterceptorContext { } } -impl InterceptorContext { - /// Decomposes the context into its constituent parts. - #[doc(hidden)] - #[allow(clippy::type_complexity)] - pub fn into_parts( - self, - ) -> ( - Option, - Option>>, - Option, - Option, - ) { - ( - self.input, - self.output_or_error, - self.request, - self.response, - ) - } - - pub fn finalize(self) -> Result> { - let Self { - output_or_error, - response, - phase, - .. - } = self; - output_or_error - .expect("output_or_error must always be set before finalize is called.") - .map_err(|error| OrchestratorError::into_sdk_error(error, &phase, response)) - } - +impl InterceptorContext { /// Retrieve the input for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn input(&self) -> Option<&I> { self.input.as_ref() } /// Retrieve the input for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn input_mut(&mut self) -> Option<&mut I> { self.input.as_mut() } /// Takes ownership of the input. + /// + /// Note: This method is intended for internal use only. pub fn take_input(&mut self) -> Option { self.input.take() } /// Set the request for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn set_request(&mut self, request: Request) { self.request = Some(request); } /// Retrieve the transmittable request for the operation being invoked. /// This will only be available once request marshalling has completed. + /// + /// Note: This method is intended for internal use only. pub fn request(&self) -> Option<&Request> { self.request.as_ref() } /// Retrieve the transmittable request for the operation being invoked. /// This will only be available once request marshalling has completed. + /// + /// Note: This method is intended for internal use only. pub fn request_mut(&mut self) -> Option<&mut Request> { self.request.as_mut() } /// Takes ownership of the request. + /// + /// Note: This method is intended for internal use only. pub fn take_request(&mut self) -> Option { self.request.take() } /// Set the response for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn set_response(&mut self, response: Response) { self.response = Some(response); } /// Returns the response. + /// + /// Note: This method is intended for internal use only. pub fn response(&self) -> Option<&Response> { self.response.as_ref() } /// Returns a mutable reference to the response. + /// + /// Note: This method is intended for internal use only. pub fn response_mut(&mut self) -> Option<&mut Response> { self.response.as_mut() } /// Set the output or error for the operation being invoked. + /// + /// Note: This method is intended for internal use only. pub fn set_output_or_error(&mut self, output: Result>) { self.output_or_error = Some(output); } /// Returns the deserialized output or error. + /// + /// Note: This method is intended for internal use only. pub fn output_or_error(&self) -> Option>> { self.output_or_error.as_ref().map(Result::as_ref) } /// Returns the mutable reference to the deserialized output or error. + /// + /// Note: This method is intended for internal use only. pub fn output_or_error_mut(&mut self) -> Option<&mut Result>> { self.output_or_error.as_mut() } + /// Return `true` if this context's `output_or_error` is an error. Otherwise, return `false`. + /// + /// Note: This method is intended for internal use only. + pub fn is_failed(&self) -> bool { + self.output_or_error + .as_ref() + .map(Result::is_err) + .unwrap_or_default() + } + /// Advance to the Serialization phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_serialization_phase(&mut self) { debug!("entering \'serialization\' phase"); debug_assert!( @@ -199,7 +262,8 @@ impl InterceptorContext { } /// Advance to the BeforeTransmit phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_before_transmit_phase(&mut self) { debug!("entering \'before transmit\' phase"); debug_assert!( @@ -214,12 +278,13 @@ impl InterceptorContext { self.request.is_some(), "request must be set before calling enter_before_transmit_phase" ); - self.request_checkpoint = try_clone(self.request().expect("checked above")); + self.request_checkpoint = self.request().expect("checked above").try_clone(); self.phase = Phase::BeforeTransmit; } /// Advance to the Transmit phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_transmit_phase(&mut self) { debug!("entering \'transmit\' phase"); debug_assert!( @@ -230,7 +295,8 @@ impl InterceptorContext { } /// Advance to the BeforeDeserialization phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_before_deserialization_phase(&mut self) { debug!("entering \'before deserialization\' phase"); debug_assert!( @@ -249,7 +315,8 @@ impl InterceptorContext { } /// Advance to the Deserialization phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_deserialization_phase(&mut self) { debug!("entering \'deserialization\' phase"); debug_assert!( @@ -260,7 +327,8 @@ impl InterceptorContext { } /// Advance to the AfterDeserialization phase. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn enter_after_deserialization_phase(&mut self) { debug!("entering \'after deserialization\' phase"); debug_assert!( @@ -275,10 +343,11 @@ impl InterceptorContext { } /// Set the request checkpoint. This should only be called once, right before entering the retry loop. - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn save_checkpoint(&mut self) { trace!("saving request checkpoint..."); - self.request_checkpoint = self.request().and_then(try_clone); + self.request_checkpoint = self.request().and_then(|r| r.try_clone()); match self.request_checkpoint.as_ref() { Some(_) => trace!("successfully saved request checkpoint"), None => trace!("failed to save request checkpoint: request body could not be cloned"), @@ -286,36 +355,76 @@ impl InterceptorContext { } /// Returns false if rewinding isn't possible - #[doc(hidden)] + /// + /// Note: This method is intended for internal use only. pub fn rewind(&mut self, _cfg: &mut ConfigBag) -> RewindResult { // If request_checkpoint was never set, but we've already made one attempt, // then this is not a retryable request - if self.request_checkpoint.is_none() && self.tainted { - return RewindResult::Impossible; - } - - if !self.tainted { - // The first call to rewind() happens before the request is ever touched, so we don't need - // to clone it then. However, the request must be marked as tainted so that subsequent calls - // to rewind() properly reload the saved request checkpoint. - self.tainted = true; - return RewindResult::Unnecessary; - } + let request_checkpoint = match (self.request_checkpoint.as_ref(), self.tainted) { + (None, true) => return RewindResult::Impossible, + (_, false) => { + self.tainted = true; + return RewindResult::Unnecessary; + } + (Some(req), _) => req.try_clone(), + }; // Otherwise, rewind to the saved request checkpoint self.phase = Phase::BeforeTransmit; - self.request = try_clone(self.request_checkpoint.as_ref().expect("checked above")); + self.request = request_checkpoint; assert!( self.request.is_some(), - "if the request wasn't cloneable, then we should have already return from this method." + "if the request wasn't cloneable, then we should have already returned from this method." ); self.response = None; self.output_or_error = None; RewindResult::Occurred } +} + +impl InterceptorContext +where + E: Debug, +{ + /// Decomposes the context into its constituent parts. + /// + /// Note: This method is intended for internal use only. + #[allow(clippy::type_complexity)] + pub fn into_parts( + self, + ) -> ( + Option, + Option>>, + Option, + Option, + ) { + ( + self.input, + self.output_or_error, + self.request, + self.response, + ) + } + + /// Convert this context into the final operation result that is returned in client's the public API. + /// + /// Note: This method is intended for internal use only. + pub fn finalize(self) -> Result> { + let Self { + output_or_error, + response, + phase, + .. + } = self; + output_or_error + .expect("output_or_error must always be set before finalize is called.") + .map_err(|error| OrchestratorError::into_sdk_error(error, &phase, response)) + } /// Mark this context as failed due to errors during the operation. Any errors already contained /// by the context will be replaced by the given error. + /// + /// Note: This method is intended for internal use only. pub fn fail(&mut self, error: OrchestratorError) { if !self.is_failed() { trace!( @@ -327,19 +436,13 @@ impl InterceptorContext { error!("orchestrator context received an error but one was already present; Throwing away previous error: {:?}", existing_err); } } - - /// Return `true` if this context's `output_or_error` is an error. Otherwise, return `false`. - pub fn is_failed(&self) -> bool { - self.output_or_error - .as_ref() - .map(Result::is_err) - .unwrap_or_default() - } } /// The result of attempting to rewind a request. +/// +/// Note: This is intended for internal use only. +#[non_exhaustive] #[derive(Debug, PartialEq, Eq, Clone, Copy)] -#[doc(hidden)] pub enum RewindResult { /// The request couldn't be rewound because it wasn't cloneable. Impossible, @@ -364,47 +467,25 @@ impl fmt::Display for RewindResult { } } -fn try_clone(request: &HttpRequest) -> Option { - let cloned_body = request.body().try_clone()?; - let mut cloned_request = ::http::Request::builder() - .uri(request.uri().clone()) - .method(request.method()); - *cloned_request - .headers_mut() - .expect("builder has not been modified, headers must be valid") = request.headers().clone(); - Some( - cloned_request - .body(cloned_body) - .expect("a clone of a valid request should be a valid request"), - ) -} - -#[cfg(test)] +#[cfg(all(test, feature = "test-util", feature = "http-02x"))] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; - use aws_smithy_types::type_erasure::TypedBox; + use aws_smithy_types::body::SdkBody; use http::header::{AUTHORIZATION, CONTENT_LENGTH}; use http::{HeaderValue, Uri}; #[test] fn test_success_transitions() { - let input = TypedBox::new("input".to_string()).erase(); - let output = TypedBox::new("output".to_string()).erase(); + let input = Input::doesnt_matter(); + let output = Output::erase("output".to_string()); let mut context = InterceptorContext::new(input); - assert_eq!( - "input", - context - .input() - .and_then(|i| i.downcast_ref::()) - .unwrap() - ); + assert!(context.input().is_some()); context.input_mut(); context.enter_serialization_phase(); let _ = context.take_input(); - context.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + context.set_request(HttpRequest::empty()); context.enter_before_transmit_phase(); context.request(); @@ -412,7 +493,13 @@ mod tests { context.enter_transmit_phase(); let _ = context.take_request(); - context.set_response(http::Response::builder().body(SdkBody::empty()).unwrap()); + context.set_response( + http::Response::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(), + ); context.enter_before_deserialization_phase(); context.response(); @@ -435,29 +522,13 @@ mod tests { #[test] fn test_rewind_for_retry() { - use std::fmt; - #[derive(Debug)] - struct Error; - impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("don't care") - } - } - impl std::error::Error for Error {} - let mut cfg = ConfigBag::base(); - let input = TypedBox::new("input".to_string()).erase(); - let output = TypedBox::new("output".to_string()).erase(); - let error = TypedBox::new(Error).erase_error(); + let input = Input::doesnt_matter(); + let output = Output::erase("output".to_string()); + let error = Error::doesnt_matter(); let mut context = InterceptorContext::new(input); - assert_eq!( - "input", - context - .input() - .and_then(|i| i.downcast_ref::()) - .unwrap() - ); + assert!(context.input().is_some()); context.enter_serialization_phase(); let _ = context.take_input(); @@ -465,6 +536,8 @@ mod tests { http::Request::builder() .header("test", "the-original-un-mutated-request") .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap(), ); context.enter_before_transmit_phase(); @@ -483,7 +556,13 @@ mod tests { "request-modified-after-signing", request.headers().get("test").unwrap() ); - context.set_response(http::Response::builder().body(SdkBody::empty()).unwrap()); + context.set_response( + http::Response::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(), + ); context.enter_before_deserialization_phase(); context.enter_deserialization_phase(); @@ -499,7 +578,13 @@ mod tests { context.enter_transmit_phase(); let _ = context.take_request(); - context.set_response(http::Response::builder().body(SdkBody::empty()).unwrap()); + context.set_response( + http::Response::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(), + ); context.enter_before_deserialization_phase(); context.enter_deserialization_phase(); @@ -513,14 +598,16 @@ mod tests { #[test] fn try_clone_clones_all_data() { - let request = ::http::Request::builder() + let request: HttpRequest = http::Request::builder() .uri(Uri::from_static("https://www.amazon.com")) .method("POST") .header(CONTENT_LENGTH, 456) .header(AUTHORIZATION, "Token: hello") .body(SdkBody::from("hello world!")) - .expect("valid request"); - let cloned = try_clone(&request).expect("request is cloneable"); + .expect("valid request") + .try_into() + .unwrap(); + let cloned = request.try_clone().expect("request is cloneable"); assert_eq!(&Uri::from_static("https://www.amazon.com"), cloned.uri()); assert_eq!("POST", cloned.method()); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs index 7a79c134279..bead9491db0 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs @@ -8,250 +8,392 @@ use crate::client::interceptors::context::{Request, Response}; use crate::client::orchestrator::OrchestratorError; use std::fmt::Debug; -macro_rules! output { - (&Option>) => { - Option> - }; - (&Option<$ty:ty>) => { - Option<&$ty> - }; - (&mut Option<$ty:ty>) => { - Option<&mut $ty> - }; - (&Result<$o_ty:ty, $e_ty:ty>) => { - Result<&$o_ty, &$e_ty> - }; - (&$($tt:tt)+) => { - &$($tt)+ - }; - (&mut $($tt:tt)+) => { - &mut $($tt)+ - }; -} - -macro_rules! declare_method { - (&mut $name:ident, $inner_name:ident, $doc:literal, Option<$ty:ty>) => { - #[doc=$doc] - pub fn $name(&mut self) -> Option<&mut $ty> { - self.inner.$inner_name.as_ref() - } - }; - (&$name:ident, $inner_name:ident, $doc:literal, Option<$ty:ty>) => { - #[doc=$doc] - pub fn $name(&self) -> Option<$ty> { - self.inner.$inner_name.as_mut() - } - }; - (&mut $name:ident, $doc:literal, $($tt:tt)+) => { - #[doc=$doc] - pub fn $name(&mut self) -> output!(&mut $($tt)+) { - self.inner.$name().expect(concat!("`", stringify!($name), "` wasn't set in the underlying interceptor context. This is a bug.")) +macro_rules! impl_from_interceptor_context { + (ref $wrapper:ident) => { + impl<'a, I, O, E> From<&'a InterceptorContext> for $wrapper<'a, I, O, E> { + fn from(inner: &'a InterceptorContext) -> Self { + Self { inner } + } } }; - (&$name:ident, $doc:literal, $($tt:tt)+) => { - #[doc=$doc] - pub fn $name(&self) -> output!(&$($tt)+) { - self.inner.$name().expect(concat!("`", stringify!($name), "` wasn't set in the underlying interceptor context. This is a bug.")) + (mut $wrapper:ident) => { + impl<'a, I, O, E> From<&'a mut InterceptorContext> for $wrapper<'a, I, O, E> { + fn from(inner: &'a mut InterceptorContext) -> Self { + Self { inner } + } } }; } -macro_rules! declare_known_method { - (output_or_error: &mut $($tt:tt)+) => { - declare_method!(&mut output_or_error_mut, "Returns a mutable reference to the deserialized output or error.", $($tt)+); - }; - (output_or_error: &$($tt:tt)+) => { - declare_method!(&output_or_error, "Returns a reference to the deserialized output or error.", $($tt)+); - }; - (input: &mut $($tt:tt)+) => { - declare_method!(&mut input_mut, "Returns a mutable reference to the input.", $($tt)+); - }; - (input: &$($tt:tt)+) => { - declare_method!(&input, "Returns a reference to the input.", $($tt)+); - }; - (request: &mut $($tt:tt)+) => { - declare_method!(&mut request_mut, "Returns a mutable reference to the transmittable request for the operation being invoked.", $($tt)+); - }; - (request: &$($tt:tt)+) => { - declare_method!(&request, "Returns a reference to the transmittable request for the operation being invoked.", $($tt)+); - }; - (response: &mut $($tt:tt)+) => { - declare_method!(&mut response_mut, "Returns a mutable reference to the response.", $($tt)+); - }; - (response: &$($tt:tt)+) => { - declare_method!(&response, "Returns a reference to the response.", $($tt)+); +macro_rules! expect { + ($self:ident, $what:ident) => { + $self.inner.$what().expect(concat!( + "`", + stringify!($what), + "` wasn't set in the underlying interceptor context. This is a bug." + )) }; } -macro_rules! declare_wrapper { - (($ref_struct_name:ident readonly)$($tt:tt)+) => { - pub struct $ref_struct_name<'a, I = Input, O = Output, E = Error> { - inner: &'a InterceptorContext, - } +// +// BeforeSerializationInterceptorContextRef +// - impl<'a, I, O, E: Debug> From<&'a InterceptorContext> for $ref_struct_name<'a, I, O, E> - { - fn from(inner: &'a InterceptorContext) -> Self { - Self { inner } - } - } +/// Interceptor context for the `read_before_execution` and `read_before_serialization` hooks. +/// +/// Only the input is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeSerializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> { + inner: &'a InterceptorContext, +} - impl<'a, I, O, E: Debug> $ref_struct_name<'a, I, O, E> { - declare_ref_wrapper_methods!($($tt)+); - } - }; - (($ref_struct_name:ident $mut_struct_name:ident)$($tt:tt)+) => { - declare_wrapper!(($ref_struct_name readonly) $($tt)+); +impl_from_interceptor_context!(ref BeforeSerializationInterceptorContextRef); - pub struct $mut_struct_name<'a, I = Input, O = Output, E = Error> { - inner: &'a mut InterceptorContext, - } +impl<'a, I, O, E> BeforeSerializationInterceptorContextRef<'a, I, O, E> { + /// Returns a reference to the input. + pub fn input(&self) -> &I { + expect!(self, input) + } - impl<'a, I, O, E: Debug> From<&'a mut InterceptorContext> for $mut_struct_name<'a, I, O, E> - { - fn from(inner: &'a mut InterceptorContext) -> Self { - Self { inner } - } - } + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } +} - impl<'a, I, O, E: Debug> $mut_struct_name<'a, I, O, E> { - declare_ref_wrapper_methods!($($tt)+); - declare_mut_wrapper_methods!($($tt)+); - } - }; +// +// BeforeSerializationInterceptorContextMut +// + +/// Interceptor context for the `modify_before_serialization` hook. +/// +/// Only the input is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeSerializationInterceptorContextMut<'a, I = Input, O = Output, E = Error> { + inner: &'a mut InterceptorContext, } -macro_rules! declare_ref_wrapper_methods { - (($field:ident: $($head:tt)+)$($tail:tt)+) => { - declare_known_method!($field: &$($head)+); - declare_ref_wrapper_methods!($($tail)+); - }; - (($field:ident: $($tt:tt)+)) => { - declare_known_method!($field: &$($tt)+); - }; +impl_from_interceptor_context!(mut BeforeSerializationInterceptorContextMut); + +impl<'a, I, O, E> BeforeSerializationInterceptorContextMut<'a, I, O, E> { + /// Returns a reference to the input. + pub fn input(&self) -> &I { + expect!(self, input) + } + + /// Returns a mutable reference to the input. + pub fn input_mut(&mut self) -> &mut I { + expect!(self, input_mut) + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { + self.inner + } } -macro_rules! declare_mut_wrapper_methods { - (($field:ident: $($head:tt)+)$($tail:tt)+) => { - declare_known_method!($field: &mut $($head)+); - declare_mut_wrapper_methods!($($tail)+); - }; - (($field:ident: $($tt:tt)+)) => { - declare_known_method!($field: &mut $($tt)+); - }; +// +// BeforeSerializationInterceptorContextRef +// + +/// Interceptor context for several hooks in between serialization and transmission. +/// +/// Only the request is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeTransmitInterceptorContextRef<'a, I = Input, O = Output, E = Error> { + inner: &'a InterceptorContext, } -declare_wrapper!( - (BeforeSerializationInterceptorContextRef BeforeSerializationInterceptorContextMut) - (input: I) -); - -declare_wrapper!( - (BeforeTransmitInterceptorContextRef BeforeTransmitInterceptorContextMut) - (request: Request) -); - -declare_wrapper!( - (BeforeDeserializationInterceptorContextRef BeforeDeserializationInterceptorContextMut) - (input: I) - (request: Request) - (response: Response) -); - -impl<'a, I, O, E: Debug> BeforeDeserializationInterceptorContextMut<'a, I, O, E> { - #[doc(hidden)] - /// Downgrade this helper struct, returning the underlying InterceptorContext. There's no good - /// reason to use this unless you're writing tests or you have to interact with an API that - /// doesn't support the helper structs. - pub fn into_inner(&mut self) -> &'_ mut InterceptorContext { +impl_from_interceptor_context!(ref BeforeTransmitInterceptorContextRef); + +impl<'a, I, O, E> BeforeTransmitInterceptorContextRef<'a, I, O, E> { + /// Returns a reference to the transmittable request for the operation being invoked. + pub fn request(&self) -> &Request { + expect!(self, request) + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { self.inner } } -declare_wrapper!( - (AfterDeserializationInterceptorContextRef readonly) - (input: I) - (request: Request) - (response: Response) - (output_or_error: Result> -)); +// +// BeforeSerializationInterceptorContextMut +// -// Why are all the rest of these defined with a macro but these last two aren't? I simply ran out of -// time. Consider updating the macros to support these last two if you're looking for a challenge. -// - Zelda +/// Interceptor context for several hooks in between serialization and transmission. +/// +/// Only the request is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeTransmitInterceptorContextMut<'a, I = Input, O = Output, E = Error> { + inner: &'a mut InterceptorContext, +} -pub struct FinalizerInterceptorContextRef<'a, I = Input, O = Output, E = Error> { +impl_from_interceptor_context!(mut BeforeTransmitInterceptorContextMut); + +impl<'a, I, O, E> BeforeTransmitInterceptorContextMut<'a, I, O, E> { + /// Returns a reference to the transmittable request for the operation being invoked. + pub fn request(&self) -> &Request { + expect!(self, request) + } + + /// Returns a mutable reference to the transmittable request for the operation being invoked. + pub fn request_mut(&mut self) -> &mut Request { + expect!(self, request_mut) + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { + self.inner + } +} + +// +// BeforeDeserializationInterceptorContextRef +// + +/// Interceptor context for hooks before deserializing the response. +/// +/// Only the response is available at this point in the operation. +#[derive(Debug)] +pub struct BeforeDeserializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> { + inner: &'a InterceptorContext, +} + +impl_from_interceptor_context!(ref BeforeDeserializationInterceptorContextRef); + +impl<'a, I, O, E> BeforeDeserializationInterceptorContextRef<'a, I, O, E> { + /// Returns a reference to the response. + pub fn response(&self) -> &Response { + expect!(self, response) + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } +} + +// +// BeforeDeserializationInterceptorContextMut +// + +/// Interceptor context for hooks before deserializing the response. +/// +/// Only the response is available at this point in the operation. +pub struct BeforeDeserializationInterceptorContextMut<'a, I = Input, O = Output, E = Error> { + inner: &'a mut InterceptorContext, +} + +impl_from_interceptor_context!(mut BeforeDeserializationInterceptorContextMut); + +impl<'a, I, O, E> BeforeDeserializationInterceptorContextMut<'a, I, O, E> { + /// Returns a reference to the response. + pub fn response(&self) -> &Response { + expect!(self, response) + } + + /// Returns a mutable reference to the response. + pub fn response_mut(&mut self) -> &mut Response { + expect!(self, response_mut) + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { + self.inner + } +} + +// +// AfterDeserializationInterceptorContextRef +// + +/// Interceptor context for hooks after deserializing the response. +/// +/// The response and the deserialized output or error are available at this point in the operation. +pub struct AfterDeserializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> { inner: &'a InterceptorContext, } -impl<'a, I, O, E: Debug> From<&'a InterceptorContext> - for FinalizerInterceptorContextRef<'a, I, O, E> -{ - fn from(inner: &'a InterceptorContext) -> Self { - Self { inner } +impl_from_interceptor_context!(ref AfterDeserializationInterceptorContextRef); + +impl<'a, I, O, E> AfterDeserializationInterceptorContextRef<'a, I, O, E> { + /// Returns a reference to the response. + pub fn response(&self) -> &Response { + expect!(self, response) + } + + /// Returns a reference to the deserialized output or error. + pub fn output_or_error(&self) -> Result<&O, &OrchestratorError> { + expect!(self, output_or_error) + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner } } -impl<'a, I, O, E: Debug> FinalizerInterceptorContextRef<'a, I, O, E> { +// +// FinalizerInterceptorContextRef +// + +/// Interceptor context for finalization hooks. +/// +/// This context is used by the `read_after_attempt` and `read_after_execution` hooks +/// that are all called upon both success and failure, and may have varying levels +/// of context available depending on where a failure occurred if the operation failed. +pub struct FinalizerInterceptorContextRef<'a, I = Input, O = Output, E = Error> { + inner: &'a InterceptorContext, +} + +impl_from_interceptor_context!(ref FinalizerInterceptorContextRef); + +impl<'a, I, O, E> FinalizerInterceptorContextRef<'a, I, O, E> { + /// Returns the operation input. pub fn input(&self) -> Option<&I> { self.inner.input.as_ref() } + /// Returns the serialized request. pub fn request(&self) -> Option<&Request> { self.inner.request.as_ref() } + /// Returns the raw response. pub fn response(&self) -> Option<&Response> { self.inner.response.as_ref() } + /// Returns the deserialized operation output or error. pub fn output_or_error(&self) -> Option>> { self.inner.output_or_error.as_ref().map(|o| o.as_ref()) } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } } +// +// FinalizerInterceptorContextMut +// + +/// Interceptor context for finalization hooks. +/// +/// This context is used by the `modify_before_attempt_completion` and `modify_before_completion` hooks +/// that are all called upon both success and failure, and may have varying levels +/// of context available depending on where a failure occurred if the operation failed. pub struct FinalizerInterceptorContextMut<'a, I = Input, O = Output, E = Error> { inner: &'a mut InterceptorContext, } -impl<'a, I, O, E: Debug> From<&'a mut InterceptorContext> - for FinalizerInterceptorContextMut<'a, I, O, E> -{ - fn from(inner: &'a mut InterceptorContext) -> Self { - Self { inner } - } -} +impl_from_interceptor_context!(mut FinalizerInterceptorContextMut); -impl<'a, I, O, E: Debug> FinalizerInterceptorContextMut<'a, I, O, E> { +impl<'a, I, O, E> FinalizerInterceptorContextMut<'a, I, O, E> { + /// Returns the operation input. pub fn input(&self) -> Option<&I> { self.inner.input.as_ref() } + /// Returns the serialized request. pub fn request(&self) -> Option<&Request> { self.inner.request.as_ref() } + /// Returns the raw response. pub fn response(&self) -> Option<&Response> { self.inner.response.as_ref() } + /// Returns the deserialized operation output or error. pub fn output_or_error(&self) -> Option>> { self.inner.output_or_error.as_ref().map(|o| o.as_ref()) } + /// Mutably returns the operation input. pub fn input_mut(&mut self) -> Option<&mut I> { self.inner.input.as_mut() } + /// Mutably returns the serialized request. pub fn request_mut(&mut self) -> Option<&mut Request> { self.inner.request.as_mut() } + /// Mutably returns the raw response. pub fn response_mut(&mut self) -> Option<&mut Response> { self.inner.response.as_mut() } + /// Mutably returns the deserialized operation output or error. pub fn output_or_error_mut(&mut self) -> Option<&mut Result>> { self.inner.output_or_error.as_mut() } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner(&self) -> &'_ InterceptorContext { + self.inner + } + + /// Downgrade this wrapper struct, returning the underlying InterceptorContext. + /// + /// There's no good reason to use this unless you're writing tests or you have to + /// interact with an API that doesn't support the context wrapper structs. + pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext { + self.inner + } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs index f01dace42d9..cba0829791a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs @@ -12,10 +12,12 @@ macro_rules! interceptor_error_fn { ($fn_name:ident => $error_kind:ident (with source)) => { #[doc = concat!("Create a new error indicating a failure with a ", stringify!($fn_name), " interceptor.")] pub fn $fn_name( + interceptor_name: impl Into, source: impl Into>, ) -> Self { Self { kind: ErrorKind::$error_kind, + interceptor_name: Some(interceptor_name.into()), source: Some(source.into()), } } @@ -25,6 +27,7 @@ macro_rules! interceptor_error_fn { pub fn $fn_name() -> Self { Self { kind: ErrorKind::$error_kind, + interceptor_name: None, source: None, } } @@ -35,6 +38,7 @@ macro_rules! interceptor_error_fn { #[derive(Debug)] pub struct InterceptorError { kind: ErrorKind, + interceptor_name: Option, source: Option, } @@ -125,14 +129,15 @@ macro_rules! display_interceptor_err { { use ErrorKind::*; match &$self.kind { - $($error_kind => display_interceptor_err!($f, $fn_name, ($($option)+)),)+ + $($error_kind => display_interceptor_err!($self, $f, $fn_name, ($($option)+)),)+ } } }; - ($f:ident, $fn_name:ident, (interceptor error)) => { - $f.write_str(concat!(stringify!($fn_name), " interceptor encountered an error")) - }; - ($f:ident, $fn_name:ident, (invalid access $name:ident $message:literal)) => { + ($self:ident, $f:ident, $fn_name:ident, (interceptor error)) => {{ + $f.write_str($self.interceptor_name.as_deref().unwrap_or_default())?; + $f.write_str(concat!(" ", stringify!($fn_name), " interceptor encountered an error")) + }}; + ($self:ident, $f:ident, $fn_name:ident, (invalid access $name:ident $message:literal)) => { $f.write_str(concat!("tried to access the ", stringify!($name), " ", $message)) }; } @@ -181,6 +186,7 @@ pub struct ContextAttachedError { } impl ContextAttachedError { + /// Creates a new `ContextAttachedError` with the given `context` and `source`. pub fn new(context: impl Into, source: impl Into) -> Self { Self { context: context.into(), diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs index 9384509900f..873b8a1cc3b 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs @@ -3,158 +3,287 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Client request orchestration. +//! +//! The orchestrator handles the full request/response lifecycle including: +//! - Request serialization +//! - Endpoint resolution +//! - Identity resolution +//! - Signing +//! - Request transmission with retry and timeouts +//! - Response deserialization +//! +//! There are several hook points in the orchestration where [interceptors](crate::client::interceptors) +//! can read and modify the input, request, response, or output/error. + use crate::box_error::BoxError; -use crate::client::interceptors::context::{Error, Input, Output}; -use aws_smithy_async::future::now_or_later::NowOrLater; -use aws_smithy_http::body::SdkBody; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::endpoint::Endpoint; -use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; +use crate::client::interceptors::context::phase::Phase; +use crate::client::interceptors::context::Error; +use crate::client::interceptors::InterceptorError; +use crate::client::result::{ConnectorError, SdkError}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; use bytes::Bytes; +use std::error::Error as StdError; use std::fmt; -use std::future::Future as StdFuture; -use std::pin::Pin; -use std::sync::Arc; -/// Errors that can occur while running the orchestrator. -mod error; +/// Type alias for the HTTP request type that the orchestrator uses. +pub type HttpRequest = crate::http::Request; -pub use error::OrchestratorError; +/// Type alias for the HTTP response type that the orchestrator uses. +pub type HttpResponse = crate::http::Response; -pub type HttpRequest = http::Request; -pub type HttpResponse = http::Response; -pub type BoxFuture = Pin> + Send>>; -pub type Future = NowOrLater, BoxFuture>; +/// Informs the orchestrator on whether or not the request body needs to be loaded into memory before transmit. +/// +/// This enum gets placed into the `ConfigBag` to change the orchestrator behavior. +/// Immediately after serialization (before the `read_after_serialization` interceptor hook), +/// if it was set to `Requested` in the config bag, it will be replaced back into the config bag as +/// `Loaded` with the request body contents for use in later interceptors. +/// +/// This all happens before the attempt loop, so the loaded request body will remain available +/// for interceptors that run in any subsequent retry attempts. +#[non_exhaustive] +#[derive(Clone, Debug)] +pub enum LoadedRequestBody { + /// Don't attempt to load the request body into memory. + NotNeeded, + /// Attempt to load the request body into memory. + Requested, + /// The request body is already loaded. + Loaded(Bytes), +} -pub trait RequestSerializer: Send + Sync + fmt::Debug { - fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result; +impl Storable for LoadedRequestBody { + type Storer = StoreReplace; } -#[derive(Clone, Debug)] -pub struct SharedRequestSerializer(Arc); +/// Marker type stored in the config bag to indicate that a response body should be redacted. +#[derive(Debug)] +pub struct SensitiveOutput; -impl SharedRequestSerializer { - pub fn new(serializer: impl RequestSerializer + 'static) -> Self { - Self(Arc::new(serializer)) - } +impl Storable for SensitiveOutput { + type Storer = StoreReplace; } -impl RequestSerializer for SharedRequestSerializer { - fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result { - self.0.serialize_input(input, cfg) - } +#[derive(Debug)] +enum ErrorKind { + /// An error occurred within an interceptor. + Interceptor { source: InterceptorError }, + /// An error returned by a service. + Operation { err: E }, + /// An error that occurs when a request times out. + Timeout { source: BoxError }, + /// An error that occurs when request dispatch fails. + Connector { source: ConnectorError }, + /// An error that occurs when a response can't be deserialized. + Response { source: BoxError }, + /// A general orchestrator error. + Other { source: BoxError }, } -impl Storable for SharedRequestSerializer { - type Storer = StoreReplace; +/// Errors that can occur while running the orchestrator. +#[derive(Debug)] +pub struct OrchestratorError { + kind: ErrorKind, } -pub trait ResponseDeserializer: Send + Sync + fmt::Debug { - fn deserialize_streaming( - &self, - response: &mut HttpResponse, - ) -> Option>> { - let _ = response; - None +impl OrchestratorError { + /// Create a new `OrchestratorError` from the given source. + pub fn other(source: impl Into>) -> Self { + Self { + kind: ErrorKind::Other { + source: source.into(), + }, + } } - fn deserialize_nonstreaming( - &self, - response: &HttpResponse, - ) -> Result>; -} + /// Create an operation error. + pub fn operation(err: E) -> Self { + Self { + kind: ErrorKind::Operation { err }, + } + } -#[derive(Debug)] -pub struct DynResponseDeserializer(Box); + /// True if the underlying error is an operation error. + pub fn is_operation_error(&self) -> bool { + matches!(self.kind, ErrorKind::Operation { .. }) + } -impl DynResponseDeserializer { - pub fn new(serializer: impl ResponseDeserializer + 'static) -> Self { - Self(Box::new(serializer)) + /// Return this orchestrator error as an operation error if possible. + pub fn as_operation_error(&self) -> Option<&E> { + match &self.kind { + ErrorKind::Operation { err } => Some(err), + _ => None, + } } -} -impl ResponseDeserializer for DynResponseDeserializer { - fn deserialize_nonstreaming( - &self, - response: &HttpResponse, - ) -> Result> { - self.0.deserialize_nonstreaming(response) + /// Create an interceptor error with the given source. + pub fn interceptor(source: InterceptorError) -> Self { + Self { + kind: ErrorKind::Interceptor { source }, + } } - fn deserialize_streaming( - &self, - response: &mut HttpResponse, - ) -> Option>> { - self.0.deserialize_streaming(response) + /// True if the underlying error is an interceptor error. + pub fn is_interceptor_error(&self) -> bool { + matches!(self.kind, ErrorKind::Interceptor { .. }) } -} -impl Storable for DynResponseDeserializer { - type Storer = StoreReplace; -} + /// Create a timeout error with the given source. + pub fn timeout(source: BoxError) -> Self { + Self { + kind: ErrorKind::Timeout { source }, + } + } -#[derive(Debug)] -pub struct EndpointResolverParams(TypeErasedBox); + /// True if the underlying error is a timeout error. + pub fn is_timeout_error(&self) -> bool { + matches!(self.kind, ErrorKind::Timeout { .. }) + } -impl EndpointResolverParams { - pub fn new(params: T) -> Self { - Self(TypedBox::new(params).erase()) + /// Create a response error with the given source. + pub fn response(source: BoxError) -> Self { + Self { + kind: ErrorKind::Response { source }, + } } - pub fn get(&self) -> Option<&T> { - self.0.downcast_ref() + /// True if the underlying error is a response error. + pub fn is_response_error(&self) -> bool { + matches!(self.kind, ErrorKind::Response { .. }) } -} -impl Storable for EndpointResolverParams { - type Storer = StoreReplace; -} + /// Create a connector error with the given source. + pub fn connector(source: ConnectorError) -> Self { + Self { + kind: ErrorKind::Connector { source }, + } + } -pub trait EndpointResolver: Send + Sync + fmt::Debug { - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future; -} + /// True if the underlying error is a [`ConnectorError`]. + pub fn is_connector_error(&self) -> bool { + matches!(self.kind, ErrorKind::Connector { .. }) + } -#[derive(Debug)] -pub struct DynEndpointResolver(Box); + /// Return this orchestrator error as a connector error if possible. + pub fn as_connector_error(&self) -> Option<&ConnectorError> { + match &self.kind { + ErrorKind::Connector { source } => Some(source), + _ => None, + } + } + + /// Convert the `OrchestratorError` into an [`SdkError`]. + pub(crate) fn into_sdk_error( + self, + phase: &Phase, + response: Option, + ) -> SdkError { + match self.kind { + ErrorKind::Interceptor { source } => { + use Phase::*; + match phase { + BeforeSerialization | Serialization => SdkError::construction_failure(source), + BeforeTransmit | Transmit => match response { + Some(response) => SdkError::response_error(source, response), + None => { + SdkError::dispatch_failure(ConnectorError::other(source.into(), None)) + } + }, + BeforeDeserialization | Deserialization | AfterDeserialization => { + SdkError::response_error(source, response.expect("phase has a response")) + } + } + } + ErrorKind::Operation { err } => { + debug_assert!(phase.is_after_deserialization(), "operation errors are a result of successfully receiving and parsing a response from the server. Therefore, we must be in the 'After Deserialization' phase."); + SdkError::service_error(err, response.expect("phase has a response")) + } + ErrorKind::Connector { source } => SdkError::dispatch_failure(source), + ErrorKind::Timeout { source } => SdkError::timeout_error(source), + ErrorKind::Response { source } => SdkError::response_error(source, response.unwrap()), + ErrorKind::Other { source } => { + use Phase::*; + match phase { + BeforeSerialization | Serialization => SdkError::construction_failure(source), + BeforeTransmit | Transmit => convert_dispatch_error(source, response), + BeforeDeserialization | Deserialization | AfterDeserialization => { + SdkError::response_error(source, response.expect("phase has a response")) + } + } + } + } + } -impl DynEndpointResolver { - pub fn new(endpoint_resolver: impl EndpointResolver + 'static) -> Self { - Self(Box::new(endpoint_resolver)) + /// Maps the error type in `ErrorKind::Operation` + pub fn map_operation_error(self, map: impl FnOnce(E) -> E2) -> OrchestratorError { + let kind = match self.kind { + ErrorKind::Connector { source } => ErrorKind::Connector { source }, + ErrorKind::Operation { err } => ErrorKind::Operation { err: map(err) }, + ErrorKind::Interceptor { source } => ErrorKind::Interceptor { source }, + ErrorKind::Response { source } => ErrorKind::Response { source }, + ErrorKind::Timeout { source } => ErrorKind::Timeout { source }, + ErrorKind::Other { source } => ErrorKind::Other { source }, + }; + OrchestratorError { kind } } } -impl EndpointResolver for DynEndpointResolver { - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future { - self.0.resolve_endpoint(params) +impl StdError for OrchestratorError +where + E: StdError + 'static, +{ + fn source(&self) -> Option<&(dyn StdError + 'static)> { + Some(match &self.kind { + ErrorKind::Connector { source } => source as _, + ErrorKind::Operation { err } => err as _, + ErrorKind::Interceptor { source } => source as _, + ErrorKind::Response { source } => source.as_ref(), + ErrorKind::Timeout { source } => source.as_ref(), + ErrorKind::Other { source } => source.as_ref(), + }) } } -impl Storable for DynEndpointResolver { - type Storer = StoreReplace; +impl fmt::Display for OrchestratorError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self.kind { + ErrorKind::Connector { .. } => "connector error", + ErrorKind::Operation { .. } => "operation error", + ErrorKind::Interceptor { .. } => "interceptor error", + ErrorKind::Response { .. } => "response error", + ErrorKind::Timeout { .. } => "timeout", + ErrorKind::Other { .. } => "an unknown error occurred", + }) + } } -/// Informs the orchestrator on whether or not the request body needs to be loaded into memory before transmit. -/// -/// This enum gets placed into the `ConfigBag` to change the orchestrator behavior. -/// Immediately after serialization (before the `read_after_serialization` interceptor hook), -/// if it was set to `Requested` in the config bag, it will be replaced back into the config bag as -/// `Loaded` with the request body contents for use in later interceptors. -/// -/// This all happens before the attempt loop, so the loaded request body will remain available -/// for interceptors that run in any subsequent retry attempts. -#[non_exhaustive] -#[derive(Clone, Debug)] -pub enum LoadedRequestBody { - /// Don't attempt to load the request body into memory. - NotNeeded, - /// Attempt to load the request body into memory. - Requested, - /// The request body is already loaded. - Loaded(Bytes), +fn convert_dispatch_error( + err: BoxError, + response: Option, +) -> SdkError { + let err = match err.downcast::() { + Ok(connector_error) => { + return SdkError::dispatch_failure(*connector_error); + } + Err(e) => e, + }; + match response { + Some(response) => SdkError::response_error(err, response), + None => SdkError::dispatch_failure(ConnectorError::other(err, None)), + } } -impl Storable for LoadedRequestBody { - type Storer = StoreReplace; +impl From for OrchestratorError +where + E: fmt::Debug + std::error::Error + 'static, +{ + fn from(err: InterceptorError) -> Self { + Self::interceptor(err) + } } -pub(crate) const NOT_NEEDED: LoadedRequestBody = LoadedRequestBody::NotNeeded; +impl From for OrchestratorError { + fn from(err: Error) -> Self { + Self::operation(err) + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator/error.rs b/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator/error.rs deleted file mode 100644 index fa2aa7361ac..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/orchestrator/error.rs +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use super::BoxError; -use crate::client::interceptors::context::phase::Phase; -use crate::client::interceptors::InterceptorError; -use crate::client::orchestrator::HttpResponse; -use aws_smithy_http::result::{ConnectorError, SdkError}; -use aws_smithy_types::type_erasure::TypeErasedError; -use std::fmt::Debug; - -#[derive(Debug)] -#[non_exhaustive] -pub enum OrchestratorError { - /// An error occurred within an interceptor. - Interceptor { err: InterceptorError }, - /// An error returned by a service. - Operation { err: E }, - /// An error that occurs when a request times out. - Timeout { err: BoxError }, - /// An error that occurs when request dispatch fails. - Connector { err: ConnectorError }, - /// An error that occurs when a response can't be deserialized. - Response { err: BoxError }, - /// A general orchestrator error. - Other { err: BoxError }, -} - -impl OrchestratorError { - /// Create a new `OrchestratorError` from a [`BoxError`]. - pub fn other(err: impl Into>) -> Self { - let err = err.into(); - Self::Other { err } - } - - /// Create a new `OrchestratorError` from an error received from a service. - pub fn operation(err: E) -> Self { - Self::Operation { err } - } - - /// Create a new `OrchestratorError::Interceptor` from an [`InterceptorError`]. - pub fn interceptor(err: InterceptorError) -> Self { - Self::Interceptor { err } - } - - /// Create a new `OrchestratorError::Timeout` from a [`BoxError`]. - pub fn timeout(err: BoxError) -> Self { - Self::Timeout { err } - } - - /// Create a new `OrchestratorError::Response` from a [`BoxError`]. - pub fn response(err: BoxError) -> Self { - Self::Response { err } - } - - /// Create a new `OrchestratorError::Connector` from a [`ConnectorError`]. - pub fn connector(err: ConnectorError) -> Self { - Self::Connector { err } - } - - /// Convert the `OrchestratorError` into `Some` operation specific error if it is one. Otherwise, - /// return `None`. - pub fn as_operation_error(&self) -> Option<&E> { - match self { - Self::Operation { err } => Some(err), - _ => None, - } - } - - /// Convert the `OrchestratorError` into an [`SdkError`]. - pub(crate) fn into_sdk_error( - self, - phase: &Phase, - response: Option, - ) -> SdkError { - match self { - Self::Interceptor { err } => { - use Phase::*; - match phase { - BeforeSerialization | Serialization => SdkError::construction_failure(err), - BeforeTransmit | Transmit => match response { - Some(response) => SdkError::response_error(err, response), - None => SdkError::dispatch_failure(ConnectorError::other(err.into(), None)), - }, - BeforeDeserialization | Deserialization | AfterDeserialization => { - SdkError::response_error(err, response.expect("phase has a response")) - } - } - } - Self::Operation { err } => { - debug_assert!(phase.is_after_deserialization(), "operation errors are a result of successfully receiving and parsing a response from the server. Therefore, we must be in the 'After Deserialization' phase."); - SdkError::service_error(err, response.expect("phase has a response")) - } - Self::Connector { err } => SdkError::dispatch_failure(err), - Self::Timeout { err } => SdkError::timeout_error(err), - Self::Response { err } => SdkError::response_error(err, response.unwrap()), - Self::Other { err } => { - use Phase::*; - match phase { - BeforeSerialization | Serialization => SdkError::construction_failure(err), - BeforeTransmit | Transmit => convert_dispatch_error(err, response), - BeforeDeserialization | Deserialization | AfterDeserialization => { - SdkError::response_error(err, response.expect("phase has a response")) - } - } - } - } - } -} - -fn convert_dispatch_error( - err: BoxError, - response: Option, -) -> SdkError { - let err = match err.downcast::() { - Ok(connector_error) => { - return SdkError::dispatch_failure(*connector_error); - } - Err(e) => e, - }; - match response { - Some(response) => SdkError::response_error(err, response), - None => SdkError::dispatch_failure(ConnectorError::other(err, None)), - } -} - -impl From for OrchestratorError -where - E: Debug + std::error::Error + 'static, -{ - fn from(err: InterceptorError) -> Self { - Self::interceptor(err) - } -} - -impl From for OrchestratorError { - fn from(err: TypeErasedError) -> Self { - Self::operation(err) - } -} - -impl From for OrchestratorError -where - E: Debug + std::error::Error + 'static, -{ - fn from(err: aws_smithy_http::byte_stream::error::Error) -> Self { - Self::other(err) - } -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/request_attempts.rs b/rust-runtime/aws-smithy-runtime-api/src/client/request_attempts.rs deleted file mode 100644 index 440019c6603..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/client/request_attempts.rs +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_types::config_bag::{Storable, StoreReplace}; - -#[derive(Debug, Clone, Copy)] -pub struct RequestAttempts { - attempts: u32, -} - -impl RequestAttempts { - #[cfg(any(feature = "test-util", test))] - pub fn new(attempts: u32) -> Self { - Self { attempts } - } - - pub fn attempts(&self) -> u32 { - self.attempts - } -} - -impl From for RequestAttempts { - fn from(attempts: u32) -> Self { - Self { attempts } - } -} - -impl Storable for RequestAttempts { - type Storer = StoreReplace; -} diff --git a/rust-runtime/aws-smithy-http/src/result.rs b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs similarity index 87% rename from rust-runtime/aws-smithy-http/src/result.rs rename to rust-runtime/aws-smithy-runtime-api/src/client/result.rs index bd6d2f1f3b8..09797c21b9a 100644 --- a/rust-runtime/aws-smithy-http/src/result.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/result.rs @@ -3,31 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! `Result` wrapper types for [success](SdkSuccess) and [failure](SdkError) responses. - -use std::error::Error; -use std::fmt; -use std::fmt::{Debug, Display, Formatter}; +//! Types for [error](SdkError) responses. +use crate::client::connection::ConnectionMetadata; use aws_smithy_types::error::metadata::{ProvideErrorMetadata, EMPTY_ERROR_METADATA}; +use aws_smithy_types::error::operation::BuildError; use aws_smithy_types::error::ErrorMetadata; use aws_smithy_types::retry::ErrorKind; - -use crate::connection::ConnectionMetadata; -use crate::operation; +use std::error::Error; +use std::fmt; +use std::fmt::{Debug, Display, Formatter}; type BoxError = Box; -/// Successful SDK Result -#[derive(Debug)] -pub struct SdkSuccess { - /// Raw Response from the service. (e.g. Http Response) - pub raw: operation::Response, - - /// Parsed response from the service - pub parsed: O, -} - /// Builders for `SdkError` variant context. pub mod builders { use super::*; @@ -232,11 +220,16 @@ impl DispatchFailure { self.source.is_user() } - /// Returns the optional error kind associated with an unclassified error - pub fn is_other(&self) -> Option { + /// Returns true if the error is an unclassified error. + pub fn is_other(&self) -> bool { self.source.is_other() } + /// Returns the optional error kind associated with an unclassified error + pub fn as_other(&self) -> Option { + self.source.as_other() + } + /// Returns the inner error if it is a connector error pub fn as_connector_error(&self) -> Option<&ConnectorError> { Some(&self.source) @@ -324,7 +317,7 @@ pub trait CreateUnhandledError { /// [`Error::source`](std::error::Error::source) for more details about the underlying cause. #[non_exhaustive] #[derive(Debug)] -pub enum SdkError { +pub enum SdkError { /// The request failed during construction. It was not dispatched over the network. ConstructionFailure(ConstructionFailure), @@ -385,7 +378,7 @@ impl SdkError { /// follows: /// /// ```no_run - /// # use aws_smithy_http::result::{SdkError, CreateUnhandledError}; + /// # use aws_smithy_runtime_api::client::result::{SdkError, CreateUnhandledError}; /// # #[derive(Debug)] enum GetObjectError { NoSuchKey(()), Other(()) } /// # impl std::fmt::Display for GetObjectError { /// # fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { unimplemented!() } @@ -426,37 +419,37 @@ impl SdkError { where E: std::error::Error + Send + Sync + 'static, { - use SdkError::*; match self { - ConstructionFailure(context) => Ok(context.source), - TimeoutError(context) => Ok(context.source), - ResponseError(context) => Ok(context.source), - DispatchFailure(context) => Ok(context.source.into()), - ServiceError(context) => Ok(context.source.into()), + SdkError::ConstructionFailure(context) => Ok(context.source), + SdkError::TimeoutError(context) => Ok(context.source), + SdkError::ResponseError(context) => Ok(context.source), + SdkError::DispatchFailure(context) => Ok(context.source.into()), + SdkError::ServiceError(context) => Ok(context.source.into()), } } /// Return a reference to this error's raw response, if it contains one. Otherwise, return `None`. pub fn raw_response(&self) -> Option<&R> { match self { - Self::ServiceError(inner) => Some(inner.raw()), - Self::ResponseError(inner) => Some(inner.raw()), + SdkError::ServiceError(inner) => Some(inner.raw()), + SdkError::ResponseError(inner) => Some(inner.raw()), _ => None, } } /// Maps the service error type in `SdkError::ServiceError` - #[doc(hidden)] pub fn map_service_error(self, map: impl FnOnce(E) -> E2) -> SdkError { match self { - Self::ServiceError(context) => SdkError::::ServiceError(ServiceError { + SdkError::ServiceError(context) => SdkError::::ServiceError(ServiceError { source: map(context.source), raw: context.raw, }), - Self::ConstructionFailure(context) => SdkError::::ConstructionFailure(context), - Self::DispatchFailure(context) => SdkError::::DispatchFailure(context), - Self::ResponseError(context) => SdkError::::ResponseError(context), - Self::TimeoutError(context) => SdkError::::TimeoutError(context), + SdkError::ConstructionFailure(context) => { + SdkError::::ConstructionFailure(context) + } + SdkError::DispatchFailure(context) => SdkError::::DispatchFailure(context), + SdkError::ResponseError(context) => SdkError::::ResponseError(context), + SdkError::TimeoutError(context) => SdkError::::TimeoutError(context), } } } @@ -479,28 +472,33 @@ where R: Debug, { fn source(&self) -> Option<&(dyn Error + 'static)> { - use SdkError::*; match self { - ConstructionFailure(context) => Some(context.source.as_ref()), - TimeoutError(context) => Some(context.source.as_ref()), - ResponseError(context) => Some(context.source.as_ref()), - DispatchFailure(context) => Some(&context.source), - ServiceError(context) => Some(&context.source), + SdkError::ConstructionFailure(context) => Some(context.source.as_ref()), + SdkError::TimeoutError(context) => Some(context.source.as_ref()), + SdkError::ResponseError(context) => Some(context.source.as_ref()), + SdkError::DispatchFailure(context) => Some(&context.source), + SdkError::ServiceError(context) => Some(&context.source), } } } +impl From for SdkError { + fn from(value: BuildError) -> Self { + SdkError::ConstructionFailure(ConstructionFailure::builder().source(value).build()) + } +} + impl ProvideErrorMetadata for SdkError where E: ProvideErrorMetadata, { - fn meta(&self) -> &aws_smithy_types::Error { + fn meta(&self) -> &aws_smithy_types::error::ErrorMetadata { match self { - Self::ConstructionFailure(_) => &EMPTY_ERROR_METADATA, - Self::TimeoutError(_) => &EMPTY_ERROR_METADATA, - Self::DispatchFailure(_) => &EMPTY_ERROR_METADATA, - Self::ResponseError(_) => &EMPTY_ERROR_METADATA, - Self::ServiceError(err) => err.source.meta(), + SdkError::ConstructionFailure(_) => &EMPTY_ERROR_METADATA, + SdkError::TimeoutError(_) => &EMPTY_ERROR_METADATA, + SdkError::DispatchFailure(_) => &EMPTY_ERROR_METADATA, + SdkError::ResponseError(_) => &EMPTY_ERROR_METADATA, + SdkError::ServiceError(err) => err.source.meta(), } } } @@ -633,14 +631,24 @@ impl ConnectorError { matches!(self.kind, ConnectorErrorKind::User) } + /// Returns true if the error is an unclassified error. + pub fn is_other(&self) -> bool { + matches!(self.kind, ConnectorErrorKind::Other(..)) + } + /// Returns the optional error kind associated with an unclassified error - pub fn is_other(&self) -> Option { + pub fn as_other(&self) -> Option { match &self.kind { ConnectorErrorKind::Other(ek) => *ek, _ => None, } } + /// Grants ownership of this error's source. + pub fn into_source(self) -> BoxError { + self.source + } + /// Returns metadata about the connection /// /// If a connection was established and provided by the internal connector, a connection will diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs index 1e1ea497e3d..036371ddc18 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries.rs @@ -3,24 +3,41 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Retry handling and token bucket. +//! +//! This code defines when and how failed requests should be retried. It also defines the behavior +//! used to limit the rate that requests are sent. + +pub mod classifiers; + +use crate::box_error::BoxError; use crate::client::interceptors::context::InterceptorContext; +use crate::client::runtime_components::sealed::ValidateConfig; +use crate::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use std::fmt::Debug; +use std::fmt; +use std::sync::Arc; use std::time::Duration; -use tracing::trace; +use crate::impl_shared_conversions; pub use aws_smithy_types::retry::ErrorKind; +#[cfg(feature = "test-util")] +pub use test_util::AlwaysRetry; #[derive(Debug, Clone, PartialEq, Eq)] /// An answer to the question "should I make a request attempt?" pub enum ShouldAttempt { + /// Yes, an attempt should be made Yes, + /// No, no attempt should be made No, + /// Yes, an attempt should be made, but only after the given amount of time has passed YesAfterDelay(Duration), } #[cfg(feature = "test-util")] impl ShouldAttempt { + /// Returns the delay duration if this is a `YesAfterDelay` variant. pub fn expect_delay(self) -> Duration { match self { ShouldAttempt::YesAfterDelay(delay) => delay, @@ -29,128 +46,123 @@ impl ShouldAttempt { } } -pub trait RetryStrategy: Send + Sync + Debug { - fn should_attempt_initial_request(&self, cfg: &ConfigBag) -> Result; +impl_shared_conversions!(convert SharedRetryStrategy from RetryStrategy using SharedRetryStrategy::new); + +/// Decider for whether or not to attempt a request, and when. +/// +/// The orchestrator consults the retry strategy every time before making a request. +/// This includes the initial request, and any retry attempts thereafter. The +/// orchestrator will retry indefinitely (until success) if the retry strategy +/// always returns `ShouldAttempt::Yes` from `should_attempt_retry`. +pub trait RetryStrategy: Send + Sync + fmt::Debug { + /// Decides if the initial attempt should be made. + fn should_attempt_initial_request( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result; + /// Decides if a retry should be done. + /// + /// The previous attempt's output or error are provided in the + /// [`InterceptorContext`] when this is called. + /// + /// `ShouldAttempt::YesAfterDelay` can be used to add a backoff time. fn should_attempt_retry( &self, context: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result; } -#[derive(Debug)] -pub struct DynRetryStrategy(Box); +/// A shared retry strategy. +#[derive(Clone, Debug)] +pub struct SharedRetryStrategy(Arc); -impl DynRetryStrategy { +impl SharedRetryStrategy { + /// Creates a new [`SharedRetryStrategy`] from a retry strategy. pub fn new(retry_strategy: impl RetryStrategy + 'static) -> Self { - Self(Box::new(retry_strategy)) + Self(Arc::new(retry_strategy)) } } -impl RetryStrategy for DynRetryStrategy { - fn should_attempt_initial_request(&self, cfg: &ConfigBag) -> Result { - self.0.should_attempt_initial_request(cfg) +impl RetryStrategy for SharedRetryStrategy { + fn should_attempt_initial_request( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result { + self.0 + .should_attempt_initial_request(runtime_components, cfg) } fn should_attempt_retry( &self, context: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result { - self.0.should_attempt_retry(context, cfg) + self.0 + .should_attempt_retry(context, runtime_components, cfg) } } -impl Storable for DynRetryStrategy { - type Storer = StoreReplace; -} - -#[non_exhaustive] -#[derive(Clone, Eq, PartialEq, Debug)] -pub enum RetryReason { - Error(ErrorKind), - Explicit(Duration), -} - -/// Classifies what kind of retry is needed for a given an [`InterceptorContext`]. -pub trait ClassifyRetry: Send + Sync + Debug { - /// Run this classifier against an error to determine if it should be retried. Returns - /// `Some(RetryKind)` if the error should be retried; Otherwise returns `None`. - fn classify_retry(&self, ctx: &InterceptorContext) -> Option; - - /// The name that this classifier should report for debugging purposes. - fn name(&self) -> &'static str; -} +impl ValidateConfig for SharedRetryStrategy {} -#[derive(Debug)] -pub struct RetryClassifiers { - inner: Vec>, +/// A type to track the number of requests sent by the orchestrator for a given operation. +/// +/// `RequestAttempts` is added to the `ConfigBag` by the orchestrator, +/// and holds the current attempt number. +#[derive(Debug, Clone, Copy)] +pub struct RequestAttempts { + attempts: u32, } -impl RetryClassifiers { - pub fn new() -> Self { - Self { - // It's always expected that at least one classifier will be defined, - // so we eagerly allocate for it. - inner: Vec::with_capacity(1), - } +impl RequestAttempts { + /// Creates a new [`RequestAttempts`] with the given number of attempts. + pub fn new(attempts: u32) -> Self { + Self { attempts } } - pub fn with_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { - self.inner.push(Box::new(retry_classifier)); - - self + /// Returns the number of attempts. + pub fn attempts(&self) -> u32 { + self.attempts } - - // TODO(https://github.com/awslabs/smithy-rs/issues/2632) make a map function so users can front-run or second-guess the classifier's decision - // pub fn map_classifiers(mut self, fun: Fn() -> RetryClassifiers) } -impl Storable for RetryClassifiers { - type Storer = StoreReplace; +impl From for RequestAttempts { + fn from(attempts: u32) -> Self { + Self::new(attempts) + } } -impl ClassifyRetry for RetryClassifiers { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - // return the first non-None result - self.inner.iter().find_map(|cr| { - let maybe_reason = cr.classify_retry(ctx); - - match maybe_reason.as_ref() { - Some(reason) => trace!( - "\"{}\" classifier classified error as {:?}", - cr.name(), - reason - ), - None => trace!("\"{}\" classifier ignored the error", cr.name()), - }; - - maybe_reason - }) +impl From for u32 { + fn from(value: RequestAttempts) -> Self { + value.attempts() } +} - fn name(&self) -> &'static str { - "Collection of Classifiers" - } +impl Storable for RequestAttempts { + type Storer = StoreReplace; } #[cfg(feature = "test-util")] mod test_util { - use super::{ClassifyRetry, ErrorKind, RetryReason}; + use super::ErrorKind; use crate::client::interceptors::context::InterceptorContext; - use tracing::trace; + use crate::client::retries::classifiers::{ClassifyRetry, RetryAction}; /// A retry classifier for testing purposes. This classifier always returns - /// `Some(RetryReason::Error(ErrorKind))` where `ErrorKind` is the value provided when creating + /// `Some(RetryAction::Error(ErrorKind))` where `ErrorKind` is the value provided when creating /// this classifier. #[derive(Debug)] pub struct AlwaysRetry(pub ErrorKind); impl ClassifyRetry for AlwaysRetry { - fn classify_retry(&self, error: &InterceptorContext) -> Option { - trace!("Retrying error {:?} as an {:?}", error, self.0); - Some(RetryReason::Error(self.0)) + fn classify_retry(&self, error: &InterceptorContext) -> RetryAction { + tracing::debug!("Retrying error {:?} as an {:?}", error, self.0); + RetryAction::retryable_error(self.0) } fn name(&self) -> &'static str { @@ -158,7 +170,3 @@ mod test_util { } } } - -use crate::box_error::BoxError; -#[cfg(feature = "test-util")] -pub use test_util::AlwaysRetry; diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs b/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs new file mode 100644 index 00000000000..fc8544c7cb4 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs @@ -0,0 +1,270 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Classifier for determining if a retry is necessary and related code. + +use crate::client::interceptors::context::InterceptorContext; +use crate::client::runtime_components::sealed::ValidateConfig; +use crate::impl_shared_conversions; +use aws_smithy_types::retry::ErrorKind; +use std::fmt; +use std::sync::Arc; +use std::time::Duration; + +/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`]. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug, Default)] +pub enum RetryAction { + /// When a classifier can't run or has no opinion, this action is returned. + /// + /// For example, if a classifier requires a parsed response and response parsing failed, + /// this action is returned. If all classifiers return this action, no retry should be + /// attempted. + #[default] + NoActionIndicated, + /// When a classifier runs and thinks a response should be retried, this action is returned. + RetryIndicated(RetryReason), + /// When a classifier runs and decides a response must not be retried, this action is returned. + /// + /// This action stops retry classification immediately, skipping any following classifiers. + RetryForbidden, +} + +impl fmt::Display for RetryAction { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::NoActionIndicated => write!(f, "no action indicated"), + Self::RetryForbidden => write!(f, "retry forbidden"), + Self::RetryIndicated(reason) => write!(f, "retry {reason}"), + } + } +} + +impl RetryAction { + /// Create a new `RetryAction` indicating that a retry is necessary. + pub fn retryable_error(kind: ErrorKind) -> Self { + Self::RetryIndicated(RetryReason::RetryableError { + kind, + retry_after: None, + }) + } + + /// Create a new `RetryAction` indicating that a retry is necessary after an explicit delay. + pub fn retryable_error_with_explicit_delay(kind: ErrorKind, retry_after: Duration) -> Self { + Self::RetryIndicated(RetryReason::RetryableError { + kind, + retry_after: Some(retry_after), + }) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a transient error. + pub fn transient_error() -> Self { + Self::retryable_error(ErrorKind::TransientError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a throttling error. + pub fn throttling_error() -> Self { + Self::retryable_error(ErrorKind::ThrottlingError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a server error. + pub fn server_error() -> Self { + Self::retryable_error(ErrorKind::ServerError) + } + + /// Create a new `RetryAction` indicating that a retry is necessary because of a client error. + pub fn client_error() -> Self { + Self::retryable_error(ErrorKind::ClientError) + } +} + +/// The reason for a retry. +#[non_exhaustive] +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum RetryReason { + /// When an error is received that should be retried, this reason is returned. + RetryableError { + /// The kind of error. + kind: ErrorKind, + /// A server may tells us to retry only after a specific time has elapsed. + retry_after: Option, + }, +} + +impl fmt::Display for RetryReason { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::RetryableError { kind, retry_after } => { + let after = retry_after + .map(|d| format!(" after {d:?}")) + .unwrap_or_default(); + write!(f, "{kind} error{after}") + } + } + } +} + +/// The priority of a retry classifier. Classifiers with a higher priority will run before +/// classifiers with a lower priority. Classifiers with equal priorities make no guarantees +/// about which will run first. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct RetryClassifierPriority { + inner: Inner, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum Inner { + // The default priority for the `HttpStatusCodeClassifier`. + HttpStatusCodeClassifier, + // The default priority for the `ModeledAsRetryableClassifier`. + ModeledAsRetryableClassifier, + // The default priority for the `TransientErrorClassifier`. + TransientErrorClassifier, + // The priority of some other classifier. + Other(i8), +} + +impl PartialOrd for RetryClassifierPriority { + fn partial_cmp(&self, other: &Self) -> Option { + Some(other.as_i8().cmp(&self.as_i8())) + } +} + +impl Ord for RetryClassifierPriority { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + other.as_i8().cmp(&self.as_i8()) + } +} + +impl RetryClassifierPriority { + /// Create a new `RetryClassifierPriority` with the default priority for the `HttpStatusCodeClassifier`. + pub fn http_status_code_classifier() -> Self { + Self { + inner: Inner::HttpStatusCodeClassifier, + } + } + + /// Create a new `RetryClassifierPriority` with the default priority for the `ModeledAsRetryableClassifier`. + pub fn modeled_as_retryable_classifier() -> Self { + Self { + inner: Inner::ModeledAsRetryableClassifier, + } + } + + /// Create a new `RetryClassifierPriority` with the default priority for the `TransientErrorClassifier`. + pub fn transient_error_classifier() -> Self { + Self { + inner: Inner::TransientErrorClassifier, + } + } + + /// Create a new `RetryClassifierPriority` with lower priority than the given priority. + pub fn with_lower_priority_than(other: Self) -> Self { + Self { + inner: Inner::Other(other.as_i8() + 1), + } + } + + /// Create a new `RetryClassifierPriority` with higher priority than the given priority. + pub fn with_higher_priority_than(other: Self) -> Self { + Self { + inner: Inner::Other(other.as_i8() - 1), + } + } + + fn as_i8(&self) -> i8 { + match self.inner { + Inner::HttpStatusCodeClassifier => 0, + Inner::ModeledAsRetryableClassifier => 10, + Inner::TransientErrorClassifier => 20, + Inner::Other(i) => i, + } + } +} + +impl Default for RetryClassifierPriority { + fn default() -> Self { + Self { + inner: Inner::Other(0), + } + } +} + +/// Classifies what kind of retry is needed for a given [`InterceptorContext`]. +pub trait ClassifyRetry: Send + Sync + fmt::Debug { + /// Run this classifier on the [`InterceptorContext`] to determine if the previous request + /// should be retried. Returns a [`RetryAction`]. + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction; + + /// The name of this retry classifier. + /// + /// Used for debugging purposes. + fn name(&self) -> &'static str; + + /// The priority of this retry classifier. Classifiers with a higher priority will override the + /// results of classifiers with a lower priority. Classifiers with equal priorities make no + /// guarantees about which will override the other. + fn priority(&self) -> RetryClassifierPriority { + RetryClassifierPriority::default() + } +} + +impl_shared_conversions!(convert SharedRetryClassifier from ClassifyRetry using SharedRetryClassifier::new); + +#[derive(Debug, Clone)] +/// Retry classifier used by the retry strategy to classify responses as retryable or not. +pub struct SharedRetryClassifier(Arc); + +impl SharedRetryClassifier { + /// Given a [`ClassifyRetry`] trait object, create a new `SharedRetryClassifier`. + pub fn new(retry_classifier: impl ClassifyRetry + 'static) -> Self { + Self(Arc::new(retry_classifier)) + } +} + +impl ClassifyRetry for SharedRetryClassifier { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + self.0.classify_retry(ctx) + } + + fn name(&self) -> &'static str { + self.0.name() + } + + fn priority(&self) -> RetryClassifierPriority { + self.0.priority() + } +} + +impl ValidateConfig for SharedRetryClassifier {} + +#[cfg(test)] +mod tests { + use super::RetryClassifierPriority; + + #[test] + fn test_classifier_lower_priority_than() { + let classifier_a = RetryClassifierPriority::default(); + let classifier_b = RetryClassifierPriority::with_lower_priority_than(classifier_a); + let classifier_c = RetryClassifierPriority::with_lower_priority_than(classifier_b); + + let mut list = vec![classifier_b, classifier_a, classifier_c]; + list.sort(); + + assert_eq!(vec![classifier_c, classifier_b, classifier_a], list); + } + + #[test] + fn test_classifier_higher_priority_than() { + let classifier_c = RetryClassifierPriority::default(); + let classifier_b = RetryClassifierPriority::with_higher_priority_than(classifier_c); + let classifier_a = RetryClassifierPriority::with_higher_priority_than(classifier_b); + + let mut list = vec![classifier_b, classifier_c, classifier_a]; + list.sort(); + + assert_eq!(vec![classifier_c, classifier_b, classifier_a], list); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs new file mode 100644 index 00000000000..a6b2744bc5e --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs @@ -0,0 +1,1210 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Runtime components used to make a request and handle a response. +//! +//! Runtime components are trait implementations that are _always_ used by the orchestrator. +//! There are other trait implementations that can be configured for a client, but if they +//! aren't directly and always used by the orchestrator, then they are placed in the +//! [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) instead of in +//! [`RuntimeComponents`](RuntimeComponents). + +use crate::box_error::BoxError; +use crate::client::auth::{ + AuthScheme, AuthSchemeId, ResolveAuthSchemeOptions, SharedAuthScheme, + SharedAuthSchemeOptionResolver, +}; +use crate::client::endpoint::{ResolveEndpoint, SharedEndpointResolver}; +use crate::client::http::{HttpClient, SharedHttpClient}; +use crate::client::identity::{ + ConfiguredIdentityResolver, ResolveCachedIdentity, ResolveIdentity, SharedIdentityCache, + SharedIdentityResolver, +}; +use crate::client::interceptors::{Intercept, SharedInterceptor}; +use crate::client::retries::classifiers::{ClassifyRetry, SharedRetryClassifier}; +use crate::client::retries::{RetryStrategy, SharedRetryStrategy}; +use crate::impl_shared_conversions; +use crate::shared::IntoShared; +use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; +use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_types::config_bag::ConfigBag; +use std::fmt; +use std::sync::Arc; + +pub(crate) static EMPTY_RUNTIME_COMPONENTS_BUILDER: RuntimeComponentsBuilder = + RuntimeComponentsBuilder::new("empty"); + +pub(crate) mod sealed { + use super::*; + + /// Validates client configuration. + /// + /// This trait can be used to validate that certain required components or config values + /// are available, and provide an error with helpful instructions if they are not. + pub trait ValidateConfig: fmt::Debug + Send + Sync { + #[doc = include_str!("../../rustdoc/validate_base_client_config.md")] + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } + + #[doc = include_str!("../../rustdoc/validate_final_config.md")] + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + let _ = (runtime_components, cfg); + Ok(()) + } + } +} +use sealed::ValidateConfig; + +#[derive(Clone)] +enum ValidatorInner { + BaseConfigStaticFn(fn(&RuntimeComponentsBuilder, &ConfigBag) -> Result<(), BoxError>), + Shared(Arc), +} + +impl fmt::Debug for ValidatorInner { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::BaseConfigStaticFn(_) => f.debug_tuple("StaticFn").finish(), + Self::Shared(_) => f.debug_tuple("Shared").finish(), + } + } +} + +/// A client config validator. +#[derive(Clone, Debug)] +pub struct SharedConfigValidator { + inner: ValidatorInner, +} + +impl SharedConfigValidator { + /// Creates a new shared config validator. + pub(crate) fn new(validator: impl ValidateConfig + 'static) -> Self { + Self { + inner: ValidatorInner::Shared(Arc::new(validator) as _), + } + } + + /// Creates a base client validator from a function. + /// + /// A base client validator gets called upon client construction. The full + /// config may not be available at this time (hence why it has + /// [`RuntimeComponentsBuilder`] as an argument rather than [`RuntimeComponents`]). + /// Any error returned from the validator function will become a panic in the + /// client constructor. + /// + /// # Examples + /// + /// Creating a validator function: + /// ```no_run + /// use aws_smithy_runtime_api::box_error::BoxError; + /// use aws_smithy_runtime_api::client::runtime_components::{ + /// RuntimeComponentsBuilder, + /// SharedConfigValidator + /// }; + /// use aws_smithy_types::config_bag::ConfigBag; + /// + /// fn my_validation( + /// components: &RuntimeComponentsBuilder, + /// config: &ConfigBag + /// ) -> Result<(), BoxError> { + /// if components.sleep_impl().is_none() { + /// return Err("I need a sleep_impl!".into()); + /// } + /// Ok(()) + /// } + /// + /// let validator = SharedConfigValidator::base_client_config_fn(my_validation); + /// ``` + pub fn base_client_config_fn( + validator: fn(&RuntimeComponentsBuilder, &ConfigBag) -> Result<(), BoxError>, + ) -> Self { + Self { + inner: ValidatorInner::BaseConfigStaticFn(validator), + } + } +} + +impl ValidateConfig for SharedConfigValidator { + fn validate_base_client_config( + &self, + runtime_components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + match &self.inner { + ValidatorInner::BaseConfigStaticFn(validator) => (validator)(runtime_components, cfg), + ValidatorInner::Shared(validator) => { + validator.validate_base_client_config(runtime_components, cfg) + } + } + } + + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result<(), BoxError> { + match &self.inner { + ValidatorInner::Shared(validator) => { + validator.validate_final_config(runtime_components, cfg) + } + _ => Ok(()), + } + } +} + +impl_shared_conversions!(convert SharedConfigValidator from ValidateConfig using SharedConfigValidator::new); + +/// Internal to `declare_runtime_components!`. +/// +/// Merges a field from one builder into another. +macro_rules! merge { + (Option $other:ident . $name:ident => $self:ident) => { + $self.$name = $other.$name.clone().or($self.$name.take()); + }; + (Vec $other:ident . $name:ident => $self:ident) => { + if !$other.$name.is_empty() { + $self.$name.extend($other.$name.iter().cloned()); + } + }; +} +/// Internal to `declare_runtime_components!`. +/// +/// This is used when creating the builder's `build` method +/// to populate each individual field value. The `required`/`atLeastOneRequired` +/// validations are performed here. +macro_rules! builder_field_value { + (Option $self:ident . $name:ident) => { + $self.$name + }; + (Option $self:ident . $name:ident required) => { + $self.$name.ok_or(BuildError(concat!( + "the `", + stringify!($name), + "` runtime component is required" + )))? + }; + (Vec $self:ident . $name:ident) => { + $self.$name + }; + (Vec $self:ident . $name:ident atLeastOneRequired) => {{ + if $self.$name.is_empty() { + return Err(BuildError(concat!( + "at least one `", + stringify!($name), + "` runtime component is required" + ))); + } + $self.$name + }}; +} +/// Internal to `declare_runtime_components!`. +/// +/// Converts the field type from `Option` or `Vec` into `Option>` or `Vec>` respectively. +/// Also removes the `Option` wrapper for required fields in the non-builder struct. +macro_rules! runtime_component_field_type { + (Option $inner_type:ident) => { + Option> + }; + (Option $inner_type:ident required) => { + Tracked<$inner_type> + }; + (Vec $inner_type:ident) => { + Vec> + }; + (Vec $inner_type:ident atLeastOneRequired) => { + Vec> + }; +} +/// Internal to `declare_runtime_components!`. +/// +/// Converts an `$outer_type` into an empty instantiation for that type. +/// This is needed since `Default::default()` can't be used in a `const` function, +/// and `RuntimeComponentsBuilder::new()` is `const`. +macro_rules! empty_builder_value { + (Option) => { + None + }; + (Vec) => { + Vec::new() + }; +} + +/// Macro to define the structs for both `RuntimeComponents` and `RuntimeComponentsBuilder`. +/// +/// This is a macro in order to keep the fields consistent between the two, and to automatically +/// update the `merge_from` and `build` methods when new components are added. +/// +/// It also facilitates unit testing since the overall mechanism can be unit tested with different +/// fields that are easy to check in tests (testing with real components makes it hard +/// to tell that the correct component was selected when merging builders). +/// +/// # Example usage +/// +/// The two identifiers after "fields for" become the names of the struct and builder respectively. +/// Following that, all the fields are specified. Fields MUST be wrapped in `Option` or `Vec`. +/// To make a field required in the non-builder struct, add `#[required]` for `Option` fields, or +/// `#[atLeastOneRequired]` for `Vec` fields. +/// +/// ```no_compile +/// declare_runtime_components! { +/// fields for TestRc and TestRcBuilder { +/// some_optional_string: Option, +/// +/// some_optional_vec: Vec, +/// +/// #[required] +/// some_required_string: Option, +/// +/// #[atLeastOneRequired] +/// some_required_vec: Vec, +/// } +/// } +/// ``` +macro_rules! declare_runtime_components { + (fields for $rc_name:ident and $builder_name:ident { + $($(#[$option:ident])? $field_name:ident : $outer_type:ident<$inner_type:ident> ,)+ + }) => { + /// Components that can only be set in runtime plugins that the orchestrator uses directly to call an operation. + #[derive(Clone, Debug)] + pub struct $rc_name { + $($field_name: runtime_component_field_type!($outer_type $inner_type $($option)?),)+ + } + + /// Builder for [`RuntimeComponents`]. + #[derive(Clone, Debug)] + pub struct $builder_name { + builder_name: &'static str, + $($field_name: $outer_type>,)+ + } + impl $builder_name { + /// Creates a new builder. + /// + /// Since multiple builders are merged together to make the final [`RuntimeComponents`], + /// all components added by this builder are associated with the given `name` so that + /// the origin of a component can be easily found when debugging. + pub const fn new(name: &'static str) -> Self { + Self { + builder_name: name, + $($field_name: empty_builder_value!($outer_type),)+ + } + } + + /// Merge in components from another builder. + pub fn merge_from(mut self, other: &Self) -> Self { + $(merge!($outer_type other.$field_name => self);)+ + self + } + + /// Builds [`RuntimeComponents`] from this builder. + pub fn build(self) -> Result<$rc_name, BuildError> { + Ok($rc_name { + $($field_name: builder_field_value!($outer_type self.$field_name $($option)?),)+ + }) + } + } + }; +} + +declare_runtime_components! { + fields for RuntimeComponents and RuntimeComponentsBuilder { + #[required] + auth_scheme_option_resolver: Option, + + // A connector is not required since a client could technically only be used for presigning + http_client: Option, + + #[required] + endpoint_resolver: Option, + + #[atLeastOneRequired] + auth_schemes: Vec, + + #[required] + identity_cache: Option, + + #[atLeastOneRequired] + identity_resolvers: Vec, + + interceptors: Vec, + + retry_classifiers: Vec, + + #[required] + retry_strategy: Option, + + time_source: Option, + + sleep_impl: Option, + + config_validators: Vec, + } +} + +impl RuntimeComponents { + /// Returns a builder for runtime components. + pub fn builder(name: &'static str) -> RuntimeComponentsBuilder { + RuntimeComponentsBuilder::new(name) + } + + /// Returns the auth scheme option resolver. + pub fn auth_scheme_option_resolver(&self) -> SharedAuthSchemeOptionResolver { + self.auth_scheme_option_resolver.value.clone() + } + + /// Returns the HTTP client. + pub fn http_client(&self) -> Option { + self.http_client.as_ref().map(|s| s.value.clone()) + } + + /// Returns the endpoint resolver. + pub fn endpoint_resolver(&self) -> SharedEndpointResolver { + self.endpoint_resolver.value.clone() + } + + /// Returns the requested auth scheme if it is set. + pub fn auth_scheme(&self, scheme_id: AuthSchemeId) -> Option { + self.auth_schemes + .iter() + .find(|s| s.value.scheme_id() == scheme_id) + .map(|s| s.value.clone()) + } + + /// Returns the identity cache. + pub fn identity_cache(&self) -> SharedIdentityCache { + self.identity_cache.value.clone() + } + + /// Returns an iterator over the interceptors. + pub fn interceptors(&self) -> impl Iterator + '_ { + self.interceptors.iter().map(|s| s.value.clone()) + } + + /// Returns an iterator over the retry classifiers. + pub fn retry_classifiers(&self) -> impl Iterator + '_ { + self.retry_classifiers.iter().map(|s| s.value.clone()) + } + + /// Returns the retry strategy. + pub fn retry_strategy(&self) -> SharedRetryStrategy { + self.retry_strategy.value.clone() + } + + /// Returns the async sleep implementation. + pub fn sleep_impl(&self) -> Option { + self.sleep_impl.as_ref().map(|s| s.value.clone()) + } + + /// Returns the time source. + pub fn time_source(&self) -> Option { + self.time_source.as_ref().map(|s| s.value.clone()) + } + + /// Returns the config validators. + pub fn config_validators(&self) -> impl Iterator + '_ { + self.config_validators.iter().map(|s| s.value.clone()) + } + + /// Validate the final client configuration. + /// + /// This is intended to be called internally by the client. + pub fn validate_final_config(&self, cfg: &ConfigBag) -> Result<(), BoxError> { + macro_rules! validate { + (Required: $field:expr) => { + ValidateConfig::validate_final_config(&$field.value, self, cfg)?; + }; + (Option: $field:expr) => { + if let Some(field) = $field.as_ref() { + ValidateConfig::validate_final_config(&field.value, self, cfg)?; + } + }; + (Vec: $field:expr) => { + for entry in &$field { + ValidateConfig::validate_final_config(&entry.value, self, cfg)?; + } + }; + } + + tracing::trace!(runtime_components=?self, cfg=?cfg, "validating final config"); + for validator in self.config_validators() { + validator.validate_final_config(self, cfg)?; + } + validate!(Option: self.http_client); + validate!(Required: self.endpoint_resolver); + validate!(Vec: self.auth_schemes); + validate!(Required: self.identity_cache); + validate!(Vec: self.identity_resolvers); + validate!(Vec: self.interceptors); + validate!(Required: self.retry_strategy); + Ok(()) + } +} + +impl RuntimeComponentsBuilder { + /// Returns the auth scheme option resolver. + pub fn auth_scheme_option_resolver(&self) -> Option { + self.auth_scheme_option_resolver + .as_ref() + .map(|s| s.value.clone()) + } + + /// Sets the auth scheme option resolver. + pub fn set_auth_scheme_option_resolver( + &mut self, + auth_scheme_option_resolver: Option, + ) -> &mut Self { + self.auth_scheme_option_resolver = + self.tracked(auth_scheme_option_resolver.map(IntoShared::into_shared)); + self + } + + /// Sets the auth scheme option resolver. + pub fn with_auth_scheme_option_resolver( + mut self, + auth_scheme_option_resolver: Option, + ) -> Self { + self.set_auth_scheme_option_resolver(auth_scheme_option_resolver); + self + } + + /// Returns the HTTP client. + pub fn http_client(&self) -> Option { + self.http_client.as_ref().map(|s| s.value.clone()) + } + + /// Sets the HTTP client. + pub fn set_http_client(&mut self, connector: Option) -> &mut Self { + self.http_client = self.tracked(connector.map(IntoShared::into_shared)); + self + } + + /// Sets the HTTP client. + pub fn with_http_client(mut self, connector: Option) -> Self { + self.set_http_client(connector); + self + } + + /// Returns the endpoint resolver. + pub fn endpoint_resolver(&self) -> Option { + self.endpoint_resolver.as_ref().map(|s| s.value.clone()) + } + + /// Sets the endpoint resolver. + pub fn set_endpoint_resolver( + &mut self, + endpoint_resolver: Option, + ) -> &mut Self { + self.endpoint_resolver = + endpoint_resolver.map(|s| Tracked::new(self.builder_name, s.into_shared())); + self + } + + /// Sets the endpoint resolver. + pub fn with_endpoint_resolver( + mut self, + endpoint_resolver: Option, + ) -> Self { + self.set_endpoint_resolver(endpoint_resolver); + self + } + + /// Returns the auth schemes. + pub fn auth_schemes(&self) -> impl Iterator + '_ { + self.auth_schemes.iter().map(|s| s.value.clone()) + } + + /// Adds an auth scheme. + pub fn push_auth_scheme(&mut self, auth_scheme: impl AuthScheme + 'static) -> &mut Self { + self.auth_schemes + .push(Tracked::new(self.builder_name, auth_scheme.into_shared())); + self + } + + /// Adds an auth scheme. + pub fn with_auth_scheme(mut self, auth_scheme: impl AuthScheme + 'static) -> Self { + self.push_auth_scheme(auth_scheme); + self + } + + /// Returns the identity cache. + pub fn identity_cache(&self) -> Option { + self.identity_cache.as_ref().map(|s| s.value.clone()) + } + + /// Sets the identity cache. + pub fn set_identity_cache( + &mut self, + identity_cache: Option, + ) -> &mut Self { + self.identity_cache = + identity_cache.map(|c| Tracked::new(self.builder_name, c.into_shared())); + self + } + + /// Sets the identity cache. + pub fn with_identity_cache( + mut self, + identity_cache: Option, + ) -> Self { + self.set_identity_cache(identity_cache); + self + } + + /// This method is broken since it does not replace an existing identity resolver of the given auth scheme ID. + /// Use `set_identity_resolver` instead. + #[deprecated( + note = "This method is broken since it does not replace an existing identity resolver of the given auth scheme ID. Use `set_identity_resolver` instead." + )] + pub fn push_identity_resolver( + &mut self, + scheme_id: AuthSchemeId, + identity_resolver: impl ResolveIdentity + 'static, + ) -> &mut Self { + self.identity_resolvers.push(Tracked::new( + self.builder_name, + ConfiguredIdentityResolver::new(scheme_id, identity_resolver.into_shared()), + )); + self + } + + /// Sets the identity resolver for a given `scheme_id`. + /// + /// If there is already an identity resolver for that `scheme_id`, this method will replace + /// the existing one with the passed-in `identity_resolver`. + pub fn set_identity_resolver( + &mut self, + scheme_id: AuthSchemeId, + identity_resolver: impl ResolveIdentity + 'static, + ) -> &mut Self { + let tracked = Tracked::new( + self.builder_name, + ConfiguredIdentityResolver::new(scheme_id, identity_resolver.into_shared()), + ); + + if let Some(s) = self + .identity_resolvers + .iter_mut() + .find(|s| s.value.scheme_id() == scheme_id) + { + *s = tracked; + } else { + self.identity_resolvers.push(tracked); + } + + self + } + + /// Adds an identity resolver. + pub fn with_identity_resolver( + mut self, + scheme_id: AuthSchemeId, + identity_resolver: impl ResolveIdentity + 'static, + ) -> Self { + self.set_identity_resolver(scheme_id, identity_resolver); + self + } + + /// Returns the interceptors. + pub fn interceptors(&self) -> impl Iterator + '_ { + self.interceptors.iter().map(|s| s.value.clone()) + } + + /// Adds all the given interceptors. + pub fn extend_interceptors( + &mut self, + interceptors: impl Iterator, + ) -> &mut Self { + self.interceptors + .extend(interceptors.map(|s| Tracked::new(self.builder_name, s))); + self + } + + /// Adds an interceptor. + pub fn push_interceptor(&mut self, interceptor: impl Intercept + 'static) -> &mut Self { + self.interceptors + .push(Tracked::new(self.builder_name, interceptor.into_shared())); + self + } + + /// Adds an interceptor. + pub fn with_interceptor(mut self, interceptor: impl Intercept + 'static) -> Self { + self.push_interceptor(interceptor); + self + } + + /// Directly sets the interceptors and clears out any that were previously pushed. + pub fn set_interceptors( + &mut self, + interceptors: impl Iterator, + ) -> &mut Self { + self.interceptors.clear(); + self.interceptors + .extend(interceptors.map(|s| Tracked::new(self.builder_name, s))); + self + } + + /// Directly sets the interceptors and clears out any that were previously pushed. + pub fn with_interceptors( + mut self, + interceptors: impl Iterator, + ) -> Self { + self.set_interceptors(interceptors); + self + } + + /// Returns the retry classifiers. + pub fn retry_classifiers(&self) -> impl Iterator + '_ { + self.retry_classifiers.iter().map(|s| s.value.clone()) + } + + /// Adds all the given retry classifiers. + pub fn extend_retry_classifiers( + &mut self, + retry_classifiers: impl Iterator, + ) -> &mut Self { + self.retry_classifiers + .extend(retry_classifiers.map(|s| Tracked::new(self.builder_name, s))); + self + } + + /// Adds an retry_classifier. + pub fn push_retry_classifier( + &mut self, + retry_classifier: impl ClassifyRetry + 'static, + ) -> &mut Self { + self.retry_classifiers.push(Tracked::new( + self.builder_name, + retry_classifier.into_shared(), + )); + self + } + + /// Adds an retry_classifier. + pub fn with_retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { + self.push_retry_classifier(retry_classifier); + self + } + + /// Directly sets the retry_classifiers and clears out any that were previously pushed. + pub fn set_retry_classifiers( + &mut self, + retry_classifiers: impl Iterator, + ) -> &mut Self { + self.retry_classifiers.clear(); + self.retry_classifiers + .extend(retry_classifiers.map(|s| Tracked::new(self.builder_name, s))); + self + } + + /// Returns the retry strategy. + pub fn retry_strategy(&self) -> Option { + self.retry_strategy.as_ref().map(|s| s.value.clone()) + } + + /// Sets the retry strategy. + pub fn set_retry_strategy( + &mut self, + retry_strategy: Option, + ) -> &mut Self { + self.retry_strategy = + retry_strategy.map(|s| Tracked::new(self.builder_name, s.into_shared())); + self + } + + /// Sets the retry strategy. + pub fn with_retry_strategy( + mut self, + retry_strategy: Option, + ) -> Self { + self.retry_strategy = + retry_strategy.map(|s| Tracked::new(self.builder_name, s.into_shared())); + self + } + + /// Returns the async sleep implementation. + pub fn sleep_impl(&self) -> Option { + self.sleep_impl.as_ref().map(|s| s.value.clone()) + } + + /// Sets the async sleep implementation. + pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { + self.sleep_impl = self.tracked(sleep_impl); + self + } + + /// Sets the async sleep implementation. + pub fn with_sleep_impl(mut self, sleep_impl: Option) -> Self { + self.set_sleep_impl(sleep_impl.map(IntoShared::into_shared)); + self + } + + /// Returns the time source. + pub fn time_source(&self) -> Option { + self.time_source.as_ref().map(|s| s.value.clone()) + } + + /// Sets the time source. + pub fn set_time_source(&mut self, time_source: Option) -> &mut Self { + self.time_source = self.tracked(time_source); + self + } + + /// Sets the time source. + pub fn with_time_source(mut self, time_source: Option) -> Self { + self.set_time_source(time_source.map(IntoShared::into_shared)); + self + } + + /// Returns the config validators. + pub fn config_validators(&self) -> impl Iterator + '_ { + self.config_validators.iter().map(|s| s.value.clone()) + } + + /// Adds all the given config validators. + pub fn extend_config_validators( + &mut self, + config_validators: impl Iterator, + ) -> &mut Self { + self.config_validators + .extend(config_validators.map(|s| Tracked::new(self.builder_name, s))); + self + } + + /// Adds a config validator. + pub fn push_config_validator( + &mut self, + config_validator: impl ValidateConfig + 'static, + ) -> &mut Self { + self.config_validators.push(Tracked::new( + self.builder_name, + config_validator.into_shared(), + )); + self + } + + /// Adds a config validator. + pub fn with_config_validator( + mut self, + config_validator: impl ValidateConfig + 'static, + ) -> Self { + self.push_config_validator(config_validator); + self + } + + /// Validate the base client configuration. + /// + /// This is intended to be called internally by the client. + pub fn validate_base_client_config(&self, cfg: &ConfigBag) -> Result<(), BoxError> { + macro_rules! validate { + ($field:expr) => { + for entry in &$field { + ValidateConfig::validate_base_client_config(&entry.value, self, cfg)?; + } + }; + } + + tracing::trace!(runtime_components=?self, cfg=?cfg, "validating base client config"); + for validator in self.config_validators() { + validator.validate_base_client_config(self, cfg)?; + } + validate!(self.http_client); + validate!(self.endpoint_resolver); + validate!(self.auth_schemes); + validate!(self.identity_cache); + validate!(self.identity_resolvers); + validate!(self.interceptors); + validate!(self.retry_strategy); + Ok(()) + } + + /// Wraps `v` in tracking associated with this builder + fn tracked(&self, v: Option) -> Option> { + v.map(|v| Tracked::new(self.builder_name, v)) + } +} + +#[derive(Clone, Debug)] +#[cfg_attr(test, derive(Eq, PartialEq))] +struct Tracked { + _origin: &'static str, + value: T, +} + +impl Tracked { + fn new(origin: &'static str, value: T) -> Self { + Self { + _origin: origin, + value, + } + } +} + +impl RuntimeComponentsBuilder { + /// Creates a runtime components builder with all the required components filled in with fake (panicking) implementations. + #[cfg(feature = "test-util")] + pub fn for_tests() -> Self { + use crate::client::endpoint::{EndpointFuture, EndpointResolverParams}; + use crate::client::identity::IdentityFuture; + + #[derive(Debug)] + struct FakeAuthSchemeOptionResolver; + impl ResolveAuthSchemeOptions for FakeAuthSchemeOptionResolver { + fn resolve_auth_scheme_options( + &self, + _: &crate::client::auth::AuthSchemeOptionResolverParams, + ) -> Result, crate::box_error::BoxError> + { + unreachable!("fake auth scheme option resolver must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeClient; + impl HttpClient for FakeClient { + fn http_connector( + &self, + _: &crate::client::http::HttpConnectorSettings, + _: &RuntimeComponents, + ) -> crate::client::http::SharedHttpConnector { + unreachable!("fake client must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeEndpointResolver; + impl ResolveEndpoint for FakeEndpointResolver { + fn resolve_endpoint<'a>(&'a self, _: &'a EndpointResolverParams) -> EndpointFuture<'a> { + unreachable!("fake endpoint resolver must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeAuthScheme; + impl AuthScheme for FakeAuthScheme { + fn scheme_id(&self) -> AuthSchemeId { + AuthSchemeId::new("fake") + } + + fn identity_resolver( + &self, + _: &dyn GetIdentityResolver, + ) -> Option { + None + } + + fn signer(&self) -> &dyn crate::client::auth::Sign { + unreachable!("fake http auth scheme must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeIdentityResolver; + impl ResolveIdentity for FakeIdentityResolver { + fn resolve_identity<'a>( + &'a self, + _: &'a RuntimeComponents, + _: &'a ConfigBag, + ) -> IdentityFuture<'a> { + unreachable!("fake identity resolver must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeRetryStrategy; + impl RetryStrategy for FakeRetryStrategy { + fn should_attempt_initial_request( + &self, + _: &RuntimeComponents, + _: &ConfigBag, + ) -> Result + { + unreachable!("fake retry strategy must be overridden for this test") + } + + fn should_attempt_retry( + &self, + _: &crate::client::interceptors::context::InterceptorContext, + _: &RuntimeComponents, + _: &ConfigBag, + ) -> Result + { + unreachable!("fake retry strategy must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeTimeSource; + impl TimeSource for FakeTimeSource { + fn now(&self) -> std::time::SystemTime { + unreachable!("fake time source must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeSleep; + impl AsyncSleep for FakeSleep { + fn sleep(&self, _: std::time::Duration) -> aws_smithy_async::rt::sleep::Sleep { + unreachable!("fake sleep must be overridden for this test") + } + } + + #[derive(Debug)] + struct FakeIdentityCache; + impl ResolveCachedIdentity for FakeIdentityCache { + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::new(async move { + resolver.resolve_identity(components, config_bag).await + }) + } + } + + Self::new("aws_smithy_runtime_api::client::runtime_components::RuntimeComponentBuilder::for_tests") + .with_auth_scheme(FakeAuthScheme) + .with_auth_scheme_option_resolver(Some(FakeAuthSchemeOptionResolver)) + .with_endpoint_resolver(Some(FakeEndpointResolver)) + .with_http_client(Some(FakeClient)) + .with_identity_cache(Some(FakeIdentityCache)) + .with_identity_resolver(AuthSchemeId::new("fake"), FakeIdentityResolver) + .with_retry_strategy(Some(FakeRetryStrategy)) + .with_sleep_impl(Some(SharedAsyncSleep::new(FakeSleep))) + .with_time_source(Some(SharedTimeSource::new(FakeTimeSource))) + } +} + +/// An error that occurs when building runtime components. +#[derive(Debug)] +pub struct BuildError(&'static str); + +impl std::error::Error for BuildError {} + +impl fmt::Display for BuildError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +/// A trait for retrieving a shared identity resolver. +/// +/// This trait exists so that [`AuthScheme::identity_resolver`] +/// can have access to configured identity resolvers without having access to all the runtime components. +pub trait GetIdentityResolver: Send + Sync { + /// Returns the requested identity resolver if it is set. + fn identity_resolver(&self, scheme_id: AuthSchemeId) -> Option; +} + +impl GetIdentityResolver for RuntimeComponents { + fn identity_resolver(&self, scheme_id: AuthSchemeId) -> Option { + self.identity_resolvers + .iter() + .find(|s| s.value.scheme_id() == scheme_id) + .map(|s| s.value.identity_resolver()) + } +} + +#[cfg(all(test, feature = "test-util"))] +mod tests { + use super::{BuildError, RuntimeComponentsBuilder, Tracked}; + use crate::client::runtime_components::ValidateConfig; + + #[derive(Clone, Debug, Eq, PartialEq)] + struct TestComponent(String); + impl ValidateConfig for TestComponent {} + impl From<&'static str> for TestComponent { + fn from(value: &'static str) -> Self { + TestComponent(value.into()) + } + } + + #[test] + #[allow(unreachable_pub)] + #[allow(dead_code)] + fn the_builders_should_merge() { + declare_runtime_components! { + fields for TestRc and TestRcBuilder { + #[required] + some_required_component: Option, + + some_optional_component: Option, + + #[atLeastOneRequired] + some_required_vec: Vec, + + some_optional_vec: Vec, + } + } + + let builder1 = TestRcBuilder { + builder_name: "builder1", + some_required_component: Some(Tracked::new("builder1", "override_me".into())), + some_optional_component: Some(Tracked::new("builder1", "override_me optional".into())), + some_required_vec: vec![Tracked::new("builder1", "first".into())], + some_optional_vec: vec![Tracked::new("builder1", "first optional".into())], + }; + let builder2 = TestRcBuilder { + builder_name: "builder2", + some_required_component: Some(Tracked::new("builder2", "override_me_too".into())), + some_optional_component: Some(Tracked::new( + "builder2", + "override_me_too optional".into(), + )), + some_required_vec: vec![Tracked::new("builder2", "second".into())], + some_optional_vec: vec![Tracked::new("builder2", "second optional".into())], + }; + let builder3 = TestRcBuilder { + builder_name: "builder3", + some_required_component: Some(Tracked::new("builder3", "correct".into())), + some_optional_component: Some(Tracked::new("builder3", "correct optional".into())), + some_required_vec: vec![Tracked::new("builder3", "third".into())], + some_optional_vec: vec![Tracked::new("builder3", "third optional".into())], + }; + let rc = TestRcBuilder::new("root") + .merge_from(&builder1) + .merge_from(&builder2) + .merge_from(&builder3) + .build() + .expect("success"); + assert_eq!( + Tracked::new("builder3", TestComponent::from("correct")), + rc.some_required_component + ); + assert_eq!( + Some(Tracked::new( + "builder3", + TestComponent::from("correct optional") + )), + rc.some_optional_component + ); + assert_eq!( + vec![ + Tracked::new("builder1", TestComponent::from("first")), + Tracked::new("builder2", TestComponent::from("second")), + Tracked::new("builder3", TestComponent::from("third")) + ], + rc.some_required_vec + ); + assert_eq!( + vec![ + Tracked::new("builder1", TestComponent::from("first optional")), + Tracked::new("builder2", TestComponent::from("second optional")), + Tracked::new("builder3", TestComponent::from("third optional")) + ], + rc.some_optional_vec + ); + } + + #[test] + #[allow(unreachable_pub)] + #[allow(dead_code)] + #[should_panic(expected = "the `_some_component` runtime component is required")] + fn require_field_singular() { + declare_runtime_components! { + fields for TestRc and TestRcBuilder { + #[required] + _some_component: Option, + } + } + + let rc = TestRcBuilder::new("test").build().unwrap(); + + // Ensure the correct types were used + let _: Tracked = rc._some_component; + } + + #[test] + #[allow(unreachable_pub)] + #[allow(dead_code)] + #[should_panic(expected = "at least one `_some_vec` runtime component is required")] + fn require_field_plural() { + declare_runtime_components! { + fields for TestRc and TestRcBuilder { + #[atLeastOneRequired] + _some_vec: Vec, + } + } + + let rc = TestRcBuilder::new("test").build().unwrap(); + + // Ensure the correct types were used + let _: Vec> = rc._some_vec; + } + + #[test] + #[allow(unreachable_pub)] + #[allow(dead_code)] + fn optional_fields_dont_panic() { + declare_runtime_components! { + fields for TestRc and TestRcBuilder { + _some_optional_component: Option, + _some_optional_vec: Vec, + } + } + + let rc = TestRcBuilder::new("test").build().unwrap(); + + // Ensure the correct types were used + let _: Option> = rc._some_optional_component; + let _: Vec> = rc._some_optional_vec; + } + + #[test] + fn building_test_builder_should_not_panic() { + let _ = RuntimeComponentsBuilder::for_tests().build(); // should not panic + } + + #[test] + fn set_identity_resolver_should_replace_existing_resolver_for_given_auth_scheme() { + use crate::client::auth::AuthSchemeId; + use crate::client::identity::{Identity, IdentityFuture, ResolveIdentity}; + use crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; + use aws_smithy_types::config_bag::ConfigBag; + use tokio::runtime::Runtime; + + #[derive(Debug)] + struct AnotherFakeIdentityResolver; + impl ResolveIdentity for AnotherFakeIdentityResolver { + fn resolve_identity<'a>( + &'a self, + _: &'a RuntimeComponents, + _: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new("doesntmatter", None))) + } + } + + // Set a different `IdentityResolver` for the `fake` auth scheme already configured in + // a test runtime components builder + let rc = RuntimeComponentsBuilder::for_tests() + .with_identity_resolver(AuthSchemeId::new("fake"), AnotherFakeIdentityResolver) + .build() + .expect("should build RuntimeComponents"); + + let resolver = rc + .identity_resolver(AuthSchemeId::new("fake")) + .expect("identity resolver should be found"); + + let identity = Runtime::new().unwrap().block_on(async { + resolver + .resolve_identity(&rc, &ConfigBag::base()) + .await + .expect("identity should be resolved") + }); + + assert_eq!(Some(&"doesntmatter"), identity.data::<&str>()); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs index d0a8e18b59c..53812097f7a 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs @@ -3,46 +3,231 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Runtime plugin type definitions. +//! +//! Runtime plugins are used to extend the runtime with custom behavior. +//! This can include: +//! - Registering interceptors +//! - Registering auth schemes +//! - Adding entries to the [`ConfigBag`] for orchestration +//! - Setting runtime components +//! +//! Runtime plugins are divided into service/operation "levels", with service runtime plugins +//! executing before operation runtime plugins. Runtime plugins configured in a service +//! config will always be at the service level, while runtime plugins added during +//! operation customization will be at the operation level. Custom runtime plugins will +//! always run after the default runtime plugins within their level. + use crate::box_error::BoxError; -use crate::client::interceptors::InterceptorRegistrar; +use crate::client::runtime_components::{ + RuntimeComponentsBuilder, EMPTY_RUNTIME_COMPONENTS_BUILDER, +}; +use crate::impl_shared_conversions; +use crate::shared::IntoShared; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer}; +use std::borrow::Cow; use std::fmt::Debug; use std::sync::Arc; -/// RuntimePlugin Trait +const DEFAULT_ORDER: Order = Order::Overrides; + +/// Runtime plugin ordering. /// -/// A RuntimePlugin is the unit of configuration for augmenting the SDK with new behavior +/// There are two runtime plugin "levels" that run in the following order: +/// 1. Service runtime plugins - runtime plugins that pertain to the entire service. +/// 2. Operation runtime plugins - runtime plugins relevant only to a single operation. +/// +/// This enum is used to determine runtime plugin order within those levels. +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +pub enum Order { + /// Runtime plugins with `Defaults` order are executed first within their level. + /// + /// Runtime plugins with this order should only be used for registering default components and config. + Defaults, + + /// Runtime plugins with `Overrides` order are executed after `Defaults` within their level. + /// + /// This is the default order. + Overrides, + + /// Runtime plugins with `NestedComponents` order are executed after `Overrides` within their level. + /// + /// This level is intended to be used for wrapping components configured in previous runtime plugins. + NestedComponents, +} + +/// Runtime plugin trait /// -/// Runtime plugins can set configuration and register interceptors. +/// A `RuntimePlugin` is the unit of configuration for augmenting the client with new behavior. +/// +/// Runtime plugins can register interceptors, set runtime components, and modify configuration. pub trait RuntimePlugin: Debug + Send + Sync { + /// Runtime plugin ordering. + /// + /// There are two runtime plugin "levels" that run in the following order: + /// 1. Service runtime plugins - runtime plugins that pertain to the entire service. + /// 2. Operation runtime plugins - runtime plugins relevant only to a single operation. + /// + /// This function is used to determine runtime plugin order within those levels. So + /// regardless of this `Order` value, service runtime plugins will still always execute before + /// operation runtime plugins. However, [`Defaults`](Order::Defaults) + /// service runtime plugins will run before [`Overrides`](Order::Overrides) + /// service runtime plugins. + fn order(&self) -> Order { + DEFAULT_ORDER + } + + /// Optionally returns additional config that should be added to the [`ConfigBag`]. + /// + /// As a best practice, a frozen layer should be stored on the runtime plugin instance as + /// a member, and then cloned upon return since that clone is cheap. Constructing a new + /// [`Layer`](aws_smithy_types::config_bag::Layer) and freezing it will require a lot of allocations. fn config(&self) -> Option { None } - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - let _ = interceptors; + /// Returns a [`RuntimeComponentsBuilder`](RuntimeComponentsBuilder) to incorporate into the final runtime components. + /// + /// The order of runtime plugins determines which runtime components "win". Components set by later runtime plugins will + /// override those set by earlier runtime plugins. + /// + /// If no runtime component changes are desired, just return an empty builder. + /// + /// This method returns a [`Cow`] for flexibility. Some implementers may want to store the components builder + /// as a member and return a reference to it, while others may need to create the builder every call. If possible, + /// returning a reference is preferred for performance. + /// + /// Components configured by previous runtime plugins are in the `current_components` argument, and can be used + /// to create nested/wrapped components, such as a connector calling into an inner (customer provided) connector. + fn runtime_components( + &self, + current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + let _ = current_components; + Cow::Borrowed(&EMPTY_RUNTIME_COMPONENTS_BUILDER) } } +/// Shared runtime plugin +/// +/// Allows for multiple places to share ownership of one runtime plugin. #[derive(Debug, Clone)] -struct SharedRuntimePlugin(Arc); +pub struct SharedRuntimePlugin(Arc); impl SharedRuntimePlugin { - fn new(plugin: impl RuntimePlugin + 'static) -> Self { + /// Creates a new [`SharedRuntimePlugin`]. + pub fn new(plugin: impl RuntimePlugin + 'static) -> Self { Self(Arc::new(plugin)) } } impl RuntimePlugin for SharedRuntimePlugin { + fn order(&self) -> Order { + self.0.order() + } + fn config(&self) -> Option { self.0.config() } - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - self.0.interceptors(interceptors) + fn runtime_components( + &self, + current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + self.0.runtime_components(current_components) + } +} + +impl_shared_conversions!(convert SharedRuntimePlugin from RuntimePlugin using SharedRuntimePlugin::new); + +/// Runtime plugin that simply returns the config and components given at construction time. +#[derive(Default, Debug)] +pub struct StaticRuntimePlugin { + config: Option, + runtime_components: Option, + order: Option, +} + +impl StaticRuntimePlugin { + /// Returns a new [`StaticRuntimePlugin`]. + pub fn new() -> Self { + Default::default() + } + + /// Changes the config. + pub fn with_config(mut self, config: FrozenLayer) -> Self { + self.config = Some(config); + self + } + + /// Changes the runtime components. + pub fn with_runtime_components(mut self, runtime_components: RuntimeComponentsBuilder) -> Self { + self.runtime_components = Some(runtime_components); + self + } + + /// Changes the order of this runtime plugin. + pub fn with_order(mut self, order: Order) -> Self { + self.order = Some(order); + self + } +} + +impl RuntimePlugin for StaticRuntimePlugin { + fn order(&self) -> Order { + self.order.unwrap_or(DEFAULT_ORDER) + } + + fn config(&self) -> Option { + self.config.clone() } + + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + self.runtime_components + .as_ref() + .map(Cow::Borrowed) + .unwrap_or_else(|| Cow::Borrowed(&EMPTY_RUNTIME_COMPONENTS_BUILDER)) + } +} + +macro_rules! insert_plugin { + ($vec:expr, $plugin:expr) => {{ + // Insert the plugin in the correct order + let plugin = $plugin; + let mut insert_index = 0; + let order = plugin.order(); + for (index, other_plugin) in $vec.iter().enumerate() { + let other_order = other_plugin.order(); + if other_order <= order { + insert_index = index + 1; + } else if other_order > order { + break; + } + } + $vec.insert(insert_index, plugin); + }}; +} + +macro_rules! apply_plugins { + ($name:ident, $plugins:expr, $cfg:ident) => {{ + tracing::trace!(concat!("applying ", stringify!($name), " runtime plugins")); + let mut merged = + RuntimeComponentsBuilder::new(concat!("apply_", stringify!($name), "_configuration")); + for plugin in &$plugins { + if let Some(layer) = plugin.config() { + $cfg.push_shared_layer(layer); + } + let next = plugin.runtime_components(&merged); + merged = merged.merge_from(&next); + } + Ok(merged) + }}; } +/// Used internally in the orchestrator implementation and in the generated code. Not intended to be used elsewhere. #[derive(Default, Clone, Debug)] pub struct RuntimePlugins { client_plugins: Vec, @@ -50,57 +235,82 @@ pub struct RuntimePlugins { } impl RuntimePlugins { + /// Create a new empty set of runtime plugins. pub fn new() -> Self { Default::default() } + /// Add several client-level runtime plugins from an iterator. + pub fn with_client_plugins( + mut self, + plugins: impl IntoIterator, + ) -> Self { + for plugin in plugins.into_iter() { + self = self.with_client_plugin(plugin); + } + self + } + + /// Adds a client-level runtime plugin. pub fn with_client_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { - self.client_plugins.push(SharedRuntimePlugin::new(plugin)); + insert_plugin!( + self.client_plugins, + IntoShared::::into_shared(plugin) + ); self } + /// Add several operation-level runtime plugins from an iterator. + pub fn with_operation_plugins( + mut self, + plugins: impl IntoIterator, + ) -> Self { + for plugin in plugins.into_iter() { + self = self.with_operation_plugin(plugin); + } + self + } + + /// Adds an operation-level runtime plugin. pub fn with_operation_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self { - self.operation_plugins - .push(SharedRuntimePlugin::new(plugin)); + insert_plugin!( + self.operation_plugins, + IntoShared::::into_shared(plugin) + ); self } + /// Apply the client-level runtime plugins' config to the given config bag. pub fn apply_client_configuration( &self, cfg: &mut ConfigBag, - interceptors: &mut InterceptorRegistrar, - ) -> Result<(), BoxError> { - tracing::trace!("applying client runtime plugins"); - for plugin in self.client_plugins.iter() { - if let Some(layer) = plugin.config() { - cfg.push_shared_layer(layer); - } - plugin.interceptors(interceptors); - } - - Ok(()) + ) -> Result { + apply_plugins!(client, self.client_plugins, cfg) } + /// Apply the operation-level runtime plugins' config to the given config bag. pub fn apply_operation_configuration( &self, cfg: &mut ConfigBag, - interceptors: &mut InterceptorRegistrar, - ) -> Result<(), BoxError> { - tracing::trace!("applying operation runtime plugins"); - for plugin in self.operation_plugins.iter() { - if let Some(layer) = plugin.config() { - cfg.push_shared_layer(layer); - } - plugin.interceptors(interceptors); - } - - Ok(()) + ) -> Result { + apply_plugins!(operation, self.operation_plugins, cfg) } } -#[cfg(test)] +#[cfg(all(test, feature = "test-util", feature = "http-02x"))] mod tests { use super::{RuntimePlugin, RuntimePlugins}; + use crate::client::http::{ + http_client_fn, HttpClient, HttpConnector, HttpConnectorFuture, SharedHttpConnector, + }; + use crate::client::orchestrator::HttpRequest; + use crate::client::runtime_components::RuntimeComponentsBuilder; + use crate::client::runtime_plugin::{Order, SharedRuntimePlugin}; + use crate::shared::IntoShared; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::config_bag::ConfigBag; + use http::HeaderValue; + use std::borrow::Cow; #[derive(Debug)] struct SomeStruct; @@ -117,4 +327,180 @@ mod tests { fn assert_send_sync() {} assert_send_sync::(); } + + #[test] + fn insert_plugin() { + #[derive(Debug)] + struct RP(isize, Order); + impl RuntimePlugin for RP { + fn order(&self) -> Order { + self.1 + } + } + + fn insert_plugin(vec: &mut Vec, plugin: RP) { + insert_plugin!(vec, plugin); + } + + let mut vec = Vec::new(); + insert_plugin(&mut vec, RP(5, Order::NestedComponents)); + insert_plugin(&mut vec, RP(3, Order::Overrides)); + insert_plugin(&mut vec, RP(1, Order::Defaults)); + insert_plugin(&mut vec, RP(6, Order::NestedComponents)); + insert_plugin(&mut vec, RP(2, Order::Defaults)); + insert_plugin(&mut vec, RP(4, Order::Overrides)); + insert_plugin(&mut vec, RP(7, Order::NestedComponents)); + assert_eq!( + vec![1, 2, 3, 4, 5, 6, 7], + vec.iter().map(|rp| rp.0).collect::>() + ); + + let mut vec = Vec::new(); + insert_plugin(&mut vec, RP(3, Order::Overrides)); + insert_plugin(&mut vec, RP(4, Order::Overrides)); + insert_plugin(&mut vec, RP(5, Order::NestedComponents)); + insert_plugin(&mut vec, RP(6, Order::NestedComponents)); + insert_plugin(&mut vec, RP(7, Order::NestedComponents)); + insert_plugin(&mut vec, RP(1, Order::Defaults)); + insert_plugin(&mut vec, RP(2, Order::Defaults)); + assert_eq!( + vec![1, 2, 3, 4, 5, 6, 7], + vec.iter().map(|rp| rp.0).collect::>() + ); + + let mut vec = Vec::new(); + insert_plugin(&mut vec, RP(1, Order::Defaults)); + insert_plugin(&mut vec, RP(2, Order::Defaults)); + insert_plugin(&mut vec, RP(3, Order::Overrides)); + insert_plugin(&mut vec, RP(4, Order::Overrides)); + insert_plugin(&mut vec, RP(5, Order::NestedComponents)); + insert_plugin(&mut vec, RP(6, Order::NestedComponents)); + assert_eq!( + vec![1, 2, 3, 4, 5, 6], + vec.iter().map(|rp| rp.0).collect::>() + ); + } + + #[tokio::test] + async fn components_can_wrap_components() { + // Connector1, the inner connector, creates a response with a `rp1` header + #[derive(Debug)] + struct Connector1; + impl HttpConnector for Connector1 { + fn call(&self, _: HttpRequest) -> HttpConnectorFuture { + HttpConnectorFuture::new(async { + Ok(http::Response::builder() + .status(200) + .header("rp1", "1") + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap()) + }) + } + } + + // Connector2, the outer connector, calls the inner connector and adds the `rp2` header to the response + #[derive(Debug)] + struct Connector2(SharedHttpConnector); + impl HttpConnector for Connector2 { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + let inner = self.0.clone(); + HttpConnectorFuture::new(async move { + let mut resp = inner.call(request).await.unwrap(); + resp.headers_mut() + .append("rp2", HeaderValue::from_static("1")); + Ok(resp) + }) + } + } + + // Plugin1 registers Connector1 + #[derive(Debug)] + struct Plugin1; + impl RuntimePlugin for Plugin1 { + fn order(&self) -> Order { + Order::Overrides + } + + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Owned( + RuntimeComponentsBuilder::new("Plugin1") + .with_http_client(Some(http_client_fn(|_, _| Connector1.into_shared()))), + ) + } + } + + // Plugin2 registers Connector2 + #[derive(Debug)] + struct Plugin2; + impl RuntimePlugin for Plugin2 { + fn order(&self) -> Order { + Order::NestedComponents + } + + fn runtime_components( + &self, + current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + let current = current_components.http_client().unwrap(); + Cow::Owned( + RuntimeComponentsBuilder::new("Plugin2").with_http_client(Some( + http_client_fn(move |settings, components| { + let connector = current.http_connector(settings, components); + SharedHttpConnector::new(Connector2(connector)) + }), + )), + ) + } + } + + // Emulate assembling a full runtime plugins list and using it to apply configuration + let plugins = RuntimePlugins::new() + // intentionally configure the plugins in the reverse order + .with_client_plugin(Plugin2) + .with_client_plugin(Plugin1); + let mut cfg = ConfigBag::base(); + let components = plugins.apply_client_configuration(&mut cfg).unwrap(); + let fake_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); + + // Use the resulting HTTP connector to make a response + let resp = components + .http_client() + .unwrap() + .http_connector(&Default::default(), &fake_components) + .call(HttpRequest::empty()) + .await + .unwrap(); + dbg!(&resp); + + // Verify headers from both connectors are present, + // which will only be possible if they were run in the correct order + assert_eq!("1", resp.headers().get("rp1").unwrap()); + assert_eq!("1", resp.headers().get("rp2").unwrap()); + } + + #[test] + fn shared_runtime_plugin_new_specialization() { + #[derive(Debug)] + struct RP; + impl RuntimePlugin for RP {} + + use crate::shared::IntoShared; + let shared1 = SharedRuntimePlugin::new(RP); + let shared2: SharedRuntimePlugin = shared1.clone().into_shared(); + assert_eq!( + "SharedRuntimePlugin(RP)", + format!("{shared1:?}"), + "precondition: RP shows up in the debug format" + ); + assert_eq!( + format!("{shared1:?}"), + format!("{shared2:?}"), + "it should not nest the shared runtime plugins" + ); + } } diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs new file mode 100644 index 00000000000..5ca288cbbaf --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs @@ -0,0 +1,110 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Serialization/deserialization for the orchestrator. + +use crate::box_error::BoxError; +use crate::client::interceptors::context::{Error, Input, Output}; +use crate::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError}; +use crate::impl_shared_conversions; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; +use std::fmt; +use std::sync::Arc; + +/// Serialization implementation that converts an [`Input`] into an [`HttpRequest`]. +pub trait SerializeRequest: Send + Sync + fmt::Debug { + /// Serializes the input into an HTTP request. + /// + /// The type of the [`Input`] must be known ahead of time by the request serializer + /// implementation, and must be downcasted to get access to the information necessary + /// for serialization. + /// + /// The request serializer is generally added to the [`ConfigBag`] by the operation's + /// code generated runtime plugin, which is aware of the correct input/output/error types. + fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result; +} + +/// A shared request serializer. +/// +/// This is a simple shared ownership wrapper type for the [`SerializeRequest`] trait. +#[derive(Clone, Debug)] +pub struct SharedRequestSerializer(Arc); + +impl SharedRequestSerializer { + /// Creates a new shared request serializer. + pub fn new(serializer: impl SerializeRequest + 'static) -> Self { + Self(Arc::new(serializer)) + } +} + +impl SerializeRequest for SharedRequestSerializer { + fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result { + self.0.serialize_input(input, cfg) + } +} + +impl Storable for SharedRequestSerializer { + type Storer = StoreReplace; +} + +impl_shared_conversions!(convert SharedRequestSerializer from SerializeRequest using SharedRequestSerializer::new); + +/// Deserialization implementation that converts an [`HttpResponse`] into an [`Output`] or [`Error`]. +pub trait DeserializeResponse: Send + Sync + fmt::Debug { + /// For streaming requests, deserializes the response headers. + /// + /// The orchestrator will call `deserialize_streaming` first, and if it returns `None`, + /// then it will continue onto `deserialize_nonstreaming`. This method should only be + /// implemented for streaming requests where the streaming response body needs to be a part + /// of the deserialized output. + fn deserialize_streaming( + &self, + response: &mut HttpResponse, + ) -> Option>> { + let _ = response; + None + } + + /// Deserialize the entire response including its body into an output or error. + fn deserialize_nonstreaming( + &self, + response: &HttpResponse, + ) -> Result>; +} + +/// Shared response deserializer. +/// +/// This is a simple shared ownership wrapper type for the [`DeserializeResponse`] trait. +#[derive(Debug)] +pub struct SharedResponseDeserializer(Arc); + +impl SharedResponseDeserializer { + /// Creates a new [`SharedResponseDeserializer`]. + pub fn new(serializer: impl DeserializeResponse + 'static) -> Self { + Self(Arc::new(serializer)) + } +} + +impl DeserializeResponse for SharedResponseDeserializer { + fn deserialize_nonstreaming( + &self, + response: &HttpResponse, + ) -> Result> { + self.0.deserialize_nonstreaming(response) + } + + fn deserialize_streaming( + &self, + response: &mut HttpResponse, + ) -> Option>> { + self.0.deserialize_streaming(response) + } +} + +impl Storable for SharedResponseDeserializer { + type Storer = StoreReplace; +} + +impl_shared_conversions!(convert SharedResponseDeserializer from DeserializeResponse using SharedResponseDeserializer::new); diff --git a/rust-runtime/aws-smithy-runtime-api/src/client/stalled_stream_protection.rs b/rust-runtime/aws-smithy-runtime-api/src/client/stalled_stream_protection.rs new file mode 100644 index 00000000000..25c9c5c67df --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/client/stalled_stream_protection.rs @@ -0,0 +1,109 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#![allow(missing_docs)] + +//! Stalled stream protection. +//! +//! When enabled, upload and download streams that stall (stream no data) for +//! longer than a configured grace period will return an error. + +use aws_smithy_types::config_bag::{Storable, StoreReplace}; +use std::time::Duration; + +const DEFAULT_GRACE_PERIOD: Duration = Duration::from_secs(5); + +/// Configuration for stalled stream protection. +/// +/// When enabled, download streams that stall out will be cancelled. +#[derive(Clone, Debug)] +pub struct StalledStreamProtectionConfig { + is_enabled: bool, + grace_period: Duration, +} + +impl StalledStreamProtectionConfig { + /// Create a new config that enables stalled stream protection. + pub fn enabled() -> Builder { + Builder { + is_enabled: Some(true), + grace_period: None, + } + } + + /// Create a new config that disables stalled stream protection. + pub fn disabled() -> Self { + Self { + is_enabled: false, + grace_period: DEFAULT_GRACE_PERIOD, + } + } + + /// Return whether stalled stream protection is enabled. + pub fn is_enabled(&self) -> bool { + self.is_enabled + } + + /// Return the grace period for stalled stream protection. + /// + /// When a stream stalls for longer than this grace period, the stream will + /// return an error. + pub fn grace_period(&self) -> Duration { + self.grace_period + } +} + +#[derive(Clone, Debug)] +pub struct Builder { + is_enabled: Option, + grace_period: Option, +} + +impl Builder { + /// Set the grace period for stalled stream protection. + pub fn grace_period(mut self, grace_period: Duration) -> Self { + self.grace_period = Some(grace_period); + self + } + + /// Set the grace period for stalled stream protection. + pub fn set_grace_period(&mut self, grace_period: Option) -> &mut Self { + self.grace_period = grace_period; + self + } + + /// Set whether stalled stream protection is enabled. + pub fn is_enabled(mut self, is_enabled: bool) -> Self { + self.is_enabled = Some(is_enabled); + self + } + + /// Set whether stalled stream protection is enabled. + pub fn set_is_enabled(&mut self, is_enabled: Option) -> &mut Self { + self.is_enabled = is_enabled; + self + } + + /// Build the config. + pub fn build(self) -> StalledStreamProtectionConfig { + StalledStreamProtectionConfig { + is_enabled: self.is_enabled.unwrap_or_default(), + grace_period: self.grace_period.unwrap_or(DEFAULT_GRACE_PERIOD), + } + } +} + +impl From for Builder { + fn from(config: StalledStreamProtectionConfig) -> Self { + Builder { + is_enabled: Some(config.is_enabled), + grace_period: Some(config.grace_period), + } + } +} + +impl Storable for StalledStreamProtectionConfig { + type Storer = StoreReplace; +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/http.rs b/rust-runtime/aws-smithy-runtime-api/src/http.rs new file mode 100644 index 00000000000..f295b8ac364 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http.rs @@ -0,0 +1,16 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! HTTP request and response types + +mod error; +mod headers; +mod request; +mod response; + +pub use error::HttpError; +pub use headers::{HeaderValue, Headers, HeadersIter}; +pub use request::{Request, RequestParts}; +pub use response::{Response, StatusCode}; diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/error.rs b/rust-runtime/aws-smithy-runtime-api/src/http/error.rs new file mode 100644 index 00000000000..4a0963cbb32 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http/error.rs @@ -0,0 +1,58 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Error types for HTTP requests/responses. + +use crate::box_error::BoxError; +use http::header::{InvalidHeaderName, InvalidHeaderValue}; +use http::uri::InvalidUri; +use std::error::Error; +use std::fmt::{Debug, Display, Formatter}; +use std::str::Utf8Error; + +#[derive(Debug)] +/// An error occurred constructing an Http Request. +/// +/// This is normally due to configuration issues, internal SDK bugs, or other user error. +pub struct HttpError(BoxError); + +impl HttpError { + // TODO(httpRefactor): Add better error internals + pub(super) fn new>>(err: E) -> Self { + HttpError(err.into()) + } + + pub(super) fn invalid_header_value(err: InvalidHeaderValue) -> Self { + Self(err.into()) + } + + pub(super) fn header_was_not_a_string(err: Utf8Error) -> Self { + Self(err.into()) + } + + pub(super) fn invalid_header_name(err: InvalidHeaderName) -> Self { + Self(err.into()) + } + + pub(super) fn invalid_uri(err: InvalidUri) -> Self { + Self(err.into()) + } + + pub(super) fn invalid_status_code() -> Self { + Self("invalid HTTP status code".into()) + } +} + +impl Display for HttpError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "an error occurred creating an HTTP Request") + } +} + +impl Error for HttpError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + Some(self.0.as_ref()) + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs new file mode 100644 index 00000000000..0a2dfd617ef --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http/headers.rs @@ -0,0 +1,465 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Types for HTTP headers + +use crate::http::error::HttpError; +use http as http0; +use http0::header::Iter; +use http0::HeaderMap; +use std::borrow::Cow; +use std::fmt::Debug; +use std::str::FromStr; + +/// An immutable view of headers +#[derive(Clone, Default, Debug)] +pub struct Headers { + pub(super) headers: HeaderMap, +} + +impl<'a> IntoIterator for &'a Headers { + type Item = (&'a str, &'a str); + type IntoIter = HeadersIter<'a>; + + fn into_iter(self) -> Self::IntoIter { + HeadersIter { + inner: self.headers.iter(), + } + } +} + +/// An Iterator over headers +pub struct HeadersIter<'a> { + inner: Iter<'a, HeaderValue>, +} + +impl<'a> Iterator for HeadersIter<'a> { + type Item = (&'a str, &'a str); + + fn next(&mut self) -> Option { + self.inner.next().map(|(k, v)| (k.as_str(), v.as_ref())) + } +} + +impl Headers { + /// Create an empty header map + pub fn new() -> Self { + Self::default() + } + + /// Returns the value for a given key + /// + /// If multiple values are associated, the first value is returned + /// See [HeaderMap::get] + pub fn get(&self, key: impl AsRef) -> Option<&str> { + self.headers.get(key.as_ref()).map(|v| v.as_ref()) + } + + /// Returns all values for a given key + pub fn get_all(&self, key: impl AsRef) -> impl Iterator { + self.headers + .get_all(key.as_ref()) + .iter() + .map(|v| v.as_ref()) + } + + /// Returns an iterator over the headers + pub fn iter(&self) -> HeadersIter<'_> { + HeadersIter { + inner: self.headers.iter(), + } + } + + /// Returns the total number of **values** stored in the map + pub fn len(&self) -> usize { + self.headers.len() + } + + /// Returns true if there are no headers + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// Returns true if this header is present + pub fn contains_key(&self, key: impl AsRef) -> bool { + self.headers.contains_key(key.as_ref()) + } + + /// Insert a value into the headers structure. + /// + /// This will *replace* any existing value for this key. Returns the previous associated value if any. + /// + /// # Panics + /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will panic. + pub fn insert( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Option { + let key = header_name(key, false).unwrap(); + let value = header_value(value.into_maybe_static().unwrap(), false).unwrap(); + self.headers + .insert(key, value) + .map(|old_value| old_value.into()) + } + + /// Insert a value into the headers structure. + /// + /// This will *replace* any existing value for this key. Returns the previous associated value if any. + /// + /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will return an error. + pub fn try_insert( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Result, HttpError> { + let key = header_name(key, true)?; + let value = header_value(value.into_maybe_static()?, true)?; + Ok(self + .headers + .insert(key, value) + .map(|old_value| old_value.into())) + } + + /// Appends a value to a given key + /// + /// # Panics + /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will panic. + pub fn append(&mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent) -> bool { + let key = header_name(key.into_maybe_static().unwrap(), false).unwrap(); + let value = header_value(value.into_maybe_static().unwrap(), false).unwrap(); + self.headers.append(key, value) + } + + /// Appends a value to a given key + /// + /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will return an error. + pub fn try_append( + &mut self, + key: impl AsHeaderComponent, + value: impl AsHeaderComponent, + ) -> Result { + let key = header_name(key.into_maybe_static()?, true)?; + let value = header_value(value.into_maybe_static()?, true)?; + Ok(self.headers.append(key, value)) + } + + /// Removes all headers with a given key + /// + /// If there are multiple entries for this key, the first entry is returned + pub fn remove(&mut self, key: impl AsRef) -> Option { + self.headers + .remove(key.as_ref()) + .map(|h| h.as_str().to_string()) + } +} + +#[cfg(feature = "http-02x")] +impl TryFrom for Headers { + type Error = HttpError; + + fn try_from(value: HeaderMap) -> Result { + if let Some(e) = value + .values() + .filter_map(|value| std::str::from_utf8(value.as_bytes()).err()) + .next() + { + Err(HttpError::header_was_not_a_string(e)) + } else { + let mut string_safe_headers: HeaderMap = Default::default(); + string_safe_headers.extend( + value + .into_iter() + .map(|(k, v)| (k, HeaderValue::from_http02x(v).expect("validated above"))), + ); + Ok(Headers { + headers: string_safe_headers, + }) + } + } +} + +use sealed::AsHeaderComponent; + +mod sealed { + use super::*; + /// Trait defining things that may be converted into a header component (name or value) + pub trait AsHeaderComponent { + /// If the component can be represented as a Cow<'static, str>, return it + fn into_maybe_static(self) -> Result; + + /// Return a string reference to this header + fn as_str(&self) -> Result<&str, HttpError>; + + /// If a component is already internally represented as a `http02x::HeaderName`, return it + fn repr_as_http02x_header_name(self) -> Result + where + Self: Sized, + { + Err(self) + } + } + + impl AsHeaderComponent for &'static str { + fn into_maybe_static(self) -> Result { + Ok(Cow::Borrowed(self)) + } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self) + } + } + + impl AsHeaderComponent for String { + fn into_maybe_static(self) -> Result { + Ok(Cow::Owned(self)) + } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self) + } + } + + impl AsHeaderComponent for Cow<'static, str> { + fn into_maybe_static(self) -> Result { + Ok(self) + } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self.as_ref()) + } + } + + impl AsHeaderComponent for http0::HeaderValue { + fn into_maybe_static(self) -> Result { + Ok(Cow::Owned( + std::str::from_utf8(self.as_bytes()) + .map_err(HttpError::header_was_not_a_string)? + .to_string(), + )) + } + + fn as_str(&self) -> Result<&str, HttpError> { + std::str::from_utf8(self.as_bytes()).map_err(HttpError::header_was_not_a_string) + } + } + + impl AsHeaderComponent for http0::HeaderName { + fn into_maybe_static(self) -> Result { + Ok(self.to_string().into()) + } + + fn as_str(&self) -> Result<&str, HttpError> { + Ok(self.as_ref()) + } + + fn repr_as_http02x_header_name(self) -> Result + where + Self: Sized, + { + Ok(self) + } + } +} + +mod header_value { + use super::*; + use std::str::Utf8Error; + + /// HeaderValue type + /// + /// **Note**: Unlike `HeaderValue` in `http`, this only supports UTF-8 header values + #[derive(Debug, Clone)] + pub struct HeaderValue { + _private: http0::HeaderValue, + } + + impl HeaderValue { + pub(crate) fn from_http02x(value: http0::HeaderValue) -> Result { + let _ = std::str::from_utf8(value.as_bytes())?; + Ok(Self { _private: value }) + } + + #[allow(dead_code)] + pub(crate) fn into_http02x(self) -> http0::HeaderValue { + self._private + } + } + + impl AsRef for HeaderValue { + fn as_ref(&self) -> &str { + std::str::from_utf8(self._private.as_bytes()) + .expect("unreachable—only strings may be stored") + } + } + + impl From for String { + fn from(value: HeaderValue) -> Self { + value.as_ref().to_string() + } + } + + impl HeaderValue { + /// Returns the string representation of this header value + pub fn as_str(&self) -> &str { + self.as_ref() + } + } + + impl FromStr for HeaderValue { + type Err = HttpError; + + fn from_str(s: &str) -> Result { + HeaderValue::try_from(s.to_string()) + } + } + + impl TryFrom for HeaderValue { + type Error = HttpError; + + fn try_from(value: String) -> Result { + Ok(HeaderValue::from_http02x( + http0::HeaderValue::try_from(value).map_err(HttpError::invalid_header_value)?, + ) + .expect("input was a string")) + } + } +} + +pub use header_value::HeaderValue; + +type MaybeStatic = Cow<'static, str>; + +fn header_name( + name: impl AsHeaderComponent, + panic_safe: bool, +) -> Result { + name.repr_as_http02x_header_name().or_else(|name| { + name.into_maybe_static().and_then(|mut cow| { + if cow.chars().any(|c| c.is_ascii_uppercase()) { + cow = Cow::Owned(cow.to_ascii_uppercase()); + } + match cow { + Cow::Borrowed(s) if panic_safe => { + http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name) + } + Cow::Borrowed(staticc) => Ok(http0::HeaderName::from_static(staticc)), + Cow::Owned(s) => { + http0::HeaderName::try_from(s).map_err(HttpError::invalid_header_name) + } + } + }) + }) +} + +fn header_value(value: MaybeStatic, panic_safe: bool) -> Result { + let header = match value { + Cow::Borrowed(b) if panic_safe => { + http0::HeaderValue::try_from(b).map_err(HttpError::invalid_header_value)? + } + Cow::Borrowed(b) => http0::HeaderValue::from_static(b), + Cow::Owned(s) => { + http0::HeaderValue::try_from(s).map_err(HttpError::invalid_header_value)? + } + }; + HeaderValue::from_http02x(header).map_err(HttpError::new) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn headers_can_be_any_string() { + let _: HeaderValue = "😹".parse().expect("can be any string"); + let _: HeaderValue = "abcd".parse().expect("can be any string"); + let _ = "a\nb" + .parse::() + .expect_err("cannot contain control characters"); + } + + #[test] + fn no_panic_insert_upper_case_header_name() { + let mut headers = Headers::new(); + headers.insert("I-Have-Upper-Case", "foo"); + } + #[test] + fn no_panic_append_upper_case_header_name() { + let mut headers = Headers::new(); + headers.append("I-Have-Upper-Case", "foo"); + } + + #[test] + #[should_panic] + fn panic_insert_invalid_ascii_key() { + let mut headers = Headers::new(); + headers.insert("💩", "foo"); + } + #[test] + #[should_panic] + fn panic_insert_invalid_header_value() { + let mut headers = Headers::new(); + headers.insert("foo", "💩"); + } + #[test] + #[should_panic] + fn panic_append_invalid_ascii_key() { + let mut headers = Headers::new(); + headers.append("💩", "foo"); + } + #[test] + #[should_panic] + fn panic_append_invalid_header_value() { + let mut headers = Headers::new(); + headers.append("foo", "💩"); + } + + #[test] + fn no_panic_try_insert_invalid_ascii_key() { + let mut headers = Headers::new(); + assert!(headers.try_insert("💩", "foo").is_err()); + } + #[test] + fn no_panic_try_insert_invalid_header_value() { + let mut headers = Headers::new(); + assert!(headers + .try_insert( + "foo", + // Valid header value with invalid UTF-8 + http0::HeaderValue::from_bytes(&[0xC0, 0x80]).unwrap() + ) + .is_err()); + } + #[test] + fn no_panic_try_append_invalid_ascii_key() { + let mut headers = Headers::new(); + assert!(headers.try_append("💩", "foo").is_err()); + } + #[test] + fn no_panic_try_append_invalid_header_value() { + let mut headers = Headers::new(); + assert!(headers + .try_insert( + "foo", + // Valid header value with invalid UTF-8 + http0::HeaderValue::from_bytes(&[0xC0, 0x80]).unwrap() + ) + .is_err()); + } + + proptest::proptest! { + #[test] + fn insert_header_prop_test(input in ".*") { + let mut headers = Headers::new(); + let _ = headers.try_insert(input.clone(), input); + } + + #[test] + fn append_header_prop_test(input in ".*") { + let mut headers = Headers::new(); + let _ = headers.try_append(input.clone(), input); + } + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/request.rs b/rust-runtime/aws-smithy-runtime-api/src/http/request.rs new file mode 100644 index 00000000000..ee87e57f1d7 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http/request.rs @@ -0,0 +1,397 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Http Request Types + +use crate::http::Headers; +use crate::http::HttpError; +use aws_smithy_types::body::SdkBody; +use http as http0; +use http0::uri::PathAndQuery; +use http0::{Extensions, Method}; +use std::borrow::Cow; + +/// Parts struct useful for structural decomposition that the [`Request`] type can be converted into. +#[non_exhaustive] +pub struct RequestParts { + /// Request URI. + pub uri: Uri, + /// Request headers. + pub headers: Headers, + /// Request body. + pub body: B, +} + +#[derive(Debug)] +/// An HTTP Request Type +pub struct Request { + body: B, + uri: Uri, + method: Method, + extensions_02x: Extensions, + headers: Headers, +} + +/// A Request URI +#[derive(Debug, Clone)] +pub struct Uri { + as_string: String, + parsed: http0::Uri, +} + +impl Uri { + /// Sets `endpoint` as the endpoint for a URL. + /// + /// An `endpoint` MUST contain a scheme and authority. + /// An `endpoint` MAY contain a port and path. + /// + /// An `endpoint` MUST NOT contain a query + pub fn set_endpoint(&mut self, endpoint: &str) -> Result<(), HttpError> { + let endpoint: http0::Uri = endpoint.parse().map_err(HttpError::invalid_uri)?; + let endpoint = endpoint.into_parts(); + let authority = endpoint + .authority + .ok_or_else(|| HttpError::new("endpoint must contain authority"))?; + let scheme = endpoint + .scheme + .ok_or_else(|| HttpError::new("endpoint must have scheme"))?; + let new_uri = http0::Uri::builder() + .authority(authority) + .scheme(scheme) + .path_and_query(merge_paths(endpoint.path_and_query, &self.parsed).as_ref()) + .build() + .map_err(HttpError::new)?; + self.as_string = new_uri.to_string(); + self.parsed = new_uri; + Ok(()) + } + + /// Returns the URI path. + pub fn path(&self) -> &str { + self.parsed.path() + } + + /// Returns the URI query string. + pub fn query(&self) -> Option<&str> { + self.parsed.query() + } + + fn from_http0x_uri(uri: http0::Uri) -> Self { + Self { + as_string: uri.to_string(), + parsed: uri, + } + } +} + +fn merge_paths(endpoint_path: Option, uri: &http0::Uri) -> Cow<'_, str> { + let uri_path_and_query = uri.path_and_query().map(|pq| pq.as_str()).unwrap_or(""); + let endpoint_path = match endpoint_path { + None => return Cow::Borrowed(uri_path_and_query), + Some(path) => path, + }; + if let Some(query) = endpoint_path.query() { + tracing::warn!(query = %query, "query specified in endpoint will be ignored during endpoint resolution"); + } + let endpoint_path = endpoint_path.path(); + if endpoint_path.is_empty() { + Cow::Borrowed(uri_path_and_query) + } else { + let ep_no_slash = endpoint_path.strip_suffix('/').unwrap_or(endpoint_path); + let uri_path_no_slash = uri_path_and_query + .strip_prefix('/') + .unwrap_or(uri_path_and_query); + Cow::Owned(format!("{}/{}", ep_no_slash, uri_path_no_slash)) + } +} + +impl TryFrom for Uri { + type Error = HttpError; + + fn try_from(value: String) -> Result { + let parsed = value.parse().map_err(HttpError::invalid_uri)?; + Ok(Uri { + as_string: value, + parsed, + }) + } +} + +impl<'a> TryFrom<&'a str> for Uri { + type Error = HttpError; + fn try_from(value: &'a str) -> Result { + Self::try_from(value.to_string()) + } +} + +#[cfg(feature = "http-02x")] +impl From for Uri { + fn from(value: http::Uri) -> Self { + Uri::from_http0x_uri(value) + } +} + +#[cfg(feature = "http-02x")] +impl TryInto> for Request { + type Error = HttpError; + + fn try_into(self) -> Result, Self::Error> { + self.try_into_http02x() + } +} + +impl Request { + /// Converts this request into an http 0.x request. + /// + /// Depending on the internal storage type, this operation may be free or it may have an internal + /// cost. + #[cfg(feature = "http-02x")] + pub fn try_into_http02x(self) -> Result, HttpError> { + let mut req = http::Request::builder() + .uri(self.uri.parsed) + .method(self.method) + .body(self.body) + .expect("known valid"); + let mut headers = http0::HeaderMap::new(); + headers.reserve(self.headers.headers.len()); + headers.extend( + self.headers + .headers + .into_iter() + .map(|(k, v)| (k, v.into_http02x())), + ); + *req.headers_mut() = headers; + *req.extensions_mut() = self.extensions_02x; + Ok(req) + } + + /// Update the body of this request to be a new body. + pub fn map(self, f: impl Fn(B) -> U) -> Request { + Request { + body: f(self.body), + uri: self.uri, + method: self.method, + extensions_02x: self.extensions_02x, + headers: self.headers, + } + } + + /// Returns a GET request with no URI + pub fn new(body: B) -> Self { + Self { + body, + uri: Uri::from_http0x_uri(http0::Uri::from_static("/")), + method: Method::GET, + extensions_02x: Default::default(), + headers: Default::default(), + } + } + + /// Convert this request into its parts. + pub fn into_parts(self) -> RequestParts { + RequestParts { + uri: self.uri, + headers: self.headers, + body: self.body, + } + } + + /// Returns a reference to the header map + pub fn headers(&self) -> &Headers { + &self.headers + } + + /// Returns a mutable reference to the header map + pub fn headers_mut(&mut self) -> &mut Headers { + &mut self.headers + } + + /// Returns the body associated with the request + pub fn body(&self) -> &B { + &self.body + } + + /// Returns a mutable reference to the body + pub fn body_mut(&mut self) -> &mut B { + &mut self.body + } + + /// Converts this request into the request body. + pub fn into_body(self) -> B { + self.body + } + + /// Returns the method associated with this request + pub fn method(&self) -> &str { + self.method.as_str() + } + + /// Returns the URI associated with this request + pub fn uri(&self) -> &str { + &self.uri.as_string + } + + /// Returns a mutable reference the the URI of this http::Request + pub fn uri_mut(&mut self) -> &mut Uri { + &mut self.uri + } + + /// Sets the URI of this request + pub fn set_uri(&mut self, uri: U) -> Result<(), U::Error> + where + U: TryInto, + { + let uri = uri.try_into()?; + self.uri = uri; + Ok(()) + } + + /// Adds an extension to the request extensions + pub fn add_extension(&mut self, extension: T) { + self.extensions_02x.insert(extension); + } +} + +impl Request { + /// Attempts to clone this request + /// + /// On clone, any extensions will be cleared. + /// + /// If the body is cloneable, this will clone the request. Otherwise `None` will be returned + pub fn try_clone(&self) -> Option { + let body = self.body().try_clone()?; + Some(Self { + body, + uri: self.uri.clone(), + method: self.method.clone(), + extensions_02x: Extensions::new(), + headers: self.headers.clone(), + }) + } + + /// Replaces this request's body with [`SdkBody::taken()`] + pub fn take_body(&mut self) -> SdkBody { + std::mem::replace(self.body_mut(), SdkBody::taken()) + } + + /// Create a GET request to `/` with an empty body + pub fn empty() -> Self { + Self::new(SdkBody::empty()) + } + + /// Creates a GET request to `uri` with an empty body + pub fn get(uri: impl AsRef) -> Result { + let mut req = Self::new(SdkBody::empty()); + req.set_uri(uri.as_ref())?; + Ok(req) + } +} + +#[cfg(feature = "http-02x")] +impl TryFrom> for Request { + type Error = HttpError; + + fn try_from(value: http::Request) -> Result { + let (parts, body) = value.into_parts(); + let headers = Headers::try_from(parts.headers)?; + // we need to do this eventually. + /*if !parts.extensions.is_empty() { + return Err(HttpError::new( + "Cannot convert non-empty extensions. Clear extensions before converting", + )); + }*/ + Ok(Self { + body, + uri: parts.uri.into(), + method: parts.method, + extensions_02x: http::Extensions::new(), + headers, + }) + } +} + +#[cfg(all(test, feature = "http-02x"))] +mod test { + use super::*; + use aws_smithy_types::body::SdkBody; + use http::header::{AUTHORIZATION, CONTENT_LENGTH}; + use http::Uri; + + #[test] + fn non_ascii_requests() { + let request = http::Request::builder() + .header("k", "😹") + .body(SdkBody::empty()) + .unwrap(); + let request: Request = request + .try_into() + .expect("failed to convert a non-string header"); + assert_eq!(request.headers().get("k"), Some("😹")) + } + + #[test] + fn request_can_be_created() { + let req = http::Request::builder() + .uri("http://foo.com") + .body(SdkBody::from("hello")) + .unwrap(); + let mut req = super::Request::try_from(req).unwrap(); + req.headers_mut().insert("a", "b"); + assert_eq!(req.headers().get("a").unwrap(), "b"); + req.headers_mut().append("a", "c"); + assert_eq!(req.headers().get("a").unwrap(), "b"); + let http0 = req.try_into_http02x().unwrap(); + assert_eq!(http0.uri(), "http://foo.com"); + } + + #[test] + fn uri_mutations() { + let req = http::Request::builder() + .uri("http://foo.com") + .body(SdkBody::from("hello")) + .unwrap(); + let mut req = super::Request::try_from(req).unwrap(); + assert_eq!(req.uri(), "http://foo.com/"); + req.set_uri("http://bar.com").unwrap(); + assert_eq!(req.uri(), "http://bar.com"); + let http0 = req.try_into_http02x().unwrap(); + assert_eq!(http0.uri(), "http://bar.com"); + } + + #[test] + #[should_panic] + fn header_panics() { + let req = http::Request::builder() + .uri("http://foo.com") + .body(SdkBody::from("hello")) + .unwrap(); + let mut req = super::Request::try_from(req).unwrap(); + let _ = req + .headers_mut() + .try_insert("a\nb", "a\nb") + .expect_err("invalid header"); + let _ = req.headers_mut().insert("a\nb", "a\nb"); + } + + #[test] + fn try_clone_clones_all_data() { + let request = ::http::Request::builder() + .uri(Uri::from_static("https://www.amazon.com")) + .method("POST") + .header(CONTENT_LENGTH, 456) + .header(AUTHORIZATION, "Token: hello") + .body(SdkBody::from("hello world!")) + .expect("valid request"); + let request: super::Request = request.try_into().unwrap(); + let cloned = request.try_clone().expect("request is cloneable"); + + assert_eq!("https://www.amazon.com/", cloned.uri()); + assert_eq!("POST", cloned.method()); + assert_eq!(2, cloned.headers().len()); + assert_eq!("Token: hello", cloned.headers().get(AUTHORIZATION).unwrap(),); + assert_eq!("456", cloned.headers().get(CONTENT_LENGTH).unwrap()); + assert_eq!("hello world!".as_bytes(), cloned.body().bytes().unwrap()); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/http/response.rs b/rust-runtime/aws-smithy-runtime-api/src/http/response.rs new file mode 100644 index 00000000000..84ad832758b --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/http/response.rs @@ -0,0 +1,255 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Http Response Types + +use crate::http::{Headers, HttpError}; +use aws_smithy_types::body::SdkBody; +use http as http0; +use std::fmt; + +/// HTTP response status code +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub struct StatusCode(u16); + +impl StatusCode { + /// True if this is a successful response code (200, 201, etc) + pub fn is_success(self) -> bool { + (200..300).contains(&self.0) + } + + /// True if this response code is a client error (4xx) + pub fn is_client_error(self) -> bool { + (400..500).contains(&self.0) + } + + /// True if this response code is a server error (5xx) + pub fn is_server_error(self) -> bool { + (500..600).contains(&self.0) + } + + /// Return the value of this status code as a `u16`. + pub fn as_u16(self) -> u16 { + self.0 + } +} + +impl TryFrom for StatusCode { + type Error = HttpError; + + fn try_from(value: u16) -> Result { + if (100..1000).contains(&value) { + Ok(StatusCode(value)) + } else { + Err(HttpError::invalid_status_code()) + } + } +} + +#[cfg(feature = "http-02x")] +impl From for StatusCode { + fn from(value: http0::StatusCode) -> Self { + Self(value.as_u16()) + } +} + +impl From for u16 { + fn from(value: StatusCode) -> Self { + value.0 + } +} + +impl fmt::Display for StatusCode { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.0.fmt(f) + } +} + +/// An HTTP Response Type +#[derive(Debug)] +pub struct Response { + status: StatusCode, + headers: Headers, + body: B, + extensions: http0::Extensions, +} + +impl Response { + /// Converts this response into an http 0.x response. + /// + /// Depending on the internal storage type, this operation may be free or it may have an internal + /// cost. + #[cfg(feature = "http-02x")] + pub fn try_into_http02x(self) -> Result, HttpError> { + let mut res = http::Response::builder() + .status( + http0::StatusCode::from_u16(self.status.into()) + .expect("validated upon construction"), + ) + .body(self.body) + .expect("known valid"); + let mut headers = http0::HeaderMap::new(); + headers.extend( + self.headers + .headers + .into_iter() + .map(|(k, v)| (k, v.into_http02x())), + ); + *res.headers_mut() = headers; + *res.extensions_mut() = self.extensions; + Ok(res) + } + + /// Update the body of this response to be a new body. + pub fn map(self, f: impl Fn(B) -> U) -> Response { + Response { + status: self.status, + body: f(self.body), + extensions: self.extensions, + headers: self.headers, + } + } + + /// Returns a response with the given status and body + pub fn new(status: StatusCode, body: B) -> Self { + Self { + status, + body, + extensions: Default::default(), + headers: Default::default(), + } + } + + /// Returns the status code + pub fn status(&self) -> StatusCode { + self.status + } + + /// Returns a mutable reference to the status code + pub fn status_mut(&mut self) -> &mut StatusCode { + &mut self.status + } + + /// Returns a reference to the header map + pub fn headers(&self) -> &Headers { + &self.headers + } + + /// Returns a mutable reference to the header map + pub fn headers_mut(&mut self) -> &mut Headers { + &mut self.headers + } + + /// Returns the body associated with the request + pub fn body(&self) -> &B { + &self.body + } + + /// Returns a mutable reference to the body + pub fn body_mut(&mut self) -> &mut B { + &mut self.body + } + + /// Converts this response into the response body. + pub fn into_body(self) -> B { + self.body + } + + /// Adds an extension to the response extensions + pub fn add_extension(&mut self, extension: T) { + self.extensions.insert(extension); + } +} + +impl Response { + /// Replaces this response's body with [`SdkBody::taken()`] + pub fn take_body(&mut self) -> SdkBody { + std::mem::replace(self.body_mut(), SdkBody::taken()) + } +} + +#[cfg(feature = "http-02x")] +impl TryFrom> for Response { + type Error = HttpError; + + fn try_from(value: http0::Response) -> Result { + use crate::http::headers::HeaderValue; + use http0::HeaderMap; + if let Some(e) = value + .headers() + .values() + .filter_map(|value| std::str::from_utf8(value.as_bytes()).err()) + .next() + { + Err(HttpError::header_was_not_a_string(e)) + } else { + let (parts, body) = value.into_parts(); + let mut string_safe_headers: HeaderMap = Default::default(); + string_safe_headers.extend( + parts + .headers + .into_iter() + .map(|(k, v)| (k, HeaderValue::from_http02x(v).expect("validated above"))), + ); + Ok(Self { + status: StatusCode::try_from(parts.status.as_u16()).expect("validated by http 0.x"), + body, + extensions: parts.extensions, + headers: Headers { + headers: string_safe_headers, + }, + }) + } + } +} + +#[cfg(all(test, feature = "http-02x"))] +mod test { + use super::*; + use aws_smithy_types::body::SdkBody; + + #[test] + fn non_ascii_responses() { + let response = http::Response::builder() + .status(200) + .header("k", "😹") + .body(SdkBody::empty()) + .unwrap(); + let response: Response = response + .try_into() + .expect("failed to convert a non-string header"); + assert_eq!(response.headers().get("k"), Some("😹")) + } + + #[test] + fn response_can_be_created() { + let req = http::Response::builder() + .status(200) + .body(SdkBody::from("hello")) + .unwrap(); + let mut req = super::Response::try_from(req).unwrap(); + req.headers_mut().insert("a", "b"); + assert_eq!("b", req.headers().get("a").unwrap()); + req.headers_mut().append("a", "c"); + assert_eq!("b", req.headers().get("a").unwrap()); + let http0 = req.try_into_http02x().unwrap(); + assert_eq!(200, http0.status().as_u16()); + } + + #[test] + #[should_panic] + fn header_panics() { + let res = http::Response::builder() + .status(200) + .body(SdkBody::from("hello")) + .unwrap(); + let mut res = Response::try_from(res).unwrap(); + let _ = res + .headers_mut() + .try_insert("a\nb", "a\nb") + .expect_err("invalid header"); + let _ = res.headers_mut().insert("a\nb", "a\nb"); + } +} diff --git a/rust-runtime/aws-smithy-runtime-api/src/lib.rs b/rust-runtime/aws-smithy-runtime-api/src/lib.rs index 8cc3db6309e..be0ca84d613 100644 --- a/rust-runtime/aws-smithy-runtime-api/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime-api/src/lib.rs @@ -4,19 +4,33 @@ */ #![warn( - // missing_docs, + missing_docs, rustdoc::missing_crate_level_docs, unreachable_pub, rust_2018_idioms )] #![allow(clippy::new_without_default)] -//! Basic types for the new smithy client orchestrator. +//! APIs needed to configure and customize the Smithy generated code. +//! +//! Most users will not need to use this crate directly as the most frequently used +//! APIs are re-exported in the generated clients. However, this crate will be useful +//! for anyone writing a library for others to use with their generated clients. +//! +//! If you're needing to depend on this and you're not writing a library for Smithy +//! generated clients, then please file an issue on [smithy-rs](https://github.com/smithy-lang/smithy-rs) +//! as we likely missed re-exporting one of the APIs. +//! +//! All client-specific code is in the [`client`](crate::client) root level module +//! to leave room for smithy-rs server APIs in the future. /// A boxed error that is `Send` and `Sync`. pub mod box_error; -/// Smithy runtime for client orchestration. +/// APIs for client orchestration. +#[cfg(feature = "client")] pub mod client; -pub mod macros; +pub mod http; + +pub mod shared; diff --git a/rust-runtime/aws-smithy-runtime-api/src/macros.rs b/rust-runtime/aws-smithy-runtime-api/src/macros.rs deleted file mode 100644 index 09efd0a74c9..00000000000 --- a/rust-runtime/aws-smithy-runtime-api/src/macros.rs +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Various utility macros to aid runtime crate writers. - -/// Define a new builder struct, along with a method to create it, and setters. -/// -/// ## Examples -/// -/// The builder macro takes a list of field definitions, each with four elements: -/// ```txt -/// set_optional_field, optional_field, String, "An optional field which may or may not be set when `.build()` is called.", -/// ^ The setter name, ^ The field name, ^ The type, ^ The documentation for the field and setter methods. -/// ``` -/// -/// The following example creates a new builder struct, along with a method to create it, and setters -/// for a struct `MyConfig` with three fields: -/// -/// ``` -/// use std::collections::HashMap; -/// use std::sync::{Arc, Mutex}; -/// use aws_smithy_runtime_api::{builder, builder_methods, builder_struct}; -/// -/// struct MyConfig { -/// optional_field: Option, -/// optional_field_with_a_default: f64, -/// required_field_with_no_default: Arc>>, -/// } -/// -/// impl MyConfig { -/// pub fn builder() -> Builder { -/// Builder::new() -/// } -/// } -/// -/// builder!( -/// set_optional_field, optional_field, String, "An optional field which may or may not be set when `.build()` is called.", -/// set_optional_field_with_a_default, optional_field_with_a_default, f64, "An optional field that will default to `f64::MAX` if it's unset when `.build()` is called.", -/// set_required_field_with_no_default, required_field_with_no_default, HashMap, "A required field that will cause the builder to panic if it's unset when `.build()` is called." -/// ); -/// -/// impl Builder { -/// fn build(self) -> MyConfig { -/// MyConfig { -/// optional_field: self.optional_field, -/// optional_field_with_a_default: self.optional_field_with_a_default.unwrap_or(f64::MAX), -/// required_field_with_no_default: Arc::new(Mutex::new( -/// self.required_field_with_no_default.expect("'required_field_with_no_default' is required") -/// )), -/// } -/// } -/// } -/// ``` -/// -/// In this example, the result of macro expansion would look like this: -/// -/// ``` -/// # use std::collections::HashMap; -/// # use std::sync::{Arc, Mutex}; -/// #[derive(Clone, Debug, Default)] -/// pub struct Builder { -/// #[doc = "An optional field which may or may not be set when `.build()` is called."] -/// optional_field: Option, -/// #[doc = "An optional field that will default to `f64::MAX` if it's unset when `.build()` is called."] -/// optional_field_with_a_default: Option, -/// #[doc = "A required field that will cause the builder to panic if it's unset when `.build()` is called."] -/// required_field_with_no_default: Option>, -/// } -/// -/// impl Builder { -/// pub fn new() -> Self { -/// Builder::default() -/// } -/// -/// #[doc = "An optional field which may or may not be set when `.build()` is called."] -/// pub fn set_optional_field(&mut self, optional_field: Option) -> &mut Self { -/// self.optional_field = optional_field; -/// self -/// } -/// -/// #[doc = "An optional field which may or may not be set when `.build()` is called."] -/// pub fn optional_field(mut self, optional_field: String) -> Self { -/// self.optional_field = Some(optional_field); -/// self -/// } -/// -/// #[doc = "An optional field that will default to `f64::MAX` if it's unset when `.build()` is called."] -/// pub fn set_optional_field_with_a_default(&mut self, optional_field_with_a_default: Option) -> &mut Self { -/// self.optional_field_with_a_default = optional_field_with_a_default; -/// self -/// } -/// -/// #[doc = "An optional field that will default to `f64::MAX` if it's unset when `.build()` is called."] -/// pub fn optional_field_with_a_default(mut self, optional_field_with_a_default: f64) -> Self { -/// self.optional_field_with_a_default = Some(optional_field_with_a_default); -/// self -/// } -/// -/// #[doc = "A required field that will cause the builder to panic if it's unset when `.build()` is called."] -/// pub fn set_required_field_with_no_default(&mut self, required_field_with_no_default: Option>) -> &mut Self { -/// self.required_field_with_no_default = required_field_with_no_default; -/// self -/// } -/// -/// #[doc = "A required field that will cause the builder to panic if it's unset when `.build()` is called."] -/// pub fn required_field_with_no_default(mut self, required_field_with_no_default: HashMap) -> Self { -/// self.required_field_with_no_default = Some(required_field_with_no_default); -/// self -/// } -/// } -/// ``` -#[macro_export] -macro_rules! builder { - ($($tt:tt)+) => { - builder_struct!($($tt)+); - - impl Builder { - pub fn new() -> Self { - Builder::default() - } - - builder_methods!($($tt)+); - } - } -} - -/// Define a new builder struct, its fields, and their docs. This macro is intended to be called -/// by the `builder!` macro and should not be called directly. -#[macro_export] -macro_rules! builder_struct { - ($($_setter_name:ident, $field_name:ident, $ty:ty, $doc:literal $(,)?)+) => { - #[derive(Clone, Debug, Default)] - pub struct Builder { - $( - #[doc = $doc] - $field_name: Option<$ty>, - )+ - } - } -} - -/// Define setter methods for a builder struct. Must be called from within an `impl` block. This -/// macro is intended to be called by the `builder!` macro and should not be called directly. -#[macro_export] -macro_rules! builder_methods { - ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal, $($tail:tt)+) => { - builder_methods!($fn_name, $arg_name, $ty, $doc); - builder_methods!($($tail)+); - }; - ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal) => { - #[doc = $doc] - pub fn $fn_name(&mut self, $arg_name: Option<$ty>) -> &mut Self { - self.$arg_name = $arg_name; - self - } - - #[doc = $doc] - pub fn $arg_name(mut self, $arg_name: $ty) -> Self { - self.$arg_name = Some($arg_name); - self - } - }; -} diff --git a/rust-runtime/aws-smithy-runtime-api/src/shared.rs b/rust-runtime/aws-smithy-runtime-api/src/shared.rs new file mode 100644 index 00000000000..cd15a135062 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime-api/src/shared.rs @@ -0,0 +1,233 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Conversion traits for converting an unshared type into a shared type. +//! +//! The standard [`From`](std::convert::From)/[`Into`](std::convert::Into) traits can't be +//! used for this purpose due to the blanket implementation of `Into`. +//! +//! This implementation also adds a [`maybe_shared`] method and [`impl_shared_conversions`](crate::impl_shared_conversions) +//! macro to trivially avoid nesting shared types with other shared types. +//! +//! # What is a shared type? +//! +//! A shared type is a new-type around a `Send + Sync` reference counting smart pointer +//! (i.e., an [`Arc`](std::sync::Arc)) around an object-safe trait. Shared types are +//! used to share a trait object among multiple threads/clients/requests. +#![cfg_attr( + feature = "client", + doc = " +For example, [`SharedHttpConnector`](crate::client::http::SharedHttpConnector), is +a shared type for the [`HttpConnector`](crate::client::http::HttpConnector) trait, +which allows for sharing a single HTTP connector instance (and its connection pool) among multiple clients. +" +)] +//! +//! A shared type implements the [`FromUnshared`] trait, which allows any implementation +//! of the trait it wraps to easily be converted into it. +//! +#![cfg_attr( + feature = "client", + doc = " +To illustrate, let's examine the +[`RuntimePlugin`](crate::client::runtime_plugin::RuntimePlugin)/[`SharedRuntimePlugin`](crate::client::runtime_plugin::SharedRuntimePlugin) +duo. +The following instantiates a concrete implementation of the `RuntimePlugin` trait. +We can do `RuntimePlugin` things on this instance. + +```rust,no_run +use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; + +let some_plugin = StaticRuntimePlugin::new(); +``` + +We can convert this instance into a shared type in two different ways. + +```rust,no_run +# use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin; +# let some_plugin = StaticRuntimePlugin::new(); +use aws_smithy_runtime_api::client::runtime_plugin::SharedRuntimePlugin; +use aws_smithy_runtime_api::shared::{IntoShared, FromUnshared}; + +// Using the `IntoShared` trait +let shared: SharedRuntimePlugin = some_plugin.into_shared(); + +// Using the `FromUnshared` trait: +# let some_plugin = StaticRuntimePlugin::new(); +let shared = SharedRuntimePlugin::from_unshared(some_plugin); +``` + +The `IntoShared` trait is useful for making functions that take any `RuntimePlugin` impl and convert it to a shared type. +For example, this function will convert the given `plugin` argument into a `SharedRuntimePlugin`. + +```rust,no_run +# use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin}; +use aws_smithy_runtime_api::shared::IntoShared; + +fn take_shared(plugin: impl RuntimePlugin + 'static) { + let _plugin: SharedRuntimePlugin = plugin.into_shared(); +} +``` + +This can be called with different types, and even if a `SharedRuntimePlugin` is passed in, it won't nest that +`SharedRuntimePlugin` inside of another `SharedRuntimePlugin`. + +```rust,no_run +# use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin, StaticRuntimePlugin}; +# use aws_smithy_runtime_api::shared::{IntoShared, FromUnshared}; +# fn take_shared(plugin: impl RuntimePlugin + 'static) { +# let _plugin: SharedRuntimePlugin = plugin.into_shared(); +# } +// Automatically converts it to `SharedRuntimePlugin(StaticRuntimePlugin)` +take_shared(StaticRuntimePlugin::new()); + +// This is OK. +// It create a `SharedRuntimePlugin(StaticRuntimePlugin))` +// instead of a nested `SharedRuntimePlugin(SharedRuntimePlugin(StaticRuntimePlugin)))` +take_shared(SharedRuntimePlugin::new(StaticRuntimePlugin::new())); +``` +" +)] + +use std::any::{Any, TypeId}; + +/// Like the `From` trait, but for converting to a shared type. +/// +/// See the [module docs](crate::shared) for information about shared types. +pub trait FromUnshared { + /// Creates a shared type from an unshared type. + fn from_unshared(value: Unshared) -> Self; +} + +/// Like the `Into` trait, but for (efficiently) converting into a shared type. +/// +/// If the type is already a shared type, it won't be nested in another shared type. +/// +/// See the [module docs](crate::shared) for information about shared types. +pub trait IntoShared { + /// Creates a shared type from an unshared type. + fn into_shared(self) -> Shared; +} + +impl IntoShared for Unshared +where + Shared: FromUnshared, +{ + fn into_shared(self) -> Shared { + FromUnshared::from_unshared(self) + } +} + +/// Given a `value`, determine if that value is already shared. If it is, return it. Otherwise, wrap it in a shared type. +/// +/// See the [module docs](crate::shared) for information about shared types. +pub fn maybe_shared(value: MaybeShared, ctor: F) -> Shared +where + Shared: 'static, + MaybeShared: IntoShared + 'static, + F: FnOnce(MaybeShared) -> Shared, +{ + // Check if the type is already a shared type + if TypeId::of::() == TypeId::of::() { + // Convince the compiler it is already a shared type and return it + let mut placeholder = Some(value); + let value: Shared = (&mut placeholder as &mut dyn Any) + .downcast_mut::>() + .expect("type checked above") + .take() + .expect("set to Some above"); + value + } else { + (ctor)(value) + } +} + +/// Implements `FromUnshared` for a shared type. +/// +/// See the [`shared` module docs](crate::shared) for information about shared types. +/// +/// # Example +/// ```rust,no_run +/// use aws_smithy_runtime_api::impl_shared_conversions; +/// use std::sync::Arc; +/// +/// trait Thing {} +/// +/// struct Thingamajig; +/// impl Thing for Thingamajig {} +/// +/// struct SharedThing(Arc); +/// impl Thing for SharedThing {} +/// impl SharedThing { +/// fn new(thing: impl Thing + 'static) -> Self { +/// Self(Arc::new(thing)) +/// } +/// } +/// impl_shared_conversions!(convert SharedThing from Thing using SharedThing::new); +/// ``` +#[macro_export] +macro_rules! impl_shared_conversions { + (convert $shared_type:ident from $unshared_trait:ident using $ctor:expr) => { + impl $crate::shared::FromUnshared for $shared_type + where + T: $unshared_trait + 'static, + { + fn from_unshared(value: T) -> Self { + $crate::shared::maybe_shared(value, $ctor) + } + } + }; +} + +// TODO(https://github.com/smithy-lang/smithy-rs/issues/3016): Move these impls once aws-smithy-async is merged into aws-smithy-runtime-api +mod async_impls { + use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; + use aws_smithy_async::time::{SharedTimeSource, TimeSource}; + impl_shared_conversions!(convert SharedAsyncSleep from AsyncSleep using SharedAsyncSleep::new); + impl_shared_conversions!(convert SharedTimeSource from TimeSource using SharedTimeSource::new); +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fmt; + use std::sync::Arc; + + trait Thing: fmt::Debug {} + + #[derive(Debug)] + struct Thingamajig; + impl Thing for Thingamajig {} + + #[derive(Debug)] + struct SharedThing(Arc); + impl Thing for SharedThing {} + impl SharedThing { + fn new(thing: impl Thing + 'static) -> Self { + Self(Arc::new(thing)) + } + } + impl_shared_conversions!(convert SharedThing from Thing using SharedThing::new); + + #[test] + fn test() { + let thing = Thingamajig; + assert_eq!("Thingamajig", format!("{thing:?}"), "precondition"); + + let shared_thing: SharedThing = thing.into_shared(); + assert_eq!( + "SharedThing(Thingamajig)", + format!("{shared_thing:?}"), + "precondition" + ); + + let very_shared_thing: SharedThing = shared_thing.into_shared(); + assert_eq!( + "SharedThing(Thingamajig)", + format!("{very_shared_thing:?}"), + "it should not nest the shared thing in another shared thing" + ); + } +} diff --git a/rust-runtime/aws-smithy-runtime/Cargo.toml b/rust-runtime/aws-smithy-runtime/Cargo.toml index b481d7ff99b..d9ebaea92b0 100644 --- a/rust-runtime/aws-smithy-runtime/Cargo.toml +++ b/rust-runtime/aws-smithy-runtime/Cargo.toml @@ -5,28 +5,40 @@ authors = ["AWS Rust SDK Team ", "Zelda Hessler -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-runtime/additional-ci b/rust-runtime/aws-smithy-runtime/additional-ci new file mode 100755 index 00000000000..b44c6c05be7 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/additional-ci @@ -0,0 +1,12 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +# This script contains additional CI checks to run for this specific package + +set -e + +echo "### Testing every combination of features (excluding --all-features)" +cargo hack test --feature-powerset --exclude-all-features diff --git a/rust-runtime/aws-smithy-runtime/external-types.toml b/rust-runtime/aws-smithy-runtime/external-types.toml index a6398200200..ef336fec784 100644 --- a/rust-runtime/aws-smithy-runtime/external-types.toml +++ b/rust-runtime/aws-smithy-runtime/external-types.toml @@ -1,12 +1,29 @@ allowed_external_types = [ "aws_smithy_runtime_api::*", "aws_smithy_async::*", - "aws_smithy_http::*", "aws_smithy_types::*", - "aws_smithy_client::erase::DynConnector", - # TODO(audit-external-type-usage) We should newtype these or otherwise avoid exposing them - "http::header::name::HeaderName", + + # Used for creating hyper connectors in the hyper feature and test-util features + "tower_service::Service", + + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature + "bytes::bytes::Bytes", + "serde::ser::Serialize", + "serde::de::Deserialize", + "hyper::client::connect::dns::Name", + # used by dvr "http::request::Request", "http::response::Response", "http::uri::Uri", + + + + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `connector-hyper-0-14-x` feature + "hyper::client::client::Builder", + "hyper::client::connect::Connection", + "tokio::io::async_read::AsyncRead", + "tokio::io::async_write::AsyncWrite", + + # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `http-0-x` feature + "http_body::Body" ] diff --git a/rust-runtime/aws-smithy-runtime/src/client.rs b/rust-runtime/aws-smithy-runtime/src/client.rs index cb0d8f1ae86..10591578fce 100644 --- a/rust-runtime/aws-smithy-runtime/src/client.rs +++ b/rust-runtime/aws-smithy-runtime/src/client.rs @@ -3,16 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ +/// Smithy auth scheme implementations. pub mod auth; -/// Smithy code related to connectors and connections. -/// -/// A "connector" manages one or more "connections", handles connection timeouts, re-establishes -/// connections, etc. +pub mod defaults; + +pub mod dns; + +/// Built-in Smithy HTTP clients and connectors. /// -/// "Connections" refers to the actual transport layer implementation of the connector. -/// By default, the orchestrator uses a connector provided by `hyper`. -pub mod connectors; +/// See the [module docs in `aws-smithy-runtime-api`](aws_smithy_runtime_api::client::http) +/// for more information about clients and connectors. +pub mod http; + +/// Utility to simplify config building for config and config overrides. +pub mod config_override; /// The client orchestrator implementation pub mod orchestrator; @@ -36,3 +41,6 @@ pub mod identity; /// Interceptors for Smithy clients. pub mod interceptors; + +/// Stalled stream protection for clients +pub mod stalled_stream_protection; diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs index 5b62491bc92..9aa9589ef0e 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/http.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +//! Auth scheme implementations for HTTP API Key, Basic Auth, Bearer Token, and Digest auth. + use aws_smithy_http::query_writer::QueryWriter; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::http::{ @@ -10,22 +12,22 @@ use aws_smithy_runtime_api::client::auth::http::{ HTTP_DIGEST_AUTH_SCHEME_ID, }; use aws_smithy_runtime_api::client::auth::{ - AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign, }; use aws_smithy_runtime_api::client::identity::http::{Login, Token}; -use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolvers, SharedIdentityResolver, -}; +use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents}; use aws_smithy_types::base64::encode; use aws_smithy_types::config_bag::ConfigBag; -use http::header::HeaderName; use http::HeaderValue; /// Destination for the API key #[derive(Copy, Clone, Debug)] pub enum ApiKeyLocation { + /// Place the API key in the URL query parameters Query, + /// Place the API key in the request headers Header, } @@ -52,19 +54,19 @@ impl ApiKeyAuthScheme { } } -impl HttpAuthScheme for ApiKeyAuthScheme { +impl AuthScheme for ApiKeyAuthScheme { fn scheme_id(&self) -> AuthSchemeId { HTTP_API_KEY_AUTH_SCHEME_ID } fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -76,12 +78,13 @@ struct ApiKeySigner { name: String, } -impl HttpRequestSigner for ApiKeySigner { - fn sign_request( +impl Sign for ApiKeySigner { + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { let api_key = identity @@ -89,17 +92,22 @@ impl HttpRequestSigner for ApiKeySigner { .ok_or("HTTP ApiKey auth requires a `Token` identity")?; match self.location { ApiKeyLocation::Header => { - request.headers_mut().append( - HeaderName::try_from(&self.name).expect("valid API key header name"), - HeaderValue::try_from(format!("{} {}", self.scheme, api_key.token())).map_err( - |_| "API key contains characters that can't be included in a HTTP header", - )?, - ); + request + .headers_mut() + .try_append( + self.name.to_ascii_lowercase(), + format!("{} {}", self.scheme, api_key.token()), + ) + .map_err(|_| { + "API key contains characters that can't be included in a HTTP header" + })?; } ApiKeyLocation::Query => { - let mut query = QueryWriter::new(request.uri()); + let mut query = QueryWriter::new_from_string(request.uri())?; query.insert(&self.name, api_key.token()); - *request.uri_mut() = query.build_uri(); + request + .set_uri(query.build_uri()) + .expect("query writer returns a valid URI") } } @@ -122,19 +130,19 @@ impl BasicAuthScheme { } } -impl HttpAuthScheme for BasicAuthScheme { +impl AuthScheme for BasicAuthScheme { fn scheme_id(&self) -> AuthSchemeId { HTTP_BASIC_AUTH_SCHEME_ID } fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -142,12 +150,13 @@ impl HttpAuthScheme for BasicAuthScheme { #[derive(Debug, Default)] struct BasicAuthSigner; -impl HttpRequestSigner for BasicAuthSigner { - fn sign_request( +impl Sign for BasicAuthSigner { + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { let login = identity @@ -180,19 +189,19 @@ impl BearerAuthScheme { } } -impl HttpAuthScheme for BearerAuthScheme { +impl AuthScheme for BearerAuthScheme { fn scheme_id(&self) -> AuthSchemeId { HTTP_BEARER_AUTH_SCHEME_ID } fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -200,12 +209,13 @@ impl HttpAuthScheme for BearerAuthScheme { #[derive(Debug, Default)] struct BearerAuthSigner; -impl HttpRequestSigner for BearerAuthSigner { - fn sign_request( +impl Sign for BearerAuthSigner { + fn sign_http_request( &self, request: &mut HttpRequest, identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { let token = identity @@ -236,19 +246,19 @@ impl DigestAuthScheme { } } -impl HttpAuthScheme for DigestAuthScheme { +impl AuthScheme for DigestAuthScheme { fn scheme_id(&self) -> AuthSchemeId { HTTP_DIGEST_AUTH_SCHEME_ID } fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Sign { &self.signer } } @@ -256,12 +266,13 @@ impl HttpAuthScheme for DigestAuthScheme { #[derive(Debug, Default)] struct DigestAuthSigner; -impl HttpRequestSigner for DigestAuthSigner { - fn sign_request( +impl Sign for DigestAuthSigner { + fn sign_http_request( &self, _request: &mut HttpRequest, _identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { unimplemented!( @@ -273,8 +284,9 @@ impl HttpRequestSigner for DigestAuthSigner { #[cfg(test)] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::client::identity::http::Login; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::body::SdkBody; #[test] fn test_api_key_signing_headers() { @@ -283,17 +295,21 @@ mod tests { location: ApiKeyLocation::Header, name: "some-header-name".into(), }; + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Token::new("some-token", None), None); - let mut request = http::Request::builder() + let mut request: HttpRequest = http::Request::builder() .uri("http://example.com/Foobaz") .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap(); signer - .sign_request( + .sign_http_request( &mut request, &identity, AuthSchemeEndpointConfig::empty(), + &runtime_components, &config_bag, ) .expect("success"); @@ -311,17 +327,21 @@ mod tests { location: ApiKeyLocation::Query, name: "some-query-name".into(), }; + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Token::new("some-token", None), None); - let mut request = http::Request::builder() + let mut request: HttpRequest = http::Request::builder() .uri("http://example.com/Foobaz") .body(SdkBody::empty()) + .unwrap() + .try_into() .unwrap(); signer - .sign_request( + .sign_http_request( &mut request, &identity, AuthSchemeEndpointConfig::empty(), + &runtime_components, &config_bag, ) .expect("success"); @@ -335,15 +355,21 @@ mod tests { #[test] fn test_basic_auth() { let signer = BasicAuthSigner; + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let config_bag = ConfigBag::base(); let identity = Identity::new(Login::new("Aladdin", "open sesame", None), None); - let mut request = http::Request::builder().body(SdkBody::empty()).unwrap(); + let mut request = http::Request::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(); signer - .sign_request( + .sign_http_request( &mut request, &identity, AuthSchemeEndpointConfig::empty(), + &runtime_components, &config_bag, ) .expect("success"); @@ -358,13 +384,47 @@ mod tests { let signer = BearerAuthSigner; let config_bag = ConfigBag::base(); + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); let identity = Identity::new(Token::new("some-token", None), None); - let mut request = http::Request::builder().body(SdkBody::empty()).unwrap(); + let mut request = http::Request::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(); + signer + .sign_http_request( + &mut request, + &identity, + AuthSchemeEndpointConfig::empty(), + &runtime_components, + &config_bag, + ) + .expect("success"); + assert_eq!( + "Bearer some-token", + request.headers().get("Authorization").unwrap() + ); + } + + #[test] + fn test_bearer_auth_overwrite_existing_header() { + let signer = BearerAuthSigner; + + let config_bag = ConfigBag::base(); + let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let identity = Identity::new(Token::new("some-token", None), None); + let mut request = http::Request::builder() + .header("Authorization", "wrong") + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(); signer - .sign_request( + .sign_http_request( &mut request, &identity, AuthSchemeEndpointConfig::empty(), + &runtime_components, &config_bag, ) .expect("success"); diff --git a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs index 6fa815046df..195bbd75c86 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs @@ -8,16 +8,18 @@ use crate::client::identity::no_auth::NoAuthIdentityResolver; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, HttpRequestSigner, SharedHttpAuthScheme, -}; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; -use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolvers, SharedIdentityResolver, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, SharedAuthScheme, Sign, }; +use aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::{ + GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder, +}; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; +use aws_smithy_types::config_bag::ConfigBag; +use std::borrow::Cow; +/// Auth scheme ID for "no auth". pub const NO_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("no_auth"); /// A [`RuntimePlugin`] that registers a "no auth" identity resolver and auth scheme. @@ -26,7 +28,7 @@ pub const NO_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new("no_auth"); /// a Smithy `@optionalAuth` trait. #[non_exhaustive] #[derive(Debug)] -pub struct NoAuthRuntimePlugin(FrozenLayer); +pub struct NoAuthRuntimePlugin(RuntimeComponentsBuilder); impl Default for NoAuthRuntimePlugin { fn default() -> Self { @@ -35,29 +37,41 @@ impl Default for NoAuthRuntimePlugin { } impl NoAuthRuntimePlugin { + /// Creates a new `NoAuthRuntimePlugin`. pub fn new() -> Self { - let mut cfg = Layer::new("NoAuth"); - cfg.push_identity_resolver( - NO_AUTH_SCHEME_ID, - SharedIdentityResolver::new(NoAuthIdentityResolver::new()), - ); - cfg.push_http_auth_scheme(SharedHttpAuthScheme::new(NoAuthScheme::new())); - Self(cfg.freeze()) + Self( + RuntimeComponentsBuilder::new("NoAuthRuntimePlugin") + .with_identity_resolver( + NO_AUTH_SCHEME_ID, + SharedIdentityResolver::new(NoAuthIdentityResolver::new()), + ) + .with_auth_scheme(SharedAuthScheme::new(NoAuthScheme::new())), + ) } } impl RuntimePlugin for NoAuthRuntimePlugin { - fn config(&self) -> Option { - Some(self.0.clone()) + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.0) } } +/// The "no auth" auth scheme. +/// +/// The orchestrator requires an auth scheme, so Smithy's `@optionalAuth` trait is implemented +/// by placing a "no auth" auth scheme at the end of the auth scheme options list so that it is +/// used if there's no identity resolver available for the other auth schemes. It's also used +/// for models that don't have auth at all. #[derive(Debug, Default)] pub struct NoAuthScheme { signer: NoAuthSigner, } impl NoAuthScheme { + /// Creates a new `NoAuthScheme`. pub fn new() -> Self { Self::default() } @@ -66,31 +80,32 @@ impl NoAuthScheme { #[derive(Debug, Default)] struct NoAuthSigner; -impl HttpRequestSigner for NoAuthSigner { - fn sign_request( +impl Sign for NoAuthSigner { + fn sign_http_request( &self, _request: &mut HttpRequest, _identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { Ok(()) } } -impl HttpAuthScheme for NoAuthScheme { +impl AuthScheme for NoAuthScheme { fn scheme_id(&self) -> AuthSchemeId { NO_AUTH_SCHEME_ID } fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(NO_AUTH_SCHEME_ID) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Sign { &self.signer } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/config_override.rs b/rust-runtime/aws-smithy-runtime/src/client/config_override.rs new file mode 100644 index 00000000000..07886a9526d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/config_override.rs @@ -0,0 +1,266 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_async::rt::sleep::SharedAsyncSleep; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_types::config_bag::{ + CloneableLayer, FrozenLayer, Layer, Storable, Store, StoreReplace, +}; + +macro_rules! component { + ($typ:ty, $accessor:ident, $latest_accessor:ident, $doc:tt) => { + #[doc = $doc] + pub fn $accessor(&self) -> Option<$typ> { + fallback_component!(self, $typ, $accessor) + } + + #[doc = $doc] + pub fn $latest_accessor(&self) -> Option<$typ> { + latest_component!(self, $typ, $accessor) + } + }; +} +macro_rules! fallback_component { + ($self:ident, $typ:ty, $accessor:ident) => { + match &$self.inner { + Inner::Initial(initial) => initial.components.$accessor(), + Inner::Override(overrid) => overrid + .components + .$accessor() + .or_else(|| overrid.initial_components.$accessor()), + } + }; +} +macro_rules! latest_component { + ($self:ident, $typ:ty, $accessor:ident) => { + match &$self.inner { + Inner::Initial(initial) => initial.components.$accessor(), + Inner::Override(overrid) => overrid.components.$accessor(), + } + }; +} + +struct Initial<'a> { + config: &'a mut CloneableLayer, + components: &'a mut RuntimeComponentsBuilder, +} + +struct Override<'a> { + initial_config: FrozenLayer, + initial_components: &'a RuntimeComponentsBuilder, + config: &'a mut CloneableLayer, + components: &'a mut RuntimeComponentsBuilder, +} + +enum Inner<'a> { + Initial(Initial<'a>), + Override(Override<'a>), +} + +/// Utility to simplify config building and config overrides. +/// +/// The resolver allows the same initialization logic to be reused +/// for both initial config and override config. +/// +/// This resolver can be initialized to one of two modes: +/// 1. _Initial mode_: The resolver is being used in a service `Config` builder's `build()` method, and thus, +/// there is no config override at this point. +/// 2. _Override mode_: The resolver is being used by the `ConfigOverrideRuntimePlugin`'s constructor and needs +/// to incorporate both the original config and the given config override for this operation. +/// +/// In all the methods on [`Resolver`], the term "latest" refers to the initial config when in _Initial mode_, +/// and to config override when in _Override mode_. +pub struct Resolver<'a> { + inner: Inner<'a>, +} + +impl<'a> Resolver<'a> { + /// Construct a new [`Resolver`] in _initial mode_. + pub fn initial( + config: &'a mut CloneableLayer, + components: &'a mut RuntimeComponentsBuilder, + ) -> Self { + Self { + inner: Inner::Initial(Initial { config, components }), + } + } + + /// Construct a new [`Resolver`] in _override mode_. + pub fn overrid( + initial_config: FrozenLayer, + initial_components: &'a RuntimeComponentsBuilder, + config: &'a mut CloneableLayer, + components: &'a mut RuntimeComponentsBuilder, + ) -> Self { + Self { + inner: Inner::Override(Override { + initial_config, + initial_components, + config, + components, + }), + } + } + + /// Returns true if in _initial mode_. + pub fn is_initial(&self) -> bool { + matches!(self.inner, Inner::Initial(_)) + } + + /// Returns a mutable reference to the latest config. + pub fn config_mut(&mut self) -> &mut CloneableLayer { + match &mut self.inner { + Inner::Initial(initial) => initial.config, + Inner::Override(overrid) => overrid.config, + } + } + + /// Returns a mutable reference to the latest runtime components. + pub fn runtime_components_mut(&mut self) -> &mut RuntimeComponentsBuilder { + match &mut self.inner { + Inner::Initial(initial) => initial.components, + Inner::Override(overrid) => overrid.components, + } + } + + /// Returns true if the latest config has `T` set. + /// + /// The "latest" is initial for `Resolver::Initial`, and override for `Resolver::Override`. + pub fn is_latest_set(&self) -> bool + where + T: Storable>, + { + self.config().load::().is_some() + } + + /// Returns true if `T` is set anywhere. + pub fn is_set(&self) -> bool + where + T: Storable>, + { + match &self.inner { + Inner::Initial(initial) => initial.config.load::().is_some(), + Inner::Override(overrid) => { + overrid.initial_config.load::().is_some() || overrid.config.load::().is_some() + } + } + } + + /// Resolves the value `T` with fallback + pub fn resolve_config(&self) -> ::ReturnedType<'_> + where + T: Storable>, + { + let mut maybe_value = self.config().load::(); + if maybe_value.is_none() { + // Try to fallback + if let Inner::Override(overrid) = &self.inner { + maybe_value = overrid.initial_config.load::() + } + } + maybe_value + } + + // Add additional component methods as needed + component!( + SharedAsyncSleep, + sleep_impl, + latest_sleep_impl, + "The async sleep implementation." + ); + + fn config(&self) -> &Layer { + match &self.inner { + Inner::Initial(initial) => initial.config, + Inner::Override(overrid) => overrid.config, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use aws_smithy_types::config_bag::CloneableLayer; + + #[derive(Clone, Debug)] + struct TestStorable(String); + impl Storable for TestStorable { + type Storer = StoreReplace; + } + + #[test] + fn initial_mode_config() { + let mut config = CloneableLayer::new("test"); + let mut components = RuntimeComponentsBuilder::new("test"); + + let mut resolver = Resolver::initial(&mut config, &mut components); + assert!(resolver.is_initial()); + assert!(!resolver.is_latest_set::()); + assert!(!resolver.is_set::()); + assert!(resolver.resolve_config::().is_none()); + + resolver.config_mut().store_put(TestStorable("test".into())); + assert!(resolver.is_latest_set::()); + assert!(resolver.is_set::()); + assert_eq!("test", resolver.resolve_config::().unwrap().0); + } + + #[test] + fn override_mode_config() { + let mut initial_config = CloneableLayer::new("initial"); + let initial_components = RuntimeComponentsBuilder::new("initial"); + let mut config = CloneableLayer::new("override"); + let mut components = RuntimeComponentsBuilder::new("override"); + + let resolver = Resolver::overrid( + initial_config.clone().freeze(), + &initial_components, + &mut config, + &mut components, + ); + assert!(!resolver.is_initial()); + assert!(!resolver.is_latest_set::()); + assert!(!resolver.is_set::()); + assert!(resolver.resolve_config::().is_none()); + + initial_config.store_put(TestStorable("test".into())); + let resolver = Resolver::overrid( + initial_config.clone().freeze(), + &initial_components, + &mut config, + &mut components, + ); + assert!(!resolver.is_latest_set::()); + assert!(resolver.is_set::()); + assert_eq!("test", resolver.resolve_config::().unwrap().0); + + initial_config.unset::(); + config.store_put(TestStorable("test".into())); + let resolver = Resolver::overrid( + initial_config.clone().freeze(), + &initial_components, + &mut config, + &mut components, + ); + assert!(resolver.is_latest_set::()); + assert!(resolver.is_set::()); + assert_eq!("test", resolver.resolve_config::().unwrap().0); + + initial_config.store_put(TestStorable("override me".into())); + config.store_put(TestStorable("override".into())); + let resolver = Resolver::overrid( + initial_config.freeze(), + &initial_components, + &mut config, + &mut components, + ); + assert!(resolver.is_latest_set::()); + assert!(resolver.is_set::()); + assert_eq!( + "override", + resolver.resolve_config::().unwrap().0 + ); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors.rs deleted file mode 100644 index 60e9a770969..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors.rs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -pub mod connection_poisoning; -#[cfg(feature = "test-util")] -pub mod test_util; - -pub mod adapter { - use aws_smithy_client::erase::DynConnector; - use aws_smithy_runtime_api::client::connectors::Connector; - use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; - use std::sync::{Arc, Mutex}; - - #[derive(Debug)] - pub struct DynConnectorAdapter { - // `DynConnector` requires `&mut self`, so we need interior mutability to adapt to it - dyn_connector: Arc>, - } - - impl DynConnectorAdapter { - pub fn new(dyn_connector: DynConnector) -> Self { - Self { - dyn_connector: Arc::new(Mutex::new(dyn_connector)), - } - } - } - - impl Connector for DynConnectorAdapter { - fn call(&self, request: HttpRequest) -> BoxFuture { - let future = self.dyn_connector.lock().unwrap().call_lite(request); - future - } - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs deleted file mode 100644 index e2d08a60d53..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/connection_poisoning.rs +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_http::connection::{CaptureSmithyConnection, ConnectionMetadata}; -use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; -use aws_smithy_runtime_api::client::interceptors::context::{ - BeforeDeserializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, -}; -use aws_smithy_runtime_api::client::interceptors::Interceptor; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::retry::{ErrorKind, ReconnectMode, RetryConfig}; -use std::fmt; -use tracing::{debug, error}; - -/// A interceptor for poisoning connections in response to certain events. -/// -/// This interceptor, when paired with a compatible connection, allows the connection to be -/// poisoned in reaction to certain events *(like receiving a transient error.)* This allows users -/// to avoid sending requests to a server that isn't responding. This can increase the load on a -/// server, because more connections will be made overall. -/// -/// **In order for this interceptor to work,** the configured connection must interact with the -/// "connection retriever" stored in an HTTP request's `extensions` map. For an example of this, -/// see [aws_smithy_client::hyper_ext::Adapter](https://github.com/awslabs/smithy-rs/blob/47b3d23ff3cabd67e797af616101f5a4ea6be5e8/rust-runtime/aws-smithy-client/src/hyper_ext.rs#L155). -/// When a connection is made available to the retriever, this interceptor will call a `.poison` -/// method on it, signalling that the connection should be dropped. It is up to the connection -/// implementer to handle this. -#[non_exhaustive] -#[derive(Debug, Default)] -pub struct ConnectionPoisoningInterceptor {} - -impl ConnectionPoisoningInterceptor { - pub fn new() -> Self { - Self::default() - } -} - -impl Interceptor for ConnectionPoisoningInterceptor { - fn modify_before_transmit( - &self, - context: &mut BeforeTransmitInterceptorContextMut<'_>, - cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - let capture_smithy_connection = CaptureSmithyConnectionWrapper::new(); - context - .request_mut() - .extensions_mut() - .insert(capture_smithy_connection.clone_inner()); - cfg.interceptor_state().store_put(capture_smithy_connection); - - Ok(()) - } - - fn modify_before_deserialization( - &self, - context: &mut BeforeDeserializationInterceptorContextMut<'_>, - cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - let reconnect_mode = cfg - .load::() - .map(RetryConfig::reconnect_mode) - .unwrap_or(ReconnectMode::ReconnectOnTransientError); - let captured_connection = cfg.load::().cloned(); - let retry_classifiers = cfg.retry_classifiers(); - - let error_is_transient = retry_classifiers - .classify_retry(context.into_inner()) - .map(|reason| reason == RetryReason::Error(ErrorKind::TransientError)) - .unwrap_or_default(); - let connection_poisoning_is_enabled = - reconnect_mode == ReconnectMode::ReconnectOnTransientError; - - if error_is_transient && connection_poisoning_is_enabled { - debug!("received a transient error, poisoning the connection..."); - - if let Some(captured_connection) = captured_connection.and_then(|conn| conn.get()) { - captured_connection.poison(); - debug!("the connection was poisoned") - } else { - error!( - "unable to poison the connection because no connection was found! The underlying HTTP connector never set a connection." - ); - } - } - - Ok(()) - } -} - -// TODO(enableNewSmithyRuntimeLaunch) We won't need this once we absorb aws_smithy_http into the -// new runtime crate. -#[derive(Clone, Default)] -pub struct CaptureSmithyConnectionWrapper { - inner: CaptureSmithyConnection, -} - -impl CaptureSmithyConnectionWrapper { - pub fn new() -> Self { - Self { - inner: CaptureSmithyConnection::new(), - } - } - - pub fn clone_inner(&self) -> CaptureSmithyConnection { - self.inner.clone() - } - - pub fn get(&self) -> Option { - self.inner.get() - } - - pub fn set_connection_retriever(&self, f: F) - where - F: Fn() -> Option + Send + Sync + 'static, - { - self.inner.set_connection_retriever(f) - } -} - -impl Storable for CaptureSmithyConnectionWrapper { - type Storer = StoreReplace; -} - -impl fmt::Debug for CaptureSmithyConnectionWrapper { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "CaptureSmithyConnectionWrapper") - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs deleted file mode 100644 index 5a9b3bfdfd8..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/connectors/test_util.rs +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Module with client connectors useful for testing. - -use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; -use aws_smithy_runtime_api::client::connectors::Connector; -use aws_smithy_runtime_api::client::orchestrator::{BoxFuture, HttpRequest, HttpResponse}; -use http::header::{HeaderName, CONTENT_TYPE}; -use std::fmt::Debug; -use std::ops::Deref; -use std::sync::{Arc, Mutex}; -use std::time::Duration; -use tokio::sync::oneshot; - -/// Test Connection to capture a single request -#[derive(Debug, Clone)] -pub struct CaptureRequestHandler(Arc>); - -#[derive(Debug)] -struct Inner { - _response: Option>, - _sender: Option>, -} - -/// Receiver for [`CaptureRequestHandler`](CaptureRequestHandler) -#[derive(Debug)] -pub struct CaptureRequestReceiver { - receiver: oneshot::Receiver, -} - -impl CaptureRequestReceiver { - /// Expect that a request was sent. Returns the captured request. - /// - /// # Panics - /// If no request was received - #[track_caller] - pub fn expect_request(mut self) -> HttpRequest { - self.receiver.try_recv().expect("no request was received") - } - - /// Expect that no request was captured. Panics if a request was received. - /// - /// # Panics - /// If a request was received - #[track_caller] - pub fn expect_no_request(mut self) { - self.receiver - .try_recv() - .expect_err("expected no request to be received!"); - } -} - -/// Test connection used to capture a single request -/// -/// If response is `None`, it will reply with a 200 response with an empty body -/// -/// Example: -/// ```compile_fail -/// let (server, request) = capture_request(None); -/// let conf = aws_sdk_sts::Config::builder() -/// .http_connector(server) -/// .build(); -/// let client = aws_sdk_sts::Client::from_conf(conf); -/// let _ = client.assume_role_with_saml().send().await; -/// // web identity should be unsigned -/// assert_eq!( -/// request.expect_request().headers().get("AUTHORIZATION"), -/// None -/// ); -/// ``` -pub fn capture_request( - response: Option>, -) -> (CaptureRequestHandler, CaptureRequestReceiver) { - let (tx, rx) = oneshot::channel(); - ( - CaptureRequestHandler(Arc::new(Mutex::new(Inner { - _response: Some(response.unwrap_or_else(|| { - http::Response::builder() - .status(200) - .body(SdkBody::empty()) - .expect("unreachable") - })), - _sender: Some(tx), - }))), - CaptureRequestReceiver { receiver: rx }, - ) -} - -type ConnectionEvents = Vec; - -#[derive(Debug)] -pub struct ConnectionEvent { - latency: Duration, - req: HttpRequest, - res: HttpResponse, -} - -impl ConnectionEvent { - pub fn new(req: HttpRequest, res: HttpResponse) -> Self { - Self { - res, - req, - latency: Duration::from_secs(0), - } - } - - /// Add simulated latency to this `ConnectionEvent` - pub fn with_latency(mut self, latency: Duration) -> Self { - self.latency = latency; - self - } - - pub fn req(&self) -> &HttpRequest { - &self.req - } - - pub fn res(&self) -> &HttpResponse { - &self.res - } -} - -impl From<(HttpRequest, HttpResponse)> for ConnectionEvent { - fn from((req, res): (HttpRequest, HttpResponse)) -> Self { - Self::new(req, res) - } -} - -#[derive(Debug)] -pub struct ValidateRequest { - pub expected: HttpRequest, - pub actual: HttpRequest, -} - -impl ValidateRequest { - pub fn assert_matches(&self, index: usize, ignore_headers: &[HeaderName]) { - let (actual, expected) = (&self.actual, &self.expected); - assert_eq!( - actual.uri(), - expected.uri(), - "Request #{index} - URI doesn't match expected value" - ); - for (name, value) in expected.headers() { - if !ignore_headers.contains(name) { - let actual_header = actual - .headers() - .get(name) - .unwrap_or_else(|| panic!("Request #{index} - Header {name:?} is missing")); - assert_eq!( - actual_header.to_str().unwrap(), - value.to_str().unwrap(), - "Request #{index} - Header {name:?} doesn't match expected value", - ); - } - } - let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[])); - let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[])); - let media_type = if actual - .headers() - .get(CONTENT_TYPE) - .map(|v| v.to_str().unwrap().contains("json")) - .unwrap_or(false) - { - MediaType::Json - } else { - MediaType::Other("unknown".to_string()) - }; - match (actual_str, expected_str) { - (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), - _ => assert_eq!( - actual.body().bytes(), - expected.body().bytes(), - "Request #{index} - Body contents didn't match expected value" - ), - }; - } -} - -/// TestConnection for use as a [`Connector`]. -/// -/// A basic test connection. It will: -/// - Respond to requests with a preloaded series of responses -/// - Record requests for future examination -#[derive(Debug, Clone)] -pub struct TestConnection { - data: Arc>, - requests: Arc>>, - sleep_impl: SharedAsyncSleep, -} - -impl TestConnection { - pub fn new(mut data: ConnectionEvents, sleep_impl: impl Into) -> Self { - data.reverse(); - TestConnection { - data: Arc::new(Mutex::new(data)), - requests: Default::default(), - sleep_impl: sleep_impl.into(), - } - } - - pub fn requests(&self) -> impl Deref> + '_ { - self.requests.lock().unwrap() - } - - #[track_caller] - pub fn assert_requests_match(&self, ignore_headers: &[HeaderName]) { - for (i, req) in self.requests().iter().enumerate() { - req.assert_matches(i, ignore_headers) - } - let remaining_requests = self.data.lock().unwrap(); - let number_of_remaining_requests = remaining_requests.len(); - let actual_requests = self.requests().len(); - assert!( - remaining_requests.is_empty(), - "Expected {number_of_remaining_requests} additional requests (only {actual_requests} sent)", - ); - } -} - -impl Connector for TestConnection { - fn call(&self, request: HttpRequest) -> BoxFuture { - let (res, simulated_latency) = if let Some(event) = self.data.lock().unwrap().pop() { - self.requests.lock().unwrap().push(ValidateRequest { - expected: event.req, - actual: request, - }); - - (Ok(event.res.map(SdkBody::from)), event.latency) - } else { - ( - Err(ConnectorError::other("No more data".into(), None).into()), - Duration::from_secs(0), - ) - }; - - let sleep = self.sleep_impl.sleep(simulated_latency); - Box::pin(async move { - sleep.await; - res - }) - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/defaults.rs b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs new file mode 100644 index 00000000000..ca2d06a387f --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/defaults.rs @@ -0,0 +1,271 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Runtime plugins that provide defaults for clients. +//! +//! Note: these are the absolute base-level defaults. They may not be the defaults +//! for _your_ client, since many things can change these defaults on the way to +//! code generating and constructing a full client. + +use crate::client::identity::IdentityCache; +use crate::client::retries::strategy::StandardRetryStrategy; +use crate::client::retries::RetryPartition; +use aws_smithy_async::rt::sleep::default_async_sleep; +use aws_smithy_async::time::SystemTimeSource; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion; +use aws_smithy_runtime_api::client::http::SharedHttpClient; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponentsBuilder, SharedConfigValidator, +}; +use aws_smithy_runtime_api::client::runtime_plugin::{ + Order, SharedRuntimePlugin, StaticRuntimePlugin, +}; +use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; +use aws_smithy_types::retry::RetryConfig; +use aws_smithy_types::timeout::TimeoutConfig; +use std::borrow::Cow; +use std::time::Duration; + +fn default_plugin(name: &'static str, components_fn: CompFn) -> StaticRuntimePlugin +where + CompFn: FnOnce(RuntimeComponentsBuilder) -> RuntimeComponentsBuilder, +{ + StaticRuntimePlugin::new() + .with_order(Order::Defaults) + .with_runtime_components((components_fn)(RuntimeComponentsBuilder::new(name))) +} + +fn layer(name: &'static str, layer_fn: LayerFn) -> FrozenLayer +where + LayerFn: FnOnce(&mut Layer), +{ + let mut layer = Layer::new(name); + (layer_fn)(&mut layer); + layer.freeze() +} + +/// Runtime plugin that provides a default connector. +pub fn default_http_client_plugin() -> Option { + let _default: Option = None; + #[cfg(feature = "connector-hyper-0-14-x")] + let _default = crate::client::http::hyper_014::default_client(); + + _default.map(|default| { + default_plugin("default_http_client_plugin", |components| { + components.with_http_client(Some(default)) + }) + .into_shared() + }) +} + +/// Runtime plugin that provides a default async sleep implementation. +pub fn default_sleep_impl_plugin() -> Option { + default_async_sleep().map(|default| { + default_plugin("default_sleep_impl_plugin", |components| { + components.with_sleep_impl(Some(default)) + }) + .into_shared() + }) +} + +/// Runtime plugin that provides a default time source. +pub fn default_time_source_plugin() -> Option { + Some( + default_plugin("default_time_source_plugin", |components| { + components.with_time_source(Some(SystemTimeSource::new())) + }) + .into_shared(), + ) +} + +/// Runtime plugin that sets the default retry strategy, config (disabled), and partition. +pub fn default_retry_config_plugin( + default_partition_name: impl Into>, +) -> Option { + Some( + default_plugin("default_retry_config_plugin", |components| { + components + .with_retry_strategy(Some(StandardRetryStrategy::new())) + .with_config_validator(SharedConfigValidator::base_client_config_fn( + validate_retry_config, + )) + }) + .with_config(layer("default_retry_config", |layer| { + layer.store_put(RetryConfig::disabled()); + layer.store_put(RetryPartition::new(default_partition_name)); + })) + .into_shared(), + ) +} + +fn validate_retry_config( + components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, +) -> Result<(), BoxError> { + if let Some(retry_config) = cfg.load::() { + if retry_config.has_retry() && components.sleep_impl().is_none() { + Err("An async sleep implementation is required for retry to work. Please provide a `sleep_impl` on \ + the config, or disable timeouts.".into()) + } else { + Ok(()) + } + } else { + Err( + "The default retry config was removed, and no other config was put in its place." + .into(), + ) + } +} + +/// Runtime plugin that sets the default timeout config (no timeouts). +pub fn default_timeout_config_plugin() -> Option { + Some( + default_plugin("default_timeout_config_plugin", |components| { + components.with_config_validator(SharedConfigValidator::base_client_config_fn( + validate_timeout_config, + )) + }) + .with_config(layer("default_timeout_config", |layer| { + layer.store_put(TimeoutConfig::disabled()); + })) + .into_shared(), + ) +} + +fn validate_timeout_config( + components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, +) -> Result<(), BoxError> { + if let Some(timeout_config) = cfg.load::() { + if timeout_config.has_timeouts() && components.sleep_impl().is_none() { + Err("An async sleep implementation is required for timeouts to work. Please provide a `sleep_impl` on \ + the config, or disable timeouts.".into()) + } else { + Ok(()) + } + } else { + Err( + "The default timeout config was removed, and no other config was put in its place." + .into(), + ) + } +} + +/// Runtime plugin that registers the default identity cache implementation. +pub fn default_identity_cache_plugin() -> Option { + Some( + default_plugin("default_identity_cache_plugin", |components| { + components.with_identity_cache(Some(IdentityCache::lazy().build())) + }) + .into_shared(), + ) +} + +/// Runtime plugin that sets the default stalled stream protection config. +/// +/// By default, when throughput falls below 1/Bs for more than 5 seconds, the +/// stream is cancelled. +pub fn default_stalled_stream_protection_config_plugin() -> Option { + Some( + default_plugin( + "default_stalled_stream_protection_config_plugin", + |components| { + components.with_config_validator(SharedConfigValidator::base_client_config_fn( + validate_stalled_stream_protection_config, + )) + }, + ) + .with_config(layer("default_stalled_stream_protection_config", |layer| { + layer.store_put( + StalledStreamProtectionConfig::enabled() + .grace_period(Duration::from_secs(5)) + .build(), + ); + })) + .into_shared(), + ) +} + +fn validate_stalled_stream_protection_config( + components: &RuntimeComponentsBuilder, + cfg: &ConfigBag, +) -> Result<(), BoxError> { + if let Some(stalled_stream_protection_config) = cfg.load::() { + if stalled_stream_protection_config.is_enabled() { + if components.sleep_impl().is_none() { + return Err( + "An async sleep implementation is required for stalled stream protection to work. \ + Please provide a `sleep_impl` on the config, or disable stalled stream protection.".into()); + } + + if components.time_source().is_none() { + return Err( + "A time source is required for stalled stream protection to work.\ + Please provide a `time_source` on the config, or disable stalled stream protection.".into()); + } + } + + Ok(()) + } else { + Err( + "The default stalled stream protection config was removed, and no other config was put in its place." + .into(), + ) + } +} + +/// Arguments for the [`default_plugins`] method. +/// +/// This is a struct to enable adding new parameters in the future without breaking the API. +#[non_exhaustive] +#[derive(Debug, Default)] +pub struct DefaultPluginParams { + retry_partition_name: Option>, + behavior_version: Option, +} + +impl DefaultPluginParams { + /// Creates a new [`DefaultPluginParams`]. + pub fn new() -> Self { + Default::default() + } + + /// Sets the retry partition name. + pub fn with_retry_partition_name(mut self, name: impl Into>) -> Self { + self.retry_partition_name = Some(name.into()); + self + } + + /// Sets the behavior major version. + pub fn with_behavior_version(mut self, version: BehaviorVersion) -> Self { + self.behavior_version = Some(version); + self + } +} + +/// All default plugins. +pub fn default_plugins( + params: DefaultPluginParams, +) -> impl IntoIterator { + [ + default_http_client_plugin(), + default_identity_cache_plugin(), + default_retry_config_plugin( + params + .retry_partition_name + .expect("retry_partition_name is required"), + ), + default_sleep_impl_plugin(), + default_time_source_plugin(), + default_timeout_config_plugin(), + default_stalled_stream_protection_config_plugin(), + ] + .into_iter() + .flatten() + .collect::>() +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/dns.rs b/rust-runtime/aws-smithy-runtime/src/client/dns.rs new file mode 100644 index 00000000000..cb776eac3c7 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/dns.rs @@ -0,0 +1,49 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Built-in DNS resolver implementations. + +#[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))] +mod tokio { + use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns, ResolveDnsError}; + use std::io::{Error as IoError, ErrorKind as IoErrorKind}; + use std::net::ToSocketAddrs; + + /// DNS resolver that uses `tokio::spawn_blocking` to resolve DNS using the standard library. + /// + /// This implementation isn't available for WASM targets. + #[non_exhaustive] + #[derive(Debug, Default)] + pub struct TokioDnsResolver; + + impl TokioDnsResolver { + /// Creates a new Tokio DNS resolver + pub fn new() -> Self { + Self + } + } + + impl ResolveDns for TokioDnsResolver { + fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> { + let name = name.to_string(); + DnsFuture::new(async move { + let result = tokio::task::spawn_blocking(move || (name, 0).to_socket_addrs()).await; + match result { + Err(join_failure) => Err(ResolveDnsError::new(IoError::new( + IoErrorKind::Other, + join_failure, + ))), + Ok(Ok(dns_result)) => { + Ok(dns_result.into_iter().map(|addr| addr.ip()).collect()) + } + Ok(Err(dns_failure)) => Err(ResolveDnsError::new(dns_failure)), + } + }) + } + } +} + +#[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))] +pub use self::tokio::TokioDnsResolver; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http.rs b/rust-runtime/aws-smithy-runtime/src/client/http.rs new file mode 100644 index 00000000000..d4fcc998d60 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http.rs @@ -0,0 +1,20 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/// Interceptor for connection poisoning. +pub mod connection_poisoning; + +#[cfg(feature = "test-util")] +pub mod test_util; + +/// Default HTTP and TLS connectors that use hyper 0.14.x and rustls. +/// +/// This module is named after the hyper version number since we anticipate +/// needing to provide equivalent functionality for hyper 1.x in the future. +#[cfg(feature = "connector-hyper-0-14-x")] +pub mod hyper_014; + +/// HTTP body and body-wrapper types +pub mod body; diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body.rs similarity index 53% rename from rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/body.rs index b9de2daa37b..dcbd9291c19 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body.rs @@ -3,6 +3,4 @@ * SPDX-License-Identifier: Apache-2.0 */ -mod service_clock_skew; - -pub use service_clock_skew::{ServiceClockSkew, ServiceClockSkewInterceptor}; +pub mod minimum_throughput; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs new file mode 100644 index 00000000000..c576a34afa3 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs @@ -0,0 +1,96 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! A body-wrapping type that ensures data is being streamed faster than some lower limit. +//! +//! If data is being streamed too slowly, this body type will emit an error next time it's polled. + +/// An implementation of v0.4 `http_body::Body` for `MinimumThroughputBody` and related code. +pub mod http_body_0_4_x; + +/// Options for a [`MinimumThroughputBody`]. +pub mod options; +pub use throughput::Throughput; +mod throughput; + +use aws_smithy_async::rt::sleep::Sleep; +use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; +use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::shared::IntoShared; +use options::MinimumThroughputBodyOptions; +use std::fmt; +use std::time::SystemTime; +use throughput::ThroughputLogs; + +pin_project_lite::pin_project! { + /// A body-wrapping type that ensures data is being streamed faster than some lower limit. + /// + /// If data is being streamed too slowly, this body type will emit an error next time it's polled. + pub struct MinimumThroughputBody { + async_sleep: SharedAsyncSleep, + time_source: SharedTimeSource, + options: MinimumThroughputBodyOptions, + throughput_logs: ThroughputLogs, + #[pin] + sleep_fut: Option, + #[pin] + grace_period_fut: Option, + #[pin] + inner: B, + } +} + +const SIZE_OF_ONE_LOG: usize = std::mem::size_of::<(SystemTime, u64)>(); // 24 bytes per log +const NUMBER_OF_LOGS_IN_ONE_KB: f64 = 1024.0 / SIZE_OF_ONE_LOG as f64; + +impl MinimumThroughputBody { + /// Create a new minimum throughput body. + pub fn new( + time_source: impl TimeSource + 'static, + async_sleep: impl AsyncSleep + 'static, + body: B, + options: MinimumThroughputBodyOptions, + ) -> Self { + Self { + throughput_logs: ThroughputLogs::new( + // Never keep more than 10KB of logs in memory. This currently + // equates to 426 logs. + (NUMBER_OF_LOGS_IN_ONE_KB * 10.0) as usize, + ), + async_sleep: async_sleep.into_shared(), + time_source: time_source.into_shared(), + inner: body, + sleep_fut: None, + grace_period_fut: None, + options, + } + } +} + +#[derive(Debug, PartialEq)] +enum Error { + ThroughputBelowMinimum { + expected: Throughput, + actual: Throughput, + }, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::ThroughputBelowMinimum { expected, actual } => { + write!( + f, + "minimum throughput was specified at {expected}, but throughput of {actual} was observed", + ) + } + } + } +} + +impl std::error::Error for Error {} + +// Tests are implemented per HTTP body type. diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs new file mode 100644 index 00000000000..075ef39d639 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs @@ -0,0 +1,401 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use super::{BoxError, Error, MinimumThroughputBody}; +use aws_smithy_async::rt::sleep::AsyncSleep; +use http_body_0_4::Body; +use std::future::Future; +use std::pin::{pin, Pin}; +use std::task::{Context, Poll}; + +impl Body for MinimumThroughputBody +where + B: Body, +{ + type Data = bytes::Bytes; + type Error = BoxError; + + fn poll_data( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> { + // this code is called quite frequently in production—one every millisecond or so when downloading + // a stream. However, SystemTime::now is on the order of nanoseconds + let now = self.time_source.now(); + // Attempt to read the data from the inner body, then update the + // throughput logs. + let mut this = self.as_mut().project(); + let poll_res = match this.inner.poll_data(cx) { + Poll::Ready(Some(Ok(bytes))) => { + tracing::trace!("received data: {}", bytes.len()); + this.throughput_logs.push((now, bytes.len() as u64)); + Poll::Ready(Some(Ok(bytes))) + } + Poll::Pending => { + tracing::trace!("received poll pending"); + this.throughput_logs.push((now, 0)); + Poll::Pending + } + // If we've read all the data or an error occurred, then return that result. + res => return res, + }; + + // Check the sleep future to see if it needs refreshing. + let mut sleep_fut = this + .sleep_fut + .take() + .unwrap_or_else(|| this.async_sleep.sleep(this.options.check_interval())); + if let Poll::Ready(()) = pin!(&mut sleep_fut).poll(cx) { + tracing::trace!("sleep future triggered—triggering a wakeup"); + // Whenever the sleep future expires, we replace it. + sleep_fut = this.async_sleep.sleep(this.options.check_interval()); + + // We also schedule a wake up for current task to ensure that + // it gets polled at least one more time. + cx.waker().wake_by_ref(); + }; + this.sleep_fut.replace(sleep_fut); + let calculated_tpt = match this + .throughput_logs + .calculate_throughput(now, this.options.check_window()) + { + Some(tpt) => tpt, + None => { + tracing::trace!("calculated throughput is None!"); + return poll_res; + } + }; + tracing::trace!( + "calculated throughput {:?} (window: {:?})", + calculated_tpt, + this.options.check_window() + ); + + // Calculate the current throughput and emit an error if it's too low and + // the grace period has elapsed. + let is_below_minimum_throughput = calculated_tpt <= this.options.minimum_throughput(); + if is_below_minimum_throughput { + // Check the grace period future to see if it needs creating. + tracing::trace!( + in_grace_period = this.grace_period_fut.is_some(), + observed_throughput = ?calculated_tpt, + minimum_throughput = ?this.options.minimum_throughput(), + "below minimum throughput" + ); + let mut grace_period_fut = this + .grace_period_fut + .take() + .unwrap_or_else(|| this.async_sleep.sleep(this.options.grace_period())); + if let Poll::Ready(()) = pin!(&mut grace_period_fut).poll(cx) { + // The grace period has ended! + return Poll::Ready(Some(Err(Box::new(Error::ThroughputBelowMinimum { + expected: self.options.minimum_throughput(), + actual: calculated_tpt, + })))); + }; + this.grace_period_fut.replace(grace_period_fut); + } else { + // Ensure we don't have an active grace period future if we're not + // currently below the minimum throughput. + let _ = this.grace_period_fut.take(); + } + + poll_res + } + + fn poll_trailers( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll, Self::Error>> { + let this = self.as_mut().project(); + this.inner.poll_trailers(cx) + } +} + +// These tests use `hyper::body::Body::wrap_stream` +#[cfg(all(test, feature = "connector-hyper-0-14-x", feature = "test-util"))] +mod test { + use super::{super::Throughput, Error, MinimumThroughputBody}; + use crate::client::http::body::minimum_throughput::options::MinimumThroughputBodyOptions; + use crate::test_util::capture_test_logs::capture_test_logs; + use aws_smithy_async::rt::sleep::AsyncSleep; + use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep, ManualTimeSource}; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream}; + use aws_smithy_types::error::display::DisplayErrorContext; + use bytes::{BufMut, Bytes, BytesMut}; + use http::HeaderMap; + use http_body_0_4::Body; + use once_cell::sync::Lazy; + use pretty_assertions::assert_eq; + use std::convert::Infallible; + use std::error::Error as StdError; + use std::future::{poll_fn, Future}; + use std::pin::{pin, Pin}; + use std::task::{Context, Poll}; + use std::time::{Duration, UNIX_EPOCH}; + + struct NeverBody; + + impl Body for NeverBody { + type Data = Bytes; + type Error = Box<(dyn StdError + Send + Sync + 'static)>; + + fn poll_data( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll>> { + Poll::Pending + } + + fn poll_trailers( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll, Self::Error>> { + unreachable!("body can't be read, so this won't be called") + } + } + + #[tokio::test()] + async fn test_self_waking() { + let (time_source, async_sleep) = instant_time_and_sleep(UNIX_EPOCH); + let mut body = MinimumThroughputBody::new( + time_source.clone(), + async_sleep.clone(), + NeverBody, + Default::default(), + ); + time_source.advance(Duration::from_secs(1)); + let actual_err = body.data().await.expect("next chunk exists").unwrap_err(); + let expected_err = Error::ThroughputBelowMinimum { + expected: (1, Duration::from_secs(1)).into(), + actual: (0, Duration::from_secs(1)).into(), + }; + + assert_eq!(expected_err.to_string(), actual_err.to_string()); + } + + fn create_test_stream( + async_sleep: impl AsyncSleep + Clone, + ) -> impl futures_util::Stream> { + futures_util::stream::unfold(1, move |state| { + let async_sleep = async_sleep.clone(); + async move { + if state > 255 { + None + } else { + async_sleep.sleep(Duration::from_secs(1)).await; + Some(( + Result::<_, Infallible>::Ok(Bytes::from_static(b"00000000")), + state + 1, + )) + } + } + }) + } + + static EXPECTED_BYTES: Lazy> = + Lazy::new(|| (1..=255).flat_map(|_| b"00000000").copied().collect()); + + fn eight_byte_per_second_stream_with_minimum_throughput_timeout( + minimum_throughput: Throughput, + ) -> ( + impl Future>, + ManualTimeSource, + InstantSleep, + ) { + let (time_source, async_sleep) = instant_time_and_sleep(UNIX_EPOCH); + let time_clone = time_source.clone(); + + // Will send ~8 bytes per second. + let stream = create_test_stream(async_sleep.clone()); + let body = ByteStream::new(SdkBody::from_body_0_4(hyper_0_14::body::Body::wrap_stream( + stream, + ))); + let body = body.map(move |body| { + let time_source = time_clone.clone(); + // We don't want to log these sleeps because it would duplicate + // the `sleep` calls being logged by the MTB + let async_sleep = InstantSleep::unlogged(); + SdkBody::from_body_0_4(MinimumThroughputBody::new( + time_source, + async_sleep, + body, + MinimumThroughputBodyOptions::builder() + .minimum_throughput(minimum_throughput) + .build(), + )) + }); + + (body.collect(), time_source, async_sleep) + } + + async fn expect_error(minimum_throughput: Throughput) { + let (res, ..) = + eight_byte_per_second_stream_with_minimum_throughput_timeout(minimum_throughput); + let expected_err = Error::ThroughputBelowMinimum { + expected: minimum_throughput, + actual: Throughput::new(8, Duration::from_secs(1)), + }; + match res.await { + Ok(_) => { + panic!( + "response succeeded instead of returning the expected error '{expected_err}'" + ) + } + Err(actual_err) => { + assert_eq!( + expected_err.to_string(), + // We need to source this so that we don't get the streaming error it's wrapped in. + actual_err.source().unwrap().to_string() + ); + } + } + } + + #[tokio::test] + async fn test_throughput_timeout_less_than() { + let minimum_throughput = Throughput::new_bytes_per_second(9); + expect_error(minimum_throughput).await; + } + + async fn expect_success(minimum_throughput: Throughput) { + let (res, time_source, async_sleep) = + eight_byte_per_second_stream_with_minimum_throughput_timeout(minimum_throughput); + match res.await { + Ok(res) => { + assert_eq!(255.0, time_source.seconds_since_unix_epoch()); + assert_eq!(Duration::from_secs(255), async_sleep.total_duration()); + assert_eq!(*EXPECTED_BYTES, res.to_vec()); + } + Err(err) => panic!("{}", DisplayErrorContext(err.source().unwrap())), + } + } + + #[tokio::test] + async fn test_throughput_timeout_equal_to() { + let (_guard, _) = capture_test_logs(); + // a tiny bit less. To capture 0-throughput properly, we need to allow 0 to be 0 + let minimum_throughput = Throughput::new(31, Duration::from_secs(4)); + expect_success(minimum_throughput).await; + } + + #[tokio::test] + async fn test_throughput_timeout_greater_than() { + let minimum_throughput = Throughput::new(20, Duration::from_secs(3)); + expect_success(minimum_throughput).await; + } + + // A multiplier for the sine wave amplitude; Chosen arbitrarily. + const BYTE_COUNT_UPPER_LIMIT: u64 = 1000; + + /// emits 1000B/S for 5 seconds then suddenly stops + fn sudden_stop( + async_sleep: impl AsyncSleep + Clone, + ) -> impl futures_util::Stream> { + let sleep_dur = Duration::from_millis(50); + fastrand::seed(0); + futures_util::stream::unfold(1, move |i| { + let async_sleep = async_sleep.clone(); + async move { + let number_seconds = (i * sleep_dur).as_secs_f64(); + async_sleep.sleep(sleep_dur).await; + if number_seconds > 5.0 { + Some((Result::::Ok(Bytes::new()), i + 1)) + } else { + let mut bytes = BytesMut::new(); + let bytes_per_segment = + (BYTE_COUNT_UPPER_LIMIT as f64) * sleep_dur.as_secs_f64(); + for _ in 0..bytes_per_segment as usize { + bytes.put_u8(0) + } + + Some((Result::::Ok(bytes.into()), i + 1)) + } + } + }) + } + + #[tokio::test] + async fn test_stalled_stream_detection() { + test_suddenly_stopping_stream(0, Duration::from_secs(6)).await + } + + #[tokio::test] + async fn test_slow_stream_detection() { + test_suddenly_stopping_stream(BYTE_COUNT_UPPER_LIMIT / 2, Duration::from_secs_f64(5.50)) + .await + } + + #[tokio::test] + async fn test_check_interval() { + let (_guard, _) = capture_test_logs(); + let (ts, sleep) = instant_time_and_sleep(UNIX_EPOCH); + let mut body = MinimumThroughputBody::new( + ts, + sleep.clone(), + NeverBody, + MinimumThroughputBodyOptions::builder() + .check_interval(Duration::from_millis(1234)) + .grace_period(Duration::from_millis(456)) + .build(), + ); + let mut body = pin!(body); + let _ = poll_fn(|cx| body.as_mut().poll_data(cx)).await; + assert_eq!( + sleep.logs(), + vec![ + // sleep, by second sleep we know we have no data, then the grace period + Duration::from_millis(1234), + Duration::from_millis(1234), + Duration::from_millis(456) + ] + ); + } + + async fn test_suddenly_stopping_stream(throughput_limit: u64, time_until_timeout: Duration) { + let (_guard, _) = capture_test_logs(); + let options = MinimumThroughputBodyOptions::builder() + // Minimum throughput per second will be approx. half of the BYTE_COUNT_UPPER_LIMIT. + .minimum_throughput(Throughput::new_bytes_per_second(throughput_limit)) + .build(); + let (time_source, async_sleep) = instant_time_and_sleep(UNIX_EPOCH); + let time_clone = time_source.clone(); + + let stream = sudden_stop(async_sleep.clone()); + let body = ByteStream::new(SdkBody::from_body_0_4(hyper_0_14::body::Body::wrap_stream( + stream, + ))); + let res = body + .map(move |body| { + let time_source = time_clone.clone(); + // We don't want to log these sleeps because it would duplicate + // the `sleep` calls being logged by the MTB + let async_sleep = InstantSleep::unlogged(); + SdkBody::from_body_0_4(MinimumThroughputBody::new( + time_source, + async_sleep, + body, + options.clone(), + )) + }) + .collect(); + + match res.await { + Ok(_res) => { + panic!("stream should have timed out"); + } + Err(err) => { + dbg!(err); + assert_eq!( + async_sleep.total_duration(), + time_until_timeout, + "With throughput limit {:?} expected timeout after {:?} (stream starts sending 0's at 5 seconds.", + throughput_limit, time_until_timeout + ); + } + } + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs new file mode 100644 index 00000000000..4c8fc1177b3 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs @@ -0,0 +1,179 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use super::Throughput; +use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; +use std::time::Duration; + +/// A collection of options for configuring a [`MinimumThroughputBody`](super::MinimumThroughputBody). +#[derive(Debug, Clone)] +pub struct MinimumThroughputBodyOptions { + /// The minimum throughput that is acceptable. + minimum_throughput: Throughput, + /// The 'grace period' after which the minimum throughput will be enforced. + /// + /// If this is set to 0, the minimum throughput will be enforced immediately. + /// + /// If this is set to a positive value, whenever throughput is below the minimum throughput, + /// a timer is started. If the timer expires before throughput rises above the minimum, + /// an error is emitted. + /// + /// It is recommended to set this to a small value (e.g. 200ms) to avoid issues during + /// stream-startup. + grace_period: Duration, + + /// The interval at which the throughput is checked. + check_interval: Duration, + + /// The period of time to consider when computing the throughput + /// + /// This SHOULD be longer than the check interval, or stuck-streams may evade detection. + check_window: Duration, +} + +impl MinimumThroughputBodyOptions { + /// Create a new builder. + pub fn builder() -> MinimumThroughputBodyOptionsBuilder { + Default::default() + } + + /// Convert this struct into a builder. + pub fn to_builder(self) -> MinimumThroughputBodyOptionsBuilder { + MinimumThroughputBodyOptionsBuilder::new() + .minimum_throughput(self.minimum_throughput) + .grace_period(self.grace_period) + .check_interval(self.check_interval) + } + + /// The throughput check grace period. + /// + /// If throughput is below the minimum for longer than this period, an error is emitted. + /// + /// If this is set to 0, the minimum throughput will be enforced immediately. + pub fn grace_period(&self) -> Duration { + self.grace_period + } + + /// The minimum acceptable throughput + pub fn minimum_throughput(&self) -> Throughput { + self.minimum_throughput + } + + pub(crate) fn check_window(&self) -> Duration { + self.check_window + } + + /// The rate at which the throughput is checked. + /// + /// The actual rate throughput is checked may be higher than this value, + /// but it will never be lower. + pub fn check_interval(&self) -> Duration { + self.check_interval + } +} + +impl Default for MinimumThroughputBodyOptions { + fn default() -> Self { + Self { + minimum_throughput: DEFAULT_MINIMUM_THROUGHPUT, + grace_period: DEFAULT_GRACE_PERIOD, + check_interval: DEFAULT_CHECK_INTERVAL, + check_window: DEFAULT_CHECK_WINDOW, + } + } +} + +/// A builder for [`MinimumThroughputBodyOptions`] +#[derive(Debug, Default, Clone)] +pub struct MinimumThroughputBodyOptionsBuilder { + minimum_throughput: Option, + check_interval: Option, + grace_period: Option, +} + +const DEFAULT_CHECK_INTERVAL: Duration = Duration::from_millis(500); +const DEFAULT_GRACE_PERIOD: Duration = Duration::from_secs(0); +const DEFAULT_MINIMUM_THROUGHPUT: Throughput = Throughput { + bytes_read: 1, + per_time_elapsed: Duration::from_secs(1), +}; + +const DEFAULT_CHECK_WINDOW: Duration = Duration::from_secs(1); + +impl MinimumThroughputBodyOptionsBuilder { + /// Create a new `MinimumThroughputBodyOptionsBuilder`. + pub fn new() -> Self { + Default::default() + } + + /// Set the amount of time that throughput my fall below minimum before an error is emitted. + /// + /// If throughput rises above the minimum, the timer is reset. + pub fn grace_period(mut self, grace_period: Duration) -> Self { + self.set_grace_period(Some(grace_period)); + self + } + + /// Set the amount of time that throughput my fall below minimum before an error is emitted. + /// + /// If throughput rises above the minimum, the timer is reset. + pub fn set_grace_period(&mut self, grace_period: Option) -> &mut Self { + self.grace_period = grace_period; + self + } + + /// Set the minimum allowable throughput. + pub fn minimum_throughput(mut self, minimum_throughput: Throughput) -> Self { + self.set_minimum_throughput(Some(minimum_throughput)); + self + } + + /// Set the minimum allowable throughput. + pub fn set_minimum_throughput(&mut self, minimum_throughput: Option) -> &mut Self { + self.minimum_throughput = minimum_throughput; + self + } + + /// Set the rate at which throughput is checked. + /// + /// Defaults to 1 second. + pub fn check_interval(mut self, check_interval: Duration) -> Self { + self.set_check_interval(Some(check_interval)); + self + } + + /// Set the rate at which throughput is checked. + /// + /// Defaults to 1 second. + pub fn set_check_interval(&mut self, check_interval: Option) -> &mut Self { + self.check_interval = check_interval; + self + } + + /// Build this builder, producing a [`MinimumThroughputBodyOptions`]. + /// + /// Unset fields will be set with defaults. + pub fn build(self) -> MinimumThroughputBodyOptions { + MinimumThroughputBodyOptions { + grace_period: self.grace_period.unwrap_or(DEFAULT_GRACE_PERIOD), + minimum_throughput: self + .minimum_throughput + .unwrap_or(DEFAULT_MINIMUM_THROUGHPUT), + check_interval: self.check_interval.unwrap_or(DEFAULT_CHECK_INTERVAL), + check_window: DEFAULT_CHECK_WINDOW, + } + } +} + +impl From for MinimumThroughputBodyOptions { + fn from(value: StalledStreamProtectionConfig) -> Self { + MinimumThroughputBodyOptions { + grace_period: value.grace_period(), + minimum_throughput: DEFAULT_MINIMUM_THROUGHPUT, + check_interval: DEFAULT_CHECK_INTERVAL, + check_window: DEFAULT_CHECK_WINDOW, + } + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs new file mode 100644 index 00000000000..c4d9223b212 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs @@ -0,0 +1,283 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::collections::VecDeque; +use std::fmt; +use std::time::{Duration, SystemTime}; + +/// Throughput representation for use when configuring [`super::MinimumThroughputBody`] +#[derive(Debug, Clone, Copy)] +pub struct Throughput { + pub(super) bytes_read: u64, + pub(super) per_time_elapsed: Duration, +} + +impl Throughput { + /// Create a new throughput with the given bytes read and time elapsed. + pub fn new(bytes_read: u64, per_time_elapsed: Duration) -> Self { + debug_assert!( + !per_time_elapsed.is_zero(), + "cannot create a throughput if per_time_elapsed == 0" + ); + + Self { + bytes_read, + per_time_elapsed, + } + } + + /// Create a new throughput in bytes per second. + pub fn new_bytes_per_second(bytes: u64) -> Self { + Self { + bytes_read: bytes, + per_time_elapsed: Duration::from_secs(1), + } + } + + /// Create a new throughput in kilobytes per second. + pub fn new_kilobytes_per_second(kilobytes: u64) -> Self { + Self { + bytes_read: kilobytes * 1000, + per_time_elapsed: Duration::from_secs(1), + } + } + + /// Create a new throughput in megabytes per second. + pub fn new_megabytes_per_second(megabytes: u64) -> Self { + Self { + bytes_read: megabytes * 1000 * 1000, + per_time_elapsed: Duration::from_secs(1), + } + } + + pub(super) fn bytes_per_second(&self) -> f64 { + let per_time_elapsed_secs = self.per_time_elapsed.as_secs_f64(); + if per_time_elapsed_secs == 0.0 { + return 0.0; // Avoid dividing by zero. + }; + + self.bytes_read as f64 / per_time_elapsed_secs + } +} + +impl PartialEq for Throughput { + fn eq(&self, other: &Self) -> bool { + self.bytes_per_second() == other.bytes_per_second() + } +} + +impl PartialOrd for Throughput { + fn partial_cmp(&self, other: &Self) -> Option { + self.bytes_per_second() + .partial_cmp(&other.bytes_per_second()) + } +} + +impl fmt::Display for Throughput { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // The default float formatting behavior will ensure the a number like 2.000 is rendered as 2 + // while a number like 0.9982107441748642 will be rendered as 0.9982107441748642. This + // multiplication and division will truncate a float to have a precision of no greater than 3. + // For example, 0.9982107441748642 would become 0.999. This will fail for very large floats + // but should suffice for the numbers we're dealing with. + let pretty_bytes_per_second = (self.bytes_per_second() * 1000.0).round() / 1000.0; + + write!(f, "{pretty_bytes_per_second} B/s") + } +} + +impl From<(u64, Duration)> for Throughput { + fn from(value: (u64, Duration)) -> Self { + Self { + bytes_read: value.0, + per_time_elapsed: value.1, + } + } +} + +#[derive(Clone)] +pub(super) struct ThroughputLogs { + max_length: usize, + inner: VecDeque<(SystemTime, u64)>, + bytes_processed: u64, +} + +impl ThroughputLogs { + pub(super) fn new(max_length: usize) -> Self { + Self { + inner: VecDeque::with_capacity(max_length), + max_length, + bytes_processed: 0, + } + } + + pub(super) fn push(&mut self, throughput: (SystemTime, u64)) { + // When the number of logs exceeds the max length, toss the oldest log. + if self.inner.len() == self.max_length { + self.bytes_processed -= self.inner.pop_front().map(|(_, sz)| sz).unwrap_or_default(); + } + + debug_assert!(self.inner.capacity() > self.inner.len()); + self.bytes_processed += throughput.1; + self.inner.push_back(throughput); + } + + fn buffer_full(&self) -> bool { + self.inner.len() == self.max_length + } + + pub(super) fn calculate_throughput( + &self, + now: SystemTime, + time_window: Duration, + ) -> Option { + // There are a lot of pathological cases that are 0 throughput. These cases largely shouldn't + // happen, because the check interval MUST be less than the check window + let total_length = self + .inner + .iter() + .last()? + .0 + .duration_since(self.inner.get(0)?.0) + .ok()?; + // during a "healthy" request we'll only have a few milliseconds of logs (shorter than the check window) + if total_length < time_window { + // if we haven't hit our requested time window & the buffer still isn't full, then + // return `None` — this is the "startup grace period" + return if !self.buffer_full() { + None + } else { + // Otherwise, if the entire buffer fits in the timewindow, we can the shortcut to + // avoid recomputing all the data + Some(Throughput { + bytes_read: self.bytes_processed, + per_time_elapsed: total_length, + }) + }; + } + let minimum_ts = now - time_window; + let first_item = self.inner.iter().find(|(ts, _)| *ts >= minimum_ts)?.0; + + let time_elapsed = now.duration_since(first_item).unwrap_or_default(); + + let total_bytes_logged = self + .inner + .iter() + .rev() + .take_while(|(ts, _)| *ts > minimum_ts) + .map(|t| t.1) + .sum::(); + + Some(Throughput { + bytes_read: total_bytes_logged, + per_time_elapsed: time_elapsed, + }) + } +} + +#[cfg(test)] +mod test { + use super::{Throughput, ThroughputLogs}; + use std::time::{Duration, SystemTime, UNIX_EPOCH}; + + #[test] + fn test_throughput_eq() { + let t1 = Throughput::new(1, Duration::from_secs(1)); + let t2 = Throughput::new(25, Duration::from_secs(25)); + let t3 = Throughput::new(100, Duration::from_secs(100)); + + assert_eq!(t1, t2); + assert_eq!(t2, t3); + } + + fn build_throughput_log( + length: u32, + tick_duration: Duration, + rate: u64, + ) -> (ThroughputLogs, SystemTime) { + let mut throughput_logs = ThroughputLogs::new(length as usize); + for i in 1..=length { + throughput_logs.push((UNIX_EPOCH + (tick_duration * i), rate)); + } + + assert_eq!(length as usize, throughput_logs.inner.len()); + (throughput_logs, UNIX_EPOCH + (tick_duration * length)) + } + + const EPSILON: f64 = 0.001; + macro_rules! assert_delta { + ($x:expr, $y:expr, $d:expr) => { + if !(($x as f64) - $y < $d || $y - ($x as f64) < $d) { + panic!(); + } + }; + } + + #[test] + fn test_throughput_log_calculate_throughput_1() { + let (throughput_logs, now) = build_throughput_log(1000, Duration::from_secs(1), 1); + + for dur in [10, 100, 100] { + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(dur)) + .unwrap(); + assert_eq!(1.0, throughput.bytes_per_second()); + } + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs_f64(101.5)) + .unwrap(); + assert_delta!(1, throughput.bytes_per_second(), EPSILON); + } + + #[test] + fn test_throughput_log_calculate_throughput_2() { + let (throughput_logs, now) = build_throughput_log(1000, Duration::from_secs(5), 5); + + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(1000)) + .unwrap(); + assert_eq!(1.0, throughput.bytes_per_second()); + } + + #[test] + fn test_throughput_log_calculate_throughput_3() { + let (throughput_logs, now) = build_throughput_log(1000, Duration::from_millis(200), 1024); + + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(5)) + .unwrap(); + let expected_throughput = 1024.0 * 5.0; + assert_eq!(expected_throughput, throughput.bytes_per_second()); + } + + #[test] + fn test_throughput_log_calculate_throughput_4() { + let (throughput_logs, now) = build_throughput_log(1000, Duration::from_millis(100), 12); + + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(1)) + .unwrap(); + let expected_throughput = 12.0 * 10.0; + + assert_eq!(expected_throughput, throughput.bytes_per_second()); + } + + #[test] + fn test_throughput_followed_by_0() { + let tick = Duration::from_millis(100); + let (mut throughput_logs, now) = build_throughput_log(1000, tick, 12); + let throughput = throughput_logs + .calculate_throughput(now, Duration::from_secs(1)) + .unwrap(); + let expected_throughput = 12.0 * 10.0; + + assert_eq!(expected_throughput, throughput.bytes_per_second()); + throughput_logs.push((now + tick, 0)); + let throughput = throughput_logs + .calculate_throughput(now + tick, Duration::from_secs(1)) + .unwrap(); + assert_eq!(108.0, throughput.bytes_per_second()); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs new file mode 100644 index 00000000000..a82d242ebe3 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs @@ -0,0 +1,168 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::client::retries::classifiers::run_classifiers_on_ctx; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::connection::ConnectionMetadata; +use aws_smithy_runtime_api::client::interceptors::context::{ + AfterDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, +}; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::retries::classifiers::RetryAction; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; +use aws_smithy_types::retry::{ReconnectMode, RetryConfig}; +use std::fmt; +use std::sync::{Arc, Mutex}; +use tracing::{debug, error}; + +/// An interceptor for poisoning connections in response to certain events. +/// +/// This interceptor, when paired with a compatible connection, allows the connection to be +/// poisoned in reaction to certain events *(like receiving a transient error.)* This allows users +/// to avoid sending requests to a server that isn't responding. This can increase the load on a +/// server, because more connections will be made overall. +/// +/// **In order for this interceptor to work,** the configured connection must interact with the +/// "connection retriever" stored in an HTTP request's `extensions` map. For an example of this, +/// see [`HyperConnector`]. When a connection is made available to the retriever, this interceptor +/// will call a `.poison` method on it, signalling that the connection should be dropped. It is +/// up to the connection implementer to handle this. +/// +/// [`HyperConnector`]: https://github.com/smithy-lang/smithy-rs/blob/26a914ece072bba2dd9b5b49003204b70e7666ac/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs#L347 +#[non_exhaustive] +#[derive(Debug, Default)] +pub struct ConnectionPoisoningInterceptor {} + +impl ConnectionPoisoningInterceptor { + /// Create a new `ConnectionPoisoningInterceptor`. + pub fn new() -> Self { + Self::default() + } +} + +impl Intercept for ConnectionPoisoningInterceptor { + fn name(&self) -> &'static str { + "ConnectionPoisoningInterceptor" + } + + fn modify_before_transmit( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let capture_smithy_connection = CaptureSmithyConnection::new(); + context + .request_mut() + .add_extension(capture_smithy_connection.clone()); + cfg.interceptor_state().store_put(capture_smithy_connection); + + Ok(()) + } + + fn read_after_deserialization( + &self, + context: &AfterDeserializationInterceptorContextRef<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + let reconnect_mode = cfg + .load::() + .map(RetryConfig::reconnect_mode) + .unwrap_or(ReconnectMode::ReconnectOnTransientError); + let captured_connection = cfg.load::().cloned(); + let retry_classifier_result = + run_classifiers_on_ctx(runtime_components.retry_classifiers(), context.inner()); + let error_is_transient = retry_classifier_result == RetryAction::transient_error(); + let connection_poisoning_is_enabled = + reconnect_mode == ReconnectMode::ReconnectOnTransientError; + + if error_is_transient && connection_poisoning_is_enabled { + debug!("received a transient error, poisoning the connection..."); + + if let Some(captured_connection) = captured_connection.and_then(|conn| conn.get()) { + captured_connection.poison(); + debug!("the connection was poisoned") + } else { + error!( + "unable to poison the connection because no connection was found! The underlying HTTP connector never set a connection." + ); + } + } + + Ok(()) + } +} + +type LoaderFn = dyn Fn() -> Option + Send + Sync; + +/// State for a middleware that will monitor and manage connections. +#[derive(Clone, Default)] +pub struct CaptureSmithyConnection { + loader: Arc>>>, +} + +impl CaptureSmithyConnection { + /// Create a new connection monitor. + pub fn new() -> Self { + Self { + loader: Default::default(), + } + } + + /// Set the retriever that will capture the `hyper` connection. + pub fn set_connection_retriever(&self, f: F) + where + F: Fn() -> Option + Send + Sync + 'static, + { + *self.loader.lock().unwrap() = Some(Box::new(f)); + } + + /// Get the associated connection metadata. + pub fn get(&self) -> Option { + match self.loader.lock().unwrap().as_ref() { + Some(loader) => loader(), + None => { + tracing::debug!("no loader was set on the CaptureSmithyConnection"); + None + } + } + } +} + +impl fmt::Debug for CaptureSmithyConnection { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "CaptureSmithyConnection") + } +} + +impl Storable for CaptureSmithyConnection { + type Storer = StoreReplace; +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + #[allow(clippy::redundant_clone)] + fn retrieve_connection_metadata() { + let retriever = CaptureSmithyConnection::new(); + let retriever_clone = retriever.clone(); + assert!(retriever.get().is_none()); + retriever.set_connection_retriever(|| { + Some( + ConnectionMetadata::builder() + .proxied(true) + .poison_fn(|| {}) + .build(), + ) + }); + + assert!(retriever.get().is_some()); + assert!(retriever_clone.get().is_some()); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs new file mode 100644 index 00000000000..e5aabaf81d0 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs @@ -0,0 +1,1133 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::client::http::connection_poisoning::CaptureSmithyConnection; +use crate::client::http::hyper_014::timeout_middleware::HttpTimeoutError; +use aws_smithy_async::future::timeout::TimedOutError; +use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep}; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::connection::ConnectionMetadata; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, + SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_runtime_api::client::result::ConnectorError; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, +}; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::config_bag::ConfigBag; +use aws_smithy_types::error::display::DisplayErrorContext; +use aws_smithy_types::retry::ErrorKind; +use h2::Reason; +use http::{Extensions, Uri}; +use hyper_0_14::client::connect::{capture_connection, CaptureConnection, Connection, HttpInfo}; +use hyper_0_14::service::Service; +use std::collections::HashMap; +use std::error::Error; +use std::fmt; +use std::fmt::Debug; +use std::sync::RwLock; +use std::time::Duration; +use tokio::io::{AsyncRead, AsyncWrite}; + +#[cfg(feature = "tls-rustls")] +mod default_connector { + use aws_smithy_async::rt::sleep::SharedAsyncSleep; + use aws_smithy_runtime_api::client::http::HttpConnectorSettings; + use hyper_0_14::client::HttpConnector; + use hyper_rustls::HttpsConnector; + + // Creating a `with_native_roots` HTTP client takes 300ms on OS X. Cache this so that we + // don't need to repeatedly incur that cost. + pub(crate) static HTTPS_NATIVE_ROOTS: once_cell::sync::Lazy< + hyper_rustls::HttpsConnector, + > = once_cell::sync::Lazy::new(default_tls); + + fn default_tls() -> HttpsConnector { + use hyper_rustls::ConfigBuilderExt; + hyper_rustls::HttpsConnectorBuilder::new() + .with_tls_config( + rustls::ClientConfig::builder() + .with_cipher_suites(&[ + // TLS1.3 suites + rustls::cipher_suite::TLS13_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS13_AES_128_GCM_SHA256, + // TLS1.2 suites + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, + ]) + .with_safe_default_kx_groups() + .with_safe_default_protocol_versions() + .expect("Error with the TLS configuration. Please file a bug report under https://github.com/smithy-lang/smithy-rs/issues.") + .with_native_roots() + .with_no_client_auth() + ) + .https_or_http() + .enable_http1() + .enable_http2() + .build() + } + + pub(super) fn base( + settings: &HttpConnectorSettings, + sleep: Option, + ) -> super::HyperConnectorBuilder { + let mut hyper = super::HyperConnector::builder().connector_settings(settings.clone()); + if let Some(sleep) = sleep { + hyper = hyper.sleep_impl(sleep); + } + hyper + } + + /// Return a default HTTPS connector backed by the `rustls` crate. + /// + /// It requires a minimum TLS version of 1.2. + /// It allows you to connect to both `http` and `https` URLs. + pub(super) fn https() -> hyper_rustls::HttpsConnector { + HTTPS_NATIVE_ROOTS.clone() + } +} + +/// Given `HttpConnectorSettings` and an `SharedAsyncSleep`, create a `SharedHttpConnector` from defaults depending on what cargo features are activated. +pub fn default_connector( + settings: &HttpConnectorSettings, + sleep: Option, +) -> Option { + #[cfg(feature = "tls-rustls")] + { + tracing::trace!(settings = ?settings, sleep = ?sleep, "creating a new default connector"); + let hyper = default_connector::base(settings, sleep).build_https(); + Some(SharedHttpConnector::new(hyper)) + } + #[cfg(not(feature = "tls-rustls"))] + { + tracing::trace!(settings = ?settings, sleep = ?sleep, "no default connector available"); + None + } +} + +/// Creates a hyper-backed HTTPS client from defaults depending on what cargo features are activated. +pub fn default_client() -> Option { + #[cfg(feature = "tls-rustls")] + { + tracing::trace!("creating a new default hyper 0.14.x client"); + Some(HyperClientBuilder::new().build_https()) + } + #[cfg(not(feature = "tls-rustls"))] + { + tracing::trace!("no default connector available"); + None + } +} + +/// [`HttpConnector`] that uses [`hyper_0_14`] to make HTTP requests. +/// +/// This connector also implements socket connect and read timeouts. +/// +/// This shouldn't be used directly in most cases. +/// See the docs on [`HyperClientBuilder`] for examples of how +/// to customize the Hyper client. +#[derive(Debug)] +pub struct HyperConnector { + adapter: Box, +} + +impl HyperConnector { + /// Builder for a Hyper connector. + pub fn builder() -> HyperConnectorBuilder { + Default::default() + } +} + +impl HttpConnector for HyperConnector { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + self.adapter.call(request) + } +} + +/// Builder for [`HyperConnector`]. +#[derive(Default, Debug)] +pub struct HyperConnectorBuilder { + connector_settings: Option, + sleep_impl: Option, + client_builder: Option, +} + +impl HyperConnectorBuilder { + /// Create a [`HyperConnector`] from this builder and a given connector. + pub fn build(self, tcp_connector: C) -> HyperConnector + where + C: Clone + Send + Sync + 'static, + C: Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, + { + let client_builder = self.client_builder.unwrap_or_default(); + let sleep_impl = self.sleep_impl.or_else(default_async_sleep); + let (connect_timeout, read_timeout) = self + .connector_settings + .map(|c| (c.connect_timeout(), c.read_timeout())) + .unwrap_or((None, None)); + + let connector = match connect_timeout { + Some(duration) => timeout_middleware::ConnectTimeout::new( + tcp_connector, + sleep_impl + .clone() + .expect("a sleep impl must be provided in order to have a connect timeout"), + duration, + ), + None => timeout_middleware::ConnectTimeout::no_timeout(tcp_connector), + }; + let base = client_builder.build(connector); + let read_timeout = match read_timeout { + Some(duration) => timeout_middleware::HttpReadTimeout::new( + base, + sleep_impl.expect("a sleep impl must be provided in order to have a read timeout"), + duration, + ), + None => timeout_middleware::HttpReadTimeout::no_timeout(base), + }; + HyperConnector { + adapter: Box::new(Adapter { + client: read_timeout, + }), + } + } + + /// Create a [`HyperConnector`] with the default rustls HTTPS implementation. + #[cfg(feature = "tls-rustls")] + pub fn build_https(self) -> HyperConnector { + self.build(default_connector::https()) + } + + /// Set the async sleep implementation used for timeouts + /// + /// Calling this is only necessary for testing or to use something other than + /// [`default_async_sleep`]. + pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self { + self.sleep_impl = Some(sleep_impl.into_shared()); + self + } + + /// Set the async sleep implementation used for timeouts + /// + /// Calling this is only necessary for testing or to use something other than + /// [`default_async_sleep`]. + pub fn set_sleep_impl(&mut self, sleep_impl: Option) -> &mut Self { + self.sleep_impl = sleep_impl; + self + } + + /// Configure the HTTP settings for the `HyperAdapter` + pub fn connector_settings(mut self, connector_settings: HttpConnectorSettings) -> Self { + self.connector_settings = Some(connector_settings); + self + } + + /// Configure the HTTP settings for the `HyperAdapter` + pub fn set_connector_settings( + &mut self, + connector_settings: Option, + ) -> &mut Self { + self.connector_settings = connector_settings; + self + } + + /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client. + /// + /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. + pub fn hyper_builder(mut self, hyper_builder: hyper_0_14::client::Builder) -> Self { + self.client_builder = Some(hyper_builder); + self + } + + /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client. + /// + /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. + pub fn set_hyper_builder( + &mut self, + hyper_builder: Option, + ) -> &mut Self { + self.client_builder = hyper_builder; + self + } +} + +/// Adapter from a [`hyper_0_14::Client`] to [`HttpConnector`]. +/// +/// This adapter also enables TCP `CONNECT` and HTTP `READ` timeouts via [`HyperConnector::builder`]. +struct Adapter { + client: timeout_middleware::HttpReadTimeout< + hyper_0_14::Client, SdkBody>, + >, +} + +impl fmt::Debug for Adapter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Adapter") + .field("client", &"** hyper client **") + .finish() + } +} + +/// Extract a smithy connection from a hyper CaptureConnection +fn extract_smithy_connection(capture_conn: &CaptureConnection) -> Option { + let capture_conn = capture_conn.clone(); + if let Some(conn) = capture_conn.clone().connection_metadata().as_ref() { + let mut extensions = Extensions::new(); + conn.get_extras(&mut extensions); + let http_info = extensions.get::(); + let mut builder = ConnectionMetadata::builder() + .proxied(conn.is_proxied()) + .poison_fn(move || match capture_conn.connection_metadata().as_ref() { + Some(conn) => conn.poison(), + None => tracing::trace!("no connection existed to poison"), + }); + + builder + .set_local_addr(http_info.map(|info| info.local_addr())) + .set_remote_addr(http_info.map(|info| info.remote_addr())); + + let smithy_connection = builder.build(); + + Some(smithy_connection) + } else { + None + } +} + +impl HttpConnector for Adapter +where + C: Clone + Send + Sync + 'static, + C: hyper_0_14::service::Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, +{ + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + let mut request = match request.try_into_http02x() { + Ok(request) => request, + Err(err) => { + return HttpConnectorFuture::ready(Err(ConnectorError::other(err.into(), None))); + } + }; + let capture_connection = capture_connection(&mut request); + if let Some(capture_smithy_connection) = + request.extensions().get::() + { + capture_smithy_connection + .set_connection_retriever(move || extract_smithy_connection(&capture_connection)); + } + let mut client = self.client.clone(); + let fut = client.call(request); + HttpConnectorFuture::new(async move { + let response = fut + .await + .map_err(downcast_error)? + .map(SdkBody::from_body_0_4); + match HttpResponse::try_from(response) { + Ok(response) => Ok(response), + Err(err) => Err(ConnectorError::other(err.into(), None)), + } + }) + } +} + +/// Downcast errors coming out of hyper into an appropriate `ConnectorError` +fn downcast_error(err: BoxError) -> ConnectorError { + // is a `TimedOutError` (from aws_smithy_async::timeout) in the chain? if it is, this is a timeout + if find_source::(err.as_ref()).is_some() { + return ConnectorError::timeout(err); + } + // is the top of chain error actually already a `ConnectorError`? return that directly + let err = match err.downcast::() { + Ok(connector_error) => return *connector_error, + Err(box_error) => box_error, + }; + // generally, the top of chain will probably be a hyper error. Go through a set of hyper specific + // error classifications + let err = match err.downcast::() { + Ok(hyper_error) => return to_connector_error(*hyper_error), + Err(box_error) => box_error, + }; + + // otherwise, we have no idea! + ConnectorError::other(err, None) +} + +/// Convert a [`hyper_0_14::Error`] into a [`ConnectorError`] +fn to_connector_error(err: hyper_0_14::Error) -> ConnectorError { + if err.is_timeout() || find_source::(&err).is_some() { + return ConnectorError::timeout(err.into()); + } + if err.is_user() { + return ConnectorError::user(err.into()); + } + if err.is_closed() || err.is_canceled() || find_source::(&err).is_some() { + return ConnectorError::io(err.into()); + } + // We sometimes receive this from S3: hyper::Error(IncompleteMessage) + if err.is_incomplete_message() { + return ConnectorError::other(err.into(), Some(ErrorKind::TransientError)); + } + if let Some(h2_err) = find_source::(&err) { + if h2_err.is_go_away() + || (h2_err.is_reset() && h2_err.reason() == Some(Reason::REFUSED_STREAM)) + { + return ConnectorError::io(err.into()); + } + } + + tracing::warn!(err = %DisplayErrorContext(&err), "unrecognized error from Hyper. If this error should be retried, please file an issue."); + ConnectorError::other(err.into(), None) +} + +fn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option<&'a E> { + let mut next = Some(err); + while let Some(err) = next { + if let Some(matching_err) = err.downcast_ref::() { + return Some(matching_err); + } + next = err.source(); + } + None +} + +#[derive(Clone, Debug, Eq, PartialEq, Hash)] +struct CacheKey { + connect_timeout: Option, + read_timeout: Option, +} + +impl From<&HttpConnectorSettings> for CacheKey { + fn from(value: &HttpConnectorSettings) -> Self { + Self { + connect_timeout: value.connect_timeout(), + read_timeout: value.read_timeout(), + } + } +} + +struct HyperClient { + connector_cache: RwLock>, + client_builder: hyper_0_14::client::Builder, + tcp_connector_fn: F, +} + +impl fmt::Debug for HyperClient { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("HyperClient") + .field("connector_cache", &self.connector_cache) + .field("client_builder", &self.client_builder) + .finish() + } +} + +impl HttpClient for HyperClient +where + F: Fn() -> C + Send + Sync, + C: Clone + Send + Sync + 'static, + C: Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, +{ + fn validate_base_client_config( + &self, + _: &RuntimeComponentsBuilder, + _: &ConfigBag, + ) -> Result<(), BoxError> { + // Initialize the TCP connector at this point so that native certs load + // at client initialization time instead of upon first request. We do it + // here rather than at construction so that it won't run if this is not + // the selected HTTP client for the base config (for example, if this was + // the default HTTP client, and it was overridden by a later plugin). + let _ = (self.tcp_connector_fn)(); + Ok(()) + } + + fn http_connector( + &self, + settings: &HttpConnectorSettings, + components: &RuntimeComponents, + ) -> SharedHttpConnector { + let key = CacheKey::from(settings); + let mut connector = self.connector_cache.read().unwrap().get(&key).cloned(); + if connector.is_none() { + let mut cache = self.connector_cache.write().unwrap(); + // Short-circuit if another thread already wrote a connector to the cache for this key + if !cache.contains_key(&key) { + let mut builder = HyperConnector::builder() + .hyper_builder(self.client_builder.clone()) + .connector_settings(settings.clone()); + builder.set_sleep_impl(components.sleep_impl()); + + let start = components.time_source().map(|ts| ts.now()); + let tcp_connector = (self.tcp_connector_fn)(); + let end = components.time_source().map(|ts| ts.now()); + if let (Some(start), Some(end)) = (start, end) { + if let Ok(elapsed) = end.duration_since(start) { + tracing::debug!("new TCP connector created in {:?}", elapsed); + } + } + let connector = SharedHttpConnector::new(builder.build(tcp_connector)); + cache.insert(key.clone(), connector); + } + connector = cache.get(&key).cloned(); + } + + connector.expect("cache populated above") + } +} + +/// Builder for a hyper-backed [`HttpClient`] implementation. +/// +/// This builder can be used to customize the underlying TCP connector used, as well as +/// hyper client configuration. +/// +/// # Examples +/// +/// Construct a Hyper client with the default TLS implementation (rustls). +/// This can be useful when you want to share a Hyper connector between multiple +/// generated Smithy clients. +/// +/// ```no_run,ignore +/// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +/// +/// let http_client = HyperClientBuilder::new().build_https(); +/// +/// // This connector can then be given to a generated service Config +/// let config = my_service_client::Config::builder() +/// .endpoint_url("http://localhost:1234") +/// .http_client(http_client) +/// .build(); +/// let client = my_service_client::Client::from_conf(config); +/// ``` +/// +/// ## Use a Hyper client with WebPKI roots +/// +/// A use case for where you may want to use the [`HyperClientBuilder`] is when +/// setting Hyper client settings that aren't otherwise exposed by the `Config` +/// builder interface. Some examples include changing: +/// +/// - Hyper client settings +/// - Allowed TLS cipher suites +/// - Using an alternative TLS connector library (not the default, rustls) +/// - CA trust root certificates (illustrated using WebPKI below) +/// +/// ```no_run,ignore +/// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +/// +/// let https_connector = hyper_rustls::HttpsConnectorBuilder::new() +/// .with_webpki_roots() +/// .https_only() +/// .enable_http1() +/// .enable_http2() +/// .build(); +/// let http_client = HyperClientBuilder::new().build(https_connector); +/// +/// // This connector can then be given to a generated service Config +/// let config = my_service_client::Config::builder() +/// .endpoint_url("https://example.com") +/// .http_client(http_client) +/// .build(); +/// let client = my_service_client::Client::from_conf(config); +/// ``` +#[derive(Clone, Default, Debug)] +pub struct HyperClientBuilder { + client_builder: Option, +} + +impl HyperClientBuilder { + /// Creates a new builder. + pub fn new() -> Self { + Self::default() + } + + /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client. + /// + /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. + pub fn hyper_builder(mut self, hyper_builder: hyper_0_14::client::Builder) -> Self { + self.client_builder = Some(hyper_builder); + self + } + + /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client. + /// + /// This enables changing settings like forcing HTTP2 and modifying other default client behavior. + pub fn set_hyper_builder( + &mut self, + hyper_builder: Option, + ) -> &mut Self { + self.client_builder = hyper_builder; + self + } + + /// Create a hyper client with the default rustls HTTPS implementation. + /// + /// The trusted certificates will be loaded later when this becomes the selected + /// HTTP client for a Smithy client. + #[cfg(feature = "tls-rustls")] + pub fn build_https(self) -> SharedHttpClient { + self.build_with_fn(default_connector::https) + } + + /// Create a [`SharedHttpClient`] from this builder and a given connector. + /// + #[cfg_attr( + feature = "tls-rustls", + doc = "Use [`build_https`](HyperClientBuilder::build_https) if you don't want to provide a custom TCP connector." + )] + pub fn build(self, tcp_connector: C) -> SharedHttpClient + where + C: Clone + Send + Sync + 'static, + C: Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, + { + self.build_with_fn(move || tcp_connector.clone()) + } + + fn build_with_fn(self, tcp_connector_fn: F) -> SharedHttpClient + where + F: Fn() -> C + Send + Sync + 'static, + C: Clone + Send + Sync + 'static, + C: Service, + C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static, + C::Future: Unpin + Send + 'static, + C::Error: Into, + { + SharedHttpClient::new(HyperClient { + connector_cache: RwLock::new(HashMap::new()), + client_builder: self.client_builder.unwrap_or_default(), + tcp_connector_fn, + }) + } +} + +mod timeout_middleware { + use aws_smithy_async::future::timeout::{TimedOutError, Timeout}; + use aws_smithy_async::rt::sleep::Sleep; + use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; + use aws_smithy_runtime_api::box_error::BoxError; + use http::Uri; + use pin_project_lite::pin_project; + use std::error::Error; + use std::fmt::Formatter; + use std::future::Future; + use std::pin::Pin; + use std::task::{Context, Poll}; + use std::time::Duration; + + #[derive(Debug)] + pub(crate) struct HttpTimeoutError { + kind: &'static str, + duration: Duration, + } + + impl std::fmt::Display for HttpTimeoutError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{} timeout occurred after {:?}", + self.kind, self.duration + ) + } + } + + impl Error for HttpTimeoutError { + // We implement the `source` function as returning a `TimedOutError` because when `downcast_error` + // or `find_source` is called with an `HttpTimeoutError` (or another error wrapping an `HttpTimeoutError`) + // this method will be checked to determine if it's a timeout-related error. + fn source(&self) -> Option<&(dyn Error + 'static)> { + Some(&TimedOutError) + } + } + + /// Timeout wrapper that will timeout on the initial TCP connection + /// + /// # Stability + /// This interface is unstable. + #[derive(Clone, Debug)] + pub(super) struct ConnectTimeout { + inner: I, + timeout: Option<(SharedAsyncSleep, Duration)>, + } + + impl ConnectTimeout { + /// Create a new `ConnectTimeout` around `inner`. + /// + /// Typically, `I` will implement [`hyper_0_14::client::connect::Connect`]. + pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { + Self { + inner, + timeout: Some((sleep, timeout)), + } + } + + pub(crate) fn no_timeout(inner: I) -> Self { + Self { + inner, + timeout: None, + } + } + } + + #[derive(Clone, Debug)] + pub(crate) struct HttpReadTimeout { + inner: I, + timeout: Option<(SharedAsyncSleep, Duration)>, + } + + impl HttpReadTimeout { + /// Create a new `HttpReadTimeout` around `inner`. + /// + /// Typically, `I` will implement [`hyper_0_14::service::Service>`]. + pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self { + Self { + inner, + timeout: Some((sleep, timeout)), + } + } + + pub(crate) fn no_timeout(inner: I) -> Self { + Self { + inner, + timeout: None, + } + } + } + + pin_project! { + /// Timeout future for Tower services + /// + /// Timeout future to handle timing out, mapping errors, and the possibility of not timing out + /// without incurring an additional allocation for each timeout layer. + #[project = MaybeTimeoutFutureProj] + pub enum MaybeTimeoutFuture { + Timeout { + #[pin] + timeout: Timeout, + error_type: &'static str, + duration: Duration, + }, + NoTimeout { + #[pin] + future: F + } + } + } + + impl Future for MaybeTimeoutFuture + where + F: Future>, + E: Into, + { + type Output = Result; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let (timeout_future, kind, &mut duration) = match self.project() { + MaybeTimeoutFutureProj::NoTimeout { future } => { + return future.poll(cx).map_err(|err| err.into()); + } + MaybeTimeoutFutureProj::Timeout { + timeout, + error_type, + duration, + } => (timeout, error_type, duration), + }; + match timeout_future.poll(cx) { + Poll::Ready(Ok(response)) => Poll::Ready(response.map_err(|err| err.into())), + Poll::Ready(Err(_timeout)) => { + Poll::Ready(Err(HttpTimeoutError { kind, duration }.into())) + } + Poll::Pending => Poll::Pending, + } + } + } + + impl hyper_0_14::service::Service for ConnectTimeout + where + I: hyper_0_14::service::Service, + I::Error: Into, + { + type Response = I::Response; + type Error = BoxError; + type Future = MaybeTimeoutFuture; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.inner.poll_ready(cx).map_err(|err| err.into()) + } + + fn call(&mut self, req: Uri) -> Self::Future { + match &self.timeout { + Some((sleep, duration)) => { + let sleep = sleep.sleep(*duration); + MaybeTimeoutFuture::Timeout { + timeout: Timeout::new(self.inner.call(req), sleep), + error_type: "HTTP connect", + duration: *duration, + } + } + None => MaybeTimeoutFuture::NoTimeout { + future: self.inner.call(req), + }, + } + } + } + + impl hyper_0_14::service::Service> for HttpReadTimeout + where + I: hyper_0_14::service::Service, Error = hyper_0_14::Error>, + { + type Response = I::Response; + type Error = BoxError; + type Future = MaybeTimeoutFuture; + + fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { + self.inner.poll_ready(cx).map_err(|err| err.into()) + } + + fn call(&mut self, req: http::Request) -> Self::Future { + match &self.timeout { + Some((sleep, duration)) => { + let sleep = sleep.sleep(*duration); + MaybeTimeoutFuture::Timeout { + timeout: Timeout::new(self.inner.call(req), sleep), + error_type: "HTTP read", + duration: *duration, + } + } + None => MaybeTimeoutFuture::NoTimeout { + future: self.inner.call(req), + }, + } + } + } + + #[cfg(test)] + mod test { + use super::super::*; + use super::*; + use aws_smithy_async::assert_elapsed; + use aws_smithy_async::future::never::Never; + use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; + use aws_smithy_types::error::display::DisplayErrorContext; + use hyper_0_14::client::connect::Connected; + use std::time::Duration; + use tokio::io::ReadBuf; + use tokio::net::TcpStream; + + #[allow(unused)] + fn connect_timeout_is_correct() { + is_send_sync::>(); + } + + #[allow(unused)] + fn is_send_sync() {} + + /// A service that will never return whatever it is you want + /// + /// Returned futures will return Pending forever + #[non_exhaustive] + #[derive(Clone, Default, Debug)] + struct NeverConnects; + impl hyper_0_14::service::Service for NeverConnects { + type Response = TcpStream; + type Error = ConnectorError; + type Future = Pin> + Send>>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, _uri: Uri) -> Self::Future { + Box::pin(async move { + Never::new().await; + unreachable!() + }) + } + } + + /// A service that will connect but never send any data + #[derive(Clone, Debug, Default)] + struct NeverReplies; + impl hyper_0_14::service::Service for NeverReplies { + type Response = EmptyStream; + type Error = BoxError; + type Future = std::future::Ready>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, _req: Uri) -> Self::Future { + std::future::ready(Ok(EmptyStream)) + } + } + + /// A stream that will never return or accept any data + #[non_exhaustive] + #[derive(Debug, Default)] + struct EmptyStream; + impl AsyncRead for EmptyStream { + fn poll_read( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &mut ReadBuf<'_>, + ) -> Poll> { + Poll::Pending + } + } + impl AsyncWrite for EmptyStream { + fn poll_write( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &[u8], + ) -> Poll> { + Poll::Pending + } + + fn poll_flush( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Pending + } + + fn poll_shutdown( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Pending + } + } + impl Connection for EmptyStream { + fn connected(&self) -> Connected { + Connected::new() + } + } + + #[tokio::test] + async fn http_connect_timeout_works() { + let tcp_connector = NeverConnects::default(); + let connector_settings = HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(1)) + .build(); + let hyper = HyperConnector::builder() + .connector_settings(connector_settings) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .build(tcp_connector) + .adapter; + let now = tokio::time::Instant::now(); + tokio::time::pause(); + let resp = hyper + .call(HttpRequest::get("https://static-uri.com").unwrap()) + .await + .unwrap_err(); + assert!( + resp.is_timeout(), + "expected resp.is_timeout() to be true but it was false, resp == {:?}", + resp + ); + let message = DisplayErrorContext(&resp).to_string(); + let expected = + "timeout: error trying to connect: HTTP connect timeout occurred after 1s"; + assert!( + message.contains(expected), + "expected '{message}' to contain '{expected}'" + ); + assert_elapsed!(now, Duration::from_secs(1)); + } + + #[tokio::test] + async fn http_read_timeout_works() { + let tcp_connector = NeverReplies::default(); + let connector_settings = HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(1)) + .read_timeout(Duration::from_secs(2)) + .build(); + let hyper = HyperConnector::builder() + .connector_settings(connector_settings) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .build(tcp_connector) + .adapter; + let now = tokio::time::Instant::now(); + tokio::time::pause(); + let err = hyper + .call(HttpRequest::get("https://fake-uri.com").unwrap()) + .await + .unwrap_err(); + assert!( + err.is_timeout(), + "expected err.is_timeout() to be true but it was false, err == {err:?}", + ); + let message = format!("{}", DisplayErrorContext(&err)); + let expected = "timeout: HTTP read timeout occurred after 2s"; + assert!( + message.contains(expected), + "expected '{message}' to contain '{expected}'" + ); + assert_elapsed!(now, Duration::from_secs(2)); + } + } +} + +#[cfg(all(test, feature = "test-util"))] +mod test { + use super::*; + use crate::client::http::test_util::NeverTcpConnector; + use aws_smithy_async::time::SystemTimeSource; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use http::Uri; + use hyper_0_14::client::connect::{Connected, Connection}; + use std::io::{Error, ErrorKind}; + use std::pin::Pin; + use std::sync::atomic::{AtomicU32, Ordering}; + use std::sync::Arc; + use std::task::{Context, Poll}; + use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; + + #[tokio::test] + async fn connector_selection() { + // Create a client that increments a count every time it creates a new HyperConnector + let creation_count = Arc::new(AtomicU32::new(0)); + let http_client = HyperClientBuilder::new().build_with_fn({ + let count = creation_count.clone(); + move || { + count.fetch_add(1, Ordering::Relaxed); + NeverTcpConnector::new() + } + }); + + // This configuration should result in 4 separate connectors with different timeout settings + let settings = [ + HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(3)) + .build(), + HttpConnectorSettings::builder() + .read_timeout(Duration::from_secs(3)) + .build(), + HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(3)) + .read_timeout(Duration::from_secs(3)) + .build(), + HttpConnectorSettings::builder() + .connect_timeout(Duration::from_secs(5)) + .read_timeout(Duration::from_secs(3)) + .build(), + ]; + + // Kick off thousands of parallel tasks that will try to create a connector + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(SystemTimeSource::new())) + .build() + .unwrap(); + let mut handles = Vec::new(); + for setting in &settings { + for _ in 0..1000 { + let client = http_client.clone(); + handles.push(tokio::spawn({ + let setting = setting.clone(); + let components = components.clone(); + async move { + let _ = client.http_connector(&setting, &components); + } + })); + } + } + for handle in handles { + handle.await.unwrap(); + } + + // Verify only 4 connectors were created amidst the chaos + assert_eq!(4, creation_count.load(Ordering::Relaxed)); + } + + #[tokio::test] + async fn hyper_io_error() { + let connector = TestConnection { + inner: HangupStream, + }; + let adapter = HyperConnector::builder().build(connector).adapter; + let err = adapter + .call(HttpRequest::get("https://socket-hangup.com").unwrap()) + .await + .expect_err("socket hangup"); + assert!(err.is_io(), "{:?}", err); + } + + // ---- machinery to make a Hyper connector that responds with an IO Error + #[derive(Clone)] + struct HangupStream; + + impl Connection for HangupStream { + fn connected(&self) -> Connected { + Connected::new() + } + } + + impl AsyncRead for HangupStream { + fn poll_read( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &mut ReadBuf<'_>, + ) -> Poll> { + Poll::Ready(Err(Error::new( + ErrorKind::ConnectionReset, + "connection reset", + ))) + } + } + + impl AsyncWrite for HangupStream { + fn poll_write( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &[u8], + ) -> Poll> { + Poll::Pending + } + + fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Pending + } + + fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Pending + } + } + + #[derive(Clone)] + struct TestConnection { + inner: T, + } + + impl hyper_0_14::service::Service for TestConnection + where + T: Clone + Connection, + { + type Response = T; + type Error = BoxError; + type Future = std::future::Ready>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, _req: Uri) -> Self::Future { + std::future::ready(Ok(self.inner.clone())) + } + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util.rs new file mode 100644 index 00000000000..c05b3dca543 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util.rs @@ -0,0 +1,58 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Various fake/mock clients for testing. +//! +//! Each test client is useful for different test use cases: +//! - [`capture_request`](capture_request::capture_request): If you don't care what the +//! response is, but just want to check that the serialized request is what you expect, +//! then use `capture_request`. Or, alternatively, if you don't care what the request +//! is, but want to always respond with a given response, then capture request can also +//! be useful since you can optionally give it a response to return. +#![cfg_attr( + feature = "connector-hyper-0-14-x", + doc = "- [`dvr`]: If you want to record real-world traffic and then replay it later, then DVR's" +)] +//! [`RecordingClient`](dvr::RecordingClient) and [`ReplayingClient`](dvr::ReplayingClient) +//! can accomplish this, and the recorded traffic can be saved to JSON and checked in. Note: if +//! the traffic recording has sensitive information in it, such as signatures or authorization, +//! you will need to manually scrub this out if you intend to store the recording alongside +//! your tests. +//! - [`StaticReplayClient`]: If you want to have a set list of requests and their responses in a test, +//! then the static replay client will be useful. On construction, it takes a list of request/response +//! pairs that represent each expected request and the response for that test. At the end of the test, +//! you can ask the client to verify that the requests matched the expectations. +//! - [`infallible_client_fn`]: Allows you to create a client from an infallible function +//! that takes a request and returns a response. +//! - [`NeverClient`]: Useful for testing timeouts, where you want the client to never respond. +//! +#![cfg_attr( + feature = "connector-hyper-0-14-x", + doc = " +There is also the [`NeverTcpConnector`], which makes it easy to test connect/read timeouts. + +Finally, for socket-level mocking, see the [`wire`] module. +" +)] +mod capture_request; +pub use capture_request::{capture_request, CaptureRequestHandler, CaptureRequestReceiver}; + +#[cfg(feature = "connector-hyper-0-14-x")] +pub mod dvr; + +mod replay; +pub use replay::{ReplayEvent, StaticReplayClient}; + +mod infallible; +pub use infallible::infallible_client_fn; + +mod never; +pub use never::NeverClient; + +#[cfg(feature = "connector-hyper-0-14-x")] +pub use never::NeverTcpConnector; + +#[cfg(all(feature = "connector-hyper-0-14-x", feature = "wire-mock"))] +pub mod wire; diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs new file mode 100644 index 00000000000..43d54152dba --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/capture_request.rs @@ -0,0 +1,114 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; +use std::fmt::Debug; +use std::sync::{Arc, Mutex}; +use tokio::sync::oneshot; + +#[derive(Debug)] +struct Inner { + response: Option>, + sender: Option>, +} + +/// Test Connection to capture a single request +#[derive(Debug, Clone)] +pub struct CaptureRequestHandler(Arc>); + +impl HttpConnector for CaptureRequestHandler { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + let mut inner = self.0.lock().unwrap(); + if let Err(_e) = inner.sender.take().expect("already sent").send(request) { + tracing::trace!("The receiver was already dropped"); + } + HttpConnectorFuture::ready(Ok(inner + .response + .take() + .expect("could not handle second request") + .try_into() + .unwrap())) + } +} + +impl HttpClient for CaptureRequestHandler { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} + +/// Receiver for [`CaptureRequestHandler`](CaptureRequestHandler) +#[derive(Debug)] +pub struct CaptureRequestReceiver { + receiver: oneshot::Receiver, +} + +impl CaptureRequestReceiver { + /// Expect that a request was sent. Returns the captured request. + /// + /// # Panics + /// If no request was received + #[track_caller] + pub fn expect_request(mut self) -> HttpRequest { + self.receiver.try_recv().expect("no request was received") + } + + /// Expect that no request was captured. Panics if a request was received. + /// + /// # Panics + /// If a request was received + #[track_caller] + pub fn expect_no_request(mut self) { + self.receiver + .try_recv() + .expect_err("expected no request to be received!"); + } +} + +/// Test connection used to capture a single request +/// +/// If response is `None`, it will reply with a 200 response with an empty body +/// +/// Example: +/// ```compile_fail +/// let (capture_client, request) = capture_request(None); +/// let conf = aws_sdk_sts::Config::builder() +/// .http_client(capture_client) +/// .build(); +/// let client = aws_sdk_sts::Client::from_conf(conf); +/// let _ = client.assume_role_with_saml().send().await; +/// // web identity should be unsigned +/// assert_eq!( +/// request.expect_request().headers().get("AUTHORIZATION"), +/// None +/// ); +/// ``` +pub fn capture_request( + response: Option>, +) -> (CaptureRequestHandler, CaptureRequestReceiver) { + let (tx, rx) = oneshot::channel(); + ( + CaptureRequestHandler(Arc::new(Mutex::new(Inner { + response: Some(response.unwrap_or_else(|| { + http::Response::builder() + .status(200) + .body(SdkBody::empty()) + .expect("unreachable") + })), + sender: Some(tx), + }))), + CaptureRequestReceiver { receiver: rx }, + ) +} diff --git a/rust-runtime/aws-smithy-client/src/dvr.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs similarity index 77% rename from rust-runtime/aws-smithy-client/src/dvr.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs index f0f68a4709d..c5f10961db2 100644 --- a/rust-runtime/aws-smithy-client/src/dvr.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr.rs @@ -9,22 +9,23 @@ //! //! DVR is an extremely experimental record & replay framework that supports multi-frame HTTP request / response traffic. -use std::collections::HashMap; - +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_runtime_api::http::Headers; +use aws_smithy_types::base64; use bytes::Bytes; +use http::HeaderMap; use serde::{Deserialize, Serialize}; - -pub use aws_smithy_protocol_test::MediaType; -use aws_smithy_types::base64; -pub use record::RecordingConnection; -pub use replay::ReplayingConnection; +use std::collections::HashMap; mod record; mod replay; +pub use record::RecordingClient; +pub use replay::ReplayingClient; + /// A complete traffic recording /// -/// A traffic recording can be replayed with [`RecordingConnection`](RecordingConnection) +/// A traffic recording can be replayed with [`RecordingClient`](RecordingClient) #[derive(Debug, Serialize, Deserialize)] pub struct NetworkTraffic { events: Vec, @@ -78,7 +79,6 @@ pub struct Request { #[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)] pub struct Response { status: u16, - version: String, headers: HashMap>, } @@ -94,10 +94,10 @@ impl From<&Request> for http::Request<()> { } } -impl<'a, B> From<&'a http::Request> for Request { - fn from(req: &'a http::Request) -> Self { +impl<'a> From<&'a HttpRequest> for Request { + fn from(req: &'a HttpRequest) -> Self { let uri = req.uri().to_string(); - let headers = headers_to_map(req.headers()); + let headers = headers_to_map_http(req.headers()); let method = req.method().to_string(); Self { uri, @@ -107,11 +107,37 @@ impl<'a, B> From<&'a http::Request> for Request { } } -fn headers_to_map(headers: &http::HeaderMap) -> HashMap> { +fn headers_to_map_http(headers: &Headers) -> HashMap> { let mut out: HashMap<_, Vec<_>> = HashMap::new(); for (header_name, header_value) in headers.iter() { let entry = out.entry(header_name.to_string()).or_default(); - entry.push(header_value.to_str().unwrap().to_string()); + entry.push(header_value.to_string()); + } + out +} + +fn headers_to_map_02x(headers: &HeaderMap) -> HashMap> { + let mut out: HashMap<_, Vec<_>> = HashMap::new(); + for (header_name, header_value) in headers.iter() { + let entry = out.entry(header_name.to_string()).or_default(); + entry.push( + std::str::from_utf8(header_value.as_ref()) + .unwrap() + .to_string(), + ); + } + out +} + +fn headers_to_map(headers: &Headers) -> HashMap> { + let mut out: HashMap<_, Vec<_>> = HashMap::new(); + for (header_name, header_value) in headers.iter() { + let entry = out.entry(header_name.to_string()).or_default(); + entry.push( + std::str::from_utf8(header_value.as_ref()) + .unwrap() + .to_string(), + ); } out } @@ -119,12 +145,16 @@ fn headers_to_map(headers: &http::HeaderMap) -> HashMap From<&'a http::Response> for Response { fn from(resp: &'a http::Response) -> Self { let status = resp.status().as_u16(); - let version = format!("{:?}", resp.version()); - let headers = headers_to_map(resp.headers()); + let headers = headers_to_map_02x(resp.headers()); + Self { status, headers } + } +} + +impl From<&HttpResponse> for Response { + fn from(resp: &HttpResponse) -> Self { Self { - status, - version, - headers, + status: resp.status().into(), + headers: headers_to_map(resp.headers()), } } } @@ -230,15 +260,14 @@ impl From for BodyData { #[cfg(test)] mod tests { - use std::error::Error; - use std::fs; - - use aws_smithy_http::body::SdkBody; - use aws_smithy_http::byte_stream::ByteStream; - - use crate::dvr::{NetworkTraffic, RecordingConnection, ReplayingConnection}; + use super::*; + use aws_smithy_runtime_api::client::http::{HttpConnector, SharedHttpConnector}; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::byte_stream::ByteStream; use bytes::Bytes; use http::Uri; + use std::error::Error; + use std::fs; #[tokio::test] async fn turtles_all_the_way_down() -> Result<(), Box> { @@ -246,13 +275,12 @@ mod tests { // make a request, then verify that the same traffic was recorded. let network_traffic = fs::read_to_string("test-data/example.com.json")?; let network_traffic: NetworkTraffic = serde_json::from_str(&network_traffic)?; - let inner = ReplayingConnection::new(network_traffic.events.clone()); - let mut connection = RecordingConnection::new(inner.clone()); + let inner = ReplayingClient::new(network_traffic.events.clone()); + let connection = RecordingClient::new(SharedHttpConnector::new(inner.clone())); let req = http::Request::post("https://www.example.com") .body(SdkBody::from("hello world")) .unwrap(); - use tower::Service; - let mut resp = connection.call(req).await.expect("ok"); + let mut resp = connection.call(req.try_into().unwrap()).await.expect("ok"); let body = std::mem::replace(resp.body_mut(), SdkBody::taken()); let data = ByteStream::new(body).collect().await.unwrap().into_bytes(); assert_eq!( diff --git a/rust-runtime/aws-smithy-client/src/dvr/record.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs similarity index 72% rename from rust-runtime/aws-smithy-client/src/dvr/record.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs index 234bc23d649..7d03163a1c3 100644 --- a/rust-runtime/aws-smithy-client/src/dvr/record.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/record.rs @@ -3,56 +3,54 @@ * SPDX-License-Identifier: Apache-2.0 */ -use std::future::Future; -use std::pin::Pin; +use super::{ + Action, BodyData, ConnectionId, Direction, Error, Event, NetworkTraffic, Request, Response, + Version, +}; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; +use http_body_0_4::Body; +use std::path::Path; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex, MutexGuard}; -use std::task::{Context, Poll}; - -use http_body::Body; +use std::{fs, io}; use tokio::task::JoinHandle; -use tower::Service; - -use aws_smithy_http::body::SdkBody; - -use crate::dvr::{self, Action, BodyData, ConnectionId, Direction, Error, NetworkTraffic, Version}; -use super::Event; -use crate::conns::Https; -use crate::hyper_ext::Adapter; -use std::fmt::Display; -use std::io; -use std::path::Path; - -/// Recording Connection Wrapper +/// Recording client /// -/// RecordingConnection wraps an inner connection and records all traffic, enabling traffic replay. +/// `RecordingClient` wraps an inner connection and records all traffic, enabling traffic replay. #[derive(Clone, Debug)] -pub struct RecordingConnection { +pub struct RecordingClient { pub(crate) data: Arc>>, pub(crate) num_events: Arc, - pub(crate) inner: S, + pub(crate) inner: SharedHttpConnector, } -impl RecordingConnection> { - /// Construct a recording connection wrapping a default HTTPS implementation - #[cfg(feature = "rustls")] +#[cfg(all(feature = "tls-rustls"))] +impl RecordingClient { + /// Construct a recording connection wrapping a default HTTPS implementation without any timeouts. pub fn https() -> Self { + use crate::client::http::hyper_014::HyperConnector; Self { data: Default::default(), - inner: crate::hyper_ext::Adapter::builder().build(crate::conns::https()), num_events: Arc::new(AtomicUsize::new(0)), + inner: SharedHttpConnector::new(HyperConnector::builder().build_https()), } } } -impl RecordingConnection { +impl RecordingClient { /// Create a new recording connection from a connection - pub fn new(connection: S) -> Self { + pub fn new(underlying_connector: impl HttpConnector + 'static) -> Self { Self { data: Default::default(), - inner: connection, num_events: Arc::new(AtomicUsize::new(0)), + inner: underlying_connector.into_shared(), } } @@ -72,7 +70,7 @@ impl RecordingConnection { /// Dump the network traffic to a file pub fn dump_to_file(&self, path: impl AsRef) -> Result<(), io::Error> { - std::fs::write( + fs::write( path, serde_json::to_string(&self.network_traffic()).unwrap(), ) @@ -89,8 +87,8 @@ fn record_body( direction: Direction, event_bus: Arc>>, ) -> JoinHandle<()> { - let (sender, output_body) = hyper::Body::channel(); - let real_body = std::mem::replace(body, SdkBody::from(output_body)); + let (sender, output_body) = hyper_0_14::Body::channel(); + let real_body = std::mem::replace(body, SdkBody::from_body_0_4(output_body)); tokio::spawn(async move { let mut real_body = real_body; let mut sender = sender; @@ -145,29 +143,10 @@ fn record_body( }) } -impl tower::Service> for RecordingConnection -where - S: Service, Response = http::Response> - + Send - + Clone - + 'static, - S::Error: Display + Send + Sync + 'static, - S::Future: Send + 'static, - ResponseBody: Into, -{ - type Response = http::Response; - type Error = S::Error; - #[allow(clippy::type_complexity)] - type Future = - Pin, Self::Error>> + Send>>; - - fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll> { - self.inner.poll_ready(cx) - } - - fn call(&mut self, mut req: http::Request) -> Self::Future { +impl HttpConnector for RecordingClient { + fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { let event_id = self.next_id(); - // A request has two 3 phases: + // A request has three phases: // 1. A "Request" phase. This is initial HTTP request, headers, & URI // 2. A body phase. This may contain multiple data segments. // 3. A finalization phase. An EOF of some sort is sent on the body to indicate that @@ -177,7 +156,7 @@ where self.data.lock().unwrap().push(Event { connection_id: event_id, action: Action::Request { - request: dvr::Request::from(&req), + request: Request::from(&request), }, }); @@ -185,26 +164,23 @@ where // through it // This will also handle phase three when the request body runs out of data. record_body( - req.body_mut(), + request.body_mut(), event_id, Direction::Request, self.data.clone(), ); let events = self.data.clone(); // create a channel we'll use to stream the data while reading it - let resp_fut = self.inner.call(req); + let resp_fut = self.inner.call(request); let fut = async move { let resp = resp_fut.await; match resp { - Ok(resp) => { - // wrap the hyper body in an SDK body - let mut resp = resp.map(|body| body.into()); - + Ok(mut resp) => { // push the initial response event events.lock().unwrap().push(Event { connection_id: event_id, action: Action::Response { - response: Ok(dvr::Response::from(&resp)), + response: Ok(Response::from(&resp)), }, }); @@ -223,6 +199,16 @@ where } } }; - Box::pin(fut) + HttpConnectorFuture::new(fut) + } +} + +impl HttpClient for RecordingClient { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() } } diff --git a/rust-runtime/aws-smithy-client/src/dvr/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs similarity index 77% rename from rust-runtime/aws-smithy-client/src/dvr/replay.rs rename to rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs index 54065e5fc7d..df06eab87bd 100644 --- a/rust-runtime/aws-smithy-client/src/dvr/replay.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/dvr/replay.rs @@ -3,25 +3,29 @@ * SPDX-License-Identifier: Apache-2.0 */ +use super::{Action, ConnectionId, Direction, Event, NetworkTraffic}; +use aws_smithy_protocol_test::MediaType; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_runtime_api::client::result::ConnectorError; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::error::display::DisplayErrorContext; +use bytes::{Bytes, BytesMut}; +use http::Request; +use http_body_0_4::Body; use std::collections::{HashMap, VecDeque}; use std::error::Error; +use std::fmt; use std::ops::DerefMut; use std::path::Path; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex}; -use std::task::{Context, Poll}; - -use bytes::{Bytes, BytesMut}; -use http::{Request, Version}; -use http_body::Body; use tokio::task::JoinHandle; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::result::ConnectorError; -use aws_smithy_protocol_test::MediaType; - -use crate::dvr::{Action, ConnectionId, Direction, Event, NetworkTraffic}; - /// Wrapper type to enable optionally waiting for a future to complete #[derive(Debug)] enum Waitable { @@ -47,22 +51,31 @@ impl Waitable { } } -/// Replay traffic recorded by a [`RecordingConnection`](super::RecordingConnection) -#[derive(Clone, Debug)] -pub struct ReplayingConnection { +/// Replay traffic recorded by a [`RecordingClient`](super::RecordingClient) +#[derive(Clone)] +pub struct ReplayingClient { live_events: Arc>>>, verifiable_events: Arc>>, num_events: Arc, recorded_requests: Arc>>>>, } -impl ReplayingConnection { +// Ideally, this would just derive Debug, but that makes the tests in aws-config think they found AWS secrets +// when really it's just the test response data they're seeing from the Debug impl of this client. +// This is just a quick workaround. A better fix can be considered later. +impl fmt::Debug for ReplayingClient { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("test_util::dvr::ReplayingClient") + } +} + +impl ReplayingClient { fn next_id(&self) -> ConnectionId { ConnectionId(self.num_events.fetch_add(1, Ordering::Relaxed)) } /// Validate all headers and bodies - pub async fn full_validate(self, media_type: MediaType) -> Result<(), Box> { + pub async fn full_validate(self, media_type: &str) -> Result<(), Box> { self.validate_body_and_headers(None, media_type).await } @@ -82,13 +95,13 @@ impl ReplayingConnection { pub async fn validate_body_and_headers( self, checked_headers: Option<&[&str]>, - media_type: MediaType, + media_type: &str, ) -> Result<(), Box> { self.validate_base(checked_headers, |b1, b2| { aws_smithy_protocol_test::validate_body( b1, std::str::from_utf8(b2).unwrap(), - media_type.clone(), + MediaType::from(media_type), ) .map_err(|e| Box::new(e) as _) }) @@ -113,8 +126,9 @@ impl ReplayingConnection { ))? .take() .await; - aws_smithy_protocol_test::assert_uris_match(actual.uri(), expected.uri()); body_comparer(expected.body().as_ref(), actual.body().as_ref())?; + let actual: HttpRequest = actual.map(SdkBody::from).try_into()?; + aws_smithy_protocol_test::assert_uris_match(&expected.uri().to_string(), actual.uri()); let expected_headers = expected .headers() .keys() @@ -137,7 +151,14 @@ impl ReplayingConnection { )) }) .collect::>(); - aws_smithy_protocol_test::validate_headers(actual.headers(), expected_headers)?; + aws_smithy_protocol_test::validate_headers(actual.headers(), expected_headers) + .map_err(|err| { + format!( + "event {} validation failed with: {}", + conn_id.0, + DisplayErrorContext(&err) + ) + })?; } Ok(()) } @@ -198,7 +219,7 @@ impl ReplayingConnection { .collect(); let verifiable_events = Arc::new(verifiable_events); - ReplayingConnection { + ReplayingClient { live_events: Arc::new(Mutex::new(event_map)), num_events: Arc::new(AtomicUsize::new(0)), recorded_requests: Default::default(), @@ -207,7 +228,7 @@ impl ReplayingConnection { } } -async fn replay_body(events: VecDeque, mut sender: hyper::body::Sender) { +async fn replay_body(events: VecDeque, mut sender: hyper_0_14::body::Sender) { for event in events { match event.action { Action::Request { .. } => panic!(), @@ -249,54 +270,38 @@ async fn replay_body(events: VecDeque, mut sender: hyper::body::Sender) { } } -fn convert_version(version: &str) -> Version { - match version { - "HTTP/1.1" => Version::HTTP_11, - "HTTP/2.0" => Version::HTTP_2, - _ => panic!("unsupported: {}", version), - } -} - -impl tower::Service> for ReplayingConnection { - type Response = http::Response; - type Error = ConnectorError; - - #[allow(clippy::type_complexity)] - type Future = std::pin::Pin< - Box> + Send + 'static>, - >; - - fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, mut req: Request) -> Self::Future { +impl HttpConnector for ReplayingClient { + fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture { let event_id = self.next_id(); + tracing::debug!("received event {}: {request:?}", event_id.0); let mut events = match self.live_events.lock().unwrap().remove(&event_id) { Some(traffic) => traffic, None => { - return Box::pin(std::future::ready(Err(ConnectorError::other( - format!("no data for event {}. req: {:?}", event_id.0, req).into(), + return HttpConnectorFuture::ready(Err(ConnectorError::other( + format!("no data for event {}. request: {:?}", event_id.0, request).into(), None, - )))); + ))); } }; let _initial_request = events.pop_front().unwrap(); - let (sender, response_body) = hyper::Body::channel(); - let body = SdkBody::from(response_body); + let (sender, response_body) = hyper_0_14::Body::channel(); + let body = SdkBody::from_body_0_4(response_body); let recording = self.recorded_requests.clone(); let recorded_request = tokio::spawn(async move { let mut data_read = vec![]; - while let Some(data) = req.body_mut().data().await { + while let Some(data) = request.body_mut().data().await { data_read .extend_from_slice(data.expect("in memory request should not fail").as_ref()) } - req.map(|_| Bytes::from(data_read)) + request + .try_into_http02x() + .unwrap() + .map(|_body| Bytes::from(data_read)) }); let mut recorded_request = Waitable::Loading(recorded_request); let fut = async move { - let resp = loop { + let resp: Result<_, ConnectorError> = loop { let event = events .pop_front() .expect("no events, needed a response event"); @@ -316,9 +321,7 @@ impl tower::Service> for ReplayingConnection { Action::Response { response: Ok(response), } => { - let mut builder = http::Response::builder() - .status(response.status) - .version(convert_version(&response.version)); + let mut builder = http::Response::builder().status(response.status); for (name, values) in response.headers { for value in values { builder = builder.header(&name, &value); @@ -328,7 +331,10 @@ impl tower::Service> for ReplayingConnection { replay_body(events, sender).await; // insert the finalized body into }); - break Ok(builder.body(body).expect("valid builder")); + break Ok(HttpResponse::try_from( + builder.body(body).expect("valid builder"), + ) + .unwrap()); } Action::Data { @@ -351,6 +357,16 @@ impl tower::Service> for ReplayingConnection { recording.lock().unwrap().insert(event_id, recorded_request); resp }; - Box::pin(fut) + HttpConnectorFuture::new(fut) + } +} + +impl HttpClient for ReplayingClient { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs new file mode 100644 index 00000000000..61b83e3e7fd --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/infallible.rs @@ -0,0 +1,78 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient, + SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_runtime_api::client::result::ConnectorError; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::body::SdkBody; +use std::fmt; +use std::sync::Arc; + +/// Create a [`SharedHttpClient`] from `Fn(http:Request) -> http::Response` +/// +/// # Examples +/// +/// ```rust +/// use aws_smithy_runtime::client::http::test_util::infallible_client_fn; +/// let http_client = infallible_client_fn(|_req| http::Response::builder().status(200).body("OK!").unwrap()); +/// ``` +pub fn infallible_client_fn( + f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, +) -> SharedHttpClient +where + B: Into, +{ + InfallibleClientFn::new(f).into_shared() +} + +#[derive(Clone)] +struct InfallibleClientFn { + #[allow(clippy::type_complexity)] + response: Arc< + dyn Fn(http::Request) -> Result, ConnectorError> + + Send + + Sync, + >, +} + +impl fmt::Debug for InfallibleClientFn { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("InfallibleClientFn").finish() + } +} + +impl InfallibleClientFn { + fn new>( + f: impl Fn(http::Request) -> http::Response + Send + Sync + 'static, + ) -> Self { + Self { + response: Arc::new(move |request| Ok(f(request).map(|b| b.into()))), + } + } +} + +impl HttpConnector for InfallibleClientFn { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + HttpConnectorFuture::ready( + (self.response)(request.try_into_http02x().unwrap()) + .map(|res| HttpResponse::try_from(res).unwrap()), + ) + } +} + +impl HttpClient for InfallibleClientFn { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs new file mode 100644 index 00000000000..128579e3849 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/never.rs @@ -0,0 +1,172 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Test connectors that never return data + +use aws_smithy_async::future::never::Never; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; + +/// A client that will never respond. +/// +/// Returned futures will return `Pending` forever +#[derive(Clone, Debug, Default)] +pub struct NeverClient { + invocations: Arc, +} + +impl NeverClient { + /// Create a new never connector. + pub fn new() -> Self { + Default::default() + } + + /// Returns the number of invocations made to this connector. + pub fn num_calls(&self) -> usize { + self.invocations.load(Ordering::SeqCst) + } +} + +impl HttpConnector for NeverClient { + fn call(&self, _request: HttpRequest) -> HttpConnectorFuture { + self.invocations.fetch_add(1, Ordering::SeqCst); + HttpConnectorFuture::new(async move { + Never::new().await; + unreachable!() + }) + } +} + +impl HttpClient for NeverClient { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} + +/// A TCP connector that never connects. +// In the future, this can be available for multiple hyper version feature flags, with the impls gated between individual features +#[cfg(feature = "connector-hyper-0-14-x")] +#[derive(Clone, Debug, Default)] +pub struct NeverTcpConnector; + +#[cfg(feature = "connector-hyper-0-14-x")] +impl NeverTcpConnector { + /// Creates a new `NeverTcpConnector`. + pub fn new() -> Self { + Self + } +} + +#[cfg(feature = "connector-hyper-0-14-x")] +impl hyper_0_14::service::Service for NeverTcpConnector { + type Response = connection::NeverTcpConnection; + type Error = aws_smithy_runtime_api::box_error::BoxError; + type Future = std::pin::Pin< + Box> + Send + Sync>, + >; + + fn poll_ready( + &mut self, + _: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + std::task::Poll::Ready(Ok(())) + } + + fn call(&mut self, _: http::Uri) -> Self::Future { + Box::pin(async { + Never::new().await; + unreachable!() + }) + } +} + +#[cfg(feature = "connector-hyper-0-14-x")] +mod connection { + use hyper_0_14::client::connect::{Connected, Connection}; + use std::io::Error; + use std::pin::Pin; + use std::task::{Context, Poll}; + use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; + + /// A connection type that appeases hyper's trait bounds for a TCP connector, but will panic if any of its traits are used. + #[non_exhaustive] + #[derive(Debug, Default)] + pub struct NeverTcpConnection; + + impl Connection for NeverTcpConnection { + fn connected(&self) -> Connected { + unreachable!() + } + } + + impl AsyncRead for NeverTcpConnection { + fn poll_read( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &mut ReadBuf<'_>, + ) -> Poll> { + unreachable!() + } + } + + impl AsyncWrite for NeverTcpConnection { + fn poll_write( + self: Pin<&mut Self>, + _cx: &mut Context<'_>, + _buf: &[u8], + ) -> Poll> { + unreachable!() + } + + fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + unreachable!() + } + + fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + unreachable!() + } + } +} + +#[cfg(all(test, feature = "connector-hyper-0-14-x"))] +#[tokio::test] +async fn never_tcp_connector_plugs_into_hyper_014() { + use super::*; + use crate::client::http::hyper_014::HyperClientBuilder; + use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::time::SystemTimeSource; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use std::time::Duration; + + // it should compile + let client = HyperClientBuilder::new().build(NeverTcpConnector::new()); + let components = RuntimeComponentsBuilder::for_tests() + .with_sleep_impl(Some(TokioSleep::new())) + .with_time_source(Some(SystemTimeSource::new())) + .build() + .unwrap(); + let http_connector = client.http_connector( + &HttpConnectorSettings::builder() + .connect_timeout(Duration::from_millis(100)) + .build(), + &components, + ); + + let err = http_connector + .call(HttpRequest::get("http://fakeuri.com").unwrap()) + .await + .expect_err("it should time out"); + assert!(dbg!(err).is_timeout()); +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs new file mode 100644 index 00000000000..2809f428ace --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/replay.rs @@ -0,0 +1,262 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType}; +use aws_smithy_runtime_api::client::http::{ + HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector, +}; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse}; +use aws_smithy_runtime_api::client::result::ConnectorError; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use http::header::CONTENT_TYPE; +use std::ops::Deref; +use std::sync::{Arc, Mutex, MutexGuard}; + +type ReplayEvents = Vec; + +/// Test data for the [`StaticReplayClient`]. +/// +/// Each `ReplayEvent` represents one HTTP request and response +/// through the connector. +#[derive(Debug)] +pub struct ReplayEvent { + request: HttpRequest, + response: HttpResponse, +} + +impl ReplayEvent { + /// Creates a new `ReplayEvent`. + pub fn new(request: impl TryInto, response: impl TryInto) -> Self { + Self { + request: request.try_into().ok().expect("invalid request"), + response: response.try_into().ok().expect("invalid response"), + } + } + + /// Returns the test request. + pub fn request(&self) -> &HttpRequest { + &self.request + } + + /// Returns the test response. + pub fn response(&self) -> &HttpResponse { + &self.response + } +} + +impl From<(HttpRequest, HttpResponse)> for ReplayEvent { + fn from((request, response): (HttpRequest, HttpResponse)) -> Self { + Self::new(request, response) + } +} + +#[derive(Debug)] +struct ValidateRequest { + expected: HttpRequest, + actual: HttpRequest, +} + +impl ValidateRequest { + fn assert_matches(&self, index: usize, ignore_headers: &[&str]) { + let (actual, expected) = (&self.actual, &self.expected); + assert_eq!( + expected.uri(), + actual.uri(), + "request[{index}] - URI doesn't match expected value" + ); + for (name, value) in expected.headers() { + if !ignore_headers.contains(&name) { + let actual_header = actual + .headers() + .get(name) + .unwrap_or_else(|| panic!("Request #{index} - Header {name:?} is missing")); + assert_eq!( + value, actual_header, + "request[{index}] - Header {name:?} doesn't match expected value", + ); + } + } + let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[])); + let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[])); + let media_type = if actual + .headers() + .get(CONTENT_TYPE) + .map(|v| v.contains("json")) + .unwrap_or(false) + { + MediaType::Json + } else { + MediaType::Other("unknown".to_string()) + }; + match (actual_str, expected_str) { + (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)), + _ => assert_eq!( + expected.body().bytes(), + actual.body().bytes(), + "request[{index}] - Body contents didn't match expected value" + ), + }; + } +} + +/// Request/response replaying client for use in tests. +/// +/// This mock client takes a list of request/response pairs named [`ReplayEvent`]. While the client +/// is in use, the responses will be given in the order they appear in the list regardless of what +/// the actual request was. The actual request is recorded, but otherwise not validated against what +/// is in the [`ReplayEvent`]. Later, after the client is finished being used, the +/// [`assert_requests_match`] method can be used to validate the requests. +/// +/// This utility is simpler than [DVR], and thus, is good for tests that don't need +/// to record and replay real traffic. +/// +/// # Example +/// +/// ```no_run +/// use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient}; +/// use aws_smithy_types::body::SdkBody; +/// +/// let http_client = StaticReplayClient::new(vec![ +/// // Event that covers the first request/response +/// ReplayEvent::new( +/// // If `assert_requests_match` is called later, then this request will be matched +/// // against the actual request that was made. +/// http::Request::builder().uri("http://localhost:1234/foo").body(SdkBody::empty()).unwrap(), +/// // This response will be given to the first request regardless of whether it matches the request above. +/// http::Response::builder().status(200).body(SdkBody::empty()).unwrap(), +/// ), +/// // The next ReplayEvent covers the second request/response pair... +/// ]); +/// +/// # /* +/// let config = my_generated_client::Config::builder() +/// .http_client(http_client.clone()) +/// .build(); +/// let client = my_generated_client::Client::from_conf(config); +/// # */ +/// +/// // Do stuff with client... +/// +/// // When you're done, assert the requests match what you expected +/// http_client.assert_requests_match(&[]); +/// ``` +/// +/// [`assert_requests_match`]: crate::client::http::test_util::StaticReplayClient::assert_requests_match +/// [DVR]: crate::client::http::test_util::dvr +#[derive(Clone, Debug)] +pub struct StaticReplayClient { + data: Arc>, + requests: Arc>>, +} + +impl StaticReplayClient { + /// Creates a new event connector. + pub fn new(mut data: ReplayEvents) -> Self { + data.reverse(); + StaticReplayClient { + data: Arc::new(Mutex::new(data)), + requests: Default::default(), + } + } + + /// Returns an iterator over the actual requests that were made. + pub fn actual_requests(&self) -> impl Iterator + '_ { + // The iterator trait doesn't allow us to specify a lifetime on `self` in the `next()` method, + // so we have to do some unsafe code in order to actually implement this iterator without + // angering the borrow checker. + struct Iter<'a> { + // We store an exclusive lock to the data so that the data is completely immutable + _guard: MutexGuard<'a, Vec>, + // We store a pointer into the immutable data for accessing it later + values: *const ValidateRequest, + len: usize, + next_index: usize, + } + impl<'a> Iterator for Iter<'a> { + type Item = &'a HttpRequest; + + fn next(&mut self) -> Option { + // Safety: check the next index is in bounds + if self.next_index >= self.len { + None + } else { + // Safety: It is OK to offset into the pointer and dereference since we did a bounds check. + // It is OK to assign lifetime 'a to the reference since we hold the mutex guard for all of lifetime 'a. + let next = unsafe { + let offset = self.values.add(self.next_index); + &*offset + }; + self.next_index += 1; + Some(&next.actual) + } + } + } + + let guard = self.requests.lock().unwrap(); + Iter { + values: guard.as_ptr(), + len: guard.len(), + _guard: guard, + next_index: 0, + } + } + + fn requests(&self) -> impl Deref> + '_ { + self.requests.lock().unwrap() + } + + /// Asserts the expected requests match the actual requests. + /// + /// The expected requests are given as the connection events when the `EventConnector` + /// is created. The `EventConnector` will record the actual requests and assert that + /// they match the expected requests. + /// + /// A list of headers that should be ignored when comparing requests can be passed + /// for cases where headers are non-deterministic or are irrelevant to the test. + #[track_caller] + pub fn assert_requests_match(&self, ignore_headers: &[&str]) { + for (i, req) in self.requests().iter().enumerate() { + req.assert_matches(i, ignore_headers) + } + let remaining_requests = self.data.lock().unwrap(); + let number_of_remaining_requests = remaining_requests.len(); + let actual_requests = self.requests().len(); + assert!( + remaining_requests.is_empty(), + "Expected {number_of_remaining_requests} additional requests (only {actual_requests} sent)", + ); + } +} + +impl HttpConnector for StaticReplayClient { + fn call(&self, request: HttpRequest) -> HttpConnectorFuture { + let res = if let Some(event) = self.data.lock().unwrap().pop() { + self.requests.lock().unwrap().push(ValidateRequest { + expected: event.request, + actual: request, + }); + + Ok(event.response) + } else { + Err(ConnectorError::other( + "StaticReplayClient: no more test data available to respond with".into(), + None, + )) + }; + + HttpConnectorFuture::new(async move { res }) + } +} + +impl HttpClient for StaticReplayClient { + fn http_connector( + &self, + _: &HttpConnectorSettings, + _: &RuntimeComponents, + ) -> SharedHttpConnector { + self.clone().into_shared() + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs new file mode 100644 index 00000000000..6c0a6191173 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/http/test_util/wire.rs @@ -0,0 +1,352 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Utilities for mocking at the socket level +//! +//! Other tools in this module actually operate at the `http::Request` / `http::Response` level. This +//! is useful, but it shortcuts the HTTP implementation (e.g. Hyper). [`WireMockServer`] binds +//! to an actual socket on the host. +//! +//! # Examples +//! ```no_run +//! use aws_smithy_runtime_api::client::http::HttpConnectorSettings; +//! use aws_smithy_runtime::client::http::test_util::wire::{check_matches, ReplayedEvent, WireMockServer}; +//! use aws_smithy_runtime::{match_events, ev}; +//! # async fn example() { +//! +//! // This connection binds to a local address +//! let mock = WireMockServer::start(vec![ +//! ReplayedEvent::status(503), +//! ReplayedEvent::status(200) +//! ]).await; +//! +//! # /* +//! // Create a client using the wire mock +//! let config = my_generated_client::Config::builder() +//! .http_client(mock.http_client()) +//! .build(); +//! let client = Client::from_conf(config); +//! +//! // ... do something with +//! # */ +//! +//! // assert that you got the events you expected +//! match_events!(ev!(dns), ev!(connect), ev!(http(200)))(&mock.events()); +//! # } +//! ``` + +#![allow(missing_docs)] + +use crate::client::http::hyper_014::HyperClientBuilder; +use aws_smithy_async::future::never::Never; +use aws_smithy_async::future::BoxFuture; +use aws_smithy_runtime_api::client::http::SharedHttpClient; +use aws_smithy_runtime_api::shared::IntoShared; +use bytes::Bytes; +use http::{Request, Response}; +use hyper_0_14::client::connect::dns::Name; +use hyper_0_14::server::conn::AddrStream; +use hyper_0_14::service::{make_service_fn, service_fn, Service}; +use hyper_0_14::{Body, Server}; +use std::collections::HashSet; +use std::convert::Infallible; +use std::error::Error; +use std::iter::Once; +use std::net::{SocketAddr, TcpListener}; +use std::sync::{Arc, Mutex}; +use std::task::{Context, Poll}; +use tokio::spawn; +use tokio::sync::oneshot; + +/// An event recorded by [`WireMockServer`]. +#[non_exhaustive] +#[derive(Debug, Clone)] +pub enum RecordedEvent { + DnsLookup(String), + NewConnection, + Response(ReplayedEvent), +} + +type Matcher = ( + Box Result<(), Box>>, + &'static str, +); + +/// This method should only be used by the macro +pub fn check_matches(events: &[RecordedEvent], matchers: &[Matcher]) { + let mut events_iter = events.iter(); + let mut matcher_iter = matchers.iter(); + let mut idx = -1; + loop { + idx += 1; + let bail = |err: Box| panic!("failed on event {}:\n {}", idx, err); + match (events_iter.next(), matcher_iter.next()) { + (Some(event), Some((matcher, _msg))) => matcher(event).unwrap_or_else(bail), + (None, None) => return, + (Some(event), None) => { + bail(format!("got {:?} but no more events were expected", event).into()) + } + (None, Some((_expect, msg))) => { + bail(format!("expected {:?} but no more events were expected", msg).into()) + } + } + } +} + +#[macro_export] +macro_rules! matcher { + ($expect:tt) => { + ( + Box::new( + |event: &$crate::client::http::test_util::wire::RecordedEvent| { + if !matches!(event, $expect) { + return Err(format!( + "expected `{}` but got {:?}", + stringify!($expect), + event + ) + .into()); + } + Ok(()) + }, + ), + stringify!($expect), + ) + }; +} + +/// Helper macro to generate a series of test expectations +#[macro_export] +macro_rules! match_events { + ($( $expect:pat),*) => { + |events| { + $crate::client::http::test_util::wire::check_matches(events, &[$( $crate::matcher!($expect) ),*]); + } + }; + } + +/// Helper to generate match expressions for events +#[macro_export] +macro_rules! ev { + (http($status:expr)) => { + $crate::client::http::test_util::wire::RecordedEvent::Response( + $crate::client::http::test_util::wire::ReplayedEvent::HttpResponse { + status: $status, + .. + }, + ) + }; + (dns) => { + $crate::client::http::test_util::wire::RecordedEvent::DnsLookup(_) + }; + (connect) => { + $crate::client::http::test_util::wire::RecordedEvent::NewConnection + }; + (timeout) => { + $crate::client::http::test_util::wire::RecordedEvent::Response( + $crate::client::http::test_util::wire::ReplayedEvent::Timeout, + ) + }; +} + +pub use {ev, match_events, matcher}; + +#[non_exhaustive] +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum ReplayedEvent { + Timeout, + HttpResponse { status: u16, body: Bytes }, +} + +impl ReplayedEvent { + pub fn ok() -> Self { + Self::HttpResponse { + status: 200, + body: Bytes::new(), + } + } + + pub fn with_body(body: impl AsRef<[u8]>) -> Self { + Self::HttpResponse { + status: 200, + body: Bytes::copy_from_slice(body.as_ref()), + } + } + + pub fn status(status: u16) -> Self { + Self::HttpResponse { + status, + body: Bytes::new(), + } + } +} + +/// Test server that binds to 127.0.0.1:0 +/// +/// See the [module docs](crate::client::http::test_util::wire) for a usage example. +/// +/// Usage: +/// - Call [`WireMockServer::start`] to start the server +/// - Use [`WireMockServer::http_client`] or [`dns_resolver`](WireMockServer::dns_resolver) to configure your client. +/// - Make requests to [`endpoint_url`](WireMockServer::endpoint_url). +/// - Once the test is complete, retrieve a list of events from [`WireMockServer::events`] +#[derive(Debug)] +pub struct WireMockServer { + event_log: Arc>>, + bind_addr: SocketAddr, + // when the sender is dropped, that stops the server + shutdown_hook: oneshot::Sender<()>, +} + +impl WireMockServer { + /// Start a wire mock server with the given events to replay. + pub async fn start(mut response_events: Vec) -> Self { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let (tx, rx) = oneshot::channel(); + let listener_addr = listener.local_addr().unwrap(); + response_events.reverse(); + let response_events = Arc::new(Mutex::new(response_events)); + let handler_events = response_events; + let wire_events = Arc::new(Mutex::new(vec![])); + let wire_log_for_service = wire_events.clone(); + let poisoned_conns: Arc>> = Default::default(); + let make_service = make_service_fn(move |connection: &AddrStream| { + let poisoned_conns = poisoned_conns.clone(); + let events = handler_events.clone(); + let wire_log = wire_log_for_service.clone(); + let remote_addr = connection.remote_addr(); + tracing::info!("established connection: {:?}", connection); + wire_log.lock().unwrap().push(RecordedEvent::NewConnection); + async move { + Ok::<_, Infallible>(service_fn(move |_: Request| { + if poisoned_conns.lock().unwrap().contains(&remote_addr) { + tracing::error!("poisoned connection {:?} was reused!", &remote_addr); + panic!("poisoned connection was reused!"); + } + let next_event = events.clone().lock().unwrap().pop(); + let wire_log = wire_log.clone(); + let poisoned_conns = poisoned_conns.clone(); + async move { + let next_event = next_event + .unwrap_or_else(|| panic!("no more events! Log: {:?}", wire_log)); + wire_log + .lock() + .unwrap() + .push(RecordedEvent::Response(next_event.clone())); + if next_event == ReplayedEvent::Timeout { + tracing::info!("{} is poisoned", remote_addr); + poisoned_conns.lock().unwrap().insert(remote_addr); + } + tracing::debug!("replying with {:?}", next_event); + let event = generate_response_event(next_event).await; + dbg!(event) + } + })) + } + }); + let server = Server::from_tcp(listener) + .unwrap() + .serve(make_service) + .with_graceful_shutdown(async { + rx.await.ok(); + tracing::info!("server shutdown!"); + }); + spawn(server); + Self { + event_log: wire_events, + bind_addr: listener_addr, + shutdown_hook: tx, + } + } + + /// Retrieve the events recorded by this connection + pub fn events(&self) -> Vec { + self.event_log.lock().unwrap().clone() + } + + fn bind_addr(&self) -> SocketAddr { + self.bind_addr + } + + pub fn dns_resolver(&self) -> LoggingDnsResolver { + let event_log = self.event_log.clone(); + let bind_addr = self.bind_addr; + LoggingDnsResolver { + log: event_log, + socket_addr: bind_addr, + } + } + + /// Prebuilt [`HttpClient`](aws_smithy_runtime_api::client::http::HttpClient) with correctly wired DNS resolver. + /// + /// **Note**: This must be used in tandem with [`Self::dns_resolver`] + pub fn http_client(&self) -> SharedHttpClient { + HyperClientBuilder::new() + .build(hyper_0_14::client::HttpConnector::new_with_resolver( + self.dns_resolver(), + )) + .into_shared() + } + + /// Endpoint to use when connecting + /// + /// This works in tandem with the [`Self::dns_resolver`] to bind to the correct local IP Address + pub fn endpoint_url(&self) -> String { + format!( + "http://this-url-is-converted-to-localhost.com:{}", + self.bind_addr().port() + ) + } + + /// Shuts down the mock server. + pub fn shutdown(self) { + let _ = self.shutdown_hook.send(()); + } +} + +async fn generate_response_event(event: ReplayedEvent) -> Result, Infallible> { + let resp = match event { + ReplayedEvent::HttpResponse { status, body } => http::Response::builder() + .status(status) + .body(hyper_0_14::Body::from(body)) + .unwrap(), + ReplayedEvent::Timeout => { + Never::new().await; + unreachable!() + } + }; + Ok::<_, Infallible>(resp) +} + +/// DNS resolver that keeps a log of all lookups +/// +/// Regardless of what hostname is requested, it will always return the same socket address. +#[derive(Clone, Debug)] +pub struct LoggingDnsResolver { + log: Arc>>, + socket_addr: SocketAddr, +} + +impl Service for LoggingDnsResolver { + type Response = Once; + type Error = Infallible; + type Future = BoxFuture<'static, Self::Response, Self::Error>; + + fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: Name) -> Self::Future { + let socket_addr = self.socket_addr; + let log = self.log.clone(); + Box::pin(async move { + println!("looking up {:?}, replying with {:?}", req, socket_addr); + log.lock() + .unwrap() + .push(RecordedEvent::DnsLookup(req.to_string())); + Ok(std::iter::once(socket_addr)) + }) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity.rs b/rust-runtime/aws-smithy-runtime/src/client/identity.rs index a8b8769057f..4b38155a8e4 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity.rs @@ -3,4 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +mod cache; +pub use cache::{IdentityCache, LazyCacheBuilder}; + +/// Identity resolver implementation for "no auth". pub mod no_auth; diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs new file mode 100644 index 00000000000..7e349c78ec1 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs @@ -0,0 +1,95 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_runtime_api::client::identity::{ + IdentityFuture, ResolveCachedIdentity, ResolveIdentity, SharedIdentityCache, + SharedIdentityResolver, +}; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::config_bag::ConfigBag; + +mod lazy; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +pub use lazy::LazyCacheBuilder; + +/// Identity cache configuration. +/// +/// # Examples +/// +/// Disabling identity caching: +/// ```no_run +/// use aws_smithy_runtime::client::identity::IdentityCache; +/// +/// # /* +/// let config = some_service::Config::builder() +/// .identity_cache( +/// # */ +/// # drop( +/// IdentityCache::no_cache() +/// # ); +/// # /* +/// ) +/// // ... +/// .build(); +/// let client = some_service::Client::new(config); +/// # */ +/// ``` +/// +/// Customizing lazy caching: +/// ```no_run +/// use aws_smithy_runtime::client::identity::IdentityCache; +/// use std::time::Duration; +/// +/// # /* +/// let config = some_service::Config::builder() +/// .identity_cache( +/// # */ +/// # drop( +/// IdentityCache::lazy() +/// // change the load timeout to 10 seconds +/// .load_timeout(Duration::from_secs(10)) +/// .build() +/// # ); +/// # /* +/// ) +/// // ... +/// .build(); +/// let client = some_service::Client::new(config); +/// # */ +/// ``` +#[non_exhaustive] +pub struct IdentityCache; + +impl IdentityCache { + /// Create an identity cache that does not cache any resolved identities. + pub fn no_cache() -> SharedIdentityCache { + NoCache.into_shared() + } + + /// Configure a lazy identity cache. + /// + /// Identities are lazy loaded and then cached when a request is made. + pub fn lazy() -> LazyCacheBuilder { + LazyCacheBuilder::new() + } +} + +#[derive(Clone, Debug)] +struct NoCache; + +impl ResolveCachedIdentity for NoCache { + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::new(async move { + resolver + .resolve_identity(runtime_components, config_bag) + .await + }) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs new file mode 100644 index 00000000000..8581d7c12cc --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs @@ -0,0 +1,765 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::expiring_cache::ExpiringCache; +use aws_smithy_async::future::timeout::Timeout; +use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; +use aws_smithy_async::time::{SharedTimeSource, TimeSource}; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::identity::{ + Identity, IdentityCachePartition, IdentityFuture, ResolveCachedIdentity, ResolveIdentity, + SharedIdentityCache, SharedIdentityResolver, +}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::config_bag::ConfigBag; +use std::collections::HashMap; +use std::fmt; +use std::sync::RwLock; +use std::time::Duration; +use tracing::Instrument; + +const DEFAULT_LOAD_TIMEOUT: Duration = Duration::from_secs(5); +const DEFAULT_EXPIRATION: Duration = Duration::from_secs(15 * 60); +const DEFAULT_BUFFER_TIME: Duration = Duration::from_secs(10); +const DEFAULT_BUFFER_TIME_JITTER_FRACTION: fn() -> f64 = fastrand::f64; + +/// Builder for lazy identity caching. +#[derive(Default, Debug)] +pub struct LazyCacheBuilder { + time_source: Option, + sleep_impl: Option, + load_timeout: Option, + buffer_time: Option, + buffer_time_jitter_fraction: Option f64>, + default_expiration: Option, +} + +impl LazyCacheBuilder { + /// Create a new builder. + pub fn new() -> Self { + Default::default() + } + + /// Set the time source for this cache. + pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { + self.set_time_source(time_source.into_shared()); + self + } + /// Set the time source for this cache. + pub fn set_time_source(&mut self, time_source: SharedTimeSource) -> &mut Self { + self.time_source = Some(time_source.into_shared()); + self + } + + /// Set the async sleep implementation for this cache. + pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self { + self.set_sleep_impl(sleep_impl.into_shared()); + self + } + /// Set the async sleep implementation for this cache. + pub fn set_sleep_impl(&mut self, sleep_impl: SharedAsyncSleep) -> &mut Self { + self.sleep_impl = Some(sleep_impl); + self + } + + /// Timeout for identity resolution. + /// + /// Defaults to 5 seconds. + pub fn load_timeout(mut self, timeout: Duration) -> Self { + self.set_load_timeout(Some(timeout)); + self + } + + /// Timeout for identity resolution. + /// + /// Defaults to 5 seconds. + pub fn set_load_timeout(&mut self, timeout: Option) -> &mut Self { + self.load_timeout = timeout; + self + } + + /// Amount of time before the actual identity expiration time where the identity is considered expired. + /// + /// For example, if the identity are expiring in 15 minutes, and the buffer time is 10 seconds, + /// then any requests made after 14 minutes and 50 seconds will load a new identity. + /// + /// Note: random jitter value between [0.0, 1.0] is multiplied to this buffer time. + /// + /// Defaults to 10 seconds. + pub fn buffer_time(mut self, buffer_time: Duration) -> Self { + self.set_buffer_time(Some(buffer_time)); + self + } + + /// Amount of time before the actual identity expiration time where the identity is considered expired. + /// + /// For example, if the identity are expiring in 15 minutes, and the buffer time is 10 seconds, + /// then any requests made after 14 minutes and 50 seconds will load a new identity. + /// + /// Note: random jitter value between [0.0, 1.0] is multiplied to this buffer time. + /// + /// Defaults to 10 seconds. + pub fn set_buffer_time(&mut self, buffer_time: Option) -> &mut Self { + self.buffer_time = buffer_time; + self + } + + /// A random percentage by which buffer time is jittered for randomization. + /// + /// For example, if the identity is expiring in 15 minutes, the buffer time is 10 seconds, + /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds. + /// Therefore, any requests made after 14 minutes and 52 seconds will load a new identity. + /// + /// Defaults to a randomly generated value between 0.0 and 1.0. This setter is for testing only. + #[allow(unused)] + #[cfg(test)] + fn buffer_time_jitter_fraction(mut self, buffer_time_jitter_fraction: fn() -> f64) -> Self { + self.set_buffer_time_jitter_fraction(Some(buffer_time_jitter_fraction)); + self + } + + /// A random percentage by which buffer time is jittered for randomization. + /// + /// For example, if the identity is expiring in 15 minutes, the buffer time is 10 seconds, + /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds. + /// Therefore, any requests made after 14 minutes and 52 seconds will load a new identity. + /// + /// Defaults to a randomly generated value between 0.0 and 1.0. This setter is for testing only. + #[allow(unused)] + #[cfg(test)] + fn set_buffer_time_jitter_fraction( + &mut self, + buffer_time_jitter_fraction: Option f64>, + ) -> &mut Self { + self.buffer_time_jitter_fraction = buffer_time_jitter_fraction; + self + } + + /// Default expiration time to set on an identity if it doesn't have an expiration time. + /// + /// This is only used if the resolved identity doesn't have an expiration time set. + /// This must be at least 15 minutes. + /// + /// Defaults to 15 minutes. + pub fn default_expiration(mut self, duration: Duration) -> Self { + self.set_default_expiration(Some(duration)); + self + } + + /// Default expiration time to set on an identity if it doesn't have an expiration time. + /// + /// This is only used if the resolved identity doesn't have an expiration time set. + /// This must be at least 15 minutes. + /// + /// Defaults to 15 minutes. + pub fn set_default_expiration(&mut self, duration: Option) -> &mut Self { + self.default_expiration = duration; + self + } + + /// Builds a [`SharedIdentityCache`] from this builder. + /// + /// # Panics + /// + /// This builder will panic if required fields are not given, or if given values are not valid. + pub fn build(self) -> SharedIdentityCache { + let default_expiration = self.default_expiration.unwrap_or(DEFAULT_EXPIRATION); + assert!( + default_expiration >= DEFAULT_EXPIRATION, + "default_expiration must be at least 15 minutes" + ); + LazyCache::new( + self.load_timeout.unwrap_or(DEFAULT_LOAD_TIMEOUT), + self.buffer_time.unwrap_or(DEFAULT_BUFFER_TIME), + self.buffer_time_jitter_fraction + .unwrap_or(DEFAULT_BUFFER_TIME_JITTER_FRACTION), + default_expiration, + ) + .into_shared() + } +} + +#[derive(Debug)] +struct CachePartitions { + partitions: RwLock>>, + buffer_time: Duration, +} + +impl CachePartitions { + fn new(buffer_time: Duration) -> Self { + Self { + partitions: RwLock::new(HashMap::new()), + buffer_time, + } + } + + fn partition(&self, key: IdentityCachePartition) -> ExpiringCache { + let mut partition = self.partitions.read().unwrap().get(&key).cloned(); + // Add the partition to the cache if it doesn't already exist. + // Partitions will never be removed. + if partition.is_none() { + let mut partitions = self.partitions.write().unwrap(); + // Another thread could have inserted the partition before we acquired the lock, + // so double check before inserting it. + partitions + .entry(key) + .or_insert_with(|| ExpiringCache::new(self.buffer_time)); + drop(partitions); + + partition = self.partitions.read().unwrap().get(&key).cloned(); + } + partition.expect("inserted above if not present") + } +} + +#[derive(Debug)] +struct LazyCache { + partitions: CachePartitions, + load_timeout: Duration, + buffer_time: Duration, + buffer_time_jitter_fraction: fn() -> f64, + default_expiration: Duration, +} + +impl LazyCache { + fn new( + load_timeout: Duration, + buffer_time: Duration, + buffer_time_jitter_fraction: fn() -> f64, + default_expiration: Duration, + ) -> Self { + Self { + partitions: CachePartitions::new(buffer_time), + load_timeout, + buffer_time, + buffer_time_jitter_fraction, + default_expiration, + } + } +} + +macro_rules! required_err { + ($thing:literal, $how:literal) => { + BoxError::from(concat!( + "Lazy identity caching requires ", + $thing, + " to be configured. ", + $how, + " If this isn't possible, then disable identity caching by calling ", + "the `identity_cache` method on config with `IdentityCache::no_cache()`", + )) + }; +} +macro_rules! validate_components { + ($components:ident) => { + let _ = $components.time_source().ok_or_else(|| { + required_err!( + "a time source", + "Set a time source using the `time_source` method on config." + ) + })?; + let _ = $components.sleep_impl().ok_or_else(|| { + required_err!( + "an async sleep implementation", + "Set a sleep impl using the `sleep_impl` method on config." + ) + })?; + }; +} + +impl ResolveCachedIdentity for LazyCache { + fn validate_base_client_config( + &self, + runtime_components: &aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder, + _cfg: &ConfigBag, + ) -> Result<(), BoxError> { + validate_components!(runtime_components); + Ok(()) + } + + fn validate_final_config( + &self, + runtime_components: &RuntimeComponents, + _cfg: &ConfigBag, + ) -> Result<(), BoxError> { + validate_components!(runtime_components); + Ok(()) + } + + fn resolve_cached_identity<'a>( + &'a self, + resolver: SharedIdentityResolver, + runtime_components: &'a RuntimeComponents, + config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + let (time_source, sleep_impl) = ( + runtime_components.time_source().expect("validated"), + runtime_components.sleep_impl().expect("validated"), + ); + + let now = time_source.now(); + let timeout_future = sleep_impl.sleep(self.load_timeout); + let load_timeout = self.load_timeout; + let cache = self.partitions.partition(resolver.cache_partition()); + let default_expiration = self.default_expiration; + + IdentityFuture::new(async move { + // Attempt to get cached identity, or clear the cache if they're expired + if let Some(identity) = cache.yield_or_clear_if_expired(now).await { + tracing::debug!( + buffer_time=?self.buffer_time, + cached_expiration=?identity.expiration(), + now=?now, + "loaded identity from cache" + ); + Ok(identity) + } else { + // If we didn't get identity from the cache, then we need to try and load. + // There may be other threads also loading simultaneously, but this is OK + // since the futures are not eagerly executed, and the cache will only run one + // of them. + let start_time = time_source.now(); + let result = cache + .get_or_load(|| { + let span = tracing::info_span!("lazy_load_identity"); + async move { + let fut = Timeout::new( + resolver.resolve_identity(runtime_components, config_bag), + timeout_future, + ); + let identity = match fut.await { + Ok(result) => result?, + Err(_err) => match resolver.fallback_on_interrupt() { + Some(identity) => identity, + None => { + return Err(BoxError::from(TimedOutError(load_timeout))) + } + }, + }; + // If the identity don't have an expiration time, then create a default one + let expiration = + identity.expiration().unwrap_or(now + default_expiration); + + let jitter = self + .buffer_time + .mul_f64((self.buffer_time_jitter_fraction)()); + + // Logging for cache miss should be emitted here as opposed to after the call to + // `cache.get_or_load` above. In the case of multiple threads concurrently executing + // `cache.get_or_load`, logging inside `cache.get_or_load` ensures that it is emitted + // only once for the first thread that succeeds in populating a cache value. + tracing::info!( + "identity cache miss occurred; added new identity (took {:?})", + time_source.now().duration_since(start_time) + ); + + Ok((identity, expiration + jitter)) + } + // Only instrument the the actual load future so that no span + // is opened if the cache decides not to execute it. + .instrument(span) + }) + .await; + tracing::debug!("loaded identity"); + result + } + }) + } +} + +#[derive(Debug)] +struct TimedOutError(Duration); + +impl std::error::Error for TimedOutError {} + +impl fmt::Display for TimedOutError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "identity resolver timed out after {:?}", self.0) + } +} + +#[cfg(all(test, feature = "client", feature = "http-auth"))] +mod tests { + use super::*; + use aws_smithy_async::rt::sleep::TokioSleep; + use aws_smithy_async::test_util::{instant_time_and_sleep, ManualTimeSource}; + use aws_smithy_async::time::TimeSource; + use aws_smithy_runtime_api::client::identity::http::Token; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::{Arc, Mutex}; + use std::time::{Duration, SystemTime, UNIX_EPOCH}; + use tracing::info; + + const BUFFER_TIME_NO_JITTER: fn() -> f64 = || 0_f64; + + struct ResolverFn(F); + impl fmt::Debug for ResolverFn { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("ResolverFn") + } + } + impl ResolveIdentity for ResolverFn + where + F: Fn() -> IdentityFuture<'static> + Send + Sync, + { + fn resolve_identity<'a>( + &'a self, + _: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + (self.0)() + } + } + + fn resolver_fn(f: F) -> SharedIdentityResolver + where + F: Fn() -> IdentityFuture<'static> + Send + Sync + 'static, + { + SharedIdentityResolver::new(ResolverFn(f)) + } + + fn test_cache( + buffer_time_jitter_fraction: fn() -> f64, + load_list: Vec>, + ) -> (LazyCache, SharedIdentityResolver) { + #[derive(Debug)] + struct Resolver(Mutex>>); + impl ResolveIdentity for Resolver { + fn resolve_identity<'a>( + &'a self, + _: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + let mut list = self.0.lock().unwrap(); + if list.len() > 0 { + let next = list.remove(0); + info!("refreshing the identity to {:?}", next); + IdentityFuture::ready(next) + } else { + drop(list); + panic!("no more identities") + } + } + } + + let identity_resolver = SharedIdentityResolver::new(Resolver(Mutex::new(load_list))); + let cache = LazyCache::new( + DEFAULT_LOAD_TIMEOUT, + DEFAULT_BUFFER_TIME, + buffer_time_jitter_fraction, + DEFAULT_EXPIRATION, + ); + (cache, identity_resolver) + } + + fn epoch_secs(secs: u64) -> SystemTime { + SystemTime::UNIX_EPOCH + Duration::from_secs(secs) + } + + fn test_identity(expired_secs: u64) -> Identity { + let expiration = Some(epoch_secs(expired_secs)); + Identity::new(Token::new("test", expiration), expiration) + } + + async fn expect_identity( + expired_secs: u64, + cache: &LazyCache, + components: &RuntimeComponents, + resolver: SharedIdentityResolver, + ) { + let config_bag = ConfigBag::base(); + let identity = cache + .resolve_cached_identity(resolver, components, &config_bag) + .await + .expect("expected identity"); + assert_eq!(Some(epoch_secs(expired_secs)), identity.expiration()); + } + + #[tokio::test] + async fn initial_populate_test_identity() { + let time = ManualTimeSource::new(UNIX_EPOCH); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let config_bag = ConfigBag::base(); + let resolver = SharedIdentityResolver::new(resolver_fn(|| { + info!("refreshing the test_identity"); + IdentityFuture::ready(Ok(test_identity(1000))) + })); + let cache = LazyCache::new( + DEFAULT_LOAD_TIMEOUT, + DEFAULT_BUFFER_TIME, + BUFFER_TIME_NO_JITTER, + DEFAULT_EXPIRATION, + ); + assert_eq!( + epoch_secs(1000), + cache + .resolve_cached_identity(resolver, &components, &config_bag) + .await + .unwrap() + .expiration() + .unwrap() + ); + } + + #[tokio::test] + async fn reload_expired_test_identity() { + let time = ManualTimeSource::new(epoch_secs(100)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let (cache, resolver) = test_cache( + BUFFER_TIME_NO_JITTER, + vec![ + Ok(test_identity(1000)), + Ok(test_identity(2000)), + Ok(test_identity(3000)), + ], + ); + + expect_identity(1000, &cache, &components, resolver.clone()).await; + expect_identity(1000, &cache, &components, resolver.clone()).await; + time.set_time(epoch_secs(1500)); + expect_identity(2000, &cache, &components, resolver.clone()).await; + expect_identity(2000, &cache, &components, resolver.clone()).await; + time.set_time(epoch_secs(2500)); + expect_identity(3000, &cache, &components, resolver.clone()).await; + expect_identity(3000, &cache, &components, resolver.clone()).await; + } + + #[tokio::test] + async fn load_failed_error() { + let config_bag = ConfigBag::base(); + let time = ManualTimeSource::new(epoch_secs(100)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let (cache, resolver) = test_cache( + BUFFER_TIME_NO_JITTER, + vec![Ok(test_identity(1000)), Err("failed".into())], + ); + + expect_identity(1000, &cache, &components, resolver.clone()).await; + time.set_time(epoch_secs(1500)); + assert!(cache + .resolve_cached_identity(resolver.clone(), &components, &config_bag) + .await + .is_err()); + } + + #[test] + fn load_contention() { + let rt = tokio::runtime::Builder::new_multi_thread() + .enable_time() + .worker_threads(16) + .build() + .unwrap(); + + let time = ManualTimeSource::new(epoch_secs(0)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let (cache, resolver) = test_cache( + BUFFER_TIME_NO_JITTER, + vec![ + Ok(test_identity(500)), + Ok(test_identity(1500)), + Ok(test_identity(2500)), + Ok(test_identity(3500)), + Ok(test_identity(4500)), + ], + ); + let cache: SharedIdentityCache = cache.into_shared(); + + // test_identity are available up until 4500 seconds after the unix epoch + // 4*50 = 200 tasks are launched => we can advance time 4500/20 => 225 seconds per advance + for _ in 0..4 { + let mut tasks = Vec::new(); + for _ in 0..50 { + let resolver = resolver.clone(); + let cache = cache.clone(); + let time = time.clone(); + let components = components.clone(); + tasks.push(rt.spawn(async move { + let now = time.advance(Duration::from_secs(22)); + + let config_bag = ConfigBag::base(); + let identity = cache + .resolve_cached_identity(resolver, &components, &config_bag) + .await + .unwrap(); + assert!( + identity.expiration().unwrap() >= now, + "{:?} >= {:?}", + identity.expiration(), + now + ); + })); + } + for task in tasks { + rt.block_on(task).unwrap(); + } + } + } + + #[tokio::test] + async fn load_timeout() { + let config_bag = ConfigBag::base(); + let (time, sleep) = instant_time_and_sleep(epoch_secs(100)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(sleep)) + .build() + .unwrap(); + let resolver = SharedIdentityResolver::new(resolver_fn(|| { + IdentityFuture::new(async { + aws_smithy_async::future::never::Never::new().await; + Ok(test_identity(1000)) + }) + })); + let cache = LazyCache::new( + Duration::from_secs(5), + DEFAULT_BUFFER_TIME, + BUFFER_TIME_NO_JITTER, + DEFAULT_EXPIRATION, + ); + + let err: BoxError = cache + .resolve_cached_identity(resolver, &components, &config_bag) + .await + .expect_err("it should return an error"); + let downcasted = err.downcast_ref::(); + assert!( + downcasted.is_some(), + "expected a BoxError of TimedOutError, but was {err:?}" + ); + assert_eq!(time.now(), epoch_secs(105)); + } + + #[tokio::test] + async fn buffer_time_jitter() { + let time = ManualTimeSource::new(epoch_secs(100)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let buffer_time_jitter_fraction = || 0.5_f64; + let (cache, resolver) = test_cache( + buffer_time_jitter_fraction, + vec![Ok(test_identity(1000)), Ok(test_identity(2000))], + ); + + expect_identity(1000, &cache, &components, resolver.clone()).await; + let buffer_time_with_jitter = + (DEFAULT_BUFFER_TIME.as_secs_f64() * buffer_time_jitter_fraction()) as u64; + assert_eq!(buffer_time_with_jitter, 5); + // Advance time to the point where the first test_identity are about to expire (but haven't). + let almost_expired_secs = 1000 - buffer_time_with_jitter - 1; + time.set_time(epoch_secs(almost_expired_secs)); + // We should still use the first test_identity. + expect_identity(1000, &cache, &components, resolver.clone()).await; + // Now let the first test_identity expire. + let expired_secs = almost_expired_secs + 1; + time.set_time(epoch_secs(expired_secs)); + // Now that the first test_identity have been expired, the second test_identity will be retrieved. + expect_identity(2000, &cache, &components, resolver.clone()).await; + } + + #[tokio::test] + async fn cache_partitioning() { + let time = ManualTimeSource::new(epoch_secs(0)); + let components = RuntimeComponentsBuilder::for_tests() + .with_time_source(Some(time.clone())) + .with_sleep_impl(Some(TokioSleep::new())) + .build() + .unwrap(); + let (cache, _) = test_cache(BUFFER_TIME_NO_JITTER, Vec::new()); + + #[allow(clippy::disallowed_methods)] + let far_future = SystemTime::now() + Duration::from_secs(10_000); + + // Resolver A and B both return an identical identity type with different tokens with an expiration + // time that should NOT be hit within this test. They each have their own partition key. + let resolver_a_calls = Arc::new(AtomicUsize::new(0)); + let resolver_b_calls = Arc::new(AtomicUsize::new(0)); + let resolver_a = resolver_fn({ + let calls = resolver_a_calls.clone(); + move || { + calls.fetch_add(1, Ordering::Relaxed); + IdentityFuture::ready(Ok(Identity::new( + Token::new("A", Some(far_future)), + Some(far_future), + ))) + } + }); + let resolver_b = resolver_fn({ + let calls = resolver_b_calls.clone(); + move || { + calls.fetch_add(1, Ordering::Relaxed); + IdentityFuture::ready(Ok(Identity::new( + Token::new("B", Some(far_future)), + Some(far_future), + ))) + } + }); + assert_ne!( + resolver_a.cache_partition(), + resolver_b.cache_partition(), + "pre-condition: they should have different partition keys" + ); + + let config_bag = ConfigBag::base(); + + // Loading the identity twice with resolver A should result in a single call + // to the underlying identity resolver since the result gets cached. + let identity = cache + .resolve_cached_identity(resolver_a.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("A", identity.data::().unwrap().token()); + let identity = cache + .resolve_cached_identity(resolver_a.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("A", identity.data::().unwrap().token()); + assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed)); + + // Now, loading an identity from B will use a separate cache partition + // and return a different result. + let identity = cache + .resolve_cached_identity(resolver_b.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("B", identity.data::().unwrap().token()); + let identity = cache + .resolve_cached_identity(resolver_b.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("B", identity.data::().unwrap().token()); + assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed)); + assert_eq!(1, resolver_b_calls.load(Ordering::Relaxed)); + + // Finally, loading with resolver A again should return the original cached A value + let identity = cache + .resolve_cached_identity(resolver_a.clone(), &components, &config_bag) + .await + .unwrap(); + assert_eq!("A", identity.data::().unwrap().token()); + assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed)); + assert_eq!(1, resolver_b_calls.load(Ordering::Relaxed)); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs index 8814336b3a6..eb96f57b3ef 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs @@ -3,30 +3,38 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime_api::client::identity::{Identity, IdentityResolver}; -use aws_smithy_runtime_api::client::orchestrator::Future; +use aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; +/// Identity for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme. #[derive(Debug, Default)] pub struct NoAuthIdentity; impl NoAuthIdentity { + /// Creates a new `NoAuthIdentity`. pub fn new() -> Self { Self } } +/// Identity resolver for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme. #[derive(Debug, Default)] pub struct NoAuthIdentityResolver; impl NoAuthIdentityResolver { + /// Creates a new `NoAuthIdentityResolver`. pub fn new() -> Self { Self } } -impl IdentityResolver for NoAuthIdentityResolver { - fn resolve_identity(&self, _: &ConfigBag) -> Future { - Future::ready(Ok(Identity::new(NoAuthIdentity::new(), None))) +impl ResolveIdentity for NoAuthIdentityResolver { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new(NoAuthIdentity::new(), None))) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs index c289821e9bd..54faa6ae0d6 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/interceptors.rs @@ -3,16 +3,289 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::body::SdkBody; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; +use aws_smithy_runtime_api::client::interceptors::context::{ + BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, + FinalizerInterceptorContextMut, FinalizerInterceptorContextRef, +}; +use aws_smithy_runtime_api::client::interceptors::context::{ + Error, Input, InterceptorContext, Output, +}; +use aws_smithy_runtime_api::client::interceptors::{ + Intercept, InterceptorError, SharedInterceptor, +}; use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::body::SdkBody; use aws_smithy_types::config_bag::ConfigBag; +use aws_smithy_types::error::display::DisplayErrorContext; use std::error::Error as StdError; use std::fmt; use std::marker::PhantomData; +macro_rules! interceptor_impl_fn { + (mut $interceptor:ident) => { + pub(crate) fn $interceptor( + self, + ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!(concat!( + "running `", + stringify!($interceptor), + "` interceptors" + )); + let mut result: Result<(), (&str, BoxError)> = Ok(()); + let mut ctx = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.$interceptor(&mut ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!( + "{}::{}: {}", + last_error.0, + stringify!($interceptor), + DisplayErrorContext(&*last_error.1) + ); + } + result = Err((interceptor.name(), new_error)); + } + } + } + result.map_err(|(name, err)| InterceptorError::$interceptor(name, err)) + } + }; + (ref $interceptor:ident) => { + pub(crate) fn $interceptor( + self, + ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!(concat!( + "running `", + stringify!($interceptor), + "` interceptors" + )); + let mut result: Result<(), (&str, BoxError)> = Ok(()); + let ctx = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = interceptor.$interceptor(&ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!( + "{}::{}: {}", + last_error.0, + stringify!($interceptor), + DisplayErrorContext(&*last_error.1) + ); + } + result = Err((interceptor.name(), new_error)); + } + } + } + result.map_err(|(name, err)| InterceptorError::$interceptor(name, err)) + } + }; +} + +#[derive(Debug)] +pub(crate) struct Interceptors { + interceptors: I, +} + +impl Interceptors +where + I: Iterator, +{ + pub(crate) fn new(interceptors: I) -> Self { + Self { interceptors } + } + + fn into_iter(self) -> impl Iterator { + self.interceptors.map(ConditionallyEnabledInterceptor) + } + + pub(crate) fn read_before_execution( + self, + operation: bool, + ctx: &InterceptorContext, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!( + "running {} `read_before_execution` interceptors", + if operation { "operation" } else { "client" } + ); + let mut result: Result<(), (&str, BoxError)> = Ok(()); + let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) { + if let Err(last_error) = result { + tracing::debug!( + "{}::{}: {}", + last_error.0, + "read_before_execution", + DisplayErrorContext(&*last_error.1) + ); + } + result = Err((interceptor.name(), new_error)); + } + } + } + result.map_err(|(name, err)| InterceptorError::read_before_execution(name, err)) + } + + interceptor_impl_fn!(mut modify_before_serialization); + interceptor_impl_fn!(ref read_before_serialization); + interceptor_impl_fn!(ref read_after_serialization); + interceptor_impl_fn!(mut modify_before_retry_loop); + interceptor_impl_fn!(ref read_before_attempt); + interceptor_impl_fn!(mut modify_before_signing); + interceptor_impl_fn!(ref read_before_signing); + interceptor_impl_fn!(ref read_after_signing); + interceptor_impl_fn!(mut modify_before_transmit); + interceptor_impl_fn!(ref read_before_transmit); + interceptor_impl_fn!(ref read_after_transmit); + interceptor_impl_fn!(mut modify_before_deserialization); + interceptor_impl_fn!(ref read_before_deserialization); + interceptor_impl_fn!(ref read_after_deserialization); + + pub(crate) fn modify_before_attempt_completion( + self, + ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!("running `modify_before_attempt_completion` interceptors"); + let mut result: Result<(), (&str, BoxError)> = Ok(()); + let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.modify_before_attempt_completion(&mut ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!( + "{}::{}: {}", + last_error.0, + "modify_before_attempt_completion", + DisplayErrorContext(&*last_error.1) + ); + } + result = Err((interceptor.name(), new_error)); + } + } + } + result.map_err(|(name, err)| InterceptorError::modify_before_attempt_completion(name, err)) + } + + pub(crate) fn read_after_attempt( + self, + ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!("running `read_after_attempt` interceptors"); + let mut result: Result<(), (&str, BoxError)> = Ok(()); + let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.read_after_attempt(&ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!( + "{}::{}: {}", + last_error.0, + "read_after_attempt", + DisplayErrorContext(&*last_error.1) + ); + } + result = Err((interceptor.name(), new_error)); + } + } + } + result.map_err(|(name, err)| InterceptorError::read_after_attempt(name, err)) + } + + pub(crate) fn modify_before_completion( + self, + ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!("running `modify_before_completion` interceptors"); + let mut result: Result<(), (&str, BoxError)> = Ok(()); + let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.modify_before_completion(&mut ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!( + "{}::{}: {}", + last_error.0, + "modify_before_completion", + DisplayErrorContext(&*last_error.1) + ); + } + result = Err((interceptor.name(), new_error)); + } + } + } + result.map_err(|(name, err)| InterceptorError::modify_before_completion(name, err)) + } + + pub(crate) fn read_after_execution( + self, + ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), InterceptorError> { + tracing::trace!("running `read_after_execution` interceptors"); + let mut result: Result<(), (&str, BoxError)> = Ok(()); + let ctx: FinalizerInterceptorContextRef<'_> = ctx.into(); + for interceptor in self.into_iter() { + if let Some(interceptor) = interceptor.if_enabled(cfg) { + if let Err(new_error) = + interceptor.read_after_execution(&ctx, runtime_components, cfg) + { + if let Err(last_error) = result { + tracing::debug!( + "{}::{}: {}", + last_error.0, + "read_after_execution", + DisplayErrorContext(&*last_error.1) + ); + } + result = Err((interceptor.name(), new_error)); + } + } + } + result.map_err(|(name, err)| InterceptorError::read_after_execution(name, err)) + } +} + +/// A interceptor wrapper to conditionally enable the interceptor based on +/// [`DisableInterceptor`](aws_smithy_runtime_api::client::interceptors::DisableInterceptor) +struct ConditionallyEnabledInterceptor(SharedInterceptor); +impl ConditionallyEnabledInterceptor { + fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Intercept> { + if self.0.enabled(cfg) { + Some(&self.0) + } else { + None + } + } +} + +/// Interceptor that maps the request with a given function. pub struct MapRequestInterceptor { f: F, _phantom: PhantomData, @@ -25,6 +298,7 @@ impl fmt::Debug for MapRequestInterceptor { } impl MapRequestInterceptor { + /// Creates a new `MapRequestInterceptor`. pub fn new(f: F) -> Self { Self { f, @@ -33,14 +307,19 @@ impl MapRequestInterceptor { } } -impl Interceptor for MapRequestInterceptor +impl Intercept for MapRequestInterceptor where F: Fn(HttpRequest) -> Result + Send + Sync + 'static, E: StdError + Send + Sync + 'static, { + fn name(&self) -> &'static str { + "MapRequestInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let mut request = HttpRequest::new(SdkBody::taken()); @@ -52,6 +331,7 @@ where } } +/// Interceptor that mutates the request with a given function. pub struct MutateRequestInterceptor { f: F, } @@ -63,18 +343,24 @@ impl fmt::Debug for MutateRequestInterceptor { } impl MutateRequestInterceptor { + /// Creates a new `MutateRequestInterceptor`. pub fn new(f: F) -> Self { Self { f } } } -impl Interceptor for MutateRequestInterceptor +impl Intercept for MutateRequestInterceptor where F: Fn(&mut HttpRequest) + Send + Sync + 'static, { + fn name(&self) -> &'static str { + "MutateRequestInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let request = context.request_mut(); @@ -83,3 +369,87 @@ where Ok(()) } } + +#[cfg(all(test, feature = "test-util"))] +mod tests { + use super::*; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::interceptors::context::{ + BeforeTransmitInterceptorContextRef, Input, InterceptorContext, + }; + use aws_smithy_runtime_api::client::interceptors::{ + disable_interceptor, Intercept, SharedInterceptor, + }; + use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, + }; + use aws_smithy_types::config_bag::ConfigBag; + + #[derive(Debug)] + struct TestInterceptor; + impl Intercept for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + } + + #[test] + fn test_disable_interceptors() { + #[derive(Debug)] + struct PanicInterceptor; + impl Intercept for PanicInterceptor { + fn name(&self) -> &'static str { + "PanicInterceptor" + } + + fn read_before_transmit( + &self, + _context: &BeforeTransmitInterceptorContextRef<'_>, + _rc: &RuntimeComponents, + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + Err("boom".into()) + } + } + let rc = RuntimeComponentsBuilder::for_tests() + .with_interceptor(SharedInterceptor::new(PanicInterceptor)) + .with_interceptor(SharedInterceptor::new(TestInterceptor)) + .build() + .unwrap(); + + let mut cfg = ConfigBag::base(); + let interceptors = Interceptors::new(rc.interceptors()); + assert_eq!( + interceptors + .into_iter() + .filter(|i| i.if_enabled(&cfg).is_some()) + .count(), + 2 + ); + + Interceptors::new(rc.interceptors()) + .read_before_transmit( + &InterceptorContext::new(Input::doesnt_matter()), + &rc, + &mut cfg, + ) + .expect_err("interceptor returns error"); + cfg.interceptor_state() + .store_put(disable_interceptor::("test")); + assert_eq!( + Interceptors::new(rc.interceptors()) + .into_iter() + .filter(|i| i.if_enabled(&cfg).is_some()) + .count(), + 1 + ); + // shouldn't error because interceptors won't run + Interceptors::new(rc.interceptors()) + .read_before_transmit( + &InterceptorContext::new(Input::doesnt_matter()), + &rc, + &mut cfg, + ) + .expect("interceptor is now disabled"); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs index 552c78b04b9..e9fcb661535 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs @@ -7,34 +7,43 @@ #![allow(unknown_lints)] use self::auth::orchestrate_auth; +use crate::client::interceptors::Interceptors; use crate::client::orchestrator::endpoints::orchestrate_endpoint; -use crate::client::orchestrator::http::read_body; -use crate::client::timeout::{MaybeTimeout, ProvideMaybeTimeoutConfig, TimeoutKind}; +use crate::client::orchestrator::http::{log_response_body, read_body}; +use crate::client::timeout::{MaybeTimeout, MaybeTimeoutConfig, TimeoutKind}; use aws_smithy_async::rt::sleep::AsyncSleep; -use aws_smithy_http::body::SdkBody; -use aws_smithy_http::byte_stream::ByteStream; -use aws_smithy_http::result::SdkError; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; +use aws_smithy_runtime_api::client::http::{HttpClient, HttpConnector, HttpConnectorSettings}; use aws_smithy_runtime_api::client::interceptors::context::{ Error, Input, InterceptorContext, Output, RewindResult, }; -use aws_smithy_runtime_api::client::interceptors::Interceptors; use aws_smithy_runtime_api::client::orchestrator::{ - HttpResponse, LoadedRequestBody, OrchestratorError, RequestSerializer, + HttpResponse, LoadedRequestBody, OrchestratorError, }; -use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; -use aws_smithy_runtime_api::client::retries::ShouldAttempt; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, ShouldAttempt}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins; +use aws_smithy_runtime_api::client::ser_de::{ + DeserializeResponse, SerializeRequest, SharedRequestSerializer, SharedResponseDeserializer, +}; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::byte_stream::ByteStream; use aws_smithy_types::config_bag::ConfigBag; +use aws_smithy_types::timeout::TimeoutConfig; use std::mem; use tracing::{debug, debug_span, instrument, trace, Instrument}; mod auth; + /// Defines types that implement a trait for endpoint resolution pub mod endpoints; + +/// Defines types that work with HTTP types mod http; -pub mod interceptors; + +/// Utility for making one-off unmodeled requests with the orchestrator. +pub mod operation; macro_rules! halt { ([$ctx:ident] => $err:expr) => {{ @@ -62,6 +71,33 @@ macro_rules! continue_on_err { }; } +macro_rules! run_interceptors { + (continue_on_err: { $($interceptor:ident($ctx:ident, $rc:ident, $cfg:ident);)+ }) => { + $(run_interceptors!(continue_on_err: $interceptor($ctx, $rc, $cfg));)+ + }; + (continue_on_err: $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => { + continue_on_err!([$ctx] => run_interceptors!(__private $interceptor($ctx, $rc, $cfg))) + }; + (halt_on_err: { $($interceptor:ident($ctx:ident, $rc:ident, $cfg:ident);)+ }) => { + $(run_interceptors!(halt_on_err: $interceptor($ctx, $rc, $cfg));)+ + }; + (halt_on_err: $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => { + halt_on_err!([$ctx] => run_interceptors!(__private $interceptor($ctx, $rc, $cfg))) + }; + (__private $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => { + Interceptors::new($rc.interceptors()).$interceptor($ctx, $rc, $cfg) + }; +} + +/// Orchestrates the execution of a request and handling of a response. +/// +/// The given `runtime_plugins` will be used to generate a `ConfigBag` for this request, +/// and then the given `input` will be serialized and transmitted. When a response is +/// received, it will be deserialized and returned. +/// +/// This orchestration handles retries, endpoint resolution, identity resolution, and signing. +/// Each of these are configurable via the config and runtime components given by the runtime +/// plugins. pub async fn invoke( service_name: &str, operation_name: &str, @@ -90,6 +126,12 @@ pub enum StopPoint { BeforeTransmit, } +/// Same as [`invoke`], but allows for returning early at different points during orchestration. +/// +/// Orchestration will cease at the point specified by `stop_point`. This is useful for orchestrations +/// that don't need to actually transmit requests, such as for generating presigned requests. +/// +/// See the docs on [`invoke`] for more details. pub async fn invoke_with_stop_point( service_name: &str, operation_name: &str, @@ -101,24 +143,25 @@ pub async fn invoke_with_stop_point( let mut cfg = ConfigBag::base(); let cfg = &mut cfg; - let mut interceptors = Interceptors::new(); let mut ctx = InterceptorContext::new(input); - if let Err(err) = apply_configuration(&mut ctx, cfg, &mut interceptors, runtime_plugins) { - return Err(SdkError::construction_failure(err)); - } - let operation_timeout_config = cfg.maybe_timeout_config(TimeoutKind::Operation); + let runtime_components = apply_configuration(&mut ctx, cfg, runtime_plugins) + .map_err(SdkError::construction_failure)?; + trace!(runtime_components = ?runtime_components); + + let operation_timeout_config = + MaybeTimeoutConfig::new(&runtime_components, cfg, TimeoutKind::Operation); trace!(operation_timeout_config = ?operation_timeout_config); async { // If running the pre-execution interceptors failed, then we skip running the op and run the // final interceptors instead. if !ctx.is_failed() { - try_op(&mut ctx, cfg, &interceptors, stop_point).await; + try_op(&mut ctx, cfg, &runtime_components, stop_point).await; } - finally_op(&mut ctx, cfg, &interceptors).await; + finally_op(&mut ctx, cfg, &runtime_components).await; Ok(ctx) } - .maybe_timeout_with_config(operation_timeout_config) + .maybe_timeout(operation_timeout_config) .await } .instrument(debug_span!("invoke", service = %service_name, operation = %operation_name)) @@ -128,67 +171,81 @@ pub async fn invoke_with_stop_point( /// Apply configuration is responsible for apply runtime plugins to the config bag, as well as running /// `read_before_execution` interceptors. If a failure occurs due to config construction, `invoke` /// will raise it to the user. If an interceptor fails, then `invoke` -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] fn apply_configuration( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &mut Interceptors, runtime_plugins: &RuntimePlugins, -) -> Result<(), BoxError> { - runtime_plugins.apply_client_configuration(cfg, interceptors.client_interceptors_mut())?; - continue_on_err!([ctx] => interceptors.client_read_before_execution(ctx, cfg)); +) -> Result { + let client_rc_builder = runtime_plugins.apply_client_configuration(cfg)?; + continue_on_err!([ctx] => Interceptors::new(client_rc_builder.interceptors()).read_before_execution(false, ctx, cfg)); - runtime_plugins - .apply_operation_configuration(cfg, interceptors.operation_interceptors_mut())?; - continue_on_err!([ctx] => interceptors.operation_read_before_execution(ctx, cfg)); + let operation_rc_builder = runtime_plugins.apply_operation_configuration(cfg)?; + continue_on_err!([ctx] => Interceptors::new(operation_rc_builder.interceptors()).read_before_execution(true, ctx, cfg)); - Ok(()) + // The order below is important. Client interceptors must run before operation interceptors. + let components = RuntimeComponents::builder("merged orchestrator components") + .merge_from(&client_rc_builder) + .merge_from(&operation_rc_builder) + .build()?; + + components.validate_final_config(cfg)?; + Ok(components) } -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] async fn try_op( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &Interceptors, + runtime_components: &RuntimeComponents, stop_point: StopPoint, ) { // Before serialization - halt_on_err!([ctx] => interceptors.read_before_serialization(ctx, cfg)); - halt_on_err!([ctx] => interceptors.modify_before_serialization(ctx, cfg)); + run_interceptors!(halt_on_err: { + read_before_serialization(ctx, runtime_components, cfg); + modify_before_serialization(ctx, runtime_components, cfg); + }); // Serialization ctx.enter_serialization_phase(); { let _span = debug_span!("serialization").entered(); - let request_serializer = cfg.request_serializer(); + let request_serializer = cfg + .load::() + .expect("request serializer must be in the config bag") + .clone(); let input = ctx.take_input().expect("input set at this point"); let request = halt_on_err!([ctx] => request_serializer.serialize_input(input, cfg).map_err(OrchestratorError::other)); ctx.set_request(request); } // Load the request body into memory if configured to do so - if let LoadedRequestBody::Requested = cfg.loaded_request_body() { + if let Some(&LoadedRequestBody::Requested) = cfg.load::() { debug!("loading request body into memory"); let mut body = SdkBody::taken(); mem::swap(&mut body, ctx.request_mut().expect("set above").body_mut()); - let loaded_body = halt_on_err!([ctx] => ByteStream::new(body).collect().await).into_bytes(); + let loaded_body = halt_on_err!([ctx] => + ByteStream::new(body).collect().await.map_err(OrchestratorError::other) + ) + .into_bytes(); *ctx.request_mut().as_mut().expect("set above").body_mut() = SdkBody::from(loaded_body.clone()); cfg.interceptor_state() - .set_loaded_request_body(LoadedRequestBody::Loaded(loaded_body)); + .store_put(LoadedRequestBody::Loaded(loaded_body)); } // Before transmit ctx.enter_before_transmit_phase(); - halt_on_err!([ctx] => interceptors.read_after_serialization(ctx, cfg)); - halt_on_err!([ctx] => interceptors.modify_before_retry_loop(ctx, cfg)); + run_interceptors!(halt_on_err: { + read_after_serialization(ctx, runtime_components, cfg); + modify_before_retry_loop(ctx, runtime_components, cfg); + }); - let retry_strategy = cfg.retry_strategy(); // If we got a retry strategy from the bag, ask it what to do. // Otherwise, assume we should attempt the initial request. - let should_attempt = retry_strategy - .map(|rs| rs.should_attempt_initial_request(cfg)) - .unwrap_or(Ok(ShouldAttempt::Yes)); + let should_attempt = runtime_components + .retry_strategy() + .should_attempt_initial_request(runtime_components, cfg); match should_attempt { // Yes, let's make a request Ok(ShouldAttempt::Yes) => debug!("retry strategy has OKed initial request"), @@ -200,7 +257,7 @@ async fn try_op( // No, we shouldn't make a request because... Err(err) => halt!([ctx] => OrchestratorError::other(err)), Ok(ShouldAttempt::YesAfterDelay(delay)) => { - let sleep_impl = halt_on_err!([ctx] => cfg.sleep_impl().ok_or(OrchestratorError::other( + let sleep_impl = halt_on_err!([ctx] => runtime_components.sleep_impl().ok_or_else(|| OrchestratorError::other( "the retry strategy requested a delay before sending the initial request, but no 'async sleep' implementation was set" ))); debug!("retry strategy has OKed initial request after a {delay:?} delay"); @@ -228,31 +285,28 @@ async fn try_op( debug!("delaying for {delay:?}"); sleep.await; } - let attempt_timeout_config = cfg.maybe_timeout_config(TimeoutKind::OperationAttempt); + let attempt_timeout_config = + MaybeTimeoutConfig::new(runtime_components, cfg, TimeoutKind::OperationAttempt); trace!(attempt_timeout_config = ?attempt_timeout_config); let maybe_timeout = async { debug!("beginning attempt #{i}"); - try_attempt(ctx, cfg, interceptors, stop_point).await; - finally_attempt(ctx, cfg, interceptors).await; + try_attempt(ctx, cfg, runtime_components, stop_point).await; + finally_attempt(ctx, cfg, runtime_components).await; Result::<_, SdkError>::Ok(()) } - .maybe_timeout_with_config(attempt_timeout_config) + .maybe_timeout(attempt_timeout_config) .await .map_err(|err| OrchestratorError::timeout(err.into_source().unwrap())); // We continue when encountering a timeout error. The retry classifier will decide what to do with it. continue_on_err!([ctx] => maybe_timeout); - let retry_strategy = cfg.retry_strategy(); - // If we got a retry strategy from the bag, ask it what to do. // If no strategy was set, we won't retry. - let should_attempt = match retry_strategy { - Some(retry_strategy) => halt_on_err!( - [ctx] => retry_strategy.should_attempt_retry(ctx, cfg).map_err(OrchestratorError::other) - ), - None => ShouldAttempt::No, - }; + let should_attempt = halt_on_err!([ctx] => runtime_components + .retry_strategy() + .should_attempt_retry(ctx, runtime_components, cfg) + .map_err(OrchestratorError::other)); match should_attempt { // Yes, let's retry the request ShouldAttempt::Yes => continue, @@ -262,7 +316,7 @@ async fn try_op( break; } ShouldAttempt::YesAfterDelay(delay) => { - let sleep_impl = halt_on_err!([ctx] => cfg.sleep_impl().ok_or(OrchestratorError::other( + let sleep_impl = halt_on_err!([ctx] => runtime_components.sleep_impl().ok_or_else(|| OrchestratorError::other( "the retry strategy requested a delay before sending the retry request, but no 'async sleep' implementation was set" ))); retry_delay = Some((delay, sleep_impl.sleep(delay))); @@ -272,25 +326,29 @@ async fn try_op( } } -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] async fn try_attempt( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &Interceptors, + runtime_components: &RuntimeComponents, stop_point: StopPoint, ) { - halt_on_err!([ctx] => interceptors.read_before_attempt(ctx, cfg)); + run_interceptors!(halt_on_err: read_before_attempt(ctx, runtime_components, cfg)); - halt_on_err!([ctx] => orchestrate_endpoint(ctx, cfg).await.map_err(OrchestratorError::other)); + halt_on_err!([ctx] => orchestrate_endpoint(ctx, runtime_components, cfg).await.map_err(OrchestratorError::other)); - halt_on_err!([ctx] => interceptors.modify_before_signing(ctx, cfg)); - halt_on_err!([ctx] => interceptors.read_before_signing(ctx, cfg)); + run_interceptors!(halt_on_err: { + modify_before_signing(ctx, runtime_components, cfg); + read_before_signing(ctx, runtime_components, cfg); + }); - halt_on_err!([ctx] => orchestrate_auth(ctx, cfg).await.map_err(OrchestratorError::other)); + halt_on_err!([ctx] => orchestrate_auth(ctx, runtime_components, cfg).await.map_err(OrchestratorError::other)); - halt_on_err!([ctx] => interceptors.read_after_signing(ctx, cfg)); - halt_on_err!([ctx] => interceptors.modify_before_transmit(ctx, cfg)); - halt_on_err!([ctx] => interceptors.read_before_transmit(ctx, cfg)); + run_interceptors!(halt_on_err: { + read_after_signing(ctx, runtime_components, cfg); + modify_before_transmit(ctx, runtime_components, cfg); + read_before_transmit(ctx, runtime_components, cfg); + }); // Return early if a stop point is set for before transmit if let StopPoint::BeforeTransmit = stop_point { @@ -304,25 +362,36 @@ async fn try_attempt( let response = halt_on_err!([ctx] => { let request = ctx.take_request().expect("set during serialization"); trace!(request = ?request, "transmitting request"); - cfg.connector().call(request).await.map_err(|err| { - match err.downcast() { - Ok(connector_error) => OrchestratorError::connector(*connector_error), - Err(box_err) => OrchestratorError::other(box_err) - } - }) + let http_client = halt_on_err!([ctx] => runtime_components.http_client().ok_or_else(|| + OrchestratorError::other("No HTTP client was available to send this request. \ + Enable the `rustls` crate feature or configure a HTTP client to fix this.") + )); + let timeout_config = cfg.load::().expect("timeout config must be set"); + let settings = { + let mut builder = HttpConnectorSettings::builder(); + builder.set_connect_timeout(timeout_config.connect_timeout()); + builder.set_read_timeout(timeout_config.read_timeout()); + builder.build() + }; + let connector = http_client.http_connector(&settings, runtime_components); + connector.call(request).await.map_err(OrchestratorError::connector) }); trace!(response = ?response, "received response from service"); ctx.set_response(response); ctx.enter_before_deserialization_phase(); - halt_on_err!([ctx] => interceptors.read_after_transmit(ctx, cfg)); - halt_on_err!([ctx] => interceptors.modify_before_deserialization(ctx, cfg)); - halt_on_err!([ctx] => interceptors.read_before_deserialization(ctx, cfg)); + run_interceptors!(halt_on_err: { + read_after_transmit(ctx, runtime_components, cfg); + modify_before_deserialization(ctx, runtime_components, cfg); + read_before_deserialization(ctx, runtime_components, cfg); + }); ctx.enter_deserialization_phase(); let output_or_error = async { let response = ctx.response_mut().expect("set during transmit"); - let response_deserializer = cfg.response_deserializer(); + let response_deserializer = cfg + .load::() + .expect("a request deserializer must be in the config bag"); let maybe_deserialized = { let _span = debug_span!("deserialize_streaming").entered(); response_deserializer.deserialize_streaming(response) @@ -335,6 +404,7 @@ async fn try_attempt( .map_err(OrchestratorError::response) .and_then(|_| { let _span = debug_span!("deserialize_nonstreaming").entered(); + log_response_body(response, cfg); response_deserializer.deserialize_nonstreaming(response) }), } @@ -345,44 +415,53 @@ async fn try_attempt( ctx.set_output_or_error(output_or_error); ctx.enter_after_deserialization_phase(); - halt_on_err!([ctx] => interceptors.read_after_deserialization(ctx, cfg)); + run_interceptors!(halt_on_err: read_after_deserialization(ctx, runtime_components, cfg)); } -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] async fn finally_attempt( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &Interceptors, + runtime_components: &RuntimeComponents, ) { - continue_on_err!([ctx] => interceptors.modify_before_attempt_completion(ctx, cfg)); - continue_on_err!([ctx] => interceptors.read_after_attempt(ctx, cfg)); + run_interceptors!(continue_on_err: { + modify_before_attempt_completion(ctx, runtime_components, cfg); + read_after_attempt(ctx, runtime_components, cfg); + }); } -#[instrument(skip_all)] +#[instrument(skip_all, level = "debug")] async fn finally_op( ctx: &mut InterceptorContext, cfg: &mut ConfigBag, - interceptors: &Interceptors, + runtime_components: &RuntimeComponents, ) { - continue_on_err!([ctx] => interceptors.modify_before_completion(ctx, cfg)); - continue_on_err!([ctx] => interceptors.read_after_execution(ctx, cfg)); + run_interceptors!(continue_on_err: { + modify_before_completion(ctx, runtime_components, cfg); + read_after_execution(ctx, runtime_components, cfg); + }); } #[cfg(all(test, feature = "test-util"))] mod tests { use super::*; use crate::client::auth::no_auth::{NoAuthRuntimePlugin, NO_AUTH_SCHEME_ID}; - use crate::client::orchestrator::endpoints::{ - StaticUriEndpointResolver, StaticUriEndpointResolverParams, - }; + use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; use crate::client::retries::strategy::NeverRetryStrategy; use crate::client::test_util::{ deserializer::CannedResponseDeserializer, serializer::CannedRequestSerializer, }; - use ::http::{Request, Response, StatusCode}; - use aws_smithy_runtime_api::client::auth::option_resolver::StaticAuthOptionResolver; - use aws_smithy_runtime_api::client::auth::{AuthOptionResolverParams, DynAuthOptionResolver}; - use aws_smithy_runtime_api::client::connectors::{Connector, DynConnector}; + use ::http::{Response, StatusCode}; + use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; + use aws_smithy_runtime_api::client::auth::{ + AuthSchemeOptionResolverParams, SharedAuthSchemeOptionResolver, + }; + use aws_smithy_runtime_api::client::endpoint::{ + EndpointResolverParams, SharedEndpointResolver, + }; + use aws_smithy_runtime_api::client::http::{ + http_client_fn, HttpConnector, HttpConnectorFuture, + }; use aws_smithy_runtime_api::client::interceptors::context::{ AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut, BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut, @@ -390,27 +469,20 @@ mod tests { BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut, FinalizerInterceptorContextRef, }; - use aws_smithy_runtime_api::client::interceptors::{ - Interceptor, InterceptorRegistrar, SharedInterceptor, - }; - use aws_smithy_runtime_api::client::orchestrator::{ - BoxFuture, DynEndpointResolver, DynResponseDeserializer, Future, HttpRequest, - SharedRequestSerializer, - }; - use aws_smithy_runtime_api::client::retries::DynRetryStrategy; + use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor}; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, RuntimePlugins}; + use aws_smithy_runtime_api::shared::IntoShared; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; - use aws_smithy_types::type_erasure::{TypeErasedBox, TypedBox}; + use std::borrow::Cow; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use tracing_test::traced_test; fn new_request_serializer() -> CannedRequestSerializer { - CannedRequestSerializer::success( - Request::builder() - .body(SdkBody::empty()) - .expect("request is valid"), - ) + CannedRequestSerializer::success(HttpRequest::empty()) } fn new_response_deserializer() -> CannedResponseDeserializer { @@ -419,7 +491,7 @@ mod tests { .status(StatusCode::OK) .body(SdkBody::empty()) .map_err(|err| OrchestratorError::other(Box::new(err))) - .map(|res| Output::new(Box::new(res))), + .map(Output::erase), ) } @@ -432,46 +504,78 @@ mod tests { } } - impl Connector for OkConnector { - fn call(&self, _request: HttpRequest) -> BoxFuture { - Box::pin(Future::ready(Ok(::http::Response::builder() + impl HttpConnector for OkConnector { + fn call(&self, _request: HttpRequest) -> HttpConnectorFuture { + HttpConnectorFuture::ready(Ok(::http::Response::builder() .status(200) .body(SdkBody::empty()) - .expect("OK response is valid")))) + .expect("OK response is valid") + .try_into() + .unwrap())) } } #[derive(Debug)] - struct TestOperationRuntimePlugin; + struct TestOperationRuntimePlugin { + builder: RuntimeComponentsBuilder, + } + + impl TestOperationRuntimePlugin { + fn new() -> Self { + Self { + builder: RuntimeComponentsBuilder::for_tests() + .with_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))) + .with_endpoint_resolver(Some(SharedEndpointResolver::new( + StaticUriEndpointResolver::http_localhost(8080), + ))) + .with_http_client(Some(http_client_fn(|_, _| { + OkConnector::new().into_shared() + }))) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), + ))), + } + } + } impl RuntimePlugin for TestOperationRuntimePlugin { fn config(&self) -> Option { - let mut cfg = Layer::new("test operation"); - cfg.set_request_serializer(SharedRequestSerializer::new(new_request_serializer())); - cfg.set_response_deserializer( - DynResponseDeserializer::new(new_response_deserializer()), - ); - cfg.set_retry_strategy(DynRetryStrategy::new(NeverRetryStrategy::new())); - cfg.set_endpoint_resolver(DynEndpointResolver::new( - StaticUriEndpointResolver::http_localhost(8080), - )); - cfg.set_endpoint_resolver_params(StaticUriEndpointResolverParams::new().into()); - cfg.set_connector(DynConnector::new(OkConnector::new())); - cfg.set_auth_option_resolver_params(AuthOptionResolverParams::new("idontcare")); - cfg.set_auth_option_resolver(DynAuthOptionResolver::new( - StaticAuthOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), - )); - - Some(cfg.freeze()) + let mut layer = Layer::new("TestOperationRuntimePlugin"); + layer.store_put(AuthSchemeOptionResolverParams::new("idontcare")); + layer.store_put(EndpointResolverParams::new("dontcare")); + layer.store_put(SharedRequestSerializer::new(new_request_serializer())); + layer.store_put(SharedResponseDeserializer::new(new_response_deserializer())); + layer.store_put(TimeoutConfig::builder().build()); + Some(layer.freeze()) + } + + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.builder) } } macro_rules! interceptor_error_handling_test { + (read_before_execution, $ctx:ty, $expected:expr,) => { + interceptor_error_handling_test!(__private read_before_execution, $ctx, $expected,); + }; ($interceptor:ident, $ctx:ty, $expected:expr) => { + interceptor_error_handling_test!(__private $interceptor, $ctx, $expected, _rc: &RuntimeComponents,); + }; + (__private $interceptor:ident, $ctx:ty, $expected:expr, $($rc_arg:tt)*) => { #[derive(Debug)] struct FailingInterceptorA; - impl Interceptor for FailingInterceptorA { - fn $interceptor(&self, _ctx: $ctx, _cfg: &mut ConfigBag) -> Result<(), BoxError> { + impl Intercept for FailingInterceptorA { + fn name(&self) -> &'static str { "FailingInterceptorA" } + + fn $interceptor( + &self, + _ctx: $ctx, + $($rc_arg)* + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { tracing::debug!("FailingInterceptorA called!"); Err("FailingInterceptorA".into()) } @@ -479,8 +583,15 @@ mod tests { #[derive(Debug)] struct FailingInterceptorB; - impl Interceptor for FailingInterceptorB { - fn $interceptor(&self, _ctx: $ctx, _cfg: &mut ConfigBag) -> Result<(), BoxError> { + impl Intercept for FailingInterceptorB { + fn name(&self) -> &'static str { "FailingInterceptorB" } + + fn $interceptor( + &self, + _ctx: $ctx, + $($rc_arg)* + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { tracing::debug!("FailingInterceptorB called!"); Err("FailingInterceptorB".into()) } @@ -488,43 +599,65 @@ mod tests { #[derive(Debug)] struct FailingInterceptorC; - impl Interceptor for FailingInterceptorC { - fn $interceptor(&self, _ctx: $ctx, _cfg: &mut ConfigBag) -> Result<(), BoxError> { + impl Intercept for FailingInterceptorC { + fn name(&self) -> &'static str { "FailingInterceptorC" } + + fn $interceptor( + &self, + _ctx: $ctx, + $($rc_arg)* + _cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { tracing::debug!("FailingInterceptorC called!"); Err("FailingInterceptorC".into()) } } #[derive(Debug)] - struct FailingInterceptorsClientRuntimePlugin; - + struct FailingInterceptorsClientRuntimePlugin(RuntimeComponentsBuilder); + impl FailingInterceptorsClientRuntimePlugin { + fn new() -> Self { + Self(RuntimeComponentsBuilder::new("test").with_interceptor(SharedInterceptor::new(FailingInterceptorA))) + } + } impl RuntimePlugin for FailingInterceptorsClientRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(FailingInterceptorA)); + fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.0) } } #[derive(Debug)] - struct FailingInterceptorsOperationRuntimePlugin; - + struct FailingInterceptorsOperationRuntimePlugin(RuntimeComponentsBuilder); + impl FailingInterceptorsOperationRuntimePlugin { + fn new() -> Self { + Self( + RuntimeComponentsBuilder::new("test") + .with_interceptor(SharedInterceptor::new(FailingInterceptorB)) + .with_interceptor(SharedInterceptor::new(FailingInterceptorC)) + ) + } + } impl RuntimePlugin for FailingInterceptorsOperationRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(FailingInterceptorB)); - interceptors.register(SharedInterceptor::new(FailingInterceptorC)); + fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.0) } } - let input = TypeErasedBox::new(Box::new(())); + let input = Input::doesnt_matter(); let runtime_plugins = RuntimePlugins::new() - .with_client_plugin(FailingInterceptorsClientRuntimePlugin) - .with_operation_plugin(TestOperationRuntimePlugin) + .with_client_plugin(FailingInterceptorsClientRuntimePlugin::new()) + .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) - .with_operation_plugin(FailingInterceptorsOperationRuntimePlugin); + .with_operation_plugin(FailingInterceptorsOperationRuntimePlugin::new()); let actual = invoke("test", "test", input, &runtime_plugins) .await .expect_err("should error"); let actual = format!("{:?}", actual); - assert_eq!($expected, format!("{:?}", actual)); + assert!( + actual.starts_with(&$expected), + "\nActual error: {actual}\nShould start with: {}\n", + $expected + ); assert!(logs_contain("FailingInterceptorA called!")); assert!(logs_contain("FailingInterceptorB called!")); @@ -535,18 +668,18 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_execution_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeExecution, source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeExecution, interceptor_name: Some("FailingInterceptorC"), source: Some("FailingInterceptorC") } })"#.to_string(); interceptor_error_handling_test!( read_before_execution, &BeforeSerializationInterceptorContextRef<'_>, - expected + expected, ); } #[tokio::test] #[traced_test] async fn test_modify_before_serialization_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeSerialization, source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeSerialization, interceptor_name: Some("FailingInterceptorC"), source: Some("FailingInterceptorC") } })"#.to_string(); interceptor_error_handling_test!( modify_before_serialization, &mut BeforeSerializationInterceptorContextMut<'_>, @@ -557,7 +690,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_serialization_error_handling() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeSerialization, source: Some(\"FailingInterceptorC\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeSerialization, interceptor_name: Some("FailingInterceptorC"), source: Some("FailingInterceptorC") } })"#.to_string(); interceptor_error_handling_test!( read_before_serialization, &BeforeSerializationInterceptorContextRef<'_>, @@ -568,7 +701,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_serialization_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSerialization, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSerialization, interceptor_name: Some("FailingInterceptorC")"#.to_string(); interceptor_error_handling_test!( read_after_serialization, &BeforeTransmitInterceptorContextRef<'_>, @@ -579,7 +712,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_retry_loop_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeRetryLoop, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeRetryLoop, interceptor_name: Some("FailingInterceptorC")"#.to_string(); interceptor_error_handling_test!( modify_before_retry_loop, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -590,7 +723,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_attempt_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeAttempt, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeAttempt, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_before_attempt, &BeforeTransmitInterceptorContextRef<'_>, @@ -601,7 +734,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeSigning, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeSigning, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_signing, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -612,7 +745,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeSigning, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeSigning, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_before_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -623,7 +756,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_signing_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSigning, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSigning, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -634,7 +767,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_transmit_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeTransmit, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeTransmit, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_transmit, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -645,7 +778,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_transmit_error_handling() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeTransmit, source: Some(\"FailingInterceptorC\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeTransmit, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_before_transmit, &BeforeTransmitInterceptorContextRef<'_>, @@ -656,7 +789,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_transmit_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterTransmit, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterTransmit, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_transmit, &BeforeDeserializationInterceptorContextRef<'_>, @@ -667,7 +800,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeDeserialization, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeDeserialization, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_deserialization, &mut BeforeDeserializationInterceptorContextMut<'_>, @@ -678,7 +811,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadBeforeDeserialization, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadBeforeDeserialization, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_before_deserialization, &BeforeDeserializationInterceptorContextRef<'_>, @@ -689,7 +822,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_deserialization_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterDeserialization, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterDeserialization, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_deserialization, &AfterDeserializationInterceptorContextRef<'_>, @@ -700,7 +833,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_attempt_completion_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_attempt_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -711,7 +844,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_attempt_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_attempt, &FinalizerInterceptorContextRef<'_>, @@ -722,7 +855,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_completion_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( modify_before_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -733,7 +866,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_execution_error_handling() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, source: Some(\"FailingInterceptorC\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some("FailingInterceptorC")"#; interceptor_error_handling_test!( read_after_execution, &FinalizerInterceptorContextRef<'_>, @@ -742,13 +875,22 @@ mod tests { } macro_rules! interceptor_error_redirection_test { + (read_before_execution, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr) => { + interceptor_error_redirection_test!(__private read_before_execution, $origin_ctx, $destination_interceptor, $destination_ctx, $expected,); + }; ($origin_interceptor:ident, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr) => { + interceptor_error_redirection_test!(__private $origin_interceptor, $origin_ctx, $destination_interceptor, $destination_ctx, $expected, _rc: &RuntimeComponents,); + }; + (__private $origin_interceptor:ident, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr, $($rc_arg:tt)*) => { #[derive(Debug)] struct OriginInterceptor; - impl Interceptor for OriginInterceptor { + impl Intercept for OriginInterceptor { + fn name(&self) -> &'static str { "OriginInterceptor" } + fn $origin_interceptor( &self, _ctx: $origin_ctx, + $($rc_arg)* _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { tracing::debug!("OriginInterceptor called!"); @@ -758,10 +900,13 @@ mod tests { #[derive(Debug)] struct DestinationInterceptor; - impl Interceptor for DestinationInterceptor { + impl Intercept for DestinationInterceptor { + fn name(&self) -> &'static str { "DestinationInterceptor" } + fn $destination_interceptor( &self, _ctx: $destination_ctx, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { tracing::debug!("DestinationInterceptor called!"); @@ -770,25 +915,36 @@ mod tests { } #[derive(Debug)] - struct InterceptorsTestOperationRuntimePlugin; - + struct InterceptorsTestOperationRuntimePlugin(RuntimeComponentsBuilder); + impl InterceptorsTestOperationRuntimePlugin { + fn new() -> Self { + Self( + RuntimeComponentsBuilder::new("test") + .with_interceptor(SharedInterceptor::new(OriginInterceptor)) + .with_interceptor(SharedInterceptor::new(DestinationInterceptor)) + ) + } + } impl RuntimePlugin for InterceptorsTestOperationRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(OriginInterceptor)); - interceptors.register(SharedInterceptor::new(DestinationInterceptor)); + fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.0) } } - let input = TypeErasedBox::new(Box::new(())); + let input = Input::doesnt_matter(); let runtime_plugins = RuntimePlugins::new() - .with_operation_plugin(TestOperationRuntimePlugin) + .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) - .with_operation_plugin(InterceptorsTestOperationRuntimePlugin); + .with_operation_plugin(InterceptorsTestOperationRuntimePlugin::new()); let actual = invoke("test", "test", input, &runtime_plugins) .await .expect_err("should error"); let actual = format!("{:?}", actual); - assert_eq!($expected, format!("{:?}", actual)); + assert!( + actual.starts_with(&$expected), + "\nActual error: {actual}\nShould start with: {}\n", + $expected + ); assert!(logs_contain("OriginInterceptor called!")); assert!(logs_contain("DestinationInterceptor called!")); @@ -798,7 +954,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_execution_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_execution, &BeforeSerializationInterceptorContextRef<'_>, @@ -811,7 +967,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_serialization, &mut BeforeSerializationInterceptorContextMut<'_>, @@ -824,7 +980,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") } })""#.to_string(); + let expected = r#"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_serialization, &BeforeSerializationInterceptorContextRef<'_>, @@ -837,7 +993,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_serialization_error_causes_jump_to_modify_before_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_after_serialization, &BeforeTransmitInterceptorContextRef<'_>, @@ -850,7 +1006,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_retry_loop_error_causes_jump_to_modify_before_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_retry_loop, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -863,7 +1019,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_attempt_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_attempt, &BeforeTransmitInterceptorContextRef<'_>, @@ -876,7 +1032,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_signing, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -889,7 +1045,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -902,7 +1058,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_signing_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_after_signing, &BeforeTransmitInterceptorContextRef<'_>, @@ -915,7 +1071,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_transmit, &mut BeforeTransmitInterceptorContextMut<'_>, @@ -928,7 +1084,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_before_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, connection: Unknown } })""#.to_string(); + let expected = r#"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_transmit, &BeforeTransmitInterceptorContextRef<'_>, @@ -941,7 +1097,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_read_after_transmit_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_after_transmit, &BeforeDeserializationInterceptorContextRef<'_>, @@ -955,7 +1111,7 @@ mod tests { #[traced_test] async fn test_modify_before_deserialization_error_causes_jump_to_modify_before_attempt_completion( ) { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_deserialization, &mut BeforeDeserializationInterceptorContextMut<'_>, @@ -969,7 +1125,7 @@ mod tests { #[traced_test] async fn test_read_before_deserialization_error_causes_jump_to_modify_before_attempt_completion( ) { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(None), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_before_deserialization, &BeforeDeserializationInterceptorContextRef<'_>, @@ -983,7 +1139,7 @@ mod tests { #[traced_test] async fn test_read_after_deserialization_error_causes_jump_to_modify_before_attempt_completion() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( read_after_deserialization, &AfterDeserializationInterceptorContextRef<'_>, @@ -996,7 +1152,7 @@ mod tests { #[tokio::test] #[traced_test] async fn test_modify_before_attempt_completion_error_causes_jump_to_read_after_attempt() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_attempt_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -1006,16 +1162,10 @@ mod tests { ); } - // #[tokio::test] - // #[traced_test] - // async fn test_read_after_attempt_error_causes_jump_to_modify_before_attempt_completion() { - // todo!("I'm confused by the behavior described in the spec") - // } - #[tokio::test] #[traced_test] async fn test_modify_before_completion_error_causes_jump_to_read_after_execution() { - let expected = r#""ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, source: Some(\"DestinationInterceptor\") }, raw: Response { status: 200, version: HTTP/1.1, headers: {}, body: SdkBody { inner: Once(Some(b\"\")), retryable: true } } })""#.to_string(); + let expected = r#"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some("DestinationInterceptor")"#; interceptor_error_redirection_test!( modify_before_completion, &mut FinalizerInterceptorContextMut<'_>, @@ -1029,7 +1179,7 @@ mod tests { async fn test_stop_points() { let runtime_plugins = || { RuntimePlugins::new() - .with_operation_plugin(TestOperationRuntimePlugin) + .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) }; @@ -1037,7 +1187,7 @@ mod tests { let context = invoke_with_stop_point( "test", "test", - TypedBox::new(()).erase(), + Input::doesnt_matter(), &runtime_plugins(), StopPoint::None, ) @@ -1049,7 +1199,7 @@ mod tests { let context = invoke_with_stop_point( "test", "test", - TypedBox::new(()).erase(), + Input::doesnt_matter(), &runtime_plugins(), StopPoint::BeforeTransmit, ) @@ -1072,10 +1222,15 @@ mod tests { inner: Arc, } - impl Interceptor for TestInterceptor { + impl Intercept for TestInterceptor { + fn name(&self) -> &'static str { + "TestInterceptor" + } + fn modify_before_retry_loop( &self, _context: &mut BeforeTransmitInterceptorContextMut<'_>, + _rc: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { self.inner @@ -1087,6 +1242,7 @@ mod tests { fn modify_before_completion( &self, _context: &mut FinalizerInterceptorContextMut<'_>, + _rc: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { self.inner @@ -1098,6 +1254,7 @@ mod tests { fn read_after_execution( &self, _context: &FinalizerInterceptorContextRef<'_>, + _rc: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { self.inner @@ -1109,21 +1266,25 @@ mod tests { #[derive(Debug)] struct TestInterceptorRuntimePlugin { - interceptor: TestInterceptor, + builder: RuntimeComponentsBuilder, } impl RuntimePlugin for TestInterceptorRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(self.interceptor.clone())); + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.builder) } } let interceptor = TestInterceptor::default(); let runtime_plugins = || { RuntimePlugins::new() - .with_operation_plugin(TestOperationRuntimePlugin) + .with_operation_plugin(TestOperationRuntimePlugin::new()) .with_operation_plugin(NoAuthRuntimePlugin::new()) .with_operation_plugin(TestInterceptorRuntimePlugin { - interceptor: interceptor.clone(), + builder: RuntimeComponentsBuilder::new("test") + .with_interceptor(SharedInterceptor::new(interceptor.clone())), }) }; @@ -1131,7 +1292,7 @@ mod tests { let context = invoke_with_stop_point( "test", "test", - TypedBox::new(()).erase(), + Input::doesnt_matter(), &runtime_plugins(), StopPoint::BeforeTransmit, ) diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs index ce645708709..98a39a9a439 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs @@ -3,13 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::client::auth::no_auth::NO_AUTH_SCHEME_ID; use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::auth::{ - AuthSchemeEndpointConfig, AuthSchemeId, HttpAuthScheme, + AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOptionResolverParams, + ResolveAuthSchemeOptions, }; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; -use aws_smithy_runtime_api::client::identity::IdentityResolver; +use aws_smithy_runtime_api::client::identity::ResolveCachedIdentity; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::endpoint::Endpoint; use aws_smithy_types::Document; @@ -19,45 +21,86 @@ use std::fmt; use tracing::trace; #[derive(Debug)] -enum AuthOrchestrationError { - NoMatchingAuthScheme, - BadAuthSchemeEndpointConfig(Cow<'static, str>), - AuthSchemeEndpointConfigMismatch(String), -} +struct NoMatchingAuthSchemeError(ExploredList); + +impl fmt::Display for NoMatchingAuthSchemeError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let explored = &self.0; + + // Use the information we have about the auth options that were explored to construct + // as helpful of an error message as possible. + if explored.items().count() == 0 { + return f.write_str( + "no auth options are available. This can happen if there's \ + a problem with the service model, or if there is a codegen bug.", + ); + } + if explored + .items() + .all(|explored| matches!(explored.result, ExploreResult::NoAuthScheme)) + { + return f.write_str( + "no auth schemes are registered. This can happen if there's \ + a problem with the service model, or if there is a codegen bug.", + ); + } -impl AuthOrchestrationError { - fn auth_scheme_endpoint_config_mismatch<'a>( - auth_schemes: impl Iterator, - ) -> Self { - Self::AuthSchemeEndpointConfigMismatch( - auth_schemes - .flat_map(|s| match s { - Document::Object(map) => match map.get("name") { - Some(Document::String(name)) => Some(name.as_str()), - _ => None, - }, - _ => None, - }) - .collect::>() - .join(", "), - ) + let mut try_add_identity = false; + let mut likely_bug = false; + f.write_str("failed to select an auth scheme to sign the request with.")?; + for item in explored.items() { + write!( + f, + " \"{}\" wasn't a valid option because ", + item.scheme_id.as_str() + )?; + f.write_str(match item.result { + ExploreResult::NoAuthScheme => { + likely_bug = true; + "no auth scheme was registered for it." + } + ExploreResult::NoIdentityResolver => { + try_add_identity = true; + "there was no identity resolver for it." + } + ExploreResult::MissingEndpointConfig => { + likely_bug = true; + "there is auth config in the endpoint config, but this scheme wasn't listed in it \ + (see https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details)." + } + ExploreResult::NotExplored => { + debug_assert!(false, "this should be unreachable"); + "" + } + })?; + } + if try_add_identity { + f.write_str(" Be sure to set an identity, such as credentials, auth token, or other identity type that is required for this service.")?; + } else if likely_bug { + f.write_str(" This is likely a bug.")?; + } + if explored.truncated { + f.write_str(" Note: there were other auth schemes that were evaluated that weren't listed here.")?; + } + + Ok(()) } } +impl StdError for NoMatchingAuthSchemeError {} + +#[derive(Debug)] +enum AuthOrchestrationError { + MissingEndpointConfig, + BadAuthSchemeEndpointConfig(Cow<'static, str>), +} + impl fmt::Display for AuthOrchestrationError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::NoMatchingAuthScheme => f.write_str( - "no auth scheme matched auth options. This is a bug. Please file an issue.", - ), + // This error is never bubbled up + Self::MissingEndpointConfig => f.write_str("missing endpoint config"), Self::BadAuthSchemeEndpointConfig(message) => f.write_str(message), - Self::AuthSchemeEndpointConfigMismatch(supported_schemes) => { - write!(f, - "selected auth scheme / endpoint config mismatch. Couldn't find `sigv4` endpoint config for this endpoint. \ - The authentication schemes supported by this endpoint are: {:?}", - supported_schemes - ) - } } } } @@ -66,64 +109,92 @@ impl StdError for AuthOrchestrationError {} pub(super) async fn orchestrate_auth( ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result<(), BoxError> { - let params = cfg.auth_option_resolver_params(); - let auth_options = cfg.auth_option_resolver().resolve_auth_options(params)?; - let identity_resolvers = cfg.identity_resolvers(); + let params = cfg + .load::() + .expect("auth scheme option resolver params must be set"); + let option_resolver = runtime_components.auth_scheme_option_resolver(); + let options = option_resolver.resolve_auth_scheme_options(params)?; + let endpoint = cfg + .load::() + .expect("endpoint added to config bag by endpoint orchestrator"); trace!( - auth_option_resolver_params = ?params, - auth_options = ?auth_options, - identity_resolvers = ?identity_resolvers, + auth_scheme_option_resolver_params = ?params, + auth_scheme_options = ?options, "orchestrating auth", ); - for &scheme_id in auth_options.as_ref() { - if let Some(auth_scheme) = cfg.http_auth_schemes().scheme(scheme_id) { - if let Some(identity_resolver) = auth_scheme.identity_resolver(&identity_resolvers) { - let request_signer = auth_scheme.request_signer(); + let mut explored = ExploredList::default(); + + // Iterate over IDs of possibly-supported auth schemes + for &scheme_id in options.as_ref() { + // For each ID, try to resolve the corresponding auth scheme. + if let Some(auth_scheme) = runtime_components.auth_scheme(scheme_id) { + // Use the resolved auth scheme to resolve an identity + if let Some(identity_resolver) = auth_scheme.identity_resolver(runtime_components) { + let identity_cache = runtime_components.identity_cache(); + let signer = auth_scheme.signer(); trace!( auth_scheme = ?auth_scheme, + identity_cache = ?identity_cache, identity_resolver = ?identity_resolver, - request_signer = ?request_signer, - "resolved auth scheme, identity resolver, and signing implementation" + signer = ?signer, + "resolved auth scheme, identity cache, identity resolver, and signing implementation" ); - let endpoint = cfg - .load::() - .expect("endpoint added to config bag by endpoint orchestrator"); - let auth_scheme_endpoint_config = - extract_endpoint_auth_scheme_config(endpoint, scheme_id)?; - trace!(auth_scheme_endpoint_config = ?auth_scheme_endpoint_config, "extracted auth scheme endpoint config"); - - let identity = identity_resolver.resolve_identity(cfg).await?; - trace!(identity = ?identity, "resolved identity"); - - trace!("signing request"); - let request = ctx.request_mut().expect("set during serialization"); - request_signer.sign_request( - request, - &identity, - auth_scheme_endpoint_config, - cfg, - )?; - return Ok(()); + match extract_endpoint_auth_scheme_config(endpoint, scheme_id) { + Ok(auth_scheme_endpoint_config) => { + trace!(auth_scheme_endpoint_config = ?auth_scheme_endpoint_config, "extracted auth scheme endpoint config"); + + let identity = identity_cache + .resolve_cached_identity(identity_resolver, runtime_components, cfg) + .await?; + trace!(identity = ?identity, "resolved identity"); + + trace!("signing request"); + let request = ctx.request_mut().expect("set during serialization"); + signer.sign_http_request( + request, + &identity, + auth_scheme_endpoint_config, + runtime_components, + cfg, + )?; + return Ok(()); + } + Err(AuthOrchestrationError::MissingEndpointConfig) => { + explored.push(scheme_id, ExploreResult::MissingEndpointConfig); + continue; + } + Err(other_err) => return Err(other_err.into()), + } + } else { + explored.push(scheme_id, ExploreResult::NoIdentityResolver); } + } else { + explored.push(scheme_id, ExploreResult::NoAuthScheme); } } - Err(AuthOrchestrationError::NoMatchingAuthScheme.into()) + Err(NoMatchingAuthSchemeError(explored).into()) } fn extract_endpoint_auth_scheme_config( endpoint: &Endpoint, scheme_id: AuthSchemeId, ) -> Result, AuthOrchestrationError> { + // TODO(P96049742): Endpoint config doesn't currently have a concept of optional auth or "no auth", so + // we are short-circuiting lookup of endpoint auth scheme config if that is the selected scheme. + if scheme_id == NO_AUTH_SCHEME_ID { + return Ok(AuthSchemeEndpointConfig::empty()); + } let auth_schemes = match endpoint.properties().get("authSchemes") { Some(Document::Array(schemes)) => schemes, // no auth schemes: - None => return Ok(AuthSchemeEndpointConfig::new(None)), + None => return Ok(AuthSchemeEndpointConfig::empty()), _other => { return Err(AuthOrchestrationError::BadAuthSchemeEndpointConfig( "expected an array for `authSchemes` in endpoint config".into(), @@ -139,55 +210,114 @@ fn extract_endpoint_auth_scheme_config( .and_then(Document::as_string); config_scheme_id == Some(scheme_id.as_str()) }) - .ok_or_else(|| { - AuthOrchestrationError::auth_scheme_endpoint_config_mismatch(auth_schemes.iter()) - })?; - Ok(AuthSchemeEndpointConfig::new(Some(auth_scheme_config))) + .ok_or(AuthOrchestrationError::MissingEndpointConfig)?; + Ok(AuthSchemeEndpointConfig::from(Some(auth_scheme_config))) +} + +#[derive(Debug)] +enum ExploreResult { + NotExplored, + NoAuthScheme, + NoIdentityResolver, + MissingEndpointConfig, +} + +/// Information about an evaluated auth option. +/// This should be kept small so it can fit in an array on the stack. +#[derive(Debug)] +struct ExploredAuthOption { + scheme_id: AuthSchemeId, + result: ExploreResult, } +impl Default for ExploredAuthOption { + fn default() -> Self { + Self { + scheme_id: AuthSchemeId::new(""), + result: ExploreResult::NotExplored, + } + } +} + +const MAX_EXPLORED_LIST_LEN: usize = 8; -#[cfg(test)] +/// Stack allocated list of explored auth options for error messaging +#[derive(Default)] +struct ExploredList { + items: [ExploredAuthOption; MAX_EXPLORED_LIST_LEN], + len: usize, + truncated: bool, +} +impl ExploredList { + fn items(&self) -> impl Iterator { + self.items.iter().take(self.len) + } + + fn push(&mut self, scheme_id: AuthSchemeId, result: ExploreResult) { + if self.len + 1 >= self.items.len() { + self.truncated = true; + } else { + self.items[self.len] = ExploredAuthOption { scheme_id, result }; + self.len += 1; + } + } +} +impl fmt::Debug for ExploredList { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("ExploredList") + .field("items", &&self.items[0..self.len]) + .field("truncated", &self.truncated) + .finish() + } +} + +#[cfg(all(test, feature = "test-util"))] mod tests { use super::*; - use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::auth::option_resolver::StaticAuthOptionResolver; + use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; use aws_smithy_runtime_api::client::auth::{ - AuthOptionResolverParams, AuthSchemeId, DynAuthOptionResolver, HttpAuthScheme, - HttpRequestSigner, SharedHttpAuthScheme, + AuthScheme, AuthSchemeId, AuthSchemeOptionResolverParams, SharedAuthScheme, + SharedAuthSchemeOptionResolver, Sign, }; - use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::identity::{ - Identity, IdentityResolver, IdentityResolvers, SharedIdentityResolver, + Identity, IdentityFuture, ResolveIdentity, SharedIdentityResolver, + }; + use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext}; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_runtime_api::client::runtime_components::{ + GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder, }; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_runtime_api::client::orchestrator::{Future, HttpRequest}; use aws_smithy_types::config_bag::Layer; - use aws_smithy_types::type_erasure::TypedBox; use std::collections::HashMap; #[tokio::test] async fn basic_case() { #[derive(Debug)] struct TestIdentityResolver; - impl IdentityResolver for TestIdentityResolver { - fn resolve_identity(&self, _config_bag: &ConfigBag) -> Future { - Future::ready(Ok(Identity::new("doesntmatter", None))) + impl ResolveIdentity for TestIdentityResolver { + fn resolve_identity<'a>( + &'a self, + _runtime_components: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new("doesntmatter", None))) } } #[derive(Debug)] struct TestSigner; - impl HttpRequestSigner for TestSigner { - fn sign_request( + impl Sign for TestSigner { + fn sign_http_request( &self, request: &mut HttpRequest, _identity: &Identity, _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>, + _runtime_components: &RuntimeComponents, _config_bag: &ConfigBag, ) -> Result<(), BoxError> { request .headers_mut() - .insert(http::header::AUTHORIZATION, "success!".parse().unwrap()); + .insert(http::header::AUTHORIZATION, "success!"); Ok(()) } } @@ -198,46 +328,49 @@ mod tests { struct TestAuthScheme { signer: TestSigner, } - impl HttpAuthScheme for TestAuthScheme { + impl AuthScheme for TestAuthScheme { fn scheme_id(&self) -> AuthSchemeId { TEST_SCHEME_ID } fn identity_resolver( &self, - identity_resolvers: &IdentityResolvers, + identity_resolvers: &dyn GetIdentityResolver, ) -> Option { identity_resolvers.identity_resolver(self.scheme_id()) } - fn request_signer(&self) -> &dyn HttpRequestSigner { + fn signer(&self) -> &dyn Sign { &self.signer } } - let mut ctx = InterceptorContext::new(TypedBox::new("doesnt-matter").erase()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); - let mut layer = Layer::new("test"); - layer.set_auth_option_resolver_params(AuthOptionResolverParams::new("doesntmatter")); - layer.set_auth_option_resolver(DynAuthOptionResolver::new(StaticAuthOptionResolver::new( - vec![TEST_SCHEME_ID], - ))); - layer.push_identity_resolver( - TEST_SCHEME_ID, - SharedIdentityResolver::new(TestIdentityResolver), - ); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(TestAuthScheme { - signer: TestSigner, - })); + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_auth_scheme(SharedAuthScheme::new(TestAuthScheme { signer: TestSigner })) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![TEST_SCHEME_ID]), + ))) + .with_identity_resolver( + TEST_SCHEME_ID, + SharedIdentityResolver::new(TestIdentityResolver), + ) + .build() + .unwrap(); + + let mut layer: Layer = Layer::new("test"); + layer.store_put(AuthSchemeOptionResolverParams::new("doesntmatter")); layer.store_put(Endpoint::builder().url("dontcare").build()); + let cfg = ConfigBag::of_layers(vec![layer]); - let mut cfg = ConfigBag::base(); - cfg.push_layer(layer); - orchestrate_auth(&mut ctx, &cfg).await.expect("success"); + orchestrate_auth(&mut ctx, &runtime_components, &cfg) + .await + .expect("success"); assert_eq!( "success!", @@ -258,35 +391,42 @@ mod tests { }; use aws_smithy_runtime_api::client::identity::http::{Login, Token}; - let mut ctx = InterceptorContext::new(TypedBox::new("doesnt-matter").erase()); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); fn config_with_identity( scheme_id: AuthSchemeId, - identity: impl IdentityResolver + 'static, - ) -> ConfigBag { + identity: impl ResolveIdentity + 'static, + ) -> (RuntimeComponents, ConfigBag) { + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_auth_scheme(SharedAuthScheme::new(BasicAuthScheme::new())) + .with_auth_scheme(SharedAuthScheme::new(BearerAuthScheme::new())) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![ + HTTP_BASIC_AUTH_SCHEME_ID, + HTTP_BEARER_AUTH_SCHEME_ID, + ]), + ))) + .with_identity_resolver(scheme_id, SharedIdentityResolver::new(identity)) + .build() + .unwrap(); + let mut layer = Layer::new("test"); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(BasicAuthScheme::new())); - layer.push_http_auth_scheme(SharedHttpAuthScheme::new(BearerAuthScheme::new())); layer.store_put(Endpoint::builder().url("dontcare").build()); + layer.store_put(AuthSchemeOptionResolverParams::new("doesntmatter")); - layer.set_auth_option_resolver_params(AuthOptionResolverParams::new("doesntmatter")); - layer.set_auth_option_resolver(DynAuthOptionResolver::new( - StaticAuthOptionResolver::new(vec![ - HTTP_BASIC_AUTH_SCHEME_ID, - HTTP_BEARER_AUTH_SCHEME_ID, - ]), - )); - layer.push_identity_resolver(scheme_id, SharedIdentityResolver::new(identity)); - ConfigBag::of_layers(vec![layer]) + (runtime_components, ConfigBag::of_layers(vec![layer])) } // First, test the presence of a basic auth login and absence of a bearer token - let cfg = config_with_identity(HTTP_BASIC_AUTH_SCHEME_ID, Login::new("a", "b", None)); - orchestrate_auth(&mut ctx, &cfg).await.expect("success"); + let (runtime_components, cfg) = + config_with_identity(HTTP_BASIC_AUTH_SCHEME_ID, Login::new("a", "b", None)); + orchestrate_auth(&mut ctx, &runtime_components, &cfg) + .await + .expect("success"); assert_eq!( // "YTpi" == "a:b" in base64 "Basic YTpi", @@ -298,13 +438,16 @@ mod tests { ); // Next, test the presence of a bearer token and absence of basic auth - let cfg = config_with_identity(HTTP_BEARER_AUTH_SCHEME_ID, Token::new("t", None)); - let mut ctx = InterceptorContext::new(TypedBox::new("doesnt-matter").erase()); + let (runtime_components, cfg) = + config_with_identity(HTTP_BEARER_AUTH_SCHEME_ID, Token::new("t", None)); + let mut ctx = InterceptorContext::new(Input::erase("doesnt-matter")); ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); + ctx.set_request(HttpRequest::empty()); let _ = ctx.take_input(); ctx.enter_before_transmit_phase(); - orchestrate_auth(&mut ctx, &cfg).await.expect("success"); + orchestrate_auth(&mut ctx, &runtime_components, &cfg) + .await + .expect("success"); assert_eq!( "Bearer t", ctx.request() @@ -323,7 +466,7 @@ mod tests { .build(); let config = extract_endpoint_auth_scheme_config(&endpoint, "test-scheme-id".into()) .expect("success"); - assert!(config.config().is_none()); + assert!(config.as_document().is_none()); } #[test] @@ -392,7 +535,7 @@ mod tests { assert_eq!( "magic string value", config - .config() + .as_document() .expect("config is set") .as_object() .expect("it's an object") @@ -402,4 +545,153 @@ mod tests { .expect("gimme the string, dammit!") ); } + + #[cfg(feature = "http-auth")] + #[tokio::test] + async fn use_identity_cache() { + use crate::client::auth::http::{ApiKeyAuthScheme, ApiKeyLocation}; + use aws_smithy_runtime_api::client::auth::http::HTTP_API_KEY_AUTH_SCHEME_ID; + use aws_smithy_runtime_api::client::identity::http::Token; + use aws_smithy_types::body::SdkBody; + + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.enter_serialization_phase(); + ctx.set_request( + http::Request::builder() + .body(SdkBody::empty()) + .unwrap() + .try_into() + .unwrap(), + ); + let _ = ctx.take_input(); + ctx.enter_before_transmit_phase(); + + #[derive(Debug)] + struct Cache; + impl ResolveCachedIdentity for Cache { + fn resolve_cached_identity<'a>( + &'a self, + _resolver: SharedIdentityResolver, + _: &'a RuntimeComponents, + _config_bag: &'a ConfigBag, + ) -> IdentityFuture<'a> { + IdentityFuture::ready(Ok(Identity::new(Token::new("cached (pass)", None), None))) + } + } + + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_auth_scheme(SharedAuthScheme::new(ApiKeyAuthScheme::new( + "result:", + ApiKeyLocation::Header, + "Authorization", + ))) + .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![HTTP_API_KEY_AUTH_SCHEME_ID]), + ))) + .with_identity_cache(Some(Cache)) + .with_identity_resolver( + HTTP_API_KEY_AUTH_SCHEME_ID, + SharedIdentityResolver::new(Token::new("uncached (fail)", None)), + ) + .build() + .unwrap(); + let mut layer = Layer::new("test"); + layer.store_put(Endpoint::builder().url("dontcare").build()); + layer.store_put(AuthSchemeOptionResolverParams::new("doesntmatter")); + let config_bag = ConfigBag::of_layers(vec![layer]); + + orchestrate_auth(&mut ctx, &runtime_components, &config_bag) + .await + .expect("success"); + assert_eq!( + "result: cached (pass)", + ctx.request() + .expect("request is set") + .headers() + .get("Authorization") + .unwrap() + ); + } + + #[test] + fn friendly_error_messages() { + let err = NoMatchingAuthSchemeError(ExploredList::default()); + assert_eq!( + "no auth options are available. This can happen if there's a problem with \ + the service model, or if there is a codegen bug.", + err.to_string() + ); + + let mut list = ExploredList::default(); + list.push( + AuthSchemeId::new("SigV4"), + ExploreResult::NoIdentityResolver, + ); + list.push( + AuthSchemeId::new("SigV4a"), + ExploreResult::NoIdentityResolver, + ); + let err = NoMatchingAuthSchemeError(list); + assert_eq!( + "failed to select an auth scheme to sign the request with. \ + \"SigV4\" wasn't a valid option because there was no identity resolver for it. \ + \"SigV4a\" wasn't a valid option because there was no identity resolver for it. \ + Be sure to set an identity, such as credentials, auth token, or other identity \ + type that is required for this service.", + err.to_string() + ); + + // It should prioritize the suggestion to try an identity before saying it's a bug + let mut list = ExploredList::default(); + list.push( + AuthSchemeId::new("SigV4"), + ExploreResult::NoIdentityResolver, + ); + list.push( + AuthSchemeId::new("SigV4a"), + ExploreResult::MissingEndpointConfig, + ); + let err = NoMatchingAuthSchemeError(list); + assert_eq!( + "failed to select an auth scheme to sign the request with. \ + \"SigV4\" wasn't a valid option because there was no identity resolver for it. \ + \"SigV4a\" wasn't a valid option because there is auth config in the endpoint \ + config, but this scheme wasn't listed in it (see \ + https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details). \ + Be sure to set an identity, such as credentials, auth token, or other identity \ + type that is required for this service.", + err.to_string() + ); + + // Otherwise, it should suggest it's a bug + let mut list = ExploredList::default(); + list.push( + AuthSchemeId::new("SigV4a"), + ExploreResult::MissingEndpointConfig, + ); + let err = NoMatchingAuthSchemeError(list); + assert_eq!( + "failed to select an auth scheme to sign the request with. \ + \"SigV4a\" wasn't a valid option because there is auth config in the endpoint \ + config, but this scheme wasn't listed in it (see \ + https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details). \ + This is likely a bug.", + err.to_string() + ); + + // Truncation should be indicated + let mut list = ExploredList::default(); + for _ in 0..=MAX_EXPLORED_LIST_LEN { + list.push( + AuthSchemeId::new("dontcare"), + ExploreResult::MissingEndpointConfig, + ); + } + let err = NoMatchingAuthSchemeError(list).to_string(); + if !err.contains( + "Note: there were other auth schemes that were evaluated that weren't listed here", + ) { + panic!("The error should indicate that the explored list was truncated."); + } + } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs index 394cde080b1..85b70ac5c49 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs @@ -4,45 +4,49 @@ */ use aws_smithy_http::endpoint::error::ResolveEndpointError; -use aws_smithy_http::endpoint::{ - apply_endpoint as apply_endpoint_to_request_uri, EndpointPrefix, ResolveEndpoint, - SharedEndpointResolver, -}; +use aws_smithy_http::endpoint::EndpointPrefix; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; -use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::orchestrator::{ - EndpointResolver, EndpointResolverParams, Future, HttpRequest, +use aws_smithy_runtime_api::client::endpoint::{ + EndpointFuture, EndpointResolverParams, ResolveEndpoint, }; -use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; +use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::endpoint::Endpoint; use http::header::HeaderName; +use http::uri::PathAndQuery; use http::{HeaderValue, Uri}; +use std::borrow::Cow; use std::fmt::Debug; use std::str::FromStr; use tracing::trace; -#[derive(Debug, Clone)] +/// An endpoint resolver that uses a static URI. +#[derive(Clone, Debug)] pub struct StaticUriEndpointResolver { - endpoint: Uri, + endpoint: String, } impl StaticUriEndpointResolver { + /// Create a resolver that resolves to `http://localhost:{port}`. pub fn http_localhost(port: u16) -> Self { Self { - endpoint: Uri::from_str(&format!("http://localhost:{port}")) - .expect("all u16 values are valid ports"), + endpoint: format!("http://localhost:{port}"), } } - pub fn uri(endpoint: Uri) -> Self { - Self { endpoint } + /// Create a resolver that resolves to the given URI. + pub fn uri(endpoint: impl Into) -> Self { + Self { + endpoint: endpoint.into(), + } } } -impl EndpointResolver for StaticUriEndpointResolver { - fn resolve_endpoint(&self, _params: &EndpointResolverParams) -> Future { - Future::ready(Ok(Endpoint::builder() +impl ResolveEndpoint for StaticUriEndpointResolver { + fn resolve_endpoint<'a>(&'a self, _params: &'a EndpointResolverParams) -> EndpointFuture<'a> { + EndpointFuture::ready(Ok(Endpoint::builder() .url(self.endpoint.to_string()) .build())) } @@ -65,54 +69,25 @@ impl From for EndpointResolverParams { } } -#[derive(Debug, Clone)] -pub struct DefaultEndpointResolver { - inner: SharedEndpointResolver, -} - -impl Storable for DefaultEndpointResolver -where - Params: Debug + Send + Sync + 'static, -{ - type Storer = StoreReplace; -} - -impl DefaultEndpointResolver { - pub fn new(resolve_endpoint: SharedEndpointResolver) -> Self { - Self { - inner: resolve_endpoint, - } - } -} - -impl EndpointResolver for DefaultEndpointResolver -where - Params: Debug + Send + Sync + 'static, -{ - fn resolve_endpoint(&self, params: &EndpointResolverParams) -> Future { - let ep = match params.get::() { - Some(params) => self.inner.resolve_endpoint(params).map_err(Box::new), - None => Err(Box::new(ResolveEndpointError::message( - "params of expected type was not present", - ))), - } - .map_err(|e| e as _); - Future::ready(ep) - } -} - pub(super) async fn orchestrate_endpoint( ctx: &mut InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { trace!("orchestrating endpoint resolution"); - let params = cfg.endpoint_resolver_params(); + let params = cfg + .load::() + .expect("endpoint resolver params must be set"); let endpoint_prefix = cfg.load::(); + tracing::debug!(endpoint_params = ?params, endpoint_prefix = ?endpoint_prefix, "resolving endpoint"); let request = ctx.request_mut().expect("set during serialization"); - let endpoint_resolver = cfg.endpoint_resolver(); - let endpoint = endpoint_resolver.resolve_endpoint(params).await?; + let endpoint = runtime_components + .endpoint_resolver() + .resolve_endpoint(params) + .await?; + tracing::debug!("will use endpoint {:?}", endpoint); apply_endpoint(request, &endpoint, endpoint_prefix)?; // Make the endpoint config available to interceptors @@ -125,22 +100,39 @@ fn apply_endpoint( endpoint: &Endpoint, endpoint_prefix: Option<&EndpointPrefix>, ) -> Result<(), BoxError> { - let uri: Uri = endpoint.url().parse().map_err(|err| { - ResolveEndpointError::from_source("endpoint did not have a valid uri", err) - })?; - - apply_endpoint_to_request_uri(request.uri_mut(), &uri, endpoint_prefix).map_err(|err| { - ResolveEndpointError::message(format!( - "failed to apply endpoint `{:?}` to request `{:?}`", - uri, request, - )) - .with_source(Some(err.into())) - })?; + let endpoint_url = match endpoint_prefix { + None => Cow::Borrowed(endpoint.url()), + Some(prefix) => { + let parsed = endpoint.url().parse::()?; + let scheme = parsed.scheme_str().unwrap_or_default(); + let prefix = prefix.as_str(); + let authority = parsed + .authority() + .map(|auth| auth.as_str()) + .unwrap_or_default(); + let path_and_query = parsed + .path_and_query() + .map(PathAndQuery::as_str) + .unwrap_or_default(); + Cow::Owned(format!("{scheme}://{prefix}{authority}{path_and_query}")) + } + }; + + request + .uri_mut() + .set_endpoint(&endpoint_url) + .map_err(|err| { + ResolveEndpointError::message(format!( + "failed to apply endpoint `{}` to request `{:?}`", + endpoint_url, request, + )) + .with_source(Some(err.into())) + })?; for (header_name, header_values) in endpoint.headers() { request.headers_mut().remove(header_name); for value in header_values { - request.headers_mut().insert( + request.headers_mut().append( HeaderName::from_str(header_name).map_err(|err| { ResolveEndpointError::message("invalid header name") .with_source(Some(err.into())) @@ -154,3 +146,23 @@ fn apply_endpoint( } Ok(()) } + +#[cfg(test)] +mod test { + use aws_smithy_http::endpoint::EndpointPrefix; + use aws_smithy_runtime_api::client::orchestrator::HttpRequest; + use aws_smithy_types::endpoint::Endpoint; + + #[test] + fn test_apply_endpoint() { + let mut req = HttpRequest::empty(); + req.set_uri("/foo?bar=1").unwrap(); + let endpoint = Endpoint::builder().url("https://s3.amazon.com").build(); + let prefix = EndpointPrefix::new("prefix.subdomain.").unwrap(); + super::apply_endpoint(&mut req, &endpoint, Some(&prefix)).expect("should succeed"); + assert_eq!( + req.uri(), + "https://prefix.subdomain.s3.amazon.com/foo?bar=1" + ); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs index 247464a7bdb..a34bb3d2324 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs @@ -3,11 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_http::body::SdkBody; -use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, SensitiveOutput}; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::config_bag::ConfigBag; use bytes::{Buf, Bytes}; -use http_body::Body; +use http_body_0_4::Body; use pin_utils::pin_mut; +use tracing::trace; + +const LOG_SENSITIVE_BODIES: &str = "LOG_SENSITIVE_BODIES"; async fn body_to_bytes(body: SdkBody) -> Result::Error> { let mut output = Vec::new(); @@ -33,3 +37,18 @@ pub(crate) async fn read_body(response: &mut HttpResponse) -> Result<(), ().is_none() + || std::env::var(LOG_SENSITIVE_BODIES) + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or_default() + { + trace!(response = ?response, "read HTTP response body"); + } else { + trace!( + response = "** REDACTED **. To print, set LOG_SENSITIVE_BODIES=true", + "read HTTP response body" + ) + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs new file mode 100644 index 00000000000..bd875c72e69 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs @@ -0,0 +1,509 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::client::auth::no_auth::{NoAuthScheme, NO_AUTH_SCHEME_ID}; +use crate::client::defaults::{default_plugins, DefaultPluginParams}; +use crate::client::http::connection_poisoning::ConnectionPoisoningInterceptor; +use crate::client::identity::no_auth::NoAuthIdentityResolver; +use crate::client::identity::IdentityCache; +use crate::client::orchestrator::endpoints::StaticUriEndpointResolver; +use crate::client::retries::strategy::{NeverRetryStrategy, StandardRetryStrategy}; +use aws_smithy_async::rt::sleep::AsyncSleep; +use aws_smithy_async::time::TimeSource; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; +use aws_smithy_runtime_api::client::auth::{ + AuthSchemeOptionResolverParams, SharedAuthScheme, SharedAuthSchemeOptionResolver, +}; +use aws_smithy_runtime_api::client::endpoint::{EndpointResolverParams, SharedEndpointResolver}; +use aws_smithy_runtime_api::client::http::HttpClient; +use aws_smithy_runtime_api::client::identity::SharedIdentityResolver; +use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, Output}; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, OrchestratorError}; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry; +use aws_smithy_runtime_api::client::retries::SharedRetryStrategy; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_plugin::{ + RuntimePlugin, RuntimePlugins, SharedRuntimePlugin, StaticRuntimePlugin, +}; +use aws_smithy_runtime_api::client::ser_de::{ + DeserializeResponse, SerializeRequest, SharedRequestSerializer, SharedResponseDeserializer, +}; +use aws_smithy_runtime_api::shared::IntoShared; +use aws_smithy_types::config_bag::{ConfigBag, Layer}; +use aws_smithy_types::retry::RetryConfig; +use aws_smithy_types::timeout::TimeoutConfig; +use std::borrow::Cow; +use std::fmt; +use std::marker::PhantomData; + +struct FnSerializer { + f: F, + _phantom: PhantomData, +} +impl FnSerializer { + fn new(f: F) -> Self { + Self { + f, + _phantom: Default::default(), + } + } +} +impl SerializeRequest for FnSerializer +where + F: Fn(I) -> Result + Send + Sync, + I: fmt::Debug + Send + Sync + 'static, +{ + fn serialize_input(&self, input: Input, _cfg: &mut ConfigBag) -> Result { + let input: I = input.downcast().expect("correct type"); + (self.f)(input) + } +} +impl fmt::Debug for FnSerializer { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "FnSerializer") + } +} + +struct FnDeserializer { + f: F, + _phantom: PhantomData<(O, E)>, +} +impl FnDeserializer { + fn new(deserializer: F) -> Self { + Self { + f: deserializer, + _phantom: Default::default(), + } + } +} +impl DeserializeResponse for FnDeserializer +where + F: Fn(&HttpResponse) -> Result> + Send + Sync, + O: fmt::Debug + Send + Sync + 'static, + E: std::error::Error + fmt::Debug + Send + Sync + 'static, +{ + fn deserialize_nonstreaming( + &self, + response: &HttpResponse, + ) -> Result> { + (self.f)(response) + .map(|output| Output::erase(output)) + .map_err(|err| err.map_operation_error(Error::erase)) + } +} +impl fmt::Debug for FnDeserializer { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "FnDeserializer") + } +} + +/// Orchestrates execution of a HTTP request without any modeled input or output. +#[derive(Debug)] +pub struct Operation { + service_name: Cow<'static, str>, + operation_name: Cow<'static, str>, + runtime_plugins: RuntimePlugins, + _phantom: PhantomData<(I, O, E)>, +} + +// Manual Clone implementation needed to get rid of Clone bounds on I, O, and E +impl Clone for Operation { + fn clone(&self) -> Self { + Self { + service_name: self.service_name.clone(), + operation_name: self.operation_name.clone(), + runtime_plugins: self.runtime_plugins.clone(), + _phantom: self._phantom, + } + } +} + +impl Operation<(), (), ()> { + /// Returns a new `OperationBuilder` for the `Operation`. + pub fn builder() -> OperationBuilder { + OperationBuilder::new() + } +} + +impl Operation +where + I: fmt::Debug + Send + Sync + 'static, + O: fmt::Debug + Send + Sync + 'static, + E: std::error::Error + fmt::Debug + Send + Sync + 'static, +{ + /// Invokes this `Operation` with the given `input` and returns either an output for success + /// or an [`SdkError`] for failure + pub async fn invoke(&self, input: I) -> Result> { + let input = Input::erase(input); + + let output = super::invoke( + &self.service_name, + &self.operation_name, + input, + &self.runtime_plugins, + ) + .await + .map_err(|err| err.map_service_error(|e| e.downcast().expect("correct type")))?; + + Ok(output.downcast().expect("correct type")) + } +} + +/// Builder for [`Operation`]. +#[derive(Debug)] +pub struct OperationBuilder { + service_name: Option>, + operation_name: Option>, + config: Layer, + runtime_components: RuntimeComponentsBuilder, + runtime_plugins: Vec, + _phantom: PhantomData<(I, O, E)>, +} + +impl Default for OperationBuilder<(), (), ()> { + fn default() -> Self { + Self::new() + } +} + +impl OperationBuilder<(), (), ()> { + /// Creates a new [`OperationBuilder`]. + pub fn new() -> Self { + Self { + service_name: None, + operation_name: None, + config: Layer::new("operation"), + runtime_components: RuntimeComponentsBuilder::new("operation"), + runtime_plugins: Vec::new(), + _phantom: Default::default(), + } + } +} + +impl OperationBuilder { + /// Configures the service name for the builder. + pub fn service_name(mut self, service_name: impl Into>) -> Self { + self.service_name = Some(service_name.into()); + self + } + + /// Configures the operation name for the builder. + pub fn operation_name(mut self, operation_name: impl Into>) -> Self { + self.operation_name = Some(operation_name.into()); + self + } + + /// Configures the http client for the builder. + pub fn http_client(mut self, connector: impl HttpClient + 'static) -> Self { + self.runtime_components.set_http_client(Some(connector)); + self + } + + /// Configures the endpoint URL for the builder. + pub fn endpoint_url(mut self, url: &str) -> Self { + self.config.store_put(EndpointResolverParams::new(())); + self.runtime_components + .set_endpoint_resolver(Some(SharedEndpointResolver::new( + StaticUriEndpointResolver::uri(url), + ))); + self + } + + /// Configures the retry classifier for the builder. + pub fn retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self { + self.runtime_components + .push_retry_classifier(retry_classifier); + self + } + + /// Disables the retry for the operation. + pub fn no_retry(mut self) -> Self { + self.runtime_components + .set_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new()))); + self + } + + /// Configures the standard retry for the builder. + pub fn standard_retry(mut self, retry_config: &RetryConfig) -> Self { + self.config.store_put(retry_config.clone()); + self.runtime_components + .set_retry_strategy(Some(SharedRetryStrategy::new(StandardRetryStrategy::new()))); + self + } + + /// Configures the timeout configuration for the builder. + pub fn timeout_config(mut self, timeout_config: TimeoutConfig) -> Self { + self.config.store_put(timeout_config); + self + } + + /// Disables auth for the operation. + pub fn no_auth(mut self) -> Self { + self.config + .store_put(AuthSchemeOptionResolverParams::new(())); + self.runtime_components + .set_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new( + StaticAuthSchemeOptionResolver::new(vec![NO_AUTH_SCHEME_ID]), + ))); + self.runtime_components + .push_auth_scheme(SharedAuthScheme::new(NoAuthScheme::default())); + self.runtime_components + .set_identity_cache(Some(IdentityCache::no_cache())); + self.runtime_components.set_identity_resolver( + NO_AUTH_SCHEME_ID, + SharedIdentityResolver::new(NoAuthIdentityResolver::new()), + ); + self + } + + /// Configures the sleep for the builder. + pub fn sleep_impl(mut self, async_sleep: impl AsyncSleep + 'static) -> Self { + self.runtime_components + .set_sleep_impl(Some(async_sleep.into_shared())); + self + } + + /// Configures the time source for the builder. + pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self { + self.runtime_components + .set_time_source(Some(time_source.into_shared())); + self + } + + /// Configures the interceptor for the builder. + pub fn interceptor(mut self, interceptor: impl Intercept + 'static) -> Self { + self.runtime_components.push_interceptor(interceptor); + self + } + + /// Registers the [`ConnectionPoisoningInterceptor`]. + pub fn with_connection_poisoning(self) -> Self { + self.interceptor(ConnectionPoisoningInterceptor::new()) + } + + /// Configures the runtime plugin for the builder. + pub fn runtime_plugin(mut self, runtime_plugin: impl RuntimePlugin + 'static) -> Self { + self.runtime_plugins.push(runtime_plugin.into_shared()); + self + } + + /// Configures the serializer for the builder. + pub fn serializer( + mut self, + serializer: impl Fn(I2) -> Result + Send + Sync + 'static, + ) -> OperationBuilder + where + I2: fmt::Debug + Send + Sync + 'static, + { + self.config + .store_put(SharedRequestSerializer::new(FnSerializer::new(serializer))); + OperationBuilder { + service_name: self.service_name, + operation_name: self.operation_name, + config: self.config, + runtime_components: self.runtime_components, + runtime_plugins: self.runtime_plugins, + _phantom: Default::default(), + } + } + + /// Configures the deserializer for the builder. + pub fn deserializer( + mut self, + deserializer: impl Fn(&HttpResponse) -> Result> + + Send + + Sync + + 'static, + ) -> OperationBuilder + where + O2: fmt::Debug + Send + Sync + 'static, + E2: std::error::Error + fmt::Debug + Send + Sync + 'static, + { + self.config + .store_put(SharedResponseDeserializer::new(FnDeserializer::new( + deserializer, + ))); + OperationBuilder { + service_name: self.service_name, + operation_name: self.operation_name, + config: self.config, + runtime_components: self.runtime_components, + runtime_plugins: self.runtime_plugins, + _phantom: Default::default(), + } + } + + /// Creates an `Operation` from the builder. + pub fn build(self) -> Operation { + let service_name = self.service_name.expect("service_name required"); + let operation_name = self.operation_name.expect("operation_name required"); + + let mut runtime_plugins = RuntimePlugins::new() + .with_client_plugins(default_plugins( + DefaultPluginParams::new().with_retry_partition_name(service_name.clone()), + )) + .with_client_plugin( + StaticRuntimePlugin::new() + .with_config(self.config.freeze()) + .with_runtime_components(self.runtime_components), + ); + for runtime_plugin in self.runtime_plugins { + runtime_plugins = runtime_plugins.with_client_plugin(runtime_plugin); + } + + #[cfg(debug_assertions)] + { + let mut config = ConfigBag::base(); + let components = runtime_plugins + .apply_client_configuration(&mut config) + .expect("the runtime plugins should succeed"); + + assert!( + components.http_client().is_some(), + "a http_client is required. Enable the `rustls` crate feature or configure a HTTP client to fix this." + ); + assert!( + components.endpoint_resolver().is_some(), + "a endpoint_resolver is required" + ); + assert!( + components.retry_strategy().is_some(), + "a retry_strategy is required" + ); + assert!( + config.load::().is_some(), + "a serializer is required" + ); + assert!( + config.load::().is_some(), + "a deserializer is required" + ); + assert!( + config.load::().is_some(), + "endpoint resolver params are required" + ); + assert!( + config.load::().is_some(), + "timeout config is required" + ); + } + + Operation { + service_name, + operation_name, + runtime_plugins, + _phantom: Default::default(), + } + } +} + +#[cfg(all(test, feature = "test-util"))] +mod tests { + use super::*; + use crate::client::http::test_util::{capture_request, ReplayEvent, StaticReplayClient}; + use crate::client::retries::classifiers::HttpStatusCodeClassifier; + use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep}; + use aws_smithy_runtime_api::client::result::ConnectorError; + use aws_smithy_types::body::SdkBody; + use std::convert::Infallible; + + #[tokio::test] + async fn operation() { + let (connector, request_rx) = capture_request(Some( + http::Response::builder() + .status(418) + .body(SdkBody::from(&b"I'm a teapot!"[..])) + .unwrap(), + )); + let operation = Operation::builder() + .service_name("test") + .operation_name("test") + .http_client(connector) + .endpoint_url("http://localhost:1234") + .no_auth() + .no_retry() + .timeout_config(TimeoutConfig::disabled()) + .serializer(|input: String| Ok(HttpRequest::new(SdkBody::from(input.as_bytes())))) + .deserializer::<_, Infallible>(|response| { + assert_eq!(418, u16::from(response.status())); + Ok(std::str::from_utf8(response.body().bytes().unwrap()) + .unwrap() + .to_string()) + }) + .build(); + + let output = operation + .invoke("what are you?".to_string()) + .await + .expect("success"); + assert_eq!("I'm a teapot!", output); + + let request = request_rx.expect_request(); + assert_eq!("http://localhost:1234/", request.uri()); + assert_eq!(b"what are you?", request.body().bytes().unwrap()); + } + + #[tokio::test] + async fn operation_retries() { + let connector = StaticReplayClient::new(vec![ + ReplayEvent::new( + http::Request::builder() + .uri("http://localhost:1234/") + .body(SdkBody::from(&b"what are you?"[..])) + .unwrap(), + http::Response::builder() + .status(503) + .body(SdkBody::from(&b""[..])) + .unwrap(), + ), + ReplayEvent::new( + http::Request::builder() + .uri("http://localhost:1234/") + .body(SdkBody::from(&b"what are you?"[..])) + .unwrap(), + http::Response::builder() + .status(418) + .body(SdkBody::from(&b"I'm a teapot!"[..])) + .unwrap(), + ), + ]); + let operation = Operation::builder() + .service_name("test") + .operation_name("test") + .http_client(connector.clone()) + .endpoint_url("http://localhost:1234") + .no_auth() + .standard_retry(&RetryConfig::standard()) + .retry_classifier(HttpStatusCodeClassifier::default()) + .timeout_config(TimeoutConfig::disabled()) + .sleep_impl(SharedAsyncSleep::new(TokioSleep::new())) + .serializer(|input: String| Ok(HttpRequest::new(SdkBody::from(input.as_bytes())))) + .deserializer::<_, Infallible>(|response| { + if u16::from(response.status()) == 503 { + Err(OrchestratorError::connector(ConnectorError::io( + "test".into(), + ))) + } else { + assert_eq!(418, u16::from(response.status())); + Ok(std::str::from_utf8(response.body().bytes().unwrap()) + .unwrap() + .to_string()) + } + }) + .build(); + + let output = operation + .invoke("what are you?".to_string()) + .await + .expect("success"); + assert_eq!("I'm a teapot!", output); + + connector.assert_requests_match(&[]); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries.rs b/rust-runtime/aws-smithy-runtime/src/client/retries.rs index 893c5f0163e..95a901a1275 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries.rs @@ -3,38 +3,41 @@ * SPDX-License-Identifier: Apache-2.0 */ -pub mod classifier; +/// Smithy retry classifiers. +pub mod classifiers; + +/// Smithy retry strategies. pub mod strategy; mod client_rate_limiter; mod token_bucket; use aws_smithy_types::config_bag::{Storable, StoreReplace}; -pub use client_rate_limiter::{ClientRateLimiter, ClientRateLimiterRuntimePlugin}; use std::fmt; -pub use token_bucket::{TokenBucket, TokenBucketRuntimePlugin}; -#[doc(hidden)] +pub use client_rate_limiter::ClientRateLimiter; +pub use token_bucket::TokenBucket; + pub use client_rate_limiter::ClientRateLimiterPartition; -#[doc(hidden)] -pub use token_bucket::TokenBucketPartition; +use std::borrow::Cow; -#[doc(hidden)] +/// Represents the retry partition, e.g. an endpoint, a region #[non_exhaustive] #[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct RetryPartition { - inner: &'static str, + name: Cow<'static, str>, } impl RetryPartition { - pub fn new(name: &'static str) -> Self { - Self { inner: name } + /// Creates a new `RetryPartition` from the given `name`. + pub fn new(name: impl Into>) -> Self { + Self { name: name.into() } } } impl fmt::Display for RetryPartition { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.inner) + f.write_str(&self.name) } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs deleted file mode 100644 index 86bbdde0f61..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/classifier.rs +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; -use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; -use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; -use std::borrow::Cow; -use std::error::Error as StdError; -use std::marker::PhantomData; - -/// A retry classifier for checking if an error is modeled as retryable. -#[derive(Debug, Default)] -pub struct ModeledAsRetryableClassifier { - _inner: PhantomData, -} - -impl ModeledAsRetryableClassifier { - /// Create a new `ModeledAsRetryableClassifier` - pub fn new() -> Self { - Self { - _inner: PhantomData, - } - } -} - -impl ClassifyRetry for ModeledAsRetryableClassifier -where - E: StdError + ProvideErrorKind + Send + Sync + 'static, -{ - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - // Check for a result - let output_or_error = ctx.output_or_error()?; - // Check for an error - let error = match output_or_error { - Ok(_) => return None, - Err(err) => err, - }; - // Check that the error is an operation error - let error = error.as_operation_error()?; - // Downcast the error - let error = error.downcast_ref::()?; - // Check if the error is retryable - error.retryable_error_kind().map(RetryReason::Error) - } - - fn name(&self) -> &'static str { - "Errors Modeled As Retryable" - } -} - -#[derive(Debug, Default)] -pub struct SmithyErrorClassifier { - _inner: PhantomData, -} - -impl SmithyErrorClassifier { - /// Create a new `SmithyErrorClassifier` - pub fn new() -> Self { - Self { - _inner: PhantomData, - } - } -} - -impl ClassifyRetry for SmithyErrorClassifier -where - E: StdError + Send + Sync + 'static, -{ - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - let output_or_error = ctx.output_or_error()?; - // Check for an error - let error = match output_or_error { - Ok(_) => return None, - Err(err) => err, - }; - - match error { - OrchestratorError::Response { .. } | OrchestratorError::Timeout { .. } => { - Some(RetryReason::Error(ErrorKind::TransientError)) - } - OrchestratorError::Connector { err } if err.is_timeout() || err.is_io() => { - Some(RetryReason::Error(ErrorKind::TransientError)) - } - OrchestratorError::Connector { err } if err.is_other().is_some() => { - err.is_other().map(RetryReason::Error) - } - _ => None, - } - } - - fn name(&self) -> &'static str { - "Retryable Smithy Errors" - } -} - -const TRANSIENT_ERROR_STATUS_CODES: &[u16] = &[500, 502, 503, 504]; - -/// A retry classifier that will treat HTTP response with those status codes as retryable. -/// The `Default` version will retry 500, 502, 503, and 504 errors. -#[derive(Debug)] -pub struct HttpStatusCodeClassifier { - retryable_status_codes: Cow<'static, [u16]>, -} - -impl Default for HttpStatusCodeClassifier { - fn default() -> Self { - Self::new_from_codes(TRANSIENT_ERROR_STATUS_CODES.to_owned()) - } -} - -impl HttpStatusCodeClassifier { - /// Given a `Vec` where the `u16`s represent status codes, create a `HttpStatusCodeClassifier` - /// that will treat HTTP response with those status codes as retryable. The `Default` version - /// will retry 500, 502, 503, and 504 errors. - pub fn new_from_codes(retryable_status_codes: impl Into>) -> Self { - Self { - retryable_status_codes: retryable_status_codes.into(), - } - } -} - -impl ClassifyRetry for HttpStatusCodeClassifier { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - ctx.response() - .map(|res| res.status().as_u16()) - .map(|status| self.retryable_status_codes.contains(&status)) - .unwrap_or_default() - .then_some(RetryReason::Error(ErrorKind::TransientError)) - } - - fn name(&self) -> &'static str { - "HTTP Status Code" - } -} - -// Generic smithy clients would have something like this: -// pub fn default_retry_classifiers() -> RetryClassifiers { -// RetryClassifiers::new() -// .with_classifier(SmithyErrorClassifier::new()) -// .with_classifier(ModeledAsRetryableClassifier::new()) -// .with_classifier(HttpStatusCodeClassifier::new()) -// } -// This ordering is different than the default AWS ordering because the old generic client classifier -// was the same. - -#[cfg(test)] -mod test { - use crate::client::retries::classifier::{ - HttpStatusCodeClassifier, ModeledAsRetryableClassifier, - }; - use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; - use aws_smithy_runtime_api::client::retries::{ClassifyRetry, RetryReason}; - use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; - use aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError}; - use std::fmt; - - use super::SmithyErrorClassifier; - - #[derive(Debug, PartialEq, Eq, Clone)] - struct UnmodeledError; - - impl fmt::Display for UnmodeledError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "UnmodeledError") - } - } - - impl std::error::Error for UnmodeledError {} - - #[test] - fn classify_by_response_status() { - let policy = HttpStatusCodeClassifier::default(); - let res = http::Response::builder() - .status(500) - .body("error!") - .unwrap() - .map(SdkBody::from); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_response(res); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::TransientError)) - ); - } - - #[test] - fn classify_by_response_status_not_retryable() { - let policy = HttpStatusCodeClassifier::default(); - let res = http::Response::builder() - .status(408) - .body("error!") - .unwrap() - .map(SdkBody::from); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_response(res); - assert_eq!(policy.classify_retry(&ctx), None); - } - - #[test] - fn classify_by_error_kind() { - #[derive(Debug)] - struct RetryableError; - - impl fmt::Display for RetryableError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "Some retryable error") - } - } - - impl ProvideErrorKind for RetryableError { - fn retryable_error_kind(&self) -> Option { - Some(ErrorKind::ClientError) - } - - fn code(&self) -> Option<&str> { - // code should not be called when `error_kind` is provided - unimplemented!() - } - } - - impl std::error::Error for RetryableError {} - - let policy = ModeledAsRetryableClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_output_or_error(Err(OrchestratorError::operation(TypeErasedError::new( - RetryableError, - )))); - - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::ClientError)), - ); - } - - #[test] - fn classify_response_error() { - let policy = SmithyErrorClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_output_or_error(Err(OrchestratorError::response( - "I am a response error".into(), - ))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::TransientError)), - ); - } - - #[test] - fn test_timeout_error() { - let policy = SmithyErrorClassifier::::new(); - let mut ctx = InterceptorContext::new(TypeErasedBox::new("doesntmatter")); - ctx.set_output_or_error(Err(OrchestratorError::timeout( - "I am a timeout error".into(), - ))); - assert_eq!( - policy.classify_retry(&ctx), - Some(RetryReason::Error(ErrorKind::TransientError)), - ); - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs new file mode 100644 index 00000000000..1fe826ec305 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs @@ -0,0 +1,319 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; +use aws_smithy_runtime_api::client::retries::classifiers::{ + ClassifyRetry, RetryAction, RetryClassifierPriority, SharedRetryClassifier, +}; +use aws_smithy_types::retry::ProvideErrorKind; +use std::borrow::Cow; +use std::error::Error as StdError; +use std::marker::PhantomData; + +/// A retry classifier for checking if an error is modeled as retryable. +#[derive(Debug, Default)] +pub struct ModeledAsRetryableClassifier { + _inner: PhantomData, +} + +impl ModeledAsRetryableClassifier { + /// Create a new `ModeledAsRetryableClassifier` + pub fn new() -> Self { + Self { + _inner: PhantomData, + } + } + + /// Return the priority of this retry classifier. + pub fn priority() -> RetryClassifierPriority { + RetryClassifierPriority::modeled_as_retryable_classifier() + } +} + +impl ClassifyRetry for ModeledAsRetryableClassifier +where + E: StdError + ProvideErrorKind + Send + Sync + 'static, +{ + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + // Check that the error is an operation error + error + .as_operation_error() + // Downcast the error + .and_then(|err| err.downcast_ref::()) + // Check if the error is retryable + .and_then(|err| err.retryable_error_kind().map(RetryAction::retryable_error)) + .unwrap_or_default() + } + + fn name(&self) -> &'static str { + "Errors Modeled As Retryable" + } + + fn priority(&self) -> RetryClassifierPriority { + Self::priority() + } +} + +/// Classifies response, timeout, and connector errors as retryable or not. +#[derive(Debug, Default)] +pub struct TransientErrorClassifier { + _inner: PhantomData, +} + +impl TransientErrorClassifier { + /// Create a new `TransientErrorClassifier` + pub fn new() -> Self { + Self { + _inner: PhantomData, + } + } + + /// Return the priority of this retry classifier. + pub fn priority() -> RetryClassifierPriority { + RetryClassifierPriority::transient_error_classifier() + } +} + +impl ClassifyRetry for TransientErrorClassifier +where + E: StdError + Send + Sync + 'static, +{ + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + if error.is_response_error() || error.is_timeout_error() { + RetryAction::transient_error() + } else if let Some(error) = error.as_connector_error() { + if error.is_timeout() || error.is_io() { + RetryAction::transient_error() + } else { + error + .as_other() + .map(RetryAction::retryable_error) + .unwrap_or_default() + } + } else { + RetryAction::NoActionIndicated + } + } + + fn name(&self) -> &'static str { + "Retryable Smithy Errors" + } + + fn priority(&self) -> RetryClassifierPriority { + Self::priority() + } +} + +const TRANSIENT_ERROR_STATUS_CODES: &[u16] = &[500, 502, 503, 504]; + +/// A retry classifier that will treat HTTP response with those status codes as retryable. +/// The `Default` version will retry 500, 502, 503, and 504 errors. +#[derive(Debug)] +pub struct HttpStatusCodeClassifier { + retryable_status_codes: Cow<'static, [u16]>, +} + +impl Default for HttpStatusCodeClassifier { + fn default() -> Self { + Self::new_from_codes(TRANSIENT_ERROR_STATUS_CODES.to_owned()) + } +} + +impl HttpStatusCodeClassifier { + /// Given a `Vec` where the `u16`s represent status codes, create a `HttpStatusCodeClassifier` + /// that will treat HTTP response with those status codes as retryable. The `Default` version + /// will retry 500, 502, 503, and 504 errors. + pub fn new_from_codes(retryable_status_codes: impl Into>) -> Self { + Self { + retryable_status_codes: retryable_status_codes.into(), + } + } + + /// Return the priority of this retry classifier. + pub fn priority() -> RetryClassifierPriority { + RetryClassifierPriority::http_status_code_classifier() + } +} + +impl ClassifyRetry for HttpStatusCodeClassifier { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + let is_retryable = ctx + .response() + .map(|res| res.status().into()) + .map(|status| self.retryable_status_codes.contains(&status)) + .unwrap_or_default(); + + if is_retryable { + RetryAction::transient_error() + } else { + RetryAction::NoActionIndicated + } + } + + fn name(&self) -> &'static str { + "HTTP Status Code" + } + + fn priority(&self) -> RetryClassifierPriority { + Self::priority() + } +} + +/// Given an iterator of retry classifiers and an interceptor context, run retry classifiers on the +/// context. Each classifier is passed the classification result from the previous classifier (the +/// 'root' classifier is passed `None`.) +pub fn run_classifiers_on_ctx( + classifiers: impl Iterator, + ctx: &InterceptorContext, +) -> RetryAction { + // By default, don't retry + let mut result = RetryAction::NoActionIndicated; + + for classifier in classifiers { + let new_result = classifier.classify_retry(ctx); + + // If the result is `NoActionIndicated`, continue to the next classifier + // without overriding any previously-set result. + if new_result == RetryAction::NoActionIndicated { + continue; + } + + // Otherwise, set the result to the new result. + tracing::trace!( + "Classifier '{}' set the result of classification to '{}'", + classifier.name(), + new_result + ); + result = new_result; + + // If the result is `RetryForbidden`, stop running classifiers. + if result == RetryAction::RetryForbidden { + tracing::trace!("retry classification ending early because a `RetryAction::RetryForbidden` was emitted",); + break; + } + } + + result +} + +#[cfg(test)] +mod test { + use crate::client::retries::classifiers::{ + HttpStatusCodeClassifier, ModeledAsRetryableClassifier, + }; + use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext}; + use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; + use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; + use aws_smithy_types::body::SdkBody; + use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; + use std::fmt; + + use super::TransientErrorClassifier; + + #[derive(Debug, PartialEq, Eq, Clone)] + struct UnmodeledError; + + impl fmt::Display for UnmodeledError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "UnmodeledError") + } + } + + impl std::error::Error for UnmodeledError {} + + #[test] + fn classify_by_response_status() { + let policy = HttpStatusCodeClassifier::default(); + let res = http::Response::builder() + .status(500) + .body("error!") + .unwrap() + .map(SdkBody::from); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_response(res.try_into().unwrap()); + assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error()); + } + + #[test] + fn classify_by_response_status_not_retryable() { + let policy = HttpStatusCodeClassifier::default(); + let res = http::Response::builder() + .status(408) + .body("error!") + .unwrap() + .map(SdkBody::from); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_response(res.try_into().unwrap()); + assert_eq!(policy.classify_retry(&ctx), RetryAction::NoActionIndicated); + } + + #[test] + fn classify_by_error_kind() { + #[derive(Debug)] + struct RetryableError; + + impl fmt::Display for RetryableError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Some retryable error") + } + } + + impl ProvideErrorKind for RetryableError { + fn retryable_error_kind(&self) -> Option { + Some(ErrorKind::ClientError) + } + + fn code(&self) -> Option<&str> { + // code should not be called when `error_kind` is provided + unimplemented!() + } + } + + impl std::error::Error for RetryableError {} + + let policy = ModeledAsRetryableClassifier::::new(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase( + RetryableError, + )))); + + assert_eq!(policy.classify_retry(&ctx), RetryAction::client_error(),); + } + + #[test] + fn classify_response_error() { + let policy = TransientErrorClassifier::::new(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::response( + "I am a response error".into(), + ))); + assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error(),); + } + + #[test] + fn test_timeout_error() { + let policy = TransientErrorClassifier::::new(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); + ctx.set_output_or_error(Err(OrchestratorError::timeout( + "I am a timeout error".into(), + ))); + assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error(),); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs index 69f36272ab0..80efa6a81db 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs @@ -9,38 +9,11 @@ #![allow(dead_code)] use crate::client::retries::RetryPartition; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_runtime_api::{builder, builder_methods, builder_struct}; -use aws_smithy_types::config_bag::{FrozenLayer, Layer, Storable, StoreReplace}; use std::sync::{Arc, Mutex}; use std::time::Duration; use tracing::debug; -/// A [RuntimePlugin] to provide a client rate limiter, usable by a retry strategy. -#[non_exhaustive] -#[derive(Debug)] -pub struct ClientRateLimiterRuntimePlugin { - rate_limiter: ClientRateLimiter, -} - -impl ClientRateLimiterRuntimePlugin { - pub fn new(seconds_since_unix_epoch: f64) -> Self { - Self { - rate_limiter: ClientRateLimiter::new(seconds_since_unix_epoch), - } - } -} - -impl RuntimePlugin for ClientRateLimiterRuntimePlugin { - fn config(&self) -> Option { - let mut cfg = Layer::new("client rate limiter"); - cfg.store_put(self.rate_limiter.clone()); - - Some(cfg.freeze()) - } -} - -#[doc(hidden)] +/// Represents a partition for the rate limiter, e.g. an endpoint, a region #[non_exhaustive] #[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct ClientRateLimiterPartition { @@ -48,6 +21,7 @@ pub struct ClientRateLimiterPartition { } impl ClientRateLimiterPartition { + /// Creates a `ClientRateLimiterPartition` from the given [`RetryPartition`] pub fn new(retry_partition: RetryPartition) -> Self { Self { retry_partition } } @@ -65,6 +39,7 @@ const BETA: f64 = 0.7; /// Controls how aggressively we scale up after being throttled const SCALE_CONSTANT: f64 = 0.4; +/// Rate limiter for adaptive retry. #[derive(Clone, Debug)] pub struct ClientRateLimiter { inner: Arc>, @@ -102,11 +77,8 @@ pub(crate) enum RequestReason { InitialRequest, } -impl Storable for ClientRateLimiter { - type Storer = StoreReplace; -} - impl ClientRateLimiter { + /// Creates a new `ClientRateLimiter` pub fn new(seconds_since_unix_epoch: f64) -> Self { Self::builder() .tokens_retrieved_per_second(MIN_FILL_RATE) @@ -259,20 +231,146 @@ fn cubic_throttle(rate_to_use: f64) -> f64 { rate_to_use * BETA } -builder!( - set_token_refill_rate, token_refill_rate, f64, "The rate at which token are replenished.", - set_maximum_bucket_capacity, maximum_bucket_capacity, f64, "The maximum capacity allowed in the token bucket.", - set_current_bucket_capacity, current_bucket_capacity, f64, "The current capacity of the token bucket. The minimum this can be is 1.0", - set_time_of_last_refill, time_of_last_refill, f64, "The last time the token bucket was refilled.", - set_tokens_retrieved_per_second, tokens_retrieved_per_second, f64, "The smoothed rate which tokens are being retrieved.", - set_previous_time_bucket, previous_time_bucket, f64, "The last half second time bucket used.", - set_request_count, request_count, u64, "The number of requests seen within the current time bucket.", - set_enable_throttling, enable_throttling, bool, "Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled.", - set_tokens_retrieved_per_second_at_time_of_last_throttle, tokens_retrieved_per_second_at_time_of_last_throttle, f64, "The maximum rate when the client was last throttled.", - set_time_of_last_throttle, time_of_last_throttle, f64, "The last time when the client was throttled." -); +#[derive(Clone, Debug, Default)] +struct Builder { + ///The rate at which token are replenished. + token_refill_rate: Option, + ///The maximum capacity allowed in the token bucket. + maximum_bucket_capacity: Option, + ///The current capacity of the token bucket. The minimum this can be is 1.0 + current_bucket_capacity: Option, + ///The last time the token bucket was refilled. + time_of_last_refill: Option, + ///The smoothed rate which tokens are being retrieved. + tokens_retrieved_per_second: Option, + ///The last half second time bucket used. + previous_time_bucket: Option, + ///The number of requests seen within the current time bucket. + request_count: Option, + ///Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled. + enable_throttling: Option, + ///The maximum rate when the client was last throttled. + tokens_retrieved_per_second_at_time_of_last_throttle: Option, + ///The last time when the client was throttled. + time_of_last_throttle: Option, +} impl Builder { + fn new() -> Self { + Builder::default() + } + ///The rate at which token are replenished. + fn set_token_refill_rate(&mut self, token_refill_rate: Option) -> &mut Self { + self.token_refill_rate = token_refill_rate; + self + } + ///The rate at which token are replenished. + fn token_refill_rate(mut self, token_refill_rate: f64) -> Self { + self.token_refill_rate = Some(token_refill_rate); + self + } + ///The maximum capacity allowed in the token bucket. + fn set_maximum_bucket_capacity(&mut self, maximum_bucket_capacity: Option) -> &mut Self { + self.maximum_bucket_capacity = maximum_bucket_capacity; + self + } + ///The maximum capacity allowed in the token bucket. + fn maximum_bucket_capacity(mut self, maximum_bucket_capacity: f64) -> Self { + self.maximum_bucket_capacity = Some(maximum_bucket_capacity); + self + } + ///The current capacity of the token bucket. The minimum this can be is 1.0 + fn set_current_bucket_capacity(&mut self, current_bucket_capacity: Option) -> &mut Self { + self.current_bucket_capacity = current_bucket_capacity; + self + } + ///The current capacity of the token bucket. The minimum this can be is 1.0 + fn current_bucket_capacity(mut self, current_bucket_capacity: f64) -> Self { + self.current_bucket_capacity = Some(current_bucket_capacity); + self + } + ///The last time the token bucket was refilled. + fn set_time_of_last_refill(&mut self, time_of_last_refill: Option) -> &mut Self { + self.time_of_last_refill = time_of_last_refill; + self + } + ///The last time the token bucket was refilled. + fn time_of_last_refill(mut self, time_of_last_refill: f64) -> Self { + self.time_of_last_refill = Some(time_of_last_refill); + self + } + ///The smoothed rate which tokens are being retrieved. + fn set_tokens_retrieved_per_second( + &mut self, + tokens_retrieved_per_second: Option, + ) -> &mut Self { + self.tokens_retrieved_per_second = tokens_retrieved_per_second; + self + } + ///The smoothed rate which tokens are being retrieved. + fn tokens_retrieved_per_second(mut self, tokens_retrieved_per_second: f64) -> Self { + self.tokens_retrieved_per_second = Some(tokens_retrieved_per_second); + self + } + ///The last half second time bucket used. + fn set_previous_time_bucket(&mut self, previous_time_bucket: Option) -> &mut Self { + self.previous_time_bucket = previous_time_bucket; + self + } + ///The last half second time bucket used. + fn previous_time_bucket(mut self, previous_time_bucket: f64) -> Self { + self.previous_time_bucket = Some(previous_time_bucket); + self + } + ///The number of requests seen within the current time bucket. + fn set_request_count(&mut self, request_count: Option) -> &mut Self { + self.request_count = request_count; + self + } + ///The number of requests seen within the current time bucket. + fn request_count(mut self, request_count: u64) -> Self { + self.request_count = Some(request_count); + self + } + ///Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled. + fn set_enable_throttling(&mut self, enable_throttling: Option) -> &mut Self { + self.enable_throttling = enable_throttling; + self + } + ///Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled. + fn enable_throttling(mut self, enable_throttling: bool) -> Self { + self.enable_throttling = Some(enable_throttling); + self + } + ///The maximum rate when the client was last throttled. + fn set_tokens_retrieved_per_second_at_time_of_last_throttle( + &mut self, + tokens_retrieved_per_second_at_time_of_last_throttle: Option, + ) -> &mut Self { + self.tokens_retrieved_per_second_at_time_of_last_throttle = + tokens_retrieved_per_second_at_time_of_last_throttle; + self + } + ///The maximum rate when the client was last throttled. + fn tokens_retrieved_per_second_at_time_of_last_throttle( + mut self, + tokens_retrieved_per_second_at_time_of_last_throttle: f64, + ) -> Self { + self.tokens_retrieved_per_second_at_time_of_last_throttle = + Some(tokens_retrieved_per_second_at_time_of_last_throttle); + self + } + ///The last time when the client was throttled. + fn set_time_of_last_throttle(&mut self, time_of_last_throttle: Option) -> &mut Self { + self.time_of_last_throttle = time_of_last_throttle; + self + } + ///The last time when the client was throttled. + fn time_of_last_throttle(mut self, time_of_last_throttle: f64) -> Self { + self.time_of_last_throttle = Some(time_of_last_throttle); + self + } + fn build(self) -> ClientRateLimiter { ClientRateLimiter { inner: Arc::new(Mutex::new(Inner { @@ -298,11 +396,8 @@ mod tests { use super::{cubic_throttle, ClientRateLimiter}; use crate::client::retries::client_rate_limiter::RequestReason; use approx::assert_relative_eq; - use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep}; + use aws_smithy_async::rt::sleep::AsyncSleep; use aws_smithy_async::test_util::instant_time_and_sleep; - use aws_smithy_async::time::SharedTimeSource; - use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; - use aws_smithy_types::config_bag::ConfigBag; use std::time::{Duration, SystemTime}; const ONE_SECOND: Duration = Duration::from_secs(1); @@ -325,12 +420,6 @@ mod tests { #[tokio::test] async fn throttling_is_enabled_once_throttling_error_is_received() { - let mut cfg = ConfigBag::base(); - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(time_source)); - cfg.interceptor_state() - .set_sleep_impl(Some(SharedAsyncSleep::new(sleep_impl))); let rate_limiter = ClientRateLimiter::builder() .previous_time_bucket(0.0) .time_of_last_throttle(0.0) @@ -349,13 +438,6 @@ mod tests { #[tokio::test] async fn test_calculated_rate_with_successes() { - let mut cfg = ConfigBag::base(); - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - sleep_impl.sleep(Duration::from_secs(5)).await; - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(time_source)); - cfg.interceptor_state() - .set_sleep_impl(Some(SharedAsyncSleep::new(sleep_impl.clone()))); let rate_limiter = ClientRateLimiter::builder() .time_of_last_throttle(5.0) .tokens_retrieved_per_second_at_time_of_last_throttle(10.0) @@ -414,13 +496,6 @@ mod tests { #[tokio::test] async fn test_calculated_rate_with_throttles() { - let mut cfg = ConfigBag::base(); - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - sleep_impl.sleep(Duration::from_secs(5)).await; - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(time_source)); - cfg.interceptor_state() - .set_sleep_impl(Some(SharedAsyncSleep::new(sleep_impl.clone()))); let rate_limiter = ClientRateLimiter::builder() .tokens_retrieved_per_second_at_time_of_last_throttle(10.0) .time_of_last_throttle(5.0) @@ -496,12 +571,7 @@ mod tests { #[tokio::test] async fn test_client_sending_rates() { - let mut cfg = ConfigBag::base(); - let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); - cfg.interceptor_state() - .set_request_time(SharedTimeSource::new(time_source)); - cfg.interceptor_state() - .set_sleep_impl(Some(SharedAsyncSleep::new(sleep_impl.clone()))); + let (_, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH); let rate_limiter = ClientRateLimiter::builder().build(); struct Attempt { diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs index c046a4d9f71..05c039f63dc 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs @@ -3,12 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -#[cfg(feature = "test-util")] -mod fixed_delay; mod never; pub(crate) mod standard; -#[cfg(feature = "test-util")] -pub use fixed_delay::FixedDelayRetryStrategy; pub use never::NeverRetryStrategy; pub use standard::StandardRetryStrategy; diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs deleted file mode 100644 index 088e7bfd8c5..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/fixed_delay.rs +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; -use aws_smithy_runtime_api::client::retries::{ - ClassifyRetry, RetryClassifiers, RetryReason, RetryStrategy, ShouldAttempt, -}; -use aws_smithy_types::config_bag::ConfigBag; -use std::time::Duration; - -// A retry policy used in tests. This relies on an error classifier already present in the config bag. -// If a server response is retryable, it will be retried after a fixed delay. -#[derive(Debug, Clone)] -pub struct FixedDelayRetryStrategy { - fixed_delay: Duration, - max_attempts: u32, -} - -impl FixedDelayRetryStrategy { - pub fn new(fixed_delay: Duration) -> Self { - Self { - fixed_delay, - max_attempts: 4, - } - } - - pub fn one_second_delay() -> Self { - Self::new(Duration::from_secs(1)) - } -} - -impl RetryStrategy for FixedDelayRetryStrategy { - fn should_attempt_initial_request(&self, _cfg: &ConfigBag) -> Result { - Ok(ShouldAttempt::Yes) - } - - fn should_attempt_retry( - &self, - ctx: &InterceptorContext, - cfg: &ConfigBag, - ) -> Result { - // Look a the result. If it's OK then we're done; No retry required. Otherwise, we need to inspect it - let output_or_error = ctx.output_or_error().expect( - "This must never be called without reaching the point where the result exists.", - ); - if output_or_error.is_ok() { - tracing::trace!("request succeeded, no retry necessary"); - return Ok(ShouldAttempt::No); - } - - // Check if we're out of attempts - let request_attempts = cfg - .load::() - .expect("at least one request attempt is made before any retry is attempted"); - if request_attempts.attempts() >= self.max_attempts { - tracing::trace!( - attempts = request_attempts.attempts(), - max_attempts = self.max_attempts, - "not retrying because we are out of attempts" - ); - return Ok(ShouldAttempt::No); - } - - let retry_classifiers = cfg - .load::() - .expect("a retry classifier is set"); - let retry_reason = retry_classifiers.classify_retry(ctx); - - let backoff = match retry_reason { - Some(RetryReason::Explicit(_)) => self.fixed_delay, - Some(RetryReason::Error(_)) => self.fixed_delay, - Some(_) => { - unreachable!("RetryReason is non-exhaustive. Therefore, we need to cover this unreachable case.") - } - None => { - tracing::trace!( - attempts = request_attempts.attempts(), - max_attempts = self.max_attempts, - "encountered unretryable error" - ); - return Ok(ShouldAttempt::No); - } - }; - - tracing::debug!( - "attempt {} failed with {:?}; retrying after {:?}", - request_attempts.attempts(), - retry_reason, - backoff - ); - - Ok(ShouldAttempt::YesAfterDelay(backoff)) - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs index c06a745a277..7baf4a14265 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs @@ -6,26 +6,34 @@ use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; use aws_smithy_runtime_api::client::retries::{RetryStrategy, ShouldAttempt}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; +/// A retry strategy that never retries. #[non_exhaustive] #[derive(Debug, Clone, Default)] -pub struct NeverRetryStrategy {} +pub struct NeverRetryStrategy; impl NeverRetryStrategy { + /// Creates a new `NeverRetryStrategy`. pub fn new() -> Self { Self::default() } } impl RetryStrategy for NeverRetryStrategy { - fn should_attempt_initial_request(&self, _cfg: &ConfigBag) -> Result { + fn should_attempt_initial_request( + &self, + _runtime_components: &RuntimeComponents, + _cfg: &ConfigBag, + ) -> Result { Ok(ShouldAttempt::Yes) } fn should_attempt_retry( &self, _context: &InterceptorContext, + _runtime_components: &RuntimeComponents, _cfg: &ConfigBag, ) -> Result { Ok(ShouldAttempt::No) diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs index ecb29234f4d..de74b31c2b7 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs @@ -3,35 +3,32 @@ * SPDX-License-Identifier: Apache-2.0 */ +use crate::client::retries::classifiers::run_classifiers_on_ctx; use crate::client::retries::client_rate_limiter::{ClientRateLimiter, RequestReason}; use crate::client::retries::strategy::standard::ReleaseResult::{ APermitWasReleased, NoPermitWasReleased, }; use crate::client::retries::token_bucket::TokenBucket; +use crate::client::retries::{ClientRateLimiterPartition, RetryPartition}; +use crate::static_partition_map::StaticPartitionMap; use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; -use aws_smithy_runtime_api::client::request_attempts::RequestAttempts; -use aws_smithy_runtime_api::client::retries::{ - ClassifyRetry, RetryReason, RetryStrategy, ShouldAttempt, -}; +use aws_smithy_runtime_api::client::retries::classifiers::{RetryAction, RetryReason}; +use aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, ShouldAttempt}; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace}; -use aws_smithy_types::retry::{ErrorKind, RetryConfig}; +use aws_smithy_types::retry::{ErrorKind, RetryConfig, RetryMode}; use std::sync::Mutex; use std::time::{Duration, SystemTime}; use tokio::sync::OwnedSemaphorePermit; use tracing::debug; -// The initial attempt, plus three retries. -const DEFAULT_MAX_ATTEMPTS: u32 = 4; +static CLIENT_RATE_LIMITER: StaticPartitionMap = + StaticPartitionMap::new(); -#[derive(Debug)] +/// Retry strategy with exponential backoff, max attempts, and a token bucket. +#[derive(Debug, Default)] pub struct StandardRetryStrategy { - // Retry settings - base: fn() -> f64, - initial_backoff: Duration, - max_attempts: u32, - max_backoff: Duration, retry_permit: Mutex>, } @@ -40,38 +37,9 @@ impl Storable for StandardRetryStrategy { } impl StandardRetryStrategy { - pub fn new(retry_config: &RetryConfig) -> Self { - let base = if retry_config.use_static_exponential_base() { - || 1.0 - } else { - fastrand::f64 - }; - // TODO(enableNewSmithyRuntimeLaunch) add support for `retry_config.reconnect_mode()` here or in the orchestrator flow. - Self::default() - .with_base(base) - .with_max_backoff(retry_config.max_backoff()) - .with_max_attempts(retry_config.max_attempts()) - .with_initial_backoff(retry_config.initial_backoff()) - } - - pub fn with_base(mut self, base: fn() -> f64) -> Self { - self.base = base; - self - } - - pub fn with_max_attempts(mut self, max_attempts: u32) -> Self { - self.max_attempts = max_attempts; - self - } - - pub fn with_initial_backoff(mut self, initial_backoff: Duration) -> Self { - self.initial_backoff = initial_backoff; - self - } - - pub fn with_max_backoff(mut self, max_backoff: Duration) -> Self { - self.max_backoff = max_backoff; - self + /// Create a new standard retry strategy with the given config. + pub fn new() -> Self { + Default::default() } fn release_retry_permit(&self) -> ReleaseResult { @@ -94,10 +62,38 @@ impl StandardRetryStrategy { } } + /// Returns a [`ClientRateLimiter`] if adaptive retry is configured. + fn adaptive_retry_rate_limiter( + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Option { + let retry_config = cfg.load::().expect("retry config is required"); + if retry_config.mode() == RetryMode::Adaptive { + if let Some(time_source) = runtime_components.time_source() { + let retry_partition = cfg.load::().expect("set in default config"); + let seconds_since_unix_epoch = time_source + .now() + .duration_since(SystemTime::UNIX_EPOCH) + .expect("the present takes place after the UNIX_EPOCH") + .as_secs_f64(); + let client_rate_limiter_partition = + ClientRateLimiterPartition::new(retry_partition.clone()); + let client_rate_limiter = CLIENT_RATE_LIMITER + .get_or_init(client_rate_limiter_partition, || { + ClientRateLimiter::new(seconds_since_unix_epoch) + }); + return Some(client_rate_limiter); + } + } + None + } + fn calculate_backoff( &self, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, - retry_reason: Option<&RetryReason>, + retry_cfg: &RetryConfig, + retry_reason: &RetryAction, ) -> Result { let request_attempts = cfg .load::() @@ -106,11 +102,21 @@ impl StandardRetryStrategy { let token_bucket = cfg.load::(); match retry_reason { - Some(RetryReason::Explicit(backoff)) => Ok(*backoff), - Some(RetryReason::Error(kind)) => { - update_rate_limiter_if_exists(cfg, *kind == ErrorKind::ThrottlingError); - if let Some(delay) = check_rate_limiter_for_delay(cfg, *kind) { - let delay = delay.min(self.max_backoff); + RetryAction::RetryIndicated(RetryReason::RetryableError { kind, retry_after }) => { + update_rate_limiter_if_exists( + runtime_components, + cfg, + *kind == ErrorKind::ThrottlingError, + ); + + if let Some(delay) = *retry_after { + let delay = delay.min(retry_cfg.max_backoff()); + debug!("explicit request from server to delay {delay:?} before retrying"); + Ok(delay) + } else if let Some(delay) = + check_rate_limiter_for_delay(runtime_components, cfg, *kind) + { + let delay = delay.min(retry_cfg.max_backoff()); debug!("rate limiter has requested a {delay:?} delay before retrying"); Ok(delay) } else { @@ -124,28 +130,33 @@ impl StandardRetryStrategy { } } + let base = if retry_cfg.use_static_exponential_base() { + 1.0 + } else { + fastrand::f64() + }; let backoff = calculate_exponential_backoff( // Generate a random base multiplier to create jitter - (self.base)(), + base, // Get the backoff time multiplier in seconds (with fractional seconds) - self.initial_backoff.as_secs_f64(), + retry_cfg.initial_backoff().as_secs_f64(), // `self.local.attempts` tracks number of requests made including the initial request // The initial attempt shouldn't count towards backoff calculations so we subtract it request_attempts - 1, ); - Ok(Duration::from_secs_f64(backoff).min(self.max_backoff)) + Ok(Duration::from_secs_f64(backoff).min(retry_cfg.max_backoff())) } } - Some(_) => unreachable!("RetryReason is non-exhaustive"), - None => { - update_rate_limiter_if_exists(cfg, false); + RetryAction::RetryForbidden | RetryAction::NoActionIndicated => { + update_rate_limiter_if_exists(runtime_components, cfg, false); debug!( attempts = request_attempts, - max_attempts = self.max_attempts, + max_attempts = retry_cfg.max_attempts(), "encountered unretryable error" ); Err(ShouldAttempt::No) } + _ => unreachable!("RetryAction is non-exhaustive"), } } } @@ -155,23 +166,14 @@ enum ReleaseResult { NoPermitWasReleased, } -impl Default for StandardRetryStrategy { - fn default() -> Self { - Self { - max_attempts: DEFAULT_MAX_ATTEMPTS, - max_backoff: Duration::from_secs(20), - // by default, use a random base for exponential backoff - base: fastrand::f64, - initial_backoff: Duration::from_secs(1), - retry_permit: Mutex::new(None), - } - } -} - impl RetryStrategy for StandardRetryStrategy { - fn should_attempt_initial_request(&self, cfg: &ConfigBag) -> Result { - if let Some(crl) = cfg.load::() { - let seconds_since_unix_epoch = get_seconds_since_unix_epoch(cfg); + fn should_attempt_initial_request( + &self, + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + ) -> Result { + if let Some(crl) = Self::adaptive_retry_rate_limiter(runtime_components, cfg) { + let seconds_since_unix_epoch = get_seconds_since_unix_epoch(runtime_components); if let Err(delay) = crl.acquire_permission_to_send_a_request( seconds_since_unix_epoch, RequestReason::InitialRequest, @@ -188,8 +190,10 @@ impl RetryStrategy for StandardRetryStrategy { fn should_attempt_retry( &self, ctx: &InterceptorContext, + runtime_components: &RuntimeComponents, cfg: &ConfigBag, ) -> Result { + let retry_cfg = cfg.load::().expect("retry config is required"); // Look a the result. If it's OK then we're done; No retry required. Otherwise, we need to inspect it let output_or_error = ctx.output_or_error().expect( "This must never be called without reaching the point where the result exists.", @@ -207,7 +211,7 @@ impl RetryStrategy for StandardRetryStrategy { tb.regenerate_a_token(); } } - update_rate_limiter_if_exists(cfg, false); + update_rate_limiter_if_exists(runtime_components, cfg, false); return Ok(ShouldAttempt::No); } @@ -217,54 +221,63 @@ impl RetryStrategy for StandardRetryStrategy { .load::() .expect("at least one request attempt is made before any retry is attempted") .attempts(); - if request_attempts >= self.max_attempts { - update_rate_limiter_if_exists(cfg, false); + if request_attempts >= retry_cfg.max_attempts() { + update_rate_limiter_if_exists(runtime_components, cfg, false); debug!( attempts = request_attempts, - max_attempts = self.max_attempts, + max_attempts = retry_cfg.max_attempts(), "not retrying because we are out of attempts" ); return Ok(ShouldAttempt::No); } - // Run the classifiers against the context to determine if we should retry - let retry_classifiers = cfg.retry_classifiers(); - let retry_reason = retry_classifiers.classify_retry(ctx); + // Run the classifier against the context to determine if we should retry + let retry_classifiers = runtime_components.retry_classifiers(); + let classifier_result = run_classifiers_on_ctx(retry_classifiers, ctx); // Calculate the appropriate backoff time. - let backoff = match self.calculate_backoff(cfg, retry_reason.as_ref()) { - Ok(value) => value, - // In some cases, backoff calculation will decide that we shouldn't retry at all. - Err(value) => return Ok(value), - }; + let backoff = + match self.calculate_backoff(runtime_components, cfg, retry_cfg, &classifier_result) { + Ok(value) => value, + // In some cases, backoff calculation will decide that we shouldn't retry at all. + Err(value) => return Ok(value), + }; debug!( "attempt #{request_attempts} failed with {:?}; retrying after {:?}", - retry_reason.expect("the match statement above ensures this is not None"), - backoff, + classifier_result, backoff, ); Ok(ShouldAttempt::YesAfterDelay(backoff)) } } -fn update_rate_limiter_if_exists(cfg: &ConfigBag, is_throttling_error: bool) { - if let Some(crl) = cfg.load::() { - let seconds_since_unix_epoch = get_seconds_since_unix_epoch(cfg); +fn update_rate_limiter_if_exists( + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + is_throttling_error: bool, +) { + if let Some(crl) = StandardRetryStrategy::adaptive_retry_rate_limiter(runtime_components, cfg) { + let seconds_since_unix_epoch = get_seconds_since_unix_epoch(runtime_components); crl.update_rate_limiter(seconds_since_unix_epoch, is_throttling_error); } } -fn check_rate_limiter_for_delay(cfg: &ConfigBag, kind: ErrorKind) -> Option { - if let Some(crl) = cfg.load::() { +fn check_rate_limiter_for_delay( + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + kind: ErrorKind, +) -> Option { + if let Some(crl) = StandardRetryStrategy::adaptive_retry_rate_limiter(runtime_components, cfg) { let retry_reason = if kind == ErrorKind::ThrottlingError { RequestReason::RetryTimeout } else { RequestReason::Retry }; - if let Err(delay) = crl - .acquire_permission_to_send_a_request(get_seconds_since_unix_epoch(cfg), retry_reason) - { + if let Err(delay) = crl.acquire_permission_to_send_a_request( + get_seconds_since_unix_epoch(runtime_components), + retry_reason, + ) { return Some(delay); } } @@ -273,11 +286,16 @@ fn check_rate_limiter_for_delay(cfg: &ConfigBag, kind: ErrorKind) -> Option f64 { - base * initial_backoff * 2_u32.pow(retry_attempts) as f64 + 2_u32 + .checked_pow(retry_attempts) + .map(|backoff| (backoff as f64) * base * initial_backoff) + .unwrap_or(f64::MAX) } -fn get_seconds_since_unix_epoch(cfg: &ConfigBag) -> f64 { - let request_time = cfg.request_time().unwrap(); +fn get_seconds_since_unix_epoch(runtime_components: &RuntimeComponents) -> f64 { + let request_time = runtime_components + .time_source() + .expect("time source required for retries"); request_time .now() .duration_since(SystemTime::UNIX_EPOCH) @@ -289,27 +307,34 @@ fn get_seconds_since_unix_epoch(cfg: &ConfigBag) -> f64 { mod tests { use super::*; use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; - use aws_smithy_runtime_api::client::retries::{ - AlwaysRetry, ClassifyRetry, RetryClassifiers, RetryReason, RetryStrategy, + use aws_smithy_runtime_api::client::retries::classifiers::{ + ClassifyRetry, RetryAction, SharedRetryClassifier, }; + use aws_smithy_runtime_api::client::retries::{AlwaysRetry, RetryStrategy}; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; use aws_smithy_types::config_bag::Layer; use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind}; - use aws_smithy_types::type_erasure::TypeErasedBox; use std::fmt; use std::sync::Mutex; use std::time::Duration; #[cfg(feature = "test-util")] use crate::client::retries::token_bucket::TokenBucket; + use aws_smithy_runtime_api::client::interceptors::context::{Input, Output}; #[test] fn no_retry_necessary_for_ok_result() { - let cfg = ConfigBag::base(); - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + let cfg = ConfigBag::of_layers(vec![{ + let mut layer = Layer::new("test"); + layer.store_put(RetryConfig::standard()); + layer + }]); + let rc = RuntimeComponentsBuilder::for_tests().build().unwrap(); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); let strategy = StandardRetryStrategy::default(); - ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); let actual = strategy - .should_attempt_retry(&ctx, &cfg) + .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); assert_eq!(ShouldAttempt::No, actual); } @@ -317,26 +342,35 @@ mod tests { fn set_up_cfg_and_context( error_kind: ErrorKind, current_request_attempts: u32, - ) -> (InterceptorContext, ConfigBag) { - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + retry_config: RetryConfig, + ) -> (InterceptorContext, RuntimeComponents, ConfigBag) { + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); + let rc = RuntimeComponentsBuilder::for_tests() + .with_retry_classifier(SharedRetryClassifier::new(AlwaysRetry(error_kind))) + .build() + .unwrap(); let mut layer = Layer::new("test"); - layer.set_retry_classifiers( - RetryClassifiers::new().with_classifier(AlwaysRetry(error_kind)), - ); layer.store_put(RequestAttempts::new(current_request_attempts)); + layer.store_put(retry_config); let cfg = ConfigBag::of_layers(vec![layer]); - (ctx, cfg) + (ctx, rc, cfg) } // Test that error kinds produce the correct "retry after X seconds" output. // All error kinds are handled in the same way for the standard strategy. fn test_should_retry_error_kind(error_kind: ErrorKind) { - let (ctx, cfg) = set_up_cfg_and_context(error_kind, 3); - let strategy = StandardRetryStrategy::default().with_base(|| 1.0); + let (ctx, rc, cfg) = set_up_cfg_and_context( + error_kind, + 3, + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(4), + ); + let strategy = StandardRetryStrategy::new(); let actual = strategy - .should_attempt_retry(&ctx, &cfg) + .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); assert_eq!(ShouldAttempt::YesAfterDelay(Duration::from_secs(4)), actual); } @@ -365,12 +399,16 @@ mod tests { fn dont_retry_when_out_of_attempts() { let current_attempts = 4; let max_attempts = current_attempts; - let (ctx, cfg) = set_up_cfg_and_context(ErrorKind::TransientError, current_attempts); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(max_attempts); + let (ctx, rc, cfg) = set_up_cfg_and_context( + ErrorKind::TransientError, + current_attempts, + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(max_attempts), + ); + let strategy = StandardRetryStrategy::new(); let actual = strategy - .should_attempt_retry(&ctx, &cfg) + .should_attempt_retry(&ctx, &rc, &cfg) .expect("method is infallible for this use"); assert_eq!(ShouldAttempt::No, actual); } @@ -397,31 +435,35 @@ mod tests { #[derive(Debug)] struct PresetReasonRetryClassifier { - retry_reasons: Mutex>, + retry_actions: Mutex>, } #[cfg(feature = "test-util")] impl PresetReasonRetryClassifier { - fn new(mut retry_reasons: Vec) -> Self { + fn new(mut retry_reasons: Vec) -> Self { // We'll pop the retry_reasons in reverse order so we reverse the list to fix that. retry_reasons.reverse(); Self { - retry_reasons: Mutex::new(retry_reasons), + retry_actions: Mutex::new(retry_reasons), } } } impl ClassifyRetry for PresetReasonRetryClassifier { - fn classify_retry(&self, ctx: &InterceptorContext) -> Option { - if ctx.output_or_error().map(|it| it.is_ok()).unwrap_or(false) { - return None; - } - - let mut retry_reasons = self.retry_reasons.lock().unwrap(); - if retry_reasons.len() == 1 { - Some(retry_reasons.first().unwrap().clone()) + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + _ => (), + }; + + let mut retry_actions = self.retry_actions.lock().unwrap(); + if retry_actions.len() == 1 { + retry_actions.first().unwrap().clone() } else { - retry_reasons.pop() + retry_actions.pop().unwrap() } } @@ -431,45 +473,55 @@ mod tests { } #[cfg(feature = "test-util")] - fn setup_test(retry_reasons: Vec) -> (ConfigBag, InterceptorContext) { - let mut cfg = ConfigBag::base(); - cfg.interceptor_state().set_retry_classifiers( - RetryClassifiers::new() - .with_classifier(PresetReasonRetryClassifier::new(retry_reasons)), - ); - let mut ctx = InterceptorContext::new(TypeErasedBox::doesnt_matter()); + fn setup_test( + retry_reasons: Vec, + retry_config: RetryConfig, + ) -> (ConfigBag, RuntimeComponents, InterceptorContext) { + let rc = RuntimeComponentsBuilder::for_tests() + .with_retry_classifier(SharedRetryClassifier::new( + PresetReasonRetryClassifier::new(retry_reasons), + )) + .build() + .unwrap(); + let mut layer = Layer::new("test"); + layer.store_put(retry_config); + let cfg = ConfigBag::of_layers(vec![layer]); + let mut ctx = InterceptorContext::new(Input::doesnt_matter()); // This type doesn't matter b/c the classifier will just return whatever we tell it to. ctx.set_output_or_error(Err(OrchestratorError::other("doesn't matter"))); - (cfg, ctx) + (cfg, rc, ctx) } #[cfg(feature = "test-util")] #[test] fn eventual_success() { - let (mut cfg, mut ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5); + let (mut cfg, rc, mut ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::default()); let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 495); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); - ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 495); } @@ -477,27 +529,30 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn no_more_attempts() { - let (mut cfg, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(3); + let (mut cfg, rc, ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(3), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::default()); let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 495); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 490); } @@ -505,21 +560,24 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn no_quota() { - let (mut cfg, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5); + let (mut cfg, rc, ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::new(5)); let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 0); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 0); } @@ -527,32 +585,38 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn quota_replenishes_on_success() { - let (mut cfg, mut ctx) = setup_test(vec![ - RetryReason::Error(ErrorKind::TransientError), - RetryReason::Explicit(Duration::from_secs(1)), - ]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5); + let (mut cfg, rc, mut ctx) = setup_test( + vec![ + RetryAction::transient_error(), + RetryAction::retryable_error_with_explicit_delay( + ErrorKind::TransientError, + Duration::from_secs(1), + ), + ], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::new(100)); let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 90); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 90); - ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 100); @@ -562,10 +626,13 @@ mod tests { #[test] fn quota_replenishes_on_first_try_success() { const PERMIT_COUNT: usize = 20; - let (mut cfg, mut ctx) = setup_test(vec![RetryReason::Error(ErrorKind::TransientError)]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(u32::MAX); + let (mut cfg, rc, mut ctx) = setup_test( + vec![RetryAction::transient_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(u32::MAX), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state() .store_put(TokenBucket::new(PERMIT_COUNT)); let token_bucket = cfg.load::().unwrap().clone(); @@ -581,7 +648,7 @@ mod tests { cfg.interceptor_state() .store_put(RequestAttempts::new(attempt)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert!(matches!(should_retry, ShouldAttempt::YesAfterDelay(_))); attempt += 1; } @@ -590,7 +657,7 @@ mod tests { let permit = strategy.retry_permit.lock().unwrap().take().unwrap(); permit.forget(); - ctx.set_output_or_error(Ok(TypeErasedBox::doesnt_matter())); + ctx.set_output_or_error(Ok(Output::doesnt_matter())); // Replenish permits until we get back to `PERMIT_COUNT` while token_bucket.available_permits() < PERMIT_COUNT { @@ -600,7 +667,7 @@ mod tests { cfg.interceptor_state() .store_put(RequestAttempts::new(attempt)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); attempt += 1; } @@ -612,39 +679,42 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn backoff_timing() { - let (mut cfg, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5); + let (mut cfg, rc, ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::default()); let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 495); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(4)); assert_eq!(token_bucket.available_permits(), 485); cfg.interceptor_state().store_put(RequestAttempts::new(4)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(8)); assert_eq!(token_bucket.available_permits(), 480); cfg.interceptor_state().store_put(RequestAttempts::new(5)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 480); } @@ -652,41 +722,44 @@ mod tests { #[cfg(feature = "test-util")] #[test] fn max_backoff_time() { - let (mut cfg, ctx) = setup_test(vec![RetryReason::Error(ErrorKind::ServerError)]); - let strategy = StandardRetryStrategy::default() - .with_base(|| 1.0) - .with_max_attempts(5) - .with_initial_backoff(Duration::from_secs(1)) - .with_max_backoff(Duration::from_secs(3)); + let (mut cfg, rc, ctx) = setup_test( + vec![RetryAction::server_error()], + RetryConfig::standard() + .with_use_static_exponential_base(true) + .with_max_attempts(5) + .with_initial_backoff(Duration::from_secs(1)) + .with_max_backoff(Duration::from_secs(3)), + ); + let strategy = StandardRetryStrategy::new(); cfg.interceptor_state().store_put(TokenBucket::default()); let token_bucket = cfg.load::().unwrap().clone(); cfg.interceptor_state().store_put(RequestAttempts::new(1)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(1)); assert_eq!(token_bucket.available_permits(), 495); cfg.interceptor_state().store_put(RequestAttempts::new(2)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(2)); assert_eq!(token_bucket.available_permits(), 490); cfg.interceptor_state().store_put(RequestAttempts::new(3)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(3)); assert_eq!(token_bucket.available_permits(), 485); cfg.interceptor_state().store_put(RequestAttempts::new(4)); - let should_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); let dur = should_retry.expect_delay(); assert_eq!(dur, Duration::from_secs(3)); assert_eq!(token_bucket.available_permits(), 480); cfg.interceptor_state().store_put(RequestAttempts::new(5)); - let no_retry = strategy.should_attempt_retry(&ctx, &cfg).unwrap(); + let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap(); assert_eq!(no_retry, ShouldAttempt::No); assert_eq!(token_bucket.available_permits(), 480); } @@ -723,4 +796,13 @@ mod tests { assert_eq!(expected_backoff, actual_backoff); } } + + #[test] + fn calculate_backoff_overflow() { + // avoid overflow for a silly large amount of retry attempts + assert_eq!( + calculate_exponential_backoff(1_f64, 10_f64, 100000), + f64::MAX + ); + } } diff --git a/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs b/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs index a7c95d2a511..c2c8ba8c646 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs @@ -3,56 +3,18 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::client::retries::RetryPartition; -use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; -use aws_smithy_types::config_bag::{FrozenLayer, Layer, Storable, StoreReplace}; +use aws_smithy_types::config_bag::{Storable, StoreReplace}; use aws_smithy_types::retry::ErrorKind; use std::sync::Arc; use tokio::sync::{OwnedSemaphorePermit, Semaphore}; use tracing::trace; -/// A [RuntimePlugin] to provide a token bucket, usable by a retry strategy. -#[non_exhaustive] -#[derive(Debug, Default)] -pub struct TokenBucketRuntimePlugin { - token_bucket: TokenBucket, -} - -impl TokenBucketRuntimePlugin { - pub fn new(initial_tokens: usize) -> Self { - Self { - token_bucket: TokenBucket::new(initial_tokens), - } - } -} - -impl RuntimePlugin for TokenBucketRuntimePlugin { - fn config(&self) -> Option { - let mut cfg = Layer::new("standard token bucket"); - cfg.store_put(self.token_bucket.clone()); - - Some(cfg.freeze()) - } -} - -#[doc(hidden)] -#[non_exhaustive] -#[derive(Clone, Debug, Hash, PartialEq, Eq)] -pub struct TokenBucketPartition { - retry_partition: RetryPartition, -} - -impl TokenBucketPartition { - pub fn new(retry_partition: RetryPartition) -> Self { - Self { retry_partition } - } -} - const DEFAULT_CAPACITY: usize = 500; const RETRY_COST: u32 = 5; const RETRY_TIMEOUT_COST: u32 = RETRY_COST * 2; const PERMIT_REGENERATION_AMOUNT: usize = 1; +/// Token bucket used for standard and adaptive retry. #[derive(Clone, Debug)] pub struct TokenBucket { semaphore: Arc, @@ -77,6 +39,7 @@ impl Default for TokenBucket { } impl TokenBucket { + /// Creates a new `TokenBucket` with the given initial quota. pub fn new(initial_quota: usize) -> Self { Self { semaphore: Arc::new(Semaphore::new(initial_quota)), diff --git a/rust-runtime/aws-smithy-runtime/src/client/stalled_stream_protection.rs b/rust-runtime/aws-smithy-runtime/src/client/stalled_stream_protection.rs new file mode 100644 index 00000000000..3e07b3f0b8d --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/client/stalled_stream_protection.rs @@ -0,0 +1,138 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::client::http::body::minimum_throughput::MinimumThroughputBody; +use aws_smithy_async::rt::sleep::SharedAsyncSleep; +use aws_smithy_async::time::SharedTimeSource; +use aws_smithy_runtime_api::box_error::BoxError; +use aws_smithy_runtime_api::client::interceptors::context::{ + BeforeDeserializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, +}; +use aws_smithy_runtime_api::client::interceptors::Intercept; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; +use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::config_bag::ConfigBag; +use std::mem; + +/// Adds stalled stream protection when sending requests and/or receiving responses. +#[derive(Debug)] +pub struct StalledStreamProtectionInterceptor { + enable_for_request_body: bool, + enable_for_response_body: bool, +} + +/// Stalled stream protection can be enable for request bodies, response bodies, +/// or both. +pub enum StalledStreamProtectionInterceptorKind { + /// Enable stalled stream protection for request bodies. + RequestBody, + /// Enable stalled stream protection for response bodies. + ResponseBody, + /// Enable stalled stream protection for both request and response bodies. + RequestAndResponseBody, +} + +impl StalledStreamProtectionInterceptor { + /// Create a new stalled stream protection interceptor. + pub fn new(kind: StalledStreamProtectionInterceptorKind) -> Self { + use StalledStreamProtectionInterceptorKind::*; + let (enable_for_request_body, enable_for_response_body) = match kind { + RequestBody => (true, false), + ResponseBody => (false, true), + RequestAndResponseBody => (true, true), + }; + + Self { + enable_for_request_body, + enable_for_response_body, + } + } +} + +impl Intercept for StalledStreamProtectionInterceptor { + fn name(&self) -> &'static str { + "StalledStreamProtectionInterceptor" + } + + fn modify_before_transmit( + &self, + context: &mut BeforeTransmitInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + if self.enable_for_request_body { + if let Some(cfg) = cfg.load::() { + if cfg.is_enabled() { + let (async_sleep, time_source) = + get_runtime_component_deps(runtime_components)?; + tracing::trace!("adding stalled stream protection to request body"); + add_stalled_stream_protection_to_body( + context.request_mut().body_mut(), + cfg, + async_sleep, + time_source, + ); + } + } + } + + Ok(()) + } + + fn modify_before_deserialization( + &self, + context: &mut BeforeDeserializationInterceptorContextMut<'_>, + runtime_components: &RuntimeComponents, + cfg: &mut ConfigBag, + ) -> Result<(), BoxError> { + if self.enable_for_response_body { + if let Some(cfg) = cfg.load::() { + if cfg.is_enabled() { + let (async_sleep, time_source) = + get_runtime_component_deps(runtime_components)?; + tracing::trace!("adding stalled stream protection to response body"); + add_stalled_stream_protection_to_body( + context.response_mut().body_mut(), + cfg, + async_sleep, + time_source, + ); + } + } + } + Ok(()) + } +} + +fn get_runtime_component_deps( + runtime_components: &RuntimeComponents, +) -> Result<(SharedAsyncSleep, SharedTimeSource), BoxError> { + let async_sleep = runtime_components.sleep_impl().ok_or( + "An async sleep implementation is required when stalled stream protection is enabled", + )?; + let time_source = runtime_components + .time_source() + .ok_or("A time source is required when stalled stream protection is enabled")?; + Ok((async_sleep, time_source)) +} + +fn add_stalled_stream_protection_to_body( + body: &mut SdkBody, + cfg: &StalledStreamProtectionConfig, + async_sleep: SharedAsyncSleep, + time_source: SharedTimeSource, +) { + let cfg = cfg.clone(); + let it = mem::replace(body, SdkBody::taken()); + let it = it.map_preserve_contents(move |body| { + let cfg = cfg.clone(); + let async_sleep = async_sleep.clone(); + let time_source = time_source.clone(); + let mtb = MinimumThroughputBody::new(time_source, async_sleep, body, cfg.into()); + SdkBody::from_body_0_4(mtb) + }); + let _ = mem::replace(body, it); +} diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util.rs index de7aef4ac5e..1173adc3db6 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util.rs @@ -3,6 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +/// Test response deserializer implementations. pub mod deserializer; -pub mod interceptors; + +/// Test request serializer implementations. pub mod serializer; diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs index 0a4b0ee8604..547fc253193 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs @@ -3,28 +3,28 @@ * SPDX-License-Identifier: Apache-2.0 */ -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::{Error, Output}; -use aws_smithy_runtime_api::client::orchestrator::{ - DynResponseDeserializer, HttpResponse, OrchestratorError, ResponseDeserializer, -}; +use aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError}; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; +use aws_smithy_runtime_api::client::ser_de::{DeserializeResponse, SharedResponseDeserializer}; use aws_smithy_types::config_bag::{FrozenLayer, Layer}; use std::sync::Mutex; +/// Test response deserializer that always returns the same canned response. #[derive(Default, Debug)] pub struct CannedResponseDeserializer { inner: Mutex>>>, } impl CannedResponseDeserializer { + /// Creates a new `CannedResponseDeserializer` with the given canned response. pub fn new(output: Result>) -> Self { Self { inner: Mutex::new(Some(output)), } } - pub fn take(&self) -> Option>> { + fn take(&self) -> Option>> { match self.inner.lock() { Ok(mut guard) => guard.take(), Err(_) => None, @@ -32,7 +32,7 @@ impl CannedResponseDeserializer { } } -impl ResponseDeserializer for CannedResponseDeserializer { +impl DeserializeResponse for CannedResponseDeserializer { fn deserialize_nonstreaming( &self, _response: &HttpResponse, @@ -46,7 +46,7 @@ impl ResponseDeserializer for CannedResponseDeserializer { impl RuntimePlugin for CannedResponseDeserializer { fn config(&self) -> Option { let mut cfg = Layer::new("CannedResponse"); - cfg.set_response_deserializer(DynResponseDeserializer::new(Self { + cfg.store_put(SharedResponseDeserializer::new(Self { inner: Mutex::new(self.take()), })); Some(cfg.freeze()) diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs deleted file mode 100644 index 4c2a34af117..00000000000 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/interceptors.rs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -// TODO(enableNewSmithyRuntimeCleanup): Delete this file once test helpers on `CustomizableOperation` have been removed - -use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::Interceptor; -use aws_smithy_types::config_bag::ConfigBag; -use std::fmt; - -pub struct TestParamsSetterInterceptor { - f: F, -} - -impl fmt::Debug for TestParamsSetterInterceptor { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "TestParamsSetterInterceptor") - } -} - -impl TestParamsSetterInterceptor { - pub fn new(f: F) -> Self { - Self { f } - } -} - -impl Interceptor for TestParamsSetterInterceptor -where - F: Fn(&mut BeforeTransmitInterceptorContextMut<'_>, &mut ConfigBag) + Send + Sync + 'static, -{ - fn modify_before_signing( - &self, - context: &mut BeforeTransmitInterceptorContextMut<'_>, - cfg: &mut ConfigBag, - ) -> Result<(), BoxError> { - (self.f)(context, cfg); - - Ok(()) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use aws_smithy_http::body::SdkBody; - use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; - use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; - use aws_smithy_types::type_erasure::TypedBox; - use std::time::{Duration, UNIX_EPOCH}; - - #[test] - fn set_test_request_time() { - let mut cfg = ConfigBag::base(); - let mut ctx = InterceptorContext::new(TypedBox::new("anything").erase()); - ctx.enter_serialization_phase(); - ctx.set_request(http::Request::builder().body(SdkBody::empty()).unwrap()); - let _ = ctx.take_input(); - ctx.enter_before_transmit_phase(); - let mut ctx = Into::into(&mut ctx); - let request_time = UNIX_EPOCH + Duration::from_secs(1624036048); - let interceptor = TestParamsSetterInterceptor::new( - move |_: &mut BeforeTransmitInterceptorContextMut<'_>, cfg: &mut ConfigBag| { - cfg.interceptor_state().set_request_time(request_time); - }, - ); - interceptor - .modify_before_signing(&mut ctx, &mut cfg) - .unwrap(); - assert_eq!(cfg.request_time().unwrap().now(), request_time); - } -} diff --git a/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs b/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs index 4f5bff24bdf..b6cf8e737ff 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs @@ -4,33 +4,35 @@ */ use aws_smithy_runtime_api::box_error::BoxError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::interceptors::context::Input; -use aws_smithy_runtime_api::client::orchestrator::SharedRequestSerializer; -use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, RequestSerializer}; +use aws_smithy_runtime_api::client::orchestrator::HttpRequest; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; +use aws_smithy_runtime_api::client::ser_de::{SerializeRequest, SharedRequestSerializer}; use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer}; use std::sync::Mutex; +/// Test [`SerializeRequest`] that returns a canned request. #[derive(Default, Debug)] pub struct CannedRequestSerializer { inner: Mutex>>, } impl CannedRequestSerializer { + /// Create a new [`CannedRequestSerializer`] with a successful canned request. pub fn success(request: HttpRequest) -> Self { Self { inner: Mutex::new(Some(Ok(request))), } } + /// Create a new [`CannedRequestSerializer`] with a canned error. pub fn failure(error: BoxError) -> Self { Self { inner: Mutex::new(Some(Err(error))), } } - pub fn take(&self) -> Option> { + fn take(&self) -> Option> { match self.inner.lock() { Ok(mut guard) => guard.take(), Err(_) => None, @@ -38,7 +40,7 @@ impl CannedRequestSerializer { } } -impl RequestSerializer for CannedRequestSerializer { +impl SerializeRequest for CannedRequestSerializer { fn serialize_input( &self, _input: Input, @@ -52,7 +54,7 @@ impl RequestSerializer for CannedRequestSerializer { impl RuntimePlugin for CannedRequestSerializer { fn config(&self) -> Option { let mut cfg = Layer::new("CannedRequest"); - cfg.set_request_serializer(SharedRequestSerializer::new(Self { + cfg.store_put(SharedRequestSerializer::new(Self { inner: Mutex::new(self.take()), })); Some(cfg.freeze()) diff --git a/rust-runtime/aws-smithy-runtime/src/client/timeout.rs b/rust-runtime/aws-smithy-runtime/src/client/timeout.rs index e1ba3aec636..14e3fa91898 100644 --- a/rust-runtime/aws-smithy-runtime/src/client/timeout.rs +++ b/rust-runtime/aws-smithy-runtime/src/client/timeout.rs @@ -5,9 +5,9 @@ use aws_smithy_async::future::timeout::Timeout; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep}; -use aws_smithy_client::SdkError; -use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents; use aws_smithy_types::config_bag::ConfigBag; use aws_smithy_types::timeout::TimeoutConfig; use pin_project_lite::pin_project; @@ -109,14 +109,14 @@ pub(super) struct MaybeTimeoutConfig { timeout_kind: TimeoutKind, } -pub(super) trait ProvideMaybeTimeoutConfig { - fn maybe_timeout_config(&self, timeout_kind: TimeoutKind) -> MaybeTimeoutConfig; -} - -impl ProvideMaybeTimeoutConfig for ConfigBag { - fn maybe_timeout_config(&self, timeout_kind: TimeoutKind) -> MaybeTimeoutConfig { - if let Some(timeout_config) = self.load::() { - let sleep_impl = self.sleep_impl(); +impl MaybeTimeoutConfig { + pub(super) fn new( + runtime_components: &RuntimeComponents, + cfg: &ConfigBag, + timeout_kind: TimeoutKind, + ) -> MaybeTimeoutConfig { + if let Some(timeout_config) = cfg.load::() { + let sleep_impl = runtime_components.sleep_impl(); let timeout = match (sleep_impl.as_ref(), timeout_kind) { (None, _) => None, (Some(_), TimeoutKind::Operation) => timeout_config.operation_timeout(), @@ -142,23 +142,14 @@ impl ProvideMaybeTimeoutConfig for ConfigBag { /// Trait to conveniently wrap a future with an optional timeout. pub(super) trait MaybeTimeout: Sized { /// Wraps a future in a timeout if one is set. - fn maybe_timeout_with_config( - self, - timeout_config: MaybeTimeoutConfig, - ) -> MaybeTimeoutFuture; - - /// Wraps a future in a timeout if one is set. - fn maybe_timeout(self, cfg: &ConfigBag, kind: TimeoutKind) -> MaybeTimeoutFuture; + fn maybe_timeout(self, timeout_config: MaybeTimeoutConfig) -> MaybeTimeoutFuture; } impl MaybeTimeout for T where T: Future, { - fn maybe_timeout_with_config( - self, - timeout_config: MaybeTimeoutConfig, - ) -> MaybeTimeoutFuture { + fn maybe_timeout(self, timeout_config: MaybeTimeoutConfig) -> MaybeTimeoutFuture { match timeout_config { MaybeTimeoutConfig { sleep_impl: Some(sleep_impl), @@ -172,22 +163,18 @@ where _ => MaybeTimeoutFuture::NoTimeout { future: self }, } } - - fn maybe_timeout(self, cfg: &ConfigBag, kind: TimeoutKind) -> MaybeTimeoutFuture { - self.maybe_timeout_with_config(cfg.maybe_timeout_config(kind)) - } } #[cfg(test)] mod tests { - use crate::client::timeout::{MaybeTimeout, TimeoutKind}; + use super::*; use aws_smithy_async::assert_elapsed; use aws_smithy_async::future::never::Never; use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, TokioSleep}; - use aws_smithy_http::result::SdkError; - use aws_smithy_runtime_api::client::config_bag_accessors::ConfigBagAccessors; use aws_smithy_runtime_api::client::orchestrator::HttpResponse; - use aws_smithy_types::config_bag::{ConfigBag, Layer}; + use aws_smithy_runtime_api::client::result::SdkError; + use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; + use aws_smithy_types::config_bag::{CloneableLayer, ConfigBag}; use aws_smithy_types::timeout::TimeoutConfig; use std::time::Duration; @@ -203,14 +190,19 @@ mod tests { let now = tokio::time::Instant::now(); tokio::time::pause(); - let mut cfg = ConfigBag::base(); - let mut timeout_config = Layer::new("timeout"); + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_sleep_impl(Some(sleep_impl)) + .build() + .unwrap(); + + let mut timeout_config = CloneableLayer::new("timeout"); timeout_config.store_put(TimeoutConfig::builder().build()); - timeout_config.set_sleep_impl(Some(sleep_impl)); - cfg.push_layer(timeout_config); + let cfg = ConfigBag::of_layers(vec![timeout_config.into()]); + let maybe_timeout = + MaybeTimeoutConfig::new(&runtime_components, &cfg, TimeoutKind::Operation); underlying_future - .maybe_timeout(&cfg, TimeoutKind::Operation) + .maybe_timeout(maybe_timeout) .await .expect("success"); @@ -229,19 +221,21 @@ mod tests { let now = tokio::time::Instant::now(); tokio::time::pause(); - let mut cfg = ConfigBag::base(); - let mut timeout_config = Layer::new("timeout"); + let runtime_components = RuntimeComponentsBuilder::for_tests() + .with_sleep_impl(Some(sleep_impl)) + .build() + .unwrap(); + let mut timeout_config = CloneableLayer::new("timeout"); timeout_config.store_put( TimeoutConfig::builder() .operation_timeout(Duration::from_millis(250)) .build(), ); - timeout_config.set_sleep_impl(Some(sleep_impl)); - cfg.push_layer(timeout_config); + let cfg = ConfigBag::of_layers(vec![timeout_config.into()]); - let result = underlying_future - .maybe_timeout(&cfg, TimeoutKind::Operation) - .await; + let maybe_timeout = + MaybeTimeoutConfig::new(&runtime_components, &cfg, TimeoutKind::Operation); + let result = underlying_future.maybe_timeout(maybe_timeout).await; let err = result.expect_err("should have timed out"); assert_eq!(format!("{:?}", err), "TimeoutError(TimeoutError { source: MaybeTimeoutError { kind: Operation, duration: 250ms } })"); diff --git a/aws/rust-runtime/aws-credential-types/src/cache/expiring_cache.rs b/rust-runtime/aws-smithy-runtime/src/expiring_cache.rs similarity index 85% rename from aws/rust-runtime/aws-credential-types/src/cache/expiring_cache.rs rename to rust-runtime/aws-smithy-runtime/src/expiring_cache.rs index 67556aad9b3..efa75aae01c 100644 --- a/aws/rust-runtime/aws-credential-types/src/cache/expiring_cache.rs +++ b/rust-runtime/aws-smithy-runtime/src/expiring_cache.rs @@ -46,7 +46,7 @@ where } } - #[cfg(test)] + #[cfg(all(test, feature = "client", feature = "http-auth"))] async fn get(&self) -> Option where T: Clone, @@ -102,17 +102,19 @@ fn expired(expiration: SystemTime, buffer_time: Duration, now: SystemTime) -> bo now >= (expiration - buffer_time) } -#[cfg(test)] +#[cfg(all(test, feature = "client", feature = "http-auth"))] mod tests { use super::{expired, ExpiringCache}; - use crate::{provider::error::CredentialsError, Credentials}; + use aws_smithy_runtime_api::box_error::BoxError; + use aws_smithy_runtime_api::client::identity::http::Token; + use aws_smithy_runtime_api::client::identity::Identity; use std::time::{Duration, SystemTime}; use tracing_test::traced_test; - fn credentials(expired_secs: u64) -> Result<(Credentials, SystemTime), CredentialsError> { - let expiry = epoch_secs(expired_secs); - let creds = Credentials::new("test", "test", None, Some(expiry), "test"); - Ok((creds, expiry)) + fn identity(expired_secs: u64) -> Result<(Identity, SystemTime), BoxError> { + let expiration = epoch_secs(expired_secs); + let identity = Identity::new(Token::new("test", Some(expiration)), Some(expiration)); + Ok((identity, expiration)) } fn epoch_secs(secs: u64) -> SystemTime { @@ -136,11 +138,11 @@ mod tests { .await .is_none()); - cache - .get_or_load(|| async { credentials(100) }) - .await - .unwrap(); - assert_eq!(Some(epoch_secs(100)), cache.get().await.unwrap().expiry()); + cache.get_or_load(|| async { identity(100) }).await.unwrap(); + assert_eq!( + Some(epoch_secs(100)), + cache.get().await.unwrap().expiration() + ); // It should not clear the credentials if they're not expired assert_eq!( @@ -149,7 +151,7 @@ mod tests { .yield_or_clear_if_expired(epoch_secs(10)) .await .unwrap() - .expiry() + .expiration() ); // It should clear the credentials if they're expired diff --git a/rust-runtime/aws-smithy-runtime/src/lib.rs b/rust-runtime/aws-smithy-runtime/src/lib.rs index cd4364a9b35..3a7974e9b5d 100644 --- a/rust-runtime/aws-smithy-runtime/src/lib.rs +++ b/rust-runtime/aws-smithy-runtime/src/lib.rs @@ -12,15 +12,21 @@ //! - `test-util`: Enables utilities for unit tests. DO NOT ENABLE IN PRODUCTION. #![warn( - // missing_docs, + missing_docs, rustdoc::missing_crate_level_docs, unreachable_pub, rust_2018_idioms )] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] /// Runtime support logic for generated clients. +#[cfg(feature = "client")] pub mod client; +/// Cache for entries that have an expiration time. +pub mod expiring_cache; + +/// A data structure for persisting and sharing state between multiple clients. pub mod static_partition_map; /// General testing utilities. diff --git a/rust-runtime/aws-smithy-runtime/src/static_partition_map.rs b/rust-runtime/aws-smithy-runtime/src/static_partition_map.rs index 10b0070ccfa..2f70869f355 100644 --- a/rust-runtime/aws-smithy-runtime/src/static_partition_map.rs +++ b/rust-runtime/aws-smithy-runtime/src/static_partition_map.rs @@ -77,6 +77,7 @@ pub struct StaticPartitionMap { } impl StaticPartitionMap { + /// Creates a new `StaticPartitionMap`. pub const fn new() -> Self { Self { inner: OnceCell::new(), @@ -102,18 +103,20 @@ where K: Eq + Hash, V: Clone, { + /// Gets the value for the given partition key. #[must_use] pub fn get(&self, partition_key: K) -> Option { self.get_or_init_inner().get(&partition_key).cloned() } + /// Gets the value for the given partition key, initializing it with `init` if it doesn't exist. #[must_use] - pub fn get_or_init(&self, partition_key: K, f: F) -> V + pub fn get_or_init(&self, partition_key: K, init: F) -> V where F: FnOnce() -> V, { let mut inner = self.get_or_init_inner(); - let v = inner.entry(partition_key).or_insert_with(f); + let v = inner.entry(partition_key).or_insert_with(init); v.clone() } } @@ -123,6 +126,7 @@ where K: Eq + Hash, V: Clone + Default, { + /// Gets the value for the given partition key, initializing it if it doesn't exist. #[must_use] pub fn get_or_init_default(&self, partition_key: K) -> V { self.get_or_init(partition_key, V::default) diff --git a/rust-runtime/aws-smithy-runtime/src/test_util.rs b/rust-runtime/aws-smithy-runtime/src/test_util.rs index b3ec5e5dfb3..5edd1dfcbe5 100644 --- a/rust-runtime/aws-smithy-runtime/src/test_util.rs +++ b/rust-runtime/aws-smithy-runtime/src/test_util.rs @@ -5,3 +5,5 @@ /// Utility for capturing and displaying logs during a unit test. pub mod capture_test_logs; + +mod assertions; diff --git a/rust-runtime/aws-smithy-runtime/src/test_util/assertions.rs b/rust-runtime/aws-smithy-runtime/src/test_util/assertions.rs new file mode 100644 index 00000000000..de35c053b4f --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/src/test_util/assertions.rs @@ -0,0 +1,57 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/// Asserts that a given string value `$str` contains a substring `$expected`. +/// +/// This macro can also take a custom panic message with formatting. +#[macro_export] +macro_rules! assert_str_contains { + ($str:expr, $expected:expr) => { + assert_str_contains!($str, $expected, "") + }; + ($str:expr, $expected:expr, $($fmt_args:tt)+) => {{ + let s = $str; + let expected = $expected; + if !s.contains(&expected) { + panic!( + "assertion failed: `str.contains(expected)`\n{:>8}: {expected}\n{:>8}: {s}\n{}", + "expected", + "str", + ::std::fmt::format(::std::format_args!($($fmt_args)+)), + ); + } + }}; +} + +#[cfg(test)] +mod tests { + use std::panic::{catch_unwind, UnwindSafe}; + + fn expect_panic(f: impl FnOnce() -> () + UnwindSafe) -> String { + *catch_unwind(f) + .expect_err("it should fail") + .downcast::() + .expect("it should be a string") + } + + #[test] + fn assert_str_contains() { + assert_str_contains!("foobar", "bar"); + assert_str_contains!("foobar", "o"); + + assert_eq!( + "assertion failed: `str.contains(expected)`\nexpected: not-in-it\n str: foobar\n", + expect_panic(|| assert_str_contains!("foobar", "not-in-it")) + ); + assert_eq!( + "assertion failed: `str.contains(expected)`\nexpected: not-in-it\n str: foobar\nsome custom message", + expect_panic(|| assert_str_contains!("foobar", "not-in-it", "some custom message")) + ); + assert_eq!( + "assertion failed: `str.contains(expected)`\nexpected: not-in-it\n str: foobar\nsome custom message with formatting", + expect_panic(|| assert_str_contains!("foobar", "not-in-it", "some custom message with {}", "formatting")) + ); + } +} diff --git a/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs b/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs index a25c97c42f8..86d31d43bbc 100644 --- a/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs +++ b/rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs @@ -10,12 +10,6 @@ use tracing::subscriber::DefaultGuard; use tracing::Level; use tracing_subscriber::fmt::TestWriter; -struct Tee { - buf: Arc>>, - quiet: bool, - inner: W, -} - /// A guard that resets log capturing upon being dropped. #[derive(Debug)] pub struct LogCaptureGuard(DefaultGuard); @@ -44,13 +38,24 @@ pub fn capture_test_logs() -> (LogCaptureGuard, Rx) { (LogCaptureGuard(guard), rx) } +/// Receiver for the captured logs. pub struct Rx(Arc>>); impl Rx { + /// Returns the captured logs as a string. + /// + /// # Panics + /// This will panic if the logs are not valid UTF-8. pub fn contents(&self) -> String { String::from_utf8(self.0.lock().unwrap().clone()).unwrap() } } +struct Tee { + buf: Arc>>, + quiet: bool, + inner: W, +} + impl Tee { fn stdout() -> (Self, Rx) { let buf: Arc>> = Default::default(); @@ -78,7 +83,8 @@ where fn write(&mut self, buf: &[u8]) -> std::io::Result { self.buf.lock().unwrap().extend_from_slice(buf); if !self.quiet { - self.inner.write(buf) + self.inner.write_all(buf)?; + Ok(buf.len()) } else { Ok(buf.len()) } diff --git a/rust-runtime/aws-smithy-client/test-data/example.com.json b/rust-runtime/aws-smithy-runtime/test-data/example.com.json similarity index 100% rename from rust-runtime/aws-smithy-client/test-data/example.com.json rename to rust-runtime/aws-smithy-runtime/test-data/example.com.json diff --git a/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs new file mode 100644 index 00000000000..ca2a3c77ce0 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs @@ -0,0 +1,313 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#![cfg(all( + feature = "client", + feature = "wire-mock", + feature = "connector-hyper-0-14-x", +))] + +use ::aws_smithy_runtime::client::retries::classifiers::{ + HttpStatusCodeClassifier, TransientErrorClassifier, +}; +use aws_smithy_async::rt::sleep::TokioSleep; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; +use aws_smithy_runtime::client::http::test_util::wire::{ + RecordedEvent, ReplayedEvent, WireMockServer, +}; +use aws_smithy_runtime::client::orchestrator::operation::Operation; +use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs; +use aws_smithy_runtime::{ev, match_events}; +use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext; +use aws_smithy_runtime_api::client::orchestrator::OrchestratorError; +use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction}; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, ReconnectMode, RetryConfig}; +use aws_smithy_types::timeout::TimeoutConfig; +use hyper_0_14::client::Builder as HyperBuilder; +use std::fmt; +use std::time::Duration; + +const END_OF_TEST: &str = "end_of_test"; + +#[derive(Debug)] +struct OperationError(ErrorKind); + +impl fmt::Display for OperationError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self) + } +} + +impl ProvideErrorKind for OperationError { + fn retryable_error_kind(&self) -> Option { + Some(self.0) + } + + fn code(&self) -> Option<&str> { + None + } +} + +impl std::error::Error for OperationError {} + +#[derive(Debug)] +struct TestRetryClassifier; + +impl ClassifyRetry for TestRetryClassifier { + fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction { + tracing::info!("classifying retry for {ctx:?}"); + // Check for a result + let output_or_error = ctx.output_or_error(); + // Check for an error + let error = match output_or_error { + Some(Ok(_)) | None => return RetryAction::NoActionIndicated, + Some(Err(err)) => err, + }; + + let action = if let Some(err) = error.as_operation_error() { + tracing::info!("its an operation error: {err:?}"); + let err = err.downcast_ref::().unwrap(); + RetryAction::retryable_error(err.0) + } else { + tracing::info!("its something else... using other classifiers"); + let action = TransientErrorClassifier::::new().classify_retry(ctx); + if action == RetryAction::NoActionIndicated { + HttpStatusCodeClassifier::default().classify_retry(ctx) + } else { + action + } + }; + + tracing::info!("classified as {action:?}"); + action + } + + fn name(&self) -> &'static str { + "test" + } +} + +async fn h1_and_h2(events: Vec, match_clause: impl Fn(&[RecordedEvent])) { + wire_level_test( + events.clone(), + |_b| {}, + ReconnectMode::ReconnectOnTransientError, + &match_clause, + ) + .await; + wire_level_test( + events, + |b| { + b.http2_only(true); + }, + ReconnectMode::ReconnectOnTransientError, + match_clause, + ) + .await; + tracing::info!("h2 ok!"); +} + +/// Repeatedly send test operation until `end_of_test` is received +/// +/// When the test is over, match_clause is evaluated +async fn wire_level_test( + events: Vec, + hyper_builder_settings: impl Fn(&mut HyperBuilder), + reconnect_mode: ReconnectMode, + match_clause: impl Fn(&[RecordedEvent]), +) { + let mut hyper_builder = hyper_0_14::Client::builder(); + hyper_builder_settings(&mut hyper_builder); + + let mock = WireMockServer::start(events).await; + let http_client = HyperClientBuilder::new() + .hyper_builder(hyper_builder) + .build(hyper_0_14::client::HttpConnector::new_with_resolver( + mock.dns_resolver(), + )); + + let operation = Operation::builder() + .service_name("test") + .operation_name("test") + .no_auth() + .endpoint_url(&mock.endpoint_url()) + .http_client(http_client) + .timeout_config( + TimeoutConfig::builder() + .operation_attempt_timeout(Duration::from_millis(100)) + .build(), + ) + .standard_retry(&RetryConfig::standard().with_reconnect_mode(reconnect_mode)) + .retry_classifier(TestRetryClassifier) + .sleep_impl(TokioSleep::new()) + .with_connection_poisoning() + .serializer({ + let endpoint_url = mock.endpoint_url(); + move |_| { + let request = http::Request::builder() + .uri(endpoint_url.clone()) + // Make the body non-replayable since we don't actually want to retry + .body(SdkBody::from_body_0_4(SdkBody::from("body"))) + .unwrap() + .try_into() + .unwrap(); + tracing::info!("serializing request: {request:?}"); + Ok(request) + } + }) + .deserializer(|response| { + tracing::info!("deserializing response: {:?}", response); + match response.status() { + s if s.is_success() => { + Ok(String::from_utf8(response.body().bytes().unwrap().into()).unwrap()) + } + s if s.is_client_error() => Err(OrchestratorError::operation(OperationError( + ErrorKind::ServerError, + ))), + s if s.is_server_error() => Err(OrchestratorError::operation(OperationError( + ErrorKind::TransientError, + ))), + _ => panic!("unexpected status: {}", response.status()), + } + }) + .build(); + + let mut iteration = 0; + loop { + tracing::info!("iteration {iteration}..."); + match operation.invoke(()).await { + Ok(resp) => { + tracing::info!("response: {:?}", resp); + if resp == END_OF_TEST { + break; + } + } + Err(e) => tracing::info!("error: {:?}", e), + } + iteration += 1; + if iteration > 50 { + panic!("probably an infinite loop; no satisfying 'end_of_test' response received"); + } + } + let events = mock.events(); + match_clause(&events); + mock.shutdown(); +} + +#[tokio::test] +async fn non_transient_errors_no_reconnect() { + let _logs = capture_test_logs(); + h1_and_h2( + vec![ + ReplayedEvent::status(400), + ReplayedEvent::with_body(END_OF_TEST), + ], + match_events!(ev!(dns), ev!(connect), ev!(http(400)), ev!(http(200))), + ) + .await +} + +#[tokio::test] +async fn reestablish_dns_on_503() { + let _logs = capture_test_logs(); + h1_and_h2( + vec![ + ReplayedEvent::status(503), + ReplayedEvent::status(503), + ReplayedEvent::status(503), + ReplayedEvent::with_body(END_OF_TEST), + ], + match_events!( + // first request + ev!(dns), + ev!(connect), + ev!(http(503)), + // second request + ev!(dns), + ev!(connect), + ev!(http(503)), + // third request + ev!(dns), + ev!(connect), + ev!(http(503)), + // all good + ev!(dns), + ev!(connect), + ev!(http(200)) + ), + ) + .await; +} + +#[tokio::test] +async fn connection_shared_on_success() { + let _logs = capture_test_logs(); + h1_and_h2( + vec![ + ReplayedEvent::ok(), + ReplayedEvent::ok(), + ReplayedEvent::status(503), + ReplayedEvent::with_body(END_OF_TEST), + ], + match_events!( + ev!(dns), + ev!(connect), + ev!(http(200)), + ev!(http(200)), + ev!(http(503)), + ev!(dns), + ev!(connect), + ev!(http(200)) + ), + ) + .await; +} + +#[tokio::test] +async fn no_reconnect_when_disabled() { + let _logs = capture_test_logs(); + wire_level_test( + vec![ + ReplayedEvent::status(503), + ReplayedEvent::with_body(END_OF_TEST), + ], + |_b| {}, + ReconnectMode::ReuseAllConnections, + match_events!(ev!(dns), ev!(connect), ev!(http(503)), ev!(http(200))), + ) + .await; +} + +#[tokio::test] +async fn connection_reestablished_after_timeout() { + let _logs = capture_test_logs(); + h1_and_h2( + vec![ + ReplayedEvent::ok(), + ReplayedEvent::Timeout, + ReplayedEvent::ok(), + ReplayedEvent::Timeout, + ReplayedEvent::with_body(END_OF_TEST), + ], + match_events!( + // first connection + ev!(dns), + ev!(connect), + ev!(http(200)), + // reuse but got a timeout + ev!(timeout), + // so we reconnect + ev!(dns), + ev!(connect), + ev!(http(200)), + ev!(timeout), + ev!(dns), + ev!(connect), + ev!(http(200)) + ), + ) + .await; +} diff --git a/rust-runtime/aws-smithy-runtime/tests/stalled_stream_performance.rs b/rust-runtime/aws-smithy-runtime/tests/stalled_stream_performance.rs new file mode 100644 index 00000000000..70211cfe527 --- /dev/null +++ b/rust-runtime/aws-smithy-runtime/tests/stalled_stream_performance.rs @@ -0,0 +1,115 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +#![cfg(all(feature = "client", feature = "test-util"))] + +use aws_smithy_async::rt::sleep::TokioSleep; +use aws_smithy_async::time::{SystemTimeSource, TimeSource}; +use aws_smithy_runtime::client::http::body::minimum_throughput::MinimumThroughputBody; +use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig; +use aws_smithy_types::body::SdkBody; +use aws_smithy_types::byte_stream::ByteStream; +use bytes::{BufMut, Bytes, BytesMut}; +use hyper_0_14::server::conn::AddrStream; +use hyper_0_14::service::{make_service_fn, service_fn, Service}; +use hyper_0_14::{Body, Server}; +use std::convert::Infallible; +use std::net::TcpListener; +use std::time::Duration; + +fn make_block(sz: usize) -> Bytes { + let mut b = BytesMut::with_capacity(sz); + b.put_bytes(1, sz); + b.freeze() +} + +// TODO(postGA): convert this to an actual benchmark +// This test evaluates streaming 1GB of data over the loopback with and without the body wrapper +// enabled. After optimizations, the body wrapper seems to make minimal differences +// NOTE: make sure you run this test in release mode to get a sensible result +#[tokio::test] +#[ignore] +async fn stalled_stream_performance() { + // 1GB + let data_size = 1_000_000_000; + // observed block size during actual HTTP requests + let block_size = 16384; + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let make_service = make_service_fn(move |_connection: &AddrStream| async move { + Ok::<_, Infallible>(service_fn( + move |_: http::Request| async move { + let (mut sender, body) = hyper_0_14::Body::channel(); + tokio::task::spawn(async move { + for _i in 0..(data_size / block_size) { + sender + .send_data(make_block(block_size)) + .await + .expect("failed to write data"); + } + }); + Ok::<_, Infallible>(http::Response::new(body)) + }, + )) + }); + let addr = format!("http://localhost:{}", listener.local_addr().unwrap().port()); + let server = Server::from_tcp(listener).unwrap().serve(make_service); + tokio::spawn(server); + + let mut no_wrapping = vec![]; + let mut wrapping = vec![]; + let runs = 10; + for _i in 0..runs { + no_wrapping.push(make_request(&addr, false).await); + wrapping.push(make_request(&addr, true).await); + } + println!( + "Average w/ wrapping: {}", + wrapping.iter().map(|it| it.as_millis() as f64).sum::() / runs as f64 + ); + println!( + "Average w/o wrapping: {}", + no_wrapping + .iter() + .map(|it: &Duration| it.as_millis() as f64) + .sum::() + / runs as f64 + ) +} + +async fn make_request(address: &str, wrap_body: bool) -> Duration { + let mut client = hyper_0_14::Client::new(); + let req = ::http::Request::builder() + .uri(address) + .body(Body::empty()) + .unwrap(); + let resp = client.call(req).await; + let body = resp.unwrap().into_body(); + let mut body = SdkBody::from_body_0_4(body); + if wrap_body { + body = body.map_preserve_contents(|body| { + let time_source = SystemTimeSource::new(); + let sleep = TokioSleep::new(); + let opts = StalledStreamProtectionConfig::enabled().build(); + let mtb = MinimumThroughputBody::new(time_source, sleep, body, opts.into()); + SdkBody::from_body_0_4(mtb) + }); + } + + let sdk_body = ByteStream::new(body); + let ts = SystemTimeSource::new(); + let start = ts.now(); + // this a slow way to count total bytes, but we need to actually read the bytes into segments + // otherwise some of our code seems to be optimized away + let total_bytes = sdk_body + .collect() + .await + .unwrap() + .into_segments() + .map(|seg| seg.len()) + .sum::(); + println!("total: {:?}", total_bytes); + let end = ts.now(); + end.duration_since(start).unwrap() +} diff --git a/rust-runtime/aws-smithy-types-convert/Cargo.toml b/rust-runtime/aws-smithy-types-convert/Cargo.toml index f657571a481..e205cf446ff 100644 --- a/rust-runtime/aws-smithy-types-convert/Cargo.toml +++ b/rust-runtime/aws-smithy-types-convert/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team "] description = "Conversion of types from aws-smithy-types to other libraries." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] convert-chrono = ["aws-smithy-types", "chrono"] @@ -13,7 +13,7 @@ convert-time = ["aws-smithy-types", "time"] [dependencies] aws-smithy-types = { path = "../aws-smithy-types", optional = true } -chrono = { version = "0.4.23", optional = true, default-features = false, features = ["std"] } +chrono = { version = "0.4.26", optional = true, default-features = false, features = ["std"] } time = { version = "0.3.4", optional = true } [package.metadata.docs.rs] diff --git a/rust-runtime/aws-smithy-types-convert/README.md b/rust-runtime/aws-smithy-types-convert/README.md index de0d5614c60..8fa07cac82e 100644 --- a/rust-runtime/aws-smithy-types-convert/README.md +++ b/rust-runtime/aws-smithy-types-convert/README.md @@ -21,5 +21,5 @@ _Note:_ Conversions to and from [`SystemTime`](https://doc.rust-lang.org/std/tim into [`aws-smithy-types`](https://docs.rs/aws-smithy-types/0.30.0-alpha/aws_smithy_types/date_time/struct.DateTime.html#impl-From%3CSystemTime%3E). -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-types-convert/src/date_time.rs b/rust-runtime/aws-smithy-types-convert/src/date_time.rs index 905dcbfc133..c0859534fff 100644 --- a/rust-runtime/aws-smithy-types-convert/src/date_time.rs +++ b/rust-runtime/aws-smithy-types-convert/src/date_time.rs @@ -136,7 +136,7 @@ impl DateTimeExt for DateTime { self.secs(), self.subsec_nanos() ))), - Some(dt) => Ok(chrono::DateTime::::from_utc(dt, chrono::Utc)), + Some(dt) => Ok(chrono::TimeZone::from_utc_datetime(&chrono::Utc, &dt)), } } diff --git a/rust-runtime/aws-smithy-types/Cargo.toml b/rust-runtime/aws-smithy-types/Cargo.toml index ba4d59bb822..a46f9924fa4 100644 --- a/rust-runtime/aws-smithy-types/Cargo.toml +++ b/rust-runtime/aws-smithy-types/Cargo.toml @@ -8,29 +8,62 @@ authors = [ description = "Types for smithy-rs codegen." edition = "2021" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] +byte-stream-poll-next = [] +http-body-0-4-x = ["dep:http-body-0-4"] +hyper-0-14-x = ["dep:hyper-0-14"] +rt-tokio = [ + "dep:http-body-0-4", + "dep:tokio-util", + "dep:tokio", + "tokio?/rt", + "tokio?/fs", + "tokio?/io-util", + "tokio-util?/io", +] test-util = [] serde-serialize = [] serde-deserialize = [] [dependencies] base64-simd = "0.8" +bytes = "1" +bytes-utils = "0.1" +http = "0.2.3" +http-body-0-4 = { package = "http-body", version = "0.4.4", optional = true } +hyper-0-14 = { package = "hyper", version = "0.14.26", optional = true } itoa = "1.0.0" num-integer = "0.1.44" +pin-project-lite = "0.2.9" +pin-utils = "0.1.0" ryu = "1.0.5" time = { version = "0.3.4", features = ["parsing"] } +# ByteStream internals +futures-core = "0.3.14" +tokio = { version = "1.23.1", optional = true } +tokio-util = { version = "0.7", optional = true } + [dev-dependencies] base64 = "0.13.0" ciborium = { version = "0.2.1" } -criterion = "0.4" +criterion = "0.5" lazy_static = "1.4" proptest = "1" rand = "0.8.4" serde = { version = "1", features = ["derive"] } serde_json = "1" +tokio = { version = "1.23.1", features = [ + "macros", + "rt", + "rt-multi-thread", + "fs", + "io-util", +] } +tokio-stream = "0.1.5" +tempfile = "3.2.0" [package.metadata.docs.rs] all-features = true @@ -38,6 +71,12 @@ targets = ["x86_64-unknown-linux-gnu"] rustdoc-args = ["--cfg", "docsrs"] # End of docs.rs metadata +# make sure to keep crate stability in sync with the second element of the following tuple in +# buildSrc/src/main/kotlin/CrateSet.kt: +# Crate("aws-smithy-types", STABLE_VERSION_PROP_NAME), +[package.metadata.smithy-rs-release-tooling] +stable = true + [[bench]] name = "base64" harness = false diff --git a/rust-runtime/aws-smithy-types/README.md b/rust-runtime/aws-smithy-types/README.md index ba9dcecc177..11a58366ab6 100644 --- a/rust-runtime/aws-smithy-types/README.md +++ b/rust-runtime/aws-smithy-types/README.md @@ -1,9 +1,9 @@ # Fundamental Types for Smithy Services -This crate implements fundmental types shared across all service clients generated -by [smithy-rs](https://github.com/awslabs/smithy-rs). Generally, you should not need to take a direct dependency on this +This crate implements fundamental types shared across all service clients generated +by [smithy-rs](https://github.com/smithy-lang/smithy-rs). Generally, you should not need to take a direct dependency on this crate as service clients should publicly re-export the types when used. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-types/external-types.toml b/rust-runtime/aws-smithy-types/external-types.toml index ff30ccf5ad0..0492777b52b 100644 --- a/rust-runtime/aws-smithy-types/external-types.toml +++ b/rust-runtime/aws-smithy-types/external-types.toml @@ -1,2 +1,14 @@ allowed_external_types = [ + "bytes::bytes::Bytes", + "bytes::buf::buf_impl::Buf", + + # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types + "http_body::Body", + "hyper::body::body::Body", + + # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types + "tokio::io::async_buf_read::AsyncBufRead", + + # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types + "tokio::fs::file::File", ] diff --git a/rust-runtime/aws-smithy-types/src/blob.rs b/rust-runtime/aws-smithy-types/src/blob.rs index 5365b91249f..ab7ae30d3c5 100644 --- a/rust-runtime/aws-smithy-types/src/blob.rs +++ b/rust-runtime/aws-smithy-types/src/blob.rs @@ -43,7 +43,7 @@ mod serde_serialize { S: serde::Serializer, { if serializer.is_human_readable() { - serializer.serialize_str(&crate::base64::encode(&self.inner)) + serializer.serialize_str(&base64::encode(&self.inner)) } else { serializer.serialize_bytes(&self.inner) } diff --git a/rust-runtime/aws-smithy-http/src/body.rs b/rust-runtime/aws-smithy-types/src/body.rs similarity index 60% rename from rust-runtime/aws-smithy-http/src/body.rs rename to rust-runtime/aws-smithy-types/src/body.rs index 32ad205ed23..33e5912a935 100644 --- a/rust-runtime/aws-smithy-http/src/body.rs +++ b/rust-runtime/aws-smithy-types/src/body.rs @@ -6,15 +6,20 @@ //! Types for representing the body of an HTTP request or response use bytes::Bytes; -use http::{HeaderMap, HeaderValue}; -use http_body::{Body, SizeHint}; use pin_project_lite::pin_project; use std::error::Error as StdError; use std::fmt::{self, Debug, Formatter}; +use std::future::poll_fn; use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; +/// This module is named after the `http-body` version number since we anticipate +/// needing to provide equivalent functionality for 1.x of that crate in the future. +/// The name has a suffix `_x` to avoid name collision with a third-party `http-body-0-4`. +#[cfg(feature = "http-body-0-4-x")] +pub mod http_body_0_4_x; + /// A generic, boxed error that's `Send` and `Sync` pub type Error = Box; @@ -35,6 +40,7 @@ pin_project! { // In the event of retry, this function will be called to generate a new body. See // [`try_clone()`](SdkBody::try_clone) rebuild: Option Inner) + Send + Sync>>, + bytes_contents: Option } } @@ -48,7 +54,10 @@ impl Debug for SdkBody { } /// A boxed generic HTTP body that, when consumed, will result in [`Bytes`] or an [`Error`]. -pub type BoxBody = http_body::combinators::BoxBody; +enum BoxBody { + #[cfg(feature = "http-body-0-4-x")] + HttpBody04(http_body_0_4::combinators::BoxBody), +} pin_project! { #[project = InnerProj] @@ -58,14 +67,9 @@ pin_project! { inner: Option }, // A streaming body - Streaming { - #[pin] - inner: hyper::Body - }, - // Also a streaming body Dyn { #[pin] - inner: BoxBody + inner: BoxBody, }, /// When a streaming body is transferred out to a stream parser, the body is replaced with @@ -79,24 +83,13 @@ impl Debug for Inner { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match &self { Inner::Once { inner: once } => f.debug_tuple("Once").field(once).finish(), - Inner::Streaming { inner: streaming } => { - f.debug_tuple("Streaming").field(streaming).finish() - } - Inner::Taken => f.debug_tuple("Taken").finish(), Inner::Dyn { .. } => write!(f, "BoxBody"), + Inner::Taken => f.debug_tuple("Taken").finish(), } } } impl SdkBody { - /// Construct an SdkBody from a Boxed implementation of http::Body - pub fn from_dyn(body: BoxBody) -> Self { - Self { - inner: Inner::Dyn { inner: body }, - rebuild: None, - } - } - /// Construct an explicitly retryable SDK body /// /// _Note: This is probably not what you want_ @@ -110,6 +103,7 @@ impl SdkBody { SdkBody { inner: initial.inner, rebuild: Some(Arc::new(move || f().inner)), + bytes_contents: initial.bytes_contents, } } @@ -119,6 +113,7 @@ impl SdkBody { Self { inner: Inner::Taken, rebuild: None, + bytes_contents: None, } } @@ -127,12 +122,18 @@ impl SdkBody { Self { inner: Inner::Once { inner: None }, rebuild: Some(Arc::new(|| Inner::Once { inner: None })), + bytes_contents: Some(Bytes::new()), } } - fn poll_inner( + pub(crate) async fn next(&mut self) -> Option> { + let mut me = Pin::new(self); + poll_fn(|cx| me.as_mut().poll_next(cx)).await + } + + pub(crate) fn poll_next( self: Pin<&mut Self>, - cx: &mut Context<'_>, + #[allow(unused)] cx: &mut Context<'_>, ) -> Poll>> { let this = self.project(); match this.inner.project() { @@ -144,23 +145,51 @@ impl SdkBody { None => Poll::Ready(None), } } - InnerProj::Streaming { inner: body } => body.poll_data(cx).map_err(|e| e.into()), - InnerProj::Dyn { inner: box_body } => box_body.poll_data(cx), + InnerProj::Dyn { inner: body } => match body.get_mut() { + #[cfg(feature = "http-body-0-4-x")] + BoxBody::HttpBody04(box_body) => { + use http_body_0_4::Body; + Pin::new(box_body).poll_data(cx) + } + #[allow(unreachable_patterns)] + _ => unreachable!( + "enabling `http-body-0-4-x` is the only way to create the `Dyn` variant" + ), + }, InnerProj::Taken => { Poll::Ready(Some(Err("A `Taken` body should never be polled".into()))) } } } + #[cfg(feature = "http-body-0-4-x")] + pub(crate) fn poll_next_trailers( + self: Pin<&mut Self>, + #[allow(unused)] cx: &mut Context<'_>, + ) -> Poll>, Error>> { + let this = self.project(); + match this.inner.project() { + InnerProj::Once { .. } => Poll::Ready(Ok(None)), + InnerProj::Dyn { inner } => match inner.get_mut() { + BoxBody::HttpBody04(box_body) => { + use http_body_0_4::Body; + Pin::new(box_body).poll_trailers(cx) + } + }, + InnerProj::Taken => Poll::Ready(Err( + "A `Taken` body should never be polled for trailers".into(), + )), + } + } + /// If possible, return a reference to this body as `&[u8]` /// /// If this SdkBody is NOT streaming, this will return the byte slab /// If this SdkBody is streaming, this will return `None` pub fn bytes(&self) -> Option<&[u8]> { - match &self.inner { - Inner::Once { inner: Some(b) } => Some(b), - Inner::Once { inner: None } => Some(&[]), - _ => None, + match &self.bytes_contents { + Some(b) => Some(b), + None => None, } } @@ -172,6 +201,7 @@ impl SdkBody { Self { inner: next, rebuild: self.rebuild.clone(), + bytes_contents: self.bytes_contents.clone(), } }) } @@ -179,7 +209,53 @@ impl SdkBody { /// Return the length, in bytes, of this SdkBody. If this returns `None`, then the body does not /// have a known length. pub fn content_length(&self) -> Option { - http_body::Body::size_hint(self).exact() + match self.bounds_on_remaining_length() { + (lo, Some(hi)) if lo == hi => Some(lo), + _ => None, + } + } + + #[allow(dead_code)] // used by a feature-gated `http-body`'s trait method + pub(crate) fn is_end_stream(&self) -> bool { + match &self.inner { + Inner::Once { inner: None } => true, + Inner::Once { inner: Some(bytes) } => bytes.is_empty(), + Inner::Dyn { inner: box_body } => match box_body { + #[cfg(feature = "http-body-0-4-x")] + BoxBody::HttpBody04(box_body) => { + use http_body_0_4::Body; + box_body.is_end_stream() + } + #[allow(unreachable_patterns)] + _ => unreachable!( + "enabling `http-body-0-4-x` is the only way to create the `Dyn` variant" + ), + }, + Inner::Taken => true, + } + } + + pub(crate) fn bounds_on_remaining_length(&self) -> (u64, Option) { + match &self.inner { + Inner::Once { inner: None } => (0, Some(0)), + Inner::Once { inner: Some(bytes) } => { + let len = bytes.len() as u64; + (len, Some(len)) + } + Inner::Dyn { inner: box_body } => match box_body { + #[cfg(feature = "http-body-0-4-x")] + BoxBody::HttpBody04(box_body) => { + use http_body_0_4::Body; + let hint = box_body.size_hint(); + (hint.lower(), hint.upper()) + } + #[allow(unreachable_patterns)] + _ => unreachable!( + "enabling `http-body-0-4-x` is the only way to create the `Dyn` variant" + ), + }, + Inner::Taken => (0, Some(0)), + } } /// Given a function to modify an `SdkBody`, run that function against this `SdkBody` before @@ -191,6 +267,25 @@ impl SdkBody { f(self) } } + + /// Update this `SdkBody` with `map`. **This function MUST NOT alter the data of the body.** + /// + /// This function is useful for adding metadata like progress tracking to an [`SdkBody`] that + /// does not alter the actual byte data. If your mapper alters the contents of the body, use [`SdkBody::map`] + /// instead. + pub fn map_preserve_contents( + self, + f: impl Fn(SdkBody) -> SdkBody + Sync + Send + 'static, + ) -> SdkBody { + let contents = self.bytes_contents.clone(); + let mut out = if self.rebuild.is_some() { + SdkBody::retryable(move || f(self.try_clone().unwrap())) + } else { + f(self) + }; + out.bytes_contents = contents; + out + } } impl From<&str> for SdkBody { @@ -201,6 +296,7 @@ impl From<&str> for SdkBody { impl From for SdkBody { fn from(bytes: Bytes) -> Self { + let b = bytes.clone(); SdkBody { inner: Inner::Once { inner: Some(bytes.clone()), @@ -208,15 +304,7 @@ impl From for SdkBody { rebuild: Some(Arc::new(move || Inner::Once { inner: Some(bytes.clone()), })), - } - } -} - -impl From for SdkBody { - fn from(body: hyper::Body) -> Self { - SdkBody { - inner: Inner::Streaming { inner: body }, - rebuild: None, + bytes_contents: Some(b), } } } @@ -239,55 +327,15 @@ impl From<&[u8]> for SdkBody { } } -impl http_body::Body for SdkBody { - type Data = Bytes; - type Error = Error; - - fn poll_data( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll>> { - self.poll_inner(cx) - } - - fn poll_trailers( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - ) -> Poll>, Self::Error>> { - Poll::Ready(Ok(None)) - } - - fn is_end_stream(&self) -> bool { - match &self.inner { - Inner::Once { inner: None } => true, - Inner::Once { inner: Some(bytes) } => bytes.is_empty(), - Inner::Streaming { inner: hyper_body } => hyper_body.is_end_stream(), - Inner::Dyn { inner: box_body } => box_body.is_end_stream(), - Inner::Taken => true, - } - } - - fn size_hint(&self) -> SizeHint { - match &self.inner { - Inner::Once { inner: None } => SizeHint::with_exact(0), - Inner::Once { inner: Some(bytes) } => SizeHint::with_exact(bytes.len() as u64), - Inner::Streaming { inner: hyper_body } => hyper_body.size_hint(), - Inner::Dyn { inner: box_body } => box_body.size_hint(), - Inner::Taken => SizeHint::new(), - } - } -} - #[cfg(test)] mod test { - use crate::body::{BoxBody, SdkBody}; - use http_body::Body; + use crate::body::SdkBody; use std::pin::Pin; #[test] fn valid_size_hint() { - assert_eq!(SdkBody::from("hello").size_hint().exact(), Some(5)); - assert_eq!(SdkBody::from("").size_hint().exact(), Some(0)); + assert_eq!(SdkBody::from("hello").content_length(), Some(5)); + assert_eq!(SdkBody::from("").content_length(), Some(0)); } #[allow(clippy::bool_assert_comparison)] @@ -301,9 +349,9 @@ mod test { async fn http_body_consumes_data() { let mut body = SdkBody::from("hello!"); let mut body = Pin::new(&mut body); - let data = body.data().await; + let data = body.next().await; assert!(data.is_some()); - let data = body.data().await; + let data = body.next().await; assert!(data.is_none()); } @@ -312,31 +360,14 @@ mod test { // Its important to avoid sending empty chunks of data to avoid H2 data frame problems let mut body = SdkBody::from(""); let mut body = Pin::new(&mut body); - let data = body.data().await; + let data = body.next().await; assert!(data.is_none()); } #[test] fn sdkbody_debug_once() { let body = SdkBody::from("123"); - // actually don't really care what the debug impl is, just that it doesn't crash - let _ = format!("{:?}", body); - } - - #[test] - fn sdkbody_debug_dyn() { - let hyper_body = hyper::Body::channel().1; - let body = SdkBody::from_dyn(BoxBody::new(hyper_body.map_err(|e| e.into()))); - // actually don't really care what the debug impl is, just that it doesn't crash - let _ = format!("{:?}", body); - } - - #[test] - fn sdkbody_debug_hyper() { - let hyper_body = hyper::Body::channel().1; - let body = SdkBody::from(hyper_body); - // actually don't really care what the debug impl is, just that it doesn't crash - let _ = format!("{:?}", body); + assert!(format!("{:?}", body).contains("Once")); } #[test] diff --git a/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs b/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs new file mode 100644 index 00000000000..a6719d1fa2d --- /dev/null +++ b/rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs @@ -0,0 +1,91 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::body::{BoxBody, Error, Inner, SdkBody}; +use bytes::Bytes; +use std::pin::Pin; +use std::task::{Context, Poll}; + +impl SdkBody { + /// Construct an `SdkBody` from a type that implements [`http_body_0_4::Body`](http_body_0_4::Body). + /// + /// _Note: This is only available with `http-body-0-4-x` enabled._ + pub fn from_body_0_4(body: T) -> Self + where + T: http_body_0_4::Body + Send + Sync + 'static, + E: Into + 'static, + { + Self { + inner: Inner::Dyn { + inner: BoxBody::HttpBody04(http_body_0_4::combinators::BoxBody::new( + body.map_err(Into::into), + )), + }, + rebuild: None, + bytes_contents: None, + } + } +} + +#[cfg(feature = "hyper-0-14-x")] +impl From for SdkBody { + fn from(body: hyper_0_14::Body) -> Self { + SdkBody::from_body_0_4(body) + } +} + +impl http_body_0_4::Body for SdkBody { + type Data = Bytes; + type Error = Error; + + fn poll_data( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> { + self.poll_next(cx) + } + + fn poll_trailers( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>, Self::Error>> { + self.poll_next_trailers(cx) + } + + fn is_end_stream(&self) -> bool { + self.is_end_stream() + } + + fn size_hint(&self) -> http_body_0_4::SizeHint { + let mut result = http_body_0_4::SizeHint::default(); + let (lower, upper) = self.bounds_on_remaining_length(); + result.set_lower(lower); + if let Some(u) = upper { + result.set_upper(u) + } + result + } +} + +#[cfg(test)] +mod tests { + use crate::body::SdkBody; + + #[test] + fn map_preserve_preserves_bytes_hint() { + let initial = SdkBody::from("hello!"); + assert_eq!(initial.bytes(), Some(b"hello!".as_slice())); + + let new_body = initial.map_preserve_contents(SdkBody::from_body_0_4); + assert_eq!(new_body.bytes(), Some(b"hello!".as_slice())); + } + + #[test] + fn sdkbody_debug_dyn() { + let hyper_body = hyper_0_14::Body::channel().1; + let body = SdkBody::from_body_0_4(hyper_body); + assert!(format!("{:?}", body).contains("BoxBody")); + } +} diff --git a/rust-runtime/aws-smithy-http/src/byte_stream.rs b/rust-runtime/aws-smithy-types/src/byte_stream.rs similarity index 70% rename from rust-runtime/aws-smithy-http/src/byte_stream.rs rename to rust-runtime/aws-smithy-types/src/byte_stream.rs index e067018a9db..2721b1b6b21 100644 --- a/rust-runtime/aws-smithy-http/src/byte_stream.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream.rs @@ -12,7 +12,7 @@ //! //! ### Writing a ByteStream into a file: //! ```no_run -//! use aws_smithy_http::byte_stream::ByteStream; +//! use aws_smithy_types::byte_stream::ByteStream; //! use std::error::Error; //! use tokio::fs::File; //! use tokio::io::AsyncWriteExt; @@ -34,7 +34,7 @@ //! ### Converting a ByteStream into Bytes //! ```no_run //! use bytes::Bytes; -//! use aws_smithy_http::byte_stream::ByteStream; +//! use aws_smithy_types::byte_stream::ByteStream; //! use std::error::Error; //! struct SynthesizeSpeechOutput { //! audio_stream: ByteStream, @@ -48,11 +48,12 @@ //! //! ### Stream a ByteStream into a file //! The previous example is recommended in cases where loading the entire file into memory first is desirable. For extremely large -//! files, you may wish to stream the data directly to the file system, chunk by chunk. This is posible using the `futures::Stream` implementation. +//! files, you may wish to stream the data directly to the file system, chunk by chunk. +//! This is possible using the [`.next()`](crate::byte_stream::ByteStream::next) method. //! //! ```no_run //! use bytes::{Buf, Bytes}; -//! use aws_smithy_http::byte_stream::ByteStream; +//! use aws_smithy_types::byte_stream::ByteStream; //! use std::error::Error; //! use tokio::fs::File; //! use tokio::io::AsyncWriteExt; @@ -82,7 +83,7 @@ //! ```no_run //! # #[cfg(feature = "rt-tokio")] //! # { -//! use aws_smithy_http::byte_stream::ByteStream; +//! use aws_smithy_types::byte_stream::ByteStream; //! use std::path::Path; //! struct GetObjectInput { //! body: ByteStream @@ -98,12 +99,12 @@ //! ``` //! //! If you want more control over how the file is read, such as specifying the size of the buffer used to read the file -//! or the length of the file, use an [`FsBuilder`](crate::byte_stream::FsBuilder). +//! or the length of the file, use an `FsBuilder`. //! //! ```no_run //! # #[cfg(feature = "rt-tokio")] //! # { -//! use aws_smithy_http::byte_stream::{ByteStream, Length}; +//! use aws_smithy_types::byte_stream::{ByteStream, Length}; //! use std::path::Path; //! struct GetObjectInput { //! body: ByteStream @@ -126,8 +127,8 @@ use crate::byte_stream::error::Error; use bytes::Buf; use bytes::Bytes; use bytes_utils::SegmentedBuf; -use http_body::Body; use pin_project_lite::pin_project; +use std::future::poll_fn; use std::io::IoSlice; use std::pin::Pin; use std::task::{Context, Poll}; @@ -142,6 +143,12 @@ pub mod error; #[cfg(feature = "rt-tokio")] pub use self::bytestream_util::FsBuilder; +/// This module is named after the `http-body` version number since we anticipate +/// needing to provide equivalent functionality for 1.x of that crate in the future. +/// The name has a suffix `_x` to avoid name collision with a third-party `http-body-0-4`. +#[cfg(feature = "http-body-0-4-x")] +pub mod http_body_0_4_x; + pin_project! { /// Stream of binary data /// @@ -155,8 +162,8 @@ pin_project! { /// [`.collect()`](crate::byte_stream::ByteStream::collect) reads the complete ByteStream into memory and stores it in `AggregatedBytes`, /// a non-contiguous ByteBuffer. /// ```no_run - /// use aws_smithy_http::byte_stream::{ByteStream, AggregatedBytes}; - /// use aws_smithy_http::body::SdkBody; + /// use aws_smithy_types::byte_stream::{ByteStream, AggregatedBytes}; + /// use aws_smithy_types::body::SdkBody; /// use bytes::Buf; /// async fn example() { /// let stream = ByteStream::new(SdkBody::from("hello! This is some data")); @@ -166,9 +173,7 @@ pin_project! { /// println!("first chunk: {:?}", data.chunk()); /// } /// ``` - /// 2. Via [`impl Stream`](futures_core::Stream): - /// - /// _Note: An import of `StreamExt` is required to use `.try_next()`._ + /// 2. Via [`.next()`](crate::byte_stream::ByteStream::next) or [`.try_next()`](crate::byte_stream::ByteStream::try_next): /// /// For use-cases where holding the entire ByteStream in memory is unnecessary, use the /// `Stream` implementation: @@ -181,9 +186,8 @@ pin_project! { /// # pub fn finish(&self) -> u64 { 6 } /// # } /// # } - /// use aws_smithy_http::byte_stream::{ByteStream, AggregatedBytes, error::Error}; - /// use aws_smithy_http::body::SdkBody; - /// use tokio_stream::StreamExt; + /// use aws_smithy_types::byte_stream::{ByteStream, AggregatedBytes, error::Error}; + /// use aws_smithy_types::body::SdkBody; /// /// async fn example() -> Result<(), Error> { /// let mut stream = ByteStream::from(vec![1, 2, 3, 4, 5, 99]); @@ -200,17 +204,16 @@ pin_project! { /// /// _Note: The `rt-tokio` feature must be active to use `.into_async_read()`._ /// - /// It's possible to convert a `ByteStream` into a struct that implements [`tokio::io::AsyncRead`](tokio::io::AsyncRead). - /// Then, you can use pre-existing tools like [`tokio::io::BufReader`](tokio::io::BufReader): + /// It's possible to convert a `ByteStream` into a struct that implements [`tokio::io::AsyncBufRead`](tokio::io::AsyncBufRead). /// ```no_run - /// use aws_smithy_http::byte_stream::ByteStream; - /// use aws_smithy_http::body::SdkBody; - /// use tokio::io::{AsyncBufReadExt, BufReader}; + /// use aws_smithy_types::byte_stream::ByteStream; + /// use aws_smithy_types::body::SdkBody; + /// use tokio::io::AsyncBufReadExt; /// #[cfg(feature = "rt-tokio")] /// async fn example() -> std::io::Result<()> { /// let stream = ByteStream::new(SdkBody::from("hello!\nThis is some data")); - /// // Wrap the stream in a BufReader - /// let buf_reader = BufReader::new(stream.into_async_read()); + /// // Convert the stream to a BufReader + /// let buf_reader = stream.into_async_read(); /// let mut lines = buf_reader.lines(); /// assert_eq!(lines.next_line().await?, Some("hello!".to_owned())); /// assert_eq!(lines.next_line().await?, Some("This is some data".to_owned())); @@ -225,7 +228,7 @@ pin_project! { /// will be converted into `Bytes` enabling a cheap clone during retries. /// ```no_run /// use bytes::Bytes; - /// use aws_smithy_http::byte_stream::ByteStream; + /// use aws_smithy_types::byte_stream::ByteStream; /// let stream = ByteStream::from(vec![1,2,3]); /// let stream = ByteStream::from(Bytes::from_static(b"hello!")); /// ``` @@ -234,7 +237,7 @@ pin_project! { /// ```no_run /// #[cfg(feature = "tokio-rt")] /// # { - /// use aws_smithy_http::byte_stream::ByteStream; + /// use aws_smithy_types::byte_stream::ByteStream; /// let stream = ByteStream::from_path("big_file.csv"); /// # } /// ``` @@ -243,12 +246,13 @@ pin_project! { /// from an SdkBody. **When created from an SdkBody, care must be taken to ensure retriability.** An SdkBody is retryable /// when constructed from in-memory data or when using [`SdkBody::retryable`](crate::body::SdkBody::retryable). /// ```no_run - /// use aws_smithy_http::byte_stream::ByteStream; - /// use aws_smithy_http::body::SdkBody; + /// # use hyper_0_14 as hyper; + /// use aws_smithy_types::byte_stream::ByteStream; + /// use aws_smithy_types::body::SdkBody; /// use bytes::Bytes; /// let (mut tx, channel_body) = hyper::Body::channel(); /// // this will not be retryable because the SDK has no way to replay this stream - /// let stream = ByteStream::new(SdkBody::from(channel_body)); + /// let stream = ByteStream::new(SdkBody::from_body_0_4(channel_body)); /// tx.send_data(Bytes::from_static(b"hello world!")); /// tx.send_data(Bytes::from_static(b"hello again!")); /// // NOTE! You must ensure that `tx` is dropped to ensure that EOF is sent @@ -257,7 +261,7 @@ pin_project! { #[derive(Debug)] pub struct ByteStream { #[pin] - inner: Inner + inner: Inner, } } @@ -276,7 +280,7 @@ impl ByteStream { } } - /// Consumes the ByteStream, returning the wrapped SdkBody + /// Consume the `ByteStream`, returning the wrapped SdkBody. // Backwards compatibility note: Because SdkBody has a dyn variant, // we will always be able to implement this method, even if we stop using // SdkBody as the internal representation @@ -284,6 +288,41 @@ impl ByteStream { self.inner.body } + /// Return the next item in the `ByteStream`. + /// + /// There is also a sibling method [`try_next`](ByteStream::try_next), which returns a `Result, Error>` + /// instead of an `Option>`. + pub async fn next(&mut self) -> Option> { + Some(self.inner.next().await?.map_err(Error::streaming)) + } + + #[cfg(feature = "byte-stream-poll-next")] + /// Attempt to pull out the next value of this stream, returning `None` if the stream is + /// exhausted. + // This should only be used when one needs to implement a trait method like + // `futures_core::stream::Stream::poll_next` on a new-type wrapping a `ByteStream`. + // In general, use the `next` method instead. + pub fn poll_next( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> { + self.project().inner.poll_next(cx).map_err(Error::streaming) + } + + /// Consume and return the next item in the `ByteStream` or return an error if an error is + /// encountered. + /// + /// Similar to the [`next`](ByteStream::next) method, but this returns a `Result, Error>` rather than + /// an `Option>`, making for easy use with the `?` operator. + pub async fn try_next(&mut self) -> Result, Error> { + self.next().await.transpose() + } + + /// Return the bounds on the remaining length of the `ByteStream`. + pub fn size_hint(&self) -> (u64, Option) { + self.inner.size_hint() + } + /// Read all the data from this `ByteStream` into memory /// /// If an error in the underlying stream is encountered, `ByteStreamError` is returned. @@ -292,9 +331,9 @@ impl ByteStream { /// over the network. If a contiguous slice is required, use `into_bytes()`. /// ```no_run /// use bytes::Bytes; - /// use aws_smithy_http::body; - /// use aws_smithy_http::body::SdkBody; - /// use aws_smithy_http::byte_stream::{ByteStream, error::Error}; + /// use aws_smithy_types::body; + /// use aws_smithy_types::body::SdkBody; + /// use aws_smithy_types::byte_stream::{ByteStream, error::Error}; /// async fn get_data() { /// let stream = ByteStream::new(SdkBody::from("hello!")); /// let data: Result = stream.collect().await.map(|data| data.into_bytes()); @@ -309,7 +348,7 @@ impl ByteStream { /// ```no_run /// # #[cfg(feature = "rt-tokio")] /// # { - /// use aws_smithy_http::byte_stream::{ByteStream, Length}; + /// use aws_smithy_types::byte_stream::{ByteStream, Length}; /// /// async fn bytestream_from_file() -> ByteStream { /// let bytestream = ByteStream::read_from() @@ -326,9 +365,8 @@ impl ByteStream { /// # } /// ``` #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub fn read_from() -> FsBuilder { - FsBuilder::new() + pub fn read_from() -> crate::byte_stream::FsBuilder { + crate::byte_stream::FsBuilder::new() } /// Create a ByteStream that streams data from the filesystem @@ -349,51 +387,56 @@ impl ByteStream { /// /// # Examples /// ```no_run - /// use aws_smithy_http::byte_stream::ByteStream; + /// use aws_smithy_types::byte_stream::ByteStream; /// use std::path::Path; /// async fn make_bytestream() -> ByteStream { /// ByteStream::from_path("docs/rows.csv").await.expect("file should be readable") /// } /// ``` #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub async fn from_path(path: impl AsRef) -> Result { - FsBuilder::new().path(path).build().await - } - - /// Create a ByteStream from a file - /// - /// NOTE: This will NOT result in a retryable ByteStream. For a ByteStream that can be retried in the case of - /// upstream failures, use [`ByteStream::from_path`](ByteStream::from_path) - #[deprecated( - since = "0.40.0", - note = "Prefer the more extensible ByteStream::read_from() API" - )] - #[cfg(feature = "rt-tokio")] - #[cfg_attr(docsrs, doc(cfg(feature = "rt-tokio")))] - pub async fn from_file(file: tokio::fs::File) -> Result { - FsBuilder::new().file(file).build().await + pub async fn from_path( + path: impl AsRef, + ) -> Result { + crate::byte_stream::FsBuilder::new() + .path(path) + .build() + .await } #[cfg(feature = "rt-tokio")] - /// Convert this `ByteStream` into a struct that implements [`AsyncRead`](tokio::io::AsyncRead). + /// Convert this `ByteStream` into a struct that implements [`AsyncBufRead`](tokio::io::AsyncBufRead). /// /// # Example /// /// ```rust - /// use tokio::io::{BufReader, AsyncBufReadExt}; - /// use aws_smithy_http::byte_stream::ByteStream; + /// use tokio::io::AsyncBufReadExt; + /// use aws_smithy_types::byte_stream::ByteStream; /// /// # async fn dox(my_bytestream: ByteStream) -> std::io::Result<()> { - /// let mut lines = BufReader::new(my_bytestream.into_async_read()).lines(); + /// let mut lines = my_bytestream.into_async_read().lines(); /// while let Some(line) = lines.next_line().await? { /// // Do something line by line /// } /// # Ok(()) /// # } /// ``` - pub fn into_async_read(self) -> impl tokio::io::AsyncRead { - tokio_util::io::StreamReader::new(self) + pub fn into_async_read(self) -> impl tokio::io::AsyncBufRead { + // The `Stream` trait is currently unstable so we can only use it in private. + // Here, we create a local struct just to enable the trait for `ByteStream` and pass it + // to `StreamReader`. + struct FuturesStreamCompatByteStream(ByteStream); + impl futures_core::stream::Stream for FuturesStreamCompatByteStream { + type Item = Result; + fn poll_next( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll> { + Pin::new(&mut self.0.inner) + .poll_next(cx) + .map_err(Error::streaming) + } + } + tokio_util::io::StreamReader::new(FuturesStreamCompatByteStream(self)) } /// Given a function to modify an [`SdkBody`], run it on the `SdkBody` inside this `Bytestream`. @@ -436,24 +479,6 @@ impl From> for ByteStream { } } -impl From for ByteStream { - fn from(input: hyper::Body) -> Self { - ByteStream::new(SdkBody::from(input)) - } -} - -impl futures_core::stream::Stream for ByteStream { - type Item = Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().inner.poll_next(cx).map_err(Error::streaming) - } - - fn size_hint(&self) -> (usize, Option) { - self.inner.size_hint() - } -} - /// Non-contiguous Binary Data Storage /// /// When data is read from the network, it is read in a sequence of chunks that are not in @@ -512,69 +537,54 @@ impl Buf for AggregatedBytes { } pin_project! { - #[derive(Debug, Clone, PartialEq, Eq)] - struct Inner { + #[derive(Debug)] + struct Inner { #[pin] - body: B, + body: SdkBody, } } -impl Inner { - fn new(body: B) -> Self { +impl Inner { + fn new(body: SdkBody) -> Self { Self { body } } - async fn collect(self) -> Result - where - B: http_body::Body, - { + async fn next(&mut self) -> Option> { + let mut me = Pin::new(self); + poll_fn(|cx| me.as_mut().poll_next(cx)).await + } + + fn poll_next( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + ) -> Poll>> { + self.project().body.poll_next(cx) + } + + async fn collect(self) -> Result { let mut output = SegmentedBuf::new(); let body = self.body; pin_utils::pin_mut!(body); - while let Some(buf) = body.data().await { + while let Some(buf) = body.next().await { output.push(buf?); } Ok(AggregatedBytes(output)) } -} - -const SIZE_HINT_32_BIT_PANIC_MESSAGE: &str = r#" -You're running a 32-bit system and this stream's length is too large to be represented with a usize. -Please limit stream length to less than 4.294Gb or run this program on a 64-bit computer architecture. -"#; -impl futures_core::stream::Stream for Inner -where - B: http_body::Body, -{ - type Item = Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project().body.poll_data(cx) - } - - fn size_hint(&self) -> (usize, Option) { - let size_hint = http_body::Body::size_hint(&self.body); - let lower = size_hint.lower().try_into(); - let upper = size_hint.upper().map(|u| u.try_into()).transpose(); - - match (lower, upper) { - (Ok(lower), Ok(upper)) => (lower, upper), - (Err(_), _) | (_, Err(_)) => { - panic!("{}", SIZE_HINT_32_BIT_PANIC_MESSAGE) - } - } + fn size_hint(&self) -> (u64, Option) { + self.body.bounds_on_remaining_length() } } #[cfg(test)] mod tests { + use crate::body::SdkBody; use crate::byte_stream::Inner; use bytes::Bytes; #[tokio::test] async fn read_from_string_body() { - let body = hyper::Body::from("a simple body"); + let body = SdkBody::from("a simple body"); assert_eq!( Inner::new(body) .collect() @@ -585,63 +595,6 @@ mod tests { ); } - #[tokio::test] - async fn read_from_channel_body() { - let (mut sender, body) = hyper::Body::channel(); - let byte_stream = Inner::new(body); - tokio::spawn(async move { - sender.send_data(Bytes::from("data 1")).await.unwrap(); - sender.send_data(Bytes::from("data 2")).await.unwrap(); - sender.send_data(Bytes::from("data 3")).await.unwrap(); - }); - assert_eq!( - byte_stream.collect().await.expect("no errors").into_bytes(), - Bytes::from("data 1data 2data 3") - ); - } - - #[cfg(feature = "rt-tokio")] - #[tokio::test] - async fn path_based_bytestreams() -> Result<(), Box> { - use super::ByteStream; - use bytes::Buf; - use http_body::Body; - use std::io::Write; - use tempfile::NamedTempFile; - let mut file = NamedTempFile::new()?; - - for i in 0..10000 { - writeln!(file, "Brian was here. Briefly. {}", i)?; - } - let body = ByteStream::from_path(&file).await?.into_inner(); - // assert that a valid size hint is immediately ready - assert_eq!(body.size_hint().exact(), Some(298890)); - let mut body1 = body.try_clone().expect("retryable bodies are cloneable"); - // read a little bit from one of the clones - let some_data = body1 - .data() - .await - .expect("should have some data") - .expect("read should not fail"); - assert!(!some_data.is_empty()); - // make some more clones - let body2 = body.try_clone().expect("retryable bodies are cloneable"); - let body3 = body.try_clone().expect("retryable bodies are cloneable"); - let body2 = ByteStream::new(body2).collect().await?.into_bytes(); - let body3 = ByteStream::new(body3).collect().await?.into_bytes(); - assert_eq!(body2, body3); - assert!(body2.starts_with(b"Brian was here.")); - assert!(body2.ends_with(b"9999\n")); - assert_eq!(body2.len(), 298890); - - assert_eq!( - ByteStream::new(body1).collect().await?.remaining(), - 298890 - some_data.len() - ); - - Ok(()) - } - #[cfg(feature = "rt-tokio")] #[tokio::test] async fn bytestream_into_async_read() { diff --git a/rust-runtime/aws-smithy-http/src/byte_stream/bytestream_util.rs b/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs similarity index 94% rename from rust-runtime/aws-smithy-http/src/byte_stream/bytestream_util.rs rename to rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs index 3768a57509b..39965c90c56 100644 --- a/rust-runtime/aws-smithy-http/src/byte_stream/bytestream_util.rs +++ b/rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs @@ -5,14 +5,9 @@ use crate::body::SdkBody; use crate::byte_stream::{error::Error, error::ErrorKind, ByteStream}; -use bytes::Bytes; -use futures_core::ready; -use http::HeaderMap; -use http_body::{Body, SizeHint}; use std::future::Future; use std::path::PathBuf; use std::pin::Pin; -use std::task::{Context, Poll}; use tokio::fs::File; use tokio::io::{self, AsyncReadExt, AsyncSeekExt}; use tokio_util::io::ReaderStream; @@ -60,11 +55,10 @@ impl PathBody { /// Builder for creating [`ByteStreams`](ByteStream) from a file/path, with full control over advanced options. /// -/// Example usage: /// ```no_run /// # #[cfg(feature = "rt-tokio")] /// # { -/// use aws_smithy_http::byte_stream::{ByteStream, Length}; +/// use aws_smithy_types::byte_stream::{ByteStream, Length}; /// use std::path::Path; /// struct GetObjectInput { /// body: ByteStream @@ -114,7 +108,7 @@ impl FsBuilder { /// /// You must then call either [`file`](FsBuilder::file) or [`path`](FsBuilder::path) to specify what to read from. pub fn new() -> Self { - FsBuilder { + Self { buffer_size: DEFAULT_BUFFER_SIZE, file: None, length: None, @@ -199,12 +193,12 @@ impl FsBuilder { let body_loader = move || { // If an offset was provided, seeking will be handled in `PathBody::poll_data` each // time the file is loaded. - SdkBody::from_dyn(http_body::combinators::BoxBody::new(PathBody::from_path( + SdkBody::from_body_0_4(PathBody::from_path( path.clone(), length, buffer_size, self.offset, - ))) + )) }; Ok(ByteStream::new(SdkBody::retryable(body_loader))) @@ -214,9 +208,7 @@ impl FsBuilder { let _s = file.seek(io::SeekFrom::Start(offset)).await?; } - let body = SdkBody::from_dyn(http_body::combinators::BoxBody::new( - PathBody::from_file(file, length, buffer_size), - )); + let body = SdkBody::from_body_0_4(PathBody::from_file(file, length, buffer_size)); Ok(ByteStream::new(body)) } else { @@ -240,14 +232,15 @@ enum State { Loaded(ReaderStream>), } -impl Body for PathBody { - type Data = Bytes; +impl http_body_0_4::Body for PathBody { + type Data = bytes::Bytes; type Error = Box; fn poll_data( - mut self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll>> { + mut self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll>> { + use std::task::Poll; let offset = self.offset.unwrap_or(DEFAULT_OFFSET); loop { match self.state { @@ -264,7 +257,7 @@ impl Body for PathBody { })); } State::Loading(ref mut future) => { - match ready!(Pin::new(future).poll(cx)) { + match futures_core::ready!(Pin::new(future).poll(cx)) { Ok(file) => { self.state = State::Loaded(ReaderStream::with_capacity( file.take(self.length), @@ -276,7 +269,7 @@ impl Body for PathBody { } State::Loaded(ref mut stream) => { use futures_core::Stream; - return match ready!(Pin::new(stream).poll_next(cx)) { + return match futures_core::ready!(std::pin::Pin::new(stream).poll_next(cx)) { Some(Ok(bytes)) => Poll::Ready(Some(Ok(bytes))), None => Poll::Ready(None), Some(Err(e)) => Poll::Ready(Some(Err(e.into()))), @@ -287,10 +280,10 @@ impl Body for PathBody { } fn poll_trailers( - self: Pin<&mut Self>, - _cx: &mut Context<'_>, - ) -> Poll, Self::Error>> { - Poll::Ready(Ok(None)) + self: std::pin::Pin<&mut Self>, + _cx: &mut std::task::Context<'_>, + ) -> std::task::Poll, Self::Error>> { + std::task::Poll::Ready(Ok(None)) } fn is_end_stream(&self) -> bool { @@ -298,17 +291,17 @@ impl Body for PathBody { self.length == 0 } - fn size_hint(&self) -> SizeHint { - SizeHint::with_exact(self.length) + fn size_hint(&self) -> http_body_0_4::SizeHint { + http_body_0_4::SizeHint::with_exact(self.length) } } +#[cfg(feature = "http-body-0-4-x")] #[cfg(test)] mod test { use super::FsBuilder; use crate::byte_stream::{ByteStream, Length}; use bytes::Buf; - use http_body::Body; use std::io::Write; use tempfile::NamedTempFile; @@ -335,12 +328,12 @@ mod test { .into_inner(); // assert that the specified length is used as size hint - assert_eq!(body.size_hint().exact(), Some(file_length)); + assert_eq!(body.content_length(), Some(file_length)); let mut body1 = body.try_clone().expect("retryable bodies are cloneable"); // read a little bit from one of the clones let some_data = body1 - .data() + .next() .await .expect("should have some data") .expect("read should not fail"); @@ -373,7 +366,7 @@ mod test { .unwrap() .into_inner(); - assert_eq!(body.size_hint().exact(), Some(1)); + assert_eq!(body.content_length(), Some(1)); } #[tokio::test] diff --git a/rust-runtime/aws-smithy-http/src/byte_stream/error.rs b/rust-runtime/aws-smithy-types/src/byte_stream/error.rs similarity index 100% rename from rust-runtime/aws-smithy-http/src/byte_stream/error.rs rename to rust-runtime/aws-smithy-types/src/byte_stream/error.rs diff --git a/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs b/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs new file mode 100644 index 00000000000..8bdae026f66 --- /dev/null +++ b/rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs @@ -0,0 +1,91 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use crate::body::SdkBody; +use crate::byte_stream::ByteStream; +use bytes::Bytes; + +impl ByteStream { + /// Construct a `ByteStream` from a type that implements [`http_body_0_4::Body`](http_body_0_4::Body). + /// + /// _Note: This is only available with `http-body-0-4-x` enabled._ + pub fn from_body_0_4(body: T) -> Self + where + T: http_body_0_4::Body + Send + Sync + 'static, + E: Into + 'static, + { + ByteStream::new(SdkBody::from_body_0_4(body)) + } +} + +#[cfg(feature = "hyper-0-14-x")] +impl From for ByteStream { + fn from(input: hyper_0_14::Body) -> Self { + ByteStream::new(SdkBody::from_body_0_4(input)) + } +} + +#[cfg(test)] +mod tests { + use crate::body::SdkBody; + use crate::byte_stream::Inner; + use bytes::Bytes; + + #[tokio::test] + async fn read_from_channel_body() { + let (mut sender, body) = hyper_0_14::Body::channel(); + let byte_stream = Inner::new(SdkBody::from_body_0_4(body)); + tokio::spawn(async move { + sender.send_data(Bytes::from("data 1")).await.unwrap(); + sender.send_data(Bytes::from("data 2")).await.unwrap(); + sender.send_data(Bytes::from("data 3")).await.unwrap(); + }); + assert_eq!( + byte_stream.collect().await.expect("no errors").into_bytes(), + Bytes::from("data 1data 2data 3") + ); + } + + #[cfg(feature = "rt-tokio")] + #[tokio::test] + async fn path_based_bytestreams() -> Result<(), Box> { + use super::ByteStream; + use bytes::Buf; + use std::io::Write; + use tempfile::NamedTempFile; + let mut file = NamedTempFile::new()?; + + for i in 0..10000 { + writeln!(file, "Brian was here. Briefly. {}", i)?; + } + let body = ByteStream::from_path(&file).await?.into_inner(); + // assert that a valid size hint is immediately ready + assert_eq!(body.content_length(), Some(298890)); + let mut body1 = body.try_clone().expect("retryable bodies are cloneable"); + // read a little bit from one of the clones + let some_data = body1 + .next() + .await + .expect("should have some data") + .expect("read should not fail"); + assert!(!some_data.is_empty()); + // make some more clones + let body2 = body.try_clone().expect("retryable bodies are cloneable"); + let body3 = body.try_clone().expect("retryable bodies are cloneable"); + let body2 = ByteStream::new(body2).collect().await?.into_bytes(); + let body3 = ByteStream::new(body3).collect().await?.into_bytes(); + assert_eq!(body2, body3); + assert!(body2.starts_with(b"Brian was here.")); + assert!(body2.ends_with(b"9999\n")); + assert_eq!(body2.len(), 298890); + + assert_eq!( + ByteStream::new(body1).collect().await?.remaining(), + 298890 - some_data.len() + ); + + Ok(()) + } +} diff --git a/rust-runtime/aws-smithy-types/src/config_bag.rs b/rust-runtime/aws-smithy-types/src/config_bag.rs index 12fefbe3b13..f2bcc01d4c7 100644 --- a/rust-runtime/aws-smithy-types/src/config_bag.rs +++ b/rust-runtime/aws-smithy-types/src/config_bag.rs @@ -3,12 +3,133 @@ * SPDX-License-Identifier: Apache-2.0 */ -//! Layered Configuration Bag Structure +//! Layers and layered bags of configuration data. +//! +//! The [`ConfigBag`](crate::config_bag::ConfigBag) structure is used to store and pass around configuration for client operations. +//! Interacting with it may be required in order to write an `Interceptor` or `RuntimePlugin` to +//! customize a client. +//! +//! A `ConfigBag` is essentially a stack of several immutable and sharable layers, with a single _mutable_ layer at +//! the top of the stack that is called "interceptor state". The intent of this last mutable layer is to allow for +//! more performant mutation of config within the execution of an operation. +//! +//! There are three separate layer types to be aware of when using a `ConfigBag`: +//! 1. [`Layer`](crate::config_bag::Layer) - A mutable layer. This is usually only used for adding config +//! to the `ConfigBag`, but is also used for the interceptor state. +//! 2. [`CloneableLayer`](crate::config_bag::CloneableLayer) - Identical to `Layer`, except that it requires +//! `Clone` bounds on the items added to it so that it can be deep cloned. Can be converted to a `Layer` +//! while retaining the cloneability of its items such that the resulting layer could be cloned as long as +//! nothing else is added to it later. A `Layer` cannot be converted back into a `CloneableLayer`. +//! 3. [`FrozenLayer`](crate::config_bag::FrozenLayer) - Basically an [`Arc`](std::sync::Arc) wrapper around +//! a `Layer`. This wrapper is used to make the layer immutable, and to make it shareable between multiple +//! `ConfigBag` instances. The frozen layer can be converted back to a `Layer` if there is only a single reference to it. +//! +//! All of `Layer`, `CloneableLayer`, `FrozenLayer`, and `ConfigBag` are considered to be "bag" types. +//! That is, they store arbitrary types so long as they implement the [`Storable`](crate::config_bag::Storable) trait. +//! +//! A `Storable` requires a `Storer` to be configured, and the storer allows for storables to be stored +//! in two different modes: +//! 1. [`StoreReplace`](crate::config_bag::StoreReplace) - Only one value of this type is allowed in a bag, and +//! calling [`store_put()`](crate::config_bag::Layer::store_put) multiple times will replace the existing value +//! in the bag. Calling [`load::()`](crate::config_bag::Layer::load) returns exactly one value, if present. +//! 2. [`StoreAppend`](crate::config_bag::StoreAppend) - Multiple values of this type are allowed in a bag, and +//! calling [`store_append()`](crate::config_bag::Layer::store_append) will add an additional value of this type +//! to the bag. Calling [`load::()`](crate::config_bag::Layer::load) returns an iterator over multiple values. +//! +//! # Examples +//! +//! Creating a storable data type with `StoreReplace`: +//! +//! ```no_run +//! use aws_smithy_types::config_bag::{Storable, StoreReplace}; +//! +//! #[derive(Debug)] +//! struct SomeDataType { +//! some_data: String, +//! } +//! impl Storable for SomeDataType { +//! type Storer = StoreReplace; +//! } +//! ``` +//! +//! Creating a storable data type with `StoreAppend`: +//! +//! ```no_run +//! use aws_smithy_types::config_bag::{Storable, StoreAppend}; +//! +//! #[derive(Debug)] +//! struct SomeDataType { +//! some_data: String, +//! } +//! impl Storable for SomeDataType { +//! type Storer = StoreAppend; +//! } +//! ``` +//! +//! Storing a storable in a bag when it is configured for `StoreReplace`: +//! +//! ```no_run +//! # use aws_smithy_types::config_bag::{Storable, StoreReplace}; +//! # #[derive(Clone, Debug)] +//! # struct SomeDataType { some_data: String } +//! # impl Storable for SomeDataType { type Storer = StoreReplace; } +//! use aws_smithy_types::config_bag::{CloneableLayer, Layer}; +//! +//! let mut layer = Layer::new("example"); +//! layer.store_put(SomeDataType { some_data: "some data".to_string() }); +//! +//! // `store_put` can be called again to replace the original value: +//! layer.store_put(SomeDataType { some_data: "replacement".to_string() }); +//! +//! // Note: `SomeDataType` below must implement `Clone` to work with `CloneableLayer` +//! let mut cloneable = CloneableLayer::new("example"); +//! cloneable.store_put(SomeDataType { some_data: "some data".to_string() }); +//! ``` +//! +//! Storing a storable in a bag when it is configured for `StoreAppend`: +//! +//! ```no_run +//! # use aws_smithy_types::config_bag::{Storable, StoreAppend}; +//! # #[derive(Clone, Debug)] +//! # struct SomeDataType { some_data: String } +//! # impl Storable for SomeDataType { type Storer = StoreAppend; } +//! use aws_smithy_types::config_bag::{CloneableLayer, Layer}; +//! +//! let mut layer = Layer::new("example"); +//! layer.store_append(SomeDataType { some_data: "1".to_string() }); +//! layer.store_append(SomeDataType { some_data: "2".to_string() }); +//! ``` +//! +//! Loading a `StoreReplace` value from a bag: +//! +//! ```no_run +//! # use aws_smithy_types::config_bag::{Storable, StoreReplace}; +//! # #[derive(Clone, Debug)] +//! # struct SomeDataType { some_data: String } +//! # impl Storable for SomeDataType { type Storer = StoreReplace; } +//! # use aws_smithy_types::config_bag::Layer; +//! # let layer = Layer::new("example"); +//! let maybe_value: Option<&SomeDataType> = layer.load::(); +//! ``` +//! +//! Loading a `StoreAppend` value from a bag: +//! +//! ```no_run +//! # use aws_smithy_types::config_bag::{Storable, StoreAppend}; +//! # #[derive(Clone, Debug)] +//! # struct SomeDataType { some_data: String } +//! # impl Storable for SomeDataType { type Storer = StoreAppend; } +//! # use aws_smithy_types::config_bag::Layer; +//! # let layer = Layer::new("example"); +//! let values: Vec = layer.load::().cloned().collect(); +//! +//! // or iterate over them directly: +//! for value in layer.load::() { +//! # let _ = value; +//! // ... +//! } +//! ``` //! -//! [`config_bag::ConfigBag`] represents the layered configuration structure -//! with the following properties: -//! 1. A new layer of configuration may be applied onto an existing configuration structure without modifying it or taking ownership. -//! 2. No lifetime shenanigans to deal with mod storable; mod typeid_map; @@ -19,19 +140,26 @@ use std::borrow::Cow; use std::fmt::{Debug, Formatter}; use std::iter::Rev; use std::marker::PhantomData; -use std::ops::{Deref, DerefMut}; +use std::ops::Deref; use std::slice::Iter; use std::sync::Arc; pub use storable::{AppendItemIter, Storable, Store, StoreAppend, StoreReplace}; -/// [`FrozenLayer`] is the "locked" form of [`Layer`]. +/// [`FrozenLayer`] is the immutable and shareable form of [`Layer`]. /// -/// [`ConfigBag`] contains a ordered collection of [`FrozenLayer`] +/// See the [module docs](crate::config_bag) for more documentation. #[derive(Clone, Debug)] #[must_use] pub struct FrozenLayer(Arc); +impl FrozenLayer { + /// Attempts to convert this bag directly into a [`Layer`] if no other references exist. + pub fn try_modify(self) -> Option { + Arc::try_unwrap(self.0).ok() + } +} + impl Deref for FrozenLayer { type Target = Layer; @@ -40,6 +168,12 @@ impl Deref for FrozenLayer { } } +impl From for FrozenLayer { + fn from(layer: Layer) -> Self { + FrozenLayer(Arc::new(layer)) + } +} + /// Private module to keep Value type while avoiding "private type in public latest" pub(crate) mod value { #[derive(Clone, Debug)] @@ -47,14 +181,14 @@ pub(crate) mod value { Set(T), ExplicitlyUnset(&'static str), } -} -use value::Value; -impl Default for Value { - fn default() -> Self { - Self::Set(Default::default()) + impl Default for Value { + fn default() -> Self { + Self::Set(Default::default()) + } } } +use value::Value; /// [`CloneableLayer`] allows itself to be cloned. This is useful when a type that implements /// `Clone` wishes to store a config layer. @@ -64,6 +198,23 @@ impl Default for Value { /// /// While [`FrozenLayer`] is also cloneable, which is a shallow clone via `Arc`, `CloneableLayer` /// performs a deep clone that newly allocates all the items stored in it. +/// +/// Cloneable enforces that non clone items cannot be added +/// ```rust,compile_fail +/// use aws_smithy_types::config_bag::Storable; +/// use aws_smithy_types::config_bag::StoreReplace; +/// use aws_smithy_types::config_bag::CloneableLayer; +/// #[derive(Debug)] +/// struct MyNotCloneStruct; +/// +/// impl Storable for MyNotCloneStruct { +/// type Storer = StoreReplace; +/// } +/// let mut layer = CloneableLayer::new("layer"); +/// layer.store_put(MyNotCloneStruct); +/// ``` +/// +/// See the [module docs](crate::config_bag) for more documentation. #[derive(Debug, Default)] pub struct CloneableLayer(Layer); @@ -75,12 +226,6 @@ impl Deref for CloneableLayer { } } -impl DerefMut for CloneableLayer { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - impl Clone for CloneableLayer { fn clone(&self) -> Self { Self( @@ -104,21 +249,23 @@ impl CloneableLayer { Self(Layer::new(name)) } + /// Converts this layer into a frozen layer that can no longer be mutated. pub fn freeze(self) -> FrozenLayer { self.0.into() } /// Removes `T` from this bag pub fn unset(&mut self) -> &mut Self { - self.put_directly::>(Value::ExplicitlyUnset(type_name::())); + self.put_directly_cloneable::>(Value::ExplicitlyUnset(type_name::())); self } - fn put_directly(&mut self, value: T::StoredType) -> &mut Self + fn put_directly_cloneable(&mut self, value: T::StoredType) -> &mut Self where T::StoredType: Clone, { - self.props + self.0 + .props .insert(TypeId::of::(), TypeErasedBox::new_with_clone(value)); self } @@ -128,7 +275,7 @@ impl CloneableLayer { where T: Storable> + Clone, { - self.put_directly::>(Value::Set(item)); + self.put_directly_cloneable::>(Value::Set(item)); self } @@ -142,7 +289,7 @@ impl CloneableLayer { Some(item) => Value::Set(item), None => Value::ExplicitlyUnset(type_name::()), }; - self.put_directly::>(item); + self.put_directly_cloneable::>(item); self } @@ -164,14 +311,15 @@ impl CloneableLayer { where T: Storable> + Clone, { - self.put_directly::>(Value::ExplicitlyUnset(type_name::())); + self.put_directly_cloneable::>(Value::ExplicitlyUnset(type_name::())); } fn get_mut_or_default(&mut self) -> &mut T::StoredType where T::StoredType: Default + Clone, { - self.props + self.0 + .props .entry(TypeId::of::()) .or_insert_with(|| TypeErasedBox::new_with_clone(T::StoredType::default())) .downcast_mut() @@ -180,6 +328,8 @@ impl CloneableLayer { } /// A named layer comprising a config bag +/// +/// See the [module docs](crate::config_bag) for more documentation. #[derive(Default)] pub struct Layer { name: Cow<'static, str>, @@ -225,10 +375,12 @@ impl Layer { self } - pub fn empty(&self) -> bool { + /// Returns true if this layer is empty. + pub fn is_empty(&self) -> bool { self.props.is_empty() } + /// Converts this layer into a frozen layer that can no longer be mutated. pub fn freeze(self) -> FrozenLayer { self.into() } @@ -242,6 +394,7 @@ impl Layer { } } + /// Changes the name of this layer. pub fn with_name(self, name: impl Into>) -> Self { Self { name: name.into(), @@ -362,19 +515,9 @@ impl Layer { } } -impl FrozenLayer { - /// Attempts to convert this bag directly into a [`ConfigBag`] if no other references exist - /// - /// This allows modifying the top layer of the bag. [`Self::add_layer`] may be - /// used to add a new layer to the bag. - pub fn try_modify(self) -> Option { - Arc::try_unwrap(self.0).ok() - } -} - -/// Layered Configuration Structure +/// Layered configuration structure /// -/// [`ConfigBag`] is the "unlocked" form of the bag. Only the top layer of the bag may be unlocked. +/// See the [module docs](crate::config_bag) for more documentation. #[must_use] pub struct ConfigBag { interceptor_state: Layer, @@ -397,10 +540,6 @@ impl Debug for ConfigBag { impl ConfigBag { /// Create a new config bag "base". - /// - /// Configuration may then be "layered" onto the base by calling - /// [`ConfigBag::store_put`], [`ConfigBag::store_or_unset`], [`ConfigBag::store_append`]. Layers - /// of configuration may then be "frozen" (made immutable) by calling [`ConfigBag::freeze`]. pub fn base() -> Self { ConfigBag { interceptor_state: Layer { @@ -411,7 +550,8 @@ impl ConfigBag { } } - pub fn of_layers(layers: Vec) -> Self { + /// Create a [`ConfigBag`] consisting of the given layers. + pub fn of_layers(layers: impl IntoIterator) -> Self { let mut bag = ConfigBag::base(); for layer in layers { bag.push_layer(layer); @@ -419,16 +559,19 @@ impl ConfigBag { bag } + /// Add the given layer to the config bag. pub fn push_layer(&mut self, layer: Layer) -> &mut Self { self.tail.push(layer.freeze()); self } + /// Add a frozen/shared layer to the config bag. pub fn push_shared_layer(&mut self, layer: FrozenLayer) -> &mut Self { self.tail.push(layer); self } + /// Return a reference to the mutable interceptor state. pub fn interceptor_state(&mut self) -> &mut Layer { &mut self.interceptor_state } @@ -505,20 +648,37 @@ impl ConfigBag { /// Add another layer to this configuration bag /// /// Hint: If you want to re-use this layer, call `freeze` first. + /// + /// # Examples /// ``` - /// /* - /// use aws_smithy_types::config_bag::{ConfigBag, Layer}; - /// let bag = ConfigBag::base(); - /// let first_layer = bag.with_fn("a", |b: &mut Layer| { b.put("a"); }); - /// let second_layer = first_layer.with_fn("other", |b: &mut Layer| { b.put(1i32); }); - /// // The number is only in the second layer - /// assert_eq!(first_layer.get::(), None); - /// assert_eq!(second_layer.get::(), Some(&1)); + /// use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace}; + /// + /// #[derive(Debug, Eq, PartialEq)] + /// struct ExampleStr(&'static str); + /// impl Storable for ExampleStr { + /// type Storer = StoreReplace; + /// } + /// + /// #[derive(Debug, Eq, PartialEq)] + /// struct ExampleInt(i32); + /// impl Storable for ExampleInt { + /// type Storer = StoreReplace; + /// } + /// + /// let mut bag = ConfigBag::base(); + /// bag = bag.with_fn("first", |layer: &mut Layer| { layer.store_put(ExampleStr("a")); }); + /// + /// // We can now load the example string out + /// assert_eq!(bag.load::(), Some(&ExampleStr("a"))); /// - /// // The string is in both layers - /// assert_eq!(first_layer.get::<&'static str>(), Some(&"a")); - /// assert_eq!(second_layer.get::<&'static str>(), Some(&"a")); - /// */ + /// // But there isn't a number stored in the bag yet + /// assert_eq!(bag.load::(), None); + /// + /// // Add a layer with an example int + /// bag = bag.with_fn("second", |layer: &mut Layer| { layer.store_put(ExampleInt(1)); }); + /// + /// // Now the example int can be retrieved + /// assert_eq!(bag.load::(), Some(&ExampleInt(1))); /// ``` pub fn with_fn( self, @@ -563,7 +723,7 @@ impl ConfigBag { } } -/// Iterator of items returned from config_bag +/// Iterator of items returned from [`ConfigBag`]. pub struct ItemIter<'a, T> { inner: BagIter<'a>, t: PhantomData, @@ -607,12 +767,6 @@ impl<'a> Iterator for BagIter<'a> { } } -impl From for FrozenLayer { - fn from(layer: Layer) -> Self { - FrozenLayer(Arc::new(layer)) - } -} - #[cfg(test)] mod test { use super::ConfigBag; @@ -840,6 +994,17 @@ mod test { let layer_1_cloned = layer_1.clone(); assert_eq!(expected_str, &layer_1_cloned.load::().unwrap().0); + // Should still be cloneable after unsetting a field + layer_1.unset::(); + assert!(layer_1.try_clone().unwrap().load::().is_none()); + + // It is cloneable multiple times in succession + let _ = layer_1 + .try_clone() + .expect("clone 1") + .try_clone() + .expect("clone 2"); + #[derive(Clone, Debug)] struct Rope(String); impl Storable for Rope { diff --git a/rust-runtime/aws-smithy-types/src/config_bag/storable.rs b/rust-runtime/aws-smithy-types/src/config_bag/storable.rs index 33c0d2d4346..3a70e422eaa 100644 --- a/rust-runtime/aws-smithy-types/src/config_bag/storable.rs +++ b/rust-runtime/aws-smithy-types/src/config_bag/storable.rs @@ -22,6 +22,8 @@ pub trait Store: Sized + Send + Sync + 'static { } /// Store an item in the config bag by replacing the existing value +/// +/// See the [module docs](crate::config_bag) for more documentation. #[non_exhaustive] pub struct StoreReplace(PhantomData); @@ -32,6 +34,8 @@ impl Debug for StoreReplace { } /// Store an item in the config bag by effectively appending it to a list +/// +/// See the [module docs](crate::config_bag) for more documentation. #[non_exhaustive] pub struct StoreAppend(PhantomData); @@ -42,6 +46,8 @@ impl Debug for StoreAppend { } /// Trait that marks the implementing types as able to be stored in the config bag +/// +/// See the [module docs](crate::config_bag) for more documentation. pub trait Storable: Send + Sync + Debug + 'static { /// Specify how an item is stored in the config bag, e.g. [`StoreReplace`] and [`StoreAppend`] type Storer: Store; diff --git a/rust-runtime/aws-smithy-types/src/date_time/format.rs b/rust-runtime/aws-smithy-types/src/date_time/format.rs index 7253dec1acf..86ffd42ac71 100644 --- a/rust-runtime/aws-smithy-types/src/date_time/format.rs +++ b/rust-runtime/aws-smithy-types/src/date_time/format.rs @@ -129,7 +129,6 @@ pub(crate) mod epoch_seconds { } pub(crate) mod http_date { - use super::remove_trailing_zeros; use crate::date_time::format::{ DateTimeFormatError, DateTimeFormatErrorKind, DateTimeParseError, DateTimeParseErrorKind, NANOS_PER_SECOND, @@ -141,18 +140,15 @@ pub(crate) mod http_date { // This code is taken from https://github.com/pyfisch/httpdate and modified under an // Apache 2.0 License. Modifications: // - Removed use of unsafe - // - Add serialization and deserialization of subsecond nanos + // - Add deserialization of subsecond nanos // - /// Format a `DateTime` in the HTTP date format (imf-fixdate) with added support for subsecond precision + /// Format a `DateTime` in the HTTP date format (imf-fixdate) /// /// Example: "Mon, 16 Dec 2019 23:48:18 GMT" /// /// Some notes: /// - HTTP date does not support years before `0001`—this will cause a panic. - /// - If you _don't_ want subsecond precision (e.g. if you want strict adherence to the spec), - /// you need to zero-out the date-time before formatting - /// - If subsecond nanos are 0, no fractional seconds are added - /// - If subsecond nanos are nonzero, 3 digits of fractional seconds are added + /// - Subsecond nanos are not emitted pub(crate) fn format(date_time: &DateTime) -> Result { fn out_of_range(cause: E) -> DateTimeFormatError { DateTimeFormatErrorKind::OutOfRange( @@ -242,16 +238,6 @@ pub(crate) mod http_date { push_digit(&mut out, second / 10); push_digit(&mut out, second % 10); - // If non-zero nanos, push a 3-digit fractional second - let millis = structured.millisecond(); - if millis != 0 { - out.push('.'); - push_digit(&mut out, (millis / 100 % 10) as u8); - push_digit(&mut out, (millis / 10 % 10) as u8); - push_digit(&mut out, (millis % 10) as u8); - remove_trailing_zeros(&mut out); - } - out.push_str(" GMT"); Ok(out) } @@ -707,7 +693,7 @@ mod tests { http_date::format(&DateTime::from_secs(-62_135_596_800)).unwrap() ); assert_eq!( - "Fri, 31 Dec 9999 23:59:59.999 GMT", + "Fri, 31 Dec 9999 23:59:59 GMT", http_date::format(&DateTime::from_secs_and_nanos(253402300799, 999_999_999)).unwrap() ); diff --git a/rust-runtime/aws-smithy-types/src/date_time/mod.rs b/rust-runtime/aws-smithy-types/src/date_time/mod.rs index 8dcdc53067c..9466036bfac 100644 --- a/rust-runtime/aws-smithy-types/src/date_time/mod.rs +++ b/rust-runtime/aws-smithy-types/src/date_time/mod.rs @@ -13,6 +13,7 @@ use std::cmp::Ordering; use std::convert::TryFrom; use std::error::Error as StdError; use std::fmt; +use std::fmt::Display; use std::time::Duration; use std::time::SystemTime; use std::time::UNIX_EPOCH; @@ -57,6 +58,9 @@ const NANOS_PER_SECOND_U32: u32 = 1_000_000_000; #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)] pub struct DateTime { pub(crate) seconds: i64, + /// Subsecond nanos always advances the wallclock time, even for times where seconds is negative + /// + /// Bigger subsecond nanos => later time pub(crate) subsecond_nanos: u32, } @@ -93,12 +97,7 @@ impl DateTime { /// Returns the number of nanoseconds since the Unix epoch that this `DateTime` represents. pub fn as_nanos(&self) -> i128 { let seconds = self.seconds as i128 * NANOS_PER_SECOND; - if seconds < 0 { - let adjusted_nanos = self.subsecond_nanos as i128 - NANOS_PER_SECOND; - seconds + NANOS_PER_SECOND + adjusted_nanos - } else { - seconds + self.subsecond_nanos as i128 - } + seconds + self.subsecond_nanos as i128 } /// Creates a `DateTime` from a number of seconds and a fractional second since the Unix epoch. @@ -331,6 +330,12 @@ impl Ord for DateTime { } } +impl Display for DateTime { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let date = self.fmt(Format::DateTime).map_err(|_| fmt::Error)?; + write!(f, "{}", date) + } +} /// Failure to convert a `DateTime` to or from another type. #[derive(Debug)] #[non_exhaustive] @@ -374,6 +379,21 @@ mod test { use time::format_description::well_known::Rfc3339; use time::OffsetDateTime; + #[test] + fn test_display_date_time() { + let date_time = DateTime::from_secs(1576540098); + assert_eq!(format!("{}", date_time), "2019-12-16T23:48:18Z"); + + let date_time = DateTime::from_fractional_secs(1576540098, 0.52); + assert_eq!(format!("{}", date_time), "2019-12-16T23:48:18.52Z"); + + let date_time = DateTime::from_secs(1699942527); + assert_eq!(format!("{}", date_time), "2023-11-14T06:15:27Z"); + + let date_time = DateTime::from_secs(16995123); + assert_eq!(format!("{}", date_time), "1970-07-16T16:52:03Z"); + } + #[test] fn test_fmt() { let date_time = DateTime::from_secs(1576540098); @@ -398,7 +418,7 @@ mod test { ); assert_eq!( date_time.fmt(Format::HttpDate).unwrap(), - "Mon, 16 Dec 2019 23:48:18.52 GMT" + "Mon, 16 Dec 2019 23:48:18 GMT" ); } @@ -568,7 +588,7 @@ mod test { assert!(DateTime::from_nanos(10_000_000_000_000_000_000_999_999_999_i128).is_err()); } - // TODO(https://github.com/awslabs/smithy-rs/issues/1857) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857) #[cfg(not(any(target_arch = "powerpc", target_arch = "x86")))] #[test] fn system_time_conversions() { diff --git a/rust-runtime/aws-smithy-types/src/error.rs b/rust-runtime/aws-smithy-types/src/error.rs index b83d6ffe077..e2375ddf3f5 100644 --- a/rust-runtime/aws-smithy-types/src/error.rs +++ b/rust-runtime/aws-smithy-types/src/error.rs @@ -9,10 +9,9 @@ use std::fmt; pub mod display; pub mod metadata; -mod unhandled; +pub mod operation; pub use metadata::ErrorMetadata; -pub use unhandled::Unhandled; #[derive(Debug)] pub(super) enum TryFromNumberErrorKind { diff --git a/rust-runtime/aws-smithy-types/src/error/metadata.rs b/rust-runtime/aws-smithy-types/src/error/metadata.rs index 6629753733d..70c06c7e75b 100644 --- a/rust-runtime/aws-smithy-types/src/error/metadata.rs +++ b/rust-runtime/aws-smithy-types/src/error/metadata.rs @@ -27,7 +27,6 @@ pub trait ProvideErrorMetadata { } /// Empty error metadata -#[doc(hidden)] pub const EMPTY_ERROR_METADATA: ErrorMetadata = ErrorMetadata { code: None, message: None, @@ -75,13 +74,13 @@ impl Builder { /// /// Typically, these will be accessed with an extension trait: /// ```rust - /// use aws_smithy_types::Error; + /// use aws_smithy_types::error::ErrorMetadata; /// const HOST_ID: &str = "host_id"; /// trait S3ErrorExt { /// fn extended_request_id(&self) -> Option<&str>; /// } /// - /// impl S3ErrorExt for Error { + /// impl S3ErrorExt for ErrorMetadata { /// fn extended_request_id(&self) -> Option<&str> { /// self.extra(HOST_ID) /// } @@ -90,7 +89,7 @@ impl Builder { /// fn main() { /// // Extension trait must be brought into scope /// use S3ErrorExt; - /// let sdk_response: Result<(), Error> = Err(Error::builder().custom(HOST_ID, "x-1234").build()); + /// let sdk_response: Result<(), ErrorMetadata> = Err(ErrorMetadata::builder().custom(HOST_ID, "x-1234").build()); /// if let Err(err) = sdk_response { /// println!("extended request id: {:?}", err.extended_request_id()); /// } diff --git a/rust-runtime/aws-smithy-http/src/operation/error.rs b/rust-runtime/aws-smithy-types/src/error/operation.rs similarity index 84% rename from rust-runtime/aws-smithy-http/src/operation/error.rs rename to rust-runtime/aws-smithy-types/src/error/operation.rs index 5b2024396f2..5b61f1acfe5 100644 --- a/rust-runtime/aws-smithy-http/src/operation/error.rs +++ b/rust-runtime/aws-smithy-types/src/error/operation.rs @@ -5,9 +5,7 @@ //! Errors for operations -use aws_smithy_types::date_time::DateTimeFormatError; -use http::uri::InvalidUri; -use std::borrow::Cow; +use crate::date_time::DateTimeFormatError; use std::error::Error; use std::fmt::{Display, Formatter}; @@ -80,15 +78,6 @@ enum BuildErrorKind { /// The serializer could not serialize the input SerializationError(SerializationError), - /// The serializer did not produce a valid URI - /// - /// This typically indicates that a field contained invalid characters. - InvalidUri { - uri: String, - message: Cow<'static, str>, - source: InvalidUri, - }, - /// An error occurred request construction Other(Box), } @@ -104,16 +93,6 @@ pub struct BuildError { } impl BuildError { - pub(crate) fn invalid_uri(uri: String, message: Cow<'static, str>, source: InvalidUri) -> Self { - Self { - kind: BuildErrorKind::InvalidUri { - uri, - message, - source, - }, - } - } - /// Construct a build error for a missing field pub fn missing_field(field: &'static str, details: &'static str) -> Self { Self { @@ -121,7 +100,7 @@ impl BuildError { } } - /// Construct a build error for a missing field + /// Construct a build error for an invalid field pub fn invalid_field(field: &'static str, details: impl Into) -> Self { Self { kind: BuildErrorKind::InvalidField { @@ -165,9 +144,6 @@ impl Display for BuildError { BuildErrorKind::SerializationError(_) => { write!(f, "failed to serialize input") } - BuildErrorKind::InvalidUri { uri, message, .. } => { - write!(f, "generated URI `{uri}` was not a valid URI: {message}") - } BuildErrorKind::Other(_) => { write!(f, "error during request construction") } @@ -180,7 +156,6 @@ impl Error for BuildError { match &self.kind { BuildErrorKind::SerializationError(source) => Some(source as _), BuildErrorKind::Other(source) => Some(source.as_ref()), - BuildErrorKind::InvalidUri { source, .. } => Some(source as _), BuildErrorKind::InvalidField { .. } | BuildErrorKind::MissingField { .. } => None, } } diff --git a/rust-runtime/aws-smithy-types/src/error/unhandled.rs b/rust-runtime/aws-smithy-types/src/error/unhandled.rs deleted file mode 100644 index 2397d700ffc..00000000000 --- a/rust-runtime/aws-smithy-types/src/error/unhandled.rs +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -//! Unhandled error type. - -use crate::error::{metadata::ProvideErrorMetadata, ErrorMetadata}; -use std::error::Error as StdError; - -/// Builder for [`Unhandled`] -#[derive(Default, Debug)] -pub struct Builder { - source: Option>, - meta: Option, -} - -impl Builder { - /// Sets the error source - pub fn source(mut self, source: impl Into>) -> Self { - self.source = Some(source.into()); - self - } - - /// Sets the error source - pub fn set_source( - &mut self, - source: Option>, - ) -> &mut Self { - self.source = source; - self - } - - /// Sets the error metadata - pub fn meta(mut self, meta: ErrorMetadata) -> Self { - self.meta = Some(meta); - self - } - - /// Sets the error metadata - pub fn set_meta(&mut self, meta: Option) -> &mut Self { - self.meta = meta; - self - } - - /// Builds the unhandled error - pub fn build(self) -> Unhandled { - Unhandled { - source: self.source.expect("unhandled errors must have a source"), - meta: self.meta.unwrap_or_default(), - } - } -} - -/// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code). -/// -/// When logging an error from the SDK, it is recommended that you either wrap the error in -/// [`DisplayErrorContext`](crate::error::display::DisplayErrorContext), use another -/// error reporter library that visits the error's cause/source chain, or call -/// [`Error::source`](std::error::Error::source) for more details about the underlying cause. -#[derive(Debug)] -pub struct Unhandled { - source: Box, - meta: ErrorMetadata, -} - -impl Unhandled { - /// Returns a builder to construct an unhandled error. - pub fn builder() -> Builder { - Default::default() - } -} - -impl std::fmt::Display for Unhandled { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { - write!(f, "unhandled error") - } -} - -impl StdError for Unhandled { - fn source(&self) -> Option<&(dyn StdError + 'static)> { - Some(self.source.as_ref() as _) - } -} - -impl ProvideErrorMetadata for Unhandled { - fn meta(&self) -> &ErrorMetadata { - &self.meta - } -} diff --git a/rust-runtime/aws-smithy-types/src/event_stream.rs b/rust-runtime/aws-smithy-types/src/event_stream.rs new file mode 100644 index 00000000000..0d98dabd991 --- /dev/null +++ b/rust-runtime/aws-smithy-types/src/event_stream.rs @@ -0,0 +1,203 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +//! Types relevant to event stream serialization/deserialization + +use crate::str_bytes::StrBytes; +use bytes::Bytes; + +mod value { + use crate::str_bytes::StrBytes; + use crate::DateTime; + use bytes::Bytes; + + /// Event Stream frame header value. + #[non_exhaustive] + #[derive(Clone, Debug, PartialEq)] + pub enum HeaderValue { + /// Represents a boolean value. + Bool(bool), + /// Represents a byte value. + Byte(i8), + /// Represents an int16 value. + Int16(i16), + /// Represents an int32 value. + Int32(i32), + /// Represents an int64 value. + Int64(i64), + /// Represents a byte array value. + ByteArray(Bytes), + /// Represents a string value. + String(StrBytes), + /// Represents a timestamp value. + Timestamp(DateTime), + /// Represents a uuid value. + Uuid(u128), + } + + impl HeaderValue { + /// If the `HeaderValue` is a `Bool`, returns the associated `bool`. Returns `Err` otherwise. + pub fn as_bool(&self) -> Result { + match self { + HeaderValue::Bool(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `Byte`, returns the associated `i8`. Returns `Err` otherwise. + pub fn as_byte(&self) -> Result { + match self { + HeaderValue::Byte(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is an `Int16`, returns the associated `i16`. Returns `Err` otherwise. + pub fn as_int16(&self) -> Result { + match self { + HeaderValue::Int16(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is an `Int32`, returns the associated `i32`. Returns `Err` otherwise. + pub fn as_int32(&self) -> Result { + match self { + HeaderValue::Int32(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is an `Int64`, returns the associated `i64`. Returns `Err` otherwise. + pub fn as_int64(&self) -> Result { + match self { + HeaderValue::Int64(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `ByteArray`, returns the associated [`Bytes`]. Returns `Err` otherwise. + pub fn as_byte_array(&self) -> Result<&Bytes, &Self> { + match self { + HeaderValue::ByteArray(value) => Ok(value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `String`, returns the associated [`StrBytes`]. Returns `Err` otherwise. + pub fn as_string(&self) -> Result<&StrBytes, &Self> { + match self { + HeaderValue::String(value) => Ok(value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `Timestamp`, returns the associated [`DateTime`]. Returns `Err` otherwise. + pub fn as_timestamp(&self) -> Result { + match self { + HeaderValue::Timestamp(value) => Ok(*value), + _ => Err(self), + } + } + + /// If the `HeaderValue` is a `Uuid`, returns the associated `u128`. Returns `Err` otherwise. + pub fn as_uuid(&self) -> Result { + match self { + HeaderValue::Uuid(value) => Ok(*value), + _ => Err(self), + } + } + } +} + +pub use value::HeaderValue; + +/// Event Stream header. +#[non_exhaustive] +#[derive(Clone, Debug, PartialEq)] +pub struct Header { + name: StrBytes, + value: HeaderValue, +} + +impl Header { + /// Creates a new header with the given `name` and `value`. + pub fn new(name: impl Into, value: impl Into) -> Header { + Header { + name: name.into(), + value: value.into(), + } + } + + /// Returns the header name. + pub fn name(&self) -> &StrBytes { + &self.name + } + + /// Returns the header value. + pub fn value(&self) -> &HeaderValue { + &self.value + } +} + +/// Event Stream message. +#[non_exhaustive] +#[derive(Clone, Debug, PartialEq)] +pub struct Message { + headers: Vec

, + payload: Bytes, +} + +impl Message { + /// Creates a new message with the given `payload`. Headers can be added later. + pub fn new(payload: impl Into) -> Message { + Message { + headers: Vec::new(), + payload: payload.into(), + } + } + + /// Creates a message with the given `headers` and `payload`. + pub fn new_from_parts(headers: Vec
, payload: impl Into) -> Self { + Self { + headers, + payload: payload.into(), + } + } + + /// Adds a header to the message. + pub fn add_header(mut self, header: Header) -> Self { + self.headers.push(header); + self + } + + /// Returns all headers. + pub fn headers(&self) -> &[Header] { + &self.headers + } + + /// Returns the payload bytes. + pub fn payload(&self) -> &Bytes { + &self.payload + } +} + +/// Raw message from an event stream receiver when a response error is encountered. +#[derive(Debug)] +#[non_exhaustive] +pub enum RawMessage { + /// Message was decoded into a valid frame, but failed to unmarshall into a modeled type. + Decoded(Message), + /// Message failed to be decoded into a valid frame. The raw bytes may not be available in the + /// case where decoding consumed the buffer. + Invalid(Option), +} + +impl RawMessage { + /// Creates a `RawMessage` for failure to decode a message into a valid frame. + pub fn invalid(bytes: Option) -> Self { + Self::Invalid(bytes) + } +} diff --git a/rust-runtime/aws-smithy-types/src/lib.rs b/rust-runtime/aws-smithy-types/src/lib.rs index 1d756d5802d..79c0a13f5b6 100644 --- a/rust-runtime/aws-smithy-types/src/lib.rs +++ b/rust-runtime/aws-smithy-types/src/lib.rs @@ -13,34 +13,29 @@ rust_2018_idioms, unreachable_pub )] +#![cfg_attr(docsrs, feature(doc_auto_cfg))] pub mod base64; -//TODO(enableNewSmithyRuntimeLaunch): Unhide this module when switching to the orchestrator -#[doc(hidden)] +pub mod body; +pub mod byte_stream; /// A typemap for storing configuration. pub mod config_bag; pub mod date_time; pub mod endpoint; pub mod error; +pub mod event_stream; pub mod primitive; pub mod retry; pub mod timeout; -//TODO(enableNewSmithyRuntimeLaunch): Unhide this module when switching to the orchestrator -#[doc(hidden)] /// Utilities for type erasure. pub mod type_erasure; mod blob; mod document; mod number; +pub mod str_bytes; pub use blob::Blob; pub use date_time::DateTime; pub use document::Document; -// TODO(deprecated): Remove deprecated re-export -/// Use [error::ErrorMetadata] instead. -#[deprecated( - note = "`aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`" -)] -pub use error::ErrorMetadata as Error; pub use number::Number; diff --git a/rust-runtime/aws-smithy-types/src/retry.rs b/rust-runtime/aws-smithy-types/src/retry.rs index a2866b84c10..964dbbdc6ee 100644 --- a/rust-runtime/aws-smithy-types/src/retry.rs +++ b/rust-runtime/aws-smithy-types/src/retry.rs @@ -41,6 +41,17 @@ pub enum ErrorKind { ClientError, } +impl fmt::Display for ErrorKind { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::TransientError => write!(f, "transient error"), + Self::ThrottlingError => write!(f, "throttling error"), + Self::ServerError => write!(f, "server error"), + Self::ClientError => write!(f, "client error"), + } + } +} + /// Trait that provides an `ErrorKind` and an error code. pub trait ProvideErrorKind { /// Returns the `ErrorKind` when the error is modeled as retryable @@ -382,6 +393,12 @@ impl RetryConfig { self } + /// Set the maximum backoff time. + pub fn with_max_backoff(mut self, max_backoff: Duration) -> Self { + self.max_backoff = max_backoff; + self + } + /// Hint to the retry strategy whether to use a static exponential base. /// /// When a retry strategy uses exponential backoff, it calculates a random base. This causes the diff --git a/rust-runtime/aws-smithy-eventstream/src/str_bytes.rs b/rust-runtime/aws-smithy-types/src/str_bytes.rs similarity index 92% rename from rust-runtime/aws-smithy-eventstream/src/str_bytes.rs rename to rust-runtime/aws-smithy-types/src/str_bytes.rs index aa76e48c319..96661e77975 100644 --- a/rust-runtime/aws-smithy-eventstream/src/str_bytes.rs +++ b/rust-runtime/aws-smithy-types/src/str_bytes.rs @@ -16,7 +16,7 @@ use std::str::Utf8Error; /// /// Example construction from a `&str`: /// ```rust -/// use aws_smithy_eventstream::str_bytes::StrBytes; +/// use aws_smithy_types::str_bytes::StrBytes; /// /// let value: StrBytes = "example".into(); /// assert_eq!("example", value.as_str()); @@ -26,7 +26,7 @@ use std::str::Utf8Error; /// Example construction from `Bytes`: /// ```rust /// use bytes::Bytes; -/// use aws_smithy_eventstream::str_bytes::StrBytes; +/// use aws_smithy_types::str_bytes::StrBytes; /// use std::convert::TryInto; /// /// let bytes = Bytes::from_static(b"example"); @@ -71,13 +71,6 @@ impl StrBytes { } } -#[cfg(feature = "derive-arbitrary")] -impl<'a> arbitrary::Arbitrary<'a> for StrBytes { - fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result { - Ok(String::arbitrary(unstruct)?.into()) - } -} - impl From for StrBytes { fn from(value: String) -> Self { StrBytes::new(Bytes::from(value)) diff --git a/rust-runtime/aws-smithy-types/src/type_erasure.rs b/rust-runtime/aws-smithy-types/src/type_erasure.rs index 26655856407..86533cb9f3f 100644 --- a/rust-runtime/aws-smithy-types/src/type_erasure.rs +++ b/rust-runtime/aws-smithy-types/src/type_erasure.rs @@ -6,99 +6,35 @@ use std::any::Any; use std::error::Error as StdError; use std::fmt; -use std::marker::PhantomData; -use std::ops::{Deref, DerefMut}; use std::sync::Arc; -/// A [`TypeErasedBox`] with type information tracked via generics at compile-time -/// -/// `TypedBox` is used to transition to/from a `TypeErasedBox`. A `TypedBox` can only -/// be created from a `T` or from a `TypeErasedBox` value that _is a_ `T`. Therefore, it can -/// be assumed to be a `T` even though the underlying storage is still a `TypeErasedBox`. -/// Since the `T` is only used in `PhantomData`, it gets compiled down to just a `TypeErasedBox`. +/// Abstraction over `Box` that provides `Debug` and optionally `Clone`. /// /// The orchestrator uses `TypeErasedBox` to avoid the complication of six or more generic parameters -/// and to avoid the monomorphization that brings with it. This `TypedBox` will primarily be useful -/// for operation-specific or service-specific interceptors that need to operate on the actual -/// input/output/error types. -pub struct TypedBox { - inner: TypeErasedBox, - _phantom: PhantomData, -} - -impl TypedBox -where - T: fmt::Debug + Send + Sync + 'static, -{ - /// Creates a new `TypedBox` from `inner` of type `T` - pub fn new(inner: T) -> Self { - Self { - inner: TypeErasedBox::new(inner), - _phantom: Default::default(), - } - } - - /// Tries to create a `TypedBox` from a `TypeErasedBox`. - /// - /// If the `TypedBox` can't be created due to the `TypeErasedBox`'s value consisting - /// of another type, then the original `TypeErasedBox` will be returned in the `Err` variant. - pub fn assume_from(type_erased: TypeErasedBox) -> Result, TypeErasedBox> { - if type_erased.downcast_ref::().is_some() { - Ok(TypedBox { - inner: type_erased, - _phantom: Default::default(), - }) - } else { - Err(type_erased) - } - } - - /// Converts the `TypedBox` back into `T`. - pub fn unwrap(self) -> T { - *self.inner.downcast::().expect("type checked") - } - - /// Converts the `TypedBox` into a `TypeErasedBox`. - pub fn erase(self) -> TypeErasedBox { - self.inner - } -} - -impl TypedBox -where - T: StdError + fmt::Debug + Send + Sync + 'static, -{ - /// Converts `TypedBox` to a `TypeErasedError` where `T` implements `Error`. - pub fn erase_error(self) -> TypeErasedError { - TypeErasedError::new(self.unwrap()) - } -} - -impl fmt::Debug for TypedBox -where - T: Send + Sync + 'static, -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("TypedBox:")?; - (self.inner.debug)(&self.inner.field, f) - } -} - -impl Deref for TypedBox { - type Target = T; - - fn deref(&self) -> &Self::Target { - self.inner.downcast_ref().expect("type checked") - } -} - -impl DerefMut for TypedBox { - fn deref_mut(&mut self) -> &mut Self::Target { - self.inner.downcast_mut().expect("type checked") - } -} - -/// A new-type around `Box` +/// and to avoid the monomorphization that brings with it. +/// +/// # Examples +/// +/// Creating a box: +/// ```no_run +/// use aws_smithy_types::type_erasure::TypeErasedBox; +/// +/// let boxed = TypeErasedBox::new("some value"); +/// ``` +/// +/// Downcasting a box: +/// ```no_run +/// # use aws_smithy_types::type_erasure::TypeErasedBox; +/// # let boxed = TypeErasedBox::new("some value".to_string()); +/// let value: Option<&String> = boxed.downcast_ref::(); +/// ``` +/// +/// Converting a box back into its value: +/// ``` +/// # use aws_smithy_types::type_erasure::TypeErasedBox; +/// let boxed = TypeErasedBox::new("some value".to_string()); +/// let value: String = *boxed.downcast::().expect("it is a string"); +/// ``` pub struct TypeErasedBox { field: Box, #[allow(clippy::type_complexity)] @@ -122,7 +58,13 @@ impl TypeErasedBox { impl fmt::Debug for TypeErasedBox { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("TypeErasedBox:")?; + f.write_str("TypeErasedBox[")?; + if self.clone.is_some() { + f.write_str("Clone")?; + } else { + f.write_str("!Clone")?; + } + f.write_str("]:")?; (self.debug)(&self.field, f) } } @@ -140,12 +82,13 @@ impl TypeErasedBox { } } + /// Create a new cloneable `TypeErasedBox` from the given `value`. pub fn new_with_clone(value: T) -> Self { let debug = |value: &Box, f: &mut fmt::Formatter<'_>| { fmt::Debug::fmt(value.downcast_ref::().expect("type-checked"), f) }; let clone = |value: &Box| { - TypeErasedBox::new(value.downcast_ref::().expect("typechecked").clone()) + TypeErasedBox::new_with_clone(value.downcast_ref::().expect("typechecked").clone()) }; Self { field: Box::new(value), @@ -154,6 +97,9 @@ impl TypeErasedBox { } } + /// Attempts to clone this box. + /// + /// Note: this will only ever succeed if the box was created with [`TypeErasedBox::new_with_clone`]. pub fn try_clone(&self) -> Option { Some((self.clone.as_ref()?)(&self.field)) } @@ -265,11 +211,25 @@ impl TypeErasedError { ) -> Option<&mut T> { self.field.downcast_mut() } + + /// Returns a `TypeErasedError` with a fake/test value with the expectation that it won't be downcast in the test. + #[cfg(feature = "test-util")] + pub fn doesnt_matter() -> Self { + #[derive(Debug)] + struct FakeError; + impl fmt::Display for FakeError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "FakeError") + } + } + impl StdError for FakeError {} + Self::new(FakeError) + } } #[cfg(test)] mod tests { - use super::{TypeErasedBox, TypeErasedError, TypedBox}; + use super::{TypeErasedBox, TypeErasedError}; use std::fmt; #[derive(Debug)] @@ -277,42 +237,6 @@ mod tests { #[derive(Debug)] struct Bar(isize); - #[test] - fn test_typed_boxes() { - let foo = TypedBox::new(Foo("1")); - let bar = TypedBox::new(Bar(2)); - - assert_eq!("TypedBox:Foo(\"1\")", format!("{foo:?}")); - assert_eq!("TypedBox:Bar(2)", format!("{bar:?}")); - - let mut foo_erased = foo.erase(); - foo_erased - .downcast_mut::() - .expect("I know its a Foo") - .0 = "3"; - - let bar_erased = bar.erase(); - assert_eq!("TypeErasedBox:Foo(\"3\")", format!("{foo_erased:?}")); - assert_eq!("TypeErasedBox:Bar(2)", format!("{bar_erased:?}")); - - let bar_erased = TypedBox::::assume_from(bar_erased).expect_err("it's not a Foo"); - let mut bar = TypedBox::::assume_from(bar_erased).expect("it's a Bar"); - assert_eq!(2, bar.0); - bar.0 += 1; - - let bar = bar.unwrap(); - assert_eq!(3, bar.0); - - assert!(foo_erased.downcast_ref::().is_none()); - assert!(foo_erased.downcast_mut::().is_none()); - let mut foo_erased = foo_erased.downcast::().expect_err("it's not a Bar"); - - assert_eq!("3", foo_erased.downcast_ref::().expect("it's a Foo").0); - foo_erased.downcast_mut::().expect("it's a Foo").0 = "4"; - let foo = *foo_erased.downcast::().expect("it's a Foo"); - assert_eq!("4", foo.0); - } - #[derive(Debug, Clone, PartialEq, Eq)] struct TestErr { inner: &'static str, @@ -345,10 +269,10 @@ mod tests { #[test] fn test_typed_erased_errors_can_be_unwrapped() { let test_err = TestErr::new("something failed!"); - let type_erased_test_err = TypedBox::new(test_err.clone()).erase_error(); - let actual = TypedBox::::assume_from(type_erased_test_err.into()) - .expect("type erased error can be downcast into original type") - .unwrap(); + let type_erased_test_err = TypeErasedError::new(test_err.clone()); + let actual = *type_erased_test_err + .downcast::() + .expect("type erased error can be downcast into original type"); assert_eq!(test_err, actual); } diff --git a/rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json b/rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json index a79e23e4aab..fea94cb6378 100644 --- a/rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json +++ b/rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json @@ -1123,7 +1123,7 @@ "canonical_seconds": "-62133482201", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Thu, 25 Jan 0001 11:23:19.123 GMT" + "smithy_format_value": "Thu, 25 Jan 0001 11:23:19 GMT" }, { "iso8601": "0001-02-01T12:24:12Z", @@ -1179,28 +1179,28 @@ "canonical_seconds": "-62114444917", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Sun, 02 Sep 0001 19:31:23.001 GMT" + "smithy_format_value": "Sun, 02 Sep 0001 19:31:23 GMT" }, { "iso8601": "0001-10-03T20:32:16.01Z", "canonical_seconds": "-62111762864", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Wed, 03 Oct 0001 20:32:16.01 GMT" + "smithy_format_value": "Wed, 03 Oct 0001 20:32:16 GMT" }, { "iso8601": "0001-11-04T21:33:09.1Z", "canonical_seconds": "-62108994411", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Sun, 04 Nov 0001 21:33:09.1 GMT" + "smithy_format_value": "Sun, 04 Nov 0001 21:33:09 GMT" }, { "iso8601": "0001-12-05T22:34:02.123456789Z", "canonical_seconds": "-62106312358", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Wed, 05 Dec 0001 22:34:02.123 GMT" + "smithy_format_value": "Wed, 05 Dec 0001 22:34:02 GMT" }, { "iso8601": "0100-01-06T23:35:55Z", @@ -1256,28 +1256,28 @@ "canonical_seconds": "-58992081474", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Fri, 13 Aug 0100 06:42:06.001 GMT" + "smithy_format_value": "Fri, 13 Aug 0100 06:42:06 GMT" }, { "iso8601": "0100-09-14T07:43:59.01Z", "canonical_seconds": "-58989312961", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Tue, 14 Sep 0100 07:43:59.01 GMT" + "smithy_format_value": "Tue, 14 Sep 0100 07:43:59 GMT" }, { "iso8601": "0100-10-15T08:44:52.1Z", "canonical_seconds": "-58986630908", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Fri, 15 Oct 0100 08:44:52.1 GMT" + "smithy_format_value": "Fri, 15 Oct 0100 08:44:52 GMT" }, { "iso8601": "0100-11-16T09:45:45.123456789Z", "canonical_seconds": "-58983862455", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Tue, 16 Nov 0100 09:45:45.123 GMT" + "smithy_format_value": "Tue, 16 Nov 0100 09:45:45 GMT" }, { "iso8601": "0100-12-17T10:46:38Z", @@ -1291,7 +1291,7 @@ "canonical_seconds": "-12175833601", "canonical_nanos": 999000000, "error": false, - "smithy_format_value": "Wed, 29 Feb 1584 23:59:59.999 GMT" + "smithy_format_value": "Wed, 29 Feb 1584 23:59:59 GMT" }, { "iso8601": "1969-01-18T11:47:31.000000001Z", @@ -1340,28 +1340,28 @@ "canonical_seconds": "-13845971", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Thu, 24 Jul 1969 17:53:49.001 GMT" + "smithy_format_value": "Thu, 24 Jul 1969 17:53:49 GMT" }, { "iso8601": "1969-08-25T18:54:42.01Z", "canonical_seconds": "-11077518", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Mon, 25 Aug 1969 18:54:42.01 GMT" + "smithy_format_value": "Mon, 25 Aug 1969 18:54:42 GMT" }, { "iso8601": "1969-09-26T19:55:35.1Z", "canonical_seconds": "-8309065", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Fri, 26 Sep 1969 19:55:35.1 GMT" + "smithy_format_value": "Fri, 26 Sep 1969 19:55:35 GMT" }, { "iso8601": "1969-10-27T20:56:28.123456789Z", "canonical_seconds": "-5627012", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Mon, 27 Oct 1969 20:56:28.123 GMT" + "smithy_format_value": "Mon, 27 Oct 1969 20:56:28 GMT" }, { "iso8601": "1969-11-28T21:57:21Z", @@ -1417,28 +1417,28 @@ "canonical_seconds": "13406672", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Fri, 05 Jun 1970 04:04:32.001 GMT" + "smithy_format_value": "Fri, 05 Jun 1970 04:04:32 GMT" }, { "iso8601": "1970-07-05T05:05:25.01Z", "canonical_seconds": "16002325", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Sun, 05 Jul 1970 05:05:25.01 GMT" + "smithy_format_value": "Sun, 05 Jul 1970 05:05:25 GMT" }, { "iso8601": "1970-08-06T06:06:18.1Z", "canonical_seconds": "18770778", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Thu, 06 Aug 1970 06:06:18.1 GMT" + "smithy_format_value": "Thu, 06 Aug 1970 06:06:18 GMT" }, { "iso8601": "1970-09-08T07:07:11.123456789Z", "canonical_seconds": "21625631", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Tue, 08 Sep 1970 07:07:11.123 GMT" + "smithy_format_value": "Tue, 08 Sep 1970 07:07:11 GMT" }, { "iso8601": "1970-10-08T08:08:04Z", @@ -1466,7 +1466,7 @@ "canonical_seconds": "1078099199", "canonical_nanos": 999000000, "error": false, - "smithy_format_value": "Sun, 29 Feb 2004 23:59:59.999 GMT" + "smithy_format_value": "Sun, 29 Feb 2004 23:59:59 GMT" }, { "iso8601": "2037-01-11T11:11:43.0000001Z", @@ -1501,28 +1501,28 @@ "canonical_seconds": "2126013315", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Fri, 15 May 2037 15:15:15.001 GMT" + "smithy_format_value": "Fri, 15 May 2037 15:15:15 GMT" }, { "iso8601": "2037-06-17T16:16:08.01Z", "canonical_seconds": "2128868168", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Wed, 17 Jun 2037 16:16:08.01 GMT" + "smithy_format_value": "Wed, 17 Jun 2037 16:16:08 GMT" }, { "iso8601": "2037-07-17T17:17:01.1Z", "canonical_seconds": "2131463821", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Fri, 17 Jul 2037 17:17:01.1 GMT" + "smithy_format_value": "Fri, 17 Jul 2037 17:17:01 GMT" }, { "iso8601": "2037-08-18T18:18:54.123456789Z", "canonical_seconds": "2134232334", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Tue, 18 Aug 2037 18:18:54.123 GMT" + "smithy_format_value": "Tue, 18 Aug 2037 18:18:54 GMT" }, { "iso8601": "2037-09-20T19:19:47Z", @@ -1578,28 +1578,28 @@ "canonical_seconds": "2155948018", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Tue, 27 Apr 2038 02:26:58.001 GMT" + "smithy_format_value": "Tue, 27 Apr 2038 02:26:58 GMT" }, { "iso8601": "2038-05-27T03:27:51.01Z", "canonical_seconds": "2158543671", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Thu, 27 May 2038 03:27:51.01 GMT" + "smithy_format_value": "Thu, 27 May 2038 03:27:51 GMT" }, { "iso8601": "2038-06-29T04:28:44.1Z", "canonical_seconds": "2161398524", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Tue, 29 Jun 2038 04:28:44.1 GMT" + "smithy_format_value": "Tue, 29 Jun 2038 04:28:44 GMT" }, { "iso8601": "2038-07-29T05:29:37.123456789Z", "canonical_seconds": "2163994177", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Thu, 29 Jul 2038 05:29:37.123 GMT" + "smithy_format_value": "Thu, 29 Jul 2038 05:29:37 GMT" }, { "iso8601": "2038-08-30T06:30:30Z", @@ -1655,28 +1655,28 @@ "canonical_seconds": "253376343461", "canonical_nanos": 1000000, "error": false, - "smithy_format_value": "Sat, 06 Mar 9999 13:37:41.001 GMT" + "smithy_format_value": "Sat, 06 Mar 9999 13:37:41 GMT" }, { "iso8601": "9999-04-09T14:38:34.01Z", "canonical_seconds": "253379284714", "canonical_nanos": 10000000, "error": false, - "smithy_format_value": "Fri, 09 Apr 9999 14:38:34.01 GMT" + "smithy_format_value": "Fri, 09 Apr 9999 14:38:34 GMT" }, { "iso8601": "9999-05-08T15:39:27.1Z", "canonical_seconds": "253381793967", "canonical_nanos": 100000000, "error": false, - "smithy_format_value": "Sat, 08 May 9999 15:39:27.1 GMT" + "smithy_format_value": "Sat, 08 May 9999 15:39:27 GMT" }, { "iso8601": "9999-06-11T16:40:20.123456789Z", "canonical_seconds": "253384735220", "canonical_nanos": 123456789, "error": false, - "smithy_format_value": "Fri, 11 Jun 9999 16:40:20.123 GMT" + "smithy_format_value": "Fri, 11 Jun 9999 16:40:20 GMT" }, { "iso8601": "9999-07-10T17:41:13Z", diff --git a/rust-runtime/aws-smithy-xml/Cargo.toml b/rust-runtime/aws-smithy-xml/Cargo.toml index 1563fa0ed76..49d86196c24 100644 --- a/rust-runtime/aws-smithy-xml/Cargo.toml +++ b/rust-runtime/aws-smithy-xml/Cargo.toml @@ -5,7 +5,7 @@ authors = ["AWS Rust SDK Team ", "Russell Cohen -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/aws-smithy-xml/external-types.toml b/rust-runtime/aws-smithy-xml/external-types.toml index b4b49878e52..ff30ccf5ad0 100644 --- a/rust-runtime/aws-smithy-xml/external-types.toml +++ b/rust-runtime/aws-smithy-xml/external-types.toml @@ -1,5 +1,2 @@ allowed_external_types = [ - # TODO(https://github.com/awslabs/smithy-rs/issues/1193): Don't expose `xmlparser` at all - "xmlparser::Token", - "xmlparser::error::Error", ] diff --git a/rust-runtime/aws-smithy-xml/src/decode.rs b/rust-runtime/aws-smithy-xml/src/decode.rs index 522c5b12e35..a81c9dbe5f2 100644 --- a/rust-runtime/aws-smithy-xml/src/decode.rs +++ b/rust-runtime/aws-smithy-xml/src/decode.rs @@ -28,14 +28,6 @@ pub struct XmlDecodeError { kind: XmlDecodeErrorKind, } -impl From for XmlDecodeError { - fn from(error: xmlparser::Error) -> Self { - Self { - kind: XmlDecodeErrorKind::InvalidXml(error), - } - } -} - impl Display for XmlDecodeError { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match &self.kind { @@ -58,6 +50,12 @@ impl Error for XmlDecodeError { } impl XmlDecodeError { + pub(crate) fn invalid_xml(error: xmlparser::Error) -> Self { + Self { + kind: XmlDecodeErrorKind::InvalidXml(error), + } + } + pub(crate) fn invalid_escape(esc: impl Into) -> Self { Self { kind: XmlDecodeErrorKind::InvalidEscape { esc: esc.into() }, @@ -256,6 +254,11 @@ impl<'inp> Document<'inp> { } } +/// A new-type wrapper around `Token` to prevent the wrapped third party type from showing up in +/// public API +#[derive(Debug)] +pub struct XmlToken<'inp>(Token<'inp>); + /// Depth tracking iterator /// /// ```xml @@ -267,11 +270,11 @@ impl<'inp> Document<'inp> { /// <- endel depth 0 /// ``` impl<'inp> Iterator for Document<'inp> { - type Item = Result<(Token<'inp>, Depth), XmlDecodeError>; - fn next<'a>(&'a mut self) -> Option, Depth), XmlDecodeError>> { + type Item = Result<(XmlToken<'inp>, Depth), XmlDecodeError>; + fn next<'a>(&'a mut self) -> Option, Depth), XmlDecodeError>> { let tok = self.tokenizer.next()?; let tok = match tok { - Err(e) => return Some(Err(e.into())), + Err(e) => return Some(Err(XmlDecodeError::invalid_xml(e))), Ok(tok) => tok, }; // depth bookkeeping @@ -290,11 +293,11 @@ impl<'inp> Iterator for Document<'inp> { self.depth += 1; // We want the startel and endel to have the same depth, but after the opener, // the parser will be at depth 1. Return the previous depth: - return Some(Ok((t, self.depth - 1))); + return Some(Ok((XmlToken(t), self.depth - 1))); } _ => {} } - Some(Ok((tok, self.depth))) + Some(Ok((XmlToken(tok), self.depth))) } } @@ -351,7 +354,7 @@ impl<'inp> ScopedDecoder<'inp, '_> { } impl<'inp, 'a> Iterator for ScopedDecoder<'inp, 'a> { - type Item = Result<(Token<'inp>, Depth), XmlDecodeError>; + type Item = Result<(XmlToken<'inp>, Depth), XmlDecodeError>; fn next(&mut self) -> Option { if self.start_el.closed { @@ -365,7 +368,7 @@ impl<'inp, 'a> Iterator for ScopedDecoder<'inp, 'a> { other => return other, }; - match tok { + match tok.0 { Token::ElementEnd { end, .. } if self.start_el.end_el(end, depth) => { self.terminated = true; return None; @@ -378,23 +381,23 @@ impl<'inp, 'a> Iterator for ScopedDecoder<'inp, 'a> { /// Load the next start element out of a depth-tagged token iterator fn next_start_element<'a, 'inp>( - tokens: &'a mut impl Iterator, Depth), XmlDecodeError>>, + tokens: &'a mut impl Iterator, Depth), XmlDecodeError>>, ) -> Option> { let mut out = StartEl::new("", "", 0); loop { match tokens.next()? { - Ok((Token::ElementStart { local, prefix, .. }, depth)) => { + Ok((XmlToken(Token::ElementStart { local, prefix, .. }), depth)) => { out.name.local = local.as_str(); out.name.prefix = prefix.as_str(); out.depth = depth; } Ok(( - Token::Attribute { + XmlToken(Token::Attribute { prefix, local, value, .. - }, + }), _, )) => out.attributes.push(Attr { name: Name { @@ -404,17 +407,17 @@ fn next_start_element<'a, 'inp>( value: unescape(value.as_str()).ok()?, }), Ok(( - Token::ElementEnd { + XmlToken(Token::ElementEnd { end: ElementEnd::Open, .. - }, + }), _, )) => break, Ok(( - Token::ElementEnd { + XmlToken(Token::ElementEnd { end: ElementEnd::Empty, .. - }, + }), _, )) => { out.closed = true; @@ -431,13 +434,13 @@ fn next_start_element<'a, 'inp>( /// If the current position is not a data element (and is instead a ``) an error /// will be returned pub fn try_data<'a, 'inp>( - tokens: &'a mut impl Iterator, Depth), XmlDecodeError>>, + tokens: &'a mut impl Iterator, Depth), XmlDecodeError>>, ) -> Result, XmlDecodeError> { loop { match tokens.next().map(|opt| opt.map(|opt| opt.0)) { None => return Ok(Cow::Borrowed("")), - Some(Ok(Token::Text { text })) => return unescape(text.as_str()), - Some(Ok(e @ Token::ElementStart { .. })) => { + Some(Ok(XmlToken(Token::Text { text }))) => return unescape(text.as_str()), + Some(Ok(e @ XmlToken(Token::ElementStart { .. }))) => { return Err(XmlDecodeError::custom(format!( "looking for a data element, found: {:?}", e diff --git a/rust-runtime/build.gradle.kts b/rust-runtime/build.gradle.kts index f600fec9dd0..8c2fd8c054b 100644 --- a/rust-runtime/build.gradle.kts +++ b/rust-runtime/build.gradle.kts @@ -21,8 +21,8 @@ tasks.jar { } val properties = PropertyRetriever(rootProject, project) -val outputDir = buildDir.resolve("smithy-rs") -val runtimeOutputDir = outputDir.resolve("rust-runtime") +val outputDir = layout.buildDirectory.dir("smithy-rs") +val runtimeOutputDir = outputDir.get().dir("rust-runtime") tasks["assemble"].apply { dependsOn("copyRuntimeCrates") @@ -32,7 +32,7 @@ tasks["assemble"].apply { tasks.register("copyRuntimeCrates") { from("$rootDir/rust-runtime") { - CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { include("$it/**") } + CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { include("${it.name}/**") } } exclude("**/target") exclude("**/Cargo.lock") @@ -43,9 +43,9 @@ tasks.register("copyRuntimeCrates") { tasks.register("fixRuntimeCrateVersions") { dependsOn("copyRuntimeCrates") doLast { - CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { moduleName -> - patchFile(runtimeOutputDir.resolve("$moduleName/Cargo.toml")) { line -> - rewriteRuntimeCrateVersion(properties, line) + CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { module -> + patchFile(runtimeOutputDir.file("${module.name}/Cargo.toml").asFile) { line -> + rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line) } } } @@ -55,7 +55,7 @@ tasks.register("fixManifests") { description = "Run the publisher tool's `fix-manifests` sub-command on the runtime crates" toolPath = rootProject.projectDir.resolve("tools/ci-build/publisher") binaryName = "publisher" - arguments = listOf("fix-manifests", "--location", runtimeOutputDir.absolutePath) + arguments = listOf("fix-manifests", "--location", runtimeOutputDir.asFile.absolutePath) dependsOn("fixRuntimeCrateVersions") } @@ -65,5 +65,5 @@ publishing { from(components["java"]) } } - repositories { maven { url = uri("$buildDir/repository") } } + repositories { maven { url = uri(layout.buildDirectory.dir("repository")) } } } diff --git a/rust-runtime/clippy.toml b/rust-runtime/clippy.toml new file mode 120000 index 00000000000..939baf71835 --- /dev/null +++ b/rust-runtime/clippy.toml @@ -0,0 +1 @@ +../clippy-root.toml \ No newline at end of file diff --git a/rust-runtime/inlineable/Cargo.toml b/rust-runtime/inlineable/Cargo.toml index 5e7351291fc..a32e8da5c87 100644 --- a/rust-runtime/inlineable/Cargo.toml +++ b/rust-runtime/inlineable/Cargo.toml @@ -9,7 +9,7 @@ are to allow this crate to be compilable and testable in isolation, no client co """ license = "Apache-2.0" publish = false -repository = "https://github.com/awslabs/smithy-rs" +repository = "https://github.com/smithy-lang/smithy-rs" [features] # this allows the tests to be excluded from downstream crates to keep dependencies / test times reasonable (e.g. no proptests) @@ -19,21 +19,21 @@ default = ["gated-tests"] [dependencies] async-trait = "0.1" -aws-smithy-http = { path = "../aws-smithy-http" } +aws-smithy-http = { path = "../aws-smithy-http", features = ["event-stream"] } aws-smithy-http-server = { path = "../aws-smithy-http-server" } aws-smithy-json = { path = "../aws-smithy-json" } -aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api" } +aws-smithy-runtime-api = { path = "../aws-smithy-runtime-api", features = ["client"] } aws-smithy-types = { path = "../aws-smithy-types" } aws-smithy-xml = { path = "../aws-smithy-xml" } bytes = "1" -fastrand = "1" +fastrand = "2.0.0" futures-util = "0.3" http = "0.2.1" md-5 = "0.10.0" once_cell = "1.16.0" percent-encoding = "2.2.0" pin-project-lite = "0.2" -regex = "1.5.5" +regex-lite = "0.1.5" tower = { version = "0.4.11", default-features = false } url = "2.2.2" diff --git a/rust-runtime/inlineable/README.md b/rust-runtime/inlineable/README.md index b14c2d9bfd7..14bc80dbbdb 100644 --- a/rust-runtime/inlineable/README.md +++ b/rust-runtime/inlineable/README.md @@ -5,5 +5,5 @@ SDKs. This exists to facilitate writing complex snippets of code that can be tes without needing to create and publish an entire additional crate. -This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator. In most cases, it should not be used directly. +This crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly. diff --git a/rust-runtime/inlineable/src/auth_plugin.rs b/rust-runtime/inlineable/src/auth_plugin.rs new file mode 100644 index 00000000000..068eaa3da28 --- /dev/null +++ b/rust-runtime/inlineable/src/auth_plugin.rs @@ -0,0 +1,39 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::borrow::Cow; + +use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver; +use aws_smithy_runtime_api::client::auth::AuthSchemeId; +use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder; +use aws_smithy_runtime_api::client::runtime_plugin::{Order, RuntimePlugin}; + +#[derive(Debug)] +pub(crate) struct DefaultAuthOptionsPlugin { + runtime_components: RuntimeComponentsBuilder, +} + +impl DefaultAuthOptionsPlugin { + pub(crate) fn new(auth_schemes: Vec) -> Self { + let runtime_components = RuntimeComponentsBuilder::new("default_auth_options") + .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new( + auth_schemes, + ))); + Self { runtime_components } + } +} + +impl RuntimePlugin for DefaultAuthOptionsPlugin { + fn order(&self) -> Order { + Order::Defaults + } + + fn runtime_components( + &self, + _current_components: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.runtime_components) + } +} diff --git a/rust-runtime/inlineable/src/aws_query_compatible_errors.rs b/rust-runtime/inlineable/src/aws_query_compatible_errors.rs index 7a94064d717..a2e851040e8 100644 --- a/rust-runtime/inlineable/src/aws_query_compatible_errors.rs +++ b/rust-runtime/inlineable/src/aws_query_compatible_errors.rs @@ -3,21 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -use http::header::ToStrError; -use http::{HeaderMap, HeaderValue}; +use aws_smithy_runtime_api::http::Headers; const X_AMZN_QUERY_ERROR: &str = "x-amzn-query-error"; const QUERY_COMPATIBLE_ERRORCODE_DELIMITER: char = ';'; -fn aws_query_compatible_error_from_header( - headers: &HeaderMap, -) -> Result, ToStrError> { - headers - .get(X_AMZN_QUERY_ERROR) - .map(|v| v.to_str()) - .transpose() -} - /// Obtains custom error code and error type from the given `headers`. /// /// Looks up a value for the `X_AMZN_QUERY_ERROR` header and if found, the value should be in the @@ -25,12 +15,8 @@ fn aws_query_compatible_error_from_header( /// a (error code, error type) as a tuple. /// /// Any execution path besides the above happy path will yield a `None`. -pub fn parse_aws_query_compatible_error(headers: &HeaderMap) -> Option<(&str, &str)> { - let header_value = match aws_query_compatible_error_from_header(headers) { - Ok(error) => error?, - _ => return None, - }; - +pub fn parse_aws_query_compatible_error(headers: &Headers) -> Option<(&str, &str)> { + let header_value = headers.get(X_AMZN_QUERY_ERROR)?; header_value .find(QUERY_COMPATIBLE_ERRORCODE_DELIMITER) .map(|idx| (&header_value[..idx], &header_value[idx + 1..])) @@ -39,25 +25,9 @@ pub fn parse_aws_query_compatible_error(headers: &HeaderMap) -> Opt #[cfg(test)] mod test { use crate::aws_query_compatible_errors::{ - aws_query_compatible_error_from_header, parse_aws_query_compatible_error, - X_AMZN_QUERY_ERROR, + parse_aws_query_compatible_error, X_AMZN_QUERY_ERROR, }; - - #[test] - fn aws_query_compatible_error_from_header_should_provide_value_for_custom_header() { - let mut response: http::Response<()> = http::Response::default(); - response.headers_mut().insert( - X_AMZN_QUERY_ERROR, - http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue;Sender"), - ); - - let actual = aws_query_compatible_error_from_header(response.headers()).unwrap(); - - assert_eq!( - Some("AWS.SimpleQueueService.NonExistentQueue;Sender"), - actual, - ); - } + use aws_smithy_runtime_api::http::Response; #[test] fn parse_aws_query_compatible_error_should_parse_code_and_type_fields() { @@ -66,6 +36,7 @@ mod test { X_AMZN_QUERY_ERROR, http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue;Sender"), ); + let response = Response::try_from(response).unwrap(); let actual = parse_aws_query_compatible_error(response.headers()); @@ -82,6 +53,7 @@ mod test { X_AMZN_QUERY_ERROR, http::HeaderValue::from_static("AWS.SimpleQueueService.NonExistentQueue"), ); + let response = Response::try_from(response).unwrap(); let actual = parse_aws_query_compatible_error(response.headers()); @@ -95,6 +67,7 @@ mod test { "x-amzn-requestid", http::HeaderValue::from_static("a918fbf2-457a-4fe1-99ba-5685ce220fc1"), ); + let response = Response::try_from(response).unwrap(); let actual = parse_aws_query_compatible_error(response.headers()); diff --git a/rust-runtime/inlineable/src/client_http_checksum_required.rs b/rust-runtime/inlineable/src/client_http_checksum_required.rs index 636016a3fc1..7e65c65ebe3 100644 --- a/rust-runtime/inlineable/src/client_http_checksum_required.rs +++ b/rust-runtime/inlineable/src/client_http_checksum_required.rs @@ -3,32 +3,53 @@ * SPDX-License-Identifier: Apache-2.0 */ +use std::borrow::Cow; + use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut; -use aws_smithy_runtime_api::client::interceptors::{ - Interceptor, InterceptorRegistrar, SharedInterceptor, +use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor}; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, }; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::base64; use aws_smithy_types::config_bag::ConfigBag; -use http::header::HeaderName; #[derive(Debug)] -pub(crate) struct HttpChecksumRequiredRuntimePlugin; +pub(crate) struct HttpChecksumRequiredRuntimePlugin { + runtime_components: RuntimeComponentsBuilder, +} + +impl HttpChecksumRequiredRuntimePlugin { + pub(crate) fn new() -> Self { + Self { + runtime_components: RuntimeComponentsBuilder::new("HttpChecksumRequiredRuntimePlugin") + .with_interceptor(SharedInterceptor::new(HttpChecksumRequiredInterceptor)), + } + } +} impl RuntimePlugin for HttpChecksumRequiredRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(SharedInterceptor::new(HttpChecksumRequiredInterceptor)); + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.runtime_components) } } #[derive(Debug)] struct HttpChecksumRequiredInterceptor; -impl Interceptor for HttpChecksumRequiredInterceptor { +impl Intercept for HttpChecksumRequiredInterceptor { + fn name(&self) -> &'static str { + "HttpChecksumRequiredInterceptor" + } + fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, _cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let request = context.request_mut(); @@ -37,12 +58,9 @@ impl Interceptor for HttpChecksumRequiredInterceptor { .bytes() .expect("checksum can only be computed for non-streaming operations"); let checksum = ::digest(body_bytes); - request.headers_mut().insert( - HeaderName::from_static("content-md5"), - base64::encode(&checksum[..]) - .parse() - .expect("checksum is a valid header value"), - ); + request + .headers_mut() + .insert("content-md5", base64::encode(&checksum[..])); Ok(()) } } diff --git a/rust-runtime/inlineable/src/client_idempotency_token.rs b/rust-runtime/inlineable/src/client_idempotency_token.rs index cf4d2d7e53c..40f361278d1 100644 --- a/rust-runtime/inlineable/src/client_idempotency_token.rs +++ b/rust-runtime/inlineable/src/client_idempotency_token.rs @@ -3,21 +3,25 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::idempotency_token::IdempotencyTokenProvider; +use std::borrow::Cow; +use std::fmt; + use aws_smithy_runtime_api::box_error::BoxError; use aws_smithy_runtime_api::client::interceptors::context::{ BeforeSerializationInterceptorContextMut, Input, }; -use aws_smithy_runtime_api::client::interceptors::{ - Interceptor, InterceptorRegistrar, SharedInterceptor, +use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor}; +use aws_smithy_runtime_api::client::runtime_components::{ + RuntimeComponents, RuntimeComponentsBuilder, }; use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin; use aws_smithy_types::config_bag::ConfigBag; -use std::fmt; + +use crate::idempotency_token::IdempotencyTokenProvider; #[derive(Debug)] pub(crate) struct IdempotencyTokenRuntimePlugin { - interceptor: SharedInterceptor, + runtime_components: RuntimeComponentsBuilder, } impl IdempotencyTokenRuntimePlugin { @@ -26,14 +30,20 @@ impl IdempotencyTokenRuntimePlugin { S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync + 'static, { Self { - interceptor: SharedInterceptor::new(IdempotencyTokenInterceptor { set_token }), + runtime_components: RuntimeComponentsBuilder::new("IdempotencyTokenRuntimePlugin") + .with_interceptor(SharedInterceptor::new(IdempotencyTokenInterceptor { + set_token, + })), } } } impl RuntimePlugin for IdempotencyTokenRuntimePlugin { - fn interceptors(&self, interceptors: &mut InterceptorRegistrar) { - interceptors.register(self.interceptor.clone()); + fn runtime_components( + &self, + _: &RuntimeComponentsBuilder, + ) -> Cow<'_, RuntimeComponentsBuilder> { + Cow::Borrowed(&self.runtime_components) } } @@ -47,13 +57,18 @@ impl fmt::Debug for IdempotencyTokenInterceptor { } } -impl Interceptor for IdempotencyTokenInterceptor +impl Intercept for IdempotencyTokenInterceptor where S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync, { + fn name(&self) -> &'static str { + "IdempotencyTokenInterceptor" + } + fn modify_before_serialization( &self, context: &mut BeforeSerializationInterceptorContextMut<'_>, + _runtime_components: &RuntimeComponents, cfg: &mut ConfigBag, ) -> Result<(), BoxError> { let token_provider = cfg diff --git a/rust-runtime/inlineable/src/endpoint_lib/partition.rs b/rust-runtime/inlineable/src/endpoint_lib/partition.rs index 02088d0f93b..1e58fffe80c 100644 --- a/rust-runtime/inlineable/src/endpoint_lib/partition.rs +++ b/rust-runtime/inlineable/src/endpoint_lib/partition.rs @@ -12,12 +12,12 @@ use crate::endpoint_lib::diagnostic::DiagnosticCollector; use crate::endpoint_lib::partition::deser::deserialize_partitions; use aws_smithy_json::deserialize::error::DeserializeError; -use regex::Regex; +use regex_lite::Regex; use std::borrow::Cow; use std::collections::HashMap; /// Determine the AWS partition metadata for a given region -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] pub(crate) struct PartitionResolver { partitions: Vec, } @@ -151,7 +151,7 @@ impl PartitionResolver { type Str = Cow<'static, str>; -#[derive(Debug)] +#[derive(Clone, Debug)] pub(crate) struct PartitionMetadata { id: Str, region_regex: Regex, @@ -204,7 +204,7 @@ impl PartitionMetadata { } } -#[derive(Debug)] +#[derive(Clone, Debug)] pub(crate) struct PartitionOutput { name: Str, dns_suffix: Str, @@ -213,7 +213,7 @@ pub(crate) struct PartitionOutput { supports_dual_stack: bool, } -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] pub(crate) struct PartitionOutputOverride { name: Option, dns_suffix: Option, @@ -251,7 +251,7 @@ mod deser { expect_bool_or_null, expect_start_object, expect_string_or_null, skip_value, }; use aws_smithy_json::deserialize::{error::DeserializeError, json_token_iter, Token}; - use regex::Regex; + use regex_lite::Regex; use std::borrow::Cow; use std::collections::HashMap; @@ -455,7 +455,7 @@ mod test { use crate::endpoint_lib::partition::{ Partition, PartitionMetadata, PartitionOutput, PartitionOutputOverride, PartitionResolver, }; - use regex::Regex; + use regex_lite::Regex; use std::collections::HashMap; fn resolve<'a>(resolver: &'a PartitionResolver, region: &str) -> Partition<'a> { diff --git a/rust-runtime/inlineable/src/endpoint_lib/s3.rs b/rust-runtime/inlineable/src/endpoint_lib/s3.rs index 4c103d13252..3bf692c6b7d 100644 --- a/rust-runtime/inlineable/src/endpoint_lib/s3.rs +++ b/rust-runtime/inlineable/src/endpoint_lib/s3.rs @@ -6,14 +6,14 @@ use crate::endpoint_lib::diagnostic::DiagnosticCollector; use crate::endpoint_lib::host::is_valid_host_label; use once_cell::sync::Lazy; -use regex::Regex; +use regex_lite::Regex; static VIRTUAL_HOSTABLE_SEGMENT: Lazy = Lazy::new(|| Regex::new("^[a-z\\d][a-z\\d\\-.]{1,61}[a-z\\d]$").unwrap()); static IPV4: Lazy = Lazy::new(|| Regex::new("^(\\d+\\.){3}\\d+$").unwrap()); -static DOTS_AND_DASHES: Lazy = Lazy::new(|| Regex::new("^.*[.-]{2}.*$").unwrap()); +static DOTS_AND_DASHES: Lazy = Lazy::new(|| Regex::new(r#"^.*((\.-)|(-\.)).*$"#).unwrap()); /// Evaluates whether a string is a DNS-compatible bucket name that can be used with virtual hosted-style addressing. pub(crate) fn is_virtual_hostable_s3_bucket( @@ -35,3 +35,20 @@ fn is_virtual_hostable_segment(host_label: &str) -> bool { && !IPV4.is_match(host_label) // don't allow ip address && !DOTS_AND_DASHES.is_match(host_label) // don't allow names like bucket-.name or bucket.-name } + +#[test] +fn check_s3_bucket() { + // check that double dashses are valid + let bucket = "a--b--x-s3"; + assert!(is_virtual_hostable_s3_bucket( + bucket, + false, + &mut DiagnosticCollector::new() + )); + + assert!(!is_virtual_hostable_s3_bucket( + "a-.b-.c", + true, + &mut DiagnosticCollector::new() + )) +} diff --git a/rust-runtime/inlineable/src/event_receiver.rs b/rust-runtime/inlineable/src/event_receiver.rs new file mode 100644 index 00000000000..50b78f7aa37 --- /dev/null +++ b/rust-runtime/inlineable/src/event_receiver.rs @@ -0,0 +1,28 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use aws_smithy_http::event_stream::Receiver; +use aws_smithy_runtime_api::client::result::SdkError; +use aws_smithy_types::event_stream::RawMessage; + +#[derive(Debug)] +/// Receives unmarshalled events at a time out of an Event Stream. +pub struct EventReceiver { + inner: Receiver, +} + +impl EventReceiver { + pub(crate) fn new(inner: Receiver) -> Self { + Self { inner } + } + + /// Asynchronously tries to receive an event from the stream. If the stream has ended, it + /// returns an `Ok(None)`. If there is a transport layer error, it will return + /// `Err(SdkError::DispatchFailure)`. Service-modeled errors will be a part of the returned + /// messages. + pub async fn recv(&mut self) -> Result, SdkError> { + self.inner.recv().await + } +} diff --git a/rust-runtime/inlineable/src/http_checksum_required.rs b/rust-runtime/inlineable/src/http_checksum_required.rs index 636016a3fc1..bf0d17dc0db 100644 --- a/rust-runtime/inlineable/src/http_checksum_required.rs +++ b/rust-runtime/inlineable/src/http_checksum_required.rs @@ -25,7 +25,7 @@ impl RuntimePlugin for HttpChecksumRequiredRuntimePlugin { #[derive(Debug)] struct HttpChecksumRequiredInterceptor; -impl Interceptor for HttpChecksumRequiredInterceptor { +impl Intercept for HttpChecksumRequiredInterceptor { fn modify_before_signing( &self, context: &mut BeforeTransmitInterceptorContextMut<'_>, diff --git a/rust-runtime/inlineable/src/idempotency_token.rs b/rust-runtime/inlineable/src/idempotency_token.rs index 12921f02af8..69425abc80b 100644 --- a/rust-runtime/inlineable/src/idempotency_token.rs +++ b/rust-runtime/inlineable/src/idempotency_token.rs @@ -31,7 +31,7 @@ pub(crate) fn uuid_v4(input: u128) -> String { out } -/// IdempotencyTokenProvider generates idempotency tokens for idempotency API requests +/// IdempotencyTokenProvider generates idempotency tokens for idempotent API requests /// /// Generally, customers will not need to interact with this at all. A sensible default will be /// provided automatically during config construction. However, if you need deterministic behavior diff --git a/rust-runtime/inlineable/src/json_errors.rs b/rust-runtime/inlineable/src/json_errors.rs index c2669a795dd..b785bbe63bb 100644 --- a/rust-runtime/inlineable/src/json_errors.rs +++ b/rust-runtime/inlineable/src/json_errors.rs @@ -5,9 +5,8 @@ use aws_smithy_json::deserialize::token::skip_value; use aws_smithy_json::deserialize::{error::DeserializeError, json_token_iter, Token}; +use aws_smithy_runtime_api::http::Headers; use aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata}; -use http::header::ToStrError; -use http::{HeaderMap, HeaderValue}; use std::borrow::Cow; // currently only used by AwsJson @@ -74,22 +73,15 @@ fn parse_error_body(bytes: &[u8]) -> Result { }) } -fn error_type_from_header(headers: &HeaderMap) -> Result, ToStrError> { - headers - .get("X-Amzn-Errortype") - .map(|v| v.to_str()) - .transpose() -} - pub fn parse_error_metadata( payload: &[u8], - headers: &HeaderMap, + headers: &Headers, ) -> Result { let ErrorBody { code, message } = parse_error_body(payload)?; let mut err_builder = ErrorMetadata::builder(); - if let Some(code) = error_type_from_header(headers) - .map_err(|_| DeserializeError::custom("X-Amzn-Errortype header was not valid UTF-8"))? + if let Some(code) = headers + .get("x-amzn-errortype") .or(code.as_deref()) .map(sanitize_error_code) { @@ -104,22 +96,25 @@ pub fn parse_error_metadata( #[cfg(test)] mod test { use crate::json_errors::{parse_error_body, parse_error_metadata, sanitize_error_code}; - use aws_smithy_types::Error; - use bytes::Bytes; + use aws_smithy_runtime_api::client::orchestrator::HttpResponse; + use aws_smithy_types::{body::SdkBody, error::ErrorMetadata}; use std::borrow::Cow; #[test] fn error_metadata() { - let response = http::Response::builder() - .body(Bytes::from_static( - br#"{ "__type": "FooError", "message": "Go to foo" }"#, - )) - .unwrap(); + let response = HttpResponse::try_from( + http::Response::builder() + .body(SdkBody::from( + r#"{ "__type": "FooError", "message": "Go to foo" }"#, + )) + .unwrap(), + ) + .unwrap(); assert_eq!( - parse_error_metadata(response.body(), response.headers()) + parse_error_metadata(response.body().bytes().unwrap(), response.headers()) .unwrap() .build(), - Error::builder() + ErrorMetadata::builder() .code("FooError") .message("Go to foo") .build() @@ -189,20 +184,23 @@ mod test { // services like lambda use an alternate `Message` instead of `message` #[test] fn alternative_error_message_names() { - let response = http::Response::builder() - .header("x-amzn-errortype", "ResourceNotFoundException") - .body(Bytes::from_static( - br#"{ + let response = HttpResponse::try_from( + http::Response::builder() + .header("x-amzn-errortype", "ResourceNotFoundException") + .body(SdkBody::from( + r#"{ "Type": "User", "Message": "Functions from 'us-west-2' are not reachable from us-east-1" }"#, - )) - .unwrap(); + )) + .unwrap(), + ) + .unwrap(); assert_eq!( - parse_error_metadata(response.body(), response.headers()) + parse_error_metadata(response.body().bytes().unwrap(), response.headers()) .unwrap() .build(), - Error::builder() + ErrorMetadata::builder() .code("ResourceNotFoundException") .message("Functions from 'us-west-2' are not reachable from us-east-1") .build() diff --git a/rust-runtime/inlineable/src/lib.rs b/rust-runtime/inlineable/src/lib.rs index b672eeef9dd..ab322f36ab4 100644 --- a/rust-runtime/inlineable/src/lib.rs +++ b/rust-runtime/inlineable/src/lib.rs @@ -13,6 +13,8 @@ mod client_idempotency_token; mod constrained; #[allow(dead_code)] mod ec2_query_errors; +#[allow(unused)] +mod event_receiver; #[allow(dead_code)] mod idempotency_token; #[allow(dead_code)] @@ -26,6 +28,10 @@ mod serialization_settings; #[allow(unused)] mod endpoint_lib; + +#[allow(unused)] +mod auth_plugin; + // This test is outside of uuid.rs to enable copying the entirety of uuid.rs into the SDK without // requiring a proptest dependency #[cfg(test)] @@ -33,7 +39,7 @@ mod test { use crate::idempotency_token; use crate::idempotency_token::{uuid_v4, IdempotencyTokenProvider}; use proptest::prelude::*; - use regex::Regex; + use regex_lite::Regex; #[test] fn test_uuid() { diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 864d3c411a9..22048ac5bba 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.68.2" +channel = "1.70.0" diff --git a/settings.gradle.kts b/settings.gradle.kts index e33a925bb79..d168d72c0d2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,7 +19,6 @@ include(":aws:rust-runtime") include(":aws:sdk") include(":aws:sdk-adhoc-test") include(":aws:sdk-codegen") -include(":aws:sra-test") pluginManagement { val smithyGradlePluginVersion: String by settings @@ -30,7 +29,7 @@ pluginManagement { buildscript { repositories { - mavenLocal() + /* mavenLocal() */ mavenCentral() google() } diff --git a/tools/.cargo/config.toml b/tools/.cargo/config.toml index 6636645498a..2bf2a2e3e44 100644 --- a/tools/.cargo/config.toml +++ b/tools/.cargo/config.toml @@ -2,7 +2,3 @@ # Tools shouldn't share `target` with the rest of the project to # avoid thrash from differing compiler flags target-dir = "target" - -# TODO(Rust 1.70): The sparse registry config can be removed when upgrading to Rust 1.70 -[registries.crates-io] -protocol = "sparse" diff --git a/tools/ci-build/Dockerfile b/tools/ci-build/Dockerfile index 3e04f15c7d8..bf776eeac3d 100644 --- a/tools/ci-build/Dockerfile +++ b/tools/ci-build/Dockerfile @@ -5,15 +5,15 @@ # This is the base Docker build image used by CI -ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2 -ARG rust_stable_version=1.68.2 +ARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2023 +ARG rust_stable_version=1.70.0 ARG rust_nightly_version=nightly-2023-05-31 FROM ${base_image} AS bare_base_image RUN yum -y updateinfo FROM bare_base_image as musl_toolchain -RUN yum -y install tar gzip gcc make +RUN yum -y install --allowerasing tar gzip gcc make RUN curl https://musl.libc.org/releases/musl-1.2.3.tar.gz -o musl-1.2.3.tar.gz \ && ls \ && tar xvzf musl-1.2.3.tar.gz \ @@ -30,17 +30,19 @@ ENV RUSTUP_HOME=/opt/rustup \ PATH=/opt/cargo/bin/:${PATH} \ CARGO_INCREMENTAL=0 WORKDIR /root -RUN yum -y install \ +RUN yum -y install --allowerasing \ autoconf \ automake \ binutils \ ca-certificates \ + cmake \ curl \ gcc \ gcc-c++ \ git \ make \ openssl-devel \ + perl \ pkgconfig \ tar \ xz && \ @@ -72,11 +74,11 @@ COPY . tools/ci-build # when `checkout_smithy_rs_tools` is set to true, this commit will be checked out ARG smithy_rs_commit_hash=main # If the `checkout_smithy_rs_tools` arg is set to true, then the Dockerfile will acquire the tools -# source code by checking out awslabs/smithy-rs/main rather than copying them from the local directory. +# source code by checking out smithy-lang/smithy-rs/main rather than copying them from the local directory. ARG checkout_smithy_rs_tools=false RUN set -eux; \ if [[ "${checkout_smithy_rs_tools}" == "true" ]]; then \ - git clone https://github.com/awslabs/smithy-rs.git; \ + git clone https://github.com/smithy-lang/smithy-rs.git; \ cd smithy-rs; \ git checkout ${smithy_rs_commit_hash}; \ fi; \ @@ -131,9 +133,8 @@ ARG cargo_wasi_version=0.1.27 RUN cargo install cargo-wasi --locked --version ${cargo_wasi_version} FROM install_rust AS cargo_semver_checks -ARG cargo_semver_checks_version=0.20.0 -ARG rust_nightly_version -RUN cargo +${rust_nightly_version} -Z sparse-registry install cargo-semver-checks --locked --version ${cargo_semver_checks_version} +ARG cargo_semver_checks_version=0.24.1 +RUN cargo install cargo-semver-checks --locked --version ${cargo_semver_checks_version} FROM install_rust AS cargo_mdbook ARG cargo_mdbook_version=0.4.30 @@ -148,15 +149,18 @@ RUN cargo +${rust_nightly_version} -Z sparse-registry install mdbook-mermaid --l # # Final image # +# `clang` needed by SDK examples for `libxlsxwriter-sys` FROM bare_base_image AS final_image ARG rust_stable_version ARG rust_nightly_version RUN set -eux; \ - yum -y install \ + yum -y install --allowerasing \ bc \ ca-certificates \ + clang \ gcc \ git \ + glibc-langpack-en \ java-11-amazon-corretto-headless \ make \ openssl-devel \ @@ -186,7 +190,6 @@ COPY --chown=build:build --from=cargo_mdbook /opt/cargo/bin/mdbook /opt/cargo/bi COPY --chown=build:build --from=cargo_mdbook_mermaid /opt/cargo/bin/mdbook-mermaid /opt/cargo/bin/mdbook-mermaid COPY --chown=build:build --from=musl_toolchain /usr/local/musl/ /usr/local/musl/ ENV PATH=$PATH:/usr/local/musl/bin/ -# TODO(Rust 1.70): The sparse registry config (`CARGO_REGISTRIES_CRATES_IO_PROTOCOL`) can be removed when upgrading to Rust 1.70 ENV PATH=/opt/cargo/bin:$PATH \ CARGO_HOME=/opt/cargo \ RUSTUP_HOME=/opt/rustup \ @@ -194,7 +197,6 @@ ENV PATH=/opt/cargo/bin:$PATH \ GRADLE_USER_HOME=/home/build/.gradle \ RUST_STABLE_VERSION=${rust_stable_version} \ RUST_NIGHTLY_VERSION=${rust_nightly_version} \ - CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse \ CARGO_INCREMENTAL=0 \ RUSTDOCFLAGS="-D warnings" \ RUSTFLAGS="-D warnings" \ @@ -207,4 +209,7 @@ ENV SMITHY_RS_DOCKER_BUILD_IMAGE=1 RUN pip3 install --no-cache-dir mypy==0.991 WORKDIR /home/build COPY sanity-test /home/build/sanity-test +# RUSTUP_TOOLCHAIN takes precedence over everything except `+` args. This will allow us to ignore the toolchain +# file during CI, avoiding issues during Rust version upgrades. +ENV RUSTUP_TOOLCHAIN=${rust_stable_version} RUN /home/build/sanity-test diff --git a/tools/ci-build/README.md b/tools/ci-build/README.md index d7b9204770e..d6e03a861d3 100644 --- a/tools/ci-build/README.md +++ b/tools/ci-build/README.md @@ -21,7 +21,7 @@ To create the starting space, do the following: ```bash cd /path/to/my/starting-space -git clone https://github.com/awslabs/smithy-rs.git +git clone https://github.com/smithy-lang/smithy-rs.git # Optionally check out the revision you want to work with in the checked out smithy-rs. # Just make sure you are in /path/to/my/starting-space (or whatever you called it) after. ``` diff --git a/tools/ci-build/changelogger/Cargo.lock b/tools/ci-build/changelogger/Cargo.lock index 91da13c1616..682f4e12177 100644 --- a/tools/ci-build/changelogger/Cargo.lock +++ b/tools/ci-build/changelogger/Cargo.lock @@ -2,30 +2,45 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -34,7 +49,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -45,11 +60,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -57,11 +87,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -100,12 +136,12 @@ dependencies = [ [[package]] name = "clap" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef2b3ded6a26dfaec672a742c93c8cf6b689220324da509ec5caa20de55dc83" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -117,9 +153,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d756c5824fc5c0c1ee8e36000f576968dbcb2081def956c83fad6f40acd46f96" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck", "proc-macro-error", @@ -153,16 +189,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "diff" version = "0.1.13" @@ -186,7 +212,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -201,12 +227,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fnv" @@ -231,9 +254,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -277,11 +300,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -317,12 +346,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "http" version = "0.2.9" @@ -359,9 +382,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -396,9 +419,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -414,43 +437,23 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -463,24 +466,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -494,16 +494,24 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -536,9 +544,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", ] @@ -552,19 +560,28 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -581,7 +598,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -592,9 +609,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -613,30 +630,21 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - -[[package]] -name = "output_vt100" -version = "0.1.3" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -646,19 +654,17 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -688,18 +694,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -710,14 +716,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -726,15 +744,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64", "bytes", @@ -767,42 +785,47 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -811,9 +834,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -821,35 +844,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -922,9 +945,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -933,15 +956,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -961,9 +984,9 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "time" -version = "0.3.20" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" dependencies = [ "libc", "num_threads", @@ -973,9 +996,9 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "tinyvec" @@ -994,17 +1017,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -1019,9 +1043,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -1049,10 +1073,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1060,20 +1085,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1092,9 +1117,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1107,9 +1132,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -1130,11 +1155,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1146,9 +1170,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1156,24 +1180,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -1183,9 +1207,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1193,28 +1217,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1251,147 +1275,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/tools/ci-build/changelogger/smithy-rs-maintainers.txt b/tools/ci-build/changelogger/smithy-rs-maintainers.txt index 4d980016b97..0c3bb189243 100644 --- a/tools/ci-build/changelogger/smithy-rs-maintainers.txt +++ b/tools/ci-build/changelogger/smithy-rs-maintainers.txt @@ -1,15 +1,10 @@ 82marbag aws-sdk-rust-ci -crisidev david-perez -drganjoo -hlbarber jdisanti -jjant -LukeMathWalker -pose rcoh -unexge velfi -weihanglo ysaito1001 +drganjoo +rschmitt +rhernandez35 diff --git a/tools/ci-build/changelogger/src/render.rs b/tools/ci-build/changelogger/src/render.rs index 4dd8e22c1e4..5b72a253bbf 100644 --- a/tools/ci-build/changelogger/src/render.rs +++ b/tools/ci-build/changelogger/src/render.rs @@ -10,7 +10,7 @@ use once_cell::sync::Lazy; use ordinal::Ordinal; use serde::Serialize; use smithy_rs_tool_common::changelog::{ - Changelog, HandAuthoredEntry, Reference, SdkModelChangeKind, SdkModelEntry, + Changelog, HandAuthoredEntry, Reference, SdkModelChangeKind, SdkModelEntry, ValidationSet, }; use smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI}; use smithy_rs_tool_common::versions_manifest::{CrateVersionMetadataMap, VersionsManifest}; @@ -161,8 +161,13 @@ fn render_model_entry(entry: &SdkModelEntry, out: &mut String) { } fn to_md_link(reference: &Reference) -> String { + let org_name = match reference.repo.as_str() { + "smithy-rs" => "smithy-lang", + "aws-sdk-rust" => "awslabs", + repo => panic!("unrecognized repo named {repo}"), + }; format!( - "[{repo}#{number}](https://github.com/awslabs/{repo}/issues/{number})", + "[{repo}#{number}](https://github.com/{org_name}/{repo}/issues/{number})", repo = reference.repo, number = reference.number ) @@ -175,13 +180,13 @@ fn to_md_link(reference: &Reference) -> String { fn render_entry(entry: &HandAuthoredEntry, mut out: &mut String) { let mut meta = String::new(); if entry.meta.bug { - meta.push('🐛'); + meta.push_str(":bug:"); } if entry.meta.breaking { - meta.push('⚠'); + meta.push_str(":warning:"); } if entry.meta.tada { - meta.push('🎉'); + meta.push_str(":tada:"); } if !meta.is_empty() { meta.push(' '); @@ -237,7 +242,7 @@ fn load_changelogs(args: &RenderArgs) -> Result { for source in &args.source { let changelog = Changelog::load_from_file(source) .map_err(|errs| anyhow::Error::msg(format!("failed to load {source:?}: {errs:#?}")))?; - changelog.validate().map_err(|errs| { + changelog.validate(ValidationSet::Render).map_err(|errs| { anyhow::Error::msg(format!( "failed to load {source:?}: {errors}", errors = errs.join("\n") @@ -290,8 +295,8 @@ fn update_changelogs( tag_name: release_metadata.tag.clone(), name: release_metadata.title.clone(), body: release_notes.clone(), - // All releases are pre-releases for now - prerelease: true, + // stable as of release-2023-11-21 + prerelease: false, }; std::fs::write( output_path.join(&release_metadata.manifest_name), @@ -562,20 +567,20 @@ message = "Some API change" v0.3.0 (January 4th, 2022) ========================== **Breaking Changes:** -- ⚠ (all, [smithy-rs#445](https://github.com/awslabs/smithy-rs/issues/445)) I made a major change to update the code generator +- :warning: (all, [smithy-rs#445](https://github.com/smithy-lang/smithy-rs/issues/445)) I made a major change to update the code generator **New this release:** -- 🎉 (all, [smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator -- 🎉 (all, [smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: (all, [smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: (all, [smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator **Update guide:** blah blah -- (all, [smithy-rs#200](https://github.com/awslabs/smithy-rs/issues/200), @another-contrib) I made a minor change +- (all, [smithy-rs#200](https://github.com/smithy-lang/smithy-rs/issues/200), @another-contrib) I made a minor change **Contributors** Thank you for your contributions! ❤ -- @another-contrib ([smithy-rs#200](https://github.com/awslabs/smithy-rs/issues/200)) -- @external-contrib ([smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446)) +- @another-contrib ([smithy-rs#200](https://github.com/smithy-lang/smithy-rs/issues/200)) +- @external-contrib ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446)) "# .trim_start(); @@ -586,10 +591,10 @@ Thank you for your contributions! ❤ v0.1.0 (January 4th, 2022) ========================== **Breaking Changes:** -- ⚠ ([smithy-rs#445](https://github.com/awslabs/smithy-rs/issues/445)) I made a major change to update the AWS SDK +- :warning: ([smithy-rs#445](https://github.com/smithy-lang/smithy-rs/issues/445)) I made a major change to update the AWS SDK **New this release:** -- 🎉 ([smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator +- :tada: ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator **Service Features:** - `aws-sdk-ec2` (0.12.0): Some API change @@ -600,7 +605,7 @@ v0.1.0 (January 4th, 2022) **Contributors** Thank you for your contributions! ❤ -- @external-contrib ([smithy-rs#446](https://github.com/awslabs/smithy-rs/issues/446)) +- @external-contrib ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446)) "# .trim_start(); diff --git a/tools/ci-build/changelogger/tests/e2e_test.rs b/tools/ci-build/changelogger/tests/e2e_test.rs index 745e73ef471..cbf4d9ceea7 100644 --- a/tools/ci-build/changelogger/tests/e2e_test.rs +++ b/tools/ci-build/changelogger/tests/e2e_test.rs @@ -300,11 +300,11 @@ fn render_smithy_rs() { January 1st, 1970 ================= **New this release:** -- (all, [smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234), @another-dev) Another change +- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change **Contributors** Thank you for your contributions! ❤ -- @another-dev ([smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234)) +- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234)) v0.41.0 (Some date in the past) @@ -318,8 +318,8 @@ Old entry contents r#"{ "tagName": "release-1970-01-01", "name": "January 1st, 1970", - "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234))\n\n", - "prerelease": true + "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\n\n", + "prerelease": false }"#, release_manifest ); @@ -393,14 +393,14 @@ fn render_aws_sdk() { January 1st, 1970 ================= **New this release:** -- 🐛 ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567), @test-dev) Some other change +- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567), @test-dev) Some other change **Service Features:** - `aws-sdk-ec2` (0.12.0): Some API change **Contributors** Thank you for your contributions! ❤ -- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567)) +- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567)) v0.41.0 (Some date in the past) @@ -414,8 +414,8 @@ Old entry contents r#"{ "tagName": "release-1970-01-01", "name": "January 1st, 1970", - "body": "**New this release:**\n- 🐛 ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567), @test-dev) Some other change\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n\n**Contributors**\nThank you for your contributions! ❤\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/awslabs/smithy-rs/issues/567))\n\n", - "prerelease": true + "body": "**New this release:**\n- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567), @test-dev) Some other change\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n\n**Contributors**\nThank you for your contributions! ❤\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567))\n\n", + "prerelease": false }"#, release_manifest ); @@ -467,7 +467,7 @@ author = "rcoh" message = "Fourth change - client" references = ["smithy-rs#4"] meta = { "breaking" = false, "tada" = false, "bug" = false, "target" = "client" } -author = "LukeMathWalker" +author = "rcoh" "#; let tmp_dir = TempDir::new().unwrap(); let source_path = tmp_dir.path().join("source.toml"); @@ -511,17 +511,17 @@ author = "LukeMathWalker" January 1st, 1970 ================= **Breaking Changes:** -- ⚠ (all, [smithy-rs#3](https://github.com/awslabs/smithy-rs/issues/3)) Third change - empty +- :warning: (all, [smithy-rs#3](https://github.com/smithy-lang/smithy-rs/issues/3)) Third change - empty **New this release:** -- (server, [smithy-rs#1](https://github.com/awslabs/smithy-rs/issues/1), @server-dev) First change - server -- (all, [smithy-rs#2](https://github.com/awslabs/smithy-rs/issues/2), @another-dev) Second change - should be all -- (client, [smithy-rs#4](https://github.com/awslabs/smithy-rs/issues/4)) Fourth change - client +- (server, [smithy-rs#1](https://github.com/smithy-lang/smithy-rs/issues/1), @server-dev) First change - server +- (all, [smithy-rs#2](https://github.com/smithy-lang/smithy-rs/issues/2), @another-dev) Second change - should be all +- (client, [smithy-rs#4](https://github.com/smithy-lang/smithy-rs/issues/4)) Fourth change - client **Contributors** Thank you for your contributions! ❤ -- @another-dev ([smithy-rs#2](https://github.com/awslabs/smithy-rs/issues/2)) -- @server-dev ([smithy-rs#1](https://github.com/awslabs/smithy-rs/issues/1)) +- @another-dev ([smithy-rs#2](https://github.com/smithy-lang/smithy-rs/issues/2)) +- @server-dev ([smithy-rs#1](https://github.com/smithy-lang/smithy-rs/issues/1)) v0.41.0 (Some date in the past) @@ -668,11 +668,11 @@ fn render_crate_versions() { January 1st, 1970 ================= **New this release:** -- (all, [smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234), @another-dev) Another change +- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change **Contributors** Thank you for your contributions! ❤ -- @another-dev ([smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234)) +- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234)) **Crate Versions**
@@ -697,8 +697,8 @@ Old entry contents r#"{ "tagName": "release-1970-01-01", "name": "January 1st, 1970", - "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/awslabs/smithy-rs/issues/1234))\n\n**Crate Versions**\n
\nClick to expand to view crate versions...\n\n|Crate|Version|\n|-|-|\n|aws-config|0.54.1|\n|aws-sdk-accessanalyzer|0.24.0|\n|aws-smithy-async|0.54.1|\n
\n\n", - "prerelease": true + "body": "**New this release:**\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\n\n**Crate Versions**\n
\nClick to expand to view crate versions...\n\n|Crate|Version|\n|-|-|\n|aws-config|0.54.1|\n|aws-sdk-accessanalyzer|0.24.0|\n|aws-smithy-async|0.54.1|\n
\n\n", + "prerelease": false }"#, release_manifest ); diff --git a/tools/ci-build/crate-hasher/Cargo.lock b/tools/ci-build/crate-hasher/Cargo.lock index 6c034cc675d..bc931d59845 100644 --- a/tools/ci-build/crate-hasher/Cargo.lock +++ b/tools/ci-build/crate-hasher/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -10,27 +19,29 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] -name = "aho-corasick" -version = "1.0.1" +name = "anyhow" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" -dependencies = [ - "memchr", -] +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] -name = "anyhow" -version = "1.0.70" +name = "async-trait" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] [[package]] name = "atty" @@ -38,7 +49,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -49,12 +60,33 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "block-buffer" version = "0.10.4" @@ -66,14 +98,20 @@ dependencies = [ [[package]] name = "bstr" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", "serde", ] +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + [[package]] name = "cc" version = "1.0.79" @@ -93,7 +131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -113,7 +151,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -127,9 +165,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -159,9 +197,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] @@ -176,16 +214,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "diff" version = "0.1.13" @@ -194,9 +222,9 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -210,7 +238,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -225,12 +253,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "filetime" @@ -241,14 +266,14 @@ dependencies = [ "cfg-if", "libc", "redox_syscall 0.2.16", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", "miniz_oxide", @@ -270,13 +295,19 @@ dependencies = [ "version_check", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "globset" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +checksum = "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df" dependencies = [ - "aho-corasick 0.7.20", + "aho-corasick", "bstr", "fnv", "log", @@ -304,12 +335,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "hex" version = "0.4.3" @@ -344,26 +369,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -372,24 +377,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -399,43 +401,47 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] -name = "output_vt100" -version = "0.1.3" +name = "pin-project-lite" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -448,7 +454,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -465,18 +471,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -487,7 +493,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -496,38 +502,55 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ - "aho-corasick 1.0.1", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -541,15 +564,15 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -558,12 +581,15 @@ dependencies = [ [[package]] name = "sha256" -version = "1.1.3" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f8b5de2bac3a4ae28e9b611072a8e326d9b26c8189c0972d4c321fa684f1f" +checksum = "386f700b0c798d92ac20a53342c240ff9d58030c3b845fbaeb92eead3a774792" dependencies = [ + "async-trait", + "bytes", "hex", "sha2", + "tokio", ] [[package]] @@ -583,11 +609,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tar" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" dependencies = [ "filetime", "libc", @@ -596,15 +633,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -632,6 +669,18 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tokio" +version = "1.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +dependencies = [ + "autocfg", + "backtrace", + "bytes", + "pin-project-lite", +] + [[package]] name = "typenum" version = "1.16.0" @@ -640,9 +689,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "version_check" @@ -691,132 +740,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/tools/ci-build/difftags/Cargo.lock b/tools/ci-build/difftags/Cargo.lock index 849338e2598..1bbe447c25b 100644 --- a/tools/ci-build/difftags/Cargo.lock +++ b/tools/ci-build/difftags/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -36,9 +36,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "clap" -version = "3.2.23" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", "bitflags", @@ -53,9 +53,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.2.18" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck", "proc-macro-error", @@ -90,9 +90,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -114,9 +114,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", @@ -130,9 +130,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "memchr" @@ -142,15 +142,15 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "once_cell" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "os_str_bytes" -version = "6.4.1" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "proc-macro-error" @@ -178,27 +178,39 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.23" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] [[package]] name = "regex" -version = "1.7.1" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -207,9 +219,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "strsim" @@ -219,9 +231,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -245,9 +257,9 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unidiff" diff --git a/tools/ci-build/publisher/Cargo.lock b/tools/ci-build/publisher/Cargo.lock index 9f4f267aed0..7acedde3b8a 100644 --- a/tools/ci-build/publisher/Cargo.lock +++ b/tools/ci-build/publisher/Cargo.lock @@ -2,20 +2,41 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-recursion" @@ -30,13 +51,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -56,11 +77,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -68,6 +104,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "block-buffer" version = "0.10.4" @@ -79,9 +121,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -91,13 +133,12 @@ checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "cargo_toml" -version = "0.10.3" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "363c7cfaa15f101415c4ac9e68706ca4a2277773932828b33f96e59d28c68e62" +checksum = "e3f9629bc6c4388ea699781dc988c2b99766d7679b151c81990b4fa1208fafd3" dependencies = [ "serde", - "serde_derive", - "toml", + "toml 0.8.6", ] [[package]] @@ -114,11 +155,11 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ - "num-integer", + "android-tzdata", "num-traits", "serde", ] @@ -130,10 +171,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.3", "lazy_static", "strsim", "termcolor", @@ -195,9 +236,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -229,16 +270,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "dialoguer" version = "0.8.0" @@ -259,9 +290,9 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -282,6 +313,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.1" @@ -290,7 +327,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -305,12 +342,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fnv" @@ -335,9 +369,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -404,7 +438,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -447,11 +481,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -459,7 +499,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -468,9 +508,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "4.3.6" +version = "4.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "035ef95d03713f2c347a72547b7cd38cbc9af7cd51e6099fb62d586d4a6dee3a" +checksum = "83c3372087601b532857d332f5957cbae686da52bb7810bf038c3e3c3cc2fa0d" dependencies = [ "log", "pest", @@ -486,6 +526,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" + [[package]] name = "heck" version = "0.4.1" @@ -503,18 +549,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -558,9 +595,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -595,9 +632,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -610,46 +647,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", ] [[package]] -name = "instant" -version = "0.1.12" +name = "indexmap" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", + "equivalent", + "hashbrown 0.14.2", ] [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -662,21 +689,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -684,12 +711,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "matchers" @@ -697,7 +721,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -712,16 +736,24 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -753,47 +785,46 @@ dependencies = [ ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "num-traits" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", - "num-traits", ] [[package]] -name = "num-traits" -version = "0.2.15" +name = "num_cpus" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "autocfg", + "hermit-abi 0.3.2", + "libc", ] [[package]] -name = "num_cpus" -version = "1.15.0" +name = "object" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ - "hermit-abi 0.2.6", - "libc", + "memchr", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -810,7 +841,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -821,9 +852,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -833,18 +864,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - -[[package]] -name = "output_vt100" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "overload" @@ -864,28 +886,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", + "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.5.7" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1403e8401ad5dedea73c626b99758535b342502f8d1e361f4a2dd952749122" +checksum = "0d2d1d55045829d65aad9d389139882ad623b33b904e7c9f1b10c5b8927298e5" dependencies = [ "thiserror", "ucd-trie", @@ -893,9 +915,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.5.7" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be99c4c1d2fc2769b1d00239431d711d08f6efedcecb8b6e30707160aee99c15" +checksum = "5f94bca7e7a599d89dea5dfa309e217e7906c3c007fb9c3299c40b10d6a315d3" dependencies = [ "pest", "pest_generator", @@ -903,22 +925,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.7" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56094789873daa36164de2e822b3888c6ae4b4f9da555a1103587658c805b1e" +checksum = "99d490fe7e8556575ff6911e45567ab95e71617f43781e5c05490dc8d75c965c" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "pest_meta" -version = "2.5.7" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6733073c7cff3d8459fda0e42f13a047870242aed8b509fe98000928975f359e" +checksum = "2674c66ebb4b4d9036012091b537aae5878970d6999f81a265034d85b136b341" dependencies = [ "once_cell", "pest", @@ -927,9 +949,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -939,19 +961,17 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -981,9 +1001,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -1001,7 +1021,7 @@ dependencies = [ "dialoguer", "fs-err", "handlebars", - "lazy_static", + "once_cell", "pretty_assertions", "regex", "semver", @@ -1012,47 +1032,39 @@ dependencies = [ "tempfile", "thiserror", "tokio", - "toml", + "toml 0.5.11", "tracing", "tracing-subscriber", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] - [[package]] name = "redox_syscall" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", ] [[package]] @@ -1064,6 +1076,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -1072,15 +1095,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64", "bytes", @@ -1113,48 +1136,53 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -1163,9 +1191,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -1173,41 +1201,50 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -1222,9 +1259,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if", "cpufeatures", @@ -1233,12 +1270,15 @@ dependencies = [ [[package]] name = "sha256" -version = "1.1.3" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f8b5de2bac3a4ae28e9b611072a8e326d9b26c8189c0972d4c321fa684f1f" +checksum = "386f700b0c798d92ac20a53342c240ff9d58030c3b845fbaeb92eead3a774792" dependencies = [ + "async-trait", + "bytes", "hex", "sha2", + "tokio", ] [[package]] @@ -1270,9 +1310,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "smithy-rs-tool-common" @@ -1287,7 +1327,7 @@ dependencies = [ "serde", "serde_json", "tokio", - "toml", + "toml 0.5.11", "tracing", ] @@ -1320,9 +1360,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -1331,15 +1371,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -1369,22 +1409,22 @@ checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -1414,11 +1454,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -1428,7 +1469,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -1439,7 +1480,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -1472,8 +1513,42 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "indexmap", + "indexmap 1.9.3", + "serde", +] + +[[package]] +name = "toml" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ff9e3abce27ee2c9a37f9ad37238c1bdd4e789c84ba37df76aa4d528f5072cc" +dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.0.2", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] @@ -1484,10 +1559,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1495,20 +1571,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -1557,9 +1633,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unicode-bidi" @@ -1569,9 +1645,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1590,9 +1666,9 @@ checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -1619,11 +1695,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1635,9 +1710,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1645,24 +1720,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -1672,9 +1747,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1682,28 +1757,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1740,135 +1815,60 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" @@ -1877,15 +1877,18 @@ checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" +name = "winnow" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +dependencies = [ + "memchr", +] [[package]] name = "winreg" diff --git a/tools/ci-build/publisher/Cargo.toml b/tools/ci-build/publisher/Cargo.toml index 772b80ae0d5..9aa5909980e 100644 --- a/tools/ci-build/publisher/Cargo.toml +++ b/tools/ci-build/publisher/Cargo.toml @@ -17,13 +17,13 @@ opt-level = 0 anyhow = "1.0" async-recursion = "0.3.2" async-trait = "0.1.51" -cargo_toml = "0.10.1" +cargo_toml = "0.16.3" clap = { version = "~3.1.18", features = ["derive"] } crates_io_api = "0.7.3" dialoguer = "0.8" fs-err = "2" handlebars = "4.2" -lazy_static = "1" +once_cell = "1.16.0" regex = "1.5.4" semver = "1.0" serde = { version = "1", features = ["derive"] } diff --git a/tools/ci-build/publisher/src/package.rs b/tools/ci-build/publisher/src/package.rs index c0cd981b0be..7efff2725ec 100644 --- a/tools/ci-build/publisher/src/package.rs +++ b/tools/ci-build/publisher/src/package.rs @@ -218,6 +218,7 @@ fn read_dependencies(path: &Path, dependencies: &DepsSet) -> Result panic!("workspace deps are unsupported"), } } Ok(result) @@ -225,13 +226,14 @@ fn read_dependencies(path: &Path, dependencies: &DepsSet) -> Result Result> { - let manifest = Manifest::from_slice(manifest_bytes) + let mut manifest = Manifest::from_slice(manifest_bytes) .with_context(|| format!("failed to load package manifest for {:?}", path))?; + manifest.complete_from_path(path)?; if let Some(package) = manifest.package { let name = package.name; - let version = parse_version(path, &package.version)?; + let version = parse_version(path, &package.version.unwrap())?; let handle = PackageHandle { name, version }; - let publish = match package.publish { + let publish = match package.publish.unwrap() { cargo_toml::Publish::Flag(true) => Publish::Allowed, _ => Publish::NotAllowed, }; diff --git a/tools/ci-build/publisher/src/publish.rs b/tools/ci-build/publisher/src/publish.rs index 1a835a7a49d..59d4d48b565 100644 --- a/tools/ci-build/publisher/src/publish.rs +++ b/tools/ci-build/publisher/src/publish.rs @@ -7,19 +7,19 @@ use crate::cargo; use crate::package::PackageHandle; use crate::retry::{run_with_retry, BoxError, ErrorClass}; use crates_io_api::{AsyncClient, Error}; -use lazy_static::lazy_static; +use once_cell::sync::Lazy; use smithy_rs_tool_common::shell::ShellOperation; use std::path::Path; use std::time::Duration; use tracing::info; -lazy_static! { - pub static ref CRATES_IO_CLIENT: AsyncClient = AsyncClient::new( +pub static CRATES_IO_CLIENT: Lazy = Lazy::new(|| { + AsyncClient::new( "AWS_RUST_SDK_PUBLISHER (aws-sdk-rust@amazon.com)", - Duration::from_secs(1) + Duration::from_secs(1), ) - .expect("valid client"); -} + .expect("valid client") +}); /// Return `true` if there is at least one version published on crates.io associated with /// the specified crate name. diff --git a/tools/ci-build/publisher/src/sort.rs b/tools/ci-build/publisher/src/sort.rs index 5c1d2732944..6362e9c43da 100644 --- a/tools/ci-build/publisher/src/sort.rs +++ b/tools/ci-build/publisher/src/sort.rs @@ -34,7 +34,7 @@ pub fn dependency_order(packages: Vec) -> Result> { Ok(order .into_iter() - .map(&mut |handle| packages.remove(&handle).unwrap()) + .map(&mut |handle: PackageHandle| packages.remove(&handle).unwrap()) .collect()) } diff --git a/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs b/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs index ae7a41b3045..7e6bb52572e 100644 --- a/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs +++ b/tools/ci-build/publisher/src/subcommand/claim_crate_names.rs @@ -119,7 +119,7 @@ version = "0.0.1" edition = "2021" description = "Placeholder ahead of the next smithy-rs release" license = "Apache-2.0" -repository = "https://github.com/awslabs/smithy-rs""#, +repository = "https://github.com/smithy-lang/smithy-rs""#, package_name ); fs.write_file(directory_path.join("Cargo.toml"), cargo_toml.as_bytes()) diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs index 910f5fd51c6..a22c47f5901 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests.rs @@ -16,12 +16,13 @@ use anyhow::{bail, Context, Result}; use clap::Parser; use semver::Version; use smithy_rs_tool_common::ci::running_in_ci; +use smithy_rs_tool_common::package::PackageStability; use std::collections::BTreeMap; use std::ffi::OsStr; use std::path::{Path, PathBuf}; use toml::value::Table; use toml::Value; -use tracing::info; +use tracing::{debug, info}; mod validate; @@ -72,6 +73,94 @@ struct Manifest { metadata: toml::Value, } +impl Manifest { + /// Returns the `publish` setting for a given crate + fn publish(&self) -> Result { + let value = self.metadata.get("package").and_then(|v| v.get("publish")); + match value { + None => Ok(true), + Some(value) => value.as_bool().ok_or(anyhow::Error::msg(format!( + "unexpected publish setting: {value}" + ))), + } + } + + fn stability(&self) -> Result { + let value = self + .metadata + .get("package") + .and_then(|v| v.get("metadata")) + .and_then(|v| v.get("smithy-rs-release-tooling")) + .and_then(|v| v.get("stable")); + match value { + None => Ok(PackageStability::Unstable), + Some(value) => { + if value.as_bool().ok_or(anyhow::Error::msg(format!( + "unexpected stable setting: {value}" + )))? { + Ok(PackageStability::Stable) + } else { + Ok(PackageStability::Unstable) + } + } + } + } +} + +struct Versions(BTreeMap); +#[derive(Copy, Clone)] +enum FilterType { + AllCrates, + PublishedOnly, +} +struct VersionView<'a>(&'a Versions, FilterType); +impl VersionView<'_> { + fn get(&self, crate_name: &str) -> Option<&Version> { + let version = match (self.1, self.0 .0.get(crate_name)) { + (FilterType::AllCrates, version) => version, + (FilterType::PublishedOnly, v @ Some(VersionWithMetadata { publish: true, .. })) => v, + _ => None, + }; + version.map(|v| &v.version) + } + + fn all_crates(&self) -> Self { + VersionView(self.0, FilterType::AllCrates) + } +} + +impl Versions { + fn published(&self) -> VersionView { + VersionView(self, FilterType::PublishedOnly) + } + + fn published_crates(&self) -> impl Iterator + '_ { + self.0 + .iter() + .filter(|(_, v)| v.publish) + .map(|(k, v)| (k.as_str(), &v.version)) + } + + fn get(&self, crate_name: &str) -> Option<&Version> { + self.0.get(crate_name).map(|v| &v.version) + } + + fn stable(&self, crate_name: &str) -> Option { + match self.0.get(crate_name) { + Some(VersionWithMetadata { stability, .. }) => { + Some(*stability == PackageStability::Stable) + } + _ => None, + } + } +} + +struct VersionWithMetadata { + version: Version, + publish: bool, + stability: PackageStability, +} + async fn read_manifests(fs: Fs, manifest_paths: Vec) -> Result> { let mut result = Vec::new(); for path in manifest_paths { @@ -84,7 +173,7 @@ async fn read_manifests(fs: Fs, manifest_paths: Vec) -> Result Result> { +fn package_versions(manifests: &[Manifest]) -> Result { let mut versions = BTreeMap::new(); for manifest in manifests { // ignore workspace manifests @@ -92,15 +181,8 @@ fn package_versions(manifests: &[Manifest]) -> Result> Some(package) => package, None => continue, }; - // ignore non-publishable crates - if let Some(Value::Boolean(false)) = manifest - .metadata - .get("package") - .expect("checked above") - .get("publish") - { - continue; - } + let publish = manifest.publish()?; + let stability = manifest.stability()?; let name = package .get("name") .and_then(|name| name.as_str()) @@ -114,16 +196,19 @@ fn package_versions(manifests: &[Manifest]) -> Result> anyhow::Error::msg(format!("{:?} is missing a package version", manifest.path)) })?; let version = parse_version(&manifest.path, version)?; - versions.insert(name.into(), version); + versions.insert( + name.into(), + VersionWithMetadata { + version, + publish, + stability, + }, + ); } - Ok(versions) + Ok(Versions(versions)) } -fn fix_dep_set( - versions: &BTreeMap, - key: &str, - metadata: &mut toml::Value, -) -> Result { +fn fix_dep_set(versions: &VersionView, key: &str, metadata: &mut Value) -> Result { let mut changed = 0; if let Some(dependencies) = metadata.as_table_mut().unwrap().get_mut(key) { if let Some(dependencies) = dependencies.as_table_mut() { @@ -143,11 +228,8 @@ fn fix_dep_set( Ok(changed) } -fn update_dep( - table: &mut Table, - dep_name: &str, - versions: &BTreeMap, -) -> Result { +// Update a version of `dep_name` that has a path dependency to be that appearing in `versions`. +fn update_dep(table: &mut Table, dep_name: &str, versions: &VersionView) -> Result { if !table.contains_key("path") { return Ok(0); } @@ -169,9 +251,10 @@ fn update_dep( } } -fn fix_dep_sets(versions: &BTreeMap, metadata: &mut toml::Value) -> Result { +fn fix_dep_sets(versions: &VersionView, metadata: &mut toml::Value) -> Result { let mut changed = fix_dep_set(versions, "dependencies", metadata)?; - changed += fix_dep_set(versions, "dev-dependencies", metadata)?; + // allow dev dependencies to be unpublished + changed += fix_dep_set(&versions.all_crates(), "dev-dependencies", metadata)?; changed += fix_dep_set(versions, "build-dependencies", metadata)?; Ok(changed) } @@ -202,45 +285,53 @@ fn conditionally_disallow_publish( // is not being run from CI, and disallow publish in that case. Also disallow // publishing of examples. if !is_github_actions || is_example { - if let Some(package) = metadata.as_table_mut().unwrap().get_mut("package") { - info!( - "Detected {}. Disallowing publish for {:?}.", - if is_example { "example" } else { "local build" }, - manifest_path, - ); - package - .as_table_mut() - .unwrap() - .insert("publish".into(), toml::Value::Boolean(false)); - return Ok(true); + if let Some(value) = set_publish_false(manifest_path, metadata, is_example) { + return Ok(value); } } Ok(false) } +fn set_publish_false(manifest_path: &Path, metadata: &mut Value, is_example: bool) -> Option { + if let Some(package) = metadata.as_table_mut().unwrap().get_mut("package") { + info!( + "Detected {}. Disallowing publish for {:?}.", + if is_example { "example" } else { "local build" }, + manifest_path, + ); + package + .as_table_mut() + .unwrap() + .insert("publish".into(), toml::Value::Boolean(false)); + return Some(true); + } + None +} + async fn fix_manifests( fs: Fs, - versions: &BTreeMap, + versions: &Versions, manifests: &mut Vec, mode: Mode, ) -> Result<()> { for manifest in manifests { let package_changed = conditionally_disallow_publish(&manifest.path, &mut manifest.metadata)?; - let dependencies_changed = fix_dep_sets(versions, &mut manifest.metadata)?; - if package_changed || dependencies_changed > 0 { + let num_deps_changed = fix_manifest(versions, manifest)?; + if package_changed || num_deps_changed > 0 { let contents = "# Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.\n" .to_string() + &toml::to_string(&manifest.metadata).with_context(|| { format!("failed to serialize to toml for {:?}", manifest.path) })?; + match mode { Mode::Execute => { fs.write_file(&manifest.path, contents.as_bytes()).await?; info!( "Changed {} dependencies in {:?}.", - dependencies_changed, manifest.path + num_deps_changed, manifest.path ); } Mode::Check => { @@ -255,10 +346,86 @@ async fn fix_manifests( Ok(()) } +fn fix_manifest(versions: &Versions, manifest: &mut Manifest) -> Result { + let mut view = versions.published(); + if !manifest.publish()? { + debug!(package = ?&manifest.path, "package has publishing disabled, allowing unpublished crates to be used"); + view = view.all_crates(); + } + fix_dep_sets(&view, &mut manifest.metadata) +} + #[cfg(test)] mod tests { use super::*; + fn make_versions<'a>( + versions: impl Iterator, + ) -> Versions { + let map = versions + .into_iter() + .map(|(name, version, publish, stability)| { + let publish = *publish; + ( + name.to_string(), + VersionWithMetadata { + version: Version::parse(&version).unwrap(), + publish, + stability: *stability, + }, + ) + }) + .collect::>(); + + Versions(map) + } + + #[test] + fn unpublished_deps_cant_be_deps() { + let manifest = br#" + [package] + name = "test" + version = "1.2.0" + + [build-dependencies] + build_something = "1.3" + local_build_something = { path = "../local_build_something", version = "0.4.0-different" } + + [dev-dependencies] + dev_something = "1.1" + local_dev_something = { path = "../local_dev_something" } + + [dependencies] + something = "1.0" + local_something = { path = "../local_something" } + "#; + let metadata = toml::from_slice(manifest).unwrap(); + let mut manifest = Manifest { + path: "test".into(), + metadata, + }; + let versions = &[ + ( + "local_build_something", + "0.2.0", + true, + PackageStability::Unstable, + ), + ( + "local_dev_something", + "0.1.0", + false, + PackageStability::Unstable, + ), + ("local_something", "1.1.3", false, PackageStability::Stable), + ]; + let versions = make_versions(versions.iter()); + fix_manifest(&versions, &mut manifest).expect_err("depends on unpublished local something"); + set_publish_false(&manifest.path, &mut manifest.metadata, false).unwrap(); + fix_manifest(&versions, &mut manifest) + .expect("now it will work, the crate isn't published"); + } + #[test] fn test_fix_dep_sets() { let manifest = br#" @@ -283,16 +450,24 @@ mod tests { path: "test".into(), metadata, }; - let versions = vec![ - ("local_build_something", "0.2.0"), - ("local_dev_something", "0.1.0"), - ("local_something", "1.1.3"), - ] - .into_iter() - .map(|e| (e.0.to_string(), Version::parse(e.1).unwrap())) - .collect(); + let versions = &[ + ( + "local_build_something", + "0.2.0", + true, + PackageStability::Unstable, + ), + ( + "local_dev_something", + "0.1.0", + false, + PackageStability::Unstable, + ), + ("local_something", "1.1.3", true, PackageStability::Stable), + ]; + let versions = make_versions(versions.iter()); - fix_dep_sets(&versions, &mut manifest.metadata).expect("success"); + fix_dep_sets(&versions.published(), &mut manifest.metadata).expect("success"); let actual_deps = &manifest.metadata["dependencies"]; assert_eq!( @@ -347,4 +522,52 @@ mod tests { "aws-sdk-rust/examples/foo/bar/Cargo.toml" )); } + + #[test] + fn test_package_stability_from_manifest() { + fn verify_package_stability_for_manifest( + manifest: &[u8], + expected_stability: PackageStability, + ) { + let metadata = toml::from_slice(manifest).unwrap(); + let manifest = Manifest { + path: "test".into(), + metadata, + }; + assert_eq!(expected_stability, manifest.stability().unwrap()); + } + + let stable_manifest = br#" + [package] + name = "test" + version = "1.0.0" + + [package.metadata.smithy-rs-release-tooling] + stable = true + "#; + verify_package_stability_for_manifest(stable_manifest, PackageStability::Stable); + + let explicitly_unstable_manifest = br#" + [package] + name = "test" + version = "0.1.0" + + [package.metadata.smithy-rs-release-tooling] + stable = false + "#; + verify_package_stability_for_manifest( + explicitly_unstable_manifest, + PackageStability::Unstable, + ); + + let implicitly_unstable_manifest = br#" + [package] + name = "test" + version = "0.1.0" + "#; + verify_package_stability_for_manifest( + implicitly_unstable_manifest, + PackageStability::Unstable, + ); + } } diff --git a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs index 53202468f32..e9924124597 100644 --- a/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs +++ b/tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs @@ -5,10 +5,10 @@ use crate::fs::Fs; use crate::package::discover_and_validate_package_batches; +use crate::subcommand::fix_manifests::Versions; use anyhow::{anyhow, bail, Result}; use semver::Version; use smithy_rs_tool_common::package::PackageCategory; -use std::collections::BTreeMap; use std::path::Path; use tracing::info; @@ -17,7 +17,7 @@ use tracing::info; /// For now, this validates: /// - `aws-smithy-` prefixed versions match `aws-` (NOT `aws-sdk-`) prefixed versions pub(super) fn validate_before_fixes( - versions: &BTreeMap, + versions: &Versions, disable_version_number_validation: bool, ) -> Result<()> { // Later when we only generate independently versioned SDK crates, this flag can become permanent. @@ -26,13 +26,23 @@ pub(super) fn validate_before_fixes( } info!("Pre-validation manifests..."); - let expected_runtime_version = versions + + let expected_stable_runtime_version = versions .get("aws-smithy-types") .ok_or_else(|| anyhow!("`aws-smithy-types` crate missing"))?; - for (name, version) in versions { + let expected_unstable_runtime_version = versions + .get("aws-smithy-http") + .ok_or_else(|| anyhow!("`aws-smithy-http` crate missing"))?; + + for (name, version) in versions.published_crates() { let category = PackageCategory::from_package_name(name); if category == PackageCategory::SmithyRuntime || category == PackageCategory::AwsRuntime { + let expected_runtime_version = if let Some(true) = versions.stable(name) { + expected_stable_runtime_version + } else { + expected_unstable_runtime_version + }; confirm_version(name, expected_runtime_version, version)?; } } @@ -63,23 +73,36 @@ pub(super) async fn validate_after_fixes(location: &Path) -> Result<()> { #[cfg(test)] mod test { use super::*; + use crate::subcommand::fix_manifests::VersionWithMetadata; + use smithy_rs_tool_common::package::PackageStability; + use std::collections::BTreeMap; use std::str::FromStr; - fn versions(versions: &[(&'static str, &'static str)]) -> BTreeMap { + fn versions(versions: &[(&'static str, &'static str, PackageStability)]) -> Versions { let mut map = BTreeMap::new(); - for (name, version) in versions { - map.insert((*name).into(), Version::from_str(version).unwrap()); + for (name, version, stability) in versions { + map.insert( + (*name).into(), + VersionWithMetadata { + version: Version::from_str(version).unwrap(), + publish: true, + stability: *stability, + }, + ); } - map + Versions(map) } #[track_caller] - fn expect_success(version_tuples: &[(&'static str, &'static str)]) { + fn expect_success(version_tuples: &[(&'static str, &'static str, PackageStability)]) { validate_before_fixes(&versions(version_tuples), false).expect("success"); } #[track_caller] - fn expect_failure(message: &str, version_tuples: &[(&'static str, &'static str)]) { + fn expect_failure( + message: &str, + version_tuples: &[(&'static str, &'static str, PackageStability)], + ) { if let Err(err) = validate_before_fixes(&versions(version_tuples), false) { assert_eq!(message, format!("{}", err)); } else { @@ -90,52 +113,51 @@ mod test { #[test] fn pre_validate() { expect_success(&[ - ("aws-config", "0.35.1"), - ("aws-sdk-s3", "0.5.1"), - ("aws-smithy-types", "0.35.1"), - ("aws-types", "0.35.1"), + ("aws-config", "1.5.2", PackageStability::Stable), + ("aws-smithy-http", "0.35.1", PackageStability::Unstable), + ("aws-sdk-s3", "1.5.2", PackageStability::Stable), + ("aws-smithy-types", "1.5.2", PackageStability::Stable), + ("aws-types", "1.5.2", PackageStability::Stable), ]); expect_success(&[ - ("aws-smithy-types", "0.35.1"), - ("aws-smithy-http", "0.35.1"), - ("aws-smithy-client", "0.35.1"), + ("aws-smithy-types", "1.5.2", PackageStability::Stable), + ("aws-smithy-http", "0.35.1", PackageStability::Unstable), ]); expect_failure( - "Crate named `aws-smithy-http` should be at version `0.35.1` but is at `0.35.0`", + "Crate named `aws-smithy-runtime-api` should be at version `1.5.3` but is at `1.5.2`", &[ - ("aws-smithy-types", "0.35.1"), - ("aws-smithy-http", "0.35.0"), - ("aws-smithy-client", "0.35.1"), + ("aws-smithy-runtime-api", "1.5.2", PackageStability::Stable), + ("aws-smithy-types", "1.5.3", PackageStability::Stable), + ("aws-smithy-http", "0.35.0", PackageStability::Unstable), ], ); expect_success(&[ - ("aws-config", "0.35.1"), - ("aws-sdk-s3", "0.5.0"), - ("aws-smithy-types", "0.35.1"), - ("aws-types", "0.35.1"), + ("aws-config", "1.5.2", PackageStability::Stable), + ("aws-smithy-http", "0.35.0", PackageStability::Unstable), + ("aws-sdk-s3", "1.5.2", PackageStability::Stable), + ("aws-smithy-types", "1.5.2", PackageStability::Stable), + ("aws-types", "1.5.2", PackageStability::Stable), ]); expect_failure( - "Crate named `aws-types` should be at version `0.35.1` but is at `0.35.0`", + "Crate named `aws-types` should be at version `1.5.3` but is at `1.5.2`", &[ - ("aws-config", "0.35.1"), - ("aws-sdk-s3", "0.5.1"), - ("aws-smithy-types", "0.35.1"), - ("aws-types", "0.35.0"), + ("aws-config", "1.5.3", PackageStability::Stable), + ("aws-sdk-s3", "1.5.3", PackageStability::Stable), + ("aws-smithy-http", "0.35.0", PackageStability::Unstable), + ("aws-smithy-types", "1.5.3", PackageStability::Stable), + ("aws-types", "1.5.2", PackageStability::Stable), ], ); - expect_failure( - "Crate named `aws-smithy-http` should be at version `0.35.1` but is at `0.35.0`", - &[ - ("aws-config", "0.35.1"), - ("aws-sdk-s3", "0.5.1"), - ("aws-smithy-types", "0.35.1"), - ("aws-smithy-http", "0.35.0"), - ], - ); + expect_success(&[ + ("aws-config", "1.5.3", PackageStability::Stable), + ("aws-sdk-s3", "1.5.3", PackageStability::Stable), + ("aws-smithy-types", "1.5.3", PackageStability::Stable), + ("aws-smithy-http", "0.35.0", PackageStability::Unstable), + ]); } } diff --git a/tools/ci-build/publisher/src/subcommand/hydrate_readme.rs b/tools/ci-build/publisher/src/subcommand/hydrate_readme.rs index 683a570f405..db9b483f034 100644 --- a/tools/ci-build/publisher/src/subcommand/hydrate_readme.rs +++ b/tools/ci-build/publisher/src/subcommand/hydrate_readme.rs @@ -9,6 +9,7 @@ use fs_err as fs; use handlebars::Handlebars; use serde::Serialize; use serde_json::json; +use smithy_rs_tool_common::package::PackageCategory; use smithy_rs_tool_common::versions_manifest::VersionsManifest; use std::path::PathBuf; @@ -41,15 +42,7 @@ pub fn subcommand_hydrate_readme( let template = fs::read_to_string(input) .with_context(|| format!("Failed to read README template file at {input:?}"))?; - let mut context = json!({ "msrv": msrv }); - for (crate_name, metadata) in versions_manifest.crates { - let key = format!("sdk_version_{}", crate_name.replace('-', "_")); - context - .as_object_mut() - .unwrap() - .insert(key, serde_json::Value::String(metadata.version)); - } - + let context = make_context(msrv, &versions_manifest); let hydrated = hydrate_template(&template, &context)?; fs::write(output, hydrated.as_bytes()) .with_context(|| format!("Failed to write hydrated README to {:?}", output))?; @@ -62,10 +55,42 @@ fn hydrate_template(template_string: &str, template_context: &C) - .context("Failed to hydrate README template") } +fn make_context(msrv: &str, versions_manifest: &VersionsManifest) -> serde_json::Value { + let mut context = json!({ "msrv": msrv }); + + // TODO(PostGA): Remove warning banner conditionals + context.as_object_mut().unwrap().insert( + "warning_banner".into(), + serde_json::Value::Bool(!stable_release(versions_manifest)), + ); + + for (crate_name, metadata) in &versions_manifest.crates { + let key = format!("sdk_version_{}", crate_name.replace('-', "_")); + context + .as_object_mut() + .unwrap() + .insert(key, serde_json::Value::String(metadata.version.clone())); + } + context +} + +// TODO(PostGA): Remove warning banner conditionals +fn stable_release(manifest: &VersionsManifest) -> bool { + manifest.crates.iter().any(|(_name, version)| { + version.category == PackageCategory::AwsSdk && !version.version.starts_with("0.") + }) +} + #[cfg(test)] mod tests { use super::hydrate_template; + use crate::subcommand::hydrate_readme::make_context; use serde_json::json; + use smithy_rs_tool_common::package::PackageCategory; + use smithy_rs_tool_common::versions_manifest::{ + CrateVersion, ManualInterventions, VersionsManifest, + }; + use std::collections::BTreeMap; #[test] fn test_hydrate_template() { @@ -90,4 +115,129 @@ mod tests { hydrated, ) } + + fn version(category: PackageCategory, version: &str) -> CrateVersion { + CrateVersion { + category, + version: version.into(), + source_hash: "dontcare".into(), + model_hash: None, + } + } + fn make_manifest(crates: &BTreeMap) -> VersionsManifest { + VersionsManifest { + smithy_rs_revision: "dontcare".into(), + aws_doc_sdk_examples_revision: "dontcare".into(), + manual_interventions: ManualInterventions::default(), + crates: crates.clone(), + release: None, + } + } + + // TODO(PostGA): Remove warning banner conditionals + #[test] + fn test_stable_release() { + // Validate assumptions about package categories with some precondition checks + assert_eq!( + PackageCategory::SmithyRuntime, + PackageCategory::from_package_name("aws-smithy-runtime"), + "precondition" + ); + assert_eq!( + PackageCategory::AwsRuntime, + PackageCategory::from_package_name("aws-runtime"), + "precondition" + ); + assert_eq!( + PackageCategory::AwsSdk, + PackageCategory::from_package_name("aws-sdk-s3"), + "precondition" + ); + + // With S3 at 0.36, it is not considered stable + let mut crates = BTreeMap::new(); + crates.insert( + "aws-smithy-http".to_string(), + version(PackageCategory::SmithyRuntime, "0.36.0"), + ); + crates.insert( + "aws-smithy-runtime".to_string(), + version(PackageCategory::SmithyRuntime, "1.0.0"), + ); + crates.insert( + "aws-runtime".to_string(), + version(PackageCategory::AwsRuntime, "1.0.0"), + ); + crates.insert( + "aws-sdk-s3".to_string(), + version(PackageCategory::AwsSdk, "0.36.0"), + ); + let manifest = make_manifest(&crates); + assert!( + !super::stable_release(&manifest), + "it is not stable since S3 is 0.36" + ); + + // Now with S3 at 1.0, it is considered stable + crates.insert( + "aws-sdk-s3".to_string(), + version(PackageCategory::AwsSdk, "1.0.0"), + ); + let manifest = make_manifest(&crates); + assert!( + super::stable_release(&manifest), + "it is stable since S3 is 1.0" + ); + } + + // TODO(PostGA): Remove warning banner conditionals + #[test] + fn test_warning_banner() { + // First, test with unstable versions + let mut crates = BTreeMap::new(); + crates.insert( + "aws-smithy-runtime".to_string(), + version(PackageCategory::SmithyRuntime, "1.0.0"), + ); + crates.insert( + "aws-runtime".to_string(), + version(PackageCategory::AwsRuntime, "1.0.0"), + ); + crates.insert( + "aws-sdk-s3".to_string(), + version(PackageCategory::AwsSdk, "0.36.0"), + ); + let manifest = make_manifest(&crates); + + let context = make_context("dontcare-msrv", &manifest); + assert!( + context + .as_object() + .unwrap() + .get("warning_banner") + .unwrap() + .as_bool() + .unwrap(), + "it should have the warning banner because it's unstable" + ); + + // Next, test with stable versions + crates.insert( + "aws-sdk-s3".to_string(), + version(PackageCategory::AwsSdk, "1.0.0"), + ); + let manifest = make_manifest(&crates); + + let context = make_context("dontcare-msrv", &manifest); + assert!( + !context + .as_object() + .unwrap() + .get("warning_banner") + .unwrap() + .as_bool() + .unwrap(), + "it should _not_ have the warning banner because it's unstable" + ); + } } diff --git a/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs b/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs index 8132e1fa66e..f9df685bfbe 100644 --- a/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs +++ b/tools/ci-build/publisher/src/subcommand/upgrade_runtime_crates_version.rs @@ -6,13 +6,31 @@ use crate::fs::Fs; use anyhow::{anyhow, bail, Context}; use clap::Parser; +use once_cell::sync::Lazy; use regex::Regex; +use smithy_rs_tool_common::package::PackageStability; use std::borrow::Cow; use std::path::{Path, PathBuf}; +static STABLE_VERSION_REGEX: Lazy = Lazy::new(|| { + Regex::new( + r"(?Psmithy\.rs\.runtime\.crate\.stable\.version=)(?P\d+\.\d+\.\d+.*)", + ) + .unwrap() +}); +static UNSTABLE_VERSION_REGEX: Lazy = Lazy::new(|| { + Regex::new( + r"(?Psmithy\.rs\.runtime\.crate\.unstable\.version=)(?P\d+\.\d+\.\d+.*)", + ) + .unwrap() +}); + #[derive(Parser, Debug)] pub struct UpgradeRuntimeCratesVersionArgs { - /// The version of runtime crates you want the code generator to use (e.g. `0.52.0`). + /// The version of stable runtime crates you want the code generator to use (e.g. `1.0.2`). + #[clap(long)] + stable_version: Option, + /// The version of unstable runtime crates you want the code generator to use (e.g. `0.52.0`). #[clap(long)] version: String, /// The path to the `gradle.properties` file. It will default to `gradle.properties` if @@ -24,17 +42,40 @@ pub struct UpgradeRuntimeCratesVersionArgs { pub async fn subcommand_upgrade_runtime_crates_version( args: &UpgradeRuntimeCratesVersionArgs, ) -> Result<(), anyhow::Error> { - let upgraded_version = semver::Version::parse(args.version.as_str()) + check_crate_ver_against_stability(&args.version, PackageStability::Unstable)?; + let upgraded_unstable_version = semver::Version::parse(args.version.as_str()) .with_context(|| format!("{} is not a valid semver version", &args.version))?; let fs = Fs::Real; let gradle_properties = read_gradle_properties(fs, &args.gradle_properties_path).await?; - let updated_gradle_properties = update_gradle_properties(&gradle_properties, &upgraded_version) + let updated_gradle_properties = update_gradle_properties( + &gradle_properties, + &upgraded_unstable_version, + PackageStability::Unstable, + ) + .with_context(|| { + format!( + "Failed to extract the expected runtime crates version from `{:?}`", + &args.gradle_properties_path + ) + })?; + let updated_gradle_properties = if let Some(stable_version) = &args.stable_version { + check_crate_ver_against_stability(stable_version, PackageStability::Stable)?; + let upgraded_stable_version = semver::Version::parse(stable_version.as_str()) + .with_context(|| format!("{} is not a valid semver version", &stable_version))?; + update_gradle_properties( + &updated_gradle_properties, + &upgraded_stable_version, + PackageStability::Stable, + ) .with_context(|| { format!( "Failed to extract the expected runtime crates version from `{:?}`", &args.gradle_properties_path ) - })?; + })? + } else { + updated_gradle_properties + }; update_gradle_properties_file( fs, &args.gradle_properties_path, @@ -46,11 +87,13 @@ pub async fn subcommand_upgrade_runtime_crates_version( fn update_gradle_properties<'a>( gradle_properties: &'a str, - upgraded_version: &'a semver::Version, + upgraded_version: &semver::Version, + package_stability: PackageStability, ) -> Result, anyhow::Error> { - let version_regex = - Regex::new(r"(?Psmithy\.rs\.runtime\.crate\.version=)(?P\d+\.\d+\.\d+.*)") - .unwrap(); + let version_regex = match package_stability { + PackageStability::Stable => &STABLE_VERSION_REGEX, + PackageStability::Unstable => &UNSTABLE_VERSION_REGEX, + }; let current_version = version_regex .captures(gradle_properties) .ok_or_else(|| anyhow!("Failed to extract the expected runtime crates version"))?; @@ -82,23 +125,96 @@ async fn update_gradle_properties_file( Ok(()) } +fn check_crate_ver_against_stability( + crate_ver: &str, + package_stability: PackageStability, +) -> Result<(), anyhow::Error> { + match package_stability { + PackageStability::Stable if crate_ver.starts_with("0.") => Err(anyhow::Error::msg( + format!("{} is an invalid stable crate version", &crate_ver), + )), + PackageStability::Unstable if !crate_ver.starts_with("0.") => Err(anyhow::Error::msg( + format!("{} is an invalid unstable crate version", &crate_ver), + )), + _ => Ok(()), + } +} + #[cfg(test)] mod tests { - use crate::subcommand::upgrade_runtime_crates_version::update_gradle_properties; + use crate::subcommand::upgrade_runtime_crates_version::{ + check_crate_ver_against_stability, update_gradle_properties, + }; + use smithy_rs_tool_common::package::PackageStability; #[test] - fn upgrading_works_with_actual_version() { - let gradle_properties = "smithy.rs.runtime.crate.version=0.54.2"; + fn upgrading_works_with_actual_unstable_version() { + let gradle_properties = "smithy.rs.runtime.crate.unstable.version=0.54.2"; let version = semver::Version::new(0, 54, 3); - let updated = update_gradle_properties(gradle_properties, &version).unwrap(); - assert_eq!("smithy.rs.runtime.crate.version=0.54.3", updated); + let updated = + update_gradle_properties(gradle_properties, &version, PackageStability::Unstable) + .unwrap(); + assert_eq!("smithy.rs.runtime.crate.unstable.version=0.54.3", updated); } #[test] - fn upgrading_works_with_dummy_version() { - let gradle_properties = "smithy.rs.runtime.crate.version=0.0.0-smithy-rs-head"; + fn upgrading_works_with_dummy_unstable_version() { + let gradle_properties = "smithy.rs.runtime.crate.unstable.version=0.0.0-smithy-rs-head"; let version = semver::Version::new(0, 54, 3); - let updated = update_gradle_properties(gradle_properties, &version).unwrap(); - assert_eq!("smithy.rs.runtime.crate.version=0.54.3", updated); + let updated = + update_gradle_properties(gradle_properties, &version, PackageStability::Unstable) + .unwrap(); + assert_eq!("smithy.rs.runtime.crate.unstable.version=0.54.3", updated); + } + + #[test] + fn upgrading_works_with_actual_stable_version() { + let gradle_properties = "smithy.rs.runtime.crate.stable.version=1.0.2"; + let version = semver::Version::new(1, 0, 3); + let updated = + update_gradle_properties(gradle_properties, &version, PackageStability::Stable) + .unwrap(); + assert_eq!("smithy.rs.runtime.crate.stable.version=1.0.3", updated); + } + + #[test] + fn upgrading_works_with_dummy_stable_version() { + let gradle_properties = "smithy.rs.runtime.crate.stable.version=0.0.0-smithy-rs-head"; + let version = semver::Version::new(1, 0, 3); + let updated = + update_gradle_properties(gradle_properties, &version, PackageStability::Stable) + .unwrap(); + assert_eq!("smithy.rs.runtime.crate.stable.version=1.0.3", updated); + } + + #[test] + fn downgrading_stable_crate_should_be_caught_as_err() { + let gradle_properties = "smithy.rs.runtime.crate.stable.version=1.0.2"; + let version = semver::Version::new(1, 0, 1); + let result = + update_gradle_properties(gradle_properties, &version, PackageStability::Stable); + assert!(result.is_err()); + assert!(format!("{:?}", result).contains("downgrade")); + } + + #[test] + fn downgrading_unstable_crate_should_be_caught_as_err() { + let gradle_properties = "smithy.rs.runtime.crate.unstable.version=0.57.1"; + let version = semver::Version::new(0, 57, 0); + let result = + update_gradle_properties(gradle_properties, &version, PackageStability::Unstable); + assert!(result.is_err()); + assert!(format!("{:?}", result).contains("downgrade")); + } + + #[test] + fn test_check_crate_ver_against_stability() { + assert!(check_crate_ver_against_stability("0.60.0", PackageStability::Stable).is_err()); + assert!(check_crate_ver_against_stability("1.0.0", PackageStability::Stable).is_ok()); + assert!(check_crate_ver_against_stability("2.0.0", PackageStability::Stable).is_ok()); + + assert!(check_crate_ver_against_stability("0.60.0", PackageStability::Unstable).is_ok()); + assert!(check_crate_ver_against_stability("1.0.0", PackageStability::Unstable).is_err()); + assert!(check_crate_ver_against_stability("2.0.0", PackageStability::Unstable).is_err()); } } diff --git a/tools/ci-build/publisher/src/subcommand/yank_release.rs b/tools/ci-build/publisher/src/subcommand/yank_release.rs index 5c73b4b0d4a..12b769a10ac 100644 --- a/tools/ci-build/publisher/src/subcommand/yank_release.rs +++ b/tools/ci-build/publisher/src/subcommand/yank_release.rs @@ -5,11 +5,13 @@ use crate::cargo; use anyhow::{anyhow, bail, Context, Result}; -use clap::Parser; +use clap::{ArgEnum, Parser}; use dialoguer::Confirm; +use smithy_rs_tool_common::package::PackageCategory; use smithy_rs_tool_common::release_tag::ReleaseTag; use smithy_rs_tool_common::shell::ShellOperation; use smithy_rs_tool_common::versions_manifest::{Release, VersionsManifest}; +use std::collections::BTreeMap; use std::path::{Path, PathBuf}; use std::str::FromStr; use std::sync::Arc; @@ -18,6 +20,16 @@ use tracing::info; const MAX_CONCURRENCY: usize = 5; +#[derive(Copy, Clone, Debug, ArgEnum, Eq, PartialEq, Ord, PartialOrd)] +pub enum CrateSet { + /// (default) Yank all crates associated with the release. + All, + /// Yank all AWS SDK crates. + AllAwsSdk, + /// Yank generated AWS SDK crates. + GeneratedAwsSdk, +} + #[derive(Parser, Debug)] pub struct YankReleaseArgs { /// The aws-sdk-rust release tag to yank. The CLI will download the `versions.toml` file @@ -28,12 +40,15 @@ pub struct YankReleaseArgs { /// The `--github-release-tag` option is preferred to this, but this is provided as a fail safe. #[clap(long, required_unless_present = "github-release-tag")] versions_toml: Option, + #[clap(arg_enum)] + crate_set: Option, } pub async fn subcommand_yank_release( YankReleaseArgs { github_release_tag, versions_toml, + crate_set, }: &YankReleaseArgs, ) -> Result<()> { // Make sure cargo exists @@ -47,8 +62,18 @@ pub async fn subcommand_yank_release( } .context("failed to retrieve information about the release to yank")?; + let tag = release + .tag + .as_ref() + .ok_or_else(|| { + anyhow!("Versions manifest doesn't have a release tag. Can only yank tagged releases.") + })? + .clone(); + let crates = filter_crates(crate_set.unwrap_or(CrateSet::All), release); + let _ = release; + // Don't proceed unless the user confirms the plan - confirm_plan(&release)?; + confirm_plan(&tag, &crates)?; // Use a semaphore to only allow a few concurrent yanks let semaphore = Arc::new(Semaphore::new(MAX_CONCURRENCY)); @@ -58,7 +83,7 @@ pub async fn subcommand_yank_release( ); let mut tasks = Vec::new(); - for (crate_name, crate_version) in release.crates { + for (crate_name, crate_version) in crates { let permit = semaphore.clone().acquire_owned().await.unwrap(); tasks.push(tokio::spawn(async move { info!("Yanking `{}-{}`...", crate_name, crate_version); @@ -77,6 +102,25 @@ pub async fn subcommand_yank_release( Ok(()) } +fn filter_crates(crate_set: CrateSet, release: Release) -> BTreeMap { + if crate_set == CrateSet::All { + return release.crates; + } + + release + .crates + .into_iter() + .filter(|c| { + let category = PackageCategory::from_package_name(&c.0); + match crate_set { + CrateSet::All => unreachable!(), + CrateSet::AllAwsSdk => category.is_sdk(), + CrateSet::GeneratedAwsSdk => category == PackageCategory::AwsSdk, + } + }) + .collect() +} + async fn acquire_release_from_tag(tag: &str) -> Result { let tag = ReleaseTag::from_str(tag).context("invalid release tag")?; let manifest = VersionsManifest::from_github_tag(&tag) @@ -98,14 +142,10 @@ fn release_metadata(manifest: VersionsManifest) -> Result { } } -fn confirm_plan(release: &Release) -> Result<()> { - let tag = release.tag.as_ref().ok_or_else(|| { - anyhow!("Versions manifest doesn't have a release tag. Can only yank tagged releases.") - })?; - +fn confirm_plan(tag: &str, crates: &BTreeMap) -> Result<()> { info!("This will yank aws-sdk-rust's `{tag}` release from crates.io."); info!("Crates to yank:"); - for (crate_name, crate_version) in &release.crates { + for (crate_name, crate_version) in crates { info!(" {}-{}", crate_name, crate_version); } diff --git a/tools/ci-build/sdk-lints/Cargo.lock b/tools/ci-build/sdk-lints/Cargo.lock index a3b2511898a..a9981777901 100644 --- a/tools/ci-build/sdk-lints/Cargo.lock +++ b/tools/ci-build/sdk-lints/Cargo.lock @@ -2,30 +2,45 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -34,7 +49,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -45,11 +60,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -57,11 +87,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -99,7 +135,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", "indexmap", @@ -164,7 +200,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -179,12 +215,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fnv" @@ -209,9 +242,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -255,11 +288,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -295,12 +334,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "http" version = "0.2.9" @@ -337,9 +370,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -374,9 +407,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -392,43 +425,23 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -441,24 +454,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -472,16 +482,24 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -502,19 +520,28 @@ dependencies = [ "tempfile", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -531,7 +558,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -542,9 +569,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -554,21 +581,21 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -578,9 +605,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "proc-macro-error" @@ -608,18 +635,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -630,14 +657,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -646,15 +685,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64", "bytes", @@ -687,33 +726,38 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] @@ -731,11 +775,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -744,9 +788,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -754,35 +798,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -855,9 +899,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -866,15 +910,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -909,17 +953,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -934,9 +979,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -964,10 +1009,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -975,20 +1021,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1007,9 +1053,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1022,9 +1068,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -1045,11 +1091,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1061,9 +1106,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1071,24 +1116,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -1098,9 +1143,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1108,28 +1153,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1166,147 +1211,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" diff --git a/tools/ci-build/sdk-lints/src/changelog.rs b/tools/ci-build/sdk-lints/src/changelog.rs index f88e8bcb47f..03a04a2d4e6 100644 --- a/tools/ci-build/sdk-lints/src/changelog.rs +++ b/tools/ci-build/sdk-lints/src/changelog.rs @@ -6,7 +6,7 @@ use crate::lint::LintError; use crate::{repo_root, Check, Lint}; use anyhow::Result; -use smithy_rs_tool_common::changelog::Changelog; +use smithy_rs_tool_common::changelog::{Changelog, ValidationSet}; use std::path::{Path, PathBuf}; pub(crate) struct ChangelogNext; @@ -33,10 +33,12 @@ impl Check for ChangelogNext { /// Validate that `CHANGELOG.next.toml` follows best practices fn check_changelog_next(path: impl AsRef) -> std::result::Result<(), Vec> { let parsed = Changelog::load_from_file(path).map_err(|e| vec![LintError::via_display(e)])?; - parsed.validate().map_err(|errs| { - errs.into_iter() - .map(LintError::via_display) - .collect::>() - })?; + parsed + .validate(ValidationSet::Development) + .map_err(|errs| { + errs.into_iter() + .map(LintError::via_display) + .collect::>() + })?; Ok(()) } diff --git a/tools/ci-build/sdk-lints/src/lint_cargo_toml.rs b/tools/ci-build/sdk-lints/src/lint_cargo_toml.rs index 2bb7610c5a7..c7dee81ed27 100644 --- a/tools/ci-build/sdk-lints/src/lint_cargo_toml.rs +++ b/tools/ci-build/sdk-lints/src/lint_cargo_toml.rs @@ -3,16 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -use crate::anchor::replace_anchor; -use crate::lint::LintError; -use crate::{all_cargo_tomls, Check, Fix, Lint}; +use std::collections::HashSet; +use std::fs::read_to_string; +use std::ops::Deref; +use std::path::{Path, PathBuf}; + use anyhow::{Context, Result}; use cargo_toml::{Manifest, Package}; use serde::de::DeserializeOwned; use serde::Deserialize; -use std::fs::read_to_string; -use std::ops::Deref; -use std::path::{Path, PathBuf}; + +use crate::anchor::replace_anchor; +use crate::lint::LintError; +use crate::{all_cargo_tomls, repo_root, Check, Fix, Lint}; macro_rules! return_errors { ($errs: expr) => { @@ -224,3 +227,170 @@ fn fix_docs_rs(contents: &str) -> Result { )?; Ok(new) } + +#[derive(Deserialize)] +struct SmithyRsMetadata { + #[serde(rename = "smithy-rs-release-tooling")] + smithy_rs_release_tooling: ToolingMetadata, +} + +#[derive(Deserialize)] +struct ToolingMetadata { + stable: bool, +} + +pub(crate) struct StableCratesExposeStableCrates { + stable_crates: HashSet, +} + +impl StableCratesExposeStableCrates { + pub(crate) fn new() -> Result { + let mut stable_crates = all_cargo_tomls()? + .flat_map(crate_is_stable) + .map(|c| c.replace('-', "_")) + .collect::>(); + for crte in [ + "tokio", + "hyper", + "http", + "bytes", + "http-body", + "aws-smithy-eventstream", + ] { + stable_crates.insert(crte.replace('-', "_")); + } + + Ok(Self { stable_crates }) + } +} +impl Lint for StableCratesExposeStableCrates { + fn name(&self) -> &str { + "StableCratesExposeStableCrates" + } + + fn files_to_check(&self) -> Result> { + Ok(all_cargo_tomls()?.collect()) + } +} + +pub(crate) struct SdkExternalLintsExposesStableCrates { + checker: StableCratesExposeStableCrates, +} + +impl SdkExternalLintsExposesStableCrates { + pub(crate) fn new() -> Result { + Ok(Self { + checker: StableCratesExposeStableCrates::new()?, + }) + } +} + +impl Lint for SdkExternalLintsExposesStableCrates { + fn name(&self) -> &str { + "sdk-external-types exposes stable types" + } + + fn files_to_check(&self) -> Result> { + Ok(vec![repo_root().join("aws/sdk/sdk-external-types.toml")]) + } +} + +impl Check for SdkExternalLintsExposesStableCrates { + fn check(&self, path: impl AsRef) -> Result> { + Ok(self + .checker + .check_external_types(path)? + .iter() + .filter(|it| it != &"aws_smithy_http") // currently exposed for transcribe streaming + .map(|crte| { + LintError::new(format!( + "the list of allowed SDK external types contained unstable crate {crte}" + )) + }) + .collect()) + } +} + +impl Check for StableCratesExposeStableCrates { + fn check(&self, path: impl AsRef) -> Result> { + let parsed = match package(path.as_ref()) { + // if the package doesn't parse, someone else figured that out + Err(_) => return Ok(vec![]), + // if there is something wrong, someone figured that out too + Ok(Err(_errs)) => return Ok(vec![]), + Ok(Ok(pkg)) => pkg, + }; + self.check_stable_crates_only_expose_stable_crates(parsed, path) + } +} + +#[derive(Deserialize)] +struct ExternalTypes { + allowed_external_types: Vec, +} + +impl StableCratesExposeStableCrates { + /// returns a list of unstable types exposed by this list + fn check_external_types(&self, external_types: impl AsRef) -> Result> { + let external_types = + toml::from_str::(&read_to_string(external_types.as_ref())?) + .context("invalid external types format")?; + let mut errs = vec![]; + for tpe in external_types.allowed_external_types { + let referenced_crate = tpe.split_once("::").map(|(pkg, _r)| pkg).unwrap_or(&tpe); + if !self.stable_crates.contains(referenced_crate) { + errs.push(referenced_crate.to_string()) + } + } + Ok(errs) + } + fn check_stable_crates_only_expose_stable_crates( + &self, + package: Package, + path: impl AsRef, + ) -> Result> { + // [package.metadata.smithy-rs-release-tooling] + if package + .metadata + .map(|meta| meta.smithy_rs_release_tooling.stable) + == Some(true) + { + let name = package.name; + Ok(self + .check_external_types(path.as_ref().parent().unwrap().join("external-types.toml"))? + .iter() + // TODO(tooling): When tooling allows, specify this at the crate level. These + // are gated in test-util + .filter(|tpe| { + !(name == "aws-smithy-runtime" + && ["tower_service", "serde"].contains(&tpe.as_str())) + }) + .map(|crte| { + LintError::new(format!( + "stable crate {name} exposed {crte} which is unstable" + )) + }) + .collect::>()) + } else { + Ok(vec![]) + } + } +} + +/// if the crate is stable, returns the name of the crate +fn crate_is_stable(path: impl AsRef) -> Option { + let parsed: Package = match package(path.as_ref()) { + // if the package doesn't parse, someone else figured that out + Err(_) => return None, + // if there is something wrong, someone figured that out too + Ok(Err(_errs)) => return None, + Ok(Ok(pkg)) => pkg, + }; + match parsed + .metadata + .map(|meta| meta.smithy_rs_release_tooling.stable) + { + Some(true) => Some(parsed.name), + _ => None, + } +} diff --git a/tools/ci-build/sdk-lints/src/main.rs b/tools/ci-build/sdk-lints/src/main.rs index 501b4852183..d05788387fd 100644 --- a/tools/ci-build/sdk-lints/src/main.rs +++ b/tools/ci-build/sdk-lints/src/main.rs @@ -6,7 +6,10 @@ use crate::changelog::ChangelogNext; use crate::copyright::CopyrightHeader; use crate::lint::{Check, Fix, Lint, LintError, Mode}; -use crate::lint_cargo_toml::{CrateAuthor, CrateLicense, DocsRs}; +use crate::lint_cargo_toml::{ + CrateAuthor, CrateLicense, DocsRs, SdkExternalLintsExposesStableCrates, + StableCratesExposeStableCrates, +}; use crate::readmes::{ReadmesExist, ReadmesHaveFooters}; use crate::todos::TodosHaveContext; use anyhow::{bail, Context, Result}; @@ -135,6 +138,8 @@ fn main() -> Result<()> { if todos || all { errs.extend(TodosHaveContext.check_all()?); } + errs.extend(StableCratesExposeStableCrates::new()?.check_all()?); + errs.extend(SdkExternalLintsExposesStableCrates::new()?.check_all()?); ok(errs)? } Args::Fix { diff --git a/tools/ci-build/sdk-lints/src/readmes.rs b/tools/ci-build/sdk-lints/src/readmes.rs index 392a4d63dfc..9259197cc1b 100644 --- a/tools/ci-build/sdk-lints/src/readmes.rs +++ b/tools/ci-build/sdk-lints/src/readmes.rs @@ -66,7 +66,7 @@ impl Fix for ReadmesHaveFooters { const README_FOOTER: &str = "\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) \ -and the [smithy-rs](https://github.com/awslabs/smithy-rs) code generator."; +and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator."; const NOT_TO_BE_USED_DIRECTLY: &str = " In most cases, it should not be used directly."; fn fix_readme(path: impl AsRef, to_be_used_directly: bool) -> Result<(bool, String)> { diff --git a/tools/ci-build/sdk-lints/src/todos.rs b/tools/ci-build/sdk-lints/src/todos.rs index 06cc50db3fe..c6f9affa8fc 100644 --- a/tools/ci-build/sdk-lints/src/todos.rs +++ b/tools/ci-build/sdk-lints/src/todos.rs @@ -25,7 +25,7 @@ impl Lint for TodosHaveContext { ext.eq_ignore_ascii_case("rs") || ext.eq_ignore_ascii_case("toml") || ext.eq_ignore_ascii_case("txt") - // TODO(https://github.com/awslabs/smithy-rs/issues/2077) + // TODO(https://github.com/smithy-lang/smithy-rs/issues/2077) // || ext.eq_ignore_ascii_case("md") || ext.eq_ignore_ascii_case("sh") || ext.eq_ignore_ascii_case("py") diff --git a/tools/ci-build/sdk-versioner/Cargo.lock b/tools/ci-build/sdk-versioner/Cargo.lock index eafd9037eed..0ff7ddce42e 100644 --- a/tools/ci-build/sdk-versioner/Cargo.lock +++ b/tools/ci-build/sdk-versioner/Cargo.lock @@ -2,30 +2,45 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -34,7 +49,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi", ] @@ -45,11 +60,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bitflags" @@ -57,11 +87,17 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" + [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bytes" @@ -88,10 +124,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.3", "lazy_static", "strsim", "termcolor", @@ -136,16 +172,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - [[package]] name = "diff" version = "0.1.13" @@ -161,6 +187,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.1" @@ -169,7 +201,7 @@ checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -184,12 +216,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fnv" @@ -214,9 +243,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -260,11 +289,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -272,7 +307,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -285,6 +320,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "heck" version = "0.4.1" @@ -300,12 +341,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "http" version = "0.2.9" @@ -342,9 +377,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -379,9 +414,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -394,46 +429,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", + "hashbrown 0.12.3", ] [[package]] -name = "io-lifetimes" -version = "1.0.10" +name = "indexmap" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", + "equivalent", + "hashbrown 0.14.0", ] [[package]] name = "ipnet" -version = "2.7.2" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" dependencies = [ "wasm-bindgen", ] @@ -446,24 +471,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -477,16 +499,24 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -507,19 +537,28 @@ dependencies = [ "tempfile", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "foreign-types", "libc", @@ -536,7 +575,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] @@ -547,9 +586,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -559,18 +598,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.5.0" +version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" - -[[package]] -name = "output_vt100" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" -dependencies = [ - "winapi", -] +checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" [[package]] name = "pathdiff" @@ -580,15 +610,15 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -598,19 +628,17 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -640,18 +668,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -662,14 +690,26 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" dependencies = [ "aho-corasick", "memchr", @@ -678,15 +718,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ "base64", "bytes", @@ -719,33 +759,38 @@ dependencies = [ "winreg", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags", + "bitflags 2.3.3", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys", ] [[package]] @@ -763,11 +808,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -776,9 +821,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -786,35 +831,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "a4e7b8c5dc823e3b90651ff1d3808419cd14e5ad76de04feaf37da114e7a306f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -887,9 +932,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -898,15 +943,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", "redox_syscall", "rustix", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -941,17 +986,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -966,9 +1012,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -984,23 +1030,23 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "indexmap", + "indexmap 1.9.3", "serde", ] [[package]] name = "toml_datetime" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.8" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" dependencies = [ - "indexmap", + "indexmap 2.0.0", "toml_datetime", "winnow", ] @@ -1013,10 +1059,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1024,20 +1071,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.27", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", ] @@ -1056,9 +1103,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -1071,9 +1118,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna", @@ -1094,11 +1141,10 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -1110,9 +1156,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1120,24 +1166,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" dependencies = [ "cfg-if", "js-sys", @@ -1147,9 +1193,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1157,28 +1203,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" dependencies = [ "js-sys", "wasm-bindgen", @@ -1215,147 +1261,66 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.42.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.0" @@ -1364,9 +1329,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11" dependencies = [ "memchr", ] diff --git a/tools/ci-build/sdk-versioner/README.md b/tools/ci-build/sdk-versioner/README.md index 866ed5cb2f8..45247fd4c58 100644 --- a/tools/ci-build/sdk-versioner/README.md +++ b/tools/ci-build/sdk-versioner/README.md @@ -12,12 +12,12 @@ Example updating SDK examples to use SDK version 0.5.0 with Smithy version 0.35. $ sdk-versioner \ --sdk-version 0.5.0 \ --smithy-version 0.35.0 \ - path/to/aws-doc-sdk-examples/rust_dev_preview + path/to/aws-doc-sdk-examples/rustv1 ``` Example updating SDK examples to refer to local generated code: ```bash $ sdk-versioner \ --sdk-path path/to/smithy-rs/aws/sdk/build/aws-sdk/sdk \ - path/to/aws-doc-sdk-examples/rust_dev_preview + path/to/aws-doc-sdk-examples/rustv1 ``` diff --git a/tools/ci-build/sdk-versioner/src/main.rs b/tools/ci-build/sdk-versioner/src/main.rs index 63ffd6bd2f3..39d81722f39 100644 --- a/tools/ci-build/sdk-versioner/src/main.rs +++ b/tools/ci-build/sdk-versioner/src/main.rs @@ -29,10 +29,6 @@ enum Args { /// Path(s) to recursively update Cargo.toml files in #[clap()] crate_paths: Vec, - // TODO(https://github.com/awslabs/smithy-rs/issues/2810): `isolate_crates` can be removed once the `Flat` example directory structure is cleaned up - /// Makes each individual crate its own workspace - #[clap(long)] - isolate_crates: bool, }, /// Revise crates to use version numbers in dependencies UseVersionDependencies { @@ -42,10 +38,6 @@ enum Args { /// Path(s) to recursively update Cargo.toml files in #[clap()] crate_paths: Vec, - // TODO(https://github.com/awslabs/smithy-rs/issues/2810): `isolate_crates` can be removed once the `Flat` example directory structure is cleaned up - /// Makes each individual crate its own workspace - #[clap(long)] - isolate_crates: bool, }, /// Revise crates to use version numbers AND paths in dependencies UsePathAndVersionDependencies { @@ -58,10 +50,6 @@ enum Args { /// Path(s) to recursively update Cargo.toml files in #[clap()] crate_paths: Vec, - // TODO(https://github.com/awslabs/smithy-rs/issues/2810): `isolate_crates` can be removed once the `Flat` example directory structure is cleaned up - /// Makes each individual crate its own workspace - #[clap(long)] - isolate_crates: bool, }, } @@ -74,14 +62,6 @@ impl Args { } } - fn isolate_crates(&self) -> bool { - *match self { - Self::UsePathDependencies { isolate_crates, .. } => isolate_crates, - Self::UseVersionDependencies { isolate_crates, .. } => isolate_crates, - Self::UsePathAndVersionDependencies { isolate_crates, .. } => isolate_crates, - } - } - fn validate(self) -> Result { if self.crate_paths().is_empty() { bail!("Must provide at least one crate path to recursively update"); @@ -90,7 +70,7 @@ impl Args { } } -// TODO(https://github.com/awslabs/smithy-rs/issues/2810): Remove `SdkPath` and just use a `PathBuf` with the new logic +// TODO(https://github.com/smithy-lang/smithy-rs/issues/2810): Remove `SdkPath` and just use a `PathBuf` with the new logic // This is only around for backwards compatibility for the next release's sync process0 enum SdkPath { /// Don't even attempt to resolve the correct relative path to dependencies @@ -141,7 +121,7 @@ fn main() -> Result<()> { } for manifest_path in manifest_paths { - update_manifest(&manifest_path, &dependency_context, args.isolate_crates())?; + update_manifest(&manifest_path, &dependency_context)?; } println!("Finished in {:?}", start_time.elapsed()); @@ -151,7 +131,6 @@ fn main() -> Result<()> { fn update_manifest( manifest_path: &Path, dependency_context: &DependencyContext, - isolate_crates: bool, ) -> anyhow::Result<()> { println!("Updating {:?}...", manifest_path); let crate_path = manifest_path.parent().expect("manifest has a parent"); @@ -179,17 +158,6 @@ fn update_manifest( )? || changed; } } - if isolate_crates && !metadata.contains_key("workspace") { - let package_position = metadata["package"] - .as_table() - .expect("has a package") - .position() - .unwrap_or_default(); - let mut workspace = Table::new(); - workspace.set_position(package_position); - metadata.insert("workspace", Item::Table(workspace)); - changed = true; - } if changed { fs::write(manifest_path, metadata.to_string())?; @@ -373,7 +341,6 @@ features = ["foo", "baz"] #[track_caller] fn test_with_context( - isolate_crates: bool, crate_path_rel: &str, sdk_crates: &[&'static str], context: DependencyContext, @@ -412,7 +379,7 @@ features = ["foo", "baz"] } else { context }; - update_manifest(&manifest_path, &fixed_context, isolate_crates).expect("success"); + update_manifest(&manifest_path, &fixed_context).expect("success"); let actual = String::from_utf8(std::fs::read(&manifest_path).expect("read tmp file")).unwrap(); @@ -423,7 +390,6 @@ features = ["foo", "baz"] #[test] fn update_dependencies_with_versions() { test_with_context( - false, "examples/foo", &[], DependencyContext { @@ -461,7 +427,6 @@ features = ["foo", "baz"] #[test] fn update_dependencies_with_paths() { test_with_context( - false, "path/to/test", &[ "aws-config", @@ -496,11 +461,9 @@ features = ["foo", "baz"] ); } - // TODO(https://github.com/awslabs/smithy-rs/issues/2810): Remove this test #[test] fn update_dependencies_with_paths_dumb_logic() { test_with_context( - false, "path/to/test", &[ "aws-config", @@ -538,7 +501,6 @@ features = ["foo", "baz"] #[test] fn update_dependencies_with_versions_and_paths() { test_with_context( - false, "deep/path/to/test", &[ "aws-config", @@ -569,51 +531,6 @@ aws-smithy-http = { version = "0.9.0", path = "../../../../sdk/aws-smithy-http", something-else = { version = "0.1", no-default-features = true } tokio = { version = "1.18", features = ["net"] } -[dev-dependencies.another-thing] -# some comment -version = "5.0" -# another comment -features = ["foo", "baz"] -"# - ); - } - - #[test] - fn update_dependencies_isolate_crates() { - test_with_context( - true, - "deep/path/to/test", - &[ - "aws-config", - "aws-sdk-s3", - "aws-smithy-types", - "aws-smithy-http", - ], - DependencyContext { - sdk_path: Some(SdkPath::UseNewLogic(PathBuf::from("sdk"))), - versions_manifest: Some(versions_toml_for(&[ - ("aws-config", "0.5.0"), - ("aws-sdk-s3", "0.13.0"), - ("aws-smithy-types", "0.10.0"), - ("aws-smithy-http", "0.9.0"), - ])), - }, - br#" -[package] -name = "test" -version = "0.1.0" - -[workspace] - -# Some comment that should be preserved -[dependencies] -aws-config = { version = "0.5.0", path = "../../../../sdk/aws-config" } -aws-sdk-s3 = { version = "0.13.0", path = "../../../../sdk/s3" } -aws-smithy-types = { version = "0.10.0", path = "../../../../sdk/aws-smithy-types" } -aws-smithy-http = { version = "0.9.0", path = "../../../../sdk/aws-smithy-http", features = ["test-util"] } -something-else = { version = "0.1", no-default-features = true } -tokio = { version = "1.18", features = ["net"] } - [dev-dependencies.another-thing] # some comment version = "5.0" diff --git a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs index acdee013ae4..fa67649c11d 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/changelog.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/changelog.rs @@ -139,16 +139,23 @@ pub struct HandAuthoredEntry { impl HandAuthoredEntry { /// Validate a changelog entry to ensure it follows standards - pub fn validate(&self) -> Result<()> { + pub fn validate(&self, validation_set: ValidationSet) -> Result<()> { if self.author.is_empty() { bail!("Author must be set (was empty)"); } if !self.author.chars().all(|c| c.is_alphanumeric() || c == '-') { bail!("Author must be valid GitHub username: [a-zA-Z0-9\\-]") } - if self.references.is_empty() { + if validation_set == ValidationSet::Development && self.references.is_empty() { bail!("Changelog entry must refer to at least one pull request or issue"); } + if validation_set == ValidationSet::Development && self.message.len() > 800 { + bail!( + "Your changelog entry is too long. Post long-form change log entries in \ + the GitHub Discussions under the Changelog category, and link to them from \ + the changelog." + ); + } Ok(()) } @@ -172,6 +179,19 @@ pub struct SdkModelEntry { pub message: String, } +#[derive(Copy, Clone, Eq, PartialEq)] +pub enum ValidationSet { + /// Validate for local development and CI + Development, + /// Validate for rendering. + /// + /// This does less validation to avoid blocking a release for things that + /// were added to changelog validation later that could cause issues with + /// SDK_CHANGELOG.next.json where there are historical entries that didn't + /// have this validation applied. + Render, +} + #[derive(Clone, Default, Debug, Deserialize, Serialize)] pub struct Changelog { #[serde(rename = "smithy-rs")] @@ -236,9 +256,9 @@ impl Changelog { serde_json::to_string_pretty(self).context("failed to serialize changelog JSON") } - pub fn validate(&self) -> Result<(), Vec> { + pub fn validate(&self, validation_set: ValidationSet) -> Result<(), Vec> { let validate_aws_handauthored = |entry: &HandAuthoredEntry| -> Result<()> { - entry.validate()?; + entry.validate(validation_set)?; if entry.meta.target.is_some() { bail!("aws-sdk-rust changelog entry cannot have an affected target"); } @@ -246,7 +266,7 @@ impl Changelog { }; let validate_smithyrs_handauthored = |entry: &HandAuthoredEntry| -> Result<()> { - entry.validate()?; + entry.validate(validation_set)?; if entry.meta.target.is_none() { bail!("smithy-rs entry must have an affected target"); } @@ -271,7 +291,7 @@ impl Changelog { #[cfg(test)] mod tests { - use super::{Changelog, HandAuthoredEntry, SdkAffected}; + use super::{Changelog, HandAuthoredEntry, SdkAffected, ValidationSet}; use anyhow::Context; #[test] @@ -341,7 +361,7 @@ mod tests { "#; // three errors should be produced, missing authors x 2 and a SdkAffected is not set to default let changelog: Changelog = toml::from_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_err()); if let Err(e) = res { assert_eq!(e.len(), 3); @@ -371,7 +391,7 @@ mod tests { { // loading directly from toml::from_str won't set the default target field let changelog: Changelog = toml::from_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_err()); if let Err(e) = res { assert!(e.contains(&"smithy-rs entry must have an affected target".to_string())) @@ -380,7 +400,7 @@ mod tests { { // loading through Chanelog will result in no error let changelog: Changelog = Changelog::parse_str(buffer).expect("valid changelog"); - let res = changelog.validate(); + let res = changelog.validate(ValidationSet::Development); assert!(res.is_ok()); if let Err(e) = res { panic!("some error has been produced {e:?}"); diff --git a/tools/ci-build/smithy-rs-tool-common/src/package.rs b/tools/ci-build/smithy-rs-tool-common/src/package.rs index c5543bebfb1..4197099b9ba 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/package.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/package.rs @@ -35,3 +35,14 @@ impl PackageCategory { } } } + +/// Enum to denote whether a package we have control over publishing is stable or not +/// +/// If a package is a third-party one and we cannot publish it, then it is considered as `Unstable`. +/// In general, tooling cares about crates that we have control over publishing, so the third-party +/// crates being marked as `Unstable` does not affect the integrity of tooling. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum PackageStability { + Stable, + Unstable, +} diff --git a/tools/ci-build/smithy-rs-tool-common/src/release_tag.rs b/tools/ci-build/smithy-rs-tool-common/src/release_tag.rs index fe1d2be5a2f..371923d76ed 100644 --- a/tools/ci-build/smithy-rs-tool-common/src/release_tag.rs +++ b/tools/ci-build/smithy-rs-tool-common/src/release_tag.rs @@ -13,7 +13,7 @@ use std::str::FromStr; lazy_static! { static ref VERSION_TAG: Regex = Regex::new(r"^v(\d+)\.(\d+)\.(\d+)$").unwrap(); - static ref DATE_TAG: Regex = Regex::new(r"^release-(\d{4}-\d{2}-\d{2})$").unwrap(); + static ref DATE_TAG: Regex = Regex::new(r"^release-(\d{4}-\d{2}-\d{2})(.(\d+))?$").unwrap(); } #[derive(Clone, Debug, Eq, PartialEq)] @@ -25,6 +25,7 @@ pub struct VersionReleaseTag { #[derive(Clone, Debug, Eq, PartialEq)] pub struct DateReleaseTag { date: String, + suffix: Option, original: String, } @@ -66,6 +67,7 @@ impl FromStr for ReleaseTag { } else if let Some(caps) = DATE_TAG.captures(value) { Ok(ReleaseTag::Date(DateReleaseTag { date: caps.get(1).expect("validated by regex").as_str().into(), + suffix: caps.get(3).map(|s| usize::from_str(s.as_str()).unwrap()), original: value.into(), })) } else { @@ -95,7 +97,9 @@ impl PartialOrd for ReleaseTag { match (self, other) { (ReleaseTag::Date(_), ReleaseTag::Version(_)) => Some(Ordering::Greater), (ReleaseTag::Version(_), ReleaseTag::Date(_)) => Some(Ordering::Less), - (ReleaseTag::Date(lhs), ReleaseTag::Date(rhs)) => Some(lhs.date.cmp(&rhs.date)), + (ReleaseTag::Date(lhs), ReleaseTag::Date(rhs)) => { + Some(lhs.date.cmp(&rhs.date).then(lhs.suffix.cmp(&rhs.suffix))) + } (ReleaseTag::Version(lhs), ReleaseTag::Version(rhs)) => { Some(lhs.version.cmp(&rhs.version)) } @@ -125,10 +129,20 @@ mod tests { ReleaseTag::Date(DateReleaseTag { date: "2022-07-26".into(), original: "release-2022-07-26".into(), + suffix: None }), tag("release-2022-07-26") ); + assert_eq!( + ReleaseTag::Date(DateReleaseTag { + date: "2022-07-26".into(), + original: "release-2022-07-26.2".into(), + suffix: Some(2) + }), + tag("release-2022-07-26.2") + ); + assert!(ReleaseTag::from_str("foo").is_err()); } @@ -140,6 +154,10 @@ mod tests { assert!(tag("release-2022-07-20") < tag("release-2022-07-26")); assert!(tag("release-2022-06-20") < tag("release-2022-07-01")); assert!(tag("release-2021-06-20") < tag("release-2022-06-20")); + assert!(tag("release-2022-06-20") < tag("release-2022-06-20.2")); + assert!(tag("release-2022-06-20.2") < tag("release-2022-06-20.3")); + assert!(tag("release-2022-06-20.1") < tag("release-2022-06-20.10")); + assert!(tag("release-2022-06-20.10") < tag("release-2022-06-20.11")); } #[test] @@ -149,5 +167,9 @@ mod tests { "release-2022-07-26", format!("{}", tag("release-2022-07-26")) ); + assert_eq!( + "release-2022-07-26.2", + format!("{}", tag("release-2022-07-26.2")) + ); } } diff --git a/tools/ci-cdk/README.md b/tools/ci-cdk/README.md index 31c4a2fc6ef..691489eeebf 100644 --- a/tools/ci-cdk/README.md +++ b/tools/ci-cdk/README.md @@ -1,6 +1,6 @@ # CI CDK -This is the CDK infrastructure as code for awslabs/smithy-rs and awslabs/aws-sdk-rust +This is the CDK infrastructure as code for smithy-lang/smithy-rs and awslabs/aws-sdk-rust continuous integration. The `cdk.json` file tells the CDK Toolkit how to synthesize the infrastructure. diff --git a/tools/ci-cdk/bin/canary-only.ts b/tools/ci-cdk/bin/canary-only.ts index d9a8e9b82b2..d20fa053f9d 100644 --- a/tools/ci-cdk/bin/canary-only.ts +++ b/tools/ci-cdk/bin/canary-only.ts @@ -12,5 +12,6 @@ import { App } from "aws-cdk-lib"; import { CanaryStack } from "../lib/aws-sdk-rust/canary-stack"; const app = new App(); +const env = { region: "us-west-2" }; -new CanaryStack(app, "aws-sdk-rust-canary-stack", {}); +new CanaryStack(app, "aws-sdk-rust-canary-stack", { env }); diff --git a/tools/ci-cdk/bin/ci-cdk.ts b/tools/ci-cdk/bin/ci-cdk.ts index 82297be2768..3db652f100f 100644 --- a/tools/ci-cdk/bin/ci-cdk.ts +++ b/tools/ci-cdk/bin/ci-cdk.ts @@ -10,14 +10,19 @@ import { PullRequestCdnStack } from "../lib/smithy-rs/pull-request-cdn-stack"; import { CanaryStack } from "../lib/aws-sdk-rust/canary-stack"; import { OidcProviderStack } from "../lib/oidc-provider-stack"; -const app = new App(); +const app = new App({}); +const env = { region: "us-west-2" }; -const oidcProviderStack = new OidcProviderStack(app, "oidc-provider-stack", {}); +const oidcProviderStack = new OidcProviderStack(app, "oidc-provider-stack", { + env, +}); new PullRequestCdnStack(app, "smithy-rs-pull-request-cdn-stack", { githubActionsOidcProvider: oidcProviderStack.githubActionsOidcProvider, + env, }); new CanaryStack(app, "aws-sdk-rust-canary-stack", { githubActionsOidcProvider: oidcProviderStack.githubActionsOidcProvider, + env, }); diff --git a/tools/ci-cdk/canary-lambda/README.md b/tools/ci-cdk/canary-lambda/README.md index f99c2c14345..a89b6556928 100644 --- a/tools/ci-cdk/canary-lambda/README.md +++ b/tools/ci-cdk/canary-lambda/README.md @@ -34,6 +34,7 @@ invoke the canary: ```bash export CANARY_S3_BUCKET_NAME= +export CANARY_S3_MRAP_BUCKET_ARN= # run with `--all-features` so you run all canaries (including canaries that don't work against older versions) cargo run --all-features -- --local ``` diff --git a/tools/ci-cdk/canary-lambda/src/canary.rs b/tools/ci-cdk/canary-lambda/src/canary.rs index a7d497b52e3..137b8f64a91 100644 --- a/tools/ci-cdk/canary-lambda/src/canary.rs +++ b/tools/ci-cdk/canary-lambda/src/canary.rs @@ -50,6 +50,7 @@ pub fn get_canaries_to_run( pub struct CanaryEnv { pub(crate) s3_bucket_name: String, + pub(crate) s3_mrap_bucket_arn: String, pub(crate) expected_transcribe_result: String, #[allow(dead_code)] pub(crate) page_size: usize, @@ -59,6 +60,7 @@ impl fmt::Debug for CanaryEnv { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("CanaryEnv") .field("s3_bucket_name", &"*** redacted ***") + .field("s3_mrap_bucket_arn", &"*** redacted ***") .field( "expected_transcribe_result", &self.expected_transcribe_result, @@ -72,13 +74,16 @@ impl CanaryEnv { // S3 bucket name to test against let s3_bucket_name = env::var("CANARY_S3_BUCKET_NAME").expect("CANARY_S3_BUCKET_NAME must be set"); + // S3 MRAP bucket name to test against + let s3_mrap_bucket_arn = + env::var("CANARY_S3_MRAP_BUCKET_ARN").expect("CANARY_S3_MRAP_BUCKET_ARN must be set"); // Expected transcription from Amazon Transcribe from the embedded audio file. // This is an environment variable so that the code doesn't need to be changed if // Amazon Transcribe starts returning different output for the same audio. let expected_transcribe_result = env::var("CANARY_EXPECTED_TRANSCRIBE_RESULT") .unwrap_or_else(|_| { - "Good day to you transcribe. This is Polly talking to you from the Rust ST K." + "Good day to you transcribe. This is Polly talking to you from the Rust S. D. K." .to_string() }); @@ -89,6 +94,7 @@ impl CanaryEnv { Self { s3_bucket_name, + s3_mrap_bucket_arn, expected_transcribe_result, page_size, } diff --git a/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs b/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs index d50c4f2be81..744b6614654 100644 --- a/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs @@ -10,7 +10,6 @@ use aws_sdk_ec2 as ec2; use aws_sdk_ec2::types::InstanceType; use crate::CanaryEnv; -use tokio_stream::StreamExt; mk_canary!( "ec2_paginator", @@ -39,7 +38,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: } num_pages += 1; } - if dbg!(num_pages) < 2 { + if num_pages < 2 { bail!( "expected 3+ pages containing ~60 results but got {} pages", num_pages @@ -60,7 +59,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: #[cfg(test)] mod test { - use crate::latest::paginator_canary::paginator_canary; + use super::paginator_canary; #[tokio::test] async fn test_paginator() { diff --git a/tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs b/tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs index fbcba976d86..ac5d92d82d4 100644 --- a/tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs @@ -8,6 +8,7 @@ use crate::{mk_canary, CanaryEnv}; use anyhow::Context; use aws_config::SdkConfig; use aws_sdk_s3 as s3; +use s3::config::Region; use s3::presigning::PresigningConfig; use s3::primitives::ByteStream; use std::time::Duration; @@ -17,10 +18,15 @@ const METADATA_TEST_VALUE: &str = "some value"; mk_canary!("s3", |sdk_config: &SdkConfig, env: &CanaryEnv| s3_canary( s3::Client::new(sdk_config), - env.s3_bucket_name.clone() + env.s3_bucket_name.clone(), + env.s3_mrap_bucket_arn.clone() )); -pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Result<()> { +pub async fn s3_canary( + client: s3::Client, + s3_bucket_name: String, + s3_mrap_bucket_arn: String, +) -> anyhow::Result<()> { let test_key = Uuid::new_v4().as_u128().to_string(); // Look for the test object and expect that it doesn't exist @@ -82,39 +88,104 @@ pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Re return Err(CanaryError(format!("presigned URL returned bad data: {:?}", response)).into()); } - let mut result = Ok(()); - match output.metadata() { - Some(map) => { - // Option::as_deref doesn't work here since the deref of &String is String - let value = map.get("something").map(|s| s.as_str()).unwrap_or(""); - if value != METADATA_TEST_VALUE { - result = Err(CanaryError(format!( + let metadata_value = output + .metadata() + .and_then(|m| m.get("something")) + .map(String::as_str); + let result: anyhow::Result<()> = match metadata_value { + Some(value) => { + if value == METADATA_TEST_VALUE { + let payload = output + .body + .collect() + .await + .context("download s3::GetObject[2] body")? + .into_bytes(); + if std::str::from_utf8(payload.as_ref()).context("s3 payload")? == "test" { + Ok(()) + } else { + Err(CanaryError("S3 object body didn't match what was put there".into()).into()) + } + } else { + Err(CanaryError(format!( "S3 metadata was incorrect. Expected `{}` but got `{}`.", METADATA_TEST_VALUE, value )) - .into()); + .into()) } } - None => { - result = Err(CanaryError("S3 metadata was missing".into()).into()); - } - } + None => Err(CanaryError("S3 metadata was missing".into()).into()), + }; - let payload = output - .body - .collect() + // Delete the test object + client + .delete_object() + .bucket(&s3_bucket_name) + .key(&test_key) + .send() .await - .context("download s3::GetObject[2] body")? - .into_bytes(); - if std::str::from_utf8(payload.as_ref()).context("s3 payload")? != "test" { - result = Err(CanaryError("S3 object body didn't match what was put there".into()).into()); - } + .context("s3::DeleteObject")?; + + // Return early if the result is an error + result?; + + // We deliberately use a region that doesn't exist here so that we can + // ensure these requests are SigV4a requests. Because the current endpoint + // resolver always resolves the wildcard region ('*') for SigV4a requests, + // setting a fictitious region ensures that the request would fail if it was + // a SigV4 request. Therefore, because the request doesn't fail, we can be + // sure it's a successful Sigv4a request. + let config_override = s3::Config::builder().region(Region::new("parts-unknown")); + // Put the test object + client + .put_object() + .bucket(&s3_mrap_bucket_arn) + .key(&test_key) + .body(ByteStream::from_static(b"test")) + .metadata("something", METADATA_TEST_VALUE) + .customize() + .config_override(config_override.clone()) + .send() + .await + .context("s3::PutObject[MRAP]")?; + + // Get the test object and verify it looks correct + let output = client + .get_object() + .bucket(&s3_mrap_bucket_arn) + .key(&test_key) + .customize() + .config_override(config_override.clone()) + .send() + .await + .context("s3::GetObject[MRAP]")?; + + let metadata_value = output + .metadata() + .and_then(|m| m.get("something")) + .map(String::as_str); + let result = match metadata_value { + Some(value) => { + if value == METADATA_TEST_VALUE { + Ok(()) + } else { + Err(CanaryError(format!( + "S3 metadata was incorrect. Expected `{}` but got `{}`.", + METADATA_TEST_VALUE, value + )) + .into()) + } + } + None => Err(CanaryError("S3 metadata was missing".into()).into()), + }; // Delete the test object client .delete_object() - .bucket(&s3_bucket_name) + .bucket(&s3_mrap_bucket_arn) .key(&test_key) + .customize() + .config_override(config_override) .send() .await .context("s3::DeleteObject")?; @@ -123,8 +194,12 @@ pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Re } // This test runs against an actual AWS account. Comment out the `ignore` to run it. -// Be sure to set the `TEST_S3_BUCKET` environment variable to the S3 bucket to use, -// and also make sure the credential profile sets the region (or set `AWS_DEFAULT_PROFILE`). +// Be sure the following environment variables are set: +// +// - `TEST_S3_BUCKET`: The S3 bucket to use +// - `TEST_S3_MRAP_BUCKET_ARN`: The MRAP bucket ARN to use +// +// Also, make sure the correct region (likely `us-west-2`) by the credentials or explictly. #[ignore] #[cfg(test)] #[tokio::test] @@ -134,6 +209,7 @@ async fn test_s3_canary() { s3_canary( client, std::env::var("TEST_S3_BUCKET").expect("TEST_S3_BUCKET must be set"), + std::env::var("TEST_S3_MRAP_BUCKET_ARN").expect("TEST_S3_MRAP_BUCKET_ARN must be set"), ) .await .expect("success"); diff --git a/tools/ci-cdk/canary-lambda/src/main.rs b/tools/ci-cdk/canary-lambda/src/main.rs index 688462031db..df0b36c45ae 100644 --- a/tools/ci-cdk/canary-lambda/src/main.rs +++ b/tools/ci-cdk/canary-lambda/src/main.rs @@ -26,11 +26,11 @@ mod latest; #[cfg(feature = "latest")] pub(crate) use latest as current_canary; -// NOTE: This module can be deleted 3 releases after release-2023-01-26 -#[cfg(feature = "release-2023-01-26")] -mod release_2023_01_26; -#[cfg(feature = "release-2023-01-26")] -pub(crate) use release_2023_01_26 as current_canary; +// NOTE: This module can be deleted 3 releases after release-2023-10-26 +#[cfg(feature = "release-2023-10-26")] +mod release_2023_10_26; +#[cfg(feature = "release-2023-10-26")] +pub(crate) use release_2023_10_26 as current_canary; #[tokio::main] async fn main() -> Result<(), Error> { @@ -76,6 +76,7 @@ struct LambdaMain { } impl LambdaMain { + #[allow(deprecated)] async fn new() -> Self { Self { sdk_config: aws_config::load_from_env().await, diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_01_26.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26.rs similarity index 100% rename from tools/ci-cdk/canary-lambda/src/release_2023_01_26.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_10_26.rs diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/paginator_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs similarity index 90% rename from tools/ci-cdk/canary-lambda/src/release_2023_01_26/paginator_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs index 72c9b40ed01..199dfeea910 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/paginator_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs @@ -4,12 +4,10 @@ */ use crate::mk_canary; +use crate::CanaryEnv; use anyhow::bail; - use aws_sdk_ec2 as ec2; -use aws_sdk_ec2::model::InstanceType; - -use crate::CanaryEnv; +use aws_sdk_ec2::types::InstanceType; use tokio_stream::StreamExt; mk_canary!( @@ -30,7 +28,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: let mut num_pages = 0; while let Some(page) = history.try_next().await? { let items_in_page = page.spot_price_history.unwrap_or_default().len(); - if items_in_page > page_size as usize { + if items_in_page > page_size { bail!( "failed to retrieve results of correct page size (expected {}, got {})", page_size, @@ -39,7 +37,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: } num_pages += 1; } - if dbg!(num_pages) < 2 { + if num_pages < 2 { bail!( "expected 3+ pages containing ~60 results but got {} pages", num_pages @@ -60,7 +58,7 @@ pub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow:: #[cfg(test)] mod test { - use crate::paginator_canary::paginator_canary; + use super::paginator_canary; #[tokio::test] async fn test_paginator() { diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/s3_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs similarity index 90% rename from tools/ci-cdk/canary-lambda/src/release_2023_01_26/s3_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs index 70e3d18c55b..03b435086fe 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/s3_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs @@ -8,8 +8,8 @@ use crate::{mk_canary, CanaryEnv}; use anyhow::Context; use aws_config::SdkConfig; use aws_sdk_s3 as s3; -use aws_sdk_s3::presigning::config::PresigningConfig; -use s3::types::ByteStream; +use s3::presigning::PresigningConfig; +use s3::primitives::ByteStream; use std::time::Duration; use uuid::Uuid; @@ -17,10 +17,15 @@ const METADATA_TEST_VALUE: &str = "some value"; mk_canary!("s3", |sdk_config: &SdkConfig, env: &CanaryEnv| s3_canary( s3::Client::new(sdk_config), - env.s3_bucket_name.clone() + env.s3_bucket_name.clone(), + env.s3_mrap_bucket_arn.clone() )); -pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Result<()> { +pub async fn s3_canary( + client: s3::Client, + s3_bucket_name: String, + _s3_mrap_bucket_arn: String, +) -> anyhow::Result<()> { let test_key = Uuid::new_v4().as_u128().to_string(); // Look for the test object and expect that it doesn't exist @@ -110,6 +115,10 @@ pub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Re result = Err(CanaryError("S3 object body didn't match what was put there".into()).into()); } + { + println!("skipping MRAP tests because they're unsupported in this version.") + } + // Delete the test object client .delete_object() @@ -134,6 +143,7 @@ async fn test_s3_canary() { s3_canary( client, std::env::var("TEST_S3_BUCKET").expect("TEST_S3_BUCKET must be set"), + "MRAP bucket ARN is unused in this version.".to_owned(), ) .await .expect("success"); diff --git a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/transcribe_canary.rs b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/transcribe_canary.rs similarity index 97% rename from tools/ci-cdk/canary-lambda/src/release_2023_01_26/transcribe_canary.rs rename to tools/ci-cdk/canary-lambda/src/release_2023_10_26/transcribe_canary.rs index 554f4c3ddf1..8f6420fc1bd 100644 --- a/tools/ci-cdk/canary-lambda/src/release_2023_01_26/transcribe_canary.rs +++ b/tools/ci-cdk/canary-lambda/src/release_2023_10_26/transcribe_canary.rs @@ -9,10 +9,10 @@ use async_stream::stream; use aws_config::SdkConfig; use aws_sdk_transcribestreaming as transcribe; use bytes::BufMut; -use transcribe::model::{ +use transcribe::primitives::Blob; +use transcribe::types::{ AudioEvent, AudioStream, LanguageCode, MediaEncoding, TranscriptResultStream, }; -use transcribe::types::Blob; const CHUNK_SIZE: usize = 8192; use crate::canary::CanaryEnv; diff --git a/tools/ci-cdk/canary-runner/Cargo.lock b/tools/ci-cdk/canary-runner/Cargo.lock index c4a5f3fe868..4af4fa079b4 100644 --- a/tools/ci-cdk/canary-runner/Cargo.lock +++ b/tools/ci-cdk/canary-runner/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -10,13 +19,19 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -28,30 +43,30 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.70" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "async-recursion" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97ce7de6cf12de5d7226c73f5ba9811622f4db3a5b91b55c53e987e5f91cba" +checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] @@ -73,231 +88,272 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "aws-config" -version = "0.47.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a3ad9e793335d75b2d2faad583487efcc0df9154aff06f299a5c1fc8795698" +checksum = "004dc45f6b869e6a70725df448004a720b7f52f6607d55d8815cbd5448f86def" dependencies = [ + "aws-credential-types", "aws-http", + "aws-runtime", "aws-sdk-sso", + "aws-sdk-ssooidc", "aws-sdk-sts", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", + "fastrand", "hex", "http", "hyper", - "ring", + "ring 0.17.7", "time", "tokio", - "tower", "tracing", "zeroize", ] [[package]] -name = "aws-endpoint" -version = "0.47.0" +name = "aws-credential-types" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd4e9dad553017821ee529f186e033700e8d61dd5c4b60066b4d8fe805b8cfc" +checksum = "cfa51c87f10211f37cd78e6d01d6f18b3f96a086906ed361d11e04ac53e29508" dependencies = [ - "aws-smithy-http", + "aws-smithy-async", + "aws-smithy-runtime-api", + "aws-smithy-types", + "zeroize", +] + +[[package]] +name = "aws-http" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361c4310fdce94328cc2d1ca0c8a48c13f43009c61d3367585685a50ca8c66b6" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-types", "aws-types", + "bytes", "http", - "regex", + "http-body", + "pin-project-lite", "tracing", ] [[package]] -name = "aws-http" -version = "0.47.0" +name = "aws-runtime" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef5a579a51d352b628b76f4855ba716be686305e5e59970c476d1ae2214e90d" +checksum = "ce0953f7fc1c4428511345e28ea3e98c8b59c9e91eafae30bf76d71d70642693" dependencies = [ + "aws-credential-types", + "aws-http", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-eventstream", "aws-smithy-http", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", - "bytes", + "fastrand", "http", - "http-body", - "lazy_static", "percent-encoding", - "pin-project-lite", "tracing", + "uuid", ] [[package]] name = "aws-sdk-cloudwatch" -version = "0.17.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5b3d07682c55fa19d9006ef6c4739ea59d8410955b67449bf208c61ffdf834" +checksum = "b7b55285ad9dde6bcb462e444cc98bd1918a566e035c35b8269d4e6b976f9994" dependencies = [ - "aws-endpoint", + "aws-credential-types", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", + "aws-smithy-json", "aws-smithy-query", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-smithy-xml", "aws-types", - "bytes", "http", - "tokio-stream", - "tower", + "regex", + "tracing", ] [[package]] name = "aws-sdk-lambda" -version = "0.17.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f4cd6001d23ff50c00caf6079e1666060215914f8801a49f614252bc04883d" +checksum = "66f1a1b5fdd170f38b740c88e955d7e1bb18b6a2f09487da0fbae0b5918d017b" dependencies = [ - "aws-endpoint", + "aws-credential-types", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "http", - "tokio-stream", - "tower", + "regex", + "tracing", ] [[package]] name = "aws-sdk-s3" -version = "0.17.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2c19b69297f16b3f18936e363f954e7504c23a4a0dc3f2833712313c09c2aa" +checksum = "959a7325827d882819a2ac77e27e26626b9713b9cfec44686785e0db6e73388f" dependencies = [ - "aws-endpoint", + "aws-credential-types", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-sigv4", "aws-smithy-async", "aws-smithy-checksums", - "aws-smithy-client", "aws-smithy-eventstream", "aws-smithy-http", - "aws-smithy-http-tower", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-smithy-xml", "aws-types", "bytes", - "bytes-utils", "http", "http-body", - "tokio-stream", - "tower", + "once_cell", + "percent-encoding", + "regex", "tracing", + "url", ] [[package]] name = "aws-sdk-sso" -version = "0.17.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f014b8ad3178b414bf732b36741325ef659fc40752f8c292400fb7c4ecb7fdd0" +checksum = "8e0b81eaef9eb951061b5a58f660815430e3f04eacaa4b2318e7474b0b7cbf17" dependencies = [ - "aws-endpoint", + "aws-credential-types", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", "http", - "tokio-stream", - "tower", + "regex", + "tracing", ] [[package]] -name = "aws-sdk-sts" -version = "0.17.0" +name = "aws-sdk-ssooidc" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37e45fdce84327c69fb924b9188fd889056c6afafbd494e8dd0daa400f9c082" +checksum = "2e322a916694038a7972a3bb12181151c1645914443a2c3be6379b27533bbb99" dependencies = [ - "aws-endpoint", + "aws-credential-types", "aws-http", - "aws-sig-auth", + "aws-runtime", "aws-smithy-async", - "aws-smithy-client", "aws-smithy-http", - "aws-smithy-http-tower", - "aws-smithy-query", + "aws-smithy-json", + "aws-smithy-runtime", + "aws-smithy-runtime-api", "aws-smithy-types", - "aws-smithy-xml", "aws-types", "bytes", "http", - "tower", + "regex", + "tracing", ] [[package]] -name = "aws-sig-auth" -version = "0.47.0" +name = "aws-sdk-sts" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6530e72945c11439e9b3c423c95a656a233d73c3a7d4acaf9789048e1bdf7da7" +checksum = "bbee86e8d9b1be709bd0f38b9ab3f196e39b0b6f3262a0a919a9d30f25debd94" dependencies = [ - "aws-sigv4", - "aws-smithy-eventstream", + "aws-credential-types", + "aws-http", + "aws-runtime", + "aws-smithy-async", "aws-smithy-http", + "aws-smithy-json", + "aws-smithy-query", + "aws-smithy-runtime", + "aws-smithy-runtime-api", + "aws-smithy-types", + "aws-smithy-xml", "aws-types", "http", + "regex", "tracing", ] [[package]] name = "aws-sigv4" -version = "0.47.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0973cb4a7b44ca2b54b3c7c2d01217fae5dbf9ebb96c2098c5c332829e5d352c" +checksum = "b6bcbad6e0f130232b22e4b4e28834348ce5b79c23b5059b387c08fd0dc8f876" dependencies = [ + "aws-credential-types", "aws-smithy-eventstream", "aws-smithy-http", + "aws-smithy-runtime-api", + "aws-smithy-types", "bytes", + "crypto-bigint 0.5.5", "form_urlencoded", "hex", + "hmac", "http", "once_cell", + "p256", "percent-encoding", "regex", - "ring", + "ring 0.17.7", + "sha2", + "subtle", "time", "tracing", + "zeroize", ] [[package]] name = "aws-smithy-async" -version = "0.47.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fc23ad8d050c241bdbfa74ae360be94a844ace8e218f64a2b2de77bfa9a707" +checksum = "573441a5a0219e436e86a7f9a20b0f2505c5ae6fe7fe3eba6e3950991c9ad914" dependencies = [ "futures-util", "pin-project-lite", "tokio", - "tokio-stream", ] [[package]] name = "aws-smithy-checksums" -version = "0.47.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd674df030b337a84eb67539db048676c691d9c88f0c54cf7748da11836cfd8" +checksum = "c5a373ec01aede3dd066ec018c1bc4e8f5dd11b2c11c59c8eef1a5c68101f397" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -314,34 +370,11 @@ dependencies = [ "tracing", ] -[[package]] -name = "aws-smithy-client" -version = "0.47.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e147b157f49ce77f2a86ec693a14c84b2441fa28be58ffb2febb77d5726c934" -dependencies = [ - "aws-smithy-async", - "aws-smithy-http", - "aws-smithy-http-tower", - "aws-smithy-types", - "bytes", - "fastrand", - "http", - "http-body", - "hyper", - "hyper-rustls 0.22.1", - "lazy_static", - "pin-project-lite", - "tokio", - "tower", - "tracing", -] - [[package]] name = "aws-smithy-eventstream" -version = "0.47.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da29e67a0b90a2bc5f2bd0a06fd43e728de62e02048879c15f646a3edf8db012" +checksum = "1c669e1e5fc0d79561bf7a122b118bd50c898758354fe2c53eb8f2d31507cbc3" dependencies = [ "aws-smithy-types", "bytes", @@ -350,97 +383,153 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.47.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc1af50eac644ab6f58e5bae29328ba3092851fc2ce648ad139134699b2b66f" +checksum = "5b1de8aee22f67de467b2e3d0dd0fb30859dc53f579a63bd5381766b987db644" dependencies = [ "aws-smithy-eventstream", + "aws-smithy-runtime-api", "aws-smithy-types", "bytes", "bytes-utils", "futures-core", "http", "http-body", - "hyper", "once_cell", "percent-encoding", "pin-project-lite", - "tokio", - "tokio-util", + "pin-utils", "tracing", ] [[package]] -name = "aws-smithy-http-tower" -version = "0.47.0" +name = "aws-smithy-json" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1bf4c4664dff2febf91f8796505c5bc8f38a0bff0d1397d1d3fdda17bd5c5d1" +checksum = "6a46dd338dc9576d6a6a5b5a19bd678dcad018ececee11cf28ecd7588bd1a55c" dependencies = [ - "aws-smithy-http", - "bytes", - "http", - "http-body", - "pin-project-lite", - "tower", - "tracing", + "aws-smithy-types", ] [[package]] -name = "aws-smithy-json" -version = "0.47.0" +name = "aws-smithy-query" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e6ebc76c3c108dd2a96506bf47dc31f75420811a19f1a09907524d1451789d2" +checksum = "feb5b8c7a86d4b6399169670723b7e6f21a39fc833a30f5c5a2f997608178129" dependencies = [ "aws-smithy-types", + "urlencoding", ] [[package]] -name = "aws-smithy-query" -version = "0.47.0" +name = "aws-smithy-runtime" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2956f1385c4daa883907a2c81d32256af8f95834c9de1bc0613fa68db63b88c4" +checksum = "c0c628feae802ab1589936e2aaef6f8ab2b8fc1ee1f947c276dd8a7c3cda1904" dependencies = [ + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-runtime-api", "aws-smithy-types", - "urlencoding", + "bytes", + "fastrand", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "once_cell", + "pin-project-lite", + "pin-utils", + "rustls", + "tokio", + "tracing", +] + +[[package]] +name = "aws-smithy-runtime-api" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7460e5cc8e6eb0749608535854352f6e121433960ba05daf4dbde0e42c1199a5" +dependencies = [ + "aws-smithy-async", + "aws-smithy-types", + "bytes", + "http", + "pin-project-lite", + "tokio", + "tracing", + "zeroize", ] [[package]] name = "aws-smithy-types" -version = "0.47.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "352fb335ec1d57160a17a13e87aaa0a172ab780ddf58bfc85caedd3b7e47caed" +checksum = "8ba838f43d0d72d76918895a93c3ad647f75a058541a60e85beefb6bb0a9bd40" dependencies = [ + "base64-simd", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", "itoa", "num-integer", + "pin-project-lite", + "pin-utils", "ryu", + "serde", "time", + "tokio", + "tokio-util", ] [[package]] name = "aws-smithy-xml" -version = "0.47.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cf2807fa715a5a3296feffb06ce45252bd0dfd48f52838128c48fb339ddbf5c" +checksum = "0ec40d74a67fd395bc3f6b4ccbdf1543672622d905ef3f979689aea5b730cb95" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "0.47.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8140b89d76f67be2c136d7393e7e6d8edd65424eb58214839efbf4a2e4f7e8a3" +checksum = "faa59f6f26a3472ca2ce7e7802d037a0a9a7ac23de5761eadd9b68f31ac4fd21" dependencies = [ + "aws-credential-types", "aws-smithy-async", - "aws-smithy-client", - "aws-smithy-http", + "aws-smithy-runtime-api", "aws-smithy-types", "http", "rustc_version", "tracing", - "zeroize", ] +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base64" version = "0.13.1" @@ -449,9 +538,25 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref", + "vsimd", +] + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" @@ -459,6 +564,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "block-buffer" version = "0.10.4" @@ -470,27 +581,30 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.1" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +dependencies = [ + "serde", +] [[package]] name = "bytes-utils" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9" +checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" dependencies = [ "bytes", "either", @@ -526,9 +640,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -538,28 +655,28 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ + "android-tzdata", "iana-time-zone", - "num-integer", "num-traits", "serde", - "winapi", + "windows-targets 0.48.5", ] [[package]] name = "clap" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef2b3ded6a26dfaec672a742c93c8cf6b689220324da509ec5caa20de55dc83" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ "atty", - "bitflags", + "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.3", "once_cell", "strsim", "termcolor", @@ -568,9 +685,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.2.24" +version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d756c5824fc5c0c1ee8e36000f576968dbcb2081def956c83fad6f40acd46f96" +checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck", "proc-macro-error", @@ -589,20 +706,16 @@ dependencies = [ ] [[package]] -name = "codespan-reporting" -version = "0.11.1" +name = "const-oid" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -610,24 +723,24 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] [[package]] name = "crc32c" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfea2db42e9927a3845fb268a10a72faed6d416065f77873f05e411457c363e" +checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" dependencies = [ "rustc_version", ] @@ -641,96 +754,64 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ "cfg-if", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "crypto-bigint" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ "generic-array", - "typenum", -] - -[[package]] -name = "ct-logs" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" -dependencies = [ - "sct 0.6.1", + "rand_core", + "subtle", + "zeroize", ] [[package]] -name = "ctor" -version = "0.1.26" +name = "crypto-bigint" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "quote", - "syn 1.0.109", + "rand_core", + "subtle", ] [[package]] -name = "cxx" -version = "1.0.94" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", + "generic-array", + "typenum", ] [[package]] -name = "cxx-build" -version = "1.0.94" +name = "der" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 2.0.15", + "const-oid", + "zeroize", ] [[package]] -name = "cxxbridge-flags" -version = "1.0.94" +name = "deranged" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.94" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.15", + "powerfmt", ] [[package]] @@ -741,70 +822,105 @@ checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] name = "dyn-clone" -version = "1.0.11" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" + +[[package]] +name = "ecdsa" +version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der", + "elliptic-curve", + "rfc6979", + "signature", +] [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] -name = "encoding_rs" -version = "0.8.32" +name = "elliptic-curve" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" dependencies = [ - "cfg-if", + "base16ct", + "crypto-bigint 0.4.9", + "der", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", ] [[package]] -name = "errno" -version = "0.3.1" +name = "encoding_rs" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", + "cfg-if", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "instant", + "rand_core", + "subtle", ] [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -833,18 +949,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -857,9 +973,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -867,15 +983,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -884,38 +1000,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -941,20 +1057,39 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff", + "rand_core", + "subtle", ] [[package]] name = "h2" -version = "0.3.18" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -962,7 +1097,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -975,6 +1110,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "heck" version = "0.4.1" @@ -992,18 +1133,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -1011,11 +1143,20 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1041,15 +1182,15 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -1062,7 +1203,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1071,32 +1212,18 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.22.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ - "ct-logs", "futures-util", + "http", "hyper", "log", - "rustls 0.19.1", + "rustls", "rustls-native-certs", "tokio", - "tokio-rustls 0.22.0", - "webpki 0.21.4", -] - -[[package]] -name = "hyper-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" -dependencies = [ - "http", - "hyper", - "rustls 0.20.8", - "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls", ] [[package]] @@ -1114,33 +1241,32 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.56" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1153,46 +1279,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", ] [[package]] -name = "instant" -version = "0.1.12" +name = "indexmap" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ - "cfg-if", + "equivalent", + "hashbrown 0.14.3", ] [[package]] -name = "io-lifetimes" -version = "1.0.10" +name = "instant" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] name = "ipnet" -version = "2.7.2" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.61" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -1203,9 +1331,9 @@ version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "pem", - "ring", + "ring 0.16.20", "serde", "serde_json", "simple_asn1", @@ -1219,30 +1347,21 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" - -[[package]] -name = "link-cplusplus" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" -dependencies = [ - "cc", -] +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "linux-raw-sys" -version = "0.3.4" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1250,11 +1369,10 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" dependencies = [ - "cfg-if", "serde", ] @@ -1264,23 +1382,30 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "mime" @@ -1300,23 +1425,22 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", - "log", "wasi", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -1349,9 +1473,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -1370,31 +1494,41 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.3", "libc", ] +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + [[package]] name = "octorust" -version = "0.3.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fac860084f1858d4207a3242df22e2a60dbae86d3df6878ce8eac2a51eb5c9" +checksum = "35a776c05d0cdd02480c12cf1484e0f3bf610eab717ba6fb2c51449b60c7a88f" dependencies = [ - "anyhow", "async-recursion", + "async-trait", + "bytes", "chrono", "http", "jsonwebtoken", @@ -1408,28 +1542,30 @@ dependencies = [ "reqwest-middleware", "reqwest-retry", "reqwest-tracing", - "ring", + "ring 0.16.20", "schemars", "serde", "serde_json", "serde_urlencoded", + "thiserror", "tokio", "url", + "uuid", ] [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.52" +version = "0.10.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" dependencies = [ - "bitflags", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -1446,7 +1582,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] @@ -1457,9 +1593,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.87" +version = "0.9.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" dependencies = [ "cc", "libc", @@ -1468,44 +1604,44 @@ dependencies = [ ] [[package]] -name = "opentelemetry" -version = "0.17.0" +name = "os_str_bytes" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" -dependencies = [ - "async-trait", - "crossbeam-channel", - "futures-channel", - "futures-executor", - "futures-util", - "js-sys", - "lazy_static", - "percent-encoding", - "pin-project", - "rand", - "thiserror", -] +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] -name = "os_str_bytes" -version = "6.5.0" +name = "outref" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" + +[[package]] +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] -name = "output_vt100" -version = "0.1.3" +name = "p256" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" +checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ - "winapi", + "ecdsa", + "elliptic-curve", + "sha2", ] [[package]] -name = "overload" -version = "0.1.1" +name = "parking_lot" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] [[package]] name = "parking_lot" @@ -1514,20 +1650,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.9", ] [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if", + "instant", "libc", "redox_syscall 0.2.16", "smallvec", - "windows-sys 0.45.0", + "winapi", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "smallvec", + "windows-targets 0.48.5", ] [[package]] @@ -1547,40 +1697,20 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "pin-project" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "base64 0.13.1", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1588,11 +1718,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" @@ -1602,13 +1748,11 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pretty_assertions" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" +checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" dependencies = [ - "ctor", "diff", - "output_vt100", "yansi", ] @@ -1638,18 +1782,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -1690,27 +1834,28 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.1", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -1722,6 +1867,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -1730,17 +1886,17 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.16" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.0", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -1749,7 +1905,7 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-rustls 0.23.2", + "hyper-rustls", "hyper-tls", "ipnet", "js-sys", @@ -1760,14 +1916,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.20.8", + "rustls", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls 0.23.4", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", @@ -1779,9 +1936,9 @@ dependencies = [ [[package]] name = "reqwest-conditional-middleware" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bce134f515eb4c2748bbd928086e7b0aae0d1568daf6c63b51e829aa6f2cf464" +checksum = "59e50a2e70970896c99d1b8f20ddc30a70b30d3ac6e619a03a8353b64a49b277" dependencies = [ "async-trait", "reqwest", @@ -1791,13 +1948,12 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.1.6" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69539cea4148dce683bec9dc95be3f0397a9bb2c248a49c8296a9d21659a8cdd" +checksum = "88a3e86aa6053e59030e7ce2d2a3b258dd08fc2d337d52f73f6cb480f5858690" dependencies = [ "anyhow", "async-trait", - "futures", "http", "reqwest", "serde", @@ -1807,38 +1963,41 @@ dependencies = [ [[package]] name = "reqwest-retry" -version = "0.1.5" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce246a729eaa6aff5e215aee42845bf5fed9893cc6cd51aeeb712f34e04dd9f3" +checksum = "5c6a11c05102e5bec712c0619b8c7b7eda8b21a558a0bd981ceee15c38df8be4" dependencies = [ "anyhow", "async-trait", "chrono", "futures", + "getrandom", "http", "hyper", + "parking_lot 0.11.2", "reqwest", "reqwest-middleware", "retry-policies", "task-local-extensions", "tokio", "tracing", + "wasm-timer", ] [[package]] name = "reqwest-tracing" -version = "0.3.1" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64977f9a47fa7768cc88751e29026e569730ac1667c2eaeaac04b32624849fbe" +checksum = "14b1e66540e0cac90acadaf7109bf99c90d95abcc94b4c096bfa16a2d7aa7a71" dependencies = [ + "anyhow", "async-trait", - "opentelemetry", + "getrandom", + "matchit", "reqwest", "reqwest-middleware", "task-local-extensions", - "tokio", "tracing", - "tracing-opentelemetry", ] [[package]] @@ -1852,6 +2011,17 @@ dependencies = [ "rand", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "ring" version = "0.16.20" @@ -1861,12 +2031,32 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1878,84 +2068,80 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.14" +version = "0.38.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" dependencies = [ - "bitflags", + "bitflags 2.4.1", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.1", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", + "windows-sys 0.52.0", ] [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", - "ring", - "sct 0.7.0", - "webpki 0.22.0", + "ring 0.17.7", + "rustls-webpki", + "sct", ] [[package]] name = "rustls-native-certs" -version = "0.5.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls 0.19.1", + "rustls-pemfile", "schannel", "security-framework", ] [[package]] name = "rustls-pemfile" -version = "1.0.2" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "base64 0.21.0", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] name = "schemars" -version = "0.8.12" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" dependencies = [ "bytes", "chrono", @@ -1969,9 +2155,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.12" +version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" dependencies = [ "proc-macro2", "quote", @@ -1981,43 +2167,41 @@ dependencies = [ [[package]] name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scratch" -version = "1.0.5" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] -name = "sct" -version = "0.7.0" +name = "sec1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ - "ring", - "untrusted", + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", ] [[package]] name = "security-framework" -version = "2.8.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -2026,9 +2210,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -2036,28 +2220,28 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.17" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.160" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] @@ -2073,9 +2257,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", @@ -2096,9 +2280,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -2107,9 +2291,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -2118,9 +2302,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] @@ -2134,6 +2318,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "simple_asn1" version = "0.6.2" @@ -2148,18 +2342,18 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "smithy-rs-tool-common" @@ -2180,26 +2374,58 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "1.0.109" @@ -2213,15 +2439,36 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.15" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "task-local-extensions" version = "0.1.4" @@ -2233,22 +2480,22 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.5.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "rustix", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] @@ -2261,22 +2508,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] @@ -2291,11 +2538,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.20" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", "itoa", + "powerfmt", "serde", "time-core", "time-macros", @@ -2303,15 +2552,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] @@ -2333,32 +2582,32 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.27.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", "num_cpus", - "parking_lot", + "parking_lot 0.12.1", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.5", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] @@ -2373,42 +2622,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls 0.19.1", - "tokio", - "webpki 0.21.4", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.8", - "tokio", - "webpki 0.22.0", -] - -[[package]] -name = "tokio-stream" -version = "0.1.12" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "futures-core", - "pin-project-lite", + "rustls", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -2424,32 +2650,10 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "indexmap", + "indexmap 1.9.3", "serde", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - [[package]] name = "tower-service" version = "0.3.2" @@ -2458,11 +2662,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2470,20 +2673,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn 2.0.39", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -2491,34 +2694,20 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" -dependencies = [ "once_cell", - "opentelemetry", - "tracing", "tracing-core", - "tracing-log", - "tracing-subscriber", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -2540,30 +2729,30 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -2575,22 +2764,22 @@ dependencies = [ ] [[package]] -name = "unicode-width" -version = "0.1.10" +name = "untrusted" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -2600,15 +2789,19 @@ dependencies = [ [[package]] name = "urlencoding" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "uuid" -version = "1.3.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b55a3fef2a1e3b3a00ce878640918820d3c51081576ac657d23af9fc7928fdb" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +dependencies = [ + "getrandom", + "serde", +] [[package]] name = "valuable" @@ -2628,13 +2821,18 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -2646,9 +2844,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.84" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2656,24 +2854,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.84" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.34" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -2683,9 +2881,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.84" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2693,61 +2891,53 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.84" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.84" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] -name = "web-sys" -version = "0.3.61" +name = "wasm-timer" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" dependencies = [ + "futures", "js-sys", + "parking_lot 0.11.2", + "pin-utils", "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki" -version = "0.22.0" +name = "web-sys" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ - "ring", - "untrusted", + "js-sys", + "wasm-bindgen", ] [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki 0.22.0", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "winapi" @@ -2767,9 +2957,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -2781,175 +2971,161 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-sys" -version = "0.42.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.48.0", + "windows-targets 0.52.0", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] name = "xmlparser" -version = "0.13.3" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] name = "yansi" @@ -2959,15 +3135,15 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" [[package]] name = "zip" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0445d0fbc924bb93539b4316c11afb121ea39296f99a3c4c9edad09e3658cdef" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" dependencies = [ "byteorder", "crc32fast", diff --git a/tools/ci-cdk/canary-runner/Cargo.toml b/tools/ci-cdk/canary-runner/Cargo.toml index b1de3e0aff8..d0d6cef2b7e 100644 --- a/tools/ci-cdk/canary-runner/Cargo.toml +++ b/tools/ci-cdk/canary-runner/Cargo.toml @@ -12,15 +12,15 @@ publish = false [dependencies] anyhow = "1" async-trait = "0.1.56" -aws-config = "0.47.0" -aws-sdk-cloudwatch = "0.17.0" -aws-sdk-lambda = "0.17.0" -aws-sdk-s3 = "0.17.0" +aws-config = { version = "1", features = ["behavior-version-latest"] } +aws-sdk-cloudwatch = "1" +aws-sdk-lambda = "1" +aws-sdk-s3 = "1" base64 = "0.13" clap = { version = "3.2.17", features = ["derive"] } hex = "0.4.3" lazy_static = "1" -octorust = "0.3.0" +octorust = "0.7.0" regex = "1.6.0" semver = "1" serde = { version = "1", features = ["derive"] } diff --git a/tools/ci-cdk/canary-runner/src/build_bundle.rs b/tools/ci-cdk/canary-runner/src/build_bundle.rs index 464ee2e4ad5..237740991d1 100644 --- a/tools/ci-cdk/canary-runner/src/build_bundle.rs +++ b/tools/ci-cdk/canary-runner/src/build_bundle.rs @@ -63,9 +63,11 @@ const REQUIRED_SDK_CRATES: &[&str] = &[ "aws-sdk-transcribestreaming", ]; +// The elements in this `Vec` should be sorted in an ascending order by the release date. lazy_static! { static ref NOTABLE_SDK_RELEASE_TAGS: Vec = vec![ - ReleaseTag::from_str("release-2023-01-26").unwrap(), // last version before the crate reorg + // last version before addition of Sigv4a MRAP test + ReleaseTag::from_str("release-2023-10-26").unwrap(), ]; } @@ -112,38 +114,58 @@ enum CrateSource { }, } -fn enabled_features(crate_source: &CrateSource) -> Vec { - let mut enabled = Vec::new(); +fn enabled_feature(crate_source: &CrateSource) -> String { if let CrateSource::VersionsManifest { release_tag, .. } = crate_source { - // we want to select the newest module specified after this release + // we want to select the oldest module specified after this release for notable in NOTABLE_SDK_RELEASE_TAGS.iter() { tracing::debug!(release_tag = ?release_tag, notable = ?notable, "considering if release tag came before notable release"); if release_tag <= notable { tracing::debug!("selecting {} as chosen release", notable); - enabled.push(notable.as_str().into()); - break; + return notable.as_str().into(); } } } - if enabled.is_empty() { - enabled.push("latest".into()); - } - enabled + "latest".into() } fn generate_crate_manifest(crate_source: CrateSource) -> Result { let mut output = BASE_MANIFEST.to_string(); - for &sdk_crate in REQUIRED_SDK_CRATES { + write_dependencies(REQUIRED_SDK_CRATES, &mut output, &crate_source)?; + write!(output, "\n[features]\n").unwrap(); + writeln!(output, "latest = []").unwrap(); + for release_tag in NOTABLE_SDK_RELEASE_TAGS.iter() { + writeln!( + output, + "\"{release_tag}\" = []", + release_tag = release_tag.as_str() + ) + .unwrap(); + } + writeln!( + output, + "default = [\"{enabled}\"]", + enabled = enabled_feature(&crate_source) + ) + .unwrap(); + Ok(output) +} + +fn write_dependencies( + required_crates: &[&str], + output: &mut String, + crate_source: &CrateSource, +) -> Result<()> { + for &required_crate in required_crates { match &crate_source { CrateSource::Path(path) => { - let path_name = match sdk_crate.strip_prefix("aws-sdk-") { + let path_name = match required_crate.strip_prefix("aws-sdk-") { Some(path) => path, - None => sdk_crate, + None => required_crate, }; let crate_path = path.join(path_name); writeln!( output, - r#"{sdk_crate} = {{ path = "{path}" }}"#, + r#"{required_crate} = {{ path = "{path}" }}"#, path = crate_path.to_string_lossy() ) .unwrap() @@ -151,40 +173,20 @@ fn generate_crate_manifest(crate_source: CrateSource) -> Result { CrateSource::VersionsManifest { versions, release_tag, - } => match versions.crates.get(sdk_crate) { + } => match versions.crates.get(required_crate) { Some(version) => writeln!( output, - r#"{sdk_crate} = "{version}""#, + r#"{required_crate} = "{version}""#, version = version.version ) .unwrap(), None => { - bail!("Couldn't find `{sdk_crate}` in versions.toml for `{release_tag}`") + bail!("Couldn't find `{required_crate}` in versions.toml for `{release_tag}`") } }, } } - write!(output, "\n[features]\n").unwrap(); - writeln!(output, "latest = []").unwrap(); - for release_tag in NOTABLE_SDK_RELEASE_TAGS.iter() { - writeln!( - output, - "\"{release_tag}\" = []", - release_tag = release_tag.as_str() - ) - .unwrap(); - } - writeln!( - output, - "default = [{enabled}]", - enabled = enabled_features(&crate_source) - .into_iter() - .map(|f| format!("\"{f}\"")) - .collect::>() - .join(", ") - ) - .unwrap(); - Ok(output) + Ok(()) } fn sha1_file(path: &Path) -> Result { @@ -213,7 +215,7 @@ fn name_hashed_bundle( // Lambda function names can't have periods in them let rust_version = rust_version.map(|s| s.replace('.', "")); let rust_version = rust_version.as_deref().unwrap_or("unknown"); - let sdk_release_tag = sdk_release_tag.map(|s| s.to_string().replace('-', "")); + let sdk_release_tag = sdk_release_tag.map(|s| s.to_string().replace(['-', '.'], "")); let sdk_release_tag = sdk_release_tag.as_deref().unwrap_or("untagged"); Ok(format!( "canary-{sdk_release_tag}-{rust_version}-{bin_hash}.zip" @@ -441,7 +443,7 @@ aws-sdk-transcribestreaming = { path = "some/sdk/path/transcribestreaming" } [features] latest = [] -"release-2023-01-26" = [] +"release-2023-10-26" = [] default = ["latest"] "#, generate_crate_manifest(CrateSource::Path("some/sdk/path".into())).expect("success") @@ -505,7 +507,7 @@ aws-sdk-transcribestreaming = "0.16.0" [features] latest = [] -"release-2023-01-26" = [] +"release-2023-10-26" = [] default = ["latest"] "#, generate_crate_manifest(CrateSource::VersionsManifest { @@ -523,7 +525,7 @@ default = ["latest"] .collect(), release: None, }, - release_tag: ReleaseTag::from_str("release-2023-05-26").unwrap(), + release_tag: ReleaseTag::from_str("release-9999-12-31").unwrap(), }) .expect("success") ); @@ -547,6 +549,15 @@ default = ["latest"] ) .unwrap(), ); + check( + "canary-release202212162-1621-7ae6085d2105d5d1e13b10f8.zip", + &name_hashed_bundle( + "7ae6085d2105d5d1e13b10f882c6cb072ff5bbf8", + Some("1.62.1"), + Some(&ReleaseTag::from_str("release-2022-12-16.2").unwrap()), + ) + .unwrap(), + ); check( "canary-untagged-1621-7ae6085d2105d5d1e13b10f8.zip", &name_hashed_bundle( @@ -577,26 +588,25 @@ default = ["latest"] release: None, }; assert_eq!( - enabled_features(&CrateSource::VersionsManifest { + "latest".to_string(), + enabled_feature(&CrateSource::VersionsManifest { versions: versions.clone(), - release_tag: "release-2023-02-23".parse().unwrap(), + release_tag: "release-9999-12-31".parse().unwrap(), }), - vec!["latest".to_string()] ); - assert_eq!( - enabled_features(&CrateSource::VersionsManifest { + "release-2023-10-26".to_string(), + enabled_feature(&CrateSource::VersionsManifest { versions: versions.clone(), - release_tag: "release-2023-01-26".parse().unwrap(), + release_tag: "release-2023-10-26".parse().unwrap(), }), - vec!["release-2023-01-26".to_string()] ); assert_eq!( - enabled_features(&CrateSource::VersionsManifest { + "release-2023-10-26".to_string(), + enabled_feature(&CrateSource::VersionsManifest { versions, release_tag: "release-2023-01-13".parse().unwrap(), }), - vec!["release-2023-01-26".to_string()] ); } } diff --git a/tools/ci-cdk/canary-runner/src/generate_matrix.rs b/tools/ci-cdk/canary-runner/src/generate_matrix.rs index 401e18a99a2..bb2cb48da40 100644 --- a/tools/ci-cdk/canary-runner/src/generate_matrix.rs +++ b/tools/ci-cdk/canary-runner/src/generate_matrix.rs @@ -65,6 +65,7 @@ impl RetrieveReleases for GitHubRetrieveReleases { .repos() .list_tags(owner, repo, 100, page_num) .await? + .body .into_iter() .filter_map(|tag| ReleaseTag::from_str(&tag.name).ok()) .collect(); diff --git a/tools/ci-cdk/canary-runner/src/run.rs b/tools/ci-cdk/canary-runner/src/run.rs index b5e0058d74e..8fd8cb40641 100644 --- a/tools/ci-cdk/canary-runner/src/run.rs +++ b/tools/ci-cdk/canary-runner/src/run.rs @@ -5,7 +5,7 @@ // This is the code used by CI to run the canary Lambda. // -// If running this locally, you'll need to make a clone of awslabs/smithy-rs in +// If running this locally, you'll need to make a clone of smithy-lang/smithy-rs in // the aws-sdk-rust project root. // // Also consider using the `AWS_PROFILE` and `AWS_REGION` environment variables @@ -21,19 +21,20 @@ use std::{env, path::Path}; use anyhow::{bail, Context, Result}; use clap::Parser; -use cloudwatch::model::StandardUnit; -use s3::types::ByteStream; +use cloudwatch::types::StandardUnit; +use s3::primitives::ByteStream; use serde::Deserialize; use smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI}; use smithy_rs_tool_common::macros::here; use smithy_rs_tool_common::release_tag::ReleaseTag; -use tracing::info; +use tracing::{error, info}; use crate::build_bundle::BuildBundleArgs; use aws_sdk_cloudwatch as cloudwatch; use aws_sdk_lambda as lambda; use aws_sdk_s3 as s3; +use std::collections::HashMap; lazy_static::lazy_static! { // Occasionally, a breaking change introduced in smithy-rs will cause the canary to fail @@ -46,10 +47,10 @@ lazy_static::lazy_static! { static ref PINNED_SMITHY_RS_VERSIONS: Vec<(ReleaseTag, &'static str)> = { let mut pinned = vec![ // Versions <= 0.6.0 no longer compile against the canary after this commit in smithy-rs - // due to the breaking change in https://github.com/awslabs/smithy-rs/pull/1085 + // due to the breaking change in https://github.com/smithy-lang/smithy-rs/pull/1085 (ReleaseTag::from_str("v0.6.0").unwrap(), "d48c234796a16d518ca9e1dda5c7a1da4904318c"), // Versions <= release-2022-10-26 no longer compile against the canary after this commit in smithy-rs - // due to the s3 canary update in https://github.com/awslabs/smithy-rs/pull/1974 + // due to the s3 canary update in https://github.com/smithy-lang/smithy-rs/pull/1974 (ReleaseTag::from_str("release-2022-10-26").unwrap(), "3e24477ae7a0a2b3853962a064bc8333a016af54") ]; pinned.sort(); @@ -101,6 +102,10 @@ pub struct RunArgs { #[clap(long, required_unless_present = "cdk-output")] lambda_test_s3_bucket_name: Option, + /// The name of the S3 bucket for the canary Lambda to interact with + #[clap(long, required_unless_present = "cdk-output")] + lambda_test_s3_mrap_bucket_arn: Option, + /// The ARN of the role that the Lambda will execute as #[clap(long, required_unless_present = "cdk-output")] lambda_execution_role_arn: Option, @@ -115,6 +120,7 @@ struct Options { expected_speech_text_by_transcribe: Option, lambda_code_s3_bucket_name: String, lambda_test_s3_bucket_name: String, + lambda_test_s3_mrap_bucket_arn: String, lambda_execution_role_arn: String, } @@ -127,6 +133,8 @@ impl Options { lambda_code_s3_bucket_name: String, #[serde(rename = "canarytestbucketname")] lambda_test_s3_bucket_name: String, + #[serde(rename = "canarytestmrapbucketarn")] + lambda_test_s3_mrap_bucket_arn: String, #[serde(rename = "lambdaexecutionrolearn")] lambda_execution_role_arn: String, } @@ -148,6 +156,7 @@ impl Options { expected_speech_text_by_transcribe: run_opt.expected_speech_text_by_transcribe, lambda_code_s3_bucket_name: value.inner.lambda_code_s3_bucket_name, lambda_test_s3_bucket_name: value.inner.lambda_test_s3_bucket_name, + lambda_test_s3_mrap_bucket_arn: value.inner.lambda_test_s3_mrap_bucket_arn, lambda_execution_role_arn: value.inner.lambda_execution_role_arn, }) } else { @@ -159,6 +168,9 @@ impl Options { expected_speech_text_by_transcribe: run_opt.expected_speech_text_by_transcribe, lambda_code_s3_bucket_name: run_opt.lambda_code_s3_bucket_name.expect("required"), lambda_test_s3_bucket_name: run_opt.lambda_test_s3_bucket_name.expect("required"), + lambda_test_s3_mrap_bucket_arn: run_opt + .lambda_test_s3_mrap_bucket_arn + .expect("required"), lambda_execution_role_arn: run_opt.lambda_execution_role_arn.expect("required"), }) } @@ -170,6 +182,9 @@ pub async fn run(opt: RunArgs) -> Result<()> { let start_time = SystemTime::now(); let config = aws_config::load_from_env().await; let result = run_canary(&options, &config).await; + if let Err(err) = &result { + error!("Canary invocation failed: {err:?}",); + } let mut metrics = vec![ ( @@ -202,7 +217,7 @@ pub async fn run(opt: RunArgs) -> Result<()> { .namespace("aws-sdk-rust-canary"); for metric in metrics { request_builder = request_builder.metric_data( - cloudwatch::model::MetricDatum::builder() + cloudwatch::types::MetricDatum::builder() .metric_name(metric.0) .value(metric.1) .timestamp(SystemTime::now().into()) @@ -261,6 +276,7 @@ async fn run_canary(options: &Options, config: &aws_config::SdkConfig) -> Result options.expected_speech_text_by_transcribe.as_ref(), &options.lambda_code_s3_bucket_name, &options.lambda_test_s3_bucket_name, + &options.lambda_test_s3_mrap_bucket_arn, ) .await .context(here!())?; @@ -328,6 +344,7 @@ async fn upload_bundle( Ok(()) } +#[allow(clippy::too_many_arguments)] async fn create_lambda_fn( lambda_client: lambda::Client, bundle_name: &str, @@ -336,14 +353,16 @@ async fn create_lambda_fn( expected_speech_text_by_transcribe: Option<&String>, code_s3_bucket: &str, test_s3_bucket: &str, + test_s3_mrap_bucket_arn: &str, ) -> Result<()> { - use lambda::model::*; + use lambda::types::*; let env_builder = match expected_speech_text_by_transcribe { Some(expected_speech_text_by_transcribe) => Environment::builder() .variables("RUST_BACKTRACE", "1") .variables("RUST_LOG", "info") .variables("CANARY_S3_BUCKET_NAME", test_s3_bucket) + .variables("CANARY_S3_MRAP_BUCKET_ARN", test_s3_mrap_bucket_arn) .variables( "CANARY_EXPECTED_TRANSCRIBE_RESULT", expected_speech_text_by_transcribe, @@ -351,7 +370,8 @@ async fn create_lambda_fn( None => Environment::builder() .variables("RUST_BACKTRACE", "1") .variables("RUST_LOG", "info") - .variables("CANARY_S3_BUCKET_NAME", test_s3_bucket), + .variables("CANARY_S3_BUCKET_NAME", test_s3_bucket) + .variables("CANARY_S3_MRAP_BUCKET_ARN", test_s3_mrap_bucket_arn), }; lambda_client @@ -394,8 +414,8 @@ async fn create_lambda_fn( } async fn invoke_lambda(lambda_client: lambda::Client, bundle_name: &str) -> Result<()> { - use lambda::model::*; - use lambda::types::Blob; + use lambda::primitives::Blob; + use lambda::types::*; let response = lambda_client .invoke() @@ -422,6 +442,36 @@ async fn invoke_lambda(lambda_client: lambda::Client, bundle_name: &str) -> Resu .unwrap_or("") ); } + if let Some(payload) = response.payload { + // Example payload: + // { + // "failures": { + // "ec2_paginator": "service error\n\nCaused by:\n 0: unhandled error\n 1: unhandled error\n 2: Error { code: \"UnauthorizedOperation\", message: \"You are not authorized to perform this operation.\", aws_request_id: \"0adcd3f5-73f3-45a2-bd2e-09e4172b65f1\" }", + // "transcribe_canary": "Transcription from Transcribe doesn't look right:\nExpected: `Good day to you transcribe. This is Polly talking to you from the Rust ST K.`\nActual: `Good day to you transcribe. This is Polly talking to you from the Rust S. D. K.`\n" + // }, + // "result": "failure" + //} + #[derive(serde::Deserialize)] + struct Payload { + failures: Option>, + result: String, + } + let payload: Payload = serde_json::from_slice(payload.as_ref())?; + if payload.result == "failure" + || !payload + .failures + .as_ref() + .map(|m| m.is_empty()) + .unwrap_or(true) + { + if let Some(failures) = &payload.failures { + for (service, message) in failures { + error!("{service} failed:\n{message}\n"); + } + } + bail!("The canary failed."); + } + } Ok(()) } @@ -453,7 +503,8 @@ mod tests { cdk_output: Some("../cdk-outputs.json".into()), lambda_code_s3_bucket_name: None, lambda_test_s3_bucket_name: None, - lambda_execution_role_arn: None + lambda_execution_role_arn: None, + lambda_test_s3_mrap_bucket_arn: None }, RunArgs::try_parse_from([ "run", @@ -482,6 +533,8 @@ mod tests { "bucket-for-test", "--lambda-execution-role-arn", "arn:aws:lambda::role/exe-role", + "--lambda-test-s3-mrap-bucket-arn", + "arn:aws:s3::000000000000:accesspoint/example.mrap", ]) .unwrap(); assert_eq!( @@ -494,6 +547,8 @@ mod tests { lambda_code_s3_bucket_name: "bucket-for-code".to_owned(), lambda_test_s3_bucket_name: "bucket-for-test".to_owned(), lambda_execution_role_arn: "arn:aws:lambda::role/exe-role".to_owned(), + lambda_test_s3_mrap_bucket_arn: "arn:aws:s3::000000000000:accesspoint/example.mrap" + .to_owned(), }, Options::load_from(run_args).unwrap(), ); diff --git a/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts b/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts index 36887ebb873..42e7e33fdbc 100644 --- a/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts +++ b/tools/ci-cdk/lib/aws-sdk-rust/canary-stack.ts @@ -10,7 +10,12 @@ import { Role, ServicePrincipal, } from "aws-cdk-lib/aws-iam"; -import { BlockPublicAccess, Bucket, BucketEncryption } from "aws-cdk-lib/aws-s3"; +import { + BlockPublicAccess, + Bucket, + BucketEncryption, + CfnMultiRegionAccessPoint, +} from "aws-cdk-lib/aws-s3"; import { StackProps, Stack, Tags, RemovalPolicy, Duration, CfnOutput } from "aws-cdk-lib"; import { Construct } from "constructs"; import { GitHubOidcRole } from "../constructs/github-oidc-role"; @@ -24,10 +29,12 @@ export class CanaryStack extends Stack { public readonly lambdaExecutionRole: Role; public readonly canaryCodeBucket: Bucket; public readonly canaryTestBucket: Bucket; + public readonly canaryTestMrap: CfnMultiRegionAccessPoint; public readonly lambdaExecutionRoleArn: CfnOutput; public readonly canaryCodeBucketName: CfnOutput; public readonly canaryTestBucketName: CfnOutput; + public readonly canaryTestMrapBucketArn: CfnOutput; constructor(scope: Construct, id: string, props: Properties) { super(scope, id, props); @@ -118,6 +125,24 @@ export class CanaryStack extends Stack { exportName: "canaryTestBucket", }); + // Create a MultiRegionAccessPoint for the canary test bucket + this.canaryTestMrap = new CfnMultiRegionAccessPoint(this, "canary-test-mrap-bucket", { + regions: [{ bucket: this.canaryTestBucket.bucketName }], + name: "canary-test-mrap-bucket", + }); + + const accountId = this.canaryTestMrap.stack.account; + const alias = this.canaryTestMrap.attrAlias; + const canaryTestMrapBucketArn = `arn:aws:s3::${accountId}:accesspoint/${alias}`; + if (canaryTestMrapBucketArn) { + // Output the bucket name to make it easier to invoke the canary runner + this.canaryTestMrapBucketArn = new CfnOutput(this, "canary-test-mrap-bucket-arn", { + value: canaryTestMrapBucketArn, + description: "ARN of the canary test MRAP bucket", + exportName: "canaryTestMrapBucketArn", + }); + } + // Create a role for the canary Lambdas to assume this.lambdaExecutionRole = new Role(this, "lambda-execution-role", { roleName: "aws-sdk-rust-canary-lambda-exec-role", @@ -143,6 +168,12 @@ export class CanaryStack extends Stack { // Allow canaries to talk to their test bucket this.canaryTestBucket.grantReadWrite(this.lambdaExecutionRole); + this.lambdaExecutionRole.addToPolicy(new PolicyStatement({ + actions: ['s3:GetObject', 's3:PutObject', 's3:DeleteObject'], + effect: Effect.ALLOW, + resources: [`${canaryTestMrapBucketArn}`, `${canaryTestMrapBucketArn}/object/*`], + })); + // Allow canaries to call Transcribe's StartStreamTranscription this.lambdaExecutionRole.addToPolicy( new PolicyStatement({ @@ -152,6 +183,15 @@ export class CanaryStack extends Stack { }), ); + // Allow canaries to call EC2 + this.lambdaExecutionRole.addToPolicy( + new PolicyStatement({ + actions: ["ec2:DescribeSpotPriceHistory", "ec2:DescribeVpcs"], + effect: Effect.ALLOW, + resources: ["*"], + }), + ); + // Allow the OIDC role to pass the Lambda execution role to Lambda if (this.awsSdkRustOidcRole) { this.awsSdkRustOidcRole.oidcRole.addToPolicy( diff --git a/tools/ci-cdk/lib/oidc-provider-stack.ts b/tools/ci-cdk/lib/oidc-provider-stack.ts index 45a0d40cee0..8b5118ab195 100644 --- a/tools/ci-cdk/lib/oidc-provider-stack.ts +++ b/tools/ci-cdk/lib/oidc-provider-stack.ts @@ -7,24 +7,6 @@ import { OpenIdConnectProvider } from "aws-cdk-lib/aws-iam"; import { StackProps, Stack, Tags } from "aws-cdk-lib"; import { Construct } from "constructs"; -/// This thumbprint is used to validate GitHub's identity to AWS. This is -/// just a SHA-1 hash of the top intermediate certificate authority's certificate. -/// It may need to be updated when GitHub's certificate renews and this -/// thumbprint changes. -/// -/// It was obtained by following instructions at: -/// https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html -/// -/// This was done with the initial Idp URL of: -/// https://token.actions.githubusercontent.com/.well-known/openid-configuration -/// -/// Note: as of June 27, 2023, there are now two possible thumbprints from GitHub: -/// https://github.blog/changelog/2023-06-27-github-actions-update-on-oidc-integration-with-aws/ -export const GITHUB_CERTIFICATE_THUMBPRINTS = [ - "6938FD4D98BAB03FAADB97B34396831E3780AEA1", - "1C58A3A8518E8759BF075B76B750D4F2DF264FCD", -]; - // There can only be one OIDC provider for a given URL per AWS account, // so put these in their own stack to be shared with other stacks. export class OidcProviderStack extends Stack { @@ -38,7 +20,6 @@ export class OidcProviderStack extends Stack { this.githubActionsOidcProvider = new OpenIdConnectProvider(this, "oidc-provider", { url: "https://token.actions.githubusercontent.com", - thumbprints: GITHUB_CERTIFICATE_THUMBPRINTS, clientIds: ["sts.amazonaws.com"], }); } diff --git a/tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts b/tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts index 3cb6e651d26..92e9bd34450 100644 --- a/tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts +++ b/tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts @@ -25,7 +25,7 @@ export class PullRequestCdnStack extends Stack { this.smithyRsOidcRole = new GitHubOidcRole(this, "smithy-rs", { name: "smithy-rs-pull-request", - githubOrg: "awslabs", + githubOrg: "smithy-lang", githubRepo: "smithy-rs", oidcProvider: props.githubActionsOidcProvider, }); diff --git a/tools/ci-cdk/package-lock.json b/tools/ci-cdk/package-lock.json index b16f3ff4dfc..8da1026934b 100644 --- a/tools/ci-cdk/package-lock.json +++ b/tools/ci-cdk/package-lock.json @@ -1,7 +1,7 @@ { "name": "ci-cdk", "version": "0.1.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -28,6 +28,15 @@ "typescript": "~4.5.5" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -42,9 +51,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.199", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.199.tgz", - "integrity": "sha512-zNdD2OxALdsdQaRZBpTfMTuudxV+4jLMznJIvVj6O+OqCru4m5UtgVQmyApW1z2H9s4/06ovVt20aXe2G8Ta+w==", + "version": "2.2.200", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz", + "integrity": "sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg==", "dev": true }, "node_modules/@aws-cdk/asset-kubectl-v20": { @@ -53,54 +62,126 @@ "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==", "dev": true }, - "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.165", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.165.tgz", - "integrity": "sha512-bsyLQD/vqXQcc9RDmlM1XqiFNO/yewgVFXmkMcQkndJbmE/jgYkzewwYGrBlfL725hGLQipXq19+jwWwdsXQqg==", + "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.0.1.tgz", + "integrity": "sha512-DDt4SLdLOwWCjGtltH4VCST7hpOI5DzieuhGZsBpZ+AgJdSI2GCjklCXm0GCTwJG/SolkL5dtQXyUKgg9luBDg==", "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -111,21 +192,21 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -135,50 +216,47 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", + "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -209,22 +287,22 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { @@ -249,9 +327,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -270,9 +348,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -288,27 +366,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -387,9 +465,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -561,33 +639,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -605,13 +683,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -662,23 +740,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", + "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -694,9 +772,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", - "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1098,9 +1176,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1122,21 +1200,15 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1353,17 +1425,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -1387,14 +1459,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -1414,13 +1486,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1431,13 +1503,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1458,9 +1530,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1471,13 +1543,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1498,17 +1570,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -1524,12 +1596,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.1", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1547,9 +1619,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1718,9 +1790,9 @@ "dev": true }, "node_modules/aws-cdk": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.85.0.tgz", - "integrity": "sha512-duRE5rvP9Qu5iUNgA6+knHKsQ7xI6yKMUxyARTveYEzW/qDHD0RWKRu+pDbbwXLlzcr25oKGPjC3dM0ui2beKg==", + "version": "2.93.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.93.0.tgz", + "integrity": "sha512-C0o7rzlXbQ3othvQ9uZamRwr741MSX/9eZ74zNJvpkX5Eitx/XoQYwUHeD+cbb4lKHMi7m2SwJfx3yOEkpu9OQ==", "dev": true, "bin": { "cdk": "bin/cdk" @@ -1733,9 +1805,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.85.0.tgz", - "integrity": "sha512-u+ypK8XEMRH3tGRMSmcbPYxLet7xBdGIztUkMcPtlNJGhS/vxqh12yYkem3g3zzmHwdX8OPLSnlZ2sIuiIqp/g==", + "version": "2.93.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.93.0.tgz", + "integrity": "sha512-kKbcKkts272Ju5xjGKI3pXTOpiJxW4OQbDF8Vmw/NIkkuJLo8GlRCFfeOfoN/hilvlYQgENA67GCgSWccbvu7w==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -1750,9 +1822,9 @@ ], "dev": true, "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.177", - "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", + "@aws-cdk/asset-awscli-v1": "^2.2.200", + "@aws-cdk/asset-kubectl-v20": "^2.1.2", + "@aws-cdk/asset-node-proxy-agent-v6": "^2.0.1", "@balena/dockerignore": "^1.0.2", "case": "1.6.3", "fs-extra": "^11.1.1", @@ -1760,7 +1832,7 @@ "jsonschema": "^1.4.1", "minimatch": "^3.1.2", "punycode": "^2.3.0", - "semver": "^7.5.1", + "semver": "^7.5.4", "table": "^6.8.1", "yaml": "1.10.2" }, @@ -2001,7 +2073,7 @@ } }, "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.5.2", + "version": "7.5.4", "dev": true, "inBundle": true, "license": "ISC", @@ -2234,9 +2306,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -2253,9 +2325,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -2311,9 +2383,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001508", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", - "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", + "version": "1.0.30001522", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz", + "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==", "dev": true, "funding": [ { @@ -2398,9 +2470,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -2440,9 +2512,9 @@ "dev": true }, "node_modules/constructs": { - "version": "10.2.61", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.61.tgz", - "integrity": "sha512-8l099E1XPLN6VgUitXP6wPHLl25vc8RgxePhbCY/iRF9RGErSy6JHnI3AJU8XJ3KMaUZqhq+q9q3o+KoKM1eVw==", + "version": "10.2.69", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.69.tgz", + "integrity": "sha512-0AiM/uQe5Uk6JVe/62oolmSN2MjbFQkOlYrM3fFGZLKuT+g7xlAI10EebFhyCcZwI2JAcWuWCmmCAyCothxjuw==", "dev": true, "engines": { "node": ">= 16.14.0" @@ -2638,9 +2710,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.442", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.442.tgz", - "integrity": "sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q==", + "version": "1.4.500", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz", + "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==", "dev": true }, "node_modules/emittery": { @@ -2692,15 +2764,14 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -2722,79 +2793,28 @@ "node": ">=4.0" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", - "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2804,7 +2824,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -2814,9 +2833,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2830,9 +2848,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -2855,9 +2873,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2867,9 +2885,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -2892,12 +2910,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -3035,9 +3053,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3263,9 +3281,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3303,12 +3321,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -3478,9 +3490,9 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3602,26 +3614,26 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { @@ -3639,9 +3651,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -4450,29 +4462,20 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -4583,9 +4586,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -4610,9 +4613,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/once": { @@ -4640,17 +4643,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -4990,12 +4993,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5112,9 +5115,9 @@ } }, "node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5782,15 +5785,6 @@ "node": ">= 8" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -5922,4381 +5916,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@aws-cdk/asset-awscli-v1": { - "version": "2.2.199", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.199.tgz", - "integrity": "sha512-zNdD2OxALdsdQaRZBpTfMTuudxV+4jLMznJIvVj6O+OqCru4m5UtgVQmyApW1z2H9s4/06ovVt20aXe2G8Ta+w==", - "dev": true - }, - "@aws-cdk/asset-kubectl-v20": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz", - "integrity": "sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg==", - "dev": true - }, - "@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.165", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.165.tgz", - "integrity": "sha512-bsyLQD/vqXQcc9RDmlM1XqiFNO/yewgVFXmkMcQkndJbmE/jgYkzewwYGrBlfL725hGLQipXq19+jwWwdsXQqg==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.5" - } - }, - "@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", - "dev": true - }, - "@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", - "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - } - }, - "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - } - }, - "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - } - }, - "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - } - }, - "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", - "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "27.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz", - "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==", - "dev": true, - "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz", - "integrity": "sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/type-utils": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.1.tgz", - "integrity": "sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz", - "integrity": "sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz", - "integrity": "sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.60.1", - "@typescript-eslint/utils": "5.60.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.1.tgz", - "integrity": "sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz", - "integrity": "sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/visitor-keys": "5.60.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.1.tgz", - "integrity": "sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.1", - "@typescript-eslint/types": "5.60.1", - "@typescript-eslint/typescript-estree": "5.60.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.60.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz", - "integrity": "sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.60.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "aws-cdk": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.85.0.tgz", - "integrity": "sha512-duRE5rvP9Qu5iUNgA6+knHKsQ7xI6yKMUxyARTveYEzW/qDHD0RWKRu+pDbbwXLlzcr25oKGPjC3dM0ui2beKg==", - "dev": true, - "requires": { - "fsevents": "2.3.2" - } - }, - "aws-cdk-lib": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.85.0.tgz", - "integrity": "sha512-u+ypK8XEMRH3tGRMSmcbPYxLet7xBdGIztUkMcPtlNJGhS/vxqh12yYkem3g3zzmHwdX8OPLSnlZ2sIuiIqp/g==", - "dev": true, - "requires": { - "@aws-cdk/asset-awscli-v1": "^2.2.177", - "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.148", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^11.1.1", - "ignore": "^5.2.4", - "jsonschema": "^1.4.1", - "minimatch": "^3.1.2", - "punycode": "^2.3.0", - "semver": "^7.5.1", - "table": "^6.8.1", - "yaml": "1.10.2" - }, - "dependencies": { - "@balena/dockerignore": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "ajv": { - "version": "8.12.0", - "bundled": true, - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "case": { - "version": "1.6.3", - "bundled": true, - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "bundled": true, - "dev": true - }, - "fs-extra": { - "version": "11.1.1", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "bundled": true, - "dev": true - }, - "ignore": { - "version": "5.2.4", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonschema": { - "version": "1.4.1", - "bundled": true, - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "punycode": { - "version": "2.3.0", - "bundled": true, - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "7.5.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "slice-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "table": { - "version": "6.8.1", - "bundled": true, - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "universalify": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yaml": { - "version": "1.10.2", - "bundled": true, - "dev": true - } - } - }, - "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dev": true, - "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001508", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", - "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "constructs": { - "version": "10.2.61", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.61.tgz", - "integrity": "sha512-8l099E1XPLN6VgUitXP6wPHLl25vc8RgxePhbCY/iRF9RGErSy6JHnI3AJU8XJ3KMaUZqhq+q9q3o+KoKM1eVw==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "electron-to-chromium": { - "version": "1.4.442", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.442.tgz", - "integrity": "sha512-RkrZF//Ya+0aJq2NM3OdisNh5ZodZq1rdXOS96G8DdDgpDKqKE81yTbbQ3F/4CKm1JBPsGu1Lp/akkna2xO06Q==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", - "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true - }, - "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - } - }, - "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - } - }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - } - }, - "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - }, - "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - } - }, - "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dev": true, - "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true - }, - "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - } - }, - "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - } - }, - "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } - }, - "jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", - "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-jest": { - "version": "27.1.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz", - "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - } - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/tools/ci-cdk/package.json b/tools/ci-cdk/package.json index 887e593c5ca..dd991ee413d 100644 --- a/tools/ci-cdk/package.json +++ b/tools/ci-cdk/package.json @@ -6,12 +6,13 @@ "rust-sdk-ci-cdk": "bin/ci-cdk.js" }, "scripts": { + "build": "tsc && cdk --app \"node build/bin/ci-cdk.js\" synth", + "cdk": "cdk", + "deploy": "cdk --app \"node build/bin/ci-cdk.js\" deploy --outputs-file cdk-outputs.json --all", "format": "prettier --write '**/*.ts'", "lint": "eslint --ext .ts lib", - "build": "tsc", - "watch": "tsc -w", "test": "jest", - "cdk": "cdk" + "watch": "tsc -w" }, "devDependencies": { "@types/jest": "^27.0.0", diff --git a/tools/ci-cdk/test/oidc-provider-stack.test.ts b/tools/ci-cdk/test/oidc-provider-stack.test.ts index f776fd843ed..addc642696b 100644 --- a/tools/ci-cdk/test/oidc-provider-stack.test.ts +++ b/tools/ci-cdk/test/oidc-provider-stack.test.ts @@ -5,7 +5,7 @@ import { App } from "aws-cdk-lib"; import { Template } from "aws-cdk-lib/assertions"; -import { GITHUB_CERTIFICATE_THUMBPRINTS, OidcProviderStack } from "../lib/oidc-provider-stack"; +import { OidcProviderStack } from "../lib/oidc-provider-stack"; test("it should have an OIDC provider", () => { const app = new App(); @@ -15,7 +15,6 @@ test("it should have an OIDC provider", () => { // Verify the OIDC provider template.hasResourceProperties("Custom::AWSCDKOpenIdConnectProvider", { ClientIDList: ["sts.amazonaws.com"], - ThumbprintList: GITHUB_CERTIFICATE_THUMBPRINTS, Url: "https://token.actions.githubusercontent.com", }); }); diff --git a/tools/ci-resources/tls-stub/Cargo.toml b/tools/ci-resources/tls-stub/Cargo.toml new file mode 100644 index 00000000000..e0aff352ac2 --- /dev/null +++ b/tools/ci-resources/tls-stub/Cargo.toml @@ -0,0 +1,23 @@ +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +[package] +name = "stub" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] +aws-config = {path = "../../../aws/sdk/build/aws-sdk/sdk/aws-config", features = ["client-hyper"] } +aws-credential-types = { path = "../../../aws/sdk/build/aws-sdk/sdk/aws-credential-types", features = ["hardcoded-credentials"] } +aws-sdk-sts = { path = "../../../aws/sdk/build/aws-sdk/sdk/sts" } +aws-smithy-runtime = { path = "../../../aws/sdk/build/aws-sdk/sdk/aws-smithy-runtime", features = ["client", "connector-hyper-0-14-x"] } +exitcode = "1" +hyper-rustls = { version = "0.24", features = ["rustls-native-certs", "http2"] } +rustls = "0.21.8" +rustls-native-certs = "0.6" +rustls-pemfile = "1" +tokio = { version = "1", features = ["full"] } +x509-parser = "0.15" diff --git a/tools/ci-resources/tls-stub/README.md b/tools/ci-resources/tls-stub/README.md new file mode 100644 index 00000000000..7d3f291e71c --- /dev/null +++ b/tools/ci-resources/tls-stub/README.md @@ -0,0 +1,8 @@ +# TLS Stub + +This package is used to verify the client's TLS configuration. + +It is used in a CI test. See `ci-tls.yml`, "Verify client TLS configuration". + +The stub loads a root certificate authority and uses it to connect to a supplied port on localhost. +`trytls` reads the output on the console and uses the exit code of the stub to pass or fail a test case. diff --git a/tools/ci-resources/tls-stub/src/main.rs b/tools/ci-resources/tls-stub/src/main.rs new file mode 100644 index 00000000000..f674d0116b0 --- /dev/null +++ b/tools/ci-resources/tls-stub/src/main.rs @@ -0,0 +1,161 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +use std::env; +use std::fs::File; +use std::io::BufReader; +use std::time::Duration; + +use aws_config::timeout::TimeoutConfig; +use aws_credential_types::Credentials; +use aws_sdk_sts::error::SdkError; +use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder; + +#[cfg(debug_assertions)] +use x509_parser::prelude::*; + +const OPERATION_TIMEOUT: u64 = 5; + +fn unsupported() { + println!("UNSUPPORTED"); + std::process::exit(exitcode::OK); +} + +fn get_credentials() -> Credentials { + Credentials::from_keys( + "AKIAIOSFODNN7EXAMPLE", + "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + None, + ) +} + +#[cfg(debug_assertions)] +fn debug_cert(cert: &[u8]) { + let x509 = X509Certificate::from_der(cert).unwrap(); + let subject = x509.1.subject(); + let serial = x509.1.raw_serial_as_string(); + println!("Adding root CA: {subject} ({serial})"); +} + +fn add_cert_to_store(cert: &[u8], store: &mut rustls::RootCertStore) { + let cert = rustls::Certificate(cert.to_vec()); + #[cfg(debug_assertions)] + debug_cert(&cert.0); + if let Err(e) = store.add(&cert) { + println!("Error adding root certificate: {e}"); + unsupported(); + } +} + +fn load_ca_bundle(filename: &String, roots: &mut rustls::RootCertStore) { + match File::open(filename) { + Ok(f) => { + let mut f = BufReader::new(f); + match rustls_pemfile::certs(&mut f) { + Ok(certs) => { + for cert in certs { + add_cert_to_store(&cert, roots); + } + } + Err(e) => { + println!("Error reading PEM file: {e}"); + unsupported(); + } + } + } + Err(e) => { + println!("Error opening file '{filename}': {e}"); + unsupported(); + } + } +} + +fn load_native_certs(roots: &mut rustls::RootCertStore) { + let certs = rustls_native_certs::load_native_certs(); + if let Err(ref e) = certs { + println!("Error reading native certificates: {e}"); + unsupported(); + } + for cert in certs.unwrap() { + add_cert_to_store(&cert.0, roots); + } + let mut pem_ca_cert = b"\ +-----BEGIN CERTIFICATE----- +-----END CERTIFICATE-----\ +" as &[u8]; + let certs = rustls_pemfile::certs(&mut pem_ca_cert).unwrap(); + for cert in certs { + add_cert_to_store(&cert, roots); + } +} + +async fn create_client( + roots: rustls::RootCertStore, + host: &String, + port: &String, +) -> aws_sdk_sts::Client { + let credentials = get_credentials(); + let tls_config = rustls::client::ClientConfig::builder() + .with_safe_default_cipher_suites() + .with_safe_default_kx_groups() + .with_safe_default_protocol_versions() + .unwrap() + .with_root_certificates(roots) + .with_no_client_auth(); + let tls_connector = hyper_rustls::HttpsConnectorBuilder::new() + .with_tls_config(tls_config) + .https_only() + .enable_http1() + .enable_http2() + .build(); + let http_client = HyperClientBuilder::new().build(tls_connector); + let sdk_config = aws_config::from_env() + .http_client(http_client) + .credentials_provider(credentials) + .region("us-nether-1") + .endpoint_url(format!("https://{host}:{port}")) + .timeout_config( + TimeoutConfig::builder() + .operation_timeout(Duration::from_secs(OPERATION_TIMEOUT)) + .build(), + ) + .load() + .await; + aws_sdk_sts::Client::new(&sdk_config) +} + +#[tokio::main] +async fn main() -> Result<(), aws_sdk_sts::Error> { + let argv: Vec = env::args().collect(); + if argv.len() < 3 || argv.len() > 4 { + eprintln!("Syntax: {} [ca-file]", argv[0]); + std::process::exit(exitcode::USAGE); + } + let mut roots = rustls::RootCertStore::empty(); + if argv.len() == 4 { + print!( + "Connecting to https://{}:{} with root CA bundle from {}: ", + &argv[1], &argv[2], &argv[3] + ); + load_ca_bundle(&argv[3], &mut roots); + } else { + print!( + "Connecting to https://{}:{} with native roots: ", + &argv[1], &argv[2] + ); + load_native_certs(&mut roots); + } + let sts_client = create_client(roots, &argv[1], &argv[2]).await; + match sts_client.get_caller_identity().send().await { + Ok(_) => println!("\nACCEPT"), + Err(SdkError::DispatchFailure(e)) => println!("{e:?}\nREJECT"), + Err(SdkError::ServiceError(e)) => println!("{e:?}\nACCEPT"), + Err(e) => { + println!("Unexpected error: {e:#?}"); + std::process::exit(exitcode::SOFTWARE); + } + } + Ok(()) +} diff --git a/tools/ci-scripts/check-aws-config b/tools/ci-scripts/check-aws-config index 5c6d910fe2f..135ab38eb14 100755 --- a/tools/ci-scripts/check-aws-config +++ b/tools/ci-scripts/check-aws-config @@ -35,14 +35,24 @@ cargo "+${RUST_NIGHTLY_VERSION:-nightly}" check-external-types --all-features -- echo "${C_YELLOW}## Checking for duplicate dependency versions in the normal dependency graph with all features enabled${C_RESET}" cargo tree -d --edges normal --all-features -echo "${C_YELLOW}## Testing every combination of features${C_RESET}" -cargo hack test --feature-powerset --exclude-all-features --exclude-features native-tls +# the crate has `allow-compilation` which needs to be deprecated + +echo "${C_YELLOW}## Checking every combination of features${C_RESET}" +cargo hack check --feature-powerset --exclude-all-features --exclude-features allow-compilation + +echo "${C_YELLOW}## Testing each feature in isolation${C_RESET}" +# these features are missed by the following check because they are grouped +cargo hack test --each-feature --include-features rt-tokio,client-hyper,rustls --exclude-no-default-features + +# This check will check other individual features and no-default-features +# grouping these features because they don't interact +cargo hack test --feature-powerset --exclude-all-features --exclude-features allow-compilation --group-features rt-tokio,client-hyper,rustls echo "${C_YELLOW}## Checking the wasm32-unknown-unknown and wasm32-wasi targets${C_RESET}" cargo check --target wasm32-unknown-unknown --no-default-features cargo check --target wasm32-wasi --no-default-features -# TODO(https://github.com/awslabs/smithy-rs/issues/2499): Uncomment the following once aws-config tests compile for WASM +# TODO(https://github.com/smithy-lang/smithy-rs/issues/2499): Uncomment the following once aws-config tests compile for WASM # echo "${C_YELLOW}## Testing the wasm32-unknown-unknown and wasm32-wasi targets${C_RESET}" # wasm-pack test --node -- --no-default-features # cargo wasi test --no-default-features diff --git a/tools/ci-scripts/check-aws-sdk-adhoc-tests b/tools/ci-scripts/check-aws-sdk-adhoc-tests index 911d11f998d..8da33d14de7 100755 --- a/tools/ci-scripts/check-aws-sdk-adhoc-tests +++ b/tools/ci-scripts/check-aws-sdk-adhoc-tests @@ -10,11 +10,6 @@ C_RESET='\033[0m' set -eu cd smithy-rs -# TODO(enableNewSmithyRuntimeCleanup): Remove the middleware test run when cleaning up middleware -echo -e "## ${C_YELLOW}Running SDK adhoc tests against the middleware implementation...${C_RESET}" +echo -e "## ${C_YELLOW}Running SDK adhoc tests...${C_RESET}" ./gradlew aws:sdk-adhoc-test:clean -./gradlew aws:sdk-adhoc-test:check -Psmithy.runtime.mode=middleware - -echo -e "## ${C_YELLOW}Running SDK adhoc tests against the orchestrator implementation...${C_RESET}" -./gradlew aws:sdk-adhoc-test:clean -./gradlew aws:sdk-adhoc-test:check -Psmithy.runtime.mode=orchestrator +./gradlew aws:sdk-adhoc-test:check diff --git a/tools/ci-scripts/check-aws-sdk-examples b/tools/ci-scripts/check-aws-sdk-examples index db5880b499e..1bb249baea5 100755 --- a/tools/ci-scripts/check-aws-sdk-examples +++ b/tools/ci-scripts/check-aws-sdk-examples @@ -13,6 +13,7 @@ cd aws-sdk/examples for example in *; do echo -e "${C_YELLOW}Checking examples/${example}...${C_RESET}" pushd "${example}" &>/dev/null - cargo check && cargo clean + RUSTFLAGS="" cargo check + cargo clean popd &>/dev/null done diff --git a/tools/ci-scripts/check-aws-sdk-orchestrator-impl b/tools/ci-scripts/check-aws-sdk-orchestrator-impl deleted file mode 100755 index a434b07761b..00000000000 --- a/tools/ci-scripts/check-aws-sdk-orchestrator-impl +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 -# - -# This script tests the SDK smoke test services against the orchestrator implementation - -C_YELLOW='\033[1;33m' -C_RESET='\033[0m' - -set -eu -cd smithy-rs - -# TODO(enableNewSmithyRuntimeLaunch): Move these into `services_that_compile` as more progress is made -services_that_dont_compile=(\ - "timestreamquery", - "timestreamwrite", -) - -services_that_pass_tests=(\ - "aws-config"\ - "config"\ - "dynamodb"\ - "ec2"\ - "ecs"\ - "glacier"\ - "iam"\ - "kms"\ - "lambda"\ - "polly"\ - "qldbsession"\ - "route53"\ - "s3control"\ - "sso"\ - "sts"\ - "transcribestreaming"\ -) - -./gradlew aws:sdk:assemble -Psmithy.runtime.mode=orchestrator - -cd aws/sdk/build/aws-sdk/sdk -for service in "${services_that_pass_tests[@]}"; do - pushd "${service}" - echo -e "${C_YELLOW}# Running 'cargo test --all-features' on '${service}'${C_RESET}" - RUSTFLAGS="${RUSTFLAGS:-} --cfg aws_sdk_orchestrator_mode" cargo test --all-features --all-targets --no-fail-fast - echo -e "${C_YELLOW}# Running 'cargo clippy --all-features' on '${service}'${C_RESET}" - RUSTFLAGS="${RUSTFLAGS:-} --cfg aws_sdk_orchestrator_mode" cargo clippy --all-features - popd -done - -echo "SUCCESS" diff --git a/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps b/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps index 38942ef0678..b3b0ade515d 100755 --- a/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps +++ b/tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps @@ -10,7 +10,7 @@ set -eux pushd aws-sdk-smoketest &>/dev/null # Override "fail on warning" for smoke test docs since DynamoDB's modeled docs cause rustdoc warnings -RUSTDOCFLAGS="" cargo doc --no-deps --document-private-items --all-features +RUSTDOCFLAGS="--cfg docsrs" cargo +"${RUST_NIGHTLY_VERSION}" doc --no-deps --document-private-items --all-features cargo clippy --all-features cargo +"${RUST_NIGHTLY_VERSION}" udeps diff --git a/tools/ci-scripts/check-aws-sdk-smoketest-unit-tests b/tools/ci-scripts/check-aws-sdk-smoketest-unit-tests index 293af9b43f1..bbf13d54b35 100755 --- a/tools/ci-scripts/check-aws-sdk-smoketest-unit-tests +++ b/tools/ci-scripts/check-aws-sdk-smoketest-unit-tests @@ -7,3 +7,10 @@ set -eux cd aws-sdk-smoketest cargo test --all-features + +for test_dir in tests/*; do + if [ -f "${test_dir}/Cargo.toml" ]; then + echo "#### Testing ${test_dir}..." + cargo test --all-features --manifest-path "${test_dir}/Cargo.toml" + fi +done diff --git a/tools/ci-scripts/check-aws-sdk-standalone-integration-tests b/tools/ci-scripts/check-aws-sdk-standalone-integration-tests index ad626ec1fa4..c331f9997b6 100755 --- a/tools/ci-scripts/check-aws-sdk-standalone-integration-tests +++ b/tools/ci-scripts/check-aws-sdk-standalone-integration-tests @@ -38,5 +38,5 @@ cp -r aws-sdk-smoketest "${tmp_dir}/aws/sdk/build/aws-sdk" find "${tmp_dir}" pushd "${tmp_dir}/aws/sdk/integration-tests" -cargo check --tests +cargo check --tests --all-features popd diff --git a/tools/ci-scripts/check-client-codegen-integration-tests b/tools/ci-scripts/check-client-codegen-integration-tests index 86013436c51..f844b0cd0b6 100755 --- a/tools/ci-scripts/check-client-codegen-integration-tests +++ b/tools/ci-scripts/check-client-codegen-integration-tests @@ -7,6 +7,4 @@ set -eux cd smithy-rs -# TODO(enableNewSmithyRuntimeCleanup): Only run the orchestrator version of this -./gradlew codegen-client-test:test -Psmithy.runtime.mode=middleware -./gradlew codegen-client-test:test -Psmithy.runtime.mode=orchestrator +./gradlew codegen-client-test:test diff --git a/tools/ci-scripts/check-rust-runtimes b/tools/ci-scripts/check-rust-runtimes index 034fc35d8e1..78b6221b5a4 100755 --- a/tools/ci-scripts/check-rust-runtimes +++ b/tools/ci-scripts/check-rust-runtimes @@ -8,6 +8,9 @@ C_YELLOW='\033[1;33m' C_RESET='\033[0m' set -eux + +: "$RUST_NIGHTLY_VERSION" + cd smithy-rs for runtime_path in \ @@ -24,7 +27,9 @@ do cargo test --all-features echo -e "## ${C_YELLOW}Running 'cargo doc' on ${runtime_path}...${C_RESET}" - cargo doc --no-deps --document-private-items --all-features + + RUSTDOCFLAGS="--cfg docsrs -Dwarnings" cargo +"${RUST_NIGHTLY_VERSION}" doc --no-deps --document-private-items --all-features + echo -e "## ${C_YELLOW}Running 'cargo minimal-versions check' on ${runtime_path}...${C_RESET}" cargo +"${RUST_NIGHTLY_VERSION}" minimal-versions check --all-features diff --git a/tools/ci-scripts/codegen-diff/diff_lib.py b/tools/ci-scripts/codegen-diff/diff_lib.py index d39bbaba179..6d632c15a35 100644 --- a/tools/ci-scripts/codegen-diff/diff_lib.py +++ b/tools/ci-scripts/codegen-diff/diff_lib.py @@ -26,7 +26,7 @@ def running_in_docker_build(): return os.environ.get("SMITHY_RS_DOCKER_BUILD_IMAGE") == "1" -def checkout_commit_and_generate(revision_sha, branch_name, targets=None): +def checkout_commit_and_generate(revision_sha, branch_name, targets=None, preserve_aws_sdk_build=False): if running_in_docker_build(): eprint(f"Fetching base revision {revision_sha} from GitHub...") run(f"git fetch --no-tags --progress --no-recurse-submodules --depth=1 origin {revision_sha}") @@ -34,10 +34,10 @@ def checkout_commit_and_generate(revision_sha, branch_name, targets=None): # Generate code for HEAD eprint(f"Creating temporary branch {branch_name} with generated code for {revision_sha}") run(f"git checkout {revision_sha} -B {branch_name}") - generate_and_commit_generated_code(revision_sha, targets) + generate_and_commit_generated_code(revision_sha, targets, preserve_aws_sdk_build) -def generate_and_commit_generated_code(revision_sha, targets=None): +def generate_and_commit_generated_code(revision_sha, targets=None, preserve_aws_sdk_build=False): targets = targets or [ target_codegen_client, target_codegen_server, @@ -56,7 +56,11 @@ def generate_and_commit_generated_code(revision_sha, targets=None): get_cmd_output(f"rm -rf {OUTPUT_PATH}") get_cmd_output(f"mkdir {OUTPUT_PATH}") if target_aws_sdk in targets: - get_cmd_output(f"mv aws/sdk/build/aws-sdk {OUTPUT_PATH}/") + # Compiling aws-config for semver checks baseline requires build artifacts to exist under aws/sdk/build + if preserve_aws_sdk_build: + get_cmd_output(f"cp -r aws/sdk/build/aws-sdk {OUTPUT_PATH}/") + else: + get_cmd_output(f"mv aws/sdk/build/aws-sdk {OUTPUT_PATH}/") for target in [target_codegen_client, target_codegen_server]: if target in targets: get_cmd_output(f"mv {target}/build/smithyprojections/{target} {OUTPUT_PATH}/") @@ -89,6 +93,9 @@ def generate_and_commit_generated_code(revision_sha, targets=None): f"xargs rm -f", shell=True) get_cmd_output(f"git add -f {OUTPUT_PATH}") + if preserve_aws_sdk_build: + get_cmd_output(f"git add -f aws/sdk/build") + get_cmd_output(f"git -c 'user.name=GitHub Action (generated code preview)' " f"-c 'user.name={COMMIT_AUTHOR_NAME}' " f"-c 'user.email={COMMIT_AUTHOR_EMAIL}' " diff --git a/tools/ci-scripts/codegen-diff/semver-checks.py b/tools/ci-scripts/codegen-diff/semver-checks.py index 3210e564e97..1632242fc0f 100755 --- a/tools/ci-scripts/codegen-diff/semver-checks.py +++ b/tools/ci-scripts/codegen-diff/semver-checks.py @@ -28,44 +28,70 @@ def main(skip_generation=False): if not skip_generation: checkout_commit_and_generate(head_commit_sha, CURRENT_BRANCH, targets=['aws:sdk']) - checkout_commit_and_generate(base_commit_sha, BASE_BRANCH, targets=['aws:sdk']) + checkout_commit_and_generate(base_commit_sha, BASE_BRANCH, targets=['aws:sdk'], preserve_aws_sdk_build=True) get_cmd_output(f'git checkout {CURRENT_BRANCH}') sdk_directory = os.path.join(OUTPUT_PATH, 'aws-sdk', 'sdk') os.chdir(sdk_directory) - failed = False - # TODO(enableNewSmithyRuntimeLaunch): Remove the deny list below + failures = [] deny_list = [ - "aws-runtime", - "aws-runtime-api", - "aws-smithy-runtime", - "aws-smithy-runtime-api", + # add crate names here to exclude them from the semver checks ] - for path in os.listdir(): + for path in list(os.listdir())[:10]: eprint(f'checking {path}...', end='') - if path not in deny_list and get_cmd_status(f'git cat-file -e base:{sdk_directory}/{path}/Cargo.toml') == 0: + if path in deny_list: + eprint(f"skipping {path} because it is in 'deny_list'") + elif get_cmd_status(f'git cat-file -e base:{sdk_directory}/{path}/Cargo.toml') != 0: + eprint(f'skipping {path} because it does not exist in base') + else: + get_cmd_output('cargo generate-lockfile', quiet=True) + (_, out, _) = get_cmd_output('cargo pkgid', cwd=path, quiet=True) + pkgid = parse_package_id(out) (status, out, err) = get_cmd_output(f'cargo semver-checks check-release ' f'--baseline-rev {BASE_BRANCH} ' # in order to get semver-checks to work with publish-false crates, need to specify # package and manifest path explicitly f'--manifest-path {path}/Cargo.toml ' - f'-p {path} ' + '-v ' + f'-p {pkgid} ' f'--release-type minor', check=False, quiet=True) if status == 0: eprint('ok!') else: - failed = True + failures.append(f"{out}{err}") eprint('failed!') if out: eprint(out) eprint(err) - else: - eprint(f'skipping {path} because it does not exist in base') - if failed: + if failures: eprint('One or more crates failed semver checks!') + eprint("\n".join(failures)) exit(1) +def parse_package_id(id): + if '#' in id and '@' in id: + return id.split('#')[1].split('@')[0] + elif '#' in id: + return id.split('/')[-1].split('#')[0] + else: + eprint(id) + raise Exception("unknown format") + + +import unittest + + +class SelfTest(unittest.TestCase): + def test_foo(self): + self.assertEqual(parse_package_id("file:///Users/rcoh/code/smithy-rs-ci/smithy-rs/tmp-codegen-diff/aws-sdk/sdk/aws-smithy-runtime-api#0.56.1"), "aws-smithy-runtime-api") + self.assertEqual(parse_package_id("file:///Users/rcoh/code/smithy-rs-ci/smithy-rs/tmp-codegen-diff/aws-sdk/sdk/s3#aws-sdk-s3@0.0.0-local"), "aws-sdk-s3") + + if __name__ == "__main__": - skip_generation = bool(os.environ.get('SKIP_GENERATION') or False) - main(skip_generation=skip_generation) + if len(sys.argv) > 1 and sys.argv[1] == "--self-test": + sys.argv.pop() + unittest.main() + else: + skip_generation = bool(os.environ.get('SKIP_GENERATION') or False) + main(skip_generation=skip_generation) diff --git a/tools/ci-scripts/configure-tls/configure-badssl b/tools/ci-scripts/configure-tls/configure-badssl new file mode 100755 index 00000000000..f0b04951cbc --- /dev/null +++ b/tools/ci-scripts/configure-tls/configure-badssl @@ -0,0 +1,25 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -euxo pipefail + +perl -p -i -e 's/ruby2\.4/ruby2.6/' Dockerfile +grep -q 'start of badssl\.test hosts' /etc/hosts || make list-hosts | sudo tee -a /etc/hosts +# badssl fails to create dh480.pem on our Ubuntu host. +# Create it manually inside the docker container. +sed -i '/CMD /i \ +RUN echo "-----BEGIN DH PARAMETERS-----" >/var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem \ +RUN echo "MEICPQDZ/YFp3iEs3/k9iRGoC/5/To2+5pUF/C6GkO6VjXHHyRVy68I0rI0q7IAq" >>/var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem \ +RUN echo "VyyGQ7/5Q/Iu0QQnHT4X9uMCAQI=" >>/var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem \ +RUN echo "-----END DH PARAMETERS-----" >>/var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem \ +' Dockerfile +sed -i '/ 480/c \\ttrue' certs/Makefile +# badssl does not create an expired certificate; +# it creates a certificate that expires after 1 day and waits for 1 day to run the "expired certificate" test. +# This command patches this behavior to run the test immediately. +# See: https://github.com/chromium/badssl.com/blob/df8d5a9d062f4b99fc19d8aacdea5333b399d624/certs/Makefile#L177 +sed -i 's%./tool sign $@ $(D) 1 sha256 req_v3_usr $^%faketime -f "-2d" ./tool sign $@ $(D) 1 sha256 req_v3_usr $^%' certs/Makefile +screen -dmS badssl sudo make serve diff --git a/tools/ci-scripts/configure-tls/configure-badtls b/tools/ci-scripts/configure-tls/configure-badtls new file mode 100755 index 00000000000..6828fce1a3a --- /dev/null +++ b/tools/ci-scripts/configure-tls/configure-badtls @@ -0,0 +1,17 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -euxo pipefail + +python3 scripts/generate.py badtls.test +sudo mkdir /etc/nginx/tls || true +sudo mkdir /var/www || true +sudo python3 scripts/install.py /etc/nginx/conf.d /etc/nginx/tls /var/www +sudo rm /etc/nginx/sites-enabled/default +echo '#### start of badtls.test hosts ####' | sudo tee -a /etc/hosts +echo '127.0.0.1 domain-match.badtls.test wildcard-match.badtls.test san-match.badtls.test dh1024.badtls.test expired-1963.badtls.test future.badtls.test domain-mismatch.badtls.test san-mismatch.badtls.test bad-key-usage.badtls.test expired.badtls.test wildcard.mismatch.badtls.test rc4.badtls.test weak-sig.badtls.test rc4-md5.badtls.test' | sudo tee -a /etc/hosts +echo '#### end of badtls.test hosts ####' | sudo tee -a /etc/hosts +screen -dmS badtls sudo bash ./scripts/local.sh diff --git a/tools/ci-scripts/configure-tls/configure-trytls b/tools/ci-scripts/configure-tls/configure-trytls new file mode 100755 index 00000000000..0006092e0cf --- /dev/null +++ b/tools/ci-scripts/configure-tls/configure-trytls @@ -0,0 +1,14 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -euxo pipefail + +perl -p -i -e 's!\./runners!runners!' setup.py +sed -i '/import platform/a import distro' runners/trytls/utils.py +sed -i 's/platform.linux_distribution()/distro.name(), distro.version(), distro.id()/' runners/trytls/utils.py +sed -i 's/break//' runners/trytls/bundles/https.py +perl -p -i -e 's/badssl\.com/badssl.test/g; s/badtls\.io/badtls.test/g;' runners/trytls/bundles/https.py +pip3 install -e . diff --git a/tools/ci-scripts/configure-tls/update-certs b/tools/ci-scripts/configure-tls/update-certs new file mode 100755 index 00000000000..3ccab98e60c --- /dev/null +++ b/tools/ci-scripts/configure-tls/update-certs @@ -0,0 +1,10 @@ +#!/bin/bash +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 +# + +set -euxo pipefail + +sed -i -e '/BEGIN CERTIFICATE/,/CERTIFICATE/!b' -e '/END CERTIFICATE/!d;r badtls.io/certs/ca.crt' -e 'd' trytls/runners/trytls/bundles/https.py +sed -i -e '/BEGIN CERTIFICATE/,/CERTIFICATE/!b' -e '/END CERTIFICATE/!d;r badssl.com/certs/sets/test/gen/crt/ca-root.crt' -e 'd' smithy-rs/tools/ci-resources/tls-stub/src/main.rs diff --git a/tools/ci-scripts/generate-aws-sdk b/tools/ci-scripts/generate-aws-sdk index 18b29529ad9..b9766cec27a 100755 --- a/tools/ci-scripts/generate-aws-sdk +++ b/tools/ci-scripts/generate-aws-sdk @@ -23,10 +23,8 @@ fi echo -e "${C_YELLOW}Taking examples from 'awsdocs/aws-doc-sdk-examples'...${C_RESET}" examples_revision=$(cd aws-doc-sdk-examples; git rev-parse HEAD) -mv aws-doc-sdk-examples/rust_dev_preview smithy-rs/aws/sdk/examples +mv aws-doc-sdk-examples/rustv1 smithy-rs/aws/sdk/examples rm -rf smithy-rs/aws/sdk/examples/.cargo -# TODO(https://github.com/awslabs/smithy-rs/issues/2810): This Cargo.toml `rm` can be removed when the flat example structure is cleaned up -rm -f smithy-rs/aws/sdk/examples/Cargo.toml echo -e "${C_YELLOW}Creating empty model metadata file since we don't have model update information...${C_RESET}" MODEL_METADATA_PATH="$(pwd)/model-metadata.toml" diff --git a/tools/ci-scripts/upgrade-gradle-properties b/tools/ci-scripts/upgrade-gradle-properties index 174b74ac3f7..e37a46ef742 100755 --- a/tools/ci-scripts/upgrade-gradle-properties +++ b/tools/ci-scripts/upgrade-gradle-properties @@ -6,7 +6,8 @@ set -eux -SEMANTIC_VERSION="${1}" +STABLE_SEMANTIC_VERSION="${1}" +UNSTABLE_SEMANTIC_VERSION="${2}" SMITHY_RS_DIR="$(pwd)/smithy-rs" ARTIFACTS_DIR="$(pwd)/artifacts/upgrade-gradle-properties" mkdir -p "${ARTIFACTS_DIR}" @@ -14,7 +15,7 @@ mkdir -p "${ARTIFACTS_DIR}" pushd "${SMITHY_RS_DIR}" echo "gradle.properties BEFORE the upgrade" cat gradle.properties -publisher upgrade-runtime-crates-version --version "${SEMANTIC_VERSION}" +publisher upgrade-runtime-crates-version --stable-version "${STABLE_SEMANTIC_VERSION}" --version "${UNSTABLE_SEMANTIC_VERSION}" echo "gradle.properties AFTER the upgrade" cat gradle.properties git status diff --git a/tools/echo-server/Cargo.lock b/tools/echo-server/Cargo.lock index bebe33f6fd6..fd152095120 100644 --- a/tools/echo-server/Cargo.lock +++ b/tools/echo-server/Cargo.lock @@ -2,15 +2,39 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn", ] [[package]] @@ -66,6 +90,21 @@ dependencies = [ "tower-service", ] +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -78,6 +117,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + [[package]] name = "cfg-if" version = "1.0.0" @@ -104,9 +149,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" dependencies = [ "percent-encoding", ] @@ -150,11 +195,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "h2" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ "bytes", "fnv", @@ -177,12 +228,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "http" @@ -208,9 +256,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" @@ -226,9 +274,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -260,9 +308,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "lazy_static" @@ -272,15 +320,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -288,12 +336,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "matchers" @@ -301,7 +346,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -322,14 +367,22 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi", "windows-sys", ] @@ -346,19 +399,28 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "overload" @@ -378,48 +440,48 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.7" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-targets", ] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -429,38 +491,41 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.8.1" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" +checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ - "regex-syntax 0.7.1", + "aho-corasick", + "memchr", + "regex-automata 0.3.3", + "regex-syntax 0.7.4", ] [[package]] @@ -472,6 +537,17 @@ dependencies = [ "regex-syntax 0.6.29", ] +[[package]] +name = "regex-automata" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", +] + [[package]] name = "regex-syntax" version = "0.6.29" @@ -480,33 +556,39 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.1" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.160" +version = "1.0.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +checksum = "76dc28c9523c5d70816e393136b86d48909cfb27cecaa902d338c19ed47164dc" [[package]] name = "serde_json" -version = "1.0.96" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -554,9 +636,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "socket2" @@ -570,20 +652,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.109" +version = "2.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" dependencies = [ "proc-macro2", "quote", @@ -608,11 +679,12 @@ dependencies = [ [[package]] name = "tokio" -version = "1.27.0" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", "mio", @@ -627,20 +699,20 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn", ] [[package]] name = "tokio-util" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes", "futures-core", @@ -699,10 +771,11 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.38" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ + "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -711,20 +784,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.15", + "syn", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", "valuable", @@ -767,9 +840,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "unicode-ident" -version = "1.0.8" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "valuable" @@ -779,11 +852,10 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] @@ -817,18 +889,18 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -841,42 +913,42 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"